[
  {
    "path": ".clang-format",
    "content": "# Not the exact style guide but enough for basic clang-tidy fix-its\nLanguage: Cpp\nBasedOnStyle: LLVM\n\nAlignAfterOpenBracket: AlwaysBreak\nBreakConstructorInitializers: AfterColon\nConstructorInitializerAllOnOneLineOrOnePerLine: true\nPointerAlignment: Middle\nSortIncludes: false\nSpacesBeforeTrailingComments: 2\nUseTab: Always\nMaxEmptyLinesToKeep: 5\n\nTabWidth: 4\nConstructorInitializerIndentWidth: 4\nContinuationIndentWidth: 4\nIndentWidth: 4\nIndentCaseLabels: true\n\nBreakBeforeBraces: Custom\nBraceWrapping:\n  AfterClass: true\n  AfterControlStatement: true\n  AfterEnum: true\n  AfterExternBlock: true\n  AfterFunction: true\n  AfterNamespace: true\n  AfterStruct: true\n  AfterUnion: true\n  BeforeCatch: true\n  BeforeElse: true\n  IndentBraces: false\n  SplitEmptyFunction: true\n  SplitEmptyRecord: true\n\n# Always include globals first\nIncludeCategories:\n  - Regex: 'Globals.h'\n    Priority: -1\n"
  },
  {
    "path": ".clang-tidy",
    "content": "Checks: >-\n  -*,\n  readability-identifier-naming,\n  readability-redundant-string-cstr,\n  readability-redundant-string-init,\n  readability-simplify-boolean-expr,\n  performance-unnecessary-value-param,\n  performance-unnecessary-copy-initialization,\n  performance-for-range-copy,\n  performance-implicit-conversion-in-loop,\nCheckOptions:\n- key:             readability-identifier-naming.PrivateMemberPrefix\n  value:           'm_'\n- key:             readability-identifier-naming.ClassConstantCase\n  value:           aNy_CasE\n# an empty *Prefix needs a *Case to work\n- key:             readability-identifier-naming.ClassConstantPrefix\n  value:           ''\n#- key:             readability-identifier-naming.PrivateMemberCase\n#  value:           CamelCase\n#- key:             readability-identifier-naming.FunctionCase\n#  value:           CamelCase\n#- key:             readability-identifier-naming.EnumCase\n#  value:           camelBack\n\n- key: performance-unnecessary-value-param.AllowedTypes\n  value: 'cEntityEffect;cNoise'\nWarningsAsErrors: '*'\nHeaderFilterRegex: '/cuberite/src/\\.?[^\\.]'\nFormatStyle: 'file'\n"
  },
  {
    "path": ".editorconfig",
    "content": "\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = tab\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Set the *.data files to be checked out as binary files.\n# Used for the HTTP test data files, they need to have the CRLF line endings\n# even on Linux, because they're HTTP protocol dumps.\n*.data binary\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "liberapay: Cuberite\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue-template.md",
    "content": "---\nname: Issue Template\nabout: Report a bug, feature request or another sort of issue\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\nClient version: x.x.x\nServer OS: Windows/Linux/macOS/BSD/...\nCuberite Commit id: (Found at the top of the server's console output)\n\n\n### Expected behavior\n\n\n### Actual behavior\n\n\n### Steps to reproduce the behavior\n\n\n### Server log\n```\nRelevant part of server log\n```\n"
  },
  {
    "path": ".github/workflows/Build.yml",
    "content": "# This starter workflow is for a CMake project running on multiple platforms. There is a different starter workflow if you just want a single platform.\n# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-single-platform.yml\nname: Build\non:\n  push:\n    tags-ignore:\n      - release-*\n    branches:\n      - '**'\n  pull_request:\n    branches:\n      - '**'\n\njobs:\n  build:\n    timeout-minutes: 60\n    permissions: {}\n    runs-on: ${{ matrix.os }}\n\n    strategy:\n      # Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable.\n      fail-fast: false\n\n      # Set up a matrix to run the following 3 configurations:\n      # 1. <Windows, Release, latest MSVC compiler toolchain on the default runner image, default generator>\n      # 2. <Linux, Release, latest GCC compiler toolchain on the default runner image, default generator>\n      # 3. <Linux, Release, latest Clang compiler toolchain on the default runner image, default generator>\n      #\n      # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list.\n\n      # The excluded ones are needed so some configs don't run.\n      # The included ones are needed because the cpp_compiler field is not set otherwise, leading CMake to fail.\n      matrix:\n        os: [ubuntu-latest, windows-latest]\n        build_type: [Release]\n        c_compiler: [gcc, clang, cl]\n        include:\n          - os: windows-latest\n            c_compiler: cl\n            cpp_compiler: cl\n          - os: ubuntu-latest\n            c_compiler: gcc\n            cpp_compiler: g++\n          - os: ubuntu-latest\n            c_compiler: clang\n            cpp_compiler: clang++\n        exclude:\n          - os: windows-latest\n            c_compiler: gcc\n          - os: windows-latest\n            c_compiler: clang\n          - os: ubuntu-latest\n            c_compiler: cl\n\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        submodules: 'recursive'\n\n    - name: Set reusable strings\n      # Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file.\n      id: strings\n      shell: bash\n      run: |\n        echo \"build-output-dir=${{ github.workspace }}/build\" >> \"$GITHUB_OUTPUT\"\n   \n    - name: Configure CMake\n      # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.\n      # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type\n      run: >\n        cmake -B ${{ steps.strings.outputs.build-output-dir }}\n        -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}\n        -DCMAKE_C_COMPILER=${{ matrix.c_compiler }}\n        -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}\n        -DBUILD_TOOLS=Yes\n        -DSELF_TEST=Yes\n        -S ${{ github.workspace }}\n        \n    - name: Build\n      # Build your program with the given configuration. Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).\n      run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }}\n\n    - if: runner.os == 'Windows'\n      name: Create Zip Windows\n      run:  powershell Compress-Archive build/Server Cuberite-${{ matrix.os }}-${{ matrix.c_compiler }}-${{ matrix.build_type }}.zip\n      \n    - if: runner.os != 'Windows'\n      name: Create Zip Linux\n      run: zip -r Cuberite-${{ matrix.os }}-${{ matrix.c_compiler }}-${{ matrix.build_type }}.zip build/Server\n      \n    - name: Test\n      working-directory: ${{ steps.strings.outputs.build-output-dir }}\n      # Execute tests defined by the CMake configuration. Note that --build-config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).\n      # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail\n      run: ctest --build-config ${{ matrix.build_type }} --output-on-failure\n\n    - if: runner.os != 'Windows'\n      name: Docs\n      run: |\n           cd build/Server\n           touch apiCheckFailed.flag\n           ./Cuberite <<- EOF\n           load APIDump\n           api\n           apicheck\n           restart\n           stop\n           EOF\n           if [ -f ./NewlyUndocumented.lua ]; then\n                echo \"ERROR: Newly undocumented API symbols found:\"\n                cat ./NewlyUndocumented.lua\n                exit 1\n           fi\n           if [ -f ./DuplicateDocs.txt ]; then\n                echo \"ERROR: API documentation has duplicate symbol warnings:\"\n                cat ./DuplicateDocs.txt\n                exit 1\n           fi\n           if [ -f ./apiCheckFailed.flag ]; then\n                echo \"ERROR: API check has failed with an unknown error\"\n                exit 1\n           fi\n    - name: Extract branch name\n      shell: bash\n      run: echo \"branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}\" >> $GITHUB_OUTPUT\n      id: extract_branch\n\n    - if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/experimental'\n      name: Upload artifact\n      uses: actions/upload-artifact@v4\n      with:\n        if-no-files-found: 'error'\n        name: Cuberite-${{ matrix.os }}-${{ matrix.c_compiler }}-${{ matrix.build_type }}\n        path: Cuberite-${{ matrix.os }}-${{ matrix.c_compiler }}-${{ matrix.build_type }}.zip\n  upload_release:\n    # Disable the job until a proper release process is made\n    if: (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/experimental') && false\n    permissions:\n      contents: write\n    needs: build\n    timeout-minutes: 60\n    runs-on: ubuntu-latest\n    steps:\n      - name: Extract branch name\n        shell: bash\n        run: echo \"branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}\" >> $GITHUB_OUTPUT\n        id: extract_branch\n      - name: Download Artifacts\n        uses: actions/download-artifact@v4\n        with:\n          merge-multiple: true\n      - name: Create GitHub Release\n        uses: softprops/action-gh-release@v2\n        with:\n          tag_name: release-${{ steps.extract_branch.outputs.branch }}\n          name: Release ${{ steps.extract_branch.outputs.branch }}\n          body: Automatically uploaded release by GitHub actions\n          fail_on_unmatched_files: true\n          files: |\n                  ${{ github.workspace }}/Cuberite-ubuntu-latest-clang-Release.zip\n                  ${{ github.workspace }}/Cuberite-ubuntu-latest-gcc-Release.zip\n                  ${{ github.workspace }}/Cuberite-windows-latest-cl-Release.zip\n          prerelease: true\n      # Taken from here https://stackoverflow.com/questions/68895194/github-actions-create-or-update-a-git-tag\n      - if: ${{ success() }}\n        name: Fix tag\n        uses: actions/github-script@v7\n        with:\n          script: |\n            github.rest.git.createRef({\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              ref: 'refs/tags/release-${{ steps.extract_branch.outputs.branch }}',\n              sha: context.sha\n            }).catch(err => {\n              if (err.status !== 422) throw err;\n              github.rest.git.updateRef({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                ref: 'tags/release-${{ steps.extract_branch.outputs.branch }}',\n                sha: context.sha\n              });\n            })\n\n"
  },
  {
    "path": ".github/workflows/StyleCheck.yml",
    "content": "name: Style Check\npermissions: {}\non:\n  push:\n    tags-ignore:\n      - release-*\n    branches:\n      - '**'\n  pull_request:\n    branches:\n      - '**'\n\njobs:\n  build:\n    timeout-minutes: 60\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v4\n    - uses: leafo/gh-actions-lua@v11\n\n    - name: Find Files\n      run: cd src && find . -name \"*.cpp\" -or -name \"*.h\" > AllFiles.lst\n\n    - name: Check Basic Style\n      run: cd src && lua CheckBasicStyle.lua\n\n    - name: Check Bindings and Deps\n      run: cd src/Bindings && lua CheckBindingsDependencies.lua\n"
  },
  {
    "path": ".gitignore",
    "content": "build/\nbuild*/\nnbproject/\nipch/\nWin32/\nMCServer\nServer/Cuberite\nServer/buildinfo\nServer/CONTRIBUTORS\nServer/LICENSE\nServer/Licenses\nServer/itemblacklist\nTools/MCADefrag/MCADefrag\nTools/ProtoProxy/ProtoProxy\nTesting/\nChunkWorxSave.ini\ndoxy/\n.vscode/\nProfiling\nSymbols\ncloc-ignored.txt\ncloc.xml\ncloc.xsl\n*.ncb\n*.user\n*.suo\n*.sqlite\n/EveryNight.cmd\n/UploadLuaAPI.cmd\nGPUCache\nAllFiles.lst\nGPUCache\n\n# IDE Stuff\n## Sublime Text\n*.sublime-*\n## emacs\n*.*~\n*~\n*.orig\n## CLion\n.idea\n## Eclipse\n.cproject\n.project\n*.cbp\n## KDevelop\n*.kdev*\n## Vim\n.cache/\n\n# world inside source\nChunkWorx.ini\ngroups.ini\nitems.ini\nmonsters.ini\nsettings.ini\nterrain.ini\nusers.ini\nwebadmin.ini\nworld.ini\ncrafting.txt\nmotd.txt\nlogs\nplayers\nworld\nworld_nether\n\n# cmake stuff\nCMakeFiles/\ncmake_install.cmake\nCMakeCache.txt\nCTestTestfile.cmake\nMakefile\n\n*.a\n*.d\n*.so\ntests/*/*-exe\nCMakeCache.txt\nCMakeFiles\nMakefile\ncmake_install.cmake\ninstall_mainfest.txt\nsrc/Cuberite\nlib/tolua++/tolua\nsrc/Bindings/Bindings.*\nsrc/Bindings/BindingDependencies.txt\nCuberite.dir/\nsrc/AllFiles.lst\n\n# win32 cmake stuff\n*.vcxproj\n*.vcproj\n*.vcxproj.filters\n*.opensdf\n*.sdf\n*.sln\n*.VC.opendb\n*.VC.db\n*.idb\n.vs/\n\n# cmake output folders and files\nZERO_CHECK.dir/\nDebug/\nDebugProfile/\nRelease/\nReleaseProfile/\n*.dir/\nCPackConfig.cmake\nCPackSourceConfig.cmake\ncmake-build-*\n\n# APIDump-generated status files:\nServer/cuberite_api.lua\nServer/official_undocumented.lua\nServer/NewlyUndocumented.lua\nServer/.luacheckrc\ncompile_commands.json\n\n# compile.sh folder\nbuild-cuberite\n\n# clang-tidy\ntidy-build\nrun-clang-tidy.py\n\n# ctags output\ntags\n\n# mac things\n.DS_Store\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"Server/Plugins/Core\"]\n\tpath = Server/Plugins/Core\n\turl = https://github.com/cuberite/Core.git\n[submodule \"Server/Plugins/ProtectionAreas\"]\n\tpath = Server/Plugins/ProtectionAreas\n\turl = https://github.com/cuberite/ProtectionAreas.git\n[submodule \"Server/Plugins/ChatLog\"]\n\tpath = Server/Plugins/ChatLog\n\turl = https://github.com/cuberite/ChatLog.git\n[submodule \"lib/mbedtls\"]\n\tpath = lib/mbedtls\n\turl = https://github.com/cuberite/polarssl.git\n\tignore = dirty\n[submodule \"lib/SQLiteCpp\"]\n\tpath = lib/SQLiteCpp\n\turl = https://github.com/cuberite/SQLiteCpp.git\n\tignore = dirty\n[submodule \"lib/libevent\"]\n\tpath = lib/libevent\n\turl = https://github.com/cuberite/libevent.git\n\tignore = dirty\n[submodule \"lib/jsoncpp\"]\n\tpath = lib/jsoncpp\n\turl = https://github.com/open-source-parsers/jsoncpp.git\n\tignore = dirty\n[submodule \"lib/TCLAP\"]\n\tpath = lib/TCLAP\n\turl = https://github.com/cuberite/TCLAP.git\n\tignore = dirty\n[submodule \"lib/cmake-coverage\"]\n\tpath = lib/cmake-coverage\n\turl = https://github.com/cuberite/cmake-coverage.git\n\tignore = dirty\n[submodule \"lib/expat\"]\n\tpath = lib/expat\n\turl = https://github.com/cuberite/expat.git\n\tignore = dirty\n[submodule \"lib/lua\"]\n\tpath = lib/lua\n\turl = https://github.com/cuberite/lua.git\n\tignore = dirty\n[submodule \"lib/luaexpat\"]\n\tpath = lib/luaexpat\n\turl = https://github.com/cuberite/luaexpat.git\n\tignore = dirty\n[submodule \"lib/luaproxy\"]\n\tpath = lib/luaproxy\n\turl = https://github.com/cuberite/luaproxy.git\n\tignore = dirty\n[submodule \"lib/sqlite\"]\n\tpath = lib/sqlite\n\turl = https://github.com/cuberite/sqlite.git\n\tignore = dirty\n[submodule \"lib/tolua++\"]\n\tpath = lib/tolua++\n\turl = https://github.com/cuberite/toluapp.git\n\tignore = dirty\n[submodule \"lib/fmt\"]\n\tpath = lib/fmt\n\turl = https://github.com/fmtlib/fmt.git\n\tignore = dirty\n[submodule \"Tools/BlockTypePaletteGenerator/lib/lunajson\"]\n\tpath = Tools/BlockTypePaletteGenerator/lib/lunajson\n\turl = https://github.com/grafi-tt/lunajson.git\n[submodule \"lib/libdeflate\"]\n\tpath = lib/libdeflate\n\turl = https://github.com/cuberite/libdeflate\n"
  },
  {
    "path": "BACKERS",
    "content": "Thanks to the following people for supporting the Cuberite project with a donation:\n\n - Alvin\n - Anonymous\n - chrobione\n - DrMasik\n - Fllamber\n - JimSVMI83\n - Lordake\n - ltdTM\n - Phillip Inman\n - PureTryOut\n - Robert Cringely\n - spekdrum\n - SphinxC0re\n - TooAngel\n - Utking\n - VaiN474\n\nIf you enjoy Cuberite, feel free to donate to the project on Liberapay:\nhttps://liberapay.com/Cuberite\n"
  },
  {
    "path": "CMake/AddDependencies.cmake",
    "content": "function(build_dependencies)\n\t# Set options for SQLiteCpp, disable all their lints and other features we don't need:\n\tset(SQLITE_ENABLE_COLUMN_METADATA  OFF CACHE BOOL \"Enable Column::getColumnOriginName(). Require support from sqlite3 library.\")\n\tset(SQLITE_ENABLE_JSON1            OFF CACHE BOOL \"Enable JSON1 extension when building internal sqlite3 library.\")\n\tset(SQLITECPP_INCLUDE_SCRIPT       OFF CACHE BOOL \"Include config & script files.\")\n\tset(SQLITECPP_RUN_CPPCHECK         OFF CACHE BOOL \"Run cppcheck C++ static analysis tool.\")\n\tset(SQLITECPP_RUN_CPPLINT          OFF CACHE BOOL \"Run cpplint.py tool for Google C++ StyleGuide.\")\n\tset(SQLITECPP_USE_STACK_PROTECTION OFF CACHE BOOL \"USE Stack Protection hardening.\")\n\tset(SQLITECPP_USE_STATIC_RUNTIME   OFF CACHE BOOL \"Use MSVC static runtime (default for internal googletest).\")\n\n\t# Set options for LibEvent, disable all their tests and benchmarks:\n\tset(EVENT__DISABLE_OPENSSL   YES CACHE BOOL   \"Disable OpenSSL in LibEvent\")\n\tset(EVENT__DISABLE_BENCHMARK YES CACHE BOOL   \"Disable LibEvent benchmarks\")\n\tset(EVENT__DISABLE_TESTS     YES CACHE BOOL   \"Disable LibEvent tests\")\n\tset(EVENT__DISABLE_REGRESS   YES CACHE BOOL   \"Disable LibEvent regression tests\")\n\tset(EVENT__DISABLE_SAMPLES   YES CACHE BOOL   \"Disable LibEvent samples\")\n\tset(EVENT__LIBRARY_TYPE \"STATIC\" CACHE STRING \"Use static LibEvent libraries\")\n\n\t# Set options for JsonCPP, disabling all of their tests:\n\tset(JSONCPP_WITH_TESTS OFF CACHE BOOL \"Compile and (for jsoncpp_check) run JsonCpp test executables\")\n\tset(JSONCPP_WITH_POST_BUILD_UNITTEST OFF CACHE BOOL \"Automatically run unit-tests as a post build step\")\n\tset(JSONCPP_WITH_PKGCONFIG_SUPPORT OFF CACHE BOOL \"Generate and install .pc files\")\n\tset(JSONCPP_WITH_CMAKE_PACKAGE OFF CACHE BOOL \"Generate and install cmake package files\")\n\tset(BUILD_SHARED_LIBS OFF CACHE BOOL \"Build jsoncpp_lib as a shared library.\")\n\tset(BUILD_OBJECT_LIBS OFF CACHE BOOL \"Build jsoncpp_lib as a object library.\")\n\n\t# Set options for mbedtls:\n\tset(ENABLE_PROGRAMS OFF CACHE BOOL \"Build mbed TLS programs.\")\n\tset(ENABLE_TESTING OFF CACHE BOOL \"Build mbed TLS tests.\")\n\n\t# Enumerate all submodule libraries\n\t# SQLiteCpp needs to be included before sqlite so the lsqlite target is available:\n\tset(DEPENDENCIES expat fmt jsoncpp libdeflate libevent lua luaexpat mbedtls SQLiteCpp sqlite tolua++)\n\tforeach(DEPENDENCY ${DEPENDENCIES})\n\t\t# Check that the libraries are present:\n\t\tif (NOT EXISTS \"${PROJECT_SOURCE_DIR}/lib/${DEPENDENCY}/CMakeLists.txt\")\n\t\t\tmessage(FATAL_ERROR \"${DEPENDENCY} is missing in folder lib/${DEPENDENCY}. Have you initialized and updated the submodules / downloaded the extra libraries?\")\n\t\tendif()\n\n\t\t# Include all the libraries\n\t\t# We use EXCLUDE_FROM_ALL so that only the explicit dependencies are compiled\n\t\t# (mbedTLS also has test and example programs in their CMakeLists.txt, we don't want those):\n\t\tadd_subdirectory(\"lib/${DEPENDENCY}\" EXCLUDE_FROM_ALL)\n\tendforeach()\n\n\tif (WIN32)\n\t\tadd_subdirectory(lib/luaproxy)\n\tendif()\nendfunction()\n\nfunction(link_dependencies TARGET)\n\t# Add required includes:\n\ttarget_include_directories(\n\t\t${TARGET} SYSTEM PRIVATE\n\t\tlib/mbedtls/include\n\t\tlib/TCLAP/include\n\t\tlib # TODO fix files including zlib/x instead of x\n\t)\n\n\t# Link dependencies as private:\n\ttarget_link_libraries(\n\t\t${TARGET} PRIVATE\n\t\tevent_core\n\t\tevent_extra\n\t\tfmt::fmt\n\t\tjsoncpp_static\n\t\tlibdeflate\n\t\tlsqlite\n\t\tlualib\n\t\tluaexpat\n\t\tmbedtls\n\t\tSQLiteCpp\n\t\ttolualib\n\t)\n\n\t# Link process information, multimedia (for sleep resolution) libraries:\n\tif (WIN32)\n\t\ttarget_link_libraries(${TARGET} PRIVATE Psapi.lib Winmm.lib)\n\tendif()\n\n\t# Special case handling for libevent pthreads:\n\tif(NOT WIN32)\n\t\ttarget_link_libraries(${TARGET} PRIVATE event_pthreads)\n\tendif()\n\n\t# Prettify jsoncpp_static name in VS solution explorer:\n\tset_property(TARGET jsoncpp_static PROPERTY PROJECT_LABEL \"jsoncpp\")\n\tif(${CMAKE_SYSTEM_NAME} MATCHES FreeBSD)\n\t\ttarget_link_libraries(${TARGET} PRIVATE kvm)\n\tendif()\nendfunction()\n"
  },
  {
    "path": "CMake/Fixups.cmake",
    "content": "function(emit_fixups)\n\tif(NOT MSVC AND \"${CMAKE_SYSTEM_PROCESSOR}\" MATCHES \"arm\")\n\t\t# mbed TLS uses the frame pointer's register in inline assembly for its bignum implementation:\n\t\t# https://tls.mbed.org/kb/development/arm-thumb-error-r7-cannot-be-used-in-asm-here\n\t\ttarget_compile_options(mbedcrypto PRIVATE -fomit-frame-pointer)\n\tendif()\n\n\tif(UNIX)\n\t\texecute_process(COMMAND ldd OUTPUT_VARIABLE LDD_OUTPUT ERROR_VARIABLE LDD_OUTPUT)\n\t\tif (LDD_OUTPUT MATCHES musl)\n\t\t\t# Bring musl stack size in line with other platforms:\n\t\t\ttarget_link_options(${CMAKE_PROJECT_NAME} PRIVATE \"-Wl,-z,stack-size=1048576\")\n\t\tendif()\n\tendif()\nendfunction()\n"
  },
  {
    "path": "CMake/GenerateBindings.cmake",
    "content": "function(enable_bindings_generation)\n\t# Enumerate every Lua-exported class.\n\t# Changes to these files will cause binding regen:\n\tset(BINDING_DEPENDENCIES\n\t\tBindings/AllToLua.pkg\n\t\tBindings/BindingsProcessor.lua\n\t\tBindings/LuaFunctions.h\n\t\tBindings/LuaWindow.h\n\t\tBindings/Plugin.h\n\t\tBindings/PluginLua.h\n\t\tBindings/PluginManager.h\n\t\tBiomeDef.h\n\t\tBlockArea.h\n\t\tBlockEntities/BeaconEntity.h\n\t\tBlockEntities/BedEntity.h\n\t\tBlockEntities/BlockEntity.h\n\t\tBlockEntities/BlockEntityWithItems.h\n\t\tBlockEntities/BrewingstandEntity.h\n\t\tBlockEntities/ChestEntity.h\n\t\tBlockEntities/CommandBlockEntity.h\n\t\tBlockEntities/DispenserEntity.h\n\t\tBlockEntities/DropSpenserEntity.h\n\t\tBlockEntities/DropperEntity.h\n\t\tBlockEntities/FurnaceEntity.h\n\t\tBlockEntities/HopperEntity.h\n\t\tBlockEntities/JukeboxEntity.h\n\t\tBlockEntities/MobSpawnerEntity.h\n\t\tBlockEntities/NoteEntity.h\n\t\tBlockEntities/SignEntity.h\n\t\tBlockEntities/MobHeadEntity.h\n\t\tBlockEntities/FlowerPotEntity.h\n\t\tBlockType.h\n\t\tBlockInfo.h\n\t\tBoundingBox.h\n\t\tChatColor.h\n\t\tChunkDef.h\n\t\tClientHandle.h\n\t\tColor.h\n\t\tCompositeChat.h\n\t\tCraftingRecipes.h\n\t\tCuboid.h\n\t\tDefines.h\n\t\tEffectID.h\n\t\tEnchantments.h\n\t\tEntities/Boat.h\n\t\tEntities/ArrowEntity.h\n\t\tEntities/Entity.h\n\t\tEntities/ExpOrb.h\n\t\tEntities/EnderCrystal.h\n\t\tEntities/EntityEffect.h\n\t\tEntities/ExpBottleEntity.h\n\t\tEntities/FallingBlock.h\n\t\tEntities/FireChargeEntity.h\n\t\tEntities/FireworkEntity.h\n\t\tEntities/Floater.h\n\t\tEntities/GhastFireballEntity.h\n\t\tEntities/HangingEntity.h\n\t\tEntities/ItemFrame.h\n\t\tEntities/LeashKnot.h\n\t\tEntities/Pawn.h\n\t\tEntities/Player.h\n\t\tEntities/Painting.h\n\t\tEntities/Pickup.h\n\t\tEntities/ProjectileEntity.h\n\t\tEntities/SplashPotionEntity.h\n\t\tEntities/ThrownEggEntity.h\n\t\tEntities/ThrownEnderPearlEntity.h\n\t\tEntities/ThrownSnowballEntity.h\n\t\tEntities/TNTEntity.h\n\t\tEntities/WitherSkullEntity.h\n\t\tGenerating/ChunkDesc.h\n\t\tIniFile.h\n\t\tInventory.h\n\t\tItem.h\n\t\tItemGrid.h\n\t\tMap.h\n\t\tMapManager.h\n\t\tMobs/Monster.h\n\t\tMobs/MonsterTypes.h\n\t\tOSSupport/File.h\n\t\tProtocol/MojangAPI.h\n\t\tRegistries/CustomStatistics.h\n\t\tRoot.h\n\t\tScoreboard.h\n\t\tServer.h\n\t\tStatisticsManager.h\n\t\tStringUtils.h\n\t\tUI/Window.h\n\t\tUUID.h\n\t\tVector3.h\n\t\tWebAdmin.h\n\t\tWorld.h\n\t)\n\n\t# List all the files that are generated as part of the Bindings build process:\n\tset(BINDING_OUTPUTS\n\t\tBindings.cpp\n\t\tBindings.h\n\t\tLuaState_Declaration.inc\n\t\tLuaState_Implementation.cpp\n\t\tLuaState_Typedefs.inc\n\t)\n\n\t# Make the file paths absolute and pointing to the bindings folder:\n\tset(BINDINGS_FOLDER \"${PROJECT_SOURCE_DIR}/src/Bindings/\")\n\tlist(TRANSFORM BINDING_OUTPUTS PREPEND ${BINDINGS_FOLDER})\n\tlist(TRANSFORM BINDING_DEPENDENCIES PREPEND \"${PROJECT_SOURCE_DIR}/src/\")\n\n\t# Generate the bindings:\n\tadd_custom_command(\n\t\tOUTPUT ${BINDING_OUTPUTS}\n\t\tCOMMAND lua BindingsProcessor.lua\n\t\tWORKING_DIRECTORY ${BINDINGS_FOLDER}\n\t\tDEPENDS ${BINDING_DEPENDENCIES}\n\t)\nendfunction()\n"
  },
  {
    "path": "CMake/GroupSources.cmake",
    "content": "function(group_sources)\n\t# Enable the support for solution folders in MSVC\n\tset_property(GLOBAL PROPERTY USE_FOLDERS ON)\n\n\t# Put projects into solution folders in MSVC:\n\tset_target_properties(\n\t\tevent_core_static\n\t\tevent_extra_static\n\t\texpat\n\t\tfmt\n\t\tjsoncpp_static\n\t\tlibdeflate\n\t\tlualib\n\t\tluaexpat\n\t\tmbedcrypto\n\t\tmbedtls\n\t\tmbedx509\n\t\tlsqlite\n\t\tsqlite3\n\t\tSQLiteCpp\n\t\ttolualib\n\t\tPROPERTIES FOLDER Libraries\n\t)\n\n\t# luaproxy not generated on anything else\n\tif(WIN32)\n\t\tset_target_properties(\n\t\t\tluaproxy\n\t\t\tPROPERTIES FOLDER Support\n\t\t)\n\tendif()\n\n\tif(${BUILD_TOOLS})\n\t\tset_target_properties(\n\t\t\tMCADefrag\n\t\t\tProtoProxy\n\t\t\tPROPERTIES FOLDER Tools\n\t\t)\n\tendif()\n\n\t# Put all files into one project, separate by the folders:\n\tget_property(TARGET_SOURCE_FILES TARGET ${CMAKE_PROJECT_NAME} PROPERTY SOURCES)\n\tsource_group(TREE \"${PROJECT_SOURCE_DIR}/src\" FILES ${TARGET_SOURCE_FILES})\nendfunction()\n"
  },
  {
    "path": "CMake/StampBuild.cmake",
    "content": "# These env variables are used for configuring Travis CI builds.\nif(DEFINED ENV{TRAVIS_CUBERITE_FORCE32})\n\tset(FORCE32 $ENV{TRAVIS_CUBERITE_FORCE32})\nendif()\n\nif(DEFINED ENV{TRAVIS_BUILD_WITH_COVERAGE})\n\tset(BUILD_WITH_COVERAGE $ENV{TRAVIS_BUILD_WITH_COVERAGE})\nendif()\n\nif(DEFINED ENV{CUBERITE_BUILD_ID})\n\t# The build info is defined by the build system (Travis / Jenkins)\n\tset(BUILD_ID $ENV{CUBERITE_BUILD_ID})\n\tset(BUILD_SERIES_NAME $ENV{CUBERITE_BUILD_SERIES_NAME})\n\tset(BUILD_DATETIME $ENV{CUBERITE_BUILD_DATETIME})\n\tif(DEFINED ENV{CUBERITE_BUILD_COMMIT_ID})\n\t\tset(BUILD_COMMIT_ID $ENV{CUBERITE_BUILD_COMMIT_ID})\n\telse()\n\t\tmessage(\"Commit id not set, attempting to determine id from git\")\n\t\texecute_process(\n\t\t\tCOMMAND git rev-parse HEAD\n\t\t\tWORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}\n\t\t\tRESULT_VARIABLE GIT_EXECUTED\n\t\t\tOUTPUT_VARIABLE BUILD_COMMIT_ID\n\t\t)\n\t\tstring(STRIP ${BUILD_COMMIT_ID} BUILD_COMMIT_ID)\n\t\tif (NOT (GIT_EXECUTED EQUAL 0))\n\t\t\tmessage(FATAL_ERROR \"Could not identifiy git commit id\")\n\t\tendif()\n\tendif()\nelse()\n\t# This is a local build, stuff in some basic info:\n\tset(BUILD_ID \"Unknown\")\n\tset(BUILD_SERIES_NAME \"local build\")\n\texecute_process(\n\t\tCOMMAND git rev-parse HEAD\n\t\tWORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}\n\t\tRESULT_VARIABLE GIT_EXECUTED\n\t\tOUTPUT_VARIABLE BUILD_COMMIT_ID\n\t)\n\tif (NOT(GIT_EXECUTED EQUAL 0))\n\t\tset(BUILD_COMMIT_ID \"Unknown\")\n\tendif()\n\tstring(STRIP ${BUILD_COMMIT_ID} BUILD_COMMIT_ID)\n\texecute_process(\n\t\tCOMMAND git log -1 --date=iso --pretty=format:%ai\n\t\tWORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}\n\t\tRESULT_VARIABLE GIT_EXECUTED\n\t\tOUTPUT_VARIABLE BUILD_DATETIME\n\t)\n\tif (NOT(GIT_EXECUTED EQUAL 0))\n\t\tset(BUILD_DATETIME \"Unknown\")\n\tendif()\n\tstring(STRIP ${BUILD_DATETIME} BUILD_DATETIME)\n\n\t# The BUILD_COMMIT_ID and BUILD_DATETIME aren't updated on each repo pull\n\t# They are only updated when cmake re-configures the project\n\t# Therefore mark them as \"approx: \"\n\tset(BUILD_COMMIT_ID \"approx: ${BUILD_COMMIT_ID}\")\n\tset(BUILD_DATETIME \"approx: ${BUILD_DATETIME}\")\nendif()\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "# This is the top-level CMakeLists.txt file for the Cuberite project\n#\n# Use CMake to generate the build files for your platform\n\ncmake_minimum_required (VERSION 3.13)\ncmake_policy(VERSION 3.13...3.17.2)\nproject(\n\tCuberite\n\tDESCRIPTION \"A lightweight, fast and extensible game server for Minecraft\"\n\tHOMEPAGE_URL \"https://cuberite.org\"\n\tLANGUAGES C CXX\n)\n\noption(BUILD_TOOLS \"Sets up additional executables to be built along with the server\" OFF)\noption(BUILD_UNSTABLE_TOOLS \"Sets up yet more executables to be built, these can be broken and generally are obsolete\" OFF)\noption(NO_NATIVE_OPTIMIZATION \"Disables CPU-specific optimisations for the current machine, allows use on other CPUs of the same platform\" OFF)\noption(PRECOMPILE_HEADERS \"Enable precompiled headers for faster builds\" ON)\noption(SELF_TEST \"Enables testing code to be built\" OFF)\noption(UNITY_BUILDS \"Enables source aggregation for faster builds\" ON)\noption(WHOLE_PROGRAM_OPTIMISATION \"Enables link time optimisation for Release\" ON)\n\ninclude(\"CMake/AddDependencies.cmake\")\ninclude(\"CMake/Fixups.cmake\")\ninclude(\"CMake/GenerateBindings.cmake\")\ninclude(\"CMake/GroupSources.cmake\")\ninclude(\"SetFlags.cmake\")\n\n# Add build timestamp and details:\ninclude(\"CMake/StampBuild.cmake\")\n\n# We need C++17 features:\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\nset(CMAKE_CXX_EXTENSIONS OFF)\n\n# Static CRT:\nset(CMAKE_MSVC_RUNTIME_LIBRARY \"MultiThreaded$<$<CONFIG:Debug>:Debug>\")\n\n# TODO: set_build_stamp()\nset_global_flags()\nbuild_dependencies()\n\nadd_executable(${CMAKE_PROJECT_NAME})\nadd_subdirectory(src)\n\nset_exe_flags(${CMAKE_PROJECT_NAME})\nlink_dependencies(${CMAKE_PROJECT_NAME})\n\n# Set the startup project to Cuberite, and the debugger dir:\nset_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${CMAKE_PROJECT_NAME})\nset_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}/Server\")\n\n# Enable PCH and jumbo builds on supporting CMake:\nif (CMAKE_VERSION VERSION_GREATER_EQUAL \"3.16\")\n\tif (PRECOMPILE_HEADERS)\n\t\ttarget_precompile_headers(${CMAKE_PROJECT_NAME} PRIVATE src/Globals.h)\n\tendif()\n\n\tset_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES UNITY_BUILD ${UNITY_BUILDS})\nelse()\n\tmessage(WARNING \"Precompiled headers for FASTER BUILDS not enabled, upgrade to CMake 3.16 or newer!\")\nendif()\n\n# Selectively disable warnings in the level where the target is created:\nif(CMAKE_CXX_COMPILER_ID STREQUAL \"Clang\")\n\t# Generated file has old-style casts, missing prototypes, and deprecated declarations\n\tset_source_files_properties(\"${PROJECT_SOURCE_DIR}/src/Bindings/Bindings.cpp\" PROPERTIES COMPILE_OPTIONS -Wno-everything)\n\n\t# File failed to follow NHS guidelines on handwashing and has not maintained good hygiene\n\tset_source_files_properties(\"${PROJECT_SOURCE_DIR}/src/IniFile.cpp\" PROPERTIES COMPILE_OPTIONS -Wno-header-hygiene)\nelseif (CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\")\n\tset_source_files_properties(\"${PROJECT_SOURCE_DIR}/src/Bindings/Bindings.cpp\" PROPERTIES COMPILE_OPTIONS -w)\nendif()\n\nif(BUILD_TOOLS)\n\tmessage(STATUS \"Building tools\")\n\tadd_subdirectory(Tools/GrownBiomeGenVisualiser/)\n\tadd_subdirectory(Tools/MCADefrag/)\n\tadd_subdirectory(Tools/NoiseSpeedTest/)\n\tadd_subdirectory(Tools/ProtoProxy/)\nendif()\n\nif(BUILD_UNSTABLE_TOOLS)\n\tmessage(STATUS \"Building unstable tools\")\n\tadd_subdirectory(Tools/GeneratorPerformanceTest/)\nendif()\n\n# Self Test Mode enables extra checks at startup\nif(SELF_TEST)\n\tmessage(STATUS \"Tests enabled\")\n\tenable_testing()\n\tadd_subdirectory(tests)\nendif()\n\n# The need for speed (in Release):\nif(WHOLE_PROGRAM_OPTIMISATION)\n    include(CheckIPOSupported)\n    check_ipo_supported(RESULT IPO_SUPPORTED OUTPUT IPO_CHECK_OUTPUT)\n    if(IPO_SUPPORTED)\n        set_property(TARGET ${CMAKE_PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)\n    else()\n        message(WARNING \"IPO is not supported: ${IPO_CHECK_OUTPUT}\")\n    endif()\nendif()\n\nemit_fixups()\ngroup_sources()\nenable_bindings_generation()\n"
  },
  {
    "path": "COMPILING.md",
    "content": "Compiling Cuberite\n==================\n\nTo compile Cuberite from source, you need the following set of software:\n\n - CMake\n - Platform-specific make tool (Windows would be MSVC, Linux/macOS GNU make, etc.)\n - C compiler\n - Modern C++17 capable compiler and linker\n\nTo contribute code, you also need a Git client.\n\nWindows\n-------\n\nWe use Microsoft Visual Studio for Windows compilation. It is possible to use other toolchains, but we don't test against them and they aren't supported. Visual Studio 2017 Community and above are being actively used for development.\n\nYou can find download links for VS2019 Community [here][1].\n\nNext, you need to download and install [CMake][2]. You should download a full installation package, so that the installer will set everything up for you (especially the paths).\n\nTo contribute your changes to the source back to the repository, you need a Git client. Options are:\n\n - [Git for Windows][3]\n - [GitHub Desktop][4]\n - [TortoiseGit][5]\n\nAlternatively, if you want only to compile the source, without contributing, you can [download the sources in a ZIP file directly from GitHub][6].\n\nIf you're using Git to get the source, use the following command to set up the local workspace correctly:\n\n```\ngit clone --recursive https://github.com/cuberite/cuberite.git\n```\n\nNow that you have the source, it's time to prepare the project files for your favorite compiler. Open a command window in the folder with the source and type in:\n```\nmkdir build\ncd build\ncmake ..\n```\nThis creates a `build` folder where the build will take place, then runs CMake, which will auto-detect your Visual Studio version and produce the appropriate project and solution files.\n\nFinally, open the newly created file, `Cuberite.sln`, in your Visual Studio.\n\nIf you want to run Cuberite from within VS, you need to first make sure that it will be run with the correct home folder. Normally this happens automatically, but for some Visual Studio versions the process doesn't stick. Right-click on the Cuberite project in the Solution Explorer tool window, and select Properties. In the dialog, navigate to Configuration properties -> Debugging in the tree on the left, then make sure the value `Working Directory` is set to `../Server`. If you don't do this, the server won't be able to find crafting recipes, item names or plugins.\n\n### Release Configuration\n\nTo make Visual Studio produce the version with the best performance, you will need to select a Release configuration. Go to menu Build -> Configuration Manager, and in the opened dialog, change the top left combo box (Active solution configuration) to Release. Close the dialog and build the solution. The resulting executable is called `Cuberite.exe` in the `Server` folder.\n\n### Debug Configuration\n\nIn order to tinker with the code, you'll more than likely need to use the debugging features of your IDE. To make them the easiest to use, you should switch to the Debug configuration - this provides the highest level of information while debugging, for the price of the executable being 2 - 10 times slower. Go to menu Build -> Configuration Manager, and in the opened dialog, change the top left combo box (Active solution configuration) to Debug. Close the dialog and build the solution. The resulting executable is called `Cuberite_debug.exe` in the `Server` folder.\n\nmacOS\n-----\n\n - Install git from its [website][7] or homebrew: `brew install git`.\n\n - Install Xcode (commandline tools are recommended) from the App Store or [the website][8].\n\n - Install CMake from its [website][9] or homebrew: `brew install cmake`.\n\nCuberite requires Xcode 11.3 or newer.\n\n### Getting the Source\n\n```\ngit clone --recursive https://github.com/cuberite/cuberite.git\n```\n\n### Building\n\nFollow the instructions at [CMake on Unix-based platforms](#cmake-on-unix-based-platforms), using Xcode as cmake's generator. If no generator is specified, CMake will use the Makefile generator, in which case you must build with the `make` command.\n\nAfter doing so, run the command `xcodebuild lib/polarssl/POLARSSL.xcodeproj` in the build directory, in order to build polarssl, a library that is required by Cuberite. Lastly, run the command `xcodebuild` to build Cuberite. Optionally, you may open the project files for polarssl and then Cuberite in Xcode and build there.\n\n\nLinux, FreeBSD etc.\n-------------------\n\nInstall git, make, cmake and clang (or gcc), using your platform's package manager. Debian/Ubuntu:\n\n```\nsudo apt-get install git make cmake clang\n```\nEnsure that you have modern C++ compiler and linker (Clang 7.0+, GCC 7.4+, or VS 2017+).\nCuberite also requires CMake 3.13 or newer.  You might find that your distribution\ndefaults are too out of date, in which case you may need to add a new `apt` source,\nor download directly from the projects' websites:\n\n - [Clang][Clang-download]\n - [CMake][2]\n\n### Getting the Source\n\n```\ngit clone --recursive https://github.com/cuberite/cuberite.git\n```\n\n### Building\n\nRun the following commands to build Cuberite:\n\n```\nmkdir Release\ncd Release\ncmake -DCMAKE_BUILD_TYPE=RELEASE ..\nmake -j`nproc`\n```\n\nThis will build Cuberite in release mode, which is better for almost all cases. For more `cmake` options, or for building in debug mode, see [CMake on Unix-based platforms](#cmake-on-unix-based-platforms).\n\nAndroid\n-------\n\nIt is required that users obtain the latest copies of:\n\n - [The Android Native Development Kit (NDK)][10]\n - [Lua (download a binary)][11]\n\nWindows users may optionally install the [Ninja build system][12] for improved build speeds.\n\n### Getting the Source\n\n```\ngit clone --recursive https://github.com/cuberite/cuberite.git\n```\n\n### Configuration\n\nFrom the `android` subdirectory:\n\n```\ncmake . -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=16 -DCMAKE_BUILD_TYPE=Release -DCMAKE_ANDROID_ARCH_ABI=armeabi -DCMAKE_ANDROID_NDK=\"\"\n```\nwhere `CMAKE_ANDROID_NDK` should be the absolute path to where the Android NDK is installed.\n\n#### Generators to Use\n\nOn Linux, the default Make is suggested. No additional parameters are required for this option.\n\nWindows users may make use of Visual Studio to compile for Android, but CMake requires the presence of Nvidia CodeWorks/Nsight Tegra, which can be a hassle to install.\n\nThe easiest generator to use seems to be the NDK-bundled Make, to be specified:\n * `-G \"MinGW Makefiles\" -DCMAKE_MAKE_PROGRAM=\"\"`\nwhere `CMAKE_MAKE_PROGRAM` should be the absolute path to the `make` program, found under the `prebuilt/windows-*/bin` subdirectory in the NDK folder.\n\nThe next easiest generator is Ninja, which additionally offers multithreaded builds, to be specified:\n * `-G \"Ninja\"`\n\n#### Additional ABI Options\n\nFor additional ABI options, visit: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_ARCH_ABI.html\n\nPlease note that certain ABIs require specific [API levels](#api-level-requirements).\n\n#### API Level Requirements\n\nThe minimum API level is 16 in the verbatim copy of this folder, due to the inclusion of position independent compilation. Additonally, API level 21 or higher is needed for 64 bit ABIs as earlier versions have no support for this architecture.\n\nTo lower these requirements to run on very old devices, it is necessary to select a compatible ABI, and disable position independent code generation.\n\n### Building\n\nFrom the `android` subdirectory:\n\n```\ncmake --build .\n```\n\nIf the build succeeded, an Android-launchable binary will have been generated under the `Server` directory. However, since this directory does not have any supporting files, they must be copied from the parent folder's `Server` directory.\n\nTo use it in the official Android app, compress the aforementioned `Server` directory into a Zip file, and transfer it to the phone on which the app is installed.\n\n#### Using the Compile Script on Linux\n\nLinux users are entitled to use the compile script, which provides some easy to use options and also contains instructions for using the binaries in the official Android app.\n\nWhen running the compile script, make sure to have the necessary build tools installed and run the compile script as following:\n\n```\nNDK=\"path/to/ndk/root\" CMAKE=\"path/to/cmake/executable\" android/compile.sh <abi|all|clean>\n```\n\nThe NDK variable must be set to the path to the NDK root, CMAKE to a call of the cmake binary used for compiling. If the cmake binary is in the PATH, a simple `CMAKE=cmake` is enough. As last parameter you either have to enter a correct ABI (see https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_ARCH_ABI.html) or either all or clean. Clean will cause the script to remove the android-build directory, all will compile and zip all Cuberite for all 7 ABIs and create a zip archive of the android/Server direcory for use in the official Android app. If you are unsure which ABI is required for your phone, open the official Android app and navigate to \"Settings\" and \"Install\". It will show you the required ABI. Additional parameters may be given through environment variables, namely TYPE=\"\" as Release or Debug (defaults to Release) and THREADS=\"4\" as the number of threads used for compilation (defaults to 4).\n\n### Running the Executables on a Device\n\nNote the locations to which the Zip files were transferred. Open the official Android app, and select \"Settings\", then \"Install\", and finally select the Zip files.\n\nCuberite for Android is now ready to use.\n\nCMake on Unix-based platforms\n-----------------------------\n\n### Release Mode\n\nRelease mode is preferred for almost all cases, it has much better speed and less console spam. However, if you are developing Cuberite actively, debug mode might be better.\n\nAssuming you are in the Cuberite folder created in the initial setup step, you need to run these commands:\n\n```\nmkdir Release\ncd Release\ncmake -DCMAKE_BUILD_TYPE=RELEASE ..\n```\n\nNOTE: CMake can generate project files for many different programs, such as Xcode, eclipse, and ninja. To use a different generator, first type `cmake --help`, and at the end, cmake will output the different generators that are available. To specify one, add `-G` followed by the name of the generator, in the `cmake` command. Note that the name is case-sensitive.\n\nThe executable will be built in the `cuberite/Server` folder and will be named `Cuberite`.\n\n### Debug Mode\n\nDebug mode is useful if you want more debugging information about Cuberite while it's running or if you want to use a debugger like GDB to debug issues and crashes.\n\nAssuming you are in the Cuberite folder created in the Getting the sources step, you need to run these commands:\n\n```\nmkdir Debug\ncd Debug\ncmake -DCMAKE_BUILD_TYPE=DEBUG ..\n```\n\nNOTE: CMake can generate project files for many different programs, such as Xcode, eclipse, and ninja. To use a different generator, first type `cmake --help`, and at the end, cmake will output the different generators that are available. To specify one, add `-G` followed by the name of the generator, in the `cmake` command. Note that the name is case-sensitive.\n\nThe executable will be built in the `cuberite/Server` folder and will be named `Cuberite_debug`.\n\n### 32 Bit Mode Switch\n\nThis is useful if you want to compile Cuberite on an x64 (64-bit Intel) machine but want to use on an x86 (32-bit Intel) machine. This switch can be used with debug or release mode. Simply add:\n\n    -DFORCE_32=1\n\nto your cmake command and 32 bit will be forced.\n\n### Compiling for Another Computer of the Same Architecture\n\nWhen cross-compiling for another computer of the same architecture it is important to set the NO_NATIVE_OPTIMIZATION flag. This tells the compiler not to optimise for your machine. This switch can be used with debug or release mode. To enable, simply add:\n\n    -DNO_NATIVE_OPTIMIZATION=1\n\nto your cmake command.\n\n### List of All Build Flags\n\nCuberite's build process supports a large number of flags for customising the builds. Use these flags by adding `-DFlag_name=Value` to the cmake configuration command. For example to enable test generation using the `SELF_TEST` flag add: `-DSELF_TEST=ON`\n\n###### BUILD_TOOLS\nAdds the Cuberite tools to the build. At the moment only MCADefrag and ProtoProxy are added. Define as ON to enable. Define as OFF to disable.\n\n###### BUILD_UNSTABLE_TOOLS\nAdds tools that are not working yet to the build. Currently this is only the Generator Performance Test. Used for developing these tools. Define as ON to enable. Define as OFF to disable.\n\n###### SELF_TEST\nEnables generation of tests and self-test startup code. Tests can be run with ctest and with makefiles make test. Define as ON to enable. Define as OFF to disable.\n\n###### FORCE_32\nForces the build to use 32 bit builds on *nix systems. Define as ON to enable. Define as OFF to disable.\n\n###### NO_NATIVE_OPTIMIZATION\nDisables optimizations for the build host. This is important when building on a different machine from the one you will run Cuberite on as the build machine may support instructions the final machine does not. This flag only has any effect on linux. Define as ON to enable. Define as OFF to disable.\n\n###### DISABLE_SYSTEM_LUA\nDisables use of the system lua, uses a compiled version instead. Useful if compiling on a system that doesn't already have lua installed. This option is incompatible with cross-compilation.\n\n###### UNITY_BUILDS\nControls use of unity builds, an optimisation that improves compile times at the expense of system compatibility and error message utility. Some systems may need to have this disabled in order to compile properly. Unity builds are only supported on CMake versions >= 3.16, if you have an old version unity builds will always be disabled and this flag has no effect.\n\n###### PRECOMPILE_HEADERS\nControls use of precompiled headers, an optimisation that improves compile times at the expense of system compatibility. Some systems may need to have this disabled in order to compile properly. Precompiled headers are only supported on CMake versions >= 3.16, if you have an old version precompiled headers will always be disabled and this flag has no effect.\n\n###### WHOLE_PROGRAM_OPTIMISATION\nControls use of link time optimisation (LTO), which slightly improves the generated binary file at the expense of compilation speed and system compatibility. Some systems may need to have this disabled in order to compile properly.\n\n\n[1]: https://www.visualstudio.com/downloads/\n[2]: https://cmake.org/download/\n[3]: https://git-for-windows.github.io/\n[4]: https://desktop.github.com/\n[5]: https://tortoisegit.org/\n[6]: https://github.com/cuberite/cuberite/archive/master.zip\n[7]: https://git-scm.com/\n[8]: https://developer.apple.com/downloads\n[9]: https://cmake.org/\n[10]: https://developer.android.com/ndk/downloads/index.html\n[11]: https://www.lua.org/download.html\n[12]: https://github.com/ninja-build/ninja/releases\n[clang-download]: https://releases.llvm.org/download.html\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "How to Contribute to Cuberite\n=============================\n\nThank you for your interest in Cuberite. Contributing to Cuberite is easy, just fork the project on GitHub, make your changes and submit a pull request to get your code merged. That's all there is to it.\nCheck out [GETTING-STARTED.md][1] for more information about setting up the development environment for Cuberite, finding issues to work on, etc...\n\nIf you are new to open source and/or GitHub, or just aren't sure about some details in the contribution process, here's a tutorial to get you started:\n[How to Contribute to an Open Source Project on GitHub][2]\n\nCode Conventions\n----------------\n\nWhen contributing, you must follow our code conventions. Otherwise, CI builds will automatically fail and your PR will not be merged until the non-conforming code is fixed. Due to this, we strongly advise you to run `src/CheckBasicStyle.lua` before committing, it will perform various code style checks and warn you if your code does not conform to our conventions. `CheckBasicStyle.lua` can be configured to run automatically before every commit via a pre-commit hook, **this is highly recommended**. There are instructions on how to achieve this at the bottom of this file.\n\nHere are the conventions:\n\n - We use C++17.\n - Please use **tabs for indentation and spaces for alignment**. This means that if it's at line start, it's a tab; if it's in the middle of a line, it's a space.\n - All functions in all classes need documenting comments on what they do and what behavior they follow, use doxy-comments formatted as `/** Description */`. Do not use asterisks on additional lines in multi-line comments.\n - Use spaces after the comment markers: `// Comment` instead of `//Comment`. A comment must be prefixed with two spaces if it's on the same line with code:\n   - `SomeFunction()<Space><Space>//<Space>Note the two spaces prefixed to me and the space after the slashes.`\n - All variable names and function names use CamelCase style, with the exception of single letter variables.  \n   - `ThisIsAProperFunction()` `This_is_bad()` `this_is_bad()` `GoodVariableName` `badVariableName`.\n - All private member variables start with `m_`, function parameters start with `a_`, class names start with `c`.\n   - `class cMonster { int m_Health; int DecreaseHealth(int a_Amount); }`\n - Put spaces after commas. `Vector3d(1, 2, 3)` instead of `Vector3d(1,2,3)`\n - Put spaces before and after every operator, except unary operators.\n   - `a = b + c;`\n   - `if (a == b)`\n   - `++itr`\n - Keep individual functions spaced out by 5 empty lines, this enhances readability and makes navigation in the source file easier.\n - Add those extra parentheses to conditions, especially in C++:\n   - `if ((a == 1) && ((b == 2) || (c == 3)))` instead of ambiguous `if (a == 1 && b == 2 || c == 3)`\n   - This helps prevent mistakes such as `if (a & 1 == 0)`\n - Alpha-sort stuff that makes sense alpha-sorting—long lists of similar items etc.\n - White space is free, so use it freely.\n   - \"freely\" as in \"plentifully\", not \"arbitrarily\".\n - All `case` statements inside a `switch` need an extra indent.\n - Each and every control statement deserves its braces. This helps maintainability later on when the file is edited, lines added or removed - the control logic doesn't break so easily.\n   - The only exception: a `switch` statement with all `case` statements being a single short statement is allowed to use the short brace-less form.\n   - These two rules really mean that indent is governed by braces.\n - Function parameters that are coordinates should be passed using an appropriate storage container, and not as three separate arguments.\n   - e.g. for a block position, Vector3i. For an entity position, Vector3d. For a chunk coordinate, cChunkCoords.\n   - For a 3-dimensional box of blocks, use cCuboid. For an axis-aligned bounding box, use cBoundingBox.\n - Parameters smaller than 4 elements (e.g. Vector3, cChunkCoords) should be passed by value. All other parameters should be passed by const reference, where applicable.\n   - `Foo(Vector3d a_Param1, const cCuboid & a_Param2)`\n   - See the discussion in issue #3853\n - Use the provided wrappers for OS stuff:\n   - Threading is done by inheriting from `cIsThread`, thread synchronization through `cCriticalSection` and `cEvent`, file access and filesystem operations through the `cFile` class, high-precision timing through `cStopwatch`\n - No magic numbers, use named constants:\n   - `E_ITEM_XXX`, `E_BLOCK_XXX` and `E_META_XXX` for items and blocks.\n   - `cEntity::etXXX` for entity types, `cMonster::mtXXX` for mob types.\n   - `dimNether`, `dimOverworld` and `dimEnd` for world dimension.\n   - `gmSurvival`, `gmCreative`, `gmAdventure` for game modes.\n   - `wSunny`, `wRain`, `wThunderstorm` for weather.\n   - `cChunkDef::Width`, `cChunkDef::Height` for chunk dimensions (C++).\n   - etc.\n - Instead of checking for a specific value, use an `IsXXX` function, if available:\n   - `cPlayer:IsGameModeCreative()` instead of` (cPlayer:GetGameMode() == gmCreative)` (the player can also inherit the gamemode from the world, which the value-d condition doesn't catch).\n - All `#include` directives are specified relative to the root source directory.\n - Add an empty last line in all source files (GCC and Git can complain otherwise).\n\nPre-commit Hook\n---------------\nWhen contributing, the code conventions above *must* be followed. Otherwise, the CI builds will automatically fail and your PR will not be merged until the non-conforming code is fixed. It is highly recommended to set up a pre-commit hook which will check your code style before every commit. Here is how to do that:\n\n - Clone the repository as usual.\n - Go to your `<clone location>/.git/hooks` folder, create a text file named \"pre-commit\" there with the following contents:\n\n```\n#!/bin/sh\nsrc/CheckBasicStyle.lua 1>&2 -g\n```\n\n - If on Linux/Unix, you need to give the newly created file an execute permission: `chmod +x .git/hooks/pre-commit`\n - Lua must be installed.\n - You're done. Now, `src/CheckBasicStyle.lua` will check the changed files before every commit. If a problem is found, it will point you to that problem and will cancel the commit.\n\nNote that the check script is not smart enough to catch everything, so not having any warnings does not necessarily imply that you followed the conventions fully. The other humans working on this will perform more checks before merging.\n\nGithub-related conventions\n--------------------------\nThe following rules are not strictly enforced, but if you follow them, you will make it easier for us to review your changes.\n - Use good short title for your PRs. `Store Health as float` is good, `Fix #4024` is not good.\n - If a PR fixes an issue, mention it in the PR description, but **not** in the commits themselves. Typically, we add the line `Fixes #007` to the bottom of the PR description, this makes Github link the PR to the issue, auto-close the issue when the PR is merged, and also is included in the merge message.\n - Focus on one thing only. Each PR should avoid making unrelated changes - those makes the history more difficult to understand later on, and they make the review a headache.\n - Feel free to rebase, amend or otherwise manipulate the commits in the PR (of course, as long as you're the only one working on the PR). We mostly squash-merge PRs, so your internal commit structure will not be important in the end.\n - If the PR is about one change, but it makes sense to keep the change broken into several commits, make sure each such commit is compilable, encapsulated, and possibly add a note to the PR description so that we consider this.\n\t\nCopyright\n---------\n\nYour must either place your work in the public domain or licensed it under the Apache License 2.0, and if so you must add yourself to the contributors file to show that you accept the publication of your work under the license.\n\n**PLUGINS ONLY**: If your plugin is not licensed under the Apache License 2.0, then it must be compatible and marked as such. This is only valid for the plugins included within the Cuberite source; plugins developed on separate repositories can use whatever license they want.\n\n[1]: https://github.com/cuberite/cuberite/blob/master/GETTING-STARTED.md\n[2]: https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github\n"
  },
  {
    "path": "CONTRIBUTORS",
    "content": "This file contains all known copyright holders of this software, as far as is\npractically possible to ascertain.\n\nIf you contribute to this software you must add yourself to this file, to\nindicate your agreement to license your contributions according to the license\nas provided in the LICENSE file.\n\n12xx12\n9caihezi\nAirOne01\nAltenius\nanguslmm (Angus McLean)\nashquarky\nBasedDoge (Donated AlchemistVillage prefabs)\nbearbin (Alexander Harkness)\nbeeduck\nbibo38\nbirkett (Anthony Birkett)\nBond_009\nchangyongGuo\nCocosushi6\nCoolPuppyKid\nDarkoGNU\nderouinw\ndImrich (Damian Imrich)\nDiusrex\nDuralex\ndyexlzc\nEarboxer (Zach DeCook)\nFakeTruth (founder)\nfeyokorenhof\nGareth Nelson\nGefaketHD\nGriezn (Seppe Degryse)\nHaoTNN\nhavel06 (Michal Havlíček)\nhle0\nHowaner\nion232 (Arran Ireland)\njan64\njasperarmstrong\njclever77 (Jon Clever)\nJK2K\nkevinr (Kevin Riggle)\nkeyboard\nKingCol13\nLapayo\nlinnemannr (Reid Linnemann)\nLittleBigBug (Ethan Jones)\nlkolbly\nLogicParrot\nLuksor\nM10360\nmarmot21\nMasy98\nmathiascode\nmaxluchterhand1\nMaxwellScroggs\nmborland\nmBornand\nmcfadyeni\nMeMuXin\nmgueydan\nMikeHunsinger\nmjagdis (Mike Jagdis)\nMorritz (TJ)\nmorsmordere (Anzhelika Iugai)\nmtilden\nnesco\nNiLSPACE (formerly STR_Warrior)\nnpresley0506\np-mcgowan\nPersson-dev\nplan1231\npokechu22\nProjectBM\npwnOrbitals\nRodarg\nRorkh\nrs2k\nSamJBarney\nSchwertspize\nSeadragon91 (Lukas Pioch)\nsleirsgoevy (Sergey Lisov)\nSofapriester\nsolvictor\nSpekdrum (Pablo Beltran)\nSphinxC0re\nSpongecade (Updated wiki links)\nsteve-nzr\nstructinf (xdot)\nsweetgiorni\nSuperEwald\nSxw1212\nTaugeshtu\nTheHyper45\ntheophriene\ntigerw (Tiger Wang)\ntonibm19\ntonitch (Debucquoy Anthony)\nTooAngel\ntympaniplayer (Nate Palmer)\nUltraCoderRU\nWarmist\nWebFreak001\nwilliamhatcher (Helped with API documentation updates and bug fixes)\nworktycho\nXenoxis\nxoft (Mattes Dolak/madmaxoft on GH)\nYeeeeezus (Donated AlchemistVillage prefabs)\n"
  },
  {
    "path": "CheckLua.cmake",
    "content": "# CheckLua.cmake\n\n# Checks whether the Lua standalone interpreter is installed on the host system\n# If found, sets HAS_LUA_INTERPRETER to 1 and LUA_INTERPRETER_VERSION to the version reported (\"5.1\" etc.)\n# If not found, unsets HAS_LUA_INTERPRETER\n\n\n\n\nexecute_process(\n\tCOMMAND lua -e \"io.stdout:write(string.match(_VERSION, '%d+%.%d+'))\"\n\tRESULT_VARIABLE LUA_EXECUTED\n\tOUTPUT_VARIABLE LUA_INTERPRETER_VERSION\n)\n\nif (\"${LUA_EXECUTED}\" STREQUAL \"0\")\n\tset(HAS_LUA_INTERPRETER 1)\nelse()\n\tunset(HAS_LUA_INTERPRETER)\n\tunset(LUA_INTERPRETER_VERSION)\nendif()\n\nunset(LUA_EXECUTED)\n"
  },
  {
    "path": "Doxyfile",
    "content": "# Doxyfile 1.8.1.2\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project\n#\n# All text after a hash (#) is considered a comment and will be ignored\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \")\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# https://www.gnu.org/software/libiconv for the list of possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or sequence of words) that should\n# identify the project. Note that if you do not use Doxywizard you need\n# to put quotes around the project name if it contains spaces.\n\nPROJECT_NAME           = Cuberite\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n\nPROJECT_NUMBER         =\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer\n# a quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = \"A lightweight, fast and extensible game server for Minecraft\"\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is\n# included in the documentation. The maximum height of the logo should not\n# exceed 55 pixels and the maximum width should not exceed 200 pixels.\n# Doxygen will copy the logo to the output directory.\n\nPROJECT_LOGO           = Server/favicon.png\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n# base path where the generated documentation will be put.\n# If a relative path is entered, it will be relative to the location\n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = doxy\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n# 4096 sub-directories (in 2 levels) under the output directory of each output\n# format and will distribute the generated files over these directories.\n# Enabling this option can be useful when feeding doxygen a huge amount of\n# source files, where putting all generated files in the same directory would\n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = YES\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator\n# that is used to form the text in various listings. Each string\n# in this list, if found as the leading text of the brief description, will be\n# stripped from the text and the result after processing the whole list, is\n# used as the annotated text. Otherwise, the brief description is used as-is.\n# If left blank, the following values are used (\"$name\" is automatically\n# replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       = \"The $name class\" \\\n                         \"The $name widget\" \\\n                         \"The $name file\" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user-defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the\n# path to strip.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n# the path mentioned in the documentation of a class, which tells\n# the reader which header file to include in order to use a class.\n# If left blank only the name of the header file containing the class\n# definition is used. Otherwise one should specify the include paths that\n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n# (but less readable) file names. This can be useful if your file system\n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = YES\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments will behave just like regular Qt-style comments\n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = YES\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n# interpret the first line (until the first dot) of a Qt-style\n# comment as the brief description. If set to NO, the comments\n# will behave just like regular Qt-style comments (thus requiring\n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = YES\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n# treat a multi-line C++ special comment block (i.e. a block of //! or ///\n# comments) as a brief description. This used to be the default behaviour.\n# The new default is to treat a multi-line C++ comment block as a detailed\n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n# a new page for each member. If set to NO, the documentation of a member will\n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 4\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user-defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                =\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding\n# \"class=itcl::class\" will allow you to use the command class in the\n# itcl::class meaning.\n\nTCL_SUBST              =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n# sources only. Doxygen will then generate output that is more tailored for C.\n# For instance, some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n# sources only. Doxygen will then generate output that is more tailored for\n# Java. For instance, namespaces will be presented as packages, qualified\n# scopes will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources only. Doxygen will then generate output that is more tailored for\n# Fortran.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for\n# VHDL.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given extension.\n# Doxygen has a built-in mapping, but you can override or extend it using this\n# tag. The format is ext=language, where ext is a file extension, and language\n# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,\n# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make\n# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions\n# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all\n# comments according to the Markdown format, which allows for more readable\n# documentation. See https://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you\n# can mix doxygen, HTML, and XML commands with Markdown formatting.\n# Disable only in case of backward compatibilities issues.\n\nMARKDOWN_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should\n# set this tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n# func(std::string) {}). This also makes the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n# Doxygen will parse them like normal C++ but will assume all classes use public\n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate getter\n# and setter methods for a property. Setting this option to YES (the default)\n# will make doxygen replace the get and set methods by a property in the\n# documentation. This will only work if the methods are indeed getting or\n# setting a simple type. If this is not the case, or you want to show the\n# methods anyway, you should set this option to NO.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n# the same type (for instance a group of public functions) to be put as a\n# subgroup of that type (e.g. under the Public Functions section). Set it to\n# NO to prevent subgrouping. Alternatively, this can be done per class using\n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n# unions are shown inside the group in which they are included (e.g. using\n# @ingroup) instead of on a separate page (for HTML and Man pages) or\n# section (for LaTeX and RTF).\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n# unions with only public data fields will be shown inline in the documentation\n# of the scope in which they are defined (i.e. file, namespace, or group\n# documentation), provided this scope is documented. If set to NO (the default),\n# structs, classes, and unions are shown on a separate page (for HTML and Man\n# pages) or section (for LaTeX and RTF).\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n# is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically\n# be useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n# determine which symbols to keep in memory and which to flush to disk.\n# When the cache is full, less often used symbols will be written to disk.\n# For small to medium size projects (<1000 input files) the default value is\n# probably good enough. For larger projects a too small cache size can cause\n# doxygen to be busy swapping symbols to and from disk most of the time\n# causing a significant performance penalty.\n# If the system has enough physical memory increasing the cache will improve the\n# performance by keeping more symbols in memory. Note that the value works on\n# a logarithmic scale so increasing the size by one will roughly double the\n# memory usage. The cache size is given by this formula:\n# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nSYMBOL_CACHE_SIZE      = 0\n\n# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\n# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\n# their name and scope. Since this can be an expensive process and often the\n# same symbol appear multiple times in the code, doxygen keeps a cache of\n# pre-resolved symbols. If the cache is too small doxygen will become slower.\n# If the cache is too large, memory is wasted. The cache size is given by this\n# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = YES\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = YES\n\n# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal\n# scope will be included in the documentation.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n# defined locally in source files will be included in the documentation.\n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local\n# methods, which are defined in the implementation section but not in\n# the interface are included in the documentation.\n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base\n# name of the file that contains the anonymous namespace. By default\n# anonymous namespaces are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these classes will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n# friend (class|struct|union) declarations.\n# If set to NO (the default) these declarations will be included in the\n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n# documentation blocks found inside the body of a function.\n# If set to NO (the default) these blocks will be appended to the\n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = NO\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put a list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n# will list include files with double quotes in the documentation\n# rather than with sharp brackets.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n# brief documentation of file, namespace and class members alphabetically\n# by member name. If set to NO (the default) the members will appear in\n# declaration order.\n\nSORT_BRIEF_DOCS        = YES\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n# will sort the (brief and detailed) documentation of class members so that\n# constructors and destructors are listed first. If set to NO (the default)\n# the constructors will appear in the respective orders defined by\n# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n# hierarchy of group names into alphabetical order. If set to NO (the default)\n# the group names will appear in their defined order.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n# sorted by fully-qualified names, including namespaces. If set to\n# NO (the default), the class list will be sorted only by class name,\n# not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the\n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n# do proper type resolution of all parameters of a function it will reject a\n# match between the prototype and the implementation of a member function even\n# if there is only one candidate or it is obvious which candidate to choose\n# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n# will still accept a match between prototype and implementation in such cases.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n# disable (NO) the deprecated list. This list is created by putting\n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or macro consists of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and macros in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n# This will remove the Files entry from the Quick Index and from the\n# Folder Tree View (if specified). The default is YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n# Namespaces page.  This will remove the Namespaces entry from the Quick Index\n# and from the Folder Tree View (if specified). The default is YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command <command> <input-file>, where <command> is the value of\n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n# provided by doxygen. Whatever the program writes to standard output\n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option.\n# You can optionally specify a file name after the option, if omitted\n# DoxygenLayout.xml will be used as the name of the layout file.\n\nLAYOUT_FILE            =\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files\n# containing the references data. This must be a list of .bib files. The\n# .bib extension is automatically appended if omitted. Using this command\n# requires the bibtex tool to be installed. See also\n# https://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\n# feature you need bibtex and perl available in the search path.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some\n# parameters in a documented function, or documenting parameters that\n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_NO_PARAMDOC option can be enabled to get warnings for\n# functions that are documented, but have no documentation for their parameters\n# or return value. If set to NO (the default) doxygen will only warn about\n# wrong or incomplete parameter documentation, but not about the absence of\n# documentation.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text. Optionally the format may contain\n# $version, which will be replaced by the version of the file (if it could\n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n\nINPUT                  = src\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n# also the default input encoding. Doxygen uses libiconv (or the iconv built\n# into libc) for the transcoding. See https://www.gnu.org/software/libiconv for\n# the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank the following patterns are tested:\n# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n# *.f90 *.f *.for *.vhd *.vhdl\n\nFILE_PATTERNS          = *.c \\\n                         *.cc \\\n                         *.cxx \\\n                         *.cpp \\\n                         *.c++ \\\n                         *.d \\\n                         *.java \\\n                         *.ii \\\n                         *.ixx \\\n                         *.ipp \\\n                         *.i++ \\\n                         *.inl \\\n                         *.h \\\n                         *.hh \\\n                         *.hxx \\\n                         *.hpp \\\n                         *.h++ \\\n                         *.idl \\\n                         *.odl \\\n                         *.cs \\\n                         *.php \\\n                         *.php3 \\\n                         *.inc \\\n                         *.m \\\n                         *.markdown \\\n                         *.md \\\n                         *.mm \\\n                         *.dox \\\n                         *.py \\\n                         *.f90 \\\n                         *.f \\\n                         *.for \\\n                         *.vhd \\\n                         *.vhdl\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = source/SQLite \\\n                         source/squirrelbindings\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories. Note that the wildcards are matched\n# against the file with absolute path, so to exclude all test directories\n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = *StackWalker.* \\\n                         *LeakFinder.* \\\n                         *Bindings.* \\\n                         *ManualBindings.*\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        = _* \\\n                         __* \\\n                         abstract\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude\n# commands irrespective of the value of the RECURSIVE tag.\n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.  If FILTER_PATTERNS is specified, this tag will be\n# ignored.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis.  Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match.  The filters are a list of the form:\n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n# info on how filters are used. If FILTER_PATTERNS is empty or if\n# non of the patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n# and it is also possible to disable source filtering for a specific pattern\n# using *.ext= (so without naming a filter). This option only has effect when\n# FILTER_SOURCE_FILES is enabled.\n\nFILTER_SOURCE_PATTERNS =\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n# Note: To get rid of all source code in the generated output, make sure also\n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = YES\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C, C++ and Fortran comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES\n# then for each documented function all documented\n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES\n# then for each documented function all documented entities\n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.  Otherwise they will link to the documentation.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code\n# will point to the HTML generated by the htags(1) tool instead of doxygen\n# built-in source browser. The htags tool is part of GNU's global source\n# tagging system (see https://www.gnu.org/software/global/global.html). You\n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = YES\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          = c\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header. Note that when using a custom header you are responsible\n# for the proper inclusion of any scripts and style sheets that doxygen\n# needs, which is dependent on the configuration options used.\n# It is advised to generate a default header using \"doxygen -w html\n# header.html footer.html stylesheet.css YourConfigFile\" and then modify\n# that header. Note that the header is subject to change so you typically\n# have to redo this when upgrading to a newer version of doxygen or when\n# changing the value of configuration settings such as GENERATE_TREEVIEW!\n\nHTML_HEADER            =\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            =\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If the tag is left blank doxygen\n# will generate a default style sheet. Note that doxygen will try to copy\n# the style sheet file to the HTML output directory, so don't put your own\n# style sheet in the HTML output directory as well, or it will be erased!\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that\n# the files will be copied as-is; there are no commands or markers available.\n\nHTML_EXTRA_FILES       =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n# Doxygen will adjust the colors in the style sheet and background images\n# according to this color. Hue is specified as an angle on a colorwheel,\n# see https://en.wikipedia.org/wiki/Hue for more information.\n# For instance the value 0 represents red, 60 is yellow, 120 is green,\n# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n# The allowed range is 0 to 359.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n# the colors in the HTML output. For a value of 0 the output will use\n# grayscales only. A value of 255 will produce the most vivid colors.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n# the luminance component of the colors in the HTML output. Values below\n# 100 gradually make the output lighter, whereas values above 100 make\n# the output darker. The value divided by 100 is the actual gamma applied,\n# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n# and 100 does not change the gamma.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting\n# this to NO can help when comparing the output of multiple runs.\n\nHTML_TIMESTAMP         = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of\n# entries shown in the various tree structured indices initially; the user\n# can expand and collapse entries dynamically later on. Doxygen will expand\n# the tree to such a level that at most the specified number of entries are\n# visible (unless a fully collapsed tree already exceeds this amount).\n# So setting the number of entries 1 will produce a full collapsed tree by\n# default. 0 is a special value representing an infinite number of entries\n# and will result in a full expanded tree by default.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files\n# will be generated that can be used as input for Apple's Xcode 3\n# integrated development environment, introduced with OSX 10.5 (Leopard).\n# To create a documentation set, doxygen will generate a Makefile in the\n# HTML output directory. Running make will produce the docset in that\n# directory and running \"make install\" will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n# it at startup.\n# See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n\nGENERATE_DOCSET        = NO\n\n# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n# feed. A documentation feed provides an umbrella under which multiple\n# documentation sets from a single provider (such as a company or product suite)\n# can be grouped.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n# should uniquely identify the documentation set bundle. This should be a\n# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n# will append .docset to the name.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n# be used to specify the file name of the resulting .chm file. You\n# can add a path in front of the file if the result should not be\n# written to the html output directory.\n\nCHM_FILE               =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n# be used to specify the location (absolute path including file name) of\n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n# is used to encode HtmlHelp index (hhk), content (hhc) and project file\n# content.\n\nCHM_INDEX_ENCODING     =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members\n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n# that can be used as input for Qt's qhelpgenerator to generate a\n# Qt Compressed Help (.qch) of the generated HTML documentation.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n# be used to specify the file name of the resulting .qch file.\n# The path specified is relative to the HTML output folder.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# https://doc.qt.io/qt-5/qthelpproject.html#namespace\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# https://doc.qt.io/qt-5/qthelpproject.html#virtual-folders\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n# add. For more information please see\n# https://doc.qt.io/qt-5/qthelpproject.html#custom-filters\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see\n# <a href=\"https://doc.qt.io/qt-5/qthelpproject.html#custom-filters\">\n# Qt Help Project / Custom Filters</a>.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's\n# filter section matches.\n# <a href=\"https://doc.qt.io/qt-5/qthelpproject.html#filter-attributes\">\n# Qt Help Project / Filter Attributes</a>.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n# be used to specify the location of Qt's qhelpgenerator.\n# If non-empty doxygen will try to run qhelpgenerator on the generated\n# .qhp file.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n# will be generated, which together with the HTML files, form an Eclipse help\n# plugin. To install this plugin and make it available under the help contents\n# menu in Eclipse, the contents of the directory containing the HTML and XML\n# files needs to be copied into the plugins directory of eclipse. The name of\n# the directory within the plugins directory should be the same as\n# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n# the help appears.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have\n# this name.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)\n# at top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it. Since the tabs have the same information as the\n# navigation tree you can set this option to NO if you already set\n# GENERATE_TREEVIEW to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information.\n# If the tag value is set to YES, a side panel will be generated\n# containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n# Windows users are probably better off using the HTML help feature.\n# Since the tree basically has the same information as the tab index you\n# could consider to set DISABLE_INDEX to NO when enabling this option.\n\nGENERATE_TREEVIEW      = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n# (range [0,1..20]) that doxygen will group on one line in the generated HTML\n# documentation. Note that a value of 0 will completely suppress the enum\n# values from appearing in the overview section.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n# links to external symbols imported via tag files in a separate window.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of Latex formulas included\n# as images in the HTML documentation. The default is 10. Note that\n# when you change the font size after a successful doxygen run you need\n# to manually remove any form_*.png images from the HTML output directory\n# to force them to be regenerated.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are\n# not supported properly for IE 6.0, but are supported on all modern browsers.\n# Note that when changing this option you need to delete any form_*.png files\n# in the HTML output before the changes have effect.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n# (see https://www.mathjax.org) which uses client side Javascript for the\n# rendering instead of using prerendered bitmaps. Use this if you do not\n# have LaTeX installed or if you want to formulas look prettier in the HTML\n# output. When enabled you may also need to install MathJax separately and\n# configure the path to it using the MATHJAX_RELPATH option.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you need to specify the location relative to the\n# HTML output directory using the MATHJAX_RELPATH option. The destination\n# directory should contain the MathJax.js script. For instance, if the mathjax\n# directory is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to\n# the MathJax Content Delivery Network so you can quickly see the result without\n# installing MathJax.  However, it is strongly recommended to install a local\n# copy of MathJax from https://www.mathjax.org before deployment.\n\nMATHJAX_RELPATH        = https://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\n# names that should be enabled during MathJax rendering.\n\nMATHJAX_EXTENSIONS     =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box\n# for the HTML output. The underlying search engine uses javascript\n# and DHTML and should work on any modern browser. Note that when using\n# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n# (GENERATE_DOCSET) there is already a search function so this one should\n# typically be disabled. For large projects the javascript based search engine\n# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\n\nSEARCHENGINE           = NO\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a PHP enabled web server instead of at the web client\n# using Javascript. Doxygen will generate the search PHP script and index\n# file to put on the web server. The advantage of the server\n# based approach is that it scales better to large projects and allows\n# full text search. The disadvantages are that it is more difficult to setup\n# and does not have live searching capabilities.\n\nSERVER_BASED_SEARCH    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked. If left blank `latex' will be used as the default command name.\n# Note that when enabling USE_PDFLATEX this option is only used for\n# generating bitmaps for formulas in the HTML output, but not in the\n# Makefile that is written to the output directory.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n# generate index for LaTeX. If left blank `makeindex' will be used as the\n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, letter, legal and\n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n# the generated latex document. The footer should contain everything after\n# the last chapter. If it is left blank doxygen will generate a\n# standard footer. Notice: only use this tag if you know what you are doing!\n\nLATEX_FOOTER           =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not\n# include the index chapters (such as File Index, Compound Index, etc.)\n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n# If LATEX_SOURCE_CODE is set to YES then doxygen will include\n# source code with syntax highlighting in the LaTeX output.\n# Note that which sources are shown also depends on other settings\n# such as SOURCE_BROWSER.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. The default style is \"plain\". See\n# https://en.wikipedia.org/wiki/BibTeX for more info.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimized for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using WORD or other\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load style sheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n# then it will generate one additional man file for each entity\n# documented in the real man page(s). These additional files\n# only source the real man page, but without them the man command\n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will\n# generate an XML file that captures the structure of\n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\nXML_SCHEMA             =\n\n# The XML_DTD tag can be used to specify an XML DTD,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\nXML_DTD                =\n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n# dump the program listings (including syntax highlighting\n# and cross-referencing information) to the XML output. Note that\n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n# generate an AutoGen Definitions (see autogen.sf.net) file\n# that captures the structure of the code including all\n# documentation. Note that this feature is still experimental\n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will\n# generate a Perl module file that captures the structure of\n# the code including all documentation. Note that this\n# feature is still experimental and incomplete at the\n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n# the necessary Makefile rules, Perl scripts and LaTeX code to be able\n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n# nicely formatted so it can be parsed by a human reader.  This is useful\n# if you want to understand what is going on.  On the other hand, if this\n# tag is set to NO the size of the Perl module output will be much smaller\n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file\n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n# This is useful so different doxyrules.make files included by the same\n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# pointed to by INCLUDE_PATH will be searched when a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed. To prevent a macro definition from being\n# undefined via #undef or recursively expanded use the := operator\n# instead of the = operator.\n\nPREDEFINED             =\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition that\n# overrules the definition found in the source code.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n# doxygen's preprocessor will remove all references to function-like macros\n# that are alone on a line, have an all uppercase name, and do not end with a\n# semicolon, because these will confuse the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. For each\n# tag file the location of the external documentation should be added. The\n# format of a tag file without this location is as follows:\n#   TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n#   TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where \"loc1\" and \"loc2\" can be relative or absolute paths\n# or URLs. Note that each tag file must have a unique name (where the name does\n# NOT include the path). If a tag file is not located in the directory in which\n# doxygen is run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will\n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n# or super classes. Setting the tag to NO turns the diagrams off. Note that\n# this option also works with HAVE_DOT disabled, but it is recommended to\n# install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see\n# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# If set to YES, the inheritance and collaboration graphs will hide\n# inheritance and usage relations if the target is undocumented\n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = YES\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n# allowed to run in parallel. When set to 0 (the default) doxygen will\n# base this on the number of processors available in the system. You can set it\n# explicitly to a value larger than 0 to get control over the balance\n# between CPU load and processing speed.\n\nDOT_NUM_THREADS        = 12\n\n# By default doxygen will use the Helvetica font for all dot files that\n# doxygen generates. When you want a differently looking font you can specify\n# the font name using DOT_FONTNAME. You need to make sure dot is able to find\n# the font, which can be done by putting it in a standard location or by setting\n# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n# directory containing the font.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n# The default size is 10pt.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the Helvetica font.\n# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\n# set the path where dot can find it.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside\n# the class node. If there are many fields or methods and many nodes the\n# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n# threshold limits the number of items for each type to make the size more\n# managable. Set this to 0 for no limit. Note that the threshold may be\n# exceeded by 50% before the limit is enforced.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If set to YES, the inheritance and collaboration graphs will show the\n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n# tags are set to YES then doxygen will generate a graph for each documented\n# file showing the direct and indirect include dependencies of the file with\n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n# documented header file showing the documented files that directly or\n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH and HAVE_DOT options are set to YES then\n# doxygen will generate a call dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable call graphs\n# for selected functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n# doxygen will generate a caller dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable caller\n# graphs for selected functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will generate a graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES\n# then doxygen will show the dependencies a directory has on other directories\n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. Possible values are svg, png, jpg, or gif.\n# If left blank png will be used. If you choose svg you need to set\n# HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible in IE 9+ (other browsers do not have this requirement).\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n# Note that this requires a modern browser other than Internet Explorer.\n# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\n# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible. Older versions of IE do not have SVG support.\n\nINTERACTIVE_SVG        = NO\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the\n# \\dotfile command).\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the\n# \\mscfile command).\n\nMSCFILE_DIRS           =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n# nodes that will be shown in the graph. If the number of nodes in a graph\n# becomes larger than this value, doxygen will truncate the graph, which is\n# visualized by representing a node as a red box. Note that doxygen if the\n# number of direct children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 500\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n# graphs generated by dot. A depth value of 3 means that only nodes reachable\n# from the root by following a path via at most 3 edges will be shown. Nodes\n# that lay further from the root node will be omitted. Note that setting this\n# option to 1 or 2 may greatly reduce the computation time needed for large\n# code bases. Also note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not\n# seem to support this out of the box. Warning: Depending on the platform used,\n# enabling this option may lead to badly anti-aliased labels on the edges of\n# a graph (i.e. they become hard to read).\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10)\n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = YES\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermediate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "GETTING-STARTED.md",
    "content": "Getting Started\n===============\n\nHello! Thanks for wanting to work on this project :smile:, and I hope that this file will help you somewhat in getting all set up and running. I'll go through the basics of getting the project environment set up, the code organization and style, and general development practices. I'll also show you some good issues to start off working on to get yourself familiarised with the code.\n\nNote that this document is about contributing code for Cuberite.\n\n - If you are looking for usage instructions, see the [User's Manual][1] instead.\n - If you would like to help but you are not a programmer, you can still help with testing! Please see the [TESTING.md][2] file.\n\nMinecraft Basics\n----------------\n\nIf you don't play Minecraft or don't have a great knowledge of the basic systems, you should get to know them. The [Minecraft Wiki][3] is quite useful for this task, although some youtubers are also fairly good at teaching the basics and just playing is quite good too. It is possible to contribute without knowing minecraft in detail though, or even owning a license.\n\nI'd say that the important topics are:\n\n - Different types of blocks and how they act.\n - Mobs, what they do and how.\n - Redstone, pistons, and automation.\n - Farming.\n - Fighting, health and the hunger system.\n\nUseful Resources\n----------------\n\n - [Minecraft Wiki](https://minecraft.wiki/w/Minecraft_Wiki)\n - [Minecraft Protocol Wiki](http://wiki.vg/Main_Page)\n - [Lua API Documentation](https://api.cuberite.org/)\n - [Visual Studio Community Edition Download](https://www.visualstudio.com/downloads/)\n\nSetting up a Dev Environment\n============================\n\nRequirements\n------------\n\n### Linux/BSD/Solaris/macOS\n\nYou'll need the basic C++ build tools:\n\n - gcc (or clang or another C compiler)\n - g++ (or clang++ or another C++ compiler)\n - make\n\nYou'll also need CMake to generate the makefile to build from.\n\n### Windows\n\nIf you use Windows, your best bet is the Microsoft Visual Studio, available as a free download in the Community edition from Microsoft. You'll also need CMake to generate the project files.\n\nSetting up the Repo\n-------------------\n\nNext, you'll need to set up the repo. You should make a fork and work on that, then create a Pull Request so that we can review and merge your code. After you've \"earned\" an honorable status, we'll give you write access to the repository, so that you can work on branches in the main repo here (still use PRs though, they're great tools for review and discussion).\n\nOnce you've cloned, you need to pull down the submodules:\n\n    git submodule init\n    git submodule update\n\nAfter that they should come down automatically when you pull but it's not bad to refresh every once in a while.\n\nRepo Arrangement\n----------------\n\nThe Cuberite repo has recently been rearranged for better code separation and other things, but basically it's split into a few areas:\n\n - `src`  \n   This holds all of the Cuberite source code, and is where most development takes place.  \n   It's split into logical areas for blocks, the protocol handling and other things.\n - `lib`  \n   This holds all the 3rd party libraries for Cuberite. You basically don't need to touch these, just make sure they are present (git submodules)\n - `Server`  \n   This contains the default plugins and environment to actually run the server. This folder's contents are linked into the executable output folder for each build flavor. In the `Plugins` folder there are the default plugins. The config files are also stored here. Config files with `.example.ini` on the end are generated by the server or source control and should be left alone, instead you should copy them to a file without the `example` in the name which will be prioritised over the generated ones.\n\nCode Style\n----------\n\nYou should follow the code style guidelines in [CONTRIBUTING.md][4], as well as other C++ best practices.\n\nNote that there is a script file, $/src/CheckBasicStyle.lua, that can check some common violations of the coding style. You should run this file to check your code regularly. This script is run during the integration builds and if it fails, the build will fail. Note that you need Lua installed in order to run this script. It is recommended to set this up as a pre-commit hook and doing so is covered in CONTRIBUTING.md.\n\nHow to Build\n------------\n\n### Linux/BSD/Solaris/macOS\n\nFollow the instructions in [COMPILING.md][5]. You probably want to build in debug mode (when you're developing) for console alerts and debugging capability, even though it's much slower for everyday use.\n\nBasically, the process is:\n\n    cmake . -DCMAKE_BUILD_TYPE=DEBUG && make\n\n### Windows\n\nYou need to first generate a solution file by executing CMake. At the top-level folder of the repository:\n```\nmkdir VS2017-x64\ncd VS2017-x64\ncmake -DBUILD_TOOLS=1 -DSELF_TEST=1 ..\n```\nThen just open the solution file in MSVC and build. Note that the first time after generating the solution, you will need to do extra setup in order to be able to fully debug in MSVC:\n\n - Set the startup project to Cuberite: right-click the Cuberite project in the Solution Explorer and choose \"Set as Startup Project\".\n - Set the debugging folder: right-click the Cuberite project in the Solution Explorer, choose \"Properties\". In the dialog, browse to \"Configuration Properties\" -> \"Debugging\" and set \"Working Directory\" to \"../Server\".\n\nHow to Run\n----------\n\nThe server can be run (on *nix) by a simple `./Cuberite` in the `Server` directory. On first run it will generate the world and start a server on the default port (configurable in `settings.ini`) so you can connect in Minecraft via `localhost`.\n\nWhere to Get Started\n--------------------\n\nIssues that should be easy to get started with are tagged as [easy][6] in GitHub issues.\n\nOther good places to get started are:\n\n - Cleaning up some of the compiler warnings. Check [our CI][7] for a list of them.\n - Writing some plugins: They are written in lua, with excellent API documentation available via [APIDump][8]. The [Core plugin][9] should also help quite a bit here.\n\nSpecial Things\n--------------\n - Make yourself familiar with the community. Visit the forums: https://forum.cuberite.org/\n - Ask questions as much as you like, we're here to help :smiley:\n\n[1]: https://book.cuberite.org/\n[2]: https://github.com/cuberite/cuberite/blob/master/TESTING.md\n[3]: https://minecraft.wiki/w/Minecraft_Wiki\n[4]: https://github.com/cuberite/cuberite/blob/master/CONTRIBUTING.md\n[5]: https://github.com/cuberite/cuberite/blob/master/COMPILING.md\n[6]: https://github.com/cuberite/cuberite/issues?q=is%3Aopen+is%3Aissue+label%3Aeffort%2Feasy\n[7]: https://builds.cuberite.org/job/cuberite/job/master/lastSuccessfulBuild/console\n[8]: https://api.cuberite.org/\n[9]: https://github.com/cuberite/Core\n"
  },
  {
    "path": "Jenkinsfile",
    "content": "pipeline {\n    options {\n      timeout(time: 1, unit: 'HOURS') \n    }\n    agent {\n        docker 'cuberite/docker-ci/minimal:latest'\n    }\n    stages {\n        stage(\"Prepare\") {\n            steps {\n                sh 'git submodule update --init'\n            }\n        }\n        stage(\"Check\") {\n            parallel {\n                stage(\"CheckBasicStyle\") {\n                    steps {\n                        dir(\"src\") {\n                            sh 'find . -name \\\\*.cpp -or -name \\\\*.h > AllFiles.lst'\n                            sh 'lua CheckBasicStyle.lua'\n                            sh 'cd Bindings && lua CheckBindingsDependencies.lua'\n                        }\n                    }\n                }\n                stage(\"clang-tidy\") {\n                    steps {\n                        sh './clang-tidy.sh -j 4'\n                    }\n                }\n            }\n        }\n        stage(\"Build\") {\n            parallel {\n                stage(\"gcc\") {\n                    environment {\n                        CI_CUBERITE_BUILD_TYPE = 'Release'\n                        CI_JOB_NUMBER = \"{$env.BUILD_ID}\"\n                        CC = \"gcc\"\n                        CXX = \"g++\"\n                    }\n                    steps {\n                        sh 'bash ./cibuild.sh'\n                    }\n                }\n                stage(\"clang\") {\n                    environment {\n                        CI_CUBERITE_BUILD_TYPE = 'Debug'\n                        CI_JOB_NUMBER = \"{$env.BUILD_ID}\"\n                        CC = \"clang\"\n                        CXX = \"clang++\"\n                    }\n                    steps {\n                        sh 'bash ./cibuild.sh'\n                    }\n                }\n            }\n        }\n\t\tstage(\"Artifacts\") {\n\t\t\twhen {\n\t\t\t\tbranch 'master'\n\t\t\t}\n            steps {\n                archiveArtifacts artifacts: 'gcc_Release/Server/.luacheckrc'\n            }\n        }\n    }\n    post {\n        always {\n            cleanWs()\n        }\n    }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "Cuberite: A lightweight, fast and extensible game server for Minecraft\nwww:      https://cuberite.org\n\nCopyright 2011-2025 Cuberite Contributors\n\nA full list of known copyright holders can be found in the CONTRIBUTORS file\nto be distributed with all copies of this software.\n\n------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# Cuberite\n\n[![Jenkins Build Status](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fbuilds.cuberite.org%2Fjob%2Fcuberite%2Fjob%2Fmaster&label=Jenkins)](https://builds.cuberite.org/job/cuberite/job/master/)\n[![AppVeyor Build Status](https://img.shields.io/appveyor/ci/cuberite/cuberite/master.svg?label=AppVeyor)](https://ci.appveyor.com/project/cuberite/cuberite)\n\nCuberite is a Minecraft-compatible multiplayer game server that is written in C++ and designed to be efficient with memory and CPU, as well as having a flexible Lua Plugin API. Cuberite is compatible with the Java Edition Minecraft client.\n\nCuberite runs on Windows, *nix and Android operating systems. This includes Android phones and tablets as well as Raspberry Pis; support for small embedded devices is experimental.\n\nCurrently we support Release 1.8 - 1.12.2 Minecraft protocol versions.\n\nSubscribe to [the newsletter][1] for important updates and project news.\n\n## Installation\n\nThere are several ways to obtain Cuberite.\n\n### Binaries\n\n- The easiest method is downloading for Windows or Linux from the [website][2].\n- You can use the EasyInstall script for Linux and macOS, which automatically downloads the correct binary. The script is described below.\n\n#### The EasyInstall script\n\nThis script will download the correct binary from the project site.\n\n    curl -sSfL https://download.cuberite.org | sh\n\n### Compiling\n\n- You can compile automatically for Linux, macOS and FreeBSD with the `compile.sh` script. The script is described below.\n- You can also compile manually. See [COMPILING.md][4].\n\nCompiling may provide better performance (1.5-3x as fast) and it supports more operating systems.\n\n#### The compile.sh script\n\nThis script downloads the source code and compiles it. The script is smart enough to notify you of missing dependencies and instructing you on how to install them. The script doesn't work for Windows.\n\nUsing curl:\n\n    sh -c \"$(curl -sSfL -o - https://compile.cuberite.org)\"\n\nOr using wget:\n\n    sh -c \"$(wget -O - https://compile.cuberite.org)\"\n\n### Hosted services\n\n- Hosted Cuberite is available via [Gamocosm][5].\n\n## Contributing\n\nCuberite is licensed under the Apache License V2, and we welcome anybody to fork and submit a Pull Request back with their changes, and if you want to join as a permanent member we can add you to the team.\n\nCuberite is developed in C++ and Lua. To contribute code, please check out [GETTING-STARTED.md][6] and [CONTRIBUTING.md][7] for more details.\n\nPlugins are written in Lua. You can contribute by developing plugins and submitting them to the [plugin repository][8] or the [forum][9]. Please check out our [plugin introduction guide][10] for more info.\n\nIf you are not a programmer, you can help by testing Cuberite and reporting bugs. See [TESTING.md][11] for details.\n\nYou can also help with documentation by contributing to the [User's Manual][12].\n\n## Other Stuff\n\nFor other stuff, check out the [homepage][13], the [Users' Manual][14], the [forums][15], and the [Plugin API][16].\n\nSupport the Cuberite development team on [Liberapay][17]\n\n[1]: https://cuberite.org/news/#subscribe\n[2]: https://cuberite.org/\n[4]: https://github.com/cuberite/cuberite/blob/master/COMPILING.md\n[5]: https://gamocosm.com/\n[6]: https://github.com/cuberite/cuberite/blob/master/GETTING-STARTED.md\n[7]: https://github.com/cuberite/cuberite/blob/master/CONTRIBUTING.md\n[8]: https://plugins.cuberite.org/\n[9]: https://forum.cuberite.org/forum-2.html\n[10]: https://api.cuberite.org/Writing-a-Cuberite-plugin.html\n[11]: https://github.com/cuberite/cuberite/blob/master/TESTING.md\n[12]: https://github.com/cuberite/users-manual\n[13]: https://cuberite.org/\n[14]: https://book.cuberite.org/\n[15]: https://forum.cuberite.org/\n[16]: https://api.cuberite.org/\n[17]: https://liberapay.com/Cuberite\n"
  },
  {
    "path": "Server/.gitignore",
    "content": "*.exe\n*.dll\n*.exp\n*.lib\n*.ini\nCuberite\nCuberite_debug\nluaexe\nCommLogs/\nGalExports/\nGalExportWeb/\nGalleryWeb/\nlogs\nplayers\nworld*\nAPI/\nAPI.txt\nAPI_wiki.txt\n*.dat\nschematics\n*.schematic\n*.ilk\n*.pdb\nmemdump*\n*.grab\n*.cfg\n*.sqlite\nhelgrind.log\nvalgrind.log\nmotd.txt\n*.deuser\n*.dmp\n*.xml\nmcserver_api.lua\ncuberite_api.lua\nDuplicateDocs.txt\n\n# Ignore the webadmin certs / privkey, so that no-one commits theirs by accident:\nwebadmin/httpscert.crt\nwebadmin/httpskey.pem\n"
  },
  {
    "path": "Server/Install/.gitignore",
    "content": "*.tag\n*.example.ini"
  },
  {
    "path": "Server/Install/Cuberite_high_detail_debug.cmd",
    "content": "Cuberite --crash-dump-full\n"
  },
  {
    "path": "Server/Install/Cuberite_medium_detail_debug.cmd",
    "content": "Cuberite --crash-dump-globals\n"
  },
  {
    "path": "Server/Install/PackWindowsExecutables.cmd",
    "content": "@echo off\n:: This script is run in the Appveyor CI builds to pack up the artifacts\n:: It is expected to be run with the Server folder as the current working dir\n@echo on\n\n:: Only test that the server runs for pull requests\n:: Don't upload any artifacts until it's merged into master\nif defined APPVEYOR_PULL_REQUEST_NUMBER (\n\techo stop  1>>cmds.txt\n\tCuberite --port 32767  0<cmds.txt\n\texit /b\n)\n\n:: Main executables\necho Cuberite %APPVEYOR_JOB_NAME%-#%APPVEYOR_BUILD_NUMBER%  1>buildinfo.txt\n7z a -tzip -y Cuberite.zip -scsWIN -i@Install\\WindowsExecutables.list -xr!*.git*\n7z a -tzip -y PDBs.zip -scsWIN -i@Install/WindowsPDBs.list -xr!*.git*\n\n:: Generate API documentation\ngit clone https://github.com/madmaxoft/ManualApiDump Plugins/ManualApiDump\necho load ManualApiDump  1>cmds.txt\necho manualapi  1>>cmds.txt\necho load APIDump  1>>cmds.txt\necho api  1>>cmds.txt\necho stop  1>>cmds.txt\nCuberite --port 32767  0<cmds.txt\n\n:: API documentation\n7z a -tzip -y ManualAPI.zip -scsWIN \"ManualAPI.lua\"\n7z a -tzip -y AutoAPI.zip -scsWIN \".\\BindingsDocs\\*.lua\" -x!_raw.lua\n\n:: Upload artifacts\nappveyor PushArtifact Cuberite.zip\nappveyor PushArtifact PDBs.zip\nappveyor PushArtifact AutoAPI.zip\nappveyor PushArtifact ManualAPI.zip\nappveyor PushArtifact .luacheckrc\n"
  },
  {
    "path": "Server/Install/ThirdPartyLicenses/LibEvent-LICENSE.txt",
    "content": "Libevent is available for use under the following license, commonly known\nas the 3-clause (or \"modified\") BSD license:\n\n==============================\nCopyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>\nCopyright (c) 2007-2012 Niels Provos and Nick Mathewson\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n3. The name of the author may not be used to endorse or promote products\n   derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n==============================\n\nPortions of Libevent are based on works by others, also made available by\nthem under the three-clause BSD license above.  The copyright notices are\navailable in the corresponding source files; the license is as above.  Here's\na list:\n\nlog.c:\n   Copyright (c) 2000 Dug Song <dugsong@monkey.org>\n   Copyright (c) 1993 The Regents of the University of California.\n\nstrlcpy.c:\n   Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>\n\nwin32select.c:\n   Copyright (c) 2003 Michael A. Davis <mike@datanerds.net>\n\nevport.c:\n   Copyright (c) 2007 Sun Microsystems\n\nht-internal.h:\n   Copyright (c) 2002 Christopher Clark\n\nminheap-internal.h:\n   Copyright (c) 2006 Maxim Yegorushkin <maxim.yegorushkin@gmail.com>\n\n==============================\n\nThe arc4module is available under the following, sometimes called the\n\"OpenBSD\" license:\n\n   Copyright (c) 1996, David Mazieres <dm@uun.org>\n   Copyright (c) 2008, Damien Miller <djm@openbsd.org>\n\n   Permission to use, copy, modify, and distribute this software for any\n   purpose with or without fee is hereby granted, provided that the above\n   copyright notice and this permission notice appear in all copies.\n\n   THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n==============================\n\nThe Windows timer code is based on code from libutp, which is\ndistributed under this license, sometimes called the \"MIT\" license.\n\n\nCopyright (c) 2010 BitTorrent, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Server/Install/ThirdPartyLicenses/Lua-LICENSE.txt",
    "content": "Copyright (C) 1994-2008 Lua.org, PUC-Rio.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\nANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT\nSHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR\nANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\nOR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Server/Install/ThirdPartyLicenses/LuaExpat-license.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n   \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html>\n<head>\n\t<title>LuaExpat: XML Expat parsing for the Lua programming language</title>\n    <link rel=\"stylesheet\" href=\"http://www.keplerproject.org/doc.css\" type=\"text/css\"/>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n</head>\n<body>\n\n<div id=\"container\">\n\t\n<div id=\"product\">\n\t<div id=\"product_logo\"><a href=\"http://www.keplerproject.org\">\n        <img alt=\"LuaExpat logo\" src=\"luaexpat.png\"/>\n\t</a></div>\n\t<div id=\"product_name\"><big><strong>LuaExpat</strong></big></div>\n\t<div id=\"product_description\">XML Expat parsing for the Lua programming language</div>\n</div> <!-- id=\"product\" -->\n\n<div id=\"main\">\n\n<div id=\"navigation\">\n<h1>LuaExpat</h1>\n\t<ul>\n\t\t<li><a href=\"index.html\">Home</a>\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"index.html#overview\">Overview</a></li>\n\t\t\t\t<li><a href=\"index.html#status\">Status</a></li>\n\t\t\t\t<li><a href=\"index.html#download\">Download</a></li>\n\t\t\t\t<li><a href=\"index.html#history\">History</a></li>\n\t\t\t\t<li><a href=\"index.html#references\">References</a></li>\n\t\t\t\t<li><a href=\"index.html#credits\">Credits</a></li>\n\t\t\t\t<li><a href=\"index.html#contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li><a href=\"manual.html\">Manual</a>\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"manual.html#introduction\">Introduction</a></li>\n\t\t\t\t<li><a href=\"manual.html#installation\">Installation</a></li>\n\t\t\t\t<li><a href=\"manual.html#parser\">Parser Objects</a></li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li><a href=\"examples.html\">Examples</a></li>\n\t\t<li><a href=\"lom.html\">Lua Object Model</a></li>\n        <li><a href=\"http://luaforge.net/projects/luaexpat/\">Project</a>\n            <ul>\n                <li><a href=\"http://luaforge.net/tracker/?group_id=13\">Bug Tracker</a></li>\n                <li><a href=\"http://luaforge.net/scm/?group_id=13\">CVS</a></li>\n            </ul>\n        </li>\n\t\t<li><strong>License</strong></li>\n\t</ul>\n</div> <!-- id=\"navigation\" -->\n\n<div id=\"content\">\n\n<h2>License</h2>\n\n<p>\nLuaExpat is free software: it can be used for both academic and\ncommercial purposes at absolutely no cost. There are no royalties\nor GNU-like \"copyleft\" restrictions. LuaExpat qualifies as <a href=\n\"http://www.opensource.org/docs/definition.html\">Open Source</a>\nsoftware. Its licenses are compatible with <a href=\n\"http://www.gnu.org/licenses/gpl.html\">GPL</a>. LuaExpat is not in\nthe public domain and the\n<a href=\"http://www.keplerproject.org\">Kepler Project</a>\nkeep its copyright. The legal details are below.\n</p>\n\n<p>The spirit of the license is that you are free to use LuaExpat\nfor any purpose at no cost without having to ask us. The only\nrequirement is that if you do use LuaExpat, then you should give us\ncredit by including the appropriate copyright notice somewhere in\nyour product or its documentation.</p>\n\n<p>The LuaExpat library is designed and implemented by Roberto\nIerusalimschy. The implementation is not derived from licensed\nsoftware.</p>\n\n<hr/>\n<p>Copyright &copy; 2003-2007 The Kepler Project. \n</p>\n\n<p>Permission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use, copy,\nmodify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:</p>\n\n<p>The above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.</p>\n\n<p>THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\nBE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.</p>\n\n</div> <!-- id=\"content\" -->\n\n</div> <!-- id=\"main\" -->\n\n<div id=\"about\">\n\t<p><a href=\"http://validator.w3.org/check?uri=referer\"><img src=\"http://www.w3.org/Icons/valid-xhtml10\" alt=\"Valid XHTML 1.0!\" height=\"31\" width=\"88\" /></a></p>\n\t<p><small>\n\t$Id: license.html,v 1.9 2007/06/05 20:03:12 carregal Exp $\n\t</small></p>\n</div> <!-- id=\"about\" -->\n\n</div> <!-- id=\"container\" -->\n\n</body>\n</html> \n"
  },
  {
    "path": "Server/Install/ThirdPartyLicenses/LuaSQLite3-LICENSE.txt",
    "content": "/************************************************************************\n* lsqlite3                                                              *\n* Copyright (C) 2002-2013 Tiago Dionizio, Doug Currie                   *\n* All rights reserved.                                                  *\n* Author    : Tiago Dionizio <tiago.dionizio@ist.utl.pt>                *\n* Author    : Doug Currie <doug.currie@alum.mit.edu>                    *\n* Library   : lsqlite3 - a SQLite 3 database binding for Lua 5          *\n*                                                                       *\n* Permission is hereby granted, free of charge, to any person obtaining *\n* a copy of this software and associated documentation files (the       *\n* \"Software\"), to deal in the Software without restriction, including   *\n* without limitation the rights to use, copy, modify, merge, publish,   *\n* distribute, sublicense, and/or sell copies of the Software, and to    *\n* permit persons to whom the Software is furnished to do so, subject to *\n* the following conditions:                                             *\n*                                                                       *\n* The above copyright notice and this permission notice shall be        *\n* included in all copies or substantial portions of the Software.       *\n*                                                                       *\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,       *\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*\n* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  *\n* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  *\n* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     *\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                *\n************************************************************************/\n"
  },
  {
    "path": "Server/Install/ThirdPartyLicenses/MersenneTwister-LICENSE.txt",
    "content": "// The Mersenne Twister is an algorithm for generating random numbers.  It\n// was designed with consideration of the flaws in various other generators.\n// The period, 2^19937-1, and the order of equidistribution, 623 dimensions,\n// are far greater.  The generator is also fast; it avoids multiplication and\n// division, and it benefits from caches and pipelines.  For more information\n// see the inventors' web page at\n// http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html\n\n// Reference\n// M. Matsumoto and T. Nishimura, \"Mersenne Twister: A 623-Dimensionally\n// Equidistributed Uniform Pseudo-Random Number Generator\", ACM Transactions on\n// Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.\n\n// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,\n// Copyright (C) 2000 - 2009, Richard J. Wagner\n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n// \n//   1. Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//\n//   3. The names of its contributors may not be used to endorse or promote \n//      products derived from this software without specific prior written \n//      permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n// ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "Server/Install/ThirdPartyLicenses/SQLiteCpp-LICENSE.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2012-2014 Sebastien Rombauts (sebastien.rombauts@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "Server/Install/ThirdPartyLicenses/fmt-LICENSE.rst",
    "content": "Copyright (c) 2012 - 2016, Victor Zverovich\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Server/Install/UnixExecutables.list",
    "content": "Cuberite\nPlugins\nPrefabs\nProtocol\nwebadmin\nBACKERS\nbrewing.txt\ncrafting.txt\nfurnace.txt\nitems.ini\nmonsters.ini\nbuildinfo.txt\nREADME.txt\nfavicon.png\nCONTRIBUTORS\nLICENSE\nThirdPartyLicenses\n"
  },
  {
    "path": "Server/Install/WindowsExecutables.list",
    "content": "Cuberite.exe\n*.dll\nPlugins\nPrefabs\nProtocol\nwebadmin\nBACKERS\nbrewing.txt\ncrafting.txt\nfurnace.txt\nitems.ini\nmonsters.ini\nbuildinfo.txt\nREADME.txt\nfavicon.png\nCONTRIBUTORS\nLICENSE\nCuberite*debug.cmd\n*.example.ini\nThirdPartyLicenses\n"
  },
  {
    "path": "Server/Install/WindowsPDBs.list",
    "content": "*.pdb\nbuildinfo.txt\n"
  },
  {
    "path": "Server/Plugins/.gitignore",
    "content": "/*\n!/APIDump\n!/Debuggers\n!/DumpInfo\n!/HookNotify\n!/NetworkTest\n!/TestLuaRocks\n"
  },
  {
    "path": "Server/Plugins/APIDump/APIDesc.lua",
    "content": "return\n{\n\tClasses =\n\t{\n\t\t--[[\n\t\t-- What the APIDump plugin understands / how to document stuff:\n\t\tExampleClassName =\n\t\t{\n\t\t\tDesc = \"Description, exported as the first paragraph of the class page. Usually enclosed within double brackets.\"\n\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tFunctionName =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{ Name = \"BuiltInType\", Type = \"number\"},\n\t\t\t\t\t\t\t{ Name = \"ClassEnum\", Type = \"cClass#eEnum\"},\n\t\t\t\t\t\t\t{ Name = \"GlobalEnum\", Type = \"eEnum\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{ Type = \"number\" },\n\t\t\t\t\t\t\t{ Type = \"self\" },  -- Returns the same object on which it was called\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Notes 1\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams = {...},\n\t\t\t\t\t\tReturns = {...},\n\t\t\t\t\t\tNotes = \"Notes 2\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t} ,\n\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tConstantName = { Notes = \"Notes about the constant\" },\n\t\t\t} ,\n\n\t\t\tConstantGroups =\n\t\t\t{\n\t\t\t\teEnum =  -- also used as the HTML anchor name\n\t\t\t\t{\n\t\t\t\t\tInclude = {\"constant1\", \"constant2\", \"const_.*\"},  -- Constants to include in this group, array of identifiers, accepts wildcards\n\t\t\t\t\tTextBefore = \"This text will be written in front of the constant list\",\n\t\t\t\t\tTextAfter = \"This text will be written after the constant list\",\n\t\t\t\t\tShowInDescendants = false,  -- If false, descendant classes won't list these constants\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tVariables =\n\t\t\t{\n\t\t\t\tVariableName = { Type = \"string\", Notes = \"Notes about the variable\" },\n\t\t\t} ,\n\n\t\t\tAdditionalInfo =  -- Paragraphs to be exported after the function definitions table\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Header 1\",\n\t\t\t\t\tContents = \"Contents of the additional section 1\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Header 2\",\n\t\t\t\t\tContents = \"Contents of the additional section 2\",\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tInherits = \"ParentClassName\",  -- Only present if the class inherits from another API class\n\t\t},\n\t\t--]]\n\n\t\tcBlockInfo =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class is used to query block properties.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tCanBeTerraformed =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the block is suitable to be changed by a generator\",\n\t\t\t\t},\n\t\t\t\tFullyOccupiesVoxel =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether the specified block fully occupies its voxel.\",\n\t\t\t\t},\n\t\t\t\tGetHardness =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block's hardness. The bigger the harder the block.\",\n\t\t\t\t},\n\t\t\t\tGetBlockHeight =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block's hitbox height.\",\n\t\t\t\t},\n\t\t\t\tGetLightValue =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns how much light the specified block emits on its own.\",\n\t\t\t\t},\n\t\t\t\tGetPlaceSound =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"(<b>DEPRECATED</b>) Not used by cuberite internally and always returns an empty string.\",\n\t\t\t\t},\n\t\t\t\tGetSpreadLightFalloff =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns how much light the specified block type consumes.\",\n\t\t\t\t},\n\t\t\t\tIsClickedThrough =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified block type is ignored by the client on left and right clicks, that is, treated as if it were air.\",\n\t\t\t\t},\n\t\t\t\tIsOneHitDig =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified block type will be destroyed after a single hit.\",\n\t\t\t\t},\n\t\t\t\tIsPistonBreakable =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if a piston can break the specified block type.\",\n\t\t\t\t},\n\t\t\t\tIsRainBlocker =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified block type blocks rain from passing through.\",\n\t\t\t\t},\n\t\t\t\tIsSkylightDispersant =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if skylight is impeded by passage through a block of the specified type.\",\n\t\t\t\t},\n\t\t\t\tIsSnowable =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether the specified block type can hold snow atop.\",\n\t\t\t\t},\n\t\t\t\tIsSolid =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether the specified block type is solid.\",\n\t\t\t\t},\n\t\t\t\tIsTransparent =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether the specified block is transparent.\",\n\t\t\t\t},\n\t\t\t\tIsUseableBySpectator =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether a spectator can interact with the specified block.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tVariables =\n\t\t\t{\n\t\t\t\tm_BlockHeight =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"The height of the block, a value between 0.0 and 1.0. <b>OBSOLETE</b>, use cBlockInfo:GetBlockHeight() instead.\",\n\t\t\t\t},\n\t\t\t\tm_CanBeTerraformed =\n\t\t\t\t{\n\t\t\t\t\tType = \"bool\",\n\t\t\t\t\tNotes = \"Is this block suited to be terraformed? <b>OBSOLETE</b>, use cBlockInfo:CanBeTerraformed() instead.\",\n\t\t\t\t},\n\t\t\t\tm_FullyOccupiesVoxel =\n\t\t\t\t{\n\t\t\t\t\tType = \"bool\",\n\t\t\t\t\tNotes = \"Does this block fully occupy its voxel - is it a 'full' block? <b>OBSOLETE</b>, use cBlockInfo:FullyOccupiesVoxel() instead.\",\n\t\t\t\t},\n\t\t\t\tm_Hardness =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"The greater the value the longer the player needs to break the block. <b>OBSOLETE</b>, use cBlockInfo:GetHardness() instead.\",\n\t\t\t\t},\n\t\t\t\tm_IsSnowable =\n\t\t\t\t{\n\t\t\t\t\tType = \"bool\",\n\t\t\t\t\tNotes = \"Can this block hold snow atop? <b>OBSOLETE</b>, use cBlockInfo:IsSnowable() instead\",\n\t\t\t\t},\n\t\t\t\tm_IsSolid =\n\t\t\t\t{\n\t\t\t\t\tType = \"bool\",\n\t\t\t\t\tNotes = \"Is this block solid (player cannot walk through)? <b>OBSOLETE</b>, use cBlockInfo:IsSolid() instead.\",\n\t\t\t\t},\n\t\t\t\tm_LightValue =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"How much light do the blocks emit on their own? <b>OBSOLETE</b>, use cBlockInfo:GetLightValue() instead.\",\n\t\t\t\t},\n\t\t\t\tm_OneHitDig =\n\t\t\t\t{\n\t\t\t\t\tType = \"bool\",\n\t\t\t\t\tNotes = \"Is a block destroyed after a single hit? <b>OBSOLETE</b>, use cBlockInfo:IsOneHitDig() instead.\",\n\t\t\t\t},\n\t\t\t\tm_PistonBreakable =\n\t\t\t\t{\n\t\t\t\t\tType = \"bool\",\n\t\t\t\t\tNotes = \"Can a piston break this block? <b>OBSOLETE</b>, use cBlockInfo:IsPistonBreakable instead.\",\n\t\t\t\t},\n\t\t\t\tm_SpreadLightFalloff =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"How much light do the blocks consume? <b>OBSOLETE</b>, use cBlockInfo:GetSpreadLightFalloff() instead.\",\n\t\t\t\t},\n\t\t\t\tm_Transparent =\n\t\t\t\t{\n\t\t\t\t\tType = \"bool\",\n\t\t\t\t\tNotes = \"Is a block completely transparent? (light doesn't get decreased(?)). <b>OBSOLETE</b>, use cBlockInfo:IsTransparent() instead.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcChatColor =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tA wrapper class for constants representing colors or effects.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tBlack =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tBlue =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tBold =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tColor =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The first character of the color-code-sequence, §\",\n\t\t\t\t},\n\t\t\t\tDarkPurple =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tDelimiter =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The first character of the color-code-sequence, §\",\n\t\t\t\t},\n\t\t\t\tGold =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tGray =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tGreen =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tItalic =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tLightBlue =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tLightGray =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tLightGreen =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tLightPurple =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tNavy =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tPlain =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Resets all formatting to normal\",\n\t\t\t\t},\n\t\t\t\tPurple =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tRandom =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Random letters and symbols animate instead of the text\",\n\t\t\t\t},\n\t\t\t\tRed =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tRose =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tStrikethrough =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tUnderlined =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tWhite =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tYellow =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcChunkDesc =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThe cChunkDesc class is a container for chunk data while the chunk is being generated. As such, it is\n\t\t\t\tonly used as a parameter for the {{OnChunkGenerating|OnChunkGenerating}} and\n\t\t\t\t{{OnChunkGenerated|OnChunkGenerated}} hooks and cannot be constructed on its own. Plugins can use this\n\t\t\t\tclass in both those hooks to manipulate generated chunks.\n\t\t\t\tCalls to any setter of this class will not trigger simulator updates (lava, water, redstone).\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tFillBlocks =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Fills the entire chunk with the specified blocks\",\n\t\t\t\t},\n\t\t\t\tFillRelCuboid =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"RelCuboid\",\n\t\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Fills the cuboid, specified in relative coords, by the specified block type and block meta. The cuboid may reach outside of the chunk, only the part intersecting with this chunk is filled.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Fills the cuboid, specified in relative coords, by the specified block type and block meta. The cuboid may reach outside of the chunk, only the part intersecting with this chunk is filled.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tFloorRelCuboid =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"RelCuboid\",\n\t\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Fills those blocks of the cuboid (specified in relative coords) that are considered non-floor (air, water) with the specified block type and meta. Cuboid may reach outside the chunk, only the part intersecting with this chunk is filled.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Fills those blocks of the cuboid (specified in relative coords) that are considered non-floor (air, water) with the specified block type and meta. Cuboid may reach outside the chunk, only the part intersecting with this chunk is filled.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetBiome =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the biome at the specified relative coords\",\n\t\t\t\t},\n\t\t\t\tGetBlockEntity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cBlockEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block entity for the block at the specified coords. Creates it if it doesn't exist. Returns nil if the block has no block entity capability.\",\n\t\t\t\t},\n\t\t\t\tGetBlockMeta =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NIBBLETYPE\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block meta at the specified relative coords\",\n\t\t\t\t},\n\t\t\t\tGetBlockType =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block type at the specified relative coords\",\n\t\t\t\t},\n\t\t\t\tGetBlockTypeMeta =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NIBBLETYPE\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block type and meta at the specified relative coords\",\n\t\t\t\t},\n\t\t\t\tGetChunkX =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the X coord of the chunk contained.\",\n\t\t\t\t},\n\t\t\t\tGetChunkZ =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Z coord of the chunk contained.\",\n\t\t\t\t},\n\t\t\t\tGetHeight =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the height at the specified relative coords\",\n\t\t\t\t},\n\t\t\t\tGetMaxHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the maximum height contained in the heightmap.\",\n\t\t\t\t},\n\t\t\t\tGetMinHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the minimum height value in the heightmap.\",\n\t\t\t\t},\n\t\t\t\tIsUsingDefaultBiomes =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the chunk is set to use default biome generator\",\n\t\t\t\t},\n\t\t\t\tIsUsingDefaultComposition =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the chunk is set to use default composition generator\",\n\t\t\t\t},\n\t\t\t\tIsUsingDefaultFinish =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the chunk is set to use default finishers\",\n\t\t\t\t},\n\t\t\t\tIsUsingDefaultHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the chunk is set to use default height generator\",\n\t\t\t\t},\n\t\t\t\tRandomFillRelCuboid =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"RelCuboid\",\n\t\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"RandomSeed\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ChanceOutOf10k\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Fills the specified relative cuboid with block type and meta in random locations. RandomSeed is used for the random number genertion (same seed produces same results); ChanceOutOf10k specifies the density (how many out of every 10000 blocks should be filled). Cuboid may reach outside the chunk, only the part intersecting with this chunk is filled.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ChanceOutOf10k\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"RandomSeed\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Fills the specified relative cuboid with block type and meta in random locations. RandomSeed is used for the random number genertion (same seed produces same results); ChanceOutOf10k specifies the density (how many out of every 10000 blocks should be filled). Cuboid may reach outside the chunk, only the part intersecting with this chunk is filled.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReadBlockArea =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockArea\",\n\t\t\t\t\t\t\tType = \"cBlockArea\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxRelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxRelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxRelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reads data from the chunk into the block area object. Block types and metas are processed.\",\n\t\t\t\t},\n\t\t\t\tReplaceRelCuboid =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"RelCuboid\",\n\t\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SrcBlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SrcBlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DstBlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DstBlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Replaces all SrcBlockType + SrcBlockMeta blocks in the cuboid (specified in relative coords) with DstBlockType + DstBlockMeta blocks. Cuboid may reach outside the chunk, only the part intersecting with this chunk is filled.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinRelZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxRelZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SrcBlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SrcBlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DstBlockType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DstBlockMeta\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Replaces all SrcBlockType + SrcBlockMeta blocks in the cuboid (specified in relative coords) with DstBlockType + DstBlockMeta blocks. Cuboid may reach outside the chunk, only the part intersecting with this chunk is filled.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSetBiome =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the biome at the specified relative coords.\",\n\t\t\t\t},\n\t\t\t\tSetBlockMeta =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the block meta at the specified relative coords.\",\n\t\t\t\t},\n\t\t\t\tSetBlockType =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the block type at the specified relative coords\",\n\t\t\t\t},\n\t\t\t\tSetBlockTypeMeta =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the block type and meta at the specified relative coords\",\n\t\t\t\t},\n\t\t\t\tSetHeight =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Height\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the height at the specified relative coords\",\n\t\t\t\t},\n\t\t\t\tSetUseDefaultBiomes =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShouldUseDefaultBiomes\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the chunk to use default biome generator or not\",\n\t\t\t\t},\n\t\t\t\tSetUseDefaultComposition =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShouldUseDefaultComposition\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the chunk to use default composition generator or not\",\n\t\t\t\t},\n\t\t\t\tSetUseDefaultFinish =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShouldUseDefaultFinish\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the chunk to use default finishers or not\",\n\t\t\t\t},\n\t\t\t\tSetUseDefaultHeight =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShouldUseDefaultHeight\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the chunk to use default height generator or not\",\n\t\t\t\t},\n\t\t\t\tUpdateHeightmap =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Updates the heightmap to match current contents. The plugins should do that if they modify the contents and don't modify the heightmap accordingly; Cuberite expects (and checks in Debug mode) that the heightmap matches the contents when the cChunkDesc is returned from a plugin.\",\n\t\t\t\t},\n\t\t\t\tWriteBlockArea =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockArea\",\n\t\t\t\t\t\t\tType = \"cBlockArea\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MergeStrategy\",\n\t\t\t\t\t\t\tType = \"cBlockArea\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Writes data from the block area into the chunk\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Manipulating block entities\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tTo manipulate block entities while the chunk is generated, first use SetBlockTypeMeta() to set\n\t\t\t\t\t\tthe correct block type and meta at the position. Then use the GetBlockEntity() to create and\n\t\t\t\t\t\treturn the correct block entity instance. Finally, use {{tolua}}.cast() to cast to the proper\n\t\t\t\t\t\ttype.</p>\n\t\t\t\t\t\tNote that you don't need to check if a block entity has previously existed at the place, because\n\t\t\t\t\t\tGetBlockEntity() will automatically re-create the correct type for you.</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\tThe following code is taken from the Debuggers plugin, it creates a sign at each chunk's [0, 0]\n\t\t\t\t\t\tcoords, with the text being the chunk coords:\n<pre class=\"prettyprint lang-lua\">\nfunction OnChunkGenerated(a_World, a_ChunkX, a_ChunkZ, a_ChunkDesc)\n\t-- Get the topmost block coord:\n\tlocal Height = a_ChunkDesc:GetHeight(0, 0);\n\n\t-- Create a sign there:\n\ta_ChunkDesc:SetBlockTypeMeta(0, Height + 1, 0, E_BLOCK_SIGN_POST, 0);\n\tlocal BlockEntity = a_ChunkDesc:GetBlockEntity(0, Height + 1, 0);\n\tif (BlockEntity ~= nil) then\n\t\tLOG(\"Setting sign lines...\");\n\t\tlocal SignEntity = tolua.cast(BlockEntity, \"cSignEntity\");\n\t\tSignEntity:SetLines(\"Chunk:\", tonumber(a_ChunkX) .. \", \" .. tonumber(a_ChunkZ), \"\", \"(Debuggers)\");\n\tend\n\n\t-- Update the heightmap:\n\ta_ChunkDesc:SetHeight(0, 0, Height + 1);\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcClientHandle =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tA cClientHandle represents the technical aspect of a connected player - their game client\n\t\t\t\tconnection. Internally, it handles all the incoming and outgoing packets, the chunks that are to be\n\t\t\t\tsent to the client, ping times etc.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGenerateOfflineUUID =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Username\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Generates an UUID based on the player name provided. This is used for the offline (non-auth) mode, when there's no UUID source. Each username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same. Returns a 32-char UUID (no dashes).\",\n\t\t\t\t},\n\t\t\t\tGetClientBrand =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the brand that the client has sent in their MC|Brand plugin message.\",\n\t\t\t\t},\n\t\t\t\tGetForgeMods =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Forge mods installed on the client.\",\n\t\t\t\t},\n\t\t\t\tGetIPString =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the IP address of the connection, as a string. Only the address part is returned, without the port number.\",\n\t\t\t\t},\n\t\t\t\tGetLocale =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Locale\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the locale string that the client sends as part of the protocol handshake. Can be used to provide localized strings.\",\n\t\t\t\t},\n\t\t\t\tGetPing =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ping time, in ms\",\n\t\t\t\t},\n\t\t\t\tGetPlayer =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player object connected to this client. Note that this may be nil, for example if the player object is not yet spawned.\",\n\t\t\t\t},\n\t\t\t\tGetProtocolVersion =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the protocol version number of the protocol that the client is talking. Returns zero if the protocol version is not (yet) known.\",\n\t\t\t\t},\n\t\t\t\tGetRequestedViewDistance =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the view distance that the player request, not the used view distance.\",\n\t\t\t\t},\n\t\t\t\tGetUniqueID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the UniqueID of the client used to identify the client in the server\",\n\t\t\t\t},\n\t\t\t\tGetUsername =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the username that the client has provided\",\n\t\t\t\t},\n\t\t\t\tGetUUID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the authentication-based UUID of the client. This UUID should be used to identify the player when persisting any player-related data. Returns a 32-char UUID (no dashes)\",\n\t\t\t\t},\n\t\t\t\tGetViewDistance =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the viewdistance (number of chunks loaded for the player in each direction)\",\n\t\t\t\t},\n\t\t\t\tHasPluginChannel =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ChannelName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the client has registered to receive messages on the specified plugin channel.\",\n\t\t\t\t},\n\t\t\t\tIsForgeClient =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the client is modded with Forge.\",\n\t\t\t\t},\n\t\t\t\tIsUUIDOnline =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UUID\",\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the UUID is generated by online auth, false if it is an offline-generated UUID. We use Version-3 UUIDs for offline UUIDs, online UUIDs are Version-4, thus we can tell them apart. Accepts both 32-char and 36-char UUIDs (with and without dashes).\",\n\t\t\t\t},\n\t\t\t\tKick =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Reason\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Kicks the user with the specified reason\",\n\t\t\t\t},\n\t\t\t\tSendBlockBreakAnim =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Stage\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends a BlockBreakAnim packet to the client. Only one block can be broken at a time with the same UUID (the other will be reset). You can counter this using random values. The breaking stage ranges between 0 (first stage) and 9 (almost destroyed). Use -1 to reset the destruction.\",\n\t\t\t\t},\n\t\t\t\tSendBlockChange =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends a BlockChange packet to the client. This can be used to create fake blocks only for that player.\",\n\t\t\t\t},\n\t\t\t\tSendBossBarAdd =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UniqueID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Title\",\n\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FractionFilled\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Colour\",\n\t\t\t\t\t\t\tType = \"BossBarColor\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DivisionType\",\n\t\t\t\t\t\t\tType = \"BossBarDivisionType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DarkenSky\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayEndMusic\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CreateFog\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a boss bar on the client's UI. The boss bar is independent of any entity and has a lifetime and properties fully controlled by the plugin. Plugins are responsible for assigning a unique ID and removal.\",\n\t\t\t\t},\n\t\t\t\tSendBossBarUpdateFlags =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UniqueID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DarkenSky\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayEndMusic\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CreateFog\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Updates a boss bar on the client's UI. Only updates some meta flags for additional effects.\",\n\t\t\t\t},\n\t\t\t\tSendBossBarUpdateStyle =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UniqueID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Color\",\n\t\t\t\t\t\t\tType = \"BossBarColor\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DivisionType\",\n\t\t\t\t\t\t\tType = \"BossBarDivisionType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Updates a boss bar on the client's UI. Only updates the visuals of the Boss Bar.\",\n\t\t\t\t},\n\t\t\t\tSendBossBarUpdateTitle =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UniqueID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Title\",\n\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Updates a boss bar on the client's UI. Only Updates the text at the top.\",\n\t\t\t\t},\n\t\t\t\tSendBossBarRemove =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UniqueID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes the boss bar with the given ID from the client's UI.\",\n\t\t\t\t},\n\t\t\t\tSendBossBarUpdateHealth =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UniqueID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FractionFilled\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Updates the health displayed by the boss bar with the given ID.\",\n\t\t\t\t},\n\t\t\t\tSendCollectEntity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Entity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Collector\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the CollectEntity packet to the client. This fakes item collecting.\",\n\t\t\t\t},\n\t\t\t\tSendDestroyEntity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Entity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the DestroyEntity packet to the client. This tells the client to remove the entity from the world.\",\n\t\t\t\t},\n\t\t\t\tSendDetachEntity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Entity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the DetachEntity packet to the client. This drop entities riding another one (boat, minecarts, pigs, horses...).\",\n\t\t\t\t},\n\t\t\t\tSendEditSign =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the EditSign packet to the client. This opens the sign editor GUI.\",\n\t\t\t\t},\n\t\t\t\tSendEntityAnimation =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Entity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AnimationNumber\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the specified animation of the specified entity to the client. The AnimationNumber is protocol-specific.\",\n\t\t\t\t},\n\t\t\t\tSendPlayerListHeaderFooter =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t\tName = \"Header\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t\tName = \"Footer\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tDesc = \"Sends the header and footer of the player list to the client.\",\n\t\t\t\t},\n\t\t\t\tSendHideTitle =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Hides the title. This makes the title and subtitle disappear, but if you call SendTitleTimes() the same title and subtitle will appear again.\"\n\t\t\t\t},\n\t\t\t\tSendLeashEntity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Entity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityLeashedTo\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the LeashEntity packet to the client. Leashes entities together. Leashing to the player, the leash will appear on the player's hand\",\n\t\t\t\t},\n\t\t\t\tSendPluginMessage =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Channel\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the plugin message on the specified channel.\",\n\t\t\t\t},\n\t\t\t\tSendResetTitle =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Resets and hides the title but not the subtitle.\"\n\t\t\t\t},\n\t\t\t\tSendResourcePack =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ResourcePackURL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the ResourcePack packet to the client. The client will request the resource pack from the given URL. If the url is blank, the resource pack will be reset.\",\n\t\t\t\t},\n\t\t\t\tSendSetSubTitle =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SubTitle\",\n\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the subtitle to the client. Doesn't make the client display it yet, use SendTitleTimes() to show both the title and the subtitle.\"\n\t\t\t\t},\n\t\t\t\tSendSetRawSubTitle =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SubTitle\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the raw subtitle to the client. Doesn't make the client display it yet, use SendTitleTimes() to show both the title and the subtitle.\"\n\t\t\t\t},\n\t\t\t\tSendSetTitle =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Title\",\n\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the title to the client. Doesn't make the client display it yet, use SendTitleTimes() to show both the title and the subtitle.\"\n\t\t\t\t},\n\t\t\t\tSendSetRawTitle =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Title\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the raw title to the client. Doesn't make the client display it yet, use SendTitleTimes() to show both the title and the subtitle.\"\n\t\t\t\t},\n\t\t\t\tSendSoundEffect =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SoundName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Volume\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pitch\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends a sound effect request to the client. The sound is played at the specified coords, with the specified volume (a float, 1.0 is full volume, can be more) and pitch (0-255, 63 is 100%)\",\n\t\t\t\t},\n\t\t\t\tSendSoundEffect =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SoundName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Volume\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pitch\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends a sound effect request to the client. The sound is played at the specified coords, with the specified volume (a float, 1.0 is full volume, can be more) and pitch (0-255, 63 is 100%) (DEPRECATED, use vector-parametered version instead)\",\n\t\t\t\t},\n\t\t\t\tSendThunderbolt =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the thunderbolt at the specified coords to the client. The client will display the effect without any sound.\",\n\t\t\t\t},\n\t\t\t\tSendTitleTimes =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FadeInTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DisplayTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FadeOutTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the request to display the title and subtitle, previously set with SendSetTitle, SendSetRawTitle, SendSetSubTitle and SendSetRawSubTitle, to the client.\"\n\t\t\t\t},\n\t\t\t\tSendTimeUpdate =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"WorldAge\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"WorldDate\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DoDaylightCycle\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the specified time update to the client. WorldAge is the total age of the world, in ticks. WorldDate is the current date, in ticks, and is used by the client to calculate the days elapsed (F3 debug overlay's day count) and the time of day (rendered sun position). DoDaylightCycle is a bool that specifies whether the client should automatically move the sun (true) or keep it in the same place (false).\",\n\t\t\t\t},\n\t\t\t\tSendUnleashEntity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the UnleashEntity packet to the client. The client will remove any leashes related to the entity.\",\n\t\t\t\t},\n\t\t\t\tSetClientBrand =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ClientBrand\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the value of the client's brand. Normally this value is received from the client by a MC|Brand plugin message, this function lets plugins overwrite the value.\",\n\t\t\t\t},\n\t\t\t\tSetLocale =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Locale\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the locale that Cuberite keeps on record. Initially the locale is initialized in protocol handshake, this function allows plugins to override the stored value (but only server-side and only until the user disconnects).\",\n\t\t\t\t},\n\t\t\t\tSetViewDistance =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ViewDistance\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the viewdistance (number of chunks loaded for the player in each direction)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tMAX_VIEW_DISTANCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The maximum value of the view distance\",\n\t\t\t\t},\n\t\t\t\tMIN_VIEW_DISTANCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The minimum value of the view distance\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcColor =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tEncapsulates a RGB color, e.g. for armor.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Resets the color to uninitialized.\"\n\t\t\t\t},\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tReturns = { {Type=\"cColor\"} },\n\t\t\t\t\t\tNotes = \"Creates an uninitialized cColor. Each component must be between 0 and 255, inclusive.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Red\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Green\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Blue\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns = { {Type=\"cColor\"} },\n\t\t\t\t\t\tNotes = \"Creates the specified cColor. All components must be between 0 and 255, inclusive.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetColor =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Red\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Green\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Blue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the color's red, green, and blue components, respectively.\"\n\t\t\t\t},\n\t\t\t\tGetRed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Red\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the color's red component.\"\n\t\t\t\t},\n\t\t\t\tGetGreen =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Green\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the color's green component.\"\n\t\t\t\t},\n\t\t\t\tGetBlue =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Blue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the color's blue component.\"\n\t\t\t\t},\n\t\t\t\tIsValid =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"True if the color is valid, false if the color has not been set yet.\"\n\t\t\t\t},\n\t\t\t\tSetColor =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Red\",\n\t\t\t\t\t\t\tType = \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Green\",\n\t\t\t\t\t\t\tType = \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Blue\",\n\t\t\t\t\t\t\tType = \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the color's red, green, and blue components. Values range from 0 to 255.\"\n\t\t\t\t},\n\t\t\t\tSetRed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Red\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the color's red component. Must be between 0 and 255, inclusive.\"\n\t\t\t\t},\n\t\t\t\tSetGreen =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Green\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the color's green component. Must be between 0 and 255, inclusive.\"\n\t\t\t\t},\n\t\t\t\tSetBlue =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Blue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the color's blue component. Must be between 0 and 255, inclusive.\"\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tCOLOR_LIMIT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The upper bound (exclusive) for a color component\",\n\t\t\t\t},\n\t\t\t\tCOLOR_MAX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The maximum value for a color component\",\n\t\t\t\t},\n\t\t\t\tCOLOR_MIN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The minimum value for a color component\",\n\t\t\t\t},\n\t\t\t\tCOLOR_NONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A constant denoting the color is invalid (note: use IsValid)\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcCompositeChat =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tEncapsulates a chat message that can contain various formatting, URLs, commands executed on click\n\t\t\t\tand commands suggested on click. The chat message can be sent by the regular chat-sending functions,\n\t\t\t\t{{cPlayer}}:SendMessage(), {{cWorld}}:BroadcastChat() and {{cRoot}}:BroadcastChat().</p>\n\t\t\t\t<p>\n\t\t\t\tNote that most of the functions in this class are so-called chaining modifiers - they modify the\n\t\t\t\tobject and then return the object itself, so that they can be chained one after another. See the\n\t\t\t\tChaining example below for details.</p>\n\t\t\t\t<p>\n\t\t\t\tEach part of the composite chat message takes a \"Style\" parameter, this is a string that describes\n\t\t\t\tthe formatting. It uses the \"standard\" minecraft format code without the '&' symbole, concatenated\n\t\t\t\ttogether:\n\t\t\t\t<table>\n\t\t\t\t<tr><th>String</th><th>Style</th></tr>\n\t\t\t\t<tr><td>l</td><td>Bold text</td></tr>\n\t\t\t\t<tr><td>o</td><td>Italic text</td></tr>\n\t\t\t\t<tr><td>n</td><td>Underlined text</td></tr>\n\t\t\t\t<tr><td>m</td><td>Strikethrough text</td></tr>\n\t\t\t\t<tr><td>k</td><td>Obfuscated text</td></tr>\n\t\t\t\t<tr><td>r</td><td>Reset Style</td></tr>\n\t\t\t\t<tr><td>[0-9a-f]</td><td>colors</td></tr>\n\t\t\t\t</table>\n\t\t\t\tYou can escape the '&' character with an antislash in front of it. as follow: `I love Choco\\&chips`\n\t\t\t\tThe following picture, taken from the Minecraft Wiki, illustrates the color codes:</p>\n\t\t\t\t<img src=\"https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/7e/Minecraft_Formatting.gif/revision/latest/scale-to-width-down/292?cb=20200828001454\" />\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddRunCommandPart =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Text\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Style\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"self\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a text which, when clicked, runs the specified command. Chaining.\",\n\t\t\t\t},\n\t\t\t\tAddShowAchievementPart =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AchievementName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Style\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a text that represents the 'Achievement get' message.\",\n\t\t\t\t},\n\t\t\t\tAddSuggestCommandPart =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Text\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Style\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"self\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a text which, when clicked, puts the specified command into the player's chat input area. Chaining.\",\n\t\t\t\t},\n\t\t\t\tAddTextPart =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Text\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Style\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"self\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a regular text. Chaining.\",\n\t\t\t\t},\n\t\t\t\tAddUrlPart =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Text\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Url\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Style\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"self\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a text which, when clicked, opens up a browser at the specified URL. Chaining.\",\n\t\t\t\t},\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"self\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes all parts from this object\",\n\t\t\t\t},\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tReturns = { {Type = \"cCompositeChat\"} },\n\t\t\t\t\t\tNotes = \"Creates an empty chat message\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Text\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MessageType\",\n\t\t\t\t\t\t\t\tType = \"eMessageType\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns = { {Type = \"cCompositeChat\"} },\n\t\t\t\t\t\tNotes = \"Creates a chat message containing the specified text, parsed by the ParseText() function. This allows easy migration from old chat messages.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tCreateJsonString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AddPrefixes\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the entire object serialized into JSON, as it would be sent to a client. AddPrefixes specifies whether the chat prefixes should be prepended to the message, true by default.\",\n\t\t\t\t},\n\t\t\t\tExtractText =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the text from the parts that comprises the human-readable data. Used for older protocols that don't support composite chat, and for console-logging.\",\n\t\t\t\t},\n\t\t\t\tGetAdditionalMessageTypeData =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the AdditionalData associated with the message, such as the sender's name for mtPrivateMessage\",\n\t\t\t\t},\n\t\t\t\tGetMessageType =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"eMessageType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the MessageType (mtXXX constant) that is associated with this message. When sent to a player, the message will be formatted according to this message type and the player's settings (adding \\\"[INFO]\\\" prefix etc.)\",\n\t\t\t\t},\n\t\t\t\tParseText =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Text\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"self\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds text, while recognizing http and https URLs and old-style formatting codes (\\\"@2\\\"). Chaining.\",\n\t\t\t\t},\n\t\t\t\tSetMessageType =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageType\",\n\t\t\t\t\t\t\tType = \"eMessageType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AdditionalData\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"self\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the MessageType (mtXXX constant) that is associated with this message. Also sets the additional data (string) associated with the message, which is specific for the message type - such as the sender's name for mtPrivateMessage. When sent to a player, the message will be formatted according to this message type and the player's settings (adding \\\"[INFO]\\\" prefix etc.). Chaining.\",\n\t\t\t\t},\n\t\t\t\tUnderlineUrls =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"self\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Makes all URL parts contained in the message underlined. Doesn't affect parts added in the future. Chaining.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Chaining example\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tSending a chat message that is composed of multiple different parts has been made easy thanks to\n\t\t\t\t\t\tchaining. Consider the following example that shows how a message containing all kinds of parts\n\t\t\t\t\t\tis sent (adapted from the Debuggers plugin):\n<pre class=\"prettyprint lang-lua\">\nfunction OnPlayerJoined(a_Player)\n\t-- Send an example composite chat message to the player:\n\ta_Player:SendMessage(cCompositeChat()\n\t\t:AddTextPart(\"Hello, \")\n\t\t:AddUrlPart(a_Player:GetName(), \"https://cuberite.org\", \"u@2\")  -- Colored underlined link\n\t\t:AddSuggestCommandPart(\", and welcome.\", \"/help\", \"u\")       -- Underlined suggest-command\n\t\t:AddRunCommandPart(\" SetDay\", \"/time set 0\")                 -- Regular text that will execute command when clicked\n\t\t:SetMessageType(mtJoin)                                      -- It is a join-message\n\t)\nend</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcCraftingGrid =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tcCraftingGrid represents the player's crafting grid. It is used in\n\t\t\t\t{{OnCraftingNoRecipe|OnCraftingNoRecipe}}, {{OnPostCrafting|OnPostCrafting}} and\n\t\t\t\t{{OnPreCrafting|OnPreCrafting}} hooks. Plugins may use it to inspect the items the player placed\n\t\t\t\ton their crafting grid.</p>\n\t\t\t\t<p>\n\t\t\t\tAlso, an object of this type is used in {{cCraftingRecipe}}'s ConsumeIngredients() function for\n\t\t\t\tspecifying the exact number of ingredients to consume in that recipe; plugins may use this to\n\t\t\t\tapply the crafting recipe.</p>\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Clears the entire grid\",\n\t\t\t\t},\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Width\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Height\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCraftingGrid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new CraftingGrid object. This new crafting grid is not related to any player, but may be needed for {{cCraftingRecipe}}'s ConsumeIngredients function.\",\n\t\t\t\t},\n\t\t\t\tConsumeGrid =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CraftingGrid\",\n\t\t\t\t\t\t\tType = \"cCraftingGrid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Consumes items specified in CraftingGrid from the current contents. Used internally by {{cCraftingRecipe}}'s ConsumeIngredients() function, but available to plugins, too.\",\n\t\t\t\t},\n\t\t\t\tDump =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"DEBUG build: Dumps the contents of the grid to the log. RELEASE build: no action\",\n\t\t\t\t},\n\t\t\t\tGetHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the height of the grid\",\n\t\t\t\t},\n\t\t\t\tGetItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item at the specified coords\",\n\t\t\t\t},\n\t\t\t\tGetWidth =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the width of the grid\",\n\t\t\t\t},\n\t\t\t\tSetItem =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the item at the specified coords\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the item at the specified coords\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcCraftingRecipe =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class is used to represent a crafting recipe, either a built-in one, or one created dynamically in a plugin. It is used only as a parameter for {{OnCraftingNoRecipe|OnCraftingNoRecipe}}, {{OnPostCrafting|OnPostCrafting}} and {{OnPreCrafting|OnPreCrafting}} hooks. Plugins may use it to inspect or modify a crafting recipe that a player views in their crafting window, either at a crafting table or the survival inventory screen.\n</p>\n\t\t<p>Internally, the class contains a {{cCraftingGrid}} for the ingredients and a {{cItem}} for the result.\n]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Clears the entire recipe, both ingredients and results\",\n\t\t\t\t},\n\t\t\t\tConsumeIngredients =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CraftingGrid\",\n\t\t\t\t\t\t\tType = \"cCraftingGrid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Consumes ingredients specified in the given {{cCraftingGrid|cCraftingGrid}} class\",\n\t\t\t\t},\n\t\t\t\tDump =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"DEBUG build: dumps ingredients and result into server log. RELEASE build: no action\",\n\t\t\t\t},\n\t\t\t\tGetIngredient =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ingredient stored in the recipe at the specified coords\",\n\t\t\t\t},\n\t\t\t\tGetIngredientsHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the height of the ingredients' grid\",\n\t\t\t\t},\n\t\t\t\tGetIngredientsWidth =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the width of the ingredients' grid\",\n\t\t\t\t},\n\t\t\t\tGetResult =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the result of the recipe\",\n\t\t\t\t},\n\t\t\t\tSetIngredient =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the ingredient at the specified coords\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the ingredient at the specified coords\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSetResult =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the result item\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the result item\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcCryptoHash =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tProvides functions for generating cryptographic hashes.</p>\n\t\t\t\t<p>\n\t\t\t\tNote that all functions in this class are super-static, so they are to be called in the dot convention:\n<pre class=\"prettyprint lang-lua\">\nlocal Hash = cCryptoHash.sha1HexString(\"DataToHash\")\n</pre></p>\n\t\t\t\t<p>Each cryptographic hash has two variants, one returns the hash as a raw binary string, the other returns the hash as a hex-encoded string twice as long as the binary string.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tmd5 =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calculates the md5 hash of the data, returns it as a raw (binary) string of 16 characters.\",\n\t\t\t\t},\n\t\t\t\tmd5HexString =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calculates the md5 hash of the data, returns it as a hex-encoded string of 32 characters.\",\n\t\t\t\t},\n\t\t\t\tsha1 =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calculates the sha1 hash of the data, returns it as a raw (binary) string of 20 characters.\",\n\t\t\t\t},\n\t\t\t\tsha1HexString =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calculates the sha1 hash of the data, returns it as a hex-encoded string of 40 characters.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcEnchantments =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class  is the storage for enchantments for a single {{cItem|cItem}} object, through its\n\t\t\t\tm_Enchantments member variable. Although it is possible to create a standalone object of this class,\n\t\t\t\tit is not yet used in any API directly.</p>\n\t\t\t\t<p>\n\t\t\t\tEnchantments can be initialized either programmatically by calling the individual functions\n\t\t\t\t(SetLevel()), or by using a string description of the enchantment combination. This string\n\t\t\t\tdescription is in the form \"id=lvl;id=lvl;...;id=lvl;\", where id is either a numerical ID of the\n\t\t\t\tenchantment, or its textual representation from the table below, and lvl is the desired enchantment\n\t\t\t\tlevel. The class can also create its string description from its current contents; however that\n\t\t\t\tstring description will only have the numerical IDs.</p>\n\t\t\t\t<p>\n\t\t\t\tSee the {{cItem}} class for usage examples.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAdd =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\t\tType = \"cEnchantments\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the enchantments contained in Other into this object. Existing enchantments are preserved, unless Other specifies a different level, in which case the level is changed to the Other's one.\",\n\t\t\t\t},\n\t\t\t\tAddFromString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"StringSpec\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the enchantments in the string description into the object. If a specified enchantment already existed, it is overwritten.\",\n\t\t\t\t},\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Removes all enchantments\",\n\t\t\t\t},\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cEnchantments\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Creates a new empty cEnchantments object\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"StringSpec\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cEnchantments\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Creates a new cEnchantments object filled with enchantments based on the string description\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tCount =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Get the count of enchantments contained within the class\",\n\t\t\t\t},\n\t\t\t\tGetLevel =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EnchantmentNumID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the level of the specified enchantment stored in this object; 0 if not stored\",\n\t\t\t\t},\n\t\t\t\tCanAddEnchantment =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EnchantmentNumID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified enchantment is not mutually exclusive with any of the enchantments stored by the object.\",\n\t\t\t\t},\n\t\t\t\tIsEmpty =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the object stores no enchantments\",\n\t\t\t\t},\n\t\t\t\toperator_eq =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OtherEnchantments\",\n\t\t\t\t\t\t\tType = \"cEnchantments\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if this enchantments object has the same enchantments as OtherEnchantments.\",\n\t\t\t\t},\n\t\t\t\tSetLevel =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EnchantmentNumID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Level\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the level for the specified enchantment, adding it if not stored before, or removing it if Level < = 0\",\n\t\t\t\t},\n\t\t\t\tStringToEnchantmentID =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EnchantmentName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the enchantment numerical ID, -1 if not understood. Case insensitive. Also understands plain numbers.\",\n\t\t\t\t},\n\t\t\t\tToString =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the string description of all the enchantments stored in this object, in numerical-ID form\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tenchAquaAffinity =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchBaneOfArthropods =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchBlastProtection =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchEfficiency =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchFeatherFalling =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchFireAspect =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchFireProtection =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchFlame =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchFortune =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchInfinity =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchKnockback =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchLooting =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchLuckOfTheSea =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchLure =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchPower =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchProjectileProtection =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchProtection =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchPunch =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchRespiration =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchSharpness =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchSilkTouch =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchSmite =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchThorns =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tenchUnbreaking =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcEntity =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tA cEntity object represents an object in the world, it has a position and orientation. cEntity is an\n\t\t\t\tabstract class, and can not be instantiated directly, instead, all entities are implemented as\n\t\t\t\tsubclasses. The cEntity class works as the common interface for the operations that all (most)\n\t\t\t\tentities support.</p>\n\t\t\t\t<p>\n\t\t\t\tAll cEntity objects have an Entity Type so it can be determined what kind of entity it is\n\t\t\t\tefficiently. Entities also have a class inheritance awareness, they know their class name,\n\t\t\t\ttheir parent class' name and can decide if there is a class within their inheritance chain.\n\t\t\t\tSince these functions operate on strings, they are slightly slower than checking the entity type\n\t\t\t\tdirectly, on the other hand, they are more specific directly. To check if the entity is a spider,\n\t\t\t\tyou need to call IsMob(), then cast the object to {{cMonster}} and finally compare\n\t\t\t\t{{cMonster}}:GetMonsterType() to mtSpider. GetClass(), on the other hand, returns \"cSpider\"\n\t\t\t\tdirectly.</p>\n\t\t\t\t<p>\n\t\t\t\tNote that you should not store a cEntity object between two hooks' calls, because Cuberite may\n\t\t\t\tdespawn / remove that entity in between the calls. If you need to refer to an entity later, use its\n\t\t\t\tUniqueID and {{cWorld|cWorld}}'s entity manipulation functions DoWithEntityByID(), ForEachEntity()\n\t\t\t\tor ForEachEntityInChunk() to access the entity again.</p>\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddPosition =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"OffsetX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"OffsetY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"OffsetZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Moves the entity by the specified amount in each axis direction\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Offset\",\n\t\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Moves the entity by the specified amount in each direction\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tAddPosX =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Moves the entity by the specified amount in the X axis direction\",\n\t\t\t\t},\n\t\t\t\tAddPosY =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Moves the entity by the specified amount in the Y axis direction\",\n\t\t\t\t},\n\t\t\t\tAddPosZ =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Moves the entity by the specified amount in the Z axis direction\",\n\t\t\t\t},\n\t\t\t\tAddSpeed =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AddX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AddY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AddZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds the specified amount of speed in each axis direction.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Add\",\n\t\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds the specified amount of speed in each axis direction.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tAddSpeedX =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AddX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified amount of speed in the X axis direction.\",\n\t\t\t\t},\n\t\t\t\tAddSpeedY =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AddY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified amount of speed in the Y axis direction.\",\n\t\t\t\t},\n\t\t\t\tAddSpeedZ =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AddZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified amount of speed in the Z axis direction.\",\n\t\t\t\t},\n\t\t\t\tApplyArmorDamage =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DamageBlocked\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Lowers armor durability, as if the armor blocked the given amount of damage.\",\n\t\t\t\t},\n\t\t\t\tArmorCoversAgainst =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DamageType\",\n\t\t\t\t\t\t\tType = \"eDamageType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether armor will protect against the specified damage type\",\n\t\t\t\t},\n\t\t\t\tDestroy =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShouldBroadcast <b>(DEPRECATED)</b>\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Schedules the entity to be destroyed; broadcasts the DestroyEntity packet\",\n\t\t\t\t},\n\t\t\t\tDoesPreventBlockPlacement =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if this entity doesn't allow blocks to be placed intersecting the entity.\",\n\t\t\t\t},\n\t\t\t\tGetAirLevel =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the air level (number of ticks of air left). Note, this function is only updated with mobs or players.\",\n\t\t\t\t},\n\t\t\t\tGetArmorCoverAgainst =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AttackerEntity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DamageType\",\n\t\t\t\t\t\t\tType = \"eDamageType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RawDamage\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of hitpoints out of RawDamage that the currently equipped armor would cover. See {{TakeDamageInfo}} for more information on attack damage.\",\n\t\t\t\t},\n\t\t\t\tGetBoundingBox =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the bounding box of the entity, which has width and height corresponding to the entity, and is aligned with the block grid.\",\n\t\t\t\t},\n\t\t\t\tGetChunkX =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the X-coord of the chunk in which the entity is placed\",\n\t\t\t\t},\n\t\t\t\tGetChunkZ =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Z-coord of the chunk in which the entity is placed\",\n\t\t\t\t},\n\t\t\t\tGetClass =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the classname of the entity, such as \\\"cSpider\\\" or \\\"cPickup\\\"\",\n\t\t\t\t},\n\t\t\t\tGetClassStatic =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the entity classname that this class implements. Each descendant overrides this function.\",\n\t\t\t\t},\n\t\t\t\tGetEnchantmentBlastKnockbackReduction =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns explosion knock back reduction percent from blast protection level.\",\n\t\t\t\t},\n\t\t\t\tGetEnchantmentCoverAgainst =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AttackerEntity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DamageType\",\n\t\t\t\t\t\t\tType = \"eDamageType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RawDamage\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of hitpoints out of RawDamage that the enchantments on the currently equipped armor would cover. See {{TakeDamageInfo}} for more information on attack damage.\",\n\t\t\t\t},\n\t\t\t\tGetEntityType =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityType\",\n\t\t\t\t\t\t\tType = \"cEntity#eEntityType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the type of the entity, one of the {{cEntity#eEntityType|etXXX}} constants. Note that to check specific entity type, you should use one of the IsXXX functions instead of comparing the value returned by this call.\",\n\t\t\t\t},\n\t\t\t\tGetEquippedBoots =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the boots that the entity has equipped. Returns an empty cItem if no boots equipped or not applicable.\",\n\t\t\t\t},\n\t\t\t\tGetEquippedChestplate =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the chestplate that the entity has equipped. Returns an empty cItem if no chestplate equipped or not applicable.\",\n\t\t\t\t},\n\t\t\t\tGetEquippedHelmet =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the helmet that the entity has equipped. Returns an empty cItem if no helmet equipped or not applicable.\",\n\t\t\t\t},\n\t\t\t\tGetEquippedLeggings =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the leggings that the entity has equipped. Returns an empty cItem if no leggings equipped or not applicable.\",\n\t\t\t\t},\n\t\t\t\tGetEquippedWeapon =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the weapon that the entity has equipped. Returns an empty cItem if no weapon equipped or not applicable.\",\n\t\t\t\t},\n\t\t\t\tGetOffHandEquipedItem =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item that the entity has equipped on off-hand. Returns an empty cItem if no item equipped or not applicable.\",\n\t\t\t\t},\n\t\t\t\tGetGravity =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number that is used as the gravity for physics simulation. 1G (9.78) by default.\",\n\t\t\t\t},\n\t\t\t\tGetHeadYaw =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the pitch of the entity's head (FIXME: Rename to GetHeadPitch() ).\",\n\t\t\t\t},\n\t\t\t\tGetHealth =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the current health of the entity.\",\n\t\t\t\t},\n\t\t\t\tGetHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the height (Y size) of the entity\",\n\t\t\t\t},\n\t\t\t\tGetInvulnerableTicks =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of ticks that this entity will be invulnerable for. This is used for after-hit recovery - the entities are invulnerable for half a second after being hit.\",\n\t\t\t\t},\n\t\t\t\tGetKnockbackAmountAgainst =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ReceiverEntity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the amount of knockback that the currently equipped items would cause when attacking the ReceiverEntity.\",\n\t\t\t\t},\n\t\t\t\tGetLookVector =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the vector that defines the direction in which the entity is looking\",\n\t\t\t\t},\n\t\t\t\tGetMass =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the mass of the entity. Currently unused.\",\n\t\t\t\t},\n\t\t\t\tGetMaxHealth =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the maximum number of hitpoints this entity is allowed to have.\",\n\t\t\t\t},\n\t\t\t\tGetParentClass =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the name of the direct parent class for this entity\",\n\t\t\t\t},\n\t\t\t\tGetPitch =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the pitch (nose-down rotation) of the entity. Measured in degrees, normal values range from -90 to +90. +90 means looking down, 0 means looking straight ahead, -90 means looking up.\",\n\t\t\t\t},\n\t\t\t\tGetPosition =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the entity's pivot position as a 3D vector\",\n\t\t\t\t},\n\t\t\t\tGetPosX =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the X-coord of the entity's pivot\",\n\t\t\t\t},\n\t\t\t\tGetPosY =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Y-coord of the entity's pivot\",\n\t\t\t\t},\n\t\t\t\tGetPosZ =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Z-coord of the entity's pivot\",\n\t\t\t\t},\n\t\t\t\tGetRawDamageAgainst =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ReceiverEntity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the raw damage that this entity's equipment would cause when attacking the ReceiverEntity. This includes this entity's weapon {{cEnchantments|enchantments}}, but excludes the receiver's armor or potion effects. See {{TakeDamageInfo}} for more information on attack damage.\",\n\t\t\t\t},\n\t\t\t\tGetRoll =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the roll (sideways rotation) of the entity. Currently unused.\",\n\t\t\t\t},\n\t\t\t\tGetSpeed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the complete speed vector of the entity\",\n\t\t\t\t},\n\t\t\t\tGetSpeedX =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the X-part of the speed vector\",\n\t\t\t\t},\n\t\t\t\tGetSpeedY =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Y-part of the speed vector\",\n\t\t\t\t},\n\t\t\t\tGetSpeedZ =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Z-part of the speed vector\",\n\t\t\t\t},\n\t\t\t\tGetTicksAlive =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of ticks that this entity has been alive for.\",\n\t\t\t\t},\n\t\t\t\tGetUniqueID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ID that uniquely identifies the entity within the running server. Note that this ID is not persisted to the data files.\",\n\t\t\t\t},\n\t\t\t\tGetWidth =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the width (X and Z size) of the entity.\",\n\t\t\t\t},\n\t\t\t\tGetWorld =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the world where the entity resides\",\n\t\t\t\t},\n\t\t\t\tGetYaw =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the yaw (direction) of the entity. Measured in degrees, values range from -180 to +180. 0 means ZP, 90 means XM, -180 means ZM, -90 means XP.\",\n\t\t\t\t},\n\t\t\t\tHandleSpeedFromAttachee =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ForwardAmount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SidewaysAmount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Updates the entity's speed based on the attachee exerting the specified force forward and sideways. Used for entities being driven by other entities attached to them - usually players driving minecarts and boats.\",\n\t\t\t\t},\n\t\t\t\tHeal =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Hitpoints\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Heals the specified number of hitpoints. Hitpoints is expected to be a positive number.\",\n\t\t\t\t},\n\t\t\t\tIsA =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ClassName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity class is a descendant of the specified class name, or the specified class itself\",\n\t\t\t\t},\n\t\t\t\tIsArrow =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is an arrow.\",\n\t\t\t\t},\n\t\t\t\tIsBoat =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is a {{cBoat|boat}}.\",\n\t\t\t\t},\n\t\t\t\tIsCrouched =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is crouched. Always false for entities that don't support crouching.\",\n\t\t\t\t},\n\t\t\t\tIsDestroyed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"(<b>DEPRECATED</b>) Please use cEntity:IsTicking().\",\n\t\t\t\t},\n\t\t\t\tIsElytraFlying =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is flying with an elytra. Entities that cannot fly with an elytra return always false.\",\n\t\t\t\t},\n\t\t\t\tIsEnderCrystal =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is an ender crystal.\",\n\t\t\t\t},\n\t\t\t\tIsExpOrb =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity represents an experience orb\",\n\t\t\t\t},\n\t\t\t\tIsFallingBlock =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity represents a {{cFallingBlock}} entity.\",\n\t\t\t\t},\n\t\t\t\tIsFireproof =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity takes no damage from being on fire.\",\n\t\t\t\t},\n\t\t\t\tIsFloater =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity represents a fishing rod floater\",\n\t\t\t\t},\n\t\t\t\tIsHeadInWater =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity's head is in a water block\",\n\t\t\t\t},\n\t\t\t\tIsInvisible =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is invisible.\",\n\t\t\t\t},\n\t\t\t\tIsInFire =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if any part of the entity is in a fire block\",\n\t\t\t\t},\n\t\t\t\tIsInLava =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if any part of the entity is in a lava block\",\n\t\t\t\t},\n\t\t\t\tIsInWater =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if any part of the entity is in a water block\",\n\t\t\t\t},\n\t\t\t\tIsItemFrame =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is an item frame.\",\n\t\t\t\t},\n\t\t\t\tIsLeashKnot =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is a leash knot.\",\n\t\t\t\t},\n\t\t\t\tIsMinecart =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity represents a {{cMinecart|minecart}}\",\n\t\t\t\t},\n\t\t\t\tIsMob =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity represents any {{cMonster|mob}}.\",\n\t\t\t\t},\n\t\t\t\tIsOnFire =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is on fire\",\n\t\t\t\t},\n\t\t\t\tIsOnGround =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is on ground (not falling, not jumping, not flying)\",\n\t\t\t\t},\n\t\t\t\tIsPainting =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns if this entity is a painting.\",\n\t\t\t\t},\n\t\t\t\tIsPawn =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is a {{cPawn}} descendant.\",\n\t\t\t\t},\n\t\t\t\tIsPickup =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity represents a {{cPickup|pickup}}.\",\n\t\t\t\t},\n\t\t\t\tIsPlayer =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity represents a {{cPlayer|player}}\",\n\t\t\t\t},\n\t\t\t\tIsProjectile =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is a {{cProjectileEntity}} descendant.\",\n\t\t\t\t},\n\t\t\t\tIsRclking =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Currently unimplemented\",\n\t\t\t\t},\n\t\t\t\tIsRiding =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is attached to (riding) another entity.\",\n\t\t\t\t},\n\t\t\t\tIsSprinting =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is sprinting. Entities that cannot sprint return always false\",\n\t\t\t\t},\n\t\t\t\tIsSubmerged =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity's head is in a water block <b>Currently deprecated in favour of IsHeadInWater()</b>\",\n\t\t\t\t},\n\t\t\t\tIsSwimming =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if any part of the entity is in a water block. Note, this function is only updated with mobs or players. <b>Currently deprecated in favour of IsInWater()</b>\",\n\t\t\t\t},\n\t\t\t\tIsTicking =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity is valid and ticking. Returns false if the entity is not ticking and is about to leave its current world either via teleportation or destruction. If this returns false, you must stop using the cEntity pointer you have.\",\n\t\t\t\t},\n\t\t\t\tIsTNT =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the entity represents a {{cTNTEntity|TNT entity}}\",\n\t\t\t\t},\n\t\t\t\tKilled =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Victim\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"This entity has killed another entity (the Victim). For players, adds the scoreboard statistics about the kill.\",\n\t\t\t\t},\n\t\t\t\tMoveToWorld =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ShouldSendRespawn\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Removes the entity from this world and starts moving it to the specified world's spawn point. Note that to avoid deadlocks, the move is asynchronous - the entity is moved into a queue and will be moved from that queue into the destination world at some (unpredictable) time in the future. ShouldSendRespawn is used only for players, it specifies whether the player should be sent a Respawn packet upon leaving the world (The client handles respawns only between different dimensions).\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"WorldName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ShouldSendRespawn\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Removes the entity from this world and starts moving it to the specified world's spawn point. Note that to avoid deadlocks, the move is asynchronous - the entity is moved into a queue and will be moved from that queue into the destination world at some (unpredictable) time in the future. ShouldSendRespawn is used only for players, it specifies whether the player should be sent a Respawn packet upon leaving the world (The client handles respawns only between different dimensions).\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ShouldSendRespawn\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Removes the entity from this world and starts moving it to the specified world. Note that to avoid deadlocks, the move is asynchronous - the entity is moved into a queue and will be moved from that queue into the destination world at some (unpredictable) time in the future. ShouldSendRespawn is used only for players, it specifies whether the player should be sent a Respawn packet upon leaving the world (The client handles respawns only between different dimensions). The Position parameter specifies the location that the entity should be placed in, in the new world.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ShouldSetPortalCooldown\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ShouldSendRespawn\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Removes the entity from this world and starts moving it to the specified world. Note that to avoid deadlocks, the move is asynchronous - the entity is moved into a queue and will be moved from that queue into the destination world at some (unpredictable) time in the future. If ShouldSetPortalCooldown is false (default), doesn't set any portal cooldown, if it is true, the default portal cooldown is applied to the entity. ShouldSendRespawn is used only for players, it specifies whether the player should be sent a Respawn packet upon leaving the world (The client handles respawns only between different dimensions). The Position parameter specifies the location that the entity should be placed in, in the new world.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSetGravity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Gravity\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the number that is used as the gravity for physics simulation. 1G (9.78) by default.\",\n\t\t\t\t},\n\t\t\t\tSetHeadYaw =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HeadPitch\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the head pitch (FIXME: Rename to SetHeadPitch() ).\",\n\t\t\t\t},\n\t\t\t\tSetHealth =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Hitpoints\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the entity's health to the specified amount of hitpoints. Doesn't broadcast any hurt animation. Doesn't kill the entity if health drops below zero. Use the TakeDamage() function instead for taking damage.\",\n\t\t\t\t},\n\t\t\t\tSetInvulnerableTicks =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NumTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the amount of ticks for which the entity will not receive any damage from other entities.\",\n\t\t\t\t},\n\t\t\t\tSetIsFireproof =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsFireproof\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets whether the entity receives damage from being on fire.\",\n\t\t\t\t},\n\t\t\t\tSetMass =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Mass\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the mass of the entity. Currently unused.\",\n\t\t\t\t},\n\t\t\t\tSetMaxHealth =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxHitpoints\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the maximum hitpoints of the entity. If current health is above MaxHitpoints, it is capped to MaxHitpoints.\",\n\t\t\t\t},\n\t\t\t\tSetPitch =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pitch\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the pitch (nose-down rotation) of the entity\",\n\t\t\t\t},\n\t\t\t\tSetPitchFromSpeed =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sets the entity pitch to match its speed (entity looking forwards as it moves)\",\n\t\t\t\t},\n\t\t\t\tSetPosition =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"PosX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"PosY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"PosZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets all three coords of the entity's pivot\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Vector3d\",\n\t\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets all three coords of the entity's pivot\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSetPosX =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PosX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the X-coord of the entity's pivot\",\n\t\t\t\t},\n\t\t\t\tSetPosY =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PosY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the Y-coord of the entity's pivot\",\n\t\t\t\t},\n\t\t\t\tSetPosZ =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PosZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the Z-coord of the entity's pivot\",\n\t\t\t\t},\n\t\t\t\tSetRoll =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Roll\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the roll (sideways rotation) of the entity. Currently unused.\",\n\t\t\t\t},\n\t\t\t\tSetSpeed =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SpeedX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SpeedY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SpeedZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the current speed of the entity\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Speed\",\n\t\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the current speed of the entity\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSetSpeedX =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SpeedX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the X component of the entity speed\",\n\t\t\t\t},\n\t\t\t\tSetSpeedY =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SpeedY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the Y component of the entity speed\",\n\t\t\t\t},\n\t\t\t\tSetSpeedZ =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SpeedZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the Z component of the entity speed\",\n\t\t\t\t},\n\t\t\t\tSetYaw =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Yaw\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the yaw (direction) of the entity.\",\n\t\t\t\t},\n\t\t\t\tSetYawFromSpeed =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sets the entity's yaw to match its current speed (entity looking forwards as it moves).\",\n\t\t\t\t},\n\t\t\t\tStartBurning =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NumTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the entity on fire for the specified number of ticks. If entity is on fire already, makes it burn for either NumTicks or the number of ticks left from the previous fire, whichever is larger.\",\n\t\t\t\t},\n\t\t\t\tSteerVehicle =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ForwardAmount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SidewaysAmount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Applies the specified steering to the vehicle this entity is attached to. Ignored if not attached to any entity.\",\n\t\t\t\t},\n\t\t\t\tStopBurning =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Extinguishes the entity fire, cancels all fire timers.\",\n\t\t\t\t},\n\t\t\t\tTakeDamage =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AttackerEntity\",\n\t\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Causes this entity to take damage that AttackerEntity would inflict. Includes their weapon and this entity's armor.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DamageType\",\n\t\t\t\t\t\t\t\tType = \"eDamageType\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AttackerEntity\",\n\t\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"RawDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KnockbackAmount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Causes this entity to take damage of the specified type, from the specified attacker (may be nil). The final damage is calculated from RawDamage using the currently equipped armor.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DamageType\",\n\t\t\t\t\t\t\t\tType = \"eDamageType\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AttackerEntity\",\n\t\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"RawDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"FinalDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KnockbackAmount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Causes this entity to take damage of the specified type, from the specified attacker (may be nil). The values are wrapped into a {{TakeDamageInfo}} structure and applied directly.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tTeleportToCoords =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PosX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PosY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PosZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Teleports the entity to the specified coords. Asks plugins if the teleport is allowed.\",\n\t\t\t\t},\n\t\t\t\tTeleportToEntity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DestEntity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Teleports this entity to the specified destination entity. Asks plugins if the teleport is allowed.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tINVALID_ID =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Special value of an entity ID, indicating a failure. Used primarily in functions that create entities when the entity cannot be created.\",\n\t\t\t\t},\n\t\t\t\tetBoat =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cBoat}}\",\n\t\t\t\t},\n\t\t\t\tetEnderCrystal =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cEnderCrystal}}\",\n\t\t\t\t},\n\t\t\t\tetEntity =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"No further specialization available\",\n\t\t\t\t},\n\t\t\t\tetExpOrb =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cExpOrb}}\",\n\t\t\t\t},\n\t\t\t\tetFallingBlock =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cFallingBlock}}\",\n\t\t\t\t},\n\t\t\t\tetFloater =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a fishing rod floater\",\n\t\t\t\t},\n\t\t\t\tetItemFrame =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is an item frame\",\n\t\t\t\t},\n\t\t\t\tetLeashKnot =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a leash knot\",\n\t\t\t\t},\n\t\t\t\tetMinecart =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cMinecart}} descendant\",\n\t\t\t\t},\n\t\t\t\tetMob =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cMonster}} descendant\",\n\t\t\t\t},\n\t\t\t\tetMonster =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cMonster}} descendant\",\n\t\t\t\t},\n\t\t\t\tetPainting =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cPainting}}\",\n\t\t\t\t},\n\t\t\t\tetPickup =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cPickup}}\",\n\t\t\t\t},\n\t\t\t\tetPlayer =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cPlayer}}\",\n\t\t\t\t},\n\t\t\t\tetProjectile =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cProjectileEntity}} descendant\",\n\t\t\t\t},\n\t\t\t\tetTNT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The entity is a {{cTNTEntity}}\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstantGroups =\n\t\t\t{\n\t\t\t\teEntityType =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"et.*\",\n\t\t\t\t\tTextBefore = \"The following constants are used to distinguish between different entity types:\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcEntityEffect =\n\t\t{\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetPotionColor =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the potion color (used by the client for visuals), based on the potion's damage value\",\n\t\t\t\t},\n\t\t\t\tGetPotionEffectDuration =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the effect duration, in ticks, based on the potion's damage value\",\n\t\t\t\t},\n\t\t\t\tGetPotionEffectIntensity =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"short\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Retrieves the intensity level from the potion's damage value. Returns 0 for level I potions, 1 for level II potions.\",\n\t\t\t\t},\n\t\t\t\tGetPotionEffectType =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"eType\",\n\t\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Translates the potion's damage value into the entity effect that the potion gives\",\n\t\t\t\t},\n\t\t\t\tIsPotionDrinkable =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the potion with the given damage is drinkable\",\n\t\t\t\t},\n\t\t\t},  -- Functions\n\t\t\tConstantGroups =\n\t\t\t{\n\t\t\t\teType =\n\t\t\t\t{\n\t\t\t\t\tInclude = { \"eff.*\" },\n\t\t\t\t},\n\t\t\t},  -- ConstantGroups\n\t\t},  -- cEntityEffect\n\n\t\tcFile =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tProvides helper functions for manipulating and querying the filesystem. Most functions are static,\n\t\t\t\tso they should be called directly on the cFile class itself:\n<pre class=\"prettyprint lang-lua\">\ncFile:DeleteFile(\"/usr/bin/virus.exe\");\n</pre></p>\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tChangeFileExt =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NewExt\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns FileName with its extension changed to NewExt. NewExt may begin with a dot, but needn't, the result is the same in both cases (the first dot, if present, is ignored). FileName may contain path elements, extension is recognized as the last dot after the last path separator in the string.\",\n\t\t\t\t},\n\t\t\t\tCopy =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SrcFileName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DstFileName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Copies a single file to a new destination. Returns true if successful. Fails if the destination already exists.\",\n\t\t\t\t},\n\t\t\t\tCreateFolder =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FolderPath\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new folder. Returns true if successful. Only a single level can be created at a time, use CreateFolderRecursive() to create multiple levels of folders at once.\",\n\t\t\t\t},\n\t\t\t\tCreateFolderRecursive =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FolderPath\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new folder, creating its parents if needed. Returns true if successful.\",\n\t\t\t\t},\n\t\t\t\tDelete =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Path\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes the specified file or folder. Returns true if successful. Only deletes folders that are empty.<br/><b>NOTE</b>: If you already know if the object is a file or folder, use DeleteFile() or DeleteFolder() explicitly.\",\n\t\t\t\t},\n\t\t\t\tDeleteFile =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FilePath\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes the specified file. Returns true if successful.\",\n\t\t\t\t},\n\t\t\t\tDeleteFolder =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FolderPath\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes the specified file or folder. Returns true if successful. Only deletes folders that are empty.\",\n\t\t\t\t},\n\t\t\t\tDeleteFolderContents =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FolderPath\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes everything from the specified folder, recursively. The specified folder stays intact. Returns true if successful.\",\n\t\t\t\t},\n\t\t\t\tExists =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Path\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Exists\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified file or folder exists.<br/><b>OBSOLETE</b>, use IsFile() or IsFolder() instead\",\n\t\t\t\t},\n\t\t\t\tGetExecutableExt =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the customary executable extension (including the dot) used by the current platform (\\\".exe\\\" on Windows, empty string on Linux). \",\n\t\t\t\t},\n\t\t\t\tGetFolderContents =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FolderName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the contents of the specified folder, as an array table of strings. Each filesystem object is listed. Use the IsFile() and IsFolder() functions to determine the object type. Note that \\\".\\\" and \\\"..\\\" are NOT returned. The order of the names is arbitrary (as returned by OS, no sorting).\",\n\t\t\t\t},\n\t\t\t\tGetLastModificationTime =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Path\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the last modification time (in current timezone) of the specified file or folder. Returns zero if file not found / not accessible. The returned value is in the same units as values returned by os.time().\",\n\t\t\t\t},\n\t\t\t\tGetPathSeparator =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the primary path separator used by the current platform. Returns \\\"\\\\\\\" on Windows and \\\"/\\\" on Linux. Note that the platform or CRT may support additional path separators, those are not reported.\",\n\t\t\t\t},\n\t\t\t\tGetSize =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the size of the file, or -1 on failure.\",\n\t\t\t\t},\n\t\t\t\tIsFile =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Path\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified path points to an existing file.\",\n\t\t\t\t},\n\t\t\t\tIsFolder =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Path\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified path points to an existing folder.\",\n\t\t\t\t},\n\t\t\t\tReadWholeFile =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the entire contents of the specified file. Returns an empty string if the file cannot be opened.\",\n\t\t\t\t},\n\t\t\t\tRename =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OrigPath\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NewPath\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Renames a file or a folder. Returns true if successful. Undefined result if NewPath already exists.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcFloater =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tManages the floater created when a player uses their fishing rod.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tCanPickup =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the floater gives an item when the player right clicks.\",\n\t\t\t\t},\n\t\t\t\tGetAttachedMobID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the EntityID of a mob that this floater is attached to. Returns -1 if not attached to any mob.\",\n\t\t\t\t},\n\t\t\t\tGetOwnerID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the EntityID of the player who owns the floater.\",\n\t\t\t\t},\n\t\t\t\tGetBitePos =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BitePosition\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the position of the floater just before a fish bites. If a fish hasn't bitten the floater, this function returns the position the floater was cast from.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcHangingEntity =\n\t\t{\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetFacing =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockFace\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the direction in which the entity is facing.\",\n\t\t\t\t},\n\t\t\t\tIsValidSupportBlock =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified block type can support a hanging entity. This means that paintings and item frames can be placed on such a block.\",\n\t\t\t\t},\n\t\t\t\tSetFacing =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockFace\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Set the direction in which the entity is facing.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcIniFile =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class implements a simple name-value storage represented on disk by an INI file. These files\n\t\t\t\tare suitable for low-volume high-latency human-readable information storage, such as for\n\t\t\t\tconfiguration. Cuberite itself uses INI files for settings and options.</p>\n\t\t\t\t<p>\n\t\t\t\tThe INI files follow this basic structure:\n<pre class=\"prettyprint lang-ini\">\n; Header comment line\n[KeyName0]\n; Key comment line 0\nValueName0=Value0\nValueName1=Value1\n\n[KeyName1]\n; Key comment line 0\n; Key comment line 1\nValueName0=SomeOtherValue\n</pre>\n\t\t\t\tThe cIniFile object stores all the objects in numbered arrays and provides access to the information\n\t\t\t\teither based on names (KeyName, ValueName) or zero-based indices.</p>\n\t\t\t\t<p>\n\t\t\t\tThe objects of this class are created empty. You need to either load a file using ReadFile(), or\n\t\t\t\tinsert values by hand. Then you can store the object's contents to a disk file using WriteFile(), or\n\t\t\t\tjust forget everything by destroying the object. Note that the file operations are quite slow.</p>\n\t\t\t\t<p>\n\t\t\t\tCuberite will write the characters '\\n' in place of line breaks in the values of the cIniFile when\n\t\t\t\tit is being stored into a file. It will also replace '\\n' with line breaks when it reads an INI\n\t\t\t\tfile.\n\t\t\t\t<p>\n\t\t\t\tFor storing high-volume low-latency data, use the {{sqlite3}} class. For storing\n\t\t\t\thierarchically-structured data, use the XML format, using the LuaExpat parser in the {{lxp}} class.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddHeaderComment =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Comment\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a comment to be stored in the file header.\",\n\t\t\t\t},\n\t\t\t\tAddKeyComment =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Comment\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds a comment to be stored in the file under the specified key\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Comment\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds a comment to be stored in the file under the specified key\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tAddKeyName =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a new key of the specified name. Returns the KeyID of the new key.\",\n\t\t\t\t},\n\t\t\t\tAddValue =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Value\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a new value of the specified name to the specified key. If another value of the same name exists in the key, both are kept (nonstandard INI file)\",\n\t\t\t\t},\n\t\t\t\tAddValueB =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Value\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a new bool value of the specified name to the specified key. If another value of the same name exists in the key, both are kept (nonstandard INI file)\",\n\t\t\t\t},\n\t\t\t\tAddValueF =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Value\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a new float value of the specified name to the specified key. If another value of the same name exists in the key, both are kept (nonstandard INI file)\",\n\t\t\t\t},\n\t\t\t\tAddValueI =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Value\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a new integer value of the specified name to the specified key. If another value of the same name exists in the key, both are kept (nonstandard INI file)\",\n\t\t\t\t},\n\t\t\t\tCaseInsensitive =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sets key names' and value names' comparisons to case insensitive (default).\",\n\t\t\t\t},\n\t\t\t\tCaseSensitive =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sets key names and value names comparisons to case sensitive.\",\n\t\t\t\t},\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Removes all the in-memory data. Note that , like all the other operations, this doesn't affect any file data.\",\n\t\t\t\t},\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cIniFile\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new empty cIniFile object.\",\n\t\t\t\t},\n\t\t\t\tDeleteHeaderComment =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CommentID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes the specified header comment. Returns true if successful.\",\n\t\t\t\t},\n\t\t\t\tDeleteHeaderComments =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Deletes all headers comments.\",\n\t\t\t\t},\n\t\t\t\tDeleteKey =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes the specified key, and all values in that key. Returns true if successful.\",\n\t\t\t\t},\n\t\t\t\tDeleteKeyComment =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"CommentID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Deletes the specified key comment. Returns true if successful.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"CommentID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Deletes the specified key comment. Returns true if successful.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tDeleteKeyComments =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Deletes all comments for the specified key. Returns true if successful.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Deletes all comments for the specified key. Returns true if successful.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tDeleteValue =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes the specified value. Returns true if successful.\",\n\t\t\t\t},\n\t\t\t\tDeleteValueByID =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes the specified value. Returns true if successful.\",\n\t\t\t\t},\n\t\t\t\tFindKey =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the KeyID for the specified key name, or the noID constant if the key doesn't exist.\",\n\t\t\t\t},\n\t\t\t\tFindValue =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ValueID for the specified value name, or the noID constant if the specified key doesn't contain a value of that name.\",\n\t\t\t\t},\n\t\t\t\tFlush =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Writes the data stored in the object to the file that was last associated with the object (ReadFile() or WriteFile()). Returns true on success, false on failure.\",\n\t\t\t\t},\n\t\t\t\tGetHeaderComment =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CommentID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the specified header comment, or an empty string if such comment doesn't exist\",\n\t\t\t\t},\n\t\t\t\tGetKeyComment =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"CommentID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the specified key comment, or an empty string if such a comment doesn't exist\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"CommentID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the specified key comment, or an empty string if such a comment doesn't exist\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetKeyName =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the key name for the specified key ID. Inverse for FindKey().\",\n\t\t\t\t},\n\t\t\t\tGetNumHeaderComments =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Retuns the number of header comments.\",\n\t\t\t\t},\n\t\t\t\tGetNumKeyComments =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the number of comments under the specified key\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the number of comments under the specified key\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetNumKeys =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the total number of keys. This is the range for the KeyID (0 .. GetNumKeys() - 1)\",\n\t\t\t\t},\n\t\t\t\tGetNumValues =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the number of values stored under the specified key.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the number of values stored under the specified key.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetValue =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key. Returns DefaultValue (empty string if not given) if the value doesn't exist.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ValueID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key. Returns DefaultValue (empty string if not given) if the value doesn't exist.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetValueB =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key, as a bool. Returns DefaultValue (false if not given) if the value doesn't exist.\",\n\t\t\t\t},\n\t\t\t\tGetValueF =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key, as a floating-point number. Returns DefaultValue (zero if not given) if the value doesn't exist.\",\n\t\t\t\t},\n\t\t\t\tGetValueI =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key, as an integer. Returns DefaultValue (zero if not given) if the value doesn't exist.\",\n\t\t\t\t},\n\t\t\t\tGetValueName =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ValueID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the name of the value specified by its ID. Inverse for FindValue().\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ValueID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the name of the value specified by its ID. Inverse for FindValue().\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetValueSet =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key. If the value doesn't exist, creates it with the specified default (empty string if not given).\",\n\t\t\t\t},\n\t\t\t\tGetValueSetB =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key, as a bool. If the value doesn't exist, creates it with the specified default (false if not given).\",\n\t\t\t\t},\n\t\t\t\tGetValueSetF =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key, as a floating-point number. If the value doesn't exist, creates it with the specified default (zero if not given).\",\n\t\t\t\t},\n\t\t\t\tGetValueSetI =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the value of the specified name under the specified key, as an integer. If the value doesn't exist, creates it with the specified default (zero if not given).\",\n\t\t\t\t},\n\t\t\t\tHasValue =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified value is present.\",\n\t\t\t\t},\n\t\t\t\tReadFile =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AllowExampleFallback\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reads the values from the specified file. Previous in-memory contents are lost. If the file cannot be opened, and AllowExample is true, another file, \\\"filename.example.ini\\\", is loaded and then saved as \\\"filename.ini\\\". Returns true if successful, false if not.\",\n\t\t\t\t},\n\t\t\t\tSetValue =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ValueID\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"NewValue\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Overwrites the specified value with a new value. If the specified value doesn't exist, returns false (doesn't add).\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"NewValue\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"CreateIfNotExists\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Overwrites the specified value with a new value. If CreateIfNotExists is true (default) and the value doesn't exist, it is first created. Returns true if the value was successfully set, false if not (didn't exists, CreateIfNotExists false).\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSetValueB =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NewValue\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CreateIfNotExists\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Overwrites the specified value with a new bool value. If CreateIfNotExists is true (default) and the value doesn't exist, it is first created. Returns true if the value was successfully set, false if not (didn't exists, CreateIfNotExists false).\",\n\t\t\t\t},\n\t\t\t\tSetValueF =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NewValue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CreateIfNotExists\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Overwrites the specified value with a new floating-point number value. If CreateIfNotExists is true (default) and the value doesn't exist, it is first created. Returns true if the value was successfully set, false if not (didn't exists, CreateIfNotExists false).\",\n\t\t\t\t},\n\t\t\t\tSetValueI =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ValueName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NewValue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CreateIfNotExists\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Overwrites the specified value with a new integer value. If CreateIfNotExists is true (default) and the value doesn't exist, it is first created. Returns true if the value was successfully set, false if not (didn't exists, CreateIfNotExists false).\",\n\t\t\t\t},\n\t\t\t\tWriteFile =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Writes the current in-memory data into the specified file. Returns true if successful, false if not.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tnoID =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example: Reading a simple value\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tcIniFile is very easy to use. For example, you can find out what port the server is supposed to\n\t\t\t\t\t\tuse according to settings.ini by using this little snippet:\n<pre class=\"prettyprint lang-lua\">\nlocal IniFile = cIniFile();\nif (IniFile:ReadFile(\"settings.ini\")) then\n\tServerPort = IniFile:GetValueI(\"Server\", \"Port\");\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example: Enumerating all objects in a file\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tTo enumerate all keys in a file, you need to query the total number of keys, using GetNumKeys(),\n\t\t\t\t\t\tand then query each key's name using GetKeyName(). Similarly, to enumerate all values under a\n\t\t\t\t\t\tkey, you need to query the total number of values using GetNumValues() and then query each\n\t\t\t\t\t\tvalue's name using GetValueName().</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\tThe following code logs all keynames and their valuenames into the server log:\n<pre class=\"prettyprint lang-lua\">\nlocal IniFile = cIniFile();\nIniFile:ReadFile(\"somefile.ini\")\nlocal NumKeys = IniFile:GetNumKeys();\nfor k = 0, (NumKeys - 1) do\n\tlocal NumValues = IniFile:GetNumValues(k);\n\tLOG(\"key \\\"\" .. IniFile:GetKeyName(k) .. \"\\\" has \" .. NumValues .. \" values:\");\n\tfor v = 0, (NumValues - 1) do\n\t\tLOG(\"  value \\\"\" .. IniFile:GetValueName(k, v) .. \"\\\".\");\n\tend\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcInventory =\n\t\t{\n\t\t\tDesc = [[\nThis object is used to store the items that a {{cPlayer|cPlayer}} has. It also keeps track of what item the player has currently selected in their hotbar.\nInternally, the class uses three {{cItemGrid|cItemGrid}} objects to store the contents:\n<li>Armor</li>\n<li>Inventory</li>\n<li>Hotbar</li>\nThese ItemGrids are available in the API and can be manipulated by the plugins, too.</p>\n\t\t\t\t<p>\n\t\t\t\tWhen using the raw slot access functions, such as GetSlot() and SetSlot(), the slots are numbered\n\t\t\t\tconsecutively, each ItemGrid has its offset and count. To future-proff your plugins, use the named\n\t\t\t\tconstants instead of hard-coded numbers.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AllowNewStacks\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds an item to the storage; if AllowNewStacks is true (default), will also create new stacks in empty slots. Fills existing stacks first and fills the hotbar before the main inventory. Returns the number of items added\",\n\t\t\t\t},\n\t\t\t\tAddItems =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItems\",\n\t\t\t\t\t\t\tType = \"cItems\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AllowNewStacks\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Same as AddItem, but for several items at once\",\n\t\t\t\t},\n\t\t\t\tChangeSlotCount =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AddToCount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds AddToCount to the count of items in the specified slot. If the slot was empty, ignores the call. Returns the new count in the slot, or -1 if invalid SlotNum\",\n\t\t\t\t},\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Empties all slots\",\n\t\t\t\t},\n\t\t\t\tCopyToItems =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItems\",\n\t\t\t\t\t\t\tType = \"cItems\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Copies all non-empty slots into the cItems object provided; original cItems contents are preserved\",\n\t\t\t\t},\n\t\t\t\tDamageEquippedItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DamageAmount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HasDestroyed\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified damage (1 by default) to the currently equipped item. Removes the item and returns true if the item reached its max damage and was destroyed.\",\n\t\t\t\t},\n\t\t\t\tDamageItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DamageAmount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HasDestroyed\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified damage (1 by default) to the specified item. Removes the item and returns true if the item reached its max damage and was destroyed.\",\n\t\t\t\t},\n\t\t\t\tFindItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RecipeItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Finds an item in the shield, hotbar and inventory slots matching `ItemType` and `ItemDamage`. The actual item is returned, if none is found `nullptr`. This can be used to validate that the player has a specific type of item.\",\n\t\t\t\t},\n\t\t\t\tGetArmorGrid =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItemGrid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ItemGrid representing the armor grid (1 x 4 slots)\",\n\t\t\t\t},\n\t\t\t\tGetArmorSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ArmorSlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the specified armor slot contents. Note that the returned item is read-only\",\n\t\t\t\t},\n\t\t\t\tGetEquippedBoots =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item in the \\\"boots\\\" slot of the armor grid. Note that the returned item is read-only\",\n\t\t\t\t},\n\t\t\t\tGetEquippedChestplate =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item in the \\\"chestplate\\\" slot of the armor grid. Note that the returned item is read-only\",\n\t\t\t\t},\n\t\t\t\tGetEquippedHelmet =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item in the \\\"helmet\\\" slot of the armor grid. Note that the returned item is read-only\",\n\t\t\t\t},\n\t\t\t\tGetEquippedItem =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the currently selected item from the hotbar. Note that the returned item is read-only. Also note that the returned item is bound to the actual inventory slot - if a player moves another item into the slot, this object will update to the new item. Use a {{cItem}} constructor to make a copy if you need to store the contents of the slot.\",\n\t\t\t\t},\n\t\t\t\tGetEquippedLeggings =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item in the \\\"leggings\\\" slot of the armor grid. Note that the returned item is read-only\",\n\t\t\t\t},\n\t\t\t\tGetEquippedSlotNum =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the hotbar slot number for the currently selected item\",\n\t\t\t\t},\n\t\t\t\tGetHotbarGrid =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItemGrid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ItemGrid representing the hotbar grid (9 x 1 slots)\",\n\t\t\t\t},\n\t\t\t\tGetHotbarSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HotBarSlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the specified hotbar slot contents. Note that the returned item is read-only\",\n\t\t\t\t},\n\t\t\t\tGetShieldSlot =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns current item in shield slot.\",\n\t\t\t\t},\n\t\t\t\tGetInventoryGrid =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItemGrid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ItemGrid representing the main inventory (9 x 3 slots)\",\n\t\t\t\t},\n\t\t\t\tGetInventorySlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"InventorySlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the specified main inventory slot contents. Note that the returned item is read-only\",\n\t\t\t\t},\n\t\t\t\tGetOwner =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player whose inventory this object represents\",\n\t\t\t\t},\n\t\t\t\tGetSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the contents of the specified slot. Note that the returned item is read-only\",\n\t\t\t\t},\n\t\t\t\tHasItems =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if there are at least as many items of the specified type as in the parameter\",\n\t\t\t\t},\n\t\t\t\tHowManyCanFit =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemStack\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AllowNewStacks\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns number of items out of a_ItemStack that can fit in the storage. If AllowNewStacks is false, only considers slots already containing the specified item. AllowNewStacks defaults to true if not given.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemStack\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BeginSlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"EndSlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AllowNewStacks\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns how many items of the specified type would fit into the slot range specified. If AllowNewStacks is false, only considers slots already containing the specified item. AllowNewStacks defaults to true if not given.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tHowManyItems =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of the specified items that are currently stored\",\n\t\t\t\t},\n\t\t\t\tRemoveItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes the specified item from the inventory, as many as possible, up to the item's m_ItemCount. Returns the number of items that were removed.\",\n\t\t\t\t},\n\t\t\t\tRemoveOneEquippedItem =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes one item from the hotbar's currently selected slot. Returns true on success.\",\n\t\t\t\t},\n\t\t\t\tReplaceOneEquippedItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"TryOtherSlots\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes one item from the the current equipped item stack, and attempts to add the specified item stack back to the same slot. If it is not possible to place the item in the same slot, optionally (default true) tries to place the specified item elsewhere in the inventory. Returns the number of items successfully added. If the currently equipped slot is empty, its contents are simply set to the given Item.\",\n\t\t\t\t},\n\t\t\t\tSendEquippedSlot =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sends the equipped item slot to the client\",\n\t\t\t\t},\n\t\t\t\tSetArmorSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ArmorSlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the specified armor slot contents\",\n\t\t\t\t},\n\t\t\t\tSetEquippedSlotNum =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EquippedSlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the currently selected hotbar slot number\",\n\t\t\t\t},\n\t\t\t\tSetHotbarSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HotbarSlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the specified hotbar slot contents\",\n\t\t\t\t},\n\t\t\t\tSetInventorySlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"InventorySlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the specified main inventory slot contents\",\n\t\t\t\t},\n\t\t\t\tSetShieldSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the shield slot content\",\n\t\t\t\t},\n\t\t\t\tSetSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the specified slot contents\",\n\t\t\t\t},\n\t\t\t\tSetEquippedItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets current item in the equipped hotbar slot\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tinvArmorCount =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number of slots in the Armor part\",\n\t\t\t\t},\n\t\t\t\tinvArmorOffset =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Starting slot number of the Armor part\",\n\t\t\t\t},\n\t\t\t\tinvHotbarCount =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number of slots in the Hotbar part\",\n\t\t\t\t},\n\t\t\t\tinvHotbarOffset =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Starting slot number of the Hotbar part\",\n\t\t\t\t},\n\t\t\t\tinvInventoryCount =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number of slots in the main inventory part\",\n\t\t\t\t},\n\t\t\t\tinvInventoryOffset =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Starting slot number of the main inventory part\",\n\t\t\t\t},\n\t\t\t\tinvShieldCount =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number of slots in the Shield part\",\n\t\t\t\t},\n\t\t\t\tinvShieldOffset =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Starting slot number of the Shield part\",\n\t\t\t\t},\n\t\t\t\tinvNumSlots =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Total number of slots in a cInventory\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstantGroups =\n\t\t\t{\n\t\t\t\tSlotIndices =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"inv.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tRather than hardcoding numbers, use the following constants for slot indices and counts:\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcItem =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tcItem is what defines an item or stack of items in the game, it contains the item ID, damage,\n\t\t\t\tquantity and enchantments. Each slot in a {{cInventory}} class or a {{cItemGrid}} class is a cItem\n\t\t\t\tand each {{cPickup}} contains a cItem. The enchantments are contained in a separate\n\t\t\t\t{{cEnchantments}} class and are accessible through the m_Enchantments variable.</p>\n\t\t\t\t<p>\n\t\t\t\tTo test if a cItem object represents an empty item, do not compare the item type nor the item count,\n\t\t\t\tbut rather use the IsEmpty() function.</p>\n\t\t\t\t<p>\n\t\t\t\tTo translate from a cItem to its string representation, use the {{Globals#functions|global function}}\n\t\t\t\tItemToString(), ItemTypeToString() or ItemToFullString(). To translate from a string to a cItem,\n\t\t\t\tuse the StringToItem() global function.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddCount =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AmountToAdd\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified amount to the item count. Returns self (useful for chaining).\",\n\t\t\t\t},\n\t\t\t\tAddEnchantment =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Enchantment ID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Level\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FromBook\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the given enchantment at the given level to this item, following anvil enchantment combining rules. Returns the XP level cost of the addition. FromBook specifies whether to use the XP multiplier for books or the multiplier used for other items, if true it uses the multiplier for books.\",\n\t\t\t\t},\n\t\t\t\tAddEnchantmentsFromItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Additive\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LevelCost\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the enchantments from the specified item to this item, returning the cost as if this were an anvil.\",\n\t\t\t\t},\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Resets the instance to an empty item\",\n\t\t\t\t},\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Creates a new empty cItem object\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Count\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Damage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"EnchantmentString\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"CustomName\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Lore\",\n\t\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Creates a new cItem object of the specified type, count (1 by default), damage (0 by default), enchantments (non-enchanted by default), CustomName (empty by default) and Lore (string, empty by default)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Creates an exact copy of the cItem object in the parameter\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tCopyOne =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a copy of this object, with its count set to 1\",\n\t\t\t\t},\n\t\t\t\tDamageItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Amount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HasReachedMaxDamage\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified damage. Returns true when damage reaches max value and the item should be destroyed (but doesn't destroy the item)\",\n\t\t\t\t},\n\t\t\t\tEmpty =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Resets the instance to an empty item\",\n\t\t\t\t},\n\t\t\t\tEnchantByXPLevels =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NumXPLevels\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HasEnchanted\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Randomly enchants the item using the specified number of XP levels. Returns true if the item was enchanted, false if not (not enchantable / too many enchantments already).\",\n\t\t\t\t},\n\t\t\t\tGetEnchantability =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the enchantability of the item. Returns zero if the item doesn't have enchantability.\",\n\t\t\t\t},\n\t\t\t\tGetMaxDamage =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the maximum value for damage that this item can get before breaking; zero if damage is not accounted for for this item type\",\n\t\t\t\t},\n\t\t\t\tGetMaxStackSize =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the maximum stack size for this item.\",\n\t\t\t\t},\n\t\t\t\tIsBothNameAndLoreEmpty =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns if both the custom name and lore are not set.\",\n\t\t\t\t},\n\t\t\t\tIsCustomNameEmpty =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns if the custom name is empty.\",\n\t\t\t\t},\n\t\t\t\tIsDamageable =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if this item does account for its damage\",\n\t\t\t\t},\n\t\t\t\tIsEmpty =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if this object represents an empty item (zero count or invalid ItemType)\",\n\t\t\t\t},\n\t\t\t\tIsEnchantable =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FromBook\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is enchantable. If FromBook is true, the function is used in the anvil inventory with book enchantments. So it checks the \\\"only book enchantments\\\" too. Example: You can only enchant a hoe with a book.\",\n\t\t\t\t},\n\t\t\t\tIsEqual =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OtherItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the item in the parameter is the same as the one stored in the object (type, damage, lore, name and enchantments)\",\n\t\t\t\t},\n\t\t\t\tIsFullStack =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the item is stacked up to its maximum stacking\",\n\t\t\t\t},\n\t\t\t\tIsLoreEmpty =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Returns if the lore of the cItem is empty.\",\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tIsSameType =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OtherItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the item in the parameter is of the same ItemType as the one stored in the object. This is true even if the two items have different enchantments\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tVariables =\n\t\t\t{\n\t\t\t\tm_CustomName =\n\t\t\t\t{\n\t\t\t\t\tType = \"string\",\n\t\t\t\t\tNotes = \"The custom name for an item.\",\n\t\t\t\t},\n\t\t\t\tm_Enchantments =\n\t\t\t\t{\n\t\t\t\t\tType = \"{{cEnchantments|cEnchantments}}}\",\n\t\t\t\t\tNotes = \"The enchantments of the item.\",\n\t\t\t\t},\n\t\t\t\tm_ItemCount =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"Number of items in this stack\",\n\t\t\t\t},\n\t\t\t\tm_ItemDamage =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"The damage of the item. Zero means no damage. Maximum damage can be queried with GetMaxDamage()\",\n\t\t\t\t},\n\t\t\t\tm_ItemType =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"The item type. One of E_ITEM_ or E_BLOCK_ constants\",\n\t\t\t\t},\n\t\t\t\tm_LoreTable =\n\t\t\t\t{\n\t\t\t\t\tType = \"table\",\n\t\t\t\t\tNotes = \"The lore for an item. Represented as an array table of lines.\",\n\t\t\t\t},\n\t\t\t\tm_RepairCost =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"The repair cost of the item. The anvil need this value\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Usage notes\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tNote that the object contained in a cItem class is quite complex and quite often new Minecraft\n\t\t\t\t\t\tversions add more stuff. Therefore it is recommended to copy cItem objects using the\n\t\t\t\t\t\tcopy-constructor (\"local copy = cItem(original);\"), this is the only way that guarantees that\n\t\t\t\t\t\tthe object will be copied at full, even with future versions of Cuberite.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Example code\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe following code shows how to create items in several different ways (adapted from the Debuggers plugin):\n<pre class=\"prettyprint lang-lua\">\n-- empty item:\nlocal Item1 = cItem();\n\n-- enchanted sword, enchantment given as numeric string (bad style; see Item5):\nlocal Item2 = cItem(E_ITEM_DIAMOND_SWORD, 1, 0, \"1=1\");\n\n-- 1 undamaged shovel, no enchantment:\nlocal Item3 = cItem(E_ITEM_DIAMOND_SHOVEL);\n\n-- Add the Unbreaking enchantment. Note that Vanilla's levelcap isn't enforced:\nItem3.m_Enchantments:SetLevel(cEnchantments.enchUnbreaking, 4);\n\n-- 1 undamaged pickaxe, no enchantment:\nlocal Item4 = cItem(E_ITEM_DIAMOND_PICKAXE);\n\n-- Add multiple enchantments:\nItem4.m_Enchantments:SetLevel(cEnchantments.enchUnbreaking, 5);\nItem4.m_Enchantments:SetLevel(cEnchantments.enchEfficiency, 3);\n\n-- enchanted chestplate, enchantment given as textual stringdesc (good style)\nlocal Item5 = cItem(E_ITEM_DIAMOND_CHESTPLATE, 1, 0, \"thorns=1;unbreaking=3\");\n</pre>\n]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcItemFrame =\n\t\t{\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetItem =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\tIsConst = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item in the frame (readonly object, do not modify)\",\n\t\t\t\t},\n\t\t\t\tGetItemRotation =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the rotation from the item in the frame\",\n\t\t\t\t},\n\t\t\t\tSetItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Set the item in the frame\",\n\t\t\t\t},\n\t\t\t\tSetItemRotation =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemRotation\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Set the rotation from the item in the frame\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcItemGrid =\n\t\t{\n\t\t\tDesc = [[\nThis class represents a 2D array of items. It is used as the underlying storage and API for all cases that use a grid of items:\n<li>{{cChestEntity|Chest}} contents</li>\n<li>(TODO) Chest minecart contents</li>\n<li>{{cDispenserEntity|Dispenser}} contents</li>\n<li>{{cDropperEntity|Dropper}} contents</li>\n<li>{{cFurnaceEntity|Furnace}} contents (?)</li>\n<li>{{cHopperEntity|Hopper}} contents</li>\n<li>(TODO) Hopper minecart contents</li>\n<li>{{cPlayer|Player}} Inventory areas</li>\n<li>(TODO) Trapped chest contents</li>\n</p>\n\t\t<p>The items contained in this object are accessed either by a pair of XY coords, or a slot number (x + Width * y). There are functions available for converting between the two formats.\n]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemStack\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AllowNewStacks\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PrioritySlot\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds as many items out of ItemStack as can fit. If AllowNewStacks is set to false, only existing stacks can be topped up. If AllowNewStacks is set to true (default), empty slots can be used for the rest. If PrioritySlot is set to a non-negative value, then the corresponding slot will be used first (if empty or compatible with added items). If PrioritySlot is set to -1 (default), regular order applies. Returns the number of items that fit.\",\n\t\t\t\t},\n\t\t\t\tAddItems =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemStackList\",\n\t\t\t\t\t\t\tType = \"cItems\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AllowNewStacks\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PrioritySlot\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Same as AddItem, but works on an entire list of item stacks. The a_ItemStackList is modified to reflect the leftover items. If a_AllowNewStacks is set to false, only existing stacks can be topped up. If AllowNewStacks is set to true, empty slots can be used for the rest. If PrioritySlot is set to a non-negative value, then the corresponding slot will be used first (if empty or compatible with added items). If PrioritySlot is set to -1 (default), regular order applies. Returns the total number of items that fit.\",\n\t\t\t\t},\n\t\t\t\tChangeSlotCount =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AddToCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds AddToCount to the count of items in the specified slot. If the slot was empty, ignores the call. Returns the new count in the slot, or -1 if invalid SlotNum\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"AddToCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds AddToCount to the count of items in the specified slot. If the slot was empty, ignores the call. Returns the new count in the slot, or -1 if invalid slot coords\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Empties all slots\",\n\t\t\t\t},\n\t\t\t\tCopyToItems =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItems\",\n\t\t\t\t\t\t\tType = \"cItems\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Copies all non-empty slots into the {{cItems}} object provided; original cItems contents are preserved as well.\",\n\t\t\t\t},\n\t\t\t\tDamageItem =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DamageAmount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"HasReachedMaxDamage\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds the specified damage (1 by default) to the specified item, returns true if the item reached its max damage and should be destroyed (but doesn't destroy the item).\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"DamageAmount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"HasReachedMaxDamage\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds the specified damage (1 by default) to the specified item, returns true if the item reached its max damage and should be destroyed (but doesn't destroy the item).\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tEmptySlot =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Destroys the item in the specified slot\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Destroys the item in the specified slot\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tFindItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RecipeItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Finds an item within the grid matching `ItemType` and `ItemDamage`. The actual item is returned, if none is found `nullptr`.\",\n\t\t\t\t},\n\t\t\t\tGetFirstEmptySlot =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the SlotNumber of the first empty slot, -1 if all slots are full\",\n\t\t\t\t},\n\t\t\t\tGetFirstUsedSlot =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the SlotNumber of the first non-empty slot, -1 if all slots are empty\",\n\t\t\t\t},\n\t\t\t\tGetHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Y dimension of the grid\",\n\t\t\t\t},\n\t\t\t\tGetLastEmptySlot =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the SlotNumber of the last empty slot, -1 if all slots are full\",\n\t\t\t\t},\n\t\t\t\tGetLastUsedSlot =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the SlotNumber of the last non-empty slot, -1 if all slots are empty\",\n\t\t\t\t},\n\t\t\t\tGetNextEmptySlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"StartFrom\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the SlotNumber of the first empty slot following StartFrom, -1 if all the following slots are full\",\n\t\t\t\t},\n\t\t\t\tGetNextUsedSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"StartFrom\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the SlotNumber of the first non-empty slot following StartFrom, -1 if all the following slots are full\",\n\t\t\t\t},\n\t\t\t\tGetNumSlots =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the total number of slots in the grid (Width * Height)\",\n\t\t\t\t},\n\t\t\t\tGetSlot =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SlotNumber\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the item in the specified slot. Note that the item is read-only\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns the item in the specified slot. Note that the item is read-only\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetSlotCoords =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the X and Y coords for the specified SlotNumber. Returns \\\"-1, -1\\\" on invalid SlotNumber\",\n\t\t\t\t},\n\t\t\t\tGetSlotNum =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the SlotNumber for the specified slot coords. Returns -1 on invalid coords\",\n\t\t\t\t},\n\t\t\t\tGetWidth =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the X dimension of the grid\",\n\t\t\t\t},\n\t\t\t\tHasItems =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemStack\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if there are at least as many items of the specified type as in the parameter\",\n\t\t\t\t},\n\t\t\t\tHowManyCanFit =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemStack\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AllowNewStacks\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of the specified items that can fit in the storage. If AllowNewStacks is true (default), includes empty slots in the returned count.\",\n\t\t\t\t},\n\t\t\t\tHowManyItems =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of the specified item that are currently stored\",\n\t\t\t\t},\n\t\t\t\tIsSlotEmpty =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns true if the specified slot is empty, or an invalid slot is specified\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns true if the specified slot is empty, or an invalid slot is specified\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tRemoveItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemStack\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes the specified item from the grid, as many as possible, up to ItemStack's m_ItemCount. Returns the number of items that were removed.\",\n\t\t\t\t},\n\t\t\t\tRemoveOneItem =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Removes one item from the stack in the specified slot and returns it as a single cItem. Empty slots are skipped and an empty item is returned\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Removes one item from the stack in the specified slot and returns it as a single cItem. Empty slots are skipped and an empty item is returned\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSetSlot =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the specified slot to the specified item\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the specified slot to the specified item\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the specified slot to the specified item\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the specified slot to the specified item\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example: Add items to player inventory\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe following code tries to add 32 sticks to a player's main inventory:\n<pre class=\"prettyprint lang-lua\">\nlocal Items = cItem(E_ITEM_STICK, 32);\nlocal PlayerInventory = Player:GetInventory();\nlocal PlayerMainInventory = PlayerInventory:GetInventoryGrid();  -- PlayerMainInventory is of type cItemGrid\nlocal NumAdded = PlayerMainInventory:AddItem(Items);\nif (NumAdded == Items.m_ItemCount) then\n  -- All the sticks did fit\n  LOG(\"Added 32 sticks\");\nelse\n  -- Some (or all) of the sticks didn't fit\n  LOG(\"Tried to add 32 sticks, but only \" .. NumAdded .. \" could fit\");\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example: Damage an item\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe following code damages the helmet in the player's armor and destroys it if it reaches max damage:\n<pre class=\"prettyprint lang-lua\">\nlocal PlayerInventory = Player:GetInventory();\nlocal PlayerArmor = PlayerInventory:GetArmorGrid();  -- PlayerArmor is of type cItemGrid\nif (PlayerArmor:DamageItem(0)) then  -- Helmet is at SlotNum 0\n  -- The helmet has reached max damage, destroy it:\n  PlayerArmor:EmptySlot(0);\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcItems =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents a numbered collection (array) of {{cItem}} objects. The array indices start at\n\t\t\t\tzero, each consecutive item gets a consecutive index. This class is used for spawning multiple\n\t\t\t\tpickups or for mass manipulating an inventory.\n\t\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAdd =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds a new item to the end of the collection\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Adds a new item to the end of the collection\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tAddItemGrid =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemGrid\",\n\t\t\t\t\t\t\tType = \"cItemGrid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a copy of each item in the specified {{cItemGrid|ItemGrid}}.\",\n\t\t\t\t},\n\t\t\t\tClear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Removes all items from the collection\",\n\t\t\t\t},\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItems\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new empty cItems object\",\n\t\t\t\t},\n\t\t\t\tContains =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the collection contains an item that is fully equivalent to the parameter\",\n\t\t\t\t},\n\t\t\t\tContainsType =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the collection contains an item that is the same type as the parameter\",\n\t\t\t\t},\n\t\t\t\tDelete =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Index\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Deletes item at the specified index\",\n\t\t\t\t},\n\t\t\t\tGet =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Index\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item at the specified index\",\n\t\t\t\t},\n\t\t\t\tSet =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Index\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the item at the specified index to the specified item\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Index\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemCount\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"ItemDamage\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets the item at the specified index to the specified item\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSize =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of items in the collection\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcJson =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tExposes the Json parser and serializer available in the server. Plugins can parse Json strings into\n\t\t\t\tLua tables, and serialize Lua tables into Json strings easily.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tParse =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"InputString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Parses the Json in the input string into a Lua table. Returns nil and detailed error message if parsing fails.\",\n\t\t\t\t},\n\t\t\t\tSerialize =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"table\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"options\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Serializes the input table into a Json string. The options table, if present, is used to adjust the formatting of the serialized string, see below for details. <br/>Returns nil and error message if the table cannot be serialized (eg. contains both an array part and a dictionary part).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Serializer options\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe \"options\" parameter given to the cJson:Serialize() function is a dictionary-table of \"option\n\t\t\t\t\t\tname\" -> \"option value\". The serializer warns if any unknown options are used; the following\n\t\t\t\t\t\toptions are recognized:</p>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li><b>commentStyle</b> - either \"All\" or \"None\", specifies whether comments are written to the\n\t\t\t\t\t\toutput. Currently unused since comments cannot be represented in a Lua table</li>\n\t\t\t\t\t\t<li><b>indentation</b> - the string that is repeated for each level of indentation of the output.\n\t\t\t\t\t\tIf empty, the Json is compressed (without linebreaks).</li>\n\t\t\t\t\t\t<li><b>enableYAMLCompatibility</b> - bool manipulating the whitespace around the colons.</li>\n\t\t\t\t\t\t<li><b>dropNullPlaceholders</b> - bool specifying whether null placeholders should be dropped\n\t\t\t\t\t\tfrom the output</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example: Parsing a Json string\",\n\t\t\t\t\tContents = [==[\n\t\t\t\t\t\tThe following code, adapted from the Debuggers plugin, parses a simple Json string and verifies\n\t\t\t\t\t\tthe results:\n<pre class=\"prettyprint lang-lua\">\nlocal t1 = cJson:Parse([[{\"a\": 1, \"b\": \"2\", \"c\": [3, \"4\", 5]}]])\nassert(t1.a == 1)\nassert(t1.b == \"2\")\nassert(t1.c[1] == 3)\nassert(t1.c[2] == \"4\")\nassert(t1.c[3] == 5)\n</pre>\n\t\t\t\t\t]==],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example: Serializing into a Json string\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe following code, adapted from the Debuggers plugin, serializes a simple Lua table into a\n\t\t\t\t\t\tstring, using custom indentation:\n<pre class=\"prettyprint lang-lua\">\nlocal s1 = cJson:Serialize({a = 1, b = \"2\", c = {3, \"4\", 5}}, {indentation = \"  \"})\nLOG(\"Serialization result: \" .. (s1 or \"<nil>\"))\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcLuaWindow =\n\t\t{\n\t\t\tDesc = [[\nThis class is used by plugins wishing to display a custom window to the player, unrelated to block entities or entities near the player. The window can be of any type and have any contents that the plugin defines. Callbacks for when the player modifies the window contents and when the player closes the window can be set.\n</p>\n\t\t<p>This class inherits from the {{cWindow|cWindow}} class, so all cWindow's functions and constants can be used, in addition to the cLuaWindow-specific functions listed below.\n</p>\n\t\t<p>The contents of this window are represented by a {{cWindow|cWindow}}:GetSlot() etc. or {{cPlayer|cPlayer}}:GetInventory() to access the player inventory.\n</p>\n\t\t<p>When creating a new cLuaWindow object, you need to specify both the window type and the contents' width and height. Note that Cuberite accepts any combination of these, but opening a window for a player may crash their client if the contents' dimensions don't match the client's expectations.\n</p>\n\t\t<p>To open the window for a player, call {{cPlayer|cPlayer}}:OpenWindow(). Multiple players can open window of the same cLuaWindow object. All players see the same items in the window's contents (like chest, unlike crafting table).\n]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"WindowType\",\n\t\t\t\t\t\t\tType = \"cWindow#WindowType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ContentsWidth\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ContentsHeight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Title\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new object of this class. The window is not shown to any player yet.\",\n\t\t\t\t},\n\t\t\t\tGetContents =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItemGrid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the cItemGrid object representing the internal storage in this window\",\n\t\t\t\t},\n\t\t\t\tSetOnClicked =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OnClickedCallback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the function that the window will call when it is about to process a click from a player. See {{#additionalinfo_1|below}} for the signature of the callback function.\",\n\t\t\t\t},\n\t\t\t\tSetOnClosing =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OnClosingCallback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the function that the window will call when it is about to be closed by a player\",\n\t\t\t\t},\n\t\t\t\tSetOnSlotChanged =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OnSlotChangedCallback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the function that the window will call when a slot is changed by a player\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Callbacks\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe object calls the following functions at the appropriate time:\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"OnClicked Callback\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThis callback, settable via the SetOnClicked() function, will be called when the player clicks a slot in the window. The callback can cancel the click.</p>\n<pre class=\"prettyprint lang-lua\">\nfunction OnWindowClicked(a_Window, a_Player, a_SlotNum, a_ClickAction, a_ClickedItem)\n</pre>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\tThe a_Window parameter is the cLuaWindow object representing the window, a_Player is the player who made the click, a_SlotNum is the slot the player clicked, a_ClickAction is the type of click the player made, and a_ClickedItem is the item the player clicked on, if applicable. If the function returns true, the click is cancelled (internally, the server resends the window slots to the player to keep the player in sync).\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"OnClosing Callback\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThis callback, settable via the SetOnClosing() function, will be called when the player tries to close the window, or the window is closed for any other reason (such as a player disconnecting).</p>\n<pre class=\"prettyprint lang-lua\">\nfunction OnWindowClosing(a_Window, a_Player, a_CanRefuse)\n</pre>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\tThe a_Window parameter is the cLuaWindow object representing the window, a_Player is the player for whom the window is about to close. a_CanRefuse specifies whether the callback can refuse the closing. If the callback returns true and a_CanRefuse is true, the window is not closed (internally, the server sends a new OpenWindow packet to the client).\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"OnSlotChanged Callback\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThis callback, settable via the SetOnSlotChanged() function, will be called whenever the contents of any slot in the window's contents (i. e. NOT in the player inventory!) changes.</p>\n<pre class=\"prettyprint lang-lua\">\nfunction OnWindowSlotChanged(a_Window, a_SlotNum)\n</pre>\n\t\t\t\t\t\t<p>The a_Window parameter is the cLuaWindow object representing the window, a_SlotNum is the slot number. There is no reference to a {{cPlayer}}, because the slot change needn't originate from the player action. To get or set the slot, you'll need to retrieve a cPlayer object, for example by calling {{cWorld|cWorld}}:DoWithPlayer().\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>Any returned values are ignored.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Example\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThis example is taken from the Debuggers plugin, used to test the API functionality. It opens a window and refuse to close it 3 times. It also logs slot changes to the server console and prevents shift-clicking in the window.\n<pre class=\"prettyprint lang-lua\">\n-- Callback that refuses to close the window twice, then allows:\nlocal Attempt = 1;\nlocal OnClosing = function(Window, Player, CanRefuse)\n\tPlayer:SendMessage(\"Window closing attempt #\" .. Attempt .. \"; CanRefuse = \" .. tostring(CanRefuse));\n\tAttempt = Attempt + 1;\n\treturn CanRefuse and (Attempt <= 3);  -- refuse twice, then allow, unless CanRefuse is set to true\nend\n\n-- Log the slot changes:\nlocal OnSlotChanged = function(Window, SlotNum)\n\tLOG(\"Window \\\"\" .. Window:GetWindowTitle() .. \"\\\" slot \" .. SlotNum .. \" changed.\");\nend\n\n-- Prevent shift-clicking:\nlocal OnClicked = function(Window, ClickingPlayer, SlotNum, ClickAction, ClickedItem)\n\tif ClickAction == caShiftLeftClick then\n\t\treturn true\n\tend\nend\n\n-- Set window contents:\n-- a_Player is a cPlayer object received from the outside of this code fragment\nlocal Window = cLuaWindow(cWindow.wtHopper, 3, 3, \"TestWnd\");\nWindow:SetSlot(a_Player, 0, cItem(E_ITEM_DIAMOND, 64));\nWindow:SetOnClicked(OnClicked);\nWindow:SetOnClosing(OnClosing);\nWindow:SetOnSlotChanged(OnSlotChanged);\n\n-- Open the window:\na_Player:OpenWindow(Window);\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cWindow\",\n\t\t},\n\t\tcMap =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class encapsulates a single in-game colored map.</p>\n\t\t\t\t<p>\n\t\t\t\tThe contents (i.e. pixel data) of a cMap are dynamically updated by each\n\t\t\t\ttracked {{cPlayer}} instance. Furthermore, a cMap maintains and periodically\n\t\t\t\tupdates\ta list of map decorators, which are objects drawn on the map that\n\t\t\t\tcan freely move (e.g. Player and item frame pointers).\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetCenterX =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the X coord of the map's center.\",\n\t\t\t\t},\n\t\t\t\tGetCenterZ =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Y coord of the map's center.\",\n\t\t\t\t},\n\t\t\t\tGetDimension =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"eDimension\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the dimension of the associated world.\",\n\t\t\t\t},\n\t\t\t\tGetHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the height of the map.\",\n\t\t\t\t},\n\t\t\t\tGetID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the numerical ID of the map. (The item damage value)\",\n\t\t\t\t},\n\t\t\t\tGetName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the name of the map.\",\n\t\t\t\t},\n\t\t\t\tGetNumPixels =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of pixels in this map.\",\n\t\t\t\t},\n\t\t\t\tGetPixel =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PixelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PixelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ColorID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the color of the specified pixel.\",\n\t\t\t\t},\n\t\t\t\tGetPixelWidth =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the width of a single pixel in blocks.\",\n\t\t\t\t},\n\t\t\t\tGetScale =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the scale of the map. Range: [0,4]\",\n\t\t\t\t},\n\t\t\t\tGetWidth =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the width of the map.\",\n\t\t\t\t},\n\t\t\t\tGetWorld =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the associated world.\",\n\t\t\t\t},\n\t\t\t\tResize =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Width\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Height\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Resizes the map. WARNING: This will erase the pixel data.\",\n\t\t\t\t},\n\t\t\t\tSetPixel =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PixelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PixelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ColorID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the color of the specified pixel. Returns false on error (Out of range).\",\n\t\t\t\t},\n\t\t\t\tSetPosition =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CenterX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CenterZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Relocates the map. The pixel data will not be modified.\",\n\t\t\t\t},\n\t\t\t\tSetScale =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Scale\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Rescales the map. The pixel data will not be modified.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tE_BASE_COLOR_BLUE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_BROWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_DARK_BROWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_DARK_GRAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_DARK_GREEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_GRAY_1 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_GRAY_2 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_LIGHT_BROWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_LIGHT_GRAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_LIGHT_GREEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_PALE_BLUE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_RED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_TRANSPARENT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_BASE_COLOR_WHITE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcMapManager =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class is associated with a single {{cWorld}} instance and manages a list of maps.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tDoWithMap =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MapID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"If a map with the specified ID exists, calls the CallbackFunction for that map. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cMap|Map}})</pre> Returns true if the map was found and the callback called, false if map not found.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcMojangAPI =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tProvides interface to various API functions that Mojang provides through their servers. Note that\n\t\t\t\tsome of these calls will wait for a response from the network, and so shouldn't be used while the\n\t\t\t\tserver is fully running (or at least when there are players connected) to avoid percepted lag.</p>\n\t\t\t\t<p>\n\t\t\t\tAll the functions are static, call them using the <code>cMojangAPI:Function()</code> convention.</p>\n\t\t\t\t<p>\n\t\t\t\tMojang uses two formats for UUIDs, short and dashed. Cuberite will accept either format for any\n\t\t\t\tfunctions taking a UUID. The MakeUUIDShort() and MakeUUIDDashed() functions are provided for plugins\n\t\t\t\tto use for conversion between the two formats.</p>\n\t\t\t\t<p>\n\t\t\t\tThis class will cache values returned by the API service. The cache will hold the values for 7 days\n\t\t\t\tby default, after that, they will no longer be available. This is in order to not let the server get\n\t\t\t\tbanned from using the API service, since they are rate-limited to 600 queries per 10 minutes. The\n\t\t\t\tcache contents also gets updated whenever a player successfully joins, since that makes the server\n\t\t\t\tcontact the API service, too, and retrieve the relevant data.</p>\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddPlayerNameToUUIDMapping =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UUID\",\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified PlayerName-to-UUID mapping into the cache, with current timestamp.\",\n\t\t\t\t},\n\t\t\t\tGetPlayerNameFromUUID =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UUID\",\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UseOnlyCached\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the playername that corresponds to the given UUID, or an empty string on error. If UseOnlyCached is false (the default), queries the Mojang servers if the UUID is not in the cache. The UUID can be either short or dashed. <br /><b>WARNING</b>: Do NOT use this function with UseOnlyCached set to false while the server is running. Only use it when the server is starting up (inside the Initialize() method), otherwise you will lag the server severely.\",\n\t\t\t\t},\n\t\t\t\tGetUUIDFromPlayerName =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UseOnlyCached\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UUID\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the (short) UUID that corresponds to the given playername, or an empty string on error. If UseOnlyCached is false (the default), queries the Mojang servers if the playername is not in the cache. <br /><b>WARNING</b>: Do NOT use this function with UseOnlyCached set to false while the server is running. Only use it when the server is starting up (inside the Initialize() method), otherwise you will lag the server severely.\",\n\t\t\t\t},\n\t\t\t\tGetUUIDsFromPlayerNames =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerNames\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UseOnlyCached\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a table that contains the map, 'PlayerName' -> '(short) UUID', for all valid playernames in the input array-table. PlayerNames not recognized will not be set in the returned map. If UseOnlyCached is false (the default), queries the Mojang servers for the results that are not in the cache. <br /><b>WARNING</b>: Do NOT use this function with UseOnlyCached set to false while the server is running. Only use it when the server is starting up (inside the Initialize() method), otherwise you will lag the server severely.\",\n\t\t\t\t},\n\t\t\t\tMakeUUIDDashed =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UUID\",\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DashedUUID\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts the UUID to a dashed format (\\\"01234567-8901-2345-6789-012345678901\\\"). An alias for cUUID:ToLongString()\",\n\t\t\t\t},\n\t\t\t\tMakeUUIDShort =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UUID\",\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShortUUID\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts the UUID to a short format (without dashes, \\\"01234567890123456789012345678901\\\"). An alias for cUUID:ToShortString()\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcMonster =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class is the base class for all computer-controlled mobs in the game.</p>\n\t\t\t\t<p>\n\t\t\t\tTo spawn a mob in a world, use the {{cWorld}}:SpawnMob() function.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tBurnsInDaylight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether the mob burns in daylight.\",\n\t\t\t\t},\n\t\t\t\tCanBeLeashed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether the mob can be leashed.\",\n\t\t\t\t},\n\t\t\t\tFamilyFromType =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobFamily\",\n\t\t\t\t\t\t\tType = \"cMonster#eFamily\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the mob family ({{cMonster#eFamily|mfXXX}} constants) based on the mob type ({{Globals#eMonsterType|mtXXX}} constants)\",\n\t\t\t\t},\n\t\t\t\tGetAge =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the age of the monster\",\n\t\t\t\t},\n\t\t\t\tGetCustomName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Gets the custom name of the monster. If no custom name is set, the function returns an empty string.\",\n\t\t\t\t},\n\t\t\t\tGetLeashedTo =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LeashedTo\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the entity to where this mob is leashed, returns nil if it's not leashed\",\n\t\t\t\t},\n\t\t\t\tGetMobFamily =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobFamily\",\n\t\t\t\t\t\t\tType = \"cMonster#eFamily\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns this mob's family ({{cMonster#eFamily|mfXXX}} constant)\",\n\t\t\t\t},\n\t\t\t\tGetMobType =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the type of this mob ({{Globals#eMonsterType|mtXXX}} constant)\",\n\t\t\t\t},\n\t\t\t\tGetRelativeWalkSpeed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the walk speed multiplier of this mob. Base is set in monsters.ini (will default to 1 if not set).\",\n\t\t\t\t},\n\t\t\t\tHasCustomName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the monster has a custom name.\",\n\t\t\t\t},\n\t\t\t\tIsBaby =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the monster is a baby\",\n\t\t\t\t},\n\t\t\t\tIsCustomNameAlwaysVisible =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Is the custom name of this monster always visible? If not, you only see the name when you sight the mob.\",\n\t\t\t\t},\n\t\t\t\tIsLeashed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether the monster is leashed to an entity.\",\n\t\t\t\t},\n\t\t\t\tLeashTo =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Entity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Leash the monster to an entity.\",\n\t\t\t\t},\n\t\t\t\tMobTypeToString =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the string representing the given mob type ({{Globals#eMonsterType|mtXXX}} constant), or empty string if unknown type.\",\n\t\t\t\t},\n\t\t\t\tMobTypeToVanillaName =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the vanilla name of the given mob type, or empty string if unknown type.\",\n\t\t\t\t},\n\t\t\t\tMoveToPosition =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Start moving (using a pathfinder) towards the specified position\",\n\t\t\t\t},\n\t\t\t\tSetAge =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Age\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the age of the monster\",\n\t\t\t\t},\n\t\t\t\tSetBurnsInDaylight =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BurnsInDaylight\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick\",\n\t\t\t\t},\n\t\t\t\tSetCanBeLeashed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CanBeLeashed\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets whether the mob can be leashed, for extensibility in plugins\"\n\t\t\t\t},\n\t\t\t\tSetCustomName =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CustomName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the custom name of the monster. You see the name over the monster. If you want to disable the custom name, simply set an empty string.\",\n\t\t\t\t},\n\t\t\t\tSetCustomNameAlwaysVisible =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsCustomNameAlwaysVisible\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the custom name visiblity of this monster. If it's false, you only see the name when you sight the mob. If it's true, you always see the custom name.\",\n\t\t\t\t},\n\t\t\t\tSetRelativeWalkSpeed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelativeWalkSpeed\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the walk speed multiplier of this mob. Base is set in monsters.ini (will default to 1 if not set).\",\n\t\t\t\t},\n\t\t\t\tStringToMobType =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobTypeString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the mob type ({{Globals#eMonsterType|mtXXX}} constant) parsed from the string type (\\\"creeper\\\"), or mtInvalidType if unrecognized.\",\n\t\t\t\t},\n\t\t\t\tUnleash =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShouldDropLeashPickup\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Unleash the monster.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tmfAmbient =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Family: ambient (bat)\",\n\t\t\t\t},\n\t\t\t\tmfHostile =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Family: hostile (blaze, cavespider, creeper, enderdragon, enderman, ghast, giant, magmacube, silverfish, skeleton, slime, spider, witch, wither, zombie, zombiepigman)\",\n\t\t\t\t},\n\t\t\t\tmfPassive =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Family: passive (chicken, cow, horse, irongolem, mooshroom, ocelot, pig, sheep, snowgolem, villager, wolf)\",\n\t\t\t\t},\n\t\t\t\tmfWater =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Family: water (squid)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstantGroups =\n\t\t\t{\n\t\t\t\teFamily =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"mf.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tMobs are divided into families. The following constants are used for individual family types:\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cPawn\",\n\t\t},\n\t\tcObjective =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents a single scoreboard objective.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddScore =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"number\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Score\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a value to the score of the specified player and returns the new value.\",\n\t\t\t\t},\n\t\t\t\tGetDisplayName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the display name of the objective. This name will be shown to the connected players.\",\n\t\t\t\t},\n\t\t\t\tGetName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the internal name of the objective.\",\n\t\t\t\t},\n\t\t\t\tGetScore =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Score\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the score of the specified player.\",\n\t\t\t\t},\n\t\t\t\tGetType =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"eType\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the type of the objective. (i.e what is being tracked)\",\n\t\t\t\t},\n\t\t\t\tReset =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Resets the scores of the tracked players.\",\n\t\t\t\t},\n\t\t\t\tResetScore =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reset the score of the specified player.\",\n\t\t\t\t},\n\t\t\t\tSetDisplayName =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the display name of the objective.\",\n\t\t\t\t},\n\t\t\t\tSetScore =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Score\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the score of the specified player.\",\n\t\t\t\t},\n\t\t\t\tSubScore =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"number\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Score\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Subtracts a value from the score of the specified player and returns the new value.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\totAchievement =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totDeathCount =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totDummy =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totHealth =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totPlayerKillCount =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totStat =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totStatBlockMine =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totStatEntityKill =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totStatEntityKilledBy =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totStatItemBreak =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totStatItemCraft =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totStatItemUse =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\totTotalKillCount =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcPainting =\n\t\t{\n\t\t\tDesc = \"This class represents a painting in the world. These paintings are special and different from Vanilla in that they can be critical-hit.\",\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the name of the painting\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcPawn =\n\t\t{\n\t\t\tDesc = \"cPawn is a controllable pawn object, controlled by either AI or a player. cPawn inherits all functions and members of {{cEntity}}\\\n\",\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddEntityEffect =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EffectType\",\n\t\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EffectDurationTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EffectIntensity\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DistanceModifier\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Applies an entity effect. Checks with plugins if they allow the addition. EffectIntensity is the level of the effect (0 = Potion I, 1 = Potion II, etc). DistanceModifier is the scalar multiplied to the potion duration (only applies to splash potions).\",\n\t\t\t\t},\n\t\t\t\tClearEntityEffects =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Removes all currently applied entity effects\",\n\t\t\t\t},\n\t\t\t\tFindTeleportDestination =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"HeightRequired\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"NumTries\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Destination\",\n\t\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MinBoxCorner\",\n\t\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MaxBoxCorner\",\n\t\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Function to find suitable teleport destination in or below box. Returns true and places result in Destination if found, otherwise returns false. Details at: {{https://minecraft.wiki/w/Enderman#Teleportation}}.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"HeightRequired\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"NumTries\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Destination\",\n\t\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BoundingBox\",\n\t\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Function to find suitable teleport destination in or below box. Returns true and places result in Destination if found, otherwise returns false. Details at: {{https://minecraft.wiki/w/Enderman#Teleportation}}.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"HeightRequired\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"NumTries\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Centre\",\n\t\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"HalfCubeWidth\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Function to find suitable teleport destination in or below box. Returns true and places result in Destination if found, otherwise returns false. Details at: {{https://minecraft.wiki/w/Enderman#Teleportation}}.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tHasEntityEffect =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EffectType\",\n\t\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true, if the supplied entity effect type is currently applied\",\n\t\t\t\t},\n\t\t\t\tRemoveEntityEffect =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EffectType\",\n\t\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes a currently applied entity effect\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcEnderCrystal =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents an ender crystal. This entity can be spawned by using {{cWorld#SpawnEnderCrystal_1|cWorld:SpawnEnderCrystal}}.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tDisplaysBeam =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns true if the ender crystal displays its beam.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tGetBeamTarget =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Block position the beam is pointing to.\",\n\t\t\t\t},\n\t\t\t\tSetBeamTarget =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BeamTarget\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the target of the beam of this ender crystal.\",\n\t\t\t\t},\n\t\t\t\tSetDisplayBeam =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DisplaysBeam\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets if the ender crystal should display its beam.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSetShowBottom =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShowsBottom\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sets if the ender crystal should broadcast its bedrock base.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tShowsBottom =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Returns true if the bedrock base is displayed.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcExpOrb =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents an experience orb. This entity can be spawned by using {{cWorld#SpawnExperienceOrb_1|cWorld:SpawnExperienceOrb}}.\n\t\t\t\tIt's also spawned when a monster is killed or a player is mining coal. The default lifetime of an experience orb is 5 mins.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetAge =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of ticks that this experience orb has existed.\",\n\t\t\t\t},\n\t\t\t\tSetAge =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the experience orb's age, in ticks.\",\n\t\t\t\t},\n\t\t\t\tGetReward =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the experience amount.\",\n\t\t\t\t},\n\t\t\t\tSetReward =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the experience amount.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcFallingBlock =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents a falling block. This entity can be spawned by using {{cWorld#SpawnFallingBlock_1|cWorld:SpawnFallingBlock}}.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetBlockType =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block type of the falling block.\",\n\t\t\t\t},\n\t\t\t\tGetBlockMeta =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block meta of the falling block.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcBoat =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents a boat. This entity can be spawned by using {{cWorld#SpawnBoat_1|cWorld:SpawnBoat}}.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetMaterial =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"cBoat#eMaterial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the material of the boat.\",\n\t\t\t\t},\n\t\t\t\tMaterialToString =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"cBoat#eMaterial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the boat material as a string.\",\n\t\t\t\t},\n\t\t\t\tItemToMaterial =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"cBoat#eMaterial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the eMaterial that should be used for a boat created from the specified item. Returns bmOak if not a boat item.\",\n\t\t\t\t},\n\t\t\t\tMaterialToItem =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"cBoat#eMaterial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the boat item of the boat material\",\n\t\t\t\t},\n\t\t\t\tStringToMaterial =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"cBoat#eMaterial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the boat material for the passed string. Returns oak if not valid.\",\n\t\t\t\t},\n\t\t\t\tSetMaterial =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"cBoat#eMaterial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Set the material of the boat.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tbmOak =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tbmSpruce =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tbmBirch =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tbmJungle =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tbmAcacia =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tbmDarkOak =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstantGroups =\n\t\t\t{\n\t\t\t\teMaterial =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"bm.*\",\n\t\t\t\t\tTextBefore = \"These constans are the different wood materials of the boat.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcPickup =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents a pickup entity (an item that the player or mobs can pick up). It is also\n\t\t\t\tcommonly known as \"drops\". With this class you could create your own \"drop\" or modify those\n\t\t\t\tcreated automatically. The default lifetime of a pickup is 5 mins.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tCanCombine =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether this pickup is allowed to combine with other similar pickups.\",\n\t\t\t\t},\n\t\t\t\tCollectedBy =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Entity\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"WasCollected\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Tries to make the entity collect the pickup. Returns true if the pickup was collected, at least partially.\",\n\t\t\t\t},\n\t\t\t\tGetAge =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of ticks that the pickup has existed.\",\n\t\t\t\t},\n\t\t\t\tGetItem =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item represented by this pickup\",\n\t\t\t\t},\n\t\t\t\tGetLifetime =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the total length of this pickup's lifespan, in ticks.\",\n\t\t\t\t},\n\t\t\t\tIsCollected =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if this pickup has already been collected (is waiting to be destroyed)\",\n\t\t\t\t},\n\t\t\t\tIsPlayerCreated =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the pickup was created by a player\",\n\t\t\t\t},\n\t\t\t\tSetAge =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AgeTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the pickup's age, in ticks.\",\n\t\t\t\t},\n\t\t\t\tSetCanCombine =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CanCombine\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets whether this pickup is allowed to combine with other similar pickups.\",\n\t\t\t\t},\n\t\t\t\tSetLifetime =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LifeTimeInTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the total lifespan of this pickup before it despawns, in ticks. Does not reset the age of the pickup, use SetAge(0). If new lifetime is less than the current age, pickup will despawn.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcPlayer =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class describes a player in the server. cPlayer inherits all functions and members of\n\t\t\t\t{{cPawn|cPawn}}. It handles all the aspects of the gameplay, such as hunger, sprinting, inventory\n\t\t\t\tetc.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddFoodExhaustion =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Exhaustion\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified number to the food exhaustion. Only positive numbers expected.\",\n\t\t\t\t},\n\t\t\t\tCalcLevelFromXp =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"XPAmount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the level which is reached with the specified amount of XP. Inverse of XpForLevel().\",\n\t\t\t\t},\n\t\t\t\tCanFly =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns if the player is able to fly.\",\n\t\t\t\t},\n\t\t\t\tCanMobsTarget =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns if the player can be targeted by mobs.\",\n\t\t\t\t},\n\t\t\t\tCloseWindow =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CanRefuse\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Closes the currently open UI window. If CanRefuse is true (default), the window may refuse the closing.\",\n\t\t\t\t},\n\t\t\t\tCloseWindowIfID =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"WindowID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CanRefuse\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Closes the currently open UI window if its ID matches the given ID. If CanRefuse is true (default), the window may refuse the closing.\",\n\t\t\t\t},\n\t\t\t\tDeltaExperience =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DeltaXP\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds or removes XP from the current XP amount. Won't allow XP to go negative. Returns the new experience, -1 on error (XP overflow).\",\n\t\t\t\t},\n\t\t\t\tFeed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AddFood\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AddSaturation\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Tries to add the specified amounts to food level and food saturation level (only positive amounts expected). Returns true if player was hungry and the food was consumed, false if too satiated.\",\n\t\t\t\t},\n\t\t\t\tForceSetSpeed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Direction\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Forces the player to move to the given direction.\",\n\t\t\t\t},\n\t\t\t\tFreeze =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Location\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Teleports the player to \\\"Location\\\" and prevents them from moving, locking them in place until unfreeze() is called\",\n\t\t\t\t},\n\t\t\t\tGetClientHandle =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the client handle representing the player's connection. May be nil (AI players).\",\n\t\t\t\t},\n\t\t\t\tGetColor =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the full color code to be used for this player's messages (based on their rank). Prefix player messages with this code.\",\n\t\t\t\t},\n\t\t\t\tGetCurrentXp =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the current amount of XP\",\n\t\t\t\t},\n\t\t\t\tGetCustomName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the custom name of this player. If the player hasn't a custom name, it will return an empty string.\",\n\t\t\t\t},\n\t\t\t\tGetDraggingItem =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item the player is dragging in a UI window.\"\n\t\t\t\t},\n\t\t\t\tGetEffectiveGameMode =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"GameMode\",\n\t\t\t\t\t\t\tType = \"eGameMode\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"(OBSOLETE) Returns the current resolved game mode of the player. If the player is set to inherit the world's gamemode, returns that instead. See also GetGameMode() and IsGameModeXXX() functions. Note that this function is the same as GetGameMode(), use that function instead.\",\n\t\t\t\t},\n\t\t\t\tGetEquippedItem =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item that the player is currently holding; empty item if holding nothing.\",\n\t\t\t\t},\n\t\t\t\tGetEyeHeight =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the height of the player's eyes, in absolute coords\",\n\t\t\t\t},\n\t\t\t\tGetEyePosition =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EyePositionVector\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the position of the player's eyes, as a {{Vector3d}}\",\n\t\t\t\t},\n\t\t\t\tGetFloaterID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Entity ID of the fishing hook floater that belongs to the player. Returns -1 if no floater is associated with the player. FIXME: Undefined behavior when the player has used multiple fishing rods simultanously.\",\n\t\t\t\t},\n\t\t\t\tGetFlyingMaxSpeed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the maximum flying speed, relative to the default game flying speed. Defaults to 1, but plugins may modify it for faster or slower flying.\",\n\t\t\t\t},\n\t\t\t\tGetFoodExhaustionLevel =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the food exhaustion level\",\n\t\t\t\t},\n\t\t\t\tGetFoodLevel =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the food level (number of half-drumsticks on-screen)\",\n\t\t\t\t},\n\t\t\t\tGetFoodSaturationLevel =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the food saturation (overcharge of the food level, is depleted before food level)\",\n\t\t\t\t},\n\t\t\t\tGetFoodTickTimer =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of ticks past the last food-based heal or damage action; when this timer reaches 80, a new heal / damage is applied.\",\n\t\t\t\t},\n\t\t\t\tGetGameMode =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"GameMode\",\n\t\t\t\t\t\t\tType = \"eGameMode\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's gamemode. The player may have their gamemode unassigned, in which case they inherit the gamemode from the current {{cWorld|world}}.<br /> <b>NOTE:</b> Instead of comparing the value returned by this function to the gmXXX constants, use the IsGameModeXXX() functions. These functions handle the gamemode inheritance automatically.\",\n\t\t\t\t},\n\t\t\t\tGetInventory =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Inventory\",\n\t\t\t\t\t\t\tType = \"cInventory\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's inventory\",\n\t\t\t\t},\n\t\t\t\tGetIP =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the IP address of the player, if available. Returns an empty string if there's no IP to report.\",\n\t\t\t\t},\n\t\t\t\tGetLastBedPos =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's respawn position. The player is guaranteed to respawn from death here if {{cPlayer}}:IsRespawnPointForced is true or if a bed exists at this position.\",\n\t\t\t\t},\n\t\t\t\tGetMaxSpeed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's current maximum speed, relative to the game default speed. Takes into account the sprinting / flying status.\",\n\t\t\t\t},\n\t\t\t\tGetName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's name\",\n\t\t\t\t},\n\t\t\t\tGetNormalMaxSpeed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's maximum walking speed, relative to the game default speed. Defaults to 1, but plugins may modify it for faster or slower walking.\",\n\t\t\t\t},\n\t\t\t\tGetPermissions =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns an array-table of all permissions (strings) that the player has assigned to them through their rank.\",\n\t\t\t\t},\n\t\t\t\tGetPlayerListName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the name that is used in the playerlist.\",\n\t\t\t\t},\n\t\t\t\tGetPrefix =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the prefix to player names for messages (based on their rank), may contain @ format codes.\",\n\t\t\t\t},\n\t\t\t\tGetRestrictions =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns an array-table of all the restrictions that the player has assigned to them.\",\n\t\t\t\t},\n\t\t\t\tGetSprintingMaxSpeed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's maximum sprinting speed, relative to the game default speed. Defaults to 1.3, but plugins may modify it for faster or slower sprinting.\",\n\t\t\t\t},\n\t\t\t\tGetSkinParts =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's current set of skin part flags.  This is a bitwise OR of various {{Globals#eSkinPart|eSkinPart}} constants.  Note that HasSkinPart may be easier to use in most situations.\",\n\t\t\t\t},\n\t\t\t\tGetStatistics =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"StatisticsManager\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the player's statistics manager.\"\n\t\t\t\t},\n\t\t\t\tGetSuffix =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the suffix to player names for messages (based on their rank), may contain @ format codes.\",\n\t\t\t\t},\n\t\t\t\tGetTeam =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cTeam\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the team that the player belongs to, or nil if none.\",\n\t\t\t\t},\n\t\t\t\tGetThrowSpeed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SpeedCoeff\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the speed vector for an object thrown with the specified speed coeff. Basically returns the normalized look vector multiplied by the coeff, with a slight random variation.\",\n\t\t\t\t},\n\t\t\t\tGetThrowStartPos =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the position where the projectiles should start when thrown by this player.\",\n\t\t\t\t},\n\t\t\t\tGetUUID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the (short) UUID that the player is using. Could be empty string for players that don't have a Mojang account assigned to them (in the future, bots for example).\",\n\t\t\t\t},\n\t\t\t\tGetWindow =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cWindow\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the currently open UI window. If the player doesn't have any UI window open, returns the inventory window.\",\n\t\t\t\t},\n\t\t\t\tGetXpLevel =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the current XP level (based on current XP amount).\",\n\t\t\t\t},\n\t\t\t\tGetXpLifetimeTotal =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the amount of XP that has been accumulated throughout the player's lifetime.\",\n\t\t\t\t},\n\t\t\t\tGetXpPercentage =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the percentage of the experience bar - the amount of XP towards the next XP level. Between 0 and 1.\",\n\t\t\t\t},\n\t\t\t\tHasCustomName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player has a custom name.\",\n\t\t\t\t},\n\t\t\t\tHasPermission =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PermissionString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player has the specified permission\",\n\t\t\t\t},\n\t\t\t\tHasSkinPart =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Part\",\n\t\t\t\t\t\t\tType = \"eSkinPart\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player has the specified skin part enabled\",\n\t\t\t\t},\n\t\t\t\tHeal =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HitPoints\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Heals the player by the specified amount of HPs. Only positive amounts are expected. Sends a health update to the client.\",\n\t\t\t\t},\n\t\t\t\tIsEating =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is currently eating the item in their hand.\",\n\t\t\t\t},\n\t\t\t\tIsFireproof =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if a player is fireproof. This is when the flag has been explicitly set, or the player is in creative or spectator mode.\",\n\t\t\t\t},\n\t\t\t\tIsFishing =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is currently fishing\",\n\t\t\t\t},\n\t\t\t\tIsFlying =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is flying.\",\n\t\t\t\t},\n\t\t\t\tIsFrozen =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is frozen. See Freeze()\",\n\t\t\t\t},\n\t\t\t\tIsGameModeAdventure =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is in the gmAdventure gamemode, or has their gamemode unset and the world is a gmAdventure world.\",\n\t\t\t\t},\n\t\t\t\tIsGameModeCreative =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is in the gmCreative gamemode, or has their gamemode unset and the world is a gmCreative world.\",\n\t\t\t\t},\n\t\t\t\tIsGameModeSpectator =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is in the gmSpectator gamemode, or has their gamemode unset and the world is a gmSpectator world.\",\n\t\t\t\t},\n\t\t\t\tIsGameModeSurvival =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is in the gmSurvival gamemode, or has their gamemode unset and the world is a gmSurvival world.\",\n\t\t\t\t},\n\t\t\t\tIsInBed =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is currently lying in a bed.\",\n\t\t\t\t},\n\t\t\t\tIsLeftHanded =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player's left hand is dominant.\",\n\t\t\t\t},\n\t\t\t\tIsRespawnPointForced = {\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player unconditionally respawns from death at the position given by {{cPlayer}}:GetLastBedPos with no bed checks performed.\",\n\t\t\t\t},\n\t\t\t\tIsSatiated =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the player is satiated (cannot eat).\",\n\t\t\t\t},\n\t\t\t\tLoadRank =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Reloads the player's rank, message visuals and permissions from the {{cRankManager}}, based on the player's current rank.\",\n\t\t\t\t},\n\t\t\t\tOpenWindow =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Window\",\n\t\t\t\t\t\t\tType = \"cWindow\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Opens the specified UI window for the player.\",\n\t\t\t\t},\n\t\t\t\tPermissionMatches =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Permission\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Template\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified permission matches the specified template. The template may contain asterisk as a wildcard for any word.\",\n\t\t\t\t},\n\t\t\t\tPlaceBlock =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Places a block while impersonating the player. The {{OnPlayerPlacingBlock|HOOK_PLAYER_PLACING_BLOCK}} hook is called before the placement, and if it succeeds, the block is placed and the {{OnPlayerPlacedBlock|HOOK_PLAYER_PLACED_BLOCK}} hook is called. Returns true iff the block is successfully placed.\",\n\t\t\t\t},\n\t\t\t\tReplaceOneEquippedItemTossRest =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes one item from the the current equipped item stack, and attempts to add the specified item stack back to the same slot. If it is not possible to place the item in the same slot, tries to place the specified item elsewhere in the inventory. If this is not possible, then any remaining items are tossed. If the currently equipped slot is empty, its contents are simply set to the given Item.\",\n\t\t\t\t},\n\t\t\t\tRespawn =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Restores the health, extinguishes fire, makes visible and sends the Respawn packet.\",\n\t\t\t\t},\n\t\t\t\tSendAboveActionBarMessage =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the specified message to the player (shows above action bar).\",\n\t\t\t\t},\n\t\t\t\tSendBlocksAround =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockRange\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends all the world's blocks in BlockRange from the specified coords to the player, as a BlockChange packet. Range defaults to 1 (only one block sent).\",\n\t\t\t\t},\n\t\t\t\tSendMessage =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sends the specified message to the player.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Sends the {{cCompositeChat}} to the player, using a severity defined by the CompositeChat's MessageType.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSendMessageRaw =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Json\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"eChatType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the specified json string to the player. The optional value eChatType (default ctChatBox) can be ctChatBox, ctSystem or ctAboveActionBar. You can use {{cJson}} to build a json string.\",\n\t\t\t\t},\n\t\t\t\tSendMessageFailure =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Prepends Rose [INFO] / colours entire text (depending on ShouldUseChatPrefixes()) and sends message to player. For a command that failed to run because of insufficient permissions, etc.\",\n\t\t\t\t},\n\t\t\t\tSendMessageFatal =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Prepends Red [FATAL] / colours entire text (depending on ShouldUseChatPrefixes()) and sends message to player. For something serious, such as a plugin crash, etc.\",\n\t\t\t\t},\n\t\t\t\tSendMessageInfo =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Prepends Yellow [INFO] / colours entire text (depending on ShouldUseChatPrefixes()) and sends message to player. Informational message, such as command usage, etc.\",\n\t\t\t\t},\n\t\t\t\tSendMessagePrivateMsg =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SenderName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Prepends Light Blue [MSG: *SenderName*] / prepends SenderName and colours entire text (depending on ShouldUseChatPrefixes()) and sends message to player. For private messaging.\",\n\t\t\t\t},\n\t\t\t\tSendMessageSuccess =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Prepends Green [INFO] / colours entire text (depending on ShouldUseChatPrefixes()) and sends message to player. Success notification.\",\n\t\t\t\t},\n\t\t\t\tSendMessageWarning =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Prepends Rose [WARN] / colours entire text (depending on ShouldUseChatPrefixes()) and sends message to player. Denotes that something concerning, such as plugin reload, is about to happen.\",\n\t\t\t\t},\n\t\t\t\tSendRotation =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"YawDegrees\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PitchDegrees\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the specified rotation to the player, forcing them to look that way\",\n\t\t\t\t},\n\t\t\t\tSendSystemMessage =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sends the specified message to the player.\",\n\t\t\t\t},\n\t\t\t\tSetBedPos =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the position and world of the player's bed. If the world is not specified, it is set to the player's current world. The player will respawn at this position and world upon death if there is a bed there.\",\n\t\t\t\t},\n\t\t\t\tSetCanFly =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CanFly\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets if the player can fly or not.\",\n\t\t\t\t},\n\t\t\t\tSetCrouch =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsCrouched\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the crouch state, broadcasts the change to other players.\",\n\t\t\t\t},\n\t\t\t\tSetCurrentExperience =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"XPAmount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the current amount of experience (and indirectly, the XP level).\",\n\t\t\t\t},\n\t\t\t\tSetCustomName =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CustomName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the custom name for this player. If you want to disable the custom name, simply set an empty string. The custom name will be used in the tab-list, in the player nametag and in the tab-completion.\",\n\t\t\t\t},\n\t\t\t\tSetDraggingItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the item that the player is dragging in a UI window. If no UI window is open, this function does nothing.\"\n\t\t\t\t},\n\t\t\t\tSetElytraFlight =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsElytraFlying\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets whether the player is elytra flying or not.\",\n\t\t\t\t},\n\t\t\t\tSetFlying =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsFlying\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets if the player is flying or not.\",\n\t\t\t\t},\n\t\t\t\tSetFlyingMaxSpeed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FlyingMaxSpeed\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the flying maximum speed, relative to the game default speed. The default value is 1. Sends the updated speed to the client.\",\n\t\t\t\t},\n\t\t\t\tSetFoodExhaustionLevel =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ExhaustionLevel\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the food exhaustion to the specified level.\",\n\t\t\t\t},\n\t\t\t\tSetFoodLevel =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FoodLevel\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the food level (number of half-drumsticks on-screen)\",\n\t\t\t\t},\n\t\t\t\tSetFoodSaturationLevel =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FoodSaturationLevel\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the food saturation (overcharge of the food level).\",\n\t\t\t\t},\n\t\t\t\tSetFoodTickTimer =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FoodTickTimer\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the number of ticks past the last food-based heal or damage action; when this timer reaches 80, a new heal / damage is applied.\",\n\t\t\t\t},\n\t\t\t\tSetGameMode =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NewGameMode\",\n\t\t\t\t\t\t\tType = \"eGameMode\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the gamemode for the player. The new gamemode overrides the world's default gamemode, unless it is set to gmInherit.\",\n\t\t\t\t},\n\t\t\t\tSetIsFishing =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsFishing\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FloaterEntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the 'IsFishing' flag for the player. The floater entity ID is expected for the true variant, it can be omitted when IsFishing is false. FIXME: Undefined behavior when multiple fishing rods are used simultanously\",\n\t\t\t\t},\n\t\t\t\tSetLeftHanded =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsLeftHanded\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the dominant hand of the player.\",\n\t\t\t\t},\n\t\t\t\tSetNormalMaxSpeed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NormalMaxSpeed\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the normal (walking) maximum speed, relative to the game default speed. The default value is 1. Sends the updated speed to the client, if appropriate.\",\n\t\t\t\t},\n\t\t\t\tSetRespawnPosition =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the position and world of the player's respawn point. The player will respawn at this position and world upon death.\",\n\t\t\t\t},\n\t\t\t\tSetSprint =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSprinting\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets whether the player is sprinting or not.\",\n\t\t\t\t},\n\t\t\t\tSetSkinParts =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Parts\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the skin part flags of the player.  The value should be a bitwise OR of several {{Globals#eSkinPart|eSkinPart}} constants.\",\n\t\t\t\t},\n\t\t\t\tSetSprintingMaxSpeed =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SprintingMaxSpeed\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the sprinting maximum speed, relative to the game default speed. The default value is 1.3. Sends the updated speed to the client, if appropriate.\",\n\t\t\t\t},\n\t\t\t\tSetTeam =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Team\",\n\t\t\t\t\t\t\tType = \"cTeam\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Moves the player to the specified team.\",\n\t\t\t\t},\n\t\t\t\tSetVisible =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsVisible\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the player visibility to other players\",\n\t\t\t\t},\n\t\t\t\tSpectateEntity =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Target\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spectates the target entity. Does not change the player's gamemode to spectator mode. When called with self or nil as the target, resets the spectation.\",\n\t\t\t\t},\n\t\t\t\tTossEquippedItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Amount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Tosses the item that the player has selected in their hotbar. Amount defaults to 1.\",\n\t\t\t\t},\n\t\t\t\tTossHeldItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Amount\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Tosses the item held by the cursor, when the player is in a UI window. Amount defaults to 1.\",\n\t\t\t\t},\n\t\t\t\tTossPickup =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Tosses a pickup newly created from the specified item.\",\n\t\t\t\t},\n\t\t\t\tUnfreeze =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Allows the player to move again, canceling the effects of Freeze()\",\n\t\t\t\t},\n\t\t\t\tXpForLevel =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"XPLevel\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the total amount of XP needed for the specified XP level. Inverse of CalcLevelFromXp().\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tMAX_FOOD_LEVEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The maximum food level value. When the food level is at this value, the player cannot eat.\",\n\t\t\t\t},\n\t\t\t\tMAX_HEALTH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The maximum health value\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cPawn\",\n\t\t},  -- cPlayer\n\n\t\tcRoot =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents the root of Cuberite's object hierarchy. There is always only one cRoot\n\t\t\t\tobject. It manages and allows querying all the other objects, such as {{cServer}},\n\t\t\t\t{{cPluginManager}}, individual {{cWorld|worlds}} etc.</p>\n\t\t\t\t<p>\n\t\t\t\tTo get the singleton instance of this object, you call the cRoot:Get() function. Then you can call\n\t\t\t\tthe individual functions on this object. Note that some of the functions are static and don't need\n\t\t\t\tthe instance, they are to be called directly on the cRoot class, such as cRoot:GetPhysicalRAMUsage()\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tBroadcastChat =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"MessageType\",\n\t\t\t\t\t\t\t\tType = \"eMessageType\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Broadcasts a message to all players, with its message type set to MessageType (default: mtCustom).\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"CompositeChat\",\n\t\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Broadcasts a {{cCompositeChat|composite chat message}} to all players.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBroadcastChatDeath =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Broadcasts the specified message to all players, with its message type set to mtDeath. Use for when a player has died.\",\n\t\t\t\t},\n\t\t\t\tBroadcastChatFailure =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Broadcasts the specified message to all players, with its message type set to mtFailure. Use for a command that failed to run because of insufficient permissions, etc.\",\n\t\t\t\t},\n\t\t\t\tBroadcastChatFatal =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Broadcasts the specified message to all players, with its message type set to mtFatal. Use for a plugin that crashed, or similar.\",\n\t\t\t\t},\n\t\t\t\tBroadcastChatInfo =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Broadcasts the specified message to all players, with its message type set to mtInfo. Use for informational messages, such as command usage.\",\n\t\t\t\t},\n\t\t\t\tBroadcastChatJoin =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Broadcasts the specified message to all players, with its message type set to mtJoin. Use for players joining the server.\",\n\t\t\t\t},\n\t\t\t\tBroadcastChatLeave =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Broadcasts the specified message to all players, with its message type set to mtLeave. Use for players leaving the server.\",\n\t\t\t\t},\n\t\t\t\tBroadcastChatSuccess =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Broadcasts the specified message to all players, with its message type set to mtSuccess. Use for success messages.\",\n\t\t\t\t},\n\t\t\t\tBroadcastChatWarning =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MessageText\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Broadcasts the specified message to all players, with its message type set to mtWarning. Use for concerning events, such as plugin reload etc.\",\n\t\t\t\t},\n\t\t\t\tBroadcastPlayerListsHeaderFooter =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t\tName = \"Header\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t\tName = \"Footer\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tDesc = \"Broadcasts the header and footer of the player list to all players.\",\n\t\t\t\t},\n\t\t\t\tDoWithPlayerByUUID =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"If there is the player with the uuid, calls the CallbackFunction with the {{cPlayer}} parameter representing the player. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cPlayer|Player}})</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found.\",\n\t\t\t\t},\n\t\t\t\tFindAndDoWithPlayer =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the given callback function for the player with the name best matching the name string provided.<br>This function is case-insensitive and will match partial names.<br>Returns false if player not found or there is ambiguity, true otherwise. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cPlayer|Player}})</pre>\",\n\t\t\t\t},\n\t\t\t\tForEachPlayer =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the given callback function for each player. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cPlayer|cPlayer}})</pre>\",\n\t\t\t\t},\n\t\t\t\tForEachWorld =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the given callback function for each world. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cWorld|cWorld}})</pre>. Returns false if a callback aborts, otherwise true.\",\n\t\t\t\t},\n\t\t\t\tGet =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cRoot\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the one and only cRoot object.\",\n\t\t\t\t},\n\t\t\t\tGetBrewingRecipe =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Bottle\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Ingredient\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the result item, if a recipe has been found to brew the Ingredient into Bottle. If no recipe is found, returns no value.\",\n\t\t\t\t},\n\t\t\t\tGetBuildCommitID =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"For official builds (Travis CI / Jenkins) it returns the exact commit hash used for the build. For unofficial local builds, returns the approximate commit hash (since the true one cannot be determined), formatted as \\\"approx: &lt;CommitHash&gt;\\\".\",\n\t\t\t\t},\n\t\t\t\tGetBuildDateTime =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"For official builds (Travic CI / Jenkins) it returns the date and time of the build. For unofficial local builds, returns the approximate datetime of the commit (since the true one cannot be determined), formatted as \\\"approx: &lt;DateTime-iso8601&gt;\\\".\",\n\t\t\t\t},\n\t\t\t\tGetBuildID =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"For official builds (Travis CI / Jenkins) it returns the unique ID of the build, as recognized by the build system. For unofficial local builds, returns the string \\\"Unknown\\\".\",\n\t\t\t\t},\n\t\t\t\tGetBuildSeriesName =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"For official builds (Travis CI / Jenkins) it returns the series name of the build (for example \\\"Cuberite Windows x64 Master\\\"). For unofficial local builds, returns the string \\\"local build\\\".\",\n\t\t\t\t},\n\t\t\t\tGetCraftingRecipes =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCraftingRecipe\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the CraftingRecipes object\",\n\t\t\t\t},\n\t\t\t\tGetDefaultWorld =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the world object from the default world.\",\n\t\t\t\t},\n\t\t\t\tGetFurnaceFuelBurnTime =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Fuel\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of ticks for how long the item would fuel a furnace. Returns zero if not a fuel.\",\n\t\t\t\t},\n\t\t\t\tGetFurnaceRecipe =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"InItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OutItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"NumTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"InItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the furnace recipe for smelting the specified input. If a recipe is found, returns the smelted result, the number of ticks required for the smelting operation, and the input consumed (note that Cuberite supports smelting M items into N items and different smelting rates). If no recipe is found, returns no value.\",\n\t\t\t\t},\n\t\t\t\tGetPhysicalRAMUsage =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the amount of physical RAM that the entire Cuberite process is using, in KiB. Negative if the OS doesn't support this query.\",\n\t\t\t\t},\n\t\t\t\tGetPluginManager =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cPluginManager\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the cPluginManager object.\",\n\t\t\t\t},\n\t\t\t\tGetProtocolVersionTextFromInt =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ProtocolVersionNumber\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Minecraft client version from the given Protocol version number. If there is no version found, it returns 'Unknown protocol (Number)'\",\n\t\t\t\t},\n\t\t\t\tGetServer =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cServer\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the cServer object.\",\n\t\t\t\t},\n\t\t\t\tGetServerUpTime =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the uptime of the server in seconds.\",\n\t\t\t\t},\n\t\t\t\tGetTotalChunkCount =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the amount of loaded chunks.\",\n\t\t\t\t},\n\t\t\t\tGetVirtualRAMUsage =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the amount of virtual RAM that the entire Cuberite process is using, in KiB. Negative if the OS doesn't support this query.\",\n\t\t\t\t},\n\t\t\t\tGetWebAdmin =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cWebAdmin\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the cWebAdmin object.\",\n\t\t\t\t},\n\t\t\t\tGetWorld =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"WorldName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the cWorld object of the given world. It returns nil if there is no world with the given name.\",\n\t\t\t\t},\n\t\t\t\tQueueExecuteConsoleCommand =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Queues a console command for execution through the cServer class. The command will be executed in the tick thread. The command's output will be sent to console.\",\n\t\t\t\t},\n\t\t\t\tSaveAllChunks =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Saves all the chunks in all the worlds. Note that the saving is queued on each world's tick thread and this functions returns before the chunks are actually saved.\",\n\t\t\t\t},\n\t\t\t\tSetSavingEnabled =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SavingEnabled\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets whether saving chunk data is enabled for all worlds. If disabled, dirty chunks will stay in memory forever, which can cause performance and stability issues.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Querying a furnace recipe\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tTo find the furnace recipe for an item, use the following code (adapted from the Debuggers plugin's /fr command):\n<pre class=\"prettyprint lang-lua\">\nlocal HeldItem = a_Player:GetEquippedItem();\nlocal Out, NumTicks, In = cRoot:GetFurnaceRecipe(HeldItem);  -- Note STATIC call - no need for a Get()\nif (Out ~= nil) then\n\t-- There is a recipe, list it:\n\ta_Player:SendMessage(\n\t\t\"Furnace turns \" .. ItemToFullString(In) ..\n\t\t\" to \" .. ItemToFullString(Out) ..\n\t\t\" in \" .. NumTicks .. \" ticks (\" ..\n\t\ttostring(NumTicks / 20) .. \" seconds).\"\n\t);\nelse\n\t-- No recipe found\n\ta_Player:SendMessage(\"There is no furnace recipe that would smelt \" .. ItemToString(HeldItem));\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcScoreboard =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class manages the objectives and teams of a single world.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddPlayerScore =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Name\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Type\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Value\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a value to all player scores of the specified objective type.\",\n\t\t\t\t},\n\t\t\t\tForEachObjective =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the specified callback for each objective in the scoreboard. Returns true if all objectives have been processed (including when there are zero objectives), or false if the callback function has aborted the enumeration by returning true. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cObjective|Objective}})</pre> The callback should return false or no value to continue with the next objective, or true to abort the enumeration.\",\n\t\t\t\t},\n\t\t\t\tForEachTeam =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the specified callback for each team in the scoreboard. Returns true if all teams have been processed (including when there are zero teams), or false if the callback function has aborted the enumeration by returning true. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cObjective|Objective}})</pre> The callback should return false or no value to continue with the next team, or true to abort the enumeration.\",\n\t\t\t\t},\n\t\t\t\tGetNumObjectives =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the nuber of registered objectives.\",\n\t\t\t\t},\n\t\t\t\tGetNumTeams =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of registered teams.\",\n\t\t\t\t},\n\t\t\t\tGetObjective =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cObjective\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the objective with the specified name.\",\n\t\t\t\t},\n\t\t\t\tGetObjectiveIn =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DisplaySlot\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cObjective\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the objective in the specified display slot. Can be nil.\",\n\t\t\t\t},\n\t\t\t\tGetTeam =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"TeamName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cTeam\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the team with the specified name.\",\n\t\t\t\t},\n\t\t\t\tGetTeamNames =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the names of all teams, as an array-table of strings\",\n\t\t\t\t},\n\t\t\t\tRegisterObjective =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Name\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DisplayName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Type\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cObjective\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Registers a new scoreboard objective. Returns the {{cObjective}} instance, nil on error.\",\n\t\t\t\t},\n\t\t\t\tRegisterTeam =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Name\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DisplayName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Prefix\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Suffix\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cTeam\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Registers a new team. Returns the {{cTeam}} instance, nil on error. For example if the team already exists.\",\n\t\t\t\t},\n\t\t\t\tRemoveObjective =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Name\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes the objective with the specified name. Returns true if operation was successful.\",\n\t\t\t\t},\n\t\t\t\tRemoveTeam =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"TeamName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes the team with the specified name. Returns true if operation was successful.\",\n\t\t\t\t},\n\t\t\t\tSetDisplay =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Name\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DisplaySlot\",\n\t\t\t\t\t\t\tType = \"<unknown>\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Updates the currently displayed objective.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tdsCount =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tdsList =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tdsName =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tdsSidebar =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcServer =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class manages all the client connections internally. In the API layer, it allows to get and set\n\t\t\t\tthe general properties of the server, such as the description and max players.</p>\n\t\t\t\t<p>\n\t\t\t\tIt used to support broadcasting chat messages to all players, this functionality has been moved to\n\t\t\t\t{{cRoot}}:BroadcastChat().\n\t\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tDoesAllowMultiLogin =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if players can log in multiple times from the same account (normally used for debugging), false if only one player per name is allowed.\",\n\t\t\t\t},\n\t\t\t\tGetDescription =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the server description set in the settings.ini.\",\n\t\t\t\t},\n\t\t\t\tGetShutdownMessage =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the shutdown message set in the settings.ini.\",\n\t\t\t\t},\n\t\t\t\tGetMaxPlayers =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the max amount of players who can join the server.\",\n\t\t\t\t},\n\t\t\t\tGetNumPlayers =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the amount of players online.\",\n\t\t\t\t},\n\t\t\t\tGetServerID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ID of the server?\",\n\t\t\t\t},\n\t\t\t\tIsHardcore =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the server is hardcore (players get banned on death).\",\n\t\t\t\t},\n\t\t\t\tIsPlayerInQueue =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Username\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified player is queued to be transferred to a World.\",\n\t\t\t\t},\n\t\t\t\tRegisterForgeMod =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ModName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ModVersion\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ProtocolVersionNumber\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Add a Forge mod name/version to the server ping list.\",\n\t\t\t\t},\n\t\t\t\tScheduleTask =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DelayTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"TaskFunction\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Queues the specified function to be executed in the server's tick thread after a the specified number of ticks. This enables operations to be queued for execution in the future. The function signature is <pre class=\\\"pretty-print lang-lua\\\">function({{cServer|Server}})</pre>All return values from the function are ignored. Note that it is unsafe to store references to Cuberite objects, such as entities, across from the caller to the task handler function; store the EntityID instead.\",\n\t\t\t\t},\n\t\t\t\tSetMaxPlayers =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxPlayers\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the max amount of players who can join.\",\n\t\t\t\t},\n\t\t\t\tShouldAuthenticate =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true iff the server is set to authenticate players (\\\"online mode\\\").\",\n\t\t\t\t},\n\t\t\t\tUnregisterForgeMod =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ModName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ProtocolVersionNumber\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Remove a Forge mod name/version from the server ping list.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcStringCompression =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tProvides functions to compress or decompress string\n\t\t\t\t<p>\n\t\t\t\tAll functions in this class are static, so they should be called in the dot convention:\n<pre class=\"prettyprint lang-lua\">\nlocal CompressedString = cStringCompression.CompressStringGZIP(\"DataToCompress\")\n</pre>\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tCompressStringGZIP =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Compresses data in a string using GZIP\",\n\t\t\t\t},\n\t\t\t\tCompressStringZLIB =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"factor\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Compresses data in a string using ZLIB. Factor 0 is no compression and factor 9 is maximum compression.\",\n\t\t\t\t},\n\t\t\t\tInflateString =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Uncompresses a string using Inflate\",\n\t\t\t\t},\n\t\t\t\tUncompressStringGZIP =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Uncompress a string using GZIP\",\n\t\t\t\t},\n\t\t\t\tUncompressStringZLIB =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"UncompressedLength\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Uncompresses Data using ZLIB\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcTeam =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class manages a single player team.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddPlayer =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds a player to this team. Returns true if the operation was successful.\",\n\t\t\t\t},\n\t\t\t\tAllowsFriendlyFire =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether team friendly fire is allowed.\",\n\t\t\t\t},\n\t\t\t\tCanSeeFriendlyInvisible =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether players can see invisible teammates.\",\n\t\t\t\t},\n\t\t\t\tGetDisplayName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the display name of the team.\",\n\t\t\t\t},\n\t\t\t\tGetName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the internal name of the team.\",\n\t\t\t\t},\n\t\t\t\tGetNumPlayers =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the number of registered players.\",\n\t\t\t\t},\n\t\t\t\tGetPrefix =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the prefix prepended to the names of the members of this team.\",\n\t\t\t\t},\n\t\t\t\tGetSuffix =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the suffix appended to the names of the members of this team.\",\n\t\t\t\t},\n\t\t\t\tHasPlayer =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns whether the specified player is a member of this team.\",\n\t\t\t\t},\n\t\t\t\tRemovePlayer =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes the player with the specified name from this team. Returns true if the operation was successful.\",\n\t\t\t\t},\n\t\t\t\tReset =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Removes all players from this team.\",\n\t\t\t\t},\n\t\t\t\tSetCanSeeFriendlyInvisible =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CanSeeFriendlyInvisible\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Set whether players can see invisible teammates.\",\n\t\t\t\t},\n\t\t\t\tSetDisplayName =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DisplayName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the display name of this team. (i.e. what will be shown to the players)\",\n\t\t\t\t},\n\t\t\t\tSetFriendlyFire =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AllowFriendlyFire\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets whether team friendly fire is allowed.\",\n\t\t\t\t},\n\t\t\t\tSetPrefix =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Prefix\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the prefix prepended to the names of the members of this team.\",\n\t\t\t\t},\n\t\t\t\tSetSuffix =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Suffix\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the suffix appended to the names of the members of this team.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcTNTEntity =\n\t\t{\n\t\t\tDesc = \"This class manages a TNT entity.\",\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tExplode =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Explode the tnt.\",\n\t\t\t\t},\n\t\t\t\tGetFuseTicks =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the fuse ticks - the number of game ticks until the tnt explodes.\",\n\t\t\t\t},\n\t\t\t\tSetFuseTicks =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"TicksUntilExplosion\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Set the fuse ticks until the tnt will explode.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tInherits = \"cEntity\",\n\t\t},\n\t\tcUrlParser =\n\t\t{\n\t\t\tDesc = [[\n\t\t\tProvides a parser for generic URLs that returns the individual components of the URL.</p>\n\t\t\t<p>\n\t\t\tNote that all functions are static. Call them by using \"cUrlParser:Parse(...)\" etc.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetDefaultPort =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Scheme\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the default port that should be used for the given scheme (protocol). Returns zero if the scheme is not known.\",\n\t\t\t\t},\n\t\t\t\tIsKnownScheme =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Scheme\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the scheme (protocol) is recognized by the parser.\",\n\t\t\t\t},\n\t\t\t\tParse =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Scheme\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Username\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Password\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Host\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Port\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Path\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Query\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Fragment\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the individual parts of the URL. Parts that are not explicitly specified in the URL are empty, the default port for the scheme is used. If parsing fails, the function returns nil and an error message.\",\n\t\t\t\t},\n\t\t\t\tParseAuthorityPart =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AuthPart\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Username\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Password\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Host\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Port\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Parses the Authority part of the URL. Parts that are not explicitly specified in the AuthPart are returned empty, the port is returned zero. If parsing fails, the function returns nil and an error message.\",\n\t\t\t\t},\n\t\t\t\tUrlDecode =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Text\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Decoded\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Text, URL-decoded. Returns nil if there is a problem while decoding (invalid input).\",\n\t\t\t\t},\n\t\t\t\tUrlEncode =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Text\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Encoded\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the Text, URL-encoded.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe following code fragment uses the cUrlParser to parse an URL string into its components, and\n\t\t\t\t\t\tprints those components out:\n<pre class=\"prettyprint lang-lua\">\nlocal Scheme, Username, Password, Host, Port, Path, Query, Fragment = cUrlParser:Parse(\n\t\"http://anonymous:user@example.com@ftp.cuberite.org:9921/releases/2015/?sort=date#files\"\n)\nif not(Scheme) then\n\t-- Parsing failed, the second returned value (in Username) is the error message:\n\tLOG(\"  Error: \" .. (Username or \"<nil>\"))\nelse\n\tLOG(\"  Scheme   = \" .. Scheme)    -- \"http\"\n\tLOG(\"  Username = \" .. Username)  -- \"anonymous\"\n\tLOG(\"  Password = \" .. Password)  -- \"user@example.com\"\n\tLOG(\"  Host     = \" .. Host)      -- \"ftp.cuberite.org\"\n\tLOG(\"  Port     = \" .. Port)      -- 9921\n\tLOG(\"  Path     = \" .. Path)      -- \"releases/2015/\"\n\tLOG(\"  Query    = \" .. Query)     -- \"sort=date\"\n\tLOG(\"  Fragment = \" .. Fragment)  -- \"files\"\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcUUID =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tClass representing a Universally Unique Identifier.\n\t\t\t\tNote that all Cuberite's API functions that take a cUUID parameter will also\n\t\t\t\taccept a string in its place, as long as that string can be converted to a cUUID\n\t\t\t\t(using the {{#FromString_1|cUUID:FromString}} function).\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tconstructor =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Constructs a nil-valued UUID (all zeros)\",\n\t\t\t\t},\n\t\t\t\tCompare =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = [[\n\t\t\t\t\t\tCompares this UUID with the specified Other UUID, Returns:\n\t\t\t\t\t\t\t0 when equal to Other,\n\t\t\t\t\t\t\t< 0 when less than Other,\n\t\t\t\t\t\t\t> 0 when greater than Other\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\tIsNil =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if this contains the \\\"nil\\\" UUID with all bits set to 0\",\n\t\t\t\t},\n\t\t\t\tFromString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"StringUUID\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Tries to interpret the string as a short or long form UUID and assign from it.\tOn error, returns false and does not set the value.\",\n\t\t\t\t},\n\t\t\t\tToShortString =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts the UUID to a short form string (i.e without dashes).\",\n\t\t\t\t},\n\t\t\t\tToLongString =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts the UUID to a long form string (i.e with dashes).\",\n\t\t\t\t},\n\t\t\t\tVersion =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the version number of the UUID.\",\n\t\t\t\t},\n\t\t\t\tVariant =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the variant number of the UUID\",\n\t\t\t\t},\n\t\t\t\tGenerateVersion3 =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Name\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Generates a version 3, variant 1 UUID based on the md5 hash of Name.\"\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcWindow =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class is the common ancestor for all window classes used by Cuberite. It is inherited by the\n\t\t\t\t{{cLuaWindow|cLuaWindow}} class that plugins use for opening custom windows. It is planned to be\n\t\t\t\tused for window-related hooks in the future. It implements the basic functionality of any\n\t\t\t\twindow.</p>\n\t\t\t\t<p>\n\t\t\t\tNote that one cWindow object can be used for multiple players at the same time, and therefore the\n\t\t\t\tslot contents are player-specific (e. g. crafting grid, or player inventory). Thus the GetSlot() and\n\t\t\t\tSetSlot() functions need to have the {{cPlayer|cPlayer}} parameter that specifies the player for\n\t\t\t\twhom the contents are to be queried.</p>\n\t\t\t\t<p>\n\t\t\t\tWindows also have numeric properties, these are used to set the progressbars for furnaces or the XP\n\t\t\t\tcosts for enchantment tables.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tGetSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNumber\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item at the specified slot for the specified player. Returns nil and logs to server console on error.\",\n\t\t\t\t},\n\t\t\t\tGetWindowID =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the ID of the window, as used by the network protocol\",\n\t\t\t\t},\n\t\t\t\tGetWindowTitle =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the window title that will be displayed to the player\",\n\t\t\t\t},\n\t\t\t\tGetWindowType =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the type of the window, one of the constants in the table above\",\n\t\t\t\t},\n\t\t\t\tGetWindowTypeName =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the textual representation of the window's type, such as \\\"minecraft:chest\\\".\",\n\t\t\t\t},\n\t\t\t\tIsSlotInPlayerHotbar =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified slot number is in the player hotbar\",\n\t\t\t\t},\n\t\t\t\tIsSlotInPlayerInventory =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified slot number is in the player's main inventory or in the hotbar. Note that this returns false for armor slots!\",\n\t\t\t\t},\n\t\t\t\tIsSlotInPlayerMainInventory =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified slot number is in the player's main inventory\",\n\t\t\t\t},\n\t\t\t\tSetProperty =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PropertyID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PropertyValue\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Updates a numerical property associated with the window. Typically used for furnace progressbars. Sends the UpdateWindowProperty packet to the specified Player, or to all current clients of the window if Player is not specified.\",\n\t\t\t\t},\n\t\t\t\tSetSlot =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the contents of the specified slot for the specified player. Ignored if the slot number is invalid\",\n\t\t\t\t},\n\t\t\t\tSetWindowTitle =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"WindowTitle\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the window title that will be displayed to the player\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\twtAnimalChest =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A horse or donkey window\",\n\t\t\t\t},\n\t\t\t\twtAnvil =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"An anvil window\",\n\t\t\t\t},\n\t\t\t\twtBeacon =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A beacon window\",\n\t\t\t\t},\n\t\t\t\twtBrewery =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A brewing stand window\",\n\t\t\t\t},\n\t\t\t\twtChest =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A {{cChestEntity|chest}} or doublechest window\",\n\t\t\t\t},\n\t\t\t\twtDropSpenser =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A {{cDropperEntity|dropper}} or a {{cDispenserEntity|dispenser}} window\",\n\t\t\t\t},\n\t\t\t\twtEnchantment =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"An enchantment table window\",\n\t\t\t\t},\n\t\t\t\twtFurnace =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A {{cFurnaceEntity|furnace}} window\",\n\t\t\t\t},\n\t\t\t\twtHopper =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A {{cHopperEntity|hopper}} window\",\n\t\t\t\t},\n\t\t\t\twtInventory =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"An inventory window\",\n\t\t\t\t},\n\t\t\t\twtNPCTrade =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A villager trade window\",\n\t\t\t\t},\n\t\t\t\twtWorkbench =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A workbench (crafting table) window\",\n\t\t\t\t},\n\t\t\t},  -- Constants\n\n\t\t\tConstantGroups =\n\t\t\t{\n\t\t\t\tWindowType =\n\t\t\t\t{\n\t\t\t\t\tInclude = { \"wt.*\" },\n\t\t\t\t}\n\t\t\t},  -- ConstantGroups\n\t\t},\n\t\tStatisticsManager =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class provides a store for various types of player statistics. The store will be read and sent to the client when the Statistics button is pressed.\n\t\t\t]],\n\t\t\tVariables =\n\t\t\t{\n\t\t\t\tCustom =\n\t\t\t\t{\n\t\t\t\t\tType = \"Map of {{CustomStatistic}} to number\",\n\t\t\t\t\tNotes = \"Gets or sets the value of a custom statistic.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Example usage\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tEach store is a table, keyed by the statistic that the entry tracks, with value typically representing the number of times the event happened:\n<pre class=\"prettyprint lang-lua\">\nfunction ModifyPlayerFurnaceInteractions(Player)\n\tlocal Statistics = Player:GetStatistics()\n\n\tif (Statistics.Custom[CustomStatistic.WalkOneCm] > 10) then\n\t\tStatistics.Custom[CustomStatistic.InteractWithFurnace] = 1337\n\tend\n\n\t-- Next time the player presses Statistics they will see the updated value for furnace interactions.\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\n\t\tBannerPattern =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tAn enumeration of banner patterns.\n\t\t\t]],\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tBottomStripe =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A base pattern.\"\n\t\t\t\t},\n\t\t\t\tTopStripe =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A chief pattern.\"\n\t\t\t\t},\n\t\t\t\tLeftStripe =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A pale dexter pattern.\"\n\t\t\t\t},\n\t\t\t\tRightStripe =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A pale sinister pattern.\"\n\t\t\t\t},\n\t\t\t\tCenterStripeVertical =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A pale pattern.\"\n\t\t\t\t},\n\t\t\t\tMiddleStripeHorizontal =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A fess pattern.\"\n\t\t\t\t},\n\t\t\t\tDownRightStripe =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A bend pattern.\"\n\t\t\t\t},\n\t\t\t\tDownLeftStripe =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A bend sinister pattern.\"\n\t\t\t\t},\n\t\t\t\tSmallVerticalStripes =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A paly pattern.\"\n\t\t\t\t},\n\t\t\t\tDiagonalCross =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A saltire pattern.\"\n\t\t\t\t},\n\t\t\t\tSquareCross =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A cross pattern.\"\n\t\t\t\t},\n\t\t\t\tLeftOfDiagonal =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A per bend sinister pattern.\"\n\t\t\t\t},\n\t\t\t\tRightOfUpsideDownDiagonal =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A per bend pattern.\"\n\t\t\t\t},\n\t\t\t\tLeftOfUpsideDownDiagonal =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A per bend inverted pattern.\"\n\t\t\t\t},\n\t\t\t\tRightOfDiagonal =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A per bend sinister inverted pattern.\"\n\t\t\t\t},\n\t\t\t\tVerticalHalfLeft =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A per pale pattern.\"\n\t\t\t\t},\n\t\t\t\tVerticalHalfRight =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A per pale inverted pattern.\"\n\t\t\t\t},\n\t\t\t\tHorizontalHalfTop =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A per fess pattern.\"\n\t\t\t\t},\n\t\t\t\tHorizontalHalfBottom =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A per fess inverted pattern.\"\n\t\t\t\t},\n\t\t\t\tBottomLeftCorner =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A base dexter canton pattern.\"\n\t\t\t\t},\n\t\t\t\tBottomRightCorner =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A base sinister canton pattern.\"\n\t\t\t\t},\n\t\t\t\tTopLeftCorner =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A chief dexter canton pattern.\"\n\t\t\t\t},\n\t\t\t\tTopRightCorner =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A chief sinister canton pattern.\"\n\t\t\t\t},\n\t\t\t\tBottomTriangle =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A chevron pattern.\"\n\t\t\t\t},\n\t\t\t\tTopTriangle =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"An inverted chevron pattern.\"\n\t\t\t\t},\n\t\t\t\tBottomTriangleSawtooth =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A base indented pattern.\"\n\t\t\t\t},\n\t\t\t\tTopTriangleSawtooth =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A chief indented pattern.\"\n\t\t\t\t},\n\t\t\t\tMiddleCircle =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A roundel pattern.\"\n\t\t\t\t},\n\t\t\t\tMiddleRhombus =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A lozenge pattern.\"\n\t\t\t\t},\n\t\t\t\tBorder =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A bordure pattern.\"\n\t\t\t\t},\n\t\t\t\tCurlyBorder =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A bordure indented pattern.\"\n\t\t\t\t},\n\t\t\t\tBrick =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A field masoned pattern.\"\n\t\t\t\t},\n\t\t\t\tGradient =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A gradient pattern.\"\n\t\t\t\t},\n\t\t\t\tGradientUpsideDown =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A base gradient pattern.\"\n\t\t\t\t},\n\t\t\t\tCreeper =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A creeper charge pattern.\"\n\t\t\t\t},\n\t\t\t\tSkull =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A skull charge pattern.\"\n\t\t\t\t},\n\t\t\t\tFlower =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flower charge pattern.\"\n\t\t\t\t},\n\t\t\t\tMojang =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A... thing.\"\n\t\t\t\t},\n\t\t\t\tGlobe =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A globe.\"\n\t\t\t\t},\n\t\t\t\tPiglin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A snoot.\"\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tBossBarColor =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tAn enumeration of boss bar display colours which can be used with {{cClientHandle#SendBossBarAdd|SendBossBarAdd}}.\n\t\t\t]],\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tPink =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A pink boss bar.\"\n\t\t\t\t},\n\t\t\t\tBlue =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A blue boss bar.\"\n\t\t\t\t},\n\t\t\t\tRed =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A red boss bar.\"\n\t\t\t\t},\n\t\t\t\tGreen =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A green boss bar.\"\n\t\t\t\t},\n\t\t\t\tYellow =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A yellow boss bar.\"\n\t\t\t\t},\n\t\t\t\tPurple =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A purple boss bar.\"\n\t\t\t\t},\n\t\t\t\tWhite =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A white boss bar.\"\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tBossBarDivisionType =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tAn enumeration of boss bar division types which can be used with {{cClientHandle#SendBossBarAdd|SendBossBarAdd}}.\n\t\t\t\tThese constants control the number of notches the bar itself renders with.\n\t\t\t]],\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tNone =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A completely smooth boss bar.\"\n\t\t\t\t},\n\t\t\t\tSixNotches =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A six-notch'd boss bar.\"\n\t\t\t\t},\n\t\t\t\tTenNotches =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A ten-notch'd boss bar.\"\n\t\t\t\t},\n\t\t\t\tTwelveNotches =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A twelve notch'd boss bar.\"\n\t\t\t\t},\n\t\t\t\tTwentyNotches =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A twenty notch'd boss bar.\"\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tEffectID =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tAn enumeration of sound and particle effects which can be used with\n\t\t\t\t{{cWorld#BroadcastSoundParticleEffect|BroadcastSoundParticleEffect}}.\n\t\t\t]],\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tSFX_RANDOM_DISPENSER_DISPENSE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of droper/dispenser releasing an item\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_DISPENSER_DISPENSE_FAIL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a droper/dispenser activated without items\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_DISPENSER_SHOOT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a dispenser shooting\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_ENDER_EYE_LAUNCH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of an ender eye launch\"\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_FIREWORK_SHOT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a firework shot\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_IRON_DOOR_OPEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of an iron door opening\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_WOODEN_DOOR_OPEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a wooden door opening\"\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_WOODEN_TRAPDOOR_OPEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a wooden trapdoor opening\"\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_FENCE_GATE_OPEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a fence gate opening\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_FIRE_EXTINGUISH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a fire extinguishing\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_PLAY_MUSIC_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Starts playing a music disc. Needs an accompanting music disc ID\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_IRON_DOOR_CLOSE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of an iron door closing\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_WOODEN_DOOR_CLOSE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a wooden door closing\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_WOODEN_TRAPDOOR_CLOSE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a trapdoor closing\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_FENCE_GATE_CLOSE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a fence gate closing\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_GHAST_WARN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a ghast warning cry\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_GHAST_SHOOT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a ghast shooting\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_ENDERDRAGON_SHOOT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of the enderdragon shooting\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_BLAZE_SHOOT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a blaze shooting\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_ZOMBIE_WOOD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a zombie attacking a wooden door\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_ZOMBIE_METAL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a zombie attacking a metal door\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_ZOMBIE_WOOD_BREAK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a zombie breaking a wooden door\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_WITHER_BREAK_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a wither breaking blocks\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_WITHER_SPAWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a wither spawning\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_WITHER_SHOOT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a wither shooting\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_BAT_TAKEOFF =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a bat taking off\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_ZOMBIE_INFECT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a zombie infecting a villager\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_ZOMBIE_UNFECT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a zombie villager converting to villager\",\n\t\t\t\t},\n\t\t\t\tSFX_MOB_ENDERDRAGON_DEATH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of the dragon releasing dragon breath\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_ANVIL_BREAK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of an anvil breaking\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_ANVIL_USE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of using an anvil\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_ANVIL_LAND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a falling anvil landing\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_PORTAL_TRAVEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of travelling through a portal\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_CHORUS_FLOWER_GROW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a growing chorus flower\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_CHORUS_FLOWER_DEATH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of a dieing chorus flower\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_BREWING_STAND_BREW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of an active brewing stand\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_IRON_TRAPDOOR_OPEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of an iron trapdoor opening\",\n\t\t\t\t},\n\t\t\t\tSFX_RANDOM_IRON_TRAPDOOR_CLOSE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Sound of an iron trapdoor closing\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_SMOKE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Spawns 10 smoke particles, e.g. from a fire.  Needs a {{SmokeDirection|SmokeDirection}}\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_BLOCK_BREAK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Block break particle and sound.  Needs a BlockID\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_SPLASH_POTION =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Splash potion particles and glass break sound.  Needs a PotionID\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_EYE_OF_ENDER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Eye of ender entity break particles and sound\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_MOBSPAWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Mob spawn particle effect: smoke and flames\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_HAPPY_VILLAGER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Happy villager/bonemeal particles.  Number of particles may be given or 0 for default of 15\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_DRAGON_BREATH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Dragon breath particle effect\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_END_GATEWAY_SPAWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"End gateway spawn particle effect\",\n\t\t\t\t},\n\t\t\t\tPARTICLE_ENDERDRAGON_GROWL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Ender dragon growl particle effect\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tSmokeDirection =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tAn enumeration of the direction spawned smoke will drift in as it floats up.\n\t\t\t]],\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tSOUTH_EAST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke drifts south-east\",\n\t\t\t\t},\n\t\t\t\tSOUTH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke drifts south\",\n\t\t\t\t},\n\t\t\t\tSOUTH_WEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke drifts south-west\",\n\t\t\t\t},\n\t\t\t\tEAST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke drifts east\",\n\t\t\t\t},\n\t\t\t\tCENTRE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke does not drift\",\n\t\t\t\t},\n\t\t\t\tWEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke drifts west\",\n\t\t\t\t},\n\t\t\t\tNORTH_EAST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke drifts north-east\",\n\t\t\t\t},\n\t\t\t\tNORTH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke drifts north\",\n\t\t\t\t},\n\t\t\t\tNORTH_WEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Smoke drifts west\",\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tCustomStatistic =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tAn enumeration of statistics of the custom type to be used with the {{StatisticsManager#Custom|Custom}} statistics store.\n\t\t\t]],\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tAnimalsBred =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player bred two mobs.\",\n\t\t\t\t},\n\t\t\t\tAviateOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance travelled by elytra.\",\n\t\t\t\t},\n\t\t\t\tBellRing =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player has rung a bell.\",\n\t\t\t\t},\n\t\t\t\tBoatOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance travelled by boats.\",\n\t\t\t\t},\n\t\t\t\tCleanArmor =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of dyed leather armors washed with a cauldron.\",\n\t\t\t\t},\n\t\t\t\tCleanBanner =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of banner patterns washed with a cauldron.\",\n\t\t\t\t},\n\t\t\t\tCleanShulkerBox =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player has washed a Shulker Box with a cauldron.\",\n\t\t\t\t},\n\t\t\t\tClimbOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance travelled up ladders or vines.\",\n\t\t\t\t},\n\t\t\t\tCrouchOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance walked while sneaking.\",\n\t\t\t\t},\n\t\t\t\tDamageAbsorbed =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The amount of damage the player has absorbed in tenths of 1.\",\n\t\t\t\t},\n\t\t\t\tDamageBlockedByShield =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The amount of damage the player has blocked with a shield in tenths of 1.\",\n\t\t\t\t},\n\t\t\t\tDamageDealt =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The amount of damage the player has dealt in tenths 1. Includes only melee attacks.\",\n\t\t\t\t},\n\t\t\t\tDamageDealtAbsorbed =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The amount of damage the player has dealt that was absorbed, in tenths of 1.\",\n\t\t\t\t},\n\t\t\t\tDamageDealtResisted =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The amount of damage the player has dealt that was resisted, in tenths of 1.\",\n\t\t\t\t},\n\t\t\t\tDamageResisted =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The amount of damage the player has resisted in tenths of 1.\",\n\t\t\t\t},\n\t\t\t\tDamageTaken =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The amount of damage the player has taken in tenths of 1.\",\n\t\t\t\t},\n\t\t\t\tDeaths =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player died.\",\n\t\t\t\t},\n\t\t\t\tDrop =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of items the drop key was pressed.\",\n\t\t\t\t},\n\t\t\t\tEatCakeSlice =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of cake slices eaten.\",\n\t\t\t\t},\n\t\t\t\tEnchantItem =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of items enchanted.\",\n\t\t\t\t},\n\t\t\t\tFallOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance fallen.\",\n\t\t\t\t},\n\t\t\t\tFillCauldron =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player filled cauldrons with water buckets.\",\n\t\t\t\t},\n\t\t\t\tFishCaught =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of fish caught.\",\n\t\t\t\t},\n\t\t\t\tFlyOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance flown.\",\n\t\t\t\t},\n\t\t\t\tHorseOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance travelled by horses.\",\n\t\t\t\t},\n\t\t\t\tInspectDispenser =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with dispensers.\",\n\t\t\t\t},\n\t\t\t\tInspectDropper =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with droppers.\",\n\t\t\t\t},\n\t\t\t\tInspectHopper =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with hoppers.\",\n\t\t\t\t},\n\t\t\t\tInteractWithAnvil =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with anvils.\",\n\t\t\t\t},\n\t\t\t\tInteractWithBeacon =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with beacons.\",\n\t\t\t\t},\n\t\t\t\tInteractWithBlastFurnace =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with Blast Furnaces.\",\n\t\t\t\t},\n\t\t\t\tInteractWithBrewingstand =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with brewing stands.\",\n\t\t\t\t},\n\t\t\t\tInteractWithCampfire =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with campfires.\",\n\t\t\t\t},\n\t\t\t\tInteractWithCartographyTable =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with cartography tables.\",\n\t\t\t\t},\n\t\t\t\tInteractWithCraftingTable =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with crafting tables.\",\n\t\t\t\t},\n\t\t\t\tInteractWithFurnace =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with furnaces.\",\n\t\t\t\t},\n\t\t\t\tInteractWithGrindstone =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with grindstones.\",\n\t\t\t\t},\n\t\t\t\tInteractWithLectern =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with lecterns.\",\n\t\t\t\t},\n\t\t\t\tInteractWithLoom =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with looms.\",\n\t\t\t\t},\n\t\t\t\tInteractWithSmithingTable =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with smithing tables.\",\n\t\t\t\t},\n\t\t\t\tInteractWithSmoker =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with smokers.\",\n\t\t\t\t},\n\t\t\t\tInteractWithStonecutter =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with stonecutters.\",\n\t\t\t\t},\n\t\t\t\tJunkFished =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The amount of junk fished.\",\n\t\t\t\t},\n\t\t\t\tJump =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of jumps performed.\",\n\t\t\t\t},\n\t\t\t\tLeaveGame =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times disconnected from the server.\",\n\t\t\t\t},\n\t\t\t\tMinecartOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance travelled by minecarts.\",\n\t\t\t\t},\n\t\t\t\tMobKills =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of mobs the player killed.\",\n\t\t\t\t},\n\t\t\t\tOpenBarrel =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player has opened a barrel.\",\n\t\t\t\t},\n\t\t\t\tOpenChest =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player opened chests.\",\n\t\t\t\t},\n\t\t\t\tOpenEnderchest =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player opened ender chests.\",\n\t\t\t\t},\n\t\t\t\tOpenShulkerBox =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player has opened a shulker box.\",\n\t\t\t\t},\n\t\t\t\tPigOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance travelled by pigs via saddles.\",\n\t\t\t\t},\n\t\t\t\tPlayNoteblock =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of note blocks hit.\",\n\t\t\t\t},\n\t\t\t\tPlayOneMinute =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total time played.\",\n\t\t\t\t},\n\t\t\t\tPlayRecord =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of music discs played on a jukebox.\",\n\t\t\t\t},\n\t\t\t\tPlayerKills =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of players the player directly killed.\",\n\t\t\t\t},\n\t\t\t\tPotFlower =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of plants potted into flower pots.\",\n\t\t\t\t},\n\t\t\t\tRaidTrigger =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player has triggered a raid.\",\n\t\t\t\t},\n\t\t\t\tRaidWin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player has won a raid.\",\n\t\t\t\t},\n\t\t\t\tSleepInBed =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player has slept in a bed.\",\n\t\t\t\t},\n\t\t\t\tSneakTime =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The time the player has held down the sneak button.\",\n\t\t\t\t},\n\t\t\t\tSprintOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance sprinted.\",\n\t\t\t\t},\n\t\t\t\tStriderOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance travelled by striders via saddles.\",\n\t\t\t\t},\n\t\t\t\tSwimOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance swum.\",\n\t\t\t\t},\n\t\t\t\tTalkedToVillager =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with villagers (opened the trading GUI).\",\n\t\t\t\t},\n\t\t\t\tTargetHit =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player has shot a target block.\",\n\t\t\t\t},\n\t\t\t\tTimeSinceDeath =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The time since the player's last death.\",\n\t\t\t\t},\n\t\t\t\tTimeSinceRest =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The time since the player's last rest. This is used to spawn phantoms.\",\n\t\t\t\t},\n\t\t\t\tTradedWithVillager =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times traded with villagers.\",\n\t\t\t\t},\n\t\t\t\tTreasureFished =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of treasures fished.\",\n\t\t\t\t},\n\t\t\t\tTriggerTrappedChest =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player opened trapped chests.\",\n\t\t\t\t},\n\t\t\t\tTuneNoteblock =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times interacted with note blocks.\",\n\t\t\t\t},\n\t\t\t\tUseCauldron =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The number of times the player took water from cauldrons with glass bottles.\",\n\t\t\t\t},\n\t\t\t\tWalkOnWaterOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The distance covered while bobbing up and down over water.\",\n\t\t\t\t},\n\t\t\t\tWalkOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance walked.\",\n\t\t\t\t},\n\t\t\t\tWalkUnderWaterOneCm =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The total distance walked underwater.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tGlobals =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThese functions are available directly, without a class instance. Any plugin can call them at any\n\t\t\t\ttime.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tAddFaceDirection =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockFace\",\n\t\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"IsInverse\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"<b>OBSOLETE</b>, use the vector version instead.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"BlockFace\",\n\t\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"InvertDirection\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tReturns =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"By default, returns the coordinates adjacent to the specified block through the specified face. If inverted, returns the coordinates adjacent to the opposite face.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBase64Decode =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Type = \"string\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Decodes a Base64-encoded string into the raw data.\",\n\t\t\t\t},\n\t\t\t\tBase64Encode =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Type = \"string\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Encodes a string into Base64.\",\n\t\t\t\t},\n\t\t\t\tBiomeToString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Type = \"string\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Translates biome enum into biome string. Returns empty string on failure (unknown biome).\",\n\t\t\t\t},\n\t\t\t\tBlockFaceToString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"eBlockFace\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the string representation of the {{Globals#BlockFaces|eBlockFace}} constant. Uses the axis-direction-based names, such as BLOCK_FACE_XP.\",\n\t\t\t\t},\n\t\t\t\tBlockStringToType =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockTypeString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block type parsed from the given string\",\n\t\t\t\t},\n\t\t\t\tClamp =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Number\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Min\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Max\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Clamp the number to the specified range.\",\n\t\t\t\t},\n\t\t\t\tClickActionToString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ClickAction\",\n\t\t\t\t\t\t\tType = \"eClickAction\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a string description of the ClickAction enumerated value\",\n\t\t\t\t},\n\t\t\t\tDamageTypeToString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DamageType\",\n\t\t\t\t\t\t\tType = \"eDamageType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts the {{Globals#eDamageType|DamageType}} to a string representation \",\n\t\t\t\t},\n\t\t\t\tDimensionToString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Dimension\",\n\t\t\t\t\t\t\tType = \"eDimension\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts an {{Globals#eDimension|eDimension}} to a string value. Returns Overworld on failure.\",\n\t\t\t\t},\n\t\t\t\tEscapeString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a copy of the string with all quotes and backslashes escaped by a backslash\",\n\t\t\t\t},\n\t\t\t\tGetIniItemSet =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IniFile\",\n\t\t\t\t\t\t\tType = \"cIniFile\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SectionName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"KeyName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DefaultValue\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the item that has been read from the specified INI file value. If the value is not present in the INI file, the DefaultValue is stored in the file and parsed as the result. Returns empty item if the value cannot be parsed. \",\n\t\t\t\t},\n\t\t\t\tGetSnowStartHeight =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Type = \"number\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the height at which snow will start falling in the {{Globals#EMCSBiome|Biome}}. Check functions IsBiomeCold and IsBiomeVeryCold for more informations.\",\n\t\t\t\t},\n\t\t\t\tGetTime =\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the current OS time, as a unix time stamp (number of seconds since Jan 1, 1970)\",\n\t\t\t\t},\n\t\t\t\tIsBiomeCold =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Type = \"boolean\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the biome is cold (has snow and snowfall at higher elevations but not at regular heights). Doesn't report Very Cold biomes, use IsBiomeVeryCold() for those.\",\n\t\t\t\t},\n\t\t\t\tIsBiomeNoDownfall =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the biome is 'dry', that is, there is no precipitation during rains and storms.\",\n\t\t\t\t},\n\t\t\t\tIsBiomeOcean =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the biome is an ocean biome.\",\n\t\t\t\t},\n\t\t\t\tIsBiomeVeryCold =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the biome is very cold (has snow on ground everywhere, turns top water to ice, has snowfall instead of rain everywhere). Doesn't report mildly cold biomes (where it snows above certain elevation), use IsBiomeCold() for those.\",\n\t\t\t\t},\n\t\t\t\tIsBiomeMountain =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the biome is mountainous (mutations of the extreme hills biome).\"\n\t\t\t\t},\n\t\t\t\tIsBiomeMesa =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the biome is a type of Mesa (mutations of the Mesa biome).\"\n\t\t\t\t},\n\t\t\t\tIsValidBlock =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if BlockType is a known block type\",\n\t\t\t\t},\n\t\t\t\tIsValidItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if ItemType is a known item type\",\n\t\t\t\t},\n\t\t\t\tItemToFullString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the string representation of the item, in the format 'ItemTypeText:ItemDamage * Count'\",\n\t\t\t\t},\n\t\t\t\tItemToString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the string representation of the item type\",\n\t\t\t\t},\n\t\t\t\tItemTypeToString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the string representation of ItemType \",\n\t\t\t\t},\n\t\t\t\tLOG =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SuppressPluginNamePrefix\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Logs a text into the server console and logfile using 'normal' severity (gray text).\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName = \"SuppressPluginNamePrefix\",\n\t\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tNotes = \"Logs the {{cCompositeChat}}'s human-readable text into the server console, using a severity defined by the CompositeChat's MessageType.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tLOGERROR =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SuppressPluginNamePrefix\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Logs a text into the server console and logfile using 'error' severity (black text on red background).\",\n\t\t\t\t},\n\t\t\t\tLOGINFO =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SuppressPluginNamePrefix\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Logs a text into the server console and logfile using 'info' severity (yellow text).\",\n\t\t\t\t},\n\t\t\t\tLOGWARN =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SuppressPluginNamePrefix\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Logs a text into the server console and logfile using 'warning' severity (red text); OBSOLETE, use LOGWARNING() instead.\",\n\t\t\t\t},\n\t\t\t\tLOGWARNING =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SuppressPluginNamePrefix\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Logs a text into the server console and logfile using 'warning' severity (red text).\",\n\t\t\t\t},\n\t\t\t\tmd5 =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"<b>OBSOLETE</b>, use the {{cCryptoHash}} functions instead.<br>Converts a string to a raw binary md5 hash.\",\n\t\t\t\t},\n\t\t\t\tMirrorBlockFaceY =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"eBlockFace\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the {{Globals#BlockFaces|eBlockFace}} that corresponds to the given {{Globals#BlockFaces|eBlockFace}} after mirroring it around the Y axis (or rotating 180 degrees around it).\",\n\t\t\t\t},\n\t\t\t\tNoCaseCompare =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Value1\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Value2\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Case-insensitive string comparison; returns 0 if the strings are the same, -1 if Value1 is smaller and 1 if Value2 is smaller\",\n\t\t\t\t},\n\t\t\t\tNormalizeAngleDegrees =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AngleDegrees\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"AngleDegrees\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the angle, wrapped into the [-180, +180) range.\",\n\t\t\t\t},\n\t\t\t\tReplaceString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"full-string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"to-be-replaced-string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"to-replace-string\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Replaces *each* occurence of to-be-replaced-string in full-string with to-replace-string\",\n\t\t\t\t},\n\t\t\t\tReverseBlockFace =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockFace\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the reversed {{Globals#eBlockFace|eBlockFace}}.\",\n\t\t\t\t},\n\t\t\t\tRotateBlockFaceCCW =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"eBlockFace\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the {{Globals#BlockFaces|eBlockFace}} that corresponds to the given {{Globals#BlockFaces|eBlockFace}} after rotating it around the Y axis 90 degrees counter-clockwise.\",\n\t\t\t\t},\n\t\t\t\tRotateBlockFaceCW =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"eBlockFace\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the {{Globals#BlockFaces|eBlockFace}} that corresponds to the given {{Globals#BlockFaces|eBlockFace}} after rotating it around the Y axis 90 degrees clockwise.\",\n\t\t\t\t},\n\t\t\t\tStringSplit =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SeperatorsString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Seperates string into multiple by splitting every time any of the characters in SeperatorsString is encountered. Returns and array-table of strings.\",\n\t\t\t\t},\n\t\t\t\tStringSplitAndTrim =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SeperatorsString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Seperates string into multiple by splitting every time any of the characters in SeperatorsString is encountered. Each of the separate strings is trimmed (whitespace removed from the beginning and end of the string). Returns an array-table of strings.\",\n\t\t\t\t},\n\t\t\t\tStringSplitWithQuotes =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SeperatorsString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Seperates string into multiple by splitting every time any of the characters in SeperatorsString is encountered. Whitespace wrapped with single or double quotes will be ignored. Returns an array-table of strings.\",\n\t\t\t\t},\n\t\t\t\tStringToBiome =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BiomeType\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts a string representation to a {{Globals#BiomeTypes|BiomeType}} enumerated value. Returns biInvalidBiome if the input is not a recognized biome.\",\n\t\t\t\t},\n\t\t\t\tStringToDamageType =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DamageType\",\n\t\t\t\t\t\t\tType = \"eDamageType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts a string representation to a {{Globals#DamageType|DamageType}} enumerated value. Returns -1 if the inupt is not a recognized damage type.\",\n\t\t\t\t},\n\t\t\t\tStringToDimension =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Dimension\",\n\t\t\t\t\t\t\tType = \"eDimension\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Converts a string representation to a {{Globals#eDimension|eDimension}} enumerated value. Returns dimNotSet if the input is not a recognized dimension.\",\n\t\t\t\t},\n\t\t\t\tStringToItem =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"StringToParse\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DestItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Parses the item specification in the given string and sets it into DestItem; returns true if successful\",\n\t\t\t\t},\n\t\t\t\tStringToMobType =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobTypeString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"(<b>DEPRECATED!</b>) Please use cMonster:StringToMobType(). Converts a string representation to an {{Globals#eMonsterType|eMonsterType}} enumerated value\",\n\t\t\t\t},\n\t\t\t\tStripColorCodes =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes all control codes used by MC for colors and styles\",\n\t\t\t\t},\n\t\t\t\tTrimString =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Removes whitespace at both ends of the string\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\tcaLeftClick =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Left click on a slot\",\n\t\t\t\t},\n\t\t\t\tcaRightClick =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Right click on a slot\",\n\t\t\t\t},\n\t\t\t\tcaShiftLeftClick =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Shift + left click on a slot\",\n\t\t\t\t},\n\t\t\t\tcaShiftRightClick =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Shift + right click on a slot\",\n\t\t\t\t},\n\t\t\t\tcaNumber1 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 1\",\n\t\t\t\t},\n\t\t\t\tcaNumber2 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 2\",\n\t\t\t\t},\n\t\t\t\tcaNumber3 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 3\",\n\t\t\t\t},\n\t\t\t\tcaNumber4 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 4\",\n\t\t\t\t},\n\t\t\t\tcaNumber5 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 5\",\n\t\t\t\t},\n\t\t\t\tcaNumber6 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 6\",\n\t\t\t\t},\n\t\t\t\tcaNumber7 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 7\",\n\t\t\t\t},\n\t\t\t\tcaNumber8 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 8\",\n\t\t\t\t},\n\t\t\t\tcaNumber9 =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Number key 9\",\n\t\t\t\t},\n\t\t\t\tcaMiddleClick =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Middle click, only valid for creative players\",\n\t\t\t\t},\n\t\t\t\tcaDropKey =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Drop a single item\",\n\t\t\t\t},\n\t\t\t\tcaCtrlDropKey =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Drop a full stack\",\n\t\t\t\t},\n\t\t\t\tcaLeftClickOutside =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Left click outside of inventory\",\n\t\t\t\t},\n\t\t\t\tcaRightClickOutside =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Right click outside of inventory\",\n\t\t\t\t},\n\t\t\t\tcaLeftClickOutsideHoldNothing =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Left click outside inventory holding nothing\",\n\t\t\t\t},\n\t\t\t\tcaRightClickOutsideHoldNothing =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Right click outside inventory holding nothing\",\n\t\t\t\t},\n\t\t\t\tcaLeftPaintBegin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Begining of left click paint drag action\",\n\t\t\t\t},\n\t\t\t\tcaRightPaintBegin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Begining of right click paint drag action\",\n\t\t\t\t},\n\t\t\t\tcaMiddlePaintBegin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Begining of middle click paint drag action, only valid for creative players\",\n\t\t\t\t},\n\t\t\t\tcaLeftPaintProgress =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Add slot for left click paint drag action\",\n\t\t\t\t},\n\t\t\t\tcaRightPaintProgress =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Add slot for right click paint drag action\",\n\t\t\t\t},\n\t\t\t\tcaMiddlePaintProgress =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Add slot for middle click paint drag action, only valid for creative players\",\n\t\t\t\t},\n\t\t\t\tcaLeftPaintEnd =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"End of left click paint drag action\",\n\t\t\t\t},\n\t\t\t\tcaRightPaintEnd =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"End of right click paint drag action\",\n\t\t\t\t},\n\t\t\t\tcaMiddlePaintEnd =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"End of middle click paint drag action, only valid for creative players\",\n\t\t\t\t},\n\t\t\t\tcaDblClick =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Double click action\",\n\t\t\t\t},\n\t\t\t\tcaUnknown =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Unknown click action\"\n\t\t\t\t},\n\t\t\t\tdtAdmin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage applied by an admin command\"\n\t\t\t\t},\n\t\t\t\tdtArrow =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by being attacked by a projectile, possibly from a mob\"\n\t\t\t\t},\n\t\t\t\tdtArrowAttack =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by being attacked by a projectile, possibly from a mob\"\n\t\t\t\t},\n\t\t\t\tdtAttack =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage recieved by being attacked by a mob\"\n\t\t\t\t},\n\t\t\t\tdtBurning =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from being on fire\"\n\t\t\t\t},\n\t\t\t\tdtCacti =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from contact with a cactus block\"\n\t\t\t\t},\n\t\t\t\tdtCactus =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from contact with a cactus block\"\n\t\t\t\t},\n\t\t\t\tdtCactusContact =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from contact with a cactus block\"\n\t\t\t\t},\n\t\t\t\tdtCactuses =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from contact with a cactus block\"\n\t\t\t\t},\n\t\t\t\tdtMagmaContact =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from contact with a magma block\"\n\t\t\t\t},\n\t\t\t\tdtMagma =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from contact with a magma block\"\n\t\t\t\t},\n\t\t\t\tdtDrown =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by drowning in water / lava\"\n\t\t\t\t},\n\t\t\t\tdtDrowning =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by drowning in water / lava\"\n\t\t\t\t},\n\t\t\t\tdtEnderPearl =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by throwing an ender pearl and being teleported by it\"\n\t\t\t\t},\n\t\t\t\tdtEntityAttack =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage recieved by being attacked by a mob\"\n\t\t\t\t},\n\t\t\t\tdtEnvironment =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage dealt to mobs from environment: enderman in rain, snow golem in desert\"\n\t\t\t\t},\n\t\t\t\tdtExplosion =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage applied by an explosion\"\n\t\t\t\t},\n\t\t\t\tdtFall =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from falling down. Dealt when hitting the ground\"\n\t\t\t\t},\n\t\t\t\tdtFalling =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from falling down. Dealt when hitting the ground\"\n\t\t\t\t},\n\t\t\t\tdtFireContact =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by standing inside a fire block\"\n\t\t\t\t},\n\t\t\t\tdtHunger =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received from hunger\"\n\t\t\t\t},\n\t\t\t\tdtInFire =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by standing inside a fire block\"\n\t\t\t\t},\n\t\t\t\tdtInVoid =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by falling into the Void (Y < 0)\"\n\t\t\t\t},\n\t\t\t\tdtLava =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by a contact with a lava block\"\n\t\t\t\t},\n\t\t\t\tdtLavaContact =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by a contact with a lava block\"\n\t\t\t\t},\n\t\t\t\tdtLightning =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from being hit by a lightning strike\"\n\t\t\t\t},\n\t\t\t\tdtMob =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by being attacked by a mob\"\n\t\t\t\t},\n\t\t\t\tdtMobAttack =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by being attacked by a mob\"\n\t\t\t\t},\n\t\t\t\tdtOnFire =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from being on fire\"\n\t\t\t\t},\n\t\t\t\tdtPawnAttack =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by being attacked by a mob\"\n\t\t\t\t},\n\t\t\t\tdtPlugin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage applied by an admin command\"\n\t\t\t\t},\n\t\t\t\tdtPoison =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage applied by the poison effect\"\n\t\t\t\t},\n\t\t\t\tdtPoisoning =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage applied by the poison effect\"\n\t\t\t\t},\n\t\t\t\tdtPotionOfHarming =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage applied by the potion of harming\"\n\t\t\t\t},\n\t\t\t\tdtProjectile =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by being attacked by a projectile, possibly from a mob\"\n\t\t\t\t},\n\t\t\t\tdtRangedAttack =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received by being attacked by a projectile, possibly from a mob\"\n\t\t\t\t},\n\t\t\t\tdtStarvation =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received from hunger\"\n\t\t\t\t},\n\t\t\t\tdtStarving =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage received from hunger\"\n\t\t\t\t},\n\t\t\t\tdtSuffocating =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from suffocating inside a block\"\n\t\t\t\t},\n\t\t\t\tdtSuffocation =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from suffocating inside a block\"\n\t\t\t\t},\n\t\t\t\tdtWither =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from the wither effect\"\n\t\t\t\t},\n\t\t\t\tdtWithering =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Damage from the wither effect\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ACACIA_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for acacia door\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ACACIA_FENCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for acacia fence\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ACACIA_FENCE_GATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for acacia fence gate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ACACIA_WOOD_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for acacia wood stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ACTIVATOR_RAIL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for activator rail\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ACTIVE_COMPARATOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for active comparator\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_AIR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for air\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ANVIL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for anvil\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ANVIL_HIGH_DAMAGE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for anvil high damage\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ANVIL_LOW_DAMAGE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for anvil low damage\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ANVIL_NO_DAMAGE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for anvil no damage\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ANVIL_X =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for anvil x\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ANVIL_Z =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for anvil z\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BARRIER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for barrier\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BEACON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for beacon\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bed\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BEDROCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bedrock\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BED_BED_HEAD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bed bed head\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BED_OCCUPIED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bed occupied\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BED_XM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bed xm\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BED_XP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bed xp\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BED_ZM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bed zm\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BED_ZP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bed zp\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BEETROOTS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for beetroots\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BIG_FLOWER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for big flower\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BIRCH_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for birch door\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BIRCH_FENCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for birch fence\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BIRCH_FENCE_GATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for birch fence gate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BIRCH_WOOD_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for birch wood stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BLACK_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for black terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BLACK_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for black shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BLOCK_OF_COAL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for block of coal\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BLOCK_OF_REDSTONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for block of redstone\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BLUE_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for blue glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BLUE_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for blue shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BONE_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bone block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BOOKCASE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for bookcase\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BREWING_STAND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for brewing stand\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BRICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for brick\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BRICK_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for brick stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BROWN_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for brown glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BROWN_MUSHROOM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for brown mushroom\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BROWN_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for brown shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BURNING_FURNACE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for burning furnace\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BUTTON_PRESSED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for button pressed\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BUTTON_XM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for button xm\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BUTTON_XP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for button xp\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BUTTON_YM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for button ym\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BUTTON_YP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for button yp\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BUTTON_ZM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for button zm\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_BUTTON_ZP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for button zp\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CACTUS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cactus\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CAKE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cake\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CARPET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for carpet\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CARROTS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for carrots\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CAULDRON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cauldron\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CHAIN_COMMAND_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for chain command block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CHEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for chest\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CHORUS_FLOWER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for chorus flower\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CHORUS_PLANT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for chorus plant\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CLAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for clay\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_COAL_ORE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for coal ore\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_COBBLESTONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cobblestone\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_COBBLESTONE_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cobblestone stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_COBBLESTONE_WALL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cobblestone wall\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_COBWEB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cobweb\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_COCOA_POD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cocoa pod\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_COMMAND_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for command block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CONCRETE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for concrete\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CONCRETE_POWDER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for concrete powder\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CRAFTING_TABLE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for crafting table\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CROPS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for crops\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CYAN_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cyan glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_CYAN_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for cyan shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DANDELION =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dandelion\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DARK_OAK_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dark oak door\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DARK_OAK_FENCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dark oak fence\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DARK_OAK_FENCE_GATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dark oak fence gate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DARK_OAK_WOOD_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dark oak wood stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DAYLIGHT_SENSOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for daylight sensor\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DEAD_BUSH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dead bush\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DETECTOR_RAIL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for detector rail\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DIAMOND_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for diamond block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DIAMOND_ORE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for diamond ore\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DIRT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dirt\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DISPENSER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dispenser\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DOUBLE_RED_SANDSTONE_SLAB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for double red sandstone slab\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DOUBLE_STONE_SLAB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for double stone slab\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DOUBLE_WOODEN_SLAB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for double wooden slab\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DRAGON_EGG =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dragon egg\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_DROPPER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for dropper\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_EMERALD_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for emerald block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_EMERALD_ORE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for emerald ore\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ENCHANTMENT_TABLE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for enchantment table\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ENDER_CHEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for ender chest\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_END_BRICKS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for end bricks\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_END_GATEWAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for end gateway\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_END_PORTAL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for end portal\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_END_PORTAL_FRAME =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for end portal frame\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_END_ROD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for end rod\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_END_STONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for end stone\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_FARMLAND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for farmland\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_FENCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for fence\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_FENCE_GATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for fence gate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_FIRE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for fire\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_FLOWER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for flower\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_FLOWER_POT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for flower pot\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_FROSTED_ICE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for frosted ice\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_FURNACE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for furnace\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GLASS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for glass\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GLASS_PANE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for glass pane\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GLOWSTONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for glowstone\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GOLD_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for gold block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GOLD_ORE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for gold ore\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GRASS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for grass\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GRASS_PATH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for grass path\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GRAVEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for gravel\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GRAY_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for gray glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GRAY_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for gray shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GREEN_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for green glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_GREEN_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for green shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_HARDENED_CLAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for hardened clay\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_HAY_BALE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for hay bale\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_HEAD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for head\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for heavy weighted pressure plate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_HOPPER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for hopper\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_HUGE_BROWN_MUSHROOM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for huge brown mushroom\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_HUGE_RED_MUSHROOM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for huge red mushroom\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ICE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for ice\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_INACTIVE_COMPARATOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for inactive comparator\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_INVERTED_DAYLIGHT_SENSOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for inverted daylight sensor\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_IRON_BARS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for iron bars\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_IRON_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for iron block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_IRON_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for iron door\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_IRON_ORE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for iron ore\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_IRON_TRAPDOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for iron trapdoor\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_JACK_O_LANTERN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for jack o lantern\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_JUKEBOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for jukebox\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_JUNGLE_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for jungle door\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_JUNGLE_FENCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for jungle fence\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_JUNGLE_FENCE_GATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for jungle fence gate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_JUNGLE_WOOD_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for jungle wood stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LADDER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for ladder\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LAPIS_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for lapis block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LAPIS_ORE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for lapis ore\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LAVA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for lava\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LEAVES =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for leaves\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LEVER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for lever\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for light blue glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LIGHT_BLUE_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for light blue shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for light gray glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LIGHT_GRAY_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for light gray shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for light weighted pressure plate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LILY_PAD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for lily pad\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LIME_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for lime glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LIME_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for lime shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LIT_FURNACE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for lit furnace\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_LOG =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for log\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MAGENTA_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for magenta glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MAGENTA_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for magenta shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MAGMA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for magma\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MAX_TYPE_ID =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for max type id\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MELON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for melon\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MELON_STEM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for melon stem\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MINECART_TRACKS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for minecart tracks\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MOB_SPAWNER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for mob spawner\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MOSSY_COBBLESTONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for mossy cobblestone\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_MYCELIUM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for mycelium\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NETHERRACK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for netherrack\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NETHER_BRICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for nether brick\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NETHER_BRICK_FENCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for nether brick fence\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NETHER_BRICK_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for nether brick stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NETHER_PORTAL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for nether portal\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NETHER_QUARTZ_ORE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for nether quartz ore\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NETHER_WART =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for nether wart\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NETHER_WART_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for nether wart block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NEW_LEAVES =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for new leaves\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NEW_LOG =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for new log\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NOTE_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for note block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_NUMBER_OF_TYPES =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for number of types\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_OAK_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for oak door\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_OAK_FENCE_GATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for oak fence gate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_OAK_WOOD_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for oak wood stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_OBSERVER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for observer\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_OBSIDIAN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for obsidian\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ORANGE_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for orange glazed terracota\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_ORANGE_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for orange shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PACKED_ICE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for packed ice\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PINK_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for pink glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PINK_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for pink shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PISTON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for piston\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PISTON_EXTENSION =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for piston extension\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PISTON_MOVED_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for piston moved block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PLANKS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for planks\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_POTATOES =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for potatoes\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_POWERED_RAIL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for powered rail\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PRISMARINE_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for prismarine block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PUMPKIN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for pumpkin\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PUMPKIN_STEM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for pumpkin stem\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PURPLE_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for purple glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PURPLE_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for purple shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PURPUR_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for purpur block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PURPUR_DOUBLE_SLAB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for purpur double slab\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PURPUR_PILLAR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for purpur pillar\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PURPUR_SLAB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for purpur slab\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_PURPUR_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for purpur stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_QUARTZ_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for quartz block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_QUARTZ_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for quartz stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RAIL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for rail\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_LAMP_OFF =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone lamp off\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_LAMP_ON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone lamp on\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_ORE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone ore\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_ORE_GLOWING =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone ore glowing\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_REPEATER_OFF =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone repeater off\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_REPEATER_ON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone repeater on\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_TORCH_OFF =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone torch off\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_TORCH_ON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone torch on\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REDSTONE_WIRE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for redstone wire\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RED_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for red glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RED_MUSHROOM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for red mushroom\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RED_NETHER_BRICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for red nether brick\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RED_ROSE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for red rose\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RED_SANDSTONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for red sandstone\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RED_SANDSTONE_SLAB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for red sandstone slab\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RED_SANDSTONE_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for red sandstone stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_RED_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for red shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REEDS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for reeds\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_REPEATING_COMMAND_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for repeating command block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SAND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sand\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SANDSTONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sandstone\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SANDSTONE_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sandstone stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SAPLING =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sapling\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SEA_LANTERN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sea lantern\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SIGN_POST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sign post\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SILVERFISH_EGG =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for silverfish egg\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SLIME_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for slime block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SNOW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for snow\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SNOW_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for snow block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SOULSAND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for soulsand\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SPONGE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sponge\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SPRUCE_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for spruce door\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SPRUCE_FENCE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for spruce fence\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SPRUCE_FENCE_GATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for spruce fence gate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SPRUCE_WOOD_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for spruce wood stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STAINED_CLAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stained clay\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STAINED_GLASS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stained glass\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STAINED_GLASS_PANE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stained glass pane\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STAIRS_UPSIDE_DOWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stairs upside down\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STAIRS_XM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stairs xm\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STAIRS_XP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stairs xp\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STAIRS_ZM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stairs zm\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STAIRS_ZP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stairs zp\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STANDING_BANNER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for standing banner\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STATIONARY_LAVA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stationary lava\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STATIONARY_WATER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stationary water\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STICKY_PISTON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sticky piston\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stone\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STONE_BRICKS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stone bricks\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STONE_BRICK_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stone brick stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STONE_BUTTON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stone button\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STONE_PRESSURE_PLATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stone pressure plate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STONE_SLAB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for stone slab\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STRUCTURE_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for structure block\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_STRUCTURE_VOID =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for structure void\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_SUGARCANE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for sugarcane\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_TALL_GRASS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for tall grass\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for terracotta (synonym for E_BLOCK_STAINED_CLAY)\",\n\t\t\t\t},\n\t\t\t\tE_BLOCK_TNT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for tnt\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_TORCH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for torch\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_TRAPDOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for trapdoor\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_TRAPPED_CHEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for trapped chest\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_TRIPWIRE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for tripwire\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_TRIPWIRE_HOOK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for tripwire hook\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_UNFINISHED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Internal blocktype for unfinished block handlers\",\n\t\t\t\t},\n\t\t\t\tE_BLOCK_VINES =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for vines\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WALLSIGN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for wallsign\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WALL_BANNER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for wall banner\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WATER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for water\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WHITE_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for white glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WHITE_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for white shulker box\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WOODEN_BUTTON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for wooden button\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WOODEN_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for wooden door\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WOODEN_PRESSURE_PLATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for wooden pressure plate\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WOODEN_SLAB =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for wooden slab\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WOODEN_STAIRS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for wooden stairs\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WOOL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for wool\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_WORKBENCH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for workbench\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_YELLOW_FLOWER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for yellow flower\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_YELLOW_GLAZED_TERRACOTTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for yellow glazed terracotta\"\n\t\t\t\t},\n\t\t\t\tE_BLOCK_YELLOW_SHULKER_BOX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The blocktype for yellow shulker box\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_11_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for 11 disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_13_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for 13 disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ACACIA_BOAT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for acacia boat\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ACACIA_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for acacia door\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ARMOR_STAND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for armor stand\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ARROW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for arrow\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BAKED_POTATO =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for baked potato\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BANNER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for banner\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for bed\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BEETROOT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for beetroot\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BEETROOT_SEEDS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for beetroot seeds\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BEETROOT_SOUP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for betroot soup\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BIRCH_BOAT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for birch boat\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BIRCH_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for birch door\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BLAZE_POWDER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for blaze powder\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BLAZE_ROD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for blaze rod\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BLOCKS_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for blocks disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BOAT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for boat\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for bone\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BOOK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for book\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BOOK_AND_QUILL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for book and quill\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BOTTLE_O_ENCHANTING =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for bottle o enchanting\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BOW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for bow\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BOWL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for bowl\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BREAD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for bread\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BREWING_STAND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for brewing stand\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_BUCKET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for bucket\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CAKE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cake\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CARROT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for carrot\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CARROT_ON_STICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for carrot on stick\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CAT_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cat disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CAULDRON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cauldron\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CHAIN_BOOTS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for chain boots\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CHAIN_CHESTPLATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for chain chestplate\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CHAIN_HELMET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for chain helmet\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CHAIN_LEGGINGS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for chain leggings\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CHEST_MINECART =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for chest minecart\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CHIRP_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for chirp disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CHORUS_FRUIT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for chorus fruit\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CLAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for clay\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CLAY_BRICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for clay brick\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_CLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for clock\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COAL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for coal\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COMPARATOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for comparator\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COMPASS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for compass\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COOKED_CHICKEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cooked chicken\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COOKED_FISH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cooked fish\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COOKED_MUTTON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cooked mutton\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COOKED_PORKCHOP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cooked porkchop\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COOKED_RABBIT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cooked rabbit\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_COOKIE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for cookie\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DARK_OAK_BOAT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for dark oak boat\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DARK_OAK_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for dark oak door\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_AXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond axe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_BOOTS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond boots\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_CHESTPLATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond chestplate\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_HELMET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond helmet\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_HOE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond hoe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_HORSE_ARMOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond horse armor\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_LEGGINGS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond leggings\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_PICKAXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond pickaxe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_SHOVEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond shovel\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DIAMOND_SWORD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for diamond sword\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DRAGON_BREATH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for dragon breath\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_DYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for dye\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_EGG =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for egg\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ELYTRA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for elytra\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_EMERALD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for emerald\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_EMPTY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for empty\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_EMPTY_MAP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for empty map\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ENCHANTED_BOOK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for enchanted book\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_END_CRYSTAL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for end crystal\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ENDER_PEARL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for ender pearl\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_EYE_OF_ENDER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for eye of ender\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FAR_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for far disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FEATHER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for feather\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FERMENTED_SPIDER_EYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for fermented spider eye\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FIREWORK_ROCKET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for firework rocket\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FIREWORK_STAR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for firework star\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FIRE_CHARGE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for fire charge\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FIRST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for first\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FIRST_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for first disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FISHING_ROD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for fishing rod\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FLINT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for flint\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FLINT_AND_STEEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for flint and steel\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FLOWER_POT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for flower pot\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_FURNACE_MINECART =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for furnace minecart\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GHAST_TEAR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for ghast tear\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GLASS_BOTTLE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for glass bottle\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GLISTERING_MELON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for glistering melon\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GLOWSTONE_DUST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for glowstone dust\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLDEN_APPLE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for golden apple\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLDEN_CARROT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for golden carrot\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_AXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold axe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_BOOTS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold boots\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_CHESTPLATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold chestplate\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_HELMET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold helmet\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_HOE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold hoe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_HORSE_ARMOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold horse armor\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_LEGGINGS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold leggings\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_NUGGET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold nugget\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_PICKAXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold pickaxe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_SHOVEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold shovel\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GOLD_SWORD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gold sword\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_GUNPOWDER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for gunpowder\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_HEAD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for head\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_AXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron axe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_BOOTS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron boots\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_CHESTPLATE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron chestplate\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron door\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_HELMET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron helmet\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_HOE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron hoe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_HORSE_ARMOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron horse armor\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_LEGGINGS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron leggings\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_NUGGET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron nugget\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_PICKAXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron pickaxe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_SHOVEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron shovel\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_IRON_SWORD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for iron sword\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ITEM_FRAME =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for item frame\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_JUNGLE_BOAT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for jungle boat\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_JUNGLE_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for jungle door\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LAST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for last\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LAST_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for last disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LAST_DISC_PLUS_ONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for last disc plus one\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LAVA_BUCKET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for lava bucket\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LEAD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for lead\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LEASH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for lead (E_ITEM_LEAD synonym)\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LEATHER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for leather\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LEATHER_BOOTS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for leather boots\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LEATHER_CAP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for leather cap\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LEATHER_PANTS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for leather pants\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LEATHER_TUNIC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for leather tunic\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_LINGERING_POTION =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for lingering potion\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MAGMA_CREAM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for magma cream\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MALL_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for mall disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MAP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for map\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MAX_CONSECUTIVE_TYPE_ID =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for max consecutive type id\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MELLOHI_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for mellohi disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MELON_SEEDS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for melon seeds\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MELON_SLICE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for melon slice\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MILK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for milk\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MINECART =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for minecart\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MINECART_WITH_COMMAND_BLOCK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for minecart with command block\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MINECART_WITH_HOPPER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for minecart with hopper\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MINECART_WITH_TNT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for minecart with tnt\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_MUSHROOM_SOUP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for mushroom soup\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_NAME_TAG =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for name tag\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_NETHER_BRICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for nether brick\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_NETHER_QUARTZ =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for nether quartz\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_NETHER_STAR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for nether star\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_NETHER_WART =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for nether wart\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_NUMBER_OF_CONSECUTIVE_TYPES =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for number of consecutive types\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_PAINTING =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for painting\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_PAPER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for paper\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_POISONOUS_POTATO =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for poisonous potato\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_POPPED_CHORUS_FRUIT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for popped chorus fruit\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_POTATO =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for potato\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_POTION =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for potion\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_POTIONS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for potion (obsolete, use E_ITEM_POTION instead)\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_PRISMARINE_CRYSTALS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for prismarine crystals\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_PRISMARINE_SHARD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for prismarine shard\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_PUMPKIN_PIE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for pumpkin pie\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_PUMPKIN_SEEDS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for pumpkin seeds\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RABBITS_FOOT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for rabbits foot\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RABBIT_HIDE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for rabbit hide\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RABBIT_STEW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for rabbit stew\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RAW_BEEF =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for raw beef\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RAW_CHICKEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for raw chicken\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RAW_FISH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for raw fish\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RAW_MUTTON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for raw mutton\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RAW_PORKCHOP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for raw porkchop\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RAW_RABBIT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for raw rabbit\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_REDSTONE_DUST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for redstone dust\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_REDSTONE_REPEATER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for redstone repeater\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_RED_APPLE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for red apple\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_ROTTEN_FLESH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for rotten flesh\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SADDLE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for saddle\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SEEDS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for seeds\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SHEARS =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for shears\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SHIELD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for shield\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SHULKER_SHELL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for shulker shell\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SIGN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for sign\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SLIMEBALL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for slimeball\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SNOWBALL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for snowball\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SPAWN_EGG =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for spawn egg\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SPECTRAL_ARROW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for spectral arrow\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SPIDER_EYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for spider eye\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SPLASH_POTION =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for splash potion\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SPRUCE_BOAT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for spruce boat\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SPRUCE_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for spruce door\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STAL_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for stal disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STEAK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for steak\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for stick\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STONE_AXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for stone axe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STONE_HOE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for stone hoe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STONE_PICKAXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for stone pickaxe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STONE_SHOVEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for stone shovel\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STONE_SWORD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for stone sword\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STRAD_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for strad disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_STRING =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for string\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SUGAR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for sugar\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SUGARCANE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for sugarcane\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_SUGAR_CANE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for sugar cane\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_TIPPED_ARROW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for tipped arrow\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_TOTEM_OF_UNDYING =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for totem of undying\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WAIT_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for wait disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WARD_DISC =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for ward disc\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WATER_BUCKET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for water bucket\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WHEAT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for wheat\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WOODEN_AXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for wooden axe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WOODEN_DOOR =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for wooden door\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WOODEN_HOE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for wooden hoe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WOODEN_PICKAXE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for wooden pickaxe\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WOODEN_SHOVEL =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for wooden shovel\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WOODEN_SWORD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for wooden sword\"\n\t\t\t\t},\n\t\t\t\tE_ITEM_WRITTEN_BOOK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The itemtype for written book\"\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_BOTTOM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Please use BLOCK_FACE_YM instead. Interacting with the bottom face of the block.\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_EAST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Please use BLOCK_FACE_XM instead. Interacting with the eastern face of the block.\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_MAX =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Used for range checking - highest legal value for an {{Globals#eBlockFace|eBlockFace}}\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_MIN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Used for range checking - lowest legal value for an {{Globals#eBlockFace|eBlockFace}}\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_NONE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Interacting with no block face - swinging the item in the air\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_NORTH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Please use BLOCK_FACE_ZM instead. Interacting with the northern face of the block.\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_SOUTH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Please use BLOCK_FACE_ZP instead. Interacting with the southern face of the block.\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_TOP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Please use BLOCK_FACE_YP instead. Interacting with the top face of the block.\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_WEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Please use BLOCK_FACE_XP instead. Interacting with the western face of the block.\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_XM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Interacting with the X- face of the block\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_XP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Interacting with the X+ face of the block\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_YM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Interacting with the Y- face of the block\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_YP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Interacting with the Y+ face of the block\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_ZM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Interacting with the Z- face of the block\",\n\t\t\t\t},\n\t\t\t\tBLOCK_FACE_ZP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Interacting with the Z+ face of the block\",\n\t\t\t\t},\n\t\t\t\tDIG_STATUS_CANCELLED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The player has let go of the mine block key before finishing mining the block\",\n\t\t\t\t},\n\t\t\t\tDIG_STATUS_DROP_HELD =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The player has dropped a single item using the Drop Item key (default: Q)\",\n\t\t\t\t},\n\t\t\t\tDIG_STATUS_DROP_STACK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The player has dropped a full stack of items using the Drop Item key (default: Q) while holding down a specific modifier key (in windows, control)\",\n\t\t\t\t},\n\t\t\t\tDIG_STATUS_FINISHED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The player thinks that it has finished mining a block\",\n\t\t\t\t},\n\t\t\t\tDIG_STATUS_SHOOT_EAT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The player has finished shooting a bow or finished eating\",\n\t\t\t\t},\n\t\t\t\tDIG_STATUS_STARTED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The player has started digging\",\n\t\t\t\t},\n\t\t\t\tDIG_STATUS_SWAP_ITEM_IN_HAND =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The player has swapped their held item with the item in their offhand slot (1.9)\",\n\t\t\t\t},\n\t\t\t\tE_META_BIG_FLOWER_TOP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The metadata of a big flower block that indicates it is the top block.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_BLACK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is black.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_BLUE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is blue.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_BROWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is brown.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_CYAN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is cyan.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_GRAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is gray.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_GREEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is green.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_LIGHTBLUE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is light blue.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_LIGHTGRAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is light gray.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_LIGHTGREEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is light green.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_MAGENTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is magenta.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_ORANGE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is orange.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_PINK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is pink.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_BLACK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is black.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_BLUE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is blue.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_BROWN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is brown.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_CYAN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is cyan.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_GRAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is gray.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_GREEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is green.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_LIGHTBLUE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is light blue.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_LIGHTGRAY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is light gray.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_LIGHTGREEN =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is light green.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_MAGENTA =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is magenta.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_ORANGE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is orange.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_PINK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is pink.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_PURPLE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is purple.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_RED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is red.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_WHITE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is white.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_POWDER_YELLOW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete powder that indicates that the concrete powder is yellow.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_PURPLE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is purple.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_RED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is red.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_WHITE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is white.\",\n\t\t\t\t},\n\t\t\t\tE_META_CONCRETE_YELLOW =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of concete that indicates that the concrete is yellow.\",\n\t\t\t\t},\n\t\t\t\tE_META_DROPSPENSER_ACTIVATED =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of droppers and dispensers that indicates that the dropper or dispenser is currently activated. If this flag is set, the block must be unpowered first and powered again to shoot the next item.\",\n\t\t\t\t},\n\t\t\t\tE_META_DROPSPENSER_FACING_MASK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A mask that indicates the bits of the metadata that specify the facing of droppers and dispensers.\",\n\t\t\t\t},\n\t\t\t\tE_META_DROPSPENSER_FACING_XM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of droppers and dispensers that indicates that the dropper or dispenser is looking in the negative X direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_DROPSPENSER_FACING_XP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of droppers and dispensers that indicates that the dropper or dispenser is looking in the positive X direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_DROPSPENSER_FACING_YM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of droppers and dispensers that indicates that the dropper or dispenser is looking in the negative Y direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_DROPSPENSER_FACING_YP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of droppers and dispensers that indicates that the dropper or dispenser is looking in the positive Y direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_DROPSPENSER_FACING_ZM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of droppers and dispensers that indicates that the dropper or dispenser is looking in the negative Z direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_DROPSPENSER_FACING_ZP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of droppers and dispensers that indicates that the dropper or dispenser is looking in the positive Z direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_EYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame has an eye in it.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_NO_EYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The lack of the flag in the metadata of end portal frames indicating that the portal frame has an eye in it.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_XM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame is facing the negative X direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_XP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame is facing the positive X direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_ZM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame is facing the negative Z direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_ZP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame is facing the positive Z direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_XM_EYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame is facing the negative X direction and has an ender eye in it.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_XP_EYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame is facing the positive X direction and has an ender eye in it.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_ZM_EYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame is facing the negative Z direction and has an ender eye in it.\",\n\t\t\t\t},\n\t\t\t\tE_META_END_PORTAL_FRAME_ZP_EYE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of end portal frames that indicates that the portal frame is facing the positive Z direction and has an ender eye in it.\",\n\t\t\t\t},\n\t\t\t\tE_META_HEAD_CREEPER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of heads that indicates that the head is a creeper head.\",\n\t\t\t\t},\n\t\t\t\tE_META_HEAD_DRAGON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of heads that indicates that the head is a dragon head.\",\n\t\t\t\t},\n\t\t\t\tE_META_HEAD_PLAYER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of heads that indicates that the head is a player head.\",\n\t\t\t\t},\n\t\t\t\tE_META_HEAD_SKELETON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of heads that indicates that the head is a skeleton head.\",\n\t\t\t\t},\n\t\t\t\tE_META_HEAD_WITHER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of heads that indicates that the head is a wither head.\",\n\t\t\t\t},\n\t\t\t\tE_META_HEAD_ZOMBIE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of heads that indicates that the head is a zombie head.\",\n\t\t\t\t},\n\t\t\t\tE_META_REDSTONE_REPEATER_FACING_ZM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of redstone repeaters that indicates that the repeater is looking in the negative Z direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_REDSTONE_REPEATER_FACING_XP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of redstone repeaters that indicates that the repeater is looking in the positive X direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_REDSTONE_REPEATER_FACING_ZP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of redstone repeaters that indicates that the repeater is looking in the positive Z direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_REDSTONE_REPEATER_FACING_XM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of redstone repeaters that indicates that the repeater is looking in the negative X direction.\",\n\t\t\t\t},\n\t\t\t\tE_META_REDSTONE_REPEATER_FACING_MASK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A mask that indicates the bits of the metadata that specify the facing of redstone repeaters.\",\n\t\t\t\t},\n\t\t\t\tE_META_SPAWN_EGG_ENDERMITE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tE_META_SPAWN_EGG_WITHER_SKELETON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\"\n\t\t\t\t},\n\t\t\t\tE_META_SILVERFISH_EGG_CHISELED_STONE_BRICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of the silverfish egg that the block is made from chiseled stone bricks\"\n\t\t\t\t},\n\t\t\t\tE_META_SILVERFISH_EGG_CRACKED_STONE_BRICK =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of the silverfish egg that the block is made from cracked stone bricks\"\n\t\t\t\t},\n\t\t\t\tE_META_SILVERFISH_EGG_MOSSY_STONE_BRICK =\n\t\t\t\t{\n\t\t\t\t\tNotes =  \"A flag in the metadata of the silverfish egg that the block is made from mossy stone bricks\"\n\t\t\t\t},\n\t\t\t\tE_META_SPONGE_DRY =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of sponges that indicates that the sponge is dry.\",\n\t\t\t\t},\n\t\t\t\tE_META_SPONGE_WET =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of sponges that indicates that the sponge is wet.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_ALL_SIDES  =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on all sides.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_NORTH_WEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the pore texture on north and west side.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_NORTH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on north side.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_NORTH_EAST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on north and east side.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_WEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on west side.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_CENTER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on top.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_EAST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on east side.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_SOUTH_WEST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on south and west side.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_SOUTH =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on south side.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_SOUTH_EAST =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on south and east side.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_STEM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the stem texture on all sides but not on top and bottom.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_CAP =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the outside texture on all sides.\",\n\t\t\t\t},\n\t\t\t\tE_META_MUSHROOM_FULL_STEM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A flag in the metadata of mushroom blocks to display the stem texture on all sides.\",\n\t\t\t\t},\n\t\t\t\tesBed =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A bed explosion. The SourceData param is the {{Vector3i|position}} of the bed.\",\n\t\t\t\t},\n\t\t\t\tesEnderCrystal =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"An ender crystal entity explosion. The SourceData param is the {{cEntity|ender crystal entity}} object.\",\n\t\t\t\t},\n\t\t\t\tesGhastFireball =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A ghast fireball explosion. The SourceData param is the {{cGhastFireballEntity|ghast fireball entity}} object.\",\n\t\t\t\t},\n\t\t\t\tesMonster =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A monster explosion (creeper). The SourceData param is the {{cMonster|monster entity}} object.\",\n\t\t\t\t},\n\t\t\t\tesOther =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Any other explosion. The SourceData param is unused.\",\n\t\t\t\t},\n\t\t\t\tesPlugin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"An explosion started by a plugin, without any further information. The SourceData param is unused. \",\n\t\t\t\t},\n\t\t\t\tesPrimedTNT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A TNT explosion. The SourceData param is the {{cTNTEntity|TNT entity}} object.\",\n\t\t\t\t},\n\t\t\t\tesTNTMinecart =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A TNT minecart explosion. The SourceData param is the {{cMinecartWithTNT|Minecart with TNT entity}} object.\",\n\t\t\t\t},\n\t\t\t\tesWitherBirth =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"An explosion at a wither's birth. The SourceData param is the {{cMonster|wither entity}} object.\",\n\t\t\t\t},\n\t\t\t\tesWitherSkull =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A wither skull explosion. The SourceData param is the {{cWitherSkullEntity|wither skull entity}} object.\",\n\t\t\t\t},\n\n\t\t\t\t-- eMonsterType:\n\t\t\t\tmtBat =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtBlaze =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtCaveSpider =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtCat =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtChicken =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtCod =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtCow =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtCreeper =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtDolphin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtDonkey =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtDrowned =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtElderGuardian =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtEnderDragon =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtEnderman =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtEndermite =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtEvoker =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtFox =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtGhast =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtGiant =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtHoglin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtHorse =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtHusk =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtIllusioner =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtInvalidType =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Invalid monster type. Returned when monster type not recognized\",\n\t\t\t\t},\n\t\t\t\tmtIronGolem =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtLlama =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtMagmaCube =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtMooshroom =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtMule =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtOcelot =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtPanda =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtParrot =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtPhantom =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtPig =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtPiglin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtPiglinBrute =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtPillager =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtPolarBear =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtPufferfish =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtRavager =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSalmon =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSheep =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtShulker =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSilverfish =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSkeleton =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSkeletonHorse =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSlime =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtStray =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtStrider =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSnowGolem =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSpider =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtSquid =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtTraderLlama =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtTropicalFish =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtTurtle =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtVex =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtVillager =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtVindicator =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtWanderingTrader =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtWitch =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtWither =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtWitherSkeleton =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtWolf =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtZoglin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtZombie =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtZombieHorse =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtZombiePigman =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtZombifiedPiglin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tmtZombieVillager =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\n\t\t\t\t-- eMessageType:\n\t\t\t\tmtCustom =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Send raw data without any processing\",\n\t\t\t\t},\n\t\t\t\tmtDeath =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Denotes death of player\",\n\t\t\t\t},\n\t\t\t\tmtError =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Something could not be done (i.e. command not executed due to insufficient privilege)\",\n\t\t\t\t},\n\t\t\t\tmtFail =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Something could not be done (i.e. command not executed due to insufficient privilege)\",\n\t\t\t\t},\n\t\t\t\tmtFailure =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Something could not be done (i.e. command not executed due to insufficient privilege)\",\n\t\t\t\t},\n\t\t\t\tmtFatal =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Something catastrophic occured (i.e. plugin crash)\",\n\t\t\t\t},\n\t\t\t\tmtInfo =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Informational message (i.e. command usage)\",\n\t\t\t\t},\n\t\t\t\tmtInformation =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Informational message (i.e. command usage)\",\n\t\t\t\t},\n\t\t\t\tmtJoin =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A player has joined the server\",\n\t\t\t\t},\n\t\t\t\tmtLeave =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A player has left the server\",\n\t\t\t\t},\n\t\t\t\tmtMaxPlusOne =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The first invalid type, used for checking on LuaAPI boundaries\",\n\t\t\t\t},\n\t\t\t\tmtPM =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Player to player messaging identifier\",\n\t\t\t\t},\n\t\t\t\tmtPrivateMessage =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Player to player messaging identifier\",\n\t\t\t\t},\n\t\t\t\tmtSuccess =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Something executed successfully\",\n\t\t\t\t},\n\t\t\t\tmtWarning =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"Something concerning (i.e. reload) is about to happen\",\n\t\t\t\t},\n\t\t\t\tmtWitherSkeleton =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\"\n\t\t\t\t},\n\t\t\t\tSKULL_TYPE_CREEPER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A creeper skull\",\n\t\t\t\t},\n\t\t\t\tSKULL_TYPE_DRAGON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A dragon skull\",\n\t\t\t\t},\n\t\t\t\tSKULL_TYPE_PLAYER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A player skull\",\n\t\t\t\t},\n\t\t\t\tSKULL_TYPE_SKELETON =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A skeleton skull\",\n\t\t\t\t},\n\t\t\t\tSKULL_TYPE_WITHER =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A wither skull\",\n\t\t\t\t},\n\t\t\t\tSKULL_TYPE_ZOMBIE =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A zombie skull\",\n\t\t\t\t},\n\t\t\t\tspCape =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The cape skin part\",\n\t\t\t\t},\n\t\t\t\tspJacket =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The jacket skin part\",\n\t\t\t\t},\n\t\t\t\tspLeftSleeve =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The left sleeve skin part\",\n\t\t\t\t},\n\t\t\t\tspRightSleeve =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The right sleeve skin part\",\n\t\t\t\t},\n\t\t\t\tspLeftPants =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The left pants leg skin part\",\n\t\t\t\t},\n\t\t\t\tspRightPants =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The right pants leg skin part\",\n\t\t\t\t},\n\t\t\t\tspHat =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"The hat/head skin part\",\n\t\t\t\t},\n\t\t\t\tspMask =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"A mask of all valid skin parts combined\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstantGroups =\n\t\t\t{\n\t\t\t\teBlockFace =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^BLOCK_FACE_.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used to describe individual faces of the block. They are used when the\n\t\t\t\t\t\tclient is interacting with a block in the {{OnPlayerBreakingBlock|HOOK_PLAYER_BREAKING_BLOCK}},\n\t\t\t\t\t\t{{OnPlayerBrokenBlock|HOOK_PLAYER_BROKEN_BLOCK}}, {{OnPlayerLeftClick|HOOK_PLAYER_LEFT_CLICK}},\n\t\t\t\t\t\t{{OnPlayerPlacedBlock|HOOK_PLAYER_PLACED_BLOCK}}, {{OnPlayerPlacingBlock|HOOK_PLAYER_PLACING_BLOCK}},\n\t\t\t\t\t\t{{OnPlayerRightClick|HOOK_PLAYER_RIGHT_CLICK}}, {{OnPlayerUsedBlock|HOOK_PLAYER_USED_BLOCK}},\n\t\t\t\t\t\t{{OnPlayerUsedItem|HOOK_PLAYER_USED_ITEM}}, {{OnPlayerUsingBlock|HOOK_PLAYER_USING_BLOCK}},\n\t\t\t\t\t\tand {{OnPlayerUsingItem|HOOK_PLAYER_USING_ITEM}} hooks, or when the {{cLineBlockTracer}} hits a\n\t\t\t\t\t\tblock, etc.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teBlockType =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^E_BLOCK_.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used for block types. They correspond directly with MineCraft's data values\n\t\t\t\t\t\tfor blocks.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teClickAction =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^ca.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used to signalize various interactions that the user can do with the\n\t\t\t\t\t\t{{cWindow|UI windows}}. The server translates the protocol events into these constants. Note\n\t\t\t\t\t\tthat there is a global ClickActionToString() function that can translate these constants into\n\t\t\t\t\t\ttheir textual representation.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teDamageType =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^dt.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used for specifying the cause of damage to entities. They are used in the\n\t\t\t\t\t\t{{TakeDamageInfo}} structure, as well as in {{cEntity}}'s damage-related API functions.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\tDigStatuses =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^DIG_STATUS_.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used to describe digging statuses, but in reality cover several more cases.\n\t\t\t\t\t\tThey are used with {{OnPlayerLeftClick|HOOK_PLAYER_LEFT_CLICK}}.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teDimension =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^dim.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants represent dimension of a world. In Cuberite, the dimension is only reflected in\n\t\t\t\t\t\tthe world's overall tint - overworld gets sky-like colors and dark shades, the nether gets\n\t\t\t\t\t\treddish haze and the end gets dark haze. World generator is not directly affected by the\n\t\t\t\t\t\tdimension, same as fluid simulators; those only default to the expected values if not set\n\t\t\t\t\t\tspecifically otherwise in the world.ini file.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teExplosionSource =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^es.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used to differentiate the various sources of explosions. They are used in\n\t\t\t\t\t\tthe {{OnExploded|HOOK_EXPLODED}} hook, {{OnExploding|HOOK_EXPLODING}} hook and in the\n\t\t\t\t\t\t{{cWorld}}:DoExplosionAt() function. These constants also dictate the type of the additional\n\t\t\t\t\t\tdata provided with the explosions, such as the exploding creeper {{cEntity|entity}} or the\n\t\t\t\t\t\t{{Vector3i|coords}} of the exploding bed.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teGameMode =\n\t\t\t\t{\n\t\t\t\t\tInclude =\n\t\t\t\t\t{\n\t\t\t\t\t\t\"^gm.*\",\n\t\t\t\t\t\t\"^eGameMode_.*\",\n\t\t\t\t\t},\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThe following constants are used for the gamemode - survival, creative or adventure. Use the\n\t\t\t\t\t\tgmXXX constants, the eGameMode_ constants are deprecated and will be removed from the API.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\tEMCSBiome =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^bi.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants represent the biomes that the server understands. Note that there is a global\n\t\t\t\t\t\tStringToBiome() function that can convert a string into one of these constants.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teMessageType =\n\t\t\t\t{\n\t\t\t\t\t-- Need to be specified explicitly, because there's also eMonsterType using the same \"mt\" prefix\n\t\t\t\t\tInclude =\n\t\t\t\t\t{\n\t\t\t\t\t\t\"mtCustom\",\n\t\t\t\t\t\t\"mtDeath\",\n\t\t\t\t\t\t\"mtError\",\n\t\t\t\t\t\t\"mtFail\",\n\t\t\t\t\t\t\"mtFailure\",\n\t\t\t\t\t\t\"mtFatal\",\n\t\t\t\t\t\t\"mtInfo\",\n\t\t\t\t\t\t\"mtInformation\",\n\t\t\t\t\t\t\"mtJoin\",\n\t\t\t\t\t\t\"mtLeave\",\n\t\t\t\t\t\t\"mtMaxPlusOne\",\n\t\t\t\t\t\t\"mtPrivateMessage\",\n\t\t\t\t\t\t\"mtPM\",\n\t\t\t\t\t\t\"mtSuccess\",\n\t\t\t\t\t\t\"mtWarning\",\n\t\t\t\t\t},\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used together with messaging functions and classes, they specify the type of\n\t\t\t\t\t\tmessage being sent. The server can be configured to modify the message text (add prefixes) based\n\t\t\t\t\t\ton the message's type.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teMobHeadType =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"SKULL_TYPE_.*\",\n\t\t\t\t},\n\t\t\t\teMobHeadRotation =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"SKULL_ROTATION_.*\",\n\t\t\t\t},\n\t\t\t\teMonsterType =\n\t\t\t\t{\n\t\t\t\t\tInclude =\n\t\t\t\t\t{\n\t\t\t\t\t\t\"mtInvalidType\",\n\t\t\t\t\t\t\"mtBat\",\n\t\t\t\t\t\t\"mtBlaze\",\n\t\t\t\t\t\t\"mtCaveSpider\",\n\t\t\t\t\t\t\"mtChicken\",\n\t\t\t\t\t\t\"mtCow\",\n\t\t\t\t\t\t\"mtCreeper\",\n\t\t\t\t\t\t\"mtEnderDragon\",\n\t\t\t\t\t\t\"mtEnderman\",\n\t\t\t\t\t\t\"mtGhast\",\n\t\t\t\t\t\t\"mtGiant\",\n\t\t\t\t\t\t\"mtGuardian\",\n\t\t\t\t\t\t\"mtHorse\",\n\t\t\t\t\t\t\"mtIronGolem\",\n\t\t\t\t\t\t\"mtMagmaCube\",\n\t\t\t\t\t\t\"mtMooshroom\",\n\t\t\t\t\t\t\"mtOcelot\",\n\t\t\t\t\t\t\"mtPig\",\n\t\t\t\t\t\t\"mtRabbit\",\n\t\t\t\t\t\t\"mtSheep\",\n\t\t\t\t\t\t\"mtSilverfish\",\n\t\t\t\t\t\t\"mtSkeleton\",\n\t\t\t\t\t\t\"mtSlime\",\n\t\t\t\t\t\t\"mtSnowGolem\",\n\t\t\t\t\t\t\"mtSpider\",\n\t\t\t\t\t\t\"mtSquid\",\n\t\t\t\t\t\t\"mtVillager\",\n\t\t\t\t\t\t\"mtWitch\",\n\t\t\t\t\t\t\"mtWither\",\n\t\t\t\t\t\t\"mtWitherSkeleton\",\n\t\t\t\t\t\t\"mtWolf\",\n\t\t\t\t\t\t\"mtZombie\",\n\t\t\t\t\t\t\"mtZombiePigman\",\n\t\t\t\t\t\t\"mtZombieVillager\",\n\t\t\t\t\t\t\"mtMax\",\n\t\t\t\t\t},\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThe following constants are used for distinguishing between the individual mob types:\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teShrapnelLevel =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^sl.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThe following constants define the block types that are propelled outwards after an explosion.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teSkinPart =\n\t\t\t\t{\n\t\t\t\t\tInclude =\n\t\t\t\t\t{\n\t\t\t\t\t\t\"^sp.*\",\n\t\t\t\t\t},\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants represent various skin part flags.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teSpreadSource =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^ss.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used to differentiate the various sources of spreads, such as grass growing.\n\t\t\t\t\t\tThey are used in the {{OnBlockSpread|HOOK_BLOCK_SPREAD}} hook.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\teWeather =\n\t\t\t\t{\n\t\t\t\t\tInclude =\n\t\t\t\t\t{\n\t\t\t\t\t\t\"^eWeather_.*\",\n\t\t\t\t\t\t\"wSunny\",\n\t\t\t\t\t\t\"wRain\",\n\t\t\t\t\t\t\"wStorm\",\n\t\t\t\t\t\t\"wThunderstorm\",\n\t\t\t\t\t},\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants represent the weather in the world. Note that unlike vanilla, Cuberite allows\n\t\t\t\t\t\tdifferent weathers even in non-overworld {{Globals#eDimension|dimensions}}.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\tItemTypes =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^E_ITEM_.*\",\n\t\t\t\t\tTextBefore = [[\n\t\t\t\t\t\tThese constants are used for item types. They correspond directly with MineCraft's data values\n\t\t\t\t\t\tfor items.\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\tMetaValues =\n\t\t\t\t{\n\t\t\t\t\tInclude = \"^E_META_.*\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tItemCategory =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class contains static functions for determining item categories. All of the functions are\n\t\t\t\tcalled directly on the class table, unlike most other object, which require an instance first.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tIsArmor =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of an armor.\",\n\t\t\t\t},\n\t\t\t\tIsAxe =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of an axe.\",\n\t\t\t\t},\n\t\t\t\tIsBoots =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of boots.\",\n\t\t\t\t},\n\t\t\t\tIsChestPlate =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a chestplate.\",\n\t\t\t\t},\n\t\t\t\tIsHelmet =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a helmet.\",\n\t\t\t\t},\n\t\t\t\tIsHoe =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a hoe.\",\n\t\t\t\t},\n\t\t\t\tIsHorseArmor=\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a horse armor.\",\n\t\t\t\t},\n\t\t\t\tIsLeggings =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a leggings.\",\n\t\t\t\t},\n\t\t\t\tIsMinecart =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a minecart.\",\n\t\t\t\t},\n\t\t\t\tIsPickaxe =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a pickaxe.\",\n\t\t\t\t},\n\t\t\t\tIsShovel =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a shovel.\",\n\t\t\t\t},\n\t\t\t\tIsSword =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a sword.\",\n\t\t\t\t},\n\t\t\t\tIsTool =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a tool (axe, hoe, pickaxe, shovel or FIXME: sword)\",\n\t\t\t\t},\n\t\t\t\tIsVillagerFood =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified item type is any kind of a pickable food by a villager (potato, carrot, wheat, bread and any kind of seeds).\",\n\t\t\t\t}\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe following code snippet checks if the player holds a shovel.\n<pre class=\"prettyprint lang-lua\">\n-- a_Player is a {{cPlayer}} object, possibly received as a hook param\nlocal HeldItem = a_Player:GetEquippedItem()\nif (ItemCategory.IsShovel(HeldItem.m_ItemType)) then\n\t-- It's a shovel\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlxp =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class provides an interface to the XML parser,\n\t\t\t\t{{https://matthewwild.co.uk/projects/luaexpat/|LuaExpat}}. It provides a SAX interface with an\n\t\t\t\tincremental XML parser.</p>\n\t\t\t\t<p>\n\t\t\t\tWith an event-based API like SAX the XML document can be fed to the parser in chunks, and the\n\t\t\t\tparsing begins as soon as the parser receives the first document chunk. LuaExpat reports parsing\n\t\t\t\tevents (such as the start and end of elements) directly to the application through callbacks. The\n\t\t\t\tparsing of huge documents can benefit from this piecemeal operation.</p>\n\t\t\t\t<p>\n\t\t\t\tSee the online\n\t\t\t\t{{https://matthewwild.co.uk/projects/luaexpat/manual.html#parser|LuaExpat documentation}} for details\n\t\t\t\ton how to work with this parser. The code examples below should provide some basic help, too.\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tnew =\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbacksTable\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SeparatorChar\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"XMLParser object\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new XML parser object, with the specified callbacks table and optional separator character.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tConstants =\n\t\t\t{\n\t\t\t\t_COPYRIGHT =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\t_DESCRIPTION =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\t_VERSION =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Parser callbacks\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe callbacks table passed to the new() function specifies the Lua functions that the parser\n\t\t\t\t\t\tcalls upon various events. The following table lists the most common functions used, for a\n\t\t\t\t\t\tcomplete list see the online\n\t\t\t\t\t\t{{https://matthewwild.co.uk/projects/luaexpat/manual.html#parser|LuaExpat documentation}}.</p>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t<tr><th>Function name</th><th>Parameters</th><th>Notes</th></tr>\n\t\t\t\t\t\t<tr><td>CharacterData</td><td>Parser, string</td><td>Called when the parser recognizes a raw string inside the element</td></tr>\n\t\t\t\t\t\t<tr><td>EndElement</td><td>Parser, ElementName</td><td>Called when the parser detects the ending of an XML element</td></tr>\n\t\t\t\t\t\t<tr><td>StartElement</td><td>Parser, ElementName, AttributesTable</td><td>Called when the parser detects the start of an XML element. The AttributesTable is a Lua table containing all the element's attributes, both in the array section (in the order received) and in the dictionary section.</td></tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"XMLParser object\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe XMLParser object returned by lxp.new provides the functions needed to parse the XML. The\n\t\t\t\t\t\tfollowing list provides the most commonly used ones, for a complete list see the online\n\t\t\t\t\t\t{{https://matthewwild.co.uk/projects/luaexpat/manual.html#parser|LuaExpat documentation}}.\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li>close() - closes the parser, freeing all memory used by it.</li>\n\t\t\t\t\t\t\t<li>getCallbacks() - returns the callbacks table for this parser.</li>\n\t\t\t\t\t\t\t<li>parse(string) - parses more document data. the string contains the next part (or possibly all) of the document. Returns non-nil for success or nil, msg, line, col, pos for error.</li>\n\t\t\t\t\t\t\t<li>stop() - aborts parsing (can be called from within the parser callbacks).</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tHeader = \"Code example\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe following code reads an entire XML file and outputs its logical structure into the console:\n<pre class=\"prettyprint lang-lua\">\nlocal Depth = 0;\n\n-- Define the callbacks:\nlocal Callbacks = {\n\tCharacterData = function(a_Parser, a_String)\n\t\tLOG(string.rep(\" \", Depth) .. \"* \" .. a_String);\n\tend\n\n\tEndElement = function(a_Parser, a_ElementName)\n\t\tDepth = Depth - 1;\n\t\tLOG(string.rep(\" \", Depth) .. \"- \" .. a_ElementName);\n\tend\n\n\tStartElement = function(a_Parser, a_ElementName, a_Attribs)\n\t\tLOG(string.rep(\" \", Depth) .. \"+ \" .. a_ElementName);\n\t\tDepth = Depth + 1;\n\tend\n}\n\n-- Create the parser:\nlocal Parser = lxp.new(Callbacks);\n\n-- Parse the XML file:\nlocal f = io.open(\"file.xml\", \"rb\");\nwhile (true) do\n\tlocal block = f:read(128 * 1024);  -- Use a 128KiB buffer for reading\n\tif (block == nil) then\n\t\t-- End of file\n\t\tbreak;\n\tend\n\tParser:parse(block);\nend\n\n-- Signalize to the parser that no more data is coming\nParser:parse();\n\n-- Close the parser:\nParser:close();\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tsqlite3 =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tcomplete =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,  -- Emulate a global function without a self parameter - this is called with a dot convention\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SQL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the input string comprises one or more complete SQL statements.\",\n\t\t\t\t},\n\t\t\t\topen =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,  -- Emulate a global function without a self parameter - this is called with a dot convention\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DBClass\",\n\t\t\t\t\t\t\tType = \"SQLite DB object\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = [[\n\t\t\t\t\tOpens (or creates if it does not exist) an SQLite database with name filename and returns its\n\t\t\t\t\thandle (the returned object should be used for all further method calls in connection\n\t\t\t\t\twith this specific database, see\n\t\t\t\t\t{{http://lua.sqlite.org/index.cgi/doc/tip/doc/lsqlite3.wiki#database_methods|Database methods}}).\n\t\t\t\t\tExample:\n<pre class=\"prettyprint lang-lua\">\n-- open the database:\nmyDB = sqlite3.open('MyDatabaseFile.sqlite3')\n\n-- do some database calls...\n\n-- Close the database:\nmyDB:close()\n</pre>\n\t\t\t\t]],\n\t\t\t\t},\n\t\t\t\topen_memory =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,  -- Emulate a global function without a self parameter - this is called with a dot convention\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DBClass\",\n\t\t\t\t\t\t\tType = \"SQLite DB object\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Opens an SQLite database in memory and returns its handle. In case of an error, the function returns nil, an error code and an error message. (In-memory databases are volatile as they are never stored on disk.)\",\n\t\t\t\t},\n\t\t\t\tversion =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,  -- Emulate a global function without a self parameter - this is called with a dot convention\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a string with SQLite version information, in the form 'x.y[.z]'.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tTakeDamageInfo =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class contains the amount of damage, and the entity that caused the damage. It is used in the\n\t\t\t\t{{OnTakeDamage|HOOK_TAKE_DAMAGE}} hook and in the {{cEntity}}'s TakeDamage() function.\n\t\t\t]],\n\t\t\tVariables =\n\t\t\t{\n\t\t\t\tAttacker =\n\t\t\t\t{\n\t\t\t\t\tType = \"{{cEntity}}\",\n\t\t\t\t\tNotes = \"The entity who is attacking. Only valid if dtAttack.\",\n\t\t\t\t},\n\t\t\t\tDamageType =\n\t\t\t\t{\n\t\t\t\t\tType = \"eDamageType\",\n\t\t\t\t\tNotes = \"Source of the damage. One of the dtXXX constants.\",\n\t\t\t\t},\n\t\t\t\tFinalDamage =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"The final amount of damage that will be applied to the Receiver. It is the RawDamage minus any Receiver's armor-protection.\",\n\t\t\t\t},\n\t\t\t\tKnockback =\n\t\t\t\t{\n\t\t\t\t\tType = \"{{Vector3d}}\",\n\t\t\t\t\tNotes = \"Vector specifying the amount and direction of knockback that will be applied to the Receiver \",\n\t\t\t\t},\n\t\t\t\tRawDamage =\n\t\t\t\t{\n\t\t\t\t\tType = \"number\",\n\t\t\t\t\tNotes = \"Amount of damage that the attack produces on the Receiver, including the Attacker's equipped weapon, but excluding the Receiver's armor.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAdditionalInfo =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tHeader = \"\",\n\t\t\t\t\tContents = [[\n\t\t\t\t\t\tThe TDI is passed as the second parameter in the HOOK_TAKE_DAMAGE hook, and can be used to\n\t\t\t\t\t\tmodify the damage before it is applied to the receiver:\n<pre class=\"prettyprint lang-lua\">\nfunction OnTakeDamage(Receiver, TDI)\n\tLOG(\"Damage: Raw \".. TDI.RawDamage .. \", Final:\" .. TDI.FinalDamage);\n\n\t-- If the attacker is a spider, make it deal 999 points of damage (insta-death spiders):\n\tif ((TDI.Attacker ~= nil) and TDI.Attacker:IsA(\"cSpider\")) then\n\t\tTDI.FinalDamage = 999;\n\tend\nend\n</pre>\n\t\t\t\t\t]],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\ttolua =\n\t\t{\n\t\t\tDesc = [[\n\t\t\t\tThis class represents the tolua bridge between the Lua API and Cuberite. It supports some low\n\t\t\t\tlevel operations and queries on the objects. See also the tolua++'s documentation at\n\t\t\t\t{{https://www8.cs.umu.se/kurser/TDBD12/VT04/lab/lua/tolua++.html#utilities}}. Normally you shouldn't use any of these\n\t\t\t\tfunctions except for type()\n\t\t\t]],\n\t\t\tFunctions =\n\t\t\t{\n\t\t\t\tcast =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,  -- Emulate a global function without a self parameter - this is called with a dot convention\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Object\",\n\t\t\t\t\t\t\tType = \"any\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"TypeStr\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Object\",\n\t\t\t\t\t\t\tType = \"any\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Casts the object to the specified type.<br/><b>Note:</b> This is a potentially unsafe operation and it could crash the server. There is normally no need to use this function at all, so don't use it unless you know exactly what you're doing.\",\n\t\t\t\t},\n\t\t\t\tgetpeer =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tinherit =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\treleaseownership =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\tsetpeer =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\ttakeownership =\n\t\t\t\t{\n\t\t\t\t\tNotes = \"\",\n\t\t\t\t},\n\t\t\t\ttype =\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tIsGlobal = true,  -- Emulate a global function without a self parameter - this is called with a dot convention\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Object\",\n\t\t\t\t\t\t\tType = \"any\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"TypeStr\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a string representing the type of the object. This works similar to Lua's built-in type() function, but recognizes the underlying C++ classes, too.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\tExtraPages =\n\t{\n\t\t{\n\t\t\tFileName = \"Writing-a-Cuberite-plugin.html\",\n\t\t\tTitle = \"Writing a Cuberite plugin\",\n\t\t},\n\t\t{\n\t\t\tFileName = \"InfoFile.html\",\n\t\t\tTitle = \"Using the Info.lua file\",\n\t\t},\n\t\t{\n\t\t\tFileName = \"SettingUpDecoda.html\",\n\t\t\tTitle = \"Setting up the Decoda Lua IDE\",\n\t\t},\n\t\t{\n\t\t\tFileName = \"SettingUpZeroBrane.html\",\n\t\t\tTitle = \"Setting up the ZeroBrane Studio Lua IDE\",\n\t\t},\n\t\t{\n\t\t\tFileName = \"SettingUpLuaLanguageServer.html\",\n\t\t\tTitle = \"Setting up Lua-Language-Server (VSCode/Emacs)\"\n\t\t},\n\t\t{\n\t\t\tFileName = \"UsingChunkStays.html\",\n\t\t\tTitle = \"Using ChunkStays\",\n\t\t},\n\t\t{\n\t\t\tFileName = \"WebWorldThreads.html\",\n\t\t\tTitle = \"Webserver vs World threads\",\n\t\t},\n\t},\n\tIgnoreClasses =\n\t{\n\t\t\"^coroutine$\",\n\t\t\"^g_TrackedPages$\",\n\t\t\"^debug$\",\n\t\t\"^io$\",\n\t\t\"^math$\",\n\t\t\"^package$\",\n\t\t\"^os$\",\n\t\t\"^string$\",\n\t\t\"^table$\",\n\t\t\"^g_Stats$\",\n\t},\n\tIgnoreFunctions =\n\t{\n\t\t\"Globals.assert\",\n\t\t\"%a+%.delete\",\n\t\t\"CreateAPITables\",\n\t\t\"DumpAPIHtml\",\n\t\t\"DumpAPITxt\",\n\t\t\"Initialize\",\n\t\t\"LinkifyString\",\n\t\t\"ListMissingPages\",\n\t\t\"ListUndocumentedObjects\",\n\t\t\"ListUnexportedObjects\",\n\t\t\"LoadAPIFiles\",\n\t\t\"Globals.collectgarbage\",\n\t\t\"ReadDescriptions\",\n\t\t\"ReadHooks\",\n\t\t\"WriteHtmlClass\",\n\t\t\"WriteHtmlHook\",\n\t\t\"WriteStats\",\n\t\t\"Globals.xpcall\",\n\t\t\"Globals.decoda_output\",\n\t\t\"sqlite3.__newindex\",\n\t\t\"%a+%.__%a+\",\n\t\t\"%a+%.%.collector\",\n\t\t\"%a+%.new\",\n\t\t\"%a+%.new_local\",\n\t},\n\tIgnoreConstants =\n\t{\n\t\t\"cChestEntity.__cBlockEntityWindowOwner__\",\n\t\t\"cDropSpenserEntity.__cBlockEntityWindowOwner__\",\n\t\t\"cFurnaceEntity.__cBlockEntityWindowOwner__\",\n\t\t\"cHopperEntity.__cBlockEntityWindowOwner__\",\n\t\t\"cLuaWindow.__cItemGrid__cListener__\",\n\t\t\"Globals._CuberiteInternal_.*\",\n\t\t\"Globals.esMax\",\n\t\t\"Globals.E_BLOCK_*\",\n\t},\n\tIgnoreVariables =\n\t{\n\t\t\"__.*__\",\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/BlockArea.lua",
    "content": "return\n{\n\tcBlockArea =\n\t{\n\t\tDesc = [[\n\t\t\tThis class is used when multiple adjacent blocks are to be manipulated. Because of chunking\n\t\t\tand multithreading, manipulating single blocks using {{cWorld|cWorld:SetBlock}}() is a rather\n\t\t\ttime-consuming operation (locks for exclusive access need to be obtained, chunk lookup is done\n\t\t\tfor each block), so whenever you need to manipulate multiple adjacent blocks, it's better to wrap\n\t\t\tthe operation into a cBlockArea access. cBlockArea is capable of reading / writing across chunk\n\t\t\tboundaries, has no chunk lookups for get and set operations and is not subject to multithreading\n\t\t\tlocking (because it is not shared among threads).</p>\n\t\t\t<p>\n\t\t\tcBlockArea remembers its origin (MinX, MinY, MinZ coords in the Read() call) and therefore supports\n\t\t\tabsolute as well as relative get / set operations. Despite that, the contents of a cBlockArea can\n\t\t\tbe written back into the world at any coords. Most functions in this class come in pair, one that\n\t\t\tworks with the absolute coords (what the coords would have been in the original world the area was read\n\t\t\tfrom) and one (usually with \"Rel\" in their name) that work on the relative coords (those range from\n\t\t\tzero to Size - 1). Also note that most functions will raise an error if an out-of-range coord is\n\t\t\tsupplied to them.</p>\n\t\t\t<p>\n\t\t\tcBlockArea can hold any combination of the following datatypes:<ul>\n\t\t\t\t<li>block types</li>\n\t\t\t\t<li>block metas</li>\n\t\t\t\t<li>blocklight</li>\n\t\t\t\t<li>skylight</li>\n\t\t\t\t<li>block entities (only together with block types)</li>\n\t\t\t</ul>\n\t\t\tRead() and Write() functions have parameters that tell the class which datatypes to read / write.\n\t\t\tNote that a datatype that has not been read cannot be written.</p>\n\t\t\t<p>Block entities stored inside a cBlockArea object have their position set to the relative position\n\t\t\twithin the area.</p>\n\t\t\t<p>\n\t\t\tTypical usage:<ul>\n\t\t\t\t<li>Create cBlockArea object</li>\n\t\t\t\t<li>Read an area from the world / load from file / create anew</li>\n\t\t\t\t<li>Modify blocks inside cBlockArea</li>\n\t\t\t\t<li>Write the area back to a world / save to file</li>\n\t\t\t</ul></p>\n\t\t\t<p>\n\t\t\tCalls to any setter of this class will not trigger simulator updates (lava, water, redstone).\n\t\t\t</p>\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tClear =\n\t\t\t{\n\t\t\t\tNotes = \"Clears the object, resets it to zero size\",\n\t\t\t},\n\t\t\tconstructor =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cBlockArea\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Creates a new empty cBlockArea object\",\n\t\t\t},\n\t\t\tCopyFrom =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockAreaSrc\",\n\t\t\t\t\t\tType = \"cBlockArea\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Copies contents from BlockAreaSrc into self\",\n\t\t\t},\n\t\t\tCopyTo =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockAreaDst\",\n\t\t\t\t\t\tType = \"cBlockArea\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Copies contents from self into BlockAreaDst.\",\n\t\t\t},\n\t\t\tCountNonAirBlocks =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the count of blocks that are not air. Returns 0 if blocktypes not available. Block metas are ignored (if present, air with any meta is still considered air).\",\n\t\t\t},\n\t\t\tCountSpecificBlocks =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Counts the number of occurences of the specified blocktype contained in the area.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Counts the number of occurrences of the specified blocktype + blockmeta combination contained in the area.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tCreate =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SizeX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SizeY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SizeZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Initializes this BlockArea to an empty area of the specified size and origin of {0, 0, 0}. Datatypes are set to baTypes + baMetas. Any previous contents are lost.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SizeX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SizeY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SizeZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Initializes this BlockArea to an empty area of the specified size and origin of {0, 0, 0}. Any previous contents are lost.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Size\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new area of the specified size. Datatypes are set to baTypes + baMetas. Origin is set to all zeroes. BlockTypes are set to air, block metas to zero, blocklights to zero and skylights to full light.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Size\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new area of the specified size and contents. Origin is set to all zeroes. BlockTypes are set to air, block metas to zero, blocklights to zero and skylights to full light.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tCrop =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMinX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMaxX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMinY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMaxY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMinZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMaxZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Crops the specified number of blocks from each border. Modifies the size of this blockarea object.\",\n\t\t\t},  -- Crop\n\n\t\t\tDoWithBlockEntityAt =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"HasCalled\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the specified callback with the block entity at the specified absolute coords. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBlockEntity|BlockEntity}})</pre> Returns false if there's no block entity at the specified coords. Returns the value that the callback has returned otherwise.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Coords\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"HasCalled\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the specified callback with the block entity at the specified absolute coords. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBlockEntity|BlockEntity}})</pre> Returns false if there's no block entity at the specified coords. Returns the value that the callback has returned otherwise.\",\n\t\t\t\t},\n\t\t\t},  -- DoWithBlockEntityAt\n\n\t\t\tDoWithBlockEntityRelAt =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"HasCalled\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the specified callback with the block entity at the specified relative coords. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBlockEntity|BlockEntity}})</pre> Returns false if there's no block entity at the specified coords. Returns the value that the callback has returned otherwise.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelCoords\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"HasCalled\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the specified callback with the block entity at the specified relative coords. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBlockEntity|BlockEntity}})</pre> Returns false if there's no block entity at the specified coords. Returns the value that the callback has returned otherwise.\",\n\t\t\t\t},\n\t\t\t},  -- DoWithBlockEntityRelAt\n\n\t\t\tDumpToRawFile =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Dumps the raw data into a file. For debugging purposes only.\",\n\t\t\t},\n\n\t\t\tExpand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMinX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMaxX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMinY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMaxY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMinZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMaxZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Expands the specified number of blocks from each border. Modifies the size of this blockarea object. New blocks created with this operation are filled with zeroes.\",\n\t\t\t},\n\n\t\t\tFill =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Fills the entire block area with the same values, specified. Uses the DataTypes param to determine which content types are modified.\",\n\t\t\t},\n\n\t\t\tFillRelCuboid =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelCuboid\",\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockLight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Fills the specified cuboid (in relative coords) with the same values (like Fill() ).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxRelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxRelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinRelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxRelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockLight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Fills the specified cuboid with the same values (like Fill() ).\",\n\t\t\t\t},\n\t\t\t},\n\n\t\t\tForEachBlockEntity =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Coords\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\tName = \"HasProcessedAll\",\n\t\t\t\t\tType = \"boolean\",\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback with the block entity for each block entity contained in the object. Returns true if all block entities have been processed (including when there are zero block entities), or false if the callback has aborted the enumeration by returning true. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBlockEntity|BlockEntity}})</pre> The callback should return false or no value to continue with the next block entity, or true to abort the enumeration.\",\n\t\t\t},  -- ForEachBlockEntity\n\n\t\t\tGetBlockLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the blocklight (emissive light) at the specified absolute coords\",\n\t\t\t},\n\n\t\t\tGetBlockMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block meta at the specified absolute coords\",\n\t\t\t},\n\n\t\t\tGetBlockSkyLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the skylight at the specified absolute coords\",\n\t\t\t},\n\n\t\t\tGetBlockType =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block type at the specified absolute coords\",\n\t\t\t},\n\n\t\t\tGetBlockTypeMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block type and meta at the specified absolute coords\",\n\t\t\t},\n\n\t\t\tGetBounds =\n\t\t\t{\n\t\t\t\tParams = {},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Bounds\",\n\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the {{cCuboid|cuboid}} that specifies the original coords of the world from which the area was read. Basically constructs a {{cCuboid}} out of GetOrigin() and GetOrigin() + GetCoordRange().\",\n\t\t\t},\n\n\t\t\tGetCoordRange =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum relative coords in all 3 axes. See also GetSize().\",\n\t\t\t},\n\n\t\t\tGetDataTypes =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the mask of datatypes (ba* constants added together) that the object is currently holding.\",\n\t\t\t},\n\n\t\t\tGetNonAirCropRelCoords =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IgnoredBlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MinRelX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MinRelY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MinRelZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxRelX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxRelY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxRelZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the minimum and maximum coords in each direction for the first block in each direction of type different to IgnoredBlockType (E_BLOCK_AIR by default). If there are no non-ignored blocks within the area, or blocktypes are not present, the returned values are reverse-ranges (MinX <- m_RangeX, MaxX <- 0 etc.). IgnoreBlockType defaults to air.\",\n\t\t\t},\n\n\t\t\tGetOrigin =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OriginX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OriginY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OriginZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the origin coords of where the area was read from.\",\n\t\t\t},\n\n\t\t\tGetOriginX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the origin x-coord\",\n\t\t\t},\n\n\t\t\tGetOriginY =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the origin y-coord\",\n\t\t\t},\n\n\t\t\tGetOriginZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the origin z-coord\",\n\t\t\t},\n\n\t\t\tGetRelBlockLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NIBBLETYPE\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the blocklight at the specified relative coords\",\n\t\t\t},\n\n\t\t\tGetRelBlockMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NIBBLETYPE\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block meta at the specified relative coords\",\n\t\t\t},\n\n\t\t\tGetRelBlockSkyLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NIBBLETYPE\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the skylight at the specified relative coords\",\n\t\t\t},\n\n\n\t\t\tGetRelBlockType =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block type at the specified relative coords\",\n\t\t\t},\n\n\t\t\tGetRelBlockTypeMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NIBBLETYPE\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block type and meta at the specified relative coords\",\n\t\t\t},\n\n\t\t\tGetSize =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SizeX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SizeY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SizeZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the size of the area in all 3 axes. See also GetCoordRange().\",\n\t\t\t},\n\t\t\tGetSizeX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the size of the held data in the x-axis\",\n\t\t\t},\n\t\t\tGetSizeY =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the size of the held data in the y-axis\",\n\t\t\t},\n\t\t\tGetSizeZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the size of the held data in the z-axis\",\n\t\t\t},\n\t\t\tGetVolume =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the volume of the area - the total number of blocks stored within.\",\n\t\t\t},\n\t\t\tGetWEOffset =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the WE offset, a data value sometimes stored in the schematic files. Cuberite doesn't use this value, but provides access to it using this method. The default is {0, 0, 0}.\",\n\t\t\t},\n\t\t\tHasBlockEntities =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if current datatypes include block entities.\",\n\t\t\t},\n\t\t\tHasBlockLights =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if current datatypes include blocklight\",\n\t\t\t},\n\t\t\tHasBlockMetas =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if current datatypes include block metas\",\n\t\t\t},\n\t\t\tHasBlockSkyLights =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if current datatypes include skylight\",\n\t\t\t},\n\t\t\tHasBlockTypes =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if current datatypes include block types\",\n\t\t\t},\n\n\t\t\tIsValidCoords =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified absolute coords are within the area.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Coords\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified absolute coords are within the area.\",\n\t\t\t\t},\n\t\t\t},  -- IsValidCoords\n\n\t\t\tIsValidDataTypeCombination =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the specified combination of datatypes (ba* constants added together) is valid. Most combinations are valid, but for example baBlockEntities without baTypes is an invalid combination.\",\n\t\t\t},  -- IsValidDataTypeCombination\n\n\t\t\tIsValidRelCoords =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified relative coords are within the area.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelCoords\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified relative coords are within the area.\",\n\t\t\t\t},\n\t\t\t},  -- IsValidRelCoords\n\n\t\t\tLoadFromSchematicFile =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{ Type = \"boolean\" },\n\t\t\t\t},\n\t\t\t\tNotes = \"Clears current content and loads new content from the specified schematic file. Returns true if successful. Returns false and logs error if unsuccessful, old content is preserved in such a case.\",\n\t\t\t},\n\t\t\tLoadFromSchematicString =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SchematicData\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{ Type = \"boolean\" },\n\t\t\t\t},\n\t\t\t\tNotes = \"Clears current content and loads new content from the specified string (assumed to contain .schematic data). Returns true if successful. Returns false and logs error if unsuccessful, old content is preserved in such a case.\",\n\t\t\t},\n\t\t\tMerge =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockAreaSrc\",\n\t\t\t\t\t\t\tType = \"cBlockArea\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelMinCoords\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Strategy\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Merges BlockAreaSrc into this object at the specified relative coords, using the specified strategy\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockAreaSrc\",\n\t\t\t\t\t\t\tType = \"cBlockArea\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Strategy\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Merges BlockAreaSrc into this object at the specified relative coords, using the specified strategy\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tMirrorXY =\n\t\t\t{\n\t\t\t\tNotes = \"Mirrors this block area around the XY plane. Modifies blocks' metas (if present) to match (i. e. furnaces facing the opposite direction).\",\n\t\t\t},\n\t\t\tMirrorXYNoMeta =\n\t\t\t{\n\t\t\t\tNotes = \"Mirrors this block area around the XY plane. Doesn't modify blocks' metas.\",\n\t\t\t},\n\t\t\tMirrorXZ =\n\t\t\t{\n\t\t\t\tNotes = \"Mirrors this block area around the XZ plane. Modifies blocks' metas (if present)\",\n\t\t\t},\n\t\t\tMirrorXZNoMeta =\n\t\t\t{\n\t\t\t\tNotes = \"Mirrors this block area around the XZ plane. Doesn't modify blocks' metas.\",\n\t\t\t},\n\t\t\tMirrorYZ =\n\t\t\t{\n\t\t\t\tNotes = \"Mirrors this block area around the YZ plane. Modifies blocks' metas (if present)\",\n\t\t\t},\n\t\t\tMirrorYZNoMeta =\n\t\t\t{\n\t\t\t\tNotes = \"Mirrors this block area around the YZ plane. Doesn't modify blocks' metas.\",\n\t\t\t},\n\t\t\tRead =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Cuboid\",\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reads the area from World, returns true if successful. baTypes and baMetas are read.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Cuboid\",\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reads the area from World, returns true if successful. DataTypes is the sum of baXXX datatypes to be read\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point1\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point2\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reads the area from World, returns true if successful. baTypes and baMetas are read.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point1\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point2\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reads the area from World, returns true if successful. DataTypes is a sum of baXXX datatypes to be read.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reads the area from World, returns true if successful. baTypes and baMetas are read.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Reads the area from World, returns true if successful. DataTypes is a sum of baXXX datatypes to read.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tRelLine =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelPoint1\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelPoint2\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockLight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Draws a line between the two specified points. Sets only datatypes specified by DataTypes (baXXX constants).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX1\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY1\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ1\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelX2\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelY2\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RelZ2\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockLight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Draws a line between the two specified points. Sets only datatypes specified by DataTypes (baXXX constants).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tRotateCCW =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the block area around the Y axis, counter-clockwise (east -> north). Modifies blocks' metas (if present) to match.\",\n\t\t\t},\n\t\t\tRotateCCWNoMeta =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the block area around the Y axis, counter-clockwise (east -> north). Doesn't modify blocks' metas.\",\n\t\t\t},\n\t\t\tRotateCW =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the block area around the Y axis, clockwise (north -> east). Modifies blocks' metas (if present) to match.\",\n\t\t\t},\n\t\t\tRotateCWNoMeta =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the block area around the Y axis, clockwise (north -> east). Doesn't modify blocks' metas.\",\n\t\t\t},\n\t\t\tSaveToSchematicFile =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FileName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Saves the current contents to a schematic file. Returns true if successful.\",\n\t\t\t},\n\t\t\tSaveToSchematicString =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Saves the current contents to a string (in a .schematic file format). Returns the data if successful, nil if failed.\",\n\t\t\t},\n\t\t\tSetBlockLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the blocklight at the specified absolute coords\",\n\t\t\t},\n\t\t\tSetBlockMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the block meta at the specified absolute coords.\",\n\t\t\t},\n\t\t\tSetBlockSkyLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the skylight at the specified absolute coords\",\n\t\t\t},\n\t\t\tSetBlockType =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the block type at the specified absolute coords\",\n\t\t\t},\n\t\t\tSetBlockTypeMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the block type and meta at the specified absolute coords\",\n\t\t\t},\n\t\t\tSetOrigin =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Origin\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Resets the origin for the absolute coords. Only affects how absolute coords are translated into relative coords.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OriginX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OriginY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OriginZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Resets the origin for the absolute coords. Only affects how absolute coords are translated into relative coords.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSetRelBlockLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the blocklight at the specified relative coords\",\n\t\t\t},\n\t\t\tSetRelBlockMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the block meta at the specified relative coords\",\n\t\t\t},\n\t\t\tSetRelBlockSkyLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the skylight at the specified relative coords\",\n\t\t\t},\n\t\t\tSetRelBlockType =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the block type at the specified relative coords\",\n\t\t\t},\n\t\t\tSetRelBlockTypeMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RelBlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the block type and meta at the specified relative coords\",\n\t\t\t},\n\t\t\tSetWEOffset =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Offset\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the WE offset, a data value sometimes stored in the schematic files. Mostly used for WorldEdit. Cuberite doesn't use this value, but provides access to it using this method.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the WE offset, a data value sometimes stored in the schematic files. Mostly used for WorldEdit. Cuberite doesn't use this value, but provides access to it using this method.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tWrite =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinPoint\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Writes the area into World at the specified coords, returns true if successful. All present data types are written.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinPoint\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Writes the area into World at the specified coords, returns true if successful. DataTypes is the sum of baXXX datatypes to write.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Writes the area into World at the specified coords, returns true if successful. All present data types are written.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"World\",\n\t\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DataTypes\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Writes the area into World at the specified coords, returns true if successful. DataTypes is the sum of baXXX datatypes to write.\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tbaBlockEntities =\n\t\t\t{\n\t\t\t\tNotes = \"Operations should work on block entities. Note that this flag is invalid without baTypes.\",\n\t\t\t},\n\t\t\tbaLight =\n\t\t\t{\n\t\t\t\tNotes = \"Operations should work on block (emissive) light\",\n\t\t\t},\n\t\t\tbaMetas =\n\t\t\t{\n\t\t\t\tNotes = \"Operations should work on block metas\",\n\t\t\t},\n\t\t\tbaSkyLight =\n\t\t\t{\n\t\t\t\tNotes = \"Operations should work on skylight\",\n\t\t\t},\n\t\t\tbaTypes =\n\t\t\t{\n\t\t\t\tNotes = \"Operation should work on block types\",\n\t\t\t},\n\t\t\tmsDifference =\n\t\t\t{\n\t\t\t\tNotes = \"Block becomes air if 'self' and src are the same. Otherwise it becomes the src block.\",\n\t\t\t},\n\t\t\tmsFillAir =\n\t\t\t{\n\t\t\t\tNotes = \"'self' is overwritten by Src only where 'self' has air blocks\",\n\t\t\t},\n\t\t\tmsImprint =\n\t\t\t{\n\t\t\t\tNotes = \"Src overwrites 'self' anywhere where 'self' has non-air blocks\",\n\t\t\t},\n\t\t\tmsLake =\n\t\t\t{\n\t\t\t\tNotes = \"Special mode for merging lake images\",\n\t\t\t},\n\t\t\tmsMask =\n\t\t\t{\n\t\t\t\tNotes = \"The blocks that are exactly the same are kept in 'self', all differing blocks are replaced by air\",\n\t\t\t},\n\t\t\tmsOverwrite =\n\t\t\t{\n\t\t\t\tNotes = \"Src overwrites anything in 'self'\",\n\t\t\t},\n\t\t\tmsSimpleCompare =\n\t\t\t{\n\t\t\t\tNotes = \"The blocks that are exactly the same are replaced with air, all differing blocks are replaced by stone\",\n\t\t\t},\n\t\t\tmsSpongePrint =\n\t\t\t{\n\t\t\t\tNotes = \"Similar to msImprint, sponge block doesn't overwrite anything, all other blocks overwrite everything\",\n\t\t\t},\n\t\t},\n\t\tConstantGroups =\n\t\t{\n\t\t\tBATypes =\n\t\t\t{\n\t\t\t\tInclude = \"ba.*\",\n\t\t\t\tTextBefore = [[\n\t\t\t\t\tThe following constants are used to signalize the datatype to read or write:\n\t\t\t\t]],\n\t\t\t},\n\t\t\teMergeStrategy =\n\t\t\t{\n\t\t\t\tInclude = \"ms.*\",\n\t\t\t\tTextAfter = \"See below for a detailed explanation of the individual merge strategies.\",\n\t\t\t\tTextBefore = [[\n\t\t\t\t\tThe Merge() function can use different strategies to combine the source and destination blocks.\n\t\t\t\t\tThe following constants are used:\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t\tAdditionalInfo =\n\t\t{\n\t\t\t{\n\t\t\t\tHeader = \"Merge strategies\",\n\t\t\t\tContents = [[\n\t\t\t\t\t<p>The strategy parameter specifies how individual blocks are combined together, using the table below.\n\t\t\t\t\t</p>\n\t\t\t\t\t<table class=\"inline\">\n\t\t\t\t\t<tbody><tr>\n\t\t\t\t\t<th colspan=\"2\">area block</th><th colspan=\"3\">result</th>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t<th> this </th><th> Src </th><th> msOverwrite </th><th> msFillAir </th><th> msImprint </th>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t<td> air </td><td> air </td><td> air </td><td> air </td><td> air </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t<td> A </td><td> air </td><td> air </td><td> A </td><td> A </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t<td> air </td><td> B </td><td> B </td><td> B </td><td> B </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t<td> A </td><td> B </td><td> B </td><td> A </td><td> B </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t<td> A </td><td> A </td><td> A </td><td> A </td><td> A </td>\n\t\t\t\t\t</td>\n\t\t\t\t\t</tbody></table>\n\n\t\t\t\t\t<p>\n\t\t\t\t\tSo to sum up:\n\t\t\t\t\t<ol>\n\t\t\t\t\t<li class=\"level1\">msOverwrite completely overwrites all blocks with the Src's blocks</li>\n\t\t\t\t\t<li class=\"level1\">msFillAir overwrites only those blocks that were air</li>\n\t\t\t\t\t<li class=\"level1\">msImprint overwrites with only those blocks that are non-air</li>\n\t\t\t\t\t</ol>\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<h3>Special strategies</h3>\n\t\t\t\t\t<p>For each strategy, evaluate the table rows from top downwards, the first match wins.</p>\n\n\t\t\t\t\t<p>\n\t\t\t\t\t<strong>msDifference</strong> - changes all the blocks which are the same to air. Otherwise the source block gets placed.\n\t\t\t\t\t</p>\n\t\t\t\t\t<table><tbody<tr>\n\t\t\t\t\t<th colspan=\"2\"> area block </th><th> </th><th> Notes </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> * </td><td> B </td><td> B </td><td> The blocks are different so we use block B </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> B </td><td> B </td><td> Air </td><td> The blocks are the same so we get air. </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\n\n\t\t\t\t\t<p>\n\t\t\t\t\t<strong>msLake</strong> - used for merging areas with lava and water lakes, in the appropriate generator.\n\t\t\t\t\t</p>\n\t\t\t\t\t<table><tbody><tr>\n\t\t\t\t\t<th colspan=\"2\"> area block </th><th> </th><th> Notes </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<th> self </th><th> Src </th><th> result </th><th> </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A </td><td> sponge </td><td> A </td><td> Sponge is the NOP block </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> *        </td><td> air    </td><td> air    </td><td> Air always gets hollowed out, even under the oceans </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> water    </td><td> *      </td><td> water  </td><td> Water is never overwritten </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> lava     </td><td> *      </td><td> lava   </td><td> Lava is never overwritten </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> *        </td><td> water  </td><td> water  </td><td> Water always overwrites anything </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> *        </td><td> lava   </td><td> lava   </td><td> Lava always overwrites anything </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> dirt     </td><td> stone  </td><td> stone  </td><td> Stone overwrites dirt </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> grass    </td><td> stone  </td><td> stone  </td><td> ... and grass </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> mycelium </td><td> stone  </td><td> stone  </td><td> ... and mycelium </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A        </td><td> stone  </td><td> A      </td><td> ... but nothing else </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A        </td><td> *      </td><td> A      </td><td> Everything else is left as it is </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\n\t\t\t\t\t<p>\n\t\t\t\t\t<strong>msSpongePrint</strong> - used for most prefab-generators to merge the prefabs. Similar to\n\t\t\t\t\tmsImprint, but uses the sponge block as the NOP block instead, so that the prefabs may carve out air\n\t\t\t\t\tpockets, too.\n\t\t\t\t\t</p>\n\t\t\t\t\t<table><tbody><tr>\n\t\t\t\t\t<th colspan=\"2\"> area block </th><th> </th><th> Notes </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<th> self </th><th> Src </th><th> result </th><th> </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A </td><td> sponge </td><td> A </td><td> Sponge is the NOP block </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> * </td><td> B </td><td> B </td><td> Everything else overwrites anything </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\n\t\t\t\t\t<p>\n\t\t\t\t\t<strong>msMask</strong> - the blocks that are the same in the other area are kept, all the\n\t\t\t\t\tdiffering blocks are replaced with air. Meta is used in the comparison, too, two blocks of the\n\t\t\t\t\tsame type but different meta are considered different and thus replaced with air.\n\t\t\t\t\t</p>\n\t\t\t\t\t<table><tbody><tr>\n\t\t\t\t\t<th colspan=\"2\"> area block </th><th> </th><th> Notes </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<th> self </th><th> Src </th><th> result </th><th> </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A </td><td> A </td><td> A </td><td> Same blocks are kept </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A </td><td> non-A </td><td> air </td><td> Differing blocks are replaced with air </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\n\t\t\t\t\t<p>\n\t\t\t\t\t<strong>msDifference</strong> - the blocks that are the same in both areas are replaced with air, all the\n\t\t\t\t\tdiffering blocks are kept from the first area. Meta is used in the comparison, too, two blocks of the\n\t\t\t\t\tsame type but different meta are considered different.\n\t\t\t\t\t</p>\n\t\t\t\t\t<table><tbody><tr>\n\t\t\t\t\t<th colspan=\"2\"> area block </th><th> </th><th> Notes </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<th> self </th><th> Src </th><th> result </th><th> </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A </td><td> A </td><td> air </td><td> Same blocks are replaced with air </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A </td><td> non-A </td><td> A </td><td> Differing blocks are kept from 'self' </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\n\t\t\t\t\t<p>\n\t\t\t\t\t<strong>msSimpleCompare</strong> - the blocks that are the same in both areas are replaced with air, all the\n\t\t\t\t\tdiffering blocks are replaced with stone. Meta is used in the comparison, too, two blocks of the\n\t\t\t\t\tsame type but different meta are considered different.\n\t\t\t\t\t</p>\n\t\t\t\t\t<table><tbody><tr>\n\t\t\t\t\t<th colspan=\"2\"> area block </th><th> </th><th> Notes </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<th> self </th><th> Src </th><th> result </th><th> </th>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A </td><td> A </td><td> air </td><td> Same blocks are replaced with air </td>\n\t\t\t\t\t</tr><tr>\n\t\t\t\t\t<td> A </td><td> non-A </td><td> stone </td><td> Differing blocks are replaced with stone </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n]],\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/BlockEntities.lua",
    "content": "return\n{\n\tcBeaconEntity =\n\t{\n\t\tDesc = [[\n\t\t\tA beacon entity is a {{cBlockEntityWithItems}} descendant that represents a beacon\n\t\t\tin the world.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tCalculatePyramidLevel =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calculate the amount of layers the pyramid below the beacon has.\",\n\t\t\t},\n\t\t\tGetBeaconLevel =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the beacon level. (0 - 4)\",\n\t\t\t},\n\t\t\tGetPrimaryEffect =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectType\",\n\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the primary effect.\",\n\t\t\t},\n\t\t\tGetSecondaryEffect =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectType\",\n\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the secondary effect.\",\n\t\t\t},\n\t\t\tGiveEffects =\n\t\t\t{\n\t\t\t\tNotes = \"Give the near-players the effects.\",\n\t\t\t},\n\t\t\tIsActive =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Is the beacon active?\",\n\t\t\t},\n\t\t\tIsBeaconBlocked =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Is the beacon blocked by non-transparent blocks that are higher than the beacon?\",\n\t\t\t},\n\t\t\tIsMineralBlock =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the block is a diamond block, a golden block, an iron block or an emerald block.\",\n\t\t\t},\n\t\t\tIsValidEffect =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectType\",\n\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BeaconLevel\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the effect can be used.\",\n\t\t\t},\n\t\t\tSetPrimaryEffect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectType\",\n\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Select the primary effect. Returns false when the effect is invalid.\",\n\t\t\t},\n\t\t\tSetSecondaryEffect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectType\",\n\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Select the secondary effect. Returns false when the effect is invalid.\",\n\t\t\t},\n\t\t\tUpdateBeacon =\n\t\t\t{\n\t\t\t\tNotes = \"Update the beacon.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntityWithItems\",\n\t},\n\tcBedEntity =\n\t{\n\t\tDesc = [[\n\t\t\tA bed entity is a {{cBlockEntity}} descendant that represents a bed in the world.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetColor =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the color of the bed.\",\n\t\t\t},\n\t\t\tSetColor =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Set the color of the bed. A value between 0 - 15. The wool meta color values can be used.\",\n\t\t\t},\n\t\t\tIsPillowBlock =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if this is the pillow block, it has then the meta 8.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n\tcBlockEntity =\n\t{\n\t\tDesc = [[\n\t\t\tBlock entities are simply blocks in the world that have persistent data, such as the text for a sign\n\t\t\tor contents of a chest. All block entities are also saved in the chunk data of the chunk they reside in.\n\t\t\tThe cBlockEntity class acts as a common ancestor for all the individual block entities.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetBlockType =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the blocktype which is represented by this blockentity. This is the primary means of type-identification\",\n\t\t\t},\n\t\t\tGetChunkX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the chunk X-coord of the block entity's chunk\",\n\t\t\t},\n\t\t\tGetChunkZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the chunk Z-coord of the block entity's chunk\",\n\t\t\t},\n\t\t\tGetPos =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the parent class, or empty string if no parent class.\",\n\t\t\t},\n\t\t\tGetPosX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block X-coord of the block entity's block\",\n\t\t\t},\n\t\t\tGetPosY =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block Y-coord of the block entity's block\",\n\t\t\t},\n\t\t\tGetPosZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block Z-coord of the block entity's block\",\n\t\t\t},\n\t\t\tGetRelPos =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the relative coords of the block entity's block within its chunk\",\n\t\t\t},\n\t\t\tGetRelX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the relative X coord of the block entity's block within the chunk\",\n\t\t\t},\n\t\t\tGetRelZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the relative Z coord of the block entity's block within the chunk\",\n\t\t\t},\n\t\t\tGetWorld =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cWorld\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the world to which the block entity belongs\",\n\t\t\t},\n\t\t},\n\t},\n\tcBlockEntityWithItems =\n\t{\n\t\tDesc = [[\n\t\t\tThis class is a common ancestor for all {{cBlockEntity|block entities}} that provide item storage.\n\t\t\tInternally, the object has a {{cItemGrid|cItemGrid}} object for storing the items; this ItemGrid is\n\t\t\taccessible through the API. The storage is a grid of items, items in it can be addressed either by a slot\n\t\t\tnumber, or by XY coords within the grid. If a UI window is opened for this block entity, the item storage\n\t\t\tis monitored for changes and the changes are immediately sent to clients of the UI window.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetContents =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItemGrid\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the cItemGrid object representing the items stored within this block entity\",\n\t\t\t},\n\t\t\tGetSlot =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the cItem for the specified slot number. Returns nil for invalid slot numbers\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the cItem for the specified slot coords. Returns nil for invalid slot coords\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSetSlot =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SlotNum\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the cItem for the specified slot number. Ignored if invalid slot number\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cItem\",\n\t\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the cItem for the specified slot coords. Ignored if invalid slot coords\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n\tcBrewingstandEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a brewingstand entity in the world.</p>\n\t\t\t<p>\n\t\t\tSee also the {{cRoot}}:GetBrewingRecipe() function.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetBrewingTimeLeft =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the time until the current items finishes brewing, in ticks\",\n\t\t\t},\n\t\t\tGetIndgredientSlot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the ingredient slot\",\n\t\t\t},\n\t\t\tGetLeftBottleSlot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the left bottle slot\",\n\t\t\t},\n\t\t\tGetMiddleBottleSlot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the middle bottle slot\",\n\t\t\t},\n\t\t\tGetResultItem =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SlotNumber\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the expected result item for the given slot number.\",\n\t\t\t},\n\t\t\tGetRightBottleSlot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the right bottle slot\",\n\t\t\t},\n\t\t\tGetFuelSlot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the top left fuel slot\",\n\t\t\t},\n\t\t\tGetRemainingFuel =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the remaining fuel that is left. It's the amount of brewing operations that can be done (20 for one blaze powder).\",\n\t\t\t},\n\t\t\tGetTimeBrewed =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the time that the current items has been brewing, in ticks\",\n\t\t\t},\n\t\t\tSetIngredientSlot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Ingredient\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the item in the ingredient bottle slot\",\n\t\t\t},\n\t\t\tSetLeftBottleSlot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"LeftSlot\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the item in the left bottle slot\",\n\t\t\t},\n\t\t\tSetMiddleBottleSlot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MiddleSlot\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the item in the middle bottle slot\",\n\t\t\t},\n\t\t\tSetRightBottleSlot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RightSlot\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the item in the right bottle slot\",\n\t\t\t},\n\t\t\tSetFuelSlot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FuelSlot\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the item in the top left fuel slot\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tbsIngredient =\n\t\t\t{\n\t\t\t\tNotes = \"Index of the ingredient slot\",\n\t\t\t},\n\t\t\tbsLeftBottle =\n\t\t\t{\n\t\t\t\tNotes = \"Index of the left bottle slot\",\n\t\t\t},\n\t\t\tbsMiddleBottle =\n\t\t\t{\n\t\t\t\tNotes = \"Index of the middle bottle slot\",\n\t\t\t},\n\t\t\tbsRightBottle =\n\t\t\t{\n\t\t\t\tNotes = \"Index of the right bottle slot\",\n\t\t\t},\n\t\t\tbsFuel =\n\t\t\t{\n\t\t\t\tNotes = \"Index of the top left fuel slot\",\n\t\t\t},\n\t\t\tContentsHeight =\n\t\t\t{\n\t\t\t\tNotes = \"Height (Y) of the {{cItemGrid|cItemGrid}} representing the contents\",\n\t\t\t},\n\t\t\tContentsWidth =\n\t\t\t{\n\t\t\t\tNotes = \"Width (X) of the {{cItemGrid|cItemGrid}} representing the contents\",\n\t\t\t},\n\t\t},\n\t\tConstantGroups =\n\t\t{\n\t\t\tSlotIndices =\n\t\t\t{\n\t\t\t\tInclude = \"bs.*\",\n\t\t\t\tTextBefore = \"When using the GetSlot() or SetSlot() function, use these constants for slot index:\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntityWithItems\",\n\t},\n\tcChestEntity =\n\t{\n\t\tDesc = [[\n\t\t\tA chest entity is a {{cBlockEntityWithItems|cBlockEntityWithItems}} descendant that represents a chest\n\t\t\tin the world. Note that doublechests consist of two separate cChestEntity objects, they do not collaborate\n\t\t\tin any way.</p>\n\t\t\t<p>\n\t\t\tTo manipulate a chest already in the game, you need to use {{cWorld}}'s callback mechanism with\n\t\t\teither DoWithChestAt() or ForEachChestInChunk() function. See the code example below\n\t\t]],\n\t\tConstants =\n\t\t{\n\t\t\tContentsHeight =\n\t\t\t{\n\t\t\t\tNotes = \"Height of the contents' {{cItemGrid|ItemGrid}}, as required by the parent class, {{cBlockEntityWithItems}}\",\n\t\t\t},\n\t\t\tContentsWidth =\n\t\t\t{\n\t\t\t\tNotes = \"Width of the contents' {{cItemGrid|ItemGrid}}, as required by the parent class, {{cBlockEntityWithItems}}\",\n\t\t\t},\n\t\t},\n\t\tAdditionalInfo =\n\t\t{\n\t\t\t{\n\t\t\t\tHeader = \"Code example\",\n\t\t\t\tContents = [[\n\t\t\t\t\tThe following example code sets the top-left item of each chest in the same chunk as Player to\n\t\t\t\t\t64 * diamond:\n<pre class=\"prettyprint lang-lua\">\n-- Player is a {{cPlayer}} object instance\nlocal World = Player:GetWorld();\nWorld:ForEachChestInChunk(Player:GetChunkX(), Player:GetChunkZ(),\n\tfunction (ChestEntity)\n\t\tChestEntity:SetSlot(0, 0, cItem(E_ITEM_DIAMOND, 64));\n\tend\n);\n</pre>\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntityWithItems\",\n\t},\n\tcCommandBlockEntity =\n\t{\n\t\tFunctions =\n\t\t{\n\t\t\tActivate =\n\t\t\t{\n\t\t\t\tNotes = \"Sets the command block to execute a command in the next tick\",\n\t\t\t},\n\t\t\tGetCommand =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Retrieves stored command\",\n\t\t\t},\n\t\t\tGetLastOutput =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Retrieves the last line of output generated by the command block\",\n\t\t\t},\n\t\t\tGetResult =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Retrieves the result (signal strength) of the last operation\",\n\t\t\t},\n\t\t\tSetCommand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the command\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n\tcDispenserEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a dispenser block entity in the world. Most of this block entity's\n\t\t\tfunctionality is implemented in the {{cDropSpenserEntity}} class that represents\n\t\t\tthe behavior common with the {{cDropperEntity|dropper}} block entity.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetShootVector =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a unit vector in the cardinal direction of where the dispenser with the specified meta would be facing.\",\n\t\t\t},\n\t\t\tSpawnProjectileFromDispenser =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Kind\",\n\t\t\t\t\t\tType = \"cProjectileEntity#eKind\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Speed\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Spawns a projectile of the given kind in front of the dispenser with the specified speed. Returns the UniqueID of the spawned projectile, or {{cEntity#INVALID_ID|cEntity.INVALID_ID}} on failure.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cDropSpenserEntity\",\n\t},\n\tcDropperEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a dropper block entity in the world. Most of this block entity's functionality\n\t\t\tis implemented in the {{cDropSpenserEntity|cDropSpenserEntity}} class that represents the behavior\n\t\t\tcommon with the {{cDispenserEntity|dispenser}} entity.</p>\n\t\t\t<p>\n\t\t\tAn object of this class can be created from scratch when generating chunks ({{OnChunkGenerated|OnChunkGenerated}} and {{OnChunkGenerating|OnChunkGenerating}} hooks).\n\t\t]],\n\t\tInherits = \"cDropSpenserEntity\",\n\t},\n\tcDropSpenserEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis is a class that implements behavior common to both {{cDispenserEntity|dispensers}} and {{cDropperEntity|droppers}}.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tActivate =\n\t\t\t{\n\t\t\t\tNotes = \"Sets the block entity to dropspense an item in the next tick\",\n\t\t\t},\n\t\t\tAddDropSpenserDir =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Adjusts the block coords to where the dropspenser items materialize\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tContentsHeight =\n\t\t\t{\n\t\t\t\tNotes = \"Height (Y) of the {{cItemGrid}} representing the contents\",\n\t\t\t},\n\t\t\tContentsWidth =\n\t\t\t{\n\t\t\t\tNotes = \"Width (X) of the {{cItemGrid}} representing the contents\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntityWithItems\",\n\t},\n\tcFlowerPotEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a flower pot entity in the world.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetItem =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the flower pot.\",\n\t\t\t},\n\t\t\tIsItemInPot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Is a flower in the pot?\",\n\t\t\t},\n\t\t\tSetItem =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Set the item in the flower pot\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n\tcFurnaceEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a furnace block entity in the world.</p>\n\t\t\t<p>\n\t\t\tSee also {{cRoot}}'s GetFurnaceRecipe() and GetFurnaceFuelBurnTime() functions\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetCookTimeLeft =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the time until the current item finishes cooking, in ticks\",\n\t\t\t},\n\t\t\tGetFuelBurnTimeLeft =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the time until the current fuel is depleted, in ticks\",\n\t\t\t},\n\t\t\tGetFuelSlot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the fuel slot\",\n\t\t\t},\n\t\t\tGetInputSlot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the input slot\",\n\t\t\t},\n\t\t\tGetOutputSlot =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item in the output slot\",\n\t\t\t},\n\t\t\tGetTimeCooked =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the time that the current item has been cooking, in ticks\",\n\t\t\t},\n\t\t\tHasFuelTimeLeft =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if there's time before the current fuel is depleted\",\n\t\t\t},\n\t\t\tGetAndResetReward =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calculates, resets, and returns the experience reward in this furnace\",\n\t\t\t},\n\t\t\tSetFuelSlot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Fuel\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the item in the fuel slot\",\n\t\t\t},\n\t\t\tSetInputSlot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the item in the input slot\",\n\t\t\t},\n\t\t\tSetOutputSlot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Output\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the item in the output slot\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tContentsHeight =\n\t\t\t{\n\t\t\t\tNotes = \"Height (Y) of the {{cItemGrid|cItemGrid}} representing the contents\",\n\t\t\t},\n\t\t\tContentsWidth =\n\t\t\t{\n\t\t\t\tNotes = \"Width (X) of the {{cItemGrid|cItemGrid}} representing the contents\",\n\t\t\t},\n\t\t\tfsFuel =\n\t\t\t{\n\t\t\t\tNotes = \"Index of the fuel slot\",\n\t\t\t},\n\t\t\tfsInput =\n\t\t\t{\n\t\t\t\tNotes = \"Index of the input slot\",\n\t\t\t},\n\t\t\tfsOutput =\n\t\t\t{\n\t\t\t\tNotes = \"Index of the output slot\",\n\t\t\t},\n\t\t},\n\t\tConstantGroups =\n\t\t{\n\t\t\tSlotIndices =\n\t\t\t{\n\t\t\t\tInclude = \"fs.*\",\n\t\t\t\tTextBefore = \"When using the GetSlot() or SetSlot() function, use these constants for slot index:\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntityWithItems\",\n\t},\n\tcHopperEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a hopper block entity in the world.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetOutputBlockPos =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsAttached\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns whether the hopper is attached, and if so, the block coords of the block receiving the output items, based on the given meta.\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tContentsHeight =\n\t\t\t{\n\t\t\t\tNotes = \"Height (Y) of the internal {{cItemGrid}} representing the hopper contents.\",\n\t\t\t},\n\t\t\tContentsWidth =\n\t\t\t{\n\t\t\t\tNotes = \"Width (X) of the internal {{cItemGrid}} representing the hopper contents.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntityWithItems\",\n\t},\n\tcJukeboxEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a jukebox in the world. It can play the records, either when the\n\t\t\t{{cPlayer|player}} uses the record on the jukebox, or when a plugin instructs it to play.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tEjectRecord =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Ejects the current record as a {{cPickup|pickup}}. No action if there's no current record. To remove record without generating the pickup, use SetRecord(0). Returns true if pickup ejected.\",\n\t\t\t},\n\t\t\tGetRecord =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the record currently present. Zero for no record, E_ITEM_*_DISC for records.\",\n\t\t\t},\n\t\t\tIsPlayingRecord =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the jukebox is playing a record.\",\n\t\t\t},\n\t\t\tIsRecordItem =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ItemType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the specified item is a record that can be played.\",\n\t\t\t},\n\t\t\tPlayRecord =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RecordItemType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Plays the specified Record. Return false if the parameter isn't a playable Record (E_ITEM_XXX_DISC). If there is a record already playing, ejects it first.\",\n\t\t\t},\n\t\t\tSetRecord =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RecordItemType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the currently present record. Use zero for no record, or E_ITEM_*_DISC for records.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n\tcMobHeadEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a mob head block entity in the world.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetOwnerName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the player name of the mob head\",\n\t\t\t},\n\t\t\tGetOwnerTexture =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the player texture of the mob head\",\n\t\t\t},\n\t\t\tGetOwnerTextureSignature =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the signature of the player texture of the mob head\",\n\t\t\t},\n\t\t\tGetOwnerUUID =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the player UUID of the mob head\",\n\t\t\t},\n\t\t\tGetRotation =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"eMobHeadRotation\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the rotation of the mob head\",\n\t\t\t},\n\t\t\tGetType =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"eMobHeadType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the type of the mob head\",\n\t\t\t},\n\t\t\tSetOwner =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"cPlayer\",\n\t\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Set the {{cPlayer|player}} for mob heads with player type\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OwnerUUID\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OwnerName\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OwnerTexture\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OwnerTextureSignature\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the player components for the mob heads with player type\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSetRotation =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Rotation\",\n\t\t\t\t\t\tType = \"eMobHeadRotation\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the rotation of the mob head.\",\n\t\t\t},\n\t\t\tSetType =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"HeadType\",\n\t\t\t\t\t\tType = \"eMobHeadType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Set the type of the mob head\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n\tcMobSpawnerEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a mob spawner block entity in the world.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetEntity =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the entity type that will be spawn by this mob spawner.\",\n\t\t\t},\n\t\t\tGetNearbyMonsterNum =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the amount of this monster type in a radius defined by SetSpawnRange (Y: 4-block radius).\",\n\t\t\t},\n\t\t\tGetNearbyPlayersNum =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the amount of the nearby players in a 16-block radius.\",\n\t\t\t},\n\t\t\tGetSpawnCount =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of entities the spawner will try to spawn on each activation.\",\n\t\t\t},\n\t\t\tGetSpawnRange =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns half the length of the square the spawner tries to spawn entities in.\",\n\t\t\t},\n\t\t\tGetSpawnDelay =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the spawn delay. This is the tick delay that is needed to spawn new monsters.\",\n\t\t\t},\n\t\t\tGetMinSpawnDelay =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the minimum number of ticks the spawner waits until spawning new entities automatically.\",\n\t\t\t},\n\t\t\tGetMaxSpawnDelay =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum number of ticks the spawner waits until spawning new entities automatically.\",\n\t\t\t},\n\t\t\tGetMaxNearbyEntities =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum number of entities of the same type that can be present before the spawner cannot spawn more entities.\",\n\t\t\t},\n\t\t\tGetRequiredPlayerRange =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum euclidean distance from a player where the spawner can be activated.\",\n\t\t\t},\n\t\t\tResetTimer =\n\t\t\t{\n\t\t\t\tNotes = \"Sets the spawn delay to a new random value.\",\n\t\t\t},\n\t\t\tSetEntity =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MobType\",\n\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the type of the mob that will be spawned by this mob spawner.\",\n\t\t\t},\n\t\t\tSetSpawnDelay =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SpawnDelayTicks\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the spawn delay.\",\n\t\t\t},\n\t\t\tSetSpawnCount =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SpawnCount\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the number of entities the spawner will try to spawn in each activation. Might not spawn all of them due to spawn limitations of the entity.\",\n\t\t\t},\n\t\t\tSetSpawnRange =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SpawnRange\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets half the length of the square the spawner will try to spawn entities in.\",\n\t\t\t},\n\t\t\tSetMinSpawnDelay =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MinSpawnDelay\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the minimum amount of ticks the spawner will wait before spawning new entities.\",\n\t\t\t},\n\t\t\tSetMaxSpawnDelay =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxSpawnDelay\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the maximum amount of ticks the spawner will wait before spawning new entities.\",\n\t\t\t},\n\t\t\tSetMaxNearbyEntities =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxNearbyEntities\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the maximum amount of nearby entities until the spawner will stop spawning this entity type.\",\n\t\t\t},\n\t\t\tSetRequiredPlayerRange =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RequiredPlayerRange\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the maximum euclidean distance from a player where the spawner can be activated.\",\n\t\t\t},\n\t\t\tSpawnEntity =\n\t\t\t{\n\t\t\t\tNotes = \"Spawns the entity. NOTE: This function resets the delay before the next automatic activation of the spawner.\",\n\t\t\t},\n\t\t\tUpdateActiveState =\n\t\t\t{\n\t\t\t\tNotes = \"Update the active flag from the mob spawner. This function is called every 5 seconds from the Tick() function.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n\tcNoteEntity =\n\t{\n\t\tDesc = [[\n\t\t\tThis class represents a note block entity in the world. It takes care of the note block's note,\n\t\t\tand also can play the sound, either when the {{cPlayer|player}} right-clicks it, redstone activates\n\t\t\tit, or upon a plugin's request.</p>\n\t\t\t<p>\n\t\t\tThe note is stored as an integer between 0 and 24.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetNote =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the current note set for the block\",\n\t\t\t},\n\t\t\tIncrementNote =\n\t\t\t{\n\t\t\t\tNotes = \"Adds 1 to the current note. Wraps around to 0 when the note cannot go any higher.\",\n\t\t\t},\n\t\t\tMakeSound =\n\t\t\t{\n\t\t\t\tNotes = \"Plays the sound for all {{cClientHandle|clients}} near this block.\",\n\t\t\t},\n\t\t\tSetNote =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Note\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets a new note for the block.\",\n\t\t\t},\n\t\t\tGetPitch =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"(<b>DEPRECATED</b>) Please use cNoteEntity:GetNote. Returns the current pitch set for the block\",\n\t\t\t},\n\t\t\tIncrementPitch =\n\t\t\t{\n\t\t\t\tNotes = \"(<b>DEPRECATED</b>) Please use cNoteEntity:IncrementNote. Adds 1 to the current pitch. Wraps around to 0 when the pitch cannot go any higher.\",\n\t\t\t},\n\t\t\tMakeSound =\n\t\t\t{\n\t\t\t\tNotes = \"Plays the sound for all {{cClientHandle|clients}} near this block.\",\n\t\t\t},\n\t\t\tSetPitch =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Pitch\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"(<b>DEPRECATED</b>) Please use cNoteEntity:SetNote. Sets a new note for the block.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n\tcSignEntity =\n\t{\n\t\tDesc = [[\n\t\t\tA sign entity represents a sign in the world. This class is only used when generating chunks, so\n\t\t\tthat the plugins may generate signs within new chunks. See the code example in {{cChunkDesc}}.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetLine =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"LineIndex\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the specified line. LineIndex is expected between 0 and 3. Returns empty string and logs to server console when LineIndex is invalid.\",\n\t\t\t},\n\t\t\tSetLine =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"LineIndex\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"LineText\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the specified line. LineIndex is expected between 0 and 3. Logs to server console when LineIndex is invalid.\",\n\t\t\t},\n\t\t\tSetLines =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line1\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line2\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line3\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line4\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets all the sign's lines at once. Note that plugins should prefer to use {{cWorld}}:SetSignLines(), so that they can specify the player on whose behalf the sign is being set.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cBlockEntity\",\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/Geometry.lua",
    "content": "\n-- Geometry.lua\n\n-- Defines the documentation for geometry-related classes:\n-- cBoundingBox, cCuboid, cLineBlockTracer, Vector3X\n\n\n\n\nreturn\n{\n\tcBoundingBox =\n\t{\n\t\tDesc = [[\n\t\tRepresents two sets of coordinates, minimum and maximum for each direction; thus defining an\n\t\taxis-aligned cuboid with floating-point boundaries. It supports operations changing the size and\n\t\tposition of the box, as well as querying whether a point or another BoundingBox is inside the box.</p>\n\t\t<p>\n\t\tAll the points within the coordinate limits (inclusive the edges) are considered \"inside\" the box.\n\t\tHowever, for intersection purposes, if the intersection is \"sharp\" in any coord (min1 == max2, i. e.\n\t\tzero volume), the boxes are considered non-intersecting.</p>\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tCalcLineIntersection =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LineStart\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LinePt2\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DoesIntersect\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LineCoeff\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Face\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calculates the intersection of a ray (half-line), given by two of its points, with the bounding box. Returns false if the line doesn't intersect the bounding box, or true, together with coefficient of the intersection (how much of the difference between the two ray points is needed to reach the intersection), and the face of the box which is intersected.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BoxMin\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BoxMax\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LineStart\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LinePt2\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"DoesIntersect\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"LineCoeff\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Face\",\n\t\t\t\t\t\t\tType = \"eBlockFace\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calculates the intersection of a ray (half-line), given by two of its points, with the bounding box specified as its minimum and maximum coords. Returns false if the line doesn't intersect the bounding box, or true, together with coefficient of the intersection (how much of the difference between the two ray points is needed to reach the intersection), and the face of the box which is intersected.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tconstructor =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new bounding box with the specified edges\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Min\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Max\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new bounding box with the coords specified as two vectors\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pos\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Radius\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Height\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new bounding box from the position given and radius (X/Z) and height. Radius is added from X/Z to calculate the maximum coords and subtracted from X/Z to get the minimum; minimum Y is set to Pos.y and maxumim Y to Pos.y plus Height. This corresponds with how {{cEntity|entities}} are represented in Minecraft.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OtherBoundingBox\",\n\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new copy of the given bounding box. Same result can be achieved by using a simple assignment.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pos\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CubeSideLength\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new bounding box as a cube with the specified side length centered around the specified point.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tDoesIntersect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OtherBoundingBox\",\n\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the two bounding boxes have an intersection of nonzero volume.\",\n\t\t\t},\n\t\t\tExpand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExpandX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExpandY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExpandZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Expands this bounding box by the specified amount in each direction (so the box becomes larger by 2 * Expand in each axis).\",\n\t\t\t},\n\t\t\tGetMax =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Point\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the boundary point with the maximum coords\",\n\t\t\t},\n\t\t\tGetMaxX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum X coord of the bounding box\",\n\t\t\t},\n\t\t\tGetMaxY =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum Y coord of the bounding box\",\n\t\t\t},\n\t\t\tGetMaxZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum Z coord of the bounding box\",\n\t\t\t},\n\t\t\tGetMin =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Point\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the boundary point with the minimum coords\",\n\t\t\t},\n\t\t\tGetMinX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the minimum X coord of the bounding box\",\n\t\t\t},\n\t\t\tGetMinY =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the minimum Y coord of the bounding box\",\n\t\t\t},\n\t\t\tGetMinZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the minimum Z coord of the bounding box\",\n\t\t\t},\n\t\t\tIntersect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OtherBbox\",\n\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Intersection\",\n\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Checks if the intersection between this bounding box and another one is non-empty. Returns false if the intersection is empty, true and a new cBoundingBox representing the intersection of the two boxes.\",\n\t\t\t},\n\t\t\tIsInside =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified point is inside (including on the edge) of the box.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PointX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PointY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PointZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified point is inside (including on the edge) of the box.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OtherBoundingBox\",\n\t\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if OtherBoundingBox is inside of this box.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OtherBoxMin\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OtherBoxMax\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the other bounding box, specified by its 2 corners, is inside of this box.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Min\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Max\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified point is inside the bounding box specified by its min / max corners\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Min\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Max\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified point is inside the bounding box specified by its min / max corners\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tMove =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OffsetZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Moves the bounding box by the specified offset in each axis\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Offset\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Moves the bounding box by the specified offset in each axis\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tUnion =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OtherBoundingBox\",\n\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the smallest bounding box that contains both OtherBoundingBox and this bounding box. Note that unlike the strict geometrical meaning of \\\"union\\\", this operation actually returns a cBoundingBox.\",\n\t\t\t},\n\t\t},\n\t},\n\n\n\n\n\n\tcCuboid =\n\t{\n\t\tDesc = [[\n\t\t\tcCuboid offers some native support for integral-boundary cuboids. A cuboid internally consists of\n\t\t\ttwo {{Vector3i}}-s. By default the cuboid doesn't make any assumptions about the defining points,\n\t\t\tbut for most of the operations in the cCuboid class, the p1 member variable is expected to be the\n\t\t\tminima and the p2 variable the maxima. The Sort() function guarantees this condition.</p>\n\t\t\t<p>\n\t\t\tThe Cuboid considers both its edges inclusive.</p>\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tAssign =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SrcCuboid\",\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Copies all the coords from the src cuboid to this cuboid. Sort-state is ignored.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point1\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point2\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Assigns all the coords to the specified values. Sort-state is ignored.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tClamp =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Limits\",\n\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Clamps this cuboid, so that it doesn't reach outside of Limits in any direction. Assumes both cuboids are sorted.\",\n\t\t\t},\n\t\t\tClampSize =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxSize\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Clamps this cuboid's p2 so that the cuboid's size doesn't exceed the specified max size. Assumes the cuboid is sorted.\",\n\t\t\t},\n\t\t\tClampX =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MinX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Clamps both X coords into the range provided. Sortedness-agnostic.\",\n\t\t\t},\n\t\t\tClampY =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MinY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Clamps both Y coords into the range provided. Sortedness-agnostic.\",\n\t\t\t},\n\t\t\tClampZ =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MinZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Clamps both Z coords into the range provided. Sortedness-agnostic.\",\n\t\t\t},\n\t\t\tconstructor =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Cuboid object with all-zero coords\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"OtherCuboid\",\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Cuboid object as a copy of OtherCuboid\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point1\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point2\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Cuboid object with the specified points as its corners.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Cuboid object with the specified point as both its corners (the cuboid has a size of 1 in each direction).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tDifX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the difference between the two X coords (X-size minus 1). Assumes sorted.\",\n\t\t\t},\n\t\t\tDifY =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the difference between the two Y coords (Y-size minus 1). Assumes sorted.\",\n\t\t\t},\n\t\t\tDifZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the difference between the two Z coords (Z-size minus 1). Assumes sorted.\",\n\t\t\t},\n\t\t\tDoesIntersect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OtherCuboid\",\n\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if this cuboid has at least one voxel in common with OtherCuboid. Note that edges are considered inclusive. Assumes both sorted.\",\n\t\t\t},\n\t\t\tEngulf =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Point\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If needed, expands the cuboid to include the specified point. Doesn't shrink. Assumes sorted. \",\n\t\t\t},\n\t\t\tExpand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMinX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMaxX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMinY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMaxY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SubMinZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AddMaxZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Expands the cuboid by the specified amount in each direction. Works on unsorted cuboids as well. NOTE: this function doesn't check for underflows.\",\n\t\t\t},\n\t\t\tGetVolume =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the volume of the cuboid, in blocks. Note that the volume considers both coords inclusive. Works on unsorted cuboids, too.\",\n\t\t\t},\n\t\t\tIsCompletelyInside =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OuterCuboid\",\n\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if this cuboid is completely inside (in all directions) in OuterCuboid. Assumes both sorted.\",\n\t\t\t},\n\t\t\tIsInside =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified point (integral coords) is inside this cuboid. Assumes sorted.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Point\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the specified point (floating-point coords) is inside this cuboid. Assumes sorted.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tIsSorted =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if this cuboid is sorted\",\n\t\t\t},\n\t\t\tMove =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Offset\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Adds the specified offsets to each respective coord, effectively moving the Cuboid. Sort-state is ignored and preserved.\",\n\t\t\t},\n\t\t\tSort =\n\t\t\t{\n\t\t\t\tNotes = \"Sorts the internal representation so that p1 contains the lesser coords and p2 contains the greater coords.\",\n\t\t\t},\n\t\t},\n\t\tVariables =\n\t\t{\n\t\t\tp1 =\n\t\t\t{\n\t\t\t\tType = \"{{Vector3i}}\",\n\t\t\t\tNotes = \"The first corner. Usually the lesser of the two coords in each set\",\n\t\t\t},\n\t\t\tp2 =\n\t\t\t{\n\t\t\t\tType = \"{{Vector3i}}\",\n\t\t\t\tNotes = \"The second corner. Usually the larger of the two coords in each set\",\n\t\t\t},\n\t\t},\n\t},\n\n\n\n\n\n\tcLineBlockTracer =\n\t{\n\t\tDesc = [[\nThis class provides an easy-to-use interface for tracing lines through individual\nblocks in the world. It can either be used to call the provided callbacks according\nto what events it encounters along the way, or there are shortcut functions used for\nthe most popular tracing reasons - line of sight and solid hits.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tFirstSolidHitTrace =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"World\",  Type = \"cWorld\" },\n\t\t\t\t\t\t{ Name = \"StartX\", Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"StartY\", Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"StartZ\", Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndX\",   Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndY\",   Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndZ\",   Type = \"number\" },\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"HasHitSolid\",    Type = \"boolean\" },\n\t\t\t\t\t\t{ Name = \"HitCoords\",      Type = \"Vector3d\" },\n\t\t\t\t\t\t{ Name = \"HitBlockCoords\", Type = \"Vector3i\" },\n\t\t\t\t\t\t{ Name = \"HitBlockFace\",   Type = \"eBlockFace\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"If the specified line hits a solid block, return true and the coordinates / face of the first such solid block hit. Returns false if there's no solid block on that line.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"World\", Type = \"cWorld\" },\n\t\t\t\t\t\t{ Name = \"Start\", Type = \"Vector3d\" },\n\t\t\t\t\t\t{ Name = \"End\",   Type = \"Vector3d\" },\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"HasHitSolid\",    Type = \"boolean\" },\n\t\t\t\t\t\t{ Name = \"HitCoords\",      Type = \"Vector3d\" },\n\t\t\t\t\t\t{ Name = \"HitBlockCoords\", Type = \"Vector3i\" },\n\t\t\t\t\t\t{ Name = \"HitBlockFace\",   Type = \"eBlockFace\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"If the specified line hits a solid block, return true and the coordinates / face of the first such solid block hit. Returns false if there's no solid block on that line.\",\n\t\t\t\t},\n\t\t\t},  -- FirstSolidHitTrace\n\t\t\tLineOfSightTrace =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"World\",  Type = \"cWorld\" },\n\t\t\t\t\t\t{ Name = \"StartX\", Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"StartY\", Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"StartZ\", Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndX\",   Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndY\",   Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndZ\",   Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"Sight\",  Type = \"number\" },\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"CanSee\", Type = \"boolean\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the two points specified are within line of sight of each other. The Sight parameter specifies which blocks are considered transparent for the trace, it is a combination of {{cLineBlockTracer#eLineOfSight|losXXX}} values added together.\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"World\", Type = \"cWorld\" },\n\t\t\t\t\t\t{ Name = \"Start\", Type = \"Vector3d\" },\n\t\t\t\t\t\t{ Name = \"End\",   Type = \"Vector3d\" },\n\t\t\t\t\t\t{ Name = \"Sight\", Type = \"number\" },\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"CanSee\", Type = \"boolean\" },\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns true if the two points specified are within line of sight of each other. The Sight parameter specifies which blocks are considered transparent for the trace, it is a combination of {{cLineBlockTracer#eLineOfSight|losXXX}} values added together.\"\n\t\t\t\t},\n\t\t\t},  -- LineOfSightTrace\n\t\t\tTrace =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"World\",     Type = \"cWorld\" },\n\t\t\t\t\t\t{ Name = \"Callbacks\", Type = \"table\" },\n\t\t\t\t\t\t{ Name = \"StartX\",    Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"StartY\",    Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"StartZ\",    Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndX\",      Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndY\",      Type = \"number\" },\n\t\t\t\t\t\t{ Name = \"EndZ\",      Type = \"number\" },\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"(OBSOLETE, use the Vector3-based overload instead) Performs the trace on the specified line. Returns true if the entire trace was processed (no callback returned true)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{ Name = \"World\",     Type = \"cWorld\" },\n\t\t\t\t\t\t{ Name = \"Callbacks\", Type = \"table\" },\n\t\t\t\t\t\t{ Name = \"Start\",     Type = \"Vector3d\" },\n\t\t\t\t\t\t{ Name = \"End\",       Type = \"Vector3d\" },\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Performs the trace on the specified line. Returns true if the entire trace was processed (no callback returned true)\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tlosAir =\n\t\t\t{\n\t\t\t\tNotes = \"LineOfSight tracing can 'see' through air blocks.\",\n\t\t\t},\n\t\t\tlosWater =\n\t\t\t{\n\t\t\t\tNotes = \"LineOfSight tracing can 'see' through water blocks.\",\n\t\t\t},\n\t\t\tlosLava =\n\t\t\t{\n\t\t\t\tNotes = \"LineOfSight tracing can 'see' through lava blocks.\",\n\t\t\t},\n\t\t},\n\t\tConstantGroups =\n\t\t{\n\t\t\teLineOfSight =\n\t\t\t{\n\t\t\t\tInclude = \"los.*\",\n\t\t\t\tTextBefore = \"The following constants are used to speficy which blocks are see-through when tracing a LineOfSight trace. Add them together to make up the Sight parameter.\",\n\t\t\t},\n\t\t},\n\t\tAdditionalInfo =\n\t\t{\n\t\t\t{\n\t\t\t\tHeader = \"Callbacks\",\n\t\t\t\tContents = [[\nThe Callbacks in the Trace() function is a table that contains named functions. Cuberite will call\nindividual functions from that table for the events that occur on the line - hitting a block, going out of\nvalid world data etc. The following table lists all the available callbacks. If the callback function is\nnot defined, Cuberite skips it. Each function can return a bool value, if it returns true, the tracing is\naborted and Trace() returns false.<br>\nNote: The folowing can only be used when using the Vector3-based Trace() function. When using\nthe number-based overload, the callbacks receive number-based coordinates (see Deprecated\nCallbacks below).</p>\n<p>\n<table><tr><th>Name</th><th>Parameters</th><th>Notes</th></tr>\n<tr><td>OnNextBlock</td><td>BlockPos, BlockType, BlockMeta, EntryFace</td>\n\t<td>Called when the ray hits a new valid block. The block type and meta is given. EntryFace is one of the\n\tBLOCK_FACE_ constants indicating which \"side\" of the block got hit by the ray.</td></tr>\n<tr><td>OnNextBlockNoData</td><td>BlockPos, EntryFace</td>\n\t<td>Called when the ray hits a new block, but the block is in an unloaded chunk - no valid data is\n\tavailable. Only the coords and the entry face are given.</td></tr>\n<tr><td>OnOutOfWorld</td><td>BlockPos</td>\n\t<td>Called when the ray goes outside of the world (Y-wise); the coords specify the exact exit point. Note\n\tthat for other paths than lines (considered for future implementations) the path may leave the world and\n\tgo back in again later, in such a case this callback is followed by OnIntoWorld() and further\n\tOnNextBlock() calls.</td></tr>\n<tr><td>OnIntoWorld</td><td>BlockPos</td>\n\t<td>Called when the ray enters the world (Y-wise); the coords specify the exact entry point.</td></tr>\n<tr><td>OnNoMoreHits</td><td>&nbsp;</td>\n\t<td>Called when the path is sure not to hit any more blocks. This is the final callback, no more\n\tcallbacks are called after this function. Unlike the other callbacks, this function doesn't have a return\n\tvalue.</td></tr>\n<tr><td>OnNoChunk</td><td>&nbsp;</td>\n\t<td>Called when the ray enters a chunk that is not loaded. This usually means that the tracing is aborted.\n\tUnlike the other callbacks, this function doesn't have a return value.</td></tr>\n</table>\n\t\t\t\t]],\n\t\t\t},\n\t\t\t{\n\t\t\t\tHeader = \"Deprecated Callbacks\",\n\t\t\t\tContents = [[\nWhen using the deprecated number-based Trace function, Cuberite will instead assume the following signatures for the callbacks:</p>\n<p>\n<table><tr><th>Name</th><th>Parameters</th><th>Notes</th></tr>\n<tr><td>OnNextBlock</td><td>BlockX, BlockY, BlockZ, BlockType, BlockMeta, EntryFace</td>\n\t<td>Called when the ray hits a new valid block. The block type and meta is given. EntryFace is one of the\n\tBLOCK_FACE_ constants indicating which \"side\" of the block got hit by the ray.</td></tr>\n<tr><td>OnNextBlockNoData</td><td>BlockX, BlockY, BlockZ, EntryFace</td>\n\t<td>Called when the ray hits a new block, but the block is in an unloaded chunk - no valid data is\n\tavailable. Only the coords and the entry face are given.</td></tr>\n<tr><td>OnOutOfWorld</td><td>X, Y, Z</td>\n\t<td>Called when the ray goes outside of the world (Y-wise); the coords specify the exact exit point. Note\n\tthat for other paths than lines (considered for future implementations) the path may leave the world and\n\tgo back in again later, in such a case this callback is followed by OnIntoWorld() and further\n\tOnNextBlock() calls.</td></tr>\n<tr><td>OnIntoWorld</td><td>X, Y, Z</td>\n\t<td>Called when the ray enters the world (Y-wise); the coords specify the exact entry point.</td></tr>\n</table>\n\n\t\t\t\t]],\n\t\t\t},\n\t\t\t{\n\t\t\t\tHeader = \"Example\",\n\t\t\t\tContents = [[\n<p>The following example is taken from the Debuggers plugin. It is a command handler function for the\n\"/spidey\" command that creates a line of cobweb blocks from the player's eyes up to 50 blocks away in\nthe direction they're looking, but only through the air.\n<pre class=\"prettyprint lang-lua\">\nfunction HandleSpideyCmd(a_Split, a_Player)\n\tlocal World = a_Player:GetWorld();\n\n\tlocal Callbacks = {\n\t\tOnNextBlock = function(a_BlockPos, a_BlockType, a_BlockMeta)\n\t\t\tif (a_BlockType ~= E_BLOCK_AIR) then\n\t\t\t\t-- abort the trace\n\t\t\t\treturn true;\n\t\t\tend\n\t\t\tWorld:SetBlock(a_BlockPos, E_BLOCK_COBWEB, 0);\n\t\tend\n\t};\n\n\tlocal EyePos = a_Player:GetEyePosition();\n\tlocal LookVector = a_Player:GetLookVector();\n\tLookVector:Normalize();  -- Make the vector 1 m long\n\n\t-- Start cca 2 blocks away from the eyes\n\tlocal Start = EyePos + LookVector + LookVector;\n\tlocal End = EyePos + LookVector * 50;\n\n\tcLineBlockTracer.Trace(World, Callbacks, Start, End);\n\n\treturn true;\nend\n</pre>\n</p>\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t},\n\n\n\n\n\n\tVector3d =\n\t{\n\t\tDesc = [[\n\t\t\tA Vector3d object uses double precision floating point values to describe a point in 3D space.</p>\n\t\t\t<p>\n\t\t\tSee also {{Vector3f}} for single-precision floating point 3D coords and {{Vector3i}} for integer\n\t\t\t3D coords.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tAbs =\n\t\t\t{\n\t\t\t\tNotes = \"Updates each coord to its absolute value.\",\n\t\t\t},\n\t\t\taddedX =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the X axis\",\n\t\t\t},\n\t\t\taddedXZ =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofsX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofsZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offsets on the X and Z axes\",\n\t\t\t},\n\t\t\taddedY =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the Y axis\",\n\t\t\t},\n\t\t\taddedZ =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the Z axis\",\n\t\t\t},\n\t\t\tCeil =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new {{Vector3i}} object with coords set to math.ceil of this vector's coords.\",\n\t\t\t},\n\t\t\tClamp =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"min\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"max\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Clamps each coord into the specified range.\",\n\t\t\t},\n\t\t\tconstructor =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Vector\",\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3d object by copying the coords from the given Vector3f.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3d object with all its coords set to 0.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3d object with its coords set to the specified values.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tCross =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new Vector3d that is a {{https://en.wikipedia.org/wiki/Cross_product|cross product}} of this vector and the specified vector.\",\n\t\t\t},\n\t\t\tDot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the dot product of this vector and the specified vector.\",\n\t\t\t},\n\t\t\tEquals =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AnotherVector\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if this vector is exactly equal to the specified vector. Note that this is subject to (possibly imprecise) floating point math.\",\n\t\t\t},\n\t\t\tEqualsEps =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AnotherVector\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Eps\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the differences between each corresponding coords of this vector and the one specified are less than the specified Eps.\",\n\t\t\t},\n\t\t\tFloor =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new {{Vector3i}} object with coords set to math.floor of this vector's coords.\",\n\t\t\t},\n\t\t\tHasNonZeroLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the vector has at least one coord non-zero. Note that this is subject to (possibly imprecise) floating point math.\",\n\t\t\t},\n\t\t\tLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the (euclidean) length of the vector.\",\n\t\t\t},\n\t\t\tLineCoeffToXYPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3d\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified Z coord. The result satisfies the following equation: (this + Result * (Param - this)).z = Z. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tLineCoeffToXZPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3d\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified Y coord. The result satisfies the following equation: (this + Result * (Param - this)).y = Y. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tLineCoeffToYZPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3d\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified X coord. The result satisfies the following equation: (this + Result * (Param - this)).x = X. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tMove =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified offsets to each coord, effectively moving the vector by the specified coord offsets.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Diff\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified vector to this vector. Is slightly better performant than adding with a \\\"+\\\" because this doesn't create a new object for the result.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tNormalize =\n\t\t\t{\n\t\t\t\tNotes = \"Changes this vector so that it keeps current direction but is exactly 1 unit long. FIXME: Fails for a zero vector.\",\n\t\t\t},\n\t\t\tNormalizeCopy =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new vector that has the same direction as this but is exactly 1 unit long. FIXME: Fails for a zero vector.\",\n\t\t\t},\n\t\t\toperator_div =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ParCoordDivisors\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3d object with each coord divided by the corresponding coord from the given vector.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Divisor\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3d object with each coord divided by the specified number.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\toperator_mul =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PerCoordMultiplier\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3d object with each coord multiplied by the corresponding coord from the given vector.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Multiplier\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3d object with each coord multiplied.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\toperator_plus =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Addend\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new Vector3d containing the sum of this vector and the specified vector\",\n\t\t\t},\n\t\t\toperator_sub =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Subtrahend\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3d object containing the difference between this object and the specified vector.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3d object that is a negative of this vector (all coords multiplied by -1).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSet =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets all the coords in this object.\",\n\t\t\t},\n\t\t\tSqrLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the (euclidean) length of this vector, squared. This operation is slightly less computationally expensive than Length(), while it conserves some properties of Length(), such as comparison. \",\n\t\t\t},\n\t\t\tTurnCCW =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the vector 90 degrees counterclockwise around the vertical axis. Note that this is specific to minecraft's axis ordering, which is X+ left, Z+ down.\",\n\t\t\t},\n\t\t\tTurnCW =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the vector 90 degrees clockwise around the vertical axis. Note that this is specific to minecraft's axis ordering, which is X+ left, Z+ down.\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tEPS =\n\t\t\t{\n\t\t\t\tNotes = \"The max difference between two coords for which the coords are assumed equal (in LineCoeffToXYPlane() et al).\",\n\t\t\t},\n\t\t\tNO_INTERSECTION =\n\t\t\t{\n\t\t\t\tNotes = \"Special return value for the LineCoeffToXYPlane() et al meaning that there's no intersection with the plane.\",\n\t\t\t},\n\t\t},\n\t\tVariables =\n\t\t{\n\t\t\tx =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The X coord of the vector.\",\n\t\t\t},\n\t\t\ty =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The Y coord of the vector.\",\n\t\t\t},\n\t\t\tz =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The Z coord of the vector.\",\n\t\t\t},\n\t\t},\n\t},\n\n\n\n\n\n\tVector3f =\n\t{\n\t\tDesc = [[\n\t\t\tA Vector3f object uses floating point values to describe a point in space.</p>\n\t\t\t<p>\n\t\t\tSee also {{Vector3d}} for double-precision floating point 3D coords and {{Vector3i}} for integer\n\t\t\t3D coords.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tAbs =\n\t\t\t{\n\t\t\t\tNotes = \"Updates each coord to its absolute value.\",\n\t\t\t},\n\t\t\taddedX =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the X axis\",\n\t\t\t},\n\t\t\taddedXZ =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofsX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofsZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offsets on the X and Z axes\",\n\t\t\t},\n\t\t\taddedY =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the Y axis\",\n\t\t\t},\n\t\t\taddedZ =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the Z axis\",\n\t\t\t},\n\t\t\tCeil =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new {{Vector3i}} object with coords set to math.ceil of this vector's coords.\",\n\t\t\t},\n\t\t\tClamp =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"min\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"max\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Clamps each coord into the specified range.\",\n\t\t\t},\n\t\t\tconstructor =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3f object with zero coords\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3f object with the specified coords\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Vector3f\",\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3f object as a copy of the specified vector\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Vector3d\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3f object as a copy of the specified {{Vector3d}}\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Vector3i\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3f object as a copy of the specified {{Vector3i}}\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tCross =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new Vector3f object that holds the cross product of this vector and the specified vector.\",\n\t\t\t},\n\t\t\tDot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the dot product of this vector and the specified vector.\",\n\t\t\t},\n\t\t\tEquals =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the specified vector is exactly equal to this vector. Note that this is subject to (possibly imprecise) floating point math.\",\n\t\t\t},\n\t\t\tEqualsEps =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Eps\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the differences between each corresponding coords of this vector and the one specified, are less than the specified Eps.\",\n\t\t\t},\n\t\t\tFloor =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new {{Vector3i}} object with coords set to math.floor of this vector's coords.\",\n\t\t\t},\n\t\t\tHasNonZeroLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the vector has at least one coord non-zero. Note that this is subject to (possibly imprecise) floating point math.\",\n\t\t\t},\n\t\t\tLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the (euclidean) length of this vector\",\n\t\t\t},\n\t\t\tLineCoeffToXYPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3f\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified Z coord. The result satisfies the following equation: (this + Result * (Param - this)).z = Z. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tLineCoeffToXZPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3f\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified Y coord. The result satisfies the following equation: (this + Result * (Param - this)).y = Y. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tLineCoeffToYZPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3f\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified X coord. The result satisfies the following equation: (this + Result * (Param - this)).x = X. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tMove =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified offsets to each coord, effectively moving the vector by the specified coord offsets.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Diff\",\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified vector to this vector. Is slightly better performant than adding with a \\\"+\\\" because this doesn't create a new object for the result.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tNormalize =\n\t\t\t{\n\t\t\t\tNotes = \"Normalizes this vector (makes it 1 unit long while keeping the direction). FIXME: Fails for zero vectors.\",\n\t\t\t},\n\t\t\tNormalizeCopy =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of this vector that is normalized (1 unit long while keeping the same direction). FIXME: Fails for zero vectors.\",\n\t\t\t},\n\t\t\toperator_div =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PerCoordDivisor\",\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3f object with each coord divided by the corresponding coord from the given vector.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Divisor\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3f object with each coord divided by the specified number.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\toperator_mul =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PerCoordMultiplier\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3f object that has each of its coords multiplied by the specified number\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Multiplier\",\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3f object that has each of its coords multiplied by the respective coord of the specified vector.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\toperator_plus =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new Vector3f object that holds the vector sum of this vector and the specified vector.\",\n\t\t\t},\n\t\t\toperator_sub =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Subtrahend\",\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3f object that holds the vector differrence between this vector and the specified vector.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3f that is a negative of this vector (all coords multiplied by -1).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSet =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets all the coords of the vector at once.\",\n\t\t\t},\n\t\t\tSqrLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the (euclidean) length of this vector, squared. This operation is slightly less computationally expensive than Length(), while it conserves some properties of Length(), such as comparison.\",\n\t\t\t},\n\t\t\tTurnCCW =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the vector 90 degrees counterclockwise around the vertical axis. Note that this is specific to minecraft's axis ordering, which is X+ left, Z+ down.\",\n\t\t\t},\n\t\t\tTurnCW =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the vector 90 degrees clockwise around the vertical axis. Note that this is specific to minecraft's axis ordering, which is X+ left, Z+ down.\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tEPS =\n\t\t\t{\n\t\t\t\tNotes = \"The max difference between two coords for which the coords are assumed equal (in LineCoeffToXYPlane() et al).\",\n\t\t\t},\n\t\t\tNO_INTERSECTION =\n\t\t\t{\n\t\t\t\tNotes = \"Special return value for the LineCoeffToXYPlane() et al meaning that there's no intersection with the plane.\",\n\t\t\t},\n\t\t},\n\t\tVariables =\n\t\t{\n\t\t\tx =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The X coord of the vector.\",\n\t\t\t},\n\t\t\ty =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The Y coord of the vector.\",\n\t\t\t},\n\t\t\tz =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The Z coord of the vector.\",\n\t\t\t},\n\t\t},\n\t},\n\n\n\n\n\n\tVector3i =\n\t{\n\t\tDesc = [[\n\t\t\tA Vector3i object uses integer values to describe a point in space.</p>\n\t\t\t<p>\n\t\t\tSee also {{Vector3d}} for double-precision floating point 3D coords and {{Vector3f}} for\n\t\t\tsingle-precision floating point 3D coords.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tAbs =\n\t\t\t{\n\t\t\t\tNotes = \"Updates each coord to its absolute value.\",\n\t\t\t},\n\t\t\taddedX =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the X axis\",\n\t\t\t},\n\t\t\taddedXZ =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofsX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofsZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offsets on the X and Z axes\",\n\t\t\t},\n\t\t\taddedY =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the Y axis\",\n\t\t\t},\n\t\t\taddedZ =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ofs\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of the vector, moved by the specified offset on the Z axis\",\n\t\t\t},\n\t\t\tCeil =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new {{Vector3i}} object with coords set to math.ceil of this vector's coords. Normally not too useful with integer-only vectors, but still included for API completeness.\",\n\t\t\t},\n\t\t\tClamp =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"min\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"max\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Clamps each coord into the specified range.\",\n\t\t\t},\n\t\t\tconstructor =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3i object with zero coords.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3i object with the specified coords.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Vector3d\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Creates a new Vector3i object with coords copied and floor()-ed from the specified {{Vector3d}}.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tCross =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new Vector3i that is a {{https://en.wikipedia.org/wiki/Cross_product|cross product}} of this vector and the specified vector.\",\n\t\t\t},\n\t\t\tDot =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the dot product of this vector and the specified vector.\",\n\t\t\t},\n\t\t\tEquals =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if this vector is exactly the same as the specified vector.\",\n\t\t\t},\n\t\t\tEqualsEps =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Other\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Eps\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the differences between each corresponding coords of this vector and the one specified, are less than the specified Eps. Normally not too useful for integer-only vectors, but still included for API completeness.\",\n\t\t\t},\n\t\t\tFloor =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new {{Vector3i}} object with coords set to math.floor of this vector's coords. Normally not too useful with integer-only vectors, but still included for API completeness.\",\n\t\t\t},\n\t\t\tHasNonZeroLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the vector has at least one coord non-zero.\",\n\t\t\t},\n\t\t\tLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the (euclidean) length of this vector.\",\n\t\t\t},\n\t\t\tLineCoeffToXYPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3i\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified Z coord. The result satisfies the following equation: (this + Result * (Param - this)).z = Z. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tLineCoeffToXZPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3i\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified Y coord. The result satisfies the following equation: (this + Result * (Param - this)).y = Y. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tLineCoeffToYZPlane =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Vector3i\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the coefficient for the line from the specified vector through this vector to reach the specified X coord. The result satisfies the following equation: (this + Result * (Param - this)).x = X. Returns the NO_INTERSECTION constant if there's no intersection.\",\n\t\t\t},\n\t\t\tMove =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Moves the vector by the specified amount in each axis direction.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Diff\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Adds the specified vector to this vector. Is slightly better performant than adding with a \\\"+\\\" because this doesn't create a new object for the result.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tNormalize =\n\t\t\t{\n\t\t\t\tNotes = \"Normalizes this vector (makes it 1 unit long while keeping the direction). Quite useless for integer-only vectors, since the normalized vector will almost always truncate to zero vector. FIXME: Fails for zero vectors.\",\n\t\t\t},\n\t\t\tNormalizeCopy =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a copy of this vector that is normalized (1 unit long while keeping the same direction). Quite useless for integer-only vectors, since the normalized vector will almost always truncate to zero vector. FIXME: Fails for zero vectors.\",\n\t\t\t},\n\t\t\toperator_div =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Divisor\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3i object that has each of its coords divided by the specified number\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PerCoordDivisors\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3i object that has each of its coords divided by the respective coord of the specified vector.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\toperator_mul =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Multiplier\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3i object that has each of its coords multiplied by the specified number\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"PerCoordMultipliers\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3i object that has each of its coords multiplied by the respective coord of the specified vector.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\toperator_plus =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Addend\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a new Vector3f object that holds the vector sum of this vector and the specified vector.\",\n\t\t\t},\n\t\t\toperator_sub =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Subtrahend\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3i object that holds the vector differrence between this vector and the specified vector.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns a new Vector3i that is a negative of this vector (all coords multiplied by -1).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSet =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"x\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets all the coords of the vector at once\",\n\t\t\t},\n\t\t\tSqrLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the (euclidean) length of this vector, squared. This operation is slightly less computationally expensive than Length(), while it conserves some properties of Length(), such as comparison.\",\n\t\t\t},\n\t\t\tTurnCCW =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the vector 90 degrees counterclockwise around the vertical axis. Note that this is specific to minecraft's axis ordering, which is X+ left, Z+ down.\",\n\t\t\t},\n\t\t\tTurnCW =\n\t\t\t{\n\t\t\t\tNotes = \"Rotates the vector 90 degrees clockwise around the vertical axis. Note that this is specific to minecraft's axis ordering, which is X+ left, Z+ down.\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tEPS =\n\t\t\t{\n\t\t\t\tNotes = \"The max difference between two coords for which the coords are assumed equal (in LineCoeffToXYPlane() et al). Quite useless with integer-only vector.\",\n\t\t\t},\n\t\t\tNO_INTERSECTION =\n\t\t\t{\n\t\t\t\tNotes = \"Special return value for the LineCoeffToXYPlane() et al meaning that there's no intersection with the plane.\",\n\t\t\t},\n\t\t},\n\t\tVariables =\n\t\t{\n\t\t\tx =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The X coord of the vector.\",\n\t\t\t},\n\t\t\ty =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The Y coord of the vector.\",\n\t\t\t},\n\t\t\tz =\n\t\t\t{\n\t\t\t\tType = \"number\",\n\t\t\t\tNotes = \"The Z coord of the vector.\",\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/Network.lua",
    "content": "\n-- Network.lua\n\n-- Defines the documentation for the cNetwork-related classes and cUrlClient\n\n\n\n\n\nreturn\n{\n\tcNetwork =\n\t{\n\t\tDesc = [[\n\t\t\tThis is the namespace for high-level network-related operations. Allows plugins to make TCP\n\t\t\tconnections to the outside world using a callback-based API.</p>\n\t\t\t<p>\n\t\t\tAll functions in this namespace are static, they should be called on the cNetwork class itself:\n<pre class=\"prettyprint lang-lua\">\nlocal Server = cNetwork:Listen(1024, ListenCallbacks);\n</pre></p>\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tConnect =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Host\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Port\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"LinkCallbacks\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Begins establishing a (client) TCP connection to the specified host. Uses the LinkCallbacks table to report progress, success, errors and incoming data. Returns false if it fails immediately (bad port value, bad hostname format), true otherwise. Host can be either an IP address or a hostname.\",\n\t\t\t},\n\t\t\tCreateUDPEndpoint =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Port\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"UDPCallbacks\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cUDPEndpoint\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Creates a UDP endpoint that listens for incoming datagrams on the specified port, and can be used to send or broadcast datagrams. Uses the UDPCallbacks to report incoming datagrams or errors. If the endpoint cannot be created, the OnError callback is called with the error details and the returned endpoint will report IsOpen() == false. The plugin needs to store the returned endpoint object for as long as it needs the UDP port open; if the endpoint is garbage-collected by Lua, the socket will be closed and no more incoming data will be reported.<br>If the Port is zero, the OS chooses an available UDP port for the endpoint; use {{cUDPEndpoint}}:GetPort() to query the port number in such case.\",\n\t\t\t},\n\t\t\tEnumLocalIPAddresses =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns all local IP addresses for network interfaces currently available on the machine, as an array-table of strings.\",\n\t\t\t},\n\t\t\tHostnameToIP =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Host\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"LookupCallbacks\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Begins a DNS lookup to find the IP address(es) for the specified host. Uses the LookupCallbacks table to report progress, success or errors. Returns false if it fails immediately (bad hostname format), true if the lookup started successfully. Host can be either a hostname or an IP address.\",\n\t\t\t},\n\t\t\tIPToHostname =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Address\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"LookupCallbacks\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Begins a reverse-DNS lookup to find out the hostname for the specified IP address. Uses the LookupCallbacks table to report progress, success or errors. Returns false if it fails immediately (bad address format), true if the lookup started successfully.\",\n\t\t\t},\n\t\t\tListen =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Port\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ListenCallbacks\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cServerHandle\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Starts listening on the specified port. Uses the ListenCallbacks to report incoming connections or errors. Returns a {{cServerHandle}} object representing the server. If the listen operation failed, the OnError callback is called with the error details and the returned server handle will report IsListening() == false. The plugin needs to store the server handle object for as long as it needs the server running, if the server handle is garbage-collected by Lua, the listening socket will be closed and all current connections dropped.\",\n\t\t\t},\n\t\t},\n\t\tAdditionalInfo =\n\t\t{\n\t\t\t{\n\t\t\t\tHeader = \"Using callbacks\",\n\t\t\t\tContents = [[\n\t\t\t\t\tThe entire Networking API is callback-based. Whenever an event happens on the network object, a\n\t\t\t\t\tspecific plugin-provided function is called. The callbacks are stored in tables which are passed\n\t\t\t\t\tto the API functions, each table contains multiple callbacks for the various situations.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\tThere are four different callback variants used: LinkCallbacks, LookupCallbacks, ListenCallbacks\n\t\t\t\t\tand UDPCallbacks. Each is used in the situation appropriate by its name - LinkCallbacks are used\n\t\t\t\t\tfor handling the traffic on a single network link (plus additionally creation of such link when\n\t\t\t\t\tconnecting as a client), LookupCallbacks are used when doing DNS and reverse-DNS lookups,\n\t\t\t\t\tListenCallbacks are used for handling incoming connections as a server and UDPCallbacks are used\n\t\t\t\t\tfor incoming UDP datagrams.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\tLinkCallbacks have the following structure:<br/>\n<pre class=\"prettyprint lang-lua\">\nlocal LinkCallbacks =\n{\n\tOnConnected = function ({{cTCPLink|a_TCPLink}})\n\t\t-- The specified {{cTCPLink|link}} has succeeded in connecting to the remote server.\n\t\t-- Only called if the link is being connected as a client (using cNetwork:Connect() )\n\t\t-- Not used for incoming server links\n\t\t-- All returned values are ignored\n\tend,\n\n\tOnError = function ({{cTCPLink|a_TCPLink}}, a_ErrorCode, a_ErrorMsg)\n\t\t-- The specified error has occured on the {{cTCPLink|link}}\n\t\t-- No other callback will be called for this link from now on\n\t\t-- For a client link being connected, this reports a connection error (destination unreachable etc.)\n\t\t-- It is an Undefined Behavior to send data to a_TCPLink in or after this callback\n\t\t-- All returned values are ignored\n\tend,\n\n\tOnReceivedData = function ({{cTCPLink|a_TCPLink}}, a_Data)\n\t\t-- Data has been received on the {{cTCPLink|link}}\n\t\t-- Will get called whenever there's new data on the {{cTCPLink|link}}\n\t\t-- a_Data contains the raw received data, as a string\n\t\t-- All returned values are ignored\n\tend,\n\n\tOnRemoteClosed = function ({{cTCPLink|a_TCPLink}})\n\t\t-- The remote peer has closed the {{cTCPLink|link}}\n\t\t-- The link is already closed, any data sent to it now will be lost\n\t\t-- No other callback will be called for this link from now on\n\t\t-- All returned values are ignored\n\tend,\n}\n</pre></p>\n\t\t\t\t<p>\n\t\t\t\tLookupCallbacks have the following structure:<br/>\n<pre class=\"prettyprint lang-lua\">\nlocal LookupCallbacks =\n{\n\tOnError = function (a_Query, a_ErrorCode, a_ErrorMsg)\n\t\t-- The specified error has occured while doing the lookup\n\t\t-- a_Query is the hostname or IP being looked up\n\t\t-- No other callback will be called for this lookup from now on\n\t\t-- All returned values are ignored\n\tend,\n\n\tOnFinished = function (a_Query)\n\t\t-- There are no more DNS records for this query\n\t\t-- a_Query is the hostname or IP being looked up\n\t\t-- No other callback will be called for this lookup from now on\n\t\t-- All returned values are ignored\n\tend,\n\n\tOnNameResolved = function (a_Hostname, a_IP)\n\t\t-- A DNS record has been found, the specified hostname resolves to the IP\n\t\t-- Called for both Hostname -&gt; IP and IP -&gt; Hostname lookups\n\t\t-- May be called multiple times if a hostname resolves to multiple IPs\n\t\t-- All returned values are ignored\n\tend,\n}\n</pre></p>\n\t\t\t\t<p>\n\t\t\t\tListenCallbacks have the following structure:<br/>\n<pre class=\"prettyprint lang-lua\">\nlocal ListenCallbacks =\n{\n\tOnAccepted = function ({{cTCPLink|a_TCPLink}})\n\t\t-- A new connection has been accepted and a {{cTCPLink|Link}} for it created\n\t\t-- It is safe to send data to the link now\n\t\t-- All returned values are ignored\n\tend,\n\n\tOnError = function (a_ErrorCode, a_ErrorMsg)\n\t\t-- The specified error has occured while trying to listen\n\t\t-- No other callback will be called for this server handle from now on\n\t\t-- This callback is called before the cNetwork:Listen() call returns\n\t\t-- All returned values are ignored\n\tend,\n\n\tOnIncomingConnection = function (a_RemoteIP, a_RemotePort, a_LocalPort)\n\t\t-- A new connection is being accepted, from the specified remote peer\n\t\t-- This function needs to return either nil to drop the connection,\n\t\t-- or valid LinkCallbacks to use for the new connection's {{cTCPLink|TCPLink}} object\n\t\treturn SomeLinkCallbacks\n\tend,\n}\n</pre></p>\n\t\t\t\t<p>\n\t\t\t\tUDPCallbacks have the following structure:<br/>\n<pre class=\"prettyprint lang-lua\">\nlocal UDPCallbacks =\n{\n\tOnError = function (a_ErrorCode, a_ErrorMsg)\n\t\t-- The specified error has occured when trying to listen for incoming UDP datagrams\n\t\t-- No other callback will be called for this endpoint from now on\n\t\t-- This callback is called before the cNetwork:CreateUDPEndpoint() call returns\n\t\t-- All returned values are ignored\n\tend,\n\n\tOnReceivedData = function ({{cUDPEndpoint|a_UDPEndpoint}}, a_Data, a_RemotePeer, a_RemotePort)\n\t\t-- A datagram has been received on the {{cUDPEndpoint|endpoint}} from the specified remote peer\n\t\t-- a_Data contains the raw received data, as a string\n\t\t-- All returned values are ignored\n\tend,\n}\n</pre>\n\t\t\t\t]],\n\t\t\t},\n\t\t\t{\n\t\t\t\tHeader = \"Example client connection\",\n\t\t\t\tContents = [[\n\t\t\t\t\tThe following example, adapted from the NetworkTest plugin, shows a simple example of a client\n\t\t\t\t\tconnection using the cNetwork API. It connects to www.google.com on port 80 (http) and sends a http\n\t\t\t\t\trequest for the front page. It dumps the received data to the console.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\tFirst, the callbacks are defined in a table. The OnConnected() callback takes care of sending the http\n\t\t\t\t\trequest once the socket is connected. The OnReceivedData() callback sends all data to the console. The\n\t\t\t\t\tOnError() callback logs any errors. Then, the connection is initiated using the cNetwork::Connect() API\n\t\t\t\t\tfunction.</p>\n\t\t\t\t\t<p>\n<pre class=\"prettyprint lang-lua\">\n-- Define the callbacks to use for the client connection:\nlocal ConnectCallbacks =\n{\n\tOnConnected = function (a_Link)\n\t\t-- Connection succeeded, send the http request:\n\t\ta_Link:Send(\"GET / HTTP/1.0\\r\\nHost: www.google.com\\r\\n\\r\\n\")\n\tend,\n\n\tOnError = function (a_Link, a_ErrorCode, a_ErrorMsg)\n\t\t-- Log the error to console:\n\t\tLOG(\"An error has occurred while talking to google.com: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\tend,\n\n\tOnReceivedData = function (a_Link, a_Data)\n\t\t-- Log the received data to console:\n\t\tLOG(\"Incoming http data:\\r\\n\" .. a_Data)\n\tend,\n\n\tOnRemoteClosed = function (a_Link)\n\t\t-- Log the event into the console:\n\t\tLOG(\"Connection to www.google.com closed\")\n\tend,\n}\n\n-- Connect:\nif not(cNetwork:Connect(\"www.google.com\", 80, ConnectCallbacks)) then\n\t-- Highly unlikely, but better check for errors\n\tLOG(\"Cannot queue connection to www.google.com\")\nend\n-- Note that the connection is being made on the background,\n-- there's no guarantee that it's already connected at this point in code\n</pre>\n\t\t\t\t]],\n\t\t\t},\n\t\t\t{\n\t\t\t\tHeader = \"Example server implementation\",\n\t\t\t\tContents = [[\n\t\t\t\t\tThe following example, adapted from the NetworkTest plugin, shows a simple example of creating a\n\t\t\t\t\tserver listening on a TCP port using the cNetwork API. The server listens on port 9876 and for\n\t\t\t\t\teach incoming connection it sends a welcome message and then echoes back whatever the client has\n\t\t\t\t\tsent (\"echo server\").</p>\n\t\t\t\t\t<p>\n\t\t\t\t\tFirst, the callbacks for the listening server are defined. The most important of those is the\n\t\t\t\t\tOnIncomingConnection() callback that must return the LinkCallbacks that will be used for the new\n\t\t\t\t\tconnection. In our simple scenario each connection uses the same callbacks, so a predefined\n\t\t\t\t\tcallbacks table is returned; it is, however, possible to define different callbacks for each\n\t\t\t\t\tconnection. This allows the callbacks to be \"personalised\", for example by the remote IP or the\n\t\t\t\t\ttime of connection. The OnAccepted() and OnError() callbacks only log that they occurred, there's\n\t\t\t\t\tno processing needed for them.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\tFinally, the cNetwork:Listen() API function is used to create the listening server. The status of\n\t\t\t\t\tthe server is checked and if it is successfully listening, it is stored in a global variable, so\n\t\t\t\t\tthat Lua doesn't garbage-collect it until we actually want the server closed.</p>\n\t\t\t\t\t<p>\n<pre class=\"prettyprint lang-lua\">\n-- Define the callbacks used for the incoming connections:\nlocal EchoLinkCallbacks =\n{\n\tOnConnected = function (a_Link)\n\t\t-- This will not be called for a server connection, ever\n\t\tassert(false, \"Unexpected Connect callback call\")\n\tend,\n\n\tOnError = function (a_Link, a_ErrorCode, a_ErrorMsg)\n\t\t-- Log the error to console:\n\t\tlocal RemoteName = \"'\" .. a_Link:GetRemoteIP() .. \":\" .. a_Link:GetRemotePort() .. \"'\"\n\t\tLOG(\"An error has occurred while talking to \" .. RemoteName .. \": \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\tend,\n\n\tOnReceivedData = function (a_Link, a_Data)\n\t\t-- Send the received data back to the remote peer\n\t\ta_Link:Send(Data)\n\tend,\n\n\tOnRemoteClosed = function (a_Link)\n\t\t-- Log the event into the console:\n\t\tlocal RemoteName = \"'\" .. a_Link:GetRemoteIP() .. \":\" .. a_Link:GetRemotePort() .. \"'\"\n\t\tLOG(\"Connection to '\" .. RemoteName .. \"' closed\")\n\tend,\n}\n\n-- Define the callbacks used by the server:\nlocal ListenCallbacks =\n{\n\tOnAccepted = function (a_Link)\n\t\t-- No processing needed, just log that this happened:\n\t\tLOG(\"OnAccepted callback called\")\n\tend,\n\n\tOnError = function (a_ErrorCode, a_ErrorMsg)\n\t\t-- An error has occured while listening for incoming connections, log it:\n\t\tLOG(\"Cannot listen, error \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\"\n\tend,\n\n\tOnIncomingConnection = function (a_RemoteIP, a_RemotePort, a_LocalPort)\n\t\t-- A new connection is being accepted, give it the EchoCallbacks\n\t\treturn EchoLinkCallbacks\n\tend,\n}\n\n-- Start the server:\nlocal Server = cNetwork:Listen(9876, ListenCallbacks)\nif not(Server:IsListening()) then\n\t-- The error has been already printed in the OnError() callbacks\n\t-- Just bail out\n\treturn;\nend\n\n-- Store the server globally, so that it stays open:\ng_Server = Server\n\n...\n\n-- Elsewhere in the code, when terminating:\n-- Close the server and let it be garbage-collected:\ng_Server:Close()\ng_Server = nil\n</pre>\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t},\n\tcServerHandle =\n\t{\n\t\tDesc = [[\n\t\t\tThis class provides an interface for TCP sockets listening for a connection. In order to listen, the\n\t\t\tplugin needs to use the {{cNetwork}}:Listen() function to create the listening socket.</p>\n\t\t\t<p>\n\t\t\tNote that when Lua garbage-collects this class, the listening socket is closed. Therefore the plugin\n\t\t\tshould keep it referenced in a global variable for as long as it wants the server running.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tClose =\n\t\t\t{\n\t\t\t\tNotes = \"Closes the listening socket. No more connections will be accepted, and all current connections will be closed.\",\n\t\t\t},\n\t\t\tIsListening =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the socket is listening.\",\n\t\t\t},\n\t\t},\n\t},\n\tcTCPLink =\n\t{\n\t\tDesc = [[\n\t\t\tThis class wraps a single TCP connection, that has been established. Plugins can create these by\n\t\t\tcalling {{cNetwork}}:Connect() to connect to a remote server, or by listening using\n\t\t\t{{cNetwork}}:Listen() and accepting incoming connections. The links are callback-based - when an event\n\t\t\tsuch as incoming data or remote disconnect happens on the link, a specific callback is called. See the\n\t\t\tadditional information in {{cNetwork}} documentation for details.</p>\n\t\t\t<p>\n\t\t\tThe link can also optionally perform TLS encryption. Plugins can use the StartTLSClient() function to\n\t\t\tstart the TLS handshake as the client side. Since that call, the OnReceivedData() callback is\n\t\t\toverridden internally so that the data is first routed through the TLS decryptor, and the plugin's\n\t\t\tcallback is only called for the decrypted data, once it starts arriving. The Send function changes its\n\t\t\tbehavior so that the data written by the plugin is first encrypted and only then sent over the\n\t\t\tnetwork. Note that calling Send() before the TLS handshake finishes is supported, but the data is\n\t\t\tqueued internally and only sent once the TLS handshake is completed.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tClose =\n\t\t\t{\n\t\t\t\tNotes = \"Closes the link forcefully (TCP RST). There's no guarantee that the last sent data is even being delivered. See also the Shutdown() method.\",\n\t\t\t},\n\t\t\tGetLocalIP =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the IP address of the local endpoint of the TCP connection.\",\n\t\t\t},\n\t\t\tGetLocalPort =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the port of the local endpoint of the TCP connection.\",\n\t\t\t},\n\t\t\tGetRemoteIP =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the IP address of the remote endpoint of the TCP connection.\",\n\t\t\t},\n\t\t\tGetRemotePort =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the port of the remote endpoint of the TCP connection.\",\n\t\t\t},\n\t\t\tSend =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Data\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends the data (raw string) to the remote peer. The data is sent asynchronously and there is no report on the success of the send operation, other than the connection being closed or reset by the underlying OS.\",\n\t\t\t},\n\t\t\tShutdown =\n\t\t\t{\n\t\t\t\tNotes = \"Shuts the socket down for sending data. Notifies the remote peer that there will be no more data coming from us (TCP FIN). The data that is in flight will still be delivered. The underlying socket will be closed when the remote end shuts down as well, or after a timeout.\",\n\t\t\t},\n\t\t\tStartTLSClient =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OwnCert\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OwnPrivateKey\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OwnPrivateKeyPassword\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"TrustedRootCAs\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ErrorMessage\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Starts a TLS handshake on the link, as a client side of the TLS. The Own___ parameters specify the client certificate and its corresponding private key and password; all three parameters are optional and no client certificate is presented to the remote peer if they are not used or all empty. Once the TLS handshake is started by this call, all incoming data is first decrypted before being sent to the OnReceivedData callback, and all outgoing data is queued until the TLS handshake completes, and then sent encrypted over the link. Returns true on success, nil and optional error message on immediate failure.<br/>The TrustedRootCAs is a string containing all certificates that should be trusted, in PEM format, concatenated and separated by a newline.<b>NOTE:</b> If TrustedRootCAs is empty or nil, the server's certificate will NOT be verified, which is UNSAFE!\",\n\t\t\t},\n\t\t\tStartTLSServer =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Certificate\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PrivateKey\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PrivateKeyPassword\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"StartTLSData\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ErrorMessage\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Starts a TLS handshake on the link, as a server side of the TLS. The plugin needs to specify the server certificate and its corresponding private key and password. The StartTLSData can contain data that the link has already reported as received but it should be used as part of the TLS handshake. Once the TLS handshake is started by this call, all incoming data is first decrypted before being sent to the OnReceivedData callback, and all outgoing data is queued until the TLS handshake completes, and then sent encrypted over the link. Returns true on success, nil and optional error message on immediate failure.<br/><b>NOTE:</b> The TLS support in the API is currently experimental and shouldn't be considered safe - there's no peer certificate verification and the error reporting is only basic.\",\n\t\t\t},\n\t\t},\n\t},\n\tcUDPEndpoint =\n\t{\n\t\tDesc = [[\n\t\t\tRepresents a UDP socket that is listening for incoming datagrams on a UDP port and can send or broadcast datagrams to other peers on the network. Plugins can create an instance of the endpoint by calling {{cNetwork}}:CreateUDPEndpoint(). The endpoints are callback-based - when a datagram is read from the network, the OnRececeivedData() callback is called with details about the datagram. See the additional information in {{cNetwork}} documentation for details.</p>\n\t\t\t<p>\n\t\t\tNote that when Lua garbage-collects this class, the listening socket is closed. Therefore the plugin should keep this object referenced in a global variable for as long as it wants the endpoint open.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tClose =\n\t\t\t{\n\t\t\t\tNotes = \"Closes the UDP endpoint. No more datagrams will be reported through the callbacks, the UDP port will be closed.\",\n\t\t\t},\n\t\t\tEnableBroadcasts =\n\t\t\t{\n\t\t\t\tNotes = \"Some OSes need this call before they allow UDP broadcasts on an endpoint.\",\n\t\t\t},\n\t\t\tGetPort =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the local port number of the UDP endpoint listening for incoming datagrams. Especially useful if the UDP endpoint was created with auto-assign port (0).\",\n\t\t\t},\n\t\t\tIsOpen =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the UDP endpoint is listening for incoming datagrams.\",\n\t\t\t},\n\t\t\tSend =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RawData\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RemoteHost\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RemotePort\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends the specified raw data (string) to the specified remote host. The RemoteHost can be either a hostname or an IP address; if it is a hostname, the endpoint will queue a DNS lookup first, if it is an IP address, the send operation is executed immediately. Returns true if there was no immediate error, false on any failure. Note that the return value needn't represent whether the packet was actually sent, only if it was successfully queued.\",\n\t\t\t},\n\t\t},\n\t},\n\tcUrlClient =\n\t{\n\t\tDesc = [[\n\t\t\tImplements high-level asynchronous access to URLs, such as downloading webpages over HTTP(S).</p>\n\t\t\t<p>\n\t\t\tNote that unlike other languages' URL access libraries, this class implements asynchronous requests.\n\t\t\tThis means that the functions only start a request and return immediately. The request is then\n\t\t\tfulfilled in the background, while the server continues to run. The response is delivered back to the\n\t\t\tplugin using callbacks. This allows the plugin to start requests and not block the server until the\n\t\t\tresponse is received.</p>\n\t\t\t<p>\n\t\t\tThe functions that make network requests are all static and have a dual interface. Either you can use\n\t\t\ta single callback function, which gets called once the entire response is received or an error is\n\t\t\tencountered. Or you can use a table of callback functions, each function being called whenever the\n\t\t\tspecific event happens during the request and response lifetime. See the Simple Callback and Callback\n\t\t\tTable chapters later on this page for details and examples.</p>\n\t\t\t<p>\n\t\t\tAll the request function also support optional parameters for further customization of the request -\n\t\t\tthe Headers parameter specifies additional HTTP headers that are to be sent (as a dictionary-table of\n\t\t\tkey -> value), the RequestBody parameter specifying the optional body of the request (used mainly for\n\t\t\tPOST and PUT requests), and an Options parameter specifying additional options specific to the protocol\n\t\t\tused.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tDelete =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Headers\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RequestBody\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Options\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ErrorMessagge\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Starts a HTTP DELETE request. Alias for Request(\\\"DELETE\\\", ...). Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ErrorMessagge\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Starts a HTTP DELETE request. Alias for Request(\\\"DELETE\\\", ...). Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tGet =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Headers\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RequestBody\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Options\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ErrMsg\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Starts a HTTP GET request. Alias for Request(\\\"GET\\\", ...). Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ErrMsg\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Starts a HTTP GET request. Alias for Request(\\\"GET\\\", ...). Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t\t}\n\t\t\t},\n\t\t\tPost =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Headers\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RequestBody\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Options\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ErrMsg\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Starts a HTTP POST request. Alias for Request(\\\"POST\\\", ...). Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ErrMsg\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Starts a HTTP POST request. Alias for Request(\\\"POST\\\", ...). Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tPut =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Headers\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"RequestBody\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Options\",\n\t\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ErrMsg\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Starts a HTTP PUT request. Alias for Request(\\\"PUT\\\", ...). Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ErrMsg\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Starts a HTTP PUT request. Alias for Request(\\\"PUT\\\", ...). Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tRequest =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Method\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Callbacks\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Headers\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RequestBody\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Options\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ErrMsg\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Starts a request with the specified Method. Returns true on succes, false and error message on immediate failure (unparsable URL etc.).\",\n\t\t\t},\n\t\t},\n\t\tAdditionalInfo =\n\t\t{\n\t\t\t{\n\t\t\t\tHeader = \"Simple Callback\",\n\t\t\t\tContents = [[\n\t\t\t\t\tWhen you don't need fine control for receiving the requests and are interested only in the result,\n\t\t\t\t\tyou can use the simple callback approach. Pass a single function as the Callback parameter, the\n\t\t\t\t\tfunction will get called when the response is fully processed, either with the body of the response,\n\t\t\t\t\tor with an error message:\n<pre class=\"prettyprint lang-lua\">\ncUrlClient:Get(url,\n\tfunction (a_Body, a_Data)\n\t\tif (a_Body) then\n\t\t\t-- Response received correctly, a_Body contains the entire response body,\n\t\t\t-- a_Data is a dictionary-table of the response's HTTP headers\n\t\telse\n\t\t\t-- There was an error, a_Data is the error message string\n\t\tend\n\tend\n)\n</pre>\n\t\t\t\t]],\n\t\t\t},\n\t\t\t{\n\t\t\t\tHeader = \"Callback Table\",\n\t\t\t\tContents = [[\n\t\t\t\t\tTo provide complete control over the request and response handling, Cuberite allows plugins to pass\n\t\t\t\t\ta table of callbacks as the Callback parameter. Then the respective functions are called for their\n\t\t\t\t\trespective events during the lifetime of the request and response. This way it is possible to\n\t\t\t\t\tprocess huge downloads that wouldn't fit into memory otherwise, or display detailed progress.</p>\n\t\t\t\t\tEach callback function receives a \"self\" as its first parameter, this allows the functions to\n\t\t\t\t\taccess the Callback table and any of its other members, allowing the use of Lua object idiom for\n\t\t\t\t\tthe table. See <a href=\"https://forum.cuberite.org/thread-2062.html\">this forum post</a> for an\n\t\t\t\t\texample.\n\t\t\t\t\t<p>\n\t\t\t\t\tThe following callback functions are used by Cuberite. Any callback that is not assigned is\n\t\t\t\t\tsilently ignored. The table may also contain other functions and other values, those are silently\n\t\t\t\t\tignored.</p>\n\t\t\t\t\t<table>\n\t\t\t\t\t\t<tr><th>Callback</th><th>Params</th><th>Notes</th></tr>\n\t\t\t\t\t\t<tr><td>OnConnected</td><td>self, {{cTCPLink}}, RemoteIP, RemotePort</td><td>Called when the connection to the remote host is established. <i>Note that current implementation doesn't provide the {{cTCPLink}} parameter and passes nil instead.</i></td></tr>\n\t\t\t\t\t\t<tr><td>OnCertificateReceived</td><td>self</td><td>Called for HTTPS URLs when the server's certificate is received. If the callback returns anything else than true, the connection is aborted. <i>Note that the current implementation doesn't provide the certificate because there is no representation for the cert in Lua.</i></td></tr>\n\t\t\t\t\t\t<tr><td>OnTlsHandshakeCompleted</td><td>self</td><td>Called for HTTPS URLs when the TLS is established on the connection.</td></tr>\n\t\t\t\t\t\t<tr><td>OnRequestSent</td><td>self</td><td>Called after the entire request is sent to the server.</td></tr>\n\t\t\t\t\t\t<tr><td>OnStatusLine</td><td>self, HttpVersion, StatusCode, Rest</td><td>The initial line of the response has been parsed. HttpVersion is typically \"HTTP/1.1\", StatusCode is the numerical HTTP status code reported by the server (200 being OK), Rest is the rest of the line, usually a short message in case of an error.</td></tr>\n\t\t\t\t\t\t<tr><td>OnHeader</td><td>self, Name, Value</td><td>A new HTTP response header line has been received.</td></tr>\n\t\t\t\t\t\t<tr><td>OnHeadersFinished</td><td>self, AllHeaders</td><td>All HTTP response headers have been parsed. AllHeaders is a dictionary-table containing all the headers received.</td></tr>\n\t\t\t\t\t\t<tr><td>OnBodyData</td><td>self, Data</td><td>A piece of the response body has been received. This callback is called repeatedly until the entire body is reported through its Data parameter.</td></tr>\n\t\t\t\t\t\t<tr><td>OnBodyFinished</td><td>self</td><td>The entire response body has been reported by OnBodyData(), the response has finished.</td></tr>\n\t\t\t\t\t\t<tr><td>OnError</td><td>self, ErrorMsg</td><td>Called whenever an error is detected. After this call, no other callback will get called.</td></tr>\n\t\t\t\t\t\t<tr><td>OnRedirecting</td><td>self, NewUrl</td><td>Called if the server returned a valid redirection HTTP status code and a Location header, and redirection is allowed by the Options.</td></tr>\n\t\t\t\t\t</table>\n\t\t\t\t\t<p>\n\t\t\t\t\tThe following example is adapted from the Debuggers plugin's \"download\" command, it downloads the\n\t\t\t\t\tcontents of an URL into a file.\n<pre class=\"prettyprint lang-lua\">\nfunction HandleConsoleDownload(a_Split)  -- Console command handler\n\t-- Read the params from the command:\n\tlocal url = a_Split[2]\n\tlocal fnam = a_Split[3]\n\tif (not(url) or not(fnam)) then\n\t\treturn true, \"Missing parameters. Usage: download <url> <filename>\"\n\tend\n\n\t-- Define the cUrlClient callbacks\n\tlocal callbacks =\n\t{\n\t\tOnStatusLine = function (self, a_HttpVersion, a_Status, a_Rest)\n\t\t\t-- Only open the output file if the server reports a success:\n\t\t\tif (a_Status ~= 200) then\n\t\t\t\tLOG(\"Cannot download \" .. url .. \", HTTP error code \" .. a_Status)\n\t\t\t\treturn\n\t\t\tend\n\t\t\tlocal f, err = io.open(fnam, \"wb\")\n\t\t\tif not(f) then\n\t\t\t\tLOG(\"Cannot download \" .. url .. \", error opening the file \" .. fnam .. \": \" .. (err or \"<no message>\"))\n\t\t\t\treturn\n\t\t\tend\n\t\t\tself.m_File = f\n\t\tend,\n\n\t\tOnBodyData = function (self, a_Data)\n\t\t\t-- If the file has been opened, write the data:\n\t\t\tif (self.m_File) then\n\t\t\t\tself.m_File:write(a_Data)\n\t\t\tend\n\t\tend,\n\n\t\tOnBodyFinished = function (self)\n\t\t\t-- If the file has been opened, close it and report success\n\t\t\tif (self.m_File) then\n\t\t\t\tself.m_File:close()\n\t\t\t\tLOG(\"File \" .. fnam .. \" has been downloaded.\")\n\t\t\tend\n\t\tend,\n\t}\n\n\t-- Start the URL download:\n\tlocal isSuccess, msg = cUrlClient:Get(url, callbacks)\n\tif not(isSuccess) then\n\t\tLOG(\"Cannot start an URL download: \" .. (msg or \"<no message>\"))\n\t\treturn true\n\tend\n\treturn true\nend\n</pre>\n]],\n\t\t\t},\n\t\t\t{\n\t\t\t\tHeader = \"Options\",\n\t\t\t\tContents = [[\n\t\t\t\t\tThe requests support the following options, specified in the optional Options table parameter:\n\t\t\t\t\t<table>\n\t\t\t\t\t\t<tr><th>Option name</th><th>Description</th></tr>\n\t\t\t\t\t\t<tr><td>MaxRedirects</td><td>Maximum number of HTTP redirects that the cUrlClient will follow. If the server still reports a redirect after reaching this many redirects, the cUrlClient reports an error. May be specified as either a number or a string parsable into a number. Default: 30.</td></tr>\n\t\t\t\t\t\t<tr><td>OwnCert</td><td>The client certificate to use, if requested by the server. A string containing a PEM- or DER-encoded cert is expected.</td></tr>\n\t\t\t\t\t\t<tr><td>OwnPrivKey</td><td>The private key appropriate for OwnCert. A string containing a PEM- or DER-encoded private key is expected.</td></tr>\n\t\t\t\t\t\t<tr><td>OwnPrivKeyPassword</td><td>The password for OwnPrivKey. If not present or empty, no password is assumed.</td></tr>\n\t\t\t\t\t\t<tr><td>TrustedRootCAs</td><td>The certificates of the Root CAs that are to be trusted, encoded in PEM format. Multiple certificates can be used by concatenating the certificates, separating them by newlines. If this option is not present or empty, the request will NOT check the server's certificate, which is UNSAFE!</td></tr>\n\t\t\t\t\t</table>\n\t\t\t\t\t<p>\n\t\t\t\t\tRedirection:\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>If a redirect is received, and redirection is allowed by MaxRedirects, the redirection is\n\t\t\t\t\t\treported via OnRedirecting() callback and the request is restarted at the redirect URL, without\n\t\t\t\t\t\treporting any of the redirect's headers nor body.</li>\n\t\t\t\t\t\t<li>If a redirect is received and redirection is not allowed (maximum redirection attempts have\n\t\t\t\t\t\tbeen reached), the OnRedirecting() callback is called with the redirect URL and then the request\n\t\t\t\t\t\tterminates with an OnError() callback, without reporting the redirect's headers nor body.</li>\n\t\t\t\t\t</ul>\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/Plugins.lua",
    "content": "return\n{\n\tcPlugin =\n\t{\n\t\tDesc = \"cPlugin describes a Lua plugin. Each plugin has its own cPlugin object.\",\n\t\tFunctions =\n\t\t{\n\t\t\tGetDirectory =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"<b>OBSOLETE</b>, use GetFolderName() instead!\",\n\t\t\t},\n\t\t\tGetFolderName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the folder where the plugin's files are. (APIDump)\",\n\t\t\t},\n\t\t\tGetLoadError =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If the plugin failed to load, returns the error message for the failure.\",\n\t\t\t},\n\t\t\tGetLocalDirectory =\n\t\t\t{\n\t\t\t\tNotes = \"<b>OBSOLETE</b>, use GetLocalFolder instead.\",\n\t\t\t},\n\t\t\tGetLocalFolder =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the path where the plugin's files are. (Plugins/APIDump)\",\n\t\t\t},\n\t\t\tGetName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the plugin.\",\n\t\t\t},\n\t\t\tGetStatus =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginStatus\",\n\t\t\t\t\t\tType = \"cPluginManager#ePluginStatus\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the status of the plugin (loaded, disabled, unloaded, error, not found)\",\n\t\t\t},\n\t\t\tGetVersion =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the version of the plugin.\",\n\t\t\t},\n\t\t\tIsLoaded =\n\t\t\t{\n\t\t\t\tNotes = \"\",\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tSetName =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginApiName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the API name of the Plugin that is used by {{cPluginManager}}:CallPlugin() to identify the plugin.\",\n\t\t\t},\n\t\t\tSetVersion =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginApiVersion\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the API version of the plugin. Currently unused.\",\n\t\t\t},\n\t\t},\n\t},  -- cPlugin\n\n\tcPluginLua =\n\t{\n\t\tDesc = \"(<b>OBSOLETE</b>) This class is no longer useful in the API and will be removed as soon as all core plugins are migrated away from it. The {{cPlugin}} class serves as the main plugin instance's interface.\",\n\t\tFunctions =\n\t\t{\n\t\t\tAddWebTab =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Title\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"HandlerFn\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"<b>OBSOLETE</b> - Use {{cWebAdmin}}:AddWebTab() instead.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cPlugin\",\n\t},  -- cPluginLua\n\n\tcPluginManager =\n\t{\n\t\tDesc = [[\n\t\t\tThis class is used for generic plugin-related functionality. The plugin manager has a list of all\n\t\t\tplugins, can enable or disable plugins, manages hooks and in-game console commands.</p>\n\t\t\t<p>\n\t\t\tPlugins can be identified by either the PluginFolder or PluginName. Note that these two can differ,\n\t\t\trefer to <a href=\"https://forum.cuberite.org/thread-1877.html\">the forum</a> for detailed discussion.\n\t\t\t<p>\n\t\t\tThere is one instance of cPluginManager in Cuberite, to get it, call either\n\t\t\t{{cRoot|cRoot}}:Get():GetPluginManager() or cPluginManager:Get() function.</p>\n\t\t\t<p>\n\t\t\tNote that some functions are \"static\", that means that they are called using a dot operator instead\n\t\t\tof the colon operator. For example:\n<pre class=\"prettyprint lang-lua\">\ncPluginManager.AddHook(cPluginManager.HOOK_CHAT, OnChatMessage);\n</pre></p>\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tAddHook =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HookType\",\n\t\t\t\t\t\t\tType = \"cPluginManager#PluginHook\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Informs the plugin manager that it should call the specified function when the specified hook event occurs. If a function is not specified, a default global function name is looked up, based on the hook type\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tBindCommand =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Permission\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HelpString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Binds an in-game command with the specified callback function, permission and help string. By common convention, providing an empty string for HelpString will hide the command from the /help display. Returns true if successful, logs to console and returns no value on error. The callback uses the following signature: <pre class=\\\"prettyprint lang-lua\\\">function(Split, {{cPlayer|Player}})</pre> The Split parameter contains an array-table of the words that the player has sent, Player is the {{cPlayer}} object representing the player who sent the command. If the callback returns true, the command is assumed to have executed successfully; in all other cases the server sends a warning to the player that the command is unknown (this is so that subcommands can be implemented).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Permission\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HelpString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Binds an in-game command with the specified callback function, permission and help string. By common convention, providing an empty string for HelpString will hide the command from the /help display. Returns true if successful, logs to console and returns no value on error. The callback uses the following signature: <pre class=\\\"prettyprint lang-lua\\\">function(Split, {{cPlayer|Player}})</pre> The Split parameter contains an array-table of the words that the player has sent, Player is the {{cPlayer}} object representing the player who sent the command. If the callback returns true, the command is assumed to have executed successfully; in all other cases the server sends a warning to the player that the command is unknown (this is so that subcommands can be implemented).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tBindConsoleCommand =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HelpString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Binds a console command with the specified callback function and help string. By common convention, providing an empty string for HelpString will hide the command from the \\\"help\\\" console command. Returns true if successful, logs to console and returns no value on error. The callback uses the following signature: <pre class=\\\"prettyprint lang-lua\\\">function(Split)</pre> The Split parameter contains an array-table of the words that the admin has typed. If the callback returns true, the command is assumed to have executed successfully; in all other cases the server issues a warning to the console that the command is unknown (this is so that subcommands can be implemented).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"HelpString\",\n\t\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Binds a console command with the specified callback function and help string. By common convention, providing an empty string for HelpString will hide the command from the \\\"help\\\" console command. Returns true if successful, logs to console and returns no value on error. The callback uses the following signature: <pre class=\\\"prettyprint lang-lua\\\">function(Split)</pre> The Split parameter contains an array-table of the words that the admin has typed. If the callback returns true, the command is assumed to have executed successfully; in all other cases the server issues a warning to the console that the command is unknown (this is so that subcommands can be implemented).\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tCallPlugin =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FunctionName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FunctionArgs...\",\n\t\t\t\t\t\tType = \"...\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FunctionRets\",\n\t\t\t\t\t\tType = \"...\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified function in the specified plugin, passing all the given arguments to it. If it succeeds, it returns all the values returned by that function. If it fails, returns no value at all. Note that only strings, numbers, bools, nils, API classes and simple tables can be used for parameters and return values; functions cannot be copied across plugins.\",\n\t\t\t},\n\t\t\tDoWithPlugin =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFn\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the CallbackFn for the specified plugin, if found. A plugin can be found even if it is currently unloaded, disabled or errored, the callback should check the plugin status. If the plugin is not found, this function returns false, otherwise it returns the bool value that the callback has returned. The CallbackFn has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function ({{cPlugin|Plugin}})</pre>\",\n\t\t\t},\n\t\t\tExecuteCommand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CommandStr\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CommandResult\",\n\t\t\t\t\t\tType = \"cPluginManager#CommandResult\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Executes the command as if given by the specified Player. Checks permissions.\",\n\t\t\t},\n\t\t\tExecuteConsoleCommand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CommandStr\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Executes the console command as if given by the admin on the console. If the command is successfully executed, returns true and the text that would be output to the console normally. On error it returns false and an error message.\",\n\t\t\t},\n\t\t\tFindPlugins =\n\t\t\t{\n\t\t\t\tNotes = \"<b>OBSOLETE</b>, use RefreshPluginList() instead\",\n\t\t\t},\n\t\t\tForceExecuteCommand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CommandStr\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CommandResult\",\n\t\t\t\t\t\tType = \"cPluginManager#CommandResult\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Same as ExecuteCommand, but doesn't check permissions\",\n\t\t\t},\n\t\t\tForEachCommand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFn\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the CallbackFn function for each command that has been bound using BindCommand(). The CallbackFn has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function(Command, Permission, HelpString)</pre> If the callback returns true, the enumeration is aborted and this API function returns false; if it returns false or no value, the enumeration continues with the next command, and the API function returns true.\",\n\t\t\t},\n\t\t\tForEachConsoleCommand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFn\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the CallbackFn function for each command that has been bound using BindConsoleCommand(). The CallbackFn has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function (Command, HelpString)</pre> If the callback returns true, the enumeration is aborted and this API function returns false; if it returns false or no value, the enumeration continues with the next command, and the API function returns true.\",\n\t\t\t},\n\t\t\tForEachPlugin =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tIsStatic = true,\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFn\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the CallbackFn function for each plugin that is currently discovered by Cuberite (including disabled, unloaded and errrored plugins). The CallbackFn has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function ({{cPlugin|Plugin}})</pre> If the callback returns true, the enumeration is aborted and this API function returns false; if it returns false or no value, the enumeration continues with the next command, and the API function returns true.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"CallbackFn\",\n\t\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Calls the CallbackFn function for each plugin that is currently discovered by Cuberite (including disabled, unloaded and errrored plugins). The CallbackFn has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function ({{cPlugin|Plugin}})</pre> If the callback returns true, the enumeration is aborted and this API function returns false; if it returns false or no value, the enumeration continues with the next command, and the API function returns true.\",\n\t\t\t\t}\n\t\t\t},\n\t\t\tGet =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cPluginManager\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the single instance of the plugin manager\",\n\t\t\t},\n\t\t\tGetAllPlugins =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a table (dictionary) of all plugins, [name => value], where value is a valid {{cPlugin}} if the plugin is loaded, or the bool value false if the plugin is not loaded.\",\n\t\t\t},\n\t\t\tGetCommandPermission =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Permission\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the permission needed for executing the specified command\",\n\t\t\t},\n\t\t\tGetCurrentPlugin =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cPlugin\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the {{cPlugin}} object for the calling plugin. This is the same object that the Initialize function receives as the argument.\",\n\t\t\t},\n\t\t\tGetNumLoadedPlugins =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of loaded plugins (psLoaded only)\",\n\t\t\t},\n\t\t\tGetNumPlugins =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of plugins, including the disabled, errored, unloaded and not-found ones\",\n\t\t\t},\n\t\t\tGetPlugin =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cPlugin\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"(<b>DEPRECATED, UNSAFE</b>) Returns a plugin handle of the specified plugin, or nil if such plugin is not loaded. Note thatdue to multithreading the handle is not guaranteed to be safe for use when stored - a single-plugin reload may have been triggered in the mean time for the requested plugin.\",\n\t\t\t},\n\t\t\tGetPluginFolderName =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the folder from which the plugin was loaded (without the \\\"Plugins\\\" part). Used as a plugin's display name.\",\n\t\t\t},\n\t\t\tGetPluginsPath =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the path where the individual plugin folders are located. Doesn't include the path separator at the end of the returned string.\",\n\t\t\t},\n\t\t\tIsCommandBound =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if in-game Command is already bound (by any plugin)\",\n\t\t\t},\n\t\t\tIsConsoleCommandBound =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if console Command is already bound (by any plugin)\",\n\t\t\t},\n\t\t\tIsPluginLoaded =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the specified plugin is loaded.\",\n\t\t\t},\n\t\t\tLoadPlugin =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginFolder\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"(<b>DEPRECATED</b>) Loads a plugin from the specified folder. NOTE: Loading plugins may be an unsafe operation and may result in a deadlock or a crash. This API is deprecated and might be removed.\",\n\t\t\t},\n\t\t\tLogStackTrace =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tNotes = \"Logs a current stack trace of the Lua engine to the server console log. Same format as is used when the plugin fails.\",\n\t\t\t},\n\t\t\tRefreshPluginList =\n\t\t\t{\n\t\t\t\tNotes = \"Refreshes the list of plugins to include all folders inside the Plugins folder (potentially new disabled plugins)\",\n\t\t\t},\n\t\t\tReloadPlugins =\n\t\t\t{\n\t\t\t\tNotes = \"Reloads all active plugins\",\n\t\t\t},\n\t\t\tUnloadPlugin =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Queues the specified plugin to be unloaded. To avoid deadlocks, the unloading happens in the main tick thread asynchronously.\",\n\t\t\t},\n\t\t\tReloadPlugin =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PluginName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Queues the specified plugin to be reloaded. To avoid deadlocks, the reloading happens in the main tick thread asynchronously.\",\n\t\t\t}\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tcrBlocked =\n\t\t\t{\n\t\t\t\tNotes = \"When a plugin stopped the command using the OnExecuteCommand hook\",\n\t\t\t},\n\t\t\tcrError =\n\t\t\t{\n\t\t\t\tNotes = \"When the command handler for the given command results in an error\",\n\t\t\t},\n\t\t\tcrExecuted =\n\t\t\t{\n\t\t\t\tNotes = \"When the command is successfully executed.\",\n\t\t\t},\n\t\t\tcrNoPermission =\n\t\t\t{\n\t\t\t\tNotes = \"When the player doesn't have permission to execute the given command.\",\n\t\t\t},\n\t\t\tcrUnknownCommand =\n\t\t\t{\n\t\t\t\tNotes = \"When the given command doesn't exist.\",\n\t\t\t},\n\t\t\tHOOK_BLOCK_SPREAD =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a block spreads based on world conditions\",\n\t\t\t},\n\t\t\tHOOK_BLOCK_TO_PICKUPS =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a block has been dug and is being converted to pickups. The server has provided the default pickups and the plugins may modify them.\",\n\t\t\t},\n\t\t\tHOOK_BREWING_COMPLETED =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a brewing stand completed a brewing process.\",\n\t\t\t},\n\t\t\tHOOK_BREWING_COMPLETING =\n\t\t\t{\n\t\t\t\tNotes = \"Called before a brewing stand completes a brewing process.\",\n\t\t\t},\n\t\t\tHOOK_CHAT =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a client sends a chat message that is not a command. The plugin may modify the chat message\",\n\t\t\t},\n\t\t\tHOOK_CHUNK_AVAILABLE =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a chunk is loaded or generated and becomes available in the {{cWorld|world}}.\",\n\t\t\t},\n\t\t\tHOOK_CHUNK_GENERATED =\n\t\t\t{\n\t\t\t\tNotes = \"Called after a chunk is generated. A plugin may do last modifications on the generated chunk before it is handed of to the {{cWorld|world}}.\",\n\t\t\t},\n\t\t\tHOOK_CHUNK_GENERATING =\n\t\t\t{\n\t\t\t\tNotes = \"Called before a chunk is generated. A plugin may override some parts of the generation algorithm.\",\n\t\t\t},\n\t\t\tHOOK_CHUNK_UNLOADED =\n\t\t\t{\n\t\t\t\tNotes = \"Called after a chunk has been unloaded from a {{cWorld|world}}.\",\n\t\t\t},\n\t\t\tHOOK_CHUNK_UNLOADING =\n\t\t\t{\n\t\t\t\tNotes = \"Called before a chunk is unloaded from a {{cWorld|world}}. The chunk has already been saved.\",\n\t\t\t},\n\t\t\tHOOK_COLLECTING_PICKUP =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a player is about to collect a pickup.\",\n\t\t\t},\n\t\t\tHOOK_CRAFTING_NO_RECIPE =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a player has items in the crafting slots and the server cannot locate any recipe. Plugin may provide a recipe.\",\n\t\t\t},\n\t\t\tHOOK_DISCONNECT =\n\t\t\t{\n\t\t\t\tNotes = \"Called after the player has disconnected.\",\n\t\t\t},\n\t\t\tHOOK_ENTITY_ADD_EFFECT =\n\t\t\t{\n\t\t\t\tNotes = \"Called when an effect is being added to an {{cEntity|entity}}. Plugin may refuse the effect.\",\n\t\t\t},\n\t\t\tHOOK_ENTITY_CHANGED_WORLD =\n\t\t\t{\n\t\t\t\tNotes = \"Called after a entity has changed the world.\",\n\t\t\t},\n\t\t\tHOOK_ENTITY_CHANGING_WORLD =\n\t\t\t{\n\t\t\t\tNotes = \"Called before a entity has changed the world. Plugin may disallow a entity to change the world.\",\n\t\t\t},\n\t\t\tHOOK_ENTITY_TELEPORT =\n\t\t\t{\n\t\t\t\tNotes = \"Called when an {{cEntity|entity}} is being teleported. Plugin may refuse the teleportation.\",\n\t\t\t},\n\t\t\tHOOK_EXECUTE_COMMAND =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a client sends a chat message that is recognized as a command, before handing that command to the regular command handler. A plugin may stop the command from being handled. This hook is called even when the player doesn't have permissions for the command.\",\n\t\t\t},\n\t\t\tHOOK_EXPLODED =\n\t\t\t{\n\t\t\t\tNotes = \"Called after an explosion has been processed in a {{cWorld|world}}.\",\n\t\t\t},\n\t\t\tHOOK_EXPLODING =\n\t\t\t{\n\t\t\t\tNotes = \"Called before an explosion is processed in a {{cWorld|world}}. A plugin may alter the explosion parameters or cancel the explosion altogether.\",\n\t\t\t},\n\t\t\tHOOK_HANDSHAKE =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a Handshake packet is received from a client.\",\n\t\t\t},\n\t\t\tHOOK_HOPPER_PULLING_ITEM =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a hopper is pulling an item from the container above it.\",\n\t\t\t},\n\t\t\tHOOK_HOPPER_PUSHING_ITEM =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a hopper is pushing an item into the container it is aimed at.\",\n\t\t\t},\n\t\t\tHOOK_DROPSPENSE =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a {{cDropSpenserEntity|DropSpenser}} is dropspensing an {{cItem|item}}.\",\n\t\t\t},\n\t\t\tHOOK_KILLED =\n\t\t\t{\n\t\t\t\tNotes = \"Called when an entity has been killed.\",\n\t\t\t},\n\t\t\tHOOK_KILLING =\n\t\t\t{\n\t\t\t\tNotes = \"Called when an entity has just been killed. A plugin may resurrect the entity by setting its health to above zero.\",\n\t\t\t},\n\t\t\tHOOK_LOGIN =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a Login packet is sent to the client, before the client is queued for authentication.\",\n\t\t\t},\n\t\t\tHOOK_LOGIN_FORGE =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a Forge client has sent its ModList to the server, during the login handshake.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_ANIMATION =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a client send the Animation packet.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_BREAKING_BLOCK =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a player is about to break a block. A plugin may cancel the event.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_BROKEN_BLOCK =\n\t\t\t{\n\t\t\t\tNotes = \"Called after a player has broken a block.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_CROUCHED =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a player crouches.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_DESTROYED =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the {{cPlayer}} object is destroyed - a player has disconnected.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_EATING =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player starts eating a held item. Plugins may abort the eating.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_FISHED =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player reels the fishing rod back in, after the server decides the player's fishing reward and the experience to grant.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_FISHING =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player reels the fishing rod back in, plugins may alter the fishing reward and the experience granted to the player.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_FOOD_LEVEL_CHANGE =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player's food level is changing. Plugins may refuse the change.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_JOINED =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player entity has been created. It has not yet been fully initialized.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_LEFT_CLICK =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the client sends the LeftClick packet.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_MOVING =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player has moved and the movement is now being applied.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_OPENING_WINDOW =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player is about to open a window. The plugin can return true to cancel the window opening.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_PLACED_BLOCK =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player has just placed a block\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_PLACING_BLOCK =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player is about to place a block. A plugin may cancel the event.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_RIGHT_CLICK =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the client sends the RightClick packet.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_RIGHT_CLICKING_ENTITY =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the client sends the UseEntity packet.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_SHOOTING =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player releases the mouse button to fire their bow.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_SPAWNED =\n\t\t\t{\n\t\t\t\tNotes = \"Called after the player entity has been created. The entity is fully initialized and is spawning in the {{cWorld|world}}.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_TOSSING_ITEM =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player is tossing the held item (keypress Q)\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_USED_BLOCK =\n\t\t\t{\n\t\t\t\tNotes = \"Called after the player has right-clicked a block\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_USED_ITEM =\n\t\t\t{\n\t\t\t\tNotes = \"Called after the player has right-clicked with a usable item in their hand.\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_USING_BLOCK =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player is about to use (right-click) a block\",\n\t\t\t},\n\t\t\tHOOK_PLAYER_USING_ITEM =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the player is about to right-click with a usable item in their hand.\",\n\t\t\t},\n\t\t\tHOOK_PLUGIN_MESSAGE =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a PluginMessage packet is received from a client.\",\n\t\t\t},\n\t\t\tHOOK_PLUGINS_LOADED =\n\t\t\t{\n\t\t\t\tNotes = \"Called after all plugins have loaded.\",\n\t\t\t},\n\t\t\tHOOK_POST_CRAFTING =\n\t\t\t{\n\t\t\t\tNotes = \"Called after a valid recipe has been chosen for the current contents of the crafting grid. Plugins may modify the recipe.\",\n\t\t\t},\n\t\t\tHOOK_PRE_CRAFTING =\n\t\t\t{\n\t\t\t\tNotes = \"Called before a recipe is searched for the current contents of the crafting grid. Plugins may provide a recipe and cancel the built-in search.\",\n\t\t\t},\n\t\t\tHOOK_PROJECTILE_HIT_BLOCK =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a {{cProjectileEntity|projectile}} hits a block.\",\n\t\t\t},\n\t\t\tHOOK_PROJECTILE_HIT_ENTITY =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a {{cProjectileEntity|projectile}} hits an {{cEntity|entity}}.\",\n\t\t\t},\n\t\t\tHOOK_SERVER_PING =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a client pings the server from the server list. Plugins may change the favicon, server description, players online and maximum players values.\",\n\t\t\t},\n\t\t\tHOOK_SPAWNED_ENTITY =\n\t\t\t{\n\t\t\t\tNotes = \"Called after an entity is spawned in a {{cWorld|world}}. The entity is already part of the world.\",\n\t\t\t},\n\t\t\tHOOK_SPAWNED_MONSTER =\n\t\t\t{\n\t\t\t\tNotes = \"Called after a mob is spawned in a {{cWorld|world}}. The mob is already part of the world.\",\n\t\t\t},\n\t\t\tHOOK_SPAWNING_ENTITY =\n\t\t\t{\n\t\t\t\tNotes = \"Called just before an entity is spawned in a {{cWorld|world}}.\",\n\t\t\t},\n\t\t\tHOOK_SPAWNING_MONSTER =\n\t\t\t{\n\t\t\t\tNotes = \"Called just before a mob is spawned in a {{cWorld|world}}.\",\n\t\t\t},\n\t\t\tHOOK_TAKE_DAMAGE =\n\t\t\t{\n\t\t\t\tNotes = \"Called when an entity is taking any kind of damage. Plugins may modify the damage value, effects, source or cancel the damage.\",\n\t\t\t},\n\t\t\tHOOK_TICK =\n\t\t\t{\n\t\t\t\tNotes = \"Called when the main server thread ticks - 20 times a second.\",\n\t\t\t},\n\t\t\tHOOK_UPDATED_SIGN =\n\t\t\t{\n\t\t\t\tNotes = \"Called after a {{cSignEntity|sign}} text has been updated, either by a player or by any external means.\",\n\t\t\t},\n\t\t\tHOOK_UPDATING_SIGN =\n\t\t\t{\n\t\t\t\tNotes = \"Called before a {{cSignEntity|sign}} text is updated, either by a player or by any external means.\",\n\t\t\t},\n\t\t\tHOOK_WEATHER_CHANGED =\n\t\t\t{\n\t\t\t\tNotes = \"Called after the weather has changed.\",\n\t\t\t},\n\t\t\tHOOK_WEATHER_CHANGING =\n\t\t\t{\n\t\t\t\tNotes = \"Called just before the weather changes\",\n\t\t\t},\n\t\t\tHOOK_WORLD_STARTED =\n\t\t\t{\n\t\t\t\tNotes = \"Called when a world has been started.\",\n\t\t\t},\n\t\t\tHOOK_WORLD_TICK =\n\t\t\t{\n\t\t\t\tNotes = \"Called in each world's tick thread when the game logic is about to tick (20 times a second).\",\n\t\t\t},\n\t\t\tpsDisabled =\n\t\t\t{\n\t\t\t\tNotes = \"The plugin is not enabled in settings.ini\",\n\t\t\t},\n\t\t\tpsError =\n\t\t\t{\n\t\t\t\tNotes = \"The plugin is enabled in settings.ini, but it has run into an error while loading. Use {{cPlugin}}:GetLoadError() to identify the error.\",\n\t\t\t},\n\t\t\tpsLoaded =\n\t\t\t{\n\t\t\t\tNotes = \"The plugin is enabled and loaded.\",\n\t\t\t},\n\t\t\tpsNotFound =\n\t\t\t{\n\t\t\t\tNotes = \"The plugin has been loaded, but is no longer present on disk.\",\n\t\t\t},\n\t\t\tpsUnloaded =\n\t\t\t{\n\t\t\t\tNotes = \"The plugin is enabled in settings.ini, but it has been unloaded (by a command).\",\n\t\t\t},\n\t\t},\n\t\tConstantGroups =\n\t\t{\n\t\t\tCommandResult =\n\t\t\t{\n\t\t\t\tInclude =\n\t\t\t\t{\n\t\t\t\t\t\"^cr.*\",\n\t\t\t\t},\n\t\t\t\tTextBefore = \"Results that the (Force)ExecuteCommand functions return. This gives information whether the command was executed or not, and the reason.\",\n\t\t\t},\n\t\t\tPluginHook =\n\t\t\t{\n\t\t\t\tInclude =\n\t\t\t\t{\n\t\t\t\t\t\"HOOK_.*\",\n\t\t\t\t},\n\t\t\t\tTextBefore = [[\n\t\t\t\t\tThese constants identify individual hooks. To register the plugin to receive notifications on hooks, use the\n\t\t\t\t\tcPluginManager:AddHook() function. For detailed description of each hook, see the <a href='index.html#hooks'>\n\t\t\t\t\thooks reference</a>.]],\n\t\t\t},\n\t\t\tePluginStatus =\n\t\t\t{\n\t\t\t\tInclude =\n\t\t\t\t{\n\t\t\t\t\t\"ps.*\",\n\t\t\t\t},\n\t\t\t\tTextBefore = [[\n\t\t\t\t\tThese constants are used to report status of individual plugins. Use {{cPlugin}}:GetStatus() to query the\n\t\t\t\t\tstatus of a plugin; use cPluginManager::ForEachPlugin() to iterate over plugins.]],\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/Projectiles.lua",
    "content": "return\n{\n\tcArrowEntity =\n\t{\n\t\tDesc = [[\n\t\t\tRepresents the arrow when it is shot from the bow. A subclass of the {{cProjectileEntity}}.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tCanPickup =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the specified player can pick the arrow when it's on the ground\",\n\t\t\t},\n\t\t\tGetBlockHit =\n\t\t\t{\n\t\t\t\tNotes = \"Returns the coords of the block into which the arrow is stuck. Undefined if the arrow is still moving.\",\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tGetDamageCoeff =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the damage coefficient stored within the arrow. The damage dealt by this arrow is multiplied by this coeff\",\n\t\t\t},\n\t\t\tGetPickupState =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cArrowEntity#ePickupState\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the pickup state (one of the psXXX constants, above)\",\n\t\t\t},\n\t\t\tIsCritical =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the arrow should deal critical damage. Based on the bow charge when the arrow was shot.\",\n\t\t\t},\n\t\t\tSetDamageCoeff =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"DamageCoeff\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the damage coefficient. The damage dealt by this arrow is multiplied by this coeff\",\n\t\t\t},\n\t\t\tSetIsCritical =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsCritical\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the IsCritical flag on the arrow. Critical arrow deal additional damage\",\n\t\t\t},\n\t\t\tSetPickupState =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PickupState\",\n\t\t\t\t\t\tType = \"cArrowEntity#ePickupState\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the pickup state (one of the psXXX constants, above)\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tpsInCreative =\n\t\t\t{\n\t\t\t\tNotes = \"The arrow can be picked up only by players in creative gamemode\",\n\t\t\t},\n\t\t\tpsInSurvivalOrCreative =\n\t\t\t{\n\t\t\t\tNotes = \"The arrow can be picked up by players in survival or creative gamemode\",\n\t\t\t},\n\t\t\tpsNoPickup =\n\t\t\t{\n\t\t\t\tNotes = \"The arrow cannot be picked up at all\",\n\t\t\t},\n\t\t},\n\t\tConstantGroups =\n\t\t{\n\t\t\tePickupState =\n\t\t\t{\n\t\t\t\tInclude = \"ps.*\",\n\t\t\t\tTextBefore = [[\n\t\t\t\t\tThe following constants are used to signalize whether the arrow, once it lands, can be picked by\n\t\t\t\t\tplayers:\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcExpBottleEntity =\n\t{\n\t\tDesc = [[\n\t\t\tRepresents a thrown ExpBottle. A subclass of the {{cProjectileEntity}}.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcFireChargeEntity =\n\t{\n\t\tDesc = [[\n\t\t\tRepresents a fire charge that has been shot by a Blaze or a {{cDispenserEntity|Dispenser}}. A subclass\n\t\t\tof the {{cProjectileEntity}}.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcFireworkEntity =\n\t{\n\t\tDesc = [[\n\t\t\tRepresents a firework rocket.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetItem =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the item that has been used to create the firework rocket. The item's m_FireworkItem member contains all the firework-related data.\",\n\t\t\t},\n\t\t\tGetTicksToExplosion =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of ticks left until the firework explodes.\",\n\t\t\t},\n\t\t\tSetItem =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FireworkItem\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets a new item to be used for the firework.\",\n\t\t\t},\n\t\t\tSetTicksToExplosion =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NumTicks\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the number of ticks left until the firework explodes.\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcGhastFireballEntity =\n\t{\n\t\tDesc = \"\",\n\t\tFunctions =\n\t\t{\n\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcProjectileEntity =\n\t{\n\t\tDesc = \"Base class for all projectiles, such as arrows and fireballs.\",\n\t\tFunctions =\n\t\t{\n\t\t\tGetCreatorName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the player that created the projectile. Will be empty for non-player creators\",\n\t\t\t},\n\t\t\tGetCreatorUniqueID =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the unique ID of the entity who created this projectile, or {{cEntity#INVALID_ID|cEntity.INVALID_ID}} if the projectile wasn't created by an entity.\",\n\t\t\t},\n\t\t\tGetMCAClassName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the string that identifies the projectile type (class name) in MCA files\",\n\t\t\t},\n\t\t\tGetProjectileKind =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cProjectileEntity#eKind\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the kind of this projectile (pkXXX constant)\",\n\t\t\t},\n\t\t\tIsInGround =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if this projectile has hit the ground.\",\n\t\t\t},\n\t\t},\n\t\tConstants =\n\t\t{\n\t\t\tpkArrow =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is an {{cArrowEntity|arrow}}\",\n\t\t\t},\n\t\t\tpkEgg =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a {{cThrownEggEntity|thrown egg}}\",\n\t\t\t},\n\t\t\tpkEnderPearl =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a {{cThrownEnderPearlEntity|thrown enderpearl}}\",\n\t\t\t},\n\t\t\tpkExpBottle =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a {{cExpBottleEntity|thrown exp bottle}}\",\n\t\t\t},\n\t\t\tpkFireCharge =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a {{cFireChargeEntity|fire charge}}\",\n\t\t\t},\n\t\t\tpkFirework =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a (flying) {{cFireworkEntity|firework}}\",\n\t\t\t},\n\t\t\tpkGhastFireball =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a {{cGhastFireballEntity|ghast fireball}}\",\n\t\t\t},\n\t\t\tpkSnowball =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a {{cThrownSnowballEntity|thrown snowball}}\",\n\t\t\t},\n\t\t\tpkSplashPotion =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a {{cSplashPotionEntity|thrown splash potion}}\",\n\t\t\t},\n\t\t\tpkWitherSkull =\n\t\t\t{\n\t\t\t\tNotes = \"The projectile is a {{cWitherSkullEntity|wither skull}}\",\n\t\t\t},\n\t\t},\n\t\tConstantGroups =\n\t\t{\n\t\t\teKind =\n\t\t\t{\n\t\t\t\tInclude = \"pk.*\",\n\t\t\t\tTextBefore = \"The following constants are used to distinguish between the different projectile kinds:\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cEntity\",\n\t},\n\tcSplashPotionEntity =\n\t{\n\t\tDesc = [[\n\t\t\tRepresents a thrown splash potion.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tGetEntityEffectType =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the effect type of this potion\",\n\t\t\t},\n\t\t\tGetItem =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Gets the potion item that was thrown.\",\n\t\t\t},\n\t\t\tGetPotionColor =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the color index of the particles emitted by this potion\",\n\t\t\t},\n\t\t\tSetEntityEffectType =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EntityEffectType\",\n\t\t\t\t\t\tType = \"cEntityEffect#eType\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the effect type of this potion\",\n\t\t\t},\n\t\t\tSetPotionColor =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PotionColor\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the color index of the particles for this potion\",\n\t\t\t},\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcThrownEggEntity =\n\t{\n\t\tDesc = [[\n\t\t\tRepresents a thrown egg.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcThrownEnderPearlEntity =\n\t{\n\t\tDesc = \"Represents a thrown ender pearl.\",\n\t\tFunctions =\n\t\t{\n\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcThrownSnowballEntity =\n\t{\n\t\tDesc = \"Represents a thrown snowball.\",\n\t\tFunctions =\n\t\t{\n\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n\tcWitherSkullEntity =\n\t{\n\t\tDesc = \"Represents a wither skull being shot.\",\n\t\tFunctions =\n\t\t{\n\n\t\t},\n\t\tInherits = \"cProjectileEntity\",\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/RankManager.lua",
    "content": "-- Describes the cRankManager class API\n\nreturn\n{\n\tcRankManager =\n\t{\n\t\tDesc = [[\n\t\t\tManages the players' permissions. The players are assigned a single rank, which contains groups of\n\t\t\tpermissions and restrictions. The functions in this class query or modify these.</p>\n\t\t\t<p>\n\t\t\tAll the functions are static, call them using the <code>cRankManager:Function()</code> convention.</p>\n\t\t\t<p>\n\t\t\tThe players are identified by their UUID, to support player renaming.</p>\n\t\t\t<p>\n\t\t\tThe rank also contains specific \"mesage visuals\" - bits that are used for formatting messages from the\n\t\t\tplayers. There's a message prefix, which is put in front of every message the player sends, and the\n\t\t\tmessage suffix that is appended to each message. There's also a PlayerNameColorCode, which holds the\n\t\t\tcolor that is used for the player's name in the messages.</p>\n\t\t\t<p>\n\t\t\tEach rank can contain any number of permission groups. These groups allow for an easier setup of the\n\t\t\tpermissions - you can share groups among ranks, so the usual approach is to group similar permissions\n\t\t\ttogether and add that group to any rank that should use those permissions.</p>\n\t\t\t<p>\n\t\t\tPermissions are added to individual groups. Each group can support unlimited permissions. Note that\n\t\t\tadding a permission to a group will make the permission available to all the ranks that contain that\n\t\t\tpermission group.</p>\n\t\t\t<p>\n\t\t\tOne rank is reserved as the Default rank. All players that don't have an explicit rank assigned to them\n\t\t\twill behave as if assigned to this rank. The default rank can be changed to any other rank at any time.\n\t\t\tNote that the default rank cannot be removed from the RankManager - RemoveRank() will change the default\n\t\t\trank to the replacement rank, if specified, and fail if no replacement rank is specified. Renaming the\n\t\t\tdefault rank using RenameRank() will change the default rank to the new name.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tAddGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Adds the group of the specified name. Logs a warning and does nothing if the group already exists.\",\n\t\t\t},\n\t\t\tAddGroupToRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Adds the specified group to the specified rank. Returns true on success, false on failure - if the group name or the rank name is not found.\",\n\t\t\t},\n\t\t\tAddPermissionToGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Permission\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Adds the specified permission to the specified group. Returns true on success, false on failure - if the group name is not found.\",\n\t\t\t},\n\t\t\tAddRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgPrefix\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgSuffix\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgNameColorCode\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Adds a new rank of the specified name and with the specified message visuals. Logs an info message and does nothing if the rank already exists.\",\n\t\t\t},\n\t\t\tAddRestrictionToGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Permission\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{ Type = \"boolean\" },\n\t\t\t\t},\n\t\t\t\tNotes = \"Adds a new restriction to the specified group. Returns true if successful, false if it fails (no such group). No action if the group already has the restriction.\",\n\t\t\t},\n\t\t\tClearPlayerRanks =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tNotes = \"Removes all player ranks from the database. Note that this doesn't change the cPlayer instances for the already connected players, you need to update all the instances manually.\",\n\t\t\t},\n\t\t\tGetAllGroups =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table containing the names of all the groups that are known to the manager.\",\n\t\t\t},\n\t\t\tGetAllPermissions =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table containing all the permissions that are known to the manager.\",\n\t\t\t},\n\t\t\tGetAllPermissionsRestrictions =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table containing all the permissions and restrictions (intermixed together) that are known to the manager.\",\n\t\t\t},\n\t\t\tGetAllPlayerUUIDs =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the short uuids of all players stored in the rank DB, sorted by the players' names (case insensitive).\",\n\t\t\t},\n\t\t\tGetAllRanks =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table containing the names of all the ranks that are known to the manager.\",\n\t\t\t},\n\t\t\tGetAllRestrictions =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table containing all the restrictions that are known to the manager.\",\n\t\t\t},\n\t\t\tGetDefaultRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the default rank. \",\n\t\t\t},\n\t\t\tGetGroupPermissions =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table containing the permissions that the specified group contains.\",\n\t\t\t},\n\t\t\tGetGroupRestrictions =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table containing the restrictions that the specified group contains.\",\n\t\t\t},\n\t\t\tGetPlayerGroups =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table of the names of the groups that are assigned to the specified player through their rank. Returns an empty table if the player is not known or has no rank or groups assigned to them.\",\n\t\t\t},\n\t\t\tGetPlayerMsgVisuals =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgPrefix\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgSuffix\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgNameColorCode\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the message visuals assigned to the player. If the player is not explicitly assigned a rank, the default rank's visuals are returned. If there is an error, no value is returned at all.\",\n\t\t\t},\n\t\t\tGetPlayerName =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the last name that the specified player has, for a player in the ranks database. An empty string is returned if the player isn't in the database.\",\n\t\t\t},\n\t\t\tGetPlayerPermissions =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table containing all permissions that the specified player is assigned through their rank. Returns the default rank's permissions if the player has no explicit rank assigned to them. Returns an empty array on error.\",\n\t\t\t},\n\t\t\tGetPlayerRankName =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the rank that is assigned to the specified player. An empty string (NOT the default rank) is returned if the player has no rank assigned to them.\",\n\t\t\t},\n\t\t\tGetRankGroups =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table of the names of all the groups that are assigned to the specified rank. Returns an empty table if there is no such rank.\",\n\t\t\t},\n\t\t\tGetRankPermissions =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table of all the permissions that are assigned to the specified rank through its groups. Returns an empty table if there is no such rank.\",\n\t\t\t},\n\t\t\tGetRankRestrictions =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table of all the restrictions that are assigned to the specified rank through its groups. Returns an empty table if there is no such rank.\",\n\t\t\t},\n\t\t\tGetRankVisuals =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgPrefix\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgSuffix\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgNameColorCode\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the message visuals for the specified rank. Returns no value if the specified rank does not exist.\",\n\t\t\t},\n\t\t\tGroupExists =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true iff the specified group exists.\",\n\t\t\t},\n\t\t\tIsGroupInRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true iff the specified group is assigned to the specified rank.\",\n\t\t\t},\n\t\t\tIsPermissionInGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Permission\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true iff the specified permission is assigned to the specified group.\",\n\t\t\t},\n\t\t\tIsPlayerRankSet =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true iff the specified player has a rank assigned to them.\",\n\t\t\t},\n\t\t\tIsRestrictionInGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Restriction\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true iff the specified restriction is assigned to the specified group.\",\n\t\t\t},\n\t\t\tRankExists =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true iff the specified rank exists.\",\n\t\t\t},\n\t\t\tRemoveGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Removes the specified group completely. The group will be removed from all the ranks using it and then erased from the manager. Logs an info message and does nothing if the group doesn't exist.\",\n\t\t\t},\n\t\t\tRemoveGroupFromRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Removes the specified group from the specified rank. The group will still exist, even if it isn't assigned to any rank. Logs an info message and does nothing if the group or rank doesn't exist.\",\n\t\t\t},\n\t\t\tRemovePermissionFromGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Permission\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Removes the specified permission from the specified group. Logs an info message and does nothing if the group doesn't exist.\",\n\t\t\t},\n\t\t\tRemovePlayerRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Removes the player's rank; the player's left without a rank. Note that this doesn't change the {{cPlayer}} instances for the already connected players, you need to update all the instances manually. No action if the player has no rank assigned to them already.\",\n\t\t\t},\n\t\t\tRemoveRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ReplacementRankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Removes the specified rank. If ReplacementRankName is given, the players that have RankName will get their rank set to ReplacementRankName. If it isn't given, or is an invalid rank, the players will be removed from the manager, their ranks will be unset completely. Logs an info message and does nothing if the rank is not found.\",\n\t\t\t},\n\t\t\tRemoveRestrictionFromGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Restriction\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"GroupName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Removes the specified restriction from the specified group.\",\n\t\t\t},\n\t\t\tRenameGroup =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OldName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NewName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Renames the specified group. Logs an info message and does nothing if the group is not found or the new name is already used.\",\n\t\t\t},\n\t\t\tRenameRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OldName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NewName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Renames the specified rank. Logs an info message and does nothing if the rank is not found or the new name is already used.\",\n\t\t\t},\n\t\t\tSetDefaultRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the specified rank as the default rank. Returns true on success, false on failure (rank doesn't exist).\",\n\t\t\t},\n\t\t\tSetPlayerRank =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Updates the rank for the specified player. The player name is provided for reference, the UUID is used for identification. Logs a warning and does nothing if the rank is not found.\",\n\t\t\t},\n\t\t\tSetRankVisuals =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RankName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgPrefix\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgSuffix\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MsgNameColorCode\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Updates the rank's message visuals. Logs an info message and does nothing if rank not found.\",\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/WebAdmin.lua",
    "content": "return\n{\n\tcWebAdmin =\n\t{\n\t\tDesc = \"\",\n\t\tFunctions =\n\t\t{\n\t\t\tAddWebTab =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Title\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"UrlPath\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"HandlerFn\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Adds a new web tab to webadmin. The tab uses \\\"Title\\\" as its display string and is identified in the URL using the UrlPath (https://server.domain.com/webadmin/{PluginName}/{UrlPath}). The HandlerFn is the callback function that is called when the admin accesses the page, it has the following signature:<br/><pre class=\\\"prettyprint lang-lua\\\">function ({{HTTPRequest|a_Request}}, a_UrlPath)<br/>  return Content, ContentType<br/>end</pre> URLPath must not contain a '/', the recommendation is to use only 7-bit-clean ASCII character set.\",\n\t\t\t},\n\t\t\tGetAllWebTabs =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns an array-table with each item describing a web tab, for all web tabs registered in the WebAdmin, for all plugins. The returned table has the following format:<br/><pre class=\\\"prettyprint lang-lua\\\">{<br/>  {<br/>    PluginName = \\\"Plugin's API name\\\",<br/>    UrlPath = \\\"UrlPath given to AddWebTab\\\",<br/>    Title = \\\"Title given to AddWebTab\\\",<br/>  },<br/>  ...<br/>}\",\n\t\t\t},\n\t\t\tGetBaseURL =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"URL\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the string that is the path of the base webadmin (\\\"../../../webadmin\\\") relative to the given URL.\",\n\t\t\t},\n\t\t\tGetContentTypeFromFileExt =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"FileExt\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the content-type that should be used for files with the specified extension (without the dot), such as \\\"text/plain\\\" for the \\\"txt\\\" extension. If the extension is not known, returns an empty string.\",\n\t\t\t},\n\t\t\tGetHTMLEscapedString =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Gets the HTML-escaped representation of a requested string. This is useful for user input and game data that is not guaranteed to be escaped already.\",\n\t\t\t},\n\t\t\tGetPage =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Request\",\n\t\t\t\t\t\tType = \"HTTPRequest\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the (inner HTML) page contents for the specified request. Calls the appropriate WebTab handler registered via AddWebTab() and returns the information from that plugin wrapped in a table with the following structure:<br/><pre class=\\\"prettyprint lang-lua\\\">{<br/>  Content = \\\"\\\",      -- Content returned by the plugin<br/>  ContentType = \\\"\\\",  -- Content type returned by the plugin, or \\\"text/html\\\" if none returned<br/>  UrlPath = \\\"\\\",      -- UrlPath decoded from the request<br/>  TabTitle = \\\"\\\",     -- Title of the tab that handled the request, as given to AddWebTab()<br/>  PluginName = \\\"\\\",   -- API name of the plugin that handled the request<br/>  PluginFolder = \\\"\\\", -- Folder name (= display name) of the plugin that handled the request<br/>}</pre>This function is mainly used in the webadmin template file.\",\n\t\t\t},\n\t\t\tGetPorts =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns a comma-separated list of ports on which the webadmin is configured to listen. Note that this list does include ports that may currently be unavailable (another server was already listening on them prior to launching Cuberite).\",\n\t\t\t},\n\t\t\tGetURLEncodedString =\n\t\t\t{\n\t\t\t\tIsStatic = true,\n\t\t\t\tObsoletedBy = \"cUrlParser:UrlEncode\",\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Input\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"<b>OBSOLETE</b> - use {{cUrlParser}}:UrlEncode() instead.<br/>Returns the string given to it escaped by URL encoding, which makes the string suitable for transmission in an URL. Invalid characters are turned into \\\"%xy\\\" values.\",\n\t\t\t},\n\t\t\tReload =\n\t\t\t{\n\t\t\t\tNotes = \"Reloads the webadmin's config - the allowed logins, the template script and the login page. Note that reloading will not change the \\\"enabled\\\" state of the server, and it will not update listening ports. Existing WebTabs will be kept registered even after the reload.\",\n\t\t\t},\n\t\t},\n\t},\n\tHTTPFormData =\n\t{\n\t\tDesc = \"This class stores data for one form element for a {{HTTPRequest|HTTP request}}.\",\n\t\tVariables =\n\t\t{\n\t\t\tName =\n\t\t\t{\n\t\t\t\tType = \"string\",\n\t\t\t\tNotes = \"Name of the form element\",\n\t\t\t},\n\t\t\tType =\n\t\t\t{\n\t\t\t\tType = \"string\",\n\t\t\t\tNotes = \"Type of the data (usually empty)\",\n\t\t\t},\n\t\t\tValue =\n\t\t\t{\n\t\t\t\tType = \"string\",\n\t\t\t\tNotes = \"Value of the form element. Contains the raw data as sent by the browser.\",\n\t\t\t},\n\t\t},\n\t},\n\tHTTPRequest =\n\t{\n\t\tDesc = [[\n\t\t\tThis class encapsulates all the data that is sent to the WebAdmin through one HTTP request. Plugins\n\t\t\treceive this class as a parameter to the function handling the web requests, as registered in the\n\t\t\t{{cPluginLua}}:AddWebPage().\n\t\t]],\n\t\tConstants =\n\t\t{\n\t\t\tParams =\n\t\t\t{\n\t\t\t\tNotes = \"Map-table of parameters given to the request in the URL (?param=value); if a form uses GET method, this is the same as FormData. For each parameter given as \\\"param=value\\\", there is an entry in the table with \\\"param\\\" as its key and \\\"value\\\" as its value.\",\n\t\t\t},\n\t\t\tFormData =\n\t\t\t{\n\t\t\t\tNotes = \"Array-table of {{HTTPFormData}}, contains the values of individual form elements submitted by the client\",\n\t\t\t},\n\t\t\tPostParams =\n\t\t\t{\n\t\t\t\tNotes = \"Map-table of data posted through a FORM - either a GET or POST method. Logically the same as FormData, but in a map-table format (for each parameter given as \\\"param=value\\\", there is an entry in the table with \\\"param\\\" as its key and \\\"value\\\" as its value).\",\n\t\t\t},\n\t\t},\n\t\tVariables =\n\t\t{\n\t\t\tMethod =\n\t\t\t{\n\t\t\t\tType = \"string\",\n\t\t\t\tNotes = \"The HTTP method used to make the request. Usually GET or POST.\",\n\t\t\t},\n\t\t\tPath =\n\t\t\t{\n\t\t\t\tType = \"string\",\n\t\t\t\tNotes = \"The Path part of the URL (excluding the parameters)\",\n\t\t\t},\n\t\t\tURL =\n\t\t\t{\n\t\t\t\tType = \"string\",\n\t\t\t\tNotes = \"The entire URL used for the request.\",\n\t\t\t},\n\t\t\tUsername =\n\t\t\t{\n\t\t\t\tType = \"string\",\n\t\t\t\tNotes = \"Name of the logged-in user.\",\n\t\t\t},\n\t\t},\n\t},\n\tHTTPTemplateRequest =\n\t{\n\t\tDesc = [[\nThis class is used only in the WebAdmin template script as the parameter to the function that provides the template.\n\t\t]],\n\t\tVariables =\n\t\t{\n\t\t\tRequest =\n\t\t\t{\n\t\t\t\tType = \"HTTPRequest\",\n\t\t\t\tNotes = \"The request for which the template is being built.\",\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Classes/World.lua",
    "content": "-- Describes the cWorld class API\n\nreturn\n{\n\tcWorld =\n\t{\n\t\tDesc = [[\n\t\t\tcWorld is the game world. It is the hub of all the information managed by individual classes,\n\t\t\tproviding convenient access to them. Cuberite supports multiple worlds in any combination of\n\t\t\tworld types. You can have two overworlds, three nethers etc. To enumerate all world the server\n\t\t\tprovides, use the {{cRoot}}:ForEachWorld() function.</p>\n\t\t\t<p>\n\t\t\tThe world data is held in individual chunks. Each chunk consists of 16 (x) * 16 (z) * 256 (y)\n\t\t\tblocks, each block is specified by its block type (8-bit) and block metadata (4-bit).\n\t\t\tAdditionally, each block has two light values calculated - skylight (how much daylight it receives)\n\t\t\tand blocklight (how much light from light-emissive blocks it receives), both 4-bit.</p>\n\t\t\t<p>\n\t\t\tEach world runs several separate threads used for various housekeeping purposes, the most important\n\t\t\tof those is the Tick thread. This thread updates the game logic 20 times per second, and it is\n\t\t\tthe thread where all the gameplay actions are evaluated. Liquid physics, entity interactions,\n\t\t\tplayer movement etc., all are applied in this thread.</p>\n\t\t\t<p>\n\t\t\tAdditional threads include the generation thread (generates new chunks as needed, storage thread\n\t\t\t(saves and loads chunk from the disk), lighting thread (updates block light values) and the\n\t\t\tchunksender thread (compresses chunks to send to the clients).</p>\n\t\t\t<p>\n\t\t\tThe world provides access to all its {{cPlayer|players}}, {{cEntity|entities}} and {{cBlockEntity|block\n\t\t\tentities}}. Because of multithreading issues, individual objects cannot be retrieved for indefinite\n\t\t\thandling, but rather must be modified in callbacks, within which they are guaranteed to stay valid.</p>\n\t\t\t<p>\n\t\t\tPhysics for individual blocks are handled by the simulators. These will fire in each tick for all\n\t\t\tblocks that have been scheduled for simulator update (\"simulator wakeup\"). The simulators include\n\t\t\tliquid physics, falling blocks, fire spreading and extinguishing and redstone.</p>\n\t\t\t<p>\n\t\t\tGame time is also handled by the world. It provides the time-of-day and the total world age.\n\t\t]],\n\t\tFunctions =\n\t\t{\n\t\t\tAreCommandBlocksEnabled =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns whether command blocks are enabled on the (entire) server\",\n\t\t\t},\n\t\t\tBroadcastBlockAction =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ActionByte1\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ActionByte2\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Broadcasts the BlockAction packet to all clients who have the appropriate chunk loaded (except ExcludeClient). The contents of the packet are specified by the parameters for the call, the blocktype needn't match the actual block that is present in the world data at the specified location.\",\n\t\t\t},\n\t\t\tBroadcastBlockAction =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ActionByte1\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ActionByte2\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Broadcasts the BlockAction packet to all clients who have the appropriate chunk loaded (except ExcludeClient). The contents of the packet are specified by the parameters for the call, the blocktype needn't match the actual block that is present in the world data at the specified location. (DEPRECATED)\",\n\t\t\t},\n\t\t\tBroadcastChat =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChatPrefix\",\n\t\t\t\t\t\tType = \"eMessageType\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends the Message to all players in this world, except the optional ExcludeClient. No formatting is done by the server.\",\n\t\t\t},\n\t\t\tBroadcastChatDeath =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Prepends Gray [DEATH] / colours entire text (depending on ShouldUseChatPrefixes()) and broadcasts message. For when a player dies.\",\n\t\t\t},\n\t\t\tBroadcastChatFailure =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Prepends Rose [INFO] / colours entire text (depending on ShouldUseChatPrefixes()) and broadcasts message. For a command that failed to run because of insufficient permissions, etc.\",\n\t\t\t},\n\t\t\tBroadcastChatFatal =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Prepends Red [FATAL] / colours entire text (depending on ShouldUseChatPrefixes()) and broadcasts message. For a plugin that crashed, or similar.\",\n\t\t\t},\n\t\t\tBroadcastChatInfo =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Prepends Yellow [INFO] / colours entire text (depending on ShouldUseChatPrefixes()) and broadcasts message. For informational messages, such as command usage.\",\n\t\t\t},\n\t\t\tBroadcastChatSuccess =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Prepends Green [INFO] / colours entire text (depending on ShouldUseChatPrefixes()) and broadcasts message. For success messages.\",\n\t\t\t},\n\t\t\tBroadcastChatWarning =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Message\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Prepends Rose [WARN] / colours entire text (depending on ShouldUseChatPrefixes()) and broadcasts message. For concerning events, such as plugin reload etc.\",\n\t\t\t},\n\t\t\tBroadcastEntityAnimation =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"TargetEntity\",\n\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Animation\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends an animation of an entity to all clienthandles (except ExcludeClient if given)\",\n\t\t\t},\n\t\t\tBroadcastParticleEffect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ParticleName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OffsetX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OffsetY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OffsetZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ParticleData\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ParticleAmount\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Spawns the specified particles to all players in the world exept the optional ExeptClient. A list of available particles by thinkofdeath can be found {{https://gist.github.com/thinkofdeath/5110835|Here}}. <b>OBSOLETE</b>, use the vector-based overload instead\",\n\t\t\t},\n\t\t\tBroadcastParticleEffect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ParticleName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SourcePos\",\n\t\t\t\t\t\tType = \"Vector3f\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Offset\",\n\t\t\t\t\t\tType = \"Vector3f\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ParticleData\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ParticleAmount\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Spawns the specified particles to all players in the world exept the optional ExeptClient. A list of available particles by thinkofdeath can be found {{https://gist.github.com/thinkofdeath/5110835|Here}}\",\n\t\t\t},\n\t\t\tBroadcastPlayerListHeaderFooter =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\tName = \"Header\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cCompositeChat\",\n\t\t\t\t\t\tName = \"Footer\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tDesc = \"Broadcasts the header and footer of the player list to all players in the world.\",\n\t\t\t},\n\t\t\tBroadcastSoundEffect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SoundName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Volume\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Pitch\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends the specified sound effect to all players in this world, except the optional ExceptClient\",\n\t\t\t},\n\t\t\tBroadcastSoundEffect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SoundName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Volume\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Pitch\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends the specified sound effect to all players in this world, except the optional ExceptClient (DEPRECATED, use vector-parametered version instead)\",\n\t\t\t},\n\t\t\tBroadcastSoundParticleEffect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectID\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectData\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends the specified effect to all players in this world, except the optional ExceptClient. <b>OBSOLETE</b>, use the vector overload instead\",\n\t\t\t},\n\t\t\tBroadcastSoundParticleEffect =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectID\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SourcePos\",\n\t\t\t\t\t\tType = \"Vector3i\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EffectData\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ExcludeClient\",\n\t\t\t\t\t\tType = \"cClientHandle\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends the specified effect to all players in this world, except the optional ExceptClient\",\n\t\t\t},\n\t\t\tCastThunderbolt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Creates a thunderbolt at the specified coords\",\n\t\t\t},\n\t\t\tCastThunderbolt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Creates a thunderbolt at the specified coords (DEPRECATED, use vector-parametered version instead)\",\n\t\t\t},\n\t\t\tChangeWeather =\n\t\t\t{\n\t\t\t\tNotes = \"Forces the weather to change in the next game tick. Weather is changed according to the normal rules: wSunny <-> wRain <-> wStorm\",\n\t\t\t},\n\t\t\tChunkStay =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkCoordTable\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OnChunkAvailable\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"OnAllChunksAvailable\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Queues the specified chunks to be loaded or generated and calls the specified callbacks once they are loaded. ChunkCoordTable is an arra-table of chunk coords, each coord being a table of 2 numbers: { {Chunk1x, Chunk1z}, {Chunk2x, Chunk2z}, ...}. When any of those chunks are made available (including being available at the start of this call), the OnChunkAvailable() callback is called. When all the chunks are available, the OnAllChunksAvailable() callback is called. The function signatures are: <pre class=\\\"prettyprint lang-lua\\\">function OnChunkAvailable(ChunkX, ChunkZ)\\\nfunction OnAllChunksAvailable()</pre> All return values from the callbacks are ignored.\",\n\t\t\t},\n\t\t\tCreateProjectile =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ProjectileKind\",\n\t\t\t\t\t\tType = \"cProjectileEntity#eKind\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Creator\",\n\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Originating Item\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Speed\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Creates a new projectile of the specified kind at the specified coords. The projectile's creator is set to Creator (may be nil). The item that created the projectile entity, commonly the {{cPlayer|player}}'s currently equipped item, is used at present for fireworks to correctly set their entity metadata. It is not used for any other projectile. Optional speed indicates the initial speed for the projectile.\",\n\t\t\t},\n\t\t\tDigBlock =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Digger\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Replaces the specified block with air, without dropping the usual pickups for the block. Wakes up the simulators for the block and its neighbors. The optional Digger parameter specifies the entity who dug the block, usually a player. Returns true on success, or false if the chunk is not loaded or invalid coords. See also DropBlockAsPickups() for the version that drops pickups.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Digger\",\n\t\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Replaces the specified block with air, without dropping the usual pickups for the block. Wakes up the simulators for the block and its neighbors. The optional Digger parameter specifies the entity who dug the block, usually a player. Returns true on success, or false if the chunk is not loaded or invalid coords. See also DropBlockAsPickups() for the version that drops pickups.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tDoExplosionAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Force\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CanCauseFire\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Source\",\n\t\t\t\t\t\tType = \"eExplosionSource\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SourceData\",\n\t\t\t\t\t\tType = \"any\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Creates an explosion of the specified relative force in the specified position. If CanCauseFire is set, the explosion will set blocks on fire, too. The Source parameter specifies the source of the explosion, one of the esXXX constants. The SourceData parameter is specific to each source type, usually it provides more info about the source.\",\n\t\t\t},\n\t\t\tDoWithBeaconAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a beacon at the specified coords, calls the CallbackFunction with the {{cBeaconEntity}} parameter representing the beacon. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBeaconEntity|BeaconEntity}})</pre> The function returns false if there is no beacon, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithBedAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a bed at the specified coords, calls the CallbackFunction with the {{cBedEntity}} parameter representing the bed. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBedEntity|cBedEntity}})</pre> The function returns false if there is no bed, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithBlockEntityAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a block entity at the specified coords, calls the CallbackFunction with the {{cBlockEntity}} parameter representing the block entity. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBlockEntity|BlockEntity}})</pre> The function returns false if there is no block entity, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithBrewingstandAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a brewingstand at the specified coords, calls the CallbackFunction with the {{cBrewingstandEntity}} parameter representing the brewingstand. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBrewingstandEntity|cBrewingstandEntity}})</pre> The function returns false if there is no brewingstand, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithChestAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a chest at the specified coords, calls the CallbackFunction with the {{cChestEntity}} parameter representing the chest. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cChestEntity|ChestEntity}})</pre> The function returns false if there is no chest, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithCommandBlockAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a command block at the specified coords, calls the CallbackFunction with the {{cCommandBlockEntity}} parameter representing the command block. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cCommandBlockEntity|CommandBlockEntity}})</pre> The function returns false if there is no command block, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithDispenserAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a dispenser at the specified coords, calls the CallbackFunction with the {{cDispenserEntity}} parameter representing the dispenser. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cDispenserEntity|DispenserEntity}})</pre> The function returns false if there is no dispenser, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithDropperAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a dropper at the specified coords, calls the CallbackFunction with the {{cDropperEntity}} parameter representing the dropper. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cDropperEntity|DropperEntity}})</pre> The function returns false if there is no dropper, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithDropSpenserAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a dropper or a dispenser at the specified coords, calls the CallbackFunction with the {{cDropSpenserEntity}} parameter representing the dropper or dispenser. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cDropSpenserEntity|DropSpenserEntity}})</pre> Note that this can be used to access both dispensers and droppers in a similar way. The function returns false if there is neither dispenser nor dropper, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithEntityByID =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If an entity with the specified ID exists, calls the callback with the {{cEntity}} parameter representing the entity. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cEntity|Entity}})</pre> The function returns false if the entity was not found, and it returns the same bool value that the callback has returned if the entity was found.\",\n\t\t\t},\n\t\t\tDoWithFlowerPotAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a flower pot at the specified coords, calls the CallbackFunction with the {{cFlowerPotEntity}} parameter representing the flower pot. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cFlowerPotEntity|FlowerPotEntity}})</pre> The function returns false if there is no flower pot, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithFurnaceAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a furnace at the specified coords, calls the CallbackFunction with the {{cFurnaceEntity}} parameter representing the furnace. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cFurnaceEntity|FurnaceEntity}})</pre> The function returns false if there is no furnace, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithHopperAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a hopper at the specified coords, calls the CallbackFunction with the {{cHopperEntity}} parameter representing the hopper. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cHopperEntity|cHopperEntity}})</pre> The function returns false if there is no hopper, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithMobHeadAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a mob head at the specified coords, calls the CallbackFunction with the {{cMobHeadEntity}} parameter representing the furnace. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cMobHeadEntity|MobHeadEntity}})</pre> The function returns false if there is no mob head, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithNearestPlayer =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"RangeLimit\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CheckLineOfSight\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IgnoreSpectator\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback function with the {{cPlayer|player}} nearest to the specified position as its parameter, if they are still within the range limit. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cPlayer|Player}})</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found.\",\n\t\t\t},\n\t\t\tDoWithNoteBlockAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a note block at the specified coords, calls the CallbackFunction with the {{cNoteEntity}} parameter representing the note block. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cNoteEntity|NoteEntity}})</pre> The function returns false if there is no note block, or if there is, it returns the bool value that the callback has returned.\",\n\t\t\t},\n\t\t\tDoWithPlayer =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is a player of the specified name (exact match), calls the CallbackFunction with the {{cPlayer}} parameter representing the player. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cPlayer|Player}})</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found.\",\n\t\t\t},\n\t\t\tDoWithPlayerByUUID =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerUUID\",\n\t\t\t\t\t\tType = \"cUUID\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"If there is the player with the uuid, calls the CallbackFunction with the {{cPlayer}} parameter representing the player. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cPlayer|Player}})</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found.\",\n\t\t\t},\n\t\t\tDropBlockAsPickups =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Digger\",\n\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Tool\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsSuccess\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Digs up the specified block and spawns the appropriate pickups for it. The optional Digger parameter specifies the {{cEntity|entity}} who dug the block, usually a {{cPlayer|player}}. The optional Tool parameter specifies the tool used to dig the block, not present means an empty hand. Returns true on success, false if the chunk is not present. See also DigBlock() for the pickup-less version.\",\n\t\t\t},\n\t\t\tFastSetBlock =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the block at the specified coords, without waking up the simulators or replacing the block entities for the previous block type. Do not use if the block being replaced has a block entity tied to it! <b>OBSOLETE</b>, use the vector-based overload instead.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockCoords\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the block at the specified coords, without waking up the simulators or replacing the block entities for the previous block type. Do not use if the block being replaced has a block entity tied to it!\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tFindAndDoWithPlayer =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PlayerName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the given callback function for the player with the name best matching the name string provided.<br>This function is case-insensitive and will match partial names.<br>Returns false if player not found or there is ambiguity, true otherwise. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cPlayer|Player}})</pre>\",\n\t\t\t},\n\t\t\tForEachBlockEntityInChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each block entity in the chunk. Returns true if all block entities in the chunk have been processed (including when there are zero block entities), or false if the callback has aborted the enumeration by returning true. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBlockEntity|BlockEntity}})</pre> The callback should return false or no value to continue with the next block entity, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tForEachBrewingstandInChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each brewingstand in the chunk. Returns true if all brewingstands in the chunk have been processed (including when there are zero brewingstands), or false if the callback has aborted the enumeration by returning true. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cBrewingstandEntity|cBrewingstandEntity}})</pre> The callback should return false or no value to continue with the next brewingstand, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tForEachChestInChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each chest in the chunk. Returns true if all chests in the chunk have been processed (including when there are zero chests), or false if the callback has aborted the enumeration by returning true. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cChestEntity|ChestEntity}})</pre> The callback should return false or no value to continue with the next chest, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tForEachEntity =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each entity in the loaded world. Returns true if all the entities have been processed (including when there are zero entities), or false if the callback function has aborted the enumeration by returning true. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cEntity|Entity}})</pre> The callback should return false or no value to continue with the next entity, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tForEachEntityInBox =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Box\",\n\t\t\t\t\t\tType = \"cBoundingBox\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each entity in the specified bounding box. Returns true if all the entities have been processed (including when there are zero entities), or false if the callback function has aborted the enumeration by returning true. If any chunk within the bounding box is not valid, it is silently skipped without any notification. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cEntity|Entity}})</pre> The callback should return false or no value to continue with the next entity, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tForEachEntityInChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each entity in the specified chunk. Returns true if all the entities have been processed (including when there are zero entities), or false if the chunk is not loaded or the callback function has aborted the enumeration by returning true. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cEntity|Entity}})</pre> The callback should return false or no value to continue with the next entity, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tForEachFurnaceInChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each furnace in the chunk. Returns true if all furnaces in the chunk have been processed (including when there are zero furnaces), or false if the callback has aborted the enumeration by returning true. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cFurnaceEntity|FurnaceEntity}})</pre> The callback should return false or no value to continue with the next furnace, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tForEachLoadedChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each loaded chunk in the world. Returns true if all chunks have been processed, or false if the callback has aborted the enumeration by returning true. The CallbackFunction has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback(ChunkX, ChunkZ)</pre> The callback should return false or no value to continue with the next chunk, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tForEachPlayer =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CallbackFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Calls the specified callback for each player in the loaded world. Returns true if all the players have been processed (including when there are zero players), or false if the callback function has aborted the enumeration by returning true. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback({{cPlayer|Player}})</pre> The callback should return false or no value to continue with the next player, or true to abort the enumeration.\",\n\t\t\t},\n\t\t\tGenerateChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Queues the specified chunk in the chunk generator. Ignored if the chunk is already generated (use RegenerateChunk() to force chunk re-generation).\",\n\t\t\t},\n\t\t\tGetBiomeAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"eBiome\",\n\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the biome at the specified coords. Reads the biome from the chunk, if it is loaded, otherwise it uses the chunk generator to provide the biome value.\",\n\t\t\t},\n\t\t\tGetBlock =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block type of the block at the specified coords, or 0 if the appropriate chunk is not loaded. <b>OBSOLETE</b>, use the vector-based overload instead.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockCoords\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BLOCKTYPE\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block type of the block at the specified coords, or 0 if the appropriate chunk is not loaded.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tGetBlockBlockLight =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the amount of block light at the specified coords, or 0 if the appropriate chunk is not loaded. <b>OBSOLETE</b>, use the vector-based overload instead.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pos\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the amount of block light at the specified coords, or 0 if the appropriate chunk is not loaded.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tGetBlockInfo =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsBlockValid\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockSkyLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockBlockLight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the complete block info for the block at the specified coords. The first value specifies if the block is in a valid loaded chunk, the other values are valid only if BlockValid is true.\",\n\t\t\t},\n\t\t\tGetBlockMeta =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block metadata of the block at the specified coords, or 0 if the appropriate chunk is not loaded. <b>OBSOLETE</b>, use the vector-based overload instead.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockCoords\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Returns the block metadata of the block at the specified coords, or 0 if the appropriate chunk is not loaded.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tGetBlockSkyLight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block skylight of the block at the specified coords, or 0 if the appropriate chunk is not loaded.\",\n\t\t\t},\n\t\t\tGetBlockTypeMeta =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsBlockValid\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the block type and metadata for the block at the specified coords. The first value specifies if the block is in a valid loaded chunk, the other values are valid only if BlockValid is true.\",\n\t\t\t},\n\t\t\tGetDataPath =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the path to the root of the world data.\",\n\t\t\t},\n\t\t\tGetDefaultWeatherInterval =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Weather\",\n\t\t\t\t\t\tType = \"eWeather\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the default weather interval for the specific weather type. Returns -1 for any unknown weather.\",\n\t\t\t},\n\t\t\tGetDimension =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"eDimension\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the dimension of the world - dimOverworld, dimNether or dimEnd.\",\n\t\t\t},\n\t\t\tGetGameMode =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"eGameMode\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the gamemode of the world - gmSurvival, gmCreative or gmAdventure.\",\n\t\t\t},\n\t\t\tGetGeneratorQueueLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of chunks that are queued in the chunk generator.\",\n\t\t\t},\n\t\t\tGetHeight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"<b>DEPRECATED</b>, use TryGetHeight instead. Returns the maximum height of the particular block column in the world. If the chunk is not loaded, this function used to block until the chunk was loaded, leading to possible deadlock. Now it returns 0 instead.\",\n\t\t\t},\n\t\t\tGetIniFileName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the world.ini file that the world uses to store the information.\",\n\t\t\t},\n\t\t\tGetLightingQueueLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of chunks in the lighting thread's queue.\",\n\t\t\t},\n\t\t\tGetLinkedEndWorldName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the end world this world is linked to.\",\n\t\t\t},\n\t\t\tGetLinkedNetherWorldName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the Netherworld linked to this world.\",\n\t\t\t},\n\t\t\tGetLinkedOverworldName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the world this world is linked to.\",\n\t\t\t},\n\t\t\tGetMapManager =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cMapManager\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the {{cMapManager|MapManager}} object used by this world.\",\n\t\t\t},\n\t\t\tGetMaxCactusHeight =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the configured maximum height to which cacti will grow naturally.\",\n\t\t\t},\n\t\t\tGetMaxNetherPortalHeight =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum height for a nether portal\",\n\t\t\t},\n\t\t\tGetMaxNetherPortalWidth =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum width for a nether portal\",\n\t\t\t},\n\t\t\tGetMaxSugarcaneHeight =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the configured maximum height to which sugarcane will grow naturally.\",\n\t\t\t},\n\t\t\tGetMaxViewDistance =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the maximum viewdistance that players can see in this world. The view distance is the amount of chunks around the player that the player can see.\",\n\t\t\t},\n\t\t\tGetMinNetherPortalHeight =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the minimum height for a nether portal\",\n\t\t\t},\n\t\t\tGetMinNetherPortalWidth =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the minimum width for a nether portal\",\n\t\t\t},\n\t\t\tGetName =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the name of the world, as specified in the settings.ini file.\",\n\t\t\t},\n\t\t\tGetNumChunks =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of chunks currently loaded.\",\n\t\t\t},\n\t\t\tGetNumUnusedDirtyChunks =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of unused dirty chunks. That's the number of chunks that we can save and then unload.\",\n\t\t\t},\n\t\t\tGetScoreBoard =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"cScoreboard\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the {{cScoreboard|Scoreboard}} object used by this world. \",\n\t\t\t},\n\t\t\tGetSeed =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the seed of the world.\",\n\t\t\t},\n\t\t\tGetSignLines =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsValid\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line1\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line2\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line3\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line4\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true and the lines of a sign at the specified coords, or false if there is no sign at the coords.\",\n\t\t\t},\n\t\t\tGetSpawnX =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the X coord of the default spawn\",\n\t\t\t},\n\t\t\tGetSpawnY =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the Y coord of the default spawn\",\n\t\t\t},\n\t\t\tGetSpawnZ =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the Z coord of the default spawn\",\n\t\t\t},\n\t\t\tGetSpawnPos =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"Vector3d\"\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the default spawn position\",\n\t\t\t},\n\t\t\tGetStorageLoadQueueLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of chunks queued up for loading\",\n\t\t\t},\n\t\t\tGetStorageSaveQueueLength =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of chunks queued up for saving\",\n\t\t\t},\n\t\t\tGetTicksUntilWeatherChange =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of ticks that will pass before the weather is changed\",\n\t\t\t},\n\t\t\tGetTimeOfDay =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the number of ticks that have passed from the sunrise, 0 .. 24000.\",\n\t\t\t},\n\t\t\tGetTNTShrapnelLevel =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ShrapnelLevel\",\n\t\t\t\t\t\tType = \"eShrapnelLevel\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the shrapnel level, representing the block types that are propelled outwards following an explosion. Based on this value and a random picker, blocks are selectively converted to physics entities (FallingSand) and flung outwards.\",\n\t\t\t},\n\t\t\tGetWeather =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"eWeather\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the current weather in the world (wSunny, wRain, wStorm). To check for weather, use IsWeatherXXX() functions instead.\",\n\t\t\t},\n\t\t\tGetWorldAge =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns the total age of the world, in ticks. The age always grows, cannot be set by plugins and is unrelated to TimeOfDay.\",\n\t\t\t},\n\t\t\tGrowPlantAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NumStages\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Grows the plant at the specified block by the specified number of stages. Returns the number of stages actually grown. Returns zero for non-growable blocks.\",\n\t\t\t},\n\t\t\tGrowRipePlant =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Grows the plant at the specified coords to maturity. Returns true if the plant was grown, false if not.\",\n\t\t\t},\n\t\t\tGrowTree =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Grows a tree based at the specified coords. If there is a sapling there, grows the tree based on that sapling, otherwise chooses a tree image based on the biome. Returns true if the tree was grown, false if not (invalid chunk, insufficient space)\",\n\t\t\t},\n\t\t\tGrowTreeByBiome =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Grows a tree based at the specified coords. The tree type is picked from types available for the biome at those coords. Returns true if the tree was grown, false if not (invalid chunk, insufficient space)\",\n\t\t\t},\n\t\t\tGrowTreeFromSapling =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Grows a tree based at the specified coords. The tree type is determined from the sapling meta. If the sapling is part of a 2x2 sapling area, grows a large tree. Returns true if the tree was grown, false if not (invalid chunk, insufficient space)\",\n\t\t\t},\n\t\t\tIsBlockDirectlyWatered =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the specified block has a water block right next to it (on the X/Z axes)\",\n\t\t\t},\n\t\t\tIsDaylightCycleEnabled =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the daylight cycle is enabled.\",\n\t\t\t},\n\t\t\tIsDeepSnowEnabled =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns whether the configuration has DeepSnow enabled.\",\n\t\t\t},\n\t\t\tIsFarmlandTramplingEnabled =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if farmland trampling is enabled.\",\n\t\t\t},\n\t\t\tIsGameModeAdventure =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the current gamemode is gmAdventure.\",\n\t\t\t},\n\t\t\tIsGameModeCreative =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the current gamemode is gmCreative.\",\n\t\t\t},\n\t\t\tIsGameModeSpectator =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the current gamemode is gmSpectator.\",\n\t\t\t},\n\t\t\tIsGameModeSurvival =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the current gamemode is gmSurvival.\",\n\t\t\t},\n\t\t\tIsPVPEnabled =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns whether PVP is enabled in the world settings.\",\n\t\t\t},\n\t\t\tIsSavingEnabled =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns whether or not saving chunk data is enabled. If disabled, the world will keep dirty chunks in memory forever, and will simply regenerate non-dirty chunks that are unloaded.\",\n\t\t\t},\n\t\t\tIsSlimeChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns whether slimes can spawn in the chunk.\",\n\t\t\t},\n\t\t\tIsTrapdoorOpen =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns false if there is no trapdoor there or if the block isn't a trapdoor or if the chunk wasn't loaded. Returns true if trapdoor is open.\",\n\t\t\t},\n\t\t\tIsWeatherRain =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the current weather is rainy.\",\n\t\t\t},\n\t\t\tIsWeatherRainAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if it is rainy at the specified location. This takes into account biomes.\",\n\t\t\t},\n\t\t\tIsWeatherStorm =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the current weather is stormy.\",\n\t\t\t},\n\t\t\tIsWeatherStormAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if it is stormy at the specified location. This takes into account biomes.\",\n\t\t\t},\n\t\t\tIsWeatherSunny =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the current weather is sunny.\",\n\t\t\t},\n\t\t\tIsWeatherSunnyAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if it is sunny at the specified location. This takes into account biomes.\",\n\t\t\t},\n\t\t\tIsWeatherWet =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the world currently has any precipitation - rain, storm or snow.\",\n\t\t\t},\n\t\t\tIsWeatherWetAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if it is raining or storming at the specified location. This takes into account biomes.\",\n\t\t\t},\n\t\t\tIsWeatherWetAtXYZ =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Pos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the specified location has wet weather (rain or storm), using the same logic as IsWeatherWetAt, except that any rain-blocking blocks above the specified position will block the precipitation and this function will return false. Note if the chunk is unloaded then the weather state for the world will be returned.\",\n\t\t\t},\n\t\t\tPickupsFromBlock =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Digger\",\n\t\t\t\t\t\tType = \"cEntity\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Tool\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Items\",\n\t\t\t\t\t\tType = \"cItems\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns all the pickups that would result if the Digger dug up the block at BlockPos using Tool. Digger is usually a {{cPlayer}}, but can be nil for natural causes. Tool is usually the equipped {{cItem|item}}, can be nil for empty hand. Returns an empty {{cItems}} object if the chunk is not present.\"\n\t\t\t},\n\t\t\tPrepareChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Callback\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Queues the chunk for preparing - making sure that it's generated and lit. It is legal to call with no callback. The callback function has the following signature: <pre class=\\\"prettyprint lang-lua\\\">function Callback(ChunkX, ChunkZ)</pre>\",\n\t\t\t},\n\t\t\tQueueBlockForTick =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"TicksToWait\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Queues the specified block to be ticked after the specified number of gameticks.\",\n\t\t\t},\n\t\t\tQueueSaveAllChunks =\n\t\t\t{\n\t\t\t\tNotes = \"Queues all chunks to be saved in the world storage thread\",\n\t\t\t},\n\t\t\tQueueTask =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"TaskFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = [[\n\t\t\t\t\tQueues the specified function to be executed in the tick thread. This is the primary means\n\t\t\t\t\tof interaction with a cWorld from the WebAdmin page handlers (see {{WebWorldThreads}}). The function\n\t\t\t\t\tsignature is <pre class=\\\"pretty-print lang-lua\\\">function({{cWorld|World}})</pre>All return values\n\t\t\t\t\tfrom the function are ignored. Note that this function is actually called *after* the QueueTask()\n\t\t\t\t\tfunction returns. Note that it is unsafe to store references to Cuberite objects, such as entities,\n\t\t\t\t\tacross from the caller to the task handler function; store the EntityID instead.\n\t\t\t\t]],\n\t\t\t},\n\t\t\tQueueUnloadUnusedChunks =\n\t\t\t{\n\t\t\t\tNotes = \"Queues a cTask that unloads chunks that are no longer needed and are saved.\",\n\t\t\t},\n\t\t\tRegenerateChunk =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Queues the specified chunk to be re-generated, overwriting the current data. To queue a chunk for generating only if it doesn't exist, use the GenerateChunk() instead.\",\n\t\t\t},\n\t\t\tScheduleTask =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"DelayTicks\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"TaskFunction\",\n\t\t\t\t\t\tType = \"function\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Queues the specified function to be executed in the world's tick thread after a the specified number of ticks. This enables operations to be queued for execution in the future. The function signature is <pre class=\\\"pretty-print lang-lua\\\">function({{cWorld|World}})</pre>All return values from the function are ignored. Note that it is unsafe to store references to Cuberite objects, such as entities, across from the caller to the task handler function; store the EntityID instead.\",\n\t\t\t},\n\t\t\tSendBlockTo =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sends the block at the specified coords to the specified player's client, as an UpdateBlock packet.\",\n\t\t\t},\n\t\t\tSetAreaBiome =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MinZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"MaxZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the biome in the rectangular area specified. Returns true if successful, false if any of the chunks were unloaded.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Cuboid\",\n\t\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the biome in the cuboid specified. Returns true if successful, false if any of the chunks were unloaded. The cuboid needn't be sorted.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSetBiomeAt =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Biome\",\n\t\t\t\t\t\tType = \"EMCSBiome\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the biome at the specified block coords. Returns true if successful, false otherwise.\",\n\t\t\t},\n\t\t\tSetBlock =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the block at the specified coords, replaces the block entities for the previous block type, creates a new block entity for the new block, if appropriate, and wakes up the simulators. This is the preferred way to set blocks, as opposed to FastSetBlock(), which is only to be used under special circumstances.\",\n\t\t\t},\n\t\t\tSetBlockMeta =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the meta for the block at the specified coords. Any call to SetBlockMeta will not generate a simulator update (water, lava, redstone), consider using SetBlock instead.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockCoords\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Sets the meta for the block at the specified coords. Any call to SetBlockMeta will not generate a simulator update (water, lava, redstone), consider using SetBlock instead.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSetChunkAlwaysTicked =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ChunkZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsAlwaysTicked\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the chunk to always be ticked and loaded even when it doesn't contain any clients. IsAlwaysTicked set to true turns forced ticking on, set to false turns it off. Every call with 'true' should be paired with a later call with 'false', otherwise the ticking won't stop. Multiple actions can request ticking independently, the ticking will continue until the last call with 'false'.\"\n\t\t\t},\n\t\t\tSetCommandBlockCommand =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Command\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the command to be executed in a command block at the specified coordinates. Returns if command was changed.\",\n\t\t\t},\n\t\t\tSetCommandBlocksEnabled =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"AreEnabled\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets whether command blocks should be enabled on the (entire) server.\",\n\t\t\t},\n\t\t\tSetDaylightCycleEnabled =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsEnabled\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Starts or stops the daylight cycle.\",\n\t\t\t},\n\t\t\tSetLinkedEndWorldName =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"WorldName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the name of the world that the end portal should link to.\",\n\t\t\t},\n\t\t\tSetLinkedNetherWorldName =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"WorldName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the name of the world that the nether portal should link to.\",\n\t\t\t},\n\t\t\tSetLinkedOverworldName =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"WorldName\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the name of the world that the nether portal should link to?\",\n\t\t\t},\n\t\t\tSetMaxNetherPortalHeight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Height\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the maximum height for a nether portal\",\n\t\t\t},\n\t\t\tSetMaxNetherPortalWidth =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Width\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the maximum width for a nether portal\",\n\t\t\t},\n\t\t\tSetMaxViewDistance =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MaxViewDistance\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the maximum viewdistance of the players in the world. This maximum takes precedence over each player's ViewDistance setting.\",\n\t\t\t},\n\t\t\tSetMinNetherPortalHeight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Height\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the minimum height for a nether portal\",\n\t\t\t},\n\t\t\tSetMinNetherPortalWidth =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Width\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the minimum width for a nether portal\",\n\t\t\t},\n\t\t\tSetNextBlockTick =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"DEPRECATED, use SetNextBlockToTick() instead.\",\n\t\t\t},\n\t\t\tSetNextBlockToTick =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Requests that the specified block be ticked at the start of the next world tick. Only one block per chunk can be queued this way; a second call to the same chunk overwrites the previous call.\",\n\t\t\t},\n\t\t\tSetSavingEnabled =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SavingEnabled\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets whether saving chunk data is enabled. If disabled, dirty chunks will stay in memory forever, which may cause performance and stability issues.\",\n\t\t\t},\n\t\t\tSetShouldUseChatPrefixes =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ShouldUseChatPrefixes\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets whether coloured chat prefixes such as [INFO] is used with the SendMessageXXX() or BroadcastChatXXX(), or simply the entire message is coloured in the respective colour.\",\n\t\t\t},\n\t\t\tSetSignLines =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line1\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line2\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line3\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line4\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the sign text at the specified coords. The sign-updating hooks are called for the change. The Player parameter is used to indicate the player from whom the change has come, it may be nil.\",\n\t\t\t},\n\t\t\tSetSpawn =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the default spawn at the specified coords. Returns false if the new spawn couldn't be stored in the INI file.\",\n\t\t\t},\n\t\t\tSetTicksUntilWeatherChange =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"NumTicks\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the number of ticks after which the weather will be changed.\",\n\t\t\t},\n\t\t\tSetTimeOfDay =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"TimeOfDayTicks\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the time of day, expressed as number of ticks past sunrise, in the range 0 .. 24000.\",\n\t\t\t},\n\t\t\tSetTNTShrapnelLevel =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ShrapnelLevel\",\n\t\t\t\t\t\tType = \"eShrapnelLevel\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the Shrapnel level of the world.\",\n\t\t\t},\n\t\t\tSetTrapdoorOpen =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsOpen\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Opens or closes a trapdoor at the specific coordinates. Returns true on success, false if there is no trapdoor or it's already in the requested state.\",\n\t\t\t},\n\t\t\tSetWeather =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Weather\",\n\t\t\t\t\t\tType = \"eWeather\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Sets the current weather (wSunny, wRain, wStorm) and resets the TicksUntilWeatherChange to the default value for the new weather. The normal weather-changing hooks are called for the change.\",\n\t\t\t},\n\t\t\tShouldBroadcastAchievementMessages =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the server should broadcast achievement messages in this world.\",\n\t\t\t},\n\t\t\tShouldBroadcastDeathMessages =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the server should broadcast death messages in this world.\",\n\t\t\t},\n\t\t\tShouldLavaSpawnFire =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true if the world is configured to spawn fires near lava (world.ini: [Physics].ShouldLavaSpawnFire value)\",\n\t\t\t},\n\t\t\tShouldUseChatPrefixes =\n\t\t\t{\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns whether coloured chat prefixes are prepended to chat messages or the entire message is simply coloured.\",\n\t\t\t},\n\t\t\tSpawnBoat =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"cBoat#eMaterial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spawns a {{cBoat|boat}} at the specific coordinates. Returns the EntityID of the new boat, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no boat was created.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Material\",\n\t\t\t\t\t\t\tType = \"cBoat#eMaterial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spawns a {{cBoat|boat}} at the specific coordinates. Returns the EntityID of the new boat, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no boat was created. (DEPRECATED, use vector-parametered version)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSpawnEnderCrystal =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Pos\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"ShowBottom\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Spawns an {{cEnderCrystal|ender crystal}} at the specified coords. Returns the EntityID of the new ender crystal, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no ender crystal was created.\",\n\t\t\t},\n\t\t\tSpawnExperienceOrb =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Reward\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Spawns an {{cExpOrb|experience orb}} at the specified coords, with the given reward. Returns the EntityID of the new experience orb, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no experience orb was created.\",\n\t\t\t},\n\t\t\tSpawnFallingBlock =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"OBSOLETE, use the Vector3-based overloads instead. Spawns a {{cFallingBlock|Falling Block}} entity at the specified coords with the given block type/meta. Returns the EntityID of the new falling block, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no falling block was created.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockPos\",\n\t\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spawns a {{cFallingBlock|Falling Block}} entity in the middle of the specified block, with the given block type/meta. Returns the EntityID of the new falling block, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no falling block was created.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pos\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockType\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"BlockMeta\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spawns a {{cFallingBlock|Falling Block}} entity at exactly the specified coords, with the given block type/meta. Returns the EntityID of the new falling block, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no falling block was created.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSpawnItemPickup =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PosX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PosY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"PosZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SpeedX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\tNotes = \"Speed along X coordinate to spawn with. Default is 0.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SpeedY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\tNotes = \"Speed along Y coordinate to spawn with. Default is 0.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"SpeedZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\tNotes = \"Speed along Z coordinate to spawn with. Default is 0.\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"LifetimeTicks\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\tNotes = \"Length of the pickups lifetime, in ticks. Default 5 minutes (6000 ticks)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"CanCombine\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\tNotes = \"Whether this pickup is allowed to combine with other similar pickups.\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tNotes = \"Creates a single pickup entity of the given item at the given position with the given speed, and returns the entities unique ID.\"\n\t\t\t},\n\t\t\tSpawnItemPickups =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pickups\",\n\t\t\t\t\t\t\tType = \"cItems\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FlyAwaySpeed\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsPlayerCreated\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spawns the specified pickups at the position specified. The FlyAwaySpeed is a coefficient (default: 1) used to initialize the random speed in which the pickups fly away from the spawn position. The IsPlayerCreated parameter (default: false) is used to initialize the created {{cPickup}} object's IsPlayerCreated value.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Pickups\",\n\t\t\t\t\t\t\tType = \"cItems\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SpeedX\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SpeedY\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"SpeedZ\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"IsPlayerCreated\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spawns the specified pickups at the position specified. All the pickups fly away from the spawn position using the specified speed. The IsPlayerCreated parameter (default: false) is used to initialize the created {{cPickup}} object's IsPlayerCreated value.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSpawnMinecart =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MinecartType\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Item\",\n\t\t\t\t\t\tType = \"cItem\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockHeight\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Spawns a minecart at the specific coordinates. MinecartType is the item type of the minecart. If the minecart is an empty minecart then the given Item (default: empty) is the block to be displayed inside the minecart, and BlockHeight (default: 1) is the relative distance of the block from the minecart. Returns the EntityID of the new minecart, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no minecart was created.\",\n\t\t\t},\n\t\t\tSpawnMob =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"MonsterType\",\n\t\t\t\t\t\tType = \"eMonsterType\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsBaby\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Spawns the specified type of mob at the specified coords. If the Baby parameter is true, the mob will be a baby. Returns the EntityID of the created entity, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} on failure.\",\n\t\t\t},\n\t\t\tSpawnPrimedTNT =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FuseTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"InitialVelocityCoeff\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"ShouldPlayFuseSound\",\n\t\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spawns a {{cTNTEntity|primed TNT entity}} at the specified coords, with the given fuse ticks. The entity gets a random speed multiplied by the InitialVelocityCoeff, 1 being the default value. Returns the EntityID of the new spawned primed tnt, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no primed tnt was created.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParams =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"X\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Y\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"Z\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"FuseTicks\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"InitialVelocityCoeff\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tReturns =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tNotes = \"Spawns a {{cTNTEntity|primed TNT entity}} at the specified coords, with the given fuse ticks. The entity gets a random speed multiplied by the InitialVelocityCoeff, 1 being the default value. Returns the EntityID of the new spawned primed tnt, or {{cEntity#INVALID_ID|cEntity#INVALID_ID}} if no primed tnt was created. (DEPRECATED, use vector-parametered version)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSpawnSplitExperienceOrbs =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Position\",\n\t\t\t\t\t\tType = \"Vector3d\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Reward\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"EntityID\",\n\t\t\t\t\t\tType = \"table\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Spawns experience orbs of the specified total value at the given location. The orbs' values are split according to regular Minecraft rules. Returns an array-table of UniqueID of all the orbs.\",\n\t\t\t},\n\t\t\tTryGetHeight =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"IsValid\",\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Height\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Returns true and height of the highest non-air block if the chunk is loaded, or false otherwise.\",\n\t\t\t},\n\t\t\tUpdateSign =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line1\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line2\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line3\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Line4\",\n\t\t\t\t\t\tType = \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t\tIsOptional = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"(<b>DEPRECATED</b>) Please use SetSignLines().\",\n\t\t\t},\n\t\t\tUseBlockEntity =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Player\",\n\t\t\t\t\t\tType = \"cPlayer\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockX\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockY\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"BlockZ\",\n\t\t\t\t\t\tType = \"number\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Makes the specified Player use the block entity at the specified coords (open chest UI, etc.) If the cords are in an unloaded chunk or there's no block entity, ignores the call.\",\n\t\t\t},\n\t\t\tVillagersShouldHarvestCrops =\n\t\t\t{\n\t\t\t\tNotes = \"Returns true if villagers can harvest crops.\",\n\t\t\t\tReturns =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tType = \"boolean\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tWakeUpSimulators =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Block\",\n\t\t\t\t\t\tType = \"Vector3i\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Wakes up the simulators for the specified block.\",\n\t\t\t},\n\t\t\tWakeUpSimulatorsInArea =\n\t\t\t{\n\t\t\t\tParams =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tName = \"Area\",\n\t\t\t\t\t\tType = \"cCuboid\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tNotes = \"Wakes up the simulators for all the blocks in the specified area (edges inclusive).\",\n\t\t\t},\n\t\t},\n\t\tAdditionalInfo =\n\t\t{\n\t\t\t{\n\t\t\t\tHeader = \"Using callbacks\",\n\t\t\t\tContents = [[\n\t\t\t\t\tTo avoid problems with stale objects, the cWorld class will not let plugins get a direct pointer\n\t\t\t\t\tto an {{cEntity|entity}}, {{cBlockEntity|block entity}} or a {{cPlayer|player}}. Such an object\n\t\t\t\t\tcould be modified or even destroyed by another thread while the plugin holds it, so it would be\n\t\t\t\t\trather unsafe.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\tInstead, the cWorld provides access to these objects using callbacks. The plugin provides a\n\t\t\t\t\tfunction that is called and receives the object as a parameter; cWorld guarantees that while\n\t\t\t\t\tthe callback is executing, the object will stay valid. If a plugin needs to \"remember\" the\n\t\t\t\t\tobject outside of the callback, it needs to store the entity ID, blockentity coords or player\n\t\t\t\t\tname.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\tThe following code examples show how to use the callbacks</p>\n\t\t\t\t\t<p>\n\t\t\t\t\tThis code teleports player Player to another player named ToName in the same world:\n<pre class=\"prettyprint lang-lua\">\n-- Player is a cPlayer object\n-- ToName is a string\n-- World is a cWorld object\nWorld:ForEachPlayer(\n\tfunction (a_OtherPlayer)\n\tif (a_OtherPlayer:GetName() == ToName) then\n\t\tPlayer:TeleportToEntity(a_OtherPlayer);\n\tend\n);\n</pre></p>\n<p>\nThis code fills each furnace in the chunk with 64 coals:\n<pre class=\"prettyprint lang-lua\">\n-- Player is a cPlayer object\n-- World is a cWorld object\nWorld:ForEachFurnaceInChunk(Player:GetChunkX(), Player:GetChunkZ(),\n\tfunction (a_Furnace)\n\t\ta_Furnace:SetFuelSlot(cItem(E_ITEM_COAL, 64));\n\tend\n);\n</pre></p>\n<p>\nThis code teleports all spiders up by 100 blocks:\n<pre class=\"prettyprint lang-lua\">\n-- World is a cWorld object\nWorld:ForEachEntity(\n\tfunction (a_Entity)\n\t\tif not(a_Entity:IsMob()) then\n\t\t\treturn;\n\t\tend\n\n\t\t-- Now that we know the entity represents a mob, we can use cMonster functions:\n\t\tif (a_Entity:GetMobType() == mtSpider) then\n\t\t\ta_Entity:TeleportToCoords(a_Entity:GetPosX(), a_Entity:GetPosY() + 100, a_Entity:GetPosZ());\n\t\tend\n\tend\n);\n</pre></p>\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnBlockSpread.lua",
    "content": "return\n{\n\tHOOK_BLOCK_SPREAD =\n\t{\n\t\tCalledWhen = \"Called when a block spreads based on world conditions\",\n\t\tDefaultFnName = \"OnBlockSpread\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a block spreads.</p>\n\t\t\t<p>\n\t\t\tThe spread carries with it the type of its source - whether it's a block spreads.\n\t\t\tIt also carries the identification of the actual source. The exact type of the identification\n\t\t\tdepends on the source kind:\n\t\t\t<table>\n\t\t\t<tr><th>Source</th><th>Notes</th></tr>\n\t\t\t<tr><td>ssFireSpread</td><td>Fire spreading</td></tr>\n\t\t\t<tr><td>ssGrassSpread</td><td>Grass spreading</td></tr>\n\t\t\t<tr><td>ssMushroomSpread</td><td>Mushroom spreading</td></tr>\n\t\t\t<tr><td>ssMycelSpread</td><td>Mycel spreading</td></tr>\n\t\t\t<tr><td>ssVineSpread</td><td>Vine spreading</td></tr>\n\t\t\t</table></p>\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world in which the block resides\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the block\" },\n\t\t\t{ Name = \"Source\", Type = \"eSpreadSource\", Notes = \"Source of the spread. See the table above.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called, and finally\n\t\t\tCuberite will process the spread. If the function\n\t\t\treturns true, no other callback is called for this event and the spread will not occur.\n\t\t]],\n\t\tExamples =\n\t\t{\n\t\t\t{\n\t\t\t\tTitle = \"Stop fire spreading\",\n\t\t\t\tDesc = \"Stops fire from spreading, but does not remove any player-placed fire.\",\n\t\t\t\tCode = [[\n\t\t\t\t\tfunction OnBlockSpread(World, BlockX, Blocky, BlockZ, source)\n\t\t\t\t\t\tif (source == ssFireSpread) then\n\t\t\t\t\t\t\t-- Return true to block the fire spreading.\n\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\tend\n\t\t\t\t\t\t-- We don't care about any other events, let them continue.\n\t\t\t\t\t\treturn false\n\t\t\t\t\tend\n\n\t\t\t\t\t-- Add the callback.\n\t\t\t\t\tcPluginManager:AddHook(cPluginManager.HOOK_BLOCK_SPREAD, OnBlockSpread);\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t},  -- HOOK_BLOCK_SPREAD\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnBlockToPickups.lua",
    "content": "return\n{\n\tHOOK_BLOCK_TO_PICKUPS =\n\t{\n\t\tCalledWhen = \"A block is about to be dug ({{cPlayer|player}}, {{cEntity|entity}} or natural reason), plugins may override what pickups that will produce.\",\n\t\tDefaultFnName = \"OnBlockToPickups\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis callback gets called whenever a block is about to be dug. This includes {{cPlayer|players}}\n\t\t\tdigging blocks, entities causing blocks to disappear ({{cTNTEntity|TNT}}, Endermen) and natural\n\t\t\tcauses (water washing away a block). Plugins may override the amount and kinds of pickups this\n\t\t\taction produces.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world in which the block resides\" },\n\t\t\t{ Name = \"Digger\", Type = \"{{cEntity}} descendant\", Notes = \"The entity causing the digging. May be a {{cPlayer}}, {{cTNTEntity}} or even nil (natural causes)\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the block\" },\n\t\t\t{ Name = \"BlockType\", Type = \"BLOCKTYPE\", Notes = \"Block type of the block\" },\n\t\t\t{ Name = \"BlockMeta\", Type = \"NIBBLETYPE\", Notes = \"Block meta of the block\" },\n\t\t\t{ Name = \"Pickups\", Type = \"{{cItems}}\", Notes = \"Items that will be spawned as pickups\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next callback in the hook chain will be called. If\n\t\t\tthe function returns true, no other callbacks in the chain will be called.</p>\n\t\t\t<p>\n\t\t\tEither way, the server will then spawn pickups specified in the Pickups parameter, so to disable\n\t\t\tpickups, you need to Clear the object first, then return true.\n\t\t]],\n\t\tCodeExamples =\n\t\t{\n\t\t\t{\n\t\t\t\tTitle = \"Modify pickups\",\n\t\t\t\tDesc = \"This example callback function makes tall grass drop diamonds when digged by natural causes (washed away by water).\",\n\t\t\t\tCode = [[\nfunction OnBlockToPickups(a_World, a_Digger, a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_Pickups)\n\tif (a_Digger ~= nil) then\n\t\t-- Not a natural cause\n\t\treturn false;\n\tend\n\tif (a_BlockType ~= E_BLOCK_TALL_GRASS) then\n\t\t-- Not a tall grass being washed away\n\t\treturn false;\n\tend\n\n\t-- Remove all pickups suggested by Cuberite:\n\ta_Pickups:Clear();\n\n\t-- Drop a diamond:\n\ta_Pickups:Add(cItem(E_ITEM_DIAMOND));\n\treturn true;\nend;\n\t\t\t\t]],\n\t\t\t},\n\t\t} ,  -- CodeExamples\n\t},  -- HOOK_BLOCK_TO_PICKUPS\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnBrewingCompleted.lua",
    "content": "return\n{\n\tHOOK_BREWING_COMPLETED =\n\t{\n\t\tCalledWhen = \"A brewing process is completed.\",\n\t\tDefaultFnName = \"OnBrewingCompleted\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called whenever a {{cBrewingstandEntity|brewing stand}} has completed the brewing process.\n\t\t\tSee also the {{OnBrewingCompleting|HOOK_BREWING_COMPLETING}} hook for a similar hook, is called when a\n\t\t\tbrewing process is completing.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World where the brewing stand resides.\" },\n\t\t\t{ Name = \"Brewingstand\", Type = \"{{cBrewingstandEntity}}\", Notes = \"The brewing stand that completed the brewing process.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, Cuberite calls other plugins with this event. If the\n\t\t\tfunction returns true, no other plugin is called for this event.</p>\n\t\t]],\n\t},  -- HOOK_BREWING_COMPLETED\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnBrewingCompleting.lua",
    "content": "return\n{\n\tHOOK_BREWING_COMPLETING =\n\t{\n\t\tCalledWhen = \"A brewing process is completing.\",\n\t\tDefaultFnName = \"OnBrewingCompleting\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called whenever a {{cBrewingstandEntity|brewing stand}} is completing the brewing process. Plugins may\n\t\t\trefuse the completing of the brewing process.<p>\n\t\t\tSee also the {{OnBrewingCompleted|HOOK_BREWING_COMPLETED}} hook for a similar hook, is called after the\n\t\t\tbrewing process has been completed.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World where the brewing stand resides.\" },\n\t\t\t{ Name = \"Brewingstand\", Type = \"{{cBrewingstandEntity}}\", Notes = \"The brewing stand that completes the brewing process.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, Cuberite calls other plugins with this event. If the function returns true,\n\t\t\tno other plugin's callback is called and the brewing process is canceled.\n\t\t\t<p>\n\t\t]],\n\t},  -- HOOK_BREWING_COMPLETING\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnChat.lua",
    "content": "return\n{\n\tHOOK_CHAT =\n\t{\n\t\tCalledWhen = \"Player sends a chat message\",\n\t\tDefaultFnName = \"OnChat\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tA plugin may implement an OnChat() function and register it as a Hook to process chat messages from\n\t\t\tthe players. The function is then called for every in-game message sent from any player. Note that\n\t\t\tregistered in-game commands are not sent through this hook. Use the\n\t\t\t{{OnExecuteCommand|HOOK_EXECUTE_COMMAND}} to intercept registered in-game commands.\n\t\t]],\n\t\tParams = {\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who sent the message\" },\n\t\t\t{ Name = \"Message\", Type = \"string\", Notes = \"The message\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tThe plugin may return 2 values. The first is a boolean specifying whether the hook handling is to be\n\t\t\tstopped or not. If it is false, the message is broadcast to all players in the world. If it is true,\n\t\t\tno message is broadcast and no further action is taken.</p>\n\t\t\t<p>\n\t\t\tThe second value is specifies the message to broadcast. This way, plugins may modify the message. If\n\t\t\tthe second value is not provided, the original message is used.\n\t\t]],\n\t},  -- HOOK_CHAT\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnChunkAvailable.lua",
    "content": "return\n{\n\tHOOK_CHUNK_AVAILABLE =\n\t{\n\t\tCalledWhen = \"A chunk has just been added to world, either generated or loaded. \",\n\t\tDefaultFnName = \"OnChunkAvailable\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after a chunk is either generated or loaded from the disk. The chunk is\n\t\t\talready available for manipulation using the {{cWorld}} API. This is a notification-only callback,\n\t\t\tthere is no behavior that plugins could override.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world to which the chunk belongs\" },\n\t\t\t{ Name = \"ChunkX\", Type = \"number\", Notes = \"X-coord of the chunk\" },\n\t\t\t{ Name = \"ChunkZ\", Type = \"number\", Notes = \"Z-coord of the chunk\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event.\n\t\t]],\n\t},  -- HOOK_CHUNK_AVAILABLE\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnChunkGenerated.lua",
    "content": "return\n{\n\tHOOK_CHUNK_GENERATED =\n\t{\n\t\tCalledWhen = \"After a chunk was generated. Notification only.\",\n\t\tDefaultFnName = \"OnChunkGenerated\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when world generator finished its work on a chunk. The chunk data has already\n\t\t\tbeen generated and is about to be stored in the {{cWorld|world}}. A plugin may provide some\n\t\t\tlast-minute finishing touches to the generated data. Note that the chunk is not yet stored in the\n\t\t\tworld, so regular {{cWorld}} block API will not work! Instead, use the {{cChunkDesc}} object\n\t\t\treceived as the parameter.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnChunkGenerating|HOOK_CHUNK_GENERATING}} hook.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world to which the chunk will be added\" },\n\t\t\t{ Name = \"ChunkX\", Type = \"number\", Notes = \"X-coord of the chunk\" },\n\t\t\t{ Name = \"ChunkZ\", Type = \"number\", Notes = \"Z-coord of the chunk\" },\n\t\t\t{ Name = \"ChunkDesc\", Type = \"{{cChunkDesc}}\", Notes = \"Generated chunk data. Plugins may still modify the chunk data contained.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the plugin returns false or no value, Cuberite will call other plugins' callbacks for this event.\n\t\t\tIf a plugin returns true, no other callback is called for this event.</p>\n\t\t\t<p>\n\t\t\tIn either case, Cuberite will then store the data from ChunkDesc as the chunk's contents in the world.\n\t\t]],\n\t\tCodeExamples =\n\t\t{\n\t\t\t{\n\t\t\t\tTitle = \"Generate emerald ore\",\n\t\t\t\tDesc = \"This example callback function generates one block of emerald ore in each chunk, under the condition that the randomly chosen location is in an ExtremeHills biome.\",\n\t\t\t\tCode = [[\nfunction OnChunkGenerated(a_World, a_ChunkX, a_ChunkZ, a_ChunkDesc)\n\t-- Generate a psaudorandom value that is always the same for the same X/Z pair, but is otherwise random enough:\n\t-- This is actually similar to how Cuberite does its noise functions\n\tlocal PseudoRandom = (a_ChunkX * 57 + a_ChunkZ) * 57 + 19785486\n\tPseudoRandom = PseudoRandom * 8192 + PseudoRandom;\n\tPseudoRandom = ((PseudoRandom * (PseudoRandom * PseudoRandom * 15731 + 789221) + 1376312589) % 0x7fffffff;\n\tPseudoRandom = PseudoRandom / 7;\n\n\t-- Based on the PseudoRandom value, choose a location for the ore:\n\tlocal OreX = PseudoRandom % 16;\n\tlocal OreY = 2 + ((PseudoRandom / 16) % 20);\n\tlocal OreZ = (PseudoRandom / 320) % 16;\n\n\t-- Check if the location is in ExtremeHills:\n\tif (a_ChunkDesc:GetBiome(OreX, OreZ) ~= biExtremeHills) then\n\t\treturn false;\n\tend\n\n\t-- Only replace allowed blocks with the ore:\n\tlocal CurrBlock = a_ChunDesc:GetBlockType(OreX, OreY, OreZ);\n\tif (\n\t\t(CurrBlock == E_BLOCK_STONE) or\n\t\t(CurrBlock == E_BLOCK_DIRT) or\n\t\t(CurrBlock == E_BLOCK_GRAVEL)\n\t) then\n\t\ta_ChunkDesc:SetBlockTypeMeta(OreX, OreY, OreZ, E_BLOCK_EMERALD_ORE, 0);\n\tend\nend;\n\t\t\t\t]],\n\t\t\t},\n\t\t} ,  -- CodeExamples\n\t},  -- HOOK_CHUNK_GENERATED\n}"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnChunkGenerating.lua",
    "content": "return\n{\n\tHOOK_CHUNK_GENERATING =\n\t{\n\t\tCalledWhen = \"A chunk is about to be generated. Plugin can override the built-in generator.\",\n\t\tDefaultFnName = \"OnChunkGenerating\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called before the world generator starts generating a chunk. The plugin may provide\n\t\t\tsome or all parts of the generation, by-passing the built-in generator. The function is given access\n\t\t\tto the {{cChunkDesc|ChunkDesc}} object representing the contents of the chunk. It may override parts\n\t\t\tof the built-in generator by using the object's <i>SetUseDefaultXXX(false)</i> functions. After all\n\t\t\tthe callbacks for a chunk have been processed, the server will generate the chunk based on the\n\t\t\t{{cChunkDesc|ChunkDesc}} description - those parts that are set for generating (by default\n\t\t\teverything) are generated, the rest are read from the ChunkDesc object.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnChunkGenerated|HOOK_CHUNK_GENERATED}} hook.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world to which the chunk will be added\" },\n\t\t\t{ Name = \"ChunkX\", Type = \"number\", Notes = \"X-coord of the chunk\" },\n\t\t\t{ Name = \"ChunkZ\", Type = \"number\", Notes = \"Z-coord of the chunk\" },\n\t\t\t{ Name = \"ChunkDesc\", Type = \"{{cChunkDesc}}\", Notes = \"Generated chunk data.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf this function returns true, the server will not call any other plugin with the same chunk. If\n\t\t\tthis function returns false, the server will call the rest of the plugins with the same chunk,\n\t\t\tpossibly overwriting the ChunkDesc's contents.\n\t\t]],\n\t},  -- HOOK_CHUNK_GENERATING\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnChunkUnloaded.lua",
    "content": "return\n{\n\tHOOK_CHUNK_UNLOADED =\n\t{\n\t\tCalledWhen = \"A chunk has been unloaded from the memory.\",\n\t\tDefaultFnName = \"OnChunkUnloaded\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a chunk is unloaded from the memory. Though technically still in memory,\n\t\t\tthe plugin should behave as if the chunk was already not present. In particular, {{cWorld}} block\n\t\t\tAPI should not be used in the area of the specified chunk.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world from which the chunk is unloading\" },\n\t\t\t{ Name = \"ChunkX\", Type = \"number\", Notes = \"X-coord of the chunk\" },\n\t\t\t{ Name = \"ChunkZ\", Type = \"number\", Notes = \"Z-coord of the chunk\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event. There is no behavior that plugins could\n\t\t\toverride.\n\t\t]],\n\t},  -- HOOK_CHUNK_UNLOADED\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnChunkUnloading.lua",
    "content": "return\n{\n\tHOOK_CHUNK_UNLOADING =\n\t{\n\t\tCalledWhen = \" \tA chunk is about to be unloaded from the memory. Plugins may refuse the unload.\",\n\t\tDefaultFnName = \"OnChunkUnloading\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tCuberite calls this function when a chunk is about to be unloaded from the memory. A plugin may\n\t\t\tforce Cuberite to keep the chunk in memory by returning true.</p>\n\t\t\t<p>\n\t\t\tCAUTION: Preventing the server from unloading chunks can cause the server to use too much RAM, which will adversely affect both performance and stability (i.e. your computer will get slow and crash). Return true sparingly.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world from which the chunk is unloading\" },\n\t\t\t{ Name = \"ChunkX\", Type = \"number\", Notes = \"X-coord of the chunk\" },\n\t\t\t{ Name = \"ChunkZ\", Type = \"number\", Notes = \"Z-coord of the chunk\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called and finally Cuberite\n\t\t\tunloads the chunk. If the function returns true, no other callback is called for this event and the\n\t\t\tchunk is left in the memory.\n\t\t]],\n\t},  -- HOOK_CHUNK_UNLOADING\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnCollectingPickup.lua",
    "content": "return\n{\n\tHOOK_COLLECTING_PICKUP =\n\t{\n\t\tCalledWhen = \"Player is about to collect a pickup. Plugin can refuse / override behavior. \",\n\t\tDefaultFnName = \"OnCollectingPickup\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a player is about to collect a pickup. Plugins may refuse the action.</p>\n\t\t\t<p>\n\t\t\tPickup collection happens within the world tick, so if the collecting is refused, it will be tried\n\t\t\tagain in the next world tick, as long as the player is within reach of the pickup.</p>\n\t\t\t<p>\n\t\t\tFIXME: There is no OnCollectedPickup() callback.</p>\n\t\t\t<p>\n\t\t\tFIXME: This callback is called even if the pickup doesn't fit into the player's inventory.</p>\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who's collecting the pickup\" },\n\t\t\t{ Name = \"Pickup\", Type = \"{{cPickup}}\", Notes = \"The pickup being collected\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, Cuberite calls other plugins' callbacks and finally the\n\t\t\tpickup is collected. If the function returns true, no other plugins are called for this event and\n\t\t\tthe pickup is not collected.\n\t\t]],\n\t},  -- HOOK_COLLECTING_PICKUP\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnCraftingNoRecipe.lua",
    "content": "return\n{\n\tHOOK_CRAFTING_NO_RECIPE =\n\t{\n\t\tCalledWhen = \" \tNo built-in crafting recipe is found. Plugin may provide a recipe.\",\n\t\tDefaultFnName = \"OnCraftingNoRecipe\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis callback is called when a player places items in their {{cCraftingGrid|crafting grid}} and\n\t\t\tCuberite cannot find a built-in {{cCraftingRecipe|recipe}} for the combination. Plugins may provide\n\t\t\ta recipe for the ingredients given.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player whose crafting is reported in this hook\" },\n\t\t\t{ Name = \"Grid\", Type = \"{{cCraftingGrid}}\", Notes = \"Contents of the player's crafting grid\" },\n\t\t\t{ Name = \"Recipe\", Type = \"{{cCraftingRecipe}}\", Notes = \"The recipe that will be used (can be filled by plugins)\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, no recipe will be used. If the function returns true, no\n\t\t\tother plugin will have their callback called for this event and Cuberite will use the crafting\n\t\t\trecipe in Recipe.</p>\n\t\t\t<p>\n\t\t\tFIXME: To allow plugins give suggestions and overwrite other plugins' suggestions, we should change\n\t\t\tthe behavior with returning false, so that the recipe will still be used, but fill the recipe with\n\t\t\tempty values by default.\n\t\t]],\n\t},  -- HOOK_CRAFTING_NO_RECIPE\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnDisconnect.lua",
    "content": "return\n{\n\tHOOK_DISCONNECT =\n\t{\n\t\tCalledWhen = [[\n\t\t\tA client has disconnected, either by explicitly sending the disconnect packet (in older protocols) or\n\t\t\ttheir connection was terminated\n\t\t]],\n\t\tDefaultFnName = \"OnDisconnect\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a client has disconnected from the server, for whatever reason. It is also\n\t\t\tcalled when the client sends the Disconnect packet (only in pre-1.7 protocols). This hook is not called\n\t\t\tfor server ping connections.</p>\n\t\t\t<p>\n\t\t\tNote that the hook is called even for connections to players who failed to auth. In such a case there's\n\t\t\tno {{cPlayer}} object associated with the client.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnHandshake|HOOK_HANDSHAKE}} hook which is called when the client connects (and presents\n\t\t\ta handshake message, so that they are not just status-pinging). If you need to store a per-player\n\t\t\tobject, use the {{OnPlayerJoined|HOOK_PLAYER_JOINED}} and {{OnPlayerDestroyed|HOOK_PLAYER_DESTROYED}}\n\t\t\thooks instead, those are guaranteed to have the {{cPlayer}} object associated.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Client\", Type = \"{{cClientHandle}}\", Notes = \"The client who has disconnected\" },\n\t\t\t{ Name = \"Reason\", Type = \"string\", Notes = \"The reason that the client has sent in the disconnect packet\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, Cuberite calls other plugins' callbacks for this event.\n\t\t\tIf the function returns true, no other plugins are called for this event. In either case,\n\t\t\tthe client is disconnected.\n\t\t]],\n\t},  -- HOOK_DISCONNECT\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnDropSpense.lua",
    "content": "return\n{\n\tHOOK_DROPSPENSE =\n\t{\n\t\tCalledWhen = \"A dispenser or dropper is about to dispense/drop an item.\",\n\t\tDefaultFnName = \"OnDropSpense\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis callback is called whenever a {{cDropSpenserEntity|dropspenser}} dropspenses an {{cItem|item}}. A plugin may decide to disallow \n      the move by returning true.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World where the dropspenser resides\" },\n\t\t\t{ Name = \"DropSpenser\", Type = \"{{cDropSpenserEntity}}\", Notes = \"The dropspenser that is pulling the item\" },\n\t\t\t{ Name = \"SlotNum\", Type = \"number\", Notes = \"The slot of the dropspensed item in the dropspenser's {{cItemGrid|internal storage}}\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event and the dropspenser will not dropspense the item.\n\t\t]],\n\t},  -- HOOK_DROPSPENSE\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnEntityAddEffect.lua",
    "content": "return\n{\n\tHOOK_ENTITY_ADD_EFFECT =\n\t{\n\t\tCalledWhen = \"An entity effect is about to get added to an entity.\",\n\t\tDefaultFnName = \"OnEntityAddEffect\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called whenever an entity effect is about to be added to an entity. The plugin may\n\t\t\tdisallow the addition by returning true.</p>\n\t\t\t<p>Note that this hook only fires for adding the effect, but not for the actual effect application. See\n\t\t\talso the {{OnEntityRemoveEffect|HOOK_ENTITY_REMOVE_EFFECT}} for notification about effects expiring /\n\t\t\tremoving, and {{OnEntityApplyEffect|HOOK_ENTITY_APPLY_EFFECT}} for the actual effect application to the\n\t\t\tentity.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Entity\", Type = \"{{cEntity}}\", Notes = \"The entity to which the effect is about to be added\" },\n\t\t\t{ Name = \"EffectType\", Type = \"number\", Notes = \"The type of the effect to be added. One of the effXXX constants.\" },\n\t\t\t{ Name = \"EffectDuration\", Type = \"number\", Notes = \"The duration of the effect to be added, in ticks.\" },\n\t\t\t{ Name = \"EffectIntensity\", Type = \"number\", Notes = \"The intensity (level) of the effect to be added. \" },\n\t\t\t{ Name = \"DistanceModifier\", Type = \"number\", Notes = \"The modifier for the effect intensity, based on distance. Used mainly for splash potions.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the plugin returns true, the effect will not be added and none of the remaining hook handlers will\n\t\t\tbe called. If the plugin returns false, Cuberite calls all the remaining hook handlers and finally\n\t\t\tthe effect is added to the entity.\n\t\t]],\n\t},  -- HOOK_EXECUTE_COMMAND\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnEntityChangedWorld.lua",
    "content": "return\n{\n\tHOOK_ENTITY_CHANGED_WORLD =\n\t{\n\t\tCalledWhen = \"After a entity has changed the world.\",\n\t\tDefaultFnName = \"OnEntityChangedWorld\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after the server has moved the {{cEntity|entity}} to the given world. This is an information-only\n\t\t\tcallback, the entity is already in the new world.<p>\n\t\t\tSee also the {{OnEntityChangingWorld|HOOK_ENTITY_CHANGING_WORLD}} hook for a similar hook called before the\n\t\t\tentity is moved to the new world.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Entity\", Type = \"{{cEntity}}\", Notes = \"The entity that has changed the world\" },\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world from which the entity has come\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event.\n\t\t]],\n\t},  -- HOOK_ENTITY_CHANGED_WORLD\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnEntityChangingWorld.lua",
    "content": "return\n{\n\tHOOK_ENTITY_CHANGING_WORLD =\n\t{\n\t\tCalledWhen = \"Before a entity is changing the world.\",\n\t\tDefaultFnName = \"OnEntityChangingWorld\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called before the server moves the {{cEntity|entity}} to the given world. Plugins may\n\t\t\trefuse the changing of the entity to the new world.<p>\n\t\t\tSee also the {{OnEntityChangedWorld|HOOK_ENTITY_CHANGED_WORLD}} hook for a similar hook is called after the\n\t\t\tentity has been moved to the world.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Entity\", Type = \"{{cEntity}}\", Notes = \"The entity that wants to change the world\" },\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world to which the entity wants to change\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event and the change of the entity to the world is\n\t\t\tcancelled.\n\t\t]],\n\t},  -- HOOK_ENTITY_CHANGING_WORLD\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnEntityTeleport.lua",
    "content": "return\n{\n\tHOOK_ENTITY_TELEPORT =\n\t{\n\t\tCalledWhen = \"Any entity teleports. Plugin may refuse teleport.\",\n\t\tDefaultFnName = \"OnEntityTeleport\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis function is called in each server tick for each {{cEntity|Entity}} that has\n\t\t\tteleported. Plugins may refuse the teleport.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Entity\", Type = \"{{cEntity}}\", Notes = \"The entity who has teleported. New position is set in the object after successfull teleport\" },\n\t\t\t{ Name = \"OldPosition\", Type = \"{{Vector3d}}\", Notes = \"The old position.\" },\n\t\t\t{ Name = \"NewPosition\", Type = \"{{Vector3d}}\", Notes = \"The new position.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns true, teleport is prohibited.</p>\n\t\t\t<p>\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and finally the new\n\t\t\tposition is permanently stored in the cEntity object.</p>\n\t\t]],\n\t},  -- HOOK_ENTITY_TELEPORT\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnExecuteCommand.lua",
    "content": "return\n{\n\tHOOK_EXECUTE_COMMAND =\n\t{\n\t\tCalledWhen = [[\n\t\t\tA player executes an in-game command, or the admin issues a console command. Note that built-in\n\t\t\tconsole commands are exempt to this hook - they are always performed and the hook is not called.\n\t\t]],\n\t\tDefaultFnName = \"OnExecuteCommand\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tA plugin may implement a callback for this hook to intercept both in-game commands executed by the\n\t\t\tplayers and console commands executed by the server admin. The function is called for every in-game\n\t\t\tcommand sent from any player and for those server console commands that are not built in in the\n\t\t\tserver.</p>\n\t\t\t<p>\n\t\t\tIf the command is in-game, the first parameter to the hook function is the {{cPlayer|player}} who's\n\t\t\texecuting the command. If the command comes from the server console, the first parameter is nil.</p>\n\t\t\t<p>\n\t\t\tThe server calls this hook even for unregistered (unknown) console commands. It also calls the hook\n\t\t\tfor unknown in-game commands, as long as they begin with a slash ('/'). If a plugin needs to intercept\n\t\t\tin-game chat messages not beginning with a slash, it should use the {{OnChat|HOOK_CHAT}} hook.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"For in-game commands, the player who has sent the message. For console commands, nil\" },\n\t\t\t{ Name = \"CommandSplit\", Type = \"array-table of strings\", Notes = \"The command and its parameters, broken into a table by spaces\" },\n\t\t\t{ Name = \"EntireCommand\", Type = \"string\", Notes = \"The entire command as a single string\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the plugin returns false, Cuberite calls all the remaining hook handlers and finally the command\n\t\t\twill be executed. If the plugin returns true, the none of the remaining hook handlers will be called.\n\t\t\tIn this case the plugin can return a second value, specifying whether what the command result should\n\t\t\tbe set to, one of the {{cPluginManager#CommandResult|CommandResult}} constants. If not\n\t\t\tprovided, the value defaults to crBlocked.\n\t\t]],\n\t},  -- HOOK_EXECUTE_COMMAND\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnExploded.lua",
    "content": "return\n{\n\tHOOK_EXPLODED =\n\t{\n\t\tCalledWhen = \"An explosion has happened\",\n\t\tDefaultFnName = \"OnExploded\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after an explosion has been processed in a world.</p>\n\t\t\t<p>\n\t\t\tSee also {{OnExploding|HOOK_EXPLODING}} for a similar hook called before the explosion.</p>\n\t\t\t<p>\n\t\t\tThe explosion carries with it the type of its source - whether it's a creeper exploding, or TNT,\n\t\t\tetc. It also carries the identification of the actual source. The exact type of the identification\n\t\t\tdepends on the source kind, see the {{Globals#ExplosionSource|esXXX}} constants' descriptions for details.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world where the explosion happened\" },\n\t\t\t{ Name = \"ExplosionSize\", Type = \"number\", Notes = \"The relative explosion size\" },\n\t\t\t{ Name = \"CanCauseFire\", Type = \"bool\", Notes = \"True if the explosion has turned random air blocks to fire (such as a ghast fireball)\" },\n\t\t\t{ Name = \"X\", Type = \"number\", Notes = \"X-coord of the explosion center\" },\n\t\t\t{ Name = \"Y\", Type = \"number\", Notes = \"Y-coord of the explosion center\" },\n\t\t\t{ Name = \"Z\", Type = \"number\", Notes = \"Z-coord of the explosion center\" },\n\t\t\t{ Name = \"Source\", Type = \"eExplosionSource\", Notes = \"Source of the explosion. See the table above.\" },\n\t\t\t{ Name = \"SourceData\", Type = \"varies\", Notes = \"Additional data for the source. The exact type varies by the source. See the {{Globals#ExplosionSource|esXXX}} constants' descriptions.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event. There is no overridable behaviour.\n\t\t]],\n\t},  -- HOOK_EXPLODED\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnExploding.lua",
    "content": "return\n{\n\tHOOK_EXPLODING =\n\t{\n\t\tCalledWhen = \"An explosion is about to be processed\",\n\t\tDefaultFnName = \"OnExploding\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called before an explosion has been processed in a world.</p>\n\t\t\t<p>\n\t\t\tSee also {{OnExploded|HOOK_EXPLODED}} for a similar hook called after the explosion.</p>\n\t\t\t<p>\n\t\t\tThe explosion carries with it the type of its source - whether it's a creeper exploding, or TNT,\n\t\t\tetc. It also carries the identification of the actual source. The exact type of the identification\n\t\t\tdepends on the source kind, see the {{Globals#ExplosionSource|esXXX}} constants' descriptions for details\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world where the explosion happens\" },\n\t\t\t{ Name = \"ExplosionSize\", Type = \"number\", Notes = \"The relative explosion size\" },\n\t\t\t{ Name = \"CanCauseFire\", Type = \"bool\", Notes = \"True if the explosion will turn random air blocks to fire (such as a ghast fireball)\" },\n\t\t\t{ Name = \"X\", Type = \"number\", Notes = \"X-coord of the explosion center\" },\n\t\t\t{ Name = \"Y\", Type = \"number\", Notes = \"Y-coord of the explosion center\" },\n\t\t\t{ Name = \"Z\", Type = \"number\", Notes = \"Z-coord of the explosion center\" },\n\t\t\t{ Name = \"Source\", Type = \"eExplosionSource\", Notes = \"Source of the explosion. See the table above.\" },\n\t\t\t{ Name = \"SourceData\", Type = \"varies\", Notes = \"Additional data for the source. The exact type varies by the source. See the {{Globals#ExplosionSource|esXXX}} constants' description.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called, and finally\n\t\t\tCuberite will process the explosion - destroy blocks and push + hurt entities. If the function\n\t\t\treturns true, no other callback is called for this event and the explosion will not occur.</p>\n\t\t\t<p>\n\t\t\tThe hook handler may return up to two more values after the initial bool. The second returned value\n\t\t\toverrides the CanCauseFire parameter for subsequent hook calls and the final explosion, the third\n\t\t\treturned value overrides the ExplosionSize parameter for subsequent hook calls and the final explosion.\n\t\t]],\n\t},  -- HOOK_EXPLODING\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnHandshake.lua",
    "content": "return\n{\n\tHOOK_HANDSHAKE =\n\t{\n\t\tCalledWhen = \"A client is connecting.\",\n\t\tDefaultFnName = \"OnHandshake\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a client sends the Handshake packet. At this stage, only the client IP and\n\t\t\t(unverified) username are known. Plugins may refuse access to the server based on this\n\t\t\tinformation.</p>\n\t\t\t<p>\n\t\t\tNote that the username is not authenticated - the authentication takes place only after this hook is\n\t\t\tprocessed.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Client\", Type = \"{{cClientHandle}}\", Notes = \"The client handle representing the connection. Note that there's no {{cPlayer}} object for this client yet.\" },\n\t\t\t{ Name = \"UserName\", Type = \"string\", Notes = \"The username presented in the packet. Note that this username is unverified.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false, the user is let in to the server. If the function returns true, no\n\t\t\tother plugin's callback is called, the user is kicked and the connection is closed.\n\t\t]],\n\t},  -- HOOK_HANDSHAKE\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnHopperPullingItem.lua",
    "content": "return\n{\n\tHOOK_HOPPER_PULLING_ITEM =\n\t{\n\t\tCalledWhen = \"A hopper is pulling an item from another block entity.\",\n\t\tDefaultFnName = \"OnHopperPullingItem\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis callback is called whenever a {{cHopperEntity|hopper}} transfers an {{cItem|item}} from another\n\t\t\tblock entity into its own internal storage. A plugin may decide to disallow the move by returning\n\t\t\ttrue. Note that in such a case, the hook may be called again for the same hopper, with different\n\t\t\tslot numbers.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World where the hopper resides\" },\n\t\t\t{ Name = \"Hopper\", Type = \"{{cHopperEntity}}\", Notes = \"The hopper that is pulling the item\" },\n\t\t\t{ Name = \"DstSlot\", Type = \"number\", Notes = \"The destination slot in the hopper's {{cItemGrid|internal storage}}\" },\n\t\t\t{ Name = \"SrcBlockEntity\", Type = \"{{cBlockEntityWithItems}}\", Notes = \"The block entity that is losing the item\" },\n\t\t\t{ Name = \"SrcSlot\", Type = \"number\", Notes = \"Slot in SrcBlockEntity from which the item will be pulled\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event and the hopper will not pull the item.\n\t\t]],\n\t},  -- HOOK_HOPPER_PULLING_ITEM\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnHopperPushingItem.lua",
    "content": "return\n{\n\tHOOK_HOPPER_PUSHING_ITEM =\n\t{\n\t\tCalledWhen = \"A hopper is pushing an item into another block entity. \",\n\t\tDefaultFnName = \"OnHopperPushingItem\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called whenever a {{cHopperEntity|hopper}} transfers an {{cItem|item}} from its own\n\t\t\tinternal storage into another block entity. A plugin may decide to disallow the move by returning\n\t\t\ttrue. Note that in such a case, the hook may be called again for the same hopper and block, with\n\t\t\tdifferent slot numbers.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World where the hopper resides\" },\n\t\t\t{ Name = \"Hopper\", Type = \"{{cHopperEntity}}\", Notes = \"The hopper that is pushing the item\" },\n\t\t\t{ Name = \"SrcSlot\", Type = \"number\", Notes = \"Slot in the hopper that will lose the item\" },\n\t\t\t{ Name = \"DstBlockEntity\", Type = \"{{cBlockEntityWithItems}}\", Notes = \" \tThe block entity that will receive the item\" },\n\t\t\t{ Name = \"DstSlot\", Type = \"number\", Notes = \"\tSlot in DstBlockEntity's internal storage where the item will be stored\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event and the hopper will not push the item.\n\t\t]],\n\t},  -- HOOK_HOPPER_PUSHING_ITEM\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnKilled.lua",
    "content": "return \n{\n\tHOOK_KILLED = \n\t{\n\t\tCalledWhen = \"A player or a mob died.\",\n\t\tDefaultFnName = \"OnKilled\",\n\t\tDesc = [[\n\t\t\tThis hook is called whenever player or a mob dies. It can be used to change the death message.\n\t\t]],\n\t\tParams = \n\t\t{\n\t\t\t{ Name = \"Victim\", Type = \"{{cEntity}}\", Notes = \"The player or mob that died\" },\n\t\t\t{ Name = \"TDI\", Type = \"{{TakeDamageInfo}}\", Notes = \"Informations about the death\" },\n\t\t\t{ Name = \"DeathMessage\", Type = \"string\", Notes = \"The default death message. An empty string if the victim is not a player\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tThe function may return two values. The first value is a boolean specifying whether other plugins should be called. If it is true, the other plugins won't get notified of the death. If it is false, the other plugins will get notified.</p>\n\t\t\t<p>The second value is a string containing the death message. If the victim is a player, this death message is broadcasted instead of the default death message. If it is empty, no death message is broadcasted. If it is nil, the message is left unchanged. If the victim is not a player, the death message is never broadcasted.</p>\n\t\t\t<p>In either case, the victim is dead.\n\t\t]],\n\t},  -- HOOK_KILLED\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnKilling.lua",
    "content": "return\n{\n\tHOOK_KILLING =\n\t{\n\t\tCalledWhen = \"A player or a mob is dying.\",\n\t\tDefaultFnName = \"OnKilling\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called whenever a {{cPawn|pawn}}'s (a player's or a mob's) health reaches zero. This\n\t\t\tmeans that the pawn is about to be killed, unless a plugin \"revives\" them by setting their health\n\t\t\tback to a positive value.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Victim\", Type = \"{{cPawn}}\", Notes = \"The player or mob that is about to be killed\" },\n\t\t\t{ Name = \"Killer\", Type = \"{{cEntity}}\", Notes = \"The entity that has caused the victim to lose the last point of health. May be nil for environment damage\" },\n\t\t\t{ Name = \"TDI\", Type = \"{{TakeDamageInfo}}\", Notes = \"The damage type, cause and effects.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, Cuberite calls other plugins with this event. If the\n\t\t\tfunction returns true, no other plugin is called for this event.</p>\n\t\t\t<p>\n\t\t\tIn either case, the victim's health is then re-checked and if it is greater than zero, the victim is\n\t\t\t\"revived\" with that health amount. If the health is less or equal to zero, the victim is killed.\n\t\t]],\n\t},  -- HOOK_KILLING\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnLogin.lua",
    "content": "return\n{\n\tHOOK_LOGIN =\n\t{\n\t\tCalledWhen = \"Right before player authentication. If auth is disabled, right after the player sends their name.\",\n\t\tDefaultFnName = \"OnLogin\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called whenever a client logs in. It is called right before the client's name is sent\n\t\t\tto be authenticated. Plugins may refuse the client from accessing the server. Note that when this\n\t\t\tcallback is called, the {{cPlayer}} object for this client doesn't exist yet - the client has no\n\t\t\trepresentation in any world. To process new players when their world is known, use a later callback,\n\t\t\tsuch as {{OnPlayerJoined|HOOK_PLAYER_JOINED}} or {{OnPlayerSpawned|HOOK_PLAYER_SPAWNED}}.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Client\", Type = \"{{cClientHandle}}\", Notes = \"The client handle representing the connection\" },\n\t\t\t{ Name = \"ProtocolVersion\", Type = \"number\", Notes = \"Versio of the protocol that the client is talking\" },\n\t\t\t{ Name = \"UserName\", Type = \"string\", Notes = \"The name that the client has presented for authentication. This name will be given to the {{cPlayer}} object when it is created for this client.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns true, no other plugins are called for this event and the client is kicked.\n\t\t\tIf the function returns false or no value, Cuberite calls other plugins' callbacks and finally\n\t\t\tsends an authentication request for the client's username to the auth server. If the auth server\n\t\t\tis disabled in the server settings, the player object is immediately created.\n\t\t]],\n\t},  -- HOOK_LOGIN\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerAnimation.lua",
    "content": "return\n{\n\tHOOK_PLAYER_ANIMATION =\n\t{\n\t\tCalledWhen = \"A client has sent an Animation packet\",\n\t\tDefaultFnName = \"OnPlayerAnimation\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when the server receives an Animation packet from the client.</p>\n\t\t\t<p>\n\t\t\tFor the list of animations that are sent by the client, see the\n\t\t\t<a href=\"http://wiki.vg/Protocol#Animation_.28clientbound.29\">Protocol wiki</a>.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player from whom the packet was received\" },\n\t\t\t{ Name = \"Animation\", Type = \"number\", Notes = \"The kind of animation\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. Afterwards, the\n\t\t\tserver broadcasts the animation packet to all nearby clients. If the function returns true, no other\n\t\t\tcallback is called for this event and the packet is not broadcasted.\n\t\t]],\n\t},  -- HOOK_PLAYER_ANIMATION\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerBreakingBlock.lua",
    "content": "return\n{\n\tHOOK_PLAYER_BREAKING_BLOCK =\n\t{\n\t\tCalledWhen = \"Just before a player breaks a block. Plugin may override / refuse. \",\n\t\tDefaultFnName = \"OnPlayerBreakingBlock\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a {{cPlayer|player}} breaks a block, before the block is actually broken in\n\t\t\tthe {{cWorld|World}}. Plugins may refuse the breaking.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnPlayerBrokenBlock|HOOK_PLAYER_BROKEN_BLOCK}} hook for a similar hook called after\n\t\t\tthe block is broken.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who is digging the block\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the block\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"Face of the block upon which the player is acting. One of the BLOCK_FACE_ constants\" },\n\t\t\t{ Name = \"BlockType\", Type = \"BLOCKTYPE\", Notes = \"The block type of the block being broken\" },\n\t\t\t{ Name = \"BlockMeta\", Type = \"NIBBLETYPE\", Notes = \"The block meta of the block being broken \" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called, and then the block\n\t\t\tis broken. If the function returns true, no other plugin's callback is called and the block breaking\n\t\t\tis cancelled. The server re-sends the block back to the player to replace it (the player's client\n\t\t\talready thinks the block was broken).\n\t\t]],\n\t},  -- HOOK_PLAYER_BREAKING_BLOCK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerBrokenBlock.lua",
    "content": "return\n{\n\tHOOK_PLAYER_BROKEN_BLOCK =\n\t{\n\t\tCalledWhen = \"After a player has broken a block. Notification only.\",\n\t\tDefaultFnName = \"OnPlayerBrokenBlock\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis function is called after a {{cPlayer|player}} breaks a block. The block is already removed\n\t\t\tfrom the {{cWorld|world}} and {{cPickup|pickups}} have been spawned. To get the world in which the\n\t\t\tblock has been dug, use the {{cPlayer}}:GetWorld() function.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnPlayerBreakingBlock|HOOK_PLAYER_BREAKING_BLOCK}} hook for a similar hook called\n\t\t\tbefore the block is broken. To intercept the creation of pickups, see the\n\t\t\t{{OnBlockToPickups|HOOK_BLOCK_TO_PICKUPS}} hook.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who broke the block\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the block\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"Face of the block upon which the player interacted. One of the BLOCK_FACE_ constants\" },\n\t\t\t{ Name = \"BlockType\", Type = \"BLOCKTYPE\", Notes = \"The block type of the block\" },\n\t\t\t{ Name = \"BlockMeta\", Type = \"NIBBLETYPE\", Notes = \"The block meta of the block\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event.\n\t\t]],\n\t},  -- HOOK_PLAYER_BROKEN_BLOCK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerCrouched.lua",
    "content": "return\n{\n\tHOOK_PLAYER_CROUCHED =\n\t{\n\t\tCalledWhen = \"Player crouched in the tick being currently processed.\",\n\t\tDefaultFnName = \"OnPlayerCrouched\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis function is called in each server tick for each {{cPlayer|player}} that has crouched.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who has crouched.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins callbacks are called.</p>\n\t\t]],\n\t},  -- HOOK_PLAYER_CROUCHED\n}"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerDestroyed.lua",
    "content": "return\n{\n\tHOOK_PLAYER_DESTROYED =\n\t{\n\t\tCalledWhen = \"A player object is about to be destroyed.\",\n\t\tDefaultFnName = \"OnPlayerDestroyed\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis function is called before a {{cPlayer|player}} is about to be destroyed.\n\t\t\tThe player has disconnected for whatever reason and is no longer in the server.\n\t\t\tIf a plugin returns true, a leave message is not broadcast, and vice versa.\n\t\t\tHowever, whatever the return value, the player object is removed from memory.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The destroyed player\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and a leave message is broadcast.\n\t\t\tIf the function returns true, no other callbacks are called for this event and no leave message appears. Either way the player is removed internally. \n\t\t]],\n\t},  -- HOOK_PLAYER_DESTROYED\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerEating.lua",
    "content": "return\n{\n\tHOOK_PLAYER_EATING =\n\t{\n\t\tCalledWhen = \"When the player starts eating\",\n\t\tDefaultFnName = \"OnPlayerEating\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook gets called when the {{cPlayer|player}} starts eating, after the server checks that the\n\t\t\tplayer can indeed eat (is not satiated and is holding food). Plugins may still refuse the eating by\n\t\t\treturning true.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who started eating\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the server calls the next plugin handler, and finally\n\t\t\tlets the player eat. If the function returns true, the server doesn't call any more callbacks for\n\t\t\tthis event and aborts the eating. A \"disallow\" packet is sent to the client.\n\t\t]],\n\t},  -- HOOK_PLAYER_EATING\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerFished.lua",
    "content": "return\n{\n\tHOOK_PLAYER_FISHED =\n\t{\n\t\tCalledWhen = \"A player gets a reward from fishing.\",\n\t\tDefaultFnName = \"OnPlayerFished\", -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook gets called after a player reels in the fishing rod. This is a notification-only hook, the reward has already been decided. If a plugin needs to modify the reward, use the {{OnPlayerFishing|HOOK_PLAYER_FISHING}} hook.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who pulled the fish in.\" },\n\t\t\t{ Name = \"Reward\", Type = \"{{cItems}}\", Notes = \"The reward the player gets. It can be a fish, treasure and junk.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function returns true, no other\n\t\t\tcallback is called for this event.\n\t\t]],\n\t}, -- HOOK_PLAYER_FISHED\n};\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerFishing.lua",
    "content": "return\n{\n\tHOOK_PLAYER_FISHING =\n\t{\n\t\tCalledWhen = \"A player is about to get a reward from fishing.\",\n\t\tDefaultFnName = \"OnPlayerFishing\", -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook gets called when a player right clicks with a fishing rod while the floater is under water. The reward is already descided, but the plugin may change it.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who pulled the fish in.\" },\n\t\t\t{ Name = \"Reward\", Type = \"{{cItems}}\", Notes = \"The reward the player gets. It can be a fish, treasure and junk.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. Afterwards, the\n\t\t\tserver gives the player his reward. If the function returns true, no other\n\t\t\tcallback is called for this event and the player doesn't get his reward.\n\t\t]],\n\t}, -- HOOK_PLAYER_FISHING\n};\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerFoodLevelChange.lua",
    "content": "return\n{\n\tHOOK_PLAYER_FOOD_LEVEL_CHANGE =\n\t{\n\t\tCalledWhen = \"Called before the player food level changed. Plugin may override\",\n\t\tDefaultFnName = \"OnPlayerFoodLevelChange\", -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called before the food level changes.\n\t\t\tThe food level is not changed yet, plugins may choose\n\t\t\tto refuse the change.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who changes the food level.\" },\n\t\t\t{ Name = \"NewFoodLevel\", Type = \"number\", Notes = \"The new food level.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. Afterwards, the\n\t\t\tserver changes the food level of the player. If the function returns true, no\n\t\t\tother callback is called for this event and the player's food level doesn't change.\n\t\t]],\n\t}, -- HOOK_PLAYER_FOOD_LEVEL_CHANGE\n};\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerJoined.lua",
    "content": "return\n{\n\tHOOK_PLAYER_JOINED =\n\t{\n\t\tCalledWhen = \"After Login and before Spawned, before being added to world. \",\n\t\tDefaultFnName = \"OnPlayerJoined\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called whenever a {{cPlayer|player}} has completely logged in. If authentication is\n\t\t\tenabled, this function is called after their name has been authenticated. It is called after\n\t\t\t{{OnLogin|HOOK_LOGIN}} and before {{OnPlayerSpawned|HOOK_PLAYER_SPAWNED}}, right after the player's\n\t\t\tentity is created, but not added to the world yet. The player is not yet visible to other players.\n\t\t\tReturning true will block a join message from being broadcast, but otherwise, the player is still allowed to join.\n\t\t\tPlugins wishing to refuse player's entry should kick the player using the {{cPlayer}}:Kick() function.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who has joined the game\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and a join message is broadcast. If the function\n\t\t\treturns true, no other callbacks are called for this event and a join message is not sent. Either way the player is let in.\n\t\t]],\n\t},  -- HOOK_PLAYER_JOINED\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerLeftClick.lua",
    "content": "return\n{\n\tHOOK_PLAYER_LEFT_CLICK =\n\t{\n\t\tCalledWhen = \"A left-click packet is received from the client. Plugin may override / refuse.\",\n\t\tDefaultFnName = \"OnPlayerLeftClick\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when Cuberite receives a left-click packet from the {{cClientHandle|client}}. It\n\t\t\tis called before any processing whatsoever is performed on the packet, meaning that hacked /\n\t\t\tmalicious clients may be trigerring this event very often and with unchecked parameters. Therefore\n\t\t\tplugin authors are advised to use extreme caution with this callback.</p>\n\t\t\t<p>\n\t\t\tPlugins may refuse the default processing for the packet, causing Cuberite to behave as if the\n\t\t\tpacket has never arrived. This may, however, create inconsistencies in the client - the client may\n\t\t\tthink that they broke a block, while the server didn't process the breaking, etc. For this reason,\n\t\t\tif a plugin refuses the processing, Cuberite sends the block specified in the packet back to the\n\t\t\tclient (as if placed anew), if the status code specified a block-break action. For other actions,\n\t\t\tplugins must rectify the situation on their own.</p>\n\t\t\t<p>\n\t\t\tThe client sends the left-click packet for several other occasions, such as dropping the held item\n\t\t\t(Q keypress) or shooting an arrow. This is reflected in the Status code. Consult the\n\t\t\t<a href=\"http://wiki.vg/Protocol#Player_Digging\">protocol documentation</a> for details on the actions.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player whose client sent the packet\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the block\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"Face of the block upon which the player interacted. One of the BLOCK_FACE_ constants\" },\n\t\t\t{ Name = \"Action\", Type = \"number\", Notes = \"Action to be performed on the block (\\\"status\\\" in the protocol docs)\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, Cuberite calls other plugins' callbacks and finally sends\n\t\t\tthe packet for further processing.</p>\n\t\t\t<p>\n\t\t\tIf the function returns true, no other plugins are called, processing is halted. If the action was a\n\t\t\tblock dig, Cuberite sends the block specified in the coords back to the client. The packet is\n\t\t\tdropped.\n\t\t]],\n\t},  -- HOOK_PLAYER_LEFT_CLICK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerMoving.lua",
    "content": "return\n{\n\tHOOK_PLAYER_MOVING =\n\t{\n\t\tCalledWhen = \"Player tried to move in the tick being currently processed. Plugin may refuse movement.\",\n\t\tDefaultFnName = \"OnPlayerMoving\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis function is called in each server tick for each {{cPlayer|player}} that has sent any of the\n\t\t\tplayer-move packets. Plugins may refuse the movement.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who has moved. The object already has the new position stored in it.\" },\n\t\t\t{ Name = \"OldPosition\", Type = \"{{Vector3d}}\", Notes = \"The old position.\" },\n\t\t\t{ Name = \"NewPosition\", Type = \"{{Vector3d}}\", Notes = \"The new position.\" },\n\t\t\t{ Name = \"PreviousIsOnGround\", Type = \"{{boolean}}\", Notes = \"Specifies if the player was standing on a solid block.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns true, movement is prohibited.</p>\n\t\t\t<p>\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and finally the new\n\t\t\tposition is permanently stored in the cPlayer object.</p>\n\t\t]],\n\t},  -- HOOK_PLAYER_MOVING\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerOpeningWindow.lua",
    "content": "return\n{\n\tHOOK_PLAYER_OPENING_WINDOW =\n\t{\n\t\tCalledWhen = \"Called when a player is about to open a window\",\n\t\tDefaultFnName = \"OnPlayerOpeningWindow\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a player is about to open a window, e.g. when they click on a chest or a furnace.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who is opening the window\" },\n\t\t\t{ Name = \"Window\", Type = \"{{cWindow}}\", Notes = \"The window that is being opened\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called, and finally\n\t\t\tCuberite will process the opening window. If the function returns true, no other callback is called for this event.\n\t\t]],\n\t},  -- HOOK_PLAYER_OPENING_WINDOW\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerPlacedBlock.lua",
    "content": "return\n{\n\tHOOK_PLAYER_PLACED_BLOCK =\n\t{\n\t\tCalledWhen = \"After a player has placed a block. Notification only.\",\n\t\tDefaultFnName = \"OnPlayerPlacedBlock\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after a {{cPlayer|player}} has placed a block in the {{cWorld|world}}. The block\n\t\t\tis already added to the world and the corresponding item removed from player's\n\t\t\t{{cInventory|inventory}}.</p>\n\t\t\t<p>\n\t\t\tUse the {{cPlayer}}:GetWorld() function to get the world to which the block belongs.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnPlayerPlacingBlock|HOOK_PLAYER_PLACING_BLOCK}} hook for a similar hook called\n\t\t\tbefore the placement.</p>\n\t\t\t<p>\n\t\t\tIf the client action results in multiple blocks being placed (such as a bed or a door), each separate\n\t\t\tblock is reported through this hook. All the blocks are already present in the world before the first\n\t\t\tinstance of this hook is called.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who placed the block\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the block\" },\n\t\t\t{ Name = \"BlockType\", Type = \"BLOCKTYPE\", Notes = \"The block type of the block\" },\n\t\t\t{ Name = \"BlockMeta\", Type = \"NIBBLETYPE\", Notes = \"The block meta of the block\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf this function returns false or no value, Cuberite calls other plugins with the same event. If\n\t\t\tthis function returns true, no other plugin is called for this event.\n\t\t]],\n\t},  -- HOOK_PLAYER_PLACED_BLOCK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerPlacingBlock.lua",
    "content": "return\n{\n\tHOOK_PLAYER_PLACING_BLOCK =\n\t{\n\t\tCalledWhen = \"Just before a player places a block. Plugin may override / refuse.\",\n\t\tDefaultFnName = \"OnPlayerPlacingBlock\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called just before a {{cPlayer|player}} places a block in the {{cWorld|world}}. The\n\t\t\tblock is not yet placed, plugins may choose to override the default behavior or refuse the placement\n\t\t\tat all.</p>\n\t\t\t<p>\n\t\t\tNote that the client already expects that the block has been placed. For that reason, if a plugin\n\t\t\trefuses the placement, Cuberite sends the old block at the provided coords to the client.</p>\n\t\t\t<p>\n\t\t\tUse the {{cPlayer}}:GetWorld() function to get the world to which the block belongs.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnPlayerPlacedBlock|HOOK_PLAYER_PLACED_BLOCK}} hook for a similar hook called after\n\t\t\tthe placement.</p>\n\t\t\t<p>\n\t\t\tIf the client action results in multiple blocks being placed (such as a bed or a door), each separate\n\t\t\tblock is reported through this hook and only if all of them succeed, all the blocks are placed. If\n\t\t\tany one of the calls are refused by the plugin, all the blocks are refused and reverted on the client.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who is placing the block\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the block\" },\n\t\t\t{ Name = \"BlockType\", Type = \"BLOCKTYPE\", Notes = \"The block type of the block\" },\n\t\t\t{ Name = \"BlockMeta\", Type = \"NIBBLETYPE\", Notes = \"The block meta of the block\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf this function returns false or no value, Cuberite calls other plugins with the same event and\n\t\t\tfinally places the block and removes the corresponding item from player's inventory. If this\n\t\t\tfunction returns true, no other plugin is called for this event, Cuberite sends the old block at\n\t\t\tthe specified coords to the client and drops the packet.\n\t\t]],\n\t},  -- HOOK_PLAYER_PLACING_BLOCK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerRightClick.lua",
    "content": "return\n{\n\tHOOK_PLAYER_RIGHT_CLICK =\n\t{\n\t\tCalledWhen = \"A right-click packet is received from the client. Plugin may override / refuse.\",\n\t\tDefaultFnName = \"OnPlayerRightClick\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when Cuberite receives a right-click packet from the {{cClientHandle|client}}. It\n\t\t\tis called before any processing whatsoever is performed on the packet, meaning that hacked /\n\t\t\tmalicious clients may be trigerring this event very often and with unchecked parameters. Therefore\n\t\t\tplugin authors are advised to use extreme caution with this callback.</p>\n\t\t\t<p>\n\t\t\tPlugins may refuse the default processing for the packet, causing Cuberite to behave as if the\n\t\t\tpacket has never arrived. This may, however, create inconsistencies in the client - the client may\n\t\t\tthink that they placed a block, while the server didn't process the placing, etc.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player whose client sent the packet\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the block\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"Face of the block upon which the player interacted. One of the BLOCK_FACE_ constants\" },\n\t\t\t{ Name = \"CursorX\", Type = \"number\", Notes = \"X-coord of the mouse crosshair on the block\" },\n\t\t\t{ Name = \"CursorY\", Type = \"number\", Notes = \"Y-coord of the mouse crosshair on the block\" },\n\t\t\t{ Name = \"CursorZ\", Type = \"number\", Notes = \"Z-coord of the mouse crosshair on the block\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, Cuberite calls other plugins' callbacks and finally sends\n\t\t\tthe packet for further processing.</p>\n\t\t\t<p>\n\t\t\tIf the function returns true, no other plugins are called, processing is halted.\n\t\t]],\n\t},  -- HOOK_PLAYER_RIGHT_CLICK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerRightClickingEntity.lua",
    "content": "return\n{\n\tHOOK_PLAYER_RIGHT_CLICKING_ENTITY =\n\t{\n\t\tCalledWhen = \"A player has right-clicked an entity. Plugins may override / refuse.\",\n\t\tDefaultFnName = \"OnPlayerRightClickingEntity\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when the {{cPlayer|player}} right-clicks an {{cEntity|entity}}. Plugins may\n\t\t\toverride the default behavior or even cancel the default processing.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who has right-clicked the entity\" },\n\t\t\t{ Name = \"Entity\", Type = \"{{cEntity}} descendant\", Notes = \"The entity that has been right-clicked\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the functino returns false or no value, Cuberite calls other plugins' callbacks and finally does\n\t\t\tthe default processing for the right-click. If the function returns true, no other callbacks are\n\t\t\tcalled and the default processing is skipped.\n\t\t]],\n\t},  -- HOOK_PLAYER_RIGHT_CLICKING_ENTITY\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerShooting.lua",
    "content": "return\n{\n\tHOOK_PLAYER_SHOOTING =\n\t{\n\t\tCalledWhen = \"When the player releases the bow, shooting an arrow (other projectiles: unknown)\",\n\t\tDefaultFnName = \"OnPlayerShooting\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when the {{cPlayer|player}} shoots their bow. It is called for the actual\n\t\t\trelease of the {{cArrowEntity|arrow}}. FIXME: It is currently unknown whether other\n\t\t\t{{cProjectileEntity|projectiles}} (snowballs, eggs) trigger this hook.</p>\n\t\t\t<p>\n\t\t\tTo get the player's position and direction, use the {{cPlayer}}:GetEyePosition() and\n\t\t\tcPlayer:GetLookVector() functions. Note that for shooting a bow, the position for the arrow creation\n\t\t\tis not at the eye pos, some adjustments are required. FIXME: Export the {{cPlayer}} function for\n\t\t\tthis adjustment.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player shooting\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called, and finally\n\t\t\tCuberite creates the projectile. If the functino returns true, no other callback is called and no\n\t\t\tprojectile is created.\n\t\t]],\n\t},  -- HOOK_PLAYER_SHOOTING\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerSpawned.lua",
    "content": "return\n{\n\tHOOK_PLAYER_SPAWNED =\n\t{\n\t\tCalledWhen = \"After a player (re)spawns in the world to which they belong to.\",\n\t\tDefaultFnName = \"OnPlayerSpawned\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after a {{cPlayer|player}} has spawned in the world. It is called after\n\t\t\t{{OnLogin|HOOK_LOGIN}} and {{OnPlayerJoined|HOOK_PLAYER_JOINED}}, after the player name has been\n\t\t\tauthenticated, the initial worldtime, inventory and health have been sent to the player and the\n\t\t\tplayer spawn packet has been broadcast to all players near enough to the player spawn place. This is\n\t\t\ta notification-only event, plugins wishing to refuse player's entry should kick the player using the\n\t\t\t{{cPlayer}}:Kick() function.</p>\n\t\t\t<p>\n\t\t\tThis hook is also called when the player respawns after death (and a respawn packet is received from\n\t\t\tthe client, meaning the player has already clicked the Respawn button).\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who has (re)spawned\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called. If the function\n\t\t\treturns true, no other callbacks are called for this event. There is no overridable behavior.\n\t\t]],\n\t},  -- HOOK_PLAYER_SPAWNED\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerTossingItem.lua",
    "content": "return\n{\n\tHOOK_PLAYER_TOSSING_ITEM =\n\t{\n\t\tCalledWhen = \"A player is tossing an item. Plugin may override / refuse.\",\n\t\tDefaultFnName = \"OnPlayerTossingItem\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a {{cPlayer|player}} has tossed an item. The\n\t\t\t{{cPickup|pickup}} has not been spawned yet. Plugins may disallow the tossing, but in that case they\n\t\t\tneed to clean up - the player's client already thinks the item has been tossed so the\n\t\t\t{{cInventory|inventory}} needs to be re-sent to the player.</p>\n\t\t\t<p>\n\t\t\tTo get the item that is about to be tossed, call the {{cPlayer}}:GetEquippedItem() function.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player tossing an item\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and finally Cuberite\n\t\t\tcreates the pickup for the item and tosses it, using {{cPlayer}}:TossHeldItem, {{cPlayer}}:TossEquippedItem,\n\t\t\tor {{cPlayer}}:TossPickup. If the function returns true, no other callbacks are called for this event\n\t\t\tand Cuberite doesn't toss the item.\n\t\t]],\n\t},  -- HOOK_PLAYER_TOSSING_ITEM\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerUsedBlock.lua",
    "content": "return\n{\n\tHOOK_PLAYER_USED_BLOCK =\n\t{\n\t\tCalledWhen = \"A player has just used a block (chest, furnace...). Notification only.\",\n\t\tDefaultFnName = \"OnPlayerUsedBlock\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after a {{cPlayer|player}} has right-clicked a block that can be used, such as a\n\t\t\t{{cChestEntity|chest}} or a lever. It is called after Cuberite processes the usage (sends the UI\n\t\t\thandling packets / toggles redstone). Note that for UI-related blocks, the player is most likely\n\t\t\tstill using the UI. This is a notification-only event.</p>\n\t\t\t<p>\n\t\t\tNote that the block coords given in this callback are for the (solid) block that is being clicked,\n\t\t\tnot the air block between it and the player.</p>\n\t\t\t<p>\n\t\t\tTo get the world at which the right-click occurred, use the {{cPlayer}}:GetWorld() function.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnPlayerUsingBlock|HOOK_PLAYER_USING_BLOCK}} for a similar hook called before the\n\t\t\tuse, the {{OnPlayerUsingItem|HOOK_PLAYER_USING_ITEM}} and {{OnPlayerUsedItem|HOOK_PLAYER_USED_ITEM}}\n\t\t\tfor similar hooks called when a player interacts with any block with a usable item in hand, such as\n\t\t\ta bucket.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who used the block\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"Face of clicked block which has been clicked. One of the BLOCK_FACE_ constants\" },\n\t\t\t{ Name = \"CursorX\", Type = \"number\", Notes = \"X-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"CursorY\", Type = \"number\", Notes = \"Y-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"CursorZ\", Type = \"number\", Notes = \"Z-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"BlockType\", Type = \"number\", Notes = \"Block type of the clicked block\" },\n\t\t\t{ Name = \"BlockMeta\", Type = \"number\", Notes = \"Block meta of the clicked block\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called. If the function\n\t\t\treturns true, no other callbacks are called for this event.\n\t\t]],\n\t},  -- HOOK_PLAYER_USED_BLOCK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerUsedItem.lua",
    "content": "return\n{\n\tHOOK_PLAYER_USED_ITEM =\n\t{\n\t\tCalledWhen = \"A player has used an item in hand (bucket...)\",\n\t\tDefaultFnName = \"OnPlayerUsedItem\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after a {{cPlayer|player}} has right-clicked a block with an {{cItem|item}} that\n\t\t\tcan be used (is not placeable, is not food and clicked block is not use-able), such as a bucket or a\n\t\t\thoe. It is called after Cuberite processes the usage (places fluid / turns dirt to farmland).\n\t\t\tThis is an information-only hook, there is no way to cancel the event anymore.</p>\n\t\t\t<p>\n\t\t\tNote that the block coords given in this callback are for the (solid) block that is being clicked,\n\t\t\tnot the air block between it and the player.</p>\n\t\t\t<p>\n\t\t\tTo get the world at which the right-click occurred, use the {{cPlayer}}:GetWorld() function. To get\n\t\t\tthe item that the player is using, use the {{cPlayer}}:GetEquippedItem() function.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnPlayerUsingItem|HOOK_PLAYER_USING_ITEM}} for a similar hook called before the use,\n\t\t\tthe {{OnPlayerUsingBlock|HOOK_PLAYER_USING_BLOCK}} and {{OnPlayerUsedBlock|HOOK_PLAYER_USED_BLOCK}}\n\t\t\tfor similar hooks called when a player interacts with a block, such as a chest.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who used the item\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"Face of clicked block which has been clicked. One of the BLOCK_FACE_ constants\" },\n\t\t\t{ Name = \"CursorX\", Type = \"number\", Notes = \"X-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"CursorY\", Type = \"number\", Notes = \"Y-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"CursorZ\", Type = \"number\", Notes = \"Z-coord of the cursor crosshair on the block being clicked\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called. If the function\n\t\t\treturns true, no other callbacks are called for this event.\n\t\t]],\n\t},  -- HOOK_PLAYER_USED_ITEM\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerUsingBlock.lua",
    "content": "return\n{\n\tHOOK_PLAYER_USING_BLOCK =\n\t{\n\t\tCalledWhen = \"Just before a player uses a block (chest, furnace...). Plugin may override / refuse.\",\n\t\tDefaultFnName = \"OnPlayerUsingBlock\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a {{cPlayer|player}} has right-clicked a block that can be used, such as a\n\t\t\t{{cChestEntity|chest}} or a lever. It is called before Cuberite processes the usage (sends the UI\n\t\t\thandling packets / toggles redstone). Plugins may refuse the interaction by returning true.</p>\n\t\t\t<p>\n\t\t\tNote that the block coords given in this callback are for the (solid) block that is being clicked,\n\t\t\tnot the air block between it and the player.</p>\n\t\t\t<p>\n\t\t\tTo get the world at which the right-click occurred, use the {{cPlayer}}:GetWorld() function.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnPlayerUsedBlock|HOOK_PLAYER_USED_BLOCK}} for a similar hook called after the use, the\n\t\t\t{{OnPlayerUsingItem|HOOK_PLAYER_USING_ITEM}} and {{OnPlayerUsedItem|HOOK_PLAYER_USED_ITEM}} for\n\t\t\tsimilar hooks called when a player interacts with any block with a usable item in hand, such as a\n\t\t\tbucket.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who is using the block\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"Face of clicked block which has been clicked. One of the BLOCK_FACE_ constants\" },\n\t\t\t{ Name = \"CursorX\", Type = \"number\", Notes = \"X-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"CursorY\", Type = \"number\", Notes = \"Y-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"CursorZ\", Type = \"number\", Notes = \"Z-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"BlockType\", Type = \"number\", Notes = \"Block type of the clicked block\" },\n\t\t\t{ Name = \"BlockMeta\", Type = \"number\", Notes = \"Block meta of the clicked block\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and then Cuberite\n\t\t\tprocesses the interaction. If the function returns true, no other callbacks are called for this\n\t\t\tevent and the block is treated like any other block (i.e. if it's possible to place a torch on,\n\t\t\tit will be placed, and so on.)\n\t\t]],\n\t},  -- HOOK_PLAYER_USING_BLOCK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPlayerUsingItem.lua",
    "content": "return\n{\n\tHOOK_PLAYER_USING_ITEM =\n\t{\n\t\tCalledWhen = \"Just before a player uses an item in hand (bucket...). Plugin may override / refuse.\",\n\t\tDefaultFnName = \"OnPlayerUsingItem\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a {{cPlayer|player}} has right-clicked a block with an {{cItem|item}} that\n\t\t\tcan be used (is not placeable, is not food and clicked block is not use-able), such as a bucket or a\n\t\t\thoe. It is called before Cuberite processes the usage (places fluid / turns dirt to farmland).\n\t\t\tPlugins may refuse the interaction by returning true.</p>\n\t\t\t<p>\n\t\t\tNote that the block coords given in this callback are for the (solid) block that is being clicked,\n\t\t\tnot the air block between it and the player.</p>\n\t\t\t<p>\n\t\t\tTo get the world at which the right-click occurred, use the {{cPlayer}}:GetWorld() function. To get\n\t\t\tthe item that the player is using, use the {{cPlayer}}:GetEquippedItem() function.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnPlayerUsedItem|HOOK_PLAYER_USED_ITEM}} for a similar hook called after the use, the\n\t\t\t{{OnPlayerUsingBlock|HOOK_PLAYER_USING_BLOCK}} and {{OnPlayerUsedBlock|HOOK_PLAYER_USED_BLOCK}} for\n\t\t\tsimilar hooks called when a player interacts with a block, such as a chest.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who is using the item\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the clicked block\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"Face of clicked block which has been clicked. One of the BLOCK_FACE_ constants\" },\n\t\t\t{ Name = \"CursorX\", Type = \"number\", Notes = \"X-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"CursorY\", Type = \"number\", Notes = \"Y-coord of the cursor crosshair on the block being clicked\" },\n\t\t\t{ Name = \"CursorZ\", Type = \"number\", Notes = \"Z-coord of the cursor crosshair on the block being clicked\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and then Cuberite\n\t\t\tprocesses the interaction. If the function returns true, no other callbacks are called for this\n\t\t\tevent and the interaction is silently dropped.\n\t\t]],\n\t},  -- HOOK_PLAYER_USING_ITEM\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPluginMessage.lua",
    "content": "return\n{\n\tHOOK_PLUGIN_MESSAGE =\n\t{\n\t\tCalledWhen = \"The server receives a plugin message from a client\",\n\t\tDefaultFnName = \"OnPluginMessage\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tA plugin may implement an OnPluginMessage() function and register it as a Hook to process plugin messages\n\t\t\tfrom the players. The function is then called for every plugin message sent from any player.\n\t\t]],\n\t\tParams = {\n\t\t\t{ Name = \"Client\", Type = \"{{cClientHandle}}\", Notes = \"The client who sent the plugin message\" },\n\t\t\t{ Name = \"Channel\", Type = \"string\", Notes = \"The channel on which the message was sent\" },\n\t\t\t{ Name = \"Message\", Type = \"string\", Notes = \"The message's payload\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called. If the function\n\t\t\treturns true, no other callbacks are called for this event.\n\t\t]],\n\t},  -- HOOK_CHAT\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPluginsLoaded.lua",
    "content": "return\n{\n\tHOOK_PLUGINS_LOADED =\n\t{\n\t\tCalledWhen = \"All the enabled plugins have been loaded\",\n\t\tDefaultFnName = \"OnPluginsLoaded\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis callback gets called when the server finishes loading and initializing plugins. This is the\n\t\t\tperfect occasion for a plugin to query other plugins through {{cPluginManager}}:GetPlugin() and\n\t\t\tpossibly start communicating with them using the {{cPlugin}}:Call() function.\n\t\t]],\n\t\tParams = {},\n\t\tReturns = [[\n\t\t\tThe return value is ignored, all registered callbacks are called.\n\t\t]],\n\t\tCodeExamples =\n\t\t{\n\t\t\t{\n\t\t\t\tTitle = \"CoreMessaging\",\n\t\t\t\tDesc = [[\n\t\t\t\t\tThis example shows how to implement the CoreMessaging functionality - messages to players will be\n\t\t\t\t\tsent through the Core plugin, formatted by that plugin. As a fallback for when the Core plugin is\n\t\t\t\t\tnot present, the messages are sent directly by this code, unformatted.\n\t\t\t\t]],\n\t\t\t\tCode = [[\n-- These are the fallback functions used when the Core is not present:\nlocal function SendMessageFallback(a_Player, a_Message)\n\ta_Player:SendMessage(a_Message);\nend\n\nlocal function SendMessageSuccessFallback(a_Player, a_Message)\n\ta_Player:SendMessage(a_Message);\nend\n\nlocal function SendMessageFailureFallback(a_Player, a_Message)\n\ta_Player:SendMessage(a_Message);\nend\n\n-- These three \"variables\" will hold the actual functions to call.\n-- By default they are initialized to the Fallback variants,\n-- but will be redirected to Core when all plugins load\nSendMessage        = SendMessageFallback;\nSendMessageSuccess = SendMessageSuccessFallback;\nSendMessageFailure = SendMessageFailureFallback;\n\n-- The callback tries to connect to the Core\n-- If successful, overwrites the three functions with Core ones\nlocal function OnPluginsLoaded()\n\tlocal CorePlugin = cPluginManager:Get():GetPlugin(\"Core\");\n\tif (CorePlugin == nil) then\n\t\t-- The Core is not loaded, keep the Fallback functions\n\t\treturn;\n\tend\n\t\n\t-- Overwrite the three functions with Core functionality:\n\tSendMessage = function(a_Player, a_Message)\n\t\tCorePlugin:Call(\"SendMessage\", a_Player, a_Message);\n\tend\n\tSendMessageSuccess = function(a_Player, a_Message)\n\t\tCorePlugin:Call(\"SendMessageSuccess\", a_Player, a_Message);\n\tend\n\tSendMessageFailure = function(a_Player, a_Message)\n\t\tCorePlugin:Call(\"SendMessageFailure\", a_Player, a_Message);\n\tend\nend\n\n-- Global scope, register the callback:\ncPluginManager.AddHook(cPluginManager.HOOK_PLUGINS_LOADED, CoreMessagingPluginsLoaded);\n\n\n-- Usage, anywhere else in the plugin:\nSendMessageFailure(\n\ta_Player,\n\t\"Cannot teleport to player, the destination player \" .. PlayerName .. \" was not found\"\n);\n\t\t\t\t]],\n\t\t\t},\n\t\t} ,  -- CodeExamples\n\t},  -- HOOK_PLUGINS_LOADED\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPostCrafting.lua",
    "content": "return\n{\n\tHOOK_POST_CRAFTING =\n\t{\n\t\tCalledWhen = \"After the built-in recipes are checked and a recipe was found.\",\n\t\tDefaultFnName = \"OnPostCrafting\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a {{cPlayer|player}} changes contents of their\n\t\t\t{{cCraftingGrid|crafting grid}}, after the recipe has been established by Cuberite. Plugins may use\n\t\t\tthis to modify the resulting recipe or provide an alternate recipe.</p>\n\t\t\t<p>\n\t\t\tIf a plugin implements custom recipes, it should do so using the {{OnPreCrafting|HOOK_PRE_CRAFTING}}\n\t\t\thook, because that will save the server from going through the built-in recipes. The\n\t\t\tHOOK_POST_CRAFTING hook is intended as a notification, with a chance to tweak the result.</p>\n\t\t\t<p>\n\t\t\tNote that this hook is not called if a built-in recipe is not found;\n\t\t\t{{OnCraftingNoRecipe|HOOK_CRAFTING_NO_RECIPE}} is called instead in such a case.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who has changed their crafting grid contents\" },\n\t\t\t{ Name = \"Grid\", Type = \"{{cCraftingGrid}}\", Notes = \"The new crafting grid contents\" },\n\t\t\t{ Name = \"Recipe\", Type = \"{{cCraftingRecipe}}\", Notes = \"The recipe that Cuberite has decided to use (can be tweaked by plugins)\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called. If the function\n\t\t\treturns true, no other callbacks are called for this event. In either case, Cuberite uses the value\n\t\t\tof Recipe as the recipe to be presented to the player.\n\t\t]],\n\t},  -- HOOK_POST_CRAFTING\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnPreCrafting.lua",
    "content": "return\n{\n\tHOOK_PRE_CRAFTING =\n\t{\n\t\tCalledWhen = \"Before the built-in recipes are checked.\",\n\t\tDefaultFnName = \"OnPreCrafting\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a {{cPlayer|player}} changes contents of their\n\t\t\t{{cCraftingGrid|crafting grid}}, before the built-in recipes are searched for a match by Cuberite.\n\t\t\tPlugins may use this hook to provide a custom recipe.</p>\n\t\t\t<p>\n\t\t\tIf you intend to tweak built-in recipes, use the {{OnPostCrafting|HOOK_POST_CRAFTING}} hook, because\n\t\t\tthat will be called once the built-in recipe is matched.</p>\n\t\t\t<p>\n\t\t\tAlso note a third hook, {{OnCraftingNoRecipe|HOOK_CRAFTING_NO_RECIPE}}, that is called when Cuberite\n\t\t\tcannot find any built-in recipe for the given ingredients.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who has changed their crafting grid contents\" },\n\t\t\t{ Name = \"Grid\", Type = \"{{cCraftingGrid}}\", Notes = \"The new crafting grid contents\" },\n\t\t\t{ Name = \"Recipe\", Type = \"{{cCraftingRecipe}}\", Notes = \"The recipe that Cuberite will use. Modify this object to change the recipe\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and then Cuberite\n\t\t\tsearches the built-in recipes. The Recipe output parameter is ignored in this case.</p>\n\t\t\t<p>\n\t\t\tIf the function returns true, no other callbacks are called for this event and Cuberite uses the\n\t\t\trecipe stored in the Recipe output parameter.\n\t\t]],\n\t},  -- HOOK_PRE_CRAFTING\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnProjectileHitBlock.lua",
    "content": "return\n{\n\tHOOK_PROJECTILE_HIT_BLOCK =\n\t{\n\t\tCalledWhen = \"A projectile hits a solid block.\",\n\t\tDefaultFnName = \"OnProjectileHitBlock\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a {{cProjectileEntity|projectile}} hits a solid block..\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"ProjectileEntity\", Type = \"{{cProjectileEntity}}\", Notes = \"The projectile that hit an entity.\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"The X-coord where the projectile hit.\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"The Y-coord where the projectile hit.\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"The Z-coord where the projectile hit.\" },\n\t\t\t{ Name = \"BlockFace\", Type = \"number\", Notes = \"The side of the block where the projectile hit.\" },\n\t\t\t{ Name = \"BlockHitPos\", Type = \"Vector3d\", Notes = \"The exact position where the projectile hit.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event and the projectile flies through block..\n\t\t]],\n\t},  -- HOOK_PROJECTILE_HIT_BLOCK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnProjectileHitEntity.lua",
    "content": "return\n{\n\tHOOK_PROJECTILE_HIT_ENTITY =\n\t{\n\t\tCalledWhen = \"A projectile hits another entity.\",\n\t\tDefaultFnName = \"OnProjectileHitEntity\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a {{cProjectileEntity|projectile}} hits another entity.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"ProjectileEntity\", Type = \"{{cProjectileEntity}}\", Notes = \"The projectile that hit an entity.\" },\n\t\t\t{ Name = \"Entity\", Type = \"{{cEntity}}\", Notes = \"The entity wich was hit.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event and the projectile flies through the entity.\n\t\t]],\n\t},  -- HOOK_PROJECTILE_HIT_ENTITY\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnServerPing.lua",
    "content": "return\n{\n\tHOOK_SERVER_PING =\n\t{\n\t\tCalledWhen = \"Client pings the server from the server list.\",\n\t\tDefaultFnName = \"OnServerPing\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tA plugin may implement an OnServerPing() function and register it as a Hook to process pings from\n\t\t\tclients in the server server list. It can change the logged in players and player capacity, as well\n\t\t\tas the server description and the favicon, that are displayed to the client in the server list.</p>\n\t\t\t<p>\n\t\t\tThe client handle already has its protocol version assigned to it, so the plugin can check that; however,\n\t\t\tthere's no username associated with the client yet, and no player object.\n\t\t]],\n\t\tParams = {\n\t\t\t{ Name = \"ClientHandle\", Type = \"{{cClientHandle}}\", Notes = \"The client handle that pinged the server\" },\n\t\t\t{ Name = \"ServerDescription\", Type = \"string\", Notes = \"The server description\" },\n\t\t\t{ Name = \"OnlinePlayersCount\", Type = \"number\", Notes = \"The number of players currently on the server\" },\n\t\t\t{ Name = \"MaxPlayersCount\", Type = \"number\", Notes = \"The current player cap for the server\" },\n\t\t\t{ Name = \"Favicon\", Type = \"string\", Notes = \"The base64 encoded favicon to be displayed in the server list for compatible clients\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tThe plugin can return whether to continue processing of the hook with other plugins, the server description to\n\t\t\tbe displayed to the client, the currently online players, the player cap and the base64/png favicon data, in that order.\n\t\t]],\n\t\tCodeExamples = {\n\t\t\t{\n\t\t\t\tTitle = \"Change information returned to the player\",\n\t\t\t\tDesc = \"Tells the client that the server description is 'test', there are one more players online than there actually are, and that the player cap is zero. It also changes the favicon data.\",\n\t\t\t\tCode = [[\nfunction OnServerPing(ClientHandle, ServerDescription, OnlinePlayers, MaxPlayers, Favicon)\n\t-- Change Server Description\n\tServerDescription = \"Test\"\n\n\t-- Change online / max players\n\tOnlinePlayers = OnlinePlayers + 1\n\tMaxPlayers = 0\n\n\t-- Change favicon\n\tif cFile:IsFile(\"my-favicon.png\") then\n\t\tlocal FaviconData = cFile:ReadWholeFile(\"my-favicon.png\")\n\t\tif (FaviconData ~= \"\") and (FaviconData ~= nil) then\n\t\t\tFavicon = Base64Encode(FaviconData)\n\t\tend\n\tend\n\n\treturn false, ServerDescription, OnlinePlayers, MaxPlayers, Favicon\nend\t\t\t\t\n\t\t\t\t]],\n\t\t\t},\n\t\t},\n\t},  -- HOOK_SERVER_PING\n}\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnSpawnedEntity.lua",
    "content": "return\n{\n\tHOOK_SPAWNED_ENTITY =\n\t{\n\t\tCalledWhen = \"After an entity is spawned in the world.\",\n\t\tDefaultFnName = \"OnSpawnedEntity\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after the server spawns an {{cEntity|entity}}. This is an information-only\n\t\t\tcallback, the entity is already spawned by the time it is called. If the entity spawned is a\n\t\t\t{{cMonster|monster}}, the {{OnSpawnedMonster|HOOK_SPAWNED_MONSTER}} hook is called before this\n\t\t\thook.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnSpawningEntity|HOOK_SPAWNING_ENTITY}} hook for a similar hook called before the\n\t\t\tentity is spawned.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world in which the entity has spawned\" },\n\t\t\t{ Name = \"Entity\", Type = \"{{cEntity}} descentant\", Notes = \"The entity that has spawned\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event.\n\t\t]],\n\t},  -- HOOK_SPAWNED_ENTITY\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnSpawnedMonster.lua",
    "content": "return\n{\n\tHOOK_SPAWNED_MONSTER =\n\t{\n\t\tCalledWhen = \"After a monster is spawned in the world\",\n\t\tDefaultFnName = \"OnSpawnedMonster\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after the server spawns a {{cMonster|monster}}. This is an information-only\n\t\t\tcallback, the monster is already spawned by the time it is called. After this hook is called, the\n\t\t\t{{OnSpawnedEntity|HOOK_SPAWNED_ENTITY}} is called for the monster entity.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnSpawningMonster|HOOK_SPAWNING_MONSTER}} hook for a similar hook called before the\n\t\t\tmonster is spawned.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world in which the monster has spawned\" },\n\t\t\t{ Name = \"Monster\", Type = \"{{cMonster}} descendant\", Notes = \"The monster that has spawned\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event.\n\t\t]],\n\t},  -- HOOK_SPAWNED_MONSTER\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnSpawningEntity.lua",
    "content": "return\n{\n\tHOOK_SPAWNING_ENTITY =\n\t{\n\t\tCalledWhen = \"Before an entity is spawned in the world.\",\n\t\tDefaultFnName = \"OnSpawningEntity\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called before the server spawns an {{cEntity|entity}}. The plugin can either modify the\n\t\t\tentity before it is spawned, or disable the spawning altogether. You can't disable the spawning if the\n\t\t\tentity is a player. If the entity spawning is a monster, the {{OnSpawningMonster|HOOK_SPAWNING_MONSTER}}\n\t\t\thook is called before this hook.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnSpawnedEntity|HOOK_SPAWNED_ENTITY}} hook for a similar hook called after the\n\t\t\tentity is spawned.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world in which the entity will spawn\" },\n\t\t\t{ Name = \"Entity\", Type = \"{{cEntity}} descentant\", Notes = \"The entity that will spawn\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. Finally, the server\n\t\t\tspawns the entity with whatever parameters have been set on the {{cEntity}} object by the callbacks.\n\t\t\tIf the function returns true, no other callback is called for this event and the entity is not\n\t\t\tspawned.\n\t\t]],\n\t},  -- HOOK_SPAWNING_ENTITY\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnSpawningMonster.lua",
    "content": "return\n{\n\tHOOK_SPAWNING_MONSTER =\n\t{\n\t\tCalledWhen = \"Before a monster is spawned in the world.\",\n\t\tDefaultFnName = \"OnSpawningMonster\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called before the server spawns a {{cMonster|monster}}. The plugins may modify the\n\t\t\tmonster's parameters in the {{cMonster}} class, or disallow the spawning altogether. This hook is\n\t\t\tcalled before the {{OnSpawningEntity|HOOK_SPAWNING_ENTITY}} is called for the monster entity.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnSpawnedMonster|HOOK_SPAWNED_MONSTER}} hook for a similar hook called after the\n\t\t\tmonster is spawned.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world in which the entity will spawn\" },\n\t\t\t{ Name = \"Monster\", Type = \"{{cMonster}} descentant\", Notes = \"The monster that will spawn\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. Finally, the server\n\t\t\tspawns the monster with whatever parameters the plugins set in the cMonster parameter.</p>\n\t\t\t<p>\n\t\t\tIf the function returns true, no other callback is called for this event and the monster won't\n\t\t\tspawn.\n\t\t]],\n\t},  -- HOOK_SPAWNING_MONSTER\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnTakeDamage.lua",
    "content": "return\n{\n\tHOOK_TAKE_DAMAGE =\n\t{\n\t\tCalledWhen = \"An {{cEntity|entity}} is taking any kind of damage\",\n\t\tDefaultFnName = \"OnTakeDamage\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when any {{cEntity}} descendant, such as a {{cPlayer|player}} or a\n\t\t\t{{cMonster|mob}}, takes any kind of damage. The plugins may modify the amount of damage or effects\n\t\t\twith this hook by editting the {{TakeDamageInfo}} object passed.</p>\n\t\t\t<p>\n\t\t\tThis hook is called after the final damage is calculated, including all the possible weapon\n\t\t\t{{cEnchantments|enchantments}}, armor protection and potion effects.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"Receiver\", Type = \"{{cEntity}} descendant\", Notes = \"The entity taking damage\" },\n\t\t\t{ Name = \"TDI\", Type = \"{{TakeDamageInfo}}\", Notes = \"The damage type, cause and effects. Plugins may modify this object to alter the final damage applied.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called and then the server\n\t\t\tapplies the final values from the TDI object to Receiver. If the function returns true, no other\n\t\t\tcallbacks are called, and no damage nor effects are applied.\n\t\t]],\n\t},  -- HOOK_TAKE_DAMAGE\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnTick.lua",
    "content": "return\n{\n\tHOOK_TICK =\n\t{\n\t\tCalledWhen = \"Every server tick (approximately 20 times per second)\",\n\t\tDefaultFnName = \"OnTick\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called every game tick (50 msec, or 20 times a second). If the server is overloaded,\n\t\t\tthe interval is larger, which is indicated by the TimeDelta parameter.</p>\n\t\t\t<p>\n\t\t\tThis hook is called in the context of the server-tick thread, that is, the thread that takes care of\n\t\t\t{{cClientHandle|client connections}} before they're assigned to {{cPlayer|player entities}}, and\n\t\t\tprocessing console commands.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"TimeDelta\", Type = \"number\", Notes = \"The number of milliseconds elapsed since the last server tick. Will not be less than 50 msec.\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called. If the function\n\t\t\treturns true, no other callbacks are called. There is no overridable behavior.\n\t\t]],\n\t},  -- HOOK_TICK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnUpdatedSign.lua",
    "content": "return\n{\n\tHOOK_UPDATED_SIGN =\n\t{\n\t\tCalledWhen = \"After the sign text is updated. Notification only.\",\n\t\tDefaultFnName = \"OnUpdatedSign\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after a sign has had its text updated. The text is already updated at this\n\t\t\tpoint.</p>\n\t\t\t<p>The update may have been caused either by a {{cPlayer|player}} directly updating the sign, or by\n\t\t\ta plugin changing the sign text using the API.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnUpdatingSign|HOOK_UPDATING_SIGN}} hook for a similar hook called before the update,\n\t\t\twith a chance to modify the text.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world in which the sign resides\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the sign\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the sign\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the sign\" },\n\t\t\t{ Name = \"Line1\", Type = \"string\", Notes = \"1st line of the new text\" },\n\t\t\t{ Name = \"Line2\", Type = \"string\", Notes = \"2nd line of the new text\" },\n\t\t\t{ Name = \"Line3\", Type = \"string\", Notes = \"3rd line of the new text\" },\n\t\t\t{ Name = \"Line4\", Type = \"string\", Notes = \"4th line of the new text\" },\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who is changing the text. May be nil for non-player updates.\" }\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, other plugins' callbacks are called. If the function\n\t\t\treturns true, no other callbacks are called. There is no overridable behavior.\n\t\t]],\n\t},  -- HOOK_UPDATED_SIGN\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnUpdatingSign.lua",
    "content": "return\n{\n\tHOOK_UPDATING_SIGN =\n\t{\n\t\tCalledWhen = \"Before the sign text is updated. Plugin may modify the text / refuse.\",\n\t\tDefaultFnName = \"OnUpdatingSign\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when a sign text is about to be updated, either as a result of player's\n\t\t\tmanipulation or any other event, such as a plugin setting the sign text. Plugins may modify the text\n\t\t\tor refuse the update altogether.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnUpdatedSign|HOOK_UPDATED_SIGN}} hook for a similar hook called after the update.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"The world in which the sign resides\" },\n\t\t\t{ Name = \"BlockX\", Type = \"number\", Notes = \"X-coord of the sign\" },\n\t\t\t{ Name = \"BlockY\", Type = \"number\", Notes = \"Y-coord of the sign\" },\n\t\t\t{ Name = \"BlockZ\", Type = \"number\", Notes = \"Z-coord of the sign\" },\n\t\t\t{ Name = \"Line1\", Type = \"string\", Notes = \"1st line of the new text\" },\n\t\t\t{ Name = \"Line2\", Type = \"string\", Notes = \"2nd line of the new text\" },\n\t\t\t{ Name = \"Line3\", Type = \"string\", Notes = \"3rd line of the new text\" },\n\t\t\t{ Name = \"Line4\", Type = \"string\", Notes = \"4th line of the new text\" },\n\t\t\t{ Name = \"Player\", Type = \"{{cPlayer}}\", Notes = \"The player who is changing the text. May be nil for non-player updates.\" }\n\t\t},\n\t\tReturns = [[\n\t\t\tThe function may return up to five values. If the function returns true as the first value, no other\n\t\t\tcallbacks are called for this event and the sign is not updated. If the function returns no value or\n\t\t\tfalse as its first value, other plugins' callbacks are called.</p>\n\t\t\t<p>\n\t\t\tThe other up to four values returned are used to update the sign text, line by line, respectively.\n\t\t\tNote that other plugins may again update the texts (if the first value returned is false).\n\t\t]],\n\t\tCodeExamples =\n\t\t{\n\t\t\t{\n\t\t\t\tTitle = \"Add player signature\",\n\t\t\t\tDesc = \"The following example appends a player signature to the last line, if the sign is updated by a player:\",\n\t\t\t\tCode = [[\nfunction OnUpdatingSign(World, BlockX, BlockY, BlockZ, Line1, Line2, Line3, Line4, Player)\n\tif (Player == nil) then\n\t\t-- Not changed by a player\n\t\treturn false;\n\tend\n\n\t-- Sign with playername, allow other plugins to interfere:\n\treturn false, Line1, Line2, Line3, Line4 .. Player:GetName();\nend\n\t\t\t\t]],\n\t\t\t}\n\t\t} ,\n\t},  -- HOOK_UPDATING_SIGN\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnWeatherChanged.lua",
    "content": "return\n{\n\tHOOK_WEATHER_CHANGED =\n\t{\n\t\tCalledWhen = \"The weather has changed\",\n\t\tDefaultFnName = \"OnWeatherChanged\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called after the weather has changed in a {{cWorld|world}}. The new weather has already\n\t\t\tbeen sent to the clients.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnWeatherChanging|HOOK_WEATHER_CHANGING}} hook for a similar hook called before the\n\t\t\tchange.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World for which the weather has changed\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event. There is no overridable behavior.\n\t\t]],\n\t},  -- HOOK_WEATHER_CHANGED\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnWeatherChanging.lua",
    "content": "return\n{\n\tHOOK_WEATHER_CHANGING =\n\t{\n\t\tCalledWhen = \"The weather is about to change\",\n\t\tDefaultFnName = \"OnWeatherChanging\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called when the current weather has expired and a new weather is selected. Plugins may\n\t\t\toverride the new weather being set.</p>\n\t\t\t<p>\n\t\t\tThe new weather setting is sent to the clients only after this hook has been processed.</p>\n\t\t\t<p>\n\t\t\tSee also the {{OnWeatherChanged|HOOK_WEATHER_CHANGED}} hook for a similar hook called after the\n\t\t\tchange.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World for which the weather is changing\" },\n\t\t\t{ Name = \"Weather\", Type = \"number\", Notes = \"The newly selected weather. One of wSunny, wRain, wStorm\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tThe hook handler can return up to two values. If the first value is false or not present, the server\n\t\t\tcalls other plugins' callbacks and finally sets the weather. If it is true, the server doesn't call any\n\t\t\tmore callbacks for this hook. The second value returned is used as the new weather. If no value is\n\t\t\tgiven, the weather from the parameters is used as the weather. Returning false as the first value and a\n\t\t\tspecific weather constant as the second value makes the server call the rest of the hook handlers with\n\t\t\tthe new weather value.\n\t\t]],\n\t},  -- HOOK_WEATHER_CHANGING\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnWorldStarted.lua",
    "content": "return\n{\n\tHOOK_WORLD_STARTED =\n\t{\n\t\tCalledWhen = \"A {{cWorld|world}} is initialized\",\n\t\tDefaultFnName = \"OnWorldStarted\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called whenever a {{cWorld|world}} is initialized.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World that is started\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event. There is no overridable behavior.\n\t\t]],\n\t},  -- HOOK_WORLD_STARTED\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/Hooks/OnWorldTick.lua",
    "content": "return\n{\n\tHOOK_WORLD_TICK =\n\t{\n\t\tCalledWhen = \"Every world tick (about 20 times per second), separately for each world\",\n\t\tDefaultFnName = \"OnWorldTick\",  -- also used as pagename\n\t\tDesc = [[\n\t\t\tThis hook is called for each {{cWorld|world}} every tick (50 msec, or 20 times a second). If the\n\t\t\tworld is overloaded, the interval is larger, which is indicated by the TimeDelta parameter.</p>\n\t\t\t<p>\n\t\t\tThis hook is called in the world's tick thread context and thus has access to all world data\n\t\t\tguaranteed without blocking.\n\t\t]],\n\t\tParams =\n\t\t{\n\t\t\t{ Name = \"World\", Type = \"{{cWorld}}\", Notes = \"World that is ticking\" },\n\t\t\t{ Name = \"TimeDelta\", Type = \"number\", Notes = \"The number of milliseconds since the previous game tick. Will not be less than 50 msec\" },\n\t\t},\n\t\tReturns = [[\n\t\t\tIf the function returns false or no value, the next plugin's callback is called. If the function\n\t\t\treturns true, no other callback is called for this event. There is no overridable behavior.\n\t\t]],\n\t},  -- HOOK_WORLD_TICK\n}\n\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/InfoFile.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Cuberite - Info.lua file</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/InfoFile.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t\t<div id=\"content\">\n\t\t\t<h1>Info.lua file</h1>\n\t\t\t<h2>Contents</h2>\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"#Introduction\">Introduction</a></li>\n\t\t\t\t<li><a href=\"#Overall\">The overall structure</a></li>\n\t\t\t\t<li><a href=\"#AdditionalInfo\">AdditionalInfo table</a></li>\n\t\t\t\t<li><a href=\"#Commands\">Commands table</a></li>\n\t\t\t\t<li><a href=\"#ConsoleCommands\">ConsoleCommands table</a></li>\n\t\t\t\t<li><a href=\"#Permissions\">Permissions table</a></li>\n\t\t\t\t<li><a href=\"#Categories\">Categories table</a></li>\n\t\t\t\t<li><a href=\"#Using\">Using the file in code</a></li>\n\t\t\t\t<li><a href=\"#Examples\">Examples</a></li>\n\t\t\t</ul>\n\n\n\t\t\t<hr />\n\t\t\t<a name=\"Introduction\"><h2>Introduction</h2></a>\n\n\t\t\t<p>For a long time Cuberite plugins were plagued by poor documentation. The plugins worked, people who wrote them knew how to use them, but for anyone new to the plugin it was a terrible ordeal learning how to use it. Most of the times, the plugin authors only wrote what commands the plugin supported, sometimes not even that. Then, there was a call to action to put an end to this, to make documenting the plugins easy and at the same time centralized. Thus, the Info.lua file was born.</p>\n\n\t\t\t<p>Most plugins have some parts that are the same across all the plugins. These are commands, console commands and their permissions. If a plugin implemented a command, it would practically copy &amp; paste the same code over and over again. So it makes sense to extract only unique information, centralize it and automate all the parts around it. This was another reason for the Info.lua file - it is a central hub of commands, console commands and their permissions.</p>\n\n\t\t\t<p>Last, but not least, we want to make a plugin repository on the web in the future, a repository that would store plugins, their descriptions, comments. It makes sense that the centralized information can be parsed by the repository automatically, so that advanced things, such as searching for a plugin based on a command, or determining whether two plugins collide command-wise, are possible.</p>\n\n\t\t\t<p>A tool has been written that allows for an easy generation of the documentation for the plugin in various formats. It outputs the documentation in a format that is perfect for pasting into the forum. It generates documentation in a Markup format to use in README.md on GitHub and similar sites. The clever thing is that you don't need to keep all those formats in sync manually - you edit the Info.lua file and this tool will re-generate the documentation for you.\n\t\t\t<br>\n\t\t\tTo generate documentation for the plugin, activate the DumpInfo plugin on a cuberite server with your plugin installed, and use the webadmin interface to \"Dump\" the plugin information. This will create a README.md suitable for uploading to your git repo, and a forum_info.txt, which can be copy-pasted into a forum post.\n\t\t\t</p>\n\n\t\t\t<p>So to sum up, the Info.lua file contains the plugins' commands, console commands, their permissions and possibly the overall plugin documentation, in a structured manner that can be parsed by a program, yet is human readable and editable.</p>\n\n\n\t\t\t<hr />\n\t\t\t<a name=\"Overall\"><h2>The overall structure</h2></a>\n\n\t\t\t<p>The file consist of a declaration of a single Lua table, g_PluginInfo. This table contains all the information, structured, as its members. Each member can be a structure by itself. The entire file is a valid Lua source file, so any tool that syntax-checks Lua source can syntax-check this file. The file is somewhat forward- and backward- compatible, in the sense that it can be extended in any way without breaking.</p>\n\t\t\t<p>Here's a skeleton of the file:</p>\n<pre class=\"prettyprint lang-lua\">\ng_PluginInfo =\n{\n\tName = \"Example Plugin\",\n\tDate = \"2014-06-12\",\n\tDescription = \"This is an example plugin that shows how to use the Info.lua file\",\n\n\t-- The following members will be documented in greater detail later:\n\tAdditionalInfo = {},\n\tCommands = {},\n\tConsoleCommands = {},\n\tPermissions = {},\n\tCategories = {},\n}\n</pre>\n\t\t\t<p>As you can see, the structure is pretty straightforward. Note that the order of the elements inside the table is not important (Lua property).</p>\n\n\t\t\t<p>The first few elements are for book-keeping. They declare the plugin's name, the date in ISO-format, representing the version of the plugin, and the description. The idea is that the description sums up what the plugin is all about, within some two or three sentences.</p>\n\n\n\t\t\t<hr />\n\t\t\t<a name=\"AdditionalInfo\"><h2>AdditionalInfo table</h2></a>\n\n\t\t\t<p>This table is used for more detailed description of the plugin. If there is any non-trivial setup process, dependencies, describe them here. This is where the description should get detailed. Don't worry about using several paragraphs of text here, if it makes the plugin easier to understand.</p>\n\n\t\t\t<p>The table should have the following layout:</p>\n<pre class=\"prettyprint lang-lua\">\nAdditionalInfo =\n{\n\t{\n\t\tTitle = \"Chapter 1\",\n\t\tContents = \"Describe one big aspect of the plugin here\",\n\t},\n\t{\n\t\tTitle = \"Chapter 2\",\n\t\tContents = \"Describe another big topic\",\n\t},\n}\n</pre>\n\t\t\t<p>The idea here is that the tool that is used to generate the documentation from the Info.lua file will create a linkified table of contents and then each of the information elements' contents. This information should be all that is needed to successfully configure, run and manage the plugin.</p>\n\n\n\t\t\t<hr />\n\t\t\t<a name=\"Commands\"><h2>Commands table</h2></a>\n\n\t\t\t<p>The commands table lists all the commands that the plugin implements, together with their handler functions, required permissions, help strings and further information. The table supports recursion, which allows plugins to create multi-word commands easily (such as \"//schematic load\" and \"//schematic save\"), each having its own separate handler.</p>\n\n\t\t\t<p>The table uses structure similar to the following:</p>\n<pre class=\"prettyprint lang-lua\">\nCommands =\n{\n\t[\"/cmd1\"] =\n\t{\n\t\tHelpString = \"Performs the first action\",\n\t\tPermission = \"firstplugin.cmds.1\",\n\t\tAlias = \"/c1\",\n\t\tHandler = HandleCmd1,\n\t\tParameterCombinations =\n\t\t{\n\t\t\t{\n\t\t\t\tParams = \"x y z\",\n\t\t\t\tHelp = \"Performs the first action at the specified coordinates\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tParams = \"-p\",\n\t\t\t\tHelp = \"Performs the first action at the player's coordinates\",\n\t\t\t}\n\t\t},\n\t},\n\t[\"/cmd2\"] =\n\t{\n\t\tAlias = {\"/c2\", \"//c2\" },\n\t\tCategory = \"Something\",\n\t\tSubcommands =\n\t\t{\n\t\t\tsub1 =  -- This declares a \"/cmd2 sub1\" command\n\t\t\t{\n\t\t\t\tHelpString = \"Performs the second action's first subcommand\",\n\t\t\t\tPermission = \"firstplugin.cmds.2.1\",\n\t\t\t\tAlias = \"1\",\n\t\t\t\tHandler = HandleCmd2Sub1,\n\t\t\t\tParameterCombinations =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams = \"x y z\",\n\t\t\t\t\t\tHelp = \"Performs the second action's first subcommand at the specified coordinates\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tParams = \"-p\",\n\t\t\t\t\t\tHelp = \"Performs the second action's first subcommand at the player's coordinates\",\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tsub2 =  -- Declares a \"/cmd2 sub2\" command\n\t\t\t{\n\t\t\t\tHelpString = \"Performs the second action's second subcommand\",\n\t\t\t\tPermission = \"firstplugin.cmds.2.2\",\n\t\t\t\tHandler = HandleCmd2Sub2,\n\t\t\t},\n\t\t},\n\t},\n}\n</pre>\n\n\t\t<p>Although it may seem overwhelming at first, there is a \"method to this madness\". Each element of the Commands table defines one command. Most commands start with a slash, so the special Lua syntax for table elements with non-standard names needs to be applied (<code>[\"/cmd1\"] =</code>). The command can either specify subcommands, or a handler function (specifying both is UndefinedBehavior). Subcommands uses the same structure as the entire Commands table, recursively.</p>\n\n\t\t<p>The permission element specifies that the command is only available with the specified permission. Note that the permission for subcommand's parent isn't checked when the subcommand is called. This means that specifying the permission for a command that has subcommands has no effect whatsoever, but is discouraged because we may add processing for that in the future.</p>\n\n\t\t<p>The optional Categories table provides descriptions for command categories in the generated documentation. The documentation generator will group the commands by their specified Category (\"General\" by default) and each category will have the specified description written to it.</p>\n\n\t\t<p>The ParameterCombinations table is used only for generating the documentation, it lists the various combinations of parameters that the command supports. It's worth specifying even if the command supports only one combination, because that combination will get documented this way.</p>\n\n\t\t<p>The Alias member specifies any possible aliases for the command. Each alias is registered separately and if there is a subcommand table, it is applied to all aliases, just as one would expect. You can specify either a single string as the value (if there's only one alias), or a table of strings for multiple aliases. Commands with no aliases do not need to specify this member at all.</p>\n\n\n\t\t<hr />\n\t\t<a name=\"ConsoleCommands\"><h2>ConsoleCommands table</h2>\n\n\t\t<p>This table serves a purpose similar to that of the Commands table, only these commands are provided for the server console. Therefore, there are no permissions specified for these commands. Since most console commands don't use a leading slash, the command names don't need the special syntax. Also, the handler function doesn't receive the Player parameter.</p>\n\n\t\t<p>Here's an example of a ConsoleCommands table:</p>\n<pre class=\"prettyprint lang-lua\">\nConsoleCommands =\n{\n\tconcmd =\n\t{\n\t\tHelpString = \"Performs the console action\",\n\t\tSubcommands =\n\t\t{\n\t\t\tsub1 =\n\t\t\t{\n\t\t\t\tHelpString = \"Performs the console action's first subcommand\",\n\t\t\t\tHandler = HandleConCmdSub1,\n\t\t\t\tParameterCombinations =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tParams = \"x y z\",\n\t\t\t\t\t\tHelp = \"Performs the console action's first subcommand at the specified coordinates\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tsub2 =\n\t\t\t{\n\t\t\t\tHelpString = \"Performs the console action's second subcommand\",\n\t\t\t\tHandler = HandleConCmdSub2,\n\t\t\t},\n\t\t},\n\t},\n}\n</pre>\n\n\n\t\t\t<hr />\n\t\t\t<a name=\"Permissions\"><h2>Permissions table</h2></a>\n\n\t\t\t<p>The purpose of this table is to document permissions that the plugin uses. The documentation generator automatically collects the permissions specified in the Command table; the Permissions table adds a description for these permissions and may declare other permissions that aren't specifically included in the Command table.</p>\n\n<pre class=\"prettyprint lang-lua\">\nPermissions =\n{\n\t[\"firstplugin.cmd.1.1\"] =\n\t{\n\t\tDescription = \"Allows the players to build high towers using the first action.\",\n\t\tRecommendedGroups = \"players\",\n\t},\n\t[\"firstplugin.cmd.2.1\"] =\n\t{\n\t\tDescription = \"Allows the players to kill entities using the second action. Note that this may be misused to kill other players, too.\",\n\t\tRecommendedGroups = \"admins, mods\",\n\t},\n}\n</pre>\n\n\t\t\t<p>The RecommendedGroup element lists, in plain English, the intended groups for which the permission should be enabled on a typical server. Plugin authors are advised to create reasonable defaults, prefering security to openness, so that admins using these settings blindly don't expose their servers to malicious users.</p>\n\n\n\t\t\t<hr />\n\t\t\t<a name=\"Categories\"><h2>Categories</h2></a>\n\n\t\t\t<p>The optional Categories table provides descriptions for categories in the generated documentation. Commands can have categories with or without category descriptions in this table. The documentation generator will output a table of listed categories along with their description.</p>\n<pre class=\"prettyprint lang-lua\">\nCategories = \n{\n\tGeneral =\n\t{\n\t\tDescription = \"A general, yet somehow vague description of the default category.\"\n\t},\n\tSomething =\n\t{\n\t\tDescription = \"Some descriptive words which form sentences pertaining to this set of commands use and goals.\"\n\t},\n},\n</pre>\t\t\t\n\n\t\t\t<hr />\n\t\t\t<a name=\"Using\"><h2>Using the file in code</h2></a>\n\n\t\t\t<p>Just writing the Info.lua file and saving it to the plugin folder is not enough for it to actually be used. Your plugin needs to include the following boilerplate code, preferably in its Initialize() function:</p>\n<pre class=\"prettyprint lang-lua\">\n-- Use the InfoReg shared library to process the Info.lua file:\ndofile(cPluginManager:GetPluginsPath() .. \"/InfoReg.lua\")\nRegisterPluginInfoCommands()\nRegisterPluginInfoConsoleCommands()\n</pre>\n\n\t\t\t<p>Of course, if your plugin doesn't have any console commands, it doesn't need to call the RegisterPluginInfoConsoleCommands() function, and similarly if it doesn't have any in-game commands, it doesn't need to call the RegisterPluginInfoCommands() function.</p>\n\n\n\t\t\t<hr />\n\t\t\t<a name=\"Examples\"><h2>Examples</h2></a>\n\n\t\t\t<p>There are several plugins that already implement this approach. You can visit them for inspiration and to see what the generated documentation looks like:</p>\n\t\t\t<ul>\n\t\t\t\t<li>Gallery plugin: <a href=\"https://github.com/cuberite/gallery/blob/master/Info.lua\">Info.lua</a>, <a href=\"https://forum.cuberite.org/thread-1306.html\">Forum</a> documentation</li>\n\t\t\t\t<li>WorldEdit plugin: <a href=\"https://github.com/cuberite/WorldEdit/blob/master/Info.lua\">Info.lua</a>, <a href=\"https://forum.cuberite.org/thread-870.html\">Forum</a> and <a href=\"https://github.com/cuberite/WorldEdit\">MarkDown</a> documentation</li>\n\t\t\t</ul>\n\n\t\t\t<script>\n\t\t\t\tprettyPrint();\n\t\t\t</script>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "Server/Plugins/APIDump/LICENSE-prettify.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   Copyright 2011 Mike Samuel et al\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "Server/Plugins/APIDump/SettingUpDecoda.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\t<head>\n\t\t<title>Cuberite - Setting up Decoda</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/SettingUpDecoda.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t\t<div id=\"content\">\n\t\t<h1>Setting up the Decoda IDE</h1>\n\t\t<p>\n\t\tThis article will explain how to set up Decoda, an IDE for writing Lua code, so that you can develop Cuberite plugins with the comfort of an IDE.</p>\n\n\t\t<h2><img src=\"Static/decoda_logo.png\" /> About Decoda</h2>\n\n\t\t<p>To quickly introduce Decoda, it is an IDE for writing Lua code. It has the basic features expected of an IDE - you can group files into project, you can edit multiple files in a tabbed editor, the code is syntax-highlighted. Code completion, symbol browsing, and more. It also features a Lua debugger that allows you to debug your Lua code within any application that embeds the Lua runtime or uses Lua as a dynamic-link library (DLL). Although it is written using the multiplatform WxWidgets toolkit, it hasn't yet been ported to any platform other than 32-bit Windows. This unfortunately means that Linux users will not be able to use it. It can be used on 64-bit Windows, but the debugger only works for 32-bit programs.</p>\n\t\t<p>Here's a screenshot of a default Decoda window with the debugger stepping through the code (scaled down):<br />\n\t\t<img src=\"Static/decoda_workspace.png\" /></p>\n\t\t<p>As you can see, you can set breakpoints in the code, inspect variables' values, view both the Lua and native (C++) call-stacks. Decoda also breaks program execution when a faulty Lua script is executed, providing a detailed error message and pointing you directly to the faulting code. It is even possible to attach a C++ debugger to a process that is being debugged by Decoda, this way you can trap both C++ and Lua errors.</p>\n\t\t<p>Decoda is open-source, the sources are on GitHub: <a href=\"https://github.com/unknownworlds/decoda\">https://github.com/unknownworlds/decoda</a>. You can download a compiled binary from the creators' site, <a href=\"https://unknownworlds.com/decoda/\">https://unknownworlds.com/decoda/</a>.\n\n\t\t<h2><img src=\"Static/decoda_logo.png\" /> Project management</h2>\n\t\t<p>To begin using Decoda, you need to create a project, or load an existing one. Decoda projects have a .deproj extension, and are simply a list of Lua files that are to be opened. You can create a project through menu Project -> New Project. Save your project first, so that Decoda knows what relative paths to use for the files. Then either add existing Lua files or create new one, through menu Project -> Add Add New File / Add Existing File.</p>\n\t\t<p>Next you need to set up the executable that Decoda will run when debugging your files. Select menu Project -> Settings. A new dialog will open:<br />\n\t\t<img src=\"Static/decoda_debug_settings.png\" /></p>\n\t\t<p>In the debugging section, fill in the full path to Cuberite.exe, or click the triple-dot button to browse for the file. Note that the Working directory will be automatically filled in for you with the folder where the executable is (until the last backslash). This is how it's supposed to work, don't change it; if it for some reason doesn't update, copy and paste the folder name from the Command edit box. All done, you can close this dialog now.</p>\n\n\t\t<h2><img src=\"Static/decoda_logo.png\" /> Debugging</h2>\n\t\t<p>You are now ready to debug your code. Before doing that, though, don't forget to save your project file. If you haven't done so already, enable your plugin in the settings.ini file. If you want the program to break at a certain line, it is best to set the breakpoint before starting the program. Set the cursor on the line and hit F9 (or use menu Debug -> Toggle Breakpoint) to toggle a breakpoint on that line. Finally, hit F5, or select menu Debug -> Start to launch Cuberite under the debugger. The Cuberite window comes up and loads your plugin. If Decoda displays the Project Settings dialog instead, you haven't set up the executable to run, see the Project management section for instructions.</p>\n\t\t<p>At this point you will see that Decoda starts adding new items to your project. All the files for all plugins are added temporarily. Don't worry, they are only temporary, they will be removed again once the debugging session finishes. You can tell the temporary files from the regular files by their icon, it's faded out. Decoda handles all the files that Cuberite loads, so you can actually debug any of those faded files, too.</p>\n\t\t<p>If there's an error in the code, the Decoda window will flash and a dialog box will come up, describing the error and taking you to the line where it occured. Note that the execution is paused in the thread executing the plugin, so until you select Debug -> Continue from the menu (F5), Cuberite won't be fully running. You can fix the error and issue a \"reload\" command in Cuberite console to reload the plugin code anew (Cuberite doesn't detect changes in plugin code automatically).</p>\n\t\t<p>If the execution hits a breakpoint, the Decoda window will flash and a yellow arrow is displayed next to the line. You can step through the code using F10 and F11, just like in MSVS. You can also use the Watch window to inspect variable values, or simply hover your mouse over a variable to display its value in the tooltip.</p>\n\n\t\t<h2><img src=\"Static/decoda_logo.png\" /> Limitations</h2>\n\t\t<p>So far everything seems wonderful. Unfortunately, it doesn't always go as easy. There are several limits to what Decoda can do:</p>\n\t\t<ul>\n\t\t<li>When the program encounters a logical bug (using a nil value, calling a non-existent function etc.), Decoda will break, but usually the Watch window and the tooltips are showing nonsense values. You shouldn't trust them in such a case, if you kep running into such a problem regularly, put console logging functions (LOG) in the code to print out any info you need prior to the failure.</li>\n\t\t<li>Sometimes breakpoints just don't work. This is especially true if there are multiple plugins that have files of the same name. Breakpoints will never work after changing the code and reloading the plugin in Cuberite; you need to stop the server and start again to reenable breakpoints.</li>\n\t\t<li>Most weirdly, sometimes Decoda reports an error, but instead of opening the current version of the file, opens up another window with old contents of the file. Watch for this, because you could overwrite your new code if you saved this file over your newer file. Fortunately enough, Decoda will always ask you for a filename before saving such a file.</li>\n\t\t<li>Decoda stores the project in two files. The .deproj file has the file list, and should be put into version control systems. The .deuser file has the settings (debugged application etc.) and is per-user specific. This file shouldn't go to version control systems, because each user may have different paths for the debuggee.</li>\n\t\t<li>Unfortunately for us Windows users, the Decoda project file uses Unix-lineends (CR only). This makes it problematic when checking the file into a version control system, since those usually expect windows (CRLF) lineends; I personally convert the lineends each time I edit the project file using <a href=\"http://jsimlo.sk/notepad/\">TED Notepad</a>.</li>\n\t\t</ul>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "Server/Plugins/APIDump/SettingUpLuaLanguageServer.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\t<head>\n\t\t<title>Cuberite - Setting up the Lua-Language-Server (VSCode)</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/SettingUpLuaLanguageServer.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t\t<div id=\"content\">\n\t\t\t<h1>Setting up the Lua-Language-Server (VSCode)</h1>\n\t\t\t<p>This article will explain how to configure an IDE that is able to use the <a href=\"https://github.com/LuaLS/lua-language-server\">Lua-Language-Server</a>. This article will show how it's done using Visual Studio Code, but it should work with any IDE that supports language servers.</p>\n\n\t\t\t<h2>About Language Servers</h2>\n\n\t\t\t<p>IDE's in the past always implemented every programming language they supported on their own, it was baked in. Because of this everyone supported different features. With language servers this all changes. A single language server can be created with a community which can be shared across any number of IDE's which support the protocol. To learn more about language servers and IDE's that support them see <a href=\"https://langserver.org/\">langserver.org</a></p>\n\n\t\t\t<h2>First-time setup</h2>\n\t\t\t<p>Visual Studio Code doesn't support Lua by default. Instead it has a marketplace where extensions can be downloaded from. In this example we're going to use the Lua extension by Sumneko who also created the language server.</p>\n\n\t\t\t<img src=\"Static/vscode_lua_addon.png\" />\n\n\t\t\t<h3>Libraries</h3>\n\t\t\t<p>The extension doesn't know the Cuberite API by default. The extension, or rather the language server, supports the inclusion of libraries. In order to generate the definitions required by the language server you have to activate the APIDump plugin in Cuberite which is included by default but not enabled. When the plugin is enabled the entire API can be exported by using the 'api' command in the console. Once this has completed there is a new folder next to the Cuberite executable called LLS.</p>\n\t\t\t<p>In order to use these definition files you need to create a settings.json file in the plugin folder you're developing for. This file should be in a folder called '.vscode'. If it doesn't exist yet you have to create it yourself. There are two important settings to configure:\n\t\t\t\t<ul>\n\t\t\t\t\t<li><b>Lua.runtime.version</b> which has to be set to \"Lua 5.1\". Cuberite only supports Lua 5.1.</li>\n\t\t\t\t\t<li><b>Lua.workspace.library</b> which is an array containing all libraries used in the project. In this case it needs to point to the newly generated definition files. If you're developing your plugin using the same Cuberite instance as where you generated the definitions using the APIDump plugin you can set this to \"../../LLS/cuberite/library\". If your definitions are on a different location you will have to point to it yourself. Absolute paths are also supported.</li>\n\t\t\t\t</ul>\n\t\t\t</p>\n\n\t\t\t<p>After configuring your settings.json file would something like this:</p>\n\t\t\t<img src=\"Static/vscode_lua_settings.png\" />\n\t\t\t\n\t\t\t<p>After saving the settings.json file the IDE should recognize Cuberite's API.</p>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "Server/Plugins/APIDump/SettingUpZeroBrane.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\t<head>\n\t\t<title>Cuberite - Setting up ZeroBrane Studio</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/SettingUpZeroBrane.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t\t<div id=\"content\">\n\t\t<h1>Setting up the ZeroBrane Studio IDE</h1>\n\t\t<p>\n\t\tThis article will explain how to set up ZeroBrane Studio, an IDE for writing Lua code, so that you can develop Cuberite plugins with the comfort of an IDE.</p>\n\n\t\t<h2><img src=\"Static/zbs_logo.png\" /> About ZeroBrane Studio</h2>\n\n\t\t<p>To quickly introduce ZeroBrane Studio, it is an IDE for writing Lua code. It has the basic features expected of an IDE - it allows you to manage groups of files as a project, you can edit multiple files in a tabbed editor, the code is syntax-highlighted. Code completion, symbol browsing, and more. It also features a Lua debugger that allows you to debug your Lua code within any application that uses Lua and can load Lua packages. It is written using the multiplatform WxWidgets toolkit, and runs on multiple platforms, including Windows, Linux and MacOS.</p>\n\t\t<p>Here's a screenshot of a default ZBS window with the debugger stepping through the code (scaled down):<br />\n\t\t<img src=\"Static/zbs_workspace.png\" /></p>\n\t\t<p>As you can see, you can set breakpoints in the code, inspect variables' values, view the Lua call-stacks.</p>\n\t\t<p>ZBS is open-source, the sources are on GitHub: <a href=\"https://github.com/pkulchenko/ZeroBraneStudio\">https://github.com/pkulchenko/ZeroBraneStudio</a>. The project's homepage is at <a href=\"https://studio.zerobrane.com/\">https://studio.zerobrane.com/</a>.\n\n\t\t<h2><img src=\"Static/zbs_logo.png\" /> First-time setup</h2>\n\t\t<p>Since ZBS is a universal Lua IDE, you need to first set it up so that it is ready for Cuberite plugin development. For that, you need to download one file, <a href=\"https://raw.githubusercontent.com/pkulchenko/ZeroBranePackage/master/cuberite.lua\">cuberite.lua</a> from the <a href=\"https://github.com/pkulchenko/ZeroBranePackage\">ZBS's plugin repository</a>. Place that file in the \"packages\" folder inside your ZBS's folder. Note that there are other useful plugins in the repository and you may want to have a look there later on to further customize your ZBS. To install them, simply save them into the same folder.</p>\n\t\t<p>Next you should install the code-completion support specific for Cuberite. You should repeat this step from time to time, because the API evolves in time so new functions and classes are added to it quite often. You should have an APIDump plugin in your Cuberite installation. Enable the APIDump plugin in the server settings, it's very cheap to keep it enabled and it doesn't cost any performance during normal gameplay. To generate the code-completion support file, enter the <code style=\"background: #ddd; border: 1px solid #aaa\">api</code> command into the server console. This will create a new file, \"cuberite_api.lua\", next to the Cuberite executable. Move that file into the \"api/lua\" subfolder inside your ZBS's folder. (Note that if you had the \"mcserver_api.lua\" file from previous versions, you should remove it)</p>\n\t\t<p>After you download the cuberite.lua file and install the completion support, you need to restart ZBS in order for the plugin to load. If there are no errors, you should see two new items in the Project -> Lua Interpreter submenu: \"Cuberite - debug mode\" and \"Cuberite - release mode\". The only difference between the two is which filename they use to launch Cuberite - cuberite_debug(.exe) for the debug option and \"cuberite(.exe)\" for the release option. If you built your own Cuberite executable and you built it in debug mode, you should select the debug mode option. In all other cases, including if you downloaded the already-compiled Cuberite executable from the internet, you should select the release mode option.</p>\n\t\t<p>For a first time user, it might be a bit overwhelming that there are no GUI settings in the ZBS, yet the IDE is very configurable. There are two files that you edit in order to change settings, either system-wide (all users of the computer share those settings) or user-wide (the settings are only for a specific user of the computer). Those files are regular Lua sources and you can quickly locate them and edit them from within the IDE itself, select Edit -> Preferences -> Settings: XYZ from the menu, with XYZ being either System or User.</p>\n\t\t<p>There is a documentation on most of the settings on ZBS's webpage, have a look at <a href=\"https://studio.zerobrane.com/documentation.html\">https://studio.zerobrane.com/documentation.html</a>, especially the Preferences section. Personally I recommend setting editor.usetabs to true and possibly adjusting the editor.tabwidth, turn off the editor.smartindent feature and for debugging the option debugger.alloweditting should be set to true unless you feel like punishing yourself.</p>\n\n\t\t<h2><img src=\"Static/zbs_logo.png\" /> Project management</h2>\n\t\t<p>ZBS works with projects, it considers all files and subfolder in a specific folder to be a project. There's no need for a special project file nor for adding individual files to the workspace, all files are added automatically. To open a Cuberite plugin as the project, click the triple-dot button in the Project pane, or select Project -> Project directory -> Choose... from the menu. Browse and select the Cuberite plugin's folder. ZBS will load all the files in the plugin's folder and you can start editting code.</p>\n\t\t<p>Note that although ZBS allows you to work with subfolders in your plugins (and you should, especially with larger plugins), the current Cuberite ZBS plugin will not be able to start debugging unless you have a file open in the editor that is at the root level of the Cuberite plugin's folder.</p>\n\n\t\t<h2><img src=\"Static/zbs_logo.png\" /> Debugging</h2>\n\t\t<p>You are now ready to debug your code. Before doing that, though, don't forget to save your project files. If you haven't done so already, enable your plugin in the settings.ini file. If you want the program to break at a certain line, it is best to set the breakpoint before starting the program. Set the cursor on the line and hit F9 (or use menu Project -> Toggle Breakpoint) to toggle a breakpoint on that line. Finally, hit F5, or select menu Project -> Start Debugging to launch Cuberite under the debugger. The Cuberite window comes up and loads your plugin. If the window doesn't come up, inspect the Output pane in ZBS, there are usually two reasons for failure:<ul>\n\t\t\t<li>Your code in the currently open file has a hard syntax error. These are reported as \"Compilation error\" in the Output pane, double-click the line to go to the error</li>\n\t\t\t<li>ZBS cannot find the Cuberite executable. Make sure you are editting a file two or three levels down the folder hierarchy from the Cuberite executable and that the Cuberite executable is named properly (cuberite[.exe] or cuberite_debug[.exe]). Also make sure you have selected the right Interpreter (menu Project -> Lua Interpreter).</li>\n\t\t</ul></p>\n\t\t<p>Once running, if the execution hits a breakpoint, the ZBS window will come up and a green arrow is displayed next to the breakpoint line. You can step through the code using F10 (Step Into) and Shift+F10 (Step Over). You can also use the Watch window to inspect variable values, or simply hover your mouse over a variable to display its value in the tooltip. Use the Remote console pane to execute commands directly *inside* the Cuberite's plugin context.</p>\n\t\t<p>You can also use the Project -> Break menu item to break into the debugger as soon as possible. You can also set breakpoints while the Cuberite plugin is running. Note that due to the way in which the debugger is implemented, Cuberite may execute some more Lua code before the break / breakpoint comes into effect. If Cuberite is not executing any Lua code in your plugin, it will not break until the plugin code kicks in again. This may result in missed breakpoints and delays before the Break command becomes effective. Therefore it's best to set breakpoints before running the program, or while the program is waiting in another breakpoint.</p>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "Server/Plugins/APIDump/Static/.gitignore",
    "content": " \n"
  },
  {
    "path": "Server/Plugins/APIDump/UsingChunkStays.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Cuberite - Using ChunkStays</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/UsingChunkStays.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t\t<div id=\"content\">\n\t\t\t<h1>Using ChunkStays</h1>\n\t\t\t<p>\n\t\t\tA plugin may need to manipulate data in arbitrary chunks, and it needs a way to make the server\n\t\t\tguarantee that the chunks are available in memory.</p>\n\n\t\t\t<h2>The problem</h2>\n\t\t\t<p>\n\t\t\tUsually when plugins want to manipulate larger areas of world data, they need to make sure that the\n\t\t\tserver has the appropriate chunks loaded in the memory. When the data being manipulated can be further\n\t\t\taway from the connected players, or the data is being manipulated from a console handler, there is a\n\t\t\treal chance that the chunks are not loaded.</p>\n\t\t\t<p>\n\t\t\tThis gets even more important when using the <a href=\"cBlockArea.html\">cBlockArea</a> class for reading\n\t\t\tand writing. Those functions will fail when any of the required chunks aren't valid. This means that\n\t\t\teither the block area has incomplete data (Read() failed) or incomplete data has been written to the\n\t\t\tworld (Write() failed). Recovery from this is near impossible - you can't simply read or write again\n\t\t\tlater, because the world may have changed in the meantime.</p>\n\n\t\t\t<h2>The solution</h2>\n\t\t\t<p>\n\t\t\tThe naive solution would be to monitor chunk loads and unloads, and postpone the operations until all\n\t\t\tthe chunks are available. This would be quite ineffective and also very soon it would become very\n\t\t\tdifficult to maintain, if there were multiple code paths requiring this handling.</p>\n\t\t\t<p>\n\t\t\tAn alternate approach has been implemented, accessible through a single (somewhat hidden) function\n\t\t\tcall: <a href=\"cWorld.html\">cWorld:ChunkStay()</a>. All that this call basically does is, it tells the\n\t\t\tserver \"Load these chunks for me, and call this callback function once you have them all.\" And the\n\t\t\tserver does exactly that - it remembers the callback and asks the world loader / generator to provide\n\t\t\tthe chunks. Once the chunks become available, it calls the callback function for the plugin.</p>\n\t\t\t<p>\n\t\t\tThere are a few gotcha-s, though. If the code that was requesting the read or write had access to some\n\t\t\tof the volatile objects, such as <a href=\"cPlayer.html\">cPlayer</a> or\n\t\t\t<a href=\"cEntity.html\">cEntity</a> objects, those cannot be accessed by the callback anymore, because\n\t\t\tthey may have become invalid in the meantime - the player may have disconnected, the entity may have\n\t\t\tdespawned. So the callback must use the longer way to access such objects, such as calling\n\t\t\t<a href=\"cWorld.html\">cWorld:DoWithEntityByID()</a> or\n\t\t\t<a href=\"cWorld.html\">cWorld:DoWithPlayer()</a>.</p>\n\n\t\t\t<h2>The example</h2>\n\t\t\t<p>\n\t\t\tAs a simple example, consider a theoretical plugin that allows a player to save the immediate\n\t\t\tsurroundings of the spawn into a schematic file. The player issues a command to initiate the save, and\n\t\t\tthe plugin reads a 50 x 50 x 50 block area around the spawn into a cBlockArea and saves it on the disk\n\t\t\tas \"<PlayerName>_spawn.schematic\". When it's done with the saving, it wants to send a message to the\n\t\t\tplayer to let them know the command has succeeded.</p>\n\t\t\t<p>\n\t\t\tThe first attempt shows the naive approach. It simply reads the block area and saves it, then sends the\n\t\t\tmessage. I'll repeat once more, this code is <b>the wrong way</b> to do it!</p>\n<pre class=\"prettyprint lang-lua\">\nfunction HandleCommandSaveSpawn(a_Split, a_Player)\n\t-- Get the coords for the spawn:\n\tlocal SpawnX = a_Player:GetWorld():GetSpawnX()\n\tlocal SpawnY = a_Player:GetWorld():GetSpawnY()\n\tlocal SpawnZ = a_Player:GetWorld():GetSpawnZ()\n\tlocal Bounds = cCuboid(SpawnX - 25, SpawnY - 25, SpawnZ - 25, SpawnX + 25, SpawnY + 25, SpawnZ + 25)\n\tBounds:ClampY(0, 255)\n\n\t-- Read the area around spawn into a cBlockArea, save to file:\n\tlocal Area = cBlockArea()\n\tlocal FileName = a_Player:GetName() .. \"_spawn.schematic\"\n\tArea:Read(a_Player:GetWorld(), Bounds, cBlockArea.baTypes + cBlockArea.baMetas)\n\tArea:SaveToSchematicFile(FileName)\n\n\t-- Notify the player:\n\ta_Player:SendMessage(cCompositeChat(\"The spawn has been saved\", mtInfo))\n\treturn true\nend\n</pre>\n\t\t\t<p>\n\t\t\tNow if the player goes exploring far and uses the command to save their spawn, the chunks aren't\n\t\t\tloaded, so the BlockArea reading fails, the BlockArea contains bad data. Note that the plugin fails to\n\t\t\tdo any error checking and if the area isn't read from the world, it happily saves the incomplete data\n\t\t\tand says \"hey, everything's right\", althought it has just trashed any previous backup of the spawn\n\t\t\tschematic with nonsense data.</p>\n\t\t\t<hr/>\n\t\t\t<p>\n\t\t\tThe following script uses the ChunkStay method to alleviate chunk-related problems. This is <b>the\n\t\t\tright way</b> of doing it:</p>\n<pre class=\"prettyprint lang-lua\">\nfunction HandleCommandSaveSpawn(a_Split, a_Player)\n\t-- Get the coords for the spawn:\n\tlocal SpawnX = a_Player:GetWorld():GetSpawnX()\n\tlocal SpawnY = a_Player:GetWorld():GetSpawnY()\n\tlocal SpawnZ = a_Player:GetWorld():GetSpawnZ()\n\tlocal Bounds = cCuboid(SpawnX - 25, SpawnY - 25, SpawnZ - 25, SpawnX + 25, SpawnY + 25, SpawnZ + 25)\n\tBounds:ClampY(0, 255)\n\n\t-- Get a list of chunks that we need loaded:\n\tlocal MinChunkX = math.floor((SpawnX - 25) / 16)\n\tlocal MaxChunkX = math.ceil ((SpawnX + 25) / 16)\n\tlocal MinChunkZ = math.floor((SpawnZ - 25) / 16)\n\tlocal MaxChunkZ = math.ceil ((SpawnZ + 25) / 16)\n\tlocal Chunks = {}\n\tfor x = MinChunkX, MaxChunkX do\n\t\tfor z = MinChunkZ, MaxChunkZ do\n\t\t\ttable.insert(Chunks, {x, z})\n\t\tend\n\tend  -- for x\n\n\t-- Store the player's name and world to use in the callback, because the a_Player object may no longer be valid:\n\tlocal PlayerName = a_Player:GetName()\n\tlocal World = a_Player:GetWorld()\n\n\t-- This is the callback that is executed once all the chunks are loaded:\n\tlocal OnAllChunksAvailable = function()\n\t\t-- Read the area around spawn into a cBlockArea, save to file:\n\t\tlocal Area = cBlockArea()\n\t\tlocal FileName = PlayerName .. \"_spawn.schematic\"\n\t\tif (Area:Read(World, Bounds, cBlockArea.baTypes + cBlockArea.baMetas)) then\n\t\t\tArea:SaveToSchematicFile(FileName)\n\t\t\tMsg = cCompositeChat(\"The spawn has been saved\", mtInfo)\n\t\telse\n\t\t\tMsg = cCompositeChat(\"Cannot save the spawn\", mtFailure)\n\t\tend\n\n\t\t-- Notify the player:\n\t\t-- Note that we cannot use a_Player here, because it may no longer be valid (if the player disconnected before the command completes)\n\t\tWorld:DoWithPlayer(PlayerName,\n\t\t\tfunction (a_CBPlayer)\n\t\t\t\ta_CBPlayer:SendMessage(Msg)\n\t\t\tend\n\t\t)\n\tend\n\n\t-- Ask the server to load our chunks and notify us once it's done:\n\tWorld:ChunkStay(Chunks, nil, OnAllChunksAvailable)\n\n\t-- Note that code here may get executed before the callback is called!\n\t-- The ChunkStay says \"once you have the chunks\", not \"wait until you have the chunks\"\n\t-- So you can't notify the player here, because the saving needn't have occurred yet.\n\n\treturn true\nend\n</pre>\n\t\t\t<p>\n\t\t\tNote that this code does its error checking of the Area:Read() function, and it will not overwrite the\n\t\t\tprevious file unless it actually has the correct data. If you're wondering how the reading could fail\n\t\t\twhen we've got the chunks loaded, there's still the issue of free RAM - if the memory for the area\n\t\t\tcannot be allocated, it cannot be read even with all the chunks present. So we still do need that\n\t\t\tcheck.</p>\n\n\t\t\t<h2>The conclusion</h2>\n\t\t\t<p>\n\t\t\tAlthough it makes the code a little bit longer and is a bit more difficult to grasp at first, the\n\t\t\tChunkStay is a useful technique to add to your repertoire. It is to be used whenever you need access to\n\t\t\tchunks that may potentially be inaccessible, and you really need the data.</p>\n\t\t\t<p>Possibly the biggest hurdle in using the ChunkStay is the fact that it does its work in the\n\t\t\tbackground, thus invalidating all cPlayer and cEntity objects your function may hold, so you need to\n\t\t\tre-acquire them from their IDs and names. This is the penalty for using multi-threaded code.</p>\n\t\t\t<script>\n\t\t\t\tprettyPrint();\n\t\t\t</script>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "Server/Plugins/APIDump/WebWorldThreads.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Cuberite - Webserver vs World threads</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/WebWorldThreads.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t\t<div id=\"content\">\n\t\t\t<h1>Webserver vs World threads</h1>\n\t\t\t<p>\n\t\t\tThis article will explain the threading issues that arise between the webserver and world threads are of concern to plugin authors.</p>\n\t\t\t<p>\n\t\t\tGenerally, plugins that provide webadmin pages should be quite careful about their interactions. Most operations on Cuberite objects requires synchronization, that Cuberite provides automatically and transparently to plugins - when a block is written, the chunkmap is locked, or when an entity is being manipulated, the entity list is locked. Each plugin also has a mutex lock, so that only one thread at a time may be executing plugin code.</p>\n\t\t\t<p>\n\t\t\tThis locking can be a source of deadlocks for plugins that are not written carefully.</p>\n\n\t\t\t<h2>Example scenario</h2>\n\t\t\t<p>Consider the following example. A plugin provides a webadmin page that allows the admin to kick players off the server. When the admin presses the \"Kick\" button, the plugin calls cWorld:DoWithPlayer() with a callback to kick the player. Everything seems to be working fine now.</p>\n\t\t\t<p>\n\t\t\tA new feature is developed in the plugin, now the plugin adds a new in-game command so that the admins can kick players while they're playing the game. The plugin registers a command callback with cPluginManager.AddCommand(). Now there are problems bound to happen.</p>\n\t\t\t<p>\n\t\t\tSuppose that two admins are in, one is using the webadmin and the other is in-game. Both try to kick a player at the same time. The webadmin locks the plugin, so that it can execute the plugin code, but right at this moment the OS switches threads. The world thread locks the world so that it can access the list of in-game commands, receives the in-game command, it tries to lock the plugin. The plugin is already locked, so the world thread is put on hold. After a while, the webadmin thread is woken up again and continues processing. It tries to lock the world so that it can traverse the playerlist, but the lock is already held by the world thread. Now both threads are holding one lock each and trying to grab the other lock, and are therefore deadlocked.</p>\n\n\t\t\t<h2>How to avoid the deadlock</h2>\n\t\t\t<p>\n\t\t\tThere are two main ways to avoid such a deadlock. The first approach is using tasks: Everytime you need to execute a task inside a world, instead of executing it, queue it, using <a href=\"cWorld.html\">cWorld</a>:QueueTask(). This handy utility can will call the given function inside the world's TickThread, thus eliminating the deadlock, because now there's only one thread. However, this approach will not let you get data back. You cannot query the player list, or the entities, or anything - because when the task runs, the webadmin page has already been served to the browser.</p>\n\t\t\t<p>\n\t\t\tTo accommodate this, you'll need to use the second approach - preparing and caching data in the tick thread, possibly using callbacks. This means that the plugin will have global variables that will store the data, and update those variables when the data changes; then the webserver thread will only read those variables, instead of calling the world functions. For example, if a webpage was to display the list of currently connected players, the plugin should maintain a global variable, g_WorldPlayers, which would be a table of worlds, each item being a list of currently connected players. The webadmin handler would read this variable and create the page from it; the plugin would use HOOK_PLAYER_JOINED and HOOK_DISCONNECT to update the variable.</p>\n\n\t\t\t<h2>What to avoid</h2>\n\t\t\t<p>\n\t\t\tNow that we know what the danger is and how to avoid it, how do we know if our code is susceptible?</p>\n\t\t\t<p>\n\t\t\tThe general rule of thumb is to avoid calling any functions that read or write lists of things in the webserver thread. This means most ForEach() and DoWith() functions. Only <a href=\"cRoot.html\">cRoot</a>:ForEachWorld() is safe - because the list of worlds is not expected to change, so it is not guarded by a mutex. Getting and setting world's blocks is, naturally, unsafe, as is calling other plugins, or creating entities.</p>\n\n\t\t\t<h2>Example</h2>\n\t\t\tThe Core has the facility to kick players using the web interface. It used the following code for the kicking (inside the webadmin handler):\n<pre class=\"prettyprint lang-lua\">\nlocal KickPlayerName = Request.Params[\"players-kick\"]\nlocal FoundPlayerCallback = function(Player)\n\tif (Player:GetName() == KickPlayerName) then\n\tPlayer:GetClientHandle():Kick(\"You were kicked from the game!\")\n\tend\nend\ncRoot:Get():FindAndDoWithPlayer(KickPlayerName, FoundPlayerCallback)\n</pre>\nThe cRoot:FindAndDoWithPlayer() is unsafe and could have caused a deadlock. The new solution is queue a task; but since we don't know in which world the player is, we need to queue the task to all worlds:\n<pre class=\"prettyprint lang-lua\">\ncRoot:Get():ForEachWorld(    -- For each world...\n\tfunction(World)\n\tWorld:QueueTask(         -- ... queue a task...\n\t\tfunction(a_World)\n\t\ta_World:DoWithPlayer(KickPlayerName,  -- ... to walk the playerlist...\n\t\t\tfunction (a_Player)\n\t\t\ta_Player:GetClientHandle():Kick(\"You were kicked from the game!\")  -- ... and kick the player\n\t\t\tend\n\t\t)\n\t\tend\n\t)\n\tend\n)\n</pre>\n\t\t\t<script>\n\t\t\t\tprettyPrint();\n\t\t\t</script>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "Server/Plugins/APIDump/Writing-a-Cuberite-plugin.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\t<head>\n\t\t<title>Cuberite Plugin Tutorial</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/Writing-a-Cuberite-plugin.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t\t<div id=\"content\">\n\t\t\t<h1>Writing a Cuberite plugin</h1>\n\t\t\t<p>\n\t\t\tThis article will explain how to write a basic plugin. It details basic requirements\n\t\t\tfor a plugin, explains how to register a hook and bind a command, and gives plugin\n\t\t\tstandards details.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\tLet us begin. In order to begin development, we must firstly obtain a compiled copy\n\t\t\tof Cuberite, and make sure that the Core plugin is within the Plugins folder, and activated.\n\t\t\tCore handles much of the Cuberite end-user experience and gameplay will be very bland without it.\n\t\t\t</p>\n\t\t\t<h2>Creating the basic template</h2>\n\t\t\t<p>\n\t\t\tPlugins are written in Lua. Therefore, create a new Lua file. You can create as many files as you wish, with\n\t\t\tany filename - Cuberite bungs them all together at runtime, however, let us create a file called main.lua for now.\n\t\t\tFormat it like so:\n\t\t\t</p>\n\t\t\t<pre class=\"prettyprint lang-lua\">\nPLUGIN = nil\n\nfunction Initialize(Plugin)\n\tPlugin:SetName(\"NewPlugin\")\n\tPlugin:SetVersion(1)\n\n\t-- Hooks\n\n\tPLUGIN = Plugin -- NOTE: only needed if you want OnDisable() to use GetName() or something like that\n\n\t-- Command Bindings\n\n\tLOG(\"Initialised version \" .. Plugin:GetVersion())\n\treturn true\nend\n\nfunction OnDisable()\n\tLOG(\"Shutting down...\")\nend\n\t\t\t</pre>\n\t\t\t<p>\n\t\t\tNow for an explanation of the basics.\n\t\t\t<ul>\n\t\t\t\t<li><b>function Initialize</b> is called on plugin startup. It is the place where the plugin is set up.</li>\n\t\t\t\t<li><b>Plugin:SetName</b> sets the name of the plugin.</li>\n\t\t\t\t<li><b>Plugin:SetVersion</b> sets the revision number of the plugin. This must be an integer.</li>\n\t\t\t\t<li><b>LOG</b> logs to console a message, in this case, it prints that the plugin was initialised. This will add a prefix with the name of your plugin.</li>\n\t\t\t\t<li>The <b>PLUGIN</b> variable just stores this plugin's object, so GetName() can be called in OnDisable (as no Plugin parameter is passed there, contrary to Initialize).\n\t\t\t\t\tThis global variable is only needed if you want to know the plugin details (name, etc.) when shutting down.</li>\n\t\t\t\t<li><b>function OnDisable</b> is called when the plugin is disabled, commonly when the server is shutting down. Perform cleanup and logging here.</li>\n\t\t\t</ul>\n\t\t\tBe sure to return true for this function, else Cuberite thinks you plugin had failed to initialise and prints a stacktrace with an error message.\n\t\t\t</p>\n\n\t\t\t<h2>Registering hooks</h2>\n\t\t\t<p>\n\t\t\tHooks are things that Cuberite calls when an internal event occurs. For example, a hook is fired when a player places a block, moves,\n\t\t\tlogs on, eats, and many other things. For a full list, see <a href=\"index.html\">the API documentation</a>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\tA hook can be either informative or overridable. In any case, returning false will not trigger a response, but returning true will cancel\n\t\t\tthe hook and prevent it from being propagated further to other plugins. An overridable hook simply means that there is visible behaviour\n\t\t\tto a hook's cancellation, such as a chest being prevented from being opened. There are some exceptions to this where only changing the value the\n\t\t\thook passes has an effect, and not the actual return value, an example being the HOOK_KILLING hook. See the API docs for details.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\tTo register a hook, insert the following code template into the \"-- Hooks\" area in the previous code example.\n\t\t\t</p>\n\t\t\t<pre class=\"prettyprint lang-lua\">\ncPluginManager.AddHook(cPluginManager.HOOK_NAME_HERE, FunctionNameToBeCalled)\n\t\t\t</pre>\n\t\t\t<p>\n\t\t\tWhat does this code do?\n\t\t\t<ul>\n\t\t\t\t<li><b>cPluginManager.AddHook</b> registers the hook. The hook name is the second parameter. See the previous API documentation link for a list of all hooks.</li>\n\t\t\t</ul>\n\t\t\tWhat about the third parameter, you ask? Well, it is the name of the function that Cuberite calls when the hook fires. It is in this\n\t\t\tfunction that you should handle or cancel the hook.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\tSo in total, this is a working representation of what we have so far covered.\n\t\t\t</p>\n\t\t\t<pre class=\"prettyprint lang-lua\">\nfunction Initialize(Plugin)\n\tPlugin:SetName(\"DerpyPlugin\")\n\tPlugin:SetVersion(1)\n\n\tcPluginManager.AddHook(cPluginManager.HOOK_PLAYER_MOVING, OnPlayerMoving)\n\n\tLOG(\"Initialised \" .. Plugin:GetName() .. \" v.\" .. Plugin:GetVersion())\n\treturn true\nend\n\nfunction OnPlayerMoving(Player) -- See API docs for parameters of all hooks\n\treturn true -- Prohibit player movement, see docs for whether a hook is cancellable\nend\n\t\t\t</pre>\n\t\t\t<p>\n\t\t\tSo, that code stops the player from moving. Not particularly helpful, but yes :P. Note that ALL documentation is available\n\t\t\ton the main API docs page, so if ever in doubt, go there.\n\t\t\t</p>\n\t\t\t<h2>Binding a command</h2>\n\t\t\t<h3>Format</h3>\n\t\t\t<p>\n\t\t\tSo now we know how to hook into Cuberite, how do we bind a command, such as /explode, for a player to type? That is more complicated.\n\t\t\tWe firstly add this template to the \"-- Command bindings\" section of the initial example:\n\t\t\t</p>\n\t\t\t<pre class=\"prettyprint lang-lua\">\n-- ADD THIS IF COMMAND DOES NOT REQUIRE A PARAMETER (/explode)\ncPluginManager.BindCommand(\"/commandname\", \"permissionnode\", FunctionToCall, \" - Description of command\")\n\n-- ADD THIS IF COMMAND DOES REQUIRE A PARAMETER (/explode Notch)\ncPluginManager.BindCommand(\"/commandname\", \"permissionnode\", FunctionToCall, \" ~ Description of command and parameter(s)\")\n\t\t\t</pre>\n\t\t\t<p>\n\t\t\tWhat does it do, and why are there two?\n\t\t\t<ul>\n\t\t\t\t<li><b>PluginManager:BindCommand</b> binds a command. It takes the command name (with a slash), the permission a player needs to execute the command, the function\n\t\t\t\tto call when the command is executed, and a description of the command.</li>\n\t\t\t</ul>\n\t\t\tThe command name is pretty self explanatory. The permission node is basically just a <b>string</b> that the player's group needs to have, so you can have anything in there,\n\t\t\tthough we recommend a style such as \"derpyplugin.explode\". The function to call is like the ones with Hooks, but with some fixed parameters which we will come on to later,\n\t\t\tand the description is a description of the command which is shown when \"/help\" is typed.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\tSo why are there two? Standards. A plugin that accepts a parameter MUST use a format for the description of \" ~ Description of command and parms\"\n\t\t\twhereas a command that doesn't accept parameters MUST use \" - Description of command\" instead. Be sure to put a space before the tildes or dashes.\n\t\t\tAdditionally, try to keep the description brief and on one line on the client.\n\t\t\t</p>\n\t\t\t<h3>Parameters</h3>\n\t\t\t<p>\n\t\t\tWhat parameters are in the function Cuberite calls when the command is executed? A 'Split' array and a 'Player' object.\n\t\t\t</p>\n\t\t\t<h4>The Split Array</h4>\n\t\t\t<p>\n\t\t\tThe Split array is an array of all text submitted to the server, including the actual command. Cuberite automatically splits the text into the array,\n\t\t\tso plugin authors do not need to worry about that. An example of a Split array passed for the command, \"/derp zubby explode\" would be:<br /><br />\n\t\t\t\t&nbsp&nbsp /derp (Split[1])<br />\n\t\t\t\t&nbsp&nbsp zubby (Split[2])<br />\n\t\t\t\t&nbsp&nbsp explode (Split[3])<br />\n\t\t\t\t<br />\n\t\t\t\t&nbsp&nbsp The total amount of parameters passed were: 3 (#Split)\n\t\t\t</p>\n\t\t\t<h4>The Player Object and sending them messages</h4>\n\t\t\t<p>\n\t\t\tThe Player object is basically a pointer to the player that has executed the command. You can do things with them, but most common is sending\n\t\t\ta message. Again, see the API documentation for fuller details. But, you ask, how <i>do</i> we send a message to the client?\n\t\t\t</p>\n\t\t\t<p>\n\t\t\tThere are dedicated functions used for sending a player formatted messages. By format, I refer to coloured prefixes/coloured text (depending on configuration)\n\t\t\tthat clearly categorise what type of message a player is being sent. For example, an informational message has a yellow coloured [INFO] prefix, and a warning message\n\t\t\thas a rose coloured [WARNING] prefix. A few of the most used functions are listed here, but see the API docs for more details. Look in the cRoot, cWorld, and cPlayer sections\n\t\t\tfor functions that broadcast to the entire server, the whole world, and a single player, respectively.\n\t\t\t</p>\n\t\t\t<pre class=\"prettyprint lang-lua\">\n-- Format: §yellow[INFO] §white%text% (yellow [INFO], white text following it)\n-- Use: Informational message, such as instructions for usage of a command\nPlayer:SendMessageInfo(\"Usage: /explode [player]\")\n\n-- Format: §green[INFO] §white%text% (green [INFO] etc.)\n-- Use: Success message, like when a command executes successfully\nPlayer:SendMessageSuccess(\"Notch was blown up!\")\n\n-- Format: §rose[INFO] §white%text% (rose coloured [INFO] etc.)\n-- Use: Failure message, like when a command was entered correctly but failed to run, such as when the destination player wasn't found in a /tp command\nPlayer:SendMessageFailure(\"Player Salted was not found\")\n\t\t\t</pre>\n\t\t\t<p>\n\t\t\tThose are the basics. If you want to output text to the player for a reason other than the three listed above, and you want to colour the text, simply concatenate\n\t\t\t\"cChatColor.*colorhere*\" with your desired text, concatenate being \"..\". See the API docs for more details of all colours, as well as details on logging to console with\n\t\t\tLOG(\"Text\").\n\t\t\t</p>\n\t\t\t<h2>Final example and conclusion</h2>\n\t\t\t<p>\n\t\t\tSo, a working example that checks the validity of a command, and blows up a player, and also refuses pickup collection to players with >100ms ping.\n\t\t\t</p>\n\t\t\t<pre class=\"prettyprint lang-lua\">\nfunction Initialize(Plugin)\n\tPlugin:SetName(\"DerpyPluginThatBlowsPeopleUp\")\n\tPlugin:SetVersion(9001)\n\n\tcPluginManager.BindCommand(\"/explode\", \"derpyplugin.explode\", Explode, \" ~ Explode a player\");\n\n\tcPluginManager:AddHook(cPluginManager.HOOK_COLLECTING_PICKUP, OnCollectingPickup)\n\n\tLOG(\"Initialised \" .. Plugin:GetName() .. \" v.\" .. Plugin:GetVersion())\n\treturn true\nend\n\nfunction Explode(Split, Player)\n\tif (#Split ~= 2) then\n\t\t-- There was more or less than one argument (excluding the \"/explode\" bit)\n\t\t-- Send the proper usage to the player and exit\n\t\tPlayer:SendMessage(\"Usage: /explode [playername]\")\n\t\treturn true\n\tend\n\n\t-- Create a callback ExplodePlayer with parameter Explodee, which Cuberite calls for every player on the server\n\tlocal HasExploded = false\n\tlocal ExplodePlayer = function(Explodee)\n\t\t-- If the player name matches exactly\n\t\tif (Explodee:GetName() == Split[2]) then\n\t\t\t-- Create an explosion of force level 2 at the same position as they are\n\t\t\t-- see <a href=\"cWorld.html\">API docs</a> for further details of this function\n\t\t\tPlayer:GetWorld():DoExplosionAt(2, Explodee:GetPosX(), Explodee:GetPosY(), Explodee:GetPosZ(), false, esPlugin)\n\t\t\tPlayer:SendMessageSuccess(Split[2] .. \" was successfully exploded\")\n\t\t\tHasExploded = true;\n\t\t\treturn true -- Signalize to Cuberite that we do not need to call this callback for any more players\n\t\tend\n\tend\n\n\t-- Tell Cuberite to loop through all players and call the callback above with the Player object it has found\n\tcRoot:Get():FindAndDoWithPlayer(Split[2], ExplodePlayer)\n\n\tif not(HasExploded) then\n\t\t-- We have not broken out so far, therefore, the player must not exist, send failure\n\t\tPlayer:SendMessageFailure(Split[2] .. \" was not found\")\n\tend\n\n\treturn true\nend\n\nfunction OnCollectingPickup(Player, Pickup) -- Again, see the API docs for parameters of all hooks. In this case, it is a Player and Pickup object\n\tif (Player:GetClientHandle():GetPing() > 100) then -- Get ping of player, in milliseconds\n\t\treturn true -- Discriminate against high latency - you don't get drops :D\n\telse\n\t\treturn false -- You do get the drops! Yay~\n\tend\nend\n\t\t\t</pre>\n\t\t\t<p>\n\t\t\tMake sure to read the comments for a description of what everything does. Also be sure to return true for all <b>command</b> handlers, unless you want Cuberite to print out an \"Unknown command\" message\n\t\t\twhen the command gets executed :P. Make sure to follow standards - use CoreMessaging.lua functions for messaging, dashes for no parameter commands and tildes for vice versa,\n\t\t\tand finally, <a href=\"index.html\">the API documentation</a> is your friend!\n\t\t\t</p>\n\t\t\t<p>\n\t\t\tHappy coding ;)\n\t\t\t</p>\n\n\t\t\t<script>\n\t\t\t\tprettyPrint();\n\t\t\t</script>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "Server/Plugins/APIDump/_preload.lua",
    "content": "\n-- _preload.lua\n\n-- First thing executed when the plugin loads. Replaces the global environment (_G) with an empty table\n-- with __index set to the old environment. This way any function or variable that is created globally by the plugin\n-- won't be reported as new or undocumented.\n\n\n\n\n\nlocal newEnv, oldEnv = {}, _G\nlocal setmetatable = setmetatable\nfor k, v in pairs(_G) do\n\tnewEnv[k] = v;\n\toldEnv[k] = nil;\nend\n_G = setmetatable(oldEnv, {__index = newEnv});\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/lang-lua.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\u00a0\"],[\"str\",/^(?:\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$))/,null,\"\\\"'\"]],[[\"com\",/^--(?:\\[(=*)\\[[\\S\\s]*?(?:]\\1]|$)|[^\\n\\r]*)/],[\"str\",/^\\[(=*)\\[[\\S\\s]*?(?:]\\1]|$)/],[\"kwd\",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\\b/,null],[\"lit\",/^[+-]?(?:0x[\\da-f]+|(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:e[+-]?\\d+)?)/i],\n[\"pln\",/^[_a-z]\\w*/i],[\"pun\",/^[^\\w\\t\\n\\r \\xa0][^\\w\\t\\n\\r \"'+=\\xa0-]*/]]),[\"lua\"]);\n"
  },
  {
    "path": "Server/Plugins/APIDump/lualanguageserver.lua",
    "content": "-- lualanguageserver.lua\n\n-- Implements the code for exporting definition files which can be used by a Lua-Language-Server\n\n\n\n\n\n--- Cleans up the name of a parameter so it can be used in a definition file\n--- Removes anything containing brackets and removes dashes and spaces.\nlocal function CleanupParameterName(paramName)\n\tparamName = paramName:gsub(\"[%- ]\", \"\")\n\t:gsub(\"<.->.-</.->\", '');\n\treturn paramName\nend\n\n\n\n\n\n--- Cleans up a description so it can be used in a definition file.\n--- Uses the standard cleanup function but also removes any newlines.\nlocal function CleanUpDescriptionLLS(a_Desc)\n\treturn CleanUpDescription(a_Desc)\n\t:gsub(\"\\n\", \" \")\nend\n\n\n\n\n\n--- Writes a list of methods into the specified file in LLS format\nlocal function WriteLLSMethods(f, a_NameSpace, a_Methods)\n\tfor _, func in ipairs(a_Methods or {}) do\n\t\tf:write(\"\\n---\\n\")\n\t\tf:write(\"---\", CleanUpDescriptionLLS(func.Notes or \"\"), \"\\n\");\n\t\tf:write(\"---\\n\");\n\t\tlocal parameterList = {}\n\t\tif (func.Params) then\n\t\t\tlocal paramNr = 0;\n\t\t\tfor _, param in ipairs(func.Params) do\n\t\t\t\tparamNr = paramNr + 1;\n\t\t\t\tlocal paramName = CleanupParameterName(param.Name or (\"param\" .. paramNr));\n\t\t\t\tif (paramName:find(\"%.%.%.\")) then\n\t\t\t\t\tparamName = \"...\"\n\t\t\t\tend\n\t\t\t\ttable.insert(parameterList, paramName)\n\t\t\t\tif (param.IsOptional and paramName ~= \"...\") then\n\t\t\t\t\tparamName = paramName .. \"?\"\n\t\t\t\tend\n\t\t\t\t\n\t\t\t\tlocal paramType = param.Type;\n\t\t\t\tif (paramType:find(\"%#\")) then\n\t\t\t\t\tparamType = paramType:match(\"%#(.+)\");\n\t\t\t\tend\n\t\t\t\tf:write(\"---@param \", paramName, \" \", paramType, \"\\n\");\n\t\t\tend\n\t\t\tf:write(\"---\\n\");\n\t\tend\n\t\t\n\t\tif (func.Returns) then\n\t\t\tfor _, ret in ipairs(func.Returns) do\n\t\t\t\tf:write(\"---@return \", ret.Type, \"\\n\");\n\t\t\tend\n\t\t\tf:write(\"---\\n\");\n\t\tend\n\t\tlocal name = func.Name:find(\"constructor\") and \"__call\" or func.Name;\n\t\tname = name:find(\"operator\") and \"__meta\" or name\n\t\tlocal parameters = table.concat(parameterList, \", \");\n\t\tf:write(\"function \")\n\t\tif (a_NameSpace) then\n\t\t\tf:write(a_NameSpace, \":\")\n\t\tend\n\t\tf:write(name, \"(\", parameters, \") end\\n\\n\");\n\tend\nend\n\n\n\n\n\n--- Writes the list of constants. If the value is an enum the value is set from that enum.\n--- This is a bit of a hack because Cuberite exports allot of enums as a constant inside \n--- a class or global but documents them as if they are in their own table.\nlocal function WriteLLSConstants(f, a_NameSpace, a_Constants, a_Enum)\n\tif (not a_Constants) then\n\t\treturn;\n\tend\n\n\tlocal prefix = \"\"\n\tif (a_NameSpace) then\n\t\tprefix = a_NameSpace .. \".\";\n\tend\n\tfor _, const in pairs(a_Constants) do\n\t\tf:write(prefix)\n\t\tif (a_Enum) then\n\t\t\tf:write(const.Name, \" = \", prefix, a_Enum, \".\", const.Name, \"\\n\")\n\t\telse\n\t\t\tlocal constValue = tostring(const.Value):match(\"[%w%d]+\") or \"nil\";\n\t\t\tf:write(const.Name, \" = \", constValue, \"\\n\")\n\t\tend\n\tend\nend\n\n\n\n\n\n--- Writes a list of constants into the specified file in LLS format\nlocal function WriteLLSEnums(f, a_NameSpace, a_ConstantGroups)\n\tif (not a_ConstantGroups) then\n\t\treturn;\n\tend\n\n\tlocal prefix = \"\";\n\tif (a_NameSpace) then\n\t\tprefix = a_NameSpace .. \".\"\n\tend\n\tfor _, group in pairs(a_ConstantGroups) do\n\t\tf:write(\"---@enum \", group.Name, \"\\n\");\n\t\tf:write(prefix, group.Name, \" = {\\n\")\n\t\tfor _, const in pairs(group.Constants) do\n\t\t\tlocal constValue = tostring(const.Value):match(\"[%w%d]+\") or \"nil\";\n\t\t\tf:write(\"\\t\", const.Name, \" = \", constValue, \",\\n\")\n\t\tend\n\t\tf:write(\"}\\n\")\n\t\tWriteLLSConstants(f, a_NameSpace, group.Constants, group.Name);\n\tend\nend\n\n\n\n\n\n--- Writes all the fields which a class has.\n---@param f file*\n---@param a_Variables table\nlocal function WriteLLSVariables(f, a_Variables)\n\tfor _, variable in ipairs(a_Variables or {}) do\n\t\tf:write(\"---@field \", variable.Name)\n\t\tif (variable.Type) then\n\t\t\tlocal type = variable.Type:match(\"%w+\")\n\t\t\tf:write(\" \", type)\n\t\tend\n\t\tif (variable.Notes) then\n\t\t\tf:write(\" \", variable.Notes)\n\t\tend\n\t\tf:write(\"\\n\");\n\tend\nend\n\n\n\n\n\n--- Writes one Cuberite class definition into the specified file in LLS format\nlocal function WriteLLSClass(a_Class)\n\tassert(type(a_Class) == \"table\")\n\n\tlocal f = io.open(\"LLS/cuberite/library/\" .. a_Class.Name .. \".lua\", \"w\");\n\tf:write(\"---@meta\\n\");\n\tf:write(\"\\n\\n---\\n---The \", a_Class.Name, \" namespace\\n\");\n\n\tlocal inherit = \"\";\n\tif (a_Class.Inherits) then\n\t\tinherit = \": \" .. a_Class.Inherits.Name \n\tend\n\tf:write(\"---@class \", a_Class.Name, inherit, \"\\n\");\n\tWriteLLSVariables(f, a_Class.Variables);\n\tfor _, func in pairs(a_Class.Functions or {}) do\n\t\tif (func.Name:find(\"constructor\")) then\n\t\t\tlocal parameters = {};\n\t\t\tfor _, param in ipairs(func.Parameters or {}) do\n\t\t\t\ttable.insert(parameters, param.Type);\n\t\t\tend\n\t\t\tf:write(\"---@operator call(\", table.concat(parameters, \",\"), \"):\" .. a_Class.Name, \"\\n\")\n\t\tend\n\tend\n\tf:write(\"\", a_Class.Name, \" = {}\\n\");\n\n\t-- Export methods and constants:\n\tWriteLLSEnums(f, a_Class.Name, a_Class.ConstantGroups);\n\tWriteLLSConstants(f, a_Class.Name, a_Class.Constants);\n\tWriteLLSMethods(f, a_Class.Name, a_Class.Functions);\n\n\tf:close();\nend\n\n\n\n\n\n--- Dumps the entire API table into a file in the LLS format\nfunction DumpAPILLS(a_API)\n\tLOG(\"Dumping LLS API description...\")\n\tcFile:CreateFolderRecursive(\"LLS/cuberite/library\");\n\n\t-- Export each class except Globals, store those aside:\n\tlocal Globals\n\tfor _, cls in ipairs(a_API) do\n\t\tif (cls.Name ~= \"Globals\") then\n\t\t\tWriteLLSClass(cls)\n\t\telse\n\t\t\tGlobals = cls\n\t\tend\n\tend\n\n\t-- Export the globals:\n\tif (Globals) then\n\t\tlocal f = io.open(\"LLS/cuberite/library/Globals.lua\", \"w\");\n\t\tf:write(\"---@meta\\n\\n\");\n\t\tWriteLLSMethods(f, nil, Globals.Functions)\n\t\tWriteLLSEnums(f, nil, Globals.ConstantGroups)\n\t\tf:close();\n\tend\n\n\t-- Finish the file:\n\tLOG(\"LLS API dumped...\")\nend\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/main.css",
    "content": "html\n{\n\tbackground-color: #C0C0C0;\n}\n\ntable\n{\n\tbackground-color: #fff;\n\tborder-spacing: 0px;\n\tborder-collapse: collapse;\n\tborder-color: gray;\n}\n\ntr\n{\n\tdisplay: table-row;\n\tvertical-align: inherit;\n\tborder-color: inherit;\n}\n\ntd, th\n{\n\tdisplay: table-cell;\n\tvertical-align: inherit;\n\tpadding: 3px;\n\tborder: 1px solid #ccc;\n}\n\npre\n{\n\tborder: 1px solid #ccc;\n\tbackground-color: #eee;\n\t-moz-tab-size:    2;\n\t-o-tab-size:      2;\n\t-webkit-tab-size: 2;\n\t-ms-tab-size:     2;\n\ttab-size:         2;\n}\n\nbody\n{\n\tmin-width: 400px;\n\tmax-width: 1200px;\n\twidth: 95%;\n\tmargin: 10px auto;\n\tbackground-color: white;\n\tborder: 4px #FF8C00 solid;\n\tborder-radius: 20px;\n\tfont-family: Calibri, Trebuchet MS;\n}\n\nheader\n{\n\ttext-align: center;\n\tfont-family: Segoe UI Light, Helvetica;\n}\n\nfooter\n{\n\ttext-align: center;\n\tfont-family: Segoe UI Light, Helvetica;\n}\n\n#content, #timestamp\n{\n\tpadding: 0px 25px 25px 25px;\n}\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/main_APIDump.lua",
    "content": "-- main.lua\n\n-- Implements the plugin entrypoint (in this case the entire plugin)\n\n\n\n\n\n-- Global variables:\nlocal g_Plugin = nil\nlocal g_PluginFolder = \"\"\nlocal g_Stats = {}\nlocal g_TrackedPages = {}\n\n\n\n\n\n\nlocal function LoadAPIFiles(a_Folder, a_DstTable)\n\tassert(type(a_Folder) == \"string\")\n\tassert(type(a_DstTable) == \"table\")\n\n\tlocal Folder = g_PluginFolder .. a_Folder;\n\tfor _, fnam in ipairs(cFile:GetFolderContents(Folder)) do\n\t\tlocal FileName = Folder .. fnam;\n\t\t-- We only want .lua files from the folder:\n\t\tif (cFile:IsFile(FileName) and fnam:match(\".*%.lua$\")) then\n\t\t\tlocal TablesFn = assert(loadfile(FileName))\n\t\t\tlocal Tables = TablesFn()\n\t\t\tif (type(Tables) ~= \"table\") then\n\t\t\t\terror(\"Cannot load API descriptions from \" .. FileName .. \", returned object is not a table (\" .. type(Tables) .. \").\")\n\t\t\t\tbreak\n\t\t\tend\n\t\t\tfor k, cls in pairs(Tables) do\n\t\t\t\tif (a_DstTable[k]) then\n\t\t\t\t\t-- The class is documented in two files, warn and store into a file (so that CIs can mark build as failure):\n\t\t\t\t\tLOGWARNING(string.format(\n\t\t\t\t\t\t\"Warning: class %s is documented at two places, the documentation in file %s will overwrite the previously loaded one!\",\n\t\t\t\t\t\tk, FileName\n\t\t\t\t\t))\n\t\t\t\t\tlocal f = io.open(\"DuplicateDocs.txt\", \"a\")\n\t\t\t\t\tf:write(k, \"\\t\", FileName)\n\t\t\t\t\tf:close()\n\t\t\t\tend\n\t\t\t\ta_DstTable[k] = cls\n\t\t\tend\n\t\tend  -- if (is lua file)\n\tend  -- for fnam - Folder[]\nend\n\n\n\n\n--- Returns the API currently detected from the global environment\nlocal function CreateAPITables()\n\t--[[\n\tWe want an API table of the following shape:\n\tlocal API = {\n\t\t{\n\t\t\tName = \"cCuboid\",\n\t\t\tFunctions = {\n\t\t\t\t{Name = \"Sort\"},\n\t\t\t\t{Name = \"IsInside\"}\n\t\t\t},\n\t\t\tConstants = {\n\t\t\t},\n\t\t\tVariables = {\n\t\t\t},\n\t\t\tDescendants = {},  -- Will be filled by ReadDescriptions(), array of class APIs (references to other member in the tree)\n\t\t},\n\t\t{\n\t\t\tName = \"cBlockArea\",\n\t\t\tFunctions = {\n\t\t\t\t{Name = \"Clear\"},\n\t\t\t\t{Name = \"CopyFrom\"},\n\t\t\t\t...\n\t\t\t},\n\t\t\tConstants = {\n\t\t\t\t{Name = \"baTypes\", Value = 0},\n\t\t\t\t{Name = \"baMetas\", Value = 1},\n\t\t\t\t...\n\t\t\t},\n\t\t\tVariables = {\n\t\t\t},\n\t\t\t...\n\t\t},\n\n\t\tcCuboid = {}  -- Each array item also has the map item by its name\n\t};\n\tlocal Globals = {\n\t\tFunctions = {\n\t\t\t...\n\t\t},\n\t\tConstants = {\n\t\t\t...\n\t\t}\n\t};\n\t--]]\n\n\tlocal Globals = {Functions = {}, Constants = {}, Variables = {}, Descendants = {}};\n\tlocal API = {};\n\n\tlocal function Add(a_APIContainer, a_ObjName, a_ObjValue)\n\t\tif (type(a_ObjValue) == \"function\") then\n\t\t\ttable.insert(a_APIContainer.Functions, {Name = a_ObjName});\n\t\telseif (\n\t\t\t(type(a_ObjValue) == \"number\") or\n\t\t\t(type(a_ObjValue) == \"string\")\n\t\t) then\n\t\t\ttable.insert(a_APIContainer.Constants, {Name = a_ObjName, Value = a_ObjValue});\n\t\tend\n\tend\n\n\tlocal function ParseClass(a_ClassName, a_ClassObj)\n\t\tlocal res = {Name = a_ClassName, Functions = {}, Constants = {}, Variables = {}, Descendants = {}};\n\t\t-- Add functions and constants:\n\t\tfor i, v in pairs(a_ClassObj) do\n\t\t\tAdd(res, i, v);\n\t\tend\n\n\t\t-- Member variables:\n\t\tlocal GetField = a_ClassObj[\".get\"];\n\t\tlocal SetField = a_ClassObj[\".set\"] or {};\n\t\tif ((GetField ~= nil) and (type(GetField) == \"table\")) then\n\t\t\tfor k, v in pairs(GetField) do\n\t\t\t\tif ((SetField[k] == nil) and ((type(v) ~= \"table\") or (v[\"__newindex\"] == nil))) then\n\t\t\t\t\t-- It is a read-only variable or array, add it as a constant:\n\t\t\t\t\ttable.insert(res.Constants, {Name = k, Value = \"\"});\n\t\t\t\telse\n\t\t\t\t\t-- It is a read-write variable or array, add it as a variable:\n\t\t\t\t\ttable.insert(res.Variables, { Name = k });\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\treturn res;\n\tend\n\n\tfor i, v in pairs(getmetatable(_G).__index) do\n\t\tif (\n\t\t\t(v ~= _G) and           -- don't want the global namespace\n\t\t\t(v ~= _G.packages) and  -- don't want any packages\n\t\t\t(v ~= _G[\".get\"])\n\t\t) then\n\t\t\tif (type(v) == \"table\") then\n\t\t\t\tlocal cls = ParseClass(i, v)\n\t\t\t\ttable.insert(API, cls);\n\t\t\t\tAPI[cls.Name] = cls\n\t\t\telse\n\t\t\t\tAdd(Globals, i, v);\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Remove the built-in Lua libraries:\n\tAPI.debug = nil\n\tAPI.io = nil\n\tAPI.string = nil\n\tAPI.table = nil\n\n\treturn API, Globals;\nend\n\n\n\n\n\n--- Returns the timestamp in HTML format\n-- The timestamp will be inserted to all generated HTML files\nlocal function GetHtmlTimestamp()\n\treturn string.format(\"<div id='timestamp'>Generated by <a href='https://github.com/cuberite/cuberite/tree/master/Server/Plugins/APIDump'>APIDump</a> on %s, Build ID %s, Commit %s</div>\",\n\t\tos.date(\"%Y-%m-%d %H:%M:%S\"),\n\t\tcRoot:GetBuildID(), cRoot:GetBuildCommitID()\n\t)\nend\n\n\n\n\n\n--- Writes links to articles in a bullet format into the output HTML file\n-- f is the output file stream\n-- a_APIDesc is the API description as read from APIDesc.lua\nlocal function WriteArticles(f, a_APIDesc)\n\tf:write([[\n\t\t<a name=\"articles\"><h2>Articles</h2></a>\n\t\t<p>The following articles provide various extra information on plugin development</p>\n\t\t<ul>\n\t]]);\n\tfor _, extra in ipairs(a_APIDesc.ExtraPages) do\n\t\tlocal SrcFileName = g_PluginFolder .. \"/\" .. extra.FileName;\n\t\tif (cFile:IsFile(SrcFileName)) then\n\t\t\tlocal DstFileName = \"API/\" .. extra.FileName;\n\t\t\tcFile:Delete(DstFileName);\n\t\t\tcFile:Copy(SrcFileName, DstFileName);\n\t\t\tf:write(\"<li><a href=\\\"\" .. extra.FileName .. \"\\\">\" .. extra.Title .. \"</a></li>\\n\");\n\t\telse\n\t\t\tf:write(\"<li>\" .. extra.Title .. \" <i>(file is missing)</i></li>\\n\");\n\t\tend\n\tend\n\tf:write(\"</ul><hr />\");\nend\n\n\n\n\n\n-- Make a link out of anything with the special linkifying syntax {{link|title}}\nlocal function LinkifyString(a_String, a_Referrer, a_API)\n\tassert(a_Referrer ~= nil);\n\tassert(a_Referrer ~= \"\");\n\n\t-- If the string is a known class, return a direct link to it:\n\tif (a_API[a_String]) then\n\t\treturn \"<a href=\\\"\" .. a_String .. \".html\\\">\" .. a_String .. \"</a>\"\n\tend\n\n\t--- Adds a page to the list of tracked pages (to be checked for existence at the end)\n\tlocal function AddTrackedPage(a_PageName)\n\t\tlocal Pg = (g_TrackedPages[a_PageName] or {});\n\t\ttable.insert(Pg, a_Referrer);\n\t\tg_TrackedPages[a_PageName] = Pg;\n\tend\n\n\t--- Creates the HTML for the specified link and title\n\tlocal function CreateLink(Link, Title)\n\t\tif ((Link:sub(1, 7) == \"http://\") or (Link:sub(1, 8) == \"https://\")) then\n\t\t\t-- The link is a full absolute URL, do not modify, do not track:\n\t\t\treturn \"<a href=\\\"\" .. Link .. \"\\\">\" .. Title .. \"</a>\";\n\t\tend\n\t\tlocal idxHash = Link:find(\"#\");\n\t\tif (idxHash ~= nil) then\n\t\t\t-- The link contains an anchor:\n\t\t\tif (idxHash == 1) then\n\t\t\t\t-- Anchor in the current page, no need to track:\n\t\t\t\treturn \"<a href=\\\"\" .. Link .. \"\\\">\" .. Title .. \"</a>\";\n\t\t\tend\n\t\t\t-- Anchor in another page:\n\t\t\tlocal PageName = Link:sub(1, idxHash - 1);\n\t\t\tAddTrackedPage(PageName);\n\t\t\treturn \"<a href=\\\"\" .. PageName .. \".html#\" .. Link:sub(idxHash + 1) .. \"\\\">\" .. Title .. \"</a>\";\n\t\tend\n\t\t-- Link without anchor:\n\t\tAddTrackedPage(Link);\n\t\treturn \"<a href=\\\"\" .. Link .. \".html\\\">\" .. Title .. \"</a>\";\n\tend\n\n\t-- Linkify the strings using the CreateLink() function:\n\tlocal txt = a_String:gsub(\"{{([^|}]*)|([^}]*)}}\", CreateLink)  -- {{link|title}}\n\ttxt = txt:gsub(\"{{([^|}]*)}}\",  -- {{LinkAndTitle}}\n\t\tfunction(LinkAndTitle)\n\t\t\tlocal idxHash = LinkAndTitle:find(\"#\");\n\t\t\tif (idxHash ~= nil) then\n\t\t\t\t-- The LinkAndTitle contains a hash, remove the hashed part from the title:\n\t\t\t\treturn CreateLink(LinkAndTitle, LinkAndTitle:sub(1, idxHash - 1));\n\t\t\tend\n\t\t\treturn CreateLink(LinkAndTitle, LinkAndTitle);\n\t\tend\n\t);\n\treturn txt;\nend\n\n\n\n\n\nlocal function WriteHtmlHook(a_Hook, a_HookNav, a_API)\n\tlocal fnam = \"API/\" .. a_Hook.DefaultFnName .. \".html\";\n\tlocal f, error = io.open(fnam, \"w\");\n\tif (f == nil) then\n\t\tLOG(\"Cannot write \\\"\" .. fnam .. \"\\\": \\\"\" .. error .. \"\\\".\");\n\t\treturn;\n\tend\n\tlocal HookName = a_Hook.DefaultFnName;\n\n\tf:write([[<!DOCTYPE html><html>\n\t\t<head>\n\t\t<title>Cuberite API - ]], HookName, [[ Hook</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/]], HookName, [[.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t</head>\n\t\t<body>\n\t\t<div id=\"content\">\n\t\t<header>\n\t\t<h1>]], a_Hook.Name, [[</h1>\n\t\t<hr />\n\t\t</header>\n\t\t<table><tr><td style=\"vertical-align: top;\">\n\t\tIndex:<br />\n\t\t<a href='index.html#articles'>Articles</a><br />\n\t\t<a href='index.html#classes'>Classes</a><br />\n\t\t<a href='index.html#hooks'>Hooks</a><br />\n\t\t<br />\n\t\tQuick navigation:<br />\n\t]]);\n\tf:write(a_HookNav);\n\tf:write([[\n\t\t</td><td style=\"vertical-align: top;\"><p>\n\t]]);\n\tf:write(LinkifyString(a_Hook.Desc, HookName, a_API));\n\tf:write(\"</p>\\n<hr /><h1>Callback function</h1>\\n<p>The default name for the callback function is \");\n\tf:write(a_Hook.DefaultFnName, \". It has the following signature:\\n\");\n\tf:write(\"<pre class=\\\"prettyprint lang-lua\\\">function My\", HookName, \"(\");\n\tif (a_Hook.Params == nil) then\n\t\ta_Hook.Params = {};\n\tend\n\tfor i, param in ipairs(a_Hook.Params) do\n\t\tif (i > 1) then\n\t\t\tf:write(\", \");\n\t\tend\n\t\tf:write(param.Name);\n\tend\n\tf:write(\")</pre>\\n<hr /><h1>Parameters:</h1>\\n<table><tr><th>Name</th><th>Type</th><th>Notes</th></tr>\\n\");\n\tfor _, param in ipairs(a_Hook.Params) do\n\t\tf:write(\"<tr><td>\", param.Name, \"</td><td>\", LinkifyString(param.Type, HookName, a_API), \"</td><td>\", LinkifyString(param.Notes, HookName, a_API), \"</td></tr>\\n\");\n\tend\n\tf:write(\"</table>\\n<p>\" .. LinkifyString(a_Hook.Returns or \"\", HookName, a_API) .. \"</p>\\n\\n\");\n\tf:write([[<hr /><h1>Code examples</h1><h2>Registering the callback</h2>]]);\n\tf:write(\"<pre class=\\\"prettyprint lang-lua\\\">\\n\");\n\tf:write([[cPluginManager:AddHook(cPluginManager.]] .. a_Hook.Name .. \", My\" .. a_Hook.DefaultFnName .. [[);]]);\n\tf:write(\"</pre>\\n\\n\");\n\tlocal Examples = a_Hook.CodeExamples or {};\n\tfor _, example in ipairs(Examples) do\n\t\tf:write(\"<h2>\", (example.Title or \"<i>missing Title</i>\"), \"</h2>\\n\");\n\t\tf:write(\"<p>\", (example.Desc or \"<i>missing Desc</i>\"), \"</p>\\n\");\n\t\tf:write(\"<pre class=\\\"prettyprint lang-lua\\\">\", (example.Code or \"<i>missing Code</i>\"), \"\\n</pre>\\n\\n\");\n\tend\n\tf:write([[</td></tr></table></div><script>prettyPrint();</script>]])\n\tf:write(GetHtmlTimestamp())\n\tf:write([[</body></html>]])\n\tf:close();\nend\n\n\n\n\n\n--- Writes all hooks into HTML output file as links in a sorted bullet list, as well as the individual hook HTML files\n-- f is the output HTML index file\n-- a_Hooks is an array of hook descriptions\n-- a_UndocumentedHooks is a table that will be filled with the names of hooks that are not documented\n-- a_HookNav is the HTML code for the menu on the left that is constant for all hook pages\nlocal function WriteHooks(f, a_Hooks, a_UndocumentedHooks, a_HookNav, a_API)\n\tf:write([[\n\t\t<a name=\"hooks\"><h2>Hooks</h2></a>\n\t\t<p>\n\t\tA plugin can register to be called whenever an \"interesting event\" occurs. It does so by calling\n\t\t<a href=\"cPluginManager.html\">cPluginManager</a>'s AddHook() function and implementing a callback\n\t\tfunction to handle the event.</p>\n\t\t<p>\n\t\tA plugin can decide whether it will let the event pass through to the rest of the plugins, or hide it\n\t\tfrom them. This is determined by the return value from the hook callback function. If the function\n\t\treturns false or no value, the event is propagated further. If the function returns true, the processing\n\t\tis\tstopped, no other plugin receives the notification (and possibly Cuberite disables the default\n\t\tbehavior for the event). See each hook's details to see the exact behavior.</p>\n\t\t<table>\n\t\t<tr>\n\t\t<th>Hook name</th>\n\t\t<th>Called when</th>\n\t\t</tr>\n\t]]);\n\tfor _, hook in ipairs(a_Hooks) do\n\t\tif (hook.DefaultFnName == nil) then\n\t\t\t-- The hook is not documented yet\n\t\t\tf:write(\"\t\t\t\t<tr>\\n\t\t\t\t\t<td>\" .. hook.Name .. \"</td>\\n\t\t\t\t\t<td><i>(No documentation yet)</i></td>\\n \t\t\t\t</tr>\\n\");\n\t\t\ttable.insert(a_UndocumentedHooks, hook.Name);\n\t\telse\n\t\t\tf:write(\"\t\t\t\t<tr>\\n\t\t\t\t\t<td><a href=\\\"\" .. hook.DefaultFnName .. \".html\\\">\" .. hook.Name .. \"</a></td>\\n\t\t\t\t\t<td>\" .. LinkifyString(hook.CalledWhen, hook.Name, a_API) .. \"</td>\\n\t\t\t\t</tr>\\n\");\n\t\t\tWriteHtmlHook(hook, a_HookNav, a_API);\n\t\tend\n\tend\n\tf:write([[\n\t\t\t</table>\n\t\t\t<hr />\n\t]]);\nend\n\n\n\n\n\n--- Fills the API in a_API table with descriptions from a_Desc\n-- a_API is the API detected from current global environment\n-- a_Desc is the description loaded from APIDesc.lua and Classes files\nlocal function ReadDescriptions(a_API, a_Desc)\n\t-- Returns true if the class of the specified name is to be ignored\n\tlocal function IsClassIgnored(a_ClsName)\n\t\tif (a_Desc.IgnoreClasses == nil) then\n\t\t\treturn false;\n\t\tend\n\t\tfor _, name in ipairs(a_Desc.IgnoreClasses) do\n\t\t\tif (a_ClsName:match(name)) then\n\t\t\t\treturn true;\n\t\t\tend\n\t\tend\n\t\treturn false;\n\tend\n\n\t-- Returns true if the function is to be ignored\n\tlocal function IsFunctionIgnored(a_ClassName, a_FnName)\n\t\tif (a_Desc.IgnoreFunctions == nil) then\n\t\t\treturn false;\n\t\tend\n\t\tif (((a_Desc.Classes[a_ClassName] or {}).Functions or {})[a_FnName] ~= nil) then\n\t\t\t-- The function is documented, don't ignore\n\t\t\treturn false;\n\t\tend\n\t\tlocal FnName = a_ClassName .. \".\" .. a_FnName;\n\t\tfor _, name in ipairs(a_Desc.IgnoreFunctions) do\n\t\t\tif (FnName:match(name)) then\n\t\t\t\treturn true;\n\t\t\tend\n\t\tend\n\t\treturn false;\n\tend\n\n\t-- Returns true if the constant (specified by its fully qualified name) is to be ignored\n\tlocal function IsConstantIgnored(a_CnName)\n\t\tif (a_Desc.IgnoreConstants == nil) then\n\t\t\treturn false;\n\t\tend;\n\t\tfor _, name in ipairs(a_Desc.IgnoreConstants) do\n\t\t\tif (a_CnName:match(name)) then\n\t\t\t\treturn true;\n\t\t\tend\n\t\tend\n\t\treturn false;\n\tend\n\n\t-- Returns true if the member variable (specified by its fully qualified name) is to be ignored\n\tlocal function IsVariableIgnored(a_VarName)\n\t\tif (a_Desc.IgnoreVariables == nil) then\n\t\t\treturn false;\n\t\tend;\n\t\tfor _, name in ipairs(a_Desc.IgnoreVariables) do\n\t\t\tif (a_VarName:match(name)) then\n\t\t\t\treturn true;\n\t\t\tend\n\t\tend\n\t\treturn false;\n\tend\n\n\t-- Remove ignored classes from a_API:\n\tlocal APICopy = {};\n\tfor _, cls in ipairs(a_API) do\n\t\tif not(IsClassIgnored(cls.Name)) then\n\t\t\ttable.insert(APICopy, cls);\n\t\tend\n\tend\n\tfor i = 1, #a_API do\n\t\ta_API[i] = APICopy[i];\n\tend;\n\n\t-- Process the documentation for each class:\n\tfor _, cls in ipairs(a_API) do\n\t\t-- Initialize default values for each class:\n\t\tcls.ConstantGroups = {};\n\t\tcls.NumConstantsInGroups = 0;\n\t\tcls.NumConstantsInGroupsForDescendants = 0;\n\n\t\t-- Rename special functions:\n\t\tfor _, fn in ipairs(cls.Functions) do\n\t\t\tif (fn.Name == \".call\") then\n\t\t\t\tfn.DocID = \"constructor\";\n\t\t\t\tfn.Name = \"() <i>(constructor)</i>\";\n\t\t\telseif (fn.Name == \".add\") then\n\t\t\t\tfn.DocID = \"operator_plus\";\n\t\t\t\tfn.Name = \"<i>operator +</i>\";\n\t\t\telseif (fn.Name == \".div\") then\n\t\t\t\tfn.DocID = \"operator_div\";\n\t\t\t\tfn.Name = \"<i>operator /</i>\";\n\t\t\telseif (fn.Name == \".mul\") then\n\t\t\t\tfn.DocID = \"operator_mul\";\n\t\t\t\tfn.Name = \"<i>operator *</i>\";\n\t\t\telseif (fn.Name == \".sub\") then\n\t\t\t\tfn.DocID = \"operator_sub\";\n\t\t\t\tfn.Name = \"<i>operator -</i>\";\n\t\t\telseif (fn.Name == \".eq\") then\n\t\t\t\tfn.DocID = \"operator_eq\";\n\t\t\t\tfn.Name = \"<i>operator ==</i>\";\n\t\t\tend\n\t\tend\n\n\t\tlocal APIDesc = a_Desc.Classes[cls.Name];\n\t\tif (APIDesc ~= nil) then\n\t\t\tAPIDesc.IsExported = true;\n\t\t\tcls.Desc = APIDesc.Desc;\n\t\t\tcls.AdditionalInfo = APIDesc.AdditionalInfo;\n\n\t\t\t-- Process inheritance:\n\t\t\tif (APIDesc.Inherits ~= nil) then\n\t\t\t\tfor _, icls in ipairs(a_API) do\n\t\t\t\t\tif (icls.Name == APIDesc.Inherits) then\n\t\t\t\t\t\ttable.insert(icls.Descendants, cls);\n\t\t\t\t\t\tcls.Inherits = icls;\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tcls.UndocumentedFunctions = {};  -- This will contain names of all the functions that are not documented\n\t\t\tcls.UndocumentedConstants = {};  -- This will contain names of all the constants that are not documented\n\t\t\tcls.UndocumentedVariables = {};  -- This will contain names of all the variables that are not documented\n\n\t\t\tlocal DoxyFunctions = {};  -- This will contain all the API functions together with their documentation\n\n\t\t\tlocal function AddFunction(a_Name, a_Params, a_Returns, a_IsStatic, a_Notes)\n\t\t\t\ttable.insert(DoxyFunctions, {Name = a_Name, Params = a_Params, Returns = a_Returns, IsStatic = a_IsStatic, Notes = a_Notes});\n\t\t\tend\n\n\t\t\tif (APIDesc.Functions ~= nil) then\n\t\t\t\t-- Assign function descriptions:\n\t\t\t\tfor _, func in ipairs(cls.Functions) do\n\t\t\t\t\tlocal FnName = func.DocID or func.Name;\n\t\t\t\t\tlocal FnDesc = APIDesc.Functions[FnName];\n\t\t\t\t\tif (FnDesc == nil) then\n\t\t\t\t\t\t-- No description for this API function\n\t\t\t\t\t\tAddFunction(func.Name);\n\t\t\t\t\t\tif not(IsFunctionIgnored(cls.Name, FnName)) then\n\t\t\t\t\t\t\ttable.insert(cls.UndocumentedFunctions, FnName);\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\t-- Description is available\n\t\t\t\t\t\tif (FnDesc[1] == nil) then\n\t\t\t\t\t\t\t-- Single function definition\n\t\t\t\t\t\t\tAddFunction(func.Name, FnDesc.Params, FnDesc.Returns, FnDesc.IsStatic, FnDesc.Notes);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t-- Multiple function overloads\n\t\t\t\t\t\t\tfor _, desc in ipairs(FnDesc) do\n\t\t\t\t\t\t\t\tAddFunction(func.Name, desc.Params, desc.Returns, desc.IsStatic, desc.Notes);\n\t\t\t\t\t\t\tend  -- for k, desc - FnDesc[]\n\t\t\t\t\t\tend\n\t\t\t\t\t\tFnDesc.IsExported = true;\n\t\t\t\t\tend\n\t\t\t\tend  -- for j, func\n\n\t\t\t\t-- Replace functions with their described and overload-expanded versions:\n\t\t\t\tcls.Functions = DoxyFunctions;\n\t\t\telse  -- if (APIDesc.Functions ~= nil)\n\t\t\t\tfor _, func in ipairs(cls.Functions) do\n\t\t\t\t\tlocal FnName = func.DocID or func.Name;\n\t\t\t\t\tif not(IsFunctionIgnored(cls.Name, FnName)) then\n\t\t\t\t\t\ttable.insert(cls.UndocumentedFunctions, FnName);\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend  -- if (APIDesc.Functions ~= nil)\n\n\t\t\tif (APIDesc.Constants ~= nil) then\n\t\t\t\t-- Assign constant descriptions:\n\t\t\t\tfor _, cons in ipairs(cls.Constants) do\n\t\t\t\t\tlocal CnDesc = APIDesc.Constants[cons.Name];\n\t\t\t\t\tif (CnDesc == nil) then\n\t\t\t\t\t\t-- Not documented\n\t\t\t\t\t\tif not(IsConstantIgnored(cls.Name .. \".\" .. cons.Name)) then\n\t\t\t\t\t\t\ttable.insert(cls.UndocumentedConstants, cons.Name);\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tcons.Notes = CnDesc.Notes;\n\t\t\t\t\t\tCnDesc.IsExported = true;\n\t\t\t\t\tend\n\t\t\t\tend  -- for j, cons\n\t\t\telse  -- if (APIDesc.Constants ~= nil)\n\t\t\t\tfor _, cons in ipairs(cls.Constants) do\n\t\t\t\t\tif not(IsConstantIgnored(cls.Name .. \".\" .. cons.Name)) then\n\t\t\t\t\t\ttable.insert(cls.UndocumentedConstants, cons.Name);\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend  -- else if (APIDesc.Constants ~= nil)\n\n\t\t\t-- Assign member variables' descriptions:\n\t\t\tif (APIDesc.Variables ~= nil) then\n\t\t\t\tfor _, var in ipairs(cls.Variables) do\n\t\t\t\t\tlocal VarDesc = APIDesc.Variables[var.Name];\n\t\t\t\t\tif (VarDesc == nil) then\n\t\t\t\t\t\t-- Not documented\n\t\t\t\t\t\tif not(IsVariableIgnored(cls.Name .. \".\" .. var.Name)) then\n\t\t\t\t\t\t\ttable.insert(cls.UndocumentedVariables, var.Name);\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\t-- Copy all documentation:\n\t\t\t\t\t\tfor k, v in pairs(VarDesc) do\n\t\t\t\t\t\t\tvar[k] = v\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend  -- for j, var\n\t\t\telse  -- if (APIDesc.Variables ~= nil)\n\t\t\t\tfor _, var in ipairs(cls.Variables) do\n\t\t\t\t\tif not(IsVariableIgnored(cls.Name .. \".\" .. var.Name)) then\n\t\t\t\t\t\ttable.insert(cls.UndocumentedVariables, var.Name);\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend  -- else if (APIDesc.Variables ~= nil)\n\n\t\t\tif (APIDesc.ConstantGroups ~= nil) then\n\t\t\t\t-- Create links between the constants and the groups:\n\t\t\t\tlocal NumInGroups = 0;\n\t\t\t\tlocal NumInDescendantGroups = 0;\n\t\t\t\tfor j, group in pairs(APIDesc.ConstantGroups) do\n\t\t\t\t\tgroup.Name = j;\n\t\t\t\t\tgroup.Constants = {};\n\t\t\t\t\tif (type(group.Include) == \"string\") then\n\t\t\t\t\t\tgroup.Include = { group.Include };\n\t\t\t\t\tend\n\t\t\t\t\tlocal NumInGroup = 0;\n\t\t\t\t\tfor _, incl in ipairs(group.Include or {}) do\n\t\t\t\t\t\tfor _, cons in ipairs(cls.Constants) do\n\t\t\t\t\t\t\tif ((cons.Group == nil) and cons.Name:match(incl)) then\n\t\t\t\t\t\t\t\tcons.Group = group;\n\t\t\t\t\t\t\t\ttable.insert(group.Constants, cons);\n\t\t\t\t\t\t\t\tNumInGroup = NumInGroup + 1;\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend  -- for cidx - cls.Constants[]\n\t\t\t\t\tend  -- for idx - group.Include[]\n\t\t\t\t\tNumInGroups = NumInGroups + NumInGroup;\n\t\t\t\t\tif (group.ShowInDescendants) then\n\t\t\t\t\t\tNumInDescendantGroups = NumInDescendantGroups + NumInGroup;\n\t\t\t\t\tend\n\n\t\t\t\t\t-- Sort the constants:\n\t\t\t\t\ttable.sort(group.Constants,\n\t\t\t\t\t\tfunction(c1, c2)\n\t\t\t\t\t\t\treturn (c1.Name < c2.Name);\n\t\t\t\t\t\tend\n\t\t\t\t\t);\n\t\t\t\tend  -- for j - APIDesc.ConstantGroups[]\n\t\t\t\tcls.ConstantGroups = APIDesc.ConstantGroups;\n\t\t\t\tcls.NumConstantsInGroups = NumInGroups;\n\t\t\t\tcls.NumConstantsInGroupsForDescendants = NumInDescendantGroups;\n\n\t\t\t\t-- Remove grouped constants from the normal list:\n\t\t\t\tlocal NewConstants = {};\n\t\t\t\tfor _, cons in ipairs(cls.Constants) do\n\t\t\t\t\tif (cons.Group == nil) then\n\t\t\t\t\t\ttable.insert(NewConstants, cons);\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tcls.Constants = NewConstants;\n\t\t\tend  -- if (ConstantGroups ~= nil)\n\n\t\telse  -- if (APIDesc ~= nil)\n\n\t\t\t-- Class is not documented at all, add all its members to Undocumented lists:\n\t\t\tcls.UndocumentedFunctions = {};\n\t\t\tcls.UndocumentedConstants = {};\n\t\t\tcls.UndocumentedVariables = {};\n\t\t\tcls.Variables = cls.Variables or {};\n\t\t\tg_Stats.NumUndocumentedClasses = g_Stats.NumUndocumentedClasses + 1;\n\t\t\tfor _, func in ipairs(cls.Functions) do\n\t\t\t\tlocal FnName = func.DocID or func.Name;\n\t\t\t\tif not(IsFunctionIgnored(cls.Name, FnName)) then\n\t\t\t\t\ttable.insert(cls.UndocumentedFunctions, FnName);\n\t\t\t\tend\n\t\t\tend  -- for j, func - cls.Functions[]\n\t\t\tfor _, cons in ipairs(cls.Constants) do\n\t\t\t\tif not(IsConstantIgnored(cls.Name .. \".\" .. cons.Name)) then\n\t\t\t\t\ttable.insert(cls.UndocumentedConstants, cons.Name);\n\t\t\t\tend\n\t\t\tend  -- for j, cons - cls.Constants[]\n\t\t\tfor _, var in ipairs(cls.Variables) do\n\t\t\t\tif not(IsConstantIgnored(cls.Name .. \".\" .. var.Name)) then\n\t\t\t\t\ttable.insert(cls.UndocumentedVariables, var.Name);\n\t\t\t\tend\n\t\t\tend  -- for j, var - cls.Variables[]\n\t\tend  -- else if (APIDesc ~= nil)\n\n\t\t-- Remove ignored functions:\n\t\tlocal NewFunctions = {};\n\t\tfor _, fn in ipairs(cls.Functions) do\n\t\t\tif (not(IsFunctionIgnored(cls.Name, fn.Name))) then\n\t\t\t\ttable.insert(NewFunctions, fn);\n\t\t\tend\n\t\tend  -- for j, fn\n\t\tcls.Functions = NewFunctions;\n\n\t\t-- Sort the functions (they may have been renamed):\n\t\ttable.sort(cls.Functions,\n\t\t\tfunction(f1, f2)\n\t\t\t\treturn (f1.Name < f2.Name);\n\t\t\tend\n\t\t);\n\n\t\t-- Remove ignored constants:\n\t\tlocal NewConstants = {};\n\t\tfor _, cn in ipairs(cls.Constants) do\n\t\t\tif (not(IsFunctionIgnored(cls.Name, cn.Name))) then\n\t\t\t\ttable.insert(NewConstants, cn);\n\t\t\tend\n\t\tend  -- for j, cn\n\t\tcls.Constants = NewConstants;\n\n\t\t-- Sort the constants:\n\t\ttable.sort(cls.Constants,\n\t\t\tfunction(c1, c2)\n\t\t\t\treturn (c1.Name < c2.Name);\n\t\t\tend\n\t\t);\n\n\t\t-- Remove ignored member variables:\n\t\tlocal NewVariables = {};\n\t\tfor _, var in ipairs(cls.Variables) do\n\t\t\tif (not(IsVariableIgnored(cls.Name .. \".\" .. var.Name))) then\n\t\t\t\ttable.insert(NewVariables, var);\n\t\t\tend\n\t\tend  -- for j, var\n\t\tcls.Variables = NewVariables;\n\n\t\t-- Sort the member variables:\n\t\ttable.sort(cls.Variables,\n\t\t\tfunction(v1, v2)\n\t\t\t\treturn (v1.Name < v2.Name);\n\t\t\tend\n\t\t);\n\tend  -- for i, cls\n\n\t-- Sort the descendants lists:\n\tfor _, cls in ipairs(a_API) do\n\t\ttable.sort(cls.Descendants,\n\t\t\tfunction(c1, c2)\n\t\t\t\treturn (c1.Name < c2.Name);\n\t\t\tend\n\t\t);\n\tend  -- for i, cls\nend\n\n\n\n\n\n--- Fills the hooks in a_Hooks with their descriptions from a_Descs\n-- a_Hooks is an array of hooks detected from current global environment\n-- a_Descs is the description read from APIDesc.lua and Hooks files\nlocal function ReadHooks(a_Hooks, a_Descs)\n\t--[[\n\ta_Hooks = {\n\t\t{ Name = \"HOOK_1\"},\n\t\t{ Name = \"HOOK_2\"},\n\t\t...\n\t};\n\tWe want to add hook descriptions to each hook in this array\n\t--]]\n\tfor _, hook in ipairs(a_Hooks) do\n\t\tlocal HookDesc = a_Descs.Hooks[hook.Name];\n\t\tif (HookDesc ~= nil) then\n\t\t\tfor key, val in pairs(HookDesc) do\n\t\t\t\thook[key] = val;\n\t\t\tend\n\t\tend\n\tend  -- for i, hook - a_Hooks[]\n\tg_Stats.NumTotalHooks = #a_Hooks;\nend\n\n\n\n\n\n--- Returns a HTML string describing the (parameter) type, linking to the type's documentation, if available\n-- a_Type is the string containing the type (such as \"cPlugin\" or \"number\"), or nil\n-- a_API is the complete API description (used for searching the classnames)\nlocal function LinkifyType(a_Type, a_API)\n\t-- Check params:\n\tassert(type(a_Type) == \"string\")\n\tassert(type(a_API) == \"table\")\n\n\t-- If the type is a known class, return a direct link to it:\n\tif (a_API[a_Type]) then\n\t\treturn \"<a href=\\\"\" .. a_Type .. \".html\\\">\" .. a_Type .. \"</a>\"\n\tend\n\n\t-- If the type has a hash sign, it's a child enum of a class:\n\tlocal idxColon = a_Type:find(\"#\")\n\tif (idxColon) then\n\t\tlocal classType = a_Type:sub(1, idxColon - 1)\n\t\tif (a_API[classType]) then\n\t\t\tlocal enumType = a_Type:sub(idxColon + 1)\n\t\t\treturn \"<a href=\\\"\" .. classType .. \".html#\" .. enumType .. \"\\\">\" .. enumType .. \"</a>\"\n\t\tend\n\tend\n\n\t-- If the type is a ConstantGroup within the Globals, it's a global enum:\n\tif ((a_API.Globals.ConstantGroups or {})[a_Type]) then\n\t\treturn \"<a href=\\\"Globals.html#\" .. a_Type .. \"\\\">\" .. a_Type .. \"</a>\"\n\tend\n\n\t-- Unknown or built-in type, output just text:\n\treturn a_Type\nend\n\n\n\n\n\n--- Returns an HTML string describing all function parameters (or return values)\n-- a_FnParams is an array-table or string description of the parameters\n-- a_ClassName is the name of the class for which the function is being documented (for Linkification)\n-- a_API is the complete API description (for cross-type linkification)\nlocal function CreateFunctionParamsDescription(a_FnParams, a_ClassName, a_API)\n\tlocal pt = type(a_FnParams)\n\tassert((pt == \"string\") or (pt == \"table\"))\n\tassert(type(a_ClassName) == \"string\")\n\tassert(type(a_API) == \"table\")\n\n\t-- If the params description is a string (old format), just linkify it:\n\tif (pt == \"string\") then\n\t\treturn LinkifyString(a_FnParams, a_ClassName, a_API)\n\tend\n\n\t-- If the params description is an empty table, give no description at all:\n\tif not(a_FnParams[1]) then\n\t\treturn \"\"\n\tend\n\n\t-- The params description is a table, output the full desc:\n\tlocal res = {\"<table border=0 cellspacing=0>\"}\n\tlocal idx = 2\n\tfor _, param in ipairs(a_FnParams) do\n\t\tres[idx] = \"<tr><td>\"\n\t\tres[idx + 1] = param.Name or \"\"\n\t\tres[idx + 2] = \"</td><td><i>\"\n\t\tres[idx + 3] = LinkifyType(param.Type, a_API)\n\t\tres[idx + 4] = \"</i></td></tr>\"\n\t\tidx = idx + 5\n\tend\n\tres[idx] = \"</tr></table>\"\n\treturn table.concat(res)\nend\n\n\n\n\n\n--- Writes an HTML file containing the class API description for the given class\n-- a_ClassAPI is the API description of the class to output\n-- a_ClassMenu is the HTML string containing the code for the menu sidebar\n-- a_API is the complete API (for cross-type linkification)\nlocal function WriteHtmlClass(a_ClassAPI, a_ClassMenu, a_API)\n\t-- Check params:\n\tassert(type(a_ClassAPI) == \"table\")\n\tassert(type(a_ClassMenu) == \"string\")\n\tassert(type(a_API) == \"table\")\n\n\tlocal cf, err = io.open(\"API/\" .. a_ClassAPI.Name .. \".html\", \"w\");\n\tif (cf == nil) then\n\t\tLOGINFO(\"Cannot write HTML API for class \" .. a_ClassAPI.Name .. \": \" .. err)\n\t\treturn;\n\tend\n\n\t-- Writes a table containing all functions in the specified list, with an optional \"inherited from\" header when a_InheritedName is valid\n\tlocal function WriteFunctions(a_Functions, a_InheritedName)\n\t\tif not(a_Functions[1]) then\n\t\t\t-- No functions to write\n\t\t\treturn;\n\t\tend\n\n\t\tif (a_InheritedName) then\n\t\t\tcf:write(\"<h2>Functions inherited from \", a_InheritedName, \"</h2>\\n\");\n\t\tend\n\t\tcf:write(\"<table>\\n<tr><th>Name</th><th>Parameters</th><th>Return value</th><th>Notes</th></tr>\\n\");\n\t\t-- Store all function names, to create unique anchor names for all functions\n\t\tlocal TableOverloadedFunctions = {}\n\t\tfor _, func in ipairs(a_Functions) do\n\t\t\tlocal StaticClause = \"\"\n\t\t\tif (func.IsStatic) then\n\t\t\t\tStaticClause = \"(STATIC) \"\n\t\t\tend\n\t\t\t-- Increase number by one\n\t\t\tTableOverloadedFunctions[func.Name] = (TableOverloadedFunctions[func.Name] or 0) + 1\n\t\t\t-- Add the anchor names as a title\n\t\t\tcf:write(\"<tr><td id=\\\"\", func.Name, \"_\", TableOverloadedFunctions[func.Name], \"\\\" title=\\\"\", func.Name, \"_\", TableOverloadedFunctions[func.Name], \"\\\">\", func.Name, \"</td>\\n\");\n\t\t\tcf:write(\"<td>\", CreateFunctionParamsDescription(func.Params or {}, a_InheritedName or a_ClassAPI.Name, a_API), \"</td>\\n\");\n\t\t\tcf:write(\"<td>\", CreateFunctionParamsDescription(func.Returns or {}, a_InheritedName or a_ClassAPI.Name, a_API), \"</td>\\n\");\n\t\t\tcf:write(\"<td>\", StaticClause .. LinkifyString(func.Notes or \"<i>(undocumented)</i>\", (a_InheritedName or a_ClassAPI.Name), a_API), \"</td></tr>\\n\");\n\t\tend\n\t\tcf:write(\"</table>\\n\");\n\tend\n\n\tlocal function WriteConstantTable(a_Constants, a_Source)\n\t\tcf:write(\"<table>\\n<tr><th>Name</th><th>Value</th><th>Notes</th></tr>\\n\");\n\t\tfor _, cons in ipairs(a_Constants) do\n\t\t\tcf:write(\"<tr><td id=\\\"\", cons.Name, \"\\\">\", cons.Name, \"</td>\\n\");\n\t\t\tcf:write(\"<td>\", cons.Value, \"</td>\\n\");\n\t\t\tcf:write(\"<td>\", LinkifyString(cons.Notes or \"\", a_Source, a_API), \"</td></tr>\\n\");\n\t\tend\n\t\tcf:write(\"</table>\\n\\n\");\n\tend\n\n\tlocal function WriteConstants(a_Constants, a_ConstantGroups, a_NumConstantGroups, a_InheritedName)\n\t\tif ((#a_Constants == 0) and (a_NumConstantGroups == 0)) then\n\t\t\treturn;\n\t\tend\n\n\t\tlocal Source = a_ClassAPI.Name\n\t\tif (a_InheritedName ~= nil) then\n\t\t\tcf:write(\"<h2>Constants inherited from \", a_InheritedName, \"</h2>\\n\");\n\t\t\tSource = a_InheritedName;\n\t\tend\n\n\t\tif (#a_Constants > 0) then\n\t\t\tWriteConstantTable(a_Constants, Source);\n\t\tend\n\n\t\tfor _, group in pairs(a_ConstantGroups) do\n\t\t\tif ((a_InheritedName == nil) or group.ShowInDescendants) then\n\t\t\t\tcf:write(\"<a name='\", group.Name, \"'><p>\");\n\t\t\t\tcf:write(LinkifyString(group.TextBefore or \"\", Source, a_API));\n\t\t\t\tWriteConstantTable(group.Constants, a_InheritedName or a_ClassAPI.Name);\n\t\t\t\tcf:write(LinkifyString(group.TextAfter or \"\", Source, a_API), \"</a></p><hr/>\");\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal function WriteVariables(a_Variables, a_InheritedName)\n\t\tif (#a_Variables == 0) then\n\t\t\treturn;\n\t\tend\n\n\t\tif (a_InheritedName ~= nil) then\n\t\t\tcf:write(\"<h2>Member variables inherited from \", a_InheritedName, \"</h2>\\n\");\n\t\tend\n\n\t\tcf:write(\"<table><tr><th>Name</th><th>Type</th><th>Notes</th></tr>\\n\");\n\t\tfor _, var in ipairs(a_Variables) do\n\t\t\tcf:write(\"<tr><td id=\\\"\", var.Name, \"\\\">\", var.Name, \"</td>\\n\");\n\t\t\tcf:write(\"<td>\", LinkifyString(var.Type or \"<i>(undocumented)</i>\", a_InheritedName or a_ClassAPI.Name, a_API), \"</td>\\n\");\n\t\t\tcf:write(\"<td>\", LinkifyString(var.Notes or \"\", a_InheritedName or a_ClassAPI.Name, a_API), \"</td>\\n\t\t\t\t</tr>\\n\");\n\t\tend\n\t\tcf:write(\"</table>\\n\\n\");\n\tend\n\n\tlocal function WriteDescendants(a_Descendants)\n\t\tif (#a_Descendants == 0) then\n\t\t\treturn;\n\t\tend\n\t\tcf:write(\"<ul>\");\n\t\tfor _, desc in ipairs(a_Descendants) do\n\t\t\tcf:write(\"<li><a href=\\\"\", desc.Name, \".html\\\">\", desc.Name, \"</a>\");\n\t\t\tWriteDescendants(desc.Descendants);\n\t\t\tcf:write(\"</li>\\n\");\n\t\tend\n\t\tcf:write(\"</ul>\\n\");\n\tend\n\n\tlocal ClassName = a_ClassAPI.Name;\n\n\t-- Build an array of inherited classes chain:\n\tlocal InheritanceChain = {};\n\tlocal CurrInheritance = a_ClassAPI.Inherits;\n\twhile (CurrInheritance ~= nil) do\n\t\ttable.insert(InheritanceChain, CurrInheritance);\n\t\tCurrInheritance = CurrInheritance.Inherits;\n\tend\n\n\tcf:write([[<!DOCTYPE html><html>\n\t\t<head>\n\t\t<title>Cuberite API - ]], a_ClassAPI.Name, [[ Class</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/]], a_ClassAPI.Name, [[.html\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"prettify.css\" />\n\t\t<script src=\"prettify.js\"></script>\n\t\t<script src=\"lang-lua.js\"></script>\n\t\t</head>\n\t\t<body>\n\t\t<div id=\"content\">\n\t\t<header>\n\t\t<h1>]], a_ClassAPI.Name, [[</h1>\n\t\t<hr />\n\t\t</header>\n\t\t<table><tr><td style=\"vertical-align: top;\">\n\t\tIndex:<br />\n\t\t<a href='index.html#articles'>Articles</a><br />\n\t\t<a href='index.html#classes'>Classes</a><br />\n\t\t<a href='index.html#hooks'>Hooks</a><br />\n\t\t<br />\n\t\tQuick navigation:<br />\n\t]]);\n\tcf:write(a_ClassMenu);\n\tcf:write([[\n\t\t</td><td style=\"vertical-align: top;\"><h1>Contents</h1>\n\t\t<p><ul>\n\t]]);\n\n\tlocal HasInheritance = ((#a_ClassAPI.Descendants > 0) or (a_ClassAPI.Inherits ~= nil));\n\n\tlocal HasConstants = (#a_ClassAPI.Constants > 0) or (a_ClassAPI.NumConstantsInGroups > 0);\n\tlocal HasFunctions = (#a_ClassAPI.Functions > 0);\n\tlocal HasVariables = (#a_ClassAPI.Variables > 0);\n\tfor _, cls in ipairs(InheritanceChain) do\n\t\tHasConstants = HasConstants or (#cls.Constants > 0) or (cls.NumConstantsInGroupsForDescendants > 0);\n\t\tHasFunctions = HasFunctions or (#cls.Functions > 0);\n\t\tHasVariables = HasVariables or (#cls.Variables > 0);\n\tend\n\n\t-- Write the table of contents:\n\tif (HasInheritance) then\n\t\tcf:write(\"<li><a href=\\\"#inherits\\\">Inheritance</a></li>\\n\");\n\tend\n\tif (HasConstants) then\n\t\tcf:write(\"<li><a href=\\\"#constants\\\">Constants</a></li>\\n\");\n\tend\n\tif (HasVariables) then\n\t\tcf:write(\"<li><a href=\\\"#variables\\\">Member variables</a></li>\\n\");\n\tend\n\tif (HasFunctions) then\n\t\tcf:write(\"<li><a href=\\\"#functions\\\">Functions</a></li>\\n\");\n\tend\n\tif (a_ClassAPI.AdditionalInfo ~= nil) then\n\t\tfor i, additional in ipairs(a_ClassAPI.AdditionalInfo) do\n\t\t\tcf:write(\"<li><a href=\\\"#additionalinfo_\", i, \"\\\">\", (additional.Header or \"<i>(No header)</i>\"), \"</a></li>\\n\");\n\t\tend\n\tend\n\tcf:write(\"</ul></p>\\n\");\n\n\t-- Write the class description:\n\tcf:write(\"<hr /><a name=\\\"desc\\\"><h1>\", ClassName, \" class</h1></a>\\n\");\n\tif (a_ClassAPI.Desc ~= nil) then\n\t\tcf:write(\"<p>\");\n\t\tcf:write(LinkifyString(a_ClassAPI.Desc, ClassName, a_API));\n\t\tcf:write(\"</p>\\n\\n\");\n\tend;\n\n\t-- Write the inheritance, if available:\n\tif (HasInheritance) then\n\t\tcf:write(\"<hr /><a name=\\\"inherits\\\"><h1>Inheritance</h1></a>\\n\");\n\t\tif (#InheritanceChain > 0) then\n\t\t\tcf:write(\"<p>This class inherits from the following parent classes:<ul>\\n\");\n\t\t\tfor _, cls in ipairs(InheritanceChain) do\n\t\t\t\tcf:write(\"<li><a href=\\\"\", cls.Name, \".html\\\">\", cls.Name, \"</a></li>\\n\");\n\t\t\tend\n\t\t\tcf:write(\"</ul></p>\\n\");\n\t\tend\n\t\tif (#a_ClassAPI.Descendants > 0) then\n\t\t\tcf:write(\"<p>This class has the following descendants:\\n\");\n\t\t\tWriteDescendants(a_ClassAPI.Descendants);\n\t\t\tcf:write(\"</p>\\n\\n\");\n\t\tend\n\tend\n\n\t-- Write the constants:\n\tif (HasConstants) then\n\t\tcf:write(\"<a name=\\\"constants\\\"><hr /><h1>Constants</h1></a>\\n\");\n\t\tWriteConstants(a_ClassAPI.Constants, a_ClassAPI.ConstantGroups, a_ClassAPI.NumConstantsInGroups, nil);\n\t\tg_Stats.NumTotalConstants = g_Stats.NumTotalConstants  + #a_ClassAPI.Constants + (a_ClassAPI.NumConstantsInGroups or 0);\n\t\tfor _, cls in ipairs(InheritanceChain) do\n\t\t\tWriteConstants(cls.Constants, cls.ConstantGroups, cls.NumConstantsInGroupsForDescendants, cls.Name);\n\t\tend;\n\tend;\n\n\t-- Write the member variables:\n\tif (HasVariables) then\n\t\tcf:write(\"<a name=\\\"variables\\\"><hr /><h1>Member variables</h1></a>\\n\");\n\t\tWriteVariables(a_ClassAPI.Variables, nil);\n\t\tg_Stats.NumTotalVariables = g_Stats.NumTotalVariables + #a_ClassAPI.Variables;\n\t\tfor _, cls in ipairs(InheritanceChain) do\n\t\t\tWriteVariables(cls.Variables, cls.Name);\n\t\tend;\n\tend\n\n\t-- Write the functions, including the inherited ones:\n\tif (HasFunctions) then\n\t\tcf:write(\"<a name=\\\"functions\\\"><hr /><h1>Functions</h1></a>\\n\");\n\t\tWriteFunctions(a_ClassAPI.Functions, nil);\n\t\tg_Stats.NumTotalFunctions = g_Stats.NumTotalFunctions + #a_ClassAPI.Functions;\n\t\tfor _, cls in ipairs(InheritanceChain) do\n\t\t\tWriteFunctions(cls.Functions, cls.Name);\n\t\tend\n\tend\n\n\t-- Write the additional infos:\n\tif (a_ClassAPI.AdditionalInfo ~= nil) then\n\t\tfor i, additional in ipairs(a_ClassAPI.AdditionalInfo) do\n\t\t\tcf:write(\"<a name=\\\"additionalinfo_\", i, \"\\\"><h1>\", additional.Header, \"</h1></a>\\n\");\n\t\t\tcf:write(LinkifyString(additional.Contents, ClassName, a_API));\n\t\tend\n\tend\n\n\tcf:write([[</td></tr></table></div><script>prettyPrint();</script>]])\n\tcf:write(GetHtmlTimestamp())\n\tcf:write([[</body></html>]])\n\tcf:close()\nend\n\n\n\n\n\n--- Writes all classes into HTML output file as links in a sorted bullet list, as well as the individual class HTML files\n-- f is the output file\n-- a_API is the API detected from current environment enriched with descriptions\n-- a_ClassMenu is the HTML code for the menu on the left that is constant for all class pages\nlocal function WriteClasses(f, a_API, a_ClassMenu)\n\tf:write([[\n\t\t<a name=\"classes\"><h2>Class index</h2></a>\n\t\t<p>The following classes are available in the Cuberite Lua scripting language:\n\t\t<ul>\n\t]]);\n\tfor _, cls in ipairs(a_API) do\n\t\tf:write(\"<li><a href=\\\"\", cls.Name, \".html\\\">\", cls.Name, \"</a></li>\\n\");\n\t\tWriteHtmlClass(cls, a_ClassMenu, a_API);\n\tend\n\tf:write([[\n\t\t</ul></p>\n\t\t<hr />\n\t]]);\nend\n\n\n\n\n\n--- Writes a list of undocumented objects into a file\nlocal function ListUndocumentedObjects(API, UndocumentedHooks)\n\tlocal f = io.open(\"API/_undocumented.lua\", \"w\");\n\tif (f ~= nil) then\n\t\tf:write(\"\\n-- This is the list of undocumented API objects, automatically generated by APIDump\\n\\n\");\n\t\tf:write(\"return\\n{\\n\\tClasses =\\n\\t{\\n\");\n\t\tfor _, cls in ipairs(API) do\n\t\t\tlocal HasFunctions = ((cls.UndocumentedFunctions ~= nil) and (#cls.UndocumentedFunctions > 0));\n\t\t\tlocal HasConstants = ((cls.UndocumentedConstants ~= nil) and (#cls.UndocumentedConstants > 0));\n\t\t\tlocal HasVariables = ((cls.UndocumentedVariables ~= nil) and (#cls.UndocumentedVariables > 0));\n\t\t\tg_Stats.NumUndocumentedFunctions = g_Stats.NumUndocumentedFunctions + #cls.UndocumentedFunctions;\n\t\t\tg_Stats.NumUndocumentedConstants = g_Stats.NumUndocumentedConstants + #cls.UndocumentedConstants;\n\t\t\tg_Stats.NumUndocumentedVariables = g_Stats.NumUndocumentedVariables + #cls.UndocumentedVariables;\n\t\t\tif (HasFunctions or HasConstants or HasVariables) then\n\t\t\t\tf:write(\"\\t\\t\" .. cls.Name .. \" =\\n\\t\\t{\\n\");\n\t\t\t\tif ((cls.Desc == nil) or (cls.Desc == \"\")) then\n\t\t\t\t\tf:write(\"\\t\\t\\tDesc = \\\"\\\",\\n\");\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif (HasFunctions) then\n\t\t\t\tf:write(\"\\t\\t\\tFunctions =\\n\\t\\t\\t{\\n\");\n\t\t\t\ttable.sort(cls.UndocumentedFunctions);\n\t\t\t\tfor _, fn in ipairs(cls.UndocumentedFunctions) do\n\t\t\t\t\tf:write(\"\\t\\t\\t\\t\" .. fn .. \" = { Params = \\\"\\\", Return = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tend  -- for j, fn - cls.UndocumentedFunctions[]\n\t\t\t\tf:write(\"\\t\\t\\t},\\n\\n\");\n\t\t\tend\n\n\t\t\tif (HasConstants) then\n\t\t\t\tf:write(\"\\t\\t\\tConstants =\\n\\t\\t\\t{\\n\");\n\t\t\t\ttable.sort(cls.UndocumentedConstants);\n\t\t\t\tfor _, cn in ipairs(cls.UndocumentedConstants) do\n\t\t\t\t\tf:write(\"\\t\\t\\t\\t\" .. cn .. \" = { Notes = \\\"\\\" },\\n\");\n\t\t\t\tend  -- for j, fn - cls.UndocumentedConstants[]\n\t\t\t\tf:write(\"\\t\\t\\t},\\n\\n\");\n\t\t\tend\n\n\t\t\tif (HasVariables) then\n\t\t\t\tf:write(\"\\t\\t\\tVariables =\\n\\t\\t\\t{\\n\");\n\t\t\t\ttable.sort(cls.UndocumentedVariables);\n\t\t\t\tfor _, vn in ipairs(cls.UndocumentedVariables) do\n\t\t\t\t\tf:write(\"\\t\\t\\t\\t\" .. vn .. \" = { Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tend  -- for j, fn - cls.UndocumentedVariables[]\n\t\t\t\tf:write(\"\\t\\t\\t},\\n\\n\");\n\t\t\tend\n\n\t\t\tif (HasFunctions or HasConstants or HasVariables) then\n\t\t\t\tf:write(\"\\t\\t},\\n\\n\");\n\t\t\tend\n\t\tend  -- for i, cls - API[]\n\t\tf:write(\"\\t},\\n\");\n\n\t\tif (#UndocumentedHooks > 0) then\n\t\t\tf:write(\"\\n\\tHooks =\\n\\t{\\n\");\n\t\t\tfor i, hook in ipairs(UndocumentedHooks) do\n\t\t\t\tif (i > 1) then\n\t\t\t\t\tf:write(\"\\n\");\n\t\t\t\tend\n\t\t\t\tf:write(\"\\t\\t\" .. hook .. \" =\\n\\t\\t{\\n\");\n\t\t\t\tf:write(\"\\t\\t\\tCalledWhen = \\\"\\\",\\n\");\n\t\t\t\tf:write(\"\\t\\t\\tDefaultFnName = \\\"On\\\",  -- also used as pagename\\n\");\n\t\t\t\tf:write(\"\\t\\t\\tDesc = [[\\n\\t\\t\\t\\t\\n\\t\\t\\t]],\\n\");\n\t\t\t\tf:write(\"\\t\\t\\tParams =\\n\\t\\t\\t{\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t\\t{ Name = \\\"\\\", Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t\\t{ Name = \\\"\\\", Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t\\t{ Name = \\\"\\\", Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t\\t{ Name = \\\"\\\", Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t\\t{ Name = \\\"\\\", Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t\\t{ Name = \\\"\\\", Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t\\t{ Name = \\\"\\\", Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t\\t{ Name = \\\"\\\", Type = \\\"\\\", Notes = \\\"\\\" },\\n\");\n\t\t\t\tf:write(\"\\t\\t\\t},\\n\");\n\t\t\t\tf:write(\"\\t\\t\\tReturns = [[\\n\\t\\t\\t\\t\\n\\t\\t\\t]],\\n\");\n\t\t\t\tf:write(\"\\t\\t},  -- \" .. hook .. \"\\n\");\n\t\t\tend\n\t\t\tf:write(\"\\t},\\n\");\n\t\tend\n\t\tf:write(\"}\\n\\n\\n\\n\");\n\t\tf:close();\n\tend\n\tg_Stats.NumUndocumentedHooks = #UndocumentedHooks;\nend\n\n\n\n\n\n--- Lists the API objects that are documented but not available in the API:\nlocal function ListUnexportedObjects(a_APIDesc)\n\tf = io.open(\"API/_unexported-documented.txt\", \"w\");\n\tif (f ~= nil) then\n\t\tfor clsname, cls in pairs(a_APIDesc.Classes) do\n\t\t\tif not(cls.IsExported) then\n\t\t\t\t-- The whole class is not exported\n\t\t\t\tf:write(\"class\\t\" .. clsname .. \"\\n\");\n\t\t\telse\n\t\t\t\tif (cls.Functions ~= nil) then\n\t\t\t\t\tfor fnname, fnapi in pairs(cls.Functions) do\n\t\t\t\t\t\tif not(fnapi.IsExported) then\n\t\t\t\t\t\t\tf:write(\"func\\t\" .. clsname .. \".\" .. fnname .. \"\\n\");\n\t\t\t\t\t\tend\n\t\t\t\t\tend  -- for j, fn - cls.Functions[]\n\t\t\t\tend\n\t\t\t\tif (cls.Constants ~= nil) then\n\t\t\t\t\tfor cnname, cnapi in pairs(cls.Constants) do\n\t\t\t\t\t\tif not(cnapi.IsExported) then\n\t\t\t\t\t\t\tf:write(\"const\\t\" .. clsname .. \".\" .. cnname .. \"\\n\");\n\t\t\t\t\t\tend\n\t\t\t\t\tend  -- for j, fn - cls.Functions[]\n\t\t\t\tend\n\t\t\tend\n\t\tend  -- for i, cls - a_APIDesc.Classes[]\n\t\tf:close();\n\tend\nend\n\n\n\n\n\nlocal function ListMissingPages()\n\tlocal MissingPages = {};\n\tlocal NumLinks = 0;\n\tfor PageName, Referrers in pairs(g_TrackedPages) do\n\t\tNumLinks = NumLinks + 1;\n\t\tif not(cFile:IsFile(\"API/\" .. PageName .. \".html\")) then\n\t\t\ttable.insert(MissingPages, {Name = PageName, Refs = Referrers} );\n\t\tend\n\tend;\n\tg_Stats.NumTrackedLinks = NumLinks;\n\tg_TrackedPages = {};\n\n\tif (#MissingPages == 0) then\n\t\t-- No missing pages, congratulations!\n\t\treturn;\n\tend\n\n\t-- Sort the pages by name:\n\ttable.sort(MissingPages,\n\t\tfunction (Page1, Page2)\n\t\t\treturn (Page1.Name < Page2.Name);\n\t\tend\n\t);\n\n\t-- Output the pages:\n\tlocal f, err = io.open(\"API/_missingPages.txt\", \"w\");\n\tif (f == nil) then\n\t\tLOGWARNING(\"Cannot open _missingPages.txt for writing: '\" .. err .. \"'. There are \" .. #MissingPages .. \" pages missing.\");\n\t\treturn;\n\tend\n\tfor _, pg in ipairs(MissingPages) do\n\t\tf:write(pg.Name .. \":\\n\");\n\t\t-- Sort and output the referrers:\n\t\ttable.sort(pg.Refs);\n\t\tf:write(\"\\t\" .. table.concat(pg.Refs, \"\\n\\t\"));\n\t\tf:write(\"\\n\\n\");\n\tend\n\tf:close();\n\tg_Stats.NumInvalidLinks = #MissingPages;\nend\n\n\n\n\n\n--- Writes the documentation statistics (in g_Stats) into the given HTML file\nlocal function WriteStats(f)\n\tlocal function ExportMeter(a_Percent)\n\t\tlocal Color;\n\t\tif (a_Percent > 99) then\n\t\t\tColor = \"green\";\n\t\telseif (a_Percent > 50) then\n\t\t\tColor = \"orange\";\n\t\telse\n\t\t\tColor = \"red\";\n\t\tend\n\n\t\tlocal meter = {\n\t\t\t\"\\n\",\n\t\t\t\"<div style=\\\"background-color: black; padding: 1px; width: 100px\\\">\\n\",\n\t\t\t\"<div style=\\\"background-color: \",\n\t\t\tColor,\n\t\t\t\"; width: \",\n\t\t\ta_Percent,\n\t\t\t\"%; height: 16px\\\"></div></div>\\n</td><td>\",\n\t\t\tstring.format(\"%.2f\", a_Percent),\n\t\t\t\" %\",\n\t\t};\n\t\treturn table.concat(meter, \"\");\n\tend\n\n\tf:write([[\n\t\t<hr /><a name=\"docstats\"><h2>Documentation statistics</h2></a>\n\t\t<table><tr><th>Object</th><th>Total</th><th>Documented</th><th>Undocumented</th><th colspan=\"2\">Documented %</th></tr>\n\t]]);\n\tf:write(\"<tr><td>Classes</td><td>\", g_Stats.NumTotalClasses);\n\tf:write(\"</td><td>\", g_Stats.NumTotalClasses - g_Stats.NumUndocumentedClasses);\n\tf:write(\"</td><td>\", g_Stats.NumUndocumentedClasses);\n\tf:write(\"</td><td>\", ExportMeter(100 * (g_Stats.NumTotalClasses - g_Stats.NumUndocumentedClasses) / g_Stats.NumTotalClasses));\n\tf:write(\"</td></tr>\\n\");\n\n\tf:write(\"<tr><td>Functions</td><td>\", g_Stats.NumTotalFunctions);\n\tf:write(\"</td><td>\", g_Stats.NumTotalFunctions - g_Stats.NumUndocumentedFunctions);\n\tf:write(\"</td><td>\", g_Stats.NumUndocumentedFunctions);\n\tf:write(\"</td><td>\", ExportMeter(100 * (g_Stats.NumTotalFunctions - g_Stats.NumUndocumentedFunctions) / g_Stats.NumTotalFunctions));\n\tf:write(\"</td></tr>\\n\");\n\n\tf:write(\"<tr><td>Member variables</td><td>\", g_Stats.NumTotalVariables);\n\tf:write(\"</td><td>\", g_Stats.NumTotalVariables - g_Stats.NumUndocumentedVariables);\n\tf:write(\"</td><td>\", g_Stats.NumUndocumentedVariables);\n\tf:write(\"</td><td>\", ExportMeter(100 * (g_Stats.NumTotalVariables - g_Stats.NumUndocumentedVariables) / g_Stats.NumTotalVariables));\n\tf:write(\"</td></tr>\\n\");\n\n\tf:write(\"<tr><td>Constants</td><td>\", g_Stats.NumTotalConstants);\n\tf:write(\"</td><td>\", g_Stats.NumTotalConstants - g_Stats.NumUndocumentedConstants);\n\tf:write(\"</td><td>\", g_Stats.NumUndocumentedConstants);\n\tf:write(\"</td><td>\", ExportMeter(100 * (g_Stats.NumTotalConstants - g_Stats.NumUndocumentedConstants) / g_Stats.NumTotalConstants));\n\tf:write(\"</td></tr>\\n\");\n\n\tf:write(\"<tr><td>Hooks</td><td>\", g_Stats.NumTotalHooks);\n\tf:write(\"</td><td>\", g_Stats.NumTotalHooks - g_Stats.NumUndocumentedHooks);\n\tf:write(\"</td><td>\", g_Stats.NumUndocumentedHooks);\n\tf:write(\"</td><td>\", ExportMeter(100 * (g_Stats.NumTotalHooks - g_Stats.NumUndocumentedHooks) / g_Stats.NumTotalHooks));\n\tf:write(\"</td></tr>\\n\");\n\n\tf:write([[\n\t\t</table>\n\t\t<p>There are ]], g_Stats.NumTrackedLinks, \" internal links, \", g_Stats.NumInvalidLinks, \" of them are invalid.</p>\"\n\t);\nend\n\n\n\n\n\nlocal function DumpAPIHtml(a_API, a_Descs)\n\tLOG(\"Dumping all available functions and constants to API subfolder...\");\n\n\t-- Create the output folder\n\tif not(cFile:IsFolder(\"API\")) then\n\t\tcFile:CreateFolder(\"API\");\n\tend\n\n\tLOG(\"Copying static files..\");\n\tcFile:CreateFolder(\"API/Static\");\n\tlocal localFolder = g_Plugin:GetLocalFolder();\n\tfor _, fnam in ipairs(cFile:GetFolderContents(localFolder .. \"/Static\")) do\n\t\tcFile:Delete(\"API/Static/\" .. fnam);\n\t\tcFile:Copy(localFolder .. \"/Static/\" .. fnam, \"API/Static/\" .. fnam);\n\tend\n\n\t-- Extract hook constants:\n\tlocal Hooks = {};\n\tlocal UndocumentedHooks = {};\n\tfor name, obj in pairs(cPluginManager) do\n\t\tif (\n\t\t\t(type(obj) == \"number\") and\n\t\t\tname:match(\"HOOK_.*\") and\n\t\t\t(name ~= \"HOOK_MAX\") and\n\t\t\t(name ~= \"HOOK_NUM_HOOKS\")\n\t\t) then\n\t\t\ttable.insert(Hooks, { Name = name });\n\t\tend\n\tend\n\ttable.sort(Hooks,\n\t\tfunction(Hook1, Hook2)\n\t\t\treturn (Hook1.Name < Hook2.Name);\n\t\tend\n\t);\n\tReadHooks(Hooks, a_Descs);\n\n\t-- Create a \"class index\" file, write each class as a link to that file,\n\t-- then dump class contents into class-specific file\n\tLOG(\"Writing HTML files...\");\n\tlocal f, err = io.open(\"API/index.html\", \"w\");\n\tif (f == nil) then\n\t\tLOGINFO(\"Cannot output HTML API: \" .. err);\n\t\treturn;\n\tend\n\n\t-- Create a class navigation menu that will be inserted into each class file for faster navigation (#403)\n\tlocal ClassMenuTab = {};\n\tfor _, cls in ipairs(a_API) do\n\t\ttable.insert(ClassMenuTab, \"<a href='\");\n\t\ttable.insert(ClassMenuTab, cls.Name);\n\t\ttable.insert(ClassMenuTab, \".html'>\");\n\t\ttable.insert(ClassMenuTab, cls.Name);\n\t\ttable.insert(ClassMenuTab, \"</a><br />\");\n\tend\n\tlocal ClassMenu = table.concat(ClassMenuTab, \"\");\n\n\t-- Create a hook navigation menu that will be inserted into each hook file for faster navigation(#403)\n\tlocal HookNavTab = {};\n\tfor _, hook in ipairs(Hooks) do\n\t\ttable.insert(HookNavTab, \"<a href='\");\n\t\ttable.insert(HookNavTab, hook.DefaultFnName);\n\t\ttable.insert(HookNavTab, \".html'>\");\n\t\ttable.insert(HookNavTab, (hook.Name:gsub(\"^HOOK_\", \"\")));  -- remove the \"HOOK_\" part of the name\n\t\ttable.insert(HookNavTab, \"</a><br />\");\n\tend\n\tlocal HookNav = table.concat(HookNavTab, \"\");\n\n\t-- Write the HTML file:\n\tf:write([[<!DOCTYPE html>\n\t\t<html>\n\t\t<head>\n\t\t<title>Cuberite API - Index</title>\n\t\t<link rel=\"canonical\" href=\"https://api.cuberite.org/\">\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n\t\t</head>\n\t\t<body>\n\t\t<div id=\"content\">\n\t\t<header>\n\t\t<h1>Cuberite API - Index</h1>\n\t\t<hr />\n\t\t</header>\n\t\t<p>The API reference is divided into the following sections:</p>\n\t\t<ul>\n\t\t<li><a href=\"#articles\">Articles</a></li>\n\t\t<li><a href=\"#classes\">Class index</a></li>\n\t\t<li><a href=\"#hooks\">Hooks</a></li>\n\t\t<li><a href=\"#docstats\">Documentation statistics</a></li>\n\t\t</ul>\n\t\t<hr />\n\t]]);\n\n\tWriteArticles(f, a_Descs);\n\tWriteClasses(f, a_API, ClassMenu);\n\tWriteHooks(f, Hooks, UndocumentedHooks, HookNav, a_API);\n\n\t-- Copy the static files to the output folder:\n\tlocal StaticFiles =\n\t{\n\t\t\"main.css\",\n\t\t\"prettify.js\",\n\t\t\"prettify.css\",\n\t\t\"lang-lua.js\",\n\t};\n\tfor _, fnam in ipairs(StaticFiles) do\n\t\tcFile:Delete(\"API/\" .. fnam);\n\t\tcFile:Copy(g_Plugin:GetLocalFolder() .. \"/\" .. fnam, \"API/\" .. fnam);\n\tend\n\n\t-- List the documentation problems:\n\tLOG(\"Listing leftovers...\");\n\tListUndocumentedObjects(a_API, UndocumentedHooks);\n\tListUnexportedObjects(a_Descs);\n\tListMissingPages();\n\n\tWriteStats(f);\n\n\tf:write([[</ul></div>]])\n\tf:write(GetHtmlTimestamp())\n\tf:write([[</body></html>]])\n\tf:close()\n\n\tLOG(\"API subfolder written\");\nend\n\n\n\n\n\n--- Returns the string with extra tabs and CR/LFs removed\nfunction CleanUpDescription(a_Desc)\n\t-- Get rid of indent and newlines, normalize whitespace:\n\tlocal res = a_Desc:gsub(\"[\\n\\t]\", \"\")\n\tres = a_Desc:gsub(\"%s%s+\", \" \")\n\n\t-- Replace paragraph marks with newlines:\n\tres = res:gsub(\"<p>\", \"\\n\")\n\tres = res:gsub(\"</p>\", \"\")\n\n\t-- Replace list items with dashes:\n\tres = res:gsub(\"</?ul>\", \"\")\n\tres = res:gsub(\"<li>\", \"\\n    - \")\n\tres = res:gsub(\"</li>\", \"\")\n\n\treturn res\nend\n\n\n\n\n\n--- Writes a list of methods into the specified file in ZBS format\nlocal function WriteZBSMethods(f, a_Methods)\n\tfor _, func in ipairs(a_Methods or {}) do\n\t\tf:write(\"\\t\\t\\t[\\\"\", func.Name, \"\\\"] =\\n\")\n\t\tf:write(\"\\t\\t\\t{\\n\")\n\t\tf:write(\"\\t\\t\\t\\ttype = \\\"method\\\",\\n\")\n\t\t-- No way to indicate multiple signatures to ZBS, so don't output any params at all\n\t\tif ((func.Notes ~= nil) and (func.Notes ~= \"\")) then\n\t\t\tf:write(\"\\t\\t\\t\\tdescription = [[\", CleanUpDescription(func.Notes or \"\"), \" ]],\\n\")\n\t\tend\n\t\tf:write(\"\\t\\t\\t},\\n\")\n\tend\nend\n\n\n\n\n\n--- Writes a list of constants into the specified file in ZBS format\nlocal function WriteZBSConstants(f, a_Constants)\n\tfor _, cons in ipairs(a_Constants or {}) do\n\t\tf:write(\"\\t\\t\\t[\\\"\", cons.Name, \"\\\"] =\\n\")\n\t\tf:write(\"\\t\\t\\t{\\n\")\n\t\tf:write(\"\\t\\t\\t\\ttype = \\\"value\\\",\\n\")\n\t\tif ((cons.Desc ~= nil) and (cons.Desc ~= \"\")) then\n\t\t\tf:write(\"\\t\\t\\t\\tdescription = [[\", CleanUpDescription(cons.Desc or \"\"), \" ]],\\n\")\n\t\tend\n\t\tf:write(\"\\t\\t\\t},\\n\")\n\tend\nend\n\n\n\n\n\n--- Writes one Cuberite class definition into the specified file in ZBS format\nlocal function WriteZBSClass(f, a_Class)\n\tassert(type(a_Class) == \"table\")\n\n\t-- Write class header:\n\tf:write(\"\\t\", a_Class.Name, \" =\\n\\t{\\n\")\n\tf:write(\"\\t\\ttype = \\\"class\\\",\\n\")\n\tf:write(\"\\t\\tdescription = [[\", CleanUpDescription(a_Class.Desc or \"\"), \" ]],\\n\")\n\tf:write(\"\\t\\tchilds =\\n\")\n\tf:write(\"\\t\\t{\\n\")\n\n\t-- Export methods and constants:\n\tWriteZBSMethods(f, a_Class.Functions)\n\tWriteZBSConstants(f, a_Class.Constants)\n\n\t-- Finish the class definition:\n\tf:write(\"\\t\\t},\\n\")\n\tf:write(\"\\t},\\n\\n\")\nend\n\n\n\n\n\n--- Dumps the entire API table into a file in the ZBS format\nlocal function DumpAPIZBS(a_API)\n\tLOG(\"Dumping ZBS API description...\")\n\tlocal f, err = io.open(\"cuberite_api.lua\", \"w\")\n\tif (f == nil) then\n\t\tLOG(\"Cannot open cuberite_api.lua for writing, ZBS API will not be dumped. \" .. err)\n\t\treturn\n\tend\n\n\t-- Write the file header:\n\tf:write(\"-- This is a Cuberite API file automatically generated by the APIDump plugin\\n\")\n\tf:write(\"-- Note that any manual changes will be overwritten by the next dump\\n\\n\")\n\tf:write(\"return {\\n\")\n\n\t-- Export each class except Globals, store those aside:\n\tlocal Globals\n\tfor _, cls in ipairs(a_API) do\n\t\tif (cls.Name ~= \"Globals\") then\n\t\t\tWriteZBSClass(f, cls)\n\t\telse\n\t\t\tGlobals = cls\n\t\tend\n\tend\n\n\t-- Export the globals:\n\tif (Globals) then\n\t\tWriteZBSMethods(f, Globals.Functions)\n\t\tWriteZBSConstants(f, Globals.Constants)\n\tend\n\n\t-- Finish the file:\n\tf:write(\"}\\n\")\n\tf:close()\n\tLOG(\"ZBS API dumped...\")\nend\n\n\n\n\n\nlocal function DumpLuaCheck(a_API)\n\tLOG(\"Creating file .luacheckrc...\")\n\tlocal file = io.open(\".luacheckrc\", \"w\")\n\n\tfile:write([[\n-- This file is the config file for the tool named Luacheck\n-- Documentation: https://luacheck.readthedocs.io/en/stable/index.html\n\n-- Ignore unused function and loop arguments\nunused_args = false\n\n-- Allow self defined globals\nallow_defined = true\n\n-- Ignore this functions\nignore =\n{\n\t\"Initialize\",  -- Plugin\n\t\"OnDisable\",  -- Plugin\n\t\"RegisterPluginInfoCommands\",  -- InfoReg.lua\n\t\"RegisterPluginInfoConsoleCommands\",  -- InfoReg.lua\n\t\"g_PluginInfo\",  -- Info.lua\n}\n\n-- Ignore files / directories\nexclude_files =\n{\n\t\"tests/\" -- CuberitePluginChecker\n}\n\n-- All globals from cuberite (classes, enums, functions)\nglobals =\n{\n]])\n\n\t-- Export all global symbols\n\tfor _, cls in ipairs(a_API) do\n\t\tif cls.Name == \"Globals\" then\n\t\t\t-- Global functions\n\t\t\tfor _, func in ipairs(cls.Functions) do\n\t\t\t\tfile:write(\"\\t\\\"\", func.Name, \"\\\",\\n\")\n\t\t\tend\n\n\t\t\t-- Global constants\n\t\t\tfor _, const in ipairs(cls.Constants) do\n\t\t\t\tfile:write(\"\\t\\\"\", const.Name, \"\\\",\\n\")\n\t\t\tend\n\n\t\t\t-- Global constants from all groups\n\t\t\tfor _, group in pairs(cls.ConstantGroups) do\n\t\t\t\tfor _, const in pairs(group.Constants) do\n\t\t\t\t\tfile:write(\"\\t\\\"\", const.Name, \"\\\",\\n\")\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tfile:write(\"\\t\\\"\", cls.Name, \"\\\",\\n\")\n\t\tend\n\tend\n\n\tfile:write(\"}\\n\\n\")\n\n\t-- Add merge code\n\tfile:write([[\n-- ## Main ##\n\n-- Load plugins's luacheck\nlocal FilePluginLuacheck = loadfile(\".luacheckrc_plugin\")\n\nif FilePluginLuacheck ~= nil then\n\tlocal PluginLuacheck = {}\n\tsetfenv(FilePluginLuacheck, PluginLuacheck)\n\tFilePluginLuacheck()\n\n\tfor Option, Value in pairs(PluginLuacheck) do\n\t\tif (type(Value) == \"table\") and not(getfenv(1)[Option] == nil) then\n\t\t\t-- Merge tables together\n\t\t\tfor _ , Entry in ipairs(Value) do\n\t\t\t\ttable.insert(getfenv(1)[Option], Entry)\n\t\t\tend\n\t\telse\n\t\t\t-- Add a option, table or overwrite a option\n\t\t\tgetfenv(1)[Option] = Value\n\t\tend\n\tend\nend\n]])\n\n\tfile:close()\n\n\tLOG(\"Config file .luacheckrc created...\")\nend\n\n\n\n\n\n--- Returns true if a_Descendant is declared to be a (possibly indirect) descendant of a_Base\nlocal function IsDeclaredDescendant(a_DescendantName, a_BaseName, a_API)\n\t-- Check params:\n\tassert(type(a_DescendantName) == \"string\")\n\tassert(type(a_BaseName) == \"string\")\n\tassert(type(a_API) == \"table\")\n\tif not(a_API[a_BaseName]) then\n\t\treturn false\n\tend\n\tassert(type(a_API[a_BaseName]) == \"table\", \"Not a class name: \" .. a_BaseName)\n\tassert(type(a_API[a_BaseName].Descendants) == \"table\")\n\n\t-- Check direct inheritance:\n\tfor _, desc in ipairs(a_API[a_BaseName].Descendants) do\n\t\tif (desc.Name == a_DescendantName) then\n\t\t\treturn true\n\t\tend\n\tend  -- for desc - a_BaseName's descendants\n\n\t-- Check indirect inheritance:\n\tfor _, desc in ipairs(a_API[a_BaseName].Descendants) do\n\t\tif (IsDeclaredDescendant(a_DescendantName, desc.Name, a_API)) then\n\t\t\treturn true\n\t\tend\n\tend  -- for desc - a_BaseName's descendants\n\n\treturn false\nend\n\n\n\n\n\n--- Checks the specified class' inheritance\n-- Reports any problems as new items in the a_Report table\nlocal function CheckClassInheritance(a_Class, a_API, a_Report)\n\t-- Check params:\n\tassert(type(a_Class) == \"table\")\n\tassert(type(a_API) == \"table\")\n\tassert(type(a_Report) == \"table\")\n\n\t-- Check that the declared descendants are really descendants:\n\tlocal registry = debug.getregistry()\n\tfor _, desc in ipairs(a_Class.Descendants or {}) do\n\t\tlocal isParent = false\n\t\tlocal parents = registry[\"tolua_super\"][_G[desc.Name]]\n\t\tif not(parents[a_Class.Name]) then\n\t\t\ttable.insert(a_Report, desc.Name .. \" is not a descendant of \" .. a_Class.Name)\n\t\tend\n\tend  -- for desc - a_Class.Descendants[]\n\n\t-- Check that all inheritance is listed for the class:\n\tlocal parents = registry[\"tolua_super\"][_G[a_Class.Name]]  -- map of \"classname\" -> true for each class that a_Class inherits\n\tfor clsName, isParent in pairs(parents or {}) do\n\t\tif ((clsName ~= \"\") and not(clsName:match(\"const .*\"))) then\n\t\t\tif not(IsDeclaredDescendant(a_Class.Name, clsName, a_API)) then\n\t\t\t\ttable.insert(a_Report, a_Class.Name .. \" inherits from \" .. clsName .. \" but this isn't documented\")\n\t\t\tend\n\t\tend\n\tend\nend\n\n\n\n\n\n--- Checks each class's declared inheritance versus the actual inheritance\nlocal function CheckAPIDescendants(a_API)\n\t-- Check each class:\n\tlocal report = {}\n\tfor _, cls in ipairs(a_API) do\n\t\tif (cls.Name ~= \"Globals\") then\n\t\t\tCheckClassInheritance(cls, a_API, report)\n\t\tend\n\tend\n\n\t-- If there's anything to report, output it to a file:\n\tif (report[1] ~= nil) then\n\t\tLOG(\"There are inheritance errors in the API description:\")\n\t\tfor _, msg in ipairs(report) do\n\t\t\tLOG(\"  \" .. msg)\n\t\tend\n\n\t\tlocal f, err = io.open(\"API/_inheritance_errors.txt\", \"w\")\n\t\tif (f == nil) then\n\t\t\tLOG(\"Cannot report inheritance problems to a file: \" .. tostring(err))\n\t\t\treturn\n\t\tend\n\t\tf:write(table.concat(report, \"\\n\"))\n\t\tf:close()\n\tend\nend\n\n\n\n\n\n--- Prepares the API and Globals tables containing the documentation\n-- Returns the API and Globals desc table, containing the Classes and Hooks subtables with descriptions,\n-- and the apiDesc table containing the descriptions only in their original format.\nlocal function PrepareApi()\n\t-- Load the API descriptions from the Classes and Hooks subfolders:\n\t-- This needs to be done each time the command is invoked because the export modifies the tables' contents\n\tlocal apiDesc = dofile(g_PluginFolder .. \"/APIDesc.lua\")\n\tapiDesc.Classes = apiDesc.Classes or {}\n\tapiDesc.Hooks = apiDesc.Hooks or {}\n\tLoadAPIFiles(\"/Classes/\", apiDesc.Classes)\n\tLoadAPIFiles(\"/Hooks/\",   apiDesc.Hooks)\n\n\t-- Reset the stats:\n\tg_TrackedPages = {};  -- List of tracked pages, to be checked later whether they exist. Each item is an array of referring pagenames.\n\tg_Stats =  -- Statistics about the documentation\n\t{\n\t\tNumTotalClasses = 0,\n\t\tNumUndocumentedClasses = 0,\n\t\tNumTotalFunctions = 0,\n\t\tNumUndocumentedFunctions = 0,\n\t\tNumTotalConstants = 0,\n\t\tNumUndocumentedConstants = 0,\n\t\tNumTotalVariables = 0,\n\t\tNumUndocumentedVariables = 0,\n\t\tNumTotalHooks = 0,\n\t\tNumUndocumentedHooks = 0,\n\t\tNumTrackedLinks = 0,\n\t\tNumInvalidLinks = 0,\n\t}\n\n\t-- Create the API tables:\n\tlocal API, Globals = CreateAPITables();\n\n\t-- Sort the classes by name:\n\ttable.sort(API,\n\t\tfunction (c1, c2)\n\t\t\treturn (string.lower(c1.Name) < string.lower(c2.Name));\n\t\tend\n\t);\n\tg_Stats.NumTotalClasses = #API;\n\n\t-- Add Globals into the API:\n\tGlobals.Name = \"Globals\";\n\ttable.insert(API, Globals);\n\tAPI.Globals = Globals\n\n\t-- Read in the descriptions:\n\tLOG(\"Reading descriptions...\");\n\tReadDescriptions(API, apiDesc);\n\n\treturn API, Globals, apiDesc\nend\n\n\n\n\n\nlocal function DumpApi()\n\tLOG(\"Dumping the API...\")\n\n\t-- Match the currently exported API with the available documentation:\n\tlocal API, Globals, descs = PrepareApi()\n\n\t-- Check that the API lists the inheritance properly, report any problems to a file:\n\tCheckAPIDescendants(API)\n\n\t-- Dump all available API objects in HTML format into a subfolder:\n\tDumpAPIHtml(API, descs);\n\n\t-- Dump all available API objects in format used by ZeroBraneStudio API descriptions:\n\tDumpAPIZBS(API)\n\n\t-- Dump all available API objects in format used by Lua-Language-Server API descriptions:\n\tDumpAPILLS(API);\n\n\t-- Export the API in a format used by LuaCheck\n\tDumpLuaCheck(API)\n\n\tLOG(\"APIDump finished\");\n\treturn true\nend\n\n\n\n\n\n--- Checks the currently undocumented symbols against an \"official\" undocumented symbol list\n-- Returns an array-table of strings representing the newly-undocumented symbol names\n-- If no newly undocumented symbols are found, returns no value.\n-- If an error occurs, returns true and error message.\nlocal function CheckNewUndocumentedSymbols()\n\t-- Download the official API stats on undocumented stuff:\n\t-- (We need a blocking downloader, which is impossible with the current cNetwork API)\n\tassert(os.execute(\"wget -q -O official_undocumented.lua https://api.cuberite.org/_undocumented.lua\"))\n\tlocal OfficialStats = cFile:ReadWholeFile(\"official_undocumented.lua\")\n\tif (OfficialStats == \"\") then\n\t\treturn true, \"Cannot load official stats\"\n\tend\n\n\t-- Load the API stats as a Lua file, process into usable dictionary:\n\t-- The _undocumented.lua file format has changed from \"g_APIDesc = {}\" to \"return {}\"\n\t-- To support both versions, we execute the function in a sandbox and check both its return value and the sandbox globals\n\tlocal Loaded, Msg = loadstring(OfficialStats)\n\tif not(Loaded) then\n\t\treturn true, \"Cannot load official stats: \" .. (Msg or \"<unknown error>\")\n\tend\n\tlocal sandbox = {}\n\tsetfenv(Loaded, sandbox)\n\tlocal IsSuccess, OfficialUndocumented = pcall(Loaded)\n\tif not(IsSuccess) then\n\t\treturn true, \"Cannot parse official stats: \" .. tostring(OfficialUndocumented or \"<unknown error>\")\n\tend\n\tlocal Parsed = {}\n\tfor clsK, clsV in pairs((sandbox.g_APIDesc or OfficialUndocumented).Classes) do  -- Check return value OR sandbox global, whichever is present\n\t\tlocal cls =\n\t\t{\n\t\t\tDesc = not(clsV.Desc),  -- set to true if the Desc was not documented in the official docs\n\t\t\tFunctions = {},\n\t\t\tConstants = {}\n\t\t}\n\t\tfor funK, _ in pairs(clsV.Functions or {}) do\n\t\t\tcls.Functions[funK] = true\n\t\tend\n\t\tfor conK, _ in pairs(clsV.Constants or {}) do\n\t\t\tcls.Constants[conK] = true\n\t\tend\n\t\tParsed[clsK] = cls\n\tend\n\n\t-- Get the current API's undocumented stats:\n\tlocal API = PrepareApi()\n\n\t-- Compare the two sets of undocumented stats, list anything extra in current:\n\tlocal res = {}\n\tlocal ins = table.insert\n\tfor _, cls in ipairs(API) do\n\t\tlocal ParsedOfficial = Parsed[cls.Name] or {}\n\t\tif (not(cls.Desc) and ParsedOfficial.Desc) then\n\t\t\tins(res, cls.Name .. \".Desc\")\n\t\tend\n\t\tlocal ParsedOfficialFns = ParsedOfficial.Functions or {}\n\t\tfor _, funK in ipairs(cls.UndocumentedFunctions or {}) do\n\t\t\tif not(ParsedOfficialFns[funK]) then\n\t\t\t\tins(res, cls.Name .. \".\" .. funK .. \" (function)\")\n\t\t\tend\n\t\tend\n\t\tlocal ParsedOfficialCons = ParsedOfficial.Constants or {}\n\t\tfor _, conK in ipairs(cls.UndocumentedConstants or {}) do\n\t\t\tif not(ParsedOfficialCons[conK]) then\n\t\t\t\tins(res, cls.Name .. \".\" .. conK .. \" (constant)\")\n\t\t\tend\n\t\tend\n\tend\n\ttable.sort(res)\n\n\t-- Bail out if no items found:\n\tif not(res[1]) then\n\t\treturn\n\tend\n\n\t-- Save any found items to a file:\n\tlocal f = io.open(\"NewlyUndocumented.lua\", \"w\")\n\tf:write(table.concat(res, \"\\n\"))\n\tf:write(\"\\n\")\n\tf:close()\n\n\treturn res\nend\n\n\n\n\n\n--- Checks the API description for unknown types listed in Params or Returns\n-- Returns an array-table of { Location = \"cClass:function(), param #1\", Type = \"UnknownType\" }\n-- Returns nil if no unknown types are found\nlocal function CheckBadTypes()\n\t-- Load the API and preprocess known types:\n\tlocal api = PrepareApi()\n\tlocal knownTypes =\n\t{\n\t\tstring = true,\n\t\tnumber = true,\n\t\tboolean = true,\n\t\tany = true,\n\t\tself = true,\n\t\ttable = true,\n\t\t[\"function\"] = true,\n\t\t[\"...\"] = true,\n\t\t[\"SQLite DB object\"] = true,\n\t\t[\"<unknown>\"] = true,  -- Allow \"<unknown>\" types, for now, until the API is properly documented\n\t}\n\tfor _, clsDesc in ipairs(api) do\n\t\tknownTypes[clsDesc.Name] = true  -- The class is a known type\n\t\tfor grpName, _ in pairs(clsDesc.ConstantGroups or {}) do  -- All class' enums are known types (with namespacing)\n\t\t\tknownTypes[clsDesc.Name .. \"#\" .. grpName] = true\n\t\tend\n\t\tif (clsDesc.Name == \"Globals\") then\n\t\t\tfor grpName, _ in pairs(clsDesc.ConstantGroups or {}) do  -- All Globals' enums are known types without namespacing, too\n\t\t\t\tknownTypes[grpName] = true\n\t\t\tend\n\t\tend\n\tend  -- for cls - classes\n\n\t-- Check types:\n\tlocal res = {}\n\tfor _, clsDesc in ipairs(api) do\n\t\tfor _, fnDesc in ipairs(clsDesc.Functions or {}) do\n\t\t\tlocal fnName = fnDesc.Name\n\t\t\tlocal fn = fnDesc[1] and fnDesc or { fnDesc }  -- Unify the format, fn is an array of function signatures\n\t\t\tfor idxS, signature in ipairs(fn) do\n\t\t\t\tfor idxP, param in ipairs(signature.Params or {}) do\n\t\t\t\t\tif not(knownTypes[param.Type]) then\n\t\t\t\t\t\ttable.insert(res, {\n\t\t\t\t\t\t\tLocation = string.format(\"%s:%s(), signature #%d, param #%d\", clsDesc.Name, fnName, idxS, idxP),\n\t\t\t\t\t\t\tType = param.Type,\n\t\t\t\t\t\t})\n\t\t\t\t\tend\n\t\t\t\tend  -- for param\n\t\t\t\tif (type(signature.Returns) == \"table\") then\n\t\t\t\t\tfor idxR, ret in ipairs(signature.Returns) do\n\t\t\t\t\t\tif not(knownTypes[ret.Type]) then\n\t\t\t\t\t\t\ttable.insert(res, {\n\t\t\t\t\t\t\t\tLocation = string.format(\"%s:%s(), signature #%d, return #%d\", clsDesc.Name, fnName, idxS, idxR),\n\t\t\t\t\t\t\t\tType = ret.Type,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tend\n\t\t\t\t\tend  -- for ret\n\t\t\t\telseif not(signature.Returns) then\n\t\t\t\telse\n\t\t\t\t\ttable.insert(res, {\n\t\t\t\t\t\tLocation = string.format(\"%s:%s(), signature #%d, return string\", clsDesc.Name, fnName, idxS),\n\t\t\t\t\t\tType = tostring(signature.Returns),\n\t\t\t\t\t})\n\t\t\t\tend\n\t\t\tend  -- for signature\n\t\tend  -- for fn - functions\n\tend  -- for cls - classes\n\n\t-- If no problems found, bail out:\n\tif not(res[1]) then\n\t\treturn\n\tend\n\n\t-- Write the problems into a file:\n\tlocal f = io.open(\"UnknownTypes.lua\", \"w\")\n\tf:write(\"return\\n{\\n\")\n\tfor _, item in ipairs(res) do\n\t\tf:write(\"\\t{ \", string.format(\"{ Location = %q, Type = %q\", item.Location, item.Type), \"},\\n\")\n\tend\n\tf:write(\"}\\n\")\n\tf:close()\n\treturn res\nend\n\n\n\n\n--- Checks if any functions that are documented are present in the API\n-- Returns an array-table of strings representing the unexported symbol names\n-- If no unexported are found, returns no value.\n-- If an error occurs, returns true and error message.\nlocal function CheckUnexportedFunctions()\n\tlocal res = {}\n\n\tlocal API, Globals, Desc = PrepareApi()\n\tfor clsname, cls in pairs(Desc.Classes) do\n\t\tif not(cls.IsExported) then\n\t\t\t-- The whole class is not exported\n\t\t\ttable.insert(res, \"class\\t\" .. clsname .. \"\\n\");\n\t\telse\n\t\t\tif (cls.Functions ~= nil) then\n\t\t\t\tfor fnname, fnapi in pairs(cls.Functions) do\n\t\t\t\t\tif not(fnapi.IsExported) then\n\t\t\t\t\t\ttable.insert(res, \"func\\t\" .. clsname .. \".\" .. fnname);\n\t\t\t\t\tend\n\t\t\t\tend  -- for j, fn - cls.Functions[]\n\t\t\tend\n\t\t\tif (cls.Constants ~= nil) then\n\t\t\t\tfor cnname, cnapi in pairs(cls.Constants) do\n\t\t\t\t\tif not(cnapi.IsExported) then\n\t\t\t\t\t\ttable.insert(res, \"const\\t\" .. clsname .. \".\" .. cnname);\n\t\t\t\t\tend\n\t\t\t\tend  -- for j, fn - cls.Functions[]\n\t\t\tend\n\t\tend\n\tend  -- for i, cls - a_APIDesc.Classes[]\n\n\ttable.sort(res)\n\n\t-- Bail out if no items found:\n\tif not(res[1]) then\n\t\treturn\n\tend\n\n\t-- Save any found items to a file:\n\tlocal f = io.open(\"Unexported.lua\", \"w\")\n\tf:write(table.concat(res, \"\\n\"))\n\tf:write(\"\\n\")\n\tf:close()\n\n\treturn res\nend\n\n\n\n\n\n\nlocal function HandleWebAdminDump(a_Request)\n\tif (a_Request.PostParams[\"Dump\"] ~= nil) then\n\t\tDumpApi()\n\tend\n\treturn\n\t[[\n\t<p>Pressing the button will generate the API dump on the server. Note that this can take some time.</p>\n\t<form method=\"POST\"><input type=\"submit\" name=\"Dump\" value=\"Dump the API\"/></form>\n\t]]\nend\n\n\n\n\n\nlocal function HandleCmdApi(a_Split)\n\tDumpApi()\n\treturn true\nend\n\n\n\n\n\nlocal function HandleCmdApiShow(a_Split, a_EntireCmd)\n\tos.execute(\"API\" .. cFile:GetPathSeparator() .. \"index.html\")\n\treturn true, \"Launching the browser to show the API docs...\"\nend\n\n\n\n\n\nlocal function HandleCmdApiCheck(a_Split, a_EntireCmd)\n\t-- Check the Params and Returns types:\n\tLOG(\"Checking API for bad types...\")\n\tlocal badTypes = CheckBadTypes()\n\tif (badTypes) then\n\t\t-- Serialize into descriptions:\n\t\tlocal descs = {}\n\t\tfor idx, t in ipairs(badTypes) do\n\t\t\tdescs[idx] = string.format(\"Location %q, type %q\", t.Location, t.Type)\n\t\tend\n\t\treturn true, \"Found bad types:\\n\" .. table.concat(descs, \"\\n\")\n\tend\n\n\t-- Check for new symbols that are not documented:\n\tLOG(\"Checking API for newly undocumented symbols...\")\n\tlocal newUndocumented, msg = CheckNewUndocumentedSymbols()\n\tif (newUndocumented) then\n\t\tif (newUndocumented == true) then\n\t\t\tLOGERROR(\"Cannot check for new undocumented symbols: \" .. (msg or \"<no message>\"))\n\t\t\treturn true\n\t\telse\n\t\t\tLOGERROR(\"Found new undocumented symbols:\\n\" .. table.concat(newUndocumented, \"\\n\"))\n\t\t\treturn true\n\t\tend\n\tend\n\n\tLOG(\"Checking for unexported Objects...\")\n\tlocal unexported, msg = CheckUnexportedFunctions()\n\tif (unexported) then\n\t\tif (unexported == true) then\n\t\t\tLOGERROR(\"Cannot check for unexported symbols: \" .. (msg or \"<no message>\"))\n\t\t\treturn true\n\t\telse\n\t\t\tLOGERROR(\"Found unexported symbols:\\n\" .. table.concat(unexported, \"\\n\"))\n\t\t\treturn true\n\t\tend\n\tend\n\n\t-- The check completed successfully, remove the \"test failed\" flag from the filesystem:\n\tcFile:DeleteFile(\"apiCheckFailed.flag\")\n\n\treturn true, \"API check completed successfully\"\nend\n\n\n\n\n\nfunction Initialize(Plugin)\n\tg_Plugin = Plugin;\n\tg_PluginFolder = Plugin:GetLocalFolder();\n\n\tLOG(\"Initialising v.\" .. Plugin:GetVersion())\n\n\t-- Bind a console command to dump the API:\n\tcPluginManager:BindConsoleCommand(\"api\",      HandleCmdApi,      \"Dumps the Lua API docs into the API/ subfolder\")\n\tcPluginManager:BindConsoleCommand(\"apicheck\", HandleCmdApiCheck, \"Checks the Lua API documentation stats against the official stats\")\n\tcPluginManager:BindConsoleCommand(\"apishow\",  HandleCmdApiShow,  \"Runs the default browser to show the API docs\")\n\n\t-- Add a WebAdmin tab that has a Dump button\n\tg_Plugin:AddWebTab(\"APIDump\", HandleWebAdminDump)\n\n\treturn true\nend\n\n"
  },
  {
    "path": "Server/Plugins/APIDump/prettify.css",
    "content": ".pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}"
  },
  {
    "path": "Server/Plugins/APIDump/prettify.js",
    "content": "!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\n(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:\"0\"<=a&&a<=\"7\"?parseInt(e.substring(1),8):a===\"u\"||a===\"x\"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?\"\\\\x0\":\"\\\\x\")+e.toString(16);e=String.fromCharCode(e);return e===\"\\\\\"||e===\"-\"||e===\"]\"||e===\"^\"?\"\\\\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\S\\s]|[^\\\\]/g),e=[],a=\nb[0]===\"^\",c=[\"[\"];a&&c.push(\"^\");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&\"-\"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b[a],c.push(g(h[0])),\nh[1]>h[0]&&(h[1]+1>h[0]&&c.push(\"-\"),c.push(g(h[1])));c.push(\"]\");return c.join(\"\")}function s(e){for(var a=e.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l===\"(\"?++h:\"\\\\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l===\"(\"?(++h,d[h]||(a[f]=\"(?:\")):\"\\\\\"===l.charAt(0)&&(l=+l.substring(1))&&l<=h&&\n(a[f]=\"\\\\\"+d[l]);for(f=0;f<c;++f)\"^\"===a[f]&&\"^\"!==a[f+1]&&(a[f]=\"\");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e===\"[\"?a[f]=b(l):e!==\"\\\\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return\"[\"+String.fromCharCode(a&-33,a|32)+\"]\"}));return a.join(\"\")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\\\u[\\da-f]{4}|\\\\x[\\da-f]{2}|\\\\[^UXux]/gi,\"\"))){m=!0;j=!1;break}}for(var r={b:8,t:9,n:10,v:11,\nf:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(\"\"+i);n.push(\"(?:\"+s(i)+\")\")}return RegExp(n.join(\"|\"),j?\"gi\":\"g\")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if(\"br\"===c||\"li\"===c)s[j]=\"\\n\",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\\r\\n?/g,\"\\n\"):c.replace(/[\\t\\n\\r ]+/g,\" \"),s[j]=c,m[j<<1]=x,x+=c.length,m[j++<<1|1]=\na)}var b=/(?:^|\\s)nocode(?:\\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join(\"\").replace(/\\n$/,\"\"),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,\"pln\"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w===\"string\")f=!1;else{var h=b[z.charAt(0)];\nif(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w=\"pln\")}if((f=w.length>=5&&\"lang-\"===w.substring(0,5))&&!(t&&typeof t[1]===\"string\"))f=!1,w=\"src\";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c<i;++c){var r=\ng[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=\"\"+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\\S\\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push([\"str\",/^(?:'''(?:[^'\\\\]|\\\\[\\S\\s]|''?(?=[^']))*(?:'''|$)|\"\"\"(?:[^\"\\\\]|\\\\[\\S\\s]|\"\"?(?=[^\"]))*(?:\"\"\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$))/,q,\"'\\\"\"]):a.multiLineStrings?d.push([\"str\",/^(?:'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,\nq,\"'\\\"`\"]):d.push([\"str\",/^(?:'(?:[^\\n\\r'\\\\]|\\\\.)*(?:'|$)|\"(?:[^\\n\\r\"\\\\]|\\\\.)*(?:\"|$))/,q,\"\\\"'\"]);a.verbatimStrings&&g.push([\"str\",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push([\"com\",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,\"#\"]):d.push([\"com\",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,q,\"#\"]),g.push([\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,q])):d.push([\"com\",\n/^#[^\\n\\r]*/,q,\"#\"]));a.cStyleComments&&(g.push([\"com\",/^\\/\\/[^\\n\\r]*/,q]),g.push([\"com\",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?\"\":\"\\n\\r\")?\".\":\"[\\\\S\\\\s]\";g.push([\"lang-regex\",RegExp(\"^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<<?=?|>>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*(\"+(\"/(?=[^/*\"+b+\"])(?:[^/\\\\x5B\\\\x5C\"+b+\"]|\\\\x5C\"+s+\"|\\\\x5B(?:[^\\\\x5C\\\\x5D\"+b+\"]|\\\\x5C\"+\ns+\")*(?:\\\\x5D|$))+/\")+\")\")])}(b=a.types)&&g.push([\"typ\",b]);b=(\"\"+a.keywords).replace(/^ | $/g,\"\");b.length&&g.push([\"kwd\",RegExp(\"^(?:\"+b.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),q]);d.push([\"pln\",/^\\s+/,q,\" \\r\\n\\t\\u00a0\"]);b=\"^.[^\\\\s\\\\w.$@'\\\"`/\\\\\\\\]*\";a.regexLiterals&&(b+=\"(?!s*/)\");g.push([\"lit\",/^@[$_a-z][\\w$@]*/i,q],[\"typ\",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,q],[\"pln\",/^[$_a-z][\\w$@]*/i,q],[\"lit\",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,q,\"0123456789\"],[\"pln\",/^\\\\[\\S\\s]?/,\nq],[\"pun\",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if(\"br\"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=\nc?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\\s)nocode(?:\\s|$)/,m=/\\r\\n?|\\n/,j=a.ownerDocument,k=j.createElement(\"li\");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute(\"value\",d);var r=j.createElement(\"ol\");\nr.className=\"linenums\";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className=\"L\"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode(\"\\u00a0\")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn(\"cannot override language handler %s\",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\\s*</.test(d)?\"default-markup\":\"default-code\";return F[a]}function K(a){var d=a.h;try{var g=T(a.c,a.i),b=g.a;\na.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\\bMSIE\\s(\\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display=\"none\";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType!==1&&(G=x.substring(g,\nt))){s&&(G=G.replace(d,\"\\r\"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement(\"span\");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=[\"break,continue,do,else,for,if,return,while\"],E=[[y,\"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\n\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],M=[E,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],N=[E,\"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient\"],\nO=[N,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where\"],E=[E,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"],P=[y,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],\nQ=[y,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],W=[y,\"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use\"],y=[y,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,\nV=/\\S/,X=v({keywords:[M,O,E,\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,[\"default-code\"]);p(C([],[[\"pln\",/^[^<?]+/],[\"dec\",/^<!\\w[^>]*(?:>|$)/],[\"com\",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],[\"lang-\",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\S\\s]+?)(?:%>|$)/],[\"pun\",/^(?:<[%?]|[%?]>)/],[\"lang-\",\n/^<xmp\\b[^>]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);p(C([[\"pln\",/^\\s+/,q,\" \\t\\r\\n\"],[\"atv\",/^(?:\"[^\"]*\"?|'[^']*'?)/,q,\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^\\s\"'>]*(?:[^\\s\"'/>]|\\/(?=\\s)))/],[\"pun\",/^[/<->]+/],\n[\"lang-js\",/^on\\w+\\s*=\\s*\"([^\"]+)\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*'([^']+)'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\s\"'>]+)/i],[\"lang-css\",/^style\\s*=\\s*\"([^\"]+)\"/i],[\"lang-css\",/^style\\s*=\\s*'([^']+)'/i],[\"lang-css\",/^style\\s*=\\s*([^\\s\"'>]+)/i]]),[\"in.tag\"]);p(C([],[[\"atv\",/^[\\S\\s]+/]]),[\"uq.val\"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);p(v({keywords:\"null,true,false\"}),[\"json\"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}),\n[\"cs\"]);p(v({keywords:N,cStyleComments:!0}),[\"java\"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),[\"bash\",\"bsh\",\"csh\",\"sh\"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),[\"cv\",\"py\",\"python\"]);p(v({keywords:\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),[\"perl\",\"pl\",\"pm\"]);p(v({keywords:Q,\nhashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\",\"ruby\"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),[\"javascript\",\"js\"]);p(v({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes\",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[\"coffee\"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),[\"rc\",\"rs\",\"rust\"]);\np(C([],[[\"str\",/^[\\S\\s]+/]]),[\"regex\"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:\"atv\",PR_COMMENT:\"com\",PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:\"lit\",PR_NOCODE:\"nocode\",PR_PLAIN:\"pln\",PR_PUNCTUATION:\"pun\",PR_SOURCE:\"src\",PR_STRING:\"str\",PR_TAG:\"tag\",PR_TYPE:\"typ\",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement(\"div\");b.innerHTML=\"<pre>\"+a+\"</pre>\";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1});\nreturn b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\\??prettify\\b/.test(o):m!==3||/\\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\\b(\\w+)=([\\w%+\\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.test(o.tagName)&&\no.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=\" prettyprinted\";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue(\"white-space\"):0)&&\"pre\"===o.substring(0,3);u=j.linenums;if(!(u=u===\"true\"||+u))u=(u=k.match(/\\blinenums\\b(?::(\\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J(d,u,o);r=\n{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):\"function\"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName(\"pre\"),b.getElementsByTagName(\"code\"),b.getElementsByTagName(\"xmp\")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/,e=/\\bprettyprint\\b/,v=/\\bprettyprinted\\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code|xmp)$/i,\nh={};g()}};typeof define===\"function\"&&define.amd&&define(\"google-code-prettify\",[],function(){return Y})})();}()\n"
  },
  {
    "path": "Server/Plugins/Debuggers/Debuggers.lua",
    "content": "\n-- Global variables\ng_DropSpensersToActivate = {};  -- A list of dispensers and droppers (as {World, X, Y Z} quadruplets) that are to be activated every tick\ng_HungerReportTick = 10;\ng_ShowFoodStats = false;  -- When true, each player's food stats are sent to them every 10 ticks\n\n\n\n\n\n\nfunction Initialize(a_Plugin)\n\t--[[\n\t-- Test multiple hook handlers:\n\tcPluginManager.AddHook(cPluginManager.HOOK_TICK,                         OnTick1);\n\tcPluginManager.AddHook(cPluginManager.HOOK_TICK,                         OnTick2);\n\t--]]\n\n\tlocal PM = cPluginManager;\n\tPM:AddHook(cPluginManager.HOOK_PLAYER_USING_BLOCK,           OnPlayerUsingBlock);\n\tPM:AddHook(cPluginManager.HOOK_PLAYER_USING_ITEM,            OnPlayerUsingItem);\n\tPM:AddHook(cPluginManager.HOOK_TAKE_DAMAGE,                  OnTakeDamage);\n\tPM:AddHook(cPluginManager.HOOK_TICK,                         OnTick);\n\tPM:AddHook(cPluginManager.HOOK_CHAT,                         OnChat);\n\tPM:AddHook(cPluginManager.HOOK_PLAYER_RIGHT_CLICKING_ENTITY, OnPlayerRightClickingEntity);\n\tPM:AddHook(cPluginManager.HOOK_WORLD_TICK,                   OnWorldTick);\n\tPM:AddHook(cPluginManager.HOOK_PLUGINS_LOADED,               OnPluginsLoaded);\n\tPM:AddHook(cPluginManager.HOOK_PLAYER_JOINED,                OnPlayerJoined);\n\tPM:AddHook(cPluginManager.HOOK_PROJECTILE_HIT_BLOCK,         OnProjectileHitBlock);\n\tPM:AddHook(cPluginManager.HOOK_CHUNK_UNLOADING,              OnChunkUnloading);\n\tPM:AddHook(cPluginManager.HOOK_WORLD_STARTED,                OnWorldStarted);\n\tPM:AddHook(cPluginManager.HOOK_PROJECTILE_HIT_BLOCK,         OnProjectileHitBlock);\n\tPM:AddHook(cPluginManager.HOOK_PLAYER_RIGHT_CLICK,           OnPlayerRightClick)\n\n\t-- _X: Disabled WECUI manipulation:\n\t-- PM:AddHook(cPluginManager.HOOK_PLUGIN_MESSAGE,               OnPluginMessage);\n\t-- _X: Disabled so that the normal operation doesn't interfere with anything\n\t-- PM:AddHook(cPluginManager.HOOK_CHUNK_GENERATED,              OnChunkGenerated);\n\n\t-- Load the InfoReg shared library:\n\tdofile(cPluginManager:GetPluginsPath() .. \"/InfoReg.lua\")\n\n\t-- Bind all the commands:\n\tRegisterPluginInfoCommands();\n\n\t-- Bind all the console commands:\n\tRegisterPluginInfoConsoleCommands();\n\n\ta_Plugin:AddWebTab(\"Debuggers\",  HandleRequest_Debuggers)\n\ta_Plugin:AddWebTab(\"StressTest\", HandleRequest_StressTest)\n\n\t-- Enable the following line for BlockArea / Generator interface testing:\n\t-- PluginManager:AddHook(Plugin, cPluginManager.HOOK_CHUNK_GENERATED);\n\n\t-- TestBlockAreas()\n\t-- TestSQLiteBindings()\n\t-- TestExpatBindings()\n\n\tTestBlockAreasString()\n\tTestStringBase64()\n\t-- TestUUIDFromName()\n\t-- TestRankMgr()\n\tTestFileExt()\n\t-- TestFileLastMod()\n\n\t--[[\n\t-- Test cCompositeChat usage in console-logging:\n\tLOGINFO(cCompositeChat(\"This is a simple message with some @2 color formatting @4 and http://links.to .\")\n\t\t:AddSuggestCommandPart(\"(Suggested command)\", \"cmd\")\n\t\t:AddRunCommandPart(\"(Run command)\", \"cmd\")\n\t\t:SetMessageType(mtInfo)\n\t)\n\t--]]\n\n\t-- Test the crash in #1889:\n\tcPluginManager:AddHook(cPluginManager.HOOK_PLAYER_RIGHT_CLICKING_ENTITY,\n\t\tfunction (a_CBPlayer, a_CBEntity)\n\t\t\ta_CBPlayer:GetWorld():DoWithEntityByID(  -- This will crash the server in #1889\n\t\t\t\ta_CBEntity:GetUniqueID(),\n\t\t\t\tfunction(Entity)\n\t\t\t\t\tLOG(\"RightClicking an entity, crash #1889 fixed. Entity is a \" .. tolua.type(Entity))\n\t\t\t\tend\n\t\t\t)\n\t\tend\n\t)\n\n\treturn true\nend;\n\n\n\n\n\nfunction TestFileExt()\n\tassert(cFile:ChangeFileExt(\"fileless_dir/\", \"new\") == \"fileless_dir/\")\n\tassert(cFile:ChangeFileExt(\"fileless_dir/\", \".new\") == \"fileless_dir/\")\n\tassert(cFile:ChangeFileExt(\"pathless_file.ext\", \"new\") == \"pathless_file.new\")\n\tassert(cFile:ChangeFileExt(\"pathless_file.ext\", \".new\") == \"pathless_file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to/file.ext\", \"new\") == \"path/to/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to/file.ext\", \".new\") == \"path/to/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to.dir/file\", \"new\") == \"path/to.dir/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to.dir/file\", \".new\") == \"path/to.dir/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to.dir/file.ext\", \"new\") == \"path/to.dir/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to.dir/file.ext\", \".new\") == \"path/to.dir/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to.dir/file.longext\", \"new\") == \"path/to.dir/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to.dir/file.longext\", \".new\") == \"path/to.dir/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to.dir/file.\", \"new\") == \"path/to.dir/file.new\")\n\tassert(cFile:ChangeFileExt(\"path/to.dir/file.\", \".new\") == \"path/to.dir/file.new\")\nend\n\n\n\n\n\nfunction TestFileLastMod()\n\tlocal LastSelfMod = cFile:GetLastModificationTime(a_Plugin:GetLocalFolder() .. \"/Debuggers.lua\")\n\tLOG(\"Debuggers.lua last modified on \" .. os.date(\"%Y-%m-%dT%H:%M:%S\", LastSelfMod))\n\n\tlocal f = assert(io.open(\"test.txt\", \"w\"))\n\tf:write(\"test\")\n\tf:close()\n\tlocal filetime = cFile:GetLastModificationTime(\"test.txt\")\n\tlocal ostime = os.time()\n\tLOG(\"file time: \" .. filetime .. \", OS time: \" .. ostime .. \", difference: \" .. ostime - filetime)\nend\n\n\n\n\n\nfunction TestBlockAreas()\n\tLOG(\"Testing block areas...\");\n\n\t-- Debug block area merging:\n\tlocal BA1 = cBlockArea();\n\tlocal BA2 = cBlockArea();\n\tif (BA1:LoadFromSchematicFile(\"schematics/test.schematic\")) then\n\t\tif (BA2:LoadFromSchematicFile(\"schematics/fountain.schematic\")) then\n\t\t\tBA2:SetRelBlockType(0, 0, 0, E_BLOCK_LAPIS_BLOCK);\n\t\t\tBA2:SetRelBlockType(1, 0, 0, E_BLOCK_LAPIS_BLOCK);\n\t\t\tBA2:SetRelBlockType(2, 0, 0, E_BLOCK_LAPIS_BLOCK);\n\t\t\tBA1:Merge(BA2, 1, 10, 1, cBlockArea.msImprint);\n\t\t\tBA1:SaveToSchematicFile(\"schematics/merge.schematic\");\n\t\tend\n\telse\n\t\tBA1:Create(16, 16, 16);\n\tend\n\n\t-- Debug block area cuboid filling:\n\tBA1:FillRelCuboid(2, 9, 2, 8, 2, 8, cBlockArea.baTypes, E_BLOCK_GOLD_BLOCK);\n\tBA1:RelLine(2, 2, 2, 9, 8, 8, cBlockArea.baTypes or cBlockArea.baMetas, E_BLOCK_SAPLING, E_META_SAPLING_BIRCH);\n\tBA1:SaveToSchematicFile(\"schematics/fillrel.schematic\");\n\n\t-- Debug block area mirroring:\n\tif (BA1:LoadFromSchematicFile(\"schematics/lt.schematic\")) then\n\t\tBA1:MirrorXYNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/lt_XY.schematic\");\n\t\tBA1:MirrorXYNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/lt_XY2.schematic\");\n\n\t\tBA1:MirrorXZNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/lt_XZ.schematic\");\n\t\tBA1:MirrorXZNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/lt_XZ2.schematic\");\n\n\t\tBA1:MirrorYZNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/lt_YZ.schematic\");\n\t\tBA1:MirrorYZNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/lt_YZ2.schematic\");\n\tend\n\n\t-- Debug block area rotation:\n\tif (BA1:LoadFromSchematicFile(\"schematics/rot.schematic\")) then\n\t\tBA1:RotateCWNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/rot1.schematic\");\n\t\tBA1:RotateCWNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/rot2.schematic\");\n\t\tBA1:RotateCWNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/rot3.schematic\");\n\t\tBA1:RotateCWNoMeta();\n\t\tBA1:SaveToSchematicFile(\"schematics/rot4.schematic\");\n\tend\n\n\t-- Debug block area rotation:\n\tif (BA1:LoadFromSchematicFile(\"schematics/rotm.schematic\")) then\n\t\tBA1:RotateCCW();\n\t\tBA1:SaveToSchematicFile(\"schematics/rotm1.schematic\");\n\t\tBA1:RotateCCW();\n\t\tBA1:SaveToSchematicFile(\"schematics/rotm2.schematic\");\n\t\tBA1:RotateCCW();\n\t\tBA1:SaveToSchematicFile(\"schematics/rotm3.schematic\");\n\t\tBA1:RotateCCW();\n\t\tBA1:SaveToSchematicFile(\"schematics/rotm4.schematic\");\n\tend\n\n\t-- Debug block area mirroring:\n\tif (BA1:LoadFromSchematicFile(\"schematics/ltm.schematic\")) then\n\t\tBA1:MirrorXY();\n\t\tBA1:SaveToSchematicFile(\"schematics/ltm_XY.schematic\");\n\t\tBA1:MirrorXY();\n\t\tBA1:SaveToSchematicFile(\"schematics/ltm_XY2.schematic\");\n\n\t\tBA1:MirrorXZ();\n\t\tBA1:SaveToSchematicFile(\"schematics/ltm_XZ.schematic\");\n\t\tBA1:MirrorXZ();\n\t\tBA1:SaveToSchematicFile(\"schematics/ltm_XZ2.schematic\");\n\n\t\tBA1:MirrorYZ();\n\t\tBA1:SaveToSchematicFile(\"schematics/ltm_YZ.schematic\");\n\t\tBA1:MirrorYZ();\n\t\tBA1:SaveToSchematicFile(\"schematics/ltm_YZ2.schematic\");\n\tend\n\n\tLOG(\"Block areas test ended\");\nend\n\n\n\n\n\n\nfunction TestBlockAreasString()\n\t-- Write one area to string, then to file:\n\tlocal BA1 = cBlockArea()\n\tBA1:Create(5, 5, 5, cBlockArea.baTypes + cBlockArea.baMetas)\n\tBA1:Fill(cBlockArea.baTypes, E_BLOCK_DIAMOND_BLOCK)\n\tBA1:FillRelCuboid(1, 3, 1, 3, 1, 3, cBlockArea.baTypes, E_BLOCK_GOLD_BLOCK)\n\tlocal Data = BA1:SaveToSchematicString()\n\tif ((type(Data) ~= \"string\") or (Data == \"\")) then\n\t\tLOG(\"Cannot save schematic to string\")\n\t\treturn\n\tend\n\tcFile:CreateFolder(\"schematics\")\n\tlocal f = io.open(\"schematics/StringTest.schematic\", \"wb\")\n\tf:write(Data)\n\tf:close()\n\n\t-- Load a second area from that file:\n\tlocal BA2 = cBlockArea()\n\tif not(BA2:LoadFromSchematicFile(\"schematics/StringTest.schematic\")) then\n\t\tLOG(\"Cannot read schematic from string test file\")\n\t\treturn\n\tend\n\tBA2:Clear()\n\n\t-- Load another area from a string in that file:\n\tf = io.open(\"schematics/StringTest.schematic\", \"rb\")\n\tData = f:read(\"*all\")\n\tif not(BA2:LoadFromSchematicString(Data)) then\n\t\tLOG(\"Cannot load schematic from string\")\n\tend\nend\n\n\n\n\n\nfunction TestStringBase64()\n\t-- Create a binary string:\n\tlocal s = \"\"\n\tfor i = 0, 255 do\n\t\ts = s .. string.char(i)\n\tend\n\n\t-- Roundtrip through Base64:\n\tlocal Base64 = Base64Encode(s)\n\tlocal UnBase64 = Base64Decode(Base64)\n\n\tassert(UnBase64 == s)\nend\n\n\n\n\n\nfunction TestUUIDFromName()\n\tLOG(\"Testing UUID-from-Name resolution...\")\n\n\t-- Test by querying a few existing names, along with a non-existent one:\n\tlocal PlayerNames =\n\t{\n\t\t\"xoft\",\n\t\t\"aloe_vera\",\n\t\t\"nonexistent_player\",\n\t}\n\t-- WARNING: Blocking operation! DO NOT USE IN TICK THREAD!\n\tlocal UUIDs = cMojangAPI:GetUUIDsFromPlayerNames(PlayerNames)\n\n\t-- Log the results:\n\tfor _, name in ipairs(PlayerNames) do\n\t\tlocal UUID = UUIDs[name]\n\t\tif (UUID == nil) then\n\t\t\tLOG(\"  UUID(\" .. name .. \") not found.\")\n\t\telse\n\t\t\tLOG(\"  UUID(\" .. name .. \") = \\\"\" .. UUID .. \"\\\"\")\n\t\tend\n\tend\n\n\t-- Test once more with the same players, valid-only. This should go directly from cache, so fast.\n\tLOG(\"Testing again with the same valid players...\")\n\tlocal ValidPlayerNames =\n\t{\n\t\t\"xoft\",\n\t\t\"aloe_vera\",\n\t}\n\tUUIDs = cMojangAPI:GetUUIDsFromPlayerNames(ValidPlayerNames);\n\n\t-- Log the results:\n\tfor _, name in ipairs(ValidPlayerNames) do\n\t\tlocal UUID = UUIDs[name]\n\t\tif (UUID == nil) then\n\t\t\tLOG(\"  UUID(\" .. name .. \") not found.\")\n\t\telse\n\t\t\tLOG(\"  UUID(\" .. name .. \") = \\\"\" .. UUID .. \"\\\"\")\n\t\tend\n\tend\n\n\t-- Test yet again, cache-only:\n\tLOG(\"Testing once more, cache only...\")\n\tlocal PlayerNames3 =\n\t{\n\t\t\"xoft\",\n\t\t\"aloe_vera\",\n\t\t\"notch\",  -- Valid player name, but not cached (most likely :)\n\t}\n\tUUIDs = cMojangAPI:GetUUIDsFromPlayerNames(PlayerNames3, true)\n\n\t-- Log the results:\n\tfor _, name in ipairs(PlayerNames3) do\n\t\tlocal UUID = UUIDs[name]\n\t\tif (UUID == nil) then\n\t\t\tLOG(\"  UUID(\" .. name .. \") not found.\")\n\t\telse\n\t\t\tLOG(\"  UUID(\" .. name .. \") = \\\"\" .. UUID .. \"\\\"\")\n\t\tend\n\tend\n\n\tLOG(\"UUID-from-Name resolution tests finished.\")\n\n\tLOG(\"Performing a Name-from-UUID test...\")\n\t-- local NameToTest = \"aloe_vera\"\n\tlocal NameToTest = \"xoft\"\n\tlocal Name = cMojangAPI:GetPlayerNameFromUUID(UUIDs[NameToTest])\n\tLOG(\"Name(\" .. UUIDs[NameToTest] .. \") = '\" .. Name .. \"', expected '\" .. NameToTest .. \"'.\")\n\tLOG(\"Name-from-UUID test finished.\")\nend\n\n\n\n\n\nfunction TestRankMgr()\n\tLOG(\"Testing the rank manager\")\n\tcRankManager:AddRank(\"LuaRank\")\n\tcRankManager:AddGroup(\"LuaTestGroup\")\n\tcRankManager:AddGroupToRank(\"LuaTestGroup\", \"LuaRank\")\n\tcRankManager:AddPermissionToGroup(\"luaperm\", \"LuaTestGroup\")\nend\n\n\n\n\n\nfunction TestSQLiteBindings()\n\tLOG(\"Testing SQLite bindings...\");\n\n\t-- Debug SQLite binding\n\tlocal TestDB, ErrCode, ErrMsg = sqlite3.open(\"test.sqlite\");\n\tif (TestDB ~= nil) then\n\t\tlocal function ShowRow(UserData, NumCols, Values, Names)\n\t\t\tassert(UserData == 'UserData');\n\t\t\tLOG(\"New row\");\n\t\t\tfor i = 1, NumCols do\n\t\t\t\tLOG(\"  \" .. Names[i] .. \" = \" .. Values[i]);\n\t\t\tend\n\t\t\treturn 0;\n\t\tend\n\t\tlocal sql = [=[\n\t\t\tCREATE TABLE numbers(num1,num2,str);\n\t\t\tINSERT INTO numbers VALUES(1, 11, \"ABC\");\n\t\t\tINSERT INTO numbers VALUES(2, 22, \"DEF\");\n\t\t\tINSERT INTO numbers VALUES(3, 33, \"UVW\");\n\t\t\tINSERT INTO numbers VALUES(4, 44, \"XYZ\");\n\t\t\tSELECT * FROM numbers;\n\t\t]=]\n\t\tlocal Res = TestDB:exec(sql, ShowRow, 'UserData');\n\t\tif (Res ~= sqlite3.OK) then\n\t\t\tLOG(\"TestDB:exec() failed: \" .. Res .. \" (\" .. TestDB:errmsg() .. \")\");\n\t\tend;\n\t\tTestDB:close();\n\telse\n\t\t-- This happens if for example SQLite cannot open the file (eg. a folder with the same name exists)\n\t\tLOG(\"SQLite3 failed to open DB! (\" .. ErrCode .. \", \" .. ErrMsg ..\")\");\n\tend\n\n\tLOG(\"SQLite bindings test ended\");\nend\n\n\n\n\n\nfunction TestExpatBindings()\n\tLOG(\"Testing Expat bindings...\");\n\n\t-- Debug LuaExpat bindings:\n\tlocal count = 0\n\tcallbacks = {\n\t    StartElement = function (parser, name)\n\t        LOG(\"+ \" .. string.rep(\" \", count) .. name);\n\t        count = count + 1;\n\t    end,\n\t    EndElement = function (parser, name)\n\t        count = count - 1;\n\t        LOG(\"- \" .. string.rep(\" \", count) .. name);\n\t    end\n\t}\n\n\tlocal p = lxp.new(callbacks);\n\tp:parse(\"<elem1>\\nnext line\\nanother line\");\n\tp:parse(\"text\\n\");\n\tp:parse(\"<elem2/>\\n\");\n\tp:parse(\"more text\");\n\tp:parse(\"</elem1>\");\n\tp:parse(\"\\n\");\n\tp:parse();  -- finishes the document\n\tp:close();  -- closes the parser\n\n\tLOG(\"Expat bindings test ended\");\nend\n\n\n\n\n\nfunction OnUsingBlazeRod(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ)\n\t-- Magic rod of query: show block types and metas for both neighbors of the pointed face\n\tlocal Valid, Type, Meta = Player:GetWorld():GetBlockTypeMeta(BlockX, BlockY, BlockZ);\n\n\tif (Type == E_BLOCK_AIR) then\n\t\tPlayer:SendMessage(cChatColor.LightGray .. \"Block {\" .. BlockX .. \", \" .. BlockY .. \", \" .. BlockZ .. \"}: air:\" .. Meta);\n\telse\n\t\tlocal TempItem = cItem(Type, 1, Meta);\n\t\tPlayer:SendMessage(cChatColor.LightGray .. \"Block {\" .. BlockX .. \", \" .. BlockY .. \", \" .. BlockZ .. \"}: \" .. ItemToFullString(TempItem) .. \" (\" .. Type .. \":\" .. Meta .. \")\");\n\tend\n\n\tlocal X, Y, Z = AddFaceDirection(BlockX, BlockY, BlockZ, BlockFace);\n\tValid, Type, Meta = Player:GetWorld():GetBlockTypeMeta(X, Y, Z);\n\tif (Type == E_BLOCK_AIR) then\n\t\tPlayer:SendMessage(cChatColor.LightGray .. \"Block {\" .. X .. \", \" .. Y .. \", \" .. Z .. \"}: air:\" .. Meta);\n\telse\n\t\tlocal TempItem = cItem(Type, 1, Meta);\n\t\tPlayer:SendMessage(cChatColor.LightGray .. \"Block {\" .. X .. \", \" .. Y .. \", \" .. Z .. \"}: \" .. ItemToFullString(TempItem) .. \" (\" .. Type .. \":\" .. Meta .. \")\");\n\tend\n\treturn false;\nend\n\n\n\n\n\nfunction OnUsingDiamond(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ)\n\t-- Rclk with a diamond to test block area cropping and expanding\n\tlocal Area = cBlockArea();\n\tArea:Read(Player:GetWorld(),\n\t\tBlockX - 19, BlockX + 19,\n\t\tBlockY - 7, BlockY + 7,\n\t\tBlockZ - 19, BlockZ + 19\n\t);\n\n\tLOG(\"Size before cropping: \" .. Area:GetSizeX() .. \" x \" .. Area:GetSizeY() .. \" x \" .. Area:GetSizeZ());\n\tArea:DumpToRawFile(\"crop0.dat\");\n\n\tArea:Crop(2, 3, 0, 0, 0, 0);\n\tLOG(\"Size after cropping 1: \" .. Area:GetSizeX() .. \" x \" .. Area:GetSizeY() .. \" x \" .. Area:GetSizeZ());\n\tArea:DumpToRawFile(\"crop1.dat\");\n\n\tArea:Crop(2, 3, 0, 0, 0, 0);\n\tLOG(\"Size after cropping 2: \" .. Area:GetSizeX() .. \" x \" .. Area:GetSizeY() .. \" x \" .. Area:GetSizeZ());\n\tArea:DumpToRawFile(\"crop2.dat\");\n\n\tArea:Expand(2, 3, 0, 0, 0, 0);\n\tLOG(\"Size after expanding 1: \" .. Area:GetSizeX() .. \" x \" .. Area:GetSizeY() .. \" x \" .. Area:GetSizeZ());\n\tArea:DumpToRawFile(\"expand1.dat\");\n\n\tArea:Expand(3, 2, 1, 1, 0, 0);\n\tLOG(\"Size after expanding 2: \" .. Area:GetSizeX() .. \" x \" .. Area:GetSizeY() .. \" x \" .. Area:GetSizeZ());\n\tArea:DumpToRawFile(\"expand2.dat\");\n\n\tArea:Crop(0, 0, 0, 0, 3, 2);\n\tLOG(\"Size after cropping 3: \" .. Area:GetSizeX() .. \" x \" .. Area:GetSizeY() .. \" x \" .. Area:GetSizeZ());\n\tArea:DumpToRawFile(\"crop3.dat\");\n\n\tArea:Crop(0, 0, 3, 2, 0, 0);\n\tLOG(\"Size after cropping 4: \" .. Area:GetSizeX() .. \" x \" .. Area:GetSizeY() .. \" x \" .. Area:GetSizeZ());\n\tArea:DumpToRawFile(\"crop4.dat\");\n\n\tLOG(\"Crop test done\");\n\tPlayer:SendMessage(\"Crop / expand test done.\");\n\treturn false;\nend\n\n\n\n\n\nfunction OnUsingEyeOfEnder(Player, BlockX, BlockY, BlockZ)\n\t-- Rclk with an eye of ender places a predefined schematic at the cursor\n\tlocal Area = cBlockArea();\n\tif not(Area:LoadFromSchematicFile(\"schematics/test.schematic\")) then\n\t\tLOG(\"Loading failed\");\n\t\treturn false;\n\tend\n\tLOG(\"Schematic loaded, placing now.\");\n\tArea:Write(Player:GetWorld(), BlockX, BlockY, BlockZ);\n\tLOG(\"Done.\");\n\treturn false;\nend\n\n\n\n\n\nfunction OnUsingEnderPearl(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ)\n\t-- Rclk with an ender pearl saves a predefined area around the cursor into a .schematic file. Also tests area copying\n\tlocal Area = cBlockArea();\n\tif not(Area:Read(Player:GetWorld(),\n\t\tBlockX - 8, BlockX + 8, BlockY - 8, BlockY + 8, BlockZ - 8, BlockZ + 8)\n\t) then\n\t\tLOG(\"LUA: Area couldn't be read\");\n\t\treturn false;\n\tend\n\tLOG(\"LUA: Area read, copying now.\");\n\tlocal Area2 = cBlockArea();\n\tArea2:CopyFrom(Area);\n\tLOG(\"LUA: Copied, now saving.\");\n\tif not(Area2:SaveToSchematicFile(\"schematics/test.schematic\")) then\n\t\tLOG(\"LUA: Cannot save schematic file.\");\n\t\treturn false;\n\tend\n\tLOG(\"LUA: Done.\");\n\treturn false;\nend\n\n\n\n\n\nfunction OnUsingRedstoneTorch(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ)\n\t-- Redstone torch activates a rapid dispenser / dropper discharge (at every tick):\n\tlocal BlockType = Player:GetWorld():GetBlock(BlockX, BlockY, BlockZ);\n\tif (BlockType == E_BLOCK_DISPENSER) then\n\t\ttable.insert(g_DropSpensersToActivate, {World = Player:GetWorld(), x = BlockX, y = BlockY, z = BlockZ});\n\t\tPlayer:SendMessage(\"Dispenser at {\" .. BlockX .. \", \" .. BlockY .. \", \" .. BlockZ .. \"} discharging\");\n\t\treturn true;\n\telseif (BlockType == E_BLOCK_DROPPER) then\n\t\ttable.insert(g_DropSpensersToActivate, {World = Player:GetWorld(), x = BlockX, y = BlockY, z = BlockZ});\n\t\tPlayer:SendMessage(\"Dropper at {\" .. BlockX .. \", \" .. BlockY .. \", \" .. BlockZ .. \"} discharging\");\n\t\treturn true;\n\telse\n\t\tPlayer:SendMessage(\"Neither a dispenser nor a dropper at {\" .. BlockX .. \", \" .. BlockY .. \", \" .. BlockZ .. \"}: \" .. BlockType);\n\tend\n\treturn false;\nend\n\n\n\n\n\nfunction OnPlayerUsingItem(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ)\n\n\t-- dont check if the direction is in the air\n\tif (BlockFace == BLOCK_FACE_NONE) then\n\t\treturn false\n\tend\n\n\tlocal HeldItem = Player:GetEquippedItem();\n\tlocal HeldItemType = HeldItem.m_ItemType;\n\n\tif (HeldItemType == E_ITEM_STICK) then\n\t\t-- Magic sTick of ticking: set the pointed block for ticking at the next tick\n\t\tPlayer:SendMessage(cChatColor.LightGray .. \"Setting next block tick to {\" .. BlockX .. \", \" .. BlockY .. \", \" .. BlockZ .. \"}\")\n\t\tPlayer:GetWorld():SetNextBlockToTick(Vector3i(BlockX, BlockY, BlockZ));\n\t\treturn true\n\telseif (HeldItemType == E_ITEM_BLAZE_ROD) then\n\t\treturn OnUsingBlazeRod(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ);\n\telseif (HeldItemType == E_ITEM_DIAMOND) then\n\t\treturn OnUsingDiamond(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ);\n\telseif (HeldItemType == E_ITEM_EYE_OF_ENDER) then\n\t\treturn OnUsingEyeOfEnder(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ);\n\telseif (HeldItemType == E_ITEM_ENDER_PEARL) then\n\t\treturn OnUsingEnderPearl(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ);\n\tend\n\treturn false;\nend\n\n\n\n\n\nfunction OnPlayerUsingBlock(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ, BlockType, BlockMeta)\n\t-- dont check if the direction is in the air\n\tif (BlockFace == BLOCK_FACE_NONE) then\n\t\treturn false\n\tend\n\n\tlocal HeldItem = Player:GetEquippedItem();\n\tlocal HeldItemType = HeldItem.m_ItemType;\n\n\tif (HeldItemType == E_BLOCK_REDSTONE_TORCH_ON) then\n\t\treturn OnUsingRedstoneTorch(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ);\n\tend\nend\n\n\n\n\n\nfunction OnTakeDamage(Receiver, TDI)\n\t-- Receiver is cPawn\n\t-- TDI is TakeDamageInfo\n\n\t-- LOG(Receiver:GetClass() .. \" was dealt \" .. DamageTypeToString(TDI.DamageType) .. \" damage: Raw \" .. TDI.RawDamage .. \", Final \" .. TDI.FinalDamage .. \" (\" .. (TDI.RawDamage - TDI.FinalDamage) .. \" covered by armor)\");\n\treturn false;\nend\n\n\n\n\n\nfunction OnTick1()\n\t-- For testing multiple hook handlers per plugin\n\tLOGINFO(\"Tick1\");\nend\n\n\n\n\n\nfunction OnTick2()\n\t-- For testing multiple hook handlers per plugin\n\tLOGINFO(\"Tick2\");\nend\n\n\n\n\n\n--- When set to a positive number, the following OnTick() will perform GC and decrease until 0 again\nGCOnTick = 0;\n\n\n\n\n\nfunction OnTick()\n\t-- Activate all dropspensers in the g_DropSpensersToActivate list:\n\tlocal ActivateDrSp = function(DropSpenser)\n\t\tif (DropSpenser:GetContents():GetFirstUsedSlot() == -1) then\n\t\t\treturn true;\n\t\tend\n\t\tDropSpenser:Activate();\n\t\treturn false;\n\tend\n\t-- Walk the list backwards, because we're removing some items\n\tlocal idx = #g_DropSpensersToActivate;\n\tfor i = idx, 1, -1 do\n\t\tlocal DrSp = g_DropSpensersToActivate[i];\n\t\tif not(DrSp.World:DoWithDropSpenserAt(DrSp.x, DrSp.y, DrSp.z, ActivateDrSp)) then\n\t\t\ttable.remove(g_DropSpensersToActivate, i);\n\t\tend\n\tend\n\n\n\t-- If GCOnTick > 0, do a garbage-collect and decrease by one\n\tif (GCOnTick > 0) then\n\t\tcollectgarbage();\n\t\tGCOnTick = GCOnTick - 1;\n\tend\n\n\treturn false;\nend\n\n\n\n\n\nfunction OnWorldTick(a_World, a_Dt)\n\t-- Report food stats, if switched on:\n\tlocal Tick = a_World:GetWorldAge();\n\tif (not(g_ShowFoodStats) or (math.mod(Tick, 10) ~= 0)) then\n\t\treturn false;\n\tend\n\ta_World:ForEachPlayer(\n\t\tfunction(a_Player)\n\t\t\ta_Player:SendMessage(\n\t\t\t\ttostring(Tick / 10) ..\n\t\t\t\t\" > FS: fl \" .. a_Player:GetFoodLevel() ..\n\t\t\t\t\"; sat \" .. a_Player:GetFoodSaturationLevel() ..\n\t\t\t\t\"; exh \" .. a_Player:GetFoodExhaustionLevel()\n\t\t\t);\n\t\tend\n\t);\nend\n\n\n\n\n\nfunction OnChat(a_Player, a_Message)\n\treturn false, \"blabla \" .. a_Message;\nend\n\n\n\n\n\nfunction OnPlayerRightClick(a_Player)\n\t-- If the player is holding a cake item, make them throw a cake block, using a FallingBlock entity:\n\tif (a_Player:GetInventory():GetEquippedItem().m_ItemType == E_ITEM_CAKE) then\n\t\tlocal World = a_Player:GetWorld()\n\t\tlocal Position = a_Player:GetPosition() + Vector3d(0, 1.5, 0)\n\t\tlocal EntityID = World:SpawnFallingBlock(Vector3i(Position), E_BLOCK_CAKE, 0)\n\n\t\tWorld:DoWithEntityByID(EntityID,\n\t\t\tfunction (Entity)\n\t\t\t\tEntity:TeleportToCoords(Position.x, Position.y, Position.z)\n\t\t\t\tEntity:SetSpeed(a_Player:GetLookVector() * 30)\n\t\t\tend\n\t\t)\n\tend\nend\n\n\n\n\n\nfunction OnPlayerRightClickingEntity(a_Player, a_Entity)\n\tLOG(\"Player \" .. a_Player:GetName() .. \" right-clicking entity ID \" .. a_Entity:GetUniqueID() .. \", a \" .. a_Entity:GetClass());\n\treturn false;\nend\n\n\n\n\n\nfunction OnPluginsLoaded()\n\tLOG(\"All plugins loaded\");\nend\n\n\n\n\n\nfunction OnChunkGenerated(a_World, a_ChunkX, a_ChunkZ, a_ChunkDesc)\n\t-- Get the topmost block coord:\n\tlocal Height = a_ChunkDesc:GetHeight(0, 0);\n\n\t-- Create a sign there:\n\ta_ChunkDesc:SetBlockTypeMeta(0, Height + 1, 0, E_BLOCK_SIGN_POST, 0);\n\tlocal BlockEntity = a_ChunkDesc:GetBlockEntity(0, Height + 1, 0);\n\tif (BlockEntity ~= nil) then\n\t\tlocal SignEntity = tolua.cast(BlockEntity, \"cSignEntity\");\n\t\tSignEntity:SetLines(\"Chunk:\", tonumber(a_ChunkX) .. \", \" .. tonumber(a_ChunkZ), \"\", \"(Debuggers)\");\n\tend\n\n\t-- Update the heightmap:\n\ta_ChunkDesc:SetHeight(0, 0, Height + 1);\nend\n\n\n\n\n\n-- Function \"round\" copied from http://lua-users.org/wiki/SimpleRound\nfunction round(num, idp)\n\tlocal mult = 10^(idp or 0)\n\tif num >= 0 then return math.floor(num * mult + 0.5) / mult\n\telse return math.ceil(num * mult - 0.5) / mult end\nend\n\n\n\n\n\nfunction HandleNickCmd(Split, Player)\n\tif (Split[2] == nil) then\n\t\tPlayer:SendMessage(\"Usage: /nick [CustomName]\");\n\t\treturn true;\n\tend\n\n\tPlayer:SetCustomName(Split[2]);\n\tPlayer:SendMessageSuccess(\"Custom name setted to \" .. Player:GetCustomName() .. \"!\")\n\treturn true\nend\n\n\n\n\n\nfunction HandleListEntitiesCmd(Split, Player)\n\tlocal NumEntities = 0;\n\n\tlocal ListEntity = function(Entity)\n\t\tif (Entity:IsDestroyed()) then\n\t\t\t-- The entity has already been destroyed, don't list it\n\t\t\treturn false;\n\t\tend;\n\t\tlocal cls = Entity:GetClass();\n\t\tPlayer:SendMessage(\"  \" .. Entity:GetUniqueID() .. \": \" .. cls .. \"   {\" .. round(Entity:GetPosX(), 2) .. \", \" .. round(Entity:GetPosY(), 2) .. \", \" .. round(Entity:GetPosZ(), 2) ..\"}\");\n\t\tif (cls == \"cPickup\") then\n\t\t\tlocal Pickup = Entity;\n\t\t\ttolua.cast(Pickup, \"cPickup\");\n\t\t\tPlayer:SendMessage(\"    Age: \" .. Pickup:GetAge() .. \", IsCollected: \" .. tostring(Pickup:IsCollected()));\n\t\tend\n\t\tNumEntities = NumEntities + 1;\n\tend\n\n\tPlayer:SendMessage(\"Listing all entities...\");\n\tPlayer:GetWorld():ForEachEntity(ListEntity);\n\tPlayer:SendMessage(\"List finished, \" .. NumEntities .. \" entities listed\");\n\treturn true;\nend\n\n\n\n\n\nfunction HandleKillEntitiesCmd(Split, Player)\n\tlocal NumEntities = 0;\n\n\tlocal KillEntity = function(Entity)\n\t\t-- kill everything except for players:\n\t\tif (Entity:GetEntityType() ~= cEntity.etPlayer) then\n\t\t\tEntity:Destroy();\n\t\t\tNumEntities = NumEntities + 1;\n\t\tend;\n\tend\n\n\tPlayer:SendMessage(\"Killing all entities...\");\n\tPlayer:GetWorld():ForEachEntity(KillEntity);\n\tPlayer:SendMessage(\"Killed \" .. NumEntities .. \" entities.\");\n\treturn true;\nend\n\n\n\n\n\nfunction HandleWoolCmd(Split, Player)\n\tlocal Wool = cItem(E_BLOCK_WOOL, 1, E_META_WOOL_BLUE);\n\tPlayer:GetInventory():SetArmorSlot(0, Wool);\n\tPlayer:GetInventory():SetArmorSlot(1, Wool);\n\tPlayer:GetInventory():SetArmorSlot(2, Wool);\n\tPlayer:GetInventory():SetArmorSlot(3, Wool);\n\tPlayer:SendMessage(\"You have been bluewooled :)\");\n\treturn true;\nend\n\n\n\n\n\nfunction HandleTestWndCmd(a_Split, a_Player)\n\tlocal WindowType  = cWindow.wtHopper;\n\tlocal WindowSizeX = 5;\n\tlocal WindowSizeY = 1;\n\tif (#a_Split == 4) then\n\t\tWindowType  = tonumber(a_Split[2]);\n\t\tWindowSizeX = tonumber(a_Split[3]);\n\t\tWindowSizeY = tonumber(a_Split[4]);\n\telseif (#a_Split ~= 1) then\n\t\ta_Player:SendMessage(\"Usage: /testwnd [WindowType WindowSizeX WindowSizeY]\");\n\t\treturn true;\n\tend\n\n\t-- Test out the OnClosing callback's ability to refuse to close the window\n\tlocal attempt = 1;\n\tlocal OnClosing = function(Window, Player, CanRefuse)\n\t\tPlayer:SendMessage(\"Window closing attempt #\" .. attempt .. \"; CanRefuse = \" .. tostring(CanRefuse));\n\t\tattempt = attempt + 1;\n\t\treturn CanRefuse and (attempt <= 3);  -- refuse twice, then allow, unless CanRefuse is set to true\n\tend\n\n\t-- Log the slot changes\n\tlocal OnSlotChanged = function(Window, SlotNum)\n\t\tLOG(\"Window \\\"\" .. Window:GetWindowTitle() .. \"\\\" slot \" .. SlotNum .. \" changed.\");\n\tend\n\n\tlocal Window = cLuaWindow(WindowType, WindowSizeX, WindowSizeY, \"TestWnd\");\n\tlocal Item2 = cItem(E_ITEM_DIAMOND_SWORD, 1, 0, \"1=1\");\n\tlocal Item3 = cItem(E_ITEM_DIAMOND_SHOVEL);\n\tItem3.m_Enchantments:SetLevel(cEnchantments.enchUnbreaking, 4);\n\tlocal Item4 = cItem(Item3);  -- Copy\n\tItem4.m_Enchantments:SetLevel(cEnchantments.enchEfficiency, 3);  -- Add enchantment\n\tItem4.m_Enchantments:SetLevel(cEnchantments.enchUnbreaking, 5);  -- Overwrite existing level\n\tlocal Item5 = cItem(E_ITEM_DIAMOND_CHESTPLATE, 1, 0, \"thorns=1;unbreaking=3\");\n\tWindow:SetSlot(a_Player, 0, cItem(E_ITEM_DIAMOND, 64));\n\tWindow:SetSlot(a_Player, 1, Item2);\n\tWindow:SetSlot(a_Player, 2, Item3);\n\tWindow:SetSlot(a_Player, 3, Item4);\n\tWindow:SetSlot(a_Player, 4, Item5);\n\tWindow:SetOnClosing(OnClosing);\n\tWindow:SetOnSlotChanged(OnSlotChanged);\n\n\ta_Player:OpenWindow(Window);\n\n\t-- To make sure that the object has the correct life-management in Lua,\n\t-- let's garbage-collect in the following few ticks\n\tGCOnTick = 10;\n\n\treturn true;\nend\n\n\n\n\n\nfunction HandleGCCmd(a_Split, a_Player)\n\tcollectgarbage();\n\treturn true;\nend\n\n\n\n\n\n\nfunction HandleFastCmd(a_Split, a_Player)\n\tif (a_Player:GetNormalMaxSpeed() <= 0.11) then\n\t\t-- The player has normal speed, set double speed:\n\t\ta_Player:SetNormalMaxSpeed(0.2);\n\t\ta_Player:SendMessage(\"You are now fast\");\n\telse\n\t\t-- The player has fast speed, set normal speed:\n\t\ta_Player:SetNormalMaxSpeed(0.1);\n\t\ta_Player:SendMessage(\"Back to normal speed\");\n\tend\n\treturn true;\nend\n\n\n\n\n\nfunction HandleDashCmd(a_Split, a_Player)\n\tif (a_Player:GetSprintingMaxSpeed() <= 0.14) then\n\t\t-- The player has normal sprinting speed, set double Sprintingspeed:\n\t\ta_Player:SetSprintingMaxSpeed(0.4);\n\t\ta_Player:SendMessage(\"You can now sprint very fast\");\n\telse\n\t\t-- The player has fast sprinting speed, set normal sprinting speed:\n\t\ta_Player:SetSprintingMaxSpeed(0.13);\n\t\ta_Player:SendMessage(\"Back to normal sprinting\");\n\tend\n\treturn true;\nend;\n\n\n\n\n\nfunction HandleGenRailsCmd(a_Split, a_Player)\n\tlocal MAX_RAIL_META = 9\n\tlocal pos = a_Player:GetPosition()\n\tlocal ba = cBlockArea:new()\n\tba:Create(2 * MAX_RAIL_META + 3, 4, 3, cBlockArea.baTypes + cBlockArea.baMetas)\n\tba:FillRelCuboid(0, 2 * MAX_RAIL_META + 2, 0, 0, 0, 2, cBlockArea.baTypes, E_BLOCK_STONE)\n\tba:FillRelCuboid(0, 2 * MAX_RAIL_META + 2, 1, 3, 0, 2, cBlockArea.baTypes, E_BLOCK_AIR)\n\tfor x = 0, MAX_RAIL_META do\n\t\tba:SetRelBlockTypeMeta(2 * x + 1, 1, 1, E_BLOCK_RAIL, x)\n\tend\n\tba:Write(a_Player:GetWorld(), pos:Floor())\n\treturn true\nend\n\n\n\n\n\nfunction HandleGetCustomNameCmd(a_Split, a_Player)\n\tlocal item = a_Player:GetInventory():GetEquippedItem()\n\tif (not(item.m_CustomName) or (item.m_CustomName == \"\")) then\n\t\ta_Player:SendMessage(\"The custom name is empty\")\n\t\treturn true\n\tend\n\tlocal dispCN = string.gsub(item.m_CustomName, \".\",\n\t\tfunction(a_Char)\n\t\t\tif (a_Char < \" \") then\n\t\t\t\treturn string.byte(a_Char)\n\t\t\tend\n\t\t\treturn a_Char\n\t\tend\n\t)\n\ta_Player:SendMessage(string.format(\"The custom name is %d bytes: %s\", string.len(item.m_CustomName), dispCN))\n\treturn true\nend\n\n\n\n\n\nfunction HandleGetLoreCmd(a_Split, a_Player)\n\tlocal item = a_Player:GetInventory():GetEquippedItem()\n\tif (not(item.m_Lore) or (item.m_Lore == \"\")) then\n\t\ta_Player:SendMessage(\"The lore is empty\")\n\t\treturn true\n\tend\n\tlocal dispLore = string.gsub(item.m_Lore, \".\",\n\t\tfunction(a_Char)\n\t\t\tif (a_Char < \" \") then\n\t\t\t\treturn string.byte(a_Char)\n\t\t\tend\n\t\t\treturn a_Char\n\t\tend\n\t)\n\ta_Player:SendMessage(string.format(\"The lore is %d bytes: %s\", string.len(item.m_Lore), dispLore))\n\treturn true\nend\n\n\n\n\n\nfunction HandleGetPropCmd(a_Split, a_Player)\n\tlocal item = a_Player:GetInventory():GetEquippedItem()\n\tif not(item.m_DebuggersCustomProp) then\n\t\ta_Player:SendMessage(\"The custom property is not set.\")\n\t\treturn true\n\tend\n\tlocal dispValue = string.gsub(item.m_DebuggersCustomProp, \".\",\n\t\tfunction(a_Char)\n\t\t\tif (a_Char < \" \") then\n\t\t\t\treturn string.byte(a_Char)\n\t\t\tend\n\t\t\treturn a_Char\n\t\tend\n\t)\n\ta_Player:SendMessage(string.format(\"The custom property value is %d bytes: %s\", string.len(item.m_DebuggersCustomProp), dispValue))\n\treturn true\nend\n\n\n\n\n\nfunction HandleHungerCmd(a_Split, a_Player)\n\ta_Player:SendMessage(\"FoodLevel: \" .. a_Player:GetFoodLevel());\n\ta_Player:SendMessage(\"FoodSaturationLevel: \" .. a_Player:GetFoodSaturationLevel());\n\ta_Player:SendMessage(\"FoodTickTimer: \" .. a_Player:GetFoodTickTimer());\n\ta_Player:SendMessage(\"FoodExhaustionLevel: \" .. a_Player:GetFoodExhaustionLevel());\n\ta_Player:SendMessage(\"FoodPoisonedTicksRemaining: \" .. a_Player:GetFoodPoisonedTicksRemaining());\n\treturn true;\nend\n\n\n\n\n\nfunction HandlePoisonCmd(a_Split, a_Player)\n\ta_Player:FoodPoison(15 * 20);\n\treturn true;\nend\n\n\n\n\n\nfunction HandleStarveCmd(a_Split, a_Player)\n\ta_Player:SetFoodLevel(0);\n\ta_Player:SendMessage(\"You are now starving\");\n\treturn true;\nend\n\n\n\n\n\nfunction HandleFoodLevelCmd(a_Split, a_Player)\n\tif (#a_Split ~= 2) then\n\t\ta_Player:SendMessage(\"Missing an argument: the food level to set\");\n\t\treturn true;\n\tend\n\n\ta_Player:SetFoodLevel(tonumber(a_Split[2]));\n\ta_Player:SetFoodSaturationLevel(5);\n\ta_Player:SetFoodExhaustionLevel(0);\n\ta_Player:SendMessage(\n\t\t\"Food level set to \" .. a_Player:GetFoodLevel() ..\n\t\t\", saturation reset to \" .. a_Player:GetFoodSaturationLevel() ..\n\t\t\" and exhaustion reset to \" .. a_Player:GetFoodExhaustionLevel()\n\t);\n\treturn true;\nend\n\n\n\n\n\nfunction HandleSetCustomNameCmd(a_Split, a_Player, a_EntireCmd)\n\tif not(a_Split[2]) then\n\t\ta_Player:SendMessageFatal(\"Missing an argument: the custom name to set\");\n\t\treturn true\n\tend\n\tlocal nameToSet = a_EntireCmd:match(\"/setcustomname%s(.*)\")\n\tif not(nameToSet) then\n\t\ta_Player:SendMessageFatal(\"Failed to extract the custom name to set\")\n\t\treturn true\n\tend\n\tnameToSet = nameToSet:gsub(\"\\\\([0-9][0-9][0-9])\", string.char)\n\n\tlocal inv = a_Player:GetInventory()\n\tlocal slotNum = inv:GetEquippedSlotNum()\n\tlocal item = cItem(inv:GetEquippedItem())  -- Make a copy of the item\n\titem.m_CustomName = nameToSet\n\tinv:SetHotbarSlot(slotNum, item)\n\ta_Player:SendMessage(\"Custom name set to \" .. nameToSet)\n\treturn true\nend\n\n\n\n\n\nfunction HandleSetPropCmd(a_Split, a_Player, a_EntireCmd)\n\tif not(a_Split[2]) then\n\t\ta_Player:SendMessageFatal(\"Missing an argument: the property value to set\");\n\t\treturn true\n\tend\n\tlocal valueToSet = a_EntireCmd:match(\"/setprop%s(.*)\")\n\tif not(valueToSet) then\n\t\ta_Player:SendMessageFatal(\"Failed to extract the property value to set\")\n\t\treturn true\n\tend\n\tvalueToSet = valueToSet:gsub(\"\\\\([0-9][0-9][0-9])\", string.char)\n\n\tlocal inv = a_Player:GetInventory()\n\tlocal slotNum = inv:GetEquippedSlotNum()\n\tlocal item = inv:GetEquippedItem()\n\titem.m_DebuggersCustomProp = valueToSet\n\tinv:SetHotbarSlot(slotNum, item)\n\ta_Player:SendMessage(\"Custom property set to \" .. valueToSet)\n\treturn true\nend\n\n\n\n\n\nfunction HandleSetLoreCmd(a_Split, a_Player, a_EntireCmd)\n\tif not(a_Split[2]) then\n\t\ta_Player:SendMessageFatal(\"Missing an argument: the lore to set\");\n\t\treturn true\n\tend\n\tlocal loreToSet = a_EntireCmd:match(\"/setlore%s(.*)\")\n\tif not(loreToSet) then\n\t\ta_Player:SendMessageFatal(\"Failed to extract the lore to set\")\n\t\treturn true\n\tend\n\tloreToSet = loreToSet:gsub(\"\\\\([0-9][0-9][0-9])\", string.char)\n\n\tlocal inv = a_Player:GetInventory()\n\tlocal slotNum = inv:GetEquippedSlotNum()\n\tlocal item = cItem(inv:GetEquippedItem())  -- Make a copy of the item\n\tlocal oldLore = item.m_Lore\n\titem.m_Lore = loreToSet\n\tinv:SetHotbarSlot(slotNum, item)\n\ta_Player:SendMessage(\"Lore set to \" .. loreToSet)\n\treturn true\nend\n\n\n\n\n\nfunction HandleSpideyCmd(a_Split, a_Player)\n\t-- Place a line of cobwebs from the player's eyes until non-air block, in the line-of-sight of the player\n\tlocal World = a_Player:GetWorld();\n\n\tlocal Callbacks = {\n\t\tOnNextBlock = function(a_BlockPos, a_BlockType, a_BlockMeta)\n\t\t\tif (a_BlockType ~= E_BLOCK_AIR) then\n\t\t\t\t-- abort the trace\n\t\t\t\treturn true;\n\t\t\tend\n\t\t\tWorld:SetBlock(a_BlockPos, E_BLOCK_COBWEB, 0);\n\t\tend\n\t};\n\n\tlocal EyePos = a_Player:GetEyePosition();\n\tlocal LookVector = a_Player:GetLookVector();\n\tLookVector:Normalize();\n\n\t-- Start cca 2 blocks away from the eyes\n\tlocal Start = EyePos + LookVector + LookVector;\n\tlocal End = EyePos + LookVector * 50;\n\n\tcLineBlockTracer.Trace(World, Callbacks, Start, End);\n\n\treturn true;\nend\n\n\n\n\n\nfunction HandleEnchCmd(a_Split, a_Player)\n\tlocal Wnd = cLuaWindow(cWindow.wtEnchantment, 1, 1, \"Ench\");\n\ta_Player:OpenWindow(Wnd);\n\tWnd:SetProperty(0, 10);\n\tWnd:SetProperty(1, 15);\n\tWnd:SetProperty(2, 25);\n\treturn true;\nend\n\n\n\n\n\nfunction HandleFoodStatsCmd(a_Split, a_Player)\n\tg_ShowFoodStats = not(g_ShowFoodStats);\n\treturn true;\nend\n\n\n\n\n\nfunction HandleArrowCmd(a_Split, a_Player)\n\tlocal World = a_Player:GetWorld();\n\tlocal Pos = a_Player:GetEyePosition();\n\tlocal Speed = a_Player:GetLookVector();\n\tSpeed:Normalize();\n\tPos = Pos + Speed;\n\n\tWorld:CreateProjectile(Pos.x, Pos.y, Pos.z, cProjectileEntity.pkArrow, a_Player, Speed * 10);\n\treturn true;\nend\n\n\n\n\n\nfunction HandleFireballCmd(a_Split, a_Player)\n\tlocal World = a_Player:GetWorld();\n\tlocal Pos = a_Player:GetEyePosition();\n\tlocal Speed = a_Player:GetLookVector();\n\tSpeed:Normalize();\n\tPos = Pos + Speed * 2;\n\n\tWorld:CreateProjectile(Pos.x, Pos.y, Pos.z, cProjectileEntity.pkGhastFireball, a_Player, Speed * 10);\n\treturn true;\nend\n\n\n\n\nfunction HandleAddExperience(a_Split, a_Player)\n\ta_Player:DeltaExperience(200);\n\n\treturn true;\nend\n\n\n\n\n\nfunction HandleRemoveXp(a_Split, a_Player)\n\ta_Player:SetCurrentExperience(0);\n\n\treturn true;\nend\n\n\n\n\n\nfunction HandleFill(a_Split, a_Player)\n\tlocal World = a_Player:GetWorld();\n\tlocal ChunkX = a_Player:GetChunkX();\n\tlocal ChunkZ = a_Player:GetChunkZ();\n\tWorld:ForEachBlockEntityInChunk(ChunkX, ChunkZ,\n\t\tfunction(a_BlockEntity)\n\t\t\tlocal BlockType = a_BlockEntity:GetBlockType();\n\t\t\tif (\n\t\t\t\t(BlockType == E_BLOCK_CHEST) or\n\t\t\t\t(BlockType == E_BLOCK_DISPENSER) or\n\t\t\t\t(BlockType == E_BLOCK_DROPPER) or\n\t\t\t\t(BlockType == E_BLOCK_FURNACE) or\n\t\t\t\t(BlockType == E_BLOCK_HOPPER)\n\t\t\t) then\n\t\t\t\t-- This block entity has items (inherits from cBlockEntityWithItems), fill it:\n\t\t\t\t-- Note that we're not touching lit furnaces, don't wanna mess them up\n\t\t\t\tlocal EntityWithItems = tolua.cast(a_BlockEntity, \"cBlockEntityWithItems\");\n\t\t\t\tlocal ItemGrid = EntityWithItems:GetContents();\n\t\t\t\tlocal NumSlots = ItemGrid:GetNumSlots();\n\t\t\t\tlocal ItemToSet = cItem(E_ITEM_GOLD_NUGGET);\n\t\t\t\tfor i = 0, NumSlots - 1 do\n\t\t\t\t\tif (ItemGrid:GetSlot(i):IsEmpty()) then\n\t\t\t\t\t\tItemGrid:SetSlot(i, ItemToSet);\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t);\n\treturn true;\nend\n\n\n\n\n\nfunction HandleFurnaceRecipe(a_Split, a_Player)\n\tlocal HeldItem = a_Player:GetEquippedItem();\n\tlocal Out, NumTicks, In = cRoot:GetFurnaceRecipe(HeldItem);\n\tif (Out ~= nil) then\n\t\ta_Player:SendMessage(\n\t\t\t\"Furnace turns \" .. ItemToFullString(In) ..\n\t\t\t\" to \" .. ItemToFullString(Out) ..\n\t\t\t\" in \" .. NumTicks .. \" ticks (\" ..\n\t\t\ttostring(NumTicks / 20) .. \" seconds).\"\n\t\t);\n\telse\n\t\ta_Player:SendMessage(\"There is no furnace recipe that would smelt \" .. ItemToString(HeldItem));\n\tend\n\treturn true;\nend\n\n\n\n\n\nfunction HandleFurnaceFuel(a_Split, a_Player)\n\tlocal HeldItem = a_Player:GetEquippedItem();\n\tlocal NumTicks = cRoot:GetFurnaceFuelBurnTime(HeldItem);\n\tif (NumTicks > 0) then\n\t\ta_Player:SendMessage(\n\t\t\tItemToFullString(HeldItem) .. \" would power a furnace for \" .. NumTicks ..\n\t\t\t\" ticks (\" .. tostring(NumTicks / 20) .. \" seconds).\"\n\t\t);\n\telse\n\t\ta_Player:SendMessage(ItemToString(HeldItem) .. \" will not power furnaces.\");\n\tend\n\treturn true;\nend\n\n\n\n\n\nfunction HandleSched(a_Split, a_Player)\n\tlocal World = a_Player:GetWorld()\n\n\t-- Schedule a broadcast of a countdown message:\n\tfor i = 1, 10 do\n\t\tWorld:ScheduleTask(i * 20,\n\t\t\tfunction(a_World)\n\t\t\t\ta_World:BroadcastChat(\"Countdown: \" .. 11 - i)\n\t\t\tend\n\t\t)\n\tend\n\n\t-- Schedule a broadcast of the final message and a note to the originating player\n\t-- Note that we CANNOT use the a_Player in the callback - what if the player disconnected?\n\t-- Therefore we store the player's EntityID\n\tlocal PlayerID = a_Player:GetUniqueID()\n\tWorld:ScheduleTask(220,\n\t\tfunction(a_World)\n\t\t\ta_World:BroadcastChat(\"Countdown: BOOM\")\n\t\t\ta_World:DoWithEntityByID(PlayerID,\n\t\t\t\tfunction(a_Entity)\n\t\t\t\t\tif (a_Entity:IsPlayer()) then\n\t\t\t\t\t\t-- Although unlikely, it is possible that this player is not the originating player\n\t\t\t\t\t\t-- However, I leave this as an excercise to you to fix this \"bug\"\n\t\t\t\t\t\tlocal Player = tolua.cast(a_Entity, \"cPlayer\")\n\t\t\t\t\t\tPlayer:SendMessage(\"Countdown finished\")\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t)\n\t\tend\n\t)\n\n\treturn true\nend\n\n\n\n\n\nfunction HandleRMItem(a_Split, a_Player)\n\t-- Check params:\n\tif (a_Split[2] == nil) then\n\t\ta_Player:SendMessage(\"Usage: /rmitem <Item> [Count]\")\n\t\treturn true\n\tend\n\n\t-- Parse the item type:\n\tlocal Item = cItem()\n\tif (not StringToItem(a_Split[2], Item)) then\n\t\ta_Player:SendMessageFailure(a_Split[2] .. \" isn't a valid item\")\n\t\treturn true\n\tend\n\n\t-- Parse the optional item count\n\tif (a_Split[3] ~= nil) then\n\t\tlocal Count = tonumber(a_Split[3])\n\t\tif (Count == nil) then\n\t\t\ta_Player:SendMessageFailure(a_Split[3] .. \" isn't a valid number\")\n\t\t\treturn true\n\t\tend\n\n\t\tItem.m_ItemCount = Count\n\tend\n\n\t-- Remove the item:\n\tlocal NumRemovedItems = a_Player:GetInventory():RemoveItem(Item)\n\ta_Player:SendMessageSuccess(\"Removed \" .. NumRemovedItems .. \" Items!\")\n\treturn true\nend\n\n\n\n\n\nfunction HandleRequest_Debuggers(a_Request)\n\tlocal FolderContents = cFile:GetFolderContents(\"./\");\n\treturn \"<p>The following objects have been returned by cFile:GetFolderContents():<ul><li>\" .. table.concat(FolderContents, \"</li><li>\") .. \"</li></ul></p>\";\nend\n\n\n\n\n\nlocal g_Counter = 0\nlocal g_JavaScript =\n[[\n<script>\nfunction createXHR()\n{\n\tvar request = false;\n\ttry {\n\t\trequest = new ActiveXObject('Msxml2.XMLHTTP');\n\t}\n\tcatch (err2)\n\t{\n\t\ttry\n\t\t{\n\t\t\trequest = new ActiveXObject('Microsoft.XMLHTTP');\n\t\t}\n\t\tcatch (err3)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\trequest = new XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch (err1)\n\t\t\t{\n\t\t\t\trequest = false;\n\t\t\t}\n\t\t}\n\t}\n\treturn request;\n}\n\nfunction RefreshCounter()\n{\n\tvar xhr = createXHR();\n\txhr.onreadystatechange = function()\n\t{\n\t\tif (xhr.readyState == 4)\n\t\t{\n\t\t\tdocument.getElementById(\"cnt\").innerHTML = xhr.responseText;\n\t\t}\n\t};\n\txhr.open(\"POST\", \"/~webadmin/Debuggers/StressTest\", true);\n\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\txhr.send(\"counter=true\");\n}\n\nsetInterval(RefreshCounter, 10)\n</script>\n]]\n\nfunction HandleRequest_StressTest(a_Request)\n\tif (a_Request.PostParams[\"counter\"]) then\n\t\tg_Counter = g_Counter + 1\n\t\treturn tostring(g_Counter)\n\tend\n\treturn g_JavaScript .. \"<p>The counter below should be reloading as fast as possible</p><div id='cnt'>0</div>\"\nend\n\n\n\n\n\nfunction OnPluginMessage(a_Client, a_Channel, a_Message)\n\tLOGINFO(\"Received a plugin message from client \" .. a_Client:GetUsername() .. \": channel '\" .. a_Channel .. \"', message '\" .. a_Message .. \"'\");\n\n\tif (a_Channel == \"REGISTER\") then\n\t\tif (a_Message:find(\"WECUI\")) then\n\t\t\t-- The client has WorldEditCUI mod installed, test the comm by sending a few WECUI messages:\n\t\t\t--[[\n\t\t\tWECUI messages have the following generic format:\n\t\t\t<shape>|<params>\n\t\t\tIf shape is p (cuboid selection), the params are sent individually for each corner click and have the following format:\n\t\t\t<point-index>|<x>|<y>|<z>|<volume>\n\t\t\tpoint-index is 0 or 1 (lclk / rclk)\n\t\t\tvolume is the 3D volume of the current cuboid selected (all three coords' deltas multiplied), including the edge blocks; -1 if N/A\n\t\t\t--]]\n\t\t\t-- Select a 51 * 51 * 51 block cuboid:\n\t\t\ta_Client:SendPluginMessage(\"WECUI\", \"p|0|50|50|50|-1\");\n\t\t\ta_Client:SendPluginMessage(\"WECUI\", \"p|1|100|100|100|132651\");  -- 132651 = 51 * 51 * 51\n\t\tend\n\tend\nend\n\n\n\n\n\nfunction HandleChunkStay(a_Split, a_Player)\n\t-- As an example of using ChunkStay, this call will load 3x3 chunks around the specified chunk coords,\n\t-- then build an obsidian pillar in the middle of each one.\n\t-- Once complete, the player will be teleported to the middle pillar\n\n\tif (#a_Split ~= 3) then\n\t\ta_Player:SendMessageInfo(\"Usage: /cs <ChunkX> <ChunkZ>\")\n\t\treturn true\n\tend\n\n\tlocal ChunkX = tonumber(a_Split[2])\n\tlocal ChunkZ = tonumber(a_Split[3])\n\tif ((ChunkX == nil) or (ChunkZ == nil)) then\n\t\ta_Player:SendMessageFailure(\"Invalid chunk coords.\")\n\t\treturn true\n\tend\n\n\tlocal World = a_Player:GetWorld()\n\tlocal PlayerID = a_Player:GetUniqueID()\n\ta_Player:SendMessageInfo(\"Loading chunks, stand by...\");\n\n\t-- Set the wanted chunks:\n\tlocal Chunks = {}\n\tfor z = -1, 1 do for x = -1, 1 do\n\t\ttable.insert(Chunks, {ChunkX + x, ChunkZ + z})\n\tend end\n\n\t-- The function that is called when all chunks are available\n\t-- Will perform the actual action with all those chunks\n\t-- Note that the player needs to be referenced using their EntityID - in case they disconnect before the chunks load\n\tlocal OnAllChunksAvailable = function()\n\t\tLOGINFO(\"ChunkStay all chunks now available\")\n\t\t-- Build something on the neighboring chunks, to verify:\n\t\tfor z = -1, 1 do for x = -1, 1 do\n\t\t\tlocal BlockX = (ChunkX + x) * 16 + 8\n\t\t\tlocal BlockZ = (ChunkZ + z) * 16 + 8\n\t\t\tfor y = 20, 80 do\n\t\t\t\tWorld:SetBlock(BlockX, y, BlockZ, E_BLOCK_OBSIDIAN, 0)\n\t\t\tend\n\t\tend end\n\n\t\t-- Teleport the player there for visual inspection:\n\t\tWorld:DoWithEntityByID(PlayerID,\n\t\t\tfunction (a_CallbackPlayer)\n\t\t\t\ta_CallbackPlayer:TeleportToCoords(ChunkX * 16 + 8, 85, ChunkZ * 16 + 8)\n\t\t\t\ta_CallbackPlayer:SendMessageSuccess(\"ChunkStay fully available\")\n\t\t\tend\n\t\t)\n\tend\n\n\t-- This function will be called for each chunk that is made available\n\t-- Note that the player needs to be referenced using their EntityID - in case they disconnect before the chunks load\n\tlocal OnChunkAvailable = function(a_ChunkX, a_ChunkZ)\n\t\tLOGINFO(\"ChunkStay now has chunk [\" .. a_ChunkX .. \", \" .. a_ChunkZ .. \"]\")\n\t\tWorld:DoWithEntityByID(PlayerID,\n\t\t\tfunction (a_CallbackPlayer)\n\t\t\t\ta_CallbackPlayer:SendMessageInfo(\"ChunkStay now has chunk [\" .. a_ChunkX .. \", \" .. a_ChunkZ .. \"]\")\n\t\t\tend\n\t\t)\n\tend\n\n\t-- Process the ChunkStay:\n\tWorld:ChunkStay(Chunks, OnChunkAvailable, OnAllChunksAvailable)\n\treturn true\nend\n\n\n\n\n\nfunction HandleCakeCmd(a_Split, a_Player)\n\tlocal lookVector = a_Player:GetLookVector()\n\tlocal pos = a_Player:GetEyePosition() + lookVector\n\tlocal world = a_Player:GetWorld()\n\tlocal speed = lookVector * 10\n\tlocal cakeID = world:SpawnFallingBlock(pos, E_BLOCK_CAKE, 0)\n\tworld:DoWithEntityByID(cakeID,\n\t\tfunction(a_CBCake)\n\t\t\ta_CBCake:SetSpeed(speed)\n\t\tend\n\t)\n\ta_Player:SendMessage(\"Your cake is served\")\n\treturn true\nend\n\n\n\n\n\nfunction HandleClientVersionCmd(a_Split, a_Player)\n\ta_Player:SendMessage(\"Your client version number is \" .. a_Player:GetClientHandle():GetProtocolVersion() ..\".\")\n\treturn true\nend\n\n\n\n\n\nfunction HandleComeCmd(a_Split, a_Player)\n\t-- Find the first solid block under the player (in case they are flying):\n\tlocal playerWorld = a_Player:GetWorld()\n\tlocal playerPos = a_Player:GetPosition()\n\tlocal toPos = Vector3i(playerPos)\n\tif (toPos.y < 1) then\n\t\ta_Player:SendMessageFailure(\"Cannot navigate to you, you're too low in the world\")\n\t\treturn true\n\tend\n\twhile not(cBlockInfo:IsSolid(playerWorld:GetBlock(toPos.x, toPos.y, toPos.z))) do\n\t\tif (toPos.y <= 0) then\n\t\t\ta_Player:SendMessageFailure(\"Cannot navigate to you, there's no solid block below you\")\n\t\t\treturn true\n\t\tend\n\t\ttoPos.y = toPos.y - 1\n\tend\n\n\t-- Find the mob to navigate:\n\tlocal mob\n\tlocal playerLook = a_Player:GetLookVector():NormalizeCopy()\n\tlocal maxDot = 0\n\tplayerWorld:ForEachEntity(\n\t\tfunction (a_CBEntity)\n\t\t\tlocal dir = (a_CBEntity:GetPosition() - playerPos)\n\t\t\tdir:Normalize()\n\t\t\tlocal dot = dir:Dot(playerLook)\n\t\t\tif (dot > maxDot) then\n\t\t\t\tmaxDot = dot\n\t\t\t\tmob = a_CBEntity\n\t\t\tend\n\t\tend\n\t)\n\tif not(mob) then\n\t\ta_Player:SendMessageFailure(\"Cannot navigate to you, there's no mob this way\")\n\t\treturn true\n\tend\n\n\tmob:MoveToPosition(Vector3d(toPos))\n\ta_Player:SendMessageSuccess((\n\t\tstring.format(\"Navigating the %s to position {%d, %d, %d}\",\n\t\t\tcMonster:MobTypeToString(mob:GetMobType()), toPos.x, toPos.y, toPos.z\n\t\t)\n\t))\n\treturn true\nend\n\n\n\n\n\nfunction HandleCompo(a_Split, a_Player)\n\t-- Send one composite message to self:\n\tlocal msg = cCompositeChat()\n\tmsg:AddTextPart(\"Hello! \", \"b@e\")  -- bold yellow\n\tmsg:AddUrlPart(\"Cuberite\", \"https://cuberite.org\")\n\tmsg:AddTextPart(\" rules! \")\n\tmsg:AddRunCommandPart(\"Set morning\", \"/time set 0\")\n\ta_Player:SendMessage(msg)\n\n\t-- Broadcast another one to the world:\n\tlocal msg2 = cCompositeChat()\n\tmsg2:AddSuggestCommandPart(a_Player:GetName(), \"/tell \" .. a_Player:GetName() .. \" \")\n\tmsg2:AddTextPart(\" knows how to use cCompositeChat!\");\n\ta_Player:GetWorld():BroadcastChat(msg2)\n\n\treturn true\nend\n\n\n\n\n\nfunction HandleSetBiome(a_Split, a_Player)\n\tlocal Biome = biJungle\n\tlocal Size = 20\n\tlocal SplitSize = #a_Split\n\tif (SplitSize > 3) then\n\t\ta_Player:SendMessage(\"Too many parameters. Usage: \" .. a_Split[1] .. \" <BiomeType>\")\n\t\treturn true\n\tend\n\n\tif (SplitSize >= 2) then\n\t\tBiome = StringToBiome(a_Split[2])\n\t\tif (Biome == biInvalidBiome) then\n\t\t\ta_Player:SendMessage(\"Unknown biome: '\" .. a_Split[2] .. \"'. Command ignored.\")\n\t\t\treturn true\n\t\tend\n\tend\n\tif (SplitSize >= 3) then\n\t\tSize = tostring(a_Split[3])\n\t\tif (Size == nil) then\n\t\t\ta_Player:SendMessage(\"Unknown size: '\" .. a_Split[3] .. \"'. Command ignored.\")\n\t\t\treturn true\n\t\tend\n\tend\n\n\tlocal BlockX = math.floor(a_Player:GetPosX())\n\tlocal BlockZ = math.floor(a_Player:GetPosZ())\n\ta_Player:GetWorld():SetAreaBiome(BlockX - Size, BlockX + Size, BlockZ - Size, BlockZ + Size, Biome)\n\ta_Player:SendMessage(\n\t\t\"Blocks {\" .. (BlockX - Size) .. \", \" .. (BlockZ - Size) ..\n\t\t\"} - {\" .. (BlockX + Size) .. \", \" .. (BlockZ + Size) ..\n\t\t\"} set to biome #\" .. tostring(Biome) .. \".\"\n\t)\n\treturn true\nend\n\n\n\n\n\nfunction HandleVectorCmd(a_Split, a_Player)\n\ta_Player:SendMessage(\"Testing the Vector3 APIs...\")\n\n\t-- Test the Vector3 coercion in ManualBindings - any Vector3 type should be accepted for any Vector3 parameter:\n\tlocal pos = a_Player:GetPosition()\n\tlocal c = cCuboid:new()\n\tc:Assign(pos - Vector3d(2, 2, 2), pos + Vector3d(2, 2, 2))\n\tassert(c:IsInside(Vector3d(pos)))\n\tassert(c:IsInside(Vector3f(pos)))\n\tassert(c:IsInside(Vector3i(pos)))\n\tassert(c:IsInside({pos.x, pos.y, pos.z}))\n\n\ta_Player:SendMessage(\"Test successful.\")\n\treturn true\nend\n\n\n\n\n\nfunction HandleWESel(a_Split, a_Player)\n\t-- Check if the selection is a cuboid:\n\tlocal IsCuboid = cPluginManager:CallPlugin(\"WorldEdit\", \"IsPlayerSelectionCuboid\")\n\tif (IsCuboid == nil) then\n\t\ta_Player:SendMessage(cCompositeChat():SetMessageType(mtFailure):AddTextPart(\"Cannot adjust selection, WorldEdit is not loaded\"))\n\t\treturn true\n\telseif (IsCuboid == false) then\n\t\ta_Player:SendMessage(cCompositeChat():SetMessageType(mtFailure):AddTextPart(\"Cannot adjust selection, the selection is not a cuboid\"))\n\t\treturn true\n\tend\n\n\t-- Get the selection:\n\tlocal SelCuboid = cCuboid()\n\tlocal IsSuccess = cPluginManager:CallPlugin(\"WorldEdit\", \"GetPlayerCuboidSelection\", a_Player, SelCuboid)\n\tif not(IsSuccess) then\n\t\ta_Player:SendMessage(cCompositeChat():SetMessageType(mtFailure):AddTextPart(\"Cannot adjust selection, WorldEdit reported failure while getting current selection\"))\n\t\treturn true\n\tend\n\n\t-- Adjust the selection:\n\tlocal NumBlocks = tonumber(a_Split[2] or \"1\") or 1\n\tSelCuboid:Expand(NumBlocks, NumBlocks, 0, 0, NumBlocks, NumBlocks)\n\n\t-- Set the selection:\n\tIsSuccess = cPluginManager:CallPlugin(\"WorldEdit\", \"SetPlayerCuboidSelection\", a_Player, SelCuboid)\n\tif not(IsSuccess) then\n\t\ta_Player:SendMessage(cCompositeChat():SetMessageType(mtFailure):AddTextPart(\"Cannot adjust selection, WorldEdit reported failure while setting new selection\"))\n\t\treturn true\n\tend\n\ta_Player:SendMessage(cCompositeChat():SetMessageType(mtInformation):AddTextPart(\"Successfully adjusted the selection by \" .. NumBlocks .. \" block(s)\"))\n\treturn true\nend\n\n\n\n\n\nfunction OnPlayerJoined(a_Player)\n\t-- Test composite chat chaining:\n\ta_Player:SendMessage(cCompositeChat()\n\t\t:AddTextPart(\"Hello, \")\n\t\t:AddUrlPart(a_Player:GetName(), \"https://cuberite.org\", \"u@2\")\n\t\t:AddSuggestCommandPart(\", and welcome.\", \"/help\", \"u\")\n\t\t:AddRunCommandPart(\" SetDay\", \"/time set 0\")\n\t)\nend\n\n\n\n\n\nfunction OnProjectileHitBlock(a_Projectile, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_BlockHitPos)\n\t-- Test projectile hooks by setting the blocks they hit on fire:\n\tlocal BlockX, BlockY, BlockZ = AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace)\n\tlocal World = a_Projectile:GetWorld()\n\n\tWorld:SetBlock(BlockX, BlockY, BlockZ, E_BLOCK_FIRE, 0)\nend\n\n\n\n\n\nfunction OnChunkUnloading(a_World, a_ChunkX, a_ChunkZ)\n\t-- Do not let chunk [0, 0] unload, so that it continues ticking [cWorld:SetChunkAlwaysTicked() test]\n\tif ((a_ChunkX == 0) and (a_ChunkZ == 0)) then\n\t\treturn true\n\tend\nend\n\n\n\n\n\nfunction OnWorldStarted(a_World)\n\t-- Make the chunk [0, 0] in every world keep ticking [cWorld:SetChunkAlwaysTicked() test]\n\ta_World:ChunkStay({{0, 0}}, nil,\n\t\tfunction()\n\t\t\t-- The chunk is loaded, make it always tick:\n\t\t\ta_World:SetChunkAlwaysTicked(0, 0, true)\n\t\tend\n\t)\nend\n\n\n\n\n\nfunction OnProjectileHitBlock(a_ProjectileEntity, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_BlockHitPos)\n\t-- This simple test is for testing issue #1326 - simply declaring this hook would crash the server upon call\n\tLOG(\"Projectile hit block\")\n\tLOG(\"  Projectile EntityID: \" .. a_ProjectileEntity:GetUniqueID())\n\tLOG(\"  Block: {\" .. a_BlockX .. \", \" .. a_BlockY .. \", \" .. a_BlockZ .. \"}, face \" .. a_BlockFace)\n\tLOG(\"  HitPos: {\" .. a_BlockHitPos.x .. \", \" .. a_BlockHitPos.y .. \", \" .. a_BlockHitPos.z .. \"}\")\nend\n\n\n\n\n\nlocal PossibleItems =\n{\n\tcItem(E_ITEM_DIAMOND),\n\tcItem(E_ITEM_GOLD),\n\tcItem(E_ITEM_IRON),\n\tcItem(E_ITEM_DYE, 1, E_META_DYE_BLUE),  -- Lapis lazuli\n\tcItem(E_ITEM_COAL),\n}\n\n\n\n\n\nfunction HandlePickups(a_Split, a_Player)\n\tlocal PlayerX = a_Player:GetPosX()\n\tlocal PlayerY = a_Player:GetPosY()\n\tlocal PlayerZ = a_Player:GetPosZ()\n\tlocal World = a_Player:GetWorld()\n\tlocal Range = 12\n\tfor x = 0, Range do for z = 0, Range do\n\t\tlocal px = PlayerX + x - Range / 2\n\t\tlocal pz = PlayerZ + z - Range / 2\n\t\tlocal Items = cItems()\n\t\tItems:Add(PossibleItems[math.random(#PossibleItems)])\n\t\tWorld:SpawnItemPickups(Items, px, PlayerY, pz, 0)\n\tend end  -- for z, for x\n\treturn true\nend\n\n\n\n\n\nfunction HandlePlugMsg(a_Split, a_Player)\n\tlocal ch = a_Player:GetClientHandle()\n\tch:SendPluginMessage(\"TestCh\", \"some\\0string\\1with\\2funny\\3chars\")\n\treturn true\nend\n\n\n\n\n\nfunction HandlePoof(a_Split, a_Player)\n\tlocal PlayerPos = Vector3d(a_Player:GetPosition())  -- Create a copy of the position\n\tPlayerPos.y = PlayerPos.y - 1\n\tlocal Box = cBoundingBox(PlayerPos, 4, 2)\n\tlocal NumEntities = 0\n\ta_Player:GetWorld():ForEachEntityInBox(Box,\n\t\tfunction (a_Entity)\n\t\t\tif not(a_Entity:IsPlayer()) then\n\t\t\t\tlocal AddSpeed = a_Entity:GetPosition() - PlayerPos  -- Speed away from the player\n\t\t\t\ta_Entity:AddSpeed(AddSpeed * 32 / (AddSpeed:SqrLength() + 1))  -- The further away, the less speed to add\n\t\t\t\tNumEntities = NumEntities + 1\n\t\t\tend\n\t\tend\n\t)\n\ta_Player:SendMessage(\"Poof! (\" .. NumEntities .. \" entities)\")\n\treturn true\nend\n\n\n\n\n\n-- List of hashing functions to test:\nlocal HashFunctions =\n{\n\t{\"md5\", md5 },\n\t{\"cCryptoHash.md5\", cCryptoHash.md5 },\n\t{\"cCryptoHash.md5HexString\", cCryptoHash.md5HexString },\n\t{\"cCryptoHash.sha1\", cCryptoHash.sha1 },\n\t{\"cCryptoHash.sha1HexString\", cCryptoHash.sha1HexString },\n}\n\n-- List of strings to try hashing:\nlocal HashExamples =\n{\n\t\"\",\n\t\"\\0\",\n\t\"test\",\n}\n\nfunction HandleConsoleHash(a_Split)\n\tfor _, str in ipairs(HashExamples) do\n\t\tLOG(\"Hashing string \\\"\" .. str .. \"\\\":\")\n\t\tfor _, hash in ipairs(HashFunctions) do\n\t\t\tif not(hash[2]) then\n\t\t\t\tLOG(\"Hash function \" .. hash[1] .. \" doesn't exist in the API!\")\n\t\t\telse\n\t\t\t\tLOG(hash[1] .. \"() = \" .. hash[2](str))\n\t\t\tend\n\t\tend  -- for hash - HashFunctions[]\n\tend  -- for str - HashExamples[]\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleHitTrace(a_Split)\n\tlocal world = cRoot:Get():GetDefaultWorld()\n\tlocal s = Vector3d(0, 70, 0)\n\tlocal e = Vector3d(100, 75, 100)\n\tif (tonumber(a_Split[2])) then\n\t\ts.x = tonumber(a_Split[2])\n\tend\n\tif (tonumber(a_Split[3])) then\n\t\ts.y = tonumber(a_Split[3])\n\tend\n\tif (tonumber(a_Split[4])) then\n\t\ts.z = tonumber(a_Split[4])\n\tend\n\tif (tonumber(a_Split[5])) then\n\t\te.x = tonumber(a_Split[5])\n\tend\n\tif (tonumber(a_Split[6])) then\n\t\te.y = tonumber(a_Split[6])\n\tend\n\tif (tonumber(a_Split[7])) then\n\t\te.z = tonumber(a_Split[7])\n\tend\n\tlocal res, hitCoords, hitBlockCoords, hitBlockFace = cLineBlockTracer:FirstSolidHitTrace(world, s, e)\n\tif (res) then\n\t\treturn true, string.format(\"The line hits block {%d, %d, %d} at point {%f, %f, %f}, face %s\",\n\t\t\thitBlockCoords.x, hitBlockCoords.y, hitBlockCoords.z,\n\t\t\thitCoords.x, hitCoords.y, hitCoords.z,\n\t\t\tBlockFaceToString(hitBlockFace)\n\t\t)\n\telse\n\t\treturn true, \"The two points specified don't have a solid block between them.\"\n\tend\nend\n\n\n\n\n\n--- Monitors the state of the \"inh\" entity-spawning hook\n-- if false, the hook is installed before the \"inh\" command processing\nlocal isInhHookInstalled = false\n\nfunction HandleConsoleInh(a_Split, a_FullCmd)\n\t-- Check the param:\n\tlocal kindStr = a_Split[2] or \"pkArrow\"\n\tlocal kind = cProjectileEntity[kindStr]\n\tif (kind == nil) then\n\t\treturn true, \"There's no projectile kind '\" .. kindStr .. \"'.\"\n\tend\n\n\t-- Get the world to test in:\n\tlocal world = cRoot:Get():GetDefaultWorld()\n\tif (world == nil) then\n\t\treturn true, \"Cannot test inheritance, no default world\"\n\tend\n\n\t-- Install the hook, if needed:\n\tif not(isInhHookInstalled) then\n\t\tcPluginManager:AddHook(cPluginManager.HOOK_SPAWNING_ENTITY,\n\t\t\tfunction (a_CBWorld, a_CBEntity)\n\t\t\t\tLOG(\"New entity is spawning:\")\n\t\t\t\tLOG(\"  Lua type:        '\" .. type(a_CBEntity)           .. \"'\")\n\t\t\t\tLOG(\"  ToLua type:      '\" .. tolua.type(a_CBEntity)     .. \"'\")\n\t\t\t\tLOG(\"  GetEntityType(): '\" .. a_CBEntity:GetEntityType() .. \"'\")\n\t\t\t\tLOG(\"  GetClass():      '\" .. a_CBEntity:GetClass()      .. \"'\")\n\t\t\tend\n\t\t)\n\t\tisInhHookInstalled = true\n\tend\n\n\t-- Create the projectile:\n\tLOG(\"Creating a \" .. kindStr .. \" projectile in world \" .. world:GetName() .. \"...\")\n\tlocal msg\n\tworld:ChunkStay({{0, 0}},\n\t\tnil,\n\t\tfunction ()\n\t\t\t-- Create a projectile at {8, 100, 8}:\n\t\t\tlocal entityID = world:CreateProjectile(8, 100, 8, kind, nil, nil)\n\t\t\tif (entityID < 0) then\n\t\t\t\tmsg = \"Cannot test inheritance, projectile creation failed.\"\n\t\t\t\treturn\n\t\t\tend\n\t\t\tLOG(\"Entity created, ID #\" .. entityID)\n\n\t\t\t-- Call a function on the newly created entity:\n\t\t\tlocal hasExecutedCallback = false\n\t\t\tworld:DoWithEntityByID(\n\t\t\t\tentityID,\n\t\t\t\tfunction (a_CBEntity)\n\t\t\t\t\tLOG(\"Projectile created and found using the DoWithEntityByID() callback\")\n\t\t\t\t\tLOG(\"Lua type:        '\" .. type(a_CBEntity)           .. \"'\")\n\t\t\t\t\tLOG(\"ToLua type:      '\" .. tolua.type(a_CBEntity)     .. \"'\")\n\t\t\t\t\tLOG(\"GetEntityType(): '\" .. a_CBEntity:GetEntityType() .. \"'\")\n\t\t\t\t\tLOG(\"GetClass():      '\" .. a_CBEntity:GetClass()      .. \"'\")\n\t\t\t\t\thasExecutedCallback = true\n\t\t\t\tend\n\t\t\t)\n\t\t\tif not(hasExecutedCallback) then\n\t\t\t\tmsg = \"The callback failed to execute\"\n\t\t\t\treturn\n\t\t\tend\n\n\t\t\tmsg = \"Inheritance test finished\"\n\t\tend\n\t)\n\n\treturn true, msg\nend\n\n\n\n\n\nfunction HandleConsoleLoadChunk(a_Split)\n\t-- Check params:\n\tlocal numParams = #a_Split\n\tif (numParams ~= 3) and (numParams ~= 4) then\n\t\treturn true, \"Usage: \" .. a_Split[1] .. \" <ChunkX> <ChunkZ> [<WorldName>]\"\n\tend\n\n\t-- Get the chunk coords:\n\tlocal chunkX = tonumber(a_Split[2])\n\tif (chunkX == nil) then\n\t\treturn true, \"Not a number: '\" .. a_Split[2] .. \"'\"\n\tend\n\tlocal chunkZ = tonumber(a_Split[3])\n\tif (chunkZ == nil) then\n\t\treturn true, \"Not a number: '\" .. a_Split[3] .. \"'\"\n\tend\n\n\t-- Get the world:\n\tlocal world\n\tif (a_Split[4] == nil) then\n\t\tworld = cRoot:Get():GetDefaultWorld()\n\telse\n\t\tworld = cRoot:Get():GetWorld(a_Split[4])\n\t\tif (world == nil) then\n\t\t\treturn true, \"There's no world named '\" .. a_Split[4] .. \"'.\"\n\t\tend\n\tend\n\n\t-- Queue a ChunkStay for the chunk, log a message when the chunk is loaded:\n\tworld:ChunkStay({{chunkX, chunkZ}}, nil,\n\t\tfunction()\n\t\t\tLOG(\"Chunk [\" .. chunkX .. \", \" .. chunkZ .. \"] is loaded\")\n\t\tend\n\t)\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleLosTrace(a_Split)\n\tlocal world = cRoot:Get():GetDefaultWorld()\n\tlocal s = Vector3d(0, 70, 0)\n\tlocal e = Vector3d(100, 75, 100)\n\tif (tonumber(a_Split[2])) then\n\t\ts.x = tonumber(a_Split[2])\n\tend\n\tif (tonumber(a_Split[3])) then\n\t\ts.y = tonumber(a_Split[3])\n\tend\n\tif (tonumber(a_Split[4])) then\n\t\ts.z = tonumber(a_Split[4])\n\tend\n\tif (tonumber(a_Split[5])) then\n\t\te.x = tonumber(a_Split[5])\n\tend\n\tif (tonumber(a_Split[6])) then\n\t\te.y = tonumber(a_Split[6])\n\tend\n\tif (tonumber(a_Split[7])) then\n\t\te.z = tonumber(a_Split[7])\n\tend\n\tlocal res = cLineBlockTracer:LineOfSightTrace(world, s, e, cLineBlockTracer.losAir)\n\tif (res) then\n\t\treturn true, \"The two points can see each other.\"\n\telse\n\t\treturn true, \"The two points cannot see each other\"\n\tend\nend\n\n\n\n\n\nfunction HandleConsolePluginStats(a_Split)\n\tcPluginManager:ForEachPlugin(\n\t\tfunction (a_CBPlugin)\n\t\t\tLOG(\"Plugin in \" .. a_CBPlugin:GetFolderName() .. \" has an API name of \" .. a_CBPlugin:GetName() .. \" and status \" .. a_CBPlugin:GetStatus())\n\t\tend\n\t)\n\treturn true\nend\n\n\n\n\nfunction HandleConsolePrepareChunk(a_Split)\n\t-- Check params:\n\tlocal numParams = #a_Split\n\tif (numParams ~= 3) and (numParams ~= 4) then\n\t\treturn true, \"Usage: \" .. a_Split[1] .. \" <ChunkX> <ChunkZ> [<WorldName>]\"\n\tend\n\n\t-- Get the chunk coords:\n\tlocal chunkX = tonumber(a_Split[2])\n\tif (chunkX == nil) then\n\t\treturn true, \"Not a number: '\" .. a_Split[2] .. \"'\"\n\tend\n\tlocal chunkZ = tonumber(a_Split[3])\n\tif (chunkZ == nil) then\n\t\treturn true, \"Not a number: '\" .. a_Split[3] .. \"'\"\n\tend\n\n\t-- Get the world:\n\tlocal world\n\tif (a_Split[4] == nil) then\n\t\tworld = cRoot:Get():GetDefaultWorld()\n\telse\n\t\tworld = cRoot:Get():GetWorld(a_Split[4])\n\t\tif (world == nil) then\n\t\t\treturn true, \"There's no world named '\" .. a_Split[4] .. \"'.\"\n\t\tend\n\tend\n\n\t-- Queue the chunk for preparing, log a message when prepared:\n\tworld:PrepareChunk(chunkX, chunkZ,\n\t\tfunction(a_CBChunkX, a_CBChunkZ)\n\t\t\tLOG(\"Chunk [\" .. chunkX .. \", \" .. chunkZ .. \"] has been prepared\")\n\t\tend\n\t)\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleSchedule(a_Split)\n\tlocal prev = os.clock()\n\tLOG(\"Scheduling a task for 5 seconds in the future (current os.clock is \" .. prev .. \")\")\n\tcRoot:Get():GetDefaultWorld():ScheduleTask(5 * 20,\n\t\tfunction ()\n\t\t\tlocal current = os.clock()\n\t\t\tlocal diff = current - prev\n\t\t\tLOG(\"Scheduled function is called. Current os.clock is \" .. current .. \", difference is \" .. diff .. \")\")\n\t\tend\n\t)\n\treturn true, \"Task scheduled\"\nend\n\n\n\n\n\n--- Returns the square of the distance from the specified point to the specified line\nlocal function SqDistPtFromLine(x, y, x1, y1, x2, y2)\n\tlocal dx = x - x1\n\tlocal dy = y - y1\n\tlocal px = x2 - x1\n\tlocal py = y2 - y1\n\tlocal ss = px * dx + py * dy\n\tlocal ds = px * px + py * py\n\n\tif (ss < 0) then\n\t\t-- Return sqdistance from point 1\n\t\treturn dx * dx + dy * dy\n\tend\n\tif (ss > ds) then\n\t\t-- Return sqdistance from point 2\n\t\treturn ((x2 - x) * (x2 - x) + (y2 - y) * (y2 - y))\n\tend\n\n\t-- Return sqdistance from the line\n\tif ((px * px + py * py) == 0) then\n\t\treturn dx * dx + dy * dy\n\telse\n\t\treturn (py * dx - px * dy) * (py * dx - px * dy) / (px * px + py * py)\n\tend\nend\n\n\n\n\n\nfunction HandleConsoleTestBbox(a_Split, a_EntireCmd)\n\t-- Test bbox intersection:\n\tlocal bbox1 = cBoundingBox(0, 5, 0, 5, 0, 5)\n\tlocal bbox2 = cBoundingBox(bbox1)  -- Make a copy\n\tbbox2:Move(20, 20, 20)\n\tlocal bbox3 = cBoundingBox(bbox1)  -- Make a copy\n\tbbox3:Move(2, 2, 2)\n\tlocal doesIntersect, intersection = bbox1:Intersect(bbox2)\n\tLOG(\"Bbox 2 intersection: \" .. tostring(doesIntersect))\n\tLOG(\"  Intersection type: \" .. type(intersection) .. \" / \" .. tolua.type(intersection))\n\tif (intersection) then\n\t\tLOG(\"  {\" .. intersection:GetMinX() .. \", \" .. intersection:GetMinY() .. \", \" .. intersection:GetMinZ() .. \"}\")\n\t\tLOG(\"  {\" .. intersection:GetMaxX() .. \", \" .. intersection:GetMaxY() .. \", \" .. intersection:GetMaxZ() .. \"}\")\n\tend\n\tdoesIntersect, intersection = bbox1:Intersect(bbox3)\n\tLOG(\"Bbox 3 intersection: \" .. tostring(doesIntersect))\n\tLOG(\"  Intersection type: \" .. type(intersection) .. \" / \" .. tolua.type(intersection))\n\tif (intersection) then\n\t\tLOG(\"  {\" .. intersection:GetMinX() .. \", \" .. intersection:GetMinY() .. \", \" .. intersection:GetMinZ() .. \"}\")\n\t\tLOG(\"  {\" .. intersection:GetMaxX() .. \", \" .. intersection:GetMaxY() .. \", \" .. intersection:GetMaxZ() .. \"}\")\n\tend\n\n\t-- Test line intersection:\n\tlocal lines =\n\t{\n\t\t{ Vector3d(5, 0, 5), Vector3d(5, 1, 5) },\n\t\t{ Vector3d(0, 0, 0), Vector3d(0, 1, 0) },\n\t}\n\tfor idx, line in ipairs(lines) do\n\t\tlocal doesIntersect, coeff, face = bbox2:CalcLineIntersection(line[1], line[2])\n\t\tLOG(\"Line \" .. idx .. \" intersection: \" .. tostring(doesIntersect))\n\t\tLOG(\"  Coeff: \" .. tostring(coeff))\n\t\tLOG(\"  Face: \" .. tostring(face))\n\t\tlocal doesIntersect2, coeff2, face2 = cBoundingBox:CalcLineIntersection(bbox2:GetMin(), bbox2:GetMax(), line[1], line[2])\n\t\tassert(doesIntersect == doesIntersect2)\n\t\tassert(coeff == coeff2)\n\t\tassert(face == face2)\n\tend\n\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleTestCall(a_Split, a_EntireCmd)\n\tLOG(\"Testing inter-plugin calls\")\n\tLOG(\"Note: These will fail if the Core plugin is not enabled\")\n\n\t-- Test calling the HandleConsoleWeather handler:\n\tlocal pm = cPluginManager\n\tLOG(\"Calling Core's HandleConsoleWeather\")\n\tlocal isSuccess = pm:CallPlugin(\"Core\", \"HandleConsoleWeather\",\n\t\t{\n\t\t\t\"/weather\",\n\t\t\t\"rain\",\n\t\t}\n\t)\n\tif (type(isSuccess) == \"boolean\") then\n\t\tLOG(\"Success\")\n\telse\n\t\tLOG(\"FAILED\")\n\tend\n\n\t-- Test injecting some code:\n\tLOG(\"Injecting code into the Core plugin\")\n\tisSuccess = pm:CallPlugin(\"Core\", \"dofile\", pm:GetCurrentPlugin():GetLocalFolder() .. \"/Inject.lua\")\n\tif (type(isSuccess) == \"boolean\") then\n\t\tLOG(\"Success\")\n\telse\n\t\tLOG(\"FAILED\")\n\tend\n\n\t-- Test the full capabilities of the table-passing API, using the injected function:\n\tLOG(\"Calling injected code\")\n\tisSuccess = pm:CallPlugin(\"Core\", \"injectedPrintParams\",\n\t\t{\n\t\t\t\"test\",\n\t\t\tnil,\n\t\t\t{\n\t\t\t\t\"test\",\n\t\t\t\t\"test\"\n\t\t\t},\n\t\t\t[10] = \"test\",\n\t\t\t[\"test\"] = \"test\",\n\t\t\t[{\"test\"}] = \"test\",\n\t\t\t[true] = \"test\",\n\t\t}\n\t)\n\tif (type(isSuccess) == \"boolean\") then\n\t\tLOG(\"Success\")\n\telse\n\t\tLOG(\"FAILED\")\n\tend\n\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleTestErr(a_Split, a_EntireCmd)\n\tcRoot:Get():GetDefaultWorld():ForEachEntity(\n\t\tfunction (a_CBEntity)\n\t\t\terror(\"This error should not abort the server\")\n\t\tend\n\t)\nend\n\n\n\n\n\nfunction HandleConsoleTestJson(a_Split, a_EntireCmd)\n\tLOG(\"Testing Json parsing...\")\n\tlocal t1 = cJson:Parse([[{\"a\": 1, \"b\": \"2\", \"c\": [3, \"4\", 5], \"d\": true }]])\n\tassert(t1.a == 1)\n\tassert(t1.b == \"2\")\n\tassert(t1.c[1] == 3)\n\tassert(t1.c[2] == \"4\")\n\tassert(t1.c[3] == 5)\n\tassert(t1.d == true)\n\tLOG(\"Json parsing example 1 successful\")\n\n\tlocal t2, msg = cJson:Parse([[{\"some\": invalid, json}]])\n\tassert(t2 == nil)\n\tassert(type(msg) == \"string\")\n\tLOG(\"Json parsing an invalid string: Error message returned: \" .. msg)\n\n\tlocal isSuccess, t3\n\tisSuccess, t3, msg = pcall(cJson.Parse, cJson, nil)\n\tif (isSuccess) then\n\t\tLOG(string.format(\"Json parsing a 'nil' produced a %s and a %s, msg is %s.\",\n\t\t\ttype(t3), type(msg), msg or \"<nil>\"\n\t\t))\n\telse\n\t\tLOG(\"Json parsing a 'nil' raised an error\")\n\tend\n\n\tLOG(\"Json parsing test succeeded\")\n\n\tLOG(\"Testing Json serializing...\")\n\tlocal s1, msg1 = cJson:Serialize({a = 1, b = \"2\", c = {3, \"4\", 5}, d = true}, {indentation = \" \"})\n\tLOG(\"Serialization result: \" .. (s1 or (\"ERROR: \" .. (msg1 or \"<no message>\"))))\n\n\tlocal s2, msg2 = cJson:Serialize({valueA = 1, valueB = {3, badValue = \"4\", 5}, d = true}, {indentation = \" \"})\n\tassert(not(s2), \"Serialization should have failed\")\n\tLOG(\"Serialization correctly failed with message: \" .. (msg2 or \"<no message>\"))\n\n\tLOG(\"Json serializing test succeeded\")\n\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleTestTracer(a_Split, a_EntireCmd)\n\t-- Check required params:\n\tif not(a_Split[7]) then\n\t\treturn true, \"Usage: \" .. a_Split[1] .. \" <x1> <y1> <z1> <x2> <y2> <z2> [<WorldName>]\"\n\tend\n\tlocal Coords = {}\n\tfor i = 1, 6 do\n\t\tlocal v = tonumber(a_Split[i + 1])\n\t\tif not(v) then\n\t\t\treturn true, \"Parameter \" .. (i + 1) .. \" (\" .. tostring(a_Split[i + 1]) .. \") not a number \"\n\t\tend\n\t\tCoords[i] = v\n\tend\n\n\t-- Get the world in which to test:\n\tlocal World\n\tif (a_Split[8]) then\n\t\tWorld = cRoot:GetWorld(a_Split[2])\n\telse\n\t\tWorld = cRoot:Get():GetDefaultWorld()\n\tend\n\tif not(World) then\n\t\treturn true, \"No such world\"\n\tend\n\n\t-- Define the callbacks to use for tracing:\n\tlocal Callbacks =\n\t{\n\t\tOnNextBlock = function(a_BlockPos, a_BlockType, a_BlockMeta, a_EntryFace)\n\t\t\tLOG(string.format(\"{%d, %d, %d}: %s\", a_Block.x, a_Block.y, a_Block.z, ItemToString(cItem(a_BlockType, 1, a_BlockMeta))))\n\t\tend,\n\t\tOnNextBlockNoData = function(a_BlockPos, a_EntryFace)\n\t\t\tLOG(string.format(\"{%d, %d, %d} (no data)\", a_Block.x, a_Block.y, a_Block.z))\n\t\tend,\n\t\tOnNoChunk = function()\n\t\t\tLOG(\"Chunk not loaded\")\n\t\tend,\n\t\tOnNoMoreHits = function()\n\t\t\tLOG(\"Trace finished\")\n\t\tend,\n\t\tOnOutOfWorld = function()\n\t\t\tLOG(\"Out of world\")\n\t\tend,\n\t\tOnIntoWorld = function()\n\t\t\tLOG(\"Into world\")\n\t\tend,\n\t}\n\n\t-- Approximate the chunks needed for the trace by iterating over all chunks and measuring their center's distance from the traced line\n\tlocal Chunks = {}\n\tlocal sx = math.floor(Coords[1] / 16)\n\tlocal sz = math.floor(Coords[3] / 16)\n\tlocal ex = math.floor(Coords[4] / 16)\n\tlocal ez = math.floor(Coords[6] / 16)\n\tlocal sgnx = (sx < ex) and 1 or -1\n\tlocal sgnz = (sz < ez) and 1 or -1\n\tfor z = sz, ez, sgnz do\n\t\tlocal ChunkCenterZ = z * 16 + 8\n\t\tfor x = sx, ex, sgnx do\n\t\t\tlocal ChunkCenterX = x * 16 + 8\n\t\t\tlocal sqdist = SqDistPtFromLine(ChunkCenterX, ChunkCenterZ, Coords[1], Coords[3], Coords[4], Coords[6])\n\t\t\tif (sqdist <= 128) then\n\t\t\t\ttable.insert(Chunks, {x, z})\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Load the chunks and do the trace once loaded:\n\tlocal startPos = Vector3i(Coords[1], Coords[2], Coords[3])\n\tlocal endPos = Vector3i(Coords[4], Coords[5], Coords[6])\n\tWorld:ChunkStay(Chunks,\n\t\tnil,\n\t\tfunction()\n\t\t\tcLineBlockTracer:Trace(World, Callbacks, startPos, endPos)\n\t\tend\n\t)\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleTestTracerDeprecated(a_Split, a_EntireCmd)\n\t-- Check required params:\n\tif not(a_Split[7]) then\n\t\treturn true, \"Usage: \" .. a_Split[1] .. \" <x1> <y1> <z1> <x2> <y2> <z2> [<WorldName>]\"\n\tend\n\tlocal Coords = {}\n\tfor i = 1, 6 do\n\t\tlocal v = tonumber(a_Split[i + 1])\n\t\tif not(v) then\n\t\t\treturn true, \"Parameter \" .. (i + 1) .. \" (\" .. tostring(a_Split[i + 1]) .. \") not a number \"\n\t\tend\n\t\tCoords[i] = v\n\tend\n\n\t-- Get the world in which to test:\n\tlocal World\n\tif (a_Split[8]) then\n\t\tWorld = cRoot:GetWorld(a_Split[2])\n\telse\n\t\tWorld = cRoot:Get():GetDefaultWorld()\n\tend\n\tif not(World) then\n\t\treturn true, \"No such world\"\n\tend\n\n\t-- Define the callbacks to use for tracing:\n\tlocal Callbacks =\n\t{\n\t\tOnNextBlock = function(a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_EntryFace)\n\t\t\tLOG(string.format(\"{%d, %d, %d}: %s\", a_BlockX, a_BlockY, a_BlockZ, ItemToString(cItem(a_BlockType, 1, a_BlockMeta))))\n\t\tend,\n\t\tOnNextBlockNoData = function(a_BlockX, a_BlockY, a_BlockZ, a_EntryFace)\n\t\t\tLOG(string.format(\"{%d, %d, %d} (no data)\", a_BlockX, a_BlockY, a_BlockZ))\n\t\tend,\n\t\tOnNoChunk = function()\n\t\t\tLOG(\"Chunk not loaded\")\n\t\tend,\n\t\tOnNoMoreHits = function()\n\t\t\tLOG(\"Trace finished\")\n\t\tend,\n\t\tOnOutOfWorld = function()\n\t\t\tLOG(\"Out of world\")\n\t\tend,\n\t\tOnIntoWorld = function()\n\t\t\tLOG(\"Into world\")\n\t\tend,\n\t}\n\n\t-- Approximate the chunks needed for the trace by iterating over all chunks and measuring their center's distance from the traced line\n\tlocal Chunks = {}\n\tlocal sx = math.floor(Coords[1] / 16)\n\tlocal sz = math.floor(Coords[3] / 16)\n\tlocal ex = math.floor(Coords[4] / 16)\n\tlocal ez = math.floor(Coords[6] / 16)\n\tlocal sgnx = (sx < ex) and 1 or -1\n\tlocal sgnz = (sz < ez) and 1 or -1\n\tfor z = sz, ez, sgnz do\n\t\tlocal ChunkCenterZ = z * 16 + 8\n\t\tfor x = sx, ex, sgnx do\n\t\t\tlocal ChunkCenterX = x * 16 + 8\n\t\t\tlocal sqdist = SqDistPtFromLine(ChunkCenterX, ChunkCenterZ, Coords[1], Coords[3], Coords[4], Coords[6])\n\t\t\tif (sqdist <= 128) then\n\t\t\t\ttable.insert(Chunks, {x, z})\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Load the chunks and do the trace once loaded:\n\tWorld:ChunkStay(Chunks,\n\t\tnil,\n\t\tfunction()\n\t\t\tcLineBlockTracer:Trace(World, Callbacks, Coords[1], Coords[2], Coords[3], Coords[4], Coords[5], Coords[6])\n\t\tend\n\t)\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleTestUrlClient(a_Split, a_EntireCmd)\n\tlocal url = a_Split[2] or \"https://github.com\"\n\tlocal isSuccess, msg = cUrlClient:Get(url,\n\t\tfunction (a_Body, a_SecondParam)\n\t\t\tif not(a_Body) then\n\t\t\t\t-- An error has occurred, a_SecondParam is the error message\n\t\t\t\tLOG(\"Error while retrieving URL \\\"\" .. url .. \"\\\": \" .. (a_SecondParam or \"<no message>\"))\n\t\t\t\treturn\n\t\t\tend\n\t\t\t-- Body received, a_SecondParam is the HTTP headers dictionary-table\n\t\t\tassert(type(a_Body) == \"string\")\n\t\t\tassert(type(a_SecondParam) == \"table\")\n\t\t\tLOG(\"URL body received, length is \" .. string.len(a_Body) .. \" bytes and there are these headers:\")\n\t\t\tfor k, v in pairs(a_SecondParam) do\n\t\t\t\tLOG(\"  \\\"\" .. k .. \"\\\": \\\"\" .. v .. \"\\\"\")\n\t\t\tend\n\t\t\tLOG(\"(headers list finished)\")\n\t\tend\n\t)\n\tif not(isSuccess) then\n\t\tLOG(\"cUrlClient request failed: \" .. (msg or \"<no message>\"))\n\tend\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleTestUrlParser(a_Split, a_EntireCmd)\n\tLOG(\"Testing cUrlParser...\")\n\tlocal UrlsToTest =\n\t{\n\t\t\"invalid URL\",\n\t\t\"https://github.com\",\n\t\t\"ftp://anonymous:user@example.com@ftp.cuberite.org:9921/releases/2015/2015-12-25.zip\",\n\t\t\"ftp://anonymous:user:name:with:colons@example.com@ftp.cuberite.org:9921\",\n\t\t\"https://google.com/\",\n\t\t\"https://google.com/?q=cuberite\",\n\t\t\"https://google.com/search?q=cuberite\",\n\t\t\"https://google.com/some/search?q=cuberite#results\",\n\t\t\"https://google.com/?q=cuberite#results\",\n\t\t\"https://google.com/#results\",\n\t\t\"ftp://cuberite.org:9921/releases/2015/2015-12-25.zip\",\n\t\t\"mailto:support@cuberite.org\",\n\t}\n\tfor _, u in ipairs(UrlsToTest) do\n\t\tLOG(\"URL: \" .. u)\n\t\tlocal scheme, username, password, host, port, path, query, fragment = cUrlParser:Parse(u)\n\t\tif not(scheme) then\n\t\t\tLOG(\"  Error: \" .. (username or \"<nil>\"))\n\t\telse\n\t\t\tLOG(\"  Scheme   = \" .. scheme)\n\t\t\tLOG(\"  Username = \" .. username)\n\t\t\tLOG(\"  Password = \" .. password)\n\t\t\tLOG(\"  Host     = \" .. host)\n\t\t\tLOG(\"  Port     = \" .. port)\n\t\t\tLOG(\"  Path     = \" .. path)\n\t\t\tLOG(\"  Query    = \" .. query)\n\t\t\tLOG(\"  Fragment = \" .. fragment)\n\t\tend\n\tend\n\tLOG(\"cUrlParser test complete\")\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleUuid(a_Split, a_EntireCmd)\n\t-- Check params:\n\tlocal playerName = a_Split[2]\n\tif not(playerName) then\n\t\treturn true, \"Usage: uuid <PlayerName>\"\n\tend\n\n\t-- Query with cache:\n\tLOG(\"Player \" .. playerName .. \":\")\n\tlocal cachedUuid = cMojangAPI:GetUUIDFromPlayerName(playerName, true)\n\tif not(cachedUuid) then\n\t\tLOG(\"  - not in the UUID cache\")\n\telse\n\t\tLOG(\"  - in the cache: \\\"\" .. cachedUuid .. \"\\\"\")\n\tend\n\n\t-- Query online:\n\tlocal onlineUuid = cMojangAPI:GetUUIDFromPlayerName(playerName, false)\n\tif not(onlineUuid) then\n\t\tLOG(\"  - UUID not available online\")\n\telse\n\t\tLOG(\"  - online: \\\"\" .. onlineUuid .. \"\\\"\")\n\tend\n\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleBBox(a_Split)\n\tlocal bbox = cBoundingBox(0, 10, 0, 10, 0, 10)\n\tlocal v1 = Vector3d(1, 1, 1)\n\tlocal v2 = Vector3d(5, 5, 5)\n\tlocal v3 = Vector3d(11, 11, 11)\n\n\tif (bbox:IsInside(v1)) then\n\t\tLOG(\"v1 is inside bbox\")\n\telse\n\t\tLOG(\"v1 is not inside bbox\")\n\tend\n\n\tif (bbox:IsInside(v2)) then\n\t\tLOG(\"v2 is inside bbox\")\n\telse\n\t\tLOG(\"v2 is not inside bbox\")\n\tend\n\n\tif (bbox:IsInside(v3)) then\n\t\tLOG(\"v3 is inside bbox\")\n\telse\n\t\tLOG(\"v3 is not inside bbox\")\n\tend\n\n\tif (bbox:IsInside(v1, v2)) then\n\t\tLOG(\"v1*v2 is inside bbox\")\n\telse\n\t\tLOG(\"v1*v2 is not inside bbox\")\n\tend\n\n\tif (bbox:IsInside(v2, v1)) then\n\t\tLOG(\"v2*v1 is inside bbox\")\n\telse\n\t\tLOG(\"v2*v1 is not inside bbox\")\n\tend\n\n\tif (bbox:IsInside(v1, v3)) then\n\t\tLOG(\"v1*v3 is inside bbox\")\n\telse\n\t\tLOG(\"v1*v3 is not inside bbox\")\n\tend\n\n\tif (bbox:IsInside(v2, v3)) then\n\t\tLOG(\"v2*v3 is inside bbox\")\n\telse\n\t\tLOG(\"v2*v3 is not inside bbox\")\n\tend\n\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleDeadlock(a_Split)\n\t-- If given a parameter, assume it's a world name and simulate a deadlock in the world's tick thread\n\tif (a_Split[2]) then\n\t\tlocal world = cRoot:Get():GetWorld(a_Split[2])\n\t\tif (world) then\n\t\t\tworld:ScheduleTask(0,\n\t\t\t\tfunction()\n\t\t\t\t\t-- Make a live-lock:\n\t\t\t\t\twhile (true) do\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t)\n\t\t\treturn true, \"Deadlock in world tick thread for world \" .. a_Split[2] .. \" has been scheduled.\"\n\t\tend\n\t\tLOG(\"Not a world name: \" .. a_Split[2] .. \"; simulating a deadlock in the command execution thread instead.\")\n\telse\n\t\tLOG(\"Simulating a deadlock in the command execution thread.\")\n\tend\n\n\t-- Make a live-lock in the command execution thread:\n\twhile(true) do\n\tend\nend\n\n\n\n\n\nfunction HandleConsoleDownload(a_Split)\n\t-- Check params:\n\tlocal url = a_Split[2]\n\tlocal fnam = a_Split[3]\n\tif (not(url) or not(fnam)) then\n\t\treturn true, \"Missing parameters. Usage: download <url> <filename>\"\n\tend\n\n\tlocal callbacks =\n\t{\n\t\tOnStatusLine = function (self, a_HttpVersion, a_Status, a_Rest)\n\t\t\tif (a_Status ~= 200) then\n\t\t\t\tLOG(\"Cannot download \" .. url .. \", HTTP error code \" .. a_Status)\n\t\t\t\treturn\n\t\t\tend\n\n\t\t\tlocal f, err = io.open(fnam, \"wb\")\n\t\t\tif not(f) then\n\t\t\t\tLOG(\"Cannot download \" .. url .. \", error opening the file \" .. fnam .. \": \" .. (err or \"<no message>\"))\n\t\t\t\treturn\n\t\t\tend\n\t\t\tself.m_File = f\n\t\tend,\n\n\t\tOnBodyData = function (self, a_Data)\n\t\t\tif (self.m_File) then\n\t\t\t\tself.m_File:write(a_Data)\n\t\t\tend\n\t\tend,\n\n\t\tOnBodyFinished = function (self)\n\t\t\tif (self.m_File) then\n\t\t\t\tself.m_File:close()\n\t\t\t\tLOG(\"File \" .. fnam .. \" has been downloaded.\")\n\t\t\tend\n\t\tend,\n\t}\n\n\tlocal isSuccess, msg = cUrlClient:Get(url, callbacks)\n\tif not(isSuccess) then\n\t\tLOG(\"Cannot start an URL download: \" .. (msg or \"<no message>\"))\n\t\treturn true\n\tend\n\treturn true\nend\n\n\n\n\n\nfunction HandleBlkCmd(a_Split, a_Player)\n\t-- Gets info about the block the player is looking at.\n\tlocal World = a_Player:GetWorld();\n\n\tlocal Callbacks = {\n\t\tOnNextBlock = function(a_BlockPos, a_BlockType, a_BlockMeta)\n\t\t\tif (a_BlockType ~= E_BLOCK_AIR) then\n\t\t\t\ta_Player:SendMessage(\"Block at \" .. a_BlockPos.x .. \", \" .. a_BlockPos.y .. \", \" .. a_BlockPos.z .. \" is \" .. a_BlockType .. \":\" .. a_BlockMeta)\n\t\t\t\treturn true;\n\t\t\tend\n\t\tend\n\t};\n\n\tlocal EyePos = a_Player:GetEyePosition();\n\tlocal LookVector = a_Player:GetLookVector();\n\tLookVector:Normalize();\n\n\tlocal End = EyePos + LookVector * 50;\n\n\tcLineBlockTracer.Trace(World, Callbacks, EyePos, End);\n\n\treturn true;\nend\n\n\n\n\n\nfunction HandleBoomCmd(a_Split, a_Player)\n\tlocal playerPos = a_Player:GetPosition()\n\ta_Player:GetWorld():BroadcastParticleEffect(\"smoke\", Vector3f(playerPos), Vector3f(), 0, 900)\n\ta_Player:GetWorld():BroadcastSoundEffect(\"entity.firework.large_blast\", playerPos, 1, 1)\n\ta_Player:SendMessage(\"BOOM!\")\n\treturn true\nend\n\n\n\n\n\nfunction HandleTeamsCmd(a_Split, a_Player)\n\tlocal Scoreboard = a_Player:GetWorld():GetScoreBoard()\n\n\ta_Player:SendMessage(\"Teams: \" .. table.concat(Scoreboard:GetTeamNames(), \", \"))\n\n\treturn true\nend\n\n\n"
  },
  {
    "path": "Server/Plugins/Debuggers/Info.lua",
    "content": "\n-- Info.lua\n\n-- Implements the g_PluginInfo standard plugin description\n\n\n\n\n\ng_PluginInfo =\n{\n\tName = \"Debuggers\",\n\tVersion = \"14\",\n\tDate = \"2014-12-11\",\n\tDescription = [[Contains code for testing and debugging the server. Should not be enabled on a production server!]],\n\n\tCommands =\n\t{\n\t\t[\"/arr\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleArrowCmd,\n\t\t\tHelpString = \"Creates an arrow going away from the player\"\n\t\t},\n\n\t\t[\"/blk\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleBlkCmd,\n\t\t\tHelpString = \"Gets info about the block you are looking at\"\n\t\t},\n\n\t\t[\"/boom\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleBoomCmd,\n\t\t\tHelpString = \"Playes a sound and displays an effect at the player's position\",\n\t\t},\n\n\t\t[\"/cake\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleCakeCmd,\n\t\t\tHelpString = \"Throws a cake in the direction the player's looking, in a slow arc.\",\n\t\t},\n\n\t\t[\"/clientversion\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleClientVersionCmd,\n\t\t\tHelpString = \"Shows your client's protocol version\",\n\t\t},\n\t\t[\"/come\"] =\n\t\t{\n\t\t\tPermission = \"debuggers.come\",\n\t\t\tHandler = HandleComeCmd,\n\t\t\tHelpString = \"Instruct the mob you're looking at to navigate to your position\",\n\t\t},\n\t\t[\"/compo\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleCompo,\n\t\t\tHelpString = \"Tests the cCompositeChat bindings\"\n\t\t},\n\t\t[\"/cstay\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleChunkStay,\n\t\t\tHelpString = \"Tests the ChunkStay Lua integration for the specified chunk coords\"\n\t\t},\n\t\t[\"/dash\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleDashCmd,\n\t\t\tHelpString = \"Switches between fast and normal sprinting speed\"\n\t\t},\n\t\t[\"/ench\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleEnchCmd,\n\t\t\tHelpString = \"Provides an instant dummy enchantment window\"\n\t\t},\n\t\t[\"/fast\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleFastCmd,\n\t\t\tHelpString = \"Switches between fast and normal movement speed\"\n\t\t},\n\t\t[\"/fb\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleFireballCmd,\n\t\t\tHelpString = \"Creates a ghast fireball as if shot by the player\"\n\t\t},\n\t\t[\"/ff\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleFurnaceFuel,\n\t\t\tHelpString = \"Shows how long the currently held item would burn in a furnace\"\n\t\t},\n\t\t[\"/fill\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleFill,\n\t\t\tHelpString = \"Fills all block entities in current chunk with junk\"\n\t\t},\n\t\t[\"/fl\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleFoodLevelCmd,\n\t\t\tHelpString = \"Sets the food level to the given value\"\n\t\t},\n\t\t[\"/fr\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleFurnaceRecipe,\n\t\t\tHelpString = \"Shows the furnace recipe for the currently held item\"\n\t\t},\n\t\t[\"/fs\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleFoodStatsCmd,\n\t\t\tHelpString = \"Turns regular foodstats message on or off\"\n\t\t},\n\t\t[\"/gc\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleGCCmd,\n\t\t\tHelpString = \"Activates the Lua garbage collector\"\n\t\t},\n\t\t[\"/genrails\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleGenRailsCmd,\n\t\t\tHelpString = \"Generates rail blocks with all metas from current block towards X+\",\n\t\t},\n\t\t[\"/getcustomname\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleGetCustomNameCmd,\n\t\t\tHelpString = \"Displays the exact custom name of currently held item (including non-printables)\",\n\t\t},\n\t\t[\"/getlore\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleGetLoreCmd,\n\t\t\tHelpString = \"Displays the exact Lore of currently held item (including non-printables)\",\n\t\t},\n\t\t[\"/getprop\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleGetPropCmd,\n\t\t\tHelpString = \"Displays the custom cItem property of the currently held item\",\n\t\t},\n\t\t[\"/hunger\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleHungerCmd,\n\t\t\tHelpString = \"Lists the current hunger-related variables\"\n\t\t},\n\t\t[\"/ke\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleKillEntitiesCmd,\n\t\t\tHelpString = \"Kills all the loaded entities\"\n\t\t},\n\t\t[\"/le\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleListEntitiesCmd,\n\t\t\tHelpString = \"Shows a list of all the loaded entities\"\n\t\t},\n\t\t[\"/nick\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleNickCmd,\n\t\t\tHelpString = \"Gives you a custom name\",\n\t\t},\n\t\t[\"/pickups\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandlePickups,\n\t\t\tHelpString = \"Spawns random pickups around you\"\n\t\t},\n\t\t[\"/plugmsg\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandlePlugMsg,\n\t\t\tHelpString = \"Sends a test plugin message to the client\",\n\t\t},\n\t\t[\"/poison\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandlePoisonCmd,\n\t\t\tHelpString = \"Sets food-poisoning for 15 seconds\"\n\t\t},\n\t\t[\"/poof\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandlePoof,\n\t\t\tHelpString = \"Nudges pickups close to you away from you\"\n\t\t},\n\t\t[\"/rmitem\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleRMItem,\n\t\t\tHelpString = \"Remove the specified item from the inventory.\"\n\t\t},\n\t\t[\"/sb\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleSetBiome,\n\t\t\tHelpString = \"Sets the biome around you to the specified one\"\n\t\t},\n\t\t[\"/sched\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleSched,\n\t\t\tHelpString = \"Schedules a simple countdown using cWorld:ScheduleTask()\"\n\t\t},\n\t\t[\"/setcustomname\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleSetCustomNameCmd,\n\t\t\tHelpString = \"Sets the custom name for the item currently in hand\",\n\t\t},\n\t\t[\"/setlore\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleSetLoreCmd,\n\t\t\tHelpString = \"Sets the lore for the item currently in hand\",\n\t\t},\n\t\t[\"/setprop\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleSetPropCmd,\n\t\t\tHelpString = \"Sets the custom property for the item currently in hand\",\n\t\t},\n\t\t[\"/spidey\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleSpideyCmd,\n\t\t\tHelpString = \"Shoots a line of web blocks until it hits non-air\"\n\t\t},\n\t\t[\"/starve\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleStarveCmd,\n\t\t\tHelpString = \"Sets the food level to zero\"\n\t\t},\n\t\t[\"/teams\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleTeamsCmd,\n\t\t\tHelpString = \"List the teams\"\n\t\t},\n\t\t[\"/testwnd\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleTestWndCmd,\n\t\t\tHelpString = \"Opens up a window using plugin API\"\n\t\t},\n\n\t\t[\"/vector\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleVectorCmd,\n\t\t\tHelpString = \"Tests the Vector3 API\",\n\t\t},\n\n\t\t[\"/wesel\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleWESel,\n\t\t\tHelpString = \"Expands the current WE selection by 1 block in X/Z\"\n\t\t},\n\t\t[\"/wool\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleWoolCmd,\n\t\t\tHelpString = \"Sets all your armor to blue wool\"\n\t\t},\n\t\t[\"/xpa\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleAddExperience,\n\t\t\tHelpString = \"Adds 200 experience to the player\"\n\t\t},\n\t\t[\"/xpr\"] =\n\t\t{\n\t\t\tPermission = \"debuggers\",\n\t\t\tHandler = HandleRemoveXp,\n\t\t\tHelpString = \"Remove all xp\"\n\t\t},\n\t},  -- Commands\n\n\tConsoleCommands =\n\t{\n\t\t[\"bbox\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleBBox,\n\t\t\tHelpString = \"Performs cBoundingBox API tests\",\n\t\t},\n\n\t\t[\"deadlock\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleDeadlock,\n\t\t\tHelpString = \"Simulates a deadlock, either on the command execution thread, or on a world tick thread\",\n\t\t},\n\n\t\t[\"download\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleDownload,\n\t\t\tHelpString = \"Downloads a file from a specified URL\",\n\t\t},\n\n\t\t[\"hash\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleHash,\n\t\t\tHelpString = \"Tests the crypto hashing functions\",\n\t\t},\n\n\t\t[\"hittrace\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleHitTrace,\n\t\t\tHelpString = \"Tests the FirstSolidHit trace\",\n\t\t},\n\n\t\t[\"inh\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleInh,\n\t\t\tHelpString = \"Tests the bindings of the cEntity inheritance\",\n\t\t},\n\n\t\t[\"loadchunk\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleLoadChunk,\n\t\t\tHelpString = \"Loads the specified chunk into memory\",\n\t\t},\n\n\t\t[\"lostrace\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleLosTrace,\n\t\t\tHelpString = \"Tests a LineOfSight trace\",\n\t\t},\n\n\t\t[\"pluginstats\"] =\n\t\t{\n\t\t\tHandler = HandleConsolePluginStats,\n\t\t\tHelpString = \"Shows the stats for each plugin\",\n\t\t},\n\n\t\t[\"preparechunk\"] =\n\t\t{\n\t\t\tHandler = HandleConsolePrepareChunk,\n\t\t\tHelpString = \"Prepares the specified chunk completely (load / gen / light)\",\n\t\t},\n\n\t\t[\"sched\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleSchedule,\n\t\t\tHelpString = \"Tests the world scheduling\",\n\t\t},\n\n\t\t[\"testbbox\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleTestBbox,\n\t\t\tHelpString = \"Tests cBoundingBox API\"\n\t\t},\n\n\t\t[\"testcall\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleTestCall,\n\t\t\tHelpString = \"Tests inter-plugin calls with various values\"\n\t\t},\n\n\t\t[\"testerr\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleTestErr,\n\t\t\tHelpString = \"Tests the server's ability to recover from errors in callbacks (GH #3733)\",\n\t\t},\n\n\t\t[\"testjson\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleTestJson,\n\t\t\tHelpString = \"Tests the cJson parser and serializer\",\n\t\t},\n\n\t\t[\"testtracer\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleTestTracer,\n\t\t\tHelpString = \"Tests the cLineBlockTracer\",\n\t\t},\n\n\t\t[\"testtracerdeprecated\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleTestTracerDeprecated,\n\t\t\tHelpString = \"Tests the cLineBlockTracer's deprecated API\",\n\t\t},\n\n\t\t[\"testurlclient\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleTestUrlClient,\n\t\t\tHelpString = \"Tests the cUrlClient\",\n\t\t},\n\n\t\t[\"testurlparser\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleTestUrlParser,\n\t\t\tHelpString = \"Tests the cUrlParser\",\n\t\t},\n\n\t\t[\"uuid\"] =\n\t\t{\n\t\t\tHandler = HandleConsoleUuid,\n\t\t\tHelpString = \"Queries the cMojangAPI for a player's UUID\",\n\t\t}\n\t},  -- ConsoleCommands\n}  -- g_PluginInfo\n\n\n\n"
  },
  {
    "path": "Server/Plugins/Debuggers/Inject.lua",
    "content": "-- Inject.lua\n\n-- This file gets injected into the Core plugin when testing the inter-plugin calls with the \"testcall\" command\n-- However, since this is a .lua file, it also gets loaded into the Debuggers plugin, so we need to distinguish the two\n\n\n\n\n\n--- Prints the specified table to the log, using the specified indent\n-- Assumes there are no cycles in the table and all keys and values can be turned to strings\nlocal function printTable(a_Table, a_Indent)\n\tfor k, v in pairs(a_Table) do\n\t\tLOG(a_Indent .. \"k = \" .. tostring(k))\n\t\tif (type(k) == \"table\") then\n\t\t\tprintTable(k, a_Indent .. \"  \")\n\t\tend\n\t\tLOG(a_Indent .. \"v = \" .. tostring(v))\n\t\tif (type(v) == \"table\") then\n\t\t\tprintTable(v, a_Indent .. \"  \")\n\t\tend\n\tend\nend\n\n\n\n\n\nlocal function printParams(...)\n\tLOG(\"printParams:\")\n\tfor idx, param in ipairs({...}) do\n\t\tLOG(\"  param\" .. idx .. \": \" .. tostring(param))\n\t\tif (type(param) == \"table\") then\n\t\t\tprintTable(param, \"    \")\n\t\tend\n\tend\n\tLOG(\"done\")\n\treturn true\nend\n\n\n\n\n\nlocal pluginName = cPluginManager:Get():GetCurrentPlugin():GetName()\nif (pluginName ~= \"Debuggers\") then\n\t-- We're in the destination plugin\n\tLOG(\"Loaded Inject.lua into \" .. pluginName)\n\tinjectedPrintParams = printParams\n\treturn true\nelse\n\t-- We're in the Debuggers plugin, do nothing\nend\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/DumpInfo/Init.lua",
    "content": "function Initialize(a_Plugin)\n\ta_Plugin:SetName(\"DumpInfo\")\n\ta_Plugin:SetVersion(1)\n\t\n\t-- Check if the infodump file exists.\n\tif (not cFile:IsFile(\"Plugins/InfoDump.lua\")) then\n\t\tLOGWARN(\"InfoDump.lua was not found.\")\n\t\treturn false\n\tend\n\t\n\t-- Add the webtab.\n\ta_Plugin:AddWebTab(\"DumpPlugin\", HandleDumpPluginRequest)\n\treturn true\nend\n\n\n\n\n\nfunction HandleDumpPluginRequest(a_Request)\n\tlocal Content = \"\"\n\t\n\t-- Check if it already was requested to dump a plugin.\n\tif (a_Request.PostParams[\"DumpInfo\"] ~= nil) then\n\t\tlocal F = loadfile(\"Plugins/InfoDump.lua\")\n\t\tF(\"Plugins/\" .. cPluginManager:Get():GetPluginFolderName(a_Request.PostParams[\"DumpInfo\"]))\n\tend\n\t\n\tContent = Content .. [[\n<table>\n\t<tr>\n\t\t<th colspan=\"2\">DumpInfo</th>\n\t</tr>]]\n\n\t-- Loop through each plugin that is found.\n\tcPluginManager:Get():ForEachPlugin(\n\t\tfunction(a_Plugin)\n\t\t\t-- Check if there is a file called 'Info.lua'\n\t\t\tif (cFile:IsFile(a_Plugin:GetLocalFolder() .. \"/Info.lua\")) then\n\t\t\t\tContent = Content .. \"\\n<tr>\\n\"\n\t\t\t\tContent = Content .. \"\\t<td>\" .. a_Plugin:GetName() .. \"</td>\\n\"\n\t\t\t\tContent = Content .. \"\\t<td><form method='POST'> <input type='hidden' value='\" .. a_Plugin:GetName() .. \"' name='DumpInfo'> <input type='submit' value='DumpInfo'></form></td>\\n\"\n\t\t\t\tContent = Content .. \"</tr>\\n\"\n\t\t\tend\n\t\tend\n\t)\n\t\n\tContent = Content .. [[\n</table>]]\n\n\treturn Content\nend\n"
  },
  {
    "path": "Server/Plugins/HookNotify/HookNotify.lua",
    "content": "\n-- HookNotify.lua\n\n--[[\nImplements the entire plugin\n\nNOTE: This plugin is not meant for production servers. It is used mainly by developers to verify that things\nare working properly when implementing Cuberite features. Do not enable this plugin on production servers!\n\nThis plugin logs a notification for each hook that is being called by the server.\nThe TICK and WORLD_TICK hooks are disabled because they produce too much output.\n--]]\n\n\n\n\n\nfunction Initialize(a_Plugin)\n\t-- Notify the admin that HookNotify is installed, this is not meant for production servers\n\tLOGINFO(\"HookNotify plugin is installed, beware, the log output may be quite large!\");\n\tLOGINFO(\"You want this plugin enabled only when developing another plugin, not for regular gameplay.\");\n\n\t-- These hooks will not be notified:\n\tlocal hooksToIgnore =\n\t{\n\t\t[\"HOOK_TICK\"] = true,  -- Too much spam\n\t\t[\"HOOK_WORLD_TICK\"] = true,  -- Too much spam\n\t\t[\"HOOK_TAKE_DAMAGE\"] = true,  -- Has a separate handler with more info logged\n\t\t[\"HOOK_MAX\"] = true,  -- No such hook, placeholder only\n\t\t[\"HOOK_NUM_HOOKS\"] = true,  -- No such hook, placeholder only\n\t}\n\t\n\t-- Add all hooks:\n\tfor n, v in pairs(cPluginManager) do\n\t\tif (n:match(\"HOOK_.*\")) then\n\t\t\tif not(hooksToIgnore[n]) then\n\t\t\t\tLOG(\"Adding notification for hook \" .. n .. \" (\" .. v .. \").\")\n\t\t\t\tcPluginManager.AddHook(v,\n\t\t\t\t\tfunction (...)\n\t\t\t\t\t\tLOG(n .. \"(\")\n\t\t\t\t\t\tfor i, param in ipairs(arg) do\n\t\t\t\t\t\t\tLOG(\"  \" .. i .. \": \" .. tolua.type(param) .. \": \" .. tostring(param))\n\t\t\t\t\t\tend\n\t\t\t\t\t\tLOG(\")\");\n\t\t\t\t\tend  -- hook handler\n\t\t\t\t)  -- AddHook\n\t\t\tend  -- not (ignore)\n\t\tend  -- n matches \"HOOK\"\n\tend  -- for cPluginManager{}\n\t\n\t-- OnTakeDamage has a special handler listing the details of the damage dealt:\n\tcPluginManager.AddHook(cPluginManager.HOOK_TAKE_DAMAGE,\n\t\tfunction (a_Receiver, a_TDI)\n\t\t\t-- a_Receiver is cPawn\n\t\t\t-- a_TDI is TakeDamageInfo\n\n\t\t\tLOG(\"OnTakeDamage(): \" .. a_Receiver:GetClass() .. \" was dealt RawDamage \" .. a_TDI.RawDamage .. \", FinalDamage \" .. a_TDI.FinalDamage .. \" (that is, \" .. (a_TDI.RawDamage - a_TDI.FinalDamage) .. \" HPs covered by armor)\");\n\t\tend\n\t)\n\t\n\treturn true\nend\n\n\n\n"
  },
  {
    "path": "Server/Plugins/InfoDump.lua",
    "content": "#!/usr/bin/lua\n\n-- InfoDump.lua\n\n--[[\nLoads plugins' Info.lua and dumps its g_PluginInfo (or gPluginInfo) into various text formats\nThis is used for generating plugin documentation for the forum and for GitHub's INFO.md files\n\nThis script can be used in two ways:\nExecuting \"lua InfoDump.lua\" will go through all subfolders and dump each Info.lua file it can find\n\tNote that this mode of operation requires LuaRocks with LFS installed; instructions are printed\n\twhen the prerequisites are not met.\nExecuting \"lua InfoDump.lua PluginName\" will load the Info.lua file from PluginName's folder and dump\nonly that one plugin's documentation. This mode of operation doesn't require LuaRocks\n--]]\n\n\n\n\n\n-- If this file is called using the loadfile function the arg variable isn't filled. We have to do it manualy then.\nlocal arg = arg or {...}\n\n\n\n\n\n-- Check Lua version. We use 5.1-specific construct when loading the plugin info, 5.2 is not compatible!\nif (_VERSION ~= \"Lua 5.1\") then\n\tprint(\"Unsupported Lua version. This script requires Lua version 5.1, this Lua is version \" .. (_VERSION or \"<nil>\"))\n\treturn\nend\n\n\n\n\n\n--- Removes any whitespace at the beginning and end of the string\nlocal function TrimString(a_Str)\n\treturn (string.match(a_Str, \"^%s*(.-)%s*$\"))\nend\n\n\n\n\n\n--- Replaces generic formatting with forum-specific formatting\n-- Also removes the single line-ends\nlocal function ForumizeString(a_Str)\n\tassert(type(a_Str) == \"string\")\n\n\t-- Remove the indentation, unless in the code tag:\n\t-- Only one code or /code tag per line is supported!\n\tlocal IsInCode = false\n\tlocal function RemoveIndentIfNotInCode(s)\n\t\tif (IsInCode) then\n\t\t\t-- we're in code section, check if this line terminates it\n\t\t\tIsInCode = (s:find(\"{%%/code}\") ~= nil)\n\t\t\treturn s .. \"\\n\"\n\t\telse\n\t\t\t-- we're not in code section, check if this line starts it\n\t\t\tIsInCode = (s:find(\"{%%code}\") ~= nil)\n\t\t\treturn s:gsub(\"^%s*\", \"\") .. \"\\n\"\n\t\tend\n\tend\n\ta_Str = a_Str:gsub(\"(.-)\\n\", RemoveIndentIfNotInCode)\n\n\t-- Replace multiple line ends with {%p} and single line ends with a space,\n\t-- so that manual word-wrap in the Info.lua file doesn't wrap in the forum.\n\ta_Str = a_Str:gsub(\"\\n\\n\", \"{%%p}\")\n\ta_Str = a_Str:gsub(\"\\n\", \" \")\n\n\t-- Replace the generic formatting:\n\ta_Str = a_Str:gsub(\"{%%p}\", \"\\n\\n\")\n\ta_Str = a_Str:gsub(\"{%%b}\", \"[b]\"):gsub(\"{%%/b}\", \"[/b]\")\n\ta_Str = a_Str:gsub(\"{%%i}\", \"[i]\"):gsub(\"{%%/i}\", \"[/i]\")\n\ta_Str = a_Str:gsub(\"{%%list}\", \"\\n[list]\"):gsub(\"{%%/list}\", \"[/list]\")\n\ta_Str = a_Str:gsub(\"{%%li}\", \"\\n[*]\"):gsub(\"{%%/li}\", \"\\n\")\n\n\t-- Process links: {%a LinkDestination}LinkText{%/a}\n\ta_Str = a_Str:gsub(\"{%%a%s([^}]*)}([^{]*){%%/a}\", \"[url=%1]%2[/url]\")\n\n\t-- TODO: Other formatting\n\n\treturn a_Str\nend\n\n\n\n\n\n--- Replaces generic formatting with forum-specific formatting\n-- Also removes the single line-ends\nlocal function GithubizeString(a_Str)\n\tassert(type(a_Str) == \"string\")\n\n\t-- Remove the indentation, unless in the code tag:\n\t-- Only one code or /code tag per line is supported!\n\tlocal IsInCode = false\n\tlocal function RemoveIndentIfNotInCode(s)\n\t\tif (IsInCode) then\n\t\t\t-- we're in code section, check if this line terminates it\n\t\t\tIsInCode = (s:find(\"{%%/code}\") ~= nil)\n\t\t\treturn s .. \"\\n\"\n\t\telse\n\t\t\t-- we're not in code section, check if this line starts it\n\t\t\tIsInCode = (s:find(\"{%%code}\") ~= nil)\n\t\t\treturn s:gsub(\"^%s*\", \"\") .. \"\\n\"\n\t\tend\n\tend\n\ta_Str = a_Str:gsub(\"(.-)\\n\", RemoveIndentIfNotInCode)\n\n\t-- Replace multiple line ends with {%p} and single line ends with a space,\n\t-- so that manual word-wrap in the Info.lua file doesn't wrap in the forum.\n\ta_Str = a_Str:gsub(\"\\n\\n\", \"{%%p}\")\n\ta_Str = a_Str:gsub(\"\\n\", \" \")\n\n\t-- Replace the generic formatting:\n\ta_Str = a_Str:gsub(\"{%%p}\", \"\\n\\n\")\n\ta_Str = a_Str:gsub(\"{%%b}\", \"**\"):gsub(\"{%%/b}\", \"**\")\n\ta_Str = a_Str:gsub(\"{%%i}\", \"*\"):gsub(\"{%%/i}\", \"*\")\n\ta_Str = a_Str:gsub(\"{%%list}\", \"\\n\"):gsub(\"{%%/list}\", \"\\n\")\n\ta_Str = a_Str:gsub(\"{%%li}\", \"\\n - \"):gsub(\"{%%/li}\", \"\")\n\n\t-- Process links: {%a LinkDestination}LinkText{%/a}\n\ta_Str = a_Str:gsub(\"{%%a%s([^}]*)}([^{]*){%%/a}\", \"[%2](%1)\")\n\n\t-- TODO: Other formatting\n\n\treturn a_Str\nend\n\n\n\n\n\n--- Builds an array of categories, each containing all the commands belonging to the category,\n-- and the category description, if available.\n-- Returns the array table, each item has the following format:\n-- { Name = \"CategoryName\", Description = \"CategoryDescription\", Commands = {{CommandString = \"/cmd verb\", Info = {...}}, ...}}\nlocal function BuildCategories(a_PluginInfo)\n\t-- The returned result\n\t-- This will contain both an array and a dict of the categories, to allow fast search\n\tlocal res = {}\n\n\t-- For each command add a reference to it into all of its categories:\n\tlocal function AddCommands(a_CmdPrefix, a_Commands)\n\t\tfor cmd, info in pairs(a_Commands or {}) do\n\t\t\tlocal NewCmd =\n\t\t\t{\n\t\t\t\tCommandString = a_CmdPrefix .. cmd,\n\t\t\t\tInfo = info,\n\t\t\t}\n\n\t\t\tif ((info.HelpString ~= nil) and (info.HelpString ~= \"\")) then\n\t\t\t\t-- Add to each specified category:\n\t\t\t\tlocal Category = info.Category\n\t\t\t\tif (type(Category) == \"string\") then\n\t\t\t\t\tCategory = {Category}\n\t\t\t\tend\n\t\t\t\tfor idx, cat in ipairs(Category or {\"\"}) do\n\t\t\t\t\tlocal CatEntry = res[cat]\n\t\t\t\t\tif (CatEntry == nil) then\n\t\t\t\t\t\t-- First time we came across this category, create it:\n\t\t\t\t\t\tlocal NewCat = {Name = cat, Description = \"\", Commands = {NewCmd}}\n\t\t\t\t\t\ttable.insert(res, NewCat)\n\t\t\t\t\t\tres[cat] = NewCat\n\t\t\t\t\telse\n\t\t\t\t\t\t-- We already have this category, just add the command to its list of commands:\n\t\t\t\t\t\ttable.insert(CatEntry.Commands, NewCmd)\n\t\t\t\t\tend\n\t\t\t\tend  -- for idx, cat - Category[]\n\t\t\tend  -- if (HelpString valid)\n\n\t\t\t-- Recurse all subcommands:\n\t\t\tif (info.Subcommands ~= nil) then\n\t\t\t\tAddCommands(a_CmdPrefix .. cmd .. \" \", info.Subcommands)\n\t\t\tend\n\t\tend  -- for cmd, info - a_Commands[]\n\tend  -- AddCommands()\n\n\tAddCommands(\"\", a_PluginInfo.Commands)\n\n\t-- Assign descriptions to categories:\n\tfor name, desc in pairs(a_PluginInfo.Categories or {}) do\n\t\tlocal CatEntry = res[name]\n\t\tif (CatEntry ~= nil) then\n\t\t\t-- The result has this category, add the description:\n\t\t\tCatEntry.Description = desc.Description\n\t\tend\n\tend\n\n\t-- Alpha-sort each category's command list:\n\tfor idx, cat in ipairs(res) do\n\t\ttable.sort(cat.Commands,\n\t\t\tfunction (cmd1, cmd2)\n\t\t\t\treturn (string.lower(cmd1.CommandString) < string.lower(cmd2.CommandString))\n\t\t\tend\n\t\t)\n\tend\n\n\treturn res\nend\n\n\n\n\n\n--- Returns a string specifying the command.\n-- If a_Command is a simple string, returns a_Command colorized to blue\n-- If a_Command is a table, expects members Name (full command name) and Params (command parameters),\n-- colorizes command name blue and params green\nlocal function GetCommandRefForum(a_Command)\n\tif (type(a_Command) == \"string\") then\n\t\treturn \"[color=blue]\" .. a_Command .. \"[/color]\"\n\tend\n\treturn \"[color=blue]\" .. a_Command.Name .. \"[/color] [color=green]\" .. (a_Command.Params or \"\") .. \"[/color]\"\nend\n\n\n\n\n\n--- Returns a string specifying the command.\n-- If a_CommandParams is nil, returns a_CommandName apostrophed\n-- If a_CommandParams is a string, apostrophes a_CommandName with a_CommandParams\nlocal function GetCommandRefGithub(a_CommandName, a_CommandParams)\n\tassert(type(a_CommandName) == \"string\")\n\tif (a_CommandParams == nil) then\n\t\treturn \"`\" .. a_CommandName .. \"`\"\n\tend\n\n\tassert(type(a_CommandParams) == \"table\")\n\tif ((a_CommandParams.Params == nil) or (a_CommandParams.Params == \"\")) then\n\t\treturn \"`\" .. a_CommandName .. \"`\"\n\tend\n\n\tassert(type(a_CommandParams.Params) == \"string\")\n\treturn \"`\" .. a_CommandName .. \" \" .. a_CommandParams.Params .. \"`\"\nend\n\n\n\n\n\n--- Writes the specified command detailed help array to the output file, in the forum dump format\nlocal function WriteCommandParameterCombinationsForum(a_CmdString, a_ParameterCombinations, f)\n\tassert(type(a_CmdString) == \"string\")\n\tassert(type(a_ParameterCombinations) == \"table\")\n\tassert(f ~= nil)\n\n\tif (#a_ParameterCombinations == 0) then\n\t\t-- No explicit parameter combinations to write\n\t\treturn\n\tend\n\n\tf:write(\"The following parameter combinations are recognized:\\n\")\n\tfor idx, combination in ipairs(a_ParameterCombinations) do\n\t\tf:write(\"[color=blue]\", a_CmdString, \"[/color] [color=green]\", combination.Params or \"\", \"[/color]\")\n\t\tif (combination.Help ~= nil) then\n\t\t\tf:write(\" - \", ForumizeString(combination.Help))\n\t\tend\n\t\tif (combination.Permission ~= nil) then\n\t\t\tf:write(\" (Requires permission '[color=red]\", combination.Permission, \"[/color]')\")\n\t\tend\n\t\tf:write(\"\\n\")\n\tend\nend\n\n\n\n\n\n--- Writes the specified command detailed help array to the output file, in the forum dump format\nlocal function WriteCommandParameterCombinationsGithub(a_CmdString, a_ParameterCombinations, f)\n\tassert(type(a_CmdString) == \"string\")\n\tassert(type(a_ParameterCombinations) == \"table\")\n\tassert(f ~= nil)\n\n\tif (#a_ParameterCombinations == 0) then\n\t\t-- No explicit parameter combinations to write\n\t\treturn\n\tend\n\n\tf:write(\"The following parameter combinations are recognized:\\n\\n\")\n\tfor idx, combination in ipairs(a_ParameterCombinations) do\n\t\tf:write(GetCommandRefGithub(a_CmdString, combination))\n\t\tif (combination.Help ~= nil) then\n\t\t\tf:write(\" - \", GithubizeString(combination.Help))\n\t\tend\n\t\tif (combination.Permission ~= nil) then\n\t\t\tf:write(\"   (Requires permission '**\", combination.Permission, \"**')\")\n\t\tend\n\t\tf:write(\"\\n\")\n\tend\nend\n\n\n\n\n\n--- Writes all commands in the specified category to the output file, in the forum dump format\nlocal function WriteCommandsCategoryForum(a_Category, f)\n\t-- Write category name:\n\tlocal CategoryName = a_Category.Name\n\tif (CategoryName == \"\") then\n\t\tCategoryName = \"General\"\n\tend\n\tf:write(\"\\n[size=large]\", ForumizeString(a_Category.DisplayName or CategoryName), \"[/size]\\n\")\n\n\t-- Write description:\n\tif (a_Category.Description ~= \"\") then\n\t\tf:write(ForumizeString(a_Category.Description), \"\\n\")\n\tend\n\n\t-- Write commands:\n\tf:write(\"\\n[list]\")\n\tfor idx2, cmd in ipairs(a_Category.Commands) do\n\t\tf:write(\"\\n[b]\", cmd.CommandString, \"[/b] - \", ForumizeString(cmd.Info.HelpString or \"UNDOCUMENTED\"), \"\\n\")\n\t\tif (cmd.Info.Permission ~= nil) then\n\t\t\tf:write(\"Permission required: [color=red]\", cmd.Info.Permission, \"[/color]\\n\")\n\t\tend\n\t\tif (cmd.Info.DetailedDescription ~= nil) then\n\t\t\tf:write(ForumizeString(cmd.Info.DetailedDescription))\n\t\tend\n\t\tif (cmd.Info.ParameterCombinations ~= nil) then\n\t\t\tWriteCommandParameterCombinationsForum(cmd.CommandString, cmd.Info.ParameterCombinations, f)\n\t\tend\n\tend\n\tf:write(\"[/list]\\n\\n\")\nend\n\n\n\n\n\n--- Writes all commands in the specified category to the output file, in the Github dump format\nlocal function WriteCommandsCategoryGithub(a_Category, f)\n\t-- Write category name:\n\tlocal CategoryName = a_Category.Name\n\tif (CategoryName == \"\") then\n\t\tCategoryName = \"General\"\n\tend\n\tf:write(\"\\n### \", GithubizeString(a_Category.DisplayName or CategoryName), \"\\n\")\n\n\t-- Write description:\n\tif (a_Category.Description ~= \"\") then\n\t\tf:write(GithubizeString(a_Category.Description), \"\\n\\n\")\n\tend\n\n\tf:write(\"| Command | Permission | Description |\\n\")\n\tf:write(\"| ------- | ---------- | ----------- |\\n\")\n\n\t-- Write commands:\n\tfor idx2, cmd in ipairs(a_Category.Commands) do\n\t\tf:write(\"|\", cmd.CommandString, \" | \", cmd.Info.Permission or \"\", \" | \", GithubizeString(cmd.Info.HelpString or \"UNDOCUMENTED\"), \"|\\n\")\n\tend\n\tf:write(\"\\n\\n\")\nend\n\n\n\n\n\nlocal function DumpCommandsForum(a_PluginInfo, f)\n\t-- Copy all Categories from a dictionary into an array:\n\tlocal Categories = BuildCategories(a_PluginInfo)\n\n\t-- Sort the categories by name:\n\ttable.sort(Categories,\n\t\tfunction(cat1, cat2)\n\t\t\treturn (string.lower(cat1.Name) < string.lower(cat2.Name))\n\t\tend\n\t)\n\n\tif (#Categories == 0) then\n\t\treturn\n\tend\n\n\tf:write(\"\\n[size=x-large]Commands[/size]\\n\")\n\n\t-- Dump per-category commands:\n\tfor idx, cat in ipairs(Categories) do\n\t\tWriteCommandsCategoryForum(cat, f)\n\tend\nend\n\n\n\n\n\nlocal function DumpCommandsGithub(a_PluginInfo, f)\n\t-- Copy all Categories from a dictionary into an array:\n\tlocal Categories = BuildCategories(a_PluginInfo)\n\n\t-- Sort the categories by name:\n\ttable.sort(Categories,\n\t\tfunction(cat1, cat2)\n\t\t\treturn (string.lower(cat1.Name) < string.lower(cat2.Name))\n\t\tend\n\t)\n\n\tif (#Categories == 0) then\n\t\treturn\n\tend\n\n\tf:write(\"\\n# Commands\\n\")\n\n\t-- Dump per-category commands:\n\tfor idx, cat in ipairs(Categories) do\n\t\tWriteCommandsCategoryGithub(cat, f)\n\tend\nend\n\n\n\n\n\nlocal function DumpAdditionalInfoForum(a_PluginInfo, f)\n\tlocal AInfo = a_PluginInfo.AdditionalInfo\n\tif (type(AInfo) ~= \"table\") then\n\t\t-- There is no AdditionalInfo in a_PluginInfo\n\t\treturn\n\tend\n\n\tfor idx, info in ipairs(a_PluginInfo.AdditionalInfo) do\n\t\tif ((info.Title ~= nil) and (info.Contents ~= nil)) then\n\t\t\tf:write(\"\\n[size=x-large]\", ForumizeString(info.Title), \"[/size]\\n\")\n\t\t\tf:write(ForumizeString(info.Contents), \"\\n\")\n\t\tend\n\tend\nend\n\n\n\n\n\nlocal function DumpAdditionalInfoGithub(a_PluginInfo, f)\n\tlocal AInfo = a_PluginInfo.AdditionalInfo\n\tif (type(AInfo) ~= \"table\") then\n\t\t-- There is no AdditionalInfo in a_PluginInfo\n\t\treturn\n\tend\n\n\tfor idx, info in ipairs(a_PluginInfo.AdditionalInfo) do\n\t\tif ((info.Title ~= nil) and (info.Contents ~= nil)) then\n\t\t\tf:write(\"\\n# \", GithubizeString(info.Title), \"\\n\")\n\t\t\tf:write(GithubizeString(info.Contents), \"\\n\")\n\t\tend\n\tend\nend\n\n\n\n\n\n--- Collects all permissions mentioned in the info, returns them as a sorted array\n-- Each array item is {Name = \"PermissionName\", Info = { PermissionInfo }}\nlocal function BuildPermissions(a_PluginInfo)\n\t-- Collect all used permissions from Commands, reference the commands that use the permission:\n\tlocal Permissions = a_PluginInfo.Permissions or {}\n\tlocal function CollectPermissions(a_CmdPrefix, a_Commands)\n\t\tfor cmd, info in pairs(a_Commands or {}) do\n\t\t\tCommandString = a_CmdPrefix .. cmd\n\t\t\tif ((info.Permission ~= nil) and (info.Permission ~= \"\")) then\n\t\t\t\t-- Add the permission to the list of permissions:\n\t\t\t\tlocal Permission = Permissions[info.Permission] or {}\n\t\t\t\tPermissions[info.Permission] = Permission\n\t\t\t\t-- Add the command to the list of commands using this permission:\n\t\t\t\tPermission.CommandsAffected = Permission.CommandsAffected or {}\n\t\t\t\t-- First, make sure that we don't already have this command in the list,\n\t\t\t\t-- it may have already been present in a_PluginInfo\n\t\t\t\tlocal NewCommand = true\n\t\t\t\tfor _, existCmd in ipairs(Permission.CommandsAffected) do\n\t\t\t\t\tif CommandString == existCmd then\n\t\t\t\t\t\tNewCommand = false\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif NewCommand then\n\t\t\t\t\ttable.insert(Permission.CommandsAffected, CommandString)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- Process the command param combinations for permissions:\n\t\t\tlocal ParamCombinations = info.ParameterCombinations or {}\n\t\t\tfor idx, comb in ipairs(ParamCombinations) do\n\t\t\t\tif ((comb.Permission ~= nil) and (comb.Permission ~= \"\")) then\n\t\t\t\t\t-- Add the permission to the list of permissions:\n\t\t\t\t\tlocal Permission = Permissions[comb.Permission] or {}\n\t\t\t\t\tPermissions[info.Permission] = Permission\n\t\t\t\t\t-- Add the command to the list of commands using this permission:\n\t\t\t\t\tPermission.CommandsAffected = Permission.CommandsAffected or {}\n\t\t\t\t\ttable.insert(Permission.CommandsAffected, {Name = CommandString, Params = comb.Params})\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- Process subcommands:\n\t\t\tif (info.Subcommands ~= nil) then\n\t\t\t\tCollectPermissions(CommandString .. \" \", info.Subcommands)\n\t\t\tend\n\t\tend\n\tend\n\tCollectPermissions(\"\", a_PluginInfo.Commands)\n\n\t-- Copy the list of permissions to an array:\n\tlocal PermArray = {}\n\tfor name, perm in pairs(Permissions) do\n\t\ttable.insert(PermArray, {Name = name, Info = perm})\n\tend\n\n\t-- Sort the permissions array:\n\ttable.sort(PermArray,\n\t\tfunction(p1, p2)\n\t\t\treturn (p1.Name < p2.Name)\n\t\tend\n\t)\n\treturn PermArray\nend\n\n\n\n\n\nlocal function DumpPermissionsForum(a_PluginInfo, f)\n\t-- Get the processed sorted array of permissions:\n\tlocal Permissions = BuildPermissions(a_PluginInfo)\n\tif ((Permissions == nil) or (#Permissions <= 0)) then\n\t\treturn\n\tend\n\n\t-- Dump the permissions:\n\tf:write(\"\\n[size=x-large]Permissions[/size]\\n[list]\\n\")\n\tfor idx, perm in ipairs(Permissions) do\n\t\tf:write(\"  - [color=red]\", perm.Name, \"[/color] - \")\n\t\tf:write(ForumizeString(perm.Info.Description or \"\"))\n\t\tlocal CommandsAffected = perm.Info.CommandsAffected or {}\n\t\tif (#CommandsAffected > 0) then\n\t\t\tf:write(\"\\n[list] Commands affected:\\n- \")\n\t\t\tlocal Affects = {}\n\t\t\tfor idx2, cmd in ipairs(CommandsAffected) do\n\t\t\t\ttable.insert(Affects, GetCommandRefForum(cmd))\n\t\t\tend\n\t\t\tf:write(table.concat(Affects, \"\\n - \"))\n\t\t\tf:write(\"\\n[/list]\")\n\t\tend\n\t\tif (perm.Info.RecommendedGroups ~= nil) then\n\t\t\tf:write(\"\\n[list] Recommended groups: \", perm.Info.RecommendedGroups, \"[/list]\")\n\t\tend\n\t\tf:write(\"\\n\")\n\tend\n\tf:write(\"[/list]\")\nend\n\n\n\n\n\nlocal function DumpPermissionsGithub(a_PluginInfo, f)\n\t-- Get the processed sorted array of permissions:\n\tlocal Permissions = BuildPermissions(a_PluginInfo)\n\tif ((Permissions == nil) or (#Permissions <= 0)) then\n\t\treturn\n\tend\n\n\t-- Dump the permissions:\n\tf:write(\"\\n# Permissions\\n\")\n\tf:write(\"| Permissions | Description | Commands | Recommended groups |\\n\")\n\tf:write(\"| ----------- | ----------- | -------- | ------------------ |\\n\")\n\tfor idx, perm in ipairs(Permissions) do\n\t\tf:write(\"| \", perm.Name, \" | \")\n\t\tf:write(GithubizeString(perm.Info.Description or \"\"), \" | \")\n\t\tlocal CommandsAffected = perm.Info.CommandsAffected or {}\n\t\tif (#CommandsAffected > 0) then\n\t\t\tlocal Affects = {}\n\t\t\tfor idx2, cmd in ipairs(CommandsAffected) do\n\t\t\t\tif (type(cmd) == \"string\") then\n\t\t\t\t\ttable.insert(Affects, GetCommandRefGithub(cmd))\n\t\t\t\telse\n\t\t\t\t\ttable.insert(Affects, GetCommandRefGithub(cmd.Name, cmd))\n\t\t\t\tend\n\t\t\tend\n\t\t\tf:write(table.concat(Affects, \", \"))\n\t\tend\n\t\tf:write(\" | \")\n\t\tif (perm.Info.RecommendedGroups ~= nil) then\n\t\t\tf:write(perm.Info.RecommendedGroups)\n\t\tend\n\t\tf:write(\" |\\n\")\n\tend\nend\n\n\n\n\n\nlocal function DumpDependenciesForum(a_PluginInfo, f)\n\tif (not a_PluginInfo.Dependencies) then\n\t\treturn\n\tend\n\n\tf:write(\"\\n[size=x-large]Dependencies[/size]\\n[list]\")\n\tfor idx, dependency in ipairs(a_PluginInfo.Dependencies) do\n\t\tf:write(\"\\n\\n [*] [b]\", dependency.Name, \"[/b]\", dependency.Optional == true and \" (Optional)\" or \" (Required)\")\n\t\tif (dependency.Description) then\n\t\t\tf:write(\"\\nDescription: \", ForumizeString(dependency.Description))\n\t\tend\n\t\tif (dependency.Type) then\n\t\t\tf:write(\"\\nType: \", dependency.Type)\n\t\tend\n\t\tif (dependency.Url) then\n\t\t\tf:write(\"\\nUrl: \", dependency.Url)\n\t\tend\n\tend\n\tf:write(\"\\n[/list]\")\nend\n\n\n\n\n\nlocal function DumpDependenciesGithub(a_PluginInfo, f)\n\tif (not a_PluginInfo.Dependencies) then\n\t\treturn\n\tend\n\n\tf:write(\"\\n# Dependencies\\n\")\n\tfor idx, dependency in ipairs(a_PluginInfo.Dependencies) do\n\t\tf:write(\"\\n\\n * **\", dependency.Name, \"** \", dependency.Optional == true and \"(Optional)\" or \"(Required)\")\n\t\tif (dependency.Description) then\n\t\t\tf:write(\"<br />\\nDescription: \", GithubizeString(dependency.Description))\n\t\tend\n\t\tif (dependency.Type) then\n\t\t\tf:write(\"<br />\\nType: \", dependency.Type)\n\t\tend\n\t\tif (dependency.Url) then\n\t\t\tf:write(\"<br />\\nUrl: [\", dependency.Url, \"](\", dependency.Url , \")\")\n\t\tend\n\tend\nend\n\n\n\n\n\n--- Dumps the forum-format info for the plugin\n-- Returns true on success, nil and error message on failure\nlocal function DumpPluginInfoForum(a_PluginFolder, a_PluginInfo)\n\t-- Open the output file:\n\tlocal f, msg = io.open(a_PluginFolder .. \"/forum_info.txt\", \"w\")\n\tif (f == nil) then\n\t\treturn nil, msg\n\tend\n\n\t-- Write the description:\n\tf:write(ForumizeString(a_PluginInfo.Description), \"\\n\")\n\tDumpAdditionalInfoForum(a_PluginInfo, f)\n\tDumpCommandsForum(a_PluginInfo, f)\n\tDumpPermissionsForum(a_PluginInfo, f)\n\tDumpDependenciesForum(a_PluginInfo, f)\n\tif (a_PluginInfo.SourceLocation ~= nil) then\n\t\tf:write(\"\\n[b]Source[/b]: \", a_PluginInfo.SourceLocation, \"\\n\")\n\tend\n\tif (a_PluginInfo.DownloadLocation ~= nil) then\n\t\tf:write(\"[b]Download[/b]: \", a_PluginInfo.DownloadLocation)\n\tend\n\tf:close()\n\treturn true\nend\n\n\n\n\n\n--- Dumps the README.md file into the plugin's folder with the GitHub Markdown format\n-- Returns true on success, nil and error message on failure\nlocal function DumpPluginInfoGithub(a_PluginFolder, a_PluginInfo)\n\t-- Check the params:\n\tassert(type(a_PluginFolder) == \"string\")\n\tassert(type(a_PluginInfo) == \"table\")\n\n\t-- Open the output file:\n\tlocal f, msg = io.open(a_PluginFolder .. \"/README.md\", \"w\")\n\tif (f == nil) then\n\t\tprint(\"\\tCannot dump github info for plugin \" .. a_PluginFolder .. \": \" .. msg)\n\t\treturn nil, msg\n\tend\n\n\t-- Write the description:\n\tf:write(TrimString(GithubizeString(a_PluginInfo.Description)), \"\\n\")\n\tDumpAdditionalInfoGithub(a_PluginInfo, f)\n\tDumpCommandsGithub(a_PluginInfo, f)\n\tDumpPermissionsGithub(a_PluginInfo, f)\n\tDumpDependenciesGithub(a_PluginInfo, f)\n\n\tf:close()\n\treturn true\nend\n\n\n\n\n\n--- Tries to load the g_PluginInfo or gPluginInfo from the plugin's Info.lua file\n-- Returns the plugin info table on success, or nil and error message on failure\nlocal function LoadPluginInfo(a_FolderName)\n\t-- Load and compile the Info file:\n\tlocal cfg, err = loadfile(a_FolderName .. \"/Info.lua\")\n\tif (cfg == nil) then\n\t\treturn nil, \"Cannot open 'Info.lua': \" .. err\n\tend\n\n\t-- Execute the loaded file in a sandbox:\n\t-- This is Lua-5.1-specific and won't work in Lua 5.2!\n\tlocal Sandbox = {}\n\tsetfenv(cfg, Sandbox)\n\tlocal isSuccess, errMsg = pcall(cfg)\n\tif not(isSuccess) then\n\t\treturn nil, \"Cannot load Info.lua: \" .. (errMsg or \"<unknown error>\")\n\tend\n\n\tif (Sandbox.g_PluginInfo) then\n\t\treturn Sandbox.g_PluginInfo\n\telseif (Sandbox.gPluginInfo) then\n\t\treturn Sandbox.gPluginInfo\n\tend\n\treturn nil, \"Info.lua doesn't contain the g_PluginInfo declaration\"\nend\n\n\n\n\n\n--- Processes the info for one plugin\n-- Returns true on success, nil and error message on failure\nlocal function ProcessPluginFolder(a_FolderName)\n\t-- Load the plugin info:\n\tlocal PluginInfo, Msg = LoadPluginInfo(a_FolderName)\n\tif (PluginInfo == nil) then\n\t\treturn nil, \"Cannot load info for plugin \" .. a_FolderName .. \": \" .. (Msg or \"<unknown error>\")\n\tend\n\n\t-- Dump the forum format:\n\tlocal isSuccess\n\tisSuccess, Msg = DumpPluginInfoForum(a_FolderName, PluginInfo)\n\tif not(isSuccess) then\n\t\treturn nil, \"Cannot dump forum info for plugin \" .. a_FolderName .. \": \" .. (Msg or \"<unknown error>\")\n\tend\n\n\t-- Dump the GitHub format:\n\tisSuccess, Msg = DumpPluginInfoGithub(a_FolderName, PluginInfo)\n\tif not(isSuccess) then\n\t\treturn nil, \"Cannot dump GitHub info for plugin \" .. a_FolderName .. \": \" .. (Msg or \"<unknown error>\")\n\tend\n\n\t-- All OK, return success\n\treturn true\nend\n\n\n\n\n\n--- Tries to load LFS through LuaRocks, returns the LFS instance, or nil on error\nlocal function LoadLFS()\n\t-- Try to load lfs, do not abort if not found ...\n\tlocal lfs, err = pcall(\n\t\tfunction()\n\t\t\treturn require(\"lfs\")\n\t\tend\n\t)\n\n\t-- ... rather, print a nice message with instructions:\n\tif not(lfs) then\n\t\tprint([[\n\tCannot load LuaFileSystem\n\tInstall it through luarocks by executing the following command:\n\t\tluarocks install luafilesystem (Windows)\n\t\tsudo luarocks install luafilesystem (*nix)\n\n\tIf you don't have luarocks installed, you need to install them using your OS's package manager, usually:\n\t\tsudo apt-get install luarocks (Ubuntu / Debian)\n\tOn windows, a binary distribution can be downloaded from the LuaRocks homepage, https://github.com/luarocks/luarocks/wiki/Download\n\t]])\n\n\t\tprint(\"Original error text: \", err)\n\t\treturn nil\n\tend\n\n\t-- We now know that LFS is present, get it normally:\n\treturn require(\"lfs\")\nend\n\n\n\n\n\nlocal Arg1 = arg[1]\nif ((Arg1 ~= nil) and (Arg1 ~= \"\")) then\n\t-- Called with a plugin folder name, export only that one\n\tlocal isSuccess, msg = ProcessPluginFolder(Arg1)\n\tif not(isSuccess) then\n\t\tprint(msg or \"<unknown error>\")\n\tend\nelse\n\t-- Called without any arguments, process all subfolders:\n\tlocal lfs = LoadLFS()\n\tif (lfs == nil) then\n\t\t-- LFS not loaded, error has already been printed, just bail out\n\t\treturn\n\tend\n\tprint(\"Processing plugin subfolders:\")\n\tfor fnam in lfs.dir(\".\") do\n\t\tif ((fnam ~= \".\") and (fnam ~= \"..\")) then\n\t\t\tlocal Attributes = lfs.attributes(fnam)\n\t\t\tif (Attributes ~= nil) then\n\t\t\t\tif (Attributes.mode == \"directory\") then\n\t\t\t\t\tprint(fnam)\n\t\t\t\t\tlocal isSuccess, msg = ProcessPluginFolder(fnam)\n\t\t\t\t\tif not(isSuccess) then\n\t\t\t\t\t\tprint(\"  \" .. (msg or \"<unknown error>\"))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\nprint(\"Done.\")\n\n\n"
  },
  {
    "path": "Server/Plugins/InfoReg.lua",
    "content": "\n-- InfoReg.lua\n\n--[[\nImplements functions that process the standard PluginInfo description and register command handlers.\nThe description is either given as a parameter to the registration functions, or read from the standard\nnames gPluginInfo or g_PluginInfo.\n--]]\n\n\n\n\n\n--- Lists all the subcommands that the player has permissions for\nlocal function ListSubcommands(a_Player, a_Subcommands, a_CmdString)\n\tif (a_Player == nil) then\n\t\tLOGINFO(\"The \" .. a_CmdString .. \" command requires another verb:\")\n\telse\n\t\ta_Player:SendMessage(\"The \" .. a_CmdString .. \" command requires another verb:\")\n\tend\n\n\t-- Enum all the subcommands:\n\tlocal Verbs = {}\n\tfor cmd, info in pairs(a_Subcommands) do\n\t\tif ((a_Player == nil) or (a_Player:HasPermission(info.Permission or \"\"))) then\n\t\t\ttable.insert(Verbs, a_CmdString .. \" \" .. cmd)\n\t\tend\n\tend\n\ttable.sort(Verbs)\n\n\t-- Send the list:\n\tif (a_Player == nil) then\n\t\tfor idx, verb in ipairs(Verbs) do\n\t\t\tLOGINFO(\"  \" .. verb)\n\t\tend\n\telse\n\t\tfor idx, verb in ipairs(Verbs) do\n\t\t\ta_Player:SendMessage(cCompositeChat(\"  \", mtInfo):AddSuggestCommandPart(verb, verb))\n\t\tend\n\tend\nend\n\n\n\n\n\n--- This is a generic command callback used for handling multicommands' parent commands\n-- For example, if there are \"/gal save\" and \"/gal load\" commands, this callback handles the \"/gal\" command\n-- It is used for both console and in-game commands; the console version has a_Player set to nil\nlocal function MultiCommandHandler(a_Split, a_Player, a_CmdString, a_CmdInfo, a_Level, a_EntireCommand)\n\tlocal Verb = a_Split[a_Level + 1]\n\tif (Verb == nil) then\n\t\t-- No verb was specified. If there is a handler for the upper level command, call it:\n\t\tif (a_CmdInfo.Handler ~= nil) then\n\t\t\treturn a_CmdInfo.Handler(a_Split, a_Player, a_EntireCommand)\n\t\tend\n\t\t-- Let the player know they need to give a subcommand:\n\t\tassert(type(a_CmdInfo.Subcommands) == \"table\", \"Info.lua error: There is no handler for command \\\"\" .. a_CmdString .. \"\\\" and there are no subcommands defined at level \" .. a_Level)\n\t\tListSubcommands(a_Player, a_CmdInfo.Subcommands, a_CmdString)\n\t\treturn true\n\tend\n\n\t-- A verb was specified, look it up in the subcommands table:\n\tlocal Subcommand = a_CmdInfo.Subcommands[Verb]\n\tif (Subcommand == nil) then\n\t\tif (a_Level + 1 > 1) then\n\t\t\t-- This is a true subcommand, display the message and make MCS think the command was handled\n\t\t\t-- Otherwise we get weird behavior: for \"/cmd verb\" we get \"unknown command /cmd\" although \"/cmd\" is valid\n\t\t\tif (a_Player == nil) then\n\t\t\t\tLOGWARNING(\"The \" .. a_CmdString .. \" command doesn't support verb \" .. Verb)\n\t\t\telse\n\t\t\t\ta_Player:SendMessage(\"The \" .. a_CmdString .. \" command doesn't support verb \" .. Verb)\n\t\t\tend\n\t\t\treturn true\n\t\tend\n\t\t-- This is a top-level command, let MCS handle the unknown message\n\t\treturn false;\n\tend\n\n\t-- Check the permission:\n\tif (a_Player ~= nil) then\n\t\tif not(a_Player:HasPermission(Subcommand.Permission or \"\")) then\n\t\t\ta_Player:SendMessage(\"You don't have permission to execute this command\")\n\t\t\treturn true\n\t\tend\n\tend\n\n\t-- First check if the subcommand has subcommands\n\tif (Subcommand.Subcommands ~= nil) then\n\t\t-- Next sublevel\n\t\treturn MultiCommandHandler(a_Split, a_Player, a_CmdString .. \" \" .. Verb, Subcommand, a_Level + 1, a_EntireCommand)\n\telseif (Subcommand.Handler == nil) then\n\t\t-- Subcommand has no subcommands and the handler is not found, report error\n\t\tLOGWARNING(\"Cannot find handler for command \" .. a_CmdString .. \" \" .. Verb)\n\t\treturn false\n\tend\n\n\t-- Execute:\n\treturn Subcommand.Handler(a_Split, a_Player, a_EntireCommand)\nend\n\n\n\n\n\n--- Registers all commands specified in the aPluginInfo.Commands\n-- If aPluginInfo is not given, gPluginInfo or g_PluginInfo is used\nfunction RegisterPluginInfoCommands(aPluginInfo)\n\t-- If no info given, assume the default name for the global variable\n\taPluginInfo = aPluginInfo or g_PluginInfo or gPluginInfo\n\n\t-- A sub-function that registers all subcommands of a single command, using the command's Subcommands table\n\t-- The a_Prefix param already contains the space after the previous command\n\t-- a_Level is the depth of the subcommands being registered, with 1 being the top level command\n\tlocal function RegisterSubcommands(a_Prefix, a_Subcommands, a_Level)\n\t\tassert(a_Subcommands ~= nil)\n\n\t\t-- A table that will hold aliases to subcommands temporarily, during subcommand iteration\n\t\tlocal AliasTable = {}\n\n\t\t-- Iterate through the subcommands, register them, and accumulate aliases:\n\t\tfor cmd, info in pairs(a_Subcommands) do\n\t\t\tlocal CmdName = a_Prefix .. cmd\n\t\t\tlocal Handler = info.Handler\n\t\t\t-- Provide a special handler for multicommands:\n\t\t\tif (info.Subcommands ~= nil) then\n\t\t\t\tHandler = function(a_Split, a_Player, a_EntireCommand)\n\t\t\t\t\treturn MultiCommandHandler(a_Split, a_Player, CmdName, info, a_Level, a_EntireCommand)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif (Handler == nil) then\n\t\t\t\tLOGWARNING(aPluginInfo.Name .. \": Invalid handler for command \" .. CmdName .. \", command will not be registered.\")\n\t\t\telse\n\t\t\t\tlocal HelpString\n\t\t\t\tif (info.HelpString ~= nil) then\n\t\t\t\t\tHelpString = \" - \" .. info.HelpString\n\t\t\t\telse\n\t\t\t\t\tHelpString = \"\"\n\t\t\t\tend\n\t\t\t\tcPluginManager:BindCommand(CmdName, info.Permission or \"\", Handler, HelpString)\n\t\t\t\t-- Register all aliases for the command:\n\t\t\t\tif (info.Alias ~= nil) then\n\t\t\t\t\tif (type(info.Alias) == \"string\") then\n\t\t\t\t\t\tinfo.Alias = {info.Alias}\n\t\t\t\t\tend\n\t\t\t\t\tfor idx, alias in ipairs(info.Alias) do\n\t\t\t\t\t\tcPluginManager:BindCommand(a_Prefix .. alias, info.Permission or \"\", Handler, HelpString)\n\t\t\t\t\t\t-- Also copy the alias's info table as a separate subcommand,\n\t\t\t\t\t\t-- so that MultiCommandHandler() handles it properly. Need to off-load into a separate table\n\t\t\t\t\t\t-- than the one we're currently iterating and join after the iterating.\n\t\t\t\t\t\tAliasTable[alias] = info\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend  -- else (if Handler == nil)\n\n\t\t\t-- Recursively register any subcommands:\n\t\t\tif (info.Subcommands ~= nil) then\n\t\t\t\tRegisterSubcommands(a_Prefix .. cmd .. \" \", info.Subcommands, a_Level + 1)\n\t\t\tend\n\t\tend  -- for cmd, info - a_Subcommands[]\n\n\t\t-- Add the subcommand aliases that were off-loaded during registration:\n\t\tfor alias, info in pairs(AliasTable) do\n\t\t\ta_Subcommands[alias] = info\n\t\tend\n\t\tAliasTable = {}\n\tend\n\n\t-- Loop through all commands in the plugin info, register each:\n\tif (aPluginInfo.Commands) then\n\t\tRegisterSubcommands(\"\", aPluginInfo.Commands, 1)\n\tend\nend\n\n\n\n\n\n--- Registers all console commands specified in the aPluginInfo.ConsoleCommands\n-- If aPluginInfo is not given, gPluginInfo or g_PluginInfo is used\nfunction RegisterPluginInfoConsoleCommands(aPluginInfo)\n\t-- If no info given, assume the default name for the global variable\n\taPluginInfo = aPluginInfo or g_PluginInfo or gPluginInfo\n\n\t-- A sub-function that registers all subcommands of a single command, using the command's Subcommands table\n\t-- The a_Prefix param already contains the space after the previous command\n\tlocal function RegisterSubcommands(a_Prefix, a_Subcommands, a_Level)\n\t\tassert(a_Subcommands ~= nil)\n\n\t\tfor cmd, info in pairs(a_Subcommands) do\n\t\t\tlocal CmdName = a_Prefix .. cmd\n\t\t\tlocal Handler = info.Handler\n\t\t\tif (Handler == nil) then\n\t\t\t\tHandler = function(a_Split, a_EntireCommand)\n\t\t\t\t\treturn MultiCommandHandler(a_Split, nil, CmdName, info, a_Level, a_EntireCommand)\n\t\t\t\tend\n\t\t\tend\n\t\t\tcPluginManager:BindConsoleCommand(CmdName, Handler, info.HelpString or \"\")\n\t\t\t-- Recursively register any subcommands:\n\t\t\tif (info.Subcommands ~= nil) then\n\t\t\t\tRegisterSubcommands(a_Prefix .. cmd .. \" \", info.Subcommands, a_Level + 1)\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Loop through all commands in the plugin info, register each:\n\tif (aPluginInfo.ConsoleCommands) then\n\t\tRegisterSubcommands(\"\", aPluginInfo.ConsoleCommands, 1)\n\tend\nend\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/NetworkTest/Info.lua",
    "content": "\n-- Info.lua\n\n-- Implements the g_PluginInfo standard plugin description\n\ng_PluginInfo =\n{\n\tName = \"NetworkTest\",\n\tVersion = \"1\",\n\tDate = \"2015-01-28\",\n\tDescription = [[Implements test code (and examples) for the cNetwork API]],\n\t\n\tCommands =\n\t{\n\t},\n\t\n\tConsoleCommands =\n\t{\n\t\tnet =\n\t\t{\n\t\t\tSubcommands =\n\t\t\t{\n\t\t\t\tclient =\n\t\t\t\t{\n\t\t\t\t\tHelpString = \"Connects, as a client, to a specified webpage (google.com by default) and downloads its front page using HTTP\",\n\t\t\t\t\tHandler = HandleConsoleNetClient,\n\t\t\t\t\tParameterCombinations =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"\",\n\t\t\t\t\t\t\tHelp = \"Connects, as a client, to google.com and downloads its front page using HTTP\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"host [port]\",\n\t\t\t\t\t\t\tHelp = \"Connects, as a client, to the specified host and downloads its front page using HTTP\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},  -- ParameterCombinations\n\t\t\t\t},  -- client\n\t\t\t\t\n\t\t\t\tclose =\n\t\t\t\t{\n\t\t\t\t\tHelpString = \"Close a listening socket\",\n\t\t\t\t\tHandler = HandleConsoleNetClose,\n\t\t\t\t\tParameterCombinations =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"[Port]\",\n\t\t\t\t\t\t\tHelp = \"Closes a socket listening on the specified port [1024]\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},  -- ParameterCombinations\n\t\t\t\t},  -- close\n\t\t\t\t\n\t\t\t\tips =\n\t\t\t\t{\n\t\t\t\t\tHelpString = \"Prints all locally available IP addresses\",\n\t\t\t\t\tHandler = HandleConsoleNetIps,\n\t\t\t\t},  -- ips\n\t\t\t\t\n\t\t\t\tlisten =\n\t\t\t\t{\n\t\t\t\t\tHelpString = \"Creates a new listening socket on the specified port with the specified service attached to it\",\n\t\t\t\t\tHandler = HandleConsoleNetListen,\n\t\t\t\t\tParameterCombinations =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"[Port] [Service]\",\n\t\t\t\t\t\t\tHelp = \"Starts listening on the specified port [1024] providing the specified service [echo]\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},  -- ParameterCombinations\n\t\t\t\t},  -- listen\n\t\t\t\t\n\t\t\t\tlookup =\n\t\t\t\t{\n\t\t\t\t\tHelpString = \"Looks up the IP addresses corresponding to the given hostname  (google.com by default)\",\n\t\t\t\t\tHandler = HandleConsoleNetLookup,\n\t\t\t\t\tParameterCombinations =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"\",\n\t\t\t\t\t\t\tHelp = \"Looks up the IP addresses of google.com.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"Hostname\",\n\t\t\t\t\t\t\tHelp = \"Looks up the IP addresses of the specified hostname.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"IP\",\n\t\t\t\t\t\t\tHelp = \"Looks up the canonical name of the specified IP.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},  -- lookup\n\t\t\t\t\n\t\t\t\tsclient =\n\t\t\t\t{\n\t\t\t\t\tHelpString = \"Connects, as an SSL client, to a specified webpage (github.com by default) and downloads its front page using HTTPS\",\n\t\t\t\t\tHandler = HandleConsoleNetSClient,\n\t\t\t\t\tParameterCombinations =\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"\",\n\t\t\t\t\t\t\tHelp = \"Connects, as an SSL client, to github.com and downloads its front page using HTTPS\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tParams = \"host [port]\",\n\t\t\t\t\t\t\tHelp = \"Connects, as an SSL client, to the specified host and downloads its front page using HTTPS\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},  -- ParameterCombinations\n\t\t\t\t},  -- sclient\n\n\t\t\t\tudp =\n\t\t\t\t{\n\t\t\t\t\tSubcommands =\n\t\t\t\t\t{\n\t\t\t\t\t\tclose =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tHandler = HandleConsoleNetUdpClose,\n\t\t\t\t\t\t\tParameterCombinations =\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tParams = \"[Port]\",\n\t\t\t\t\t\t\t\t\tHelp = \"Closes the UDP endpoint on the specified port [1024].\",\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},  -- close\n\t\t\t\t\t\t\n\t\t\t\t\t\tlisten =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tHandler = HandleConsoleNetUdpListen,\n\t\t\t\t\t\t\tParameterCombinations =\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tParams = \"[Port]\",\n\t\t\t\t\t\t\t\t\tHelp = \"Listens on the specified UDP port [1024], dumping the incoming datagrams into log\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},  -- listen\n\t\t\t\t\t\t\n\t\t\t\t\t\tsend =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tHandler = HandleConsoleNetUdpSend,\n\t\t\t\t\t\t\tParameterCombinations =\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tParams = \"[Host] [Port] [Message]\",\n\t\t\t\t\t\t\t\t\tHelp = \"Sends the message [\\\"hello\\\"] through UDP to the specified host [localhost] and port [1024]\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}  -- send\n\t\t\t\t\t},  -- Subcommands (\"net udp\")\n\t\t\t\t},  -- udp\n\t\t\t\t\n\t\t\t\twasc =\n\t\t\t\t{\n\t\t\t\t\tHelpString = \"Requests the webadmin homepage using https\",\n\t\t\t\t\tHandler = HandleConsoleNetWasc,\n\t\t\t\t},  -- wasc\n\t\t\t\t\n\t\t\t},  -- Subcommands\n\t\t},  -- net\n\t},\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/NetworkTest/NetworkTest.lua",
    "content": "\n-- NetworkTest.lua\n\n-- Implements a few tests for the cNetwork API\n\n\n\n\n\n--- Map of all servers currently open\n-- g_Servers[PortNum] = cServerHandle\nlocal g_Servers = {}\n\n--- Map of all UDP endpoints currently open\n-- g_UDPEndpoints[PortNum] = cUDPEndpoint\nlocal g_UDPEndpoints = {}\n\n--- List of fortune messages for the fortune server\n-- A random message is chosen for each incoming connection\n-- The contents are loaded from the splashes.txt file on plugin startup\nlocal g_Fortunes =\n{\n\t\"Empty splashes.txt\",\n}\n\n-- HTTPS certificate to be used for the SSL server:\nlocal g_HTTPSCert = [[\n-----BEGIN CERTIFICATE-----\nMIIDfzCCAmegAwIBAgIJAOBHN+qOWodcMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV\nBAYTAmN6MQswCQYDVQQIDAJjejEMMAoGA1UEBwwDbG9jMQswCQYDVQQKDAJfWDEL\nMAkGA1UECwwCT1UxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xNTAxMjQwODQ2MzFa\nFw0yNTAxMjEwODQ2MzFaMFYxCzAJBgNVBAYTAmN6MQswCQYDVQQIDAJjejEMMAoG\nA1UEBwwDbG9jMQswCQYDVQQKDAJfWDELMAkGA1UECwwCT1UxEjAQBgNVBAMMCWxv\nY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJkFYSElu/jw\nnxqjimmj246DejKJK8uy/l9QQibb/Z4kO/3s0gVPOYo0mKv32xUFP7wYIE3XWT61\nzyfvK+1jpnlQTCtM8T5xw/7CULKgLmuIzlQx5Dhy7d+tW46kOjFKwQajS9YzwqWu\nKBOPnFamQWz6vIzuM05+7aIMXbzamInvW/1x3klIrpGQgALwSB1N+oUzTInTBRKK\n21pecUE9t3qrU40Cs5bN0fQBnBjLwbgmnTh6LEplfQZHG5wLvj0IeERVU9vH7luM\ne9/IxuEZluCiu5ViF3jqLPpjYOrkX7JDSKme64CCmNIf0KkrwtFjF104Qylike60\nYD3+kw8Q+DECAwEAAaNQME4wHQYDVR0OBBYEFHHIDTc7mrLDXftjQ5ejU9Udfdyo\nMB8GA1UdIwQYMBaAFHHIDTc7mrLDXftjQ5ejU9UdfdyoMAwGA1UdEwQFMAMBAf8w\nDQYJKoZIhvcNAQEFBQADggEBAHxCJxZPmH9tvx8GKiDV3rgGY++sMItzrW5Uhf0/\nbl3DPbVz51CYF8nXiWvSJJzxhH61hKpZiqvRlpyMuovV415dYQ+Xc2d2IrTX6e+d\nZ4Pmwfb4yaX+kYqIygjXMoyNxOJyhTnCbJzycV3v5tvncBWN9Wqez6ZonWDdFdAm\nJ+Moty+atc4afT02sUg1xz+CDr1uMbt62tHwKYCdxXCwT//bOs6W21+mQJ5bEAyA\nYrHQPgX76uo8ed8rPf6y8Qj//lzq/+33EIWqf9pnbklQgIPXJU07h+5L+Y63RF4A\nComLkzas+qnQLcEN28Dg8QElXop6hfiD0xq3K0ac2bDnjoU=\n-----END CERTIFICATE-----\n]]\n\nlocal g_HTTPSPrivKey = [[\n-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCZBWEhJbv48J8a\no4ppo9uOg3oyiSvLsv5fUEIm2/2eJDv97NIFTzmKNJir99sVBT+8GCBN11k+tc8n\n7yvtY6Z5UEwrTPE+ccP+wlCyoC5riM5UMeQ4cu3frVuOpDoxSsEGo0vWM8KlrigT\nj5xWpkFs+ryM7jNOfu2iDF282piJ71v9cd5JSK6RkIAC8EgdTfqFM0yJ0wUSitta\nXnFBPbd6q1ONArOWzdH0AZwYy8G4Jp04eixKZX0GRxucC749CHhEVVPbx+5bjHvf\nyMbhGZbgoruVYhd46iz6Y2Dq5F+yQ0ipnuuAgpjSH9CpK8LRYxddOEMpYpHutGA9\n/pMPEPgxAgMBAAECggEAWxQ4m+I54BJYoSJ2YCqHpGvdb/b1emkvvsumlDqc2mP2\n0U0ENOTS+tATj0gXvotBRFOX5r0nAYx1oO9a1hFaJRsGOz+w19ofLqO6JJfzCU6E\ngNixXmgJ7fjhZiWZ/XzhJ3JK0VQ9px/h+sKf63NJvfQABmJBZ5dlGe8CXEZARNin\n03TnE3RUIEK+jEgwShN2OrGjwK9fjcnXMHwEnKZtCBiYEfD2N+pQmS20gIm13L1t\n+ZmObIC24NqllXxl4I821qzBdhmcT7+rGmKR0OT5YKbt6wFA5FPKD9dqlzXzlKck\nr2VAh+JlCtFKxcScmWtQOnVDtf5+mcKFbP4ck724AQKBgQDLk+RDhvE5ykin5R+B\ndehUQZgHb2pPL7N1DAZShfzwSmyZSOPQDFr7c0CMijn6G0Pw9VX6Vrln0crfTQYz\nHli+zxlmcMAD/WC6VImM1LCUzouNRy37rSCnuPtngZyHdsyzfheGnjORH7HlPjtY\nJCTLaekg0ckQvt//HpRV3DCdaQKBgQDAbLmIOTyGfne74HLswWnY/kCOfFt6eO+E\nlZ724MWmVPWkxq+9rltC2CDx2i8jjdkm90dsgR5OG2EaLnUWldUpkE0zH0ATrZSV\nezJWD9SsxTm8ksbThD+pJKAVPxDAboejF7kPvpaO2wY+bf0AbO3M24rJ2tccpMv8\nAcfXBICDiQKBgQCSxp81/I3hf7HgszaC7ZLDZMOK4M6CJz847aGFUCtsyAwCfGYb\n8zyJvK/WZDam14+lpA0IQAzPCJg/ZVZJ9uA/OivzCum2NrHNxfOiQRrLPxuokaBa\nq5k2tA02tGE53fJ6mze1DEzbnkFxqeu5gd2xdzvpOLfBxgzT8KU8PlQiuQKBgGn5\nNvCj/QZhDhYFVaW4G1ArLmiKamL3yYluUV7LiW7CaYp29gBzzsTwfKxVqhJdo5NH\nKinCrmr7vy2JGmj22a+LTkjyU/rCZQsyDxXAoDMKZ3LILwH8WocPqa4pzlL8TGzw\nurXGE+rXCwhE0Mp0Mz7YRgZHJKMcy06duG5dh11pAoGBALHbsBIDihgHPyp2eKMP\nK1f42MdKrTBiIXV80hv2OnvWVRCYvnhrqpeRMzCR1pmVbh+QhnwIMAdWq9PAVTTn\nypusoEsG8Y5fx8xhgjs0D2yMcrmi0L0kCgHIFNoym+4pI+sv6GgxpemfrmaPNcMx\nDXi9JpaquFRJLGJ7jMCDgotL\n-----END PRIVATE KEY-----\n]]\n\n--- Map of all services that can be run as servers\n-- g_Services[ServiceName] = function() -> accept-callbacks\nlocal g_Services =\n{\n\t-- Echo service: each connection echoes back what has been sent to it\n\techo = function (a_Port)\n\t\treturn\n\t\t{\n\t\t\t-- A new connection has come, give it new link-callbacks:\n\t\t\tOnIncomingConnection = function (a_RemoteIP, a_RemotePort)\n\t\t\t\treturn\n\t\t\t\t{\n\t\t\t\t\tOnError = function (a_Link, a_ErrorCode, a_ErrorMsg)\n\t\t\t\t\t\tLOG(\"EchoServer(\" .. a_Port .. \": Connection to \" .. a_Link:GetRemoteIP() .. \":\" .. a_Link:GetRemotePort() .. \" failed: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\t\t\t\tend,\n\t\t\t\t\t\n\t\t\t\t\tOnReceivedData = function (a_Link, a_Data)\n\t\t\t\t\t\t-- Echo the received data back to the link:\n\t\t\t\t\t\ta_Link:Send(a_Data)\n\t\t\t\t\tend,\n\t\t\t\t\t\n\t\t\t\t\tOnRemoteClosed = function (a_Link)\n\t\t\t\t\tend\n\t\t\t\t}  -- Link callbacks\n\t\t\tend,  -- OnIncomingConnection()\n\t\t\t\n\t\t\t-- Send a welcome message to newly accepted connections:\n\t\t\tOnAccepted = function (a_Link)\n\t\t\t\ta_Link:Send(\"Hello, \" .. a_Link:GetRemoteIP() .. \", welcome to the echo server @ Cuberite-Lua\\r\\n\")\n\t\t\tend,  -- OnAccepted()\n\t\t\t\n\t\t\t-- There was an error listening on the port:\n\t\t\tOnError = function (a_ErrorCode, a_ErrorMsg)\n\t\t\t\tLOGINFO(\"EchoServer(\" .. a_Port .. \": Cannot listen: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\t\tend,  -- OnError()\n\t\t}  -- Listen callbacks\n\tend,  -- echo\n\t\n\t-- Fortune service: each incoming connection gets a welcome message plus a random fortune text; all communication is ignored afterwards\n\tfortune = function (a_Port)\n\t\treturn\n\t\t{\n\t\t\t-- A new connection has come, give it new link-callbacks:\n\t\t\tOnIncomingConnection = function (a_RemoteIP, a_RemotePort)\n\t\t\t\treturn\n\t\t\t\t{\n\t\t\t\t\tOnError = function (a_Link, a_ErrorCode, a_ErrorMsg)\n\t\t\t\t\t\tLOG(\"FortuneServer(\" .. a_Port .. \"): Connection to \" .. a_Link:GetRemoteIP() .. \":\" .. a_Link:GetRemotePort() .. \" failed: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\t\t\t\tend,\n\t\t\t\t\t\n\t\t\t\t\tOnReceivedData = function (a_Link, a_Data)\n\t\t\t\t\t\t-- Ignore any received data\n\t\t\t\t\tend,\n\t\t\t\t\t\n\t\t\t\t\tOnRemoteClosed = function (a_Link)\n\t\t\t\t\tend\n\t\t\t\t}  -- Link callbacks\n\t\t\tend,  -- OnIncomingConnection()\n\t\t\t\n\t\t\t-- Send a welcome message and the fortune to newly accepted connections:\n\t\t\tOnAccepted = function (a_Link)\n\t\t\t\ta_Link:Send(\"Hello, \" .. a_Link:GetRemoteIP() .. \", welcome to the fortune server @ Cuberite-Lua\\r\\n\\r\\nYour fortune:\\r\\n\")\n\t\t\t\ta_Link:Send(g_Fortunes[math.random(#g_Fortunes)] .. \"\\r\\n\")\n\t\t\tend,  -- OnAccepted()\n\t\t\t\n\t\t\t-- There was an error listening on the port:\n\t\t\tOnError = function (a_ErrorCode, a_ErrorMsg)\n\t\t\t\tLOGINFO(\"FortuneServer(\" .. a_Port .. \"): Cannot listen: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\t\tend,  -- OnError()\n\t\t}  -- Listen callbacks\n\tend,  -- fortune\n\t\n\t-- HTTPS time - serves current time for each https request received\n\thttpstime = function (a_Port)\n\t\treturn\n\t\t{\n\t\t\t-- A new connection has come, give it new link-callbacks:\n\t\t\tOnIncomingConnection = function (a_RemoteIP, a_RemotePort)\n\t\t\t\tlocal IncomingData = \"\"  -- accumulator for the incoming data, until processed by the http\n\t\t\t\treturn\n\t\t\t\t{\n\t\t\t\t\tOnError = function (a_Link, a_ErrorCode, a_ErrorMsg)\n\t\t\t\t\t\tLOG(\"https-time server(\" .. a_Port .. \"): Connection to \" .. a_Link:GetRemoteIP() .. \":\" .. a_Link:GetRemotePort() .. \" failed: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\t\t\t\tend,\n\t\t\t\t\t\n\t\t\t\t\tOnReceivedData = function (a_Link, a_Data)\n\t\t\t\t\t\tIncomingData = IncomingData .. a_Data\n\t\t\t\t\t\tif (IncomingData:find(\"\\r\\n\\r\\n\")) then\n\t\t\t\t\t\t\t-- We have received the entire request headers, just send the response and shutdown the link:\n\t\t\t\t\t\t\tlocal Content = os.date()\n\t\t\t\t\t\t\ta_Link:Send(\"HTTP/1.0 200 OK\\r\\nContent-type: text/plain\\r\\nContent-length: \" .. #Content .. \"\\r\\n\\r\\n\" .. Content)\n\t\t\t\t\t\t\ta_Link:Shutdown()\n\t\t\t\t\t\tend\n\t\t\t\t\tend,\n\t\t\t\t\t\n\t\t\t\t\tOnRemoteClosed = function (a_Link)\n\t\t\t\t\t\tLOG(\"httpstime: link closed by remote\")\n\t\t\t\t\tend\n\t\t\t\t}  -- Link callbacks\n\t\t\tend,  -- OnIncomingConnection()\n\t\t\t\n\t\t\t-- Start TLS on the new link:\n\t\t\tOnAccepted = function (a_Link)\n\t\t\t\tlocal res, msg = a_Link:StartTLSServer(g_HTTPSCert, g_HTTPSPrivKey, \"\")\n\t\t\t\tif not(res) then\n\t\t\t\t\tLOG(\"https-time server(\" .. a_Port .. \"): Cannot start TLS server: \" .. msg)\n\t\t\t\t\ta_Link:Close()\n\t\t\t\tend\n\t\t\tend,  -- OnAccepted()\n\t\t\t\n\t\t\t-- There was an error listening on the port:\n\t\t\tOnError = function (a_ErrorCode, a_ErrorMsg)\n\t\t\t\tLOGINFO(\"https-time server(\" .. a_Port .. \"): Cannot listen: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\t\tend,  -- OnError()\n\t\t}  -- Listen callbacks\n\tend,  -- httpstime\n\t\n\t-- TODO: Other services (daytime, ...)\n}\n\n\n\n\n\nfunction Initialize(a_Plugin)\n\t-- Load the splashes.txt file into g_Fortunes, overwriting current content:\n\tlocal idx = 1\n\tfor line in io.lines(a_Plugin:GetLocalFolder() .. \"/splashes.txt\") do\n\t\tg_Fortunes[idx] = line\n\t\tidx = idx + 1\n\tend\n\t\n\t-- Use the InfoReg shared library to process the Info.lua file:\n\tdofile(cPluginManager:GetPluginsPath() .. \"/InfoReg.lua\")\n\tRegisterPluginInfoCommands()\n\tRegisterPluginInfoConsoleCommands()\n\n\t-- Seed the random generator:\n\tmath.randomseed(os.time())\n\t\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleNetClient(a_Split)\n\t-- Get the address to connect to:\n\tlocal Host = a_Split[3] or \"google.com\"\n\tlocal Port = a_Split[4] or 80\n\t\n\t-- Create the callbacks \"personalised\" for the address:\n\tlocal Callbacks =\n\t{\n\t\tOnConnected = function (a_Link)\n\t\t\tLOG(\"Connected to \" .. Host .. \":\" .. Port .. \".\")\n\t\t\tLOG(\"Connection stats: Remote address: \" .. a_Link:GetRemoteIP() .. \":\" .. a_Link:GetRemotePort() .. \", Local address: \" .. a_Link:GetLocalIP() .. \":\" .. a_Link:GetLocalPort())\n\t\t\tLOG(\"Sending HTTP request for front page.\")\n\t\t\ta_Link:Send(\"GET / HTTP/1.0\\r\\nHost: \" .. Host .. \"\\r\\n\\r\\n\")\n\t\tend,\n\t\t\n\t\tOnError = function (a_Link, a_ErrorCode, a_ErrorMsg)\n\t\t\tLOG(\"Connection to \" .. Host .. \":\" .. Port .. \" failed: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\tend,\n\t\t\n\t\tOnReceivedData = function (a_Link, a_Data)\n\t\t\tLOG(\"Received data from \" .. Host .. \":\" .. Port .. \":\\r\\n\" .. a_Data)\n\t\tend,\n\t\t\n\t\tOnRemoteClosed = function (a_Link)\n\t\t\tLOG(\"Connection to \" .. Host .. \":\" .. Port .. \" was closed by the remote peer.\")\n\t\tend\n\t}\n\t\n\t-- Queue a connect request:\n\tlocal res = cNetwork:Connect(Host, Port, Callbacks)\n\tif not(res) then\n\t\tLOGWARNING(\"cNetwork:Connect call failed immediately\")\n\t\treturn true\n\tend\n\t\n\treturn true, \"Client connection request queued.\"\nend\n\n\n\n\n\nfunction HandleConsoleNetClose(a_Split)\n\t-- Get the port to close:\n\tlocal Port = tonumber(a_Split[3] or 1024)\n\tif not(Port) then\n\t\treturn true, \"Bad port number: \\\"\" .. a_Split[3] .. \"\\\".\"\n\tend\n\n\t-- Close the server, if there is one:\n\tif not(g_Servers[Port]) then\n\t\treturn true, \"There is no server currently listening on port \" .. Port .. \".\"\n\tend\n\tg_Servers[Port]:Close()\n\tg_Servers[Port] = nil\n\treturn true, \"Port \" .. Port .. \" closed.\"\nend\n\n\n\n\n\nfunction HandleConsoleNetIps(a_Split)\n\tlocal Addresses = cNetwork:EnumLocalIPAddresses()\n\tLOG(\"IP addresses enumerated, \" .. #Addresses .. \" found\")\n\tfor idx, addr in ipairs(Addresses) do\n\t\tLOG(\"  IP #\" .. idx .. \": \" .. addr)\n\tend\n\treturn true\nend\n\n\n\n\n\nfunction HandleConsoleNetLookup(a_Split)\n\t-- Get the name to look up:\n\tlocal Addr = a_Split[3] or \"google.com\"\n\t\n\t-- Create the callbacks \"personalised\" for the host:\n\tlocal Callbacks =\n\t{\n\t\tOnNameResolved = function (a_Hostname, a_IP)\n\t\t\tLOG(a_Hostname .. \" resolves to \" .. a_IP)\n\t\tend,\n\t\t\n\t\tOnError = function (a_Query, a_ErrorCode, a_ErrorMsg)\n\t\t\tLOG(\"Failed to retrieve information for \" .. a_Query .. \": \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\t\tassert(a_Query == Addr)\n\t\tend,\n\t\t\n\t\tOnFinished = function (a_Query)\n\t\t\tLOG(\"Resolving \" .. a_Query .. \" has finished.\")\n\t\t\tassert(a_Query == Addr)\n\t\tend,\n\t}\n\t\n\t-- Queue both name and IP DNS queries;\n\t-- we don't distinguish between an IP and a hostname in this command so we don't know which one to use:\n\tlocal res = cNetwork:HostnameToIP(Addr, Callbacks)\n\tif not(res) then\n\t\tLOGWARNING(\"cNetwork:HostnameToIP call failed immediately\")\n\t\treturn true\n\tend\n\tres = cNetwork:IPToHostname(Addr, Callbacks)\n\tif not(res) then\n\t\tLOGWARNING(\"cNetwork:IPToHostname call failed immediately\")\n\t\treturn true\n\tend\n\t\n\treturn true, \"DNS query has been queued.\"\nend\n\n\n\n\n\nfunction HandleConsoleNetListen(a_Split)\n\t-- Get the params:\n\tlocal Port = tonumber(a_Split[3] or 1024)\n\tif not(Port) then\n\t\treturn true, \"Invalid port: \\\"\" .. a_Split[3] .. \"\\\".\"\n\tend\n\tlocal Service = string.lower(a_Split[4] or \"echo\")\n\t\n\t-- Create the callbacks specific for the service:\n\tif (g_Services[Service] == nil) then\n\t\treturn true, \"No such service: \" .. Service\n\tend\n\tlocal Callbacks = g_Services[Service](Port)\n\t\n\t-- Start the server:\n\tlocal srv = cNetwork:Listen(Port, Callbacks)\n\tif not(srv:IsListening()) then\n\t\t-- The error message has already been printed in the Callbacks.OnError()\n\t\treturn true\n\tend\n\tg_Servers[Port] = srv\n\treturn true, Service .. \" server started on port \" .. Port\nend\n\n\n\n\n\nfunction HandleConsoleNetSClient(a_Split)\n\t-- Get the address to connect to:\n\tlocal Host = a_Split[3] or \"github.com\"\n\tlocal Port = a_Split[4] or 443\n\n\t-- Create the callbacks \"personalised\" for the address:\n\tlocal Callbacks =\n\t{\n\t\tOnConnected = function (a_Link)\n\t\t\tLOG(\"Connected to \" .. Host .. \":\" .. Port .. \".\")\n\t\t\tLOG(\"Connection stats: Remote address: \" .. a_Link:GetRemoteIP() .. \":\" .. a_Link:GetRemotePort() .. \", Local address: \" .. a_Link:GetLocalIP() .. \":\" .. a_Link:GetLocalPort())\n\t\t\tLOG(\"Sending HTTP request for front page.\")\n\t\t\ta_Link:StartTLSClient()\n\t\t\ta_Link:Send(\"GET / HTTP/1.0\\r\\nHost: \" .. Host .. \"\\r\\n\\r\\n\")\n\t\tend,\n\n\t\tOnError = function (a_Link, a_ErrorCode, a_ErrorMsg)\n\t\t\tLOG(\"Connection to \" .. Host .. \":\" .. Port .. \" failed: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\tend,\n\n\t\tOnReceivedData = function (a_Link, a_Data)\n\t\t\tLOG(\"Received data from \" .. Host .. \":\" .. Port .. \":\\r\\n\" .. a_Data)\n\t\tend,\n\n\t\tOnRemoteClosed = function (a_Link)\n\t\t\tLOG(\"Connection to \" .. Host .. \":\" .. Port .. \" was closed by the remote peer.\")\n\t\tend\n\t}\n\n\t-- Queue a connect request:\n\tlocal res = cNetwork:Connect(Host, Port, Callbacks)\n\tif not(res) then\n\t\tLOGWARNING(\"cNetwork:Connect call failed immediately\")\n\t\treturn true\n\tend\n\n\treturn true, \"SSL Client connection request queued.\"\nend\n\n\n\n\n\nfunction HandleConsoleNetUdpClose(a_Split)\n\t-- Get the port to close:\n\tlocal Port = tonumber(a_Split[4] or 1024)\n\tif not(Port) then\n\t\treturn true, \"Bad port number: \\\"\" .. a_Split[4] .. \"\\\".\"\n\tend\n\n\t-- Close the server, if there is one:\n\tif not(g_UDPEndpoints[Port]) then\n\t\treturn true, \"There is no UDP endpoint currently listening on port \" .. Port .. \".\"\n\tend\n\tg_UDPEndpoints[Port]:Close()\n\tg_UDPEndpoints[Port] = nil\n\treturn true, \"UDP Port \" .. Port .. \" closed.\"\nend\n\n\n\n\n\nfunction HandleConsoleNetUdpListen(a_Split)\n\t-- Get the params:\n\tlocal Port = tonumber(a_Split[4] or 1024)\n\tif not(Port) then\n\t\treturn true, \"Invalid port: \\\"\" .. a_Split[4] .. \"\\\".\"\n\tend\n\t\n\tlocal Callbacks =\n\t{\n\t\tOnReceivedData = function (a_Endpoint, a_Data, a_RemotePeer, a_RemotePort)\n\t\t\tLOG(\"Incoming UDP datagram from \" .. a_RemotePeer .. \" port \" .. a_RemotePort .. \":\\r\\n\" .. a_Data)\n\t\tend,\n\t\t\n\t\tOnError = function (a_Endpoint, a_ErrorCode, a_ErrorMsg)\n\t\t\tLOG(\"Error in UDP endpoint: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\tend,\n\t}\n\t\n\tg_UDPEndpoints[Port] = cNetwork:CreateUDPEndpoint(Port, Callbacks)\n\treturn true, \"UDP listener on port \" .. Port .. \" started.\"\nend\n\n\n\n\n\nfunction HandleConsoleNetUdpSend(a_Split)\n\t-- Get the params:\n\tlocal Host = a_Split[4] or \"localhost\"\n\tlocal Port = tonumber(a_Split[5] or 1024)\n\tif not(Port) then\n\t\treturn true, \"Invalid port: \\\"\" .. a_Split[5] .. \"\\\".\"\n\tend\n\tlocal Message\n\tif (a_Split[6]) then\n\t\tMessage = table.concat(a_Split, \" \", 6)\n\telse\n\t\tMessage = \"hello\"\n\tend\n\t\n\t-- Define minimum callbacks for the UDP endpoint:\n\tlocal Callbacks =\n\t{\n\t\tOnError = function (a_Endpoint, a_ErrorCode, a_ErrorMsg)\n\t\t\tLOG(\"Error in UDP datagram sending: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\tend,\n\t\t\n\t\tOnReceivedData = function ()\n\t\t\t-- ignore\n\t\tend,\n\t}\n\t\n\t-- Send the data:\n\tlocal Endpoint = cNetwork:CreateUDPEndpoint(0, Callbacks)\n\tEndpoint:EnableBroadcasts()\n\tif not(Endpoint:Send(Message, Host, Port)) then\n\t\tEndpoint:Close()\n\t\treturn true, \"Sending UDP datagram failed\"\n\tend\n\tEndpoint:Close()\n\treturn true, \"UDP datagram sent\"\nend\n\n\n\n\n\nfunction HandleConsoleNetWasc(a_Split)\n\tlocal Callbacks =\n\t{\n\t\tOnConnected = function (a_Link)\n\t\t\tLOG(\"Connected to webadmin, starting TLS...\")\n\t\t\tlocal res, msg = a_Link:StartTLSClient(\"\", \"\", \"\")\n\t\t\tif not(res) then\n\t\t\t\tLOG(\"Failed to start TLS client: \" .. msg)\n\t\t\t\treturn\n\t\t\tend\n\t\t\t-- We need to send a keep-alive due to #1737\n\t\t\ta_Link:Send(\"GET / HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: keep-alive\\r\\n\\r\\n\")\n\t\tend,\n\t\t\n\t\tOnError = function (a_Link, a_ErrorCode, a_ErrorMsg)\n\t\t\tLOG(\"Connection to webadmin failed: \" .. a_ErrorCode .. \" (\" .. a_ErrorMsg .. \")\")\n\t\tend,\n\t\t\n\t\tOnReceivedData = function (a_Link, a_Data)\n\t\t\tLOG(\"Received data from webadmin:\\r\\n\" .. a_Data)\n\t\t\t\n\t\t\t-- Close the link once all the data is received:\n\t\t\tif (a_Data == \"0\\r\\n\\r\\n\") then  -- Poor man's end-of-data detection; works on localhost\n\t\t\t\t-- TODO: The Close() method is not yet exported to Lua\n\t\t\t\t-- a_Link:Close()\n\t\t\tend\n\t\tend,\n\t\t\n\t\tOnRemoteClosed = function (a_Link)\n\t\t\tLOG(\"Connection to webadmin was closed\")\n\t\tend,\n\t}\n\t\n\tif not(cNetwork:Connect(\"localhost\", \"8080\", Callbacks)) then\n\t\tLOG(\"Canot connect to webadmin\")\n\tend\n\t\n\treturn true\nend\n\n\n\n\n"
  },
  {
    "path": "Server/Plugins/NetworkTest/splashes.txt",
    "content": "As seen on TV!\nAwesome!\n100% pure!\nMay contain nuts!\nBetter than Prey!\nMore polygons!\nSexy!\nLimited edition!\nFlashing letters!\nMade by Notch!\nIt's here!\nBest in class!\nIt's finished!\nKind of dragon free!\nExcitement!\nMore than 500 sold!\nOne of a kind!\nHeaps of hits on YouTube!\nIndev!\nSpiders everywhere!\nCheck it out!\nHoly cow, man!\nIt's a game!\nMade in Sweden!\nUses LWJGL!\nReticulating splines!\nMinecraft!\nYaaay!\nSingleplayer!\nKeyboard compatible!\nUndocumented!\nIngots!\nExploding creepers!\nThat's no moon!\nl33t!\nCreate!\nSurvive!\nDungeon!\nExclusive!\nThe bee's knees!\nDown with O.P.P.!\nClosed source!\nClassy!\nWow!\nNot on steam!\nOh man!\nAwesome community!\nPixels!\nTeetsuuuuoooo!\nKaaneeeedaaaa!\nNow with difficulty!\nEnhanced!\n90% bug free!\nPretty!\n12 herbs and spices!\nFat free!\nAbsolutely no memes!\nFree dental!\nAsk your doctor!\nMinors welcome!\nCloud computing!\nLegal in Finland!\nHard to label!\nTechnically good!\nBringing home the bacon!\nIndie!\nGOTY!\nCeci n'est pas une title screen!\nEuclidian!\nNow in 3D!\nInspirational!\nHerregud!\nComplex cellular automata!\nYes, sir!\nPlayed by cowboys!\nOpenGL 2.1 (if supported)!\nThousands of colors!\nTry it!\nAge of Wonders is better!\nTry the mushroom stew!\nSensational!\nHot tamale, hot hot tamale!\nPlay him off, keyboard cat!\nGuaranteed!\nMacroscopic!\nBring it on!\nRandom splash!\nCall your mother!\nMonster infighting!\nLoved by millions!\nUltimate edition!\nFreaky!\nYou've got a brand new key!\nWater proof!\nUninflammable!\nWhoa, dude!\nAll inclusive!\nTell your friends!\nNP is not in P!\nNotch <3 ez!\nMusic by C418!\nLivestreamed!\nHaunted!\nPolynomial!\nTerrestrial!\nAll is full of love!\nFull of stars!\nScientific!\nCooler than Spock!\nCollaborate and listen!\nNever dig down!\nTake frequent breaks!\nNot linear!\nHan shot first!\nNice to meet you!\nBuckets of lava!\nRide the pig!\nLarger than Earth!\nsqrt(-1) love you!\nPhobos anomaly!\nPunching wood!\nFalling off cliffs!\n0% sugar!\n150% hyperbole!\nSynecdoche!\nLet's danec!\nSeecret Friday update!\nReference implementation!\nLewd with two dudes with food!\nKiss the sky!\n20 GOTO 10!\nVerlet intregration!\nPeter Griffin!\nDo not distribute!\nCogito ergo sum!\n4815162342 lines of code!\nA skeleton popped out!\nThe Work of Notch!\nThe sum of its parts!\nBTAF used to be good!\nI miss ADOM!\numop-apisdn!\nOICU812!\nBring me Ray Cokes!\nFinger-licking!\nThematic!\nPneumatic!\nSublime!\nOctagonal!\nUne baguette!\nGargamel plays it!\nRita is the new top dog!\nSWM forever!\nRepresenting Edsbyn!\nMatt Damon!\nSupercalifragilisticexpialidocious!\nConsummate V's!\nCow Tools!\nDouble buffered!\nFan fiction!\nFlaxkikare!\nJason! Jason! Jason!\nHotter than the sun!\nInternet enabled!\nAutonomous!\nEngage!\nFantasy!\nDRR! DRR! DRR!\nKick it root down!\nRegional resources!\nWoo, facepunch!\nWoo, somethingawful!\nWoo, /v/!\nWoo, tigsource!\nWoo, minecraftforum!\nWoo, worldofminecraft!\nWoo, reddit!\nWoo, 2pp!\nGoogle anlyticsed!\nNow supports åäö!\nGive us Gordon!\nTip your waiter!\nVery fun!\n12345 is a bad password!\nVote for net neutrality!\nLives in a pineapple under the sea!\nMAP11 has two names!\nOmnipotent!\nGasp!\n...!\nBees, bees, bees, bees!\nJag känner en bot!\nThis text is hard to read if you play the game at the default resolution, but at 1080p it's fine!\nHaha, LOL!\nHampsterdance!\nSwitches and ores!\nMenger sponge!\nidspispopd!\nEple (original edit)!\nSo fresh, so clean!\nSlow acting portals!\nTry the Nether!\nDon't look directly at the bugs!\nOh, ok, Pigmen!\nFinally with ladders!\nScary!\nPlay Minecraft, Watch Topgear, Get Pig!\nTwittered about!\nJump up, jump up, and get down!\nJoel is neat!\nA riddle, wrapped in a mystery!\nHuge tracts of land!\nWelcome to your Doom!\nStay a while, stay forever!\nStay a while and listen!\nTreatment for your rash!\n\"Autological\" is!\nInformation wants to be free!\n\"Almost never\" is an interesting concept!\nLots of truthiness!\nThe creeper is a spy!\nTuring complete!\nIt's groundbreaking!\nLet our battle's begin!\nThe sky is the limit!\nJeb has amazing hair!\nRyan also has amazing hair!\nCasual gaming!\nUndefeated!\nKinda like Lemmings!\nFollow the train, CJ!\nLeveraging synergy!\nThis message will never appear on the splash screen, isn't that weird?\nDungeonQuest is unfair!\n110813!\n90210!\nCheck out the far lands!\nTyrion would love it!\nAlso try VVVVVV!\nAlso try Super Meat Boy!\nAlso try Terraria!\nAlso try Mount And Blade!\nAlso try Project Zomboid!\nAlso try World of Goo!\nAlso try Limbo!\nAlso try Pixeljunk Shooter!\nAlso try Braid!\nThat's super!\nBread is pain!\nRead more books!\nKhaaaaaaaaan!\nLess addictive than TV Tropes!\nMore addictive than lemonade!\nBigger than a bread box!\nMillions of peaches!\nFnord!\nThis is my true form!\nTotally forgot about Dre!\nDon't bother with the clones!\nPumpkinhead!\nHobo humping slobo babe!\nMade by Jeb!\nHas an ending!\nFinally complete!\nFeature packed!\nBoots with the fur!\nStop, hammertime!\nTestificates!\nConventional!\nHomeomorphic to a 3-sphere!\nDoesn't avoid double negatives!\nPlace ALL the blocks!\nDoes barrel rolls!\nMeeting expectations!\nPC gaming since 1873!\nGhoughpteighbteau tchoghs!\nDéjà vu!\nDéjà vu!\nGot your nose!\nHaley loves Elan!\nAfraid of the big, black bat!\nDoesn't use the U-word!\nChild's play!\nSee you next Friday or so!\nFrom the streets of Södermalm!\n150 bpm for 400000 minutes!\nTechnologic!\nFunk soul brother!\nPumpa kungen!\n日本ハロー！\n한국 안녕하세요!\nHelo Cymru!\nCześć Polsko!\n你好中国！\nПривет Россия!\nΓεια σου Ελλάδα!\nMy life for Aiur!\nLennart lennart = new Lennart();\nI see your vocabulary has improved!\nWho put it there?\nYou can't explain that!\nif not ok then return end\n§1C§2o§3l§4o§5r§6m§7a§8t§9i§ac\n§kFUNKY LOL\nSOPA means LOSER in Swedish!\nBig Pointy Teeth!\nBekarton guards the gate!\nMmmph, mmph!\nDon't feed avocados to parrots!\nSwords for everyone!\nPlz reply to my tweet!\n.party()!\nTake her pillow!\nPut that cookie down!\nPretty scary!\nI have a suggestion.\nNow with extra hugs!\nNow Java 6!\nWoah.\nHURNERJSGER?\nWhat's up, Doc?\nNow contains 32 random daily cats!\nThat's Numberwang!\npls rt\nDo you want to join my server?\nPut a little fence around it!\nThrow a blanket over it!\nOne day, somewhere in the future, my work will be quoted!\nNow with additional stuff!\nExtra things!\nYay, puppies for everyone!\nSo sweet, like a nice bon bon!\nPopping tags!\nVery influential in its circle!\nNow With Multiplayer!\nRise from your grave!\nWarning! A huge battleship \"STEVE\" is approaching fast!\nBlue warrior shot the food!\nRun, coward! I hunger!\nFlavor with no seasoning!\nStrange, but not a stranger!\nTougher than diamonds, rich like cream!\nGetting ready to show!\nGetting ready to know!\nGetting ready to drop!\nGetting ready to shock!\nGetting ready to freak!\nGetting ready to speak!\nIt swings, it jives!\nCruising streets for gold!\nTake an eggbeater and beat it against a skillet!\nMake me a table, a funky table!\nTake the elevator to the mezzanine!\nStop being reasonable, this is the Internet!\n/give @a hugs 64\nThis is good for Realms.\nAny computer is a laptop if you're brave enough!"
  },
  {
    "path": "Server/Plugins/TestLuaRocks/TestLuaRocks.lua",
    "content": "\n-- TestLuaRocks.lua\n\n-- This is a mockup plugin that does a quick test of LuaRocks capability in Cuberite\n\n-- \"Success\" is when the plugin loads, downloads the forum webpage and displays the headers and length and then displays both libs as loaded.\n-- \"Failure\" usually manifests as one of the \"require\" lines failing, although you have the luarock installed.\n-- Note that the plugin deliberately never fully loads, so that it can be reloaded fast by pressing its Enable button in the webadmin's plugin list.\n\n\n\n\n\n\nlocal log30 = require(\"30log\");\nlocal socket = require(\"socket\");\nlocal http = require(\"socket.http\");\n\n\n\n\n\nLOGINFO(\"Trying to download a webpage...\")\nlocal body, code, headers = http.request('https://forum.cuberite.org/')\nLOG(\"code: \" .. tostring(code))\nLOG(\"headers: \")\nfor k, v in pairs(headers or {}) do\n\tLOG(\"  \" .. k .. \": \" .. v)\nend\nLOG(\"body length: \" .. string.len(body))\n\n\n\n\n\nfunction Initialize(a_Plugin)\n\tif (socket == nil) then\n\t\tLOGWARNING(\"LuaSocket not found\")\n\telse\n\t\tLOG(\"LuaSocket loaded\")\n\tend\n\tif (log30 == nil) then\n\t\tLOGWARNING(\"30log not found\")\n\telse\n\t\tLOG(\"30log loaded\")\n\tend\n\tLOGINFO(\"Reload plugin from console or webadmin to rerun tests.\")\n\treturn false\nend\n"
  },
  {
    "path": "Server/Prefabs/PieceStructures/NetherFort.cubeset",
    "content": "\n-- NetherFort.cubeset\n\n-- Defines the prefabs in the group NetherFort\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-30 13:45:43\",\n\t\t[\"GridSizeX\"] = \"512\",\n\t\t[\"GridSizeZ\"] = \"512\",\n\t\t[\"IntendedUse\"] = \"PieceStructures\",\n\t\t[\"MaxDepth\"] = \"12\",\n\t\t[\"MaxOffsetX\"] = \"128\",\n\t\t[\"MaxOffsetZ\"] = \"128\",\n\t\t[\"MaxStructureSizeX\"] = \"384\",\n\t\t[\"MaxStructureSizeZ\"] = \"384\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeFunnelDown\",\n\t\t\t\tName         = \"Nether 0\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"0\",\n\t\t\t\tID           = \"2\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 12,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 21,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 4,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"5\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"e: 44:14\",  -- stone_slab\n\t\t\t\t\"f:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  9\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 10\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  9\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 10\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmcaaadmmmmm\",  --  8\n\t\t\t\t\"mmmmmcaaadmmmmm\",  --  9\n\t\t\t\t\"mmmmmcaaadmmmmm\",  -- 10\n\t\t\t\t\"mmmmmcaaadmmmmm\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  7\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  8\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  9\n\t\t\t\t\"mmmmmaaaaammmmm\",  -- 10\n\t\t\t\t\"mmmmmaaaaammmmm\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmcbbbbbdmmmm\",  --  6\n\t\t\t\t\"mmmmaaaaaaammmm\",  --  7\n\t\t\t\t\"mmmma.....ammmm\",  --  8\n\t\t\t\t\"mmmmaa...aammmm\",  --  9\n\t\t\t\t\"mmmmma...ammmmm\",  -- 10\n\t\t\t\t\"mmmmma...ammmmm\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aadmmmmmmmmmcaa\",  --  1\n\t\t\t\t\"aadmmmmmmmmmcaa\",  --  2\n\t\t\t\t\"aadmmmmmmmmmcaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmcbbbbbbbdmmm\",  --  5\n\t\t\t\t\"mmmaaaaaaaaaamm\",  --  6\n\t\t\t\t\"mmma.......ammm\",  --  7\n\t\t\t\t\"mmmaa.....aammm\",  --  8\n\t\t\t\t\"mmmmam...mammmm\",  --  9\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 10\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaademmmmmecaaa\",  --  1\n\t\t\t\t\"aaademmmmmecaaa\",  --  2\n\t\t\t\t\"aaademmmmmecaaa\",  --  3\n\t\t\t\t\"mmaaabbbbbaaaam\",  --  4\n\t\t\t\t\"mmaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"mma.........amm\",  --  6\n\t\t\t\t\"mmaa.......aamm\",  --  7\n\t\t\t\t\"mmmam.....mammm\",  --  8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  9\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 10\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 11\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"faaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"ma...........am\",  --  5\n\t\t\t\t\"maa.........aam\",  --  6\n\t\t\t\t\"mmam.......mamm\",  --  7\n\t\t\t\t\"mmmmm.....mmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"a.............a\",  --  4\n\t\t\t\t\"aa...........aa\",  --  5\n\t\t\t\t\"mam.........mam\",  --  6\n\t\t\t\t\"mmmm.......mmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"a.............a\",  --  4\n\t\t\t\t\"am............a\",  --  5\n\t\t\t\t\"mmm.........mmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"m.............m\",  --  4\n\t\t\t\t\"mm............m\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"m.............m\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t},\n\t\t},  -- BridgeFunnelDown\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"DarkCorridor\",\n\t\t\t\tName         = \"Nether 3\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"3\",\n\t\t\t\tID           = \"30\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aabaaaaaaaabaa\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"aabaaaaaaaabaa\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aabaaaaaaaabaa\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"aabaaaaaaaabaa\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aabaaaaaaaabaa\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"aabaaaaaaaabaa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"cccccccccccccc\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"dddddddddddddd\",  --  4\n\n\t\t\t},\n\t\t},  -- DarkCorridor\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Turret\",\n\t\t\t\tName         = \"Nether 7\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"7\",\n\t\t\t\tID           = \"34\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 16,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"-99\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aa...aa\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aa...aa\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aa...aa\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aabbbaa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"b.....b\",  --  2\n\t\t\t\t\"b.....b\",  --  3\n\t\t\t\t\"b.....b\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aabbbaa\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"a.....a\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"a.....a\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- Turret\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"StairsToOpen2\",\n\t\t\t\tName         = \"Nether 8\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"8\",\n\t\t\t\tID           = \"35\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 10,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 19,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"1:0|3:0|5:0|7:0|9:0|11:0|13:0|15:0\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"a.....a\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"a.....a\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"b.....b\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"b.....b\",  --  4\n\t\t\t\t\"a.aaaaa\",  --  5\n\t\t\t\t\"aabaaba\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"b.....b\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"b.....b\",  --  4\n\t\t\t\t\"a..aaaa\",  --  5\n\t\t\t\t\"aabaaba\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aabbbaa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"b.....b\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"b.....b\",  --  4\n\t\t\t\t\"a...aaa\",  --  5\n\t\t\t\t\"aabaaba\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"a.....a\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"a.....a\",  --  4\n\t\t\t\t\"a....aa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"......a\",  --  2\n\t\t\t\t\"......a\",  --  3\n\t\t\t\t\"......a\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"m.....m\",  --  1\n\t\t\t\t\"......m\",  --  2\n\t\t\t\t\"......m\",  --  3\n\t\t\t\t\"......m\",  --  4\n\t\t\t\t\"m.....m\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"m.....m\",  --  1\n\t\t\t\t\"......m\",  --  2\n\t\t\t\t\"......m\",  --  3\n\t\t\t\t\"......m\",  --  4\n\t\t\t\t\"m.....m\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t},\n\t\t},  -- StairsToOpen2\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CorridorCorner5\",\n\t\t\t\tName         = \"Nether 10\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"10\",\n\t\t\t\tID           = \"40\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 6,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaammmmmm\",  --  5\n\t\t\t\t\"aaaaammmmmm\",  --  6\n\t\t\t\t\"aaaaammmmmm\",  --  7\n\t\t\t\t\"aaaaammmmmm\",  --  8\n\t\t\t\t\"aaaaammmmmm\",  --  9\n\t\t\t\t\"aaaaammmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..........\",  --  1\n\t\t\t\t\"a..........\",  --  2\n\t\t\t\t\"a..........\",  --  3\n\t\t\t\t\"a...aaaaaaa\",  --  4\n\t\t\t\t\"a...ammmmmm\",  --  5\n\t\t\t\t\"a...ammmmmm\",  --  6\n\t\t\t\t\"a...ammmmmm\",  --  7\n\t\t\t\t\"a...ammmmmm\",  --  8\n\t\t\t\t\"a...ammmmmm\",  --  9\n\t\t\t\t\"a...ammmmmm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"abababababa\",  --  0\n\t\t\t\t\"b..........\",  --  1\n\t\t\t\t\"a..........\",  --  2\n\t\t\t\t\"b..........\",  --  3\n\t\t\t\t\"a...abababa\",  --  4\n\t\t\t\t\"b...bmmmmmm\",  --  5\n\t\t\t\t\"a...ammmmmm\",  --  6\n\t\t\t\t\"b...bmmmmmm\",  --  7\n\t\t\t\t\"a...ammmmmm\",  --  8\n\t\t\t\t\"b...bmmmmmm\",  --  9\n\t\t\t\t\"a...ammmmmm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"abababababa\",  --  0\n\t\t\t\t\"b..........\",  --  1\n\t\t\t\t\"a..........\",  --  2\n\t\t\t\t\"b..........\",  --  3\n\t\t\t\t\"a...abababa\",  --  4\n\t\t\t\t\"b...bmmmmmm\",  --  5\n\t\t\t\t\"a...ammmmmm\",  --  6\n\t\t\t\t\"b...bmmmmmm\",  --  7\n\t\t\t\t\"a...ammmmmm\",  --  8\n\t\t\t\t\"b...bmmmmmm\",  --  9\n\t\t\t\t\"a...ammmmmm\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"abababababa\",  --  0\n\t\t\t\t\"b..........\",  --  1\n\t\t\t\t\"a..........\",  --  2\n\t\t\t\t\"b..........\",  --  3\n\t\t\t\t\"a...abababa\",  --  4\n\t\t\t\t\"b...bmmmmmm\",  --  5\n\t\t\t\t\"a...ammmmmm\",  --  6\n\t\t\t\t\"b...bmmmmmm\",  --  7\n\t\t\t\t\"a...ammmmmm\",  --  8\n\t\t\t\t\"b...bmmmmmm\",  --  9\n\t\t\t\t\"a...ammmmmm\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ccccccccccc\",  --  0\n\t\t\t\t\"daaaaaaaaaa\",  --  1\n\t\t\t\t\"daaaaaaaaaa\",  --  2\n\t\t\t\t\"daaaaaaaaaa\",  --  3\n\t\t\t\t\"daaaeeeeeee\",  --  4\n\t\t\t\t\"daaafmmmmmm\",  --  5\n\t\t\t\t\"daaafmmmmmm\",  --  6\n\t\t\t\t\"daaafmmmmmm\",  --  7\n\t\t\t\t\"daaafmmmmmm\",  --  8\n\t\t\t\t\"daaafmmmmmm\",  --  9\n\t\t\t\t\"daaafmmmmmm\",  -- 10\n\n\t\t\t},\n\t\t},  -- CorridorCorner5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CorridorStairs\",\n\t\t\t\tName         = \"Nether 12\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"12\",\n\t\t\t\tID           = \"42\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 13,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 8,\n\t\t\t\tMaxY = 12,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"1000\",\n\t\t\t\t[\"DepthWeight\"] = \"0:0|2:0|4:0|6:0|8:0|10:0|12:0|14:0|16:0|18:0\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"c:113: 0\",  -- netherbrickfence\n\t\t\t\t\"d:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaa\",  --  0\n\t\t\t\t\".baaaaaaa\",  --  1\n\t\t\t\t\".baaaaaaa\",  --  2\n\t\t\t\t\".baaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"acaaaaaaa\",  --  0\n\t\t\t\t\"..baaaaaa\",  --  1\n\t\t\t\t\"..baaaaaa\",  --  2\n\t\t\t\t\"..baaaaaa\",  --  3\n\t\t\t\t\"acaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"acaaaaaaa\",  --  0\n\t\t\t\t\"...baaaaa\",  --  1\n\t\t\t\t\"...baaaaa\",  --  2\n\t\t\t\t\"...baaaaa\",  --  3\n\t\t\t\t\"acaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"acacaaaaa\",  --  0\n\t\t\t\t\"....baaaa\",  --  1\n\t\t\t\t\"....baaaa\",  --  2\n\t\t\t\t\"....baaaa\",  --  3\n\t\t\t\t\"acacaaaaa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaacaaaaa\",  --  0\n\t\t\t\t\".....baaa\",  --  1\n\t\t\t\t\".....baaa\",  --  2\n\t\t\t\t\".....baaa\",  --  3\n\t\t\t\t\"aaacaaaaa\",  --  4\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"daacacaaa\",  --  0\n\t\t\t\t\"a.....baa\",  --  1\n\t\t\t\t\"a.....baa\",  --  2\n\t\t\t\t\"a.....baa\",  --  3\n\t\t\t\t\"eaacacaaa\",  --  4\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mdaaacaaa\",  --  0\n\t\t\t\t\"ma.....ba\",  --  1\n\t\t\t\t\"ma.....ba\",  --  2\n\t\t\t\t\"ma.....ba\",  --  3\n\t\t\t\t\"meaaacaaa\",  --  4\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmdaacaca\",  --  0\n\t\t\t\t\"mma......\",  --  1\n\t\t\t\t\"mma......\",  --  2\n\t\t\t\t\"mma......\",  --  3\n\t\t\t\t\"mmeaacaca\",  --  4\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmdaaaca\",  --  0\n\t\t\t\t\"mmma.....\",  --  1\n\t\t\t\t\"mmma.....\",  --  2\n\t\t\t\t\"mmma.....\",  --  3\n\t\t\t\t\"mmmeaaaca\",  --  4\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmdaaca\",  --  0\n\t\t\t\t\"mmmma....\",  --  1\n\t\t\t\t\"mmmma....\",  --  2\n\t\t\t\t\"mmmma....\",  --  3\n\t\t\t\t\"mmmmeaaca\",  --  4\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmdaaa\",  --  0\n\t\t\t\t\"mmmmma...\",  --  1\n\t\t\t\t\"mmmmma...\",  --  2\n\t\t\t\t\"mmmmma...\",  --  3\n\t\t\t\t\"mmmmmeaaa\",  --  4\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmddd\",  --  0\n\t\t\t\t\"mmmmmmaaa\",  --  1\n\t\t\t\t\"mmmmmmaaa\",  --  2\n\t\t\t\t\"mmmmmmaaa\",  --  3\n\t\t\t\t\"mmmmmmeee\",  --  4\n\n\t\t\t},\n\t\t},  -- CorridorStairs\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeSegment\",\n\t\t\t\tName         = \"Nether 16\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"16\",\n\t\t\t\tID           = \"158\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 8,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 17,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"1000\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"500\",\n\t\t\t\t[\"DepthWeight\"] = \"4:-3000|8:-3000|12:-3000|16:-3000|20:-3000\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"d: 44:14\",  -- stone_slab\n\t\t\t\t\"e:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aabmmmmmmmmmcaa\",  --  1\n\t\t\t\t\"aabmmmmmmmmmcaa\",  --  2\n\t\t\t\t\"aabmmmmmmmmmcaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaabdmmmmmdcaaa\",  --  1\n\t\t\t\t\"aaabdmmmmmdcaaa\",  --  2\n\t\t\t\t\"aaabdmmmmmdcaaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"eeeeeeeeeeeeeee\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"fffffffffffffff\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\n\t\t\t},\n\t\t},  -- BridgeSegment\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeCrossing\",\n\t\t\t\tName         = \"Nether 17\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"17\",\n\t\t\t\tID           = \"159\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 8,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 17,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"1:1000\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"f: 44:14\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  6\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  7\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 13\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  1\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"aacmmmmmmmmmdaa\",  --  6\n\t\t\t\t\"aacmmmmmmmmmdaa\",  --  7\n\t\t\t\t\"aacmmmmmmmmmdaa\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmeeemmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 13\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  1\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"aaacfmmmmmfdaaa\",  --  6\n\t\t\t\t\"aaacfmmmmmfdaaa\",  --  7\n\t\t\t\t\"aaacfmmmmmfdaaa\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmeeemmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 12\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 13\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmdaaacmmmmm\",  --  0\n\t\t\t\t\"mmmmmdaaacmmmmm\",  --  1\n\t\t\t\t\"mmmmmdaaacmmmmm\",  --  2\n\t\t\t\t\"mmmmmdaaacmmmmm\",  --  3\n\t\t\t\t\"mmmmmdaaacmmmmm\",  --  4\n\t\t\t\t\"eeeeeeaaaeeeeee\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"bbbbbdaaacbbbbb\",  --  9\n\t\t\t\t\"mmmmmdaaacmmmmm\",  -- 10\n\t\t\t\t\"mmmmmdaaacmmmmm\",  -- 11\n\t\t\t\t\"mmmmmdaaacmmmmm\",  -- 12\n\t\t\t\t\"mmmmmdaaacmmmmm\",  -- 13\n\t\t\t\t\"mmmmmdaaacmmmmm\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  0\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  1\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  2\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  3\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"mmmmmaaaaammmmm\",  -- 10\n\t\t\t\t\"mmmmmaaaaammmmm\",  -- 11\n\t\t\t\t\"mmmmmaaaaammmmm\",  -- 12\n\t\t\t\t\"mmmmmaaaaammmmm\",  -- 13\n\t\t\t\t\"mmmmmaaaaammmmm\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmma...ammmmm\",  --  0\n\t\t\t\t\"mmmmma...ammmmm\",  --  1\n\t\t\t\t\"mmmmma...ammmmm\",  --  2\n\t\t\t\t\"mmmmma...ammmmm\",  --  3\n\t\t\t\t\"mmmmma...ammmmm\",  --  4\n\t\t\t\t\"aaaaaa...aaaaaa\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"aaaaaa...aaaaaa\",  --  9\n\t\t\t\t\"mmmmma...ammmmm\",  -- 10\n\t\t\t\t\"mmmmma...ammmmm\",  -- 11\n\t\t\t\t\"mmmmma...ammmmm\",  -- 12\n\t\t\t\t\"mmmmma...ammmmm\",  -- 13\n\t\t\t\t\"mmmmma...ammmmm\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  1\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  2\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  3\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  4\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  9\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 10\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 11\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 12\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 13\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  1\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  2\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  3\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  4\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  9\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 10\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 11\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 12\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 13\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 14\n\n\t\t\t},\n\t\t},  -- BridgeCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeCrumble2\",\n\t\t\t\tName         = \"Nether 18\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"18\",\n\t\t\t\tID           = \"160\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"1:0|2:0|3:0|4:0|5:0\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"c: 44:14\",  -- stone_slab\n\t\t\t\t\"d:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmm\",  --  1\n\t\t\t\t\"aammmmmmmmmmm\",  --  2\n\t\t\t\t\"aammmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aabmmmmmmmmmm\",  --  1\n\t\t\t\t\"aabmmmmmmmmmm\",  --  2\n\t\t\t\t\"aabmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaabcmmmmmmmm\",  --  1\n\t\t\t\t\"aaabcmmmmmmmm\",  --  2\n\t\t\t\t\"aaabcmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"dddddddddmmmm\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaammmm\",  --  2\n\t\t\t\t\"aaaaaaaaaaaam\",  --  3\n\t\t\t\t\"eeeeeeeeemmmm\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaaaaaam\",  --  0\n\t\t\t\t\"aaaaaaaaaammm\",  --  1\n\t\t\t\t\"aaaaaaaaaaamm\",  --  2\n\t\t\t\t\"aaaaaaaaammmm\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaammmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"aaaaaaaaaammm\",  --  4\n\n\t\t\t},\n\t\t},  -- BridgeCrumble2\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeCrumble1\",\n\t\t\t\tName         = \"Nether 19\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"19\",\n\t\t\t\tID           = \"161\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 8,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"1:0|2:0|3:0|4:0|5:0\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"c: 44:14\",  -- stone_slab\n\t\t\t\t\"d:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmm\",  --  1\n\t\t\t\t\"aammmmmmm\",  --  2\n\t\t\t\t\"aammmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmm\",  --  0\n\t\t\t\t\"aabmmmmmm\",  --  1\n\t\t\t\t\"aabmmmmmm\",  --  2\n\t\t\t\t\"aabmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmm\",  --  0\n\t\t\t\t\"aaabcmmmm\",  --  1\n\t\t\t\t\"aaabcmmmm\",  --  2\n\t\t\t\t\"aaabcmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmm\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"dddddddmm\",  --  0\n\t\t\t\t\"aaaaaaaam\",  --  1\n\t\t\t\t\"aaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaamm\",  --  3\n\t\t\t\t\"eeeeemmmm\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaammmm\",  --  1\n\t\t\t\t\"aaaaaammm\",  --  2\n\t\t\t\t\"aaaaaammm\",  --  3\n\t\t\t\t\"aaaaaaaam\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaammm\",  --  0\n\t\t\t\t\"mmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmm\",  --  3\n\t\t\t\t\"aaaaaaamm\",  --  4\n\n\t\t\t},\n\t\t},  -- BridgeCrumble1\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BlazePlatformOverhang\",\n\t\t\t\tName         = \"Nether 20\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"20\",\n\t\t\t\tID           = \"162\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 11,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 20,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"1:0|2:0|3:0|4:0|5:0\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"c: 44:14\",  -- stone_slab\n\t\t\t\t\"d:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"g:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"h:113: 0\",  -- netherbrickfence\n\t\t\t\t\"i: 52: 0\",  -- mobspawner\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"aammmmmmmmmmmm\",  --  2\n\t\t\t\t\"aammmmmmmmmmmm\",  --  3\n\t\t\t\t\"aammmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"aabcmmmmmmmmmm\",  --  2\n\t\t\t\t\"aabcmmmmmmmmmm\",  --  3\n\t\t\t\t\"aabcmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"aaaaabmmmmmmmm\",  --  2\n\t\t\t\t\"aaaaabmmmmmmmm\",  --  3\n\t\t\t\t\"aaaaabmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"dddddddmmmmmmm\",  --  1\n\t\t\t\t\"aaaaaabmmmmmmm\",  --  2\n\t\t\t\t\"aaaaaabmmmmmmm\",  --  3\n\t\t\t\t\"aaaaaabmmmmmmm\",  --  4\n\t\t\t\t\"eeeeeeemmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaaaaaadmmmmmm\",  --  1\n\t\t\t\t\"aaaaaaabmmmmmm\",  --  2\n\t\t\t\t\"aaaaaaabmmmmmm\",  --  3\n\t\t\t\t\"aaaaaaabmmmmmm\",  --  4\n\t\t\t\t\"aaaaaaaemmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaaaaaaabddddm\",  --  1\n\t\t\t\t\"......faaaaabm\",  --  2\n\t\t\t\t\"......faaaaabm\",  --  3\n\t\t\t\t\"......faaaaabm\",  --  4\n\t\t\t\t\"aaaaaaaaabeebm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmgdddbm\",  --  0\n\t\t\t\t\"mmmmmmaaaaaaad\",  --  1\n\t\t\t\t\".......faaaaab\",  --  2\n\t\t\t\t\".......faaaaab\",  --  3\n\t\t\t\t\".......faaaaab\",  --  4\n\t\t\t\t\"mmmmmmaaaaaaae\",  --  5\n\t\t\t\t\"mmmmmmmmgeeebm\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmaaaaam\",  --  0\n\t\t\t\t\"mmmmmmhaa...aa\",  --  1\n\t\t\t\t\".............a\",  --  2\n\t\t\t\t\"..........i..a\",  --  3\n\t\t\t\t\".............a\",  --  4\n\t\t\t\t\"mmmmmmhaa...aa\",  --  5\n\t\t\t\t\"mmmmmmmmaaaaam\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmhhhhhm\",  --  0\n\t\t\t\t\"mmmmmmhhh...hh\",  --  1\n\t\t\t\t\"mm...........h\",  --  2\n\t\t\t\t\"mm...........h\",  --  3\n\t\t\t\t\"mm...........h\",  --  4\n\t\t\t\t\"mmmmmmhhh...hh\",  --  5\n\t\t\t\t\"mmmmmmmmhhhhhm\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmm.....m\",  --  0\n\t\t\t\t\"mmmmmm........\",  --  1\n\t\t\t\t\"mmmm..........\",  --  2\n\t\t\t\t\"mmmm..........\",  --  3\n\t\t\t\t\"mmmm..........\",  --  4\n\t\t\t\t\"mmmmmm........\",  --  5\n\t\t\t\t\"mmmmmmmm.....m\",  --  6\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmm.....m\",  --  0\n\t\t\t\t\"mmmmmm........\",  --  1\n\t\t\t\t\"mmmmmm........\",  --  2\n\t\t\t\t\"mmmmmm........\",  --  3\n\t\t\t\t\"mmmmmm........\",  --  4\n\t\t\t\t\"mmmmmm........\",  --  5\n\t\t\t\t\"mmmmmmmm.....m\",  --  6\n\n\t\t\t},\n\t\t},  -- BlazePlatformOverhang\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CentralRoom\",\n\t\t\t\tName         = \"Nether 22\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"22\",\n\t\t\t\tID           = \"164\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 9,\n\t\t\t\tz = 13,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 12,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 12,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 12,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"Range|40|100\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b: 10: 0\",  -- lava\n\t\t\t\t\"c:113: 0\",  -- netherbrickfence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaa...aaaaa\",  --  0\n\t\t\t\t\"aaaaa...aaaaa\",  --  1\n\t\t\t\t\"aa.........aa\",  --  2\n\t\t\t\t\"aa.........aa\",  --  3\n\t\t\t\t\"aa.........aa\",  --  4\n\t\t\t\t\"aa...aaa...aa\",  --  5\n\t\t\t\t\"aa...aba...aa\",  --  6\n\t\t\t\t\"aa...aaa...aa\",  --  7\n\t\t\t\t\"aa.........aa\",  --  8\n\t\t\t\t\"aa.........aa\",  --  9\n\t\t\t\t\"aa.........aa\",  -- 10\n\t\t\t\t\"aaaaa...aaaaa\",  -- 11\n\t\t\t\t\"aaaaa...aaaaa\",  -- 12\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaaa...aaaaa\",  --  0\n\t\t\t\t\"aaaca...acaaa\",  --  1\n\t\t\t\t\"aa.........aa\",  --  2\n\t\t\t\t\"ac.........ca\",  --  3\n\t\t\t\t\"aa.........aa\",  --  4\n\t\t\t\t\"ac.........ca\",  --  5\n\t\t\t\t\"aa.........aa\",  --  6\n\t\t\t\t\"ac.........ca\",  --  7\n\t\t\t\t\"aa.........aa\",  --  8\n\t\t\t\t\"ac.........ca\",  --  9\n\t\t\t\t\"aa.........aa\",  -- 10\n\t\t\t\t\"aaaca...acaaa\",  -- 11\n\t\t\t\t\"aaaaa...aaaaa\",  -- 12\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aaaaa...aaaaa\",  --  0\n\t\t\t\t\"aaaca...acaaa\",  --  1\n\t\t\t\t\"aa.........aa\",  --  2\n\t\t\t\t\"ac.........ca\",  --  3\n\t\t\t\t\"aa.........aa\",  --  4\n\t\t\t\t\"ac.........ca\",  --  5\n\t\t\t\t\"aa.........aa\",  --  6\n\t\t\t\t\"ac.........ca\",  --  7\n\t\t\t\t\"aa.........aa\",  --  8\n\t\t\t\t\"ac.........ca\",  --  9\n\t\t\t\t\"aa.........aa\",  -- 10\n\t\t\t\t\"aaaca...acaaa\",  -- 11\n\t\t\t\t\"aaaaa...aaaaa\",  -- 12\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"acacacccacaca\",  --  0\n\t\t\t\t\"caaaa...aaaac\",  --  1\n\t\t\t\t\"aa.........aa\",  --  2\n\t\t\t\t\"ca.........ac\",  --  3\n\t\t\t\t\"aa.........aa\",  --  4\n\t\t\t\t\"ca.........ac\",  --  5\n\t\t\t\t\"aa.........aa\",  --  6\n\t\t\t\t\"ca.........ac\",  --  7\n\t\t\t\t\"aa.........aa\",  --  8\n\t\t\t\t\"ca.........ac\",  --  9\n\t\t\t\t\"aa.........aa\",  -- 10\n\t\t\t\t\"caaaa...aaaac\",  -- 11\n\t\t\t\t\"acaca...acaca\",  -- 12\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"acacaaaaacaca\",  --  0\n\t\t\t\t\"caaaaaaaaaaac\",  --  1\n\t\t\t\t\"aa.........aa\",  --  2\n\t\t\t\t\"ca.........ac\",  --  3\n\t\t\t\t\"aa.........aa\",  --  4\n\t\t\t\t\"ca.........ac\",  --  5\n\t\t\t\t\"aa.........aa\",  --  6\n\t\t\t\t\"ca.........ac\",  --  7\n\t\t\t\t\"aa.........aa\",  --  8\n\t\t\t\t\"ca.........ac\",  --  9\n\t\t\t\t\"aa.........aa\",  -- 10\n\t\t\t\t\"caaaaaaaaaaac\",  -- 11\n\t\t\t\t\"acacaaaaacaca\",  -- 12\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"cacacacacacac\",  --  0\n\t\t\t\t\"a...........a\",  --  1\n\t\t\t\t\"c...........c\",  --  2\n\t\t\t\t\"a...........a\",  --  3\n\t\t\t\t\"c...........c\",  --  4\n\t\t\t\t\"a...........a\",  --  5\n\t\t\t\t\"c...........c\",  --  6\n\t\t\t\t\"a...........a\",  --  7\n\t\t\t\t\"c...........c\",  --  8\n\t\t\t\t\"a...........a\",  --  9\n\t\t\t\t\"c...........c\",  -- 10\n\t\t\t\t\"a...........a\",  -- 11\n\t\t\t\t\"cacacacacacac\",  -- 12\n\n\t\t\t},\n\t\t},  -- CentralRoom\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MidStaircase\",\n\t\t\t\tName         = \"Nether 23\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"23\",\n\t\t\t\tID           = \"165\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 8,\n\t\t\t\tz = 13,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 12,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"-1000\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b: 88: 0\",  -- soulsand\n\t\t\t\t\"c:115: 3\",  -- 115\n\t\t\t\t\"d:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"g:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"h: 10: 0\",  -- lava\n\t\t\t\t\"i:113: 0\",  -- netherbrickfence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaabbbbbaaaa\",  --  3\n\t\t\t\t\"aaaabbbbbaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaabbbbbaaaa\",  --  8\n\t\t\t\t\"aaaabbbbbaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaacccccaaaa\",  --  3\n\t\t\t\t\"addecccccfdda\",  --  4\n\t\t\t\t\"...eaaaaad...\",  --  5\n\t\t\t\t\"...eaaaaa....\",  --  6\n\t\t\t\t\"...eaaaaag...\",  --  7\n\t\t\t\t\"agggcccccfgga\",  --  8\n\t\t\t\t\"aaaacccccaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aha.......aha\",  --  1\n\t\t\t\t\"aaa.......aaa\",  --  2\n\t\t\t\t\"a...........a\",  --  3\n\t\t\t\t\"a...........a\",  --  4\n\t\t\t\t\"....eaaaa....\",  --  5\n\t\t\t\t\"....eaaaa....\",  --  6\n\t\t\t\t\"....eaaaa....\",  --  7\n\t\t\t\t\"a...........a\",  --  8\n\t\t\t\t\"a...........a\",  --  9\n\t\t\t\t\"aaa.......aaa\",  -- 10\n\t\t\t\t\"aha.......aha\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aaaiiaaaiiaaa\",  --  0\n\t\t\t\t\"a...........a\",  --  1\n\t\t\t\t\"a...........a\",  --  2\n\t\t\t\t\"a...........a\",  --  3\n\t\t\t\t\"a...........a\",  --  4\n\t\t\t\t\".....eaaa....\",  --  5\n\t\t\t\t\".....eaaa....\",  --  6\n\t\t\t\t\".....eaaa....\",  --  7\n\t\t\t\t\"a...........a\",  --  8\n\t\t\t\t\"a...........a\",  --  9\n\t\t\t\t\"a...........a\",  -- 10\n\t\t\t\t\"a...........a\",  -- 11\n\t\t\t\t\"aaaiiaaaiiaaa\",  -- 12\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaiiaaaiiaaa\",  --  0\n\t\t\t\t\"a...........a\",  --  1\n\t\t\t\t\"a...........a\",  --  2\n\t\t\t\t\"a...........a\",  --  3\n\t\t\t\t\"a...........a\",  --  4\n\t\t\t\t\"......eaa....\",  --  5\n\t\t\t\t\"......eaa....\",  --  6\n\t\t\t\t\"......eaa....\",  --  7\n\t\t\t\t\"a...........a\",  --  8\n\t\t\t\t\"a...........a\",  --  9\n\t\t\t\t\"a...........a\",  -- 10\n\t\t\t\t\"a...........a\",  -- 11\n\t\t\t\t\"aaaiiaaaiiaaa\",  -- 12\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a...........a\",  --  1\n\t\t\t\t\"a...........a\",  --  2\n\t\t\t\t\"a...........a\",  --  3\n\t\t\t\t\"a...........a\",  --  4\n\t\t\t\t\"a......ea...a\",  --  5\n\t\t\t\t\"a......ea...a\",  --  6\n\t\t\t\t\"a......ea...a\",  --  7\n\t\t\t\t\"a...........a\",  --  8\n\t\t\t\t\"a...........a\",  --  9\n\t\t\t\t\"a...........a\",  -- 10\n\t\t\t\t\"a...........a\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaa....eaaaa\",  --  5\n\t\t\t\t\"aaaa....eaaaa\",  --  6\n\t\t\t\t\"aaaa....eaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"iaiaiaiaiaiai\",  --  0\n\t\t\t\t\"a...........a\",  --  1\n\t\t\t\t\"i...........i\",  --  2\n\t\t\t\t\"a...........a\",  --  3\n\t\t\t\t\"i...........i\",  --  4\n\t\t\t\t\"a...........a\",  --  5\n\t\t\t\t\"i...........i\",  --  6\n\t\t\t\t\"a...........a\",  --  7\n\t\t\t\t\"i...........i\",  --  8\n\t\t\t\t\"a...........a\",  --  9\n\t\t\t\t\"i...........i\",  -- 10\n\t\t\t\t\"a...........a\",  -- 11\n\t\t\t\t\"iaiaiaiaiaiai\",  -- 12\n\n\t\t\t},\n\t\t},  -- MidStaircase\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BlazePlatform\",\n\t\t\t\tName         = \"Nether 26\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"26\",\n\t\t\t\tID           = \"276\",\n\t\t\t\tCreatorName  = \"tonibm1999\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"1:0|2:0|3:0|4:0|5:0\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b: 52: 0\",  -- mobspawner\n\t\t\t\t\"c:113: 0\",  -- netherbrickfence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmm\",  --  0\n\t\t\t\t\"aaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaa\",  --  5\n\t\t\t\t\"mmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmm\",  --  0\n\t\t\t\t\"aaaaaaaaaa\",  --  1\n\t\t\t\t\"..aaaaaaaa\",  --  2\n\t\t\t\t\"..aaaaaaaa\",  --  3\n\t\t\t\t\"..aaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaa\",  --  5\n\t\t\t\t\"mmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaa\",  --  1\n\t\t\t\t\"...aaaaaaa\",  --  2\n\t\t\t\t\"...aaaaaaa\",  --  3\n\t\t\t\t\"...aaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaa\",  --  5\n\t\t\t\t\"mmmmaaaaaa\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmaaaaaa\",  --  0\n\t\t\t\t\"mmaaa....a\",  --  1\n\t\t\t\t\".........a\",  --  2\n\t\t\t\t\"......b..a\",  --  3\n\t\t\t\t\".........a\",  --  4\n\t\t\t\t\"mmaaa....a\",  --  5\n\t\t\t\t\"mmmmaaaaaa\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmcccccc\",  --  0\n\t\t\t\t\"mmmcc....c\",  --  1\n\t\t\t\t\".........c\",  --  2\n\t\t\t\t\".........c\",  --  3\n\t\t\t\t\".........c\",  --  4\n\t\t\t\t\"mmmcc....c\",  --  5\n\t\t\t\t\"mmmmcccccc\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmm....c\",  --  1\n\t\t\t\t\"m........c\",  --  2\n\t\t\t\t\"m........c\",  --  3\n\t\t\t\t\"m........c\",  --  4\n\t\t\t\t\"mmmmm....c\",  --  5\n\t\t\t\t\"mmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmm....m\",  --  1\n\t\t\t\t\"mm.......c\",  --  2\n\t\t\t\t\"mm.......c\",  --  3\n\t\t\t\t\"mm.......c\",  --  4\n\t\t\t\t\"mmmmm....m\",  --  5\n\t\t\t\t\"mmmmmmmmmm\",  --  6\n\n\t\t\t},\n\t\t},  -- BlazePlatform\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"StairsToOpen1\",\n\t\t\t\tName         = \"Nether 27\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"27\",\n\t\t\t\tID           = \"277\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 10,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 19,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"1:0|3:0|5:0|7:0|9:0|11:0|13:0|15:0\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"a.....a\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"a.....a\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"b.....b\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"b.....b\",  --  4\n\t\t\t\t\"a.aaaaa\",  --  5\n\t\t\t\t\"aabaaba\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aa...aa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"b.....b\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"b.....b\",  --  4\n\t\t\t\t\"a..aaaa\",  --  5\n\t\t\t\t\"aabaaba\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aabbbaa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"b.....b\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"b.....b\",  --  4\n\t\t\t\t\"a...aaa\",  --  5\n\t\t\t\t\"aabaaba\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"a.....a\",  --  2\n\t\t\t\t\"a.....a\",  --  3\n\t\t\t\t\"a.....a\",  --  4\n\t\t\t\t\"a....aa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"a.....a\",  --  1\n\t\t\t\t\"a......\",  --  2\n\t\t\t\t\"a......\",  --  3\n\t\t\t\t\"a......\",  --  4\n\t\t\t\t\"a.....a\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"m.....m\",  --  1\n\t\t\t\t\"m......\",  --  2\n\t\t\t\t\"m......\",  --  3\n\t\t\t\t\"m......\",  --  4\n\t\t\t\t\"m.....m\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"m.....m\",  --  1\n\t\t\t\t\"m......\",  --  2\n\t\t\t\t\"m......\",  --  3\n\t\t\t\t\"m......\",  --  4\n\t\t\t\t\"m.....m\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t},\n\t\t},  -- StairsToOpen1\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LavaStaircase\",\n\t\t\t\tName         = \"Nether 28\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"28\",\n\t\t\t\tID           = \"278\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 11,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 10,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 6,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 6,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c: 10: 0\",  -- lava\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaa...aaaa\",  --  0\n\t\t\t\t\"aaaaa.........a\",  --  1\n\t\t\t\t\"aaaaa.........a\",  --  2\n\t\t\t\t\"aaaaab........a\",  --  3\n\t\t\t\t\"accca...aaaa..a\",  --  4\n\t\t\t\t\"accca...acca..a\",  --  5\n\t\t\t\t\"acccaaaaacca..a\",  --  6\n\t\t\t\t\"acccccccccca..a\",  --  7\n\t\t\t\t\"acccaaaaacca..a\",  --  8\n\t\t\t\t\"accca...acca..a\",  --  9\n\t\t\t\t\"accca...aaaa..a\",  -- 10\n\t\t\t\t\"aaaaab........a\",  -- 11\n\t\t\t\t\"aaaaa.........a\",  -- 12\n\t\t\t\t\"aaaaa.........a\",  -- 13\n\t\t\t\t\"aaaaaaaa...aaaa\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaaaaaa...aaaa\",  --  0\n\t\t\t\t\"aaaa..........a\",  --  1\n\t\t\t\t\"aaaa..........a\",  --  2\n\t\t\t\t\"aaaabb........a\",  --  3\n\t\t\t\t\"aaaa..........a\",  --  4\n\t\t\t\t\"a.............a\",  --  5\n\t\t\t\t\"a.............a\",  --  6\n\t\t\t\t\"a.............a\",  --  7\n\t\t\t\t\"a.............a\",  --  8\n\t\t\t\t\"a.............a\",  --  9\n\t\t\t\t\"aaaa..........a\",  -- 10\n\t\t\t\t\"aaaabb........a\",  -- 11\n\t\t\t\t\"aaaa..........a\",  -- 12\n\t\t\t\t\"aaaa..........a\",  -- 13\n\t\t\t\t\"aaaaaaaa...aaaa\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aaaaaaaa...aaaa\",  --  0\n\t\t\t\t\"a.............a\",  --  1\n\t\t\t\t\"a.............a\",  --  2\n\t\t\t\t\"a..bb.........a\",  --  3\n\t\t\t\t\"aaaa..........a\",  --  4\n\t\t\t\t\"aaaa..........a\",  --  5\n\t\t\t\t\"a.............a\",  --  6\n\t\t\t\t\"a.............a\",  --  7\n\t\t\t\t\"a.............a\",  --  8\n\t\t\t\t\"aaaa..........a\",  --  9\n\t\t\t\t\"aaaa..........a\",  -- 10\n\t\t\t\t\"a..bb.........a\",  -- 11\n\t\t\t\t\"a.............a\",  -- 12\n\t\t\t\t\"a.............a\",  -- 13\n\t\t\t\t\"aaaaaaaa...aaaa\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaa...aaaa\",  --  0\n\t\t\t\t\"a.............a\",  --  1\n\t\t\t\t\"a.............a\",  --  2\n\t\t\t\t\"a..b..........a\",  --  3\n\t\t\t\t\"a..b..........a\",  --  4\n\t\t\t\t\"aaaa..........a\",  --  5\n\t\t\t\t\"aaaa..........a\",  --  6\n\t\t\t\t\"a.............a\",  --  7\n\t\t\t\t\"aaaa..........a\",  --  8\n\t\t\t\t\"aaaa..........a\",  --  9\n\t\t\t\t\"a..b..........a\",  -- 10\n\t\t\t\t\"a..b..........a\",  -- 11\n\t\t\t\t\"a.............a\",  -- 12\n\t\t\t\t\"a.............a\",  -- 13\n\t\t\t\t\"aaaaaaaa...aaaa\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a.............a\",  --  1\n\t\t\t\t\"a.............a\",  --  2\n\t\t\t\t\"a.............a\",  --  3\n\t\t\t\t\"a..b..........a\",  --  4\n\t\t\t\t\"a..b..........a\",  --  5\n\t\t\t\t\"aaaa..........a\",  --  6\n\t\t\t\t\"aaaa..........a\",  --  7\n\t\t\t\t\"aaaa..........a\",  --  8\n\t\t\t\t\"a..b..........a\",  --  9\n\t\t\t\t\"a..b..........a\",  -- 10\n\t\t\t\t\"a.............a\",  -- 11\n\t\t\t\t\"a.............a\",  -- 12\n\t\t\t\t\"a.............a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a.............a\",  --  1\n\t\t\t\t\"a.............a\",  --  2\n\t\t\t\t\"a.............a\",  --  3\n\t\t\t\t\"a.............a\",  --  4\n\t\t\t\t\"a..b..........a\",  --  5\n\t\t\t\t\"...b..........a\",  --  6\n\t\t\t\t\"...b..........a\",  --  7\n\t\t\t\t\"...b..........a\",  --  8\n\t\t\t\t\"a..b..........a\",  --  9\n\t\t\t\t\"a.............a\",  -- 10\n\t\t\t\t\"a.............a\",  -- 11\n\t\t\t\t\"a.............a\",  -- 12\n\t\t\t\t\"a.............a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"aababababababaa\",  --  0\n\t\t\t\t\"a.............a\",  --  1\n\t\t\t\t\"b.............b\",  --  2\n\t\t\t\t\"a.............a\",  --  3\n\t\t\t\t\"b.............b\",  --  4\n\t\t\t\t\"a.............a\",  --  5\n\t\t\t\t\"..............b\",  --  6\n\t\t\t\t\"..............a\",  --  7\n\t\t\t\t\"..............b\",  --  8\n\t\t\t\t\"a.............a\",  --  9\n\t\t\t\t\"b.............b\",  -- 10\n\t\t\t\t\"a.............a\",  -- 11\n\t\t\t\t\"b.............b\",  -- 12\n\t\t\t\t\"a.............a\",  -- 13\n\t\t\t\t\"aababababababaa\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"aababababababaa\",  --  0\n\t\t\t\t\"a.............a\",  --  1\n\t\t\t\t\"b.............b\",  --  2\n\t\t\t\t\"a.............a\",  --  3\n\t\t\t\t\"b.............b\",  --  4\n\t\t\t\t\"a.............a\",  --  5\n\t\t\t\t\"..............b\",  --  6\n\t\t\t\t\"..............a\",  --  7\n\t\t\t\t\"..............b\",  --  8\n\t\t\t\t\"a.............a\",  --  9\n\t\t\t\t\"b.............b\",  -- 10\n\t\t\t\t\"a.............a\",  -- 11\n\t\t\t\t\"b.............b\",  -- 12\n\t\t\t\t\"a.............a\",  -- 13\n\t\t\t\t\"aababababababaa\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"aababababababaa\",  --  0\n\t\t\t\t\"a.............a\",  --  1\n\t\t\t\t\"b.............b\",  --  2\n\t\t\t\t\"a.............a\",  --  3\n\t\t\t\t\"b.............b\",  --  4\n\t\t\t\t\"a.............a\",  --  5\n\t\t\t\t\"..............b\",  --  6\n\t\t\t\t\"..............a\",  --  7\n\t\t\t\t\"..............b\",  --  8\n\t\t\t\t\"a.............a\",  --  9\n\t\t\t\t\"b.............b\",  -- 10\n\t\t\t\t\"a.............a\",  -- 11\n\t\t\t\t\"b.............b\",  -- 12\n\t\t\t\t\"a.............a\",  -- 13\n\t\t\t\t\"aababababababaa\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t},\n\t\t},  -- LavaStaircase\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LavaStairsBridge\",\n\t\t\t\tName         = \"Nether 30\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"30\",\n\t\t\t\tID           = \"281\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 12,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 11,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 6,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 6,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c: 10: 0\",  -- lava\n\t\t\t\t\"d:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"g: 44:14\",  -- stone_slab\n\t\t\t\t\"h:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"i: 44: 6\",  -- stone_slab\n\t\t\t\t\"j:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaa...aaaaa\",  --  0\n\t\t\t\t\"aaaaa..........a\",  --  1\n\t\t\t\t\"aaaaa..........a\",  --  2\n\t\t\t\t\"aaaaab.........a\",  --  3\n\t\t\t\t\"accca...ddd.aaaa\",  --  4\n\t\t\t\t\"accca...aaa.acca\",  --  5\n\t\t\t\t\"acccaaaaaaaaacca\",  --  6\n\t\t\t\t\"acccccccccccccca\",  --  7\n\t\t\t\t\"acccaaaaaaaaacca\",  --  8\n\t\t\t\t\"accca...aaa.acca\",  --  9\n\t\t\t\t\"accca...eee.aaaa\",  -- 10\n\t\t\t\t\"aaaaab.........a\",  -- 11\n\t\t\t\t\"aaaaa..........a\",  -- 12\n\t\t\t\t\"aaaaa..........a\",  -- 13\n\t\t\t\t\"aaaaaaaa...aaaaa\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaaaaaa...aaaaa\",  --  0\n\t\t\t\t\"aaaa...........a\",  --  1\n\t\t\t\t\"aaaa...........a\",  --  2\n\t\t\t\t\"aaaabb.........a\",  --  3\n\t\t\t\t\"aaaa........b..a\",  --  4\n\t\t\t\t\"a.......ddd....a\",  --  5\n\t\t\t\t\"a.......fff....a\",  --  6\n\t\t\t\t\"a.......ggg....a\",  --  7\n\t\t\t\t\"a.......hhh....a\",  --  8\n\t\t\t\t\"a.......eee....a\",  --  9\n\t\t\t\t\"aaaa........b..a\",  -- 10\n\t\t\t\t\"aaaabb.........a\",  -- 11\n\t\t\t\t\"aaaa...........a\",  -- 12\n\t\t\t\t\"aaaa...........a\",  -- 13\n\t\t\t\t\"aaaaaaaa...aaaaa\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aaaaaaaa...aaaaa\",  --  0\n\t\t\t\t\"a..............a\",  --  1\n\t\t\t\t\"a..............a\",  --  2\n\t\t\t\t\"a..bb..........a\",  --  3\n\t\t\t\t\"aaaa........b..a\",  --  4\n\t\t\t\t\"aaaa...........a\",  --  5\n\t\t\t\t\"a..............a\",  --  6\n\t\t\t\t\"a..............a\",  --  7\n\t\t\t\t\"a..............a\",  --  8\n\t\t\t\t\"aaaa...........a\",  --  9\n\t\t\t\t\"aaaa........b..a\",  -- 10\n\t\t\t\t\"a..bb..........a\",  -- 11\n\t\t\t\t\"a..............a\",  -- 12\n\t\t\t\t\"a..............a\",  -- 13\n\t\t\t\t\"aaaaaaaa...aaaaa\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaabbbaaaaa\",  --  0\n\t\t\t\t\"a..............a\",  --  1\n\t\t\t\t\"a..............a\",  --  2\n\t\t\t\t\"a..b...........a\",  --  3\n\t\t\t\t\"a..b........b..a\",  --  4\n\t\t\t\t\"aaaa...........a\",  --  5\n\t\t\t\t\"aaaa...........a\",  --  6\n\t\t\t\t\"a..............a\",  --  7\n\t\t\t\t\"aaaa...........a\",  --  8\n\t\t\t\t\"aaaa...........a\",  --  9\n\t\t\t\t\"a..b........b..a\",  -- 10\n\t\t\t\t\"a..b...........a\",  -- 11\n\t\t\t\t\"a..............a\",  -- 12\n\t\t\t\t\"a..............a\",  -- 13\n\t\t\t\t\"aaaaaaaabbbaaaaa\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..............a\",  --  1\n\t\t\t\t\"a..............a\",  --  2\n\t\t\t\t\"a...........ggga\",  --  3\n\t\t\t\t\"a..b........iija\",  --  4\n\t\t\t\t\"a..b........iija\",  --  5\n\t\t\t\t\"aaaa........iija\",  --  6\n\t\t\t\t\"aaaa........iija\",  --  7\n\t\t\t\t\"aaaa........iija\",  --  8\n\t\t\t\t\"a..b........iija\",  --  9\n\t\t\t\t\"a..b........iija\",  -- 10\n\t\t\t\t\"a...........ggga\",  -- 11\n\t\t\t\t\"a..............a\",  -- 12\n\t\t\t\t\"a..............a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a.............ga\",  --  1\n\t\t\t\t\"a............iia\",  --  2\n\t\t\t\t\"a..............a\",  --  3\n\t\t\t\t\"a..............a\",  --  4\n\t\t\t\t\"a..b...........a\",  --  5\n\t\t\t\t\"...b...........a\",  --  6\n\t\t\t\t\"...b...........a\",  --  7\n\t\t\t\t\"...b...........a\",  --  8\n\t\t\t\t\"a..b...........a\",  --  9\n\t\t\t\t\"a..............a\",  -- 10\n\t\t\t\t\"a..............a\",  -- 11\n\t\t\t\t\"a............iia\",  -- 12\n\t\t\t\t\"a.............ga\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..............a\",  --  1\n\t\t\t\t\"a..............a\",  --  2\n\t\t\t\t\"a..............a\",  --  3\n\t\t\t\t\"a..............a\",  --  4\n\t\t\t\t\"a..............a\",  --  5\n\t\t\t\t\"...............a\",  --  6\n\t\t\t\t\"...............a\",  --  7\n\t\t\t\t\"...............a\",  --  8\n\t\t\t\t\"a..............a\",  --  9\n\t\t\t\t\"a..............a\",  -- 10\n\t\t\t\t\"a..............a\",  -- 11\n\t\t\t\t\"a..............a\",  -- 12\n\t\t\t\t\"a..............a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..............a\",  --  1\n\t\t\t\t\"a..............a\",  --  2\n\t\t\t\t\"a..............a\",  --  3\n\t\t\t\t\"a..............a\",  --  4\n\t\t\t\t\"a..............a\",  --  5\n\t\t\t\t\"...............a\",  --  6\n\t\t\t\t\"...............a\",  --  7\n\t\t\t\t\"...............a\",  --  8\n\t\t\t\t\"a..............a\",  --  9\n\t\t\t\t\"a..............a\",  -- 10\n\t\t\t\t\"a..............a\",  -- 11\n\t\t\t\t\"a..............a\",  -- 12\n\t\t\t\t\"a..............a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..............a\",  --  1\n\t\t\t\t\"a..............a\",  --  2\n\t\t\t\t\"a..............a\",  --  3\n\t\t\t\t\"a..............a\",  --  4\n\t\t\t\t\"a..............a\",  --  5\n\t\t\t\t\"a..............a\",  --  6\n\t\t\t\t\"a..............a\",  --  7\n\t\t\t\t\"a..............a\",  --  8\n\t\t\t\t\"a..............a\",  --  9\n\t\t\t\t\"a..............a\",  -- 10\n\t\t\t\t\"a..............a\",  -- 11\n\t\t\t\t\"a..............a\",  -- 12\n\t\t\t\t\"a..............a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"abbaabbaabbaabba\",  --  0\n\t\t\t\t\"b..............b\",  --  1\n\t\t\t\t\"a..............a\",  --  2\n\t\t\t\t\"b..............b\",  --  3\n\t\t\t\t\"a..............a\",  --  4\n\t\t\t\t\"b..............b\",  --  5\n\t\t\t\t\"a..............a\",  --  6\n\t\t\t\t\"b..............b\",  --  7\n\t\t\t\t\"a..............a\",  --  8\n\t\t\t\t\"b..............b\",  --  9\n\t\t\t\t\"a..............a\",  -- 10\n\t\t\t\t\"b..............b\",  -- 11\n\t\t\t\t\"a..............a\",  -- 12\n\t\t\t\t\"b..............b\",  -- 13\n\t\t\t\t\"abbaabbaabbaabba\",  -- 14\n\n\t\t\t},\n\t\t},  -- LavaStairsBridge\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LavaStaircaseBig\",\n\t\t\t\tName         = \"Nether 31\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"31\",\n\t\t\t\tID           = \"282\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 15,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 14,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 11,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 11,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"-1000\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b: 10: 0\",  -- lava\n\t\t\t\t\"c:113: 0\",  -- netherbrickfence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaa\",  --  3\n\t\t\t\t\"abbbbbaaaaaa\",  --  4\n\t\t\t\t\"abbbbbbaaaaa\",  --  5\n\t\t\t\t\"abbbbbba....\",  --  6\n\t\t\t\t\"abbbbbba....\",  --  7\n\t\t\t\t\"abbbbbba....\",  --  8\n\t\t\t\t\"abbbbbbaaaaa\",  --  9\n\t\t\t\t\"abbbbb.aaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaa\",  --  3\n\t\t\t\t\"abbbbbaaaaaa\",  --  4\n\t\t\t\t\"abbbbbba...a\",  --  5\n\t\t\t\t\"abbbbbba....\",  --  6\n\t\t\t\t\"abbbbbba....\",  --  7\n\t\t\t\t\"abbbbbba....\",  --  8\n\t\t\t\t\"abbbbbba...a\",  --  9\n\t\t\t\t\"abbbbb.aaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaa\",  --  3\n\t\t\t\t\"abbbbbaa...a\",  --  4\n\t\t\t\t\"abbbbbba...a\",  --  5\n\t\t\t\t\"abbbbbba....\",  --  6\n\t\t\t\t\"abbbbbba....\",  --  7\n\t\t\t\t\"abbbbbba....\",  --  8\n\t\t\t\t\"abbbbbba...a\",  --  9\n\t\t\t\t\"abbbbbaa...a\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaa......a\",  --  1\n\t\t\t\t\"aaaaa......a\",  --  2\n\t\t\t\t\"aaaaacc....a\",  --  3\n\t\t\t\t\"a.....cc...a\",  --  4\n\t\t\t\t\"a......c...a\",  --  5\n\t\t\t\t\"a......c...a\",  --  6\n\t\t\t\t\"a......c...a\",  --  7\n\t\t\t\t\"a......c...a\",  --  8\n\t\t\t\t\"a......c...a\",  --  9\n\t\t\t\t\"a.....cc...a\",  -- 10\n\t\t\t\t\"aaaaacc....a\",  -- 11\n\t\t\t\t\"aaaaa......a\",  -- 12\n\t\t\t\t\"aaaaa......a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaa.......a\",  --  1\n\t\t\t\t\"aaaa.......a\",  --  2\n\t\t\t\t\"aaaacc.....a\",  --  3\n\t\t\t\t\"aaaa.......a\",  --  4\n\t\t\t\t\"a..........a\",  --  5\n\t\t\t\t\"a..........a\",  --  6\n\t\t\t\t\"a..........a\",  --  7\n\t\t\t\t\"a..........a\",  --  8\n\t\t\t\t\"a..........a\",  --  9\n\t\t\t\t\"aaaa.......a\",  -- 10\n\t\t\t\t\"aaaacc.....a\",  -- 11\n\t\t\t\t\"aaaa.......a\",  -- 12\n\t\t\t\t\"aaaa.......a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..........a\",  --  1\n\t\t\t\t\"a..........a\",  --  2\n\t\t\t\t\"a..cc......a\",  --  3\n\t\t\t\t\"aaaa.......a\",  --  4\n\t\t\t\t\"aaaa.......a\",  --  5\n\t\t\t\t\"a..........a\",  --  6\n\t\t\t\t\"a..........a\",  --  7\n\t\t\t\t\"a..........a\",  --  8\n\t\t\t\t\"aaaa.......a\",  --  9\n\t\t\t\t\"aaaa.......a\",  -- 10\n\t\t\t\t\"a..cc......a\",  -- 11\n\t\t\t\t\"a..........a\",  -- 12\n\t\t\t\t\"a..........a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..........a\",  --  1\n\t\t\t\t\"a..........a\",  --  2\n\t\t\t\t\"a..c.......a\",  --  3\n\t\t\t\t\"a..c.......a\",  --  4\n\t\t\t\t\"aaaa.......a\",  --  5\n\t\t\t\t\"aaaa.......a\",  --  6\n\t\t\t\t\"a..........a\",  --  7\n\t\t\t\t\"aaaa.......a\",  --  8\n\t\t\t\t\"aaaa.......a\",  --  9\n\t\t\t\t\"a..c.......a\",  -- 10\n\t\t\t\t\"a..c.......a\",  -- 11\n\t\t\t\t\"a..........a\",  -- 12\n\t\t\t\t\"a..........a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..........a\",  --  1\n\t\t\t\t\"a..........a\",  --  2\n\t\t\t\t\"a..........a\",  --  3\n\t\t\t\t\"a..c.......a\",  --  4\n\t\t\t\t\"a..c.......a\",  --  5\n\t\t\t\t\"aaaa.......a\",  --  6\n\t\t\t\t\"aaaa.......a\",  --  7\n\t\t\t\t\"aaaa.......a\",  --  8\n\t\t\t\t\"a..c.......a\",  --  9\n\t\t\t\t\"a..c.......a\",  -- 10\n\t\t\t\t\"a..........a\",  -- 11\n\t\t\t\t\"a..........a\",  -- 12\n\t\t\t\t\"a..........a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..........a\",  --  1\n\t\t\t\t\"a..........a\",  --  2\n\t\t\t\t\"a..........a\",  --  3\n\t\t\t\t\"a..........a\",  --  4\n\t\t\t\t\"a..c.......a\",  --  5\n\t\t\t\t\"...c.......a\",  --  6\n\t\t\t\t\"...c.......a\",  --  7\n\t\t\t\t\"...c.......a\",  --  8\n\t\t\t\t\"a..c.......a\",  --  9\n\t\t\t\t\"a..........a\",  -- 10\n\t\t\t\t\"a..........a\",  -- 11\n\t\t\t\t\"a..........a\",  -- 12\n\t\t\t\t\"a..........a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..........a\",  --  1\n\t\t\t\t\"a..........a\",  --  2\n\t\t\t\t\"a..........a\",  --  3\n\t\t\t\t\"a..........a\",  --  4\n\t\t\t\t\"a..........a\",  --  5\n\t\t\t\t\"...........a\",  --  6\n\t\t\t\t\"...........a\",  --  7\n\t\t\t\t\"...........a\",  --  8\n\t\t\t\t\"a..........a\",  --  9\n\t\t\t\t\"a..........a\",  -- 10\n\t\t\t\t\"a..........a\",  -- 11\n\t\t\t\t\"a..........a\",  -- 12\n\t\t\t\t\"a..........a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..........a\",  --  1\n\t\t\t\t\"a..........a\",  --  2\n\t\t\t\t\"a..........a\",  --  3\n\t\t\t\t\"a..........a\",  --  4\n\t\t\t\t\"a..........a\",  --  5\n\t\t\t\t\"...........a\",  --  6\n\t\t\t\t\"...........a\",  --  7\n\t\t\t\t\"...........a\",  --  8\n\t\t\t\t\"a..........a\",  --  9\n\t\t\t\t\"a..........a\",  -- 10\n\t\t\t\t\"a..........a\",  -- 11\n\t\t\t\t\"a..........a\",  -- 12\n\t\t\t\t\"a..........a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"a..........a\",  --  1\n\t\t\t\t\"a..........a\",  --  2\n\t\t\t\t\"a..........a\",  --  3\n\t\t\t\t\"a..........a\",  --  4\n\t\t\t\t\"a..........a\",  --  5\n\t\t\t\t\"a..........a\",  --  6\n\t\t\t\t\"a..........a\",  --  7\n\t\t\t\t\"a..........a\",  --  8\n\t\t\t\t\"a..........a\",  --  9\n\t\t\t\t\"a..........a\",  -- 10\n\t\t\t\t\"a..........a\",  -- 11\n\t\t\t\t\"a..........a\",  -- 12\n\t\t\t\t\"a..........a\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"abbbbbbbbbba\",  --  1\n\t\t\t\t\"abbbbbbbbbba\",  --  2\n\t\t\t\t\"abbbbbbbbbba\",  --  3\n\t\t\t\t\"abbbbbbbbbba\",  --  4\n\t\t\t\t\"abbbbbbbbbba\",  --  5\n\t\t\t\t\"abbbbbbbbbba\",  --  6\n\t\t\t\t\"abbbbbbbbbba\",  --  7\n\t\t\t\t\"abbbbbbbbbba\",  --  8\n\t\t\t\t\"abbbbbbbbbba\",  --  9\n\t\t\t\t\"abbbbbbbbbba\",  -- 10\n\t\t\t\t\"abbbbbbbbbba\",  -- 11\n\t\t\t\t\"abbbbbbbbbba\",  -- 12\n\t\t\t\t\"abbbbbbbbbba\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaa\",  -- 14\n\n\t\t\t},\n\t\t},  -- LavaStaircaseBig\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Corridor13\",\n\t\t\t\tName         = \"Nether 35\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"35\",\n\t\t\t\tID           = \"286\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"300\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"ababababababa\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"ababababababa\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"ababababababa\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"ababababababa\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ababababababa\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"ababababababa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ccccccccccccc\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"ddddddddddddd\",  --  4\n\n\t\t\t},\n\t\t},  -- Corridor13\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Corridor11\",\n\t\t\t\tName         = \"Nether 36\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"36\",\n\t\t\t\tID           = \"287\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"300\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaa\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"aaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"abababababa\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"abababababa\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"abababababa\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"abababababa\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"abababababa\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"abababababa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ccccccccccc\",  --  0\n\t\t\t\t\"aaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaa\",  --  3\n\t\t\t\t\"ddddddddddd\",  --  4\n\n\t\t\t},\n\t\t},  -- Corridor11\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BalconyCorridor\",\n\t\t\t\tName         = \"Nether 37\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"37\",\n\t\t\t\tID           = \"288\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 7,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 8,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"e: 44: 6\",  -- stone_slab\n\t\t\t\t\"f:113: 0\",  -- netherbrickfence\n\t\t\t\t\"g:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"h:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"i:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"j:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"mmmmaaaaammmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaa.aaa.aaaa\",  --  4\n\t\t\t\t\"mmbcaaaaacdmm\",  --  5\n\t\t\t\t\"mmmbcccccdmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"aaaa.eee.aaaa\",  --  4\n\t\t\t\t\"mmaaaaaaaaamm\",  --  5\n\t\t\t\t\"mmaaaaaaaaamm\",  --  6\n\t\t\t\t\"mmaaaaaaaaamm\",  --  7\n\t\t\t\t\"mmaaaaaaaaamm\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"afafafafafafa\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"afaa.....aafa\",  --  4\n\t\t\t\t\"mmaaa...aaamm\",  --  5\n\t\t\t\t\"mmf.......fmm\",  --  6\n\t\t\t\t\"mmf.......fmm\",  --  7\n\t\t\t\t\"mmfffffffffmm\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"afafafafafafa\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"afaa.....aafa\",  --  4\n\t\t\t\t\"mmaaa...aaamm\",  --  5\n\t\t\t\t\"mm.........mm\",  --  6\n\t\t\t\t\"mm.........mm\",  --  7\n\t\t\t\t\"mm.........mm\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"afafafafafafa\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"afaa.....aafa\",  --  4\n\t\t\t\t\"mmaaa...aaamm\",  --  5\n\t\t\t\t\"mm.........mm\",  --  6\n\t\t\t\t\"mm.........mm\",  --  7\n\t\t\t\t\"mm.........mm\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"ggggggggggggg\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"hhiaaaaaaahhh\",  --  4\n\t\t\t\t\"mmihhhhhhhjmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  8\n\n\t\t\t},\n\t\t},  -- BalconyCorridor\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BalconyTee2\",\n\t\t\t\tName         = \"Nether 38\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"38\",\n\t\t\t\tID           = \"289\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 7,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"e: 44: 6\",  -- stone_slab\n\t\t\t\t\"f:113: 0\",  -- netherbrickfence\n\t\t\t\t\"g:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"h:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"i:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"j:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaaaammmm\",  --  0\n\t\t\t\t\"mmmmaaaaammmm\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"mmmmaaaaammmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmaaaaammmm\",  --  0\n\t\t\t\t\"mmmmaaaaammmm\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaa.aaa.aaaa\",  --  6\n\t\t\t\t\"mmbcaaaaacdmm\",  --  7\n\t\t\t\t\"mmmbcccccdmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmma...ammmm\",  --  1\n\t\t\t\t\"aaaaa...aaaaa\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"aaaa.eee.aaaa\",  --  6\n\t\t\t\t\"mmaaaaaaaaamm\",  --  7\n\t\t\t\t\"mmaaaaaaaaamm\",  --  8\n\t\t\t\t\"mmaaaaaaaaamm\",  --  9\n\t\t\t\t\"mmaaaaaaaaamm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmf...fmmmm\",  --  1\n\t\t\t\t\"afafa...afafa\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"afaa.....aafa\",  --  6\n\t\t\t\t\"mmaaa...aaamm\",  --  7\n\t\t\t\t\"mmf.......fmm\",  --  8\n\t\t\t\t\"mmf.......fmm\",  --  9\n\t\t\t\t\"mmfffffffffmm\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmf...fmmmm\",  --  1\n\t\t\t\t\"afafa...afafa\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"afaa.....aafa\",  --  6\n\t\t\t\t\"mmaaa...aaamm\",  --  7\n\t\t\t\t\"mm.........mm\",  --  8\n\t\t\t\t\"mm.........mm\",  --  9\n\t\t\t\t\"mm.........mm\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmf...fmmmm\",  --  1\n\t\t\t\t\"afafa...afafa\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"afaa.....aafa\",  --  6\n\t\t\t\t\"mmaaa...aaamm\",  --  7\n\t\t\t\t\"mm.........mm\",  --  8\n\t\t\t\t\"mm.........mm\",  --  9\n\t\t\t\t\"mm.........mm\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmgaaahmmmm\",  --  0\n\t\t\t\t\"mmmmgaaahmmmm\",  --  1\n\t\t\t\t\"iiiiiaaaiiiii\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"jjgaaaaaaajjj\",  --  6\n\t\t\t\t\"mmgjjjjjjjhmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmm\",  -- 10\n\n\t\t\t},\n\t\t},  -- BalconyTee2\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeTee\",\n\t\t\t\tName         = \"Nether 39\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"39\",\n\t\t\t\tID           = \"290\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 8,\n\t\t\t\tz = 10,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 17,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 9,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"1:500\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"e: 44:14\",  -- stone_slab\n\t\t\t\t\"f:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  9\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aabmmmmmmmmmcaa\",  --  1\n\t\t\t\t\"aabmmmmmmmmmcaa\",  --  2\n\t\t\t\t\"aabmmmmmmmmmcaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmdddmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  9\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaabemmmmmecaaa\",  --  1\n\t\t\t\t\"aaabemmmmmecaaa\",  --  2\n\t\t\t\t\"aaabemmmmmecaaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmeeemmmmmm\",  --  5\n\t\t\t\t\"mmmmmmdddmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  9\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"ddddddddddddddd\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"fffffcaaabfffff\",  --  4\n\t\t\t\t\"mmmmmcaaabmmmmm\",  --  5\n\t\t\t\t\"mmmmmcaaabmmmmm\",  --  6\n\t\t\t\t\"mmmmmcaaabmmmmm\",  --  7\n\t\t\t\t\"mmmmmcaaabmmmmm\",  --  8\n\t\t\t\t\"mmmmmcaaabmmmmm\",  --  9\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  5\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  6\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  7\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  8\n\t\t\t\t\"mmmmmaaaaammmmm\",  --  9\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"aaaaaa...aaaaaa\",  --  4\n\t\t\t\t\"mmmmma...ammmmm\",  --  5\n\t\t\t\t\"mmmmma...ammmmm\",  --  6\n\t\t\t\t\"mmmmma...ammmmm\",  --  7\n\t\t\t\t\"mmmmma...ammmmm\",  --  8\n\t\t\t\t\"mmmmma...ammmmm\",  --  9\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  4\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  5\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  6\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  7\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  9\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  4\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  5\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  6\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  7\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  9\n\n\t\t\t},\n\t\t},  -- BridgeTee\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Tee2x4\",\n\t\t\t\tName         = \"Nether 40\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"40\",\n\t\t\t\tID           = \"291\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaaaammmm\",  --  0\n\t\t\t\t\"mmmmaaaaammmm\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmma...ammmm\",  --  1\n\t\t\t\t\"aaaaa...aaaaa\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmb...bmmmm\",  --  1\n\t\t\t\t\"ababa...ababa\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"ababababababa\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmb...bmmmm\",  --  1\n\t\t\t\t\"ababa...ababa\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"ababababababa\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmb...bmmmm\",  --  1\n\t\t\t\t\"ababa...ababa\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"ababababababa\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmcaaadmmmm\",  --  0\n\t\t\t\t\"mmmmcaaadmmmm\",  --  1\n\t\t\t\t\"eeeecaaadeeee\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"fffffffffffff\",  --  6\n\n\t\t\t},\n\t\t},  -- Tee2x4\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Tee4x4\",\n\t\t\t\tName         = \"Nether 41\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"41\",\n\t\t\t\tID           = \"292\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 6,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 8,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaaaammmm\",  --  0\n\t\t\t\t\"mmmmaaaaammmm\",  --  1\n\t\t\t\t\"mmmmaaaaammmm\",  --  2\n\t\t\t\t\"mmmmaaaaammmm\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmma...ammmm\",  --  1\n\t\t\t\t\"mmmma...ammmm\",  --  2\n\t\t\t\t\"mmmma...ammmm\",  --  3\n\t\t\t\t\"aaaaa...aaaaa\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmb...bmmmm\",  --  1\n\t\t\t\t\"mmmma...ammmm\",  --  2\n\t\t\t\t\"mmmmb...bmmmm\",  --  3\n\t\t\t\t\"ababa...ababa\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\"ababababababa\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmb...bmmmm\",  --  1\n\t\t\t\t\"mmmma...ammmm\",  --  2\n\t\t\t\t\"mmmmb...bmmmm\",  --  3\n\t\t\t\t\"ababa...ababa\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\"ababababababa\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmmb...bmmmm\",  --  1\n\t\t\t\t\"mmmma...ammmm\",  --  2\n\t\t\t\t\"mmmmb...bmmmm\",  --  3\n\t\t\t\t\"ababa...ababa\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\"ababababababa\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmcaaadmmmm\",  --  0\n\t\t\t\t\"mmmmcaaadmmmm\",  --  1\n\t\t\t\t\"mmmmcaaadmmmm\",  --  2\n\t\t\t\t\"mmmmcaaadmmmm\",  --  3\n\t\t\t\t\"eeeecaaadeeee\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"fffffffffffff\",  --  8\n\n\t\t\t},\n\t\t},  -- Tee4x4\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CorridorCornerChest5\",\n\t\t\t\tName         = \"Nether 42\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"42\",\n\t\t\t\tID           = \"293\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 6,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b: 54: 5\",  -- chest\n\t\t\t\t\"c:113: 0\",  -- netherbrickfence\n\t\t\t\t\"d:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"g:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaammmmmm\",  --  5\n\t\t\t\t\"aaaaammmmmm\",  --  6\n\t\t\t\t\"aaaaammmmmm\",  --  7\n\t\t\t\t\"aaaaammmmmm\",  --  8\n\t\t\t\t\"aaaaammmmmm\",  --  9\n\t\t\t\t\"aaaaammmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaa\",  --  0\n\t\t\t\t\"ab.........\",  --  1\n\t\t\t\t\"a..........\",  --  2\n\t\t\t\t\"a..........\",  --  3\n\t\t\t\t\"a...aaaaaaa\",  --  4\n\t\t\t\t\"a...ammmmmm\",  --  5\n\t\t\t\t\"a...ammmmmm\",  --  6\n\t\t\t\t\"a...ammmmmm\",  --  7\n\t\t\t\t\"a...ammmmmm\",  --  8\n\t\t\t\t\"a...ammmmmm\",  --  9\n\t\t\t\t\"a...ammmmmm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"acacacacaca\",  --  0\n\t\t\t\t\"c..........\",  --  1\n\t\t\t\t\"a..........\",  --  2\n\t\t\t\t\"c..........\",  --  3\n\t\t\t\t\"a...acacaca\",  --  4\n\t\t\t\t\"c...cmmmmmm\",  --  5\n\t\t\t\t\"a...ammmmmm\",  --  6\n\t\t\t\t\"c...cmmmmmm\",  --  7\n\t\t\t\t\"a...ammmmmm\",  --  8\n\t\t\t\t\"c...cmmmmmm\",  --  9\n\t\t\t\t\"a...ammmmmm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"acacacacaca\",  --  0\n\t\t\t\t\"c..........\",  --  1\n\t\t\t\t\"a..........\",  --  2\n\t\t\t\t\"c..........\",  --  3\n\t\t\t\t\"a...acacaca\",  --  4\n\t\t\t\t\"c...cmmmmmm\",  --  5\n\t\t\t\t\"a...ammmmmm\",  --  6\n\t\t\t\t\"c...cmmmmmm\",  --  7\n\t\t\t\t\"a...ammmmmm\",  --  8\n\t\t\t\t\"c...cmmmmmm\",  --  9\n\t\t\t\t\"a...ammmmmm\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"acacacacaca\",  --  0\n\t\t\t\t\"c..........\",  --  1\n\t\t\t\t\"a..........\",  --  2\n\t\t\t\t\"c..........\",  --  3\n\t\t\t\t\"a...acacaca\",  --  4\n\t\t\t\t\"c...cmmmmmm\",  --  5\n\t\t\t\t\"a...ammmmmm\",  --  6\n\t\t\t\t\"c...cmmmmmm\",  --  7\n\t\t\t\t\"a...ammmmmm\",  --  8\n\t\t\t\t\"c...cmmmmmm\",  --  9\n\t\t\t\t\"a...ammmmmm\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"deeeeeeeeee\",  --  0\n\t\t\t\t\"daaaaaaaaaa\",  --  1\n\t\t\t\t\"daaaaaaaaaa\",  --  2\n\t\t\t\t\"daaaaaaaaaa\",  --  3\n\t\t\t\t\"daaafgggggg\",  --  4\n\t\t\t\t\"daaafmmmmmm\",  --  5\n\t\t\t\t\"daaafmmmmmm\",  --  6\n\t\t\t\t\"daaafmmmmmm\",  --  7\n\t\t\t\t\"daaafmmmmmm\",  --  8\n\t\t\t\t\"daaafmmmmmm\",  --  9\n\t\t\t\t\"daaafmmmmmm\",  -- 10\n\n\t\t\t},\n\t\t},  -- CorridorCornerChest5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeDoubleCrumble\",\n\t\t\t\tName         = \"Nether 46\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"46\",\n\t\t\t\tID           = \"305\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 7,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 16,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 4,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 4,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"1000\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"maaam\",  --  0\n\t\t\t\t\"maaam\",  --  1\n\t\t\t\t\"mmmmm\",  --  2\n\t\t\t\t\"mmmmm\",  --  3\n\t\t\t\t\"mmmmm\",  --  4\n\t\t\t\t\"mmmmm\",  --  5\n\t\t\t\t\"mmmmm\",  --  6\n\t\t\t\t\"mmmmm\",  --  7\n\t\t\t\t\"mmmmm\",  --  8\n\t\t\t\t\"mmmmm\",  --  9\n\t\t\t\t\"mmmmm\",  -- 10\n\t\t\t\t\"mmmmm\",  -- 11\n\t\t\t\t\"mmmmm\",  -- 12\n\t\t\t\t\"mmmmm\",  -- 13\n\t\t\t\t\"maaam\",  -- 14\n\t\t\t\t\"maaam\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"maaam\",  --  0\n\t\t\t\t\"maaam\",  --  1\n\t\t\t\t\"mbbbm\",  --  2\n\t\t\t\t\"mmmmm\",  --  3\n\t\t\t\t\"mmmmm\",  --  4\n\t\t\t\t\"mmmmm\",  --  5\n\t\t\t\t\"mmmmm\",  --  6\n\t\t\t\t\"mmmmm\",  --  7\n\t\t\t\t\"mmmmm\",  --  8\n\t\t\t\t\"mmmmm\",  --  9\n\t\t\t\t\"mmmmm\",  -- 10\n\t\t\t\t\"mmmmm\",  -- 11\n\t\t\t\t\"mmmmm\",  -- 12\n\t\t\t\t\"mcccm\",  -- 13\n\t\t\t\t\"maaam\",  -- 14\n\t\t\t\t\"maaam\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"daaae\",  --  0\n\t\t\t\t\"daaae\",  --  1\n\t\t\t\t\"daaae\",  --  2\n\t\t\t\t\"daaae\",  --  3\n\t\t\t\t\"daaae\",  --  4\n\t\t\t\t\"mamae\",  --  5\n\t\t\t\t\"mmmam\",  --  6\n\t\t\t\t\"mmmmm\",  --  7\n\t\t\t\t\"mmmmm\",  --  8\n\t\t\t\t\"mmmmm\",  --  9\n\t\t\t\t\"mmmae\",  -- 10\n\t\t\t\t\"dmaae\",  -- 11\n\t\t\t\t\"daaae\",  -- 12\n\t\t\t\t\"daaae\",  -- 13\n\t\t\t\t\"daaae\",  -- 14\n\t\t\t\t\"daaae\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaama\",  --  3\n\t\t\t\t\"mamaa\",  --  4\n\t\t\t\t\"mmmmm\",  --  5\n\t\t\t\t\"mmmmm\",  --  6\n\t\t\t\t\"mmmmm\",  --  7\n\t\t\t\t\"mmmmm\",  --  8\n\t\t\t\t\"mmmmm\",  --  9\n\t\t\t\t\"mmmma\",  -- 10\n\t\t\t\t\"mmmaa\",  -- 11\n\t\t\t\t\"amaaa\",  -- 12\n\t\t\t\t\"aaaaa\",  -- 13\n\t\t\t\t\"aaaaa\",  -- 14\n\t\t\t\t\"aaaaa\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ammma\",  --  0\n\t\t\t\t\"ammma\",  --  1\n\t\t\t\t\"ammma\",  --  2\n\t\t\t\t\"mmmma\",  --  3\n\t\t\t\t\"mmmmm\",  --  4\n\t\t\t\t\"mmmmm\",  --  5\n\t\t\t\t\"mmmmm\",  --  6\n\t\t\t\t\"mmmmm\",  --  7\n\t\t\t\t\"mmmmm\",  --  8\n\t\t\t\t\"mmmmm\",  --  9\n\t\t\t\t\"mmmmm\",  -- 10\n\t\t\t\t\"mmmma\",  -- 11\n\t\t\t\t\"mmmmm\",  -- 12\n\t\t\t\t\"ammma\",  -- 13\n\t\t\t\t\"ammma\",  -- 14\n\t\t\t\t\"ammma\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmm\",  --  0\n\t\t\t\t\"mmmmm\",  --  1\n\t\t\t\t\"mmmmm\",  --  2\n\t\t\t\t\"mmmmm\",  --  3\n\t\t\t\t\"mmmmm\",  --  4\n\t\t\t\t\"mmmmm\",  --  5\n\t\t\t\t\"mmmmm\",  --  6\n\t\t\t\t\"mmmmm\",  --  7\n\t\t\t\t\"mmmmm\",  --  8\n\t\t\t\t\"mmmmm\",  --  9\n\t\t\t\t\"mmmmm\",  -- 10\n\t\t\t\t\"mmmmm\",  -- 11\n\t\t\t\t\"mmmmm\",  -- 12\n\t\t\t\t\"mmmmm\",  -- 13\n\t\t\t\t\"mmmmm\",  -- 14\n\t\t\t\t\"mmmmm\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmm\",  --  0\n\t\t\t\t\"mmmmm\",  --  1\n\t\t\t\t\"mmmmm\",  --  2\n\t\t\t\t\"mmmmm\",  --  3\n\t\t\t\t\"mmmmm\",  --  4\n\t\t\t\t\"mmmmm\",  --  5\n\t\t\t\t\"mmmmm\",  --  6\n\t\t\t\t\"mmmmm\",  --  7\n\t\t\t\t\"mmmmm\",  --  8\n\t\t\t\t\"mmmmm\",  --  9\n\t\t\t\t\"mmmmm\",  -- 10\n\t\t\t\t\"mmmmm\",  -- 11\n\t\t\t\t\"mmmmm\",  -- 12\n\t\t\t\t\"mmmmm\",  -- 13\n\t\t\t\t\"mmmmm\",  -- 14\n\t\t\t\t\"mmmmm\",  -- 15\n\n\t\t\t},\n\t\t},  -- BridgeDoubleCrumble\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeCircleCrossing\",\n\t\t\t\tName         = \"Nether 49\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"49\",\n\t\t\t\tID           = \"308\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 8,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 17,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"-1000\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"5\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  6\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  7\n\t\t\t\t\"aammmmmmmmmmmaa\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 13\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  1\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"aacmmmmmmmmmdaa\",  --  6\n\t\t\t\t\"aacmmmmmmmmmdaa\",  --  7\n\t\t\t\t\"aacmmmmmmmmmdaa\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmeeemmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 13\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmeaaammmmmm\",  --  1\n\t\t\t\t\"mmmmmdaaammmmmm\",  --  2\n\t\t\t\t\"mmmmmdbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mdeemmmmmmmeecm\",  --  5\n\t\t\t\t\"aaacmmmmmmmdaaa\",  --  6\n\t\t\t\t\"aaacmmmmmmmdaaa\",  --  7\n\t\t\t\t\"aaacmmmmmmmdaaa\",  --  8\n\t\t\t\t\"mdbcmmmmmmmbbcm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmdeeecmmmmm\",  -- 11\n\t\t\t\t\"mmmmmdaaacmmmmm\",  -- 12\n\t\t\t\t\"mmmmmbaaabmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmaaammmmmm\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"deeeedaaaceeeec\",  --  0\n\t\t\t\t\"daaaaaaaaaaaaac\",  --  1\n\t\t\t\t\"daaaaaaaaaaaaac\",  --  2\n\t\t\t\t\"daaaaaaaaaaaaac\",  --  3\n\t\t\t\t\"daaacbbaabdaaac\",  --  4\n\t\t\t\t\"eaaacmmmmmdaaae\",  --  5\n\t\t\t\t\"aaaacmmmmmdaaaa\",  --  6\n\t\t\t\t\"aaaacmmmmmdaaaa\",  --  7\n\t\t\t\t\"aaaacmmmmmdaaaa\",  --  8\n\t\t\t\t\"baaacmmmmmdaaab\",  --  9\n\t\t\t\t\"daaaceeeeedaaac\",  -- 10\n\t\t\t\t\"daaaaaaaaaaaaac\",  -- 11\n\t\t\t\t\"daaaaaaaaaaaaac\",  -- 12\n\t\t\t\t\"daaaaaaaaaaaaac\",  -- 13\n\t\t\t\t\"dbbbbdaaacbbbbb\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaammmmmaaaaa\",  --  5\n\t\t\t\t\"aaaaammmmmaaaaa\",  --  6\n\t\t\t\t\"aaaaammmmmaaaaa\",  --  7\n\t\t\t\t\"aaaaammmmmaaaaa\",  --  8\n\t\t\t\t\"aaaaammmmmaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaa...aaaaaa\",  --  0\n\t\t\t\t\"a.............a\",  --  1\n\t\t\t\t\"a.............a\",  --  2\n\t\t\t\t\"a.............a\",  --  3\n\t\t\t\t\"a...aaaaaaa...a\",  --  4\n\t\t\t\t\"a...ammmmma...a\",  --  5\n\t\t\t\t\"....ammmmma....\",  --  6\n\t\t\t\t\"....ammmmma....\",  --  7\n\t\t\t\t\"....ammmmma....\",  --  8\n\t\t\t\t\"a...ammmmma...a\",  --  9\n\t\t\t\t\"a...aaaaaaa...a\",  -- 10\n\t\t\t\t\"a.............a\",  -- 11\n\t\t\t\t\"a.............a\",  -- 12\n\t\t\t\t\"a.............a\",  -- 13\n\t\t\t\t\"aaaaaa...aaaaaa\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"m.............m\",  --  1\n\t\t\t\t\"m.............m\",  --  2\n\t\t\t\t\"m.............m\",  --  3\n\t\t\t\t\"m.............m\",  --  4\n\t\t\t\t\"m....mmmmm....m\",  --  5\n\t\t\t\t\".....mmmmm.....\",  --  6\n\t\t\t\t\".....mmmmm.....\",  --  7\n\t\t\t\t\".....mmmmm.....\",  --  8\n\t\t\t\t\"m....mmmmm....m\",  --  9\n\t\t\t\t\"m.............m\",  -- 10\n\t\t\t\t\"m.............m\",  -- 11\n\t\t\t\t\"m.............m\",  -- 12\n\t\t\t\t\"m.............m\",  -- 13\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"m.............m\",  --  1\n\t\t\t\t\"m.............m\",  --  2\n\t\t\t\t\"m.............m\",  --  3\n\t\t\t\t\"m.............m\",  --  4\n\t\t\t\t\"m....mmmmm....m\",  --  5\n\t\t\t\t\".....mmmmm.....\",  --  6\n\t\t\t\t\".....mmmmm.....\",  --  7\n\t\t\t\t\".....mmmmm.....\",  --  8\n\t\t\t\t\"m....mmmmm....m\",  --  9\n\t\t\t\t\"m.............m\",  -- 10\n\t\t\t\t\"m.............m\",  -- 11\n\t\t\t\t\"m.............m\",  -- 12\n\t\t\t\t\"m.............m\",  -- 13\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 14\n\n\t\t\t},\n\t\t},  -- BridgeCircleCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeLevelCrossing\",\n\t\t\t\tName         = \"Nether 61\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"61\",\n\t\t\t\tID           = \"321\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 14,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 23,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 11,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 11,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"d: 44:14\",  -- stone_slab\n\t\t\t\t\"e:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aabmmmmmmmmmmcaa\",  --  1\n\t\t\t\t\"aabmmmmmmmmmmcaa\",  --  2\n\t\t\t\t\"aabmmmmmmmmmmcaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaabdmmmmmmdcaaa\",  --  1\n\t\t\t\t\"aaabdmmmmmmdcaaa\",  --  2\n\t\t\t\t\"aaabdmmmmmmdcaaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"eeeeeeeeeeeeeeee\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"ffffffffffffffff\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"faaabmmmmmmmmmmm\",  --  5\n\t\t\t\t\"caaabmmmmmmmmmmm\",  --  6\n\t\t\t\t\"caaabmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"a...aaaaaaaaaaaa\",  --  4\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  5\n\t\t\t\t\"aaaaammmmmmmmmmm\",  --  6\n\t\t\t\t\"aaaaammmmmmmmmmm\",  --  7\n\t\t\t\t\"caaabmmmmmmmmmmm\",  --  8\n\t\t\t\t\"caaabmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"m...mmmmmmmmaaam\",  --  4\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  5\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  6\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  7\n\t\t\t\t\"aaaaammmmmmmmmmm\",  --  8\n\t\t\t\t\"aaaaammmmmmmmmmm\",  --  9\n\t\t\t\t\"caaabmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"caaabmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaabmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaabmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaafmmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"m...mmmmmmmmaaam\",  --  4\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  5\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  6\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  7\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  8\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  9\n\t\t\t\t\"aaaaammmmmmmmmmm\",  -- 10\n\t\t\t\t\"aaaaaeemmmmmmmmm\",  -- 11\n\t\t\t\t\"caaaaaammmmmmmmm\",  -- 12\n\t\t\t\t\"caaaaaammmmmmmmm\",  -- 13\n\t\t\t\t\"caaaaaammmmmaaam\",  -- 14\n\t\t\t\t\"fffffffmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"m...mmmmmmmmaaam\",  --  4\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  5\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  6\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  8\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  9\n\t\t\t\t\"a...ammmmmmmmmmm\",  -- 10\n\t\t\t\t\"a...aaaeemmmmmmm\",  -- 11\n\t\t\t\t\"a.....aaammmmmmm\",  -- 12\n\t\t\t\t\"a.....aaammmmmmm\",  -- 13\n\t\t\t\t\"a.....aaammmaaam\",  -- 14\n\t\t\t\t\"aaaaaaaffmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  0\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  1\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  2\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  3\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  4\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  5\n\t\t\t\t\"m...mmmmmmmcaaab\",  --  6\n\t\t\t\t\"m...mmmmmmmcaaab\",  --  7\n\t\t\t\t\"m...mmmmmmmcaaab\",  --  8\n\t\t\t\t\"m...mmmmmmmcaaab\",  --  9\n\t\t\t\t\"m...mmmmmmmcaaab\",  -- 10\n\t\t\t\t\"m...maaaaeecaaab\",  -- 11\n\t\t\t\t\"m.......aaaaaaab\",  -- 12\n\t\t\t\t\"m.......aaaaaaab\",  -- 13\n\t\t\t\t\"m.......aaaaaaab\",  -- 14\n\t\t\t\t\"mmmmmaaaafffaaab\",  -- 15\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  0\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  1\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  2\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  4\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  5\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  6\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  7\n\t\t\t\t\"m...mmmmmmmaaaaa\",  --  8\n\t\t\t\t\"m...mmmmmmmaaaaa\",  --  9\n\t\t\t\t\"m...mmmmmmmaaaaa\",  -- 10\n\t\t\t\t\"m...mmmaaaaaaaaa\",  -- 11\n\t\t\t\t\"m.........aaaaaa\",  -- 12\n\t\t\t\t\"m.........aaaaaa\",  -- 13\n\t\t\t\t\"m.........aaaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmaaaaaaaaa\",  -- 15\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  0\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  1\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  2\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  3\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  4\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  5\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  6\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  7\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  8\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  9\n\t\t\t\t\"mmmmmmmmmmma...a\",  -- 10\n\t\t\t\t\"mmmmmmmmmaaa...a\",  -- 11\n\t\t\t\t\"mmmm...........a\",  -- 12\n\t\t\t\t\"mmmm...........a\",  -- 13\n\t\t\t\t\"mmmm...........a\",  -- 14\n\t\t\t\t\"mmmmmmmmmaaa...a\",  -- 15\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  4\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  5\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  8\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 11\n\t\t\t\t\"mmmmmm.........m\",  -- 12\n\t\t\t\t\"mmmmmm.........m\",  -- 13\n\t\t\t\t\"mmmmmm.........m\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 15\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  4\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  5\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  8\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 11\n\t\t\t\t\"mmmmmmmm.......m\",  -- 12\n\t\t\t\t\"mmmmmmmm.......m\",  -- 13\n\t\t\t\t\"mmmmmmmm.......m\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 15\n\n\t\t\t},\n\t\t},  -- BridgeLevelCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CorridorCrossing\",\n\t\t\t\tName         = \"Nether 63\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"63\",\n\t\t\t\tID           = \"328\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 8,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 8,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"-50\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaaaamm\",  --  0\n\t\t\t\t\"mmaaaaamm\",  --  1\n\t\t\t\t\"aaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaa\",  --  6\n\t\t\t\t\"mmaaaaamm\",  --  7\n\t\t\t\t\"mmaaaaamm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mma...amm\",  --  0\n\t\t\t\t\"mma...amm\",  --  1\n\t\t\t\t\"aaa...aaa\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".........\",  --  4\n\t\t\t\t\".........\",  --  5\n\t\t\t\t\"aaa...aaa\",  --  6\n\t\t\t\t\"mma...amm\",  --  7\n\t\t\t\t\"mma...amm\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mma...amm\",  --  0\n\t\t\t\t\"mmb...bmm\",  --  1\n\t\t\t\t\"aba...aba\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".........\",  --  4\n\t\t\t\t\".........\",  --  5\n\t\t\t\t\"aba...aba\",  --  6\n\t\t\t\t\"mmb...bmm\",  --  7\n\t\t\t\t\"mma...amm\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mma...amm\",  --  0\n\t\t\t\t\"mmb...bmm\",  --  1\n\t\t\t\t\"aba...aba\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".........\",  --  4\n\t\t\t\t\".........\",  --  5\n\t\t\t\t\"aba...aba\",  --  6\n\t\t\t\t\"mmb...bmm\",  --  7\n\t\t\t\t\"mma...amm\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mma...amm\",  --  0\n\t\t\t\t\"mmb...bmm\",  --  1\n\t\t\t\t\"aba...aba\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".........\",  --  4\n\t\t\t\t\".........\",  --  5\n\t\t\t\t\"aba...aba\",  --  6\n\t\t\t\t\"mmb...bmm\",  --  7\n\t\t\t\t\"mma...amm\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmcaaadmm\",  --  0\n\t\t\t\t\"mmcaaadmm\",  --  1\n\t\t\t\t\"eeeaaaeee\",  --  2\n\t\t\t\t\"aaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaa\",  --  5\n\t\t\t\t\"ffcaaadff\",  --  6\n\t\t\t\t\"mmcaaadmm\",  --  7\n\t\t\t\t\"mmcaaadmm\",  --  8\n\n\t\t\t},\n\t\t},  -- CorridorCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TinyCorridorCrossing\",\n\t\t\t\tName         = \"Nether 64\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"64\",\n\t\t\t\tID           = \"329\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"-50\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"1:200|2:400|3:0|4:500\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"baaab\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"caaad\",  --  4\n\n\t\t\t},\n\t\t},  -- TinyCorridorCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Corridor5\",\n\t\t\t\tName         = \"Nether 65\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"65\",\n\t\t\t\tID           = \"330\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"500\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"500\",\n\t\t\t\t[\"DepthWeight\"] = \"6:0|12:0|18:0\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"ababa\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\"ababa\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"ababa\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\"ababa\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ababa\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\"ababa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ccccc\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"ddddd\",  --  4\n\n\t\t\t},\n\t\t},  -- Corridor5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TinyCorridorCorner\",\n\t\t\t\tName         = \"Nether 66\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"66\",\n\t\t\t\tID           = \"331\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"-50\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"....a\",  --  1\n\t\t\t\t\"....a\",  --  2\n\t\t\t\t\"....a\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"ababa\",  --  0\n\t\t\t\t\"....b\",  --  1\n\t\t\t\t\"....a\",  --  2\n\t\t\t\t\"....b\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"ababa\",  --  0\n\t\t\t\t\"....b\",  --  1\n\t\t\t\t\"....a\",  --  2\n\t\t\t\t\"....b\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ababa\",  --  0\n\t\t\t\t\"....b\",  --  1\n\t\t\t\t\"....a\",  --  2\n\t\t\t\t\"....b\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ccccc\",  --  0\n\t\t\t\t\"aaaad\",  --  1\n\t\t\t\t\"aaaad\",  --  2\n\t\t\t\t\"aaaad\",  --  3\n\t\t\t\t\"eaaad\",  --  4\n\n\t\t\t},\n\t\t},  -- TinyCorridorCorner\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TinyCorridorCornerChest\",\n\t\t\t\tName         = \"Nether 67\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"67\",\n\t\t\t\tID           = \"332\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b: 54: 4\",  -- chest\n\t\t\t\t\"c:113: 0\",  -- netherbrickfence\n\t\t\t\t\"d:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 0\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"....a\",  --  1\n\t\t\t\t\"...ba\",  --  2\n\t\t\t\t\"....a\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"acaca\",  --  0\n\t\t\t\t\"....c\",  --  1\n\t\t\t\t\"....a\",  --  2\n\t\t\t\t\"....c\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"acaca\",  --  0\n\t\t\t\t\"....c\",  --  1\n\t\t\t\t\"....a\",  --  2\n\t\t\t\t\"....c\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"acaca\",  --  0\n\t\t\t\t\"....c\",  --  1\n\t\t\t\t\"....a\",  --  2\n\t\t\t\t\"....c\",  --  3\n\t\t\t\t\"a...a\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ddddd\",  --  0\n\t\t\t\t\"aaaae\",  --  1\n\t\t\t\t\"aaaae\",  --  2\n\t\t\t\t\"aaaae\",  --  3\n\t\t\t\t\"faaae\",  --  4\n\n\t\t\t},\n\t\t},  -- TinyCorridorCornerChest\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BridgeDoubleStairs\",\n\t\t\t\tName         = \"Nether 115\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"115\",\n\t\t\t\tID           = \"810\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 16,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 13,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 13,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 13,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 13,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"e:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"g:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"h:114: 1\",  -- netherbrickstairs\n\t\t\t\t\"i: 44:14\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"aammmmmmmmmaaaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmma\",  --  2\n\t\t\t\t\"aammmmmmmmmmmma\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"aammmmmmmmmmmma\",  -- 12\n\t\t\t\t\"aammmmmmmmmmmma\",  -- 13\n\t\t\t\t\"aammmmmmmmmaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"aammmmmmmmmaaaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmma\",  --  2\n\t\t\t\t\"aammmmmmmmmmmma\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"aammmmmmmmmmmma\",  -- 12\n\t\t\t\t\"aammmmmmmmmmmma\",  -- 13\n\t\t\t\t\"aammmmmmmmmaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"aammmmmmmmmaaaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmma\",  --  2\n\t\t\t\t\"aammmmmmmmmmmma\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"aammmmmmmmmmmma\",  -- 12\n\t\t\t\t\"aammmmmmmmmmmma\",  -- 13\n\t\t\t\t\"aammmmmmmmmaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"aammmmmmmmmaaaa\",  --  1\n\t\t\t\t\"aammmmmmmmmbbba\",  --  2\n\t\t\t\t\"aammmmmmmmmmmma\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"aammmmmmmmmmmma\",  -- 12\n\t\t\t\t\"aammmmmmmmmccca\",  -- 13\n\t\t\t\t\"aammmmmmmmmaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"aammmmmmmmmaaaa\",  --  1\n\t\t\t\t\"aammmmmmmmmaaaa\",  --  2\n\t\t\t\t\"aammmmmmmmmbbba\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"aammmmmmmmmccca\",  -- 12\n\t\t\t\t\"aammmmmmmmmaaaa\",  -- 13\n\t\t\t\t\"aammmmmmmmmaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmdaaae\",  --  0\n\t\t\t\t\"aammmmmmmmdaaaa\",  --  1\n\t\t\t\t\"aammmmmmmmdaaaa\",  --  2\n\t\t\t\t\"aammmmmmmmdaaaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmdaaae\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmdaaae\",  -- 11\n\t\t\t\t\"aammmmmmmmdaaaa\",  -- 12\n\t\t\t\t\"aammmmmmmmdaaaa\",  -- 13\n\t\t\t\t\"aammmmmmmmdaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmmmmdaaae\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmaaaaa\",  --  0\n\t\t\t\t\"aammmmmmmmaaaaa\",  --  1\n\t\t\t\t\"aammmmmmmmaaaaa\",  --  2\n\t\t\t\t\"aammmmmmmmaaaaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmaaaaa\",  --  4\n\t\t\t\t\"mmmmmmmmmmdaaae\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmdaaae\",  -- 10\n\t\t\t\t\"mmmmmmmmmmaaaaa\",  -- 11\n\t\t\t\t\"aammmmmmmmaaaaa\",  -- 12\n\t\t\t\t\"aammmmmmmmaaaaa\",  -- 13\n\t\t\t\t\"aammmmmmmmaaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmmmmaaaaa\",  -- 15\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmma...a\",  --  0\n\t\t\t\t\"aammmmmmmma...a\",  --  1\n\t\t\t\t\"aammmmmmmma...a\",  --  2\n\t\t\t\t\"aammmmmmmma...a\",  --  3\n\t\t\t\t\"mmmmmmmmmmafffa\",  --  4\n\t\t\t\t\"mmmmmmmmmaaaaaa\",  --  5\n\t\t\t\t\"mmmmmmmmmaaaaae\",  --  6\n\t\t\t\t\"mmmmmmmmmaaaaae\",  --  7\n\t\t\t\t\"mmmmmmmmmaaaaae\",  --  8\n\t\t\t\t\"mmmmmmmmmaaaaae\",  --  9\n\t\t\t\t\"mmmmmmmmmaaaaaa\",  -- 10\n\t\t\t\t\"mmmmmmmmmmaggga\",  -- 11\n\t\t\t\t\"aammmmmmmma...a\",  -- 12\n\t\t\t\t\"aammmmmmmma...a\",  -- 13\n\t\t\t\t\"aammmmmmmma...a\",  -- 14\n\t\t\t\t\"mmmmmmmmmma...a\",  -- 15\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmmm...m\",  --  0\n\t\t\t\t\"aammmmmmmma...a\",  --  1\n\t\t\t\t\"aammmmmmmma...a\",  --  2\n\t\t\t\t\"aammmmmmmma...a\",  --  3\n\t\t\t\t\"mmmmmmmmmma...a\",  --  4\n\t\t\t\t\"mmmmmmmmmaafffa\",  --  5\n\t\t\t\t\"mmmmmmmmaaaaaaa\",  --  6\n\t\t\t\t\"mmmmmmmmaaaaaaa\",  --  7\n\t\t\t\t\"mmmmmmmmaaaaaaa\",  --  8\n\t\t\t\t\"mmmmmmmmaaaaaaa\",  --  9\n\t\t\t\t\"mmmmmmmmmaaggga\",  -- 10\n\t\t\t\t\"mmmmmmmmmma...a\",  -- 11\n\t\t\t\t\"aammmmmmmma...a\",  -- 12\n\t\t\t\t\"aammmmmmmma...a\",  -- 13\n\t\t\t\t\"aammmmmmmma...a\",  -- 14\n\t\t\t\t\"mmmmmmmmmmm...m\",  -- 15\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmm...m\",  --  0\n\t\t\t\t\"aaemmmmmmma...a\",  --  1\n\t\t\t\t\"aaemmmmmmma...a\",  --  2\n\t\t\t\t\"aaemmmmmmma...a\",  --  3\n\t\t\t\t\"mmmmmmmmmma...a\",  --  4\n\t\t\t\t\"mmmmmmmmmaa...a\",  --  5\n\t\t\t\t\"mmmmaaaaah....a\",  --  6\n\t\t\t\t\"mmmmaaaaah....a\",  --  7\n\t\t\t\t\"mmmmaaaaah....a\",  --  8\n\t\t\t\t\"mmmmaaaaah....a\",  --  9\n\t\t\t\t\"mmmmmmmmmaa...a\",  -- 10\n\t\t\t\t\"mmmmmmmmmma...a\",  -- 11\n\t\t\t\t\"aaemmmmmmma...a\",  -- 12\n\t\t\t\t\"aaemmmmmmma...a\",  -- 13\n\t\t\t\t\"aaemmmmmmma...a\",  -- 14\n\t\t\t\t\"mmmmmmmmmmm...m\",  -- 15\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaaeimmmmmammma\",  --  1\n\t\t\t\t\"aaaeimmmmmammma\",  --  2\n\t\t\t\t\"aaaeimmmmma...a\",  --  3\n\t\t\t\t\"mmmmmmmmmmm...m\",  --  4\n\t\t\t\t\"mmmmaaaaaam...m\",  --  5\n\t\t\t\t\"mmmmaaaah.....m\",  --  6\n\t\t\t\t\"mmmmaaaah.....m\",  --  7\n\t\t\t\t\"mmmmaaaah.....m\",  --  8\n\t\t\t\t\"mmmmaaaah.....m\",  --  9\n\t\t\t\t\"mmmmaaaaaam...m\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm...m\",  -- 11\n\t\t\t\t\"aaaeimmmmma...a\",  -- 12\n\t\t\t\t\"aaaeimmmmmammma\",  -- 13\n\t\t\t\t\"aaaeimmmmmammma\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"ccccccccccccccc\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"bbbbaaaaabbbbbb\",  --  4\n\t\t\t\t\"mmmmagggamm...m\",  --  5\n\t\t\t\t\"mmmma.........m\",  --  6\n\t\t\t\t\"mmmma.........m\",  --  7\n\t\t\t\t\"mmmma.........m\",  --  8\n\t\t\t\t\"mmmma.........m\",  --  9\n\t\t\t\t\"mmmmafffamm...m\",  -- 10\n\t\t\t\t\"ccccaaaahcccccc\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 14\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 15\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaagggaaaaaaa\",  --  4\n\t\t\t\t\"mmmma...ammmmmm\",  --  5\n\t\t\t\t\"mmmma.........m\",  --  6\n\t\t\t\t\"mmmmm.........m\",  --  7\n\t\t\t\t\"mmmmm.........m\",  --  8\n\t\t\t\t\"mmmma.........m\",  --  9\n\t\t\t\t\"mmmma...ammmmmm\",  -- 10\n\t\t\t\t\"aaaaafffaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 14\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 15\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"aaaaa...aaaaaaa\",  --  4\n\t\t\t\t\"mmmma...ammmmmm\",  --  5\n\t\t\t\t\"mmmmm.....mmmmm\",  --  6\n\t\t\t\t\"mmmmm.....mmmmm\",  --  7\n\t\t\t\t\"mmmmm.....mmmmm\",  --  8\n\t\t\t\t\"mmmmm.....mmmmm\",  --  9\n\t\t\t\t\"mmmma...ammmmmm\",  -- 10\n\t\t\t\t\"aaaaa...aaaaaaa\",  -- 11\n\t\t\t\t\"...............\",  -- 12\n\t\t\t\t\"...............\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 15\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"mmmmm...mmmmmmm\",  --  4\n\t\t\t\t\"mmmmm...mmmmmmm\",  --  5\n\t\t\t\t\"mmmmm...mmmmmmm\",  --  6\n\t\t\t\t\"mmmmm...mmmmmmm\",  --  7\n\t\t\t\t\"mmmmm...mmmmmmm\",  --  8\n\t\t\t\t\"mmmmm...mmmmmmm\",  --  9\n\t\t\t\t\"mmmmm...mmmmmmm\",  -- 10\n\t\t\t\t\"mmmmm...mmmmmmm\",  -- 11\n\t\t\t\t\"...............\",  -- 12\n\t\t\t\t\"...............\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"mmmmm...mmmmmmm\",  --  4\n\t\t\t\t\"mmmmm...mmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmm...mmmmmmm\",  -- 10\n\t\t\t\t\"mmmmm...mmmmmmm\",  -- 11\n\t\t\t\t\"...............\",  -- 12\n\t\t\t\t\"...............\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t},\n\t\t},  -- BridgeDoubleStairs\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SlabbedBridgeStairs\",\n\t\t\t\tName         = \"Nether 116\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"116\",\n\t\t\t\tID           = \"811\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 14,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 13,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 11,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 11,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrickblock\n\t\t\t\t\"b:114: 5\",  -- netherbrickstairs\n\t\t\t\t\"c:114: 4\",  -- netherbrickstairs\n\t\t\t\t\"d: 44:14\",  -- stone_slab\n\t\t\t\t\"e:114: 6\",  -- netherbrickstairs\n\t\t\t\t\"f:114: 7\",  -- netherbrickstairs\n\t\t\t\t\"g: 44: 6\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aammmmmmmmmmmmaa\",  --  1\n\t\t\t\t\"aammmmmmmmmmmmaa\",  --  2\n\t\t\t\t\"aammmmmmmmmmmmaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aabmmmmmmmmmmcaa\",  --  1\n\t\t\t\t\"aabmmmmmmmmmmcaa\",  --  2\n\t\t\t\t\"aabmmmmmmmmmmcaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaabdmmmmmmdcaaa\",  --  1\n\t\t\t\t\"aaabdmmmmmmdcaaa\",  --  2\n\t\t\t\t\"aaabdmmmmmmdcaaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"eeeeeeeeeeeeeeee\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"ffffffffffffffff\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"faaabmmmmmmmmmmm\",  --  5\n\t\t\t\t\"caaabmmmmmmmmmmm\",  --  6\n\t\t\t\t\"caaabmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"a...aaaaaaaaaaaa\",  --  4\n\t\t\t\t\"agggammmmmmmmmmm\",  --  5\n\t\t\t\t\"aaaaammmmmmmmmmm\",  --  6\n\t\t\t\t\"aaaaammmmmmmmmmm\",  --  7\n\t\t\t\t\"caaabmmmmmmmmmmm\",  --  8\n\t\t\t\t\"caaabmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaammmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaammmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"m...mmmmmmmmaaam\",  --  4\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  5\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  6\n\t\t\t\t\"agggammmmmmmmmmm\",  --  7\n\t\t\t\t\"aaaaammmmmmmmmmm\",  --  8\n\t\t\t\t\"aaaaammmmmmmmmmm\",  --  9\n\t\t\t\t\"caaabmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"caaabmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"maaabmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"maaabmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"maaafmmmmmmmaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"m...mmmmmmmmaaam\",  --  4\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  5\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  6\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  7\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  8\n\t\t\t\t\"agggammmmmmmmmmm\",  --  9\n\t\t\t\t\"aaaaammmmmmmmmmm\",  -- 10\n\t\t\t\t\"aaaaaeemmmmmmmmm\",  -- 11\n\t\t\t\t\"caaaaaammmmmmmmm\",  -- 12\n\t\t\t\t\"caaaaaammmmmmmmm\",  -- 13\n\t\t\t\t\"caaaaaammmmmaaam\",  -- 14\n\t\t\t\t\"fffffffmmmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmmmmaaam\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"m...mmmmmmmmaaam\",  --  4\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  5\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  6\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"m...mmmmmmmmmmmm\",  --  8\n\t\t\t\t\"a...ammmmmmmmmmm\",  --  9\n\t\t\t\t\"a...ammmmmmmmmmm\",  -- 10\n\t\t\t\t\"a...aaaeemmmmmmm\",  -- 11\n\t\t\t\t\"a....gaaammmmmmm\",  -- 12\n\t\t\t\t\"a....gaaammmmmmm\",  -- 13\n\t\t\t\t\"a....gaaammmaaam\",  -- 14\n\t\t\t\t\"aaaaaaaffmmmaaam\",  -- 15\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  0\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  1\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  2\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  3\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  4\n\t\t\t\t\"mmmmmmmmmmmcaaab\",  --  5\n\t\t\t\t\"m...mmmmmmmcaaab\",  --  6\n\t\t\t\t\"m...mmmmmmmcaaab\",  --  7\n\t\t\t\t\"m...mmmmmmmcaaab\",  --  8\n\t\t\t\t\"m...mmmmmmmcaaab\",  --  9\n\t\t\t\t\"m...mmmmmmmcaaab\",  -- 10\n\t\t\t\t\"m...maaaaeecaaab\",  -- 11\n\t\t\t\t\"m......gaaaaaaab\",  -- 12\n\t\t\t\t\"m......gaaaaaaab\",  -- 13\n\t\t\t\t\"m......gaaaaaaab\",  -- 14\n\t\t\t\t\"mmmmmaaaafffaaab\",  -- 15\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  0\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  1\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  2\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  3\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  4\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  5\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  6\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  --  7\n\t\t\t\t\"m...mmmmmmmaaaaa\",  --  8\n\t\t\t\t\"m...mmmmmmmaaaaa\",  --  9\n\t\t\t\t\"m...mmmmmmmaaaaa\",  -- 10\n\t\t\t\t\"m...mmmaaaaaaaaa\",  -- 11\n\t\t\t\t\"m........gaaaaaa\",  -- 12\n\t\t\t\t\"m........gaaaaaa\",  -- 13\n\t\t\t\t\"m........gaaaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmaaaaaaaaa\",  -- 15\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  0\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  1\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  2\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  3\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  4\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  5\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  6\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  7\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  8\n\t\t\t\t\"mmmmmmmmmmma...a\",  --  9\n\t\t\t\t\"mmmmmmmmmmma...a\",  -- 10\n\t\t\t\t\"mmmmmmmmmaaa...a\",  -- 11\n\t\t\t\t\"mmmm...........a\",  -- 12\n\t\t\t\t\"mmmm...........a\",  -- 13\n\t\t\t\t\"mmmm...........a\",  -- 14\n\t\t\t\t\"mmmmmmmmmaaa...a\",  -- 15\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  4\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  5\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  8\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 11\n\t\t\t\t\"mmmmmm.........m\",  -- 12\n\t\t\t\t\"mmmmmm.........m\",  -- 13\n\t\t\t\t\"mmmmmm.........m\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 15\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  4\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  5\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  8\n\t\t\t\t\"mmmmmmmmmmmm...m\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 11\n\t\t\t\t\"mmmmmmmm.......m\",  -- 12\n\t\t\t\t\"mmmmmmmm.......m\",  -- 13\n\t\t\t\t\"mmmmmmmm.......m\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmm...m\",  -- 15\n\n\t\t\t},\n\t\t},  -- SlabbedBridgeStairs\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/PieceStructures/RainbowRoad.cubeset",
    "content": "\n-- RainbowRoad.cubeset\n\n-- Defines the prefabs in the group RainbowRoad\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-23 15:08:00\",\n\t\t[\"GridSizeX\"] = \"512\",\n\t\t[\"GridSizeZ\"] = \"512\",\n\t\t[\"IntendedUse\"] = \"PieceStructures\",\n\t\t[\"MaxDepth\"] = \"30\",\n\t\t[\"MaxOffsetX\"] = \"256\",\n\t\t[\"MaxOffsetZ\"] = \"256\",\n\t\t[\"MaxStructureSizeX\"] = \"256\",\n\t\t[\"MaxStructureSizeZ\"] = \"256\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"StraightSingle\",\n\t\t\t\tName         = \"Cube 83\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"83\",\n\t\t\t\tID           = \"461\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 1,\n\t\t\t\tz = 6,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"500\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"Range|120|140\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:14\",  -- wool\n\t\t\t\t\"b: 35: 1\",  -- wool\n\t\t\t\t\"c: 35: 4\",  -- wool\n\t\t\t\t\"d: 35: 5\",  -- wool\n\t\t\t\t\"e: 35: 3\",  -- wool\n\t\t\t\t\"f: 35:11\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"bbbbbbbbbbbbbbbb\",  --  1\n\t\t\t\t\"cccccccccccccccc\",  --  2\n\t\t\t\t\"dddddddddddddddd\",  --  3\n\t\t\t\t\"eeeeeeeeeeeeeeee\",  --  4\n\t\t\t\t\"ffffffffffffffff\",  --  5\n\n\t\t\t},\n\t\t},  -- StraightSingle\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CurveSingle\",\n\t\t\t\tName         = \"Cube 84\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"84\",\n\t\t\t\tID           = \"462\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 1,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:14\",  -- wool\n\t\t\t\t\"b: 35: 1\",  -- wool\n\t\t\t\t\"c: 35: 4\",  -- wool\n\t\t\t\t\"d: 35: 5\",  -- wool\n\t\t\t\t\"e: 35: 3\",  -- wool\n\t\t\t\t\"f: 35:11\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaa.....\",  --  0\n\t\t\t\t\"bbbbbbaa...\",  --  1\n\t\t\t\t\"cccccbbaa..\",  --  2\n\t\t\t\t\"ddddcccbaa.\",  --  3\n\t\t\t\t\"eeedddccba.\",  --  4\n\t\t\t\t\"ffeeeddcbba\",  --  5\n\t\t\t\t\".fffeedccba\",  --  6\n\t\t\t\t\"...ffeddcba\",  --  7\n\t\t\t\t\"....feedcba\",  --  8\n\t\t\t\t\"....ffedcba\",  --  9\n\t\t\t\t\".....fedcba\",  -- 10\n\n\t\t\t},\n\t\t},  -- CurveSingle\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SlopeUpSingle\",\n\t\t\t\tName         = \"Cube 85\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"85\",\n\t\t\t\tID           = \"463\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 8,\n\t\t\t\tz = 6,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"-1000\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:14\",  -- wool\n\t\t\t\t\"b: 35: 1\",  -- wool\n\t\t\t\t\"c: 35: 4\",  -- wool\n\t\t\t\t\"d: 35: 5\",  -- wool\n\t\t\t\t\"e: 35: 3\",  -- wool\n\t\t\t\t\"f: 35:11\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aa..............\",  --  0\n\t\t\t\t\"bb..............\",  --  1\n\t\t\t\t\"cc..............\",  --  2\n\t\t\t\t\"dd..............\",  --  3\n\t\t\t\t\"ee..............\",  --  4\n\t\t\t\t\"ff..............\",  --  5\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..aa............\",  --  0\n\t\t\t\t\"..bb............\",  --  1\n\t\t\t\t\"..cc............\",  --  2\n\t\t\t\t\"..dd............\",  --  3\n\t\t\t\t\"..ee............\",  --  4\n\t\t\t\t\"..ff............\",  --  5\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"....aa..........\",  --  0\n\t\t\t\t\"....bb..........\",  --  1\n\t\t\t\t\"....cc..........\",  --  2\n\t\t\t\t\"....dd..........\",  --  3\n\t\t\t\t\"....ee..........\",  --  4\n\t\t\t\t\"....ff..........\",  --  5\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"......aa........\",  --  0\n\t\t\t\t\"......bb........\",  --  1\n\t\t\t\t\"......cc........\",  --  2\n\t\t\t\t\"......dd........\",  --  3\n\t\t\t\t\"......ee........\",  --  4\n\t\t\t\t\"......ff........\",  --  5\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"........aa......\",  --  0\n\t\t\t\t\"........bb......\",  --  1\n\t\t\t\t\"........cc......\",  --  2\n\t\t\t\t\"........dd......\",  --  3\n\t\t\t\t\"........ee......\",  --  4\n\t\t\t\t\"........ff......\",  --  5\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"..........aa....\",  --  0\n\t\t\t\t\"..........bb....\",  --  1\n\t\t\t\t\"..........cc....\",  --  2\n\t\t\t\t\"..........dd....\",  --  3\n\t\t\t\t\"..........ee....\",  --  4\n\t\t\t\t\"..........ff....\",  --  5\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"............aa..\",  --  0\n\t\t\t\t\"............bb..\",  --  1\n\t\t\t\t\"............cc..\",  --  2\n\t\t\t\t\"............dd..\",  --  3\n\t\t\t\t\"............ee..\",  --  4\n\t\t\t\t\"............ff..\",  --  5\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"..............aa\",  --  0\n\t\t\t\t\"..............bb\",  --  1\n\t\t\t\t\"..............cc\",  --  2\n\t\t\t\t\"..............dd\",  --  3\n\t\t\t\t\"..............ee\",  --  4\n\t\t\t\t\"..............ff\",  --  5\n\n\t\t\t},\n\t\t},  -- SlopeUpSingle\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CurveUpSingle\",\n\t\t\t\tName         = \"Cube 87\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"87\",\n\t\t\t\tID           = \"465\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 8,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:14\",  -- wool\n\t\t\t\t\"b: 35: 1\",  -- wool\n\t\t\t\t\"c: 35: 4\",  -- wool\n\t\t\t\t\"d: 35: 5\",  -- wool\n\t\t\t\t\"e: 35: 3\",  -- wool\n\t\t\t\t\"f: 35:11\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaa........\",  --  0\n\t\t\t\t\"bb.........\",  --  1\n\t\t\t\t\"cc.........\",  --  2\n\t\t\t\t\"dd.........\",  --  3\n\t\t\t\t\"ee.........\",  --  4\n\t\t\t\t\"f..........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...aaa.....\",  --  0\n\t\t\t\t\"..bbb......\",  --  1\n\t\t\t\t\".cc........\",  --  2\n\t\t\t\t\".dd........\",  --  3\n\t\t\t\t\".ee........\",  --  4\n\t\t\t\t\".f.........\",  --  5\n\t\t\t\t\".ff........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".....baa...\",  --  1\n\t\t\t\t\"...ccb.....\",  --  2\n\t\t\t\t\"...dc......\",  --  3\n\t\t\t\t\"...d.......\",  --  4\n\t\t\t\t\"..ee.......\",  --  5\n\t\t\t\t\"..ff.......\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"......baa..\",  --  2\n\t\t\t\t\".....ccb...\",  --  3\n\t\t\t\t\"....dd.....\",  --  4\n\t\t\t\t\"....e......\",  --  5\n\t\t\t\t\"...fe......\",  --  6\n\t\t\t\t\"...ff......\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"........aa.\",  --  3\n\t\t\t\t\"......ccb..\",  --  4\n\t\t\t\t\".....dd....\",  --  5\n\t\t\t\t\".....e.....\",  --  6\n\t\t\t\t\"....fe.....\",  --  7\n\t\t\t\t\"....f......\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\".........a.\",  --  4\n\t\t\t\t\".......cbba\",  --  5\n\t\t\t\t\"......dc...\",  --  6\n\t\t\t\t\"......d....\",  --  7\n\t\t\t\t\".....ee....\",  --  8\n\t\t\t\t\"....ff.....\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"........cba\",  --  6\n\t\t\t\t\".......dcba\",  --  7\n\t\t\t\t\".......dcb.\",  --  8\n\t\t\t\t\".....fe....\",  --  9\n\t\t\t\t\".....f.....\",  -- 10\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"..........a\",  --  8\n\t\t\t\t\".......dcba\",  --  9\n\t\t\t\t\".....fedcba\",  -- 10\n\n\t\t\t},\n\t\t},  -- CurveUpSingle\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"StraightDouble\",\n\t\t\t\tName         = \"Cube 88\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"88\",\n\t\t\t\tID           = \"466\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 1,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:11\",  -- wool\n\t\t\t\t\"b: 35: 3\",  -- wool\n\t\t\t\t\"c: 35: 5\",  -- wool\n\t\t\t\t\"d: 35: 4\",  -- wool\n\t\t\t\t\"e: 35: 1\",  -- wool\n\t\t\t\t\"f: 35:14\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"bbbbbbbbbbbbbbbb\",  --  1\n\t\t\t\t\"cccccccccccccccc\",  --  2\n\t\t\t\t\"dddddddddddddddd\",  --  3\n\t\t\t\t\"eeeeeeeeeeeeeeee\",  --  4\n\t\t\t\t\"ffffffffffffffff\",  --  5\n\t\t\t\t\"ffffffffffffffff\",  --  6\n\t\t\t\t\"eeeeeeeeeeeeeeee\",  --  7\n\t\t\t\t\"dddddddddddddddd\",  --  8\n\t\t\t\t\"cccccccccccccccc\",  --  9\n\t\t\t\t\"bbbbbbbbbbbbbbbb\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 11\n\n\t\t\t},\n\t\t},  -- StraightDouble\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CurveDouble\",\n\t\t\t\tName         = \"Cube 89\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"89\",\n\t\t\t\tID           = \"467\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 1,\n\t\t\t\tz = 14,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 13,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:11\",  -- wool\n\t\t\t\t\"b: 35: 3\",  -- wool\n\t\t\t\t\"c: 35: 5\",  -- wool\n\t\t\t\t\"d: 35: 4\",  -- wool\n\t\t\t\t\"e: 35: 1\",  -- wool\n\t\t\t\t\"f: 35:14\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaa........\",  --  0\n\t\t\t\t\"bbbbbba.......\",  --  1\n\t\t\t\t\"cccccbbaaa....\",  --  2\n\t\t\t\t\"dddddccbbaa...\",  --  3\n\t\t\t\t\"eeeeeddccbaa..\",  --  4\n\t\t\t\t\"fffffeddccba..\",  --  5\n\t\t\t\t\"ffffffeedcbaa.\",  --  6\n\t\t\t\t\"eeeefffeddcba.\",  --  7\n\t\t\t\t\"dddeefffedcbba\",  --  8\n\t\t\t\t\"cccddefffedcba\",  --  9\n\t\t\t\t\"bbccdeeffedcba\",  -- 10\n\t\t\t\t\"abbccdeffedcba\",  -- 11\n\t\t\t\t\".abbcdeffedcba\",  -- 12\n\t\t\t\t\"..abcdeffedcba\",  -- 13\n\n\t\t\t},\n\t\t},  -- CurveDouble\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SlopeUpDouble\",\n\t\t\t\tName         = \"Cube 90\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"90\",\n\t\t\t\tID           = \"468\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 8,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:11\",  -- wool\n\t\t\t\t\"b: 35: 3\",  -- wool\n\t\t\t\t\"c: 35: 5\",  -- wool\n\t\t\t\t\"d: 35: 4\",  -- wool\n\t\t\t\t\"e: 35: 1\",  -- wool\n\t\t\t\t\"f: 35:14\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aa..............\",  --  0\n\t\t\t\t\"bb..............\",  --  1\n\t\t\t\t\"cc..............\",  --  2\n\t\t\t\t\"dd..............\",  --  3\n\t\t\t\t\"ee..............\",  --  4\n\t\t\t\t\"ff..............\",  --  5\n\t\t\t\t\"ff..............\",  --  6\n\t\t\t\t\"ee..............\",  --  7\n\t\t\t\t\"dd..............\",  --  8\n\t\t\t\t\"cc..............\",  --  9\n\t\t\t\t\"bb..............\",  -- 10\n\t\t\t\t\"aa..............\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..aa............\",  --  0\n\t\t\t\t\"..bb............\",  --  1\n\t\t\t\t\"..cc............\",  --  2\n\t\t\t\t\"..dd............\",  --  3\n\t\t\t\t\"..ee............\",  --  4\n\t\t\t\t\"..ff............\",  --  5\n\t\t\t\t\"..ff............\",  --  6\n\t\t\t\t\"..ee............\",  --  7\n\t\t\t\t\"..dd............\",  --  8\n\t\t\t\t\"..cc............\",  --  9\n\t\t\t\t\"..bb............\",  -- 10\n\t\t\t\t\"..aa............\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"....aa..........\",  --  0\n\t\t\t\t\"....bb..........\",  --  1\n\t\t\t\t\"....cc..........\",  --  2\n\t\t\t\t\"....dd..........\",  --  3\n\t\t\t\t\"....ee..........\",  --  4\n\t\t\t\t\"....ff..........\",  --  5\n\t\t\t\t\"....ff..........\",  --  6\n\t\t\t\t\"....ee..........\",  --  7\n\t\t\t\t\"....dd..........\",  --  8\n\t\t\t\t\"....cc..........\",  --  9\n\t\t\t\t\"....bb..........\",  -- 10\n\t\t\t\t\"....aa..........\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"......aa........\",  --  0\n\t\t\t\t\"......bb........\",  --  1\n\t\t\t\t\"......cc........\",  --  2\n\t\t\t\t\"......dd........\",  --  3\n\t\t\t\t\"......ee........\",  --  4\n\t\t\t\t\"......ff........\",  --  5\n\t\t\t\t\"......ff........\",  --  6\n\t\t\t\t\"......ee........\",  --  7\n\t\t\t\t\"......dd........\",  --  8\n\t\t\t\t\"......cc........\",  --  9\n\t\t\t\t\"......bb........\",  -- 10\n\t\t\t\t\"......aa........\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"........aa......\",  --  0\n\t\t\t\t\"........bb......\",  --  1\n\t\t\t\t\"........cc......\",  --  2\n\t\t\t\t\"........dd......\",  --  3\n\t\t\t\t\"........ee......\",  --  4\n\t\t\t\t\"........ff......\",  --  5\n\t\t\t\t\"........ff......\",  --  6\n\t\t\t\t\"........ee......\",  --  7\n\t\t\t\t\"........dd......\",  --  8\n\t\t\t\t\"........cc......\",  --  9\n\t\t\t\t\"........bb......\",  -- 10\n\t\t\t\t\"........aa......\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"..........aa....\",  --  0\n\t\t\t\t\"..........bb....\",  --  1\n\t\t\t\t\"..........cc....\",  --  2\n\t\t\t\t\"..........dd....\",  --  3\n\t\t\t\t\"..........ee....\",  --  4\n\t\t\t\t\"..........ff....\",  --  5\n\t\t\t\t\"..........ff....\",  --  6\n\t\t\t\t\"..........ee....\",  --  7\n\t\t\t\t\"..........dd....\",  --  8\n\t\t\t\t\"..........cc....\",  --  9\n\t\t\t\t\"..........bb....\",  -- 10\n\t\t\t\t\"..........aa....\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"............aa..\",  --  0\n\t\t\t\t\"............bb..\",  --  1\n\t\t\t\t\"............cc..\",  --  2\n\t\t\t\t\"............dd..\",  --  3\n\t\t\t\t\"............ee..\",  --  4\n\t\t\t\t\"............ff..\",  --  5\n\t\t\t\t\"............ff..\",  --  6\n\t\t\t\t\"............ee..\",  --  7\n\t\t\t\t\"............dd..\",  --  8\n\t\t\t\t\"............cc..\",  --  9\n\t\t\t\t\"............bb..\",  -- 10\n\t\t\t\t\"............aa..\",  -- 11\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"..............aa\",  --  0\n\t\t\t\t\"..............bb\",  --  1\n\t\t\t\t\"..............cc\",  --  2\n\t\t\t\t\"..............dd\",  --  3\n\t\t\t\t\"..............ee\",  --  4\n\t\t\t\t\"..............ff\",  --  5\n\t\t\t\t\"..............ff\",  --  6\n\t\t\t\t\"..............ee\",  --  7\n\t\t\t\t\"..............dd\",  --  8\n\t\t\t\t\"..............cc\",  --  9\n\t\t\t\t\"..............bb\",  -- 10\n\t\t\t\t\"..............aa\",  -- 11\n\n\t\t\t},\n\t\t},  -- SlopeUpDouble\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CurveUpDouble\",\n\t\t\t\tName         = \"Cube 92\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"92\",\n\t\t\t\tID           = \"470\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 8,\n\t\t\t\tz = 14,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 13,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:11\",  -- wool\n\t\t\t\t\"b: 35: 3\",  -- wool\n\t\t\t\t\"c: 35: 5\",  -- wool\n\t\t\t\t\"d: 35: 4\",  -- wool\n\t\t\t\t\"e: 35: 1\",  -- wool\n\t\t\t\t\"f: 35:14\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"a.............\",  --  0\n\t\t\t\t\"b.............\",  --  1\n\t\t\t\t\"c.............\",  --  2\n\t\t\t\t\"d.............\",  --  3\n\t\t\t\t\"e.............\",  --  4\n\t\t\t\t\"f.............\",  --  5\n\t\t\t\t\"f.............\",  --  6\n\t\t\t\t\"e.............\",  --  7\n\t\t\t\t\"d.............\",  --  8\n\t\t\t\t\"c.............\",  --  9\n\t\t\t\t\"b.............\",  -- 10\n\t\t\t\t\"a.............\",  -- 11\n\t\t\t\t\"..............\",  -- 12\n\t\t\t\t\"..............\",  -- 13\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".aa...........\",  --  0\n\t\t\t\t\".bb...........\",  --  1\n\t\t\t\t\".cc...........\",  --  2\n\t\t\t\t\".dd...........\",  --  3\n\t\t\t\t\".ee...........\",  --  4\n\t\t\t\t\".f............\",  --  5\n\t\t\t\t\".f............\",  --  6\n\t\t\t\t\".e............\",  --  7\n\t\t\t\t\".d............\",  --  8\n\t\t\t\t\".c............\",  --  9\n\t\t\t\t\".b............\",  -- 10\n\t\t\t\t\".b............\",  -- 11\n\t\t\t\t\"..............\",  -- 12\n\t\t\t\t\"..............\",  -- 13\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...aaa........\",  --  0\n\t\t\t\t\"...bb.........\",  --  1\n\t\t\t\t\"...cc.........\",  --  2\n\t\t\t\t\"...dd.........\",  --  3\n\t\t\t\t\"...ee.........\",  --  4\n\t\t\t\t\"..ff..........\",  --  5\n\t\t\t\t\"..ff..........\",  --  6\n\t\t\t\t\"..ee..........\",  --  7\n\t\t\t\t\"..de..........\",  --  8\n\t\t\t\t\"..c...........\",  --  9\n\t\t\t\t\".b............\",  -- 10\n\t\t\t\t\".b............\",  -- 11\n\t\t\t\t\"..............\",  -- 12\n\t\t\t\t\"..............\",  -- 13\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\".....baa......\",  --  1\n\t\t\t\t\".....bbaaa....\",  --  2\n\t\t\t\t\"....dccbba....\",  --  3\n\t\t\t\t\"....eddcc.....\",  --  4\n\t\t\t\t\"....fedd......\",  --  5\n\t\t\t\t\"....ffee......\",  --  6\n\t\t\t\t\"....ff........\",  --  7\n\t\t\t\t\"....e.........\",  --  8\n\t\t\t\t\"...dd.........\",  --  9\n\t\t\t\t\"..cc..........\",  -- 10\n\t\t\t\t\"..b...........\",  -- 11\n\t\t\t\t\".a............\",  -- 12\n\t\t\t\t\"..............\",  -- 13\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..........a...\",  --  3\n\t\t\t\t\".........ba...\",  --  4\n\t\t\t\t\"........cc....\",  --  5\n\t\t\t\t\".......edc....\",  --  6\n\t\t\t\t\"......fedd....\",  --  7\n\t\t\t\t\".....ff.......\",  --  8\n\t\t\t\t\"....de........\",  --  9\n\t\t\t\t\"...cde........\",  -- 10\n\t\t\t\t\"..b...........\",  -- 11\n\t\t\t\t\".a............\",  -- 12\n\t\t\t\t\"..............\",  -- 13\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"...........a..\",  --  4\n\t\t\t\t\"..........ba..\",  --  5\n\t\t\t\t\"..........baa.\",  --  6\n\t\t\t\t\"..........cba.\",  --  7\n\t\t\t\t\".......fedcb..\",  --  8\n\t\t\t\t\"......fffed...\",  --  9\n\t\t\t\t\".....eef......\",  -- 10\n\t\t\t\t\"...ccd........\",  -- 11\n\t\t\t\t\"..b...........\",  -- 12\n\t\t\t\t\"..............\",  -- 13\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"..............\",  --  4\n\t\t\t\t\"..............\",  --  5\n\t\t\t\t\"..............\",  --  6\n\t\t\t\t\"..............\",  --  7\n\t\t\t\t\"............ba\",  --  8\n\t\t\t\t\"...........cba\",  --  9\n\t\t\t\t\"........fedcba\",  -- 10\n\t\t\t\t\"......effedc..\",  -- 11\n\t\t\t\t\"..bbcdef......\",  -- 12\n\t\t\t\t\"..a...........\",  -- 13\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"..............\",  --  4\n\t\t\t\t\"..............\",  --  5\n\t\t\t\t\"..............\",  --  6\n\t\t\t\t\"..............\",  --  7\n\t\t\t\t\"..............\",  --  8\n\t\t\t\t\"..............\",  --  9\n\t\t\t\t\"..............\",  -- 10\n\t\t\t\t\"............ba\",  -- 11\n\t\t\t\t\"........fedcba\",  -- 12\n\t\t\t\t\"..abcdeffedcba\",  -- 13\n\n\t\t\t},\n\t\t},  -- CurveUpDouble\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SplitTee\",\n\t\t\t\tName         = \"Cube 93\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"93\",\n\t\t\t\tID           = \"471\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 1,\n\t\t\t\tz = 14,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 13,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:11\",  -- wool\n\t\t\t\t\"b: 35: 3\",  -- wool\n\t\t\t\t\"c: 35: 5\",  -- wool\n\t\t\t\t\"d: 35: 4\",  -- wool\n\t\t\t\t\"e: 35: 1\",  -- wool\n\t\t\t\t\"f: 35:14\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaa..........\",  --  0\n\t\t\t\t\"bbbbbbaaa.......\",  --  1\n\t\t\t\t\"ccccccbbbaaa....\",  --  2\n\t\t\t\t\"ddddddcccbbbaaaa\",  --  3\n\t\t\t\t\"eeeeeedddcccbbbb\",  --  4\n\t\t\t\t\"ffffffeeedddcccc\",  --  5\n\t\t\t\t\"fffffffffeeedddd\",  --  6\n\t\t\t\t\"eeeeff...fffeeee\",  --  7\n\t\t\t\t\"dddeeff.....ffff\",  --  8\n\t\t\t\t\"cccddeff........\",  --  9\n\t\t\t\t\"bbbccdeef.......\",  -- 10\n\t\t\t\t\"aaabbcddef......\",  -- 11\n\t\t\t\t\"...aabcddef.....\",  -- 12\n\t\t\t\t\".....abcdef.....\",  -- 13\n\n\t\t\t},\n\t\t},  -- SplitTee\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CurveSingleLeft\",\n\t\t\t\tName         = \"Cube 97\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"97\",\n\t\t\t\tID           = \"475\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 1,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:14\",  -- wool\n\t\t\t\t\"b: 35: 1\",  -- wool\n\t\t\t\t\"c: 35: 4\",  -- wool\n\t\t\t\t\"d: 35: 5\",  -- wool\n\t\t\t\t\"e: 35: 3\",  -- wool\n\t\t\t\t\"f: 35:11\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\".....abcdef\",  --  0\n\t\t\t\t\"....aabcdef\",  --  1\n\t\t\t\t\"....abbcdef\",  --  2\n\t\t\t\t\"...aabccdef\",  --  3\n\t\t\t\t\".aaabbcddef\",  --  4\n\t\t\t\t\"aabbbccdeef\",  --  5\n\t\t\t\t\"bbbcccddef.\",  --  6\n\t\t\t\t\"ccccdddeff.\",  --  7\n\t\t\t\t\"dddddeeff..\",  --  8\n\t\t\t\t\"eeeeeeff...\",  --  9\n\t\t\t\t\"ffffff.....\",  -- 10\n\n\t\t\t},\n\t\t},  -- CurveSingleLeft\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SlopeDownFromTopSingle\",\n\t\t\t\tName         = \"Cube 98\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"98\",\n\t\t\t\tID           = \"476\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 8,\n\t\t\t\tz = 6,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:14\",  -- wool\n\t\t\t\t\"b: 35: 1\",  -- wool\n\t\t\t\t\"c: 35: 4\",  -- wool\n\t\t\t\t\"d: 35: 5\",  -- wool\n\t\t\t\t\"e: 35: 3\",  -- wool\n\t\t\t\t\"f: 35:11\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"..............aa\",  --  0\n\t\t\t\t\"..............bb\",  --  1\n\t\t\t\t\"..............cc\",  --  2\n\t\t\t\t\"..............dd\",  --  3\n\t\t\t\t\"..............ee\",  --  4\n\t\t\t\t\"..............ff\",  --  5\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"............aa..\",  --  0\n\t\t\t\t\"............bb..\",  --  1\n\t\t\t\t\"............cc..\",  --  2\n\t\t\t\t\"............dd..\",  --  3\n\t\t\t\t\"............ee..\",  --  4\n\t\t\t\t\"............ff..\",  --  5\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..........aa....\",  --  0\n\t\t\t\t\"..........bb....\",  --  1\n\t\t\t\t\"..........cc....\",  --  2\n\t\t\t\t\"..........dd....\",  --  3\n\t\t\t\t\"..........ee....\",  --  4\n\t\t\t\t\"..........ff....\",  --  5\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"........aa......\",  --  0\n\t\t\t\t\"........bb......\",  --  1\n\t\t\t\t\"........cc......\",  --  2\n\t\t\t\t\"........dd......\",  --  3\n\t\t\t\t\"........ee......\",  --  4\n\t\t\t\t\"........ff......\",  --  5\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"......aa........\",  --  0\n\t\t\t\t\"......bb........\",  --  1\n\t\t\t\t\"......cc........\",  --  2\n\t\t\t\t\"......dd........\",  --  3\n\t\t\t\t\"......ee........\",  --  4\n\t\t\t\t\"......ff........\",  --  5\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"....aa..........\",  --  0\n\t\t\t\t\"....bb..........\",  --  1\n\t\t\t\t\"....cc..........\",  --  2\n\t\t\t\t\"....dd..........\",  --  3\n\t\t\t\t\"....ee..........\",  --  4\n\t\t\t\t\"....ff..........\",  --  5\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"..aa............\",  --  0\n\t\t\t\t\"..bb............\",  --  1\n\t\t\t\t\"..cc............\",  --  2\n\t\t\t\t\"..dd............\",  --  3\n\t\t\t\t\"..ee............\",  --  4\n\t\t\t\t\"..ff............\",  --  5\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"aa..............\",  --  0\n\t\t\t\t\"bb..............\",  --  1\n\t\t\t\t\"cc..............\",  --  2\n\t\t\t\t\"dd..............\",  --  3\n\t\t\t\t\"ee..............\",  --  4\n\t\t\t\t\"ff..............\",  --  5\n\n\t\t\t},\n\t\t},  -- SlopeDownFromTopSingle\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CurveDownFromTopSingle\",\n\t\t\t\tName         = \"Cube 100\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"100\",\n\t\t\t\tID           = \"478\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 8,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -2,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 35:14\",  -- wool\n\t\t\t\t\"b: 35: 5\",  -- wool\n\t\t\t\t\"c: 35: 4\",  -- wool\n\t\t\t\t\"d: 35: 1\",  -- wool\n\t\t\t\t\"e: 35:11\",  -- wool\n\t\t\t\t\"f: 35: 3\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"..........a\",  --  8\n\t\t\t\t\".......bcda\",  --  9\n\t\t\t\t\".....efbcda\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"........cda\",  --  6\n\t\t\t\t\".......bcda\",  --  7\n\t\t\t\t\".......bcd.\",  --  8\n\t\t\t\t\".....ef....\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\".........a.\",  --  4\n\t\t\t\t\".......cdda\",  --  5\n\t\t\t\t\"......bc...\",  --  6\n\t\t\t\t\"......b....\",  --  7\n\t\t\t\t\".....ff....\",  --  8\n\t\t\t\t\"....ee.....\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"........aa.\",  --  3\n\t\t\t\t\"......ccd..\",  --  4\n\t\t\t\t\".....bb....\",  --  5\n\t\t\t\t\".....f.....\",  --  6\n\t\t\t\t\"....ef.....\",  --  7\n\t\t\t\t\"....e......\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"......daa..\",  --  2\n\t\t\t\t\".....ccd...\",  --  3\n\t\t\t\t\"....bb.....\",  --  4\n\t\t\t\t\"....f......\",  --  5\n\t\t\t\t\"...ef......\",  --  6\n\t\t\t\t\"...ee......\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".....daa...\",  --  1\n\t\t\t\t\"...ccd.....\",  --  2\n\t\t\t\t\"...bc......\",  --  3\n\t\t\t\t\"...b.......\",  --  4\n\t\t\t\t\"..ff.......\",  --  5\n\t\t\t\t\"..ee.......\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...aaa.....\",  --  0\n\t\t\t\t\"..ddd......\",  --  1\n\t\t\t\t\".cc........\",  --  2\n\t\t\t\t\".bb........\",  --  3\n\t\t\t\t\".ff........\",  --  4\n\t\t\t\t\".e.........\",  --  5\n\t\t\t\t\".ee........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"aaa........\",  --  0\n\t\t\t\t\"dd.........\",  --  1\n\t\t\t\t\"cc.........\",  --  2\n\t\t\t\t\"bb.........\",  --  3\n\t\t\t\t\"ff.........\",  --  4\n\t\t\t\t\"e..........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t},\n\t\t},  -- CurveDownFromTopSingle\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/PieceStructures/TestRails.cubeset",
    "content": "\n-- TestRails.cubeset\n\n-- Defines the prefabs in the group TestRails\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-12-03 15:53:05\",\n\t\t[\"GridSizeX\"] = \"10\",\n\t\t[\"GridSizeZ\"] = \"10\",\n\t\t[\"IntendedUse\"] = \"PieceStructures\",\n\t\t[\"MaxDepth\"] = \"0\",\n\t\t[\"MaxOffsetX\"] = \"1\",\n\t\t[\"MaxOffsetZ\"] = \"1\",\n\t\t[\"MaxStructureSizeX\"] = \"20\",\n\t\t[\"MaxStructureSizeZ\"] = \"20\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"RegularRail\",\n\t\t\t\tName         = \"Plains 247\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"247\",\n\t\t\t\tID           = \"742\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 3,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 66: 6\",  -- tracks\n\t\t\t\t\"d: 66: 2\",  -- tracks\n\t\t\t\t\"e: 66: 3\",  -- tracks\n\t\t\t\t\"f: 66: 7\",  -- tracks\n\t\t\t\t\"g: 66: 5\",  -- tracks\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 66: 4\",  -- tracks\n\t\t\t\t\"j: 66: 9\",  -- tracks\n\t\t\t\t\"k: 66: 8\",  -- tracks\n\t\t\t\t\"l: 66: 1\",  -- tracks\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 66: 0\",  -- tracks\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaab...\",  --  0\n\t\t\t\t\"abbbbb.\",  --  1\n\t\t\t\t\"abbb.b.\",  --  2\n\t\t\t\t\"bbbb.bb\",  --  3\n\t\t\t\t\".b...b.\",  --  4\n\t\t\t\t\".bbbbb.\",  --  5\n\t\t\t\t\"...b...\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".cdbef.\",  --  1\n\t\t\t\t\".gh..g.\",  --  2\n\t\t\t\t\".b.h.b.\",  --  3\n\t\t\t\t\".i...i.\",  --  4\n\t\t\t\t\".jdbek.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"...l...\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".n...n.\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"...l...\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- RegularRail\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"PowerRail\",\n\t\t\t\tName         = \"Plains 248\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"248\",\n\t\t\t\tID           = \"743\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 3,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 27: 0\",  -- poweredrail\n\t\t\t\t\"d: 27: 2\",  -- poweredrail\n\t\t\t\t\"e: 27: 3\",  -- poweredrail\n\t\t\t\t\"f: 27: 5\",  -- poweredrail\n\t\t\t\t\"g: 50: 5\",  -- torch\n\t\t\t\t\"h: 66: 0\",  -- tracks\n\t\t\t\t\"i: 66: 1\",  -- tracks\n\t\t\t\t\"j: 66: 8\",  -- tracks\n\t\t\t\t\"k: 27: 4\",  -- poweredrail\n\t\t\t\t\"l: 27: 1\",  -- poweredrail\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaab...\",  --  0\n\t\t\t\t\"abbbbb.\",  --  1\n\t\t\t\t\"abbb.b.\",  --  2\n\t\t\t\t\"bbbb.bb\",  --  3\n\t\t\t\t\".b...b.\",  --  4\n\t\t\t\t\".bbbbb.\",  --  5\n\t\t\t\t\"...b...\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".cdbec.\",  --  1\n\t\t\t\t\".fgh.f.\",  --  2\n\t\t\t\t\".bij.b.\",  --  3\n\t\t\t\t\".k...k.\",  --  4\n\t\t\t\t\".cdbec.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"...l...\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".c...c.\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"...l...\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- PowerRail\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CentralPiece\",\n\t\t\t\tName         = \"Plains 249\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"249\",\n\t\t\t\tID           = \"744\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 6,\n\t\t\t\ty = 3,\n\t\t\t\tz = 6,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 5,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillNonAir\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 66: 6\",  -- tracks\n\t\t\t\t\"d: 66: 2\",  -- tracks\n\t\t\t\t\"e: 66: 3\",  -- tracks\n\t\t\t\t\"f: 66: 7\",  -- tracks\n\t\t\t\t\"g: 66: 5\",  -- tracks\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 66: 0\",  -- tracks\n\t\t\t\t\"j: 66: 1\",  -- tracks\n\t\t\t\t\"k: 66: 8\",  -- tracks\n\t\t\t\t\"l: 66: 4\",  -- tracks\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 66: 9\",  -- tracks\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaab..\",  --  0\n\t\t\t\t\"abbbbb\",  --  1\n\t\t\t\t\"abbb.b\",  --  2\n\t\t\t\t\"bbbb.b\",  --  3\n\t\t\t\t\".b...b\",  --  4\n\t\t\t\t\".bbbbb\",  --  5\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"......\",  --  0\n\t\t\t\t\".cdbef\",  --  1\n\t\t\t\t\".ghi.g\",  --  2\n\t\t\t\t\".bjk.b\",  --  3\n\t\t\t\t\".l...l\",  --  4\n\t\t\t\t\".ndbek\",  --  5\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"......\",  --  0\n\t\t\t\t\"...j..\",  --  1\n\t\t\t\t\"......\",  --  2\n\t\t\t\t\".i...i\",  --  3\n\t\t\t\t\"......\",  --  4\n\t\t\t\t\"...j..\",  --  5\n\n\t\t\t},\n\t\t},  -- CentralPiece\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"DetectorRail\",\n\t\t\t\tName         = \"Plains 250\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"250\",\n\t\t\t\tID           = \"745\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 3,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 28: 0\",  -- detectorrail\n\t\t\t\t\"d: 28: 2\",  -- detectorrail\n\t\t\t\t\"e: 28: 3\",  -- detectorrail\n\t\t\t\t\"f: 28: 5\",  -- detectorrail\n\t\t\t\t\"g: 50: 5\",  -- torch\n\t\t\t\t\"h: 66: 0\",  -- tracks\n\t\t\t\t\"i: 66: 1\",  -- tracks\n\t\t\t\t\"j: 66: 8\",  -- tracks\n\t\t\t\t\"k: 28: 4\",  -- detectorrail\n\t\t\t\t\"l: 28: 1\",  -- detectorrail\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaab...\",  --  0\n\t\t\t\t\"abbbbb.\",  --  1\n\t\t\t\t\"abbb.b.\",  --  2\n\t\t\t\t\"bbbb.bb\",  --  3\n\t\t\t\t\".b...b.\",  --  4\n\t\t\t\t\".bbbbb.\",  --  5\n\t\t\t\t\"...b...\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".cdbec.\",  --  1\n\t\t\t\t\".fgh.f.\",  --  2\n\t\t\t\t\".bij.b.\",  --  3\n\t\t\t\t\".k...k.\",  --  4\n\t\t\t\t\".cdbec.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"...l...\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".c...c.\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"...l...\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- DetectorRail\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"ActivatorRail\",\n\t\t\t\tName         = \"Plains 251\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"251\",\n\t\t\t\tID           = \"746\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 3,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c:157: 0\",  -- activatorrail\n\t\t\t\t\"d:157: 2\",  -- activatorrail\n\t\t\t\t\"e:157: 3\",  -- activatorrail\n\t\t\t\t\"f:157: 5\",  -- activatorrail\n\t\t\t\t\"g: 50: 5\",  -- torch\n\t\t\t\t\"h: 66: 0\",  -- tracks\n\t\t\t\t\"i: 66: 1\",  -- tracks\n\t\t\t\t\"j: 66: 8\",  -- tracks\n\t\t\t\t\"k:157: 4\",  -- activatorrail\n\t\t\t\t\"l:157: 1\",  -- activatorrail\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaab...\",  --  0\n\t\t\t\t\"abbbbb.\",  --  1\n\t\t\t\t\"abbb.b.\",  --  2\n\t\t\t\t\"bbbb.bb\",  --  3\n\t\t\t\t\".b...b.\",  --  4\n\t\t\t\t\".bbbbb.\",  --  5\n\t\t\t\t\"...b...\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".cdbec.\",  --  1\n\t\t\t\t\".fgh.f.\",  --  2\n\t\t\t\t\".bij.b.\",  --  3\n\t\t\t\t\".k...k.\",  --  4\n\t\t\t\t\".cdbec.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"...l...\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".c...c.\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"...l...\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- ActivatorRail\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/PieceStructures/TreePaths.cubeset",
    "content": "\n-- TreePaths.cubeset\n\n-- Defines the prefabs in the group TreePaths\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-23 15:08:10\",\n\t\t[\"AllowedBiomes\"] = \"Jungle, JungleM, JungleHills, JungleEdge, JungleEdgeM\",\n\t\t[\"GridSizeX\"] = \"256\",\n\t\t[\"GridSizeZ\"] = \"256\",\n\t\t[\"IntendedUse\"] = \"PieceStructures\",\n\t\t[\"MaxDepth\"] = \"10\",\n\t\t[\"MaxOffsetX\"] = \"128\",\n\t\t[\"MaxOffsetZ\"] = \"128\",\n\t\t[\"MaxStructureSizeX\"] = \"256\",\n\t\t[\"MaxStructureSizeZ\"] = \"256\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CrossNoTop\",\n\t\t\t\tName         = \"Cube 140\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"140\",\n\t\t\t\tID           = \"1185\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 16,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -2,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 15,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 1,  -- Y+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"2\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalLimit\"] = \"AboveTerrainAndOcean|20|60\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 65: 2\",  -- ladder\n\t\t\t\t\"b: 17: 3\",  -- tree\n\t\t\t\t\"c: 65: 4\",  -- ladder\n\t\t\t\t\"d: 65: 5\",  -- ladder\n\t\t\t\t\"e: 65: 3\",  -- ladder\n\t\t\t\t\"f:  5: 3\",  -- planks\n\t\t\t\t\"g:190: 0\",  -- junglefence\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 50: 4\",  -- torch\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  2\n\t\t\t\t\"mmmmfffffffmmmm\",  --  3\n\t\t\t\t\"mmmfffffffffmmm\",  --  4\n\t\t\t\t\"mmmffffaffffmmm\",  --  5\n\t\t\t\t\"ffffffbbbffffff\",  --  6\n\t\t\t\t\"fffffcbbbdfffff\",  --  7\n\t\t\t\t\"ffffffbbbffffff\",  --  8\n\t\t\t\t\"mmmffffeffffmmm\",  --  9\n\t\t\t\t\"mmmfffffffffmmm\",  -- 10\n\t\t\t\t\"mmmmfffffffmmmm\",  -- 11\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  2\n\t\t\t\t\"mmmmggg.gggmmmm\",  --  3\n\t\t\t\t\"mmmgg.....ggmmm\",  --  4\n\t\t\t\t\"mmmg.......gmmm\",  --  5\n\t\t\t\t\"gggg..bbb..gggg\",  --  6\n\t\t\t\t\"......bbb......\",  --  7\n\t\t\t\t\"gggg..bbb..gggg\",  --  8\n\t\t\t\t\"mmmg.......gmmm\",  --  9\n\t\t\t\t\"mmmgg.....ggmmm\",  -- 10\n\t\t\t\t\"mmmmggg.gggmmmm\",  -- 11\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  1\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  2\n\t\t\t\t\"mmmm..h.h..mmmm\",  --  3\n\t\t\t\t\"mmm.h.....h.mmm\",  --  4\n\t\t\t\t\"mmm...i.i...mmm\",  --  5\n\t\t\t\t\"...h.jbbbk.h...\",  --  6\n\t\t\t\t\"......bbb......\",  --  7\n\t\t\t\t\"...h.jbbbk.h...\",  --  8\n\t\t\t\t\"mmm...l.l...mmm\",  --  9\n\t\t\t\t\"mmm.h.....h.mmm\",  -- 10\n\t\t\t\t\"mmmm..h.h..mmmm\",  -- 11\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 12\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 13\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t},\n\t\t},  -- CrossNoTop\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Tee\",\n\t\t\t\tName         = \"Cube 141\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"141\",\n\t\t\t\tID           = \"1186\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 16,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 15,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 1,  -- Y+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"4\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalLimit\"] = \"AboveTerrainAndOcean|20|60\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 65: 2\",  -- ladder\n\t\t\t\t\"b: 17: 3\",  -- tree\n\t\t\t\t\"c: 65: 4\",  -- ladder\n\t\t\t\t\"d: 65: 5\",  -- ladder\n\t\t\t\t\"e: 65: 3\",  -- ladder\n\t\t\t\t\"f:  5: 3\",  -- planks\n\t\t\t\t\"g:190: 0\",  -- junglefence\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 50: 4\",  -- torch\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  2\n\t\t\t\t\"mmmmfffffffmmmm\",  --  3\n\t\t\t\t\"mmmfffffffffmmm\",  --  4\n\t\t\t\t\"mmmffffaffffmmm\",  --  5\n\t\t\t\t\"ffffffbbbffffff\",  --  6\n\t\t\t\t\"fffffcbbbdfffff\",  --  7\n\t\t\t\t\"ffffffbbbffffff\",  --  8\n\t\t\t\t\"mmmffffeffffmmm\",  --  9\n\t\t\t\t\"mmmfffffffffmmm\",  -- 10\n\t\t\t\t\"mmmmfffffffmmmm\",  -- 11\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  2\n\t\t\t\t\"mmmmggg.gggmmmm\",  --  3\n\t\t\t\t\"mmmgg.....ggmmm\",  --  4\n\t\t\t\t\"mmmg...a...gmmm\",  --  5\n\t\t\t\t\"gggg..bbb..gggg\",  --  6\n\t\t\t\t\".....cbbbd.....\",  --  7\n\t\t\t\t\"gggg..bbb..gggg\",  --  8\n\t\t\t\t\"mmmg...e...gmmm\",  --  9\n\t\t\t\t\"mmmgg.....ggmmm\",  -- 10\n\t\t\t\t\"mmmmgggggggmmmm\",  -- 11\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  1\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  2\n\t\t\t\t\"mmmm..h.h..mmmm\",  --  3\n\t\t\t\t\"mmm.h.....h.mmm\",  --  4\n\t\t\t\t\"mmm...iai...mmm\",  --  5\n\t\t\t\t\"...h.jbbbk.h...\",  --  6\n\t\t\t\t\".....cbbbd.....\",  --  7\n\t\t\t\t\"...h.jbbbk.h...\",  --  8\n\t\t\t\t\"mmm...lel...mmm\",  --  9\n\t\t\t\t\"mmm.h.....h.mmm\",  -- 10\n\t\t\t\t\"mmmm..h.h..mmmm\",  -- 11\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t},\n\t\t},  -- Tee\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Corner\",\n\t\t\t\tName         = \"Cube 142\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"142\",\n\t\t\t\tID           = \"1187\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 16,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 15,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 1,  -- Y+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalLimit\"] = \"AboveTerrainAndOcean|20|60\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 65: 2\",  -- ladder\n\t\t\t\t\"b: 17: 3\",  -- tree\n\t\t\t\t\"c: 65: 4\",  -- ladder\n\t\t\t\t\"d: 65: 5\",  -- ladder\n\t\t\t\t\"e: 65: 3\",  -- ladder\n\t\t\t\t\"f:  5: 3\",  -- planks\n\t\t\t\t\"g:190: 0\",  -- junglefence\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 50: 4\",  -- torch\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmfffmmm\",  --  0\n\t\t\t\t\"mmmmmmfffmmm\",  --  1\n\t\t\t\t\"mmmmmmfffmmm\",  --  2\n\t\t\t\t\"mmmmfffffffm\",  --  3\n\t\t\t\t\"mmmfffffffff\",  --  4\n\t\t\t\t\"mmmffffaffff\",  --  5\n\t\t\t\t\"ffffffbbbfff\",  --  6\n\t\t\t\t\"fffffcbbbdff\",  --  7\n\t\t\t\t\"ffffffbbbfff\",  --  8\n\t\t\t\t\"mmmffffeffff\",  --  9\n\t\t\t\t\"mmmfffffffff\",  -- 10\n\t\t\t\t\"mmmmfffffffm\",  -- 11\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmg.gmmm\",  --  0\n\t\t\t\t\"mmmmmmg.gmmm\",  --  1\n\t\t\t\t\"mmmmmmg.gmmm\",  --  2\n\t\t\t\t\"mmmmggg.gggm\",  --  3\n\t\t\t\t\"mmmgg.....gg\",  --  4\n\t\t\t\t\"mmmg...a...g\",  --  5\n\t\t\t\t\"gggg..bbb..g\",  --  6\n\t\t\t\t\".....cbbbd.g\",  --  7\n\t\t\t\t\"gggg..bbb..g\",  --  8\n\t\t\t\t\"mmmg...e...g\",  --  9\n\t\t\t\t\"mmmgg.....gg\",  -- 10\n\t\t\t\t\"mmmmgggggggm\",  -- 11\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmm...mmm\",  --  0\n\t\t\t\t\"mmmmmm...mmm\",  --  1\n\t\t\t\t\"mmmmmm...mmm\",  --  2\n\t\t\t\t\"mmmm..h.h..m\",  --  3\n\t\t\t\t\"mmm.h.....h.\",  --  4\n\t\t\t\t\"mmm...iai...\",  --  5\n\t\t\t\t\"...h.jbbbk.h\",  --  6\n\t\t\t\t\".....cbbbd..\",  --  7\n\t\t\t\t\"...h.jbbbk.h\",  --  8\n\t\t\t\t\"mmm...lel...\",  --  9\n\t\t\t\t\"mmm.h.....h.\",  -- 10\n\t\t\t\t\"mmmm..h.h..m\",  -- 11\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\n\t\t\t},\n\t\t},  -- Corner\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TreeEnd\",\n\t\t\t\tName         = \"Cube 143\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"143\",\n\t\t\t\tID           = \"1188\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 16,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -3,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 15,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 1,  -- Y+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"8:10000|9:10000\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalLimit\"] = \"AboveTerrainAndOcean|10|70\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 65: 2\",  -- ladder\n\t\t\t\t\"b: 17: 3\",  -- tree\n\t\t\t\t\"c: 65: 4\",  -- ladder\n\t\t\t\t\"d: 65: 5\",  -- ladder\n\t\t\t\t\"e: 65: 3\",  -- ladder\n\t\t\t\t\"f:  5: 3\",  -- planks\n\t\t\t\t\"g:190: 0\",  -- junglefence\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 50: 4\",  -- torch\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmfffffffm\",  --  0\n\t\t\t\t\"mmmfffffffff\",  --  1\n\t\t\t\t\"mmmffffaffff\",  --  2\n\t\t\t\t\"ffffffbbbfff\",  --  3\n\t\t\t\t\"fffffcbbbdff\",  --  4\n\t\t\t\t\"ffffffbbbfff\",  --  5\n\t\t\t\t\"mmmffffeffff\",  --  6\n\t\t\t\t\"mmmfffffffff\",  --  7\n\t\t\t\t\"mmmmfffffffm\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmgggggggm\",  --  0\n\t\t\t\t\"mmmgg.....gg\",  --  1\n\t\t\t\t\"mmmg...a...g\",  --  2\n\t\t\t\t\"gggg..bbb..g\",  --  3\n\t\t\t\t\".....cbbbd.g\",  --  4\n\t\t\t\t\"gggg..bbb..g\",  --  5\n\t\t\t\t\"mmmg...e...g\",  --  6\n\t\t\t\t\"mmmgg.....gg\",  --  7\n\t\t\t\t\"mmmmgggggggm\",  --  8\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmm..h.h..m\",  --  0\n\t\t\t\t\"mmm.h.....h.\",  --  1\n\t\t\t\t\"mmm...iai...\",  --  2\n\t\t\t\t\"...h.jbbbk.h\",  --  3\n\t\t\t\t\".....cbbbd..\",  --  4\n\t\t\t\t\"...h.jbbbk.h\",  --  5\n\t\t\t\t\"mmm...lel...\",  --  6\n\t\t\t\t\"mmm.h.....h.\",  --  7\n\t\t\t\t\"mmmm..h.h..m\",  --  8\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t},\n\t\t},  -- TreeEnd\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TreeStraight\",\n\t\t\t\tName         = \"Cube 144\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"144\",\n\t\t\t\tID           = \"1189\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 16,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -3,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 15,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 1,  -- Y+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalLimit\"] = \"AboveTerrainAndOcean|20|60\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 65: 2\",  -- ladder\n\t\t\t\t\"b: 17: 3\",  -- tree\n\t\t\t\t\"c: 65: 4\",  -- ladder\n\t\t\t\t\"d: 65: 5\",  -- ladder\n\t\t\t\t\"e: 65: 3\",  -- ladder\n\t\t\t\t\"f:  5: 3\",  -- planks\n\t\t\t\t\"g:190: 0\",  -- junglefence\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 50: 4\",  -- torch\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmfffffffmmmm\",  --  0\n\t\t\t\t\"mmmfffffffffmmm\",  --  1\n\t\t\t\t\"mmmffffaffffmmm\",  --  2\n\t\t\t\t\"ffffffbbbffffff\",  --  3\n\t\t\t\t\"fffffcbbbdfffff\",  --  4\n\t\t\t\t\"ffffffbbbffffff\",  --  5\n\t\t\t\t\"mmmffffeffffmmm\",  --  6\n\t\t\t\t\"mmmfffffffffmmm\",  --  7\n\t\t\t\t\"mmmmfffffffmmmm\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmgggggggmmmm\",  --  0\n\t\t\t\t\"mmmgg.....ggmmm\",  --  1\n\t\t\t\t\"mmmg...a...gmmm\",  --  2\n\t\t\t\t\"gggg..bbb..gggg\",  --  3\n\t\t\t\t\".....cbbbd.....\",  --  4\n\t\t\t\t\"gggg..bbb..gggg\",  --  5\n\t\t\t\t\"mmmg...e...gmmm\",  --  6\n\t\t\t\t\"mmmgg.....ggmmm\",  --  7\n\t\t\t\t\"mmmmgggggggmmmm\",  --  8\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmm..h.h..mmmm\",  --  0\n\t\t\t\t\"mmm.h.....h.mmm\",  --  1\n\t\t\t\t\"mmm...iai...mmm\",  --  2\n\t\t\t\t\"...h.jbbbk.h...\",  --  3\n\t\t\t\t\".....cbbbd.....\",  --  4\n\t\t\t\t\"...h.jbbbk.h...\",  --  5\n\t\t\t\t\"mmm...lel...mmm\",  --  6\n\t\t\t\t\"mmm.h.....h.mmm\",  --  7\n\t\t\t\t\"mmmm..h.h..mmmm\",  --  8\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t},\n\t\t},  -- TreeStraight\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TreePaths_1190\",\n\t\t\t\tName         = \"Cube 145\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"145\",\n\t\t\t\tID           = \"1190\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 4,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -4,\n\t\t\t\tMinZ = -3,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 3\",  -- planks\n\t\t\t\t\"b:190: 0\",  -- junglefence\n\t\t\t\t\"c: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...c...c...c...\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...c...c...c...\",  --  2\n\n\t\t\t},\n\t\t},  -- TreePaths_1190\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"StartingCross\",\n\t\t\t\tName         = \"Cube 146\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"146\",\n\t\t\t\tID           = \"1191\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 16,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 15,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 1,  -- Y+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|30|40\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 65: 2\",  -- ladder\n\t\t\t\t\"b: 17: 3\",  -- tree\n\t\t\t\t\"c: 65: 4\",  -- ladder\n\t\t\t\t\"d: 65: 5\",  -- ladder\n\t\t\t\t\"e: 65: 3\",  -- ladder\n\t\t\t\t\"f:  5: 3\",  -- planks\n\t\t\t\t\"g:190: 0\",  -- junglefence\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 50: 4\",  -- torch\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  2\n\t\t\t\t\"mmmmfffffffmmmm\",  --  3\n\t\t\t\t\"mmmfffffffffmmm\",  --  4\n\t\t\t\t\"mmmffffaffffmmm\",  --  5\n\t\t\t\t\"ffffffbbbffffff\",  --  6\n\t\t\t\t\"fffffcbbbdfffff\",  --  7\n\t\t\t\t\"ffffffbbbffffff\",  --  8\n\t\t\t\t\"mmmffffeffffmmm\",  --  9\n\t\t\t\t\"mmmfffffffffmmm\",  -- 10\n\t\t\t\t\"mmmmfffffffmmmm\",  -- 11\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  2\n\t\t\t\t\"mmmmggg.gggmmmm\",  --  3\n\t\t\t\t\"mmmgg.....ggmmm\",  --  4\n\t\t\t\t\"mmmg...a...gmmm\",  --  5\n\t\t\t\t\"gggg..bbb..gggg\",  --  6\n\t\t\t\t\".....cbbbd.....\",  --  7\n\t\t\t\t\"gggg..bbb..gggg\",  --  8\n\t\t\t\t\"mmmg...e...gmmm\",  --  9\n\t\t\t\t\"mmmgg.....ggmmm\",  -- 10\n\t\t\t\t\"mmmmggg.gggmmmm\",  -- 11\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  1\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  2\n\t\t\t\t\"mmmm..h.h..mmmm\",  --  3\n\t\t\t\t\"mmm.h.....h.mmm\",  --  4\n\t\t\t\t\"mmm...iai...mmm\",  --  5\n\t\t\t\t\"...h.jbbbk.h...\",  --  6\n\t\t\t\t\".....cbbbd.....\",  --  7\n\t\t\t\t\"...h.jbbbk.h...\",  --  8\n\t\t\t\t\"mmm...lel...mmm\",  --  9\n\t\t\t\t\"mmm.h.....h.mmm\",  -- 10\n\t\t\t\t\"mmmm..h.h..mmmm\",  -- 11\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 12\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 13\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t},\n\t\t},  -- StartingCross\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CrossNoBottom\",\n\t\t\t\tName         = \"Cube 147\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"147\",\n\t\t\t\tID           = \"1192\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 16,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 15,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 1,  -- Y+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"5\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalLimit\"] = \"AboveTerrainAndOcean|20|60\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 17: 3\",  -- tree\n\t\t\t\t\"b:  5: 3\",  -- planks\n\t\t\t\t\"c:190: 0\",  -- junglefence\n\t\t\t\t\"d: 65: 2\",  -- ladder\n\t\t\t\t\"e: 65: 4\",  -- ladder\n\t\t\t\t\"f: 65: 5\",  -- ladder\n\t\t\t\t\"g: 65: 3\",  -- ladder\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 50: 4\",  -- torch\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  2\n\t\t\t\t\"mmmmbbbbbbbmmmm\",  --  3\n\t\t\t\t\"mmmbbbbbbbbbmmm\",  --  4\n\t\t\t\t\"mmmbbbbbbbbbmmm\",  --  5\n\t\t\t\t\"bbbbbbaaabbbbbb\",  --  6\n\t\t\t\t\"bbbbbbaaabbbbbb\",  --  7\n\t\t\t\t\"bbbbbbaaabbbbbb\",  --  8\n\t\t\t\t\"mmmbbbbbbbbbmmm\",  --  9\n\t\t\t\t\"mmmbbbbbbbbbmmm\",  -- 10\n\t\t\t\t\"mmmmbbbbbbbmmmm\",  -- 11\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmc.cmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmc.cmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmc.cmmmmmm\",  --  2\n\t\t\t\t\"mmmmccc.cccmmmm\",  --  3\n\t\t\t\t\"mmmcc.....ccmmm\",  --  4\n\t\t\t\t\"mmmc...d...cmmm\",  --  5\n\t\t\t\t\"cccc..aaa..cccc\",  --  6\n\t\t\t\t\".....eaaaf.....\",  --  7\n\t\t\t\t\"cccc..aaa..cccc\",  --  8\n\t\t\t\t\"mmmc...g...cmmm\",  --  9\n\t\t\t\t\"mmmcc.....ccmmm\",  -- 10\n\t\t\t\t\"mmmmccc.cccmmmm\",  -- 11\n\t\t\t\t\"mmmmmmc.cmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmc.cmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmc.cmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  1\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  2\n\t\t\t\t\"mmmm..h.h..mmmm\",  --  3\n\t\t\t\t\"mmm.h.....h.mmm\",  --  4\n\t\t\t\t\"mmm...idi...mmm\",  --  5\n\t\t\t\t\"...h.jaaak.h...\",  --  6\n\t\t\t\t\".....eaaaf.....\",  --  7\n\t\t\t\t\"...h.jaaak.h...\",  --  8\n\t\t\t\t\"mmm...lgl...mmm\",  --  9\n\t\t\t\t\"mmm.h.....h.mmm\",  -- 10\n\t\t\t\t\"mmmm..h.h..mmmm\",  -- 11\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 12\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 13\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmdmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmeaaafmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmgmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmdmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmeaaafmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmgmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmdmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmeaaafmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmgmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmdmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmeaaafmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmgmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmdmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmeaaafmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmgmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmdmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmeaaafmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmgmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmdmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmeaaafmmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmgmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t},\n\t\t},  -- CrossNoBottom\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TreePaths_1193\",\n\t\t\t\tName         = \"Cube 148\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"148\",\n\t\t\t\tID           = \"1193\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 4,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -4,\n\t\t\t\tMinZ = -3,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"500\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 3\",  -- planks\n\t\t\t\t\"b:190: 0\",  -- junglefence\n\t\t\t\t\"c: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaa\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbbbbbbbbb\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"bbbbbbbbbbb\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...c...c...\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...c...c...\",  --  2\n\n\t\t\t},\n\t\t},  -- TreePaths_1193\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TreePaths_1194\",\n\t\t\t\tName         = \"Cube 149\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"149\",\n\t\t\t\tID           = \"1194\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 4,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -4,\n\t\t\t\tMinZ = -3,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 3\",  -- planks\n\t\t\t\t\"b:190: 0\",  -- junglefence\n\t\t\t\t\"c: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmm\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbbbbb\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"bbbbbbb\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...c...\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"...c...\",  --  2\n\n\t\t\t},\n\t\t},  -- TreePaths_1194\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Curve\",\n\t\t\t\tName         = \"Cube 150\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"150\",\n\t\t\t\tID           = \"1195\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 4,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -4,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 3\",  -- planks\n\t\t\t\t\"b:190: 0\",  -- junglefence\n\t\t\t\t\"c: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaammmmmmmmmmmm\",  --  0\n\t\t\t\t\"aaaaaammmmmmmmmm\",  --  1\n\t\t\t\t\"aaaaaaaammmmmmmm\",  --  2\n\t\t\t\t\"maaaaaaaammmmmmm\",  --  3\n\t\t\t\t\"mmmaaaaaaammmmmm\",  --  4\n\t\t\t\t\"mmmmmaaaaaammmmm\",  --  5\n\t\t\t\t\"mmmmmmaaaaaammmm\",  --  6\n\t\t\t\t\"mmmmmmmaaaaaammm\",  --  7\n\t\t\t\t\"mmmmmmmmaaaaaamm\",  --  8\n\t\t\t\t\"mmmmmmmmmaaaaamm\",  --  9\n\t\t\t\t\"mmmmmmmmmmaaaaam\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmaaaam\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmaaaaa\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmaaaa\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmaaaa\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmaaa\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbbmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"...bbbmmmmmmmmmm\",  --  1\n\t\t\t\t\"bb...bbbmmmmmmmm\",  --  2\n\t\t\t\t\"mbbb...bbmmmmmmm\",  --  3\n\t\t\t\t\"mmmbbb..bbmmmmmm\",  --  4\n\t\t\t\t\"mmmmmbb..bbmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbb..bbmmmm\",  --  6\n\t\t\t\t\"mmmmmmmbb..bbmmm\",  --  7\n\t\t\t\t\"mmmmmmmmbb..bbmm\",  --  8\n\t\t\t\t\"mmmmmmmmmbb..bmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmbb.bbm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmb..bm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmbb.bb\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmb..b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmbb.b\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmb.b\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...cmmmmmmmmmmmm\",  --  0\n\t\t\t\t\".....cmmmmmmmmmm\",  --  1\n\t\t\t\t\"........mmmmmmmm\",  --  2\n\t\t\t\t\"mc......cmmmmmmm\",  --  3\n\t\t\t\t\"mmmc......mmmmmm\",  --  4\n\t\t\t\t\"mmmmmc...c.mmmmm\",  --  5\n\t\t\t\t\"mmmmmm.....cmmmm\",  --  6\n\t\t\t\t\"mmmmmmmc.....mmm\",  --  7\n\t\t\t\t\"mmmmmmmm.....cmm\",  --  8\n\t\t\t\t\"mmmmmmmmmc....mm\",  --  9\n\t\t\t\t\"mmmmmmmmmm.....m\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm....m\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmc...c\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmm....\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmc...\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmm...\",  -- 15\n\n\t\t\t},\n\t\t},  -- Curve\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TreePaths_1196\",\n\t\t\t\tName         = \"Cube 151\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"151\",\n\t\t\t\tID           = \"1196\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 6,\n\t\t\t\ty = 6,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -4,\n\t\t\t\tMinZ = -3,\n\t\t\t\tMaxX = 5,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 4,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalLimit\"] = \"AboveTerrainAndOcean|20|60\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 3\",  -- planks\n\t\t\t\t\"b:190: 0\",  -- junglefence\n\t\t\t\t\"c: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmm\",  --  0\n\t\t\t\t\"mmmmmm\",  --  1\n\t\t\t\t\"mmmmmm\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaammm\",  --  0\n\t\t\t\t\"aaammm\",  --  1\n\t\t\t\t\"aaammm\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbaaam\",  --  0\n\t\t\t\t\"..aaam\",  --  1\n\t\t\t\t\"bbaaam\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".bbbaa\",  --  0\n\t\t\t\t\"....aa\",  --  1\n\t\t\t\t\".bbbaa\",  --  2\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".c.bbb\",  --  0\n\t\t\t\t\"......\",  --  1\n\t\t\t\t\".c.bbb\",  --  2\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...c..\",  --  0\n\t\t\t\t\"......\",  --  1\n\t\t\t\t\"...c..\",  --  2\n\n\t\t\t},\n\t\t},  -- TreePaths_1196\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"TreePaths_1197\",\n\t\t\t\tName         = \"Cube 152\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"152\",\n\t\t\t\tID           = \"1197\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 8,\n\t\t\t\ty = 7,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -4,\n\t\t\t\tMinZ = -2,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 10,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalLimit\"] = \"AboveTerrainAndOcean|20|60\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 3\",  -- planks\n\t\t\t\t\"b:190: 0\",  -- junglefence\n\t\t\t\t\"c: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmm\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaammmmm\",  --  0\n\t\t\t\t\"aaammmmm\",  --  1\n\t\t\t\t\"aaammmmm\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbaaammm\",  --  0\n\t\t\t\t\"..aaammm\",  --  1\n\t\t\t\t\"bbaaammm\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".bbbaaam\",  --  0\n\t\t\t\t\"....aaam\",  --  1\n\t\t\t\t\".bbbaaam\",  --  2\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".c.bbbaa\",  --  0\n\t\t\t\t\"......aa\",  --  1\n\t\t\t\t\".c.bbbaa\",  --  2\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...c.bbb\",  --  0\n\t\t\t\t\"........\",  --  1\n\t\t\t\t\"...c.bbb\",  --  2\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".....c..\",  --  0\n\t\t\t\t\"........\",  --  1\n\t\t\t\t\".....c..\",  --  2\n\n\t\t\t},\n\t\t},  -- TreePaths_1197\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CrossTreetop\",\n\t\t\t\tName         = \"Cube 153\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"153\",\n\t\t\t\tID           = \"1198\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 19,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 18,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 14,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 0,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 7,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"2\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 65: 2\",  -- ladder\n\t\t\t\t\"b: 17: 3\",  -- tree\n\t\t\t\t\"c: 65: 4\",  -- ladder\n\t\t\t\t\"d: 65: 5\",  -- ladder\n\t\t\t\t\"e: 65: 3\",  -- ladder\n\t\t\t\t\"f:  5: 3\",  -- planks\n\t\t\t\t\"g:190: 0\",  -- junglefence\n\t\t\t\t\"h: 50: 5\",  -- torch\n\t\t\t\t\"i: 50: 4\",  -- torch\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 18: 7\",  -- leaves\n\t\t\t\t\"o: 18: 3\",  -- leaves\n\t\t\t\t\"p: 18:11\",  -- leaves\n\t\t\t\t\"q: 17:11\",  -- tree\n\t\t\t\t\"r: 17: 7\",  -- tree\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmammmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcbbbdmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmemmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmfffmmmmmm\",  --  2\n\t\t\t\t\"mmmmfffffffmmmm\",  --  3\n\t\t\t\t\"mmmfffffffffmmm\",  --  4\n\t\t\t\t\"mmmffffaffffmmm\",  --  5\n\t\t\t\t\"ffffffbbbffffff\",  --  6\n\t\t\t\t\"fffffcbbbdfffff\",  --  7\n\t\t\t\t\"ffffffbbbffffff\",  --  8\n\t\t\t\t\"mmmffffeffffmmm\",  --  9\n\t\t\t\t\"mmmfffffffffmmm\",  -- 10\n\t\t\t\t\"mmmmfffffffmmmm\",  -- 11\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmfffmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  --  2\n\t\t\t\t\"mmmmggg.gggmmmm\",  --  3\n\t\t\t\t\"mmmgg.....ggmmm\",  --  4\n\t\t\t\t\"mmmg.......gmmm\",  --  5\n\t\t\t\t\"gggg..bbb..gggg\",  --  6\n\t\t\t\t\"......bbb......\",  --  7\n\t\t\t\t\"gggg..bbb..gggg\",  --  8\n\t\t\t\t\"mmmg.......gmmm\",  --  9\n\t\t\t\t\"mmmgg.....ggmmm\",  -- 10\n\t\t\t\t\"mmmmggg.gggmmmm\",  -- 11\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmg.gmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  0\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  1\n\t\t\t\t\"mmmmmm...mmmmmm\",  --  2\n\t\t\t\t\"mmmm..h.h..mmmm\",  --  3\n\t\t\t\t\"mmm.h.....h.mmm\",  --  4\n\t\t\t\t\"mmm...i.i...mmm\",  --  5\n\t\t\t\t\"...h.jbbbk.h...\",  --  6\n\t\t\t\t\"......bbb......\",  --  7\n\t\t\t\t\"...h.jbbbk.h...\",  --  8\n\t\t\t\t\"mmm...l.l...mmm\",  --  9\n\t\t\t\t\"mmm.h.....h.mmm\",  -- 10\n\t\t\t\t\"mmmm..h.h..mmmm\",  -- 11\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 12\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 13\n\t\t\t\t\"mmmmmm...mmmmmm\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmnnnmmmmmm\",  --  3\n\t\t\t\t\"mmmmnooooonmmmm\",  --  4\n\t\t\t\t\"mmmmooooooommmm\",  --  5\n\t\t\t\t\"mmmnoobbboonmmm\",  --  6\n\t\t\t\t\"mmmnoobbboonmmm\",  --  7\n\t\t\t\t\"mmmnoobbboonmmm\",  --  8\n\t\t\t\t\"mmmmoopoooommmm\",  --  9\n\t\t\t\t\"mmmmnoooopnmmmm\",  -- 10\n\t\t\t\t\"mmmmmmnnnmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmm.poo.mmmmm\",  --  2\n\t\t\t\t\"mmmmnpooponmmmm\",  --  3\n\t\t\t\t\"mmmnnopqoonnmmm\",  --  4\n\t\t\t\t\"mm.ooooqoooo.mm\",  --  5\n\t\t\t\t\"mmooopbbboooomm\",  --  6\n\t\t\t\t\"mmoorrbbbrropmm\",  --  7\n\t\t\t\t\"mmpoopbbboooomm\",  --  8\n\t\t\t\t\"mm.poooqoooo.mm\",  --  9\n\t\t\t\t\"mmmnnooqopnnmmm\",  -- 10\n\t\t\t\t\"mmmmnoopoonmmmm\",  -- 11\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  --  2\n\t\t\t\t\"mmm.ooooooo.mmm\",  --  3\n\t\t\t\t\"mmmpooopooopmmm\",  --  4\n\t\t\t\t\"mm.oobooobop.mm\",  --  5\n\t\t\t\t\"mmooooobopopomm\",  --  6\n\t\t\t\t\"mmpooobbboooomm\",  --  7\n\t\t\t\t\"mmooopobooooomm\",  --  8\n\t\t\t\t\"mm.ooboooboo.mm\",  --  9\n\t\t\t\t\"mmmooooooooommm\",  -- 10\n\t\t\t\t\"mmm.ooooooo.mmm\",  -- 11\n\t\t\t\t\"mmmmm.opp.mmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmm.opoooop.mmm\",  --  3\n\t\t\t\t\"mmmopooooopommm\",  --  4\n\t\t\t\t\"mmmppooooooommm\",  --  5\n\t\t\t\t\"mmmoooobooopmmm\",  --  6\n\t\t\t\t\"mmmpopbbbopommm\",  --  7\n\t\t\t\t\"mmmoooobpooommm\",  --  8\n\t\t\t\t\"mmmooooooooommm\",  --  9\n\t\t\t\t\"mmmooooooooommm\",  -- 10\n\t\t\t\t\"mmm.ooooooo.mmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmooooommmmm\",  --  4\n\t\t\t\t\"mmmmooooooommmm\",  --  5\n\t\t\t\t\"mmmmooobooommmm\",  --  6\n\t\t\t\t\"mmmmoobbbopmmmm\",  --  7\n\t\t\t\t\"mmmmooobooommmm\",  --  8\n\t\t\t\t\"mmmmopooooommmm\",  --  9\n\t\t\t\t\"mmmmmooooommmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  --  3\n\t\t\t\t\"mmmmmooooommmmm\",  --  4\n\t\t\t\t\"mmm.ooobooo.mmm\",  --  5\n\t\t\t\t\"mmmoooopoooommm\",  --  6\n\t\t\t\t\"mmmoobpboboommm\",  --  7\n\t\t\t\t\"mmmooooooooommm\",  --  8\n\t\t\t\t\"mmm.opobooo.mmm\",  --  9\n\t\t\t\t\"mmmmmopoppmmmmm\",  -- 10\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  --  3\n\t\t\t\t\"mmmmmooooommmmm\",  --  4\n\t\t\t\t\"mmm.pooopoo.mmm\",  --  5\n\t\t\t\t\"mmmoooopoooommm\",  --  6\n\t\t\t\t\"mmmopooboooommm\",  --  7\n\t\t\t\t\"mmmooooooooommm\",  --  8\n\t\t\t\t\"mmm.oooopoo.mmm\",  --  9\n\t\t\t\t\"mmmmmpoooommmmm\",  -- 10\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmommmmmmm\",  --  4\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  --  5\n\t\t\t\t\"mmmmmopopommmmm\",  --  6\n\t\t\t\t\"mmmmooobooommmm\",  --  7\n\t\t\t\t\"mmmmmpoooommmmm\",  --  8\n\t\t\t\t\"mmmmm.opo.mmmmm\",  --  9\n\t\t\t\t\"mmmmmmmommmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 17\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  --  5\n\t\t\t\t\"mmmmmooooommmmm\",  --  6\n\t\t\t\t\"mmmmmpoooommmmm\",  --  7\n\t\t\t\t\"mmmmmooppommmmm\",  --  8\n\t\t\t\t\"mmmmm.ooo.mmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 18\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmommmmmmm\",  --  6\n\t\t\t\t\"mmmmmmooommmmmm\",  --  7\n\t\t\t\t\"mmmmmmmommmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t},\n\t\t},  -- CrossTreetop\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LadderTreetop\",\n\t\t\t\tName         = \"Cube 154\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"154\",\n\t\t\t\tID           = \"1199\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 19,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 18,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10000\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 65: 2\",  -- ladder\n\t\t\t\t\"b: 17: 3\",  -- tree\n\t\t\t\t\"c: 65: 4\",  -- ladder\n\t\t\t\t\"d: 65: 5\",  -- ladder\n\t\t\t\t\"e: 65: 3\",  -- ladder\n\t\t\t\t\"f: 18: 7\",  -- leaves\n\t\t\t\t\"g: 18: 3\",  -- leaves\n\t\t\t\t\"h: 18:11\",  -- leaves\n\t\t\t\t\"i: 17:11\",  -- tree\n\t\t\t\t\"j: 17: 7\",  -- tree\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmammmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmcbbbdmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmemmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmammmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmcbbbdmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmemmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmammmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmcbbbdmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmemmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmammmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmcbbbdmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmemmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmammmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmcbbbdmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmemmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmammmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmcbbbdmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmemmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmammmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmcbbbdmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmemmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmmbbbmmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmbbbmmmm\",  --  4\n\t\t\t\t\"mmmmbbbmmmm\",  --  5\n\t\t\t\t\"mmmmbbbmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmfffmmmm\",  --  1\n\t\t\t\t\"mmfghhghfmm\",  --  2\n\t\t\t\t\"mmghghhggmm\",  --  3\n\t\t\t\t\"mfghbbbhhfm\",  --  4\n\t\t\t\t\"mfghbbbhhfm\",  --  5\n\t\t\t\t\"mfhhbbbhhfm\",  --  6\n\t\t\t\t\"mmhgghhhgmm\",  --  7\n\t\t\t\t\"mmfhhghhfmm\",  --  8\n\t\t\t\t\"mmmmfffmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmm.ghg.mmm\",  --  0\n\t\t\t\t\"mmfhhhhgfmm\",  --  1\n\t\t\t\t\"mffhgihgffm\",  --  2\n\t\t\t\t\".ggggihhhh.\",  --  3\n\t\t\t\t\"hhhhbbbhhhh\",  --  4\n\t\t\t\t\"hhjjbbbjjgg\",  --  5\n\t\t\t\t\"hhghbbbghhh\",  --  6\n\t\t\t\t\".gghgighgh.\",  --  7\n\t\t\t\t\"mffggihhffm\",  --  8\n\t\t\t\t\"mmfgghhhfmm\",  --  9\n\t\t\t\t\"mmm.hhh.mmm\",  -- 10\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmm.hhg.mmm\",  --  0\n\t\t\t\t\"m.hhghhgg.m\",  --  1\n\t\t\t\t\"mhghggghhhm\",  --  2\n\t\t\t\t\".hgbgggbhh.\",  --  3\n\t\t\t\t\"hghghbhghhh\",  --  4\n\t\t\t\t\"ghhhbbbhhhh\",  --  5\n\t\t\t\t\"hhhhhbhhghh\",  --  6\n\t\t\t\t\".ggbhghbgh.\",  --  7\n\t\t\t\t\"mhghhgghghm\",  --  8\n\t\t\t\t\"m.hhhhghg.m\",  --  9\n\t\t\t\t\"mmm.hhh.mmm\",  -- 10\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"m.ghghggg.m\",  --  1\n\t\t\t\t\"mghhhgghhgm\",  --  2\n\t\t\t\t\"mghhhghhhgm\",  --  3\n\t\t\t\t\"mhghhbhghhm\",  --  4\n\t\t\t\t\"mghgbbbghhm\",  --  5\n\t\t\t\t\"mgghgbhhhhm\",  --  6\n\t\t\t\t\"mhghhghhghm\",  --  7\n\t\t\t\t\"mhghhhgghhm\",  --  8\n\t\t\t\t\"m.gghghgh.m\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmhgghhmmm\",  --  2\n\t\t\t\t\"mmggghhhgmm\",  --  3\n\t\t\t\t\"mmghgbhghmm\",  --  4\n\t\t\t\t\"mmggbbbghmm\",  --  5\n\t\t\t\t\"mmgghbhhhmm\",  --  6\n\t\t\t\t\"mmhghhhhhmm\",  --  7\n\t\t\t\t\"mmmhhhhhmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmm.ghh.mmm\",  --  1\n\t\t\t\t\"mmmhhghhmmm\",  --  2\n\t\t\t\t\"m.hggbhgh.m\",  --  3\n\t\t\t\t\"mghhhghhhhm\",  --  4\n\t\t\t\t\"mhhbgbhbggm\",  --  5\n\t\t\t\t\"mhhhghghhgm\",  --  6\n\t\t\t\t\"m.hghbghh.m\",  --  7\n\t\t\t\t\"mmmhhhggmmm\",  --  8\n\t\t\t\t\"mmm.hhg.mmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmm.ggh.mmm\",  --  1\n\t\t\t\t\"mmmghghgmmm\",  --  2\n\t\t\t\t\"m.ghghghh.m\",  --  3\n\t\t\t\t\"mhghhhghhhm\",  --  4\n\t\t\t\t\"mgghhbhhghm\",  --  5\n\t\t\t\t\"mhhghhghhhm\",  --  6\n\t\t\t\t\"m.ghgghhh.m\",  --  7\n\t\t\t\t\"mmmhhhhhmmm\",  --  8\n\t\t\t\t\"mmm.hhh.mmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmgmmmmm\",  --  2\n\t\t\t\t\"mmm.hhh.mmm\",  --  3\n\t\t\t\t\"mmmhhhhhmmm\",  --  4\n\t\t\t\t\"mmgghbhhhmm\",  --  5\n\t\t\t\t\"mmmhhhghmmm\",  --  6\n\t\t\t\t\"mmm.hhg.mmm\",  --  7\n\t\t\t\t\"mmmmmhmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 17\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmm.hhg.mmm\",  --  3\n\t\t\t\t\"mmmghghgmmm\",  --  4\n\t\t\t\t\"mmmhhghgmmm\",  --  5\n\t\t\t\t\"mmmhhghgmmm\",  --  6\n\t\t\t\t\"mmm.hhh.mmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 18\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmhmmmmm\",  --  4\n\t\t\t\t\"mmmmhggmmmm\",  --  5\n\t\t\t\t\"mmmmmgmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t},\n\t\t},  -- LadderTreetop\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BareTreetop\",\n\t\t\t\tName         = \"Cube 155\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"155\",\n\t\t\t\tID           = \"1200\",\n\t\t\t\tCreatorName  = \"xoft2\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 19,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 18,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 0,  -- Y-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10000\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 17: 3\",  -- tree\n\t\t\t\t\"b: 18: 7\",  -- leaves\n\t\t\t\t\"c: 18:11\",  -- leaves\n\t\t\t\t\"d: 18: 3\",  -- leaves\n\t\t\t\t\"e: 17:11\",  -- tree\n\t\t\t\t\"f: 17: 7\",  -- tree\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.mmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmm.aaa.mmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmm.mmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.mmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmm.aaa.mmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmm.mmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.mmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmm.aaa.mmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmm.mmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.mmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmm.aaa.mmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmm.mmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.mmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmm.aaa.mmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmm.mmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.mmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmm.aaa.mmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmm.mmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmm.mmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmm.aaa.mmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmm.mmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmmmaaammmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmmmaaammmm\",  --  5\n\t\t\t\t\"mmmmaaammmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmbbbmmmm\",  --  1\n\t\t\t\t\"mmbcccccbmm\",  --  2\n\t\t\t\t\"mmcccccccmm\",  --  3\n\t\t\t\t\"mbdcaaacdbm\",  --  4\n\t\t\t\t\"mbdcaaaccbm\",  --  5\n\t\t\t\t\"mbccaaaccbm\",  --  6\n\t\t\t\t\"mmccdcdccmm\",  --  7\n\t\t\t\t\"mmbcdcdcbmm\",  --  8\n\t\t\t\t\"mmmmbbbmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmm.ccc.mmm\",  --  0\n\t\t\t\t\"mmbccdccbmm\",  --  1\n\t\t\t\t\"mbbcceccbbm\",  --  2\n\t\t\t\t\".cdccecccc.\",  --  3\n\t\t\t\t\"ccccaaacccc\",  --  4\n\t\t\t\t\"ccffaaaffcc\",  --  5\n\t\t\t\t\"cdccaaaccdc\",  --  6\n\t\t\t\t\".ccccedccc.\",  --  7\n\t\t\t\t\"mbbcceccbbm\",  --  8\n\t\t\t\t\"mmbcccccbmm\",  --  9\n\t\t\t\t\"mmm.ccd.mmm\",  -- 10\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmm.ccc.mmm\",  --  0\n\t\t\t\t\"m.cccdccc.m\",  --  1\n\t\t\t\t\"mccdccccccm\",  --  2\n\t\t\t\t\".ccacccacd.\",  --  3\n\t\t\t\t\"cccccaccccc\",  --  4\n\t\t\t\t\"ccccaaacccc\",  --  5\n\t\t\t\t\"dccccaccccc\",  --  6\n\t\t\t\t\".dcacccacc.\",  --  7\n\t\t\t\t\"mcdccdccccm\",  --  8\n\t\t\t\t\"m.ccccccc.m\",  --  9\n\t\t\t\t\"mmm.ccc.mmm\",  -- 10\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"m.ccccccd.m\",  --  1\n\t\t\t\t\"mdcdccccccm\",  --  2\n\t\t\t\t\"mcccccccccm\",  --  3\n\t\t\t\t\"mccccaccccm\",  --  4\n\t\t\t\t\"mdccaaacdcm\",  --  5\n\t\t\t\t\"mccdcaccccm\",  --  6\n\t\t\t\t\"mcccccccccm\",  --  7\n\t\t\t\t\"mcdcccccccm\",  --  8\n\t\t\t\t\"m.ccccccc.m\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmddccdmmm\",  --  2\n\t\t\t\t\"mmccccccdmm\",  --  3\n\t\t\t\t\"mmdccacccmm\",  --  4\n\t\t\t\t\"mmccaaaccmm\",  --  5\n\t\t\t\t\"mmcdcacccmm\",  --  6\n\t\t\t\t\"mmcccccccmm\",  --  7\n\t\t\t\t\"mmmcccccmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmm.ccd.mmm\",  --  1\n\t\t\t\t\"mmmcdcccmmm\",  --  2\n\t\t\t\t\"m.cccaccc.m\",  --  3\n\t\t\t\t\"mdcccccdccm\",  --  4\n\t\t\t\t\"mcdadacaccm\",  --  5\n\t\t\t\t\"mccccccccdm\",  --  6\n\t\t\t\t\"m.ccdaccc.m\",  --  7\n\t\t\t\t\"mmmcccccmmm\",  --  8\n\t\t\t\t\"mmm.ccc.mmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmm.dcc.mmm\",  --  1\n\t\t\t\t\"mmmcccccmmm\",  --  2\n\t\t\t\t\"m.ccccccc.m\",  --  3\n\t\t\t\t\"mcdcdcccccm\",  --  4\n\t\t\t\t\"mccccacccdm\",  --  5\n\t\t\t\t\"mcccccccccm\",  --  6\n\t\t\t\t\"m.dcccccc.m\",  --  7\n\t\t\t\t\"mmmcccdcmmm\",  --  8\n\t\t\t\t\"mmm.ccc.mmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmcmmmmm\",  --  2\n\t\t\t\t\"mmm.ccc.mmm\",  --  3\n\t\t\t\t\"mmmcccccmmm\",  --  4\n\t\t\t\t\"mmccdacccmm\",  --  5\n\t\t\t\t\"mmmcdcccmmm\",  --  6\n\t\t\t\t\"mmm.ccc.mmm\",  --  7\n\t\t\t\t\"mmmmmcmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 17\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmm.ccc.mmm\",  --  3\n\t\t\t\t\"mmmcccccmmm\",  --  4\n\t\t\t\t\"mmmcccdcmmm\",  --  5\n\t\t\t\t\"mmmcccccmmm\",  --  6\n\t\t\t\t\"mmm.ccc.mmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 18\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmcmmmmm\",  --  4\n\t\t\t\t\"mmmmcccmmmm\",  --  5\n\t\t\t\t\"mmmmmcmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t},\n\t\t},  -- BareTreetop\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/PieceStructures/UnderwaterBase.cubeset",
    "content": "\n-- UnderwaterBase.cubeset\n\n-- Defines the prefabs in the group UnderwaterBase\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-23 15:08:06\",\n\t\t[\"GridSizeX\"] = \"384\",\n\t\t[\"GridSizeZ\"] = \"384\",\n\t\t[\"IntendedUse\"] = \"PieceStructures\",\n\t\t[\"MaxDepth\"] = \"12\",\n\t\t[\"MaxOffsetX\"] = \"128\",\n\t\t[\"MaxOffsetZ\"] = \"128\",\n\t\t[\"MaxStructureSizeX\"] = \"128\",\n\t\t[\"MaxStructureSizeZ\"] = \"128\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CentralRoom\",\n\t\t\t\tName         = \"Water 24\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"24\",\n\t\t\t\tID           = \"564\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 7,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-11\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 20: 0\",  -- glass\n\t\t\t\t\"d: 64: 3\",  -- wooddoorblock\n\t\t\t\t\"e: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"f: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"g: 64: 1\",  -- wooddoorblock\n\t\t\t\t\"h: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"i: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"j: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"k: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"l: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"o:125: 8\",  -- woodendoubleslab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmbbbbbbmmmmm\",  --  4\n\t\t\t\t\"mmmmbbbccbbbmmmm\",  --  5\n\t\t\t\t\"mmmbbbccccbbbmmm\",  --  6\n\t\t\t\t\"abbbbccccccbbbba\",  --  7\n\t\t\t\t\"abbbbccccccbbbba\",  --  8\n\t\t\t\t\"mmmbbbccccbbbmmm\",  --  9\n\t\t\t\t\"mmmmbbbccbbbmmmm\",  -- 10\n\t\t\t\t\"mmmmmbbbbbbmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmaammmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmaddammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmmmbb..bbmmmmm\",  --  3\n\t\t\t\t\"mmmmbb....bbmmmm\",  --  4\n\t\t\t\t\"mmmbb......bbmmm\",  --  5\n\t\t\t\t\"abbb........bbba\",  --  6\n\t\t\t\t\"e..............f\",  --  7\n\t\t\t\t\"e..............f\",  --  8\n\t\t\t\t\"abbb........bbba\",  --  9\n\t\t\t\t\"mmmbb......bbmmm\",  -- 10\n\t\t\t\t\"mmmmbb....bbmmmm\",  -- 11\n\t\t\t\t\"mmmmmbb..bbmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmaggammmmmm\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmahiammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  --  3\n\t\t\t\t\"mmmmcc....ccmmmm\",  --  4\n\t\t\t\t\"mmmcc......ccmmm\",  --  5\n\t\t\t\t\"abbc........cbba\",  --  6\n\t\t\t\t\"i..............h\",  --  7\n\t\t\t\t\"h..............i\",  --  8\n\t\t\t\t\"abbc........cbba\",  --  9\n\t\t\t\t\"mmmcc......ccmmm\",  -- 10\n\t\t\t\t\"mmmmcc....ccmmmm\",  -- 11\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmaihammmmmm\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmaaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  2\n\t\t\t\t\"mmmmmbb..bbmmmmm\",  --  3\n\t\t\t\t\"mmmmbb....bbmmmm\",  --  4\n\t\t\t\t\"mmmbb......bbmmm\",  --  5\n\t\t\t\t\"abbb........bbba\",  --  6\n\t\t\t\t\"abb..........bba\",  --  7\n\t\t\t\t\"abb..........bba\",  --  8\n\t\t\t\t\"abbb........bbba\",  --  9\n\t\t\t\t\"mmmbb......bbmmm\",  -- 10\n\t\t\t\t\"mmmmbb....bbmmmm\",  -- 11\n\t\t\t\t\"mmmmmbb..bbmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmaaaammmmmm\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmbjjbmmmmmm\",  --  4\n\t\t\t\t\"mmmmmb....bmmmmm\",  --  5\n\t\t\t\t\"mmmmb......bmmmm\",  --  6\n\t\t\t\t\"mmmbk......lbmmm\",  --  7\n\t\t\t\t\"mmmbk......lbmmm\",  --  8\n\t\t\t\t\"mmmmb......bmmmm\",  --  9\n\t\t\t\t\"mmmmmb....bmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmbnnbmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb....bmmmmm\",  --  6\n\t\t\t\t\"mmmmb......bmmmm\",  --  7\n\t\t\t\t\"mmmmb......bmmmm\",  --  8\n\t\t\t\t\"mmmmmb....bmmmmm\",  --  9\n\t\t\t\t\"mmmmmmboobmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmbbccbbmmmmm\",  --  7\n\t\t\t\t\"mmmmmbbccbbmmmmm\",  --  8\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t},\n\t\t},  -- CentralRoom\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Corridor16\",\n\t\t\t\tName         = \"Water 25\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"25\",\n\t\t\t\tID           = \"566\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 4,\n\t\t\t\tz = 4,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 3,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"500\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"d: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"e: 20: 0\",  -- glass\n\t\t\t\t\"f: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"g: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"h: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"i: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  1\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  0\n\t\t\t\t\"c..............d\",  --  1\n\t\t\t\t\"c..............d\",  --  2\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  3\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"abeebbbeebbbeeba\",  --  0\n\t\t\t\t\"f...g......g...h\",  --  1\n\t\t\t\t\"h...i......i...f\",  --  2\n\t\t\t\t\"abeebbbeebbbeeba\",  --  3\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  0\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  1\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  2\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  3\n\n\t\t\t},\n\t\t},  -- Corridor16\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CorridorCorner\",\n\t\t\t\tName         = \"Water 26\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"26\",\n\t\t\t\tID           = \"569\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 4,\n\t\t\t\tz = 10,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 9,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 9,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"200\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"d: 64: 1\",  -- wooddoorblock\n\t\t\t\t\"e: 20: 0\",  -- glass\n\t\t\t\t\"f: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"g: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"h: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"i: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"j: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"k: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmm\",  --  0\n\t\t\t\t\"abbbbbmmmm\",  --  1\n\t\t\t\t\"abbbbbbbmm\",  --  2\n\t\t\t\t\"mmmbbbbbmm\",  --  3\n\t\t\t\t\"mmmmmbbbbm\",  --  4\n\t\t\t\t\"mmmmmmbbbm\",  --  5\n\t\t\t\t\"mmmmmmbbbm\",  --  6\n\t\t\t\t\"mmmmmmmbbm\",  --  7\n\t\t\t\t\"mmmmmmmbbm\",  --  8\n\t\t\t\t\"mmmmmmmaam\",  --  9\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"abbbbbmmmm\",  --  0\n\t\t\t\t\"c.....bbmm\",  --  1\n\t\t\t\t\"c.......bm\",  --  2\n\t\t\t\t\"abb.....bm\",  --  3\n\t\t\t\t\"mmmbb....b\",  --  4\n\t\t\t\t\"mmmmmb...b\",  --  5\n\t\t\t\t\"mmmmmb...b\",  --  6\n\t\t\t\t\"mmmmmmb..b\",  --  7\n\t\t\t\t\"mmmmmmb..b\",  --  8\n\t\t\t\t\"mmmmmmadda\",  --  9\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"abeebbmmmm\",  --  0\n\t\t\t\t\"f...g.bbmm\",  --  1\n\t\t\t\t\"h.......bm\",  --  2\n\t\t\t\t\"abbi....bm\",  --  3\n\t\t\t\t\"mmmbb....b\",  --  4\n\t\t\t\t\"mmmmmb..jb\",  --  5\n\t\t\t\t\"mmmmmbk..e\",  --  6\n\t\t\t\t\"mmmmmmb..e\",  --  7\n\t\t\t\t\"mmmmmmb..b\",  --  8\n\t\t\t\t\"mmmmmmafha\",  --  9\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"abbbbbmmmm\",  --  0\n\t\t\t\t\"abbbbbbbmm\",  --  1\n\t\t\t\t\"abbbbbbbbm\",  --  2\n\t\t\t\t\"abbbbbbbbm\",  --  3\n\t\t\t\t\"mmmbbbbbbb\",  --  4\n\t\t\t\t\"mmmmmbbbbb\",  --  5\n\t\t\t\t\"mmmmmbbbbb\",  --  6\n\t\t\t\t\"mmmmmmbbbb\",  --  7\n\t\t\t\t\"mmmmmmbbbb\",  --  8\n\t\t\t\t\"mmmmmmaaaa\",  --  9\n\n\t\t\t},\n\t\t},  -- CorridorCorner\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"ViewingCorridor\",\n\t\t\t\tName         = \"Water 27\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"27\",\n\t\t\t\tID           = \"571\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 5,\n\t\t\t\tz = 6,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 4,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b:  5: 5\",  -- planks\n\t\t\t\t\"c: 20: 0\",  -- glass\n\t\t\t\t\"d: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"e: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"f: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"g: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"h: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"i: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  0\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  1\n\t\t\t\t\"baaccccccccccaab\",  --  2\n\t\t\t\t\"baaccccccccccaab\",  --  3\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  4\n\t\t\t\t\"mmmaaaaaaaaaammm\",  --  5\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmaccccccccccamm\",  --  0\n\t\t\t\t\"ba............ab\",  --  1\n\t\t\t\t\"d..............e\",  --  2\n\t\t\t\t\"d..............e\",  --  3\n\t\t\t\t\"ba............ab\",  --  4\n\t\t\t\t\"mmaccccccccccamm\",  --  5\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmaccccccccccamm\",  --  0\n\t\t\t\t\"baf..........fab\",  --  1\n\t\t\t\t\"g..............h\",  --  2\n\t\t\t\t\"h..............g\",  --  3\n\t\t\t\t\"bai..........iab\",  --  4\n\t\t\t\t\"mmaccccccccccamm\",  --  5\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmaccccccccccamm\",  --  0\n\t\t\t\t\"ba............ab\",  --  1\n\t\t\t\t\"ba............ab\",  --  2\n\t\t\t\t\"ba............ab\",  --  3\n\t\t\t\t\"ba............ab\",  --  4\n\t\t\t\t\"mmaccccccccccamm\",  --  5\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmaaaaaaaaaammm\",  --  0\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  1\n\t\t\t\t\"mmaccccccccccamm\",  --  2\n\t\t\t\t\"mmaccccccccccamm\",  --  3\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  4\n\t\t\t\t\"mmmaaaaaaaaaammm\",  --  5\n\n\t\t\t},\n\t\t},  -- ViewingCorridor\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CorridorTee\",\n\t\t\t\tName         = \"Water 29\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"29\",\n\t\t\t\tID           = \"576\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 4,\n\t\t\t\tz = 10,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 64: 3\",  -- wooddoorblock\n\t\t\t\t\"d: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"e: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"f: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"g: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"h: 20: 0\",  -- glass\n\t\t\t\t\"i: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"j: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"k: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"l: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  6\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  7\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmaccammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  5\n\t\t\t\t\"abbbbbb..bbbbbba\",  --  6\n\t\t\t\t\"d..............e\",  --  7\n\t\t\t\t\"d..............e\",  --  8\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  9\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmafgammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmh..hmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmh..hmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmbijbmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  5\n\t\t\t\t\"abhhbbb..bbbhhba\",  --  6\n\t\t\t\t\"g...k......k...f\",  --  7\n\t\t\t\t\"f...l......l...g\",  --  8\n\t\t\t\t\"abhhbbbhhbbbhhba\",  --  9\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmaaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  5\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  6\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  7\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  8\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  9\n\n\t\t\t},\n\t\t},  -- CorridorTee\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CorridorCrossing\",\n\t\t\t\tName         = \"Water 31\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"31\",\n\t\t\t\tID           = \"581\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 4,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 64: 3\",  -- wooddoorblock\n\t\t\t\t\"d: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"e: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"f: 64: 1\",  -- wooddoorblock\n\t\t\t\t\"g: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"h: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"i: 20: 0\",  -- glass\n\t\t\t\t\"j: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"k: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"l: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 76: 4\",  -- redstonetorchon\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  6\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  7\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  8\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmaammmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmaccammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  5\n\t\t\t\t\"abbbbbb..bbbbbba\",  --  6\n\t\t\t\t\"d..............e\",  --  7\n\t\t\t\t\"d..............e\",  --  8\n\t\t\t\t\"abbbbbb..bbbbbba\",  --  9\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmaffammmmmm\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmaghammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmi..immmmmm\",  --  2\n\t\t\t\t\"mmmmmmi..immmmmm\",  --  3\n\t\t\t\t\"mmmmmmbjkbmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  5\n\t\t\t\t\"abiibbb..bbbiiba\",  --  6\n\t\t\t\t\"h...l......l...g\",  --  7\n\t\t\t\t\"g...n......n...h\",  --  8\n\t\t\t\t\"abiibbb..bbbiiba\",  --  9\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmbjkbmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmi..immmmmm\",  -- 12\n\t\t\t\t\"mmmmmmi..immmmmm\",  -- 13\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmahgammmmmm\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmaaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  5\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  6\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  7\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  8\n\t\t\t\t\"abbbbbbbbbbbbbba\",  --  9\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmaaaammmmmm\",  -- 15\n\n\t\t\t},\n\t\t},  -- CorridorCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CorridorStairs\",\n\t\t\t\tName         = \"Water 32\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"32\",\n\t\t\t\tID           = \"582\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 9,\n\t\t\t\tz = 4,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 3,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 6,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 6,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"d: 53: 0\",  -- woodstairs\n\t\t\t\t\"e: 20: 0\",  -- glass\n\t\t\t\t\"f: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"g: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"h: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"i: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"j: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"abbbbbbbmmmmmmmm\",  --  1\n\t\t\t\t\"abbbbbbbmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"abbbbbbbmmmmmmmm\",  --  0\n\t\t\t\t\"c.....dbbmmmmmmm\",  --  1\n\t\t\t\t\"c.....dbbmmmmmmm\",  --  2\n\t\t\t\t\"abbbbbbbmmmmmmmm\",  --  3\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"abeebbbbbmmmmmmm\",  --  0\n\t\t\t\t\"f...g..dbbmmmmmm\",  --  1\n\t\t\t\t\"h...i..dbbmmmmmm\",  --  2\n\t\t\t\t\"abeebbbbbmmmmmmm\",  --  3\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"abbbbbbbbbmmmmmm\",  --  0\n\t\t\t\t\"abbbb...dbbmmmmm\",  --  1\n\t\t\t\t\"abbbb...dbbmmmmm\",  --  2\n\t\t\t\t\"abbbbbbbbbmmmmmm\",  --  3\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmbbbbbmmmmmm\",  --  0\n\t\t\t\t\"mmmmmb...dbbmmmm\",  --  1\n\t\t\t\t\"mmmmmb...dbbmmmm\",  --  2\n\t\t\t\t\"mmmmmbbbbbmmmmmm\",  --  3\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmbbbbbmmmmm\",  --  0\n\t\t\t\t\"mmmmmmb...dbbbba\",  --  1\n\t\t\t\t\"mmmmmmb...dbbbba\",  --  2\n\t\t\t\t\"mmmmmmbbbbbmmmmm\",  --  3\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmbbbbbbbba\",  --  0\n\t\t\t\t\"mmmmmmmb.......j\",  --  1\n\t\t\t\t\"mmmmmmmb.......j\",  --  2\n\t\t\t\t\"mmmmmmmbbbbbbbba\",  --  3\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmbbbeebba\",  --  0\n\t\t\t\t\"mmmmmmmmb.g....h\",  --  1\n\t\t\t\t\"mmmmmmmmb.i....f\",  --  2\n\t\t\t\t\"mmmmmmmmbbbeebba\",  --  3\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmbbbbbba\",  --  0\n\t\t\t\t\"mmmmmmmmmbbbbbba\",  --  1\n\t\t\t\t\"mmmmmmmmmbbbbbba\",  --  2\n\t\t\t\t\"mmmmmmmmmbbbbbba\",  --  3\n\n\t\t\t},\n\t\t},  -- CorridorStairs\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"ViewingCrossing\",\n\t\t\t\tName         = \"Water 38\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"38\",\n\t\t\t\tID           = \"611\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 7,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"50\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 20: 0\",  -- glass\n\t\t\t\t\"d: 64: 3\",  -- wooddoorblock\n\t\t\t\t\"e: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"f: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"g: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"h: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"i: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"j: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"k: 64: 1\",  -- wooddoorblock\n\t\t\t\t\"l: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 64: 9\",  -- wooddoorblock\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmbbccbbmmmmm\",  --  4\n\t\t\t\t\"mmmmbbccccbbmmmm\",  --  5\n\t\t\t\t\"mmmbbccccccbbmmm\",  --  6\n\t\t\t\t\"abbbccccccccbbba\",  --  7\n\t\t\t\t\"abbbccccccccbbba\",  --  8\n\t\t\t\t\"mmmbbccccccbbmmm\",  --  9\n\t\t\t\t\"mmmmbbccccbbmmmm\",  -- 10\n\t\t\t\t\"mmmmmbbccbbmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmaammmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmaddammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmmmbbefbbmmmmm\",  --  3\n\t\t\t\t\"mmmmbb....bbmmmm\",  --  4\n\t\t\t\t\"mmmbb......bbmmm\",  --  5\n\t\t\t\t\"abbb........bbba\",  --  6\n\t\t\t\t\"g..h........h..i\",  --  7\n\t\t\t\t\"g..j........j..i\",  --  8\n\t\t\t\t\"abbb........bbba\",  --  9\n\t\t\t\t\"mmmbb......bbmmm\",  -- 10\n\t\t\t\t\"mmmmbb....bbmmmm\",  -- 11\n\t\t\t\t\"mmmmmbbefbbmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmakkammmmmm\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmalnammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  --  2\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  --  3\n\t\t\t\t\"mmmmcc....ccmmmm\",  --  4\n\t\t\t\t\"mmmcc......ccmmm\",  --  5\n\t\t\t\t\"abcc........ccba\",  --  6\n\t\t\t\t\"n..............l\",  --  7\n\t\t\t\t\"l..............n\",  --  8\n\t\t\t\t\"abcc........ccba\",  --  9\n\t\t\t\t\"mmmcc......ccmmm\",  -- 10\n\t\t\t\t\"mmmmcc....ccmmmm\",  -- 11\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmanlammmmmm\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmaaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmccccmmmmmm\",  --  2\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  --  3\n\t\t\t\t\"mmmmcc....ccmmmm\",  --  4\n\t\t\t\t\"mmmcc......ccmmm\",  --  5\n\t\t\t\t\"abcc........ccba\",  --  6\n\t\t\t\t\"abc..........cba\",  --  7\n\t\t\t\t\"abc..........cba\",  --  8\n\t\t\t\t\"abcc........ccba\",  --  9\n\t\t\t\t\"mmmcc......ccmmm\",  -- 10\n\t\t\t\t\"mmmmcc....ccmmmm\",  -- 11\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmccccmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmaaaammmmmm\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  --  4\n\t\t\t\t\"mmmmmc....cmmmmm\",  --  5\n\t\t\t\t\"mmmmc......cmmmm\",  --  6\n\t\t\t\t\"mmmc........cmmm\",  --  7\n\t\t\t\t\"mmmc........cmmm\",  --  8\n\t\t\t\t\"mmmmc......cmmmm\",  --  9\n\t\t\t\t\"mmmmmc....cmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  --  5\n\t\t\t\t\"mmmmmc....cmmmmm\",  --  6\n\t\t\t\t\"mmmmc......cmmmm\",  --  7\n\t\t\t\t\"mmmmc......cmmmm\",  --  8\n\t\t\t\t\"mmmmmc....cmmmmm\",  --  9\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmccccmmmmmm\",  --  6\n\t\t\t\t\"mmmmmccccccmmmmm\",  --  7\n\t\t\t\t\"mmmmmccccccmmmmm\",  --  8\n\t\t\t\t\"mmmmmmccccmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t},\n\t\t},  -- ViewingCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"ViewingTee\",\n\t\t\t\tName         = \"Water 39\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"39\",\n\t\t\t\tID           = \"612\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 7,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"75\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 20: 0\",  -- glass\n\t\t\t\t\"d: 64: 3\",  -- wooddoorblock\n\t\t\t\t\"e: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"f: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"g: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"h: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"i: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"j: 64: 1\",  -- wooddoorblock\n\t\t\t\t\"k: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"l: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmmbbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmbbccbbmmmmm\",  --  4\n\t\t\t\t\"mmbbccccbbmmmm\",  --  5\n\t\t\t\t\"mbbccccccbbmmm\",  --  6\n\t\t\t\t\"mbccccccccbbba\",  --  7\n\t\t\t\t\"mbccccccccbbba\",  --  8\n\t\t\t\t\"mbbccccccbbmmm\",  --  9\n\t\t\t\t\"mmbbccccbbmmmm\",  -- 10\n\t\t\t\t\"mmmbbccbbmmmmm\",  -- 11\n\t\t\t\t\"mmmmbbbbmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmaammmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmaddammmmmm\",  --  0\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmbbefbbmmmmm\",  --  3\n\t\t\t\t\"mmbb....bbmmmm\",  --  4\n\t\t\t\t\"mbb......bbmmm\",  --  5\n\t\t\t\t\"mb........bbba\",  --  6\n\t\t\t\t\"be........g..h\",  --  7\n\t\t\t\t\"be........i..h\",  --  8\n\t\t\t\t\"mb........bbba\",  --  9\n\t\t\t\t\"mbb......bbmmm\",  -- 10\n\t\t\t\t\"mmbb....bbmmmm\",  -- 11\n\t\t\t\t\"mmmbbefbbmmmmm\",  -- 12\n\t\t\t\t\"mmmmb..bmmmmmm\",  -- 13\n\t\t\t\t\"mmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmajjammmmmm\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmaklammmmmm\",  --  0\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmc..cmmmmmm\",  --  2\n\t\t\t\t\"mmmcc..ccmmmmm\",  --  3\n\t\t\t\t\"mmcc....ccmmmm\",  --  4\n\t\t\t\t\"mcc......ccmmm\",  --  5\n\t\t\t\t\"mc........ccba\",  --  6\n\t\t\t\t\"c............k\",  --  7\n\t\t\t\t\"c............l\",  --  8\n\t\t\t\t\"mc........ccba\",  --  9\n\t\t\t\t\"mcc......ccmmm\",  -- 10\n\t\t\t\t\"mmcc....ccmmmm\",  -- 11\n\t\t\t\t\"mmmcc..ccmmmmm\",  -- 12\n\t\t\t\t\"mmmmc..cmmmmmm\",  -- 13\n\t\t\t\t\"mmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmalkammmmmm\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmaaaammmmmm\",  --  0\n\t\t\t\t\"mmmmbbbbmmmmmm\",  --  1\n\t\t\t\t\"mmmmccccmmmmmm\",  --  2\n\t\t\t\t\"mmmcc..ccmmmmm\",  --  3\n\t\t\t\t\"mmcc....ccmmmm\",  --  4\n\t\t\t\t\"mcc......ccmmm\",  --  5\n\t\t\t\t\"mc........ccba\",  --  6\n\t\t\t\t\"c..........cba\",  --  7\n\t\t\t\t\"c..........cba\",  --  8\n\t\t\t\t\"mc........ccba\",  --  9\n\t\t\t\t\"mcc......ccmmm\",  -- 10\n\t\t\t\t\"mmcc....ccmmmm\",  -- 11\n\t\t\t\t\"mmmcc..ccmmmmm\",  -- 12\n\t\t\t\t\"mmmmccccmmmmmm\",  -- 13\n\t\t\t\t\"mmmmbbbbmmmmmm\",  -- 14\n\t\t\t\t\"mmmmaaaammmmmm\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmccmmmmmmm\",  --  3\n\t\t\t\t\"mmmmc..cmmmmmm\",  --  4\n\t\t\t\t\"mmmc....cmmmmm\",  --  5\n\t\t\t\t\"mmc......cmmmm\",  --  6\n\t\t\t\t\"mc........cmmm\",  --  7\n\t\t\t\t\"mc........cmmm\",  --  8\n\t\t\t\t\"mmc......cmmmm\",  --  9\n\t\t\t\t\"mmmc....cmmmmm\",  -- 10\n\t\t\t\t\"mmmmc..cmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmccmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmccmmmmmmm\",  --  4\n\t\t\t\t\"mmmmc..cmmmmmm\",  --  5\n\t\t\t\t\"mmmc....cmmmmm\",  --  6\n\t\t\t\t\"mmc......cmmmm\",  --  7\n\t\t\t\t\"mmc......cmmmm\",  --  8\n\t\t\t\t\"mmmc....cmmmmm\",  --  9\n\t\t\t\t\"mmmmc..cmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmccmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmccmmmmmmm\",  --  5\n\t\t\t\t\"mmmmccccmmmmmm\",  --  6\n\t\t\t\t\"mmmccccccmmmmm\",  --  7\n\t\t\t\t\"mmmccccccmmmmm\",  --  8\n\t\t\t\t\"mmmmccccmmmmmm\",  --  9\n\t\t\t\t\"mmmmmccmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t},\n\t\t},  -- ViewingTee\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"ViewingCorner\",\n\t\t\t\tName         = \"Water 40\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"40\",\n\t\t\t\tID           = \"613\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 7,\n\t\t\t\tz = 14,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 13,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 13,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 20: 0\",  -- glass\n\t\t\t\t\"c:  5: 5\",  -- planks\n\t\t\t\t\"d: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"e: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"f: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"g: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"h: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"i: 64: 1\",  -- wooddoorblock\n\t\t\t\t\"j: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"k: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmaaaammmmmm\",  --  1\n\t\t\t\t\"mmmaabbaammmmm\",  --  2\n\t\t\t\t\"mmaabbbbaammmm\",  --  3\n\t\t\t\t\"maabbbbbbaammm\",  --  4\n\t\t\t\t\"mabbbbbbbbaaac\",  --  5\n\t\t\t\t\"mabbbbbbbbaaac\",  --  6\n\t\t\t\t\"maabbbbbbaammm\",  --  7\n\t\t\t\t\"mmaabbbbaammmm\",  --  8\n\t\t\t\t\"mmmaabbaammmmm\",  --  9\n\t\t\t\t\"mmmmaaaammmmmm\",  -- 10\n\t\t\t\t\"mmmmmaammmmmmm\",  -- 11\n\t\t\t\t\"mmmmmaammmmmmm\",  -- 12\n\t\t\t\t\"mmmmmccmmmmmmm\",  -- 13\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmaaddaammmmm\",  --  1\n\t\t\t\t\"mmaa....aammmm\",  --  2\n\t\t\t\t\"maa......aammm\",  --  3\n\t\t\t\t\"ma........aaac\",  --  4\n\t\t\t\t\"ae........d..f\",  --  5\n\t\t\t\t\"ae........g..f\",  --  6\n\t\t\t\t\"ma........aaac\",  --  7\n\t\t\t\t\"maa......aammm\",  --  8\n\t\t\t\t\"mmaa....aammmm\",  --  9\n\t\t\t\t\"mmmaaehaammmmm\",  -- 10\n\t\t\t\t\"mmmma..ammmmmm\",  -- 11\n\t\t\t\t\"mmmma..ammmmmm\",  -- 12\n\t\t\t\t\"mmmmciicmmmmmm\",  -- 13\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  0\n\t\t\t\t\"mmmbb..bbmmmmm\",  --  1\n\t\t\t\t\"mmbb....bbmmmm\",  --  2\n\t\t\t\t\"mbb......bbmmm\",  --  3\n\t\t\t\t\"mb........bbac\",  --  4\n\t\t\t\t\"b............j\",  --  5\n\t\t\t\t\"b............k\",  --  6\n\t\t\t\t\"mb........bbac\",  --  7\n\t\t\t\t\"mbb......bbmmm\",  --  8\n\t\t\t\t\"mmbb....bbmmmm\",  --  9\n\t\t\t\t\"mmmbb..bbmmmmm\",  -- 10\n\t\t\t\t\"mmmmb..bmmmmmm\",  -- 11\n\t\t\t\t\"mmmma..ammmmmm\",  -- 12\n\t\t\t\t\"mmmmckjcmmmmmm\",  -- 13\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  0\n\t\t\t\t\"mmmbb..bbmmmmm\",  --  1\n\t\t\t\t\"mmbb....bbmmmm\",  --  2\n\t\t\t\t\"mbb......bbmmm\",  --  3\n\t\t\t\t\"mb........bbac\",  --  4\n\t\t\t\t\"b..........bac\",  --  5\n\t\t\t\t\"b..........bac\",  --  6\n\t\t\t\t\"mb........bbac\",  --  7\n\t\t\t\t\"mbb......bbmmm\",  --  8\n\t\t\t\t\"mmbb....bbmmmm\",  --  9\n\t\t\t\t\"mmmbb..bbmmmmm\",  -- 10\n\t\t\t\t\"mmmmbbbbmmmmmm\",  -- 11\n\t\t\t\t\"mmmmaaaammmmmm\",  -- 12\n\t\t\t\t\"mmmmccccmmmmmm\",  -- 13\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  1\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmb....bmmmmm\",  --  3\n\t\t\t\t\"mmb......bmmmm\",  --  4\n\t\t\t\t\"mb........bmmm\",  --  5\n\t\t\t\t\"mb........bmmm\",  --  6\n\t\t\t\t\"mmb......bmmmm\",  --  7\n\t\t\t\t\"mmmb....bmmmmm\",  --  8\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  9\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 13\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  3\n\t\t\t\t\"mmmb....bmmmmm\",  --  4\n\t\t\t\t\"mmb......bmmmm\",  --  5\n\t\t\t\t\"mmb......bmmmm\",  --  6\n\t\t\t\t\"mmmb....bmmmmm\",  --  7\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  8\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 13\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  3\n\t\t\t\t\"mmmmbbbbmmmmmm\",  --  4\n\t\t\t\t\"mmmbbbbbbmmmmm\",  --  5\n\t\t\t\t\"mmmbbbbbbmmmmm\",  --  6\n\t\t\t\t\"mmmmbbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 13\n\n\t\t\t},\n\t\t},  -- ViewingCorner\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"ViewingEnd\",\n\t\t\t\tName         = \"Water 41\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"41\",\n\t\t\t\tID           = \"614\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 7,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"200\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 20: 0\",  -- glass\n\t\t\t\t\"c:  5: 5\",  -- planks\n\t\t\t\t\"d: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"e: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"f: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"g: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"h: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"i: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmaaaammmmmm\",  --  1\n\t\t\t\t\"mmmaabbaammmmm\",  --  2\n\t\t\t\t\"mmaabbbbaammmm\",  --  3\n\t\t\t\t\"maabbbbbbaammm\",  --  4\n\t\t\t\t\"mabbbbbbbbaaac\",  --  5\n\t\t\t\t\"mabbbbbbbbaaac\",  --  6\n\t\t\t\t\"maabbbbbbaammm\",  --  7\n\t\t\t\t\"mmaabbbbaammmm\",  --  8\n\t\t\t\t\"mmmaabbaammmmm\",  --  9\n\t\t\t\t\"mmmmaaaammmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmaaddaammmmm\",  --  1\n\t\t\t\t\"mmaa....aammmm\",  --  2\n\t\t\t\t\"maa......aammm\",  --  3\n\t\t\t\t\"ma........aaac\",  --  4\n\t\t\t\t\"ae........d..f\",  --  5\n\t\t\t\t\"ae........g..f\",  --  6\n\t\t\t\t\"ma........aaac\",  --  7\n\t\t\t\t\"maa......aammm\",  --  8\n\t\t\t\t\"mmaa....aammmm\",  --  9\n\t\t\t\t\"mmmaaggaammmmm\",  -- 10\n\t\t\t\t\"mmmmmaammmmmmm\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  0\n\t\t\t\t\"mmmbb..bbmmmmm\",  --  1\n\t\t\t\t\"mmbb....bbmmmm\",  --  2\n\t\t\t\t\"mbb......bbmmm\",  --  3\n\t\t\t\t\"mb........bbac\",  --  4\n\t\t\t\t\"b............h\",  --  5\n\t\t\t\t\"b............i\",  --  6\n\t\t\t\t\"mb........bbac\",  --  7\n\t\t\t\t\"mbb......bbmmm\",  --  8\n\t\t\t\t\"mmbb....bbmmmm\",  --  9\n\t\t\t\t\"mmmbb..bbmmmmm\",  -- 10\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  0\n\t\t\t\t\"mmmbb..bbmmmmm\",  --  1\n\t\t\t\t\"mmbb....bbmmmm\",  --  2\n\t\t\t\t\"mbb......bbmmm\",  --  3\n\t\t\t\t\"mb........bbac\",  --  4\n\t\t\t\t\"b..........bac\",  --  5\n\t\t\t\t\"b..........bac\",  --  6\n\t\t\t\t\"mb........bbac\",  --  7\n\t\t\t\t\"mbb......bbmmm\",  --  8\n\t\t\t\t\"mmbb....bbmmmm\",  --  9\n\t\t\t\t\"mmmbb..bbmmmmm\",  -- 10\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  1\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmb....bmmmmm\",  --  3\n\t\t\t\t\"mmb......bmmmm\",  --  4\n\t\t\t\t\"mb........bmmm\",  --  5\n\t\t\t\t\"mb........bmmm\",  --  6\n\t\t\t\t\"mmb......bmmmm\",  --  7\n\t\t\t\t\"mmmb....bmmmmm\",  --  8\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  9\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  3\n\t\t\t\t\"mmmb....bmmmmm\",  --  4\n\t\t\t\t\"mmb......bmmmm\",  --  5\n\t\t\t\t\"mmb......bmmmm\",  --  6\n\t\t\t\t\"mmmb....bmmmmm\",  --  7\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  8\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  3\n\t\t\t\t\"mmmmbbbbmmmmmm\",  --  4\n\t\t\t\t\"mmmbbbbbbmmmmm\",  --  5\n\t\t\t\t\"mmmbbbbbbmmmmm\",  --  6\n\t\t\t\t\"mmmmbbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t},\n\t\t},  -- ViewingEnd\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"ViewingCorridorBulge\",\n\t\t\t\tName         = \"Water 42\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"42\",\n\t\t\t\tID           = \"615\",\n\t\t\t\tCreatorName  = \"LO1ZB\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 8,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 20: 0\",  -- glass\n\t\t\t\t\"d: 64: 3\",  -- wooddoorblock\n\t\t\t\t\"e: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"f: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"g: 64: 1\",  -- wooddoorblock\n\t\t\t\t\"h: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"i: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmaammmmm\",  --  0\n\t\t\t\t\"mmmmmbbmmmmm\",  --  1\n\t\t\t\t\"mmmmmbbmmmmm\",  --  2\n\t\t\t\t\"mmmmbbbbmmmm\",  --  3\n\t\t\t\t\"mmmbbccbbmmm\",  --  4\n\t\t\t\t\"mmbbccccbbmm\",  --  5\n\t\t\t\t\"mbbccccccbbm\",  --  6\n\t\t\t\t\"mbccccccccbm\",  --  7\n\t\t\t\t\"mbccccccccbm\",  --  8\n\t\t\t\t\"mbbccccccbbm\",  --  9\n\t\t\t\t\"mmbbccccbbmm\",  -- 10\n\t\t\t\t\"mmmbbccbbmmm\",  -- 11\n\t\t\t\t\"mmmmbbbbmmmm\",  -- 12\n\t\t\t\t\"mmmmmbbmmmmm\",  -- 13\n\t\t\t\t\"mmmmmbbmmmmm\",  -- 14\n\t\t\t\t\"mmmmmaammmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmaddammmm\",  --  0\n\t\t\t\t\"mmmmb..bmmmm\",  --  1\n\t\t\t\t\"mmmmb..bmmmm\",  --  2\n\t\t\t\t\"mmmbbefbbmmm\",  --  3\n\t\t\t\t\"mmbb....bbmm\",  --  4\n\t\t\t\t\"mbb......bbm\",  --  5\n\t\t\t\t\"mb........bm\",  --  6\n\t\t\t\t\"be........fb\",  --  7\n\t\t\t\t\"be........fb\",  --  8\n\t\t\t\t\"mb........bm\",  --  9\n\t\t\t\t\"mbb......bbm\",  -- 10\n\t\t\t\t\"mmbb....bbmm\",  -- 11\n\t\t\t\t\"mmmbbefbbmmm\",  -- 12\n\t\t\t\t\"mmmmb..bmmmm\",  -- 13\n\t\t\t\t\"mmmmb..bmmmm\",  -- 14\n\t\t\t\t\"mmmmaggammmm\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmahiammmm\",  --  0\n\t\t\t\t\"mmmmb..bmmmm\",  --  1\n\t\t\t\t\"mmmmc..cmmmm\",  --  2\n\t\t\t\t\"mmmcc..ccmmm\",  --  3\n\t\t\t\t\"mmcc....ccmm\",  --  4\n\t\t\t\t\"mcc......ccm\",  --  5\n\t\t\t\t\"mc........cm\",  --  6\n\t\t\t\t\"c..........c\",  --  7\n\t\t\t\t\"c..........c\",  --  8\n\t\t\t\t\"mc........cm\",  --  9\n\t\t\t\t\"mcc......ccm\",  -- 10\n\t\t\t\t\"mmcc....ccmm\",  -- 11\n\t\t\t\t\"mmmcc..ccmmm\",  -- 12\n\t\t\t\t\"mmmmc..cmmmm\",  -- 13\n\t\t\t\t\"mmmmb..bmmmm\",  -- 14\n\t\t\t\t\"mmmmaihammmm\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmaaaammmm\",  --  0\n\t\t\t\t\"mmmmbbbbmmmm\",  --  1\n\t\t\t\t\"mmmmccccmmmm\",  --  2\n\t\t\t\t\"mmmcc..ccmmm\",  --  3\n\t\t\t\t\"mmcc....ccmm\",  --  4\n\t\t\t\t\"mcc......ccm\",  --  5\n\t\t\t\t\"mc........cm\",  --  6\n\t\t\t\t\"c..........c\",  --  7\n\t\t\t\t\"c..........c\",  --  8\n\t\t\t\t\"mc........cm\",  --  9\n\t\t\t\t\"mcc......ccm\",  -- 10\n\t\t\t\t\"mmcc....ccmm\",  -- 11\n\t\t\t\t\"mmmcc..ccmmm\",  -- 12\n\t\t\t\t\"mmmmccccmmmm\",  -- 13\n\t\t\t\t\"mmmmbbbbmmmm\",  -- 14\n\t\t\t\t\"mmmmaaaammmm\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmccmmmmm\",  --  3\n\t\t\t\t\"mmmmc..cmmmm\",  --  4\n\t\t\t\t\"mmmc....cmmm\",  --  5\n\t\t\t\t\"mmc......cmm\",  --  6\n\t\t\t\t\"mc........cm\",  --  7\n\t\t\t\t\"mc........cm\",  --  8\n\t\t\t\t\"mmc......cmm\",  --  9\n\t\t\t\t\"mmmc....cmmm\",  -- 10\n\t\t\t\t\"mmmmc..cmmmm\",  -- 11\n\t\t\t\t\"mmmmmccmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmccmmmmm\",  --  4\n\t\t\t\t\"mmmmc..cmmmm\",  --  5\n\t\t\t\t\"mmmc....cmmm\",  --  6\n\t\t\t\t\"mmc......cmm\",  --  7\n\t\t\t\t\"mmc......cmm\",  --  8\n\t\t\t\t\"mmmc....cmmm\",  --  9\n\t\t\t\t\"mmmmc..cmmmm\",  -- 10\n\t\t\t\t\"mmmmmccmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmccmmmmm\",  --  5\n\t\t\t\t\"mmmmccccmmmm\",  --  6\n\t\t\t\t\"mmmccccccmmm\",  --  7\n\t\t\t\t\"mmmccccccmmm\",  --  8\n\t\t\t\t\"mmmmccccmmmm\",  --  9\n\t\t\t\t\"mmmmmccmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 15\n\n\t\t\t},\n\t\t},  -- ViewingCorridorBulge\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BrokenRoom\",\n\t\t\t\tName         = \"Water 49\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"49\",\n\t\t\t\tID           = \"680\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 7,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 20: 0\",  -- glass\n\t\t\t\t\"c:  5: 5\",  -- planks\n\t\t\t\t\"d:  8: 0\",  -- water\n\t\t\t\t\"e: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"f: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"g: 64: 9\",  -- wooddoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmaaaammmmmm\",  --  1\n\t\t\t\t\"mmmaabbaammmmm\",  --  2\n\t\t\t\t\"mmaabbbbaammmm\",  --  3\n\t\t\t\t\"maabbbbbbaammm\",  --  4\n\t\t\t\t\"mabbbbbbbbaaac\",  --  5\n\t\t\t\t\"mabbbbbbbbaaac\",  --  6\n\t\t\t\t\"maabbbbbbaammm\",  --  7\n\t\t\t\t\"mmaabbbbaammmm\",  --  8\n\t\t\t\t\"mmmaabbaammmmm\",  --  9\n\t\t\t\t\"mmmmaaaammmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmaaddaammmmm\",  --  1\n\t\t\t\t\"mmaaddddaammmm\",  --  2\n\t\t\t\t\"maaddddddaammm\",  --  3\n\t\t\t\t\"maddddddddaaac\",  --  4\n\t\t\t\t\"adddddddddddde\",  --  5\n\t\t\t\t\"adddddddddddde\",  --  6\n\t\t\t\t\"maddddddddaaac\",  --  7\n\t\t\t\t\"maaddddddaammm\",  --  8\n\t\t\t\t\"mmaaddddaammmm\",  --  9\n\t\t\t\t\"mmmaaddaammmmm\",  -- 10\n\t\t\t\t\"mmmmmaammmmmmm\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  0\n\t\t\t\t\"mmmbb..bbmmmmm\",  --  1\n\t\t\t\t\"mmbb....bbmmmm\",  --  2\n\t\t\t\t\"mbb......bbmmm\",  --  3\n\t\t\t\t\"mb........bbac\",  --  4\n\t\t\t\t\"b............f\",  --  5\n\t\t\t\t\"b............g\",  --  6\n\t\t\t\t\"mb........bbac\",  --  7\n\t\t\t\t\"mbb......bbmmm\",  --  8\n\t\t\t\t\"mmbb....bbmmmm\",  --  9\n\t\t\t\t\"mmmbb..bbmmmmm\",  -- 10\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  0\n\t\t\t\t\"mmmbb..bbmmmmm\",  --  1\n\t\t\t\t\"mmbb....bbmmmm\",  --  2\n\t\t\t\t\"mbb......bbmmm\",  --  3\n\t\t\t\t\"mb........bbac\",  --  4\n\t\t\t\t\"b..........bac\",  --  5\n\t\t\t\t\"b..........bac\",  --  6\n\t\t\t\t\"mb........bbac\",  --  7\n\t\t\t\t\"mbb......bbmmm\",  --  8\n\t\t\t\t\"mmbb....bbmmmm\",  --  9\n\t\t\t\t\"mmmbb..bbmmmmm\",  -- 10\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmm.bmmmmmmm\",  --  1\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmb....bmmmmm\",  --  3\n\t\t\t\t\"mmb......bmmmm\",  --  4\n\t\t\t\t\"m.........bmmm\",  --  5\n\t\t\t\t\"mb........bmmm\",  --  6\n\t\t\t\t\"mmb......bmmmm\",  --  7\n\t\t\t\t\"mmm.....bmmmmm\",  --  8\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  9\n\t\t\t\t\"mmmmmbbmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmm....mmmmmm\",  --  3\n\t\t\t\t\"mmmb....bmmmmm\",  --  4\n\t\t\t\t\"mmb......bmmmm\",  --  5\n\t\t\t\t\"mmb......bmmmm\",  --  6\n\t\t\t\t\"mmmb.....mmmmm\",  --  7\n\t\t\t\t\"mmmmb..bmmmmmm\",  --  8\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  3\n\t\t\t\t\"mmmmbbbbmmmmmm\",  --  4\n\t\t\t\t\"mmmbbbbbbmmmmm\",  --  5\n\t\t\t\t\"mmmbb.bbbmmmmm\",  --  6\n\t\t\t\t\"mmmmbbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmbbmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t},\n\t\t},  -- BrokenRoom\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WaterfallRoom\",\n\t\t\t\tName         = \"Water 50\",\n\t\t\t\tGalleryName  = \"Water\",\n\t\t\t\tGalleryIndex = \"50\",\n\t\t\t\tID           = \"681\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 7,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 15,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"5\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 5\",  -- planks\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 20: 0\",  -- glass\n\t\t\t\t\"d: 64: 3\",  -- wooddoorblock\n\t\t\t\t\"e: 76: 1\",  -- redstonetorchon\n\t\t\t\t\"f: 76: 2\",  -- redstonetorchon\n\t\t\t\t\"g: 64: 2\",  -- wooddoorblock\n\t\t\t\t\"h: 76: 3\",  -- redstonetorchon\n\t\t\t\t\"i: 64: 0\",  -- wooddoorblock\n\t\t\t\t\"j: 76: 4\",  -- redstonetorchon\n\t\t\t\t\"k: 64: 1\",  -- wooddoorblock\n\t\t\t\t\"l: 64: 8\",  -- wooddoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 64: 9\",  -- wooddoorblock\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmaammmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  3\n\t\t\t\t\"mmmmmbbccbbmmmmm\",  --  4\n\t\t\t\t\"mmmmbbccccbbmmmm\",  --  5\n\t\t\t\t\"mmmbbccccccbbmmm\",  --  6\n\t\t\t\t\"abbbcccmmcccbbba\",  --  7\n\t\t\t\t\"abbbcccmmcccbbba\",  --  8\n\t\t\t\t\"mmmbbccccccbbmmm\",  --  9\n\t\t\t\t\"mmmmbbccccbbmmmm\",  -- 10\n\t\t\t\t\"mmmmmbbccbbmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmbbmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmaammmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmaddammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  2\n\t\t\t\t\"mmmmmbbefbbmmmmm\",  --  3\n\t\t\t\t\"mmmmbb....bbmmmm\",  --  4\n\t\t\t\t\"mmmbb......bbmmm\",  --  5\n\t\t\t\t\"abbb...cc...bbba\",  --  6\n\t\t\t\t\"g..h..c..c..h..i\",  --  7\n\t\t\t\t\"g..j..c..c..j..i\",  --  8\n\t\t\t\t\"abbb...cc...bbba\",  --  9\n\t\t\t\t\"mmmbb......bbmmm\",  -- 10\n\t\t\t\t\"mmmmbb....bbmmmm\",  -- 11\n\t\t\t\t\"mmmmmbbefbbmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmakkammmmmm\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmalnammmmmm\",  --  0\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  --  2\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  --  3\n\t\t\t\t\"mmmmcc....ccmmmm\",  --  4\n\t\t\t\t\"mmmcc......ccmmm\",  --  5\n\t\t\t\t\"abcc........ccba\",  --  6\n\t\t\t\t\"n..............l\",  --  7\n\t\t\t\t\"l..............n\",  --  8\n\t\t\t\t\"abcc........ccba\",  --  9\n\t\t\t\t\"mmmcc......ccmmm\",  -- 10\n\t\t\t\t\"mmmmcc....ccmmmm\",  -- 11\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmb..bmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmanlammmmmm\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmaaaammmmmm\",  --  0\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmccccmmmmmm\",  --  2\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  --  3\n\t\t\t\t\"mmmmcc....ccmmmm\",  --  4\n\t\t\t\t\"mmmcc......ccmmm\",  --  5\n\t\t\t\t\"abcc........ccba\",  --  6\n\t\t\t\t\"abc..........cba\",  --  7\n\t\t\t\t\"abc..........cba\",  --  8\n\t\t\t\t\"abcc........ccba\",  --  9\n\t\t\t\t\"mmmcc......ccmmm\",  -- 10\n\t\t\t\t\"mmmmcc....ccmmmm\",  -- 11\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmccccmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmbbbbmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmaaaammmmmm\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  --  3\n\t\t\t\t\"mmmmm.c..cmmmmmm\",  --  4\n\t\t\t\t\"mmmmmc....cmmmmm\",  --  5\n\t\t\t\t\"mmmmc......cmmmm\",  --  6\n\t\t\t\t\"mmmc........cmmm\",  --  7\n\t\t\t\t\"mmmc........cmmm\",  --  8\n\t\t\t\t\"mmmmc......cmmmm\",  --  9\n\t\t\t\t\"mmmmmc....cmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmm.ccmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  --  5\n\t\t\t\t\"mmmmmc....cmmmmm\",  --  6\n\t\t\t\t\"mmmmc......cmmmm\",  --  7\n\t\t\t\t\"mmmmc......cmmmm\",  --  8\n\t\t\t\t\"mmmmmc....cmmmmm\",  --  9\n\t\t\t\t\"mmmmmmc..cmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmccccmmmmmm\",  --  6\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  --  7\n\t\t\t\t\"mmmmmcc..ccmmmmm\",  --  8\n\t\t\t\t\"mmmmmmccccmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmccmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t},\n\t\t},  -- WaterfallRoom\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/SinglePieceStructures/DesertPyramid.cubeset",
    "content": "\n-- DesertPyramid.cubeset\n\n-- Defines the prefabs in the group DesertPyramid\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2020-08-27 10:42:17\",\n\t\t[\"AllowedBiomes\"] = \"Desert, DesertM, DesertHills\",\n\t\t[\"GridSizeX\"] = \"500\",\n\t\t[\"GridSizeZ\"] = \"500\",\n\t\t[\"IntendedUse\"] = \"SinglePieceStructures\",\n\t\t[\"MaxOffsetX\"] = \"100\",\n\t\t[\"MaxOffsetZ\"] = \"100\",\n\t\t[\"SeedOffset\"] = \"47260503\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"DesertPyramid\",\n\t\t\t\tName         = \"DesertPyramid\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"222\",\n\t\t\t\tID           = \"1706\",\n\t\t\t\tCreatorName  = \"12xx12\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 23,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 22,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tStructureBox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 22,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"400\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillNonAir\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"ShouldExpandFloor\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"Fixed|51\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 46: 0\",  -- tnt\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c: 24: 2\",  -- sandstone\n\t\t\t\t\"d: 24: 1\",  -- sandstone\n\t\t\t\t\"e: 54: 3\",  -- chest\n\t\t\t\t\"f: 54: 5\",  -- chest\n\t\t\t\t\"g: 70: 0\",  -- stonepressureplate\n\t\t\t\t\"h: 54: 4\",  -- chest\n\t\t\t\t\"i: 54: 2\",  -- chest\n\t\t\t\t\"j:128: 7\",  -- sandstonestairs\n\t\t\t\t\"k:128: 5\",  -- sandstonestairs\n\t\t\t\t\"l:128: 4\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 6\",  -- sandstonestairs\n\t\t\t\t\"o:159: 1\",  -- whiteterracotta\n\t\t\t\t\"p:159:11\",  -- whiteterracotta\n\t\t\t\t\"q:128: 3\",  -- sandstonestairs\n\t\t\t\t\"r:128: 2\",  -- sandstonestairs\n\t\t\t\t\"s:128: 0\",  -- sandstonestairs\n\t\t\t\t\"t:128: 1\",  -- sandstonestairs\n\t\t\t\t\"u: 44: 9\",  -- stone_slab\n\t\t\t\t\"v: 44: 1\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmcccmmmmmm\",  --  6\n\t\t\t\t\"mmmmmbcbcbmmmmm\",  --  7\n\t\t\t\t\"mmmmmmcccmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmdedmmmmmm\",  --  5\n\t\t\t\t\"mmmmmd...dmmmmm\",  --  6\n\t\t\t\t\"mmmmbf.g.hbmmmm\",  --  7\n\t\t\t\t\"mmmmmd...dmmmmm\",  --  8\n\t\t\t\t\"mmmmmmdidmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmcjcmmmmmm\",  --  5\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  6\n\t\t\t\t\"mmmmmk...lmmmmm\",  --  7\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  8\n\t\t\t\t\"mmmmmmcncmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmdcdmmmmmm\",  --  5\n\t\t\t\t\"mmmmmd...dmmmmm\",  --  6\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  7\n\t\t\t\t\"mmmmmd...dmmmmm\",  --  8\n\t\t\t\t\"mmmmmmdcdmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmcccmmmmmm\",  --  5\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  6\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  7\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  8\n\t\t\t\t\"mmmmmmcccmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmcdcmmmmmm\",  --  5\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  6\n\t\t\t\t\"mmmmmd...dmmmmm\",  --  7\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  8\n\t\t\t\t\"mmmmmmcdcmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmdcdmmmmmm\",  --  5\n\t\t\t\t\"mmmmmd...dmmmmm\",  --  6\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  7\n\t\t\t\t\"mmmmmd...dmmmmm\",  --  8\n\t\t\t\t\"mmmmmmdcdmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  8\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  8\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  8\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  1\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  2\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  3\n\t\t\t\t\"bbbbobobbbobbbb\",  --  4\n\t\t\t\t\"bbbbbobbbobbbbb\",  --  5\n\t\t\t\t\"bbbbbbobobbbbbb\",  --  6\n\t\t\t\t\"bbbbbbbpbbbbbbb\",  --  7\n\t\t\t\t\"bbbbbbobobbbbbb\",  --  8\n\t\t\t\t\"bbbbbobbbobbbbb\",  --  9\n\t\t\t\t\"bbbbobobbbobbbb\",  -- 10\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 11\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 12\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 13\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 14\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"b.........bbbbb\",  --  1\n\t\t\t\t\"b.........bq.bb\",  --  2\n\t\t\t\t\"b.........b..bb\",  --  3\n\t\t\t\t\"b....r.....b.bb\",  --  4\n\t\t\t\t\"b...sbt.......b\",  --  5\n\t\t\t\t\"b....q........b\",  --  6\n\t\t\t\t\"b..............\",  --  7\n\t\t\t\t\"b....r........b\",  --  8\n\t\t\t\t\"b...sbt.......b\",  --  9\n\t\t\t\t\"b....q.....b.bb\",  -- 10\n\t\t\t\t\"b.........b..bb\",  -- 11\n\t\t\t\t\"b.........br.bb\",  -- 12\n\t\t\t\t\"b.........bbbbb\",  -- 13\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 14\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"b.........b.sbb\",  --  1\n\t\t\t\t\"b.........b..bo\",  --  2\n\t\t\t\t\"b.........b..bb\",  --  3\n\t\t\t\t\"b..........b.bb\",  --  4\n\t\t\t\t\"b....b........b\",  --  5\n\t\t\t\t\"b.............b\",  --  6\n\t\t\t\t\"b..............\",  --  7\n\t\t\t\t\"b.............b\",  --  8\n\t\t\t\t\"b....b........b\",  --  9\n\t\t\t\t\"b..........b.bb\",  -- 10\n\t\t\t\t\"b.........b..bb\",  -- 11\n\t\t\t\t\"b.........b..bo\",  -- 12\n\t\t\t\t\"b.........b.sbb\",  -- 13\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 14\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mbbbbbbbbbb...b\",  --  1\n\t\t\t\t\"mbu......ub..ro\",  --  2\n\t\t\t\t\"mb........b.ubb\",  --  3\n\t\t\t\t\"mb.........bbbb\",  --  4\n\t\t\t\t\"mb...b......ubv\",  --  5\n\t\t\t\t\"mb..........ubb\",  --  6\n\t\t\t\t\"mb...........ub\",  --  7\n\t\t\t\t\"mb..........ubb\",  --  8\n\t\t\t\t\"mb...b......ubv\",  --  9\n\t\t\t\t\"mb.........bbbb\",  -- 10\n\t\t\t\t\"mb........b.ubb\",  -- 11\n\t\t\t\t\"mbu......ub..qo\",  -- 12\n\t\t\t\t\"mbbbbbbbbbb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmbbbbbbbbbb..o\",  --  2\n\t\t\t\t\"mmbbbbbbbbbbt.b\",  --  3\n\t\t\t\t\"mmbbbbbbbbbbbbb\",  --  4\n\t\t\t\t\"mmbbbbbbbbbbbmm\",  --  5\n\t\t\t\t\"mmbbbb...bbbbvm\",  --  6\n\t\t\t\t\"mmbbbb...bbbbbv\",  --  7\n\t\t\t\t\"mmbbbb...bbbbvm\",  --  8\n\t\t\t\t\"mmbbbbbbbbbbbmm\",  --  9\n\t\t\t\t\"mmbbbbbbbbbbbbb\",  -- 10\n\t\t\t\t\"mmbbbbbbbbbbt.b\",  -- 11\n\t\t\t\t\"mmbbbbbbbbbb..o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmmmmmmmmm....o\",  --  2\n\t\t\t\t\"mmmbbbb.bbb...b\",  --  3\n\t\t\t\t\"mmmbu.....ubbbb\",  --  4\n\t\t\t\t\"mmmb.b.....bmmm\",  --  5\n\t\t\t\t\"mmmb.......bmmm\",  --  6\n\t\t\t\t\"mmmb.......bvmm\",  --  7\n\t\t\t\t\"mmmb.......bmmm\",  --  8\n\t\t\t\t\"mmmb.b.....bmmm\",  --  9\n\t\t\t\t\"mmmbu.....ubbbb\",  -- 10\n\t\t\t\t\"mmmbbbb.bbb...b\",  -- 11\n\t\t\t\t\"mmmmmmmmmm....o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 17\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmmmmmmmmm....o\",  --  2\n\t\t\t\t\"mmmmmmbmbmb...b\",  --  3\n\t\t\t\t\"mmmmbbb.bbbbbbb\",  --  4\n\t\t\t\t\"mmmmbb....bmmmm\",  --  5\n\t\t\t\t\"mmmmb.....bmmmm\",  --  6\n\t\t\t\t\"mmmmb.....bmmmm\",  --  7\n\t\t\t\t\"mmmmb.....bmmmm\",  --  8\n\t\t\t\t\"mmmmbb....bmmmm\",  --  9\n\t\t\t\t\"mmmmbbb.bbbbbbb\",  -- 10\n\t\t\t\t\"mmmmmmbmbmb...b\",  -- 11\n\t\t\t\t\"mmmmmmmmmm....o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 18\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...o\",  --  1\n\t\t\t\t\"mmmmmmmmmmb...o\",  --  2\n\t\t\t\t\"mmmmmmmvmmb...o\",  --  3\n\t\t\t\t\"mmmmmmvbvmbbbbb\",  --  4\n\t\t\t\t\"mmmmmbbbbbmmmmm\",  --  5\n\t\t\t\t\"mmmmmbu.ubmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmbu.ubmmmmm\",  --  8\n\t\t\t\t\"mmmmmbbbbbmmmmm\",  --  9\n\t\t\t\t\"mmmmmmvbvmbbbbb\",  -- 10\n\t\t\t\t\"mmmmmmmvmmb...o\",  -- 11\n\t\t\t\t\"mmmmmmmmmmb...o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...o\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 19\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmmmmmmmmmb...o\",  --  2\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  3\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 10\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 11\n\t\t\t\t\"mmmmmmmmmmb...o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 20\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  2\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  3\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 10\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 11\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 21\n\t\t\t\t\"mmmmmmmmmmvrvrv\",  --  0\n\t\t\t\t\"mmmmmmmmmmsbbbt\",  --  1\n\t\t\t\t\"mmmmmmmmmmvbbbv\",  --  2\n\t\t\t\t\"mmmmmmmmmmsbbbt\",  --  3\n\t\t\t\t\"mmmmmmmmmmvqvqv\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmvrvrv\",  -- 10\n\t\t\t\t\"mmmmmmmmmmsbbbt\",  -- 11\n\t\t\t\t\"mmmmmmmmmmvbbbv\",  -- 12\n\t\t\t\t\"mmmmmmmmmmsbbbt\",  -- 13\n\t\t\t\t\"mmmmmmmmmmvqvqv\",  -- 14\n\n\t\t\t\t-- Level 22\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmvmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmvmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t},\n\t\t},  -- DesertPyramid\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SandyDesertPyramid\",\n\t\t\t\tName         = \"SandyDesertPyramid\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"223\",\n\t\t\t\tID           = \"1707\",\n\t\t\t\tCreatorName  = \"12xx12\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 23,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 22,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tStructureBox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 22,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillNonAir\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"ShouldExpandFloor\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"Fixed|51\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 46: 0\",  -- tnt\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c: 24: 2\",  -- sandstone\n\t\t\t\t\"d: 54: 3\",  -- chest\n\t\t\t\t\"e: 54: 5\",  -- chest\n\t\t\t\t\"f: 70: 0\",  -- stonepressureplate\n\t\t\t\t\"g: 54: 4\",  -- chest\n\t\t\t\t\"h: 54: 2\",  -- chest\n\t\t\t\t\"i:128: 7\",  -- sandstonestairs\n\t\t\t\t\"j:128: 5\",  -- sandstonestairs\n\t\t\t\t\"k:128: 4\",  -- sandstonestairs\n\t\t\t\t\"l:128: 6\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 24: 1\",  -- sandstone\n\t\t\t\t\"o:159: 1\",  -- whiteterracotta\n\t\t\t\t\"p:159:11\",  -- whiteterracotta\n\t\t\t\t\"q:128: 3\",  -- sandstonestairs\n\t\t\t\t\"r: 12: 0\",  -- sand\n\t\t\t\t\"s:128: 2\",  -- sandstonestairs\n\t\t\t\t\"t:128: 0\",  -- sandstonestairs\n\t\t\t\t\"u:128: 1\",  -- sandstonestairs\n\t\t\t\t\"v: 44: 9\",  -- stone_slab\n\t\t\t\t\"w: 44: 1\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  6\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  7\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmcccmmmmmm\",  --  6\n\t\t\t\t\"mmmmmbcbcbmmmmm\",  --  7\n\t\t\t\t\"mmmmmmcccmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbdbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  6\n\t\t\t\t\"mmmmbe.f.gbmmmm\",  --  7\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  8\n\t\t\t\t\"mmmmmmbhbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmbmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbibmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  6\n\t\t\t\t\"mmmmmj...kmmmmm\",  --  7\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  8\n\t\t\t\t\"mmmmmmblbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmnbnmmmmmm\",  --  5\n\t\t\t\t\"mmmmmn...nmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmn...nmmmmm\",  --  8\n\t\t\t\t\"mmmmmmnbnmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmcccmmmmmm\",  --  5\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  6\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  7\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  8\n\t\t\t\t\"mmmmmmcccmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmcncmmmmmm\",  --  5\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  6\n\t\t\t\t\"mmmmmn...nmmmmm\",  --  7\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  8\n\t\t\t\t\"mmmmmmcncmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmncnmmmmmm\",  --  5\n\t\t\t\t\"mmmmmn...nmmmmm\",  --  6\n\t\t\t\t\"mmmmmc...cmmmmm\",  --  7\n\t\t\t\t\"mmmmmn...nmmmmm\",  --  8\n\t\t\t\t\"mmmmmmncnmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  8\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  8\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  5\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  8\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  1\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  2\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  3\n\t\t\t\t\"bbbbobobbbobbbb\",  --  4\n\t\t\t\t\"bbbbbobbbobbbbb\",  --  5\n\t\t\t\t\"bbbbbbobobbbbbb\",  --  6\n\t\t\t\t\"bbbbbbbpbbbbbbb\",  --  7\n\t\t\t\t\"bbbbbbobobbbbbb\",  --  8\n\t\t\t\t\"bbbbbobbbobbbbb\",  --  9\n\t\t\t\t\"bbbbobobbbobbbb\",  -- 10\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 11\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 12\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 13\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 14\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"b.........bbbbb\",  --  1\n\t\t\t\t\"b.........bqrbb\",  --  2\n\t\t\t\t\"b......rr.b..bb\",  --  3\n\t\t\t\t\"b....s...r.b.bb\",  --  4\n\t\t\t\t\"b...tburr.....b\",  --  5\n\t\t\t\t\"b...rqrrrr..rrb\",  --  6\n\t\t\t\t\"b....rrrrrr.rrr\",  --  7\n\t\t\t\t\"b....srrrr..rrb\",  --  8\n\t\t\t\t\"b...tbu.r.r...b\",  --  9\n\t\t\t\t\"b....q.r...b.bb\",  -- 10\n\t\t\t\t\"b.........b..bb\",  -- 11\n\t\t\t\t\"b.........bsrbb\",  -- 12\n\t\t\t\t\"b.........bbbbb\",  -- 13\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 14\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"b.........brtbb\",  --  1\n\t\t\t\t\"b.........b.rbo\",  --  2\n\t\t\t\t\"b.........b..bb\",  --  3\n\t\t\t\t\"b..........b.bb\",  --  4\n\t\t\t\t\"b....b........b\",  --  5\n\t\t\t\t\"b......rr....rb\",  --  6\n\t\t\t\t\"b.....rrrr...rr\",  --  7\n\t\t\t\t\"b......rr.....b\",  --  8\n\t\t\t\t\"b....b........b\",  --  9\n\t\t\t\t\"b..........b.bb\",  -- 10\n\t\t\t\t\"b.........b..bb\",  -- 11\n\t\t\t\t\"b.........b.rbo\",  -- 12\n\t\t\t\t\"b.........brtbb\",  -- 13\n\t\t\t\t\"bbbbbbbbbbbbbbb\",  -- 14\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mbbbbbbbbbbrrrb\",  --  1\n\t\t\t\t\"mbv......vb.rso\",  --  2\n\t\t\t\t\"mb........b.vbb\",  --  3\n\t\t\t\t\"mb.........bbbb\",  --  4\n\t\t\t\t\"mb...b......vbw\",  --  5\n\t\t\t\t\"mb......r...vbb\",  --  6\n\t\t\t\t\"mb....r......vb\",  --  7\n\t\t\t\t\"mb.....r....vbb\",  --  8\n\t\t\t\t\"mb...b......vbw\",  --  9\n\t\t\t\t\"mb.........bbbb\",  -- 10\n\t\t\t\t\"mb........b.vbb\",  -- 11\n\t\t\t\t\"mbv......vb.rqo\",  -- 12\n\t\t\t\t\"mbbbbbbbbbbrrrb\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmbr..b\",  --  1\n\t\t\t\t\"mmbbbbbbbbbbr.o\",  --  2\n\t\t\t\t\"mmbbbbbbbbbburb\",  --  3\n\t\t\t\t\"mmbbbbbbbbbbbbb\",  --  4\n\t\t\t\t\"mmbbbbbbbbbbbmm\",  --  5\n\t\t\t\t\"mmbbbb..rbbbbwm\",  --  6\n\t\t\t\t\"mmbbbbr..bbbbbw\",  --  7\n\t\t\t\t\"mmbbbb.r.bbbbwm\",  --  8\n\t\t\t\t\"mmbbbbbbbbbbbmm\",  --  9\n\t\t\t\t\"mmbbbbbbbbbbbbb\",  -- 10\n\t\t\t\t\"mmbbbbbbbbbburb\",  -- 11\n\t\t\t\t\"mmbbbbbbbbbbrro\",  -- 12\n\t\t\t\t\"mmmmmmmmmmbrr.b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmmmmmmrmmrr..o\",  --  2\n\t\t\t\t\"mmmbbbbrbbbrr.b\",  --  3\n\t\t\t\t\"mmmbvrrrrrvbbbb\",  --  4\n\t\t\t\t\"mmmb.brrrr.bmmm\",  --  5\n\t\t\t\t\"mmmb.r...rrbmmm\",  --  6\n\t\t\t\t\"mmmbrr...rrbwmm\",  --  7\n\t\t\t\t\"mmmbrr...rrbmmm\",  --  8\n\t\t\t\t\"mmmb.brrrrrbmmm\",  --  9\n\t\t\t\t\"mmmbv.rrrrvbbbb\",  -- 10\n\t\t\t\t\"mmmbbbbrbbbrr.b\",  -- 11\n\t\t\t\t\"mmmmmmmmmrrrr.o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 17\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmmmmmmmmmrr..o\",  --  2\n\t\t\t\t\"mmmmmmbrbrb...b\",  --  3\n\t\t\t\t\"mmmmbbbrbbbbbbb\",  --  4\n\t\t\t\t\"mmmmbb.r..bmmmm\",  --  5\n\t\t\t\t\"mmmmb.....bmmmm\",  --  6\n\t\t\t\t\"mmmmbr....bmmmm\",  --  7\n\t\t\t\t\"mmmmb.....bmmmm\",  --  8\n\t\t\t\t\"mmmmbb..r.bmmmm\",  --  9\n\t\t\t\t\"mmmmbbbrbbbbbbb\",  -- 10\n\t\t\t\t\"mmmmmmbrbmb.r.b\",  -- 11\n\t\t\t\t\"mmmmmmmmmmrr..o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 18\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...o\",  --  1\n\t\t\t\t\"mmmmmmmmmmb...o\",  --  2\n\t\t\t\t\"mmmmmmmwmmb...o\",  --  3\n\t\t\t\t\"mmmmmmwbwmbbbbb\",  --  4\n\t\t\t\t\"mmmmmbbbbbmmmmm\",  --  5\n\t\t\t\t\"mmmmmbv.vbmmmmm\",  --  6\n\t\t\t\t\"mmmmmb...bmmmmm\",  --  7\n\t\t\t\t\"mmmmmbv.vbmmmmm\",  --  8\n\t\t\t\t\"mmmmmbbbbbmmmmm\",  --  9\n\t\t\t\t\"mmmmmmwbwmbbbbb\",  -- 10\n\t\t\t\t\"mmmmmmmwmmb...o\",  -- 11\n\t\t\t\t\"mmmmmmmmmmb...o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...o\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 19\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmmmmmmmmmb...o\",  --  2\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  3\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmb.bmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmbbbmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 10\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 11\n\t\t\t\t\"mmmmmmmmmmb...o\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 20\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  0\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  1\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  2\n\t\t\t\t\"mmmmmmmmmmb...b\",  --  3\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 10\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 11\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 12\n\t\t\t\t\"mmmmmmmmmmb...b\",  -- 13\n\t\t\t\t\"mmmmmmmmmmbbbbb\",  -- 14\n\n\t\t\t\t-- Level 21\n\t\t\t\t\"mmmmmmmmmmwswsw\",  --  0\n\t\t\t\t\"mmmmmmmmmmtbbbu\",  --  1\n\t\t\t\t\"mmmmmmmmmmwbbbw\",  --  2\n\t\t\t\t\"mmmmmmmmmmtbbbu\",  --  3\n\t\t\t\t\"mmmmmmmmmmwqwqw\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmwswsw\",  -- 10\n\t\t\t\t\"mmmmmmmmmmtbbbu\",  -- 11\n\t\t\t\t\"mmmmmmmmmmwbbbw\",  -- 12\n\t\t\t\t\"mmmmmmmmmmtbbbu\",  -- 13\n\t\t\t\t\"mmmmmmmmmmwqwqw\",  -- 14\n\n\t\t\t\t-- Level 22\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmmmwmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmwmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 14\n\n\t\t\t},\n\t\t},  -- SandyDesertPyramid\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/SinglePieceStructures/DesertWell.cubeset",
    "content": "\n-- DesertWell.cubeset\n\n-- Defines the prefabs in the group DesertWell\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2020-08-27 10:42:17\",\n\t\t[\"AllowedBiomes\"] = \"Desert, DesertM, DesertHills\",\n\t\t[\"GridSizeX\"] = \"750\",\n\t\t[\"GridSizeZ\"] = \"750\",\n\t\t[\"IntendedUse\"] = \"SinglePieceStructures\",\n\t\t[\"MaxOffsetX\"] = \"100\",\n\t\t[\"MaxOffsetZ\"] = \"100\",\n\t\t[\"SeedOffset\"] = \"58612835\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"DesertWell\",\n\t\t\t\tName         = \"DesertWell\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"221\",\n\t\t\t\tID           = \"1702\",\n\t\t\t\tCreatorName  = \"12xx12\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tStructureBox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillNonAir\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-3\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:  8: 0\",  -- water\n\t\t\t\t\"c: 44: 1\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aabaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aacaa\",  --  0\n\t\t\t\t\"aa.aa\",  --  1\n\t\t\t\t\"c...c\",  --  2\n\t\t\t\t\"aa.aa\",  --  3\n\t\t\t\t\"aacaa\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmm\",  --  0\n\t\t\t\t\"ma.am\",  --  1\n\t\t\t\t\"m...m\",  --  2\n\t\t\t\t\"ma.am\",  --  3\n\t\t\t\t\"mmmmm\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmm\",  --  0\n\t\t\t\t\"ma.am\",  --  1\n\t\t\t\t\"m...m\",  --  2\n\t\t\t\t\"ma.am\",  --  3\n\t\t\t\t\"mmmmm\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmm\",  --  0\n\t\t\t\t\"mcccm\",  --  1\n\t\t\t\t\"mcacm\",  --  2\n\t\t\t\t\"mcccm\",  --  3\n\t\t\t\t\"mmmmm\",  --  4\n\n\t\t\t},\n\t\t},  -- DesertWell\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/SinglePieceStructures/JungleTemple.cubeset",
    "content": "\n-- JungleTemple.cubeset\n\n-- Defines the prefabs in the group JungleTemple\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2020-08-27 10:42:17\",\n\t\t[\"AllowedBiomes\"] = \"Jungle, JungleHills, BambooJungle, BambooJungleHills\",\n\t\t[\"GridSizeX\"] = \"750\",\n\t\t[\"GridSizeZ\"] = \"750\",\n\t\t[\"IntendedUse\"] = \"SinglePieceStructures\",\n\t\t[\"MaxOffsetX\"] = \"100\",\n\t\t[\"MaxOffsetZ\"] = \"100\",\n\t\t[\"SeedOffset\"] = \"64775119\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"JungleTemple_1703\",\n\t\t\t\tName         = \"JungleTemple\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"162\",\n\t\t\t\tID           = \"1703\",\n\t\t\t\tCreatorName  = \"12xx12\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 14,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 13,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tStructureBox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 13,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillNonAir\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-4\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 48: 0\",  -- mossycobblestone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 54: 3\",  -- chest\n\t\t\t\t\"d: 67: 2\",  -- stonestairs\n\t\t\t\t\"e:131: 3\",  -- tripwirehook\n\t\t\t\t\"f:132: 0\",  -- tripwire\n\t\t\t\t\"g:131: 1\",  -- tripwirehook\n\t\t\t\t\"h: 55: 0\",  -- redstonewire\n\t\t\t\t\"i:131: 0\",  -- tripwirehook\n\t\t\t\t\"j: 54: 5\",  -- chest\n\t\t\t\t\"k:131: 2\",  -- tripwirehook\n\t\t\t\t\"l: 69:12\",  -- lever\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 98: 3\",  -- stonebricks\n\t\t\t\t\"o: 93: 2\",  -- unpoweredrepeater\n\t\t\t\t\"p: 29: 5\",  -- stickypiston\n\t\t\t\t\"q: 29: 1\",  -- stickypiston\n\t\t\t\t\"r: 23: 5\",  -- dispenser\n\t\t\t\t\"s: 23: 2\",  -- dispenser\n\t\t\t\t\"t: 67: 7\",  -- stonestairs\n\t\t\t\t\"u: 67: 3\",  -- stonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aabbbbbaabaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  1\n\t\t\t\t\"babbbaaaaaab\",  --  2\n\t\t\t\t\"baabaaababaa\",  --  3\n\t\t\t\t\"aaabaabbbaaa\",  --  4\n\t\t\t\t\"babaabbaabba\",  --  5\n\t\t\t\t\"bbabaaabbaab\",  --  6\n\t\t\t\t\"baabbbabaaaa\",  --  7\n\t\t\t\t\"bbbaaaabaaaa\",  --  8\n\t\t\t\t\"bbaabbaaaaab\",  --  9\n\t\t\t\t\"abaaabababbb\",  -- 10\n\t\t\t\t\"bbaaaaabbaba\",  -- 11\n\t\t\t\t\"abaaababbaaa\",  -- 12\n\t\t\t\t\"aaaabaabbaab\",  -- 13\n\t\t\t\t\"aabaabaaaaab\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"abaaaabbaabb\",  --  0\n\t\t\t\t\"a.........ab\",  --  1\n\t\t\t\t\"a..........b\",  --  2\n\t\t\t\t\"aabab..a..aa\",  --  3\n\t\t\t\t\"abcaa..a...a\",  --  4\n\t\t\t\t\"aa.bbddb..ab\",  --  5\n\t\t\t\t\"ba.aaabeffgb\",  --  6\n\t\t\t\t\"ba.babhb..bb\",  --  7\n\t\t\t\t\"bbhhaahb...a\",  --  8\n\t\t\t\t\"aahaiaha..ab\",  --  9\n\t\t\t\t\"aaa.f.h....b\",  -- 10\n\t\t\t\t\"abj.f.h...aa\",  -- 11\n\t\t\t\t\"baa.f.h....b\",  -- 12\n\t\t\t\t\"aa.akahha.ba\",  -- 13\n\t\t\t\t\"aababaaabaab\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"abaaaabbabaa\",  --  0\n\t\t\t\t\"b.........ab\",  --  1\n\t\t\t\t\"alll.......b\",  --  2\n\t\t\t\t\"bnnnb..a..bb\",  --  3\n\t\t\t\t\"bo.hb..a...a\",  --  4\n\t\t\t\t\"aa.hb..b..ba\",  --  5\n\t\t\t\t\"apq.bdda..ab\",  --  6\n\t\t\t\t\"baaaaabb..ba\",  --  7\n\t\t\t\t\"aaaaba.a...a\",  --  8\n\t\t\t\t\"ba..a.....ba\",  --  9\n\t\t\t\t\"bbh........b\",  -- 10\n\t\t\t\t\"abr.......bb\",  -- 11\n\t\t\t\t\"ab.........b\",  -- 12\n\t\t\t\t\"babba.basbba\",  -- 13\n\t\t\t\t\"aaaaaaaaabaa\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"baaaaaaaaaba\",  --  0\n\t\t\t\t\"b..........b\",  --  1\n\t\t\t\t\"a.......baaa\",  --  2\n\t\t\t\t\"aaaba..a...a\",  --  3\n\t\t\t\t\"b...a..aaaab\",  --  4\n\t\t\t\t\"bh..b..a...b\",  --  5\n\t\t\t\t\"ap..b..abaaa\",  --  6\n\t\t\t\t\"aaaaadda...a\",  --  7\n\t\t\t\t\"abbaatabbaaa\",  --  8\n\t\t\t\t\"aaa.a.a....a\",  --  9\n\t\t\t\t\"aab.....abbb\",  -- 10\n\t\t\t\t\"bba........a\",  -- 11\n\t\t\t\t\"aab.....baba\",  -- 12\n\t\t\t\t\"aab..b.....b\",  -- 13\n\t\t\t\t\"abaababbabaa\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"baaabaaaaaaa\",  --  0\n\t\t\t\t\"baabbbaabbaa\",  --  1\n\t\t\t\t\"aaabbababaaa\",  --  2\n\t\t\t\t\"aaaaababbaaa\",  --  3\n\t\t\t\t\"aaabaabbabba\",  --  4\n\t\t\t\t\"aabbb..bbaab\",  --  5\n\t\t\t\t\"aabab..babba\",  --  6\n\t\t\t\t\"aaabb..baaaa\",  --  7\n\t\t\t\t\"babaaddababb\",  --  8\n\t\t\t\t\"abaaabaabbbb\",  --  9\n\t\t\t\t\"abaabaaaabaa\",  -- 10\n\t\t\t\t\"bbaabaaaaaaa\",  -- 11\n\t\t\t\t\"bbbbaabbbbaa\",  -- 12\n\t\t\t\t\"aaaaaaaaabab\",  -- 13\n\t\t\t\t\"bbaauuuuaaaa\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"..bbabbbab..\",  --  2\n\t\t\t\t\"..a......b..\",  --  3\n\t\t\t\t\"..a.abab.b..\",  --  4\n\t\t\t\t\"..a.a..b.b..\",  --  5\n\t\t\t\t\"..a.u..u.a..\",  --  6\n\t\t\t\t\"..a......b..\",  --  7\n\t\t\t\t\"..b......a..\",  --  8\n\t\t\t\t\"..b......b..\",  --  9\n\t\t\t\t\"..a......a..\",  -- 10\n\t\t\t\t\"..a......b..\",  -- 11\n\t\t\t\t\"..aaa..baa..\",  -- 12\n\t\t\t\t\"............\",  -- 13\n\t\t\t\t\"............\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"..bab..aaa..\",  --  2\n\t\t\t\t\"..b......a..\",  --  3\n\t\t\t\t\"..a......a..\",  --  4\n\t\t\t\t\"..a......b..\",  --  5\n\t\t\t\t\"..a......a..\",  --  6\n\t\t\t\t\"..a......a..\",  --  7\n\t\t\t\t\"..b......b..\",  --  8\n\t\t\t\t\"..a......a..\",  --  9\n\t\t\t\t\"..b......b..\",  -- 10\n\t\t\t\t\"..b......b..\",  -- 11\n\t\t\t\t\"..aaa..bbb..\",  -- 12\n\t\t\t\t\"............\",  -- 13\n\t\t\t\t\"............\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".aababaabaa.\",  --  1\n\t\t\t\t\".bbbabbaabb.\",  --  2\n\t\t\t\t\".babbbaabbb.\",  --  3\n\t\t\t\t\".baataataaa.\",  --  4\n\t\t\t\t\".aab....aaa.\",  --  5\n\t\t\t\t\".baa....aaa.\",  --  6\n\t\t\t\t\".aaa....aab.\",  --  7\n\t\t\t\t\".aab....aab.\",  --  8\n\t\t\t\t\".aaabaabbab.\",  --  9\n\t\t\t\t\".abbaababaa.\",  -- 10\n\t\t\t\t\".ababbaabba.\",  -- 11\n\t\t\t\t\".aabaaaabba.\",  -- 12\n\t\t\t\t\".babbbabaaa.\",  -- 13\n\t\t\t\t\"............\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"..b.a..b.b..\",  --  0\n\t\t\t\t\".bbaabaaabb.\",  --  1\n\t\t\t\t\"bb........bb\",  --  2\n\t\t\t\t\".a........b.\",  --  3\n\t\t\t\t\"aa........ba\",  --  4\n\t\t\t\t\".a........b.\",  --  5\n\t\t\t\t\"bb........ab\",  --  6\n\t\t\t\t\".b........a.\",  --  7\n\t\t\t\t\"aa........ba\",  --  8\n\t\t\t\t\".a..daad..a.\",  --  9\n\t\t\t\t\"aa........ba\",  -- 10\n\t\t\t\t\".a........a.\",  -- 11\n\t\t\t\t\"ab........bb\",  -- 12\n\t\t\t\t\".baaababaab.\",  -- 13\n\t\t\t\t\"..a.a..b.a..\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"..a.a..b.a..\",  --  0\n\t\t\t\t\".bbba..aaaa.\",  --  1\n\t\t\t\t\"bb........bb\",  --  2\n\t\t\t\t\".a........a.\",  --  3\n\t\t\t\t\"bb........aa\",  --  4\n\t\t\t\t\"............\",  --  5\n\t\t\t\t\"ab........bb\",  --  6\n\t\t\t\t\".a........b.\",  --  7\n\t\t\t\t\"bb........bb\",  --  8\n\t\t\t\t\"............\",  --  9\n\t\t\t\t\"ab........bb\",  -- 10\n\t\t\t\t\".a........a.\",  -- 11\n\t\t\t\t\"bb........bb\",  -- 12\n\t\t\t\t\".aaba..babb.\",  -- 13\n\t\t\t\t\"..b.a..a.a..\",  -- 14\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".bbabababab.\",  --  1\n\t\t\t\t\".abaabbaaab.\",  --  2\n\t\t\t\t\".aabbaaaabb.\",  --  3\n\t\t\t\t\".aaaaaaabba.\",  --  4\n\t\t\t\t\"abab....abaa\",  --  5\n\t\t\t\t\".aab....aaa.\",  --  6\n\t\t\t\t\".aba....baa.\",  --  7\n\t\t\t\t\".baa....abb.\",  --  8\n\t\t\t\t\"aabb....baab\",  --  9\n\t\t\t\t\".baaababbaa.\",  -- 10\n\t\t\t\t\".ababaaaaaa.\",  -- 11\n\t\t\t\t\".ababaaaaba.\",  -- 12\n\t\t\t\t\".aaaabaabaa.\",  -- 13\n\t\t\t\t\".....ba.....\",  -- 14\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"..a......b..\",  --  2\n\t\t\t\t\"...abbbab...\",  --  3\n\t\t\t\t\"...aaaaab...\",  --  4\n\t\t\t\t\"...bbaabb...\",  --  5\n\t\t\t\t\"...aa..ba...\",  --  6\n\t\t\t\t\"...ab..bb...\",  --  7\n\t\t\t\t\"...aa..aa...\",  --  8\n\t\t\t\t\"...aaaaaa...\",  --  9\n\t\t\t\t\"...baaaba...\",  -- 10\n\t\t\t\t\"...ababaa...\",  -- 11\n\t\t\t\t\"..b......a..\",  -- 12\n\t\t\t\t\"............\",  -- 13\n\t\t\t\t\"............\",  -- 14\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"..a......a..\",  --  2\n\t\t\t\t\"............\",  --  3\n\t\t\t\t\"....abaa....\",  --  4\n\t\t\t\t\"....baab....\",  --  5\n\t\t\t\t\"....bbab....\",  --  6\n\t\t\t\t\"....baab....\",  --  7\n\t\t\t\t\"....bbaa....\",  --  8\n\t\t\t\t\"....abaa....\",  --  9\n\t\t\t\t\"....baba....\",  -- 10\n\t\t\t\t\"............\",  -- 11\n\t\t\t\t\"..b......a..\",  -- 12\n\t\t\t\t\"............\",  -- 13\n\t\t\t\t\"............\",  -- 14\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"..a......a..\",  --  2\n\t\t\t\t\"............\",  --  3\n\t\t\t\t\"....a..b....\",  --  4\n\t\t\t\t\"............\",  --  5\n\t\t\t\t\".....dd.....\",  --  6\n\t\t\t\t\".....ab.....\",  --  7\n\t\t\t\t\".....uu.....\",  --  8\n\t\t\t\t\"............\",  --  9\n\t\t\t\t\"....b..b....\",  -- 10\n\t\t\t\t\"............\",  -- 11\n\t\t\t\t\"..b......b..\",  -- 12\n\t\t\t\t\"............\",  -- 13\n\t\t\t\t\"............\",  -- 14\n\n\t\t\t},\n\t\t},  -- JungleTemple_1703\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/SinglePieceStructures/WitchHut.cubeset",
    "content": "\n-- WitchHut.cubeset\n\n-- Defines the prefabs in the group WitchHut\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2020-08-27 10:42:17\",\n\t\t[\"AllowedBiomes\"] = \"Swampland, SwamplandM\",\n\t\t[\"GridSizeX\"] = \"750\",\n\t\t[\"GridSizeZ\"] = \"750\",\n\t\t[\"IntendedUse\"] = \"SinglePieceStructures\",\n\t\t[\"MaxOffsetX\"] = \"100\",\n\t\t[\"MaxOffsetZ\"] = \"100\",\n\t\t[\"SeedOffset\"] = \"4136893\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WitchHut\",\n\t\t\t\tName         = \"WitchHut\",\n\t\t\t\tGalleryName  = \"Cube\",\n\t\t\t\tGalleryIndex = \"161\",\n\t\t\t\tID           = \"1704\",\n\t\t\t\tCreatorName  = \"12xx12\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 5,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 8,\n\t\t\t\tMaxY = 4,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tStructureBox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 8,\n\t\t\t\tMaxY = 4,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillNonAir\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 17: 0\",  -- tree\n\t\t\t\t\"b:  5: 1\",  -- planks\n\t\t\t\t\"c: 85: 0\",  -- fence\n\t\t\t\t\"d:118: 0\",  -- cauldronblock\n\t\t\t\t\"e: 58: 0\",  -- workbench\n\t\t\t\t\"f:140: 0\",  -- flowerpotblock\n\t\t\t\t\"g:134: 2\",  -- sprucewoodstairs\n\t\t\t\t\"h:134: 0\",  -- sprucewoodstairs\n\t\t\t\t\"i:134: 1\",  -- sprucewoodstairs\n\t\t\t\t\"j:134: 3\",  -- sprucewoodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".a....a..\",  --  1\n\t\t\t\t\".........\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".........\",  --  4\n\t\t\t\t\".a....a..\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".abbbbab.\",  --  1\n\t\t\t\t\".bbbbbbbb\",  --  2\n\t\t\t\t\".bbbbbbbb\",  --  3\n\t\t\t\t\".bbbbbbbb\",  --  4\n\t\t\t\t\".abbbbab.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".abbbbac.\",  --  1\n\t\t\t\t\".bd......\",  --  2\n\t\t\t\t\".be...b..\",  --  3\n\t\t\t\t\".b....b..\",  --  4\n\t\t\t\t\".abbbbac.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".ab..ba..\",  --  1\n\t\t\t\t\".b.......\",  --  2\n\t\t\t\t\".c....b..\",  --  3\n\t\t\t\t\".b....c..\",  --  4\n\t\t\t\t\".abf.ba..\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"gggggggg.\",  --  0\n\t\t\t\t\"hbbbbbbi.\",  --  1\n\t\t\t\t\"hbbbbbbi.\",  --  2\n\t\t\t\t\"hbbbbbbi.\",  --  3\n\t\t\t\t\"hbbbbbbi.\",  --  4\n\t\t\t\t\"hbbbbbbi.\",  --  5\n\t\t\t\t\"hjjjjjjj.\",  --  6\n\n\t\t\t},\n\t\t},  -- WitchHut\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/Villages/AlchemistVillage.cubeset",
    "content": "\n-- AlchemistVillage.cubeset\n\n-- Defines the prefabs in the group AlchemistVillage\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-30 13:46:13\",\n\t\t[\"AllowedBiomes\"] = \"Desert, DesertM\",\n\t\t[\"IntendedUse\"] = \"Village\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleHouse\",\n\t\t\t\tName         = \"Desert 65\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"65\",\n\t\t\t\tID           = \"551\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 5,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 61: 2\",  -- furnace\n\t\t\t\t\"h: 65: 2\",  -- ladder\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j:101: 0\",  -- ironbars\n\t\t\t\t\"k: 50: 4\",  -- torch\n\t\t\t\t\"l:128: 2\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:126: 8\",  -- woodenslab\n\t\t\t\t\"o:128: 4\",  -- sandstonestairs\n\t\t\t\t\"p:128: 5\",  -- sandstonestairs\n\t\t\t\t\"q:128: 7\",  -- sandstonestairs\n\t\t\t\t\"r: 44: 1\",  -- stone_slab\n\t\t\t\t\"s: 96: 2\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"abbba\",  --  0\n\t\t\t\t\"mbbbm\",  --  1\n\t\t\t\t\"accca\",  --  2\n\t\t\t\t\"ccccc\",  --  3\n\t\t\t\t\"ccccc\",  --  4\n\t\t\t\t\"ccccc\",  --  5\n\t\t\t\t\"accca\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"addda\",  --  0\n\t\t\t\t\"mdddm\",  --  1\n\t\t\t\t\"aceca\",  --  2\n\t\t\t\t\"ceeec\",  --  3\n\t\t\t\t\"ceeec\",  --  4\n\t\t\t\t\"ceeec\",  --  5\n\t\t\t\t\"accca\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"acfca\",  --  2\n\t\t\t\t\"c...c\",  --  3\n\t\t\t\t\"c...c\",  --  4\n\t\t\t\t\"cg.hc\",  --  5\n\t\t\t\t\"accca\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"acica\",  --  2\n\t\t\t\t\"c...c\",  --  3\n\t\t\t\t\"j...j\",  --  4\n\t\t\t\t\"ck.hc\",  --  5\n\t\t\t\t\"acjca\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"l...l\",  --  0\n\t\t\t\t\"c...c\",  --  1\n\t\t\t\t\"accca\",  --  2\n\t\t\t\t\"cnnnc\",  --  3\n\t\t\t\t\"onnnp\",  --  4\n\t\t\t\t\"cnnhc\",  --  5\n\t\t\t\t\"acqca\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"crcrc\",  --  2\n\t\t\t\t\"r...r\",  --  3\n\t\t\t\t\"c...c\",  --  4\n\t\t\t\t\"r..sr\",  --  5\n\t\t\t\t\"crcrc\",  --  6\n\n\t\t\t},\n\t\t},  -- LittleHouse\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleHouse3\",\n\t\t\t\tName         = \"Desert 66\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"66\",\n\t\t\t\tID           = \"553\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 65: 2\",  -- ladder\n\t\t\t\t\"h: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"i:101: 0\",  -- ironbars\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 2\",  -- sandstonestairs\n\t\t\t\t\"l:126: 8\",  -- woodenslab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 4\",  -- sandstonestairs\n\t\t\t\t\"o:128: 5\",  -- sandstonestairs\n\t\t\t\t\"p:128: 7\",  -- sandstonestairs\n\t\t\t\t\"q: 44: 1\",  -- stone_slab\n\t\t\t\t\"r: 96: 2\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmabbbamm\",  --  0\n\t\t\t\t\"mmmbbbmmm\",  --  1\n\t\t\t\t\"accccccca\",  --  2\n\t\t\t\t\"ccccccccc\",  --  3\n\t\t\t\t\"ccccccccc\",  --  4\n\t\t\t\t\"ccccccccc\",  --  5\n\t\t\t\t\"accccccca\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmadddamm\",  --  0\n\t\t\t\t\"mmmdddmmm\",  --  1\n\t\t\t\t\"accceccca\",  --  2\n\t\t\t\t\"ceeeeeeec\",  --  3\n\t\t\t\t\"ceeeeeeec\",  --  4\n\t\t\t\t\"ceeeeeeec\",  --  5\n\t\t\t\t\"accccccca\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mma...amm\",  --  0\n\t\t\t\t\"mm.....mm\",  --  1\n\t\t\t\t\"acccfccca\",  --  2\n\t\t\t\t\"c.......c\",  --  3\n\t\t\t\t\"c.......c\",  --  4\n\t\t\t\t\"c......gc\",  --  5\n\t\t\t\t\"accccccca\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mma...amm\",  --  0\n\t\t\t\t\"mm.....mm\",  --  1\n\t\t\t\t\"accchccca\",  --  2\n\t\t\t\t\"c.......c\",  --  3\n\t\t\t\t\"i.......i\",  --  4\n\t\t\t\t\"c.j....gc\",  --  5\n\t\t\t\t\"acciiicca\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmk...kmm\",  --  0\n\t\t\t\t\"mmc...cmm\",  --  1\n\t\t\t\t\"accccccca\",  --  2\n\t\t\t\t\"clllllllc\",  --  3\n\t\t\t\t\"nlllllllo\",  --  4\n\t\t\t\t\"cllllllgc\",  --  5\n\t\t\t\t\"accpppcca\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mm.....mm\",  --  0\n\t\t\t\t\"mm.....mm\",  --  1\n\t\t\t\t\"cqqqcqqqc\",  --  2\n\t\t\t\t\"q.......q\",  --  3\n\t\t\t\t\"c.......c\",  --  4\n\t\t\t\t\"q......rq\",  --  5\n\t\t\t\t\"cqqqcqqqc\",  --  6\n\n\t\t\t},\n\t\t},  -- LittleHouse3\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SmallHouse9\",\n\t\t\t\tName         = \"Desert 67\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"67\",\n\t\t\t\tID           = \"556\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 65: 2\",  -- ladder\n\t\t\t\t\"h: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"i:101: 0\",  -- ironbars\n\t\t\t\t\"j: 50: 2\",  -- torch\n\t\t\t\t\"k: 50: 1\",  -- torch\n\t\t\t\t\"l:128: 2\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:126: 8\",  -- woodenslab\n\t\t\t\t\"o:128: 5\",  -- sandstonestairs\n\t\t\t\t\"p:128: 6\",  -- sandstonestairs\n\t\t\t\t\"q:128: 4\",  -- sandstonestairs\n\t\t\t\t\"r:128: 7\",  -- sandstonestairs\n\t\t\t\t\"s: 44: 1\",  -- stone_slab\n\t\t\t\t\"t: 96: 2\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmabbba\",  --  0\n\t\t\t\t\"mmmmmbbbm\",  --  1\n\t\t\t\t\"mmmmaccca\",  --  2\n\t\t\t\t\"mmmmccccc\",  --  3\n\t\t\t\t\"mmmmccccc\",  --  4\n\t\t\t\t\"mmmmccccc\",  --  5\n\t\t\t\t\"acccacccc\",  --  6\n\t\t\t\t\"ccccccccc\",  --  7\n\t\t\t\t\"ccccccccc\",  --  8\n\t\t\t\t\"ccccccccc\",  --  9\n\t\t\t\t\"accccccca\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmaddda\",  --  0\n\t\t\t\t\"mmmmmdddm\",  --  1\n\t\t\t\t\"mmmmaceca\",  --  2\n\t\t\t\t\"mmmmceeec\",  --  3\n\t\t\t\t\"mmmmceeec\",  --  4\n\t\t\t\t\"mmmmceeec\",  --  5\n\t\t\t\t\"acccaeeec\",  --  6\n\t\t\t\t\"ceeeeeeec\",  --  7\n\t\t\t\t\"ceeeeeeec\",  --  8\n\t\t\t\t\"ceeeeeeec\",  --  9\n\t\t\t\t\"accccccca\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmma...a\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"mmmmacfca\",  --  2\n\t\t\t\t\"mmmmc...c\",  --  3\n\t\t\t\t\"mmmmc...c\",  --  4\n\t\t\t\t\"mmmmc...c\",  --  5\n\t\t\t\t\"accca...c\",  --  6\n\t\t\t\t\"c.......c\",  --  7\n\t\t\t\t\"c.......c\",  --  8\n\t\t\t\t\"c......gc\",  --  9\n\t\t\t\t\"accccccca\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmma...a\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"mmmmachca\",  --  2\n\t\t\t\t\"mmmmc...c\",  --  3\n\t\t\t\t\"mmmmc...c\",  --  4\n\t\t\t\t\"mmmmc...i\",  --  5\n\t\t\t\t\"acica...i\",  --  6\n\t\t\t\t\"c.......i\",  --  7\n\t\t\t\t\"i......jc\",  --  8\n\t\t\t\t\"ck.....gc\",  --  9\n\t\t\t\t\"acciiicca\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmml...l\",  --  0\n\t\t\t\t\"mmmmc...c\",  --  1\n\t\t\t\t\"mmmmaccca\",  --  2\n\t\t\t\t\"mmmmcnnnc\",  --  3\n\t\t\t\t\"mmmmcnnnc\",  --  4\n\t\t\t\t\"mmmmcnnno\",  --  5\n\t\t\t\t\"acpcannno\",  --  6\n\t\t\t\t\"cnnnnnnno\",  --  7\n\t\t\t\t\"qnnnnnnnc\",  --  8\n\t\t\t\t\"cnnnnnngc\",  --  9\n\t\t\t\t\"accrrrcca\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmm.....\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"mmmmcscsc\",  --  2\n\t\t\t\t\"mmmms...s\",  --  3\n\t\t\t\t\"mmmms...s\",  --  4\n\t\t\t\t\"mmmms...s\",  --  5\n\t\t\t\t\"csssc...c\",  --  6\n\t\t\t\t\"s.......s\",  --  7\n\t\t\t\t\"s.......s\",  --  8\n\t\t\t\t\"s......ts\",  --  9\n\t\t\t\t\"cssscsssc\",  -- 10\n\n\t\t\t},\n\t\t},  -- SmallHouse9\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleHouse5\",\n\t\t\t\tName         = \"Desert 68\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"68\",\n\t\t\t\tID           = \"558\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 65: 2\",  -- ladder\n\t\t\t\t\"h: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"i:101: 0\",  -- ironbars\n\t\t\t\t\"j: 50: 1\",  -- torch\n\t\t\t\t\"k: 50: 4\",  -- torch\n\t\t\t\t\"l:128: 2\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:126: 8\",  -- woodenslab\n\t\t\t\t\"o:128: 6\",  -- sandstonestairs\n\t\t\t\t\"p:128: 5\",  -- sandstonestairs\n\t\t\t\t\"q:128: 4\",  -- sandstonestairs\n\t\t\t\t\"r:128: 7\",  -- sandstonestairs\n\t\t\t\t\"s: 44: 1\",  -- stone_slab\n\t\t\t\t\"t: 96: 2\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmabbba\",  --  0\n\t\t\t\t\"mmmmmbbbm\",  --  1\n\t\t\t\t\"mmmmaccca\",  --  2\n\t\t\t\t\"mmmmccccc\",  --  3\n\t\t\t\t\"acccacccc\",  --  4\n\t\t\t\t\"ccccccccc\",  --  5\n\t\t\t\t\"ccccccccc\",  --  6\n\t\t\t\t\"ccccccccc\",  --  7\n\t\t\t\t\"accccccca\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmaddda\",  --  0\n\t\t\t\t\"mmmmmdddm\",  --  1\n\t\t\t\t\"mmmmaceca\",  --  2\n\t\t\t\t\"mmmmceeec\",  --  3\n\t\t\t\t\"acccaeeec\",  --  4\n\t\t\t\t\"ceeeeeeec\",  --  5\n\t\t\t\t\"ceeeeeeec\",  --  6\n\t\t\t\t\"ceeeeeeec\",  --  7\n\t\t\t\t\"accccccca\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmma...a\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"mmmmacfca\",  --  2\n\t\t\t\t\"mmmmc...c\",  --  3\n\t\t\t\t\"accca...c\",  --  4\n\t\t\t\t\"c.......c\",  --  5\n\t\t\t\t\"c.......c\",  --  6\n\t\t\t\t\"c......gc\",  --  7\n\t\t\t\t\"accccccca\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmma...a\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"mmmmachca\",  --  2\n\t\t\t\t\"mmmmc...c\",  --  3\n\t\t\t\t\"acica...i\",  --  4\n\t\t\t\t\"c.......i\",  --  5\n\t\t\t\t\"i.......i\",  --  6\n\t\t\t\t\"cj....kgc\",  --  7\n\t\t\t\t\"acciiicca\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmml...l\",  --  0\n\t\t\t\t\"mmmmc...c\",  --  1\n\t\t\t\t\"mmmmaccca\",  --  2\n\t\t\t\t\"mmmmcnnnc\",  --  3\n\t\t\t\t\"acocannnp\",  --  4\n\t\t\t\t\"cnnnnnnnp\",  --  5\n\t\t\t\t\"qnnnnnnnp\",  --  6\n\t\t\t\t\"cnnnnnngc\",  --  7\n\t\t\t\t\"accrrrcca\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmm.....\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"mmmmcscsc\",  --  2\n\t\t\t\t\"mmmms...s\",  --  3\n\t\t\t\t\"csssc...c\",  --  4\n\t\t\t\t\"s.......s\",  --  5\n\t\t\t\t\"s.......s\",  --  6\n\t\t\t\t\"s......ts\",  --  7\n\t\t\t\t\"cssscsssc\",  --  8\n\n\t\t\t},\n\t\t},  -- LittleHouse5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleHouse6\",\n\t\t\t\tName         = \"Desert 69\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"69\",\n\t\t\t\tID           = \"559\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"A: 96: 2\",  -- trapdoor\n\t\t\t\t\"a: 12: 0\",  -- sand\n\t\t\t\t\"b: 24: 2\",  -- sandstone\n\t\t\t\t\"c:  4: 0\",  -- cobblestone\n\t\t\t\t\"d:  3: 0\",  -- dirt\n\t\t\t\t\"e: 24: 0\",  -- sandstone\n\t\t\t\t\"f: 13: 0\",  -- gravel\n\t\t\t\t\"g:  2: 0\",  -- grass\n\t\t\t\t\"h:  5: 0\",  -- planks\n\t\t\t\t\"i: 85: 0\",  -- fence\n\t\t\t\t\"j: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"k: 38: 1\",  -- rose\n\t\t\t\t\"l: 38: 2\",  -- rose\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 38: 5\",  -- rose\n\t\t\t\t\"o: 65: 2\",  -- ladder\n\t\t\t\t\"p: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"q:101: 0\",  -- ironbars\n\t\t\t\t\"r: 50: 1\",  -- torch\n\t\t\t\t\"s: 50: 4\",  -- torch\n\t\t\t\t\"t:128: 2\",  -- sandstonestairs\n\t\t\t\t\"u:126: 8\",  -- woodenslab\n\t\t\t\t\"v:128: 6\",  -- sandstonestairs\n\t\t\t\t\"w:128: 5\",  -- sandstonestairs\n\t\t\t\t\"x:128: 4\",  -- sandstonestairs\n\t\t\t\t\"y:128: 7\",  -- sandstonestairs\n\t\t\t\t\"z: 44: 1\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaabcccb\",  --  0\n\t\t\t\t\"adddccccm\",  --  1\n\t\t\t\t\"adddbeeeb\",  --  2\n\t\t\t\t\"adddeeeee\",  --  3\n\t\t\t\t\"beeebeeee\",  --  4\n\t\t\t\t\"eeeeeeeee\",  --  5\n\t\t\t\t\"eeeeeeeee\",  --  6\n\t\t\t\t\"eeeeeeeee\",  --  7\n\t\t\t\t\"beeeeeeeb\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaabfffb\",  --  0\n\t\t\t\t\"agggffffm\",  --  1\n\t\t\t\t\"agggbeheb\",  --  2\n\t\t\t\t\"aggdehhhe\",  --  3\n\t\t\t\t\"beeebhhhe\",  --  4\n\t\t\t\t\"ehhhhhhhe\",  --  5\n\t\t\t\t\"ehhhhhhhe\",  --  6\n\t\t\t\t\"ehhhhhhhe\",  --  7\n\t\t\t\t\"beeeeeeeb\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"iiiib...b\",  --  0\n\t\t\t\t\"i........\",  --  1\n\t\t\t\t\"i...bejeb\",  --  2\n\t\t\t\t\"iklne...e\",  --  3\n\t\t\t\t\"beeeb...e\",  --  4\n\t\t\t\t\"e.......e\",  --  5\n\t\t\t\t\"e.......e\",  --  6\n\t\t\t\t\"e......oe\",  --  7\n\t\t\t\t\"beeeeeeeb\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"....b...b\",  --  0\n\t\t\t\t\".........\",  --  1\n\t\t\t\t\"....bepeb\",  --  2\n\t\t\t\t\"....e...e\",  --  3\n\t\t\t\t\"beqeb...q\",  --  4\n\t\t\t\t\"e.......q\",  --  5\n\t\t\t\t\"q.......q\",  --  6\n\t\t\t\t\"er....soe\",  --  7\n\t\t\t\t\"beeqqqeeb\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"....t...t\",  --  0\n\t\t\t\t\"....e...e\",  --  1\n\t\t\t\t\"....beeeb\",  --  2\n\t\t\t\t\"....euuue\",  --  3\n\t\t\t\t\"bevebuuuw\",  --  4\n\t\t\t\t\"euuuuuuuw\",  --  5\n\t\t\t\t\"xuuuuuuuw\",  --  6\n\t\t\t\t\"euuuuuuoe\",  --  7\n\t\t\t\t\"beeyyyeeb\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".........\",  --  1\n\t\t\t\t\"....ezeze\",  --  2\n\t\t\t\t\"....z...z\",  --  3\n\t\t\t\t\"ezzze...e\",  --  4\n\t\t\t\t\"z.......z\",  --  5\n\t\t\t\t\"z.......z\",  --  6\n\t\t\t\t\"z......Az\",  --  7\n\t\t\t\t\"ezzzezzze\",  --  8\n\n\t\t\t},\n\t\t},  -- LittleHouse6\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleHouse4\",\n\t\t\t\tName         = \"Desert 70\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"70\",\n\t\t\t\tID           = \"560\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 6,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 5,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 65: 5\",  -- ladder\n\t\t\t\t\"h:134: 3\",  -- sprucewoodstairs\n\t\t\t\t\"i: 85: 0\",  -- fence\n\t\t\t\t\"j:134: 2\",  -- sprucewoodstairs\n\t\t\t\t\"k: 61: 2\",  -- furnace\n\t\t\t\t\"l:134: 6\",  -- sprucewoodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:134: 4\",  -- sprucewoodstairs\n\t\t\t\t\"o: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"p: 50: 2\",  -- torch\n\t\t\t\t\"q:101: 0\",  -- ironbars\n\t\t\t\t\"r:171: 8\",  -- carpet\n\t\t\t\t\"s:128: 2\",  -- sandstonestairs\n\t\t\t\t\"t:126: 8\",  -- woodenslab\n\t\t\t\t\"u:128: 4\",  -- sandstonestairs\n\t\t\t\t\"v:128: 5\",  -- sandstonestairs\n\t\t\t\t\"w:128: 7\",  -- sandstonestairs\n\t\t\t\t\"x: 44: 1\",  -- stone_slab\n\t\t\t\t\"y: 96: 1\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"abbba\",  --  0\n\t\t\t\t\"mbbbm\",  --  1\n\t\t\t\t\"accca\",  --  2\n\t\t\t\t\"ccccc\",  --  3\n\t\t\t\t\"ccccc\",  --  4\n\t\t\t\t\"ccccc\",  --  5\n\t\t\t\t\"ccccc\",  --  6\n\t\t\t\t\"ccccc\",  --  7\n\t\t\t\t\"ccccc\",  --  8\n\t\t\t\t\"ccccc\",  --  9\n\t\t\t\t\"accca\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"addda\",  --  0\n\t\t\t\t\"mdddm\",  --  1\n\t\t\t\t\"aceca\",  --  2\n\t\t\t\t\"ceeec\",  --  3\n\t\t\t\t\"ceeec\",  --  4\n\t\t\t\t\"ceeec\",  --  5\n\t\t\t\t\"ceeec\",  --  6\n\t\t\t\t\"ceeec\",  --  7\n\t\t\t\t\"ceeec\",  --  8\n\t\t\t\t\"ceeec\",  --  9\n\t\t\t\t\"accca\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"acfca\",  --  2\n\t\t\t\t\"cg..c\",  --  3\n\t\t\t\t\"c...c\",  --  4\n\t\t\t\t\"c..hc\",  --  5\n\t\t\t\t\"c..ic\",  --  6\n\t\t\t\t\"c..jc\",  --  7\n\t\t\t\t\"c...c\",  --  8\n\t\t\t\t\"cklnc\",  --  9\n\t\t\t\t\"accca\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"acoca\",  --  2\n\t\t\t\t\"cg..c\",  --  3\n\t\t\t\t\"c..pc\",  --  4\n\t\t\t\t\"q...q\",  --  5\n\t\t\t\t\"q..rq\",  --  6\n\t\t\t\t\"q...q\",  --  7\n\t\t\t\t\"c...c\",  --  8\n\t\t\t\t\"c...c\",  --  9\n\t\t\t\t\"acqca\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"s...s\",  --  0\n\t\t\t\t\"c...c\",  --  1\n\t\t\t\t\"accca\",  --  2\n\t\t\t\t\"cgttc\",  --  3\n\t\t\t\t\"ctttc\",  --  4\n\t\t\t\t\"utttv\",  --  5\n\t\t\t\t\"utttv\",  --  6\n\t\t\t\t\"utttv\",  --  7\n\t\t\t\t\"ctttc\",  --  8\n\t\t\t\t\"ctttc\",  --  9\n\t\t\t\t\"acwca\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"cxcxc\",  --  2\n\t\t\t\t\"xy..x\",  --  3\n\t\t\t\t\"x...x\",  --  4\n\t\t\t\t\"x...x\",  --  5\n\t\t\t\t\"c...c\",  --  6\n\t\t\t\t\"x...x\",  --  7\n\t\t\t\t\"x...x\",  --  8\n\t\t\t\t\"x...x\",  --  9\n\t\t\t\t\"cxcxc\",  -- 10\n\n\t\t\t},\n\t\t},  -- LittleHouse4\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MediumHouse1\",\n\t\t\t\tName         = \"Desert 71\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"71\",\n\t\t\t\tID           = \"561\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 9,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"80\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 12: 0\",  -- sand\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h: 85: 0\",  -- fence\n\t\t\t\t\"i: 64: 0\",  -- woodendoorblock\n\t\t\t\t\"j: 65: 5\",  -- ladder\n\t\t\t\t\"k: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"l:101: 0\",  -- ironbars\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 64: 8\",  -- woodendoorblock\n\t\t\t\t\"o: 50: 4\",  -- torch\n\t\t\t\t\"p:128: 2\",  -- sandstonestairs\n\t\t\t\t\"q:126: 8\",  -- woodenslab\n\t\t\t\t\"r:128: 4\",  -- sandstonestairs\n\t\t\t\t\"s:128: 7\",  -- sandstonestairs\n\t\t\t\t\"t: 44: 1\",  -- stone_slab\n\t\t\t\t\"u: 50: 3\",  -- torch\n\t\t\t\t\"v:128: 6\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmabbbammmmmmm\",  --  0\n\t\t\t\t\"mmmmbbbmmmmmmmm\",  --  1\n\t\t\t\t\"acccccccccacccc\",  --  2\n\t\t\t\t\"ccccccccccccccc\",  --  3\n\t\t\t\t\"ccccccccccccccc\",  --  4\n\t\t\t\t\"ccccccccccccccc\",  --  5\n\t\t\t\t\"ccccccccccccccc\",  --  6\n\t\t\t\t\"ccccccccccccccc\",  --  7\n\t\t\t\t\"acccccccccacccc\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmadddammmmmmm\",  --  0\n\t\t\t\t\"mmmmdddmmmmmmmm\",  --  1\n\t\t\t\t\"acccceccccaffff\",  --  2\n\t\t\t\t\"ceeeeeeeeecffff\",  --  3\n\t\t\t\t\"ceeeeeeeeecffff\",  --  4\n\t\t\t\t\"ceeeeeeeeeeffff\",  --  5\n\t\t\t\t\"ceeeeeeeeecffff\",  --  6\n\t\t\t\t\"ceeeeeeeeecffff\",  --  7\n\t\t\t\t\"acccccccccaffff\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmma...ammmmmmm\",  --  0\n\t\t\t\t\"mmm.....mmmmmmm\",  --  1\n\t\t\t\t\"accccgccccahhhh\",  --  2\n\t\t\t\t\"c.........c...h\",  --  3\n\t\t\t\t\"c.........c...h\",  --  4\n\t\t\t\t\"c.........i...h\",  --  5\n\t\t\t\t\"c.........c...h\",  --  6\n\t\t\t\t\"c.........cj..h\",  --  7\n\t\t\t\t\"acccccccccahhhh\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmma...ammmmmmm\",  --  0\n\t\t\t\t\"mmm.....mmmmmmm\",  --  1\n\t\t\t\t\"acccckcccca....\",  --  2\n\t\t\t\t\"c.........c....\",  --  3\n\t\t\t\t\"l.........c....\",  --  4\n\t\t\t\t\"l.........n....\",  --  5\n\t\t\t\t\"l.........c....\",  --  6\n\t\t\t\t\"c..o...o..cj...\",  --  7\n\t\t\t\t\"accclllccca....\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmp...pmmmmmmm\",  --  0\n\t\t\t\t\"mmmc...cmmmmmmm\",  --  1\n\t\t\t\t\"accccccccca....\",  --  2\n\t\t\t\t\"cqqqqqqqqqc....\",  --  3\n\t\t\t\t\"rqqqqqqqqqc....\",  --  4\n\t\t\t\t\"rqqqqqqqqqc....\",  --  5\n\t\t\t\t\"rqqqqqqqqqc....\",  --  6\n\t\t\t\t\"cqqqqqqqqqcj...\",  --  7\n\t\t\t\t\"acccsssccca....\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmm.....mmmmmmm\",  --  0\n\t\t\t\t\"mmm.....mmmmmmm\",  --  1\n\t\t\t\t\"cttttcttttc....\",  --  2\n\t\t\t\t\"t..accca..t....\",  --  3\n\t\t\t\t\"t..c...c..t....\",  --  4\n\t\t\t\t\"c.........c....\",  --  5\n\t\t\t\t\"t..c...c..t....\",  --  6\n\t\t\t\t\"t..accca..t....\",  --  7\n\t\t\t\t\"cttttcttttc....\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...aclca.......\",  --  3\n\t\t\t\t\"...cu..c.......\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...c...c.......\",  --  6\n\t\t\t\t\"...aclca.......\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...acvca.......\",  --  3\n\t\t\t\t\"...cqqqc.......\",  --  4\n\t\t\t\t\"...cqqqc.......\",  --  5\n\t\t\t\t\"...cqqqc.......\",  --  6\n\t\t\t\t\"...acsca.......\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...ctctc.......\",  --  3\n\t\t\t\t\"...t...t.......\",  --  4\n\t\t\t\t\"...c...c.......\",  --  5\n\t\t\t\t\"...t...t.......\",  --  6\n\t\t\t\t\"...ctctc.......\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t},\n\t\t},  -- MediumHouse1\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleHouse2\",\n\t\t\t\tName         = \"Desert 72\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"72\",\n\t\t\t\tID           = \"562\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 6,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 12: 0\",  -- sand\n\t\t\t\t\"e: 13: 0\",  -- gravel\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h: 65: 5\",  -- ladder\n\t\t\t\t\"i: 85: 0\",  -- fence\n\t\t\t\t\"j:101: 0\",  -- ironbars\n\t\t\t\t\"k: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 2\",  -- sandstonestairs\n\t\t\t\t\"o:128: 6\",  -- sandstonestairs\n\t\t\t\t\"p:126: 8\",  -- woodenslab\n\t\t\t\t\"q:128: 4\",  -- sandstonestairs\n\t\t\t\t\"r:128: 5\",  -- sandstonestairs\n\t\t\t\t\"s:128: 7\",  -- sandstonestairs\n\t\t\t\t\"t: 44: 1\",  -- stone_slab\n\t\t\t\t\"u: 96: 0\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mabbbam\",  --  0\n\t\t\t\t\"mmbbbmm\",  --  1\n\t\t\t\t\"accccca\",  --  2\n\t\t\t\t\"ccccccc\",  --  3\n\t\t\t\t\"ccccccc\",  --  4\n\t\t\t\t\"ccccccc\",  --  5\n\t\t\t\t\"accccca\",  --  6\n\t\t\t\t\"ddddddd\",  --  7\n\t\t\t\t\"ddddddd\",  --  8\n\t\t\t\t\"ddddddd\",  --  9\n\t\t\t\t\"ddddddd\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"maeeeam\",  --  0\n\t\t\t\t\"mmeeemm\",  --  1\n\t\t\t\t\"acccfca\",  --  2\n\t\t\t\t\"cfffffc\",  --  3\n\t\t\t\t\"cfffffc\",  --  4\n\t\t\t\t\"cfffffc\",  --  5\n\t\t\t\t\"acfccca\",  --  6\n\t\t\t\t\"ddddddd\",  --  7\n\t\t\t\t\"ddddddd\",  --  8\n\t\t\t\t\"ddddddd\",  --  9\n\t\t\t\t\"ddddddd\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"ma...am\",  --  0\n\t\t\t\t\"m.....m\",  --  1\n\t\t\t\t\"acccgca\",  --  2\n\t\t\t\t\"c.....c\",  --  3\n\t\t\t\t\"c.....c\",  --  4\n\t\t\t\t\"ch....c\",  --  5\n\t\t\t\t\"ac.ccca\",  --  6\n\t\t\t\t\"i.....i\",  --  7\n\t\t\t\t\"i.....i\",  --  8\n\t\t\t\t\"i.....i\",  --  9\n\t\t\t\t\"iiiiiii\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"ma...am\",  --  0\n\t\t\t\t\"m.....m\",  --  1\n\t\t\t\t\"acjckca\",  --  2\n\t\t\t\t\"c..l..c\",  --  3\n\t\t\t\t\"j.....j\",  --  4\n\t\t\t\t\"ch....c\",  --  5\n\t\t\t\t\"ac.cjca\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mn...nm\",  --  0\n\t\t\t\t\"mc...cm\",  --  1\n\t\t\t\t\"acoccca\",  --  2\n\t\t\t\t\"cpppppc\",  --  3\n\t\t\t\t\"qpppppr\",  --  4\n\t\t\t\t\"chppppc\",  --  5\n\t\t\t\t\"acccsca\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"m.....m\",  --  0\n\t\t\t\t\"m.....m\",  --  1\n\t\t\t\t\"cttcttc\",  --  2\n\t\t\t\t\"t.....t\",  --  3\n\t\t\t\t\"c.....c\",  --  4\n\t\t\t\t\"tu....t\",  --  5\n\t\t\t\t\"cttcttc\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\n\t\t\t},\n\t\t},  -- LittleHouse2\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleHouse7\",\n\t\t\t\tName         = \"Desert 73\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"73\",\n\t\t\t\tID           = \"563\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 65: 2\",  -- ladder\n\t\t\t\t\"h:101: 0\",  -- ironbars\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 50: 1\",  -- torch\n\t\t\t\t\"k: 50: 2\",  -- torch\n\t\t\t\t\"l:128: 2\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 6\",  -- sandstonestairs\n\t\t\t\t\"o:126: 8\",  -- woodenslab\n\t\t\t\t\"p:128: 4\",  -- sandstonestairs\n\t\t\t\t\"q:128: 5\",  -- sandstonestairs\n\t\t\t\t\"r:128: 7\",  -- sandstonestairs\n\t\t\t\t\"s: 44: 1\",  -- stone_slab\n\t\t\t\t\"t: 96: 2\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmabbba\",  --  0\n\t\t\t\t\"mmmmmbbbm\",  --  1\n\t\t\t\t\"accccccca\",  --  2\n\t\t\t\t\"ccccccccc\",  --  3\n\t\t\t\t\"ccccccccc\",  --  4\n\t\t\t\t\"ccccccccc\",  --  5\n\t\t\t\t\"acccacccc\",  --  6\n\t\t\t\t\"mmmmccccc\",  --  7\n\t\t\t\t\"mmmmccccc\",  --  8\n\t\t\t\t\"mmmmccccc\",  --  9\n\t\t\t\t\"mmmmaccca\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmaddda\",  --  0\n\t\t\t\t\"mmmmmdddm\",  --  1\n\t\t\t\t\"accccceca\",  --  2\n\t\t\t\t\"ceeeeeeec\",  --  3\n\t\t\t\t\"ceeeeeeec\",  --  4\n\t\t\t\t\"ceeeeeeec\",  --  5\n\t\t\t\t\"acccaeeec\",  --  6\n\t\t\t\t\"mmmmceeec\",  --  7\n\t\t\t\t\"mmmmceeec\",  --  8\n\t\t\t\t\"mmmmceeec\",  --  9\n\t\t\t\t\"mmmmaccca\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmma...a\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"acccccfca\",  --  2\n\t\t\t\t\"c.......c\",  --  3\n\t\t\t\t\"c.......c\",  --  4\n\t\t\t\t\"c.......c\",  --  5\n\t\t\t\t\"accca...c\",  --  6\n\t\t\t\t\"mmmmc...c\",  --  7\n\t\t\t\t\"mmmmc...c\",  --  8\n\t\t\t\t\"mmmmc..gc\",  --  9\n\t\t\t\t\"mmmmaccca\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmma...a\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"achcccica\",  --  2\n\t\t\t\t\"c.......c\",  --  3\n\t\t\t\t\"h.......c\",  --  4\n\t\t\t\t\"cj......h\",  --  5\n\t\t\t\t\"achca...h\",  --  6\n\t\t\t\t\"mmmmc...h\",  --  7\n\t\t\t\t\"mmmmh..kc\",  --  8\n\t\t\t\t\"mmmmc..gc\",  --  9\n\t\t\t\t\"mmmmachca\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmml...l\",  --  0\n\t\t\t\t\"mmmmc...c\",  --  1\n\t\t\t\t\"acnccccca\",  --  2\n\t\t\t\t\"coooooooc\",  --  3\n\t\t\t\t\"poooooooc\",  --  4\n\t\t\t\t\"coooooooq\",  --  5\n\t\t\t\t\"acrcaoooq\",  --  6\n\t\t\t\t\"mmmmcoooq\",  --  7\n\t\t\t\t\"mmmmpoooc\",  --  8\n\t\t\t\t\"mmmmcoogc\",  --  9\n\t\t\t\t\"mmmmacrca\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmm.....\",  --  0\n\t\t\t\t\"mmmm.....\",  --  1\n\t\t\t\t\"cssscscsc\",  --  2\n\t\t\t\t\"s.......s\",  --  3\n\t\t\t\t\"s.......s\",  --  4\n\t\t\t\t\"s.......s\",  --  5\n\t\t\t\t\"csssc...c\",  --  6\n\t\t\t\t\"mmmms...s\",  --  7\n\t\t\t\t\"mmmms...s\",  --  8\n\t\t\t\t\"mmmms..ts\",  --  9\n\t\t\t\t\"mmmmcsssc\",  -- 10\n\n\t\t\t},\n\t\t},  -- LittleHouse7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MediumHouse2\",\n\t\t\t\tName         = \"Desert 74\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"74\",\n\t\t\t\tID           = \"573\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 10,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"80\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"A:128: 7\",  -- sandstonestairs\n\t\t\t\t\"B: 44: 1\",  -- stone_slab\n\t\t\t\t\"C: 96: 3\",  -- trapdoor\n\t\t\t\t\"D: 96: 2\",  -- trapdoor\n\t\t\t\t\"E:128: 2\",  -- sandstonestairs\n\t\t\t\t\"F:128: 0\",  -- sandstonestairs\n\t\t\t\t\"G: 87: 0\",  -- netherstone\n\t\t\t\t\"H:128: 1\",  -- sandstonestairs\n\t\t\t\t\"I:128: 3\",  -- sandstonestairs\n\t\t\t\t\"J: 51: 0\",  -- fire\n\t\t\t\t\"K: 44: 9\",  -- stone_slab\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c:  4: 0\",  -- cobblestone\n\t\t\t\t\"d: 12: 0\",  -- sand\n\t\t\t\t\"e: 13: 0\",  -- gravel\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 65: 3\",  -- ladder\n\t\t\t\t\"h: 85: 0\",  -- fence\n\t\t\t\t\"i: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"j:134: 1\",  -- sprucewoodstairs\n\t\t\t\t\"k:134: 2\",  -- sprucewoodstairs\n\t\t\t\t\"l: 61: 2\",  -- furnace\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:134: 6\",  -- sprucewoodstairs\n\t\t\t\t\"o:134: 4\",  -- sprucewoodstairs\n\t\t\t\t\"p: 65: 2\",  -- ladder\n\t\t\t\t\"q:101: 0\",  -- ironbars\n\t\t\t\t\"r: 50: 2\",  -- torch\n\t\t\t\t\"s: 47: 0\",  -- bookshelf\n\t\t\t\t\"t: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"u: 50: 3\",  -- torch\n\t\t\t\t\"v:171: 8\",  -- carpet\n\t\t\t\t\"w:128: 6\",  -- sandstonestairs\n\t\t\t\t\"x:126: 8\",  -- woodenslab\n\t\t\t\t\"y:128: 5\",  -- sandstonestairs\n\t\t\t\t\"z:128: 4\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"abbbammmcmm\",  --  0\n\t\t\t\t\"bbbbbdddcdm\",  --  1\n\t\t\t\t\"bbbbbmmmcdm\",  --  2\n\t\t\t\t\"bbbbbmmmcdm\",  --  3\n\t\t\t\t\"bbbbabbbbba\",  --  4\n\t\t\t\t\"bbbbbbbbbbb\",  --  5\n\t\t\t\t\"bbbbbbbbbbb\",  --  6\n\t\t\t\t\"bbbbbbbbbbb\",  --  7\n\t\t\t\t\"abbbbbbbbba\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"abbbammmemm\",  --  0\n\t\t\t\t\"bfffbdddedm\",  --  1\n\t\t\t\t\"bfffbmmmedm\",  --  2\n\t\t\t\t\"bfffbmmmedm\",  --  3\n\t\t\t\t\"bfffabbbfba\",  --  4\n\t\t\t\t\"bfffffffffb\",  --  5\n\t\t\t\t\"bfffffffffb\",  --  6\n\t\t\t\t\"bfffffffffb\",  --  7\n\t\t\t\t\"abbbbbbbbba\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"abbba......\",  --  0\n\t\t\t\t\"bg..bhhh.h.\",  --  1\n\t\t\t\t\"b...b....h.\",  --  2\n\t\t\t\t\"b...b....h.\",  --  3\n\t\t\t\t\"b...abbbiba\",  --  4\n\t\t\t\t\"b.........b\",  --  5\n\t\t\t\t\"bjh.......b\",  --  6\n\t\t\t\t\"bjk.lno..pb\",  --  7\n\t\t\t\t\"abbbbbbbbba\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"abqba......\",  --  0\n\t\t\t\t\"bg..q......\",  --  1\n\t\t\t\t\"b...q......\",  --  2\n\t\t\t\t\"q..rb......\",  --  3\n\t\t\t\t\"q...sbqbtba\",  --  4\n\t\t\t\t\"q......u..b\",  --  5\n\t\t\t\t\"b.v.......q\",  --  6\n\t\t\t\t\"b........pb\",  --  7\n\t\t\t\t\"abbbqqqbbba\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"abwba......\",  --  0\n\t\t\t\t\"bgxxy......\",  --  1\n\t\t\t\t\"bxxxy......\",  --  2\n\t\t\t\t\"zxxxb......\",  --  3\n\t\t\t\t\"zxxxabwbbba\",  --  4\n\t\t\t\t\"zxxxxxxxxxb\",  --  5\n\t\t\t\t\"bxxxxxxxxxy\",  --  6\n\t\t\t\t\"bxxxsssxxpb\",  --  7\n\t\t\t\t\"abbbAAAbbba\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"bBBBb......\",  --  0\n\t\t\t\t\"BC..B......\",  --  1\n\t\t\t\t\"B...B......\",  --  2\n\t\t\t\t\"B...B......\",  --  3\n\t\t\t\t\"b...bBBBBBb\",  --  4\n\t\t\t\t\"Bbbb......B\",  --  5\n\t\t\t\t\"Bbbb......B\",  --  6\n\t\t\t\t\"Bbbb.....DB\",  --  7\n\t\t\t\t\"bBBBBbBBBBb\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\".aEa.......\",  --  5\n\t\t\t\t\".FGH.......\",  --  6\n\t\t\t\t\".aIa.......\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\".a.a.......\",  --  5\n\t\t\t\t\"..J........\",  --  6\n\t\t\t\t\".a.a.......\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\".bbb.......\",  --  5\n\t\t\t\t\".bKb.......\",  --  6\n\t\t\t\t\".bbb.......\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\".B.B.......\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\".B.B.......\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t},\n\t\t},  -- MediumHouse2\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MediumHouse3\",\n\t\t\t\tName         = \"Desert 76\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"76\",\n\t\t\t\tID           = \"575\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 10,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"80\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c:  3: 0\",  -- dirt\n\t\t\t\t\"d: 24: 0\",  -- sandstone\n\t\t\t\t\"e: 13: 0\",  -- gravel\n\t\t\t\t\"f:  2: 0\",  -- grass\n\t\t\t\t\"g:  5: 0\",  -- planks\n\t\t\t\t\"h: 85: 0\",  -- fence\n\t\t\t\t\"i: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"j: 64: 2\",  -- woodendoorblock\n\t\t\t\t\"k: 65: 4\",  -- ladder\n\t\t\t\t\"l: 65: 2\",  -- ladder\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 1\",  -- torch\n\t\t\t\t\"o: 50: 2\",  -- torch\n\t\t\t\t\"p:101: 0\",  -- ironbars\n\t\t\t\t\"q: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"r:128: 2\",  -- sandstonestairs\n\t\t\t\t\"s:128: 6\",  -- sandstonestairs\n\t\t\t\t\"t:126: 8\",  -- woodenslab\n\t\t\t\t\"u:128: 5\",  -- sandstonestairs\n\t\t\t\t\"v:128: 7\",  -- sandstonestairs\n\t\t\t\t\"w: 44: 1\",  -- stone_slab\n\t\t\t\t\"x: 96: 0\",  -- trapdoor\n\t\t\t\t\"y:126: 0\",  -- woodenslab\n\t\t\t\t\"z:128: 4\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmammbbba\",  --  0\n\t\t\t\t\"mmmmmmmmbbbm\",  --  1\n\t\t\t\t\"cccccaddddda\",  --  2\n\t\t\t\t\"cccccddddddd\",  --  3\n\t\t\t\t\"cccccddddddd\",  --  4\n\t\t\t\t\"cccccddddddd\",  --  5\n\t\t\t\t\"cccddddddddd\",  --  6\n\t\t\t\t\"mmmddddddddd\",  --  7\n\t\t\t\t\"mmmdddddddda\",  --  8\n\t\t\t\t\"mmmdddddmmmm\",  --  9\n\t\t\t\t\"mmmadddammmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmammeeea\",  --  0\n\t\t\t\t\"mmmmmmmmeeem\",  --  1\n\t\t\t\t\"fffffadddgda\",  --  2\n\t\t\t\t\"fffffdgggggd\",  --  3\n\t\t\t\t\"fffffggggggd\",  --  4\n\t\t\t\t\"fffffdgggggd\",  --  5\n\t\t\t\t\"fffddggggggd\",  --  6\n\t\t\t\t\"mmmdgggggggd\",  --  7\n\t\t\t\t\"mmmdggggddda\",  --  8\n\t\t\t\t\"mmmdgggdmmmm\",  --  9\n\t\t\t\t\"mmmadddammmm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmma.....a\",  --  0\n\t\t\t\t\"mmmmm.......\",  --  1\n\t\t\t\t\"hhhhhadddida\",  --  2\n\t\t\t\t\"h....d.....d\",  --  3\n\t\t\t\t\"h....j.....d\",  --  4\n\t\t\t\t\"h....d.....d\",  --  5\n\t\t\t\t\"hhhad......d\",  --  6\n\t\t\t\t\"mmmd......kd\",  --  7\n\t\t\t\t\"mmmd....ddda\",  --  8\n\t\t\t\t\"mmmd..ldmmmm\",  --  9\n\t\t\t\t\"mmmadddammmm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmman...oa\",  --  0\n\t\t\t\t\"mmmmm.......\",  --  1\n\t\t\t\t\".....appdqda\",  --  2\n\t\t\t\t\".....d.....d\",  --  3\n\t\t\t\t\".....q.....d\",  --  4\n\t\t\t\t\".....d.....p\",  --  5\n\t\t\t\t\"...hd......d\",  --  6\n\t\t\t\t\"mmmd......kd\",  --  7\n\t\t\t\t\"mmmd....dppa\",  --  8\n\t\t\t\t\"mmmd..ldmmmm\",  --  9\n\t\t\t\t\"mmmhdddhmmmm\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmr.....r\",  --  0\n\t\t\t\t\"mmmmmd.....d\",  --  1\n\t\t\t\t\".....assddda\",  --  2\n\t\t\t\t\".....dtttttd\",  --  3\n\t\t\t\t\".....dtttttd\",  --  4\n\t\t\t\t\".....dtttttu\",  --  5\n\t\t\t\t\"...hdatttttd\",  --  6\n\t\t\t\t\"mmmdttttttkd\",  --  7\n\t\t\t\t\"mmmdtttadvva\",  --  8\n\t\t\t\t\"mmmdttldmmmm\",  --  9\n\t\t\t\t\"mmmhdddhmmmm\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\".....dwwdwwd\",  --  2\n\t\t\t\t\".....w.....w\",  --  3\n\t\t\t\t\".....w.....w\",  --  4\n\t\t\t\t\".....w.....d\",  --  5\n\t\t\t\t\"...hdadh...w\",  --  6\n\t\t\t\t\"mmmd...d..xw\",  --  7\n\t\t\t\t\"mmmd...awwwd\",  --  8\n\t\t\t\t\"mmmd..ldmmmm\",  --  9\n\t\t\t\t\"mmmhdddhmmmm\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"............\",  --  2\n\t\t\t\t\"............\",  --  3\n\t\t\t\t\"............\",  --  4\n\t\t\t\t\"............\",  --  5\n\t\t\t\t\"...hd.dh....\",  --  6\n\t\t\t\t\"mmmd...d....\",  --  7\n\t\t\t\t\"mmmp........\",  --  8\n\t\t\t\t\"mmmd..ldmmmm\",  --  9\n\t\t\t\t\"mmmhdpdhmmmm\",  -- 10\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"............\",  --  2\n\t\t\t\t\"............\",  --  3\n\t\t\t\t\"............\",  --  4\n\t\t\t\t\"............\",  --  5\n\t\t\t\t\"...hd.dh....\",  --  6\n\t\t\t\t\"mmmd...d....\",  --  7\n\t\t\t\t\"mmmp........\",  --  8\n\t\t\t\t\"mmmdn.ldmmmm\",  --  9\n\t\t\t\t\"mmmhdpdhmmmm\",  -- 10\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"............\",  --  2\n\t\t\t\t\"............\",  --  3\n\t\t\t\t\"............\",  --  4\n\t\t\t\t\"............\",  --  5\n\t\t\t\t\"...adsda....\",  --  6\n\t\t\t\t\"mmmdyyyd....\",  --  7\n\t\t\t\t\"mmmzyyyu....\",  --  8\n\t\t\t\t\"mmmdyyldmmmm\",  --  9\n\t\t\t\t\"mmmadvdammmm\",  -- 10\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"............\",  --  2\n\t\t\t\t\"............\",  --  3\n\t\t\t\t\"............\",  --  4\n\t\t\t\t\"............\",  --  5\n\t\t\t\t\"...w.w.w....\",  --  6\n\t\t\t\t\"mmm.........\",  --  7\n\t\t\t\t\"mmmw...w....\",  --  8\n\t\t\t\t\"mmm.....mmmm\",  --  9\n\t\t\t\t\"mmmw.w.wmmmm\",  -- 10\n\n\t\t\t},\n\t\t},  -- MediumHouse3\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LargeHouse1\",\n\t\t\t\tName         = \"Desert 77\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"77\",\n\t\t\t\tID           = \"577\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 14,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 13,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"60\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"A: 96:10\",  -- trapdoor\n\t\t\t\t\"B:128: 4\",  -- sandstonestairs\n\t\t\t\t\"C:128: 5\",  -- sandstonestairs\n\t\t\t\t\"D:128: 7\",  -- sandstonestairs\n\t\t\t\t\"E: 44: 1\",  -- stone_slab\n\t\t\t\t\"F:128: 2\",  -- sandstonestairs\n\t\t\t\t\"G:128: 0\",  -- sandstonestairs\n\t\t\t\t\"H: 87: 0\",  -- netherstone\n\t\t\t\t\"I:128: 3\",  -- sandstonestairs\n\t\t\t\t\"J: 51: 0\",  -- fire\n\t\t\t\t\"K: 44: 9\",  -- stone_slab\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c: 12: 0\",  -- sand\n\t\t\t\t\"d:  4: 0\",  -- cobblestone\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 13: 0\",  -- gravel\n\t\t\t\t\"g: 85: 0\",  -- fence\n\t\t\t\t\"h:  5: 1\",  -- planks\n\t\t\t\t\"i: 64: 2\",  -- woodendoorblock\n\t\t\t\t\"j: 64: 0\",  -- woodendoorblock\n\t\t\t\t\"k: 61: 2\",  -- furnace\n\t\t\t\t\"l:118: 0\",  -- cauldronblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:134: 4\",  -- sprucewoodstairs\n\t\t\t\t\"o: 65: 2\",  -- ladder\n\t\t\t\t\"p:101: 0\",  -- ironbars\n\t\t\t\t\"q: 50: 1\",  -- torch\n\t\t\t\t\"r:140: 0\",  -- flowerpotblock\n\t\t\t\t\"s: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"t: 50: 3\",  -- torch\n\t\t\t\t\"u: 69:12\",  -- lever\n\t\t\t\t\"v: 50: 4\",  -- torch\n\t\t\t\t\"w:128: 6\",  -- sandstonestairs\n\t\t\t\t\"x: 44:10\",  -- stone_slab\n\t\t\t\t\"y:128: 1\",  -- sandstonestairs\n\t\t\t\t\"z: 47: 0\",  -- bookshelf\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmabbbbbbbamm\",  --  0\n\t\t\t\t\"ccccbbbbbbbbbma\",  --  1\n\t\t\t\t\"ccccbbbbbbbbbdd\",  --  2\n\t\t\t\t\"ccccbbbbbbbbbdd\",  --  3\n\t\t\t\t\"ccccbbbbbbbbbdd\",  --  4\n\t\t\t\t\"ccccbbbbbbbbbma\",  --  5\n\t\t\t\t\"ccccbbbbbbbbbmm\",  --  6\n\t\t\t\t\"mmmmbbbbbbbbbmm\",  --  7\n\t\t\t\t\"mmmmbbbbbbbbbmm\",  --  8\n\t\t\t\t\"mmmmbbbbbbbbbmm\",  --  9\n\t\t\t\t\"mmmmabbbbbbbamm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmabbbbbbbamm\",  --  0\n\t\t\t\t\"ccccbeeeeeeebma\",  --  1\n\t\t\t\t\"cccceeeeeeeebff\",  --  2\n\t\t\t\t\"ccccbeeeeeeeeff\",  --  3\n\t\t\t\t\"ccccbeeeeeeebff\",  --  4\n\t\t\t\t\"ccccbeeeeeeebma\",  --  5\n\t\t\t\t\"ccccbeeeeeeebmm\",  --  6\n\t\t\t\t\"mmmmbeeeeeeebmm\",  --  7\n\t\t\t\t\"mmmmbeeeeeeebmm\",  --  8\n\t\t\t\t\"mmmmbeeeeeeebmm\",  --  9\n\t\t\t\t\"mmmmabbbbbbbamm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmabbbbbbbamm\",  --  0\n\t\t\t\t\"ggggb......hb.a\",  --  1\n\t\t\t\t\"g...i.......b..\",  --  2\n\t\t\t\t\"g...b.......j..\",  --  3\n\t\t\t\t\"g...bkln..o.b..\",  --  4\n\t\t\t\t\"g...bbbb.bbbb.a\",  --  5\n\t\t\t\t\"ggggb.......bmm\",  --  6\n\t\t\t\t\"mmmmb.......bmm\",  --  7\n\t\t\t\t\"mmmmb.......bmm\",  --  8\n\t\t\t\t\"mmmmb.......bmm\",  --  9\n\t\t\t\t\"mmmmabbbbbbbamm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmabbpppbbamm\",  --  0\n\t\t\t\t\"....bq.....rb.a\",  --  1\n\t\t\t\t\"....s.......b.t\",  --  2\n\t\t\t\t\"....b.......s..\",  --  3\n\t\t\t\t\"....b.u...o.b.v\",  --  4\n\t\t\t\t\"....bbbb.bbbb.a\",  --  5\n\t\t\t\t\"....p..t.t..pmm\",  --  6\n\t\t\t\t\"mmmmp.......pmm\",  --  7\n\t\t\t\t\"mmmmp.......pmm\",  --  8\n\t\t\t\t\"mmmmb.......bmm\",  --  9\n\t\t\t\t\"mmmmabbpppbbamm\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmabbwwwbbamm\",  --  0\n\t\t\t\t\"....bxxxxxxxbby\",  --  1\n\t\t\t\t\"....bxxxxxxxb..\",  --  2\n\t\t\t\t\"....bxxxxxxxb..\",  --  3\n\t\t\t\t\"....bzzzxxAxb..\",  --  4\n\t\t\t\t\"....bbbbbbbbbby\",  --  5\n\t\t\t\t\"....BxxxxxxxCmm\",  --  6\n\t\t\t\t\"mmmmBxxxxxxxCmm\",  --  7\n\t\t\t\t\"mmmmBxxxxxxxCmm\",  --  8\n\t\t\t\t\"mmmmbxxxxxxxbmm\",  --  9\n\t\t\t\t\"mmmmabbDDDbbamm\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmbEEEbEEEbmm\",  --  0\n\t\t\t\t\"....EabbbbbaE..\",  --  1\n\t\t\t\t\"....Eb.....bE..\",  --  2\n\t\t\t\t\"....Eb.....bE..\",  --  3\n\t\t\t\t\"....Eb.....bE..\",  --  4\n\t\t\t\t\"....babb.bbab..\",  --  5\n\t\t\t\t\"....E.......Emm\",  --  6\n\t\t\t\t\"mmmmE.......Emm\",  --  7\n\t\t\t\t\"mmmmE.......Emm\",  --  8\n\t\t\t\t\"mmmmE.......Emm\",  --  9\n\t\t\t\t\"mmmmbEEEbEEEbmm\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".....abbpbba...\",  --  1\n\t\t\t\t\".....p.....p...\",  --  2\n\t\t\t\t\".....p.....p...\",  --  3\n\t\t\t\t\".....p.....p...\",  --  4\n\t\t\t\t\".....abb.bba...\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".....abbwbba...\",  --  1\n\t\t\t\t\".....BxxxxxC...\",  --  2\n\t\t\t\t\".....BxxxxxC...\",  --  3\n\t\t\t\t\".....BxxxxxC...\",  --  4\n\t\t\t\t\".....abbbbba...\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".....bEEbEEb...\",  --  1\n\t\t\t\t\".....E.bbb.E...\",  --  2\n\t\t\t\t\".....b.bbb.b...\",  --  3\n\t\t\t\t\".....E.bbb.E...\",  --  4\n\t\t\t\t\".....bEEbEEb...\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\".......aFa.....\",  --  2\n\t\t\t\t\".......GHy.....\",  --  3\n\t\t\t\t\".......aIa.....\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\".......a.a.....\",  --  2\n\t\t\t\t\"........J......\",  --  3\n\t\t\t\t\".......a.a.....\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\".......awa.....\",  --  2\n\t\t\t\t\".......B.C.....\",  --  3\n\t\t\t\t\".......aDa.....\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\".......bbb.....\",  --  2\n\t\t\t\t\".......bKb.....\",  --  3\n\t\t\t\t\".......bbb.....\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\".......E.E.....\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\".......E.E.....\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t},\n\t\t},  -- LargeHouse1\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleTower\",\n\t\t\t\tName         = \"Desert 79\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"79\",\n\t\t\t\tID           = \"595\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 9,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 5,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 65: 5\",  -- ladder\n\t\t\t\t\"h: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"i:101: 0\",  -- ironbars\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 2\",  -- sandstonestairs\n\t\t\t\t\"l:126: 8\",  -- woodenslab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 4\",  -- sandstonestairs\n\t\t\t\t\"o:128: 5\",  -- sandstonestairs\n\t\t\t\t\"p:128: 7\",  -- sandstonestairs\n\t\t\t\t\"q:128: 6\",  -- sandstonestairs\n\t\t\t\t\"r: 44: 1\",  -- stone_slab\n\t\t\t\t\"s: 96: 1\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"abbba\",  --  0\n\t\t\t\t\"mbbbm\",  --  1\n\t\t\t\t\"accca\",  --  2\n\t\t\t\t\"ccccc\",  --  3\n\t\t\t\t\"ccccc\",  --  4\n\t\t\t\t\"ccccc\",  --  5\n\t\t\t\t\"accca\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"addda\",  --  0\n\t\t\t\t\"mdddm\",  --  1\n\t\t\t\t\"aceca\",  --  2\n\t\t\t\t\"ceeec\",  --  3\n\t\t\t\t\"ceeec\",  --  4\n\t\t\t\t\"ceeec\",  --  5\n\t\t\t\t\"accca\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"acfca\",  --  2\n\t\t\t\t\"cg..c\",  --  3\n\t\t\t\t\"c...c\",  --  4\n\t\t\t\t\"c...c\",  --  5\n\t\t\t\t\"accca\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"a...a\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"achca\",  --  2\n\t\t\t\t\"cg..c\",  --  3\n\t\t\t\t\"i...i\",  --  4\n\t\t\t\t\"c..jc\",  --  5\n\t\t\t\t\"acica\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"k...k\",  --  0\n\t\t\t\t\"c...c\",  --  1\n\t\t\t\t\"accca\",  --  2\n\t\t\t\t\"cgllc\",  --  3\n\t\t\t\t\"nlllo\",  --  4\n\t\t\t\t\"clllc\",  --  5\n\t\t\t\t\"acpca\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"accca\",  --  2\n\t\t\t\t\"cg..c\",  --  3\n\t\t\t\t\"c...c\",  --  4\n\t\t\t\t\"c...c\",  --  5\n\t\t\t\t\"accca\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"acica\",  --  2\n\t\t\t\t\"cg..c\",  --  3\n\t\t\t\t\"i...i\",  --  4\n\t\t\t\t\"c..jc\",  --  5\n\t\t\t\t\"acica\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"acqca\",  --  2\n\t\t\t\t\"cgllc\",  --  3\n\t\t\t\t\"nlllo\",  --  4\n\t\t\t\t\"clllc\",  --  5\n\t\t\t\t\"acpca\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"crcrc\",  --  2\n\t\t\t\t\"rs..r\",  --  3\n\t\t\t\t\"c...c\",  --  4\n\t\t\t\t\"r...r\",  --  5\n\t\t\t\t\"crcrc\",  --  6\n\n\t\t\t},\n\t\t},  -- LittleTower\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LargeTower\",\n\t\t\t\tName         = \"Desert 80\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"80\",\n\t\t\t\tID           = \"596\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 12,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 11,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 12: 0\",  -- sand\n\t\t\t\t\"d:  5: 0\",  -- planks\n\t\t\t\t\"e: 13: 0\",  -- gravel\n\t\t\t\t\"f:128: 2\",  -- sandstonestairs\n\t\t\t\t\"g:128: 0\",  -- sandstonestairs\n\t\t\t\t\"h: 24: 2\",  -- sandstone\n\t\t\t\t\"i: 71: 3\",  -- irondoorblock\n\t\t\t\t\"j:128: 1\",  -- sandstonestairs\n\t\t\t\t\"k:128: 3\",  -- sandstonestairs\n\t\t\t\t\"l: 77: 4\",  -- stonebutton\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 71: 9\",  -- irondoorblock\n\t\t\t\t\"o: 77: 3\",  -- stonebutton\n\t\t\t\t\"p:128: 6\",  -- sandstonestairs\n\t\t\t\t\"q:128: 4\",  -- sandstonestairs\n\t\t\t\t\"r:128: 5\",  -- sandstonestairs\n\t\t\t\t\"s: 50: 4\",  -- torch\n\t\t\t\t\"t:128: 7\",  -- sandstonestairs\n\t\t\t\t\"u: 85: 0\",  -- fence\n\t\t\t\t\"v: 24: 1\",  -- sandstone\n\t\t\t\t\"w: 44: 1\",  -- stone_slab\n\t\t\t\t\"x: 89: 0\",  -- lightstone\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mabbbam\",  --  0\n\t\t\t\t\"aacdcaa\",  --  1\n\t\t\t\t\"madddam\",  --  2\n\t\t\t\t\"madddam\",  --  3\n\t\t\t\t\"madddam\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"mammmam\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"maeeeam\",  --  0\n\t\t\t\t\"aacdcaa\",  --  1\n\t\t\t\t\"madddam\",  --  2\n\t\t\t\t\"madddam\",  --  3\n\t\t\t\t\"madddam\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"mammmam\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mf...fm\",  --  0\n\t\t\t\t\"ghaiahj\",  --  1\n\t\t\t\t\"ma...am\",  --  2\n\t\t\t\t\"ma...am\",  --  3\n\t\t\t\t\"ma...am\",  --  4\n\t\t\t\t\"ghaaahj\",  --  5\n\t\t\t\t\"mkmmmkm\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"m.l...m\",  --  0\n\t\t\t\t\".hanah.\",  --  1\n\t\t\t\t\".ao..a.\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\".haaah.\",  --  5\n\t\t\t\t\"m.....m\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..pap..\",  --  1\n\t\t\t\t\".q...r.\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\".q.s.r.\",  --  4\n\t\t\t\t\"..tat..\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..aua..\",  --  1\n\t\t\t\t\".a...a.\",  --  2\n\t\t\t\t\".u...u.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\"..aua..\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..aua..\",  --  1\n\t\t\t\t\".a...a.\",  --  2\n\t\t\t\t\".u...u.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\"..aua..\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..aua..\",  --  1\n\t\t\t\t\".a...a.\",  --  2\n\t\t\t\t\".u...u.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\"..aua..\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..faf..\",  --  1\n\t\t\t\t\".g...j.\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\".g...j.\",  --  4\n\t\t\t\t\"..kak..\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".aavaa.\",  --  1\n\t\t\t\t\".a...a.\",  --  2\n\t\t\t\t\".v...v.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\".aavaa.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"...p...\",  --  0\n\t\t\t\t\".haaah.\",  --  1\n\t\t\t\t\".awwwa.\",  --  2\n\t\t\t\t\"qawawar\",  --  3\n\t\t\t\t\".awwwa.\",  --  4\n\t\t\t\t\".haaah.\",  --  5\n\t\t\t\t\"...t...\",  --  6\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"...w...\",  --  0\n\t\t\t\t\".w...w.\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"w..x..w\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".w...w.\",  --  5\n\t\t\t\t\"...w...\",  --  6\n\n\t\t\t},\n\t\t},  -- LargeTower\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BarWithoutBasement\",\n\t\t\t\tName         = \"Desert 81\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"81\",\n\t\t\t\tID           = \"597\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 9,\n\t\t\t\tz = 10,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"80\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"A:126: 8\",  -- woodenslab\n\t\t\t\t\"B:128: 7\",  -- sandstonestairs\n\t\t\t\t\"C: 44: 1\",  -- stone_slab\n\t\t\t\t\"D: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"E:128: 6\",  -- sandstonestairs\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f:128: 5\",  -- sandstonestairs\n\t\t\t\t\"g:107: 0\",  -- fencegate\n\t\t\t\t\"h:128: 4\",  -- sandstonestairs\n\t\t\t\t\"i:134: 1\",  -- sprucewoodstairs\n\t\t\t\t\"j:134: 3\",  -- sprucewoodstairs\n\t\t\t\t\"k: 85: 0\",  -- fence\n\t\t\t\t\"l:134: 0\",  -- sprucewoodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:134: 5\",  -- sprucewoodstairs\n\t\t\t\t\"o:134: 7\",  -- sprucewoodstairs\n\t\t\t\t\"p:134: 4\",  -- sprucewoodstairs\n\t\t\t\t\"q:107: 3\",  -- fencegate\n\t\t\t\t\"r: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"s: 65: 3\",  -- ladder\n\t\t\t\t\"t: 50: 3\",  -- torch\n\t\t\t\t\"u:171: 8\",  -- carpet\n\t\t\t\t\"v:101: 0\",  -- ironbars\n\t\t\t\t\"w: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"x:128: 2\",  -- sandstonestairs\n\t\t\t\t\"y: 24: 1\",  -- sandstone\n\t\t\t\t\"z: 44: 9\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmabbbammm\",  --  0\n\t\t\t\t\"mmmmbbbmmmm\",  --  1\n\t\t\t\t\"accccccccca\",  --  2\n\t\t\t\t\"ccccccccccc\",  --  3\n\t\t\t\t\"ccccccccccc\",  --  4\n\t\t\t\t\"ccccccccccc\",  --  5\n\t\t\t\t\"ccccccccccc\",  --  6\n\t\t\t\t\"ccccccccccc\",  --  7\n\t\t\t\t\"accccccccca\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmadddammm\",  --  0\n\t\t\t\t\"mmmmdddmmmm\",  --  1\n\t\t\t\t\"accceeeccca\",  --  2\n\t\t\t\t\"ceeeeeeeeec\",  --  3\n\t\t\t\t\"ceeeeeeeeec\",  --  4\n\t\t\t\t\"ceeeeeeeeec\",  --  5\n\t\t\t\t\"ceeeeeeeeec\",  --  6\n\t\t\t\t\"ceeeeeeeeec\",  --  7\n\t\t\t\t\"aecccccccca\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmma...ammm\",  --  0\n\t\t\t\t\"mmm.....mmm\",  --  1\n\t\t\t\t\"acccfghccca\",  --  2\n\t\t\t\t\"cij.....jjc\",  --  3\n\t\t\t\t\"cik.....klc\",  --  4\n\t\t\t\t\"c.........c\",  --  5\n\t\t\t\t\"cnoop.....c\",  --  6\n\t\t\t\t\"c...q..iklc\",  --  7\n\t\t\t\t\"arcccccccca\",  --  8\n\t\t\t\t\"mmsmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmma...ammm\",  --  0\n\t\t\t\t\"mmm.....mmm\",  --  1\n\t\t\t\t\"accc...ccca\",  --  2\n\t\t\t\t\"c..t...t..c\",  --  3\n\t\t\t\t\"c.u.....u.c\",  --  4\n\t\t\t\t\"v.........v\",  --  5\n\t\t\t\t\"c.........c\",  --  6\n\t\t\t\t\"c.......u.c\",  --  7\n\t\t\t\t\"awccvvvccca\",  --  8\n\t\t\t\t\"mmsmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmx...xmmm\",  --  0\n\t\t\t\t\"mmmy...cmmm\",  --  1\n\t\t\t\t\"acccfzhccca\",  --  2\n\t\t\t\t\"cAAAAAAAAAc\",  --  3\n\t\t\t\t\"cAAAAAAAAAc\",  --  4\n\t\t\t\t\"hAAAAAAAAAf\",  --  5\n\t\t\t\t\"cAAAAAAAAAc\",  --  6\n\t\t\t\t\"cAAAAAAAAAc\",  --  7\n\t\t\t\t\"acccBBBccca\",  --  8\n\t\t\t\t\"mmsmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmm.....mmm\",  --  0\n\t\t\t\t\"mmm.....mmm\",  --  1\n\t\t\t\t\"cCCCCcCCCCc\",  --  2\n\t\t\t\t\"CacccccccaC\",  --  3\n\t\t\t\t\"Cc.......cC\",  --  4\n\t\t\t\t\"cc.......cc\",  --  5\n\t\t\t\t\"Cc.......cC\",  --  6\n\t\t\t\t\"CaDccccccaC\",  --  7\n\t\t\t\t\"cC.CCcCCCCc\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\".accvvvcca.\",  --  3\n\t\t\t\t\".c.......c.\",  --  4\n\t\t\t\t\".v.......v.\",  --  5\n\t\t\t\t\".c.......c.\",  --  6\n\t\t\t\t\".awcvvvcca.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\".accEEEcca.\",  --  3\n\t\t\t\t\".cAAAAAAAc.\",  --  4\n\t\t\t\t\".hAAAAAAAf.\",  --  5\n\t\t\t\t\".cAAAAAAAc.\",  --  6\n\t\t\t\t\".accBBBcca.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\".cCCCcCCCc.\",  --  3\n\t\t\t\t\".C.......C.\",  --  4\n\t\t\t\t\".c.......c.\",  --  5\n\t\t\t\t\".C.......C.\",  --  6\n\t\t\t\t\".cCCCcCCCc.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\n\t\t\t},\n\t\t},  -- BarWithoutBasement\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BarWithBasement\",\n\t\t\t\tName         = \"Desert 82\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"82\",\n\t\t\t\tID           = \"598\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 12,\n\t\t\t\tz = 10,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 11,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"70\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"A: 65: 3\",  -- ladder\n\t\t\t\t\"B: 50: 3\",  -- torch\n\t\t\t\t\"C:171: 8\",  -- carpet\n\t\t\t\t\"D:101: 0\",  -- ironbars\n\t\t\t\t\"E: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"F:128: 2\",  -- sandstonestairs\n\t\t\t\t\"G: 24: 1\",  -- sandstone\n\t\t\t\t\"H: 44: 9\",  -- stone_slab\n\t\t\t\t\"I:126: 8\",  -- woodenslab\n\t\t\t\t\"J:128: 7\",  -- sandstonestairs\n\t\t\t\t\"K: 44: 1\",  -- stone_slab\n\t\t\t\t\"L: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"M:128: 6\",  -- sandstonestairs\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  1: 0\",  -- stone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 12: 0\",  -- sand\n\t\t\t\t\"e:134: 4\",  -- sprucewoodstairs\n\t\t\t\t\"f:  5: 1\",  -- planks\n\t\t\t\t\"g:134: 5\",  -- sprucewoodstairs\n\t\t\t\t\"h: 65: 5\",  -- ladder\n\t\t\t\t\"i: 17: 3\",  -- tree\n\t\t\t\t\"j: 69:11\",  -- lever\n\t\t\t\t\"k:  4: 0\",  -- cobblestone\n\t\t\t\t\"l:134: 0\",  -- sprucewoodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:134: 1\",  -- sprucewoodstairs\n\t\t\t\t\"o: 50: 4\",  -- torch\n\t\t\t\t\"p: 13: 0\",  -- gravel\n\t\t\t\t\"q:  5: 0\",  -- planks\n\t\t\t\t\"r: 96: 8\",  -- trapdoor\n\t\t\t\t\"s:128: 5\",  -- sandstonestairs\n\t\t\t\t\"t:107: 2\",  -- fencegate\n\t\t\t\t\"u:128: 4\",  -- sandstonestairs\n\t\t\t\t\"v:134: 3\",  -- sprucewoodstairs\n\t\t\t\t\"w: 85: 0\",  -- fence\n\t\t\t\t\"x:134: 7\",  -- sprucewoodstairs\n\t\t\t\t\"y:107: 1\",  -- fencegate\n\t\t\t\t\"z: 64: 1\",  -- woodendoorblock\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmabbbammm\",  --  0\n\t\t\t\t\"mcccccccccm\",  --  1\n\t\t\t\t\"abcccccccba\",  --  2\n\t\t\t\t\"cbcccccccbc\",  --  3\n\t\t\t\t\"cbcccccccbc\",  --  4\n\t\t\t\t\"cbcccccccbc\",  --  5\n\t\t\t\t\"cbcccccccbc\",  --  6\n\t\t\t\t\"cbcccccccbc\",  --  7\n\t\t\t\t\"abbbbbbbbba\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmadddammm\",  --  0\n\t\t\t\t\"mcccccccccm\",  --  1\n\t\t\t\t\"acefg.efgca\",  --  2\n\t\t\t\t\"ccefg.efgcc\",  --  3\n\t\t\t\t\"ccefg.efgcc\",  --  4\n\t\t\t\t\"cc.......cc\",  --  5\n\t\t\t\t\"cc.......cc\",  --  6\n\t\t\t\t\"cch......cc\",  --  7\n\t\t\t\t\"accccccccca\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmadddammm\",  --  0\n\t\t\t\t\"mcccccccccm\",  --  1\n\t\t\t\t\"acfff.fffca\",  --  2\n\t\t\t\t\"ccfff.fffcc\",  --  3\n\t\t\t\t\"ccfif.fifcc\",  --  4\n\t\t\t\t\"cc.j...j.cc\",  --  5\n\t\t\t\t\"cc.......cc\",  --  6\n\t\t\t\t\"cch......cc\",  --  7\n\t\t\t\t\"accccccccca\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmakkkammm\",  --  0\n\t\t\t\t\"mcccccccccm\",  --  1\n\t\t\t\t\"aclfn.lfnca\",  --  2\n\t\t\t\t\"cclfn.lfncc\",  --  3\n\t\t\t\t\"cclfn.lfncc\",  --  4\n\t\t\t\t\"cc.......cc\",  --  5\n\t\t\t\t\"cc.......cc\",  --  6\n\t\t\t\t\"cch..o...cc\",  --  7\n\t\t\t\t\"accccccccca\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmapppammm\",  --  0\n\t\t\t\t\"mmmmpppmmmm\",  --  1\n\t\t\t\t\"acccqqqccca\",  --  2\n\t\t\t\t\"cqqqqqqqqqc\",  --  3\n\t\t\t\t\"cqqqqqqqqqc\",  --  4\n\t\t\t\t\"cqqqqqqqqqc\",  --  5\n\t\t\t\t\"cqqqqqqqqqc\",  --  6\n\t\t\t\t\"cqrqqqqqqqc\",  --  7\n\t\t\t\t\"aqcccccccca\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmma...ammm\",  --  0\n\t\t\t\t\"mmm.....mmm\",  --  1\n\t\t\t\t\"acccstuccca\",  --  2\n\t\t\t\t\"cnv.....vvc\",  --  3\n\t\t\t\t\"cnw.....wlc\",  --  4\n\t\t\t\t\"c.........c\",  --  5\n\t\t\t\t\"cgxxe.....c\",  --  6\n\t\t\t\t\"c...y..nwlc\",  --  7\n\t\t\t\t\"azcccccccca\",  --  8\n\t\t\t\t\"mmAmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmma...ammm\",  --  0\n\t\t\t\t\"mmm.....mmm\",  --  1\n\t\t\t\t\"accc...ccca\",  --  2\n\t\t\t\t\"c..B...B..c\",  --  3\n\t\t\t\t\"c.C.....C.c\",  --  4\n\t\t\t\t\"D.........D\",  --  5\n\t\t\t\t\"c.........c\",  --  6\n\t\t\t\t\"c.......C.c\",  --  7\n\t\t\t\t\"aEccDDDccca\",  --  8\n\t\t\t\t\"mmAmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmF...Fmmm\",  --  0\n\t\t\t\t\"mmmG...cmmm\",  --  1\n\t\t\t\t\"acccsHuccca\",  --  2\n\t\t\t\t\"cIIIIIIIIIc\",  --  3\n\t\t\t\t\"cIIIIIIIIIc\",  --  4\n\t\t\t\t\"uIIIIIIIIIs\",  --  5\n\t\t\t\t\"cIIIIIIIIIc\",  --  6\n\t\t\t\t\"cIIIIIIIIIc\",  --  7\n\t\t\t\t\"acccJJJccca\",  --  8\n\t\t\t\t\"mmAmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmm.....mmm\",  --  0\n\t\t\t\t\"mmm.....mmm\",  --  1\n\t\t\t\t\"cKKKKcKKKKc\",  --  2\n\t\t\t\t\"KacccccccaK\",  --  3\n\t\t\t\t\"Kc.......cK\",  --  4\n\t\t\t\t\"cc.......cc\",  --  5\n\t\t\t\t\"Kc.......cK\",  --  6\n\t\t\t\t\"KaLccccccaK\",  --  7\n\t\t\t\t\"cK.KKcKKKKc\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\".accDDDcca.\",  --  3\n\t\t\t\t\".c.......c.\",  --  4\n\t\t\t\t\".D.......D.\",  --  5\n\t\t\t\t\".c.......c.\",  --  6\n\t\t\t\t\".aEcDDDcca.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\".accMMMcca.\",  --  3\n\t\t\t\t\".cIIIIIIIc.\",  --  4\n\t\t\t\t\".uIIIIIIIs.\",  --  5\n\t\t\t\t\".cIIIIIIIc.\",  --  6\n\t\t\t\t\".accJJJcca.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\".cKKKcKKKc.\",  --  3\n\t\t\t\t\".K.......K.\",  --  4\n\t\t\t\t\".c.......c.\",  --  5\n\t\t\t\t\".K.......K.\",  --  6\n\t\t\t\t\".cKKKcKKKc.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\n\t\t\t},\n\t\t},  -- BarWithBasement\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Temple\",\n\t\t\t\tName         = \"Desert 83\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"83\",\n\t\t\t\tID           = \"599\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 10,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"50\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"A: 51: 0\",  -- fire\n\t\t\t\t\"B: 44: 9\",  -- stone_slab\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 17: 0\",  -- tree\n\t\t\t\t\"h:128: 5\",  -- sandstonestairs\n\t\t\t\t\"i:128: 4\",  -- sandstonestairs\n\t\t\t\t\"j:128: 7\",  -- sandstonestairs\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:118: 3\",  -- cauldronblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:155: 1\",  -- quartzblock\n\t\t\t\t\"o: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"p: 50: 3\",  -- torch\n\t\t\t\t\"q:101: 0\",  -- ironbars\n\t\t\t\t\"r:140: 0\",  -- flowerpotblock\n\t\t\t\t\"s: 24: 1\",  -- sandstone\n\t\t\t\t\"t:128: 2\",  -- sandstonestairs\n\t\t\t\t\"u:126: 8\",  -- woodenslab\n\t\t\t\t\"v: 44: 1\",  -- stone_slab\n\t\t\t\t\"w:128: 0\",  -- sandstonestairs\n\t\t\t\t\"x: 87: 0\",  -- netherstone\n\t\t\t\t\"y:128: 1\",  -- sandstonestairs\n\t\t\t\t\"z:128: 3\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmabbbammmm\",  --  0\n\t\t\t\t\"mmmmmbbbmmmmm\",  --  1\n\t\t\t\t\"accccccccccca\",  --  2\n\t\t\t\t\"ccccccccccccc\",  --  3\n\t\t\t\t\"ccccccccccccc\",  --  4\n\t\t\t\t\"ccccccccccccc\",  --  5\n\t\t\t\t\"ccccccccccccc\",  --  6\n\t\t\t\t\"ccccccccccccc\",  --  7\n\t\t\t\t\"accccccccccca\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmadddammmm\",  --  0\n\t\t\t\t\"mmmmmdddmmmmm\",  --  1\n\t\t\t\t\"accccceccccca\",  --  2\n\t\t\t\t\"ceeeeeeeeeeec\",  --  3\n\t\t\t\t\"ceeeeeeeeeeec\",  --  4\n\t\t\t\t\"ceeeeeeeeeeec\",  --  5\n\t\t\t\t\"ceeeeeeeeeeec\",  --  6\n\t\t\t\t\"ceeeeeeeeeeec\",  --  7\n\t\t\t\t\"accccccccccca\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmm.....mmmm\",  --  1\n\t\t\t\t\"acccccfccccca\",  --  2\n\t\t\t\t\"cgh.......igc\",  --  3\n\t\t\t\t\"cj.........jc\",  --  4\n\t\t\t\t\"c...........c\",  --  5\n\t\t\t\t\"ck.........kc\",  --  6\n\t\t\t\t\"cgh.linhl.igc\",  --  7\n\t\t\t\t\"accccccccccca\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmma...ammmm\",  --  0\n\t\t\t\t\"mmmm.....mmmm\",  --  1\n\t\t\t\t\"acccccoccccca\",  --  2\n\t\t\t\t\"cg...p.p...gc\",  --  3\n\t\t\t\t\"c...........c\",  --  4\n\t\t\t\t\"q...........q\",  --  5\n\t\t\t\t\"c...........c\",  --  6\n\t\t\t\t\"cg...rsr...gc\",  --  7\n\t\t\t\t\"acqqqcccqqqca\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmt...tmmmm\",  --  0\n\t\t\t\t\"mmmms...cmmmm\",  --  1\n\t\t\t\t\"accccccccccca\",  --  2\n\t\t\t\t\"cguuuuuuuuugc\",  --  3\n\t\t\t\t\"cuuuuuuuuuuuc\",  --  4\n\t\t\t\t\"iuuuuuuuuuuuh\",  --  5\n\t\t\t\t\"cuuuuuuuuuuuc\",  --  6\n\t\t\t\t\"cguuuuuuuuugc\",  --  7\n\t\t\t\t\"acjjjcccjjjca\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmm.....mmmm\",  --  0\n\t\t\t\t\"mmmm.....mmmm\",  --  1\n\t\t\t\t\"cvvvvvcvvvvvc\",  --  2\n\t\t\t\t\"v...........v\",  --  3\n\t\t\t\t\"v.ccc...ccc.v\",  --  4\n\t\t\t\t\"c.ccc...ccc.c\",  --  5\n\t\t\t\t\"v.ccc...ccc.v\",  --  6\n\t\t\t\t\"v...........v\",  --  7\n\t\t\t\t\"cvvvvvcvvvvvc\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"..ata...ata..\",  --  4\n\t\t\t\t\"..wxy...wxy..\",  --  5\n\t\t\t\t\"..aza...aza..\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"..a.a...a.a..\",  --  4\n\t\t\t\t\"...A.....A...\",  --  5\n\t\t\t\t\"..a.a...a.a..\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 8\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"..ccc...ccc..\",  --  4\n\t\t\t\t\"..cBc...cBc..\",  --  5\n\t\t\t\t\"..ccc...ccc..\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 9\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\"..v.v...v.v..\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\"..v.v...v.v..\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t},\n\t\t},  -- Temple\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Well\",\n\t\t\t\tName         = \"Desert 90\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"90\",\n\t\t\t\tID           = \"631\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 21,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 20,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 16,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 16,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 16,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 16,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-16\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b: 24: 2\",  -- sandstone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d:  8: 0\",  -- water\n\t\t\t\t\"e:  4: 0\",  -- cobblestone\n\t\t\t\t\"f: 13: 0\",  -- gravel\n\t\t\t\t\"g:128: 1\",  -- sandstonestairs\n\t\t\t\t\"h: 44: 1\",  -- stone_slab\n\t\t\t\t\"i:128: 0\",  -- sandstonestairs\n\t\t\t\t\"j:128: 3\",  -- sandstonestairs\n\t\t\t\t\"k:128: 2\",  -- sandstonestairs\n\t\t\t\t\"l: 44: 9\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:126: 0\",  -- woodenslab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"mcdddcm\",  --  2\n\t\t\t\t\"mcdddcm\",  --  3\n\t\t\t\t\"mcdddcm\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmeeemm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"ecdddce\",  --  2\n\t\t\t\t\"ecdddce\",  --  3\n\t\t\t\t\"ecdddce\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmeeemm\",  --  6\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmfffmm\",  --  0\n\t\t\t\t\"mbcccbm\",  --  1\n\t\t\t\t\"fcdddcf\",  --  2\n\t\t\t\t\"fcdddcf\",  --  3\n\t\t\t\t\"fcdddcf\",  --  4\n\t\t\t\t\"mbcccbm\",  --  5\n\t\t\t\t\"mmfffmm\",  --  6\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mbghibm\",  --  1\n\t\t\t\t\".j...j.\",  --  2\n\t\t\t\t\".h...h.\",  --  3\n\t\t\t\t\".k...k.\",  --  4\n\t\t\t\t\"mbghibm\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t\t-- Level 17\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mb...bm\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"mb...bm\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t\t-- Level 18\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mblllbm\",  --  1\n\t\t\t\t\".l...l.\",  --  2\n\t\t\t\t\".l...l.\",  --  3\n\t\t\t\t\".l...l.\",  --  4\n\t\t\t\t\"mblllbm\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t\t-- Level 19\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mcccccm\",  --  1\n\t\t\t\t\".cnnnc.\",  --  2\n\t\t\t\t\".cnnnc.\",  --  3\n\t\t\t\t\".cnnnc.\",  --  4\n\t\t\t\t\"mcccccm\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t\t-- Level 20\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mh.h.hm\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".h...h.\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"mh.h.hm\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t},\n\t\t},  -- Well\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BlackSmith\",\n\t\t\t\tName         = \"Desert 97\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"97\",\n\t\t\t\tID           = \"642\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 6,\n\t\t\t\tz = 13,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 13,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"50\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c: 24: 0\",  -- sandstone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 12: 0\",  -- sand\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"i: 53: 5\",  -- woodstairs\n\t\t\t\t\"j: 53: 4\",  -- woodstairs\n\t\t\t\t\"k: 10: 0\",  -- lava\n\t\t\t\t\"l: 54: 5\",  -- chest\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"o: 50: 3\",  -- torch\n\t\t\t\t\"p:101: 0\",  -- ironbars\n\t\t\t\t\"q: 50: 1\",  -- torch\n\t\t\t\t\"r: 50: 2\",  -- torch\n\t\t\t\t\"s:128: 2\",  -- sandstonestairs\n\t\t\t\t\"t: 44: 9\",  -- stone_slab\n\t\t\t\t\"u:126: 8\",  -- woodenslab\n\t\t\t\t\"v:128: 4\",  -- sandstonestairs\n\t\t\t\t\"w:128: 5\",  -- sandstonestairs\n\t\t\t\t\"x:128: 7\",  -- sandstonestairs\n\t\t\t\t\"y: 44: 1\",  -- stone_slab\n\t\t\t\t\"z: 43: 1\",  -- doublestoneslab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmabbba\",  --  0\n\t\t\t\t\"mmmmmmbbbbm\",  --  1\n\t\t\t\t\"mmmmmmaccca\",  --  2\n\t\t\t\t\"maccccccccc\",  --  3\n\t\t\t\t\"mcccccccccc\",  --  4\n\t\t\t\t\"mcccccccccc\",  --  5\n\t\t\t\t\"mcccccacccc\",  --  6\n\t\t\t\t\"mcccccacccc\",  --  7\n\t\t\t\t\"acccaaacccc\",  --  8\n\t\t\t\t\"ccccccccccc\",  --  9\n\t\t\t\t\"ccccccccccc\",  -- 10\n\t\t\t\t\"ccccccccccc\",  -- 11\n\t\t\t\t\"accccccccca\",  -- 12\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmaddda\",  --  0\n\t\t\t\t\"mmmmmmddddm\",  --  1\n\t\t\t\t\"mmmmmmaceca\",  --  2\n\t\t\t\t\"mafcfcceeec\",  --  3\n\t\t\t\t\"mcfccfceeec\",  --  4\n\t\t\t\t\"mcccccceeec\",  --  5\n\t\t\t\t\"mcffaaaeeec\",  --  6\n\t\t\t\t\"mffcaaaeeec\",  --  7\n\t\t\t\t\"acccaaaeeec\",  --  8\n\t\t\t\t\"ceeeeeeeeec\",  --  9\n\t\t\t\t\"ceeeeeeeeec\",  -- 10\n\t\t\t\t\"ceeeeeeeeec\",  -- 11\n\t\t\t\t\"accccccccca\",  -- 12\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmma...a\",  --  0\n\t\t\t\t\"mmmmmm.....\",  --  1\n\t\t\t\t\"mmmmmmacgca\",  --  2\n\t\t\t\t\"ma....c...c\",  --  3\n\t\t\t\t\"m.h...c...c\",  --  4\n\t\t\t\t\"m.....c...c\",  --  5\n\t\t\t\t\"m...aac...c\",  --  6\n\t\t\t\t\"mij.akc...c\",  --  7\n\t\t\t\t\"accccca...c\",  --  8\n\t\t\t\t\"cl........c\",  --  9\n\t\t\t\t\"c.........c\",  -- 10\n\t\t\t\t\"c.........c\",  -- 11\n\t\t\t\t\"accccccccca\",  -- 12\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmma...a\",  --  0\n\t\t\t\t\"mmmmmm.....\",  --  1\n\t\t\t\t\"mmmmmmacnca\",  --  2\n\t\t\t\t\"ma....c..oc\",  --  3\n\t\t\t\t\"m.....p...c\",  --  4\n\t\t\t\t\"m.....c...c\",  --  5\n\t\t\t\t\"m...ppc...p\",  --  6\n\t\t\t\t\"m...p.c...p\",  --  7\n\t\t\t\t\"accccca...p\",  --  8\n\t\t\t\t\"cq........c\",  --  9\n\t\t\t\t\"p.........c\",  -- 10\n\t\t\t\t\"c........rc\",  -- 11\n\t\t\t\t\"acccpppccca\",  -- 12\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmms...s\",  --  0\n\t\t\t\t\"mmmmmmc...c\",  --  1\n\t\t\t\t\"mmmmmmaccca\",  --  2\n\t\t\t\t\"mattttcuuuc\",  --  3\n\t\t\t\t\"mtuuuuvuuuc\",  --  4\n\t\t\t\t\"mtuuuucuuuc\",  --  5\n\t\t\t\t\"mtuuaacuuuw\",  --  6\n\t\t\t\t\"mtuua.cuuuw\",  --  7\n\t\t\t\t\"acccccauuuw\",  --  8\n\t\t\t\t\"cuuuuuuuuuc\",  --  9\n\t\t\t\t\"vuuuuuuuuuc\",  -- 10\n\t\t\t\t\"cuuuuuuuuuc\",  -- 11\n\t\t\t\t\"acccxxxccca\",  -- 12\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmm.....\",  --  0\n\t\t\t\t\"mmmmmm.....\",  --  1\n\t\t\t\t\"mmmmmmcyyyc\",  --  2\n\t\t\t\t\"my.y.yy...y\",  --  3\n\t\t\t\t\"m.....y...y\",  --  4\n\t\t\t\t\"my....y...y\",  --  5\n\t\t\t\t\"m...zyz...y\",  --  6\n\t\t\t\t\"my..y.y...c\",  --  7\n\t\t\t\t\"cyyyzyc...y\",  --  8\n\t\t\t\t\"y.........y\",  --  9\n\t\t\t\t\"y.........y\",  -- 10\n\t\t\t\t\"y.........y\",  -- 11\n\t\t\t\t\"cyyyycyyyyc\",  -- 12\n\n\t\t\t},\n\t\t},  -- BlackSmith\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LittleHouse8\",\n\t\t\t\tName         = \"Desert 99\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"99\",\n\t\t\t\tID           = \"739\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 2\",  -- sandstone\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c:  4: 0\",  -- cobblestone\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 64: 2\",  -- woodendoorblock\n\t\t\t\t\"g: 65: 2\",  -- ladder\n\t\t\t\t\"h:101: 0\",  -- ironbars\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 50: 1\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:126: 8\",  -- woodenslab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 5\",  -- sandstonestairs\n\t\t\t\t\"o:128: 4\",  -- sandstonestairs\n\t\t\t\t\"p:128: 7\",  -- sandstonestairs\n\t\t\t\t\"q: 44: 1\",  -- stone_slab\n\t\t\t\t\"r: 96: 2\",  -- trapdoor\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmabbba\",  --  0\n\t\t\t\t\"ccccbbbbb\",  --  1\n\t\t\t\t\"ccccbbbbb\",  --  2\n\t\t\t\t\"ccccbbbbb\",  --  3\n\t\t\t\t\"abbbabbbb\",  --  4\n\t\t\t\t\"bbbbbbbbb\",  --  5\n\t\t\t\t\"bbbbbbbbb\",  --  6\n\t\t\t\t\"bbbbbbbbb\",  --  7\n\t\t\t\t\"abbbbbbba\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmabbba\",  --  0\n\t\t\t\t\"ddddbeeeb\",  --  1\n\t\t\t\t\"ddddeeeeb\",  --  2\n\t\t\t\t\"ddddbeeeb\",  --  3\n\t\t\t\t\"abbbaeeeb\",  --  4\n\t\t\t\t\"beeeeeeeb\",  --  5\n\t\t\t\t\"beeeeeeeb\",  --  6\n\t\t\t\t\"beeeeeeeb\",  --  7\n\t\t\t\t\"abbbbbbba\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmabbba\",  --  0\n\t\t\t\t\"....b...b\",  --  1\n\t\t\t\t\"....f...b\",  --  2\n\t\t\t\t\"....b...b\",  --  3\n\t\t\t\t\"abbba...b\",  --  4\n\t\t\t\t\"b.......b\",  --  5\n\t\t\t\t\"b.......b\",  --  6\n\t\t\t\t\"b......gb\",  --  7\n\t\t\t\t\"abbbbbbba\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmabhba\",  --  0\n\t\t\t\t\"....b...b\",  --  1\n\t\t\t\t\"....i...b\",  --  2\n\t\t\t\t\"....b...h\",  --  3\n\t\t\t\t\"abhbaj..h\",  --  4\n\t\t\t\t\"b.......h\",  --  5\n\t\t\t\t\"h.......b\",  --  6\n\t\t\t\t\"b......gb\",  --  7\n\t\t\t\t\"abbhhhbba\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmabkba\",  --  0\n\t\t\t\t\"....blllb\",  --  1\n\t\t\t\t\"....blllb\",  --  2\n\t\t\t\t\"....bllln\",  --  3\n\t\t\t\t\"abkballln\",  --  4\n\t\t\t\t\"bllllllln\",  --  5\n\t\t\t\t\"olllllllb\",  --  6\n\t\t\t\t\"bllllllgb\",  --  7\n\t\t\t\t\"abbpppbba\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmbqbqb\",  --  0\n\t\t\t\t\"....q...q\",  --  1\n\t\t\t\t\"....q...q\",  --  2\n\t\t\t\t\"....q...q\",  --  3\n\t\t\t\t\"bqqqb...b\",  --  4\n\t\t\t\t\"q.......q\",  --  5\n\t\t\t\t\"b.......q\",  --  6\n\t\t\t\t\"q......rq\",  --  7\n\t\t\t\t\"bqqqbqqqb\",  --  8\n\n\t\t\t},\n\t\t},  -- LittleHouse8\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/Villages/JapaneseVillage.cubeset",
    "content": "\n-- JapaneseVillage.cubeset\n\n-- Defines the prefabs in the group JapaneseVillage\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-30 13:45:59\",\n\t\t[\"AllowedBiomes\"] = \"Plains, Savanna, SavannaM, SunflowerPlains\",\n\t\t[\"IntendedUse\"] = \"Village\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Restaurant\",\n\t\t\t\tName         = \"Plains 61\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"61\",\n\t\t\t\tID           = \"117\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 10,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 14,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 7,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b:135: 0\",  -- whitewoodstairs\n\t\t\t\t\"c:135: 2\",  -- whitewoodstairs\n\t\t\t\t\"d:135: 1\",  -- whitewoodstairs\n\t\t\t\t\"e: 17: 9\",  -- tree\n\t\t\t\t\"f:135: 3\",  -- whitewoodstairs\n\t\t\t\t\"g: 85: 0\",  -- fence\n\t\t\t\t\"h: 17: 1\",  -- tree\n\t\t\t\t\"i:171: 0\",  -- carpet\n\t\t\t\t\"j:171:12\",  -- carpet\n\t\t\t\t\"k:126: 1\",  -- woodenslab\n\t\t\t\t\"l: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 35: 0\",  -- wool\n\t\t\t\t\"o: 50: 3\",  -- torch\n\t\t\t\t\"p: 50: 1\",  -- torch\n\t\t\t\t\"q: 50: 4\",  -- torch\n\t\t\t\t\"r: 35:14\",  -- wool\n\t\t\t\t\"s: 44: 8\",  -- stone_slab\n\t\t\t\t\"t: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"u: 44: 0\",  -- stone_slab\n\t\t\t\t\"v: 17: 5\",  -- tree\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaaaaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"maaaaaaaaaaaaam\",  -- 11\n\t\t\t\t\"maaaaaaaaaaaaam\",  -- 12\n\t\t\t\t\"maaaaaaaaaaaaam\",  -- 13\n\t\t\t\t\"mmmmaaaaaaammmm\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcccccd....\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  3\n\t\t\t\t\"caaaaaaaaaaaaac\",  --  4\n\t\t\t\t\"baaaaaaaaaaaaad\",  --  5\n\t\t\t\t\"baaaaaaaaaaaaad\",  --  6\n\t\t\t\t\"baaaaaaaaaaeaad\",  --  7\n\t\t\t\t\"baaaaaaaaaaaaad\",  --  8\n\t\t\t\t\"baaaaaaaaaaaaad\",  --  9\n\t\t\t\t\"faaaaaaaaaaaaaf\",  -- 10\n\t\t\t\t\".aaaaaaaaaaaaa.\",  -- 11\n\t\t\t\t\".aaaaaaaaaaaaa.\",  -- 12\n\t\t\t\t\".aaaaaaaaaaaaa.\",  -- 13\n\t\t\t\t\"....bfffffd....\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".gggg.....gggg.\",  --  1\n\t\t\t\t\".g...........g.\",  --  2\n\t\t\t\t\".g.hhhhhhhhh.g.\",  --  3\n\t\t\t\t\".g.hiiijiiih.g.\",  --  4\n\t\t\t\t\"...hikijikih...\",  --  5\n\t\t\t\t\"...hiiijiiihg..\",  --  6\n\t\t\t\t\"...hjjjjjjj....\",  --  7\n\t\t\t\t\"...hiiijiiihg..\",  --  8\n\t\t\t\t\"...hikijikih...\",  --  9\n\t\t\t\t\".g.hiiijiiih.g.\",  -- 10\n\t\t\t\t\".g.hhhhhhhhh.g.\",  -- 11\n\t\t\t\t\".g...........g.\",  -- 12\n\t\t\t\t\".gggg.....gggg.\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".l..g.....g..l.\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...hnnnhnnnh...\",  --  3\n\t\t\t\t\".g.n.......n.g.\",  --  4\n\t\t\t\t\"...n.......n...\",  --  5\n\t\t\t\t\"...n.......hl..\",  --  6\n\t\t\t\t\"...h...........\",  --  7\n\t\t\t\t\"...n.......hl..\",  --  8\n\t\t\t\t\"...n.......n...\",  --  9\n\t\t\t\t\".g.n.......n.g.\",  -- 10\n\t\t\t\t\"...hnnnhnnnh...\",  -- 11\n\t\t\t\t\"...............\",  -- 12\n\t\t\t\t\".l..g.....g..l.\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"....g.....g....\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...hn.nhn.nh...\",  --  3\n\t\t\t\t\".g.n...o...n.g.\",  --  4\n\t\t\t\t\"...n.......n...\",  --  5\n\t\t\t\t\"...n.......h...\",  --  6\n\t\t\t\t\"...hp......e...\",  --  7\n\t\t\t\t\"...n.......h...\",  --  8\n\t\t\t\t\"...n.......n...\",  --  9\n\t\t\t\t\".g.n...q...n.g.\",  -- 10\n\t\t\t\t\"...hn.nhn.nh...\",  -- 11\n\t\t\t\t\"...............\",  -- 12\n\t\t\t\t\"....g.....g....\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"....g.....g....\",  --  1\n\t\t\t\t\"....ggggggg....\",  --  2\n\t\t\t\t\"...hnnnhnnnh...\",  --  3\n\t\t\t\t\".ggn.......ngg.\",  --  4\n\t\t\t\t\"..gn.......ng..\",  --  5\n\t\t\t\t\"..gn.......hg..\",  --  6\n\t\t\t\t\"..gh..r.r..ng..\",  --  7\n\t\t\t\t\"..gn.......hg..\",  --  8\n\t\t\t\t\"..gn.......ng..\",  --  9\n\t\t\t\t\".ggn.......ngg.\",  -- 10\n\t\t\t\t\"...hnnnhnnnh...\",  -- 11\n\t\t\t\t\"....ggggggg....\",  -- 12\n\t\t\t\t\"....g.....g....\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...stuuuuuts...\",  --  1\n\t\t\t\t\"..sttttttttts..\",  --  2\n\t\t\t\t\".sthvvvhvvvhts.\",  --  3\n\t\t\t\t\".tte.......ett.\",  --  4\n\t\t\t\t\".ute.......etu.\",  --  5\n\t\t\t\t\".ute.......htu.\",  --  6\n\t\t\t\t\".uth..g.g..etu.\",  --  7\n\t\t\t\t\".ute.......htu.\",  --  8\n\t\t\t\t\".ute.......etu.\",  --  9\n\t\t\t\t\".tte.......ett.\",  -- 10\n\t\t\t\t\".sthvvvhvvvhts.\",  -- 11\n\t\t\t\t\"..sttttttttts..\",  -- 12\n\t\t\t\t\"...stuuuuuts...\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".stu.......uts.\",  --  1\n\t\t\t\t\".tu.........ut.\",  --  2\n\t\t\t\t\".u.uuuuuuuuu.u.\",  --  3\n\t\t\t\t\"...utttttttu...\",  --  4\n\t\t\t\t\"...utttttttu...\",  --  5\n\t\t\t\t\"...utttttttu...\",  --  6\n\t\t\t\t\"...utttttttu...\",  --  7\n\t\t\t\t\"...utttttttu...\",  --  8\n\t\t\t\t\"...utttttttu...\",  --  9\n\t\t\t\t\"...utttttttu...\",  -- 10\n\t\t\t\t\".u.uuuuuuuuu.u.\",  -- 11\n\t\t\t\t\".tu.........ut.\",  -- 12\n\t\t\t\t\".stu.......uts.\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".u...........u.\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\".....uuuuu.....\",  --  5\n\t\t\t\t\".....utttu.....\",  --  6\n\t\t\t\t\".....utttu.....\",  --  7\n\t\t\t\t\".....utttu.....\",  --  8\n\t\t\t\t\".....uuuuu.....\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\t\t\t\t\"...............\",  -- 11\n\t\t\t\t\"...............\",  -- 12\n\t\t\t\t\".u...........u.\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\".......u.......\",  --  7\n\t\t\t\t\"...............\",  --  8\n\t\t\t\t\"...............\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\t\t\t\t\"...............\",  -- 11\n\t\t\t\t\"...............\",  -- 12\n\t\t\t\t\"...............\",  -- 13\n\t\t\t\t\"...............\",  -- 14\n\n\t\t\t},\n\t\t},  -- Restaurant\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseMid\",\n\t\t\t\tName         = \"Plains 62\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"62\",\n\t\t\t\tID           = \"119\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 9,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b:135: 2\",  -- whitewoodstairs\n\t\t\t\t\"c:135: 0\",  -- whitewoodstairs\n\t\t\t\t\"d: 17: 9\",  -- tree\n\t\t\t\t\"e:135: 3\",  -- whitewoodstairs\n\t\t\t\t\"f: 85: 0\",  -- fence\n\t\t\t\t\"g: 17: 1\",  -- tree\n\t\t\t\t\"h:171: 0\",  -- carpet\n\t\t\t\t\"i: 50: 5\",  -- torch\n\t\t\t\t\"j: 35: 0\",  -- wool\n\t\t\t\t\"k: 17: 5\",  -- tree\n\t\t\t\t\"l:124: 0\",  -- redstonelampon\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 69: 9\",  -- lever\n\t\t\t\t\"o: 44: 8\",  -- stone_slab\n\t\t\t\t\"p: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"q: 44: 0\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"maaaaaaaaa\",  --  0\n\t\t\t\t\"maaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaa\",  --  6\n\t\t\t\t\"maaaaaaaaa\",  --  7\n\t\t\t\t\"maaaaaaaaa\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".aaaaaaaaa\",  --  0\n\t\t\t\t\".aaaaaaaaa\",  --  1\n\t\t\t\t\"baaaaaaaaa\",  --  2\n\t\t\t\t\"caaaaaaaaa\",  --  3\n\t\t\t\t\"caadaaaaaa\",  --  4\n\t\t\t\t\"caaaaaaaaa\",  --  5\n\t\t\t\t\"eaaaaaaaaa\",  --  6\n\t\t\t\t\".aaaaaaaaa\",  --  7\n\t\t\t\t\".aaaaaaaaa\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".fffffffff\",  --  0\n\t\t\t\t\".f.......f\",  --  1\n\t\t\t\t\".f.ggggg.f\",  --  2\n\t\t\t\t\"...ghhhg.f\",  --  3\n\t\t\t\t\"....hhhg.f\",  --  4\n\t\t\t\t\"...ghhhg.f\",  --  5\n\t\t\t\t\".f.ggggg.f\",  --  6\n\t\t\t\t\".f.......f\",  --  7\n\t\t\t\t\".fffffffff\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".....i...i\",  --  0\n\t\t\t\t\"..........\",  --  1\n\t\t\t\t\".i.jjgjj..\",  --  2\n\t\t\t\t\"...g...j..\",  --  3\n\t\t\t\t\".......g.i\",  --  4\n\t\t\t\t\"...g...j..\",  --  5\n\t\t\t\t\".i.jjgjj..\",  --  6\n\t\t\t\t\"..........\",  --  7\n\t\t\t\t\".....i...i\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\"..........\",  --  1\n\t\t\t\t\"...jjgjj..\",  --  2\n\t\t\t\t\"...g...j..\",  --  3\n\t\t\t\t\"...j...g..\",  --  4\n\t\t\t\t\"...g...j..\",  --  5\n\t\t\t\t\"...jjgjj..\",  --  6\n\t\t\t\t\"..........\",  --  7\n\t\t\t\t\"..........\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\"...f...f..\",  --  1\n\t\t\t\t\"..fgkgkgf.\",  --  2\n\t\t\t\t\"..fd...d..\",  --  3\n\t\t\t\t\"...d.lng..\",  --  4\n\t\t\t\t\"..fd...d..\",  --  5\n\t\t\t\t\"..fgkgkgf.\",  --  6\n\t\t\t\t\"...f...f..\",  --  7\n\t\t\t\t\"..........\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...ooooo..\",  --  0\n\t\t\t\t\"..opppppo.\",  --  1\n\t\t\t\t\".opgjjjgpo\",  --  2\n\t\t\t\t\".opjgggjpo\",  --  3\n\t\t\t\t\".opjgggjpo\",  --  4\n\t\t\t\t\".opjgggjpo\",  --  5\n\t\t\t\t\".opgjjjgpo\",  --  6\n\t\t\t\t\"..opppppo.\",  --  7\n\t\t\t\t\"...ooooo..\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".opq...qpo\",  --  0\n\t\t\t\t\".pq.....qp\",  --  1\n\t\t\t\t\".q.qqqqq.q\",  --  2\n\t\t\t\t\"...qpppq..\",  --  3\n\t\t\t\t\"...qpppq..\",  --  4\n\t\t\t\t\"...qpppq..\",  --  5\n\t\t\t\t\".q.qqqqq.q\",  --  6\n\t\t\t\t\".pq.....qp\",  --  7\n\t\t\t\t\".opq...qpo\",  --  8\n\n\t\t\t\t-- Level 8\n\t\t\t\t\".q.......q\",  --  0\n\t\t\t\t\"..........\",  --  1\n\t\t\t\t\"..........\",  --  2\n\t\t\t\t\"..........\",  --  3\n\t\t\t\t\".....q....\",  --  4\n\t\t\t\t\"..........\",  --  5\n\t\t\t\t\"..........\",  --  6\n\t\t\t\t\"..........\",  --  7\n\t\t\t\t\".q.......q\",  --  8\n\n\t\t\t},\n\t\t},  -- HouseMid\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseWide\",\n\t\t\t\tName         = \"Plains 64\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"64\",\n\t\t\t\tID           = \"121\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 6,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b: 17: 1\",  -- tree\n\t\t\t\t\"c: 35: 0\",  -- wool\n\t\t\t\t\"d:171: 0\",  -- carpet\n\t\t\t\t\"e:126: 1\",  -- woodenslab\n\t\t\t\t\"f: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"g: 85: 0\",  -- fence\n\t\t\t\t\"h: 50: 1\",  -- torch\n\t\t\t\t\"i: 50: 2\",  -- torch\n\t\t\t\t\"j: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"k:126:11\",  -- woodenslab\n\t\t\t\t\"l: 17: 5\",  -- tree\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:126: 3\",  -- woodenslab\n\t\t\t\t\"o:125: 3\",  -- woodendoubleslab\n\t\t\t\t\"p:  5: 3\",  -- planks\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmaaaaaaamm\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaam\",  --  7\n\t\t\t\t\"maaaaaaaaam\",  --  8\n\t\t\t\t\"mmaaaaaaamm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"..bcbcbcb..\",  --  1\n\t\t\t\t\".b.d.....b.\",  --  2\n\t\t\t\t\".cded....c.\",  --  3\n\t\t\t\t\".bded....b.\",  --  4\n\t\t\t\t\".c.d.....c.\",  --  5\n\t\t\t\t\".b.......b.\",  --  6\n\t\t\t\t\".c.......c.\",  --  7\n\t\t\t\t\".b.......b.\",  --  8\n\t\t\t\t\"..bcbfbcb..\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"..bgbgbgb..\",  --  1\n\t\t\t\t\".b.......b.\",  --  2\n\t\t\t\t\".g.......g.\",  --  3\n\t\t\t\t\".bh.....ib.\",  --  4\n\t\t\t\t\".g.......g.\",  --  5\n\t\t\t\t\".b.......b.\",  --  6\n\t\t\t\t\".g.......g.\",  --  7\n\t\t\t\t\".b.......b.\",  --  8\n\t\t\t\t\"..bgbjbgb..\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...kkkkk...\",  --  0\n\t\t\t\t\"..bcbcbcb..\",  --  1\n\t\t\t\t\".b.......b.\",  --  2\n\t\t\t\t\"kc.......ck\",  --  3\n\t\t\t\t\"kb.......bk\",  --  4\n\t\t\t\t\"kc.......ck\",  --  5\n\t\t\t\t\"kb.......bk\",  --  6\n\t\t\t\t\"kc.......ck\",  --  7\n\t\t\t\t\".b.......b.\",  --  8\n\t\t\t\t\"..bcblbcb..\",  --  9\n\t\t\t\t\"...kkkkk...\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".kn.....nk.\",  --  0\n\t\t\t\t\"konnnnnnnok\",  --  1\n\t\t\t\t\"nnnnnnnnnnn\",  --  2\n\t\t\t\t\".nnpppppnn.\",  --  3\n\t\t\t\t\".nnpkkkpnn.\",  --  4\n\t\t\t\t\".nnpkkkpnn.\",  --  5\n\t\t\t\t\".nnpkkkpnn.\",  --  6\n\t\t\t\t\".nnpppppnn.\",  --  7\n\t\t\t\t\"nnnnnnnnnnn\",  --  8\n\t\t\t\t\"kknnnnnnnok\",  --  9\n\t\t\t\t\".kn.....nk.\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"n.........n\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"....nnn....\",  --  4\n\t\t\t\t\"....non....\",  --  5\n\t\t\t\t\"....nnn....\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"n.........n\",  -- 10\n\n\t\t\t},\n\t\t},  -- HouseWide\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseWithGarden\",\n\t\t\t\tName         = \"Plains 67\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"67\",\n\t\t\t\tID           = \"130\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 9,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 16,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 16,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b:  5: 2\",  -- planks\n\t\t\t\t\"c:  2: 0\",  -- grass\n\t\t\t\t\"d:113: 0\",  -- netherbrickfence\n\t\t\t\t\"e: 17: 1\",  -- tree\n\t\t\t\t\"f: 35: 0\",  -- wool\n\t\t\t\t\"g:126: 2\",  -- woodenslab\n\t\t\t\t\"h: 31: 2\",  -- tallgrass\n\t\t\t\t\"i:125: 2\",  -- woodendoubleslab\n\t\t\t\t\"j: 38: 3\",  -- rose\n\t\t\t\t\"k: 38: 2\",  -- rose\n\t\t\t\t\"l: 38: 1\",  -- rose\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 17: 2\",  -- tree\n\t\t\t\t\"o: 50: 4\",  -- torch\n\t\t\t\t\"p: 85: 0\",  -- fence\n\t\t\t\t\"q:140: 0\",  -- flowerpotblock\n\t\t\t\t\"r: 50: 3\",  -- torch\n\t\t\t\t\"s: 44: 8\",  -- stone_slab\n\t\t\t\t\"t: 50: 1\",  -- torch\n\t\t\t\t\"u: 50: 2\",  -- torch\n\t\t\t\t\"v: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"w: 44: 0\",  -- stone_slab\n\t\t\t\t\"x: 18: 2\",  -- leaves\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmaammmmm\",  --  0\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  1\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  2\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  3\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  4\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  5\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  6\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  7\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  8\n\t\t\t\t\"aabbbbbbbbbbaaam\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaaaam\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaam\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaam\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaam\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmccmmmmm\",  --  0\n\t\t\t\t\"aabbbbbbbbbbaacm\",  --  1\n\t\t\t\t\"acbbbbbbbbbbccam\",  --  2\n\t\t\t\t\"acbbbbbbbbbbcaam\",  --  3\n\t\t\t\t\"acbbbbbbbbbbccam\",  --  4\n\t\t\t\t\"acbbbbbbbbbbaacm\",  --  5\n\t\t\t\t\"acbbbbbbbbbbcaam\",  --  6\n\t\t\t\t\"acbbbbbbbbbbccam\",  --  7\n\t\t\t\t\"acbbbbbbbbbbccam\",  --  8\n\t\t\t\t\"acbbbbbbbbbbcaam\",  --  9\n\t\t\t\t\"acccccccccccccam\",  -- 10\n\t\t\t\t\"aaaaaccaacccacam\",  -- 11\n\t\t\t\t\"acacaccacaccccam\",  -- 12\n\t\t\t\t\"accaaccaccaccaam\",  -- 13\n\t\t\t\t\"cccaccccaccacaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"ddeffeffe..eddd.\",  --  1\n\t\t\t\t\"d.fbbgggg..f..d.\",  --  2\n\t\t\t\t\"d.fbgggggggf.hd.\",  --  3\n\t\t\t\t\"d.fbgggggggf..d.\",  --  4\n\t\t\t\t\"d.eggggggggehhd.\",  --  5\n\t\t\t\t\"d.fgiiggiigf.hd.\",  --  6\n\t\t\t\t\"d.fgiiggiigf..d.\",  --  7\n\t\t\t\t\"d.fggggggggf..d.\",  --  8\n\t\t\t\t\"d.efffeefffe.hd.\",  --  9\n\t\t\t\t\"d.............d.\",  -- 10\n\t\t\t\t\"djhhk.jhh..hh.d.\",  -- 11\n\t\t\t\t\"d.jlk.hj.h....d.\",  -- 12\n\t\t\t\t\"d..jh.hh..h..nd.\",  -- 13\n\t\t\t\t\"ddddddddddddddd.\",  -- 14\n\t\t\t\t\"................\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"........o..o....\",  --  0\n\t\t\t\t\"..eppeffe..e....\",  --  1\n\t\t\t\t\"..pqq......p....\",  --  2\n\t\t\t\t\"..pq.......p....\",  --  3\n\t\t\t\t\"..pq.......p....\",  --  4\n\t\t\t\t\"..e........e....\",  --  5\n\t\t\t\t\"..p........p....\",  --  6\n\t\t\t\t\"..p........p....\",  --  7\n\t\t\t\t\"..p........p....\",  --  8\n\t\t\t\t\"..epppeepppe....\",  --  9\n\t\t\t\t\"......rr........\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\".............n..\",  -- 13\n\t\t\t\t\"................\",  -- 14\n\t\t\t\t\"................\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"..ssssssssss....\",  --  0\n\t\t\t\t\".seffeffeffes...\",  --  1\n\t\t\t\t\".sf..r.....fs...\",  --  2\n\t\t\t\t\".sf........fs...\",  --  3\n\t\t\t\t\".sf........fs...\",  --  4\n\t\t\t\t\".set......ues...\",  --  5\n\t\t\t\t\".sf........fs...\",  --  6\n\t\t\t\t\".sf........fs...\",  --  7\n\t\t\t\t\".sf........fs...\",  --  8\n\t\t\t\t\".sefffeefffes...\",  --  9\n\t\t\t\t\"..ssssssssss....\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\".............n..\",  -- 13\n\t\t\t\t\"................\",  -- 14\n\t\t\t\t\"................\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".vw........wv...\",  --  0\n\t\t\t\t\".wwwwwwwwwwww...\",  --  1\n\t\t\t\t\"..wvvvvvvvvw....\",  --  2\n\t\t\t\t\"..wvvvvvvvvw....\",  --  3\n\t\t\t\t\"..wvvvvvvvvw....\",  --  4\n\t\t\t\t\"..wvvvvvvvvw....\",  --  5\n\t\t\t\t\"..wvvvvvvvvw....\",  --  6\n\t\t\t\t\"..wvvvvvvvvw....\",  --  7\n\t\t\t\t\"..wvvvvvvvvw....\",  --  8\n\t\t\t\t\".wwwwwwwwwwww...\",  --  9\n\t\t\t\t\".vw........wv...\",  -- 10\n\t\t\t\t\"............xxx.\",  -- 11\n\t\t\t\t\"...........xxxxx\",  -- 12\n\t\t\t\t\"...........xxnxx\",  -- 13\n\t\t\t\t\"...........xxxxx\",  -- 14\n\t\t\t\t\"............xxx.\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"....wwwwww......\",  --  3\n\t\t\t\t\"....wvvvvw......\",  --  4\n\t\t\t\t\"....wvvvvw......\",  --  5\n\t\t\t\t\"....wvvvvw......\",  --  6\n\t\t\t\t\"....wwwwww......\",  --  7\n\t\t\t\t\"................\",  --  8\n\t\t\t\t\"................\",  --  9\n\t\t\t\t\"................\",  -- 10\n\t\t\t\t\"............xxx.\",  -- 11\n\t\t\t\t\"...........xxxxx\",  -- 12\n\t\t\t\t\"...........xxnxx\",  -- 13\n\t\t\t\t\"...........xxxxx\",  -- 14\n\t\t\t\t\"............xxx.\",  -- 15\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"................\",  --  4\n\t\t\t\t\"......ww........\",  --  5\n\t\t\t\t\"................\",  --  6\n\t\t\t\t\"................\",  --  7\n\t\t\t\t\"................\",  --  8\n\t\t\t\t\"................\",  --  9\n\t\t\t\t\"................\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\"............xxx.\",  -- 12\n\t\t\t\t\"............xnx.\",  -- 13\n\t\t\t\t\"............xx..\",  -- 14\n\t\t\t\t\"................\",  -- 15\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"................\",  --  4\n\t\t\t\t\"................\",  --  5\n\t\t\t\t\"................\",  --  6\n\t\t\t\t\"................\",  --  7\n\t\t\t\t\"................\",  --  8\n\t\t\t\t\"................\",  --  9\n\t\t\t\t\"................\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\".............x..\",  -- 12\n\t\t\t\t\"............xxx.\",  -- 13\n\t\t\t\t\".............x..\",  -- 14\n\t\t\t\t\"................\",  -- 15\n\n\t\t\t},\n\t\t},  -- HouseWithGarden\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseSmall\",\n\t\t\t\tName         = \"Plains 68\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"68\",\n\t\t\t\tID           = \"131\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b: 17: 1\",  -- tree\n\t\t\t\t\"c: 35: 0\",  -- wool\n\t\t\t\t\"d: 50: 4\",  -- torch\n\t\t\t\t\"e: 85: 0\",  -- fence\n\t\t\t\t\"f: 44: 8\",  -- stone_slab\n\t\t\t\t\"g: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"h: 44: 0\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".bcc.b.\",  --  1\n\t\t\t\t\".c...c.\",  --  2\n\t\t\t\t\".c...c.\",  --  3\n\t\t\t\t\".c...c.\",  --  4\n\t\t\t\t\".bcccb.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".....d.\",  --  0\n\t\t\t\t\".bee.b.\",  --  1\n\t\t\t\t\".c...c.\",  --  2\n\t\t\t\t\".e...e.\",  --  3\n\t\t\t\t\".c...c.\",  --  4\n\t\t\t\t\".beeeb.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".fffff.\",  --  0\n\t\t\t\t\"fbcccbf\",  --  1\n\t\t\t\t\"fc...cf\",  --  2\n\t\t\t\t\"fc...cf\",  --  3\n\t\t\t\t\"fc...cf\",  --  4\n\t\t\t\t\"fbcccbf\",  --  5\n\t\t\t\t\".fffff.\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"gh...hg\",  --  0\n\t\t\t\t\"hhhhhhh\",  --  1\n\t\t\t\t\".hgggh.\",  --  2\n\t\t\t\t\".hgggh.\",  --  3\n\t\t\t\t\".hgggh.\",  --  4\n\t\t\t\t\"hhhhhhh\",  --  5\n\t\t\t\t\"gh...hg\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"...h...\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- HouseSmall\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HighTemple\",\n\t\t\t\tName         = \"Plains 70\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"70\",\n\t\t\t\tID           = \"133\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 19,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 18,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b:135: 0\",  -- whitewoodstairs\n\t\t\t\t\"c:135: 2\",  -- whitewoodstairs\n\t\t\t\t\"d:135: 1\",  -- whitewoodstairs\n\t\t\t\t\"e: 17: 9\",  -- tree\n\t\t\t\t\"f:135: 3\",  -- whitewoodstairs\n\t\t\t\t\"g: 85: 0\",  -- fence\n\t\t\t\t\"h: 17: 1\",  -- tree\n\t\t\t\t\"i:171: 0\",  -- carpet\n\t\t\t\t\"j: 50: 5\",  -- torch\n\t\t\t\t\"k: 35: 0\",  -- wool\n\t\t\t\t\"l: 17: 5\",  -- tree\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:124: 0\",  -- redstonelampon\n\t\t\t\t\"o: 69: 9\",  -- lever\n\t\t\t\t\"p: 44: 8\",  -- stone_slab\n\t\t\t\t\"q: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"r: 44: 0\",  -- stone_slab\n\t\t\t\t\"s: 50: 4\",  -- torch\n\t\t\t\t\"t: 50: 1\",  -- torch\n\t\t\t\t\"u: 50: 3\",  -- torch\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmaaaaammm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"aaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaa\",  --  7\n\t\t\t\t\"maaaaaaaaam\",  --  8\n\t\t\t\t\"maaaaaaaaam\",  --  9\n\t\t\t\t\"mmmaaaaammm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...bcccd...\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\"caaaaaaaaac\",  --  3\n\t\t\t\t\"baaaaaaaaad\",  --  4\n\t\t\t\t\"baaeaaaaaad\",  --  5\n\t\t\t\t\"baaaaaaaaad\",  --  6\n\t\t\t\t\"faaaaaaaaaf\",  --  7\n\t\t\t\t\".aaaaaaaaa.\",  --  8\n\t\t\t\t\".aaaaaaaaa.\",  --  9\n\t\t\t\t\"...bfffd...\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".ggg...ggg.\",  --  1\n\t\t\t\t\".g.......g.\",  --  2\n\t\t\t\t\".g.hhhhh.g.\",  --  3\n\t\t\t\t\"...hiiih...\",  --  4\n\t\t\t\t\"....iiih...\",  --  5\n\t\t\t\t\"...hiiih...\",  --  6\n\t\t\t\t\".g.hhhhh.g.\",  --  7\n\t\t\t\t\".g.......g.\",  --  8\n\t\t\t\t\".ggg...ggg.\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".j.g...g.j.\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\".g.kkhkk.g.\",  --  3\n\t\t\t\t\"...h...k...\",  --  4\n\t\t\t\t\".......h...\",  --  5\n\t\t\t\t\"...h...k...\",  --  6\n\t\t\t\t\".g.kkhkk.g.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\".j.g...g.j.\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...g...g...\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\".g.kkhkk.g.\",  --  3\n\t\t\t\t\"...h...k...\",  --  4\n\t\t\t\t\"...k...h...\",  --  5\n\t\t\t\t\"...h...k...\",  --  6\n\t\t\t\t\".g.kkhkk.g.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...g...g...\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...g...g...\",  --  1\n\t\t\t\t\"...ggggg...\",  --  2\n\t\t\t\t\".gghlhlhgg.\",  --  3\n\t\t\t\t\"..ge...eg..\",  --  4\n\t\t\t\t\"..ge.nohg..\",  --  5\n\t\t\t\t\"..ge...eg..\",  --  6\n\t\t\t\t\".gghlhlhgg.\",  --  7\n\t\t\t\t\"...ggggg...\",  --  8\n\t\t\t\t\"...g...g...\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"..pqrrrqp..\",  --  1\n\t\t\t\t\".pqqqqqqqp.\",  --  2\n\t\t\t\t\".qqhkkkhqq.\",  --  3\n\t\t\t\t\".rqkhhhkqr.\",  --  4\n\t\t\t\t\".rqkhhhkqr.\",  --  5\n\t\t\t\t\".rqkhhhkqr.\",  --  6\n\t\t\t\t\".qqhkkkhqq.\",  --  7\n\t\t\t\t\".pqqqqqqqp.\",  --  8\n\t\t\t\t\"..pqrrrqp..\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".qr.....rq.\",  --  1\n\t\t\t\t\".........r.\",  --  2\n\t\t\t\t\"...hhhhh...\",  --  3\n\t\t\t\t\"...hiiih...\",  --  4\n\t\t\t\t\"....iiih...\",  --  5\n\t\t\t\t\"...hiiih...\",  --  6\n\t\t\t\t\"...hhhhh...\",  --  7\n\t\t\t\t\".r.......r.\",  --  8\n\t\t\t\t\".qr.....rq.\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...kkhkk...\",  --  3\n\t\t\t\t\"...h...k...\",  --  4\n\t\t\t\t\".......h...\",  --  5\n\t\t\t\t\"...h...k...\",  --  6\n\t\t\t\t\"...kkhkk...\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\".....s.....\",  --  2\n\t\t\t\t\"...kkhkk...\",  --  3\n\t\t\t\t\"...h...k...\",  --  4\n\t\t\t\t\"...k...ht..\",  --  5\n\t\t\t\t\"...h...k...\",  --  6\n\t\t\t\t\"...kkhkk...\",  --  7\n\t\t\t\t\".....u.....\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...ggggg...\",  --  2\n\t\t\t\t\"..ghlhlhg..\",  --  3\n\t\t\t\t\"..ge...eg..\",  --  4\n\t\t\t\t\"..ge.nohg..\",  --  5\n\t\t\t\t\"..ge...eg..\",  --  6\n\t\t\t\t\"..ghlhlhg..\",  --  7\n\t\t\t\t\"...ggggg...\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"..prrrrrp..\",  --  1\n\t\t\t\t\".pqqqqqqqp.\",  --  2\n\t\t\t\t\".qqhkkkhqq.\",  --  3\n\t\t\t\t\".rqkhhhkqr.\",  --  4\n\t\t\t\t\".rqkhhhkqr.\",  --  5\n\t\t\t\t\".rqkhhhkqr.\",  --  6\n\t\t\t\t\".qqhkkkhqr.\",  --  7\n\t\t\t\t\".pqqqqqqqp.\",  --  8\n\t\t\t\t\"..pqrrrqp..\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".qr.....rq.\",  --  1\n\t\t\t\t\".r.......r.\",  --  2\n\t\t\t\t\"...hhhhh...\",  --  3\n\t\t\t\t\"...hiiih...\",  --  4\n\t\t\t\t\"....iiih...\",  --  5\n\t\t\t\t\"...hiiih...\",  --  6\n\t\t\t\t\"...hhhhh...\",  --  7\n\t\t\t\t\".r.......r.\",  --  8\n\t\t\t\t\".qr.....rq.\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...kkhkk...\",  --  3\n\t\t\t\t\"...h...k...\",  --  4\n\t\t\t\t\".......h...\",  --  5\n\t\t\t\t\"...h...k...\",  --  6\n\t\t\t\t\"...kkhkk...\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\".....s.....\",  --  2\n\t\t\t\t\"...kkhkk...\",  --  3\n\t\t\t\t\"...h...k...\",  --  4\n\t\t\t\t\"...k...ht..\",  --  5\n\t\t\t\t\"...h...k...\",  --  6\n\t\t\t\t\"...kkhkk...\",  --  7\n\t\t\t\t\".....u.....\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...ggggg...\",  --  2\n\t\t\t\t\"..ghlhlhg..\",  --  3\n\t\t\t\t\"..ge...eg..\",  --  4\n\t\t\t\t\"..ge.nohg..\",  --  5\n\t\t\t\t\"..ge...eg..\",  --  6\n\t\t\t\t\"..ghlhlhg..\",  --  7\n\t\t\t\t\"...ggggg...\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"..pqrrrqp..\",  --  1\n\t\t\t\t\".pqqqqqqqp.\",  --  2\n\t\t\t\t\".qqrrrrrqq.\",  --  3\n\t\t\t\t\".rqrrrrrqr.\",  --  4\n\t\t\t\t\".rqrrrrrqr.\",  --  5\n\t\t\t\t\".rqrrrrrqr.\",  --  6\n\t\t\t\t\".qqrrrrrqq.\",  --  7\n\t\t\t\t\".pqqqqqqqp.\",  --  8\n\t\t\t\t\"..pqrrrqp..\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 17\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".qr.....rq.\",  --  1\n\t\t\t\t\".rr.....rr.\",  --  2\n\t\t\t\t\"...rrrrr...\",  --  3\n\t\t\t\t\"...rqqqr...\",  --  4\n\t\t\t\t\"...rqqqr...\",  --  5\n\t\t\t\t\"...rqqqr...\",  --  6\n\t\t\t\t\"...rrrrr...\",  --  7\n\t\t\t\t\".rr.....rr.\",  --  8\n\t\t\t\t\".qr.....rq.\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t\t-- Level 18\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\".....r.....\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\n\t\t\t},\n\t\t},  -- HighTemple\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseSmallDouble\",\n\t\t\t\tName         = \"Plains 72\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"72\",\n\t\t\t\tID           = \"135\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b: 17: 1\",  -- tree\n\t\t\t\t\"c: 35: 0\",  -- wool\n\t\t\t\t\"d:171:12\",  -- carpet\n\t\t\t\t\"e:135: 1\",  -- whitewoodstairs\n\t\t\t\t\"f:126: 2\",  -- woodenslab\n\t\t\t\t\"g:135: 2\",  -- whitewoodstairs\n\t\t\t\t\"h: 50: 4\",  -- torch\n\t\t\t\t\"i: 85: 0\",  -- fence\n\t\t\t\t\"j: 44: 8\",  -- stone_slab\n\t\t\t\t\"k: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"l: 44: 0\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".bcc.bcccb.\",  --  1\n\t\t\t\t\".cddd.dddc.\",  --  2\n\t\t\t\t\".ceddcdfdc.\",  --  3\n\t\t\t\t\".cggdcdddc.\",  --  4\n\t\t\t\t\".bcccbcccb.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".h...h...h.\",  --  0\n\t\t\t\t\".bii.biiib.\",  --  1\n\t\t\t\t\".c.......c.\",  --  2\n\t\t\t\t\".i...i...i.\",  --  3\n\t\t\t\t\".c...i...c.\",  --  4\n\t\t\t\t\".biiibiiib.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".jjjjjjjjj.\",  --  0\n\t\t\t\t\"jbiiibiiibj\",  --  1\n\t\t\t\t\"jc.......cj\",  --  2\n\t\t\t\t\"jc...c...cj\",  --  3\n\t\t\t\t\"jc...c...cj\",  --  4\n\t\t\t\t\"jbcccbcccbj\",  --  5\n\t\t\t\t\".jjjjjjjjj.\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"kl...l...lk\",  --  0\n\t\t\t\t\"lllllllllll\",  --  1\n\t\t\t\t\".lkkklkkkl.\",  --  2\n\t\t\t\t\".lkjklkkkl.\",  --  3\n\t\t\t\t\".lkkklkkkl.\",  --  4\n\t\t\t\t\"lllllllllll\",  --  5\n\t\t\t\t\"kl...l...lk\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...l...l...\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t},\n\t\t},  -- HouseSmallDouble\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseWithSpa\",\n\t\t\t\tName         = \"Plains 73\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"73\",\n\t\t\t\tID           = \"139\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 8,\n\t\t\t\tz = 14,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 13,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b:  3: 0\",  -- dirt\n\t\t\t\t\"c:  2: 0\",  -- grass\n\t\t\t\t\"d:  8: 0\",  -- water\n\t\t\t\t\"e:135: 3\",  -- whitewoodstairs\n\t\t\t\t\"f:135: 1\",  -- whitewoodstairs\n\t\t\t\t\"g:113: 0\",  -- netherbrickfence\n\t\t\t\t\"h: 17: 1\",  -- tree\n\t\t\t\t\"i: 35: 0\",  -- wool\n\t\t\t\t\"j:171:12\",  -- carpet\n\t\t\t\t\"k: 64: 6\",  -- woodendoorblock\n\t\t\t\t\"l:126: 2\",  -- woodenslab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:135: 2\",  -- whitewoodstairs\n\t\t\t\t\"o: 64: 7\",  -- woodendoorblock\n\t\t\t\t\"p: 50: 4\",  -- torch\n\t\t\t\t\"q: 85: 0\",  -- fence\n\t\t\t\t\"r: 64:12\",  -- woodendoorblock\n\t\t\t\t\"s: 50: 3\",  -- torch\n\t\t\t\t\"t: 44: 8\",  -- stone_slab\n\t\t\t\t\"u: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"v: 44: 0\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaabbbbbbbbb\",  --  7\n\t\t\t\t\".aaaaaabbbbbbbbb\",  --  8\n\t\t\t\t\".aaaaaabbbbbbbbb\",  --  9\n\t\t\t\t\".aaaaaabbbbbbbbb\",  -- 10\n\t\t\t\t\".aaaaaabbbbbbbbb\",  -- 11\n\t\t\t\t\".aaaaaabbbbbbbbb\",  -- 12\n\t\t\t\t\".......bbbbbbbbb\",  -- 13\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaccccc\",  --  7\n\t\t\t\t\"maaaaaaacccccccc\",  --  8\n\t\t\t\t\"maaaaaaacccccccc\",  --  9\n\t\t\t\t\"maaaaaaacccccccc\",  -- 10\n\t\t\t\t\"maaaaaaccccccccc\",  -- 11\n\t\t\t\t\"maaaaaaccccccccc\",  -- 12\n\t\t\t\t\"mmmmmmmccccccccc\",  -- 13\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaddaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaddaaeeef.....\",  --  7\n\t\t\t\t\".aaddaaf........\",  --  8\n\t\t\t\t\".aaddaaf........\",  --  9\n\t\t\t\t\".aaddaae........\",  -- 10\n\t\t\t\t\".aaddaa.........\",  -- 11\n\t\t\t\t\".aaaaaa.........\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\".ggggghiiihiiih.\",  --  1\n\t\t\t\t\".geee.ijjjjjjji.\",  --  2\n\t\t\t\t\".gf...kjjjijlji.\",  --  3\n\t\t\t\t\".gf...innjijjji.\",  --  4\n\t\t\t\t\".g....hiiohiiih.\",  --  5\n\t\t\t\t\".g....g.........\",  --  6\n\t\t\t\t\".g..............\",  --  7\n\t\t\t\t\".g..............\",  --  8\n\t\t\t\t\".g..............\",  --  9\n\t\t\t\t\".g....g.........\",  -- 10\n\t\t\t\t\".g....g.........\",  -- 11\n\t\t\t\t\".gggggg.........\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"......p...p...p.\",  --  0\n\t\t\t\t\".g....hqqqhqqqh.\",  --  1\n\t\t\t\t\"......i.......i.\",  --  2\n\t\t\t\t\"......r...q...q.\",  --  3\n\t\t\t\t\"......i...q...i.\",  --  4\n\t\t\t\t\"......hqqrhqqqh.\",  --  5\n\t\t\t\t\"......g...s.....\",  --  6\n\t\t\t\t\"................\",  --  7\n\t\t\t\t\"................\",  --  8\n\t\t\t\t\"................\",  --  9\n\t\t\t\t\"................\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\".g....g.........\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".tttttttttttttt.\",  --  0\n\t\t\t\t\"tggggghqqqhqqqht\",  --  1\n\t\t\t\t\"tg....i.......it\",  --  2\n\t\t\t\t\"tg....i...i...it\",  --  3\n\t\t\t\t\"tg....i...i...it\",  --  4\n\t\t\t\t\"tg....hiiihiiiht\",  --  5\n\t\t\t\t\"tg....gtttttttt.\",  --  6\n\t\t\t\t\"tg....gt........\",  --  7\n\t\t\t\t\"tg....gt........\",  --  8\n\t\t\t\t\"tg....gt........\",  --  9\n\t\t\t\t\"tg....gt........\",  -- 10\n\t\t\t\t\"tg....gt........\",  -- 11\n\t\t\t\t\"tggggggt........\",  -- 12\n\t\t\t\t\".tttttt.........\",  -- 13\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"uv............vu\",  --  0\n\t\t\t\t\"vvvvvvvvvvvvvvvv\",  --  1\n\t\t\t\t\".vuuuuuuuuuuuuv.\",  --  2\n\t\t\t\t\".vuuuuuutuuuuuv.\",  --  3\n\t\t\t\t\".vuuuuuuuuuuuuv.\",  --  4\n\t\t\t\t\".vuuuuvvvvvvvvvv\",  --  5\n\t\t\t\t\".vuuuuv.......vu\",  --  6\n\t\t\t\t\".vuuuuv.........\",  --  7\n\t\t\t\t\".vuuuuv.........\",  --  8\n\t\t\t\t\".vuuuuv.........\",  --  9\n\t\t\t\t\".vuuuuv.........\",  -- 10\n\t\t\t\t\".vuuuuv.........\",  -- 11\n\t\t\t\t\"vvvvvvvv........\",  -- 12\n\t\t\t\t\"uv....vu........\",  -- 13\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"...vvvvvvvvvv...\",  --  3\n\t\t\t\t\"...vv...........\",  --  4\n\t\t\t\t\"...vv...........\",  --  5\n\t\t\t\t\"...vv...........\",  --  6\n\t\t\t\t\"...vv...........\",  --  7\n\t\t\t\t\"...vv...........\",  --  8\n\t\t\t\t\"...vv...........\",  --  9\n\t\t\t\t\"...vv...........\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t},\n\t\t},  -- HouseWithSpa\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseWithSakura1\",\n\t\t\t\tName         = \"Plains 75\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"75\",\n\t\t\t\tID           = \"141\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 7,\n\t\t\t\tz = 15,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b:  2: 0\",  -- grass\n\t\t\t\t\"c: 17: 5\",  -- tree\n\t\t\t\t\"d:  5: 2\",  -- planks\n\t\t\t\t\"e: 17: 9\",  -- tree\n\t\t\t\t\"f:113: 0\",  -- netherbrickfence\n\t\t\t\t\"g: 17: 1\",  -- tree\n\t\t\t\t\"h: 35: 0\",  -- wool\n\t\t\t\t\"i: 31: 2\",  -- tallgrass\n\t\t\t\t\"j: 54: 2\",  -- chest\n\t\t\t\t\"k: 38: 6\",  -- rose\n\t\t\t\t\"l: 38: 2\",  -- rose\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 4\",  -- torch\n\t\t\t\t\"o: 85: 0\",  -- fence\n\t\t\t\t\"p: 44: 8\",  -- stone_slab\n\t\t\t\t\"q: 35: 6\",  -- wool\n\t\t\t\t\"r: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"s: 44: 0\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 14\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaabbbaaaaaa\",  --  0\n\t\t\t\t\"abbbbbbbbbbba\",  --  1\n\t\t\t\t\"abbaccdabbaba\",  --  2\n\t\t\t\t\"abbedddebbaba\",  --  3\n\t\t\t\t\"abbedddebbbba\",  --  4\n\t\t\t\t\"aabedddebbaba\",  --  5\n\t\t\t\t\"abbacccabbbbb\",  --  6\n\t\t\t\t\"abbbbbbbbbaba\",  --  7\n\t\t\t\t\"aaabbbbbbbbba\",  --  8\n\t\t\t\t\"ababbbbabbbba\",  --  9\n\t\t\t\t\"aababbabbbaba\",  -- 10\n\t\t\t\t\"ababbbbabbbba\",  -- 11\n\t\t\t\t\"ababbbbbbbbba\",  -- 12\n\t\t\t\t\"abbbbbbbbbbba\",  -- 13\n\t\t\t\t\"bbbbbbbbbbbbb\",  -- 14\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"ffff...ffffff\",  --  0\n\t\t\t\t\"f...........f\",  --  1\n\t\t\t\t\"f..ghh.g..i.f\",  --  2\n\t\t\t\t\"f..h...h..i.f\",  --  3\n\t\t\t\t\"f..h...h....f\",  --  4\n\t\t\t\t\"fi.h..jh..i.f\",  --  5\n\t\t\t\t\"f..ghhhg....f\",  --  6\n\t\t\t\t\"f.........i.f\",  --  7\n\t\t\t\t\"fii.........f\",  --  8\n\t\t\t\t\"f.k..k.i....f\",  --  9\n\t\t\t\t\"fl.i..i...g.f\",  -- 10\n\t\t\t\t\"f.i..i.k....f\",  -- 11\n\t\t\t\t\"f.l.k.......f\",  -- 12\n\t\t\t\t\"f.....l.....f\",  -- 13\n\t\t\t\t\"fffffffffffff\",  -- 14\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".......n.....\",  --  1\n\t\t\t\t\"...goo.g.....\",  --  2\n\t\t\t\t\"...h...h.....\",  --  3\n\t\t\t\t\"...o...o.....\",  --  4\n\t\t\t\t\"...h...h.....\",  --  5\n\t\t\t\t\"...gooog.....\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\t\t\t\t\".............\",  --  9\n\t\t\t\t\"..........g..\",  -- 10\n\t\t\t\t\".............\",  -- 11\n\t\t\t\t\".............\",  -- 12\n\t\t\t\t\".............\",  -- 13\n\t\t\t\t\".............\",  -- 14\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\"...ppppp.....\",  --  1\n\t\t\t\t\"..pghhhgp....\",  --  2\n\t\t\t\t\"..ph...hp....\",  --  3\n\t\t\t\t\"..ph...hp....\",  --  4\n\t\t\t\t\"..ph...hp....\",  --  5\n\t\t\t\t\"..pghhhgp....\",  --  6\n\t\t\t\t\"...ppppp.....\",  --  7\n\t\t\t\t\".............\",  --  8\n\t\t\t\t\"..........q..\",  --  9\n\t\t\t\t\".........qgq.\",  -- 10\n\t\t\t\t\"..........q..\",  -- 11\n\t\t\t\t\".............\",  -- 12\n\t\t\t\t\".............\",  -- 13\n\t\t\t\t\".............\",  -- 14\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\"..rs...sr....\",  --  1\n\t\t\t\t\"..sssssss....\",  --  2\n\t\t\t\t\"...srrrs.....\",  --  3\n\t\t\t\t\"...srrrs.....\",  --  4\n\t\t\t\t\"...srrrs.....\",  --  5\n\t\t\t\t\"..sssssss....\",  --  6\n\t\t\t\t\"..rs...sr....\",  --  7\n\t\t\t\t\".............\",  --  8\n\t\t\t\t\".........qqq.\",  --  9\n\t\t\t\t\".........qqq.\",  -- 10\n\t\t\t\t\".........qqq.\",  -- 11\n\t\t\t\t\".............\",  -- 12\n\t\t\t\t\".............\",  -- 13\n\t\t\t\t\".............\",  -- 14\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".....s.......\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\t\t\t\t\".............\",  --  9\n\t\t\t\t\"..........q..\",  -- 10\n\t\t\t\t\".............\",  -- 11\n\t\t\t\t\".............\",  -- 12\n\t\t\t\t\".............\",  -- 13\n\t\t\t\t\".............\",  -- 14\n\n\t\t\t},\n\t\t},  -- HouseWithSakura1\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SakuraDouble\",\n\t\t\t\tName         = \"Plains 76\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"76\",\n\t\t\t\tID           = \"142\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 8,\n\t\t\t\tz = 6,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = -1,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = -1,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b:  2: 0\",  -- grass\n\t\t\t\t\"c: 17: 1\",  -- tree\n\t\t\t\t\"d: 35: 6\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaa\",  --  5\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbbbbbbbbbb\",  --  0\n\t\t\t\t\"bbbbbbbbbbbb\",  --  1\n\t\t\t\t\"bbabbbbbbbbb\",  --  2\n\t\t\t\t\"bbbbbbbbbabb\",  --  3\n\t\t\t\t\"bbbbbbbbbbbb\",  --  4\n\t\t\t\t\"bbbbbbbbbbbb\",  --  5\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"..c.........\",  --  2\n\t\t\t\t\".........c..\",  --  3\n\t\t\t\t\"............\",  --  4\n\t\t\t\t\"............\",  --  5\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"..c.........\",  --  2\n\t\t\t\t\".........c..\",  --  3\n\t\t\t\t\"............\",  --  4\n\t\t\t\t\"............\",  --  5\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"..d.........\",  --  0\n\t\t\t\t\"ddddd.......\",  --  1\n\t\t\t\t\"ddcdd...ddd.\",  --  2\n\t\t\t\t\"ddddd...dcd.\",  --  3\n\t\t\t\t\"..d.....ddd.\",  --  4\n\t\t\t\t\"............\",  --  5\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".ddd........\",  --  0\n\t\t\t\t\".ddd....ddd.\",  --  1\n\t\t\t\t\"ddddd..ddddd\",  --  2\n\t\t\t\t\".ddd...ddcdd\",  --  3\n\t\t\t\t\".ddd...ddddd\",  --  4\n\t\t\t\t\"........ddd.\",  --  5\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"..d......d..\",  --  1\n\t\t\t\t\".ddd....ddd.\",  --  2\n\t\t\t\t\"..d....ddddd\",  --  3\n\t\t\t\t\"........ddd.\",  --  4\n\t\t\t\t\".........d..\",  --  5\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"............\",  --  2\n\t\t\t\t\".........d..\",  --  3\n\t\t\t\t\"............\",  --  4\n\t\t\t\t\"............\",  --  5\n\n\t\t\t},\n\t\t},  -- SakuraDouble\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Forge\",\n\t\t\t\tName         = \"Plains 79\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"79\",\n\t\t\t\tID           = \"145\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 11,\n\t\t\t\tz = 14,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 16,\n\t\t\t\tMaxY = 10,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 17: 1\",  -- tree\n\t\t\t\t\"c: 67: 0\",  -- stonestairs\n\t\t\t\t\"d:  5: 2\",  -- planks\n\t\t\t\t\"e: 67: 2\",  -- stonestairs\n\t\t\t\t\"f:113: 0\",  -- netherbrickfence\n\t\t\t\t\"g:118: 2\",  -- cauldronblock\n\t\t\t\t\"h: 67: 6\",  -- stonestairs\n\t\t\t\t\"i: 67: 4\",  -- stonestairs\n\t\t\t\t\"j: 87: 0\",  -- netherstone\n\t\t\t\t\"k: 67: 7\",  -- stonestairs\n\t\t\t\t\"l: 54: 5\",  -- chest\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 61: 2\",  -- furnace\n\t\t\t\t\"o:101: 0\",  -- ironbars\n\t\t\t\t\"p: 51: 0\",  -- fire\n\t\t\t\t\"q: 50: 4\",  -- torch\n\t\t\t\t\"r: 50: 2\",  -- torch\n\t\t\t\t\"s: 35: 0\",  -- wool\n\t\t\t\t\"t: 67: 3\",  -- stonestairs\n\t\t\t\t\"u: 50: 3\",  -- torch\n\t\t\t\t\"v: 44: 8\",  -- stone_slab\n\t\t\t\t\"w: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"x: 44: 0\",  -- stone_slab\n\t\t\t\t\"y: 17: 5\",  -- tree\n\t\t\t\t\"z: 17: 9\",  -- tree\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  2\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  3\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  4\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  5\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  6\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  7\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  8\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  --  9\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  -- 10\n\t\t\t\t\"mmaaaaaaaaaaaamm\",  -- 11\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 13\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\".....bbbbbbbbb..\",  --  2\n\t\t\t\t\".....cdddddddb..\",  --  3\n\t\t\t\t\".....cddaaaadb..\",  --  4\n\t\t\t\t\"..beeedaaaaadb..\",  --  5\n\t\t\t\t\"..bddddaaaaadb..\",  --  6\n\t\t\t\t\"..bddddaaaaadb..\",  --  7\n\t\t\t\t\"..bddddaaaaadb..\",  --  8\n\t\t\t\t\"..bddddaaaaadb..\",  --  9\n\t\t\t\t\"..bddddddddddb..\",  -- 10\n\t\t\t\t\"..bbbbbbbbbbbb..\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\".....bfffbfffb..\",  --  2\n\t\t\t\t\".............a..\",  --  3\n\t\t\t\t\".............a..\",  --  4\n\t\t\t\t\"..b.....ghh..a..\",  --  5\n\t\t\t\t\"..f.....haa..b..\",  --  6\n\t\t\t\t\"..f.....ija..b..\",  --  7\n\t\t\t\t\"..f.....kaa..a..\",  --  8\n\t\t\t\t\"..f..........a..\",  --  9\n\t\t\t\t\"..fl.........a..\",  -- 10\n\t\t\t\t\"..bffffbbffffb..\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\".....bfffbfffb..\",  --  2\n\t\t\t\t\".............a..\",  --  3\n\t\t\t\t\".............a..\",  --  4\n\t\t\t\t\"..b......nn..a..\",  --  5\n\t\t\t\t\"..f.....oaa..b..\",  --  6\n\t\t\t\t\"..f.....opa..b..\",  --  7\n\t\t\t\t\"..f.....oaa..a..\",  --  8\n\t\t\t\t\"..f..........a..\",  --  9\n\t\t\t\t\"..f..........a..\",  -- 10\n\t\t\t\t\"..bffffbbffffb..\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\".........q...q..\",  --  1\n\t\t\t\t\"....rbsssbsssb..\",  --  2\n\t\t\t\t\".............a..\",  --  3\n\t\t\t\t\"..q..........a..\",  --  4\n\t\t\t\t\"..b......ce..a..\",  --  5\n\t\t\t\t\"..s......ea..b..\",  --  6\n\t\t\t\t\"..s......aa..b..\",  --  7\n\t\t\t\t\"..s......ta..a..\",  --  8\n\t\t\t\t\"..s..........a..\",  --  9\n\t\t\t\t\"..s..........a..\",  -- 10\n\t\t\t\t\".rbssssbbssssb..\",  -- 11\n\t\t\t\t\"..u....uu....u..\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".vwxxxxxxxxxxwv.\",  --  0\n\t\t\t\t\"vvvvvvvvvvvvvvvv\",  --  1\n\t\t\t\t\"wvbyybyyybbyybvw\",  --  2\n\t\t\t\t\"xvz..........zvx\",  --  3\n\t\t\t\t\"xvz..........zvx\",  --  4\n\t\t\t\t\"xvb..........zvx\",  --  5\n\t\t\t\t\"xvz.......a..bvx\",  --  6\n\t\t\t\t\"xvz......ca..bvx\",  --  7\n\t\t\t\t\"xvz.......a..zvx\",  --  8\n\t\t\t\t\"xvz..........zvx\",  --  9\n\t\t\t\t\"xvz..........zvx\",  -- 10\n\t\t\t\t\"wvbyyyyyyyyyybvw\",  -- 11\n\t\t\t\t\"vvvvvvvvvvvvvvvv\",  -- 12\n\t\t\t\t\".vwxxxxxxxxxxwv.\",  -- 13\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"wx............xw\",  --  0\n\t\t\t\t\"x..............x\",  --  1\n\t\t\t\t\"..xxxxxxxxxxxx..\",  --  2\n\t\t\t\t\"..xwwwwwwwwwwx..\",  --  3\n\t\t\t\t\"..xwvvvvvvvvvx..\",  --  4\n\t\t\t\t\"..xwv.......vx..\",  --  5\n\t\t\t\t\"..xwv.....a.vx..\",  --  6\n\t\t\t\t\"..xwv.....a.vx..\",  --  7\n\t\t\t\t\"..xwv.....a.vx..\",  --  8\n\t\t\t\t\"..xwvvvvvvvvvx..\",  --  9\n\t\t\t\t\"..xwwwwwwwwwwx..\",  -- 10\n\t\t\t\t\"..xxxxxxxxxxxx..\",  -- 11\n\t\t\t\t\"x..............x\",  -- 12\n\t\t\t\t\"wx............xw\",  -- 13\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"....xxxxxxxx....\",  --  4\n\t\t\t\t\"....xxxxxxxx....\",  --  5\n\t\t\t\t\"....xwwwwwax....\",  --  6\n\t\t\t\t\"....xwvvvvax....\",  --  7\n\t\t\t\t\"....xwwwwwax....\",  --  8\n\t\t\t\t\"....xxxxxxxx....\",  --  9\n\t\t\t\t\"................\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"................\",  --  4\n\t\t\t\t\"................\",  --  5\n\t\t\t\t\"..........a.....\",  --  6\n\t\t\t\t\".......xx.a.....\",  --  7\n\t\t\t\t\"..........a.....\",  --  8\n\t\t\t\t\"................\",  --  9\n\t\t\t\t\"................\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"................\",  --  4\n\t\t\t\t\"................\",  --  5\n\t\t\t\t\"..........a.....\",  --  6\n\t\t\t\t\"..........a.....\",  --  7\n\t\t\t\t\"..........a.....\",  --  8\n\t\t\t\t\"................\",  --  9\n\t\t\t\t\"................\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"................\",  --  4\n\t\t\t\t\"................\",  --  5\n\t\t\t\t\"..........a.....\",  --  6\n\t\t\t\t\"..........a.....\",  --  7\n\t\t\t\t\"..........a.....\",  --  8\n\t\t\t\t\"................\",  --  9\n\t\t\t\t\"................\",  -- 10\n\t\t\t\t\"................\",  -- 11\n\t\t\t\t\"................\",  -- 12\n\t\t\t\t\"................\",  -- 13\n\n\t\t\t},\n\t\t},  -- Forge\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseSmallWithDoor\",\n\t\t\t\tName         = \"Plains 112\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"112\",\n\t\t\t\tID           = \"264\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b: 17: 1\",  -- tree\n\t\t\t\t\"c: 35: 0\",  -- wool\n\t\t\t\t\"d: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"e: 50: 4\",  -- torch\n\t\t\t\t\"f: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"g: 85: 0\",  -- fence\n\t\t\t\t\"h: 44: 8\",  -- stone_slab\n\t\t\t\t\"i: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"j: 44: 0\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".bcdcb.\",  --  1\n\t\t\t\t\".c...c.\",  --  2\n\t\t\t\t\".c...c.\",  --  3\n\t\t\t\t\".c...c.\",  --  4\n\t\t\t\t\".bcccb.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".....e.\",  --  0\n\t\t\t\t\".bcfcb.\",  --  1\n\t\t\t\t\".g...g.\",  --  2\n\t\t\t\t\".g...g.\",  --  3\n\t\t\t\t\".g...g.\",  --  4\n\t\t\t\t\".bgggb.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".hhhhh.\",  --  0\n\t\t\t\t\"hbcccbh\",  --  1\n\t\t\t\t\"hc...ch\",  --  2\n\t\t\t\t\"hc...ch\",  --  3\n\t\t\t\t\"hc...ch\",  --  4\n\t\t\t\t\"hbcccbh\",  --  5\n\t\t\t\t\".hhhhh.\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ij...ji\",  --  0\n\t\t\t\t\"jjjjjjj\",  --  1\n\t\t\t\t\".jiiij.\",  --  2\n\t\t\t\t\".jiiij.\",  --  3\n\t\t\t\t\".jiiij.\",  --  4\n\t\t\t\t\"jjjjjjj\",  --  5\n\t\t\t\t\"ij...ji\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"...j...\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- HouseSmallWithDoor\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseSmallDblWithDoor\",\n\t\t\t\tName         = \"Plains 113\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"113\",\n\t\t\t\tID           = \"265\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = -1,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 2\",  -- planks\n\t\t\t\t\"b: 17: 9\",  -- tree\n\t\t\t\t\"c: 17: 1\",  -- tree\n\t\t\t\t\"d: 35: 0\",  -- wool\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:171:12\",  -- carpet\n\t\t\t\t\"g:135: 1\",  -- whitewoodstairs\n\t\t\t\t\"h:126: 2\",  -- woodenslab\n\t\t\t\t\"i:135: 2\",  -- whitewoodstairs\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"l: 85: 0\",  -- fence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 44: 8\",  -- stone_slab\n\t\t\t\t\"o: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"p: 44: 0\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaabaaaam\",  --  2\n\t\t\t\t\"maaaabaaaam\",  --  3\n\t\t\t\t\"maaaabaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".cdedcdddc.\",  --  1\n\t\t\t\t\".dfff.fffd.\",  --  2\n\t\t\t\t\".dgffdfhfd.\",  --  3\n\t\t\t\t\".diifdfffd.\",  --  4\n\t\t\t\t\".cdddcdddc.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".j...j...j.\",  --  0\n\t\t\t\t\".cdkdclllc.\",  --  1\n\t\t\t\t\".d.......l.\",  --  2\n\t\t\t\t\".l...l...l.\",  --  3\n\t\t\t\t\".d...l...l.\",  --  4\n\t\t\t\t\".clllclllc.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".nnnnnnnnn.\",  --  0\n\t\t\t\t\"ncdddcdddcn\",  --  1\n\t\t\t\t\"nd...d...dn\",  --  2\n\t\t\t\t\"nd...d...dn\",  --  3\n\t\t\t\t\"nd...d...dn\",  --  4\n\t\t\t\t\"ncdddcdddcn\",  --  5\n\t\t\t\t\".nnnnnnnnn.\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"op.......po\",  --  0\n\t\t\t\t\"ppppppppppp\",  --  1\n\t\t\t\t\".pooooooop.\",  --  2\n\t\t\t\t\".ponndnnop.\",  --  3\n\t\t\t\t\".pooooooop.\",  --  4\n\t\t\t\t\"ppppppppppp\",  --  5\n\t\t\t\t\"op.......po\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...ppppp...\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t},\n\t\t},  -- HouseSmallDblWithDoor\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Well\",\n\t\t\t\tName         = \"Plains 143\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"143\",\n\t\t\t\tID           = \"487\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 14,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 13,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-9\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c:  8: 0\",  -- water\n\t\t\t\t\"d: 13: 0\",  -- gravel\n\t\t\t\t\"e: 67: 1\",  -- stonestairs\n\t\t\t\t\"f: 67: 2\",  -- stonestairs\n\t\t\t\t\"g: 67: 0\",  -- stonestairs\n\t\t\t\t\"h: 67: 3\",  -- stonestairs\n\t\t\t\t\"i: 85: 0\",  -- fence\n\t\t\t\t\"j: 44: 8\",  -- stone_slab\n\t\t\t\t\"k: 44: 0\",  -- stone_slab\n\t\t\t\t\"l: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbbbbbm\",  --  1\n\t\t\t\t\"mbcc.bm\",  --  2\n\t\t\t\t\"mbcccbm\",  --  3\n\t\t\t\t\"mbcccbm\",  --  4\n\t\t\t\t\"mbbbbbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbbbbbm\",  --  1\n\t\t\t\t\"mbcccbm\",  --  2\n\t\t\t\t\"mbcccbm\",  --  3\n\t\t\t\t\"mbcccbm\",  --  4\n\t\t\t\t\"mbbbbbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbbbbbm\",  --  1\n\t\t\t\t\"mbcccbm\",  --  2\n\t\t\t\t\"mbcccbm\",  --  3\n\t\t\t\t\"mbcccbm\",  --  4\n\t\t\t\t\"mbbbbbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbbbbbm\",  --  1\n\t\t\t\t\"mbcccbm\",  --  2\n\t\t\t\t\"mbcccbm\",  --  3\n\t\t\t\t\"mbcccbm\",  --  4\n\t\t\t\t\"mbbbbbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbbbbbm\",  --  1\n\t\t\t\t\"mbcccbm\",  --  2\n\t\t\t\t\"mbcccbm\",  --  3\n\t\t\t\t\"mbcccbm\",  --  4\n\t\t\t\t\"mbbbbbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mbbbbbm\",  --  1\n\t\t\t\t\"mbcccbm\",  --  2\n\t\t\t\t\"mbcccbm\",  --  3\n\t\t\t\t\"mbcccbm\",  --  4\n\t\t\t\t\"mbbbbbm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmbbbmm\",  --  0\n\t\t\t\t\"mbbbbbm\",  --  1\n\t\t\t\t\"bbcccbb\",  --  2\n\t\t\t\t\"bbcccbb\",  --  3\n\t\t\t\t\"bbcccbb\",  --  4\n\t\t\t\t\"mbbbbbm\",  --  5\n\t\t\t\t\"mmbbbmm\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmdddmm\",  --  0\n\t\t\t\t\"mbbbbbm\",  --  1\n\t\t\t\t\"dbcccbd\",  --  2\n\t\t\t\t\"dbcccbd\",  --  3\n\t\t\t\t\"dbcccbd\",  --  4\n\t\t\t\t\"mbbbbbm\",  --  5\n\t\t\t\t\"mmdddmm\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mbefgbm\",  --  1\n\t\t\t\t\".h...h.\",  --  2\n\t\t\t\t\".g...e.\",  --  3\n\t\t\t\t\".f...f.\",  --  4\n\t\t\t\t\"mbehgbm\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mi...im\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"mi...im\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mi...im\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"mi...im\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mjkkkjm\",  --  0\n\t\t\t\t\"jlllllj\",  --  1\n\t\t\t\t\"klllllk\",  --  2\n\t\t\t\t\"klllllk\",  --  3\n\t\t\t\t\"klllllk\",  --  4\n\t\t\t\t\"jlllllj\",  --  5\n\t\t\t\t\"mjkkkjm\",  --  6\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"k.....k\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"..kkk..\",  --  2\n\t\t\t\t\"..klk..\",  --  3\n\t\t\t\t\"..kkk..\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\"k.....k\",  --  6\n\n\t\t\t},\n\t\t},  -- Well\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Arch\",\n\t\t\t\tName         = \"Plains 144\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"144\",\n\t\t\t\tID           = \"488\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 7,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  2: 0\",  -- grass\n\t\t\t\t\"b:  3: 0\",  -- dirt\n\t\t\t\t\"c: 13: 0\",  -- gravel\n\t\t\t\t\"d:113: 0\",  -- netherbrickfence\n\t\t\t\t\"e: 50: 5\",  -- torch\n\t\t\t\t\"f: 44: 8\",  -- stone_slab\n\t\t\t\t\"g: 44: 0\",  -- stone_slab\n\t\t\t\t\"h: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aabacccaaaa\",  --  0\n\t\t\t\t\"aabacccabaa\",  --  1\n\t\t\t\t\"aabacccaaaa\",  --  2\n\t\t\t\t\"aaaacccaaaa\",  --  3\n\t\t\t\t\"aaaacccaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..d.....d..\",  --  0\n\t\t\t\t\"..d.....d..\",  --  1\n\t\t\t\t\"..d.....d..\",  --  2\n\t\t\t\t\"..d.....d..\",  --  3\n\t\t\t\t\"..d.....d..\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..d.....d..\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"..d.....d..\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"..d.....d..\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..e.....e..\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"..d.....d..\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"..e.....e..\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...fffff...\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"..d.....d..\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...fffff...\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"..g.....g..\",  --  0\n\t\t\t\t\".fhggggghf.\",  --  1\n\t\t\t\t\".fhfffffhf.\",  --  2\n\t\t\t\t\".fhggggghf.\",  --  3\n\t\t\t\t\"..g.....g..\",  --  4\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"hg.......gh\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\n\t\t\t},\n\t\t},  -- Arch\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SakuraSmall\",\n\t\t\t\tName         = \"Plains 145\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"145\",\n\t\t\t\tID           = \"489\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 7,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 5,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = -1,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = -1,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b:  2: 0\",  -- grass\n\t\t\t\t\"c: 17: 1\",  -- tree\n\t\t\t\t\"d: 35: 6\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bbbbb\",  --  1\n\t\t\t\t\"bbabb\",  --  2\n\t\t\t\t\"bbbbb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"..c..\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\".....\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"..c..\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\".....\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"..d..\",  --  0\n\t\t\t\t\"ddddd\",  --  1\n\t\t\t\t\"ddcdd\",  --  2\n\t\t\t\t\"ddddd\",  --  3\n\t\t\t\t\"..d..\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".ddd.\",  --  0\n\t\t\t\t\".ddd.\",  --  1\n\t\t\t\t\"ddddd\",  --  2\n\t\t\t\t\".ddd.\",  --  3\n\t\t\t\t\".ddd.\",  --  4\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\"..d..\",  --  1\n\t\t\t\t\".ddd.\",  --  2\n\t\t\t\t\"..d..\",  --  3\n\t\t\t\t\".....\",  --  4\n\n\t\t\t},\n\t\t},  -- SakuraSmall\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MediumSakuraTree\",\n\t\t\t\tName         = \"Plains 146\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"146\",\n\t\t\t\tID           = \"490\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 10,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 9,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b:  2: 0\",  -- grass\n\t\t\t\t\"c: 31: 1\",  -- tallgrass\n\t\t\t\t\"d: 38: 7\",  -- rose\n\t\t\t\t\"e: 17: 1\",  -- tree\n\t\t\t\t\"f: 38: 0\",  -- rose\n\t\t\t\t\"g: 38: 8\",  -- rose\n\t\t\t\t\"h: 38: 5\",  -- rose\n\t\t\t\t\"i: 35: 6\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbbbbb\",  --  0\n\t\t\t\t\"bbabbbb\",  --  1\n\t\t\t\t\"bbabaab\",  --  2\n\t\t\t\t\"bbbaabb\",  --  3\n\t\t\t\t\"bbabaab\",  --  4\n\t\t\t\t\"bbababb\",  --  5\n\t\t\t\t\"bbbbbbb\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"m.c...m\",  --  1\n\t\t\t\t\".dccdc.\",  --  2\n\t\t\t\t\"..cefc.\",  --  3\n\t\t\t\t\".ccfgh.\",  --  4\n\t\t\t\t\"m.ccc.m\",  --  5\n\t\t\t\t\"mm...mm\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"m.....m\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"...e...\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\"m.....m\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..i....\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"...e.i.\",  --  3\n\t\t\t\t\".i.....\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..i....\",  --  1\n\t\t\t\t\"...i...\",  --  2\n\t\t\t\t\"..ieii.\",  --  3\n\t\t\t\t\".i.ii..\",  --  4\n\t\t\t\t\"...i...\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..ii...\",  --  1\n\t\t\t\t\"..iii..\",  --  2\n\t\t\t\t\".iieii.\",  --  3\n\t\t\t\t\".iiii..\",  --  4\n\t\t\t\t\"..iii..\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"..iii..\",  --  1\n\t\t\t\t\".iiiii.\",  --  2\n\t\t\t\t\".iieii.\",  --  3\n\t\t\t\t\".iiiii.\",  --  4\n\t\t\t\t\"..iii..\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"...i...\",  --  1\n\t\t\t\t\"..iiii.\",  --  2\n\t\t\t\t\".iiiii.\",  --  3\n\t\t\t\t\"..iii..\",  --  4\n\t\t\t\t\"...i...\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"...i...\",  --  2\n\t\t\t\t\"..iii..\",  --  3\n\t\t\t\t\"...i...\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- MediumSakuraTree\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Garden2\",\n\t\t\t\tName         = \"Plains 147\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"147\",\n\t\t\t\tID           = \"491\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 5,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 4,\n\t\t\t\tMaxZ = 15,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 12,\n\t\t\t\t\tRelY = 3,\n\t\t\t\t\tRelZ = 15,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b:  2: 0\",  -- grass\n\t\t\t\t\"c:  8: 0\",  -- water\n\t\t\t\t\"d: 17: 1\",  -- tree\n\t\t\t\t\"e: 13: 0\",  -- gravel\n\t\t\t\t\"f: 31: 2\",  -- tallgrass\n\t\t\t\t\"g: 18: 5\",  -- leaves\n\t\t\t\t\"h: 38: 7\",  -- rose\n\t\t\t\t\"i: 17: 9\",  -- tree\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaabaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaccaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaacccaaaaaaaaaa\",  --  7\n\t\t\t\t\"aabccaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaacaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaabaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 11\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 12\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 13\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 14\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbbbbabbbbbbbbb\",  --  0\n\t\t\t\t\"bbdbbbbbbbbdbbbb\",  --  1\n\t\t\t\t\"abbbbbeebbbabdbb\",  --  2\n\t\t\t\t\"bbbbbbbeebbbbbbb\",  --  3\n\t\t\t\t\"bbbbbbbbebbabbbb\",  --  4\n\t\t\t\t\"bbbccccbebbbbbab\",  --  5\n\t\t\t\t\"bbbccccbeebbbaab\",  --  6\n\t\t\t\t\"bbcccccbbeeeebba\",  --  7\n\t\t\t\t\"bbcccccbbbbbeebb\",  --  8\n\t\t\t\t\"bbccccbbababbebb\",  --  9\n\t\t\t\t\"bbbbcbbaabbbbeeb\",  -- 10\n\t\t\t\t\"bbbbbbbbbbbbabeb\",  -- 11\n\t\t\t\t\"bbbbbbbbaaabbbeb\",  -- 12\n\t\t\t\t\"bbbbbbbbbabbbbeb\",  -- 13\n\t\t\t\t\"bbbbabbbbbbbbeeb\",  -- 14\n\t\t\t\t\"bbbbbbbbbbbbeebb\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"......f...gg.g..\",  --  0\n\t\t\t\t\"..gg.....gggggg.\",  --  1\n\t\t\t\t\"ffgg......ghgggg\",  --  2\n\t\t\t\t\".............gg.\",  --  3\n\t\t\t\t\"...........f....\",  --  4\n\t\t\t\t\"...........h.ff.\",  --  5\n\t\t\t\t\".............fh.\",  --  6\n\t\t\t\t\"...............f\",  --  7\n\t\t\t\t\"................\",  --  8\n\t\t\t\t\".......ff.f.....\",  --  9\n\t\t\t\t\".f.....ffggf....\",  -- 10\n\t\t\t\t\".......gggg.f...\",  -- 11\n\t\t\t\t\".f......iddg....\",  -- 12\n\t\t\t\t\".....f..gdgg....\",  -- 13\n\t\t\t\t\"....ff...gg.....\",  -- 14\n\t\t\t\t\"................\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"...........g.g..\",  --  1\n\t\t\t\t\".............gg.\",  --  2\n\t\t\t\t\"................\",  --  3\n\t\t\t\t\"................\",  --  4\n\t\t\t\t\"................\",  --  5\n\t\t\t\t\"................\",  --  6\n\t\t\t\t\"................\",  --  7\n\t\t\t\t\"................\",  --  8\n\t\t\t\t\"................\",  --  9\n\t\t\t\t\".........g......\",  -- 10\n\t\t\t\t\"........ggg.....\",  -- 11\n\t\t\t\t\"........ggg.....\",  -- 12\n\t\t\t\t\".........g......\",  -- 13\n\t\t\t\t\"................\",  -- 14\n\t\t\t\t\"................\",  -- 15\n\n\t\t\t},\n\t\t},  -- Garden2\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Farm\",\n\t\t\t\tName         = \"Plains 166\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"166\",\n\t\t\t\tID           = \"554\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 8,\n\t\t\t\tz = 13,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 12,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b: 60: 7\",  -- tilleddirt\n\t\t\t\t\"c: 60: 6\",  -- tilleddirt\n\t\t\t\t\"d:  8: 0\",  -- water\n\t\t\t\t\"e: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"f: 44: 0\",  -- stone_slab\n\t\t\t\t\"g: 59: 7\",  -- wheatblock\n\t\t\t\t\"h: 83: 0\",  -- reedsblock\n\t\t\t\t\"i:113: 0\",  -- netherbrickfence\n\t\t\t\t\"j: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaam\",  --  7\n\t\t\t\t\"maaaaaaaaam\",  --  8\n\t\t\t\t\"maaaaaaaaam\",  --  9\n\t\t\t\t\"maaaaaaaaam\",  -- 10\n\t\t\t\t\"maaaaaaaaam\",  -- 11\n\t\t\t\t\"mmmmmmmmmmm\",  -- 12\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"mabbbbbbbam\",  --  2\n\t\t\t\t\"mabbbbbbbam\",  --  3\n\t\t\t\t\"mabbbbbcbam\",  --  4\n\t\t\t\t\"mabbbbbbcam\",  --  5\n\t\t\t\t\"mabdddddaam\",  --  6\n\t\t\t\t\"mabbcbbbbam\",  --  7\n\t\t\t\t\"mabbbbbbcam\",  --  8\n\t\t\t\t\"mabbbbbbbam\",  --  9\n\t\t\t\t\"mabbbbbbbam\",  -- 10\n\t\t\t\t\"maaaaaaaaam\",  -- 11\n\t\t\t\t\"mmmmmmmmmmm\",  -- 12\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".efffffffe.\",  --  1\n\t\t\t\t\".fgggggggf.\",  --  2\n\t\t\t\t\".fgggggggf.\",  --  3\n\t\t\t\t\".fgggggggf.\",  --  4\n\t\t\t\t\".fghhhhhgf.\",  --  5\n\t\t\t\t\".fh.....hf.\",  --  6\n\t\t\t\t\".fghhhhhgf.\",  --  7\n\t\t\t\t\".fgggggggf.\",  --  8\n\t\t\t\t\".fgggggggf.\",  --  9\n\t\t\t\t\".fgggggggf.\",  -- 10\n\t\t\t\t\".efffffffe.\",  -- 11\n\t\t\t\t\"...........\",  -- 12\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".i.......i.\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...hhhhh...\",  --  5\n\t\t\t\t\"..h.....h..\",  --  6\n\t\t\t\t\"...hhhhh...\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\t\t\t\t\".i.......i.\",  -- 11\n\t\t\t\t\"...........\",  -- 12\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".i.......i.\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...hhhhh...\",  --  5\n\t\t\t\t\"..h.....h..\",  --  6\n\t\t\t\t\"...hhhhh...\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\t\t\t\t\".i.......i.\",  -- 11\n\t\t\t\t\"...........\",  -- 12\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".i.......i.\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\"...........\",  -- 10\n\t\t\t\t\".i.......i.\",  -- 11\n\t\t\t\t\"...........\",  -- 12\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".i.......i.\",  --  0\n\t\t\t\t\"iii.....iii\",  --  1\n\t\t\t\t\".i.......i.\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\".i.......i.\",  -- 10\n\t\t\t\t\"iii.....iii\",  -- 11\n\t\t\t\t\".i.......i.\",  -- 12\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".j.......j.\",  --  0\n\t\t\t\t\"j.j.....j.j\",  --  1\n\t\t\t\t\".j.......j.\",  --  2\n\t\t\t\t\"...........\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"...........\",  --  9\n\t\t\t\t\".j.......j.\",  -- 10\n\t\t\t\t\"j.j.....j.j\",  -- 11\n\t\t\t\t\".j.......j.\",  -- 12\n\n\t\t\t},\n\t\t},  -- Farm\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/Villages/PlainsVillage.cubeset",
    "content": "\n-- PlainsVillage.cubeset\n\n-- Defines the prefabs in the group PlainsVillage\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-30 13:45:48\",\n\t\t[\"AllowedBiomes\"] = \"Plains, Savanna, SavannaM, SunflowerPlains\",\n\t\t[\"IntendedUse\"] = \"Village\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouseL14x14\",\n\t\t\t\tName         = \"Plains 0\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"0\",\n\t\t\t\tID           = \"4\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 8,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 16,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 16,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e:  5: 0\",  -- planks\n\t\t\t\t\"f: 67: 3\",  -- stonestairs\n\t\t\t\t\"g: 17: 0\",  -- tree\n\t\t\t\t\"h: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"i: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"j:102: 0\",  -- glasspane\n\t\t\t\t\"k: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"l: 53: 2\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 1\",  -- woodstairs\n\t\t\t\t\"o: 53: 7\",  -- woodstairs\n\t\t\t\t\"p: 53: 6\",  -- woodstairs\n\t\t\t\t\"q: 53: 3\",  -- woodstairs\n\t\t\t\t\"r: 53: 0\",  -- woodstairs\n\t\t\t\t\"s: 53: 5\",  -- woodstairs\n\t\t\t\t\"t: 53: 4\",  -- woodstairs\n\t\t\t\t\"u: 50: 3\",  -- torch\n\t\t\t\t\"v: 50: 2\",  -- torch\n\t\t\t\t\"w: 50: 4\",  -- torch\n\t\t\t\t\"x: 50: 1\",  -- torch\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmaaammmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmaaaaaaaaaam\",  --  8\n\t\t\t\t\"mmmmmmmmaaaaaaam\",  --  9\n\t\t\t\t\"mmmmmmmmaaaaaaam\",  -- 10\n\t\t\t\t\"mmmmmmmmaaaaaaam\",  -- 11\n\t\t\t\t\"mmmmmmmmaaaaaaam\",  -- 12\n\t\t\t\t\"mmmmmmmmaaaaaaam\",  -- 13\n\t\t\t\t\"mmmmmmmmaaaaaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"........bcd.....\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aeeeeeeeeeeeea.\",  --  2\n\t\t\t\t\".aeeeeeeeeeeeea.\",  --  3\n\t\t\t\t\".aeeeeeeeeeeeea.\",  --  4\n\t\t\t\t\".aeeeeeeeeeeeea.\",  --  5\n\t\t\t\t\".aeeeeeeeeeeeea.\",  --  6\n\t\t\t\t\".aaaaaaaaeeeeea.\",  --  7\n\t\t\t\t\".....bfdaeeeeea.\",  --  8\n\t\t\t\t\"mmmm....aeeeeea.\",  --  9\n\t\t\t\t\"mmmmmmm.aeeeeea.\",  -- 10\n\t\t\t\t\"mmmmmmm.aeeeeea.\",  -- 11\n\t\t\t\t\"mmmmmmm.aeeeeea.\",  -- 12\n\t\t\t\t\"mmmmmmm.aeeeeea.\",  -- 13\n\t\t\t\t\"mmmmmmm.aaaaaaa.\",  -- 14\n\t\t\t\t\"mmmmmmm.........\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\".geeeeeeghgeeeg.\",  --  1\n\t\t\t\t\".e............e.\",  --  2\n\t\t\t\t\".e............e.\",  --  3\n\t\t\t\t\".e............e.\",  --  4\n\t\t\t\t\".e............e.\",  --  5\n\t\t\t\t\".e............e.\",  --  6\n\t\t\t\t\".geeeeieg.....e.\",  --  7\n\t\t\t\t\"........e.....e.\",  --  8\n\t\t\t\t\"mmmm....e.....e.\",  --  9\n\t\t\t\t\"mmmmmmm.e.....e.\",  -- 10\n\t\t\t\t\"mmmmmmm.e.....e.\",  -- 11\n\t\t\t\t\"mmmmmmm.e.....e.\",  -- 12\n\t\t\t\t\"mmmmmmm.e.....e.\",  -- 13\n\t\t\t\t\"mmmmmmm.geeeeeg.\",  -- 14\n\t\t\t\t\"mmmmmmm.........\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\".gejjejjgkgjjeg.\",  --  1\n\t\t\t\t\".j............e.\",  --  2\n\t\t\t\t\".j............j.\",  --  3\n\t\t\t\t\".j............j.\",  --  4\n\t\t\t\t\".j............e.\",  --  5\n\t\t\t\t\".j............j.\",  --  6\n\t\t\t\t\".gejjekeg.....j.\",  --  7\n\t\t\t\t\"........e.....e.\",  --  8\n\t\t\t\t\"mmmm....j.....j.\",  --  9\n\t\t\t\t\"mmmmmmm.j.....j.\",  -- 10\n\t\t\t\t\"mmmmmmm.e.....e.\",  -- 11\n\t\t\t\t\"mmmmmmm.j.....j.\",  -- 12\n\t\t\t\t\"mmmmmmm.j.....j.\",  -- 13\n\t\t\t\t\"mmmmmmm.gjjjjjg.\",  -- 14\n\t\t\t\t\"mmmmmmm.........\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"llllllllllllllln\",  --  0\n\t\t\t\t\"ogeeeeeegegeeegn\",  --  1\n\t\t\t\t\".e............en\",  --  2\n\t\t\t\t\".e............en\",  --  3\n\t\t\t\t\".e............en\",  --  4\n\t\t\t\t\".e............en\",  --  5\n\t\t\t\t\".e............en\",  --  6\n\t\t\t\t\"pgeeeeeeg.....en\",  --  7\n\t\t\t\t\"qqqqqqqre.....en\",  --  8\n\t\t\t\t\"mmmm...re.....en\",  --  9\n\t\t\t\t\"mmmmmmmre.....en\",  -- 10\n\t\t\t\t\"mmmmmmmre.....en\",  -- 11\n\t\t\t\t\"mmmmmmmre.....en\",  -- 12\n\t\t\t\t\"mmmmmmmre.....en\",  -- 13\n\t\t\t\t\"mmmmmmmrgeeeeegn\",  -- 14\n\t\t\t\t\"mmmmmmmrs.....tn\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"lllllllllllllll.\",  --  1\n\t\t\t\t\"oeeeeeeeeeeeeen.\",  --  2\n\t\t\t\t\".e.........u.en.\",  --  3\n\t\t\t\t\".e..........ven.\",  --  4\n\t\t\t\t\".e......w....en.\",  --  5\n\t\t\t\t\"peeeeeeeee...en.\",  --  6\n\t\t\t\t\"qqqqqqqqrex..en.\",  --  7\n\t\t\t\t\"........re...en.\",  --  8\n\t\t\t\t\"mmmm....re...en.\",  --  9\n\t\t\t\t\"mmmmmmm.re...en.\",  -- 10\n\t\t\t\t\"mmmmmmm.re...en.\",  -- 11\n\t\t\t\t\"mmmmmmm.re...en.\",  -- 12\n\t\t\t\t\"mmmmmmm.re...en.\",  -- 13\n\t\t\t\t\"mmmmmmm.reeeeen.\",  -- 14\n\t\t\t\t\"mmmmmmm.rs...tn.\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"llllllllllllln..\",  --  2\n\t\t\t\t\"oeeeeeeeeeeeen..\",  --  3\n\t\t\t\t\".ex.........en..\",  --  4\n\t\t\t\t\"peeeeeeeeee.en..\",  --  5\n\t\t\t\t\"qqqqqqqqqre.en..\",  --  6\n\t\t\t\t\".........re.en..\",  --  7\n\t\t\t\t\".........re.en..\",  --  8\n\t\t\t\t\"mmmm.....re.en..\",  --  9\n\t\t\t\t\"mmmmmmm..re.en..\",  -- 10\n\t\t\t\t\"mmmmmmm..re.en..\",  -- 11\n\t\t\t\t\"mmmmmmm..re.en..\",  -- 12\n\t\t\t\t\"mmmmmmm..rewen..\",  -- 13\n\t\t\t\t\"mmmmmmm..reeen..\",  -- 14\n\t\t\t\t\"mmmmmmm..rs.tn..\",  -- 15\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"lllllllllllll...\",  --  3\n\t\t\t\t\"eeeeeeeeeeeen...\",  --  4\n\t\t\t\t\"qqqqqqqqqqren...\",  --  5\n\t\t\t\t\"..........ren...\",  --  6\n\t\t\t\t\"..........ren...\",  --  7\n\t\t\t\t\"..........ren...\",  --  8\n\t\t\t\t\"mmmm......ren...\",  --  9\n\t\t\t\t\"mmmmmmm...ren...\",  -- 10\n\t\t\t\t\"mmmmmmm...ren...\",  -- 11\n\t\t\t\t\"mmmmmmm...ren...\",  -- 12\n\t\t\t\t\"mmmmmmm...ren...\",  -- 13\n\t\t\t\t\"mmmmmmm...ren...\",  -- 14\n\t\t\t\t\"mmmmmmm...ren...\",  -- 15\n\n\t\t\t},\n\t\t},  -- WoodenHouseL14x14\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CobbleWell4x4\",\n\t\t\t\tName         = \"Plains 1\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"1\",\n\t\t\t\tID           = \"5\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 4,\n\t\t\t\ty = 13,\n\t\t\t\tz = 4,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 3,\n\t\t\t\tMaxY = 12,\n\t\t\t\tMaxZ = 3,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 1,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-9\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c:  8: 0\",  -- water\n\t\t\t\t\"d: 85: 0\",  -- fence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaa\",  --  0\n\t\t\t\t\"aaaa\",  --  1\n\t\t\t\t\"aaaa\",  --  2\n\t\t\t\t\"aaaa\",  --  3\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"b..b\",  --  1\n\t\t\t\t\"b..b\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"d..d\",  --  0\n\t\t\t\t\"....\",  --  1\n\t\t\t\t\"....\",  --  2\n\t\t\t\t\"d..d\",  --  3\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"d..d\",  --  0\n\t\t\t\t\"....\",  --  1\n\t\t\t\t\"....\",  --  2\n\t\t\t\t\"d..d\",  --  3\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bbbb\",  --  1\n\t\t\t\t\"bbbb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t},\n\t\t},  -- CobbleWell4x4\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"DoublePlantBed\",\n\t\t\t\tName         = \"Plains 5\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"5\",\n\t\t\t\tID           = \"20\",\n\t\t\t\tCreatorName  = \"tonibm1999\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 8,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b:  2: 0\",  -- grass\n\t\t\t\t\"c: 17: 0\",  -- tree\n\t\t\t\t\"d: 60: 7\",  -- tilleddirt\n\t\t\t\t\"e:  8: 0\",  -- water\n\t\t\t\t\"f: 60: 6\",  -- tilleddirt\n\t\t\t\t\"g: 50: 5\",  -- torch\n\t\t\t\t\"h: 59: 7\",  -- wheatblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaabaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaabaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaabaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaabaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaabaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaabaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaabaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaamaaaaaaa\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"ccccccc.ccccccc\",  --  0\n\t\t\t\t\"cddeddc.cddeddc\",  --  1\n\t\t\t\t\"cddeddc.cddeddc\",  --  2\n\t\t\t\t\"cddeddc.cddeddc\",  --  3\n\t\t\t\t\"cddeddc.cddeddc\",  --  4\n\t\t\t\t\"cddeddc.cddeddc\",  --  5\n\t\t\t\t\"cddeddc.cdfeddc\",  --  6\n\t\t\t\t\"cddeddc.cddeddc\",  --  7\n\t\t\t\t\"ccccccc.ccccccc\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"g.....g.g.....g\",  --  0\n\t\t\t\t\".hh.hh...hh.hh.\",  --  1\n\t\t\t\t\".hh.hh...hh.hh.\",  --  2\n\t\t\t\t\".hh.hh...hh.hh.\",  --  3\n\t\t\t\t\".hh.hh...hh.hh.\",  --  4\n\t\t\t\t\".hh.hh...hh.hh.\",  --  5\n\t\t\t\t\".hh.hh...hh.hh.\",  --  6\n\t\t\t\t\".hh.hh...hh.hh.\",  --  7\n\t\t\t\t\"g.....g.g.....g\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t},\n\t\t},  -- DoublePlantBed\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse9x5Fence\",\n\t\t\t\tName         = \"p9\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"9\",\n\t\t\t\tID           = \"26\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 7,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b:  3: 0\",  -- dirt\n\t\t\t\t\"c:  5: 0\",  -- planks\n\t\t\t\t\"d:  2: 0\",  -- grass\n\t\t\t\t\"e: 67: 2\",  -- stonestairs\n\t\t\t\t\"f: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"g: 67: 0\",  -- stonestairs\n\t\t\t\t\"h: 67: 3\",  -- stonestairs\n\t\t\t\t\"i: 17: 0\",  -- tree\n\t\t\t\t\"j: 53: 1\",  -- woodstairs\n\t\t\t\t\"k: 85: 0\",  -- fence\n\t\t\t\t\"l: 53: 0\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 64: 2\",  -- woodendoorblock\n\t\t\t\t\"o: 64: 0\",  -- woodendoorblock\n\t\t\t\t\"p:102: 0\",  -- glasspane\n\t\t\t\t\"q: 72: 0\",  -- woodplate\n\t\t\t\t\"r: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"s: 53: 5\",  -- woodstairs\n\t\t\t\t\"t: 53: 4\",  -- woodstairs\n\t\t\t\t\"u: 50: 1\",  -- torch\n\t\t\t\t\"v: 50: 2\",  -- torch\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmmm\",  --  0\n\t\t\t\t\"maaaaammmm\",  --  1\n\t\t\t\t\"maaaaammmm\",  --  2\n\t\t\t\t\"maaaaabbbb\",  --  3\n\t\t\t\t\"aaaaaabbbb\",  --  4\n\t\t\t\t\"aaaaaabbbb\",  --  5\n\t\t\t\t\"aaaaaabbbb\",  --  6\n\t\t\t\t\"maaaaabbbb\",  --  7\n\t\t\t\t\"maaaaabbbb\",  --  8\n\t\t\t\t\"maaaaammmm\",  --  9\n\t\t\t\t\"mmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"......mmmm\",  --  0\n\t\t\t\t\".aaaaammmm\",  --  1\n\t\t\t\t\".acccammmm\",  --  2\n\t\t\t\t\".acccadddd\",  --  3\n\t\t\t\t\"eafffadddd\",  --  4\n\t\t\t\t\"gaffffdddd\",  --  5\n\t\t\t\t\"hafffadddd\",  --  6\n\t\t\t\t\".afffadddd\",  --  7\n\t\t\t\t\".afffadddd\",  --  8\n\t\t\t\t\".aaaaammmm\",  --  9\n\t\t\t\t\"......mmmm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"......mmmm\",  --  0\n\t\t\t\t\".icccimmmm\",  --  1\n\t\t\t\t\".cjklcmmmm\",  --  2\n\t\t\t\t\".c...ckkkk\",  --  3\n\t\t\t\t\".c...c...k\",  --  4\n\t\t\t\t\".n...o...k\",  --  5\n\t\t\t\t\".c...c...k\",  --  6\n\t\t\t\t\".cff.c...k\",  --  7\n\t\t\t\t\".c...ckkkk\",  --  8\n\t\t\t\t\".icccimmmm\",  --  9\n\t\t\t\t\"......mmmm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"......mmmm\",  --  0\n\t\t\t\t\".ipppimmmm\",  --  1\n\t\t\t\t\".p.q.pmmmm\",  --  2\n\t\t\t\t\".p...p....\",  --  3\n\t\t\t\t\".c...c....\",  --  4\n\t\t\t\t\".r...r....\",  --  5\n\t\t\t\t\".c...c....\",  --  6\n\t\t\t\t\".p...p....\",  --  7\n\t\t\t\t\".p...p....\",  --  8\n\t\t\t\t\".ipppimmmm\",  --  9\n\t\t\t\t\"......mmmm\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ls...tjmmm\",  --  0\n\t\t\t\t\"licccijmmm\",  --  1\n\t\t\t\t\"lc...cjmmm\",  --  2\n\t\t\t\t\"lc...cj...\",  --  3\n\t\t\t\t\"lcu.vcj...\",  --  4\n\t\t\t\t\"lc...cj...\",  --  5\n\t\t\t\t\"lcu.vcj...\",  --  6\n\t\t\t\t\"lc...cj...\",  --  7\n\t\t\t\t\"lc...cj...\",  --  8\n\t\t\t\t\"licccijmmm\",  --  9\n\t\t\t\t\"ls...tjmmm\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".ls.tj.mmm\",  --  0\n\t\t\t\t\".lcccj.mmm\",  --  1\n\t\t\t\t\".lc.cj.mmm\",  --  2\n\t\t\t\t\".lc.cj....\",  --  3\n\t\t\t\t\".lc.cj....\",  --  4\n\t\t\t\t\".lc.cj....\",  --  5\n\t\t\t\t\".lc.cj....\",  --  6\n\t\t\t\t\".lc.cj....\",  --  7\n\t\t\t\t\".lc.cj....\",  --  8\n\t\t\t\t\".lcccj.mmm\",  --  9\n\t\t\t\t\".ls.tj.mmm\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"..lcj..mmm\",  --  0\n\t\t\t\t\"..lcj..mmm\",  --  1\n\t\t\t\t\"..lcj..mmm\",  --  2\n\t\t\t\t\"..lcj.....\",  --  3\n\t\t\t\t\"..lcj.....\",  --  4\n\t\t\t\t\"..lcj.....\",  --  5\n\t\t\t\t\"..lcj.....\",  --  6\n\t\t\t\t\"..lcj.....\",  --  7\n\t\t\t\t\"..lcj.....\",  --  8\n\t\t\t\t\"..lcj..mmm\",  --  9\n\t\t\t\t\"..lcj..mmm\",  -- 10\n\n\t\t\t},\n\t\t},  -- WoodenHouse9x5Fence\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SinglePlantBed\",\n\t\t\t\tName         = \"Plains 17\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"17\",\n\t\t\t\tID           = \"60\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b: 17: 0\",  -- tree\n\t\t\t\t\"c: 60: 7\",  -- tilleddirt\n\t\t\t\t\"d: 60: 6\",  -- tilleddirt\n\t\t\t\t\"e:  8: 0\",  -- water\n\t\t\t\t\"f: 59: 7\",  -- wheatblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbbbbbbbb\",  --  0\n\t\t\t\t\"bccccccccb\",  --  1\n\t\t\t\t\"bccccccdcb\",  --  2\n\t\t\t\t\"beeeeeeeeb\",  --  3\n\t\t\t\t\"bcccccdccb\",  --  4\n\t\t\t\t\"bccccccccb\",  --  5\n\t\t\t\t\"bbbbbbbbbb\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\".ffffffff.\",  --  1\n\t\t\t\t\".ffffffff.\",  --  2\n\t\t\t\t\"..........\",  --  3\n\t\t\t\t\".ffffffff.\",  --  4\n\t\t\t\t\".ffffffff.\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\"..........\",  --  1\n\t\t\t\t\"..........\",  --  2\n\t\t\t\t\"..........\",  --  3\n\t\t\t\t\"..........\",  --  4\n\t\t\t\t\"..........\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\"..........\",  --  1\n\t\t\t\t\"..........\",  --  2\n\t\t\t\t\"..........\",  --  3\n\t\t\t\t\"..........\",  --  4\n\t\t\t\t\"..........\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\"..........\",  --  1\n\t\t\t\t\"..........\",  --  2\n\t\t\t\t\"..........\",  --  3\n\t\t\t\t\"..........\",  --  4\n\t\t\t\t\"..........\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\"..........\",  --  1\n\t\t\t\t\"..........\",  --  2\n\t\t\t\t\"..........\",  --  3\n\t\t\t\t\"..........\",  --  4\n\t\t\t\t\"..........\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t},\n\t\t},  -- SinglePlantBed\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"CobbleHouse10x5Library\",\n\t\t\t\tName         = \"Plains 23\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"23\",\n\t\t\t\tID           = \"66\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f: 53: 3\",  -- woodstairs\n\t\t\t\t\"g: 53: 1\",  -- woodstairs\n\t\t\t\t\"h: 85: 0\",  -- fence\n\t\t\t\t\"i: 53: 0\",  -- woodstairs\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k:102: 0\",  -- glasspane\n\t\t\t\t\"l: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 3\",  -- torch\n\t\t\t\t\"o: 72: 0\",  -- woodplate\n\t\t\t\t\"p: 50: 4\",  -- torch\n\t\t\t\t\"q: 53: 7\",  -- woodstairs\n\t\t\t\t\"r: 47: 0\",  -- bookshelf\n\t\t\t\t\"s: 50: 1\",  -- torch\n\t\t\t\t\"t: 50: 2\",  -- torch\n\t\t\t\t\"u: 53: 6\",  -- woodstairs\n\t\t\t\t\"v:  5: 0\",  -- planks\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmaaamm\",  --  0\n\t\t\t\t\"maaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".......bcd..\",  --  0\n\t\t\t\t\".aaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaa.\",  --  5\n\t\t\t\t\"............\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".aaaaaaaeaa.\",  --  1\n\t\t\t\t\".af.ghi...a.\",  --  2\n\t\t\t\t\".ah.......a.\",  --  3\n\t\t\t\t\".aj.ghighia.\",  --  4\n\t\t\t\t\".aaaaaaaaaa.\",  --  5\n\t\t\t\t\"............\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".akkakkalaa.\",  --  1\n\t\t\t\t\".k..no.n.nk.\",  --  2\n\t\t\t\t\".ko.......k.\",  --  3\n\t\t\t\t\".k..po.po.k.\",  --  4\n\t\t\t\t\".akkakkakka.\",  --  5\n\t\t\t\t\"............\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjjjjjjj\",  --  0\n\t\t\t\t\"qaaaaaaaaaaq\",  --  1\n\t\t\t\t\".arrrrrrrra.\",  --  2\n\t\t\t\t\".as......ta.\",  --  3\n\t\t\t\t\".arrrrrrrra.\",  --  4\n\t\t\t\t\"uaaaaaaaaaau\",  --  5\n\t\t\t\t\"ffffffffffff\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"jjjjjjjjjjjj\",  --  1\n\t\t\t\t\"qvvvvvvvvvvq\",  --  2\n\t\t\t\t\".vvvvvvvvvv.\",  --  3\n\t\t\t\t\"uvvvvvvvvvvu\",  --  4\n\t\t\t\t\"ffffffffffff\",  --  5\n\t\t\t\t\"............\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"jjjjjjjjjjjj\",  --  2\n\t\t\t\t\"vvvvvvvvvvvv\",  --  3\n\t\t\t\t\"ffffffffffff\",  --  4\n\t\t\t\t\"............\",  --  5\n\t\t\t\t\"............\",  --  6\n\n\t\t\t},\n\t\t},  -- CobbleHouse10x5Library\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"BigPlantBed\",\n\t\t\t\tName         = \"Plains 26\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"26\",\n\t\t\t\tID           = \"70\",\n\t\t\t\tCreatorName  = \"Taugrammaton\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 8,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  3: 0\",  -- dirt\n\t\t\t\t\"b:  5: 0\",  -- planks\n\t\t\t\t\"c: 13: 0\",  -- gravel\n\t\t\t\t\"d: 17: 0\",  -- tree\n\t\t\t\t\"e: 60: 7\",  -- tilleddirt\n\t\t\t\t\"f:  8: 0\",  -- water\n\t\t\t\t\"g: 60: 6\",  -- tilleddirt\n\t\t\t\t\"h: 60: 4\",  -- tilleddirt\n\t\t\t\t\"i: 85: 0\",  -- fence\n\t\t\t\t\"j: 59: 7\",  -- wheatblock\n\t\t\t\t\"k: 50: 5\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  9\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 10\n\t\t\t\t\"aaaaaaaaaaaaa\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbbbbbbbbbbb\",  --  0\n\t\t\t\t\"bcccccccccccb\",  --  1\n\t\t\t\t\"bcccccccccccb\",  --  2\n\t\t\t\t\"bcccccccccccb\",  --  3\n\t\t\t\t\"bcccccccccccb\",  --  4\n\t\t\t\t\"bcccccccccccb\",  --  5\n\t\t\t\t\"bcccccccccccb\",  --  6\n\t\t\t\t\"bcccccccccccb\",  --  7\n\t\t\t\t\"bcccccccccccb\",  --  8\n\t\t\t\t\"bcccccccccccb\",  --  9\n\t\t\t\t\"bcccccccccccb\",  -- 10\n\t\t\t\t\"bbbbbbbbbbbbb\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"ddddddddddddd\",  --  0\n\t\t\t\t\"deefeefeefeed\",  --  1\n\t\t\t\t\"deefeefeefeed\",  --  2\n\t\t\t\t\"deefeefegfged\",  --  3\n\t\t\t\t\"deefeefeefeed\",  --  4\n\t\t\t\t\"deefgefeefged\",  --  5\n\t\t\t\t\"degfeefegfhed\",  --  6\n\t\t\t\t\"deefeefeefggd\",  --  7\n\t\t\t\t\"deefeefeefeed\",  --  8\n\t\t\t\t\"deefeefeefeed\",  --  9\n\t\t\t\t\"deefeefeefeed\",  -- 10\n\t\t\t\t\"ddddddddddddd\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"i..i..i..i..i\",  --  0\n\t\t\t\t\"ijj.j..jj.jji\",  --  1\n\t\t\t\t\"ijj..j.jj.jji\",  --  2\n\t\t\t\t\"ijj.j..j..jji\",  --  3\n\t\t\t\t\"ijj.jj.j..jji\",  --  4\n\t\t\t\t\"ijj.j..jj.jji\",  --  5\n\t\t\t\t\"ijj.jj.jj.jji\",  --  6\n\t\t\t\t\"ijj....j..jji\",  --  7\n\t\t\t\t\"ijj..j....jji\",  --  8\n\t\t\t\t\"ijj.....j.jji\",  --  9\n\t\t\t\t\"ijj.jj.j..jji\",  -- 10\n\t\t\t\t\"i..i..i..i..i\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"k..k..k..k..k\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\t\t\t\t\".............\",  --  9\n\t\t\t\t\".............\",  -- 10\n\t\t\t\t\"k..k..k..k..k\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\t\t\t\t\".............\",  --  9\n\t\t\t\t\".............\",  -- 10\n\t\t\t\t\".............\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\t\t\t\t\".............\",  --  9\n\t\t\t\t\".............\",  -- 10\n\t\t\t\t\".............\",  -- 11\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\".............\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\t\t\t\t\".............\",  --  9\n\t\t\t\t\".............\",  -- 10\n\t\t\t\t\".............\",  -- 11\n\n\t\t\t},\n\t\t},  -- BigPlantBed\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"LampPost\",\n\t\t\t\tName         = \"Plains 28\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"28\",\n\t\t\t\tID           = \"73\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 3,\n\t\t\t\ty = 7,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 2,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 2,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 1,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  2: 0\",  -- grass\n\t\t\t\t\"b:  3: 0\",  -- dirt\n\t\t\t\t\"c: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"d:139: 0\",  -- cobblestonewall\n\t\t\t\t\"e: 50: 4\",  -- torch\n\t\t\t\t\"f: 50: 2\",  -- torch\n\t\t\t\t\"g: 50: 1\",  -- torch\n\t\t\t\t\"h: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaa\",  --  0\n\t\t\t\t\"aba\",  --  1\n\t\t\t\t\"aaa\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...\",  --  0\n\t\t\t\t\".c.\",  --  1\n\t\t\t\t\"...\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...\",  --  0\n\t\t\t\t\".d.\",  --  1\n\t\t\t\t\"...\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...\",  --  0\n\t\t\t\t\".d.\",  --  1\n\t\t\t\t\"...\",  --  2\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".e.\",  --  0\n\t\t\t\t\"fcg\",  --  1\n\t\t\t\t\".h.\",  --  2\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...\",  --  0\n\t\t\t\t\"...\",  --  1\n\t\t\t\t\"...\",  --  2\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...\",  --  0\n\t\t\t\t\"...\",  --  1\n\t\t\t\t\"...\",  --  2\n\n\t\t\t},\n\t\t},  -- LampPost\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse9x7DoubleDoor\",\n\t\t\t\tName         = \"Plains 38\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"38\",\n\t\t\t\tID           = \"87\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 67: 3\",  -- stonestairs\n\t\t\t\t\"f: 17: 0\",  -- tree\n\t\t\t\t\"g:  5: 0\",  -- planks\n\t\t\t\t\"h: 64: 7\",  -- woodendoorblock\n\t\t\t\t\"i: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"j:102: 0\",  -- glasspane\n\t\t\t\t\"k: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"l: 53: 2\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 7\",  -- woodstairs\n\t\t\t\t\"o: 17: 4\",  -- tree\n\t\t\t\t\"p: 17: 8\",  -- tree\n\t\t\t\t\"q: 50: 3\",  -- torch\n\t\t\t\t\"r: 50: 4\",  -- torch\n\t\t\t\t\"s: 53: 6\",  -- woodstairs\n\t\t\t\t\"t: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmaaammmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcd....\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaa.\",  --  7\n\t\t\t\t\"....bed....\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".fggfhfggf.\",  --  1\n\t\t\t\t\".g.......g.\",  --  2\n\t\t\t\t\".g.......g.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".g.......g.\",  --  5\n\t\t\t\t\".g.......g.\",  --  6\n\t\t\t\t\".fggfifggf.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".fjjfkfjjf.\",  --  1\n\t\t\t\t\".j.......j.\",  --  2\n\t\t\t\t\".j.......j.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".j.......j.\",  --  5\n\t\t\t\t\".j.......j.\",  --  6\n\t\t\t\t\".fjjfkfjjf.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"lllllllllll\",  --  0\n\t\t\t\t\"nfooooooofn\",  --  1\n\t\t\t\t\".p..q.q..p.\",  --  2\n\t\t\t\t\".p.......p.\",  --  3\n\t\t\t\t\".p.......p.\",  --  4\n\t\t\t\t\".p.......p.\",  --  5\n\t\t\t\t\".p..r.r..p.\",  --  6\n\t\t\t\t\"sfooooooofs\",  --  7\n\t\t\t\t\"ttttttttttt\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"lllllllllll\",  --  1\n\t\t\t\t\"ngggggggggn\",  --  2\n\t\t\t\t\".g.......g.\",  --  3\n\t\t\t\t\".g.......g.\",  --  4\n\t\t\t\t\".g.......g.\",  --  5\n\t\t\t\t\"sgggggggggs\",  --  6\n\t\t\t\t\"ttttttttttt\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"lllllllllll\",  --  2\n\t\t\t\t\"ngggggggggn\",  --  3\n\t\t\t\t\".g.......g.\",  --  4\n\t\t\t\t\"sgggggggggs\",  --  5\n\t\t\t\t\"ttttttttttt\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"lllllllllll\",  --  3\n\t\t\t\t\"ggggggggggg\",  --  4\n\t\t\t\t\"ttttttttttt\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t},\n\t\t},  -- WoodenHouse9x7DoubleDoor\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouseL13x14\",\n\t\t\t\tName         = \"Plains 39\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"39\",\n\t\t\t\tID           = \"90\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 9,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 16,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"A: 53: 7\",  -- woodstairs\n\t\t\t\t\"B: 53: 4\",  -- woodstairs\n\t\t\t\t\"C: 53: 5\",  -- woodstairs\n\t\t\t\t\"D: 53: 6\",  -- woodstairs\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"f: 17: 0\",  -- tree\n\t\t\t\t\"g:  5: 0\",  -- planks\n\t\t\t\t\"h: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"i: 96: 8\",  -- trapdoor\n\t\t\t\t\"j: 61: 2\",  -- furnace\n\t\t\t\t\"k: 53: 3\",  -- woodstairs\n\t\t\t\t\"l: 85: 0\",  -- fence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 2\",  -- woodstairs\n\t\t\t\t\"o: 53: 1\",  -- woodstairs\n\t\t\t\t\"p: 53: 0\",  -- woodstairs\n\t\t\t\t\"q: 47: 0\",  -- bookshelf\n\t\t\t\t\"r:102: 0\",  -- glasspane\n\t\t\t\t\"s: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"t: 72: 0\",  -- woodplate\n\t\t\t\t\"u: 17: 4\",  -- tree\n\t\t\t\t\"v: 17: 8\",  -- tree\n\t\t\t\t\"w: 50: 3\",  -- torch\n\t\t\t\t\"x: 50: 1\",  -- torch\n\t\t\t\t\"y: 50: 4\",  -- torch\n\t\t\t\t\"z: 50: 2\",  -- torch\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmaaaaaam\",  --  8\n\t\t\t\t\"mmmmmmmmaaaaaam\",  --  9\n\t\t\t\t\"mmmmmmmmaaaaaam\",  -- 10\n\t\t\t\t\"mmmmmmmmaaaaaam\",  -- 11\n\t\t\t\t\"mmmmmmmmaaaaaam\",  -- 12\n\t\t\t\t\"mmmmmmmmaaaaaam\",  -- 13\n\t\t\t\t\"mmmmmmmmaaaaaam\",  -- 14\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"......bcd......\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aeeeeaaaaaaaa.\",  --  2\n\t\t\t\t\".aeeeeaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  7\n\t\t\t\t\"........aaaaaa.\",  --  8\n\t\t\t\t\"mmmmmmm.aaaaaa.\",  --  9\n\t\t\t\t\"mmmmmmm.aaaaaa.\",  -- 10\n\t\t\t\t\"mmmmmmm.aaaaaa.\",  -- 11\n\t\t\t\t\"mmmmmmm.aaaaaa.\",  -- 12\n\t\t\t\t\"mmmmmmm.aaaaaa.\",  -- 13\n\t\t\t\t\"mmmmmmm.aaaaaa.\",  -- 14\n\t\t\t\t\"mmmmmmm........\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".fggggfhfggggf.\",  --  1\n\t\t\t\t\".g...i.......g.\",  --  2\n\t\t\t\t\".gjeee......kg.\",  --  3\n\t\t\t\t\".f..........lg.\",  --  4\n\t\t\t\t\".g..........ng.\",  --  5\n\t\t\t\t\".g.olp..ol...g.\",  --  6\n\t\t\t\t\".fggggggfn...f.\",  --  7\n\t\t\t\t\"........g....g.\",  --  8\n\t\t\t\t\"mmmmmmm.gk...g.\",  --  9\n\t\t\t\t\"mmmmmmm.gl..kg.\",  -- 10\n\t\t\t\t\"mmmmmmm.gn..lg.\",  -- 11\n\t\t\t\t\"mmmmmmm.g...ng.\",  -- 12\n\t\t\t\t\"mmmmmmm.gq..qg.\",  -- 13\n\t\t\t\t\"mmmmmmm.fggggf.\",  -- 14\n\t\t\t\t\"mmmmmmm........\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".fgrrgfsfgrrgf.\",  --  1\n\t\t\t\t\".g...........g.\",  --  2\n\t\t\t\t\".g...........r.\",  --  3\n\t\t\t\t\".f..........tr.\",  --  4\n\t\t\t\t\".g...........r.\",  --  5\n\t\t\t\t\".g..t....t...g.\",  --  6\n\t\t\t\t\".fgrrrrgf....f.\",  --  7\n\t\t\t\t\"........g....g.\",  --  8\n\t\t\t\t\"mmmmmmm.r....r.\",  --  9\n\t\t\t\t\"mmmmmmm.rt...r.\",  -- 10\n\t\t\t\t\"mmmmmmm.r...tr.\",  -- 11\n\t\t\t\t\"mmmmmmm.r....r.\",  -- 12\n\t\t\t\t\"mmmmmmm.gq..qg.\",  -- 13\n\t\t\t\t\"mmmmmmm.fgrrgf.\",  -- 14\n\t\t\t\t\"mmmmmmm........\",  -- 15\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".fuuuuuuuuuuuf.\",  --  1\n\t\t\t\t\".v....w.w....v.\",  --  2\n\t\t\t\t\".v...........v.\",  --  3\n\t\t\t\t\".vx..........v.\",  --  4\n\t\t\t\t\".v...........v.\",  --  5\n\t\t\t\t\".v......y....v.\",  --  6\n\t\t\t\t\".fuuuuuufx..zv.\",  --  7\n\t\t\t\t\"........v....v.\",  --  8\n\t\t\t\t\"mmmmmmm.v....v.\",  --  9\n\t\t\t\t\"mmmmmmm.v....v.\",  -- 10\n\t\t\t\t\"mmmmmmm.v....v.\",  -- 11\n\t\t\t\t\"mmmmmmm.v....v.\",  -- 12\n\t\t\t\t\"mmmmmmm.v.yy.v.\",  -- 13\n\t\t\t\t\"mmmmmmm.fuuuuf.\",  -- 14\n\t\t\t\t\"mmmmmmm........\",  -- 15\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"nnnnnnnnnnnnnno\",  --  0\n\t\t\t\t\"pgggggggggggggo\",  --  1\n\t\t\t\t\"pgAAAAAAAAAABgo\",  --  2\n\t\t\t\t\"pgC.........Bgo\",  --  3\n\t\t\t\t\"pgC.........Bgo\",  --  4\n\t\t\t\t\"pgC.........Bgo\",  --  5\n\t\t\t\t\"pgCDDDDDDD..Bgo\",  --  6\n\t\t\t\t\"pggggggggC..Bgo\",  --  7\n\t\t\t\t\"pkkkkkkpgC..Bgo\",  --  8\n\t\t\t\t\"mmmmmmmpgC..Bgo\",  --  9\n\t\t\t\t\"mmmmmmmpgC..Bgo\",  -- 10\n\t\t\t\t\"mmmmmmmpgC..Bgo\",  -- 11\n\t\t\t\t\"mmmmmmmpgC..Bgo\",  -- 12\n\t\t\t\t\"mmmmmmmpgCDDBgo\",  -- 13\n\t\t\t\t\"mmmmmmmpggggggo\",  -- 14\n\t\t\t\t\"mmmmmmmpkkkkkkk\",  -- 15\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".pnnnnnnnnnnno.\",  --  1\n\t\t\t\t\".pgggggggggggo.\",  --  2\n\t\t\t\t\".pgggggggggggo.\",  --  3\n\t\t\t\t\".pgggggggggggo.\",  --  4\n\t\t\t\t\".pgggggggggggo.\",  --  5\n\t\t\t\t\".pgggggggggggo.\",  --  6\n\t\t\t\t\".pkkkkkkkggggo.\",  --  7\n\t\t\t\t\"........pggggo.\",  --  8\n\t\t\t\t\"mmmmmmm.pggggo.\",  --  9\n\t\t\t\t\"mmmmmmm.pggggo.\",  -- 10\n\t\t\t\t\"mmmmmmm.pggggo.\",  -- 11\n\t\t\t\t\"mmmmmmm.pggggo.\",  -- 12\n\t\t\t\t\"mmmmmmm.pggggo.\",  -- 13\n\t\t\t\t\"mmmmmmm.kkkkko.\",  -- 14\n\t\t\t\t\"mmmmmmm........\",  -- 15\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"..nnnnnnnnnnn..\",  --  2\n\t\t\t\t\"..pgggggggggo..\",  --  3\n\t\t\t\t\"..pgggggggggo..\",  --  4\n\t\t\t\t\"..pgggggggggo..\",  --  5\n\t\t\t\t\"..kkkkkkkkggo..\",  --  6\n\t\t\t\t\".........pggo..\",  --  7\n\t\t\t\t\".........pggo..\",  --  8\n\t\t\t\t\"mmmmmmm..pggo..\",  --  9\n\t\t\t\t\"mmmmmmm..pggo..\",  -- 10\n\t\t\t\t\"mmmmmmm..pggo..\",  -- 11\n\t\t\t\t\"mmmmmmm..pggo..\",  -- 12\n\t\t\t\t\"mmmmmmm..kkko..\",  -- 13\n\t\t\t\t\"mmmmmmm........\",  -- 14\n\t\t\t\t\"mmmmmmm........\",  -- 15\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...pnnnnnnno...\",  --  3\n\t\t\t\t\"...pgggggggo...\",  --  4\n\t\t\t\t\"...pkkkkkkpo...\",  --  5\n\t\t\t\t\"..........po...\",  --  6\n\t\t\t\t\"..........po...\",  --  7\n\t\t\t\t\"..........po...\",  --  8\n\t\t\t\t\"mmmmmmm...po...\",  --  9\n\t\t\t\t\"mmmmmmm...po...\",  -- 10\n\t\t\t\t\"mmmmmmm...po...\",  -- 11\n\t\t\t\t\"mmmmmmm...pk...\",  -- 12\n\t\t\t\t\"mmmmmmm........\",  -- 13\n\t\t\t\t\"mmmmmmm........\",  -- 14\n\t\t\t\t\"mmmmmmm........\",  -- 15\n\n\t\t\t},\n\t\t},  -- WoodenHouseL13x14\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse7x5\",\n\t\t\t\tName         = \"Plains 40\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"40\",\n\t\t\t\tID           = \"91\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h:102: 0\",  -- glasspane\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k: 53: 7\",  -- woodstairs\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 6\",  -- woodstairs\n\t\t\t\t\"o: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmaaammm\",  --  0\n\t\t\t\t\"maaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...bcd...\",  --  0\n\t\t\t\t\".aaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaa.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".effgffe.\",  --  1\n\t\t\t\t\".f.....f.\",  --  2\n\t\t\t\t\".f.....f.\",  --  3\n\t\t\t\t\".f.....f.\",  --  4\n\t\t\t\t\".efffffe.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".ehfifhe.\",  --  1\n\t\t\t\t\".h.....h.\",  --  2\n\t\t\t\t\".h.....h.\",  --  3\n\t\t\t\t\".h.....h.\",  --  4\n\t\t\t\t\".ehhfhhe.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjjjj\",  --  0\n\t\t\t\t\"kefffffek\",  --  1\n\t\t\t\t\".f.l.l.f.\",  --  2\n\t\t\t\t\".f.....f.\",  --  3\n\t\t\t\t\".f.....f.\",  --  4\n\t\t\t\t\"nefffffen\",  --  5\n\t\t\t\t\"ooooooooo\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\"jjjjjjjjj\",  --  1\n\t\t\t\t\"kfffffffk\",  --  2\n\t\t\t\t\".f.....f.\",  --  3\n\t\t\t\t\"nfffffffn\",  --  4\n\t\t\t\t\"ooooooooo\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".........\",  --  1\n\t\t\t\t\"jjjjjjjjj\",  --  2\n\t\t\t\t\"fffffffff\",  --  3\n\t\t\t\t\"ooooooooo\",  --  4\n\t\t\t\t\".........\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t},\n\t\t},  -- WoodenHouse7x5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse9x5\",\n\t\t\t\tName         = \"Plains 41\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"41\",\n\t\t\t\tID           = \"92\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = -1,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h:102: 0\",  -- glasspane\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k: 53: 7\",  -- woodstairs\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 6\",  -- woodstairs\n\t\t\t\t\"o: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcd....\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".efffgfffe.\",  --  1\n\t\t\t\t\".f.......f.\",  --  2\n\t\t\t\t\".f.......f.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".efffffffe.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".ehhfifhhe.\",  --  1\n\t\t\t\t\".h.......h.\",  --  2\n\t\t\t\t\".h.......h.\",  --  3\n\t\t\t\t\".h.......h.\",  --  4\n\t\t\t\t\".ehhhfhhhe.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjjjjjj\",  --  0\n\t\t\t\t\"kfffffffffk\",  --  1\n\t\t\t\t\".f..l.l.ff.\",  --  2\n\t\t\t\t\".f......ff.\",  --  3\n\t\t\t\t\".f......ff.\",  --  4\n\t\t\t\t\"nfffffffffn\",  --  5\n\t\t\t\t\"ooooooooooo\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"jjjjjjjjjjj\",  --  1\n\t\t\t\t\"kfffffffffk\",  --  2\n\t\t\t\t\".fffffffff.\",  --  3\n\t\t\t\t\"nfffffffffn\",  --  4\n\t\t\t\t\"ooooooooooo\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"jjjjjjjjjjj\",  --  2\n\t\t\t\t\"fffffffffff\",  --  3\n\t\t\t\t\"ooooooooooo\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t},\n\t\t},  -- WoodenHouse9x5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouseL9x9\",\n\t\t\t\tName         = \"Plains 42\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"42\",\n\t\t\t\tID           = \"93\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 7,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h:102: 0\",  -- glasspane\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k: 53: 7\",  -- woodstairs\n\t\t\t\t\"l: 53: 1\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 3\",  -- torch\n\t\t\t\t\"o: 50: 4\",  -- torch\n\t\t\t\t\"p: 53: 6\",  -- woodstairs\n\t\t\t\t\"q: 50: 1\",  -- torch\n\t\t\t\t\"r: 50: 2\",  -- torch\n\t\t\t\t\"s: 53: 3\",  -- woodstairs\n\t\t\t\t\"t: 53: 0\",  -- woodstairs\n\t\t\t\t\"u: 53: 5\",  -- woodstairs\n\t\t\t\t\"v: 53: 4\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmaaaaam\",  --  6\n\t\t\t\t\"mmmmmaaaaam\",  --  7\n\t\t\t\t\"mmmmmaaaaam\",  --  8\n\t\t\t\t\"mmmmmaaaaam\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcd....\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\".....aaaaa.\",  --  6\n\t\t\t\t\"mmmm.aaaaa.\",  --  7\n\t\t\t\t\"mmmm.aaaaa.\",  --  8\n\t\t\t\t\"mmmm.aaaaa.\",  --  9\n\t\t\t\t\"mmmm.......\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".efffgfffe.\",  --  1\n\t\t\t\t\".f.......f.\",  --  2\n\t\t\t\t\".f.......f.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".efffe...f.\",  --  5\n\t\t\t\t\".....f...f.\",  --  6\n\t\t\t\t\"mmmm.f...f.\",  --  7\n\t\t\t\t\"mmmm.f...f.\",  --  8\n\t\t\t\t\"mmmm.efffe.\",  --  9\n\t\t\t\t\"mmmm.......\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".ehhfifhhe.\",  --  1\n\t\t\t\t\".h.......h.\",  --  2\n\t\t\t\t\".h.......h.\",  --  3\n\t\t\t\t\".h.......h.\",  --  4\n\t\t\t\t\".ehhhe...f.\",  --  5\n\t\t\t\t\".....h...h.\",  --  6\n\t\t\t\t\"mmmm.h...h.\",  --  7\n\t\t\t\t\"mmmm.h...h.\",  --  8\n\t\t\t\t\"mmmm.ehhhe.\",  --  9\n\t\t\t\t\"mmmm.......\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjjjjjj\",  --  0\n\t\t\t\t\"kfffffffffl\",  --  1\n\t\t\t\t\".f..n.n..fl\",  --  2\n\t\t\t\t\".f.......fl\",  --  3\n\t\t\t\t\".f...o...fl\",  --  4\n\t\t\t\t\"pfffffq.rfl\",  --  5\n\t\t\t\t\"sssssf...fl\",  --  6\n\t\t\t\t\"mmmmtf...fl\",  --  7\n\t\t\t\t\"mmmmtf...fl\",  --  8\n\t\t\t\t\"mmmmtfffffl\",  --  9\n\t\t\t\t\"mmmmtu...vl\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"jjjjjjjjjl.\",  --  1\n\t\t\t\t\"kffffffffl.\",  --  2\n\t\t\t\t\".f......fl.\",  --  3\n\t\t\t\t\"pffffff.fl.\",  --  4\n\t\t\t\t\"ssssssf.fl.\",  --  5\n\t\t\t\t\".....tf.fl.\",  --  6\n\t\t\t\t\"mmmm.tf.fl.\",  --  7\n\t\t\t\t\"mmmm.tf.fl.\",  --  8\n\t\t\t\t\"mmmm.tfffl.\",  --  9\n\t\t\t\t\"mmmm.tu.vl.\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"jjjjjjjjj..\",  --  2\n\t\t\t\t\"ffffffffl..\",  --  3\n\t\t\t\t\"sssssstfl..\",  --  4\n\t\t\t\t\"......tfl..\",  --  5\n\t\t\t\t\"......tfl..\",  --  6\n\t\t\t\t\"mmmm..tfl..\",  --  7\n\t\t\t\t\"mmmm..tfl..\",  --  8\n\t\t\t\t\"mmmm..tfl..\",  --  9\n\t\t\t\t\"mmmm..tfl..\",  -- 10\n\n\t\t\t},\n\t\t},  -- WoodenHouseL9x9\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouseU13x9\",\n\t\t\t\tName         = \"Plains 43\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"43\",\n\t\t\t\tID           = \"94\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 7,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h:102: 0\",  -- glasspane\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k: 53: 0\",  -- woodstairs\n\t\t\t\t\"l: 53: 1\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 3\",  -- torch\n\t\t\t\t\"o: 50: 4\",  -- torch\n\t\t\t\t\"p: 50: 2\",  -- torch\n\t\t\t\t\"q: 50: 1\",  -- torch\n\t\t\t\t\"r: 53: 3\",  -- woodstairs\n\t\t\t\t\"s: 53: 5\",  -- woodstairs\n\t\t\t\t\"t: 53: 4\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmaaammmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaammmaaaaam\",  --  6\n\t\t\t\t\"maaaaammmaaaaam\",  --  7\n\t\t\t\t\"maaaaammmaaaaam\",  --  8\n\t\t\t\t\"maaaaammmaaaaam\",  --  9\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"......bcd......\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaa...aaaaa.\",  --  6\n\t\t\t\t\".aaaaa...aaaaa.\",  --  7\n\t\t\t\t\".aaaaa...aaaaa.\",  --  8\n\t\t\t\t\".aaaaa...aaaaa.\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".efffffgfffffe.\",  --  1\n\t\t\t\t\".f...........f.\",  --  2\n\t\t\t\t\".f...........f.\",  --  3\n\t\t\t\t\".f...........f.\",  --  4\n\t\t\t\t\".f...efffe...f.\",  --  5\n\t\t\t\t\".f...f...f...f.\",  --  6\n\t\t\t\t\".f...f...f...f.\",  --  7\n\t\t\t\t\".f...f...f...f.\",  --  8\n\t\t\t\t\".efffe...efffe.\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".ehhhhfifhhhhe.\",  --  1\n\t\t\t\t\".h...........h.\",  --  2\n\t\t\t\t\".h...........h.\",  --  3\n\t\t\t\t\".h...........h.\",  --  4\n\t\t\t\t\".f...ehhhe...f.\",  --  5\n\t\t\t\t\".h...h...h...h.\",  --  6\n\t\t\t\t\".h...h...h...h.\",  --  7\n\t\t\t\t\".h...h...h...h.\",  --  8\n\t\t\t\t\".ehhhe...ehhhe.\",  --  9\n\t\t\t\t\"...............\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjjjjjjjjjj\",  --  0\n\t\t\t\t\"kfffffffffffffl\",  --  1\n\t\t\t\t\"kf....n.n....fl\",  --  2\n\t\t\t\t\"kf...........fl\",  --  3\n\t\t\t\t\"kf...o...o...fl\",  --  4\n\t\t\t\t\"kf..pfffffq..fl\",  --  5\n\t\t\t\t\"kf...frrrf...fl\",  --  6\n\t\t\t\t\"kf...fl.kf...fl\",  --  7\n\t\t\t\t\"kf...fl.kf...fl\",  --  8\n\t\t\t\t\"kfffffl.kfffffl\",  --  9\n\t\t\t\t\"ks...tl.ks...tl\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".jjjjjjjjjjjjl.\",  --  1\n\t\t\t\t\".kfffffffffffl.\",  --  2\n\t\t\t\t\".kfffffffffffl.\",  --  3\n\t\t\t\t\".kfffffffffffl.\",  --  4\n\t\t\t\t\".kffflrrrrfffl.\",  --  5\n\t\t\t\t\".kfffl...kfffl.\",  --  6\n\t\t\t\t\".kfffl...kfffl.\",  --  7\n\t\t\t\t\".kfffl...kfffl.\",  --  8\n\t\t\t\t\".kfffl...kfffl.\",  --  9\n\t\t\t\t\".ks.tl...ks.tl.\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"..kjjjjjjjjjj..\",  --  2\n\t\t\t\t\"..kfffffffffl..\",  --  3\n\t\t\t\t\"..kflrrrrrkfl..\",  --  4\n\t\t\t\t\"..kfl.....kfl..\",  --  5\n\t\t\t\t\"..kfl.....kfl..\",  --  6\n\t\t\t\t\"..kfl.....kfl..\",  --  7\n\t\t\t\t\"..kfl.....kfl..\",  --  8\n\t\t\t\t\"..kfl.....kfl..\",  --  9\n\t\t\t\t\"..kfl.....kfl..\",  -- 10\n\n\t\t\t},\n\t\t},  -- WoodenHouseU13x9\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse9x5Library\",\n\t\t\t\tName         = \"Plains 46\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"46\",\n\t\t\t\tID           = \"97\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h: 53: 3\",  -- woodstairs\n\t\t\t\t\"i: 85: 0\",  -- fence\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k: 53: 1\",  -- woodstairs\n\t\t\t\t\"l: 53: 0\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:102: 0\",  -- glasspane\n\t\t\t\t\"o: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"p: 50: 3\",  -- torch\n\t\t\t\t\"q: 72: 0\",  -- woodplate\n\t\t\t\t\"r: 53: 7\",  -- woodstairs\n\t\t\t\t\"s: 47: 0\",  -- bookshelf\n\t\t\t\t\"t: 50: 1\",  -- torch\n\t\t\t\t\"u: 50: 2\",  -- torch\n\t\t\t\t\"v: 53: 6\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcd....\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".efffgfffe.\",  --  1\n\t\t\t\t\".fh.....hf.\",  --  2\n\t\t\t\t\".fi.....if.\",  --  3\n\t\t\t\t\".fj.kil.jf.\",  --  4\n\t\t\t\t\".efffffffe.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".ennfofnne.\",  --  1\n\t\t\t\t\".n..p.p..n.\",  --  2\n\t\t\t\t\".nq.....qn.\",  --  3\n\t\t\t\t\".n...q...n.\",  --  4\n\t\t\t\t\".ennnfnnne.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjjjjjj\",  --  0\n\t\t\t\t\"rfffffffffr\",  --  1\n\t\t\t\t\".fsssssssf.\",  --  2\n\t\t\t\t\".ft.....uf.\",  --  3\n\t\t\t\t\".fsssssssf.\",  --  4\n\t\t\t\t\"vfffffffffv\",  --  5\n\t\t\t\t\"hhhhhhhhhhh\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"jjjjjjjjjjj\",  --  1\n\t\t\t\t\"rfffffffffr\",  --  2\n\t\t\t\t\".f.......f.\",  --  3\n\t\t\t\t\"vfffffffffv\",  --  4\n\t\t\t\t\"hhhhhhhhhhh\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"jjjjjjjjjjj\",  --  2\n\t\t\t\t\"fffffffffff\",  --  3\n\t\t\t\t\"hhhhhhhhhhh\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t},\n\t\t},  -- WoodenHouse9x5Library\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse10x7Library\",\n\t\t\t\tName         = \"Plains 47\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"47\",\n\t\t\t\tID           = \"98\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h: 53: 3\",  -- woodstairs\n\t\t\t\t\"i: 85: 0\",  -- fence\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k: 53: 1\",  -- woodstairs\n\t\t\t\t\"l: 53: 0\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:102: 0\",  -- glasspane\n\t\t\t\t\"o: 64: 8\",  -- woodendoorblock\n\t\t\t\t\"p: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"q: 50: 3\",  -- torch\n\t\t\t\t\"r: 72: 0\",  -- woodplate\n\t\t\t\t\"s: 53: 7\",  -- woodstairs\n\t\t\t\t\"t: 47: 0\",  -- bookshelf\n\t\t\t\t\"u: 50: 1\",  -- torch\n\t\t\t\t\"v: 50: 2\",  -- torch\n\t\t\t\t\"w: 53: 6\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bccd....\",  --  0\n\t\t\t\t\".aaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaa.\",  --  7\n\t\t\t\t\"............\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".efffggfffe.\",  --  1\n\t\t\t\t\".f........f.\",  --  2\n\t\t\t\t\".fh......hf.\",  --  3\n\t\t\t\t\".fi......if.\",  --  4\n\t\t\t\t\".fj......jf.\",  --  5\n\t\t\t\t\".f.kilkil.f.\",  --  6\n\t\t\t\t\".effffffffe.\",  --  7\n\t\t\t\t\"............\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".ennfopfnne.\",  --  1\n\t\t\t\t\".n..q..q..n.\",  --  2\n\t\t\t\t\".n........n.\",  --  3\n\t\t\t\t\".fr......rf.\",  --  4\n\t\t\t\t\".n........n.\",  --  5\n\t\t\t\t\".n..r..r..n.\",  --  6\n\t\t\t\t\".ennfnnfnne.\",  --  7\n\t\t\t\t\"............\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjjjjjjj\",  --  0\n\t\t\t\t\"sffffffffffs\",  --  1\n\t\t\t\t\".fttttttttf.\",  --  2\n\t\t\t\t\".f........f.\",  --  3\n\t\t\t\t\".fu......vf.\",  --  4\n\t\t\t\t\".f........f.\",  --  5\n\t\t\t\t\".fttttttttf.\",  --  6\n\t\t\t\t\"wffffffffffw\",  --  7\n\t\t\t\t\"hhhhhhhhhhhh\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"jjjjjjjjjjjj\",  --  1\n\t\t\t\t\"sffffffffffs\",  --  2\n\t\t\t\t\".fttttttttf.\",  --  3\n\t\t\t\t\".f........f.\",  --  4\n\t\t\t\t\".fttttttttf.\",  --  5\n\t\t\t\t\"wffffffffffw\",  --  6\n\t\t\t\t\"hhhhhhhhhhhh\",  --  7\n\t\t\t\t\"............\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"jjjjjjjjjjjj\",  --  2\n\t\t\t\t\"sffffffffffs\",  --  3\n\t\t\t\t\".f........f.\",  --  4\n\t\t\t\t\"wffffffffffw\",  --  5\n\t\t\t\t\"hhhhhhhhhhhh\",  --  6\n\t\t\t\t\"............\",  --  7\n\t\t\t\t\"............\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"............\",  --  2\n\t\t\t\t\"jjjjjjjjjjjj\",  --  3\n\t\t\t\t\"ffffffffffff\",  --  4\n\t\t\t\t\"hhhhhhhhhhhh\",  --  5\n\t\t\t\t\"............\",  --  6\n\t\t\t\t\"............\",  --  7\n\t\t\t\t\"............\",  --  8\n\n\t\t\t},\n\t\t},  -- WoodenHouse10x7Library\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse9x7Butcher\",\n\t\t\t\tName         = \"Plains 48\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"48\",\n\t\t\t\tID           = \"99\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 8,\n\t\t\t\tz = 13,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 13,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b:  3: 0\",  -- dirt\n\t\t\t\t\"c: 67: 0\",  -- stonestairs\n\t\t\t\t\"d: 67: 2\",  -- stonestairs\n\t\t\t\t\"e: 67: 1\",  -- stonestairs\n\t\t\t\t\"f: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"g:  2: 0\",  -- grass\n\t\t\t\t\"h: 17: 0\",  -- tree\n\t\t\t\t\"i:  5: 0\",  -- planks\n\t\t\t\t\"j: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"k: 53: 3\",  -- woodstairs\n\t\t\t\t\"l: 85: 0\",  -- fence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 2\",  -- woodstairs\n\t\t\t\t\"o: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"p:102: 0\",  -- glasspane\n\t\t\t\t\"q: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"r: 72: 0\",  -- woodplate\n\t\t\t\t\"s: 53: 7\",  -- woodstairs\n\t\t\t\t\"t: 50: 1\",  -- torch\n\t\t\t\t\"u: 50: 2\",  -- torch\n\t\t\t\t\"v: 53: 6\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaam\",  --  7\n\t\t\t\t\"mmbbbbbbbmm\",  --  8\n\t\t\t\t\"mmbbbbbbbmm\",  --  9\n\t\t\t\t\"mmbbbbbbbmm\",  -- 10\n\t\t\t\t\"mmbbbbbbbmm\",  -- 11\n\t\t\t\t\"mmbbbbbbbmm\",  -- 12\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....cde....\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".affffaaaa.\",  --  2\n\t\t\t\t\".affffaaaa.\",  --  3\n\t\t\t\t\".affffaaaa.\",  --  4\n\t\t\t\t\".affffaaaa.\",  --  5\n\t\t\t\t\".affffaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaa.\",  --  7\n\t\t\t\t\"..ggggggg..\",  --  8\n\t\t\t\t\"mmgggggggmm\",  --  9\n\t\t\t\t\"mmgggggggmm\",  -- 10\n\t\t\t\t\"mmgggggggmm\",  -- 11\n\t\t\t\t\"mmgggggggmm\",  -- 12\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".hiiijiiih.\",  --  1\n\t\t\t\t\".i.f....ki.\",  --  2\n\t\t\t\t\".i.f....li.\",  --  3\n\t\t\t\t\".i.f....ni.\",  --  4\n\t\t\t\t\".i.......i.\",  --  5\n\t\t\t\t\".i.......i.\",  --  6\n\t\t\t\t\".hiiioiiih.\",  --  7\n\t\t\t\t\"..l.....l..\",  --  8\n\t\t\t\t\"mml.....lmm\",  --  9\n\t\t\t\t\"mml.....lmm\",  -- 10\n\t\t\t\t\"mml.....lmm\",  -- 11\n\t\t\t\t\"mmlllllllmm\",  -- 12\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".hppiqipph.\",  --  1\n\t\t\t\t\".p.......p.\",  --  2\n\t\t\t\t\".p......rp.\",  --  3\n\t\t\t\t\".i.......i.\",  --  4\n\t\t\t\t\".p.......p.\",  --  5\n\t\t\t\t\".p.......p.\",  --  6\n\t\t\t\t\".hppiqipph.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"mm.......mm\",  --  9\n\t\t\t\t\"mm.......mm\",  -- 10\n\t\t\t\t\"mm.......mm\",  -- 11\n\t\t\t\t\"mm.......mm\",  -- 12\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"nnnnnnnnnnn\",  --  0\n\t\t\t\t\"siiiiiiiiis\",  --  1\n\t\t\t\t\".i.......i.\",  --  2\n\t\t\t\t\".i.......i.\",  --  3\n\t\t\t\t\".it.....ui.\",  --  4\n\t\t\t\t\".i.......i.\",  --  5\n\t\t\t\t\".i.......i.\",  --  6\n\t\t\t\t\"viiiiiiiiiv\",  --  7\n\t\t\t\t\"kkkkkkkkkkk\",  --  8\n\t\t\t\t\"mm.......mm\",  --  9\n\t\t\t\t\"mm.......mm\",  -- 10\n\t\t\t\t\"mm.......mm\",  -- 11\n\t\t\t\t\"mm.......mm\",  -- 12\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"nnnnnnnnnnn\",  --  1\n\t\t\t\t\"siiiiiiiiis\",  --  2\n\t\t\t\t\".i.......i.\",  --  3\n\t\t\t\t\".i.......i.\",  --  4\n\t\t\t\t\".i.......i.\",  --  5\n\t\t\t\t\"viiiiiiiiiv\",  --  6\n\t\t\t\t\"kkkkkkkkkkk\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"mm.......mm\",  --  9\n\t\t\t\t\"mm.......mm\",  -- 10\n\t\t\t\t\"mm.......mm\",  -- 11\n\t\t\t\t\"mm.......mm\",  -- 12\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"nnnnnnnnnnn\",  --  2\n\t\t\t\t\"siiiiiiiiis\",  --  3\n\t\t\t\t\".i.......i.\",  --  4\n\t\t\t\t\"viiiiiiiiiv\",  --  5\n\t\t\t\t\"kkkkkkkkkkk\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"mm.......mm\",  --  9\n\t\t\t\t\"mm.......mm\",  -- 10\n\t\t\t\t\"mm.......mm\",  -- 11\n\t\t\t\t\"mm.......mm\",  -- 12\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"nnnnnnnnnnn\",  --  3\n\t\t\t\t\"iiiiiiiiiii\",  --  4\n\t\t\t\t\"kkkkkkkkkkk\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\t\t\t\t\"mm.......mm\",  --  9\n\t\t\t\t\"mm.......mm\",  -- 10\n\t\t\t\t\"mm.......mm\",  -- 11\n\t\t\t\t\"mm.......mm\",  -- 12\n\n\t\t\t},\n\t\t},  -- WoodenHouse9x7Butcher\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse5x5\",\n\t\t\t\tName         = \"Plains 49\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"49\",\n\t\t\t\tID           = \"100\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"i:102: 0\",  -- glasspane\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k: 53: 7\",  -- woodstairs\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 6\",  -- woodstairs\n\t\t\t\t\"o: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaamm\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd..\",  --  0\n\t\t\t\t\".aaaaa.\",  --  1\n\t\t\t\t\".aaaaa.\",  --  2\n\t\t\t\t\".aaaaa.\",  --  3\n\t\t\t\t\".aaaaa.\",  --  4\n\t\t\t\t\".aaaaa.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".efgfe.\",  --  1\n\t\t\t\t\".f...f.\",  --  2\n\t\t\t\t\".f...f.\",  --  3\n\t\t\t\t\".f...f.\",  --  4\n\t\t\t\t\".efffe.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".efhfe.\",  --  1\n\t\t\t\t\".i...i.\",  --  2\n\t\t\t\t\".i...i.\",  --  3\n\t\t\t\t\".i...i.\",  --  4\n\t\t\t\t\".eiiie.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjj\",  --  0\n\t\t\t\t\"kfffffk\",  --  1\n\t\t\t\t\".fl.lf.\",  --  2\n\t\t\t\t\".f...f.\",  --  3\n\t\t\t\t\".f...f.\",  --  4\n\t\t\t\t\"nfffffn\",  --  5\n\t\t\t\t\"ooooooo\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"jjjjjjj\",  --  1\n\t\t\t\t\"kfffffk\",  --  2\n\t\t\t\t\".f...f.\",  --  3\n\t\t\t\t\"nfffffn\",  --  4\n\t\t\t\t\"ooooooo\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"jjjjjjj\",  --  2\n\t\t\t\t\"fffffff\",  --  3\n\t\t\t\t\"ooooooo\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- WoodenHouse5x5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Forge\",\n\t\t\t\tName         = \"Plains 51\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"51\",\n\t\t\t\tID           = \"102\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 9,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 0\",  -- woodendoorblock\n\t\t\t\t\"h: 10: 0\",  -- lava\n\t\t\t\t\"i: 54: 2\",  -- chest\n\t\t\t\t\"j: 61: 2\",  -- furnace\n\t\t\t\t\"k:102: 0\",  -- glasspane\n\t\t\t\t\"l: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:139: 0\",  -- cobblestonewall\n\t\t\t\t\"o:101: 0\",  -- ironbars\n\t\t\t\t\"p: 53: 2\",  -- woodstairs\n\t\t\t\t\"q: 53: 7\",  -- woodstairs\n\t\t\t\t\"r: 50: 2\",  -- torch\n\t\t\t\t\"s: 50: 1\",  -- torch\n\t\t\t\t\"t: 53: 6\",  -- woodstairs\n\t\t\t\t\"u: 53: 3\",  -- woodstairs\n\t\t\t\t\"v: 43: 0\",  -- doublestoneslab\n\t\t\t\t\"w: 44: 0\",  -- stone_slab\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmaaaaamm\",  --  0\n\t\t\t\t\"maaaaaaaaamm\",  --  1\n\t\t\t\t\"maaaaaaaaamm\",  --  2\n\t\t\t\t\"maaaaaaaaaaa\",  --  3\n\t\t\t\t\"maaaaaaaaaaa\",  --  4\n\t\t\t\t\"maaaaaaaaaaa\",  --  5\n\t\t\t\t\"maaaaaaaaaaa\",  --  6\n\t\t\t\t\"maaaaaaaaaaa\",  --  7\n\t\t\t\t\"maaaaammmmmm\",  --  8\n\t\t\t\t\"maaaaammmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".....bcccd..\",  --  0\n\t\t\t\t\".aaaaaaaad..\",  --  1\n\t\t\t\t\".aaaaaaaad..\",  --  2\n\t\t\t\t\".aaaaaaaaaaa\",  --  3\n\t\t\t\t\".aaaaaaaaaaa\",  --  4\n\t\t\t\t\".aaaaaaaaaaa\",  --  5\n\t\t\t\t\".aaaaaaaaaaa\",  --  6\n\t\t\t\t\".aaaaaaaaaaa\",  --  7\n\t\t\t\t\".aaaaa......\",  --  8\n\t\t\t\t\".aaaaa......\",  --  9\n\t\t\t\t\"............\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".efffe......\",  --  1\n\t\t\t\t\".f...g......\",  --  2\n\t\t\t\t\".f...ea..aaa\",  --  3\n\t\t\t\t\".f...f...aha\",  --  4\n\t\t\t\t\".f...f...aha\",  --  5\n\t\t\t\t\".f...fijjaha\",  --  6\n\t\t\t\t\".f...eaaaaaa\",  --  7\n\t\t\t\t\".f...f......\",  --  8\n\t\t\t\t\".efffe......\",  --  9\n\t\t\t\t\"............\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".ekkke......\",  --  1\n\t\t\t\t\".k...l......\",  --  2\n\t\t\t\t\".k...en..n.a\",  --  3\n\t\t\t\t\".k...k.....o\",  --  4\n\t\t\t\t\".f...k.....o\",  --  5\n\t\t\t\t\".k...k.....o\",  --  6\n\t\t\t\t\".k...eaooooa\",  --  7\n\t\t\t\t\".k...f......\",  --  8\n\t\t\t\t\".ekkke......\",  --  9\n\t\t\t\t\"............\",  -- 10\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ppppppp.....\",  --  0\n\t\t\t\t\"qfffffq.....\",  --  1\n\t\t\t\t\".f...f......\",  --  2\n\t\t\t\t\".f..rfa..aoa\",  --  3\n\t\t\t\t\".f...f...o.a\",  --  4\n\t\t\t\t\".f...f...o.a\",  --  5\n\t\t\t\t\".fs..f...o.a\",  --  6\n\t\t\t\t\".f...faaaaaa\",  --  7\n\t\t\t\t\".f...f......\",  --  8\n\t\t\t\t\"tffffft.....\",  --  9\n\t\t\t\t\"uuuuuuu.....\",  -- 10\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"ppppppp.....\",  --  1\n\t\t\t\t\"qfffffq.....\",  --  2\n\t\t\t\t\".f...fvvvvvv\",  --  3\n\t\t\t\t\".f...fvwwwwv\",  --  4\n\t\t\t\t\".f...fvwwwwv\",  --  5\n\t\t\t\t\".f...fvwwwwv\",  --  6\n\t\t\t\t\".f...fvvvvvv\",  --  7\n\t\t\t\t\"tffffft.....\",  --  8\n\t\t\t\t\"uuuuuuu.....\",  --  9\n\t\t\t\t\"............\",  -- 10\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"ppppppp.....\",  --  2\n\t\t\t\t\"qfffffq.....\",  --  3\n\t\t\t\t\".f...f......\",  --  4\n\t\t\t\t\".f...f......\",  --  5\n\t\t\t\t\".f...f......\",  --  6\n\t\t\t\t\"tffffft.....\",  --  7\n\t\t\t\t\"uuuuuuu.....\",  --  8\n\t\t\t\t\"............\",  --  9\n\t\t\t\t\"............\",  -- 10\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"............\",  --  2\n\t\t\t\t\"ppppppp.....\",  --  3\n\t\t\t\t\"qfffffq.....\",  --  4\n\t\t\t\t\".f...f......\",  --  5\n\t\t\t\t\"tffffft.....\",  --  6\n\t\t\t\t\"uuuuuuu.....\",  --  7\n\t\t\t\t\"............\",  --  8\n\t\t\t\t\"............\",  --  9\n\t\t\t\t\"............\",  -- 10\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\"............\",  --  1\n\t\t\t\t\"............\",  --  2\n\t\t\t\t\"............\",  --  3\n\t\t\t\t\"ppppppp.....\",  --  4\n\t\t\t\t\"fffffff.....\",  --  5\n\t\t\t\t\"uuuuuuu.....\",  --  6\n\t\t\t\t\"............\",  --  7\n\t\t\t\t\"............\",  --  8\n\t\t\t\t\"............\",  --  9\n\t\t\t\t\"............\",  -- 10\n\n\t\t\t},\n\t\t},  -- Forge\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenHouse9x7\",\n\t\t\t\tName         = \"Plains 52\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"52\",\n\t\t\t\tID           = \"103\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"h:102: 0\",  -- glasspane\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 53: 2\",  -- woodstairs\n\t\t\t\t\"k: 53: 7\",  -- woodstairs\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 4\",  -- torch\n\t\t\t\t\"o: 53: 6\",  -- woodstairs\n\t\t\t\t\"p: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcd....\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaa.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".efffgfffe.\",  --  1\n\t\t\t\t\".f.......f.\",  --  2\n\t\t\t\t\".f.......f.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".f.......f.\",  --  5\n\t\t\t\t\".f.......f.\",  --  6\n\t\t\t\t\".efffffffe.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".ehhfifhhe.\",  --  1\n\t\t\t\t\".h.......h.\",  --  2\n\t\t\t\t\".h.......h.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".h.......h.\",  --  5\n\t\t\t\t\".h.......h.\",  --  6\n\t\t\t\t\".ehhhfhhhe.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"jjjjjjjjjjj\",  --  0\n\t\t\t\t\"kfffffffffk\",  --  1\n\t\t\t\t\".f..l.l..f.\",  --  2\n\t\t\t\t\".f.......f.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".f.......f.\",  --  5\n\t\t\t\t\".f...n...f.\",  --  6\n\t\t\t\t\"offfffffffo\",  --  7\n\t\t\t\t\"ppppppppppp\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"jjjjjjjjjjj\",  --  1\n\t\t\t\t\"kfffffffffk\",  --  2\n\t\t\t\t\".f.......f.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".f.......f.\",  --  5\n\t\t\t\t\"offfffffffo\",  --  6\n\t\t\t\t\"ppppppppppp\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"jjjjjjjjjjj\",  --  2\n\t\t\t\t\"kfffffffffk\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\"offfffffffo\",  --  5\n\t\t\t\t\"ppppppppppp\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"jjjjjjjjjjj\",  --  3\n\t\t\t\t\"fffffffffff\",  --  4\n\t\t\t\t\"ppppppppppp\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t},\n\t\t},  -- WoodenHouse9x7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenGranary\",\n\t\t\t\tName         = \"Plains 54\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"54\",\n\t\t\t\tID           = \"105\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 7,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = -1,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b:170: 0\",  -- hayblock\n\t\t\t\t\"c: 67: 0\",  -- stonestairs\n\t\t\t\t\"d: 67: 2\",  -- stonestairs\n\t\t\t\t\"e: 67: 1\",  -- stonestairs\n\t\t\t\t\"f: 17: 0\",  -- tree\n\t\t\t\t\"g:  5: 0\",  -- planks\n\t\t\t\t\"h:170: 4\",  -- hayblock\n\t\t\t\t\"i:170: 8\",  -- hayblock\n\t\t\t\t\"j: 54: 2\",  -- chest\n\t\t\t\t\"k: 50: 4\",  -- torch\n\t\t\t\t\"l: 53: 0\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 5\",  -- woodstairs\n\t\t\t\t\"o: 53: 4\",  -- woodstairs\n\t\t\t\t\"p: 53: 1\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"maaaaam\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"maaaaam\",  --  6\n\t\t\t\t\"maaaaam\",  --  7\n\t\t\t\t\"mmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bcddde.\",  --  0\n\t\t\t\t\".aaaaa.\",  --  1\n\t\t\t\t\".aaaaa.\",  --  2\n\t\t\t\t\".aaaaa.\",  --  3\n\t\t\t\t\".aaaaa.\",  --  4\n\t\t\t\t\".aaaaa.\",  --  5\n\t\t\t\t\".aaaaa.\",  --  6\n\t\t\t\t\".aaaaa.\",  --  7\n\t\t\t\t\".......\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".f..bf.\",  --  1\n\t\t\t\t\".g...g.\",  --  2\n\t\t\t\t\".gb.hg.\",  --  3\n\t\t\t\t\".fihif.\",  --  4\n\t\t\t\t\".gbbbg.\",  --  5\n\t\t\t\t\".gijbg.\",  --  6\n\t\t\t\t\".fgfgf.\",  --  7\n\t\t\t\t\".......\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".k...k.\",  --  0\n\t\t\t\t\".f...f.\",  --  1\n\t\t\t\t\".g...g.\",  --  2\n\t\t\t\t\".g...g.\",  --  3\n\t\t\t\t\".fh..f.\",  --  4\n\t\t\t\t\".ghibg.\",  --  5\n\t\t\t\t\".ghiig.\",  --  6\n\t\t\t\t\".fgfgf.\",  --  7\n\t\t\t\t\".......\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ln...op\",  --  0\n\t\t\t\t\"lgggggp\",  --  1\n\t\t\t\t\"lg...gp\",  --  2\n\t\t\t\t\"lg...gp\",  --  3\n\t\t\t\t\"lg...gp\",  --  4\n\t\t\t\t\"lgbb.gp\",  --  5\n\t\t\t\t\"lgibigp\",  --  6\n\t\t\t\t\"lgggggp\",  --  7\n\t\t\t\t\"ln...op\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".ln.op.\",  --  0\n\t\t\t\t\".lgggp.\",  --  1\n\t\t\t\t\".lg.gp.\",  --  2\n\t\t\t\t\".lg.gp.\",  --  3\n\t\t\t\t\".lg.gp.\",  --  4\n\t\t\t\t\".lg.gp.\",  --  5\n\t\t\t\t\".lg.gp.\",  --  6\n\t\t\t\t\".lgggp.\",  --  7\n\t\t\t\t\".ln.op.\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"..lgp..\",  --  0\n\t\t\t\t\"..lgp..\",  --  1\n\t\t\t\t\"..lgp..\",  --  2\n\t\t\t\t\"..lgp..\",  --  3\n\t\t\t\t\"..lgp..\",  --  4\n\t\t\t\t\"..lgp..\",  --  5\n\t\t\t\t\"..lgp..\",  --  6\n\t\t\t\t\"..lgp..\",  --  7\n\t\t\t\t\"..lgp..\",  --  8\n\n\t\t\t},\n\t\t},  -- WoodenGranary\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenStables\",\n\t\t\t\tName         = \"Plains 55\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"55\",\n\t\t\t\tID           = \"106\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 9,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 8,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = -1,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e:  3: 0\",  -- dirt\n\t\t\t\t\"f: 17: 0\",  -- tree\n\t\t\t\t\"g:107: 0\",  -- fencegate\n\t\t\t\t\"h:107: 4\",  -- fencegate\n\t\t\t\t\"i:  5: 0\",  -- planks\n\t\t\t\t\"j:107: 6\",  -- fencegate\n\t\t\t\t\"k: 85: 0\",  -- fence\n\t\t\t\t\"l:170: 0\",  -- hayblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:170: 4\",  -- hayblock\n\t\t\t\t\"o:170: 8\",  -- hayblock\n\t\t\t\t\"p: 50: 1\",  -- torch\n\t\t\t\t\"q: 50: 2\",  -- torch\n\t\t\t\t\"r: 53: 2\",  -- woodstairs\n\t\t\t\t\"s: 53: 7\",  -- woodstairs\n\t\t\t\t\"t: 53: 6\",  -- woodstairs\n\t\t\t\t\"u: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".bcccccccccccd.\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aeeeeeeeeeeea.\",  --  2\n\t\t\t\t\".aeeeeeeeeeeea.\",  --  3\n\t\t\t\t\".aeeeeeeeeeeea.\",  --  4\n\t\t\t\t\".aeeeeeeeeeeea.\",  --  5\n\t\t\t\t\".aeeeeeeeeeeea.\",  --  6\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".fghgighgigjgf.\",  --  1\n\t\t\t\t\".k...k...k...k.\",  --  2\n\t\t\t\t\".k...k...k...k.\",  --  3\n\t\t\t\t\".k...k...k...k.\",  --  4\n\t\t\t\t\".k...k...k...k.\",  --  5\n\t\t\t\t\".kl..k..nko..k.\",  --  6\n\t\t\t\t\".fkkkikkkikkkf.\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".f...i...i...f.\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\".f...i...i...f.\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".fp.qip.qip.qf.\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"...............\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\"...............\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\".f...i...i...f.\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"rrrrrrrrrrrrrrr\",  --  0\n\t\t\t\t\"siiiiiiiiiiiiis\",  --  1\n\t\t\t\t\".i...........i.\",  --  2\n\t\t\t\t\".i...........i.\",  --  3\n\t\t\t\t\".i...........i.\",  --  4\n\t\t\t\t\".i...........i.\",  --  5\n\t\t\t\t\".i...........i.\",  --  6\n\t\t\t\t\"tiiiiiiiiiiiiit\",  --  7\n\t\t\t\t\"uuuuuuuuuuuuuuu\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"rrrrrrrrrrrrrrr\",  --  1\n\t\t\t\t\"siiiiiiiiiiiiis\",  --  2\n\t\t\t\t\".i...........i.\",  --  3\n\t\t\t\t\".i...........i.\",  --  4\n\t\t\t\t\".i...........i.\",  --  5\n\t\t\t\t\"tiiiiiiiiiiiiit\",  --  6\n\t\t\t\t\"uuuuuuuuuuuuuuu\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"rrrrrrrrrrrrrrr\",  --  2\n\t\t\t\t\"siiiiiiiiiiiiis\",  --  3\n\t\t\t\t\".i...........i.\",  --  4\n\t\t\t\t\"tiiiiiiiiiiiiit\",  --  5\n\t\t\t\t\"uuuuuuuuuuuuuuu\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"rrrrrrrrrrrrrrr\",  --  3\n\t\t\t\t\"iiiiiiiiiiiiiii\",  --  4\n\t\t\t\t\"uuuuuuuuuuuuuuu\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t},\n\t\t},  -- WoodenStables\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenChurchMid\",\n\t\t\t\tName         = \"Plains 58\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"58\",\n\t\t\t\tID           = \"109\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 15,\n\t\t\t\tz = 13,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 14,\n\t\t\t\tMaxZ = 13,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"A: 85: 0\",  -- fence\n\t\t\t\t\"B:126: 8\",  -- woodenslab\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 0\",  -- stonestairs\n\t\t\t\t\"c: 67: 2\",  -- stonestairs\n\t\t\t\t\"d: 67: 1\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"h: 65: 3\",  -- ladder\n\t\t\t\t\"i: 53: 3\",  -- woodstairs\n\t\t\t\t\"j: 53: 7\",  -- woodstairs\n\t\t\t\t\"k: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"l:102: 0\",  -- glasspane\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 1\",  -- torch\n\t\t\t\t\"o: 50: 2\",  -- torch\n\t\t\t\t\"p:171:14\",  -- carpet\n\t\t\t\t\"q: 50: 3\",  -- torch\n\t\t\t\t\"r: 53: 2\",  -- woodstairs\n\t\t\t\t\"s: 53: 0\",  -- woodstairs\n\t\t\t\t\"t: 53: 1\",  -- woodstairs\n\t\t\t\t\"u: 53: 5\",  -- woodstairs\n\t\t\t\t\"v: 53: 4\",  -- woodstairs\n\t\t\t\t\"w: 17: 4\",  -- tree\n\t\t\t\t\"x: 17: 8\",  -- tree\n\t\t\t\t\"y: 54: 2\",  -- chest\n\t\t\t\t\"z: 50: 4\",  -- torch\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaamm\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"maaaaam\",  --  6\n\t\t\t\t\"maaaaam\",  --  7\n\t\t\t\t\"maaaaam\",  --  8\n\t\t\t\t\"maaaaam\",  --  9\n\t\t\t\t\"maaaaam\",  -- 10\n\t\t\t\t\"maaaaam\",  -- 11\n\t\t\t\t\"mmmmmmm\",  -- 12\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd..\",  --  0\n\t\t\t\t\".aaaaa.\",  --  1\n\t\t\t\t\".aaaaa.\",  --  2\n\t\t\t\t\".aaaaa.\",  --  3\n\t\t\t\t\".aaaaa.\",  --  4\n\t\t\t\t\".aaaaa.\",  --  5\n\t\t\t\t\".aaaaa.\",  --  6\n\t\t\t\t\".aaaaa.\",  --  7\n\t\t\t\t\".aaaaa.\",  --  8\n\t\t\t\t\".aaaaa.\",  --  9\n\t\t\t\t\".aaaaa.\",  -- 10\n\t\t\t\t\".aaaaa.\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".efgfe.\",  --  1\n\t\t\t\t\".f..hf.\",  --  2\n\t\t\t\t\".f...f.\",  --  3\n\t\t\t\t\".f...f.\",  --  4\n\t\t\t\t\".ei.ie.\",  --  5\n\t\t\t\t\".f...f.\",  --  6\n\t\t\t\t\".fi.if.\",  --  7\n\t\t\t\t\".f...f.\",  --  8\n\t\t\t\t\".f.j.f.\",  --  9\n\t\t\t\t\".f...f.\",  -- 10\n\t\t\t\t\".efffe.\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".efkfe.\",  --  1\n\t\t\t\t\".l..hl.\",  --  2\n\t\t\t\t\".l...l.\",  --  3\n\t\t\t\t\".l...l.\",  --  4\n\t\t\t\t\".e...e.\",  --  5\n\t\t\t\t\".l...l.\",  --  6\n\t\t\t\t\".l...l.\",  --  7\n\t\t\t\t\".fn.of.\",  --  8\n\t\t\t\t\".l.p.l.\",  --  9\n\t\t\t\t\".l...l.\",  -- 10\n\t\t\t\t\".ellle.\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".efffe.\",  --  1\n\t\t\t\t\".f.qhf.\",  --  2\n\t\t\t\t\".f...f.\",  --  3\n\t\t\t\t\".f...f.\",  --  4\n\t\t\t\t\"re...er\",  --  5\n\t\t\t\t\"sf...ft\",  --  6\n\t\t\t\t\"sf...ft\",  --  7\n\t\t\t\t\"sf...ft\",  --  8\n\t\t\t\t\"sf...ft\",  --  9\n\t\t\t\t\"sf...ft\",  -- 10\n\t\t\t\t\"sefffet\",  -- 11\n\t\t\t\t\"su...vt\",  -- 12\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".ewwwe.\",  --  1\n\t\t\t\t\".xffhx.\",  --  2\n\t\t\t\t\".xfffx.\",  --  3\n\t\t\t\t\".xfffx.\",  --  4\n\t\t\t\t\".ewwwe.\",  --  5\n\t\t\t\t\".sf.ft.\",  --  6\n\t\t\t\t\".sf.ft.\",  --  7\n\t\t\t\t\".sf.ft.\",  --  8\n\t\t\t\t\".sf.ft.\",  --  9\n\t\t\t\t\".sf.ft.\",  -- 10\n\t\t\t\t\".sffft.\",  -- 11\n\t\t\t\t\".su.vt.\",  -- 12\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".eflfe.\",  --  1\n\t\t\t\t\".f..hf.\",  --  2\n\t\t\t\t\".f...f.\",  --  3\n\t\t\t\t\".f.y.f.\",  --  4\n\t\t\t\t\".efffe.\",  --  5\n\t\t\t\t\"..sft..\",  --  6\n\t\t\t\t\"..sft..\",  --  7\n\t\t\t\t\"..sft..\",  --  8\n\t\t\t\t\"..sft..\",  --  9\n\t\t\t\t\"..sft..\",  -- 10\n\t\t\t\t\"..sft..\",  -- 11\n\t\t\t\t\"..sft..\",  -- 12\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".eflfe.\",  --  1\n\t\t\t\t\".f..hf.\",  --  2\n\t\t\t\t\".l...l.\",  --  3\n\t\t\t\t\".f...f.\",  --  4\n\t\t\t\t\".efffe.\",  --  5\n\t\t\t\t\".......\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\t\t\t\t\".......\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 8\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".eflfe.\",  --  1\n\t\t\t\t\".f..hf.\",  --  2\n\t\t\t\t\".f...f.\",  --  3\n\t\t\t\t\".f.z.f.\",  --  4\n\t\t\t\t\".efffe.\",  --  5\n\t\t\t\t\".......\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\t\t\t\t\".......\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 9\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".ewwwe.\",  --  1\n\t\t\t\t\".xffhx.\",  --  2\n\t\t\t\t\".xfffx.\",  --  3\n\t\t\t\t\".xfffx.\",  --  4\n\t\t\t\t\".ewwwe.\",  --  5\n\t\t\t\t\".......\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\t\t\t\t\".......\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 10\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".eAAAe.\",  --  1\n\t\t\t\t\".A...A.\",  --  2\n\t\t\t\t\".A...A.\",  --  3\n\t\t\t\t\".A...A.\",  --  4\n\t\t\t\t\".eAAAe.\",  --  5\n\t\t\t\t\".......\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\t\t\t\t\".......\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 11\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".e...e.\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".e...e.\",  --  5\n\t\t\t\t\".......\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\t\t\t\t\".......\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"su...vt\",  --  0\n\t\t\t\t\"sefffet\",  --  1\n\t\t\t\t\"sfBBBft\",  --  2\n\t\t\t\t\"sfBBBft\",  --  3\n\t\t\t\t\"sfBBBft\",  --  4\n\t\t\t\t\"sefffet\",  --  5\n\t\t\t\t\"su...vt\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\t\t\t\t\".......\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 13\n\t\t\t\t\".su.vt.\",  --  0\n\t\t\t\t\".sffft.\",  --  1\n\t\t\t\t\".sffft.\",  --  2\n\t\t\t\t\".sffft.\",  --  3\n\t\t\t\t\".sffft.\",  --  4\n\t\t\t\t\".sffft.\",  --  5\n\t\t\t\t\".su.vt.\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\t\t\t\t\".......\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"..sft..\",  --  0\n\t\t\t\t\"..sft..\",  --  1\n\t\t\t\t\"..sft..\",  --  2\n\t\t\t\t\"..sft..\",  --  3\n\t\t\t\t\"..sft..\",  --  4\n\t\t\t\t\"..sft..\",  --  5\n\t\t\t\t\"..sft..\",  --  6\n\t\t\t\t\".......\",  --  7\n\t\t\t\t\".......\",  --  8\n\t\t\t\t\".......\",  --  9\n\t\t\t\t\".......\",  -- 10\n\t\t\t\t\".......\",  -- 11\n\t\t\t\t\".......\",  -- 12\n\n\t\t\t},\n\t\t},  -- WoodenChurchMid\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"WoodenMill5x5\",\n\t\t\t\tName         = \"Plains 60\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"60\",\n\t\t\t\tID           = \"111\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 17,\n\t\t\t\tz = 13,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = -1,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 8,\n\t\t\t\tMaxY = 16,\n\t\t\t\tMaxZ = 12,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  4: 0\",  -- cobblestone\n\t\t\t\t\"b: 67: 2\",  -- stonestairs\n\t\t\t\t\"c: 67: 1\",  -- stonestairs\n\t\t\t\t\"d: 67: 3\",  -- stonestairs\n\t\t\t\t\"e: 17: 0\",  -- tree\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g: 54: 4\",  -- chest\n\t\t\t\t\"h:154: 4\",  -- hopper\n\t\t\t\t\"i: 64: 0\",  -- woodendoorblock\n\t\t\t\t\"j:102: 0\",  -- glasspane\n\t\t\t\t\"k: 85: 0\",  -- fence\n\t\t\t\t\"l: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 2\",  -- torch\n\t\t\t\t\"o: 35: 0\",  -- wool\n\t\t\t\t\"p: 17: 4\",  -- tree\n\t\t\t\t\"q: 17: 8\",  -- tree\n\t\t\t\t\"r: 53: 2\",  -- woodstairs\n\t\t\t\t\"s: 53: 7\",  -- woodstairs\n\t\t\t\t\"t: 53: 6\",  -- woodstairs\n\t\t\t\t\"u: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmm\",  --  3\n\t\t\t\t\"maaaaammm\",  --  4\n\t\t\t\t\"maaaaaamm\",  --  5\n\t\t\t\t\"maaaaaamm\",  --  6\n\t\t\t\t\"maaaaaamm\",  --  7\n\t\t\t\t\"maaaaammm\",  --  8\n\t\t\t\t\"mmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmm\",  -- 11\n\t\t\t\t\"mmmmmmmmm\",  -- 12\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".aaaaa...\",  --  4\n\t\t\t\t\".aaaaab..\",  --  5\n\t\t\t\t\".aaaaac..\",  --  6\n\t\t\t\t\".aaaaad..\",  --  7\n\t\t\t\t\".aaaaa...\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".efffe...\",  --  4\n\t\t\t\t\".f...f...\",  --  5\n\t\t\t\t\".fgh.i...\",  --  6\n\t\t\t\t\".f...f...\",  --  7\n\t\t\t\t\".efffe...\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".ejjje...\",  --  4\n\t\t\t\t\".j...f...\",  --  5\n\t\t\t\t\".j.k.l...\",  --  6\n\t\t\t\t\".j...f...\",  --  7\n\t\t\t\t\".ejjje...\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".efffe...\",  --  4\n\t\t\t\t\".f..nf...\",  --  5\n\t\t\t\t\".f.k.f...\",  --  6\n\t\t\t\t\".f..nf..k\",  --  7\n\t\t\t\t\".efffe..o\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".epppe...\",  --  4\n\t\t\t\t\".q...q...\",  --  5\n\t\t\t\t\".q.k.q...\",  --  6\n\t\t\t\t\".q...q..k\",  --  7\n\t\t\t\t\".epppe..o\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".efffe...\",  --  4\n\t\t\t\t\".f...f...\",  --  5\n\t\t\t\t\".f.k.f..k\",  --  6\n\t\t\t\t\".f...f..o\",  --  7\n\t\t\t\t\".efffe..o\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".ejjje...\",  --  4\n\t\t\t\t\".j...j...\",  --  5\n\t\t\t\t\".j.k.j..k\",  --  6\n\t\t\t\t\".j...j..o\",  --  7\n\t\t\t\t\".ejjje...\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmm.o\",  --  0\n\t\t\t\t\"mmmmmmm.o\",  --  1\n\t\t\t\t\"mmmmmmm.o\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".efffe...\",  --  4\n\t\t\t\t\".f...f..k\",  --  5\n\t\t\t\t\".f.k.f..o\",  --  6\n\t\t\t\t\".f...f..o\",  --  7\n\t\t\t\t\".efffe...\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmm.k\",  --  0\n\t\t\t\t\"mmmmmmm.k\",  --  1\n\t\t\t\t\"mmmmmmm.o\",  --  2\n\t\t\t\t\"........o\",  --  3\n\t\t\t\t\".epppe..o\",  --  4\n\t\t\t\t\".q...q..k\",  --  5\n\t\t\t\t\".q.k.q..o\",  --  6\n\t\t\t\t\".q...q..k\",  --  7\n\t\t\t\t\".epppe..k\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm.k\",  --  2\n\t\t\t\t\"rrrrrrr.k\",  --  3\n\t\t\t\t\"sfffffs.o\",  --  4\n\t\t\t\t\".f...f..o\",  --  5\n\t\t\t\t\".f.kppppp\",  --  6\n\t\t\t\t\".f...f..o\",  --  7\n\t\t\t\t\"tffffft.o\",  --  8\n\t\t\t\t\"uuuuuuu.k\",  --  9\n\t\t\t\t\"mmmmmmm.k\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\"rrrrrrr.k\",  --  4\n\t\t\t\t\"sfffffs.k\",  --  5\n\t\t\t\t\".f...f..o\",  --  6\n\t\t\t\t\"tffffft.k\",  --  7\n\t\t\t\t\"uuuuuuu.o\",  --  8\n\t\t\t\t\"........o\",  --  9\n\t\t\t\t\"mmmmmmm.o\",  -- 10\n\t\t\t\t\"mmmmmmm.k\",  -- 11\n\t\t\t\t\"mmmmmmm.k\",  -- 12\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".........\",  --  4\n\t\t\t\t\"rrrrrrr.o\",  --  5\n\t\t\t\t\"fffffff.o\",  --  6\n\t\t\t\t\"uuuuuuu.k\",  --  7\n\t\t\t\t\".........\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm.o\",  -- 10\n\t\t\t\t\"mmmmmmm.o\",  -- 11\n\t\t\t\t\"mmmmmmm.o\",  -- 12\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".........\",  --  4\n\t\t\t\t\"........o\",  --  5\n\t\t\t\t\"........k\",  --  6\n\t\t\t\t\".........\",  --  7\n\t\t\t\t\".........\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\"........o\",  --  4\n\t\t\t\t\"........o\",  --  5\n\t\t\t\t\"........k\",  --  6\n\t\t\t\t\".........\",  --  7\n\t\t\t\t\".........\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\"........o\",  --  4\n\t\t\t\t\"........k\",  --  5\n\t\t\t\t\".........\",  --  6\n\t\t\t\t\".........\",  --  7\n\t\t\t\t\".........\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"mmmmmmm..\",  --  0\n\t\t\t\t\"mmmmmmm..\",  --  1\n\t\t\t\t\"mmmmmmm..\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\"........o\",  --  4\n\t\t\t\t\"........k\",  --  5\n\t\t\t\t\".........\",  --  6\n\t\t\t\t\".........\",  --  7\n\t\t\t\t\".........\",  --  8\n\t\t\t\t\".........\",  --  9\n\t\t\t\t\"mmmmmmm..\",  -- 10\n\t\t\t\t\"mmmmmmm..\",  -- 11\n\t\t\t\t\"mmmmmmm..\",  -- 12\n\n\t\t\t},\n\t\t},  -- WoodenMill5x5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"RoofedWell\",\n\t\t\t\tName         = \"Plains 119\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"119\",\n\t\t\t\tID           = \"271\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 15,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 14,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-9\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b:  4: 0\",  -- cobblestone\n\t\t\t\t\"c:  8: 0\",  -- water\n\t\t\t\t\"d:  3: 0\",  -- dirt\n\t\t\t\t\"e:  2: 0\",  -- grass\n\t\t\t\t\"f: 13: 0\",  -- gravel\n\t\t\t\t\"g:118: 3\",  -- cauldronblock\n\t\t\t\t\"h: 85: 0\",  -- fence\n\t\t\t\t\"i: 53: 2\",  -- woodstairs\n\t\t\t\t\"j: 53: 7\",  -- woodstairs\n\t\t\t\t\"k:  5: 0\",  -- planks\n\t\t\t\t\"l: 53: 4\",  -- woodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 53: 5\",  -- woodstairs\n\t\t\t\t\"o: 53: 6\",  -- woodstairs\n\t\t\t\t\"p: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"abbbbba\",  --  1\n\t\t\t\t\"abcccba\",  --  2\n\t\t\t\t\"abcccba\",  --  3\n\t\t\t\t\"abcccba\",  --  4\n\t\t\t\t\"abbbbba\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"abbbbba\",  --  1\n\t\t\t\t\"abcccba\",  --  2\n\t\t\t\t\"abcccba\",  --  3\n\t\t\t\t\"abcccba\",  --  4\n\t\t\t\t\"abbbbba\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"abbbbba\",  --  1\n\t\t\t\t\"abcccba\",  --  2\n\t\t\t\t\"abcccba\",  --  3\n\t\t\t\t\"abcccba\",  --  4\n\t\t\t\t\"abbbbba\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"abbbbba\",  --  1\n\t\t\t\t\"abcccba\",  --  2\n\t\t\t\t\"abcccba\",  --  3\n\t\t\t\t\"abcccba\",  --  4\n\t\t\t\t\"abbbbba\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ddddddd\",  --  0\n\t\t\t\t\"dbbbbbd\",  --  1\n\t\t\t\t\"dbcccbd\",  --  2\n\t\t\t\t\"dbcccbd\",  --  3\n\t\t\t\t\"dbcccbd\",  --  4\n\t\t\t\t\"dbbbbbd\",  --  5\n\t\t\t\t\"ddddddd\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"ddddddd\",  --  0\n\t\t\t\t\"dbbbbbd\",  --  1\n\t\t\t\t\"dbcccbd\",  --  2\n\t\t\t\t\"dbcccbd\",  --  3\n\t\t\t\t\"dbcccbd\",  --  4\n\t\t\t\t\"dbbbbbd\",  --  5\n\t\t\t\t\"ddddddd\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"ddddddd\",  --  0\n\t\t\t\t\"dbbbbbd\",  --  1\n\t\t\t\t\"dbcccbd\",  --  2\n\t\t\t\t\"dbcccbd\",  --  3\n\t\t\t\t\"dbcccbd\",  --  4\n\t\t\t\t\"dbbbbbd\",  --  5\n\t\t\t\t\"ddddddd\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"eefffee\",  --  0\n\t\t\t\t\"ebbbbbe\",  --  1\n\t\t\t\t\"fbcccbf\",  --  2\n\t\t\t\t\"fbcccbf\",  --  3\n\t\t\t\t\"fbcccbf\",  --  4\n\t\t\t\t\"ebbbbbe\",  --  5\n\t\t\t\t\"eefffee\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".bbbbb.\",  --  1\n\t\t\t\t\".b...b.\",  --  2\n\t\t\t\t\".b.g.b.\",  --  3\n\t\t\t\t\".b...b.\",  --  4\n\t\t\t\t\".bbbbb.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 10\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".h...h.\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"...h...\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".h...h.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 11\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".h...h.\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"...h...\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".h...h.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"iiiiiii\",  --  0\n\t\t\t\t\"jkjjjkj\",  --  1\n\t\t\t\t\".l...n.\",  --  2\n\t\t\t\t\".l.h.n.\",  --  3\n\t\t\t\t\".l...n.\",  --  4\n\t\t\t\t\"okoooko\",  --  5\n\t\t\t\t\"ppppppp\",  --  6\n\n\t\t\t\t-- Level 13\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"iiiiiii\",  --  1\n\t\t\t\t\"jkjjjkj\",  --  2\n\t\t\t\t\".k.h.k.\",  --  3\n\t\t\t\t\"okoooko\",  --  4\n\t\t\t\t\"ppppppp\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 14\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"iiiiiii\",  --  2\n\t\t\t\t\"kkkkkkk\",  --  3\n\t\t\t\t\"ppppppp\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- RoofedWell\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineEntrance\",\n\t\t\t\tName         = \"Plains 138\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"138\",\n\t\t\t\tID           = \"446\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 38,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 37,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 32,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 32,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 32,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 32,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-32\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 77: 2\",  -- stonebutton\n\t\t\t\t\"c: 66: 6\",  -- tracks\n\t\t\t\t\"d: 27: 1\",  -- poweredrail\n\t\t\t\t\"e: 66: 5\",  -- tracks\n\t\t\t\t\"f: 66: 9\",  -- tracks\n\t\t\t\t\"g: 66: 2\",  -- tracks\n\t\t\t\t\"h: 50: 4\",  -- torch\n\t\t\t\t\"i: 66: 4\",  -- tracks\n\t\t\t\t\"j: 66: 8\",  -- tracks\n\t\t\t\t\"k: 66: 3\",  -- tracks\n\t\t\t\t\"l: 66: 7\",  -- tracks\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 2\",  -- torch\n\t\t\t\t\"o:  4: 0\",  -- cobblestone\n\t\t\t\t\"p:  2: 0\",  -- grass\n\t\t\t\t\"q: 13: 0\",  -- gravel\n\t\t\t\t\"r: 53: 2\",  -- woodstairs\n\t\t\t\t\"s: 77: 1\",  -- stonebutton\n\t\t\t\t\"t: 27: 0\",  -- poweredrail\n\t\t\t\t\"u: 53: 7\",  -- woodstairs\n\t\t\t\t\"v: 53: 6\",  -- woodstairs\n\t\t\t\t\"w: 53: 3\",  -- woodstairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"maaaaam\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mm.abam\",  --  1\n\t\t\t\t\"mmcddam\",  --  2\n\t\t\t\t\"mae..am\",  --  3\n\t\t\t\t\"mmaa.mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mm...mm\",  --  0\n\t\t\t\t\"mm.a.mm\",  --  1\n\t\t\t\t\"mm...mm\",  --  2\n\t\t\t\t\"ma..aam\",  --  3\n\t\t\t\t\"mmfgamm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mm.h.mm\",  --  0\n\t\t\t\t\"mm.a.mm\",  --  1\n\t\t\t\t\"mm.aamm\",  --  2\n\t\t\t\t\"ma..iam\",  --  3\n\t\t\t\t\"mm..jmm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmaklmm\",  --  2\n\t\t\t\t\"maa..am\",  --  3\n\t\t\t\t\"mm...mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmc..mm\",  --  2\n\t\t\t\t\"mae.nam\",  --  3\n\t\t\t\t\"mmaa.mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm...mm\",  --  2\n\t\t\t\t\"ma..aam\",  --  3\n\t\t\t\t\"mmfgamm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm.aamm\",  --  2\n\t\t\t\t\"ma..iam\",  --  3\n\t\t\t\t\"mm..jmm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmaklmm\",  --  2\n\t\t\t\t\"maa..am\",  --  3\n\t\t\t\t\"mm...mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmc..mm\",  --  2\n\t\t\t\t\"mae.nam\",  --  3\n\t\t\t\t\"mmaa.mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm...mm\",  --  2\n\t\t\t\t\"ma..aam\",  --  3\n\t\t\t\t\"mmfgamm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm.aamm\",  --  2\n\t\t\t\t\"ma..iam\",  --  3\n\t\t\t\t\"mm..jmm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmaklmm\",  --  2\n\t\t\t\t\"maa..am\",  --  3\n\t\t\t\t\"mm...mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 13\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmc..mm\",  --  2\n\t\t\t\t\"mae.nam\",  --  3\n\t\t\t\t\"mmaa.mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 14\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm...mm\",  --  2\n\t\t\t\t\"ma..aam\",  --  3\n\t\t\t\t\"mmfgamm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm.aamm\",  --  2\n\t\t\t\t\"ma..iam\",  --  3\n\t\t\t\t\"mm..jmm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 16\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmaklmm\",  --  2\n\t\t\t\t\"maa..am\",  --  3\n\t\t\t\t\"mm...mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 17\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmc..mm\",  --  2\n\t\t\t\t\"mae.nam\",  --  3\n\t\t\t\t\"mmaa.mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 18\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm...mm\",  --  2\n\t\t\t\t\"ma..aam\",  --  3\n\t\t\t\t\"mmfgamm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 19\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm.aamm\",  --  2\n\t\t\t\t\"ma..iam\",  --  3\n\t\t\t\t\"mm..jmm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 20\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmaklmm\",  --  2\n\t\t\t\t\"maa..am\",  --  3\n\t\t\t\t\"mm...mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 21\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmc..mm\",  --  2\n\t\t\t\t\"mae.nam\",  --  3\n\t\t\t\t\"mmaa.mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 22\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm...mm\",  --  2\n\t\t\t\t\"ma..aam\",  --  3\n\t\t\t\t\"mmfgamm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 23\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm.aamm\",  --  2\n\t\t\t\t\"ma..iam\",  --  3\n\t\t\t\t\"mm..jmm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 24\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmaklmm\",  --  2\n\t\t\t\t\"maa..am\",  --  3\n\t\t\t\t\"mm...mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 25\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmc..mm\",  --  2\n\t\t\t\t\"mae.nam\",  --  3\n\t\t\t\t\"mmaa.mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 26\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm...mm\",  --  2\n\t\t\t\t\"ma..aam\",  --  3\n\t\t\t\t\"mmfgamm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 27\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mm.aamm\",  --  2\n\t\t\t\t\"ma..iam\",  --  3\n\t\t\t\t\"mm..jmm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 28\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmaklmm\",  --  2\n\t\t\t\t\"maa..am\",  --  3\n\t\t\t\t\"mm...mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 29\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"mmc..mm\",  --  2\n\t\t\t\t\"mae.nam\",  --  3\n\t\t\t\t\"mmaa.mm\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 30\n\t\t\t\t\"mmooomm\",  --  0\n\t\t\t\t\"mmmammm\",  --  1\n\t\t\t\t\"om...mo\",  --  2\n\t\t\t\t\"oa..aao\",  --  3\n\t\t\t\t\"omfgamo\",  --  4\n\t\t\t\t\"mmmammm\",  --  5\n\t\t\t\t\"mmooomm\",  --  6\n\n\t\t\t\t-- Level 31\n\t\t\t\t\"ppqqqpp\",  --  0\n\t\t\t\t\"paaaaap\",  --  1\n\t\t\t\t\"qa.aaaq\",  --  2\n\t\t\t\t\"qa..iaq\",  --  3\n\t\t\t\t\"qa..jaq\",  --  4\n\t\t\t\t\"paaaaap\",  --  5\n\t\t\t\t\"ppqqqpp\",  --  6\n\n\t\t\t\t-- Level 32\n\t\t\t\t\"...r...\",  --  0\n\t\t\t\t\".astba.\",  --  1\n\t\t\t\t\"...fl..\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".a...a.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 33\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".a...a.\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".a...a.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 34\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".a...a.\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".a...a.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 35\n\t\t\t\t\"rrrrrrr\",  --  0\n\t\t\t\t\"uaaaaau\",  --  1\n\t\t\t\t\".a...a.\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\"vaaaaav\",  --  5\n\t\t\t\t\"wwwwwww\",  --  6\n\n\t\t\t\t-- Level 36\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"rrrrrrr\",  --  1\n\t\t\t\t\"uaaaaau\",  --  2\n\t\t\t\t\".aaaaa.\",  --  3\n\t\t\t\t\"vaaaaav\",  --  4\n\t\t\t\t\"wwwwwww\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 37\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"rrrrrrr\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"wwwwwww\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- MineEntrance\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftCorridor\",\n\t\t\t\tName         = \"Plains 139\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"139\",\n\t\t\t\tID           = \"447\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 4,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 2,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"200\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 85: 0\",  -- fence\n\t\t\t\t\"c: 66: 1\",  -- tracks\n\t\t\t\t\"d: 50: 2\",  -- torch\n\t\t\t\t\"e: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaa\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..b....b..\",  --  0\n\t\t\t\t\"cccccccccc\",  --  1\n\t\t\t\t\"..b....b..\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..b....b..\",  --  0\n\t\t\t\t\"..........\",  --  1\n\t\t\t\t\"..b....b..\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..a....a..\",  --  0\n\t\t\t\t\".dae..dae.\",  --  1\n\t\t\t\t\"..a....a..\",  --  2\n\n\t\t\t},\n\t\t},  -- MineshaftCorridor\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Scarecrow\",\n\t\t\t\tName         = \"Plains 150\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"150\",\n\t\t\t\tID           = \"494\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 1,\n\t\t\t\ty = 6,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 0,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 2,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = -1,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:139: 0\",  -- cobblestonewall\n\t\t\t\t\"b: 85: 0\",  -- fence\n\t\t\t\t\"c:126: 4\",  -- woodenslab\n\t\t\t\t\"d: 86: 1\",  -- pumpkin\n\t\t\t\t\"e:139: 1\",  -- cobblestonewall\n\t\t\t\t\"f:163: 4\",  -- acaciawoodstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\".\",  --  0\n\t\t\t\t\"a\",  --  1\n\t\t\t\t\".\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".\",  --  0\n\t\t\t\t\"b\",  --  1\n\t\t\t\t\".\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"c\",  --  0\n\t\t\t\t\"d\",  --  1\n\t\t\t\t\"c\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".\",  --  0\n\t\t\t\t\"e\",  --  1\n\t\t\t\t\".\",  --  2\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"f\",  --  0\n\t\t\t\t\"d\",  --  1\n\t\t\t\t\"f\",  --  2\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".\",  --  0\n\t\t\t\t\"f\",  --  1\n\t\t\t\t\".\",  --  2\n\n\t\t\t},\n\t\t},  -- Scarecrow\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftCrossing\",\n\t\t\t\tName         = \"Plains 171\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"171\",\n\t\t\t\tID           = \"578\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 4,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"1\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 66: 0\",  -- tracks\n\t\t\t\t\"c: 66: 1\",  -- tracks\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"m.b.m\",  --  0\n\t\t\t\t\".aba.\",  --  1\n\t\t\t\t\"ccccc\",  --  2\n\t\t\t\t\".aba.\",  --  3\n\t\t\t\t\"m.b.m\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"m...m\",  --  0\n\t\t\t\t\".a.a.\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".a.a.\",  --  3\n\t\t\t\t\"m...m\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"m...m\",  --  0\n\t\t\t\t\".a.a.\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".a.a.\",  --  3\n\t\t\t\t\"m...m\",  --  4\n\n\t\t\t},\n\t\t},  -- MineshaftCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftDoubleCrossing\",\n\t\t\t\tName         = \"Plains 172\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"172\",\n\t\t\t\tID           = \"579\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 8,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"1\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 66: 0\",  -- tracks\n\t\t\t\t\"c: 66: 1\",  -- tracks\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"m.b.m\",  --  0\n\t\t\t\t\".aba.\",  --  1\n\t\t\t\t\"ccccc\",  --  2\n\t\t\t\t\".aba.\",  --  3\n\t\t\t\t\"m.b.m\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"m...m\",  --  0\n\t\t\t\t\".a.a.\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".a.a.\",  --  3\n\t\t\t\t\"m...m\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"m...m\",  --  0\n\t\t\t\t\".a.a.\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".a.a.\",  --  3\n\t\t\t\t\"m...m\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aa.aa\",  --  1\n\t\t\t\t\"a...a\",  --  2\n\t\t\t\t\"aa.aa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"m...m\",  --  0\n\t\t\t\t\".a.a.\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".a.a.\",  --  3\n\t\t\t\t\"m...m\",  --  4\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"m...m\",  --  0\n\t\t\t\t\".a.a.\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".a.a.\",  --  3\n\t\t\t\t\"m...m\",  --  4\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"m...m\",  --  0\n\t\t\t\t\".a.a.\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\".a.a.\",  --  3\n\t\t\t\t\"m...m\",  --  4\n\n\t\t\t},\n\t\t},  -- MineshaftDoubleCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftCrossing\",\n\t\t\t\tName         = \"Plains 193\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"193\",\n\t\t\t\tID           = \"657\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 4,\n\t\t\t\tz = 11,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 10,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"10\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 66: 0\",  -- tracks\n\t\t\t\t\"c: 85: 0\",  -- fence\n\t\t\t\t\"d: 66: 1\",  -- tracks\n\t\t\t\t\"e: 50: 4\",  -- torch\n\t\t\t\t\"f: 50: 3\",  -- torch\n\t\t\t\t\"g: 50: 2\",  -- torch\n\t\t\t\t\"h: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"mmmmaaammmm\",  --  1\n\t\t\t\t\"mmmmaaammmm\",  --  2\n\t\t\t\t\"mmmmaaammmm\",  --  3\n\t\t\t\t\"aaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaa\",  --  6\n\t\t\t\t\"mmmmaaammmm\",  --  7\n\t\t\t\t\"mmmmaaammmm\",  --  8\n\t\t\t\t\"mmmmaaammmm\",  --  9\n\t\t\t\t\"mmmmaaammmm\",  -- 10\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmm.b.mmmm\",  --  0\n\t\t\t\t\"mmmm.b.mmmm\",  --  1\n\t\t\t\t\"mmmmcbcmmmm\",  --  2\n\t\t\t\t\"mmmm.b.mmmm\",  --  3\n\t\t\t\t\"..c..b..c..\",  --  4\n\t\t\t\t\"ddddddddddd\",  --  5\n\t\t\t\t\"..c..b..c..\",  --  6\n\t\t\t\t\"mmmm.b.mmmm\",  --  7\n\t\t\t\t\"mmmmcbcmmmm\",  --  8\n\t\t\t\t\"mmmm.b.mmmm\",  --  9\n\t\t\t\t\"mmmm.b.mmmm\",  -- 10\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmm...mmmm\",  --  0\n\t\t\t\t\"mmmm...mmmm\",  --  1\n\t\t\t\t\"mmmmc.cmmmm\",  --  2\n\t\t\t\t\"mmmm...mmmm\",  --  3\n\t\t\t\t\"..c.....c..\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"..c.....c..\",  --  6\n\t\t\t\t\"mmmm...mmmm\",  --  7\n\t\t\t\t\"mmmmc.cmmmm\",  --  8\n\t\t\t\t\"mmmm...mmmm\",  --  9\n\t\t\t\t\"mmmm...mmmm\",  -- 10\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmm...mmmm\",  --  0\n\t\t\t\t\"mmmm.e.mmmm\",  --  1\n\t\t\t\t\"mmmmaaammmm\",  --  2\n\t\t\t\t\"mmmm.f.mmmm\",  --  3\n\t\t\t\t\"..a.....a..\",  --  4\n\t\t\t\t\".gah...gah.\",  --  5\n\t\t\t\t\"..a.....a..\",  --  6\n\t\t\t\t\"mmmm.e.mmmm\",  --  7\n\t\t\t\t\"mmmmaaammmm\",  --  8\n\t\t\t\t\"mmmm.f.mmmm\",  --  9\n\t\t\t\t\"mmmm...mmmm\",  -- 10\n\n\t\t\t},\n\t\t},  -- MineshaftCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftTee\",\n\t\t\t\tName         = \"Plains 194\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"194\",\n\t\t\t\tID           = \"658\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 4,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 66: 0\",  -- tracks\n\t\t\t\t\"c: 85: 0\",  -- fence\n\t\t\t\t\"d: 66: 1\",  -- tracks\n\t\t\t\t\"e: 50: 4\",  -- torch\n\t\t\t\t\"f: 50: 3\",  -- torch\n\t\t\t\t\"g: 50: 2\",  -- torch\n\t\t\t\t\"h: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"mmmmaaammmm\",  --  1\n\t\t\t\t\"mmmmaaammmm\",  --  2\n\t\t\t\t\"mmmmaaammmm\",  --  3\n\t\t\t\t\"aaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmm.b.mmmm\",  --  0\n\t\t\t\t\"mmmm.b.mmmm\",  --  1\n\t\t\t\t\"mmmmcbcmmmm\",  --  2\n\t\t\t\t\"mmmm.b.mmmm\",  --  3\n\t\t\t\t\"..c..b..c..\",  --  4\n\t\t\t\t\"ddddddddddd\",  --  5\n\t\t\t\t\"..c.....c..\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmm...mmmm\",  --  0\n\t\t\t\t\"mmmm...mmmm\",  --  1\n\t\t\t\t\"mmmmc.cmmmm\",  --  2\n\t\t\t\t\"mmmm...mmmm\",  --  3\n\t\t\t\t\"..c.....c..\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"..c.....c..\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmm...mmmm\",  --  0\n\t\t\t\t\"mmmm.e.mmmm\",  --  1\n\t\t\t\t\"mmmmaaammmm\",  --  2\n\t\t\t\t\"mmmm.f.mmmm\",  --  3\n\t\t\t\t\"..a.....a..\",  --  4\n\t\t\t\t\".gah...gah.\",  --  5\n\t\t\t\t\"..a.....a..\",  --  6\n\n\t\t\t},\n\t\t},  -- MineshaftTee\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftStairs\",\n\t\t\t\tName         = \"Plains 195\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"195\",\n\t\t\t\tID           = \"659\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 8,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 2,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 66: 1\",  -- tracks\n\t\t\t\t\"c: 66: 2\",  -- tracks\n\t\t\t\t\"d: 85: 0\",  -- fence\n\t\t\t\t\"e: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaammmm\",  --  0\n\t\t\t\t\"aaammmm\",  --  1\n\t\t\t\t\"aaammmm\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..aammm\",  --  0\n\t\t\t\t\"bcaammm\",  --  1\n\t\t\t\t\"..aammm\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...aamm\",  --  0\n\t\t\t\t\"..caamm\",  --  1\n\t\t\t\t\"...aamm\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...daam\",  --  0\n\t\t\t\t\"...caam\",  --  1\n\t\t\t\t\"...daam\",  --  2\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"m..d.aa\",  --  0\n\t\t\t\t\"m...caa\",  --  1\n\t\t\t\t\"m..d.aa\",  --  2\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mm.d...\",  --  0\n\t\t\t\t\"mm...bb\",  --  1\n\t\t\t\t\"mm.d...\",  --  2\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmd...\",  --  0\n\t\t\t\t\"mmm....\",  --  1\n\t\t\t\t\"mmmd...\",  --  2\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmma...\",  --  0\n\t\t\t\t\"mmmae..\",  --  1\n\t\t\t\t\"mmma...\",  --  2\n\n\t\t\t},\n\t\t},  -- MineshaftStairs\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftSpiral\",\n\t\t\t\tName         = \"Plains 198\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"198\",\n\t\t\t\tID           = \"662\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 12,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 11,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 1,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 1,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 85: 0\",  -- fence\n\t\t\t\t\"c: 66: 4\",  -- tracks\n\t\t\t\t\"d: 66: 0\",  -- tracks\n\t\t\t\t\"e: 66: 6\",  -- tracks\n\t\t\t\t\"f: 66: 2\",  -- tracks\n\t\t\t\t\"g: 50: 1\",  -- torch\n\t\t\t\t\"h: 50: 3\",  -- torch\n\t\t\t\t\"i: 66: 1\",  -- tracks\n\t\t\t\t\"j: 66: 7\",  -- tracks\n\t\t\t\t\"k: 66: 5\",  -- tracks\n\t\t\t\t\"l: 50: 2\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 66: 3\",  -- tracks\n\t\t\t\t\"o: 66: 8\",  -- tracks\n\t\t\t\t\"p: 50: 4\",  -- torch\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmm\",  --  2\n\t\t\t\t\"aaabmmm\",  --  3\n\t\t\t\t\"aaammmm\",  --  4\n\t\t\t\t\"aaammmm\",  --  5\n\t\t\t\t\"aaammmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmm\",  --  1\n\t\t\t\t\"aaammmm\",  --  2\n\t\t\t\t\"aaabmmm\",  --  3\n\t\t\t\t\".c.mmmm\",  --  4\n\t\t\t\t\".d.mmmm\",  --  5\n\t\t\t\t\".d.mmmm\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaammm\",  --  0\n\t\t\t\t\"aaaammm\",  --  1\n\t\t\t\t\"aaaammm\",  --  2\n\t\t\t\t\".c.bmmm\",  --  3\n\t\t\t\t\"...mmmm\",  --  4\n\t\t\t\t\"...mmmm\",  --  5\n\t\t\t\t\"...mmmm\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"b..aamm\",  --  0\n\t\t\t\t\".efaamm\",  --  1\n\t\t\t\t\".d.aamm\",  --  2\n\t\t\t\t\"...bmmm\",  --  3\n\t\t\t\t\"...mmmm\",  --  4\n\t\t\t\t\"...mmmm\",  --  5\n\t\t\t\t\"...mmmm\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"b...aaa\",  --  0\n\t\t\t\t\"...faaa\",  --  1\n\t\t\t\t\"....aaa\",  --  2\n\t\t\t\t\"...baaa\",  --  3\n\t\t\t\t\"...mmmm\",  --  4\n\t\t\t\t\"mmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ag....b\",  --  0\n\t\t\t\t\"h...ij.\",  --  1\n\t\t\t\t\".....k.\",  --  2\n\t\t\t\t\"...baaa\",  --  3\n\t\t\t\t\"mmmmaaa\",  --  4\n\t\t\t\t\"mmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mm....b\",  --  0\n\t\t\t\t\"mm.....\",  --  1\n\t\t\t\t\"mm.....\",  --  2\n\t\t\t\t\"mmmb.k.\",  --  3\n\t\t\t\t\"mmmaaaa\",  --  4\n\t\t\t\t\"mmmaaaa\",  --  5\n\t\t\t\t\"mmmaaaa\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmm..la\",  --  0\n\t\t\t\t\"mmm...h\",  --  1\n\t\t\t\t\"mmm....\",  --  2\n\t\t\t\t\"mmmb...\",  --  3\n\t\t\t\t\"mmaa.d.\",  --  4\n\t\t\t\t\"mmaano.\",  --  5\n\t\t\t\t\"mmaa..b\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmm\",  --  1\n\t\t\t\t\"mmmm...\",  --  2\n\t\t\t\t\"mmmb...\",  --  3\n\t\t\t\t\"aaa....\",  --  4\n\t\t\t\t\"aaan...\",  --  5\n\t\t\t\t\"aaa...b\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmm\",  --  2\n\t\t\t\t\"mmmb...\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"iii...p\",  --  5\n\t\t\t\t\".....la\",  --  6\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmm\",  --  2\n\t\t\t\t\"mmmbmmm\",  --  3\n\t\t\t\t\".....mm\",  --  4\n\t\t\t\t\".....mm\",  --  5\n\t\t\t\t\".....mm\",  --  6\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmm\",  --  2\n\t\t\t\t\"mmmbmmm\",  --  3\n\t\t\t\t\"....mmm\",  --  4\n\t\t\t\t\"....mmm\",  --  5\n\t\t\t\t\"....mmm\",  --  6\n\n\t\t\t},\n\t\t},  -- MineshaftSpiral\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftStairsCrossing\",\n\t\t\t\tName         = \"Plains 199\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"199\",\n\t\t\t\tID           = \"663\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 12,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 11,\n\t\t\t\tMaxZ = 11,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 5,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 9,\n\t\t\t\t\tRelZ = 11,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"30\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 66: 0\",  -- tracks\n\t\t\t\t\"c: 66: 5\",  -- tracks\n\t\t\t\t\"d: 85: 0\",  -- fence\n\t\t\t\t\"e: 66: 1\",  -- tracks\n\t\t\t\t\"f: 50: 3\",  -- torch\n\t\t\t\t\"g: 50: 2\",  -- torch\n\t\t\t\t\"h: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"mmmmaaammmm\",  --  1\n\t\t\t\t\"mmmmaaammmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"mmmm.b.mmmm\",  --  0\n\t\t\t\t\"mmmm.c.mmmm\",  --  1\n\t\t\t\t\"mmmmaaammmm\",  --  2\n\t\t\t\t\"mmmmaaammmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"mmmm...mmmm\",  --  0\n\t\t\t\t\"mmmm...mmmm\",  --  1\n\t\t\t\t\"mmmm.c.mmmm\",  --  2\n\t\t\t\t\"mmmmaaammmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"mmmm...mmmm\",  --  0\n\t\t\t\t\"mmmm...mmmm\",  --  1\n\t\t\t\t\"mmmm...mmmm\",  --  2\n\t\t\t\t\"mmmmdcdmmmm\",  --  3\n\t\t\t\t\"mmmmaaammmm\",  --  4\n\t\t\t\t\"mmmmaaammmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmm...mmmm\",  --  1\n\t\t\t\t\"mmmm...mmmm\",  --  2\n\t\t\t\t\"mmmmd.dmmmm\",  --  3\n\t\t\t\t\"mmmm.c.mmmm\",  --  4\n\t\t\t\t\"aaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaa\",  --  7\n\t\t\t\t\"mmmmaaammmm\",  --  8\n\t\t\t\t\"mmmmmmmmmmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmm...mmmm\",  --  2\n\t\t\t\t\"mmmmd.dmmmm\",  --  3\n\t\t\t\t\"mmmm...mmmm\",  --  4\n\t\t\t\t\"..d..b..d..\",  --  5\n\t\t\t\t\"eeeeeeeeeee\",  --  6\n\t\t\t\t\"..d..c..d..\",  --  7\n\t\t\t\t\"mmmmaaammmm\",  --  8\n\t\t\t\t\"mmmmaaammmm\",  --  9\n\t\t\t\t\"mmmmmmmmmmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmd.dmmmm\",  --  3\n\t\t\t\t\"mmmm...mmmm\",  --  4\n\t\t\t\t\"..d.....d..\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"..d.....d..\",  --  7\n\t\t\t\t\"mmmm.c.mmmm\",  --  8\n\t\t\t\t\"mmmmaaammmm\",  --  9\n\t\t\t\t\"mmmmaaammmm\",  -- 10\n\t\t\t\t\"mmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmaaammmm\",  --  3\n\t\t\t\t\"mmmm.f.mmmm\",  --  4\n\t\t\t\t\"..a.....a..\",  --  5\n\t\t\t\t\".gah...gah.\",  --  6\n\t\t\t\t\"..a.....a..\",  --  7\n\t\t\t\t\"mmmm...mmmm\",  --  8\n\t\t\t\t\"mmmmdcdmmmm\",  --  9\n\t\t\t\t\"mmmmaaammmm\",  -- 10\n\t\t\t\t\"mmmmaaammmm\",  -- 11\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmm...mmmm\",  --  7\n\t\t\t\t\"mmmm...mmmm\",  --  8\n\t\t\t\t\"mmmmd.dmmmm\",  --  9\n\t\t\t\t\"mmmm.c.mmmm\",  -- 10\n\t\t\t\t\"mmmmaaammmm\",  -- 11\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmm...mmmm\",  --  8\n\t\t\t\t\"mmmmd.dmmmm\",  --  9\n\t\t\t\t\"mmmm...mmmm\",  -- 10\n\t\t\t\t\"mmmm.b.mmmm\",  -- 11\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmd.dmmmm\",  --  9\n\t\t\t\t\"mmmm...mmmm\",  -- 10\n\t\t\t\t\"mmmm...mmmm\",  -- 11\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"mmmmmmmmmmm\",  --  0\n\t\t\t\t\"mmmmmmmmmmm\",  --  1\n\t\t\t\t\"mmmmmmmmmmm\",  --  2\n\t\t\t\t\"mmmmmmmmmmm\",  --  3\n\t\t\t\t\"mmmmmmmmmmm\",  --  4\n\t\t\t\t\"mmmmmmmmmmm\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\t\t\t\t\"mmmmmmmmmmm\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\t\t\t\t\"mmmmaaammmm\",  --  9\n\t\t\t\t\"mmmm.f.mmmm\",  -- 10\n\t\t\t\t\"mmmm...mmmm\",  -- 11\n\n\t\t\t},\n\t\t},  -- MineshaftStairsCrossing\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MineshaftsCorridor5\",\n\t\t\t\tName         = \"Plains 200\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"200\",\n\t\t\t\tID           = \"664\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 4,\n\t\t\t\tz = 3,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 2,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 10,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 3,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  5: 0\",  -- planks\n\t\t\t\t\"b: 85: 0\",  -- fence\n\t\t\t\t\"c: 66: 1\",  -- tracks\n\t\t\t\t\"d: 50: 2\",  -- torch\n\t\t\t\t\"e: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaa\",  --  2\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..b.....b..\",  --  0\n\t\t\t\t\"ccccccccccc\",  --  1\n\t\t\t\t\"..b.....b..\",  --  2\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..b.....b..\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"..b.....b..\",  --  2\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..a.....a..\",  --  0\n\t\t\t\t\".dae...dae.\",  --  1\n\t\t\t\t\"..a.....a..\",  --  2\n\n\t\t\t},\n\t\t},  -- MineshaftsCorridor5\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/Villages/SandFlatRoofVillage.cubeset",
    "content": "\n-- SandFlatRoofVillage.cubeset\n\n-- Defines the prefabs in the group SandFlatRoofVillage\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-30 13:46:02\",\n\t\t[\"AllowedBiomes\"] = \"Desert, DesertM\",\n\t\t[\"IntendedUse\"] = \"Village\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House5x4\",\n\t\t\t\tName         = \"Desert 25\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"25\",\n\t\t\t\tID           = \"166\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 6,\n\t\t\t\tz = 6,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:171: 0\",  -- carpet\n\t\t\t\t\"g:171:14\",  -- carpet\n\t\t\t\t\"h: 24: 2\",  -- sandstone\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 50: 3\",  -- torch\n\t\t\t\t\"k:128: 4\",  -- sandstonestairs\n\t\t\t\t\"l:128: 6\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 5\",  -- sandstonestairs\n\t\t\t\t\"o:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaamm\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"mmmmmmm\",  --  5\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd..\",  --  0\n\t\t\t\t\".aaaaa.\",  --  1\n\t\t\t\t\".aaaaa.\",  --  2\n\t\t\t\t\".aaaaa.\",  --  3\n\t\t\t\t\".aaaaa.\",  --  4\n\t\t\t\t\".......\",  --  5\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".aaeaa.\",  --  1\n\t\t\t\t\".afgfa.\",  --  2\n\t\t\t\t\".afgfa.\",  --  3\n\t\t\t\t\".aaaaa.\",  --  4\n\t\t\t\t\".......\",  --  5\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".hhihh.\",  --  1\n\t\t\t\t\".h...h.\",  --  2\n\t\t\t\t\".h...h.\",  --  3\n\t\t\t\t\".hh.hh.\",  --  4\n\t\t\t\t\".......\",  --  5\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".aaaaa.\",  --  1\n\t\t\t\t\".aj.ja.\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\".aaaaa.\",  --  4\n\t\t\t\t\".......\",  --  5\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"kllllln\",  --  0\n\t\t\t\t\"kaaaaan\",  --  1\n\t\t\t\t\"kaaaaan\",  --  2\n\t\t\t\t\"kaaaaan\",  --  3\n\t\t\t\t\"kaaaaan\",  --  4\n\t\t\t\t\"oooooon\",  --  5\n\n\t\t\t},\n\t\t},  -- House5x4\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House5x5\",\n\t\t\t\tName         = \"Desert 26\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"26\",\n\t\t\t\tID           = \"167\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:171: 0\",  -- carpet\n\t\t\t\t\"g:171:15\",  -- carpet\n\t\t\t\t\"h:171:14\",  -- carpet\n\t\t\t\t\"i: 24: 2\",  -- sandstone\n\t\t\t\t\"j: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"k: 50: 3\",  -- torch\n\t\t\t\t\"l:128: 4\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 6\",  -- sandstonestairs\n\t\t\t\t\"o:128: 5\",  -- sandstonestairs\n\t\t\t\t\"p:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaamm\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd..\",  --  0\n\t\t\t\t\".aaaaa.\",  --  1\n\t\t\t\t\".aaaaa.\",  --  2\n\t\t\t\t\".aaaaa.\",  --  3\n\t\t\t\t\".aaaaa.\",  --  4\n\t\t\t\t\".aaaaa.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".aaeaa.\",  --  1\n\t\t\t\t\".afffa.\",  --  2\n\t\t\t\t\".aghga.\",  --  3\n\t\t\t\t\".afffa.\",  --  4\n\t\t\t\t\".aaaaa.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".iijii.\",  --  1\n\t\t\t\t\".i...i.\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".i...i.\",  --  4\n\t\t\t\t\".ii.ii.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".aaaaa.\",  --  1\n\t\t\t\t\".ak.ka.\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\".aaaaa.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"lnnnnno\",  --  0\n\t\t\t\t\"laaaaao\",  --  1\n\t\t\t\t\"laaaaao\",  --  2\n\t\t\t\t\"laaaaao\",  --  3\n\t\t\t\t\"laaaaao\",  --  4\n\t\t\t\t\"laaaaao\",  --  5\n\t\t\t\t\"ppppppo\",  --  6\n\n\t\t\t},\n\t\t},  -- House5x5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House7x5\",\n\t\t\t\tName         = \"Desert 27\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"27\",\n\t\t\t\tID           = \"168\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:171:14\",  -- carpet\n\t\t\t\t\"g:171: 0\",  -- carpet\n\t\t\t\t\"h:171:15\",  -- carpet\n\t\t\t\t\"i: 24: 2\",  -- sandstone\n\t\t\t\t\"j: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"k: 50: 3\",  -- torch\n\t\t\t\t\"l:128: 4\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 6\",  -- sandstonestairs\n\t\t\t\t\"o:128: 5\",  -- sandstonestairs\n\t\t\t\t\"p:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd....\",  --  0\n\t\t\t\t\".aaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaa.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".aaeaaaa.\",  --  1\n\t\t\t\t\".afffffa.\",  --  2\n\t\t\t\t\".aghhhga.\",  --  3\n\t\t\t\t\".afffffa.\",  --  4\n\t\t\t\t\".aaaaaaa.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".iiji.ii.\",  --  1\n\t\t\t\t\".i.....i.\",  --  2\n\t\t\t\t\".........\",  --  3\n\t\t\t\t\".i.....i.\",  --  4\n\t\t\t\t\".iii.iii.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".aaaaaaa.\",  --  1\n\t\t\t\t\".ak.k..a.\",  --  2\n\t\t\t\t\".a.....a.\",  --  3\n\t\t\t\t\".a.....a.\",  --  4\n\t\t\t\t\".aaaaaaa.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"lnnnnnnnn\",  --  0\n\t\t\t\t\"laaaaaaao\",  --  1\n\t\t\t\t\"laaaaaaao\",  --  2\n\t\t\t\t\"laaaaaaao\",  --  3\n\t\t\t\t\"laaaaaaao\",  --  4\n\t\t\t\t\"laaaaaaao\",  --  5\n\t\t\t\t\"ppppppppo\",  --  6\n\n\t\t\t},\n\t\t},  -- House7x5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House8x5\",\n\t\t\t\tName         = \"Desert 28\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"28\",\n\t\t\t\tID           = \"169\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:171: 0\",  -- carpet\n\t\t\t\t\"g:171:14\",  -- carpet\n\t\t\t\t\"h:171:15\",  -- carpet\n\t\t\t\t\"i: 24: 2\",  -- sandstone\n\t\t\t\t\"j: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"k: 50: 3\",  -- torch\n\t\t\t\t\"l:128: 4\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 6\",  -- sandstonestairs\n\t\t\t\t\"o:128: 5\",  -- sandstonestairs\n\t\t\t\t\"p:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaammmmm\",  --  0\n\t\t\t\t\"maaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd.....\",  --  0\n\t\t\t\t\".aaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaa.\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\".aaeaaaaa.\",  --  1\n\t\t\t\t\".afghhgfa.\",  --  2\n\t\t\t\t\".afhffhfa.\",  --  3\n\t\t\t\t\".afghhgfa.\",  --  4\n\t\t\t\t\".aaaaaaaa.\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\".iijii.ii.\",  --  1\n\t\t\t\t\".i......i.\",  --  2\n\t\t\t\t\"..........\",  --  3\n\t\t\t\t\".i......i.\",  --  4\n\t\t\t\t\".ii.ii.ii.\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\".aaaaaaaa.\",  --  1\n\t\t\t\t\".ak.k...a.\",  --  2\n\t\t\t\t\".a......a.\",  --  3\n\t\t\t\t\".a......a.\",  --  4\n\t\t\t\t\".aaaaaaaa.\",  --  5\n\t\t\t\t\"..........\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"lnnnnnnnnn\",  --  0\n\t\t\t\t\"laaaaaaaao\",  --  1\n\t\t\t\t\"laaaaaaaao\",  --  2\n\t\t\t\t\"laaaaaaaao\",  --  3\n\t\t\t\t\"laaaaaaaao\",  --  4\n\t\t\t\t\"laaaaaaaao\",  --  5\n\t\t\t\t\"pppppppppo\",  --  6\n\n\t\t\t},\n\t\t},  -- House8x5\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House8x7\",\n\t\t\t\tName         = \"Desert 29\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"29\",\n\t\t\t\tID           = \"170\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 6,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:171: 0\",  -- carpet\n\t\t\t\t\"g:171:14\",  -- carpet\n\t\t\t\t\"h:171:15\",  -- carpet\n\t\t\t\t\"i: 24: 2\",  -- sandstone\n\t\t\t\t\"j: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"k: 50: 3\",  -- torch\n\t\t\t\t\"l: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 2\",  -- torch\n\t\t\t\t\"o:128: 4\",  -- sandstonestairs\n\t\t\t\t\"p:128: 6\",  -- sandstonestairs\n\t\t\t\t\"q:128: 5\",  -- sandstonestairs\n\t\t\t\t\"r:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaammmmm\",  --  0\n\t\t\t\t\"maaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd.....\",  --  0\n\t\t\t\t\".aaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaa.\",  --  7\n\t\t\t\t\"..........\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\".aaeaaaaa.\",  --  1\n\t\t\t\t\".afghhgfa.\",  --  2\n\t\t\t\t\".afhffhfa.\",  --  3\n\t\t\t\t\".afhgghfa.\",  --  4\n\t\t\t\t\".afhffhfa.\",  --  5\n\t\t\t\t\".afghhgfa.\",  --  6\n\t\t\t\t\".aaaaaaaa.\",  --  7\n\t\t\t\t\"..........\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\".iijii.ii.\",  --  1\n\t\t\t\t\".i......i.\",  --  2\n\t\t\t\t\".i......i.\",  --  3\n\t\t\t\t\"..........\",  --  4\n\t\t\t\t\".i......i.\",  --  5\n\t\t\t\t\".i......i.\",  --  6\n\t\t\t\t\".ii.ii.ii.\",  --  7\n\t\t\t\t\"..........\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"..........\",  --  0\n\t\t\t\t\".aaaaaaaa.\",  --  1\n\t\t\t\t\".a..k...a.\",  --  2\n\t\t\t\t\".a......a.\",  --  3\n\t\t\t\t\".al....na.\",  --  4\n\t\t\t\t\".a......a.\",  --  5\n\t\t\t\t\".a......a.\",  --  6\n\t\t\t\t\".aaaaaaaa.\",  --  7\n\t\t\t\t\"..........\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"oppppppppp\",  --  0\n\t\t\t\t\"oaaaaaaaaq\",  --  1\n\t\t\t\t\"oaaaaaaaaq\",  --  2\n\t\t\t\t\"oaaaaaaaaq\",  --  3\n\t\t\t\t\"oaaaaaaaaq\",  --  4\n\t\t\t\t\"oaaaaaaaaq\",  --  5\n\t\t\t\t\"oaaaaaaaaq\",  --  6\n\t\t\t\t\"oaaaaaaaaq\",  --  7\n\t\t\t\t\"rrrrrrrrrq\",  --  8\n\n\t\t\t},\n\t\t},  -- House8x7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House9x7\",\n\t\t\t\tName         = \"Desert 30\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"30\",\n\t\t\t\tID           = \"171\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 6,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:171: 0\",  -- carpet\n\t\t\t\t\"g:171:15\",  -- carpet\n\t\t\t\t\"h:171:14\",  -- carpet\n\t\t\t\t\"i: 24: 2\",  -- sandstone\n\t\t\t\t\"j: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"k: 50: 3\",  -- torch\n\t\t\t\t\"l: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 2\",  -- torch\n\t\t\t\t\"o: 50: 4\",  -- torch\n\t\t\t\t\"p:128: 4\",  -- sandstonestairs\n\t\t\t\t\"q:128: 6\",  -- sandstonestairs\n\t\t\t\t\"r:128: 5\",  -- sandstonestairs\n\t\t\t\t\"s:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaammmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd......\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaa.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".aaeaaaaaa.\",  --  1\n\t\t\t\t\".affgggffa.\",  --  2\n\t\t\t\t\".afghhhgfa.\",  --  3\n\t\t\t\t\".afghfhgfa.\",  --  4\n\t\t\t\t\".afghhhgfa.\",  --  5\n\t\t\t\t\".affgggffa.\",  --  6\n\t\t\t\t\".aaaaaaaaa.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".iijii.iii.\",  --  1\n\t\t\t\t\".i.......i.\",  --  2\n\t\t\t\t\".i.......i.\",  --  3\n\t\t\t\t\"...........\",  --  4\n\t\t\t\t\".i.......i.\",  --  5\n\t\t\t\t\".i.......i.\",  --  6\n\t\t\t\t\".ii.iii.ii.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".a..k....a.\",  --  2\n\t\t\t\t\".a.......a.\",  --  3\n\t\t\t\t\".al.....na.\",  --  4\n\t\t\t\t\".a.......a.\",  --  5\n\t\t\t\t\".a...o...a.\",  --  6\n\t\t\t\t\".aaaaaaaaa.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"pqqqqqqqqqq\",  --  0\n\t\t\t\t\"paaaaaaaaar\",  --  1\n\t\t\t\t\"paaaaaaaaar\",  --  2\n\t\t\t\t\"paaaaaaaaar\",  --  3\n\t\t\t\t\"paaaaaaaaar\",  --  4\n\t\t\t\t\"paaaaaaaaar\",  --  5\n\t\t\t\t\"paaaaaaaaar\",  --  6\n\t\t\t\t\"paaaaaaaaar\",  --  7\n\t\t\t\t\"ssssssssssr\",  --  8\n\n\t\t\t},\n\t\t},  -- House9x7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House11x7\",\n\t\t\t\tName         = \"Desert 31\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"31\",\n\t\t\t\tID           = \"172\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 6,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:171: 0\",  -- carpet\n\t\t\t\t\"g:171:15\",  -- carpet\n\t\t\t\t\"h:171:14\",  -- carpet\n\t\t\t\t\"i: 24: 2\",  -- sandstone\n\t\t\t\t\"j: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"k: 50: 3\",  -- torch\n\t\t\t\t\"l: 50: 1\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 2\",  -- torch\n\t\t\t\t\"o: 50: 4\",  -- torch\n\t\t\t\t\"p:128: 4\",  -- sandstonestairs\n\t\t\t\t\"q:128: 6\",  -- sandstonestairs\n\t\t\t\t\"r:128: 5\",  -- sandstonestairs\n\t\t\t\t\"s:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmaaammmmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"..bcd........\",  --  0\n\t\t\t\t\".aaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaaa.\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".aaeaaaaaaaa.\",  --  1\n\t\t\t\t\".affgggggffa.\",  --  2\n\t\t\t\t\".afghhhhhgfa.\",  --  3\n\t\t\t\t\".afghfffhgfa.\",  --  4\n\t\t\t\t\".afghhhhhgfa.\",  --  5\n\t\t\t\t\".affgggggffa.\",  --  6\n\t\t\t\t\".aaaaaaaaaaa.\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".iiji.iii.ii.\",  --  1\n\t\t\t\t\".i.........i.\",  --  2\n\t\t\t\t\".i.........i.\",  --  3\n\t\t\t\t\".............\",  --  4\n\t\t\t\t\".i.........i.\",  --  5\n\t\t\t\t\".i.........i.\",  --  6\n\t\t\t\t\".ii.ii.ii.ii.\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".aaaaaaaaaaa.\",  --  1\n\t\t\t\t\".a..k..k...a.\",  --  2\n\t\t\t\t\".a.........a.\",  --  3\n\t\t\t\t\".al.......na.\",  --  4\n\t\t\t\t\".a.........a.\",  --  5\n\t\t\t\t\".a....o....a.\",  --  6\n\t\t\t\t\".aaaaaaaaaaa.\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"pqqqqqqqqqqqq\",  --  0\n\t\t\t\t\"paaaaaaaaaaar\",  --  1\n\t\t\t\t\"paaaaaaaaaaar\",  --  2\n\t\t\t\t\"paaaaaaaaaaar\",  --  3\n\t\t\t\t\"paaaaaaaaaaar\",  --  4\n\t\t\t\t\"paaaaaaaaaaar\",  --  5\n\t\t\t\t\"paaaaaaaaaaar\",  --  6\n\t\t\t\t\"paaaaaaaaaaar\",  --  7\n\t\t\t\t\"ssssssssssssr\",  --  8\n\n\t\t\t},\n\t\t},  -- House11x7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Forge\",\n\t\t\t\tName         = \"Desert 32\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"32\",\n\t\t\t\tID           = \"173\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 12,\n\t\t\t\ty = 6,\n\t\t\t\tz = 10,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 12,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 10,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e:128: 3\",  -- sandstonestairs\n\t\t\t\t\"f:171:15\",  -- carpet\n\t\t\t\t\"g: 64: 2\",  -- woodendoorblock\n\t\t\t\t\"h:171: 0\",  -- carpet\n\t\t\t\t\"i:171:14\",  -- carpet\n\t\t\t\t\"j: 61: 2\",  -- furnace\n\t\t\t\t\"k: 10: 0\",  -- lava\n\t\t\t\t\"l: 54: 2\",  -- chest\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 24: 2\",  -- sandstone\n\t\t\t\t\"o: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"p: 50: 1\",  -- torch\n\t\t\t\t\"q:101: 0\",  -- ironbars\n\t\t\t\t\"r:128: 4\",  -- sandstonestairs\n\t\t\t\t\"s:128: 6\",  -- sandstonestairs\n\t\t\t\t\"t:128: 5\",  -- sandstonestairs\n\t\t\t\t\"u:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaammmmm\",  --  0\n\t\t\t\t\"aaaaaaaaaaam\",  --  1\n\t\t\t\t\"aaaaaaaaaaam\",  --  2\n\t\t\t\t\"aaaaaaaaaaam\",  --  3\n\t\t\t\t\"aaaaaaaaaaam\",  --  4\n\t\t\t\t\"aaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaam\",  --  7\n\t\t\t\t\"maaaaaaaaaam\",  --  8\n\t\t\t\t\"mmmmmmmmmmmm\",  --  9\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bcccccd.....\",  --  0\n\t\t\t\t\"baaaaaaaaaa.\",  --  1\n\t\t\t\t\"baaaaaaaaaa.\",  --  2\n\t\t\t\t\"baaaaaaaaaa.\",  --  3\n\t\t\t\t\"baaaaaaaaaa.\",  --  4\n\t\t\t\t\"eaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaa.\",  --  7\n\t\t\t\t\".aaaaaaaaaa.\",  --  8\n\t\t\t\t\"............\",  --  9\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".a....aaaaa.\",  --  1\n\t\t\t\t\"......afffa.\",  --  2\n\t\t\t\t\"......ghfha.\",  --  3\n\t\t\t\t\"......aiiia.\",  --  4\n\t\t\t\t\".a....ahfha.\",  --  5\n\t\t\t\t\".ajaajafffa.\",  --  6\n\t\t\t\t\".aakkaal..a.\",  --  7\n\t\t\t\t\".aaaaaaaaaa.\",  --  8\n\t\t\t\t\"............\",  --  9\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".n....nn.nn.\",  --  1\n\t\t\t\t\"......n...n.\",  --  2\n\t\t\t\t\"......o...n.\",  --  3\n\t\t\t\t\"......n.....\",  --  4\n\t\t\t\t\".n....n...n.\",  --  5\n\t\t\t\t\".n....n...n.\",  --  6\n\t\t\t\t\".n....n...n.\",  --  7\n\t\t\t\t\".nnn.nnn.nn.\",  --  8\n\t\t\t\t\"............\",  --  9\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"............\",  --  0\n\t\t\t\t\".a....aaaaa.\",  --  1\n\t\t\t\t\"......a...a.\",  --  2\n\t\t\t\t\"......a...a.\",  --  3\n\t\t\t\t\"......ap..a.\",  --  4\n\t\t\t\t\".a....a...a.\",  --  5\n\t\t\t\t\".aqqqqa...a.\",  --  6\n\t\t\t\t\".a....a...a.\",  --  7\n\t\t\t\t\".aaaaaaaaaa.\",  --  8\n\t\t\t\t\"............\",  --  9\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"rsssssssssss\",  --  0\n\t\t\t\t\"raaaaaaaaaat\",  --  1\n\t\t\t\t\"raaaaaaaaaat\",  --  2\n\t\t\t\t\"raaaaaaaaaat\",  --  3\n\t\t\t\t\"raaaaaaaaaat\",  --  4\n\t\t\t\t\"raaaaaaaaaat\",  --  5\n\t\t\t\t\"raaaaaaaaaat\",  --  6\n\t\t\t\t\"raaaaaaaaaat\",  --  7\n\t\t\t\t\"raaaaaaaaaat\",  --  8\n\t\t\t\t\"uuuuuuuuuuut\",  --  9\n\n\t\t\t},\n\t\t},  -- Forge\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"MarketStall\",\n\t\t\t\tName         = \"Desert 34\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"34\",\n\t\t\t\tID           = \"175\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 6,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"5\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 12: 0\",  -- sand\n\t\t\t\t\"b: 85: 0\",  -- fence\n\t\t\t\t\"c:171:14\",  -- carpet\n\t\t\t\t\"d:171:15\",  -- carpet\n\t\t\t\t\"e:171: 0\",  -- carpet\n\t\t\t\t\"f: 35:14\",  -- wool\n\t\t\t\t\"g: 35: 0\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"b.....b\",  --  0\n\t\t\t\t\"cddeddc\",  --  1\n\t\t\t\t\"cdeeedc\",  --  2\n\t\t\t\t\"cdeeedc\",  --  3\n\t\t\t\t\"cddeddc\",  --  4\n\t\t\t\t\"b.....b\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"b.....b\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"b.....b\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"b.....b\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"b.....b\",  --  5\n\t\t\t\t\"fgfgfgf\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"fgfgfgf\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\".......\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\"fgfgfgf\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"fgfgfgf\",  --  1\n\t\t\t\t\"fgfgfgf\",  --  2\n\t\t\t\t\"fgfgfgf\",  --  3\n\t\t\t\t\"fgfgfgf\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- MarketStall\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Marketplace\",\n\t\t\t\tName         = \"Desert 38\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"38\",\n\t\t\t\tID           = \"261\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 4,\n\t\t\t\tz = 16,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 16,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 0,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"20\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b: 12: 0\",  -- sand\n\t\t\t\t\"c: 24: 2\",  -- sandstone\n\t\t\t\t\"d: 12: 2\",  -- sand\n\t\t\t\t\"e: 85: 0\",  -- fence\n\t\t\t\t\"f:  5: 0\",  -- planks\n\t\t\t\t\"g:128: 2\",  -- sandstonestairs\n\t\t\t\t\"h:128: 0\",  -- sandstonestairs\n\t\t\t\t\"i:  8: 0\",  -- water\n\t\t\t\t\"j:128: 1\",  -- sandstonestairs\n\t\t\t\t\"k:128: 3\",  -- sandstonestairs\n\t\t\t\t\"l: 35: 0\",  -- wool\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 35:14\",  -- wool\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaabbbaaabbbb\",  --  0\n\t\t\t\t\"aaaabbaabbabbb\",  --  1\n\t\t\t\t\"aababbabcabbbb\",  --  2\n\t\t\t\t\"aaaaabaaaaabbb\",  --  3\n\t\t\t\t\"bbbbbbbbbbbbbb\",  --  4\n\t\t\t\t\"bbbbbbbbbbaabb\",  --  5\n\t\t\t\t\"bbbbccccbbabab\",  --  6\n\t\t\t\t\"ccbbccccbbaaab\",  --  7\n\t\t\t\t\"ccbbccccbbabbb\",  --  8\n\t\t\t\t\"dcbbccccbbabaa\",  --  9\n\t\t\t\t\"ccbbbbbbbbaaba\",  -- 10\n\t\t\t\t\"ccbbbbbbbbabaa\",  -- 11\n\t\t\t\t\"bbbbbbbbbbabaa\",  -- 12\n\t\t\t\t\"bbbaababbbaaba\",  -- 13\n\t\t\t\t\"bbbcaaaabbabbb\",  -- 14\n\t\t\t\t\"bbbcccabbbabbb\",  -- 15\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"e...e.e...e...\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"fffff.fffff...\",  --  3\n\t\t\t\t\"..............\",  --  4\n\t\t\t\t\"..........f..e\",  --  5\n\t\t\t\t\"....gggg..f...\",  --  6\n\t\t\t\t\".f..hiij..f...\",  --  7\n\t\t\t\t\".f..hiij..f...\",  --  8\n\t\t\t\t\".f..kkkk..f..e\",  --  9\n\t\t\t\t\".f............\",  -- 10\n\t\t\t\t\".f........f..e\",  -- 11\n\t\t\t\t\"...fffff..f...\",  -- 12\n\t\t\t\t\"..........f...\",  -- 13\n\t\t\t\t\"..........f...\",  -- 14\n\t\t\t\t\"...e...e..f..e\",  -- 15\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"lnlnl.lnlnl...\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"e...e.e...e...\",  --  3\n\t\t\t\t\"..............\",  --  4\n\t\t\t\t\"..........e..l\",  --  5\n\t\t\t\t\".............n\",  --  6\n\t\t\t\t\".e...........l\",  --  7\n\t\t\t\t\".............n\",  --  8\n\t\t\t\t\"..........e..l\",  --  9\n\t\t\t\t\"..............\",  -- 10\n\t\t\t\t\".e........e..l\",  -- 11\n\t\t\t\t\"...e...e.....n\",  -- 12\n\t\t\t\t\".............l\",  -- 13\n\t\t\t\t\".............n\",  -- 14\n\t\t\t\t\"...lnlnl..e..l\",  -- 15\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"lnlnl.lnlnl...\",  --  1\n\t\t\t\t\"lnlnl.lnlnl...\",  --  2\n\t\t\t\t\"lnlnl.lnlnl...\",  --  3\n\t\t\t\t\"..............\",  --  4\n\t\t\t\t\"..........lll.\",  --  5\n\t\t\t\t\"..........nnn.\",  --  6\n\t\t\t\t\"ll........lll.\",  --  7\n\t\t\t\t\"nn........nnn.\",  --  8\n\t\t\t\t\"ll........lll.\",  --  9\n\t\t\t\t\"nn............\",  -- 10\n\t\t\t\t\"ll........lll.\",  -- 11\n\t\t\t\t\"...lnlnl..nnn.\",  -- 12\n\t\t\t\t\"...lnlnl..lll.\",  -- 13\n\t\t\t\t\"...lnlnl..nnn.\",  -- 14\n\t\t\t\t\"..........lll.\",  -- 15\n\n\t\t\t},\n\t\t},  -- Marketplace\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Well\",\n\t\t\t\tName         = \"Desert 44\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"44\",\n\t\t\t\tID           = \"275\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 16,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 4,\n\t\t\t\tMaxY = 15,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 11,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 11,\n\t\t\t\t\tRelZ = 4,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 11,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 11,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-11\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c:  8: 0\",  -- water\n\t\t\t\t\"d:128: 2\",  -- sandstonestairs\n\t\t\t\t\"e:128: 0\",  -- sandstonestairs\n\t\t\t\t\"f:128: 1\",  -- sandstonestairs\n\t\t\t\t\"g:128: 3\",  -- sandstonestairs\n\t\t\t\t\"h:128: 6\",  -- sandstonestairs\n\t\t\t\t\"i:128: 4\",  -- sandstonestairs\n\t\t\t\t\"j:128: 5\",  -- sandstonestairs\n\t\t\t\t\"k:128: 7\",  -- sandstonestairs\n\t\t\t\t\"l: 44: 1\",  -- stone_slab\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"abbba\",  --  1\n\t\t\t\t\"abbba\",  --  2\n\t\t\t\t\"abbba\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcccb\",  --  1\n\t\t\t\t\"bcccb\",  --  2\n\t\t\t\t\"bcccb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcccb\",  --  1\n\t\t\t\t\"bcccb\",  --  2\n\t\t\t\t\"bcccb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcccb\",  --  1\n\t\t\t\t\"bcccb\",  --  2\n\t\t\t\t\"bcccb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcccb\",  --  1\n\t\t\t\t\"bcccb\",  --  2\n\t\t\t\t\"bcccb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcccb\",  --  1\n\t\t\t\t\"bcccb\",  --  2\n\t\t\t\t\"bcccb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcccb\",  --  1\n\t\t\t\t\"bcccb\",  --  2\n\t\t\t\t\"bcccb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcccb\",  --  1\n\t\t\t\t\"bcccb\",  --  2\n\t\t\t\t\"bcccb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcbcb\",  --  1\n\t\t\t\t\"bbcbb\",  --  2\n\t\t\t\t\"bcbcb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcbcb\",  --  1\n\t\t\t\t\"bbbbb\",  --  2\n\t\t\t\t\"bcbcb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"bbbbb\",  --  0\n\t\t\t\t\"bcbcb\",  --  1\n\t\t\t\t\"bbbbb\",  --  2\n\t\t\t\t\"bcbcb\",  --  3\n\t\t\t\t\"bbbbb\",  --  4\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"ddddd\",  --  0\n\t\t\t\t\"ecccf\",  --  1\n\t\t\t\t\"ecbcf\",  --  2\n\t\t\t\t\"ecccf\",  --  3\n\t\t\t\t\"ggggf\",  --  4\n\n\t\t\t\t-- Level 12\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"..b..\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\".....\",  --  4\n\n\t\t\t\t-- Level 13\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".....\",  --  1\n\t\t\t\t\"..b..\",  --  2\n\t\t\t\t\".....\",  --  3\n\t\t\t\t\".....\",  --  4\n\n\t\t\t\t-- Level 14\n\t\t\t\t\".....\",  --  0\n\t\t\t\t\".hhh.\",  --  1\n\t\t\t\t\".ibj.\",  --  2\n\t\t\t\t\".kkj.\",  --  3\n\t\t\t\t\".....\",  --  4\n\n\t\t\t\t-- Level 15\n\t\t\t\t\"lllll\",  --  0\n\t\t\t\t\"lllll\",  --  1\n\t\t\t\t\"lllll\",  --  2\n\t\t\t\t\"lllll\",  --  3\n\t\t\t\t\"lllll\",  --  4\n\n\t\t\t},\n\t\t},  -- Well\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseL13x12\",\n\t\t\t\tName         = \"Desert 53\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"53\",\n\t\t\t\tID           = \"345\",\n\t\t\t\tCreatorName  = \"jakibaki\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 6,\n\t\t\t\tz = 14,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 14,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 43: 1\",  -- doublestoneslab\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g:171: 0\",  -- carpet\n\t\t\t\t\"h:171:15\",  -- carpet\n\t\t\t\t\"i:171:14\",  -- carpet\n\t\t\t\t\"j: 58: 0\",  -- workbench\n\t\t\t\t\"k: 24: 2\",  -- sandstone\n\t\t\t\t\"l: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 3\",  -- torch\n\t\t\t\t\"o: 50: 1\",  -- torch\n\t\t\t\t\"p: 50: 2\",  -- torch\n\t\t\t\t\"q: 50: 4\",  -- torch\n\t\t\t\t\"r:128: 6\",  -- sandstonestairs\n\t\t\t\t\"s:128: 5\",  -- sandstonestairs\n\t\t\t\t\"t:128: 4\",  -- sandstonestairs\n\t\t\t\t\"u:128: 7\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmaaammmmmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmaaaaaaam\",  --  8\n\t\t\t\t\"mmmmmmmaaaaaaam\",  --  9\n\t\t\t\t\"mmmmmmmaaaaaaam\",  -- 10\n\t\t\t\t\"mmmmmmmaaaaaaam\",  -- 11\n\t\t\t\t\"mmmmmmmaaaaaaam\",  -- 12\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  -- 13\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...bcd.........\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaea.\",  --  5\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  7\n\t\t\t\t\".......aeaaaaa.\",  --  8\n\t\t\t\t\"mmmmmm.aaaaaaa.\",  --  9\n\t\t\t\t\"mmmmmm.aaaaaaa.\",  -- 10\n\t\t\t\t\"mmmmmm.aaaaaaa.\",  -- 11\n\t\t\t\t\"mmmmmm.aaaaaaa.\",  -- 12\n\t\t\t\t\"...............\",  -- 13\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".aaafaaaaaaaaa.\",  --  1\n\t\t\t\t\".agghhhhhhhhga.\",  --  2\n\t\t\t\t\".aghiiiiiiiiha.\",  --  3\n\t\t\t\t\".aghiggggggiha.\",  --  4\n\t\t\t\t\".aghiiiiiigiha.\",  --  5\n\t\t\t\t\".agghhhhhigiha.\",  --  6\n\t\t\t\t\".aaaaaaahigiha.\",  --  7\n\t\t\t\t\".......ahigiha.\",  --  8\n\t\t\t\t\"mmmmmm.ahiiiha.\",  --  9\n\t\t\t\t\"mmmmmm.aghhhga.\",  -- 10\n\t\t\t\t\"mmmmmm.aggggja.\",  -- 11\n\t\t\t\t\"mmmmmm.aaaaaaa.\",  -- 12\n\t\t\t\t\"...............\",  -- 13\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".kkklkkkk.kkkk.\",  --  1\n\t\t\t\t\".k...........k.\",  --  2\n\t\t\t\t\".k...........k.\",  --  3\n\t\t\t\t\"...............\",  --  4\n\t\t\t\t\".k...........k.\",  --  5\n\t\t\t\t\".k...........k.\",  --  6\n\t\t\t\t\".kkk.kkk.....k.\",  --  7\n\t\t\t\t\".......k.....k.\",  --  8\n\t\t\t\t\"mmmmmm.k.......\",  --  9\n\t\t\t\t\"mmmmmm.......k.\",  -- 10\n\t\t\t\t\"mmmmmm.k.....k.\",  -- 11\n\t\t\t\t\"mmmmmm.kkk.kkk.\",  -- 12\n\t\t\t\t\"...............\",  -- 13\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".a......n....a.\",  --  2\n\t\t\t\t\".a...........a.\",  --  3\n\t\t\t\t\".ao..........a.\",  --  4\n\t\t\t\t\".a...........a.\",  --  5\n\t\t\t\t\".a..........pa.\",  --  6\n\t\t\t\t\".aaaaaaa.....a.\",  --  7\n\t\t\t\t\".......a.....a.\",  --  8\n\t\t\t\t\"mmmmmm.a.....a.\",  --  9\n\t\t\t\t\"mmmmmm.a.....a.\",  -- 10\n\t\t\t\t\"mmmmmm.a..q..a.\",  -- 11\n\t\t\t\t\"mmmmmm.aaaaaaa.\",  -- 12\n\t\t\t\t\"...............\",  -- 13\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"rrrrrrrrrrrrrrs\",  --  0\n\t\t\t\t\"taaaaaaaaaaaaas\",  --  1\n\t\t\t\t\"taaaaaaaaaaaaas\",  --  2\n\t\t\t\t\"taaaaaaaaaaaaas\",  --  3\n\t\t\t\t\"taaaaaaaaaaaaas\",  --  4\n\t\t\t\t\"taaaaaaaaaaaaas\",  --  5\n\t\t\t\t\"taaaaaaaaaaaaas\",  --  6\n\t\t\t\t\"taaaaaaaaaaaaas\",  --  7\n\t\t\t\t\"tuuuuutaaaaaaas\",  --  8\n\t\t\t\t\"mmmmmmtaaaaaaas\",  --  9\n\t\t\t\t\"mmmmmmtaaaaaaas\",  -- 10\n\t\t\t\t\"mmmmmmtaaaaaaas\",  -- 11\n\t\t\t\t\"mmmmmmtaaaaaaas\",  -- 12\n\t\t\t\t\"......tuuuuuuuu\",  -- 13\n\n\t\t\t},\n\t\t},  -- HouseL13x12\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Prefabs/Villages/SandVillage.cubeset",
    "content": "\n-- SandVillage.cubeset\n\n-- Defines the prefabs in the group SandVillage\n\n-- NOTE: This file has been generated automatically by GalExport!\n-- Any manual changes will be overwritten by the next automatic export!\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tExportDate = \"2016-11-30 13:45:41\",\n\t\t[\"AllowedBiomes\"] = \"Desert, DesertM\",\n\t\t[\"IntendedUse\"] = \"Village\",\n\t},\n\n\tPieces =\n\t{\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"Well\",\n\t\t\t\tName         = \"Desert 0\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"0\",\n\t\t\t\tID           = \"1\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 4,\n\t\t\t\ty = 13,\n\t\t\t\tz = 4,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 3,\n\t\t\t\tMaxY = 12,\n\t\t\t\tMaxZ = 3,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 1,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-8\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c:  8: 0\",  -- water\n\t\t\t\t\"d: 85: 0\",  -- fence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaa\",  --  0\n\t\t\t\t\"aaaa\",  --  1\n\t\t\t\t\"aaaa\",  --  2\n\t\t\t\t\"aaaa\",  --  3\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 8\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"b..b\",  --  1\n\t\t\t\t\"b..b\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 9\n\t\t\t\t\"d..d\",  --  0\n\t\t\t\t\"....\",  --  1\n\t\t\t\t\"....\",  --  2\n\t\t\t\t\"d..d\",  --  3\n\n\t\t\t\t-- Level 10\n\t\t\t\t\"d..d\",  --  0\n\t\t\t\t\"....\",  --  1\n\t\t\t\t\"....\",  --  2\n\t\t\t\t\"d..d\",  --  3\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"d..d\",  --  0\n\t\t\t\t\"....\",  --  1\n\t\t\t\t\"....\",  --  2\n\t\t\t\t\"d..d\",  --  3\n\n\t\t\t\t-- Level 12\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bbbb\",  --  1\n\t\t\t\t\"bbbb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t},\n\t\t},  -- Well\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SmallHut\",\n\t\t\t\tName         = \"Desert 4\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"4\",\n\t\t\t\tID           = \"68\",\n\t\t\t\tCreatorName  = \"tonibm1999\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 5,\n\t\t\t\ty = 6,\n\t\t\t\tz = 6,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 5,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 5,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 5,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 3\",  -- sandstonestairs\n\t\t\t\t\"c: 24: 2\",  -- sandstone\n\t\t\t\t\"d: 50: 5\",  -- torch\n\t\t\t\t\"e: 26:10\",  -- bedblock\n\t\t\t\t\"f: 26: 2\",  -- bedblock\n\t\t\t\t\"g: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"h: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\t\t\t\t\"mmamm\",  --  5\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaa\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\"aaaaa\",  --  4\n\t\t\t\t\"..b..\",  --  5\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"accca\",  --  0\n\t\t\t\t\"cdedc\",  --  1\n\t\t\t\t\"c.f.c\",  --  2\n\t\t\t\t\"c...c\",  --  3\n\t\t\t\t\"acgca\",  --  4\n\t\t\t\t\".....\",  --  5\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"ac.ca\",  --  0\n\t\t\t\t\"c...c\",  --  1\n\t\t\t\t\".....\",  --  2\n\t\t\t\t\"c...c\",  --  3\n\t\t\t\t\"achca\",  --  4\n\t\t\t\t\".....\",  --  5\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"accca\",  --  0\n\t\t\t\t\"c...c\",  --  1\n\t\t\t\t\"c...c\",  --  2\n\t\t\t\t\"c...c\",  --  3\n\t\t\t\t\"accca\",  --  4\n\t\t\t\t\".....\",  --  5\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".aaa.\",  --  0\n\t\t\t\t\"aaaaa\",  --  1\n\t\t\t\t\"aaaaa\",  --  2\n\t\t\t\t\"aaaaa\",  --  3\n\t\t\t\t\".aaa.\",  --  4\n\t\t\t\t\".....\",  --  5\n\n\t\t\t},\n\t\t},  -- SmallHut\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"DoubleField\",\n\t\t\t\tName         = \"Desert 5\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"5\",\n\t\t\t\tID           = \"75\",\n\t\t\t\tCreatorName  = \"tonibm1999\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 3,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 8,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b: 60: 7\",  -- tilleddirt\n\t\t\t\t\"c: 60: 6\",  -- tilleddirt\n\t\t\t\t\"d:  8: 0\",  -- water\n\t\t\t\t\"e: 50: 5\",  -- torch\n\t\t\t\t\"f: 59: 7\",  -- wheatblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  6\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"abcdbbabbdbba\",  --  1\n\t\t\t\t\"abbdbbabbdbba\",  --  2\n\t\t\t\t\"abbdbbabbdbba\",  --  3\n\t\t\t\t\"abbdbbabbdbba\",  --  4\n\t\t\t\t\"abbdbbabbdbba\",  --  5\n\t\t\t\t\"acbdbbabbdbba\",  --  6\n\t\t\t\t\"abbdbbabbdbba\",  --  7\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"e.....e.....e\",  --  0\n\t\t\t\t\".ff.ff.ff.ff.\",  --  1\n\t\t\t\t\".ff.ff.ff.ff.\",  --  2\n\t\t\t\t\".ff.ff.ff.ff.\",  --  3\n\t\t\t\t\".ff.ff.ff.ff.\",  --  4\n\t\t\t\t\".ff.ff.ff.ff.\",  --  5\n\t\t\t\t\".ff.ff.ff.ff.\",  --  6\n\t\t\t\t\".ff.ff.ff.ff.\",  --  7\n\t\t\t\t\"e.....e.....e\",  --  8\n\n\t\t\t},\n\t\t},  -- DoubleField\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House11x7\",\n\t\t\t\tName         = \"Desert 6\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"6\",\n\t\t\t\tID           = \"81\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 1\",  -- torch\n\t\t\t\t\"o: 50: 2\",  -- torch\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcd....\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".aaaaeaaaa.\",  --  1\n\t\t\t\t\".a.......a.\",  --  2\n\t\t\t\t\".a.......a.\",  --  3\n\t\t\t\t\".a.......a.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".affagaffa.\",  --  1\n\t\t\t\t\".f.......f.\",  --  2\n\t\t\t\t\".f.......f.\",  --  3\n\t\t\t\t\".f.......f.\",  --  4\n\t\t\t\t\".affafaffa.\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ccccccccccc\",  --  0\n\t\t\t\t\"haaaaaaaaah\",  --  1\n\t\t\t\t\".a..i.i..a.\",  --  2\n\t\t\t\t\".a.......a.\",  --  3\n\t\t\t\t\".a..j.j..a.\",  --  4\n\t\t\t\t\"kaaaaaaaaak\",  --  5\n\t\t\t\t\"lllllllllll\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"ccccccccccc\",  --  1\n\t\t\t\t\"haaaaaaaaah\",  --  2\n\t\t\t\t\".an.....oa.\",  --  3\n\t\t\t\t\"kaaaaaaaaak\",  --  4\n\t\t\t\t\"lllllllllll\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"ccccccccccc\",  --  2\n\t\t\t\t\"aaaaaaaaaaa\",  --  3\n\t\t\t\t\"lllllllllll\",  --  4\n\t\t\t\t\"...........\",  --  5\n\t\t\t\t\"...........\",  --  6\n\n\t\t\t},\n\t\t},  -- House11x7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseL14x12\",\n\t\t\t\tName         = \"Desert 7\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"7\",\n\t\t\t\tID           = \"82\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 7,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 12,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 8,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e:128: 3\",  -- sandstonestairs\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"h:102: 0\",  -- glasspane\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j:128: 7\",  -- sandstonestairs\n\t\t\t\t\"k: 50: 3\",  -- torch\n\t\t\t\t\"l: 50: 4\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 6\",  -- sandstonestairs\n\t\t\t\t\"o:128: 5\",  -- sandstonestairs\n\t\t\t\t\"p:128: 4\",  -- sandstonestairs\n\t\t\t\t\"q: 50: 1\",  -- torch\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmaaamaaaaam\",  --  6\n\t\t\t\t\"mmmmmmmmaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmaaaaam\",  --  8\n\t\t\t\t\"mmmmmmmmaaaaam\",  --  9\n\t\t\t\t\"mmmmmmmmaaaaam\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".......bcd....\",  --  0\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  5\n\t\t\t\t\"....bed.aaaaa.\",  --  6\n\t\t\t\t\"........aaaaa.\",  --  7\n\t\t\t\t\"........aaaaa.\",  --  8\n\t\t\t\t\"........aaaaa.\",  --  9\n\t\t\t\t\"........aaaaa.\",  -- 10\n\t\t\t\t\"..............\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\".aaaaaaafaaaa.\",  --  1\n\t\t\t\t\".a..........a.\",  --  2\n\t\t\t\t\".a..........a.\",  --  3\n\t\t\t\t\".a..........a.\",  --  4\n\t\t\t\t\".aaaagaaa...a.\",  --  5\n\t\t\t\t\"........a...a.\",  --  6\n\t\t\t\t\"........a...a.\",  --  7\n\t\t\t\t\"........a...a.\",  --  8\n\t\t\t\t\"........a...a.\",  --  9\n\t\t\t\t\"........aaaaa.\",  -- 10\n\t\t\t\t\"..............\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\".ahhahhaiahha.\",  --  1\n\t\t\t\t\".h..........h.\",  --  2\n\t\t\t\t\".h..........h.\",  --  3\n\t\t\t\t\".h..........a.\",  --  4\n\t\t\t\t\".ahhaiahh...h.\",  --  5\n\t\t\t\t\"........h...h.\",  --  6\n\t\t\t\t\"........a...a.\",  --  7\n\t\t\t\t\"........h...h.\",  --  8\n\t\t\t\t\"........h...h.\",  --  9\n\t\t\t\t\"........ahhha.\",  -- 10\n\t\t\t\t\"..............\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"cccccccccccccc\",  --  0\n\t\t\t\t\"jaaaaaaaaaaaad\",  --  1\n\t\t\t\t\".a.....k.k..ad\",  --  2\n\t\t\t\t\".a..........ad\",  --  3\n\t\t\t\t\".a..l.l.....ad\",  --  4\n\t\t\t\t\"naaaaaaaa...ad\",  --  5\n\t\t\t\t\"eeeeeeeba...ad\",  --  6\n\t\t\t\t\".......ba...ad\",  --  7\n\t\t\t\t\".......ba...ad\",  --  8\n\t\t\t\t\".......ba...ad\",  --  9\n\t\t\t\t\".......baaaaad\",  -- 10\n\t\t\t\t\".......bo...pd\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"ccccccccccccc.\",  --  1\n\t\t\t\t\"jaaaaaaaaaaad.\",  --  2\n\t\t\t\t\".aq........ad.\",  --  3\n\t\t\t\t\"naaaaaaaaa.ad.\",  --  4\n\t\t\t\t\"eeeeeeeeba.ad.\",  --  5\n\t\t\t\t\"........ba.ad.\",  --  6\n\t\t\t\t\"........ba.ad.\",  --  7\n\t\t\t\t\"........ba.ad.\",  --  8\n\t\t\t\t\"........balad.\",  --  9\n\t\t\t\t\"........baaad.\",  -- 10\n\t\t\t\t\"........bo.pd.\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"cccccccccccc..\",  --  2\n\t\t\t\t\"aaaaaaaaaaad..\",  --  3\n\t\t\t\t\"eeeeeeeeebad..\",  --  4\n\t\t\t\t\".........bad..\",  --  5\n\t\t\t\t\".........bad..\",  --  6\n\t\t\t\t\".........bad..\",  --  7\n\t\t\t\t\".........bad..\",  --  8\n\t\t\t\t\".........bad..\",  --  9\n\t\t\t\t\".........bad..\",  -- 10\n\t\t\t\t\".........bad..\",  -- 11\n\n\t\t\t},\n\t\t},  -- HouseL14x12\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House7x7\",\n\t\t\t\tName         = \"Desert 8\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"8\",\n\t\t\t\tID           = \"112\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 7,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j:128: 6\",  -- sandstonestairs\n\t\t\t\t\"k:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmaaam\",  --  0\n\t\t\t\t\"maaaaam\",  --  1\n\t\t\t\t\"maaaaam\",  --  2\n\t\t\t\t\"maaaaam\",  --  3\n\t\t\t\t\"maaaaam\",  --  4\n\t\t\t\t\"maaaaam\",  --  5\n\t\t\t\t\"mmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...bcd.\",  --  0\n\t\t\t\t\".aaaaa.\",  --  1\n\t\t\t\t\".aaaaa.\",  --  2\n\t\t\t\t\".aaaaa.\",  --  3\n\t\t\t\t\".aaaaa.\",  --  4\n\t\t\t\t\".aaaaa.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".aaaea.\",  --  1\n\t\t\t\t\".a...a.\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\".aaaaa.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".afaga.\",  --  1\n\t\t\t\t\".f...f.\",  --  2\n\t\t\t\t\".f...f.\",  --  3\n\t\t\t\t\".f...f.\",  --  4\n\t\t\t\t\".afffa.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ccccccc\",  --  0\n\t\t\t\t\"haaaaah\",  --  1\n\t\t\t\t\".a.i.a.\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\".a...a.\",  --  4\n\t\t\t\t\"jaaaaaj\",  --  5\n\t\t\t\t\"kkkkkkk\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"ccccccc\",  --  1\n\t\t\t\t\"haaaaah\",  --  2\n\t\t\t\t\".a...a.\",  --  3\n\t\t\t\t\"jaaaaaj\",  --  4\n\t\t\t\t\"kkkkkkk\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"ccccccc\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"kkkkkkk\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- House7x7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House9x7\",\n\t\t\t\tName         = \"Desert 9\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"9\",\n\t\t\t\tID           = \"113\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmaaammm\",  --  0\n\t\t\t\t\"maaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...bcd...\",  --  0\n\t\t\t\t\".aaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaa.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".aaaeaaa.\",  --  1\n\t\t\t\t\".a.....a.\",  --  2\n\t\t\t\t\".a.....a.\",  --  3\n\t\t\t\t\".a.....a.\",  --  4\n\t\t\t\t\".aaaaaaa.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".afagafa.\",  --  1\n\t\t\t\t\".f.....f.\",  --  2\n\t\t\t\t\".f.....f.\",  --  3\n\t\t\t\t\".f.....f.\",  --  4\n\t\t\t\t\".affaffa.\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ccccccccc\",  --  0\n\t\t\t\t\"haaaaaaah\",  --  1\n\t\t\t\t\".a.i.i.a.\",  --  2\n\t\t\t\t\".a.....a.\",  --  3\n\t\t\t\t\".a..j..a.\",  --  4\n\t\t\t\t\"kaaaaaaak\",  --  5\n\t\t\t\t\"lllllllll\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\"ccccccccc\",  --  1\n\t\t\t\t\"haaaaaaah\",  --  2\n\t\t\t\t\".a.....a.\",  --  3\n\t\t\t\t\"kaaaaaaak\",  --  4\n\t\t\t\t\"lllllllll\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".........\",  --  1\n\t\t\t\t\"ccccccccc\",  --  2\n\t\t\t\t\"aaaaaaaaa\",  --  3\n\t\t\t\t\"lllllllll\",  --  4\n\t\t\t\t\".........\",  --  5\n\t\t\t\t\".........\",  --  6\n\n\t\t\t},\n\t\t},  -- House9x7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House9x9\",\n\t\t\t\tName         = \"Desert 10\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"10\",\n\t\t\t\tID           = \"114\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 9,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 9,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 4,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmaaammm\",  --  0\n\t\t\t\t\"maaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"...bcd...\",  --  0\n\t\t\t\t\".aaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaa.\",  --  7\n\t\t\t\t\".........\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".aaaeaaa.\",  --  1\n\t\t\t\t\".a.....a.\",  --  2\n\t\t\t\t\".a.....a.\",  --  3\n\t\t\t\t\".a.....a.\",  --  4\n\t\t\t\t\".a.....a.\",  --  5\n\t\t\t\t\".a.....a.\",  --  6\n\t\t\t\t\".aaaaaaa.\",  --  7\n\t\t\t\t\".........\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".afagafa.\",  --  1\n\t\t\t\t\".f.....f.\",  --  2\n\t\t\t\t\".f.....f.\",  --  3\n\t\t\t\t\".a.....a.\",  --  4\n\t\t\t\t\".f.....f.\",  --  5\n\t\t\t\t\".f.....f.\",  --  6\n\t\t\t\t\".affaffa.\",  --  7\n\t\t\t\t\".........\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ccccccccc\",  --  0\n\t\t\t\t\"haaaaaaah\",  --  1\n\t\t\t\t\".a.i.i.a.\",  --  2\n\t\t\t\t\".a.....a.\",  --  3\n\t\t\t\t\".a.....a.\",  --  4\n\t\t\t\t\".a.....a.\",  --  5\n\t\t\t\t\".a..j..a.\",  --  6\n\t\t\t\t\"kaaaaaaak\",  --  7\n\t\t\t\t\"lllllllll\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\"ccccccccc\",  --  1\n\t\t\t\t\"haaaaaaah\",  --  2\n\t\t\t\t\".a.....a.\",  --  3\n\t\t\t\t\".a.....a.\",  --  4\n\t\t\t\t\".a.....a.\",  --  5\n\t\t\t\t\"kaaaaaaak\",  --  6\n\t\t\t\t\"lllllllll\",  --  7\n\t\t\t\t\".........\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".........\",  --  1\n\t\t\t\t\"ccccccccc\",  --  2\n\t\t\t\t\"haaaaaaah\",  --  3\n\t\t\t\t\".a.....a.\",  --  4\n\t\t\t\t\"kaaaaaaak\",  --  5\n\t\t\t\t\"lllllllll\",  --  6\n\t\t\t\t\".........\",  --  7\n\t\t\t\t\".........\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".........\",  --  0\n\t\t\t\t\".........\",  --  1\n\t\t\t\t\".........\",  --  2\n\t\t\t\t\"ccccccccc\",  --  3\n\t\t\t\t\"aaaaaaaaa\",  --  4\n\t\t\t\t\"lllllllll\",  --  5\n\t\t\t\t\".........\",  --  6\n\t\t\t\t\".........\",  --  7\n\t\t\t\t\".........\",  --  8\n\n\t\t\t},\n\t\t},  -- House9x9\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House11x9\",\n\t\t\t\tName         = \"Desert 11\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"11\",\n\t\t\t\tID           = \"115\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 11,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 11,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmm\",  --  0\n\t\t\t\t\"maaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcd....\",  --  0\n\t\t\t\t\".aaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaa.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".aaaaeaaaa.\",  --  1\n\t\t\t\t\".a.......a.\",  --  2\n\t\t\t\t\".a.......a.\",  --  3\n\t\t\t\t\".a.......a.\",  --  4\n\t\t\t\t\".a.......a.\",  --  5\n\t\t\t\t\".a.......a.\",  --  6\n\t\t\t\t\".aaaaaaaaa.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\".affagaffa.\",  --  1\n\t\t\t\t\".f.......f.\",  --  2\n\t\t\t\t\".f.......f.\",  --  3\n\t\t\t\t\".a.......a.\",  --  4\n\t\t\t\t\".f.......f.\",  --  5\n\t\t\t\t\".f.......f.\",  --  6\n\t\t\t\t\".afffafffa.\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ccccccccccc\",  --  0\n\t\t\t\t\"haaaaaaaaah\",  --  1\n\t\t\t\t\".a..i.i..a.\",  --  2\n\t\t\t\t\".a.......a.\",  --  3\n\t\t\t\t\".a.......a.\",  --  4\n\t\t\t\t\".a.......a.\",  --  5\n\t\t\t\t\".a...j...a.\",  --  6\n\t\t\t\t\"kaaaaaaaaak\",  --  7\n\t\t\t\t\"lllllllllll\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"ccccccccccc\",  --  1\n\t\t\t\t\"haaaaaaaaah\",  --  2\n\t\t\t\t\".a.......a.\",  --  3\n\t\t\t\t\".a.......a.\",  --  4\n\t\t\t\t\".a.......a.\",  --  5\n\t\t\t\t\"kaaaaaaaaak\",  --  6\n\t\t\t\t\"lllllllllll\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"ccccccccccc\",  --  2\n\t\t\t\t\"haaaaaaaaah\",  --  3\n\t\t\t\t\".a.......a.\",  --  4\n\t\t\t\t\"kaaaaaaaaak\",  --  5\n\t\t\t\t\"lllllllllll\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...........\",  --  0\n\t\t\t\t\"...........\",  --  1\n\t\t\t\t\"...........\",  --  2\n\t\t\t\t\"ccccccccccc\",  --  3\n\t\t\t\t\"aaaaaaaaaaa\",  --  4\n\t\t\t\t\"lllllllllll\",  --  5\n\t\t\t\t\"...........\",  --  6\n\t\t\t\t\"...........\",  --  7\n\t\t\t\t\"...........\",  --  8\n\n\t\t\t},\n\t\t},  -- House11x9\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House13x9\",\n\t\t\t\tName         = \"Desert 12\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"12\",\n\t\t\t\tID           = \"116\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmaaammmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".....bcd.....\",  --  0\n\t\t\t\t\".aaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaaa.\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".aaaaaeaaaaa.\",  --  1\n\t\t\t\t\".a.........a.\",  --  2\n\t\t\t\t\".a.........a.\",  --  3\n\t\t\t\t\".a.........a.\",  --  4\n\t\t\t\t\".a.........a.\",  --  5\n\t\t\t\t\".a.........a.\",  --  6\n\t\t\t\t\".aaaaaaaaaaa.\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".afffagafffa.\",  --  1\n\t\t\t\t\".f.........f.\",  --  2\n\t\t\t\t\".f.........f.\",  --  3\n\t\t\t\t\".a.........a.\",  --  4\n\t\t\t\t\".f.........f.\",  --  5\n\t\t\t\t\".f.........f.\",  --  6\n\t\t\t\t\".affaffafffa.\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ccccccccccccc\",  --  0\n\t\t\t\t\"haaaaaaaaaaah\",  --  1\n\t\t\t\t\".a...i.i...a.\",  --  2\n\t\t\t\t\".a.........a.\",  --  3\n\t\t\t\t\".a.........a.\",  --  4\n\t\t\t\t\".a.........a.\",  --  5\n\t\t\t\t\".a..j..j...a.\",  --  6\n\t\t\t\t\"kaaaaaaaaaaak\",  --  7\n\t\t\t\t\"lllllllllllll\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\"ccccccccccccc\",  --  1\n\t\t\t\t\"haaaaaaaaaaah\",  --  2\n\t\t\t\t\".a.........a.\",  --  3\n\t\t\t\t\".a.........a.\",  --  4\n\t\t\t\t\".a.........a.\",  --  5\n\t\t\t\t\"kaaaaaaaaaaak\",  --  6\n\t\t\t\t\"lllllllllllll\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\"ccccccccccccc\",  --  2\n\t\t\t\t\"haaaaaaaaaaah\",  --  3\n\t\t\t\t\".a.........a.\",  --  4\n\t\t\t\t\"kaaaaaaaaaaak\",  --  5\n\t\t\t\t\"lllllllllllll\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\".............\",  --  2\n\t\t\t\t\"ccccccccccccc\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"lllllllllllll\",  --  5\n\t\t\t\t\".............\",  --  6\n\t\t\t\t\".............\",  --  7\n\t\t\t\t\".............\",  --  8\n\n\t\t\t},\n\t\t},  -- House13x9\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House15x9\",\n\t\t\t\tName         = \"Desert 13\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"13\",\n\t\t\t\tID           = \"118\",\n\t\t\t\tCreatorName  = \"xoft\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 15,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmaaammmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".....bcd.......\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".aaaaaeaaaaaaa.\",  --  1\n\t\t\t\t\".a...........a.\",  --  2\n\t\t\t\t\".a...........a.\",  --  3\n\t\t\t\t\".a...........a.\",  --  4\n\t\t\t\t\".a...........a.\",  --  5\n\t\t\t\t\".a...........a.\",  --  6\n\t\t\t\t\".aaaaaaaaaaaaa.\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\".afffagaffaffa.\",  --  1\n\t\t\t\t\".f...........f.\",  --  2\n\t\t\t\t\".f...........f.\",  --  3\n\t\t\t\t\".a...........a.\",  --  4\n\t\t\t\t\".f...........f.\",  --  5\n\t\t\t\t\".f...........f.\",  --  6\n\t\t\t\t\".affaffaffaffa.\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ccccccccccccccc\",  --  0\n\t\t\t\t\"haaaaaaaaaaaaah\",  --  1\n\t\t\t\t\".a...i.i..i..a.\",  --  2\n\t\t\t\t\".a...........a.\",  --  3\n\t\t\t\t\".a...........a.\",  --  4\n\t\t\t\t\".a...........a.\",  --  5\n\t\t\t\t\".a..j..j..j..a.\",  --  6\n\t\t\t\t\"kaaaaaaaaaaaaak\",  --  7\n\t\t\t\t\"lllllllllllllll\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"ccccccccccccccc\",  --  1\n\t\t\t\t\"haaaaaaaaaaaaah\",  --  2\n\t\t\t\t\".a...........a.\",  --  3\n\t\t\t\t\".a...........a.\",  --  4\n\t\t\t\t\".a...........a.\",  --  5\n\t\t\t\t\"kaaaaaaaaaaaaak\",  --  6\n\t\t\t\t\"lllllllllllllll\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"ccccccccccccccc\",  --  2\n\t\t\t\t\"haaaaaaaaaaaaah\",  --  3\n\t\t\t\t\".a...........a.\",  --  4\n\t\t\t\t\"kaaaaaaaaaaaaak\",  --  5\n\t\t\t\t\"lllllllllllllll\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"...............\",  --  0\n\t\t\t\t\"...............\",  --  1\n\t\t\t\t\"...............\",  --  2\n\t\t\t\t\"ccccccccccccccc\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"lllllllllllllll\",  --  5\n\t\t\t\t\"...............\",  --  6\n\t\t\t\t\"...............\",  --  7\n\t\t\t\t\"...............\",  --  8\n\n\t\t\t},\n\t\t},  -- House15x9\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"HouseL14x12\",\n\t\t\t\tName         = \"Desert 14\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"14\",\n\t\t\t\tID           = \"124\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 8,\n\t\t\t\tz = 12,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 12,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 5,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e:128: 3\",  -- sandstonestairs\n\t\t\t\t\"f: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"g: 64: 1\",  -- woodendoorblock\n\t\t\t\t\"h:102: 0\",  -- glasspane\n\t\t\t\t\"i: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"j: 64: 8\",  -- woodendoorblock\n\t\t\t\t\"k:128: 7\",  -- sandstonestairs\n\t\t\t\t\"l: 50: 3\",  -- torch\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n: 50: 2\",  -- torch\n\t\t\t\t\"o: 50: 4\",  -- torch\n\t\t\t\t\"p:128: 6\",  -- sandstonestairs\n\t\t\t\t\"q: 50: 1\",  -- torch\n\t\t\t\t\"r:128: 5\",  -- sandstonestairs\n\t\t\t\t\"s:128: 4\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmaaammmmmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmaaaaaaaaam\",  --  8\n\t\t\t\t\"mmmmmmaaaaaaam\",  --  9\n\t\t\t\t\"mmmmmmaaaaaaam\",  -- 10\n\t\t\t\t\"mmmmmmmmmmmmmm\",  -- 11\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"....bcd.......\",  --  0\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaaaa.\",  --  7\n\t\t\t\t\"....beaaaaaaa.\",  --  8\n\t\t\t\t\"mmmmm.aaaaaaa.\",  --  9\n\t\t\t\t\"mmmmm.aaaaaaa.\",  -- 10\n\t\t\t\t\"mmmmm.........\",  -- 11\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\".aaaafaaaaaaa.\",  --  1\n\t\t\t\t\".a..........a.\",  --  2\n\t\t\t\t\".a..........a.\",  --  3\n\t\t\t\t\".a..........a.\",  --  4\n\t\t\t\t\".a..........a.\",  --  5\n\t\t\t\t\".a..........a.\",  --  6\n\t\t\t\t\".aaaaga.....a.\",  --  7\n\t\t\t\t\"......a.....a.\",  --  8\n\t\t\t\t\"mmmmm.a.....a.\",  --  9\n\t\t\t\t\"mmmmm.aaaaaaa.\",  -- 10\n\t\t\t\t\"mmmmm.........\",  -- 11\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\".ahhaiahhahha.\",  --  1\n\t\t\t\t\".h..........h.\",  --  2\n\t\t\t\t\".h..........h.\",  --  3\n\t\t\t\t\".a..........a.\",  --  4\n\t\t\t\t\".h..........h.\",  --  5\n\t\t\t\t\".h..........h.\",  --  6\n\t\t\t\t\".ahhaja.....a.\",  --  7\n\t\t\t\t\"......h.....h.\",  --  8\n\t\t\t\t\"mmmmm.h.....h.\",  --  9\n\t\t\t\t\"mmmmm.ahhahha.\",  -- 10\n\t\t\t\t\"mmmmm.........\",  -- 11\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"cccccccccccccc\",  --  0\n\t\t\t\t\"kaaaaaaaaaaaad\",  --  1\n\t\t\t\t\".a..l.l.....ad\",  --  2\n\t\t\t\t\".a..........ad\",  --  3\n\t\t\t\t\".a.........nad\",  --  4\n\t\t\t\t\".a..........ad\",  --  5\n\t\t\t\t\".a..o.o.....ad\",  --  6\n\t\t\t\t\"paaaaaaq...nad\",  --  7\n\t\t\t\t\"eeeeeba.....ad\",  --  8\n\t\t\t\t\"mmmmmba.....ad\",  --  9\n\t\t\t\t\"mmmmmbaaaaaaad\",  -- 10\n\t\t\t\t\"mmmmmbr.....sd\",  -- 11\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"ccccccccccccd.\",  --  1\n\t\t\t\t\"kaaaaaaaaaaad.\",  --  2\n\t\t\t\t\".a.........ad.\",  --  3\n\t\t\t\t\".a.........ad.\",  --  4\n\t\t\t\t\".a.........ad.\",  --  5\n\t\t\t\t\"paaaaaaa...ad.\",  --  6\n\t\t\t\t\"eeeeeeba...ad.\",  --  7\n\t\t\t\t\"......ba...ad.\",  --  8\n\t\t\t\t\"mmmmm.ba...ad.\",  --  9\n\t\t\t\t\"mmmmm.baaaaad.\",  -- 10\n\t\t\t\t\"mmmmm.br...sd.\",  -- 11\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"cccccccccccc..\",  --  2\n\t\t\t\t\"kaaaaaaaaaad..\",  --  3\n\t\t\t\t\".a........ad..\",  --  4\n\t\t\t\t\"paaaaaaaa.ad..\",  --  5\n\t\t\t\t\"eeeeeeeea.ad..\",  --  6\n\t\t\t\t\".......ba.ad..\",  --  7\n\t\t\t\t\".......ba.ad..\",  --  8\n\t\t\t\t\"mmmmm..ba.ad..\",  --  9\n\t\t\t\t\"mmmmm..baaad..\",  -- 10\n\t\t\t\t\"mmmmm..br.sd..\",  -- 11\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"..............\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"ccccccccccc...\",  --  3\n\t\t\t\t\"aaaaaaaaaad...\",  --  4\n\t\t\t\t\"eeeeeeeebad...\",  --  5\n\t\t\t\t\"........bad...\",  --  6\n\t\t\t\t\"........bad...\",  --  7\n\t\t\t\t\"........bad...\",  --  8\n\t\t\t\t\"mmmmm...bad...\",  --  9\n\t\t\t\t\"mmmmm...bad...\",  -- 10\n\t\t\t\t\"mmmmm...bad...\",  -- 11\n\n\t\t\t},\n\t\t},  -- HouseL14x12\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House13x7\",\n\t\t\t\tName         = \"Desert 15\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"15\",\n\t\t\t\tID           = \"125\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 13,\n\t\t\t\ty = 7,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 6,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmaaammmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaam\",  --  5\n\t\t\t\t\"mmmmmmmmmmmmm\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\".....bcd.....\",  --  0\n\t\t\t\t\".aaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaa.\",  --  5\n\t\t\t\t\".............\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".aaaaaeaaaaa.\",  --  1\n\t\t\t\t\".a.........a.\",  --  2\n\t\t\t\t\".a.........a.\",  --  3\n\t\t\t\t\".a.........a.\",  --  4\n\t\t\t\t\".aaaaaaaaaaa.\",  --  5\n\t\t\t\t\".............\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".afffagafffa.\",  --  1\n\t\t\t\t\".f.........f.\",  --  2\n\t\t\t\t\".f.........f.\",  --  3\n\t\t\t\t\".f.........f.\",  --  4\n\t\t\t\t\".affafffaffa.\",  --  5\n\t\t\t\t\".............\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ccccccccccccc\",  --  0\n\t\t\t\t\"haaaaaaaaaaah\",  --  1\n\t\t\t\t\".a...i.i...a.\",  --  2\n\t\t\t\t\".a.........a.\",  --  3\n\t\t\t\t\".a..j...j..a.\",  --  4\n\t\t\t\t\"kaaaaaaaaaaak\",  --  5\n\t\t\t\t\"lllllllllllll\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\"ccccccccccccc\",  --  1\n\t\t\t\t\"haaaaaaaaaaah\",  --  2\n\t\t\t\t\".a.........a.\",  --  3\n\t\t\t\t\"kaaaaaaaaaaak\",  --  4\n\t\t\t\t\"lllllllllllll\",  --  5\n\t\t\t\t\".............\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\".............\",  --  0\n\t\t\t\t\".............\",  --  1\n\t\t\t\t\"ccccccccccccc\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"lllllllllllll\",  --  4\n\t\t\t\t\".............\",  --  5\n\t\t\t\t\".............\",  --  6\n\n\t\t\t},\n\t\t},  -- House13x7\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"House16x9\",\n\t\t\t\tName         = \"Desert 16\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"16\",\n\t\t\t\tID           = \"126\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 16,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = -1,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 16,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 9,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 9,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b:128: 0\",  -- sandstonestairs\n\t\t\t\t\"c:128: 2\",  -- sandstonestairs\n\t\t\t\t\"d:128: 1\",  -- sandstonestairs\n\t\t\t\t\"e: 64: 3\",  -- woodendoorblock\n\t\t\t\t\"f:102: 0\",  -- glasspane\n\t\t\t\t\"g: 64: 9\",  -- woodendoorblock\n\t\t\t\t\"h:128: 7\",  -- sandstonestairs\n\t\t\t\t\"i: 50: 3\",  -- torch\n\t\t\t\t\"j: 50: 4\",  -- torch\n\t\t\t\t\"k:128: 6\",  -- sandstonestairs\n\t\t\t\t\"l:128: 3\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"mmmmmmmmaaammmmm\",  --  0\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  1\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  2\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  3\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  4\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  5\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  6\n\t\t\t\t\"maaaaaaaaaaaaaam\",  --  7\n\t\t\t\t\"mmmmmmmmmmmmmmmm\",  --  8\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"........bcd.....\",  --  0\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  1\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  2\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  3\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  4\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  5\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  6\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  7\n\t\t\t\t\"................\",  --  8\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\".aaaaaaaaeaaaaa.\",  --  1\n\t\t\t\t\".a............a.\",  --  2\n\t\t\t\t\".a............a.\",  --  3\n\t\t\t\t\".a............a.\",  --  4\n\t\t\t\t\".a............a.\",  --  5\n\t\t\t\t\".a............a.\",  --  6\n\t\t\t\t\".aaaaaaaaaaaaaa.\",  --  7\n\t\t\t\t\"................\",  --  8\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\".affafffagafffa.\",  --  1\n\t\t\t\t\".f............f.\",  --  2\n\t\t\t\t\".f............f.\",  --  3\n\t\t\t\t\".a............a.\",  --  4\n\t\t\t\t\".f............f.\",  --  5\n\t\t\t\t\".f............f.\",  --  6\n\t\t\t\t\".affaffafffaffa.\",  --  7\n\t\t\t\t\"................\",  --  8\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"cccccccccccccccc\",  --  0\n\t\t\t\t\"haaaaaaaaaaaaaah\",  --  1\n\t\t\t\t\".a..i...i.i...a.\",  --  2\n\t\t\t\t\".a............a.\",  --  3\n\t\t\t\t\".a............a.\",  --  4\n\t\t\t\t\".a............a.\",  --  5\n\t\t\t\t\".a..j..j...j..a.\",  --  6\n\t\t\t\t\"kaaaaaaaaaaaaaak\",  --  7\n\t\t\t\t\"llllllllllllllll\",  --  8\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"cccccccccccccccc\",  --  1\n\t\t\t\t\"haaaaaaaaaaaaaah\",  --  2\n\t\t\t\t\".a............a.\",  --  3\n\t\t\t\t\".a............a.\",  --  4\n\t\t\t\t\".a............a.\",  --  5\n\t\t\t\t\"kaaaaaaaaaaaaaak\",  --  6\n\t\t\t\t\"llllllllllllllll\",  --  7\n\t\t\t\t\"................\",  --  8\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"cccccccccccccccc\",  --  2\n\t\t\t\t\"haaaaaaaaaaaaaah\",  --  3\n\t\t\t\t\".a............a.\",  --  4\n\t\t\t\t\"kaaaaaaaaaaaaaak\",  --  5\n\t\t\t\t\"llllllllllllllll\",  --  6\n\t\t\t\t\"................\",  --  7\n\t\t\t\t\"................\",  --  8\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"................\",  --  0\n\t\t\t\t\"................\",  --  1\n\t\t\t\t\"................\",  --  2\n\t\t\t\t\"cccccccccccccccc\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaaaa\",  --  4\n\t\t\t\t\"llllllllllllllll\",  --  5\n\t\t\t\t\"................\",  --  6\n\t\t\t\t\"................\",  --  7\n\t\t\t\t\"................\",  --  8\n\n\t\t\t},\n\t\t},  -- House16x9\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"SingleField\",\n\t\t\t\tName         = \"Desert 17\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"17\",\n\t\t\t\tID           = \"127\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 10,\n\t\t\t\ty = 3,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = -1,\n\t\t\t\tMaxX = 10,\n\t\t\t\tMaxY = 2,\n\t\t\t\tMaxZ = 7,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a: 24: 0\",  -- sandstone\n\t\t\t\t\"b: 60: 5\",  -- tilleddirt\n\t\t\t\t\"c: 60: 7\",  -- tilleddirt\n\t\t\t\t\"d: 60: 6\",  -- tilleddirt\n\t\t\t\t\"e:  8: 0\",  -- water\n\t\t\t\t\"f: 50: 5\",  -- torch\n\t\t\t\t\"g: 59: 7\",  -- wheatblock\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaa\",  --  0\n\t\t\t\t\"abccdcccca\",  --  1\n\t\t\t\t\"acccccccca\",  --  2\n\t\t\t\t\"aeeeeeeeea\",  --  3\n\t\t\t\t\"acccccccca\",  --  4\n\t\t\t\t\"acdcdcccca\",  --  5\n\t\t\t\t\"aaaaaaaaaa\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"f........f\",  --  0\n\t\t\t\t\".gggggggg.\",  --  1\n\t\t\t\t\".gggggggg.\",  --  2\n\t\t\t\t\"..........\",  --  3\n\t\t\t\t\".gggggggg.\",  --  4\n\t\t\t\t\".gggggggg.\",  --  5\n\t\t\t\t\"f........f\",  --  6\n\n\t\t\t},\n\t\t},  -- SingleField\n\n\n\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"RoofedWell\",\n\t\t\t\tName         = \"Desert 43\",\n\t\t\t\tGalleryName  = \"Desert\",\n\t\t\t\tGalleryIndex = \"43\",\n\t\t\t\tID           = \"274\",\n\t\t\t\tCreatorName  = \"Aloe_vera\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 7,\n\t\t\t\ty = 14,\n\t\t\t\tz = 7,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 6,\n\t\t\t\tMaxY = 13,\n\t\t\t\tMaxZ = 6,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 6,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 6,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 8,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"RepeatBottomTillSolid\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"VerticalStrategy\"] = \"TerrainOrOceanTop|-8\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c:  8: 0\",  -- water\n\t\t\t\t\"d: 12: 0\",  -- sand\n\t\t\t\t\"e:  4: 0\",  -- cobblestone\n\t\t\t\t\"f: 13: 0\",  -- gravel\n\t\t\t\t\"g:118: 3\",  -- cauldronblock\n\t\t\t\t\"h: 85: 0\",  -- fence\n\t\t\t\t\"i:128: 2\",  -- sandstonestairs\n\t\t\t\t\"j:128: 7\",  -- sandstonestairs\n\t\t\t\t\"k:128: 4\",  -- sandstonestairs\n\t\t\t\t\"l:128: 5\",  -- sandstonestairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t\t\"n:128: 6\",  -- sandstonestairs\n\t\t\t\t\"o:128: 3\",  -- sandstonestairs\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaa\",  --  4\n\t\t\t\t\"aaaaaaa\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"abbbbba\",  --  1\n\t\t\t\t\"abcccba\",  --  2\n\t\t\t\t\"abcccba\",  --  3\n\t\t\t\t\"abcccba\",  --  4\n\t\t\t\t\"abbbbba\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"abbbbba\",  --  1\n\t\t\t\t\"abcccba\",  --  2\n\t\t\t\t\"abcccba\",  --  3\n\t\t\t\t\"abcccba\",  --  4\n\t\t\t\t\"abbbbba\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aaaaaaa\",  --  0\n\t\t\t\t\"abbbbba\",  --  1\n\t\t\t\t\"abcccba\",  --  2\n\t\t\t\t\"abcccba\",  --  3\n\t\t\t\t\"abcccba\",  --  4\n\t\t\t\t\"abbbbba\",  --  5\n\t\t\t\t\"aaaaaaa\",  --  6\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"ddddddd\",  --  0\n\t\t\t\t\"dbbbbbd\",  --  1\n\t\t\t\t\"dbcccbd\",  --  2\n\t\t\t\t\"dbcccbd\",  --  3\n\t\t\t\t\"dbcccbd\",  --  4\n\t\t\t\t\"dbbbbbd\",  --  5\n\t\t\t\t\"ddddddd\",  --  6\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"ddddddd\",  --  0\n\t\t\t\t\"dbbbbbd\",  --  1\n\t\t\t\t\"dbcccbd\",  --  2\n\t\t\t\t\"dbcccbd\",  --  3\n\t\t\t\t\"dbcccbd\",  --  4\n\t\t\t\t\"dbbbbbd\",  --  5\n\t\t\t\t\"ddddddd\",  --  6\n\n\t\t\t\t-- Level 6\n\t\t\t\t\"ddeeedd\",  --  0\n\t\t\t\t\"dbbbbbd\",  --  1\n\t\t\t\t\"ebcccbe\",  --  2\n\t\t\t\t\"ebcccbe\",  --  3\n\t\t\t\t\"ebcccbe\",  --  4\n\t\t\t\t\"dbbbbbd\",  --  5\n\t\t\t\t\"ddeeedd\",  --  6\n\n\t\t\t\t-- Level 7\n\t\t\t\t\"ddfffdd\",  --  0\n\t\t\t\t\"dbbbbbd\",  --  1\n\t\t\t\t\"fbcccbf\",  --  2\n\t\t\t\t\"fbcccbf\",  --  3\n\t\t\t\t\"fbcccbf\",  --  4\n\t\t\t\t\"dbbbbbd\",  --  5\n\t\t\t\t\"ddfffdd\",  --  6\n\n\t\t\t\t-- Level 8\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".bbbbb.\",  --  1\n\t\t\t\t\".b...b.\",  --  2\n\t\t\t\t\".b.g.b.\",  --  3\n\t\t\t\t\".b...b.\",  --  4\n\t\t\t\t\".bbbbb.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 9\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".h...h.\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"...h...\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".h...h.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 10\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".h...h.\",  --  1\n\t\t\t\t\".......\",  --  2\n\t\t\t\t\"...h...\",  --  3\n\t\t\t\t\".......\",  --  4\n\t\t\t\t\".h...h.\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 11\n\t\t\t\t\"iiiiiii\",  --  0\n\t\t\t\t\"jbjjjbj\",  --  1\n\t\t\t\t\".k...l.\",  --  2\n\t\t\t\t\".k.h.l.\",  --  3\n\t\t\t\t\".k...l.\",  --  4\n\t\t\t\t\"nbnnnbn\",  --  5\n\t\t\t\t\"ooooooo\",  --  6\n\n\t\t\t\t-- Level 12\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\"iiiiiii\",  --  1\n\t\t\t\t\"jb...bj\",  --  2\n\t\t\t\t\".b.h.b.\",  --  3\n\t\t\t\t\"nb...bn\",  --  4\n\t\t\t\t\"ooooooo\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t\t-- Level 13\n\t\t\t\t\".......\",  --  0\n\t\t\t\t\".......\",  --  1\n\t\t\t\t\"iiiiiii\",  --  2\n\t\t\t\t\"bbbbbbb\",  --  3\n\t\t\t\t\"ooooooo\",  --  4\n\t\t\t\t\".......\",  --  5\n\t\t\t\t\".......\",  --  6\n\n\t\t\t},\n\t\t},  -- RoofedWell\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "Server/Protocol/1.12.2/base.recipes.txt",
    "content": "# recipeId minecraftName\n\n11 yellow_wool\n12 yellow_terracotta\n13 yellow_stained_glass_pane\n14 yellow_stained_glass\n15 yellow_dye_from_sunflower\n16 yellow_dye_from_dandelion\n17 yellow_concrete_powder\n18 yellow_carpet\n19 yellow_bed_from_white_bed\n20 yellow_bed\n21 yellow_banner\n22 writable_book\n23 wooden_sword\n24 wooden_shovel\n25 wooden_pressure_plate\n26 wooden_pickaxe\n27 wooden_hoe\n28 oak_door\n29 oak_button\n30 wooden_axe\n31 white_terracotta\n32 white_stained_glass_pane\n33 white_stained_glass\n34 white_concrete_powder\n35 white_carpet\n36 white_bed\n37 white_banner\n38 wheat\n39 tripwire_hook\n40 trapped_chest\n41 oak_trapdoor\n42 torch\n43 tnt_minecart\n44 tnt\n45 sugar\n46 white_wool_from_string\n47 stone_bricks\n48 stone_sword\n49 stone_stairs\n50 stone_slab\n51 stone_shovel\n52 stone_pressure_plate\n53 stone_pickaxe\n54 stone_hoe\n55 stone_button\n56 stone_brick_stairs\n57 stone_brick_slab\n58 stone_axe\n59 sticky_piston\n60 stick\n61 spruce_slab\n62 spruce_stairs\n63 spruce_planks\n64 spruce_fence_gate\n65 spruce_fence\n66 spruce_door\n67 spruce_boat\n68 spectral_arrow\n69 glistering_melon_slice\n70 snow\n71 snow_block\n72 smooth_sandstone\n73 smooth_red_sandstone\n74 slime_ball\n75 slime_block\n76 oak_sign\n77 shield\n78 shears\n79 sea_lantern\n80 sandstone_stairs\n81 sandstone_slab\n82 sandstone\n83 repeater\n84 redstone_torch\n85 redstone_lamp\n86 redstone_block\n87 redstone\n88 red_wool\n89 red_terracotta\n90 red_stained_glass_pane\n91 red_stained_glass\n92 red_sandstone_stairs\n93 red_sandstone_slab\n94 red_sandstone\n95 red_nether_bricks\n96 red_dye_from_tulip\n97 red_dye_from_rose_bush\n98 red_dye_from_poppy\n99 red_dye_from_beetroot\n100 red_concrete_powder\n101 red_carpet\n102 red_bed_from_white_bed\n103 red_bed\n104 red_banner\n105 rail\n106 rabbit_stew_from_red_mushroom\n107 rabbit_stew_from_brown_mushroom\n108 quartz_stairs\n109 quartz_slab\n110 quartz_block\n111 purpur_stairs\n112 purpur_slab\n113 purpur_pillar\n114 purpur_block\n115 purple_wool\n116 purple_terracotta\n117 purple_stained_glass_pane\n118 purple_stained_glass\n119 purpur_shulker_box\n120 purple_dye\n121 purple_concrete_powder\n122 purple_carpet\n123 purple_bed_from_white_bed\n124 purple_bed\n125 purple_banner\n126 pumpkin_seeds\n127 pumpkin_pie\n128 prismarine_bricks\n129 prismarine\n130 polished_granite\n131 polished_diorite\n132 polished_andesite\n133 piston\n134 pink_wool\n135 pink_terracotta\n136 pink_stained_glass_pane\n137 pink_stained_glass\n138 pink_dye_from_red_white_dye\n139 pink_tulip\n140 peony\n141 pink_concrete_powder\n142 pink_carpet\n143 pink_bed_from_white_bed\n144 pink_bed\n145 pink_banner\n146 quartz_pillar\n147 paper\n148 painting\n149 orange_wool\n150 orange_terracotta\n151 orange_stained_glass_pane\n152 orange_stained_glass\n153 orange_dye_from_red_yellow\n154 orange_dye_from_orange_tulip\n155 orange_concrete_powder\n156 orange_carpet\n157 orange_bed_from_white_bed\n158 orange_bed\n159 orange_banner\n160 observer\n161 oak_slab\n162 oak_stairs\n163 oak_planks\n164 note_block\n165 nether_wart_block\n166 nether_brick_stairs\n167 nether_brick_slab\n168 nether_brick_fence\n169 nether_bricks\n170 mushroom_stew\n171 mossy_stone_bricks\n172 mossy_cobblestone_wall\n173 mossy_cobblestone\n174 minecart\n175 melon_seeds\n176 melon\n177 map\n178 magma_cream\n179 magma_block\n180 magenta_wool\n181 magenta_terracotta\n182 magenta_stained_glass_pane\n183 magenta_stained_glass\n184 magenta_dye_from_purple_and_pink\n185 magenta_dye_from_lilac\n186 magenta_dye_from_blue_red_pink\n187 magenta_dye_from_blue_red_white_dye\n188 magenta_dye_from_allium\n189 magenta_concrete_powder\n190 magenta_carpet\n191 magenta_bed_from_white_bed\n192 magenta_bed\n193 magenta_banner\n194 jack_o_lantern\n195 lime_wool\n196 lime_terracotta\n197 lime_stained_glass_pane\n198 lime_stained_glass\n199 lime_dye\n200 lime_concrete_powder\n201 lime_carpet\n202 lime_bed_from_white_bed\n203 lime_bed\n204 lime_banner\n205 light_weighted_pressure_plate\n206 light_gray_wool\n207 light_gray_terracotta\n208 light_gray_stained_glass_pane\n209 light_gray_stained_glass\n210 light_gray_dye_from_white_tulip\n211 light_gray_dye_from_oxeye_daisy\n212 light_gray_dye_from_gray_white_dye\n213 light_gray_dye_from_black_white_dye\n214 light_gray_dye_from_azure_bluet\n215 light_gray_concrete_powder\n216 light_gray_carpet\n217 light_gray_bed_from_white_bed\n218 light_gray_bed\n219 light_gray_banner\n220 light_blue_wool\n221 light_blue_terracotta\n222 light_blue_stained_glass_pane\n223 light_blue_stained_glass\n224 light_blue_dye_from_blue_white_dye\n225 light_blue_dye_from_blue_orchid\n226 light_blue_concrete_powder\n227 light_blue_carpet\n228 light_blue_bed_from_white_bed\n229 light_blue_bed\n230 light_blue_banner\n231 lever\n232 leather_leggings\n233 leather_helmet\n234 leather_chestplate\n235 leather_boots\n236 leather\n237 lead\n238 lapis_lazuli\n239 lapis_block\n240 ladder\n241 jungle_slab\n242 jungle_stairs\n243 jungle_planks\n244 jungle_fence_gate\n245 jungle_fence\n246 jungle_door\n247 jungle_boat\n248 jukebox\n249 item_frame\n250 iron_trapdoor\n251 iron_sword\n252 iron_shovel\n253 iron_pickaxe\n254 iron_nugget\n255 iron_leggings\n256 iron_ingot_from_iron_block\n257 iron_ingot_from_nuggets\n258 iron_hoe\n259 iron_helmet\n260 iron_door\n261 iron_chestplate\n262 iron_boots\n263 iron_block\n264 iron_bars\n265 iron_axe\n266 hopper_minecart\n267 hopper\n268 heavy_weighted_pressure_plate\n269 hay_block\n270 green_wool\n271 green_terracotta\n272 green_stained_glass_pane\n273 green_stained_glass\n274 green_concrete_powder\n275 green_carpet\n276 green_bed_from_white_bed\n277 green_bed\n278 green_banner\n279 gray_wool\n280 gray_terracotta\n281 gray_stained_glass_pane\n282 gray_stained_glass\n283 gray_dye\n284 gray_concrete_powder\n285 gray_carpet\n286 gray_bed_from_white_bed\n287 gray_bed\n288 gray_banner\n289 granite\n290 golden_sword\n291 golden_shovel\n292 powered_rail\n293 golden_pickaxe\n294 golden_leggings\n295 golden_hoe\n296 golden_helmet\n297 golden_chestplate\n298 golden_carrot\n299 golden_boots\n300 golden_axe\n301 golden_apple\n302 gold_nugget\n303 gold_ingot_from_gold_block\n304 gold_ingot\n305 gold_block\n306 glowstone\n307 glass_pane\n308 glass_bottle\n309 furnace_minecart\n310 furnace\n311 flower_pot\n312 flint_and_steel\n313 fishing_rod\n314 fire_charge\n315 fermented_spider_eye\n316 oak_fence_gate\n317 oak_fence\n318 ender_eye\n319 ender_chest\n320 end_rod\n321 end_crystal\n322 end_stone_bricks\n323 enchanting_table\n324 emerald_block\n325 emerald\n326 dropper\n327 dispenser\n328 diorite\n329 diamond_sword\n330 diamond_shovel\n331 diamond_pickaxe\n332 diamond_leggings\n333 diamond_hoe\n334 diamond_helmet\n335 diamond_chestplate\n336 diamond_boots\n337 diamond_block\n338 diamond_axe\n339 diamond\n340 detector_rail\n341 daylight_detector\n342 dark_prismarine\n343 dark_oak_slab\n344 dark_oak_stairs\n345 dark_oak_planks\n346 dark_oak_fence_gate\n347 dark_oak_fence\n348 dark_oak_door\n349 dark_oak_boat\n350 cyan_wool\n351 cyan_terracotta\n352 cyan_stained_glass_pane\n353 cyan_stained_glass\n354 cyan_dye\n355 cyan_concrete_powder\n356 cyan_carpet\n357 cyan_bed_from_white_bed\n358 cyan_bed\n359 cyan_banner\n360 crafting_table\n361 cookie\n362 compass\n363 comparator\n364 cobblestone_wall\n365 cobblestone_slab\n366 coarse_dirt\n367 coal_block\n368 coal\n369 clock\n370 clay\n371 chiseled_stone_bricks\n372 chiseled_sandstone\n373 chiseled_red_sandstone\n374 chiseled_quartz_block\n375 chest_minecart\n376 chest\n377 cauldron\n378 carrot_on_a_stick\n379 cake\n380 bucket\n381 brown_wool\n382 brown_terracotta\n383 brown_stained_glass_pane\n384 brown_stained_glass\n385 brown_concrete_powder\n386 brown_carpet\n387 brown_bed_from_white_bed\n388 brown_bed\n389 brown_banner\n390 brick_stairs\n391 brick_slab\n392 bricks\n393 brewing_stand\n394 bread\n395 bowl\n396 bow\n397 bookshelf\n398 book\n399 bone_meal\n400 bone_meal_from_bone_block\n401 bone_block\n402 oak_boat\n403 blue_wool\n404 blue_terracotta\n405 blue_stained_glass_pane\n406 blue_stained_glass\n407 blue_concrete_powder\n408 blue_carpet\n409 blue_bed_from_white_bed\n410 blue_bed\n411 blue_banner\n412 blaze_powder\n413 black_wool\n414 black_terracotta\n415 black_stained_glass_pane\n416 black_stained_glass\n417 black_concrete_powder\n418 black_carpet\n419 black_bed_from_white_bed\n420 black_bed\n421 black_banner\n422 birch_slab\n423 birch_stairs\n424 birch_planks\n425 birch_fence_gate\n426 birch_fence\n427 birch_door\n428 birch_boat\n429 beetroot_soup\n430 beacon\n431 arrow\n432 armor_stand\n433 anvil\n434 andesite\n435 activator_rail\n436 acacia_slab\n437 acacia_stairs\n438 acacia_planks\n439 acacia_fence_gate\n440 acacia_fence\n441 acacia_door\n442 acacia_boat\n"
  },
  {
    "path": "Server/Protocol/1.13/base.btp.txt",
    "content": "BlockTypePalette\nFileVersion\t1\nCommonPrefix\tminecraft:\n\n0\tair\n1\tstone\n2\tgranite\n3\tpolished_granite\n4\tdiorite\n5\tpolished_diorite\n6\tandesite\n7\tpolished_andesite\n8\tgrass_block\tsnowy\ttrue\n9\tgrass_block\tsnowy\tfalse\n10\tdirt\n11\tcoarse_dirt\n12\tpodzol\tsnowy\ttrue\n13\tpodzol\tsnowy\tfalse\n14\tcobblestone\n15\toak_planks\n16\tspruce_planks\n17\tbirch_planks\n18\tjungle_planks\n19\tacacia_planks\n20\tdark_oak_planks\n21\toak_sapling\tstage\t0\n22\toak_sapling\tstage\t1\n23\tspruce_sapling\tstage\t0\n24\tspruce_sapling\tstage\t1\n25\tbirch_sapling\tstage\t0\n26\tbirch_sapling\tstage\t1\n27\tjungle_sapling\tstage\t0\n28\tjungle_sapling\tstage\t1\n29\tacacia_sapling\tstage\t0\n30\tacacia_sapling\tstage\t1\n31\tdark_oak_sapling\tstage\t0\n32\tdark_oak_sapling\tstage\t1\n33\tbedrock\n34\twater\tlevel\t0\n35\twater\tlevel\t1\n36\twater\tlevel\t2\n37\twater\tlevel\t3\n38\twater\tlevel\t4\n39\twater\tlevel\t5\n40\twater\tlevel\t6\n41\twater\tlevel\t7\n42\twater\tlevel\t8\n43\twater\tlevel\t9\n44\twater\tlevel\t10\n45\twater\tlevel\t11\n46\twater\tlevel\t12\n47\twater\tlevel\t13\n48\twater\tlevel\t14\n49\twater\tlevel\t15\n50\tlava\tlevel\t0\n51\tlava\tlevel\t1\n52\tlava\tlevel\t2\n53\tlava\tlevel\t3\n54\tlava\tlevel\t4\n55\tlava\tlevel\t5\n56\tlava\tlevel\t6\n57\tlava\tlevel\t7\n58\tlava\tlevel\t8\n59\tlava\tlevel\t9\n60\tlava\tlevel\t10\n61\tlava\tlevel\t11\n62\tlava\tlevel\t12\n63\tlava\tlevel\t13\n64\tlava\tlevel\t14\n65\tlava\tlevel\t15\n66\tsand\n67\tred_sand\n68\tgravel\n69\tgold_ore\n70\tiron_ore\n71\tcoal_ore\n72\toak_log\taxis\tx\n73\toak_log\taxis\ty\n74\toak_log\taxis\tz\n75\tspruce_log\taxis\tx\n76\tspruce_log\taxis\ty\n77\tspruce_log\taxis\tz\n78\tbirch_log\taxis\tx\n79\tbirch_log\taxis\ty\n80\tbirch_log\taxis\tz\n81\tjungle_log\taxis\tx\n82\tjungle_log\taxis\ty\n83\tjungle_log\taxis\tz\n84\tacacia_log\taxis\tx\n85\tacacia_log\taxis\ty\n86\tacacia_log\taxis\tz\n87\tdark_oak_log\taxis\tx\n88\tdark_oak_log\taxis\ty\n89\tdark_oak_log\taxis\tz\n90\tstripped_spruce_log\taxis\tx\n91\tstripped_spruce_log\taxis\ty\n92\tstripped_spruce_log\taxis\tz\n93\tstripped_birch_log\taxis\tx\n94\tstripped_birch_log\taxis\ty\n95\tstripped_birch_log\taxis\tz\n96\tstripped_jungle_log\taxis\tx\n97\tstripped_jungle_log\taxis\ty\n98\tstripped_jungle_log\taxis\tz\n99\tstripped_acacia_log\taxis\tx\n100\tstripped_acacia_log\taxis\ty\n101\tstripped_acacia_log\taxis\tz\n102\tstripped_dark_oak_log\taxis\tx\n103\tstripped_dark_oak_log\taxis\ty\n104\tstripped_dark_oak_log\taxis\tz\n105\tstripped_oak_log\taxis\tx\n106\tstripped_oak_log\taxis\ty\n107\tstripped_oak_log\taxis\tz\n108\toak_wood\taxis\tx\n109\toak_wood\taxis\ty\n110\toak_wood\taxis\tz\n111\tspruce_wood\taxis\tx\n112\tspruce_wood\taxis\ty\n113\tspruce_wood\taxis\tz\n114\tbirch_wood\taxis\tx\n115\tbirch_wood\taxis\ty\n116\tbirch_wood\taxis\tz\n117\tjungle_wood\taxis\tx\n118\tjungle_wood\taxis\ty\n119\tjungle_wood\taxis\tz\n120\tacacia_wood\taxis\tx\n121\tacacia_wood\taxis\ty\n122\tacacia_wood\taxis\tz\n123\tdark_oak_wood\taxis\tx\n124\tdark_oak_wood\taxis\ty\n125\tdark_oak_wood\taxis\tz\n126\tstripped_oak_wood\taxis\tx\n127\tstripped_oak_wood\taxis\ty\n128\tstripped_oak_wood\taxis\tz\n129\tstripped_spruce_wood\taxis\tx\n130\tstripped_spruce_wood\taxis\ty\n131\tstripped_spruce_wood\taxis\tz\n132\tstripped_birch_wood\taxis\tx\n133\tstripped_birch_wood\taxis\ty\n134\tstripped_birch_wood\taxis\tz\n135\tstripped_jungle_wood\taxis\tx\n136\tstripped_jungle_wood\taxis\ty\n137\tstripped_jungle_wood\taxis\tz\n138\tstripped_acacia_wood\taxis\tx\n139\tstripped_acacia_wood\taxis\ty\n140\tstripped_acacia_wood\taxis\tz\n141\tstripped_dark_oak_wood\taxis\tx\n142\tstripped_dark_oak_wood\taxis\ty\n143\tstripped_dark_oak_wood\taxis\tz\n144\toak_leaves\tpersistent\ttrue\tdistance\t1\n145\toak_leaves\tpersistent\tfalse\tdistance\t1\n146\toak_leaves\tpersistent\ttrue\tdistance\t2\n147\toak_leaves\tpersistent\tfalse\tdistance\t2\n148\toak_leaves\tpersistent\ttrue\tdistance\t3\n149\toak_leaves\tpersistent\tfalse\tdistance\t3\n150\toak_leaves\tpersistent\ttrue\tdistance\t4\n151\toak_leaves\tpersistent\tfalse\tdistance\t4\n152\toak_leaves\tpersistent\ttrue\tdistance\t5\n153\toak_leaves\tpersistent\tfalse\tdistance\t5\n154\toak_leaves\tpersistent\ttrue\tdistance\t6\n155\toak_leaves\tpersistent\tfalse\tdistance\t6\n156\toak_leaves\tpersistent\ttrue\tdistance\t7\n157\toak_leaves\tpersistent\tfalse\tdistance\t7\n158\tspruce_leaves\tpersistent\ttrue\tdistance\t1\n159\tspruce_leaves\tpersistent\tfalse\tdistance\t1\n160\tspruce_leaves\tpersistent\ttrue\tdistance\t2\n161\tspruce_leaves\tpersistent\tfalse\tdistance\t2\n162\tspruce_leaves\tpersistent\ttrue\tdistance\t3\n163\tspruce_leaves\tpersistent\tfalse\tdistance\t3\n164\tspruce_leaves\tpersistent\ttrue\tdistance\t4\n165\tspruce_leaves\tpersistent\tfalse\tdistance\t4\n166\tspruce_leaves\tpersistent\ttrue\tdistance\t5\n167\tspruce_leaves\tpersistent\tfalse\tdistance\t5\n168\tspruce_leaves\tpersistent\ttrue\tdistance\t6\n169\tspruce_leaves\tpersistent\tfalse\tdistance\t6\n170\tspruce_leaves\tpersistent\ttrue\tdistance\t7\n171\tspruce_leaves\tpersistent\tfalse\tdistance\t7\n172\tbirch_leaves\tpersistent\ttrue\tdistance\t1\n173\tbirch_leaves\tpersistent\tfalse\tdistance\t1\n174\tbirch_leaves\tpersistent\ttrue\tdistance\t2\n175\tbirch_leaves\tpersistent\tfalse\tdistance\t2\n176\tbirch_leaves\tpersistent\ttrue\tdistance\t3\n177\tbirch_leaves\tpersistent\tfalse\tdistance\t3\n178\tbirch_leaves\tpersistent\ttrue\tdistance\t4\n179\tbirch_leaves\tpersistent\tfalse\tdistance\t4\n180\tbirch_leaves\tpersistent\ttrue\tdistance\t5\n181\tbirch_leaves\tpersistent\tfalse\tdistance\t5\n182\tbirch_leaves\tpersistent\ttrue\tdistance\t6\n183\tbirch_leaves\tpersistent\tfalse\tdistance\t6\n184\tbirch_leaves\tpersistent\ttrue\tdistance\t7\n185\tbirch_leaves\tpersistent\tfalse\tdistance\t7\n186\tjungle_leaves\tpersistent\ttrue\tdistance\t1\n187\tjungle_leaves\tpersistent\tfalse\tdistance\t1\n188\tjungle_leaves\tpersistent\ttrue\tdistance\t2\n189\tjungle_leaves\tpersistent\tfalse\tdistance\t2\n190\tjungle_leaves\tpersistent\ttrue\tdistance\t3\n191\tjungle_leaves\tpersistent\tfalse\tdistance\t3\n192\tjungle_leaves\tpersistent\ttrue\tdistance\t4\n193\tjungle_leaves\tpersistent\tfalse\tdistance\t4\n194\tjungle_leaves\tpersistent\ttrue\tdistance\t5\n195\tjungle_leaves\tpersistent\tfalse\tdistance\t5\n196\tjungle_leaves\tpersistent\ttrue\tdistance\t6\n197\tjungle_leaves\tpersistent\tfalse\tdistance\t6\n198\tjungle_leaves\tpersistent\ttrue\tdistance\t7\n199\tjungle_leaves\tpersistent\tfalse\tdistance\t7\n200\tacacia_leaves\tpersistent\ttrue\tdistance\t1\n201\tacacia_leaves\tpersistent\tfalse\tdistance\t1\n202\tacacia_leaves\tpersistent\ttrue\tdistance\t2\n203\tacacia_leaves\tpersistent\tfalse\tdistance\t2\n204\tacacia_leaves\tpersistent\ttrue\tdistance\t3\n205\tacacia_leaves\tpersistent\tfalse\tdistance\t3\n206\tacacia_leaves\tpersistent\ttrue\tdistance\t4\n207\tacacia_leaves\tpersistent\tfalse\tdistance\t4\n208\tacacia_leaves\tpersistent\ttrue\tdistance\t5\n209\tacacia_leaves\tpersistent\tfalse\tdistance\t5\n210\tacacia_leaves\tpersistent\ttrue\tdistance\t6\n211\tacacia_leaves\tpersistent\tfalse\tdistance\t6\n212\tacacia_leaves\tpersistent\ttrue\tdistance\t7\n213\tacacia_leaves\tpersistent\tfalse\tdistance\t7\n214\tdark_oak_leaves\tpersistent\ttrue\tdistance\t1\n215\tdark_oak_leaves\tpersistent\tfalse\tdistance\t1\n216\tdark_oak_leaves\tpersistent\ttrue\tdistance\t2\n217\tdark_oak_leaves\tpersistent\tfalse\tdistance\t2\n218\tdark_oak_leaves\tpersistent\ttrue\tdistance\t3\n219\tdark_oak_leaves\tpersistent\tfalse\tdistance\t3\n220\tdark_oak_leaves\tpersistent\ttrue\tdistance\t4\n221\tdark_oak_leaves\tpersistent\tfalse\tdistance\t4\n222\tdark_oak_leaves\tpersistent\ttrue\tdistance\t5\n223\tdark_oak_leaves\tpersistent\tfalse\tdistance\t5\n224\tdark_oak_leaves\tpersistent\ttrue\tdistance\t6\n225\tdark_oak_leaves\tpersistent\tfalse\tdistance\t6\n226\tdark_oak_leaves\tpersistent\ttrue\tdistance\t7\n227\tdark_oak_leaves\tpersistent\tfalse\tdistance\t7\n228\tsponge\n229\twet_sponge\n230\tglass\n231\tlapis_ore\n232\tlapis_block\n233\tdispenser\tfacing\tnorth\ttriggered\ttrue\n234\tdispenser\tfacing\tnorth\ttriggered\tfalse\n235\tdispenser\tfacing\teast\ttriggered\ttrue\n236\tdispenser\tfacing\teast\ttriggered\tfalse\n237\tdispenser\tfacing\tsouth\ttriggered\ttrue\n238\tdispenser\tfacing\tsouth\ttriggered\tfalse\n239\tdispenser\tfacing\twest\ttriggered\ttrue\n240\tdispenser\tfacing\twest\ttriggered\tfalse\n241\tdispenser\tfacing\tup\ttriggered\ttrue\n242\tdispenser\tfacing\tup\ttriggered\tfalse\n243\tdispenser\tfacing\tdown\ttriggered\ttrue\n244\tdispenser\tfacing\tdown\ttriggered\tfalse\n245\tsandstone\n246\tchiseled_sandstone\n247\tcut_sandstone\n248\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t0\n249\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t0\n250\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t1\n251\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t1\n252\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t2\n253\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t2\n254\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t3\n255\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t3\n256\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t4\n257\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t4\n258\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t5\n259\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t5\n260\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t6\n261\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t6\n262\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t7\n263\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t7\n264\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t8\n265\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t8\n266\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t9\n267\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t9\n268\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t10\n269\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t10\n270\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t11\n271\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t11\n272\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t12\n273\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t12\n274\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t13\n275\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t13\n276\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t14\n277\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t14\n278\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t15\n279\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t15\n280\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t16\n281\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t16\n282\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t17\n283\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t17\n284\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t18\n285\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t18\n286\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t19\n287\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t19\n288\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t20\n289\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t20\n290\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t21\n291\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t21\n292\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t22\n293\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t22\n294\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t23\n295\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t23\n296\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t24\n297\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t24\n298\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t0\n299\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t0\n300\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t1\n301\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t1\n302\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t2\n303\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t2\n304\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t3\n305\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t3\n306\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t4\n307\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t4\n308\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t5\n309\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t5\n310\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t6\n311\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t6\n312\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t7\n313\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t7\n314\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t8\n315\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t8\n316\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t9\n317\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t9\n318\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t10\n319\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t10\n320\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t11\n321\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t11\n322\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t12\n323\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t12\n324\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t13\n325\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t13\n326\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t14\n327\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t14\n328\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t15\n329\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t15\n330\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t16\n331\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t16\n332\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t17\n333\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t17\n334\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t18\n335\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t18\n336\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t19\n337\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t19\n338\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t20\n339\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t20\n340\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t21\n341\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t21\n342\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t22\n343\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t22\n344\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t23\n345\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t23\n346\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t24\n347\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t24\n348\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t0\n349\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t0\n350\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t1\n351\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t1\n352\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t2\n353\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t2\n354\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t3\n355\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t3\n356\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t4\n357\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t4\n358\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t5\n359\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t5\n360\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t6\n361\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t6\n362\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t7\n363\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t7\n364\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t8\n365\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t8\n366\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t9\n367\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t9\n368\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t10\n369\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t10\n370\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t11\n371\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t11\n372\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t12\n373\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t12\n374\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t13\n375\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t13\n376\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t14\n377\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t14\n378\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t15\n379\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t15\n380\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t16\n381\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t16\n382\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t17\n383\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t17\n384\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t18\n385\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t18\n386\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t19\n387\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t19\n388\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t20\n389\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t20\n390\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t21\n391\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t21\n392\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t22\n393\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t22\n394\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t23\n395\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t23\n396\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t24\n397\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t24\n398\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t0\n399\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t0\n400\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t1\n401\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t1\n402\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t2\n403\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t2\n404\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t3\n405\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t3\n406\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t4\n407\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t4\n408\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t5\n409\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t5\n410\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t6\n411\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t6\n412\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t7\n413\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t7\n414\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t8\n415\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t8\n416\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t9\n417\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t9\n418\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t10\n419\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t10\n420\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t11\n421\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t11\n422\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t12\n423\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t12\n424\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t13\n425\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t13\n426\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t14\n427\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t14\n428\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t15\n429\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t15\n430\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t16\n431\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t16\n432\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t17\n433\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t17\n434\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t18\n435\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t18\n436\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t19\n437\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t19\n438\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t20\n439\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t20\n440\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t21\n441\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t21\n442\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t22\n443\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t22\n444\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t23\n445\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t23\n446\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t24\n447\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t24\n448\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t0\n449\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t0\n450\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t1\n451\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t1\n452\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t2\n453\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t2\n454\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t3\n455\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t3\n456\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t4\n457\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t4\n458\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t5\n459\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t5\n460\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t6\n461\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t6\n462\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t7\n463\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t7\n464\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t8\n465\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t8\n466\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t9\n467\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t9\n468\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t10\n469\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t10\n470\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t11\n471\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t11\n472\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t12\n473\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t12\n474\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t13\n475\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t13\n476\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t14\n477\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t14\n478\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t15\n479\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t15\n480\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t16\n481\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t16\n482\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t17\n483\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t17\n484\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t18\n485\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t18\n486\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t19\n487\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t19\n488\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t20\n489\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t20\n490\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t21\n491\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t21\n492\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t22\n493\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t22\n494\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t23\n495\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t23\n496\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t24\n497\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t24\n498\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t0\n499\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t0\n500\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t1\n501\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t1\n502\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t2\n503\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t2\n504\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t3\n505\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t3\n506\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t4\n507\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t4\n508\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t5\n509\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t5\n510\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t6\n511\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t6\n512\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t7\n513\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t7\n514\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t8\n515\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t8\n516\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t9\n517\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t9\n518\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t10\n519\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t10\n520\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t11\n521\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t11\n522\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t12\n523\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t12\n524\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t13\n525\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t13\n526\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t14\n527\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t14\n528\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t15\n529\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t15\n530\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t16\n531\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t16\n532\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t17\n533\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t17\n534\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t18\n535\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t18\n536\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t19\n537\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t19\n538\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t20\n539\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t20\n540\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t21\n541\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t21\n542\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t22\n543\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t22\n544\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t23\n545\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t23\n546\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t24\n547\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t24\n548\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t0\n549\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t0\n550\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t1\n551\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t1\n552\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t2\n553\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t2\n554\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t3\n555\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t3\n556\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t4\n557\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t4\n558\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t5\n559\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t5\n560\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t6\n561\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t6\n562\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t7\n563\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t7\n564\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t8\n565\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t8\n566\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t9\n567\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t9\n568\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t10\n569\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t10\n570\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t11\n571\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t11\n572\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t12\n573\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t12\n574\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t13\n575\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t13\n576\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t14\n577\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t14\n578\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t15\n579\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t15\n580\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t16\n581\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t16\n582\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t17\n583\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t17\n584\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t18\n585\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t18\n586\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t19\n587\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t19\n588\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t20\n589\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t20\n590\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t21\n591\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t21\n592\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t22\n593\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t22\n594\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t23\n595\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t23\n596\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t24\n597\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t24\n598\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t0\n599\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t0\n600\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t1\n601\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t1\n602\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t2\n603\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t2\n604\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t3\n605\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t3\n606\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t4\n607\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t4\n608\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t5\n609\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t5\n610\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t6\n611\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t6\n612\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t7\n613\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t7\n614\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t8\n615\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t8\n616\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t9\n617\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t9\n618\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t10\n619\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t10\n620\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t11\n621\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t11\n622\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t12\n623\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t12\n624\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t13\n625\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t13\n626\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t14\n627\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t14\n628\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t15\n629\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t15\n630\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t16\n631\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t16\n632\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t17\n633\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t17\n634\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t18\n635\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t18\n636\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t19\n637\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t19\n638\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t20\n639\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t20\n640\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t21\n641\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t21\n642\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t22\n643\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t22\n644\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t23\n645\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t23\n646\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t24\n647\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t24\n648\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t0\n649\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t0\n650\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t1\n651\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t1\n652\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t2\n653\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t2\n654\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t3\n655\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t3\n656\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t4\n657\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t4\n658\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t5\n659\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t5\n660\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t6\n661\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t6\n662\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t7\n663\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t7\n664\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t8\n665\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t8\n666\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t9\n667\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t9\n668\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t10\n669\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t10\n670\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t11\n671\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t11\n672\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t12\n673\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t12\n674\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t13\n675\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t13\n676\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t14\n677\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t14\n678\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t15\n679\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t15\n680\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t16\n681\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t16\n682\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t17\n683\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t17\n684\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t18\n685\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t18\n686\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t19\n687\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t19\n688\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t20\n689\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t20\n690\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t21\n691\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t21\n692\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t22\n693\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t22\n694\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t23\n695\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t23\n696\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t24\n697\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t24\n698\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t0\n699\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t0\n700\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t1\n701\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t1\n702\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t2\n703\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t2\n704\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t3\n705\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t3\n706\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t4\n707\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t4\n708\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t5\n709\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t5\n710\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t6\n711\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t6\n712\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t7\n713\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t7\n714\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t8\n715\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t8\n716\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t9\n717\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t9\n718\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t10\n719\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t10\n720\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t11\n721\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t11\n722\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t12\n723\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t12\n724\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t13\n725\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t13\n726\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t14\n727\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t14\n728\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t15\n729\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t15\n730\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t16\n731\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t16\n732\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t17\n733\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t17\n734\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t18\n735\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t18\n736\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t19\n737\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t19\n738\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t20\n739\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t20\n740\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t21\n741\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t21\n742\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t22\n743\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t22\n744\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t23\n745\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t23\n746\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t24\n747\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t24\n748\twhite_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n749\twhite_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n750\twhite_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n751\twhite_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n752\twhite_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n753\twhite_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n754\twhite_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n755\twhite_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n756\twhite_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n757\twhite_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n758\twhite_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n759\twhite_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n760\twhite_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n761\twhite_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n762\twhite_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n763\twhite_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n764\torange_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n765\torange_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n766\torange_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n767\torange_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n768\torange_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n769\torange_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n770\torange_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n771\torange_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n772\torange_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n773\torange_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n774\torange_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n775\torange_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n776\torange_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n777\torange_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n778\torange_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n779\torange_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n780\tmagenta_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n781\tmagenta_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n782\tmagenta_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n783\tmagenta_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n784\tmagenta_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n785\tmagenta_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n786\tmagenta_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n787\tmagenta_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n788\tmagenta_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n789\tmagenta_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n790\tmagenta_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n791\tmagenta_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n792\tmagenta_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n793\tmagenta_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n794\tmagenta_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n795\tmagenta_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n796\tlight_blue_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n797\tlight_blue_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n798\tlight_blue_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n799\tlight_blue_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n800\tlight_blue_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n801\tlight_blue_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n802\tlight_blue_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n803\tlight_blue_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n804\tlight_blue_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n805\tlight_blue_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n806\tlight_blue_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n807\tlight_blue_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n808\tlight_blue_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n809\tlight_blue_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n810\tlight_blue_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n811\tlight_blue_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n812\tyellow_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n813\tyellow_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n814\tyellow_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n815\tyellow_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n816\tyellow_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n817\tyellow_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n818\tyellow_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n819\tyellow_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n820\tyellow_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n821\tyellow_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n822\tyellow_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n823\tyellow_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n824\tyellow_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n825\tyellow_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n826\tyellow_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n827\tyellow_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n828\tlime_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n829\tlime_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n830\tlime_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n831\tlime_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n832\tlime_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n833\tlime_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n834\tlime_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n835\tlime_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n836\tlime_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n837\tlime_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n838\tlime_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n839\tlime_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n840\tlime_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n841\tlime_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n842\tlime_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n843\tlime_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n844\tpink_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n845\tpink_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n846\tpink_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n847\tpink_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n848\tpink_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n849\tpink_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n850\tpink_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n851\tpink_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n852\tpink_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n853\tpink_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n854\tpink_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n855\tpink_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n856\tpink_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n857\tpink_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n858\tpink_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n859\tpink_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n860\tgray_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n861\tgray_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n862\tgray_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n863\tgray_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n864\tgray_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n865\tgray_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n866\tgray_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n867\tgray_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n868\tgray_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n869\tgray_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n870\tgray_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n871\tgray_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n872\tgray_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n873\tgray_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n874\tgray_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n875\tgray_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n876\tlight_gray_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n877\tlight_gray_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n878\tlight_gray_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n879\tlight_gray_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n880\tlight_gray_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n881\tlight_gray_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n882\tlight_gray_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n883\tlight_gray_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n884\tlight_gray_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n885\tlight_gray_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n886\tlight_gray_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n887\tlight_gray_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n888\tlight_gray_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n889\tlight_gray_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n890\tlight_gray_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n891\tlight_gray_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n892\tcyan_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n893\tcyan_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n894\tcyan_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n895\tcyan_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n896\tcyan_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n897\tcyan_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n898\tcyan_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n899\tcyan_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n900\tcyan_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n901\tcyan_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n902\tcyan_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n903\tcyan_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n904\tcyan_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n905\tcyan_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n906\tcyan_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n907\tcyan_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n908\tpurple_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n909\tpurple_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n910\tpurple_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n911\tpurple_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n912\tpurple_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n913\tpurple_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n914\tpurple_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n915\tpurple_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n916\tpurple_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n917\tpurple_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n918\tpurple_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n919\tpurple_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n920\tpurple_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n921\tpurple_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n922\tpurple_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n923\tpurple_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n924\tblue_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n925\tblue_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n926\tblue_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n927\tblue_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n928\tblue_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n929\tblue_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n930\tblue_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n931\tblue_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n932\tblue_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n933\tblue_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n934\tblue_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n935\tblue_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n936\tblue_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n937\tblue_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n938\tblue_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n939\tblue_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n940\tbrown_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n941\tbrown_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n942\tbrown_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n943\tbrown_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n944\tbrown_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n945\tbrown_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n946\tbrown_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n947\tbrown_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n948\tbrown_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n949\tbrown_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n950\tbrown_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n951\tbrown_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n952\tbrown_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n953\tbrown_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n954\tbrown_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n955\tbrown_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n956\tgreen_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n957\tgreen_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n958\tgreen_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n959\tgreen_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n960\tgreen_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n961\tgreen_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n962\tgreen_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n963\tgreen_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n964\tgreen_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n965\tgreen_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n966\tgreen_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n967\tgreen_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n968\tgreen_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n969\tgreen_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n970\tgreen_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n971\tgreen_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n972\tred_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n973\tred_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n974\tred_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n975\tred_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n976\tred_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n977\tred_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n978\tred_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n979\tred_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n980\tred_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n981\tred_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n982\tred_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n983\tred_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n984\tred_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n985\tred_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n986\tred_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n987\tred_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n988\tblack_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n989\tblack_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n990\tblack_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n991\tblack_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n992\tblack_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n993\tblack_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n994\tblack_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n995\tblack_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n996\tblack_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n997\tblack_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n998\tblack_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n999\tblack_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1000\tblack_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1001\tblack_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1002\tblack_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1003\tblack_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1004\tpowered_rail\tshape\tnorth_south\tpowered\ttrue\n1005\tpowered_rail\tshape\teast_west\tpowered\ttrue\n1006\tpowered_rail\tshape\tascending_east\tpowered\ttrue\n1007\tpowered_rail\tshape\tascending_west\tpowered\ttrue\n1008\tpowered_rail\tshape\tascending_north\tpowered\ttrue\n1009\tpowered_rail\tshape\tascending_south\tpowered\ttrue\n1010\tpowered_rail\tshape\tnorth_south\tpowered\tfalse\n1011\tpowered_rail\tshape\teast_west\tpowered\tfalse\n1012\tpowered_rail\tshape\tascending_east\tpowered\tfalse\n1013\tpowered_rail\tshape\tascending_west\tpowered\tfalse\n1014\tpowered_rail\tshape\tascending_north\tpowered\tfalse\n1015\tpowered_rail\tshape\tascending_south\tpowered\tfalse\n1016\tdetector_rail\tshape\tnorth_south\tpowered\ttrue\n1017\tdetector_rail\tshape\teast_west\tpowered\ttrue\n1018\tdetector_rail\tshape\tascending_east\tpowered\ttrue\n1019\tdetector_rail\tshape\tascending_west\tpowered\ttrue\n1020\tdetector_rail\tshape\tascending_north\tpowered\ttrue\n1021\tdetector_rail\tshape\tascending_south\tpowered\ttrue\n1022\tdetector_rail\tshape\tnorth_south\tpowered\tfalse\n1023\tdetector_rail\tshape\teast_west\tpowered\tfalse\n1024\tdetector_rail\tshape\tascending_east\tpowered\tfalse\n1025\tdetector_rail\tshape\tascending_west\tpowered\tfalse\n1026\tdetector_rail\tshape\tascending_north\tpowered\tfalse\n1027\tdetector_rail\tshape\tascending_south\tpowered\tfalse\n1028\tsticky_piston\tfacing\tnorth\textended\ttrue\n1029\tsticky_piston\tfacing\teast\textended\ttrue\n1030\tsticky_piston\tfacing\tsouth\textended\ttrue\n1031\tsticky_piston\tfacing\twest\textended\ttrue\n1032\tsticky_piston\tfacing\tup\textended\ttrue\n1033\tsticky_piston\tfacing\tdown\textended\ttrue\n1034\tsticky_piston\tfacing\tnorth\textended\tfalse\n1035\tsticky_piston\tfacing\teast\textended\tfalse\n1036\tsticky_piston\tfacing\tsouth\textended\tfalse\n1037\tsticky_piston\tfacing\twest\textended\tfalse\n1038\tsticky_piston\tfacing\tup\textended\tfalse\n1039\tsticky_piston\tfacing\tdown\textended\tfalse\n1040\tcobweb\n1041\tgrass\n1042\tfern\n1043\tdead_bush\n1044\tseagrass\n1045\ttall_seagrass\thalf\tupper\n1046\ttall_seagrass\thalf\tlower\n1047\tpiston\tfacing\tnorth\textended\ttrue\n1048\tpiston\tfacing\teast\textended\ttrue\n1049\tpiston\tfacing\tsouth\textended\ttrue\n1050\tpiston\tfacing\twest\textended\ttrue\n1051\tpiston\tfacing\tup\textended\ttrue\n1052\tpiston\tfacing\tdown\textended\ttrue\n1053\tpiston\tfacing\tnorth\textended\tfalse\n1054\tpiston\tfacing\teast\textended\tfalse\n1055\tpiston\tfacing\tsouth\textended\tfalse\n1056\tpiston\tfacing\twest\textended\tfalse\n1057\tpiston\tfacing\tup\textended\tfalse\n1058\tpiston\tfacing\tdown\textended\tfalse\n1059\tpiston_head\tfacing\tnorth\tshort\ttrue\ttype\tnormal\n1060\tpiston_head\tfacing\tnorth\tshort\ttrue\ttype\tsticky\n1061\tpiston_head\tfacing\tnorth\tshort\tfalse\ttype\tnormal\n1062\tpiston_head\tfacing\tnorth\tshort\tfalse\ttype\tsticky\n1063\tpiston_head\tfacing\teast\tshort\ttrue\ttype\tnormal\n1064\tpiston_head\tfacing\teast\tshort\ttrue\ttype\tsticky\n1065\tpiston_head\tfacing\teast\tshort\tfalse\ttype\tnormal\n1066\tpiston_head\tfacing\teast\tshort\tfalse\ttype\tsticky\n1067\tpiston_head\tfacing\tsouth\tshort\ttrue\ttype\tnormal\n1068\tpiston_head\tfacing\tsouth\tshort\ttrue\ttype\tsticky\n1069\tpiston_head\tfacing\tsouth\tshort\tfalse\ttype\tnormal\n1070\tpiston_head\tfacing\tsouth\tshort\tfalse\ttype\tsticky\n1071\tpiston_head\tfacing\twest\tshort\ttrue\ttype\tnormal\n1072\tpiston_head\tfacing\twest\tshort\ttrue\ttype\tsticky\n1073\tpiston_head\tfacing\twest\tshort\tfalse\ttype\tnormal\n1074\tpiston_head\tfacing\twest\tshort\tfalse\ttype\tsticky\n1075\tpiston_head\tfacing\tup\tshort\ttrue\ttype\tnormal\n1076\tpiston_head\tfacing\tup\tshort\ttrue\ttype\tsticky\n1077\tpiston_head\tfacing\tup\tshort\tfalse\ttype\tnormal\n1078\tpiston_head\tfacing\tup\tshort\tfalse\ttype\tsticky\n1079\tpiston_head\tfacing\tdown\tshort\ttrue\ttype\tnormal\n1080\tpiston_head\tfacing\tdown\tshort\ttrue\ttype\tsticky\n1081\tpiston_head\tfacing\tdown\tshort\tfalse\ttype\tnormal\n1082\tpiston_head\tfacing\tdown\tshort\tfalse\ttype\tsticky\n1083\twhite_wool\n1084\torange_wool\n1085\tmagenta_wool\n1086\tlight_blue_wool\n1087\tyellow_wool\n1088\tlime_wool\n1089\tpink_wool\n1090\tgray_wool\n1091\tlight_gray_wool\n1092\tcyan_wool\n1093\tpurple_wool\n1094\tblue_wool\n1095\tbrown_wool\n1096\tgreen_wool\n1097\tred_wool\n1098\tblack_wool\n1099\tmoving_piston\tfacing\tnorth\ttype\tnormal\n1100\tmoving_piston\tfacing\tnorth\ttype\tsticky\n1101\tmoving_piston\tfacing\teast\ttype\tnormal\n1102\tmoving_piston\tfacing\teast\ttype\tsticky\n1103\tmoving_piston\tfacing\tsouth\ttype\tnormal\n1104\tmoving_piston\tfacing\tsouth\ttype\tsticky\n1105\tmoving_piston\tfacing\twest\ttype\tnormal\n1106\tmoving_piston\tfacing\twest\ttype\tsticky\n1107\tmoving_piston\tfacing\tup\ttype\tnormal\n1108\tmoving_piston\tfacing\tup\ttype\tsticky\n1109\tmoving_piston\tfacing\tdown\ttype\tnormal\n1110\tmoving_piston\tfacing\tdown\ttype\tsticky\n1111\tdandelion\n1112\tpoppy\n1113\tblue_orchid\n1114\tallium\n1115\tazure_bluet\n1116\tred_tulip\n1117\torange_tulip\n1118\twhite_tulip\n1119\tpink_tulip\n1120\toxeye_daisy\n1121\tbrown_mushroom\n1122\tred_mushroom\n1123\tgold_block\n1124\tiron_block\n1125\tbricks\n1126\ttnt\n1127\tbookshelf\n1128\tmossy_cobblestone\n1129\tobsidian\n1130\ttorch\n1131\twall_torch\tfacing\tnorth\n1132\twall_torch\tfacing\tsouth\n1133\twall_torch\tfacing\twest\n1134\twall_torch\tfacing\teast\n1135\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t0\tup\ttrue\twest\ttrue\n1136\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t0\tup\ttrue\twest\tfalse\n1137\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t0\tup\tfalse\twest\ttrue\n1138\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t0\tup\tfalse\twest\tfalse\n1139\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t0\tup\ttrue\twest\ttrue\n1140\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t0\tup\ttrue\twest\tfalse\n1141\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t0\tup\tfalse\twest\ttrue\n1142\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t0\tup\tfalse\twest\tfalse\n1143\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t0\tup\ttrue\twest\ttrue\n1144\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t0\tup\ttrue\twest\tfalse\n1145\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t0\tup\tfalse\twest\ttrue\n1146\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t0\tup\tfalse\twest\tfalse\n1147\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t0\tup\ttrue\twest\ttrue\n1148\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t0\tup\ttrue\twest\tfalse\n1149\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t0\tup\tfalse\twest\ttrue\n1150\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t0\tup\tfalse\twest\tfalse\n1151\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t0\tup\ttrue\twest\ttrue\n1152\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t0\tup\ttrue\twest\tfalse\n1153\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t0\tup\tfalse\twest\ttrue\n1154\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n1155\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t0\tup\ttrue\twest\ttrue\n1156\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t0\tup\ttrue\twest\tfalse\n1157\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\ttrue\n1158\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n1159\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t0\tup\ttrue\twest\ttrue\n1160\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t0\tup\ttrue\twest\tfalse\n1161\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t0\tup\tfalse\twest\ttrue\n1162\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n1163\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\ttrue\twest\ttrue\n1164\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\ttrue\twest\tfalse\n1165\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\ttrue\n1166\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n1167\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t1\tup\ttrue\twest\ttrue\n1168\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t1\tup\ttrue\twest\tfalse\n1169\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t1\tup\tfalse\twest\ttrue\n1170\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t1\tup\tfalse\twest\tfalse\n1171\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t1\tup\ttrue\twest\ttrue\n1172\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t1\tup\ttrue\twest\tfalse\n1173\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t1\tup\tfalse\twest\ttrue\n1174\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t1\tup\tfalse\twest\tfalse\n1175\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t1\tup\ttrue\twest\ttrue\n1176\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t1\tup\ttrue\twest\tfalse\n1177\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t1\tup\tfalse\twest\ttrue\n1178\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t1\tup\tfalse\twest\tfalse\n1179\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t1\tup\ttrue\twest\ttrue\n1180\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t1\tup\ttrue\twest\tfalse\n1181\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t1\tup\tfalse\twest\ttrue\n1182\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t1\tup\tfalse\twest\tfalse\n1183\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t1\tup\ttrue\twest\ttrue\n1184\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t1\tup\ttrue\twest\tfalse\n1185\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t1\tup\tfalse\twest\ttrue\n1186\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n1187\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t1\tup\ttrue\twest\ttrue\n1188\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t1\tup\ttrue\twest\tfalse\n1189\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\ttrue\n1190\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n1191\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t1\tup\ttrue\twest\ttrue\n1192\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t1\tup\ttrue\twest\tfalse\n1193\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t1\tup\tfalse\twest\ttrue\n1194\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n1195\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\ttrue\twest\ttrue\n1196\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\ttrue\twest\tfalse\n1197\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\ttrue\n1198\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n1199\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t2\tup\ttrue\twest\ttrue\n1200\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t2\tup\ttrue\twest\tfalse\n1201\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t2\tup\tfalse\twest\ttrue\n1202\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t2\tup\tfalse\twest\tfalse\n1203\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t2\tup\ttrue\twest\ttrue\n1204\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t2\tup\ttrue\twest\tfalse\n1205\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t2\tup\tfalse\twest\ttrue\n1206\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t2\tup\tfalse\twest\tfalse\n1207\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t2\tup\ttrue\twest\ttrue\n1208\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t2\tup\ttrue\twest\tfalse\n1209\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t2\tup\tfalse\twest\ttrue\n1210\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t2\tup\tfalse\twest\tfalse\n1211\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t2\tup\ttrue\twest\ttrue\n1212\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t2\tup\ttrue\twest\tfalse\n1213\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t2\tup\tfalse\twest\ttrue\n1214\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t2\tup\tfalse\twest\tfalse\n1215\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t2\tup\ttrue\twest\ttrue\n1216\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t2\tup\ttrue\twest\tfalse\n1217\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t2\tup\tfalse\twest\ttrue\n1218\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n1219\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t2\tup\ttrue\twest\ttrue\n1220\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t2\tup\ttrue\twest\tfalse\n1221\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\ttrue\n1222\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n1223\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t2\tup\ttrue\twest\ttrue\n1224\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t2\tup\ttrue\twest\tfalse\n1225\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t2\tup\tfalse\twest\ttrue\n1226\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n1227\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\ttrue\twest\ttrue\n1228\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\ttrue\twest\tfalse\n1229\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\ttrue\n1230\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n1231\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t3\tup\ttrue\twest\ttrue\n1232\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t3\tup\ttrue\twest\tfalse\n1233\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t3\tup\tfalse\twest\ttrue\n1234\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t3\tup\tfalse\twest\tfalse\n1235\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t3\tup\ttrue\twest\ttrue\n1236\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t3\tup\ttrue\twest\tfalse\n1237\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t3\tup\tfalse\twest\ttrue\n1238\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t3\tup\tfalse\twest\tfalse\n1239\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t3\tup\ttrue\twest\ttrue\n1240\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t3\tup\ttrue\twest\tfalse\n1241\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t3\tup\tfalse\twest\ttrue\n1242\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t3\tup\tfalse\twest\tfalse\n1243\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t3\tup\ttrue\twest\ttrue\n1244\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t3\tup\ttrue\twest\tfalse\n1245\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t3\tup\tfalse\twest\ttrue\n1246\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t3\tup\tfalse\twest\tfalse\n1247\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t3\tup\ttrue\twest\ttrue\n1248\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t3\tup\ttrue\twest\tfalse\n1249\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t3\tup\tfalse\twest\ttrue\n1250\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n1251\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t3\tup\ttrue\twest\ttrue\n1252\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t3\tup\ttrue\twest\tfalse\n1253\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\ttrue\n1254\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n1255\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t3\tup\ttrue\twest\ttrue\n1256\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t3\tup\ttrue\twest\tfalse\n1257\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t3\tup\tfalse\twest\ttrue\n1258\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n1259\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\ttrue\twest\ttrue\n1260\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\ttrue\twest\tfalse\n1261\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\ttrue\n1262\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n1263\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t4\tup\ttrue\twest\ttrue\n1264\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t4\tup\ttrue\twest\tfalse\n1265\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t4\tup\tfalse\twest\ttrue\n1266\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t4\tup\tfalse\twest\tfalse\n1267\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t4\tup\ttrue\twest\ttrue\n1268\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t4\tup\ttrue\twest\tfalse\n1269\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t4\tup\tfalse\twest\ttrue\n1270\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t4\tup\tfalse\twest\tfalse\n1271\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t4\tup\ttrue\twest\ttrue\n1272\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t4\tup\ttrue\twest\tfalse\n1273\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t4\tup\tfalse\twest\ttrue\n1274\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t4\tup\tfalse\twest\tfalse\n1275\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t4\tup\ttrue\twest\ttrue\n1276\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t4\tup\ttrue\twest\tfalse\n1277\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t4\tup\tfalse\twest\ttrue\n1278\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t4\tup\tfalse\twest\tfalse\n1279\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t4\tup\ttrue\twest\ttrue\n1280\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t4\tup\ttrue\twest\tfalse\n1281\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t4\tup\tfalse\twest\ttrue\n1282\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n1283\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t4\tup\ttrue\twest\ttrue\n1284\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t4\tup\ttrue\twest\tfalse\n1285\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\ttrue\n1286\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n1287\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t4\tup\ttrue\twest\ttrue\n1288\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t4\tup\ttrue\twest\tfalse\n1289\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t4\tup\tfalse\twest\ttrue\n1290\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n1291\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\ttrue\twest\ttrue\n1292\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\ttrue\twest\tfalse\n1293\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\ttrue\n1294\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n1295\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t5\tup\ttrue\twest\ttrue\n1296\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t5\tup\ttrue\twest\tfalse\n1297\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t5\tup\tfalse\twest\ttrue\n1298\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t5\tup\tfalse\twest\tfalse\n1299\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t5\tup\ttrue\twest\ttrue\n1300\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t5\tup\ttrue\twest\tfalse\n1301\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t5\tup\tfalse\twest\ttrue\n1302\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t5\tup\tfalse\twest\tfalse\n1303\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t5\tup\ttrue\twest\ttrue\n1304\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t5\tup\ttrue\twest\tfalse\n1305\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t5\tup\tfalse\twest\ttrue\n1306\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t5\tup\tfalse\twest\tfalse\n1307\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t5\tup\ttrue\twest\ttrue\n1308\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t5\tup\ttrue\twest\tfalse\n1309\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t5\tup\tfalse\twest\ttrue\n1310\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t5\tup\tfalse\twest\tfalse\n1311\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t5\tup\ttrue\twest\ttrue\n1312\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t5\tup\ttrue\twest\tfalse\n1313\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t5\tup\tfalse\twest\ttrue\n1314\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n1315\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t5\tup\ttrue\twest\ttrue\n1316\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t5\tup\ttrue\twest\tfalse\n1317\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\ttrue\n1318\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n1319\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t5\tup\ttrue\twest\ttrue\n1320\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t5\tup\ttrue\twest\tfalse\n1321\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t5\tup\tfalse\twest\ttrue\n1322\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n1323\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\ttrue\twest\ttrue\n1324\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\ttrue\twest\tfalse\n1325\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\ttrue\n1326\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n1327\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t6\tup\ttrue\twest\ttrue\n1328\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t6\tup\ttrue\twest\tfalse\n1329\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t6\tup\tfalse\twest\ttrue\n1330\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t6\tup\tfalse\twest\tfalse\n1331\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t6\tup\ttrue\twest\ttrue\n1332\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t6\tup\ttrue\twest\tfalse\n1333\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t6\tup\tfalse\twest\ttrue\n1334\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t6\tup\tfalse\twest\tfalse\n1335\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t6\tup\ttrue\twest\ttrue\n1336\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t6\tup\ttrue\twest\tfalse\n1337\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t6\tup\tfalse\twest\ttrue\n1338\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t6\tup\tfalse\twest\tfalse\n1339\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t6\tup\ttrue\twest\ttrue\n1340\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t6\tup\ttrue\twest\tfalse\n1341\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t6\tup\tfalse\twest\ttrue\n1342\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t6\tup\tfalse\twest\tfalse\n1343\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t6\tup\ttrue\twest\ttrue\n1344\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t6\tup\ttrue\twest\tfalse\n1345\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t6\tup\tfalse\twest\ttrue\n1346\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n1347\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t6\tup\ttrue\twest\ttrue\n1348\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t6\tup\ttrue\twest\tfalse\n1349\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\ttrue\n1350\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n1351\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t6\tup\ttrue\twest\ttrue\n1352\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t6\tup\ttrue\twest\tfalse\n1353\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t6\tup\tfalse\twest\ttrue\n1354\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n1355\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\ttrue\twest\ttrue\n1356\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\ttrue\twest\tfalse\n1357\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\ttrue\n1358\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n1359\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t7\tup\ttrue\twest\ttrue\n1360\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t7\tup\ttrue\twest\tfalse\n1361\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t7\tup\tfalse\twest\ttrue\n1362\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t7\tup\tfalse\twest\tfalse\n1363\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t7\tup\ttrue\twest\ttrue\n1364\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t7\tup\ttrue\twest\tfalse\n1365\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t7\tup\tfalse\twest\ttrue\n1366\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t7\tup\tfalse\twest\tfalse\n1367\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t7\tup\ttrue\twest\ttrue\n1368\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t7\tup\ttrue\twest\tfalse\n1369\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t7\tup\tfalse\twest\ttrue\n1370\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t7\tup\tfalse\twest\tfalse\n1371\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t7\tup\ttrue\twest\ttrue\n1372\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t7\tup\ttrue\twest\tfalse\n1373\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t7\tup\tfalse\twest\ttrue\n1374\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t7\tup\tfalse\twest\tfalse\n1375\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t7\tup\ttrue\twest\ttrue\n1376\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t7\tup\ttrue\twest\tfalse\n1377\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t7\tup\tfalse\twest\ttrue\n1378\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n1379\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t7\tup\ttrue\twest\ttrue\n1380\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t7\tup\ttrue\twest\tfalse\n1381\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\ttrue\n1382\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n1383\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t7\tup\ttrue\twest\ttrue\n1384\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t7\tup\ttrue\twest\tfalse\n1385\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t7\tup\tfalse\twest\ttrue\n1386\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n1387\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\ttrue\twest\ttrue\n1388\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\ttrue\twest\tfalse\n1389\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\ttrue\n1390\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n1391\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t8\tup\ttrue\twest\ttrue\n1392\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t8\tup\ttrue\twest\tfalse\n1393\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t8\tup\tfalse\twest\ttrue\n1394\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t8\tup\tfalse\twest\tfalse\n1395\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t8\tup\ttrue\twest\ttrue\n1396\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t8\tup\ttrue\twest\tfalse\n1397\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t8\tup\tfalse\twest\ttrue\n1398\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t8\tup\tfalse\twest\tfalse\n1399\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t8\tup\ttrue\twest\ttrue\n1400\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t8\tup\ttrue\twest\tfalse\n1401\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t8\tup\tfalse\twest\ttrue\n1402\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t8\tup\tfalse\twest\tfalse\n1403\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t8\tup\ttrue\twest\ttrue\n1404\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t8\tup\ttrue\twest\tfalse\n1405\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t8\tup\tfalse\twest\ttrue\n1406\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t8\tup\tfalse\twest\tfalse\n1407\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t8\tup\ttrue\twest\ttrue\n1408\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t8\tup\ttrue\twest\tfalse\n1409\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t8\tup\tfalse\twest\ttrue\n1410\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n1411\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t8\tup\ttrue\twest\ttrue\n1412\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t8\tup\ttrue\twest\tfalse\n1413\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\ttrue\n1414\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n1415\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t8\tup\ttrue\twest\ttrue\n1416\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t8\tup\ttrue\twest\tfalse\n1417\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t8\tup\tfalse\twest\ttrue\n1418\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n1419\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\ttrue\twest\ttrue\n1420\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\ttrue\twest\tfalse\n1421\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\ttrue\n1422\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n1423\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t9\tup\ttrue\twest\ttrue\n1424\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t9\tup\ttrue\twest\tfalse\n1425\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t9\tup\tfalse\twest\ttrue\n1426\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t9\tup\tfalse\twest\tfalse\n1427\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t9\tup\ttrue\twest\ttrue\n1428\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t9\tup\ttrue\twest\tfalse\n1429\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t9\tup\tfalse\twest\ttrue\n1430\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t9\tup\tfalse\twest\tfalse\n1431\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t9\tup\ttrue\twest\ttrue\n1432\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t9\tup\ttrue\twest\tfalse\n1433\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t9\tup\tfalse\twest\ttrue\n1434\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t9\tup\tfalse\twest\tfalse\n1435\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t9\tup\ttrue\twest\ttrue\n1436\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t9\tup\ttrue\twest\tfalse\n1437\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t9\tup\tfalse\twest\ttrue\n1438\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t9\tup\tfalse\twest\tfalse\n1439\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t9\tup\ttrue\twest\ttrue\n1440\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t9\tup\ttrue\twest\tfalse\n1441\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t9\tup\tfalse\twest\ttrue\n1442\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n1443\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t9\tup\ttrue\twest\ttrue\n1444\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t9\tup\ttrue\twest\tfalse\n1445\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\ttrue\n1446\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n1447\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t9\tup\ttrue\twest\ttrue\n1448\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t9\tup\ttrue\twest\tfalse\n1449\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t9\tup\tfalse\twest\ttrue\n1450\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n1451\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\ttrue\twest\ttrue\n1452\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\ttrue\twest\tfalse\n1453\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\ttrue\n1454\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n1455\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t10\tup\ttrue\twest\ttrue\n1456\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t10\tup\ttrue\twest\tfalse\n1457\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t10\tup\tfalse\twest\ttrue\n1458\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t10\tup\tfalse\twest\tfalse\n1459\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t10\tup\ttrue\twest\ttrue\n1460\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t10\tup\ttrue\twest\tfalse\n1461\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t10\tup\tfalse\twest\ttrue\n1462\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t10\tup\tfalse\twest\tfalse\n1463\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t10\tup\ttrue\twest\ttrue\n1464\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t10\tup\ttrue\twest\tfalse\n1465\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t10\tup\tfalse\twest\ttrue\n1466\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t10\tup\tfalse\twest\tfalse\n1467\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t10\tup\ttrue\twest\ttrue\n1468\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t10\tup\ttrue\twest\tfalse\n1469\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t10\tup\tfalse\twest\ttrue\n1470\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t10\tup\tfalse\twest\tfalse\n1471\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t10\tup\ttrue\twest\ttrue\n1472\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t10\tup\ttrue\twest\tfalse\n1473\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t10\tup\tfalse\twest\ttrue\n1474\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n1475\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t10\tup\ttrue\twest\ttrue\n1476\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t10\tup\ttrue\twest\tfalse\n1477\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\ttrue\n1478\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n1479\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t10\tup\ttrue\twest\ttrue\n1480\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t10\tup\ttrue\twest\tfalse\n1481\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t10\tup\tfalse\twest\ttrue\n1482\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n1483\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\ttrue\twest\ttrue\n1484\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\ttrue\twest\tfalse\n1485\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\ttrue\n1486\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n1487\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t11\tup\ttrue\twest\ttrue\n1488\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t11\tup\ttrue\twest\tfalse\n1489\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t11\tup\tfalse\twest\ttrue\n1490\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t11\tup\tfalse\twest\tfalse\n1491\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t11\tup\ttrue\twest\ttrue\n1492\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t11\tup\ttrue\twest\tfalse\n1493\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t11\tup\tfalse\twest\ttrue\n1494\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t11\tup\tfalse\twest\tfalse\n1495\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t11\tup\ttrue\twest\ttrue\n1496\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t11\tup\ttrue\twest\tfalse\n1497\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t11\tup\tfalse\twest\ttrue\n1498\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t11\tup\tfalse\twest\tfalse\n1499\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t11\tup\ttrue\twest\ttrue\n1500\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t11\tup\ttrue\twest\tfalse\n1501\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t11\tup\tfalse\twest\ttrue\n1502\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t11\tup\tfalse\twest\tfalse\n1503\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t11\tup\ttrue\twest\ttrue\n1504\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t11\tup\ttrue\twest\tfalse\n1505\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t11\tup\tfalse\twest\ttrue\n1506\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n1507\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t11\tup\ttrue\twest\ttrue\n1508\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t11\tup\ttrue\twest\tfalse\n1509\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\ttrue\n1510\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n1511\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t11\tup\ttrue\twest\ttrue\n1512\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t11\tup\ttrue\twest\tfalse\n1513\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t11\tup\tfalse\twest\ttrue\n1514\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n1515\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\ttrue\twest\ttrue\n1516\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\ttrue\twest\tfalse\n1517\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\ttrue\n1518\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n1519\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t12\tup\ttrue\twest\ttrue\n1520\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t12\tup\ttrue\twest\tfalse\n1521\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t12\tup\tfalse\twest\ttrue\n1522\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t12\tup\tfalse\twest\tfalse\n1523\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t12\tup\ttrue\twest\ttrue\n1524\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t12\tup\ttrue\twest\tfalse\n1525\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t12\tup\tfalse\twest\ttrue\n1526\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t12\tup\tfalse\twest\tfalse\n1527\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t12\tup\ttrue\twest\ttrue\n1528\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t12\tup\ttrue\twest\tfalse\n1529\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t12\tup\tfalse\twest\ttrue\n1530\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t12\tup\tfalse\twest\tfalse\n1531\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t12\tup\ttrue\twest\ttrue\n1532\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t12\tup\ttrue\twest\tfalse\n1533\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t12\tup\tfalse\twest\ttrue\n1534\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t12\tup\tfalse\twest\tfalse\n1535\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t12\tup\ttrue\twest\ttrue\n1536\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t12\tup\ttrue\twest\tfalse\n1537\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t12\tup\tfalse\twest\ttrue\n1538\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n1539\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t12\tup\ttrue\twest\ttrue\n1540\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t12\tup\ttrue\twest\tfalse\n1541\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\ttrue\n1542\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n1543\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t12\tup\ttrue\twest\ttrue\n1544\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t12\tup\ttrue\twest\tfalse\n1545\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t12\tup\tfalse\twest\ttrue\n1546\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n1547\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\ttrue\twest\ttrue\n1548\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\ttrue\twest\tfalse\n1549\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\ttrue\n1550\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n1551\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t13\tup\ttrue\twest\ttrue\n1552\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t13\tup\ttrue\twest\tfalse\n1553\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t13\tup\tfalse\twest\ttrue\n1554\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t13\tup\tfalse\twest\tfalse\n1555\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t13\tup\ttrue\twest\ttrue\n1556\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t13\tup\ttrue\twest\tfalse\n1557\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t13\tup\tfalse\twest\ttrue\n1558\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t13\tup\tfalse\twest\tfalse\n1559\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t13\tup\ttrue\twest\ttrue\n1560\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t13\tup\ttrue\twest\tfalse\n1561\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t13\tup\tfalse\twest\ttrue\n1562\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t13\tup\tfalse\twest\tfalse\n1563\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t13\tup\ttrue\twest\ttrue\n1564\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t13\tup\ttrue\twest\tfalse\n1565\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t13\tup\tfalse\twest\ttrue\n1566\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t13\tup\tfalse\twest\tfalse\n1567\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t13\tup\ttrue\twest\ttrue\n1568\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t13\tup\ttrue\twest\tfalse\n1569\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t13\tup\tfalse\twest\ttrue\n1570\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n1571\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t13\tup\ttrue\twest\ttrue\n1572\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t13\tup\ttrue\twest\tfalse\n1573\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\ttrue\n1574\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n1575\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t13\tup\ttrue\twest\ttrue\n1576\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t13\tup\ttrue\twest\tfalse\n1577\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t13\tup\tfalse\twest\ttrue\n1578\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n1579\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\ttrue\twest\ttrue\n1580\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\ttrue\twest\tfalse\n1581\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\ttrue\n1582\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n1583\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t14\tup\ttrue\twest\ttrue\n1584\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t14\tup\ttrue\twest\tfalse\n1585\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t14\tup\tfalse\twest\ttrue\n1586\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t14\tup\tfalse\twest\tfalse\n1587\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t14\tup\ttrue\twest\ttrue\n1588\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t14\tup\ttrue\twest\tfalse\n1589\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t14\tup\tfalse\twest\ttrue\n1590\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t14\tup\tfalse\twest\tfalse\n1591\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t14\tup\ttrue\twest\ttrue\n1592\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t14\tup\ttrue\twest\tfalse\n1593\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t14\tup\tfalse\twest\ttrue\n1594\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t14\tup\tfalse\twest\tfalse\n1595\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t14\tup\ttrue\twest\ttrue\n1596\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t14\tup\ttrue\twest\tfalse\n1597\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t14\tup\tfalse\twest\ttrue\n1598\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t14\tup\tfalse\twest\tfalse\n1599\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t14\tup\ttrue\twest\ttrue\n1600\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t14\tup\ttrue\twest\tfalse\n1601\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t14\tup\tfalse\twest\ttrue\n1602\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n1603\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t14\tup\ttrue\twest\ttrue\n1604\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t14\tup\ttrue\twest\tfalse\n1605\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\ttrue\n1606\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n1607\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t14\tup\ttrue\twest\ttrue\n1608\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t14\tup\ttrue\twest\tfalse\n1609\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t14\tup\tfalse\twest\ttrue\n1610\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n1611\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\ttrue\twest\ttrue\n1612\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\ttrue\twest\tfalse\n1613\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\ttrue\n1614\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n1615\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t15\tup\ttrue\twest\ttrue\n1616\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t15\tup\ttrue\twest\tfalse\n1617\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t15\tup\tfalse\twest\ttrue\n1618\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t15\tup\tfalse\twest\tfalse\n1619\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t15\tup\ttrue\twest\ttrue\n1620\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t15\tup\ttrue\twest\tfalse\n1621\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t15\tup\tfalse\twest\ttrue\n1622\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t15\tup\tfalse\twest\tfalse\n1623\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t15\tup\ttrue\twest\ttrue\n1624\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t15\tup\ttrue\twest\tfalse\n1625\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t15\tup\tfalse\twest\ttrue\n1626\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t15\tup\tfalse\twest\tfalse\n1627\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t15\tup\ttrue\twest\ttrue\n1628\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t15\tup\ttrue\twest\tfalse\n1629\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t15\tup\tfalse\twest\ttrue\n1630\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t15\tup\tfalse\twest\tfalse\n1631\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t15\tup\ttrue\twest\ttrue\n1632\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t15\tup\ttrue\twest\tfalse\n1633\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t15\tup\tfalse\twest\ttrue\n1634\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n1635\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t15\tup\ttrue\twest\ttrue\n1636\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t15\tup\ttrue\twest\tfalse\n1637\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\ttrue\n1638\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n1639\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t15\tup\ttrue\twest\ttrue\n1640\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t15\tup\ttrue\twest\tfalse\n1641\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t15\tup\tfalse\twest\ttrue\n1642\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n1643\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\ttrue\twest\ttrue\n1644\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\ttrue\twest\tfalse\n1645\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\ttrue\n1646\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n1647\tspawner\n1648\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n1649\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n1650\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n1651\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n1652\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n1653\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n1654\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n1655\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n1656\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n1657\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n1658\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n1659\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n1660\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n1661\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n1662\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n1663\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n1664\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n1665\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n1666\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n1667\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n1668\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n1669\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n1670\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n1671\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n1672\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n1673\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n1674\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n1675\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n1676\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n1677\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n1678\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n1679\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n1680\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n1681\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n1682\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n1683\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n1684\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n1685\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n1686\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n1687\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n1688\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n1689\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n1690\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n1691\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n1692\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n1693\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n1694\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n1695\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n1696\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n1697\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n1698\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n1699\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n1700\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n1701\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n1702\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n1703\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n1704\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n1705\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n1706\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n1707\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n1708\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n1709\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n1710\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n1711\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n1712\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n1713\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n1714\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n1715\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n1716\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n1717\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n1718\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n1719\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n1720\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n1721\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n1722\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n1723\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n1724\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n1725\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n1726\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n1727\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n1728\tchest\tfacing\tnorth\twaterlogged\ttrue\ttype\tsingle\n1729\tchest\tfacing\tnorth\twaterlogged\tfalse\ttype\tsingle\n1730\tchest\tfacing\tnorth\twaterlogged\ttrue\ttype\tleft\n1731\tchest\tfacing\tnorth\twaterlogged\tfalse\ttype\tleft\n1732\tchest\tfacing\tnorth\twaterlogged\ttrue\ttype\tright\n1733\tchest\tfacing\tnorth\twaterlogged\tfalse\ttype\tright\n1734\tchest\tfacing\tsouth\twaterlogged\ttrue\ttype\tsingle\n1735\tchest\tfacing\tsouth\twaterlogged\tfalse\ttype\tsingle\n1736\tchest\tfacing\tsouth\twaterlogged\ttrue\ttype\tleft\n1737\tchest\tfacing\tsouth\twaterlogged\tfalse\ttype\tleft\n1738\tchest\tfacing\tsouth\twaterlogged\ttrue\ttype\tright\n1739\tchest\tfacing\tsouth\twaterlogged\tfalse\ttype\tright\n1740\tchest\tfacing\twest\twaterlogged\ttrue\ttype\tsingle\n1741\tchest\tfacing\twest\twaterlogged\tfalse\ttype\tsingle\n1742\tchest\tfacing\twest\twaterlogged\ttrue\ttype\tleft\n1743\tchest\tfacing\twest\twaterlogged\tfalse\ttype\tleft\n1744\tchest\tfacing\twest\twaterlogged\ttrue\ttype\tright\n1745\tchest\tfacing\twest\twaterlogged\tfalse\ttype\tright\n1746\tchest\tfacing\teast\twaterlogged\ttrue\ttype\tsingle\n1747\tchest\tfacing\teast\twaterlogged\tfalse\ttype\tsingle\n1748\tchest\tfacing\teast\twaterlogged\ttrue\ttype\tleft\n1749\tchest\tfacing\teast\twaterlogged\tfalse\ttype\tleft\n1750\tchest\tfacing\teast\twaterlogged\ttrue\ttype\tright\n1751\tchest\tfacing\teast\twaterlogged\tfalse\ttype\tright\n1752\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t0\twest\tup\n1753\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t0\twest\tside\n1754\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t0\twest\tnone\n1755\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t0\twest\tup\n1756\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t0\twest\tside\n1757\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t0\twest\tnone\n1758\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t0\twest\tup\n1759\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t0\twest\tside\n1760\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t0\twest\tnone\n1761\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t1\twest\tup\n1762\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t1\twest\tside\n1763\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t1\twest\tnone\n1764\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t1\twest\tup\n1765\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t1\twest\tside\n1766\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t1\twest\tnone\n1767\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t1\twest\tup\n1768\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t1\twest\tside\n1769\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t1\twest\tnone\n1770\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t2\twest\tup\n1771\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t2\twest\tside\n1772\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t2\twest\tnone\n1773\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t2\twest\tup\n1774\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t2\twest\tside\n1775\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t2\twest\tnone\n1776\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t2\twest\tup\n1777\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t2\twest\tside\n1778\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t2\twest\tnone\n1779\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t3\twest\tup\n1780\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t3\twest\tside\n1781\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t3\twest\tnone\n1782\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t3\twest\tup\n1783\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t3\twest\tside\n1784\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t3\twest\tnone\n1785\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t3\twest\tup\n1786\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t3\twest\tside\n1787\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t3\twest\tnone\n1788\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t4\twest\tup\n1789\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t4\twest\tside\n1790\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t4\twest\tnone\n1791\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t4\twest\tup\n1792\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t4\twest\tside\n1793\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t4\twest\tnone\n1794\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t4\twest\tup\n1795\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t4\twest\tside\n1796\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t4\twest\tnone\n1797\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t5\twest\tup\n1798\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t5\twest\tside\n1799\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t5\twest\tnone\n1800\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t5\twest\tup\n1801\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t5\twest\tside\n1802\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t5\twest\tnone\n1803\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t5\twest\tup\n1804\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t5\twest\tside\n1805\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t5\twest\tnone\n1806\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t6\twest\tup\n1807\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t6\twest\tside\n1808\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t6\twest\tnone\n1809\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t6\twest\tup\n1810\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t6\twest\tside\n1811\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t6\twest\tnone\n1812\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t6\twest\tup\n1813\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t6\twest\tside\n1814\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t6\twest\tnone\n1815\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t7\twest\tup\n1816\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t7\twest\tside\n1817\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t7\twest\tnone\n1818\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t7\twest\tup\n1819\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t7\twest\tside\n1820\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t7\twest\tnone\n1821\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t7\twest\tup\n1822\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t7\twest\tside\n1823\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t7\twest\tnone\n1824\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t8\twest\tup\n1825\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t8\twest\tside\n1826\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t8\twest\tnone\n1827\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t8\twest\tup\n1828\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t8\twest\tside\n1829\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t8\twest\tnone\n1830\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t8\twest\tup\n1831\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t8\twest\tside\n1832\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t8\twest\tnone\n1833\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t9\twest\tup\n1834\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t9\twest\tside\n1835\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t9\twest\tnone\n1836\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t9\twest\tup\n1837\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t9\twest\tside\n1838\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t9\twest\tnone\n1839\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t9\twest\tup\n1840\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t9\twest\tside\n1841\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t9\twest\tnone\n1842\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t10\twest\tup\n1843\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t10\twest\tside\n1844\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t10\twest\tnone\n1845\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t10\twest\tup\n1846\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t10\twest\tside\n1847\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t10\twest\tnone\n1848\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t10\twest\tup\n1849\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t10\twest\tside\n1850\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t10\twest\tnone\n1851\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t11\twest\tup\n1852\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t11\twest\tside\n1853\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t11\twest\tnone\n1854\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t11\twest\tup\n1855\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t11\twest\tside\n1856\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t11\twest\tnone\n1857\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t11\twest\tup\n1858\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t11\twest\tside\n1859\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t11\twest\tnone\n1860\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t12\twest\tup\n1861\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t12\twest\tside\n1862\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t12\twest\tnone\n1863\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t12\twest\tup\n1864\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t12\twest\tside\n1865\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t12\twest\tnone\n1866\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t12\twest\tup\n1867\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t12\twest\tside\n1868\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t12\twest\tnone\n1869\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t13\twest\tup\n1870\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t13\twest\tside\n1871\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t13\twest\tnone\n1872\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t13\twest\tup\n1873\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t13\twest\tside\n1874\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t13\twest\tnone\n1875\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t13\twest\tup\n1876\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t13\twest\tside\n1877\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t13\twest\tnone\n1878\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t14\twest\tup\n1879\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t14\twest\tside\n1880\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t14\twest\tnone\n1881\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t14\twest\tup\n1882\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t14\twest\tside\n1883\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t14\twest\tnone\n1884\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t14\twest\tup\n1885\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t14\twest\tside\n1886\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t14\twest\tnone\n1887\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t15\twest\tup\n1888\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t15\twest\tside\n1889\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t15\twest\tnone\n1890\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t15\twest\tup\n1891\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t15\twest\tside\n1892\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t15\twest\tnone\n1893\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t15\twest\tup\n1894\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t15\twest\tside\n1895\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t15\twest\tnone\n1896\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t0\twest\tup\n1897\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t0\twest\tside\n1898\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t0\twest\tnone\n1899\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t0\twest\tup\n1900\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t0\twest\tside\n1901\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t0\twest\tnone\n1902\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t0\twest\tup\n1903\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t0\twest\tside\n1904\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t0\twest\tnone\n1905\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t1\twest\tup\n1906\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t1\twest\tside\n1907\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t1\twest\tnone\n1908\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t1\twest\tup\n1909\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t1\twest\tside\n1910\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t1\twest\tnone\n1911\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t1\twest\tup\n1912\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t1\twest\tside\n1913\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t1\twest\tnone\n1914\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t2\twest\tup\n1915\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t2\twest\tside\n1916\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t2\twest\tnone\n1917\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t2\twest\tup\n1918\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t2\twest\tside\n1919\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t2\twest\tnone\n1920\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t2\twest\tup\n1921\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t2\twest\tside\n1922\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t2\twest\tnone\n1923\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t3\twest\tup\n1924\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t3\twest\tside\n1925\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t3\twest\tnone\n1926\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t3\twest\tup\n1927\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t3\twest\tside\n1928\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t3\twest\tnone\n1929\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t3\twest\tup\n1930\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t3\twest\tside\n1931\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t3\twest\tnone\n1932\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t4\twest\tup\n1933\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t4\twest\tside\n1934\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t4\twest\tnone\n1935\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t4\twest\tup\n1936\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t4\twest\tside\n1937\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t4\twest\tnone\n1938\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t4\twest\tup\n1939\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t4\twest\tside\n1940\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t4\twest\tnone\n1941\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t5\twest\tup\n1942\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t5\twest\tside\n1943\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t5\twest\tnone\n1944\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t5\twest\tup\n1945\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t5\twest\tside\n1946\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t5\twest\tnone\n1947\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t5\twest\tup\n1948\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t5\twest\tside\n1949\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t5\twest\tnone\n1950\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t6\twest\tup\n1951\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t6\twest\tside\n1952\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t6\twest\tnone\n1953\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t6\twest\tup\n1954\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t6\twest\tside\n1955\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t6\twest\tnone\n1956\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t6\twest\tup\n1957\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t6\twest\tside\n1958\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t6\twest\tnone\n1959\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t7\twest\tup\n1960\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t7\twest\tside\n1961\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t7\twest\tnone\n1962\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t7\twest\tup\n1963\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t7\twest\tside\n1964\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t7\twest\tnone\n1965\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t7\twest\tup\n1966\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t7\twest\tside\n1967\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t7\twest\tnone\n1968\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t8\twest\tup\n1969\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t8\twest\tside\n1970\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t8\twest\tnone\n1971\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t8\twest\tup\n1972\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t8\twest\tside\n1973\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t8\twest\tnone\n1974\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t8\twest\tup\n1975\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t8\twest\tside\n1976\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t8\twest\tnone\n1977\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t9\twest\tup\n1978\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t9\twest\tside\n1979\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t9\twest\tnone\n1980\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t9\twest\tup\n1981\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t9\twest\tside\n1982\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t9\twest\tnone\n1983\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t9\twest\tup\n1984\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t9\twest\tside\n1985\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t9\twest\tnone\n1986\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t10\twest\tup\n1987\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t10\twest\tside\n1988\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t10\twest\tnone\n1989\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t10\twest\tup\n1990\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t10\twest\tside\n1991\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t10\twest\tnone\n1992\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t10\twest\tup\n1993\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t10\twest\tside\n1994\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t10\twest\tnone\n1995\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t11\twest\tup\n1996\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t11\twest\tside\n1997\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t11\twest\tnone\n1998\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t11\twest\tup\n1999\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t11\twest\tside\n2000\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t11\twest\tnone\n2001\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t11\twest\tup\n2002\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t11\twest\tside\n2003\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t11\twest\tnone\n2004\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t12\twest\tup\n2005\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t12\twest\tside\n2006\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t12\twest\tnone\n2007\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t12\twest\tup\n2008\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t12\twest\tside\n2009\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t12\twest\tnone\n2010\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t12\twest\tup\n2011\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t12\twest\tside\n2012\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t12\twest\tnone\n2013\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t13\twest\tup\n2014\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t13\twest\tside\n2015\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t13\twest\tnone\n2016\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t13\twest\tup\n2017\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t13\twest\tside\n2018\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t13\twest\tnone\n2019\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t13\twest\tup\n2020\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t13\twest\tside\n2021\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t13\twest\tnone\n2022\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t14\twest\tup\n2023\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t14\twest\tside\n2024\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t14\twest\tnone\n2025\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t14\twest\tup\n2026\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t14\twest\tside\n2027\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t14\twest\tnone\n2028\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t14\twest\tup\n2029\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t14\twest\tside\n2030\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t14\twest\tnone\n2031\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t15\twest\tup\n2032\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t15\twest\tside\n2033\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t15\twest\tnone\n2034\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t15\twest\tup\n2035\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t15\twest\tside\n2036\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t15\twest\tnone\n2037\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t15\twest\tup\n2038\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t15\twest\tside\n2039\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t15\twest\tnone\n2040\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t0\twest\tup\n2041\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t0\twest\tside\n2042\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t0\twest\tnone\n2043\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t0\twest\tup\n2044\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t0\twest\tside\n2045\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t0\twest\tnone\n2046\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t0\twest\tup\n2047\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t0\twest\tside\n2048\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t0\twest\tnone\n2049\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t1\twest\tup\n2050\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t1\twest\tside\n2051\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t1\twest\tnone\n2052\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t1\twest\tup\n2053\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t1\twest\tside\n2054\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t1\twest\tnone\n2055\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t1\twest\tup\n2056\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t1\twest\tside\n2057\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t1\twest\tnone\n2058\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t2\twest\tup\n2059\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t2\twest\tside\n2060\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t2\twest\tnone\n2061\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t2\twest\tup\n2062\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t2\twest\tside\n2063\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t2\twest\tnone\n2064\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t2\twest\tup\n2065\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t2\twest\tside\n2066\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t2\twest\tnone\n2067\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t3\twest\tup\n2068\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t3\twest\tside\n2069\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t3\twest\tnone\n2070\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t3\twest\tup\n2071\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t3\twest\tside\n2072\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t3\twest\tnone\n2073\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t3\twest\tup\n2074\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t3\twest\tside\n2075\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t3\twest\tnone\n2076\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t4\twest\tup\n2077\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t4\twest\tside\n2078\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t4\twest\tnone\n2079\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t4\twest\tup\n2080\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t4\twest\tside\n2081\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t4\twest\tnone\n2082\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t4\twest\tup\n2083\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t4\twest\tside\n2084\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t4\twest\tnone\n2085\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t5\twest\tup\n2086\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t5\twest\tside\n2087\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t5\twest\tnone\n2088\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t5\twest\tup\n2089\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t5\twest\tside\n2090\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t5\twest\tnone\n2091\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t5\twest\tup\n2092\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t5\twest\tside\n2093\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t5\twest\tnone\n2094\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t6\twest\tup\n2095\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t6\twest\tside\n2096\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t6\twest\tnone\n2097\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t6\twest\tup\n2098\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t6\twest\tside\n2099\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t6\twest\tnone\n2100\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t6\twest\tup\n2101\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t6\twest\tside\n2102\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t6\twest\tnone\n2103\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t7\twest\tup\n2104\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t7\twest\tside\n2105\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t7\twest\tnone\n2106\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t7\twest\tup\n2107\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t7\twest\tside\n2108\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t7\twest\tnone\n2109\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t7\twest\tup\n2110\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t7\twest\tside\n2111\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t7\twest\tnone\n2112\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t8\twest\tup\n2113\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t8\twest\tside\n2114\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t8\twest\tnone\n2115\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t8\twest\tup\n2116\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t8\twest\tside\n2117\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t8\twest\tnone\n2118\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t8\twest\tup\n2119\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t8\twest\tside\n2120\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t8\twest\tnone\n2121\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t9\twest\tup\n2122\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t9\twest\tside\n2123\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t9\twest\tnone\n2124\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t9\twest\tup\n2125\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t9\twest\tside\n2126\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t9\twest\tnone\n2127\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t9\twest\tup\n2128\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t9\twest\tside\n2129\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t9\twest\tnone\n2130\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t10\twest\tup\n2131\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t10\twest\tside\n2132\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t10\twest\tnone\n2133\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t10\twest\tup\n2134\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t10\twest\tside\n2135\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t10\twest\tnone\n2136\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t10\twest\tup\n2137\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t10\twest\tside\n2138\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t10\twest\tnone\n2139\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t11\twest\tup\n2140\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t11\twest\tside\n2141\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t11\twest\tnone\n2142\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t11\twest\tup\n2143\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t11\twest\tside\n2144\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t11\twest\tnone\n2145\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t11\twest\tup\n2146\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t11\twest\tside\n2147\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t11\twest\tnone\n2148\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t12\twest\tup\n2149\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t12\twest\tside\n2150\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t12\twest\tnone\n2151\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t12\twest\tup\n2152\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t12\twest\tside\n2153\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t12\twest\tnone\n2154\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t12\twest\tup\n2155\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t12\twest\tside\n2156\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t12\twest\tnone\n2157\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t13\twest\tup\n2158\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t13\twest\tside\n2159\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t13\twest\tnone\n2160\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t13\twest\tup\n2161\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t13\twest\tside\n2162\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t13\twest\tnone\n2163\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t13\twest\tup\n2164\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t13\twest\tside\n2165\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t13\twest\tnone\n2166\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t14\twest\tup\n2167\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t14\twest\tside\n2168\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t14\twest\tnone\n2169\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t14\twest\tup\n2170\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t14\twest\tside\n2171\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t14\twest\tnone\n2172\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t14\twest\tup\n2173\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t14\twest\tside\n2174\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t14\twest\tnone\n2175\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t15\twest\tup\n2176\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t15\twest\tside\n2177\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t15\twest\tnone\n2178\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t15\twest\tup\n2179\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t15\twest\tside\n2180\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t15\twest\tnone\n2181\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t15\twest\tup\n2182\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t15\twest\tside\n2183\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t15\twest\tnone\n2184\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t0\twest\tup\n2185\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t0\twest\tside\n2186\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t0\twest\tnone\n2187\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t0\twest\tup\n2188\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t0\twest\tside\n2189\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t0\twest\tnone\n2190\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t0\twest\tup\n2191\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t0\twest\tside\n2192\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t0\twest\tnone\n2193\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t1\twest\tup\n2194\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t1\twest\tside\n2195\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t1\twest\tnone\n2196\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t1\twest\tup\n2197\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t1\twest\tside\n2198\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t1\twest\tnone\n2199\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t1\twest\tup\n2200\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t1\twest\tside\n2201\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t1\twest\tnone\n2202\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t2\twest\tup\n2203\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t2\twest\tside\n2204\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t2\twest\tnone\n2205\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t2\twest\tup\n2206\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t2\twest\tside\n2207\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t2\twest\tnone\n2208\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t2\twest\tup\n2209\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t2\twest\tside\n2210\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t2\twest\tnone\n2211\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t3\twest\tup\n2212\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t3\twest\tside\n2213\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t3\twest\tnone\n2214\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t3\twest\tup\n2215\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t3\twest\tside\n2216\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t3\twest\tnone\n2217\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t3\twest\tup\n2218\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t3\twest\tside\n2219\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t3\twest\tnone\n2220\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t4\twest\tup\n2221\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t4\twest\tside\n2222\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t4\twest\tnone\n2223\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t4\twest\tup\n2224\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t4\twest\tside\n2225\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t4\twest\tnone\n2226\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t4\twest\tup\n2227\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t4\twest\tside\n2228\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t4\twest\tnone\n2229\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t5\twest\tup\n2230\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t5\twest\tside\n2231\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t5\twest\tnone\n2232\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t5\twest\tup\n2233\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t5\twest\tside\n2234\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t5\twest\tnone\n2235\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t5\twest\tup\n2236\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t5\twest\tside\n2237\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t5\twest\tnone\n2238\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t6\twest\tup\n2239\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t6\twest\tside\n2240\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t6\twest\tnone\n2241\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t6\twest\tup\n2242\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t6\twest\tside\n2243\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t6\twest\tnone\n2244\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t6\twest\tup\n2245\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t6\twest\tside\n2246\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t6\twest\tnone\n2247\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t7\twest\tup\n2248\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t7\twest\tside\n2249\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t7\twest\tnone\n2250\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t7\twest\tup\n2251\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t7\twest\tside\n2252\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t7\twest\tnone\n2253\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t7\twest\tup\n2254\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t7\twest\tside\n2255\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t7\twest\tnone\n2256\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t8\twest\tup\n2257\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t8\twest\tside\n2258\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t8\twest\tnone\n2259\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t8\twest\tup\n2260\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t8\twest\tside\n2261\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t8\twest\tnone\n2262\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t8\twest\tup\n2263\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t8\twest\tside\n2264\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t8\twest\tnone\n2265\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t9\twest\tup\n2266\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t9\twest\tside\n2267\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t9\twest\tnone\n2268\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t9\twest\tup\n2269\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t9\twest\tside\n2270\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t9\twest\tnone\n2271\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t9\twest\tup\n2272\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t9\twest\tside\n2273\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t9\twest\tnone\n2274\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t10\twest\tup\n2275\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t10\twest\tside\n2276\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t10\twest\tnone\n2277\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t10\twest\tup\n2278\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t10\twest\tside\n2279\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t10\twest\tnone\n2280\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t10\twest\tup\n2281\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t10\twest\tside\n2282\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t10\twest\tnone\n2283\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t11\twest\tup\n2284\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t11\twest\tside\n2285\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t11\twest\tnone\n2286\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t11\twest\tup\n2287\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t11\twest\tside\n2288\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t11\twest\tnone\n2289\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t11\twest\tup\n2290\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t11\twest\tside\n2291\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t11\twest\tnone\n2292\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t12\twest\tup\n2293\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t12\twest\tside\n2294\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t12\twest\tnone\n2295\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t12\twest\tup\n2296\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t12\twest\tside\n2297\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t12\twest\tnone\n2298\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t12\twest\tup\n2299\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t12\twest\tside\n2300\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t12\twest\tnone\n2301\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t13\twest\tup\n2302\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t13\twest\tside\n2303\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t13\twest\tnone\n2304\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t13\twest\tup\n2305\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t13\twest\tside\n2306\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t13\twest\tnone\n2307\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t13\twest\tup\n2308\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t13\twest\tside\n2309\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t13\twest\tnone\n2310\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t14\twest\tup\n2311\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t14\twest\tside\n2312\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t14\twest\tnone\n2313\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t14\twest\tup\n2314\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t14\twest\tside\n2315\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t14\twest\tnone\n2316\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t14\twest\tup\n2317\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t14\twest\tside\n2318\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t14\twest\tnone\n2319\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t15\twest\tup\n2320\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t15\twest\tside\n2321\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t15\twest\tnone\n2322\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t15\twest\tup\n2323\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t15\twest\tside\n2324\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t15\twest\tnone\n2325\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t15\twest\tup\n2326\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t15\twest\tside\n2327\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t15\twest\tnone\n2328\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t0\twest\tup\n2329\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t0\twest\tside\n2330\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t0\twest\tnone\n2331\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t0\twest\tup\n2332\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t0\twest\tside\n2333\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t0\twest\tnone\n2334\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t0\twest\tup\n2335\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t0\twest\tside\n2336\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t0\twest\tnone\n2337\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t1\twest\tup\n2338\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t1\twest\tside\n2339\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t1\twest\tnone\n2340\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t1\twest\tup\n2341\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t1\twest\tside\n2342\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t1\twest\tnone\n2343\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t1\twest\tup\n2344\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t1\twest\tside\n2345\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t1\twest\tnone\n2346\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t2\twest\tup\n2347\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t2\twest\tside\n2348\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t2\twest\tnone\n2349\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t2\twest\tup\n2350\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t2\twest\tside\n2351\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t2\twest\tnone\n2352\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t2\twest\tup\n2353\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t2\twest\tside\n2354\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t2\twest\tnone\n2355\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t3\twest\tup\n2356\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t3\twest\tside\n2357\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t3\twest\tnone\n2358\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t3\twest\tup\n2359\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t3\twest\tside\n2360\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t3\twest\tnone\n2361\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t3\twest\tup\n2362\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t3\twest\tside\n2363\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t3\twest\tnone\n2364\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t4\twest\tup\n2365\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t4\twest\tside\n2366\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t4\twest\tnone\n2367\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t4\twest\tup\n2368\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t4\twest\tside\n2369\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t4\twest\tnone\n2370\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t4\twest\tup\n2371\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t4\twest\tside\n2372\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t4\twest\tnone\n2373\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t5\twest\tup\n2374\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t5\twest\tside\n2375\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t5\twest\tnone\n2376\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t5\twest\tup\n2377\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t5\twest\tside\n2378\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t5\twest\tnone\n2379\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t5\twest\tup\n2380\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t5\twest\tside\n2381\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t5\twest\tnone\n2382\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t6\twest\tup\n2383\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t6\twest\tside\n2384\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t6\twest\tnone\n2385\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t6\twest\tup\n2386\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t6\twest\tside\n2387\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t6\twest\tnone\n2388\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t6\twest\tup\n2389\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t6\twest\tside\n2390\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t6\twest\tnone\n2391\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t7\twest\tup\n2392\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t7\twest\tside\n2393\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t7\twest\tnone\n2394\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t7\twest\tup\n2395\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t7\twest\tside\n2396\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t7\twest\tnone\n2397\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t7\twest\tup\n2398\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t7\twest\tside\n2399\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t7\twest\tnone\n2400\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t8\twest\tup\n2401\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t8\twest\tside\n2402\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t8\twest\tnone\n2403\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t8\twest\tup\n2404\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t8\twest\tside\n2405\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t8\twest\tnone\n2406\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t8\twest\tup\n2407\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t8\twest\tside\n2408\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t8\twest\tnone\n2409\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t9\twest\tup\n2410\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t9\twest\tside\n2411\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t9\twest\tnone\n2412\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t9\twest\tup\n2413\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t9\twest\tside\n2414\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t9\twest\tnone\n2415\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t9\twest\tup\n2416\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t9\twest\tside\n2417\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t9\twest\tnone\n2418\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t10\twest\tup\n2419\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t10\twest\tside\n2420\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t10\twest\tnone\n2421\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t10\twest\tup\n2422\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t10\twest\tside\n2423\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t10\twest\tnone\n2424\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t10\twest\tup\n2425\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t10\twest\tside\n2426\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t10\twest\tnone\n2427\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t11\twest\tup\n2428\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t11\twest\tside\n2429\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t11\twest\tnone\n2430\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t11\twest\tup\n2431\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t11\twest\tside\n2432\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t11\twest\tnone\n2433\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t11\twest\tup\n2434\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t11\twest\tside\n2435\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t11\twest\tnone\n2436\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t12\twest\tup\n2437\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t12\twest\tside\n2438\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t12\twest\tnone\n2439\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t12\twest\tup\n2440\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t12\twest\tside\n2441\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t12\twest\tnone\n2442\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t12\twest\tup\n2443\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t12\twest\tside\n2444\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t12\twest\tnone\n2445\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t13\twest\tup\n2446\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t13\twest\tside\n2447\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t13\twest\tnone\n2448\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t13\twest\tup\n2449\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t13\twest\tside\n2450\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t13\twest\tnone\n2451\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t13\twest\tup\n2452\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t13\twest\tside\n2453\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t13\twest\tnone\n2454\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t14\twest\tup\n2455\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t14\twest\tside\n2456\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t14\twest\tnone\n2457\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t14\twest\tup\n2458\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t14\twest\tside\n2459\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t14\twest\tnone\n2460\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t14\twest\tup\n2461\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t14\twest\tside\n2462\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t14\twest\tnone\n2463\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t15\twest\tup\n2464\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t15\twest\tside\n2465\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t15\twest\tnone\n2466\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t15\twest\tup\n2467\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t15\twest\tside\n2468\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t15\twest\tnone\n2469\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t15\twest\tup\n2470\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t15\twest\tside\n2471\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t15\twest\tnone\n2472\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t0\twest\tup\n2473\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t0\twest\tside\n2474\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t0\twest\tnone\n2475\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t0\twest\tup\n2476\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t0\twest\tside\n2477\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t0\twest\tnone\n2478\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t0\twest\tup\n2479\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t0\twest\tside\n2480\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t0\twest\tnone\n2481\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t1\twest\tup\n2482\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t1\twest\tside\n2483\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t1\twest\tnone\n2484\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t1\twest\tup\n2485\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t1\twest\tside\n2486\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t1\twest\tnone\n2487\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t1\twest\tup\n2488\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t1\twest\tside\n2489\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t1\twest\tnone\n2490\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t2\twest\tup\n2491\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t2\twest\tside\n2492\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t2\twest\tnone\n2493\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t2\twest\tup\n2494\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t2\twest\tside\n2495\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t2\twest\tnone\n2496\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t2\twest\tup\n2497\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t2\twest\tside\n2498\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t2\twest\tnone\n2499\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t3\twest\tup\n2500\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t3\twest\tside\n2501\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t3\twest\tnone\n2502\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t3\twest\tup\n2503\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t3\twest\tside\n2504\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t3\twest\tnone\n2505\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t3\twest\tup\n2506\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t3\twest\tside\n2507\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t3\twest\tnone\n2508\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t4\twest\tup\n2509\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t4\twest\tside\n2510\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t4\twest\tnone\n2511\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t4\twest\tup\n2512\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t4\twest\tside\n2513\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t4\twest\tnone\n2514\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t4\twest\tup\n2515\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t4\twest\tside\n2516\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t4\twest\tnone\n2517\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t5\twest\tup\n2518\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t5\twest\tside\n2519\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t5\twest\tnone\n2520\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t5\twest\tup\n2521\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t5\twest\tside\n2522\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t5\twest\tnone\n2523\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t5\twest\tup\n2524\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t5\twest\tside\n2525\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t5\twest\tnone\n2526\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t6\twest\tup\n2527\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t6\twest\tside\n2528\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t6\twest\tnone\n2529\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t6\twest\tup\n2530\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t6\twest\tside\n2531\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t6\twest\tnone\n2532\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t6\twest\tup\n2533\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t6\twest\tside\n2534\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t6\twest\tnone\n2535\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t7\twest\tup\n2536\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t7\twest\tside\n2537\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t7\twest\tnone\n2538\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t7\twest\tup\n2539\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t7\twest\tside\n2540\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t7\twest\tnone\n2541\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t7\twest\tup\n2542\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t7\twest\tside\n2543\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t7\twest\tnone\n2544\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t8\twest\tup\n2545\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t8\twest\tside\n2546\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t8\twest\tnone\n2547\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t8\twest\tup\n2548\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t8\twest\tside\n2549\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t8\twest\tnone\n2550\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t8\twest\tup\n2551\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t8\twest\tside\n2552\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t8\twest\tnone\n2553\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t9\twest\tup\n2554\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t9\twest\tside\n2555\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t9\twest\tnone\n2556\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t9\twest\tup\n2557\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t9\twest\tside\n2558\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t9\twest\tnone\n2559\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t9\twest\tup\n2560\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t9\twest\tside\n2561\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t9\twest\tnone\n2562\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t10\twest\tup\n2563\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t10\twest\tside\n2564\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t10\twest\tnone\n2565\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t10\twest\tup\n2566\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t10\twest\tside\n2567\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t10\twest\tnone\n2568\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t10\twest\tup\n2569\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t10\twest\tside\n2570\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t10\twest\tnone\n2571\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t11\twest\tup\n2572\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t11\twest\tside\n2573\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t11\twest\tnone\n2574\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t11\twest\tup\n2575\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t11\twest\tside\n2576\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t11\twest\tnone\n2577\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t11\twest\tup\n2578\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t11\twest\tside\n2579\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t11\twest\tnone\n2580\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t12\twest\tup\n2581\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t12\twest\tside\n2582\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t12\twest\tnone\n2583\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t12\twest\tup\n2584\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t12\twest\tside\n2585\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t12\twest\tnone\n2586\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t12\twest\tup\n2587\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t12\twest\tside\n2588\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t12\twest\tnone\n2589\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t13\twest\tup\n2590\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t13\twest\tside\n2591\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t13\twest\tnone\n2592\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t13\twest\tup\n2593\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t13\twest\tside\n2594\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t13\twest\tnone\n2595\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t13\twest\tup\n2596\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t13\twest\tside\n2597\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t13\twest\tnone\n2598\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t14\twest\tup\n2599\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t14\twest\tside\n2600\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t14\twest\tnone\n2601\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t14\twest\tup\n2602\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t14\twest\tside\n2603\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t14\twest\tnone\n2604\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t14\twest\tup\n2605\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t14\twest\tside\n2606\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t14\twest\tnone\n2607\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t15\twest\tup\n2608\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t15\twest\tside\n2609\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t15\twest\tnone\n2610\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t15\twest\tup\n2611\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t15\twest\tside\n2612\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t15\twest\tnone\n2613\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t15\twest\tup\n2614\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t15\twest\tside\n2615\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t15\twest\tnone\n2616\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t0\twest\tup\n2617\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t0\twest\tside\n2618\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t0\twest\tnone\n2619\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t0\twest\tup\n2620\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t0\twest\tside\n2621\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t0\twest\tnone\n2622\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t0\twest\tup\n2623\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t0\twest\tside\n2624\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t0\twest\tnone\n2625\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t1\twest\tup\n2626\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t1\twest\tside\n2627\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t1\twest\tnone\n2628\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t1\twest\tup\n2629\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t1\twest\tside\n2630\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t1\twest\tnone\n2631\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t1\twest\tup\n2632\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t1\twest\tside\n2633\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t1\twest\tnone\n2634\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t2\twest\tup\n2635\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t2\twest\tside\n2636\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t2\twest\tnone\n2637\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t2\twest\tup\n2638\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t2\twest\tside\n2639\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t2\twest\tnone\n2640\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t2\twest\tup\n2641\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t2\twest\tside\n2642\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t2\twest\tnone\n2643\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t3\twest\tup\n2644\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t3\twest\tside\n2645\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t3\twest\tnone\n2646\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t3\twest\tup\n2647\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t3\twest\tside\n2648\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t3\twest\tnone\n2649\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t3\twest\tup\n2650\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t3\twest\tside\n2651\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t3\twest\tnone\n2652\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t4\twest\tup\n2653\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t4\twest\tside\n2654\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t4\twest\tnone\n2655\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t4\twest\tup\n2656\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t4\twest\tside\n2657\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t4\twest\tnone\n2658\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t4\twest\tup\n2659\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t4\twest\tside\n2660\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t4\twest\tnone\n2661\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t5\twest\tup\n2662\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t5\twest\tside\n2663\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t5\twest\tnone\n2664\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t5\twest\tup\n2665\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t5\twest\tside\n2666\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t5\twest\tnone\n2667\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t5\twest\tup\n2668\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t5\twest\tside\n2669\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t5\twest\tnone\n2670\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t6\twest\tup\n2671\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t6\twest\tside\n2672\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t6\twest\tnone\n2673\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t6\twest\tup\n2674\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t6\twest\tside\n2675\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t6\twest\tnone\n2676\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t6\twest\tup\n2677\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t6\twest\tside\n2678\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t6\twest\tnone\n2679\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t7\twest\tup\n2680\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t7\twest\tside\n2681\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t7\twest\tnone\n2682\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t7\twest\tup\n2683\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t7\twest\tside\n2684\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t7\twest\tnone\n2685\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t7\twest\tup\n2686\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t7\twest\tside\n2687\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t7\twest\tnone\n2688\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t8\twest\tup\n2689\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t8\twest\tside\n2690\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t8\twest\tnone\n2691\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t8\twest\tup\n2692\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t8\twest\tside\n2693\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t8\twest\tnone\n2694\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t8\twest\tup\n2695\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t8\twest\tside\n2696\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t8\twest\tnone\n2697\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t9\twest\tup\n2698\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t9\twest\tside\n2699\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t9\twest\tnone\n2700\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t9\twest\tup\n2701\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t9\twest\tside\n2702\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t9\twest\tnone\n2703\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t9\twest\tup\n2704\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t9\twest\tside\n2705\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t9\twest\tnone\n2706\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t10\twest\tup\n2707\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t10\twest\tside\n2708\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t10\twest\tnone\n2709\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t10\twest\tup\n2710\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t10\twest\tside\n2711\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t10\twest\tnone\n2712\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t10\twest\tup\n2713\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t10\twest\tside\n2714\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t10\twest\tnone\n2715\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t11\twest\tup\n2716\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t11\twest\tside\n2717\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t11\twest\tnone\n2718\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t11\twest\tup\n2719\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t11\twest\tside\n2720\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t11\twest\tnone\n2721\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t11\twest\tup\n2722\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t11\twest\tside\n2723\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t11\twest\tnone\n2724\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t12\twest\tup\n2725\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t12\twest\tside\n2726\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t12\twest\tnone\n2727\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t12\twest\tup\n2728\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t12\twest\tside\n2729\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t12\twest\tnone\n2730\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t12\twest\tup\n2731\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t12\twest\tside\n2732\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t12\twest\tnone\n2733\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t13\twest\tup\n2734\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t13\twest\tside\n2735\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t13\twest\tnone\n2736\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t13\twest\tup\n2737\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t13\twest\tside\n2738\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t13\twest\tnone\n2739\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t13\twest\tup\n2740\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t13\twest\tside\n2741\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t13\twest\tnone\n2742\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t14\twest\tup\n2743\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t14\twest\tside\n2744\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t14\twest\tnone\n2745\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t14\twest\tup\n2746\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t14\twest\tside\n2747\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t14\twest\tnone\n2748\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t14\twest\tup\n2749\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t14\twest\tside\n2750\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t14\twest\tnone\n2751\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t15\twest\tup\n2752\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t15\twest\tside\n2753\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t15\twest\tnone\n2754\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t15\twest\tup\n2755\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t15\twest\tside\n2756\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t15\twest\tnone\n2757\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t15\twest\tup\n2758\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t15\twest\tside\n2759\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t15\twest\tnone\n2760\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t0\twest\tup\n2761\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t0\twest\tside\n2762\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t0\twest\tnone\n2763\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t0\twest\tup\n2764\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t0\twest\tside\n2765\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t0\twest\tnone\n2766\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t0\twest\tup\n2767\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t0\twest\tside\n2768\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t0\twest\tnone\n2769\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t1\twest\tup\n2770\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t1\twest\tside\n2771\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t1\twest\tnone\n2772\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t1\twest\tup\n2773\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t1\twest\tside\n2774\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t1\twest\tnone\n2775\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t1\twest\tup\n2776\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t1\twest\tside\n2777\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t1\twest\tnone\n2778\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t2\twest\tup\n2779\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t2\twest\tside\n2780\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t2\twest\tnone\n2781\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t2\twest\tup\n2782\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t2\twest\tside\n2783\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t2\twest\tnone\n2784\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t2\twest\tup\n2785\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t2\twest\tside\n2786\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t2\twest\tnone\n2787\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t3\twest\tup\n2788\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t3\twest\tside\n2789\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t3\twest\tnone\n2790\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t3\twest\tup\n2791\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t3\twest\tside\n2792\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t3\twest\tnone\n2793\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t3\twest\tup\n2794\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t3\twest\tside\n2795\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t3\twest\tnone\n2796\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t4\twest\tup\n2797\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t4\twest\tside\n2798\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t4\twest\tnone\n2799\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t4\twest\tup\n2800\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t4\twest\tside\n2801\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t4\twest\tnone\n2802\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t4\twest\tup\n2803\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t4\twest\tside\n2804\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t4\twest\tnone\n2805\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t5\twest\tup\n2806\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t5\twest\tside\n2807\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t5\twest\tnone\n2808\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t5\twest\tup\n2809\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t5\twest\tside\n2810\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t5\twest\tnone\n2811\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t5\twest\tup\n2812\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t5\twest\tside\n2813\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t5\twest\tnone\n2814\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t6\twest\tup\n2815\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t6\twest\tside\n2816\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t6\twest\tnone\n2817\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t6\twest\tup\n2818\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t6\twest\tside\n2819\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t6\twest\tnone\n2820\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t6\twest\tup\n2821\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t6\twest\tside\n2822\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t6\twest\tnone\n2823\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t7\twest\tup\n2824\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t7\twest\tside\n2825\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t7\twest\tnone\n2826\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t7\twest\tup\n2827\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t7\twest\tside\n2828\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t7\twest\tnone\n2829\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t7\twest\tup\n2830\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t7\twest\tside\n2831\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t7\twest\tnone\n2832\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t8\twest\tup\n2833\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t8\twest\tside\n2834\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t8\twest\tnone\n2835\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t8\twest\tup\n2836\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t8\twest\tside\n2837\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t8\twest\tnone\n2838\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t8\twest\tup\n2839\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t8\twest\tside\n2840\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t8\twest\tnone\n2841\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t9\twest\tup\n2842\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t9\twest\tside\n2843\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t9\twest\tnone\n2844\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t9\twest\tup\n2845\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t9\twest\tside\n2846\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t9\twest\tnone\n2847\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t9\twest\tup\n2848\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t9\twest\tside\n2849\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t9\twest\tnone\n2850\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t10\twest\tup\n2851\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t10\twest\tside\n2852\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t10\twest\tnone\n2853\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t10\twest\tup\n2854\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t10\twest\tside\n2855\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t10\twest\tnone\n2856\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t10\twest\tup\n2857\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t10\twest\tside\n2858\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t10\twest\tnone\n2859\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t11\twest\tup\n2860\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t11\twest\tside\n2861\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t11\twest\tnone\n2862\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t11\twest\tup\n2863\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t11\twest\tside\n2864\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t11\twest\tnone\n2865\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t11\twest\tup\n2866\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t11\twest\tside\n2867\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t11\twest\tnone\n2868\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t12\twest\tup\n2869\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t12\twest\tside\n2870\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t12\twest\tnone\n2871\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t12\twest\tup\n2872\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t12\twest\tside\n2873\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t12\twest\tnone\n2874\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t12\twest\tup\n2875\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t12\twest\tside\n2876\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t12\twest\tnone\n2877\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t13\twest\tup\n2878\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t13\twest\tside\n2879\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t13\twest\tnone\n2880\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t13\twest\tup\n2881\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t13\twest\tside\n2882\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t13\twest\tnone\n2883\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t13\twest\tup\n2884\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t13\twest\tside\n2885\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t13\twest\tnone\n2886\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t14\twest\tup\n2887\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t14\twest\tside\n2888\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t14\twest\tnone\n2889\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t14\twest\tup\n2890\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t14\twest\tside\n2891\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t14\twest\tnone\n2892\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t14\twest\tup\n2893\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t14\twest\tside\n2894\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t14\twest\tnone\n2895\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t15\twest\tup\n2896\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t15\twest\tside\n2897\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t15\twest\tnone\n2898\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t15\twest\tup\n2899\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t15\twest\tside\n2900\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t15\twest\tnone\n2901\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t15\twest\tup\n2902\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t15\twest\tside\n2903\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t15\twest\tnone\n2904\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t0\twest\tup\n2905\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t0\twest\tside\n2906\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t0\twest\tnone\n2907\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t0\twest\tup\n2908\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t0\twest\tside\n2909\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t0\twest\tnone\n2910\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t0\twest\tup\n2911\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t0\twest\tside\n2912\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t0\twest\tnone\n2913\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t1\twest\tup\n2914\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t1\twest\tside\n2915\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t1\twest\tnone\n2916\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t1\twest\tup\n2917\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t1\twest\tside\n2918\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t1\twest\tnone\n2919\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t1\twest\tup\n2920\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t1\twest\tside\n2921\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t1\twest\tnone\n2922\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t2\twest\tup\n2923\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t2\twest\tside\n2924\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t2\twest\tnone\n2925\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t2\twest\tup\n2926\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t2\twest\tside\n2927\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t2\twest\tnone\n2928\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t2\twest\tup\n2929\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t2\twest\tside\n2930\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t2\twest\tnone\n2931\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t3\twest\tup\n2932\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t3\twest\tside\n2933\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t3\twest\tnone\n2934\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t3\twest\tup\n2935\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t3\twest\tside\n2936\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t3\twest\tnone\n2937\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t3\twest\tup\n2938\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t3\twest\tside\n2939\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t3\twest\tnone\n2940\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t4\twest\tup\n2941\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t4\twest\tside\n2942\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t4\twest\tnone\n2943\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t4\twest\tup\n2944\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t4\twest\tside\n2945\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t4\twest\tnone\n2946\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t4\twest\tup\n2947\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t4\twest\tside\n2948\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t4\twest\tnone\n2949\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t5\twest\tup\n2950\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t5\twest\tside\n2951\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t5\twest\tnone\n2952\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t5\twest\tup\n2953\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t5\twest\tside\n2954\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t5\twest\tnone\n2955\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t5\twest\tup\n2956\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t5\twest\tside\n2957\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t5\twest\tnone\n2958\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t6\twest\tup\n2959\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t6\twest\tside\n2960\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t6\twest\tnone\n2961\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t6\twest\tup\n2962\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t6\twest\tside\n2963\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t6\twest\tnone\n2964\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t6\twest\tup\n2965\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t6\twest\tside\n2966\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t6\twest\tnone\n2967\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t7\twest\tup\n2968\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t7\twest\tside\n2969\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t7\twest\tnone\n2970\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t7\twest\tup\n2971\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t7\twest\tside\n2972\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t7\twest\tnone\n2973\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t7\twest\tup\n2974\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t7\twest\tside\n2975\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t7\twest\tnone\n2976\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t8\twest\tup\n2977\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t8\twest\tside\n2978\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t8\twest\tnone\n2979\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t8\twest\tup\n2980\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t8\twest\tside\n2981\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t8\twest\tnone\n2982\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t8\twest\tup\n2983\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t8\twest\tside\n2984\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t8\twest\tnone\n2985\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t9\twest\tup\n2986\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t9\twest\tside\n2987\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t9\twest\tnone\n2988\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t9\twest\tup\n2989\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t9\twest\tside\n2990\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t9\twest\tnone\n2991\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t9\twest\tup\n2992\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t9\twest\tside\n2993\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t9\twest\tnone\n2994\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t10\twest\tup\n2995\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t10\twest\tside\n2996\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t10\twest\tnone\n2997\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t10\twest\tup\n2998\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t10\twest\tside\n2999\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t10\twest\tnone\n3000\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t10\twest\tup\n3001\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t10\twest\tside\n3002\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t10\twest\tnone\n3003\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t11\twest\tup\n3004\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t11\twest\tside\n3005\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t11\twest\tnone\n3006\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t11\twest\tup\n3007\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t11\twest\tside\n3008\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t11\twest\tnone\n3009\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t11\twest\tup\n3010\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t11\twest\tside\n3011\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t11\twest\tnone\n3012\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t12\twest\tup\n3013\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t12\twest\tside\n3014\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t12\twest\tnone\n3015\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t12\twest\tup\n3016\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t12\twest\tside\n3017\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t12\twest\tnone\n3018\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t12\twest\tup\n3019\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t12\twest\tside\n3020\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t12\twest\tnone\n3021\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t13\twest\tup\n3022\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t13\twest\tside\n3023\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t13\twest\tnone\n3024\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t13\twest\tup\n3025\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t13\twest\tside\n3026\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t13\twest\tnone\n3027\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t13\twest\tup\n3028\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t13\twest\tside\n3029\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t13\twest\tnone\n3030\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t14\twest\tup\n3031\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t14\twest\tside\n3032\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t14\twest\tnone\n3033\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t14\twest\tup\n3034\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t14\twest\tside\n3035\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t14\twest\tnone\n3036\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t14\twest\tup\n3037\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t14\twest\tside\n3038\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t14\twest\tnone\n3039\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t15\twest\tup\n3040\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t15\twest\tside\n3041\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t15\twest\tnone\n3042\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t15\twest\tup\n3043\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t15\twest\tside\n3044\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t15\twest\tnone\n3045\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t15\twest\tup\n3046\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t15\twest\tside\n3047\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t15\twest\tnone\n3048\tdiamond_ore\n3049\tdiamond_block\n3050\tcrafting_table\n3051\twheat\tage\t0\n3052\twheat\tage\t1\n3053\twheat\tage\t2\n3054\twheat\tage\t3\n3055\twheat\tage\t4\n3056\twheat\tage\t5\n3057\twheat\tage\t6\n3058\twheat\tage\t7\n3059\tfarmland\tmoisture\t0\n3060\tfarmland\tmoisture\t1\n3061\tfarmland\tmoisture\t2\n3062\tfarmland\tmoisture\t3\n3063\tfarmland\tmoisture\t4\n3064\tfarmland\tmoisture\t5\n3065\tfarmland\tmoisture\t6\n3066\tfarmland\tmoisture\t7\n3067\tfurnace\tfacing\tnorth\tlit\ttrue\n3068\tfurnace\tfacing\tnorth\tlit\tfalse\n3069\tfurnace\tfacing\tsouth\tlit\ttrue\n3070\tfurnace\tfacing\tsouth\tlit\tfalse\n3071\tfurnace\tfacing\twest\tlit\ttrue\n3072\tfurnace\tfacing\twest\tlit\tfalse\n3073\tfurnace\tfacing\teast\tlit\ttrue\n3074\tfurnace\tfacing\teast\tlit\tfalse\n3075\tsign\twaterlogged\ttrue\trotation\t0\n3076\tsign\twaterlogged\tfalse\trotation\t0\n3077\tsign\twaterlogged\ttrue\trotation\t1\n3078\tsign\twaterlogged\tfalse\trotation\t1\n3079\tsign\twaterlogged\ttrue\trotation\t2\n3080\tsign\twaterlogged\tfalse\trotation\t2\n3081\tsign\twaterlogged\ttrue\trotation\t3\n3082\tsign\twaterlogged\tfalse\trotation\t3\n3083\tsign\twaterlogged\ttrue\trotation\t4\n3084\tsign\twaterlogged\tfalse\trotation\t4\n3085\tsign\twaterlogged\ttrue\trotation\t5\n3086\tsign\twaterlogged\tfalse\trotation\t5\n3087\tsign\twaterlogged\ttrue\trotation\t6\n3088\tsign\twaterlogged\tfalse\trotation\t6\n3089\tsign\twaterlogged\ttrue\trotation\t7\n3090\tsign\twaterlogged\tfalse\trotation\t7\n3091\tsign\twaterlogged\ttrue\trotation\t8\n3092\tsign\twaterlogged\tfalse\trotation\t8\n3093\tsign\twaterlogged\ttrue\trotation\t9\n3094\tsign\twaterlogged\tfalse\trotation\t9\n3095\tsign\twaterlogged\ttrue\trotation\t10\n3096\tsign\twaterlogged\tfalse\trotation\t10\n3097\tsign\twaterlogged\ttrue\trotation\t11\n3098\tsign\twaterlogged\tfalse\trotation\t11\n3099\tsign\twaterlogged\ttrue\trotation\t12\n3100\tsign\twaterlogged\tfalse\trotation\t12\n3101\tsign\twaterlogged\ttrue\trotation\t13\n3102\tsign\twaterlogged\tfalse\trotation\t13\n3103\tsign\twaterlogged\ttrue\trotation\t14\n3104\tsign\twaterlogged\tfalse\trotation\t14\n3105\tsign\twaterlogged\ttrue\trotation\t15\n3106\tsign\twaterlogged\tfalse\trotation\t15\n3107\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3108\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3109\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3110\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3111\toak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3112\toak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3113\toak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3114\toak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3115\toak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3116\toak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3117\toak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3118\toak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3119\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3120\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3121\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3122\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3123\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3124\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3125\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3126\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3127\toak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3128\toak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3129\toak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3130\toak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3131\toak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3132\toak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3133\toak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3134\toak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3135\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3136\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3137\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3138\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3139\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n3140\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n3141\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n3142\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n3143\toak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n3144\toak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n3145\toak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n3146\toak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n3147\toak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n3148\toak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n3149\toak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n3150\toak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n3151\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n3152\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n3153\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n3154\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n3155\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n3156\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n3157\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n3158\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n3159\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n3160\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n3161\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n3162\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n3163\toak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n3164\toak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n3165\toak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n3166\toak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n3167\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n3168\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n3169\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n3170\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n3171\tladder\tfacing\tnorth\twaterlogged\ttrue\n3172\tladder\tfacing\tnorth\twaterlogged\tfalse\n3173\tladder\tfacing\tsouth\twaterlogged\ttrue\n3174\tladder\tfacing\tsouth\twaterlogged\tfalse\n3175\tladder\tfacing\twest\twaterlogged\ttrue\n3176\tladder\tfacing\twest\twaterlogged\tfalse\n3177\tladder\tfacing\teast\twaterlogged\ttrue\n3178\tladder\tfacing\teast\twaterlogged\tfalse\n3179\trail\tshape\tnorth_south\n3180\trail\tshape\teast_west\n3181\trail\tshape\tascending_east\n3182\trail\tshape\tascending_west\n3183\trail\tshape\tascending_north\n3184\trail\tshape\tascending_south\n3185\trail\tshape\tsouth_east\n3186\trail\tshape\tsouth_west\n3187\trail\tshape\tnorth_west\n3188\trail\tshape\tnorth_east\n3189\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n3190\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n3191\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n3192\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n3193\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n3194\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n3195\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n3196\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n3197\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n3198\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n3199\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n3200\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n3201\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n3202\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n3203\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n3204\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n3205\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n3206\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n3207\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n3208\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n3209\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n3210\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n3211\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n3212\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n3213\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n3214\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n3215\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n3216\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n3217\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n3218\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n3219\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n3220\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n3221\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n3222\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n3223\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n3224\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n3225\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n3226\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n3227\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n3228\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n3229\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n3230\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n3231\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n3232\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n3233\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n3234\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n3235\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n3236\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n3237\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n3238\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n3239\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n3240\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n3241\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n3242\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n3243\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n3244\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n3245\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n3246\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n3247\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n3248\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n3249\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n3250\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n3251\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n3252\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n3253\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n3254\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n3255\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n3256\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n3257\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n3258\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n3259\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n3260\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n3261\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n3262\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n3263\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n3264\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n3265\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n3266\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n3267\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n3268\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n3269\twall_sign\tfacing\tnorth\twaterlogged\ttrue\n3270\twall_sign\tfacing\tnorth\twaterlogged\tfalse\n3271\twall_sign\tfacing\tsouth\twaterlogged\ttrue\n3272\twall_sign\tfacing\tsouth\twaterlogged\tfalse\n3273\twall_sign\tfacing\twest\twaterlogged\ttrue\n3274\twall_sign\tfacing\twest\twaterlogged\tfalse\n3275\twall_sign\tfacing\teast\twaterlogged\ttrue\n3276\twall_sign\tfacing\teast\twaterlogged\tfalse\n3277\tlever\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n3278\tlever\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n3279\tlever\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n3280\tlever\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n3281\tlever\tfacing\twest\tface\tfloor\tpowered\ttrue\n3282\tlever\tfacing\twest\tface\tfloor\tpowered\tfalse\n3283\tlever\tfacing\teast\tface\tfloor\tpowered\ttrue\n3284\tlever\tfacing\teast\tface\tfloor\tpowered\tfalse\n3285\tlever\tfacing\tnorth\tface\twall\tpowered\ttrue\n3286\tlever\tfacing\tnorth\tface\twall\tpowered\tfalse\n3287\tlever\tfacing\tsouth\tface\twall\tpowered\ttrue\n3288\tlever\tfacing\tsouth\tface\twall\tpowered\tfalse\n3289\tlever\tfacing\twest\tface\twall\tpowered\ttrue\n3290\tlever\tfacing\twest\tface\twall\tpowered\tfalse\n3291\tlever\tfacing\teast\tface\twall\tpowered\ttrue\n3292\tlever\tfacing\teast\tface\twall\tpowered\tfalse\n3293\tlever\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n3294\tlever\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n3295\tlever\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n3296\tlever\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n3297\tlever\tfacing\twest\tface\tceiling\tpowered\ttrue\n3298\tlever\tfacing\twest\tface\tceiling\tpowered\tfalse\n3299\tlever\tfacing\teast\tface\tceiling\tpowered\ttrue\n3300\tlever\tfacing\teast\tface\tceiling\tpowered\tfalse\n3301\tstone_pressure_plate\tpowered\ttrue\n3302\tstone_pressure_plate\tpowered\tfalse\n3303\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3304\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3305\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3306\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3307\tiron_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3308\tiron_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3309\tiron_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3310\tiron_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3311\tiron_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3312\tiron_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3313\tiron_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3314\tiron_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3315\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3316\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3317\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3318\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3319\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3320\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3321\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3322\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3323\tiron_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3324\tiron_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3325\tiron_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3326\tiron_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3327\tiron_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3328\tiron_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3329\tiron_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3330\tiron_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3331\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3332\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3333\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3334\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3335\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n3336\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n3337\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n3338\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n3339\tiron_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n3340\tiron_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n3341\tiron_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n3342\tiron_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n3343\tiron_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n3344\tiron_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n3345\tiron_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n3346\tiron_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n3347\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n3348\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n3349\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n3350\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n3351\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n3352\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n3353\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n3354\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n3355\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n3356\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n3357\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n3358\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n3359\tiron_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n3360\tiron_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n3361\tiron_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n3362\tiron_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n3363\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n3364\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n3365\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n3366\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n3367\toak_pressure_plate\tpowered\ttrue\n3368\toak_pressure_plate\tpowered\tfalse\n3369\tspruce_pressure_plate\tpowered\ttrue\n3370\tspruce_pressure_plate\tpowered\tfalse\n3371\tbirch_pressure_plate\tpowered\ttrue\n3372\tbirch_pressure_plate\tpowered\tfalse\n3373\tjungle_pressure_plate\tpowered\ttrue\n3374\tjungle_pressure_plate\tpowered\tfalse\n3375\tacacia_pressure_plate\tpowered\ttrue\n3376\tacacia_pressure_plate\tpowered\tfalse\n3377\tdark_oak_pressure_plate\tpowered\ttrue\n3378\tdark_oak_pressure_plate\tpowered\tfalse\n3379\tredstone_ore\tlit\ttrue\n3380\tredstone_ore\tlit\tfalse\n3381\tredstone_torch\tlit\ttrue\n3382\tredstone_torch\tlit\tfalse\n3383\tredstone_wall_torch\tfacing\tnorth\tlit\ttrue\n3384\tredstone_wall_torch\tfacing\tnorth\tlit\tfalse\n3385\tredstone_wall_torch\tfacing\tsouth\tlit\ttrue\n3386\tredstone_wall_torch\tfacing\tsouth\tlit\tfalse\n3387\tredstone_wall_torch\tfacing\twest\tlit\ttrue\n3388\tredstone_wall_torch\tfacing\twest\tlit\tfalse\n3389\tredstone_wall_torch\tfacing\teast\tlit\ttrue\n3390\tredstone_wall_torch\tfacing\teast\tlit\tfalse\n3391\tstone_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n3392\tstone_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n3393\tstone_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n3394\tstone_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n3395\tstone_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n3396\tstone_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n3397\tstone_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n3398\tstone_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n3399\tstone_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n3400\tstone_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n3401\tstone_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n3402\tstone_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n3403\tstone_button\tfacing\twest\tface\twall\tpowered\ttrue\n3404\tstone_button\tfacing\twest\tface\twall\tpowered\tfalse\n3405\tstone_button\tfacing\teast\tface\twall\tpowered\ttrue\n3406\tstone_button\tfacing\teast\tface\twall\tpowered\tfalse\n3407\tstone_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n3408\tstone_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n3409\tstone_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n3410\tstone_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n3411\tstone_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n3412\tstone_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n3413\tstone_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n3414\tstone_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n3415\tsnow\tlayers\t1\n3416\tsnow\tlayers\t2\n3417\tsnow\tlayers\t3\n3418\tsnow\tlayers\t4\n3419\tsnow\tlayers\t5\n3420\tsnow\tlayers\t6\n3421\tsnow\tlayers\t7\n3422\tsnow\tlayers\t8\n3423\tice\n3424\tsnow_block\n3425\tcactus\tage\t0\n3426\tcactus\tage\t1\n3427\tcactus\tage\t2\n3428\tcactus\tage\t3\n3429\tcactus\tage\t4\n3430\tcactus\tage\t5\n3431\tcactus\tage\t6\n3432\tcactus\tage\t7\n3433\tcactus\tage\t8\n3434\tcactus\tage\t9\n3435\tcactus\tage\t10\n3436\tcactus\tage\t11\n3437\tcactus\tage\t12\n3438\tcactus\tage\t13\n3439\tcactus\tage\t14\n3440\tcactus\tage\t15\n3441\tclay\n3442\tsugar_cane\tage\t0\n3443\tsugar_cane\tage\t1\n3444\tsugar_cane\tage\t2\n3445\tsugar_cane\tage\t3\n3446\tsugar_cane\tage\t4\n3447\tsugar_cane\tage\t5\n3448\tsugar_cane\tage\t6\n3449\tsugar_cane\tage\t7\n3450\tsugar_cane\tage\t8\n3451\tsugar_cane\tage\t9\n3452\tsugar_cane\tage\t10\n3453\tsugar_cane\tage\t11\n3454\tsugar_cane\tage\t12\n3455\tsugar_cane\tage\t13\n3456\tsugar_cane\tage\t14\n3457\tsugar_cane\tage\t15\n3458\tjukebox\thas_record\ttrue\n3459\tjukebox\thas_record\tfalse\n3460\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n3461\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n3462\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n3463\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n3464\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n3465\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n3466\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n3467\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n3468\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n3469\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n3470\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n3471\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n3472\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n3473\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n3474\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n3475\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n3476\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n3477\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n3478\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n3479\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n3480\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n3481\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n3482\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n3483\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n3484\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n3485\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n3486\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n3487\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n3488\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n3489\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n3490\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n3491\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n3492\tpumpkin\n3493\tnetherrack\n3494\tsoul_sand\n3495\tglowstone\n3496\tnether_portal\taxis\tx\n3497\tnether_portal\taxis\tz\n3498\tcarved_pumpkin\tfacing\tnorth\n3499\tcarved_pumpkin\tfacing\tsouth\n3500\tcarved_pumpkin\tfacing\twest\n3501\tcarved_pumpkin\tfacing\teast\n3502\tjack_o_lantern\tfacing\tnorth\n3503\tjack_o_lantern\tfacing\tsouth\n3504\tjack_o_lantern\tfacing\twest\n3505\tjack_o_lantern\tfacing\teast\n3506\tcake\tbites\t0\n3507\tcake\tbites\t1\n3508\tcake\tbites\t2\n3509\tcake\tbites\t3\n3510\tcake\tbites\t4\n3511\tcake\tbites\t5\n3512\tcake\tbites\t6\n3513\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\ttrue\tdelay\t1\n3514\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\ttrue\tdelay\t1\n3515\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n3516\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n3517\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\ttrue\tdelay\t1\n3518\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\ttrue\tdelay\t1\n3519\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n3520\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n3521\trepeater\tfacing\twest\tpowered\ttrue\tlocked\ttrue\tdelay\t1\n3522\trepeater\tfacing\twest\tpowered\tfalse\tlocked\ttrue\tdelay\t1\n3523\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n3524\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n3525\trepeater\tfacing\teast\tpowered\ttrue\tlocked\ttrue\tdelay\t1\n3526\trepeater\tfacing\teast\tpowered\tfalse\tlocked\ttrue\tdelay\t1\n3527\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n3528\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n3529\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\ttrue\tdelay\t2\n3530\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\ttrue\tdelay\t2\n3531\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n3532\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n3533\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\ttrue\tdelay\t2\n3534\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\ttrue\tdelay\t2\n3535\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n3536\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n3537\trepeater\tfacing\twest\tpowered\ttrue\tlocked\ttrue\tdelay\t2\n3538\trepeater\tfacing\twest\tpowered\tfalse\tlocked\ttrue\tdelay\t2\n3539\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n3540\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n3541\trepeater\tfacing\teast\tpowered\ttrue\tlocked\ttrue\tdelay\t2\n3542\trepeater\tfacing\teast\tpowered\tfalse\tlocked\ttrue\tdelay\t2\n3543\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n3544\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n3545\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\ttrue\tdelay\t3\n3546\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\ttrue\tdelay\t3\n3547\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n3548\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n3549\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\ttrue\tdelay\t3\n3550\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\ttrue\tdelay\t3\n3551\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n3552\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n3553\trepeater\tfacing\twest\tpowered\ttrue\tlocked\ttrue\tdelay\t3\n3554\trepeater\tfacing\twest\tpowered\tfalse\tlocked\ttrue\tdelay\t3\n3555\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n3556\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n3557\trepeater\tfacing\teast\tpowered\ttrue\tlocked\ttrue\tdelay\t3\n3558\trepeater\tfacing\teast\tpowered\tfalse\tlocked\ttrue\tdelay\t3\n3559\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n3560\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n3561\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\ttrue\tdelay\t4\n3562\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\ttrue\tdelay\t4\n3563\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n3564\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n3565\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\ttrue\tdelay\t4\n3566\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\ttrue\tdelay\t4\n3567\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n3568\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n3569\trepeater\tfacing\twest\tpowered\ttrue\tlocked\ttrue\tdelay\t4\n3570\trepeater\tfacing\twest\tpowered\tfalse\tlocked\ttrue\tdelay\t4\n3571\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n3572\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n3573\trepeater\tfacing\teast\tpowered\ttrue\tlocked\ttrue\tdelay\t4\n3574\trepeater\tfacing\teast\tpowered\tfalse\tlocked\ttrue\tdelay\t4\n3575\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n3576\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n3577\twhite_stained_glass\n3578\torange_stained_glass\n3579\tmagenta_stained_glass\n3580\tlight_blue_stained_glass\n3581\tyellow_stained_glass\n3582\tlime_stained_glass\n3583\tpink_stained_glass\n3584\tgray_stained_glass\n3585\tlight_gray_stained_glass\n3586\tcyan_stained_glass\n3587\tpurple_stained_glass\n3588\tblue_stained_glass\n3589\tbrown_stained_glass\n3590\tgreen_stained_glass\n3591\tred_stained_glass\n3592\tblack_stained_glass\n3593\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3594\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3595\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3596\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3597\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3598\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3599\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3600\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3601\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3602\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3603\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3604\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3605\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3606\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3607\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3608\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3609\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3610\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3611\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3612\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3613\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3614\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3615\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3616\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3617\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3618\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3619\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3620\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3621\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3622\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3623\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3624\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3625\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3626\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3627\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3628\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3629\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3630\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3631\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3632\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3633\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3634\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3635\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3636\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3637\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3638\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3639\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3640\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3641\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3642\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3643\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3644\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3645\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3646\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3647\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3648\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3649\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3650\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3651\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3652\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3653\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3654\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3655\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3656\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3657\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3658\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3659\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3660\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3661\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3662\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3663\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3664\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3665\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3666\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3667\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3668\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3669\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3670\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3671\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3672\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3673\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3674\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3675\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3676\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3677\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3678\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3679\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3680\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3681\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3682\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3683\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3684\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3685\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3686\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3687\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3688\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3689\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3690\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3691\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3692\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3693\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3694\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3695\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3696\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3697\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3698\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3699\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3700\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3701\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3702\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3703\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3704\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3705\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3706\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3707\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3708\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3709\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3710\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3711\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3712\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3713\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3714\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3715\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3716\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3717\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3718\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3719\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3720\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3721\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3722\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3723\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3724\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3725\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3726\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3727\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3728\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3729\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3730\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3731\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3732\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3733\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3734\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3735\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3736\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3737\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3738\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3739\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3740\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3741\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3742\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3743\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3744\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3745\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3746\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3747\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3748\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3749\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3750\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3751\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3752\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3753\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3754\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3755\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3756\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3757\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3758\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3759\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3760\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3761\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3762\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3763\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3764\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3765\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3766\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3767\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3768\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3769\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3770\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3771\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3772\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3773\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3774\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3775\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3776\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3777\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3778\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3779\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3780\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3781\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3782\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3783\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3784\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3785\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3786\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3787\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3788\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3789\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3790\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3791\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3792\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3793\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3794\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3795\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3796\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3797\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3798\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3799\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3800\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3801\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3802\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3803\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3804\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3805\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3806\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3807\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3808\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3809\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3810\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3811\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3812\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3813\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3814\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3815\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3816\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3817\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3818\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3819\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3820\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3821\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3822\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3823\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3824\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3825\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3826\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3827\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3828\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3829\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3830\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3831\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3832\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3833\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3834\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3835\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3836\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3837\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3838\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3839\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3840\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3841\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3842\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3843\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3844\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3845\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3846\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3847\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3848\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3849\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3850\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3851\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3852\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3853\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3854\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3855\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3856\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3857\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3858\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3859\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3860\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3861\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3862\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3863\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3864\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3865\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3866\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3867\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3868\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3869\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3870\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3871\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3872\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3873\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3874\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3875\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3876\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3877\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3878\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3879\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3880\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3881\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3882\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3883\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3884\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3885\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3886\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3887\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3888\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3889\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3890\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3891\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3892\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3893\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3894\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3895\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3896\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3897\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3898\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3899\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3900\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3901\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3902\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3903\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3904\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3905\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3906\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3907\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3908\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3909\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3910\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3911\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3912\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3913\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3914\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n3915\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3916\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n3917\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3918\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n3919\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3920\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n3921\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3922\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3923\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3924\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n3925\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3926\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3927\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3928\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n3929\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3930\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n3931\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3932\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n3933\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3934\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n3935\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3936\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n3937\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3938\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3939\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3940\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n3941\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3942\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3943\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3944\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n3945\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3946\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n3947\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3948\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n3949\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3950\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n3951\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3952\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n3953\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3954\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n3955\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3956\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n3957\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3958\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n3959\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3960\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n3961\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3962\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n3963\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3964\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n3965\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3966\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n3967\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3968\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n3969\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3970\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n3971\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3972\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n3973\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3974\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n3975\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3976\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n3977\tinfested_stone\n3978\tinfested_cobblestone\n3979\tinfested_stone_bricks\n3980\tinfested_mossy_stone_bricks\n3981\tinfested_cracked_stone_bricks\n3982\tinfested_chiseled_stone_bricks\n3983\tstone_bricks\n3984\tmossy_stone_bricks\n3985\tcracked_stone_bricks\n3986\tchiseled_stone_bricks\n3987\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n3988\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n3989\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n3990\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n3991\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n3992\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n3993\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n3994\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n3995\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n3996\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n3997\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n3998\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n3999\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4000\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4001\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4002\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4003\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4004\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4005\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4006\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4007\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4008\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4009\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4010\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4011\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4012\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4013\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4014\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4015\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4016\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4017\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4018\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4019\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4020\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4021\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4022\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4023\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4024\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4025\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4026\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4027\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4028\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4029\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4030\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4031\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4032\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4033\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4034\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4035\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4036\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4037\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4038\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4039\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4040\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4041\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4042\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4043\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4044\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4045\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4046\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4047\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4048\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4049\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4050\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4051\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4052\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4053\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4054\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4055\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4056\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4057\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4058\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4059\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4060\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4061\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4062\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4063\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4064\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4065\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4066\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4067\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4068\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4069\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4070\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4071\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4072\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4073\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4074\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4075\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4076\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4077\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4078\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4079\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4080\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4081\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4082\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4083\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4084\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4085\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4086\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4087\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4088\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4089\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4090\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4091\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4092\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4093\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4094\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4095\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4096\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4097\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4098\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4099\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4100\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4101\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4102\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4103\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4104\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4105\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4106\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4107\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4108\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4109\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4110\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4111\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4112\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4113\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4114\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4115\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4116\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4117\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4118\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4119\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4120\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4121\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4122\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4123\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4124\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4125\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4126\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4127\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4128\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4129\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4130\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4131\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4132\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4133\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4134\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4135\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4136\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4137\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4138\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4139\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4140\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4141\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4142\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4143\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4144\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4145\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4146\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4147\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4148\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4149\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4150\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4151\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4152\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4153\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4154\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4155\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4156\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4157\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4158\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4159\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4160\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4161\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4162\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4163\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4164\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4165\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4166\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4167\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4168\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4169\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4170\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4171\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4172\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4173\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4174\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4175\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4176\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4177\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4178\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4179\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4180\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4181\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4182\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4183\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4184\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4185\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4186\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4187\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4188\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4189\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4190\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4191\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4192\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4193\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4194\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4195\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4196\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4197\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4198\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4199\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4200\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4201\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4202\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4203\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4204\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4205\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4206\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4207\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4208\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4209\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4210\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4211\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4212\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4213\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4214\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4215\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4216\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4217\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4218\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4219\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4220\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4221\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4222\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4223\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4224\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4225\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4226\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4227\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4228\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4229\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4230\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4231\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4232\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4233\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4234\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4235\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4236\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4237\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4238\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4239\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4240\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4241\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4242\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4243\tmelon\n4244\tattached_pumpkin_stem\tfacing\tnorth\n4245\tattached_pumpkin_stem\tfacing\tsouth\n4246\tattached_pumpkin_stem\tfacing\twest\n4247\tattached_pumpkin_stem\tfacing\teast\n4248\tattached_melon_stem\tfacing\tnorth\n4249\tattached_melon_stem\tfacing\tsouth\n4250\tattached_melon_stem\tfacing\twest\n4251\tattached_melon_stem\tfacing\teast\n4252\tpumpkin_stem\tage\t0\n4253\tpumpkin_stem\tage\t1\n4254\tpumpkin_stem\tage\t2\n4255\tpumpkin_stem\tage\t3\n4256\tpumpkin_stem\tage\t4\n4257\tpumpkin_stem\tage\t5\n4258\tpumpkin_stem\tage\t6\n4259\tpumpkin_stem\tage\t7\n4260\tmelon_stem\tage\t0\n4261\tmelon_stem\tage\t1\n4262\tmelon_stem\tage\t2\n4263\tmelon_stem\tage\t3\n4264\tmelon_stem\tage\t4\n4265\tmelon_stem\tage\t5\n4266\tmelon_stem\tage\t6\n4267\tmelon_stem\tage\t7\n4268\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n4269\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n4270\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n4271\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n4272\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n4273\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n4274\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n4275\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n4276\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n4277\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n4278\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n4279\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n4280\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n4281\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n4282\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n4283\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n4284\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n4285\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n4286\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n4287\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n4288\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n4289\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n4290\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n4291\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n4292\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n4293\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n4294\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n4295\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n4296\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n4297\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n4298\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n4299\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n4300\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n4301\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n4302\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n4303\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n4304\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n4305\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n4306\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n4307\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n4308\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n4309\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n4310\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n4311\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n4312\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n4313\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n4314\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n4315\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n4316\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n4317\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n4318\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n4319\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n4320\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n4321\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n4322\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n4323\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n4324\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n4325\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n4326\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n4327\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n4328\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n4329\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n4330\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n4331\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n4332\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4333\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4334\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4335\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4336\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4337\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4338\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4339\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4340\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4341\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4342\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4343\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4344\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4345\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4346\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4347\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4348\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4349\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4350\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4351\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4352\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4353\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4354\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4355\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4356\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4357\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4358\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4359\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4360\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4361\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4362\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4363\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4364\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4365\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4366\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4367\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4368\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4369\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4370\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4371\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4372\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4373\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4374\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4375\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4376\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4377\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4378\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4379\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4380\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4381\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4382\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4383\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4384\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4385\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4386\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4387\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4388\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4389\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4390\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4391\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4392\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4393\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4394\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4395\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4396\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4397\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4398\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4399\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4400\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4401\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4402\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4403\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4404\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4405\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4406\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4407\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4408\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4409\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4410\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4411\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4412\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4413\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4414\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4415\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4416\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4417\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4418\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4419\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4420\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4421\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4422\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4423\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4424\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4425\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4426\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4427\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4428\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4429\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4430\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4431\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4432\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4433\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4434\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4435\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4436\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4437\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4438\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4439\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4440\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4441\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4442\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4443\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4444\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4445\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4446\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4447\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4448\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4449\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4450\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4451\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4452\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4453\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4454\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4455\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4456\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4457\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4458\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4459\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4460\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4461\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4462\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4463\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4464\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4465\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4466\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4467\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4468\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4469\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4470\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4471\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4472\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4473\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4474\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4475\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4476\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4477\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4478\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4479\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4480\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4481\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4482\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4483\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4484\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4485\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4486\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4487\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4488\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4489\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4490\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4491\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4492\tmycelium\tsnowy\ttrue\n4493\tmycelium\tsnowy\tfalse\n4494\tlily_pad\n4495\tnether_bricks\n4496\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4497\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4498\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4499\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4500\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4501\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4502\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4503\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4504\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4505\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4506\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4507\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4508\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4509\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4510\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4511\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4512\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4513\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4514\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4515\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4516\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4517\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4518\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4519\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4520\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4521\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4522\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4523\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4524\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4525\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4526\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4527\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4528\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4529\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4530\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4531\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4532\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4533\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4534\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4535\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4536\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4537\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4538\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4539\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4540\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4541\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4542\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4543\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4544\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4545\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4546\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4547\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4548\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4549\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4550\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4551\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4552\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4553\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4554\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4555\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4556\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4557\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4558\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4559\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4560\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4561\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4562\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4563\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4564\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4565\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4566\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4567\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4568\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4569\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4570\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4571\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4572\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4573\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4574\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4575\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4576\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4577\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4578\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4579\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4580\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4581\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4582\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4583\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4584\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4585\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4586\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4587\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4588\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4589\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4590\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4591\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4592\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4593\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4594\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4595\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4596\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4597\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4598\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4599\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4600\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4601\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4602\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4603\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4604\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4605\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4606\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4607\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4608\tnether_wart\tage\t0\n4609\tnether_wart\tage\t1\n4610\tnether_wart\tage\t2\n4611\tnether_wart\tage\t3\n4612\tenchanting_table\n4613\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\ttrue\thas_bottle_2\ttrue\n4614\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\ttrue\thas_bottle_2\tfalse\n4615\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\tfalse\thas_bottle_2\ttrue\n4616\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\tfalse\thas_bottle_2\tfalse\n4617\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\ttrue\thas_bottle_2\ttrue\n4618\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\ttrue\thas_bottle_2\tfalse\n4619\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\tfalse\thas_bottle_2\ttrue\n4620\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\tfalse\thas_bottle_2\tfalse\n4621\tcauldron\tlevel\t0\n4622\tcauldron\tlevel\t1\n4623\tcauldron\tlevel\t2\n4624\tcauldron\tlevel\t3\n4625\tend_portal\n4626\tend_portal_frame\tfacing\tnorth\teye\ttrue\n4627\tend_portal_frame\tfacing\tsouth\teye\ttrue\n4628\tend_portal_frame\tfacing\twest\teye\ttrue\n4629\tend_portal_frame\tfacing\teast\teye\ttrue\n4630\tend_portal_frame\tfacing\tnorth\teye\tfalse\n4631\tend_portal_frame\tfacing\tsouth\teye\tfalse\n4632\tend_portal_frame\tfacing\twest\teye\tfalse\n4633\tend_portal_frame\tfacing\teast\teye\tfalse\n4634\tend_stone\n4635\tdragon_egg\n4636\tredstone_lamp\tlit\ttrue\n4637\tredstone_lamp\tlit\tfalse\n4638\tcocoa\tfacing\tnorth\tage\t0\n4639\tcocoa\tfacing\tsouth\tage\t0\n4640\tcocoa\tfacing\twest\tage\t0\n4641\tcocoa\tfacing\teast\tage\t0\n4642\tcocoa\tfacing\tnorth\tage\t1\n4643\tcocoa\tfacing\tsouth\tage\t1\n4644\tcocoa\tfacing\twest\tage\t1\n4645\tcocoa\tfacing\teast\tage\t1\n4646\tcocoa\tfacing\tnorth\tage\t2\n4647\tcocoa\tfacing\tsouth\tage\t2\n4648\tcocoa\tfacing\twest\tage\t2\n4649\tcocoa\tfacing\teast\tage\t2\n4650\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4651\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4652\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4653\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4654\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4655\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4656\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4657\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4658\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4659\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4660\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4661\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4662\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4663\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4664\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4665\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4666\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4667\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4668\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4669\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4670\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4671\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4672\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4673\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4674\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4675\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4676\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4677\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4678\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4679\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4680\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4681\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4682\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4683\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4684\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4685\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4686\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4687\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4688\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4689\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4690\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4691\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4692\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4693\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4694\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4695\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4696\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4697\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4698\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4699\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4700\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4701\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4702\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4703\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4704\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4705\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4706\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4707\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4708\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4709\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4710\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4711\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4712\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4713\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4714\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4715\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4716\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4717\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4718\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4719\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4720\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4721\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4722\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4723\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4724\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4725\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4726\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4727\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4728\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4729\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4730\temerald_ore\n4731\tender_chest\tfacing\tnorth\twaterlogged\ttrue\n4732\tender_chest\tfacing\tnorth\twaterlogged\tfalse\n4733\tender_chest\tfacing\tsouth\twaterlogged\ttrue\n4734\tender_chest\tfacing\tsouth\twaterlogged\tfalse\n4735\tender_chest\tfacing\twest\twaterlogged\ttrue\n4736\tender_chest\tfacing\twest\twaterlogged\tfalse\n4737\tender_chest\tfacing\teast\twaterlogged\ttrue\n4738\tender_chest\tfacing\teast\twaterlogged\tfalse\n4739\ttripwire_hook\tattached\ttrue\tfacing\tnorth\tpowered\ttrue\n4740\ttripwire_hook\tattached\ttrue\tfacing\tnorth\tpowered\tfalse\n4741\ttripwire_hook\tattached\ttrue\tfacing\tsouth\tpowered\ttrue\n4742\ttripwire_hook\tattached\ttrue\tfacing\tsouth\tpowered\tfalse\n4743\ttripwire_hook\tattached\ttrue\tfacing\twest\tpowered\ttrue\n4744\ttripwire_hook\tattached\ttrue\tfacing\twest\tpowered\tfalse\n4745\ttripwire_hook\tattached\ttrue\tfacing\teast\tpowered\ttrue\n4746\ttripwire_hook\tattached\ttrue\tfacing\teast\tpowered\tfalse\n4747\ttripwire_hook\tattached\tfalse\tfacing\tnorth\tpowered\ttrue\n4748\ttripwire_hook\tattached\tfalse\tfacing\tnorth\tpowered\tfalse\n4749\ttripwire_hook\tattached\tfalse\tfacing\tsouth\tpowered\ttrue\n4750\ttripwire_hook\tattached\tfalse\tfacing\tsouth\tpowered\tfalse\n4751\ttripwire_hook\tattached\tfalse\tfacing\twest\tpowered\ttrue\n4752\ttripwire_hook\tattached\tfalse\tfacing\twest\tpowered\tfalse\n4753\ttripwire_hook\tattached\tfalse\tfacing\teast\tpowered\ttrue\n4754\ttripwire_hook\tattached\tfalse\tfacing\teast\tpowered\tfalse\n4755\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4756\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4757\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4758\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4759\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4760\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4761\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4762\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4763\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4764\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4765\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4766\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4767\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4768\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4769\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4770\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4771\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4772\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4773\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4774\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4775\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4776\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4777\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4778\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4779\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4780\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4781\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4782\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4783\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4784\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4785\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4786\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4787\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4788\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4789\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4790\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4791\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4792\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4793\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4794\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4795\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4796\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4797\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4798\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4799\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4800\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4801\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4802\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4803\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4804\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4805\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4806\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4807\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4808\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4809\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4810\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4811\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4812\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4813\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4814\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4815\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4816\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4817\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4818\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4819\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4820\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4821\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4822\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4823\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4824\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4825\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4826\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4827\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4828\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4829\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4830\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4831\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4832\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4833\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4834\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4835\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4836\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4837\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4838\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4839\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4840\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4841\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4842\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4843\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4844\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4845\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4846\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4847\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4848\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4849\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4850\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4851\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4852\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4853\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4854\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4855\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4856\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4857\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4858\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4859\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4860\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4861\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4862\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4863\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4864\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4865\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4866\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4867\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4868\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4869\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4870\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4871\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n4872\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n4873\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n4874\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n4875\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4876\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4877\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4878\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4879\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n4880\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n4881\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n4882\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n4883\temerald_block\n4884\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4885\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4886\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4887\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4888\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4889\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4890\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4891\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4892\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4893\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4894\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4895\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4896\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4897\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4898\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4899\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4900\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4901\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4902\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4903\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4904\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4905\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4906\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4907\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4908\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4909\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4910\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4911\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4912\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4913\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4914\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4915\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4916\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4917\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4918\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4919\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4920\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4921\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4922\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4923\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4924\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4925\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4926\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4927\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4928\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4929\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4930\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4931\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4932\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4933\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4934\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4935\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4936\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4937\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4938\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4939\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4940\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4941\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4942\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4943\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4944\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4945\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4946\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4947\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4948\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4949\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4950\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4951\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4952\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4953\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4954\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4955\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4956\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4957\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4958\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4959\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4960\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4961\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4962\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4963\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4964\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4965\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4966\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4967\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4968\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4969\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4970\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4971\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4972\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4973\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4974\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4975\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4976\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4977\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4978\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4979\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4980\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4981\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4982\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4983\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4984\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4985\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4986\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4987\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4988\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4989\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4990\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4991\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4992\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4993\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4994\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4995\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4996\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4997\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4998\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4999\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5000\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5001\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5002\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5003\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5004\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5005\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5006\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5007\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5008\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5009\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5010\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5011\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5012\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5013\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5014\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5015\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5016\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5017\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5018\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5019\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5020\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5021\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5022\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5023\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5024\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5025\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5026\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5027\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5028\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5029\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5030\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5031\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5032\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5033\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5034\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5035\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5036\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5037\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5038\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5039\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5040\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5041\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5042\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5043\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5044\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5045\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5046\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5047\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5048\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5049\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5050\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5051\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5052\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5053\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5054\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5055\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5056\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5057\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5058\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5059\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5060\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5061\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5062\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5063\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5064\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5065\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5066\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5067\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5068\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5069\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5070\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5071\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5072\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5073\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5074\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5075\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5076\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5077\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5078\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5079\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5080\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5081\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5082\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5083\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5084\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5085\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5086\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5087\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5088\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5089\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5090\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5091\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5092\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5093\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5094\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5095\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5096\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5097\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5098\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5099\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5100\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5101\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5102\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5103\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5104\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5105\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5106\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5107\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5108\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5109\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5110\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5111\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5112\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5113\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5114\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5115\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5116\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5117\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5118\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5119\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5120\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5121\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5122\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5123\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5124\tcommand_block\tconditional\ttrue\tfacing\tnorth\n5125\tcommand_block\tconditional\ttrue\tfacing\teast\n5126\tcommand_block\tconditional\ttrue\tfacing\tsouth\n5127\tcommand_block\tconditional\ttrue\tfacing\twest\n5128\tcommand_block\tconditional\ttrue\tfacing\tup\n5129\tcommand_block\tconditional\ttrue\tfacing\tdown\n5130\tcommand_block\tconditional\tfalse\tfacing\tnorth\n5131\tcommand_block\tconditional\tfalse\tfacing\teast\n5132\tcommand_block\tconditional\tfalse\tfacing\tsouth\n5133\tcommand_block\tconditional\tfalse\tfacing\twest\n5134\tcommand_block\tconditional\tfalse\tfacing\tup\n5135\tcommand_block\tconditional\tfalse\tfacing\tdown\n5136\tbeacon\n5137\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5138\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5139\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5140\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5141\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5142\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5143\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5144\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5145\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5146\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5147\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5148\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5149\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5150\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5151\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5152\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5153\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5154\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5155\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5156\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5157\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5158\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5159\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5160\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5161\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5162\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5163\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5164\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5165\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5166\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5167\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5168\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5169\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5170\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5171\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5172\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5173\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5174\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5175\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5176\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5177\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5178\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5179\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5180\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5181\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5182\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5183\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5184\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5185\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5186\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5187\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5188\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5189\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5190\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5191\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5192\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5193\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5194\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5195\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5196\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5197\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5198\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5199\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5200\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5201\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5202\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5203\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5204\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5205\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5206\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5207\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5208\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5209\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5210\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5211\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5212\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5213\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5214\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5215\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5216\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5217\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5218\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5219\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5220\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5221\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5222\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5223\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5224\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5225\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5226\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5227\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5228\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5229\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5230\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5231\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5232\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5233\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5234\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5235\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5236\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5237\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5238\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5239\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5240\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5241\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5242\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5243\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5244\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5245\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5246\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5247\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5248\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5249\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5250\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5251\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5252\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5253\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5254\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5255\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5256\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5257\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5258\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5259\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5260\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5261\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5262\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5263\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5264\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5265\tflower_pot\n5266\tpotted_oak_sapling\n5267\tpotted_spruce_sapling\n5268\tpotted_birch_sapling\n5269\tpotted_jungle_sapling\n5270\tpotted_acacia_sapling\n5271\tpotted_dark_oak_sapling\n5272\tpotted_fern\n5273\tpotted_dandelion\n5274\tpotted_poppy\n5275\tpotted_blue_orchid\n5276\tpotted_allium\n5277\tpotted_azure_bluet\n5278\tpotted_red_tulip\n5279\tpotted_orange_tulip\n5280\tpotted_white_tulip\n5281\tpotted_pink_tulip\n5282\tpotted_oxeye_daisy\n5283\tpotted_red_mushroom\n5284\tpotted_brown_mushroom\n5285\tpotted_dead_bush\n5286\tpotted_cactus\n5287\tcarrots\tage\t0\n5288\tcarrots\tage\t1\n5289\tcarrots\tage\t2\n5290\tcarrots\tage\t3\n5291\tcarrots\tage\t4\n5292\tcarrots\tage\t5\n5293\tcarrots\tage\t6\n5294\tcarrots\tage\t7\n5295\tpotatoes\tage\t0\n5296\tpotatoes\tage\t1\n5297\tpotatoes\tage\t2\n5298\tpotatoes\tage\t3\n5299\tpotatoes\tage\t4\n5300\tpotatoes\tage\t5\n5301\tpotatoes\tage\t6\n5302\tpotatoes\tage\t7\n5303\toak_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5304\toak_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5305\toak_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5306\toak_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5307\toak_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5308\toak_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5309\toak_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5310\toak_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5311\toak_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5312\toak_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5313\toak_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5314\toak_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5315\toak_button\tfacing\twest\tface\twall\tpowered\ttrue\n5316\toak_button\tfacing\twest\tface\twall\tpowered\tfalse\n5317\toak_button\tfacing\teast\tface\twall\tpowered\ttrue\n5318\toak_button\tfacing\teast\tface\twall\tpowered\tfalse\n5319\toak_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5320\toak_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5321\toak_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5322\toak_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5323\toak_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5324\toak_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5325\toak_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5326\toak_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5327\tspruce_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5328\tspruce_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5329\tspruce_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5330\tspruce_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5331\tspruce_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5332\tspruce_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5333\tspruce_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5334\tspruce_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5335\tspruce_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5336\tspruce_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5337\tspruce_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5338\tspruce_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5339\tspruce_button\tfacing\twest\tface\twall\tpowered\ttrue\n5340\tspruce_button\tfacing\twest\tface\twall\tpowered\tfalse\n5341\tspruce_button\tfacing\teast\tface\twall\tpowered\ttrue\n5342\tspruce_button\tfacing\teast\tface\twall\tpowered\tfalse\n5343\tspruce_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5344\tspruce_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5345\tspruce_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5346\tspruce_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5347\tspruce_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5348\tspruce_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5349\tspruce_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5350\tspruce_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5351\tbirch_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5352\tbirch_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5353\tbirch_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5354\tbirch_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5355\tbirch_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5356\tbirch_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5357\tbirch_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5358\tbirch_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5359\tbirch_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5360\tbirch_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5361\tbirch_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5362\tbirch_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5363\tbirch_button\tfacing\twest\tface\twall\tpowered\ttrue\n5364\tbirch_button\tfacing\twest\tface\twall\tpowered\tfalse\n5365\tbirch_button\tfacing\teast\tface\twall\tpowered\ttrue\n5366\tbirch_button\tfacing\teast\tface\twall\tpowered\tfalse\n5367\tbirch_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5368\tbirch_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5369\tbirch_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5370\tbirch_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5371\tbirch_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5372\tbirch_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5373\tbirch_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5374\tbirch_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5375\tjungle_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5376\tjungle_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5377\tjungle_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5378\tjungle_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5379\tjungle_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5380\tjungle_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5381\tjungle_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5382\tjungle_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5383\tjungle_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5384\tjungle_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5385\tjungle_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5386\tjungle_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5387\tjungle_button\tfacing\twest\tface\twall\tpowered\ttrue\n5388\tjungle_button\tfacing\twest\tface\twall\tpowered\tfalse\n5389\tjungle_button\tfacing\teast\tface\twall\tpowered\ttrue\n5390\tjungle_button\tfacing\teast\tface\twall\tpowered\tfalse\n5391\tjungle_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5392\tjungle_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5393\tjungle_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5394\tjungle_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5395\tjungle_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5396\tjungle_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5397\tjungle_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5398\tjungle_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5399\tacacia_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5400\tacacia_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5401\tacacia_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5402\tacacia_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5403\tacacia_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5404\tacacia_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5405\tacacia_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5406\tacacia_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5407\tacacia_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5408\tacacia_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5409\tacacia_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5410\tacacia_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5411\tacacia_button\tfacing\twest\tface\twall\tpowered\ttrue\n5412\tacacia_button\tfacing\twest\tface\twall\tpowered\tfalse\n5413\tacacia_button\tfacing\teast\tface\twall\tpowered\ttrue\n5414\tacacia_button\tfacing\teast\tface\twall\tpowered\tfalse\n5415\tacacia_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5416\tacacia_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5417\tacacia_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5418\tacacia_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5419\tacacia_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5420\tacacia_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5421\tacacia_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5422\tacacia_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5423\tdark_oak_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5424\tdark_oak_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5425\tdark_oak_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5426\tdark_oak_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5427\tdark_oak_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5428\tdark_oak_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5429\tdark_oak_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5430\tdark_oak_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5431\tdark_oak_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5432\tdark_oak_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5433\tdark_oak_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5434\tdark_oak_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5435\tdark_oak_button\tfacing\twest\tface\twall\tpowered\ttrue\n5436\tdark_oak_button\tfacing\twest\tface\twall\tpowered\tfalse\n5437\tdark_oak_button\tfacing\teast\tface\twall\tpowered\ttrue\n5438\tdark_oak_button\tfacing\teast\tface\twall\tpowered\tfalse\n5439\tdark_oak_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5440\tdark_oak_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5441\tdark_oak_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5442\tdark_oak_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5443\tdark_oak_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5444\tdark_oak_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5445\tdark_oak_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5446\tdark_oak_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5447\tskeleton_wall_skull\tfacing\tnorth\n5448\tskeleton_wall_skull\tfacing\tsouth\n5449\tskeleton_wall_skull\tfacing\twest\n5450\tskeleton_wall_skull\tfacing\teast\n5451\tskeleton_skull\trotation\t0\n5452\tskeleton_skull\trotation\t1\n5453\tskeleton_skull\trotation\t2\n5454\tskeleton_skull\trotation\t3\n5455\tskeleton_skull\trotation\t4\n5456\tskeleton_skull\trotation\t5\n5457\tskeleton_skull\trotation\t6\n5458\tskeleton_skull\trotation\t7\n5459\tskeleton_skull\trotation\t8\n5460\tskeleton_skull\trotation\t9\n5461\tskeleton_skull\trotation\t10\n5462\tskeleton_skull\trotation\t11\n5463\tskeleton_skull\trotation\t12\n5464\tskeleton_skull\trotation\t13\n5465\tskeleton_skull\trotation\t14\n5466\tskeleton_skull\trotation\t15\n5467\twither_skeleton_wall_skull\tfacing\tnorth\n5468\twither_skeleton_wall_skull\tfacing\tsouth\n5469\twither_skeleton_wall_skull\tfacing\twest\n5470\twither_skeleton_wall_skull\tfacing\teast\n5471\twither_skeleton_skull\trotation\t0\n5472\twither_skeleton_skull\trotation\t1\n5473\twither_skeleton_skull\trotation\t2\n5474\twither_skeleton_skull\trotation\t3\n5475\twither_skeleton_skull\trotation\t4\n5476\twither_skeleton_skull\trotation\t5\n5477\twither_skeleton_skull\trotation\t6\n5478\twither_skeleton_skull\trotation\t7\n5479\twither_skeleton_skull\trotation\t8\n5480\twither_skeleton_skull\trotation\t9\n5481\twither_skeleton_skull\trotation\t10\n5482\twither_skeleton_skull\trotation\t11\n5483\twither_skeleton_skull\trotation\t12\n5484\twither_skeleton_skull\trotation\t13\n5485\twither_skeleton_skull\trotation\t14\n5486\twither_skeleton_skull\trotation\t15\n5487\tzombie_wall_head\tfacing\tnorth\n5488\tzombie_wall_head\tfacing\tsouth\n5489\tzombie_wall_head\tfacing\twest\n5490\tzombie_wall_head\tfacing\teast\n5491\tzombie_head\trotation\t0\n5492\tzombie_head\trotation\t1\n5493\tzombie_head\trotation\t2\n5494\tzombie_head\trotation\t3\n5495\tzombie_head\trotation\t4\n5496\tzombie_head\trotation\t5\n5497\tzombie_head\trotation\t6\n5498\tzombie_head\trotation\t7\n5499\tzombie_head\trotation\t8\n5500\tzombie_head\trotation\t9\n5501\tzombie_head\trotation\t10\n5502\tzombie_head\trotation\t11\n5503\tzombie_head\trotation\t12\n5504\tzombie_head\trotation\t13\n5505\tzombie_head\trotation\t14\n5506\tzombie_head\trotation\t15\n5507\tplayer_wall_head\tfacing\tnorth\n5508\tplayer_wall_head\tfacing\tsouth\n5509\tplayer_wall_head\tfacing\twest\n5510\tplayer_wall_head\tfacing\teast\n5511\tplayer_head\trotation\t0\n5512\tplayer_head\trotation\t1\n5513\tplayer_head\trotation\t2\n5514\tplayer_head\trotation\t3\n5515\tplayer_head\trotation\t4\n5516\tplayer_head\trotation\t5\n5517\tplayer_head\trotation\t6\n5518\tplayer_head\trotation\t7\n5519\tplayer_head\trotation\t8\n5520\tplayer_head\trotation\t9\n5521\tplayer_head\trotation\t10\n5522\tplayer_head\trotation\t11\n5523\tplayer_head\trotation\t12\n5524\tplayer_head\trotation\t13\n5525\tplayer_head\trotation\t14\n5526\tplayer_head\trotation\t15\n5527\tcreeper_wall_head\tfacing\tnorth\n5528\tcreeper_wall_head\tfacing\tsouth\n5529\tcreeper_wall_head\tfacing\twest\n5530\tcreeper_wall_head\tfacing\teast\n5531\tcreeper_head\trotation\t0\n5532\tcreeper_head\trotation\t1\n5533\tcreeper_head\trotation\t2\n5534\tcreeper_head\trotation\t3\n5535\tcreeper_head\trotation\t4\n5536\tcreeper_head\trotation\t5\n5537\tcreeper_head\trotation\t6\n5538\tcreeper_head\trotation\t7\n5539\tcreeper_head\trotation\t8\n5540\tcreeper_head\trotation\t9\n5541\tcreeper_head\trotation\t10\n5542\tcreeper_head\trotation\t11\n5543\tcreeper_head\trotation\t12\n5544\tcreeper_head\trotation\t13\n5545\tcreeper_head\trotation\t14\n5546\tcreeper_head\trotation\t15\n5547\tdragon_wall_head\tfacing\tnorth\n5548\tdragon_wall_head\tfacing\tsouth\n5549\tdragon_wall_head\tfacing\twest\n5550\tdragon_wall_head\tfacing\teast\n5551\tdragon_head\trotation\t0\n5552\tdragon_head\trotation\t1\n5553\tdragon_head\trotation\t2\n5554\tdragon_head\trotation\t3\n5555\tdragon_head\trotation\t4\n5556\tdragon_head\trotation\t5\n5557\tdragon_head\trotation\t6\n5558\tdragon_head\trotation\t7\n5559\tdragon_head\trotation\t8\n5560\tdragon_head\trotation\t9\n5561\tdragon_head\trotation\t10\n5562\tdragon_head\trotation\t11\n5563\tdragon_head\trotation\t12\n5564\tdragon_head\trotation\t13\n5565\tdragon_head\trotation\t14\n5566\tdragon_head\trotation\t15\n5567\tanvil\tfacing\tnorth\n5568\tanvil\tfacing\tsouth\n5569\tanvil\tfacing\twest\n5570\tanvil\tfacing\teast\n5571\tchipped_anvil\tfacing\tnorth\n5572\tchipped_anvil\tfacing\tsouth\n5573\tchipped_anvil\tfacing\twest\n5574\tchipped_anvil\tfacing\teast\n5575\tdamaged_anvil\tfacing\tnorth\n5576\tdamaged_anvil\tfacing\tsouth\n5577\tdamaged_anvil\tfacing\twest\n5578\tdamaged_anvil\tfacing\teast\n5579\ttrapped_chest\tfacing\tnorth\twaterlogged\ttrue\ttype\tsingle\n5580\ttrapped_chest\tfacing\tnorth\twaterlogged\tfalse\ttype\tsingle\n5581\ttrapped_chest\tfacing\tnorth\twaterlogged\ttrue\ttype\tleft\n5582\ttrapped_chest\tfacing\tnorth\twaterlogged\tfalse\ttype\tleft\n5583\ttrapped_chest\tfacing\tnorth\twaterlogged\ttrue\ttype\tright\n5584\ttrapped_chest\tfacing\tnorth\twaterlogged\tfalse\ttype\tright\n5585\ttrapped_chest\tfacing\tsouth\twaterlogged\ttrue\ttype\tsingle\n5586\ttrapped_chest\tfacing\tsouth\twaterlogged\tfalse\ttype\tsingle\n5587\ttrapped_chest\tfacing\tsouth\twaterlogged\ttrue\ttype\tleft\n5588\ttrapped_chest\tfacing\tsouth\twaterlogged\tfalse\ttype\tleft\n5589\ttrapped_chest\tfacing\tsouth\twaterlogged\ttrue\ttype\tright\n5590\ttrapped_chest\tfacing\tsouth\twaterlogged\tfalse\ttype\tright\n5591\ttrapped_chest\tfacing\twest\twaterlogged\ttrue\ttype\tsingle\n5592\ttrapped_chest\tfacing\twest\twaterlogged\tfalse\ttype\tsingle\n5593\ttrapped_chest\tfacing\twest\twaterlogged\ttrue\ttype\tleft\n5594\ttrapped_chest\tfacing\twest\twaterlogged\tfalse\ttype\tleft\n5595\ttrapped_chest\tfacing\twest\twaterlogged\ttrue\ttype\tright\n5596\ttrapped_chest\tfacing\twest\twaterlogged\tfalse\ttype\tright\n5597\ttrapped_chest\tfacing\teast\twaterlogged\ttrue\ttype\tsingle\n5598\ttrapped_chest\tfacing\teast\twaterlogged\tfalse\ttype\tsingle\n5599\ttrapped_chest\tfacing\teast\twaterlogged\ttrue\ttype\tleft\n5600\ttrapped_chest\tfacing\teast\twaterlogged\tfalse\ttype\tleft\n5601\ttrapped_chest\tfacing\teast\twaterlogged\ttrue\ttype\tright\n5602\ttrapped_chest\tfacing\teast\twaterlogged\tfalse\ttype\tright\n5603\tlight_weighted_pressure_plate\tpower\t0\n5604\tlight_weighted_pressure_plate\tpower\t1\n5605\tlight_weighted_pressure_plate\tpower\t2\n5606\tlight_weighted_pressure_plate\tpower\t3\n5607\tlight_weighted_pressure_plate\tpower\t4\n5608\tlight_weighted_pressure_plate\tpower\t5\n5609\tlight_weighted_pressure_plate\tpower\t6\n5610\tlight_weighted_pressure_plate\tpower\t7\n5611\tlight_weighted_pressure_plate\tpower\t8\n5612\tlight_weighted_pressure_plate\tpower\t9\n5613\tlight_weighted_pressure_plate\tpower\t10\n5614\tlight_weighted_pressure_plate\tpower\t11\n5615\tlight_weighted_pressure_plate\tpower\t12\n5616\tlight_weighted_pressure_plate\tpower\t13\n5617\tlight_weighted_pressure_plate\tpower\t14\n5618\tlight_weighted_pressure_plate\tpower\t15\n5619\theavy_weighted_pressure_plate\tpower\t0\n5620\theavy_weighted_pressure_plate\tpower\t1\n5621\theavy_weighted_pressure_plate\tpower\t2\n5622\theavy_weighted_pressure_plate\tpower\t3\n5623\theavy_weighted_pressure_plate\tpower\t4\n5624\theavy_weighted_pressure_plate\tpower\t5\n5625\theavy_weighted_pressure_plate\tpower\t6\n5626\theavy_weighted_pressure_plate\tpower\t7\n5627\theavy_weighted_pressure_plate\tpower\t8\n5628\theavy_weighted_pressure_plate\tpower\t9\n5629\theavy_weighted_pressure_plate\tpower\t10\n5630\theavy_weighted_pressure_plate\tpower\t11\n5631\theavy_weighted_pressure_plate\tpower\t12\n5632\theavy_weighted_pressure_plate\tpower\t13\n5633\theavy_weighted_pressure_plate\tpower\t14\n5634\theavy_weighted_pressure_plate\tpower\t15\n5635\tcomparator\tfacing\tnorth\tmode\tcompare\tpowered\ttrue\n5636\tcomparator\tfacing\tnorth\tmode\tcompare\tpowered\tfalse\n5637\tcomparator\tfacing\tnorth\tmode\tsubtract\tpowered\ttrue\n5638\tcomparator\tfacing\tnorth\tmode\tsubtract\tpowered\tfalse\n5639\tcomparator\tfacing\tsouth\tmode\tcompare\tpowered\ttrue\n5640\tcomparator\tfacing\tsouth\tmode\tcompare\tpowered\tfalse\n5641\tcomparator\tfacing\tsouth\tmode\tsubtract\tpowered\ttrue\n5642\tcomparator\tfacing\tsouth\tmode\tsubtract\tpowered\tfalse\n5643\tcomparator\tfacing\twest\tmode\tcompare\tpowered\ttrue\n5644\tcomparator\tfacing\twest\tmode\tcompare\tpowered\tfalse\n5645\tcomparator\tfacing\twest\tmode\tsubtract\tpowered\ttrue\n5646\tcomparator\tfacing\twest\tmode\tsubtract\tpowered\tfalse\n5647\tcomparator\tfacing\teast\tmode\tcompare\tpowered\ttrue\n5648\tcomparator\tfacing\teast\tmode\tcompare\tpowered\tfalse\n5649\tcomparator\tfacing\teast\tmode\tsubtract\tpowered\ttrue\n5650\tcomparator\tfacing\teast\tmode\tsubtract\tpowered\tfalse\n5651\tdaylight_detector\tinverted\ttrue\tpower\t0\n5652\tdaylight_detector\tinverted\ttrue\tpower\t1\n5653\tdaylight_detector\tinverted\ttrue\tpower\t2\n5654\tdaylight_detector\tinverted\ttrue\tpower\t3\n5655\tdaylight_detector\tinverted\ttrue\tpower\t4\n5656\tdaylight_detector\tinverted\ttrue\tpower\t5\n5657\tdaylight_detector\tinverted\ttrue\tpower\t6\n5658\tdaylight_detector\tinverted\ttrue\tpower\t7\n5659\tdaylight_detector\tinverted\ttrue\tpower\t8\n5660\tdaylight_detector\tinverted\ttrue\tpower\t9\n5661\tdaylight_detector\tinverted\ttrue\tpower\t10\n5662\tdaylight_detector\tinverted\ttrue\tpower\t11\n5663\tdaylight_detector\tinverted\ttrue\tpower\t12\n5664\tdaylight_detector\tinverted\ttrue\tpower\t13\n5665\tdaylight_detector\tinverted\ttrue\tpower\t14\n5666\tdaylight_detector\tinverted\ttrue\tpower\t15\n5667\tdaylight_detector\tinverted\tfalse\tpower\t0\n5668\tdaylight_detector\tinverted\tfalse\tpower\t1\n5669\tdaylight_detector\tinverted\tfalse\tpower\t2\n5670\tdaylight_detector\tinverted\tfalse\tpower\t3\n5671\tdaylight_detector\tinverted\tfalse\tpower\t4\n5672\tdaylight_detector\tinverted\tfalse\tpower\t5\n5673\tdaylight_detector\tinverted\tfalse\tpower\t6\n5674\tdaylight_detector\tinverted\tfalse\tpower\t7\n5675\tdaylight_detector\tinverted\tfalse\tpower\t8\n5676\tdaylight_detector\tinverted\tfalse\tpower\t9\n5677\tdaylight_detector\tinverted\tfalse\tpower\t10\n5678\tdaylight_detector\tinverted\tfalse\tpower\t11\n5679\tdaylight_detector\tinverted\tfalse\tpower\t12\n5680\tdaylight_detector\tinverted\tfalse\tpower\t13\n5681\tdaylight_detector\tinverted\tfalse\tpower\t14\n5682\tdaylight_detector\tinverted\tfalse\tpower\t15\n5683\tredstone_block\n5684\tnether_quartz_ore\n5685\thopper\tfacing\tdown\tenabled\ttrue\n5686\thopper\tfacing\tnorth\tenabled\ttrue\n5687\thopper\tfacing\tsouth\tenabled\ttrue\n5688\thopper\tfacing\twest\tenabled\ttrue\n5689\thopper\tfacing\teast\tenabled\ttrue\n5690\thopper\tfacing\tdown\tenabled\tfalse\n5691\thopper\tfacing\tnorth\tenabled\tfalse\n5692\thopper\tfacing\tsouth\tenabled\tfalse\n5693\thopper\tfacing\twest\tenabled\tfalse\n5694\thopper\tfacing\teast\tenabled\tfalse\n5695\tquartz_block\n5696\tchiseled_quartz_block\n5697\tquartz_pillar\taxis\tx\n5698\tquartz_pillar\taxis\ty\n5699\tquartz_pillar\taxis\tz\n5700\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5701\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5702\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5703\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5704\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5705\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5706\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5707\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5708\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5709\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5710\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5711\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5712\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5713\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5714\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5715\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5716\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5717\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5718\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5719\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5720\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5721\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5722\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5723\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5724\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5725\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5726\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5727\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5728\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5729\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5730\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5731\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5732\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5733\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5734\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5735\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5736\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5737\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5738\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5739\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5740\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5741\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5742\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5743\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5744\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5745\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5746\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5747\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5748\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5749\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5750\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5751\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5752\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5753\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5754\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5755\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5756\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5757\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5758\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5759\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5760\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5761\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5762\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5763\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5764\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5765\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5766\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5767\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5768\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5769\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5770\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5771\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5772\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5773\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5774\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5775\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5776\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5777\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5778\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5779\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5780\tactivator_rail\tshape\tnorth_south\tpowered\ttrue\n5781\tactivator_rail\tshape\teast_west\tpowered\ttrue\n5782\tactivator_rail\tshape\tascending_east\tpowered\ttrue\n5783\tactivator_rail\tshape\tascending_west\tpowered\ttrue\n5784\tactivator_rail\tshape\tascending_north\tpowered\ttrue\n5785\tactivator_rail\tshape\tascending_south\tpowered\ttrue\n5786\tactivator_rail\tshape\tnorth_south\tpowered\tfalse\n5787\tactivator_rail\tshape\teast_west\tpowered\tfalse\n5788\tactivator_rail\tshape\tascending_east\tpowered\tfalse\n5789\tactivator_rail\tshape\tascending_west\tpowered\tfalse\n5790\tactivator_rail\tshape\tascending_north\tpowered\tfalse\n5791\tactivator_rail\tshape\tascending_south\tpowered\tfalse\n5792\tdropper\tfacing\tnorth\ttriggered\ttrue\n5793\tdropper\tfacing\tnorth\ttriggered\tfalse\n5794\tdropper\tfacing\teast\ttriggered\ttrue\n5795\tdropper\tfacing\teast\ttriggered\tfalse\n5796\tdropper\tfacing\tsouth\ttriggered\ttrue\n5797\tdropper\tfacing\tsouth\ttriggered\tfalse\n5798\tdropper\tfacing\twest\ttriggered\ttrue\n5799\tdropper\tfacing\twest\ttriggered\tfalse\n5800\tdropper\tfacing\tup\ttriggered\ttrue\n5801\tdropper\tfacing\tup\ttriggered\tfalse\n5802\tdropper\tfacing\tdown\ttriggered\ttrue\n5803\tdropper\tfacing\tdown\ttriggered\tfalse\n5804\twhite_terracotta\n5805\torange_terracotta\n5806\tmagenta_terracotta\n5807\tlight_blue_terracotta\n5808\tyellow_terracotta\n5809\tlime_terracotta\n5810\tpink_terracotta\n5811\tgray_terracotta\n5812\tlight_gray_terracotta\n5813\tcyan_terracotta\n5814\tpurple_terracotta\n5815\tblue_terracotta\n5816\tbrown_terracotta\n5817\tgreen_terracotta\n5818\tred_terracotta\n5819\tblack_terracotta\n5820\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5821\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5822\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5823\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5824\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5825\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5826\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5827\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5828\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5829\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5830\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5831\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5832\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5833\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5834\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5835\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5836\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5837\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5838\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5839\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5840\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5841\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5842\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5843\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5844\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5845\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5846\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5847\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5848\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5849\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5850\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5851\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5852\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5853\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5854\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5855\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5856\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5857\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5858\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5859\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5860\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5861\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5862\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5863\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5864\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5865\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5866\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5867\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5868\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5869\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5870\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5871\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5872\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5873\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5874\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5875\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5876\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5877\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5878\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5879\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5880\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5881\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5882\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5883\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5884\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5885\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5886\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5887\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5888\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5889\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5890\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5891\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5892\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5893\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5894\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5895\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5896\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5897\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5898\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5899\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5900\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5901\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5902\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5903\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5904\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5905\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5906\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5907\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5908\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5909\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5910\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5911\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5912\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5913\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5914\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5915\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5916\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5917\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5918\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5919\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5920\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5921\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5922\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5923\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5924\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5925\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5926\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5927\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5928\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5929\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5930\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5931\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5932\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5933\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5934\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5935\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5936\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5937\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5938\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5939\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5940\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5941\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5942\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5943\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5944\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5945\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5946\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5947\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5948\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5949\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5950\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5951\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5952\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5953\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5954\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5955\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5956\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5957\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5958\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5959\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5960\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5961\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5962\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5963\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5964\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5965\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5966\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5967\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5968\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5969\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5970\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5971\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5972\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5973\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5974\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5975\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5976\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5977\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5978\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5979\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5980\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5981\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5982\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5983\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5984\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5985\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5986\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5987\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5988\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5989\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5990\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5991\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5992\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5993\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5994\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5995\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5996\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5997\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5998\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5999\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6000\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6001\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6002\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6003\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6004\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6005\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6006\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6007\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6008\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6009\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6010\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6011\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6012\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6013\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6014\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6015\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6016\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6017\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6018\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6019\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6020\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6021\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6022\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6023\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6024\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6025\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6026\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6027\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6028\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6029\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6030\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6031\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6032\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6033\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6034\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6035\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6036\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6037\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6038\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6039\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6040\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6041\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6042\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6043\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6044\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6045\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6046\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6047\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6048\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6049\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6050\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6051\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6052\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6053\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6054\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6055\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6056\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6057\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6058\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6059\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6060\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6061\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6062\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6063\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6064\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6065\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6066\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6067\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6068\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6069\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6070\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6071\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6072\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6073\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6074\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6075\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6076\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6077\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6078\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6079\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6080\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6081\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6082\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6083\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6084\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6085\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6086\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6087\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6088\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6089\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6090\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6091\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6092\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6093\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6094\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6095\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6096\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6097\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6098\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6099\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6100\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6101\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6102\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6103\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6104\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6105\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6106\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6107\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6108\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6109\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6110\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6111\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6112\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6113\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6114\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6115\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6116\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6117\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6118\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6119\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6120\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6121\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6122\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6123\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6124\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6125\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6126\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6127\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6128\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6129\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6130\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6131\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6132\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6133\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6134\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6135\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6136\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6137\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6138\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6139\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6140\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6141\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6142\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6143\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6144\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6145\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6146\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6147\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6148\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6149\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6150\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6151\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6152\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6153\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6154\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6155\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6156\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6157\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6158\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6159\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6160\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6161\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6162\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6163\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6164\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6165\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6166\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6167\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6168\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6169\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6170\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6171\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6172\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6173\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6174\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6175\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6176\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6177\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6178\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6179\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6180\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6181\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6182\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6183\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6184\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6185\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6186\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6187\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6188\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6189\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6190\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6191\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6192\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6193\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6194\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6195\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6196\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6197\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6198\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6199\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6200\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6201\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6202\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6203\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6204\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6205\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6206\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6207\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6208\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6209\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6210\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6211\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6212\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6213\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6214\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6215\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6216\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6217\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6218\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6219\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6220\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6221\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6222\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6223\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6224\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6225\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6226\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6227\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6228\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6229\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6230\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6231\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6232\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6233\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6234\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6235\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6236\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6237\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6238\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6239\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6240\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6241\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6242\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6243\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6244\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6245\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6246\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6247\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6248\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6249\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6250\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6251\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6252\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6253\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6254\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6255\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6256\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6257\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6258\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6259\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6260\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6261\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6262\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6263\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6264\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6265\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6266\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6267\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6268\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6269\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6270\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6271\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6272\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6273\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6274\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6275\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6276\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6277\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6278\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6279\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6280\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6281\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6282\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6283\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6284\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6285\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6286\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6287\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6288\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6289\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6290\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6291\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6292\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6293\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6294\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6295\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6296\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6297\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6298\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6299\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6300\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6301\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6302\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6303\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6304\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6305\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6306\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6307\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6308\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6309\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6310\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6311\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6312\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6313\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6314\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6315\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6316\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6317\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6318\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6319\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6320\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6321\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6322\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6323\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6324\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6325\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6326\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6327\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6328\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6329\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6330\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6331\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6332\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6333\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6334\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6335\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6336\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6337\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6338\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6339\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6340\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6341\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6342\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6343\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6344\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6345\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6346\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6347\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6348\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6349\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6350\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6351\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6352\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6353\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6354\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6355\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6356\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6357\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6358\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6359\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6360\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6361\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6362\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6363\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6364\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6365\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6366\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6367\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6368\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6369\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6370\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6371\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6372\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6373\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6374\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6375\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6376\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6377\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6378\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6379\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6380\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6381\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6382\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6383\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6384\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6385\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6386\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6387\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6388\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6389\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6390\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6391\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6392\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6393\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6394\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6395\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6396\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6397\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6398\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6399\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6400\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6401\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6402\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6403\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6404\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6405\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6406\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6407\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6408\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6409\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6410\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6411\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6412\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6413\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6414\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6415\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6416\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6417\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6418\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6419\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6420\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6421\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6422\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6423\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6424\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6425\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6426\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6427\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6428\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6429\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6430\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6431\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6432\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6433\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6434\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6435\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6436\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6437\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6438\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6439\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6440\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6441\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6442\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6443\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6444\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6445\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6446\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6447\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6448\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6449\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6450\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6451\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6452\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6453\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6454\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6455\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6456\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6457\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6458\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6459\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6460\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6461\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6462\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6463\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6464\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6465\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6466\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6467\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6468\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6469\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6470\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6471\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6472\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6473\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6474\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6475\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6476\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6477\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6478\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6479\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6480\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6481\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6482\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6483\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6484\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6485\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6486\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6487\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6488\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6489\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6490\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6491\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6492\tslime_block\n6493\tbarrier\n6494\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n6495\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n6496\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n6497\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n6498\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n6499\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n6500\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n6501\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n6502\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n6503\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n6504\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n6505\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n6506\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n6507\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n6508\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n6509\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n6510\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n6511\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n6512\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n6513\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n6514\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n6515\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n6516\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n6517\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n6518\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n6519\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n6520\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n6521\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n6522\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n6523\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n6524\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n6525\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n6526\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n6527\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n6528\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n6529\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n6530\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n6531\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n6532\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n6533\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n6534\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n6535\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n6536\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n6537\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n6538\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n6539\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n6540\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n6541\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n6542\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n6543\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n6544\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n6545\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n6546\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n6547\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n6548\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n6549\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n6550\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n6551\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n6552\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n6553\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n6554\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n6555\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n6556\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n6557\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n6558\tprismarine\n6559\tprismarine_bricks\n6560\tdark_prismarine\n6561\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6562\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6563\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6564\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6565\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6566\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6567\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6568\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6569\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6570\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6571\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6572\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6573\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6574\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6575\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6576\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6577\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6578\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6579\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6580\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6581\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6582\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6583\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6584\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6585\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6586\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6587\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6588\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6589\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6590\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6591\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6592\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6593\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6594\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6595\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6596\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6597\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6598\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6599\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6600\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6601\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6602\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6603\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6604\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6605\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6606\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6607\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6608\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6609\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6610\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6611\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6612\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6613\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6614\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6615\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6616\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6617\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6618\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6619\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6620\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6621\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6622\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6623\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6624\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6625\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6626\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6627\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6628\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6629\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6630\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6631\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6632\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6633\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6634\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6635\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6636\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6637\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6638\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6639\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6640\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6641\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6642\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6643\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6644\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6645\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6646\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6647\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6648\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6649\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6650\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6651\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6652\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6653\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6654\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6655\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6656\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6657\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6658\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6659\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6660\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6661\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6662\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6663\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6664\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6665\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6666\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6667\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6668\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6669\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6670\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6671\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6672\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6673\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6674\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6675\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6676\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6677\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6678\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6679\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6680\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6681\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6682\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6683\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6684\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6685\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6686\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6687\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6688\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6689\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6690\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6691\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6692\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6693\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6694\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6695\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6696\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6697\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6698\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6699\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6700\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6701\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6702\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6703\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6704\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6705\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6706\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6707\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6708\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6709\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6710\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6711\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6712\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6713\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6714\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6715\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6716\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6717\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6718\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6719\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6720\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6721\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6722\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6723\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6724\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6725\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6726\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6727\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6728\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6729\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6730\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6731\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6732\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6733\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6734\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6735\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6736\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6737\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6738\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6739\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6740\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6741\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6742\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6743\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6744\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6745\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6746\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6747\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6748\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6749\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6750\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6751\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6752\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6753\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6754\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6755\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6756\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6757\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6758\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6759\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6760\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6761\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6762\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6763\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6764\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6765\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6766\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6767\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6768\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6769\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6770\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6771\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6772\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6773\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6774\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6775\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6776\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6777\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6778\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6779\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6780\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6781\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6782\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6783\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6784\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6785\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6786\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6787\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6788\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6789\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6790\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6791\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6792\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6793\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6794\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6795\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6796\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6797\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6798\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6799\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6800\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6801\tprismarine_slab\ttype\ttop\twaterlogged\ttrue\n6802\tprismarine_slab\ttype\ttop\twaterlogged\tfalse\n6803\tprismarine_slab\ttype\tbottom\twaterlogged\ttrue\n6804\tprismarine_slab\ttype\tbottom\twaterlogged\tfalse\n6805\tprismarine_slab\ttype\tdouble\twaterlogged\ttrue\n6806\tprismarine_slab\ttype\tdouble\twaterlogged\tfalse\n6807\tprismarine_brick_slab\ttype\ttop\twaterlogged\ttrue\n6808\tprismarine_brick_slab\ttype\ttop\twaterlogged\tfalse\n6809\tprismarine_brick_slab\ttype\tbottom\twaterlogged\ttrue\n6810\tprismarine_brick_slab\ttype\tbottom\twaterlogged\tfalse\n6811\tprismarine_brick_slab\ttype\tdouble\twaterlogged\ttrue\n6812\tprismarine_brick_slab\ttype\tdouble\twaterlogged\tfalse\n6813\tdark_prismarine_slab\ttype\ttop\twaterlogged\ttrue\n6814\tdark_prismarine_slab\ttype\ttop\twaterlogged\tfalse\n6815\tdark_prismarine_slab\ttype\tbottom\twaterlogged\ttrue\n6816\tdark_prismarine_slab\ttype\tbottom\twaterlogged\tfalse\n6817\tdark_prismarine_slab\ttype\tdouble\twaterlogged\ttrue\n6818\tdark_prismarine_slab\ttype\tdouble\twaterlogged\tfalse\n6819\tsea_lantern\n6820\thay_block\taxis\tx\n6821\thay_block\taxis\ty\n6822\thay_block\taxis\tz\n6823\twhite_carpet\n6824\torange_carpet\n6825\tmagenta_carpet\n6826\tlight_blue_carpet\n6827\tyellow_carpet\n6828\tlime_carpet\n6829\tpink_carpet\n6830\tgray_carpet\n6831\tlight_gray_carpet\n6832\tcyan_carpet\n6833\tpurple_carpet\n6834\tblue_carpet\n6835\tbrown_carpet\n6836\tgreen_carpet\n6837\tred_carpet\n6838\tblack_carpet\n6839\tterracotta\n6840\tcoal_block\n6841\tpacked_ice\n6842\tsunflower\thalf\tupper\n6843\tsunflower\thalf\tlower\n6844\tlilac\thalf\tupper\n6845\tlilac\thalf\tlower\n6846\trose_bush\thalf\tupper\n6847\trose_bush\thalf\tlower\n6848\tpeony\thalf\tupper\n6849\tpeony\thalf\tlower\n6850\ttall_grass\thalf\tupper\n6851\ttall_grass\thalf\tlower\n6852\tlarge_fern\thalf\tupper\n6853\tlarge_fern\thalf\tlower\n6854\twhite_banner\trotation\t0\n6855\twhite_banner\trotation\t1\n6856\twhite_banner\trotation\t2\n6857\twhite_banner\trotation\t3\n6858\twhite_banner\trotation\t4\n6859\twhite_banner\trotation\t5\n6860\twhite_banner\trotation\t6\n6861\twhite_banner\trotation\t7\n6862\twhite_banner\trotation\t8\n6863\twhite_banner\trotation\t9\n6864\twhite_banner\trotation\t10\n6865\twhite_banner\trotation\t11\n6866\twhite_banner\trotation\t12\n6867\twhite_banner\trotation\t13\n6868\twhite_banner\trotation\t14\n6869\twhite_banner\trotation\t15\n6870\torange_banner\trotation\t0\n6871\torange_banner\trotation\t1\n6872\torange_banner\trotation\t2\n6873\torange_banner\trotation\t3\n6874\torange_banner\trotation\t4\n6875\torange_banner\trotation\t5\n6876\torange_banner\trotation\t6\n6877\torange_banner\trotation\t7\n6878\torange_banner\trotation\t8\n6879\torange_banner\trotation\t9\n6880\torange_banner\trotation\t10\n6881\torange_banner\trotation\t11\n6882\torange_banner\trotation\t12\n6883\torange_banner\trotation\t13\n6884\torange_banner\trotation\t14\n6885\torange_banner\trotation\t15\n6886\tmagenta_banner\trotation\t0\n6887\tmagenta_banner\trotation\t1\n6888\tmagenta_banner\trotation\t2\n6889\tmagenta_banner\trotation\t3\n6890\tmagenta_banner\trotation\t4\n6891\tmagenta_banner\trotation\t5\n6892\tmagenta_banner\trotation\t6\n6893\tmagenta_banner\trotation\t7\n6894\tmagenta_banner\trotation\t8\n6895\tmagenta_banner\trotation\t9\n6896\tmagenta_banner\trotation\t10\n6897\tmagenta_banner\trotation\t11\n6898\tmagenta_banner\trotation\t12\n6899\tmagenta_banner\trotation\t13\n6900\tmagenta_banner\trotation\t14\n6901\tmagenta_banner\trotation\t15\n6902\tlight_blue_banner\trotation\t0\n6903\tlight_blue_banner\trotation\t1\n6904\tlight_blue_banner\trotation\t2\n6905\tlight_blue_banner\trotation\t3\n6906\tlight_blue_banner\trotation\t4\n6907\tlight_blue_banner\trotation\t5\n6908\tlight_blue_banner\trotation\t6\n6909\tlight_blue_banner\trotation\t7\n6910\tlight_blue_banner\trotation\t8\n6911\tlight_blue_banner\trotation\t9\n6912\tlight_blue_banner\trotation\t10\n6913\tlight_blue_banner\trotation\t11\n6914\tlight_blue_banner\trotation\t12\n6915\tlight_blue_banner\trotation\t13\n6916\tlight_blue_banner\trotation\t14\n6917\tlight_blue_banner\trotation\t15\n6918\tyellow_banner\trotation\t0\n6919\tyellow_banner\trotation\t1\n6920\tyellow_banner\trotation\t2\n6921\tyellow_banner\trotation\t3\n6922\tyellow_banner\trotation\t4\n6923\tyellow_banner\trotation\t5\n6924\tyellow_banner\trotation\t6\n6925\tyellow_banner\trotation\t7\n6926\tyellow_banner\trotation\t8\n6927\tyellow_banner\trotation\t9\n6928\tyellow_banner\trotation\t10\n6929\tyellow_banner\trotation\t11\n6930\tyellow_banner\trotation\t12\n6931\tyellow_banner\trotation\t13\n6932\tyellow_banner\trotation\t14\n6933\tyellow_banner\trotation\t15\n6934\tlime_banner\trotation\t0\n6935\tlime_banner\trotation\t1\n6936\tlime_banner\trotation\t2\n6937\tlime_banner\trotation\t3\n6938\tlime_banner\trotation\t4\n6939\tlime_banner\trotation\t5\n6940\tlime_banner\trotation\t6\n6941\tlime_banner\trotation\t7\n6942\tlime_banner\trotation\t8\n6943\tlime_banner\trotation\t9\n6944\tlime_banner\trotation\t10\n6945\tlime_banner\trotation\t11\n6946\tlime_banner\trotation\t12\n6947\tlime_banner\trotation\t13\n6948\tlime_banner\trotation\t14\n6949\tlime_banner\trotation\t15\n6950\tpink_banner\trotation\t0\n6951\tpink_banner\trotation\t1\n6952\tpink_banner\trotation\t2\n6953\tpink_banner\trotation\t3\n6954\tpink_banner\trotation\t4\n6955\tpink_banner\trotation\t5\n6956\tpink_banner\trotation\t6\n6957\tpink_banner\trotation\t7\n6958\tpink_banner\trotation\t8\n6959\tpink_banner\trotation\t9\n6960\tpink_banner\trotation\t10\n6961\tpink_banner\trotation\t11\n6962\tpink_banner\trotation\t12\n6963\tpink_banner\trotation\t13\n6964\tpink_banner\trotation\t14\n6965\tpink_banner\trotation\t15\n6966\tgray_banner\trotation\t0\n6967\tgray_banner\trotation\t1\n6968\tgray_banner\trotation\t2\n6969\tgray_banner\trotation\t3\n6970\tgray_banner\trotation\t4\n6971\tgray_banner\trotation\t5\n6972\tgray_banner\trotation\t6\n6973\tgray_banner\trotation\t7\n6974\tgray_banner\trotation\t8\n6975\tgray_banner\trotation\t9\n6976\tgray_banner\trotation\t10\n6977\tgray_banner\trotation\t11\n6978\tgray_banner\trotation\t12\n6979\tgray_banner\trotation\t13\n6980\tgray_banner\trotation\t14\n6981\tgray_banner\trotation\t15\n6982\tlight_gray_banner\trotation\t0\n6983\tlight_gray_banner\trotation\t1\n6984\tlight_gray_banner\trotation\t2\n6985\tlight_gray_banner\trotation\t3\n6986\tlight_gray_banner\trotation\t4\n6987\tlight_gray_banner\trotation\t5\n6988\tlight_gray_banner\trotation\t6\n6989\tlight_gray_banner\trotation\t7\n6990\tlight_gray_banner\trotation\t8\n6991\tlight_gray_banner\trotation\t9\n6992\tlight_gray_banner\trotation\t10\n6993\tlight_gray_banner\trotation\t11\n6994\tlight_gray_banner\trotation\t12\n6995\tlight_gray_banner\trotation\t13\n6996\tlight_gray_banner\trotation\t14\n6997\tlight_gray_banner\trotation\t15\n6998\tcyan_banner\trotation\t0\n6999\tcyan_banner\trotation\t1\n7000\tcyan_banner\trotation\t2\n7001\tcyan_banner\trotation\t3\n7002\tcyan_banner\trotation\t4\n7003\tcyan_banner\trotation\t5\n7004\tcyan_banner\trotation\t6\n7005\tcyan_banner\trotation\t7\n7006\tcyan_banner\trotation\t8\n7007\tcyan_banner\trotation\t9\n7008\tcyan_banner\trotation\t10\n7009\tcyan_banner\trotation\t11\n7010\tcyan_banner\trotation\t12\n7011\tcyan_banner\trotation\t13\n7012\tcyan_banner\trotation\t14\n7013\tcyan_banner\trotation\t15\n7014\tpurple_banner\trotation\t0\n7015\tpurple_banner\trotation\t1\n7016\tpurple_banner\trotation\t2\n7017\tpurple_banner\trotation\t3\n7018\tpurple_banner\trotation\t4\n7019\tpurple_banner\trotation\t5\n7020\tpurple_banner\trotation\t6\n7021\tpurple_banner\trotation\t7\n7022\tpurple_banner\trotation\t8\n7023\tpurple_banner\trotation\t9\n7024\tpurple_banner\trotation\t10\n7025\tpurple_banner\trotation\t11\n7026\tpurple_banner\trotation\t12\n7027\tpurple_banner\trotation\t13\n7028\tpurple_banner\trotation\t14\n7029\tpurple_banner\trotation\t15\n7030\tblue_banner\trotation\t0\n7031\tblue_banner\trotation\t1\n7032\tblue_banner\trotation\t2\n7033\tblue_banner\trotation\t3\n7034\tblue_banner\trotation\t4\n7035\tblue_banner\trotation\t5\n7036\tblue_banner\trotation\t6\n7037\tblue_banner\trotation\t7\n7038\tblue_banner\trotation\t8\n7039\tblue_banner\trotation\t9\n7040\tblue_banner\trotation\t10\n7041\tblue_banner\trotation\t11\n7042\tblue_banner\trotation\t12\n7043\tblue_banner\trotation\t13\n7044\tblue_banner\trotation\t14\n7045\tblue_banner\trotation\t15\n7046\tbrown_banner\trotation\t0\n7047\tbrown_banner\trotation\t1\n7048\tbrown_banner\trotation\t2\n7049\tbrown_banner\trotation\t3\n7050\tbrown_banner\trotation\t4\n7051\tbrown_banner\trotation\t5\n7052\tbrown_banner\trotation\t6\n7053\tbrown_banner\trotation\t7\n7054\tbrown_banner\trotation\t8\n7055\tbrown_banner\trotation\t9\n7056\tbrown_banner\trotation\t10\n7057\tbrown_banner\trotation\t11\n7058\tbrown_banner\trotation\t12\n7059\tbrown_banner\trotation\t13\n7060\tbrown_banner\trotation\t14\n7061\tbrown_banner\trotation\t15\n7062\tgreen_banner\trotation\t0\n7063\tgreen_banner\trotation\t1\n7064\tgreen_banner\trotation\t2\n7065\tgreen_banner\trotation\t3\n7066\tgreen_banner\trotation\t4\n7067\tgreen_banner\trotation\t5\n7068\tgreen_banner\trotation\t6\n7069\tgreen_banner\trotation\t7\n7070\tgreen_banner\trotation\t8\n7071\tgreen_banner\trotation\t9\n7072\tgreen_banner\trotation\t10\n7073\tgreen_banner\trotation\t11\n7074\tgreen_banner\trotation\t12\n7075\tgreen_banner\trotation\t13\n7076\tgreen_banner\trotation\t14\n7077\tgreen_banner\trotation\t15\n7078\tred_banner\trotation\t0\n7079\tred_banner\trotation\t1\n7080\tred_banner\trotation\t2\n7081\tred_banner\trotation\t3\n7082\tred_banner\trotation\t4\n7083\tred_banner\trotation\t5\n7084\tred_banner\trotation\t6\n7085\tred_banner\trotation\t7\n7086\tred_banner\trotation\t8\n7087\tred_banner\trotation\t9\n7088\tred_banner\trotation\t10\n7089\tred_banner\trotation\t11\n7090\tred_banner\trotation\t12\n7091\tred_banner\trotation\t13\n7092\tred_banner\trotation\t14\n7093\tred_banner\trotation\t15\n7094\tblack_banner\trotation\t0\n7095\tblack_banner\trotation\t1\n7096\tblack_banner\trotation\t2\n7097\tblack_banner\trotation\t3\n7098\tblack_banner\trotation\t4\n7099\tblack_banner\trotation\t5\n7100\tblack_banner\trotation\t6\n7101\tblack_banner\trotation\t7\n7102\tblack_banner\trotation\t8\n7103\tblack_banner\trotation\t9\n7104\tblack_banner\trotation\t10\n7105\tblack_banner\trotation\t11\n7106\tblack_banner\trotation\t12\n7107\tblack_banner\trotation\t13\n7108\tblack_banner\trotation\t14\n7109\tblack_banner\trotation\t15\n7110\twhite_wall_banner\tfacing\tnorth\n7111\twhite_wall_banner\tfacing\tsouth\n7112\twhite_wall_banner\tfacing\twest\n7113\twhite_wall_banner\tfacing\teast\n7114\torange_wall_banner\tfacing\tnorth\n7115\torange_wall_banner\tfacing\tsouth\n7116\torange_wall_banner\tfacing\twest\n7117\torange_wall_banner\tfacing\teast\n7118\tmagenta_wall_banner\tfacing\tnorth\n7119\tmagenta_wall_banner\tfacing\tsouth\n7120\tmagenta_wall_banner\tfacing\twest\n7121\tmagenta_wall_banner\tfacing\teast\n7122\tlight_blue_wall_banner\tfacing\tnorth\n7123\tlight_blue_wall_banner\tfacing\tsouth\n7124\tlight_blue_wall_banner\tfacing\twest\n7125\tlight_blue_wall_banner\tfacing\teast\n7126\tyellow_wall_banner\tfacing\tnorth\n7127\tyellow_wall_banner\tfacing\tsouth\n7128\tyellow_wall_banner\tfacing\twest\n7129\tyellow_wall_banner\tfacing\teast\n7130\tlime_wall_banner\tfacing\tnorth\n7131\tlime_wall_banner\tfacing\tsouth\n7132\tlime_wall_banner\tfacing\twest\n7133\tlime_wall_banner\tfacing\teast\n7134\tpink_wall_banner\tfacing\tnorth\n7135\tpink_wall_banner\tfacing\tsouth\n7136\tpink_wall_banner\tfacing\twest\n7137\tpink_wall_banner\tfacing\teast\n7138\tgray_wall_banner\tfacing\tnorth\n7139\tgray_wall_banner\tfacing\tsouth\n7140\tgray_wall_banner\tfacing\twest\n7141\tgray_wall_banner\tfacing\teast\n7142\tlight_gray_wall_banner\tfacing\tnorth\n7143\tlight_gray_wall_banner\tfacing\tsouth\n7144\tlight_gray_wall_banner\tfacing\twest\n7145\tlight_gray_wall_banner\tfacing\teast\n7146\tcyan_wall_banner\tfacing\tnorth\n7147\tcyan_wall_banner\tfacing\tsouth\n7148\tcyan_wall_banner\tfacing\twest\n7149\tcyan_wall_banner\tfacing\teast\n7150\tpurple_wall_banner\tfacing\tnorth\n7151\tpurple_wall_banner\tfacing\tsouth\n7152\tpurple_wall_banner\tfacing\twest\n7153\tpurple_wall_banner\tfacing\teast\n7154\tblue_wall_banner\tfacing\tnorth\n7155\tblue_wall_banner\tfacing\tsouth\n7156\tblue_wall_banner\tfacing\twest\n7157\tblue_wall_banner\tfacing\teast\n7158\tbrown_wall_banner\tfacing\tnorth\n7159\tbrown_wall_banner\tfacing\tsouth\n7160\tbrown_wall_banner\tfacing\twest\n7161\tbrown_wall_banner\tfacing\teast\n7162\tgreen_wall_banner\tfacing\tnorth\n7163\tgreen_wall_banner\tfacing\tsouth\n7164\tgreen_wall_banner\tfacing\twest\n7165\tgreen_wall_banner\tfacing\teast\n7166\tred_wall_banner\tfacing\tnorth\n7167\tred_wall_banner\tfacing\tsouth\n7168\tred_wall_banner\tfacing\twest\n7169\tred_wall_banner\tfacing\teast\n7170\tblack_wall_banner\tfacing\tnorth\n7171\tblack_wall_banner\tfacing\tsouth\n7172\tblack_wall_banner\tfacing\twest\n7173\tblack_wall_banner\tfacing\teast\n7174\tred_sandstone\n7175\tchiseled_red_sandstone\n7176\tcut_red_sandstone\n7177\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7178\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7179\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7180\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7181\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7182\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7183\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7184\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7185\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7186\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7187\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7188\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7189\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7190\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7191\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7192\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7193\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7194\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7195\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7196\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7197\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7198\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7199\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7200\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7201\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7202\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7203\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7204\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7205\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7206\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7207\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7208\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7209\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7210\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7211\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7212\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7213\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7214\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7215\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7216\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7217\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7218\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7219\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7220\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7221\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7222\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7223\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7224\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7225\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7226\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7227\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7228\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7229\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7230\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7231\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7232\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7233\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7234\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7235\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7236\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7237\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7238\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7239\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7240\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7241\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7242\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7243\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7244\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7245\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7246\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7247\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7248\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7249\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7250\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7251\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7252\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7253\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7254\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7255\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7256\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7257\toak_slab\ttype\ttop\twaterlogged\ttrue\n7258\toak_slab\ttype\ttop\twaterlogged\tfalse\n7259\toak_slab\ttype\tbottom\twaterlogged\ttrue\n7260\toak_slab\ttype\tbottom\twaterlogged\tfalse\n7261\toak_slab\ttype\tdouble\twaterlogged\ttrue\n7262\toak_slab\ttype\tdouble\twaterlogged\tfalse\n7263\tspruce_slab\ttype\ttop\twaterlogged\ttrue\n7264\tspruce_slab\ttype\ttop\twaterlogged\tfalse\n7265\tspruce_slab\ttype\tbottom\twaterlogged\ttrue\n7266\tspruce_slab\ttype\tbottom\twaterlogged\tfalse\n7267\tspruce_slab\ttype\tdouble\twaterlogged\ttrue\n7268\tspruce_slab\ttype\tdouble\twaterlogged\tfalse\n7269\tbirch_slab\ttype\ttop\twaterlogged\ttrue\n7270\tbirch_slab\ttype\ttop\twaterlogged\tfalse\n7271\tbirch_slab\ttype\tbottom\twaterlogged\ttrue\n7272\tbirch_slab\ttype\tbottom\twaterlogged\tfalse\n7273\tbirch_slab\ttype\tdouble\twaterlogged\ttrue\n7274\tbirch_slab\ttype\tdouble\twaterlogged\tfalse\n7275\tjungle_slab\ttype\ttop\twaterlogged\ttrue\n7276\tjungle_slab\ttype\ttop\twaterlogged\tfalse\n7277\tjungle_slab\ttype\tbottom\twaterlogged\ttrue\n7278\tjungle_slab\ttype\tbottom\twaterlogged\tfalse\n7279\tjungle_slab\ttype\tdouble\twaterlogged\ttrue\n7280\tjungle_slab\ttype\tdouble\twaterlogged\tfalse\n7281\tacacia_slab\ttype\ttop\twaterlogged\ttrue\n7282\tacacia_slab\ttype\ttop\twaterlogged\tfalse\n7283\tacacia_slab\ttype\tbottom\twaterlogged\ttrue\n7284\tacacia_slab\ttype\tbottom\twaterlogged\tfalse\n7285\tacacia_slab\ttype\tdouble\twaterlogged\ttrue\n7286\tacacia_slab\ttype\tdouble\twaterlogged\tfalse\n7287\tdark_oak_slab\ttype\ttop\twaterlogged\ttrue\n7288\tdark_oak_slab\ttype\ttop\twaterlogged\tfalse\n7289\tdark_oak_slab\ttype\tbottom\twaterlogged\ttrue\n7290\tdark_oak_slab\ttype\tbottom\twaterlogged\tfalse\n7291\tdark_oak_slab\ttype\tdouble\twaterlogged\ttrue\n7292\tdark_oak_slab\ttype\tdouble\twaterlogged\tfalse\n7293\tstone_slab\ttype\ttop\twaterlogged\ttrue\n7294\tstone_slab\ttype\ttop\twaterlogged\tfalse\n7295\tstone_slab\ttype\tbottom\twaterlogged\ttrue\n7296\tstone_slab\ttype\tbottom\twaterlogged\tfalse\n7297\tstone_slab\ttype\tdouble\twaterlogged\ttrue\n7298\tstone_slab\ttype\tdouble\twaterlogged\tfalse\n7299\tsandstone_slab\ttype\ttop\twaterlogged\ttrue\n7300\tsandstone_slab\ttype\ttop\twaterlogged\tfalse\n7301\tsandstone_slab\ttype\tbottom\twaterlogged\ttrue\n7302\tsandstone_slab\ttype\tbottom\twaterlogged\tfalse\n7303\tsandstone_slab\ttype\tdouble\twaterlogged\ttrue\n7304\tsandstone_slab\ttype\tdouble\twaterlogged\tfalse\n7305\tpetrified_oak_slab\ttype\ttop\twaterlogged\ttrue\n7306\tpetrified_oak_slab\ttype\ttop\twaterlogged\tfalse\n7307\tpetrified_oak_slab\ttype\tbottom\twaterlogged\ttrue\n7308\tpetrified_oak_slab\ttype\tbottom\twaterlogged\tfalse\n7309\tpetrified_oak_slab\ttype\tdouble\twaterlogged\ttrue\n7310\tpetrified_oak_slab\ttype\tdouble\twaterlogged\tfalse\n7311\tcobblestone_slab\ttype\ttop\twaterlogged\ttrue\n7312\tcobblestone_slab\ttype\ttop\twaterlogged\tfalse\n7313\tcobblestone_slab\ttype\tbottom\twaterlogged\ttrue\n7314\tcobblestone_slab\ttype\tbottom\twaterlogged\tfalse\n7315\tcobblestone_slab\ttype\tdouble\twaterlogged\ttrue\n7316\tcobblestone_slab\ttype\tdouble\twaterlogged\tfalse\n7317\tbrick_slab\ttype\ttop\twaterlogged\ttrue\n7318\tbrick_slab\ttype\ttop\twaterlogged\tfalse\n7319\tbrick_slab\ttype\tbottom\twaterlogged\ttrue\n7320\tbrick_slab\ttype\tbottom\twaterlogged\tfalse\n7321\tbrick_slab\ttype\tdouble\twaterlogged\ttrue\n7322\tbrick_slab\ttype\tdouble\twaterlogged\tfalse\n7323\tstone_brick_slab\ttype\ttop\twaterlogged\ttrue\n7324\tstone_brick_slab\ttype\ttop\twaterlogged\tfalse\n7325\tstone_brick_slab\ttype\tbottom\twaterlogged\ttrue\n7326\tstone_brick_slab\ttype\tbottom\twaterlogged\tfalse\n7327\tstone_brick_slab\ttype\tdouble\twaterlogged\ttrue\n7328\tstone_brick_slab\ttype\tdouble\twaterlogged\tfalse\n7329\tnether_brick_slab\ttype\ttop\twaterlogged\ttrue\n7330\tnether_brick_slab\ttype\ttop\twaterlogged\tfalse\n7331\tnether_brick_slab\ttype\tbottom\twaterlogged\ttrue\n7332\tnether_brick_slab\ttype\tbottom\twaterlogged\tfalse\n7333\tnether_brick_slab\ttype\tdouble\twaterlogged\ttrue\n7334\tnether_brick_slab\ttype\tdouble\twaterlogged\tfalse\n7335\tquartz_slab\ttype\ttop\twaterlogged\ttrue\n7336\tquartz_slab\ttype\ttop\twaterlogged\tfalse\n7337\tquartz_slab\ttype\tbottom\twaterlogged\ttrue\n7338\tquartz_slab\ttype\tbottom\twaterlogged\tfalse\n7339\tquartz_slab\ttype\tdouble\twaterlogged\ttrue\n7340\tquartz_slab\ttype\tdouble\twaterlogged\tfalse\n7341\tred_sandstone_slab\ttype\ttop\twaterlogged\ttrue\n7342\tred_sandstone_slab\ttype\ttop\twaterlogged\tfalse\n7343\tred_sandstone_slab\ttype\tbottom\twaterlogged\ttrue\n7344\tred_sandstone_slab\ttype\tbottom\twaterlogged\tfalse\n7345\tred_sandstone_slab\ttype\tdouble\twaterlogged\ttrue\n7346\tred_sandstone_slab\ttype\tdouble\twaterlogged\tfalse\n7347\tpurpur_slab\ttype\ttop\twaterlogged\ttrue\n7348\tpurpur_slab\ttype\ttop\twaterlogged\tfalse\n7349\tpurpur_slab\ttype\tbottom\twaterlogged\ttrue\n7350\tpurpur_slab\ttype\tbottom\twaterlogged\tfalse\n7351\tpurpur_slab\ttype\tdouble\twaterlogged\ttrue\n7352\tpurpur_slab\ttype\tdouble\twaterlogged\tfalse\n7353\tsmooth_stone\n7354\tsmooth_sandstone\n7355\tsmooth_quartz\n7356\tsmooth_red_sandstone\n7357\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7358\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7359\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7360\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7361\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7362\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7363\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7364\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7365\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7366\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7367\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7368\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7369\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7370\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7371\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7372\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7373\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7374\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7375\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7376\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7377\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7378\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7379\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7380\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7381\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7382\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7383\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7384\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7385\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7386\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7387\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7388\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7389\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7390\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7391\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7392\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7393\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7394\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7395\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7396\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7397\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7398\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7399\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7400\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7401\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7402\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7403\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7404\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7405\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7406\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7407\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7408\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7409\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7410\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7411\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7412\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7413\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7414\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7415\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7416\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7417\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7418\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7419\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7420\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7421\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7422\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7423\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7424\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7425\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7426\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7427\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7428\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7429\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7430\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7431\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7432\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7433\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7434\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7435\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7436\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7437\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7438\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7439\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7440\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7441\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7442\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7443\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7444\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7445\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7446\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7447\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7448\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7449\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7450\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7451\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7452\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7453\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7454\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7455\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7456\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7457\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7458\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7459\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7460\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7461\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7462\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7463\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7464\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7465\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7466\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7467\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7468\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7469\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7470\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7471\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7472\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7473\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7474\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7475\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7476\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7477\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7478\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7479\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7480\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7481\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7482\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7483\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7484\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7485\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7486\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7487\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7488\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7489\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7490\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7491\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7492\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7493\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7494\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7495\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7496\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7497\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7498\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7499\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7500\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7501\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7502\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7503\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7504\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7505\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7506\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7507\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7508\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7509\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7510\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7511\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7512\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7513\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7514\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7515\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7516\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7517\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7518\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7519\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7520\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7521\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7522\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7523\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7524\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7525\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7526\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7527\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7528\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7529\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7530\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7531\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7532\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7533\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7534\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7535\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7536\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7537\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7538\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7539\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7540\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7541\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7542\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7543\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7544\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7545\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7546\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7547\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7548\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7549\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7550\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7551\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7552\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7553\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7554\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7555\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7556\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7557\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7558\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7559\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7560\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7561\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7562\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7563\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7564\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7565\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7566\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7567\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7568\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7569\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7570\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7571\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7572\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7573\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7574\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7575\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7576\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7577\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7578\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7579\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7580\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7581\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7582\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7583\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7584\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7585\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7586\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7587\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7588\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7589\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7590\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7591\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7592\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7593\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7594\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7595\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7596\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7597\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7598\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7599\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7600\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7601\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7602\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7603\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7604\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7605\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7606\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7607\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7608\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7609\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7610\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7611\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7612\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7613\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7614\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7615\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7616\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7617\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7618\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7619\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7620\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7621\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7622\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7623\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7624\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7625\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7626\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7627\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7628\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7629\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7630\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7631\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7632\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7633\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7634\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7635\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7636\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7637\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7638\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7639\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7640\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7641\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7642\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7643\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7644\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7645\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7646\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7647\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n7648\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n7649\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7650\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7651\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n7652\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n7653\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7654\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7655\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n7656\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n7657\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7658\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7659\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n7660\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n7661\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7662\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7663\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n7664\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n7665\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7666\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7667\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n7668\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n7669\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7670\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7671\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n7672\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n7673\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7674\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7675\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n7676\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n7677\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7678\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7679\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7680\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7681\tspruce_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7682\tspruce_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7683\tspruce_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7684\tspruce_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7685\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7686\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7687\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7688\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7689\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7690\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7691\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7692\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7693\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7694\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7695\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7696\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7697\tspruce_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7698\tspruce_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7699\tspruce_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7700\tspruce_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7701\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7702\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7703\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7704\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7705\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7706\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7707\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7708\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7709\tspruce_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7710\tspruce_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7711\tspruce_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7712\tspruce_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7713\tspruce_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7714\tspruce_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7715\tspruce_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7716\tspruce_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7717\tspruce_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7718\tspruce_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7719\tspruce_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7720\tspruce_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7721\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7722\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7723\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7724\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7725\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7726\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7727\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7728\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7729\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7730\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7731\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7732\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7733\tspruce_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7734\tspruce_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7735\tspruce_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7736\tspruce_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7737\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7738\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7739\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7740\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7741\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7742\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7743\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7744\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7745\tbirch_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7746\tbirch_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7747\tbirch_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7748\tbirch_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7749\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7750\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7751\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7752\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7753\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7754\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7755\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7756\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7757\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7758\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7759\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7760\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7761\tbirch_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7762\tbirch_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7763\tbirch_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7764\tbirch_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7765\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7766\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7767\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7768\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7769\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7770\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7771\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7772\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7773\tbirch_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7774\tbirch_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7775\tbirch_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7776\tbirch_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7777\tbirch_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7778\tbirch_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7779\tbirch_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7780\tbirch_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7781\tbirch_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7782\tbirch_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7783\tbirch_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7784\tbirch_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7785\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7786\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7787\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7788\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7789\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7790\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7791\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7792\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7793\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7794\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7795\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7796\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7797\tbirch_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7798\tbirch_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7799\tbirch_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7800\tbirch_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7801\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7802\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7803\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7804\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7805\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7806\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7807\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7808\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7809\tjungle_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7810\tjungle_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7811\tjungle_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7812\tjungle_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7813\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7814\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7815\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7816\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7817\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7818\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7819\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7820\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7821\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7822\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7823\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7824\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7825\tjungle_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7826\tjungle_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7827\tjungle_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7828\tjungle_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7829\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7830\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7831\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7832\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7833\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7834\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7835\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7836\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7837\tjungle_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7838\tjungle_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7839\tjungle_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7840\tjungle_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7841\tjungle_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7842\tjungle_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7843\tjungle_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7844\tjungle_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7845\tjungle_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7846\tjungle_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7847\tjungle_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7848\tjungle_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7849\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7850\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7851\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7852\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7853\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7854\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7855\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7856\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7857\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7858\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7859\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7860\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7861\tjungle_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7862\tjungle_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7863\tjungle_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7864\tjungle_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7865\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7866\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7867\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7868\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7869\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7870\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7871\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7872\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7873\tacacia_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7874\tacacia_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7875\tacacia_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7876\tacacia_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7877\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7878\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7879\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7880\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7881\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7882\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7883\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7884\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7885\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7886\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7887\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7888\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7889\tacacia_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7890\tacacia_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7891\tacacia_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7892\tacacia_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7893\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7894\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7895\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7896\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7897\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7898\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7899\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7900\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7901\tacacia_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7902\tacacia_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7903\tacacia_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7904\tacacia_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7905\tacacia_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7906\tacacia_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7907\tacacia_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7908\tacacia_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7909\tacacia_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7910\tacacia_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7911\tacacia_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7912\tacacia_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7913\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7914\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7915\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7916\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7917\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7918\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7919\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7920\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7921\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7922\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7923\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7924\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7925\tacacia_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7926\tacacia_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7927\tacacia_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7928\tacacia_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7929\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7930\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7931\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7932\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7933\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7934\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7935\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7936\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7937\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7938\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7939\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7940\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7941\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7942\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7943\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7944\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7945\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n7946\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n7947\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n7948\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n7949\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7950\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7951\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7952\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7953\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7954\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7955\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7956\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7957\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7958\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7959\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7960\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7961\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n7962\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n7963\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n7964\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n7965\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7966\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7967\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7968\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7969\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n7970\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n7971\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n7972\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n7973\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7974\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7975\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7976\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7977\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n7978\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n7979\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n7980\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n7981\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7982\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7983\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7984\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7985\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n7986\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n7987\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n7988\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n7989\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7990\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7991\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7992\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7993\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n7994\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n7995\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n7996\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n7997\tend_rod\tfacing\tnorth\n7998\tend_rod\tfacing\teast\n7999\tend_rod\tfacing\tsouth\n8000\tend_rod\tfacing\twest\n8001\tend_rod\tfacing\tup\n8002\tend_rod\tfacing\tdown\n8003\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8004\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8005\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8006\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8007\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8008\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8009\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8010\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8011\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8012\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8013\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8014\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8015\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8016\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8017\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8018\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8019\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8020\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8021\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8022\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8023\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8024\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8025\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8026\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8027\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8028\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8029\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8030\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8031\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8032\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8033\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8034\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8035\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8036\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8037\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8038\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8039\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8040\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8041\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8042\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8043\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8044\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8045\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8046\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8047\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8048\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8049\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8050\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8051\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8052\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8053\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8054\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8055\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8056\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8057\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8058\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8059\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8060\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8061\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8062\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8063\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8064\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8065\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8066\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8067\tchorus_flower\tage\t0\n8068\tchorus_flower\tage\t1\n8069\tchorus_flower\tage\t2\n8070\tchorus_flower\tage\t3\n8071\tchorus_flower\tage\t4\n8072\tchorus_flower\tage\t5\n8073\tpurpur_block\n8074\tpurpur_pillar\taxis\tx\n8075\tpurpur_pillar\taxis\ty\n8076\tpurpur_pillar\taxis\tz\n8077\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n8078\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n8079\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n8080\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n8081\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n8082\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n8083\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n8084\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n8085\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n8086\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n8087\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n8088\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n8089\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n8090\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n8091\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n8092\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n8093\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n8094\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n8095\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n8096\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n8097\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n8098\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n8099\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n8100\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n8101\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n8102\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n8103\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n8104\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n8105\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n8106\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n8107\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n8108\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n8109\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n8110\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n8111\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n8112\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n8113\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n8114\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n8115\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n8116\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n8117\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n8118\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n8119\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n8120\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n8121\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n8122\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n8123\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n8124\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n8125\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n8126\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n8127\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n8128\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n8129\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n8130\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n8131\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n8132\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n8133\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n8134\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n8135\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n8136\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n8137\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n8138\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n8139\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n8140\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n8141\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n8142\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n8143\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n8144\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n8145\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n8146\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n8147\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n8148\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n8149\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n8150\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n8151\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n8152\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n8153\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n8154\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n8155\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n8156\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n8157\tend_stone_bricks\n8158\tbeetroots\tage\t0\n8159\tbeetroots\tage\t1\n8160\tbeetroots\tage\t2\n8161\tbeetroots\tage\t3\n8162\tgrass_path\n8163\tend_gateway\n8164\trepeating_command_block\tconditional\ttrue\tfacing\tnorth\n8165\trepeating_command_block\tconditional\ttrue\tfacing\teast\n8166\trepeating_command_block\tconditional\ttrue\tfacing\tsouth\n8167\trepeating_command_block\tconditional\ttrue\tfacing\twest\n8168\trepeating_command_block\tconditional\ttrue\tfacing\tup\n8169\trepeating_command_block\tconditional\ttrue\tfacing\tdown\n8170\trepeating_command_block\tconditional\tfalse\tfacing\tnorth\n8171\trepeating_command_block\tconditional\tfalse\tfacing\teast\n8172\trepeating_command_block\tconditional\tfalse\tfacing\tsouth\n8173\trepeating_command_block\tconditional\tfalse\tfacing\twest\n8174\trepeating_command_block\tconditional\tfalse\tfacing\tup\n8175\trepeating_command_block\tconditional\tfalse\tfacing\tdown\n8176\tchain_command_block\tconditional\ttrue\tfacing\tnorth\n8177\tchain_command_block\tconditional\ttrue\tfacing\teast\n8178\tchain_command_block\tconditional\ttrue\tfacing\tsouth\n8179\tchain_command_block\tconditional\ttrue\tfacing\twest\n8180\tchain_command_block\tconditional\ttrue\tfacing\tup\n8181\tchain_command_block\tconditional\ttrue\tfacing\tdown\n8182\tchain_command_block\tconditional\tfalse\tfacing\tnorth\n8183\tchain_command_block\tconditional\tfalse\tfacing\teast\n8184\tchain_command_block\tconditional\tfalse\tfacing\tsouth\n8185\tchain_command_block\tconditional\tfalse\tfacing\twest\n8186\tchain_command_block\tconditional\tfalse\tfacing\tup\n8187\tchain_command_block\tconditional\tfalse\tfacing\tdown\n8188\tfrosted_ice\tage\t0\n8189\tfrosted_ice\tage\t1\n8190\tfrosted_ice\tage\t2\n8191\tfrosted_ice\tage\t3\n8192\tmagma_block\n8193\tnether_wart_block\n8194\tred_nether_bricks\n8195\tbone_block\taxis\tx\n8196\tbone_block\taxis\ty\n8197\tbone_block\taxis\tz\n8198\tstructure_void\n8199\tobserver\tfacing\tnorth\tpowered\ttrue\n8200\tobserver\tfacing\tnorth\tpowered\tfalse\n8201\tobserver\tfacing\teast\tpowered\ttrue\n8202\tobserver\tfacing\teast\tpowered\tfalse\n8203\tobserver\tfacing\tsouth\tpowered\ttrue\n8204\tobserver\tfacing\tsouth\tpowered\tfalse\n8205\tobserver\tfacing\twest\tpowered\ttrue\n8206\tobserver\tfacing\twest\tpowered\tfalse\n8207\tobserver\tfacing\tup\tpowered\ttrue\n8208\tobserver\tfacing\tup\tpowered\tfalse\n8209\tobserver\tfacing\tdown\tpowered\ttrue\n8210\tobserver\tfacing\tdown\tpowered\tfalse\n8211\tshulker_box\tfacing\tnorth\n8212\tshulker_box\tfacing\teast\n8213\tshulker_box\tfacing\tsouth\n8214\tshulker_box\tfacing\twest\n8215\tshulker_box\tfacing\tup\n8216\tshulker_box\tfacing\tdown\n8217\twhite_shulker_box\tfacing\tnorth\n8218\twhite_shulker_box\tfacing\teast\n8219\twhite_shulker_box\tfacing\tsouth\n8220\twhite_shulker_box\tfacing\twest\n8221\twhite_shulker_box\tfacing\tup\n8222\twhite_shulker_box\tfacing\tdown\n8223\torange_shulker_box\tfacing\tnorth\n8224\torange_shulker_box\tfacing\teast\n8225\torange_shulker_box\tfacing\tsouth\n8226\torange_shulker_box\tfacing\twest\n8227\torange_shulker_box\tfacing\tup\n8228\torange_shulker_box\tfacing\tdown\n8229\tmagenta_shulker_box\tfacing\tnorth\n8230\tmagenta_shulker_box\tfacing\teast\n8231\tmagenta_shulker_box\tfacing\tsouth\n8232\tmagenta_shulker_box\tfacing\twest\n8233\tmagenta_shulker_box\tfacing\tup\n8234\tmagenta_shulker_box\tfacing\tdown\n8235\tlight_blue_shulker_box\tfacing\tnorth\n8236\tlight_blue_shulker_box\tfacing\teast\n8237\tlight_blue_shulker_box\tfacing\tsouth\n8238\tlight_blue_shulker_box\tfacing\twest\n8239\tlight_blue_shulker_box\tfacing\tup\n8240\tlight_blue_shulker_box\tfacing\tdown\n8241\tyellow_shulker_box\tfacing\tnorth\n8242\tyellow_shulker_box\tfacing\teast\n8243\tyellow_shulker_box\tfacing\tsouth\n8244\tyellow_shulker_box\tfacing\twest\n8245\tyellow_shulker_box\tfacing\tup\n8246\tyellow_shulker_box\tfacing\tdown\n8247\tlime_shulker_box\tfacing\tnorth\n8248\tlime_shulker_box\tfacing\teast\n8249\tlime_shulker_box\tfacing\tsouth\n8250\tlime_shulker_box\tfacing\twest\n8251\tlime_shulker_box\tfacing\tup\n8252\tlime_shulker_box\tfacing\tdown\n8253\tpink_shulker_box\tfacing\tnorth\n8254\tpink_shulker_box\tfacing\teast\n8255\tpink_shulker_box\tfacing\tsouth\n8256\tpink_shulker_box\tfacing\twest\n8257\tpink_shulker_box\tfacing\tup\n8258\tpink_shulker_box\tfacing\tdown\n8259\tgray_shulker_box\tfacing\tnorth\n8260\tgray_shulker_box\tfacing\teast\n8261\tgray_shulker_box\tfacing\tsouth\n8262\tgray_shulker_box\tfacing\twest\n8263\tgray_shulker_box\tfacing\tup\n8264\tgray_shulker_box\tfacing\tdown\n8265\tlight_gray_shulker_box\tfacing\tnorth\n8266\tlight_gray_shulker_box\tfacing\teast\n8267\tlight_gray_shulker_box\tfacing\tsouth\n8268\tlight_gray_shulker_box\tfacing\twest\n8269\tlight_gray_shulker_box\tfacing\tup\n8270\tlight_gray_shulker_box\tfacing\tdown\n8271\tcyan_shulker_box\tfacing\tnorth\n8272\tcyan_shulker_box\tfacing\teast\n8273\tcyan_shulker_box\tfacing\tsouth\n8274\tcyan_shulker_box\tfacing\twest\n8275\tcyan_shulker_box\tfacing\tup\n8276\tcyan_shulker_box\tfacing\tdown\n8277\tpurple_shulker_box\tfacing\tnorth\n8278\tpurple_shulker_box\tfacing\teast\n8279\tpurple_shulker_box\tfacing\tsouth\n8280\tpurple_shulker_box\tfacing\twest\n8281\tpurple_shulker_box\tfacing\tup\n8282\tpurple_shulker_box\tfacing\tdown\n8283\tblue_shulker_box\tfacing\tnorth\n8284\tblue_shulker_box\tfacing\teast\n8285\tblue_shulker_box\tfacing\tsouth\n8286\tblue_shulker_box\tfacing\twest\n8287\tblue_shulker_box\tfacing\tup\n8288\tblue_shulker_box\tfacing\tdown\n8289\tbrown_shulker_box\tfacing\tnorth\n8290\tbrown_shulker_box\tfacing\teast\n8291\tbrown_shulker_box\tfacing\tsouth\n8292\tbrown_shulker_box\tfacing\twest\n8293\tbrown_shulker_box\tfacing\tup\n8294\tbrown_shulker_box\tfacing\tdown\n8295\tgreen_shulker_box\tfacing\tnorth\n8296\tgreen_shulker_box\tfacing\teast\n8297\tgreen_shulker_box\tfacing\tsouth\n8298\tgreen_shulker_box\tfacing\twest\n8299\tgreen_shulker_box\tfacing\tup\n8300\tgreen_shulker_box\tfacing\tdown\n8301\tred_shulker_box\tfacing\tnorth\n8302\tred_shulker_box\tfacing\teast\n8303\tred_shulker_box\tfacing\tsouth\n8304\tred_shulker_box\tfacing\twest\n8305\tred_shulker_box\tfacing\tup\n8306\tred_shulker_box\tfacing\tdown\n8307\tblack_shulker_box\tfacing\tnorth\n8308\tblack_shulker_box\tfacing\teast\n8309\tblack_shulker_box\tfacing\tsouth\n8310\tblack_shulker_box\tfacing\twest\n8311\tblack_shulker_box\tfacing\tup\n8312\tblack_shulker_box\tfacing\tdown\n8313\twhite_glazed_terracotta\tfacing\tnorth\n8314\twhite_glazed_terracotta\tfacing\tsouth\n8315\twhite_glazed_terracotta\tfacing\twest\n8316\twhite_glazed_terracotta\tfacing\teast\n8317\torange_glazed_terracotta\tfacing\tnorth\n8318\torange_glazed_terracotta\tfacing\tsouth\n8319\torange_glazed_terracotta\tfacing\twest\n8320\torange_glazed_terracotta\tfacing\teast\n8321\tmagenta_glazed_terracotta\tfacing\tnorth\n8322\tmagenta_glazed_terracotta\tfacing\tsouth\n8323\tmagenta_glazed_terracotta\tfacing\twest\n8324\tmagenta_glazed_terracotta\tfacing\teast\n8325\tlight_blue_glazed_terracotta\tfacing\tnorth\n8326\tlight_blue_glazed_terracotta\tfacing\tsouth\n8327\tlight_blue_glazed_terracotta\tfacing\twest\n8328\tlight_blue_glazed_terracotta\tfacing\teast\n8329\tyellow_glazed_terracotta\tfacing\tnorth\n8330\tyellow_glazed_terracotta\tfacing\tsouth\n8331\tyellow_glazed_terracotta\tfacing\twest\n8332\tyellow_glazed_terracotta\tfacing\teast\n8333\tlime_glazed_terracotta\tfacing\tnorth\n8334\tlime_glazed_terracotta\tfacing\tsouth\n8335\tlime_glazed_terracotta\tfacing\twest\n8336\tlime_glazed_terracotta\tfacing\teast\n8337\tpink_glazed_terracotta\tfacing\tnorth\n8338\tpink_glazed_terracotta\tfacing\tsouth\n8339\tpink_glazed_terracotta\tfacing\twest\n8340\tpink_glazed_terracotta\tfacing\teast\n8341\tgray_glazed_terracotta\tfacing\tnorth\n8342\tgray_glazed_terracotta\tfacing\tsouth\n8343\tgray_glazed_terracotta\tfacing\twest\n8344\tgray_glazed_terracotta\tfacing\teast\n8345\tlight_gray_glazed_terracotta\tfacing\tnorth\n8346\tlight_gray_glazed_terracotta\tfacing\tsouth\n8347\tlight_gray_glazed_terracotta\tfacing\twest\n8348\tlight_gray_glazed_terracotta\tfacing\teast\n8349\tcyan_glazed_terracotta\tfacing\tnorth\n8350\tcyan_glazed_terracotta\tfacing\tsouth\n8351\tcyan_glazed_terracotta\tfacing\twest\n8352\tcyan_glazed_terracotta\tfacing\teast\n8353\tpurple_glazed_terracotta\tfacing\tnorth\n8354\tpurple_glazed_terracotta\tfacing\tsouth\n8355\tpurple_glazed_terracotta\tfacing\twest\n8356\tpurple_glazed_terracotta\tfacing\teast\n8357\tblue_glazed_terracotta\tfacing\tnorth\n8358\tblue_glazed_terracotta\tfacing\tsouth\n8359\tblue_glazed_terracotta\tfacing\twest\n8360\tblue_glazed_terracotta\tfacing\teast\n8361\tbrown_glazed_terracotta\tfacing\tnorth\n8362\tbrown_glazed_terracotta\tfacing\tsouth\n8363\tbrown_glazed_terracotta\tfacing\twest\n8364\tbrown_glazed_terracotta\tfacing\teast\n8365\tgreen_glazed_terracotta\tfacing\tnorth\n8366\tgreen_glazed_terracotta\tfacing\tsouth\n8367\tgreen_glazed_terracotta\tfacing\twest\n8368\tgreen_glazed_terracotta\tfacing\teast\n8369\tred_glazed_terracotta\tfacing\tnorth\n8370\tred_glazed_terracotta\tfacing\tsouth\n8371\tred_glazed_terracotta\tfacing\twest\n8372\tred_glazed_terracotta\tfacing\teast\n8373\tblack_glazed_terracotta\tfacing\tnorth\n8374\tblack_glazed_terracotta\tfacing\tsouth\n8375\tblack_glazed_terracotta\tfacing\twest\n8376\tblack_glazed_terracotta\tfacing\teast\n8377\twhite_concrete\n8378\torange_concrete\n8379\tmagenta_concrete\n8380\tlight_blue_concrete\n8381\tyellow_concrete\n8382\tlime_concrete\n8383\tpink_concrete\n8384\tgray_concrete\n8385\tlight_gray_concrete\n8386\tcyan_concrete\n8387\tpurple_concrete\n8388\tblue_concrete\n8389\tbrown_concrete\n8390\tgreen_concrete\n8391\tred_concrete\n8392\tblack_concrete\n8393\twhite_concrete_powder\n8394\torange_concrete_powder\n8395\tmagenta_concrete_powder\n8396\tlight_blue_concrete_powder\n8397\tyellow_concrete_powder\n8398\tlime_concrete_powder\n8399\tpink_concrete_powder\n8400\tgray_concrete_powder\n8401\tlight_gray_concrete_powder\n8402\tcyan_concrete_powder\n8403\tpurple_concrete_powder\n8404\tblue_concrete_powder\n8405\tbrown_concrete_powder\n8406\tgreen_concrete_powder\n8407\tred_concrete_powder\n8408\tblack_concrete_powder\n8409\tkelp\tage\t0\n8410\tkelp\tage\t1\n8411\tkelp\tage\t2\n8412\tkelp\tage\t3\n8413\tkelp\tage\t4\n8414\tkelp\tage\t5\n8415\tkelp\tage\t6\n8416\tkelp\tage\t7\n8417\tkelp\tage\t8\n8418\tkelp\tage\t9\n8419\tkelp\tage\t10\n8420\tkelp\tage\t11\n8421\tkelp\tage\t12\n8422\tkelp\tage\t13\n8423\tkelp\tage\t14\n8424\tkelp\tage\t15\n8425\tkelp\tage\t16\n8426\tkelp\tage\t17\n8427\tkelp\tage\t18\n8428\tkelp\tage\t19\n8429\tkelp\tage\t20\n8430\tkelp\tage\t21\n8431\tkelp\tage\t22\n8432\tkelp\tage\t23\n8433\tkelp\tage\t24\n8434\tkelp\tage\t25\n8435\tkelp_plant\n8436\tdried_kelp_block\n8437\tturtle_egg\teggs\t1\thatch\t0\n8438\tturtle_egg\teggs\t1\thatch\t1\n8439\tturtle_egg\teggs\t1\thatch\t2\n8440\tturtle_egg\teggs\t2\thatch\t0\n8441\tturtle_egg\teggs\t2\thatch\t1\n8442\tturtle_egg\teggs\t2\thatch\t2\n8443\tturtle_egg\teggs\t3\thatch\t0\n8444\tturtle_egg\teggs\t3\thatch\t1\n8445\tturtle_egg\teggs\t3\thatch\t2\n8446\tturtle_egg\teggs\t4\thatch\t0\n8447\tturtle_egg\teggs\t4\thatch\t1\n8448\tturtle_egg\teggs\t4\thatch\t2\n8449\tdead_tube_coral_block\n8450\tdead_brain_coral_block\n8451\tdead_bubble_coral_block\n8452\tdead_fire_coral_block\n8453\tdead_horn_coral_block\n8454\ttube_coral_block\n8455\tbrain_coral_block\n8456\tbubble_coral_block\n8457\tfire_coral_block\n8458\thorn_coral_block\n8459\ttube_coral\n8460\tbrain_coral\n8461\tbubble_coral\n8462\tfire_coral\n8463\thorn_coral\n8464\tdead_tube_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8465\tdead_tube_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8466\tdead_tube_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8467\tdead_tube_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8468\tdead_tube_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8469\tdead_tube_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8470\tdead_tube_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8471\tdead_tube_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8472\tdead_brain_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8473\tdead_brain_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8474\tdead_brain_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8475\tdead_brain_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8476\tdead_brain_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8477\tdead_brain_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8478\tdead_brain_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8479\tdead_brain_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8480\tdead_bubble_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8481\tdead_bubble_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8482\tdead_bubble_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8483\tdead_bubble_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8484\tdead_bubble_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8485\tdead_bubble_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8486\tdead_bubble_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8487\tdead_bubble_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8488\tdead_fire_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8489\tdead_fire_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8490\tdead_fire_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8491\tdead_fire_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8492\tdead_fire_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8493\tdead_fire_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8494\tdead_fire_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8495\tdead_fire_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8496\tdead_horn_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8497\tdead_horn_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8498\tdead_horn_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8499\tdead_horn_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8500\tdead_horn_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8501\tdead_horn_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8502\tdead_horn_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8503\tdead_horn_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8504\ttube_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8505\ttube_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8506\ttube_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8507\ttube_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8508\ttube_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8509\ttube_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8510\ttube_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8511\ttube_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8512\tbrain_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8513\tbrain_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8514\tbrain_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8515\tbrain_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8516\tbrain_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8517\tbrain_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8518\tbrain_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8519\tbrain_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8520\tbubble_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8521\tbubble_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8522\tbubble_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8523\tbubble_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8524\tbubble_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8525\tbubble_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8526\tbubble_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8527\tbubble_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8528\tfire_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8529\tfire_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8530\tfire_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8531\tfire_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8532\tfire_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8533\tfire_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8534\tfire_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8535\tfire_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8536\thorn_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n8537\thorn_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n8538\thorn_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n8539\thorn_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n8540\thorn_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n8541\thorn_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n8542\thorn_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n8543\thorn_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n8544\tdead_tube_coral_fan\twaterlogged\ttrue\n8545\tdead_tube_coral_fan\twaterlogged\tfalse\n8546\tdead_brain_coral_fan\twaterlogged\ttrue\n8547\tdead_brain_coral_fan\twaterlogged\tfalse\n8548\tdead_bubble_coral_fan\twaterlogged\ttrue\n8549\tdead_bubble_coral_fan\twaterlogged\tfalse\n8550\tdead_fire_coral_fan\twaterlogged\ttrue\n8551\tdead_fire_coral_fan\twaterlogged\tfalse\n8552\tdead_horn_coral_fan\twaterlogged\ttrue\n8553\tdead_horn_coral_fan\twaterlogged\tfalse\n8554\ttube_coral_fan\twaterlogged\ttrue\n8555\ttube_coral_fan\twaterlogged\tfalse\n8556\tbrain_coral_fan\twaterlogged\ttrue\n8557\tbrain_coral_fan\twaterlogged\tfalse\n8558\tbubble_coral_fan\twaterlogged\ttrue\n8559\tbubble_coral_fan\twaterlogged\tfalse\n8560\tfire_coral_fan\twaterlogged\ttrue\n8561\tfire_coral_fan\twaterlogged\tfalse\n8562\thorn_coral_fan\twaterlogged\ttrue\n8563\thorn_coral_fan\twaterlogged\tfalse\n8564\tsea_pickle\twaterlogged\ttrue\tpickles\t1\n8565\tsea_pickle\twaterlogged\tfalse\tpickles\t1\n8566\tsea_pickle\twaterlogged\ttrue\tpickles\t2\n8567\tsea_pickle\twaterlogged\tfalse\tpickles\t2\n8568\tsea_pickle\twaterlogged\ttrue\tpickles\t3\n8569\tsea_pickle\twaterlogged\tfalse\tpickles\t3\n8570\tsea_pickle\twaterlogged\ttrue\tpickles\t4\n8571\tsea_pickle\twaterlogged\tfalse\tpickles\t4\n8572\tblue_ice\n8573\tconduit\n8574\tvoid_air\n8575\tcave_air\n8576\tbubble_column\tdrag\ttrue\n8577\tbubble_column\tdrag\tfalse\n8578\tstructure_block\tmode\tsave\n8579\tstructure_block\tmode\tload\n8580\tstructure_block\tmode\tcorner\n8581\tstructure_block\tmode\tdata\n"
  },
  {
    "path": "Server/Protocol/1.14.4/base.btp.txt",
    "content": "BlockTypePalette\nFileVersion\t1\nCommonPrefix\tminecraft:\n\n0\tair\n1\tstone\n2\tgranite\n3\tpolished_granite\n4\tdiorite\n5\tpolished_diorite\n6\tandesite\n7\tpolished_andesite\n8\tgrass_block\tsnowy\ttrue\n9\tgrass_block\tsnowy\tfalse\n10\tdirt\n11\tcoarse_dirt\n12\tpodzol\tsnowy\ttrue\n13\tpodzol\tsnowy\tfalse\n14\tcobblestone\n15\toak_planks\n16\tspruce_planks\n17\tbirch_planks\n18\tjungle_planks\n19\tacacia_planks\n20\tdark_oak_planks\n21\toak_sapling\tstage\t0\n22\toak_sapling\tstage\t1\n23\tspruce_sapling\tstage\t0\n24\tspruce_sapling\tstage\t1\n25\tbirch_sapling\tstage\t0\n26\tbirch_sapling\tstage\t1\n27\tjungle_sapling\tstage\t0\n28\tjungle_sapling\tstage\t1\n29\tacacia_sapling\tstage\t0\n30\tacacia_sapling\tstage\t1\n31\tdark_oak_sapling\tstage\t0\n32\tdark_oak_sapling\tstage\t1\n33\tbedrock\n34\twater\tlevel\t0\n35\twater\tlevel\t1\n36\twater\tlevel\t2\n37\twater\tlevel\t3\n38\twater\tlevel\t4\n39\twater\tlevel\t5\n40\twater\tlevel\t6\n41\twater\tlevel\t7\n42\twater\tlevel\t8\n43\twater\tlevel\t9\n44\twater\tlevel\t10\n45\twater\tlevel\t11\n46\twater\tlevel\t12\n47\twater\tlevel\t13\n48\twater\tlevel\t14\n49\twater\tlevel\t15\n50\tlava\tlevel\t0\n51\tlava\tlevel\t1\n52\tlava\tlevel\t2\n53\tlava\tlevel\t3\n54\tlava\tlevel\t4\n55\tlava\tlevel\t5\n56\tlava\tlevel\t6\n57\tlava\tlevel\t7\n58\tlava\tlevel\t8\n59\tlava\tlevel\t9\n60\tlava\tlevel\t10\n61\tlava\tlevel\t11\n62\tlava\tlevel\t12\n63\tlava\tlevel\t13\n64\tlava\tlevel\t14\n65\tlava\tlevel\t15\n66\tsand\n67\tred_sand\n68\tgravel\n69\tgold_ore\n70\tiron_ore\n71\tcoal_ore\n72\toak_log\taxis\tx\n73\toak_log\taxis\ty\n74\toak_log\taxis\tz\n75\tspruce_log\taxis\tx\n76\tspruce_log\taxis\ty\n77\tspruce_log\taxis\tz\n78\tbirch_log\taxis\tx\n79\tbirch_log\taxis\ty\n80\tbirch_log\taxis\tz\n81\tjungle_log\taxis\tx\n82\tjungle_log\taxis\ty\n83\tjungle_log\taxis\tz\n84\tacacia_log\taxis\tx\n85\tacacia_log\taxis\ty\n86\tacacia_log\taxis\tz\n87\tdark_oak_log\taxis\tx\n88\tdark_oak_log\taxis\ty\n89\tdark_oak_log\taxis\tz\n90\tstripped_spruce_log\taxis\tx\n91\tstripped_spruce_log\taxis\ty\n92\tstripped_spruce_log\taxis\tz\n93\tstripped_birch_log\taxis\tx\n94\tstripped_birch_log\taxis\ty\n95\tstripped_birch_log\taxis\tz\n96\tstripped_jungle_log\taxis\tx\n97\tstripped_jungle_log\taxis\ty\n98\tstripped_jungle_log\taxis\tz\n99\tstripped_acacia_log\taxis\tx\n100\tstripped_acacia_log\taxis\ty\n101\tstripped_acacia_log\taxis\tz\n102\tstripped_dark_oak_log\taxis\tx\n103\tstripped_dark_oak_log\taxis\ty\n104\tstripped_dark_oak_log\taxis\tz\n105\tstripped_oak_log\taxis\tx\n106\tstripped_oak_log\taxis\ty\n107\tstripped_oak_log\taxis\tz\n108\toak_wood\taxis\tx\n109\toak_wood\taxis\ty\n110\toak_wood\taxis\tz\n111\tspruce_wood\taxis\tx\n112\tspruce_wood\taxis\ty\n113\tspruce_wood\taxis\tz\n114\tbirch_wood\taxis\tx\n115\tbirch_wood\taxis\ty\n116\tbirch_wood\taxis\tz\n117\tjungle_wood\taxis\tx\n118\tjungle_wood\taxis\ty\n119\tjungle_wood\taxis\tz\n120\tacacia_wood\taxis\tx\n121\tacacia_wood\taxis\ty\n122\tacacia_wood\taxis\tz\n123\tdark_oak_wood\taxis\tx\n124\tdark_oak_wood\taxis\ty\n125\tdark_oak_wood\taxis\tz\n126\tstripped_oak_wood\taxis\tx\n127\tstripped_oak_wood\taxis\ty\n128\tstripped_oak_wood\taxis\tz\n129\tstripped_spruce_wood\taxis\tx\n130\tstripped_spruce_wood\taxis\ty\n131\tstripped_spruce_wood\taxis\tz\n132\tstripped_birch_wood\taxis\tx\n133\tstripped_birch_wood\taxis\ty\n134\tstripped_birch_wood\taxis\tz\n135\tstripped_jungle_wood\taxis\tx\n136\tstripped_jungle_wood\taxis\ty\n137\tstripped_jungle_wood\taxis\tz\n138\tstripped_acacia_wood\taxis\tx\n139\tstripped_acacia_wood\taxis\ty\n140\tstripped_acacia_wood\taxis\tz\n141\tstripped_dark_oak_wood\taxis\tx\n142\tstripped_dark_oak_wood\taxis\ty\n143\tstripped_dark_oak_wood\taxis\tz\n144\toak_leaves\tpersistent\ttrue\tdistance\t1\n145\toak_leaves\tpersistent\tfalse\tdistance\t1\n146\toak_leaves\tpersistent\ttrue\tdistance\t2\n147\toak_leaves\tpersistent\tfalse\tdistance\t2\n148\toak_leaves\tpersistent\ttrue\tdistance\t3\n149\toak_leaves\tpersistent\tfalse\tdistance\t3\n150\toak_leaves\tpersistent\ttrue\tdistance\t4\n151\toak_leaves\tpersistent\tfalse\tdistance\t4\n152\toak_leaves\tpersistent\ttrue\tdistance\t5\n153\toak_leaves\tpersistent\tfalse\tdistance\t5\n154\toak_leaves\tpersistent\ttrue\tdistance\t6\n155\toak_leaves\tpersistent\tfalse\tdistance\t6\n156\toak_leaves\tpersistent\ttrue\tdistance\t7\n157\toak_leaves\tpersistent\tfalse\tdistance\t7\n158\tspruce_leaves\tpersistent\ttrue\tdistance\t1\n159\tspruce_leaves\tpersistent\tfalse\tdistance\t1\n160\tspruce_leaves\tpersistent\ttrue\tdistance\t2\n161\tspruce_leaves\tpersistent\tfalse\tdistance\t2\n162\tspruce_leaves\tpersistent\ttrue\tdistance\t3\n163\tspruce_leaves\tpersistent\tfalse\tdistance\t3\n164\tspruce_leaves\tpersistent\ttrue\tdistance\t4\n165\tspruce_leaves\tpersistent\tfalse\tdistance\t4\n166\tspruce_leaves\tpersistent\ttrue\tdistance\t5\n167\tspruce_leaves\tpersistent\tfalse\tdistance\t5\n168\tspruce_leaves\tpersistent\ttrue\tdistance\t6\n169\tspruce_leaves\tpersistent\tfalse\tdistance\t6\n170\tspruce_leaves\tpersistent\ttrue\tdistance\t7\n171\tspruce_leaves\tpersistent\tfalse\tdistance\t7\n172\tbirch_leaves\tpersistent\ttrue\tdistance\t1\n173\tbirch_leaves\tpersistent\tfalse\tdistance\t1\n174\tbirch_leaves\tpersistent\ttrue\tdistance\t2\n175\tbirch_leaves\tpersistent\tfalse\tdistance\t2\n176\tbirch_leaves\tpersistent\ttrue\tdistance\t3\n177\tbirch_leaves\tpersistent\tfalse\tdistance\t3\n178\tbirch_leaves\tpersistent\ttrue\tdistance\t4\n179\tbirch_leaves\tpersistent\tfalse\tdistance\t4\n180\tbirch_leaves\tpersistent\ttrue\tdistance\t5\n181\tbirch_leaves\tpersistent\tfalse\tdistance\t5\n182\tbirch_leaves\tpersistent\ttrue\tdistance\t6\n183\tbirch_leaves\tpersistent\tfalse\tdistance\t6\n184\tbirch_leaves\tpersistent\ttrue\tdistance\t7\n185\tbirch_leaves\tpersistent\tfalse\tdistance\t7\n186\tjungle_leaves\tpersistent\ttrue\tdistance\t1\n187\tjungle_leaves\tpersistent\tfalse\tdistance\t1\n188\tjungle_leaves\tpersistent\ttrue\tdistance\t2\n189\tjungle_leaves\tpersistent\tfalse\tdistance\t2\n190\tjungle_leaves\tpersistent\ttrue\tdistance\t3\n191\tjungle_leaves\tpersistent\tfalse\tdistance\t3\n192\tjungle_leaves\tpersistent\ttrue\tdistance\t4\n193\tjungle_leaves\tpersistent\tfalse\tdistance\t4\n194\tjungle_leaves\tpersistent\ttrue\tdistance\t5\n195\tjungle_leaves\tpersistent\tfalse\tdistance\t5\n196\tjungle_leaves\tpersistent\ttrue\tdistance\t6\n197\tjungle_leaves\tpersistent\tfalse\tdistance\t6\n198\tjungle_leaves\tpersistent\ttrue\tdistance\t7\n199\tjungle_leaves\tpersistent\tfalse\tdistance\t7\n200\tacacia_leaves\tpersistent\ttrue\tdistance\t1\n201\tacacia_leaves\tpersistent\tfalse\tdistance\t1\n202\tacacia_leaves\tpersistent\ttrue\tdistance\t2\n203\tacacia_leaves\tpersistent\tfalse\tdistance\t2\n204\tacacia_leaves\tpersistent\ttrue\tdistance\t3\n205\tacacia_leaves\tpersistent\tfalse\tdistance\t3\n206\tacacia_leaves\tpersistent\ttrue\tdistance\t4\n207\tacacia_leaves\tpersistent\tfalse\tdistance\t4\n208\tacacia_leaves\tpersistent\ttrue\tdistance\t5\n209\tacacia_leaves\tpersistent\tfalse\tdistance\t5\n210\tacacia_leaves\tpersistent\ttrue\tdistance\t6\n211\tacacia_leaves\tpersistent\tfalse\tdistance\t6\n212\tacacia_leaves\tpersistent\ttrue\tdistance\t7\n213\tacacia_leaves\tpersistent\tfalse\tdistance\t7\n214\tdark_oak_leaves\tpersistent\ttrue\tdistance\t1\n215\tdark_oak_leaves\tpersistent\tfalse\tdistance\t1\n216\tdark_oak_leaves\tpersistent\ttrue\tdistance\t2\n217\tdark_oak_leaves\tpersistent\tfalse\tdistance\t2\n218\tdark_oak_leaves\tpersistent\ttrue\tdistance\t3\n219\tdark_oak_leaves\tpersistent\tfalse\tdistance\t3\n220\tdark_oak_leaves\tpersistent\ttrue\tdistance\t4\n221\tdark_oak_leaves\tpersistent\tfalse\tdistance\t4\n222\tdark_oak_leaves\tpersistent\ttrue\tdistance\t5\n223\tdark_oak_leaves\tpersistent\tfalse\tdistance\t5\n224\tdark_oak_leaves\tpersistent\ttrue\tdistance\t6\n225\tdark_oak_leaves\tpersistent\tfalse\tdistance\t6\n226\tdark_oak_leaves\tpersistent\ttrue\tdistance\t7\n227\tdark_oak_leaves\tpersistent\tfalse\tdistance\t7\n228\tsponge\n229\twet_sponge\n230\tglass\n231\tlapis_ore\n232\tlapis_block\n233\tdispenser\tfacing\tnorth\ttriggered\ttrue\n234\tdispenser\tfacing\tnorth\ttriggered\tfalse\n235\tdispenser\tfacing\teast\ttriggered\ttrue\n236\tdispenser\tfacing\teast\ttriggered\tfalse\n237\tdispenser\tfacing\tsouth\ttriggered\ttrue\n238\tdispenser\tfacing\tsouth\ttriggered\tfalse\n239\tdispenser\tfacing\twest\ttriggered\ttrue\n240\tdispenser\tfacing\twest\ttriggered\tfalse\n241\tdispenser\tfacing\tup\ttriggered\ttrue\n242\tdispenser\tfacing\tup\ttriggered\tfalse\n243\tdispenser\tfacing\tdown\ttriggered\ttrue\n244\tdispenser\tfacing\tdown\ttriggered\tfalse\n245\tsandstone\n246\tchiseled_sandstone\n247\tcut_sandstone\n248\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t0\n249\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t0\n250\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t1\n251\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t1\n252\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t2\n253\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t2\n254\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t3\n255\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t3\n256\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t4\n257\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t4\n258\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t5\n259\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t5\n260\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t6\n261\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t6\n262\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t7\n263\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t7\n264\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t8\n265\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t8\n266\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t9\n267\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t9\n268\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t10\n269\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t10\n270\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t11\n271\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t11\n272\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t12\n273\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t12\n274\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t13\n275\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t13\n276\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t14\n277\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t14\n278\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t15\n279\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t15\n280\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t16\n281\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t16\n282\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t17\n283\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t17\n284\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t18\n285\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t18\n286\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t19\n287\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t19\n288\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t20\n289\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t20\n290\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t21\n291\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t21\n292\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t22\n293\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t22\n294\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t23\n295\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t23\n296\tnote_block\tinstrument\tharp\tpowered\ttrue\tnote\t24\n297\tnote_block\tinstrument\tharp\tpowered\tfalse\tnote\t24\n298\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t0\n299\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t0\n300\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t1\n301\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t1\n302\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t2\n303\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t2\n304\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t3\n305\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t3\n306\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t4\n307\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t4\n308\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t5\n309\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t5\n310\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t6\n311\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t6\n312\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t7\n313\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t7\n314\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t8\n315\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t8\n316\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t9\n317\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t9\n318\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t10\n319\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t10\n320\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t11\n321\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t11\n322\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t12\n323\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t12\n324\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t13\n325\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t13\n326\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t14\n327\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t14\n328\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t15\n329\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t15\n330\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t16\n331\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t16\n332\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t17\n333\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t17\n334\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t18\n335\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t18\n336\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t19\n337\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t19\n338\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t20\n339\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t20\n340\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t21\n341\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t21\n342\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t22\n343\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t22\n344\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t23\n345\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t23\n346\tnote_block\tinstrument\tbasedrum\tpowered\ttrue\tnote\t24\n347\tnote_block\tinstrument\tbasedrum\tpowered\tfalse\tnote\t24\n348\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t0\n349\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t0\n350\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t1\n351\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t1\n352\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t2\n353\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t2\n354\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t3\n355\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t3\n356\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t4\n357\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t4\n358\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t5\n359\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t5\n360\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t6\n361\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t6\n362\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t7\n363\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t7\n364\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t8\n365\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t8\n366\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t9\n367\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t9\n368\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t10\n369\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t10\n370\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t11\n371\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t11\n372\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t12\n373\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t12\n374\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t13\n375\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t13\n376\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t14\n377\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t14\n378\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t15\n379\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t15\n380\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t16\n381\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t16\n382\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t17\n383\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t17\n384\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t18\n385\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t18\n386\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t19\n387\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t19\n388\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t20\n389\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t20\n390\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t21\n391\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t21\n392\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t22\n393\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t22\n394\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t23\n395\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t23\n396\tnote_block\tinstrument\tsnare\tpowered\ttrue\tnote\t24\n397\tnote_block\tinstrument\tsnare\tpowered\tfalse\tnote\t24\n398\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t0\n399\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t0\n400\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t1\n401\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t1\n402\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t2\n403\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t2\n404\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t3\n405\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t3\n406\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t4\n407\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t4\n408\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t5\n409\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t5\n410\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t6\n411\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t6\n412\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t7\n413\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t7\n414\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t8\n415\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t8\n416\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t9\n417\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t9\n418\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t10\n419\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t10\n420\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t11\n421\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t11\n422\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t12\n423\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t12\n424\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t13\n425\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t13\n426\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t14\n427\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t14\n428\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t15\n429\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t15\n430\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t16\n431\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t16\n432\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t17\n433\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t17\n434\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t18\n435\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t18\n436\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t19\n437\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t19\n438\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t20\n439\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t20\n440\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t21\n441\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t21\n442\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t22\n443\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t22\n444\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t23\n445\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t23\n446\tnote_block\tinstrument\that\tpowered\ttrue\tnote\t24\n447\tnote_block\tinstrument\that\tpowered\tfalse\tnote\t24\n448\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t0\n449\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t0\n450\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t1\n451\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t1\n452\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t2\n453\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t2\n454\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t3\n455\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t3\n456\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t4\n457\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t4\n458\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t5\n459\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t5\n460\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t6\n461\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t6\n462\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t7\n463\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t7\n464\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t8\n465\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t8\n466\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t9\n467\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t9\n468\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t10\n469\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t10\n470\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t11\n471\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t11\n472\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t12\n473\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t12\n474\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t13\n475\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t13\n476\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t14\n477\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t14\n478\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t15\n479\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t15\n480\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t16\n481\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t16\n482\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t17\n483\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t17\n484\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t18\n485\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t18\n486\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t19\n487\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t19\n488\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t20\n489\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t20\n490\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t21\n491\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t21\n492\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t22\n493\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t22\n494\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t23\n495\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t23\n496\tnote_block\tinstrument\tbass\tpowered\ttrue\tnote\t24\n497\tnote_block\tinstrument\tbass\tpowered\tfalse\tnote\t24\n498\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t0\n499\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t0\n500\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t1\n501\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t1\n502\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t2\n503\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t2\n504\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t3\n505\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t3\n506\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t4\n507\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t4\n508\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t5\n509\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t5\n510\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t6\n511\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t6\n512\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t7\n513\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t7\n514\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t8\n515\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t8\n516\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t9\n517\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t9\n518\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t10\n519\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t10\n520\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t11\n521\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t11\n522\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t12\n523\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t12\n524\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t13\n525\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t13\n526\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t14\n527\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t14\n528\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t15\n529\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t15\n530\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t16\n531\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t16\n532\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t17\n533\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t17\n534\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t18\n535\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t18\n536\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t19\n537\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t19\n538\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t20\n539\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t20\n540\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t21\n541\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t21\n542\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t22\n543\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t22\n544\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t23\n545\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t23\n546\tnote_block\tinstrument\tflute\tpowered\ttrue\tnote\t24\n547\tnote_block\tinstrument\tflute\tpowered\tfalse\tnote\t24\n548\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t0\n549\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t0\n550\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t1\n551\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t1\n552\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t2\n553\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t2\n554\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t3\n555\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t3\n556\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t4\n557\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t4\n558\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t5\n559\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t5\n560\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t6\n561\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t6\n562\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t7\n563\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t7\n564\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t8\n565\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t8\n566\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t9\n567\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t9\n568\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t10\n569\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t10\n570\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t11\n571\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t11\n572\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t12\n573\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t12\n574\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t13\n575\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t13\n576\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t14\n577\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t14\n578\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t15\n579\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t15\n580\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t16\n581\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t16\n582\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t17\n583\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t17\n584\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t18\n585\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t18\n586\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t19\n587\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t19\n588\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t20\n589\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t20\n590\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t21\n591\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t21\n592\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t22\n593\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t22\n594\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t23\n595\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t23\n596\tnote_block\tinstrument\tbell\tpowered\ttrue\tnote\t24\n597\tnote_block\tinstrument\tbell\tpowered\tfalse\tnote\t24\n598\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t0\n599\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t0\n600\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t1\n601\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t1\n602\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t2\n603\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t2\n604\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t3\n605\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t3\n606\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t4\n607\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t4\n608\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t5\n609\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t5\n610\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t6\n611\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t6\n612\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t7\n613\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t7\n614\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t8\n615\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t8\n616\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t9\n617\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t9\n618\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t10\n619\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t10\n620\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t11\n621\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t11\n622\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t12\n623\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t12\n624\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t13\n625\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t13\n626\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t14\n627\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t14\n628\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t15\n629\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t15\n630\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t16\n631\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t16\n632\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t17\n633\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t17\n634\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t18\n635\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t18\n636\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t19\n637\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t19\n638\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t20\n639\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t20\n640\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t21\n641\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t21\n642\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t22\n643\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t22\n644\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t23\n645\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t23\n646\tnote_block\tinstrument\tguitar\tpowered\ttrue\tnote\t24\n647\tnote_block\tinstrument\tguitar\tpowered\tfalse\tnote\t24\n648\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t0\n649\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t0\n650\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t1\n651\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t1\n652\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t2\n653\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t2\n654\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t3\n655\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t3\n656\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t4\n657\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t4\n658\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t5\n659\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t5\n660\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t6\n661\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t6\n662\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t7\n663\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t7\n664\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t8\n665\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t8\n666\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t9\n667\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t9\n668\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t10\n669\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t10\n670\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t11\n671\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t11\n672\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t12\n673\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t12\n674\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t13\n675\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t13\n676\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t14\n677\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t14\n678\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t15\n679\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t15\n680\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t16\n681\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t16\n682\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t17\n683\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t17\n684\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t18\n685\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t18\n686\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t19\n687\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t19\n688\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t20\n689\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t20\n690\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t21\n691\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t21\n692\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t22\n693\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t22\n694\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t23\n695\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t23\n696\tnote_block\tinstrument\tchime\tpowered\ttrue\tnote\t24\n697\tnote_block\tinstrument\tchime\tpowered\tfalse\tnote\t24\n698\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t0\n699\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t0\n700\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t1\n701\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t1\n702\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t2\n703\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t2\n704\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t3\n705\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t3\n706\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t4\n707\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t4\n708\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t5\n709\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t5\n710\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t6\n711\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t6\n712\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t7\n713\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t7\n714\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t8\n715\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t8\n716\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t9\n717\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t9\n718\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t10\n719\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t10\n720\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t11\n721\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t11\n722\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t12\n723\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t12\n724\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t13\n725\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t13\n726\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t14\n727\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t14\n728\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t15\n729\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t15\n730\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t16\n731\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t16\n732\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t17\n733\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t17\n734\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t18\n735\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t18\n736\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t19\n737\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t19\n738\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t20\n739\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t20\n740\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t21\n741\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t21\n742\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t22\n743\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t22\n744\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t23\n745\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t23\n746\tnote_block\tinstrument\txylophone\tpowered\ttrue\tnote\t24\n747\tnote_block\tinstrument\txylophone\tpowered\tfalse\tnote\t24\n748\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t0\n749\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t0\n750\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t1\n751\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t1\n752\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t2\n753\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t2\n754\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t3\n755\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t3\n756\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t4\n757\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t4\n758\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t5\n759\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t5\n760\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t6\n761\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t6\n762\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t7\n763\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t7\n764\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t8\n765\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t8\n766\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t9\n767\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t9\n768\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t10\n769\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t10\n770\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t11\n771\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t11\n772\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t12\n773\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t12\n774\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t13\n775\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t13\n776\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t14\n777\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t14\n778\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t15\n779\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t15\n780\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t16\n781\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t16\n782\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t17\n783\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t17\n784\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t18\n785\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t18\n786\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t19\n787\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t19\n788\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t20\n789\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t20\n790\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t21\n791\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t21\n792\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t22\n793\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t22\n794\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t23\n795\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t23\n796\tnote_block\tinstrument\tiron_xylophone\tpowered\ttrue\tnote\t24\n797\tnote_block\tinstrument\tiron_xylophone\tpowered\tfalse\tnote\t24\n798\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t0\n799\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t0\n800\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t1\n801\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t1\n802\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t2\n803\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t2\n804\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t3\n805\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t3\n806\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t4\n807\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t4\n808\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t5\n809\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t5\n810\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t6\n811\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t6\n812\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t7\n813\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t7\n814\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t8\n815\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t8\n816\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t9\n817\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t9\n818\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t10\n819\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t10\n820\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t11\n821\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t11\n822\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t12\n823\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t12\n824\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t13\n825\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t13\n826\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t14\n827\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t14\n828\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t15\n829\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t15\n830\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t16\n831\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t16\n832\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t17\n833\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t17\n834\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t18\n835\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t18\n836\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t19\n837\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t19\n838\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t20\n839\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t20\n840\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t21\n841\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t21\n842\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t22\n843\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t22\n844\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t23\n845\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t23\n846\tnote_block\tinstrument\tcow_bell\tpowered\ttrue\tnote\t24\n847\tnote_block\tinstrument\tcow_bell\tpowered\tfalse\tnote\t24\n848\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t0\n849\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t0\n850\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t1\n851\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t1\n852\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t2\n853\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t2\n854\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t3\n855\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t3\n856\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t4\n857\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t4\n858\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t5\n859\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t5\n860\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t6\n861\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t6\n862\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t7\n863\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t7\n864\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t8\n865\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t8\n866\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t9\n867\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t9\n868\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t10\n869\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t10\n870\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t11\n871\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t11\n872\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t12\n873\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t12\n874\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t13\n875\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t13\n876\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t14\n877\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t14\n878\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t15\n879\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t15\n880\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t16\n881\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t16\n882\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t17\n883\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t17\n884\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t18\n885\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t18\n886\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t19\n887\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t19\n888\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t20\n889\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t20\n890\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t21\n891\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t21\n892\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t22\n893\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t22\n894\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t23\n895\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t23\n896\tnote_block\tinstrument\tdidgeridoo\tpowered\ttrue\tnote\t24\n897\tnote_block\tinstrument\tdidgeridoo\tpowered\tfalse\tnote\t24\n898\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t0\n899\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t0\n900\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t1\n901\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t1\n902\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t2\n903\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t2\n904\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t3\n905\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t3\n906\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t4\n907\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t4\n908\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t5\n909\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t5\n910\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t6\n911\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t6\n912\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t7\n913\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t7\n914\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t8\n915\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t8\n916\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t9\n917\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t9\n918\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t10\n919\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t10\n920\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t11\n921\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t11\n922\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t12\n923\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t12\n924\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t13\n925\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t13\n926\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t14\n927\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t14\n928\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t15\n929\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t15\n930\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t16\n931\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t16\n932\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t17\n933\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t17\n934\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t18\n935\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t18\n936\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t19\n937\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t19\n938\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t20\n939\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t20\n940\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t21\n941\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t21\n942\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t22\n943\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t22\n944\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t23\n945\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t23\n946\tnote_block\tinstrument\tbit\tpowered\ttrue\tnote\t24\n947\tnote_block\tinstrument\tbit\tpowered\tfalse\tnote\t24\n948\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t0\n949\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t0\n950\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t1\n951\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t1\n952\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t2\n953\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t2\n954\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t3\n955\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t3\n956\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t4\n957\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t4\n958\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t5\n959\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t5\n960\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t6\n961\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t6\n962\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t7\n963\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t7\n964\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t8\n965\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t8\n966\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t9\n967\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t9\n968\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t10\n969\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t10\n970\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t11\n971\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t11\n972\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t12\n973\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t12\n974\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t13\n975\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t13\n976\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t14\n977\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t14\n978\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t15\n979\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t15\n980\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t16\n981\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t16\n982\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t17\n983\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t17\n984\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t18\n985\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t18\n986\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t19\n987\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t19\n988\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t20\n989\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t20\n990\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t21\n991\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t21\n992\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t22\n993\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t22\n994\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t23\n995\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t23\n996\tnote_block\tinstrument\tbanjo\tpowered\ttrue\tnote\t24\n997\tnote_block\tinstrument\tbanjo\tpowered\tfalse\tnote\t24\n998\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t0\n999\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t0\n1000\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t1\n1001\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t1\n1002\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t2\n1003\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t2\n1004\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t3\n1005\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t3\n1006\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t4\n1007\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t4\n1008\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t5\n1009\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t5\n1010\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t6\n1011\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t6\n1012\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t7\n1013\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t7\n1014\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t8\n1015\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t8\n1016\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t9\n1017\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t9\n1018\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t10\n1019\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t10\n1020\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t11\n1021\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t11\n1022\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t12\n1023\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t12\n1024\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t13\n1025\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t13\n1026\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t14\n1027\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t14\n1028\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t15\n1029\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t15\n1030\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t16\n1031\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t16\n1032\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t17\n1033\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t17\n1034\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t18\n1035\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t18\n1036\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t19\n1037\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t19\n1038\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t20\n1039\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t20\n1040\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t21\n1041\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t21\n1042\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t22\n1043\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t22\n1044\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t23\n1045\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t23\n1046\tnote_block\tinstrument\tpling\tpowered\ttrue\tnote\t24\n1047\tnote_block\tinstrument\tpling\tpowered\tfalse\tnote\t24\n1048\twhite_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1049\twhite_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1050\twhite_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1051\twhite_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1052\twhite_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1053\twhite_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1054\twhite_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1055\twhite_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1056\twhite_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1057\twhite_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1058\twhite_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1059\twhite_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1060\twhite_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1061\twhite_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1062\twhite_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1063\twhite_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1064\torange_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1065\torange_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1066\torange_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1067\torange_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1068\torange_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1069\torange_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1070\torange_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1071\torange_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1072\torange_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1073\torange_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1074\torange_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1075\torange_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1076\torange_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1077\torange_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1078\torange_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1079\torange_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1080\tmagenta_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1081\tmagenta_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1082\tmagenta_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1083\tmagenta_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1084\tmagenta_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1085\tmagenta_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1086\tmagenta_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1087\tmagenta_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1088\tmagenta_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1089\tmagenta_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1090\tmagenta_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1091\tmagenta_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1092\tmagenta_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1093\tmagenta_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1094\tmagenta_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1095\tmagenta_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1096\tlight_blue_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1097\tlight_blue_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1098\tlight_blue_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1099\tlight_blue_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1100\tlight_blue_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1101\tlight_blue_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1102\tlight_blue_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1103\tlight_blue_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1104\tlight_blue_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1105\tlight_blue_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1106\tlight_blue_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1107\tlight_blue_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1108\tlight_blue_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1109\tlight_blue_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1110\tlight_blue_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1111\tlight_blue_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1112\tyellow_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1113\tyellow_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1114\tyellow_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1115\tyellow_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1116\tyellow_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1117\tyellow_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1118\tyellow_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1119\tyellow_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1120\tyellow_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1121\tyellow_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1122\tyellow_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1123\tyellow_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1124\tyellow_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1125\tyellow_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1126\tyellow_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1127\tyellow_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1128\tlime_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1129\tlime_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1130\tlime_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1131\tlime_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1132\tlime_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1133\tlime_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1134\tlime_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1135\tlime_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1136\tlime_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1137\tlime_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1138\tlime_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1139\tlime_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1140\tlime_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1141\tlime_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1142\tlime_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1143\tlime_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1144\tpink_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1145\tpink_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1146\tpink_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1147\tpink_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1148\tpink_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1149\tpink_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1150\tpink_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1151\tpink_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1152\tpink_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1153\tpink_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1154\tpink_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1155\tpink_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1156\tpink_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1157\tpink_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1158\tpink_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1159\tpink_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1160\tgray_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1161\tgray_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1162\tgray_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1163\tgray_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1164\tgray_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1165\tgray_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1166\tgray_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1167\tgray_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1168\tgray_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1169\tgray_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1170\tgray_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1171\tgray_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1172\tgray_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1173\tgray_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1174\tgray_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1175\tgray_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1176\tlight_gray_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1177\tlight_gray_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1178\tlight_gray_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1179\tlight_gray_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1180\tlight_gray_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1181\tlight_gray_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1182\tlight_gray_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1183\tlight_gray_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1184\tlight_gray_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1185\tlight_gray_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1186\tlight_gray_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1187\tlight_gray_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1188\tlight_gray_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1189\tlight_gray_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1190\tlight_gray_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1191\tlight_gray_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1192\tcyan_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1193\tcyan_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1194\tcyan_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1195\tcyan_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1196\tcyan_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1197\tcyan_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1198\tcyan_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1199\tcyan_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1200\tcyan_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1201\tcyan_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1202\tcyan_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1203\tcyan_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1204\tcyan_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1205\tcyan_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1206\tcyan_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1207\tcyan_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1208\tpurple_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1209\tpurple_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1210\tpurple_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1211\tpurple_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1212\tpurple_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1213\tpurple_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1214\tpurple_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1215\tpurple_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1216\tpurple_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1217\tpurple_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1218\tpurple_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1219\tpurple_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1220\tpurple_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1221\tpurple_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1222\tpurple_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1223\tpurple_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1224\tblue_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1225\tblue_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1226\tblue_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1227\tblue_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1228\tblue_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1229\tblue_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1230\tblue_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1231\tblue_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1232\tblue_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1233\tblue_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1234\tblue_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1235\tblue_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1236\tblue_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1237\tblue_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1238\tblue_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1239\tblue_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1240\tbrown_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1241\tbrown_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1242\tbrown_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1243\tbrown_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1244\tbrown_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1245\tbrown_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1246\tbrown_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1247\tbrown_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1248\tbrown_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1249\tbrown_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1250\tbrown_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1251\tbrown_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1252\tbrown_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1253\tbrown_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1254\tbrown_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1255\tbrown_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1256\tgreen_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1257\tgreen_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1258\tgreen_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1259\tgreen_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1260\tgreen_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1261\tgreen_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1262\tgreen_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1263\tgreen_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1264\tgreen_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1265\tgreen_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1266\tgreen_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1267\tgreen_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1268\tgreen_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1269\tgreen_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1270\tgreen_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1271\tgreen_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1272\tred_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1273\tred_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1274\tred_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1275\tred_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1276\tred_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1277\tred_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1278\tred_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1279\tred_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1280\tred_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1281\tred_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1282\tred_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1283\tred_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1284\tred_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1285\tred_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1286\tred_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1287\tred_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1288\tblack_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n1289\tblack_bed\tfacing\tnorth\toccupied\ttrue\tpart\tfoot\n1290\tblack_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n1291\tblack_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n1292\tblack_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n1293\tblack_bed\tfacing\tsouth\toccupied\ttrue\tpart\tfoot\n1294\tblack_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n1295\tblack_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n1296\tblack_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n1297\tblack_bed\tfacing\twest\toccupied\ttrue\tpart\tfoot\n1298\tblack_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n1299\tblack_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n1300\tblack_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n1301\tblack_bed\tfacing\teast\toccupied\ttrue\tpart\tfoot\n1302\tblack_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n1303\tblack_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n1304\tpowered_rail\tshape\tnorth_south\tpowered\ttrue\n1305\tpowered_rail\tshape\teast_west\tpowered\ttrue\n1306\tpowered_rail\tshape\tascending_east\tpowered\ttrue\n1307\tpowered_rail\tshape\tascending_west\tpowered\ttrue\n1308\tpowered_rail\tshape\tascending_north\tpowered\ttrue\n1309\tpowered_rail\tshape\tascending_south\tpowered\ttrue\n1310\tpowered_rail\tshape\tnorth_south\tpowered\tfalse\n1311\tpowered_rail\tshape\teast_west\tpowered\tfalse\n1312\tpowered_rail\tshape\tascending_east\tpowered\tfalse\n1313\tpowered_rail\tshape\tascending_west\tpowered\tfalse\n1314\tpowered_rail\tshape\tascending_north\tpowered\tfalse\n1315\tpowered_rail\tshape\tascending_south\tpowered\tfalse\n1316\tdetector_rail\tshape\tnorth_south\tpowered\ttrue\n1317\tdetector_rail\tshape\teast_west\tpowered\ttrue\n1318\tdetector_rail\tshape\tascending_east\tpowered\ttrue\n1319\tdetector_rail\tshape\tascending_west\tpowered\ttrue\n1320\tdetector_rail\tshape\tascending_north\tpowered\ttrue\n1321\tdetector_rail\tshape\tascending_south\tpowered\ttrue\n1322\tdetector_rail\tshape\tnorth_south\tpowered\tfalse\n1323\tdetector_rail\tshape\teast_west\tpowered\tfalse\n1324\tdetector_rail\tshape\tascending_east\tpowered\tfalse\n1325\tdetector_rail\tshape\tascending_west\tpowered\tfalse\n1326\tdetector_rail\tshape\tascending_north\tpowered\tfalse\n1327\tdetector_rail\tshape\tascending_south\tpowered\tfalse\n1328\tsticky_piston\tfacing\tnorth\textended\ttrue\n1329\tsticky_piston\tfacing\teast\textended\ttrue\n1330\tsticky_piston\tfacing\tsouth\textended\ttrue\n1331\tsticky_piston\tfacing\twest\textended\ttrue\n1332\tsticky_piston\tfacing\tup\textended\ttrue\n1333\tsticky_piston\tfacing\tdown\textended\ttrue\n1334\tsticky_piston\tfacing\tnorth\textended\tfalse\n1335\tsticky_piston\tfacing\teast\textended\tfalse\n1336\tsticky_piston\tfacing\tsouth\textended\tfalse\n1337\tsticky_piston\tfacing\twest\textended\tfalse\n1338\tsticky_piston\tfacing\tup\textended\tfalse\n1339\tsticky_piston\tfacing\tdown\textended\tfalse\n1340\tcobweb\n1341\tgrass\n1342\tfern\n1343\tdead_bush\n1344\tseagrass\n1345\ttall_seagrass\thalf\tupper\n1346\ttall_seagrass\thalf\tlower\n1347\tpiston\tfacing\tnorth\textended\ttrue\n1348\tpiston\tfacing\teast\textended\ttrue\n1349\tpiston\tfacing\tsouth\textended\ttrue\n1350\tpiston\tfacing\twest\textended\ttrue\n1351\tpiston\tfacing\tup\textended\ttrue\n1352\tpiston\tfacing\tdown\textended\ttrue\n1353\tpiston\tfacing\tnorth\textended\tfalse\n1354\tpiston\tfacing\teast\textended\tfalse\n1355\tpiston\tfacing\tsouth\textended\tfalse\n1356\tpiston\tfacing\twest\textended\tfalse\n1357\tpiston\tfacing\tup\textended\tfalse\n1358\tpiston\tfacing\tdown\textended\tfalse\n1359\tpiston_head\tfacing\tnorth\tshort\ttrue\ttype\tnormal\n1360\tpiston_head\tfacing\tnorth\tshort\ttrue\ttype\tsticky\n1361\tpiston_head\tfacing\tnorth\tshort\tfalse\ttype\tnormal\n1362\tpiston_head\tfacing\tnorth\tshort\tfalse\ttype\tsticky\n1363\tpiston_head\tfacing\teast\tshort\ttrue\ttype\tnormal\n1364\tpiston_head\tfacing\teast\tshort\ttrue\ttype\tsticky\n1365\tpiston_head\tfacing\teast\tshort\tfalse\ttype\tnormal\n1366\tpiston_head\tfacing\teast\tshort\tfalse\ttype\tsticky\n1367\tpiston_head\tfacing\tsouth\tshort\ttrue\ttype\tnormal\n1368\tpiston_head\tfacing\tsouth\tshort\ttrue\ttype\tsticky\n1369\tpiston_head\tfacing\tsouth\tshort\tfalse\ttype\tnormal\n1370\tpiston_head\tfacing\tsouth\tshort\tfalse\ttype\tsticky\n1371\tpiston_head\tfacing\twest\tshort\ttrue\ttype\tnormal\n1372\tpiston_head\tfacing\twest\tshort\ttrue\ttype\tsticky\n1373\tpiston_head\tfacing\twest\tshort\tfalse\ttype\tnormal\n1374\tpiston_head\tfacing\twest\tshort\tfalse\ttype\tsticky\n1375\tpiston_head\tfacing\tup\tshort\ttrue\ttype\tnormal\n1376\tpiston_head\tfacing\tup\tshort\ttrue\ttype\tsticky\n1377\tpiston_head\tfacing\tup\tshort\tfalse\ttype\tnormal\n1378\tpiston_head\tfacing\tup\tshort\tfalse\ttype\tsticky\n1379\tpiston_head\tfacing\tdown\tshort\ttrue\ttype\tnormal\n1380\tpiston_head\tfacing\tdown\tshort\ttrue\ttype\tsticky\n1381\tpiston_head\tfacing\tdown\tshort\tfalse\ttype\tnormal\n1382\tpiston_head\tfacing\tdown\tshort\tfalse\ttype\tsticky\n1383\twhite_wool\n1384\torange_wool\n1385\tmagenta_wool\n1386\tlight_blue_wool\n1387\tyellow_wool\n1388\tlime_wool\n1389\tpink_wool\n1390\tgray_wool\n1391\tlight_gray_wool\n1392\tcyan_wool\n1393\tpurple_wool\n1394\tblue_wool\n1395\tbrown_wool\n1396\tgreen_wool\n1397\tred_wool\n1398\tblack_wool\n1399\tmoving_piston\tfacing\tnorth\ttype\tnormal\n1400\tmoving_piston\tfacing\tnorth\ttype\tsticky\n1401\tmoving_piston\tfacing\teast\ttype\tnormal\n1402\tmoving_piston\tfacing\teast\ttype\tsticky\n1403\tmoving_piston\tfacing\tsouth\ttype\tnormal\n1404\tmoving_piston\tfacing\tsouth\ttype\tsticky\n1405\tmoving_piston\tfacing\twest\ttype\tnormal\n1406\tmoving_piston\tfacing\twest\ttype\tsticky\n1407\tmoving_piston\tfacing\tup\ttype\tnormal\n1408\tmoving_piston\tfacing\tup\ttype\tsticky\n1409\tmoving_piston\tfacing\tdown\ttype\tnormal\n1410\tmoving_piston\tfacing\tdown\ttype\tsticky\n1411\tdandelion\n1412\tpoppy\n1413\tblue_orchid\n1414\tallium\n1415\tazure_bluet\n1416\tred_tulip\n1417\torange_tulip\n1418\twhite_tulip\n1419\tpink_tulip\n1420\toxeye_daisy\n1421\tcornflower\n1422\twither_rose\n1423\tlily_of_the_valley\n1424\tbrown_mushroom\n1425\tred_mushroom\n1426\tgold_block\n1427\tiron_block\n1428\tbricks\n1429\ttnt\tunstable\ttrue\n1430\ttnt\tunstable\tfalse\n1431\tbookshelf\n1432\tmossy_cobblestone\n1433\tobsidian\n1434\ttorch\n1435\twall_torch\tfacing\tnorth\n1436\twall_torch\tfacing\tsouth\n1437\twall_torch\tfacing\twest\n1438\twall_torch\tfacing\teast\n1439\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t0\tup\ttrue\twest\ttrue\n1440\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t0\tup\ttrue\twest\tfalse\n1441\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t0\tup\tfalse\twest\ttrue\n1442\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t0\tup\tfalse\twest\tfalse\n1443\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t0\tup\ttrue\twest\ttrue\n1444\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t0\tup\ttrue\twest\tfalse\n1445\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t0\tup\tfalse\twest\ttrue\n1446\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t0\tup\tfalse\twest\tfalse\n1447\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t0\tup\ttrue\twest\ttrue\n1448\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t0\tup\ttrue\twest\tfalse\n1449\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t0\tup\tfalse\twest\ttrue\n1450\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t0\tup\tfalse\twest\tfalse\n1451\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t0\tup\ttrue\twest\ttrue\n1452\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t0\tup\ttrue\twest\tfalse\n1453\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t0\tup\tfalse\twest\ttrue\n1454\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t0\tup\tfalse\twest\tfalse\n1455\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t0\tup\ttrue\twest\ttrue\n1456\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t0\tup\ttrue\twest\tfalse\n1457\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t0\tup\tfalse\twest\ttrue\n1458\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n1459\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t0\tup\ttrue\twest\ttrue\n1460\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t0\tup\ttrue\twest\tfalse\n1461\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\ttrue\n1462\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n1463\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t0\tup\ttrue\twest\ttrue\n1464\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t0\tup\ttrue\twest\tfalse\n1465\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t0\tup\tfalse\twest\ttrue\n1466\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n1467\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\ttrue\twest\ttrue\n1468\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\ttrue\twest\tfalse\n1469\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\ttrue\n1470\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n1471\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t1\tup\ttrue\twest\ttrue\n1472\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t1\tup\ttrue\twest\tfalse\n1473\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t1\tup\tfalse\twest\ttrue\n1474\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t1\tup\tfalse\twest\tfalse\n1475\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t1\tup\ttrue\twest\ttrue\n1476\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t1\tup\ttrue\twest\tfalse\n1477\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t1\tup\tfalse\twest\ttrue\n1478\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t1\tup\tfalse\twest\tfalse\n1479\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t1\tup\ttrue\twest\ttrue\n1480\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t1\tup\ttrue\twest\tfalse\n1481\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t1\tup\tfalse\twest\ttrue\n1482\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t1\tup\tfalse\twest\tfalse\n1483\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t1\tup\ttrue\twest\ttrue\n1484\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t1\tup\ttrue\twest\tfalse\n1485\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t1\tup\tfalse\twest\ttrue\n1486\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t1\tup\tfalse\twest\tfalse\n1487\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t1\tup\ttrue\twest\ttrue\n1488\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t1\tup\ttrue\twest\tfalse\n1489\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t1\tup\tfalse\twest\ttrue\n1490\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n1491\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t1\tup\ttrue\twest\ttrue\n1492\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t1\tup\ttrue\twest\tfalse\n1493\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\ttrue\n1494\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n1495\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t1\tup\ttrue\twest\ttrue\n1496\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t1\tup\ttrue\twest\tfalse\n1497\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t1\tup\tfalse\twest\ttrue\n1498\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n1499\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\ttrue\twest\ttrue\n1500\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\ttrue\twest\tfalse\n1501\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\ttrue\n1502\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n1503\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t2\tup\ttrue\twest\ttrue\n1504\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t2\tup\ttrue\twest\tfalse\n1505\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t2\tup\tfalse\twest\ttrue\n1506\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t2\tup\tfalse\twest\tfalse\n1507\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t2\tup\ttrue\twest\ttrue\n1508\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t2\tup\ttrue\twest\tfalse\n1509\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t2\tup\tfalse\twest\ttrue\n1510\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t2\tup\tfalse\twest\tfalse\n1511\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t2\tup\ttrue\twest\ttrue\n1512\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t2\tup\ttrue\twest\tfalse\n1513\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t2\tup\tfalse\twest\ttrue\n1514\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t2\tup\tfalse\twest\tfalse\n1515\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t2\tup\ttrue\twest\ttrue\n1516\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t2\tup\ttrue\twest\tfalse\n1517\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t2\tup\tfalse\twest\ttrue\n1518\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t2\tup\tfalse\twest\tfalse\n1519\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t2\tup\ttrue\twest\ttrue\n1520\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t2\tup\ttrue\twest\tfalse\n1521\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t2\tup\tfalse\twest\ttrue\n1522\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n1523\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t2\tup\ttrue\twest\ttrue\n1524\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t2\tup\ttrue\twest\tfalse\n1525\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\ttrue\n1526\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n1527\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t2\tup\ttrue\twest\ttrue\n1528\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t2\tup\ttrue\twest\tfalse\n1529\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t2\tup\tfalse\twest\ttrue\n1530\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n1531\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\ttrue\twest\ttrue\n1532\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\ttrue\twest\tfalse\n1533\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\ttrue\n1534\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n1535\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t3\tup\ttrue\twest\ttrue\n1536\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t3\tup\ttrue\twest\tfalse\n1537\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t3\tup\tfalse\twest\ttrue\n1538\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t3\tup\tfalse\twest\tfalse\n1539\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t3\tup\ttrue\twest\ttrue\n1540\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t3\tup\ttrue\twest\tfalse\n1541\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t3\tup\tfalse\twest\ttrue\n1542\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t3\tup\tfalse\twest\tfalse\n1543\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t3\tup\ttrue\twest\ttrue\n1544\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t3\tup\ttrue\twest\tfalse\n1545\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t3\tup\tfalse\twest\ttrue\n1546\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t3\tup\tfalse\twest\tfalse\n1547\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t3\tup\ttrue\twest\ttrue\n1548\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t3\tup\ttrue\twest\tfalse\n1549\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t3\tup\tfalse\twest\ttrue\n1550\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t3\tup\tfalse\twest\tfalse\n1551\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t3\tup\ttrue\twest\ttrue\n1552\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t3\tup\ttrue\twest\tfalse\n1553\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t3\tup\tfalse\twest\ttrue\n1554\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n1555\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t3\tup\ttrue\twest\ttrue\n1556\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t3\tup\ttrue\twest\tfalse\n1557\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\ttrue\n1558\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n1559\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t3\tup\ttrue\twest\ttrue\n1560\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t3\tup\ttrue\twest\tfalse\n1561\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t3\tup\tfalse\twest\ttrue\n1562\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n1563\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\ttrue\twest\ttrue\n1564\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\ttrue\twest\tfalse\n1565\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\ttrue\n1566\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n1567\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t4\tup\ttrue\twest\ttrue\n1568\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t4\tup\ttrue\twest\tfalse\n1569\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t4\tup\tfalse\twest\ttrue\n1570\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t4\tup\tfalse\twest\tfalse\n1571\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t4\tup\ttrue\twest\ttrue\n1572\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t4\tup\ttrue\twest\tfalse\n1573\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t4\tup\tfalse\twest\ttrue\n1574\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t4\tup\tfalse\twest\tfalse\n1575\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t4\tup\ttrue\twest\ttrue\n1576\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t4\tup\ttrue\twest\tfalse\n1577\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t4\tup\tfalse\twest\ttrue\n1578\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t4\tup\tfalse\twest\tfalse\n1579\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t4\tup\ttrue\twest\ttrue\n1580\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t4\tup\ttrue\twest\tfalse\n1581\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t4\tup\tfalse\twest\ttrue\n1582\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t4\tup\tfalse\twest\tfalse\n1583\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t4\tup\ttrue\twest\ttrue\n1584\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t4\tup\ttrue\twest\tfalse\n1585\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t4\tup\tfalse\twest\ttrue\n1586\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n1587\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t4\tup\ttrue\twest\ttrue\n1588\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t4\tup\ttrue\twest\tfalse\n1589\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\ttrue\n1590\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n1591\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t4\tup\ttrue\twest\ttrue\n1592\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t4\tup\ttrue\twest\tfalse\n1593\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t4\tup\tfalse\twest\ttrue\n1594\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n1595\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\ttrue\twest\ttrue\n1596\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\ttrue\twest\tfalse\n1597\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\ttrue\n1598\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n1599\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t5\tup\ttrue\twest\ttrue\n1600\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t5\tup\ttrue\twest\tfalse\n1601\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t5\tup\tfalse\twest\ttrue\n1602\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t5\tup\tfalse\twest\tfalse\n1603\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t5\tup\ttrue\twest\ttrue\n1604\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t5\tup\ttrue\twest\tfalse\n1605\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t5\tup\tfalse\twest\ttrue\n1606\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t5\tup\tfalse\twest\tfalse\n1607\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t5\tup\ttrue\twest\ttrue\n1608\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t5\tup\ttrue\twest\tfalse\n1609\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t5\tup\tfalse\twest\ttrue\n1610\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t5\tup\tfalse\twest\tfalse\n1611\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t5\tup\ttrue\twest\ttrue\n1612\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t5\tup\ttrue\twest\tfalse\n1613\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t5\tup\tfalse\twest\ttrue\n1614\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t5\tup\tfalse\twest\tfalse\n1615\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t5\tup\ttrue\twest\ttrue\n1616\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t5\tup\ttrue\twest\tfalse\n1617\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t5\tup\tfalse\twest\ttrue\n1618\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n1619\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t5\tup\ttrue\twest\ttrue\n1620\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t5\tup\ttrue\twest\tfalse\n1621\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\ttrue\n1622\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n1623\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t5\tup\ttrue\twest\ttrue\n1624\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t5\tup\ttrue\twest\tfalse\n1625\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t5\tup\tfalse\twest\ttrue\n1626\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n1627\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\ttrue\twest\ttrue\n1628\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\ttrue\twest\tfalse\n1629\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\ttrue\n1630\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n1631\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t6\tup\ttrue\twest\ttrue\n1632\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t6\tup\ttrue\twest\tfalse\n1633\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t6\tup\tfalse\twest\ttrue\n1634\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t6\tup\tfalse\twest\tfalse\n1635\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t6\tup\ttrue\twest\ttrue\n1636\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t6\tup\ttrue\twest\tfalse\n1637\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t6\tup\tfalse\twest\ttrue\n1638\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t6\tup\tfalse\twest\tfalse\n1639\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t6\tup\ttrue\twest\ttrue\n1640\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t6\tup\ttrue\twest\tfalse\n1641\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t6\tup\tfalse\twest\ttrue\n1642\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t6\tup\tfalse\twest\tfalse\n1643\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t6\tup\ttrue\twest\ttrue\n1644\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t6\tup\ttrue\twest\tfalse\n1645\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t6\tup\tfalse\twest\ttrue\n1646\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t6\tup\tfalse\twest\tfalse\n1647\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t6\tup\ttrue\twest\ttrue\n1648\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t6\tup\ttrue\twest\tfalse\n1649\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t6\tup\tfalse\twest\ttrue\n1650\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n1651\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t6\tup\ttrue\twest\ttrue\n1652\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t6\tup\ttrue\twest\tfalse\n1653\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\ttrue\n1654\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n1655\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t6\tup\ttrue\twest\ttrue\n1656\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t6\tup\ttrue\twest\tfalse\n1657\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t6\tup\tfalse\twest\ttrue\n1658\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n1659\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\ttrue\twest\ttrue\n1660\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\ttrue\twest\tfalse\n1661\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\ttrue\n1662\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n1663\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t7\tup\ttrue\twest\ttrue\n1664\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t7\tup\ttrue\twest\tfalse\n1665\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t7\tup\tfalse\twest\ttrue\n1666\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t7\tup\tfalse\twest\tfalse\n1667\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t7\tup\ttrue\twest\ttrue\n1668\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t7\tup\ttrue\twest\tfalse\n1669\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t7\tup\tfalse\twest\ttrue\n1670\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t7\tup\tfalse\twest\tfalse\n1671\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t7\tup\ttrue\twest\ttrue\n1672\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t7\tup\ttrue\twest\tfalse\n1673\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t7\tup\tfalse\twest\ttrue\n1674\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t7\tup\tfalse\twest\tfalse\n1675\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t7\tup\ttrue\twest\ttrue\n1676\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t7\tup\ttrue\twest\tfalse\n1677\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t7\tup\tfalse\twest\ttrue\n1678\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t7\tup\tfalse\twest\tfalse\n1679\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t7\tup\ttrue\twest\ttrue\n1680\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t7\tup\ttrue\twest\tfalse\n1681\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t7\tup\tfalse\twest\ttrue\n1682\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n1683\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t7\tup\ttrue\twest\ttrue\n1684\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t7\tup\ttrue\twest\tfalse\n1685\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\ttrue\n1686\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n1687\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t7\tup\ttrue\twest\ttrue\n1688\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t7\tup\ttrue\twest\tfalse\n1689\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t7\tup\tfalse\twest\ttrue\n1690\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n1691\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\ttrue\twest\ttrue\n1692\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\ttrue\twest\tfalse\n1693\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\ttrue\n1694\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n1695\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t8\tup\ttrue\twest\ttrue\n1696\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t8\tup\ttrue\twest\tfalse\n1697\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t8\tup\tfalse\twest\ttrue\n1698\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t8\tup\tfalse\twest\tfalse\n1699\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t8\tup\ttrue\twest\ttrue\n1700\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t8\tup\ttrue\twest\tfalse\n1701\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t8\tup\tfalse\twest\ttrue\n1702\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t8\tup\tfalse\twest\tfalse\n1703\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t8\tup\ttrue\twest\ttrue\n1704\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t8\tup\ttrue\twest\tfalse\n1705\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t8\tup\tfalse\twest\ttrue\n1706\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t8\tup\tfalse\twest\tfalse\n1707\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t8\tup\ttrue\twest\ttrue\n1708\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t8\tup\ttrue\twest\tfalse\n1709\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t8\tup\tfalse\twest\ttrue\n1710\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t8\tup\tfalse\twest\tfalse\n1711\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t8\tup\ttrue\twest\ttrue\n1712\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t8\tup\ttrue\twest\tfalse\n1713\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t8\tup\tfalse\twest\ttrue\n1714\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n1715\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t8\tup\ttrue\twest\ttrue\n1716\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t8\tup\ttrue\twest\tfalse\n1717\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\ttrue\n1718\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n1719\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t8\tup\ttrue\twest\ttrue\n1720\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t8\tup\ttrue\twest\tfalse\n1721\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t8\tup\tfalse\twest\ttrue\n1722\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n1723\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\ttrue\twest\ttrue\n1724\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\ttrue\twest\tfalse\n1725\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\ttrue\n1726\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n1727\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t9\tup\ttrue\twest\ttrue\n1728\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t9\tup\ttrue\twest\tfalse\n1729\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t9\tup\tfalse\twest\ttrue\n1730\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t9\tup\tfalse\twest\tfalse\n1731\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t9\tup\ttrue\twest\ttrue\n1732\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t9\tup\ttrue\twest\tfalse\n1733\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t9\tup\tfalse\twest\ttrue\n1734\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t9\tup\tfalse\twest\tfalse\n1735\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t9\tup\ttrue\twest\ttrue\n1736\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t9\tup\ttrue\twest\tfalse\n1737\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t9\tup\tfalse\twest\ttrue\n1738\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t9\tup\tfalse\twest\tfalse\n1739\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t9\tup\ttrue\twest\ttrue\n1740\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t9\tup\ttrue\twest\tfalse\n1741\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t9\tup\tfalse\twest\ttrue\n1742\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t9\tup\tfalse\twest\tfalse\n1743\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t9\tup\ttrue\twest\ttrue\n1744\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t9\tup\ttrue\twest\tfalse\n1745\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t9\tup\tfalse\twest\ttrue\n1746\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n1747\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t9\tup\ttrue\twest\ttrue\n1748\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t9\tup\ttrue\twest\tfalse\n1749\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\ttrue\n1750\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n1751\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t9\tup\ttrue\twest\ttrue\n1752\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t9\tup\ttrue\twest\tfalse\n1753\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t9\tup\tfalse\twest\ttrue\n1754\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n1755\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\ttrue\twest\ttrue\n1756\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\ttrue\twest\tfalse\n1757\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\ttrue\n1758\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n1759\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t10\tup\ttrue\twest\ttrue\n1760\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t10\tup\ttrue\twest\tfalse\n1761\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t10\tup\tfalse\twest\ttrue\n1762\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t10\tup\tfalse\twest\tfalse\n1763\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t10\tup\ttrue\twest\ttrue\n1764\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t10\tup\ttrue\twest\tfalse\n1765\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t10\tup\tfalse\twest\ttrue\n1766\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t10\tup\tfalse\twest\tfalse\n1767\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t10\tup\ttrue\twest\ttrue\n1768\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t10\tup\ttrue\twest\tfalse\n1769\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t10\tup\tfalse\twest\ttrue\n1770\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t10\tup\tfalse\twest\tfalse\n1771\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t10\tup\ttrue\twest\ttrue\n1772\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t10\tup\ttrue\twest\tfalse\n1773\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t10\tup\tfalse\twest\ttrue\n1774\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t10\tup\tfalse\twest\tfalse\n1775\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t10\tup\ttrue\twest\ttrue\n1776\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t10\tup\ttrue\twest\tfalse\n1777\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t10\tup\tfalse\twest\ttrue\n1778\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n1779\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t10\tup\ttrue\twest\ttrue\n1780\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t10\tup\ttrue\twest\tfalse\n1781\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\ttrue\n1782\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n1783\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t10\tup\ttrue\twest\ttrue\n1784\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t10\tup\ttrue\twest\tfalse\n1785\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t10\tup\tfalse\twest\ttrue\n1786\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n1787\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\ttrue\twest\ttrue\n1788\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\ttrue\twest\tfalse\n1789\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\ttrue\n1790\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n1791\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t11\tup\ttrue\twest\ttrue\n1792\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t11\tup\ttrue\twest\tfalse\n1793\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t11\tup\tfalse\twest\ttrue\n1794\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t11\tup\tfalse\twest\tfalse\n1795\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t11\tup\ttrue\twest\ttrue\n1796\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t11\tup\ttrue\twest\tfalse\n1797\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t11\tup\tfalse\twest\ttrue\n1798\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t11\tup\tfalse\twest\tfalse\n1799\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t11\tup\ttrue\twest\ttrue\n1800\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t11\tup\ttrue\twest\tfalse\n1801\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t11\tup\tfalse\twest\ttrue\n1802\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t11\tup\tfalse\twest\tfalse\n1803\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t11\tup\ttrue\twest\ttrue\n1804\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t11\tup\ttrue\twest\tfalse\n1805\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t11\tup\tfalse\twest\ttrue\n1806\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t11\tup\tfalse\twest\tfalse\n1807\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t11\tup\ttrue\twest\ttrue\n1808\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t11\tup\ttrue\twest\tfalse\n1809\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t11\tup\tfalse\twest\ttrue\n1810\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n1811\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t11\tup\ttrue\twest\ttrue\n1812\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t11\tup\ttrue\twest\tfalse\n1813\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\ttrue\n1814\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n1815\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t11\tup\ttrue\twest\ttrue\n1816\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t11\tup\ttrue\twest\tfalse\n1817\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t11\tup\tfalse\twest\ttrue\n1818\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n1819\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\ttrue\twest\ttrue\n1820\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\ttrue\twest\tfalse\n1821\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\ttrue\n1822\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n1823\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t12\tup\ttrue\twest\ttrue\n1824\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t12\tup\ttrue\twest\tfalse\n1825\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t12\tup\tfalse\twest\ttrue\n1826\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t12\tup\tfalse\twest\tfalse\n1827\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t12\tup\ttrue\twest\ttrue\n1828\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t12\tup\ttrue\twest\tfalse\n1829\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t12\tup\tfalse\twest\ttrue\n1830\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t12\tup\tfalse\twest\tfalse\n1831\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t12\tup\ttrue\twest\ttrue\n1832\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t12\tup\ttrue\twest\tfalse\n1833\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t12\tup\tfalse\twest\ttrue\n1834\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t12\tup\tfalse\twest\tfalse\n1835\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t12\tup\ttrue\twest\ttrue\n1836\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t12\tup\ttrue\twest\tfalse\n1837\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t12\tup\tfalse\twest\ttrue\n1838\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t12\tup\tfalse\twest\tfalse\n1839\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t12\tup\ttrue\twest\ttrue\n1840\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t12\tup\ttrue\twest\tfalse\n1841\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t12\tup\tfalse\twest\ttrue\n1842\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n1843\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t12\tup\ttrue\twest\ttrue\n1844\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t12\tup\ttrue\twest\tfalse\n1845\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\ttrue\n1846\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n1847\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t12\tup\ttrue\twest\ttrue\n1848\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t12\tup\ttrue\twest\tfalse\n1849\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t12\tup\tfalse\twest\ttrue\n1850\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n1851\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\ttrue\twest\ttrue\n1852\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\ttrue\twest\tfalse\n1853\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\ttrue\n1854\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n1855\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t13\tup\ttrue\twest\ttrue\n1856\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t13\tup\ttrue\twest\tfalse\n1857\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t13\tup\tfalse\twest\ttrue\n1858\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t13\tup\tfalse\twest\tfalse\n1859\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t13\tup\ttrue\twest\ttrue\n1860\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t13\tup\ttrue\twest\tfalse\n1861\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t13\tup\tfalse\twest\ttrue\n1862\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t13\tup\tfalse\twest\tfalse\n1863\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t13\tup\ttrue\twest\ttrue\n1864\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t13\tup\ttrue\twest\tfalse\n1865\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t13\tup\tfalse\twest\ttrue\n1866\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t13\tup\tfalse\twest\tfalse\n1867\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t13\tup\ttrue\twest\ttrue\n1868\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t13\tup\ttrue\twest\tfalse\n1869\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t13\tup\tfalse\twest\ttrue\n1870\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t13\tup\tfalse\twest\tfalse\n1871\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t13\tup\ttrue\twest\ttrue\n1872\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t13\tup\ttrue\twest\tfalse\n1873\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t13\tup\tfalse\twest\ttrue\n1874\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n1875\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t13\tup\ttrue\twest\ttrue\n1876\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t13\tup\ttrue\twest\tfalse\n1877\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\ttrue\n1878\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n1879\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t13\tup\ttrue\twest\ttrue\n1880\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t13\tup\ttrue\twest\tfalse\n1881\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t13\tup\tfalse\twest\ttrue\n1882\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n1883\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\ttrue\twest\ttrue\n1884\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\ttrue\twest\tfalse\n1885\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\ttrue\n1886\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n1887\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t14\tup\ttrue\twest\ttrue\n1888\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t14\tup\ttrue\twest\tfalse\n1889\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t14\tup\tfalse\twest\ttrue\n1890\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t14\tup\tfalse\twest\tfalse\n1891\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t14\tup\ttrue\twest\ttrue\n1892\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t14\tup\ttrue\twest\tfalse\n1893\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t14\tup\tfalse\twest\ttrue\n1894\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t14\tup\tfalse\twest\tfalse\n1895\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t14\tup\ttrue\twest\ttrue\n1896\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t14\tup\ttrue\twest\tfalse\n1897\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t14\tup\tfalse\twest\ttrue\n1898\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t14\tup\tfalse\twest\tfalse\n1899\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t14\tup\ttrue\twest\ttrue\n1900\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t14\tup\ttrue\twest\tfalse\n1901\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t14\tup\tfalse\twest\ttrue\n1902\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t14\tup\tfalse\twest\tfalse\n1903\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t14\tup\ttrue\twest\ttrue\n1904\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t14\tup\ttrue\twest\tfalse\n1905\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t14\tup\tfalse\twest\ttrue\n1906\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n1907\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t14\tup\ttrue\twest\ttrue\n1908\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t14\tup\ttrue\twest\tfalse\n1909\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\ttrue\n1910\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n1911\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t14\tup\ttrue\twest\ttrue\n1912\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t14\tup\ttrue\twest\tfalse\n1913\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t14\tup\tfalse\twest\ttrue\n1914\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n1915\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\ttrue\twest\ttrue\n1916\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\ttrue\twest\tfalse\n1917\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\ttrue\n1918\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n1919\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t15\tup\ttrue\twest\ttrue\n1920\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t15\tup\ttrue\twest\tfalse\n1921\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t15\tup\tfalse\twest\ttrue\n1922\tfire\tnorth\ttrue\tsouth\ttrue\teast\ttrue\tage\t15\tup\tfalse\twest\tfalse\n1923\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t15\tup\ttrue\twest\ttrue\n1924\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t15\tup\ttrue\twest\tfalse\n1925\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t15\tup\tfalse\twest\ttrue\n1926\tfire\tnorth\ttrue\tsouth\tfalse\teast\ttrue\tage\t15\tup\tfalse\twest\tfalse\n1927\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t15\tup\ttrue\twest\ttrue\n1928\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t15\tup\ttrue\twest\tfalse\n1929\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t15\tup\tfalse\twest\ttrue\n1930\tfire\tnorth\tfalse\tsouth\ttrue\teast\ttrue\tage\t15\tup\tfalse\twest\tfalse\n1931\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t15\tup\ttrue\twest\ttrue\n1932\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t15\tup\ttrue\twest\tfalse\n1933\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t15\tup\tfalse\twest\ttrue\n1934\tfire\tnorth\tfalse\tsouth\tfalse\teast\ttrue\tage\t15\tup\tfalse\twest\tfalse\n1935\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t15\tup\ttrue\twest\ttrue\n1936\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t15\tup\ttrue\twest\tfalse\n1937\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t15\tup\tfalse\twest\ttrue\n1938\tfire\tnorth\ttrue\tsouth\ttrue\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n1939\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t15\tup\ttrue\twest\ttrue\n1940\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t15\tup\ttrue\twest\tfalse\n1941\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\ttrue\n1942\tfire\tnorth\ttrue\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n1943\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t15\tup\ttrue\twest\ttrue\n1944\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t15\tup\ttrue\twest\tfalse\n1945\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t15\tup\tfalse\twest\ttrue\n1946\tfire\tnorth\tfalse\tsouth\ttrue\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n1947\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\ttrue\twest\ttrue\n1948\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\ttrue\twest\tfalse\n1949\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\ttrue\n1950\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n1951\tspawner\n1952\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n1953\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n1954\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n1955\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n1956\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n1957\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n1958\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n1959\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n1960\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n1961\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n1962\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n1963\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n1964\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n1965\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n1966\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n1967\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n1968\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n1969\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n1970\toak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n1971\toak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n1972\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n1973\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n1974\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n1975\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n1976\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n1977\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n1978\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n1979\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n1980\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n1981\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n1982\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n1983\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n1984\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n1985\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n1986\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n1987\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n1988\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n1989\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n1990\toak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n1991\toak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n1992\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n1993\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n1994\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n1995\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n1996\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n1997\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n1998\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n1999\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n2000\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n2001\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n2002\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n2003\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n2004\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n2005\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n2006\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n2007\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n2008\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n2009\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n2010\toak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n2011\toak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n2012\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n2013\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n2014\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n2015\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n2016\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n2017\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n2018\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n2019\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n2020\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n2021\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n2022\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n2023\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n2024\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n2025\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n2026\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n2027\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n2028\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n2029\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n2030\toak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n2031\toak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n2032\tchest\tfacing\tnorth\twaterlogged\ttrue\ttype\tsingle\n2033\tchest\tfacing\tnorth\twaterlogged\tfalse\ttype\tsingle\n2034\tchest\tfacing\tnorth\twaterlogged\ttrue\ttype\tleft\n2035\tchest\tfacing\tnorth\twaterlogged\tfalse\ttype\tleft\n2036\tchest\tfacing\tnorth\twaterlogged\ttrue\ttype\tright\n2037\tchest\tfacing\tnorth\twaterlogged\tfalse\ttype\tright\n2038\tchest\tfacing\tsouth\twaterlogged\ttrue\ttype\tsingle\n2039\tchest\tfacing\tsouth\twaterlogged\tfalse\ttype\tsingle\n2040\tchest\tfacing\tsouth\twaterlogged\ttrue\ttype\tleft\n2041\tchest\tfacing\tsouth\twaterlogged\tfalse\ttype\tleft\n2042\tchest\tfacing\tsouth\twaterlogged\ttrue\ttype\tright\n2043\tchest\tfacing\tsouth\twaterlogged\tfalse\ttype\tright\n2044\tchest\tfacing\twest\twaterlogged\ttrue\ttype\tsingle\n2045\tchest\tfacing\twest\twaterlogged\tfalse\ttype\tsingle\n2046\tchest\tfacing\twest\twaterlogged\ttrue\ttype\tleft\n2047\tchest\tfacing\twest\twaterlogged\tfalse\ttype\tleft\n2048\tchest\tfacing\twest\twaterlogged\ttrue\ttype\tright\n2049\tchest\tfacing\twest\twaterlogged\tfalse\ttype\tright\n2050\tchest\tfacing\teast\twaterlogged\ttrue\ttype\tsingle\n2051\tchest\tfacing\teast\twaterlogged\tfalse\ttype\tsingle\n2052\tchest\tfacing\teast\twaterlogged\ttrue\ttype\tleft\n2053\tchest\tfacing\teast\twaterlogged\tfalse\ttype\tleft\n2054\tchest\tfacing\teast\twaterlogged\ttrue\ttype\tright\n2055\tchest\tfacing\teast\twaterlogged\tfalse\ttype\tright\n2056\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t0\twest\tup\n2057\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t0\twest\tside\n2058\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t0\twest\tnone\n2059\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t0\twest\tup\n2060\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t0\twest\tside\n2061\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t0\twest\tnone\n2062\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t0\twest\tup\n2063\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t0\twest\tside\n2064\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t0\twest\tnone\n2065\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t1\twest\tup\n2066\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t1\twest\tside\n2067\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t1\twest\tnone\n2068\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t1\twest\tup\n2069\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t1\twest\tside\n2070\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t1\twest\tnone\n2071\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t1\twest\tup\n2072\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t1\twest\tside\n2073\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t1\twest\tnone\n2074\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t2\twest\tup\n2075\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t2\twest\tside\n2076\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t2\twest\tnone\n2077\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t2\twest\tup\n2078\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t2\twest\tside\n2079\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t2\twest\tnone\n2080\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t2\twest\tup\n2081\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t2\twest\tside\n2082\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t2\twest\tnone\n2083\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t3\twest\tup\n2084\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t3\twest\tside\n2085\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t3\twest\tnone\n2086\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t3\twest\tup\n2087\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t3\twest\tside\n2088\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t3\twest\tnone\n2089\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t3\twest\tup\n2090\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t3\twest\tside\n2091\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t3\twest\tnone\n2092\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t4\twest\tup\n2093\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t4\twest\tside\n2094\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t4\twest\tnone\n2095\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t4\twest\tup\n2096\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t4\twest\tside\n2097\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t4\twest\tnone\n2098\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t4\twest\tup\n2099\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t4\twest\tside\n2100\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t4\twest\tnone\n2101\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t5\twest\tup\n2102\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t5\twest\tside\n2103\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t5\twest\tnone\n2104\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t5\twest\tup\n2105\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t5\twest\tside\n2106\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t5\twest\tnone\n2107\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t5\twest\tup\n2108\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t5\twest\tside\n2109\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t5\twest\tnone\n2110\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t6\twest\tup\n2111\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t6\twest\tside\n2112\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t6\twest\tnone\n2113\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t6\twest\tup\n2114\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t6\twest\tside\n2115\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t6\twest\tnone\n2116\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t6\twest\tup\n2117\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t6\twest\tside\n2118\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t6\twest\tnone\n2119\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t7\twest\tup\n2120\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t7\twest\tside\n2121\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t7\twest\tnone\n2122\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t7\twest\tup\n2123\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t7\twest\tside\n2124\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t7\twest\tnone\n2125\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t7\twest\tup\n2126\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t7\twest\tside\n2127\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t7\twest\tnone\n2128\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t8\twest\tup\n2129\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t8\twest\tside\n2130\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t8\twest\tnone\n2131\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t8\twest\tup\n2132\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t8\twest\tside\n2133\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t8\twest\tnone\n2134\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t8\twest\tup\n2135\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t8\twest\tside\n2136\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t8\twest\tnone\n2137\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t9\twest\tup\n2138\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t9\twest\tside\n2139\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t9\twest\tnone\n2140\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t9\twest\tup\n2141\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t9\twest\tside\n2142\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t9\twest\tnone\n2143\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t9\twest\tup\n2144\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t9\twest\tside\n2145\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t9\twest\tnone\n2146\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t10\twest\tup\n2147\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t10\twest\tside\n2148\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t10\twest\tnone\n2149\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t10\twest\tup\n2150\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t10\twest\tside\n2151\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t10\twest\tnone\n2152\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t10\twest\tup\n2153\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t10\twest\tside\n2154\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t10\twest\tnone\n2155\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t11\twest\tup\n2156\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t11\twest\tside\n2157\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t11\twest\tnone\n2158\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t11\twest\tup\n2159\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t11\twest\tside\n2160\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t11\twest\tnone\n2161\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t11\twest\tup\n2162\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t11\twest\tside\n2163\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t11\twest\tnone\n2164\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t12\twest\tup\n2165\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t12\twest\tside\n2166\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t12\twest\tnone\n2167\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t12\twest\tup\n2168\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t12\twest\tside\n2169\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t12\twest\tnone\n2170\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t12\twest\tup\n2171\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t12\twest\tside\n2172\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t12\twest\tnone\n2173\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t13\twest\tup\n2174\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t13\twest\tside\n2175\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t13\twest\tnone\n2176\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t13\twest\tup\n2177\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t13\twest\tside\n2178\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t13\twest\tnone\n2179\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t13\twest\tup\n2180\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t13\twest\tside\n2181\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t13\twest\tnone\n2182\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t14\twest\tup\n2183\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t14\twest\tside\n2184\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t14\twest\tnone\n2185\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t14\twest\tup\n2186\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t14\twest\tside\n2187\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t14\twest\tnone\n2188\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t14\twest\tup\n2189\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t14\twest\tside\n2190\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t14\twest\tnone\n2191\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t15\twest\tup\n2192\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t15\twest\tside\n2193\tredstone_wire\tsouth\tup\teast\tup\tnorth\tup\tpower\t15\twest\tnone\n2194\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t15\twest\tup\n2195\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t15\twest\tside\n2196\tredstone_wire\tsouth\tside\teast\tup\tnorth\tup\tpower\t15\twest\tnone\n2197\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t15\twest\tup\n2198\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t15\twest\tside\n2199\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tup\tpower\t15\twest\tnone\n2200\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t0\twest\tup\n2201\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t0\twest\tside\n2202\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t0\twest\tnone\n2203\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t0\twest\tup\n2204\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t0\twest\tside\n2205\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t0\twest\tnone\n2206\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t0\twest\tup\n2207\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t0\twest\tside\n2208\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t0\twest\tnone\n2209\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t1\twest\tup\n2210\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t1\twest\tside\n2211\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t1\twest\tnone\n2212\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t1\twest\tup\n2213\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t1\twest\tside\n2214\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t1\twest\tnone\n2215\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t1\twest\tup\n2216\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t1\twest\tside\n2217\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t1\twest\tnone\n2218\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t2\twest\tup\n2219\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t2\twest\tside\n2220\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t2\twest\tnone\n2221\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t2\twest\tup\n2222\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t2\twest\tside\n2223\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t2\twest\tnone\n2224\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t2\twest\tup\n2225\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t2\twest\tside\n2226\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t2\twest\tnone\n2227\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t3\twest\tup\n2228\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t3\twest\tside\n2229\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t3\twest\tnone\n2230\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t3\twest\tup\n2231\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t3\twest\tside\n2232\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t3\twest\tnone\n2233\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t3\twest\tup\n2234\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t3\twest\tside\n2235\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t3\twest\tnone\n2236\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t4\twest\tup\n2237\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t4\twest\tside\n2238\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t4\twest\tnone\n2239\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t4\twest\tup\n2240\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t4\twest\tside\n2241\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t4\twest\tnone\n2242\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t4\twest\tup\n2243\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t4\twest\tside\n2244\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t4\twest\tnone\n2245\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t5\twest\tup\n2246\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t5\twest\tside\n2247\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t5\twest\tnone\n2248\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t5\twest\tup\n2249\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t5\twest\tside\n2250\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t5\twest\tnone\n2251\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t5\twest\tup\n2252\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t5\twest\tside\n2253\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t5\twest\tnone\n2254\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t6\twest\tup\n2255\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t6\twest\tside\n2256\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t6\twest\tnone\n2257\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t6\twest\tup\n2258\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t6\twest\tside\n2259\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t6\twest\tnone\n2260\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t6\twest\tup\n2261\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t6\twest\tside\n2262\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t6\twest\tnone\n2263\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t7\twest\tup\n2264\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t7\twest\tside\n2265\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t7\twest\tnone\n2266\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t7\twest\tup\n2267\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t7\twest\tside\n2268\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t7\twest\tnone\n2269\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t7\twest\tup\n2270\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t7\twest\tside\n2271\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t7\twest\tnone\n2272\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t8\twest\tup\n2273\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t8\twest\tside\n2274\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t8\twest\tnone\n2275\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t8\twest\tup\n2276\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t8\twest\tside\n2277\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t8\twest\tnone\n2278\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t8\twest\tup\n2279\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t8\twest\tside\n2280\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t8\twest\tnone\n2281\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t9\twest\tup\n2282\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t9\twest\tside\n2283\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t9\twest\tnone\n2284\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t9\twest\tup\n2285\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t9\twest\tside\n2286\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t9\twest\tnone\n2287\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t9\twest\tup\n2288\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t9\twest\tside\n2289\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t9\twest\tnone\n2290\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t10\twest\tup\n2291\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t10\twest\tside\n2292\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t10\twest\tnone\n2293\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t10\twest\tup\n2294\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t10\twest\tside\n2295\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t10\twest\tnone\n2296\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t10\twest\tup\n2297\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t10\twest\tside\n2298\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t10\twest\tnone\n2299\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t11\twest\tup\n2300\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t11\twest\tside\n2301\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t11\twest\tnone\n2302\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t11\twest\tup\n2303\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t11\twest\tside\n2304\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t11\twest\tnone\n2305\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t11\twest\tup\n2306\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t11\twest\tside\n2307\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t11\twest\tnone\n2308\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t12\twest\tup\n2309\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t12\twest\tside\n2310\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t12\twest\tnone\n2311\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t12\twest\tup\n2312\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t12\twest\tside\n2313\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t12\twest\tnone\n2314\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t12\twest\tup\n2315\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t12\twest\tside\n2316\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t12\twest\tnone\n2317\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t13\twest\tup\n2318\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t13\twest\tside\n2319\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t13\twest\tnone\n2320\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t13\twest\tup\n2321\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t13\twest\tside\n2322\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t13\twest\tnone\n2323\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t13\twest\tup\n2324\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t13\twest\tside\n2325\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t13\twest\tnone\n2326\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t14\twest\tup\n2327\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t14\twest\tside\n2328\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t14\twest\tnone\n2329\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t14\twest\tup\n2330\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t14\twest\tside\n2331\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t14\twest\tnone\n2332\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t14\twest\tup\n2333\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t14\twest\tside\n2334\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t14\twest\tnone\n2335\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t15\twest\tup\n2336\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t15\twest\tside\n2337\tredstone_wire\tsouth\tup\teast\tup\tnorth\tside\tpower\t15\twest\tnone\n2338\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t15\twest\tup\n2339\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t15\twest\tside\n2340\tredstone_wire\tsouth\tside\teast\tup\tnorth\tside\tpower\t15\twest\tnone\n2341\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t15\twest\tup\n2342\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t15\twest\tside\n2343\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tside\tpower\t15\twest\tnone\n2344\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t0\twest\tup\n2345\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t0\twest\tside\n2346\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t0\twest\tnone\n2347\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t0\twest\tup\n2348\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t0\twest\tside\n2349\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t0\twest\tnone\n2350\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t0\twest\tup\n2351\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t0\twest\tside\n2352\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t0\twest\tnone\n2353\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t1\twest\tup\n2354\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t1\twest\tside\n2355\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t1\twest\tnone\n2356\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t1\twest\tup\n2357\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t1\twest\tside\n2358\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t1\twest\tnone\n2359\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t1\twest\tup\n2360\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t1\twest\tside\n2361\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t1\twest\tnone\n2362\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t2\twest\tup\n2363\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t2\twest\tside\n2364\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t2\twest\tnone\n2365\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t2\twest\tup\n2366\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t2\twest\tside\n2367\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t2\twest\tnone\n2368\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t2\twest\tup\n2369\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t2\twest\tside\n2370\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t2\twest\tnone\n2371\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t3\twest\tup\n2372\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t3\twest\tside\n2373\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t3\twest\tnone\n2374\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t3\twest\tup\n2375\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t3\twest\tside\n2376\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t3\twest\tnone\n2377\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t3\twest\tup\n2378\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t3\twest\tside\n2379\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t3\twest\tnone\n2380\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t4\twest\tup\n2381\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t4\twest\tside\n2382\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t4\twest\tnone\n2383\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t4\twest\tup\n2384\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t4\twest\tside\n2385\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t4\twest\tnone\n2386\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t4\twest\tup\n2387\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t4\twest\tside\n2388\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t4\twest\tnone\n2389\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t5\twest\tup\n2390\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t5\twest\tside\n2391\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t5\twest\tnone\n2392\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t5\twest\tup\n2393\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t5\twest\tside\n2394\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t5\twest\tnone\n2395\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t5\twest\tup\n2396\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t5\twest\tside\n2397\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t5\twest\tnone\n2398\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t6\twest\tup\n2399\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t6\twest\tside\n2400\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t6\twest\tnone\n2401\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t6\twest\tup\n2402\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t6\twest\tside\n2403\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t6\twest\tnone\n2404\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t6\twest\tup\n2405\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t6\twest\tside\n2406\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t6\twest\tnone\n2407\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t7\twest\tup\n2408\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t7\twest\tside\n2409\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t7\twest\tnone\n2410\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t7\twest\tup\n2411\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t7\twest\tside\n2412\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t7\twest\tnone\n2413\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t7\twest\tup\n2414\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t7\twest\tside\n2415\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t7\twest\tnone\n2416\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t8\twest\tup\n2417\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t8\twest\tside\n2418\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t8\twest\tnone\n2419\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t8\twest\tup\n2420\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t8\twest\tside\n2421\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t8\twest\tnone\n2422\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t8\twest\tup\n2423\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t8\twest\tside\n2424\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t8\twest\tnone\n2425\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t9\twest\tup\n2426\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t9\twest\tside\n2427\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t9\twest\tnone\n2428\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t9\twest\tup\n2429\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t9\twest\tside\n2430\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t9\twest\tnone\n2431\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t9\twest\tup\n2432\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t9\twest\tside\n2433\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t9\twest\tnone\n2434\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t10\twest\tup\n2435\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t10\twest\tside\n2436\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t10\twest\tnone\n2437\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t10\twest\tup\n2438\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t10\twest\tside\n2439\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t10\twest\tnone\n2440\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t10\twest\tup\n2441\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t10\twest\tside\n2442\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t10\twest\tnone\n2443\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t11\twest\tup\n2444\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t11\twest\tside\n2445\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t11\twest\tnone\n2446\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t11\twest\tup\n2447\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t11\twest\tside\n2448\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t11\twest\tnone\n2449\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t11\twest\tup\n2450\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t11\twest\tside\n2451\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t11\twest\tnone\n2452\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t12\twest\tup\n2453\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t12\twest\tside\n2454\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t12\twest\tnone\n2455\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t12\twest\tup\n2456\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t12\twest\tside\n2457\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t12\twest\tnone\n2458\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t12\twest\tup\n2459\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t12\twest\tside\n2460\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t12\twest\tnone\n2461\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t13\twest\tup\n2462\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t13\twest\tside\n2463\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t13\twest\tnone\n2464\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t13\twest\tup\n2465\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t13\twest\tside\n2466\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t13\twest\tnone\n2467\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t13\twest\tup\n2468\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t13\twest\tside\n2469\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t13\twest\tnone\n2470\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t14\twest\tup\n2471\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t14\twest\tside\n2472\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t14\twest\tnone\n2473\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t14\twest\tup\n2474\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t14\twest\tside\n2475\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t14\twest\tnone\n2476\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t14\twest\tup\n2477\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t14\twest\tside\n2478\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t14\twest\tnone\n2479\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t15\twest\tup\n2480\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t15\twest\tside\n2481\tredstone_wire\tsouth\tup\teast\tup\tnorth\tnone\tpower\t15\twest\tnone\n2482\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t15\twest\tup\n2483\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t15\twest\tside\n2484\tredstone_wire\tsouth\tside\teast\tup\tnorth\tnone\tpower\t15\twest\tnone\n2485\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t15\twest\tup\n2486\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t15\twest\tside\n2487\tredstone_wire\tsouth\tnone\teast\tup\tnorth\tnone\tpower\t15\twest\tnone\n2488\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t0\twest\tup\n2489\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t0\twest\tside\n2490\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t0\twest\tnone\n2491\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t0\twest\tup\n2492\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t0\twest\tside\n2493\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t0\twest\tnone\n2494\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t0\twest\tup\n2495\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t0\twest\tside\n2496\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t0\twest\tnone\n2497\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t1\twest\tup\n2498\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t1\twest\tside\n2499\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t1\twest\tnone\n2500\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t1\twest\tup\n2501\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t1\twest\tside\n2502\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t1\twest\tnone\n2503\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t1\twest\tup\n2504\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t1\twest\tside\n2505\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t1\twest\tnone\n2506\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t2\twest\tup\n2507\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t2\twest\tside\n2508\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t2\twest\tnone\n2509\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t2\twest\tup\n2510\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t2\twest\tside\n2511\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t2\twest\tnone\n2512\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t2\twest\tup\n2513\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t2\twest\tside\n2514\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t2\twest\tnone\n2515\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t3\twest\tup\n2516\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t3\twest\tside\n2517\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t3\twest\tnone\n2518\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t3\twest\tup\n2519\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t3\twest\tside\n2520\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t3\twest\tnone\n2521\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t3\twest\tup\n2522\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t3\twest\tside\n2523\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t3\twest\tnone\n2524\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t4\twest\tup\n2525\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t4\twest\tside\n2526\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t4\twest\tnone\n2527\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t4\twest\tup\n2528\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t4\twest\tside\n2529\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t4\twest\tnone\n2530\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t4\twest\tup\n2531\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t4\twest\tside\n2532\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t4\twest\tnone\n2533\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t5\twest\tup\n2534\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t5\twest\tside\n2535\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t5\twest\tnone\n2536\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t5\twest\tup\n2537\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t5\twest\tside\n2538\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t5\twest\tnone\n2539\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t5\twest\tup\n2540\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t5\twest\tside\n2541\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t5\twest\tnone\n2542\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t6\twest\tup\n2543\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t6\twest\tside\n2544\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t6\twest\tnone\n2545\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t6\twest\tup\n2546\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t6\twest\tside\n2547\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t6\twest\tnone\n2548\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t6\twest\tup\n2549\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t6\twest\tside\n2550\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t6\twest\tnone\n2551\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t7\twest\tup\n2552\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t7\twest\tside\n2553\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t7\twest\tnone\n2554\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t7\twest\tup\n2555\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t7\twest\tside\n2556\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t7\twest\tnone\n2557\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t7\twest\tup\n2558\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t7\twest\tside\n2559\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t7\twest\tnone\n2560\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t8\twest\tup\n2561\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t8\twest\tside\n2562\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t8\twest\tnone\n2563\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t8\twest\tup\n2564\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t8\twest\tside\n2565\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t8\twest\tnone\n2566\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t8\twest\tup\n2567\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t8\twest\tside\n2568\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t8\twest\tnone\n2569\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t9\twest\tup\n2570\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t9\twest\tside\n2571\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t9\twest\tnone\n2572\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t9\twest\tup\n2573\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t9\twest\tside\n2574\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t9\twest\tnone\n2575\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t9\twest\tup\n2576\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t9\twest\tside\n2577\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t9\twest\tnone\n2578\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t10\twest\tup\n2579\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t10\twest\tside\n2580\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t10\twest\tnone\n2581\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t10\twest\tup\n2582\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t10\twest\tside\n2583\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t10\twest\tnone\n2584\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t10\twest\tup\n2585\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t10\twest\tside\n2586\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t10\twest\tnone\n2587\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t11\twest\tup\n2588\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t11\twest\tside\n2589\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t11\twest\tnone\n2590\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t11\twest\tup\n2591\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t11\twest\tside\n2592\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t11\twest\tnone\n2593\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t11\twest\tup\n2594\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t11\twest\tside\n2595\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t11\twest\tnone\n2596\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t12\twest\tup\n2597\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t12\twest\tside\n2598\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t12\twest\tnone\n2599\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t12\twest\tup\n2600\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t12\twest\tside\n2601\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t12\twest\tnone\n2602\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t12\twest\tup\n2603\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t12\twest\tside\n2604\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t12\twest\tnone\n2605\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t13\twest\tup\n2606\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t13\twest\tside\n2607\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t13\twest\tnone\n2608\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t13\twest\tup\n2609\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t13\twest\tside\n2610\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t13\twest\tnone\n2611\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t13\twest\tup\n2612\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t13\twest\tside\n2613\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t13\twest\tnone\n2614\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t14\twest\tup\n2615\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t14\twest\tside\n2616\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t14\twest\tnone\n2617\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t14\twest\tup\n2618\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t14\twest\tside\n2619\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t14\twest\tnone\n2620\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t14\twest\tup\n2621\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t14\twest\tside\n2622\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t14\twest\tnone\n2623\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t15\twest\tup\n2624\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t15\twest\tside\n2625\tredstone_wire\tsouth\tup\teast\tside\tnorth\tup\tpower\t15\twest\tnone\n2626\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t15\twest\tup\n2627\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t15\twest\tside\n2628\tredstone_wire\tsouth\tside\teast\tside\tnorth\tup\tpower\t15\twest\tnone\n2629\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t15\twest\tup\n2630\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t15\twest\tside\n2631\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tup\tpower\t15\twest\tnone\n2632\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t0\twest\tup\n2633\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t0\twest\tside\n2634\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t0\twest\tnone\n2635\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t0\twest\tup\n2636\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t0\twest\tside\n2637\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t0\twest\tnone\n2638\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t0\twest\tup\n2639\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t0\twest\tside\n2640\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t0\twest\tnone\n2641\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t1\twest\tup\n2642\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t1\twest\tside\n2643\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t1\twest\tnone\n2644\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t1\twest\tup\n2645\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t1\twest\tside\n2646\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t1\twest\tnone\n2647\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t1\twest\tup\n2648\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t1\twest\tside\n2649\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t1\twest\tnone\n2650\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t2\twest\tup\n2651\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t2\twest\tside\n2652\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t2\twest\tnone\n2653\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t2\twest\tup\n2654\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t2\twest\tside\n2655\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t2\twest\tnone\n2656\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t2\twest\tup\n2657\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t2\twest\tside\n2658\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t2\twest\tnone\n2659\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t3\twest\tup\n2660\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t3\twest\tside\n2661\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t3\twest\tnone\n2662\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t3\twest\tup\n2663\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t3\twest\tside\n2664\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t3\twest\tnone\n2665\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t3\twest\tup\n2666\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t3\twest\tside\n2667\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t3\twest\tnone\n2668\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t4\twest\tup\n2669\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t4\twest\tside\n2670\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t4\twest\tnone\n2671\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t4\twest\tup\n2672\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t4\twest\tside\n2673\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t4\twest\tnone\n2674\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t4\twest\tup\n2675\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t4\twest\tside\n2676\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t4\twest\tnone\n2677\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t5\twest\tup\n2678\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t5\twest\tside\n2679\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t5\twest\tnone\n2680\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t5\twest\tup\n2681\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t5\twest\tside\n2682\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t5\twest\tnone\n2683\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t5\twest\tup\n2684\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t5\twest\tside\n2685\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t5\twest\tnone\n2686\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t6\twest\tup\n2687\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t6\twest\tside\n2688\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t6\twest\tnone\n2689\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t6\twest\tup\n2690\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t6\twest\tside\n2691\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t6\twest\tnone\n2692\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t6\twest\tup\n2693\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t6\twest\tside\n2694\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t6\twest\tnone\n2695\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t7\twest\tup\n2696\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t7\twest\tside\n2697\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t7\twest\tnone\n2698\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t7\twest\tup\n2699\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t7\twest\tside\n2700\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t7\twest\tnone\n2701\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t7\twest\tup\n2702\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t7\twest\tside\n2703\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t7\twest\tnone\n2704\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t8\twest\tup\n2705\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t8\twest\tside\n2706\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t8\twest\tnone\n2707\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t8\twest\tup\n2708\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t8\twest\tside\n2709\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t8\twest\tnone\n2710\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t8\twest\tup\n2711\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t8\twest\tside\n2712\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t8\twest\tnone\n2713\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t9\twest\tup\n2714\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t9\twest\tside\n2715\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t9\twest\tnone\n2716\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t9\twest\tup\n2717\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t9\twest\tside\n2718\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t9\twest\tnone\n2719\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t9\twest\tup\n2720\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t9\twest\tside\n2721\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t9\twest\tnone\n2722\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t10\twest\tup\n2723\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t10\twest\tside\n2724\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t10\twest\tnone\n2725\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t10\twest\tup\n2726\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t10\twest\tside\n2727\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t10\twest\tnone\n2728\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t10\twest\tup\n2729\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t10\twest\tside\n2730\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t10\twest\tnone\n2731\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t11\twest\tup\n2732\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t11\twest\tside\n2733\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t11\twest\tnone\n2734\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t11\twest\tup\n2735\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t11\twest\tside\n2736\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t11\twest\tnone\n2737\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t11\twest\tup\n2738\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t11\twest\tside\n2739\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t11\twest\tnone\n2740\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t12\twest\tup\n2741\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t12\twest\tside\n2742\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t12\twest\tnone\n2743\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t12\twest\tup\n2744\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t12\twest\tside\n2745\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t12\twest\tnone\n2746\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t12\twest\tup\n2747\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t12\twest\tside\n2748\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t12\twest\tnone\n2749\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t13\twest\tup\n2750\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t13\twest\tside\n2751\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t13\twest\tnone\n2752\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t13\twest\tup\n2753\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t13\twest\tside\n2754\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t13\twest\tnone\n2755\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t13\twest\tup\n2756\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t13\twest\tside\n2757\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t13\twest\tnone\n2758\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t14\twest\tup\n2759\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t14\twest\tside\n2760\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t14\twest\tnone\n2761\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t14\twest\tup\n2762\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t14\twest\tside\n2763\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t14\twest\tnone\n2764\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t14\twest\tup\n2765\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t14\twest\tside\n2766\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t14\twest\tnone\n2767\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t15\twest\tup\n2768\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t15\twest\tside\n2769\tredstone_wire\tsouth\tup\teast\tside\tnorth\tside\tpower\t15\twest\tnone\n2770\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t15\twest\tup\n2771\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t15\twest\tside\n2772\tredstone_wire\tsouth\tside\teast\tside\tnorth\tside\tpower\t15\twest\tnone\n2773\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t15\twest\tup\n2774\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t15\twest\tside\n2775\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tside\tpower\t15\twest\tnone\n2776\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t0\twest\tup\n2777\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t0\twest\tside\n2778\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t0\twest\tnone\n2779\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t0\twest\tup\n2780\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t0\twest\tside\n2781\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t0\twest\tnone\n2782\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t0\twest\tup\n2783\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t0\twest\tside\n2784\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t0\twest\tnone\n2785\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t1\twest\tup\n2786\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t1\twest\tside\n2787\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t1\twest\tnone\n2788\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t1\twest\tup\n2789\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t1\twest\tside\n2790\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t1\twest\tnone\n2791\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t1\twest\tup\n2792\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t1\twest\tside\n2793\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t1\twest\tnone\n2794\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t2\twest\tup\n2795\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t2\twest\tside\n2796\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t2\twest\tnone\n2797\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t2\twest\tup\n2798\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t2\twest\tside\n2799\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t2\twest\tnone\n2800\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t2\twest\tup\n2801\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t2\twest\tside\n2802\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t2\twest\tnone\n2803\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t3\twest\tup\n2804\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t3\twest\tside\n2805\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t3\twest\tnone\n2806\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t3\twest\tup\n2807\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t3\twest\tside\n2808\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t3\twest\tnone\n2809\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t3\twest\tup\n2810\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t3\twest\tside\n2811\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t3\twest\tnone\n2812\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t4\twest\tup\n2813\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t4\twest\tside\n2814\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t4\twest\tnone\n2815\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t4\twest\tup\n2816\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t4\twest\tside\n2817\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t4\twest\tnone\n2818\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t4\twest\tup\n2819\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t4\twest\tside\n2820\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t4\twest\tnone\n2821\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t5\twest\tup\n2822\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t5\twest\tside\n2823\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t5\twest\tnone\n2824\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t5\twest\tup\n2825\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t5\twest\tside\n2826\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t5\twest\tnone\n2827\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t5\twest\tup\n2828\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t5\twest\tside\n2829\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t5\twest\tnone\n2830\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t6\twest\tup\n2831\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t6\twest\tside\n2832\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t6\twest\tnone\n2833\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t6\twest\tup\n2834\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t6\twest\tside\n2835\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t6\twest\tnone\n2836\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t6\twest\tup\n2837\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t6\twest\tside\n2838\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t6\twest\tnone\n2839\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t7\twest\tup\n2840\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t7\twest\tside\n2841\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t7\twest\tnone\n2842\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t7\twest\tup\n2843\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t7\twest\tside\n2844\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t7\twest\tnone\n2845\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t7\twest\tup\n2846\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t7\twest\tside\n2847\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t7\twest\tnone\n2848\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t8\twest\tup\n2849\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t8\twest\tside\n2850\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t8\twest\tnone\n2851\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t8\twest\tup\n2852\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t8\twest\tside\n2853\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t8\twest\tnone\n2854\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t8\twest\tup\n2855\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t8\twest\tside\n2856\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t8\twest\tnone\n2857\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t9\twest\tup\n2858\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t9\twest\tside\n2859\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t9\twest\tnone\n2860\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t9\twest\tup\n2861\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t9\twest\tside\n2862\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t9\twest\tnone\n2863\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t9\twest\tup\n2864\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t9\twest\tside\n2865\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t9\twest\tnone\n2866\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t10\twest\tup\n2867\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t10\twest\tside\n2868\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t10\twest\tnone\n2869\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t10\twest\tup\n2870\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t10\twest\tside\n2871\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t10\twest\tnone\n2872\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t10\twest\tup\n2873\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t10\twest\tside\n2874\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t10\twest\tnone\n2875\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t11\twest\tup\n2876\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t11\twest\tside\n2877\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t11\twest\tnone\n2878\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t11\twest\tup\n2879\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t11\twest\tside\n2880\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t11\twest\tnone\n2881\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t11\twest\tup\n2882\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t11\twest\tside\n2883\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t11\twest\tnone\n2884\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t12\twest\tup\n2885\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t12\twest\tside\n2886\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t12\twest\tnone\n2887\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t12\twest\tup\n2888\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t12\twest\tside\n2889\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t12\twest\tnone\n2890\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t12\twest\tup\n2891\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t12\twest\tside\n2892\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t12\twest\tnone\n2893\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t13\twest\tup\n2894\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t13\twest\tside\n2895\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t13\twest\tnone\n2896\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t13\twest\tup\n2897\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t13\twest\tside\n2898\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t13\twest\tnone\n2899\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t13\twest\tup\n2900\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t13\twest\tside\n2901\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t13\twest\tnone\n2902\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t14\twest\tup\n2903\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t14\twest\tside\n2904\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t14\twest\tnone\n2905\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t14\twest\tup\n2906\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t14\twest\tside\n2907\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t14\twest\tnone\n2908\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t14\twest\tup\n2909\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t14\twest\tside\n2910\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t14\twest\tnone\n2911\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t15\twest\tup\n2912\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t15\twest\tside\n2913\tredstone_wire\tsouth\tup\teast\tside\tnorth\tnone\tpower\t15\twest\tnone\n2914\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t15\twest\tup\n2915\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t15\twest\tside\n2916\tredstone_wire\tsouth\tside\teast\tside\tnorth\tnone\tpower\t15\twest\tnone\n2917\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t15\twest\tup\n2918\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t15\twest\tside\n2919\tredstone_wire\tsouth\tnone\teast\tside\tnorth\tnone\tpower\t15\twest\tnone\n2920\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t0\twest\tup\n2921\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t0\twest\tside\n2922\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t0\twest\tnone\n2923\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t0\twest\tup\n2924\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t0\twest\tside\n2925\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t0\twest\tnone\n2926\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t0\twest\tup\n2927\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t0\twest\tside\n2928\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t0\twest\tnone\n2929\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t1\twest\tup\n2930\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t1\twest\tside\n2931\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t1\twest\tnone\n2932\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t1\twest\tup\n2933\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t1\twest\tside\n2934\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t1\twest\tnone\n2935\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t1\twest\tup\n2936\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t1\twest\tside\n2937\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t1\twest\tnone\n2938\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t2\twest\tup\n2939\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t2\twest\tside\n2940\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t2\twest\tnone\n2941\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t2\twest\tup\n2942\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t2\twest\tside\n2943\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t2\twest\tnone\n2944\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t2\twest\tup\n2945\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t2\twest\tside\n2946\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t2\twest\tnone\n2947\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t3\twest\tup\n2948\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t3\twest\tside\n2949\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t3\twest\tnone\n2950\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t3\twest\tup\n2951\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t3\twest\tside\n2952\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t3\twest\tnone\n2953\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t3\twest\tup\n2954\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t3\twest\tside\n2955\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t3\twest\tnone\n2956\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t4\twest\tup\n2957\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t4\twest\tside\n2958\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t4\twest\tnone\n2959\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t4\twest\tup\n2960\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t4\twest\tside\n2961\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t4\twest\tnone\n2962\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t4\twest\tup\n2963\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t4\twest\tside\n2964\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t4\twest\tnone\n2965\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t5\twest\tup\n2966\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t5\twest\tside\n2967\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t5\twest\tnone\n2968\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t5\twest\tup\n2969\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t5\twest\tside\n2970\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t5\twest\tnone\n2971\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t5\twest\tup\n2972\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t5\twest\tside\n2973\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t5\twest\tnone\n2974\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t6\twest\tup\n2975\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t6\twest\tside\n2976\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t6\twest\tnone\n2977\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t6\twest\tup\n2978\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t6\twest\tside\n2979\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t6\twest\tnone\n2980\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t6\twest\tup\n2981\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t6\twest\tside\n2982\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t6\twest\tnone\n2983\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t7\twest\tup\n2984\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t7\twest\tside\n2985\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t7\twest\tnone\n2986\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t7\twest\tup\n2987\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t7\twest\tside\n2988\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t7\twest\tnone\n2989\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t7\twest\tup\n2990\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t7\twest\tside\n2991\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t7\twest\tnone\n2992\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t8\twest\tup\n2993\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t8\twest\tside\n2994\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t8\twest\tnone\n2995\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t8\twest\tup\n2996\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t8\twest\tside\n2997\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t8\twest\tnone\n2998\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t8\twest\tup\n2999\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t8\twest\tside\n3000\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t8\twest\tnone\n3001\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t9\twest\tup\n3002\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t9\twest\tside\n3003\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t9\twest\tnone\n3004\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t9\twest\tup\n3005\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t9\twest\tside\n3006\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t9\twest\tnone\n3007\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t9\twest\tup\n3008\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t9\twest\tside\n3009\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t9\twest\tnone\n3010\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t10\twest\tup\n3011\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t10\twest\tside\n3012\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t10\twest\tnone\n3013\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t10\twest\tup\n3014\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t10\twest\tside\n3015\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t10\twest\tnone\n3016\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t10\twest\tup\n3017\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t10\twest\tside\n3018\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t10\twest\tnone\n3019\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t11\twest\tup\n3020\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t11\twest\tside\n3021\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t11\twest\tnone\n3022\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t11\twest\tup\n3023\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t11\twest\tside\n3024\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t11\twest\tnone\n3025\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t11\twest\tup\n3026\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t11\twest\tside\n3027\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t11\twest\tnone\n3028\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t12\twest\tup\n3029\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t12\twest\tside\n3030\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t12\twest\tnone\n3031\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t12\twest\tup\n3032\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t12\twest\tside\n3033\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t12\twest\tnone\n3034\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t12\twest\tup\n3035\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t12\twest\tside\n3036\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t12\twest\tnone\n3037\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t13\twest\tup\n3038\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t13\twest\tside\n3039\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t13\twest\tnone\n3040\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t13\twest\tup\n3041\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t13\twest\tside\n3042\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t13\twest\tnone\n3043\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t13\twest\tup\n3044\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t13\twest\tside\n3045\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t13\twest\tnone\n3046\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t14\twest\tup\n3047\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t14\twest\tside\n3048\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t14\twest\tnone\n3049\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t14\twest\tup\n3050\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t14\twest\tside\n3051\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t14\twest\tnone\n3052\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t14\twest\tup\n3053\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t14\twest\tside\n3054\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t14\twest\tnone\n3055\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t15\twest\tup\n3056\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t15\twest\tside\n3057\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tup\tpower\t15\twest\tnone\n3058\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t15\twest\tup\n3059\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t15\twest\tside\n3060\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tup\tpower\t15\twest\tnone\n3061\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t15\twest\tup\n3062\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t15\twest\tside\n3063\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tup\tpower\t15\twest\tnone\n3064\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t0\twest\tup\n3065\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t0\twest\tside\n3066\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t0\twest\tnone\n3067\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t0\twest\tup\n3068\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t0\twest\tside\n3069\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t0\twest\tnone\n3070\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t0\twest\tup\n3071\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t0\twest\tside\n3072\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t0\twest\tnone\n3073\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t1\twest\tup\n3074\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t1\twest\tside\n3075\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t1\twest\tnone\n3076\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t1\twest\tup\n3077\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t1\twest\tside\n3078\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t1\twest\tnone\n3079\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t1\twest\tup\n3080\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t1\twest\tside\n3081\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t1\twest\tnone\n3082\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t2\twest\tup\n3083\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t2\twest\tside\n3084\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t2\twest\tnone\n3085\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t2\twest\tup\n3086\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t2\twest\tside\n3087\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t2\twest\tnone\n3088\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t2\twest\tup\n3089\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t2\twest\tside\n3090\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t2\twest\tnone\n3091\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t3\twest\tup\n3092\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t3\twest\tside\n3093\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t3\twest\tnone\n3094\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t3\twest\tup\n3095\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t3\twest\tside\n3096\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t3\twest\tnone\n3097\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t3\twest\tup\n3098\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t3\twest\tside\n3099\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t3\twest\tnone\n3100\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t4\twest\tup\n3101\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t4\twest\tside\n3102\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t4\twest\tnone\n3103\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t4\twest\tup\n3104\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t4\twest\tside\n3105\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t4\twest\tnone\n3106\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t4\twest\tup\n3107\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t4\twest\tside\n3108\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t4\twest\tnone\n3109\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t5\twest\tup\n3110\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t5\twest\tside\n3111\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t5\twest\tnone\n3112\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t5\twest\tup\n3113\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t5\twest\tside\n3114\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t5\twest\tnone\n3115\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t5\twest\tup\n3116\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t5\twest\tside\n3117\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t5\twest\tnone\n3118\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t6\twest\tup\n3119\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t6\twest\tside\n3120\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t6\twest\tnone\n3121\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t6\twest\tup\n3122\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t6\twest\tside\n3123\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t6\twest\tnone\n3124\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t6\twest\tup\n3125\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t6\twest\tside\n3126\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t6\twest\tnone\n3127\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t7\twest\tup\n3128\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t7\twest\tside\n3129\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t7\twest\tnone\n3130\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t7\twest\tup\n3131\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t7\twest\tside\n3132\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t7\twest\tnone\n3133\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t7\twest\tup\n3134\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t7\twest\tside\n3135\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t7\twest\tnone\n3136\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t8\twest\tup\n3137\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t8\twest\tside\n3138\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t8\twest\tnone\n3139\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t8\twest\tup\n3140\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t8\twest\tside\n3141\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t8\twest\tnone\n3142\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t8\twest\tup\n3143\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t8\twest\tside\n3144\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t8\twest\tnone\n3145\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t9\twest\tup\n3146\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t9\twest\tside\n3147\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t9\twest\tnone\n3148\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t9\twest\tup\n3149\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t9\twest\tside\n3150\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t9\twest\tnone\n3151\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t9\twest\tup\n3152\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t9\twest\tside\n3153\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t9\twest\tnone\n3154\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t10\twest\tup\n3155\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t10\twest\tside\n3156\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t10\twest\tnone\n3157\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t10\twest\tup\n3158\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t10\twest\tside\n3159\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t10\twest\tnone\n3160\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t10\twest\tup\n3161\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t10\twest\tside\n3162\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t10\twest\tnone\n3163\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t11\twest\tup\n3164\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t11\twest\tside\n3165\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t11\twest\tnone\n3166\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t11\twest\tup\n3167\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t11\twest\tside\n3168\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t11\twest\tnone\n3169\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t11\twest\tup\n3170\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t11\twest\tside\n3171\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t11\twest\tnone\n3172\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t12\twest\tup\n3173\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t12\twest\tside\n3174\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t12\twest\tnone\n3175\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t12\twest\tup\n3176\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t12\twest\tside\n3177\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t12\twest\tnone\n3178\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t12\twest\tup\n3179\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t12\twest\tside\n3180\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t12\twest\tnone\n3181\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t13\twest\tup\n3182\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t13\twest\tside\n3183\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t13\twest\tnone\n3184\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t13\twest\tup\n3185\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t13\twest\tside\n3186\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t13\twest\tnone\n3187\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t13\twest\tup\n3188\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t13\twest\tside\n3189\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t13\twest\tnone\n3190\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t14\twest\tup\n3191\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t14\twest\tside\n3192\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t14\twest\tnone\n3193\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t14\twest\tup\n3194\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t14\twest\tside\n3195\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t14\twest\tnone\n3196\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t14\twest\tup\n3197\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t14\twest\tside\n3198\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t14\twest\tnone\n3199\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t15\twest\tup\n3200\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t15\twest\tside\n3201\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tside\tpower\t15\twest\tnone\n3202\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t15\twest\tup\n3203\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t15\twest\tside\n3204\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tside\tpower\t15\twest\tnone\n3205\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t15\twest\tup\n3206\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t15\twest\tside\n3207\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tside\tpower\t15\twest\tnone\n3208\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t0\twest\tup\n3209\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t0\twest\tside\n3210\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t0\twest\tnone\n3211\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t0\twest\tup\n3212\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t0\twest\tside\n3213\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t0\twest\tnone\n3214\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t0\twest\tup\n3215\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t0\twest\tside\n3216\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t0\twest\tnone\n3217\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t1\twest\tup\n3218\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t1\twest\tside\n3219\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t1\twest\tnone\n3220\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t1\twest\tup\n3221\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t1\twest\tside\n3222\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t1\twest\tnone\n3223\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t1\twest\tup\n3224\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t1\twest\tside\n3225\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t1\twest\tnone\n3226\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t2\twest\tup\n3227\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t2\twest\tside\n3228\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t2\twest\tnone\n3229\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t2\twest\tup\n3230\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t2\twest\tside\n3231\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t2\twest\tnone\n3232\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t2\twest\tup\n3233\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t2\twest\tside\n3234\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t2\twest\tnone\n3235\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t3\twest\tup\n3236\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t3\twest\tside\n3237\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t3\twest\tnone\n3238\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t3\twest\tup\n3239\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t3\twest\tside\n3240\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t3\twest\tnone\n3241\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t3\twest\tup\n3242\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t3\twest\tside\n3243\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t3\twest\tnone\n3244\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t4\twest\tup\n3245\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t4\twest\tside\n3246\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t4\twest\tnone\n3247\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t4\twest\tup\n3248\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t4\twest\tside\n3249\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t4\twest\tnone\n3250\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t4\twest\tup\n3251\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t4\twest\tside\n3252\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t4\twest\tnone\n3253\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t5\twest\tup\n3254\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t5\twest\tside\n3255\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t5\twest\tnone\n3256\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t5\twest\tup\n3257\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t5\twest\tside\n3258\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t5\twest\tnone\n3259\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t5\twest\tup\n3260\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t5\twest\tside\n3261\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t5\twest\tnone\n3262\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t6\twest\tup\n3263\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t6\twest\tside\n3264\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t6\twest\tnone\n3265\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t6\twest\tup\n3266\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t6\twest\tside\n3267\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t6\twest\tnone\n3268\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t6\twest\tup\n3269\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t6\twest\tside\n3270\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t6\twest\tnone\n3271\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t7\twest\tup\n3272\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t7\twest\tside\n3273\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t7\twest\tnone\n3274\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t7\twest\tup\n3275\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t7\twest\tside\n3276\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t7\twest\tnone\n3277\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t7\twest\tup\n3278\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t7\twest\tside\n3279\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t7\twest\tnone\n3280\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t8\twest\tup\n3281\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t8\twest\tside\n3282\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t8\twest\tnone\n3283\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t8\twest\tup\n3284\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t8\twest\tside\n3285\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t8\twest\tnone\n3286\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t8\twest\tup\n3287\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t8\twest\tside\n3288\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t8\twest\tnone\n3289\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t9\twest\tup\n3290\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t9\twest\tside\n3291\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t9\twest\tnone\n3292\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t9\twest\tup\n3293\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t9\twest\tside\n3294\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t9\twest\tnone\n3295\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t9\twest\tup\n3296\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t9\twest\tside\n3297\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t9\twest\tnone\n3298\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t10\twest\tup\n3299\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t10\twest\tside\n3300\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t10\twest\tnone\n3301\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t10\twest\tup\n3302\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t10\twest\tside\n3303\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t10\twest\tnone\n3304\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t10\twest\tup\n3305\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t10\twest\tside\n3306\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t10\twest\tnone\n3307\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t11\twest\tup\n3308\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t11\twest\tside\n3309\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t11\twest\tnone\n3310\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t11\twest\tup\n3311\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t11\twest\tside\n3312\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t11\twest\tnone\n3313\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t11\twest\tup\n3314\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t11\twest\tside\n3315\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t11\twest\tnone\n3316\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t12\twest\tup\n3317\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t12\twest\tside\n3318\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t12\twest\tnone\n3319\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t12\twest\tup\n3320\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t12\twest\tside\n3321\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t12\twest\tnone\n3322\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t12\twest\tup\n3323\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t12\twest\tside\n3324\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t12\twest\tnone\n3325\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t13\twest\tup\n3326\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t13\twest\tside\n3327\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t13\twest\tnone\n3328\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t13\twest\tup\n3329\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t13\twest\tside\n3330\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t13\twest\tnone\n3331\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t13\twest\tup\n3332\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t13\twest\tside\n3333\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t13\twest\tnone\n3334\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t14\twest\tup\n3335\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t14\twest\tside\n3336\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t14\twest\tnone\n3337\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t14\twest\tup\n3338\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t14\twest\tside\n3339\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t14\twest\tnone\n3340\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t14\twest\tup\n3341\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t14\twest\tside\n3342\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t14\twest\tnone\n3343\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t15\twest\tup\n3344\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t15\twest\tside\n3345\tredstone_wire\tsouth\tup\teast\tnone\tnorth\tnone\tpower\t15\twest\tnone\n3346\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t15\twest\tup\n3347\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t15\twest\tside\n3348\tredstone_wire\tsouth\tside\teast\tnone\tnorth\tnone\tpower\t15\twest\tnone\n3349\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t15\twest\tup\n3350\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t15\twest\tside\n3351\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t15\twest\tnone\n3352\tdiamond_ore\n3353\tdiamond_block\n3354\tcrafting_table\n3355\twheat\tage\t0\n3356\twheat\tage\t1\n3357\twheat\tage\t2\n3358\twheat\tage\t3\n3359\twheat\tage\t4\n3360\twheat\tage\t5\n3361\twheat\tage\t6\n3362\twheat\tage\t7\n3363\tfarmland\tmoisture\t0\n3364\tfarmland\tmoisture\t1\n3365\tfarmland\tmoisture\t2\n3366\tfarmland\tmoisture\t3\n3367\tfarmland\tmoisture\t4\n3368\tfarmland\tmoisture\t5\n3369\tfarmland\tmoisture\t6\n3370\tfarmland\tmoisture\t7\n3371\tfurnace\tfacing\tnorth\tlit\ttrue\n3372\tfurnace\tfacing\tnorth\tlit\tfalse\n3373\tfurnace\tfacing\tsouth\tlit\ttrue\n3374\tfurnace\tfacing\tsouth\tlit\tfalse\n3375\tfurnace\tfacing\twest\tlit\ttrue\n3376\tfurnace\tfacing\twest\tlit\tfalse\n3377\tfurnace\tfacing\teast\tlit\ttrue\n3378\tfurnace\tfacing\teast\tlit\tfalse\n3379\toak_sign\twaterlogged\ttrue\trotation\t0\n3380\toak_sign\twaterlogged\tfalse\trotation\t0\n3381\toak_sign\twaterlogged\ttrue\trotation\t1\n3382\toak_sign\twaterlogged\tfalse\trotation\t1\n3383\toak_sign\twaterlogged\ttrue\trotation\t2\n3384\toak_sign\twaterlogged\tfalse\trotation\t2\n3385\toak_sign\twaterlogged\ttrue\trotation\t3\n3386\toak_sign\twaterlogged\tfalse\trotation\t3\n3387\toak_sign\twaterlogged\ttrue\trotation\t4\n3388\toak_sign\twaterlogged\tfalse\trotation\t4\n3389\toak_sign\twaterlogged\ttrue\trotation\t5\n3390\toak_sign\twaterlogged\tfalse\trotation\t5\n3391\toak_sign\twaterlogged\ttrue\trotation\t6\n3392\toak_sign\twaterlogged\tfalse\trotation\t6\n3393\toak_sign\twaterlogged\ttrue\trotation\t7\n3394\toak_sign\twaterlogged\tfalse\trotation\t7\n3395\toak_sign\twaterlogged\ttrue\trotation\t8\n3396\toak_sign\twaterlogged\tfalse\trotation\t8\n3397\toak_sign\twaterlogged\ttrue\trotation\t9\n3398\toak_sign\twaterlogged\tfalse\trotation\t9\n3399\toak_sign\twaterlogged\ttrue\trotation\t10\n3400\toak_sign\twaterlogged\tfalse\trotation\t10\n3401\toak_sign\twaterlogged\ttrue\trotation\t11\n3402\toak_sign\twaterlogged\tfalse\trotation\t11\n3403\toak_sign\twaterlogged\ttrue\trotation\t12\n3404\toak_sign\twaterlogged\tfalse\trotation\t12\n3405\toak_sign\twaterlogged\ttrue\trotation\t13\n3406\toak_sign\twaterlogged\tfalse\trotation\t13\n3407\toak_sign\twaterlogged\ttrue\trotation\t14\n3408\toak_sign\twaterlogged\tfalse\trotation\t14\n3409\toak_sign\twaterlogged\ttrue\trotation\t15\n3410\toak_sign\twaterlogged\tfalse\trotation\t15\n3411\tspruce_sign\twaterlogged\ttrue\trotation\t0\n3412\tspruce_sign\twaterlogged\tfalse\trotation\t0\n3413\tspruce_sign\twaterlogged\ttrue\trotation\t1\n3414\tspruce_sign\twaterlogged\tfalse\trotation\t1\n3415\tspruce_sign\twaterlogged\ttrue\trotation\t2\n3416\tspruce_sign\twaterlogged\tfalse\trotation\t2\n3417\tspruce_sign\twaterlogged\ttrue\trotation\t3\n3418\tspruce_sign\twaterlogged\tfalse\trotation\t3\n3419\tspruce_sign\twaterlogged\ttrue\trotation\t4\n3420\tspruce_sign\twaterlogged\tfalse\trotation\t4\n3421\tspruce_sign\twaterlogged\ttrue\trotation\t5\n3422\tspruce_sign\twaterlogged\tfalse\trotation\t5\n3423\tspruce_sign\twaterlogged\ttrue\trotation\t6\n3424\tspruce_sign\twaterlogged\tfalse\trotation\t6\n3425\tspruce_sign\twaterlogged\ttrue\trotation\t7\n3426\tspruce_sign\twaterlogged\tfalse\trotation\t7\n3427\tspruce_sign\twaterlogged\ttrue\trotation\t8\n3428\tspruce_sign\twaterlogged\tfalse\trotation\t8\n3429\tspruce_sign\twaterlogged\ttrue\trotation\t9\n3430\tspruce_sign\twaterlogged\tfalse\trotation\t9\n3431\tspruce_sign\twaterlogged\ttrue\trotation\t10\n3432\tspruce_sign\twaterlogged\tfalse\trotation\t10\n3433\tspruce_sign\twaterlogged\ttrue\trotation\t11\n3434\tspruce_sign\twaterlogged\tfalse\trotation\t11\n3435\tspruce_sign\twaterlogged\ttrue\trotation\t12\n3436\tspruce_sign\twaterlogged\tfalse\trotation\t12\n3437\tspruce_sign\twaterlogged\ttrue\trotation\t13\n3438\tspruce_sign\twaterlogged\tfalse\trotation\t13\n3439\tspruce_sign\twaterlogged\ttrue\trotation\t14\n3440\tspruce_sign\twaterlogged\tfalse\trotation\t14\n3441\tspruce_sign\twaterlogged\ttrue\trotation\t15\n3442\tspruce_sign\twaterlogged\tfalse\trotation\t15\n3443\tbirch_sign\twaterlogged\ttrue\trotation\t0\n3444\tbirch_sign\twaterlogged\tfalse\trotation\t0\n3445\tbirch_sign\twaterlogged\ttrue\trotation\t1\n3446\tbirch_sign\twaterlogged\tfalse\trotation\t1\n3447\tbirch_sign\twaterlogged\ttrue\trotation\t2\n3448\tbirch_sign\twaterlogged\tfalse\trotation\t2\n3449\tbirch_sign\twaterlogged\ttrue\trotation\t3\n3450\tbirch_sign\twaterlogged\tfalse\trotation\t3\n3451\tbirch_sign\twaterlogged\ttrue\trotation\t4\n3452\tbirch_sign\twaterlogged\tfalse\trotation\t4\n3453\tbirch_sign\twaterlogged\ttrue\trotation\t5\n3454\tbirch_sign\twaterlogged\tfalse\trotation\t5\n3455\tbirch_sign\twaterlogged\ttrue\trotation\t6\n3456\tbirch_sign\twaterlogged\tfalse\trotation\t6\n3457\tbirch_sign\twaterlogged\ttrue\trotation\t7\n3458\tbirch_sign\twaterlogged\tfalse\trotation\t7\n3459\tbirch_sign\twaterlogged\ttrue\trotation\t8\n3460\tbirch_sign\twaterlogged\tfalse\trotation\t8\n3461\tbirch_sign\twaterlogged\ttrue\trotation\t9\n3462\tbirch_sign\twaterlogged\tfalse\trotation\t9\n3463\tbirch_sign\twaterlogged\ttrue\trotation\t10\n3464\tbirch_sign\twaterlogged\tfalse\trotation\t10\n3465\tbirch_sign\twaterlogged\ttrue\trotation\t11\n3466\tbirch_sign\twaterlogged\tfalse\trotation\t11\n3467\tbirch_sign\twaterlogged\ttrue\trotation\t12\n3468\tbirch_sign\twaterlogged\tfalse\trotation\t12\n3469\tbirch_sign\twaterlogged\ttrue\trotation\t13\n3470\tbirch_sign\twaterlogged\tfalse\trotation\t13\n3471\tbirch_sign\twaterlogged\ttrue\trotation\t14\n3472\tbirch_sign\twaterlogged\tfalse\trotation\t14\n3473\tbirch_sign\twaterlogged\ttrue\trotation\t15\n3474\tbirch_sign\twaterlogged\tfalse\trotation\t15\n3475\tacacia_sign\twaterlogged\ttrue\trotation\t0\n3476\tacacia_sign\twaterlogged\tfalse\trotation\t0\n3477\tacacia_sign\twaterlogged\ttrue\trotation\t1\n3478\tacacia_sign\twaterlogged\tfalse\trotation\t1\n3479\tacacia_sign\twaterlogged\ttrue\trotation\t2\n3480\tacacia_sign\twaterlogged\tfalse\trotation\t2\n3481\tacacia_sign\twaterlogged\ttrue\trotation\t3\n3482\tacacia_sign\twaterlogged\tfalse\trotation\t3\n3483\tacacia_sign\twaterlogged\ttrue\trotation\t4\n3484\tacacia_sign\twaterlogged\tfalse\trotation\t4\n3485\tacacia_sign\twaterlogged\ttrue\trotation\t5\n3486\tacacia_sign\twaterlogged\tfalse\trotation\t5\n3487\tacacia_sign\twaterlogged\ttrue\trotation\t6\n3488\tacacia_sign\twaterlogged\tfalse\trotation\t6\n3489\tacacia_sign\twaterlogged\ttrue\trotation\t7\n3490\tacacia_sign\twaterlogged\tfalse\trotation\t7\n3491\tacacia_sign\twaterlogged\ttrue\trotation\t8\n3492\tacacia_sign\twaterlogged\tfalse\trotation\t8\n3493\tacacia_sign\twaterlogged\ttrue\trotation\t9\n3494\tacacia_sign\twaterlogged\tfalse\trotation\t9\n3495\tacacia_sign\twaterlogged\ttrue\trotation\t10\n3496\tacacia_sign\twaterlogged\tfalse\trotation\t10\n3497\tacacia_sign\twaterlogged\ttrue\trotation\t11\n3498\tacacia_sign\twaterlogged\tfalse\trotation\t11\n3499\tacacia_sign\twaterlogged\ttrue\trotation\t12\n3500\tacacia_sign\twaterlogged\tfalse\trotation\t12\n3501\tacacia_sign\twaterlogged\ttrue\trotation\t13\n3502\tacacia_sign\twaterlogged\tfalse\trotation\t13\n3503\tacacia_sign\twaterlogged\ttrue\trotation\t14\n3504\tacacia_sign\twaterlogged\tfalse\trotation\t14\n3505\tacacia_sign\twaterlogged\ttrue\trotation\t15\n3506\tacacia_sign\twaterlogged\tfalse\trotation\t15\n3507\tjungle_sign\twaterlogged\ttrue\trotation\t0\n3508\tjungle_sign\twaterlogged\tfalse\trotation\t0\n3509\tjungle_sign\twaterlogged\ttrue\trotation\t1\n3510\tjungle_sign\twaterlogged\tfalse\trotation\t1\n3511\tjungle_sign\twaterlogged\ttrue\trotation\t2\n3512\tjungle_sign\twaterlogged\tfalse\trotation\t2\n3513\tjungle_sign\twaterlogged\ttrue\trotation\t3\n3514\tjungle_sign\twaterlogged\tfalse\trotation\t3\n3515\tjungle_sign\twaterlogged\ttrue\trotation\t4\n3516\tjungle_sign\twaterlogged\tfalse\trotation\t4\n3517\tjungle_sign\twaterlogged\ttrue\trotation\t5\n3518\tjungle_sign\twaterlogged\tfalse\trotation\t5\n3519\tjungle_sign\twaterlogged\ttrue\trotation\t6\n3520\tjungle_sign\twaterlogged\tfalse\trotation\t6\n3521\tjungle_sign\twaterlogged\ttrue\trotation\t7\n3522\tjungle_sign\twaterlogged\tfalse\trotation\t7\n3523\tjungle_sign\twaterlogged\ttrue\trotation\t8\n3524\tjungle_sign\twaterlogged\tfalse\trotation\t8\n3525\tjungle_sign\twaterlogged\ttrue\trotation\t9\n3526\tjungle_sign\twaterlogged\tfalse\trotation\t9\n3527\tjungle_sign\twaterlogged\ttrue\trotation\t10\n3528\tjungle_sign\twaterlogged\tfalse\trotation\t10\n3529\tjungle_sign\twaterlogged\ttrue\trotation\t11\n3530\tjungle_sign\twaterlogged\tfalse\trotation\t11\n3531\tjungle_sign\twaterlogged\ttrue\trotation\t12\n3532\tjungle_sign\twaterlogged\tfalse\trotation\t12\n3533\tjungle_sign\twaterlogged\ttrue\trotation\t13\n3534\tjungle_sign\twaterlogged\tfalse\trotation\t13\n3535\tjungle_sign\twaterlogged\ttrue\trotation\t14\n3536\tjungle_sign\twaterlogged\tfalse\trotation\t14\n3537\tjungle_sign\twaterlogged\ttrue\trotation\t15\n3538\tjungle_sign\twaterlogged\tfalse\trotation\t15\n3539\tdark_oak_sign\twaterlogged\ttrue\trotation\t0\n3540\tdark_oak_sign\twaterlogged\tfalse\trotation\t0\n3541\tdark_oak_sign\twaterlogged\ttrue\trotation\t1\n3542\tdark_oak_sign\twaterlogged\tfalse\trotation\t1\n3543\tdark_oak_sign\twaterlogged\ttrue\trotation\t2\n3544\tdark_oak_sign\twaterlogged\tfalse\trotation\t2\n3545\tdark_oak_sign\twaterlogged\ttrue\trotation\t3\n3546\tdark_oak_sign\twaterlogged\tfalse\trotation\t3\n3547\tdark_oak_sign\twaterlogged\ttrue\trotation\t4\n3548\tdark_oak_sign\twaterlogged\tfalse\trotation\t4\n3549\tdark_oak_sign\twaterlogged\ttrue\trotation\t5\n3550\tdark_oak_sign\twaterlogged\tfalse\trotation\t5\n3551\tdark_oak_sign\twaterlogged\ttrue\trotation\t6\n3552\tdark_oak_sign\twaterlogged\tfalse\trotation\t6\n3553\tdark_oak_sign\twaterlogged\ttrue\trotation\t7\n3554\tdark_oak_sign\twaterlogged\tfalse\trotation\t7\n3555\tdark_oak_sign\twaterlogged\ttrue\trotation\t8\n3556\tdark_oak_sign\twaterlogged\tfalse\trotation\t8\n3557\tdark_oak_sign\twaterlogged\ttrue\trotation\t9\n3558\tdark_oak_sign\twaterlogged\tfalse\trotation\t9\n3559\tdark_oak_sign\twaterlogged\ttrue\trotation\t10\n3560\tdark_oak_sign\twaterlogged\tfalse\trotation\t10\n3561\tdark_oak_sign\twaterlogged\ttrue\trotation\t11\n3562\tdark_oak_sign\twaterlogged\tfalse\trotation\t11\n3563\tdark_oak_sign\twaterlogged\ttrue\trotation\t12\n3564\tdark_oak_sign\twaterlogged\tfalse\trotation\t12\n3565\tdark_oak_sign\twaterlogged\ttrue\trotation\t13\n3566\tdark_oak_sign\twaterlogged\tfalse\trotation\t13\n3567\tdark_oak_sign\twaterlogged\ttrue\trotation\t14\n3568\tdark_oak_sign\twaterlogged\tfalse\trotation\t14\n3569\tdark_oak_sign\twaterlogged\ttrue\trotation\t15\n3570\tdark_oak_sign\twaterlogged\tfalse\trotation\t15\n3571\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3572\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3573\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3574\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3575\toak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3576\toak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3577\toak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3578\toak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3579\toak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3580\toak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3581\toak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3582\toak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3583\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3584\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3585\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3586\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3587\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3588\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3589\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3590\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3591\toak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3592\toak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3593\toak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3594\toak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3595\toak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3596\toak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3597\toak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3598\toak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3599\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3600\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3601\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3602\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3603\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n3604\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n3605\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n3606\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n3607\toak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n3608\toak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n3609\toak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n3610\toak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n3611\toak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n3612\toak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n3613\toak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n3614\toak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n3615\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n3616\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n3617\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n3618\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n3619\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n3620\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n3621\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n3622\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n3623\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n3624\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n3625\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n3626\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n3627\toak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n3628\toak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n3629\toak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n3630\toak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n3631\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n3632\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n3633\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n3634\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n3635\tladder\tfacing\tnorth\twaterlogged\ttrue\n3636\tladder\tfacing\tnorth\twaterlogged\tfalse\n3637\tladder\tfacing\tsouth\twaterlogged\ttrue\n3638\tladder\tfacing\tsouth\twaterlogged\tfalse\n3639\tladder\tfacing\twest\twaterlogged\ttrue\n3640\tladder\tfacing\twest\twaterlogged\tfalse\n3641\tladder\tfacing\teast\twaterlogged\ttrue\n3642\tladder\tfacing\teast\twaterlogged\tfalse\n3643\trail\tshape\tnorth_south\n3644\trail\tshape\teast_west\n3645\trail\tshape\tascending_east\n3646\trail\tshape\tascending_west\n3647\trail\tshape\tascending_north\n3648\trail\tshape\tascending_south\n3649\trail\tshape\tsouth_east\n3650\trail\tshape\tsouth_west\n3651\trail\tshape\tnorth_west\n3652\trail\tshape\tnorth_east\n3653\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n3654\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n3655\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n3656\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n3657\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n3658\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n3659\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n3660\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n3661\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n3662\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n3663\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n3664\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n3665\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n3666\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n3667\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n3668\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n3669\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n3670\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n3671\tcobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n3672\tcobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n3673\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n3674\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n3675\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n3676\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n3677\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n3678\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n3679\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n3680\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n3681\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n3682\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n3683\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n3684\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n3685\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n3686\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n3687\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n3688\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n3689\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n3690\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n3691\tcobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n3692\tcobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n3693\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n3694\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n3695\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n3696\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n3697\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n3698\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n3699\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n3700\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n3701\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n3702\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n3703\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n3704\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n3705\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n3706\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n3707\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n3708\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n3709\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n3710\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n3711\tcobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n3712\tcobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n3713\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n3714\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n3715\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n3716\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n3717\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n3718\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n3719\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n3720\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n3721\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n3722\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n3723\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n3724\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n3725\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n3726\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n3727\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n3728\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n3729\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n3730\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n3731\tcobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n3732\tcobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n3733\toak_wall_sign\tfacing\tnorth\twaterlogged\ttrue\n3734\toak_wall_sign\tfacing\tnorth\twaterlogged\tfalse\n3735\toak_wall_sign\tfacing\tsouth\twaterlogged\ttrue\n3736\toak_wall_sign\tfacing\tsouth\twaterlogged\tfalse\n3737\toak_wall_sign\tfacing\twest\twaterlogged\ttrue\n3738\toak_wall_sign\tfacing\twest\twaterlogged\tfalse\n3739\toak_wall_sign\tfacing\teast\twaterlogged\ttrue\n3740\toak_wall_sign\tfacing\teast\twaterlogged\tfalse\n3741\tspruce_wall_sign\tfacing\tnorth\twaterlogged\ttrue\n3742\tspruce_wall_sign\tfacing\tnorth\twaterlogged\tfalse\n3743\tspruce_wall_sign\tfacing\tsouth\twaterlogged\ttrue\n3744\tspruce_wall_sign\tfacing\tsouth\twaterlogged\tfalse\n3745\tspruce_wall_sign\tfacing\twest\twaterlogged\ttrue\n3746\tspruce_wall_sign\tfacing\twest\twaterlogged\tfalse\n3747\tspruce_wall_sign\tfacing\teast\twaterlogged\ttrue\n3748\tspruce_wall_sign\tfacing\teast\twaterlogged\tfalse\n3749\tbirch_wall_sign\tfacing\tnorth\twaterlogged\ttrue\n3750\tbirch_wall_sign\tfacing\tnorth\twaterlogged\tfalse\n3751\tbirch_wall_sign\tfacing\tsouth\twaterlogged\ttrue\n3752\tbirch_wall_sign\tfacing\tsouth\twaterlogged\tfalse\n3753\tbirch_wall_sign\tfacing\twest\twaterlogged\ttrue\n3754\tbirch_wall_sign\tfacing\twest\twaterlogged\tfalse\n3755\tbirch_wall_sign\tfacing\teast\twaterlogged\ttrue\n3756\tbirch_wall_sign\tfacing\teast\twaterlogged\tfalse\n3757\tacacia_wall_sign\tfacing\tnorth\twaterlogged\ttrue\n3758\tacacia_wall_sign\tfacing\tnorth\twaterlogged\tfalse\n3759\tacacia_wall_sign\tfacing\tsouth\twaterlogged\ttrue\n3760\tacacia_wall_sign\tfacing\tsouth\twaterlogged\tfalse\n3761\tacacia_wall_sign\tfacing\twest\twaterlogged\ttrue\n3762\tacacia_wall_sign\tfacing\twest\twaterlogged\tfalse\n3763\tacacia_wall_sign\tfacing\teast\twaterlogged\ttrue\n3764\tacacia_wall_sign\tfacing\teast\twaterlogged\tfalse\n3765\tjungle_wall_sign\tfacing\tnorth\twaterlogged\ttrue\n3766\tjungle_wall_sign\tfacing\tnorth\twaterlogged\tfalse\n3767\tjungle_wall_sign\tfacing\tsouth\twaterlogged\ttrue\n3768\tjungle_wall_sign\tfacing\tsouth\twaterlogged\tfalse\n3769\tjungle_wall_sign\tfacing\twest\twaterlogged\ttrue\n3770\tjungle_wall_sign\tfacing\twest\twaterlogged\tfalse\n3771\tjungle_wall_sign\tfacing\teast\twaterlogged\ttrue\n3772\tjungle_wall_sign\tfacing\teast\twaterlogged\tfalse\n3773\tdark_oak_wall_sign\tfacing\tnorth\twaterlogged\ttrue\n3774\tdark_oak_wall_sign\tfacing\tnorth\twaterlogged\tfalse\n3775\tdark_oak_wall_sign\tfacing\tsouth\twaterlogged\ttrue\n3776\tdark_oak_wall_sign\tfacing\tsouth\twaterlogged\tfalse\n3777\tdark_oak_wall_sign\tfacing\twest\twaterlogged\ttrue\n3778\tdark_oak_wall_sign\tfacing\twest\twaterlogged\tfalse\n3779\tdark_oak_wall_sign\tfacing\teast\twaterlogged\ttrue\n3780\tdark_oak_wall_sign\tfacing\teast\twaterlogged\tfalse\n3781\tlever\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n3782\tlever\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n3783\tlever\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n3784\tlever\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n3785\tlever\tfacing\twest\tface\tfloor\tpowered\ttrue\n3786\tlever\tfacing\twest\tface\tfloor\tpowered\tfalse\n3787\tlever\tfacing\teast\tface\tfloor\tpowered\ttrue\n3788\tlever\tfacing\teast\tface\tfloor\tpowered\tfalse\n3789\tlever\tfacing\tnorth\tface\twall\tpowered\ttrue\n3790\tlever\tfacing\tnorth\tface\twall\tpowered\tfalse\n3791\tlever\tfacing\tsouth\tface\twall\tpowered\ttrue\n3792\tlever\tfacing\tsouth\tface\twall\tpowered\tfalse\n3793\tlever\tfacing\twest\tface\twall\tpowered\ttrue\n3794\tlever\tfacing\twest\tface\twall\tpowered\tfalse\n3795\tlever\tfacing\teast\tface\twall\tpowered\ttrue\n3796\tlever\tfacing\teast\tface\twall\tpowered\tfalse\n3797\tlever\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n3798\tlever\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n3799\tlever\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n3800\tlever\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n3801\tlever\tfacing\twest\tface\tceiling\tpowered\ttrue\n3802\tlever\tfacing\twest\tface\tceiling\tpowered\tfalse\n3803\tlever\tfacing\teast\tface\tceiling\tpowered\ttrue\n3804\tlever\tfacing\teast\tface\tceiling\tpowered\tfalse\n3805\tstone_pressure_plate\tpowered\ttrue\n3806\tstone_pressure_plate\tpowered\tfalse\n3807\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3808\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3809\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3810\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3811\tiron_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3812\tiron_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3813\tiron_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3814\tiron_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3815\tiron_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3816\tiron_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3817\tiron_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3818\tiron_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3819\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n3820\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n3821\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n3822\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n3823\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3824\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3825\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3826\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3827\tiron_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3828\tiron_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3829\tiron_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3830\tiron_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3831\tiron_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3832\tiron_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3833\tiron_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3834\tiron_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3835\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n3836\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n3837\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n3838\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n3839\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n3840\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n3841\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n3842\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n3843\tiron_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n3844\tiron_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n3845\tiron_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n3846\tiron_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n3847\tiron_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n3848\tiron_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n3849\tiron_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n3850\tiron_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n3851\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n3852\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n3853\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n3854\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n3855\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n3856\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n3857\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n3858\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n3859\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n3860\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n3861\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n3862\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n3863\tiron_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n3864\tiron_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n3865\tiron_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n3866\tiron_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n3867\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n3868\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n3869\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n3870\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n3871\toak_pressure_plate\tpowered\ttrue\n3872\toak_pressure_plate\tpowered\tfalse\n3873\tspruce_pressure_plate\tpowered\ttrue\n3874\tspruce_pressure_plate\tpowered\tfalse\n3875\tbirch_pressure_plate\tpowered\ttrue\n3876\tbirch_pressure_plate\tpowered\tfalse\n3877\tjungle_pressure_plate\tpowered\ttrue\n3878\tjungle_pressure_plate\tpowered\tfalse\n3879\tacacia_pressure_plate\tpowered\ttrue\n3880\tacacia_pressure_plate\tpowered\tfalse\n3881\tdark_oak_pressure_plate\tpowered\ttrue\n3882\tdark_oak_pressure_plate\tpowered\tfalse\n3883\tredstone_ore\tlit\ttrue\n3884\tredstone_ore\tlit\tfalse\n3885\tredstone_torch\tlit\ttrue\n3886\tredstone_torch\tlit\tfalse\n3887\tredstone_wall_torch\tfacing\tnorth\tlit\ttrue\n3888\tredstone_wall_torch\tfacing\tnorth\tlit\tfalse\n3889\tredstone_wall_torch\tfacing\tsouth\tlit\ttrue\n3890\tredstone_wall_torch\tfacing\tsouth\tlit\tfalse\n3891\tredstone_wall_torch\tfacing\twest\tlit\ttrue\n3892\tredstone_wall_torch\tfacing\twest\tlit\tfalse\n3893\tredstone_wall_torch\tfacing\teast\tlit\ttrue\n3894\tredstone_wall_torch\tfacing\teast\tlit\tfalse\n3895\tstone_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n3896\tstone_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n3897\tstone_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n3898\tstone_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n3899\tstone_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n3900\tstone_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n3901\tstone_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n3902\tstone_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n3903\tstone_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n3904\tstone_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n3905\tstone_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n3906\tstone_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n3907\tstone_button\tfacing\twest\tface\twall\tpowered\ttrue\n3908\tstone_button\tfacing\twest\tface\twall\tpowered\tfalse\n3909\tstone_button\tfacing\teast\tface\twall\tpowered\ttrue\n3910\tstone_button\tfacing\teast\tface\twall\tpowered\tfalse\n3911\tstone_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n3912\tstone_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n3913\tstone_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n3914\tstone_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n3915\tstone_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n3916\tstone_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n3917\tstone_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n3918\tstone_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n3919\tsnow\tlayers\t1\n3920\tsnow\tlayers\t2\n3921\tsnow\tlayers\t3\n3922\tsnow\tlayers\t4\n3923\tsnow\tlayers\t5\n3924\tsnow\tlayers\t6\n3925\tsnow\tlayers\t7\n3926\tsnow\tlayers\t8\n3927\tice\n3928\tsnow_block\n3929\tcactus\tage\t0\n3930\tcactus\tage\t1\n3931\tcactus\tage\t2\n3932\tcactus\tage\t3\n3933\tcactus\tage\t4\n3934\tcactus\tage\t5\n3935\tcactus\tage\t6\n3936\tcactus\tage\t7\n3937\tcactus\tage\t8\n3938\tcactus\tage\t9\n3939\tcactus\tage\t10\n3940\tcactus\tage\t11\n3941\tcactus\tage\t12\n3942\tcactus\tage\t13\n3943\tcactus\tage\t14\n3944\tcactus\tage\t15\n3945\tclay\n3946\tsugar_cane\tage\t0\n3947\tsugar_cane\tage\t1\n3948\tsugar_cane\tage\t2\n3949\tsugar_cane\tage\t3\n3950\tsugar_cane\tage\t4\n3951\tsugar_cane\tage\t5\n3952\tsugar_cane\tage\t6\n3953\tsugar_cane\tage\t7\n3954\tsugar_cane\tage\t8\n3955\tsugar_cane\tage\t9\n3956\tsugar_cane\tage\t10\n3957\tsugar_cane\tage\t11\n3958\tsugar_cane\tage\t12\n3959\tsugar_cane\tage\t13\n3960\tsugar_cane\tage\t14\n3961\tsugar_cane\tage\t15\n3962\tjukebox\thas_record\ttrue\n3963\tjukebox\thas_record\tfalse\n3964\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n3965\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n3966\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n3967\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n3968\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n3969\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n3970\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n3971\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n3972\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n3973\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n3974\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n3975\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n3976\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n3977\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n3978\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n3979\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n3980\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n3981\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n3982\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n3983\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n3984\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n3985\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n3986\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n3987\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n3988\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n3989\toak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n3990\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n3991\toak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n3992\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n3993\toak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n3994\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n3995\toak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n3996\tpumpkin\n3997\tnetherrack\n3998\tsoul_sand\n3999\tglowstone\n4000\tnether_portal\taxis\tx\n4001\tnether_portal\taxis\tz\n4002\tcarved_pumpkin\tfacing\tnorth\n4003\tcarved_pumpkin\tfacing\tsouth\n4004\tcarved_pumpkin\tfacing\twest\n4005\tcarved_pumpkin\tfacing\teast\n4006\tjack_o_lantern\tfacing\tnorth\n4007\tjack_o_lantern\tfacing\tsouth\n4008\tjack_o_lantern\tfacing\twest\n4009\tjack_o_lantern\tfacing\teast\n4010\tcake\tbites\t0\n4011\tcake\tbites\t1\n4012\tcake\tbites\t2\n4013\tcake\tbites\t3\n4014\tcake\tbites\t4\n4015\tcake\tbites\t5\n4016\tcake\tbites\t6\n4017\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\ttrue\tdelay\t1\n4018\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\ttrue\tdelay\t1\n4019\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n4020\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n4021\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\ttrue\tdelay\t1\n4022\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\ttrue\tdelay\t1\n4023\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n4024\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n4025\trepeater\tfacing\twest\tpowered\ttrue\tlocked\ttrue\tdelay\t1\n4026\trepeater\tfacing\twest\tpowered\tfalse\tlocked\ttrue\tdelay\t1\n4027\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n4028\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n4029\trepeater\tfacing\teast\tpowered\ttrue\tlocked\ttrue\tdelay\t1\n4030\trepeater\tfacing\teast\tpowered\tfalse\tlocked\ttrue\tdelay\t1\n4031\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n4032\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n4033\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\ttrue\tdelay\t2\n4034\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\ttrue\tdelay\t2\n4035\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n4036\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n4037\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\ttrue\tdelay\t2\n4038\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\ttrue\tdelay\t2\n4039\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n4040\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n4041\trepeater\tfacing\twest\tpowered\ttrue\tlocked\ttrue\tdelay\t2\n4042\trepeater\tfacing\twest\tpowered\tfalse\tlocked\ttrue\tdelay\t2\n4043\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n4044\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n4045\trepeater\tfacing\teast\tpowered\ttrue\tlocked\ttrue\tdelay\t2\n4046\trepeater\tfacing\teast\tpowered\tfalse\tlocked\ttrue\tdelay\t2\n4047\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n4048\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n4049\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\ttrue\tdelay\t3\n4050\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\ttrue\tdelay\t3\n4051\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n4052\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n4053\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\ttrue\tdelay\t3\n4054\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\ttrue\tdelay\t3\n4055\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n4056\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n4057\trepeater\tfacing\twest\tpowered\ttrue\tlocked\ttrue\tdelay\t3\n4058\trepeater\tfacing\twest\tpowered\tfalse\tlocked\ttrue\tdelay\t3\n4059\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n4060\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n4061\trepeater\tfacing\teast\tpowered\ttrue\tlocked\ttrue\tdelay\t3\n4062\trepeater\tfacing\teast\tpowered\tfalse\tlocked\ttrue\tdelay\t3\n4063\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n4064\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n4065\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\ttrue\tdelay\t4\n4066\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\ttrue\tdelay\t4\n4067\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n4068\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n4069\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\ttrue\tdelay\t4\n4070\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\ttrue\tdelay\t4\n4071\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n4072\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n4073\trepeater\tfacing\twest\tpowered\ttrue\tlocked\ttrue\tdelay\t4\n4074\trepeater\tfacing\twest\tpowered\tfalse\tlocked\ttrue\tdelay\t4\n4075\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n4076\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n4077\trepeater\tfacing\teast\tpowered\ttrue\tlocked\ttrue\tdelay\t4\n4078\trepeater\tfacing\teast\tpowered\tfalse\tlocked\ttrue\tdelay\t4\n4079\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n4080\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n4081\twhite_stained_glass\n4082\torange_stained_glass\n4083\tmagenta_stained_glass\n4084\tlight_blue_stained_glass\n4085\tyellow_stained_glass\n4086\tlime_stained_glass\n4087\tpink_stained_glass\n4088\tgray_stained_glass\n4089\tlight_gray_stained_glass\n4090\tcyan_stained_glass\n4091\tpurple_stained_glass\n4092\tblue_stained_glass\n4093\tbrown_stained_glass\n4094\tgreen_stained_glass\n4095\tred_stained_glass\n4096\tblack_stained_glass\n4097\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4098\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4099\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4100\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4101\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4102\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4103\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4104\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4105\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4106\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4107\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4108\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4109\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4110\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4111\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4112\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4113\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4114\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4115\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4116\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4117\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4118\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4119\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4120\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4121\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4122\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4123\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4124\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4125\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4126\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4127\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4128\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4129\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4130\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4131\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4132\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4133\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4134\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4135\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4136\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4137\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4138\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4139\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4140\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4141\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4142\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4143\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4144\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4145\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4146\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4147\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4148\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4149\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4150\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4151\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4152\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4153\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4154\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4155\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4156\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4157\toak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4158\toak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4159\toak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4160\toak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4161\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4162\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4163\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4164\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4165\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4166\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4167\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4168\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4169\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4170\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4171\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4172\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4173\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4174\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4175\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4176\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4177\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4178\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4179\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4180\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4181\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4182\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4183\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4184\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4185\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4186\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4187\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4188\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4189\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4190\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4191\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4192\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4193\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4194\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4195\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4196\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4197\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4198\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4199\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4200\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4201\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4202\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4203\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4204\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4205\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4206\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4207\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4208\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4209\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4210\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4211\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4212\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4213\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4214\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4215\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4216\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4217\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4218\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4219\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4220\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4221\tspruce_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4222\tspruce_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4223\tspruce_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4224\tspruce_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4225\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4226\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4227\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4228\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4229\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4230\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4231\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4232\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4233\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4234\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4235\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4236\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4237\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4238\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4239\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4240\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4241\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4242\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4243\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4244\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4245\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4246\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4247\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4248\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4249\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4250\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4251\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4252\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4253\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4254\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4255\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4256\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4257\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4258\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4259\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4260\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4261\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4262\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4263\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4264\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4265\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4266\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4267\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4268\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4269\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4270\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4271\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4272\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4273\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4274\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4275\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4276\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4277\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4278\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4279\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4280\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4281\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4282\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4283\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4284\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4285\tbirch_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4286\tbirch_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4287\tbirch_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4288\tbirch_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4289\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4290\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4291\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4292\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4293\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4294\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4295\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4296\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4297\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4298\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4299\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4300\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4301\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4302\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4303\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4304\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4305\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4306\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4307\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4308\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4309\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4310\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4311\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4312\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4313\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4314\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4315\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4316\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4317\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4318\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4319\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4320\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4321\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4322\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4323\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4324\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4325\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4326\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4327\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4328\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4329\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4330\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4331\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4332\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4333\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4334\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4335\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4336\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4337\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4338\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4339\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4340\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4341\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4342\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4343\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4344\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4345\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4346\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4347\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4348\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4349\tjungle_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4350\tjungle_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4351\tjungle_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4352\tjungle_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4353\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4354\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4355\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4356\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4357\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4358\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4359\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4360\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4361\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4362\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4363\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4364\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4365\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4366\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4367\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4368\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4369\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4370\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4371\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4372\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4373\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4374\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4375\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4376\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4377\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4378\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4379\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4380\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4381\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4382\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4383\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4384\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4385\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4386\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4387\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4388\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4389\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4390\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4391\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4392\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4393\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4394\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4395\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4396\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4397\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4398\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4399\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4400\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4401\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4402\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4403\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4404\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4405\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4406\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4407\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4408\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4409\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4410\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4411\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4412\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4413\tacacia_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4414\tacacia_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4415\tacacia_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4416\tacacia_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4417\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4418\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n4419\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4420\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n4421\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4422\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n4423\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4424\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n4425\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4426\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4427\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4428\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n4429\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4430\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4431\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4432\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n4433\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4434\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n4435\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4436\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n4437\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4438\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n4439\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4440\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n4441\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4442\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4443\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4444\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n4445\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4446\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4447\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4448\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n4449\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4450\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n4451\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4452\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n4453\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4454\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n4455\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4456\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n4457\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4458\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n4459\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4460\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n4461\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4462\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n4463\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4464\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n4465\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4466\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n4467\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4468\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n4469\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4470\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n4471\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4472\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n4473\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4474\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n4475\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4476\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n4477\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4478\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n4479\tdark_oak_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4480\tdark_oak_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n4481\tstone_bricks\n4482\tmossy_stone_bricks\n4483\tcracked_stone_bricks\n4484\tchiseled_stone_bricks\n4485\tinfested_stone\n4486\tinfested_cobblestone\n4487\tinfested_stone_bricks\n4488\tinfested_mossy_stone_bricks\n4489\tinfested_cracked_stone_bricks\n4490\tinfested_chiseled_stone_bricks\n4491\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4492\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4493\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4494\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4495\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4496\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4497\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4498\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4499\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4500\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4501\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4502\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4503\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4504\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4505\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4506\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4507\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4508\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4509\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4510\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4511\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4512\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4513\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4514\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4515\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4516\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4517\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4518\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4519\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4520\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4521\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4522\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4523\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4524\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4525\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4526\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4527\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4528\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4529\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4530\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4531\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4532\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4533\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4534\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4535\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4536\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4537\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4538\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4539\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4540\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4541\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4542\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4543\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4544\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4545\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4546\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4547\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4548\tbrown_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4549\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4550\tbrown_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4551\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4552\tbrown_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4553\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4554\tbrown_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4555\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4556\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4557\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4558\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4559\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4560\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4561\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4562\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4563\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4564\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4565\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4566\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4567\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4568\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4569\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4570\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4571\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4572\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4573\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4574\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4575\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4576\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4577\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4578\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4579\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4580\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4581\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4582\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4583\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4584\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4585\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4586\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4587\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4588\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4589\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4590\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4591\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4592\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4593\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4594\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4595\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4596\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4597\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4598\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4599\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4600\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4601\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4602\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4603\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4604\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4605\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4606\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4607\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4608\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4609\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4610\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4611\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4612\tred_mushroom_block\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4613\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4614\tred_mushroom_block\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4615\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4616\tred_mushroom_block\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4617\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4618\tred_mushroom_block\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4619\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4620\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4621\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4622\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4623\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4624\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4625\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4626\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4627\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4628\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4629\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4630\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4631\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4632\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4633\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4634\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4635\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4636\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4637\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4638\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4639\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4640\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4641\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n4642\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n4643\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4644\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4645\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4646\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4647\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4648\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4649\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n4650\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n4651\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4652\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4653\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4654\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4655\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4656\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4657\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4658\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4659\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4660\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4661\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4662\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4663\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4664\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4665\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4666\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4667\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4668\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4669\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4670\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4671\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4672\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4673\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n4674\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n4675\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4676\tmushroom_stem\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4677\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4678\tmushroom_stem\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4679\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4680\tmushroom_stem\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4681\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n4682\tmushroom_stem\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n4683\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4684\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4685\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4686\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4687\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4688\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4689\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4690\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4691\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4692\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4693\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4694\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4695\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4696\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4697\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4698\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4699\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4700\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4701\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4702\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4703\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4704\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4705\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4706\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4707\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4708\tiron_bars\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4709\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4710\tiron_bars\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4711\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4712\tiron_bars\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4713\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4714\tiron_bars\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4715\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4716\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4717\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n4718\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n4719\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4720\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4721\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n4722\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n4723\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4724\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4725\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n4726\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n4727\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4728\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4729\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n4730\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n4731\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4732\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4733\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n4734\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n4735\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4736\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4737\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n4738\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n4739\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4740\tglass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4741\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n4742\tglass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n4743\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4744\tglass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4745\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n4746\tglass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n4747\tmelon\n4748\tattached_pumpkin_stem\tfacing\tnorth\n4749\tattached_pumpkin_stem\tfacing\tsouth\n4750\tattached_pumpkin_stem\tfacing\twest\n4751\tattached_pumpkin_stem\tfacing\teast\n4752\tattached_melon_stem\tfacing\tnorth\n4753\tattached_melon_stem\tfacing\tsouth\n4754\tattached_melon_stem\tfacing\twest\n4755\tattached_melon_stem\tfacing\teast\n4756\tpumpkin_stem\tage\t0\n4757\tpumpkin_stem\tage\t1\n4758\tpumpkin_stem\tage\t2\n4759\tpumpkin_stem\tage\t3\n4760\tpumpkin_stem\tage\t4\n4761\tpumpkin_stem\tage\t5\n4762\tpumpkin_stem\tage\t6\n4763\tpumpkin_stem\tage\t7\n4764\tmelon_stem\tage\t0\n4765\tmelon_stem\tage\t1\n4766\tmelon_stem\tage\t2\n4767\tmelon_stem\tage\t3\n4768\tmelon_stem\tage\t4\n4769\tmelon_stem\tage\t5\n4770\tmelon_stem\tage\t6\n4771\tmelon_stem\tage\t7\n4772\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n4773\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n4774\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n4775\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n4776\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n4777\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n4778\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n4779\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n4780\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n4781\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n4782\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n4783\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n4784\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n4785\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n4786\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n4787\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n4788\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n4789\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n4790\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n4791\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n4792\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n4793\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n4794\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n4795\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n4796\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n4797\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n4798\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n4799\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n4800\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n4801\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n4802\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n4803\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n4804\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n4805\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n4806\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n4807\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n4808\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n4809\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n4810\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n4811\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n4812\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n4813\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n4814\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n4815\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n4816\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n4817\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n4818\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n4819\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n4820\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n4821\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n4822\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n4823\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n4824\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n4825\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n4826\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n4827\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n4828\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n4829\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n4830\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n4831\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n4832\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n4833\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n4834\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n4835\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n4836\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4837\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4838\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4839\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4840\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4841\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4842\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4843\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4844\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4845\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4846\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4847\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4848\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4849\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4850\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4851\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4852\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4853\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4854\tbrick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4855\tbrick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4856\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4857\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4858\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4859\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4860\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4861\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4862\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4863\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4864\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4865\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4866\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4867\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4868\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4869\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4870\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4871\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4872\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4873\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4874\tbrick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4875\tbrick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4876\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4877\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4878\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4879\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4880\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4881\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4882\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4883\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4884\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4885\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4886\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4887\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4888\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4889\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4890\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4891\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4892\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4893\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4894\tbrick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4895\tbrick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4896\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4897\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4898\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4899\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4900\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4901\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4902\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4903\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4904\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4905\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4906\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4907\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4908\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4909\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4910\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4911\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4912\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4913\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4914\tbrick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4915\tbrick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4916\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4917\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4918\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4919\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4920\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4921\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4922\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4923\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4924\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4925\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4926\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4927\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4928\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4929\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4930\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4931\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4932\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4933\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4934\tstone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4935\tstone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4936\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4937\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4938\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4939\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4940\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4941\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4942\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4943\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4944\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4945\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4946\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4947\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4948\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4949\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4950\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4951\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4952\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4953\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4954\tstone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4955\tstone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4956\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4957\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4958\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4959\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4960\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4961\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4962\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4963\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4964\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4965\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4966\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4967\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4968\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4969\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4970\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4971\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4972\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4973\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4974\tstone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4975\tstone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4976\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n4977\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n4978\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n4979\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n4980\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n4981\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n4982\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n4983\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n4984\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n4985\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n4986\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n4987\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n4988\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n4989\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n4990\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n4991\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n4992\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n4993\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n4994\tstone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n4995\tstone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n4996\tmycelium\tsnowy\ttrue\n4997\tmycelium\tsnowy\tfalse\n4998\tlily_pad\n4999\tnether_bricks\n5000\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5001\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5002\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n5003\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n5004\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5005\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5006\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n5007\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n5008\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5009\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5010\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n5011\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n5012\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5013\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5014\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n5015\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n5016\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5017\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5018\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n5019\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n5020\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5021\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5022\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n5023\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n5024\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5025\tnether_brick_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5026\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n5027\tnether_brick_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n5028\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5029\tnether_brick_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5030\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n5031\tnether_brick_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n5032\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5033\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5034\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5035\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5036\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5037\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5038\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5039\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5040\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5041\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5042\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5043\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5044\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5045\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5046\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5047\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5048\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5049\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5050\tnether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5051\tnether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5052\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5053\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5054\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5055\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5056\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5057\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5058\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5059\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5060\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5061\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5062\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5063\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5064\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5065\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5066\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5067\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5068\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5069\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5070\tnether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5071\tnether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5072\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5073\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5074\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5075\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5076\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5077\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5078\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5079\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5080\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5081\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5082\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5083\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5084\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5085\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5086\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5087\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5088\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5089\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5090\tnether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5091\tnether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5092\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5093\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5094\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5095\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5096\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5097\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5098\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5099\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5100\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5101\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5102\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5103\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5104\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5105\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5106\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5107\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5108\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5109\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5110\tnether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5111\tnether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5112\tnether_wart\tage\t0\n5113\tnether_wart\tage\t1\n5114\tnether_wart\tage\t2\n5115\tnether_wart\tage\t3\n5116\tenchanting_table\n5117\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\ttrue\thas_bottle_2\ttrue\n5118\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\ttrue\thas_bottle_2\tfalse\n5119\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\tfalse\thas_bottle_2\ttrue\n5120\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\tfalse\thas_bottle_2\tfalse\n5121\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\ttrue\thas_bottle_2\ttrue\n5122\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\ttrue\thas_bottle_2\tfalse\n5123\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\tfalse\thas_bottle_2\ttrue\n5124\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\tfalse\thas_bottle_2\tfalse\n5125\tcauldron\tlevel\t0\n5126\tcauldron\tlevel\t1\n5127\tcauldron\tlevel\t2\n5128\tcauldron\tlevel\t3\n5129\tend_portal\n5130\tend_portal_frame\tfacing\tnorth\teye\ttrue\n5131\tend_portal_frame\tfacing\tsouth\teye\ttrue\n5132\tend_portal_frame\tfacing\twest\teye\ttrue\n5133\tend_portal_frame\tfacing\teast\teye\ttrue\n5134\tend_portal_frame\tfacing\tnorth\teye\tfalse\n5135\tend_portal_frame\tfacing\tsouth\teye\tfalse\n5136\tend_portal_frame\tfacing\twest\teye\tfalse\n5137\tend_portal_frame\tfacing\teast\teye\tfalse\n5138\tend_stone\n5139\tdragon_egg\n5140\tredstone_lamp\tlit\ttrue\n5141\tredstone_lamp\tlit\tfalse\n5142\tcocoa\tfacing\tnorth\tage\t0\n5143\tcocoa\tfacing\tsouth\tage\t0\n5144\tcocoa\tfacing\twest\tage\t0\n5145\tcocoa\tfacing\teast\tage\t0\n5146\tcocoa\tfacing\tnorth\tage\t1\n5147\tcocoa\tfacing\tsouth\tage\t1\n5148\tcocoa\tfacing\twest\tage\t1\n5149\tcocoa\tfacing\teast\tage\t1\n5150\tcocoa\tfacing\tnorth\tage\t2\n5151\tcocoa\tfacing\tsouth\tage\t2\n5152\tcocoa\tfacing\twest\tage\t2\n5153\tcocoa\tfacing\teast\tage\t2\n5154\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5155\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5156\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5157\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5158\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5159\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5160\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5161\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5162\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5163\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5164\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5165\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5166\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5167\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5168\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5169\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5170\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5171\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5172\tsandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5173\tsandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5174\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5175\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5176\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5177\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5178\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5179\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5180\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5181\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5182\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5183\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5184\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5185\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5186\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5187\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5188\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5189\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5190\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5191\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5192\tsandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5193\tsandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5194\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5195\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5196\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5197\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5198\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5199\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5200\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5201\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5202\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5203\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5204\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5205\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5206\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5207\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5208\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5209\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5210\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5211\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5212\tsandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5213\tsandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5214\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5215\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5216\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5217\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5218\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5219\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5220\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5221\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5222\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5223\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5224\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5225\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5226\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5227\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5228\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5229\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5230\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5231\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5232\tsandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5233\tsandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5234\temerald_ore\n5235\tender_chest\tfacing\tnorth\twaterlogged\ttrue\n5236\tender_chest\tfacing\tnorth\twaterlogged\tfalse\n5237\tender_chest\tfacing\tsouth\twaterlogged\ttrue\n5238\tender_chest\tfacing\tsouth\twaterlogged\tfalse\n5239\tender_chest\tfacing\twest\twaterlogged\ttrue\n5240\tender_chest\tfacing\twest\twaterlogged\tfalse\n5241\tender_chest\tfacing\teast\twaterlogged\ttrue\n5242\tender_chest\tfacing\teast\twaterlogged\tfalse\n5243\ttripwire_hook\tattached\ttrue\tfacing\tnorth\tpowered\ttrue\n5244\ttripwire_hook\tattached\ttrue\tfacing\tnorth\tpowered\tfalse\n5245\ttripwire_hook\tattached\ttrue\tfacing\tsouth\tpowered\ttrue\n5246\ttripwire_hook\tattached\ttrue\tfacing\tsouth\tpowered\tfalse\n5247\ttripwire_hook\tattached\ttrue\tfacing\twest\tpowered\ttrue\n5248\ttripwire_hook\tattached\ttrue\tfacing\twest\tpowered\tfalse\n5249\ttripwire_hook\tattached\ttrue\tfacing\teast\tpowered\ttrue\n5250\ttripwire_hook\tattached\ttrue\tfacing\teast\tpowered\tfalse\n5251\ttripwire_hook\tattached\tfalse\tfacing\tnorth\tpowered\ttrue\n5252\ttripwire_hook\tattached\tfalse\tfacing\tnorth\tpowered\tfalse\n5253\ttripwire_hook\tattached\tfalse\tfacing\tsouth\tpowered\ttrue\n5254\ttripwire_hook\tattached\tfalse\tfacing\tsouth\tpowered\tfalse\n5255\ttripwire_hook\tattached\tfalse\tfacing\twest\tpowered\ttrue\n5256\ttripwire_hook\tattached\tfalse\tfacing\twest\tpowered\tfalse\n5257\ttripwire_hook\tattached\tfalse\tfacing\teast\tpowered\ttrue\n5258\ttripwire_hook\tattached\tfalse\tfacing\teast\tpowered\tfalse\n5259\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5260\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5261\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5262\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5263\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5264\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5265\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5266\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5267\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5268\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5269\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5270\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5271\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5272\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5273\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5274\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5275\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5276\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5277\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5278\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5279\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5280\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5281\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5282\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5283\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5284\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5285\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5286\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5287\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5288\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5289\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5290\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5291\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5292\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5293\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5294\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5295\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5296\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5297\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5298\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5299\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5300\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5301\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5302\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5303\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5304\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5305\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5306\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5307\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5308\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5309\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5310\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5311\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5312\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5313\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5314\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5315\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5316\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5317\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5318\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5319\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5320\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5321\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5322\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5323\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5324\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5325\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5326\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5327\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5328\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5329\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5330\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5331\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5332\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5333\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5334\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5335\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5336\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5337\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5338\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5339\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5340\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5341\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5342\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5343\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5344\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5345\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5346\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5347\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5348\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5349\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5350\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5351\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5352\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5353\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5354\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5355\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5356\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5357\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5358\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5359\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5360\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5361\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5362\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5363\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5364\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5365\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5366\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5367\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5368\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5369\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5370\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\ttrue\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5371\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5372\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5373\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5374\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5375\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\ttrue\n5376\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\ttrue\twest\tfalse\n5377\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\ttrue\n5378\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\ttrue\tsouth\tfalse\twest\tfalse\n5379\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5380\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5381\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5382\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5383\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\ttrue\n5384\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\ttrue\twest\tfalse\n5385\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\ttrue\n5386\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n5387\temerald_block\n5388\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5389\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5390\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5391\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5392\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5393\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5394\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5395\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5396\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5397\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5398\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5399\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5400\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5401\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5402\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5403\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5404\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5405\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5406\tspruce_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5407\tspruce_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5408\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5409\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5410\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5411\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5412\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5413\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5414\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5415\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5416\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5417\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5418\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5419\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5420\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5421\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5422\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5423\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5424\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5425\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5426\tspruce_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5427\tspruce_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5428\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5429\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5430\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5431\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5432\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5433\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5434\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5435\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5436\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5437\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5438\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5439\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5440\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5441\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5442\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5443\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5444\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5445\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5446\tspruce_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5447\tspruce_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5448\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5449\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5450\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5451\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5452\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5453\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5454\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5455\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5456\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5457\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5458\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5459\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5460\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5461\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5462\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5463\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5464\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5465\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5466\tspruce_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5467\tspruce_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5468\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5469\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5470\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5471\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5472\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5473\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5474\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5475\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5476\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5477\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5478\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5479\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5480\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5481\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5482\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5483\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5484\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5485\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5486\tbirch_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5487\tbirch_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5488\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5489\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5490\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5491\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5492\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5493\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5494\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5495\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5496\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5497\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5498\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5499\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5500\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5501\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5502\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5503\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5504\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5505\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5506\tbirch_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5507\tbirch_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5508\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5509\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5510\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5511\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5512\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5513\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5514\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5515\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5516\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5517\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5518\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5519\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5520\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5521\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5522\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5523\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5524\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5525\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5526\tbirch_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5527\tbirch_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5528\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5529\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5530\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5531\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5532\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5533\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5534\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5535\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5536\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5537\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5538\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5539\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5540\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5541\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5542\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5543\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5544\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5545\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5546\tbirch_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5547\tbirch_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5548\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5549\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5550\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5551\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5552\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5553\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5554\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5555\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5556\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5557\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5558\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5559\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5560\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5561\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5562\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5563\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5564\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5565\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5566\tjungle_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5567\tjungle_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5568\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5569\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5570\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5571\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5572\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5573\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5574\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5575\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5576\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5577\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5578\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5579\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5580\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5581\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5582\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5583\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5584\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5585\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5586\tjungle_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5587\tjungle_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5588\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5589\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5590\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5591\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5592\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5593\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5594\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5595\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5596\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5597\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5598\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5599\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5600\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5601\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5602\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5603\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5604\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5605\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5606\tjungle_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5607\tjungle_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5608\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n5609\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n5610\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n5611\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n5612\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n5613\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n5614\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n5615\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n5616\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n5617\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n5618\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n5619\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n5620\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n5621\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n5622\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n5623\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n5624\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n5625\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n5626\tjungle_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n5627\tjungle_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n5628\tcommand_block\tconditional\ttrue\tfacing\tnorth\n5629\tcommand_block\tconditional\ttrue\tfacing\teast\n5630\tcommand_block\tconditional\ttrue\tfacing\tsouth\n5631\tcommand_block\tconditional\ttrue\tfacing\twest\n5632\tcommand_block\tconditional\ttrue\tfacing\tup\n5633\tcommand_block\tconditional\ttrue\tfacing\tdown\n5634\tcommand_block\tconditional\tfalse\tfacing\tnorth\n5635\tcommand_block\tconditional\tfalse\tfacing\teast\n5636\tcommand_block\tconditional\tfalse\tfacing\tsouth\n5637\tcommand_block\tconditional\tfalse\tfacing\twest\n5638\tcommand_block\tconditional\tfalse\tfacing\tup\n5639\tcommand_block\tconditional\tfalse\tfacing\tdown\n5640\tbeacon\n5641\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5642\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5643\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5644\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5645\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5646\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5647\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5648\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5649\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5650\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5651\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5652\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5653\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5654\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5655\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5656\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5657\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5658\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5659\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5660\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5661\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5662\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5663\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5664\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5665\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5666\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5667\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5668\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5669\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5670\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5671\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5672\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5673\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5674\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5675\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5676\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5677\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5678\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5679\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5680\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5681\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5682\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5683\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5684\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5685\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5686\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5687\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5688\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5689\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5690\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5691\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5692\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5693\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5694\tcobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5695\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5696\tcobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5697\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5698\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5699\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5700\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5701\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5702\tcobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5703\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5704\tcobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5705\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5706\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5707\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5708\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5709\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5710\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5711\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5712\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5713\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5714\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5715\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n5716\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n5717\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5718\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5719\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n5720\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n5721\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5722\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5723\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5724\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5725\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5726\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5727\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5728\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5729\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5730\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5731\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n5732\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n5733\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5734\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5735\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n5736\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n5737\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5738\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5739\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5740\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5741\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5742\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5743\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5744\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5745\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5746\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5747\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n5748\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n5749\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5750\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5751\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n5752\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n5753\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5754\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5755\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5756\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5757\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5758\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5759\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5760\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5761\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5762\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5763\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n5764\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n5765\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5766\tmossy_cobblestone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5767\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n5768\tmossy_cobblestone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n5769\tflower_pot\n5770\tpotted_oak_sapling\n5771\tpotted_spruce_sapling\n5772\tpotted_birch_sapling\n5773\tpotted_jungle_sapling\n5774\tpotted_acacia_sapling\n5775\tpotted_dark_oak_sapling\n5776\tpotted_fern\n5777\tpotted_dandelion\n5778\tpotted_poppy\n5779\tpotted_blue_orchid\n5780\tpotted_allium\n5781\tpotted_azure_bluet\n5782\tpotted_red_tulip\n5783\tpotted_orange_tulip\n5784\tpotted_white_tulip\n5785\tpotted_pink_tulip\n5786\tpotted_oxeye_daisy\n5787\tpotted_cornflower\n5788\tpotted_lily_of_the_valley\n5789\tpotted_wither_rose\n5790\tpotted_red_mushroom\n5791\tpotted_brown_mushroom\n5792\tpotted_dead_bush\n5793\tpotted_cactus\n5794\tcarrots\tage\t0\n5795\tcarrots\tage\t1\n5796\tcarrots\tage\t2\n5797\tcarrots\tage\t3\n5798\tcarrots\tage\t4\n5799\tcarrots\tage\t5\n5800\tcarrots\tage\t6\n5801\tcarrots\tage\t7\n5802\tpotatoes\tage\t0\n5803\tpotatoes\tage\t1\n5804\tpotatoes\tage\t2\n5805\tpotatoes\tage\t3\n5806\tpotatoes\tage\t4\n5807\tpotatoes\tage\t5\n5808\tpotatoes\tage\t6\n5809\tpotatoes\tage\t7\n5810\toak_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5811\toak_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5812\toak_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5813\toak_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5814\toak_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5815\toak_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5816\toak_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5817\toak_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5818\toak_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5819\toak_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5820\toak_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5821\toak_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5822\toak_button\tfacing\twest\tface\twall\tpowered\ttrue\n5823\toak_button\tfacing\twest\tface\twall\tpowered\tfalse\n5824\toak_button\tfacing\teast\tface\twall\tpowered\ttrue\n5825\toak_button\tfacing\teast\tface\twall\tpowered\tfalse\n5826\toak_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5827\toak_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5828\toak_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5829\toak_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5830\toak_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5831\toak_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5832\toak_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5833\toak_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5834\tspruce_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5835\tspruce_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5836\tspruce_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5837\tspruce_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5838\tspruce_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5839\tspruce_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5840\tspruce_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5841\tspruce_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5842\tspruce_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5843\tspruce_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5844\tspruce_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5845\tspruce_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5846\tspruce_button\tfacing\twest\tface\twall\tpowered\ttrue\n5847\tspruce_button\tfacing\twest\tface\twall\tpowered\tfalse\n5848\tspruce_button\tfacing\teast\tface\twall\tpowered\ttrue\n5849\tspruce_button\tfacing\teast\tface\twall\tpowered\tfalse\n5850\tspruce_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5851\tspruce_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5852\tspruce_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5853\tspruce_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5854\tspruce_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5855\tspruce_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5856\tspruce_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5857\tspruce_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5858\tbirch_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5859\tbirch_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5860\tbirch_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5861\tbirch_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5862\tbirch_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5863\tbirch_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5864\tbirch_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5865\tbirch_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5866\tbirch_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5867\tbirch_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5868\tbirch_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5869\tbirch_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5870\tbirch_button\tfacing\twest\tface\twall\tpowered\ttrue\n5871\tbirch_button\tfacing\twest\tface\twall\tpowered\tfalse\n5872\tbirch_button\tfacing\teast\tface\twall\tpowered\ttrue\n5873\tbirch_button\tfacing\teast\tface\twall\tpowered\tfalse\n5874\tbirch_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5875\tbirch_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5876\tbirch_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5877\tbirch_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5878\tbirch_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5879\tbirch_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5880\tbirch_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5881\tbirch_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5882\tjungle_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5883\tjungle_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5884\tjungle_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5885\tjungle_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5886\tjungle_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5887\tjungle_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5888\tjungle_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5889\tjungle_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5890\tjungle_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5891\tjungle_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5892\tjungle_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5893\tjungle_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5894\tjungle_button\tfacing\twest\tface\twall\tpowered\ttrue\n5895\tjungle_button\tfacing\twest\tface\twall\tpowered\tfalse\n5896\tjungle_button\tfacing\teast\tface\twall\tpowered\ttrue\n5897\tjungle_button\tfacing\teast\tface\twall\tpowered\tfalse\n5898\tjungle_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5899\tjungle_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5900\tjungle_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5901\tjungle_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5902\tjungle_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5903\tjungle_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5904\tjungle_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5905\tjungle_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5906\tacacia_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5907\tacacia_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5908\tacacia_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5909\tacacia_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5910\tacacia_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5911\tacacia_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5912\tacacia_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5913\tacacia_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5914\tacacia_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5915\tacacia_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5916\tacacia_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5917\tacacia_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5918\tacacia_button\tfacing\twest\tface\twall\tpowered\ttrue\n5919\tacacia_button\tfacing\twest\tface\twall\tpowered\tfalse\n5920\tacacia_button\tfacing\teast\tface\twall\tpowered\ttrue\n5921\tacacia_button\tfacing\teast\tface\twall\tpowered\tfalse\n5922\tacacia_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5923\tacacia_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5924\tacacia_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5925\tacacia_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5926\tacacia_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5927\tacacia_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5928\tacacia_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5929\tacacia_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5930\tdark_oak_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n5931\tdark_oak_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n5932\tdark_oak_button\tfacing\tsouth\tface\tfloor\tpowered\ttrue\n5933\tdark_oak_button\tfacing\tsouth\tface\tfloor\tpowered\tfalse\n5934\tdark_oak_button\tfacing\twest\tface\tfloor\tpowered\ttrue\n5935\tdark_oak_button\tfacing\twest\tface\tfloor\tpowered\tfalse\n5936\tdark_oak_button\tfacing\teast\tface\tfloor\tpowered\ttrue\n5937\tdark_oak_button\tfacing\teast\tface\tfloor\tpowered\tfalse\n5938\tdark_oak_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n5939\tdark_oak_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n5940\tdark_oak_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n5941\tdark_oak_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n5942\tdark_oak_button\tfacing\twest\tface\twall\tpowered\ttrue\n5943\tdark_oak_button\tfacing\twest\tface\twall\tpowered\tfalse\n5944\tdark_oak_button\tfacing\teast\tface\twall\tpowered\ttrue\n5945\tdark_oak_button\tfacing\teast\tface\twall\tpowered\tfalse\n5946\tdark_oak_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n5947\tdark_oak_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n5948\tdark_oak_button\tfacing\tsouth\tface\tceiling\tpowered\ttrue\n5949\tdark_oak_button\tfacing\tsouth\tface\tceiling\tpowered\tfalse\n5950\tdark_oak_button\tfacing\twest\tface\tceiling\tpowered\ttrue\n5951\tdark_oak_button\tfacing\twest\tface\tceiling\tpowered\tfalse\n5952\tdark_oak_button\tfacing\teast\tface\tceiling\tpowered\ttrue\n5953\tdark_oak_button\tfacing\teast\tface\tceiling\tpowered\tfalse\n5954\tskeleton_skull\trotation\t0\n5955\tskeleton_skull\trotation\t1\n5956\tskeleton_skull\trotation\t2\n5957\tskeleton_skull\trotation\t3\n5958\tskeleton_skull\trotation\t4\n5959\tskeleton_skull\trotation\t5\n5960\tskeleton_skull\trotation\t6\n5961\tskeleton_skull\trotation\t7\n5962\tskeleton_skull\trotation\t8\n5963\tskeleton_skull\trotation\t9\n5964\tskeleton_skull\trotation\t10\n5965\tskeleton_skull\trotation\t11\n5966\tskeleton_skull\trotation\t12\n5967\tskeleton_skull\trotation\t13\n5968\tskeleton_skull\trotation\t14\n5969\tskeleton_skull\trotation\t15\n5970\tskeleton_wall_skull\tfacing\tnorth\n5971\tskeleton_wall_skull\tfacing\tsouth\n5972\tskeleton_wall_skull\tfacing\twest\n5973\tskeleton_wall_skull\tfacing\teast\n5974\twither_skeleton_skull\trotation\t0\n5975\twither_skeleton_skull\trotation\t1\n5976\twither_skeleton_skull\trotation\t2\n5977\twither_skeleton_skull\trotation\t3\n5978\twither_skeleton_skull\trotation\t4\n5979\twither_skeleton_skull\trotation\t5\n5980\twither_skeleton_skull\trotation\t6\n5981\twither_skeleton_skull\trotation\t7\n5982\twither_skeleton_skull\trotation\t8\n5983\twither_skeleton_skull\trotation\t9\n5984\twither_skeleton_skull\trotation\t10\n5985\twither_skeleton_skull\trotation\t11\n5986\twither_skeleton_skull\trotation\t12\n5987\twither_skeleton_skull\trotation\t13\n5988\twither_skeleton_skull\trotation\t14\n5989\twither_skeleton_skull\trotation\t15\n5990\twither_skeleton_wall_skull\tfacing\tnorth\n5991\twither_skeleton_wall_skull\tfacing\tsouth\n5992\twither_skeleton_wall_skull\tfacing\twest\n5993\twither_skeleton_wall_skull\tfacing\teast\n5994\tzombie_head\trotation\t0\n5995\tzombie_head\trotation\t1\n5996\tzombie_head\trotation\t2\n5997\tzombie_head\trotation\t3\n5998\tzombie_head\trotation\t4\n5999\tzombie_head\trotation\t5\n6000\tzombie_head\trotation\t6\n6001\tzombie_head\trotation\t7\n6002\tzombie_head\trotation\t8\n6003\tzombie_head\trotation\t9\n6004\tzombie_head\trotation\t10\n6005\tzombie_head\trotation\t11\n6006\tzombie_head\trotation\t12\n6007\tzombie_head\trotation\t13\n6008\tzombie_head\trotation\t14\n6009\tzombie_head\trotation\t15\n6010\tzombie_wall_head\tfacing\tnorth\n6011\tzombie_wall_head\tfacing\tsouth\n6012\tzombie_wall_head\tfacing\twest\n6013\tzombie_wall_head\tfacing\teast\n6014\tplayer_head\trotation\t0\n6015\tplayer_head\trotation\t1\n6016\tplayer_head\trotation\t2\n6017\tplayer_head\trotation\t3\n6018\tplayer_head\trotation\t4\n6019\tplayer_head\trotation\t5\n6020\tplayer_head\trotation\t6\n6021\tplayer_head\trotation\t7\n6022\tplayer_head\trotation\t8\n6023\tplayer_head\trotation\t9\n6024\tplayer_head\trotation\t10\n6025\tplayer_head\trotation\t11\n6026\tplayer_head\trotation\t12\n6027\tplayer_head\trotation\t13\n6028\tplayer_head\trotation\t14\n6029\tplayer_head\trotation\t15\n6030\tplayer_wall_head\tfacing\tnorth\n6031\tplayer_wall_head\tfacing\tsouth\n6032\tplayer_wall_head\tfacing\twest\n6033\tplayer_wall_head\tfacing\teast\n6034\tcreeper_head\trotation\t0\n6035\tcreeper_head\trotation\t1\n6036\tcreeper_head\trotation\t2\n6037\tcreeper_head\trotation\t3\n6038\tcreeper_head\trotation\t4\n6039\tcreeper_head\trotation\t5\n6040\tcreeper_head\trotation\t6\n6041\tcreeper_head\trotation\t7\n6042\tcreeper_head\trotation\t8\n6043\tcreeper_head\trotation\t9\n6044\tcreeper_head\trotation\t10\n6045\tcreeper_head\trotation\t11\n6046\tcreeper_head\trotation\t12\n6047\tcreeper_head\trotation\t13\n6048\tcreeper_head\trotation\t14\n6049\tcreeper_head\trotation\t15\n6050\tcreeper_wall_head\tfacing\tnorth\n6051\tcreeper_wall_head\tfacing\tsouth\n6052\tcreeper_wall_head\tfacing\twest\n6053\tcreeper_wall_head\tfacing\teast\n6054\tdragon_head\trotation\t0\n6055\tdragon_head\trotation\t1\n6056\tdragon_head\trotation\t2\n6057\tdragon_head\trotation\t3\n6058\tdragon_head\trotation\t4\n6059\tdragon_head\trotation\t5\n6060\tdragon_head\trotation\t6\n6061\tdragon_head\trotation\t7\n6062\tdragon_head\trotation\t8\n6063\tdragon_head\trotation\t9\n6064\tdragon_head\trotation\t10\n6065\tdragon_head\trotation\t11\n6066\tdragon_head\trotation\t12\n6067\tdragon_head\trotation\t13\n6068\tdragon_head\trotation\t14\n6069\tdragon_head\trotation\t15\n6070\tdragon_wall_head\tfacing\tnorth\n6071\tdragon_wall_head\tfacing\tsouth\n6072\tdragon_wall_head\tfacing\twest\n6073\tdragon_wall_head\tfacing\teast\n6074\tanvil\tfacing\tnorth\n6075\tanvil\tfacing\tsouth\n6076\tanvil\tfacing\twest\n6077\tanvil\tfacing\teast\n6078\tchipped_anvil\tfacing\tnorth\n6079\tchipped_anvil\tfacing\tsouth\n6080\tchipped_anvil\tfacing\twest\n6081\tchipped_anvil\tfacing\teast\n6082\tdamaged_anvil\tfacing\tnorth\n6083\tdamaged_anvil\tfacing\tsouth\n6084\tdamaged_anvil\tfacing\twest\n6085\tdamaged_anvil\tfacing\teast\n6086\ttrapped_chest\tfacing\tnorth\twaterlogged\ttrue\ttype\tsingle\n6087\ttrapped_chest\tfacing\tnorth\twaterlogged\tfalse\ttype\tsingle\n6088\ttrapped_chest\tfacing\tnorth\twaterlogged\ttrue\ttype\tleft\n6089\ttrapped_chest\tfacing\tnorth\twaterlogged\tfalse\ttype\tleft\n6090\ttrapped_chest\tfacing\tnorth\twaterlogged\ttrue\ttype\tright\n6091\ttrapped_chest\tfacing\tnorth\twaterlogged\tfalse\ttype\tright\n6092\ttrapped_chest\tfacing\tsouth\twaterlogged\ttrue\ttype\tsingle\n6093\ttrapped_chest\tfacing\tsouth\twaterlogged\tfalse\ttype\tsingle\n6094\ttrapped_chest\tfacing\tsouth\twaterlogged\ttrue\ttype\tleft\n6095\ttrapped_chest\tfacing\tsouth\twaterlogged\tfalse\ttype\tleft\n6096\ttrapped_chest\tfacing\tsouth\twaterlogged\ttrue\ttype\tright\n6097\ttrapped_chest\tfacing\tsouth\twaterlogged\tfalse\ttype\tright\n6098\ttrapped_chest\tfacing\twest\twaterlogged\ttrue\ttype\tsingle\n6099\ttrapped_chest\tfacing\twest\twaterlogged\tfalse\ttype\tsingle\n6100\ttrapped_chest\tfacing\twest\twaterlogged\ttrue\ttype\tleft\n6101\ttrapped_chest\tfacing\twest\twaterlogged\tfalse\ttype\tleft\n6102\ttrapped_chest\tfacing\twest\twaterlogged\ttrue\ttype\tright\n6103\ttrapped_chest\tfacing\twest\twaterlogged\tfalse\ttype\tright\n6104\ttrapped_chest\tfacing\teast\twaterlogged\ttrue\ttype\tsingle\n6105\ttrapped_chest\tfacing\teast\twaterlogged\tfalse\ttype\tsingle\n6106\ttrapped_chest\tfacing\teast\twaterlogged\ttrue\ttype\tleft\n6107\ttrapped_chest\tfacing\teast\twaterlogged\tfalse\ttype\tleft\n6108\ttrapped_chest\tfacing\teast\twaterlogged\ttrue\ttype\tright\n6109\ttrapped_chest\tfacing\teast\twaterlogged\tfalse\ttype\tright\n6110\tlight_weighted_pressure_plate\tpower\t0\n6111\tlight_weighted_pressure_plate\tpower\t1\n6112\tlight_weighted_pressure_plate\tpower\t2\n6113\tlight_weighted_pressure_plate\tpower\t3\n6114\tlight_weighted_pressure_plate\tpower\t4\n6115\tlight_weighted_pressure_plate\tpower\t5\n6116\tlight_weighted_pressure_plate\tpower\t6\n6117\tlight_weighted_pressure_plate\tpower\t7\n6118\tlight_weighted_pressure_plate\tpower\t8\n6119\tlight_weighted_pressure_plate\tpower\t9\n6120\tlight_weighted_pressure_plate\tpower\t10\n6121\tlight_weighted_pressure_plate\tpower\t11\n6122\tlight_weighted_pressure_plate\tpower\t12\n6123\tlight_weighted_pressure_plate\tpower\t13\n6124\tlight_weighted_pressure_plate\tpower\t14\n6125\tlight_weighted_pressure_plate\tpower\t15\n6126\theavy_weighted_pressure_plate\tpower\t0\n6127\theavy_weighted_pressure_plate\tpower\t1\n6128\theavy_weighted_pressure_plate\tpower\t2\n6129\theavy_weighted_pressure_plate\tpower\t3\n6130\theavy_weighted_pressure_plate\tpower\t4\n6131\theavy_weighted_pressure_plate\tpower\t5\n6132\theavy_weighted_pressure_plate\tpower\t6\n6133\theavy_weighted_pressure_plate\tpower\t7\n6134\theavy_weighted_pressure_plate\tpower\t8\n6135\theavy_weighted_pressure_plate\tpower\t9\n6136\theavy_weighted_pressure_plate\tpower\t10\n6137\theavy_weighted_pressure_plate\tpower\t11\n6138\theavy_weighted_pressure_plate\tpower\t12\n6139\theavy_weighted_pressure_plate\tpower\t13\n6140\theavy_weighted_pressure_plate\tpower\t14\n6141\theavy_weighted_pressure_plate\tpower\t15\n6142\tcomparator\tfacing\tnorth\tmode\tcompare\tpowered\ttrue\n6143\tcomparator\tfacing\tnorth\tmode\tcompare\tpowered\tfalse\n6144\tcomparator\tfacing\tnorth\tmode\tsubtract\tpowered\ttrue\n6145\tcomparator\tfacing\tnorth\tmode\tsubtract\tpowered\tfalse\n6146\tcomparator\tfacing\tsouth\tmode\tcompare\tpowered\ttrue\n6147\tcomparator\tfacing\tsouth\tmode\tcompare\tpowered\tfalse\n6148\tcomparator\tfacing\tsouth\tmode\tsubtract\tpowered\ttrue\n6149\tcomparator\tfacing\tsouth\tmode\tsubtract\tpowered\tfalse\n6150\tcomparator\tfacing\twest\tmode\tcompare\tpowered\ttrue\n6151\tcomparator\tfacing\twest\tmode\tcompare\tpowered\tfalse\n6152\tcomparator\tfacing\twest\tmode\tsubtract\tpowered\ttrue\n6153\tcomparator\tfacing\twest\tmode\tsubtract\tpowered\tfalse\n6154\tcomparator\tfacing\teast\tmode\tcompare\tpowered\ttrue\n6155\tcomparator\tfacing\teast\tmode\tcompare\tpowered\tfalse\n6156\tcomparator\tfacing\teast\tmode\tsubtract\tpowered\ttrue\n6157\tcomparator\tfacing\teast\tmode\tsubtract\tpowered\tfalse\n6158\tdaylight_detector\tinverted\ttrue\tpower\t0\n6159\tdaylight_detector\tinverted\ttrue\tpower\t1\n6160\tdaylight_detector\tinverted\ttrue\tpower\t2\n6161\tdaylight_detector\tinverted\ttrue\tpower\t3\n6162\tdaylight_detector\tinverted\ttrue\tpower\t4\n6163\tdaylight_detector\tinverted\ttrue\tpower\t5\n6164\tdaylight_detector\tinverted\ttrue\tpower\t6\n6165\tdaylight_detector\tinverted\ttrue\tpower\t7\n6166\tdaylight_detector\tinverted\ttrue\tpower\t8\n6167\tdaylight_detector\tinverted\ttrue\tpower\t9\n6168\tdaylight_detector\tinverted\ttrue\tpower\t10\n6169\tdaylight_detector\tinverted\ttrue\tpower\t11\n6170\tdaylight_detector\tinverted\ttrue\tpower\t12\n6171\tdaylight_detector\tinverted\ttrue\tpower\t13\n6172\tdaylight_detector\tinverted\ttrue\tpower\t14\n6173\tdaylight_detector\tinverted\ttrue\tpower\t15\n6174\tdaylight_detector\tinverted\tfalse\tpower\t0\n6175\tdaylight_detector\tinverted\tfalse\tpower\t1\n6176\tdaylight_detector\tinverted\tfalse\tpower\t2\n6177\tdaylight_detector\tinverted\tfalse\tpower\t3\n6178\tdaylight_detector\tinverted\tfalse\tpower\t4\n6179\tdaylight_detector\tinverted\tfalse\tpower\t5\n6180\tdaylight_detector\tinverted\tfalse\tpower\t6\n6181\tdaylight_detector\tinverted\tfalse\tpower\t7\n6182\tdaylight_detector\tinverted\tfalse\tpower\t8\n6183\tdaylight_detector\tinverted\tfalse\tpower\t9\n6184\tdaylight_detector\tinverted\tfalse\tpower\t10\n6185\tdaylight_detector\tinverted\tfalse\tpower\t11\n6186\tdaylight_detector\tinverted\tfalse\tpower\t12\n6187\tdaylight_detector\tinverted\tfalse\tpower\t13\n6188\tdaylight_detector\tinverted\tfalse\tpower\t14\n6189\tdaylight_detector\tinverted\tfalse\tpower\t15\n6190\tredstone_block\n6191\tnether_quartz_ore\n6192\thopper\tfacing\tdown\tenabled\ttrue\n6193\thopper\tfacing\tnorth\tenabled\ttrue\n6194\thopper\tfacing\tsouth\tenabled\ttrue\n6195\thopper\tfacing\twest\tenabled\ttrue\n6196\thopper\tfacing\teast\tenabled\ttrue\n6197\thopper\tfacing\tdown\tenabled\tfalse\n6198\thopper\tfacing\tnorth\tenabled\tfalse\n6199\thopper\tfacing\tsouth\tenabled\tfalse\n6200\thopper\tfacing\twest\tenabled\tfalse\n6201\thopper\tfacing\teast\tenabled\tfalse\n6202\tquartz_block\n6203\tchiseled_quartz_block\n6204\tquartz_pillar\taxis\tx\n6205\tquartz_pillar\taxis\ty\n6206\tquartz_pillar\taxis\tz\n6207\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6208\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6209\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6210\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6211\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6212\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6213\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6214\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6215\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6216\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6217\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6218\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6219\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6220\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6221\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6222\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6223\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6224\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6225\tquartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6226\tquartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6227\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6228\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6229\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6230\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6231\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6232\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6233\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6234\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6235\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6236\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6237\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6238\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6239\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6240\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6241\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6242\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6243\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6244\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6245\tquartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6246\tquartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6247\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6248\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6249\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6250\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6251\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6252\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6253\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6254\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6255\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6256\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6257\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6258\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6259\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6260\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6261\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6262\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6263\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6264\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6265\tquartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6266\tquartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6267\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6268\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6269\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6270\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6271\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6272\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6273\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6274\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6275\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6276\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6277\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6278\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6279\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6280\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6281\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6282\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6283\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6284\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6285\tquartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6286\tquartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6287\tactivator_rail\tshape\tnorth_south\tpowered\ttrue\n6288\tactivator_rail\tshape\teast_west\tpowered\ttrue\n6289\tactivator_rail\tshape\tascending_east\tpowered\ttrue\n6290\tactivator_rail\tshape\tascending_west\tpowered\ttrue\n6291\tactivator_rail\tshape\tascending_north\tpowered\ttrue\n6292\tactivator_rail\tshape\tascending_south\tpowered\ttrue\n6293\tactivator_rail\tshape\tnorth_south\tpowered\tfalse\n6294\tactivator_rail\tshape\teast_west\tpowered\tfalse\n6295\tactivator_rail\tshape\tascending_east\tpowered\tfalse\n6296\tactivator_rail\tshape\tascending_west\tpowered\tfalse\n6297\tactivator_rail\tshape\tascending_north\tpowered\tfalse\n6298\tactivator_rail\tshape\tascending_south\tpowered\tfalse\n6299\tdropper\tfacing\tnorth\ttriggered\ttrue\n6300\tdropper\tfacing\tnorth\ttriggered\tfalse\n6301\tdropper\tfacing\teast\ttriggered\ttrue\n6302\tdropper\tfacing\teast\ttriggered\tfalse\n6303\tdropper\tfacing\tsouth\ttriggered\ttrue\n6304\tdropper\tfacing\tsouth\ttriggered\tfalse\n6305\tdropper\tfacing\twest\ttriggered\ttrue\n6306\tdropper\tfacing\twest\ttriggered\tfalse\n6307\tdropper\tfacing\tup\ttriggered\ttrue\n6308\tdropper\tfacing\tup\ttriggered\tfalse\n6309\tdropper\tfacing\tdown\ttriggered\ttrue\n6310\tdropper\tfacing\tdown\ttriggered\tfalse\n6311\twhite_terracotta\n6312\torange_terracotta\n6313\tmagenta_terracotta\n6314\tlight_blue_terracotta\n6315\tyellow_terracotta\n6316\tlime_terracotta\n6317\tpink_terracotta\n6318\tgray_terracotta\n6319\tlight_gray_terracotta\n6320\tcyan_terracotta\n6321\tpurple_terracotta\n6322\tblue_terracotta\n6323\tbrown_terracotta\n6324\tgreen_terracotta\n6325\tred_terracotta\n6326\tblack_terracotta\n6327\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6328\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6329\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6330\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6331\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6332\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6333\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6334\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6335\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6336\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6337\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6338\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6339\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6340\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6341\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6342\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6343\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6344\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6345\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6346\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6347\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6348\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6349\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6350\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6351\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6352\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6353\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6354\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6355\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6356\twhite_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6357\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6358\twhite_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6359\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6360\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6361\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6362\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6363\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6364\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6365\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6366\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6367\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6368\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6369\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6370\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6371\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6372\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6373\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6374\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6375\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6376\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6377\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6378\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6379\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6380\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6381\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6382\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6383\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6384\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6385\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6386\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6387\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6388\torange_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6389\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6390\torange_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6391\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6392\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6393\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6394\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6395\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6396\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6397\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6398\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6399\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6400\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6401\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6402\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6403\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6404\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6405\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6406\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6407\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6408\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6409\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6410\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6411\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6412\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6413\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6414\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6415\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6416\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6417\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6418\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6419\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6420\tmagenta_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6421\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6422\tmagenta_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6423\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6424\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6425\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6426\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6427\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6428\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6429\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6430\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6431\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6432\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6433\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6434\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6435\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6436\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6437\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6438\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6439\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6440\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6441\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6442\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6443\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6444\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6445\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6446\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6447\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6448\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6449\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6450\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6451\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6452\tlight_blue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6453\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6454\tlight_blue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6455\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6456\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6457\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6458\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6459\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6460\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6461\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6462\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6463\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6464\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6465\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6466\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6467\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6468\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6469\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6470\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6471\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6472\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6473\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6474\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6475\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6476\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6477\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6478\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6479\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6480\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6481\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6482\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6483\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6484\tyellow_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6485\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6486\tyellow_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6487\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6488\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6489\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6490\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6491\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6492\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6493\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6494\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6495\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6496\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6497\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6498\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6499\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6500\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6501\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6502\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6503\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6504\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6505\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6506\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6507\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6508\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6509\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6510\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6511\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6512\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6513\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6514\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6515\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6516\tlime_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6517\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6518\tlime_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6519\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6520\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6521\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6522\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6523\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6524\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6525\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6526\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6527\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6528\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6529\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6530\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6531\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6532\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6533\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6534\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6535\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6536\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6537\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6538\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6539\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6540\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6541\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6542\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6543\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6544\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6545\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6546\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6547\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6548\tpink_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6549\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6550\tpink_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6551\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6552\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6553\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6554\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6555\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6556\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6557\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6558\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6559\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6560\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6561\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6562\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6563\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6564\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6565\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6566\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6567\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6568\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6569\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6570\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6571\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6572\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6573\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6574\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6575\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6576\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6577\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6578\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6579\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6580\tgray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6581\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6582\tgray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6583\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6584\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6585\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6586\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6587\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6588\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6589\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6590\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6591\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6592\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6593\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6594\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6595\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6596\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6597\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6598\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6599\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6600\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6601\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6602\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6603\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6604\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6605\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6606\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6607\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6608\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6609\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6610\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6611\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6612\tlight_gray_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6613\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6614\tlight_gray_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6615\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6616\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6617\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6618\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6619\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6620\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6621\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6622\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6623\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6624\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6625\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6626\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6627\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6628\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6629\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6630\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6631\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6632\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6633\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6634\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6635\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6636\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6637\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6638\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6639\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6640\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6641\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6642\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6643\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6644\tcyan_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6645\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6646\tcyan_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6647\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6648\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6649\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6650\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6651\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6652\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6653\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6654\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6655\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6656\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6657\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6658\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6659\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6660\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6661\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6662\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6663\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6664\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6665\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6666\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6667\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6668\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6669\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6670\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6671\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6672\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6673\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6674\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6675\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6676\tpurple_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6677\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6678\tpurple_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6679\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6680\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6681\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6682\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6683\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6684\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6685\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6686\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6687\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6688\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6689\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6690\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6691\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6692\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6693\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6694\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6695\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6696\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6697\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6698\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6699\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6700\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6701\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6702\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6703\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6704\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6705\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6706\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6707\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6708\tblue_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6709\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6710\tblue_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6711\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6712\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6713\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6714\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6715\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6716\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6717\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6718\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6719\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6720\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6721\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6722\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6723\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6724\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6725\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6726\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6727\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6728\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6729\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6730\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6731\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6732\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6733\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6734\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6735\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6736\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6737\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6738\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6739\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6740\tbrown_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6741\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6742\tbrown_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6743\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6744\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6745\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6746\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6747\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6748\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6749\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6750\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6751\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6752\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6753\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6754\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6755\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6756\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6757\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6758\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6759\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6760\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6761\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6762\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6763\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6764\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6765\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6766\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6767\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6768\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6769\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6770\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6771\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6772\tgreen_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6773\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6774\tgreen_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6775\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6776\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6777\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6778\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6779\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6780\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6781\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6782\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6783\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6784\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6785\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6786\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6787\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6788\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6789\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6790\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6791\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6792\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6793\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6794\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6795\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6796\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6797\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6798\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6799\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6800\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6801\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6802\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6803\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6804\tred_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6805\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6806\tred_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6807\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6808\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6809\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n6810\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n6811\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6812\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6813\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n6814\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n6815\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6816\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6817\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n6818\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n6819\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6820\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6821\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n6822\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n6823\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6824\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6825\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n6826\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n6827\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6828\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6829\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n6830\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n6831\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6832\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6833\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n6834\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n6835\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6836\tblack_stained_glass_pane\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6837\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n6838\tblack_stained_glass_pane\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n6839\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6840\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6841\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6842\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6843\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6844\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6845\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6846\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6847\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6848\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6849\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6850\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6851\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6852\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6853\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6854\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6855\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6856\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6857\tacacia_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6858\tacacia_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6859\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6860\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6861\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6862\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6863\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6864\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6865\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6866\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6867\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6868\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6869\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6870\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6871\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6872\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6873\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6874\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6875\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6876\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6877\tacacia_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6878\tacacia_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6879\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6880\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6881\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6882\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6883\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6884\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6885\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6886\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6887\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6888\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6889\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6890\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6891\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6892\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6893\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6894\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6895\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6896\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6897\tacacia_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6898\tacacia_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6899\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6900\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6901\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6902\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6903\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6904\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6905\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6906\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6907\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6908\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6909\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6910\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6911\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6912\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6913\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6914\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6915\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6916\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6917\tacacia_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6918\tacacia_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6919\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6920\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6921\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6922\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6923\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6924\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6925\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6926\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6927\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6928\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6929\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6930\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6931\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6932\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6933\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6934\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6935\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6936\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6937\tdark_oak_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6938\tdark_oak_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6939\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6940\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6941\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6942\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6943\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6944\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6945\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6946\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6947\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6948\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6949\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6950\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6951\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6952\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6953\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6954\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6955\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6956\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6957\tdark_oak_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6958\tdark_oak_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6959\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6960\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6961\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6962\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6963\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6964\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6965\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6966\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6967\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6968\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6969\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6970\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6971\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6972\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6973\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6974\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6975\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6976\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6977\tdark_oak_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6978\tdark_oak_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6979\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n6980\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n6981\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n6982\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n6983\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n6984\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n6985\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n6986\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n6987\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n6988\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n6989\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n6990\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n6991\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n6992\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n6993\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n6994\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n6995\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n6996\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n6997\tdark_oak_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n6998\tdark_oak_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n6999\tslime_block\n7000\tbarrier\n7001\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n7002\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\ttrue\n7003\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n7004\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\ttrue\n7005\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n7006\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\ttop\topen\tfalse\n7007\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n7008\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\ttop\topen\tfalse\n7009\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n7010\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\ttrue\n7011\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n7012\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\ttrue\n7013\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n7014\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tnorth\thalf\tbottom\topen\tfalse\n7015\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n7016\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tnorth\thalf\tbottom\topen\tfalse\n7017\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n7018\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\ttrue\n7019\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n7020\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\ttrue\n7021\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n7022\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\ttop\topen\tfalse\n7023\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n7024\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\ttop\topen\tfalse\n7025\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n7026\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\ttrue\n7027\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n7028\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\ttrue\n7029\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n7030\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\tsouth\thalf\tbottom\topen\tfalse\n7031\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n7032\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\tsouth\thalf\tbottom\topen\tfalse\n7033\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n7034\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\ttrue\n7035\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n7036\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\ttrue\n7037\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n7038\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\ttop\topen\tfalse\n7039\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n7040\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\ttop\topen\tfalse\n7041\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n7042\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\ttrue\n7043\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n7044\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\ttrue\n7045\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n7046\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\twest\thalf\tbottom\topen\tfalse\n7047\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n7048\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\twest\thalf\tbottom\topen\tfalse\n7049\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n7050\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\ttrue\n7051\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n7052\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\ttrue\n7053\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n7054\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\ttop\topen\tfalse\n7055\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n7056\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\ttop\topen\tfalse\n7057\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n7058\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\ttrue\n7059\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n7060\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\ttrue\n7061\tiron_trapdoor\twaterlogged\ttrue\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n7062\tiron_trapdoor\twaterlogged\tfalse\tpowered\ttrue\tfacing\teast\thalf\tbottom\topen\tfalse\n7063\tiron_trapdoor\twaterlogged\ttrue\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n7064\tiron_trapdoor\twaterlogged\tfalse\tpowered\tfalse\tfacing\teast\thalf\tbottom\topen\tfalse\n7065\tprismarine\n7066\tprismarine_bricks\n7067\tdark_prismarine\n7068\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7069\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7070\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7071\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7072\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7073\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7074\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7075\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7076\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7077\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7078\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7079\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7080\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7081\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7082\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7083\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7084\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7085\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7086\tprismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7087\tprismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7088\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7089\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7090\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7091\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7092\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7093\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7094\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7095\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7096\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7097\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7098\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7099\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7100\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7101\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7102\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7103\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7104\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7105\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7106\tprismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7107\tprismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7108\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7109\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7110\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7111\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7112\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7113\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7114\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7115\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7116\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7117\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7118\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7119\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7120\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7121\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7122\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7123\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7124\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7125\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7126\tprismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7127\tprismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7128\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7129\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7130\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7131\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7132\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7133\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7134\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7135\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7136\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7137\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7138\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7139\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7140\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7141\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7142\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7143\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7144\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7145\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7146\tprismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7147\tprismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7148\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7149\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7150\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7151\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7152\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7153\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7154\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7155\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7156\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7157\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7158\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7159\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7160\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7161\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7162\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7163\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7164\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7165\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7166\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7167\tprismarine_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7168\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7169\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7170\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7171\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7172\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7173\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7174\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7175\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7176\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7177\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7178\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7179\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7180\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7181\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7182\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7183\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7184\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7185\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7186\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7187\tprismarine_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7188\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7189\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7190\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7191\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7192\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7193\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7194\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7195\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7196\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7197\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7198\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7199\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7200\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7201\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7202\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7203\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7204\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7205\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7206\tprismarine_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7207\tprismarine_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7208\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7209\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7210\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7211\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7212\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7213\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7214\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7215\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7216\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7217\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7218\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7219\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7220\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7221\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7222\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7223\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7224\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7225\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7226\tprismarine_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7227\tprismarine_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7228\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7229\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7230\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7231\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7232\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7233\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7234\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7235\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7236\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7237\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7238\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7239\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7240\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7241\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7242\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7243\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7244\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7245\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7246\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7247\tdark_prismarine_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7248\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7249\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7250\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7251\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7252\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7253\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7254\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7255\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7256\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7257\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7258\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7259\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7260\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7261\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7262\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7263\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7264\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7265\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7266\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7267\tdark_prismarine_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7268\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7269\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7270\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7271\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7272\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7273\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7274\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7275\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7276\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7277\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7278\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7279\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7280\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7281\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7282\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7283\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7284\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7285\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7286\tdark_prismarine_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7287\tdark_prismarine_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7288\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7289\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7290\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7291\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7292\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7293\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7294\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7295\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7296\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7297\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7298\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7299\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7300\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7301\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7302\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7303\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7304\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7305\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7306\tdark_prismarine_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7307\tdark_prismarine_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7308\tprismarine_slab\ttype\ttop\twaterlogged\ttrue\n7309\tprismarine_slab\ttype\ttop\twaterlogged\tfalse\n7310\tprismarine_slab\ttype\tbottom\twaterlogged\ttrue\n7311\tprismarine_slab\ttype\tbottom\twaterlogged\tfalse\n7312\tprismarine_slab\ttype\tdouble\twaterlogged\ttrue\n7313\tprismarine_slab\ttype\tdouble\twaterlogged\tfalse\n7314\tprismarine_brick_slab\ttype\ttop\twaterlogged\ttrue\n7315\tprismarine_brick_slab\ttype\ttop\twaterlogged\tfalse\n7316\tprismarine_brick_slab\ttype\tbottom\twaterlogged\ttrue\n7317\tprismarine_brick_slab\ttype\tbottom\twaterlogged\tfalse\n7318\tprismarine_brick_slab\ttype\tdouble\twaterlogged\ttrue\n7319\tprismarine_brick_slab\ttype\tdouble\twaterlogged\tfalse\n7320\tdark_prismarine_slab\ttype\ttop\twaterlogged\ttrue\n7321\tdark_prismarine_slab\ttype\ttop\twaterlogged\tfalse\n7322\tdark_prismarine_slab\ttype\tbottom\twaterlogged\ttrue\n7323\tdark_prismarine_slab\ttype\tbottom\twaterlogged\tfalse\n7324\tdark_prismarine_slab\ttype\tdouble\twaterlogged\ttrue\n7325\tdark_prismarine_slab\ttype\tdouble\twaterlogged\tfalse\n7326\tsea_lantern\n7327\thay_block\taxis\tx\n7328\thay_block\taxis\ty\n7329\thay_block\taxis\tz\n7330\twhite_carpet\n7331\torange_carpet\n7332\tmagenta_carpet\n7333\tlight_blue_carpet\n7334\tyellow_carpet\n7335\tlime_carpet\n7336\tpink_carpet\n7337\tgray_carpet\n7338\tlight_gray_carpet\n7339\tcyan_carpet\n7340\tpurple_carpet\n7341\tblue_carpet\n7342\tbrown_carpet\n7343\tgreen_carpet\n7344\tred_carpet\n7345\tblack_carpet\n7346\tterracotta\n7347\tcoal_block\n7348\tpacked_ice\n7349\tsunflower\thalf\tupper\n7350\tsunflower\thalf\tlower\n7351\tlilac\thalf\tupper\n7352\tlilac\thalf\tlower\n7353\trose_bush\thalf\tupper\n7354\trose_bush\thalf\tlower\n7355\tpeony\thalf\tupper\n7356\tpeony\thalf\tlower\n7357\ttall_grass\thalf\tupper\n7358\ttall_grass\thalf\tlower\n7359\tlarge_fern\thalf\tupper\n7360\tlarge_fern\thalf\tlower\n7361\twhite_banner\trotation\t0\n7362\twhite_banner\trotation\t1\n7363\twhite_banner\trotation\t2\n7364\twhite_banner\trotation\t3\n7365\twhite_banner\trotation\t4\n7366\twhite_banner\trotation\t5\n7367\twhite_banner\trotation\t6\n7368\twhite_banner\trotation\t7\n7369\twhite_banner\trotation\t8\n7370\twhite_banner\trotation\t9\n7371\twhite_banner\trotation\t10\n7372\twhite_banner\trotation\t11\n7373\twhite_banner\trotation\t12\n7374\twhite_banner\trotation\t13\n7375\twhite_banner\trotation\t14\n7376\twhite_banner\trotation\t15\n7377\torange_banner\trotation\t0\n7378\torange_banner\trotation\t1\n7379\torange_banner\trotation\t2\n7380\torange_banner\trotation\t3\n7381\torange_banner\trotation\t4\n7382\torange_banner\trotation\t5\n7383\torange_banner\trotation\t6\n7384\torange_banner\trotation\t7\n7385\torange_banner\trotation\t8\n7386\torange_banner\trotation\t9\n7387\torange_banner\trotation\t10\n7388\torange_banner\trotation\t11\n7389\torange_banner\trotation\t12\n7390\torange_banner\trotation\t13\n7391\torange_banner\trotation\t14\n7392\torange_banner\trotation\t15\n7393\tmagenta_banner\trotation\t0\n7394\tmagenta_banner\trotation\t1\n7395\tmagenta_banner\trotation\t2\n7396\tmagenta_banner\trotation\t3\n7397\tmagenta_banner\trotation\t4\n7398\tmagenta_banner\trotation\t5\n7399\tmagenta_banner\trotation\t6\n7400\tmagenta_banner\trotation\t7\n7401\tmagenta_banner\trotation\t8\n7402\tmagenta_banner\trotation\t9\n7403\tmagenta_banner\trotation\t10\n7404\tmagenta_banner\trotation\t11\n7405\tmagenta_banner\trotation\t12\n7406\tmagenta_banner\trotation\t13\n7407\tmagenta_banner\trotation\t14\n7408\tmagenta_banner\trotation\t15\n7409\tlight_blue_banner\trotation\t0\n7410\tlight_blue_banner\trotation\t1\n7411\tlight_blue_banner\trotation\t2\n7412\tlight_blue_banner\trotation\t3\n7413\tlight_blue_banner\trotation\t4\n7414\tlight_blue_banner\trotation\t5\n7415\tlight_blue_banner\trotation\t6\n7416\tlight_blue_banner\trotation\t7\n7417\tlight_blue_banner\trotation\t8\n7418\tlight_blue_banner\trotation\t9\n7419\tlight_blue_banner\trotation\t10\n7420\tlight_blue_banner\trotation\t11\n7421\tlight_blue_banner\trotation\t12\n7422\tlight_blue_banner\trotation\t13\n7423\tlight_blue_banner\trotation\t14\n7424\tlight_blue_banner\trotation\t15\n7425\tyellow_banner\trotation\t0\n7426\tyellow_banner\trotation\t1\n7427\tyellow_banner\trotation\t2\n7428\tyellow_banner\trotation\t3\n7429\tyellow_banner\trotation\t4\n7430\tyellow_banner\trotation\t5\n7431\tyellow_banner\trotation\t6\n7432\tyellow_banner\trotation\t7\n7433\tyellow_banner\trotation\t8\n7434\tyellow_banner\trotation\t9\n7435\tyellow_banner\trotation\t10\n7436\tyellow_banner\trotation\t11\n7437\tyellow_banner\trotation\t12\n7438\tyellow_banner\trotation\t13\n7439\tyellow_banner\trotation\t14\n7440\tyellow_banner\trotation\t15\n7441\tlime_banner\trotation\t0\n7442\tlime_banner\trotation\t1\n7443\tlime_banner\trotation\t2\n7444\tlime_banner\trotation\t3\n7445\tlime_banner\trotation\t4\n7446\tlime_banner\trotation\t5\n7447\tlime_banner\trotation\t6\n7448\tlime_banner\trotation\t7\n7449\tlime_banner\trotation\t8\n7450\tlime_banner\trotation\t9\n7451\tlime_banner\trotation\t10\n7452\tlime_banner\trotation\t11\n7453\tlime_banner\trotation\t12\n7454\tlime_banner\trotation\t13\n7455\tlime_banner\trotation\t14\n7456\tlime_banner\trotation\t15\n7457\tpink_banner\trotation\t0\n7458\tpink_banner\trotation\t1\n7459\tpink_banner\trotation\t2\n7460\tpink_banner\trotation\t3\n7461\tpink_banner\trotation\t4\n7462\tpink_banner\trotation\t5\n7463\tpink_banner\trotation\t6\n7464\tpink_banner\trotation\t7\n7465\tpink_banner\trotation\t8\n7466\tpink_banner\trotation\t9\n7467\tpink_banner\trotation\t10\n7468\tpink_banner\trotation\t11\n7469\tpink_banner\trotation\t12\n7470\tpink_banner\trotation\t13\n7471\tpink_banner\trotation\t14\n7472\tpink_banner\trotation\t15\n7473\tgray_banner\trotation\t0\n7474\tgray_banner\trotation\t1\n7475\tgray_banner\trotation\t2\n7476\tgray_banner\trotation\t3\n7477\tgray_banner\trotation\t4\n7478\tgray_banner\trotation\t5\n7479\tgray_banner\trotation\t6\n7480\tgray_banner\trotation\t7\n7481\tgray_banner\trotation\t8\n7482\tgray_banner\trotation\t9\n7483\tgray_banner\trotation\t10\n7484\tgray_banner\trotation\t11\n7485\tgray_banner\trotation\t12\n7486\tgray_banner\trotation\t13\n7487\tgray_banner\trotation\t14\n7488\tgray_banner\trotation\t15\n7489\tlight_gray_banner\trotation\t0\n7490\tlight_gray_banner\trotation\t1\n7491\tlight_gray_banner\trotation\t2\n7492\tlight_gray_banner\trotation\t3\n7493\tlight_gray_banner\trotation\t4\n7494\tlight_gray_banner\trotation\t5\n7495\tlight_gray_banner\trotation\t6\n7496\tlight_gray_banner\trotation\t7\n7497\tlight_gray_banner\trotation\t8\n7498\tlight_gray_banner\trotation\t9\n7499\tlight_gray_banner\trotation\t10\n7500\tlight_gray_banner\trotation\t11\n7501\tlight_gray_banner\trotation\t12\n7502\tlight_gray_banner\trotation\t13\n7503\tlight_gray_banner\trotation\t14\n7504\tlight_gray_banner\trotation\t15\n7505\tcyan_banner\trotation\t0\n7506\tcyan_banner\trotation\t1\n7507\tcyan_banner\trotation\t2\n7508\tcyan_banner\trotation\t3\n7509\tcyan_banner\trotation\t4\n7510\tcyan_banner\trotation\t5\n7511\tcyan_banner\trotation\t6\n7512\tcyan_banner\trotation\t7\n7513\tcyan_banner\trotation\t8\n7514\tcyan_banner\trotation\t9\n7515\tcyan_banner\trotation\t10\n7516\tcyan_banner\trotation\t11\n7517\tcyan_banner\trotation\t12\n7518\tcyan_banner\trotation\t13\n7519\tcyan_banner\trotation\t14\n7520\tcyan_banner\trotation\t15\n7521\tpurple_banner\trotation\t0\n7522\tpurple_banner\trotation\t1\n7523\tpurple_banner\trotation\t2\n7524\tpurple_banner\trotation\t3\n7525\tpurple_banner\trotation\t4\n7526\tpurple_banner\trotation\t5\n7527\tpurple_banner\trotation\t6\n7528\tpurple_banner\trotation\t7\n7529\tpurple_banner\trotation\t8\n7530\tpurple_banner\trotation\t9\n7531\tpurple_banner\trotation\t10\n7532\tpurple_banner\trotation\t11\n7533\tpurple_banner\trotation\t12\n7534\tpurple_banner\trotation\t13\n7535\tpurple_banner\trotation\t14\n7536\tpurple_banner\trotation\t15\n7537\tblue_banner\trotation\t0\n7538\tblue_banner\trotation\t1\n7539\tblue_banner\trotation\t2\n7540\tblue_banner\trotation\t3\n7541\tblue_banner\trotation\t4\n7542\tblue_banner\trotation\t5\n7543\tblue_banner\trotation\t6\n7544\tblue_banner\trotation\t7\n7545\tblue_banner\trotation\t8\n7546\tblue_banner\trotation\t9\n7547\tblue_banner\trotation\t10\n7548\tblue_banner\trotation\t11\n7549\tblue_banner\trotation\t12\n7550\tblue_banner\trotation\t13\n7551\tblue_banner\trotation\t14\n7552\tblue_banner\trotation\t15\n7553\tbrown_banner\trotation\t0\n7554\tbrown_banner\trotation\t1\n7555\tbrown_banner\trotation\t2\n7556\tbrown_banner\trotation\t3\n7557\tbrown_banner\trotation\t4\n7558\tbrown_banner\trotation\t5\n7559\tbrown_banner\trotation\t6\n7560\tbrown_banner\trotation\t7\n7561\tbrown_banner\trotation\t8\n7562\tbrown_banner\trotation\t9\n7563\tbrown_banner\trotation\t10\n7564\tbrown_banner\trotation\t11\n7565\tbrown_banner\trotation\t12\n7566\tbrown_banner\trotation\t13\n7567\tbrown_banner\trotation\t14\n7568\tbrown_banner\trotation\t15\n7569\tgreen_banner\trotation\t0\n7570\tgreen_banner\trotation\t1\n7571\tgreen_banner\trotation\t2\n7572\tgreen_banner\trotation\t3\n7573\tgreen_banner\trotation\t4\n7574\tgreen_banner\trotation\t5\n7575\tgreen_banner\trotation\t6\n7576\tgreen_banner\trotation\t7\n7577\tgreen_banner\trotation\t8\n7578\tgreen_banner\trotation\t9\n7579\tgreen_banner\trotation\t10\n7580\tgreen_banner\trotation\t11\n7581\tgreen_banner\trotation\t12\n7582\tgreen_banner\trotation\t13\n7583\tgreen_banner\trotation\t14\n7584\tgreen_banner\trotation\t15\n7585\tred_banner\trotation\t0\n7586\tred_banner\trotation\t1\n7587\tred_banner\trotation\t2\n7588\tred_banner\trotation\t3\n7589\tred_banner\trotation\t4\n7590\tred_banner\trotation\t5\n7591\tred_banner\trotation\t6\n7592\tred_banner\trotation\t7\n7593\tred_banner\trotation\t8\n7594\tred_banner\trotation\t9\n7595\tred_banner\trotation\t10\n7596\tred_banner\trotation\t11\n7597\tred_banner\trotation\t12\n7598\tred_banner\trotation\t13\n7599\tred_banner\trotation\t14\n7600\tred_banner\trotation\t15\n7601\tblack_banner\trotation\t0\n7602\tblack_banner\trotation\t1\n7603\tblack_banner\trotation\t2\n7604\tblack_banner\trotation\t3\n7605\tblack_banner\trotation\t4\n7606\tblack_banner\trotation\t5\n7607\tblack_banner\trotation\t6\n7608\tblack_banner\trotation\t7\n7609\tblack_banner\trotation\t8\n7610\tblack_banner\trotation\t9\n7611\tblack_banner\trotation\t10\n7612\tblack_banner\trotation\t11\n7613\tblack_banner\trotation\t12\n7614\tblack_banner\trotation\t13\n7615\tblack_banner\trotation\t14\n7616\tblack_banner\trotation\t15\n7617\twhite_wall_banner\tfacing\tnorth\n7618\twhite_wall_banner\tfacing\tsouth\n7619\twhite_wall_banner\tfacing\twest\n7620\twhite_wall_banner\tfacing\teast\n7621\torange_wall_banner\tfacing\tnorth\n7622\torange_wall_banner\tfacing\tsouth\n7623\torange_wall_banner\tfacing\twest\n7624\torange_wall_banner\tfacing\teast\n7625\tmagenta_wall_banner\tfacing\tnorth\n7626\tmagenta_wall_banner\tfacing\tsouth\n7627\tmagenta_wall_banner\tfacing\twest\n7628\tmagenta_wall_banner\tfacing\teast\n7629\tlight_blue_wall_banner\tfacing\tnorth\n7630\tlight_blue_wall_banner\tfacing\tsouth\n7631\tlight_blue_wall_banner\tfacing\twest\n7632\tlight_blue_wall_banner\tfacing\teast\n7633\tyellow_wall_banner\tfacing\tnorth\n7634\tyellow_wall_banner\tfacing\tsouth\n7635\tyellow_wall_banner\tfacing\twest\n7636\tyellow_wall_banner\tfacing\teast\n7637\tlime_wall_banner\tfacing\tnorth\n7638\tlime_wall_banner\tfacing\tsouth\n7639\tlime_wall_banner\tfacing\twest\n7640\tlime_wall_banner\tfacing\teast\n7641\tpink_wall_banner\tfacing\tnorth\n7642\tpink_wall_banner\tfacing\tsouth\n7643\tpink_wall_banner\tfacing\twest\n7644\tpink_wall_banner\tfacing\teast\n7645\tgray_wall_banner\tfacing\tnorth\n7646\tgray_wall_banner\tfacing\tsouth\n7647\tgray_wall_banner\tfacing\twest\n7648\tgray_wall_banner\tfacing\teast\n7649\tlight_gray_wall_banner\tfacing\tnorth\n7650\tlight_gray_wall_banner\tfacing\tsouth\n7651\tlight_gray_wall_banner\tfacing\twest\n7652\tlight_gray_wall_banner\tfacing\teast\n7653\tcyan_wall_banner\tfacing\tnorth\n7654\tcyan_wall_banner\tfacing\tsouth\n7655\tcyan_wall_banner\tfacing\twest\n7656\tcyan_wall_banner\tfacing\teast\n7657\tpurple_wall_banner\tfacing\tnorth\n7658\tpurple_wall_banner\tfacing\tsouth\n7659\tpurple_wall_banner\tfacing\twest\n7660\tpurple_wall_banner\tfacing\teast\n7661\tblue_wall_banner\tfacing\tnorth\n7662\tblue_wall_banner\tfacing\tsouth\n7663\tblue_wall_banner\tfacing\twest\n7664\tblue_wall_banner\tfacing\teast\n7665\tbrown_wall_banner\tfacing\tnorth\n7666\tbrown_wall_banner\tfacing\tsouth\n7667\tbrown_wall_banner\tfacing\twest\n7668\tbrown_wall_banner\tfacing\teast\n7669\tgreen_wall_banner\tfacing\tnorth\n7670\tgreen_wall_banner\tfacing\tsouth\n7671\tgreen_wall_banner\tfacing\twest\n7672\tgreen_wall_banner\tfacing\teast\n7673\tred_wall_banner\tfacing\tnorth\n7674\tred_wall_banner\tfacing\tsouth\n7675\tred_wall_banner\tfacing\twest\n7676\tred_wall_banner\tfacing\teast\n7677\tblack_wall_banner\tfacing\tnorth\n7678\tblack_wall_banner\tfacing\tsouth\n7679\tblack_wall_banner\tfacing\twest\n7680\tblack_wall_banner\tfacing\teast\n7681\tred_sandstone\n7682\tchiseled_red_sandstone\n7683\tcut_red_sandstone\n7684\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7685\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7686\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7687\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7688\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7689\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7690\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7691\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7692\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7693\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7694\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7695\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7696\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7697\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7698\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7699\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7700\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7701\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7702\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7703\tred_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7704\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7705\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7706\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7707\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7708\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7709\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7710\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7711\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7712\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7713\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7714\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7715\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7716\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7717\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7718\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7719\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7720\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7721\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7722\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7723\tred_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7724\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7725\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7726\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7727\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7728\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7729\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7730\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7731\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7732\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7733\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7734\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7735\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7736\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7737\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7738\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7739\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7740\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7741\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7742\tred_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7743\tred_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7744\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n7745\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n7746\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n7747\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n7748\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n7749\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n7750\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n7751\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n7752\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n7753\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n7754\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n7755\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n7756\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n7757\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n7758\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n7759\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n7760\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n7761\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n7762\tred_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n7763\tred_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n7764\toak_slab\ttype\ttop\twaterlogged\ttrue\n7765\toak_slab\ttype\ttop\twaterlogged\tfalse\n7766\toak_slab\ttype\tbottom\twaterlogged\ttrue\n7767\toak_slab\ttype\tbottom\twaterlogged\tfalse\n7768\toak_slab\ttype\tdouble\twaterlogged\ttrue\n7769\toak_slab\ttype\tdouble\twaterlogged\tfalse\n7770\tspruce_slab\ttype\ttop\twaterlogged\ttrue\n7771\tspruce_slab\ttype\ttop\twaterlogged\tfalse\n7772\tspruce_slab\ttype\tbottom\twaterlogged\ttrue\n7773\tspruce_slab\ttype\tbottom\twaterlogged\tfalse\n7774\tspruce_slab\ttype\tdouble\twaterlogged\ttrue\n7775\tspruce_slab\ttype\tdouble\twaterlogged\tfalse\n7776\tbirch_slab\ttype\ttop\twaterlogged\ttrue\n7777\tbirch_slab\ttype\ttop\twaterlogged\tfalse\n7778\tbirch_slab\ttype\tbottom\twaterlogged\ttrue\n7779\tbirch_slab\ttype\tbottom\twaterlogged\tfalse\n7780\tbirch_slab\ttype\tdouble\twaterlogged\ttrue\n7781\tbirch_slab\ttype\tdouble\twaterlogged\tfalse\n7782\tjungle_slab\ttype\ttop\twaterlogged\ttrue\n7783\tjungle_slab\ttype\ttop\twaterlogged\tfalse\n7784\tjungle_slab\ttype\tbottom\twaterlogged\ttrue\n7785\tjungle_slab\ttype\tbottom\twaterlogged\tfalse\n7786\tjungle_slab\ttype\tdouble\twaterlogged\ttrue\n7787\tjungle_slab\ttype\tdouble\twaterlogged\tfalse\n7788\tacacia_slab\ttype\ttop\twaterlogged\ttrue\n7789\tacacia_slab\ttype\ttop\twaterlogged\tfalse\n7790\tacacia_slab\ttype\tbottom\twaterlogged\ttrue\n7791\tacacia_slab\ttype\tbottom\twaterlogged\tfalse\n7792\tacacia_slab\ttype\tdouble\twaterlogged\ttrue\n7793\tacacia_slab\ttype\tdouble\twaterlogged\tfalse\n7794\tdark_oak_slab\ttype\ttop\twaterlogged\ttrue\n7795\tdark_oak_slab\ttype\ttop\twaterlogged\tfalse\n7796\tdark_oak_slab\ttype\tbottom\twaterlogged\ttrue\n7797\tdark_oak_slab\ttype\tbottom\twaterlogged\tfalse\n7798\tdark_oak_slab\ttype\tdouble\twaterlogged\ttrue\n7799\tdark_oak_slab\ttype\tdouble\twaterlogged\tfalse\n7800\tstone_slab\ttype\ttop\twaterlogged\ttrue\n7801\tstone_slab\ttype\ttop\twaterlogged\tfalse\n7802\tstone_slab\ttype\tbottom\twaterlogged\ttrue\n7803\tstone_slab\ttype\tbottom\twaterlogged\tfalse\n7804\tstone_slab\ttype\tdouble\twaterlogged\ttrue\n7805\tstone_slab\ttype\tdouble\twaterlogged\tfalse\n7806\tsmooth_stone_slab\ttype\ttop\twaterlogged\ttrue\n7807\tsmooth_stone_slab\ttype\ttop\twaterlogged\tfalse\n7808\tsmooth_stone_slab\ttype\tbottom\twaterlogged\ttrue\n7809\tsmooth_stone_slab\ttype\tbottom\twaterlogged\tfalse\n7810\tsmooth_stone_slab\ttype\tdouble\twaterlogged\ttrue\n7811\tsmooth_stone_slab\ttype\tdouble\twaterlogged\tfalse\n7812\tsandstone_slab\ttype\ttop\twaterlogged\ttrue\n7813\tsandstone_slab\ttype\ttop\twaterlogged\tfalse\n7814\tsandstone_slab\ttype\tbottom\twaterlogged\ttrue\n7815\tsandstone_slab\ttype\tbottom\twaterlogged\tfalse\n7816\tsandstone_slab\ttype\tdouble\twaterlogged\ttrue\n7817\tsandstone_slab\ttype\tdouble\twaterlogged\tfalse\n7818\tcut_sandstone_slab\ttype\ttop\twaterlogged\ttrue\n7819\tcut_sandstone_slab\ttype\ttop\twaterlogged\tfalse\n7820\tcut_sandstone_slab\ttype\tbottom\twaterlogged\ttrue\n7821\tcut_sandstone_slab\ttype\tbottom\twaterlogged\tfalse\n7822\tcut_sandstone_slab\ttype\tdouble\twaterlogged\ttrue\n7823\tcut_sandstone_slab\ttype\tdouble\twaterlogged\tfalse\n7824\tpetrified_oak_slab\ttype\ttop\twaterlogged\ttrue\n7825\tpetrified_oak_slab\ttype\ttop\twaterlogged\tfalse\n7826\tpetrified_oak_slab\ttype\tbottom\twaterlogged\ttrue\n7827\tpetrified_oak_slab\ttype\tbottom\twaterlogged\tfalse\n7828\tpetrified_oak_slab\ttype\tdouble\twaterlogged\ttrue\n7829\tpetrified_oak_slab\ttype\tdouble\twaterlogged\tfalse\n7830\tcobblestone_slab\ttype\ttop\twaterlogged\ttrue\n7831\tcobblestone_slab\ttype\ttop\twaterlogged\tfalse\n7832\tcobblestone_slab\ttype\tbottom\twaterlogged\ttrue\n7833\tcobblestone_slab\ttype\tbottom\twaterlogged\tfalse\n7834\tcobblestone_slab\ttype\tdouble\twaterlogged\ttrue\n7835\tcobblestone_slab\ttype\tdouble\twaterlogged\tfalse\n7836\tbrick_slab\ttype\ttop\twaterlogged\ttrue\n7837\tbrick_slab\ttype\ttop\twaterlogged\tfalse\n7838\tbrick_slab\ttype\tbottom\twaterlogged\ttrue\n7839\tbrick_slab\ttype\tbottom\twaterlogged\tfalse\n7840\tbrick_slab\ttype\tdouble\twaterlogged\ttrue\n7841\tbrick_slab\ttype\tdouble\twaterlogged\tfalse\n7842\tstone_brick_slab\ttype\ttop\twaterlogged\ttrue\n7843\tstone_brick_slab\ttype\ttop\twaterlogged\tfalse\n7844\tstone_brick_slab\ttype\tbottom\twaterlogged\ttrue\n7845\tstone_brick_slab\ttype\tbottom\twaterlogged\tfalse\n7846\tstone_brick_slab\ttype\tdouble\twaterlogged\ttrue\n7847\tstone_brick_slab\ttype\tdouble\twaterlogged\tfalse\n7848\tnether_brick_slab\ttype\ttop\twaterlogged\ttrue\n7849\tnether_brick_slab\ttype\ttop\twaterlogged\tfalse\n7850\tnether_brick_slab\ttype\tbottom\twaterlogged\ttrue\n7851\tnether_brick_slab\ttype\tbottom\twaterlogged\tfalse\n7852\tnether_brick_slab\ttype\tdouble\twaterlogged\ttrue\n7853\tnether_brick_slab\ttype\tdouble\twaterlogged\tfalse\n7854\tquartz_slab\ttype\ttop\twaterlogged\ttrue\n7855\tquartz_slab\ttype\ttop\twaterlogged\tfalse\n7856\tquartz_slab\ttype\tbottom\twaterlogged\ttrue\n7857\tquartz_slab\ttype\tbottom\twaterlogged\tfalse\n7858\tquartz_slab\ttype\tdouble\twaterlogged\ttrue\n7859\tquartz_slab\ttype\tdouble\twaterlogged\tfalse\n7860\tred_sandstone_slab\ttype\ttop\twaterlogged\ttrue\n7861\tred_sandstone_slab\ttype\ttop\twaterlogged\tfalse\n7862\tred_sandstone_slab\ttype\tbottom\twaterlogged\ttrue\n7863\tred_sandstone_slab\ttype\tbottom\twaterlogged\tfalse\n7864\tred_sandstone_slab\ttype\tdouble\twaterlogged\ttrue\n7865\tred_sandstone_slab\ttype\tdouble\twaterlogged\tfalse\n7866\tcut_red_sandstone_slab\ttype\ttop\twaterlogged\ttrue\n7867\tcut_red_sandstone_slab\ttype\ttop\twaterlogged\tfalse\n7868\tcut_red_sandstone_slab\ttype\tbottom\twaterlogged\ttrue\n7869\tcut_red_sandstone_slab\ttype\tbottom\twaterlogged\tfalse\n7870\tcut_red_sandstone_slab\ttype\tdouble\twaterlogged\ttrue\n7871\tcut_red_sandstone_slab\ttype\tdouble\twaterlogged\tfalse\n7872\tpurpur_slab\ttype\ttop\twaterlogged\ttrue\n7873\tpurpur_slab\ttype\ttop\twaterlogged\tfalse\n7874\tpurpur_slab\ttype\tbottom\twaterlogged\ttrue\n7875\tpurpur_slab\ttype\tbottom\twaterlogged\tfalse\n7876\tpurpur_slab\ttype\tdouble\twaterlogged\ttrue\n7877\tpurpur_slab\ttype\tdouble\twaterlogged\tfalse\n7878\tsmooth_stone\n7879\tsmooth_sandstone\n7880\tsmooth_quartz\n7881\tsmooth_red_sandstone\n7882\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7883\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7884\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7885\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7886\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7887\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7888\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7889\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7890\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7891\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7892\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7893\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7894\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7895\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7896\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7897\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7898\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7899\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7900\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7901\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7902\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7903\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7904\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7905\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7906\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7907\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7908\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7909\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7910\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7911\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7912\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7913\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7914\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7915\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7916\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7917\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7918\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7919\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7920\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7921\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7922\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7923\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7924\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7925\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7926\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7927\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7928\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7929\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7930\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7931\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7932\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7933\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7934\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7935\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7936\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7937\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7938\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7939\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7940\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7941\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7942\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7943\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7944\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7945\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7946\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7947\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7948\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7949\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7950\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7951\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7952\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7953\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7954\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7955\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7956\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7957\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7958\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7959\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7960\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7961\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7962\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7963\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7964\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7965\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7966\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7967\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7968\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7969\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7970\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7971\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7972\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7973\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7974\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7975\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7976\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7977\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7978\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7979\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7980\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7981\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7982\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7983\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7984\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7985\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7986\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7987\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7988\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7989\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7990\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7991\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n7992\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n7993\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n7994\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n7995\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n7996\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n7997\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n7998\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n7999\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n8000\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n8001\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n8002\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n8003\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n8004\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n8005\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n8006\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n8007\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n8008\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n8009\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n8010\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n8011\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n8012\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n8013\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n8014\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n8015\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n8016\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n8017\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n8018\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n8019\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n8020\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n8021\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n8022\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n8023\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n8024\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n8025\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n8026\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n8027\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n8028\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n8029\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n8030\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n8031\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n8032\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n8033\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n8034\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\ttrue\n8035\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\ttrue\n8036\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\ttrue\n8037\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\ttrue\n8038\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n8039\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n8040\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n8041\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n8042\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8043\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8044\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8045\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8046\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8047\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8048\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8049\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8050\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8051\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8052\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8053\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8054\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8055\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8056\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8057\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8058\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8059\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8060\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8061\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8062\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8063\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8064\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8065\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8066\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8067\tspruce_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8068\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8069\tspruce_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8070\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8071\tspruce_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8072\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8073\tspruce_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8074\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8075\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8076\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8077\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8078\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8079\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8080\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8081\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8082\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8083\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8084\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8085\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8086\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8087\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8088\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8089\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8090\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8091\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8092\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8093\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8094\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8095\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8096\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8097\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8098\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8099\tbirch_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8100\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8101\tbirch_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8102\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8103\tbirch_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8104\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8105\tbirch_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8106\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8107\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8108\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8109\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8110\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8111\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8112\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8113\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8114\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8115\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8116\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8117\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8118\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8119\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8120\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8121\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8122\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8123\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8124\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8125\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8126\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8127\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8128\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8129\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8130\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8131\tjungle_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8132\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8133\tjungle_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8134\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8135\tjungle_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8136\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8137\tjungle_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8138\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8139\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8140\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8141\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8142\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8143\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8144\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8145\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8146\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8147\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8148\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8149\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8150\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8151\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8152\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8153\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8154\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8155\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8156\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8157\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8158\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8159\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8160\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8161\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8162\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8163\tacacia_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8164\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8165\tacacia_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8166\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8167\tacacia_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8168\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8169\tacacia_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8170\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8171\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8172\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\ttrue\n8173\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\twest\tfalse\n8174\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8175\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8176\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\ttrue\n8177\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\twest\tfalse\n8178\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8179\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8180\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\ttrue\n8181\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\twest\tfalse\n8182\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8183\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8184\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\ttrue\n8185\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\twest\tfalse\n8186\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8187\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8188\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\ttrue\n8189\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\twest\tfalse\n8190\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8191\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8192\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\ttrue\n8193\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\twest\tfalse\n8194\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8195\tdark_oak_fence\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8196\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\ttrue\n8197\tdark_oak_fence\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\twest\tfalse\n8198\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8199\tdark_oak_fence\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8200\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\ttrue\n8201\tdark_oak_fence\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\twest\tfalse\n8202\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8203\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8204\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8205\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8206\tspruce_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8207\tspruce_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8208\tspruce_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8209\tspruce_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8210\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8211\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8212\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8213\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8214\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8215\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8216\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8217\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8218\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8219\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8220\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8221\tspruce_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8222\tspruce_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8223\tspruce_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8224\tspruce_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8225\tspruce_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8226\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8227\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8228\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8229\tspruce_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8230\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8231\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8232\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8233\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8234\tspruce_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8235\tspruce_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8236\tspruce_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8237\tspruce_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8238\tspruce_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8239\tspruce_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8240\tspruce_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8241\tspruce_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8242\tspruce_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8243\tspruce_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8244\tspruce_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8245\tspruce_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8246\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8247\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8248\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8249\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8250\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8251\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8252\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8253\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8254\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8255\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8256\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8257\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8258\tspruce_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8259\tspruce_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8260\tspruce_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8261\tspruce_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8262\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8263\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8264\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8265\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8266\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8267\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8268\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8269\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8270\tbirch_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8271\tbirch_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8272\tbirch_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8273\tbirch_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8274\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8275\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8276\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8277\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8278\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8279\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8280\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8281\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8282\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8283\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8284\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8285\tbirch_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8286\tbirch_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8287\tbirch_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8288\tbirch_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8289\tbirch_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8290\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8291\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8292\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8293\tbirch_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8294\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8295\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8296\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8297\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8298\tbirch_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8299\tbirch_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8300\tbirch_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8301\tbirch_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8302\tbirch_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8303\tbirch_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8304\tbirch_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8305\tbirch_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8306\tbirch_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8307\tbirch_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8308\tbirch_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8309\tbirch_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8310\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8311\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8312\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8313\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8314\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8315\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8316\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8317\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8318\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8319\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8320\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8321\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8322\tbirch_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8323\tbirch_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8324\tbirch_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8325\tbirch_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8326\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8327\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8328\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8329\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8330\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8331\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8332\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8333\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8334\tjungle_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8335\tjungle_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8336\tjungle_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8337\tjungle_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8338\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8339\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8340\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8341\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8342\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8343\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8344\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8345\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8346\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8347\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8348\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8349\tjungle_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8350\tjungle_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8351\tjungle_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8352\tjungle_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8353\tjungle_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8354\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8355\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8356\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8357\tjungle_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8358\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8359\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8360\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8361\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8362\tjungle_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8363\tjungle_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8364\tjungle_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8365\tjungle_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8366\tjungle_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8367\tjungle_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8368\tjungle_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8369\tjungle_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8370\tjungle_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8371\tjungle_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8372\tjungle_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8373\tjungle_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8374\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8375\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8376\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8377\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8378\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8379\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8380\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8381\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8382\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8383\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8384\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8385\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8386\tjungle_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8387\tjungle_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8388\tjungle_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8389\tjungle_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8390\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8391\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8392\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8393\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8394\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8395\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8396\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8397\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8398\tacacia_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8399\tacacia_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8400\tacacia_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8401\tacacia_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8402\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8403\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8404\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8405\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8406\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8407\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8408\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8409\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8410\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8411\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8412\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8413\tacacia_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8414\tacacia_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8415\tacacia_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8416\tacacia_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8417\tacacia_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8418\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8419\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8420\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8421\tacacia_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8422\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8423\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8424\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8425\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8426\tacacia_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8427\tacacia_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8428\tacacia_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8429\tacacia_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8430\tacacia_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8431\tacacia_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8432\tacacia_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8433\tacacia_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8434\tacacia_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8435\tacacia_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8436\tacacia_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8437\tacacia_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8438\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8439\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8440\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8441\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8442\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8443\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8444\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8445\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8446\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8447\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8448\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8449\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8450\tacacia_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8451\tacacia_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8452\tacacia_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8453\tacacia_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8454\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8455\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8456\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8457\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8458\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8459\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8460\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8461\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8462\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8463\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8464\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8465\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8466\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8467\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8468\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8469\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8470\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\ttrue\n8471\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n8472\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\ttrue\topen\tfalse\n8473\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n8474\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8475\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8476\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8477\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8478\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8479\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8480\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8481\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8482\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8483\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8484\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8485\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8486\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\ttrue\n8487\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n8488\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\ttrue\topen\tfalse\n8489\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n8490\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8491\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8492\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8493\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8494\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\ttrue\n8495\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n8496\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\ttrue\topen\tfalse\n8497\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\tfalse\n8498\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8499\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8500\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8501\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8502\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\ttrue\n8503\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n8504\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\ttrue\topen\tfalse\n8505\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n8506\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8507\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8508\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8509\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8510\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\ttrue\n8511\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n8512\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n8513\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n8514\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8515\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8516\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8517\tdark_oak_door\thinge\tleft\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8518\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\ttrue\n8519\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n8520\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\ttrue\topen\tfalse\n8521\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n8522\tend_rod\tfacing\tnorth\n8523\tend_rod\tfacing\teast\n8524\tend_rod\tfacing\tsouth\n8525\tend_rod\tfacing\twest\n8526\tend_rod\tfacing\tup\n8527\tend_rod\tfacing\tdown\n8528\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8529\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8530\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8531\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8532\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8533\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8534\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8535\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8536\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8537\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8538\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8539\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8540\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8541\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8542\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8543\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8544\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8545\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8546\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8547\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8548\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8549\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8550\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\ttrue\n8551\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\ttrue\twest\tfalse\n8552\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8553\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8554\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8555\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8556\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8557\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8558\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\ttrue\n8559\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\ttrue\twest\tfalse\n8560\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8561\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8562\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8563\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8564\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8565\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8566\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8567\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8568\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8569\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8570\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8571\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8572\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8573\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8574\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8575\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8576\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8577\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8578\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8579\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8580\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8581\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8582\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\ttrue\n8583\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tdown\tfalse\twest\tfalse\n8584\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8585\tchorus_plant\tup\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8586\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8587\tchorus_plant\tup\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8588\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8589\tchorus_plant\tup\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8590\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\ttrue\n8591\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n8592\tchorus_flower\tage\t0\n8593\tchorus_flower\tage\t1\n8594\tchorus_flower\tage\t2\n8595\tchorus_flower\tage\t3\n8596\tchorus_flower\tage\t4\n8597\tchorus_flower\tage\t5\n8598\tpurpur_block\n8599\tpurpur_pillar\taxis\tx\n8600\tpurpur_pillar\taxis\ty\n8601\tpurpur_pillar\taxis\tz\n8602\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n8603\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n8604\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n8605\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n8606\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n8607\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n8608\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n8609\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n8610\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n8611\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n8612\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n8613\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n8614\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n8615\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n8616\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n8617\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n8618\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n8619\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n8620\tpurpur_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n8621\tpurpur_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n8622\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n8623\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n8624\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n8625\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n8626\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n8627\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n8628\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n8629\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n8630\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n8631\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n8632\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n8633\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n8634\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n8635\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n8636\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n8637\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n8638\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n8639\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n8640\tpurpur_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n8641\tpurpur_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n8642\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n8643\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n8644\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n8645\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n8646\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n8647\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n8648\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n8649\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n8650\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n8651\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n8652\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n8653\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n8654\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n8655\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n8656\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n8657\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n8658\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n8659\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n8660\tpurpur_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n8661\tpurpur_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n8662\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n8663\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n8664\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n8665\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n8666\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n8667\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n8668\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n8669\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n8670\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n8671\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n8672\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n8673\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n8674\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n8675\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n8676\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n8677\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n8678\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n8679\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n8680\tpurpur_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n8681\tpurpur_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n8682\tend_stone_bricks\n8683\tbeetroots\tage\t0\n8684\tbeetroots\tage\t1\n8685\tbeetroots\tage\t2\n8686\tbeetroots\tage\t3\n8687\tgrass_path\n8688\tend_gateway\n8689\trepeating_command_block\tconditional\ttrue\tfacing\tnorth\n8690\trepeating_command_block\tconditional\ttrue\tfacing\teast\n8691\trepeating_command_block\tconditional\ttrue\tfacing\tsouth\n8692\trepeating_command_block\tconditional\ttrue\tfacing\twest\n8693\trepeating_command_block\tconditional\ttrue\tfacing\tup\n8694\trepeating_command_block\tconditional\ttrue\tfacing\tdown\n8695\trepeating_command_block\tconditional\tfalse\tfacing\tnorth\n8696\trepeating_command_block\tconditional\tfalse\tfacing\teast\n8697\trepeating_command_block\tconditional\tfalse\tfacing\tsouth\n8698\trepeating_command_block\tconditional\tfalse\tfacing\twest\n8699\trepeating_command_block\tconditional\tfalse\tfacing\tup\n8700\trepeating_command_block\tconditional\tfalse\tfacing\tdown\n8701\tchain_command_block\tconditional\ttrue\tfacing\tnorth\n8702\tchain_command_block\tconditional\ttrue\tfacing\teast\n8703\tchain_command_block\tconditional\ttrue\tfacing\tsouth\n8704\tchain_command_block\tconditional\ttrue\tfacing\twest\n8705\tchain_command_block\tconditional\ttrue\tfacing\tup\n8706\tchain_command_block\tconditional\ttrue\tfacing\tdown\n8707\tchain_command_block\tconditional\tfalse\tfacing\tnorth\n8708\tchain_command_block\tconditional\tfalse\tfacing\teast\n8709\tchain_command_block\tconditional\tfalse\tfacing\tsouth\n8710\tchain_command_block\tconditional\tfalse\tfacing\twest\n8711\tchain_command_block\tconditional\tfalse\tfacing\tup\n8712\tchain_command_block\tconditional\tfalse\tfacing\tdown\n8713\tfrosted_ice\tage\t0\n8714\tfrosted_ice\tage\t1\n8715\tfrosted_ice\tage\t2\n8716\tfrosted_ice\tage\t3\n8717\tmagma_block\n8718\tnether_wart_block\n8719\tred_nether_bricks\n8720\tbone_block\taxis\tx\n8721\tbone_block\taxis\ty\n8722\tbone_block\taxis\tz\n8723\tstructure_void\n8724\tobserver\tfacing\tnorth\tpowered\ttrue\n8725\tobserver\tfacing\tnorth\tpowered\tfalse\n8726\tobserver\tfacing\teast\tpowered\ttrue\n8727\tobserver\tfacing\teast\tpowered\tfalse\n8728\tobserver\tfacing\tsouth\tpowered\ttrue\n8729\tobserver\tfacing\tsouth\tpowered\tfalse\n8730\tobserver\tfacing\twest\tpowered\ttrue\n8731\tobserver\tfacing\twest\tpowered\tfalse\n8732\tobserver\tfacing\tup\tpowered\ttrue\n8733\tobserver\tfacing\tup\tpowered\tfalse\n8734\tobserver\tfacing\tdown\tpowered\ttrue\n8735\tobserver\tfacing\tdown\tpowered\tfalse\n8736\tshulker_box\tfacing\tnorth\n8737\tshulker_box\tfacing\teast\n8738\tshulker_box\tfacing\tsouth\n8739\tshulker_box\tfacing\twest\n8740\tshulker_box\tfacing\tup\n8741\tshulker_box\tfacing\tdown\n8742\twhite_shulker_box\tfacing\tnorth\n8743\twhite_shulker_box\tfacing\teast\n8744\twhite_shulker_box\tfacing\tsouth\n8745\twhite_shulker_box\tfacing\twest\n8746\twhite_shulker_box\tfacing\tup\n8747\twhite_shulker_box\tfacing\tdown\n8748\torange_shulker_box\tfacing\tnorth\n8749\torange_shulker_box\tfacing\teast\n8750\torange_shulker_box\tfacing\tsouth\n8751\torange_shulker_box\tfacing\twest\n8752\torange_shulker_box\tfacing\tup\n8753\torange_shulker_box\tfacing\tdown\n8754\tmagenta_shulker_box\tfacing\tnorth\n8755\tmagenta_shulker_box\tfacing\teast\n8756\tmagenta_shulker_box\tfacing\tsouth\n8757\tmagenta_shulker_box\tfacing\twest\n8758\tmagenta_shulker_box\tfacing\tup\n8759\tmagenta_shulker_box\tfacing\tdown\n8760\tlight_blue_shulker_box\tfacing\tnorth\n8761\tlight_blue_shulker_box\tfacing\teast\n8762\tlight_blue_shulker_box\tfacing\tsouth\n8763\tlight_blue_shulker_box\tfacing\twest\n8764\tlight_blue_shulker_box\tfacing\tup\n8765\tlight_blue_shulker_box\tfacing\tdown\n8766\tyellow_shulker_box\tfacing\tnorth\n8767\tyellow_shulker_box\tfacing\teast\n8768\tyellow_shulker_box\tfacing\tsouth\n8769\tyellow_shulker_box\tfacing\twest\n8770\tyellow_shulker_box\tfacing\tup\n8771\tyellow_shulker_box\tfacing\tdown\n8772\tlime_shulker_box\tfacing\tnorth\n8773\tlime_shulker_box\tfacing\teast\n8774\tlime_shulker_box\tfacing\tsouth\n8775\tlime_shulker_box\tfacing\twest\n8776\tlime_shulker_box\tfacing\tup\n8777\tlime_shulker_box\tfacing\tdown\n8778\tpink_shulker_box\tfacing\tnorth\n8779\tpink_shulker_box\tfacing\teast\n8780\tpink_shulker_box\tfacing\tsouth\n8781\tpink_shulker_box\tfacing\twest\n8782\tpink_shulker_box\tfacing\tup\n8783\tpink_shulker_box\tfacing\tdown\n8784\tgray_shulker_box\tfacing\tnorth\n8785\tgray_shulker_box\tfacing\teast\n8786\tgray_shulker_box\tfacing\tsouth\n8787\tgray_shulker_box\tfacing\twest\n8788\tgray_shulker_box\tfacing\tup\n8789\tgray_shulker_box\tfacing\tdown\n8790\tlight_gray_shulker_box\tfacing\tnorth\n8791\tlight_gray_shulker_box\tfacing\teast\n8792\tlight_gray_shulker_box\tfacing\tsouth\n8793\tlight_gray_shulker_box\tfacing\twest\n8794\tlight_gray_shulker_box\tfacing\tup\n8795\tlight_gray_shulker_box\tfacing\tdown\n8796\tcyan_shulker_box\tfacing\tnorth\n8797\tcyan_shulker_box\tfacing\teast\n8798\tcyan_shulker_box\tfacing\tsouth\n8799\tcyan_shulker_box\tfacing\twest\n8800\tcyan_shulker_box\tfacing\tup\n8801\tcyan_shulker_box\tfacing\tdown\n8802\tpurple_shulker_box\tfacing\tnorth\n8803\tpurple_shulker_box\tfacing\teast\n8804\tpurple_shulker_box\tfacing\tsouth\n8805\tpurple_shulker_box\tfacing\twest\n8806\tpurple_shulker_box\tfacing\tup\n8807\tpurple_shulker_box\tfacing\tdown\n8808\tblue_shulker_box\tfacing\tnorth\n8809\tblue_shulker_box\tfacing\teast\n8810\tblue_shulker_box\tfacing\tsouth\n8811\tblue_shulker_box\tfacing\twest\n8812\tblue_shulker_box\tfacing\tup\n8813\tblue_shulker_box\tfacing\tdown\n8814\tbrown_shulker_box\tfacing\tnorth\n8815\tbrown_shulker_box\tfacing\teast\n8816\tbrown_shulker_box\tfacing\tsouth\n8817\tbrown_shulker_box\tfacing\twest\n8818\tbrown_shulker_box\tfacing\tup\n8819\tbrown_shulker_box\tfacing\tdown\n8820\tgreen_shulker_box\tfacing\tnorth\n8821\tgreen_shulker_box\tfacing\teast\n8822\tgreen_shulker_box\tfacing\tsouth\n8823\tgreen_shulker_box\tfacing\twest\n8824\tgreen_shulker_box\tfacing\tup\n8825\tgreen_shulker_box\tfacing\tdown\n8826\tred_shulker_box\tfacing\tnorth\n8827\tred_shulker_box\tfacing\teast\n8828\tred_shulker_box\tfacing\tsouth\n8829\tred_shulker_box\tfacing\twest\n8830\tred_shulker_box\tfacing\tup\n8831\tred_shulker_box\tfacing\tdown\n8832\tblack_shulker_box\tfacing\tnorth\n8833\tblack_shulker_box\tfacing\teast\n8834\tblack_shulker_box\tfacing\tsouth\n8835\tblack_shulker_box\tfacing\twest\n8836\tblack_shulker_box\tfacing\tup\n8837\tblack_shulker_box\tfacing\tdown\n8838\twhite_glazed_terracotta\tfacing\tnorth\n8839\twhite_glazed_terracotta\tfacing\tsouth\n8840\twhite_glazed_terracotta\tfacing\twest\n8841\twhite_glazed_terracotta\tfacing\teast\n8842\torange_glazed_terracotta\tfacing\tnorth\n8843\torange_glazed_terracotta\tfacing\tsouth\n8844\torange_glazed_terracotta\tfacing\twest\n8845\torange_glazed_terracotta\tfacing\teast\n8846\tmagenta_glazed_terracotta\tfacing\tnorth\n8847\tmagenta_glazed_terracotta\tfacing\tsouth\n8848\tmagenta_glazed_terracotta\tfacing\twest\n8849\tmagenta_glazed_terracotta\tfacing\teast\n8850\tlight_blue_glazed_terracotta\tfacing\tnorth\n8851\tlight_blue_glazed_terracotta\tfacing\tsouth\n8852\tlight_blue_glazed_terracotta\tfacing\twest\n8853\tlight_blue_glazed_terracotta\tfacing\teast\n8854\tyellow_glazed_terracotta\tfacing\tnorth\n8855\tyellow_glazed_terracotta\tfacing\tsouth\n8856\tyellow_glazed_terracotta\tfacing\twest\n8857\tyellow_glazed_terracotta\tfacing\teast\n8858\tlime_glazed_terracotta\tfacing\tnorth\n8859\tlime_glazed_terracotta\tfacing\tsouth\n8860\tlime_glazed_terracotta\tfacing\twest\n8861\tlime_glazed_terracotta\tfacing\teast\n8862\tpink_glazed_terracotta\tfacing\tnorth\n8863\tpink_glazed_terracotta\tfacing\tsouth\n8864\tpink_glazed_terracotta\tfacing\twest\n8865\tpink_glazed_terracotta\tfacing\teast\n8866\tgray_glazed_terracotta\tfacing\tnorth\n8867\tgray_glazed_terracotta\tfacing\tsouth\n8868\tgray_glazed_terracotta\tfacing\twest\n8869\tgray_glazed_terracotta\tfacing\teast\n8870\tlight_gray_glazed_terracotta\tfacing\tnorth\n8871\tlight_gray_glazed_terracotta\tfacing\tsouth\n8872\tlight_gray_glazed_terracotta\tfacing\twest\n8873\tlight_gray_glazed_terracotta\tfacing\teast\n8874\tcyan_glazed_terracotta\tfacing\tnorth\n8875\tcyan_glazed_terracotta\tfacing\tsouth\n8876\tcyan_glazed_terracotta\tfacing\twest\n8877\tcyan_glazed_terracotta\tfacing\teast\n8878\tpurple_glazed_terracotta\tfacing\tnorth\n8879\tpurple_glazed_terracotta\tfacing\tsouth\n8880\tpurple_glazed_terracotta\tfacing\twest\n8881\tpurple_glazed_terracotta\tfacing\teast\n8882\tblue_glazed_terracotta\tfacing\tnorth\n8883\tblue_glazed_terracotta\tfacing\tsouth\n8884\tblue_glazed_terracotta\tfacing\twest\n8885\tblue_glazed_terracotta\tfacing\teast\n8886\tbrown_glazed_terracotta\tfacing\tnorth\n8887\tbrown_glazed_terracotta\tfacing\tsouth\n8888\tbrown_glazed_terracotta\tfacing\twest\n8889\tbrown_glazed_terracotta\tfacing\teast\n8890\tgreen_glazed_terracotta\tfacing\tnorth\n8891\tgreen_glazed_terracotta\tfacing\tsouth\n8892\tgreen_glazed_terracotta\tfacing\twest\n8893\tgreen_glazed_terracotta\tfacing\teast\n8894\tred_glazed_terracotta\tfacing\tnorth\n8895\tred_glazed_terracotta\tfacing\tsouth\n8896\tred_glazed_terracotta\tfacing\twest\n8897\tred_glazed_terracotta\tfacing\teast\n8898\tblack_glazed_terracotta\tfacing\tnorth\n8899\tblack_glazed_terracotta\tfacing\tsouth\n8900\tblack_glazed_terracotta\tfacing\twest\n8901\tblack_glazed_terracotta\tfacing\teast\n8902\twhite_concrete\n8903\torange_concrete\n8904\tmagenta_concrete\n8905\tlight_blue_concrete\n8906\tyellow_concrete\n8907\tlime_concrete\n8908\tpink_concrete\n8909\tgray_concrete\n8910\tlight_gray_concrete\n8911\tcyan_concrete\n8912\tpurple_concrete\n8913\tblue_concrete\n8914\tbrown_concrete\n8915\tgreen_concrete\n8916\tred_concrete\n8917\tblack_concrete\n8918\twhite_concrete_powder\n8919\torange_concrete_powder\n8920\tmagenta_concrete_powder\n8921\tlight_blue_concrete_powder\n8922\tyellow_concrete_powder\n8923\tlime_concrete_powder\n8924\tpink_concrete_powder\n8925\tgray_concrete_powder\n8926\tlight_gray_concrete_powder\n8927\tcyan_concrete_powder\n8928\tpurple_concrete_powder\n8929\tblue_concrete_powder\n8930\tbrown_concrete_powder\n8931\tgreen_concrete_powder\n8932\tred_concrete_powder\n8933\tblack_concrete_powder\n8934\tkelp\tage\t0\n8935\tkelp\tage\t1\n8936\tkelp\tage\t2\n8937\tkelp\tage\t3\n8938\tkelp\tage\t4\n8939\tkelp\tage\t5\n8940\tkelp\tage\t6\n8941\tkelp\tage\t7\n8942\tkelp\tage\t8\n8943\tkelp\tage\t9\n8944\tkelp\tage\t10\n8945\tkelp\tage\t11\n8946\tkelp\tage\t12\n8947\tkelp\tage\t13\n8948\tkelp\tage\t14\n8949\tkelp\tage\t15\n8950\tkelp\tage\t16\n8951\tkelp\tage\t17\n8952\tkelp\tage\t18\n8953\tkelp\tage\t19\n8954\tkelp\tage\t20\n8955\tkelp\tage\t21\n8956\tkelp\tage\t22\n8957\tkelp\tage\t23\n8958\tkelp\tage\t24\n8959\tkelp\tage\t25\n8960\tkelp_plant\n8961\tdried_kelp_block\n8962\tturtle_egg\teggs\t1\thatch\t0\n8963\tturtle_egg\teggs\t1\thatch\t1\n8964\tturtle_egg\teggs\t1\thatch\t2\n8965\tturtle_egg\teggs\t2\thatch\t0\n8966\tturtle_egg\teggs\t2\thatch\t1\n8967\tturtle_egg\teggs\t2\thatch\t2\n8968\tturtle_egg\teggs\t3\thatch\t0\n8969\tturtle_egg\teggs\t3\thatch\t1\n8970\tturtle_egg\teggs\t3\thatch\t2\n8971\tturtle_egg\teggs\t4\thatch\t0\n8972\tturtle_egg\teggs\t4\thatch\t1\n8973\tturtle_egg\teggs\t4\thatch\t2\n8974\tdead_tube_coral_block\n8975\tdead_brain_coral_block\n8976\tdead_bubble_coral_block\n8977\tdead_fire_coral_block\n8978\tdead_horn_coral_block\n8979\ttube_coral_block\n8980\tbrain_coral_block\n8981\tbubble_coral_block\n8982\tfire_coral_block\n8983\thorn_coral_block\n8984\tdead_tube_coral\twaterlogged\ttrue\n8985\tdead_tube_coral\twaterlogged\tfalse\n8986\tdead_brain_coral\twaterlogged\ttrue\n8987\tdead_brain_coral\twaterlogged\tfalse\n8988\tdead_bubble_coral\twaterlogged\ttrue\n8989\tdead_bubble_coral\twaterlogged\tfalse\n8990\tdead_fire_coral\twaterlogged\ttrue\n8991\tdead_fire_coral\twaterlogged\tfalse\n8992\tdead_horn_coral\twaterlogged\ttrue\n8993\tdead_horn_coral\twaterlogged\tfalse\n8994\ttube_coral\twaterlogged\ttrue\n8995\ttube_coral\twaterlogged\tfalse\n8996\tbrain_coral\twaterlogged\ttrue\n8997\tbrain_coral\twaterlogged\tfalse\n8998\tbubble_coral\twaterlogged\ttrue\n8999\tbubble_coral\twaterlogged\tfalse\n9000\tfire_coral\twaterlogged\ttrue\n9001\tfire_coral\twaterlogged\tfalse\n9002\thorn_coral\twaterlogged\ttrue\n9003\thorn_coral\twaterlogged\tfalse\n9004\tdead_tube_coral_fan\twaterlogged\ttrue\n9005\tdead_tube_coral_fan\twaterlogged\tfalse\n9006\tdead_brain_coral_fan\twaterlogged\ttrue\n9007\tdead_brain_coral_fan\twaterlogged\tfalse\n9008\tdead_bubble_coral_fan\twaterlogged\ttrue\n9009\tdead_bubble_coral_fan\twaterlogged\tfalse\n9010\tdead_fire_coral_fan\twaterlogged\ttrue\n9011\tdead_fire_coral_fan\twaterlogged\tfalse\n9012\tdead_horn_coral_fan\twaterlogged\ttrue\n9013\tdead_horn_coral_fan\twaterlogged\tfalse\n9014\ttube_coral_fan\twaterlogged\ttrue\n9015\ttube_coral_fan\twaterlogged\tfalse\n9016\tbrain_coral_fan\twaterlogged\ttrue\n9017\tbrain_coral_fan\twaterlogged\tfalse\n9018\tbubble_coral_fan\twaterlogged\ttrue\n9019\tbubble_coral_fan\twaterlogged\tfalse\n9020\tfire_coral_fan\twaterlogged\ttrue\n9021\tfire_coral_fan\twaterlogged\tfalse\n9022\thorn_coral_fan\twaterlogged\ttrue\n9023\thorn_coral_fan\twaterlogged\tfalse\n9024\tdead_tube_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9025\tdead_tube_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9026\tdead_tube_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9027\tdead_tube_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9028\tdead_tube_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9029\tdead_tube_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9030\tdead_tube_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9031\tdead_tube_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9032\tdead_brain_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9033\tdead_brain_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9034\tdead_brain_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9035\tdead_brain_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9036\tdead_brain_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9037\tdead_brain_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9038\tdead_brain_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9039\tdead_brain_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9040\tdead_bubble_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9041\tdead_bubble_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9042\tdead_bubble_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9043\tdead_bubble_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9044\tdead_bubble_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9045\tdead_bubble_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9046\tdead_bubble_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9047\tdead_bubble_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9048\tdead_fire_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9049\tdead_fire_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9050\tdead_fire_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9051\tdead_fire_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9052\tdead_fire_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9053\tdead_fire_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9054\tdead_fire_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9055\tdead_fire_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9056\tdead_horn_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9057\tdead_horn_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9058\tdead_horn_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9059\tdead_horn_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9060\tdead_horn_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9061\tdead_horn_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9062\tdead_horn_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9063\tdead_horn_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9064\ttube_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9065\ttube_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9066\ttube_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9067\ttube_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9068\ttube_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9069\ttube_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9070\ttube_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9071\ttube_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9072\tbrain_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9073\tbrain_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9074\tbrain_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9075\tbrain_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9076\tbrain_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9077\tbrain_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9078\tbrain_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9079\tbrain_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9080\tbubble_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9081\tbubble_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9082\tbubble_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9083\tbubble_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9084\tbubble_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9085\tbubble_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9086\tbubble_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9087\tbubble_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9088\tfire_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9089\tfire_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9090\tfire_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9091\tfire_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9092\tfire_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9093\tfire_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9094\tfire_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9095\tfire_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9096\thorn_coral_wall_fan\tfacing\tnorth\twaterlogged\ttrue\n9097\thorn_coral_wall_fan\tfacing\tnorth\twaterlogged\tfalse\n9098\thorn_coral_wall_fan\tfacing\tsouth\twaterlogged\ttrue\n9099\thorn_coral_wall_fan\tfacing\tsouth\twaterlogged\tfalse\n9100\thorn_coral_wall_fan\tfacing\twest\twaterlogged\ttrue\n9101\thorn_coral_wall_fan\tfacing\twest\twaterlogged\tfalse\n9102\thorn_coral_wall_fan\tfacing\teast\twaterlogged\ttrue\n9103\thorn_coral_wall_fan\tfacing\teast\twaterlogged\tfalse\n9104\tsea_pickle\twaterlogged\ttrue\tpickles\t1\n9105\tsea_pickle\twaterlogged\tfalse\tpickles\t1\n9106\tsea_pickle\twaterlogged\ttrue\tpickles\t2\n9107\tsea_pickle\twaterlogged\tfalse\tpickles\t2\n9108\tsea_pickle\twaterlogged\ttrue\tpickles\t3\n9109\tsea_pickle\twaterlogged\tfalse\tpickles\t3\n9110\tsea_pickle\twaterlogged\ttrue\tpickles\t4\n9111\tsea_pickle\twaterlogged\tfalse\tpickles\t4\n9112\tblue_ice\n9113\tconduit\twaterlogged\ttrue\n9114\tconduit\twaterlogged\tfalse\n9115\tbamboo_sapling\n9116\tbamboo\tleaves\tnone\tstage\t0\tage\t0\n9117\tbamboo\tleaves\tnone\tstage\t1\tage\t0\n9118\tbamboo\tleaves\tsmall\tstage\t0\tage\t0\n9119\tbamboo\tleaves\tsmall\tstage\t1\tage\t0\n9120\tbamboo\tleaves\tlarge\tstage\t0\tage\t0\n9121\tbamboo\tleaves\tlarge\tstage\t1\tage\t0\n9122\tbamboo\tleaves\tnone\tstage\t0\tage\t1\n9123\tbamboo\tleaves\tnone\tstage\t1\tage\t1\n9124\tbamboo\tleaves\tsmall\tstage\t0\tage\t1\n9125\tbamboo\tleaves\tsmall\tstage\t1\tage\t1\n9126\tbamboo\tleaves\tlarge\tstage\t0\tage\t1\n9127\tbamboo\tleaves\tlarge\tstage\t1\tage\t1\n9128\tpotted_bamboo\n9129\tvoid_air\n9130\tcave_air\n9131\tbubble_column\tdrag\ttrue\n9132\tbubble_column\tdrag\tfalse\n9133\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9134\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9135\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9136\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9137\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9138\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9139\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9140\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9141\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9142\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9143\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9144\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9145\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9146\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9147\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9148\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9149\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9150\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9151\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9152\tpolished_granite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9153\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9154\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9155\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9156\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9157\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9158\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9159\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9160\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9161\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9162\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9163\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9164\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9165\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9166\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9167\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9168\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9169\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9170\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9171\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9172\tpolished_granite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9173\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9174\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9175\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9176\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9177\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9178\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9179\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9180\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9181\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9182\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9183\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9184\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9185\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9186\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9187\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9188\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9189\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9190\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9191\tpolished_granite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9192\tpolished_granite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9193\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9194\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9195\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9196\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9197\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9198\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9199\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9200\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9201\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9202\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9203\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9204\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9205\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9206\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9207\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9208\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9209\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9210\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9211\tpolished_granite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9212\tpolished_granite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9213\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9214\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9215\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9216\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9217\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9218\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9219\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9220\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9221\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9222\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9223\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9224\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9225\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9226\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9227\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9228\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9229\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9230\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9231\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9232\tsmooth_red_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9233\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9234\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9235\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9236\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9237\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9238\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9239\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9240\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9241\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9242\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9243\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9244\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9245\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9246\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9247\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9248\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9249\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9250\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9251\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9252\tsmooth_red_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9253\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9254\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9255\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9256\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9257\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9258\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9259\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9260\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9261\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9262\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9263\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9264\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9265\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9266\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9267\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9268\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9269\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9270\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9271\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9272\tsmooth_red_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9273\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9274\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9275\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9276\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9277\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9278\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9279\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9280\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9281\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9282\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9283\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9284\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9285\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9286\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9287\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9288\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9289\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9290\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9291\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9292\tsmooth_red_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9293\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9294\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9295\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9296\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9297\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9298\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9299\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9300\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9301\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9302\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9303\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9304\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9305\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9306\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9307\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9308\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9309\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9310\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9311\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9312\tmossy_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9313\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9314\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9315\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9316\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9317\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9318\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9319\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9320\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9321\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9322\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9323\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9324\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9325\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9326\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9327\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9328\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9329\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9330\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9331\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9332\tmossy_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9333\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9334\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9335\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9336\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9337\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9338\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9339\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9340\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9341\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9342\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9343\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9344\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9345\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9346\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9347\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9348\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9349\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9350\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9351\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9352\tmossy_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9353\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9354\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9355\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9356\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9357\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9358\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9359\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9360\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9361\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9362\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9363\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9364\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9365\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9366\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9367\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9368\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9369\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9370\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9371\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9372\tmossy_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9373\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9374\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9375\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9376\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9377\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9378\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9379\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9380\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9381\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9382\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9383\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9384\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9385\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9386\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9387\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9388\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9389\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9390\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9391\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9392\tpolished_diorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9393\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9394\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9395\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9396\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9397\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9398\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9399\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9400\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9401\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9402\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9403\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9404\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9405\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9406\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9407\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9408\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9409\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9410\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9411\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9412\tpolished_diorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9413\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9414\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9415\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9416\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9417\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9418\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9419\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9420\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9421\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9422\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9423\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9424\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9425\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9426\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9427\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9428\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9429\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9430\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9431\tpolished_diorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9432\tpolished_diorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9433\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9434\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9435\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9436\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9437\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9438\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9439\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9440\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9441\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9442\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9443\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9444\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9445\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9446\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9447\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9448\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9449\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9450\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9451\tpolished_diorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9452\tpolished_diorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9453\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9454\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9455\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9456\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9457\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9458\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9459\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9460\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9461\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9462\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9463\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9464\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9465\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9466\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9467\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9468\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9469\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9470\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9471\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9472\tmossy_cobblestone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9473\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9474\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9475\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9476\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9477\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9478\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9479\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9480\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9481\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9482\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9483\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9484\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9485\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9486\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9487\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9488\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9489\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9490\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9491\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9492\tmossy_cobblestone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9493\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9494\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9495\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9496\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9497\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9498\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9499\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9500\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9501\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9502\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9503\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9504\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9505\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9506\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9507\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9508\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9509\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9510\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9511\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9512\tmossy_cobblestone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9513\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9514\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9515\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9516\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9517\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9518\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9519\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9520\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9521\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9522\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9523\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9524\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9525\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9526\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9527\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9528\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9529\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9530\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9531\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9532\tmossy_cobblestone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9533\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9534\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9535\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9536\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9537\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9538\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9539\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9540\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9541\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9542\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9543\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9544\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9545\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9546\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9547\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9548\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9549\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9550\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9551\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9552\tend_stone_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9553\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9554\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9555\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9556\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9557\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9558\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9559\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9560\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9561\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9562\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9563\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9564\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9565\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9566\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9567\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9568\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9569\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9570\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9571\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9572\tend_stone_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9573\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9574\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9575\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9576\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9577\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9578\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9579\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9580\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9581\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9582\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9583\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9584\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9585\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9586\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9587\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9588\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9589\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9590\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9591\tend_stone_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9592\tend_stone_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9593\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9594\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9595\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9596\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9597\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9598\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9599\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9600\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9601\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9602\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9603\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9604\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9605\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9606\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9607\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9608\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9609\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9610\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9611\tend_stone_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9612\tend_stone_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9613\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9614\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9615\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9616\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9617\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9618\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9619\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9620\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9621\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9622\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9623\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9624\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9625\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9626\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9627\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9628\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9629\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9630\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9631\tstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9632\tstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9633\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9634\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9635\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9636\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9637\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9638\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9639\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9640\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9641\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9642\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9643\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9644\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9645\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9646\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9647\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9648\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9649\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9650\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9651\tstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9652\tstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9653\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9654\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9655\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9656\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9657\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9658\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9659\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9660\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9661\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9662\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9663\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9664\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9665\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9666\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9667\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9668\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9669\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9670\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9671\tstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9672\tstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9673\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9674\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9675\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9676\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9677\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9678\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9679\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9680\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9681\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9682\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9683\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9684\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9685\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9686\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9687\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9688\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9689\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9690\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9691\tstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9692\tstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9693\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9694\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9695\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9696\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9697\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9698\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9699\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9700\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9701\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9702\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9703\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9704\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9705\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9706\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9707\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9708\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9709\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9710\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9711\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9712\tsmooth_sandstone_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9713\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9714\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9715\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9716\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9717\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9718\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9719\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9720\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9721\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9722\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9723\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9724\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9725\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9726\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9727\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9728\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9729\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9730\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9731\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9732\tsmooth_sandstone_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9733\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9734\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9735\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9736\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9737\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9738\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9739\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9740\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9741\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9742\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9743\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9744\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9745\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9746\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9747\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9748\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9749\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9750\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9751\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9752\tsmooth_sandstone_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9753\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9754\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9755\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9756\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9757\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9758\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9759\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9760\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9761\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9762\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9763\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9764\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9765\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9766\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9767\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9768\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9769\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9770\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9771\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9772\tsmooth_sandstone_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9773\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9774\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9775\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9776\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9777\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9778\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9779\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9780\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9781\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9782\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9783\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9784\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9785\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9786\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9787\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9788\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9789\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9790\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9791\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9792\tsmooth_quartz_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9793\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9794\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9795\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9796\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9797\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9798\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9799\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9800\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9801\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9802\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9803\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9804\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9805\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9806\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9807\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9808\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9809\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9810\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9811\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9812\tsmooth_quartz_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9813\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9814\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9815\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9816\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9817\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9818\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9819\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9820\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9821\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9822\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9823\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9824\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9825\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9826\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9827\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9828\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9829\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9830\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9831\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9832\tsmooth_quartz_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9833\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9834\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9835\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9836\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9837\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9838\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9839\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9840\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9841\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9842\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9843\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9844\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9845\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9846\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9847\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9848\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9849\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9850\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9851\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9852\tsmooth_quartz_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9853\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9854\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9855\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9856\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9857\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9858\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9859\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9860\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9861\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9862\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9863\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9864\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9865\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9866\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9867\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9868\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9869\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9870\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9871\tgranite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9872\tgranite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9873\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9874\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9875\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9876\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9877\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9878\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9879\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9880\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9881\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9882\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9883\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9884\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9885\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9886\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9887\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9888\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9889\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9890\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9891\tgranite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9892\tgranite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9893\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9894\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9895\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9896\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9897\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9898\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9899\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9900\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9901\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9902\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9903\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9904\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9905\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9906\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9907\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9908\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9909\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9910\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9911\tgranite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9912\tgranite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9913\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9914\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9915\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9916\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9917\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9918\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9919\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9920\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9921\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9922\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9923\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9924\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9925\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9926\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9927\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9928\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9929\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9930\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9931\tgranite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9932\tgranite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9933\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9934\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9935\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9936\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9937\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9938\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9939\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9940\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9941\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9942\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9943\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9944\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9945\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9946\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9947\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9948\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9949\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9950\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9951\tandesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9952\tandesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9953\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9954\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9955\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9956\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9957\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9958\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9959\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9960\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9961\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9962\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9963\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9964\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9965\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9966\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9967\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9968\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9969\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9970\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9971\tandesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9972\tandesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9973\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9974\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9975\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9976\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9977\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9978\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9979\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n9980\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n9981\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n9982\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n9983\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n9984\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n9985\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n9986\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n9987\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n9988\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n9989\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n9990\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n9991\tandesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n9992\tandesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n9993\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n9994\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n9995\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n9996\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n9997\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n9998\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n9999\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10000\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10001\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10002\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10003\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10004\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10005\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10006\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10007\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10008\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10009\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10010\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10011\tandesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10012\tandesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10013\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10014\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10015\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10016\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10017\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10018\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10019\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10020\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10021\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10022\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10023\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10024\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10025\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10026\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10027\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10028\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10029\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10030\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10031\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10032\tred_nether_brick_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10033\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10034\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10035\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10036\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10037\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10038\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10039\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10040\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10041\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10042\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10043\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10044\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10045\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10046\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10047\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10048\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10049\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10050\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10051\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10052\tred_nether_brick_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10053\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10054\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10055\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10056\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10057\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10058\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10059\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10060\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10061\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10062\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10063\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10064\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10065\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10066\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10067\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10068\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10069\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10070\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10071\tred_nether_brick_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10072\tred_nether_brick_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10073\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10074\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10075\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10076\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10077\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10078\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10079\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10080\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10081\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10082\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10083\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10084\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10085\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10086\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10087\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10088\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10089\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10090\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10091\tred_nether_brick_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10092\tred_nether_brick_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10093\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10094\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10095\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10096\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10097\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10098\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10099\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10100\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10101\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10102\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10103\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10104\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10105\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10106\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10107\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10108\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10109\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10110\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10111\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10112\tpolished_andesite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10113\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10114\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10115\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10116\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10117\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10118\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10119\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10120\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10121\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10122\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10123\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10124\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10125\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10126\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10127\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10128\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10129\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10130\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10131\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10132\tpolished_andesite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10133\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10134\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10135\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10136\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10137\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10138\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10139\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10140\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10141\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10142\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10143\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10144\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10145\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10146\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10147\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10148\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10149\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10150\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10151\tpolished_andesite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10152\tpolished_andesite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10153\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10154\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10155\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10156\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10157\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10158\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10159\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10160\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10161\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10162\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10163\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10164\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10165\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10166\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10167\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10168\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10169\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10170\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10171\tpolished_andesite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10172\tpolished_andesite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10173\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10174\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10175\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10176\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10177\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10178\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10179\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10180\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10181\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10182\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10183\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10184\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10185\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10186\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10187\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10188\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10189\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10190\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10191\tdiorite_stairs\tfacing\tnorth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10192\tdiorite_stairs\tfacing\tnorth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10193\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10194\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10195\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10196\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10197\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10198\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10199\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10200\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10201\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10202\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10203\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10204\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10205\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10206\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10207\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10208\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10209\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10210\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10211\tdiorite_stairs\tfacing\tsouth\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10212\tdiorite_stairs\tfacing\tsouth\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10213\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10214\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10215\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10216\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10217\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10218\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10219\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10220\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10221\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10222\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10223\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10224\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10225\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10226\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10227\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10228\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10229\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10230\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10231\tdiorite_stairs\tfacing\twest\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10232\tdiorite_stairs\tfacing\twest\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10233\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\ttop\n10234\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\ttop\n10235\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\ttop\n10236\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\ttop\n10237\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\ttop\n10238\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\ttop\n10239\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\ttop\n10240\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\ttop\n10241\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\ttop\n10242\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\ttop\n10243\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tstraight\thalf\tbottom\n10244\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tstraight\thalf\tbottom\n10245\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_left\thalf\tbottom\n10246\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_left\thalf\tbottom\n10247\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\tinner_right\thalf\tbottom\n10248\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\tinner_right\thalf\tbottom\n10249\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_left\thalf\tbottom\n10250\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_left\thalf\tbottom\n10251\tdiorite_stairs\tfacing\teast\twaterlogged\ttrue\tshape\touter_right\thalf\tbottom\n10252\tdiorite_stairs\tfacing\teast\twaterlogged\tfalse\tshape\touter_right\thalf\tbottom\n10253\tpolished_granite_slab\ttype\ttop\twaterlogged\ttrue\n10254\tpolished_granite_slab\ttype\ttop\twaterlogged\tfalse\n10255\tpolished_granite_slab\ttype\tbottom\twaterlogged\ttrue\n10256\tpolished_granite_slab\ttype\tbottom\twaterlogged\tfalse\n10257\tpolished_granite_slab\ttype\tdouble\twaterlogged\ttrue\n10258\tpolished_granite_slab\ttype\tdouble\twaterlogged\tfalse\n10259\tsmooth_red_sandstone_slab\ttype\ttop\twaterlogged\ttrue\n10260\tsmooth_red_sandstone_slab\ttype\ttop\twaterlogged\tfalse\n10261\tsmooth_red_sandstone_slab\ttype\tbottom\twaterlogged\ttrue\n10262\tsmooth_red_sandstone_slab\ttype\tbottom\twaterlogged\tfalse\n10263\tsmooth_red_sandstone_slab\ttype\tdouble\twaterlogged\ttrue\n10264\tsmooth_red_sandstone_slab\ttype\tdouble\twaterlogged\tfalse\n10265\tmossy_stone_brick_slab\ttype\ttop\twaterlogged\ttrue\n10266\tmossy_stone_brick_slab\ttype\ttop\twaterlogged\tfalse\n10267\tmossy_stone_brick_slab\ttype\tbottom\twaterlogged\ttrue\n10268\tmossy_stone_brick_slab\ttype\tbottom\twaterlogged\tfalse\n10269\tmossy_stone_brick_slab\ttype\tdouble\twaterlogged\ttrue\n10270\tmossy_stone_brick_slab\ttype\tdouble\twaterlogged\tfalse\n10271\tpolished_diorite_slab\ttype\ttop\twaterlogged\ttrue\n10272\tpolished_diorite_slab\ttype\ttop\twaterlogged\tfalse\n10273\tpolished_diorite_slab\ttype\tbottom\twaterlogged\ttrue\n10274\tpolished_diorite_slab\ttype\tbottom\twaterlogged\tfalse\n10275\tpolished_diorite_slab\ttype\tdouble\twaterlogged\ttrue\n10276\tpolished_diorite_slab\ttype\tdouble\twaterlogged\tfalse\n10277\tmossy_cobblestone_slab\ttype\ttop\twaterlogged\ttrue\n10278\tmossy_cobblestone_slab\ttype\ttop\twaterlogged\tfalse\n10279\tmossy_cobblestone_slab\ttype\tbottom\twaterlogged\ttrue\n10280\tmossy_cobblestone_slab\ttype\tbottom\twaterlogged\tfalse\n10281\tmossy_cobblestone_slab\ttype\tdouble\twaterlogged\ttrue\n10282\tmossy_cobblestone_slab\ttype\tdouble\twaterlogged\tfalse\n10283\tend_stone_brick_slab\ttype\ttop\twaterlogged\ttrue\n10284\tend_stone_brick_slab\ttype\ttop\twaterlogged\tfalse\n10285\tend_stone_brick_slab\ttype\tbottom\twaterlogged\ttrue\n10286\tend_stone_brick_slab\ttype\tbottom\twaterlogged\tfalse\n10287\tend_stone_brick_slab\ttype\tdouble\twaterlogged\ttrue\n10288\tend_stone_brick_slab\ttype\tdouble\twaterlogged\tfalse\n10289\tsmooth_sandstone_slab\ttype\ttop\twaterlogged\ttrue\n10290\tsmooth_sandstone_slab\ttype\ttop\twaterlogged\tfalse\n10291\tsmooth_sandstone_slab\ttype\tbottom\twaterlogged\ttrue\n10292\tsmooth_sandstone_slab\ttype\tbottom\twaterlogged\tfalse\n10293\tsmooth_sandstone_slab\ttype\tdouble\twaterlogged\ttrue\n10294\tsmooth_sandstone_slab\ttype\tdouble\twaterlogged\tfalse\n10295\tsmooth_quartz_slab\ttype\ttop\twaterlogged\ttrue\n10296\tsmooth_quartz_slab\ttype\ttop\twaterlogged\tfalse\n10297\tsmooth_quartz_slab\ttype\tbottom\twaterlogged\ttrue\n10298\tsmooth_quartz_slab\ttype\tbottom\twaterlogged\tfalse\n10299\tsmooth_quartz_slab\ttype\tdouble\twaterlogged\ttrue\n10300\tsmooth_quartz_slab\ttype\tdouble\twaterlogged\tfalse\n10301\tgranite_slab\ttype\ttop\twaterlogged\ttrue\n10302\tgranite_slab\ttype\ttop\twaterlogged\tfalse\n10303\tgranite_slab\ttype\tbottom\twaterlogged\ttrue\n10304\tgranite_slab\ttype\tbottom\twaterlogged\tfalse\n10305\tgranite_slab\ttype\tdouble\twaterlogged\ttrue\n10306\tgranite_slab\ttype\tdouble\twaterlogged\tfalse\n10307\tandesite_slab\ttype\ttop\twaterlogged\ttrue\n10308\tandesite_slab\ttype\ttop\twaterlogged\tfalse\n10309\tandesite_slab\ttype\tbottom\twaterlogged\ttrue\n10310\tandesite_slab\ttype\tbottom\twaterlogged\tfalse\n10311\tandesite_slab\ttype\tdouble\twaterlogged\ttrue\n10312\tandesite_slab\ttype\tdouble\twaterlogged\tfalse\n10313\tred_nether_brick_slab\ttype\ttop\twaterlogged\ttrue\n10314\tred_nether_brick_slab\ttype\ttop\twaterlogged\tfalse\n10315\tred_nether_brick_slab\ttype\tbottom\twaterlogged\ttrue\n10316\tred_nether_brick_slab\ttype\tbottom\twaterlogged\tfalse\n10317\tred_nether_brick_slab\ttype\tdouble\twaterlogged\ttrue\n10318\tred_nether_brick_slab\ttype\tdouble\twaterlogged\tfalse\n10319\tpolished_andesite_slab\ttype\ttop\twaterlogged\ttrue\n10320\tpolished_andesite_slab\ttype\ttop\twaterlogged\tfalse\n10321\tpolished_andesite_slab\ttype\tbottom\twaterlogged\ttrue\n10322\tpolished_andesite_slab\ttype\tbottom\twaterlogged\tfalse\n10323\tpolished_andesite_slab\ttype\tdouble\twaterlogged\ttrue\n10324\tpolished_andesite_slab\ttype\tdouble\twaterlogged\tfalse\n10325\tdiorite_slab\ttype\ttop\twaterlogged\ttrue\n10326\tdiorite_slab\ttype\ttop\twaterlogged\tfalse\n10327\tdiorite_slab\ttype\tbottom\twaterlogged\ttrue\n10328\tdiorite_slab\ttype\tbottom\twaterlogged\tfalse\n10329\tdiorite_slab\ttype\tdouble\twaterlogged\ttrue\n10330\tdiorite_slab\ttype\tdouble\twaterlogged\tfalse\n10331\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10332\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10333\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10334\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10335\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10336\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10337\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10338\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10339\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10340\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10341\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10342\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10343\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10344\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10345\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10346\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10347\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10348\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10349\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10350\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10351\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10352\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10353\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10354\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10355\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10356\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10357\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10358\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10359\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10360\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10361\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10362\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10363\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10364\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10365\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10366\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10367\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10368\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10369\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10370\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10371\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10372\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10373\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10374\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10375\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10376\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10377\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10378\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10379\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10380\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10381\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10382\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10383\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10384\tbrick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10385\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10386\tbrick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10387\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10388\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10389\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10390\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10391\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10392\tbrick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10393\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10394\tbrick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10395\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10396\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10397\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10398\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10399\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10400\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10401\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10402\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10403\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10404\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10405\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10406\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10407\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10408\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10409\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10410\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10411\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10412\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10413\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10414\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10415\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10416\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10417\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10418\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10419\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10420\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10421\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10422\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10423\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10424\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10425\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10426\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10427\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10428\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10429\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10430\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10431\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10432\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10433\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10434\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10435\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10436\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10437\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10438\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10439\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10440\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10441\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10442\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10443\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10444\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10445\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10446\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10447\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10448\tprismarine_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10449\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10450\tprismarine_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10451\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10452\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10453\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10454\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10455\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10456\tprismarine_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10457\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10458\tprismarine_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10459\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10460\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10461\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10462\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10463\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10464\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10465\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10466\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10467\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10468\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10469\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10470\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10471\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10472\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10473\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10474\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10475\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10476\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10477\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10478\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10479\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10480\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10481\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10482\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10483\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10484\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10485\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10486\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10487\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10488\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10489\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10490\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10491\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10492\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10493\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10494\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10495\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10496\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10497\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10498\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10499\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10500\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10501\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10502\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10503\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10504\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10505\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10506\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10507\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10508\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10509\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10510\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10511\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10512\tred_sandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10513\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10514\tred_sandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10515\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10516\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10517\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10518\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10519\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10520\tred_sandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10521\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10522\tred_sandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10523\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10524\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10525\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10526\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10527\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10528\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10529\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10530\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10531\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10532\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10533\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10534\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10535\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10536\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10537\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10538\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10539\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10540\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10541\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10542\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10543\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10544\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10545\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10546\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10547\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10548\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10549\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10550\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10551\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10552\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10553\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10554\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10555\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10556\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10557\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10558\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10559\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10560\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10561\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10562\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10563\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10564\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10565\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10566\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10567\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10568\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10569\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10570\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10571\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10572\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10573\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10574\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10575\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10576\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10577\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10578\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10579\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10580\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10581\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10582\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10583\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10584\tmossy_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10585\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10586\tmossy_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10587\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10588\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10589\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10590\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10591\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10592\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10593\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10594\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10595\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10596\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10597\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10598\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10599\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10600\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10601\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10602\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10603\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10604\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10605\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10606\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10607\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10608\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10609\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10610\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10611\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10612\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10613\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10614\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10615\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10616\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10617\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10618\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10619\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10620\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10621\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10622\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10623\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10624\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10625\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10626\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10627\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10628\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10629\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10630\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10631\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10632\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10633\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10634\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10635\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10636\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10637\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10638\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10639\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10640\tgranite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10641\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10642\tgranite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10643\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10644\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10645\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10646\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10647\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10648\tgranite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10649\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10650\tgranite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10651\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10652\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10653\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10654\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10655\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10656\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10657\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10658\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10659\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10660\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10661\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10662\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10663\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10664\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10665\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10666\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10667\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10668\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10669\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10670\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10671\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10672\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10673\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10674\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10675\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10676\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10677\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10678\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10679\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10680\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10681\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10682\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10683\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10684\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10685\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10686\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10687\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10688\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10689\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10690\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10691\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10692\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10693\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10694\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10695\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10696\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10697\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10698\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10699\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10700\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10701\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10702\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10703\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10704\tstone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10705\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10706\tstone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10707\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10708\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10709\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10710\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10711\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10712\tstone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10713\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10714\tstone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10715\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10716\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10717\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10718\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10719\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10720\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10721\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10722\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10723\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10724\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10725\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10726\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10727\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10728\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10729\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10730\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10731\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10732\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10733\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10734\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10735\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10736\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10737\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10738\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10739\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10740\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10741\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10742\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10743\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10744\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10745\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10746\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10747\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10748\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10749\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10750\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10751\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10752\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10753\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10754\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10755\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10756\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10757\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10758\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10759\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10760\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10761\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10762\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10763\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10764\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10765\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10766\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10767\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10768\tnether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10769\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10770\tnether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10771\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10772\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10773\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10774\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10775\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10776\tnether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10777\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10778\tnether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10779\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10780\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10781\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10782\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10783\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10784\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10785\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10786\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10787\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10788\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10789\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10790\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10791\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10792\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10793\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10794\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10795\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10796\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10797\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10798\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10799\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10800\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10801\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10802\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10803\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10804\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10805\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10806\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10807\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10808\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10809\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10810\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10811\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10812\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10813\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10814\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10815\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10816\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10817\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10818\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10819\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10820\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10821\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10822\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10823\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10824\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10825\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10826\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10827\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10828\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10829\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10830\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10831\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10832\tandesite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10833\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10834\tandesite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10835\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10836\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10837\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10838\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10839\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10840\tandesite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10841\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10842\tandesite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10843\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10844\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10845\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10846\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10847\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10848\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10849\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10850\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10851\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10852\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10853\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10854\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10855\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10856\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10857\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10858\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10859\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10860\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10861\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10862\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10863\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10864\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10865\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10866\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10867\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10868\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10869\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10870\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10871\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10872\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10873\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10874\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10875\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10876\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10877\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10878\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10879\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10880\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10881\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10882\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10883\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10884\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10885\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10886\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10887\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10888\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10889\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10890\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10891\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10892\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10893\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10894\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10895\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10896\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10897\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10898\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10899\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10900\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10901\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10902\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10903\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10904\tred_nether_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10905\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10906\tred_nether_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10907\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10908\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10909\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10910\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10911\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10912\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10913\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10914\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10915\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10916\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10917\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10918\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10919\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10920\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10921\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10922\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10923\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10924\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10925\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10926\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10927\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10928\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10929\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10930\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10931\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10932\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10933\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10934\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10935\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10936\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10937\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10938\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10939\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10940\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10941\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10942\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10943\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10944\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10945\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10946\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10947\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10948\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10949\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n10950\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n10951\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10952\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10953\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n10954\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n10955\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10956\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10957\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10958\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10959\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10960\tsandstone_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10961\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10962\tsandstone_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10963\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10964\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10965\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n10966\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n10967\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10968\tsandstone_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10969\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n10970\tsandstone_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n10971\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10972\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10973\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10974\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10975\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10976\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10977\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10978\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10979\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10980\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10981\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n10982\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n10983\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10984\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10985\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n10986\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n10987\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10988\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10989\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10990\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10991\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10992\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10993\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n10994\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n10995\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10996\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10997\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n10998\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n10999\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n11000\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n11001\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n11002\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n11003\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n11004\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n11005\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n11006\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n11007\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n11008\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n11009\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n11010\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n11011\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n11012\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n11013\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n11014\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n11015\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n11016\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n11017\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n11018\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n11019\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n11020\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n11021\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n11022\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n11023\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n11024\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n11025\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n11026\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n11027\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n11028\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n11029\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n11030\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n11031\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n11032\tend_stone_brick_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n11033\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n11034\tend_stone_brick_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n11035\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n11036\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n11037\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n11038\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n11039\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n11040\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n11041\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n11042\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n11043\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n11044\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n11045\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n11046\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n11047\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n11048\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n11049\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n11050\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\tfalse\n11051\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n11052\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n11053\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n11054\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n11055\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n11056\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n11057\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n11058\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n11059\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n11060\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n11061\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n11062\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n11063\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n11064\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n11065\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\ttrue\n11066\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\tfalse\twest\tfalse\n11067\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n11068\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n11069\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n11070\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n11071\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n11072\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n11073\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n11074\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n11075\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n11076\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n11077\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n11078\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n11079\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n11080\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n11081\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\ttrue\n11082\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\tfalse\twest\tfalse\n11083\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n11084\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n11085\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n11086\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n11087\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n11088\tdiorite_wall\twaterlogged\ttrue\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n11089\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n11090\tdiorite_wall\twaterlogged\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n11091\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n11092\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n11093\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n11094\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n11095\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n11096\tdiorite_wall\twaterlogged\ttrue\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n11097\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\ttrue\n11098\tdiorite_wall\twaterlogged\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n11099\tscaffolding\tdistance\t0\twaterlogged\ttrue\tbottom\ttrue\n11100\tscaffolding\tdistance\t0\twaterlogged\tfalse\tbottom\ttrue\n11101\tscaffolding\tdistance\t1\twaterlogged\ttrue\tbottom\ttrue\n11102\tscaffolding\tdistance\t1\twaterlogged\tfalse\tbottom\ttrue\n11103\tscaffolding\tdistance\t2\twaterlogged\ttrue\tbottom\ttrue\n11104\tscaffolding\tdistance\t2\twaterlogged\tfalse\tbottom\ttrue\n11105\tscaffolding\tdistance\t3\twaterlogged\ttrue\tbottom\ttrue\n11106\tscaffolding\tdistance\t3\twaterlogged\tfalse\tbottom\ttrue\n11107\tscaffolding\tdistance\t4\twaterlogged\ttrue\tbottom\ttrue\n11108\tscaffolding\tdistance\t4\twaterlogged\tfalse\tbottom\ttrue\n11109\tscaffolding\tdistance\t5\twaterlogged\ttrue\tbottom\ttrue\n11110\tscaffolding\tdistance\t5\twaterlogged\tfalse\tbottom\ttrue\n11111\tscaffolding\tdistance\t6\twaterlogged\ttrue\tbottom\ttrue\n11112\tscaffolding\tdistance\t6\twaterlogged\tfalse\tbottom\ttrue\n11113\tscaffolding\tdistance\t7\twaterlogged\ttrue\tbottom\ttrue\n11114\tscaffolding\tdistance\t7\twaterlogged\tfalse\tbottom\ttrue\n11115\tscaffolding\tdistance\t0\twaterlogged\ttrue\tbottom\tfalse\n11116\tscaffolding\tdistance\t0\twaterlogged\tfalse\tbottom\tfalse\n11117\tscaffolding\tdistance\t1\twaterlogged\ttrue\tbottom\tfalse\n11118\tscaffolding\tdistance\t1\twaterlogged\tfalse\tbottom\tfalse\n11119\tscaffolding\tdistance\t2\twaterlogged\ttrue\tbottom\tfalse\n11120\tscaffolding\tdistance\t2\twaterlogged\tfalse\tbottom\tfalse\n11121\tscaffolding\tdistance\t3\twaterlogged\ttrue\tbottom\tfalse\n11122\tscaffolding\tdistance\t3\twaterlogged\tfalse\tbottom\tfalse\n11123\tscaffolding\tdistance\t4\twaterlogged\ttrue\tbottom\tfalse\n11124\tscaffolding\tdistance\t4\twaterlogged\tfalse\tbottom\tfalse\n11125\tscaffolding\tdistance\t5\twaterlogged\ttrue\tbottom\tfalse\n11126\tscaffolding\tdistance\t5\twaterlogged\tfalse\tbottom\tfalse\n11127\tscaffolding\tdistance\t6\twaterlogged\ttrue\tbottom\tfalse\n11128\tscaffolding\tdistance\t6\twaterlogged\tfalse\tbottom\tfalse\n11129\tscaffolding\tdistance\t7\twaterlogged\ttrue\tbottom\tfalse\n11130\tscaffolding\tdistance\t7\twaterlogged\tfalse\tbottom\tfalse\n11131\tloom\tfacing\tnorth\n11132\tloom\tfacing\tsouth\n11133\tloom\tfacing\twest\n11134\tloom\tfacing\teast\n11135\tbarrel\tfacing\tnorth\topen\ttrue\n11136\tbarrel\tfacing\tnorth\topen\tfalse\n11137\tbarrel\tfacing\teast\topen\ttrue\n11138\tbarrel\tfacing\teast\topen\tfalse\n11139\tbarrel\tfacing\tsouth\topen\ttrue\n11140\tbarrel\tfacing\tsouth\topen\tfalse\n11141\tbarrel\tfacing\twest\topen\ttrue\n11142\tbarrel\tfacing\twest\topen\tfalse\n11143\tbarrel\tfacing\tup\topen\ttrue\n11144\tbarrel\tfacing\tup\topen\tfalse\n11145\tbarrel\tfacing\tdown\topen\ttrue\n11146\tbarrel\tfacing\tdown\topen\tfalse\n11147\tsmoker\tfacing\tnorth\tlit\ttrue\n11148\tsmoker\tfacing\tnorth\tlit\tfalse\n11149\tsmoker\tfacing\tsouth\tlit\ttrue\n11150\tsmoker\tfacing\tsouth\tlit\tfalse\n11151\tsmoker\tfacing\twest\tlit\ttrue\n11152\tsmoker\tfacing\twest\tlit\tfalse\n11153\tsmoker\tfacing\teast\tlit\ttrue\n11154\tsmoker\tfacing\teast\tlit\tfalse\n11155\tblast_furnace\tfacing\tnorth\tlit\ttrue\n11156\tblast_furnace\tfacing\tnorth\tlit\tfalse\n11157\tblast_furnace\tfacing\tsouth\tlit\ttrue\n11158\tblast_furnace\tfacing\tsouth\tlit\tfalse\n11159\tblast_furnace\tfacing\twest\tlit\ttrue\n11160\tblast_furnace\tfacing\twest\tlit\tfalse\n11161\tblast_furnace\tfacing\teast\tlit\ttrue\n11162\tblast_furnace\tfacing\teast\tlit\tfalse\n11163\tcartography_table\n11164\tfletching_table\n11165\tgrindstone\tface\tfloor\tfacing\tnorth\n11166\tgrindstone\tface\tfloor\tfacing\tsouth\n11167\tgrindstone\tface\tfloor\tfacing\twest\n11168\tgrindstone\tface\tfloor\tfacing\teast\n11169\tgrindstone\tface\twall\tfacing\tnorth\n11170\tgrindstone\tface\twall\tfacing\tsouth\n11171\tgrindstone\tface\twall\tfacing\twest\n11172\tgrindstone\tface\twall\tfacing\teast\n11173\tgrindstone\tface\tceiling\tfacing\tnorth\n11174\tgrindstone\tface\tceiling\tfacing\tsouth\n11175\tgrindstone\tface\tceiling\tfacing\twest\n11176\tgrindstone\tface\tceiling\tfacing\teast\n11177\tlectern\tfacing\tnorth\thas_book\ttrue\tpowered\ttrue\n11178\tlectern\tfacing\tnorth\thas_book\ttrue\tpowered\tfalse\n11179\tlectern\tfacing\tnorth\thas_book\tfalse\tpowered\ttrue\n11180\tlectern\tfacing\tnorth\thas_book\tfalse\tpowered\tfalse\n11181\tlectern\tfacing\tsouth\thas_book\ttrue\tpowered\ttrue\n11182\tlectern\tfacing\tsouth\thas_book\ttrue\tpowered\tfalse\n11183\tlectern\tfacing\tsouth\thas_book\tfalse\tpowered\ttrue\n11184\tlectern\tfacing\tsouth\thas_book\tfalse\tpowered\tfalse\n11185\tlectern\tfacing\twest\thas_book\ttrue\tpowered\ttrue\n11186\tlectern\tfacing\twest\thas_book\ttrue\tpowered\tfalse\n11187\tlectern\tfacing\twest\thas_book\tfalse\tpowered\ttrue\n11188\tlectern\tfacing\twest\thas_book\tfalse\tpowered\tfalse\n11189\tlectern\tfacing\teast\thas_book\ttrue\tpowered\ttrue\n11190\tlectern\tfacing\teast\thas_book\ttrue\tpowered\tfalse\n11191\tlectern\tfacing\teast\thas_book\tfalse\tpowered\ttrue\n11192\tlectern\tfacing\teast\thas_book\tfalse\tpowered\tfalse\n11193\tsmithing_table\n11194\tstonecutter\tfacing\tnorth\n11195\tstonecutter\tfacing\tsouth\n11196\tstonecutter\tfacing\twest\n11197\tstonecutter\tfacing\teast\n11198\tbell\tfacing\tnorth\tattachment\tfloor\n11199\tbell\tfacing\tsouth\tattachment\tfloor\n11200\tbell\tfacing\twest\tattachment\tfloor\n11201\tbell\tfacing\teast\tattachment\tfloor\n11202\tbell\tfacing\tnorth\tattachment\tceiling\n11203\tbell\tfacing\tsouth\tattachment\tceiling\n11204\tbell\tfacing\twest\tattachment\tceiling\n11205\tbell\tfacing\teast\tattachment\tceiling\n11206\tbell\tfacing\tnorth\tattachment\tsingle_wall\n11207\tbell\tfacing\tsouth\tattachment\tsingle_wall\n11208\tbell\tfacing\twest\tattachment\tsingle_wall\n11209\tbell\tfacing\teast\tattachment\tsingle_wall\n11210\tbell\tfacing\tnorth\tattachment\tdouble_wall\n11211\tbell\tfacing\tsouth\tattachment\tdouble_wall\n11212\tbell\tfacing\twest\tattachment\tdouble_wall\n11213\tbell\tfacing\teast\tattachment\tdouble_wall\n11214\tlantern\thanging\ttrue\n11215\tlantern\thanging\tfalse\n11216\tcampfire\tfacing\tnorth\twaterlogged\ttrue\tsignal_fire\ttrue\tlit\ttrue\n11217\tcampfire\tfacing\tnorth\twaterlogged\tfalse\tsignal_fire\ttrue\tlit\ttrue\n11218\tcampfire\tfacing\tnorth\twaterlogged\ttrue\tsignal_fire\tfalse\tlit\ttrue\n11219\tcampfire\tfacing\tnorth\twaterlogged\tfalse\tsignal_fire\tfalse\tlit\ttrue\n11220\tcampfire\tfacing\tnorth\twaterlogged\ttrue\tsignal_fire\ttrue\tlit\tfalse\n11221\tcampfire\tfacing\tnorth\twaterlogged\tfalse\tsignal_fire\ttrue\tlit\tfalse\n11222\tcampfire\tfacing\tnorth\twaterlogged\ttrue\tsignal_fire\tfalse\tlit\tfalse\n11223\tcampfire\tfacing\tnorth\twaterlogged\tfalse\tsignal_fire\tfalse\tlit\tfalse\n11224\tcampfire\tfacing\tsouth\twaterlogged\ttrue\tsignal_fire\ttrue\tlit\ttrue\n11225\tcampfire\tfacing\tsouth\twaterlogged\tfalse\tsignal_fire\ttrue\tlit\ttrue\n11226\tcampfire\tfacing\tsouth\twaterlogged\ttrue\tsignal_fire\tfalse\tlit\ttrue\n11227\tcampfire\tfacing\tsouth\twaterlogged\tfalse\tsignal_fire\tfalse\tlit\ttrue\n11228\tcampfire\tfacing\tsouth\twaterlogged\ttrue\tsignal_fire\ttrue\tlit\tfalse\n11229\tcampfire\tfacing\tsouth\twaterlogged\tfalse\tsignal_fire\ttrue\tlit\tfalse\n11230\tcampfire\tfacing\tsouth\twaterlogged\ttrue\tsignal_fire\tfalse\tlit\tfalse\n11231\tcampfire\tfacing\tsouth\twaterlogged\tfalse\tsignal_fire\tfalse\tlit\tfalse\n11232\tcampfire\tfacing\twest\twaterlogged\ttrue\tsignal_fire\ttrue\tlit\ttrue\n11233\tcampfire\tfacing\twest\twaterlogged\tfalse\tsignal_fire\ttrue\tlit\ttrue\n11234\tcampfire\tfacing\twest\twaterlogged\ttrue\tsignal_fire\tfalse\tlit\ttrue\n11235\tcampfire\tfacing\twest\twaterlogged\tfalse\tsignal_fire\tfalse\tlit\ttrue\n11236\tcampfire\tfacing\twest\twaterlogged\ttrue\tsignal_fire\ttrue\tlit\tfalse\n11237\tcampfire\tfacing\twest\twaterlogged\tfalse\tsignal_fire\ttrue\tlit\tfalse\n11238\tcampfire\tfacing\twest\twaterlogged\ttrue\tsignal_fire\tfalse\tlit\tfalse\n11239\tcampfire\tfacing\twest\twaterlogged\tfalse\tsignal_fire\tfalse\tlit\tfalse\n11240\tcampfire\tfacing\teast\twaterlogged\ttrue\tsignal_fire\ttrue\tlit\ttrue\n11241\tcampfire\tfacing\teast\twaterlogged\tfalse\tsignal_fire\ttrue\tlit\ttrue\n11242\tcampfire\tfacing\teast\twaterlogged\ttrue\tsignal_fire\tfalse\tlit\ttrue\n11243\tcampfire\tfacing\teast\twaterlogged\tfalse\tsignal_fire\tfalse\tlit\ttrue\n11244\tcampfire\tfacing\teast\twaterlogged\ttrue\tsignal_fire\ttrue\tlit\tfalse\n11245\tcampfire\tfacing\teast\twaterlogged\tfalse\tsignal_fire\ttrue\tlit\tfalse\n11246\tcampfire\tfacing\teast\twaterlogged\ttrue\tsignal_fire\tfalse\tlit\tfalse\n11247\tcampfire\tfacing\teast\twaterlogged\tfalse\tsignal_fire\tfalse\tlit\tfalse\n11248\tsweet_berry_bush\tage\t0\n11249\tsweet_berry_bush\tage\t1\n11250\tsweet_berry_bush\tage\t2\n11251\tsweet_berry_bush\tage\t3\n11252\tstructure_block\tmode\tsave\n11253\tstructure_block\tmode\tload\n11254\tstructure_block\tmode\tcorner\n11255\tstructure_block\tmode\tdata\n11256\tjigsaw\tfacing\tnorth\n11257\tjigsaw\tfacing\teast\n11258\tjigsaw\tfacing\tsouth\n11259\tjigsaw\tfacing\twest\n11260\tjigsaw\tfacing\tup\n11261\tjigsaw\tfacing\tdown\n11262\tcomposter\tlevel\t0\n11263\tcomposter\tlevel\t1\n11264\tcomposter\tlevel\t2\n11265\tcomposter\tlevel\t3\n11266\tcomposter\tlevel\t4\n11267\tcomposter\tlevel\t5\n11268\tcomposter\tlevel\t6\n11269\tcomposter\tlevel\t7\n11270\tcomposter\tlevel\t8\n"
  },
  {
    "path": "Server/Protocol/UpgradeBlockTypePalette.txt",
    "content": "UpgradeBlockTypePalette\nFileVersion\t1\nCommonPrefix\tminecraft:\n\n0\t0\tair\n1\t0\tstone\n1\t1\tgranite\n1\t2\tpolished_granite\n1\t3\tdiorite\n1\t4\tpolished_diorite\n1\t5\tandesite\n1\t6\tpolished_andesite\n2\t0\tgrass_block\tsnowy\tfalse\n3\t0\tdirt\n3\t1\tcoarse_dirt\n3\t2\tpodzol\tsnowy\tfalse\n4\t0\tcobblestone\n5\t0\toak_planks\n5\t1\tspruce_planks\n5\t2\tbirch_planks\n5\t3\tjungle_planks\n5\t4\tacacia_planks\n5\t5\tdark_oak_planks\n6\t0\toak_sapling\tstage\t0\n6\t1\tspruce_sapling\tstage\t0\n6\t2\tbirch_sapling\tstage\t0\n6\t3\tjungle_sapling\tstage\t0\n6\t4\tacacia_sapling\tstage\t0\n6\t5\tdark_oak_sapling\tstage\t0\n6\t8\toak_sapling\tstage\t1\n6\t9\tspruce_sapling\tstage\t1\n6\t10\tbirch_sapling\tstage\t1\n6\t11\tjungle_sapling\tstage\t1\n6\t12\tacacia_sapling\tstage\t1\n6\t13\tdark_oak_sapling\tstage\t1\n7\t0\tbedrock\n8\t0\twater\tlevel\t0\n8\t1\twater\tlevel\t1\n8\t2\twater\tlevel\t2\n8\t3\twater\tlevel\t3\n8\t4\twater\tlevel\t4\n8\t5\twater\tlevel\t5\n8\t6\twater\tlevel\t6\n8\t7\twater\tlevel\t7\n8\t8\twater\tlevel\t8\n8\t9\twater\tlevel\t9\n8\t10\twater\tlevel\t10\n8\t11\twater\tlevel\t11\n8\t12\twater\tlevel\t12\n8\t13\twater\tlevel\t13\n8\t14\twater\tlevel\t14\n8\t15\twater\tlevel\t15\n9\t0\twater\tlevel\t0\n9\t1\twater\tlevel\t1\n9\t2\twater\tlevel\t2\n9\t3\twater\tlevel\t3\n9\t4\twater\tlevel\t4\n9\t5\twater\tlevel\t5\n9\t6\twater\tlevel\t6\n9\t7\twater\tlevel\t7\n9\t8\twater\tlevel\t8\n9\t9\twater\tlevel\t9\n9\t10\twater\tlevel\t10\n9\t11\twater\tlevel\t11\n9\t12\twater\tlevel\t12\n9\t13\twater\tlevel\t13\n9\t14\twater\tlevel\t14\n9\t15\twater\tlevel\t15\n10\t0\tlava\tlevel\t0\n10\t1\tlava\tlevel\t1\n10\t2\tlava\tlevel\t2\n10\t3\tlava\tlevel\t3\n10\t4\tlava\tlevel\t4\n10\t5\tlava\tlevel\t5\n10\t6\tlava\tlevel\t6\n10\t7\tlava\tlevel\t7\n10\t8\tlava\tlevel\t8\n10\t9\tlava\tlevel\t9\n10\t10\tlava\tlevel\t10\n10\t11\tlava\tlevel\t11\n10\t12\tlava\tlevel\t12\n10\t13\tlava\tlevel\t13\n10\t14\tlava\tlevel\t14\n10\t15\tlava\tlevel\t15\n11\t0\tlava\tlevel\t0\n11\t1\tlava\tlevel\t1\n11\t2\tlava\tlevel\t2\n11\t3\tlava\tlevel\t3\n11\t4\tlava\tlevel\t4\n11\t5\tlava\tlevel\t5\n11\t6\tlava\tlevel\t6\n11\t7\tlava\tlevel\t7\n11\t8\tlava\tlevel\t8\n11\t9\tlava\tlevel\t9\n11\t10\tlava\tlevel\t10\n11\t11\tlava\tlevel\t11\n11\t12\tlava\tlevel\t12\n11\t13\tlava\tlevel\t13\n11\t14\tlava\tlevel\t14\n11\t15\tlava\tlevel\t15\n12\t0\tsand\n12\t1\tred_sand\n13\t0\tgravel\n14\t0\tgold_ore\n15\t0\tiron_ore\n16\t0\tcoal_ore\n17\t0\toak_log\taxis\ty\n17\t1\tspruce_log\taxis\ty\n17\t2\tbirch_log\taxis\ty\n17\t3\tjungle_log\taxis\ty\n17\t4\toak_log\taxis\tx\n17\t5\tspruce_log\taxis\tx\n17\t6\tbirch_log\taxis\tx\n17\t7\tjungle_log\taxis\tx\n17\t8\toak_log\taxis\tz\n17\t9\tspruce_log\taxis\tz\n17\t10\tbirch_log\taxis\tz\n17\t11\tjungle_log\taxis\tz\n17\t12\toak_bark\n17\t13\tspruce_bark\n17\t14\tbirch_bark\n17\t15\tjungle_bark\n18\t0\toak_leaves\tdecayable\ttrue\tcheck_decay\tfalse\n18\t1\tspruce_leaves\tdecayable\ttrue\tcheck_decay\tfalse\n18\t2\tbirch_leaves\tdecayable\ttrue\tcheck_decay\tfalse\n18\t3\tjungle_leaves\tdecayable\ttrue\tcheck_decay\tfalse\n18\t4\toak_leaves\tdecayable\tfalse\tcheck_decay\tfalse\n18\t5\tspruce_leaves\tdecayable\tfalse\tcheck_decay\tfalse\n18\t6\tbirch_leaves\tdecayable\tfalse\tcheck_decay\tfalse\n18\t7\tjungle_leaves\tdecayable\tfalse\tcheck_decay\tfalse\n18\t8\toak_leaves\tdecayable\ttrue\tcheck_decay\ttrue\n18\t9\tspruce_leaves\tdecayable\ttrue\tcheck_decay\ttrue\n18\t10\tbirch_leaves\tdecayable\ttrue\tcheck_decay\ttrue\n18\t11\tjungle_leaves\tdecayable\ttrue\tcheck_decay\ttrue\n18\t12\toak_leaves\tdecayable\tfalse\tcheck_decay\ttrue\n18\t13\tspruce_leaves\tdecayable\tfalse\tcheck_decay\ttrue\n18\t14\tbirch_leaves\tdecayable\tfalse\tcheck_decay\ttrue\n18\t15\tjungle_leaves\tdecayable\tfalse\tcheck_decay\ttrue\n19\t0\tsponge\n19\t1\twet_sponge\n20\t0\tglass\n21\t0\tlapis_ore\n22\t0\tlapis_block\n23\t0\tdispenser\tfacing\tdown\ttriggered\tfalse\n23\t1\tdispenser\tfacing\tup\ttriggered\tfalse\n23\t2\tdispenser\tfacing\tnorth\ttriggered\tfalse\n23\t3\tdispenser\tfacing\tsouth\ttriggered\tfalse\n23\t4\tdispenser\tfacing\twest\ttriggered\tfalse\n23\t5\tdispenser\tfacing\teast\ttriggered\tfalse\n23\t8\tdispenser\tfacing\tdown\ttriggered\ttrue\n23\t9\tdispenser\tfacing\tup\ttriggered\ttrue\n23\t10\tdispenser\tfacing\tnorth\ttriggered\ttrue\n23\t11\tdispenser\tfacing\tsouth\ttriggered\ttrue\n23\t12\tdispenser\tfacing\twest\ttriggered\ttrue\n23\t13\tdispenser\tfacing\teast\ttriggered\ttrue\n24\t0\tsandstone\n24\t1\tchiseled_sandstone\n24\t2\tcut_sandstone\n25\t0\tnote_block\n26\t0\tred_bed\tfacing\tsouth\toccupied\tfalse\tpart\tfoot\n26\t1\tred_bed\tfacing\twest\toccupied\tfalse\tpart\tfoot\n26\t2\tred_bed\tfacing\tnorth\toccupied\tfalse\tpart\tfoot\n26\t3\tred_bed\tfacing\teast\toccupied\tfalse\tpart\tfoot\n26\t8\tred_bed\tfacing\tsouth\toccupied\tfalse\tpart\thead\n26\t9\tred_bed\tfacing\twest\toccupied\tfalse\tpart\thead\n26\t10\tred_bed\tfacing\tnorth\toccupied\tfalse\tpart\thead\n26\t11\tred_bed\tfacing\teast\toccupied\tfalse\tpart\thead\n26\t12\tred_bed\tfacing\tsouth\toccupied\ttrue\tpart\thead\n26\t13\tred_bed\tfacing\twest\toccupied\ttrue\tpart\thead\n26\t14\tred_bed\tfacing\tnorth\toccupied\ttrue\tpart\thead\n26\t15\tred_bed\tfacing\teast\toccupied\ttrue\tpart\thead\n27\t0\tpowered_rail\tshape\tnorth_south\tpowered\tfalse\n27\t1\tpowered_rail\tshape\teast_west\tpowered\tfalse\n27\t2\tpowered_rail\tshape\tascending_east\tpowered\tfalse\n27\t3\tpowered_rail\tshape\tascending_west\tpowered\tfalse\n27\t4\tpowered_rail\tshape\tascending_north\tpowered\tfalse\n27\t5\tpowered_rail\tshape\tascending_south\tpowered\tfalse\n27\t8\tpowered_rail\tshape\tnorth_south\tpowered\ttrue\n27\t9\tpowered_rail\tshape\teast_west\tpowered\ttrue\n27\t10\tpowered_rail\tshape\tascending_east\tpowered\ttrue\n27\t11\tpowered_rail\tshape\tascending_west\tpowered\ttrue\n27\t12\tpowered_rail\tshape\tascending_north\tpowered\ttrue\n27\t13\tpowered_rail\tshape\tascending_south\tpowered\ttrue\n28\t0\tdetector_rail\tshape\tnorth_south\tpowered\tfalse\n28\t1\tdetector_rail\tshape\teast_west\tpowered\tfalse\n28\t2\tdetector_rail\tshape\tascending_east\tpowered\tfalse\n28\t3\tdetector_rail\tshape\tascending_west\tpowered\tfalse\n28\t4\tdetector_rail\tshape\tascending_north\tpowered\tfalse\n28\t5\tdetector_rail\tshape\tascending_south\tpowered\tfalse\n28\t8\tdetector_rail\tshape\tnorth_south\tpowered\ttrue\n28\t9\tdetector_rail\tshape\teast_west\tpowered\ttrue\n28\t10\tdetector_rail\tshape\tascending_east\tpowered\ttrue\n28\t11\tdetector_rail\tshape\tascending_west\tpowered\ttrue\n28\t12\tdetector_rail\tshape\tascending_north\tpowered\ttrue\n28\t13\tdetector_rail\tshape\tascending_south\tpowered\ttrue\n29\t0\tsticky_piston\tfacing\tdown\textended\tfalse\n29\t1\tsticky_piston\tfacing\tup\textended\tfalse\n29\t2\tsticky_piston\tfacing\tnorth\textended\tfalse\n29\t3\tsticky_piston\tfacing\tsouth\textended\tfalse\n29\t4\tsticky_piston\tfacing\twest\textended\tfalse\n29\t5\tsticky_piston\tfacing\teast\textended\tfalse\n29\t8\tsticky_piston\tfacing\tdown\textended\ttrue\n29\t9\tsticky_piston\tfacing\tup\textended\ttrue\n29\t10\tsticky_piston\tfacing\tnorth\textended\ttrue\n29\t11\tsticky_piston\tfacing\tsouth\textended\ttrue\n29\t12\tsticky_piston\tfacing\twest\textended\ttrue\n29\t13\tsticky_piston\tfacing\teast\textended\ttrue\n30\t0\tcobweb\n31\t0\tdead_bush\n31\t1\tgrass\n31\t2\tfern\n32\t0\tdead_bush\n33\t0\tpiston\tfacing\tdown\textended\tfalse\n33\t1\tpiston\tfacing\tup\textended\tfalse\n33\t2\tpiston\tfacing\tnorth\textended\tfalse\n33\t3\tpiston\tfacing\tsouth\textended\tfalse\n33\t4\tpiston\tfacing\twest\textended\tfalse\n33\t5\tpiston\tfacing\teast\textended\tfalse\n33\t8\tpiston\tfacing\tdown\textended\ttrue\n33\t9\tpiston\tfacing\tup\textended\ttrue\n33\t10\tpiston\tfacing\tnorth\textended\ttrue\n33\t11\tpiston\tfacing\tsouth\textended\ttrue\n33\t12\tpiston\tfacing\twest\textended\ttrue\n33\t13\tpiston\tfacing\teast\textended\ttrue\n34\t0\tpiston_head\tfacing\tdown\tshort\tfalse\ttype\tnormal\n34\t1\tpiston_head\tfacing\tup\tshort\tfalse\ttype\tnormal\n34\t2\tpiston_head\tfacing\tnorth\tshort\tfalse\ttype\tnormal\n34\t3\tpiston_head\tfacing\tsouth\tshort\tfalse\ttype\tnormal\n34\t4\tpiston_head\tfacing\twest\tshort\tfalse\ttype\tnormal\n34\t5\tpiston_head\tfacing\teast\tshort\tfalse\ttype\tnormal\n34\t8\tpiston_head\tfacing\tdown\tshort\tfalse\ttype\tsticky\n34\t9\tpiston_head\tfacing\tup\tshort\tfalse\ttype\tsticky\n34\t10\tpiston_head\tfacing\tnorth\tshort\tfalse\ttype\tsticky\n34\t11\tpiston_head\tfacing\tsouth\tshort\tfalse\ttype\tsticky\n34\t12\tpiston_head\tfacing\twest\tshort\tfalse\ttype\tsticky\n34\t13\tpiston_head\tfacing\teast\tshort\tfalse\ttype\tsticky\n35\t0\twhite_wool\n35\t1\torange_wool\n35\t2\tmagenta_wool\n35\t3\tlight_blue_wool\n35\t4\tyellow_wool\n35\t5\tlime_wool\n35\t6\tpink_wool\n35\t7\tgray_wool\n35\t8\tlight_gray_wool\n35\t9\tcyan_wool\n35\t10\tpurple_wool\n35\t11\tblue_wool\n35\t12\tbrown_wool\n35\t13\tgreen_wool\n35\t14\tred_wool\n35\t15\tblack_wool\n36\t0\tmoving_piston\tfacing\tdown\ttype\tnormal\n36\t1\tmoving_piston\tfacing\tup\ttype\tnormal\n36\t2\tmoving_piston\tfacing\tnorth\ttype\tnormal\n36\t3\tmoving_piston\tfacing\tsouth\ttype\tnormal\n36\t4\tmoving_piston\tfacing\twest\ttype\tnormal\n36\t5\tmoving_piston\tfacing\teast\ttype\tnormal\n36\t8\tmoving_piston\tfacing\tdown\ttype\tsticky\n36\t9\tmoving_piston\tfacing\tup\ttype\tsticky\n36\t10\tmoving_piston\tfacing\tnorth\ttype\tsticky\n36\t11\tmoving_piston\tfacing\tsouth\ttype\tsticky\n36\t12\tmoving_piston\tfacing\twest\ttype\tsticky\n36\t13\tmoving_piston\tfacing\teast\ttype\tsticky\n37\t0\tdandelion\n38\t0\tpoppy\n38\t1\tblue_orchid\n38\t2\tallium\n38\t3\tazure_bluet\n38\t4\tred_tulip\n38\t5\torange_tulip\n38\t6\twhite_tulip\n38\t7\tpink_tulip\n38\t8\toxeye_daisy\n39\t0\tbrown_mushroom\n40\t0\tred_mushroom\n41\t0\tgold_block\n42\t0\tiron_block\n43\t0\tstone_slab\ttype\tdouble\n43\t1\tsandstone_slab\ttype\tdouble\n43\t2\tpetrified_oak_slab\ttype\tdouble\n43\t3\tcobblestone_slab\ttype\tdouble\n43\t4\tbrick_slab\ttype\tdouble\n43\t5\tstone_brick_slab\ttype\tdouble\n43\t6\tnether_brick_slab\ttype\tdouble\n43\t7\tquartz_slab\ttype\tdouble\n43\t8\tsmooth_stone\n43\t9\tsmooth_sandstone\n43\t10\tpetrified_oak_slab\ttype\tdouble\n43\t11\tcobblestone_slab\ttype\tdouble\n43\t12\tbrick_slab\ttype\tdouble\n43\t13\tstone_brick_slab\ttype\tdouble\n43\t14\tnether_brick_slab\ttype\tdouble\n43\t15\tsmooth_quartz\n44\t0\tstone_slab\ttype\tbottom\n44\t1\tsandstone_slab\ttype\tbottom\n44\t2\tpetrified_oak_slab\ttype\tbottom\n44\t3\tcobblestone_slab\ttype\tbottom\n44\t4\tbrick_slab\ttype\tbottom\n44\t5\tstone_brick_slab\ttype\tbottom\n44\t6\tnether_brick_slab\ttype\tbottom\n44\t7\tquartz_slab\ttype\tbottom\n44\t8\tstone_slab\ttype\ttop\n44\t9\tsandstone_slab\ttype\ttop\n44\t10\tpetrified_oak_slab\ttype\ttop\n44\t11\tcobblestone_slab\ttype\ttop\n44\t12\tbrick_slab\ttype\ttop\n44\t13\tstone_brick_slab\ttype\ttop\n44\t14\tnether_brick_slab\ttype\ttop\n44\t15\tquartz_slab\ttype\ttop\n45\t0\tbricks\n46\t0\ttnt\tunstable\tfalse\n46\t1\ttnt\tunstable\ttrue\n47\t0\tbookshelf\n48\t0\tmossy_cobblestone\n49\t0\tobsidian\n50\t1\twall_torch\tfacing\teast\n50\t2\twall_torch\tfacing\twest\n50\t3\twall_torch\tfacing\tsouth\n50\t4\twall_torch\tfacing\tnorth\n50\t5\ttorch\n51\t0\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t0\tup\tfalse\twest\tfalse\n51\t1\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t1\tup\tfalse\twest\tfalse\n51\t2\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t2\tup\tfalse\twest\tfalse\n51\t3\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t3\tup\tfalse\twest\tfalse\n51\t4\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t4\tup\tfalse\twest\tfalse\n51\t5\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t5\tup\tfalse\twest\tfalse\n51\t6\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t6\tup\tfalse\twest\tfalse\n51\t7\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t7\tup\tfalse\twest\tfalse\n51\t8\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t8\tup\tfalse\twest\tfalse\n51\t9\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t9\tup\tfalse\twest\tfalse\n51\t10\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t10\tup\tfalse\twest\tfalse\n51\t11\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t11\tup\tfalse\twest\tfalse\n51\t12\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t12\tup\tfalse\twest\tfalse\n51\t13\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t13\tup\tfalse\twest\tfalse\n51\t14\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t14\tup\tfalse\twest\tfalse\n51\t15\tfire\tnorth\tfalse\tsouth\tfalse\teast\tfalse\tage\t15\tup\tfalse\twest\tfalse\n52\t0\tmob_spawner\n53\t0\toak_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n53\t1\toak_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n53\t2\toak_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n53\t3\toak_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n53\t4\toak_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n53\t5\toak_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n53\t6\toak_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n53\t7\toak_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n54\t2\tchest\tfacing\tnorth\ttype\tsingle\n54\t3\tchest\tfacing\tsouth\ttype\tsingle\n54\t4\tchest\tfacing\twest\ttype\tsingle\n54\t5\tchest\tfacing\teast\ttype\tsingle\n55\t0\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t0\twest\tnone\n55\t1\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t1\twest\tnone\n55\t2\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t2\twest\tnone\n55\t3\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t3\twest\tnone\n55\t4\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t4\twest\tnone\n55\t5\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t5\twest\tnone\n55\t6\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t6\twest\tnone\n55\t7\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t7\twest\tnone\n55\t8\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t8\twest\tnone\n55\t9\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t9\twest\tnone\n55\t10\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t10\twest\tnone\n55\t11\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t11\twest\tnone\n55\t12\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t12\twest\tnone\n55\t13\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t13\twest\tnone\n55\t14\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t14\twest\tnone\n55\t15\tredstone_wire\tsouth\tnone\teast\tnone\tnorth\tnone\tpower\t15\twest\tnone\n56\t0\tdiamond_ore\n57\t0\tdiamond_block\n58\t0\tcrafting_table\n59\t0\twheat\tage\t0\n59\t1\twheat\tage\t1\n59\t2\twheat\tage\t2\n59\t3\twheat\tage\t3\n59\t4\twheat\tage\t4\n59\t5\twheat\tage\t5\n59\t6\twheat\tage\t6\n59\t7\twheat\tage\t7\n60\t0\tfarmland\tmoisture\t0\n60\t1\tfarmland\tmoisture\t1\n60\t2\tfarmland\tmoisture\t2\n60\t3\tfarmland\tmoisture\t3\n60\t4\tfarmland\tmoisture\t4\n60\t5\tfarmland\tmoisture\t5\n60\t6\tfarmland\tmoisture\t6\n60\t7\tfarmland\tmoisture\t7\n61\t2\tfurnace\tfacing\tnorth\tlit\tfalse\n61\t3\tfurnace\tfacing\tsouth\tlit\tfalse\n61\t4\tfurnace\tfacing\twest\tlit\tfalse\n61\t5\tfurnace\tfacing\teast\tlit\tfalse\n62\t2\tfurnace\tfacing\tnorth\tlit\ttrue\n62\t3\tfurnace\tfacing\tsouth\tlit\ttrue\n62\t4\tfurnace\tfacing\twest\tlit\ttrue\n62\t5\tfurnace\tfacing\teast\tlit\ttrue\n63\t0\tsign\trotation\t0\n63\t1\tsign\trotation\t1\n63\t2\tsign\trotation\t2\n63\t3\tsign\trotation\t3\n63\t4\tsign\trotation\t4\n63\t5\tsign\trotation\t5\n63\t6\tsign\trotation\t6\n63\t7\tsign\trotation\t7\n63\t8\tsign\trotation\t8\n63\t9\tsign\trotation\t9\n63\t10\tsign\trotation\t10\n63\t11\tsign\trotation\t11\n63\t12\tsign\trotation\t12\n63\t13\tsign\trotation\t13\n63\t14\tsign\trotation\t14\n63\t15\tsign\trotation\t15\n64\t0\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n64\t1\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n64\t2\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n64\t3\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n64\t4\toak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n64\t5\toak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n64\t6\toak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n64\t7\toak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n64\t8\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n64\t9\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n64\t10\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n64\t11\toak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n64\t12\toak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n64\t13\toak_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n64\t14\toak_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n64\t15\toak_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n65\t2\tladder\tfacing\tnorth\n65\t3\tladder\tfacing\tsouth\n65\t4\tladder\tfacing\twest\n65\t5\tladder\tfacing\teast\n66\t0\trail\tshape\tnorth_south\n66\t1\trail\tshape\teast_west\n66\t2\trail\tshape\tascending_east\n66\t3\trail\tshape\tascending_west\n66\t4\trail\tshape\tascending_north\n66\t5\trail\tshape\tascending_south\n66\t6\trail\tshape\tsouth_east\n66\t7\trail\tshape\tsouth_west\n66\t8\trail\tshape\tnorth_west\n66\t9\trail\tshape\tnorth_east\n67\t0\tcobblestone_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n67\t1\tcobblestone_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n67\t2\tcobblestone_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n67\t3\tcobblestone_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n67\t4\tcobblestone_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n67\t5\tcobblestone_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n67\t6\tcobblestone_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n67\t7\tcobblestone_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n68\t2\twall_sign\tfacing\tnorth\n68\t3\twall_sign\tfacing\tsouth\n68\t4\twall_sign\tfacing\twest\n68\t5\twall_sign\tfacing\teast\n69\t0\tlever\tfacing\twest\tface\tceiling\tpowered\tfalse\n69\t1\tlever\tfacing\teast\tface\twall\tpowered\tfalse\n69\t2\tlever\tfacing\twest\tface\twall\tpowered\tfalse\n69\t3\tlever\tfacing\tsouth\tface\twall\tpowered\tfalse\n69\t4\tlever\tfacing\tnorth\tface\twall\tpowered\tfalse\n69\t5\tlever\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n69\t6\tlever\tfacing\twest\tface\tfloor\tpowered\tfalse\n69\t7\tlever\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n69\t8\tlever\tfacing\twest\tface\tceiling\tpowered\ttrue\n69\t9\tlever\tfacing\teast\tface\twall\tpowered\ttrue\n69\t10\tlever\tfacing\twest\tface\twall\tpowered\ttrue\n69\t11\tlever\tfacing\tsouth\tface\twall\tpowered\ttrue\n69\t12\tlever\tfacing\tnorth\tface\twall\tpowered\ttrue\n69\t13\tlever\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n69\t14\tlever\tfacing\twest\tface\tfloor\tpowered\ttrue\n69\t15\tlever\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n70\t0\tstone_pressure_plate\tpowered\tfalse\n70\t1\tstone_pressure_plate\tpowered\ttrue\n71\t0\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n71\t1\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n71\t2\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n71\t3\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n71\t4\tiron_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n71\t5\tiron_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n71\t6\tiron_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n71\t7\tiron_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n71\t8\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n71\t9\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n71\t10\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n71\t11\tiron_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n71\t12\tiron_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\ttrue\n71\t13\tiron_door\thinge\tleft\thalf\tupper\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n71\t14\tiron_door\thinge\tleft\thalf\tupper\tfacing\twest\tpowered\tfalse\topen\ttrue\n71\t15\tiron_door\thinge\tleft\thalf\tupper\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n72\t0\toak_pressure_plate\tpowered\tfalse\n72\t1\toak_pressure_plate\tpowered\ttrue\n73\t0\tredstone_ore\tlit\tfalse\n74\t0\tredstone_ore\tlit\ttrue\n75\t1\tredstone_wall_torch\tfacing\teast\tlit\tfalse\n75\t2\tredstone_wall_torch\tfacing\twest\tlit\tfalse\n75\t3\tredstone_wall_torch\tfacing\tsouth\tlit\tfalse\n75\t4\tredstone_wall_torch\tfacing\tnorth\tlit\tfalse\n75\t5\tredstone_torch\tlit\tfalse\n76\t1\tredstone_wall_torch\tfacing\teast\tlit\ttrue\n76\t2\tredstone_wall_torch\tfacing\twest\tlit\ttrue\n76\t3\tredstone_wall_torch\tfacing\tsouth\tlit\ttrue\n76\t4\tredstone_wall_torch\tfacing\tnorth\tlit\ttrue\n76\t5\tredstone_torch\tlit\ttrue\n77\t0\tstone_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n77\t1\tstone_button\tfacing\teast\tface\twall\tpowered\tfalse\n77\t2\tstone_button\tfacing\twest\tface\twall\tpowered\tfalse\n77\t3\tstone_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n77\t4\tstone_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n77\t5\tstone_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n77\t8\tstone_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n77\t9\tstone_button\tfacing\teast\tface\twall\tpowered\ttrue\n77\t10\tstone_button\tfacing\twest\tface\twall\tpowered\ttrue\n77\t11\tstone_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n77\t12\tstone_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n77\t13\tstone_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n78\t0\tsnow\tlayers\t1\n78\t1\tsnow\tlayers\t2\n78\t2\tsnow\tlayers\t3\n78\t3\tsnow\tlayers\t4\n78\t4\tsnow\tlayers\t5\n78\t5\tsnow\tlayers\t6\n78\t6\tsnow\tlayers\t7\n78\t7\tsnow\tlayers\t8\n79\t0\tice\n80\t0\tsnow_block\n81\t0\tcactus\tage\t0\n81\t1\tcactus\tage\t1\n81\t2\tcactus\tage\t2\n81\t3\tcactus\tage\t3\n81\t4\tcactus\tage\t4\n81\t5\tcactus\tage\t5\n81\t6\tcactus\tage\t6\n81\t7\tcactus\tage\t7\n81\t8\tcactus\tage\t8\n81\t9\tcactus\tage\t9\n81\t10\tcactus\tage\t10\n81\t11\tcactus\tage\t11\n81\t12\tcactus\tage\t12\n81\t13\tcactus\tage\t13\n81\t14\tcactus\tage\t14\n81\t15\tcactus\tage\t15\n82\t0\tclay\n83\t0\tsugar_cane\tage\t0\n83\t1\tsugar_cane\tage\t1\n83\t2\tsugar_cane\tage\t2\n83\t3\tsugar_cane\tage\t3\n83\t4\tsugar_cane\tage\t4\n83\t5\tsugar_cane\tage\t5\n83\t6\tsugar_cane\tage\t6\n83\t7\tsugar_cane\tage\t7\n83\t8\tsugar_cane\tage\t8\n83\t9\tsugar_cane\tage\t9\n83\t10\tsugar_cane\tage\t10\n83\t11\tsugar_cane\tage\t11\n83\t12\tsugar_cane\tage\t12\n83\t13\tsugar_cane\tage\t13\n83\t14\tsugar_cane\tage\t14\n83\t15\tsugar_cane\tage\t15\n84\t0\tjukebox\thas_record\tfalse\n84\t1\tjukebox\thas_record\ttrue\n85\t0\toak_fence\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n86\t0\tcarved_pumpkin\tfacing\tsouth\n86\t1\tcarved_pumpkin\tfacing\twest\n86\t2\tcarved_pumpkin\tfacing\tnorth\n86\t3\tcarved_pumpkin\tfacing\teast\n87\t0\tnetherrack\n88\t0\tsoul_sand\n89\t0\tglowstone\n90\t1\tportal\taxis\tx\n90\t2\tportal\taxis\tz\n91\t0\tjack_o_lantern\tfacing\tsouth\n91\t1\tjack_o_lantern\tfacing\twest\n91\t2\tjack_o_lantern\tfacing\tnorth\n91\t3\tjack_o_lantern\tfacing\teast\n92\t0\tcake\tbites\t0\n92\t1\tcake\tbites\t1\n92\t2\tcake\tbites\t2\n92\t3\tcake\tbites\t3\n92\t4\tcake\tbites\t4\n92\t5\tcake\tbites\t5\n92\t6\tcake\tbites\t6\n93\t0\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n93\t1\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n93\t2\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n93\t3\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t1\n93\t4\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n93\t5\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n93\t6\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n93\t7\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t2\n93\t8\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n93\t9\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n93\t10\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n93\t11\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t3\n93\t12\trepeater\tfacing\tsouth\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n93\t13\trepeater\tfacing\twest\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n93\t14\trepeater\tfacing\tnorth\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n93\t15\trepeater\tfacing\teast\tpowered\tfalse\tlocked\tfalse\tdelay\t4\n94\t0\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n94\t1\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n94\t2\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n94\t3\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t1\n94\t4\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n94\t5\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n94\t6\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n94\t7\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t2\n94\t8\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n94\t9\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n94\t10\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n94\t11\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t3\n94\t12\trepeater\tfacing\tsouth\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n94\t13\trepeater\tfacing\twest\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n94\t14\trepeater\tfacing\tnorth\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n94\t15\trepeater\tfacing\teast\tpowered\ttrue\tlocked\tfalse\tdelay\t4\n95\t0\twhite_stained_glass\n95\t1\torange_stained_glass\n95\t2\tmagenta_stained_glass\n95\t3\tlight_blue_stained_glass\n95\t4\tyellow_stained_glass\n95\t5\tlime_stained_glass\n95\t6\tpink_stained_glass\n95\t7\tgray_stained_glass\n95\t8\tlight_gray_stained_glass\n95\t9\tcyan_stained_glass\n95\t10\tpurple_stained_glass\n95\t11\tblue_stained_glass\n95\t12\tbrown_stained_glass\n95\t13\tgreen_stained_glass\n95\t14\tred_stained_glass\n95\t15\tblack_stained_glass\n96\t0\toak_trapdoor\tfacing\tnorth\topen\tfalse\thalf\tbottom\n96\t1\toak_trapdoor\tfacing\tsouth\topen\tfalse\thalf\tbottom\n96\t2\toak_trapdoor\tfacing\twest\topen\tfalse\thalf\tbottom\n96\t3\toak_trapdoor\tfacing\teast\topen\tfalse\thalf\tbottom\n96\t4\toak_trapdoor\tfacing\tnorth\topen\ttrue\thalf\tbottom\n96\t5\toak_trapdoor\tfacing\tsouth\topen\ttrue\thalf\tbottom\n96\t6\toak_trapdoor\tfacing\twest\topen\ttrue\thalf\tbottom\n96\t7\toak_trapdoor\tfacing\teast\topen\ttrue\thalf\tbottom\n96\t8\toak_trapdoor\tfacing\tnorth\topen\tfalse\thalf\ttop\n96\t9\toak_trapdoor\tfacing\tsouth\topen\tfalse\thalf\ttop\n96\t10\toak_trapdoor\tfacing\twest\topen\tfalse\thalf\ttop\n96\t11\toak_trapdoor\tfacing\teast\topen\tfalse\thalf\ttop\n96\t12\toak_trapdoor\tfacing\tnorth\topen\ttrue\thalf\ttop\n96\t13\toak_trapdoor\tfacing\tsouth\topen\ttrue\thalf\ttop\n96\t14\toak_trapdoor\tfacing\twest\topen\ttrue\thalf\ttop\n96\t15\toak_trapdoor\tfacing\teast\topen\ttrue\thalf\ttop\n97\t0\tinfested_stone\n97\t1\tinfested_cobblestone\n97\t2\tinfested_stone_bricks\n97\t3\tinfested_mossy_stone_bricks\n97\t4\tinfested_cracked_stone_bricks\n97\t5\tinfested_chiseled_stone_bricks\n98\t0\tstone_bricks\n98\t1\tmossy_stone_bricks\n98\t2\tcracked_stone_bricks\n98\t3\tchiseled_stone_bricks\n99\t0\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n99\t1\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n99\t2\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n99\t3\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n99\t4\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n99\t5\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n99\t6\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n99\t7\tbrown_mushroom_block\tdown\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n99\t8\tbrown_mushroom_block\tdown\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n99\t9\tbrown_mushroom_block\tdown\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n99\t10\tmushroom_stem\tdown\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n99\t11\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n99\t12\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n99\t13\tbrown_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n99\t14\tbrown_mushroom_block\tdown\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n99\t15\tmushroom_stem\tdown\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n100\t0\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n100\t1\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n100\t2\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n100\t3\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n100\t4\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n100\t5\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n100\t6\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n100\t7\tred_mushroom_block\tdown\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n100\t8\tred_mushroom_block\tdown\tfalse\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n100\t9\tred_mushroom_block\tdown\tfalse\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n100\t10\tmushroom_stem\tdown\tfalse\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\tfalse\twest\ttrue\n100\t11\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n100\t12\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n100\t13\tred_mushroom_block\tdown\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n100\t14\tred_mushroom_block\tdown\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n100\t15\tmushroom_stem\tdown\ttrue\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n101\t0\tiron_bars\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n102\t0\tglass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n103\t0\tmelon_block\n104\t0\tpumpkin_stem\tage\t0\n104\t1\tpumpkin_stem\tage\t1\n104\t2\tpumpkin_stem\tage\t2\n104\t3\tpumpkin_stem\tage\t3\n104\t4\tpumpkin_stem\tage\t4\n104\t5\tpumpkin_stem\tage\t5\n104\t6\tpumpkin_stem\tage\t6\n104\t7\tpumpkin_stem\tage\t7\n105\t0\tmelon_stem\tage\t0\n105\t1\tmelon_stem\tage\t1\n105\t2\tmelon_stem\tage\t2\n105\t3\tmelon_stem\tage\t3\n105\t4\tmelon_stem\tage\t4\n105\t5\tmelon_stem\tage\t5\n105\t6\tmelon_stem\tage\t6\n105\t7\tmelon_stem\tage\t7\n106\t0\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n106\t1\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\tfalse\n106\t2\tvine\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n106\t3\tvine\tsouth\ttrue\teast\tfalse\tnorth\tfalse\tup\ttrue\twest\ttrue\n106\t4\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n106\t5\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\tfalse\n106\t6\tvine\tsouth\tfalse\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n106\t7\tvine\tsouth\ttrue\teast\tfalse\tnorth\ttrue\tup\ttrue\twest\ttrue\n106\t8\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n106\t9\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\tfalse\n106\t10\tvine\tsouth\tfalse\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n106\t11\tvine\tsouth\ttrue\teast\ttrue\tnorth\tfalse\tup\ttrue\twest\ttrue\n106\t12\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n106\t13\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\tfalse\n106\t14\tvine\tsouth\tfalse\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n106\t15\tvine\tsouth\ttrue\teast\ttrue\tnorth\ttrue\tup\ttrue\twest\ttrue\n107\t0\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n107\t1\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n107\t2\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n107\t3\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n107\t4\toak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n107\t5\toak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n107\t6\toak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n107\t7\toak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n107\t8\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n107\t9\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n107\t10\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n107\t11\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n107\t12\toak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n107\t13\toak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n107\t14\toak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n107\t15\toak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n108\t0\tbrick_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n108\t1\tbrick_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n108\t2\tbrick_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n108\t3\tbrick_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n108\t4\tbrick_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n108\t5\tbrick_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n108\t6\tbrick_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n108\t7\tbrick_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n109\t0\tstone_brick_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n109\t1\tstone_brick_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n109\t2\tstone_brick_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n109\t3\tstone_brick_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n109\t4\tstone_brick_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n109\t5\tstone_brick_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n109\t6\tstone_brick_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n109\t7\tstone_brick_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n110\t0\tmycelium\tsnowy\tfalse\n111\t0\tlily_pad\n112\t0\tnether_bricks\n113\t0\tnether_brick_fence\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n114\t0\tnether_brick_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n114\t1\tnether_brick_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n114\t2\tnether_brick_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n114\t3\tnether_brick_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n114\t4\tnether_brick_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n114\t5\tnether_brick_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n114\t6\tnether_brick_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n114\t7\tnether_brick_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n115\t0\tnether_wart\tage\t0\n115\t1\tnether_wart\tage\t1\n115\t2\tnether_wart\tage\t2\n115\t3\tnether_wart\tage\t3\n116\t0\tenchanting_table\n117\t0\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\tfalse\thas_bottle_2\tfalse\n117\t1\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\tfalse\thas_bottle_2\tfalse\n117\t2\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\ttrue\thas_bottle_2\tfalse\n117\t3\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\ttrue\thas_bottle_2\tfalse\n117\t4\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\tfalse\thas_bottle_2\ttrue\n117\t5\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\tfalse\thas_bottle_2\ttrue\n117\t6\tbrewing_stand\thas_bottle_0\tfalse\thas_bottle_1\ttrue\thas_bottle_2\ttrue\n117\t7\tbrewing_stand\thas_bottle_0\ttrue\thas_bottle_1\ttrue\thas_bottle_2\ttrue\n118\t0\tcauldron\tlevel\t0\n118\t1\tcauldron\tlevel\t1\n118\t2\tcauldron\tlevel\t2\n118\t3\tcauldron\tlevel\t3\n119\t0\tend_portal\n120\t0\tend_portal_frame\tfacing\tsouth\teye\tfalse\n120\t1\tend_portal_frame\tfacing\twest\teye\tfalse\n120\t2\tend_portal_frame\tfacing\tnorth\teye\tfalse\n120\t3\tend_portal_frame\tfacing\teast\teye\tfalse\n120\t4\tend_portal_frame\tfacing\tsouth\teye\ttrue\n120\t5\tend_portal_frame\tfacing\twest\teye\ttrue\n120\t6\tend_portal_frame\tfacing\tnorth\teye\ttrue\n120\t7\tend_portal_frame\tfacing\teast\teye\ttrue\n121\t0\tend_stone\n122\t0\tdragon_egg\n123\t0\tredstone_lamp\tlit\tfalse\n124\t0\tredstone_lamp\tlit\ttrue\n125\t0\toak_slab\ttype\tdouble\n125\t1\tspruce_slab\ttype\tdouble\n125\t2\tbirch_slab\ttype\tdouble\n125\t3\tjungle_slab\ttype\tdouble\n125\t4\tacacia_slab\ttype\tdouble\n125\t5\tdark_oak_slab\ttype\tdouble\n126\t0\toak_slab\ttype\tbottom\n126\t1\tspruce_slab\ttype\tbottom\n126\t2\tbirch_slab\ttype\tbottom\n126\t3\tjungle_slab\ttype\tbottom\n126\t4\tacacia_slab\ttype\tbottom\n126\t5\tdark_oak_slab\ttype\tbottom\n126\t8\toak_slab\ttype\ttop\n126\t9\tspruce_slab\ttype\ttop\n126\t10\tbirch_slab\ttype\ttop\n126\t11\tjungle_slab\ttype\ttop\n126\t12\tacacia_slab\ttype\ttop\n126\t13\tdark_oak_slab\ttype\ttop\n127\t0\tcocoa\tfacing\tsouth\tage\t0\n127\t1\tcocoa\tfacing\twest\tage\t0\n127\t2\tcocoa\tfacing\tnorth\tage\t0\n127\t3\tcocoa\tfacing\teast\tage\t0\n127\t4\tcocoa\tfacing\tsouth\tage\t1\n127\t5\tcocoa\tfacing\twest\tage\t1\n127\t6\tcocoa\tfacing\tnorth\tage\t1\n127\t7\tcocoa\tfacing\teast\tage\t1\n127\t8\tcocoa\tfacing\tsouth\tage\t2\n127\t9\tcocoa\tfacing\twest\tage\t2\n127\t10\tcocoa\tfacing\tnorth\tage\t2\n127\t11\tcocoa\tfacing\teast\tage\t2\n128\t0\tsandstone_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n128\t1\tsandstone_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n128\t2\tsandstone_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n128\t3\tsandstone_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n128\t4\tsandstone_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n128\t5\tsandstone_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n128\t6\tsandstone_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n128\t7\tsandstone_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n129\t0\temerald_ore\n130\t2\tender_chest\tfacing\tnorth\n130\t3\tender_chest\tfacing\tsouth\n130\t4\tender_chest\tfacing\twest\n130\t5\tender_chest\tfacing\teast\n131\t0\ttripwire_hook\tattached\tfalse\tfacing\tsouth\tpowered\tfalse\n131\t1\ttripwire_hook\tattached\tfalse\tfacing\twest\tpowered\tfalse\n131\t2\ttripwire_hook\tattached\tfalse\tfacing\tnorth\tpowered\tfalse\n131\t3\ttripwire_hook\tattached\tfalse\tfacing\teast\tpowered\tfalse\n131\t4\ttripwire_hook\tattached\ttrue\tfacing\tsouth\tpowered\tfalse\n131\t5\ttripwire_hook\tattached\ttrue\tfacing\twest\tpowered\tfalse\n131\t6\ttripwire_hook\tattached\ttrue\tfacing\tnorth\tpowered\tfalse\n131\t7\ttripwire_hook\tattached\ttrue\tfacing\teast\tpowered\tfalse\n131\t8\ttripwire_hook\tattached\tfalse\tfacing\tsouth\tpowered\ttrue\n131\t9\ttripwire_hook\tattached\tfalse\tfacing\twest\tpowered\ttrue\n131\t10\ttripwire_hook\tattached\tfalse\tfacing\tnorth\tpowered\ttrue\n131\t11\ttripwire_hook\tattached\tfalse\tfacing\teast\tpowered\ttrue\n131\t12\ttripwire_hook\tattached\ttrue\tfacing\tsouth\tpowered\ttrue\n131\t13\ttripwire_hook\tattached\ttrue\tfacing\twest\tpowered\ttrue\n131\t14\ttripwire_hook\tattached\ttrue\tfacing\tnorth\tpowered\ttrue\n131\t15\ttripwire_hook\tattached\ttrue\tfacing\teast\tpowered\ttrue\n132\t0\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t1\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t2\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t3\ttripwire\tattached\tfalse\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t4\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t5\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t6\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t7\ttripwire\tattached\ttrue\tdisarmed\tfalse\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t8\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t9\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t10\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t11\ttripwire\tattached\tfalse\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t12\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t13\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\ttrue\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n132\t14\ttripwire\tattached\ttrue\tdisarmed\ttrue\tpowered\tfalse\teast\tfalse\tnorth\tfalse\tsouth\tfalse\twest\tfalse\n133\t0\temerald_block\n134\t0\tspruce_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n134\t1\tspruce_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n134\t2\tspruce_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n134\t3\tspruce_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n134\t4\tspruce_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n134\t5\tspruce_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n134\t6\tspruce_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n134\t7\tspruce_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n135\t0\tbirch_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n135\t1\tbirch_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n135\t2\tbirch_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n135\t3\tbirch_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n135\t4\tbirch_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n135\t5\tbirch_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n135\t6\tbirch_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n135\t7\tbirch_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n136\t0\tjungle_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n136\t1\tjungle_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n136\t2\tjungle_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n136\t3\tjungle_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n136\t4\tjungle_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n136\t5\tjungle_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n136\t6\tjungle_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n136\t7\tjungle_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n137\t0\tcommand_block\tconditional\tfalse\tfacing\tdown\n137\t1\tcommand_block\tconditional\tfalse\tfacing\tup\n137\t2\tcommand_block\tconditional\tfalse\tfacing\tnorth\n137\t3\tcommand_block\tconditional\tfalse\tfacing\tsouth\n137\t4\tcommand_block\tconditional\tfalse\tfacing\twest\n137\t5\tcommand_block\tconditional\tfalse\tfacing\teast\n137\t8\tcommand_block\tconditional\ttrue\tfacing\tdown\n137\t9\tcommand_block\tconditional\ttrue\tfacing\tup\n137\t10\tcommand_block\tconditional\ttrue\tfacing\tnorth\n137\t11\tcommand_block\tconditional\ttrue\tfacing\tsouth\n137\t12\tcommand_block\tconditional\ttrue\tfacing\twest\n137\t13\tcommand_block\tconditional\ttrue\tfacing\teast\n138\t0\tbeacon\n139\t0\tcobblestone_wall\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n139\t1\tmossy_cobblestone_wall\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tup\tfalse\twest\tfalse\n140\t0\tpotted_cactus\n140\t1\tpotted_cactus\n140\t2\tpotted_cactus\n140\t3\tpotted_cactus\n140\t4\tpotted_cactus\n140\t5\tpotted_cactus\n140\t6\tpotted_cactus\n140\t7\tpotted_cactus\n140\t8\tpotted_cactus\n140\t9\tpotted_cactus\n140\t10\tpotted_cactus\n140\t11\tpotted_cactus\n140\t12\tpotted_cactus\n140\t13\tpotted_cactus\n140\t14\tpotted_cactus\n140\t15\tpotted_cactus\n141\t0\tcarrots\tage\t0\n141\t1\tcarrots\tage\t1\n141\t2\tcarrots\tage\t2\n141\t3\tcarrots\tage\t3\n141\t4\tcarrots\tage\t4\n141\t5\tcarrots\tage\t5\n141\t6\tcarrots\tage\t6\n141\t7\tcarrots\tage\t7\n142\t0\tpotatoes\tage\t0\n142\t1\tpotatoes\tage\t1\n142\t2\tpotatoes\tage\t2\n142\t3\tpotatoes\tage\t3\n142\t4\tpotatoes\tage\t4\n142\t5\tpotatoes\tage\t5\n142\t6\tpotatoes\tage\t6\n142\t7\tpotatoes\tage\t7\n143\t0\toak_button\tfacing\tnorth\tface\tceiling\tpowered\tfalse\n143\t1\toak_button\tfacing\teast\tface\twall\tpowered\tfalse\n143\t2\toak_button\tfacing\twest\tface\twall\tpowered\tfalse\n143\t3\toak_button\tfacing\tsouth\tface\twall\tpowered\tfalse\n143\t4\toak_button\tfacing\tnorth\tface\twall\tpowered\tfalse\n143\t5\toak_button\tfacing\tnorth\tface\tfloor\tpowered\tfalse\n143\t8\toak_button\tfacing\tnorth\tface\tceiling\tpowered\ttrue\n143\t9\toak_button\tfacing\teast\tface\twall\tpowered\ttrue\n143\t10\toak_button\tfacing\twest\tface\twall\tpowered\ttrue\n143\t11\toak_button\tfacing\tsouth\tface\twall\tpowered\ttrue\n143\t12\toak_button\tfacing\tnorth\tface\twall\tpowered\ttrue\n143\t13\toak_button\tfacing\tnorth\tface\tfloor\tpowered\ttrue\n144\t0\t%%FILTER_ME%%\tfacing\tdown\tnodrop\tfalse\n144\t1\t%%FILTER_ME%%\tfacing\tup\tnodrop\tfalse\n144\t2\t%%FILTER_ME%%\tfacing\tnorth\tnodrop\tfalse\n144\t3\t%%FILTER_ME%%\tfacing\tsouth\tnodrop\tfalse\n144\t4\t%%FILTER_ME%%\tfacing\twest\tnodrop\tfalse\n144\t5\t%%FILTER_ME%%\tfacing\teast\tnodrop\tfalse\n144\t8\t%%FILTER_ME%%\tfacing\tdown\tnodrop\ttrue\n144\t9\t%%FILTER_ME%%\tfacing\tup\tnodrop\ttrue\n144\t10\t%%FILTER_ME%%\tfacing\tnorth\tnodrop\ttrue\n144\t11\t%%FILTER_ME%%\tfacing\tsouth\tnodrop\ttrue\n144\t12\t%%FILTER_ME%%\tfacing\twest\tnodrop\ttrue\n144\t13\t%%FILTER_ME%%\tfacing\teast\tnodrop\ttrue\n145\t0\tanvil\tfacing\tsouth\n145\t1\tanvil\tfacing\twest\n145\t2\tanvil\tfacing\tnorth\n145\t3\tanvil\tfacing\teast\n145\t4\tchipped_anvil\tfacing\tsouth\n145\t5\tchipped_anvil\tfacing\twest\n145\t6\tchipped_anvil\tfacing\tnorth\n145\t7\tchipped_anvil\tfacing\teast\n145\t8\tdamaged_anvil\tfacing\tsouth\n145\t9\tdamaged_anvil\tfacing\twest\n145\t10\tdamaged_anvil\tfacing\tnorth\n145\t11\tdamaged_anvil\tfacing\teast\n146\t2\ttrapped_chest\tfacing\tnorth\ttype\tsingle\n146\t3\ttrapped_chest\tfacing\tsouth\ttype\tsingle\n146\t4\ttrapped_chest\tfacing\twest\ttype\tsingle\n146\t5\ttrapped_chest\tfacing\teast\ttype\tsingle\n147\t0\tlight_weighted_pressure_plate\tpower\t0\n147\t1\tlight_weighted_pressure_plate\tpower\t1\n147\t2\tlight_weighted_pressure_plate\tpower\t2\n147\t3\tlight_weighted_pressure_plate\tpower\t3\n147\t4\tlight_weighted_pressure_plate\tpower\t4\n147\t5\tlight_weighted_pressure_plate\tpower\t5\n147\t6\tlight_weighted_pressure_plate\tpower\t6\n147\t7\tlight_weighted_pressure_plate\tpower\t7\n147\t8\tlight_weighted_pressure_plate\tpower\t8\n147\t9\tlight_weighted_pressure_plate\tpower\t9\n147\t10\tlight_weighted_pressure_plate\tpower\t10\n147\t11\tlight_weighted_pressure_plate\tpower\t11\n147\t12\tlight_weighted_pressure_plate\tpower\t12\n147\t13\tlight_weighted_pressure_plate\tpower\t13\n147\t14\tlight_weighted_pressure_plate\tpower\t14\n147\t15\tlight_weighted_pressure_plate\tpower\t15\n148\t0\theavy_weighted_pressure_plate\tpower\t0\n148\t1\theavy_weighted_pressure_plate\tpower\t1\n148\t2\theavy_weighted_pressure_plate\tpower\t2\n148\t3\theavy_weighted_pressure_plate\tpower\t3\n148\t4\theavy_weighted_pressure_plate\tpower\t4\n148\t5\theavy_weighted_pressure_plate\tpower\t5\n148\t6\theavy_weighted_pressure_plate\tpower\t6\n148\t7\theavy_weighted_pressure_plate\tpower\t7\n148\t8\theavy_weighted_pressure_plate\tpower\t8\n148\t9\theavy_weighted_pressure_plate\tpower\t9\n148\t10\theavy_weighted_pressure_plate\tpower\t10\n148\t11\theavy_weighted_pressure_plate\tpower\t11\n148\t12\theavy_weighted_pressure_plate\tpower\t12\n148\t13\theavy_weighted_pressure_plate\tpower\t13\n148\t14\theavy_weighted_pressure_plate\tpower\t14\n148\t15\theavy_weighted_pressure_plate\tpower\t15\n149\t0\tcomparator\tfacing\tsouth\tmode\tcompare\tpowered\tfalse\n149\t1\tcomparator\tfacing\twest\tmode\tcompare\tpowered\tfalse\n149\t2\tcomparator\tfacing\tnorth\tmode\tcompare\tpowered\tfalse\n149\t3\tcomparator\tfacing\teast\tmode\tcompare\tpowered\tfalse\n149\t4\tcomparator\tfacing\tsouth\tmode\tsubtract\tpowered\tfalse\n149\t5\tcomparator\tfacing\twest\tmode\tsubtract\tpowered\tfalse\n149\t6\tcomparator\tfacing\tnorth\tmode\tsubtract\tpowered\tfalse\n149\t7\tcomparator\tfacing\teast\tmode\tsubtract\tpowered\tfalse\n149\t8\tcomparator\tfacing\tsouth\tmode\tcompare\tpowered\ttrue\n149\t9\tcomparator\tfacing\twest\tmode\tcompare\tpowered\ttrue\n149\t10\tcomparator\tfacing\tnorth\tmode\tcompare\tpowered\ttrue\n149\t11\tcomparator\tfacing\teast\tmode\tcompare\tpowered\ttrue\n149\t12\tcomparator\tfacing\tsouth\tmode\tsubtract\tpowered\ttrue\n149\t13\tcomparator\tfacing\twest\tmode\tsubtract\tpowered\ttrue\n149\t14\tcomparator\tfacing\tnorth\tmode\tsubtract\tpowered\ttrue\n149\t15\tcomparator\tfacing\teast\tmode\tsubtract\tpowered\ttrue\n150\t0\tcomparator\tfacing\tsouth\tmode\tcompare\tpowered\tfalse\n150\t1\tcomparator\tfacing\twest\tmode\tcompare\tpowered\tfalse\n150\t2\tcomparator\tfacing\tnorth\tmode\tcompare\tpowered\tfalse\n150\t3\tcomparator\tfacing\teast\tmode\tcompare\tpowered\tfalse\n150\t4\tcomparator\tfacing\tsouth\tmode\tsubtract\tpowered\tfalse\n150\t5\tcomparator\tfacing\twest\tmode\tsubtract\tpowered\tfalse\n150\t6\tcomparator\tfacing\tnorth\tmode\tsubtract\tpowered\tfalse\n150\t7\tcomparator\tfacing\teast\tmode\tsubtract\tpowered\tfalse\n150\t8\tcomparator\tfacing\tsouth\tmode\tcompare\tpowered\ttrue\n150\t9\tcomparator\tfacing\twest\tmode\tcompare\tpowered\ttrue\n150\t10\tcomparator\tfacing\tnorth\tmode\tcompare\tpowered\ttrue\n150\t11\tcomparator\tfacing\teast\tmode\tcompare\tpowered\ttrue\n150\t12\tcomparator\tfacing\tsouth\tmode\tsubtract\tpowered\ttrue\n150\t13\tcomparator\tfacing\twest\tmode\tsubtract\tpowered\ttrue\n150\t14\tcomparator\tfacing\tnorth\tmode\tsubtract\tpowered\ttrue\n150\t15\tcomparator\tfacing\teast\tmode\tsubtract\tpowered\ttrue\n151\t0\tdaylight_detector\tinverted\tfalse\tpower\t0\n151\t1\tdaylight_detector\tinverted\tfalse\tpower\t1\n151\t2\tdaylight_detector\tinverted\tfalse\tpower\t2\n151\t3\tdaylight_detector\tinverted\tfalse\tpower\t3\n151\t4\tdaylight_detector\tinverted\tfalse\tpower\t4\n151\t5\tdaylight_detector\tinverted\tfalse\tpower\t5\n151\t6\tdaylight_detector\tinverted\tfalse\tpower\t6\n151\t7\tdaylight_detector\tinverted\tfalse\tpower\t7\n151\t8\tdaylight_detector\tinverted\tfalse\tpower\t8\n151\t9\tdaylight_detector\tinverted\tfalse\tpower\t9\n151\t10\tdaylight_detector\tinverted\tfalse\tpower\t10\n151\t11\tdaylight_detector\tinverted\tfalse\tpower\t11\n151\t12\tdaylight_detector\tinverted\tfalse\tpower\t12\n151\t13\tdaylight_detector\tinverted\tfalse\tpower\t13\n151\t14\tdaylight_detector\tinverted\tfalse\tpower\t14\n151\t15\tdaylight_detector\tinverted\tfalse\tpower\t15\n152\t0\tredstone_block\n153\t0\tnether_quartz_ore\n154\t0\thopper\tfacing\tdown\tenabled\ttrue\n154\t2\thopper\tfacing\tnorth\tenabled\ttrue\n154\t3\thopper\tfacing\tsouth\tenabled\ttrue\n154\t4\thopper\tfacing\twest\tenabled\ttrue\n154\t5\thopper\tfacing\teast\tenabled\ttrue\n154\t8\thopper\tfacing\tdown\tenabled\tfalse\n154\t10\thopper\tfacing\tnorth\tenabled\tfalse\n154\t11\thopper\tfacing\tsouth\tenabled\tfalse\n154\t12\thopper\tfacing\twest\tenabled\tfalse\n154\t13\thopper\tfacing\teast\tenabled\tfalse\n155\t0\tquartz_block\n155\t1\tchiseled_quartz_block\n155\t2\tquartz_pillar\taxis\ty\n155\t3\tquartz_pillar\taxis\tx\n155\t4\tquartz_pillar\taxis\tz\n156\t0\tquartz_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n156\t1\tquartz_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n156\t2\tquartz_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n156\t3\tquartz_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n156\t4\tquartz_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n156\t5\tquartz_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n156\t6\tquartz_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n156\t7\tquartz_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n157\t0\tactivator_rail\tshape\tnorth_south\tpowered\tfalse\n157\t1\tactivator_rail\tshape\teast_west\tpowered\tfalse\n157\t2\tactivator_rail\tshape\tascending_east\tpowered\tfalse\n157\t3\tactivator_rail\tshape\tascending_west\tpowered\tfalse\n157\t4\tactivator_rail\tshape\tascending_north\tpowered\tfalse\n157\t5\tactivator_rail\tshape\tascending_south\tpowered\tfalse\n157\t8\tactivator_rail\tshape\tnorth_south\tpowered\ttrue\n157\t9\tactivator_rail\tshape\teast_west\tpowered\ttrue\n157\t10\tactivator_rail\tshape\tascending_east\tpowered\ttrue\n157\t11\tactivator_rail\tshape\tascending_west\tpowered\ttrue\n157\t12\tactivator_rail\tshape\tascending_north\tpowered\ttrue\n157\t13\tactivator_rail\tshape\tascending_south\tpowered\ttrue\n158\t0\tdropper\tfacing\tdown\ttriggered\tfalse\n158\t1\tdropper\tfacing\tup\ttriggered\tfalse\n158\t2\tdropper\tfacing\tnorth\ttriggered\tfalse\n158\t3\tdropper\tfacing\tsouth\ttriggered\tfalse\n158\t4\tdropper\tfacing\twest\ttriggered\tfalse\n158\t5\tdropper\tfacing\teast\ttriggered\tfalse\n158\t8\tdropper\tfacing\tdown\ttriggered\ttrue\n158\t9\tdropper\tfacing\tup\ttriggered\ttrue\n158\t10\tdropper\tfacing\tnorth\ttriggered\ttrue\n158\t11\tdropper\tfacing\tsouth\ttriggered\ttrue\n158\t12\tdropper\tfacing\twest\ttriggered\ttrue\n158\t13\tdropper\tfacing\teast\ttriggered\ttrue\n159\t0\twhite_terracotta\n159\t1\torange_terracotta\n159\t2\tmagenta_terracotta\n159\t3\tlight_blue_terracotta\n159\t4\tyellow_terracotta\n159\t5\tlime_terracotta\n159\t6\tpink_terracotta\n159\t7\tgray_terracotta\n159\t8\tlight_gray_terracotta\n159\t9\tcyan_terracotta\n159\t10\tpurple_terracotta\n159\t11\tblue_terracotta\n159\t12\tbrown_terracotta\n159\t13\tgreen_terracotta\n159\t14\tred_terracotta\n159\t15\tblack_terracotta\n160\t0\twhite_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t1\torange_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t2\tmagenta_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t3\tlight_blue_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t4\tyellow_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t5\tlime_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t6\tpink_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t7\tgray_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t8\tlight_gray_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t9\tcyan_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t10\tpurple_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t11\tblue_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t12\tbrown_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t13\tgreen_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t14\tred_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n160\t15\tblack_stained_glass_pane\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n161\t0\tacacia_leaves\tdecayable\ttrue\tcheck_decay\tfalse\n161\t1\tdark_oak_leaves\tdecayable\ttrue\tcheck_decay\tfalse\n161\t4\tacacia_leaves\tdecayable\tfalse\tcheck_decay\tfalse\n161\t5\tdark_oak_leaves\tdecayable\tfalse\tcheck_decay\tfalse\n161\t8\tacacia_leaves\tdecayable\ttrue\tcheck_decay\ttrue\n161\t9\tdark_oak_leaves\tdecayable\ttrue\tcheck_decay\ttrue\n161\t12\tacacia_leaves\tdecayable\tfalse\tcheck_decay\ttrue\n161\t13\tdark_oak_leaves\tdecayable\tfalse\tcheck_decay\ttrue\n162\t0\tacacia_log\taxis\ty\n162\t1\tdark_oak_log\taxis\ty\n162\t4\tacacia_log\taxis\tx\n162\t5\tdark_oak_log\taxis\tx\n162\t8\tacacia_log\taxis\tz\n162\t9\tdark_oak_log\taxis\tz\n162\t12\tacacia_bark\n162\t13\tdark_oak_bark\n163\t0\tacacia_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n163\t1\tacacia_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n163\t2\tacacia_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n163\t3\tacacia_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n163\t4\tacacia_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n163\t5\tacacia_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n163\t6\tacacia_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n163\t7\tacacia_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n164\t0\tdark_oak_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n164\t1\tdark_oak_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n164\t2\tdark_oak_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n164\t3\tdark_oak_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n164\t4\tdark_oak_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n164\t5\tdark_oak_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n164\t6\tdark_oak_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n164\t7\tdark_oak_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n165\t0\tslime_block\n166\t0\tbarrier\n167\t0\tiron_trapdoor\tfacing\tnorth\topen\tfalse\thalf\tbottom\n167\t1\tiron_trapdoor\tfacing\tsouth\topen\tfalse\thalf\tbottom\n167\t2\tiron_trapdoor\tfacing\twest\topen\tfalse\thalf\tbottom\n167\t3\tiron_trapdoor\tfacing\teast\topen\tfalse\thalf\tbottom\n167\t4\tiron_trapdoor\tfacing\tnorth\topen\ttrue\thalf\tbottom\n167\t5\tiron_trapdoor\tfacing\tsouth\topen\ttrue\thalf\tbottom\n167\t6\tiron_trapdoor\tfacing\twest\topen\ttrue\thalf\tbottom\n167\t7\tiron_trapdoor\tfacing\teast\topen\ttrue\thalf\tbottom\n167\t8\tiron_trapdoor\tfacing\tnorth\topen\tfalse\thalf\ttop\n167\t9\tiron_trapdoor\tfacing\tsouth\topen\tfalse\thalf\ttop\n167\t10\tiron_trapdoor\tfacing\twest\topen\tfalse\thalf\ttop\n167\t11\tiron_trapdoor\tfacing\teast\topen\tfalse\thalf\ttop\n167\t12\tiron_trapdoor\tfacing\tnorth\topen\ttrue\thalf\ttop\n167\t13\tiron_trapdoor\tfacing\tsouth\topen\ttrue\thalf\ttop\n167\t14\tiron_trapdoor\tfacing\twest\topen\ttrue\thalf\ttop\n167\t15\tiron_trapdoor\tfacing\teast\topen\ttrue\thalf\ttop\n168\t0\tprismarine\n168\t1\tprismarine_bricks\n168\t2\tdark_prismarine\n169\t0\tsea_lantern\n170\t0\thay_block\taxis\ty\n170\t4\thay_block\taxis\tx\n170\t8\thay_block\taxis\tz\n171\t0\twhite_carpet\n171\t1\torange_carpet\n171\t2\tmagenta_carpet\n171\t3\tlight_blue_carpet\n171\t4\tyellow_carpet\n171\t5\tlime_carpet\n171\t6\tpink_carpet\n171\t7\tgray_carpet\n171\t8\tlight_gray_carpet\n171\t9\tcyan_carpet\n171\t10\tpurple_carpet\n171\t11\tblue_carpet\n171\t12\tbrown_carpet\n171\t13\tgreen_carpet\n171\t14\tred_carpet\n171\t15\tblack_carpet\n172\t0\tterracotta\n173\t0\tcoal_block\n174\t0\tpacked_ice\n175\t0\tsunflower\thalf\tlower\n175\t1\tlilac\thalf\tlower\n175\t2\ttall_grass\thalf\tlower\n175\t3\tlarge_fern\thalf\tlower\n175\t4\trose_bush\thalf\tlower\n175\t5\tpeony\thalf\tlower\n175\t8\tpeony\thalf\tupper\n175\t9\tpeony\thalf\tupper\n175\t10\tpeony\thalf\tupper\n175\t11\tpeony\thalf\tupper\n176\t0\twhite_banner\trotation\t0\n176\t1\twhite_banner\trotation\t1\n176\t2\twhite_banner\trotation\t2\n176\t3\twhite_banner\trotation\t3\n176\t4\twhite_banner\trotation\t4\n176\t5\twhite_banner\trotation\t5\n176\t6\twhite_banner\trotation\t6\n176\t7\twhite_banner\trotation\t7\n176\t8\twhite_banner\trotation\t8\n176\t9\twhite_banner\trotation\t9\n176\t10\twhite_banner\trotation\t10\n176\t11\twhite_banner\trotation\t11\n176\t12\twhite_banner\trotation\t12\n176\t13\twhite_banner\trotation\t13\n176\t14\twhite_banner\trotation\t14\n176\t15\twhite_banner\trotation\t15\n177\t2\twhite_wall_banner\tfacing\tnorth\n177\t3\twhite_wall_banner\tfacing\tsouth\n177\t4\twhite_wall_banner\tfacing\twest\n177\t5\twhite_wall_banner\tfacing\teast\n178\t0\tdaylight_detector\tinverted\ttrue\tpower\t0\n178\t1\tdaylight_detector\tinverted\ttrue\tpower\t1\n178\t2\tdaylight_detector\tinverted\ttrue\tpower\t2\n178\t3\tdaylight_detector\tinverted\ttrue\tpower\t3\n178\t4\tdaylight_detector\tinverted\ttrue\tpower\t4\n178\t5\tdaylight_detector\tinverted\ttrue\tpower\t5\n178\t6\tdaylight_detector\tinverted\ttrue\tpower\t6\n178\t7\tdaylight_detector\tinverted\ttrue\tpower\t7\n178\t8\tdaylight_detector\tinverted\ttrue\tpower\t8\n178\t9\tdaylight_detector\tinverted\ttrue\tpower\t9\n178\t10\tdaylight_detector\tinverted\ttrue\tpower\t10\n178\t11\tdaylight_detector\tinverted\ttrue\tpower\t11\n178\t12\tdaylight_detector\tinverted\ttrue\tpower\t12\n178\t13\tdaylight_detector\tinverted\ttrue\tpower\t13\n178\t14\tdaylight_detector\tinverted\ttrue\tpower\t14\n178\t15\tdaylight_detector\tinverted\ttrue\tpower\t15\n179\t0\tred_sandstone\n179\t1\tchiseled_red_sandstone\n179\t2\tcut_red_sandstone\n180\t0\tred_sandstone_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n180\t1\tred_sandstone_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n180\t2\tred_sandstone_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n180\t3\tred_sandstone_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n180\t4\tred_sandstone_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n180\t5\tred_sandstone_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n180\t6\tred_sandstone_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n180\t7\tred_sandstone_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n181\t0\tred_sandstone_slab\ttype\tdouble\n181\t8\tsmooth_red_sandstone\n182\t0\tred_sandstone_slab\ttype\tbottom\n182\t8\tred_sandstone_slab\ttype\ttop\n183\t0\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n183\t1\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n183\t2\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n183\t3\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n183\t4\tspruce_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n183\t5\tspruce_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n183\t6\tspruce_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n183\t7\tspruce_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n183\t8\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n183\t9\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n183\t10\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n183\t11\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n183\t12\tspruce_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n183\t13\tspruce_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n183\t14\tspruce_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n183\t15\tspruce_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n184\t0\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n184\t1\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n184\t2\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n184\t3\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n184\t4\tbirch_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n184\t5\tbirch_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n184\t6\tbirch_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n184\t7\tbirch_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n184\t8\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n184\t9\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n184\t10\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n184\t11\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n184\t12\tbirch_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n184\t13\tbirch_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n184\t14\tbirch_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n184\t15\tbirch_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n185\t0\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n185\t1\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n185\t2\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n185\t3\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n185\t4\tjungle_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n185\t5\tjungle_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n185\t6\tjungle_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n185\t7\tjungle_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n185\t8\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n185\t9\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n185\t10\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n185\t11\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n185\t12\tjungle_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n185\t13\tjungle_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n185\t14\tjungle_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n185\t15\tjungle_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n186\t0\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n186\t1\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n186\t2\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n186\t3\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n186\t4\tdark_oak_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n186\t5\tdark_oak_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n186\t6\tdark_oak_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n186\t7\tdark_oak_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n186\t8\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n186\t9\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n186\t10\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n186\t11\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n186\t12\tdark_oak_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n186\t13\tdark_oak_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n186\t14\tdark_oak_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n186\t15\tdark_oak_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n187\t0\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n187\t1\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n187\t2\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n187\t3\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\tfalse\tin_wall\tfalse\n187\t4\tacacia_fence_gate\tfacing\tsouth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n187\t5\tacacia_fence_gate\tfacing\twest\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n187\t6\tacacia_fence_gate\tfacing\tnorth\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n187\t7\tacacia_fence_gate\tfacing\teast\tpowered\tfalse\topen\ttrue\tin_wall\tfalse\n187\t8\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n187\t9\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n187\t10\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n187\t11\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\tfalse\tin_wall\tfalse\n187\t12\tacacia_fence_gate\tfacing\tsouth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n187\t13\tacacia_fence_gate\tfacing\twest\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n187\t14\tacacia_fence_gate\tfacing\tnorth\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n187\t15\tacacia_fence_gate\tfacing\teast\tpowered\ttrue\topen\ttrue\tin_wall\tfalse\n188\t0\tspruce_fence\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n189\t0\tbirch_fence\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n190\t0\tjungle_fence\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n191\t0\tdark_oak_fence\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n192\t0\tacacia_fence\teast\tfalse\tnorth\tfalse\twest\tfalse\tsouth\tfalse\n193\t0\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n193\t1\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n193\t2\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n193\t3\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n193\t4\tspruce_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n193\t5\tspruce_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n193\t6\tspruce_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n193\t7\tspruce_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n193\t8\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n193\t9\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n193\t10\tspruce_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n193\t11\tspruce_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n194\t0\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n194\t1\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n194\t2\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n194\t3\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n194\t4\tbirch_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n194\t5\tbirch_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n194\t6\tbirch_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n194\t7\tbirch_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n194\t8\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n194\t9\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n194\t10\tbirch_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n194\t11\tbirch_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n195\t0\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n195\t1\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n195\t2\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n195\t3\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n195\t4\tjungle_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n195\t5\tjungle_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n195\t6\tjungle_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n195\t7\tjungle_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n195\t8\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n195\t9\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n195\t10\tjungle_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n195\t11\tjungle_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n196\t0\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n196\t1\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n196\t2\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n196\t3\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n196\t4\tacacia_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n196\t5\tacacia_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n196\t6\tacacia_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n196\t7\tacacia_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n196\t8\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n196\t9\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n196\t10\tacacia_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n196\t11\tacacia_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n197\t0\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\tfalse\n197\t1\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\tfalse\n197\t2\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\tfalse\n197\t3\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\tfalse\n197\t4\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\teast\tpowered\tfalse\topen\ttrue\n197\t5\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tsouth\tpowered\tfalse\topen\ttrue\n197\t6\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\twest\tpowered\tfalse\topen\ttrue\n197\t7\tdark_oak_door\thinge\tright\thalf\tlower\tfacing\tnorth\tpowered\tfalse\topen\ttrue\n197\t8\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n197\t9\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\tfalse\topen\tfalse\n197\t10\tdark_oak_door\thinge\tleft\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n197\t11\tdark_oak_door\thinge\tright\thalf\tupper\tfacing\teast\tpowered\ttrue\topen\tfalse\n198\t0\tend_rod\tfacing\tdown\n198\t1\tend_rod\tfacing\tup\n198\t2\tend_rod\tfacing\tnorth\n198\t3\tend_rod\tfacing\tsouth\n198\t4\tend_rod\tfacing\twest\n198\t5\tend_rod\tfacing\teast\n199\t0\tchorus_plant\tup\tfalse\tsouth\tfalse\teast\tfalse\tnorth\tfalse\tdown\tfalse\twest\tfalse\n200\t0\tchorus_flower\tage\t0\n200\t1\tchorus_flower\tage\t1\n200\t2\tchorus_flower\tage\t2\n200\t3\tchorus_flower\tage\t3\n200\t4\tchorus_flower\tage\t4\n200\t5\tchorus_flower\tage\t5\n201\t0\tpurpur_block\n202\t0\tpurpur_pillar\taxis\ty\n202\t4\tpurpur_pillar\taxis\tx\n202\t8\tpurpur_pillar\taxis\tz\n203\t0\tpurpur_stairs\tfacing\teast\tshape\tstraight\thalf\tbottom\n203\t1\tpurpur_stairs\tfacing\twest\tshape\tstraight\thalf\tbottom\n203\t2\tpurpur_stairs\tfacing\tsouth\tshape\tstraight\thalf\tbottom\n203\t3\tpurpur_stairs\tfacing\tnorth\tshape\tstraight\thalf\tbottom\n203\t4\tpurpur_stairs\tfacing\teast\tshape\tstraight\thalf\ttop\n203\t5\tpurpur_stairs\tfacing\twest\tshape\tstraight\thalf\ttop\n203\t6\tpurpur_stairs\tfacing\tsouth\tshape\tstraight\thalf\ttop\n203\t7\tpurpur_stairs\tfacing\tnorth\tshape\tstraight\thalf\ttop\n204\t0\tpurpur_slab\ttype\tdouble\n205\t0\tpurpur_slab\ttype\tbottom\n205\t8\tpurpur_slab\ttype\ttop\n206\t0\tend_stone_bricks\n207\t0\tbeetroots\tage\t0\n207\t1\tbeetroots\tage\t1\n207\t2\tbeetroots\tage\t2\n207\t3\tbeetroots\tage\t3\n208\t0\tgrass_path\n209\t0\tend_gateway\n210\t0\trepeating_command_block\tconditional\tfalse\tfacing\tdown\n210\t1\trepeating_command_block\tconditional\tfalse\tfacing\tup\n210\t2\trepeating_command_block\tconditional\tfalse\tfacing\tnorth\n210\t3\trepeating_command_block\tconditional\tfalse\tfacing\tsouth\n210\t4\trepeating_command_block\tconditional\tfalse\tfacing\twest\n210\t5\trepeating_command_block\tconditional\tfalse\tfacing\teast\n210\t8\trepeating_command_block\tconditional\ttrue\tfacing\tdown\n210\t9\trepeating_command_block\tconditional\ttrue\tfacing\tup\n210\t10\trepeating_command_block\tconditional\ttrue\tfacing\tnorth\n210\t11\trepeating_command_block\tconditional\ttrue\tfacing\tsouth\n210\t12\trepeating_command_block\tconditional\ttrue\tfacing\twest\n210\t13\trepeating_command_block\tconditional\ttrue\tfacing\teast\n211\t0\tchain_command_block\tconditional\tfalse\tfacing\tdown\n211\t1\tchain_command_block\tconditional\tfalse\tfacing\tup\n211\t2\tchain_command_block\tconditional\tfalse\tfacing\tnorth\n211\t3\tchain_command_block\tconditional\tfalse\tfacing\tsouth\n211\t4\tchain_command_block\tconditional\tfalse\tfacing\twest\n211\t5\tchain_command_block\tconditional\tfalse\tfacing\teast\n211\t8\tchain_command_block\tconditional\ttrue\tfacing\tdown\n211\t9\tchain_command_block\tconditional\ttrue\tfacing\tup\n211\t10\tchain_command_block\tconditional\ttrue\tfacing\tnorth\n211\t11\tchain_command_block\tconditional\ttrue\tfacing\tsouth\n211\t12\tchain_command_block\tconditional\ttrue\tfacing\twest\n211\t13\tchain_command_block\tconditional\ttrue\tfacing\teast\n212\t0\tfrosted_ice\tage\t0\n212\t1\tfrosted_ice\tage\t1\n212\t2\tfrosted_ice\tage\t2\n212\t3\tfrosted_ice\tage\t3\n213\t0\tmagma_block\n214\t0\tnether_wart_block\n215\t0\tred_nether_bricks\n216\t0\tbone_block\taxis\ty\n216\t4\tbone_block\taxis\tx\n216\t8\tbone_block\taxis\tz\n217\t0\tstructure_void\n218\t0\tobserver\tfacing\tdown\tpowered\tfalse\n218\t1\tobserver\tfacing\tup\tpowered\tfalse\n218\t2\tobserver\tfacing\tnorth\tpowered\tfalse\n218\t3\tobserver\tfacing\tsouth\tpowered\tfalse\n218\t4\tobserver\tfacing\twest\tpowered\tfalse\n218\t5\tobserver\tfacing\teast\tpowered\tfalse\n218\t8\tobserver\tfacing\tdown\tpowered\ttrue\n218\t9\tobserver\tfacing\tup\tpowered\ttrue\n218\t10\tobserver\tfacing\tnorth\tpowered\ttrue\n218\t11\tobserver\tfacing\tsouth\tpowered\ttrue\n218\t12\tobserver\tfacing\twest\tpowered\ttrue\n218\t13\tobserver\tfacing\teast\tpowered\ttrue\n219\t0\twhite_shulker_box\tfacing\tdown\n219\t1\twhite_shulker_box\tfacing\tup\n219\t2\twhite_shulker_box\tfacing\tnorth\n219\t3\twhite_shulker_box\tfacing\tsouth\n219\t4\twhite_shulker_box\tfacing\twest\n219\t5\twhite_shulker_box\tfacing\teast\n220\t0\torange_shulker_box\tfacing\tdown\n220\t1\torange_shulker_box\tfacing\tup\n220\t2\torange_shulker_box\tfacing\tnorth\n220\t3\torange_shulker_box\tfacing\tsouth\n220\t4\torange_shulker_box\tfacing\twest\n220\t5\torange_shulker_box\tfacing\teast\n221\t0\tmagenta_shulker_box\tfacing\tdown\n221\t1\tmagenta_shulker_box\tfacing\tup\n221\t2\tmagenta_shulker_box\tfacing\tnorth\n221\t3\tmagenta_shulker_box\tfacing\tsouth\n221\t4\tmagenta_shulker_box\tfacing\twest\n221\t5\tmagenta_shulker_box\tfacing\teast\n222\t0\tlight_blue_shulker_box\tfacing\tdown\n222\t1\tlight_blue_shulker_box\tfacing\tup\n222\t2\tlight_blue_shulker_box\tfacing\tnorth\n222\t3\tlight_blue_shulker_box\tfacing\tsouth\n222\t4\tlight_blue_shulker_box\tfacing\twest\n222\t5\tlight_blue_shulker_box\tfacing\teast\n223\t0\tyellow_shulker_box\tfacing\tdown\n223\t1\tyellow_shulker_box\tfacing\tup\n223\t2\tyellow_shulker_box\tfacing\tnorth\n223\t3\tyellow_shulker_box\tfacing\tsouth\n223\t4\tyellow_shulker_box\tfacing\twest\n223\t5\tyellow_shulker_box\tfacing\teast\n224\t0\tlime_shulker_box\tfacing\tdown\n224\t1\tlime_shulker_box\tfacing\tup\n224\t2\tlime_shulker_box\tfacing\tnorth\n224\t3\tlime_shulker_box\tfacing\tsouth\n224\t4\tlime_shulker_box\tfacing\twest\n224\t5\tlime_shulker_box\tfacing\teast\n225\t0\tpink_shulker_box\tfacing\tdown\n225\t1\tpink_shulker_box\tfacing\tup\n225\t2\tpink_shulker_box\tfacing\tnorth\n225\t3\tpink_shulker_box\tfacing\tsouth\n225\t4\tpink_shulker_box\tfacing\twest\n225\t5\tpink_shulker_box\tfacing\teast\n226\t0\tgray_shulker_box\tfacing\tdown\n226\t1\tgray_shulker_box\tfacing\tup\n226\t2\tgray_shulker_box\tfacing\tnorth\n226\t3\tgray_shulker_box\tfacing\tsouth\n226\t4\tgray_shulker_box\tfacing\twest\n226\t5\tgray_shulker_box\tfacing\teast\n227\t0\tlight_gray_shulker_box\tfacing\tdown\n227\t1\tlight_gray_shulker_box\tfacing\tup\n227\t2\tlight_gray_shulker_box\tfacing\tnorth\n227\t3\tlight_gray_shulker_box\tfacing\tsouth\n227\t4\tlight_gray_shulker_box\tfacing\twest\n227\t5\tlight_gray_shulker_box\tfacing\teast\n228\t0\tcyan_shulker_box\tfacing\tdown\n228\t1\tcyan_shulker_box\tfacing\tup\n228\t2\tcyan_shulker_box\tfacing\tnorth\n228\t3\tcyan_shulker_box\tfacing\tsouth\n228\t4\tcyan_shulker_box\tfacing\twest\n228\t5\tcyan_shulker_box\tfacing\teast\n229\t0\tpurple_shulker_box\tfacing\tdown\n229\t1\tpurple_shulker_box\tfacing\tup\n229\t2\tpurple_shulker_box\tfacing\tnorth\n229\t3\tpurple_shulker_box\tfacing\tsouth\n229\t4\tpurple_shulker_box\tfacing\twest\n229\t5\tpurple_shulker_box\tfacing\teast\n230\t0\tblue_shulker_box\tfacing\tdown\n230\t1\tblue_shulker_box\tfacing\tup\n230\t2\tblue_shulker_box\tfacing\tnorth\n230\t3\tblue_shulker_box\tfacing\tsouth\n230\t4\tblue_shulker_box\tfacing\twest\n230\t5\tblue_shulker_box\tfacing\teast\n231\t0\tbrown_shulker_box\tfacing\tdown\n231\t1\tbrown_shulker_box\tfacing\tup\n231\t2\tbrown_shulker_box\tfacing\tnorth\n231\t3\tbrown_shulker_box\tfacing\tsouth\n231\t4\tbrown_shulker_box\tfacing\twest\n231\t5\tbrown_shulker_box\tfacing\teast\n232\t0\tgreen_shulker_box\tfacing\tdown\n232\t1\tgreen_shulker_box\tfacing\tup\n232\t2\tgreen_shulker_box\tfacing\tnorth\n232\t3\tgreen_shulker_box\tfacing\tsouth\n232\t4\tgreen_shulker_box\tfacing\twest\n232\t5\tgreen_shulker_box\tfacing\teast\n233\t0\tred_shulker_box\tfacing\tdown\n233\t1\tred_shulker_box\tfacing\tup\n233\t2\tred_shulker_box\tfacing\tnorth\n233\t3\tred_shulker_box\tfacing\tsouth\n233\t4\tred_shulker_box\tfacing\twest\n233\t5\tred_shulker_box\tfacing\teast\n234\t0\tblack_shulker_box\tfacing\tdown\n234\t1\tblack_shulker_box\tfacing\tup\n234\t2\tblack_shulker_box\tfacing\tnorth\n234\t3\tblack_shulker_box\tfacing\tsouth\n234\t4\tblack_shulker_box\tfacing\twest\n234\t5\tblack_shulker_box\tfacing\teast\n235\t0\twhite_glazed_terracotta\tfacing\tsouth\n235\t1\twhite_glazed_terracotta\tfacing\twest\n235\t2\twhite_glazed_terracotta\tfacing\tnorth\n235\t3\twhite_glazed_terracotta\tfacing\teast\n236\t0\torange_glazed_terracotta\tfacing\tsouth\n236\t1\torange_glazed_terracotta\tfacing\twest\n236\t2\torange_glazed_terracotta\tfacing\tnorth\n236\t3\torange_glazed_terracotta\tfacing\teast\n237\t0\tmagenta_glazed_terracotta\tfacing\tsouth\n237\t1\tmagenta_glazed_terracotta\tfacing\twest\n237\t2\tmagenta_glazed_terracotta\tfacing\tnorth\n237\t3\tmagenta_glazed_terracotta\tfacing\teast\n238\t0\tlight_blue_glazed_terracotta\tfacing\tsouth\n238\t1\tlight_blue_glazed_terracotta\tfacing\twest\n238\t2\tlight_blue_glazed_terracotta\tfacing\tnorth\n238\t3\tlight_blue_glazed_terracotta\tfacing\teast\n239\t0\tyellow_glazed_terracotta\tfacing\tsouth\n239\t1\tyellow_glazed_terracotta\tfacing\twest\n239\t2\tyellow_glazed_terracotta\tfacing\tnorth\n239\t3\tyellow_glazed_terracotta\tfacing\teast\n240\t0\tlime_glazed_terracotta\tfacing\tsouth\n240\t1\tlime_glazed_terracotta\tfacing\twest\n240\t2\tlime_glazed_terracotta\tfacing\tnorth\n240\t3\tlime_glazed_terracotta\tfacing\teast\n241\t0\tpink_glazed_terracotta\tfacing\tsouth\n241\t1\tpink_glazed_terracotta\tfacing\twest\n241\t2\tpink_glazed_terracotta\tfacing\tnorth\n241\t3\tpink_glazed_terracotta\tfacing\teast\n242\t0\tgray_glazed_terracotta\tfacing\tsouth\n242\t1\tgray_glazed_terracotta\tfacing\twest\n242\t2\tgray_glazed_terracotta\tfacing\tnorth\n242\t3\tgray_glazed_terracotta\tfacing\teast\n243\t0\tlight_gray_glazed_terracotta\tfacing\tsouth\n243\t1\tlight_gray_glazed_terracotta\tfacing\twest\n243\t2\tlight_gray_glazed_terracotta\tfacing\tnorth\n243\t3\tlight_gray_glazed_terracotta\tfacing\teast\n244\t0\tcyan_glazed_terracotta\tfacing\tsouth\n244\t1\tcyan_glazed_terracotta\tfacing\twest\n244\t2\tcyan_glazed_terracotta\tfacing\tnorth\n244\t3\tcyan_glazed_terracotta\tfacing\teast\n245\t0\tpurple_glazed_terracotta\tfacing\tsouth\n245\t1\tpurple_glazed_terracotta\tfacing\twest\n245\t2\tpurple_glazed_terracotta\tfacing\tnorth\n245\t3\tpurple_glazed_terracotta\tfacing\teast\n246\t0\tblue_glazed_terracotta\tfacing\tsouth\n246\t1\tblue_glazed_terracotta\tfacing\twest\n246\t2\tblue_glazed_terracotta\tfacing\tnorth\n246\t3\tblue_glazed_terracotta\tfacing\teast\n247\t0\tbrown_glazed_terracotta\tfacing\tsouth\n247\t1\tbrown_glazed_terracotta\tfacing\twest\n247\t2\tbrown_glazed_terracotta\tfacing\tnorth\n247\t3\tbrown_glazed_terracotta\tfacing\teast\n248\t0\tgreen_glazed_terracotta\tfacing\tsouth\n248\t1\tgreen_glazed_terracotta\tfacing\twest\n248\t2\tgreen_glazed_terracotta\tfacing\tnorth\n248\t3\tgreen_glazed_terracotta\tfacing\teast\n249\t0\tred_glazed_terracotta\tfacing\tsouth\n249\t1\tred_glazed_terracotta\tfacing\twest\n249\t2\tred_glazed_terracotta\tfacing\tnorth\n249\t3\tred_glazed_terracotta\tfacing\teast\n250\t0\tblack_glazed_terracotta\tfacing\tsouth\n250\t1\tblack_glazed_terracotta\tfacing\twest\n250\t2\tblack_glazed_terracotta\tfacing\tnorth\n250\t3\tblack_glazed_terracotta\tfacing\teast\n251\t0\twhite_concrete\n251\t1\torange_concrete\n251\t2\tmagenta_concrete\n251\t3\tlight_blue_concrete\n251\t4\tyellow_concrete\n251\t5\tlime_concrete\n251\t6\tpink_concrete\n251\t7\tgray_concrete\n251\t8\tlight_gray_concrete\n251\t9\tcyan_concrete\n251\t10\tpurple_concrete\n251\t11\tblue_concrete\n251\t12\tbrown_concrete\n251\t13\tgreen_concrete\n251\t14\tred_concrete\n251\t15\tblack_concrete\n252\t0\twhite_concrete_powder\n252\t1\torange_concrete_powder\n252\t2\tmagenta_concrete_powder\n252\t3\tlight_blue_concrete_powder\n252\t4\tyellow_concrete_powder\n252\t5\tlime_concrete_powder\n252\t6\tpink_concrete_powder\n252\t7\tgray_concrete_powder\n252\t8\tlight_gray_concrete_powder\n252\t9\tcyan_concrete_powder\n252\t10\tpurple_concrete_powder\n252\t11\tblue_concrete_powder\n252\t12\tbrown_concrete_powder\n252\t13\tgreen_concrete_powder\n252\t14\tred_concrete_powder\n252\t15\tblack_concrete_powder\n255\t0\tstructure_block\tmode\tsave\n255\t1\tstructure_block\tmode\tload\n255\t2\tstructure_block\tmode\tcorner\n255\t3\tstructure_block\tmode\tdata\n"
  },
  {
    "path": "Server/README.txt",
    "content": "--------------------------------------------------------------------------------\n   Welcome to your new Cuberite server, compatible with Minecraft 1.8 - 1.12!\n--------------------------------------------------------------------------------\n\n - To get started with your server, read the user's manual at\n   https://book.cuberite.org/\n\n - Subscribe to the Newsletter for update news and important information at\n   https://cuberite.org/news/#subscribe\n\n - For information about adding plugins to your server, visit\n   https://cuberite.org/plugins/\n\n - For additional support, visit https://cuberite.org/discuss/\n\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "Server/brewing.txt",
    "content": "#*****************#\n# Brewing Recipes #\n#*****************#\n# The time for a brewing recipe is always 20 seconds (400 ticks).\n#\n# Minecraft-Wiki Brewing:\n# https://minecraft.wiki/w/Brewing\n#\n# A brewing recipe has this format:\n# Data Value + Ingredient = Potion\n\n\n### Primary ###\n# Akward Potion\n0 + netherwart = 8208\n\n# Mundane Potion\n0 + redstonedust = 8192\n0 + ghasttear = 8192\n0 + glisteringmelon = 8192\n0 + blazepowder = 8192\n0 + magmacream = 8192\n0 + sugar = 8192\n0 + spidereye = 8192\n0 + rabbitsfoot = 8192\n\n# Thick Potion\n0 + glowstonedust = 8224\n\n# Potion of Weakness\n0 + fermentedspidereye = 8200\n\n\n\n\n### Secondary ###\n\n## Positive ##\n\n# Potion of Healing\n8208 + glisteringmelon = 8197\n\n# Potion of Fire Resistance\n8208 + magmacream = 8195\n\n# Potion of Regeneration\n8208 + ghasttear = 8193\n\n# Potion of Strength\n8208 + blazepowder = 8201\n\n# Potion of Swiftness\n8208 + sugar = 8194\n\n# Potion of Night Vision\n8208 + goldencarrot = 8198\n\n# Potion of Water Breathing\n8208 + pufferfish = 8205\n\n# Potion of Leaping\n8208 + rabbitsfoot = 8203\n\n\n## Negative ##\n\n# Potion of Poison\n8208 + spidereye = 8196\n\n# Potion of Weakness (extended)\n8200 + redstonedust = 8264\n\n\n\n\n### Tertiary ###\n\n## Positive ##\n\n# Potion of Fire Resistance (extended)\n8195 + redstonedust = 8259\n\n# Potion of Healing II\n8197 + glowstonedust = 8229\n\n# Potion of Regeneration (extended)\n8193 + redstonedust = 8257\n\n# Potion of Regeneration II\n8193 + glowstonedust = 8225\n\n# Potion of Strength (extended)\n8201 + redstonedust = 8265\n\n# Potion of Strength II\n8201 + glowstonedust = 8233\n\n# Potion of Swiftness (extended)\n8194 + redstonedust = 8258\n\n# Potion of Swiftness II\n8194 + glowstonedust = 8226\n\n# Potion of Night Vision (extended)\n8198 + redstonedust = 8262\n\n# Potion of Invisibility\n8198 + fermentedspidereye = 8206\n\n# Potion of Invisibility (extended)\n8262 + fermentedspidereye = 8270\n\n# Potion of Invisibility (extended)\n8206 + redstonedust = 8270\n\n# Potion of Water Breathing (extended)\n8205 + redstonedust = 8269\n\n# Potion of Leaping II\n8203 + glowstonedust = 8235\n\n# Potion of Leaping (extended)\n8203 + redstonedust = 8267\n\n\n## Negative ##\n\n# Potion of Harming\n8196 + fermentedspidereye = 8204\n8197 + fermentedspidereye = 8204\n8260 + fermentedspidereye = 8204\n\n# Potion of Harming II\n8228 + fermentedspidereye = 8236\n8229 + fermentedspidereye = 8236\n\n# Potion of Harming II\n8204 + glowstonedust = 8236\n\n# Potion of Poison (extended)\n8196 + redstonedust = 8260\n\n# Potion of Poison II\n8196 + glowstonedust = 8228\n\n# Potion of Slowness\n8194 + fermentedspidereye = 8202\n8203 + fermentedspidereye = 8202\n\n# Potion of Slowness (extended)\n8202 + redstonedust = 8266\n\n# Potion of Slowness (extended)\n8258 + fermentedspidereye = 8266\n8267 + fermentedspidereye = 8266\n"
  },
  {
    "path": "Server/delete_windows_service.cmd",
    "content": "@echo off\r\nset SERVICENAME=\"Cuberite\"\r\n\r\nsc delete %SERVICENAME%\r\n"
  },
  {
    "path": "Server/furnace.txt",
    "content": "#*****************#\n# Furnace Recipes #\n#*****************#\n#\n#\n#******************************************************#\n#                Basic Notation Help\n#\n# **** Item Definition ****\n# An Item is defined by an Item Type, an amount (and damage)\n# The damage is optional, and if not specified it's assumed to be 0.\n# If a damage of -1 is specified, then the damage won't be checked when matching recipes.\n# Note that when specifying items using names from items.ini, those already contain the damage value in them,\n# so the damage value doesn't need to be specified here.\n#\n# Cactus Green example:\n#    351     :   2    ( ,   1    )\n#   ItemType : Damage ( , Amount )\n# or simple use the item name (marked in items.ini):\n#   CactusGreen ( , 1 )\n#\n#\n# **** Recipe and result ****\n#\n# Cobble @ 200 = Stone $ 15    -> Produces 1 smooth stone from 1 cobblestone in 200 ticks (10 seconds). Rewards 15 experience.\n#\n# Write in full:\n#    Cobble  :   0    ,   1    @  200  =    1     :   1    ,   1     $    10\n#   ItemType : Damage , Amount @ ticks = ItemType : Damage , Amount  $ Experience \n#\n#   If the experience parameter isn't included, experience reward will default to zero.\n#\n# **** Fuel ****\n#\n# !17:1 = 300 -> 1 Wood burns for 300 ticks (15 s)\n#\n#  !     Wood   ,   1    =  300\n# Fuel ItemType , Amount = ticks\n#\n#******************************************************#\n\n\n\n\n\n#--------------------------\n# Smelting recipes\n\nBeef                   = Steak                              $ 0.35\nBlackTerracotta        = BlackGlazedTerracotta              $ 0.1\nBlueTerracotta         = BlueGlazedTerracotta               $ 0.1\nBrownTerracotta        = BrownGlazedTerracotta              $ 0.10\nCactus                 = CactusGreen                        $ 0.2\nChainmailBoots:-1      = IronNugget                         $ 0.1\nChainmailChestplate:-1 = IronNugget                         $ 0.1\nChainmailHelmet:-1     = IronNugget                         $ 0.1\nChainmailLeggings:-1   = IronNugget                         $ 0.1\nChicken                = CookedChicken                      $ 0.35\nChorusFruit            = PoppedChorusFruit                  $ 0.1\nClay                   = Brick                              $ 0.3\nClayBlock              = HardenedClay                       $ 0.35\nCoalOre                = Coal                               $ 0.1\nCobblestone            = Stone                              $ 0.1\nCyanTerracotta         = CyanGlazedTerracotta               $ 0.1\nDiamondOre             = Diamond                            $ 1.0\nEmeraldOre             = Emerald                            $ 1.0\nFish                   = CookedFish                         $ 0.35\nGoldOre                = GoldIngot                          $ 1.0\nGoldAxe:-1             = GoldNugget                         $ 0.1\nGoldBoots:-1           = GoldNugget                         $ 0.1\nGoldChestplate:-1      = GoldNugget                         $ 0.1\nGoldHorseArmor:-1      = GoldNugget                         $ 0.1\nGoldHelmet:-1          = GoldNugget                         $ 0.1\nGoldHoe:-1             = GoldNugget                         $ 0.1\nGoldPants:-1           = GoldNugget                         $ 0.1\nGoldPickaxe:-1         = GoldNugget                         $ 0.1\nGoldShovel:-1          = GoldNugget                         $ 0.1\nGoldSword:-1           = GoldNugget                         $ 0.1\nGrayTerracotta         = GrayGlazedTerracotta               $ 0.1\nGreenTerracotta        = GreenGlazedTerracotta              $ 0.1\nIronOre                = IronIngot                          $ 0.7\nIronAxe:-1             = IronNugget                         $ 0.1\nIronBoots:-1           = IronNugget                         $ 0.1\nIronChestplate:-1      = IronNugget                         $ 0.1\nIronHorseArmor:-1      = IronNugget                         $ 0.1\nIronHelmet:-1          = IronNugget                         $ 0.1\nIronHoe:-1             = IronNugget                         $ 0.1\nIronLeggings:-1        = IronNugget                         $ 0.1\nIronPickaxe:-1         = IronNugget                         $ 0.1\nIronShovel:-1          = IronNugget                         $ 0.1\nIronSword:-1           = IronNugget                         $ 0.1\nLapisOre               = LapisLazuli                        $ 0.2\nLightBlueTerracotta    = LightBlueGlazedTerracotta          $ 0.1\nLightGrayTerracotta    = LightGrayGlazedTerracotta          $ 0.1\nLimeTerracotta         = LimeGlazedTerracotta               $ 0.1\nLog:-1                 = CharCoal                           $ 0.15\nLog2:-1                = CharCoal                           $ 0.15\nMagentaTerracotta      = MagentaGlazedTerracotta            $ 0.1\nMutton                 = CookedMutton                       $ 0.35\nNetherQuartzOre        = NetherQuartz                       $ 0.2\nNetherrack             = NetherBrick                        $ 0.1\nOrangeTerracotta       = OrangeGlazedTerracotta             $ 0.1\nPinkTerracotta         = PinkGlazedTerracotta               $ 0.1\nPorkchop               = CookedPorkchop                     $ 0.35\nPotato                 = BakedPotato                        $ 0.35\nPurpleTerracotta       = PurpleGlazedTerracotta             $ 0.1\nRabbit                 = CookedRabbit                       $ 0.35\nRedTerracotta          = RedGlazedTerracotta                $ 0.1\nRedstoneOre            = Redstone                           $ 0.7\nSalmon                 = CookedSalmon                       $ 0.35\nSand                   = Glass                              $ 0.1\nStoneBrick             = CrackedStoneBricks                 $ 0.1\nWetSponge              = Sponge                             $ 0.15\nWhiteTerracotta        = WhiteGlazedTerracotta              $ 0.1\nYellowTerracotta       = YellowGlazedTerracotta             $ 0.1\n\n\n\n\n#--------------------------\n# Fuels\n\n! AcaciaBoat      = 400    # -> 20 sec\n! AcaciaDoor      = 200    # -> 10 sec\n! AcaciaFence     = 300    # -> 15 sec\n! AcaciaFenceGate = 300    # -> 15 sec\n! AcaciaStairs    = 300    # -> 15 sec\n! Banner          = 300    # -> 15 sec\n! BirchBoat       = 400    # -> 20 sec\n! BirchDoor       = 200    # -> 10 sec\n! BirchFence      = 300    # -> 15 sec\n! BirchFenceGate  = 300    # -> 15 sec\n! BirchStairs     = 300    # -> 15 sec\n! BlazeRod        = 2400   # -> 120 sec\n! Boat            = 400    # -> 20 sec\n! Bookshelf       = 300    # -> 15 sec\n! Bow             = 300    # -> 15 sec\n! Bowl            = 100    # -> 5 sec\n! BrownMushroomBlock = 300 # -> 15 sec\n! Carpet          = 67     # -> 3.35 sec\n! CharCoal        = 1600   # -> 80 sec\n! Chest           = 300    # -> 15 sec\n! Coal            = 1600   # -> 80 sec\n! CoalBlock       = 16000  # -> 800 sec\n! CraftingTable   = 300    # -> 15 sec\n! DarkOakBoat     = 400    # -> 20 sec\n! DarkOakDoor     = 200    # -> 10 sec\n! DarkOakFence    = 300    # -> 15 sec\n! DarkOakFenceGate = 300   # -> 15 sec\n! DarkOakStairs   = 300    # -> 15 sec\n! DaylightSensor  = 300    # -> 15 sec\n! Fence           = 300    # -> 15 sec\n! FenceGate       = 300    # -> 15 sec\n! FishingRod      = 300    # -> 15 sec\n! Jukebox         = 300    # -> 15 sec\n! JungleBoat      = 400    # -> 20 sec\n! JungleDoor      = 200    # -> 10 sec\n! JungleFence     = 300    # -> 15 sec\n! JungleFenceGate = 300    # -> 15 sec\n! JungleStairs    = 300    # -> 15 sec\n! Ladder          = 300    # -> 15 sec\n! Lavabucket      = 20000  # -> 1000 sec\n! Log             = 300    # -> 15 sec\n! Log2            = 300    # -> 15 sec\n! NoteBlock       = 300    # -> 15 sec\n! OakStairs       = 300    # -> 15 sec\n! Planks          = 300    # -> 15 sec\n! RedMushroomBlock = 300   # -> 15 sec\n! Sapling         = 100    # -> 5 sec\n! Sign            = 200    # -> 10 sec\n! SpruceBoat      = 400    # -> 20 sec\n! SpruceDoor      = 200    # -> 10 sec\n! SpruceFence     = 300    # -> 15 sec\n! SpruceFenceGate = 300    # -> 15 sec\n! SpruceStairs    = 300    # -> 15 sec\n! Stick           = 100    # -> 5 sec\n! Trapdoor        = 300    # -> 15 sec\n! TrappedChest    = 300    # -> 15 sec\n! WoodenAxe       = 200    # -> 10 sec\n! WoodenButton    = 100    # -> 5 sec\n! WoodenDoor      = 200    # -> 10 sec\n! WoodenHoe       = 200    # -> 10 sec\n! WoodenPressurePlate = 300 # -> 15 sec\n! WoodenPickaxe   = 200    # -> 10 sec\n! WoodenSlab      = 150    # -> 7.5 sec\n! WoodenShovel    = 200    # -> 10 sec\n! WoodenSword     = 200    # -> 10 sec\n! Wool            = 100    # -> 5 sec\n"
  },
  {
    "path": "Server/hg",
    "content": "#! /bin/bash\n\n# This script runs Cuberite under helgrind\n# It expects valgrind to be normally installed and available\n# Note that this is for Linux only and debug-only, since it slows down MCS way too much\n\nvalgrind --log-file=helgrind.log --suppressions=hg.supp --gen-suppressions=all --tool=helgrind -v ./Cuberite\n"
  },
  {
    "path": "Server/hg.supp",
    "content": "# This is a valgrind suppressions file for running helgrind on Cuberite\n# Use by adding \"--suppressions=hg.supp\" to the helgrind commandline\n\n\n\n\n\n\n# This covers GCC bug 40518, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=40518\n# \"Erasing an empty string causes a global value write / race condition warning in helgrind\"\n# Original suppression authored by Jonathan Wakely: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=40518#c20\n# Modified by Mattes to match the mangled function name used on Ubuntu\n\n{\n  libstdcxx_std_string_race_pr40518\n  Helgrind:Race\n  fun:_ZNSs9_M_mutateEjjj\n}\n"
  },
  {
    "path": "Server/install_windows_service.cmd",
    "content": "rem Alter this if you need to install multiple instances.\r\n@echo off\r\nset SERVICENAME=\"Cuberite\"\r\n\r\nset CURRENTDIR=%CD%\r\nsc create %SERVICENAME% binPath= \"%CURRENTDIR%\\Cuberite.exe -d\" start= auto DisplayName= \"@%CURRENTDIR%\\Cuberite.exe,-1\"\r\nsc description %SERVICENAME% \"@%CURRENTDIR%\\Cuberite.exe,-2\"\r\n"
  },
  {
    "path": "Server/vg",
    "content": "#! /bin/bash\n\n# This script runs Cuberite under valgrind\n# It expects valgrind to be normally installed and available\n# Note that this is for Linux only and debug-only, since it slows down MCS way too much\n\nvalgrind --log-file=valgrind.log --suppressions=vg.supp --tool=memcheck --leak-check=full --leak-resolution=high --show-reachable=yes --track-origins=yes -v ./Cuberite\n"
  },
  {
    "path": "Server/vg.supp",
    "content": ""
  },
  {
    "path": "Server/webadmin/GenerateSelfSignedHTTPSCertUsingOpenssl.cmd",
    "content": "@echo off\necho This script generates the certificate and private key for the https webadmin\necho Note that the generated certificate is self-signed, and therefore not trusted by browsers\necho Note that this script requires openssl to be installed and in PATH\necho.\necho When OpenSSL asks you for Common Name, you need to enter the fully qualified domain name of the server, that is, e. g. gallery.xoft.cz\necho.\necho If OpenSSL fails with an error, \"WARNING: can't open config file: /usr/local/ssl/openssl.cnf\", you need to run this script as an administrator\necho.\n\nopenssl req -x509 -newkey rsa:2048 -keyout httpskey.pem -out httpscert.crt -days 3650 -nodes\npause\n"
  },
  {
    "path": "Server/webadmin/GenerateSelfSignedHTTPSCertUsingOpenssl.sh",
    "content": "#!/bin/bash\n\necho \"This script generates the certificate and private key for the https webadmin\"\necho \"Note that the generated certificate is self-signed, and therefore not trusted by browsers\"\necho \"Note that this script requires openssl to be installed and in PATH\"\necho \"\"\necho \"When OpenSSL asks you for Common Name, you need to enter the fully qualified domain name of the server, that is, e. g. gallery.xoft.cz\"\necho \"\"\n\nopenssl req -x509 -newkey rsa:2048 -keyout httpskey.pem -out httpscert.crt -days 3650 -nodes\n"
  },
  {
    "path": "Server/webadmin/files/guest.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<title>Guest Information</title>\n\t<style>\n\t\thtml {\n\t\t\tfont-family: Tahoma, Verdana, Arial, sans-serif;\n\t\t\tcolor: #343434;\n\t\t\tfont-size: 13px;\n\t\t\tline-height: 1.4;\n\t\t}\n\t</style>\n</head>\n<body>\n\t<p>\n\t\tHello! Welcome to the Cuberite WebAdmin.\n\t</p>\n\t<p>\n\t\tThis is a default message, edit <b>files/guest.html</b> to add your own custom message.\n\t</p>\n</body>\n</html>\n"
  },
  {
    "path": "Server/webadmin/files/style.css",
    "content": "/* Copyright Justin S and Cuberite Team, licensed under CC-BY-SA 3.0 */\n* {\n\tfont-family: inherit;\n\tmargin: 0;\n}\n\nhtml,\nbody {\n\theight: 100%;\n\twidth: 100%;\n}\n\nbody {\n\tfont-family: Tahoma, Verdana, Arial, sans-serif;\n\tbackground: #fff;\n\tcolor: #343434;\n\tdisplay: table;\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\nh4 {\n\tbackground: #F4F7F6;\n\tborder-bottom: 1px solid #CCDDD9;\n\tpadding: 8px 3px;\n}\n\nimg {\n\tborder: none;\n}\n\nul {\n\tpadding-top: 10px;\n\tpadding-bottom: 10px;\n}\n\np {\n\tmargin: 4px 0;\n\tpadding: 4px 3px;\n}\n\nhr {\n\tbackground: rgba(204, 221, 217, .6);\n\tborder: none;\n\theight: 1px;\n\tmargin: 5px 0;\n}\n\na {\n\tcolor: #666;\n\ttext-decoration: none;\n}\n\na:visited {\n\tcolor: #444;\n\ttext-decoration: none;\n}\n\na:hover, a:active {\n\tcolor: #888;\n\ttext-decoration: underline;\n}\n\n.color-background {\n\tbackground: #245A48;\n\tbackground: linear-gradient(200deg, #245d33, #24575D);\n\ttext-shadow: 0 2px 1px rgba(0, 0, 0, .15);\n}\n\n.wrapper {\n\tpadding: 0 15px;\n\tmargin: auto;\n\tmax-width: 1000px;\n}\n\n.header {\n\tborder-bottom: 1px solid rgba(0, 0, 0, .2);\n\tpadding: 13px 0;\n}\n\n.header a {\n\tcolor: #fff;\n\ttext-decoration: none;\n}\n\n.header svg {\n\tvertical-align: top;\n}\n\n.logo {\n\tbackground: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='42' height='42' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M6 3.04l-6 3v11.92l6 3 6 3 6-3 6-3V6.03l-6-3-6.02-3-6 3zm5.05 4.58l.96.47.96-.5.96-.47V5.96c0-.64.02-1.18.05-1.2.08-.03 4.24 2.12 4.24 2.2 0 .03-1.4.76-3.1 1.63L12 10.14 9.05 8.67C7.4 7.85 5.98 7.13 5.87 7.05l-.2-.12 2.18-1.1 2.2-1.1.02 1.2v1.2zm-4.08 3.72l3.1 1.58v6.34l-2.2-1.1c-1.2-.6-2.2-1.1-2.2-1.13 0-.02.57-.3 1.25-.65l1.25-.6v-1.75l-1-.5-1-.5-1.16.6-1.2.58c-.02 0-.04-1-.04-2.23s.02-2.24.05-2.24c.03 0 1.45.7 3.17 1.58zm13.23.68l-.06 2.2-1.15-.58-1.18-.58-1 .5-1 .5v.74c0 .4.04.8.06.9.03.08.34.28.94.57.5.25 1 .53 1.14.65l.24.2-2.15 1.08-2.13 1.08v-6.4l3.14-1.54c1.73-.86 3.16-1.55 3.16-1.54.02 0 0 1-.02 2.22z'/%3E%3C/svg%3E\") no-repeat left center;\n\tfont-size: 32px;\n\tfont-weight: bold;\n\tpadding: 6px 6px 6px 56px;\n\ttext-transform: uppercase;\n}\n\n.panel {\n\tbackground: #F4F7F6;\n\tborder-bottom: 1px solid #CCDDD9;\n\toverflow: hidden;\n\tpadding: 8px;\n}\n\n.welcome {\n\tdisplay: inline;\n}\n\n.stats {\n\tfloat: right;\n\tfont-weight: bold;\n\tpadding: 0;\n}\n\n.stats li {\n\tdisplay: inline;\n\tpadding: 0 0 0 20px;\n}\n\n.link-login {\n\tbackground: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='19' height='19' viewBox='0 0 24 24'%3E%3Cpath fill='%23B7A540' d='M12.65 10C11.7 7.31 8.9 5.5 5.77 6.12c-2.29.46-4.15 2.29-4.63 4.58C.32 14.57 3.26 18 7 18c2.61 0 4.83-1.67 5.65-4H17v2c0 1.1.9 2 2 2s2-.9 2-2v-2c1.1 0 2-.9 2-2s-.9-2-2-2h-8.35zM7 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z'/%3E%3C/svg%3E\") no-repeat left center;\n\tborder: 0;\n\tmargin: 0;\n\tpadding: 0 0 0 24px;\n}\n\n.link-login:hover,\n.link-login:active {\n\tcolor: #888;\n\ttext-decoration: underline;\n}\n\n.link-logout {\n\tbackground: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='19' height='19' viewBox='0 0 24 24'%3E%3Cpath fill='%23c14544' d='M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z'/%3E%3C/svg%3E\") no-repeat left center;\n\tmargin: 0 0 0 10px;\n\tpadding: 0 0 0 24px;\n}\n\n.columns {\n\tdisplay: table-row;\n\theight: 100%;\n}\n\n.columns-wrapper {\n\tdisplay: table;\n\tmargin: auto;\n\tmax-width: 1030px;\n\tpadding: 0;\n\twidth: 100%;\n}\n\n.columns-spacing {\n\tdisplay: table-cell;\n\tpadding: 15px;\n}\n\n.box {\n\tbackground: #f9fbfa;\n\tborder: 1px solid #CCDDD9;\n\tborder-radius: 7px;\n}\n\n.box.left {\n\tfloat: left;\n\tmargin: 0;\n\twidth: 220px;\n}\n\n.box.right {\n\tmargin: 0 0 0 235px;\n}\n\n.guest-iframe {\n\tborder: 0;\n\tmin-height: 250px;\n\tmax-height: 450px;\n}\n\n.head {\n\tborder-radius: 6px 6px 0 0;\n\tcolor: #fff;\n\tfont-size: 13px;\n\tfont-weight: bold;\n\tpadding: 9px;\n\tborder-bottom: 1px solid rgba(0, 0, 0, .2);\n}\n\n.main-content {\n\tpadding: 10px;\n}\n\n.category {\n\tbackground: #F4F7F6;\n\tborder-bottom: 1px solid #CCDDD9;\n\tborder-top: 1px solid #CCDDD9;\n\tfont-weight: bold;\n\tpadding: 6px;\n}\n\n.sidebar {\n\tlist-style: none;\n\tpadding: 6px;\n}\n\n.sidebar li a {\n\tdisplay: block;\n}\n\n.link-home {\n\tbackground: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24'%3E%3Cpath fill='%23434343' d='M19,9.3V5c0-0.55-0.45-1-1-1h-1c-0.55,0-1,0.45-1,1v1.6l-3.33-3c-0.38-0.34-0.96-0.34-1.34,0l-8.36,7.53C2.63,11.43,2.84,12,3.3,12H5v7c0,0.55,0.45,1,1,1h3c0.55,0,1-0.45,1-1v-5h4v5c0,0.55,0.45,1,1,1h3c0.55,0,1-0.45,1-1v-7h1.7c0.46,0,0.68-0.57,0.33-0.87L19,9.3z M10,10c0-1.1,0.9-2,2-2s2,0.9,2,2H10z'/%3E%3C/svg%3E\") no-repeat left center;\n\tpadding: 4px 4px 4px 25px;\n}\n\n.link-page {\n\tbackground: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' viewBox='0 0 24 24'%3E%3Cpath fill='%23434343' d='M16.01 7L16 4c0-.55-.45-1-1-1s-1 .45-1 1v3h-4V4c0-.55-.45-1-1-1s-1 .45-1 1v3h-.01C6.9 7 6 7.9 6 8.99v4.66c0 .53.21 1.04.58 1.41L9.5 18v2c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-2l2.92-2.92c.37-.38.58-.89.58-1.42V8.99C18 7.89 17.11 7 16.01 7z'/%3E%3C/svg%3E\") no-repeat left center;\n\tpadding: 4px 4px 4px 25px;\n}\n\n.link-subpage {\n\tbackground: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='21' height='21' viewBox='0 0 24 24'%3E%3Cpath fill='%23666' d='M9.29 15.88L13.17 12 9.29 8.12c-.39-.39-.39-1.02 0-1.41.39-.39 1.02-.39 1.41 0l4.59 4.59c.39.39.39 1.02 0 1.41L10.7 17.3c-.39.39-1.02.39-1.41 0-.38-.39-.39-1.03 0-1.42z'/%3E%3C/svg%3E\") no-repeat 20px center;\n\tpadding: 4px 4px 4px 41px;\n}\n\n#ChatMessage {\n\tmargin-top: 10px;\n\twidth: 88%;\n}\n\ntable {\n\twidth: 100%;\n}\n\nth {\n\tborder-bottom: 1px solid #CCDDD9;\n\tpadding: 8px 5px;\n\ttext-align: left;\n}\n\ntr:nth-child(odd) {\n\tbackground: #F4F7F6;\n}\n\ntd {\n\tpadding: 3px 5px;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n\tbackground: #fff;\n\tborder: 1px solid #ccc;\n\tborder-radius: 5px;\n\tpadding: 6px;\n}\n\ninput[type=\"text\"]:hover,\ninput[type=\"text\"]:focus {\n\tbackground: #f8f8f7;\n}\n\nbutton,\ninput[type=\"submit\"] {\n\tbackground: #f5f5f5;\n\tcursor: pointer;\n\tmargin: 2px;\n}\n\nbutton,\ninput[type=\"submit\"]:hover {\n\tbackground: #E5E4E2;\n}\n\nbutton:disabled,\ninput:disabled {\n\tcolor: #fff;\n\tbackground: #ccc;\n}\n\n.footer {\n\tdisplay: table-row;\n}\n\n.footer a {\n\tfont-weight: bold;\n}\n\n.copyright {\n\tdisplay: inline;\n}\n\n.footer-links {\n\tfloat: right;\n\tpadding: 0;\n}\n\n.footer-links li {\n\tdisplay: inline;\n\tpadding-left: 20px;\n}\n\n.footer-container {\n\tbackground: #F4F7F6;\n\tborder-top: 1px solid #CCDDD9;\n\toverflow: hidden;\n\tpadding: 10px;\n}\n\n@media (max-width: 700px) {\n\t.box.left {\n\t\tfloat: none;\n\t\tmargin: 0 0 10px;\n\t\twidth: 100%;\n\t}\n\n\t.box.right {\n\t\tmargin: 0;\n\t}\n}\n"
  },
  {
    "path": "Server/webadmin/login_template.html",
    "content": "<!-- Copyright Justin S and Cuberite Team, licensed under CC-BY-SA 3.0 -->\n<!DOCTYPE html>\n<html>\n<head>\n\t<title>Cuberite WebAdmin - Login</title>\n\t<meta charset=\"utf-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n<div class=\"header color-background\">\n\t<div class=\"wrapper\">\n\t\t<a href=\".\" class=\"logo\">Cuberite</a>\n\t</div>\n</div>\n<div class=\"panel\">\n\t<div class=\"wrapper\">\n\t\t<form method=\"get\" action=\"webadmin/\">\n\t\t\t<button type=\"submit\" value=\"Log in\" class=\"link-login\">\n\t\t\t\tLog in\n\t\t\t</button>\n\t\t</form>\n\t</div>\n</div>\n<div class=\"columns\">\n\t<div class=\"columns-wrapper\">\n\t\t<div class=\"columns-spacing\">\n\t\t\t<div class=\"box\">\n\t\t\t\t<h1 class=\"head color-background\">Cuberite WebAdmin</h1>\n\t\t\t\t<div class=\"main-content\">\n\t\t\t\t\t<iframe width=\"100%\" class=\"guest-iframe\" src=\"guest.html\"></iframe>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n<div class=\"footer\">\n\t<div class=\"footer-container\">\n\t\t<div class=\"wrapper\">\n\t\t\t<span class=\"copyright\">Copyright © <a href=\"https://cuberite.org/\" target=\"_blank\">Cuberite Team</a></span>\n\t\t\t<ul class=\"footer-links\">\n\t\t\t\t<li><a href=\"https://cuberite.org/\" target=\"_blank\">Cuberite</a></li>\n\t\t\t\t<li><a href=\"https://forum.cuberite.org/\" target=\"_blank\">Forums</a></li>\n\t\t\t\t<li><a href=\"https://api.cuberite.org/\" target=\"_blank\">API Docs</a></li>\n\t\t\t\t<li><a href=\"https://book.cuberite.org/\" target=\"_blank\">User's Manual</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "Server/webadmin/template.lua",
    "content": "-- Use a table for fast concatenation of strings\nlocal SiteContent = {}\nfunction Output(String)\n\ttable.insert(SiteContent, String)\nend\n\n\n\n\n\nlocal function GetDefaultPage()\n\tlocal PM = cRoot:Get():GetPluginManager()\n\n\tlocal SubTitle = \"Current Game\"\n\tlocal Content = \"\"\n\n\tContent = Content .. \"<h4>Plugins:</h4><ul>\"\n\tPM:ForEachPlugin(\n\t\tfunction (a_CBPlugin)\n\t\t\tif (a_CBPlugin:IsLoaded()) then\n\t\t\t\tContent = Content ..  \"<li>\" .. a_CBPlugin:GetName() .. \" (version \" .. a_CBPlugin:GetVersion() .. \")</li>\"\n\t\t\tend\n\t\tend\n\t)\n\n\tContent = Content .. \"</ul>\"\n\tContent = Content .. \"<h4>Players:</h4><ul>\"\n\n\tcRoot:Get():ForEachPlayer(\n\t\tfunction(a_CBPlayer)\n\t\t\tContent = Content .. \"<li>\" .. a_CBPlayer:GetName() .. \"</li>\"\n\t\tend\n\t)\n\n\tContent = Content .. \"</ul>\";\n\n\treturn Content, SubTitle\nend\n\n\n\n\n\nfunction ShowPage(WebAdmin, TemplateRequest)\n\tSiteContent = {}\n\tlocal BaseURL = cWebAdmin:GetBaseURL(TemplateRequest.Request.Path)\n\tlocal Title = \"Cuberite WebAdmin\"\n\tlocal NumPlayers = cRoot:Get():GetServer():GetNumPlayers()\n\tlocal MemoryUsageKiB = cRoot:GetPhysicalRAMUsage()\n\tlocal NumChunks = cRoot:Get():GetTotalChunkCount()\n\tlocal PluginPage = cWebAdmin:GetPage(TemplateRequest.Request)\n\tlocal PageContent = PluginPage.Content\n\tlocal SubTitle = PluginPage.PluginFolder\n\tif (PluginPage.UrlPath ~= \"\") then\n\t\tSubTitle = PluginPage.PluginFolder .. \" - \" .. PluginPage.TabTitle\n\tend\n\tif (PageContent == \"\") then\n\t\tPageContent, SubTitle = GetDefaultPage()\n\tend\n\n\tOutput([[\n<!-- Copyright Justin S and Cuberite Team, licensed under CC-BY-SA 3.0 -->\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<title>]] .. Title .. [[</title>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\">\n</head>\n<body>\n<div class=\"header color-background\">\n\t<div class=\"wrapper\">\n\t\t<a href=\"]] .. BaseURL .. [[\" class=\"logo\">Cuberite</a>\n\t</div>\n</div>\n<div class=\"panel\">\n\t<div class=\"wrapper\">\n\t\t<div class=\"welcome\">\n\t\t\t<strong>Welcome back, ]] .. TemplateRequest.Request.Username .. [[</strong>\n\t\t\t<a href=\"/\" class=\"link-logout\">Log out</a>\n\t\t</div>\n\t\t<ul class=\"stats\">\n\t\t\t<li>Players online: <strong>]] .. NumPlayers .. [[</strong></li>\n\t\t\t<li>Memory: <strong>]] .. string.format(\"%.2f\", MemoryUsageKiB / 1024) .. [[MB</strong></li>\n\t\t\t<li>Chunks: <strong>]] .. NumChunks .. [[</strong></li>\n\t\t</ul>\n\t</div>\n</div>\n<div class=\"columns\">\n\t<div class=\"columns-wrapper\">\n\t\t<div class=\"columns-spacing\">\n\t\t\t<div class=\"box left\">\n\t\t\t\t<h2 class=\"head color-background\">Menu</h2>\n\t\t\t\t<ul class=\"sidebar\">\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<a href=\"]] .. BaseURL .. [[\" class=\"link-home\">Home</a>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<div class=\"category\">Server Management</div>\n\t\t\t\t<ul class=\"sidebar\">\n\t]])\n\n\t-- Get all tabs:\n\tlocal perPluginTabs = {}\n\tfor _, tab in ipairs(cWebAdmin:GetAllWebTabs()) do\n\t\tlocal pluginTabs = perPluginTabs[tab.PluginName] or {};\n\t\tperPluginTabs[tab.PluginName] = pluginTabs\n\t\ttable.insert(pluginTabs, tab)\n\tend\n\t\n\t-- Sort by plugin:\n\tlocal pluginNames = {}\n\tfor pluginName, pluginTabs in pairs(perPluginTabs) do\n\t\ttable.insert(pluginNames, pluginName)\n\tend\n\ttable.sort(pluginNames)\n\t\n\t-- Output by plugin, then alphabetically:\n\tfor _, pluginName in ipairs(pluginNames) do\n\t\tlocal pluginTabs = perPluginTabs[pluginName]\n\t\ttable.sort(pluginTabs,\n\t\t\tfunction(a_Tab1, a_Tab2)\n\t\t\t\treturn ((a_Tab1.Title or \"\") < (a_Tab2.Title or \"\"))\n\t\t\tend\n\t\t)\n\t\t\n\t\t-- Translate the plugin name into the folder name (-> title)\n\t\tlocal pluginWebTitle = cPluginManager:Get():GetPluginFolderName(pluginName) or pluginName\n\t\tOutput(\"<li><strong class=\\\"link-page\\\">\" .. pluginWebTitle .. \"</strong></li>\\n\");\n\n\t\t-- Output each tab:\n\t\tfor _, tab in pairs(pluginTabs) do\n\t\t\tOutput(\"<li><a href=\\\"\" .. BaseURL .. pluginName .. \"/\" .. tab.UrlPath .. \"\\\" class=\\\"sidebar-item link-subpage\\\">\" .. tab.Title .. \"</a></li>\\n\")\n\t\tend\n\t\tOutput(\"\\n\");\n\tend\n\n\n\tOutput([[\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<div class=\"box right\">\n\t\t\t\t<h1 class=\"head color-background\">]] .. SubTitle .. [[</h1>\n\t\t\t\t<div class=\"main-content\">]] .. PageContent .. [[</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n<div class=\"footer\">\n\t<div class=\"footer-container\">\n\t\t<div class=\"wrapper\">\n\t\t\t<span class=\"copyright\">Copyright © <a href=\"https://cuberite.org/\" target=\"_blank\">Cuberite Team</a></span>\n\t\t\t<ul class=\"footer-links\">\n\t\t\t\t<li><a href=\"https://cuberite.org/\" target=\"_blank\">Cuberite</a></li>\n\t\t\t\t<li><a href=\"https://forum.cuberite.org/\" target=\"_blank\">Forums</a></li>\n\t\t\t\t<li><a href=\"https://api.cuberite.org/\" target=\"_blank\">API Docs</a></li>\n\t\t\t\t<li><a href=\"https://book.cuberite.org/\" target=\"_blank\">User's Manual</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n</div>\n</body>\n</html>\n]])\n\n\treturn table.concat(SiteContent)\nend\n"
  },
  {
    "path": "SetFlags.cmake",
    "content": "macro (add_flags_lnk FLAGS)\n\tset(CMAKE_EXE_LINKER_FLAGS             \"${CMAKE_EXE_LINKER_FLAGS}             ${FLAGS}\")\n\tset(CMAKE_EXE_LINKER_FLAGS_DEBUG       \"${CMAKE_EXE_LINKER_FLAGS_DEBUG}       ${FLAGS}\")\n\tset(CMAKE_EXE_LINKER_FLAGS_COVERAGE    \"${CMAKE_EXE_LINKER_FLAGS_COVERAGE}    ${FLAGS}\")\n\tset(CMAKE_EXE_LINKER_FLAGS_RELEASE     \"${CMAKE_EXE_LINKER_FLAGS_RELEASE}     ${FLAGS}\")\n\tset(CMAKE_SHARED_LINKER_FLAGS          \"${CMAKE_SHARED_LINKER_FLAGS}          ${FLAGS}\")\n\tset(CMAKE_SHARED_LINKER_FLAGS_DEBUG    \"${CMAKE_SHARED_LINKER_FLAGS_DEBUG}    ${FLAGS}\")\n\tset(CMAKE_SHARED_LINKER_FLAGS_COVERAGE \"${CMAKE_SHARED_LINKER_FLAGS_COVERAGE} ${FLAGS}\")\n\tset(CMAKE_SHARED_LINKER_FLAGS_RELEASE  \"${CMAKE_SHARED_LINKER_FLAGS_RELEASE}  ${FLAGS}\")\n\tset(CMAKE_MODULE_LINKER_FLAGS          \"${CMAKE_MODULE_LINKER_FLAGS}          ${FLAGS}\")\n\tset(CMAKE_MODULE_LINKER_FLAGS_DEBUG    \"${CMAKE_MODULE_LINKER_FLAGS_DEBUG}    ${FLAGS}\")\n\tset(CMAKE_MODULE_LINKER_FLAGS_COVERAGE \"${CMAKE_MODULE_LINKER_FLAGS_COVERAGE} ${FLAGS}\")\n\tset(CMAKE_MODULE_LINKER_FLAGS_RELEASE  \"${CMAKE_MODULE_LINKER_FLAGS_RELEASE}  ${FLAGS}\")\nendmacro()\n\nmacro(add_flags_cxx FLAGS)\n\tset(CMAKE_CXX_FLAGS          \"${CMAKE_CXX_FLAGS} ${FLAGS}\")\n\tset(CMAKE_C_FLAGS            \"${CMAKE_C_FLAGS}   ${FLAGS}\")\nendmacro()\n\nmacro(enable_profile)\n\t# Declare the flags used for profiling builds:\n\tif (MSVC)\n\t\tset (CXX_PROFILING \"/Zi\")\n\t\tset (LNK_PROFILING \"/PROFILE /DEBUG\")\n\telse()\n\t\tset (CXX_PROFILING \"-pg\")\n\t\tset (LNK_PROFILING \"-pg\")\n\tendif()\n\n\n\t# Declare the profiling configurations:\n\tSET(CMAKE_CXX_FLAGS_DEBUGPROFILE\n\t\t\"${CMAKE_CXX_FLAGS_DEBUG} ${CXX_PROFILING}\"\n\t\tCACHE STRING \"Flags used by the C++ compiler during profile builds.\"\n\t\tFORCE )\n\tSET(CMAKE_C_FLAGS_DEBUGPROFILE\n\t\t\"${CMAKE_C_FLAGS_DEBUG} ${CXX_PROFILING}\"\n\t\tCACHE STRING \"Flags used by the C compiler during profile builds.\"\n\t\tFORCE )\n\tSET(CMAKE_EXE_LINKER_FLAGS_DEBUGPROFILE\n\t\t\"${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${LNK_PROFILING}\"\n\t\tCACHE STRING \"Flags used for linking binaries during profile builds.\"\n\t\tFORCE )\n\tSET(CMAKE_SHARED_LINKER_FLAGS_DEBUGPROFILE\n\t\t\"${CMAKE_SHARED_LINKER_FLAGS_DEBUG} ${LNK_PROFILING}\"\n\t\tCACHE STRING \"Flags used by the shared libraries linker during profile builds.\"\n\t\tFORCE )\n\tMARK_AS_ADVANCED(\n\t\tCMAKE_CXX_FLAGS_DEBUGPROFILE\n\t\tCMAKE_C_FLAGS_DEBUGPROFILE\n\t\tCMAKE_EXE_LINKER_FLAGS_DEBUGPROFILE\n\t\tCMAKE_SHARED_LINKER_FLAGS_DEBUGPROFILE )\n\n\tSET(CMAKE_CXX_FLAGS_RELEASEPROFILE\n\t\t\"${CMAKE_CXX_FLAGS_RELEASE} ${CXX_PROFILING}\"\n\t\tCACHE STRING \"Flags used by the C++ compiler during profile builds.\"\n\t\tFORCE )\n\tSET(CMAKE_C_FLAGS_RELEASEPROFILE\n\t\t\"${CMAKE_C_FLAGS_RELEASE} ${CXX_PROFILING}\"\n\t\tCACHE STRING \"Flags used by the C compiler during profile builds.\"\n\t\tFORCE )\n\tSET(CMAKE_EXE_LINKER_FLAGS_RELEASEPROFILE\n\t\t\"${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${LNK_PROFILING}\"\n\t\tCACHE STRING \"Flags used for linking binaries during profile builds.\"\n\t\tFORCE )\n\tSET(CMAKE_SHARED_LINKER_FLAGS_RELEASEPROFILE\n\t\t\"${CMAKE_SHARED_LINKER_FLAGS_RELEASE} ${LNK_PROFILING}\"\n\t\tCACHE STRING \"Flags used by the shared libraries linker during profile builds.\"\n\t\tFORCE )\n\tMARK_AS_ADVANCED(\n\t\tCMAKE_CXX_FLAGS_RELEASEPROFILE\n\t\tCMAKE_C_FLAGS_RELEASEPROFILE\n\t\tCMAKE_EXE_LINKER_FLAGS_RELEASEPROFILE\n\t\tCMAKE_SHARED_LINKER_FLAGS_RELEASEPROFILE )\n\t# The configuration types need to be set after their respective c/cxx/linker flags and before the project directive\n\tif(MSVC)\n\t\tset(CMAKE_CONFIGURATION_TYPES \"Debug;Release;DebugProfile;ReleaseProfile\" CACHE STRING \"\" FORCE)\n\telse()\n\t\tset(CMAKE_CONFIGURATION_TYPES \"Debug;Release;DebugProfile;ReleaseProfile;Coverage\" CACHE STRING \"\" FORCE)\n\tendif()\nendmacro()\n\nfunction(set_global_flags)\n\tif(MSVC)\n\t\t# Make build use multiple threads under MSVC:\n\t\tadd_compile_options(/MP)\n\n\t\t# Make build use Unicode:\n\t\tadd_compile_definitions(UNICODE _UNICODE)\n\n\t\t# Turn off CRT warnings:\n\t\tadd_compile_definitions(_CRT_SECURE_NO_WARNINGS)\n\n\t\treturn ()\n\tendif()\n\n\t# Allow for a forced 32-bit build under 64-bit OS:\n\tif (FORCE_32)\n\t\tadd_compile_options(-m32)\n\t\tadd_link_options(-m32)\n\tendif()\n\n\t# https://en.wikipedia.org/wiki/Uname\n\t# https://gcc.gnu.org/onlinedocs/gcc/index.html\n\t# Have the compiler generate code specifically targeted at the current machine on Linux:\n\tif(NOT NO_NATIVE_OPTIMIZATION AND NOT CMAKE_CROSSCOMPILING)\n\t\tstring(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} SYSTEM_PROCESSOR)\n\t\tif (SYSTEM_PROCESSOR MATCHES \"^(i386|i686|x86|amd64|mips)\")\n\t\t\tmessage(STATUS \"Optimising for this machine (march=native)\")\n\t\t\tadd_compile_options(-march=native)\n\t\telseif (SYSTEM_PROCESSOR MATCHES \"^(arm|aarch|powerpc|ppc|sparc|alpha)\")\n\t\t\tmessage(STATUS \"Optimising for this machine (mcpu=native)\")\n\t\t\tadd_compile_options(-mcpu=native)\n\t\tendif()\n\tendif()\nendfunction()\n\nfunction(set_exe_flags TARGET)\n\tif (MSVC)\n\t\t# TODO: Warnings as errors\n\t\ttarget_compile_options(\n\t\t\t${TARGET} PRIVATE\n\n\t\t\t# Warnings level 4:\n\t\t\t/W4\n\n\t\t\t# Excessive amount of logspam (Unreferenced formal parameter), disable for now:\n\t\t\t/wd4100\n\t\t)\n\t\treturn ()\n\tendif()\n\n\ttarget_compile_options(\n\t\t${TARGET} PRIVATE\n\n\t\t# We use a signed char (fixes #640 on RasPi)\n\t\t# TODO: specify this in code, not a compile flag:\n\t\t-fsigned-char\n\n\t\t# We support non-IEEE 754 FPUs so can make no guarantees about error:\n\t\t-ffast-math\n\n\t\t# All warnings:\n\t\t-Wall -Wextra\n\n\t\t# Excessive amount of logspam, disable for now:\n\t\t-Wno-unused-parameter\n\t)\n\n\tif(CMAKE_CXX_COMPILER_ID STREQUAL \"Clang\")\n\t\ttarget_compile_options(\n\t\t\t${TARGET} PRIVATE\n\n\t\t\t# TODO: actually fix the warnings instead of disabling them\n\t\t\t# or at least disable on a file-level basis:\n\t\t\t-Wno-missing-noreturn -Wno-padded -Wno-implicit-fallthrough\n\t\t\t-Wno-double-promotion\n\n\t\t\t# This is a pretty useless warning, we've already got -Wswitch which is what we need:\n\t\t\t-Wno-switch-enum\n\n\t\t\t# Weverything with Clang exceptions:\n\t\t\t-Weverything -Wno-exit-time-destructors -Wno-error=disabled-macro-expansion -Wno-weak-vtables\n\t\t\t-Wno-string-conversion -Wno-c++98-compat-pedantic -Wno-c++2a-compat-pedantic -Wno-documentation\n\t\t\t-Wno-documentation-unknown-command -Wno-reserved-id-macro -Wno-error=unused-command-line-argument\n\t\t)\n\n\t\t# Werror only for debug builds\n\t\tif(CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n\t\t\ttarget_compile_options(\n\t\t\t\t${TARGET} PRIVATE\n\n\t\t\t\t# Warnings-as-errors only on Clang for now:\n\t\t\t\t-Werror\n\t\t\t)\n\t\tendif()\n\n\t\tif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13)\n\t\t\ttarget_compile_options(\n\t\t\t\t${TARGET} PRIVATE\n\n\t\t\t\t# We aren't using C++11:\n\t\t\t\t-Wno-return-std-move-in-c++11\n\t\t\t)\n\t\tendif()\n\n\t\tif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 10)\n\t\t\ttarget_compile_options(\n\t\t\t\t${TARGET} PRIVATE\n\n\t\t\t\t# int to float conversions happen a lot, not worth fixing all warnings:\n\t\t\t\t-Wno-implicit-int-float-conversion\n\t\t\t)\n\t\tendif()\n\n\t\tif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13)\n\t\t\ttarget_compile_options(\n\t\t\t\t${TARGET} PRIVATE\n\n\t\t\t\t# TODO: fix\n\t\t\t\t-Wno-reserved-identifier\n\t\t\t)\n\t\tendif()\n\t\tif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16)\n\t\t\ttarget_compile_options(\n\t\t\t\t${TARGET} PRIVATE\n\t\t\t\t-Wno-unsafe-buffer-usage\n\t\t\t)\n\t\tendif()\n\tendif()\nendfunction()\n"
  },
  {
    "path": "TESTING.md",
    "content": "Contributing by Testing Cuberite\n================================\n\nYou can help us even if you are not a programmer! This document explains how.\nIf you would like to help with coding instead, see [GETTING-STARTED.md][1] and [CONTRIBUTING.md][2].\n\nHere are things you can help with without being a programmer:\n - Run and test Cuberite. Report issues, bugs, crashes, and stacktraces at the [issue tracker][3]. This is best done in debug mode.\n - Test unmerged versions (known as branches or Pull Requests) which are marked with the [ingame-testing-needed][4] label. \n   Note that code marked with `ingame-testing-needed` is not always available, and sometimes the above list will be empty.\n\nPlease use the issue tracker search feature and make sure your issue has not been reported before!\n\nObtaining Debug Builds\n----------------------\n\nWhen testing Cuberite, debug builds are preferred because they output detailed info about the problem that had occurred at the server console.\nCurrently, we do not provide debug builds. You will have to compile Cuberite yourself to obtain them. See the compilation instructions.\nYou can also test with regular builds.\n\nTesting Unmerged Pull Requests\n------------------------------\n\nTo test unmerged branches, pick one from the ingame-testing-needed list, and follow the download instructions.\nIf you are familiar with git, you can also fetch and compile the unmerged branch instead.\n\n[1]: https://github.com/cuberite/cuberite/blob/master/GETTING-STARTED.md\n[2]: https://github.com/cuberite/cuberite/blob/master/CONTRIBUTING.md\n[3]: https://github.com/cuberite/cuberite/issues\n[4]: https://github.com/cuberite/cuberite/pulls?q=is%3Aopen+is%3Apr+label%3Astatus%2Fingame-testing-needed\n"
  },
  {
    "path": "Tools/.gitignore",
    "content": "Debug/\n"
  },
  {
    "path": "Tools/AnvilStats/.gitignore",
    "content": "*.vcproj\n*.vcxproj\n*.sln\n*.user\n.xls\nStatistics.txt\n*.bmp\nDebug/\nRelease/\nProfiling\n*.png\nworld/\n*.html\n*.xls\n"
  },
  {
    "path": "Tools/AnvilStats/AnvilStats.cpp",
    "content": "\n// AnvilStats.cpp\n\n// Implements the main app entrypoint\n\n#include \"Globals.h\"\n#include \"Processor.h\"\n#include \"Statistics.h\"\n#include \"BiomeMap.h\"\n#include \"HeightMap.h\"\n#include \"HeightBiomeMap.h\"\n#include \"ChunkExtract.h\"\n#include \"SpringStats.h\"\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tif (argc < 2)\n\t{\n\t\tLOG(\"Usage: %s <method number> [<world folder>]\", argv[0]);\n\t\tLOG(\"Available methods:\");\n\t\tLOG(\"  0 - statistics\");\n\t\tLOG(\"  1 - biome map\");\n\t\tLOG(\"  2 - height map\");\n\t\tLOG(\"  3 - extract chunks\");\n\t\tLOG(\"  4 - count lava- and water- springs\");\n\t\tLOG(\"  5 - biome and height map\");\n\t\tLOG(\"\\nNo method number present, aborting.\");\n\t\treturn -1;\n\t}\n\n\tAString WorldFolder;\n\tif (argc > 2)\n\t{\n\t\tWorldFolder = argv[2];\n\t}\n\telse\n\t{\n\t\tWorldFolder = \".\" + cFile::PathSeparator;\n\t}\n\n\tcCallbackFactory * Factory = NULL;\n\tswitch (atol(argv[1]))\n\t{\n\t\tcase 0: Factory = new cStatisticsFactory;                break;\n\t\tcase 1: Factory = new cBiomeMapFactory;                  break;\n\t\tcase 2: Factory = new cHeightMapFactory;                 break;\n\t\tcase 3: Factory = new cChunkExtractFactory(WorldFolder); break;\n\t\tcase 4: Factory = new cSpringStatsFactory;               break;\n\t\tcase 5: Factory = new cHeightBiomeMapFactory;            break;\n\t\tdefault:\n\t\t{\n\t\t\tLOG(\"Unknown method \\\"%s\\\", aborting.\", argv[1]);\n\t\t\treturn -2;\n\t\t}\n\t}\n\tcProcessor Processor;\n\tProcessor.ProcessWorld(WorldFolder, *Factory);\n\n\tLOG(\"Processing finished\");\n\n\tdelete Factory;\n\n\tLOG(\"Done\");\n}\n"
  },
  {
    "path": "Tools/AnvilStats/AnvilStats.txt",
    "content": "\n// AnvilStats.txt\n\n// A Readme for the project\n\n/*\nAnvilStats\n==========\n\nThis is a project for measuring various metrics throughout an Anvil world, presumably created by a vanilla MC.\nIt works by parsing the MCA files in the path specified as its param (or current directory, if no params) and\nfeeding each decompressed chunk into the statistics-gathering callback function.\n\nPossible usage:\n  - count the per-chunk density of specific blocks\n  - count the per-chunk density of dungeons, by measuring the number of zombie/skeleton/regularspider spawners\n  - count the per-chunk-per-biome density of trees, by measuring the number of dirt-log vertical transitions, correlating to biome data\n  - draw a vertical map of the world based on a specific measured value (biome, elevation, ...)\n\nThis project is Windows-only, although it shouldn't be too difficult to make it portable.\n\nBecause this project uses NBT extensively, it runs much faster in Release mode.\n\n\n*/\n\n\n\n"
  },
  {
    "path": "Tools/AnvilStats/BiomeMap.cpp",
    "content": "\n// BiomeMap.cpp\n\n// Implements the cBiomeMap class representing a cCallback descendant that draws a map of biomes for the world\n\n#include \"Globals.h\"\n#include \"BiomeMap.h\"\n#include \"../BiomeVisualiser/BiomeColors.h\"\n\n\n\n\n\nstatic const unsigned char g_BMPHeader[] =\n{\n\t0x42, 0x4D, 0x36, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,\n\t0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n} ;\n\n\n\n\n\ncBiomeMap::cBiomeMap(void) :\n\tm_CurrentRegionX(0),\n\tm_CurrentRegionZ(0),\n\tm_IsCurrentRegionValid(false)\n{\n}\n\n\n\n\n\nvoid cBiomeMap::Finish(void)\n{\n\tif (m_IsCurrentRegionValid)\n\t{\n\t\tStartNewRegion(0, 0);\n\t}\n}\n\n\n\n\n\nbool cBiomeMap::OnNewChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tint RegionX = (a_ChunkX < 0) ? (a_ChunkX - 31) / 32 : a_ChunkX / 32;\n\tint RegionZ = (a_ChunkZ < 0) ? (a_ChunkZ - 31) / 32 : a_ChunkZ / 32;\n\tif ((RegionX != m_CurrentRegionX) || (RegionZ != m_CurrentRegionZ))\n\t{\n\t\tif (m_IsCurrentRegionValid)\n\t\t{\n\t\t\tStartNewRegion(RegionX, RegionZ);\n\t\t}\n\t\tm_CurrentRegionX = RegionX;\n\t\tm_CurrentRegionZ = RegionZ;\n\t}\n\tm_IsCurrentRegionValid = true;\n\tm_CurrentChunkX = a_ChunkX;\n\tm_CurrentChunkZ = a_ChunkZ;\n\tm_CurrentChunkOffX = m_CurrentChunkX - m_CurrentRegionX * 32;\n\tm_CurrentChunkOffZ = m_CurrentChunkZ - m_CurrentRegionZ * 32;\n\treturn false;\n}\n\n\n\n\n\nbool cBiomeMap::OnBiomes(const unsigned char * a_BiomeData)\n{\n\tASSERT(m_CurrentChunkOffX >= 0);\n\tASSERT(m_CurrentChunkOffX < 32);\n\tASSERT(m_CurrentChunkOffZ >= 0);\n\tASSERT(m_CurrentChunkOffZ < 32);\n\tchar * BaseBiomes = m_Biomes + m_CurrentChunkOffZ * 16 * 512 + m_CurrentChunkOffX * 16;\n\tfor (int z = 0; z < 16; z++)\n\t{\n\t\tchar * Row = BaseBiomes + z * 512;\n\t\tmemcpy(Row, a_BiomeData + z * 16, 16);\n\t}  // for z\n\treturn true;\n}\n\n\n\n\n\nvoid cBiomeMap::StartNewRegion(int a_RegionX, int a_RegionZ)\n{\n\tAString FileName;\n\tPrintf(FileName, \"Biomes.%d.%d.bmp\", m_CurrentRegionX, m_CurrentRegionZ);\n\tcFile f;\n\tif (!f.Open(FileName, cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot open file \\\"%s\\\" for writing the biome map. Data for this region lost.\", FileName.c_str());\n\t}\n\telse\n\t{\n\t\tf.Write(g_BMPHeader, sizeof(g_BMPHeader));\n\t\tfor (int z = 0; z < 512; z++)\n\t\t{\n\t\t\tint RowData[512];\n\t\t\tunsigned char * BiomeRow = (unsigned char *)m_Biomes + z * 512;\n\t\t\tfor (int x = 0; x < 512; x++)\n\t\t\t{\n\t\t\t\tRowData[x] = g_BiomeColors[BiomeRow[x]];\n\t\t\t}\n\t\t\tf.Write(RowData, sizeof(RowData));\n\t\t}  // for z\n\t}\n\n\tmemset(m_Biomes, 0, sizeof(m_Biomes));\n\tm_CurrentRegionX = a_RegionX;\n\tm_CurrentRegionZ = a_RegionZ;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBiomeMapFactory:\n\ncBiomeMapFactory::~cBiomeMapFactory()\n{\n\t// Force all threads to save their last regions:\n\tfor (cCallbacks::iterator itr = m_Callbacks.begin(), end = m_Callbacks.end(); itr != end; ++itr)\n\t{\n\t\t((cBiomeMap *)(*itr))->Finish();\n\t}\n\t// TODO: Join all the files into one giant image file\n}\n"
  },
  {
    "path": "Tools/AnvilStats/BiomeMap.h",
    "content": "\n// BiomeMap.h\n\n// Interfaces to the cBiomeMap class representing a cCallback descendant that draws a map of biomes for the world\n\n\n\n\n\n#pragma once\n\n#include \"Callback.h\"\n\n\n\n\n\nclass cBiomeMap :\n\tpublic cCallback\n{\npublic:\n\tcBiomeMap(void);\n\n\t/** Saves the last region that it was processing */\n\tvoid Finish(void);\n\nprotected:\n\tint m_CurrentChunkX;  // Absolute chunk coords\n\tint m_CurrentChunkZ;\n\tint m_CurrentChunkOffX;  // Chunk offset from the start of the region\n\tint m_CurrentChunkOffZ;\n\tint m_CurrentRegionX;\n\tint m_CurrentRegionZ;\n\tbool m_IsCurrentRegionValid;\n\tchar m_Biomes[16 * 32 * 16 * 32];  // Biome map of the entire current region [x + 16 * 32 * z]\n\n\t// cCallback overrides:\n\tvirtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }\n\tvirtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) override { return false; }\n\tvirtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) override { return false; }\n\tvirtual bool OnRealCoords(int a_ChunkX, int a_ChunkZ) override { return false; }\n\tvirtual bool OnLastUpdate(Int64 a_LastUpdate) override { return false; }\n\tvirtual bool OnTerrainPopulated(bool a_Populated) override { return false; }  // We don't care about \"populated\", the biomes are the same\n\tvirtual bool OnBiomes(const unsigned char * a_BiomeData) override;\n\n\tvoid StartNewRegion(int a_RegionX, int a_RegionZ);\n} ;\n\n\n\n\n\nclass cBiomeMapFactory :\n\tpublic cCallbackFactory\n{\npublic:\n\tvirtual ~cBiomeMapFactory();\n\n\tvirtual cCallback * CreateNewCallback(void) override\n\t{\n\t\treturn new cBiomeMap;\n\t}\n\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/CMakeLists.txt",
    "content": "project (AnvilStats)\n\n# Set include paths to the used libraries:\ninclude_directories(\"../../lib\")\ninclude_directories(\"../../src\")\n\n\n\nfunction(flatten_files arg1)\n\tset(res \"\")\n\tforeach(f ${${arg1}})\n\t\tget_filename_component(f ${f} ABSOLUTE)\n\t\tlist(APPEND res ${f})\n\tendforeach()\n\tset(${arg1} \"${res}\" PARENT_SCOPE)\nendfunction()\n\nadd_subdirectory(../../lib/zlib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/lib/zlib)\n\n# Include the shared files:\nset(SHARED_SRC\n\t../../src/ByteBuffer.cpp\n\t../../src/StringUtils.cpp\n\t../../src/LoggerListeners.cpp\n\t../../src/Logger.cpp\n\t../../src/WorldStorage/FastNBT.cpp\n\t../BiomeVisualiser/BiomeColors.cpp\n)\n\nset(SHARED_HDR\n\t../../src/ByteBuffer.h\n\t../../src/StringUtils.h\n\t../../src/LoggerListeners.h\n\t../../src/Logger.h\n\t../../src/WorldStorage/FastNBT.h\n\t../BiomeVisualiser/BiomeColors.h\n)\n\nset(SHARED_OSS_SRC\n\t../../src/OSSupport/CriticalSection.cpp\n\t../../src/OSSupport/Event.cpp\n\t../../src/OSSupport/File.cpp\n\t../../src/OSSupport/GZipFile.cpp\n\t../../src/OSSupport/IsThread.cpp\n)\n\nset(SHARED_OSS_HDR\n\t../../src/OSSupport/CriticalSection.h\n\t../../src/OSSupport/Event.h\n\t../../src/OSSupport/File.h\n\t../../src/OSSupport/GZipFile.h\n\t../../src/OSSupport/IsThread.h\n)\n\nflatten_files(SHARED_SRC)\nflatten_files(SHARED_HDR)\nflatten_files(SHARED_OSS_SRC)\nflatten_files(SHARED_OSS_HDR)\nsource_group(\"Shared\" FILES ${SHARED_SRC} ${SHARED_HDR})\nsource_group(\"Shared\\\\OSSupport\" FILES ${SHARED_OSS_SRC} ${SHARED_OSS_HDR})\n\n\n\n# Include the main source files:\nset(SOURCES\n\tAnvilStats.cpp\n\tBiomeMap.cpp\n\tChunkExtract.cpp\n\tGlobals.cpp\n\tHeightBiomeMap.cpp\n\tHeightMap.cpp\n\tImageComposingCallback.cpp\n\tProcessor.cpp\n\tSpringStats.cpp\n\tStatistics.cpp\n\tUtils.cpp\n)\n\nset(HEADERS\n\tBiomeMap.h\n\tCallback.h\n\tChunkExtract.h\n\tGlobals.h\n\tHeightBiomeMap.h\n\tHeightMap.h\n\tImageComposingCallback.h\n\tProcessor.h\n\tSpringStats.h\n\tStatistics.h\n\tUtils.h\n\n\tAnvilStats.txt\n)\n\nsource_group(\"\" FILES ${SOURCES} ${HEADERS})\n\nadd_definitions(-DNBT_RESERVE_SIZE=10000)\n\nadd_executable(AnvilStats\n\t${SOURCES}\n\t${HEADERS}\n\t${SHARED_SRC}\n\t${SHARED_HDR}\n\t${SHARED_OSS_SRC}\n\t${SHARED_OSS_HDR}\n)\n\ntarget_link_libraries(AnvilStats zlib)\n\ninclude(../../SetFlags.cmake)\nset_exe_flags(AnvilStats)\n\n\n\n\n\n# Under MSVC we need to enlarge the default stack size for the executable:\nif (MSVC)\n\tget_target_property(TEMP AnvilStats LINK_FLAGS)\n\tif (TEMP STREQUAL \"TEMP-NOTFOUND\")\n\t  SET(TEMP \"\") # set to empty string\n\t\tmessage(\"LINKER_FLAGS not found\")\n\telse ()\n\t  SET(TEMP \"${TEMP} \") # a space to cleanly separate from existing content\n\t\tmessage(\"LINKER_FLAGS: ${LINKER_FLAGS}\")\n\tendif ()\n\t# append our values\n\tSET(TEMP \"${TEMP}/STACK:16777216\")\n\tset_target_properties(AnvilStats PROPERTIES LINK_FLAGS ${TEMP})\nendif ()\n"
  },
  {
    "path": "Tools/AnvilStats/Callback.h",
    "content": "\n// Callback.h\n\n// Interfaces to the cCallback base class used as the base class for all statistical callbacks\n\n\n\n\n\n#pragma once\n\n\n\n\n\n// fwd:\nclass cParsedNBT;\n\n\n\n\n\n/** The base class for all chunk-processor callbacks, declares the interface.\nThe processor calls each virtual function in the order they are declared here with the specified args.\nIf the function returns true, the processor doesn't process the data item, moves on to the next chunk\nand starts calling the callbacks again from start with the new chunk data.\nSo if a statistics collector doesn't need data decompression at all, it can stop the processor from doing so early-enough\nand still get meaningful data.\nA callback is guaranteed to run in a single thread and always the same thread for the same chunk.\nA callback is guaranteed to run on all chunks in a region and one region is guaranteed to be handled by only callback.\n*/\nclass cCallback abstract\n{\npublic:\n\tenum\n\t{\n\t\tCALLBACK_CONTINUE = false,\n\t\tCALLBACK_ABORT    = true,\n\t} ;\n\n\tvirtual ~cCallback() {}  // Force a virtual destructor in each descendant\n\n\t/** Called when a new region file is about to be opened; by default allow the region */\n\tvirtual bool OnNewRegion(int a_RegionX, int a_RegionZ) { return CALLBACK_CONTINUE; }\n\n\t/** Called to inform the stats module of the chunk coords for newly processing chunk */\n\tvirtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) = 0;\n\n\t/** Called to inform about the chunk's data offset in the file (chunk mini-header), the number of sectors it uses and the timestamp field value */\n\tvirtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) { return CALLBACK_ABORT; }\n\n\t/** Called to inform of the compressed chunk data size and position in the file (offset from file start to the actual data) */\n\tvirtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) { return CALLBACK_ABORT; }\n\n\t/** Just in case you wanted to process the NBT yourself ;) */\n\tvirtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) { return CALLBACK_ABORT; }\n\n\t/** The chunk's NBT should specify chunk coords, these are sent here: */\n\tvirtual bool OnRealCoords(int a_ChunkX, int a_ChunkZ) { return CALLBACK_ABORT; }\n\n\t/** The chunk contains a LastUpdate value specifying the last tick in which it was saved. */\n\tvirtual bool OnLastUpdate(Int64 a_LastUpdate) { return CALLBACK_ABORT; }\n\n\tvirtual bool OnTerrainPopulated(bool a_Populated) { return CALLBACK_ABORT; }\n\n\tvirtual bool OnBiomes(const unsigned char * a_BiomeData) { return CALLBACK_ABORT; }\n\n\t/** Called when a heightmap for the chunk is read from the file.\n\tNote that the heightmap is given in big-endian ints, so if you want it, you need to ntohl() it first!\n\t*/\n\tvirtual bool OnHeightMap(const int * a_HeightMapBE) { return CALLBACK_ABORT; }\n\n\t/** If there is data for the section, this callback is called; otherwise OnEmptySection() is called instead.\n\tAll OnSection() callbacks are called first, and only then all the remaining sections are reported in OnEmptySection().\n\t*/\n\tvirtual bool OnSection(\n\t\tunsigned char a_Y,\n\t\tconst BLOCKTYPE * a_BlockTypes,\n\t\tconst NIBBLETYPE * a_BlockAdditional,\n\t\tconst NIBBLETYPE * a_BlockMeta,\n\t\tconst NIBBLETYPE * a_BlockLight,\n\t\tconst NIBBLETYPE * a_BlockSkyLight\n\t) { return CALLBACK_ABORT; }\n\n\t/** If there is no data for a section, this callback is called; otherwise OnSection() is called instead.\n\tOnEmptySection() callbacks are called after all OnSection() callbacks.\n\t*/\n\tvirtual bool OnEmptySection(unsigned char a_Y) { return CALLBACK_CONTINUE; }\n\n\t/** Called after all sections have been processed via either OnSection() or OnEmptySection().\n\t*/\n\tvirtual bool OnSectionsFinished(void) { return CALLBACK_ABORT; }\n\n\t/** Called for each entity in the chunk.\n\tCommon parameters are parsed from the NBT.\n\tThe callback may parse any other param from the a_NBT and a_NBTTag parameters.\n\tThe a_NBTTag parameter points to the entity compound tag inside the Entities tag.\n\t*/\n\tvirtual bool OnEntity(\n\t\tconst AString & a_EntityType,\n\t\tdouble a_PosX, double a_PosY, double a_PosZ,\n\t\tdouble a_SpeedX, double a_SpeedY, double a_SpeedZ,\n\t\tfloat a_Yaw, float a_Pitch,\n\t\tfloat a_FallDistance,\n\t\tshort a_FireTicksLeft,\n\t\tshort a_AirTicks,\n\t\tchar a_IsOnGround,\n\t\tcParsedNBT & a_NBT,\n\t\tint a_NBTTag\n\t) { return CALLBACK_ABORT; }\n\n\t/** Called for each tile entity in the chunk.\n\tCommon parameters are parsed from the NBT.\n\tThe callback may parse any other param from the a_NBT and a_NBTTag parameters.\n\tThe a_NBTTag parameter points to the tile entity compound tag inside the TileEntities tag.\n\t*/\n\tvirtual bool OnTileEntity(\n\t\tconst AString & a_EntityType,\n\t\tint a_PosX, int a_PosY, int a_PosZ,\n\t\tcParsedNBT & a_NBT,\n\t\tint a_NBTTag\n\t) { return CALLBACK_ABORT; }\n\n\t/** Called for each tile tick in the chunk */\n\tvirtual bool OnTileTick(\n\t\tint a_BlockType,\n\t\tint a_TicksLeft,\n\t\tint a_PosX, int a_PosY, int a_PosZ\n\t) { return CALLBACK_ABORT; }\n\n\t/** Called after the entire region file has been processed. No more callbacks for this region will be called. No  processing by default */\n\tvirtual void OnRegionFinished(int a_RegionX, int a_RegionZ) {}\n} ;\n\ntypedef std::vector<cCallback *> cCallbacks;\n\n\n\n\n\n/** The base class for a factory that creates callback objects for separate threads.\nThe processor creates a callback for each thread on which it runs using this factory.\nThe factory is guaranteed to be called from a single thread.\nThe factory keeps track of all the callbacks that it has created and deletes them when destructed\n*/\nclass cCallbackFactory\n{\npublic:\n\tvirtual ~cCallbackFactory()\n\t{\n\t\tfor (cCallbacks::iterator itr = m_Callbacks.begin(), end = m_Callbacks.end(); itr != end; ++itr)\n\t\t{\n\t\t\tdelete *itr;\n\t\t}\n\t}\n\n\t/** Descendants override this method to return the correct callback type */\n\tvirtual cCallback * CreateNewCallback(void) = 0;\n\n\t/** cProcessor uses this method to request a new callback */\n\tcCallback * GetNewCallback(void)\n\t{\n\t\tcCallback * Callback = CreateNewCallback();\n\t\tif (Callback != NULL)\n\t\t{\n\t\t\tm_Callbacks.push_back(Callback);\n\t\t}\n\t\treturn Callback;\n\t}\n\nprotected:\n\tcCallbacks m_Callbacks;\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/ChunkExtract.cpp",
    "content": "\n// ChunkExtract.cpp\n\n// Implements the cChunkExtract class representing a cCallback descendant that extracts raw chunk data into separate .chunk files\n\n#include \"Globals.h\"\n#include \"ChunkExtract.h\"\n#include \"../../src/OSSupport/GZipFile.h\"\n\n\n\n\n\ncChunkExtract::cChunkExtract(const AString & iWorldFolder) :\n\tmWorldFolder(iWorldFolder)\n{\n}\n\n\n\n\n\nbool cChunkExtract::OnNewChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tint AnvilX = (a_ChunkX - ((a_ChunkX > 0) ? 0 : 31)) / 32;\n\tint AnvilZ = (a_ChunkZ - ((a_ChunkZ > 0) ? 0 : 31)) / 32;\n\tif ((AnvilX != mCurAnvilX) || (AnvilZ != mCurAnvilZ))\n\t{\n\t\tOpenAnvilFile(AnvilX, AnvilZ);\n\t}\n\tmCurChunkX = a_ChunkX;\n\tmCurChunkZ = a_ChunkZ;\n\treturn false;\n}\n\n\n\n\n\nbool cChunkExtract::OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod)\n{\n\tif (!mAnvilFile.IsOpen())\n\t{\n\t\treturn true;\n\t}\n\tcFile ChunkFile;\n\tAString ChunkPath = Printf(\"%d.%d.zchunk\", mCurChunkX, mCurChunkZ);\n\tif (!ChunkFile.Open(ChunkPath, cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot open zchunk file \\\"%s\\\" for writing. Chunk [%d, %d] skipped.\", ChunkPath.c_str(), mCurChunkX, mCurChunkZ);\n\t\treturn false;\n\t}\n\n\t// Copy data from mAnvilFile to ChunkFile:\n\tmAnvilFile.Seek(a_DataOffset);\n\tfor (int BytesToCopy = a_CompressedDataSize; BytesToCopy > 0;)\n\t{\n\t\tchar Buffer[64000];\n\t\tint NumBytes = std::min(BytesToCopy, (int)sizeof(Buffer));\n\t\tint BytesRead = mAnvilFile.Read(Buffer, NumBytes);\n\t\tif (BytesRead != NumBytes)\n\t\t{\n\t\t\tLOG(\"Cannot copy chunk data, chunk [%d, %d] is probably corrupted. Skipping chunk.\", mCurChunkX, mCurChunkZ);\n\t\t\treturn false;\n\t\t}\n\t\tChunkFile.Write(Buffer, BytesRead);\n\t\tBytesToCopy -= BytesRead;\n\t}  // for BytesToCopy\n\treturn false;\n}\n\n\n\n\n\nbool cChunkExtract::OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize)\n{\n\tASSERT(mAnvilFile.IsOpen());  // If it weren't, the OnCompressedDataSizePos would've prevented this from running\n\tAString FileName = Printf(\"%d.%d.gzchunk\", mCurChunkX, mCurChunkZ);\n\tcGZipFile GZipChunk;\n\tif (!GZipChunk.Open(FileName, cGZipFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot open gzchunk file \\\"%s\\\" for writing. Chunk [%d, %d] skipped.\", FileName.c_str(), mCurChunkX, mCurChunkZ);\n\t\treturn true;\n\t}\n\tGZipChunk.Write(a_DecompressedNBT, a_DataSize);\n\treturn true;\n}\n\n\n\n\n\nvoid cChunkExtract::OpenAnvilFile(int a_AnvilX, int a_AnvilZ)\n{\n\tmAnvilFile.Close();\n\tAString FileName = Printf(\"%s/r.%d.%d.mca\", mWorldFolder.c_str(), a_AnvilX, a_AnvilZ);\n\tif (!mAnvilFile.Open(FileName, cFile::fmRead))\n\t{\n\t\tLOG(\"Cannot open Anvil file \\\"%s\\\" for reading\", FileName.c_str());\n\t}\n\tmCurAnvilX = a_AnvilX;\n\tmCurAnvilZ = a_AnvilZ;\n}\n"
  },
  {
    "path": "Tools/AnvilStats/ChunkExtract.h",
    "content": "\n// ChunkExtract.h\n\n// Declares the cChunkExtract class representing a cCallback descendant that extracts raw chunk data into separate .chunk files\n\n\n\n\n\n#pragma once\n\n#include \"Callback.h\"\n\n\n\n\n\nclass cChunkExtract :\n\tpublic cCallback\n{\npublic:\n\tcChunkExtract(const AString & iWorldFolder);\n\nprotected:\n\tAString mWorldFolder;\n\tcFile   mAnvilFile;\n\tint     mCurAnvilX;  // X-coord of mAnvilFile, in Anvil-coords (1 Anvil-coord = 32 chunks)\n\tint     mCurAnvilZ;  // Z-coord of mAnvilFile, -\"-\n\tint     mCurChunkX;  // X-coord of the chunk being processed\n\tint     mCurChunkZ;  // Z-coord of the chunk being processed\n\n\t/** Opens new anvil file into mAnvilFile, sets mCurAnvilX and mCurAnvilZ */\n\tvoid OpenAnvilFile(int a_AnvilX, int a_AnvilZ);\n\n\t// cCallback overrides:\n\tvirtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }\n\tvirtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) override;\n\tvirtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) override;\n} ;\n\n\n\n\n\nclass cChunkExtractFactory :\n\tpublic cCallbackFactory\n{\npublic:\n\tcChunkExtractFactory(const AString & iWorldFolder) :\n\t\tmWorldFolder(iWorldFolder)\n\t{\n\t}\n\n\tvirtual cCallback * CreateNewCallback(void) override\n\t{\n\t\treturn new cChunkExtract(mWorldFolder);\n\t}\n\nprotected:\n\tAString mWorldFolder;\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/Globals.cpp",
    "content": "\n// Globals.cpp\n\n// This file is used for precompiled header generation in MSVC environments\n\n#include \"Globals.h\"\n\n\n\n\n"
  },
  {
    "path": "Tools/AnvilStats/Globals.h",
    "content": "\n// Globals.h\n\n// This file gets included from every module in the project, so that global symbols may be introduced easily\n// Also used for precompiled header generation in MSVC environments\n\n\n\n\n\n// Compiler-dependent stuff:\n#if defined(_MSC_VER)\n\t// MSVC produces warning C4481 on the override keyword usage, so disable the warning altogether\n\t#pragma warning(disable:4481)\n\n\t// Disable some warnings that we don't care about:\n\t#pragma warning(disable:4100)\n\n\t#define _CRT_SECURE_NO_WARNINGS\n\n#elif defined(__GNUC__)\n\n\t// TODO: Can GCC explicitly mark classes as abstract (no instances can be created)?\n\t#define abstract\n\n#else\n\n\t#error \"You are using an unsupported compiler, you might need to #define some stuff here for your compiler\"\n\n#endif\n\n\n\n\n\n// Integral types with predefined sizes:\ntypedef long long Int64;\ntypedef int       Int32;\ntypedef short     Int16;\n\ntypedef unsigned long long UInt64;\ntypedef unsigned int       UInt32;\ntypedef unsigned short     UInt16;\n\n\n\n\n\n// A macro to disallow the copy constructor and operator= functions\n// This should be used in the private: declarations for any class that shouldn't allow copying itself\n#define DISALLOW_COPY_AND_ASSIGN(TypeName) \\\n\tTypeName(const TypeName &); \\\n\tvoid operator=(const TypeName &)\n\n// A macro that is used to mark unused function parameters, to avoid pedantic warnings in gcc\n#define UNUSED(X) (void)(X)\n\n\n\n\n// OS-dependent stuff:\n#ifdef _WIN32\n\t#define WIN32_LEAN_AND_MEAN\n\t#include <Windows.h>\n\t#include <winsock2.h>\n\n\t// Windows SDK defines min and max macros, messing up with our std::min and std::max usage\n\t#undef min\n\t#undef max\n\n\t// Windows SDK defines GetFreeSpace as a constant, probably a Win16 API remnant\n\t#ifdef GetFreeSpace\n\t\t#undef GetFreeSpace\n\t#endif  // GetFreeSpace\n#else\n\t#include <sys/types.h>\n\t#include <sys/stat.h>   // for mkdir\n\t#include <sys/time.h>\n\t#include <sys/socket.h>\n\t#include <netinet/in.h>\n\t#include <arpa/inet.h>\n\t#include <netdb.h>\n\t#include <time.h>\n\t#include <dirent.h>\n\t#include <errno.h>\n\t#include <iostream>\n\n\t#include <cstdio>\n\t#include <cstring>\n\t#include <pthread.h>\n\t#include <semaphore.h>\n\t#include <errno.h>\n\t#include <fcntl.h>\n#endif\n\n\n\n\n\n// CRT stuff:\n#include <sys/stat.h>\n#include <assert.h>\n#include <stdio.h>\n#include <math.h>\n#include <stdarg.h>\n\n\n\n\n\n// STL stuff:\n#include <vector>\n#include <list>\n#include <deque>\n#include <string>\n#include <map>\n#include <algorithm>\n#include <memory>\n#include <ctime>\n\n\n\n\n\n// Common headers (part 1, without macros):\n#include \"../../src/StringUtils.h\"\n#include \"../../src/OSSupport/CriticalSection.h\"\n#include \"../../src/OSSupport/Semaphore.h\"\n#include \"../../src/OSSupport/Event.h\"\n#include \"../../src/OSSupport/IsThread.h\"\n#include \"../../src/OSSupport/File.h\"\n\n\n\n\n\n// Common definitions:\n\n#define LOG(x, ...) printf(x \"\\n\", __VA_ARGS__)\n#define LOGERROR LOG\n#define LOGWARNING LOG\n#define LOGINFO LOG\n#define LOGWARN LOG\n\n/** Evaluates to the number of elements in an array (compile-time!) */\n#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))\n\n/** Allows arithmetic expressions like \"32 KiB\" (but consider using parenthesis around it, \"(32 KiB)\") */\n#define KiB * 1024\n\n/** Allows arithmetic expressions like \"32 MiB\" (but consider using parenthesis around it, \"(32 MiB)\") */\n#define MiB * 1024 * 1024\n\n/** Faster than (int)floorf((float)x / (float)div) */\n#define FAST_FLOOR_DIV(x, div) ((x) < 0 ? (((int)x / div) - 1) : ((int)x / div))\n\n#define TOLUA_TEMPLATE_BIND(...)\n\n// Own version of assert() that writes failed assertions to the log for review\n#ifdef  _DEBUG\n\t#define ASSERT(x) (!!(x) || (LOGERROR(\"Assertion failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), assert(0), 0))\n#else\n\t#define ASSERT(x) ((void)0)\n#endif\n\n// Pretty much the same as ASSERT() but stays in Release builds\n#define VERIFY(x) (!!(x) || (LOGERROR(\"Verification failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), exit(1), 0))\n\ntypedef unsigned char Byte;\n\n\n\n\n\n/** Clamp value to the specified range. */\ntemplate <typename T>\nT Clamp(T a_Value, T a_Min, T a_Max)\n{\n\treturn (a_Value < a_Min) ? a_Min : ((a_Value > a_Max) ? a_Max : a_Value);\n}\n\n\n\n\n\n// Common headers (part 2, with macros):\n#include \"../../src/ChunkDef.h\"\n#include \"../../src/BlockID.h\"\n"
  },
  {
    "path": "Tools/AnvilStats/HeightBiomeMap.cpp",
    "content": "\n// HeightBiomeMap.cpp\n\n// Declares the cHeightBiomeMap class representing a stats module that produces an image of heights and biomes combined\n\n#include \"Globals.h\"\n#include \"HeightBiomeMap.h\"\n#include \"HeightMap.h\"\n\n\n\n\n\ncHeightBiomeMap::cHeightBiomeMap(void) :\n\tsuper(\"HeBi\"),\n\tm_MinRegionX(100000),\n\tm_MaxRegionX(-100000),\n\tm_MinRegionZ(100000),\n\tm_MaxRegionZ(-100000)\n{\n}\n\n\n\n\n\nbool cHeightBiomeMap::OnNewRegion(int a_RegionX, int a_RegionZ)\n{\n\tif (a_RegionX < m_MinRegionX)\n\t{\n\t\tm_MinRegionX = a_RegionX;\n\t}\n\tif (a_RegionX > m_MaxRegionX)\n\t{\n\t\tm_MaxRegionX = a_RegionX;\n\t}\n\tif (a_RegionZ < m_MinRegionZ)\n\t{\n\t\tm_MinRegionZ = a_RegionZ;\n\t}\n\tif (a_RegionZ > m_MaxRegionZ)\n\t{\n\t\tm_MaxRegionZ = a_RegionZ;\n\t}\n\treturn super::OnNewRegion(a_RegionX, a_RegionZ);\n}\n\n\n\n\n\nbool cHeightBiomeMap::OnNewChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tm_CurrentChunkX = a_ChunkX;\n\tm_CurrentChunkZ = a_ChunkZ;\n\tm_CurrentChunkRelX = m_CurrentChunkX - m_CurrentRegionX * 32;\n\tm_CurrentChunkRelZ = m_CurrentChunkZ - m_CurrentRegionZ * 32;\n\n\tASSERT((m_CurrentChunkRelX >= 0) && (m_CurrentChunkRelX < 32));\n\tASSERT((m_CurrentChunkRelZ >= 0) && (m_CurrentChunkRelZ < 32));\n\n\tmemset(m_BlockTypes, 0, sizeof(m_BlockTypes));\n\n\treturn CALLBACK_CONTINUE;\n}\n\n\n\n\n\n\nbool cHeightBiomeMap::OnBiomes(const unsigned char * a_BiomeData)\n{\n\tmemcpy(m_ChunkBiomes, a_BiomeData, sizeof(m_ChunkBiomes));\n\n\treturn CALLBACK_CONTINUE;\n}\n\n\n\n\n\nbool cHeightBiomeMap::OnHeightMap(const int * a_HeightMapBE)\n{\n\tfor (int i = 0; i < ARRAYCOUNT(m_ChunkHeight); i++)\n\t{\n\t\tm_ChunkHeight[i] = ntohl(a_HeightMapBE[i]);\n\t}  // for i - m_ChunkHeight\n\n\treturn CALLBACK_CONTINUE;\n}\n\n\n\n\n\nbool cHeightBiomeMap::OnSection(\n\tunsigned char a_Y,\n\tconst BLOCKTYPE * a_BlockTypes,\n\tconst NIBBLETYPE * a_BlockAdditional,\n\tconst NIBBLETYPE * a_BlockMeta,\n\tconst NIBBLETYPE * a_BlockLight,\n\tconst NIBBLETYPE * a_BlockSkyLight\n)\n{\n\t// Copy the section data into the appropriate place in the internal buffer\n\tmemcpy(m_BlockTypes + a_Y * 16 * 16 * 16, a_BlockTypes, 16 * 16 * 16);\n\treturn CALLBACK_CONTINUE;\n}\n\n\n\n\n\nbool cHeightBiomeMap::OnSectionsFinished(void)\n{\n\tstatic const int BiomePalette[] =\n\t{\n\t\t// ARGB:\n\t\t0xff0000ff, /* Ocean */\n\t\t0xff00cf3f, /* Plains */\n\t\t0xffffff00, /* Desert */\n\t\t0xff7f7f7f, /* Extreme Hills */\n\t\t0xff00cf00, /* Forest */\n\t\t0xff007f3f, /* Taiga */\n\t\t0xff3f7f00, /* Swampland */\n\t\t0xff003fff, /* River */\n\t\t0xff7f0000, /* Hell */\n\t\t0xff007fff, /* Sky */\n\t\t0xff3f3fff, /* Frozen Ocean */\n\t\t0xff3f3fff, /* Frozen River */\n\t\t0xff7fffcf, /* Ice Plains */\n\t\t0xff3fcf7f, /* Ice Mountains */\n\t\t0xffcf00cf, /* Mushroom Island */\n\t\t0xff7f00ff, /* Mushroom Island Shore */\n\t\t0xffffff3f, /* Beach */\n\t\t0xffcfcf00, /* Desert Hills */\n\t\t0xff00cf3f, /* Forest Hills */\n\t\t0xff006f1f, /* Taiga Hills */\n\t\t0xff7f8f7f, /* Extreme Hills Edge */\n\t\t0xff004f00, /* Jungle */\n\t\t0xff003f00, /* Jungle Hills */\n\t} ;\n\n\t// Remove trees and other unwanted stuff from the heightmap:\n\tfor (int z = 0; z < 16; z++)\n\t{\n\t\tint PixelLine[16];  // line of 16 pixels that is used as a buffer for setting the image pixels\n\t\tfor (int x = 0; x < 16; x++)\n\t\t{\n\t\t\tint Height = m_ChunkHeight[16 * z + x];\n\t\t\tfor (int y = Height; y >= 0; y--)\n\t\t\t{\n\t\t\t\tif (cHeightMap::IsGround(m_BlockTypes[256 * y + 16 * z + x]))\n\t\t\t\t{\n\t\t\t\t\tHeight = y;\n\t\t\t\t\tbreak;  // for y\n\t\t\t\t}\n\t\t\t}  // for y\n\n\t\t\t// Set the color based on the biome and height:\n\t\t\tchar Biome = m_ChunkBiomes[16 * z + x];\n\t\t\tPixelLine[x] = ShadeColor(BiomePalette[Biome], Height);\n\t\t}  // for x\n\n\t\t// Set the pixelline into the image:\n\t\tSetPixelURow(m_CurrentChunkRelX * 16, m_CurrentChunkRelZ * 16 + z, 16, PixelLine);\n\t}  // for z\n\treturn CALLBACK_ABORT;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeightBiomeMapFactory:\n\ncHeightBiomeMapFactory::~cHeightBiomeMapFactory()\n{\n\t// Get the min and max region coords:\n\tint MinRegionX = 100000;\n\tint MaxRegionX = -100000;\n\tint MinRegionZ = 100000;\n\tint MaxRegionZ = -100000;\n\tfor (cCallbacks::iterator itr = m_Callbacks.begin(), end = m_Callbacks.end(); itr != end; ++itr)\n\t{\n\t\tcHeightBiomeMap * cb = (cHeightBiomeMap *)(*itr);\n\t\tif (cb->m_MinRegionX < MinRegionX)\n\t\t{\n\t\t\tMinRegionX = cb->m_MinRegionX;\n\t\t}\n\t\tif (cb->m_MaxRegionX > MaxRegionX)\n\t\t{\n\t\t\tMaxRegionX = cb->m_MaxRegionX;\n\t\t}\n\t\tif (cb->m_MinRegionZ < MinRegionZ)\n\t\t{\n\t\t\tMinRegionZ = cb->m_MinRegionZ;\n\t\t}\n\t\tif (cb->m_MaxRegionZ > MaxRegionZ)\n\t\t{\n\t\t\tMaxRegionZ = cb->m_MaxRegionZ;\n\t\t}\n\t}\n\n\t// If the size is small enough, write an HTML file referencing all the images in a table:\n\tif ((MaxRegionX >= MinRegionX) && (MaxRegionZ >= MinRegionZ) && (MaxRegionX - MinRegionX < 100) && (MaxRegionZ - MinRegionZ < 100))\n\t{\n\t\tcFile HTML(\"HeBi.html\", cFile::fmWrite);\n\t\tif (HTML.IsOpen())\n\t\t{\n\t\t\tHTML.Printf(\"<html><body><table cellspacing=0 cellpadding=0>\\n\");\n\t\t\tfor (int z = MinRegionZ; z <= MaxRegionZ; z++)\n\t\t\t{\n\t\t\t\tHTML.Printf(\"<tr>\");\n\t\t\t\tfor (int x = MinRegionX; x <= MaxRegionX; x++)\n\t\t\t\t{\n\t\t\t\t\tHTML.Printf(\"<td><img src=\\\"HeBi.%d.%d.bmp\\\" /></td>\", x, z);\n\t\t\t\t}\n\t\t\t\tHTML.Printf(\"</tr>\\n\");\n\t\t\t}\n\t\t\tHTML.Printf(\"</table></body></html>\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Tools/AnvilStats/HeightBiomeMap.h",
    "content": "\n// HeightBiomeMap.h\n\n// Declares the cHeightBiomeMap class representing a stats module that produces an image of heights and biomes combined\n\n\n\n\n\n#pragma once\n\n#include \"ImageComposingCallback.h\"\n\n\n\n\n\nclass cHeightBiomeMap :\n\tpublic cImageComposingCallback\n{\n\ttypedef cImageComposingCallback super;\n\npublic:\n\t// Minima and maxima for the regions processed through this callback\n\tint m_MinRegionX, m_MaxRegionX;\n\tint m_MinRegionZ, m_MaxRegionZ;\n\n\tcHeightBiomeMap(void);\n\nprotected:\n\tint m_CurrentChunkX;  // Absolute chunk coords\n\tint m_CurrentChunkZ;\n\tint m_CurrentChunkRelX;  // Chunk offset from the start of the region\n\tint m_CurrentChunkRelZ;\n\n\t/** Biome-map  for the current chunk */\n\tchar      m_ChunkBiomes[16 * 16];\n\t/** Height-map for the current chunk */\n\tint       m_ChunkHeight[16 * 16];\n\t/** Block data for the current chunk (between OnSection() and OnSectionsFinished()) */\n\tBLOCKTYPE m_BlockTypes [16 * 16 * 256];\n\n\t// cCallback overrides:\n\tvirtual bool OnNewRegion(int a_RegionX, int a_RegionZ) override;\n\tvirtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return CALLBACK_CONTINUE; }\n\tvirtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) override { return CALLBACK_CONTINUE; }\n\tvirtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) override { return CALLBACK_CONTINUE; }\n\tvirtual bool OnRealCoords(int a_ChunkX, int a_ChunkZ) override { return CALLBACK_CONTINUE; }\n\tvirtual bool OnLastUpdate(Int64 a_LastUpdate) override { return CALLBACK_CONTINUE; }\n\tvirtual bool OnTerrainPopulated(bool a_Populated) override { return a_Populated ? CALLBACK_CONTINUE : CALLBACK_ABORT; }  // If not populated, we don't want it!\n\tvirtual bool OnBiomes(const unsigned char * a_BiomeData) override;\n\tvirtual bool OnHeightMap(const int * a_HeightMapBE) override;\n\tvirtual bool OnSection(\n\t\tunsigned char a_Y,\n\t\tconst BLOCKTYPE * a_BlockTypes,\n\t\tconst NIBBLETYPE * a_BlockAdditional,\n\t\tconst NIBBLETYPE * a_BlockMeta,\n\t\tconst NIBBLETYPE * a_BlockLight,\n\t\tconst NIBBLETYPE * a_BlockSkyLight\n\t) override;\n\tvirtual bool OnSectionsFinished(void) override;\n\n} ;\n\n\n\n\n\nclass cHeightBiomeMapFactory :\n\tpublic cCallbackFactory\n{\npublic:\n\tvirtual ~cHeightBiomeMapFactory();\n\n\tvirtual cCallback * CreateNewCallback(void) override\n\t{\n\t\treturn new cHeightBiomeMap;\n\t}\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/HeightMap.cpp",
    "content": "\n// HeightMap.cpp\n\n// Implements the cHeightMap class representing a cCallback descendant that draws a B & W map of heights for the world\n\n#include \"Globals.h\"\n#include \"HeightMap.h\"\n\n\n\n\nstatic const unsigned char g_BMPHeader[] =\n{\n\t0x42, 0x4D, 0x36, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,\n\t0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n} ;\n\n\n\n\n\ncHeightMap::cHeightMap(void) :\n\tm_CurrentRegionX(0),\n\tm_CurrentRegionZ(0),\n\tm_IsCurrentRegionValid(false)\n{\n}\n\n\n\n\n\nvoid cHeightMap::Finish(void)\n{\n\tif (m_IsCurrentRegionValid)\n\t{\n\t\tStartNewRegion(0, 0);\n\t}\n}\n\n\n\n\n\nbool cHeightMap::OnNewChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tint RegionX = (a_ChunkX < 0) ? (a_ChunkX - 31) / 32 : a_ChunkX / 32;\n\tint RegionZ = (a_ChunkZ < 0) ? (a_ChunkZ - 31) / 32 : a_ChunkZ / 32;\n\tif ((RegionX != m_CurrentRegionX) || (RegionZ != m_CurrentRegionZ))\n\t{\n\t\tif (m_IsCurrentRegionValid)\n\t\t{\n\t\t\tStartNewRegion(RegionX, RegionZ);\n\t\t}\n\t\tm_CurrentRegionX = RegionX;\n\t\tm_CurrentRegionZ = RegionZ;\n\t}\n\tm_IsCurrentRegionValid = true;\n\tm_CurrentChunkX = a_ChunkX;\n\tm_CurrentChunkZ = a_ChunkZ;\n\tm_CurrentChunkOffX = m_CurrentChunkX - m_CurrentRegionX * 32;\n\tm_CurrentChunkOffZ = m_CurrentChunkZ - m_CurrentRegionZ * 32;\n\tmemset(m_BlockTypes, 0, sizeof(m_BlockTypes));\n\treturn false;\n}\n\n\n\n\n\nbool cHeightMap::OnHeightMap(const int * a_HeightMapBE)\n{\n\tASSERT(m_CurrentChunkOffX >= 0);\n\tASSERT(m_CurrentChunkOffX < 32);\n\tASSERT(m_CurrentChunkOffZ >= 0);\n\tASSERT(m_CurrentChunkOffZ < 32);\n\tint * BaseHeight = m_Height + m_CurrentChunkOffZ * 16 * 512 + m_CurrentChunkOffX * 16;\n\tfor (int z = 0; z < 16; z++)\n\t{\n\t\tint * Row = BaseHeight + z * 512;\n\t\tfor (int x = 0; x < 16; x++)\n\t\t{\n\t\t\tRow[x] = ntohl(a_HeightMapBE[z * 16 + x]);\n\t\t}\n\t}  // for z\n\treturn false;  // Still want blockdata to remove trees from the heightmap\n}\n\n\n\n\n\nbool cHeightMap::OnSection(\n\tunsigned char a_Y,\n\tconst BLOCKTYPE * a_BlockTypes,\n\tconst NIBBLETYPE * a_BlockAdditional,\n\tconst NIBBLETYPE * a_BlockMeta,\n\tconst NIBBLETYPE * a_BlockLight,\n\tconst NIBBLETYPE * a_BlockSkyLight\n)\n{\n\t// Copy the section data into the appropriate place in the internal buffer\n\tmemcpy(m_BlockTypes + a_Y * 16 * 16 * 16, a_BlockTypes, 16 * 16 * 16);\n\treturn false;\n}\n\n\n\n\n\nbool cHeightMap::OnSectionsFinished(void)\n{\n\t// Remove trees from the heightmap:\n\tfor (int z = 0; z < 16; z++)\n\t{\n\t\tfor (int x = 0; x < 16; x++)\n\t\t{\n\t\t\tfor (int y = m_Height[512 * (16 * m_CurrentChunkOffZ + z) + 16 * m_CurrentChunkOffX + x]; y >= 0; y--)\n\t\t\t{\n\t\t\t\tif (IsGround(m_BlockTypes[256 * y + 16 * z + x]))\n\t\t\t\t{\n\t\t\t\t\tm_Height[512 * (16 * m_CurrentChunkOffZ + z) + 16 * m_CurrentChunkOffX + x] = y;\n\t\t\t\t\tbreak;  // for y\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n\treturn true;\n}\n\n\n\n\n\nvoid cHeightMap::StartNewRegion(int a_RegionX, int a_RegionZ)\n{\n\tAString FileName;\n\tPrintf(FileName, \"Height.%d.%d.bmp\", m_CurrentRegionX, m_CurrentRegionZ);\n\tcFile f;\n\tif (!f.Open(FileName, cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot open file \\\"%s\\\" for writing the height map. Data for this region lost.\", FileName.c_str());\n\t}\n\telse\n\t{\n\t\tf.Write(g_BMPHeader, sizeof(g_BMPHeader));\n\t\tfor (int z = 0; z < 512; z++)\n\t\t{\n\t\t\tint RowData[512];\n\t\t\tint * HeightRow = m_Height + z * 512;\n\t\t\tfor (int x = 0; x < 512; x++)\n\t\t\t{\n\t\t\t\tRowData[x] = std::max(std::min(HeightRow[x], 255), 0) * 0x010101;\n\t\t\t}\n\t\t\tf.Write(RowData, sizeof(RowData));\n\t\t}  // for z\n\t}\n\n\tmemset(m_Height, 0, sizeof(m_Height));\n\tm_CurrentRegionX = a_RegionX;\n\tm_CurrentRegionZ = a_RegionZ;\n}\n\n\n\n\n\nbool cHeightMap::IsGround(BLOCKTYPE a_BlockType)\n{\n\t// Name all blocks that are NOT ground, return false for them:\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_AIR:\n\t\tcase E_BLOCK_BED:\n\t\tcase E_BLOCK_BEETROOTS:\n\t\tcase E_BLOCK_BREWING_STAND:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_CACTUS:\n\t\tcase E_BLOCK_CAKE:\n\t\tcase E_BLOCK_CARROTS:\n\t\tcase E_BLOCK_CAULDRON:\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_CHORUS_FLOWER:\n\t\tcase E_BLOCK_CHORUS_PLANT:\n\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_COCOA_POD:\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\tcase E_BLOCK_DIRT:\n\t\tcase E_BLOCK_DRAGON_EGG:\n\t\tcase E_BLOCK_END_GATEWAY:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_END_ROD:\n\t\tcase E_BLOCK_ENDER_CHEST:\n\t\tcase E_BLOCK_FENCE:\n\t\tcase E_BLOCK_FENCE_GATE:\n\t\tcase E_BLOCK_FIRE:\n\t\tcase E_BLOCK_FLOWER_POT:\n\t\tcase E_BLOCK_HEAD:\n\t\tcase E_BLOCK_IRON_BARS:\n\t\tcase E_BLOCK_LADDER:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_LEAVES:\n\t\tcase E_BLOCK_LEVER:\n\t\tcase E_BLOCK_LILY_PAD:\n\t\tcase E_BLOCK_LOG:  // NOTE: This block is actually solid, but we don't want it because it's the thing that trees are made of, and we're getting rid of trees\n\t\tcase E_BLOCK_MELON:\n\t\tcase E_BLOCK_MELON_STEM:\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\tcase E_BLOCK_NETHER_PORTAL:\n\t\tcase E_BLOCK_POWERED_RAIL:\n\t\tcase E_BLOCK_PUMPKIN:\n\t\tcase E_BLOCK_PUMPKIN_STEM:\n\t\tcase E_BLOCK_RAIL:\n\t\tcase E_BLOCK_RED_ROSE:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\tcase E_BLOCK_REEDS:\n\t\tcase E_BLOCK_SAPLING:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_STONE_BUTTON:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_STRUCTURE_VOID:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_TORCH:\n\t\tcase E_BLOCK_TRIPWIRE:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_VINES:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WATER:\n\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\tcase E_BLOCK_YELLOW_FLOWER:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeightMapFactory:\n\ncHeightMapFactory::~cHeightMapFactory()\n{\n\t// Force all threads to save their last regions:\n\tfor (cCallbacks::iterator itr = m_Callbacks.begin(), end = m_Callbacks.end(); itr != end; ++itr)\n\t{\n\t\t((cHeightMap *)(*itr))->Finish();\n\t}\n\t// TODO: Join all the files into one giant image file\n}\n"
  },
  {
    "path": "Tools/AnvilStats/HeightMap.h",
    "content": "\n// HeightMap.h\n\n// Declares the cHeightMap class representing a cCallback descendant that draws a B & W map of heights for the world\n\n\n\n\n\n#pragma once\n\n#include \"Callback.h\"\n\n\n\n\n\nclass cHeightMap :\n\tpublic cCallback\n{\npublic:\n\tcHeightMap(void);\n\n\tvoid Finish(void);\n\n\tstatic bool IsGround(BLOCKTYPE a_BlockType);\n\nprotected:\n\tint m_CurrentChunkX;  // Absolute chunk coords\n\tint m_CurrentChunkZ;\n\tint m_CurrentChunkOffX;  // Chunk offset from the start of the region\n\tint m_CurrentChunkOffZ;\n\tint m_CurrentRegionX;\n\tint m_CurrentRegionZ;\n\tbool m_IsCurrentRegionValid;\n\t/** Height-map of the entire current region [x + 16 * 32 * z] */\n\tint  m_Height[16 * 32 * 16 * 32];\n\t/** Block data of the currently processed chunk (between OnSection() and OnSectionsFinished()) */\n\tBLOCKTYPE m_BlockTypes[16 * 16 * 256];\n\n\t// cCallback overrides:\n\tvirtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }\n\tvirtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) override { return false; }\n\tvirtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) override { return false; }\n\tvirtual bool OnRealCoords(int a_ChunkX, int a_ChunkZ) override { return false; }\n\tvirtual bool OnLastUpdate(Int64 a_LastUpdate) override { return false; }\n\tvirtual bool OnTerrainPopulated(bool a_Populated) override { return !a_Populated; }  // If not populated, we don't want it!\n\tvirtual bool OnBiomes(const unsigned char * a_BiomeData) { return false; }\n\tvirtual bool OnHeightMap(const int * a_HeightMapBE) override;\n\tvirtual bool OnSection(\n\t\tunsigned char a_Y,\n\t\tconst BLOCKTYPE * a_BlockTypes,\n\t\tconst NIBBLETYPE * a_BlockAdditional,\n\t\tconst NIBBLETYPE * a_BlockMeta,\n\t\tconst NIBBLETYPE * a_BlockLight,\n\t\tconst NIBBLETYPE * a_BlockSkyLight\n\t) override;\n\tvirtual bool OnSectionsFinished(void) override;\n\n\tvoid StartNewRegion(int a_RegionX, int a_RegionZ);\n} ;\n\n\n\n\n\nclass cHeightMapFactory :\n\tpublic cCallbackFactory\n{\npublic:\n\tvirtual ~cHeightMapFactory();\n\n\tvirtual cCallback * CreateNewCallback(void) override\n\t{\n\t\treturn new cHeightMap;\n\t}\n\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/ImageComposingCallback.cpp",
    "content": "\n// ImageComposingCallback.cpp\n\n// Implements the cImageComposingCallback class that implements a subset of cCallback for composing per-region images\n\n#include \"Globals.h\"\n#include \"ImageComposingCallback.h\"\n\n\n\n\n\ncImageComposingCallback::cImageComposingCallback(const AString & a_FileNamePrefix) :\n\tm_FileNamePrefix(a_FileNamePrefix),\n\tm_CurrentRegionX(INVALID_REGION_COORD),\n\tm_CurrentRegionZ(INVALID_REGION_COORD),\n\tm_ImageData(new int[32 * 16 * 32 * 16])\n{\n}\n\n\n\n\n\ncImageComposingCallback::~cImageComposingCallback()\n{\n\tdelete[] m_ImageData;\n}\n\n\n\n\n\nbool cImageComposingCallback::OnNewRegion(int a_RegionX, int a_RegionZ)\n{\n\tASSERT(m_CurrentRegionX == INVALID_REGION_COORD);\n\tASSERT(m_CurrentRegionZ == INVALID_REGION_COORD);  // Has any previous region been finished properly?\n\n\tm_CurrentRegionX = a_RegionX;\n\tm_CurrentRegionZ = a_RegionZ;\n\tOnEraseImage();\n\n\treturn CALLBACK_CONTINUE;\n}\n\n\n\n\n\nvoid cImageComposingCallback::OnRegionFinished(int a_RegionX, int a_RegionZ)\n{\n\tASSERT(m_CurrentRegionX != INVALID_REGION_COORD);\n\tASSERT(m_CurrentRegionZ != INVALID_REGION_COORD);  // Has a region been started properly?\n\tASSERT(m_CurrentRegionX == a_RegionX);\n\tASSERT(m_CurrentRegionZ == a_RegionZ);  // Is it the same region that has been started?\n\n\tAString FileName = GetFileName(a_RegionX, a_RegionZ);\n\tif (!FileName.empty())\n\t{\n\t\tOnBeforeImageSaved(a_RegionX, a_RegionZ, FileName);\n\t\tSaveImage(FileName);\n\t\tOnAfterImageSaved(a_RegionX, a_RegionZ, FileName);\n\t}\n\n\tm_CurrentRegionX = INVALID_REGION_COORD;\n\tm_CurrentRegionZ = INVALID_REGION_COORD;\n}\n\n\n\n\n\nAString cImageComposingCallback::GetFileName(int a_RegionX, int a_RegionZ)\n{\n\treturn Printf(\"%s.%d.%d.bmp\", m_FileNamePrefix.c_str(), a_RegionX, a_RegionZ);\n}\n\n\n\n\n\nvoid cImageComposingCallback::OnEraseImage(void)\n{\n\t// By default erase the image to black:\n\tEraseImage(0);\n}\n\n\n\n\n\nvoid cImageComposingCallback::EraseImage(int a_Color)\n{\n\tfor (int i = 0; i < PIXEL_COUNT; i++)\n\t{\n\t\tm_ImageData[i] = a_Color;\n\t}\n}\n\n\n\n\n\nvoid cImageComposingCallback::EraseChunk(int a_Color, int a_RelChunkX, int a_RelChunkZ)\n{\n\tint Base = a_RelChunkZ * IMAGE_HEIGHT + a_RelChunkX * 16;\n\tfor (int v = 0; v < 16; v++)\n\t{\n\t\tint BaseV = Base + v * IMAGE_HEIGHT;\n\t\tfor (int u = 0; u < 16; u++)\n\t\t{\n\t\t\tm_ImageData[BaseV + u] = a_Color;\n\t\t}\n\t}  // for y\n}\n\n\n\n\n\nvoid cImageComposingCallback::SetPixel(int a_RelU, int a_RelV, int a_Color)\n{\n\tASSERT((a_RelU >= 0) && (a_RelU < IMAGE_WIDTH));\n\tASSERT((a_RelV >= 0) && (a_RelV < IMAGE_HEIGHT));\n\n\tm_ImageData[a_RelU + IMAGE_WIDTH * a_RelV] = a_Color;\n}\n\n\n\n\n\nint cImageComposingCallback::GetPixel(int a_RelU, int a_RelV)\n{\n\tif ((a_RelU < 0) || (a_RelU >= IMAGE_WIDTH) || (a_RelV < 0) || (a_RelV >= IMAGE_HEIGHT))\n\t{\n\t\t// Outside the image data\n\t\treturn -1;\n\t}\n\n\treturn m_ImageData[a_RelU + IMAGE_WIDTH * a_RelV];\n}\n\n\n\n\n\n\nvoid cImageComposingCallback::SetPixelURow(int a_RelUStart, int a_RelV, int a_CountU, int * a_Pixels)\n{\n\tASSERT((a_RelUStart >= 0) && (a_RelUStart + a_CountU <= IMAGE_WIDTH));\n\tASSERT((a_RelV >= 0) && (a_RelV < IMAGE_HEIGHT));\n\tASSERT(a_Pixels != NULL);\n\n\tint Base = a_RelUStart + a_RelV * IMAGE_WIDTH;\n\tfor (int u = 0; u < a_CountU; u++)\n\t{\n\t\tm_ImageData[Base + u] = a_Pixels[u];\n\t}\n}\n\n\n\n\n\nint cImageComposingCallback::ShadeColor(int a_Color, int a_Shade)\n{\n\tif (a_Shade < 64)\n\t{\n\t\treturn MixColor(0, a_Color, a_Shade * 4);\n\t}\n\treturn MixColor(a_Color, 0xffffff, (a_Shade - 64) * 4);\n}\n\n\n\n\n\nint cImageComposingCallback::MixColor(int a_Src, int a_Dest, int a_Amount)\n{\n\tint r = a_Src & 0xff;\n\tint g = (a_Src >> 8) & 0xff;\n\tint b = (a_Src >> 16) & 0xff;\n\tint rd = a_Dest & 0xff;\n\tint gd = (a_Dest >> 8) & 0xff;\n\tint bd = (a_Dest >> 16) & 0xff;\n\tint nr = r + (rd - r) * a_Amount / 256;\n\tint ng = g + (gd - g) * a_Amount / 256;\n\tint nb = b + (bd - b) * a_Amount / 256;\n\treturn nr | (ng << 8) | (nb << 16);\n}\n\n\n\n\nvoid cImageComposingCallback::SaveImage(const AString & a_FileName)\n{\n\tcFile f(a_FileName, cFile::fmWrite);\n\tif (!f.IsOpen())\n\t{\n\t\treturn;\n\t}\n\n\t// Header for BMP files (is the same for the same-size files)\n\tstatic const unsigned char BMPHeader[] =\n\t{\n\t\t0x42, 0x4D, 0x36, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,\n\t\t0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n\t} ;\n\n\tf.Write(BMPHeader, sizeof(BMPHeader));\n\tf.Write(m_ImageData, PIXEL_COUNT * 4);\n}\n"
  },
  {
    "path": "Tools/AnvilStats/ImageComposingCallback.h",
    "content": "\n// ImageComposingCallback\n\n// Declares the cImageComposingCallback class that implements a subset of cCallback for composing per-region images\n\n\n\n\n\n#pragma once\n\n#include \"Callback.h\"\n\n\n\n\n/** Implements the plumbing for composing per-region images from multiple chunks.\nTo use this class, create a descendant that writes the image data using\nSetPixel() or SetPixelURow() functions.\n\nFor the purpose of this class the image data is indexed U (horz) * V (vert), to avoid confusion with other coords.\nThe image is a 32bpp raw imagedata, written into a BMP file.\n*/\nclass cImageComposingCallback :\n\tpublic cCallback\n{\npublic:\n\tenum\n\t{\n\t\tINVALID_REGION_COORD = 99999,  ///< Used for un-assigned region coords\n\t\tIMAGE_WIDTH = 32 * 16,\n\t\tIMAGE_HEIGHT = 32 * 16,\n\t\tPIXEL_COUNT = IMAGE_WIDTH * IMAGE_HEIGHT,  ///< Total pixel count of the image data\n\t} ;\n\n\tcImageComposingCallback(const AString & a_FileNamePrefix);\n\tvirtual ~cImageComposingCallback();\n\n\t// cCallback overrides:\n\tvirtual bool OnNewRegion(int a_RegionX, int a_RegionZ) override;\n\tvirtual void OnRegionFinished(int a_RegionX, int a_RegionZ) override;\n\n\t// New introduced overridable functions:\n\n\t/** Called when a file is about to be saved, to generate the filename */\n\tvirtual AString GetFileName(int a_RegionX, int a_RegionZ);\n\n\t/** Called before the file is saved */\n\tvirtual void OnBeforeImageSaved(int a_RegionX, int a_RegionZ, const AString & a_FileName) {}\n\n\t/** Called after the image is saved to a file */\n\tvirtual void OnAfterImageSaved(int a_RegionX, int a_RegionZ, const AString & a_FileName) {}\n\n\t/** Called when a new region is beginning, to erase the image data */\n\tvirtual void OnEraseImage(void);\n\n\t// Functions for manipulating the image:\n\n\t/** Erases the entire image with the specified color */\n\tvoid EraseImage(int a_Color);\n\n\t/** Erases the specified chunk's portion of the image with the specified color. Note that chunk coords are relative to the current region */\n\tvoid EraseChunk(int a_Color, int a_RelChunkX, int a_RelChunkZ);\n\n\t/** Returns the current region X coord */\n\tint GetCurrentRegionX(void) const { return m_CurrentRegionX; }\n\n\t/** Returns the current region Z coord */\n\tint GetCurrentRegionZ(void) const { return m_CurrentRegionZ; }\n\n\t/** Sets the pixel at the specified UV coords to the specified color */\n\tvoid SetPixel(int a_RelU, int a_RelV, int a_Color);\n\n\t/** Returns the color of the pixel at the specified UV coords; -1 if outside */\n\tint GetPixel(int a_RelU, int a_RelV);\n\n\t/** Sets a row of pixels. a_Pixels is expected to be a_CountU pixels wide. a_RelUStart + a_CountU is assumed less than image width */\n\tvoid SetPixelURow(int a_RelUStart, int a_RelV, int a_CountU, int * a_Pixels);\n\n\t/** \"Shades\" the given color based on the shade amount given\n\tShade amount 0 .. 63 shades the color from black to a_Color.\n\tShade amount 64 .. 127 shades the color from a_Color to white.\n\tAll other shade amounts have undefined results.\n\t*/\n\tstatic int ShadeColor(int a_Color, int a_Shade);\n\n\t/** Mixes the two colors in the specified ratio; a_Ratio is between 0 and 256, 0 returning a_Src */\n\tstatic int MixColor(int a_Src, int a_Dest, int a_Ratio);\n\nprotected:\n\t/** Prefix for the filenames, when generated by the default GetFileName() function */\n\tAString m_FileNamePrefix;\n\n\t/** Coords of the currently processed region */\n\tint m_CurrentRegionX, m_CurrentRegionZ;\n\n\t/** Raw image data; 1 MiB worth of data, therefore unsuitable for stack allocation. [u + IMAGE_WIDTH * v] */\n\tint * m_ImageData;\n\n\tvoid SaveImage(const AString & a_FileName);\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/Processor.cpp",
    "content": "\n// Processor.cpp\n\n// Implements the cProcessor class representing the overall processor engine that manages threads, calls callbacks etc.\n\n#include \"Globals.h\"\n#include \"Processor.h\"\n#include \"Callback.h\"\n#include \"../../src/WorldStorage/FastNBT.h\"\n#include \"zlib/zlib.h\"\n#include \"Utils.h\"\n\n\n\n\n\nconst int CHUNK_INFLATE_MAX = 1 MiB;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProcessor::cThread:\n\ncProcessor::cThread::cThread(cCallback & a_Callback, cProcessor & a_ParentProcessor) :\n\tsuper(\"cProcessor::cThread\"),\n\tm_Callback(a_Callback),\n\tm_ParentProcessor(a_ParentProcessor)\n{\n\tLOG(\"Created a new thread: %p\", this);\n\tsuper::Start();\n}\n\n\n\n\n\nvoid cProcessor::cThread::WaitForStart(void)\n{\n\tm_HasStarted.Wait();\n}\n\n\n\n\n\nvoid cProcessor::cThread::Execute(void)\n{\n\tLOG(\"Started a new thread: %p, ID %d\", this, cIsThread::GetCurrentID());\n\n\tm_HasStarted.Set();\n\n\tfor (;;)\n\t{\n\t\tAString FileName = m_ParentProcessor.GetOneFileName();\n\t\tif (FileName.empty())\n\t\t{\n\t\t\t// All done, terminate the thread\n\t\t\tbreak;\n\t\t}\n\t\tProcessFile(FileName);\n\t}  // for-ever\n\n\tLOG(\"Thread %p (ID %d) terminated\", this, cIsThread::GetCurrentID());\n}\n\n\n\n\n\nvoid cProcessor::cThread::ProcessFile(const AString & a_FileName)\n{\n\tLOG(\"Processing file \\\"%s\\\"\", a_FileName.c_str());\n\n\tsize_t idx = a_FileName.rfind(\"r.\");\n\tif (idx == AString::npos)\n\t{\n\t\tLOG(\"Cannot parse filename \\\"%s\\\", skipping file.\", a_FileName.c_str());\n\t\treturn;\n\t}\n\tint RegionX = 0, RegionZ = 0;\n\tif (sscanf_s(a_FileName.c_str() + idx, \"r.%d.%d.mca\", &RegionX, &RegionZ) != 2)\n\t{\n\t\tLOG(\"Cannot parse filename \\\"%s\\\" into coords, skipping file.\", a_FileName.c_str());\n\t\treturn;\n\t}\n\n\tif (m_Callback.OnNewRegion(RegionX, RegionZ))\n\t{\n\t\t// Callback doesn't want the region file processed\n\t\treturn;\n\t}\n\n\tcFile f;\n\tif (!f.Open(a_FileName, cFile::fmRead))\n\t{\n\t\tLOG(\"Cannot open file \\\"%s\\\", skipping file.\", a_FileName.c_str());\n\t\treturn;\n\t}\n\n\tAString FileContents;\n\tf.ReadRestOfFile(FileContents);\n\tif (FileContents.size() < sizeof(8 KiB))\n\t{\n\t\tLOG(\"Cannot read header in file \\\"%s\\\", skipping file.\", a_FileName.c_str());\n\t\treturn;\n\t}\n\n\tProcessFileData(FileContents.data(), FileContents.size(), RegionX * 32, RegionZ * 32);\n\n\tm_Callback.OnRegionFinished(RegionX, RegionZ);\n}\n\n\n\n\n\nvoid cProcessor::cThread::ProcessFileData(const char * a_FileData, size_t a_Size, int a_ChunkBaseX, int a_ChunkBaseZ)\n{\n\tint Header[2048];\n\tint * HeaderPtr = (int *)a_FileData;\n\tfor (int i = 0; i < ARRAYCOUNT(Header); i++)\n\t{\n\t\tHeader[i] = ntohl(HeaderPtr[i]);\n\t}\n\n\tfor (int i = 0; i < 1024; i++)\n\t{\n\t\tunsigned Location = Header[i];\n\t\tunsigned Timestamp = Header[i + 1024];\n\t\tif (\n\t\t\t((Location == 0) && (Timestamp == 0)) ||  // Official docs' \"not present\"\n\t\t\t(Location >> 8 < 2)                   ||  // Logical - no chunk can start inside the header\n\t\t\t((Location & 0xff) == 0)              ||  // Logical - no chunk can be zero bytes\n\t\t\t((Location >> 8) * 4096 > a_Size)         // Logical - no chunk can start at beyond the file end\n\t\t)\n\t\t{\n\t\t\t// Chunk not present in the file\n\t\t\tcontinue;\n\t\t}\n\t\tint ChunkX = a_ChunkBaseX + (i % 32);\n\t\tint ChunkZ = a_ChunkBaseZ + (i / 32);\n\t\tif (m_Callback.OnNewChunk(ChunkX, ChunkZ))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tProcessChunk(a_FileData, ChunkX, ChunkZ, Location >> 8, Location & 0xff, Timestamp);\n\t}  // for i - chunk index\n}\n\n\n\n\n\nvoid cProcessor::cThread::ProcessChunk(const char * a_FileData, int a_ChunkX, int a_ChunkZ, unsigned a_SectorStart, unsigned a_SectorSize, unsigned a_TimeStamp)\n{\n\tif (m_Callback.OnHeader(a_SectorStart * 4096, a_SectorSize, a_TimeStamp))\n\t{\n\t\treturn;\n\t}\n\n\tconst char * ChunkStart = a_FileData + a_SectorStart * 4096;\n\tint ByteSize = ntohl(*(int *)ChunkStart);\n\tchar CompressionMethod = ChunkStart[4];\n\n\tif (m_Callback.OnCompressedDataSizePos(ByteSize, a_SectorStart * 4096 + 5, CompressionMethod))\n\t{\n\t\treturn;\n\t}\n\n\tProcessCompressedChunkData(a_ChunkX, a_ChunkZ, ChunkStart + 5, ByteSize);\n}\n\n\n\n\n\nvoid cProcessor::cThread::ProcessCompressedChunkData(int a_ChunkX, int a_ChunkZ, const char * a_CompressedData, int a_CompressedSize)\n{\n\tchar Decompressed[CHUNK_INFLATE_MAX];\n\tz_stream strm;\n\tstrm.zalloc = (alloc_func)NULL;\n\tstrm.zfree = (free_func)NULL;\n\tstrm.opaque = NULL;\n\tinflateInit(&strm);\n\tstrm.next_out  = (Bytef *)Decompressed;\n\tstrm.avail_out = sizeof(Decompressed);\n\tstrm.next_in   = (Bytef *)a_CompressedData;\n\tstrm.avail_in  = a_CompressedSize;\n\tint res = inflate(&strm, Z_FINISH);\n\tinflateEnd(&strm);\n\tif (res != Z_STREAM_END)\n\t{\n\t\tLOG(\"Decompression failed, skipping chunk [%d, %d]\", a_ChunkX, a_ChunkZ);\n\t\treturn;\n\t}\n\n\tif (m_Callback.OnDecompressedData(Decompressed, strm.total_out))\n\t{\n\t\treturn;\n\t}\n\n\t// Parse the NBT data:\n\tcParsedNBT NBT(Decompressed, strm.total_out);\n\tif (!NBT.IsValid())\n\t{\n\t\tLOG(\"NBT Parsing failed, skipping chunk [%d, %d]\", a_ChunkX, a_ChunkZ);\n\t\treturn;\n\t}\n\n\tProcessParsedChunkData(a_ChunkX, a_ChunkZ, NBT);\n}\n\n\n\n\n\nvoid cProcessor::cThread::ProcessParsedChunkData(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT)\n{\n\tint LevelTag = a_NBT.FindChildByName(0, \"Level\");\n\tif (LevelTag < 0)\n\t{\n\t\tLOG(\"Bad logical structure of the NBT, skipping chunk [%d, %d].\", a_ChunkX, a_ChunkZ);\n\t\treturn;\n\t}\n\tint XPosTag = a_NBT.FindChildByName(LevelTag, \"xPos\");\n\tint ZPosTag = a_NBT.FindChildByName(LevelTag, \"zPos\");\n\tif ((XPosTag < 0) || (ZPosTag < 0))\n\t{\n\t\tLOG(\"Pos tags missing in NTB, skipping chunk [%d, %d].\", a_ChunkX, a_ChunkZ);\n\t\treturn;\n\t}\n\tif (m_Callback.OnRealCoords(a_NBT.GetInt(XPosTag), a_NBT.GetInt(ZPosTag)))\n\t{\n\t\treturn;\n\t}\n\n\tint LastUpdateTag = a_NBT.FindChildByName(LevelTag, \"LastUpdate\");\n\tif (LastUpdateTag > 0)\n\t{\n\t\tif (m_Callback.OnLastUpdate(a_NBT.GetLong(LastUpdateTag)))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tint TerrainPopulatedTag = a_NBT.FindChildByName(LevelTag, \"TerrainPopulated\");\n\tbool TerrainPopulated = (TerrainPopulatedTag < 0) ? false : (a_NBT.GetByte(TerrainPopulatedTag) != 0);\n\tif (m_Callback.OnTerrainPopulated(TerrainPopulated))\n\t{\n\t\treturn;\n\t}\n\n\tint BiomesTag = a_NBT.FindChildByName(LevelTag, \"Biomes\");\n\tif (BiomesTag > 0)\n\t{\n\t\tif (m_Callback.OnBiomes((const unsigned char *)(a_NBT.GetData(BiomesTag))))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tint HeightMapTag = a_NBT.FindChildByName(LevelTag, \"HeightMap\");\n\tif (HeightMapTag > 0)\n\t{\n\t\tif (m_Callback.OnHeightMap((const int *)(a_NBT.GetData(HeightMapTag))))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (ProcessChunkSections(a_ChunkX, a_ChunkZ, a_NBT, LevelTag))\n\t{\n\t\treturn;\n\t}\n\n\tif (ProcessChunkEntities(a_ChunkX, a_ChunkZ, a_NBT, LevelTag))\n\t{\n\t\treturn;\n\t}\n\n\tif (ProcessChunkTileEntities(a_ChunkX, a_ChunkZ, a_NBT, LevelTag))\n\t{\n\t\treturn;\n\t}\n\n\tif (ProcessChunkTileTicks(a_ChunkX, a_ChunkZ, a_NBT, LevelTag))\n\t{\n\t\treturn;\n\t}\n}\n\n\n\n\n\nbool cProcessor::cThread::ProcessChunkSections(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag)\n{\n\tint Sections = a_NBT.FindChildByName(a_LevelTag, \"Sections\");\n\tif (Sections < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tbool SectionProcessed[16];\n\tmemset(SectionProcessed, 0, sizeof(SectionProcessed));\n\tfor (int Tag = a_NBT.GetFirstChild(Sections); Tag > 0; Tag = a_NBT.GetNextSibling(Tag))\n\t{\n\t\tint YTag          = a_NBT.FindChildByName(Tag, \"Y\");\n\t\tint BlocksTag     = a_NBT.FindChildByName(Tag, \"Blocks\");\n\t\tint AddTag        = a_NBT.FindChildByName(Tag, \"Add\");\n\t\tint DataTag       = a_NBT.FindChildByName(Tag, \"Data\");\n\t\tint BlockLightTag = a_NBT.FindChildByName(Tag, \"BlockLightTag\");\n\t\tint SkyLightTag   = a_NBT.FindChildByName(Tag, \"SkyLight\");\n\n\t\tif ((YTag < 0) || (BlocksTag < 0) || (DataTag < 0))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tunsigned char SectionY = a_NBT.GetByte(YTag);\n\t\tif (SectionY >= 16)\n\t\t{\n\t\t\tLOG(\"WARNING: Section Y >= 16 (%d), high world, wtf? Skipping section!\", SectionY);\n\t\t\tcontinue;\n\t\t}\n\t\tif (m_Callback.OnSection(\n\t\t\tSectionY,\n\t\t\t(const BLOCKTYPE *) (a_NBT.GetData(BlocksTag)),\n\t\t\t(AddTag > 0) ? (const NIBBLETYPE *)(a_NBT.GetData(AddTag)) : NULL,\n\t\t\t(const NIBBLETYPE *)(a_NBT.GetData(DataTag)),\n\t\t\t(BlockLightTag > 0) ? (const NIBBLETYPE *)(a_NBT.GetData(BlockLightTag)) : NULL,\n\t\t\t(BlockLightTag > 0) ? (const NIBBLETYPE *)(a_NBT.GetData(BlockLightTag)) : NULL\n\t\t))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tSectionProcessed[SectionY] = true;\n\t}  // for Tag - Sections[]\n\n\t// Call the callback for empty sections:\n\tfor (unsigned char y = 0; y < 16; y++)\n\t{\n\t\tif (!SectionProcessed[y])\n\t\t{\n\t\t\tif (m_Callback.OnEmptySection(y))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (m_Callback.OnSectionsFinished())\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nbool cProcessor::cThread::ProcessChunkEntities(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag)\n{\n\tint EntitiesTag = a_NBT.FindChildByName(a_LevelTag, \"Entities\");\n\tif (EntitiesTag < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (int EntityTag = a_NBT.GetFirstChild(EntitiesTag); EntityTag > 0; EntityTag = a_NBT.GetNextSibling(EntityTag))\n\t{\n\t\tint PosTag = a_NBT.FindChildByName(EntityTag, \"Pos\");\n\t\tif (PosTag < 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tint SpeedTag = a_NBT.FindChildByName(EntityTag, \"Motion\");\n\t\tif (SpeedTag < 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tint RotTag = a_NBT.FindChildByName(EntityTag, \"Rotation\");\n\t\tif (RotTag < 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tdouble Pos[3];\n\t\tfor (int i = 0, tag = a_NBT.GetFirstChild(PosTag); (i < 3) && (tag > 0); i++)\n\t\t{\n\t\t\tPos[i] = a_NBT.GetDouble(tag);\n\t\t}\n\t\tdouble Speed[3];\n\t\tfor (int i = 0, tag = a_NBT.GetFirstChild(SpeedTag); (i < 3) && (tag > 0); i++)\n\t\t{\n\t\t\tSpeed[i] = a_NBT.GetDouble(tag);\n\t\t}\n\t\tfloat Rot[2];\n\t\tfor (int i = 0, tag = a_NBT.GetFirstChild(RotTag); (i < 2) && (tag > 0); i++)\n\t\t{\n\t\t\tRot[i] = a_NBT.GetFloat(tag);\n\t\t}\n\n\t\tif (m_Callback.OnEntity(\n\t\t\ta_NBT.GetString(a_NBT.FindChildByName(EntityTag, \"id\")),\n\t\t\tPos[0], Pos[1], Pos[2],\n\t\t\tSpeed[0], Speed[1], Speed[2],\n\t\t\tRot[0], Rot[1],\n\t\t\ta_NBT.GetFloat(a_NBT.FindChildByName(EntityTag, \"FallDistance\")),\n\t\t\ta_NBT.GetShort(a_NBT.FindChildByName(EntityTag, \"Fire\")),\n\t\t\ta_NBT.GetShort(a_NBT.FindChildByName(EntityTag, \"Air\")),\n\t\t\ta_NBT.GetByte(a_NBT.FindChildByName(EntityTag, \"OnGround\")),\n\t\t\ta_NBT, EntityTag\n\t\t))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}  // for EntityTag - Entities[]\n\treturn false;\n}\n\n\n\n\n\nbool cProcessor::cThread::ProcessChunkTileEntities(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag)\n{\n\tint TileEntitiesTag = a_NBT.FindChildByName(a_LevelTag, \"TileEntities\");\n\tif (TileEntitiesTag < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (int TileEntityTag = a_NBT.GetFirstChild(TileEntitiesTag); TileEntityTag > 0; TileEntityTag = a_NBT.GetNextSibling(TileEntityTag))\n\t{\n\t\tif (m_Callback.OnTileEntity(\n\t\t\ta_NBT.GetString(a_NBT.FindChildByName(TileEntityTag, \"id\")),\n\t\t\ta_NBT.GetInt(a_NBT.FindChildByName(TileEntityTag, \"x\")),\n\t\t\ta_NBT.GetInt(a_NBT.FindChildByName(TileEntityTag, \"y\")),\n\t\t\ta_NBT.GetInt(a_NBT.FindChildByName(TileEntityTag, \"z\")),\n\t\t\ta_NBT, TileEntityTag\n\t\t))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}  // for EntityTag - Entities[]\n\treturn false;\n}\n\n\n\n\n\nbool cProcessor::cThread::ProcessChunkTileTicks(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag)\n{\n\tint TileTicksTag = a_NBT.FindChildByName(a_LevelTag, \"TileTicks\");\n\tif (TileTicksTag < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (int TileTickTag = a_NBT.GetFirstChild(TileTicksTag); TileTickTag > 0; TileTickTag = a_NBT.GetNextSibling(TileTickTag))\n\t{\n\t\tint iTag = a_NBT.FindChildByName(TileTicksTag, \"i\");\n\t\tint tTag = a_NBT.FindChildByName(TileTicksTag, \"t\");\n\t\tint xTag = a_NBT.FindChildByName(TileTicksTag, \"x\");\n\t\tint yTag = a_NBT.FindChildByName(TileTicksTag, \"y\");\n\t\tint zTag = a_NBT.FindChildByName(TileTicksTag, \"z\");\n\t\tif ((iTag < 0) || (tTag < 0) || (xTag < 0) || (yTag < 0) || (zTag < 0))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (m_Callback.OnTileTick(\n\t\t\ta_NBT.GetInt(iTag),\n\t\t\ta_NBT.GetInt(iTag),\n\t\t\ta_NBT.GetInt(iTag),\n\t\t\ta_NBT.GetInt(iTag),\n\t\t\ta_NBT.GetInt(iTag)\n\t\t))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}  // for EntityTag - Entities[]\n\treturn false;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProcessor:\n\ncProcessor::cProcessor(void) :\n\tm_IsShuttingDown(false)\n{\n}\n\n\n\n\n\ncProcessor::~cProcessor()\n{\n}\n\n\n\n\n\nvoid cProcessor::ProcessWorld(const AString & a_WorldFolder, cCallbackFactory & a_CallbackFactory)\n{\n\tPopulateFileQueue(a_WorldFolder);\n\n\tif (m_FileQueue.empty())\n\t{\n\t\tLOG(\"No files to process, exitting.\");\n\t\treturn;\n\t}\n\n\t// Start as many threads as there are cores, plus one:\n\t// (One more thread can be in the file-read IO block while all other threads crunch the numbers)\n\tint NumThreads = GetNumCores() + 1;\n\n\t/*\n\t// Limit the number of threads in DEBUG mode to 1 for easier debugging\n\t#ifdef _DEBUG\n\tNumThreads = 1;\n\t#endif  // _DEBUG\n\t//*/\n\n\t// Start all the threads:\n\tfor (int i = 0; i < NumThreads; i++)\n\t{\n\t\tcCallback * Callback = a_CallbackFactory.GetNewCallback();\n\t\tm_Threads.push_back(new cThread(*Callback, *this));\n\t}\n\n\t// Wait for all threads to finish:\n\tLOG(\"Waiting for threads to finish\");\n\tfor (cThreads::iterator itr = m_Threads.begin(), end = m_Threads.end(); itr != end; ++itr)\n\t{\n\t\t(*itr)->WaitForStart();\n\t\tdelete *itr;\n\t}  // for itr - m_Threads[]\n\tLOG(\"Processor finished\");\n}\n\n\n\n\n\nvoid cProcessor::PopulateFileQueue(const AString & a_WorldFolder)\n{\n\tLOG(\"Processing world in \\\"%s\\\"...\", a_WorldFolder.c_str());\n\n\tAString Path = a_WorldFolder;\n\tif (!Path.empty() && (Path[Path.length() - 1] != cFile::PathSeparator))\n\t{\n\t\tPath.push_back(cFile::PathSeparator);\n\t}\n\tAStringVector AllFiles = cFile::GetFolderContents(Path.c_str());\n\tfor (AStringVector::iterator itr = AllFiles.begin(), end = AllFiles.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->rfind(\".mca\") != itr->length() - 4)\n\t\t{\n\t\t\t// Not a .mca file\n\t\t\tcontinue;\n\t\t}\n\t\tm_FileQueue.push_back(Path + *itr);\n\t}  // for itr - AllFiles[]\n}\n\n\n\n\n\nAString cProcessor::GetOneFileName(void)\n{\n\tcCSLock Lock(m_CS);\n\tif (m_FileQueue.empty())\n\t{\n\t\treturn \"\";\n\t}\n\tAString res = m_FileQueue.back();\n\tm_FileQueue.pop_back();\n\treturn res;\n}\n"
  },
  {
    "path": "Tools/AnvilStats/Processor.h",
    "content": "\n// Processor.h\n\n// Interfaces to the cProcessor class representing the overall processor engine that manages threads, calls callbacks etc.\n\n\n\n\n#pragma once\n\n\n\n\n\n// fwd:\nclass cCallback;\nclass cCallbackFactory;\nclass cParsedNBT;\n\n\n\n\n\nclass cProcessor\n{\n\tclass cThread :\n\t\tpublic cIsThread\n\t{\n\t\ttypedef cIsThread super;\n\n\t\tcCallback &  m_Callback;\n\t\tcProcessor & m_ParentProcessor;\n\t\tcEvent m_HasStarted;\n\n\t\t// cIsThread override:\n\t\tvirtual void Execute(void) override;\n\n\t\tvoid ProcessFile(const AString & a_FileName);\n\t\tvoid ProcessFileData(const char * a_FileData, size_t a_Size, int a_ChunkBaseX, int a_ChunkBaseZ);\n\t\tvoid ProcessChunk(const char * a_FileData, int a_ChunkX, int a_ChunkZ, unsigned a_SectorStart, unsigned a_SectorSize, unsigned a_TimeStamp);\n\t\tvoid ProcessCompressedChunkData(int a_ChunkX, int a_ChunkZ, const char * a_CompressedData, int a_CompressedSize);\n\t\tvoid ProcessParsedChunkData(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT);\n\n\t\t// The following processing parts return true if they were interrupted by the callback, causing the processing of current chunk to abort\n\t\tbool ProcessChunkSections(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag);\n\t\tbool ProcessChunkEntities(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag);\n\t\tbool ProcessChunkTileEntities(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag);\n\t\tbool ProcessChunkTileTicks(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag);\n\n\tpublic:\n\t\tcThread(cCallback & a_Callback, cProcessor & a_ParentProcessor);\n\n\t\t/** Waits until the thread starts processing the callback code. */\n\t\tvoid WaitForStart(void);\n\t} ;\n\n\ttypedef std::vector<cThread *> cThreads;\n\npublic:\n\tcProcessor(void);\n\t~cProcessor();\n\n\tvoid ProcessWorld(const AString & a_WorldFolder, cCallbackFactory & a_CallbackFactory);\n\nprotected:\n\tbool m_IsShuttingDown;  // If true, the threads should stop ASAP\n\n\tcCriticalSection m_CS;\n\tAStringList      m_FileQueue;\n\n\tcThreads m_Threads;\n\n\n\t/** Populates m_FileQueue with Anvil files from the specified folder. */\n\tvoid PopulateFileQueue(const AString & a_WorldFolder);\n\n\t/** Returns one filename from m_FileQueue, and removes the name from the queue. */\n\tAString GetOneFileName(void);\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/SpringStats.cpp",
    "content": "\n// SpringStats.cpp\n\n// Implements the cSpringStats class representing a cCallback descendant that collects statistics on lava and water springs\n\n#include \"Globals.h\"\n#include \"SpringStats.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSpringStats::cStats\n\ncSpringStats::cStats::cStats(void) :\n\tm_TotalChunks(0)\n{\n\tmemset(m_LavaSprings,  0, sizeof(m_LavaSprings));\n\tmemset(m_WaterSprings, 0, sizeof(m_WaterSprings));\n}\n\n\n\n\n\nvoid cSpringStats::cStats::Add(const cSpringStats::cStats & a_Other)\n{\n\tm_TotalChunks += a_Other.m_TotalChunks;\n\tfor (int Biome = 0; Biome < 256; Biome++)\n\t{\n\t\tfor (int Height = 0; Height < 256; Height++)\n\t\t{\n\t\t\tm_LavaSprings[Biome][Height]  += a_Other.m_LavaSprings[Biome][Height];\n\t\t\tm_WaterSprings[Biome][Height] += a_Other.m_WaterSprings[Biome][Height];\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSpringStats:\n\ncSpringStats::cSpringStats(void) :\n\tm_AreBiomesValid(false)\n{\n}\n\n\n\n\n\nbool cSpringStats::OnNewChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tmemset(m_BlockTypes, 0, sizeof(m_BlockTypes));\n\tm_AreBiomesValid = false;\n\treturn false;\n}\n\n\n\n\n\nbool cSpringStats::OnBiomes(const unsigned char * a_BiomeData)\n{\n\tmemcpy(m_Biomes, a_BiomeData, sizeof(m_Biomes));\n\tm_AreBiomesValid = true;\n\treturn false;\n}\n\n\n\n\n\nbool cSpringStats::OnSection(\n\tunsigned char a_Y,\n\tconst BLOCKTYPE * a_BlockTypes,\n\tconst NIBBLETYPE * a_BlockAdditional,\n\tconst NIBBLETYPE * a_BlockMeta,\n\tconst NIBBLETYPE * a_BlockLight,\n\tconst NIBBLETYPE * a_BlockSkyLight\n)\n{\n\tmemcpy(m_BlockTypes + ((int)a_Y) * 16 * 16 * 16,     a_BlockTypes, 16 * 16 * 16);\n\tmemcpy(m_BlockMetas + ((int)a_Y) * 16 * 16 * 16 / 2, a_BlockMeta,  16 * 16 * 16 / 2);\n\treturn false;\n}\n\n\n\n\n\nbool cSpringStats::OnSectionsFinished(void)\n{\n\tif (!m_AreBiomesValid)\n\t{\n\t\treturn true;\n\t}\n\n\t// Calc the spring stats:\n\tfor (int y = 1; y < 255; y++)\n\t{\n\t\tint BaseY = y * 16 * 16;\n\t\tfor (int z = 1; z < 15; z++)\n\t\t{\n\t\t\tint Base = BaseY + z * 16;\n\t\t\tfor (int x = 1; x < 15; x++)\n\t\t\t{\n\t\t\t\tif (cChunkDef::GetNibble(m_BlockMetas, x, y, z) != 0)\n\t\t\t\t{\n\t\t\t\t\t// Not a source block\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tswitch (m_BlockTypes[Base + x])\n\t\t\t\t{\n\t\t\t\t\tcase E_BLOCK_WATER:\n\t\t\t\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\t\t\t\t{\n\t\t\t\t\t\tTestSpring(x, y, z, m_Stats.m_WaterSprings);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase E_BLOCK_LAVA:\n\t\t\t\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t\t\t\t{\n\t\t\t\t\t\tTestSpring(x, y, z, m_Stats.m_LavaSprings);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}  // switch (BlockType)\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\tm_Stats.m_TotalChunks += 1;\n\treturn true;\n}\n\n\n\n\n\nvoid cSpringStats::TestSpring(int a_RelX, int a_RelY, int a_RelZ, cSpringStats::cStats::SpringStats & a_Stats)\n{\n\tstatic const struct\n\t{\n\t\tint x, y, z;\n\t} Coords[] =\n\t{\n\t\t{-1,  0,  0},\n\t\t{ 1,  0,  0},\n\t\t{ 0, -1,  0},\n\t\t{ 0,  1,  0},\n\t\t{ 0,  0, -1},\n\t\t{ 0,  0,  1},\n\t} ;\n\tbool HasFluidNextToIt = false;\n\tfor (int i = 0; i < ARRAYCOUNT(Coords); i++)\n\t{\n\t\tswitch (cChunkDef::GetBlock(m_BlockTypes, a_RelX + Coords[i].x, a_RelY + Coords[i].y, a_RelZ + Coords[i].z))\n\t\t{\n\t\t\tcase E_BLOCK_WATER:\n\t\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\t\tcase E_BLOCK_LAVA:\n\t\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t\t{\n\t\t\t\tif (cChunkDef::GetNibble(m_BlockMetas, a_RelX + Coords[i].x, a_RelY + Coords[i].y, a_RelZ + Coords[i].z) == 0)\n\t\t\t\t{\n\t\t\t\t\t// There is another source block next to this, so this is not a spring\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tHasFluidNextToIt = true;\n\t\t\t}\n\t\t}  // switch (BlockType)\n\t}  // for i - Coords[]\n\n\tif (!HasFluidNextToIt)\n\t{\n\t\t// Surrounded by solids on all sides, this is probably not a spring,\n\t\t// but rather a bedrocked lake or something similar. Dont want.\n\t\treturn;\n\t}\n\n\t// No source blocks next to the specified block, so it is a spring. Add it to stats:\n\ta_Stats[a_RelY][((unsigned char *)m_Biomes)[a_RelX + 16 * a_RelZ]] += 1;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSpringStatsFactory:\n\ncSpringStatsFactory::~cSpringStatsFactory()\n{\n\tLOG(\"cSpringStats:\");\n\tLOG(\"  Joining results...\");\n\tJoinResults();\n\tLOG(\"  Total %llu chunks went through\", m_CombinedStats.m_TotalChunks);\n\n\t// Save statistics:\n\tLOG(\"  Saving statistics into files:\");\n\tLOG(\"    Springs.xls\");\n\tSaveTotals(\"Springs.xls\");\n\tLOG(\"    BiomeWaterSprings.xls\");\n\tSaveStatistics(m_CombinedStats.m_WaterSprings, \"BiomeWaterSprings.xls\");\n\tLOG(\"    BiomeLavaSprings.xls\");\n\tSaveStatistics(m_CombinedStats.m_LavaSprings, \"BiomeLavaSprings.xls\");\n}\n\n\n\n\n\nvoid cSpringStatsFactory::JoinResults(void)\n{\n\tfor (cCallbacks::iterator itr = m_Callbacks.begin(), end = m_Callbacks.end(); itr != end; ++itr)\n\t{\n\t\tm_CombinedStats.Add(((cSpringStats *)(*itr))->GetStats());\n\t}  // for itr - m_Callbacks[]\n}\n\n\n\n\n\nvoid cSpringStatsFactory::SaveTotals(const AString & a_FileName)\n{\n\tcFile f(a_FileName, cFile::fmWrite);\n\tif (!f.IsOpen())\n\t{\n\t\tLOG(\"Cannot open file \\\"%s\\\" for writing!\", a_FileName.c_str());\n\t\treturn;\n\t}\n\tf.Printf(\"Height\\tWater\\tLava\\n\");\n\tfor (int Height = 0; Height < 256; Height++)\n\t{\n\t\tUInt64 TotalW = 0;\n\t\tUInt64 TotalL = 0;\n\t\tfor (int Biome = 0; Biome < 256; Biome++)\n\t\t{\n\t\t\tTotalW += m_CombinedStats.m_WaterSprings[Height][Biome];\n\t\t\tTotalL += m_CombinedStats.m_LavaSprings[Height][Biome];\n\t\t}\n\t\tf.Printf(\"%d\\t%llu\\t%llu\\n\", Height, TotalW, TotalL);\n\t}\n\tf.Printf(\"\\n# Chunks\\t%llu\", m_CombinedStats.m_TotalChunks);\n}\n\n\n\n\n\nvoid cSpringStatsFactory::SaveStatistics(const cSpringStats::cStats::SpringStats & a_Stats, const AString & a_FileName)\n{\n\tcFile f(a_FileName, cFile::fmWrite);\n\tif (!f.IsOpen())\n\t{\n\t\tLOG(\"Cannot open file \\\"%s\\\" for writing!\", a_FileName.c_str());\n\t\treturn;\n\t}\n\tfor (int Height = 0; Height < 256; Height++)\n\t{\n\t\tAString Line;\n\t\tLine.reserve(2000);\n\t\tPrintf(Line, \"%d\\t\", Height);\n\t\tfor (int Biome = 0; Biome < 256; Biome++)\n\t\t{\n\t\t\tAppendPrintf(Line, \"%llu\\t\", a_Stats[Height][Biome]);\n\t\t}\n\t\tLine.append(\"\\n\");\n\t\tf.Write(Line.c_str(), Line.size());\n\t}\n}\n"
  },
  {
    "path": "Tools/AnvilStats/SpringStats.h",
    "content": "\n// SpringStats.h\n\n// Declares the cSpringStats class representing a cCallback descendant that collects statistics on lava and water springs\n\n\n\n\n\n#pragma once\n\n#include \"Callback.h\"\n\n\n\n\n\nclass cSpringStats :\n\tpublic cCallback\n{\npublic:\n\tclass cStats\n\t{\n\tpublic:\n\t\t/** Per-height, per-biome frequencies of springs */\n\t\ttypedef UInt64 SpringStats[256][256];\n\n\t\tSpringStats m_LavaSprings;\n\t\tSpringStats m_WaterSprings;\n\n\t\t/** Total number of chunks that are fully processed through this callback(OnSectionsFinished()) */\n\t\tUInt64 m_TotalChunks;\n\n\t\tcStats(void);\n\t\tvoid Add(const cStats & a_Other);\n\t} ;\n\n\tcSpringStats(void);\n\n\tconst cStats & GetStats(void) const { return m_Stats; }\n\nprotected:\n\n\tBLOCKTYPE  m_BlockTypes[16 * 16 * 256];\n\tNIBBLETYPE m_BlockMetas[16 * 16 * 256 / 2];\n\tchar       m_Biomes[16 * 16];\n\tbool       m_AreBiomesValid;\n\n\tcStats m_Stats;\n\n\t// cCallback overrides:\n\tvirtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }\n\tvirtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) override { return false; }\n\tvirtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) override { return false; }\n\tvirtual bool OnRealCoords(int a_ChunkX, int a_ChunkZ) override { return false; }\n\tvirtual bool OnLastUpdate(Int64 a_LastUpdate) override { return false; }\n\tvirtual bool OnTerrainPopulated(bool a_Populated) override { return !a_Populated; }  // If not populated, we don't want it!\n\tvirtual bool OnBiomes(const unsigned char * a_BiomeData) override;\n\tvirtual bool OnHeightMap(const int * a_HeightMap) override { return false; }\n\tvirtual bool OnSection(\n\t\tunsigned char a_Y,\n\t\tconst BLOCKTYPE * a_BlockTypes,\n\t\tconst NIBBLETYPE * a_BlockAdditional,\n\t\tconst NIBBLETYPE * a_BlockMeta,\n\t\tconst NIBBLETYPE * a_BlockLight,\n\t\tconst NIBBLETYPE * a_BlockSkyLight\n\t) override;\n\tvirtual bool OnSectionsFinished(void) override;\n\n\t/** Tests the specified block, if it appears to be a spring, it is added to a_Stats */\n\tvoid TestSpring(int a_RelX, int a_RelY, int a_RelZ, cStats::SpringStats & a_Stats);\n} ;\n\n\n\n\n\nclass cSpringStatsFactory :\n\tpublic cCallbackFactory\n{\npublic:\n\tvirtual ~cSpringStatsFactory();\n\n\tvirtual cCallback * CreateNewCallback(void) override\n\t{\n\t\treturn new cSpringStats;\n\t}\n\n\tcSpringStats::cStats m_CombinedStats;\n\n\tvoid JoinResults(void);\n\n\t/** Saves total per-height data (summed through biomes) for both spring types to the file */\n\tvoid SaveTotals(const AString & a_FileName);\n\n\t/** Saves complete per-height, per-biome statistics for the springs to the file */\n\tvoid SaveStatistics(const cSpringStats::cStats::SpringStats & a_Stats, const AString & a_FileName);\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/Statistics.cpp",
    "content": "\n// Statistics.cpp\n\n// Implements the various statistics-collecting classes\n\n#include \"Globals.h\"\n#include \"Statistics.h\"\n#include \"../../src/WorldStorage/FastNBT.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStatistics::cStats:\n\ncStatistics::cStats::cStats(void) :\n\tm_TotalChunks(0),\n\tm_BiomeNumChunks(0),\n\tm_BlockNumChunks(0),\n\tm_NumEntities(0),\n\tm_NumTileEntities(0),\n\tm_NumTileTicks(0),\n\tm_MinChunkX(0x7fffffff),\n\tm_MaxChunkX(0x80000000),\n\tm_MinChunkZ(0x7fffffff),\n\tm_MaxChunkZ(0x80000000)\n{\n\tmemset(m_BiomeCounts,          0, sizeof(m_BiomeCounts));\n\tmemset(m_BlockCounts,          0, sizeof(m_BlockCounts));\n\tmemset(m_PerHeightBlockCounts, 0, sizeof(m_PerHeightBlockCounts));\n\tmemset(m_PerHeightSpawners,    0, sizeof(m_PerHeightSpawners));\n\tmemset(m_SpawnerEntity,        0, sizeof(m_SpawnerEntity));\n}\n\n\n\n\n\nvoid cStatistics::cStats::Add(const cStatistics::cStats & a_Stats)\n{\n\tfor (int i = 0; i <= 255; i++)\n\t{\n\t\tm_BiomeCounts[i] += a_Stats.m_BiomeCounts[i];\n\t}\n\tfor (int i = 0; i <= 255; i++)\n\t{\n\t\tfor (int j = 0; j <= 255; j++)\n\t\t{\n\t\t\tm_BlockCounts[i][j] += a_Stats.m_BlockCounts[i][j];\n\t\t\tm_PerHeightBlockCounts[i][j] += a_Stats.m_PerHeightBlockCounts[i][j];\n\t\t}\n\t\tfor (int j = 0; j < ARRAYCOUNT(m_PerHeightSpawners[0]); j++)\n\t\t{\n\t\t\tm_PerHeightSpawners[i][j] += a_Stats.m_PerHeightSpawners[i][j];\n\t\t}\n\t}\n\tfor (int i = 0; i < ARRAYCOUNT(m_SpawnerEntity); i++)\n\t{\n\t\tm_SpawnerEntity[i] += a_Stats.m_SpawnerEntity[i];\n\t}\n\tm_BiomeNumChunks += a_Stats.m_BiomeNumChunks;\n\tm_BlockNumChunks += a_Stats.m_BlockNumChunks;\n\tm_TotalChunks += a_Stats.m_TotalChunks;\n\tm_NumEntities += a_Stats.m_NumEntities;\n\tm_NumTileEntities += a_Stats.m_NumTileEntities;\n\tm_NumTileTicks += a_Stats.m_NumTileTicks;\n\tUpdateCoordsRange(a_Stats.m_MinChunkX, a_Stats.m_MinChunkZ);\n\tUpdateCoordsRange(a_Stats.m_MinChunkX, a_Stats.m_MinChunkZ);\n}\n\n\n\n\n\nvoid cStatistics::cStats::UpdateCoordsRange(int a_ChunkX, int a_ChunkZ)\n{\n\tif (a_ChunkX < m_MinChunkX)\n\t{\n\t\tm_MinChunkX = a_ChunkX;\n\t}\n\tif (a_ChunkX > m_MaxChunkX)\n\t{\n\t\tm_MaxChunkX = a_ChunkX;\n\t}\n\tif (a_ChunkZ < m_MinChunkZ)\n\t{\n\t\tm_MinChunkZ = a_ChunkZ;\n\t}\n\tif (a_ChunkZ > m_MaxChunkZ)\n\t{\n\t\tm_MaxChunkZ = a_ChunkZ;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStatistics:\n\ncStatistics::cStatistics(void)\n{\n}\n\n\n\n\n\nbool cStatistics::OnNewChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tm_Stats.m_TotalChunks++;\n\tm_Stats.UpdateCoordsRange(a_ChunkX, a_ChunkZ);\n\tm_IsBiomesValid = false;\n\tm_IsFirstSectionInChunk = true;\n\treturn false;\n}\n\n\n\n\n\nbool cStatistics::OnBiomes(const unsigned char * a_BiomeData)\n{\n\tfor (int i = 0; i < 16 * 16; i++)\n\t{\n\t\tm_Stats.m_BiomeCounts[a_BiomeData[i]] += 1;\n\t}\n\tm_Stats.m_BiomeNumChunks += 1;\n\tmemcpy(m_BiomeData, a_BiomeData, sizeof(m_BiomeData));\n\tm_IsBiomesValid = true;\n\treturn false;\n}\n\n\n\n\n\n\nbool cStatistics::OnSection\n(\n\tunsigned char a_Y,\n\tconst BLOCKTYPE * a_BlockTypes,\n\tconst NIBBLETYPE * a_BlockAdditional,\n\tconst NIBBLETYPE * a_BlockMeta,\n\tconst NIBBLETYPE * a_BlockLight,\n\tconst NIBBLETYPE * a_BlockSkyLight\n)\n{\n\tif (!m_IsBiomesValid)\n\t{\n\t\t// The current biome data is not valid, we don't have the means for sorting the BlockTypes into per-biome arrays\n\t\treturn true;\n\t}\n\n\tfor (int y = 0; y < 16; y++)\n\t{\n\t\tint Height = (int)a_Y * 16 + y;\n\t\tfor (int z = 0; z < 16; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < 16; x++)\n\t\t\t{\n\t\t\t\tunsigned char Biome = m_BiomeData[x + 16 * z];  // Cannot use cChunkDef, different datatype\n\t\t\t\tunsigned char BlockType = cChunkDef::GetBlock(a_BlockTypes, x, y, z);\n\t\t\t\tm_Stats.m_BlockCounts[Biome][BlockType] += 1;\n\t\t\t\tm_Stats.m_PerHeightBlockCounts[Height][BlockType] += 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tm_Stats.m_BlockNumChunks += m_IsFirstSectionInChunk ? 1 : 0;\n\tm_IsFirstSectionInChunk = false;\n\n\treturn false;\n}\n\n\n\n\n\nbool cStatistics::OnEmptySection(unsigned char a_Y)\n{\n\tif (!m_IsBiomesValid)\n\t{\n\t\t// The current biome data is not valid, we don't have the means for sorting the BlockTypes into per-biome arrays\n\t\treturn true;\n\t}\n\n\t// Add air to all columns:\n\tfor (int z = 0; z < 16; z++)\n\t{\n\t\tfor (int x = 0; x < 16; x++)\n\t\t{\n\t\t\tunsigned char Biome = m_BiomeData[x + 16 * z];  // Cannot use cChunkDef, different datatype\n\t\t\tm_Stats.m_BlockCounts[Biome][0] += 16;  // 16 blocks in a column, all air\n\t\t}\n\t}\n\n\tm_Stats.m_BlockNumChunks += m_IsFirstSectionInChunk ? 1 : 0;\n\tm_IsFirstSectionInChunk = false;\n\n\treturn false;\n}\n\n\n\n\n\nbool cStatistics::OnEntity(\n\tconst AString & a_EntityType,\n\tdouble a_PosX, double a_PosY, double a_PosZ,\n\tdouble a_SpeedX, double a_SpeedY, double a_SpeedZ,\n\tfloat a_Yaw, float a_Pitch,\n\tfloat a_FallDistance,\n\tshort a_FireTicksLeft,\n\tshort a_AirTicks,\n\tchar a_IsOnGround,\n\tcParsedNBT & a_NBT,\n\tint a_NBTTag\n)\n{\n\tm_Stats.m_NumEntities += 1;\n\n\t// TODO\n\n\treturn false;\n}\n\n\n\n\n\nbool cStatistics::OnTileEntity(\n\tconst AString & a_EntityType,\n\tint a_PosX, int a_PosY, int a_PosZ,\n\tcParsedNBT & a_NBT,\n\tint a_NBTTag\n)\n{\n\tm_Stats.m_NumTileEntities += 1;\n\n\tif (a_EntityType == \"MobSpawner\")\n\t{\n\t\tOnSpawner(a_NBT, a_NBTTag);\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nbool cStatistics::OnTileTick(\n\tint a_BlockType,\n\tint a_TicksLeft,\n\tint a_PosX, int a_PosY, int a_PosZ\n)\n{\n\tm_Stats.m_NumTileTicks += 1;\n\treturn false;\n}\n\n\n\n\n\nvoid cStatistics::OnSpawner(cParsedNBT & a_NBT, int a_TileEntityTag)\n{\n\t// Get the spawned entity type:\n\tint EntityIDTag = a_NBT.FindChildByName(a_TileEntityTag, \"EntityId\");\n\tif ((EntityIDTag < 0) || (a_NBT.GetType(EntityIDTag) != TAG_String))\n\t{\n\t\treturn;\n\t}\n\teEntityType Ent = GetEntityType(a_NBT.GetString(EntityIDTag));\n\tif (Ent >= ARRAYCOUNT(m_Stats.m_SpawnerEntity))\n\t{\n\t\treturn;\n\t}\n\tm_Stats.m_SpawnerEntity[Ent] += 1;\n\n\t// Get the spawner pos:\n\tint PosYTag = a_NBT.FindChildByName(a_TileEntityTag, \"y\");\n\tif ((PosYTag < 0) || (a_NBT.GetType(PosYTag) != TAG_Int))\n\t{\n\t\treturn;\n\t}\n\tint BlockY = Clamp(a_NBT.GetInt(PosYTag), 0, 255);\n\tm_Stats.m_PerHeightSpawners[BlockY][Ent] += 1;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStatisticsFactory:\n\ncStatisticsFactory::cStatisticsFactory(void) :\n\tm_BeginTick(clock())\n{\n}\n\n\n\n\n\ncStatisticsFactory::~cStatisticsFactory()\n{\n\t// Join the results together:\n\tLOG(\"cStatistics:\");\n\tLOG(\"  Joining results...\");\n\tJoinResults();\n\tLOG(\"  Total %llu chunks went through\", m_CombinedStats.m_TotalChunks);\n\tLOG(\"  Biomes processed for %llu chunks\", m_CombinedStats.m_BiomeNumChunks);\n\n\t// Check the number of blocks processed\n\tUInt64 TotalBlocks = 0;\n\tfor (int i = 0; i <= 255; i++)\n\t{\n\t\tfor (int j = 0; j < 255; j++)\n\t\t{\n\t\t\tTotalBlocks += m_CombinedStats.m_BlockCounts[i][j];\n\t\t}\n\t}\n\tUInt64 ExpTotalBlocks = m_CombinedStats.m_BlockNumChunks * 16LL * 16LL * 256LL;\n\tLOG(\"  BlockIDs processed for %llu chunks, %llu blocks (exp %llu; %s)\", m_CombinedStats.m_BlockNumChunks, TotalBlocks, ExpTotalBlocks, (TotalBlocks == ExpTotalBlocks) ? \"match\" : \"failed\");\n\n\t// Save statistics:\n\tLOG(\"  Saving statistics into files:\");\n\tLOG(\"    Statistics.txt\");\n\tSaveStatistics();\n\tLOG(\"    Biomes.xls\");\n\tSaveBiomes();\n\tLOG(\"    BlockTypes.xls\");\n\tSaveBlockTypes();\n\tLOG(\"    PerHeightBlockTypes.xls\");\n\tSavePerHeightBlockTypes();\n\tLOG(\"    BiomeBlockTypes.xls\");\n\tSaveBiomeBlockTypes();\n\tLOG(\"    Spawners.xls\");\n\tSaveSpawners();\n\tLOG(\"    PerHeightSpawners.xls\");\n\tSavePerHeightSpawners();\n}\n\n\n\n\n\nvoid cStatisticsFactory::JoinResults(void)\n{\n\tfor (cCallbacks::iterator itr = m_Callbacks.begin(), end = m_Callbacks.end(); itr != end; ++itr)\n\t{\n\t\tm_CombinedStats.Add(((cStatistics *)(*itr))->GetStats());\n\t}  // for itr - m_Callbacks[]\n}\n\n\n\n\n\nvoid cStatisticsFactory::SaveBiomes(void)\n{\n\tcFile f;\n\tif (!f.Open(\"Biomes.xls\", cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot write to file Biomes.xls. Statistics not written.\");\n\t\treturn;\n\t}\n\tdouble TotalColumns = (double)(m_CombinedStats.m_BiomeNumChunks) * 16 * 16 / 100;  // Total number of columns processed; convert into percent\n\tif (TotalColumns < 1)\n\t{\n\t\t// Avoid division by zero\n\t\tTotalColumns = 1;\n\t}\n\tfor (int i = 0; i <= 255; i++)\n\t{\n\t\tAString Line;\n\t\tPrintf(Line, \"%s\\t%d\\t%llu\\t%.05f\\n\", GetBiomeString(i), i, m_CombinedStats.m_BiomeCounts[i], ((double)(m_CombinedStats.m_BiomeCounts[i])) / TotalColumns);\n\t\tf.Write(Line.c_str(), Line.length());\n\t}\n}\n\n\n\n\n\nvoid cStatisticsFactory::SaveBlockTypes(void)\n{\n\tcFile f;\n\tif (!f.Open(\"BlockTypes.xls\", cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot write to file Biomes.xls. Statistics not written.\");\n\t\treturn;\n\t}\n\tdouble TotalBlocks = ((double)(m_CombinedStats.m_BlockNumChunks)) * 16 * 16 * 256 / 100;  // Total number of blocks processed; convert into percent\n\tif (TotalBlocks < 1)\n\t{\n\t\t// Avoid division by zero\n\t\tTotalBlocks = 1;\n\t}\n\tfor (int i = 0; i <= 255; i++)\n\t{\n\t\tUInt64 Count = 0;\n\t\tfor (int Biome = 0; Biome <= 255; ++Biome)\n\t\t{\n\t\t\tCount += m_CombinedStats.m_BlockCounts[Biome][i];\n\t\t}\n\t\tAString Line;\n\t\tPrintf(Line, \"%s\\t%d\\t%llu\\t%.08f\\n\", GetBlockTypeString(i), i, Count, ((double)Count) / TotalBlocks);\n\t\tf.Write(Line.c_str(), Line.length());\n\t}\n}\n\n\n\n\n\nvoid cStatisticsFactory::SavePerHeightBlockTypes(void)\n{\n\t// Export as two tables: biomes 0-127 and 128-255, because OpenOffice doesn't support more than 256 columns\n\n\tcFile f;\n\tif (!f.Open(\"PerHeightBlockTypes.xls\", cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot write to file PerHeightBlockTypes.xls. Statistics not written.\");\n\t\treturn;\n\t}\n\n\t// Write header:\n\tf.Printf(\"Blocks 0 - 127:\\nHeight\");\n\tfor (int i = 0; i < 128; i++)\n\t{\n\t\tf.Printf(\"\\t%s(%d)\", GetBlockTypeString(i), i);\n\t}\n\tf.Printf(\"\\n\");\n\n\t// Write first half:\n\tfor (int y = 0; y < 256; y++)\n\t{\n\t\tf.Printf(\"%d\", y);\n\t\tfor (int BlockType = 0; BlockType < 128; BlockType++)\n\t\t{\n\t\t\tf.Printf(\"\\t%llu\", m_CombinedStats.m_PerHeightBlockCounts[y][BlockType]);\n\t\t}  // for BlockType\n\t\tf.Printf(\"\\n\");\n\t}  // for y - height (0 - 127)\n\tf.Printf(\"\\n\");\n\n\t// Write second header:\n\tf.Printf(\"Blocks 128 - 255:\\nHeight\");\n\tfor (int i = 128; i < 256; i++)\n\t{\n\t\tf.Printf(\"\\t%s(%d)\", GetBlockTypeString(i), i);\n\t}\n\tf.Printf(\"\\n\");\n\n\t// Write second half:\n\tfor (int y = 0; y < 256; y++)\n\t{\n\t\tf.Printf(\"%d\", y);\n\t\tfor (int BlockType = 128; BlockType < 256; BlockType++)\n\t\t{\n\t\t\tf.Printf(\"\\t%llu\", m_CombinedStats.m_PerHeightBlockCounts[y][BlockType]);\n\t\t}  // for BlockType\n\t\tf.Printf(\"\\n\");\n\t}  // for y - height (0 - 127)\n}\n\n\n\n\n\nvoid cStatisticsFactory::SaveBiomeBlockTypes(void)\n{\n\t// Export as two tables: biomes 0-127 and 128-255, because OpenOffice doesn't support more than 256 columns\n\tcFile f;\n\tif (!f.Open(\"BiomeBlockTypes.xls\", cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot write to file BiomeBlockTypes.xls. Statistics not written.\");\n\t\treturn;\n\t}\n\n\tAString FileHeader(\"Biomes 0-127:\\n\");\n\tf.Write(FileHeader.c_str(), FileHeader.length());\n\n\tAString Header(\"BlockType\\tBlockType\");\n\tfor (int Biome = 0; Biome <= 127; Biome++)\n\t{\n\t\tconst char * BiomeName = GetBiomeString(Biome);\n\t\tif ((BiomeName != NULL) && (BiomeName[0] != 0))\n\t\t{\n\t\t\tAppendPrintf(Header, \"\\t%s (%d)\", BiomeName, Biome);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAppendPrintf(Header, \"\\t%d\", Biome);\n\t\t}\n\t}\n\tHeader.append(\"\\n\");\n\tf.Write(Header.c_str(), Header.length());\n\n\tfor (int BlockType = 0; BlockType <= 255; BlockType++)\n\t{\n\t\tAString Line;\n\t\tPrintf(Line, \"%s\\t%d\", GetBlockTypeString(BlockType), BlockType);\n\t\tfor (int Biome = 0; Biome <= 127; Biome++)\n\t\t{\n\t\t\tAppendPrintf(Line, \"\\t%llu\", m_CombinedStats.m_BlockCounts[Biome][BlockType]);\n\t\t}\n\t\tLine.append(\"\\n\");\n\t\tf.Write(Line.c_str(), Line.length());\n\t}\n\n\tHeader.assign(\"\\n\\nBiomes 127-255:\\nBlockType\\tBlockType\");\n\tfor (int Biome = 0; Biome <= 127; Biome++)\n\t{\n\t\tconst char * BiomeName = GetBiomeString(Biome);\n\t\tif ((BiomeName != NULL) && (BiomeName[0] != 0))\n\t\t{\n\t\t\tAppendPrintf(Header, \"\\t%s (%d)\", BiomeName, Biome);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAppendPrintf(Header, \"\\t%d\", Biome);\n\t\t}\n\t}\n\tHeader.append(\"\\n\");\n\tf.Write(Header.c_str(), Header.length());\n\n\tfor (int BlockType = 0; BlockType <= 255; BlockType++)\n\t{\n\t\tAString Line;\n\t\tPrintf(Line, \"%s\\t%d\", GetBlockTypeString(BlockType), BlockType);\n\t\tfor (int Biome = 128; Biome <= 255; Biome++)\n\t\t{\n\t\t\tAppendPrintf(Line, \"\\t%llu\", m_CombinedStats.m_BlockCounts[Biome][BlockType]);\n\t\t}\n\t\tLine.append(\"\\n\");\n\t\tf.Write(Line.c_str(), Line.length());\n\t}\n}\n\n\n\n\n\n\nvoid cStatisticsFactory::SaveStatistics(void)\n{\n\tcFile f;\n\tif (!f.Open(\"Statistics.txt\", cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot write to file Statistics.txt. Statistics not written.\");\n\t\treturn;\n\t}\n\n\tint Elapsed = (clock() - m_BeginTick) / CLOCKS_PER_SEC;\n\tf.Printf(\"Time elapsed: %d seconds (%d hours, %d minutes and %d seconds)\\n\", Elapsed, Elapsed / 3600, (Elapsed / 60) % 60, Elapsed % 60);\n\tf.Printf(\"Total chunks processed: %llu\\n\", m_CombinedStats.m_TotalChunks);\n\tif (Elapsed > 0)\n\t{\n\t\tf.Printf(\"Chunk processing speed: %.02f chunks per second\\n\", (double)(m_CombinedStats.m_TotalChunks) / Elapsed);\n\t}\n\tf.Printf(\"Biomes counted for %llu chunks.\\n\", m_CombinedStats.m_BiomeNumChunks);\n\tf.Printf(\"Blocktypes counted for %llu chunks.\\n\", m_CombinedStats.m_BlockNumChunks);\n\tf.Printf(\"Total blocks counted: %llu\\n\", m_CombinedStats.m_BlockNumChunks * 16 * 16 * 256);\n\tf.Printf(\"Total biomes counted: %llu\\n\", m_CombinedStats.m_BiomeNumChunks * 16 * 16);\n\tf.Printf(\"Total entities counted: %llu\\n\", m_CombinedStats.m_NumEntities);\n\tf.Printf(\"Total tile entities counted: %llu\\n\", m_CombinedStats.m_NumTileEntities);\n\tf.Printf(\"Total tile ticks counted: %llu\\n\", m_CombinedStats.m_NumTileTicks);\n\tf.Printf(\"Chunk coord ranges:\\n\");\n\tf.Printf(\"\\tX: %d .. %d\\n\", m_CombinedStats.m_MinChunkX, m_CombinedStats.m_MaxChunkX);\n\tf.Printf(\"\\tZ: %d .. %d\\n\", m_CombinedStats.m_MinChunkZ, m_CombinedStats.m_MaxChunkZ);\n}\n\n\n\n\n\nvoid cStatisticsFactory::SaveSpawners(void)\n{\n\tcFile f;\n\tif (!f.Open(\"Spawners.xls\", cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot write to file Spawners.xls. Statistics not written.\");\n\t\treturn;\n\t}\n\n\tf.Printf(\"Entity type\\tTotal count\\tCount per chunk\\n\");\n\tfor (int i = 0; i < entMax; i++)\n\t{\n\t\tf.Printf(\"%s\\t%llu\\t%0.4f\\n\", GetEntityTypeString((eEntityType)i), m_CombinedStats.m_SpawnerEntity[i], (double)(m_CombinedStats.m_SpawnerEntity[i]) / m_CombinedStats.m_BlockNumChunks);\n\t}\n}\n\n\n\n\n\nvoid cStatisticsFactory::SavePerHeightSpawners(void)\n{\n\tcFile f;\n\tif (!f.Open(\"PerHeightSpawners.xls\", cFile::fmWrite))\n\t{\n\t\tLOG(\"Cannot write to file PerHeightSpawners.xls. Statistics not written.\");\n\t\treturn;\n\t}\n\n\t// Write header:\n\tf.Printf(\"Height\\tTotal\");\n\tfor (int i = 0; i < entMax; i++)\n\t{\n\t\tf.Printf(\"\\t%s\", GetEntityTypeString((eEntityType)i));\n\t}\n\tf.Printf(\"\\n\");\n\n\t// Write individual lines:\n\tfor (int y = 0; y < 256; y++)\n\t{\n\t\tUInt64 Total = 0;\n\t\tfor (int i = 0; i < entMax; i++)\n\t\t{\n\t\t\tTotal += m_CombinedStats.m_PerHeightSpawners[y][i];\n\t\t}\n\t\tf.Printf(\"%d\\t%llu\", y, Total);\n\t\tfor (int i = 0; i < entMax; i++)\n\t\t{\n\t\t\tf.Printf(\"\\t%llu\", m_CombinedStats.m_PerHeightSpawners[y][i]);\n\t\t}\n\t\tf.Printf(\"\\n\");\n\t}\n}\n"
  },
  {
    "path": "Tools/AnvilStats/Statistics.h",
    "content": "\n// Statistics.h\n\n// Interfaces to the cStatistics class representing a statistics-collecting callback\n\n\n\n\n\n#pragma once\n\n#include \"Callback.h\"\n#include \"Utils.h\"\n\n\n\n\n\nclass cStatistics :\n\tpublic cCallback\n{\npublic:\n\tclass cStats\n\t{\n\tpublic:\n\t\tUInt64 m_TotalChunks;  // Total number of chunks that go through this callback (OnNewChunk())\n\t\tUInt64 m_BiomeCounts[256];\n\t\tUInt64 m_BlockCounts[256][256];  // First dimension is the biome, second dimension is BlockType\n\t\tUInt64 m_BiomeNumChunks;  // Num chunks that have been processed for biome stats\n\t\tUInt64 m_BlockNumChunks;  // Num chunks that have been processed for block stats\n\t\tUInt64 m_NumEntities;\n\t\tUInt64 m_NumTileEntities;\n\t\tUInt64 m_NumTileTicks;\n\t\tUInt64 m_PerHeightBlockCounts[256][256];  // First dimension is the height, second dimension is BlockType\n\t\tUInt64 m_PerHeightSpawners[256][entMax + 1];  // First dimension is the height, second dimension is spawned entity type\n\t\tint m_MinChunkX, m_MaxChunkX;  // X coords range\n\t\tint m_MinChunkZ, m_MaxChunkZ;  // Z coords range\n\n\t\tInt64 m;\n\t\tUInt64 m_SpawnerEntity[entMax + 1];\n\n\t\tcStats(void);\n\t\tvoid Add(const cStats & a_Stats);\n\t\tvoid UpdateCoordsRange(int a_ChunkX, int a_ChunkZ);\n\t} ;\n\n\tcStatistics(void);\n\n\tconst cStats & GetStats(void) const { return m_Stats; }\n\nprotected:\n\tcStats m_Stats;\n\n\t\tbool m_IsBiomesValid;  // Set to true in OnBiomes(), reset to false in OnNewChunk(); if true, the m_BiomeData is valid for the current chunk\n\t\tunsigned char m_BiomeData[16 * 16];\n\t\tbool m_IsFirstSectionInChunk;  // True if there was no section in the chunk yet. Set by OnNewChunk(), reset by OnSection()\n\n\t// cCallback overrides:\n\tvirtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }\n\tvirtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) override { return false; }\n\tvirtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) override { return false; }\n\tvirtual bool OnRealCoords(int a_ChunkX, int a_ChunkZ) override { return false; }\n\tvirtual bool OnLastUpdate(Int64 a_LastUpdate) override { return false; }\n\tvirtual bool OnTerrainPopulated(bool a_Populated) override { return !a_Populated; }  // If not populated, we don't want it!\n\tvirtual bool OnBiomes(const unsigned char * a_BiomeData) override;\n\tvirtual bool OnHeightMap(const int * a_HeightMap) override { return false; }\n\tvirtual bool OnSection(\n\t\tunsigned char a_Y,\n\t\tconst BLOCKTYPE * a_BlockTypes,\n\t\tconst NIBBLETYPE * a_BlockAdditional,\n\t\tconst NIBBLETYPE * a_BlockMeta,\n\t\tconst NIBBLETYPE * a_BlockLight,\n\t\tconst NIBBLETYPE * a_BlockSkyLight\n\t) override;\n\n\tvirtual bool OnEmptySection(unsigned char a_Y) override;\n\n\tvirtual bool OnSectionsFinished(void) override { return false; }  // continue processing\n\n\tvirtual bool OnEntity(\n\t\tconst AString & a_EntityType,\n\t\tdouble a_PosX, double a_PosY, double a_PosZ,\n\t\tdouble a_SpeedX, double a_SpeedY, double a_SpeedZ,\n\t\tfloat a_Yaw, float a_Pitch,\n\t\tfloat a_FallDistance,\n\t\tshort a_FireTicksLeft,\n\t\tshort a_AirTicks,\n\t\tchar a_IsOnGround,\n\t\tcParsedNBT & a_NBT,\n\t\tint a_NBTTag\n\t) override;\n\n\tvirtual bool OnTileEntity(\n\t\tconst AString & a_EntityType,\n\t\tint a_PosX, int a_PosY, int a_PosZ,\n\t\tcParsedNBT & a_NBT,\n\t\tint a_NBTTag\n\t) override;\n\n\tvirtual bool OnTileTick(\n\t\tint a_BlockType,\n\t\tint a_TicksLeft,\n\t\tint a_PosX, int a_PosY, int a_PosZ\n\t) override;\n\n\tvoid OnSpawner(cParsedNBT & a_NBT, int a_TileEntityTag);\n} ;\n\n\n\n\n\nclass cStatisticsFactory :\n\tpublic cCallbackFactory\n{\npublic:\n\tcStatisticsFactory(void);\n\tvirtual ~cStatisticsFactory();\n\n\tvirtual cCallback * CreateNewCallback(void)\n\t{\n\t\treturn new cStatistics;\n\t}\n\nprotected:\n\t// The results, combined, are stored here:\n\tcStatistics::cStats m_CombinedStats;\n\n\tclock_t m_BeginTick;\n\n\tvoid JoinResults(void);\n\tvoid SaveBiomes(void);\n\tvoid SaveBlockTypes(void);\n\tvoid SavePerHeightBlockTypes(void);\n\tvoid SaveBiomeBlockTypes(void);\n\tvoid SaveStatistics(void);\n\tvoid SaveSpawners(void);\n\tvoid SavePerHeightSpawners(void);\n} ;\n"
  },
  {
    "path": "Tools/AnvilStats/Utils.cpp",
    "content": "\n// Utils.cpp\n\n// Implements utility functions\n\n#include \"Globals.h\"\n#include \"Utils.h\"\n\n\n\n\n\nstruct\n{\n\teEntityType  Type;\n\tconst char * String;\n} g_EntityTypes[] =\n{\n\t{entBat,            \"Bat\"},\n\t{entBlaze,          \"Blaze\"},\n\t{entCaveSpider,     \"CaveSpider\"},\n\t{entChicken,        \"Chicken\"},\n\t{entCow,            \"Cow\"},\n\t{entCreeper,        \"Creeper\"},\n\t{entEnderDragon,    \"EnderDragon\"},\n\t{entEnderman,       \"Enderman\"},\n\t{entGhast,          \"Ghast\"},\n\t{entGiant,          \"Giant\"},\n\t{entGuardian,       \"Guardian\"},\n\t{entLavaSlime,      \"LavaSlime\"},\n\t{entMushroomCow,    \"MushroomCow\"},\n\t{entOzelot,         \"Ozelot\"},\n\t{entPig,            \"Pig\"},\n\t{entPigZombie,      \"PigZombie\"},\n\t{entRabbit,         \"Rabbit\"},\n\t{entSheep,          \"Sheep\"},\n\t{entSilverfish,     \"Slverfish\"},\n\t{entSkeleton,       \"Skeleton\"},\n\t{entSlime,          \"Slime\"},\n\t{entSnowMan,        \"SnowMan\"},\n\t{entSpider,         \"Spider\"},\n\t{entSquid,          \"Squid\"},\n\t{entVillager,       \"Villager\"},\n\t{entVillagerGolem,  \"VillagerGolem\"},\n\t{entWitch,          \"Witch\"},\n\t{entWitherBoss,     \"WitherBoss\"},\n\t{entWolf,           \"Wolf\"},\n\t{entZombie,         \"Zombie\"},\n\t{entZombieVillager, \"ZombieVillager\"},\n\t{entUnknown,        \"Unknown\"},\n} ;\n\n\n\n\n\nconst char * GetBiomeString(unsigned char a_Biome)\n{\n\tstatic const char * BiomeNames[] =  // Biome names, as equivalent to their index\n\t{\n\t\t\"Ocean\",\n\t\t\"Plains\",\n\t\t\"Desert\",\n\t\t\"Extreme Hills\",\n\t\t\"Forest\",\n\t\t\"Taiga\",\n\t\t\"Swampland\",\n\t\t\"River\",\n\t\t\"Hell\",\n\t\t\"Sky\",\n\t\t\"Frozen Ocean\",\n\t\t\"Frozen River\",\n\t\t\"Ice Plains\",\n\t\t\"Ice Mountains\",\n\t\t\"Mushroom Island\",\n\t\t\"Mushroom Island Shore\",\n\t\t\"Beach\",\n\t\t\"Desert Hills\",\n\t\t\"Forest Hills\",\n\t\t\"Taiga Hills\",\n\t\t\"Extreme Hills Edge\",\n\t\t\"Jungle\",\n\t\t\"Jungle Hills\",\n\t} ;\n\treturn (a_Biome < ARRAYCOUNT(BiomeNames)) ? BiomeNames[a_Biome] : \"\";\n}\n\n\n\n\n\nconst char * GetBlockTypeString(unsigned char a_BlockType)\n{\n\tstatic const char * BlockTypeNames[] =  // Block type names, as equivalent to their index\n\t{\n\t\t\"air\",\n\t\t\"stone\",\n\t\t\"grass\",\n\t\t\"dirt\",\n\t\t\"cobblestone\",\n\t\t\"planks\",\n\t\t\"sapling\",\n\t\t\"bedrock\",\n\t\t\"water\",\n\t\t\"stillwater\",\n\t\t\"lava\",\n\t\t\"stilllava\",\n\t\t\"sand\",\n\t\t\"gravel\",\n\t\t\"goldore\",\n\t\t\"ironore\",\n\t\t\"coalore\",\n\t\t\"log\",\n\t\t\"leaves\",\n\t\t\"sponge\",\n\t\t\"glass\",\n\t\t\"lapisore\",\n\t\t\"lapisblock\",\n\t\t\"dispenser\",\n\t\t\"sandstone\",\n\t\t\"noteblock\",\n\t\t\"bedblock\",\n\t\t\"poweredrail\",\n\t\t\"detectorrail\",\n\t\t\"stickypiston\",\n\t\t\"cobweb\",\n\t\t\"tallgrass\",\n\t\t\"deadbush\",\n\t\t\"piston\",\n\t\t\"pistonhead\",\n\t\t\"wool\",\n\t\t\"pistonmovedblock\",\n\t\t\"flower\",\n\t\t\"rose\",\n\t\t\"brownmushroom\",\n\t\t\"redmushroom\",\n\t\t\"goldblock\",\n\t\t\"ironblock\",\n\t\t\"doubleslab\",\n\t\t\"slab\",\n\t\t\"brickblock\",\n\t\t\"tnt\",\n\t\t\"bookcase\",\n\t\t\"mossycobblestone\",\n\t\t\"obsidian\",\n\t\t\"torch\",\n\t\t\"fire\",\n\t\t\"mobspawner\",\n\t\t\"woodstairs\",\n\t\t\"chest\",\n\t\t\"redstonedust\",\n\t\t\"diamondore\",\n\t\t\"diamondblock\",\n\t\t\"workbench\",\n\t\t\"crops\",\n\t\t\"soil\",\n\t\t\"furnace\",\n\t\t\"litfurnace\",\n\t\t\"signblock\",\n\t\t\"wooddoorblock\",\n\t\t\"ladder\",\n\t\t\"tracks\",\n\t\t\"cobblestonestairs\",\n\t\t\"wallsign\",\n\t\t\"lever\",\n\t\t\"stoneplate\",\n\t\t\"irondoorblock\",\n\t\t\"woodplate\",\n\t\t\"redstoneore\",\n\t\t\"redstoneorealt\",\n\t\t\"redstonetorchoff\",\n\t\t\"redstonetorchon\",\n\t\t\"button\",\n\t\t\"snow\",\n\t\t\"ice\",\n\t\t\"snowblock\",\n\t\t\"cactus\",\n\t\t\"clayblock\",\n\t\t\"reedblock\",\n\t\t\"jukebox\",\n\t\t\"fence\",\n\t\t\"pumpkin\",\n\t\t\"netherrack\",\n\t\t\"soulsand\",\n\t\t\"glowstone\",\n\t\t\"portal\",\n\t\t\"jack-o-lantern\",\n\t\t\"cakeblock\",\n\t\t\"repeateroff\",\n\t\t\"repeateron\",\n\t\t\"lockedchest\",\n\t\t\"trapdoor\",\n\t\t\"silverfishblock\",\n\t\t\"stonebricks\",\n\t\t\"hugebrownmushroom\",\n\t\t\"hugeredmushroom\",\n\t\t\"ironbars\",\n\t\t\"glasspane\",\n\t\t\"melon\",\n\t\t\"pumpkinstem\",\n\t\t\"melonstem\",\n\t\t\"vines\",\n\t\t\"fencegate\",\n\t\t\"brickstairs\",\n\t\t\"stonebrickstairs\",\n\t\t\"mycelium\",\n\t\t\"lilypad\",\n\t\t\"netherbrick\",\n\t\t\"netherbrickfence\",\n\t\t\"netherbrickstairs\",\n\t\t\"netherwartblock\",\n\t\t\"enchantmenttable\",\n\t\t\"brewingstandblock\",\n\t\t\"cauldronblock\",\n\t\t\"endportal\",\n\t\t\"endportalframe\",\n\t\t\"endstone\",\n\t\t\"dragonegg\",\n\t\t\"redstonelampoff\",\n\t\t\"redstonelampon\",\n\t\t\"woodendoubleslab\",\n\t\t\"woodenslab\",\n\t\t\"cocoapod\",\n\t\t\"sandstonestairs\",  /* 128 */\n\t\t\"Emerald Ore\",\n\t\t\"Ender Chest\",\n\t\t\"Tripwire Hook\",\n\t\t\"Tripwire\",\n\t\t\"Block of Emerald\",\n\t\t\"Spruce Wood Stairs\",\n\t\t\"Birch Wood Stairs\",\n\t\t\"Jungle Wood Stairs\",\n\t\t\"Command Block\",\n\t\t\"Beacon\",\n\t\t\"Cobblestone Wall\",\n\t\t\"Flower Pot\",\n\t\t\"Carrots\",\n\t\t\"Potatoes\",\n\t\t\"Wooden Button\",\n\t\t\"Head\",\n\t} ;\n\n\treturn (a_BlockType < ARRAYCOUNT(BlockTypeNames)) ? BlockTypeNames[a_BlockType] : \"\";\n}\n\n\n\n\n\neEntityType GetEntityType(const AString & a_EntityTypeString)\n{\n\tfor (int i = 0; i < ARRAYCOUNT(g_EntityTypes); i++)\n\t{\n\t\tif (a_EntityTypeString == g_EntityTypes[i].String)\n\t\t{\n\t\t\treturn g_EntityTypes[i].Type;\n\t\t}\n\t}\n\treturn entUnknown;\n}\n\n\n\n\n\nextern const char * GetEntityTypeString(eEntityType a_EntityType)\n{\n\treturn g_EntityTypes[a_EntityType].String;\n}\n\n\n\n\n\nint GetNumCores(void)\n{\n\t// Get number of cores by querying the system process affinity mask (Windows-specific)\n\tDWORD_PTR Affinity, ProcAffinity;\n\tGetProcessAffinityMask(GetCurrentProcess(), &ProcAffinity, &Affinity);\n\tint NumCores = 0;\n\twhile (Affinity > 0)\n\t{\n\t\tif ((Affinity & 1) == 1)\n\t\t{\n\t\t\t++NumCores;\n\t\t}\n\t\tAffinity >>= 1;\n\t}  // while (Affinity > 0)\n\treturn NumCores;\n}\n"
  },
  {
    "path": "Tools/AnvilStats/Utils.h",
    "content": "\n// Utils.h\n\n// Interfaces to utility functions\n\n\n\n\n\n#pragma once\n\n\n\n\n\nenum eEntityType\n{\n\tentBat,\n\tentBlaze,\n\tentCaveSpider,\n\tentChicken,\n\tentCow,\n\tentCreeper,\n\tentEnderDragon,\n\tentEnderman,\n\tentGhast,\n\tentGiant,\n\tentGuardian,\n\tentLavaSlime,\n\tentMushroomCow,\n\tentOzelot,\n\tentPig,\n\tentPigZombie,\n\tentRabbit,\n\tentSheep,\n\tentSilverfish,\n\tentSkeleton,\n\tentSlime,\n\tentSnowMan,\n\tentSpider,\n\tentSquid,\n\tentVillager,\n\tentVillagerGolem,\n\tentWitch,\n\tentWitherBoss,\n\tentWolf,\n\tentZombie,\n\tentZombieVillager,\n\tentUnknown,\n\tentMax = entUnknown,\n} ;\n\n\n\n\n\nextern const char * GetBiomeString(unsigned char a_Biome);\nextern const char * GetBlockTypeString(unsigned char a_BlockType);\nextern eEntityType GetEntityType(const AString & a_EntityTypeString);\nextern const char * GetEntityTypeString(eEntityType a_EntityType);\nextern int GetNumCores(void);\n\n\n\n"
  },
  {
    "path": "Tools/AnvilStats/profile_run.cmd",
    "content": "@echo off\n::\n:: Profiling using a MSVC standalone profiler\n::\n:: See https://www.codeproject.com/Articles/144643/Profiling-of-C-Applications-in-Visual-Studio-for-F for details\n::\n\n\n\n\nset pt=\"C:\\Program Files\\Microsoft Visual Studio 9.0\\Team Tools\\Performance Tools\"\nset appdir=\"Release profiled\"\nset app=\"Release profiled\\AnvilStats.exe\"\nset args=\"0 c:\\Games\\MLG\\world\\region\"\n\n:: outputdir is relative to appdir!\nset outputdir=Profiling\nset output=profile.vsp\n\n\n\n\n\n::Create the output directory, if it didn't exist\nmkdir %outputdir%\n\n\n\n\n\n:: Start the profiler\n%pt%\\vsperfcmd /start:sample /output:%outputdir%\\%output%\nif errorlevel 1 goto haderror\n\n:: Launch the application via the profiler\n%pt%\\vsperfcmd /launch:%app% /args:%args%\nif errorlevel 1 goto haderror\n\n:: Shut down the profiler (this command waits, until the application is terminated)\n%pt%\\vsperfcmd /shutdown\nif errorlevel 1 goto haderror\n\n\n\n\n\n:: cd to outputdir, so that the reports are generated there\ncd %outputdir%\n\n:: generate the report files (.csv)\n%pt%\\vsperfreport /summary:all %output% /symbolpath:\"srv*C:\\Programovani\\Symbols*https://msdl.microsoft.com/download/symbols\" \nif errorlevel 1 goto haderror\n\n\n\n\n\ngoto finished\n\n\n\n\n:haderror\necho An error was encountered\npause\n\n\n\n\n:finished\n"
  },
  {
    "path": "Tools/BlockTypePaletteGenerator/.gitignore",
    "content": "# Ignore the scripts' outputs:\n*.json\n*.btp.txt\nUpgradeBlockTypePalette.txt\n\n"
  },
  {
    "path": "Tools/BlockTypePaletteGenerator/Generator.lua",
    "content": "-- Generator.lua\n\n--[[\nCrafts an intermediate block palette format to be read by Cuberite.\nIt processes the blocks.json report file (https://wiki.vg/Data_Generators)\ninto a file that can be loaded into a BlockTypePalette (and is to be stored\nas Server/Protocol/<version>/base.btp.txt).\n\nThe output format is the regular TSV BlockTypePalette, described in the\n$/src/BlockTypePalette.h file.\n--]]\n\n\n\n\n-- Allow Lua to load libraries in our subfolder:\npackage.path = 'lib/lunajson/src/?.lua;' .. package.path;\n\n\n\n\n\n\n--- Prints usage instructions to stdout.\n-- If the optional `aMessage` is passed, output is prepended by message _and_\n-- redirected to stderr.\nlocal function usage(aMessage)\n\tif aMessage then\n\t\tio.output(io.stderr);\n\t\tio.write(aMessage, \"\\n\\n\");\n\tend\n\tio.write(\n\t\t\"Usage: lua Generator.lua INPUTFILE OUTPUTFILE\\n\"..\n\t\t\"Converts the Minecraft blocks.json report format to the cuberite \"..\n\t\t\"block type palette format.\\n\"..\n\t\t\"\\n\"..\n\t\t\"INPUTFILE and OUTPUTFILE must point to a valid path. INPUTFILE must \"..\n\t\t\"be readable and OUTPUTFILE must be writable. Either can be replaced \"..\n\t\t\"with `-` (dash character) to point to standard-input or -output.\\n\");\n\tos.exit(message and 1 or 0);\nend\n\n\n\n\n\n--- Parses the JSON registry into a Lua table\n--[[ The returned array-table has the following format:\n{\n\t{ id = 1, blockTypeName = \"minecraft:stone\", properties = {key = value, ...} },\n\t...\n}\n--]]\nlocal function parseRegistry(aBlockRegistryJsonStr)\n\tassert(type(aBlockRegistryJsonStr) == \"string\")\n\n\tlocal lj = require(\"lunajson\")\n\tlocal input = lj.decode(aBlockRegistryJsonStr)\n\tlocal registry = {}\n\tlocal idx = 1\n\tfor blockTypeName, blockData in pairs(input) do\n\t\tfor _, state in pairs(blockData.states) do\n\t\t\tregistry[idx] = {\n\t\t\t\tid = state.id,\n\t\t\t\tblockTypeName = blockTypeName,\n\t\t\t\tproperties = state.properties,\n\t\t\t}\n\t\t\tidx = idx + 1\n\t\tend\n\tend\n\treturn registry\nend\n\n\n\n\n\n--- Serializes the properties from the JSON / array table format into a single output string\n-- Concatenates all properties with \\t as the delimiting character\nlocal function serializeProperties(aProperties)\n\tlocal res = {}\n\tlocal idx = 1\n\tfor k, v in pairs(aProperties or {}) do\n\t\tres[idx] = k\n\t\tres[idx + 1] = v\n\t\tidx = idx + 2\n\tend\n\treturn table.concat(res, \"\\t\")\nend\n\n\n\n\n\n--- Returns the prefix that is common for all block type names in the registry\n-- aRegistry is the parsed registry, as returned from parseRegistry()\nlocal function findCommonPrefix(aRegistryTable)\n\tlocal prefix = aRegistryTable[1].blockTypeName\n\tlocal len = string.len(prefix)\n\tlocal sub = string.sub\n\tfor _, block in ipairs(aRegistryTable) do\n\t\twhile (sub(block.blockTypeName, 1, len) ~= prefix) do\n\t\t\tlen = len - 1\n\t\t\tif (len == 0) then\n\t\t\t\treturn \"\"\n\t\t\tend\n\t\t\tprefix = sub(prefix, 1, len)\n\t\tend\n\tend\n\treturn prefix\nend\n\n\n\n\n\n-- Test whether the script is run in a path where it can load it's libraries\nif not(pcall(function() require(\"lunajson\") end)) then\n\tusage(\n\t\t\"Could not load required libraries, please run `Generator.lua` \" ..\n\t\t\"within its directory and make sure to run `git submodule update`.\"\n\t)\nend\n\n-- Check/Prepare CLI arguments\nlocal inpath, outpath = ...;\ninpath = inpath or \"blocks.json\"\noutpath = outpath or \"base.btp.txt\"\nif (inpath ~= \"-\") then\n\tlocal handle, err = io.open(inpath, \"r\")\n\tio.input(handle or usage(err))\nend\nif (outpath ~= \"-\") then\n\tlocal handle, err = io.open(outpath, \"w\")\n\tio.output(handle or usage(err))\nend\n\n-- Parse the registry:\nlocal registry = parseRegistry(io.input():read(\"*a\"))\nlocal commonPrefix = findCommonPrefix(registry)\n\n-- Sort the entries:\ntable.sort(registry,\n\tfunction (entry1, entry2)\n\t\treturn (entry1.id < entry2.id)\n\tend\n)\n\n-- Write out the output format:\nio.write(\"BlockTypePalette\\n\")\nio.write(\"FileVersion\\t1\\n\")\nio.write(\"CommonPrefix\\t\", commonPrefix, \"\\n\")\nio.write(\"\\n\")\nlocal prefixLen = string.len(commonPrefix) + 1\nfor _, entry in ipairs(registry) do\n\tlocal props = serializeProperties(entry.properties)\n\tif (props ~= \"\") then\n\t\tprops = \"\\t\" .. props\n\tend\n\tio.write(\n\t\tentry.id, \"\\t\",\n\t\tstring.sub(entry.blockTypeName, prefixLen),\n\t\tprops, \"\\n\"\n\t)\nend\n"
  },
  {
    "path": "Tools/BlockTypePaletteGenerator/UpgradeGenerator.lua",
    "content": "-- UpgradeGenerator.lua\n\n--[[ Creates the UpgradeBlockTypePalette out of JSON data of the Minutor project\n(https://github.com/mrkite/minutor/blob/master/definitions/vanilla_ids.json\n\nParses the JSON into memory, then walks each block's \"id\" member and possibly\nthe \"variants\" sub-member to read the block types. The name is either present as \"flatname\",\nor is synthesized from the internal Minutor \"name\" by lowercasing and replacing spaces\nwith underscores.\n\nExpects two parameters, the input file and output file; either can be replaced by\na \"-\" to use stdin / stdout instead. If not given, the input file defaults to\n\"vanilla_ids.json\" and the output file defaults to \"UpgradeBlockTypePalette.txt\"\n\nThe output format is the upgrade TSV BlockTypePalette, described in the\n$/src/BlockTypePalette.h file.\n--]]\n\n\n\n\n\n\n-- Allow Lua to load libraries in our subfolder:\npackage.path = 'lib/lunajson/src/?.lua;' .. package.path;\n\n\n\n\n\n\n--- Splits the full flat name into flat name and properties\n-- \"minecraft:carrots:age:0\" -> \"minecraft:carrots\", {age = 0}\nlocal function splitFlatName(aFullFlatName)\n\tlocal props = {}\n\tlocal numParts = 0\n\tlocal flatName = \"\"\n\tlocal propKey = \"\"\n\taFullFlatName:gsub(\"([^:]+)\",\n\t\tfunction (aPart)\n\t\t\tif (numParts == 0) then\n\t\t\t\tflatName = aPart\n\t\t\telseif (numParts == 1) then\n\t\t\t\tflatName = flatName .. \":\" .. aPart\n\t\t\telseif (numParts % 2 == 0) then\n\t\t\t\tpropKey = aPart\n\t\t\telse\n\t\t\t\tprops[propKey] = aPart\n\t\t\tend\n\t\t\tnumParts = numParts + 1\n\t\tend\n\t)\n\treturn flatName, props\nend\n\n\n\n\n\n--- Returns the minecraft block name, created from the flat name if present, or synthesized\n-- from the Minutor name\n-- If the flat name contains encoded block properties, it returns those properties as a dict-table\n-- in the second return value\nlocal function processBlockName(aFlatName, aMinutorName)\n\tif (aFlatName) then\n\t\tassert(type(aFlatName) == \"string\")\n\t\treturn splitFlatName(aFlatName)\n\tend\n\tif not(type(aMinutorName) == \"string\") then\n\t\treturn nil\n\tend\n\treturn \"minecraft:\" .. (aMinutorName:lower():gsub(\" \", \"_\")), {}\nend\n\n\n\n\n\n\n--- Serializes the properties from the JSON / array table format into a single output string\n-- Concatenates all properties with \\t as the delimiting character\nlocal function serializeProperties(aProperties)\n\tlocal res = {}\n\tlocal idx = 1\n\tfor k, v in pairs(aProperties or {}) do\n\t\tres[idx] = k\n\t\tres[idx + 1] = v\n\t\tidx = idx + 2\n\tend\n\treturn table.concat(res, \"\\t\")\nend\n\n\n\n\n\n--- Parses the vanilla_ids.json into a common registry format\n-- The returned registry is an array-table of\n-- {blockType = 1, blockMeta = 2, blockTypeName = \"name\", properties = {key = value, ...}}\nlocal function parseRegistry(aJsonString)\n\tassert(type(aJsonString) == \"string\")\n\n\t-- Parse the JSON:\n\tlocal lj = require(\"lunajson\")\n\tlocal input = lj.decode(aJsonString)\n\tif (not(input) or (input[\"type\"] ~= \"block\") or not(input[\"data\"])) then\n\t\terror(\"The input file doesn't contain vanilla IDs.\")\n\tend\n\n\t-- Create the registry:\n\tlocal registry = {}\n\tlocal idx = 1\n\tfor _, entry in pairs(input[\"data\"]) do\n\t\tlocal id = entry[\"id\"]\n\t\tlocal parentBlockTypeName, props = processBlockName(entry[\"flatname\"], entry[\"name\"])\n\t\tregistry[idx] =\n\t\t{\n\t\t\tblockType = id,\n\t\t\tblockMeta = 0,\n\t\t\tblockTypeName = parentBlockTypeName,\n\t\t\tproperties = props,\n\t\t}\n\t\tidx = idx + 1\n\t\tfor _, variant in pairs(entry[\"variants\"] or {}) do\n\t\t\tlocal blockTypeName, props = processBlockName(variant[\"flatname\"], variant[\"name\"])\n\t\t\tif not(blockTypeName) then\n\t\t\t\t-- Some blocks don't have all their variants named (\"brown mushroom block\"), use the parent name in such a case\n\t\t\t\tblockTypeName = parentBlockTypeName\n\t\t\tend\n\t\t\tregistry[idx] =\n\t\t\t{\n\t\t\t\tblockType = id,\n\t\t\t\tblockMeta = variant[\"data\"],\n\t\t\t\tblockTypeName = blockTypeName,\n\t\t\t\tproperties = props,\n\t\t\t}\n\t\t\tidx = idx + 1\n\t\tend\n\tend\n\treturn registry\nend\n\n\n\n\n\n--- Returns the prefix that is common for all block type names in the registry\n-- aRegistry is the parsed registry, as returned from parseRegistry()\nlocal function findCommonPrefix(aRegistryTable)\n\tlocal prefix = aRegistryTable[1].blockTypeName\n\tlocal len = string.len(prefix)\n\tlocal sub = string.sub\n\tfor _, block in ipairs(aRegistryTable) do\n\t\twhile (sub(block.blockTypeName, 1, len) ~= prefix) do\n\t\t\tlen = len - 1\n\t\t\tif (len == 0) then\n\t\t\t\treturn \"\"\n\t\t\tend\n\t\t\tprefix = sub(prefix, 1, len)\n\t\tend\n\tend\n\treturn prefix\nend\n\n\n\n\n\n-- Test whether the script is run in a path where it can load it's libraries\nif not(pcall(function() require(\"lunajson\") end)) then\n\terror(\n\t\t\"Could not load required libraries, please run `UpgradeGenerator.lua` \" ..\n\t\t\"within its directory and make sure to run `git submodule update`.\"\n\t)\nend\n\n-- Check/Prepare CLI arguments\nlocal inpath, outpath = ...;\ninpath = inpath or \"vanilla_ids.json\"\noutpath = outpath or \"UpgradeBlockTypePalette.txt\"\nif (inpath ~= \"-\") then\n\tlocal handle, err = io.open(inpath, \"r\")\n\tio.input(handle or usage(err))\nend\nif (outpath ~= \"-\") then\n\tlocal handle, err = io.open(outpath, \"w\")\n\tio.output(handle or usage(err))\nend\n\n-- Parse the registry:\nlocal registry = parseRegistry(io.input():read(\"*a\"))\nlocal commonPrefix = findCommonPrefix(registry)\n\n-- Sort the entries:\ntable.sort(registry,\n\tfunction (entry1, entry2)\n\t\tif (entry1.blockType < entry2.blockType) then\n\t\t\treturn true\n\t\telseif (entry1.blockType > entry2.blockType) then\n\t\t\treturn false\n\t\telse\n\t\t\treturn (entry1.blockMeta < entry2.blockMeta)\n\t\tend\n\tend\n)\n\n-- Write out the output format:\nio.write(\"UpgradeBlockTypePalette\\n\")\nio.write(\"FileVersion\\t1\\n\")\nio.write(\"CommonPrefix\\t\", commonPrefix, \"\\n\")\nio.write(\"\\n\")\nlocal prefixLen = string.len(commonPrefix) + 1\nfor _, entry in ipairs(registry) do\n\tlocal props = serializeProperties(entry.properties)\n\tif (props ~= \"\") then\n\t\tprops = \"\\t\" .. props\n\tend\n\tio.write(\n\t\tentry.blockType, \"\\t\", entry.blockMeta, \"\\t\",\n\t\tstring.sub(entry.blockTypeName, prefixLen),\n\t\tprops, \"\\n\"\n\t)\nend\n"
  },
  {
    "path": "Tools/BlockTypePaletteGenerator/UpgradePaletteCheck.lua",
    "content": "-- UpgradePaletteCheck.lua\n\n--[[ Implements a check that lists all entries in the UpgradeBlockTypePalette\nthat are not present in the 1.13 protocol palette.\n\nThe palette files are expected to be in folders relative to this script like\nthey are in the git repo:\n../../Server/Protocol/UpgradeBlockTypePalette.txt\n../../Server/Protocol/1.13/base.btp.txt\n--]]\n\n\n\n\n\n--- Partially loads a BlockTypePalette file\n-- Parses the specified file into headers (returned as a key-value table) and data (returned as array of strings)\n-- Returns a table, {headers = {}, data = {}}\nlocal function loadPalSplitHeader(aFileName)\n\tlocal f = assert(io.open(aFileName, \"r\"))\n\tlocal isFileIdentLine = true\n\tlocal isInHeaders = false\n\tlocal headers = {}\n\tlocal data = {}\n\tlocal idx = 1\n\tfor ln in f:lines() do\n\t\tif (isFileIdentLine) then\n\t\t\tassert(not(isInHeaders))\n\t\t\tassert((ln == \"BlockTypePalette\") or (ln == \"UpgradeBlockTypePalette\"))\n\t\t\tisFileIdentLine = false\n\t\t\tisInHeaders = true\n\t\telseif (ln == \"\") then\n\t\t\tassert(not(isFileIdentLine))\n\t\t\tassert(isInHeaders)  -- data must not contain an empty line\n\t\t\tisInHeaders = false\n\t\telseif (isInHeaders) then\n\t\t\tassert(not(isFileIdentLine))\n\t\t\tlocal key, val = ln:match(\"(.-)\\t(.*)\")\n\t\t\tassert(key)\n\t\t\tassert(val)\n\t\t\theaders[key] = val\n\t\telse\n\t\t\tdata[idx] = ln\n\t\t\tidx = idx + 1\n\t\tend\n\tend\n\treturn { headers = headers, data = data}\nend\n\n\n\n\n\n--- Normalizes the block description\n-- aRawDesc is the description read from the palette file, \"grass_block\\tsnowy\\tfalse\"\n-- Returns the normalized description \"grass_block:snowy:false\", where the block state keys are alpha-sorted\nlocal function normalizeDesc(aRawDesc)\n\tlocal blockTypeName, blockStates = aRawDesc:match(\"(.-)\\t(.*)\")\n\tif not(blockTypeName) then\n\t\t-- There's no TABs in the raw desc, only simple block\n\t\treturn aRawDesc\n\tend\n\tlocal blockStatesTab = {}\n\tlocal idx = 1\n\tblockStates = blockStates .. \"\\t\"\n\tfor k, v in blockStates:gmatch(\"(.-)\\t(.-)\\t\") do\n\t\tblockStatesTab[idx] = k .. \":\" .. v\n\t\tidx = idx + 1\n\tend\n\ttable.sort(blockStatesTab)\n\treturn blockTypeName .. \":\" .. table.concat(blockStatesTab, \":\")\nend\n\n\n\n\n\n--- Loads the 1.13 palette\n--[[\nReturns the palette loaded as a table:\n{\n\tnumberToDesc = {[1] = \"minecraft:stone\", [8] = \"minecraft:grass_block:snowy:false\", ...},\n\tdescToNumber = {[\"minecraft:stone\"] = 1, ...}\n}\n--]]\nlocal function loadPalette()\n\tlocal pal = loadPalSplitHeader(\"../../Server/Protocol/1.13/base.btp.txt\")\n\tlocal numberToDesc = {}\n\tlocal descToNumber = {}\n\tlocal prefix = pal.headers[\"CommonPrefix\"] or \"\"\n\tfor _, ln in ipairs(pal.data) do\n\t\tlocal number, desc = ln:match(\"(.-)\\t(.*)\")\n\t\tdesc = normalizeDesc(desc)\n\t\tdesc = prefix .. desc\n\t\tnumber = tonumber(number) or error(\"Index is not a number: \" .. ln)\n\t\tnumberToDesc[number] = desc\n\t\tdescToNumber[desc] = number\n\tend\n\treturn { numberToDesc = numberToDesc, descToNumber = descToNumber}\nend\n\n\n\n\n\nlocal function runCheck()\n\t-- Load the palettes:\n\tlocal pal = loadPalette()\n\tlocal upg = loadPalSplitHeader(\"../../Server/Protocol/UpgradeBlockTypePalette.txt\")\n\n\t-- Check the UpgradePalette's BlockDescs against the 1.13 palette:\n\tlocal prefix = upg.headers[\"CommonPrefix\"] or \"\"\n\tlocal notFound = {}\n\tlocal idx = 1\n\tlocal totalCnt = 0\n\tfor _, ln in ipairs(upg.data) do\n\t\tlocal blockType, blockMeta, desc = ln:match(\"(.-)\\t(.-)\\t(.*)\")\n\t\tlocal normDesc = normalizeDesc(prefix .. desc)\n\t\tif not(pal.descToNumber[normDesc]) then\n\t\t\tnotFound[idx] = {blockType = blockType, blockMeta = blockMeta, desc = desc}\n\t\t\tidx = idx + 1\n\t\tend\n\t\ttotalCnt = totalCnt + 1\n\tend\n\tidx = idx - 1\n\n\t-- Print the findings:\n\tprint(\"Blocks not found: \" .. idx .. \" out of \" .. totalCnt)\n\tfor _, nf in ipairs(notFound) do\n\t\tprint(nf.blockType .. \"\\t\" .. nf.blockMeta .. \"\\t\" .. nf.desc)\n\tend\n\tprint(\"Blocks not found: \" .. idx .. \" out of \" .. totalCnt)\nend\n\n\n\n\n\n-- MAIN:\nrunCheck()\n"
  },
  {
    "path": "Tools/BlockZapper/.gitignore",
    "content": "Debug/\nlogs/\nRelease/\n"
  },
  {
    "path": "Tools/BlockZapper/BlockZapper.cpp",
    "content": "\n// BlockZapper.cpp\n\n// Implements the main app entrypoint\n\n#include \"Globals.h\"\n\n#include <fstream>\n\n#include \"Regions.h\"\n#include \"Zapper.h\"\n\n\n\n\n\n#ifdef _MSC_VER\n\t// Under MSVC, link to WinSock2 (needed by FastNBT's byteswapping)\n\t#pragma comment(lib, \"ws2_32.lib\")\n#endif\n\n\n\n\n\nvoid ShowHelp(const char * a_ProgramFullName)\n{\n\tAString ProgramName(a_ProgramFullName);\n\tsize_t idx = ProgramName.rfind(cFile::PathSeparator);\n\tif (idx != AString::npos)\n\t{\n\t\tProgramName.erase(0, idx + 1);\n\t}\n\tprintf(\"Tool written by _Xoft(o), code is public domain.\\n\");\n\tprintf(\"Usage:\\n\");\n\tprintf(\"%s [-w <MCAFolder>]\\n\", ProgramName.c_str());\n\tprintf(\"Zaps blocks and / or entities in specified regions.\\n\");\n\tprintf(\"Regions are read from stdin, the format is:\\n\");\n\tprintf(\"  x1 x2 y1 y2 z1 z2 [B|E|BE]\\n\");\n\tprintf(\"B or no specifier zaps blocks only\\n\");\n\tprintf(\"E zaps entities only\\n\");\n\tprintf(\"BE zaps blocks and entities\\n\");\n\tprintf(\"MCA files are searched in the <MCAFolder>; if not specified, in the current folder.\\n\");\n}\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tnew cMCLogger;  // Create a new logger, it will assign itself as the main logger instance\n\n\tAString MCAFolder = \".\";\n\tfor (int i = 1; i < argc; i++)\n\t{\n\t\tif (strcmp(argv[i], \"-w\") == 0)\n\t\t{\n\t\t\tif (i < argc - 1)\n\t\t\t{\n\t\t\t\tMCAFolder = argv[i + 1];\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t\telse if (\n\t\t\t(strcmp(argv[i], \"help\") == 0) ||\n\t\t\t(strcmp(argv[i], \"-?\") == 0) ||\n\t\t\t(strcmp(argv[i], \"/?\") == 0) ||\n\t\t\t(strcmp(argv[i], \"-h\") == 0) ||\n\t\t\t(strcmp(argv[i], \"--help\") == 0)\n\t\t)\n\t\t{\n\t\t\tShowHelp(argv[0]);\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tcRegions Regions;\n\n\t/*\n\t// DEBUG: Read input from a file instead of stdin:\n\tstd::fstream fs(\"test_in.txt\");\n\tRegions.Read(fs);\n\t//*/\n\n\tRegions.Read(std::cin);\n\n\tcZapper Zapper(MCAFolder);\n\tZapper.ZapRegions(Regions.GetAll());\n\n\tLOGINFO(\"Done\");\n\treturn 0;\n} ;\n"
  },
  {
    "path": "Tools/BlockZapper/BlockZapper.txt",
    "content": "\n// BlockZapper.txt\n\n/*\nThis project implements a simple tool that can \"zap\" blocks out of an Anvil-stored MineCraft world.\nIt is usually used by server admins when their servers fail with a bug and store an invalid block in the world.\nThis tool takes a coord triplet and a radius triplet and replaces all blocks within the (new york-metric) radius of the coords with air.\nThe triplets pair is given on stdin, and multiple such specifiers are allowed, each on a separate file.\nIf the specifier line ends with an additional \" E\", entities within that radius are zapped instead of blocks\nIf the specifier line ends with an additional \" BE\", both blocks and entities are zapped.\n\nThe tool is aware of extended blocktypes (256 .. 4096).\n\nThe source code for this tool is public domain, but note that it depends on a few shared sources in Cuberite that may be under other licenses.\n*/\n\n\n\n\n"
  },
  {
    "path": "Tools/BlockZapper/GNUmakefile",
    "content": "###################################################\n#\n# Makefile for BlockZapper\n# Creator: xoft\n#\n###################################################\n#\n# Info:\n# This makefile is gnu-make spacific, other make systems needn't understand it\n# This makefile generates include-file dependencies into *.d files in each build and then reuses these dependencies in the following builds\n#\n# Usage:\n# To make a release build, call \"make\"\n# To make a debug build, call \"make debug=1\"\n#\n###################################################\n\n#\n# Macros\n#\n\nCC = /usr/bin/g++\n\n\nall: BlockZapper\n\n\n\n\n\n###################################################\n# Set the variables used for compiling, based on the build mode requested:\n# CC_OPTIONS  ... options for the C code compiler\n# CXX_OPTIONS ... options for the C++ code compiler\n# LNK_OPTIONS ... options for the linker\n# LNK_LIBS    ... libraries to link in\n#   -- according to https://stackoverflow.com/questions/6183899/undefined-reference-to-dlopen, libs must come after all sources\n# BUILDDIR    ... folder where the intermediate object files are built\n\nLNK_LIBS = -lstdc++ -ldl -lz\n\nifeq ($(debug),1)\n################\n# debug build - fully traceable by gdb in C++ code, slowest\n# Since C code is used only for supporting libraries (zlib, lua), it is still O3-optimized\n################\nCC_OPTIONS = -s -ggdb -g -D_DEBUG -O3\nCXX_OPTIONS = -s -ggdb -g -D_DEBUG\nLNK_OPTIONS = -pthread -g -ggdb\nBUILDDIR = build/debug/\n\nelse\nifeq ($(profile),1)\n################\n# profile build - a release build with symbols and profiling engine built in\n################\nCC_OPTIONS = -s -g -ggdb -O3 -pg -DNDEBUG\nCXX_OPTIONS = -s -g -ggdb -O3 -pg -DNDEBUG\nLNK_OPTIONS = -pthread -ggdb -O3 -pg\nBUILDDIR = build/profile/\n\nelse\nifeq ($(pedantic),1)\n################\n# pedantic build - basically a debug build with lots of warnings\n################\nCC_OPTIONS = -s -g -ggdb -D_DEBUG -Wall -Wextra -pedantic -ansi -Wno-long-long\nCXX_OPTIONS = -s -g -ggdb -D_DEBUG -Wall -Wextra -pedantic -ansi -Wno-long-long\nLNK_OPTIONS = -pthread -ggdb\nBUILDDIR = build/pedantic/\n\nelse\n################\n# release build - fastest run-time, no detailed gdb support\n################\nCC_OPTIONS = -s -g -O3 -DNDEBUG\nCXX_OPTIONS = -s -g -O3 -DNDEBUG\nLNK_OPTIONS = -pthread -O3\nBUILDDIR = build/release/\nendif\nendif\nendif\n\n\n\n################\n# 32-bit build override in 64-bit build environments\n#   - so that BearBin doesn't need to modify his makefile after each makefile change :)\n################\nifeq ($(addm32),1)\nCC_OPTIONS += -m32\nCXX_OPTIONS += -m32\nLNK_OPTIONS += -m32\nendif\n\n\n\n###################################################\n# INCLUDE directories\n#\n\nINCLUDE = -I.\\\n\t\t-I../../src\\\n\t\t-I../../lib\\\n\n\n\n\n\n###################################################\n# Build BlockZapper\n#\n\nSOURCES := $(shell find . '(' -name '*.cpp' -o -name '*.c' ')')\n\nSHAREDSOURCES := \\\n\tsrc/Log.cpp \\\n\tsrc/MCLogger.cpp \\\n\tsrc/Noise.cpp \\\n\tsrc/StringCompression.cpp \\\n\tsrc/StringUtils.cpp \\\n\tsrc/OSSupport/CriticalSection.cpp \\\n\tsrc/OSSupport/File.cpp \\\n\tsrc/OSSupport/IsThread.cpp \\\n\tsrc/OSSupport/MakeDir.cpp \\\n\tsrc/WorldStorage/FastNBT.cpp\n\nSHAREDSOURCES := $(filter-out %minigzip.c,$(SHAREDSOURCES))\n\nOBJECTS := $(patsubst %.c,$(BUILDDIR)%.o,$(SOURCES))\nOBJECTS := $(patsubst %.cpp,$(BUILDDIR)%.o,$(OBJECTS))\n\nSHAREDOBJECTS := $(patsubst %.c,$(BUILDDIR)%.o,$(SHAREDSOURCES))\nSHAREDOBJECTS := $(patsubst %.cpp,$(BUILDDIR)%.o,$(SHAREDOBJECTS))\n\n-include $(patsubst %.o,%.d,$(OBJECTS))\n-include $(patsubst %.o,%.d,$(SHAREDOBJECTS))\n\nBlockZapper : $(OBJECTS) $(SHAREDOBJECTS)\n\t$(CC) $(LNK_OPTIONS) $(OBJECTS) $(SHAREDOBJECTS) $(LNK_LIBS) -o BlockZapper\n\nclean :\n\t\trm -rf $(BUILDDIR) BlockZapper\n\n\n\n\n\n\n###################################################\n# Build the parts of BlockZapper\n#\n# options used:\n#  -x c  ... compile as C code\n#  -c    ... compile but do not link\n#  -MM   ... generate a list of includes\n\n$(BUILDDIR)%.o: %.c\n\t@mkdir -p $(dir $@)\n\t$(CC) $(CC_OPTIONS) -x c -c $(INCLUDE) $< -o $@\n\t@$(CC) $(CC_OPTIONS) -x c -MM $(INCLUDE) $< > $(patsubst %.o,%.d,$@)\n\t@mv -f $(patsubst %.o,%.d,$@) $(patsubst %.o,%.d,$@).tmp\n\t@sed -e \"s|.*:|$(BUILDDIR)$*.o:|\" < $(patsubst %.o,%.d,$@).tmp > $(patsubst %.o,%.d,$@)\n\t@sed -e 's/.*://' -e 's/\\\\$$//' < $(patsubst %.o,%.d,$@).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(patsubst %.o,%.d,$@)\n\t@rm -f $(patsubst %.o,%.d,$@).tmp\n\n$(BUILDDIR)%.o: %.cpp\n\t@mkdir -p $(dir $@)\n\t$(CC) $(CXX_OPTIONS) -c $(INCLUDE) $< -o $@\n\t@$(CC) $(CXX_OPTIONS) -MM $(INCLUDE) $< > $(patsubst %.o,%.d,$@)\n\t@mv -f $(patsubst %.o,%.d,$@) $(patsubst %.o,%.d,$@).tmp\n\t@sed -e \"s|.*:|$(BUILDDIR)$*.o:|\" < $(patsubst %.o,%.d,$@).tmp > $(patsubst %.o,%.d,$@)\n\t@sed -e 's/.*://' -e 's/\\\\$$//' < $(patsubst %.o,%.d,$@).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(patsubst %.o,%.d,$@)\n\t@rm -f $(patsubst %.o,%.d,$@).tmp\n\n$(BUILDDIR)src/%.o: ../../src/%.cpp\n\t@mkdir -p $(dir $@)\n\t$(CC) $(CXX_OPTIONS) -c $(INCLUDE) $< -o $@\n\t@$(CC) $(CXX_OPTIONS) -MM $(INCLUDE) $< > $(patsubst %.o,%.d,$@)\n\t@mv -f $(patsubst %.o,%.d,$@) $(patsubst %.o,%.d,$@).tmp\n\t@sed -e \"s|.*:|$(BUILDDIR)$*.o:|\" < $(patsubst %.o,%.d,$@).tmp > $(patsubst %.o,%.d,$@)\n\t@sed -e 's/.*://' -e 's/\\\\$$//' < $(patsubst %.o,%.d,$@).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(patsubst %.o,%.d,$@)\n\t@rm -f $(patsubst %.o,%.d,$@).tmp\n"
  },
  {
    "path": "Tools/BlockZapper/Globals.cpp",
    "content": "\n// Globals.cpp\n\n// Used for precompiled header generation in MSVC\n\n#include \"Globals.h\"\n\n\n\n\n"
  },
  {
    "path": "Tools/BlockZapper/Globals.h",
    "content": "\n// Globals.h\n\n// This file is used for precompiled header generation in MSVC\n\n\n\n\n\n#include \"../../src/Globals.h\"\n\n\n\n\n"
  },
  {
    "path": "Tools/BlockZapper/Regions.cpp",
    "content": "\n// Regions.cpp\n\n// Implements the cRegions class representing the list of regions to zap\n\n#include \"Globals.h\"\n\n#include \"Regions.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRegion:\n\ncRegion::cRegion(void) :\n\tm_MinX(0),\n\tm_MaxX(0),\n\tm_MinY(0),\n\tm_MaxY(0),\n\tm_MinZ(0),\n\tm_MaxZ(0),\n\tm_ShouldZapBlocks(false),\n\tm_ShouldZapEntities(false)\n{\n}\n\n\n\n\n\ncRegion::cRegion(int a_MinX, int a_MaxX, int a_MinY, int a_MaxY, int a_MinZ, int a_MaxZ, bool a_ShouldZapBlocks, bool a_ShouldZapEntities) :\n\tm_MinX(a_MinX),\n\tm_MaxX(a_MaxX),\n\tm_MinY(std::max(0, std::min(255, a_MinY))),\n\tm_MaxY(std::max(0, std::min(255, a_MaxY))),\n\tm_MinZ(a_MinZ),\n\tm_MaxZ(a_MaxZ),\n\tm_ShouldZapBlocks(a_ShouldZapBlocks),\n\tm_ShouldZapEntities(a_ShouldZapEntities)\n{\n}\n\n\n\n\n\nbool cRegion::TouchesChunk(int a_ChunkX, int a_ChunkZ) const\n{\n\tint ChunkBeginX = a_ChunkX * 16;\n\tint ChunkEndX = a_ChunkX * 16 + 15;\n\tint ChunkBeginZ = a_ChunkZ * 16;\n\tint ChunkEndZ = a_ChunkZ * 16 + 15;\n\tif (\n\t\t(m_MinX > ChunkEndX) || (m_MaxX < ChunkBeginX) ||\n\t\t(m_MinZ > ChunkEndZ) || (m_MaxZ < ChunkBeginZ)\n\t)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRegions:\n\nvoid cRegions::Read(std::istream & a_Stream)\n{\n\twhile (!a_Stream.eof())\n\t{\n\t\tAString Line;\n\t\tstd::getline(a_Stream, Line);\n\n\t\t// Process the line\n\t\tAStringVector Split = StringSplit(Line, \" \\t\");\n\t\tAStringVector NonEmpty;\n\t\tfor (AStringVector::const_iterator itr = Split.begin(), end = Split.end(); itr != end; ++itr)\n\t\t{\n\t\t\tif (!itr->empty())\n\t\t\t{\n\t\t\t\tNonEmpty.push_back(*itr);\n\t\t\t}\n\t\t}  // for itr - Split[]\n\t\tswitch (NonEmpty.size())\n\t\t{\n\t\t\tcase 6:\n\t\t\tcase 7:\n\t\t\t{\n\t\t\t\tAddRegion(NonEmpty);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tfprintf(stderr, \"Cannot parse line \\\"%s\\\", ignoring\", Line.c_str());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cRegions::AddRegion(const AStringVector & a_Split)\n{\n\tASSERT((a_Split.size() == 6) || (a_Split.size() == 7));\n\n\tint Coords[6];\n\tfor (int i = 0; i < 6; i++)\n\t{\n\t\tCoords[i] = atoi(a_Split[i].c_str());\n\t\tif ((Coords[i] == 0) && (a_Split[i] != \"0\"))\n\t\t{\n\t\t\tfprintf(stderr, \"Bad coord: \\\"%s\\\". Ignoring line.\", a_Split[i].c_str());\n\t\t\treturn;\n\t\t}\n\t}  // for i - a_Split[]\n\n\tbool ShouldZapBlocks = true;\n\tbool ShouldZapEntities = false;\n\n\tif (a_Split.size() == 7)\n\t{\n\t\tAString Upper = a_Split[6];\n\t\tStrToUpper(Upper);\n\t\tif (Upper == \"E\")\n\t\t{\n\t\t\tShouldZapEntities = true;\n\t\t\tShouldZapBlocks = false;\n\t\t}\n\t\telse if (Upper == \"BE\")\n\t\t{\n\t\t\tShouldZapEntities = true;\n\t\t}\n\t\telse if (Upper == \"B\")\n\t\t{\n\t\t\t// Nothing needed\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfprintf(stderr, \"Bad zap specifier: \\\"%s\\\". Ignoring line.\", a_Split[6].c_str());\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Swap coords, if needed:\n\tfor (int i = 0; i < 3; i++)\n\t{\n\t\tif (Coords[2 * i] > Coords[2 * i + 1])\n\t\t{\n\t\t\tstd::swap(Coords[2 * i], Coords[2 * i + 1]);\n\t\t}\n\t}\n\n\t// Store the region\n\tm_Regions.push_back(cRegion(Coords[0], Coords[1], Coords[2], Coords[3], Coords[4], Coords[5], ShouldZapBlocks, ShouldZapEntities));\n}\n"
  },
  {
    "path": "Tools/BlockZapper/Regions.h",
    "content": "\n// Regions.h\n\n// Declares the cRegions class representing individual regions to zap\n\n\n\n\n\n#pragma once\n\n#include <iostream>\n\n\n\n\n\nstruct cRegion\n{\n\tint m_MinX, m_MaxX;\n\tint m_MinY, m_MaxY;\n\tint m_MinZ, m_MaxZ;\n\n\tbool m_ShouldZapBlocks;\n\tbool m_ShouldZapEntities;\n\n\tcRegion(void);\n\tcRegion(int a_MinX, int a_MaxX, int a_MinY, int a_MaxY, int a_MinZ, int a_MaxZ, bool a_ShouldZapBlocks, bool a_ShouldZapEntities);\n\n\tbool TouchesChunk(int a_ChunkX, int a_ChunkZ) const;\n} ;\n\ntypedef std::vector<cRegion> cRegionVector;\n\n\n\n\n\nclass cRegions\n{\npublic:\n\t/** Reads the list of regions from the specified stream */\n\tvoid Read(std::istream & a_Stream);\n\n\t/** Returns all regions in this container */\n\tconst cRegionVector & GetAll(void) const { return m_Regions; }\n\nprotected:\n\tcRegionVector m_Regions;\n\n\t/** Adds a new region based on the contents of the split line. The split must already be the correct size */\n\tvoid AddRegion(const AStringVector & a_Split);\n\n} ;\n"
  },
  {
    "path": "Tools/BlockZapper/Zapper.cpp",
    "content": "\n// Zapper.cpp\n\n// Implements the cZapper class representing the processor that actually zaps blocks and entities\n\n#include \"Globals.h\"\n\n#include \"WorldStorage/FastNBT.h\"\n#include \"StringCompression.h\"\n#include \"zlib/zlib.h\"\n\n#include \"Zapper.h\"\n\n\n\n\n\n/** The maximum size of an inflated chunk; raw chunk data is 192 KiB, allow 64 KiB more of entities */\n#define CHUNK_INFLATE_MAX 256 KiB\n\n\n\n\n\ncZapper::cZapper(const AString & a_MCAFolder) :\n\tm_MCAFolder(a_MCAFolder)\n{\n}\n\n\n\n\n\nvoid cZapper::ZapRegions(const cRegionVector & a_Regions)\n{\n\tfor (cRegionVector::const_iterator itr = a_Regions.begin(), end = a_Regions.end(); itr != end; ++itr)\n\t{\n\t\tint MinAnvX, MinAnvZ;\n\t\tint MaxAnvX, MaxAnvZ;\n\t\tBlockToMCA(itr->m_MinX, itr->m_MinZ, MinAnvX, MinAnvZ);\n\t\tBlockToMCA(itr->m_MaxX, itr->m_MaxZ, MaxAnvX, MaxAnvZ);\n\t\tfor (int x = MinAnvX; x <= MaxAnvX; x++)\n\t\t{\n\t\t\tfor (int z = MinAnvZ; z <= MaxAnvZ; z++)\n\t\t\t{\n\t\t\t\tZapRegionInMCAFile(*itr, x, z);\n\t\t\t}\n\t\t}\n\t}  // for itr - a_Regions\n}\n\n\n\n\n\nvoid cZapper::BlockToMCA(int a_BlockX, int a_BlockZ, int & a_MCAX, int & a_MCAZ)\n{\n\t// These need to be arithmetic shifts, consult your compiler documentation to see if it's so\n\t// MSVC and GCC both use arithmetic shifts\n\ta_MCAX = a_BlockX >> 10;\n\ta_MCAZ = a_BlockZ >> 10;\n}\n\n\n\n\n\nvoid cZapper::BlockToChunk(int a_BlockX, int a_BlockZ, int & a_ChunkX, int & a_ChunkZ)\n{\n\t// These need to be arithmetic shifts, consult your compiler documentation to see if it's so\n\t// MSVC and GCC both use arithmetic shifts\n\ta_ChunkX = a_BlockX >> 4;\n\ta_ChunkZ = a_BlockZ >> 4;\n}\n\n\n\n\n\nvoid cZapper::ZapRegionInMCAFile(const cRegion & a_Region, int a_MCAX, int a_MCAZ)\n{\n\tcFile fIn;\n\tAString FileNameIn = Printf(\"%s/r.%d.%d.mca\", m_MCAFolder.c_str(), a_MCAX, a_MCAZ);\n\tif (!fIn.Open(FileNameIn, cFile::fmRead))\n\t{\n\t\treturn;\n\t}\n\tcFile fOut;\n\tAString FileNameOut = Printf(\"%s/r.%d.%d.zap\", m_MCAFolder.c_str(), a_MCAX, a_MCAZ);\n\tif (!fOut.Open(FileNameOut, cFile::fmWrite))\n\t{\n\t\tfprintf(stderr, \"Cannot open temporary file \\\"%s\\\" for writing, skipping file \\\"%s\\\".\", FileNameOut.c_str(), FileNameIn.c_str());\n\t\treturn;\n\t}\n\n\tAString DataOut;\n\tDataOut.reserve(fIn.GetSize());\n\n\tint HeaderIn[2048];\n\tif (fIn.Read(HeaderIn, sizeof(HeaderIn)) != sizeof(HeaderIn))\n\t{\n\t\tfprintf(stderr, \"Cannot read header from file \\\"%s\\\", skipping file.\", FileNameIn.c_str());\n\t}\n\tint HeaderOut[2048];\n\tfor (int i = 0; i < 1024; i++)\n\t{\n\t\tif (HeaderIn[i] == 0)\n\t\t{\n\t\t\t// Chunk not present\n\t\t\tHeaderOut[i] = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tAString ChunkData;\n\t\tint ChunkX = a_MCAX * ChunksPerMCAX + (i % ChunksPerMCAX);\n\t\tint ChunkZ = a_MCAZ * ChunksPerMCAZ + (i / ChunksPerMCAX);\n\n\t\tLoadChunkData(fIn, HeaderIn[i], ChunkData, ChunkX, ChunkZ);\n\n\t\tif (a_Region.TouchesChunk(ChunkX, ChunkZ))\n\t\t{\n\t\t\tZapRegionInRawChunkData(a_Region, ChunkData, ChunkX, ChunkZ);\n\t\t}\n\t\tunsigned char ChunkHeader[5];\n\t\tsize_t DataSize = ChunkData.size() + 1;\n\t\tChunkHeader[0] = (DataSize >> 24) & 0xff;\n\t\tChunkHeader[1] = (DataSize >> 16) & 0xff;\n\t\tChunkHeader[2] = (DataSize >> 8)  & 0xff;\n\t\tChunkHeader[3] = DataSize & 0xff;\n\t\tChunkHeader[4] = 2;  // zlib compression\n\t\tsize_t Alignment = 4096 - (ChunkData.size() + 5) % 4096;  // 5 bytes of the header are appended outside of ChunkData\n\t\tif (Alignment > 0)\n\t\t{\n\t\t\tChunkData.append(Alignment, (char)0);\n\t\t}\n\t\tHeaderOut[i] = htonl(((DataOut.size() / 4096 + 2) << 8) | ((ChunkData.size() + 5) / 4096));\n\t\tDataOut.append((const char *)ChunkHeader, sizeof(ChunkHeader));\n\t\tDataOut.append(ChunkData);\n\t}  // for i - chunks in fIn\n\tfor (int i = 1024; i < 2048; i++)\n\t{\n\t\tHeaderOut[i] = HeaderIn[i];\n\t}\n\tfIn.Close();\n\tfOut.Write(HeaderOut, sizeof(HeaderOut));\n\tfOut.Write(DataOut.data(), DataOut.size());\n\tfOut.Close();\n\tcFile::Delete(FileNameIn);\n\tcFile::Rename(FileNameOut, FileNameIn);\n}\n\n\n\n\n\nvoid cZapper::LoadChunkData(cFile & a_InFile, int a_ChunkHeaderValue, AString & a_ChunkData, int a_ChunkX, int a_ChunkZ)\n{\n\ta_ChunkHeaderValue = ntohl(a_ChunkHeaderValue);  // Convert from big-endian to system-endian\n\tint ChunkOffset = (a_ChunkHeaderValue >> 8) * 4096;\n\tint ChunkSize = (a_ChunkHeaderValue & 0xff) * 4096;\n\ta_InFile.Seek(ChunkOffset);\n\tunsigned char ChunkHeader[5];\n\ta_InFile.Read(ChunkHeader, sizeof(ChunkHeader));\n\tif (ChunkHeader[4] != 2)\n\t{\n\t\tfprintf(stderr, \"Chunk [%d, %d] is compressed in an unknown scheme (%d), skipping\", a_ChunkX, a_ChunkZ, ChunkHeader[4]);\n\t\treturn;\n\t}\n\tint ActualSize = (ChunkHeader[0] << 24) |  (ChunkHeader[1] << 16) | (ChunkHeader[2] << 8) | ChunkHeader[3];\n\tActualSize -= 1;  // Compression took 1 byte\n\ta_ChunkData.resize(ActualSize);\n\tint BytesRead = a_InFile.Read((void *)(a_ChunkData.data()), ActualSize);\n\tif (BytesRead != ActualSize)\n\t{\n\t\tfprintf(stderr, \"Chunk is truncated in file (%d bytes out of %d), skipping.\", BytesRead, ActualSize);\n\t\ta_ChunkData.clear();\n\t\treturn;\n\t}\n}\n\n\n\n\n\nvoid cZapper::ZapRegionInRawChunkData(const cRegion & a_Region, AString & a_ChunkData, int a_ChunkX, int a_ChunkZ)\n{\n\t// Decompress the data:\n\tchar Uncompressed[CHUNK_INFLATE_MAX];\n\tz_stream strm;\n\tstrm.zalloc = (alloc_func)NULL;\n\tstrm.zfree = (free_func)NULL;\n\tstrm.opaque = NULL;\n\tinflateInit(&strm);\n\tstrm.next_out  = (Bytef *)Uncompressed;\n\tstrm.avail_out = sizeof(Uncompressed);\n\tstrm.next_in   = (Bytef *)a_ChunkData.data();\n\tstrm.avail_in  = a_ChunkData.size();\n\tint res = inflate(&strm, Z_FINISH);\n\tinflateEnd(&strm);\n\tif (res != Z_STREAM_END)\n\t{\n\t\tfprintf(stderr, \"Chunk [%d, %d] failed to decompress: error %d. Skipping chunk.\", a_ChunkX, a_ChunkZ, res);\n\t\treturn;\n\t}\n\n\t/*\n\t// DEBUG: Output src to a file:\n\tcFile f1;\n\tif (f1.Open(Printf(\"chunk_%d_%d_in.nbt\", a_ChunkX, a_ChunkZ), cFile::fmWrite))\n\t{\n\t\tf1.Write(Uncompressed, strm.total_out);\n\t}\n\t//*/\n\n\tcParsedNBT NBT(Uncompressed, strm.total_out);\n\tif (!NBT.IsValid())\n\t{\n\t\tfprintf(stderr, \"Chunk [%d, %d] failed to parse. Skipping chunk.\", a_ChunkX, a_ChunkZ);\n\t\treturn;\n\t}\n\tZapRegionInNBTChunk(a_Region, NBT, a_ChunkX, a_ChunkZ);\n\n\tcFastNBTWriter Writer;\n\tfor (int ch = NBT.GetFirstChild(0); ch >= 0; ch = NBT.GetNextSibling(ch))\n\t{\n\t\tSerializeNBTTag(NBT, ch, Writer);\n\t}\n\tWriter.Finish();\n\n\t/*\n\t// DEBUG: Output dst to a file:\n\tcFile f2;\n\tif (f2.Open(Printf(\"chunk_%d_%d_out.nbt\", a_ChunkX, a_ChunkZ), cFile::fmWrite))\n\t{\n\t\tf2.Write(Writer.GetResult().data(), Writer.GetResult().size());\n\t}\n\t//*/\n\n\t// Compress the serialized data into \"Uncompressed\" (reuse buffer)\n\tCompressString(Writer.GetResult().data(), Writer.GetResult().size(), a_ChunkData);\n}\n\n\n\n\n\nvoid cZapper::ZapRegionInNBTChunk(const cRegion & a_Region, cParsedNBT & a_NBT, int a_ChunkX, int a_ChunkZ)\n{\n\tint LevelTag = a_NBT.FindChildByName(a_NBT.GetRoot(), \"Level\");\n\tif (LevelTag < 0)\n\t{\n\t\tfprintf(stderr, \"Cannot find Level tag in chunk [%d, %d]'s NBT. Skipping chunk.\", a_ChunkX, a_ChunkZ);\n\t\treturn;\n\t}\n\n\t// Create a copy of the region and limit it to the current chunk:\n\tint BlockX = a_ChunkX * 16;\n\tint BlockZ = a_ChunkZ * 16;\n\tcRegion Local;\n\tLocal.m_MinX = std::max(0, a_Region.m_MinX - BlockX);\n\tLocal.m_MaxX = std::min(15, a_Region.m_MaxX - BlockX);\n\tLocal.m_MinY = a_Region.m_MinY;\n\tLocal.m_MaxY = a_Region.m_MaxY;\n\tLocal.m_MinZ = std::max(0, a_Region.m_MinZ - BlockZ);\n\tLocal.m_MaxZ = std::min(15, a_Region.m_MaxZ - BlockZ);\n\n\tif (a_Region.m_ShouldZapBlocks)\n\t{\n\t\tint SectionsTag = a_NBT.FindChildByName(LevelTag, \"Sections\");\n\t\tif (SectionsTag < 0)\n\t\t{\n\t\t\tfprintf(stderr, \"Cannot find the Sections tag in the Level tag in chunk [%d, %d]'s NBT. Skipping block-zapping in chunk.\", a_ChunkX, a_ChunkZ);\n\t\t\treturn;\n\t\t}\n\t\tZapRegionBlocksInNBT(Local, a_NBT, SectionsTag);\n\t}\n\n\tif (a_Region.m_ShouldZapEntities)\n\t{\n\t\tint EntitiesTag = a_NBT.FindChildByName(LevelTag, \"Entities\");\n\t\tif (EntitiesTag < 0)\n\t\t{\n\t\t\tfprintf(stderr, \"Cannot find the Entities tag in the Level tag in chunk [%d, %d]'s NBT. Skipping entity-zapping in chunk.\", a_ChunkX, a_ChunkZ);\n\t\t\treturn;\n\t\t}\n\t\tZapRegionEntitiesInNBT(Local, a_NBT, EntitiesTag);\n\t}\n}\n\n\n\n\n\nvoid cZapper::ZapRegionBlocksInNBT(const cRegion & a_Region, cParsedNBT & a_NBT, int a_SectionsTag)\n{\n\tfor (int Child = a_NBT.GetFirstChild(a_SectionsTag); Child >= 0; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tint y = 0;\n\t\tint SectionY = a_NBT.FindChildByName(Child, \"Y\");\n\t\tif ((SectionY < 0) || (a_NBT.GetType(SectionY) != TAG_Byte))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\ty = a_NBT.GetByte(SectionY);\n\t\tif ((y * 16 > a_Region.m_MaxY) || (y * 16 + 16 < a_Region.m_MinY))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tint BlockDataTag = a_NBT.FindChildByName(Child, \"Blocks\");\n\t\tint BlockMetaTag = a_NBT.FindChildByName(Child, \"Data\");\n\t\tint BlockAddTag  = a_NBT.FindChildByName(Child, \"Add\");\n\t\tif (BlockDataTag > 0)\n\t\t{\n\t\t\tZapRegionInNBTSectionBytes(a_Region, y, (unsigned char *)(a_NBT.GetData(BlockDataTag)));\n\t\t}\n\t\tif (BlockMetaTag > 0)\n\t\t{\n\t\t\tZapRegionInNBTSectionNibbles(a_Region, y, (unsigned char *)(a_NBT.GetData(BlockMetaTag)));\n\t\t}\n\t\tif (BlockAddTag > 0)\n\t\t{\n\t\t\tZapRegionInNBTSectionNibbles(a_Region, y, (unsigned char *)(a_NBT.GetData(BlockAddTag)));\n\t\t}\n\t}  // for Child - Level / Sections / []\n}\n\n\n\n\n\nvoid cZapper::ZapRegionInNBTSectionBytes(const cRegion & a_Region, int a_SectionY, unsigned char * a_BlockBytes)\n{\n\tint MinY = std::max(0, a_Region.m_MinY - a_SectionY * 16);\n\tint MaxY = std::min(15, a_Region.m_MaxY - a_SectionY * 16);\n\tASSERT(MinY >= 0);\n\tASSERT(MaxY >= 0);\n\tfor (int y = MinY; y <= MaxY; y++)\n\t{\n\t\tfor (int z = a_Region.m_MinZ; z <= a_Region.m_MaxZ; z++)\n\t\t{\n\t\t\tfor (int x = a_Region.m_MinX; x <= a_Region.m_MaxX; x++)\n\t\t\t{\n\t\t\t\ta_BlockBytes[x + z * 16 + y * 16 * 16] = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cZapper::ZapRegionInNBTSectionNibbles(const cRegion & a_Region, int a_SectionY, unsigned char * a_BlockNibbles)\n{\n\tint MinY = std::max(0, a_Region.m_MinY - a_SectionY * 16);\n\tint MaxY = std::min(15, a_Region.m_MaxY - a_SectionY * 16);\n\tASSERT(MinY >= 0);\n\tASSERT(MaxY >= 0);\n\tfor (int y = MinY; y <= MaxY; y++)\n\t{\n\t\tfor (int z = a_Region.m_MinZ; z < a_Region.m_MaxZ; z++)\n\t\t{\n\t\t\tfor (int x = a_Region.m_MinX; x < a_Region.m_MaxX; x++)\n\t\t\t{\n\t\t\t\tcChunkDef::SetNibble(a_BlockNibbles, x, y, z, 0);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cZapper::ZapRegionEntitiesInNBT(const cRegion & a_Region, cParsedNBT & a_NBT, int a_EntitiesTag)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cZapper::SerializeNBTTag(const cParsedNBT & a_NBT, int a_Tag, cFastNBTWriter & a_Writer)\n{\n\tswitch (a_NBT.GetType(a_Tag))\n\t{\n\t\tcase TAG_Byte:      a_Writer.AddByte     (a_NBT.GetName(a_Tag), a_NBT.GetByte  (a_Tag)); break;\n\t\tcase TAG_Short:     a_Writer.AddShort    (a_NBT.GetName(a_Tag), a_NBT.GetShort (a_Tag)); break;\n\t\tcase TAG_Int:       a_Writer.AddInt      (a_NBT.GetName(a_Tag), a_NBT.GetInt   (a_Tag)); break;\n\t\tcase TAG_Long:      a_Writer.AddLong     (a_NBT.GetName(a_Tag), a_NBT.GetLong  (a_Tag)); break;\n\t\tcase TAG_Float:     a_Writer.AddFloat    (a_NBT.GetName(a_Tag), a_NBT.GetFloat (a_Tag)); break;\n\t\tcase TAG_Double:    a_Writer.AddDouble   (a_NBT.GetName(a_Tag), a_NBT.GetDouble(a_Tag)); break;\n\t\tcase TAG_ByteArray: a_Writer.AddByteArray(a_NBT.GetName(a_Tag), a_NBT.GetData  (a_Tag), a_NBT.GetDataLength(a_Tag)); break;\n\t\tcase TAG_String:    a_Writer.AddString   (a_NBT.GetName(a_Tag), a_NBT.GetString(a_Tag)); break;\n\t\tcase TAG_IntArray:\n\t\t{\n\t\t\tstd::vector<int> Data;\n\t\t\tint NumInts = a_NBT.GetDataLength(a_Tag) / 4;\n\t\t\tData.reserve(NumInts);\n\t\t\tint * OrigData = (int *)(a_NBT.GetData(a_Tag));\n\t\t\tfor (int i = 0; i < NumInts; i++)\n\t\t\t{\n\t\t\t\tData.push_back(ntohl(OrigData[i]));\n\t\t\t}\n\t\t\ta_Writer.AddIntArray (a_NBT.GetName(a_Tag), &Data.front(), Data.size()); break;\n\t\t}\n\n\t\tcase TAG_List:\n\t\t{\n\t\t\ta_Writer.BeginList(a_NBT.GetName(a_Tag), a_NBT.GetChildrenType(a_Tag));\n\t\t\tfor (int ch = a_NBT.GetFirstChild(a_Tag); ch >= 0; ch = a_NBT.GetNextSibling(ch))\n\t\t\t{\n\t\t\t\tSerializeNBTTag(a_NBT, ch, a_Writer);\n\t\t\t}  // for ch - children[]\n\t\t\ta_Writer.EndList();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase TAG_Compound:\n\t\t{\n\t\t\ta_Writer.BeginCompound(a_NBT.GetName(a_Tag));\n\t\t\tfor (int ch = a_NBT.GetFirstChild(a_Tag); ch >= 0; ch = a_NBT.GetNextSibling(ch))\n\t\t\t{\n\t\t\t\tSerializeNBTTag(a_NBT, ch, a_Writer);\n\t\t\t}  // for ch - children[]\n\t\t\ta_Writer.EndCompound();\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unknown NBT tag\");\n\t\t\tbreak;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Tools/BlockZapper/Zapper.h",
    "content": "\n// Zapper.h\n\n// Declares the cZapper class representing the processor that actually zaps blocks and entities\n\n\n\n\n\n#pragma once\n\n#include \"Regions.h\"\n\n\n\n\n\n// fwd: ParsedNBT.h\nclass cParsedNBT;\nclass cFastNBTWriter;\n\n\n\n\n\nclass cZapper\n{\npublic:\n\tcZapper(const AString & a_MCAFolder);\n\n\t/** Zaps all the specified regions */\n\tvoid ZapRegions(const cRegionVector & a_Regions);\n\nprotected:\n\tstatic const int BlocksPerChunkX = 16;\n\tstatic const int BlocksPerChunkZ = 16;\n\tstatic const int ChunksPerMCAX = 32;\n\tstatic const int ChunksPerMCAZ = 32;\n\n\tAString m_MCAFolder;\n\n\t/** Converts from block coords to MCA coords */\n\tvoid BlockToMCA(int a_BlockX, int a_BlockZ, int & a_MCAX, int & a_MCAZ);\n\n\t/** Converts from block coords to chunk coords */\n\tvoid BlockToChunk(int a_BlockX, int a_BlockZ, int & a_ChunkX, int & a_ChunkZ);\n\n\t/** Zaps the specified region in the MCA file with the specified MCA coords */\n\tvoid ZapRegionInMCAFile(const cRegion & a_Region, int a_MCAX, int a_MCAZ);\n\n\t/** Loads raw compressed chunk data from the specified file\n\t* chunk is specified by ChunkHeaderValue, which is the int describing the chunk in file header.\n\t*/\n\tvoid LoadChunkData(cFile & a_InFile, int a_ChunkHeaderValue, AString & a_ChunkData, int a_ChunkX, int a_ChunkZ);\n\n\t/** Zaps the specified region in the raw (compressed) chunk data. */\n\tvoid ZapRegionInRawChunkData(const cRegion & a_Region, AString & a_ChunkData, int a_ChunkX, int a_ChunkZ);\n\n\t/** Zaps the specified region in the specified NBT structure */\n\tvoid ZapRegionInNBTChunk(const cRegion & a_Region, cParsedNBT & a_NBT, int a_ChunkX, int a_ChunkZ);\n\n\t/** Zaps the blocks in the specified region from the specified NBT */\n\tvoid ZapRegionBlocksInNBT(const cRegion & a_Region, cParsedNBT & a_NBT, int a_SectionsTag);\n\n\t/** Zaps the blocks in the specified bytes (types) from one vertical section (16^3 blocks) of a chunk. */\n\tvoid ZapRegionInNBTSectionBytes(const cRegion & a_Region, int a_SectionY, unsigned char * a_BlockBytes);\n\n\t/** Zaps the blocks in the specified nibbles (meta, add) from one vertical section (16^3 blocks) of a chunk. */\n\tvoid ZapRegionInNBTSectionNibbles(const cRegion & a_Region, int a_SectionY, unsigned char * a_BlockNibbles);\n\n\t/** Zaps entities in the specified region from the specified NBT */\n\tvoid ZapRegionEntitiesInNBT(const cRegion & a_Region, cParsedNBT & a_NBT, int a_EntitiesTag);\n\n\t/** Serializes the NBT subtree into a writer */\n\tvoid SerializeNBTTag(const cParsedNBT & a_NBT, int a_Tag, cFastNBTWriter & a_Writer);\n} ;\n"
  },
  {
    "path": "Tools/GeneratorPerformanceTest/CMakeLists.txt",
    "content": "project(GeneratorPerformanceTest)\n\ninclude_directories(../../src/Generating)\ninclude_directories(../../src)\ninclude_directories(../../lib)\n\nadd_executable(GeneratorPerformanceTest GeneratorPerformanceTest.cpp ../../src/StringUtils ../../src/MCLogger ../../src/Log ../../src/BlockID ../../src/Noise ../../src/Enchantments ../../src/BlockArea)\n\ntarget_link_libraries(GeneratorPerformanceTest Generating)\n\n"
  },
  {
    "path": "Tools/GeneratorPerformanceTest/GeneratorPerformanceTest.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"ChunkGenerator.h\"\n\nint main(int argc, char * argv[])\n{\n\tcChunkGenerator Generator = cChunkGenerator();\n}\n"
  },
  {
    "path": "Tools/GrownBiomeGenVisualiser/.gitignore",
    "content": "# Ignore the output images:\n*.ppm\n"
  },
  {
    "path": "Tools/GrownBiomeGenVisualiser/CMakeLists.txt",
    "content": "project (GrownBiomeGenVisualiser)\nfind_package(Threads REQUIRED)\n\n# Set include paths to the used libraries:\ninclude_directories(SYSTEM \"../../lib\")\ninclude_directories(\"../../src\")\n\n\nfunction(flatten_files arg1)\n\tset(res \"\")\n\tforeach(f ${${arg1}})\n\t\tget_filename_component(f ${f} ABSOLUTE)\n\t\tlist(APPEND res ${f})\n\tendforeach()\n\tset(${arg1} \"${res}\" PARENT_SCOPE)\nendfunction()\n\n\n# Include the shared files:\nset(SHARED_SRC\n\t../../src/StringUtils.cpp\n\t../../src/Logger.cpp\n\t../../src/Noise/Noise.cpp\n\t../../src/BiomeDef.cpp\n)\nset(SHARED_HDR\n\t../../src/StringUtils.h\n)\n\nflatten_files(SHARED_SRC)\nflatten_files(SHARED_HDR)\nsource_group(\"Shared\" FILES ${SHARED_SRC} ${SHARED_HDR})\n\nset(SHARED_OSS_SRC\n\t../../src/OSSupport/CriticalSection.cpp\n\t../../src/OSSupport/Event.cpp\n\t../../src/OSSupport/File.cpp\n\t../../src/OSSupport/IsThread.cpp\n\t../../src/OSSupport/StackTrace.cpp\n\t../../src/OSSupport/WinStackWalker.cpp\n)\n\nset(SHARED_OSS_HDR\n\t../../src/OSSupport/CriticalSection.h\n\t../../src/OSSupport/Event.h\n\t../../src/OSSupport/File.h\n\t../../src/OSSupport/IsThread.h\n\t../../src/OSSupport/StackTrace.h\n\t../../src/OSSupport/WinStackWalker.h\n)\n\n\nflatten_files(SHARED_OSS_SRC)\nflatten_files(SHARED_OSS_HDR)\n\nsource_group(\"Shared\\\\OSSupport\" FILES ${SHARED_OSS_SRC} ${SHARED_OSS_HDR})\n\n\n\n# Include the main source files:\nset(SOURCES\n\tGrownBiomeGenVisualiser.cpp\n\tGlobals.cpp\n)\nset(HEADERS\n\tGlobals.h\n)\n\nsource_group(\"\" FILES ${SOURCES} ${HEADERS})\n\nadd_executable(GrownBiomeGenVisualiser\n\t${SOURCES}\n\t${HEADERS}\n\t${SHARED_SRC}\n\t${SHARED_HDR}\n\t${SHARED_OSS_SRC}\n\t${SHARED_OSS_HDR}\n)\n\ntarget_link_libraries(GrownBiomeGenVisualiser fmt::fmt Threads::Threads)\nset_target_properties(GrownBiomeGenVisualiser PROPERTIES FOLDER Tools)\nif (WIN32)\n\ttarget_link_libraries(GrownBiomeGenVisualiser ws2_32)\nendif()\n\ninclude(../../SetFlags.cmake)\nset_exe_flags(GrownBiomeGenVisualiser)\n"
  },
  {
    "path": "Tools/GrownBiomeGenVisualiser/Globals.cpp",
    "content": "\n// Globals.cpp\n\n// This file is used for precompiled header generation in MSVC environments\n\n#include \"Globals.h\"\n\n\n\n\n"
  },
  {
    "path": "Tools/GrownBiomeGenVisualiser/Globals.h",
    "content": "\n// Globals.h\n\n// This file gets included from every module in the project, so that global symbols may be introduced easily\n// Also used for precompiled header generation in MSVC environments\n\n\n\n\n\n// Compiler-dependent stuff:\n#if defined(_MSC_VER)\n\t// MSVC produces warning C4481 on the override keyword usage, so disable the warning altogether\n\t#pragma warning(disable:4481)\n\n\t// Disable some warnings that we don't care about:\n\t#pragma warning(disable:4100)\n\n#elif defined(__GNUC__)\n\n\t// TODO: Can GCC explicitly mark classes as abstract (no instances can be created)?\n\t#define abstract\n\n#else\n\n\t#error \"You are using an unsupported compiler, you might need to #define some stuff here for your compiler\"\n\n#endif\n\n\n\n\n\n#ifndef TOLUA_TEMPLATE_BIND\n\t#define TOLUA_TEMPLATE_BIND(x)\n#endif\n\n\n\n\n\n// Integral types with predefined sizes:\ntypedef long long Int64;\ntypedef int       Int32;\ntypedef short     Int16;\n\ntypedef unsigned long long UInt64;\ntypedef unsigned int       UInt32;\ntypedef unsigned short     UInt16;\n\ntypedef unsigned char Byte;\n\n\n\n\n\n// A macro to disallow the copy constructor and operator= functions\n// This should be used in the private: declarations for any class that shouldn't allow copying itself\n#define DISALLOW_COPY_AND_ASSIGN(TypeName) \\\n\tTypeName(const TypeName &); \\\n\tvoid operator=(const TypeName &)\n\n// A macro that is used to mark unused function parameters, to avoid pedantic warnings in gcc\n#define UNUSED(X) (void)(X)\n\n\n\n\n// OS-dependent stuff:\n#ifdef _WIN32\n\t#define WIN32_LEAN_AND_MEAN\n\t#include <Windows.h>\n\t#include <winsock2.h>\n\t#include <ws2tcpip.h>\n\n\t// Windows SDK defines min and max macros, messing up with our std::min and std::max usage\n\t#undef min\n\t#undef max\n\n\t// Windows SDK defines GetFreeSpace as a constant, probably a Win16 API remnant\n\t#ifdef GetFreeSpace\n\t\t#undef GetFreeSpace\n\t#endif  // GetFreeSpace\n\n\t#define SocketError WSAGetLastError()\n#else\n\t#include <sys/types.h>\n\t#include <sys/stat.h>   // for mkdir\n\t#include <sys/time.h>\n\t#include <sys/socket.h>\n\t#include <netinet/in.h>\n\t#include <arpa/inet.h>\n\t#include <netdb.h>\n\t#include <dirent.h>\n\t#include <iostream>\n\t#include <unistd.h>\n\n\t#include <cstring>\n\t#include <pthread.h>\n\t#include <semaphore.h>\n\t#include <cerrno>\n\t#include <fcntl.h>\n\n\ttypedef int SOCKET;\n\tenum\n\t{\n\t\tINVALID_SOCKET = -1,\n\t};\n\t#define closesocket close\n\t#define SocketError errno\n#endif\n\n\n\n\n\n// CRT stuff:\n#include <cassert>\n#include <cstdio>\n#include <cmath>\n#include <cstdarg>\n#include <ctime>\n#include <cstddef>\n\n\n\n\n\n// STL stuff:\n#include <vector>\n#include <list>\n#include <deque>\n#include <string>\n#include <map>\n#include <algorithm>\n#include <memory>\n#include <atomic>\n#include <mutex>\n#include <thread>\n#include <condition_variable>\n\n\n\n\n// Common headers (without macros):\n#include \"fmt.h\"\n#include \"StringUtils.h\"\n\n\n\n\n\n// Common definitions:\n\n/** Evaluates to the number of elements in an array (compile-time!) */\n#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))\n\n/** Allows arithmetic expressions like \"32 KiB\" (but consider using parenthesis around it, \"(32 KiB)\") */\n#define KiB * 1024\n#define MiB * 1024 * 1024\n\n/** Faster than (int)floorf((float)x / (float)div) */\n#define FAST_FLOOR_DIV(x, div) ((x) < 0 ? (((int)x / div) - 1) : ((int)x / div))\n\n/** Own version of assert() that writes failed assertions to the log for review */\n#ifdef  NDEBUG\n\t#define ASSERT(x) ((void)0)\n#else\n\t#define ASSERT assert\n#endif\n\n// Pretty much the same as ASSERT() but stays in Release builds\n#define VERIFY(x) (!!(x) || (LOGERROR(\"Verification failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), exit(1), 0))\n\n\n\n\n\n/** Clamp X to the specified range. */\ntemplate <typename T>\nT Clamp(T a_Value, T a_Min, T a_Max)\n{\n\treturn (a_Value < a_Min) ? a_Min : ((a_Value > a_Max) ? a_Max : a_Value);\n}\n\ntemplate <typename T>\nauto ToUnsigned(T a_Val)\n{\n\tASSERT(a_Val >= 0);\n\treturn static_cast<std::make_unsigned_t<T>>(a_Val);\n}\n\n"
  },
  {
    "path": "Tools/GrownBiomeGenVisualiser/GrownBiomeGenVisualiser.cpp",
    "content": "\n// GrownBiomeGenVisualiser.cpp\n\n// Implements the main app entrypoint\n\n#include \"Globals.h\"\n#include <iostream>\n#include <fstream>\n#include <random>\n#define PROT_INT_BUFFER_SIZE (130 * 130)\n#include \"Generating/ProtIntGen.h\"\n\n#include \"fmt/printf.h\"\n\n\n\n\ntypedef int Color[3];  // Color is an array of 3 ints\n\n\n\n\n// Forward declarations, needed for GCC and Clang:\nvoid outputBitmapFile(\n\tconst AString & a_FileName,\n\tunsigned a_ImageSizeX, unsigned a_ImageSizeY,\n\tconst int * a_ColorIndices,\n\tunsigned a_IndicesSizeX, unsigned a_IndicesSizeY,\n\tconst Color * a_Colors,\n\tsize_t a_NumColors\n);\nvoid initializeBiomeColors(void);\nvoid generateZoomLevels(int a_Seed);\nvoid generateSmoothLevels(int a_Seed);\nvoid generateExamples(int a_Seed);\n\n\n\n\n\n/** Color palette used for algorithm examples.\nNo relevance to biomes whatsoever. */\nstatic const Color spectrumColors[] =\n{\n\t{0, 0, 0},\n\t{255, 0, 0},\n\t{0, 255, 0},\n\t{0, 0, 255},\n\t{255, 255, 0},\n\t{255, 0, 255},\n\t{0, 255, 255},\n};\n\n\n\n\n\n/** Color palette used for displaying biome groups. */\nstatic const Color biomeGroupColors[] =\n{\n\t/* bgOcean     */  {0x00, 0x00, 0x70},\n\t/* bgDesert    */  {0xfa, 0x94, 0x18},\n\t/* bgTemperate */  {0x05, 0x66, 0x21},\n\t/* bgMountains */  {0x60, 0x60, 0x60},\n\t/* bgIce       */  {0xa0, 0xa0, 0xff},\n};\n\n\n\n\n\n/** Color palette used for outputting biome images.\nInitialized from biomeColorMap[] in initializeBiomeColors(). */\nstatic Color biomeColors[255];\n\n\n\n\n/** Map of biome -> color, used to initialize biomeColorMap[]. */\nstatic const struct\n{\n\tEMCSBiome biome;\n\tColor color;\n} biomeColorMap[] =\n{\n\t{ biOcean,                { 0x00, 0x00, 0x70 }, },\n\t{ biPlains,               { 0x8d, 0xb3, 0x60 }, },\n\t{ biDesert,               { 0xfa, 0x94, 0x18 }, },\n\t{ biExtremeHills,         { 0x60, 0x60, 0x60 }, },\n\t{ biForest,               { 0x05, 0x66, 0x21 }, },\n\t{ biTaiga,                { 0x0b, 0x66, 0x59 }, },\n\t{ biSwampland,            { 0x2f, 0xff, 0xda }, },\n\t{ biRiver,                { 0x30, 0x30, 0xaf }, },\n\t{ biHell,                 { 0x7f, 0x00, 0x00 }, },\n\t{ biSky,                  { 0x00, 0x7f, 0xff }, },\n\t{ biFrozenOcean,          { 0xa0, 0xa0, 0xdf }, },\n\t{ biFrozenRiver,          { 0xa0, 0xa0, 0xff }, },\n\t{ biIcePlains,            { 0xff, 0xff, 0xff }, },\n\t{ biIceMountains,         { 0xa0, 0xa0, 0xa0 }, },\n\t{ biMushroomIsland,       { 0xff, 0x00, 0xff }, },\n\t{ biMushroomShore,        { 0xa0, 0x00, 0xff }, },\n\t{ biBeach,                { 0xfa, 0xde, 0x55 }, },\n\t{ biDesertHills,          { 0xd2, 0x5f, 0x12 }, },\n\t{ biForestHills,          { 0x22, 0x55, 0x1c }, },\n\t{ biTaigaHills,           { 0x16, 0x39, 0x33 }, },\n\t{ biExtremeHillsEdge,     { 0x7f, 0x8f, 0x7f }, },\n\t{ biJungle,               { 0x53, 0x7b, 0x09 }, },\n\t{ biJungleHills,          { 0x2c, 0x42, 0x05 }, },\n\n\t{ biJungleEdge,           { 0x62, 0x8b, 0x17 }, },\n\t{ biDeepOcean,            { 0x00, 0x00, 0x30 }, },\n\t{ biStoneBeach,           { 0xa2, 0xa2, 0x84 }, },\n\t{ biColdBeach,            { 0xfa, 0xf0, 0xc0 }, },\n\t{ biBirchForest,          { 0x30, 0x74, 0x44 }, },\n\t{ biBirchForestHills,     { 0x1f, 0x5f, 0x32 }, },\n\t{ biRoofedForest,         { 0x40, 0x51, 0x1a }, },\n\t{ biColdTaiga,            { 0x31, 0x55, 0x4a }, },\n\t{ biColdTaigaHills,       { 0x59, 0x7d, 0x72 }, },\n\t{ biMegaTaiga,            { 0x59, 0x66, 0x51 }, },\n\t{ biMegaTaigaHills,       { 0x59, 0x66, 0x59 }, },\n\t{ biExtremeHillsPlus,     { 0x50, 0x70, 0x50 }, },\n\t{ biSavanna,              { 0xbd, 0xb2, 0x5f }, },\n\t{ biSavannaPlateau,       { 0xa7, 0x9d, 0x64 }, },\n\t{ biMesa,                 { 0xd9, 0x45, 0x15 }, },\n\t{ biMesaPlateauF,         { 0xb0, 0x97, 0x65 }, },\n\t{ biMesaPlateau,          { 0xca, 0x8c, 0x65 }, },\n\n\t// M variants:\n\t{ biSunflowerPlains,      { 0xb5, 0xdb, 0x88 }, },\n\t{ biDesertM,              { 0xff, 0xbc, 0x40 }, },\n\t{ biExtremeHillsM,        { 0x88, 0x88, 0x88 }, },\n\t{ biFlowerForest,         { 0x2d, 0x8e, 0x49 }, },\n\t{ biTaigaM,               { 0x33, 0x8e, 0x81 }, },\n\t{ biSwamplandM,           { 0x07, 0xf9, 0xb2 }, },\n\t{ biIcePlainsSpikes,      { 0xb4, 0xdc, 0xdc }, },\n\t{ biJungleM,              { 0x7b, 0xa3, 0x31 }, },\n\t{ biJungleEdgeM,          { 0x62, 0x8b, 0x17 }, },\n\t{ biBirchForestM,         { 0x58, 0x9c, 0x6c }, },\n\t{ biBirchForestHillsM,    { 0x47, 0x87, 0x5a }, },\n\t{ biRoofedForestM,        { 0x68, 0x79, 0x42 }, },\n\t{ biColdTaigaM,           { 0x24, 0x3f, 0x36 }, },\n\t{ biMegaSpruceTaiga,      { 0x45, 0x4f, 0x3e }, },\n\t{ biMegaSpruceTaigaHills, { 0x45, 0x4f, 0x4e }, },\n\t{ biExtremeHillsPlusM,    { 0x78, 0x98, 0x78 }, },\n\t{ biSavannaM,             { 0xe5, 0xda, 0x87 }, },\n\t{ biSavannaPlateauM,      { 0xa7, 0x9d, 0x74 }, },\n\t{ biMesaBryce,            { 0xff, 0x6d, 0x3d }, },\n\t{ biMesaPlateauFM,        { 0xd8, 0xbf, 0x8d }, },\n\t{ biMesaPlateauM,         { 0xf2, 0xb4, 0x8d }, },\n};\n\n\n\n\n\ntemplate <typename ... Args>\nvoid log(const char * a_Fmt, const Args & ... a_Args)\n{\n\tfmt::printf(a_Fmt, a_Args...);\n\tputchar('\\n');\n\tfflush(stdout);\n}\n\n\n\n\n\nvoid outputBitmapFile(\n\tconst AString & a_FileName,\n\tunsigned a_ImageSizeX, unsigned a_ImageSizeY,\n\tconst int * a_ColorIndices,\n\tunsigned a_IndicesSizeX, unsigned a_IndicesSizeY,\n\tconst Color * a_Colors,\n\tsize_t a_NumColors\n)\n{\n\tstd::ofstream f(a_FileName, std::ios::out | std::ios::binary);\n\tif (!f.good())\n\t{\n\t\tlog(\"Cannot open file %s for writing. Skipping.\", a_FileName.c_str());\n\t\treturn;\n\t}\n\tf << \"P3\\r\\n\" << a_ImageSizeX << \" \" << a_ImageSizeY << \"\\r\\n255\\r\\n\";\n\tunsigned oldIndY = 0;\n\tfor (unsigned y = 0; y < a_ImageSizeY; y++)\n\t{\n\t\tunsigned indY = y * a_IndicesSizeY / a_ImageSizeY;\n\t\tif (oldIndY != indY)\n\t\t{\n\t\t\t// Output a horizontal divider line:\n\t\t\tfor (unsigned x = 0; x < a_ImageSizeX; x++)\n\t\t\t{\n\t\t\t\tf << \"128 128 128  \";\n\t\t\t}\n\t\t\tf << \"\\r\\n\";\n\t\t\toldIndY = indY;\n\t\t\tcontinue;\n\t\t}\n\t\tunsigned oldIndX = 0;\n\t\tfor (unsigned x = 0; x < a_ImageSizeX; x++)\n\t\t{\n\t\t\tunsigned indX = x * a_IndicesSizeX / a_ImageSizeX;\n\t\t\tif (indX == oldIndX)\n\t\t\t{\n\t\t\t\tauto & color = a_Colors[a_ColorIndices[indX + a_IndicesSizeX * indY]];\n\t\t\t\tf << color[0] << \" \" << color[1] << \" \" << color[2] << \"  \";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// vertical divider line:\n\t\t\t\tf << \"128 128 128  \";\n\t\t\t}\n\t\t\toldIndX = indX;\n\t\t}\n\t\tf << \"\\r\\n\";\n\t}\n}\n\n\n\n\n\n/** Initializes biomeColors[] using the biomeColorMap[]. */\nvoid initializeBiomeColors(void)\n{\n\t// Initialize all colors to red, so that anything unassigned is visible:\n\tfor (size_t i = 0; i < ARRAYCOUNT(biomeColors); i++)\n\t{\n\t\tauto & color = biomeColors[i];\n\t\tcolor[0] = 0;\n\t\tcolor[1] = 0xff;\n\t\tcolor[2] = 0;\n\t}\n\n\t// Initialize per-biome:\n\tfor (size_t i = 0; i < ARRAYCOUNT(biomeColorMap); i++)\n\t{\n\t\tauto & dst = biomeColors[biomeColorMap[i].biome];\n\t\tconst auto & src = biomeColorMap[i].color;\n\t\tdst[0] = src[0];\n\t\tdst[1] = src[1];\n\t\tdst[2] = src[2];\n\t}\n}\n\n\n\n\n\n/** Generates a series of images showing the \"zoom\" effect of the IntGen zoom operation.\nEach image is the same size, the integer arrays are scaled to fit the image. */\nvoid generateZoomLevels(int a_Seed)\n{\n\tlog(\"Generating zoom levels...\");\n\tconst unsigned NumImages = 7;  ///< Number of images to generate. The more images, the larger they will be\n\tconst unsigned maxArrSize = (1 << NumImages) + 1;\n\tfor (unsigned i = 1; i <= NumImages; i++)\n\t{\n\t\tunsigned arrSize = (1 << i) + 1;  // Dimensions of the actually generated array\n\t\tASSERT(arrSize <= maxArrSize);\n\t\tint workspace[maxArrSize * maxArrSize];  // Workspace for the generated array\n\n\t\t// Chain the zoom operation as many times as the image number:\n\t\tstd::shared_ptr<cProtIntGen> gen = std::make_shared<cProtIntGenChoice>(a_Seed, static_cast<int>(ARRAYCOUNT(spectrumColors) + 1));\n\t\tfor (unsigned j = 1; j < i; j++)\n\t\t{\n\t\t\tgen = std::make_shared<cProtIntGenZoom>(a_Seed + static_cast<int>(j), gen);\n\t\t}\n\t\tgen->GetInts(0, 0, arrSize, arrSize, workspace);\n\n\t\t// Output to a bitmap file:\n\t\tAString fnam = fmt::format(FMT_STRING(\"zoomedgrown_{}.pbm\"), i);\n\t\toutputBitmapFile(fnam, 257, 257, workspace, arrSize, arrSize, spectrumColors, ARRAYCOUNT(spectrumColors));\n\t\tlog(\"  zoom level %u complete\", i);\n\t}  // for i - Image\n}\n\n\n\n\n\nvoid generateSmoothLevels(int a_Seed)\n{\n\tlog(\"Generating smooth levels...\");\n\tconst unsigned NumImages = 7;  ///< Number of images to generate. The more images, the larger they will be\n\tconst unsigned maxArrSize = 65;  ///< Size of the underlying generated array\n\n\t// Initialize the underlying generator:\n\tstd::shared_ptr<cProtIntGen> underlyingGen = std::make_shared<cProtIntGenChoice>(a_Seed, static_cast<int>(ARRAYCOUNT(spectrumColors) + 1));\n\tfor (int j = 1; j < 4; j++)\n\t{\n\t\tunderlyingGen = std::make_shared<cProtIntGenZoom>(a_Seed + j, underlyingGen);\n\t}\n\n\t// Generate smooth levels:\n\tfor (unsigned i = 1; i <= NumImages; i++)\n\t{\n\t\tunsigned arrSize = maxArrSize - 2 * i;  // Dimensions of the actually generated array\n\t\tint workspace[maxArrSize * maxArrSize];  // Workspace for the generated array\n\n\t\t// Chain the zoom operation as many times as the image number:\n\t\tstd::shared_ptr<cProtIntGen> gen = underlyingGen;\n\t\tfor (unsigned j = 1; j < i; j++)\n\t\t{\n\t\t\tgen = std::make_shared<cProtIntGenSmooth>(a_Seed, gen);\n\t\t}\n\t\tgen->GetInts(static_cast<int>(i), static_cast<int>(i), arrSize, arrSize, workspace);\n\n\t\t// Output to a bitmap file:\n\t\tAString fnam = fmt::format(FMT_STRING(\"smoothedgrown_{}.ppm\"), i);\n\t\toutputBitmapFile(fnam, 257, 257, workspace, arrSize, arrSize, spectrumColors, ARRAYCOUNT(spectrumColors));\n\t\tlog(\"  smooth level %u complete\", i);\n\t}  // for i - Image\n}\n\n\n\n\n\nvoid generateExamples(int a_Seed)\n{\n\tlog(\"Generating examples\");\n\n\tconst int maxArrSize = 65;\n\tconst int inArrSize = 24;\n\tconst int imgSize = 256;\n\n\t// Create the inputs:\n\tauto in1 =\n\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 1,\n\t\tstd::make_shared<cProtIntGenAddIslands     >(a_Seed + 2000, 200,\n\t\tstd::make_shared<cProtIntGenSetRandomly    >(a_Seed + 9, 300, bgOcean,\n\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 2,\n\t\tstd::make_shared<cProtIntGenLandOcean      >(a_Seed + 1, 30\n\t)))));\n\tauto in2 =\n\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 1,\n\t\tstd::make_shared<cProtIntGenBiomeGroupEdges>(in1\n\t));\n\tauto in3 =\n\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 1,\n\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 2,\n\t\tstd::make_shared<cProtIntGenBiomes         >(a_Seed + 3000, in2\n\t)));\n\tauto inAlt =\n\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed,\n\t\tstd::make_shared<cProtIntGenLandOcean      >(a_Seed, 30\n\t));\n\tauto inRiver = std::make_shared<cProtIntGenRiver>(a_Seed, in2);\n\tint workspace[maxArrSize * maxArrSize];\n\tin1->GetInts(0, 0, inArrSize, inArrSize, workspace);\n\toutputBitmapFile(\"grownexample_in1.ppm\", imgSize, imgSize, workspace, inArrSize, inArrSize, biomeGroupColors, ARRAYCOUNT(biomeGroupColors));\n\tlog(\"  Created example input 1\");\n\tin2->GetInts(0, 0, inArrSize, inArrSize, workspace);\n\toutputBitmapFile(\"grownexample_in2.ppm\", imgSize, imgSize, workspace, inArrSize, inArrSize, biomeGroupColors, ARRAYCOUNT(biomeGroupColors));\n\tlog(\"  Created example input 2\");\n\tin3->GetInts(0, 0, inArrSize, inArrSize, workspace);\n\toutputBitmapFile(\"grownexample_in3.ppm\", imgSize, imgSize, workspace, inArrSize, inArrSize, biomeColors, ARRAYCOUNT(biomeColors));\n\tlog(\"  Created example input 3\");\n\tinAlt->GetInts(0, 0, inArrSize, inArrSize, workspace);\n\toutputBitmapFile(\"grownexample_in_alt.ppm\", imgSize, imgSize, workspace, inArrSize, inArrSize, biomeGroupColors, ARRAYCOUNT(biomeGroupColors));\n\tlog(\"  Created example input alt\");\n\tinRiver->GetInts(0, 0, inArrSize, inArrSize, workspace);\n\toutputBitmapFile(\"grownexample_in_river.ppm\", imgSize, imgSize, workspace, inArrSize, inArrSize, biomeColors, ARRAYCOUNT(biomeColors));\n\tlog(\"  Created example input river\");\n\n\t// Shortcuts for colormaps used for the outputs:\n\tstruct ColorMap\n\t{\n\t\tconst Color * colors;\n\t\tsize_t count;\n\t};\n\tstatic const ColorMap cmGroups = { biomeGroupColors, ARRAYCOUNT(biomeGroupColors) };\n\tstatic const ColorMap cmBiomes = { biomeColors,      ARRAYCOUNT(biomeColors) };\n\n\t// Create the result generators:\n\tstruct\n\t{\n\t\tconst char * name;\n\t\tunsigned size;\n\t\tint offset;\n\t\tconst ColorMap & colormap;\n\t\tstd::shared_ptr<cProtIntGen> gen;\n\t}\n\tgens[] =\n\t{\n\t\t{\"add_islands\", inArrSize,         0, cmGroups, std::make_shared<cProtIntGenAddIslands>     (a_Seed, 400, in1)},\n\t\t{\"alt_biomes\",  inArrSize,         0, cmBiomes, std::make_shared<cProtIntGenAlternateBiomes>(a_Seed, inAlt, in3)},\n\t\t{\"beaches\",     inArrSize - 2,     1, cmBiomes, std::make_shared<cProtIntGenBeaches>        (in3)},\n\t\t{\"biome_edges\", inArrSize - 2,     1, cmBiomes, std::make_shared<cProtIntGenBiomeEdges>     (a_Seed, in3)},\n\t\t{\"biomes\",      inArrSize,         0, cmBiomes, std::make_shared<cProtIntGenBiomes>         (a_Seed, in2)},\n\t\t{\"grp_edges\",   inArrSize - 2,     0, cmGroups, std::make_shared<cProtIntGenBiomeGroupEdges>(in1)},\n\t\t{\"m_biomes\",    inArrSize,         0, cmBiomes, std::make_shared<cProtIntGenMBiomes>        (a_Seed, inAlt, in3)},\n\t\t{\"mix_river\",   inArrSize,         0, cmBiomes, std::make_shared<cProtIntGenMixRivers>      (in3, inRiver)},\n\t\t{\"river\",       inArrSize - 2,     1, cmBiomes, inRiver},\n\t\t{\"set_rnd\",     inArrSize,         0, cmBiomes, std::make_shared<cProtIntGenSetRandomly>    (a_Seed, 500, bgOcean, in3)},\n\t\t{\"smooth\",      inArrSize - 2,     1, cmBiomes, std::make_shared<cProtIntGenSmooth>         (a_Seed, in3)},\n\t\t{\"zoom\",        inArrSize * 2 - 1, 0, cmBiomes, std::make_shared<cProtIntGenZoom>           (a_Seed, in3)},\n\t};\n\n\t// Create the outputs:\n\tfor (const auto & gen: gens)\n\t{\n\t\tgen.gen->GetInts(gen.offset, gen.offset, gen.size, gen.size, workspace);\n\t\tAString fnam = fmt::format(FMT_STRING(\"grownexample_{}.ppm\"), gen.name);\n\t\toutputBitmapFile(fnam, 256, 256, workspace, gen.size, gen.size, gen.colormap.colors, gen.colormap.count);\n\t\tlog(\"  Created example \\\"%s\\\"\", gen.name);\n\t}  // for gen - gens[]\n\n\tlog(\"Examples generated\");\n}\n\n\n\n\n\nint main(int argc, char ** argv)\n{\n\tlog(\"GrownBiomeGenVisualiser starting\");\n\n\t// Parse the seed from the command line, if present:\n\tint seed;\n\tif (argc > 1)\n\t{\n\t\tif (!StringToInteger(argv[1], seed))\n\t\t{\n\t\t\tlog(\"Cannot parse seed from \\\"%s\\\", bailing out.\", argv[1]);\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Get a random seed:\n\t\tstd::random_device rd;\n\t\tseed = static_cast<int>(rd());\n\t}\n\n\tlog(\"Seed = %d\", seed);\n\n\tinitializeBiomeColors();\n\n\tgenerateZoomLevels(seed);\n\tgenerateSmoothLevels(seed);\n\tgenerateExamples(seed);\n\n\tlog(\"GrownBiomeGenVisualiser finished\");\n\treturn 0;\n}\n"
  },
  {
    "path": "Tools/GrownBiomeGenVisualiser/README.md",
    "content": "GrownBiomeGenVisualiser\n----\n\nThis project aims to provide the visualisation of \"Grown\" biome generator used in Cuberite. It uses the generator to generate several bitmaps showcasing the generator; these images are then used in the generator documentation ($/docs/Generator.html)\n"
  },
  {
    "path": "Tools/MCADefrag/.gitignore",
    "content": "*.mca\n"
  },
  {
    "path": "Tools/MCADefrag/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.13)\nproject (MCADefrag)\nfind_package(Threads REQUIRED)\n\n# Set include paths to the used libraries:\ninclude_directories(SYSTEM \"../../lib\")\ninclude_directories(\"../../src\")\n\n\nfunction(flatten_files arg1)\n\tset(res \"\")\n\tforeach(f ${${arg1}})\n\t\tget_filename_component(f ${f} ABSOLUTE)\n\t\tlist(APPEND res ${f})\n\tendforeach()\n\tset(${arg1} \"${res}\" PARENT_SCOPE)\nendfunction()\n\n\n# Include the shared files:\nset(SHARED_SRC\n\t../../src/StringCompression.cpp\n\t../../src/StringUtils.cpp\n\t../../src/LoggerListeners.cpp\n\t../../src/Logger.cpp\n)\nset(SHARED_HDR\n\t../../src/ByteBuffer.h\n\t../../src/StringUtils.h\n)\n\nflatten_files(SHARED_SRC)\nflatten_files(SHARED_HDR)\nsource_group(\"Shared\" FILES ${SHARED_SRC} ${SHARED_HDR})\n\nset(SHARED_OSS_SRC\n\t../../src/OSSupport/CriticalSection.cpp\n\t../../src/OSSupport/Event.cpp\n\t../../src/OSSupport/File.cpp\n\t../../src/OSSupport/IsThread.cpp\n\t../../src/OSSupport/StackTrace.cpp\n\t../../src/OSSupport/WinStackWalker.cpp\n)\n\nset(SHARED_OSS_HDR\n\t../../src/OSSupport/CriticalSection.h\n\t../../src/OSSupport/Event.h\n\t../../src/OSSupport/File.h\n\t../../src/OSSupport/IsThread.h\n\t../../src/OSSupport/StackTrace.h\n\t../../src/OSSupport/WinStackWalker.h\n)\n\n\nflatten_files(SHARED_OSS_SRC)\nflatten_files(SHARED_OSS_HDR)\n\nsource_group(\"Shared\\\\OSSupport\" FILES ${SHARED_OSS_SRC} ${SHARED_OSS_HDR})\n\n\n\n# Include the main source files:\nset(SOURCES\n\tMCADefrag.cpp\n)\nset(HEADERS\n\tMCADefrag.h\n)\n\nsource_group(\"\" FILES ${SOURCES} ${HEADERS})\n\nadd_executable(MCADefrag\n\t${SOURCES}\n\t${HEADERS}\n\t${SHARED_SRC}\n\t${SHARED_HDR}\n\t${SHARED_OSS_SRC}\n\t${SHARED_OSS_HDR}\n)\n\ntarget_link_libraries(MCADefrag fmt::fmt libdeflate Threads::Threads)\nif (WIN32)\n\ttarget_link_libraries(MCADefrag ws2_32)\nendif()\n\ninclude(../../SetFlags.cmake)\nset_exe_flags(MCADefrag)\n"
  },
  {
    "path": "Tools/MCADefrag/MCADefrag.cpp",
    "content": "\n// MCADefrag.cpp\n\n// Implements the main app entrypoint and the cMCADefrag class representing the entire app\n\n#include \"Globals.h\"\n#include \"MCADefrag.h\"\n#include \"Logger.h\"\n#include \"LoggerSimple.h\"\n#include \"LoggerListeners.h\"\n\n\n\n\n\n// An array of 4096 zero bytes, used for writing the padding\nstatic const Byte g_Zeroes[4096] = {0};\n\n\n\n\n\nint main(int argc, char ** argv)\n{\n\tauto consoleLogListener = MakeConsoleListener(false);\n\tauto consoleAttachment = cLogger::GetInstance().AttachListener(std::move(consoleLogListener));\n\tauto fileLogListenerRet = MakeFileListener();\n\tif (!fileLogListenerRet.first)\n\t{\n\t\tLOGERROR(\"Failed to open log file, aborting\");\n\t\treturn EXIT_FAILURE;\n\t}\n\tauto fileAttachment = cLogger::GetInstance().AttachListener(std::move(fileLogListenerRet.second));\n\n\tcLogger::InitiateMultithreading();\n\n\tcMCADefrag Defrag;\n\tif (!Defrag.Init(argc, argv))\n\t{\n\t\treturn EXIT_FAILURE;\n\t}\n\n\tDefrag.Run();\n\n\treturn 0;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMCADefrag:\n\ncMCADefrag::cMCADefrag(void) :\n\tm_NumThreads(4),\n\tm_ShouldRecompress(true)\n{\n}\n\n\n\n\n\nbool cMCADefrag::Init(int argc, char ** argv)\n{\n\t// Nothing needed yet\n\treturn true;\n}\n\n\n\n\n\nvoid cMCADefrag::Run(void)\n{\n\t// Fill the queue with MCA files\n\tm_Queue = cFile::GetFolderContents(\".\");\n\n\t// Start the processing threads:\n\tfor (int i = 0; i < m_NumThreads; i++)\n\t{\n\t\tStartThread();\n\t}\n\n\t// Wait for all the threads to finish:\n\twhile (!m_Threads.empty())\n\t{\n\t\tm_Threads.front()->Stop();\n\t\tdelete m_Threads.front();\n\t\tm_Threads.pop_front();\n\t}\n}\n\n\n\n\nvoid cMCADefrag::StartThread(void)\n{\n\tcThread * Thread = new cThread(*this);\n\tm_Threads.push_back(Thread);\n\tThread->Start();\n}\n\n\n\n\n\nAString cMCADefrag::GetNextFileName(void)\n{\n\tcCSLock Lock(m_CS);\n\tif (m_Queue.empty())\n\t{\n\t\treturn AString();\n\t}\n\tAString res = m_Queue.back();\n\tm_Queue.pop_back();\n\treturn res;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMCADefrag::cThread:\n\ncMCADefrag::cThread::cThread(cMCADefrag & a_Parent) :\n\tsuper(\"MCA Defragmentor\"),\n\tm_Parent(a_Parent),\n\tm_IsChunkUncompressed(false),\n\tm_Compressor(12)  // Set the highest compression factor\n{\n}\n\n\n\n\n\nvoid cMCADefrag::cThread::Execute(void)\n{\n\tfor (;;)\n\t{\n\t\tAString FileName = m_Parent.GetNextFileName();\n\t\tif (FileName.empty())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tProcessFile(FileName);\n\t}\n}\n\n\n\n\n\nvoid cMCADefrag::cThread::ProcessFile(const AString & a_FileName)\n{\n\t// Filter out non-MCA files:\n\tif ((a_FileName.length() < 4) || (a_FileName.substr(a_FileName.length() - 4, 4) != \".mca\"))\n\t{\n\t\treturn;\n\t}\n\tLOGINFO(\"%s\", a_FileName.c_str());\n\n\t// Open input and output files:\n\tAString OutFileName = a_FileName + \".new\";\n\tcFile In, Out;\n\tif (!In.Open(a_FileName, cFile::fmRead))\n\t{\n\t\tLOGWARNING(\"Cannot open file %s for reading, skipping file.\", a_FileName.c_str());\n\t\treturn;\n\t}\n\tif (!Out.Open(OutFileName.c_str(), cFile::fmWrite))\n\t{\n\t\tLOGWARNING(\"Cannot open file %s for writing, skipping file.\", OutFileName.c_str());\n\t\treturn;\n\t}\n\n\t// Read the Locations and Timestamps from the input file:\n\tByte Locations[4096];\n\tUInt32 Timestamps[1024];\n\tif (In.Read(Locations, sizeof(Locations)) != sizeof(Locations))\n\t{\n\t\tLOGWARNING(\"Cannot read Locations in file %s, skipping file.\", a_FileName.c_str());\n\t\treturn;\n\t}\n\tif (In.Read(Timestamps, sizeof(Timestamps)) != sizeof(Timestamps))\n\t{\n\t\tLOGWARNING(\"Cannot read Timestamps in file %s, skipping file.\", a_FileName.c_str());\n\t\treturn;\n\t}\n\n\t// Write dummy Locations to the Out file (will be overwritten once the correct ones are known)\n\tif (Out.Write(Locations, sizeof(Locations)) != sizeof(Locations))\n\t{\n\t\tLOGWARNING(\"Cannot write Locations to file %s, skipping file.\", OutFileName.c_str());\n\t\treturn;\n\t}\n\tm_CurrentSectorOut = 2;\n\n\t// Write a copy of the Timestamps into the Out file:\n\tif (Out.Write(Timestamps, sizeof(Timestamps)) != sizeof(Timestamps))\n\t{\n\t\tLOGWARNING(\"Cannot write Timestamps to file %s, skipping file.\", OutFileName.c_str());\n\t\treturn;\n\t}\n\n\t// Process each chunk:\n\tfor (size_t i = 0; i < 1024; i++)\n\t{\n\t\tsize_t idx = i * 4;\n\t\tif (\n\t\t\t(Locations[idx] == 0) &&\n\t\t\t(Locations[idx + 1] == 0) &&\n\t\t\t(Locations[idx + 2] == 0) &&\n\t\t\t(Locations[idx + 3] == 0)\n\t\t)\n\t\t{\n\t\t\t// Chunk not present\n\t\t\tcontinue;\n\t\t}\n\t\tm_IsChunkUncompressed = false;\n\t\tif (!ReadChunk(In, Locations + idx))\n\t\t{\n\t\t\tLOGWARNING(\"Cannot read chunk #%d from file %s. Skipping file.\", i, a_FileName.c_str());\n\t\t\treturn;\n\t\t}\n\t\tif (!WriteChunk(Out, Locations + idx))\n\t\t{\n\t\t\tLOGWARNING(\"Cannot write chunk #%d to file %s. Skipping file.\", i, OutFileName.c_str());\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Write the new Locations into the MCA header:\n\tOut.Seek(0);\n\tif (Out.Write(Locations, sizeof(Locations)) != sizeof(Locations))\n\t{\n\t\tLOGWARNING(\"Cannot write updated Locations to file %s, skipping file.\", OutFileName.c_str());\n\t\treturn;\n\t}\n\n\t// Close the files, delete orig, rename new:\n\tIn.Close();\n\tOut.Close();\n\tcFile::Delete(a_FileName);\n\tcFile::Rename(OutFileName, a_FileName);\n}\n\n\n\n\n\nbool cMCADefrag::cThread::ReadChunk(cFile & a_File, const Byte * a_LocationRaw)\n{\n\tint SectorNum = (a_LocationRaw[0] << 16) | (a_LocationRaw[1] << 8) | a_LocationRaw[2];\n\tint SizeInSectors = a_LocationRaw[3] * (4 KiB);\n\tif (a_File.Seek(SectorNum * (4 KiB)) < 0)\n\t{\n\t\tLOGWARNING(\"Failed to seek to chunk data - file pos %llu (%d KiB, %.02f MiB)!\",\n\t\t\tstatic_cast<Int64>(SectorNum) * (4 KiB), SectorNum * 4,\n\t\t\tstatic_cast<double>(SectorNum) / 256\n\t\t);\n\t\treturn false;\n\t}\n\n\t// Read the exact size:\n\tByte Buf[4];\n\tif (a_File.Read(Buf, 4) != 4)\n\t{\n\t\tLOGWARNING(\"Failed to read chunk data length\");\n\t\treturn false;\n\t}\n\tm_CompressedChunkDataSize = (Buf[0] << 24) | (Buf[1] << 16) | (Buf[2] << 8) | Buf[3];\n\tif ((m_CompressedChunkDataSize > SizeInSectors) || (m_CompressedChunkDataSize < 0))\n\t{\n\t\tLOGWARNING(\"Invalid chunk data - SizeInSectors (%d) smaller that RealSize (%d)\", SizeInSectors, m_CompressedChunkDataSize);\n\t\treturn false;\n\t}\n\n\t// Read the data:\n\tif (a_File.Read(m_CompressedChunkData, static_cast<size_t>(m_CompressedChunkDataSize)) != m_CompressedChunkDataSize)\n\t{\n\t\tLOGWARNING(\"Failed to read chunk data!\");\n\t\treturn false;\n\t}\n\n\t// Uncompress the data if recompression is active\n\tif (m_Parent.m_ShouldRecompress)\n\t{\n\t\tm_IsChunkUncompressed = UncompressChunk();\n\t\tif (!m_IsChunkUncompressed)\n\t\t{\n\t\t\tLOGINFO(\"Chunk failed to uncompress, will be copied verbatim instead.\");\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cMCADefrag::cThread::WriteChunk(cFile & a_File, Byte * a_LocationRaw)\n{\n\t// Recompress the data if recompression is active:\n\tif (m_Parent.m_ShouldRecompress)\n\t{\n\t\tif (!CompressChunk())\n\t\t{\n\t\t\tLOGINFO(\"Chunk failed to recompress, will be coped verbatim instead.\");\n\t\t}\n\t}\n\n\t// Update the Location:\n\ta_LocationRaw[0] = static_cast<Byte>(m_CurrentSectorOut >> 16);\n\ta_LocationRaw[1] = (m_CurrentSectorOut >> 8) & 0xff;\n\ta_LocationRaw[2] = m_CurrentSectorOut & 0xff;\n\ta_LocationRaw[3] = static_cast<Byte>((m_CompressedChunkDataSize + (4 KiB) + 3) / (4 KiB));  // +3 because the m_CompressedChunkDataSize doesn't include the exact-length\n\tm_CurrentSectorOut += a_LocationRaw[3];\n\n\t// Write the data length:\n\tByte Buf[4];\n\tBuf[0] = static_cast<Byte>(m_CompressedChunkDataSize >> 24);\n\tBuf[1] = (m_CompressedChunkDataSize >> 16) & 0xff;\n\tBuf[2] = (m_CompressedChunkDataSize >> 8) & 0xff;\n\tBuf[3] = m_CompressedChunkDataSize & 0xff;\n\tif (a_File.Write(Buf, 4) != 4)\n\t{\n\t\tLOGWARNING(\"Failed to write chunk length!\");\n\t\treturn false;\n\t}\n\n\t// Write the data:\n\tif (a_File.Write(m_CompressedChunkData, static_cast<size_t>(m_CompressedChunkDataSize)) != m_CompressedChunkDataSize)\n\t{\n\t\tLOGWARNING(\"Failed to write chunk data!\");\n\t\treturn false;\n\t}\n\n\t// Pad onto the next sector:\n\tint NumPadding = a_LocationRaw[3] * 4096 - (m_CompressedChunkDataSize + 4);\n\tASSERT(NumPadding >= 0);\n\tif ((NumPadding > 0) && (a_File.Write(g_Zeroes, static_cast<size_t>(NumPadding)) != NumPadding))\n\t{\n\t\tLOGWARNING(\"Failed to write padding\");\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cMCADefrag::cThread::UncompressChunk(void)\n{\n\tswitch (m_CompressedChunkData[0])\n\t{\n\t\tcase COMPRESSION_GZIP: return UncompressChunkGzip();\n\t\tcase COMPRESSION_ZLIB: return UncompressChunkZlib();\n\t}\n\tLOGINFO(\"Chunk is compressed with in an unknown algorithm\");\n\treturn false;\n}\n\n\n\n\n\nbool cMCADefrag::cThread::UncompressChunkGzip(void)\n{\n\t// TODO\n\t// This format is not used in practice\n\treturn false;\n}\n\n\n\n\n\nbool cMCADefrag::cThread::UncompressChunkZlib(void)\n{\n\ttry\n\t{\n\t\t// Uncompress the data\n\n\t\tconst auto ExtractedData = m_Extractor.ExtractZLib(\n\t\t{\n\t\t\treinterpret_cast<const std::byte *>(m_CompressedChunkData + 1),  // The first byte is the compression method, skip it\n\t\t\tstatic_cast<size_t>(m_CompressedChunkDataSize - 1)\n\t\t});\n\t\tconst auto Extracted = ExtractedData.GetView();\n\n\t\tif (Extracted.size() > MAX_RAW_CHUNK_DATA_SIZE)\n\t\t{\n\t\t\tLOGINFO(\"Too much data for the internal decompression buffer!\");\n\t\t\treturn false;\n\t\t}\n\n\t\tstd::copy(Extracted.begin(), Extracted.end(), reinterpret_cast<std::byte *>(m_RawChunkData));\n\t\tm_RawChunkDataSize = static_cast<int>(Extracted.size());\n\n\t\treturn true;\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(\"Failed to uncompress chunk data. %s\", Oops.what());\n\t\treturn false;\n\t}\n}\n\n\n\n\n\nbool cMCADefrag::cThread::CompressChunk(void)\n{\n\ttry\n\t{\n\t\t// Compress the data (using the highest compression factor, as set in the constructor)\n\n\t\tconst auto CompressedData = m_Compressor.CompressZLib(\n\t\t{\n\t\t\treinterpret_cast<const std::byte *>(m_RawChunkData),\n\t\t\tstatic_cast<size_t>(m_RawChunkDataSize)\n\t\t});\n\t\tconst auto Compressed = CompressedData.GetView();\n\n\t\t// Check that the compressed data can fit:\n\t\tif (Compressed.size() > MAX_COMPRESSED_CHUNK_DATA_SIZE)\n\t\t{\n\t\t\tLOGINFO(\"Too much data for the internal compression buffer!\");\n\t\t\treturn false;\n\t\t}\n\n\t\tm_CompressedChunkData[0] = COMPRESSION_ZLIB;\n\t\tstd::copy(Compressed.begin(), Compressed.end(), reinterpret_cast<std::byte *>(m_CompressedChunkData + 1));\n\t\tm_CompressedChunkDataSize = static_cast<int>(Compressed.size()) + 1;\n\n\t\treturn true;\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(\"Recompression failed. %s\", Oops.what());\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "Tools/MCADefrag/MCADefrag.h",
    "content": "\n// MCADefrag.h\n\n// Interfaces to the cMCADefrag class encapsulating the entire app\n\n\n\n\n\n#pragma once\n\n\n\n\n\n#include \"OSSupport/IsThread.h\"\n#include \"StringCompression.h\"\n\n\n\n\n\n\nclass cMCADefrag\n{\npublic:\n\n\tenum\n\t{\n\t\tMAX_COMPRESSED_CHUNK_DATA_SIZE = (1 MiB),\n\t\tMAX_RAW_CHUNK_DATA_SIZE        = (100 MiB),\n\t} ;\n\n\tcMCADefrag(void);\n\n\t/** Reads the cmdline params and initializes the app.\n\tReturns true if the app should continue, false if not. */\n\tbool Init(int argc, char ** argv);\n\n\t/** Runs the entire app. */\n\tvoid Run(void);\n\nprotected:\n\n\t/** A single thread processing MCA files from the queue */\n\tclass cThread :\n\t\tpublic cIsThread\n\t{\n\t\ttypedef cIsThread super;\n\n\tpublic:\n\n\t\tcThread(cMCADefrag & a_Parent);\n\n\tprotected:\n\n\t\t/** The compression methods, as specified by the MCA compression method byte. */\n\t\tenum\n\t\t{\n\t\t\tCOMPRESSION_GZIP = 1,\n\t\t\tCOMPRESSION_ZLIB = 2,\n\t\t} ;\n\n\n\t\tcMCADefrag & m_Parent;\n\n\t\t/** The current compressed chunk data. Valid after a successful ReadChunk().\n\t\tThis contains only the compression method byte and the compressed data,\n\t\tbut not the exact-length preceding the data in the MCA file. */\n\t\tunsigned char m_CompressedChunkData[MAX_COMPRESSED_CHUNK_DATA_SIZE];\n\n\t\t/** Size of the actual current compressed chunk data, excluding the 4 exact-length bytes.\n\t\tThis is the amount of bytes in m_CompressedChunkData[] that are valid. */\n\t\tint m_CompressedChunkDataSize;\n\n\t\t/** The current raw chunk data. Valid after a successful ReadChunk(), if recompression is active. */\n\t\tunsigned char m_RawChunkData[MAX_RAW_CHUNK_DATA_SIZE];\n\n\t\t/** Size of the actual current raw chunk data. */\n\t\tint m_RawChunkDataSize;\n\n\t\t/** Number of the sector where the next chunk will be written by WriteChunk(). */\n\t\tint m_CurrentSectorOut;\n\n\t\t/** Set to true when the chunk has been successfully uncompressed. Only used if recompression is active.\n\t\tWriteChunk() tests this flag to decide whether to call Compress(). */\n\t\tbool m_IsChunkUncompressed;\n\n\t\t/** An instance of the compressor. */\n\t\tCompression::Compressor m_Compressor;\n\n\t\t/** An instance of the extractor. */\n\t\tCompression::Extractor m_Extractor;\n\n\n\t\t/** Processes the specified file. */\n\t\tvoid ProcessFile(const AString & a_FileName);\n\n\t\t/** Reads the chunk data into m_CompressedChunkData.\n\t\tCalls DecompressChunkData() if recompression is active.\n\t\ta_LocationRaw is the pointer to the first byte of the Location data in the MCA header.\n\t\tReturns true if successful. */\n\t\tbool ReadChunk(cFile & a_File, const Byte * a_LocationRaw);\n\n\t\t/** Writes the chunk data from m_CompressedData or m_RawChunkData (performing recompression) into file.\n\t\tCalls CompressChunkData() for the actual compression, if recompression is active.\n\t\ta_LocationRaw is the pointer to the first byte of the Location data to be put into the MCA header,\n\t\tthe chunk's location is stored in that memory area. Updates m_CurrentSectorOut.\n\t\tReturns true if successful. */\n\t\tbool WriteChunk(cFile & a_File, Byte * a_LocationRaw);\n\n\t\t/** Uncompresses the chunk data from m_CompressedChunkData into m_RawChunkData.\n\t\tReturns true if successful, false on failure. */\n\t\tbool UncompressChunk(void);\n\n\t\t/** Uncompresses the chunk data from m_CompressedChunkData into m_RawChunkData, using Gzip.\n\t\tReturns true if successful, false on failure. */\n\t\tbool UncompressChunkGzip(void);\n\n\t\t/** Uncompresses the chunk data from m_CompressedChunkData into m_RawChunkData, using Zlib.\n\t\tReturns true if successful, false on failure. */\n\t\tbool UncompressChunkZlib(void);\n\n\t\t/** Compresses the chunk data from m_RawChunkData into m_CompressedChunkData.\n\t\tReturns true if successful, false on failure. */\n\t\tbool CompressChunk(void);\n\n\t\t// cIsThread overrides:\n\t\tvirtual void Execute(void) override;\n\t} ;\n\n\ttypedef std::list<cThread *> cThreads;\n\n\n\t/** The mutex protecting m_Files agains multithreaded access. */\n\tcCriticalSection m_CS;\n\n\t/** The queue of MCA files to be processed by the threads. Protected by m_CS. */\n\tAStringVector m_Queue;\n\n\t/** List of threads that the server has running. */\n\tcThreads m_Threads;\n\n\t/** The number of threads that should be started. Configurable on the command line. */\n\tint m_NumThreads;\n\n\t/** If set to true, the chunk data is recompressed while saving each MCA file. */\n\tbool m_ShouldRecompress;\n\n\n\t/** Starts a new processing thread and adds it to cThreads. */\n\tvoid StartThread(void);\n\n\t/** Retrieves one file from the queue (and removes it from the queue).\n\tReturns an empty string when queue empty. */\n\tAString GetNextFileName(void);\n} ;\n"
  },
  {
    "path": "Tools/MemDumpAnalysis/.gitignore",
    "content": "Debug/\nlogs/\nRelease/\n"
  },
  {
    "path": "Tools/MemDumpAnalysis/Globals.cpp",
    "content": "\n// Globals.cpp\n\n// Used for precompiled header generation\n\n#include \"Globals.h\"\n"
  },
  {
    "path": "Tools/MemDumpAnalysis/Globals.h",
    "content": "\n// Globals.h\n\n// Used for precompiled header generation\n\n\n\n\n\n#pragma once\n\n#include \"../../src/Globals.h\"\n\n/*\n// System headers:\n#include \"targetver.h\"\n#include <stdio.h>\n\n// STL headers:\n#include <vector>\n#include <list>\n#include <map>\n#include <string>\n\n// Common:\n#include \"../src/StringUtils.h\"\n#include \"../src/OSSupport/File.h\"\n*/\n\n// Libraries:\n#include \"expat/expat.h\"\n\n\n\n\n"
  },
  {
    "path": "Tools/MemDumpAnalysis/MemDumpAnalysis.cpp",
    "content": "\n// MemDumpAnalysis.cpp\n\n// Defines the entry point for the console application.\n\n#include \"Globals.h\"\n\n#ifdef _WIN32\n\t#pragma comment(lib, \"ws2_32.lib\")  // Needed for StringUtils' RawBEToUtf8() et al.\n#endif  // _WIN32\n\n\n\n\n\ntypedef std::set<AString> AStringSet;\n\n\n\n\n\nclass cFunction\n{\npublic:\n\tint        m_Size;   ///< Sum of memory block sizes allocated by this function or its children\n\tint        m_Count;  ///< Total number of memory blocks allocated by this function or its children\n\tAStringSet m_ChildrenNames;\n\n\tcFunction(void) :\n\t\tm_Size(0),\n\t\tm_Count(0)\n\t{\n\t}\n} ;\n\ntypedef std::map<AString, cFunction> FunctionMap;\n\n\n\n\n\nint g_CurrentID = 0;\nint g_CurrentSize = 0;\nFunctionMap g_FnMap;\nAString g_PrevFunctionName;\n\n\n\n\n\nbool IsFnBlackListed(const char * a_FnName)\n{\n\tstatic const char * BlackList[] =\n\t{\n\t\t\"MyAllocHook\",\n\t\t\"_heap_alloc_dbg_impl\",\n\t\t\"_nh_malloc_dbg_impl\",\n\t\t\"_nh_malloc_dbg\",\n\t\t\"malloc\",\n\t\t\"operator new\",\n\t\t\"_malloc_dbg\",\n\t\t\"realloc_help\",\n\t\t\"_realloc_dbg\",\n\t\t\"realloc\",\n\t\t\"l_alloc\",\n\t\t\"luaM_realloc_\",\n\t\t\"\",\n\t} ;\n\n\tfor (int i = 0; i < ARRAYCOUNT(BlackList); i++)\n\t{\n\t\tif (strcmp(BlackList[i], a_FnName) == 0)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nconst char * FindAttr(const char ** a_Attrs, const char * a_AttrName)\n{\n\tfor (const char ** Attr = a_Attrs; *Attr != NULL; Attr += 2)\n\t{\n\t\tif (strcmp(*Attr, a_AttrName) == 0)\n\t\t{\n\t\t\treturn *(Attr + 1);\n\t\t}\n\t}  // for Attr - a_Attrs[]\n\treturn NULL;\n}\n\n\n\n\n\nvoid OnStartElement(void * a_Data, const char * a_Element, const char ** a_Attrs)\n{\n\tif (strcmp(a_Element, \"LEAK\") == 0)\n\t{\n\t\tconst char * attrID   = FindAttr(a_Attrs, \"requestID\");\n\t\tconst char * attrSize = FindAttr(a_Attrs, \"size\");\n\t\tg_CurrentID   = atoi((attrID   == NULL) ? \"-1\" : attrID);\n\t\tg_CurrentSize = atoi((attrSize == NULL) ? \"-1\" : attrSize);\n\t\tg_PrevFunctionName.clear();\n\t\treturn;\n\t}\n\tif (strcmp(a_Element, \"STACKENTRY\") == 0)\n\t{\n\t\tconst char * fnName = FindAttr(a_Attrs, \"decl\");\n\t\tif (fnName == NULL)\n\t\t{\n\t\t\tg_CurrentID = -1;\n\t\t\tg_CurrentSize = -1;\n\t\t\treturn;\n\t\t}\n\t\tif (g_CurrentSize < 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (IsFnBlackListed(fnName))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tAString FunctionName = fnName;\n\t\tcFunction & Function = g_FnMap[FunctionName];\n\t\tFunction.m_Size += g_CurrentSize;\n\t\tFunction.m_Count += 1;\n\t\tif (!g_PrevFunctionName.empty())\n\t\t{\n\t\t\tFunction.m_ChildrenNames.insert(g_PrevFunctionName);\n\t\t}\n\t\tstd::swap(g_PrevFunctionName, FunctionName);  // We only care about moving FunctionName into g_PrevFunctionName\n\t\treturn;\n\t}\n}\n\n\n\n\n\nvoid OnEndElement(void * a_Data, const char * a_Element)\n{\n\tif (strcmp(a_Element, \"LEAK\") == 0)\n\t{\n\t\tg_CurrentID = -1;\n\t\tg_CurrentSize = -1;\n\t\treturn;\n\t}\n}\n\n\n\n\n\nbool CompareFnInt(const std::pair<AString, int> & a_First, const std::pair<AString, int> & a_Second)\n{\n\treturn (a_First.second < a_Second.second);\n}\n\n\n\n\n\nvoid WriteSizeStatistics(void)\n{\n\ttypedef std::vector<std::pair<AString, int> > StringIntPairs;\n\tStringIntPairs FnSizes;\n\n\tcFile f(\"memdump_totals.txt\", cFile::fmWrite);\n\tif (!f.IsOpen())\n\t{\n\t\tLOGERROR(\"Cannot open memdump_totals.txt\");\n\t\treturn;\n\t}\n\n\tfor (FunctionMap::iterator itr = g_FnMap.begin(), end = g_FnMap.end(); itr != end; ++itr)\n\t{\n\t\tFnSizes.push_back(std::pair<AString, int>(itr->first, itr->second.m_Size));\n\t}  // for itr - g_FnSizes[]\n\tstd::sort(FnSizes.begin(), FnSizes.end(), CompareFnInt);\n\n\tfor (StringIntPairs::const_iterator itr = FnSizes.begin(), end = FnSizes.end(); itr != end; ++itr)\n\t{\n\t\tf.Printf(\"%d\\t%s\\n\", itr->second, itr->first.c_str());\n\t}  // for itr - FnSizes[]\n}\n\n\n\n\n\nvoid WriteCountStatistics(void)\n{\n\ttypedef std::vector<std::pair<AString, int> > StringIntPairs;\n\tStringIntPairs FnCounts;\n\n\tcFile f(\"memdump_counts.txt\", cFile::fmWrite);\n\tif (!f.IsOpen())\n\t{\n\t\tLOGERROR(\"Cannot open memdump_counts.txt\");\n\t\treturn;\n\t}\n\n\tfor (FunctionMap::iterator itr = g_FnMap.begin(), end = g_FnMap.end(); itr != end; ++itr)\n\t{\n\t\tFnCounts.push_back(std::pair<AString, int>(itr->first, itr->second.m_Count));\n\t}  // for itr - g_FnSizes[]\n\tstd::sort(FnCounts.begin(), FnCounts.end(), CompareFnInt);\n\n\tfor (StringIntPairs::const_iterator itr = FnCounts.begin(), end = FnCounts.end(); itr != end; ++itr)\n\t{\n\t\tf.Printf(\"%d\\t%s\\n\", itr->second, itr->first.c_str());\n\t}  // for itr - FnSizes[]\n}\n\n\n\n\n\nAString HTMLEscape(const AString & a_Text)\n{\n\tAString res;\n\tres.reserve(a_Text.size());\n\tsize_t len = a_Text.length();\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tswitch (a_Text[i])\n\t\t{\n\t\t\tcase '<': res.append(\"&lt;<BR/>\"); break;\n\t\t\tcase '>': res.append(\"<BR/>&gt;\"); break;\n\t\t\tcase '&': res.append(\"&amp;\"); break;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tres.push_back(a_Text[i]);\n\t\t\t}\n\t\t}\n\t}  // for i - a_Text[]\n\treturn res;\n}\n\n\n\n\n\nvoid WriteDotGraph(void)\n{\n\tcFile f(\"memdump.dot\", cFile::fmWrite);\n\tif (!f.IsOpen())\n\t{\n\t\tLOGERROR(\"Cannot open memdump.dot\");\n\t\treturn;\n\t}\n\n\tf.Printf(\"digraph {\\n\\tnode [shape=plaintext]\\n\\n\");\n\tfor (FunctionMap::const_iterator itrF = g_FnMap.begin(), endF = g_FnMap.end(); itrF != endF; ++itrF)\n\t{\n\t\tf.Printf(\"\\t\\\"%s\\\" [label=<%s<BR/>%d bytes (%d KiB)<BR/>%d blocks>]\\n\",\n\t\t\titrF->first.c_str(),\n\t\t\tHTMLEscape(itrF->first).c_str(),\n\t\t\titrF->second.m_Size,\n\t\t\t(itrF->second.m_Size + 1023) / 1024,\n\t\t\titrF->second.m_Count\n\t\t);\n\t\tconst AStringSet & Children = itrF->second.m_ChildrenNames;\n\t\tfor (AStringSet::const_iterator itrN = Children.begin(), endN = Children.end(); itrN != endN; ++itrN)\n\t\t{\n\t\t\tf.Printf(\"\\t\\t\\\"%s\\\" -> \\\"%s\\\"\\n\", itrF->first.c_str(), itrN->c_str());\n\t\t}\n\t\tf.Printf(\"\\n\");\n\t}  // for itr\n\tf.Printf(\"}\\n\");\n}\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\t// Open the dump file:\n\tcFile f(\"memdump.xml\", cFile::fmRead);\n\tif (!f.IsOpen())\n\t{\n\t\tprintf(\"Cannot open memdump.xml\\n\");\n\t\treturn 1;\n\t}\n\n\t// Create the XML parser:\n\tXML_Parser Parser = XML_ParserCreate(NULL);\n\tXML_SetElementHandler(Parser, OnStartElement, OnEndElement);\n\n\t// Feed the file through XML parser:\n\tchar Buffer[512 KiB];\n\twhile (true)\n\t{\n\t\tint NumBytes = f.Read(Buffer, sizeof(Buffer));\n\t\tif (NumBytes <= 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tXML_Parse(Parser, Buffer, NumBytes, false);\n\t\tputc('.', stdout);\n\t}\n\tXML_Parse(Parser, \"\", 0, true);\n\tf.Close();\n\n\t// Output the statistics\n\tWriteSizeStatistics();\n\tWriteCountStatistics();\n\tWriteDotGraph();\n\n\treturn 0;\n}\n"
  },
  {
    "path": "Tools/MemDumpAnalysis/targetver.h",
    "content": "\n// targetver.h\n\n// Used by MSWin builds to target the appropriate OS version\n\n\n\n\n\n#pragma once\n\n// The following macros define the minimum required platform.  The minimum required platform\n// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run\n// your application.  The macros work by enabling all features available on platform versions up to and\n// including the version specified.\n\n// Modify the following defines if you have to target a platform prior to the ones specified below.\n// Refer to MSDN for the latest info on corresponding values for different platforms.\n#ifndef _WIN32_WINNT            // Specifies that the minimum required platform is Windows Vista.\n#define _WIN32_WINNT 0x0600     // Change this to the appropriate value to target other versions of Windows.\n#endif\n"
  },
  {
    "path": "Tools/NoiseSpeedTest/CMakeLists.txt",
    "content": "project (NoiseSpeedTest)\n\n# Set include paths to the used libraries:\ninclude_directories(SYSTEM \"../../lib\")\ninclude_directories(\"../../src\")\n\n# Include the shared files:\nset(SHARED_SRC\n\t../../src/Logger.cpp\n\t../../src/LoggerListeners.cpp\n\t../../src/OSSupport/CriticalSection.cpp\n\t../../src/OSSupport/File.cpp\n\t../../src/OSSupport/StackTrace.cpp\n\t../../src/OSSupport/WinStackWalker.cpp\n\t../../src/Noise/Noise.cpp\n\t../../src/StringUtils.cpp\n)\n\nset(SHARED_HDR\n\t../../src/Noise/Noise.h\n\t../../src/Noise/OctavedNoise.h\n\t../../src/Noise/RidgedNoise.h\n\t../../src/OSSupport/CriticalSection.h\n\t../../src/OSSupport/File.h\n\t../../src/OSSupport/StackTrace.h\n\t../../src/OSSupport/WinStackWalker.h\n\t../../src/StringUtils.h\n)\n\n\nsource_group(\"Shared\" FILES ${SHARED_SRC} ${SHARED_HDR})\n\n\n\n\n# Include the main source files:\nset(SOURCES\n\tNoiseSpeedTest.cpp\n)\nset(HEADERS\n\tNoiseSpeedTest.h\n\tSimplexNoise.h\n)\n\nsource_group(\"\" FILES ${SOURCES} ${HEADERS})\n\nadd_executable(NoiseSpeedTest\n\t${SOURCES}\n\t${HEADERS}\n\t${SHARED_SRC}\n\t${SHARED_HDR}\n)\n\ntarget_link_libraries(NoiseSpeedTest fmt::fmt)\nif (WIN32)\n\ttarget_link_libraries(NoiseSpeedTest ws2_32)\nendif()\n\nset_target_properties(\n\tNoiseSpeedTest\n\tPROPERTIES FOLDER Tools\n)\n\ninclude(../../SetFlags.cmake)\nset_exe_flags(NoiseSpeedTest)\n"
  },
  {
    "path": "Tools/NoiseSpeedTest/NoiseSpeedTest.cpp",
    "content": "// NoiseSpeedTest.cpp\n\n// Implements the main app entrypoint\n\n/*\nThis program compares the performance of the highly-optimized noise implementation in Cuberite, and the Simplex noise.\nSince the Simplex noise is not yet implemented in Cuberite, an own implementation is provided.\nAlso, the performance difference between using a float and double as datatype is measured, by using a templatized Simplex noise.\n\nThe testing is done on a usage of the generator that is typical for the Cuberite's terrain generator: generate a 3D array of numbers with\nnot much variance in the coords. The exact sizes and coord ranges were adapted from the cNoise3DComposable generator.\n*/\n\n#include \"Globals.h\"\n#include \"Noise/Noise.h\"\n#include \"Noise/InterpolNoise.h\"\n#include \"SimplexNoise.h\"\n\n\n\n\n\n/** The sizes of the interpolated noise that are calculated: */\nstatic const int SIZE_X = 33;\nstatic const int SIZE_Y = 5;\nstatic const int SIZE_Z = 5;\n\n\n\n\n\nstatic void measureClassicNoise(int a_NumIterations)\n{\n\tcInterp5DegNoise noise(1);\n\tNOISE_DATATYPE total = 0;\n\tauto timeStart = std::chrono::high_resolution_clock::now();\n\tfor (int i = 0; i < a_NumIterations; ++i)\n\t{\n\t\tNOISE_DATATYPE out[SIZE_X * SIZE_Y * SIZE_Z];\n\t\tint blockX = i * 16;\n\t\tint blockZ = i * 16;\n\t\tNOISE_DATATYPE startX = 0;\n\t\tNOISE_DATATYPE endX = 257 / 80.0f;\n\t\tNOISE_DATATYPE startY = blockX / 40.0f;\n\t\tNOISE_DATATYPE endY = (blockX + 16) / 40.0f;\n\t\tNOISE_DATATYPE startZ = blockZ / 40.0f;\n\t\tNOISE_DATATYPE endZ = (blockZ + 16) / 40.0f;\n\t\tnoise.Generate3D(out, SIZE_X, SIZE_Y, SIZE_Z, startX, endX, startY, endY, startZ, endZ);\n\t\ttotal += out[0];  // Do not let the optimizer optimize the whole calculation away\n\t}\n\tauto timeEnd = std::chrono::high_resolution_clock::now();\n\tauto msec = std::chrono::duration_cast<std::chrono::milliseconds>(timeEnd - timeStart);\n\tprintf(\"Classic noise took %d milliseconds, returned total %f\\n\", static_cast<int>(msec.count()), total);\n}\n\n\n\n\n\n/** Calculates the specified number of iterations of the Simplex noise.\na_TypeStr is a string representing the DATATYPE (for logging purposes). */\ntemplate<typename DATATYPE> static void measureSimplexNoise(int a_NumIterations, const char * a_TypeStr)\n{\n\tcSimplexNoise<DATATYPE> noise(1);\n\tDATATYPE total = 0;\n\tauto timeStart = std::chrono::high_resolution_clock::now();\n\tfor (int i = 0; i < a_NumIterations; ++i)\n\t{\n\t\tDATATYPE out[SIZE_X * SIZE_Y * SIZE_Z];\n\t\tint blockX = i * 16;\n\t\tint blockZ = i * 16;\n\t\tDATATYPE startX = 0;\n\t\tDATATYPE endX = 257 / 80.0f;\n\t\tDATATYPE startY = blockX / 40.0f;\n\t\tDATATYPE endY = (blockX + 16) / 40.0f;\n\t\tDATATYPE startZ = blockZ / 40.0f;\n\t\tDATATYPE endZ = (blockZ + 16) / 40.0f;\n\t\tnoise.Generate3D(out, SIZE_X, SIZE_Y, SIZE_Z, startX, endX, startY, endY, startZ, endZ);\n\t\ttotal += out[0];  // Do not let the optimizer optimize the whole calculation away\n\t}\n\tauto timeEnd = std::chrono::high_resolution_clock::now();\n\tauto msec = std::chrono::duration_cast<std::chrono::milliseconds>(timeEnd - timeStart);\n\tprintf(\"SimplexNoise<%s> took %d milliseconds, returned total %f\\n\", a_TypeStr, static_cast<int>(msec.count()), total);\n}\n\n\n\n\n\nint main(int argc, char ** argv)\n{\n\tint numIterations = 10000;\n\tif (argc > 1)\n\t{\n\t\tnumIterations = std::atoi(argv[1]);\n\t\tif (numIterations < 10)\n\t\t{\n\t\t\tprintf(\"Invalid number of iterations, using 1000 instead\\n\");\n\t\t\tnumIterations = 1000;\n\t\t}\n\t}\n\n\t// Perform each test twice, to account for cache-warmup:\n\tmeasureClassicNoise(numIterations);\n\tmeasureClassicNoise(numIterations);\n\tmeasureSimplexNoise<float>(numIterations, \"float\");\n\tmeasureSimplexNoise<float>(numIterations, \"float\");\n\tmeasureSimplexNoise<double>(numIterations, \"double\");\n\tmeasureSimplexNoise<double>(numIterations, \"double\");\n\n\t// If build on Windows using MSVC, wait for a keypress before ending:\n\t#ifdef _MSC_VER\n\t\tgetchar();\n\t#endif\n\n\treturn 0;\n}\n"
  },
  {
    "path": "Tools/NoiseSpeedTest/NoiseSpeedTest.h",
    "content": "// NoiseSpeedTest.h\n\n\n\n\n"
  },
  {
    "path": "Tools/NoiseSpeedTest/SimplexNoise.h",
    "content": "// SimplexNoise.h\n\n// Declares and implements the simplex noise, using a template parameter for the underlying datatype\n\n/*\nNote:\nThis code has been adapted from the public domain code by Stefan Gustavson, available at\nhttp://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n*/\n\n#include <random>\n\n\n\n\n\ntemplate<typename Datatype>\nclass cSimplexNoise\n{\npublic:\n\tcSimplexNoise(unsigned a_Seed)\n\t{\n\t\t// Based on the seed, initialize the permutation table, using a simple LCG and swapping\n\n\t\t// Initialize with sorted sequence:\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(m_Perm) / 2; i++)\n\t\t{\n\t\t\tm_Perm[i] = static_cast<int>(i);\n\t\t}\n\n\t\t// Use swaps to randomize:\n\t\tstd::minstd_rand lcg(a_Seed);\n\t\tfor (size_t i = 0; i < 2000; i++)\n\t\t{\n\t\t\tstd::swap(m_Perm[lcg() % (ARRAYCOUNT(m_Perm) / 2)], m_Perm[lcg() % (ARRAYCOUNT(m_Perm) / 2)]);\n\t\t}\n\n\t\t// Copy to the upper half of the buffer (to avoid the need for modulo when accessing neighbors):\n\t\tfor (size_t i = ARRAYCOUNT(m_Perm) / 2; i < ARRAYCOUNT(m_Perm); i++)\n\t\t{\n\t\t\tm_Perm[i] = m_Perm[i - ARRAYCOUNT(m_Perm) / 2];\n\t\t}\n\n\t\t// Copy to the \"modulo 12\" table to optimize away four modulo ops per value calculation:\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(m_Perm); i++)\n\t\t{\n\t\t\tm_PermMod12[i] = m_Perm[i] % 12;\n\t\t}\n\t}\n\n\n\n\t/** Returns a dot product of an int vector with a Datatype vector. */\n\tinline Datatype dot(const int * g, const Datatype x, const Datatype y, const Datatype z)\n\t{\n\t\treturn g[0] * x + g[1] * y + g[2] * z;\n\t}\n\n\n\n\t/** Returns a dot product of two Datatype vectors. */\n\tinline Datatype dot(const Datatype * g, const Datatype x, const Datatype y, const Datatype z)\n\t{\n\t\treturn g[0] * x + g[1] * y + g[2] * z;\n\t}\n\n\n\n\t/** Returns the floor of the specified value, already type-cast to proper int type. */\n\tinline int datafloor(const Datatype a_Val)\n\t{\n\t\treturn (a_Val > 0) ? static_cast<int>(a_Val) : static_cast<int>(a_Val - 1);  // This is faster than std::floor()\n\t}\n\n\n\t/** Returns a single noise value based on the 3D coords. */\n\tDatatype GetValueAt3D(const Datatype a_X, const Datatype a_Y, const Datatype a_Z)\n\t{\n\t\t// The gradients are the midpoints of the vertices of a cube.\n\t\tstatic const Datatype grad3[12][3] =\n\t\t{\n\t\t\t{1, 1, 0}, {-1,  1, 0}, {1, -1,  0}, {-1, -1,  0},\n\t\t\t{1, 0, 1}, {-1,  0, 1}, {1,  0, -1}, {-1,  0, -1},\n\t\t\t{0, 1, 1}, { 0, -1, 1}, {0,  1, -1}, { 0, -1, -1}\n\t\t};\n\n\t\t// Skew factors:\n\t\tstatic const Datatype F3 = static_cast<Datatype>(1.0 / 3.0);\n\t\tstatic const Datatype G3 = static_cast<Datatype>(1.0 / 6.0);\n\n\t\t// Noise contributions from the four corners:\n\t\tDatatype n0, n1, n2, n3;\n\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tDatatype s = (a_X + a_Y + a_Z) * F3;\n\t\tint i = datafloor(a_X + s);\n\t\tint j = datafloor(a_Y + s);\n\t\tint k = datafloor(a_Z + s);\n\n\t\t// Unskew back into the XYZ space to calculate the distances from cell origin:\n\t\tDatatype t = (i + j + k) * G3;\n\t\tDatatype X0 = i - t;\n\t\tDatatype Y0 = j - t;\n\t\tDatatype Z0 = k - t;\n\t\tDatatype x0 = a_X - X0;\n\t\tDatatype y0 = a_Y - Y0;\n\t\tDatatype z0 = a_Z - Z0;\n\n\t\t// For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n\t\t// Determine which simplex we are in.\n\t\tint i1, j1, k1;  // Offsets for second corner of simplex in IJK coords\n\t\tint i2, j2, k2;  // Offsets for third  corner of simplex in IJK coords\n\t\tif (x0 >= y0)\n\t\t{\n\t\t\tif (y0 >= z0)\n\t\t\t{\n\t\t\t\t// X Y Z order\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\t\t\t}\n\t\t\telse if (x0 >= z0)\n\t\t\t{\n\t\t\t\t// X Z Y order\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Z X Y order\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (y0 < z0)\n\t\t\t{\n\t\t\t\t// Z Y X order\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;\n\t\t\t}\n\t\t\telse if (x0 < z0)\n\t\t\t{\n\t\t\t\t// Y Z X order\n\t\t\t\ti1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Y X Z order\n\t\t\t\ti1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\t\t\t}\n\t\t}\n\n\t\t// A step of (1, 0, 0) in IJK means a step of (1 - c,    -c,    -c) in XYZ,\n\t\t// a step of (0, 1, 0) in IJK means a step of (-c,    1 - c,    -c) in XYZ, and\n\t\t// a step of (0, 0, 1) in IJK means a step of (-c,       -c, 1 - c) in XYZ, where c = G3 = 1 / 6.\n\t\tDatatype x1 = x0 - i1 + G3;  // Offsets for second corner in XYZ coords\n\t\tDatatype y1 = y0 - j1 + G3;\n\t\tDatatype z1 = z0 - k1 + G3;\n\t\tDatatype x2 = x0 - i2 + static_cast<Datatype>(2) * G3;  // Offsets for third corner in XYZ coords\n\t\tDatatype y2 = y0 - j2 + static_cast<Datatype>(2) * G3;\n\t\tDatatype z2 = z0 - k2 + static_cast<Datatype>(2) * G3;\n\t\tDatatype x3 = x0 - static_cast<Datatype>(1) + static_cast<Datatype>(3) * G3;  // Offsets for last corner in XYZ coords\n\t\tDatatype y3 = y0 - static_cast<Datatype>(1) + static_cast<Datatype>(3) * G3;\n\t\tDatatype z3 = z0 - static_cast<Datatype>(1) + static_cast<Datatype>(3) * G3;\n\n\t\t// Work out the hashed gradient indices of the four simplex corners\n\t\tint ii = i & 255;\n\t\tint jj = j & 255;\n\t\tint kk = k & 255;\n\t\tint gi0 = m_PermMod12[ii + m_Perm[jj + m_Perm[kk]]];\n\t\tint gi1 = m_PermMod12[ii + i1 + m_Perm[jj + j1 + m_Perm[kk + k1]]];\n\t\tint gi2 = m_PermMod12[ii + i2 + m_Perm[jj + j2 + m_Perm[kk + k2]]];\n\t\tint gi3 = m_PermMod12[ii + 1 + m_Perm[jj + 1 + m_Perm[kk + 1]]];\n\n\t\t// Calculate the contribution from the four corners\n\t\tDatatype t0 = static_cast<Datatype>(0.6) - x0 * x0 - y0 * y0 - z0 * z0;\n\t\tif (t0 < 0)\n\t\t{\n\t\t\tn0 = 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * dot(grad3[gi0], x0, y0, z0);\n\t\t}\n\n\t\tDatatype t1 = static_cast<Datatype>(0.6) - x1 * x1 - y1 * y1 - z1 * z1;\n\t\tif (t1 < 0)\n\t\t{\n\t\t\tn1 = 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * dot(grad3[gi1], x1, y1, z1);\n\t\t}\n\n\t\tDatatype t2 = static_cast<Datatype>(0.6) - x2 * x2 - y2 * y2 - z2 * z2;\n\t\tif (t2 < 0)\n\t\t{\n\t\t\tn2 = 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * dot(grad3[gi2], x2, y2, z2);\n\t\t}\n\n\t\tDatatype t3 = static_cast<Datatype>(0.6) - x3 * x3 - y3 * y3 - z3 * z3;\n\t\tif (t3 < 0)\n\t\t{\n\t\t\tn3 = 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * dot(grad3[gi3], x3, y3, z3);\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to stay just inside [-1, 1]\n\t\treturn static_cast<Datatype>(32) * (n0 + n1 + n2 + n3);\n\t}\n\n\n\n\n\t/** Generates the 3D version of the SImplex noise.\n\ta_Out is the 3D array into which the noise is output. Organized as [x + a_SizeX * y + a_SizeX * a_SizeY * z].\n\ta_SizeX, a_SizeY, a_SizeZ are the dimensions of the a_Out array.\n\ta_Start and a_End are the coords of the 3D array in the noise-space. */\n\tvoid Generate3D(\n\t\tDatatype * a_Out,\n\t\tint a_SizeX, int a_SizeY, int a_SizeZ,\n\t\tDatatype a_StartX, Datatype a_EndX,\n\t\tDatatype a_StartY, Datatype a_EndY,\n\t\tDatatype a_StartZ, Datatype a_EndZ\n\t)\n\t{\n\t\tDatatype * out = a_Out;\n\t\tfor (int z = 0; z < a_SizeZ; ++z)\n\t\t{\n\t\t\tDatatype nz = a_StartZ + z * (a_EndZ - a_StartZ) / a_SizeZ;\n\t\t\tfor (int y = 0; y < a_SizeY; ++y)\n\t\t\t{\n\t\t\t\tDatatype ny = a_StartY + y * (a_EndY - a_StartY) / a_SizeY;\n\t\t\t\tfor (int x = 0; x < a_SizeX; ++x)\n\t\t\t\t{\n\t\t\t\t\tDatatype nx = a_StartX + x * (a_EndX - a_StartX) / a_SizeX;\n\t\t\t\t\t*out = GetValueAt3D(nx, ny, nz);\n\t\t\t\t\t++out;\n\t\t\t\t}  // for x\n\t\t\t}  // for y\n\t\t}  // for z\n\t}\n\nprotected:\n\t/** The permutation table, initialized by the seed. */\n\tint m_Perm[512];\n\n\t/** A copy of the permutation table, with each item modulo 12, to avoid 4 modulo operations per value calculation. */\n\tint m_PermMod12[512];\n};\n\n\n\n\n"
  },
  {
    "path": "Tools/ProtoProxy/.gitignore",
    "content": "Debug\nRelease\nLogs/\nlib/\n*.log\n*.nbt\n*.sln\n*.vcproj\n*.vcxproj\n"
  },
  {
    "path": "Tools/ProtoProxy/CMakeLists.txt",
    "content": "project (ProtoProxy)\nfind_package(Threads REQUIRED)\n\n# Set include paths to the used libraries:\ninclude_directories(SYSTEM \"../../lib\")\ninclude_directories(SYSTEM \"../../lib/mbedtls/include\")\ninclude_directories(\"../../src\")\n\nfunction(flatten_files arg1)\n\tset(res \"\")\n\tforeach(f ${${arg1}})\n\t\tget_filename_component(f ${f} ABSOLUTE)\n\t\tlist(APPEND res ${f})\n\tendforeach()\n\tset(${arg1} \"${res}\" PARENT_SCOPE)\nendfunction()\n\n# Include the shared files:\nset(SHARED_SRC\n\t../../src/ByteBuffer.cpp\n\t../../src/StringUtils.cpp\n\t../../src/UUID.cpp\n\t../../src/mbedTLS++/AesCfb128Decryptor.cpp\n\t../../src/mbedTLS++/AesCfb128Encryptor.cpp\n\t../../src/mbedTLS++/CryptoKey.cpp\n\t../../src/mbedTLS++/CtrDrbgContext.cpp\n\t../../src/mbedTLS++/EntropyContext.cpp\n\t../../src/mbedTLS++/RsaPrivateKey.cpp\n\t../../src/LoggerListeners.cpp\n\t../../src/Logger.cpp\n)\nset(SHARED_HDR\n\t../../src/ByteBuffer.h\n\t../../src/Globals.h\n\t../../src/StringUtils.h\n\t../../src/UUID.h\n\t../../src/mbedTLS++/AesCfb128Decryptor.h\n\t../../src/mbedTLS++/AesCfb128Encryptor.h\n\t../../src/mbedTLS++/CryptoKey.h\n\t../../src/mbedTLS++/CtrDrbgContext.h\n\t../../src/mbedTLS++/EntropyContext.h\n\t../../src/mbedTLS++/RsaPrivateKey.h\n)\nset(SHARED_OSS_SRC\n\t../../src/OSSupport/CriticalSection.cpp\n\t../../src/OSSupport/Event.cpp\n\t../../src/OSSupport/File.cpp\n\t../../src/OSSupport/IsThread.cpp\n\t../../src/OSSupport/StackTrace.cpp\n\t../../src/OSSupport/WinStackWalker.cpp\n)\n\nset(SHARED_OSS_HDR\n\t../../src/OSSupport/CriticalSection.h\n\t../../src/OSSupport/Event.h\n\t../../src/OSSupport/File.h\n\t../../src/OSSupport/IsThread.h\n\t../../src/OSSupport/StackTrace.h\n\t../../src/OSSupport/WinStackWalker.h\n)\n\nflatten_files(SHARED_SRC)\nflatten_files(SHARED_HDR)\nflatten_files(SHARED_OSS_SRC)\nflatten_files(SHARED_OSS_HDR)\nsource_group(\"Shared\" FILES ${SHARED_SRC} ${SHARED_HDR})\nsource_group(\"Shared\\\\OSSupport\" FILES ${SHARED_OSS_SRC} ${SHARED_OSS_HDR})\n\n\n\n# Include the main source files:\nset(SOURCES\n\tConnection.cpp\n\tProtoProxy.cpp\n\tServer.cpp\n)\nset(HEADERS\n\tConnection.h\n\tServer.h\n)\nsource_group(\"\" FILES ${SOURCES} ${HEADERS})\n\nadd_executable(ProtoProxy\n\t${SOURCES}\n\t${HEADERS}\n\t${SHARED_SRC}\n\t${SHARED_HDR}\n\t${SHARED_OSS_SRC}\n\t${SHARED_OSS_HDR}\n)\n\ntarget_link_libraries(ProtoProxy fmt::fmt libdeflate mbedtls Threads::Threads)\n\ninclude(../../SetFlags.cmake)\nset_exe_flags(ProtoProxy)\n"
  },
  {
    "path": "Tools/ProtoProxy/Connection.cpp",
    "content": "\n// Connection.cpp\n\n// Interfaces to the cConnection class representing a single pair of connected sockets\n\n#include \"Globals.h\"\n#include \"Connection.h\"\n#include \"Server.h\"\n#include <iostream>\n#include \"mbedTLS++/CryptoKey.h\"\n#include \"../../src/Logger.h\"\n\n#ifdef _WIN32\n\t#include <direct.h>  // For _mkdir()\n#else\n\t#include <sys/stat.h>   // for mkdir\n#endif\n\n\n\n\n/** When defined, the following macro causes a sleep after each parsed packet (DEBUG-mode only) */\n// #define SLEEP_AFTER_PACKET\n\n\n\n\n\n#if defined(_DEBUG) && defined(SLEEP_AFTER_PACKET)\n\t#define DebugSleep Sleep\n#else\n\t#define DebugSleep(X)\n#endif  // else _DEBUG\n\n\n\n\n\n#define HANDLE_CLIENT_PACKET_READ(Proc, Type, Var) \\\n\tType Var; \\\n\tdo { \\\n\t\tif (!m_ClientBuffer.Proc(Var)) \\\n\t\t{ \\\n\t\t\treturn false; \\\n\t\t} \\\n\t} while (false)\n\n#define HANDLE_SERVER_PACKET_READ(Proc, Type, Var) \\\n\tType Var; \\\n\tdo { \\\n\t\tif (!m_ServerBuffer.Proc(Var)) \\\n\t\t{ \\\n\t\t\treturn false; \\\n\t\t} \\\n\t} while (false)\n\n#define CLIENTSEND(...) SendData(m_ClientSocket, __VA_ARGS__, \"Client\")\n#define SERVERSEND(...) SendData(m_ServerSocket, __VA_ARGS__, \"Server\")\n#define CLIENTENCRYPTSEND(...) SendData(m_ClientSocket, __VA_ARGS__, \"Client\")  // The client conn is always unencrypted\n#define SERVERENCRYPTSEND(...) SendEncryptedData(m_ServerSocket, m_ServerEncryptor, __VA_ARGS__, \"Server\")\n\n#define COPY_TO_SERVER() \\\n\tdo { \\\n\t\tContiguousByteBuffer ToServer; \\\n\t\tm_ClientBuffer.ReadAgain(ToServer); \\\n\t\tswitch (m_ServerState) \\\n\t\t{ \\\n\t\t\tcase csUnencrypted: \\\n\t\t\t{ \\\n\t\t\t\tSERVERSEND(ToServer); \\\n\t\t\t\tbreak; \\\n\t\t\t} \\\n\t\t\tcase csEncryptedUnderstood: \\\n\t\t\tcase csEncryptedUnknown: \\\n\t\t\t{ \\\n\t\t\t\tSERVERENCRYPTSEND(ToServer); \\\n\t\t\t\tbreak; \\\n\t\t\t} \\\n\t\t\tcase csWaitingForEncryption: \\\n\t\t\t{ \\\n\t\t\t\tLog(\"Waiting for server encryption, queued %u bytes\", ToServer.size()); \\\n\t\t\t\tm_ServerEncryptionBuffer += ToServer; \\\n\t\t\t\tbreak; \\\n\t\t\t} \\\n\t\t} \\\n\t\tDebugSleep(50); \\\n\t} while (false)\n\n#define COPY_TO_CLIENT() \\\n\tdo { \\\n\t\tContiguousByteBuffer ToClient; \\\n\t\tm_ServerBuffer.ReadAgain(ToClient); \\\n\t\tswitch (m_ClientState) \\\n\t\t{ \\\n\t\t\tcase csUnencrypted: \\\n\t\t\t{ \\\n\t\t\t\tCLIENTSEND(ToClient); \\\n\t\t\t\tbreak; \\\n\t\t\t} \\\n\t\t\tcase csEncryptedUnderstood: \\\n\t\t\tcase csEncryptedUnknown: \\\n\t\t\t{ \\\n\t\t\t\tCLIENTENCRYPTSEND(ToClient); \\\n\t\t\t\tbreak; \\\n\t\t\t} \\\n\t\t\tcase csWaitingForEncryption: \\\n\t\t\t{ \\\n\t\t\t\tbreak; \\\n\t\t\t} \\\n\t\t\t\\\n\t\t} \\\n\t\tDebugSleep(50); \\\n\t} while (false)\n\n#define HANDLE_CLIENT_READ(Proc) \\\n\tdo { \\\n\t\tif (!Proc) \\\n\t\t{ \\\n\t\t\tContiguousByteBuffer Leftover; \\\n\t\t\tm_ClientBuffer.ReadAgain(Leftover); \\\n\t\t\tDataLog(Leftover.data(), Leftover.size(), \"Leftover data after client packet parsing, %d bytes:\", Leftover.size()); \\\n\t\t\tm_ClientBuffer.ResetRead(); \\\n\t\t\treturn true; \\\n\t\t} \\\n\t} while (false)\n\n#define HANDLE_SERVER_READ(Proc) \\\n\tdo { \\\n\t\tif (!Proc) \\\n\t\t{ \\\n\t\t\tm_ServerBuffer.ResetRead(); \\\n\t\t\treturn true; \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\ntypedef unsigned char Byte;\n\n\n\n\n// fwd declarations, to avoid clang warnings:\nAString PrintableAbsIntTriplet(int a_X, int a_Y, int a_Z, double a_Divisor = 32);\n\n\n\n\n\nAString PrintableAbsIntTriplet(int a_X, int a_Y, int a_Z, double a_Divisor)\n{\n\treturn fmt::format(\n\t\tFMT_STRING(\"<{}, {}, {}> ~ {{{}, {}, {}}}\"),\n\t\ta_X, a_Y, a_Z,\n\t\tstatic_cast<double>(a_X) / a_Divisor, static_cast<double>(a_Y) / a_Divisor, static_cast<double>(a_Z) / a_Divisor\n\t);\n}\n\n\n\n\n\nstruct sCoords\n{\n\tint x, y, z;\n\n\tsCoords(int a_X, int a_Y, int a_Z) : x(a_X), y(a_Y), z(a_Z) {}\n} ;\n\n\n\n\n\nstruct sChunkMeta\n{\n\tint m_ChunkX, m_ChunkZ;\n\tshort m_PrimaryBitmap;\n\tshort m_AddBitmap;\n\tsChunkMeta(int a_ChunkX, int a_ChunkZ, short a_PrimaryBitmap, short a_AddBitmap) :\n\t\tm_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ), m_PrimaryBitmap(a_PrimaryBitmap), m_AddBitmap(a_AddBitmap)\n\t{\n\t}\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cConnection:\n\ncConnection::cConnection(SOCKET a_ClientSocket, cServer & a_Server) :\n\tm_ItemIdx(0),\n\tm_LogFile(nullptr),\n\tm_Server(a_Server),\n\tm_ClientSocket(a_ClientSocket),\n\tm_ServerSocket(-1),\n\tm_BeginTick(std::chrono::steady_clock::now()),\n\tm_ClientState(csUnencrypted),\n\tm_ServerState(csUnencrypted),\n\tm_Nonce(0),\n\tm_ClientBuffer(1024 KiB),\n\tm_ServerBuffer(1024 KiB),\n\tm_HasClientPinged(false),\n\tm_ServerProtocolState(-1),\n\tm_ClientProtocolState(-1),\n\tm_IsServerEncrypted(false)\n{\n\t// Create the Logs subfolder, if not already created:\n\t#if defined(_WIN32)\n\t\t_mkdir(\"Logs\");\n\t#else\n\t\tmkdir(\"Logs\", 0777);\n\t#endif\n\n\tm_LogNameBase = fmt::format(FMT_STRING(\"Logs/Log_{}_{}\"), time(nullptr), a_ClientSocket);\n\tAString fnam(m_LogNameBase);\n\tfnam.append(\".log\");\n\t#ifdef _WIN32\n\t\tfopen_s(&m_LogFile, fnam.c_str(), \"w\");\n\t#else\n\t\tm_LogFile = fopen(fnam.c_str(), \"w\");\n\t#endif\n\tLog(\"Log file created\");\n\tfmt::print(FMT_STRING(\"Connection is logged to file \\\"{}\\\"\\n\"), fnam);\n}\n\n\n\n\n\ncConnection::~cConnection()\n{\n\tfclose(m_LogFile);\n}\n\n\n\n\n\nvoid cConnection::Run(void)\n{\n\tif (!ConnectToServer())\n\t{\n\t\tLog(\"Cannot connect to server; aborting\");\n\t\treturn;\n\t}\n\n\twhile (true)\n\t{\n\t\tfd_set ReadFDs;\n\t\tFD_ZERO(&ReadFDs);\n\t\tFD_SET(m_ServerSocket, &ReadFDs);\n\t\tFD_SET(m_ClientSocket, &ReadFDs);\n\t\tSOCKET MaxSocket = std::max(m_ServerSocket, m_ClientSocket);\n\t\tint res = select(MaxSocket + 1, &ReadFDs, nullptr, nullptr, nullptr);\n\t\tif (res <= 0)\n\t\t{\n\t\t\tprintf(\"select() failed: %d; aborting client\", SocketError);\n\t\t\tbreak;\n\t\t}\n\t\tif (FD_ISSET(m_ServerSocket, &ReadFDs))\n\t\t{\n\t\t\tif (!RelayFromServer())\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (FD_ISSET(m_ClientSocket, &ReadFDs))\n\t\t{\n\t\t\tif (!RelayFromClient())\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tLog(\"Relaying ended, closing sockets\");\n\tclosesocket(m_ServerSocket);\n\tclosesocket(m_ClientSocket);\n}\n\n\n\n\n\nvoid cConnection::vLog(const char * a_Format, fmt::printf_args a_ArgList)\n{\n\t// Log to file:\n\tcCSLock Lock(m_CSLog);\n\tfmt::fprintf(m_LogFile, \"[%5.3f] \", GetRelativeTime());\n\tfmt::vfprintf(m_LogFile, a_Format, a_ArgList);\n\tfmt::fprintf(m_LogFile, \"\\n\");\n\t#ifdef _DEBUG\n\t\tfflush(m_LogFile);\n\t#endif  // _DEBUG\n\n\t// Log to screen:\n\t// std::cout << FullMsg;\n}\n\n\n\n\n\nvoid cConnection::vDataLog(const void * a_Data, size_t a_Size, const char * a_Format, fmt::printf_args a_ArgList)\n{\n\tAString Hex;\n\tCreateHexDump(Hex, a_Data, a_Size, 16);\n\n\t// Log to file:\n\tcCSLock Lock(m_CSLog);\n\tfmt::fprintf(m_LogFile, \"[%5.3f] \", GetRelativeTime());\n\tfmt::vfprintf(m_LogFile, a_Format, a_ArgList);\n\tfmt::fprintf(m_LogFile, \"\\n%s\\n\", Hex);\n\n\t// Log to screen:\n\t// std::cout << FullMsg;\n}\n\n\n\n\n\nvoid cConnection::LogFlush(void)\n{\n\tfflush(m_LogFile);\n}\n\n\n\n\n\nbool cConnection::ConnectToServer(void)\n{\n\tm_ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n\tif (m_ServerSocket == INVALID_SOCKET)\n\t{\n\t\treturn false;\n\t}\n\tsockaddr_in localhost;\n\tlocalhost.sin_family = AF_INET;\n\tlocalhost.sin_port = htons(m_Server.GetConnectPort());\n\tlocalhost.sin_addr.s_addr = htonl(0x7f000001);  // localhost\n\tif (connect(m_ServerSocket, reinterpret_cast<const sockaddr *>(&localhost), sizeof(localhost)) != 0)\n\t{\n\t\tprintf(\"connection to server failed: %d\\n\", SocketError);\n\t\treturn false;\n\t}\n\tLog(\"Connected to SERVER\");\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::RelayFromServer(void)\n{\n\tchar Buffer[64 KiB];\n\tint res = static_cast<int>(recv(m_ServerSocket, Buffer, sizeof(Buffer), 0));  // recv returns int on windows, ssize_t on linux\n\tif (res <= 0)\n\t{\n\t\tLog(\"Server closed the socket: %d; %d; aborting connection\", res, SocketError);\n\t\treturn false;\n\t}\n\n\tDataLog(Buffer, static_cast<size_t>(res), \"Received %d bytes from the SERVER\", res);\n\n\tswitch (m_ServerState)\n\t{\n\t\tcase csUnencrypted:\n\t\tcase csWaitingForEncryption:\n\t\t{\n\t\t\treturn DecodeServersPackets(Buffer, res);\n\t\t}\n\t\tcase csEncryptedUnderstood:\n\t\t{\n\t\t\tm_ServerDecryptor.ProcessData(reinterpret_cast<std::byte *>(Buffer), static_cast<size_t>(res));\n\t\t\tDataLog(Buffer, static_cast<size_t>(res), \"Decrypted %d bytes from the SERVER\", res);\n\t\t\treturn DecodeServersPackets(Buffer, res);\n\t\t}\n\t\tcase csEncryptedUnknown:\n\t\t{\n\t\t\tm_ServerDecryptor.ProcessData(reinterpret_cast<std::byte *>(Buffer), static_cast<size_t>(res));\n\t\t\tDataLog(Buffer, static_cast<size_t>(res), \"Decrypted %d bytes from the SERVER\", res);\n\t\t\treturn CLIENTSEND({ reinterpret_cast<const std::byte *>(Buffer), static_cast<size_t>(res) });\n\t\t}\n\t}\n\tASSERT(!\"Unhandled server state while relaying from server\");\n\treturn false;\n}\n\n\n\n\n\nbool cConnection::RelayFromClient(void)\n{\n\tchar Buffer[64 KiB];\n\tint res = static_cast<int>(recv(m_ClientSocket, Buffer, sizeof(Buffer), 0));  // recv returns int on Windows, ssize_t on Linux\n\tif (res <= 0)\n\t{\n\t\tLog(\"Client closed the socket: %d; %d; aborting connection\", res, SocketError);\n\t\treturn false;\n\t}\n\n\tDataLog(Buffer, static_cast<size_t>(res), \"Received %d bytes from the CLIENT\", res);\n\n\tswitch (m_ClientState)\n\t{\n\t\tcase csUnencrypted:\n\t\tcase csWaitingForEncryption:\n\t\t{\n\t\t\treturn DecodeClientsPackets(Buffer, res);\n\t\t}\n\t\tcase csEncryptedUnderstood:\n\t\t{\n\t\t\treturn DecodeClientsPackets(Buffer, res);\n\t\t}\n\t\tcase csEncryptedUnknown:\n\t\t{\n\t\t\tDataLog(Buffer, static_cast<size_t>(res), \"Decrypted %d bytes from the CLIENT\", res);\n\t\t\tm_ServerEncryptor.ProcessData(reinterpret_cast<std::byte *>(Buffer), static_cast<size_t>(res));\n\t\t\treturn SERVERSEND({ reinterpret_cast<const std::byte *>(Buffer), static_cast<size_t>(res) });\n\t\t}\n\t}\n\tASSERT(!\"Unhandled server state while relaying from client\");\n\treturn false;\n}\n\n\n\n\n\ndouble cConnection::GetRelativeTime(void)\n{\n\tInt64 msec = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - m_BeginTick).count();\n\treturn static_cast<double>(msec) / 1000;\n}\n\n\n\n\n\nbool cConnection::SendData(SOCKET a_Socket, const ContiguousByteBufferView a_Data, const char * a_Peer)\n{\n\tDataLog(a_Data.data(), a_Data.size(), \"Sending data to %s, %zu bytes\", a_Peer, a_Data.size());\n\n\tint res = static_cast<int>(send(a_Socket, reinterpret_cast<const char *>(a_Data.data()), a_Data.size(), 0));  // Windows uses int for a_Size, Linux uses size_t; but Windows doesn't complain. Return type is int on Windows and ssize_t on Linux\n\tif (res <= 0)\n\t{\n\t\tLog(\"%s closed the socket: %d, %d; aborting connection\", a_Peer, res, SocketError);\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::SendData(SOCKET a_Socket, cByteBuffer & a_Data, const char * a_Peer)\n{\n\tContiguousByteBuffer All;\n\ta_Data.ReadAll(All);\n\ta_Data.CommitRead();\n\treturn SendData(a_Socket, All, a_Peer);\n}\n\n\n\n\n\nbool cConnection::SendEncryptedData(SOCKET a_Socket, cAesCfb128Encryptor & a_Encryptor, ContiguousByteBuffer & a_Data, const char * a_Peer)\n{\n\tDataLog(a_Data.data(), a_Data.size(), \"Encrypting %zu bytes to %s\", a_Data.size(), a_Peer);\n\n\ta_Encryptor.ProcessData(a_Data.data(), a_Data.size());\n\treturn SendData(a_Socket, a_Data, a_Peer);\n}\n\n\n\n\n\nbool cConnection::SendEncryptedData(SOCKET a_Socket, cAesCfb128Encryptor & a_Encryptor, cByteBuffer & a_Data, const char * a_Peer)\n{\n\tContiguousByteBuffer All;\n\ta_Data.ReadAll(All);\n\ta_Data.CommitRead();\n\treturn SendEncryptedData(a_Socket, a_Encryptor, All, a_Peer);\n}\n\n\n\n\n\nbool cConnection::DecodeClientsPackets(const char * a_Data, int a_Size)\n{\n\tif (!m_ClientBuffer.Write(a_Data, static_cast<size_t>(a_Size)))\n\t{\n\t\tLog(\"Too much queued data for the server, aborting connection\");\n\t\treturn false;\n\t}\n\n\twhile (m_ClientBuffer.CanReadBytes(1))\n\t{\n\t\tUInt32 PacketLen;\n\t\tif (\n\t\t\t!m_ClientBuffer.ReadVarInt(PacketLen) ||\n\t\t\t!m_ClientBuffer.CanReadBytes(PacketLen)\n\t\t)\n\t\t{\n\t\t\t// Not a complete packet yet\n\t\t\tbreak;\n\t\t}\n\t\tUInt32 PacketType, PacketReadSoFar;\n\t\tPacketReadSoFar = static_cast<UInt32>(m_ClientBuffer.GetReadableSpace());\n\t\tVERIFY(m_ClientBuffer.ReadVarInt(PacketType));\n\t\tPacketReadSoFar -= m_ClientBuffer.GetReadableSpace();\n\t\tLog(\"Decoding client's packets, there are now %u bytes in the queue; next packet is 0x%02x, %u bytes long\",\n\t\t\tstatic_cast<unsigned>(m_ClientBuffer.GetReadableSpace()), PacketType, PacketLen\n\t\t);\n\t\tswitch (m_ClientProtocolState)\n\t\t{\n\t\t\tcase -1:\n\t\t\t{\n\t\t\t\t// No initial handshake received yet\n\t\t\t\tswitch (PacketType)\n\t\t\t\t{\n\t\t\t\t\tcase 0x00: HANDLE_CLIENT_READ(HandleClientHandshake()); break;\n\t\t\t\t\tdefault:   HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}  // case -1\n\n\t\t\tcase 1:\n\t\t\t{\n\t\t\t\t// Status query\n\t\t\t\tswitch (PacketType)\n\t\t\t\t{\n\t\t\t\t\tcase 0x00: HANDLE_CLIENT_READ(HandleClientStatusRequest()); break;\n\t\t\t\t\tcase 0x01: HANDLE_CLIENT_READ(HandleClientStatusPing()); break;\n\t\t\t\t\tdefault:   HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 2:\n\t\t\t{\n\t\t\t\t// Login\n\t\t\t\tswitch (PacketType)\n\t\t\t\t{\n\t\t\t\t\tcase 0x00: HANDLE_CLIENT_READ(HandleClientLoginStart()); break;\n\t\t\t\t\tcase 0x01: HANDLE_CLIENT_READ(HandleClientLoginEncryptionKeyResponse()); break;\n\t\t\t\t\tdefault:   HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 3:\n\t\t\t{\n\t\t\t\t// Game:\n\t\t\t\tswitch (PacketType)\n\t\t\t\t{\n\t\t\t\t\tcase 0x00: HANDLE_CLIENT_READ(HandleClientKeepAlive()); break;\n\t\t\t\t\tcase 0x01: HANDLE_CLIENT_READ(HandleClientChatMessage()); break;\n\t\t\t\t\tcase 0x02: HANDLE_CLIENT_READ(HandleClientUseEntity()); break;\n\t\t\t\t\tcase 0x03: HANDLE_CLIENT_READ(HandleClientPlayerOnGround()); break;\n\t\t\t\t\tcase 0x04: HANDLE_CLIENT_READ(HandleClientPlayerPosition()); break;\n\t\t\t\t\tcase 0x05: HANDLE_CLIENT_READ(HandleClientPlayerLook()); break;\n\t\t\t\t\tcase 0x06: HANDLE_CLIENT_READ(HandleClientPlayerPositionLook()); break;\n\t\t\t\t\tcase 0x07: HANDLE_CLIENT_READ(HandleClientBlockDig()); break;\n\t\t\t\t\tcase 0x08: HANDLE_CLIENT_READ(HandleClientBlockPlace()); break;\n\t\t\t\t\tcase 0x09: HANDLE_CLIENT_READ(HandleClientSlotSelect()); break;\n\t\t\t\t\tcase 0x0a: HANDLE_CLIENT_READ(HandleClientAnimation()); break;\n\t\t\t\t\tcase 0x0b: HANDLE_CLIENT_READ(HandleClientEntityAction()); break;\n\t\t\t\t\tcase 0x0d: HANDLE_CLIENT_READ(HandleClientWindowClose()); break;\n\t\t\t\t\tcase 0x0e: HANDLE_CLIENT_READ(HandleClientWindowClick()); break;\n\t\t\t\t\tcase 0x10: HANDLE_CLIENT_READ(HandleClientCreativeInventoryAction()); break;\n\t\t\t\t\tcase 0x12: HANDLE_CLIENT_READ(HandleClientUpdateSign()); break;\n\t\t\t\t\tcase 0x13: HANDLE_CLIENT_READ(HandleClientPlayerAbilities()); break;\n\t\t\t\t\tcase 0x14: HANDLE_CLIENT_READ(HandleClientTabCompletion()); break;\n\t\t\t\t\tcase 0x15: HANDLE_CLIENT_READ(HandleClientLocaleAndView()); break;\n\t\t\t\t\tcase 0x16: HANDLE_CLIENT_READ(HandleClientClientStatuses()); break;\n\t\t\t\t\tcase 0x17: HANDLE_CLIENT_READ(HandleClientPluginMessage()); break;\n\t\t\t\t\tdefault:   HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}  // case 3 - Game\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLog(\"Receiving server packets while in an unknown protocol state (%d)!\", m_ClientProtocolState);\n\t\t\t\tHANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (m_ProtocolState)\n\t\tm_ClientBuffer.CommitRead();\n\t}  // while (true)\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::DecodeServersPackets(const char * a_Data, int a_Size)\n{\n\tif (!m_ServerBuffer.Write(a_Data, static_cast<size_t>(a_Size)))\n\t{\n\t\tLog(\"Too much queued data for the client, aborting connection\");\n\t\treturn false;\n\t}\n\n\tif (\n\t\t(m_ServerState == csEncryptedUnderstood) &&\n\t\t(m_ClientState == csUnencrypted)\n\t)\n\t{\n\t\t// Client hasn't finished encryption handshake yet, don't send them any data yet\n\t}\n\n\twhile (true)\n\t{\n\t\tUInt32 PacketLen;\n\t\tif (\n\t\t\t!m_ServerBuffer.ReadVarInt(PacketLen) ||\n\t\t\t!m_ServerBuffer.CanReadBytes(PacketLen)\n\t\t)\n\t\t{\n\t\t\t// Not a complete packet yet\n\t\t\tm_ServerBuffer.ResetRead();\n\t\t\tbreak;\n\t\t}\n\t\tif (PacketLen == 0)\n\t\t{\n\t\t\tm_ServerBuffer.ResetRead();\n\t\t\tContiguousByteBuffer All;\n\t\t\tm_ServerBuffer.ReadAll(All);\n\t\t\tDataLog(All.data(), All.size(), \"====== Received a bad packet length? Inspect the contents below ======\");\n\t\t\tm_ServerBuffer.CommitRead();  // Try to recover by marking everything as read\n\t\t\tbreak;\n\t\t}\n\t\tUInt32 PacketType, PacketReadSoFar;\n\t\tPacketReadSoFar = static_cast<UInt32>(m_ServerBuffer.GetReadableSpace());\n\t\tVERIFY(m_ServerBuffer.ReadVarInt(PacketType));\n\t\tPacketReadSoFar -= m_ServerBuffer.GetReadableSpace();\n\t\tLog(\"Decoding server's packets, there are now %d bytes in the queue; next packet is 0x%0x, %u bytes long\", m_ServerBuffer.GetReadableSpace(), PacketType, PacketLen);\n\t\tLogFlush();\n\t\tswitch (m_ServerProtocolState)\n\t\t{\n\t\t\tcase -1:\n\t\t\t{\n\t\t\t\tLog(\"Receiving data from the server without an initial handshake message!\");\n\t\t\t\tHANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 1:\n\t\t\t{\n\t\t\t\t// Status query:\n\t\t\t\tswitch (PacketType)\n\t\t\t\t{\n\t\t\t\t\tcase 0x00: HANDLE_SERVER_READ(HandleServerStatusResponse()); break;\n\t\t\t\t\tcase 0x01: HANDLE_SERVER_READ(HandleServerStatusPing());     break;\n\t\t\t\t\tdefault:   HANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 2:\n\t\t\t{\n\t\t\t\t// Login:\n\t\t\t\tswitch (PacketType)\n\t\t\t\t{\n\t\t\t\t\tcase 0x00: HANDLE_SERVER_READ(HandleServerLoginDisconnect()); break;\n\t\t\t\t\tcase 0x01: HANDLE_SERVER_READ(HandleServerLoginEncryptionKeyRequest()); break;\n\t\t\t\t\tcase 0x02: HANDLE_SERVER_READ(HandleServerLoginSuccess()); break;\n\t\t\t\t\tdefault:   HANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 3:\n\t\t\t{\n\t\t\t\t// Game:\n\t\t\t\tswitch (PacketType)\n\t\t\t\t{\n\t\t\t\t\tcase 0x00: HANDLE_SERVER_READ(HandleServerKeepAlive()); break;\n\t\t\t\t\tcase 0x01: HANDLE_SERVER_READ(HandleServerJoinGame()); break;\n\t\t\t\t\tcase 0x02: HANDLE_SERVER_READ(HandleServerChatMessage()); break;\n\t\t\t\t\tcase 0x03: HANDLE_SERVER_READ(HandleServerTimeUpdate()); break;\n\t\t\t\t\tcase 0x04: HANDLE_SERVER_READ(HandleServerEntityEquipment()); break;\n\t\t\t\t\tcase 0x05: HANDLE_SERVER_READ(HandleServerCompass()); break;\n\t\t\t\t\tcase 0x06: HANDLE_SERVER_READ(HandleServerUpdateHealth()); break;\n\t\t\t\t\tcase 0x07: HANDLE_SERVER_READ(HandleServerRespawn()); break;\n\t\t\t\t\tcase 0x08: HANDLE_SERVER_READ(HandleServerPlayerPositionLook()); break;\n\t\t\t\t\tcase 0x09: HANDLE_SERVER_READ(HandleServerSlotSelect()); break;\n\t\t\t\t\tcase 0x0a: HANDLE_SERVER_READ(HandleServerUseBed()); break;\n\t\t\t\t\tcase 0x0b: HANDLE_SERVER_READ(HandleServerPlayerAnimation()); break;\n\t\t\t\t\tcase 0x0c: HANDLE_SERVER_READ(HandleServerSpawnNamedEntity()); break;\n\t\t\t\t\tcase 0x0d: HANDLE_SERVER_READ(HandleServerCollectPickup()); break;\n\t\t\t\t\tcase 0x0e: HANDLE_SERVER_READ(HandleServerSpawnObjectVehicle()); break;\n\t\t\t\t\tcase 0x0f: HANDLE_SERVER_READ(HandleServerSpawnMob()); break;\n\t\t\t\t\tcase 0x10: HANDLE_SERVER_READ(HandleServerSpawnPainting()); break;\n\t\t\t\t\tcase 0x11: HANDLE_SERVER_READ(HandleServerSpawnExperienceOrbs()); break;\n\t\t\t\t\tcase 0x12: HANDLE_SERVER_READ(HandleServerEntityVelocity()); break;\n\t\t\t\t\tcase 0x13: HANDLE_SERVER_READ(HandleServerDestroyEntities()); break;\n\t\t\t\t\tcase 0x14: HANDLE_SERVER_READ(HandleServerEntity()); break;\n\t\t\t\t\tcase 0x15: HANDLE_SERVER_READ(HandleServerEntityRelativeMove()); break;\n\t\t\t\t\tcase 0x16: HANDLE_SERVER_READ(HandleServerEntityLook()); break;\n\t\t\t\t\tcase 0x17: HANDLE_SERVER_READ(HandleServerEntityRelativeMoveLook()); break;\n\t\t\t\t\tcase 0x18: HANDLE_SERVER_READ(HandleServerEntityTeleport()); break;\n\t\t\t\t\tcase 0x19: HANDLE_SERVER_READ(HandleServerEntityHeadLook()); break;\n\t\t\t\t\tcase 0x1a: HANDLE_SERVER_READ(HandleServerEntityStatus()); break;\n\t\t\t\t\tcase 0x1b: HANDLE_SERVER_READ(HandleServerAttachEntity()); break;\n\t\t\t\t\tcase 0x1c: HANDLE_SERVER_READ(HandleServerEntityMetadata()); break;\n\t\t\t\t\tcase 0x1f: HANDLE_SERVER_READ(HandleServerSetExperience()); break;\n\t\t\t\t\tcase 0x20: HANDLE_SERVER_READ(HandleServerEntityProperties()); break;\n\t\t\t\t\tcase 0x21: HANDLE_SERVER_READ(HandleServerMapChunk()); break;\n\t\t\t\t\tcase 0x22: HANDLE_SERVER_READ(HandleServerMultiBlockChange()); break;\n\t\t\t\t\tcase 0x23: HANDLE_SERVER_READ(HandleServerBlockChange()); break;\n\t\t\t\t\tcase 0x24: HANDLE_SERVER_READ(HandleServerBlockAction()); break;\n\t\t\t\t\tcase 0x26: HANDLE_SERVER_READ(HandleServerMapChunkBulk()); break;\n\t\t\t\t\tcase 0x27: HANDLE_SERVER_READ(HandleServerExplosion()); break;\n\t\t\t\t\tcase 0x28: HANDLE_SERVER_READ(HandleServerSoundEffect()); break;\n\t\t\t\t\tcase 0x29: HANDLE_SERVER_READ(HandleServerNamedSoundEffect()); break;\n\t\t\t\t\tcase 0x2b: HANDLE_SERVER_READ(HandleServerChangeGameState()); break;\n\t\t\t\t\tcase 0x2d: HANDLE_SERVER_READ(HandleServerWindowOpen()); break;\n\t\t\t\t\tcase 0x2e: HANDLE_SERVER_READ(HandleServerWindowClose()); break;\n\t\t\t\t\tcase 0x2f: HANDLE_SERVER_READ(HandleServerSetSlot()); break;\n\t\t\t\t\tcase 0x30: HANDLE_SERVER_READ(HandleServerWindowContents()); break;\n\t\t\t\t\tcase 0x33: HANDLE_SERVER_READ(HandleServerUpdateSign()); break;\n\t\t\t\t\tcase 0x35: HANDLE_SERVER_READ(HandleServerUpdateTileEntity()); break;\n\t\t\t\t\tcase 0x37: HANDLE_SERVER_READ(HandleServerStatistics()); break;\n\t\t\t\t\tcase 0x38: HANDLE_SERVER_READ(HandleServerPlayerListItem()); break;\n\t\t\t\t\tcase 0x39: HANDLE_SERVER_READ(HandleServerPlayerAbilities()); break;\n\t\t\t\t\tcase 0x3a: HANDLE_SERVER_READ(HandleServerTabCompletion()); break;\n\t\t\t\t\tcase 0x3f: HANDLE_SERVER_READ(HandleServerPluginMessage()); break;\n\t\t\t\t\tcase 0x40: HANDLE_SERVER_READ(HandleServerKick()); break;\n\t\t\t\t\tdefault:   HANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;\n\t\t\t\t}  // switch (PacketType)\n\t\t\t\tbreak;\n\t\t\t}  // case 3 - Game\n\n\t\t\t// TODO: Move this elsewhere\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLog(\"Received a packet from the server while in an unknown state: %d\", m_ServerProtocolState);\n\t\t\t\tHANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (m_ProtocolState)\n\n\t\tm_ServerBuffer.CommitRead();\n\t}  // while (CanReadBytes(1))\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// packet handling, client-side, initial handshake:\n\nbool cConnection::HandleClientHandshake(void)\n{\n\t// Read the packet from the client:\n\tHANDLE_CLIENT_PACKET_READ(ReadVarInt,        UInt32,  ProtocolVersion);\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, ServerHost);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt16,      UInt16,  ServerPort);\n\tHANDLE_CLIENT_PACKET_READ(ReadVarInt,        UInt32,  NextState);\n\tm_ClientBuffer.CommitRead();\n\n\tLog(\"Received an initial handshake packet from the client:\");\n\tLog(\"  ProtocolVersion = %u\", ProtocolVersion);\n\tLog(\"  ServerHost = \\\"%s\\\"\", ServerHost.c_str());\n\tLog(\"  ServerPort = %u\", ServerPort);\n\tLog(\"  NextState = %u\", NextState);\n\n\t// Send the same packet to the server, but with our port:\n\tcByteBuffer Packet(512);\n\tPacket.WriteVarInt32(0);  // Packet type - initial handshake\n\tPacket.WriteVarInt32(ProtocolVersion);\n\tPacket.WriteVarUTF8String(ServerHost);\n\tPacket.WriteBEUInt16(m_Server.GetConnectPort());\n\tPacket.WriteVarInt32(NextState);\n\tContiguousByteBuffer Pkt;\n\tPacket.ReadAll(Pkt);\n\tcByteBuffer ToServer(512);\n\tToServer.WriteVarInt32(static_cast<UInt32>(Pkt.size()));\n\tToServer.Write(Pkt.data(), Pkt.size());\n\tSERVERSEND(ToServer);\n\n\tm_ClientProtocolState = static_cast<int>(NextState);\n\tm_ServerProtocolState = static_cast<int>(NextState);\n\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// packet handling, client-side, login:\n\nbool cConnection::HandleClientLoginEncryptionKeyResponse(void)\n{\n\tLog(\"Client: Unexpected packet: encryption key response\");\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientLoginStart(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, UserName);\n\tLog(\"Received a login start packet from the client:\");\n\tLog(\"  Username = \\\"%s\\\"\", UserName.c_str());\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// packet handling, client-side, game:\n\nbool cConnection::HandleClientAnimation(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt8,   Int8,   Animation);\n\tLog(\"Received a PACKET_ANIMATION from the client:\");\n\tLog(\"  EntityID: %u\", EntityID);\n\tLog(\"  Animation: %d\", Animation);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientBlockDig(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, Status);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32, Int32, BlockX);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, BlockY);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32, Int32, BlockZ);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, BlockFace);\n\tLog(\"Received a PACKET_BLOCK_DIG from the client:\");\n\tLog(\"  Status = %u (0x%02x)\", Status, Status);\n\tLog(\"  Pos = <%d, %u, %d>\", BlockX, BlockY, BlockZ);\n\tLog(\"  BlockFace = %u (0x%02x)\", BlockFace, BlockFace);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientBlockPlace(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32, Int32, BlockX);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, BlockY);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32, Int32, BlockZ);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, Face);\n\tAString Desc;\n\tif (!ParseSlot(m_ClientBuffer, Desc))\n\t{\n\t\treturn false;\n\t}\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, CursorX);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, CursorY);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, CursorZ);\n\tLog(\"Received a PACKET_BLOCK_PLACE from the client:\");\n\tLog(\"  Block = {%d, %u, %d}\", BlockX, BlockY, BlockZ);\n\tLog(\"  Face = %u (0x%02x)\", Face, Face);\n\tLog(\"  Item = %s\", Desc.c_str());\n\tLog(\"  Cursor = <%u, %u, %u>\", CursorX, CursorY, CursorZ);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientChatMessage(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Message);\n\tLog(\"Received a PACKET_CHAT_MESSAGE from the client:\");\n\tLog(\"  Message = \\\"%s\\\"\", Message.c_str());\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientClientStatuses(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, Statuses);\n\tLog(\"Received a PACKET_CLIENT_STATUSES from the CLIENT:\");\n\tLog(\"  Statuses = %u (0x%02x)\", Statuses, Statuses);\n\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientCreativeInventoryAction(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt16, UInt16, SlotNum);\n\tAString Item;\n\tif (!ParseSlot(m_ClientBuffer, Item))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_CREATIVE_INVENTORY_ACTION from the client:\");\n\tLog(\"  SlotNum = %u\", SlotNum);\n\tLog(\"  Item = %s\", Item.c_str());\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientDisconnect(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Reason);\n\tLog(\"Received a PACKET_DISCONNECT from the client:\");\n\tLog(\"  Reason = \\\"%s\\\"\", Reason.c_str());\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientEntityAction(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32, Int32, PlayerID);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, ActionType);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32, Int32, HorseJumpBoost);\n\tLog(\"Received a PACKET_ENTITY_ACTION from the client:\");\n\tLog(\"  PlayerID = %d\", PlayerID);\n\tLog(\"  ActionType = %u\", ActionType);\n\tLog(\"  HorseJumpBoost = %d (0x%08x)\", HorseJumpBoost, HorseJumpBoost);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientKeepAlive(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32, Int32, ID);\n\tLog(\"Received a PACKET_KEEPALIVE from the client\");\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientLocaleAndView(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Locale);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt8,        Int8,    ViewDistance);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt8,        Int8,    ChatFlags);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt8,        Int8,    Unused);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt8,        Int8,    Difficulty);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt8,        Int8,    ShowCape);\n\tLog(\"Received a PACKET_LOCALE_AND_VIEW from the client\");\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientPing(void)\n{\n\tm_HasClientPinged = true;\n\tLog(\"Received a PACKET_PING from the client\");\n\tm_ClientBuffer.ResetRead();\n\tSERVERSEND(m_ClientBuffer);\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientPlayerAbilities(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, Flags);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, FlyingSpeed);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, WalkingSpeed);\n\tLog(\"Receives a PACKET_PLAYER_ABILITIES from the client:\");\n\tLog(\"  Flags = %u (0x%02x)\", Flags, Flags);\n\tLog(\"  FlyingSpeed = %f\", FlyingSpeed);\n\tLog(\"  WalkingSpeed = %f\", WalkingSpeed);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientPlayerLook(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, Yaw);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, Pitch);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, OnGround);\n\tLog(\"Received a PACKET_PLAYER_LOOK from the client\");\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientPlayerOnGround(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, OnGround);\n\tLog(\"Received a PACKET_PLAYER_ON_GROUND from the client\");\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientPlayerPosition(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosX);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosY);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, Stance);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosZ);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8,  UInt8,  IsOnGround);\n\tLog(\"Received a PACKET_PLAYER_POSITION from the client\");\n\n\t// TODO: list packet contents\n\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientPlayerPositionLook(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosX);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosY);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, Stance);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosZ);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEFloat,  float,  Yaw);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEFloat,  float,  Pitch);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8,  UInt8,  IsOnGround);\n\tLog(\"Received a PACKET_PLAYER_POSITION_LOOK from the client\");\n\tLog(\"  Pos = {%.03f, %.03f, %.03f}\", PosX, PosY, PosZ);\n\tLog(\"  Stance = %.03f\", Stance);\n\tLog(\"  Yaw, Pitch = <%.03f, %.03f>\", Yaw, Pitch);\n\tLog(\"  IsOnGround = %s\", IsOnGround ? \"true\" : \"false\");\n\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientPluginMessage(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, ChannelName);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt16,      UInt16,  Length);\n\tContiguousByteBuffer Data;\n\tif (!m_ClientBuffer.ReadSome(Data, Length))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_PLUGIN_MESSAGE from the client\");\n\tLog(\"  ChannelName = \\\"%s\\\"\", ChannelName.c_str());\n\tDataLog(Data.data(), Length, \"  Data: %u bytes\", Length);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientSlotSelect(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt16, Int16, SlotNum);\n\tLog(\"Received a PACKET_SLOT_SELECT from the client\");\n\tLog(\"  SlotNum = %d\", SlotNum);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientStatusPing(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt64, Int64, Time);\n\tLog(\"Received the status ping packet from the client:\");\n\tLog(\"  Time = %lld\", Time);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientStatusRequest(void)\n{\n\tLog(\"Received the status request packet from the client\");\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientTabCompletion(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Query);\n\tLog(\"Received a PACKET_TAB_COMPLETION query from the client\");\n\tLog(\"  Query = \\\"%s\\\"\", Query.c_str());\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientUpdateSign(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32,       Int32,   BlockX);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt16,       Int16,   BlockY);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEInt32,       Int32,   BlockZ);\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line1);\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line2);\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line3);\n\tHANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line4);\n\tLog(\"Received a PACKET_UPDATE_SIGN from the client:\");\n\tLog(\"  Block = {%d, %d, %d}\", BlockX, BlockY, BlockZ);\n\tLog(\"  Lines = \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\"\", Line1.c_str(), Line2.c_str(), Line3.c_str(), Line4.c_str());\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientUseEntity(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8,  UInt8,  MouseButton);\n\tLog(\"Received a PACKET_USE_ENTITY from the client:\");\n\tLog(\"  EntityID = %d\", EntityID);\n\tLog(\"  MouseButton = %u\", MouseButton);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientWindowClick(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8,  UInt8,  WindowID);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt16, UInt16, SlotNum);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8,  UInt8,  Button);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt16, UInt16, TransactionID);\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8,  UInt8,  Mode);\n\tAString Item;\n\tif (!ParseSlot(m_ClientBuffer, Item))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_WINDOW_CLICK from the client\");\n\tLog(\"  WindowID = %u\", WindowID);\n\tLog(\"  SlotNum = %u\", SlotNum);\n\tLog(\"  Button = %u, Mode = %u\", Button, Mode);\n\tLog(\"  TransactionID = 0x%x\", TransactionID);\n\tLog(\"  ClickedItem = %s\", Item.c_str());\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientWindowClose(void)\n{\n\tHANDLE_CLIENT_PACKET_READ(ReadBEUInt8, UInt8, WindowID);\n\tLog(\"Received a PACKET_WINDOW_CLOSE from the client:\");\n\tLog(\"  WindowID = %u\", WindowID);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleClientUnknownPacket(UInt32 a_PacketType, UInt32 a_PacketLen, UInt32 a_PacketReadSoFar)\n{\n\tContiguousByteBuffer Data;\n\tif (!m_ClientBuffer.ReadSome(Data, a_PacketLen - a_PacketReadSoFar))\n\t{\n\t\treturn false;\n\t}\n\tDataLog(Data.data(), Data.size(), \"****************** Unknown packet 0x%x from the client; relaying and ignoring\", a_PacketType);\n\tCOPY_TO_SERVER();\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// packet handling, server-side, login:\n\nbool cConnection::HandleServerLoginDisconnect(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Reason);\n\tLog(\"Received a login-disconnect packet from the server:\");\n\tLog(\"  Reason = \\\"%s\\\"\", Reason.c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerLoginEncryptionKeyRequest(void)\n{\n\t// Read the packet from the server:\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, ServerID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16,      UInt16,  PublicKeyLength);\n\tContiguousByteBuffer PublicKey;\n\tif (!m_ServerBuffer.ReadSome(PublicKey, PublicKeyLength))\n\t{\n\t\treturn false;\n\t}\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, NonceLength);\n\tContiguousByteBuffer Nonce;\n\tif (!m_ServerBuffer.ReadSome(Nonce, NonceLength))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Got PACKET_ENCRYPTION_KEY_REQUEST from the SERVER:\");\n\tLog(\"  ServerID = %s\", ServerID.c_str());\n\tDataLog(PublicKey.data(), PublicKey.size(), \"  Public key (%u bytes)\", static_cast<unsigned>(PublicKey.size()));\n\n\t// Reply to the server:\n\tSendEncryptionKeyResponse({ reinterpret_cast<const char *>(PublicKey.data()), PublicKey.size() }, { reinterpret_cast<const char *>(Nonce.data()), Nonce.size() });\n\n\t// Do not send to client - we want the client connection open\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerLoginSuccess(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, UUID);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Username);\n\tLog(\"Received a login success packet from the server:\");\n\tLog(\"  UUID = \\\"%s\\\"\", UUID.c_str());\n\tLog(\"  Username = \\\"%s\\\"\", Username.c_str());\n\n\tLog(\"Server is now in protocol state Game.\");\n\tm_ServerProtocolState = 3;\n\n\tif (m_IsServerEncrypted)\n\t{\n\t\tLog(\"Server communication is now encrypted\");\n\t\tm_ServerState = csEncryptedUnderstood;\n\t\tDataLog(m_ServerEncryptionBuffer.data(), m_ServerEncryptionBuffer.size(), \"Sending the queued data to server (%u bytes):\", m_ServerEncryptionBuffer.size());\n\t\tSERVERENCRYPTSEND(m_ServerEncryptionBuffer);\n\t\tm_ServerEncryptionBuffer.clear();\n\t}\n\tCOPY_TO_CLIENT();\n\tLog(\"Client is now in protocol state Game.\");\n\tm_ClientProtocolState = 3;\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// packet handling, server-side, game:\n\nbool cConnection::HandleServerAttachEntity(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32,  EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32,  VehicleID);\n\tHANDLE_SERVER_PACKET_READ(ReadBool,     bool,    IsOnLeash);\n\tLog(\"Received a PACKET_ATTACH_ENTITY from the server:\");\n\tLog(\"  EntityID = %u (0x%x)\", EntityID, EntityID);\n\tLog(\"  VehicleID = %u (0x%x)\", VehicleID, VehicleID);\n\tLog(\"  IsOnLeash = %s\", IsOnLeash ? \"true\" : \"false\");\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerBlockAction(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32,  BlockX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16,  BlockY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32,  BlockZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,  Byte1);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,  Byte2);\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,  UInt32, BlockID);\n\tLog(\"Received a PACKET_BLOCK_ACTION from the server:\");\n\tLog(\"  Pos = {%d, %d, %d}\", BlockX, BlockY, BlockZ);\n\tLog(\"  Bytes = (%u, %u) == (0x%x, 0x%x)\", Byte1, Byte2, Byte1, Byte2);\n\tLog(\"  BlockID = %u\", BlockID);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerBlockChange(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32,  BlockX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,  BlockY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32,  BlockZ);\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,  UInt32, BlockType);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,  BlockMeta);\n\tLog(\"Received a PACKET_BLOCK_CHANGE from the server\");\n\tLog(\"  Pos = {%d, %u, %d}\", BlockX, BlockY, BlockZ);\n\tLog(\"  BlockType = %u (0x%x\", BlockType, BlockType);\n\tLog(\"  BlockMeta = %u\", BlockMeta);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerChangeGameState(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,  Reason);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat, float, Data);\n\tLog(\"Received a PACKET_CHANGE_GAME_STATE from the server:\");\n\tLog(\"  Reason = %u\", Reason);\n\tLog(\"  Data = %f\", Data);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerChatMessage(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Message);\n\tLog(\"Received a PACKET_CHAT_MESSAGE from the server:\");\n\tLog(\"  Message = \\\"%s\\\"\", Message.c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerCollectPickup(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, CollectedID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, CollectorID);\n\tLog(\"Received a PACKET_COLLECT_PICKUP from the server:\");\n\tLog(\"  CollectedID = %u\", CollectedID);\n\tLog(\"  CollectorID = %u\", CollectorID);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerCompass(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, SpawnX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, SpawnY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, SpawnZ);\n\tLog(\"Received PACKET_COMPASS from the server:\");\n\tLog(\"  Spawn = {%d, %d, %d}\", SpawnX, SpawnY, SpawnZ);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerDestroyEntities(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8, NumEntities);\n\tif (!m_ServerBuffer.SkipRead(static_cast<size_t>(NumEntities) * 4))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received PACKET_DESTROY_ENTITIES from the server:\");\n\tLog(\"  NumEntities = %u\", NumEntities);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntity(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tLog(\"Received a PACKET_ENTITY from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityEquipment(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, SlotNum);\n\tAString Item;\n\tif (!ParseSlot(m_ServerBuffer, Item))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_ENTITY_EQUIPMENT from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  SlotNum = %u\", SlotNum);\n\tLog(\"  Item = %s\", Item.c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityHeadLook(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  HeadYaw);\n\tLog(\"Received a PACKET_ENTITY_HEAD_LOOK from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  HeadYaw = %u\", HeadYaw);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityLook(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32,  EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,   Yaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,   Pitch);\n\tLog(\"Received a PACKET_ENTITY_LOOK from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  Yaw = %u\", Yaw);\n\tLog(\"  Pitch = %u\", Pitch);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityMetadata(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tAString Metadata;\n\tif (!ParseMetadata(m_ServerBuffer, Metadata))\n\t{\n\t\treturn false;\n\t}\n\tAString HexDump;\n\tCreateHexDump(HexDump, Metadata.data(), Metadata.size(), 32);\n\tLog(\"Received a PACKET_ENTITY_METADATA from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tauto len = static_cast<unsigned>(Metadata.length());\n\tLog(\"  Metadata, length = %u (0x%x):\\n%s\", len, len, HexDump.c_str());\n\tLogMetadata(Metadata, 4);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityProperties(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, Count);\n\tLog(\"Received a PACKET_ENTITY_PROPERTIES from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  Count = %u\", Count);\n\n\tfor (UInt32 i = 0; i < Count; i++)\n\t{\n\t\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Key);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEDouble,      double,  Value);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16,      UInt16, ListLength);\n\t\tLog(\" \\\"%s\\\" = %f; %u modifiers\", Key.c_str(), Value, ListLength);\n\t\tfor (UInt16 j = 0; j < ListLength; j++)\n\t\t{\n\t\t\tHANDLE_SERVER_PACKET_READ(ReadBEUInt64, UInt64, UUIDHi);\n\t\t\tHANDLE_SERVER_PACKET_READ(ReadBEUInt64, UInt64, UUIDLo);\n\t\t\tHANDLE_SERVER_PACKET_READ(ReadBEDouble, double, DblVal);\n\t\t\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  ByteVal);\n\t\t\tLog(\"  [%d] = {0x%08llx%08llx, %f, %u}\", j, UUIDHi, UUIDLo, DblVal, ByteVal);\n\t\t}\n\t}  // for i\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityRelativeMove(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt8,   Int8,   dx);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt8,   Int8,   dy);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt8,   Int8,   dz);\n\tLog(\"Received a PACKET_ENTITY_RELATIVE_MOVE from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  RelMove = %s\", PrintableAbsIntTriplet(dx, dy, dz).c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityRelativeMoveLook(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt8,   Int8,   dx);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt8,   Int8,   dy);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt8,   Int8,   dz);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  Yaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  Pitch);\n\tLog(\"Received a PACKET_ENTITY_RELATIVE_MOVE_LOOK from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  RelMove = %s\", PrintableAbsIntTriplet(dx, dy, dz).c_str());\n\tLog(\"  Yaw = %u\", Yaw);\n\tLog(\"  Pitch = %u\", Pitch);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityStatus(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  Status);\n\tLog(\"Received a PACKET_ENTITY_STATUS from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  Status = %u (0x%02x)\", Status, Status);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityTeleport(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32,  EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,   AbsX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,   AbsY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,   AbsZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,   Yaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,   Pitch);\n\tLog(\"Received a PACKET_ENTITY_TELEPORT from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  Pos = %s\", PrintableAbsIntTriplet(AbsX, AbsY, AbsZ).c_str());\n\tLog(\"  Yaw = %u\", Yaw);\n\tLog(\"  Pitch = %u\", Pitch);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerEntityVelocity(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16,  Int16,  VelocityX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16,  Int16,  VelocityY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16,  Int16,  VelocityZ);\n\tLog(\"Received a PACKET_ENTITY_VELOCITY from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  Velocity = %s\", PrintableAbsIntTriplet(VelocityX, VelocityY, VelocityZ, 8000).c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerExplosion(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat,  float,  PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat,  float,  PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat,  float,  PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat,  float,  Force);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, NumRecords);\n\tstd::vector<sCoords> Records;\n\tRecords.reserve(NumRecords);\n\tint PosXI = static_cast<int>(PosX), PosYI = static_cast<int>(PosY), PosZI = static_cast<int>(PosZ);\n\tfor (UInt32 i = 0; i < NumRecords; i++)\n\t{\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt8, Int8, rx);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt8, Int8, ry);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt8, Int8, rz);\n\t\tRecords.push_back(sCoords(PosXI + rx, PosYI + ry, PosZI + rz));\n\t}\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat, float, PlayerMotionX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat, float, PlayerMotionY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat, float, PlayerMotionZ);\n\tLog(\"Received a PACKET_EXPLOSION from the server:\");\n\tLog(\"  Pos = {%.02f, %.02f, %.02f}\", PosX, PosY, PosZ);\n\tLog(\"  Force = %.02f\", Force);\n\tLog(\"  NumRecords = %u\", NumRecords);\n\tfor (UInt32 i = 0; i < NumRecords; i++)\n\t{\n\t\tLog(\"    Records[%u] = {%d, %d, %d}\", i, Records[i].x, Records[i].y, Records[i].z);\n\t}\n\tLog(\"  Player motion = <%.02f, %.02f, %.02f>\", PlayerMotionX, PlayerMotionY, PlayerMotionZ);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerIncrementStatistic(void)\n{\n\t// 0xc8\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, StatisticID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  Amount);\n\tLog(\"Received a PACKET_INCREMENT_STATISTIC from the server:\");\n\tLog(\"  StatisticID = %u (0x%x)\", StatisticID, StatisticID);\n\tLog(\"  Amount = %d\", Amount);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerJoinGame(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32,      UInt32,  EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   GameMode);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   Dimension);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   Difficulty);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   MaxPlayers);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, LevelType);\n\tLog(\"Received a PACKET_LOGIN from the server:\");\n\tLog(\"  EntityID = %u\",      EntityID);\n\tLog(\"  GameMode = %u\",      GameMode);\n\tLog(\"  Dimension = %u\",     Dimension);\n\tLog(\"  Difficulty = %u\",    Difficulty);\n\tLog(\"  MaxPlayers = %u\",    MaxPlayers);\n\tLog(\"  LevelType = \\\"%s\\\"\", LevelType.c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerKeepAlive(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, PingID);\n\tLog(\"Received a PACKET_KEEP_ALIVE from the server:\");\n\tLog(\"  ID = %u\", PingID);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerKick(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Reason);\n\tLog(\"Received PACKET_KICK from the SERVER:\");\n\tif (m_HasClientPinged)\n\t{\n\t\tLog(\"  This was a std reply to client's PING\");\n\t\tAStringVector Split;\n\n\t\t// Split by NULL chars (StringSplit() won't work here):\n\t\tsize_t Last = 0;\n\t\tsize_t Len = Reason.size();\n\t\tfor (size_t i = 0; i < Len; i++)\n\t\t{\n\t\t\tif (Reason[i] == 0)\n\t\t\t{\n\t\t\t\tSplit.push_back(Reason.substr(Last, i - Last));\n\t\t\t\tLast = i + 1;\n\t\t\t}\n\t\t}\n\t\tif (Last < Len)\n\t\t{\n\t\t\tSplit.push_back(Reason.substr(Last));\n\t\t}\n\n\t\tif (Split.size() == 6)\n\t\t{\n\t\t\tLog(\"  Preamble: \\\"%s\\\"\", Split[0]);\n\t\t\tLog(\"  Protocol version: \\\"%s\\\"\", Split[1]);\n\t\t\tLog(\"  Server version: \\\"%s\\\"\", Split[2]);\n\t\t\tLog(\"  MOTD: \\\"%s\\\"\", Split[3]);\n\t\t\tLog(\"  Cur players: \\\"%s\\\"\", Split[4]);\n\t\t\tLog(\"  Max players: \\\"%s\\\"\", Split[5]);\n\n\t\t\t// Modify the MOTD to show that it's being ProtoProxied:\n\t\t\tReason.assign(Split[0]);\n\t\t\tReason.push_back(0);\n\t\t\tReason.append(Split[1]);\n\t\t\tReason.push_back(0);\n\t\t\tReason.append(Split[2]);\n\t\t\tReason.push_back(0);\n\t\t\tReason.append(fmt::format(FMT_STRING(\"ProtoProxy: {}\"), Split[3]));\n\t\t\tReason.push_back(0);\n\t\t\tReason.append(Split[4]);\n\t\t\tReason.push_back(0);\n\t\t\tReason.append(Split[5]);\n\t\t\tauto ReasonBE16 = UTF8ToRawBEUTF16(Reason);\n\t\t\tAString PacketStart(\"\\xff\");\n\t\t\tPacketStart.push_back(static_cast<char>(ReasonBE16.size() / 256));\n\t\t\tPacketStart.push_back(static_cast<char>(ReasonBE16.size() % 256));\n\t\t\tCLIENTSEND({ reinterpret_cast<const std::byte *>(PacketStart.data()), PacketStart.size() });\n\t\t\tCLIENTSEND({ reinterpret_cast<const std::byte *>(ReasonBE16.data()), ReasonBE16.size() * sizeof(char16_t) });\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDataLog(Reason.data(), Reason.size(), \"  Unknown reply format, dumping hex:\");\n\t\t}\n\t}\n\telse\n\t{\n\t\tLog(\"  Reason = \\\"%s\\\"\", Reason);\n\t}\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerMapChunk(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  ChunkX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  ChunkZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  IsContiguous);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, PrimaryBitmap);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, AdditionalBitmap);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, CompressedSize);\n\tContiguousByteBuffer CompressedData;\n\tif (!m_ServerBuffer.ReadSome(CompressedData, CompressedSize))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_MAP_CHUNK from the server:\");\n\tLog(\"  ChunkPos = [%d, %d]\", ChunkX, ChunkZ);\n\tLog(\"  Compressed size = %u (0x%x)\", CompressedSize, CompressedSize);\n\n\t// TODO: Save the compressed data into a file for later analysis\n\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerMapChunkBulk(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, ChunkCount);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, CompressedSize);\n\tHANDLE_SERVER_PACKET_READ(ReadBool,     bool,   IsSkyLightSent);\n\tContiguousByteBuffer CompressedData;\n\tif (!m_ServerBuffer.ReadSome(CompressedData, CompressedSize))\n\t{\n\t\treturn false;\n\t}\n\n\t// Read individual chunk metas.\n\t// Need to read them first and only then start logging (in case we don't have the full packet yet)\n\ttypedef std::vector<sChunkMeta> sChunkMetas;\n\tsChunkMetas ChunkMetas;\n\tChunkMetas.reserve(ChunkCount);\n\tfor (short i = 0; i < ChunkCount; i++)\n\t{\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, ChunkX);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, ChunkZ);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16, PrimaryBitmap);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16, AddBitmap);\n\t\tChunkMetas.push_back(sChunkMeta(ChunkX, ChunkZ, PrimaryBitmap, AddBitmap));\n\t}\n\n\tLog(\"Received a PACKET_MAP_CHUNK_BULK from the server:\");\n\tLog(\"  ChunkCount = %u\", ChunkCount);\n\tLog(\"  Compressed size = %u (0x%x)\", CompressedSize, CompressedSize);\n\tLog(\"  IsSkyLightSent = %s\", IsSkyLightSent ? \"true\" : \"false\");\n\n\t// Log individual chunk coords:\n\tint idx = 0;\n\tfor (sChunkMetas::iterator itr = ChunkMetas.begin(), end = ChunkMetas.end(); itr != end; ++itr, ++idx)\n\t{\n\t\tLog(\"  [%d]: [%d, %d], primary bitmap 0x%02x, add bitmap 0x%02x\",\n\t\t\tidx, itr->m_ChunkX, itr->m_ChunkZ, itr->m_PrimaryBitmap, itr->m_AddBitmap\n\t\t);\n\t}  // for itr - ChunkMetas[]\n\n\t// TODO: Save the compressed data into a file for later analysis\n\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerMultiBlockChange(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  ChunkX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  ChunkZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, NumBlocks);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, DataSize);\n\tContiguousByteBuffer BlockChangeData;\n\tif (!m_ServerBuffer.ReadSome(BlockChangeData, DataSize))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_MULTI_BLOCK_CHANGE packet from the server:\");\n\tLog(\"  Chunk = [%d, %d]\", ChunkX, ChunkZ);\n\tLog(\"  NumBlocks = %u\", NumBlocks);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerNamedSoundEffect(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, SoundName);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat,       float,   Volume);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   Pitch);\n\tLog(\"Received a PACKET_NAMED_SOUND_EFFECT from the server:\");\n\tLog(\"  SoundName = \\\"%s\\\"\", SoundName.c_str());\n\tLog(\"  Pos = %s\", PrintableAbsIntTriplet(PosX, PosY, PosZ, 8).c_str());\n\tLog(\"  Volume = %f\", Volume);\n\tLog(\"  Pitch = %u\", Pitch);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerPlayerAbilities(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8, Flags);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat, float, FlyingSpeed);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat, float, WalkingSpeed);\n\tLog(\"Received a PACKET_PLAYER_ABILITIES from the server:\");\n\tLog(\"  Flags = %u (0x%02x)\", Flags, Flags);\n\tLog(\"  FlyingSpeed = %f\", FlyingSpeed);\n\tLog(\"  WalkingSpeed = %f\", WalkingSpeed);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerPlayerAnimation(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,  UInt32, PlayerID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,  AnimationID);\n\tLog(\"Received a PACKET_PLAYER_ANIMATION from the server:\");\n\tLog(\"  PlayerID: %u (0x%x)\", PlayerID, PlayerID);\n\tLog(\"  Animation: %u\", AnimationID);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerPlayerListItem(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, PlayerName);\n\tHANDLE_SERVER_PACKET_READ(ReadBool,          bool,    IsOnline);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16,      UInt16,  Ping);\n\tLog(\"Received a PACKET_PLAYERLIST_ITEM from the server:\");\n\tLog(\"  PlayerName = \\\"%s\\\" (%s)\", PlayerName.c_str(), IsOnline ? \"online\" : \"offline\");\n\tLog(\"  Ping = %d\", Ping);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerPlayerPositionLook(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEDouble, double, PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEDouble, double, PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEDouble, double, PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat,  float,  Yaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat,  float,  Pitch);\n\tHANDLE_SERVER_PACKET_READ(ReadBool,     bool,   IsOnGround);\n\tLog(\"Received a PACKET_PLAYER_POSITION_LOOK from the server\");\n\n\t// TODO: list packet contents\n\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerPluginMessage(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, ChannelName);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16,      UInt16,  Length);\n\tContiguousByteBuffer Data;\n\tif (!m_ServerBuffer.ReadSome(Data, Length))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_PLUGIN_MESSAGE from the server\");\n\tLog(\"  ChannelName = \\\"%s\\\"\", ChannelName.c_str());\n\tDataLog(Data.data(), Length, \"  Data: %u bytes\", Length);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerRespawn(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,     Dimension);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,    Difficulty);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,    GameMode);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, LevelType);\n\tLog(\"Received a respawn packet from the server:\");\n\tLog(\"  Dimension = %d\", Dimension);\n\tLog(\"  Difficulty = %u\", Difficulty);\n\tLog(\"  GameMode = %u\", GameMode);\n\tLog(\"  LevelType = \\\"%s\\\"\", LevelType.c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSetExperience(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat,  float,  ExperienceBar);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, Level);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, TotalExperience);\n\tLog(\"Received a PACKET_SET_EXPERIENCE from the server:\");\n\tLog(\"  ExperienceBar = %.05f\", ExperienceBar);\n\tLog(\"  Level = %u\", Level);\n\tLog(\"  TotalExperience = %u\", TotalExperience);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSetSlot(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  WindowID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, SlotNum);\n\tAString Item;\n\tif (!ParseSlot(m_ServerBuffer, Item))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_SET_SLOT from the server:\");\n\tLog(\"  WindowID = %u\", WindowID);\n\tLog(\"  SlotNum = %u\", SlotNum);\n\tLog(\"  Item = %s\", Item.c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSlotSelect(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8, SlotNum);\n\tLog(\"Received a PACKET_SLOT_SELECT from the server:\");\n\tLog(\"  SlotNum = %u\", SlotNum);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSoundEffect(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, EffectID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8, PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, Data);\n\tHANDLE_SERVER_PACKET_READ(ReadBool,    bool,  NoVolumeDecrease);\n\tLog(\"Received a PACKET_SOUND_EFFECT from the server:\");\n\tLog(\"  EffectID = %d\", EffectID);\n\tLog(\"  Pos = {%d, %d, %d}\", PosX, PosY, PosZ);\n\tLog(\"  Data = %d\", Data);\n\tLog(\"  NoVolumeDecrease = %s\", NoVolumeDecrease ? \"true\" : \"false\");\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSpawnExperienceOrbs(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,   UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, Count);\n\tLog(\"Received a SPAWN_EXPERIENCE_ORBS packet from the server:\");\n\tLog(\"  EntityID = %u (0x%x)\", EntityID, EntityID);\n\tLog(\"  Pos = %s\", PrintableAbsIntTriplet(PosX, PosY, PosZ).c_str());\n\tLog(\"  Count = %u\", Count);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSpawnMob(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,  UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,   MobType);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32,    PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32,    PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32,    PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,   Yaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,   Pitch);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8,   HeadYaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16,  VelocityX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16,  VelocityY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16,  VelocityZ);\n\tAString Metadata;\n\tif (!ParseMetadata(m_ServerBuffer, Metadata))\n\t{\n\t\treturn false;\n\t}\n\tAString HexDump;\n\tCreateHexDump(HexDump, Metadata.data(), Metadata.size(), 32);\n\tLog(\"Received a PACKET_SPAWN_MOB from the server:\");\n\tLog(\"  EntityID = %u (0x%x)\", EntityID, EntityID);\n\tLog(\"  MobType = %u (0x%x)\", MobType, MobType);\n\tLog(\"  Pos = %s\", PrintableAbsIntTriplet(PosX, PosY, PosZ).c_str());\n\tLog(\"  Angles = [%u, %u, %u]\", Yaw, Pitch, HeadYaw);\n\tLog(\"  Velocity = %s\", PrintableAbsIntTriplet(VelocityX, VelocityY, VelocityZ, 8000).c_str());\n\tauto len = static_cast<unsigned>(Metadata.length());\n\tLog(\"  Metadata, length = %u (0x%x):\\n%s\", len, len, HexDump.c_str());\n\tLogMetadata(Metadata, 4);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nstruct sSpawnData\n{\n\tAString m_Name;\n\tAString m_Value;\n\tAString m_Signature;\n\tsSpawnData(const AString & a_Name, const AString & a_Value, const AString & a_Signature) :\n\t\tm_Name(a_Name),\n\t\tm_Value(a_Value),\n\t\tm_Signature(a_Signature)\n\t{\n\t}\n};\n\ntypedef std::vector<sSpawnData> sSpawnDatas;\n\n\n\n\n\nbool cConnection::HandleServerSpawnNamedEntity(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,        UInt32,  EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, EntityUUID);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, EntityName);\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,        UInt32,  DataCount);\n\tsSpawnDatas Data;\n\tfor (UInt32 i = 0; i < DataCount; i++)\n\t{\n\t\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Name);\n\t\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Value);\n\t\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Signature);\n\t\tData.push_back(sSpawnData(Name, Value, Signature));\n\t}\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  Yaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  Pitch);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, SelectedItem);\n\tAString Metadata;\n\tif (!ParseMetadata(m_ServerBuffer, Metadata))\n\t{\n\t\treturn false;\n\t}\n\tAString HexDump;\n\tCreateHexDump(HexDump, Metadata.data(), Metadata.size(), 32);\n\tLog(\"Received a PACKET_SPAWN_NAMED_ENTITY from the server:\");\n\tLog(\"  EntityID = %u (0x%x)\", EntityID, EntityID);\n\tLog(\"  UUID = \\\"%s\\\"\", EntityUUID.c_str());\n\tLog(\"  Name = \\\"%s\\\"\", EntityName.c_str());\n\tLog(\"  NumData = %u\", DataCount);\n\tfor (sSpawnDatas::const_iterator itr = Data.begin(), end = Data.end(); itr != end; ++itr)\n\t{\n\t\tLog(\"    Name = \\\"%s\\\", Value = \\\"%s\\\", Signature = \\\"%s\\\"\",\n\t\t\titr->m_Name.c_str(), itr->m_Value.c_str(), itr->m_Signature.c_str()\n\t\t);\n\t}  // for itr - Data[]\n\tLog(\"  Pos = %s\", PrintableAbsIntTriplet(PosX, PosY, PosZ).c_str());\n\tLog(\"  Rotation = <yaw %u, pitch %u>\", Yaw, Pitch);\n\tLog(\"  SelectedItem = %u\", SelectedItem);\n\tauto len = static_cast<unsigned>(Metadata.length());\n\tLog(\"  Metadata, length = %u (0x%x):\\n%s\", len, len, HexDump.c_str());\n\tLogMetadata(Metadata, 4);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSpawnObjectVehicle(void)\n{\n\t#ifdef _DEBUG\n\t// DEBUG:\n\t// This packet is still troublesome when DataIndicator != 0\n\tContiguousByteBuffer Buffer;\n\tm_ServerBuffer.ResetRead();\n\tm_ServerBuffer.ReadAll(Buffer);\n\tm_ServerBuffer.ResetRead();\n\tUInt32 PacketLen, PacketType;\n\tm_ServerBuffer.ReadVarInt(PacketLen);\n\tm_ServerBuffer.ReadVarInt(PacketType);\n\tif (Buffer.size() > 128)\n\t{\n\t\t// Only log up to 128 bytes\n\t\tBuffer.erase(128, AString::npos);\n\t}\n\tDataLog(Buffer.data(), Buffer.size(), \"Buffer while parsing the PACKET_SPAWN_OBJECT_VEHICLE packet (%u bytes):\", static_cast<unsigned>(Buffer.size()));\n\t#endif  // _DEBUG\n\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,   UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  ObjType);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  Pitch);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  Yaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, DataIndicator);\n\tAString ExtraData;\n\tInt16 VelocityX = 0;\n\tInt16 VelocityY = 0;\n\tInt16 VelocityZ = 0;\n\tif (DataIndicator != 0)\n\t{\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16, SpeedX);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16, SpeedY);\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16, SpeedZ);\n\t\tVelocityX = SpeedX; VelocityY = SpeedY; VelocityZ = SpeedZ;  // Speed vars are local to this scope, but we need them available later\n\t\t/*\n\t\t// This doesn't seem to work - for a falling block I'm getting no extra data at all\n\t\tint ExtraLen = 0;\n\t\tswitch (ObjType)\n\t\t{\n\t\t\tcase OBJECT_FALLING_BLOCK: ExtraLen = 4; break;  // int: BlockType | (BlockMeta << 12)\n\t\t\tcase OBJECT_ARROW:\n\t\t\tcase OBJECT_SNOWBALL:\n\t\t\tcase OBJECT_EGG:\n\t\t\tcase OBJECT_EYE_OF_ENDER:\n\t\t\tcase OBJECT_DRAGON_EGG:\n\t\t\tcase OBJECT_FISHING_FLOAT:\n\t\t\t{\n\t\t\t\tExtraLen = 4; break;  // int: EntityID of the thrower\n\t\t\t}\n\t\t\t// TODO: Splash potions\n\t\t}\n\t\tif ((ExtraLen > 0) && !m_ServerBuffer.ReadSome(ExtraData, ExtraLen))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\t*/\n\t}\n\tLog(\"Received a PACKET_SPAWN_OBJECT_VEHICLE from the server:\");\n\tLog(\"  EntityID = %u (0x%x)\", EntityID, EntityID);\n\tLog(\"  ObjType = %u (0x%x)\", ObjType, ObjType);\n\tLog(\"  Pos = %s\", PrintableAbsIntTriplet(PosX, PosY, PosZ).c_str());\n\tLog(\"  Rotation = <yaw %u, pitch %u>\", Yaw, Pitch);\n\tLog(\"  DataIndicator = %u (0x%x)\", DataIndicator, DataIndicator);\n\tif (DataIndicator != 0)\n\t{\n\t\tLog(\"  Velocity = %s\", PrintableAbsIntTriplet(VelocityX, VelocityY, VelocityZ, 8000).c_str());\n\t\tDataLog(ExtraData.data(), ExtraData.size(), \"  ExtraData size = %u:\", static_cast<unsigned>(ExtraData.size()));\n\t}\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSpawnPainting(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,        UInt32,  EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, ImageName);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   Direction);\n\tLog(\"Received a PACKET_SPAWN_PAINTING from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  ImageName = \\\"%s\\\"\", ImageName.c_str());\n\tLog(\"  Pos = %s\", PrintableAbsIntTriplet(PosX, PosY, PosZ).c_str());\n\tLog(\"  Direction = %d\", Direction);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerSpawnPickup(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tAString ItemDesc;\n\tif (!ParseSlot(m_ServerBuffer, ItemDesc))\n\t{\n\t\treturn false;\n\t}\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, PosX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, PosY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32, Int32, PosZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8, Yaw);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8, Pitch);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8, Roll);\n\tLog(\"Received a PACKET_SPAWN_PICKUP from the server:\");\n\tLog(\"  EntityID = %d\", EntityID);\n\tLog(\"  Item = %s\", ItemDesc.c_str());\n\tLog(\"  Pos = %s\", PrintableAbsIntTriplet(PosX, PosY, PosZ).c_str());\n\tLog(\"  Angles = [%u, %u, %u]\", Yaw, Pitch, Roll);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerStatistics(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt, UInt32, NumEntries);\n\tfor (UInt32 i = 0; i < NumEntries; i++)\n\t{\n\t\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, StatName);\n\t\tHANDLE_SERVER_PACKET_READ(ReadVarInt,        UInt32,  StatValue);\n\t}\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerStatusPing(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt64, Int64, Time);\n\tLog(\"Received server's ping response:\");\n\tLog(\"  Time = %lld\", Time);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerStatusResponse(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Response);\n\tLog(\"Received server's status response:\");\n\tLog(\"  Response: %s\", Response.c_str());\n\n\t// Modify the response to show that it's being proto-proxied:\n\tconst char DescSearch[] = \"\\\"description\\\":{\\\"text\\\":\\\"\";\n\tsize_t idx = Response.find(DescSearch);\n\tif (idx != AString::npos)\n\t{\n\t\tResponse.assign(Response.substr(0, idx + sizeof(DescSearch) - 1) + \"ProtoProxy: \" + Response.substr(idx + sizeof(DescSearch) - 1));\n\t}\n\telse\n\t{\n\t\tLog(\"Cannot find the description json element, ProtoProxy signature not inserted\");\n\t}\n\tcByteBuffer Packet(Response.size() + 50);\n\tPacket.WriteVarInt32(0);  // Packet type - status response\n\tPacket.WriteVarUTF8String(Response);\n\tContiguousByteBuffer Pkt;\n\tPacket.ReadAll(Pkt);\n\tcByteBuffer ToClient(Response.size() + 50);\n\tToClient.WriteVarInt32(static_cast<UInt32>(Pkt.size()));\n\tToClient.Write(Pkt.data(), Pkt.size());\n\tCLIENTSEND(ToClient);\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerTabCompletion(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadVarInt,        UInt32,  NumResults);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Results);\n\tLog(\"Received a PACKET_TAB_COMPLETION from the server, results given:\");\n\n\t// Parse the zero-terminated list of results:\n\tsize_t len = Results.size();\n\tsize_t last = 0;\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tif (Results[i] == 0)\n\t\t{\n\t\t\tLog(\"  \\\"%s\\\"\", Results.substr(last, i - last).c_str());\n\t\t\tlast = i + 1;\n\t\t}\n\t}\n\tif (last < len)\n\t{\n\t\tLog(\"  \\\"%s\\\"\", Results.substr(last, len - last).c_str());\n\t}\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerTimeUpdate(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt64, UInt64, WorldAge);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt64, UInt64, TimeOfDay);\n\tLog(\"Received a PACKET_TIME_UPDATE from the server\");\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerUpdateHealth(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat, float, Health);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16, Int16, Food);\n\tHANDLE_SERVER_PACKET_READ(ReadBEFloat, float, Saturation);\n\tLog(\"Received a PACKET_UPDATE_HEALTH from the server\");\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerUpdateSign(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   BlockX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16,       Int16,   BlockY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,       Int32,   BlockZ);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Line1);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Line2);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Line3);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Line4);\n\tLog(\"Received a PACKET_UPDATE_SIGN from the server:\");\n\tLog(\"  Block = {%d, %d, %d}\", BlockX, BlockY, BlockZ);\n\tLog(\"  Lines = \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\"\", Line1.c_str(), Line2.c_str(), Line3.c_str(), Line4.c_str());\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerUpdateTileEntity(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  BlockX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt16,  Int16,  BlockY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  BlockZ);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  Action);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, DataLength);\n\n\tContiguousByteBuffer Data;\n\tif ((DataLength > 0) && !m_ServerBuffer.ReadSome(Data, DataLength))\n\t{\n\t\treturn false;\n\t}\n\tLog(\"Received a PACKET_UPDATE_TILE_ENTITY from the server:\");\n\tLog(\"  Block = {%d, %d, %d}\", BlockX, BlockY, BlockZ);\n\tLog(\"  Action = %u\", Action);\n\tDataLog(Data.data(), Data.size(), \"  Data (%u bytes)\", DataLength);\n\n\t// Save metadata to a file:\n\tauto fnam = fmt::format(FMT_STRING(\"{}_tile_{:08x}.nbt\"), m_LogNameBase, m_ItemIdx++);\n\tFILE * f = fopen(fnam.c_str(), \"wb\");\n\tif (f != nullptr)\n\t{\n\t\tfwrite(Data.data(), 1, Data.size(), f);\n\t\tfclose(f);\n\t\tLog(\"(saved to file \\\"%s\\\")\", fnam.c_str());\n\t}\n\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerUseBed(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, EntityID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  BedX);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  BedY);\n\tHANDLE_SERVER_PACKET_READ(ReadBEInt32,  Int32,  BedZ);\n\tLog(\"Received a use bed packet from the server:\");\n\tLog(\"  EntityID = %u\", EntityID);\n\tLog(\"  Bed = {%d, %u, %d}\", BedX, BedY, BedZ);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerWindowClose(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8, UInt8, WindowID);\n\tLog(\"Received a PACKET_WINDOW_CLOSE from the server:\");\n\tLog(\"  WindowID = %u\", WindowID);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerWindowContents(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,  UInt8,  WindowID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt16, UInt16, NumSlots);\n\tLog(\"Received a PACKET_WINDOW_CONTENTS from the server:\");\n\tLog(\"  WindowID = %u\", WindowID);\n\tLog(\"  NumSlots = %u\", NumSlots);\n\tAStringVector Items;\n\tfor (UInt16 i = 0; i < NumSlots; i++)\n\t{\n\t\tAString Item;\n\t\tif (!ParseSlot(m_ServerBuffer, Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tLog(\"    %u: %s\", i, Item.c_str());\n\t}\n\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerWindowOpen(void)\n{\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   WindowID);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   WindowType);\n\tHANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Title);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   NumSlots);\n\tHANDLE_SERVER_PACKET_READ(ReadBEUInt8,       UInt8,   UseProvidedTitle);\n\tUInt32 HorseEntityID = 0;\n\tif (WindowType == 11)  // Horse / Donkey / Mule\n\t{\n\t\tHANDLE_SERVER_PACKET_READ(ReadBEUInt32, UInt32, intHorseInt);\n\t\tHorseEntityID = intHorseInt;\n\t}\n\tLog(\"Received a PACKET_WINDOW_OPEN from the server:\");\n\tLog(\"  WindowID = %u\", WindowID);\n\tLog(\"  WindowType = %u (0x%02x)\", WindowType, WindowType);\n\tLog(\"  Title = \\\"%s\\\", Use = %u\", Title.c_str(), UseProvidedTitle);\n\tLog(\"  NumSlots = %u\", NumSlots);\n\tif (WindowType == 11)\n\t{\n\t\tLog(\"  HorseEntityID = %u (0x%08x)\", HorseEntityID, HorseEntityID);\n\t}\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::HandleServerUnknownPacket(UInt32 a_PacketType, UInt32 a_PacketLen, UInt32 a_PacketReadSoFar)\n{\n\tContiguousByteBuffer Data;\n\tASSERT(a_PacketLen >= a_PacketReadSoFar);\n\tif (!m_ServerBuffer.ReadSome(Data, a_PacketLen - a_PacketReadSoFar))\n\t{\n\t\treturn false;\n\t}\n\tDataLog(Data.data(), Data.size(), \"****************** Unknown packet 0x%x from the server; relaying and ignoring\", a_PacketType);\n\tCOPY_TO_CLIENT();\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::ParseSlot(cByteBuffer & a_Buffer, AString & a_ItemDesc)\n{\n\tshort ItemType;\n\tif (!a_Buffer.ReadBEInt16(ItemType))\n\t{\n\t\treturn false;\n\t}\n\tif (ItemType <= 0)\n\t{\n\t\ta_ItemDesc = \"<empty>\";\n\t\treturn true;\n\t}\n\tif (!a_Buffer.CanReadBytes(5))\n\t{\n\t\treturn false;\n\t}\n\tInt8 ItemCount;\n\tInt16 ItemDamage;\n\tUInt16 MetadataLength;\n\ta_Buffer.ReadBEInt8(ItemCount);  // We already know we can read these bytes - we checked before.\n\ta_Buffer.ReadBEInt16(ItemDamage);\n\ta_Buffer.ReadBEUInt16(MetadataLength);\n\ta_ItemDesc = fmt::format(FMT_STRING(\"{}:{} * {}\"), ItemType, ItemDamage, ItemCount);\n\tif (MetadataLength <= 0)\n\t{\n\t\treturn true;\n\t}\n\tAString Metadata;\n\tMetadata.resize(MetadataLength);\n\tif (!a_Buffer.ReadBuf(const_cast<char *>(Metadata.data()), MetadataLength))\n\t{\n\t\treturn false;\n\t}\n\tAString MetaHex;\n\tCreateHexDump(MetaHex, Metadata.data(), Metadata.size(), 16);\n\ta_ItemDesc.append(fmt::format(FMT_STRING(\"; {} bytes of meta:\\n{}\"), MetadataLength, MetaHex));\n\n\t// Save metadata to a file:\n\tauto fnam = fmt::format(FMT_STRING(\"{}_item_{:08x}.nbt\"), m_LogNameBase, m_ItemIdx++);\n\tFILE * f = fopen(fnam.c_str(), \"wb\");\n\tif (f != nullptr)\n\t{\n\t\tfwrite(Metadata.data(), 1, Metadata.size(), f);\n\t\tfclose(f);\n\t\ta_ItemDesc.append(fmt::format(FMT_STRING(\"\\n    (saved to file \\\"{}\\\")\"), fnam));\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cConnection::ParseMetadata(cByteBuffer & a_Buffer, AString & a_Metadata)\n{\n\tUInt8 x;\n\tif (!a_Buffer.ReadBEUInt8(x))\n\t{\n\t\treturn false;\n\t}\n\ta_Metadata.push_back(static_cast<char>(x));\n\twhile (x != 0x7f)\n\t{\n\t\t// int Index = static_cast<unsigned>(x) & 0x1f;  // Lower 5 bits = index\n\t\tint Type  = static_cast<unsigned>(x) >> 5;    // Upper 3 bits = type\n\n\t\t// Get the length of the data for this item:\n\t\tUInt32 Length = 0;\n\t\tswitch (Type)\n\t\t{\n\t\t\tcase 0: Length = 1; break;  // Byte\n\t\t\tcase 1: Length = 2; break;  // short\n\t\t\tcase 2: Length = 4; break;  // int\n\t\t\tcase 3: Length = 4; break;  // float\n\t\t\tcase 4:  // UTF-8 string with VarInt length\n\t\t\t{\n\t\t\t\tUInt32 Len;\n\t\t\t\tint rs = static_cast<int>(a_Buffer.GetReadableSpace());\n\t\t\t\tif (!a_Buffer.ReadVarInt(Len))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\trs = rs - static_cast<int>(a_Buffer.GetReadableSpace());\n\t\t\t\tcByteBuffer LenBuf(8);\n\t\t\t\tLenBuf.WriteVarInt32(Len);\n\t\t\t\tContiguousByteBuffer VarLen;\n\t\t\t\tLenBuf.ReadAll(VarLen);\n\t\t\t\ta_Metadata += { reinterpret_cast<const char *>(VarLen.data()), VarLen.size() };\n\t\t\t\tLength = Len;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 5:  // Item, in \"slot\" format\n\t\t\t{\n\t\t\t\tsize_t Before = a_Buffer.GetReadableSpace();\n\t\t\t\tAString ItemDesc;\n\t\t\t\tif (!ParseSlot(a_Buffer, ItemDesc))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tsize_t After = a_Buffer.GetReadableSpace();\n\t\t\t\ta_Buffer.ResetRead();\n\t\t\t\ta_Buffer.SkipRead(a_Buffer.GetReadableSpace() - Before);\n\t\t\t\tLength = static_cast<UInt32>(Before - After);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 6: Length = 12; break;  // 3 * int\n\t\t\tcase 7:\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unknown metadata type\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (Type)\n\n\t\t// Read the data in this item:\n\t\tContiguousByteBuffer data;\n\t\tif (!a_Buffer.ReadSome(data, Length))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\ta_Metadata += { reinterpret_cast<const char *>(data.data()), data.size() };\n\t\tif (!a_Buffer.ReadBEUInt8(x))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\ta_Metadata.push_back(static_cast<char>(x));\n\t}  // while (x != 0x7f)\n\treturn true;\n}\n\n\n\n\n\nvoid cConnection::LogMetadata(const AString & a_Metadata, size_t a_IndentCount)\n{\n\tAString Indent(a_IndentCount, ' ');\n\tsize_t pos = 0;\n\twhile (a_Metadata[pos] != 0x7f)\n\t{\n\t\tunsigned Index = static_cast<unsigned>(static_cast<unsigned char>(a_Metadata[pos])) & 0x1f;  // Lower 5 bits = index\n\t\tunsigned Type  = static_cast<unsigned>(static_cast<unsigned char>(a_Metadata[pos])) >> 5;    // Upper 3 bits = type\n\t\t// int Length = 0;\n\t\tswitch (Type)\n\t\t{\n\t\t\tcase 0:\n\t\t\t{\n\t\t\t\tLog(\"%sbyte[%u] = %u\", Indent.c_str(), Index, static_cast<unsigned char>(a_Metadata[pos + 1]));\n\t\t\t\tpos += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 1:\n\t\t\t{\n\t\t\t\tLog(\"%sshort[%u] = %d\", Indent.c_str(), Index, (a_Metadata[pos + 1] << 8) | a_Metadata[pos + 2]);\n\t\t\t\tpos += 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 2:\n\t\t\t{\n\t\t\t\tLog(\"%sint[%u] = %d\", Indent.c_str(), Index, (a_Metadata[pos + 1] << 24) | (a_Metadata[pos + 2] << 16) | (a_Metadata[pos + 3] << 8) | a_Metadata[pos + 4]);\n\t\t\t\tpos += 4;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 3:\n\t\t\t{\n\t\t\t\tLog(\"%sfloat[%u] = 0x%x\", Indent.c_str(), Index, (a_Metadata[pos + 1] << 24) | (a_Metadata[pos + 2] << 16) | (a_Metadata[pos + 3] << 8) | a_Metadata[pos + 4]);\n\t\t\t\tpos += 4;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 4:  // UTF-8 string with VarInt length\n\t\t\t{\n\t\t\t\tcByteBuffer bb(10);\n\t\t\t\tsize_t RestLen = a_Metadata.size() - pos - 1;\n\t\t\t\tif (RestLen > 8)\n\t\t\t\t{\n\t\t\t\t\tRestLen = 8;\n\t\t\t\t}\n\t\t\t\tbb.Write(a_Metadata.data() + pos + 1, RestLen);\n\t\t\t\tUInt32 Length;\n\t\t\t\tsize_t rs = bb.GetReadableSpace();\n\t\t\t\tif (!bb.ReadVarInt(Length))\n\t\t\t\t{\n\t\t\t\t\tLog(\"Invalid metadata value, was supposed to be a varint-prefixed string, but cannot read the varint\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\trs = rs - bb.GetReadableSpace();\n\t\t\t\tLog(\"%sstring[%u] = \\\"%*s\\\"\", Indent.c_str(), Index, Length, a_Metadata.c_str() + pos + rs + 1);\n\t\t\t\tpos += Length + rs + 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 5:\n\t\t\t{\n\t\t\t\tsize_t BytesLeft = a_Metadata.size() - pos - 1;\n\t\t\t\tcByteBuffer bb(BytesLeft);\n\t\t\t\tbb.Write(a_Metadata.data() + pos + 1, BytesLeft);\n\t\t\t\tAString ItemDesc;\n\t\t\t\tif (!ParseSlot(bb, ItemDesc))\n\t\t\t\t{\n\t\t\t\t\tASSERT(!\"Cannot parse item description from metadata\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// size_t After = bb.GetReadableSpace();\n\t\t\t\tsize_t BytesConsumed = BytesLeft - bb.GetReadableSpace();\n\n\t\t\t\tLog(\"%sslot[%u] = %s (%u bytes)\", Indent.c_str(), Index, ItemDesc.c_str(), static_cast<unsigned>(BytesConsumed));\n\t\t\t\tpos += BytesConsumed;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 6:\n\t\t\t{\n\t\t\t\tLog(\"%spos[%u] = <%d, %d, %d>\", Indent.c_str(), Index,\n\t\t\t\t\t(a_Metadata[pos + 1] << 24) | (a_Metadata[pos + 2]  << 16) | (a_Metadata[pos + 3]  << 8) | a_Metadata[pos + 4],\n\t\t\t\t\t(a_Metadata[pos + 5] << 24) | (a_Metadata[pos + 6]  << 16) | (a_Metadata[pos + 7]  << 8) | a_Metadata[pos + 8],\n\t\t\t\t\t(a_Metadata[pos + 9] << 24) | (a_Metadata[pos + 10] << 16) | (a_Metadata[pos + 11] << 8) | a_Metadata[pos + 12]\n\t\t\t\t);\n\t\t\t\tpos += 12;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unknown metadata type\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (Type)\n\t\tpos += 1;\n\t}  // while (x != 0x7f)\n}\n\n\n\n\n\nvoid cConnection::SendEncryptionKeyResponse(const AString & a_ServerPublicKey, const AString & a_Nonce)\n{\n\t// Generate the shared secret and encrypt using the server's public key\n\tByte SharedSecret[16];\n\tByte EncryptedSecret[128];\n\tmemset(SharedSecret, 0, sizeof(SharedSecret));  // Use all zeroes for the initial secret\n\tcCryptoKey PubKey(a_ServerPublicKey);\n\tint res = PubKey.Encrypt(SharedSecret, sizeof(SharedSecret), EncryptedSecret, sizeof(EncryptedSecret));\n\tif (res < 0)\n\t{\n\t\tLog(\"Shared secret encryption failed: %d (0x%x)\", res, res);\n\t\treturn;\n\t}\n\n\tm_ServerEncryptor.Init(SharedSecret, SharedSecret);\n\tm_ServerDecryptor.Init(SharedSecret, SharedSecret);\n\n\t// Encrypt the nonce:\n\tByte EncryptedNonce[128];\n\tres = PubKey.Encrypt(reinterpret_cast<const Byte *>(a_Nonce.data()), a_Nonce.size(), EncryptedNonce, sizeof(EncryptedNonce));\n\tif (res < 0)\n\t{\n\t\tLog(\"Nonce encryption failed: %d (0x%x)\", res, res);\n\t\treturn;\n\t}\n\n\t// Send the packet to the server:\n\tLog(\"Sending PACKET_ENCRYPTION_KEY_RESPONSE to the SERVER\");\n\tcByteBuffer ToServer(1024);\n\tToServer.WriteBEUInt8(0x01);  // To server: Encryption key response\n\tToServer.WriteBEUInt16(static_cast<UInt16>(sizeof(EncryptedSecret)));\n\tToServer.WriteBuf(EncryptedSecret, sizeof(EncryptedSecret));\n\tToServer.WriteBEUInt16(static_cast<UInt16>(sizeof(EncryptedNonce)));\n\tToServer.WriteBuf(EncryptedNonce, sizeof(EncryptedNonce));\n\tDataLog(EncryptedSecret, sizeof(EncryptedSecret), \"Encrypted secret (%u bytes)\", static_cast<unsigned>(sizeof(EncryptedSecret)));\n\tDataLog(EncryptedNonce,  sizeof(EncryptedNonce),  \"Encrypted nonce (%u bytes)\",  static_cast<unsigned>(sizeof(EncryptedNonce)));\n\tcByteBuffer Len(5);\n\tLen.WriteVarInt32(static_cast<UInt32>(ToServer.GetReadableSpace()));\n\tSERVERSEND(Len);\n\tSERVERSEND(ToServer);\n\tm_ServerState = csEncryptedUnderstood;\n\tm_IsServerEncrypted = true;\n}\n"
  },
  {
    "path": "Tools/ProtoProxy/Connection.h",
    "content": "\n// Connection.h\n\n// Interfaces to the cConnection class representing a single pair of connected sockets\n\n\n\n\n\n#pragma once\n\n#include \"ByteBuffer.h\"\n#include \"mbedTLS++/AesCfb128Decryptor.h\"\n#include \"mbedTLS++/AesCfb128Encryptor.h\"\n\n#ifndef _WIN32\n\ttypedef int SOCKET;\n#endif\n\n\n\n\n\nclass cServer;\n\n\n\n\n\nclass cConnection\n{\n\t/** Base for the log filename and all files connected to this log */\n\tAString m_LogNameBase;\n\n\t/** Index for the next file into which item metadata should be written (ParseSlot() function) */\n\tint m_ItemIdx;\n\n\tcCriticalSection m_CSLog;\n\tFILE * m_LogFile;\n\n\tcServer & m_Server;\n\tSOCKET m_ClientSocket;\n\tSOCKET m_ServerSocket;\n\n\tstd::chrono::steady_clock::time_point m_BeginTick;  // Tick when the relative time was first retrieved (used for GetRelativeTime())\n\n\tenum eConnectionState\n\t{\n\t\tcsUnencrypted,           // The connection is not encrypted. Packets must be decoded in order to be able to start decryption.\n\t\tcsEncryptedUnderstood,   // The communication is encrypted and so far all packets have been understood, so they can be still decoded\n\t\tcsEncryptedUnknown,      // The communication is encrypted, but an unknown packet has been received, so packets cannot be decoded anymore\n\t\tcsWaitingForEncryption,  // The communication is waiting for the other line to establish encryption\n\t};\n\n\teConnectionState m_ClientState;\n\teConnectionState m_ServerState;\n\n\tint m_Nonce;\n\npublic:\n\tcConnection(SOCKET a_ClientSocket, cServer & a_Server);\n\t~cConnection();\n\n\tvoid Run(void);\n\n\tvoid vLog(const char * a_Format, fmt::printf_args a_ArgList);\n\n\ttemplate <typename... Args>\n\tvoid Log(const char * a_Format, const Args & ... a_Args)\n\t{\n\t\tvLog(a_Format, fmt::make_printf_args(a_Args...));\n\t}\n\n\tvoid vDataLog(const void * a_Data, size_t a_Size, const char * a_Format, fmt::printf_args a_ArgList);\n\n\ttemplate <typename... Args>\n\tvoid DataLog(const void * a_Data, size_t a_Size, const char * a_Format, const Args & ... a_Args)\n\t{\n\t\tvDataLog(a_Data, a_Size, a_Format, fmt::make_printf_args(a_Args...));\n\t}\n\n\tvoid LogFlush(void);\n\nprotected:\n\n\tcByteBuffer m_ClientBuffer;\n\tcByteBuffer m_ServerBuffer;\n\n\tcAesCfb128Decryptor m_ServerDecryptor;\n\tcAesCfb128Encryptor m_ServerEncryptor;\n\n\tContiguousByteBuffer m_ServerEncryptionBuffer;  // Buffer for the data to be sent to the server once encryption is established\n\n\t/** Set to true when PACKET_PING is received from the client; will cause special parsing for server kick */\n\tbool m_HasClientPinged;\n\n\t/*\n\tThe protocol states can be one of:\n\t-1: no initial handshake received yet\n\t1: status\n\t2: login\n\t3: game\n\t*/\n\t/** State the to-server protocol is in (as defined by the initial handshake / login), -1 if no initial handshake received yet */\n\tint m_ServerProtocolState;\n\n\t/** State the to-client protocol is in (as defined by the initial handshake / login), -1 if no initial handshake received yet */\n\tint m_ClientProtocolState;\n\n\t/** True if the server connection has provided encryption keys */\n\tbool m_IsServerEncrypted;\n\n\n\tbool ConnectToServer(void);\n\n\t/** Relays data from server to client; returns false if connection aborted */\n\tbool RelayFromServer(void);\n\n\t/** Relays data from client to server; returns false if connection aborted */\n\tbool RelayFromClient(void);\n\n\t/** Returns the time relative to the first call of this function, in the fractional seconds elapsed */\n\tdouble GetRelativeTime(void);\n\n\t/** Sends data to the specified socket. If sending fails, prints a fail message using a_Peer and returns false. */\n\tbool SendData(SOCKET a_Socket, ContiguousByteBufferView a_Data, const char * a_Peer);\n\n\t/** Sends data to the specified socket. If sending fails, prints a fail message using a_Peer and returns false. */\n\tbool SendData(SOCKET a_Socket, cByteBuffer & a_Data, const char * a_Peer);\n\n\t/** Sends data to the specfied socket, after encrypting it using a_Encryptor. If sending fails, prints a fail message using a_Peer and returns false */\n\tbool SendEncryptedData(SOCKET a_Socket, cAesCfb128Encryptor & a_Encryptor, ContiguousByteBuffer & a_Data, const char * a_Peer);\n\n\t/** Sends data to the specfied socket, after encrypting it using a_Encryptor. If sending fails, prints a fail message using a_Peer and returns false */\n\tbool SendEncryptedData(SOCKET a_Socket, cAesCfb128Encryptor & a_Encryptor, cByteBuffer & a_Data, const char * a_Peer);\n\n\t/** Decodes packets coming from the client, sends appropriate counterparts to the server; returns false if the connection is to be dropped */\n\tbool DecodeClientsPackets(const char * a_Data, int a_Size);\n\n\t/** Decodes packets coming from the server, sends appropriate counterparts to the client; returns false if the connection is to be dropped */\n\tbool DecodeServersPackets(const char * a_Data, int a_Size);\n\n\t// Packet handling, client-side, initial:\n\tbool HandleClientHandshake(void);\n\n\t// Packet handling, client-side, status:\n\tbool HandleClientStatusPing(void);\n\tbool HandleClientStatusRequest(void);\n\n\t// Packet handling, client-side, login:\n\tbool HandleClientLoginEncryptionKeyResponse(void);\n\tbool HandleClientLoginStart(void);\n\n\t// Packet handling, client-side, game:\n\tbool HandleClientAnimation(void);\n\tbool HandleClientBlockDig(void);\n\tbool HandleClientBlockPlace(void);\n\tbool HandleClientChatMessage(void);\n\tbool HandleClientClientStatuses(void);\n\tbool HandleClientCreativeInventoryAction(void);\n\tbool HandleClientDisconnect(void);\n\tbool HandleClientEntityAction(void);\n\tbool HandleClientKeepAlive(void);\n\tbool HandleClientLocaleAndView(void);\n\tbool HandleClientPing(void);\n\tbool HandleClientPlayerAbilities(void);\n\tbool HandleClientPlayerLook(void);\n\tbool HandleClientPlayerOnGround(void);\n\tbool HandleClientPlayerPosition(void);\n\tbool HandleClientPlayerPositionLook(void);\n\tbool HandleClientPluginMessage(void);\n\tbool HandleClientSlotSelect(void);\n\tbool HandleClientTabCompletion(void);\n\tbool HandleClientUpdateSign(void);\n\tbool HandleClientUseEntity(void);\n\tbool HandleClientWindowClick(void);\n\tbool HandleClientWindowClose(void);\n\n\tbool HandleClientUnknownPacket(UInt32 a_PacketType, UInt32 a_PacketLen, UInt32 a_PacketReadSoFar);\n\n\t// Packet handling, server-side, login:\n\tbool HandleServerLoginDisconnect(void);\n\tbool HandleServerLoginEncryptionKeyRequest(void);\n\tbool HandleServerLoginSuccess(void);\n\n\t// Packet handling, server-side, game:\n\tbool HandleServerAttachEntity(void);\n\tbool HandleServerBlockAction(void);\n\tbool HandleServerBlockChange(void);\n\tbool HandleServerChangeGameState(void);\n\tbool HandleServerChatMessage(void);\n\tbool HandleServerCollectPickup(void);\n\tbool HandleServerCompass(void);\n\tbool HandleServerDestroyEntities(void);\n\tbool HandleServerEntity(void);\n\tbool HandleServerEntityEquipment(void);\n\tbool HandleServerEntityHeadLook(void);\n\tbool HandleServerEntityLook(void);\n\tbool HandleServerEntityMetadata(void);\n\tbool HandleServerEntityProperties(void);\n\tbool HandleServerEntityRelativeMove(void);\n\tbool HandleServerEntityRelativeMoveLook(void);\n\tbool HandleServerEntityStatus(void);\n\tbool HandleServerEntityTeleport(void);\n\tbool HandleServerEntityVelocity(void);\n\tbool HandleServerExplosion(void);\n\tbool HandleServerIncrementStatistic(void);\n\tbool HandleServerJoinGame(void);\n\tbool HandleServerKeepAlive(void);\n\tbool HandleServerKick(void);\n\tbool HandleServerLogin(void);\n\tbool HandleServerMapChunk(void);\n\tbool HandleServerMapChunkBulk(void);\n\tbool HandleServerMultiBlockChange(void);\n\tbool HandleServerNamedSoundEffect(void);\n\tbool HandleServerPlayerAbilities(void);\n\tbool HandleServerPlayerAnimation(void);\n\tbool HandleServerPlayerListItem(void);\n\tbool HandleServerPlayerPositionLook(void);\n\tbool HandleServerPluginMessage(void);\n\tbool HandleServerRespawn(void);\n\tbool HandleServerSetExperience(void);\n\tbool HandleServerSetSlot(void);\n\tbool HandleServerSlotSelect(void);\n\tbool HandleServerSoundEffect(void);\n\tbool HandleServerSpawnExperienceOrbs(void);\n\tbool HandleServerSpawnMob(void);\n\tbool HandleServerSpawnNamedEntity(void);\n\tbool HandleServerSpawnObjectVehicle(void);\n\tbool HandleServerSpawnPainting(void);\n\tbool HandleServerSpawnPickup(void);\n\tbool HandleServerStatistics(void);\n\tbool HandleServerStatusPing(void);\n\tbool HandleServerStatusResponse(void);\n\tbool HandleServerTabCompletion(void);\n\tbool HandleServerTimeUpdate(void);\n\tbool HandleServerUpdateHealth(void);\n\tbool HandleServerUpdateSign(void);\n\tbool HandleServerUpdateTileEntity(void);\n\tbool HandleServerUseBed(void);\n\tbool HandleServerWindowClose(void);\n\tbool HandleServerWindowContents(void);\n\tbool HandleServerWindowOpen(void);\n\n\tbool HandleServerUnknownPacket(UInt32 a_PacketType, UInt32 a_PacketLen, UInt32 a_PacketReadSoFar);\n\n\t/** Parses the slot data in a_Buffer into item description; returns true if successful, false if not enough data */\n\tbool ParseSlot(cByteBuffer & a_Buffer, AString & a_ItemDesc);\n\n\t/** Parses the metadata in a_Buffer into raw metadata in an AString; returns true if successful, false if not enough data */\n\tbool ParseMetadata(cByteBuffer & a_Buffer, AString & a_Metadata);\n\n\t/** Logs the contents of the metadata in the AString, using Log(). Assumes a_Metadata is valid (parsed by ParseMetadata()). The log is indented by a_IndentCount spaces */\n\tvoid LogMetadata(const AString & a_Metadata, size_t a_IndentCount);\n\n\t/** Send EKResp to the server: */\n\tvoid SendEncryptionKeyResponse(const AString & a_ServerPublicKey, const AString & a_Nonce);\n\n\t/** Starts client encryption based on the parameters received */\n\tvoid StartClientEncryption(const AString & a_EncryptedSecret, const AString & a_EncryptedNonce);\n} ;\n"
  },
  {
    "path": "Tools/ProtoProxy/ProtoProxy.cpp",
    "content": "\n// ProtoProxy.cpp\n\n// Implements the main app entrypoint\n\n#include \"Globals.h\"\n#include \"Server.h\"\n#include \"../../src/Logger.h\"\n#include \"../../src/LoggerListeners.h\"\n\n\n\n\n\nint main(int argc, char ** argv)\n{\n\t// Initialize logging subsystem:\n\tauto consoleLogListener = MakeConsoleListener(false);\n\tauto consoleAttachment = cLogger::GetInstance().AttachListener(std::move(consoleLogListener));\n\tauto fileLogListenerRet = MakeFileListener();\n\tif (!fileLogListenerRet.first)\n\t{\n\t\tLOGERROR(\"Failed to open log file, aborting\");\n\t\treturn EXIT_FAILURE;\n\t}\n\tauto fileAttachment = cLogger::GetInstance().AttachListener(std::move(fileLogListenerRet.second));\n\n\tcLogger::InitiateMultithreading();\n\n\tUInt16 ListenPort = 25564;\n\tUInt16 ConnectPort = 25565;\n\tif (argc > 1)\n\t{\n\t\tif (!StringToInteger(argv[1], ListenPort))\n\t\t{\n\t\t\tLOGERROR(\"Invalid argument 1, expected port number, got \\\"%s\\\". Aborting.\", argv[1]);\n\t\t\treturn 1;\n\t\t}\n\t\tif (argc > 2)\n\t\t{\n\t\t\tif (!StringToInteger(argv[2], ConnectPort))\n\t\t\t{\n\t\t\t\tLOGERROR(\"Invalid argument 2, expected port number, got \\\"%s\\\". Aborting.\", argv[2]);\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\t}\n\tcServer Server;\n\tint res = Server.Init(ListenPort, ConnectPort);\n\tif (res != 0)\n\t{\n\t\tLOGERROR(\"Server initialization failed: %d\", res);\n\t\treturn res;\n\t}\n\n\tServer.Run();\n\n\treturn 0;\n}\n"
  },
  {
    "path": "Tools/ProtoProxy/ProtoProxy.txt",
    "content": "\n// ProtoProxy.txt\n\n// A readme for the project\n\n/*\nProtoProxy\n==========\n\nThis is a project to create a proxy for the MineCraft protocol, allowing anyone to view the data sent over a network connection between a client and a server. This, in fact, performs a kind of Man-In-The-Middle (MITM) attack on the protocol by tapping in between the connection points and providing a decrypter and an encrypter for each.\n\nIn order to catch the encryption parameters, the MC protocol needs to be understood at least a little bit at the beginning, when the cryptography parameters are exchanged.\n\nThis project is currently Windows-only and I don't plan on making it multi-platform, although the effort needed for doing so should be minimal.\n\nThe proxy only works on the localhost connection. It listens on port 25564 and expects the underlying MC server to run on port 25565. Ports can be changed by cmdline args: ProtoProxy <listen-port> <server-port>.\n\nYou need to set the server *not* to verify usernames (\"online-mode=false\" in server.properties) in order to be able to connect through ProtoProxy - since the full server name, including the port, is used for verification, the client uses different servername than the server and thus the verification fails.\n\n\n\nProtoProxy is not much dependent on the protocol - it will work with unknown packets, it just won't parse them into human-readable format.\nThe latest protocol which has been tested is 1.7.9 (#5).\n\n\n*/\n\n\n\n\n\n"
  },
  {
    "path": "Tools/ProtoProxy/Server.cpp",
    "content": "\n// Server.cpp\n\n// Interfaces to the cServer class encapsulating the entire \"server\"\n\n#include \"Globals.h\"\n#include \"Server.h\"\n#include \"Connection.h\"\n#include \"../../src/Logger.h\"\n\n\n\n\n\ncServer::cServer(void)\n{\n}\n\n\n\n\n\nint cServer::Init(UInt16 a_ListenPort, UInt16 a_ConnectPort)\n{\n\tm_ConnectPort = a_ConnectPort;\n\n\t#ifdef _WIN32\n\t\tWSAData wsa;\n\t\tint res = WSAStartup(0x0202, &wsa);\n\t\tif (res != 0)\n\t\t{\n\t\t\tLOGERROR(\"Cannot initialize WinSock: %d\", res);\n\t\t\treturn res;\n\t\t}\n\t#endif  // _WIN32\n\n\tm_ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n\tif (m_ListenSocket < 0)\n\t{\n\t\t#ifdef _WIN32\n\t\t\tint err = WSAGetLastError();\n\t\t#else\n\t\t\tint err = errno;\n\t\t#endif\n\t\tLOGERROR(\"Failed to create listener socket: %d\", err);\n\t\treturn err;\n\t}\n\tsockaddr_in local;\n\tmemset(&local, 0, sizeof(local));\n\tlocal.sin_family = AF_INET;\n\tlocal.sin_addr.s_addr = INADDR_ANY;  // All interfaces\n\tlocal.sin_port = htons(a_ListenPort);\n\tif (bind(m_ListenSocket, reinterpret_cast<const sockaddr *>(&local), sizeof(local)) != 0)\n\t{\n\t\t#ifdef _WIN32\n\t\t\tint err = WSAGetLastError();\n\t\t#else\n\t\t\tint err = errno;\n\t\t#endif\n\t\tLOGERROR(\"Failed to bind listener socket: %d\", err);\n\t\treturn err;\n\t}\n\tif (listen(m_ListenSocket, 1) != 0)\n\t{\n\t\t#ifdef _WIN32\n\t\t\tint err = WSAGetLastError();\n\t\t#else\n\t\t\tint err = errno;\n\t\t#endif\n\t\tprintf(\"Failed to listen on socket: %d\\n\", err);\n\t\treturn err;\n\t}\n\tLOGINFO(\"Listening for client connections on port %d, connecting to server at localhost:%d\", a_ListenPort, a_ConnectPort);\n\n\tLOGINFO(\"Generating protocol encryption keypair...\");\n\tm_PrivateKey.Generate();\n\tm_PublicKeyDER = m_PrivateKey.GetPubKeyDER();\n\n\treturn 0;\n}\n\n\n\n\n\nvoid cServer::Run(void)\n{\n\tLOGINFO(\"Server running.\");\n\twhile (true)\n\t{\n\t\tsockaddr_in Addr;\n\t\tmemset(&Addr, 0, sizeof(Addr));\n\t\tsocklen_t AddrSize = sizeof(Addr);\n\t\tSOCKET client = accept(m_ListenSocket, reinterpret_cast<sockaddr *>(&Addr), &AddrSize);\n\t\tif (client == INVALID_SOCKET)\n\t\t{\n\t\t\tprintf(\"accept returned an error: %d; bailing out.\\n\", SocketError);\n\t\t\treturn;\n\t\t}\n\t\tLOGINFO(\"Client connected, proxying...\");\n\t\tcConnection Connection(client, *this);\n\t\tConnection.Run();\n\t\tLOGINFO(\"Client disconnected. Ready for another connection.\");\n\t}\n}\n"
  },
  {
    "path": "Tools/ProtoProxy/Server.h",
    "content": "\n// Server.h\n\n// Interfaces to the cServer class encapsulating the entire \"server\"\n\n\n\n\n\n#pragma once\n\n#include \"Globals.h\"\n#include \"mbedTLS++/RsaPrivateKey.h\"\n\n#ifdef _WIN32\n\t#define SocketError WSAGetLastError()\n#else\n\ttypedef int SOCKET;\n\tenum\n\t{\n\t\tINVALID_SOCKET = -1,\n\t};\n\t#define closesocket close\n\t#define SocketError errno\n#endif\n\n\n\n\n\nclass cServer\n{\n\tSOCKET m_ListenSocket;\n\tcRsaPrivateKey m_PrivateKey;\n\tContiguousByteBuffer m_PublicKeyDER;\n\tUInt16 m_ConnectPort;\n\npublic:\n\tcServer(void);\n\n\tint  Init(UInt16 a_ListenPort, UInt16 a_ConnectPort);\n\tvoid Run(void);\n\n\tcRsaPrivateKey & GetPrivateKey(void) { return m_PrivateKey; }\n\tContiguousByteBufferView GetPublicKeyDER (void) { return m_PublicKeyDER; }\n\n\tUInt16 GetConnectPort(void) const { return m_ConnectPort; }\n} ;\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/.gitignore",
    "content": "*.pro.user\n*.pro.user.*\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/BiomeView.cpp",
    "content": "#include \"Globals.h\"\n#include \"BiomeView.h\"\n#include <QPainter>\n#include <QResizeEvent>\n#include \"Region.h\"\n\n\n\n\n\nstatic const int DELTA_STEP = 120;  // The normal per-notch wheel delta\n\n\n\n\n\n/** Map for converting biome values to colors. Initialized from biomeColors[]. */\nstatic uchar biomeToColor[256 * 4];\n\n/** Map for converting biome values to colors. Used to initialize biomeToColor[]. */\nstatic struct\n{\n\tEMCSBiome m_Biome;\n\tuchar m_Color[3];\n} biomeColors[] =\n{\n\t{ biOcean,                { 0x00, 0x00, 0x70 }, },\n\t{ biPlains,               { 0x8d, 0xb3, 0x60 }, },\n\t{ biDesert,               { 0xfa, 0x94, 0x18 }, },\n\t{ biExtremeHills,         { 0x60, 0x60, 0x60 }, },\n\t{ biForest,               { 0x05, 0x66, 0x21 }, },\n\t{ biTaiga,                { 0x0b, 0x66, 0x59 }, },\n\t{ biSwampland,            { 0x2f, 0xff, 0xda }, },\n\t{ biRiver,                { 0x30, 0x30, 0xaf }, },\n\t{ biHell,                 { 0x7f, 0x00, 0x00 }, },\n\t{ biSky,                  { 0x00, 0x7f, 0xff }, },\n\t{ biFrozenOcean,          { 0xa0, 0xa0, 0xdf }, },\n\t{ biFrozenRiver,          { 0xa0, 0xa0, 0xff }, },\n\t{ biIcePlains,            { 0xff, 0xff, 0xff }, },\n\t{ biIceMountains,         { 0xa0, 0xa0, 0xa0 }, },\n\t{ biMushroomIsland,       { 0xff, 0x00, 0xff }, },\n\t{ biMushroomShore,        { 0xa0, 0x00, 0xff }, },\n\t{ biBeach,                { 0xfa, 0xde, 0x55 }, },\n\t{ biDesertHills,          { 0xd2, 0x5f, 0x12 }, },\n\t{ biForestHills,          { 0x22, 0x55, 0x1c }, },\n\t{ biTaigaHills,           { 0x16, 0x39, 0x33 }, },\n\t{ biExtremeHillsEdge,     { 0x7f, 0x8f, 0x7f }, },\n\t{ biJungle,               { 0x53, 0x7b, 0x09 }, },\n\t{ biJungleHills,          { 0x2c, 0x42, 0x05 }, },\n\n\t{ biJungleEdge,           { 0x62, 0x8b, 0x17 }, },\n\t{ biDeepOcean,            { 0x00, 0x00, 0x30 }, },\n\t{ biStoneBeach,           { 0xa2, 0xa2, 0x84 }, },\n\t{ biColdBeach,            { 0xfa, 0xf0, 0xc0 }, },\n\t{ biBirchForest,          { 0x30, 0x74, 0x44 }, },\n\t{ biBirchForestHills,     { 0x1f, 0x5f, 0x32 }, },\n\t{ biRoofedForest,         { 0x40, 0x51, 0x1a }, },\n\t{ biColdTaiga,            { 0x31, 0x55, 0x4a }, },\n\t{ biColdTaigaHills,       { 0x59, 0x7d, 0x72 }, },\n\t{ biMegaTaiga,            { 0x59, 0x66, 0x51 }, },\n\t{ biMegaTaigaHills,       { 0x59, 0x66, 0x59 }, },\n\t{ biExtremeHillsPlus,     { 0x50, 0x70, 0x50 }, },\n\t{ biSavanna,              { 0xbd, 0xb2, 0x5f }, },\n\t{ biSavannaPlateau,       { 0xa7, 0x9d, 0x64 }, },\n\t{ biMesa,                 { 0xd9, 0x45, 0x15 }, },\n\t{ biMesaPlateauF,         { 0xb0, 0x97, 0x65 }, },\n\t{ biMesaPlateau,          { 0xca, 0x8c, 0x65 }, },\n\n\t// M variants:\n\t{ biSunflowerPlains,      { 0xb5, 0xdb, 0x88 }, },\n\t{ biDesertM,              { 0xff, 0xbc, 0x40 }, },\n\t{ biExtremeHillsM,        { 0x88, 0x88, 0x88 }, },\n\t{ biFlowerForest,         { 0x2d, 0x8e, 0x49 }, },\n\t{ biTaigaM,               { 0x33, 0x8e, 0x81 }, },\n\t{ biSwamplandM,           { 0x07, 0xf9, 0xb2 }, },\n\t{ biIcePlainsSpikes,      { 0xb4, 0xdc, 0xdc }, },\n\t{ biJungleM,              { 0x7b, 0xa3, 0x31 }, },\n\t{ biJungleEdgeM,          { 0x62, 0x8b, 0x17 }, },\n\t{ biBirchForestM,         { 0x58, 0x9c, 0x6c }, },\n\t{ biBirchForestHillsM,    { 0x47, 0x87, 0x5a }, },\n\t{ biRoofedForestM,        { 0x68, 0x79, 0x42 }, },\n\t{ biColdTaigaM,           { 0x24, 0x3f, 0x36 }, },\n\t{ biMegaSpruceTaiga,      { 0x45, 0x4f, 0x3e }, },\n\t{ biMegaSpruceTaigaHills, { 0x45, 0x4f, 0x4e }, },\n\t{ biExtremeHillsPlusM,    { 0x78, 0x98, 0x78 }, },\n\t{ biSavannaM,             { 0xe5, 0xda, 0x87 }, },\n\t{ biSavannaPlateauM,      { 0xa7, 0x9d, 0x74 }, },\n\t{ biMesaBryce,            { 0xff, 0x6d, 0x3d }, },\n\t{ biMesaPlateauFM,        { 0xd8, 0xbf, 0x8d }, },\n\t{ biMesaPlateauM,         { 0xf2, 0xb4, 0x8d }, },\n} ;\n\n\n\n\n\nstatic class BiomeColorsInitializer\n{\npublic:\n\tBiomeColorsInitializer(void)\n\t{\n\t\t// Reset all colors to gray:\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(biomeToColor); i++)\n\t\t{\n\t\t\tbiomeToColor[i] = 0x7f;\n\t\t}\n\n\t\t// Set known biomes to their colors:\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(biomeColors); i++)\n\t\t{\n\t\t\tuchar * color = &biomeToColor[4 * biomeColors[i].m_Biome];\n\t\t\tcolor[0] = biomeColors[i].m_Color[2];\n\t\t\tcolor[1] = biomeColors[i].m_Color[1];\n\t\t\tcolor[2] = biomeColors[i].m_Color[0];\n\t\t\tcolor[3] = 0xff;\n\t\t}\n\t}\n} biomeColorInitializer;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// BiomeView:\n\nBiomeView::BiomeView(QWidget * parent) :\n\tsuper(parent),\n\tm_X(0),\n\tm_Z(0),\n\tm_Zoom(1),\n\tm_IsMouseDragging(false),\n\tm_MouseWheelDelta(0)\n{\n\t// Create the image used for undefined chunks:\n\tint offset = 0;\n\tfor (int y = 0; y < 16; y++)\n\t{\n\t\tfor (int x = 0; x < 16; x++)\n\t\t{\n\t\t\tuchar color = (((x & 8) ^ (y & 8)) == 0) ? 0x44 : 0x88;\n\t\t\tm_EmptyChunkImage[offset++] = color;\n\t\t\tm_EmptyChunkImage[offset++] = color;\n\t\t\tm_EmptyChunkImage[offset++] = color;\n\t\t\tm_EmptyChunkImage[offset++] = 0xff;\n\t\t}\n\t}\n\n\t// Create the startup image:\n\tredraw();\n\n\t// Add a chunk-update callback mechanism:\n\tconnect(&m_Cache, SIGNAL(regionAvailable(int, int)), this, SLOT(regionAvailable(int, int)));\n\n\t// Allow mouse and keyboard interaction:\n\tsetFocusPolicy(Qt::StrongFocus);\n\tsetMouseTracking(true);\n}\n\n\n\n\nQSize BiomeView::minimumSizeHint() const\n{\n\treturn QSize(300, 300);\n}\n\n\n\n\n\nQSize BiomeView::sizeHint() const\n{\n\treturn QSize(800, 600);\n}\n\n\n\n\n\nvoid BiomeView::setChunkSource(std::shared_ptr<ChunkSource> a_ChunkSource)\n{\n\t// Replace the source in the cache:\n\tm_Cache.setChunkSource(a_ChunkSource);\n\n\t// Redraw with the new source:\n\tredraw();\n}\n\n\n\n\n\nvoid BiomeView::setPosition(int a_BlockX, int a_BlockZ)\n{\n\tm_X = a_BlockX;\n\tm_Z = a_BlockZ;\n\tredraw();\n}\n\n\n\n\n\nvoid BiomeView::setZoomLevel(double a_ZoomLevel)\n{\n\tm_Zoom = a_ZoomLevel;\n\tredraw();\n}\n\n\n\n\n\nvoid BiomeView::redraw()\n{\n\tif (!hasData())\n\t{\n\t\t// No data means no image is displayed, no need to compose:\n\t\tupdate();\n\t\treturn;\n\t}\n\n\tint chunksize = 16 * m_Zoom;\n\n\t// first find the center block position\n\tint centerchunkx = floor(m_X / 16);\n\tint centerchunkz = floor(m_Z / 16);\n\t// and the center of the screen\n\tint centerx = m_Image.width()  / 2;\n\tint centery = m_Image.height() / 2;\n\t// and align for panning\n\tcenterx -= (m_X - centerchunkx * 16) * m_Zoom;\n\tcentery -= (m_Z - centerchunkz * 16) * m_Zoom;\n\t// now calculate the topleft block on the screen\n\tint startx = centerchunkx - centerx / chunksize - 1;\n\tint startz = centerchunkz - centery / chunksize - 1;\n\t// and the dimensions of the screen in blocks\n\tint blockswide = m_Image.width()  / chunksize + 3;\n\tint blockstall = m_Image.height() / chunksize + 3;\n\n\tfor (int z = startz; z < startz + blockstall; z++)\n\t{\n\t\tfor (int x = startx; x < startx + blockswide; x++)\n\t\t{\n\t\t\tdrawChunk(x, z);\n\t\t}\n\t}\n\tupdate();\n}\n\n\n\n\n\nvoid BiomeView::regionAvailable(int a_RegionX, int a_RegionZ)\n{\n\tfor (int z = 0; z < 32; z++)\n\t{\n\t\tfor (int x = 0; x < 32; x++)\n\t\t{\n\t\t\tdrawChunk(a_RegionX * 32 + x, a_RegionZ * 32 + z);\n\t\t}\n\t}\n\tupdate();\n}\n\n\n\n\n\nvoid BiomeView::reload()\n{\n\tif (!hasData())\n\t{\n\t\treturn;\n\t}\n\tm_Cache.reload();\n\n\tredraw();\n}\n\n\n\n\n\nvoid BiomeView::drawChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tif (!hasData())\n\t{\n\t\treturn;\n\t}\n\n\t// Fetch the region:\n\tint regionX;\n\tint regionZ;\n\tRegion::chunkToRegion(a_ChunkX, a_ChunkZ, regionX, regionZ);\n\tRegionPtr region = m_Cache.fetch(regionX, regionZ);\n\n\t// Figure out where on the screen this chunk should be drawn:\n\t// first find the center chunk\n\tint centerchunkx = floor(m_X / 16);\n\tint centerchunkz = floor(m_Z / 16);\n\t// and the center chunk screen coordinates\n\tint centerx = m_Image.width()  / 2;\n\tint centery = m_Image.height() / 2;\n\t// which need to be shifted to account for panning inside that chunk\n\tcenterx -= (m_X - centerchunkx * 16) * m_Zoom;\n\tcentery -= (m_Z - centerchunkz * 16) * m_Zoom;\n\t// centerx, centery now points to the top left corner of the center chunk\n\t// so now calculate our x, y in relation\n\tdouble chunksize = 16 * m_Zoom;\n\tcenterx += (a_ChunkX - centerchunkx) * chunksize;\n\tcentery += (a_ChunkZ - centerchunkz) * chunksize;\n\n\tuchar * bits = m_Image.bits();\n\tint imgstride = m_Image.bytesPerLine();\n\n\tint skipx = 0, skipy = 0;\n\tint blockwidth = chunksize, blockheight = chunksize;\n\t// now if we're off the screen we need to crop\n\tif (centerx < 0)\n\t{\n\t\tskipx = -centerx;\n\t\tcenterx = 0;\n\t}\n\tif (centery < 0)\n\t{\n\t\tskipy = -centery;\n\t\tcentery = 0;\n\t}\n\t// or the other side, we need to trim\n\tif (centerx + blockwidth > m_Image.width())\n\t{\n\t\tblockwidth = m_Image.width() - centerx;\n\t}\n\tif (centery + blockheight > m_Image.height())\n\t{\n\t\tblockheight = m_Image.height() - centery;\n\t}\n\tif ((blockwidth <= 0) || (skipx >= blockwidth))\n\t{\n\t\treturn;\n\t}\n\tint imgoffset = centerx * 4 + centery * imgstride;\n\n\t// If the chunk is valid, use its data; otherwise use the empty placeholder:\n\tconst short * src = m_EmptyChunkBiomes;\n\tif (region.get() != nullptr)\n\t{\n\t\tint relChunkX = a_ChunkX - regionX * 32;\n\t\tint relChunkZ = a_ChunkZ - regionZ * 32;\n\t\tChunk & chunk = region->getRelChunk(relChunkX, relChunkZ);\n\t\tif (chunk.isValid())\n\t\t{\n\t\t\tsrc = chunk.getBiomes();\n\t\t}\n\t}\n\n\t// Scale-blit the image:\n\tfor (int z = skipy; z < blockheight; z++, imgoffset += imgstride)\n\t{\n\t\tsize_t srcoffset = static_cast<size_t>(std::floor((double)z / m_Zoom)) * 16;\n\t\tint imgxoffset = imgoffset;\n\t\tfor (int x = skipx; x < blockwidth; x++)\n\t\t{\n\t\t\tshort biome = src[srcoffset + static_cast<size_t>(std::floor((double)x / m_Zoom))];\n\t\t\tconst uchar * color;\n\t\t\tif (biome < 0)\n\t\t\t{\n\t\t\t\tstatic const uchar emptyBiome1[] = { 0x44, 0x44, 0x44, 0xff };\n\t\t\t\tstatic const uchar emptyBiome2[] = { 0x88, 0x88, 0x88, 0xff };\n\t\t\t\tcolor = ((x & 8) ^ (z & 8)) ? emptyBiome1 : emptyBiome2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (biome * 4 >= ARRAYCOUNT(biomeToColor))\n\t\t\t\t{\n\t\t\t\t\tstatic const uchar errorImage[] = { 0xff, 0x00, 0x00, 0xff };\n\t\t\t\t\tcolor = errorImage;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcolor = biomeToColor + biome * 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbits[imgxoffset]     = color[0];\n\t\t\tbits[imgxoffset + 1] = color[1];\n\t\t\tbits[imgxoffset + 2] = color[2];\n\t\t\tbits[imgxoffset + 3] = color[3];\n\t\t\timgxoffset += 4;\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid BiomeView::resizeEvent(QResizeEvent * a_Event)\n{\n\tm_Image = QImage(a_Event->size(), QImage::Format_RGB32);\n\tredraw();\n}\n\n\n\n\n\nvoid BiomeView::paintEvent(QPaintEvent * a_Event)\n{\n\tQPainter p(this);\n\tif (hasData())\n\t{\n\t\tp.drawImage(QPoint(0, 0), m_Image);\n\t}\n\telse\n\t{\n\t\tp.drawText(a_Event->rect(), Qt::AlignCenter, \"No chunk source selected\");\n\t}\n\tp.end();\n}\n\n\n\n\n\nvoid BiomeView::mousePressEvent(QMouseEvent * a_Event)\n{\n\tm_LastX = a_Event->x();\n\tm_LastY = a_Event->y();\n\tm_IsMouseDragging = true;\n}\n\n\n\n\n\nvoid BiomeView::mouseMoveEvent(QMouseEvent * a_Event)\n{\n\t// If there's no data displayed, bail out:\n\tif (!hasData())\n\t{\n\t\treturn;\n\t}\n\n\tif (m_IsMouseDragging)\n\t{\n\t\t// The user is dragging the mouse, move the view around:\n\t\tm_X += (m_LastX - a_Event->x()) / m_Zoom;\n\t\tm_Z += (m_LastY - a_Event->y()) / m_Zoom;\n\t\tm_LastX = a_Event->x();\n\t\tm_LastY = a_Event->y();\n\t\tredraw();\n\t\treturn;\n\t}\n\n\t// Update the status bar info text:\n\tint blockX = floor((a_Event->x() - width()  / 2) / m_Zoom + m_X);\n\tint blockZ = floor((a_Event->y() - height() / 2) / m_Zoom + m_Z);\n\tint regionX, regionZ;\n\tRegion::blockToRegion(blockX, blockZ, regionX, regionZ);\n\tint relX = blockX - regionX * 512;\n\tint relZ = blockZ - regionZ * 512;\n\tauto region = m_Cache.fetch(regionX, regionZ);\n\tint biome = (region.get() != nullptr) ? region->getRelBiome(relX, relZ) : biInvalidBiome;\n\temit hoverChanged(blockX, blockZ, biome);\n}\n\n\n\n\n\nvoid BiomeView::mouseReleaseEvent(QMouseEvent *)\n{\n\tm_IsMouseDragging = false;\n}\n\n\n\n\n\nvoid BiomeView::wheelEvent(QWheelEvent * a_Event)\n{\n\tm_MouseWheelDelta += a_Event->delta();\n\twhile (m_MouseWheelDelta >= DELTA_STEP)\n\t{\n\t\temit wheelUp();\n\t\tm_MouseWheelDelta -= DELTA_STEP;\n\t}\n\twhile (m_MouseWheelDelta <= -DELTA_STEP)\n\t{\n\t\temit wheelDown();\n\t\tm_MouseWheelDelta += DELTA_STEP;\n\t}\n}\n\n\n\n\n\nvoid BiomeView::keyPressEvent(QKeyEvent * a_Event)\n{\n\tswitch (a_Event->key())\n\t{\n\t\tcase Qt::Key_Up:\n\t\tcase Qt::Key_W:\n\t\t{\n\t\t\tm_Z -= 10.0 / m_Zoom;\n\t\t\tredraw();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Qt::Key_Down:\n\t\tcase Qt::Key_S:\n\t\t{\n\t\t\tm_Z += 10.0 / m_Zoom;\n\t\t\tredraw();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Qt::Key_Left:\n\t\tcase Qt::Key_A:\n\t\t{\n\t\t\tm_X -= 10.0 / m_Zoom;\n\t\t\tredraw();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Qt::Key_Right:\n\t\tcase Qt::Key_D:\n\t\t{\n\t\t\tm_X += 10.0 / m_Zoom;\n\t\t\tredraw();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Qt::Key_PageUp:\n\t\tcase Qt::Key_Q:\n\t\t{\n\t\t\temit increaseZoom();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Qt::Key_PageDown:\n\t\tcase Qt::Key_E:\n\t\t{\n\t\t\temit decreaseZoom();\n\t\t\tbreak;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/BiomeView.h",
    "content": "#pragma once\n\n#include <QWidget>\n#include <memory>\n#include \"RegionCache.h\"\n#include \"ChunkSource.h\"\n\n\n\n\n\nclass BiomeView :\n\tpublic QWidget\n{\n\ttypedef QWidget super;\n\tQ_OBJECT\n\npublic:\n\texplicit BiomeView(QWidget * parent = NULL);\n\n\tQSize minimumSizeHint() const;\n\tQSize sizeHint() const;\n\n\t/** Replaces the chunk source used by the biome view to get the chunk biome data.\n\tThe entire view is then invalidated and regenerated. */\n\tvoid setChunkSource(std::shared_ptr<ChunkSource> a_ChunkSource);\n\n\t/** Sets the position of the central pixel of the map to the specified point and redraws the view. */\n\tvoid setPosition(int a_BlockX, int a_BlockZ);\n\n\t/** Sets the zoom level to the specified value and redraws the view. */\n\tvoid setZoomLevel(double a_ZoomLevel);\n\nsignals:\n\t/** Signalled when the user uses the wheel to scroll upwards. */\n\tvoid wheelUp();\n\n\t/** Signalled when the user uses the wheel to scroll downwards. */\n\tvoid wheelDown();\n\n\t/** Signalled when the user presses a key to increase zoom. */\n\tvoid increaseZoom();\n\n\t/** Signalled when the user presses a key to decrease zoom. */\n\tvoid decreaseZoom();\n\n\t/** Emitted when the user moves the mouse, to reflect the current block under the cursor. */\n\tvoid hoverChanged(int a_BlockX, int a_BlockZ, int a_Biome);\n\npublic slots:\n\t/** Redraw the entire widget area. */\n\tvoid redraw();\n\n\t/** A specified region has become available, redraw it. */\n\tvoid regionAvailable(int a_RegionX, int a_RegionZ);\n\n\t/** Reloads the current chunk source and redraws the entire workspace. */\n\tvoid reload();\n\nprotected:\n\tdouble m_X, m_Z;\n\tdouble m_Zoom;\n\n\t/** Cache for the loaded chunk data. */\n\tRegionCache m_Cache;\n\n\t/** The entire view's contents in an offscreen image. */\n\tQImage m_Image;\n\n\t/** Coords of the mouse for the previous position, used while dragging. */\n\tint m_LastX, m_LastY;\n\n\t/** Set to true when the user has a mouse button depressed, and is dragging the view. */\n\tbool m_IsMouseDragging;\n\n\t/** Accumulator for the mouse wheel's delta. When the accumulator hits a threshold, the view zooms. */\n\tint m_MouseWheelDelta;\n\n\t/** Data used for rendering a chunk that hasn't been loaded yet */\n\tuchar m_EmptyChunkImage[16 * 16 * 4];\n\n\t/** Data placeholder for chunks that aren't valid. */\n\tshort m_EmptyChunkBiomes[16 * 16];\n\n\n\t/** Draws the specified chunk into m_Image */\n\tvoid drawChunk(int a_ChunkX, int a_ChunkZ);\n\n\t/** Returns true iff the biome view has been initialized to contain proper biome data. */\n\tbool hasData(void) const { return m_Cache.hasData(); }\n\n\t/** Called when the widget is resized */\n\tvirtual void resizeEvent(QResizeEvent *) override;\n\n\t/** Paints the entire widget */\n\tvirtual void paintEvent(QPaintEvent *) override;\n\n\t/** Called when the user presses any mouse button. */\n\tvirtual void mousePressEvent(QMouseEvent * a_Event);\n\n\t/** Called when the user moves the mouse. */\n\tvirtual void mouseMoveEvent(QMouseEvent * a_Event);\n\n\t/** Called when the user releases a previously held mouse button. */\n\tvirtual void mouseReleaseEvent(QMouseEvent * a_Event) override;\n\n\t/** Called when the user rotates the mouse wheel. */\n\tvirtual void wheelEvent(QWheelEvent * a_Event) override;\n\n\t/** Called when the user presses a key. */\n\tvirtual void keyPressEvent(QKeyEvent * a_Event) override;\n};\n\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/ChunkSource.cpp",
    "content": "#include \"Globals.h\"\n#include \"ChunkSource.h\"\n#include <QThread>\n#include \"src/Generating/BioGen.h\"\n#include \"src/StringCompression.h\"\n#include \"src/WorldStorage/FastNBT.h\"\n#include \"src/IniFile.h\"\n#include \"src/Endianness.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// BioGenSource:\n\nBioGenSource::BioGenSource(cIniFilePtr a_IniFile) :\n\tm_IniFile(a_IniFile),\n\tm_Mtx(QMutex::Recursive)\n{\n\treload();\n}\n\n\n\n\n\nvoid BioGenSource::getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChunk)\n{\n\tcChunkDef::BiomeMap biomes;\n\tint tag;\n\tcBiomeGenPtr biomeGen = getBiomeGen(tag);\n\tbiomeGen->GenBiomes(a_ChunkX, a_ChunkZ, biomes);\n\treleaseBiomeGen(std::move(biomeGen), tag);\n\ta_DestChunk.setBiomes(biomes);\n}\n\n\n\n\n\nvoid BioGenSource::reload()\n{\n\tQMutexLocker lock(&m_Mtx);\n\tm_CurrentTag += 1;\n\tm_BiomeGens.clear();\n}\n\n\n\n\n\ncBiomeGenPtr BioGenSource::getBiomeGen(int & a_Tag)\n{\n\tQMutexLocker lock(&m_Mtx);\n\ta_Tag = m_CurrentTag;\n\tif (m_BiomeGens.empty())\n\t{\n\t\t// Create a new biogen:\n\t\tlock.unlock();\n\t\tint seed = m_IniFile->GetValueSetI(\"Seed\", \"Seed\", 0);\n\t\tbool unused;\n\t\tcBiomeGenPtr res = cBiomeGen::CreateBiomeGen(*m_IniFile, seed, unused);\n\t\treturn res;\n\t}\n\telse\n\t{\n\t\t// Return an existing biogen:\n\t\tcBiomeGenPtr res = m_BiomeGens.back();\n\t\tm_BiomeGens.pop_back();\n\t\treturn res;\n\t}\n}\n\n\n\n\n\nvoid BioGenSource::releaseBiomeGen(cBiomeGenPtr && a_BiomeGen, int a_Tag)\n{\n\tQMutexLocker lock(&m_Mtx);\n\n\t// If the tag differs, the source has been reloaded and this biogen is old, dispose:\n\tif (a_Tag != m_CurrentTag)\n\t{\n\t\treturn;\n\t}\n\n\t// The tag is the same, put the biogen back to list:\n\tm_BiomeGens.push_back(std::move(a_BiomeGen));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// AnvilSource::AnvilFile\n\nclass AnvilSource::AnvilFile\n{\npublic:\n\t/** Coordinates of the region file. */\n\tint m_RegionX, m_RegionZ;\n\n\t/** True iff the file contains proper data. */\n\tbool m_IsValid;\n\n\n\n\t/** Creates a new instance with the specified region coords. Reads the file header. */\n\tAnvilFile(int a_RegionX, int a_RegionZ, const AString & a_WorldPath) :\n\t\tm_RegionX(a_RegionX),\n\t\tm_RegionZ(a_RegionZ),\n\t\tm_IsValid(false)\n\t{\n\t\treadFile(Printf(\"%s/r.%d.%d.mca\", a_WorldPath.c_str(), a_RegionX, a_RegionZ));\n\t}\n\n\n\n\t/** Returns the compressed data of the specified chunk.\n\tReturns an empty string when chunk not present. */\n\tAString getChunkData(int a_ChunkX, int a_ChunkZ)\n\t{\n\t\tif (!m_IsValid)\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\n\t\t// Translate to local coords:\n\t\tint RelChunkX = a_ChunkX - m_RegionX * 32;\n\t\tint RelChunkZ = a_ChunkZ - m_RegionZ * 32;\n\t\tASSERT((RelChunkX >= 0) && (RelChunkX < 32));\n\t\tASSERT((RelChunkZ >= 0) && (RelChunkZ < 32));\n\n\t\t// Get the chunk data location:\n\t\tUInt32 chunkOffset = m_Header[RelChunkX + 32 * RelChunkZ] >> 8;\n\t\tUInt32 numChunkSectors = m_Header[RelChunkX + 32 * RelChunkZ] & 0xff;\n\t\tif ((chunkOffset < 2) || (numChunkSectors == 0))\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\n\t\t// Get the real data size:\n\t\tconst char * chunkData = m_FileData.data() + chunkOffset * 4096;\n\t\tUInt32 chunkSize = NetworkBufToHost(chunkData);\n\t\tif ((chunkSize < 2) || (chunkSize / 4096 > numChunkSectors))\n\t\t{\n\t\t\t// Bad data, bail out\n\t\t\treturn \"\";\n\t\t}\n\n\t\t// Check the compression method:\n\t\tif (chunkData[4] != 2)\n\t\t{\n\t\t\t// Chunk is in an unknown compression\n\t\t\treturn \"\";\n\t\t}\n\t\tchunkSize--;\n\n\t\t// Read the chunk data:\n\t\treturn m_FileData.substr(chunkOffset * 4096 + 5, chunkSize);\n\t}\n\nprotected:\n\tAString m_FileData;\n\tUInt32 m_Header[2048];\n\n\n\t/** Reads the whole specified file contents and parses the header. */\n\tvoid readFile(const AString & a_FileName)\n\t{\n\t\t// Read the entire file:\n\t\tm_FileData = cFile::ReadWholeFile(a_FileName);\n\t\tif (m_FileData.size() < sizeof(m_Header))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse the header - change endianness:\n\t\tconst char * hdr = m_FileData.data();\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(m_Header); i++)\n\t\t{\n\t\t\tm_Header[i] = NetworkBufToHost(hdr + 4 * i);\n\t\t}\n\t\tm_IsValid = true;\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// AnvilSource:\n\nAnvilSource::AnvilSource(QString a_WorldRegionFolder) :\n\tm_WorldRegionFolder(a_WorldRegionFolder)\n{\n}\n\n\n\n\n\nvoid AnvilSource::getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChunk)\n{\n\t// Load the compressed data:\n\tAString compressedChunkData = getCompressedChunkData(a_ChunkX, a_ChunkZ);\n\tif (compressedChunkData.empty())\n\t{\n\t\treturn;\n\t}\n\n\t// Uncompress the chunk data:\n\tAString uncompressed;\n\tint res = InflateString(compressedChunkData.data(), compressedChunkData.size(), uncompressed);\n\tif (res != Z_OK)\n\t{\n\t\treturn;\n\t}\n\n\t// Parse the NBT data:\n\tcParsedNBT nbt(uncompressed.data(), uncompressed.size());\n\tif (!nbt.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\t// Get the biomes out of the NBT:\n\tint Level = nbt.FindChildByName(0, \"Level\");\n\tif (Level < 0)\n\t{\n\t\treturn;\n\t}\n\tcChunkDef::BiomeMap biomeMap;\n\tint mcsBiomes = nbt.FindChildByName(Level, \"MCSBiomes\");\n\tif ((mcsBiomes >= 0) && (nbt.GetDataLength(mcsBiomes) == sizeof(biomeMap)))\n\t{\n\t\t// Convert the biomes from BigEndian to platform native numbers:\n\t\tconst char * beBiomes = nbt.GetData(mcsBiomes);\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(biomeMap); i++)\n\t\t{\n\t\t\tbiomeMap[i] = (EMCSBiome)NetworkBufToHost<Int32>(beBiomes + 4 * i);\n\t\t}\n\t\ta_DestChunk.setBiomes(biomeMap);\n\t\treturn;\n\t}\n\n\t// MCS biomes not found, load Vanilla biomes instead:\n\tint biomes = nbt.FindChildByName(Level, \"Biomes\");\n\tif ((biomes < 0) || (nbt.GetDataLength(biomes) != ARRAYCOUNT(biomeMap)))\n\t{\n\t\treturn;\n\t}\n\t// Convert the biomes from Vanilla to EMCSBiome:\n\tconst char * vanillaBiomes = nbt.GetData(biomes);\n\tfor (size_t i = 0; i < ARRAYCOUNT(biomeMap); i++)\n\t{\n\t\tbiomeMap[i] = EMCSBiome(vanillaBiomes[i]);\n\t}\n\ta_DestChunk.setBiomes(biomeMap);\n}\n\n\n\n\n\nvoid AnvilSource::reload()\n{\n\t// Remove all files from the cache:\n\tQMutexLocker lock(&m_Mtx);\n\tm_Files.clear();\n}\n\n\n\n\n\nvoid AnvilSource::chunkToRegion(int a_ChunkX, int a_ChunkZ, int & a_RegionX, int & a_RegionZ)\n{\n\ta_RegionX = a_ChunkX >> 5;\n\ta_RegionZ = a_ChunkZ >> 5;\n}\n\n\n\n\n\nAString AnvilSource::getCompressedChunkData(int a_ChunkX, int a_ChunkZ)\n{\n\treturn getAnvilFile(a_ChunkX, a_ChunkZ)->getChunkData(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nAnvilSource::AnvilFilePtr AnvilSource::getAnvilFile(int a_ChunkX, int a_ChunkZ)\n{\n\tint RegionX, RegionZ;\n\tchunkToRegion(a_ChunkX, a_ChunkZ, RegionX, RegionZ);\n\n\t// Search the cache for the file:\n\tQMutexLocker lock(&m_Mtx);\n\tfor (auto itr = m_Files.begin(), end = m_Files.end(); itr != end; ++itr)\n\t{\n\t\tif (((*itr)->m_RegionX == RegionX) && ((*itr)->m_RegionZ == RegionZ))\n\t\t{\n\t\t\t// Found the file in the cache, move it to front and return it:\n\t\t\tAnvilFilePtr file(*itr);\n\t\t\tm_Files.erase(itr);\n\t\t\tm_Files.push_front(file);\n\t\t\treturn file;\n\t\t}\n\t}\n\n\t// File not in cache, create it:\n\tAnvilFilePtr file(new AnvilFile(RegionX, RegionZ, m_WorldRegionFolder.toStdString()));\n\tm_Files.push_front(file);\n\treturn file;\n}\n\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/ChunkSource.h",
    "content": "#pragma once\n#include \"Globals.h\"\n#include <QString>\n#include <QMutex>\n#include \"QtChunk.h\"\n\n\n\n\n\n// fwd:\nclass cBiomeGen;\ntypedef SharedPtr<cBiomeGen> cBiomeGenPtr;\nclass cIniFile;\ntypedef std::shared_ptr<cIniFile> cIniFilePtr;\n\n\n\n\n\n/** Abstract interface for getting biome data for chunks. */\nclass ChunkSource\n{\npublic:\n\tvirtual ~ChunkSource() {}\n\n\t/** Fills the a_DestChunk with the biomes for the specified coords.\n\tIt is expected to be thread-safe and re-entrant. Usually QThread::idealThreadCount() threads are used. */\n\tvirtual void getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChunk) = 0;\n\n\t/** Forces a fresh reload of the source. Useful mainly for the generator, whose underlying definition file may have been changed. */\n\tvirtual void reload() = 0;\n};\n\n\n\n\n\n\nclass BioGenSource :\n\tpublic ChunkSource\n{\npublic:\n\t/** Constructs a new BioGenSource based on the biome generator that is defined in the specified world.ini file. */\n\tBioGenSource(cIniFilePtr a_IniFile);\n\n\t// ChunkSource overrides:\n\tvirtual void getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChunk) override;\n\tvirtual void reload(void) override;\n\nprotected:\n\t/** The world.ini contents from which the generator is created and re-created on reload(). */\n\tcIniFilePtr m_IniFile;\n\n\t/** The generator used for generating biomes. */\n\tstd::vector<cBiomeGenPtr> m_BiomeGens;\n\n\t/** Guards m_BiomeGens against multithreaded access. */\n\tQMutex m_Mtx;\n\n\t/** Keeps track of the current settings of the biomegens.\n\tIncremented by one each time reload() is called. Provides the means of releasing old biomegens that were\n\tin use while reload() was being processed and thus couldn't be changed back then. releaseBiomeGen() does\n\tthe job of filtering the biogens before reusing them. */\n\tint m_CurrentTag;\n\n\n\t/** Retrieves one cBiomeGenPtr from m_BiomeGens.\n\tIf there's no biogen available there, creates a new one based on the ini file.\n\tWhen done with it, the caller should call releaseBiomeGen() to put the biogen back to m_BiomeGens.\n\ta_Tag receives the value of m_CurrentTag from when the lock was held; it should be passed to\n\treleaseBiomeGen() together with the biogen. */\n\tcBiomeGenPtr getBiomeGen(int & a_Tag);\n\n\t/** Marks the specified biogen as available for reuse (puts it back into m_BiomeGens).\n\ta_Tag is the value of m_CurrentTag from the time when the biogen was retrieved; if it is different from\n\tcurrent m_CurrentTagValue, the biogen will be disposed of (because reload() has been called in the\n\tmeantime). */\n\tvoid releaseBiomeGen(cBiomeGenPtr && a_BiomeGen, int a_Tag);\n};\n\n\n\n\nclass AnvilSource :\n\tpublic ChunkSource\n{\npublic:\n\t/** Constructs a new AnvilSource based on the world path. */\n\tAnvilSource(QString a_WorldRegionFolder);\n\n\t// ChunkSource overrides:\n\tvirtual void getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChunk) override;\n\tvirtual void reload() override;\n\nprotected:\n\tclass AnvilFile;\n\ttypedef std::shared_ptr<AnvilFile> AnvilFilePtr;\n\n\n\t/** Folder where the individual Anvil Region files are located. */\n\tQString m_WorldRegionFolder;\n\n\t/** List of currently loaded files. Acts as a cache so that a file is not opened and closed over and over again.\n\tProtected against multithreaded access by m_Mtx. */\n\tstd::list<AnvilFilePtr> m_Files;\n\n\t/** Guards m_Files agains multithreaded access. */\n\tQMutex m_Mtx;\n\n\n\t/** Converts chunk coords to region coords. */\n\tvoid chunkToRegion(int a_ChunkX, int a_ChunkZ, int & a_RegionX, int & a_RegionZ);\n\n\t/** Returns the compressed data of the specified chunk.\n\tReturns an empty string if the chunk is not available. */\n\tAString getCompressedChunkData(int a_ChunkX, int a_ChunkZ);\n\n\t/** Returns the file object that contains the specified chunk.\n\tThe file is taken from the cache if available there, otherwise it is created anew. */\n\tAnvilFilePtr getAnvilFile(int a_ChunkX, int a_ChunkZ);\n\n};\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/GeneratorSetup.cpp",
    "content": "#include \"Globals.h\"\n#include \"GeneratorSetup.h\"\n#include <QLabel>\n#include <QLineEdit>\n#include \"src/Generating/BioGen.h\"\n#include \"src/IniFile.h\"\n\n\n\n\n\nstatic const QString s_GeneratorNames[] =\n{\n\tQString(\"Checkerboard\"),\n\tQString(\"Constant\"),\n\tQString(\"DistortedVoronoi\"),\n\tQString(\"Grown\"),\n\tQString(\"GrownProt\"),\n\tQString(\"MultiStepMap\"),\n\tQString(\"TwoLevel\"),\n\tQString(\"Voronoi\"),\n};\n\n\n\n\n\nGeneratorSetup::GeneratorSetup(const AString & a_IniFileName, QWidget * a_Parent) :\n\tsuper(a_Parent),\n\tm_IniFile(new cIniFile())\n{\n\t// The seed and generator name is in a separate form layout at the top, always present:\n\tm_eSeed = new QLineEdit();\n\tm_eSeed->setValidator(new QIntValidator());\n\tm_eSeed->setText(\"0\");\n\tm_eSeed->setProperty(\"INI.SectionName\", QVariant(\"Seed\"));\n\tm_eSeed->setProperty(\"INI.ItemName\", QVariant(\"Seed\"));\n\tm_cbGenerator = new QComboBox();\n\tm_cbGenerator->setMinimumWidth(120);\n\tfor (size_t i = 0; i < ARRAYCOUNT(s_GeneratorNames); i++)\n\t{\n\t\tm_cbGenerator->addItem(s_GeneratorNames[i]);\n\t}\n\tQFormLayout * baseLayout = new QFormLayout();\n\tbaseLayout->addRow(new QLabel(tr(\"Seed\")), m_eSeed);\n\tbaseLayout->addRow(new QLabel(tr(\"Generator\")), m_cbGenerator);\n\n\t// The rest of the controls are in a dynamically created form layout:\n\tm_FormLayout = new QFormLayout();\n\n\t// The main layout joins these two vertically:\n\tm_MainLayout = new QVBoxLayout();\n\tm_MainLayout->addLayout(baseLayout);\n\tm_MainLayout->addLayout(m_FormLayout);\n\tm_MainLayout->addStretch();\n\tsetLayout(m_MainLayout);\n\n\t// Load the INI file, if specified, otherwise set defaults:\n\tif (a_IniFileName.empty() || !m_IniFile->ReadFile(a_IniFileName))\n\t{\n\t\tm_IniFile->SetValue(\"Generator\", \"Generator\", \"Composable\");\n\t\tm_IniFile->SetValue(\"Generator\", \"BiomeGen\", m_cbGenerator->currentText().toStdString());\n\t\tbool dummy;\n\t\tcBiomeGen::CreateBiomeGen(*m_IniFile, 0, dummy);\n\t}\n\tupdateFromIni();\n\n\t// Connect the change events only after the data has been loaded:\n\tconnect(m_cbGenerator, SIGNAL(currentIndexChanged(QString)), this, SLOT(generatorChanged(QString)));\n\tconnect(m_eSeed,       SIGNAL(textChanged(QString)),         this, SLOT(editChanged(QString)));\n}\n\n\n\n\n\nvoid GeneratorSetup::generatorChanged(const QString & a_NewName)\n{\n\t// Clear the current contents of the form layout by assigning it to a stack temporary:\n\t{\n\t\tm_MainLayout->takeAt(1);\n\t\tQWidget().setLayout(m_FormLayout);\n\t}\n\n\t// Re-create the layout:\n\tm_FormLayout = new QFormLayout();\n\tm_MainLayout->insertLayout(1, m_FormLayout);\n\n\t// Recreate the INI file:\n\tm_IniFile->Clear();\n\tm_IniFile->SetValue(\"Generator\", \"Generator\", \"Composable\");\n\tm_IniFile->SetValue(\"Generator\", \"BiomeGen\", a_NewName.toStdString());\n\n\t// Create a dummy biome gen from the INI file, this will create the defaults in the INI file:\n\tbool dummy;\n\tcBiomeGen::CreateBiomeGen(*m_IniFile, m_Seed, dummy);\n\n\t// Read all values from the INI file and put them into the form layout:\n\tupdateFromIni();\n\n\t// Notify of the changes:\n\temit generatorUpdated();\n}\n\n\n\n\n\nvoid GeneratorSetup::editChanged(const QString & a_NewValue)\n{\n\tQString sectionName = sender()->property(\"INI.SectionName\").toString();\n\tQString itemName    = sender()->property(\"INI.ItemName\").toString();\n\tm_IniFile->SetValue(sectionName.toStdString(), itemName.toStdString(), a_NewValue.toStdString());\n\temit generatorUpdated();\n}\n\n\n\n\n\nvoid GeneratorSetup::updateFromIni()\n{\n\t// Set the seed editbox:\n\tint seed = m_IniFile->GetValueI(\"Seed\", \"Seed\", 0);\n\tm_eSeed->setText(QString::number(seed));\n\tint keyID = m_IniFile->FindKey(\"Generator\");\n\tif (keyID <= -1)\n\t{\n\t\treturn;\n\t}\n\n\t// Set the Generator combobox:\n\tAString generatorName = m_IniFile->GetValue(\"Generator\", \"BiomeGen\");\n\tsize_t generatorNameLen = generatorName.length();\n\tint index = m_cbGenerator->findText(QString::fromStdString(generatorName));\n\tm_cbGenerator->setCurrentIndex(index);\n\n\t// Create the controls for all the generator settings in the INI file:\n\tint numItems = m_IniFile->GetNumValues(keyID);\n\tfor (int i = 0; i < numItems; i++)\n\t{\n\t\tAString itemName  = m_IniFile->GetValueName(keyID, i);\n\t\tif ((itemName == \"Generator\") || (itemName == \"BiomeGen\"))\n\t\t{\n\t\t\t// These special cases are not to be added\n\t\t\tcontinue;\n\t\t}\n\t\tAString itemValue = m_IniFile->GetValue(keyID, i);\n\n\t\tQLineEdit * edit = new QLineEdit();\n\t\tedit->setText(QString::fromStdString(itemValue));\n\t\tedit->setProperty(\"INI.SectionName\", QVariant(\"Generator\"));\n\t\tedit->setProperty(\"INI.ItemName\", QVariant(QString::fromStdString(itemName)));\n\n\t\t// Remove the generator name prefix from the item name, for clarity purposes:\n\t\tif (NoCaseCompare(itemName.substr(0, generatorNameLen), generatorName) == 0)\n\t\t{\n\t\t\titemName.erase(0, generatorNameLen);\n\t\t}\n\n\t\tconnect(edit, SIGNAL(textChanged(QString)), this, SLOT(editChanged(QString)));\n\t\tm_FormLayout->addRow(new QLabel(QString::fromStdString(itemName)), edit);\n\t}  // for i - INI values[]\n}\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/GeneratorSetup.h",
    "content": "#pragma once\n\n#include <memory>\n#include <QDialog>\n#include <QComboBox>\n#include <QVBoxLayout>\n#include <QFormLayout>\n\n\n\n\n\nclass cIniFile;\ntypedef std::shared_ptr<cIniFile> cIniFilePtr;\n\n\n\n\n\nclass GeneratorSetup :\n\tpublic QWidget\n{\n\ttypedef QWidget super;\n\n\tQ_OBJECT\n\npublic:\n\t/** Creates the widget and loads the contents of the INI file, if not empty. */\n\texplicit GeneratorSetup(const std::string & a_IniFileName, QWidget * parent = nullptr);\n\n\t/** Returns the cIniFile instance that is being edited by this widget. */\n\tcIniFilePtr getIniFile() { return m_IniFile; }\n\nsignals:\n\t/** Emitted when the generator parameters have changed. */\n\tvoid generatorUpdated();\n\npublic slots:\n\t/** Called when the user selects a different generator from the top combobox.\n\tRe-creates m_IniFile and updates the form layout. */\n\tvoid generatorChanged(const QString & a_NewName);\n\nprotected slots:\n\t/** Called when any of the edit widgets are changed. */\n\tvoid editChanged(const QString & a_NewValue);\n\nprotected:\n\tQComboBox * m_cbGenerator;\n\tQLineEdit * m_eSeed;\n\tQVBoxLayout * m_MainLayout;\n\tQFormLayout * m_FormLayout;\n\n\tcIniFilePtr m_IniFile;\n\n\tint m_Seed;\n\n\n\t/** Updates the form layout with the values from m_IniFile. */\n\tvoid updateFromIni();\n};\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/Globals.h",
    "content": "#pragma once\n\n\n\n\n\n// Compiler-dependent stuff:\n#if defined(_MSC_VER)\n\t// MSVC produces warning C4481 on the override keyword usage, so disable the warning altogether\n\t#pragma warning(disable:4481)\n\n\t// Disable some warnings that we don't care about:\n\t#pragma warning(disable:4100)  // Unreferenced formal parameter\n\n\t// Useful warnings from warning level 4:\n\t#pragma warning(3 : 4127)  // Conditional expression is constant\n\t#pragma warning(3 : 4189)  // Local variable is initialized but not referenced\n\t#pragma warning(3 : 4245)  // Conversion from 'type1' to 'type2', signed / unsigned mismatch\n\t#pragma warning(3 : 4310)  // Cast truncates constant value\n\t#pragma warning(3 : 4389)  // Signed / unsigned mismatch\n\t#pragma warning(3 : 4505)  // Unreferenced local function has been removed\n\t#pragma warning(3 : 4701)  // Potentially unitialized local variable used\n\t#pragma warning(3 : 4702)  // Unreachable code\n\t#pragma warning(3 : 4706)  // Assignment within conditional expression\n\n\t// Disabling this warning, because we know what we're doing when we're doing this:\n\t#pragma warning(disable: 4355)  // 'this' used in initializer list\n\n\t// Disabled because it's useless:\n\t#pragma warning(disable: 4512)  // 'class': assignment operator could not be generated - reported for each class that has a reference-type member\n\n\t// 2014_01_06 xoft: Disabled this warning because MSVC is stupid and reports it in obviously wrong places\n\t// #pragma warning(3 : 4244)  // Conversion from 'type1' to 'type2', possible loss of data\n\n\n\t#define FORMATSTRING(formatIndex, va_argsIndex)\n#elif defined(__GNUC__)\n\n\t// TODO: Can GCC explicitly mark classes as abstract (no instances can be created)?\n\t#define abstract\n\n\n\t#define FORMATSTRING(formatIndex, va_argsIndex) __attribute__((format (printf, formatIndex, va_argsIndex)))\n#else\n\n\t#error \"You are using an unsupported compiler, you might need to #define some stuff here for your compiler\"\n\n#endif\n\n\n#include <stddef.h>\n\n\n// Integral types with predefined sizes:\ntypedef long long Int64;\ntypedef int       Int32;\ntypedef short     Int16;\n\ntypedef unsigned long long UInt64;\ntypedef unsigned int       UInt32;\ntypedef unsigned short     UInt16;\n\ntypedef unsigned char Byte;\n\n\n// If you get an error about specialization check the size of integral types\ntemplate <typename T, size_t Size, bool x = sizeof(T) == Size>\nclass SizeChecker;\n\ntemplate <typename T, size_t Size>\nclass SizeChecker<T, Size, true>\n{\n\tT v;\n};\n\ntemplate class SizeChecker<Int64, 8>;\ntemplate class SizeChecker<Int32, 4>;\ntemplate class SizeChecker<Int16, 2>;\n\ntemplate class SizeChecker<UInt64, 8>;\ntemplate class SizeChecker<UInt32, 4>;\ntemplate class SizeChecker<UInt16, 2>;\n\n// A macro to disallow the copy constructor and operator = functions\n// This should be used in the private: declarations for any class that shouldn't allow copying itself\n#define DISALLOW_COPY_AND_ASSIGN(TypeName) \\\n\tTypeName(const TypeName &); \\\n\tvoid operator =(const TypeName &)\n\n// A macro that is used to mark unused local variables, to avoid pedantic warnings in gcc / clang / MSVC\n// Note that in MSVC it requires the full type of X to be known\n#define UNUSED_VAR(X) (void)(X)\n\n// A macro that is used to mark unused function parameters, to avoid pedantic warnings in gcc\n// Written so that the full type of param needn't be known\n#ifdef _MSC_VER\n\t#define UNUSED(X)\n#else\n\t#define UNUSED UNUSED_VAR\n#endif\n\n\n\n\n// OS-dependent stuff:\n#ifdef _WIN32\n\t#define WIN32_LEAN_AND_MEAN\n\t#define _WIN32_WINNT _WIN32_WINNT_WS03  // We want to target Windows XP with Service Pack 2 & Windows Server 2003 with Service Pack 1 and higher\n\n\t#include <Windows.h>\n\t#include <winsock2.h>\n\t#include <Ws2tcpip.h>  // IPv6 stuff\n\n\t// Windows SDK defines min and max macros, messing up with our std::min and std::max usage\n\t#undef min\n\t#undef max\n\n\t// Windows SDK defines GetFreeSpace as a constant, probably a Win16 API remnant\n\t#ifdef GetFreeSpace\n\t\t#undef GetFreeSpace\n\t#endif  // GetFreeSpace\n#else\n\t#include <sys/types.h>\n\t#include <sys/time.h>\n\t#include <sys/socket.h>\n\t#include <netinet/in.h>\n\t#include <arpa/inet.h>\n\t#include <netdb.h>\n\t#include <time.h>\n\t#include <dirent.h>\n\t#include <errno.h>\n\t#include <iostream>\n\t#include <cstdio>\n\t#include <cstring>\n\t#include <pthread.h>\n\t#include <semaphore.h>\n\t#include <errno.h>\n\t#include <fcntl.h>\n#endif\n\n\n\n\n\n// CRT stuff:\n#include <sys/stat.h>\n#include <assert.h>\n#include <stdio.h>\n#include <math.h>\n#include <stdarg.h>\n\n\n\n\n\n// STL stuff:\n#include <vector>\n#include <list>\n#include <deque>\n#include <string>\n#include <map>\n#include <algorithm>\n#include <memory>\n#include <set>\n#include <queue>\n#include <limits>\n\n\n\n#ifndef TEST_GLOBALS\n\t// Common headers (part 1, without macros):\n\t#include \"src/StringUtils.h\"\n\t#include \"src/OSSupport/CriticalSection.h\"\n\t#include \"src/OSSupport/Semaphore.h\"\n\t#include \"src/OSSupport/Event.h\"\n\t#include \"src/OSSupport/File.h\"\n\t#include \"src/Logger.h\"\n#else\n\t// Logging functions\nvoid inline LOGERROR(const char * a_Format, ...) FORMATSTRING(1, 2);\n\nvoid inline LOGERROR(const char * a_Format, ...)\n{\n\tva_list argList;\n\tva_start(argList, a_Format);\n\tvprintf(a_Format, argList);\n\tva_end(argList);\n}\n#endif\n\n\n\n\n\n// Common definitions:\n\n/** Evaluates to the number of elements in an array (compile-time!) */\n#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))\n\n/** Allows arithmetic expressions like \"32 KiB\" (but consider using parenthesis\naround it, \"(32 KiB)\") */\n#define KiB * 1024\n#define MiB * 1024 * 1024\n\n/** Faster than (int)floorf((float)x / (float)div) */\n#define FAST_FLOOR_DIV( x, div) (((x) - (((x) < 0) ? ((div) - 1) : 0)) / (div))\n\n// Own version of assert() that writes failed assertions to the log for review\n#ifdef TEST_GLOBALS\n\n\tclass cAssertFailure\n\t{\n\t};\n\n\t#ifdef _WIN32\n\t\t#if (defined(_MSC_VER) && defined(_DEBUG))\n\t\t\t#define DBG_BREAK _CrtDbgBreak()\n\t\t#else\n\t\t\t#define DBG_BREAK\n\t\t#endif\n\t\t#define REPORT_ERROR(FMT, ...) \\\n\t\t{ \\\n\t\t\tAString msg = Printf(FMT, __VA_ARGS__); \\\n\t\t\tputs(msg.c_str()); \\\n\t\t\tfflush(stdout); \\\n\t\t\tOutputDebugStringA(msg.c_str()); \\\n\t\t\tDBG_BREAK; \\\n\t\t}\n\t#else\n\t\t#define REPORT_ERROR(FMT, ...) \\\n\t\t{ \\\n\t\t\tAString msg = Printf(FMT, __VA_ARGS__); \\\n\t\t\tputs(msg.c_str()); \\\n\t\t\tfflush(stdout); \\\n\t\t}\n\t#endif\n\t#define ASSERT(x) do { if (!(x)) { throw cAssertFailure();} } while (0)\n\t#define testassert(x) do { if (!(x)) { REPORT_ERROR(\"Test failure: %s, file %s, line %d\\n\", #x, __FILE__, __LINE__); exit(1); } } while (0)\n\t#define CheckAsserts(x) do { try {x} catch (cAssertFailure) { break; } REPORT_ERROR(\"Test failure: assert didn't fire for %s, file %s, line %d\\n\", #x, __FILE__, __LINE__); exit(1); } while (0)\n\n#else\n\t#ifdef  _DEBUG\n\t\t#define ASSERT( x) ( !!(x) || ( LOGERROR(\"Assertion failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), assert(0), 0))\n\t#else\n\t\t#define ASSERT(x) ((void)(x))\n\t#endif\n#endif\n\n// Pretty much the same as ASSERT() but stays in Release builds\n#define VERIFY( x) ( !!(x) || ( LOGERROR(\"Verification failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), exit(1), 0))\n\n// C++11 has std::shared_ptr in <memory>, included earlier\n#define SharedPtr std::shared_ptr\n\n\n\n\n/** Clamp X to the specified range. */\ntemplate <typename T>\nT Clamp(T a_Value, T a_Min, T a_Max)\n{\n\treturn (a_Value < a_Min) ? a_Min : ((a_Value > a_Max) ? a_Max : a_Value);\n}\n\n\n\n\n\n#ifndef TOLUA_TEMPLATE_BIND\n\t#define TOLUA_TEMPLATE_BIND(x)\n#endif\n\n\n\n\n\n// Common headers (part 2, with macros):\n#include \"src/BlockID.h\"\n#include \"src/BlockInfo.h\"\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/MainWindow.cpp",
    "content": "#include \"Globals.h\"\n#include \"MainWindow.h\"\n#include <QVBoxLayout>\n#include <QAction>\n#include <QMenuBar>\n#include <QApplication>\n#include <QFileDialog>\n#include <QSettings>\n#include <QDirIterator>\n#include <QStatusBar>\n#include \"ChunkSource.h\"\n#include \"src/IniFile.h\"\n#include \"src/Generating/BioGen.h\"\n#include \"src/StringCompression.h\"\n#include \"src/WorldStorage/FastNBT.h\"\n#include \"GeneratorSetup.h\"\n#include \"RegionLoader.h\"\n\n\n\n\n\nconst double MainWindow::m_ViewZooms[] =\n{\n\t0.0625, 0.125, 0.25, 0.5, 1, 2, 4, 8, 16, 24,\n};\n\n\n\n\n\nMainWindow::MainWindow(QWidget * parent) :\n\tQMainWindow(parent),\n\tm_GeneratorSetup(nullptr),\n\tm_LineSeparator(nullptr),\n\tm_CurrentZoomLevel(2)\n{\n\tinitMinecraftPath();\n\n\tm_BiomeView = new BiomeView();\n\tconnect(m_BiomeView, SIGNAL(increaseZoom()), this, SLOT(increaseZoom()));\n\tconnect(m_BiomeView, SIGNAL(decreaseZoom()), this, SLOT(decreaseZoom()));\n\tconnect(m_BiomeView, SIGNAL(wheelUp()),      this, SLOT(increaseZoom()));\n\tconnect(m_BiomeView, SIGNAL(wheelDown()),    this, SLOT(decreaseZoom()));\n\tm_BiomeView->setZoomLevel(m_ViewZooms[m_CurrentZoomLevel]);\n\n\tm_StatusBar = new QStatusBar();\n\tthis->setStatusBar(m_StatusBar);\n\tm_StatusBlockX = new QLabel(tr(\"X\"));\n\tm_StatusBlockZ = new QLabel(tr(\"Z\"));\n\tm_StatusBiome = new QLabel(tr(\"B\"));\n\tm_StatusBar->addPermanentWidget(m_StatusBlockX);\n\tm_StatusBar->addPermanentWidget(m_StatusBlockZ);\n\tm_StatusBar->addPermanentWidget(m_StatusBiome);\n\n\tm_MainLayout = new QHBoxLayout();\n\tm_MainLayout->addWidget(m_BiomeView, 1);\n\tm_MainLayout->setMenuBar(menuBar());\n\tm_MainLayout->setMargin(0);\n\tQWidget * central = new QWidget();\n\tcentral->setLayout(m_MainLayout);\n\tsetCentralWidget(central);\n\n\tcreateActions();\n\tcreateMenus();\n\n\tconnect(m_BiomeView, SIGNAL(hoverChanged(int, int, int)), this, SLOT(hoverChanged(int, int, int)));\n}\n\n\n\n\n\nMainWindow::~MainWindow()\n{\n\tRegionLoader::shutdown();\n}\n\n\n\n\n\nvoid MainWindow::newGenerator()\n{\n\t// (Re-)open the generator setup dialog with empty settings:\n\topenGeneratorSetup(\"\");\n\n\t// Set the chunk source:\n\tcIniFilePtr iniFile = m_GeneratorSetup->getIniFile();\n\tm_BiomeView->setChunkSource(std::make_shared<BioGenSource>(iniFile));\n\tm_BiomeView->redraw();\n}\n\n\n\n\n\nvoid MainWindow::openGenerator()\n{\n\t// Let the user specify the world.ini file:\n\tQString worldIni = QFileDialog::getOpenFileName(this, tr(\"Open world.ini\"), QString(), tr(\"world.ini (world.ini)\"));\n\tif (worldIni.isEmpty())\n\t{\n\t\treturn;\n\t}\n\n\t// (Re-)open the generator setup dialog:\n\topenGeneratorSetup(worldIni.toStdString());\n\n\t// Set the chunk source:\n\tm_BiomeView->setChunkSource(std::make_shared<BioGenSource>(m_GeneratorSetup->getIniFile()));\n\tm_BiomeView->redraw();\n}\n\n\n\n\n\nvoid MainWindow::openWorld()\n{\n\t// Let the user specify the world:\n\tQString regionFolder = QFileDialog::getExistingDirectory(this, tr(\"Select the region folder\"), QString());\n\tif (regionFolder.isEmpty())\n\t{\n\t\treturn;\n\t}\n\n\t// Remove the generator setup dialog, if open:\n\tcloseGeneratorSetup();\n\n\t// Set the chunk source:\n\tm_BiomeView->setChunkSource(std::make_shared<AnvilSource>(regionFolder));\n\tm_BiomeView->redraw();\n}\n\n\n\n\n\nvoid MainWindow::openVanillaWorld()\n{\n\t// The world is stored in the sender action's data, retrieve it:\n\tQAction * action = qobject_cast<QAction *>(sender());\n\tif (action == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// Remove the generator setup dialog, if open:\n\tcloseGeneratorSetup();\n\n\t// Set the chunk source:\n\tm_BiomeView->setChunkSource(std::make_shared<AnvilSource>(action->data().toString()));\n\tm_BiomeView->redraw();\n}\n\n\n\n\n\nvoid MainWindow::centerView()\n{\n\tm_BiomeView->setPosition(0, 0);\n}\n\n\n\n\n\nvoid MainWindow::setViewZoom()\n{\n\t// The zoom level is stored in the sender action's data, retrieve it:\n\tQAction * action = qobject_cast<QAction *>(sender());\n\tif (action == nullptr)\n\t{\n\t\treturn;\n\t}\n\tm_CurrentZoomLevel = action->data().toInt();\n\tdouble newZoom = m_ViewZooms[m_CurrentZoomLevel];\n\tm_BiomeView->setZoomLevel(newZoom);\n\taction->setChecked(true);\n}\n\n\n\n\n\nvoid MainWindow::increaseZoom()\n{\n\t// If already at max zoom, bail out:\n\tif (m_CurrentZoomLevel >= ARRAYCOUNT(m_ViewZooms) - 1)\n\t{\n\t\treturn;\n\t}\n\n\t// Increase the zoom level:\n\tm_CurrentZoomLevel += 1;\n\tm_actViewZoom[m_CurrentZoomLevel]->setChecked(true);\n\tm_BiomeView->setZoomLevel(m_ViewZooms[m_CurrentZoomLevel]);\n}\n\n\n\n\n\nvoid MainWindow::decreaseZoom()\n{\n\t// If already at min zoom, bail out:\n\tif (m_CurrentZoomLevel == 0)\n\t{\n\t\treturn;\n\t}\n\n\t// Decrease the zoom level:\n\tm_CurrentZoomLevel -= 1;\n\tm_actViewZoom[m_CurrentZoomLevel]->setChecked(true);\n\tm_BiomeView->setZoomLevel(m_ViewZooms[m_CurrentZoomLevel]);\n}\n\n\n\n\n\nvoid MainWindow::hoverChanged(int a_BlockX, int a_BlockZ, int a_Biome)\n{\n\tm_StatusBlockX->setText(tr(\"X: %1\").arg(a_BlockX));\n\tm_StatusBlockZ->setText(tr(\"Z: %1\").arg(a_BlockZ));\n\tm_StatusBiome->setText (tr(\"B: %1 (%2)\").arg(BiomeToString(a_Biome).c_str()).arg(a_Biome));\n}\n\n\n\n\n\nvoid MainWindow::initMinecraftPath()\n{\n\t#ifdef Q_OS_MAC\n\t\tm_MinecraftPath = QDir::homePath() + QDir::toNativeSeparators(\"/Library/Application Support/minecraft\");\n\t#elif defined Q_OS_WIN32\n\t\tQSettings ini(QSettings::IniFormat, QSettings::UserScope, \".minecraft\", \"minecraft1\");\n\t\tm_MinecraftPath = QFileInfo(ini.fileName()).absolutePath();\n\t#else\n\t\tm_MinecraftPath = QDir::homePath() + QDir::toNativeSeparators(\"/.minecraft\");\n\t#endif\n}\n\n\n\n\n\nvoid MainWindow::createActions()\n{\n\t// Map menu:\n\tcreateWorldActions();\n\n\tm_actNewGen = new QAction(tr(\"&New generator\"), this);\n\tm_actNewGen->setShortcut(tr(\"Ctrl+N\"));\n\tm_actNewGen->setStatusTip(tr(\"Open a generator INI file and display the generated biomes\"));\n\tconnect(m_actNewGen, SIGNAL(triggered()), this, SLOT(newGenerator()));\n\n\tm_actOpenGen = new QAction(tr(\"&Open generator...\"), this);\n\tm_actOpenGen->setShortcut(tr(\"Ctrl+G\"));\n\tm_actOpenGen->setStatusTip(tr(\"Open a generator INI file and display the generated biomes\"));\n\tconnect(m_actOpenGen, SIGNAL(triggered()), this, SLOT(openGenerator()));\n\n\tm_actOpenWorld = new QAction(tr(\"&Open world...\"), this);\n\tm_actOpenWorld->setShortcut(tr(\"Ctrl+O\"));\n\tm_actOpenWorld->setStatusTip(tr(\"Open an existing world and display its biomes\"));\n\tconnect(m_actOpenWorld, SIGNAL(triggered()), this, SLOT(openWorld()));\n\n\tm_actReload = new QAction(tr(\"&Reload\"), this);\n\tm_actReload->setShortcut(tr(\"F5\"));\n\tm_actReload->setStatusTip(tr(\"Clear the view cache and force a reload of all the data\"));\n\tconnect(m_actReload, SIGNAL(triggered()), m_BiomeView, SLOT(reload()));\n\n\tm_actExit = new QAction(tr(\"E&xit\"), this);\n\tm_actExit->setShortcut(tr(\"Alt+X\"));\n\tm_actExit->setStatusTip(tr(\"Exit %1\").arg(QApplication::instance()->applicationName()));\n\tconnect(m_actExit, SIGNAL(triggered()), this, SLOT(close()));\n\n\t// View menu:\n\tm_actViewCenter = new QAction(tr(\"&Reset to center\"), this);\n\tm_actViewCenter->setStatusTip(tr(\"Scrolls the view back to the map center\"));\n\tconnect(m_actViewCenter, SIGNAL(triggered()), this, SLOT(centerView()));\n\n\tQActionGroup * zoomGroup = new QActionGroup(this);\n\tfor (int i = 0; i < ARRAYCOUNT(m_ViewZooms); i++)\n\t{\n\t\tm_actViewZoom[i] = new QAction(tr(\"&Zoom %1%\").arg(std::floor(m_ViewZooms[i] * 100)), this);\n\t\tm_actViewZoom[i]->setCheckable(true);\n\t\tm_actViewZoom[i]->setData(QVariant(i));\n\t\tzoomGroup->addAction(m_actViewZoom[i]);\n\t\tconnect(m_actViewZoom[i], SIGNAL(triggered()), this, SLOT(setViewZoom()));\n\t}\n\tm_actViewZoom[m_CurrentZoomLevel]->setChecked(true);\n}\n\n\n\n\n\nvoid MainWindow::createWorldActions()\n{\n\tQDir mc(m_MinecraftPath);\n\tif (!mc.cd(\"saves\"))\n\t{\n\t\treturn;\n\t}\n\n\tQDirIterator it(mc);\n\tint key = 1;\n\twhile (it.hasNext())\n\t{\n\t\tit.next();\n\t\tif (!it.fileInfo().isDir())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tQString name = getWorldName(it.filePath().toStdString());\n\t\tif (name.isEmpty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tQAction * w = new QAction(this);\n\t\tw->setText(name);\n\t\tw->setData(it.filePath() + \"/region\");\n\t\tif (key < 10)\n\t\t{\n\t\t\tw->setShortcut(\"Ctrl+\" + QString::number(key));\n\t\t\tkey++;\n\t\t}\n\t\tconnect(w, SIGNAL(triggered()), this, SLOT(openVanillaWorld()));\n\t\tm_WorldActions.append(w);\n\t}\n}\n\n\n\n\n\nvoid MainWindow::createMenus()\n{\n\t// Map menu:\n\tQMenu * file = menuBar()->addMenu(tr(\"&Map\"));\n\tfile->addAction(m_actNewGen);\n\tfile->addAction(m_actOpenGen);\n\tfile->addSeparator();\n\tQMenu * worlds = file->addMenu(tr(\"Open &existing\"));\n\tworlds->addActions(m_WorldActions);\n\tif (m_WorldActions.empty())\n\t{\n\t\tworlds->setEnabled(false);\n\t}\n\tfile->addAction(m_actOpenWorld);\n\tfile->addSeparator();\n\tfile->addAction(m_actReload);\n\tfile->addSeparator();\n\tfile->addAction(m_actExit);\n\n\t// View menu:\n\tQMenu * view = menuBar()->addMenu(tr(\"&View\"));\n\tview->addAction(m_actViewCenter);\n\tview->addSeparator();\n\tfor (size_t i = 0; i < ARRAYCOUNT(m_actViewZoom); i++)\n\t{\n\t\tview->addAction(m_actViewZoom[i]);\n\t}\n}\n\n\n\n\n\nQString MainWindow::getWorldName(const AString & a_Path)\n{\n\tAString levelData = cFile::ReadWholeFile(a_Path + \"/level.dat\");\n\tif (levelData.empty())\n\t{\n\t\t// No such file / no data\n\t\treturn QString();\n\t}\n\n\tAString uncompressed;\n\tif (UncompressStringGZIP(levelData.data(), levelData.size(), uncompressed) != Z_OK)\n\t{\n\t\treturn QString();\n\t}\n\tcParsedNBT nbt(uncompressed.data(), uncompressed.size());\n\tif (!nbt.IsValid())\n\t{\n\t\treturn QString();\n\t}\n\tAString name = nbt.GetName(1);\n\tint levelNameTag = nbt.FindTagByPath(nbt.GetRoot(), \"Data\\\\LevelName\");\n\tif ((levelNameTag <= 0) || (nbt.GetType(levelNameTag) != TAG_String))\n\t{\n\t\treturn QString();\n\t}\n\treturn QString::fromStdString(nbt.GetString(levelNameTag));\n}\n\n\n\n\n\nvoid MainWindow::openGeneratorSetup(const AString & a_IniFileName)\n{\n\t// Close any previous editor:\n\tcloseGeneratorSetup();\n\n\t// Open up a new editor:\n\tm_GeneratorSetup = new GeneratorSetup(a_IniFileName);\n\tm_LineSeparator = new QWidget();\n\tm_LineSeparator->setFixedWidth(2);\n\tm_LineSeparator->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);\n\tm_LineSeparator->setStyleSheet(QString(\"background-color: #c0c0c0;\"));\n\tm_MainLayout->addWidget(m_LineSeparator);\n\tm_MainLayout->addWidget(m_GeneratorSetup);\n\n\t// Connect the signals from the setup pane:\n\tconnect(m_GeneratorSetup, SIGNAL(generatorUpdated()), m_BiomeView, SLOT(reload()));\n}\n\n\n\n\n\nvoid MainWindow::closeGeneratorSetup()\n{\n\tdelete m_MainLayout->takeAt(2);\n\tdelete m_MainLayout->takeAt(1);\n\tdelete m_GeneratorSetup;\n\tdelete m_LineSeparator;\n\tm_GeneratorSetup = nullptr;\n\tm_LineSeparator = nullptr;\n}\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/MainWindow.h",
    "content": "#pragma once\n\n#include <memory>\n#include <QList>\n#include <QMainWindow>\n#include <QHBoxLayout>\n#include <QLabel>\n#include \"BiomeView.h\"\n\n\n\n\n\n// fwd:\nclass GeneratorSetup;\n\n\n\n\n\nclass MainWindow :\n\tpublic QMainWindow\n{\n\tQ_OBJECT\n\npublic:\n\tMainWindow(QWidget * parent = nullptr);\n\t~MainWindow();\n\nprivate slots:\n\t/** Creates a generator definition from scratch, lets user modify generator params in realtime. */\n\tvoid newGenerator();\n\n\t/** Opens a generator definition and generates the biomes based on that. */\n\tvoid openGenerator();\n\n\t/** Opens an existing world and displays the loaded biomes. */\n\tvoid openWorld();\n\n\t/** Opens a vanilla world that is specified by the calling action. */\n\tvoid openVanillaWorld();\n\n\t/** Moves the view to the map's center. */\n\tvoid centerView();\n\n\t/** Sets the zoom level specified in the triggering action. */\n\tvoid setViewZoom();\n\n\t/** Sets a zoom level one step larger than current, if allowed. */\n\tvoid increaseZoom();\n\n\t/** Sets a zoom level one step smaller than current, if allowed. */\n\tvoid decreaseZoom();\n\n\t/** Updates the statusbar for the specified info about the current block under the cursor. */\n\tvoid hoverChanged(int a_BlockX, int a_BlockZ, int a_Biome);\n\nprotected:\n\t/** The zoom levels */\n\tstatic const double m_ViewZooms[10];\n\n\t// Actions:\n\tQAction * m_actNewGen;\n\tQAction * m_actOpenGen;\n\tQAction * m_actOpenWorld;\n\tQAction * m_actReload;\n\tQAction * m_actExit;\n\tQAction * m_actViewCenter;\n\tQAction * m_actViewZoom[ARRAYCOUNT(m_ViewZooms)];\n\n\t/** List of actions that open the specific vanilla world. */\n\tQList<QAction *> m_WorldActions;\n\n\t/** Path to the vanilla folder. */\n\tQString m_MinecraftPath;\n\n\t/** The pane for setting up the generator, available when visualising a generator. */\n\tGeneratorSetup * m_GeneratorSetup;\n\n\t/** The main biome display widget. */\n\tBiomeView * m_BiomeView;\n\n\t/** The layout for the window. */\n\tQHBoxLayout * m_MainLayout;\n\n\t/** The status bar that displays the current hover information. */\n\tQStatusBar * m_StatusBar;\n\n\tQLabel * m_StatusBlockX;\n\tQLabel * m_StatusBlockZ;\n\tQLabel * m_StatusBiome;\n\n\t/** The separator line between biome view and generator setup. */\n\tQWidget * m_LineSeparator;\n\n\t/** Index into m_ViewZooms[] for the current zoom level. */\n\tsize_t m_CurrentZoomLevel;\n\n\n\t/** Initializes the m_MinecraftPath based on the proper MC path */\n\tvoid initMinecraftPath();\n\n\t/** Creates the actions that the UI supports. */\n\tvoid createActions();\n\n\t/** Creates the actions that open a specific vanilla world. Iterates over the minecraft saves folder. */\n\tvoid createWorldActions();\n\n\t/** Creates the menu bar and connects its events. */\n\tvoid createMenus();\n\n\t/** Returns the name of the vanilla world in the specified path.\n\tReads the level.dat file for the name. Returns an empty string on failure. */\n\tQString getWorldName(const AString & a_Path);\n\n\t/** Opens the generator setup pane, if not already open, and loads the specified INI file to it. */\n\tvoid openGeneratorSetup(const AString & a_IniFileName);\n\n\t/** Closes and destroys the generator setup pane, if there is one. */\n\tvoid closeGeneratorSetup();\n};\n\n\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/QtBiomeVisualiser.cpp",
    "content": "#include \"Globals.h\"\n#include \"MainWindow.h\"\n#include <QApplication>\n\n\n\n\n\nint main(int argc, char *argv[])\n{\n\tQApplication a(argc, argv);\n\tMainWindow w;\n\tw.show();\n\n\treturn a.exec();\n}\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/QtBiomeVisualiser.pro",
    "content": "#-------------------------------------------------\n#\n# Project created by QtCreator 2014-09-11T15:22:43\n#\n#-------------------------------------------------\n\nQT       += core gui\n\ngreaterThan(QT_MAJOR_VERSION, 4): QT += widgets\n\nTARGET = QtBiomeVisualiser\nTEMPLATE = app\n\n\nSOURCES += \\\n\tMainWindow.cpp \\\n\tBiomeView.cpp \\\n\t../../src/Generating/BioGen.cpp \\\n\t../../src/VoronoiMap.cpp \\\n\t../../src/Noise/Noise.cpp \\\n\t../../src/StringUtils.cpp \\\n\t../../src/LoggerListeners.cpp \\\n\t../../src/Logger.cpp \\\n\t../../src/IniFile.cpp \\\n\t../../src/OSSupport/Event.cpp \\\n\t../../src/OSSupport/File.cpp \\\n\t../../src/OSSupport/CriticalSection.cpp \\\n\t../../src/OSSupport/IsThread.cpp \\\n\t../../src/OSSupport/StackTrace.cpp \\\n\t../../src/BiomeDef.cpp \\\n\t../../src/StackWalker.cpp \\\n\t../../src/StringCompression.cpp \\\n\t../../src/WorldStorage/FastNBT.cpp \\\n\t../../lib/zlib/adler32.c \\\n\t../../lib/zlib/compress.c \\\n\t../../lib/zlib/crc32.c \\\n\t../../lib/zlib/deflate.c \\\n\t../../lib/zlib/gzclose.c \\\n\t../../lib/zlib/gzlib.c \\\n\t../../lib/zlib/gzread.c \\\n\t../../lib/zlib/gzwrite.c \\\n\t../../lib/zlib/infback.c \\\n\t../../lib/zlib/inffast.c \\\n\t../../lib/zlib/inflate.c \\\n\t../../lib/zlib/inftrees.c \\\n\t../../lib/zlib/trees.c \\\n\t../../lib/zlib/uncompr.c \\\n\t../../lib/zlib/zutil.c \\\n\tGeneratorSetup.cpp \\\n\tQtBiomeVisualiser.cpp \\\n\tQtChunk.cpp \\\n\tRegionCache.cpp \\\n\tRegion.cpp \\\n\tChunkSource.cpp \\\n\tRegionLoader.cpp\n\n\n\nHEADERS += \\\n\tMainWindow.h \\\n\tQtChunk.h \\\n\tGlobals.h \\\n\tBiomeView.h \\\n\t../../src/Generating/BioGen.h \\\n\t../../src/Generating/IntGen.h \\\n\t../../src/Generating/ProtIntGen.h \\\n\t../../src/VoronoiMap.h \\\n\t../../src/Noise/Noise.h \\\n\t../../src/StringUtils.h \\\n\t../../src/LoggerListeners.h \\\n\t../../src/Logger.h \\\n\t../../src/IniFile.h \\\n\t../../src/OSSupport/Event.h \\\n\t../../src/OSSupport/File.h \\\n\t../../src/OSSupport/CriticalSection.h \\\n\t../../src/OSSupport/IsThread.h \\\n\t../../src/OSSupport/StackTrace.h \\\n\t../../src/BiomeDef.h \\\n\t../../src/StackWalker.h \\\n\t../../src/StringCompression.h \\\n\t../../src/WorldStorage/FastNBT.h \\\n\t../../lib/zlib/crc32.h \\\n\t../../lib/zlib/deflate.h \\\n\t../../lib/zlib/gzguts.h \\\n\t../../lib/zlib/inffast.h \\\n\t../../lib/zlib/inffixed.h \\\n\t../../lib/zlib/inflate.h \\\n\t../../lib/zlib/inftrees.h \\\n\t../../lib/zlib/trees.h \\\n\t../../lib/zlib/zconf.h \\\n\t../../lib/zlib/zlib.h \\\n\t../../lib/zlib/zutil.h \\\n\tGeneratorSetup.h \\\n\tQtChunk.h \\\n\tRegionCache.h \\\n\tRegion.h \\\n\tChunkSource.h \\\n\tRegionLoader.h\n\n\n\nINCLUDEPATH += $$_PRO_FILE_PWD_ \\\n\t$$_PRO_FILE_PWD_/../../lib \\\n\t$$_PRO_FILE_PWD_/../../lib/jsoncpp/include \\\n\t$$_PRO_FILE_PWD_/../../lib/polarssl/include \\\n\t$$_PRO_FILE_PWD_/../../lib/sqlite \\\n\t$$_PRO_FILE_PWD_/../../lib/SQLiteCpp/include \\\n\t$$_PRO_FILE_PWD_/../../\n\n\n\nCONFIG += C++11\n\nOTHER_FILES +=\n\nwin* {\n\t# Add the advapi32 library for windows compiles; needed for the StackWalker:\n\tLIBS += advapi32.lib\n\n\t#\tStackWalker doesn't like how Qt inconsistently defines only UNICODE, but not _UNICODE:\n\tDEFINES -= UNICODE\n}\n\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/QtChunk.cpp",
    "content": "#include \"Globals.h\"\n#include \"QtChunk.h\"\n\n\n\n\n\nChunk::Chunk() :\n\tm_IsValid(false)\n{\n}\n\n\n\n\n\nvoid Chunk::setBiomes(const cChunkDef::BiomeMap & a_Biomes)\n{\n\tfor (size_t idx = 0; idx < ARRAYCOUNT(a_Biomes); ++idx)\n\t{\n\t\tm_Biomes[idx] = static_cast<short>(a_Biomes[idx]);\n\t}\n\tm_IsValid = true;\n}\n\n\n\n\n\nEMCSBiome Chunk::getBiome(int a_RelX, int a_RelZ)\n{\n\tif (!m_IsValid)\n\t{\n\t\treturn biInvalidBiome;\n\t}\n\treturn static_cast<EMCSBiome>(m_Biomes[a_RelX + 16 * a_RelZ]);\n}\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/QtChunk.h",
    "content": "#pragma once\n\n#include <qglobal.h>\n\n\n\n\n\nclass Chunk\n{\npublic:\n\t/** The type used for storing image data for a chunk. */\n\ttypedef uchar Image[16 * 16 * 4];\n\n\n\tChunk(void);\n\n\t/** Returns true iff the chunk data is valid - loaded or generated. */\n\tbool isValid(void) const { return m_IsValid; }\n\n\t/** Sets the biomes to m_Biomes and renders them into m_Image. */\n\tvoid setBiomes(const cChunkDef::BiomeMap & a_Biomes);\n\n\t/** Returns the biome at the specified relative coords, or biInvalidBiome if not valid.\n\tCoords must be valid inside this chunk. */\n\tEMCSBiome getBiome(int a_RelX, int a_RelZ);\n\n\t/** Returns the raw biome data for this chunk. */\n\tconst short * getBiomes(void) const { return m_Biomes; }\n\nprotected:\n\t/** Flag that specifies if the chunk data is valid - loaded or generated. */\n\tbool m_IsValid;\n\n\t/** Biomes comprising the chunk, in the X + 16 * Z ordering.\n\tTyped as short to save on memory, converted automatically when needed. */\n\tshort m_Biomes[16 * 16];\n};\n\ntypedef std::shared_ptr<Chunk> ChunkPtr;\n\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/Region.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"Region.h\"\n\n\n\n\n\nRegion::Region()\n{\n}\n\n\n\n\n\nChunk & Region::getRelChunk(int a_RelChunkX, int a_RelChunkZ)\n{\n\t\tASSERT(a_RelChunkX >= 0);\n\t\tASSERT(a_RelChunkZ >= 0);\n\t\tASSERT(a_RelChunkX < 32);\n\t\tASSERT(a_RelChunkZ < 32);\n\n\t\treturn m_Chunks[a_RelChunkX + a_RelChunkZ * 32];\n}\n\n\n\n\n\nint Region::getRelBiome(int a_RelBlockX, int a_RelBlockZ)\n{\n\tASSERT(a_RelBlockX >= 0);\n\tASSERT(a_RelBlockZ >= 0);\n\tASSERT(a_RelBlockX < 512);\n\tASSERT(a_RelBlockZ < 512);\n\n\tint chunkX = a_RelBlockX / 16;\n\tint chunkZ = a_RelBlockZ / 16;\n\tChunk & chunk = m_Chunks[chunkX + 32 * chunkZ];\n\tif (chunk.isValid())\n\t{\n\t\treturn chunk.getBiome(a_RelBlockX - 16 * chunkX, a_RelBlockZ - 16 * chunkZ);\n\t}\n\telse\n\t{\n\t\treturn biInvalidBiome;\n\t}\n}\n\n\n\n\nvoid Region::blockToRegion(int a_BlockX, int a_BlockZ, int & a_RegionX, int & a_RegionZ)\n{\n\ta_RegionX = static_cast<int>(std::floor(static_cast<float>(a_BlockX) / 512));\n\ta_RegionZ = static_cast<int>(std::floor(static_cast<float>(a_BlockZ) / 512));\n}\n\n\n\n\n\nvoid Region::chunkToRegion(int a_ChunkX, int a_ChunkZ, int & a_RegionX, int & a_RegionZ)\n{\n\ta_RegionX = static_cast<int>(std::floor(static_cast<float>(a_ChunkX) / 32));\n\ta_RegionZ = static_cast<int>(std::floor(static_cast<float>(a_ChunkZ) / 32));\n}\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/Region.h",
    "content": "#pragma once\n\n#include \"QtChunk.h\"\n\n\n\n\n\nclass Region\n{\npublic:\n\tRegion();\n\n\t/** Retrieves the chunk with the specified relative coords. */\n\tChunk & getRelChunk(int a_RelChunkX, int a_RelChunkZ);\n\n\t/** Returns true iff the chunk data for all chunks has been loaded.\n\tThis doesn't mean that all the chunks are valid, only that the entire region has been processed and should\n\tbe displayed. */\n\tbool isValid(void) const { return m_IsValid; }\n\n\t/** Returns the biome in the block coords relative to this region.\n\tReturns biInvalidBiome if the underlying chunk is not valid. */\n\tint getRelBiome(int a_RelBlockX, int a_RelBlockZ);\n\n\t/** Converts block coordinates into region coordinates. */\n\tstatic void blockToRegion(int a_BlockX, int a_BlockZ, int & a_RegionX, int & a_RegionZ);\n\n\t/** Converts chunk coordinates into region coordinates. */\n\tstatic void chunkToRegion(int a_ChunkX, int a_ChunkZ, int & a_RegionX, int & a_RegionZ);\n\nprotected:\n\tfriend class RegionLoader;\n\n\n\tChunk m_Chunks[32 * 32];\n\n\t/** True iff the data for all the chunks has been loaded.\n\tThis doesn't mean that all the chunks are valid, only that the entire region has been processed and should\n\tbe displayed. */\n\tbool m_IsValid;\n};\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/RegionCache.cpp",
    "content": "#include \"Globals.h\"\n#include \"RegionCache.h\"\n#include <QMutexLocker>\n#include <QThreadPool>\n#include \"ChunkSource.h\"\n#include \"RegionLoader.h\"\n#include \"Region.h\"\n\n\n\n\n\nRegionCache::RegionCache(QObject * parent) :\n\tsuper(parent)\n{\n\tm_Cache.setMaxCost(1024 * 1024 * 1024);  // 1 GiB of memory for the cache\n}\n\n\n\n\n\nRegionPtr RegionCache::fetch(int a_RegionX, int a_RegionZ)\n{\n\t// Retrieve from the cache:\n\tquint32 hash = getRegionHash(a_RegionX, a_RegionZ);\n\tRegionPtr * res;\n\t{\n\t\tQMutexLocker lock(&m_Mtx);\n\t\tres = m_Cache[hash];\n\t\t// If succesful and region loaded, return the retrieved value:\n\t\tif ((res != nullptr) && (*res)->isValid())\n\t\t{\n\t\t\treturn *res;\n\t\t}\n\t}\n\n\t// If the region is in cache but not valid, it means it has been already queued for rendering, do nothing now:\n\tif (res != nullptr)\n\t{\n\t\treturn RegionPtr(nullptr);\n\t}\n\n\t// There's no such item in the cache, create it now:\n\ttry\n\t{\n\t\tres = new RegionPtr(new Region);\n\t}\n\tcatch (const std::bad_alloc &)\n\t{\n\t\t/* Allocation failed (32-bit process hit the 2 GiB barrier?)\n\t\tThis may happen even with the cache set to 1 GiB, because it contains shared ptrs and so they may be\n\t\theld by another place in the code even when they are removed from cache.\n\t\t*/\n\t\treturn RegionPtr(nullptr);\n\t}\n\tif (res == nullptr)\n\t{\n\t\treturn RegionPtr(nullptr);\n\t}\n\t{\n\t\tQMutexLocker lock(&m_Mtx);\n\t\tm_Cache.insert(hash, res, sizeof(Region));\n\t}\n\n\t// Queue the region for rendering:\n\tqueueRegionRender(a_RegionX, a_RegionZ, *res);\n\n\t// Return failure, the region is not yet rendered:\n\treturn RegionPtr(nullptr);\n}\n\n\n\n\n\nvoid RegionCache::setChunkSource(std::shared_ptr<ChunkSource> a_ChunkSource)\n{\n\t// Replace the chunk source:\n\tm_ChunkSource = a_ChunkSource;\n\n\t// Clear the cache:\n\tQMutexLocker lock(&m_Mtx);\n\tm_Cache.clear();\n}\n\n\n\n\n\nvoid RegionCache::reload()\n{\n\tassert(m_ChunkSource.get() != nullptr);\n\n\t// Reload the chunk source:\n\tm_ChunkSource->reload();\n\n\t// Clear the cache:\n\tQMutexLocker lock(&m_Mtx);\n\tm_Cache.clear();\n}\n\n\n\n\n\nvoid RegionCache::gotRegion(int a_RegionX, int a_RegionZ)\n{\n\temit regionAvailable(a_RegionX, a_RegionZ);\n}\n\n\n\n\n\nquint32 RegionCache::getRegionHash(int a_RegionX, int a_RegionZ)\n{\n\t// Simply join the two coords into a single int\n\t// The coords will never be larger than 16-bits, so we can do this safely\n\treturn (((static_cast<quint32>(a_RegionX) & 0xffff) << 16) | (static_cast<quint32>(a_RegionZ) & 0xffff));\n}\n\n\n\n\n\nvoid RegionCache::queueRegionRender(int a_RegionX, int a_RegionZ, RegionPtr & a_Region)\n{\n\t// Create a new loader task:\n\tRegionLoader * loader = new RegionLoader(a_RegionX, a_RegionZ, a_Region, m_ChunkSource);\n\tconnect(loader, SIGNAL(loaded(int, int)), this, SLOT(gotRegion(int, int)));\n\n\tQThreadPool::globalInstance()->start(loader);\n}\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/RegionCache.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <QCache>\n#include <QMutex>\n#include <memory>\n\n\n\n\n\n// fwd:\nclass Region;\ntypedef std::shared_ptr<Region> RegionPtr;\n\nclass ChunkSource;\n\n\n\n\n\n/** Caches regions' chunk data for reuse */\nclass RegionCache :\n\tpublic QObject\n{\n\ttypedef QObject super;\n\tQ_OBJECT\n\npublic:\n\texplicit RegionCache(QObject * parent = NULL);\n\n\t/** Retrieves the specified region from the cache.\n\tOnly returns valid regions; if the region is invalid, queues it for rendering and returns an empty ptr. */\n\tRegionPtr fetch(int a_RegionX, int a_RegionZ);\n\n\t/** Replaces the chunk source used by the biome view to get the chunk biome data.\n\tThe cache is then invalidated. */\n\tvoid setChunkSource(std::shared_ptr<ChunkSource> a_ChunkSource);\n\n\t/** Returns true iff the chunk source has been initialized. */\n\tbool hasData() const { return (m_ChunkSource.get() != nullptr); }\n\n\t/** Reloads the current chunk source. */\n\tvoid reload();\n\nsignals:\n\tvoid regionAvailable(int a_RegionX, int a_RegionZ);\n\nprotected slots:\n\tvoid gotRegion(int a_RegionX, int a_RegionZ);\n\nprotected:\n\t/** The cache of the chunks */\n\tQCache<quint32, RegionPtr> m_Cache;\n\n\t/** Locks the cache against multithreaded access */\n\tQMutex m_Mtx;\n\n\t/** The source used to get the biome data. */\n\tstd::shared_ptr<ChunkSource> m_ChunkSource;\n\n\n\t/** Returns the hash used by the chunk in the cache */\n\tquint32 getRegionHash(int a_RegionX, int a_RegionZ);\n\n\t/** Queues the specified region for rendering by m_RegionSource. */\n\tvoid queueRegionRender(int a_RegionX, int a_RegionZ, RegionPtr & a_Region);\n};\n\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/RegionLoader.cpp",
    "content": "#include \"Globals.h\"\n#include \"RegionLoader.h\"\n#include \"ChunkSource.h\"\n#include \"Region.h\"\n\n\n\n\n\nvolatile bool RegionLoader::m_IsShuttingDown = false;\n\n\n\n\n\nRegionLoader::RegionLoader(int a_RegionX, int a_RegionZ, RegionPtr a_Region, ChunkSourcePtr a_ChunkSource) :\n\tm_RegionX(a_RegionX),\n\tm_RegionZ(a_RegionZ),\n\tm_Region(a_Region),\n\tm_ChunkSource(a_ChunkSource)\n{\n}\n\n\n\n\n\nvoid RegionLoader::run()\n{\n\t// Load all the chunks in this region:\n\tfor (int z = 0; z < 32; z++)\n\t{\n\t\tfor (int x = 0; x < 32; x++)\n\t\t{\n\t\t\tm_ChunkSource->getChunkBiomes(m_RegionX * 32 + x, m_RegionZ * 32 + z, m_Region->getRelChunk(x, z));\n\t\t\tif (m_IsShuttingDown)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tm_Region->m_IsValid = true;\n\n\temit loaded(m_RegionX, m_RegionZ);\n}\n\n\n\n\n"
  },
  {
    "path": "Tools/QtBiomeVisualiser/RegionLoader.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <QRunnable>\n#include <memory>\n\n\n\n\n// fwd:\nclass Region;\ntypedef std::shared_ptr<Region> RegionPtr;\n\nclass ChunkSource;\ntypedef std::shared_ptr<ChunkSource> ChunkSourcePtr;\n\n\n\n\n\nclass RegionLoader :\n\tpublic QObject,\n\tpublic QRunnable\n{\n\tQ_OBJECT\n\npublic:\n\tRegionLoader(int a_RegionX, int a_RegionZ, RegionPtr a_Region, ChunkSourcePtr a_ChunkSource);\n\tvirtual ~RegionLoader() {}\n\n\t/** Signals to all loaders that the app is shutting down and the loading should be aborted. */\n\tstatic void shutdown() { m_IsShuttingDown = true; }\n\nsignals:\n\tvoid loaded(int a_RegionX, int a_RegionZ);\n\nprotected:\n\tvirtual void run() override;\n\nprivate:\n\t/** Coords of the region to be loaded. */\n\tint m_RegionX, m_RegionZ;\n\n\t/** The region to be loaded. */\n\tRegionPtr m_Region;\n\n\t/** The chunk source to be used for individual chunks within the region. */\n\tChunkSourcePtr m_ChunkSource;\n\n\t/** Flag that is set upon app exit to terminate the queued loaders faster. */\n\tstatic volatile bool m_IsShuttingDown;\n};\n\n\n\n\n"
  },
  {
    "path": "Tools/RCONClient/.gitignore",
    "content": "Debug/\nlogs/\nRelease/\n*.suo\n*.user\n*.ncb\n*.sdf\n"
  },
  {
    "path": "Tools/RCONClient/Globals.cpp",
    "content": "\n// Globals.cpp\n\n// This file is used for precompiled header generation in MSVC environments\n\n#include \"Globals.h\"\n\n\n\n\n"
  },
  {
    "path": "Tools/RCONClient/Globals.h",
    "content": "\n// Globals.h\n\n// This file gets included from every module in the project, so that global symbols may be introduced easily\n// Also used for precompiled header generation in MSVC environments\n\n\n\n\n\n// Compiler-dependent stuff:\n#if defined(_MSC_VER)\n\t// MSVC produces warning C4481 on the override keyword usage, so disable the warning altogether\n\t#pragma warning(disable:4481)\n\n\t// Disable some warnings that we don't care about:\n\t#pragma warning(disable:4100)\n\n\t// Use non-standard defines in <cmath>\n\t#define _USE_MATH_DEFINES\n\n#elif defined(__GNUC__)\n\n\t// TODO: Can GCC explicitly mark classes as abstract (no instances can be created)?\n\t#define abstract\n\n#else\n\n\t#error \"You are using an unsupported compiler, you might need to #define some stuff here for your compiler\"\n\n#endif\n\n\n\n\n\n// Integral types with predefined sizes:\ntypedef long long Int64;\ntypedef int       Int32;\ntypedef short     Int16;\n\ntypedef unsigned long long UInt64;\ntypedef unsigned int       UInt32;\ntypedef unsigned short     UInt16;\n\ntypedef unsigned char Byte;\n\n\n\n\n\n// A macro to disallow the copy constructor and operator= functions\n// This should be used in the private: declarations for any class that shouldn't allow copying itself\n#define DISALLOW_COPY_AND_ASSIGN(TypeName) \\\n\tTypeName(const TypeName &); \\\n\tvoid operator=(const TypeName &)\n\n// A macro that is used to mark unused function parameters, to avoid pedantic warnings in gcc\n#define UNUSED(X) (void)(X)\n\n\n\n\n// OS-dependent stuff:\n#ifdef _WIN32\n\t#define WIN32_LEAN_AND_MEAN\n\n\t#define _WIN32_WINNT 0x502  // We want to target WinXP SP2 and higher\n\n\t#include <Windows.h>\n\t#include <winsock2.h>\n\t#include <Ws2tcpip.h>  // IPv6 stuff\n\n\t// Windows SDK defines min and max macros, messing up with our std::min and std::max usage\n\t#undef min\n\t#undef max\n\n\t// Windows SDK defines GetFreeSpace as a constant, probably a Win16 API remnant\n\t#ifdef GetFreeSpace\n\t\t#undef GetFreeSpace\n\t#endif  // GetFreeSpace\n#else\n\t#include <sys/types.h>\n\t#include <sys/stat.h>   // for mkdir\n\t#include <sys/time.h>\n\t#include <sys/socket.h>\n\t#include <netinet/in.h>\n\t#include <arpa/inet.h>\n\t#include <netdb.h>\n\t#include <time.h>\n\t#include <dirent.h>\n\t#include <errno.h>\n\t#include <iostream>\n\n\t#include <cstdio>\n\t#include <cstring>\n\t#include <pthread.h>\n\t#include <semaphore.h>\n\t#include <errno.h>\n\t#include <fcntl.h>\n#endif\n\n\n\n\n\n// CRT stuff:\n#include <sys/stat.h>\n#include <assert.h>\n#include <stdio.h>\n#include <math.h>\n#include <stdarg.h>\n#include <time.h>\n\n\n\n\n\n// STL stuff:\n#include <vector>\n#include <list>\n#include <deque>\n#include <string>\n#include <map>\n#include <algorithm>\n#include <memory>\n\n\n\n\n\n// Common headers (part 1, without macros):\n#include \"StringUtils.h\"\n#include \"OSSupport/CriticalSection.h\"\n#include \"OSSupport/File.h\"\n#include \"OSSupport/Event.h\"\n#include \"Logger.h\"\n\n\n\n\n\n// Common definitions:\n\n/** Evaluates to the number of elements in an array (compile-time!) */\n#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))\n\n/** Allows arithmetic expressions like \"32 KiB\" (but consider using parenthesis around it, \"(32 KiB)\") */\n#define KiB * 1024\n\n/** Faster than (int)floorf((float)x / (float)div) */\n#define FAST_FLOOR_DIV(x, div) ((x) < 0 ? (((int)x / div) - 1) : ((int)x / div))\n\n// Own version of assert() that writes failed assertions to the log for review\n#ifdef  NDEBUG\n\t#define ASSERT(x) ((void)0)\n#else\n\t#define ASSERT assert\n#endif\n\n// Pretty much the same as ASSERT() but stays in Release builds\n#define VERIFY(x) (!!(x) || (LOGERROR(\"Verification failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), exit(1), 0))\n"
  },
  {
    "path": "Tools/RCONClient/RCONClient.cpp",
    "content": "\n// RCONClient.cpp\n\n// Implements the main app entrypoint\n\n#include \"Globals.h\"\n#include \"OSSupport/Socket.h\"\n#include \"ByteBuffer.h\"\n\n\n\n\n\n// If set to true, verbose messages are output to stderr. Use the \"-v\" or \"--verbose\" param to turn on\nbool g_IsVerbose = false;\n\n\n\n\n\n/** This class can read and write RCON packets to / from a connected socket */\nclass cRCONPacketizer\n{\npublic:\n\tenum\n\t{\n\t\tptCommand = 2,\n\t\tptLogin = 3,\n\t} ;\n\n\tcRCONPacketizer(cSocket & a_Socket);\n\n\t/** Sends the packet to the socket and waits until the response is received.\n\tReturns true if response successfully received, false if the client disconnected or protocol error.\n\tDumps the reply payload to stdout. */\n\tbool SendPacket(int a_PacketType, const AString & a_PacketPayload);\n\nprotected:\n\t/** The socket to use for reading incoming data and writing outgoing data: */\n\tcSocket & m_Socket;\n\n\t/** The RequestID of the packet that is being sent. Incremented when the reply is received */\n\tint m_RequestID;\n\n\t/** Receives the full response and dumps its payload to stdout.\n\tReturns true if successful, false if the client disconnected or protocol error. */\n\tbool ReceiveResponse(void);\n\n\t/** Parses the received response packet and dumps its payload to stdout.\n\tReturns true if successful, false on protocol error\n\tAssumes that the packet length has already been read from the packet\n\tIf the packet is successfully parsed, increments m_RequestID */\n\tbool ParsePacket(cByteBuffer & a_Buffer, int a_PacketLength);\n} ;\n\n\n\n\n\ncRCONPacketizer::cRCONPacketizer(cSocket & a_Socket) :\n\tm_Socket(a_Socket),\n\tm_RequestID(0)\n{\n}\n\n\n\n\n\nbool cRCONPacketizer::SendPacket(int a_PacketType, const AString & a_PacketPayload)\n{\n\t// Send the packet:\n\tcByteBuffer bb(a_PacketPayload.size() + 30);\n\tbb.WriteLEInt(m_RequestID);\n\tbb.WriteLEInt(a_PacketType);\n\tbb.WriteBuf(a_PacketPayload.data(), a_PacketPayload.size());\n\tbb.WriteBEShort(0);  // Padding\n\tAString Packet;\n\tbb.ReadAll(Packet);\n\tsize_t Length = Packet.size();\n\tif (!m_Socket.Send((const char *)&Length, 4))\n\t{\n\t\tfprintf(stderr, \"Network error while sending packet: %d (%s). Aborting.\\n\",\n\t\t\tcSocket::GetLastError(), cSocket::GetLastErrorString().c_str()\n\t\t);\n\t\treturn false;\n\t}\n\tif (!m_Socket.Send(Packet.data(), Packet.size()))\n\t{\n\t\tfprintf(stderr, \"Network error while sending packet: %d (%s). Aborting.\\n\",\n\t\t\tcSocket::GetLastError(), cSocket::GetLastErrorString().c_str()\n\t\t);\n\t\treturn false;\n\t}\n\n\treturn ReceiveResponse();\n}\n\n\n\n\n\nbool cRCONPacketizer::ReceiveResponse(void)\n{\n\t// Receive the response:\n\tcByteBuffer Buffer(64 KiB);\n\twhile (true)\n\t{\n\t\tchar buf[1024];\n\t\tint NumReceived = m_Socket.Receive(buf, sizeof(buf), 0);\n\t\tif (NumReceived == 0)\n\t\t{\n\t\t\tfprintf(stderr, \"The remote end closed the connection. Aborting.\\n\");\n\t\t\treturn false;\n\t\t}\n\t\tif (NumReceived < 0)\n\t\t{\n\t\t\tfprintf(stderr, \"Network error while receiving response: %d, %d (%s). Aborting.\\n\",\n\t\t\t\tNumReceived, cSocket::GetLastError(), cSocket::GetLastErrorString().c_str()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\t\tBuffer.Write(buf, NumReceived);\n\t\tBuffer.ResetRead();\n\n\t\t// Check if the buffer contains the full packet:\n\t\tif (!Buffer.CanReadBytes(14))\n\t\t{\n\t\t\t// 14 is the minimum packet size for RCON\n\t\t\tcontinue;\n\t\t}\n\t\tint PacketSize;\n\t\tVERIFY(Buffer.ReadLEInt(PacketSize));\n\t\tif (!Buffer.CanReadBytes(PacketSize))\n\t\t{\n\t\t\t// The packet is not complete yet\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Parse the packet\n\t\treturn ParsePacket(Buffer, PacketSize);\n\t}\n}\n\n\n\n\n\nbool cRCONPacketizer::ParsePacket(cByteBuffer & a_Buffer, int a_PacketLength)\n{\n\t// Check that the request ID is equal\n\tbool IsValid = true;\n\tint RequestID = 0;\n\tVERIFY(a_Buffer.ReadLEInt(RequestID));\n\tif (RequestID != m_RequestID)\n\t{\n\t\tif ((RequestID == -1) && (m_RequestID == 0))\n\t\t{\n\t\t\tfprintf(stderr, \"Login failed. Aborting.\\n\");\n\t\t\tIsValid = false;\n\t\t\t// Continue, so that the payload is printed before the program aborts.\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfprintf(stderr, \"The server returned an invalid request ID, got %d, exp. %d. Aborting.\\n\", RequestID, m_RequestID);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check the packet type:\n\tint PacketType = 0;\n\tVERIFY(a_Buffer.ReadLEInt(PacketType));\n\tif (PacketType != ptCommand)\n\t{\n\t\tfprintf(stderr, \"The server returned an unknown packet type: %d. Aborting.\\n\", PacketType);\n\t\tIsValid = false;\n\t\t// Continue, so that the payload is printed before the program aborts.\n\t}\n\n\tAString Payload;\n\tVERIFY(a_Buffer.ReadString(Payload, a_PacketLength - 10));\n\n\t// Dump the payload to stdout, in a binary mode\n\tfwrite(Payload.data(), Payload.size(), 1, stdout);\n\n\tif (IsValid)\n\t{\n\t\tm_RequestID++;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// main:\n\nint RealMain(int argc, char * argv[])\n{\n\tcLogger::InitiateMultithreading();\n\n\t// Parse the cmdline params for server IP, port, password and the commands to send:\n\tAString ServerAddress, Password;\n\tint ServerPort = -1;\n\tAStringVector Commands;\n\tfor (int i = 1; i < argc; i++)\n\t{\n\t\tif (((NoCaseCompare(argv[i], \"-s\") == 0) || (NoCaseCompare(argv[i], \"--server\") == 0)) && (i < argc - 1))\n\t\t{\n\t\t\tServerAddress = argv[i + 1];\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (((NoCaseCompare(argv[i], \"-p\") == 0) || (NoCaseCompare(argv[i], \"--port\") == 0)) && (i < argc - 1))\n\t\t{\n\t\t\tServerPort = atoi(argv[i + 1]);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (((NoCaseCompare(argv[i], \"-w\") == 0) || (NoCaseCompare(argv[i], \"--password\") == 0)) && (i < argc - 1))\n\t\t{\n\t\t\tPassword = argv[i + 1];\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (((NoCaseCompare(argv[i], \"-c\") == 0) || (NoCaseCompare(argv[i], \"--cmd\") == 0) || (NoCaseCompare(argv[i], \"--command\") == 0)) && (i < argc - 1))\n\t\t{\n\t\t\tCommands.push_back(argv[i + 1]);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (((NoCaseCompare(argv[i], \"-f\") == 0) || (NoCaseCompare(argv[i], \"--file\") == 0)) && (i < argc - 1))\n\t\t{\n\t\t\ti++;\n\t\t\tcFile f(argv[i], cFile::fmRead);\n\t\t\tif (!f.IsOpen())\n\t\t\t{\n\t\t\t\tfprintf(stderr, \"Cannot read commands from file \\\"%s\\\", aborting.\", argv[i]);\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\tAString cmd;\n\t\t\tf.ReadRestOfFile(cmd);\n\t\t\tCommands.push_back(cmd);\n\t\t\tcontinue;\n\t\t}\n\t\tif ((NoCaseCompare(argv[i], \"-v\") == 0) || (NoCaseCompare(argv[i], \"--verbose\") == 0))\n\t\t{\n\t\t\tfprintf(stderr, \"Verbose output enabled\\n\");\n\t\t\tg_IsVerbose = true;\n\t\t\tcontinue;\n\t\t}\n\t\tfprintf(stderr, \"Unknown parameter: \\\"%s\\\". Aborting.\", argv[i]);\n\t\treturn 1;\n\t}  // for i - argv[]\n\n\tif (ServerAddress.empty() || (ServerPort < 0))\n\t{\n\t\tfprintf(stderr, \"Server address or port not set. Use the --server and --port parameters to set them. Aborting.\");\n\t\treturn 1;\n\t}\n\n\t// Connect:\n\tif (cSocket::WSAStartup() != 0)\n\t{\n\t\tfprintf(stderr, \"Cannot initialize network stack. Aborting\\n\");\n\t\treturn 6;\n\t}\n\tif (g_IsVerbose)\n\t{\n\t\tfprintf(stderr, \"Connecting to \\\"%s:%d\\\"...\\n\", ServerAddress.c_str(), ServerPort);\n\t}\n\tcSocket s = cSocket::CreateSocket(cSocket::IPv4);\n\tif (!s.ConnectIPv4(ServerAddress, (unsigned short)ServerPort))\n\t{\n\t\tfprintf(stderr, \"Cannot connect to \\\"%s:%d\\\": %s\\n\", ServerAddress.c_str(), ServerPort, cSocket::GetLastErrorString().c_str());\n\t\treturn 3;\n\t}\n\tcRCONPacketizer Packetizer(s);\n\n\t// Authenticate using the provided password:\n\tif (!Password.empty())\n\t{\n\t\tif (g_IsVerbose)\n\t\t{\n\t\t\tfprintf(stderr, \"Sending the login packet...\\n\");\n\t\t}\n\t\tif (!Packetizer.SendPacket(cRCONPacketizer::ptLogin, Password))\n\t\t{\n\t\t\t// Error message has already been printed, bail out\n\t\t\treturn 4;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (g_IsVerbose)\n\t\t{\n\t\t\tfprintf(stderr, \"No password provided, not sending a login packet.\\n\");\n\t\t}\n\t}\n\n\t// Send each command:\n\tfor (AStringVector::const_iterator itr = Commands.begin(), end = Commands.end(); itr != end; ++itr)\n\t{\n\t\tif (g_IsVerbose)\n\t\t{\n\t\t\tfprintf(stderr, \"Sending command \\\"%s\\\"...\\n\", itr->c_str());\n\t\t}\n\t\tif (!Packetizer.SendPacket(cRCONPacketizer::ptCommand, *itr))\n\t\t{\n\t\t\treturn 5;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\t// This redirection function is only so that debugging the program is easier in MSVC - when RealMain exits, it's still possible to place a breakpoint\n\tint res = RealMain(argc, argv);\n\treturn res;\n}\n"
  },
  {
    "path": "Tools/ToLuaDoxy/Doxyfile",
    "content": "# Doxyfile 1.8.1.2\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project\n#\n# All text after a hash (#) is considered a comment and will be ignored\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \")\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# https://www.gnu.org/software/libiconv for the list of possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or sequence of words) that should\n# identify the project. Note that if you do not use Doxywizard you need\n# to put quotes around the project name if it contains spaces.\n\nPROJECT_NAME           = API\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n\nPROJECT_NUMBER         =\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer\n# a quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = \"Functions and classes available in the Lua API\"\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is\n# included in the documentation. The maximum height of the logo should not\n# exceed 55 pixels and the maximum width should not exceed 200 pixels.\n# Doxygen will copy the logo to the output directory.\n\nPROJECT_LOGO           =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n# base path where the generated documentation will be put.\n# If a relative path is entered, it will be relative to the location\n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = doxy\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n# 4096 sub-directories (in 2 levels) under the output directory of each output\n# format and will distribute the generated files over these directories.\n# Enabling this option can be useful when feeding doxygen a huge amount of\n# source files, where putting all generated files in the same directory would\n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator\n# that is used to form the text in various listings. Each string\n# in this list, if found as the leading text of the brief description, will be\n# stripped from the text and the result after processing the whole list, is\n# used as the annotated text. Otherwise, the brief description is used as-is.\n# If left blank, the following values are used (\"$name\" is automatically\n# replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       = \"The $name class\" \\\n                         \"The $name widget\" \\\n                         \"The $name file\" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user-defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the\n# path to strip.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n# the path mentioned in the documentation of a class, which tells\n# the reader which header file to include in order to use a class.\n# If left blank only the name of the header file containing the class\n# definition is used. Otherwise one should specify the include paths that\n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n# (but less readable) file names. This can be useful if your file system\n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = YES\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments will behave just like regular Qt-style comments\n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n# interpret the first line (until the first dot) of a Qt-style\n# comment as the brief description. If set to NO, the comments\n# will behave just like regular Qt-style comments (thus requiring\n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = YES\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n# treat a multi-line C++ special comment block (i.e. a block of //! or ///\n# comments) as a brief description. This used to be the default behaviour.\n# The new default is to treat a multi-line C++ comment block as a detailed\n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n# a new page for each member. If set to NO, the documentation of a member will\n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 2\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user-defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                =\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding\n# \"class=itcl::class\" will allow you to use the command class in the\n# itcl::class meaning.\n\nTCL_SUBST              =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n# sources only. Doxygen will then generate output that is more tailored for C.\n# For instance, some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n# sources only. Doxygen will then generate output that is more tailored for\n# Java. For instance, namespaces will be presented as packages, qualified\n# scopes will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources only. Doxygen will then generate output that is more tailored for\n# Fortran.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for\n# VHDL.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given extension.\n# Doxygen has a built-in mapping, but you can override or extend it using this\n# tag. The format is ext=language, where ext is a file extension, and language\n# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,\n# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make\n# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions\n# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all\n# comments according to the Markdown format, which allows for more readable\n# documentation. See https://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you\n# can mix doxygen, HTML, and XML commands with Markdown formatting.\n# Disable only in case of backward compatibilities issues.\n\nMARKDOWN_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should\n# set this tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n# func(std::string) {}). This also makes the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n# Doxygen will parse them like normal C++ but will assume all classes use public\n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate getter\n# and setter methods for a property. Setting this option to YES (the default)\n# will make doxygen replace the get and set methods by a property in the\n# documentation. This will only work if the methods are indeed getting or\n# setting a simple type. If this is not the case, or you want to show the\n# methods anyway, you should set this option to NO.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n# the same type (for instance a group of public functions) to be put as a\n# subgroup of that type (e.g. under the Public Functions section). Set it to\n# NO to prevent subgrouping. Alternatively, this can be done per class using\n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n# unions are shown inside the group in which they are included (e.g. using\n# @ingroup) instead of on a separate page (for HTML and Man pages) or\n# section (for LaTeX and RTF).\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n# unions with only public data fields will be shown inline in the documentation\n# of the scope in which they are defined (i.e. file, namespace, or group\n# documentation), provided this scope is documented. If set to NO (the default),\n# structs, classes, and unions are shown on a separate page (for HTML and Man\n# pages) or section (for LaTeX and RTF).\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n# is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically\n# be useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n# determine which symbols to keep in memory and which to flush to disk.\n# When the cache is full, less often used symbols will be written to disk.\n# For small to medium size projects (<1000 input files) the default value is\n# probably good enough. For larger projects a too small cache size can cause\n# doxygen to be busy swapping symbols to and from disk most of the time\n# causing a significant performance penalty.\n# If the system has enough physical memory increasing the cache will improve the\n# performance by keeping more symbols in memory. Note that the value works on\n# a logarithmic scale so increasing the size by one will roughly double the\n# memory usage. The cache size is given by this formula:\n# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nSYMBOL_CACHE_SIZE      = 0\n\n# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\n# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\n# their name and scope. Since this can be an expensive process and often the\n# same symbol appear multiple times in the code, doxygen keeps a cache of\n# pre-resolved symbols. If the cache is too small doxygen will become slower.\n# If the cache is too large, memory is wasted. The cache size is given by this\n# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = YES\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal\n# scope will be included in the documentation.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n# defined locally in source files will be included in the documentation.\n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local\n# methods, which are defined in the implementation section but not in\n# the interface are included in the documentation.\n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base\n# name of the file that contains the anonymous namespace. By default\n# anonymous namespaces are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these classes will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n# friend (class|struct|union) declarations.\n# If set to NO (the default) these declarations will be included in the\n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n# documentation blocks found inside the body of a function.\n# If set to NO (the default) these blocks will be appended to the\n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = NO\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put a list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n# will list include files with double quotes in the documentation\n# rather than with sharp brackets.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n# brief documentation of file, namespace and class members alphabetically\n# by member name. If set to NO (the default) the members will appear in\n# declaration order.\n\nSORT_BRIEF_DOCS        = YES\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n# will sort the (brief and detailed) documentation of class members so that\n# constructors and destructors are listed first. If set to NO (the default)\n# the constructors will appear in the respective orders defined by\n# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n# hierarchy of group names into alphabetical order. If set to NO (the default)\n# the group names will appear in their defined order.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n# sorted by fully-qualified names, including namespaces. If set to\n# NO (the default), the class list will be sorted only by class name,\n# not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the\n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n# do proper type resolution of all parameters of a function it will reject a\n# match between the prototype and the implementation of a member function even\n# if there is only one candidate or it is obvious which candidate to choose\n# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n# will still accept a match between prototype and implementation in such cases.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n# disable (NO) the deprecated list. This list is created by putting\n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or macro consists of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and macros in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = NO\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n# This will remove the Files entry from the Quick Index and from the\n# Folder Tree View (if specified). The default is YES.\n\nSHOW_FILES             = NO\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n# Namespaces page.  This will remove the Namespaces entry from the Quick Index\n# and from the Folder Tree View (if specified). The default is YES.\n\nSHOW_NAMESPACES        = NO\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command <command> <input-file>, where <command> is the value of\n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n# provided by doxygen. Whatever the program writes to standard output\n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option.\n# You can optionally specify a file name after the option, if omitted\n# DoxygenLayout.xml will be used as the name of the layout file.\n\nLAYOUT_FILE            =\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files\n# containing the references data. This must be a list of .bib files. The\n# .bib extension is automatically appended if omitted. Using this command\n# requires the bibtex tool to be installed. See also\n# https://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\n# feature you need bibtex and perl available in the search path.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some\n# parameters in a documented function, or documenting parameters that\n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_NO_PARAMDOC option can be enabled to get warnings for\n# functions that are documented, but have no documentation for their parameters\n# or return value. If set to NO (the default) doxygen will only warn about\n# wrong or incomplete parameter documentation, but not about the absence of\n# documentation.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text. Optionally the format may contain\n# $version, which will be replaced by the version of the file (if it could\n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n\nINPUT                  = Out\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n# also the default input encoding. Doxygen uses libiconv (or the iconv built\n# into libc) for the transcoding. See https://www.gnu.org/software/libiconv for\n# the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank the following patterns are tested:\n# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n# *.f90 *.f *.for *.vhd *.vhdl\n\nFILE_PATTERNS          = *.c \\\n                         *.cc \\\n                         *.cxx \\\n                         *.cpp \\\n                         *.c++ \\\n                         *.d \\\n                         *.java \\\n                         *.ii \\\n                         *.ixx \\\n                         *.ipp \\\n                         *.i++ \\\n                         *.inl \\\n                         *.h \\\n                         *.hh \\\n                         *.hxx \\\n                         *.hpp \\\n                         *.h++ \\\n                         *.idl \\\n                         *.odl \\\n                         *.cs \\\n                         *.php \\\n                         *.php3 \\\n                         *.inc \\\n                         *.m \\\n                         *.markdown \\\n                         *.md \\\n                         *.mm \\\n                         *.dox \\\n                         *.py \\\n                         *.f90 \\\n                         *.f \\\n                         *.for \\\n                         *.vhd \\\n                         *.vhdl\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = NO\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = source/SQLite \\\n                         source/squirrelbindings\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories. Note that the wildcards are matched\n# against the file with absolute path, so to exclude all test directories\n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = *StackWalker.* \\\n                         *LeakFinder.* \\\n                         *Bindings.* \\\n                         *ManualBindings.*\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        = _* \\\n                         __* \\\n                         abstract\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude\n# commands irrespective of the value of the RECURSIVE tag.\n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.  If FILTER_PATTERNS is specified, this tag will be\n# ignored.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis.  Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match.  The filters are a list of the form:\n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n# info on how filters are used. If FILTER_PATTERNS is empty or if\n# non of the patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n# and it is also possible to disable source filtering for a specific pattern\n# using *.ext= (so without naming a filter). This option only has effect when\n# FILTER_SOURCE_FILES is enabled.\n\nFILTER_SOURCE_PATTERNS =\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n# Note: To get rid of all source code in the generated output, make sure also\n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C, C++ and Fortran comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES\n# then for each documented function all documented\n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES\n# then for each documented function all documented entities\n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.  Otherwise they will link to the documentation.\n\nREFERENCES_LINK_SOURCE = NO\n\n# If the USE_HTAGS tag is set to YES then the references to source code\n# will point to the HTML generated by the htags(1) tool instead of doxygen\n# built-in source browser. The htags tool is part of GNU's global source\n# tagging system (see https://www.gnu.org/software/global/global.html). You\n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = YES\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          = c\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header. Note that when using a custom header you are responsible\n# for the proper inclusion of any scripts and style sheets that doxygen\n# needs, which is dependent on the configuration options used.\n# It is advised to generate a default header using \"doxygen -w html\n# header.html footer.html stylesheet.css YourConfigFile\" and then modify\n# that header. Note that the header is subject to change so you typically\n# have to redo this when upgrading to a newer version of doxygen or when\n# changing the value of configuration settings such as GENERATE_TREEVIEW!\n\nHTML_HEADER            =\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            =\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If the tag is left blank doxygen\n# will generate a default style sheet. Note that doxygen will try to copy\n# the style sheet file to the HTML output directory, so don't put your own\n# style sheet in the HTML output directory as well, or it will be erased!\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that\n# the files will be copied as-is; there are no commands or markers available.\n\nHTML_EXTRA_FILES       =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n# Doxygen will adjust the colors in the style sheet and background images\n# according to this color. Hue is specified as an angle on a colorwheel,\n# see https://en.wikipedia.org/wiki/Hue for more information.\n# For instance the value 0 represents red, 60 is yellow, 120 is green,\n# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n# The allowed range is 0 to 359.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n# the colors in the HTML output. For a value of 0 the output will use\n# grayscales only. A value of 255 will produce the most vivid colors.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n# the luminance component of the colors in the HTML output. Values below\n# 100 gradually make the output lighter, whereas values above 100 make\n# the output darker. The value divided by 100 is the actual gamma applied,\n# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n# and 100 does not change the gamma.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting\n# this to NO can help when comparing the output of multiple runs.\n\nHTML_TIMESTAMP         = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of\n# entries shown in the various tree structured indices initially; the user\n# can expand and collapse entries dynamically later on. Doxygen will expand\n# the tree to such a level that at most the specified number of entries are\n# visible (unless a fully collapsed tree already exceeds this amount).\n# So setting the number of entries 1 will produce a full collapsed tree by\n# default. 0 is a special value representing an infinite number of entries\n# and will result in a full expanded tree by default.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files\n# will be generated that can be used as input for Apple's Xcode 3\n# integrated development environment, introduced with OSX 10.5 (Leopard).\n# To create a documentation set, doxygen will generate a Makefile in the\n# HTML output directory. Running make will produce the docset in that\n# directory and running \"make install\" will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n# it at startup.\n# See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n\nGENERATE_DOCSET        = NO\n\n# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n# feed. A documentation feed provides an umbrella under which multiple\n# documentation sets from a single provider (such as a company or product suite)\n# can be grouped.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n# should uniquely identify the documentation set bundle. This should be a\n# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n# will append .docset to the name.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n# be used to specify the file name of the resulting .chm file. You\n# can add a path in front of the file if the result should not be\n# written to the html output directory.\n\nCHM_FILE               =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n# be used to specify the location (absolute path including file name) of\n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n# is used to encode HtmlHelp index (hhk), content (hhc) and project file\n# content.\n\nCHM_INDEX_ENCODING     =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members\n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n# that can be used as input for Qt's qhelpgenerator to generate a\n# Qt Compressed Help (.qch) of the generated HTML documentation.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n# be used to specify the file name of the resulting .qch file.\n# The path specified is relative to the HTML output folder.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# https://doc.qt.io/qt-5/qthelpproject.html#namespace\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# https://doc.qt.io/qt-5/qthelpproject.html#virtual-folders\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n# add. For more information please see\n# https://doc.qt.io/qt-5/qthelpproject.html#custom-filters\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see\n# <a href=\"https://doc.qt.io/qt-5/qthelpproject.html#custom-filters\">\n# Qt Help Project / Custom Filters</a>.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's\n# filter section matches.\n# <a href=\"https://doc.qt.io/qt-5/qthelpproject.html#filter-attributes\">\n# Qt Help Project / Filter Attributes</a>.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n# be used to specify the location of Qt's qhelpgenerator.\n# If non-empty doxygen will try to run qhelpgenerator on the generated\n# .qhp file.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n# will be generated, which together with the HTML files, form an Eclipse help\n# plugin. To install this plugin and make it available under the help contents\n# menu in Eclipse, the contents of the directory containing the HTML and XML\n# files needs to be copied into the plugins directory of eclipse. The name of\n# the directory within the plugins directory should be the same as\n# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n# the help appears.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have\n# this name.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)\n# at top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it. Since the tabs have the same information as the\n# navigation tree you can set this option to NO if you already set\n# GENERATE_TREEVIEW to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information.\n# If the tag value is set to YES, a side panel will be generated\n# containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n# Windows users are probably better off using the HTML help feature.\n# Since the tree basically has the same information as the tab index you\n# could consider to set DISABLE_INDEX to NO when enabling this option.\n\nGENERATE_TREEVIEW      = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n# (range [0,1..20]) that doxygen will group on one line in the generated HTML\n# documentation. Note that a value of 0 will completely suppress the enum\n# values from appearing in the overview section.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n# links to external symbols imported via tag files in a separate window.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of Latex formulas included\n# as images in the HTML documentation. The default is 10. Note that\n# when you change the font size after a successful doxygen run you need\n# to manually remove any form_*.png images from the HTML output directory\n# to force them to be regenerated.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are\n# not supported properly for IE 6.0, but are supported on all modern browsers.\n# Note that when changing this option you need to delete any form_*.png files\n# in the HTML output before the changes have effect.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n# (see https://www.mathjax.org) which uses client side Javascript for the\n# rendering instead of using prerendered bitmaps. Use this if you do not\n# have LaTeX installed or if you want to formulas look prettier in the HTML\n# output. When enabled you may also need to install MathJax separately and\n# configure the path to it using the MATHJAX_RELPATH option.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you need to specify the location relative to the\n# HTML output directory using the MATHJAX_RELPATH option. The destination\n# directory should contain the MathJax.js script. For instance, if the mathjax\n# directory is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to\n# the MathJax Content Delivery Network so you can quickly see the result without\n# installing MathJax.  However, it is strongly recommended to install a local\n# copy of MathJax from https://www.mathjax.org before deployment.\n\nMATHJAX_RELPATH        = https://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\n# names that should be enabled during MathJax rendering.\n\nMATHJAX_EXTENSIONS     =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box\n# for the HTML output. The underlying search engine uses javascript\n# and DHTML and should work on any modern browser. Note that when using\n# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n# (GENERATE_DOCSET) there is already a search function so this one should\n# typically be disabled. For large projects the javascript based search engine\n# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\n\nSEARCHENGINE           = NO\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a PHP enabled web server instead of at the web client\n# using Javascript. Doxygen will generate the search PHP script and index\n# file to put on the web server. The advantage of the server\n# based approach is that it scales better to large projects and allows\n# full text search. The disadvantages are that it is more difficult to setup\n# and does not have live searching capabilities.\n\nSERVER_BASED_SEARCH    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked. If left blank `latex' will be used as the default command name.\n# Note that when enabling USE_PDFLATEX this option is only used for\n# generating bitmaps for formulas in the HTML output, but not in the\n# Makefile that is written to the output directory.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n# generate index for LaTeX. If left blank `makeindex' will be used as the\n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, letter, legal and\n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n# the generated latex document. The footer should contain everything after\n# the last chapter. If it is left blank doxygen will generate a\n# standard footer. Notice: only use this tag if you know what you are doing!\n\nLATEX_FOOTER           =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not\n# include the index chapters (such as File Index, Compound Index, etc.)\n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n# If LATEX_SOURCE_CODE is set to YES then doxygen will include\n# source code with syntax highlighting in the LaTeX output.\n# Note that which sources are shown also depends on other settings\n# such as SOURCE_BROWSER.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. The default style is \"plain\". See\n# https://en.wikipedia.org/wiki/BibTeX for more info.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimized for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using WORD or other\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load style sheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n# then it will generate one additional man file for each entity\n# documented in the real man page(s). These additional files\n# only source the real man page, but without them the man command\n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will\n# generate an XML file that captures the structure of\n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\nXML_SCHEMA             =\n\n# The XML_DTD tag can be used to specify an XML DTD,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\nXML_DTD                =\n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n# dump the program listings (including syntax highlighting\n# and cross-referencing information) to the XML output. Note that\n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n# generate an AutoGen Definitions (see autogen.sf.net) file\n# that captures the structure of the code including all\n# documentation. Note that this feature is still experimental\n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will\n# generate a Perl module file that captures the structure of\n# the code including all documentation. Note that this\n# feature is still experimental and incomplete at the\n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n# the necessary Makefile rules, Perl scripts and LaTeX code to be able\n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n# nicely formatted so it can be parsed by a human reader.  This is useful\n# if you want to understand what is going on.  On the other hand, if this\n# tag is set to NO the size of the Perl module output will be much smaller\n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file\n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n# This is useful so different doxyrules.make files included by the same\n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# pointed to by INCLUDE_PATH will be searched when a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed. To prevent a macro definition from being\n# undefined via #undef or recursively expanded use the := operator\n# instead of the = operator.\n\nPREDEFINED             =\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition that\n# overrules the definition found in the source code.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n# doxygen's preprocessor will remove all references to function-like macros\n# that are alone on a line, have an all uppercase name, and do not end with a\n# semicolon, because these will confuse the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. For each\n# tag file the location of the external documentation should be added. The\n# format of a tag file without this location is as follows:\n#   TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n#   TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where \"loc1\" and \"loc2\" can be relative or absolute paths\n# or URLs. Note that each tag file must have a unique name (where the name does\n# NOT include the path). If a tag file is not located in the directory in which\n# doxygen is run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will\n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n# or super classes. Setting the tag to NO turns the diagrams off. Note that\n# this option also works with HAVE_DOT disabled, but it is recommended to\n# install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see\n# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# If set to YES, the inheritance and collaboration graphs will hide\n# inheritance and usage relations if the target is undocumented\n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = YES\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n# allowed to run in parallel. When set to 0 (the default) doxygen will\n# base this on the number of processors available in the system. You can set it\n# explicitly to a value larger than 0 to get control over the balance\n# between CPU load and processing speed.\n\nDOT_NUM_THREADS        = 12\n\n# By default doxygen will use the Helvetica font for all dot files that\n# doxygen generates. When you want a differently looking font you can specify\n# the font name using DOT_FONTNAME. You need to make sure dot is able to find\n# the font, which can be done by putting it in a standard location or by setting\n# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n# directory containing the font.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n# The default size is 10pt.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the Helvetica font.\n# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\n# set the path where dot can find it.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = NO\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside\n# the class node. If there are many fields or methods and many nodes the\n# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n# threshold limits the number of items for each type to make the size more\n# managable. Set this to 0 for no limit. Note that the threshold may be\n# exceeded by 50% before the limit is enforced.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If set to YES, the inheritance and collaboration graphs will show the\n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n# tags are set to YES then doxygen will generate a graph for each documented\n# file showing the direct and indirect include dependencies of the file with\n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n# documented header file showing the documented files that directly or\n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH and HAVE_DOT options are set to YES then\n# doxygen will generate a call dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable call graphs\n# for selected functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n# doxygen will generate a caller dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable caller\n# graphs for selected functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will generate a graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES\n# then doxygen will show the dependencies a directory has on other directories\n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. Possible values are svg, png, jpg, or gif.\n# If left blank png will be used. If you choose svg you need to set\n# HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible in IE 9+ (other browsers do not have this requirement).\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n# Note that this requires a modern browser other than Internet Explorer.\n# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\n# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible. Older versions of IE do not have SVG support.\n\nINTERACTIVE_SVG        = NO\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the\n# \\dotfile command).\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the\n# \\mscfile command).\n\nMSCFILE_DIRS           =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n# nodes that will be shown in the graph. If the number of nodes in a graph\n# becomes larger than this value, doxygen will truncate the graph, which is\n# visualized by representing a node as a red box. Note that doxygen if the\n# number of direct children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 500\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n# graphs generated by dot. A depth value of 3 means that only nodes reachable\n# from the root by following a path via at most 3 edges will be shown. Nodes\n# that lay further from the root node will be omitted. Note that setting this\n# option to 1 or 2 may greatly reduce the computation time needed for large\n# code bases. Also note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not\n# seem to support this out of the box. Warning: Depending on the platform used,\n# enabling this option may lead to badly anti-aliased labels on the edges of\n# a graph (i.e. they become hard to read).\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10)\n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = YES\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermediate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "Tools/ToLuaDoxy/Globals.cpp",
    "content": "\n// Globals.cpp\n\n// Used for precompiled header generation in MSVC\n\n#include \"Globals.h\"\n\n\n\n\n"
  },
  {
    "path": "Tools/ToLuaDoxy/Globals.h",
    "content": "\n// Globals.h\n\n// This file is used for precompiled header generation in MSVC\n\n\n\n\n// OS-dependent stuff:\n#ifdef _WIN32\n\t#define WIN32_LEAN_AND_MEAN\n\n\t#define _WIN32_WINNT 0x501  // We want to target WinXP and higher\n\n\t#include <Windows.h>\n\t#include <winsock2.h>\n\t#include <Ws2tcpip.h>  // IPv6 stuff\n\n\t// Windows SDK defines min and max macros, messing up with our std::min and std::max usage\n\t#undef min\n\t#undef max\n\n\t// Windows SDK defines GetFreeSpace as a constant, probably a Win16 API remnant\n\t#ifdef GetFreeSpace\n\t\t#undef GetFreeSpace\n\t#endif  // GetFreeSpace\n#else\n\t#include <sys/types.h>\n\t#include <sys/stat.h>   // for mkdir\n\t#include <sys/time.h>\n\t#include <sys/socket.h>\n\t#include <netinet/in.h>\n\t#include <arpa/inet.h>\n\t#include <netdb.h>\n\t#include <time.h>\n\t#include <dirent.h>\n\t#include <errno.h>\n\t#include <iostream>\n\n\t#include <cstdio>\n\t#include <cstring>\n\t#include <pthread.h>\n\t#include <semaphore.h>\n\t#include <errno.h>\n\t#include <fcntl.h>\n#endif\n\n\n\n\n\n// CRT stuff:\n#include <assert.h>\n#include <stdio.h>\n#include <math.h>\n#include <stdarg.h>\n\n\n\n\n\n// STL stuff:\n#include <vector>\n#include <list>\n#include <deque>\n#include <string>\n#include <map>\n#include <algorithm>\n#include <memory>\n#include <set>\n#include <queue>\n\n\n\n\n\n// Common headers (part 1, without macros):\n#include \"../../src/StringUtils.h\"\n\n\n\n\n\n// Common definitions:\n\n/** Evaluates to the number of elements in an array (compile-time!) */\n#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))\n\n/** Allows arithmetic expressions like \"32 KiB\" (but consider using parenthesis around it, \"(32 KiB)\") */\n#define KiB * 1024\n#define MiB * 1024 * 1024\n\n#define ASSERT assert\n"
  },
  {
    "path": "Tools/ToLuaDoxy/ToLuaDoxy.cpp",
    "content": "\n// ToLuaDoxy.cpp\n\n// Implements the main app entrypoint\n\n#include \"Globals.h\"\n#include <fstream>\n#include <iostream>\n\n\n\n\n\ntypedef std::vector<AString> AStrings;\n\n\n\n\n\nclass cProcessor\n{\npublic:\n\tcProcessor(const AString & a_FileOut) :\n\t\tm_Out(a_FileOut.c_str(), std::ios::out),\n\t\tm_IsInToLua(false),\n\t\tm_IsInComment(false)\n\t{\n\t}\n\n\n\tbool IsGood(void) const\n\t{\n\t\treturn !m_Out.fail();\n\t}\n\n\n\tvoid ProcessFile(const AString & a_FileIn)\n\t{\n\t\tstd::ifstream In(a_FileIn.c_str());\n\t\tif (In.fail())\n\t\t{\n\t\t\tstd::cerr << \"Cannot open input file \" << a_FileIn << \".\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\twhile (!In.eof())\n\t\t{\n\t\t\tAString Line;\n\t\t\tstd::getline(In, Line);\n\t\t\tPushLine(Line);\n\t\t}\n\t}\n\nprotected:\n\tstd::ofstream m_Out;\n\tbool          m_IsInToLua;    ///< Set to true if inside a tolua_begin .. tolua_end block\n\tbool          m_IsInComment;  ///< Set to true if previous line has started a multiline comment; only outside tolua blocks\n\tAString       m_LastComment;  ///< Accumulator for a multiline comment preceding a tolua block\n\n\n\tvoid PushLine(const AString & a_Line)\n\t{\n\t\tif (m_IsInToLua)\n\t\t{\n\t\t\t// Inside a tolua block\n\t\t\tif (TrimString(a_Line) == \"// tolua_end\")\n\t\t\t{\n\t\t\t\t// End of a tolua block\n\t\t\t\tm_IsInToLua = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tm_Out << a_Line << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tif (m_IsInComment)\n\t\t{\n\t\t\t// Inside a multiline comment block, outside of a tolua block; accumulate m_LastComment\n\t\t\tm_LastComment += a_Line + \"\\n\";\n\t\t\tm_IsInComment = (a_Line.find(\"*/\") == AString::npos);\n\t\t\treturn;\n\t\t}\n\n\t\tAString Trimmed(TrimString(a_Line));\n\n\t\tif (Trimmed == \"// tolua_begin\")\n\t\t{\n\t\t\t// Beginning of a tolua block\n\t\t\tm_IsInToLua = true;\n\t\t\tif (!m_LastComment.empty())\n\t\t\t{\n\t\t\t\tm_Out << m_LastComment << std::endl;\n\t\t\t\tm_LastComment.clear();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tsize_t CommentBegin = a_Line.find(\"/*\");\n\t\tif (CommentBegin != AString::npos)\n\t\t{\n\t\t\tm_IsInComment = (a_Line.find(\"*/\", CommentBegin) == AString::npos);\n\t\t\tm_LastComment = a_Line;\n\t\t}\n\n\t\tsize_t ExportIdx = a_Line.find(\"// tolua_export\");\n\t\tif (ExportIdx != AString::npos)\n\t\t{\n\t\t\t// Single-line tolua block\n\n\t\t\t// Strip the export comment and right-trim the line:\n\t\t\tAString Stripped(a_Line.substr(0, ExportIdx));\n\t\t\tint End = Stripped.length() - 1;\n\t\t\twhile ((End > 0) && (Stripped[End] <= 32))\n\t\t\t{\n\t\t\t\tEnd--;\n\t\t\t}\n\t\t\tStripped.erase(End + 1);\n\n\t\t\tif (!m_LastComment.empty())\n\t\t\t{\n\t\t\t\tm_Out << m_LastComment << std::endl;\n\t\t\t\tm_LastComment.clear();\n\t\t\t}\n\t\t\tm_Out << Stripped << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!m_IsInComment)\n\t\t{\n\t\t\tm_LastComment.clear();\n\t\t}\n\t}\n} ;\n\n\n\n\n\n/** Parses the specified package file into a list of $cfile-included files and all the other contents\nReturns true if successful.\nReturns false and prints error if unsuccessful\n*/\nbool ParsePackageFile(const AString & a_FileName, AStrings & a_CFiles, AStrings & a_DirectContentsLines)\n{\n\tstd::ifstream PkgFile(a_FileName.c_str());\n\tif (PkgFile.fail())\n\t{\n\t\tstd::cerr << \"Cannot open the package file \" << a_FileName << \".\" << std::endl;\n\t\treturn false;\n\t}\n\n\twhile (!PkgFile.eof())\n\t{\n\t\tAString Line;\n\t\tstd::getline(PkgFile, Line);\n\t\tLine = TrimString(Line);\n\t\tif (strncmp(Line.c_str(), \"$cfile \\\"\", 8) == 0)\n\t\t{\n\t\t\ta_CFiles.push_back(Line.substr(8, Line.length() - 9));\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_DirectContentsLines.push_back(Line);\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\n/** Processes the specified input header file into the output file */\nvoid ProcessCFile(const AString & a_CFileIn, const AString & a_CFileOut)\n{\n\tcProcessor p(a_CFileOut);\n\tif (!p.IsGood())\n\t{\n\t\tstd::cerr << \"Cannot open output file \" << a_CFileOut << \".\" << std::endl;\n\t\treturn;\n\t}\n\tp.ProcessFile(a_CFileIn);\n}\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tAString BaseDir = (argc > 1) ? argv[1] : \".\";\n\tAString OutDir  = (argc > 2) ? argv[2] : \"Out\";\n\n\t// Create the output directory:\n\t#ifdef _WIN32\n\tCreateDirectory(OutDir.c_str(), NULL);\n\t#else\n\tmkdir(OutDir.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);\n\t#endif\n\n\t// Parse the package file\n\tAStrings CFiles;\n\tAStrings DirectLines;\n\tif (!ParsePackageFile(Printf(\"%s/AllToLua.pkg\", BaseDir.c_str()), CFiles, DirectLines))\n\t{\n\t\treturn 1;\n\t}\n\n\t// Process header files:\n\tfor (AStrings::const_iterator itr = CFiles.begin(), end = CFiles.end(); itr != end; ++itr)\n\t{\n\t\tstatic int cnt = 0;\n\t\tAString In = Printf(\"%s/%s\", BaseDir.c_str(), itr->c_str());\n\t\tAString Out = Printf(\"%s/%04x.h\", OutDir.c_str(), cnt++);\n\t\tProcessCFile(In, Out);\n\t}  // for itr - CFiles[]\n\n\treturn 0;\n}\n"
  },
  {
    "path": "android/.gitignore",
    "content": "/Cuberite/\r\nServer"
  },
  {
    "path": "android/CMakeLists.txt",
    "content": "cmake_minimum_required (VERSION 3.12.4)\nproject(Cuberite)\n\n# Set up Android parameters\nset(ANDROID TRUE)\nset(CMAKE_POSITION_INDEPENDENT_CODE TRUE)\n\n# We're crosscompiling for Android\nset(NO_NATIVE_OPTIMIZATION TRUE)\n\n# Build the rest of the server\nadd_subdirectory(../ Cuberite)\n\n# Strip debug symbols to reduce binary size\nset_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE -s)\n"
  },
  {
    "path": "android/compile.sh",
    "content": "#!/bin/bash\n\nset -e\n\n# This script cross-compiles cuberite for the android platform. It uses\n# the following enviroment variables\n#   CMAKE: Should be the path to a cmake executable of version 3.12.4+\n#   NDK: Should be the path to the android ndk root\n#   (optional) TYPE: either Release or Debug, sets the build type\n#   (optional) THREADS: The number of threads to use, default 4\n\nfunction usage() {\n\techo \"Usage: NDK=<path-to-ndk> CMAKE=<cmake-binary> $0 (clean|<ABI>)\";\n\texit 1\n}\n\nBASEDIR=\"$(realpath $(dirname $0))\"\nBUILDDIR=\"$BASEDIR/../android-build\"\nSELF=\"./$(basename $0)\"\n\n# Clean doesn't need CMAKE and NDK, so it's handled here\nif [ \"$1\" == \"clean\" ]; then\n\trm -rf $BUILDDIR\n\texit 0\nfi\n\nif [ -z \"$CMAKE\" -o -z \"$NDK\" ]; then\n\tusage;\nfi\n\n# CMake wants absolute path\nCMAKE=\"$(realpath $CMAKE)\"\nNDK=\"$(realpath $NDK)\"\n\nif [ -z \"$TYPE\" ]; then\n\tTYPE=\"Release\"\nfi\n\nif [ -z \"$THREADS\" ]; then\n\tTHREADS=\"4\"\nfi\n\ncd \"$BASEDIR\"\n\ncase \"$1\" in\n\n\tarmeabi-v7a)\n\t\tAPILEVEL=16\n\t;;\n\n\tarm64-v8a)\n\t\tAPILEVEL=21\n\t;;\n\n\tx86)\n\t\tAPILEVEL=16\n\t;;\n\n\tx86_64)\n\t\tAPILEVEL=21\n\t;;\n\n\tall)\n\t\techo \"Packing server.zip ...\"\n\t\trm -rf Server\n\t\tmkdir -p Server\n\n\t\tfor arch in armeabi-v7a arm64-v8a x86 x86_64; do\n\t\t\techo \"Doing ... $arch ...\" && \\\n\t\t\tcd $BASEDIR && \\\n\t\t\t\"$SELF\" clean && \\\n\t\t\t\"$SELF\" \"$arch\" && \\\n\t\t\tcd $BUILDDIR/Server && \\\n\t\t\tzip $BASEDIR/Server/\"$arch\".zip Cuberite\n\t\tdone\n\n\t\techo \"Packing server.zip ...\"\n\t\tcd $BUILDDIR/Server\n\t\tzip -r $BASEDIR/Server/server.zip -@ -x Cuberite < Install/UnixExecutables.list\n\n\t\tcd $BASEDIR/Server\n\t\tfor file in server.zip armeabi-v7a.zip arm64-v8a.zip x86.zip x86_64.zip; do\n\t\t\techo \"Generating sha1 sum for ... $file ...\" && \\\n\t\t\tsha1sum \"$file\" > \"$file\".sha1\n\t\tdone\n\n\t\techo \"Done! The built zip files await you in the Server/ directory\"\n\t\texit;\n\t;;\n\n\t*)\n\t\tusage;\n\t;;\nesac\n\nmkdir -p \"$BUILDDIR\"\ncd \"$BUILDDIR\"\n\"$CMAKE\" \"$BASEDIR/../android\" -DCMAKE_TOOLCHAIN_FILE=\"$NDK/build/cmake/android.toolchain.cmake\" \\\n    -DANDROID_ABI=\"$1\" \\\n    -DANDROID_NATIVE_API_LEVEL=\"$APILEVEL\" \\\n    -DCMAKE_BUILD_TYPE=\"$TYPE\" \\\n\t-DWHOLE_PROGRAM_OPTIMISATION=No\n\nmake -j \"$THREADS\"\n"
  },
  {
    "path": "app.yml",
    "content": "name: Cuberite\nimage: ubuntu-15-04-x64\nconfig:\n  #cloud-config\n  packages:\n    - git\n  runcmd:\n    - cd /tmp && git clone https://github.com/cuberite/cuberite-ocean.git\n    - cd /tmp/cuberite-ocean && ./initialinstall.sh\n"
  },
  {
    "path": "appveyor.yml",
    "content": "version: 1.0.{build}\nclone_depth: 50\n\nimage:\n- Visual Studio 2022\n\nbranches:\n  only:\n    - master\n\n# Set up environment variables for build info\nenvironment:\n  CUBERITE_BUILD_SERIES_NAME: AppVeyor\n  CUBERITE_BUILD_ID: \"%APPVEYOR_BUILD_NUMBER%\"\n  CUBERITE_BUILD_DATETIME: \"%APPVEYOR_REPO_COMMIT_TIMESTAMP%\"\n\n  matrix:\n  - job_name: Windows-x64-Debug\n    configuration: Debug\n    BUILD_DIR: Debug x64\n\n  - job_name: Windows-x86\n    configuration: Release\n    BUILD_DIR: Release x86\n\n  - job_name: Windows-x64\n    configuration: Release\n    BUILD_DIR: Release x64\nbuild:\n  project: '%BUILD_DIR%\\Cuberite.sln'\n  parallel: true\n  verbosity: minimal\n\npull_requests:\n  do_not_increment_build_number: true\n\ninstall:\n- git submodule update --init\n- if not exist \"%BUILD_DIR%\" mkdir \"%BUILD_DIR%\"\n- cd \"%BUILD_DIR%\"\n\nfor:\n##############################\n# Windows 64-bit debug build #\n##############################\n-\n  matrix:\n    only:\n      - job_name: Windows-x64-Debug\n\n  before_build:\n  # TODO: re-add -DSELF_TEST=YES -DBUILD_TOOLS=YES once PCH for tools enabled (too slow otherwise)\n  - cmake -G \"Visual Studio 17 2022\" -DSELF_TEST=No -DBUILD_TOOLS=No ..\n\n################################\n# Windows 32-bit release build #\n################################\n-\n  matrix:\n    only:\n      - job_name: Windows-x86\n\n  before_build:\n  - cmake -G \"Visual Studio 17 2022\" -A \"Win32\" ..\n\n################################\n# Windows 64-bit release build #\n################################\n-\n  matrix:\n    only:\n      - job_name: Windows-x64\n\n  before_build:\n  - cmake -G \"Visual Studio 17 2022\" -A \"x64\" ..\n\n###########################################\n# Cache for speeding up subsequent builds #\n###########################################\ncache:\n  - '%BUILD_DIR%\\CMakeCache.txt'\n\n#####################\n# Package artifacts #\n#####################\nafter_build:\n- cd Server\n- Install\\PackWindowsExecutables.cmd\n"
  },
  {
    "path": "cibuild.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nexport CUBERITE_BUILD_SERIES_NAME=\"CI $CC $CI_CUBERITE_BUILD_TYPE\"\nexport CUBERITE_BUILD_ID=$CI_JOB_NUMBER\nexport CUBERITE_BUILD_DATETIME=`date`\n\n# Use ccache if available\nif [ `which ccache` ]; then\n\t# Re-run compile on pre-processed sources on cache miss\n\t# \"It's slower actually, but clang builds fail without it.\"\n\texport CCACHE_CPP2=true\n\n\t# Tell CMake of ccache's existence\n\tCACHE_ARGS=\"-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache\"\n\n\techo \"Using ccache installed at $(which ccache)\"\n\tccache --max-size=1G\n\tccache --zero-stats\nfi\n\nworkdir=\"$CC\"_\"$CI_CUBERITE_BUILD_TYPE\"\nmkdir \"$workdir\"\ncd \"$workdir\"\n\n# Work around a Clang + ccache issue with failing builds by disabling\n# precompiled headers. Turn off LTO for faster build speeds\ncmake .. -DCMAKE_BUILD_TYPE=${CI_CUBERITE_BUILD_TYPE} \\\n        -DBUILD_TOOLS=Yes \\\n        -DPRECOMPILE_HEADERS=No \\\n        -DSELF_TEST=Yes \\\n        -DUNITY_BUILDS=${CI_CUBERITE_UNITY_BUILDS-Yes} \\\n        -DWHOLE_PROGRAM_OPTIMISATION=No \\\n        ${CACHE_ARGS};\n\necho \"Building...\"\ncmake --build . --parallel 3;\n\nif [ `which ccache` ]; then\n\techo \"Built with ccache, outputting cache stats...\"\n\tccache --show-stats --verbose\nfi\n\necho \"Testing...\"\nctest --output-on-failure --parallel 2;\n\ncd Server/;\ntouch apiCheckFailed.flag\nif [ \"$CI_CUBERITE_BUILD_TYPE\" != \"COVERAGE\" ]; then\n\t./Cuberite <<- EOF\n\t\tload APIDump\n\t\tapi\n\t\tapicheck\n\t\trestart\n\t\tstop\n\tEOF\n\tif [ -f ./NewlyUndocumented.lua ]; then\n\t\techo \"ERROR: Newly undocumented API symbols found:\"\n\t\tcat ./NewlyUndocumented.lua\n\t\texit 1\n\tfi\n\tif [ -f ./DuplicateDocs.txt ]; then\n\t\techo \"ERROR: API documentation has duplicate symbol warnings:\"\n\t\tcat ./DuplicateDocs.txt\n\t\texit 1\n\tfi\n\tif [ -f ./apiCheckFailed.flag ]; then\n\t\techo \"ERROR: API check has failed with an unknown error\"\n\t\texit 1\n\tfi\nfi\n"
  },
  {
    "path": "clang-tidy.sh",
    "content": "#!/bin/sh\n\nset -e\n\nLOCALSTRING=\"local\"\n\nif [ \"$3\" = \"$LOCALSTRING\" ]; then\n  REGEX=\"/cuberite/src/\\.?[^\\.]\"\nelse\n  REGEX=\"cuberite_[^/\\.]+/src/\\.?[^\\.]\"\nfi\n\nFIXES_FILE=\"tidy-fixes.yaml\"\nARGS=\"-header-filter $REGEX -quiet -export-fixes $FIXES_FILE $* $REGEX\"\n\n# Generate the compilation database\nmkdir -p tidy-build\ncd tidy-build\n\n# Disable precompiled headers since they aren't generated during linting which causes an error\n# Disable unity builds since clang-tidy needs the full list of compiled files to check each one\ncmake --target Cuberite -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes -DPRECOMPILE_HEADERS=No -DUNITY_BUILDS=No ..\n\n# Ensure LuaState_Typedefs.inc has been generated\n(cd ../src/Bindings && lua BindingsProcessor.lua)\n\nif run-clang-tidy $ARGS; then\n\techo \"clang-tidy: No violations found\"\nelse\n\techo \"clang-tidy: Found violations\"\n\texit 1\nfi\n"
  },
  {
    "path": "cloc-exclude.txt",
    "content": "lib\nTools\nTests\nsrc/Bindings/docs\nsrc/Bindings/Bindings.cpp\nsrc/Bindings/Bindings.h\ndoxy\ndev-docs\nServer\nInstall\nbuild\n"
  },
  {
    "path": "compile.sh",
    "content": "#!/bin/sh\n#|| goto :windows_detected\n{ # put the whole thing in a block so as not to behave weirdly if interrupted\nset -e\n\n# Global variables:\n# CHOICE_BUILDTYPE  - Either \"Release\" or \"Debug\".\n# CHOICE_THREADS    - A numerical value, the amount of threads to be used for the make command.\n# CHOICE_BRANCH     - The branch to use. Currently locked on \"master\".\n# STATE_INTERACTIVE - 1 If we're running interactively. 0 otherwise.\n# STATE_NEW         - Whether this is the first run. If 1, then no GIT repo exists yet. 0 otherwise.\n\n# Constants:\nDEFAULT_BUILDTYPE=\"Release\" # Other options: \"Debug\"\nDEFAULT_BRANCH=\"master\"     # Other options: None currently\nDEFAULT_THREADS=1\n\n# Constants not modifiable through command line:\nUPSTREAM_REPO=\"origin\"\nUPSTREAM_LINK=\"https://github.com/cuberite/cuberite.git\"\n\n#=================== Error functions ===================\n\n\nerrorCompile ()\n{\n\techo\n\techoInt \"-----------------\"\n\techo \"Compilation failed. Failed command:\"\n\techo \"$@\"\n\texit 1\n}\n\nerrorGit ()\n{\n\techo\n\techoInt \"-----------------\"\n\techo \"Code fetch failed. (Check your network connection). Failed command:\"\n\techo \"$@\"\n\texit 2\n}\n\nerrorDependencies ()\n{\n\t# The error messages are complex and OS-dependant, and are printed in the dependencies section before this is called.\n\texit 3\n}\n\nerrorArguments ()\n{\n\techo \"Usage: ./compile.sh [options]\"\n\techo \"Compiles Cuberite. Updates the GIT repository if needed, and downloads it if it does not exist.\"\n\techo \"Runs interactively, unless one or more options are specified.\"\n\techo\n\techo \"options:\"\n\techo \"  -m  The compilation mode. Either \\\"Release\\\" or \\\"Debug\\\". Defaults to \\\"$DEFAULT_BUILDTYPE\\\"\"\n\techo '  -t  The number of threads to use for compiling'\n\techo \"      If unspecified, a default of $DEFAULT_THREADS threads is used. The special value AUTO attempts to set the number of\"\n\techo '      compilation threads equal to the number of CPU threads.'\n\techo '  -b  The branch to compile. (Currently unused and pinned to MASTER)'\n\techo '  -n yes: Prevent interactive mode. Unnecessary in combination with other arguments.'\n\techo '          Use without any other argument to build with the default settings.'\n\techo '  -d yes: Dry run. Print the chosen settings and exit'\n\techo\n\techo \"Usage examples:\"\n\techo \"  ./compile.sh\"\n\techo \"  ./compile.sh -m Debug\"\n\techo \"  ./compile.sh -m Release -t 2\"\n\techo\n\techo \"Return codes: (non 0 returns are accompanied by useful stderr info)\"\n\techo \"0 - Success              - Success! Code was updated and compiled\"\n\techo \"1 - Compilation failed   - cmake, make, or source code issue\"\n\techo \"2 - Code fetch failed    - Network issue or, far more rarely, a git issue\"\n\techo \"3 - Dependencies missing - Some compilation tools are missing\"\n\techo \"4 - Bad arguments        - Bad commandline arguments were passed\"\n\techo \"5 - Bad user input       - Invalid user input in interactive mode\"\n\techo \"6 - other                - An error not listed above\"\n\texit 4\n}\n\nerrorInput ()\n{\n\techo\n\techoInt \"-----------------\"\n\techo \"Unrecognized user input\"\n\techo \"$@\"\n\texit 5\n}\n\nerrorOther ()\n{\n\techo\n\techoInt \"-----------------\"\n\techo \"$@\"\n\texit 6\n}\n\n\n#=================== Echo functions ===================\n\n\nechoInt () # echo only if interactive mode.\n{\n\tif [ $STATE_INTERACTIVE -eq 1 ]; then\n\t\techo \"$1\"\n\tfi\n}\n\nechoErr () # Echo to stderr.\n{\n\techo \"$1\" 1>&2\n}\n\n\n#=================== Commandline Parsing ===================\n\n\nSTATE_INTERACTIVE=1 # Interactive, unless one or more command line options are passed.\nwhile getopts \":m:t:b:d:n:\" name; do\n\tvalue=$OPTARG\n\tSTATE_INTERACTIVE=0\n\tcase \"$name\" in\n\tm)\n\t\tif [ ! -z \"$CHOICE_BUILDTYPE\" ]; then errorArguments; fi # Argument duplication.\n\t\tif [ \"$value\" = \"Debug\" ] || [ \"$value\" = \"Release\" ]; then\n\t\t\tCHOICE_BUILDTYPE=\"$value\"\n\t\telse\n\t\t\terrorArguments\n\t\tfi\n\t;;\n\tt)\n\t\tif [ ! -z \"$CHOICE_THREADS\" ]; then errorArguments; fi # Argument duplication.\n\t\tif [ \"$value\" -gt 0 ] 2>/dev/null || [ \"$value\" = \"AUTO\" ]; then # If a positive integer or the special value \"AUTO\".\n\t\t\tCHOICE_THREADS=\"$value\"\n\t\telse\n\t\t\terrorArguments\n\t\tfi\n\t;;\n\tb)\n\t\tif [ ! -z \"$CHOICE_BRANCH\" ]; then errorArguments; fi # Argument duplication.\n\t\tCHOICE_BRANCH=1 # Only used for dupe checking, overridden below.\n\t\techoErr \"Warning: The -b option is currently unused, it was ignored\"\n\t;;\n\td)\n\t\tif [ ! -z \"$DRY_RUN\" ]; then errorArguments; fi # Argument duplication.\n\t\tDRY_RUN=\"yes\"\n\t;;\n\tn)\n\t\tif [ \"$dummy\" = \"1\" ]; then errorArguments; fi # Argument duplication.\n\t\tdummy=1 # we just want to disable interactive mode, passing an argument already did this. No need to do anything.\n\t;;\n\t*)\n\t\terrorArguments\n\t;;\n\tesac\ndone\n\nif [ -z \"$DRY_RUN\" ]; then DRY_RUN=\"no\"; fi\n\n#=================== Dependency checks and greeting ===================\n\n\n# Do we already have a repo?\ncheckCuberiteDir ()\n{\n\t[ -d .git ] && [ -f easyinstall.sh ] && [ -f src/BlockArea.cpp ] # A good enough indicator that we're in the Cuberite git repo.\n}\n\nSTATE_NEW=1\nif checkCuberiteDir; then # Check if we're in the Cuberite directory...\n\tSTATE_NEW=0\nelif [ -d cuberite ]; then # If there's a directory named \"cuberite\"...\n\tcd cuberite\n\tif checkCuberiteDir; then # Check if we're in the Cuberite directory...\n\t\tSTATE_NEW=0\n\telse\n\t\terrorOther \"A directory is named 'cuberite' which has no Cuberite assets exists. Please run the script elsewhere or move/delete that directory.\"\n\tfi\n\nfi\n\nif [ $STATE_NEW -eq 0 ]; then\n\techoInt \"Cuberite repository detected. This should make the process faster, especially if you compiled before.\"\nfi\n\n# Echo: Greetings.\nechoInt \"\n\nHello, this script will download and compile Cuberite.\nOn subsequent runs, it will update Cuberite.\nThe compilation and download will occur in the current directory.\nIf you're updating, you should run: <Path to Cuberite>/compile.sh\nCompiling from source takes time, but it usually generates faster\nexecutables. If you prefer ready-to-use binaries or if you want\nmore info, please visit:  https://cuberite.org/\"\n\ndoDependencyCheck()\n{\n\tMISSING_PACKAGES=\"\"\n\n\t# Most distros have the following default compiler names.\n\tGCC_EXE_NAME=\"g++\"\n\tCLANG_EXE_NAME=\"clang\"\n\tCOMPILER_PACKAGE_NAME=\"gcc g++\"\n\n\t# Most distros have the following package and executable names.\n\t# Left side: Executable Name, Right side: Package Name. Note that this is SPACE delimited now, unlike in the past.\n\tPROGRAMS='git git\n\tmake make\n\tcmake cmake'\n\n\t# If any OS deviates from the defaults, we detect the OS here, and change PROGRAMS, COMPILER_PACKAGE_NAME, etc. as needed.\n\n\t# Fedora, CentOS, RHEL, Mageia, openSUSE, Mandriva.\n\tif (rpm --help > /dev/null 2> /dev/null); then\n\t\tCOMPILER_PACKAGE_NAME=\"gcc-c++\"\n\tfi\n\n\t# Make sure at least one compiler exists.\n\tGCC_EXISTS=0\n\tCLANG_EXISTS=0\n\t$GCC_EXE_NAME --help > /dev/null 2> /dev/null && GCC_EXISTS=1\n\t$CLANG_EXE_NAME --help > /dev/null 2> /dev/null && CLANG_EXISTS=1\n\tif [ \"$GCC_EXISTS\" -eq 0 ] && [ \"$CLANG_EXISTS\" -eq 0 ]; then\n\t\tMISSING_PACKAGES=\" $COMPILER_PACKAGE_NAME\"\n\tfi\n\n\t# Depdendency check.\n\tcheckPackages ()\n\t{\n\t\techo \"$PROGRAMS\" | while read line; do\n\t\t\tEXE_NAME=`echo \"$line\" | cut -f 1 -d \" \"`\n\t\t\tPACKAGE_NAME=`echo \"$line\" | cut -f 2 -d \" \"`\n\t\t\tcommand -v $EXE_NAME > /dev/null 2> /dev/null || printf %s \" $PACKAGE_NAME\"\n\t\tdone\n\t}\n\tMISSING_PACKAGES=\"$MISSING_PACKAGES`checkPackages`\"\n\tmissingDepsExit ()\n\t{\n\t\tif [ \"$1\" != \"\" ]; then\n\t\t\techoErr \"You can install the missing depndencies via:\"\n\t\t\techoErr \"$1\"\n\t\tfi\n\t\techoErr\n\t\techoErr \"Please install the dependencies, then come back.\"\n\t\techoErr\n\t\terrorDependencies\n\t}\n\n\tif [ \"$MISSING_PACKAGES\" != \"\" ]; then\n\t\techoInt\n\t\techoInt \"-----------------\"\n\t\techoErr \"You have missing compilation dependencies:\"\n\t\techoErr $MISSING_PACKAGES\n\t\techoErr\n\n\t\t# apt-get guide.\n\t\tapt-get --help > /dev/null 2> /dev/null && \\\n\t\tmissingDepsExit \"apt-get install$MISSING_PACKAGES\"\n\n\t\t# dnf guide.\n\t\tdnf --help > /dev/null 2> /dev/null && \\\n\t\tmissingDepsExit \"dnf install$MISSING_PACKAGES\"\n\n\t\t# zypper guide.\n\t\tzypper --help > /dev/null 2> /dev/null && \\\n\t\tmissingDepsExit \"zypper install$MISSING_PACKAGES\"\n\n\t\t# pacman guide.\n\t\tpacman --help > /dev/null 2> /dev/null && \\\n\t\tmissingDepsExit \"pacman -S$MISSING_PACKAGES\"\n\n\t\t# urpmi guide.\n\t\turpmi --help > /dev/null 2> /dev/null && \\\n\t\tmissingDepsExit \"urpmi$MISSING_PACKAGES\"\n\n\t\tmissingDepsExit \"\"\n\tfi\n}\ndoDependencyCheck\n\n\n#=================== Choice: Branch (Currently unused and simply skipped) ===================\n\n\n# Bypass Branch choice and choose master. Because it's the only branch right now.\nCHOICE_BRANCH=$DEFAULT_BRANCH\n\n### Inactive code start. ###\ninactiveCode ()\n{\n\necho \"\nYou can choose between 3 branches:\n* (S)Stable:   Choose the stable branch if you want the most\n               reliable server.\n\n* (T)Testing:  The testing branch is less stable,\n               but using it and reporting bugs helps us a lot!\n\n* (D)Dev:      The least stable of the three. (Master branch)\n               Choose the development branch if you want to try new,\n               bleeding-edge features.\n\"\n\n\nprintf %s \"Choose the branch (s/t/d): \"\nread CHOICE_BRANCH\ncase $CHOICE_BRANCH in\n\ts|S)\n\t\terrorOther \"We don't have a stable branch yet, please use testing, sorry.\"\n\t\t;;\n\tt|T)\n\t\tCHOICE_BRANCH=\"testing\"\n\t\t;;\n\td|D)\n\t\tCHOICE_BRANCH=\"master\"\n\t\t;;\n\t*)\n\t\terrorInput\n\t\t;;\nesac\n\n}\n### Inactive code end. ###\n\n\n#=================== Choice: Compile mode ===================\n\n\nif [ $STATE_INTERACTIVE -eq 1 ]; then\n\techo \"\n\tChoose compile mode:\n\t* (R)Release: Compiles normally.\n\t\t      Generates the fastest build.\n\n\t* (D)Debug:   Compiles in debug mode.\n\t\t      Makes your console and crashes more verbose.\n\t\t      A bit slower than Release mode. If you plan to help\n\t\t      development by reporting bugs, this is preferred.\n\n\t\"\n\n\tprintf %s \"Choose compile mode: (r/d) (Default: \\\"$DEFAULT_BUILDTYPE\\\"): \"\n\tread CHOICE_BUILDTYPE\n\tcase $CHOICE_BUILDTYPE in\n\t\td|D)\n\t\t\tCHOICE_BUILDTYPE=\"Debug\"\n\t\t\t;;\n\t\tr|N)\n\t\t\tCHOICE_BUILDTYPE=\"Release\"\n\t\t\t;;\n\tesac\nfi\n\nif [ -z \"$CHOICE_BUILDTYPE\" ]; then # No buildtype specified.\n\tCHOICE_BUILDTYPE=\"$DEFAULT_BUILDTYPE\"\nfi\n\n\n#=================== Choice: Thread amount ===================\n\n\n\nnumberOfThreads()\n{\n\tKERNEL=`uname -s`\n\n\tif [ \"$KERNEL\" = \"Linux\" ] || [ \"$KERNEL\" = \"Darwin\" ]; then\n\t\techo `getconf _NPROCESSORS_ONLN`\n\telif [ \"$KERNEL\" = \"FreeBSD\" ]; then\n\t\techo `getconf NPROCESSORS_ONLN`\n\telse\n\t\techo \"unknown\"\n\tfi\n}\n\nCPU_THREAD_COUNT=`numberOfThreads`\n\nif [ $STATE_INTERACTIVE -eq 1 ]; then\n\techo \"\"\n\techo \"Choose the number of compilation threads.\"\n\n\tif [ \"$CPU_THREAD_COUNT\" = \"unknown\" ]; then\n\t\techo \"Could not detect the number of CPU threads.\"\n\telif [ \"$CPU_THREAD_COUNT\" -eq 1 ]; then\n\t\techo \"You have 1 thread.\"\n\telse\n\t\techo \"You have $CPU_THREAD_COUNT CPU threads.\"\n\tfi\n\n\techo \"If you have enough RAM, it is wise to choose your CPU's thread count. \"\n\techo \"Otherwise choose lower. Old Raspberry Pis should choose 1. If in doubt, choose 1.\"\n\tprintf %s \"Please enter the number of compilation threads to use (Default: $DEFAULT_THREADS): \"\n\tread CHOICE_THREADS\nfi\n\nif [ -z \"$CHOICE_THREADS\" ] 2> /dev/null; then\n\tCHOICE_THREADS=\"$DEFAULT_THREADS\"\nelif [ \"$CHOICE_THREADS\" = \"AUTO\" ] 2> /dev/null; then\n\tif [ $CPU_THREAD_COUNT = \"unknown\" ]; then\n\t\tCHOICE_THREADS=\"$DEFAULT_THREADS\"\n\t\techo \"WARNING: could not detect number of threads. Using the default ($DEFAULT_THREADS) .\" >&2\n\telse\n\t\tCHOICE_THREADS=\"$CPU_THREAD_COUNT\"\n\tfi\nelif [ \"$CHOICE_THREADS\" -lt 0 ] 2> /dev/null; then\n\terrorInput\nfi\n\n#=================== Print settings summary  ===================\n\n\nif [ \"$STATE_NEW\" = 1 ]; then\n\tpreviousCompilation=\"Not detected. We are assuming this is the first compile.sh run.\"\nelse\n\tpreviousCompilation=\"Detected. This should make fetching and compiling faster.\"\nfi\n\nTHREAD_WARNING=\"\"\nif [ \"$CPU_THREAD_COUNT\" != \"unknown\" ] && [ \"$CPU_THREAD_COUNT\" -lt \"$CHOICE_THREADS\" ]; then\n\tTHREAD_WARNING=\" - Warning: More threads assigned than there are CPU threads.\"\nfi\n\necho \"\"\nechoInt \"#### Settings Summary ####\"\necho \"Build Type:           \" \"$CHOICE_BUILDTYPE\"\necho \"Branch:               \" \"$CHOICE_BRANCH\" \"(Currently the only choice)\"\necho \"Compilation threads:  \" \"$CHOICE_THREADS$THREAD_WARNING\"\necho \"CPU Threads:          \" \"$CPU_THREAD_COUNT\"\necho \"Previous compilation: \" \"$previousCompilation\"\necho \"Upstream Link:        \" \"$UPSTREAM_LINK\"\necho \"Upstream Repo:        \" \"$UPSTREAM_REPO\"\n\nif [ \"$DRY_RUN\" = \"yes\" ]; then\n\techo \"This is a dry run. Exiting now.\"\n\texit 0;\nfi\n\n# Ask the user's permission to connect to the net.\nif [ $STATE_INTERACTIVE -eq 1 ]; then\n\techo\n\techo \"After pressing ENTER, the script will connect to $UPSTREAM_LINK\"\n\techo \"to check for updates and/or fetch code. It will then compile your program.\"\n\techo \"If you compiled before, make sure you're in the proper directory and that \\\"Previous compilation\\\" is detected.\"\n\tprintf $s \"Press ENTER to continue... \"\n\tread dummy\nfi\n\n\n#=================== Code download / update via git ===================\n\n\nechoInt\nechoInt \" --- Downloading Cuberite's source code from the $CHOICE_BRANCH branch...\"\n\n\nif [ $STATE_NEW -eq 1 ]; then\n\t# Git: Clone.\n\techo \" --- Looks like your first run, cloning the whole code...\"\n\tgit clone  --depth 1 \"$UPSTREAM_LINK\" -b \"$CHOICE_BRANCH\" || errorGit \"git clone  --depth 1 $UPSTREAM_LINK -b $CHOICE_BRANCH\"\n\tcd cuberite\nelse\n\t# Git: Fetch.\n\techo \" --- Updating the $CHOICE_BRANCH branch...\"\n\tgit fetch \"$UPSTREAM_REPO\" \"$CHOICE_BRANCH\" || errorGit \"git fetch $UPSTREAM_REPO $CHOICE_BRANCH\"\n\tgit checkout \"$CHOICE_BRANCH\" || errorGit \"git checkout $CHOICE_BRANCH\"\n\tgit merge \"$UPSTREAM_REPO\"/\"$CHOICE_BRANCH\" || errorGit \"git merge $UPSTREAM_REPO/$CHOICE_BRANCH\"\nfi\n\n# Git: Submodules.\necho \" --- Updating submodules...\"\ngit submodule sync\ngit submodule update --init\n\n\n#=================== Compilation via cmake and make ===================\n\n\n# Cmake.\necho \" --- Running cmake...\"\nif [ ! -d build-cuberite ]; then mkdir build-cuberite; fi\ncd build-cuberite\ncmake .. -DCMAKE_BUILD_TYPE=\"$CHOICE_BUILDTYPE\" || errorCompile \"cmake .. -DCMAKE_BUILD_TYPE=$CHOICE_BUILDTYPE\"\n\n\n# Make.\necho \" --- Compiling...\"\nmake -j \"$CHOICE_THREADS\" || errorCompile \"make -j $CHOICE_THREADS\"\necho\n\n\n#=================== Print success message ===================\n\n\ncd Server\necho\necho \"-----------------\"\necho \"Compilation done!\"\necho\necho \"Cuberite awaits you at:\"\necho \"$PWD/Cuberite\"\n\ncd ../..\necho \"\nYou can always update Cuberite by executing:\n$PWD/compile.sh\n\nEnjoy :)\"\nexit 0\n\n\n#=================== Windows fallback ===================\n\n\n# Called via hack in line 2.\n:windows_detected\n@echo off\ncls\necho This script is not available for Windows yet, sorry.\necho You can still download the Windows binaries from: https://cuberite.org/\necho You can also manually compile for Windows. See: https://github.com/cuberite/cuberite\nrem windows_exit\ngoto :EOF\n}\n"
  },
  {
    "path": "dev-docs/.gitignore",
    "content": "# PNG file with no filename is created by the GraphViz's GVEdit when displaying .gv files\n.png\n\n# The PNG files generated from their .gv sources by GraphViz:\nAPI class inheritance - blockentities.png\nAPI class inheritance - entities.png\nSocketThreads states.png\n"
  },
  {
    "path": "dev-docs/API class inheritance - blockentities.gv",
    "content": "digraph\n{\nrankdir=LR\n\ncBlockEntity -> cBlockEntityWithItems\ncBlockEntity -> cJukeboxEntity\ncBlockEntity -> cNoteEntity\ncBlockEntity -> cSignEntity\ncBlockEntityWithItems -> cChestEntity\ncBlockEntityWithItems -> cDropSpenserEntity\ncBlockEntityWithItems -> cFurnaceEntity\ncBlockEntityWithItems -> cHopperEntity\ncDropSpenserEntity -> cDropperEntity\ncDropSpenserEntity -> cDispenserEntity\n}"
  },
  {
    "path": "dev-docs/API class inheritance - entities.gv",
    "content": "digraph\n{\nrankdir=LR\n\n# Entities:\ncEntity -> cFallingBlock\ncEntity -> cMinecart\ncEntity -> cPawn\ncEntity -> cPickup\ncEntity -> cTNT\ncMinecart -> cEmptyMinecart\ncMinecart -> cMinecartWithChest\ncMinecart -> cMinecartWithFurnace\n\n# Mobs:\ncPawn -> cMonster\ncMonster -> cAggressiveMonster\ncMonster -> cPassiveMonster\ncAggressiveMonster -> cPassiveAggressiveMonster\ncPassiveMonster -> cBat\ncAggressiveMonster -> cBlaze\ncAggressiveMonster -> cCaveSpider\ncPassiveMonster -> cChicken\ncPassiveMonster -> cCow\ncAggressiveMonster -> cCreeper\ncPassiveAggressiveMonster -> cEnderman\ncAggressiveMonster -> cGhast\ncAggressiveMonster -> cMagmaCube\ncPassiveMonster -> cMooshroom\ncPassiveMonster -> cOcelot\ncPassiveMonster -> cPig\ncPassiveMonster -> cSheep\ncAggressiveMonster -> cSilverfish\ncAggressiveMonster -> cSkeleton\ncAggressiveMonster -> cSlime\ncAggressiveMonster -> cSpider\ncPassiveMonster -> cSquid\ncPassiveMonster -> cVillager\ncAggressiveMonster -> cWitch\ncPassiveAggressiveMonster -> cWolf\ncAggressiveMonster -> cZombie\ncPassiveAggressiveMonster -> cZombiePigman\ncPawn -> cPlayer\n}"
  },
  {
    "path": "dev-docs/Cubeset file format.html",
    "content": "<html>\n<head>\n<title>Cubeset file format</title>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n</head>\n<body>\n<div id=\"content\">\n<h2>Contents</h2>\n<ul>\n<li><a href=\"#abstract\">Abstract - what and why</a></li>\n<li><a href=\"#details\">Detailed description of the format</a>\n<ul>\n<li><a href=\"#csmeta\">Cubeset metadata</a></li>\n<li><a href=\"#piece\">Individual piece</a></li>\n<li><a href=\"#piecemeta\">Piece metadata</a></li>\n</ul>\n</li>\n<li><a href=\"#example\">Example</a></li>\n</ul>\n<hr>\n<a name=\"abstract\"><h2>Abstract - what and why</h2></a>\n<p>We're seeing an increased need to store \"prefabs\" - little areas with predefined block contents, such as village houses or fortress rooms - in collections. We have one collection of village houses for the plains village, one collection for the desert village, one collection for the nether fortress... And there are plans in the future to use even more collections - trees, overworld fortresses, more village types and even custom structures. The point that they have in common is that they need to store not only the prefabs, but also metadata for those prefabs - how often they generate, how they connect together. There's even need for metadata for the entire collection, such as what the accepted biomes are, what block should village roads use, and various other generator parameters. So we need a file format that could store all this information together.</p>\n<p>There are some existing formats available to consider first:\n<ul>\n<li><a href=\"https://minecraft.wiki/w/Schematic_file_format\"><b>schematic</b></a> - file format native to MCEdit / Bukkit / WorldEdit communities. Can store the prefab, the block entities and regular entities, and any metadata. Cannot store multiple prefabs. No effort to read or write, there's already code to do that (except for the entities) in the server.</li>\n<li><a href=\"https://dev.bukkit.org/projects/terrain-control\"><b>bob / bo2 / bo3</b></a> - file format created for prefabs in the Terrain Control mod. Can store the prefab and any metadata. Support for block entities and regular entities is unknown. Cannot store multiple prefabs. Medium difficulty for reading and writing, would need new parser and serializer. Unknown (but assumed true) whether the format truly supports any metadata.</li>\n<li><a href=\"https://github.com/cuberite/cuberite/tree/master/src/Generating/Prefabs\"><b>cpp</b></a> - export from our Gallery server directly into C++ source files. Can store the prefab and any metadata, block entities and regular entities currently not implemented but could be added. Very difficult for reading, writing already implemented. Only usable when compiling directly into the server. Can store multiple prefabs and metadata for the entire set.</li>\n</ul>\nObviously none of these fully satisfy our needs, so we'll need to either extend one of them or create yet another one. Extending the .schematic file would mean that the exporter plugin would need to change most of the export code, which was deemed too unmaintainable. Because the bob format is not implemented at all, it wasn't even considered. The cpp format would have been a great candidate if it weren't so difficult to parse. However, it sparked an idea - something similar in form to the cpp format, but easily parsed. Since we already have the Lua interpreter, why not base the new format in Lua?</p>\n<p>\nWith Lua, we could store any metadata for the prefabs, any additional information related to the entire set of prefabs. There's nothing stopping us from adding more items in a backward- and forward-compatible way. The prefabs can be stored very similar to the cpp format, an array of strings plus a charmap, or they can be stored externally in individual .schematic files and the Lua file would provide just the metadata. The server has already vast amounts of Lua-related support code that can be used for accessing the data. In the end this became the chosen solution. The format has been named \"Cubeset\" - a set of cube-based prefabs.</p>\n\n<hr/>\n\n<a name=\"details\"><h2>Detailed description of the format</h2></a>\n<p>\nThe Cubeset file has a .cubeset extension. Internally it is a Lua source file that provides a global value, Cubeset, which is a table containing the structured data. The loader checks the file's first 8 KiB to see if there is a \"CubesetFormatVersion =\" string in it (note the space between the word and the equals-sign), and if it is, the file is considered a Cubeset file and further loading is attempted. It is therefore crucial that tools producing this file format include this string as early as possible in the file.</p>\n<p>\nThe top-level Cubeset table must contain at least two sub-tables: Metadata and Pieces. The Metadata table contains the metadata relevant to the entire set of prefabs in the file, the Pieces table contains the definitions and metadata for the individual prefabs. It is advised to make the Metadata table the first one, because it contains the signature used to identify the file (\"CubesetFormatVersion =\"). Apart from these two subtables the server ignores everything else.</p>\n\n<a name=\"csmeta\"><h3>Cubeset metadata</h3></a>\n<p>\nThe Cubeset.Metadata table is used to store metadata for the entire set of prefabs, and also for the format and version identification. It is a regular dictionary-style Lua table; the following elements are recognized:\n<table>\n<tr><th>Name</th><th>Type</th><th>Content</th></tr>\n<tr><td>CubesetFormatVersion</td><td>number</td><td>This is the format identification and at the same time it specifies the version of the file. Currently the file version is 1. Note that Cuberite checks the presence of the string \"CubesetFormatVersion =\", including the space between the word and the equals-sign, within the first 8 KiB of the file.</td></tr>\n<tr><td>ExportDate</td><td>string</td><td>The date when this file was exported, in the ISO format (\"2015-06-16 13:34:03\"). Inserted by <a href=\"https://github.com/madmaxoft/GalExport\">GalExport</a> for versioning purposes. Ignored elsewhere.</td></tr>\n<tr><td>ExternalSchematic</td><td>boolean</td><td>Flag inserted by <a href=\"https://github.com/madmaxoft/GalExport\">GalExport</a> to indicate that the individual prefabs are stored in separate .schematic files. Ignored elsewhere.</td></tr>\n<tr><td>IntendedUse</td><td>string</td><td>String identifying the generator part that the cubeset file is intended for. The server logs a warning when loading a cubeset file without an IntendedUse metadata; individual generators log a warning if a wrong IntendedUse is detected in a file they are asked to use.</td></tr>\n</table>\n</p>\n<p>Additional values are recognized by the specific generator (which is indicated by the IntendedUse value): </p>\n<table><tr><th>Generator (IntendedUse)</th><th>Name</th><th>Type</th><th>Content</th><th>Notes</th></tr>\n<tr><td>Village / PieceStructures / Trees</td><td>AllowedBiomes</td><td>string</td><td>Comma-separated list of biomes</td><td>The generator only generates the structure / village / tree in the specified biomes. If empty, all biomes are eligible.</td></tr>\n<tr><td rowspan=6>Village</td><td>MaxDensity</td><td>number</td><td>Maximum density (0 - 100) at which the connectors are populated.</td><td rowspan=2>The village generator picks a density between Min and Max, and then only that many percent of the free connectors are actually attempted. This eventually reduces the number of houses to make the village look more \"roomy\".</tr>\n<tr><td>MinDensity</td><td>number</td><td>Minimum density (0 - 100) at which the connectors are populated.</td></tr>\n<tr><td>VillageRoadBlockType</td><td>number</td><td>The block type used in the village for regular roads on the solid surface</td><td rowspan=4>The generator replaces the top terrain block with the specified block type and meta to form the roads. The generator can distinguish when it's replacing water and when it's replacing regular terrain, allowing the villages to include \"bridges\" as their roads.</td></tr>\n<tr><td>VillageRoadBlockMeta</td><td>number</td><td>The block meta used in the village for regular roads on the solid surface</td></tr>\n<tr><td>VillageWaterRoadBlockType</td><td>number</td><td>The block type used in the village for roads on the surface of water</td></tr>\n<tr><td>VillageWaterRoadBlockMeta</td><td>number</td><td>The block meta used in the village for roads on the surface of water</td></tr>\n<tr><td rowspan=8>PieceStructures</td><td>GridSizeX</td><td>number</td><td rowspan=2>Size, in blocks, of the seed grid</td><td rowspan=2>The generator starts each generated structure in a \"seed\", these two parameters control the (average) distances between two adjacent seeds.</td></tr>\n<tr><td>GridSizeZ</td><td>number</td></tr>\n<tr><td>MaxOffsetX</td><td>number</td><td rowspan=2>Maximum offset, in blocks, of the seed from the grid's center</td><td rowspan=2>The generator starts each generated structure in a \"seed\", these two parameters control the maximum distance of the seed from the regular grid (specified by GridSizeX and GridSizeZ). When zero, the structures are generated exactly on a rectangular grid. Recommended value is about half of the grid's size.</td></tr>\n<tr><td>MaxOffsetZ</td><td>number</td></tr>\n<tr><td>MaxStructureSizeX</td><td>number</td><td rowspan=2>Size, in blocks, of the bounding box for a single structure.</td><td rowspan=2>The generator will not connect any prefab to the rest of the structure if it crosses the bounding box.</td></tr>\n<tr><td>MaxStructureSizeZ</td><td>number</td></tr>\n<tr><td>MaxDepth</td><td>number</td><td>Maximum depth of the generated piece tree</td><td>The maximum number of connectors, away from the starting piece</td></tr>\n<tr><td>SeedOffset</td><td>number</td><td>Number that is added to world's seed for this generator</td><td>Each cubeset file should have a different seed offset, otherwise it runs the risk of its structures being generated directly over other cubeset file's that the server admin has enabled. Since the seed is used for placement, if two cubeset files share the same seed, they will share the structure placement as well. </td></tr>\n\n</table>\n\n<a name=\"piece\"><h3>Individual piece</h3></a>\n<p>\nThe Cubeset.Pieces table is an array containing individual prefabs. Each element describes a single prefab and its associated metadata. The following values are recognized:\n<table>\n<tr><th>Name</th><th>Type</th><th>Content</th></tr>\n<tr><td>OriginData</td><td>table</td><td>Inserted by <a href=\"https://github.com/madmaxoft/GalExport\">GalExport</a> to identify the gallery area from which the prefab is exported. Ignored elsewhere.</td></tr>\n<tr><td>Hitbox</td><td>table</td><td>The relative coords of the prefab's hitbox (where the prefab is not allowed to overlap another prefab when generating). Members: MinX, MinY, MinZ, MaxX, MaxY, MaxZ, all numbers.</td></tr>\n<tr><td>Connectors</td><td>table</td><td>Array of <a href=\"#conndef\">connector definitions</a>. The table must be present for each prefab, even if the prefab doesn't have any connectors (use an empty table, then).</td></tr>\n<tr><td>SchematicFileName</td><td>string</td><td>Name of the .schematic file that contains the block data for the prefab.</td></tr>\n<tr><td>Size</td><td>table</td><td>Table containing the dimensions of the prefab, if it is inlined into the BlockData element. Contains three members, x, y, z, each is a number.</td></tr>\n<tr><td>BlockData</td><td>table</td><td>Array of strings that are processed to produce the block data for the prefab. Each letter in the string corresponds to one block, the type of the block is translated through the BlockDefinitions table. The blocks are ordered YZX, that is, the X coord varies the most.</td></tr>\n<tr><td>BlockDefinitions</td><td>table</td><td>Array of strings that defines the mapping of each letter in BlockData to a specific blocktype. Each string should have the format \"Letter: BlockType: BlockMeta\".</td></tr>\n<tr><td>Metadata</td><td>table</td><td>Dictionary-style table of various per-prefab <a href=\"#piecemeta\">metadata values</a>.</td></tr>\n</table>\nThe prefab can either have the SchematicFileName element, in which case the specified schematic file is loaded as the block data, or it can have the Size, BlockData and BlockDefinitions elements, then the server parses the block data from those. If both data members are included, the SchematicFileName takes precedence and the server loads the data from the schematic file (note that this behavior may change, having both definitions is considered \"undefined behavior\").</p>\n<a name=\"conndef\"><p>\nThe connector definitions table is an array of tables, each element describing one connector. The following values are recognized:\n<table>\n<tr><th>Name</th><th>type</th><th>Content</th></tr>\n<tr><td>Type</td><td>number</td><td>The connector's type. The piece generator will only connect the connectors of inverse types ('1'-type connector will connect only to '-1'-type connector).</td></tr>\n<tr><td>RelX</td><td>number</td><td>X coord of the connector, relative to the prefab's zero point ({0, 0, 0} - the first block in the image).</td></tr>\n<tr><td>RelY</td><td>number</td><td>Y coord of the connector, relative to the prefab's zero point ({0, 0, 0} - the first block in the image).</td></tr>\n<tr><td>RelZ</td><td>number</td><td>Z coord of the connector, relative to the prefab's zero point ({0, 0, 0} - the first block in the image).</td></tr>\n<tr><td>Direction</td><td>number</td><td>The direction in which the connector is facing. Corresponds to the eBlockFace constants:\n\t<table>\n\t<tr><th>Value</th><th>Direction</th></tr>\n\t<tr><td>0</td><td>Y-</td></tr>\n\t<tr><td>1</td><td>Y+</td></tr>\n\t<tr><td>2</td><td>Z-</td></tr>\n\t<tr><td>3</td><td>Z+</td></tr>\n\t<tr><td>4</td><td>X-</td></tr>\n\t<tr><td>5</td><td>X+</td></tr>\n\t</table>\n</td></tr>\n</table>\nIf a connector definition is missing any of the fields, the server will not add the connector to the prefab upon loading. If a prefab doesn't have any connectors, it still needs to provide an empty Connectors table.</p></a>\n\n<a name=\"piecemeta\"><h3>Piece metadata</h3></a>\n<p>\nEach piece contains additional metadata describing its properties. The server ignores metadata that it doesn't understand. The following values are recognized:\n<table>\n<tr><th>Name</th><th>Type</th><th>IsRequired</th><th>Contents</th></tr>\n<tr><td>IsStarting</td><td>number</td><td>Yes</td><td>Zero means that the piece is a regular piece, nonzero means that the piece is a starting piece (the \"seed\" of the structure). Required even for cubesets that don't represent a piece-generator data (such as trees). </td></tr>\n<tr><td>AllowedRotations</td><td>number</td><td>&nbsp;</td><td>Number representing a bitmask for which rotations the piece supports. Defaults to 0 (no rotations). Bit 0 (value 1) represents whether 1 counter-clockwise rotation is allowed, bit 1 (value 2) represents whether 2 rotations (180 degrees) are allowed, bit 2 (value 4) represents whether 1 clockwise rotation is allowed.</td></tr>\n<tr><td>AddWeightIfSame</td><td>number</td><td>&nbsp;</td><td>How much weight (chance to generate) should the piece generator add to this piece when the parent piece is the same. It is possible to have negative values, meaning that the piece doesn't like repeating itself. Defaults to 0.</td></tr>\n<tr><td>DefaultWeight</td><td>number</td><td>&nbsp;</td><td>How much weight (chance to generate) does the piece have by default, without any modifiers (AddWeightIfSame, DepthWeight). Defaults to 0.</td></tr>\n<tr><td>DepthWeight</td><td>string</td><td>&nbsp;</td><td>Override for DefaultWeight for specific depth (in the tree used by the piece generator). String in the format \"Depth1:Weight1|Depth2:Weight2|...\". Each unlisted depth gets the DefaultWeight. Defaults to empty string (no override).</td></tr>\n<tr><td>MergeStrategy</td><td>string</td><td>&nbsp;</td><td>Which merge strategy should be used when drawing the prefab into the world. String representation of one of the cBlockArea:eMergeStrategy constants: \"msOverwrite\", \"msFillAir\", \"msImprint\", \"msLake\", \"msSpongePrint\", \"msDifference\", \"msSimpleCompare\", \"msMask\". Defaults to \"msSpongePrint\".</td></tr>\n<tr><td>MoveToGround</td><td>number</td><td>&nbsp;</td><td>Zero means that the piece will stay where generated by the piece generator, nonzero means that the piece will be moved Y-wise so that its first connector will be on the top block of the existing terrain. Useful for village houses. Defaults to 0.</td></tr>\n<tr><td>ShouldExpandFloor</td><td>number</td><td>&nbsp;</td><td>Nonzero means that the prefab's lowest slice will be repeated downwards until it hits a solid block, effectively creating a foundation for the piece. Useful for nether fortresses and village houses. Defaults to 0.</td></tr>\n</table>\nEach value that should be a number also allows a string that represents a number. This makes it easier for automated exporters - they can export all values as strings.</p>\n\n<hr/>\n\n<a name=\"example\"><h2>Example</h2></a>\n<p>\nThe following example defines a cubeset with two pieces. The first piece is inlined into the cubeset file, the second piece uses an external schematic file.</p>\n<pre>\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t\tIntendedUse = \"PieceStructures\",\n\t\tGridSizeX = 128,\n\t\tGridSizeZ = 128,\n\t\tMaxStructureSizeX = 64,\n\t\tMaxStructureSizeZ = 64,\n\t\tMaxOffsetX = 16,\n\t\tMaxOffsetZ = 16,\n\t\tMaxDepth = 4,\n\t\tSeedOffset = 13,\n\t},\n\n\tPieces =\n\t{\n\t\t-- The following piece was exported from the Gallery server by the GalExport plugin in the \"cubeset\" format:\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"DarkCorridor\",\n\t\t\t\tName         = \"Nether 3\",\n\t\t\t\tGalleryName  = \"Nether\",\n\t\t\t\tGalleryIndex = \"3\",\n\t\t\t\tID           = \"30\",\n\t\t\t\tCreatorName  = \"STR_Warrior\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 14,\n\t\t\t\ty = 6,\n\t\t\t\tz = 5,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 13,\n\t\t\t\tMaxY = 5,\n\t\t\t\tMaxZ = 4,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 13,\n\t\t\t\t\tRelY = 1,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ShouldExpandFloor\"] = \"1\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:112: 0\",  -- netherbrick\n\t\t\t\t\"b:113: 0\",  -- netherbrickfence\n\t\t\t\t\"c:114: 2\",  -- netherbrickstairs\n\t\t\t\t\"d:114: 3\",  -- netherbrickstairs\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  4\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"aabaaaaaaaabaa\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"aabaaaaaaaabaa\",  --  4\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"aabaaaaaaaabaa\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"aabaaaaaaaabaa\",  --  4\n\n\t\t\t\t-- Level 4\n\t\t\t\t\"aabaaaaaaaabaa\",  --  0\n\t\t\t\t\"..............\",  --  1\n\t\t\t\t\"..............\",  --  2\n\t\t\t\t\"..............\",  --  3\n\t\t\t\t\"aabaaaaaaaabaa\",  --  4\n\n\t\t\t\t-- Level 5\n\t\t\t\t\"cccccccccccccc\",  --  0\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  1\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  2\n\t\t\t\t\"aaaaaaaaaaaaaa\",  --  3\n\t\t\t\t\"dddddddddddddd\",  --  4\n\t\t\t},\n\t\t},  -- DarkCorridor\n\n\t\t-- The following piece was exported from the Gallery server by the GalExport plugin in the \"cubesetext\" format:\n\t\t{\n\t\t\tOriginData =\n\t\t\t{\n\t\t\t\tExportName   = \"DoublePlantBed\",\n\t\t\t\tName         = \"Plains 5\",\n\t\t\t\tGalleryName  = \"Plains\",\n\t\t\t\tGalleryIndex = \"5\",\n\t\t\t\tID           = \"20\",\n\t\t\t\tCreatorName  = \"tonibm1999\",\n\t\t\t},\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 15,\n\t\t\t\ty = 8,\n\t\t\t\tz = 9,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 14,\n\t\t\t\tMaxY = 7,\n\t\t\t\tMaxZ = 8,\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = -1,\n\t\t\t\t\tRelX = 7,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 8,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ShouldExpandFloor\"] = \"1\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t},\n\t\t\tSchematicFile = \"PlainsVillage/20.schematic\",\n\t\t},  -- DoublePlantBed\n\t}  -- Pieces\n}\n</pre>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "dev-docs/ExportingAPI.html",
    "content": "<html>\n<head>\n<title>Cuberite - Exporting symbols from C++ to Lua API</title>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n</head>\n<body>\n<div id=\"content\">\n<h1>Exporting symbols from C++ to Lua API</h1>\n<p>\nCuberite has a powerful plugin system which makes available hundreds of functions, variables and constants (symbols). When adding or removing functionality, these need to be taken into account - do we want to make this function available to the plugins? Did we remove a function that plugins could have used in the past?</p>\n<p>\nThe API maintenance is pretty straightforward once you figure out how to do it. This text will guide you through the process.</p>\n<ul>\n\t<li><a href=\"#toluaintro\">Introduction to ToLua++</a></li>\n\t<ul>\n\t\t<li><a href=\"#autoexport\">Auto-export</a></li>\n\t\t<li><a href=\"#manualexport\">Exporting manually</a></li>\n\t</ul>\n\t<li><a href=\"#conventions\">Cuberite conventions</a></li>\n\t<ul>\n\t\t<li><a href=\"#newsymbols\">New symbols</a></li>\n\t\t<li><a href=\"#delsymbols\">Removing symbols</a></li>\n\t\t<li><a href=\"#zbsapi\">ZeroBrane Studio API description</a></li>\n\t\t<li><a href=\"#pluginchecker\">Plugin Checker</a></li>\n\t</ul>\n</ul>\n\n<hr />\n<a name=\"toluaintro\"><h2>Introduction to ToLua++</h2></a>\n<p>\nCuberite uses ToLua++ for handling bindings. Unfortunately this tool is no longer maintained, so we had to hack it ourselves whenever we needed a specific feature that it didn't support. Luckily, it turns out ToLua++ is greatly extensible and can quite easily be made to do our bidding.</p>\n<p>\nThis tool consists of a Lua script to parse C++ code and generate the glue code, and a runtime library providing support for the generated code. The C++ code parser doesn't implement full C++ syntax, just a reasonable subset that most if not all source files can be made to fit. Since it parses the C++ code using Lua patterns, it is only expected that some wild corner cases will confuse the parser. Therefore, all files that are to be processed by the parser need to be written in a simple subset of C++.</p>\n<p>\nOnce run, the tool generates a giant C++ source code file, src/Bindings/Bindings.cpp, which implements all the glue code needed for Lua plugins to interface with the C++ code.</p>\n\n<a name=\"autoexport\"><h3>Auto-export</h3></a>\n<p>\nThe simplest way to export a symbol is to mark it for exporting and let ToLua++ do all the work. Basically, when ToLua++ parses files, it ignores everything that is not in between special comments, // tolua_begin and // tolua_end . There's a special comment, // tolua_export , that says \"consider this single line\". So adding new symbols in between existing tolua_begin / tolua_end comment pair, or marking them with tolua_export, is the simplest way to export them. However, since ToLua++ is limited, this works only for simple things: variables, constants and (overloaded) (member) functions, all of which must use only numbers, strings or enums or classes known to ToLua++. Note that this means that arrays, vectors, lists and callbacks are not supported by this simple export, all of those need to be exported manually. Based on experience, about 90 % of API functions can be exported this way.</p>\n<p>\nThe following piece of code shows how to export a class with some of its functions:</p>\n<pre>\n// tolua_begin\nclass ExportedClass\n{\npublic:\n\t// tolua_end\n\n\tExportedClass();  // NOT exported\n\tvoid notExported();\n\tvoid exported(int a_Param1);  // tolua_export\n\tvoid anotherNotExported();\n\n\t// tolua_begin\n\n\tvoid exported(int a_Param1, int a_Param2);  // Note that overloads are supported\n\tvoid anotherExported(const AString &amp; a_Text);\n};\n// tolua_end\n</pre>\n<p>\nFrom this input, the ToLua++ sees the following \"preprocessed\" code, for which it will generate the bindings:</p>\n<pre>\nclass ExportedClass\n{\npublic:\n\tvoid exported(int a_Param1);\n\tvoid exported(int a_Param1, int a_Param2);\n\tvoid anotherExported(const AString &amp; a_Text);\n};\n</pre>\n\n<a name=\"manualexport\"><h3>Manual export</h3></a>\n<p>\nFirst, a quick primer on binding Lua in general. You can have a look at the <a href=\"http://www.lua.org/manual/5.3/manual.html#4\">Lua manual</a> for details, since this is only a summary.</p>\n<p>\nLua uses a concept of stack. It keeps a stack through the lifetime of program, and calling a function means that under the hood the parameters are first pushed onto the stack, then the function implementation is called, it can read the values on the stack and it can push return values onto the same stack, and when it returns, Lua reads the return values from the top of that stack. This allows Lua to have functions that take a variable amount of parameters, return any number of values, and all of these parameters / values can be of any Lua-supported type. If you consider the datatype a \"variant\", it's good enough.</p>\n<p>\nThe signature for a function call, therefore, is simple - it takes an opaque pointer to a Lua engine (struct lua_State *), and it returns a single number that specifies how many return values there are on the stack. In C/C++ terms:\n<pre>\nstatic int fnImplementation(lua_State * a_LuaState)\n{\n\t// ...\n\n\t// Push return values onto the stack\n\n\treturn numReturnValues;\n}\n</pre>\n</p>\n<p>\nAlthough it is referred to as The Stack, it can be manipulated in any way - a value can be read from any position, and it supports insertion to and deletion from any position.</p>\n<p>\nA typical API function should do these actions:\n<ul>\n\t<li>Check that parameter types are correct</li>\n\t<li>Read the parameter values</li>\n\t<li>Execute the C++ function</li>\n\t<li>Publish any return values</li>\n</ul>\n</p>\n<p>\nCuberite wraps the lua_State pointer into a nice interface, cLuaState, that (among other things) provides easy functions for interfacing with Lua. Checking parameter types is done using the cLuaState::CheckParam...() family of functions. Each of these functions checks the type of the specified parameter / parameter range, returns true if the parameters are okay, or logs an error message to console and returns false if they aren't. Note that this is not usable for overloaded functions, they need to use tolua_is...() functions for checking.</p>\n<p>\nExample code doing the parameter check:</p>\n<pre>\nstatic int tolua_cRoot_DoWithPlayerByUUID(lua_State * tolua_S)\n{\n\t// Function signature: cRoot:DoWithPlayerByUUID(cUUID, function)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cRoot\") ||\n\t\t!L.CheckParamUUID(2) ||\n\t\t!L.CheckParamFunction(3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n</pre>\n<p>\nThis code checks that the API function is called on a cRoot instance (first hidden parameter) and has a UUID and a callback function as its parameters. It also checks that there are no more parameters on the stack. </p>\n<p>\nReading the parameter values is rather simple: Declare variables to hold the parameter values, then use cLuaState::GetStackValues() to read them all at once. This function will return true if successful, false on an error. The return value should be checked even if parameter types were correct, because a failure can be due to other means as well - the number in Lua might be too large to fit the C++ datatype, or the enum value is out of range. Note that GetStackValues() doesn't report which parameter failed, so it should not be used for reporting problems to the user (plugin dev).</p>\n<p>\nThe following example is a continuation of the previous example function that reads the parameters into local variables:</p>\n<pre>\n\t// Get parameters:\n\tcRoot * Self;\n\tcUUID PlayerUUID;\n\tcLuaState::cRef FnRef;  // Holds a Lua function (callback)\n\tL.GetStackValues(1, Self, PlayerUUID, FnRef);\n\n\t// Check parameters validity:\n\tif (PlayerUUID.IsNil())\n\t{\n\t\treturn L.ApiParamError(\"Expected a non-nil UUID for parameter #1\");\n\t}\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid callback function for parameter #2\");\n\t}\n</pre>\n<p>\nAfter executing the C++ function, if there are any return values, they should be pushed onto the Lua stack using the cLuaState::Push() function, and finally the returned number should indicate the number of return values. Note that it is up to you to keep the stack counts. If your code pushes more values onto the stack than it reports as return values, it will cause a memory leak.</p>\n<p>\nThe following example contains the rest of the previous example function, it executes the C++ code and gives the return value back to Lua:</p>\n<pre>\n\t// Call the function:\n\tbool res = Self->DoWithPlayerByUUID(PlayerUUID, [&amp;](cPlayer &amp; a_Player)\n\t\t{\n\t\t\tbool ret = false;\n\t\t\tL.Call(FnRef, &amp;a_Player, cLuaState::Return, ret);\n\t\t\treturn ret;\n\t\t}\n\t);\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n</pre>\n<p>\nThe manual API function export glue should be written into one of src/Bindings/ManualBindings*.cpp files, based on the group it belongs to (or into src/Bindings/DeprecatedBindings.cpp if it is an obsolete function, see the <a href=\"#delsymbol\">Removing a symbol</a> chapter). There are a lot of examples already in those files. Note that there was some development in the process of writing manual bindings, and some of the manual bindings use old code. Do not copy code that makes use of tolua_Error struct, or tolua_push...() or tolua_to...() functions.</p>\n<p>\nFinally, after writing the API function, it needs to be registered (\"bound\" in our terminology). Each of the CPP files has a cManualBindings::Bind...() function at the bottom for this purpose. The function first registers classes (tolua_usertype(), tolua_cclass()) and then fills each class with manually-exported functions. A call to tolua_beginmodule() signifies start of class, tolua_endmodule() ends the class. In between, calls to tolua_function() register the API functions. It is good practice to keep the classes and the sybmols within classes alpha-sorted and tabulated.</p>\n<p>\nThe following code is an example of binding our previous example function:</p>\n<pre>\n\ttolua_beginmodule(tolua_S, \"cRoot\");\n\t\t// ...\n\t\ttolua_function(tolua_S, \"DoWithPlayerByUUID\",  tolua_cRoot_DoWithPlayerByUUID);\n\t\t// ...\n\ttolua_endmodule(tolua_S);\n</pre>\n\n<hr />\n<a name=\"conventions\"><h2>Cuberite conventions</h2></a>\n<p>\nSpecifically for Cuberite, we've built some conventions over the years. They are in place for good reasons - to make the API well documented, somewhat stable and reasonably fool-proof</p>\n\n<a name=\"newsymbols\"><h3>New symbols</h3></a>\n<p>\nWhen adding a new symbol to the API, there's no version number to bump up to indicate this. Plugins can simply check the symbol's existence in the runtime, if they wish to do so. However, it is necessary to properly document the symbol, so that the automatically-generated documentation stays up to date.</p>\n<p>\nThe API documentation is handled by the APIDump plugin, contained in the main repository in the Server/Plugins/APIDump folder. It can automatically generate the HTML API documentation locally, based on the actual API that it detects Cuberite is giving it, and joins it with developer-provided per-symbol descriptions. Most of the description is in the Server/Plugins/APIDump/APIDesc.lua file, but some well-defined groups of symbols have been pulled out into separate files in the Server/Plugins/APIDump/Classes folder and Server/Plugins/APIDump/Hooks folder. The format of the files is pretty self-explanatory - they each return a Lua table containing the descriptions, organized in sub-tables.</p>\n<p>\nTo generate the documentation locally, start up Cuberite, load the APIDump plugin (if not already enabled) and execute the \"api\" command. It will create an API subfolder next to the Cuberite executable and write the HTML files into it.\n<p>\nThe APIDump plugin can also check the difference between official documentation and local documentation, and can report if any symbol is new locally, without proper description. Execute the \"apicheck\" command to do that; note that this requires \"wget\" to be installed, since the official API description needs to be downloaded from the Internet. This command is used as part of Cuberite CI builds to detect any forgotten API description.</p>\n\n<a name=\"delsymbols\"><h3>Removing a symbol</h3></a>\n<p>\nTo keep the API from changing too much under plugin devs' hands, the recommendation is not to remove API symbols, but rather mark them as obsolete, while keeping the functionality (possibly emulating it through a new API, if the old symbol was replaced with a new way of doing things). The preffered way is to export the old symbol mnually in a specific file, src/Bindings/DeprecatedBindings.cpp, and add a warning message to the function implementation, together with the Lua stacktrace, to aid plugin authors with the migration. It is always a good idea to add a hint as to what the developers should use instead (\"Warning in function call 'StringToMobType': StringToMobType() is deprecated. Please use cMonster:StringToMobType()\").</p>\n<p>\nAfter a reasonable amount of time (typically, on the order of a year) the removed symbol can be considered unused and will be removed from the API. Usually this happens in batches as a cleanup of the codebase.</p>\n\n<a name=\"zbsapi\"><h3>ZeroBrane Studio API description</h3></a>\n<p>\nThe APIDump plugin also outputs API description for the ZeroBrane Studio IDE. It is written into the cuberite_api.lua file next to the Cuberite executable. See the <a href=\"http://xoft.cz/cuberite/LuaAPI/SettingUpZeroBrane.html\">Docs article about ZBS</a> for details on how to use that file.</p>\n\n<a name=\"pluginchecker\"><h3>Plugin Checker</h3></a>\n<p>\nThere is a <a href=\"https://github.com/cuberite/CuberitePluginChecker\">CuberitePluginChecker</a> project that aims to provide automatic testing to plugins. It uses the APIDump's descriptions to provide dummy implementations for all API functions. See the project page for details.</p>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "dev-docs/Generator.html",
    "content": "<html>\n<head>\n\t<title>Generating terrain in Cuberite</title>\n\t<script src=\"js/ValueMap.js\"></script>\n\t<script src=\"js/grown.js\"></script>\n</head>\n<body>\n<h1>Generating terrain in Cuberite</h1>\n<p>This article explains the principles behind the terrain generator in Cuberite. It is not strictly specific to Cuberite, though, it can be viewed as a generic guide to various terrain-generating algorithms, with specific implementation notes regarding Cuberite.</p>\n\n<p>Contents:\n<ul>\n<li><a href=\"#preface\">Preface: How it's done in real life</a></li>\n<li><a href=\"#expectedprops\">Expected properties</a></li>\n<li><a href=\"#reversingflow\">Reversing the flow</a></li>\n<li><a href=\"#composablegen\">The ComposableGenerator pipeline</a></li>\n<li><a href=\"#coherentnoise\">Using coherent noise</a></li>\n<li><a href=\"#biomegen\">Generating biomes</a>\n<ul>\n\t<li><a href=\"#biome.voronoi\">Voronoi</a></li>\n\t<li><a href=\"#biome.distortedvoronoi\">DistortedVoronoi</a></li>\n\t<li><a href=\"#biome.multistepmap\">MultiStepMap</a></li>\n\t<li><a href=\"#biome.twolevel\">TwoLevel</a></li>\n\t<li><a href=\"#biome.grown\">Grown</a></li>\n</ul>\n</li>\n<li><a href=\"#heightgen\">Terrain height</a></li>\n<li><a href=\"#compositiongen\">Terrain composition</a></li>\n<li><a href=\"#finishgen\">Finishers</a></li>\n<li><a href=\"#makefaster\">Making it all faster</a></li>\n<li><a href=\"#GPU\">Executing on a GPU</a></li>\n</ul>\n</p>\n\n\n<hr />\n\n<a name=\"preface\"><h2>Preface: How it's done in real life</h2></a>\n<p>The nature has many complicated geological, physical and biological processes working on all scales from microscopic to planet-wide scale, that have shaped the terrain into what we see today. The tectonic plates collide, push mountain ranges up and ocean trenches down. Erosion dulls the sharp shapes. Plantlife takes over to further change the overall look of the world.</p>\n\n<p>Generally speaking, the processes take what's there and change it. Unlike computer generating, which usually creates a finished terrain from scratch, or maybe with only a few iterations. It would be unfeasible for software to emulate all the natural processes in enough detail to provide world generation for a game, mainly because in the nature everything interacts with everything. If a mountain range rises, it changes the way that the precipitation is carried by the wind to the lands beyond the mountains, thus changing the erosion rate there and the vegetation type. </p>\n\n\n<hr />\n\n<a name=\"expectedprops\"><h2>Expected properties</h2></a>\n<p>For a MineCraft-like game terrain generator we need the generator to have several properties:\n<ul>\n<li>The generator must be able to generate terrain in small chunks. This means it must be possible to generate each of the chunks separately, without dependencies on the neighboring chunks. Note that this doesn't mean chunks cannot coordinate together, it means that \"a tree in one chunk cannot ask if there's a building in the neighbor chunk\", simply because the neighbor chunk may not be generated yet.</li>\n<li>The generated chunk needs to be the same if re-generated. This property is not exactly required, but it makes available several techniques that wouldn't be possible otherwise.</li>\n<li>The generator needs to be reasonably fast. For a server application this means at least some 20 chunks per second for chunks close to each other, and 5 chunks per second for distant chunks. The reason for this distinction will be discussed later.</li>\n</ul>\n</p>\n\n\n<hr />\n\n<a name=\"reversingflow\"><h2>Reversing the flow</h2></a>\n<p>As already mentioned, the nature works basically by generating raw terrain composition, then \"applying\" erosion, vegetation and finally this leads to biomes being formed. Let's now try a somewhat inverse approach: First generate biomes, then fit them with appropriate terrain, and finally cover in vegetation and all the other stuff.</p>\n\n<p>Splitting the parts like this suddenly makes it possible to create a generator with the required properties. We can generate a reasonable biome map chunk-wise, independently of all the other data. Once we have the biomes, we can compose the terrain for the chunk by using the biome data for the chunk, and possibly even for neighboring chunks. Note that we're not breaking the first property, the biomes can be generated separately so a neighboring chunk's biome map can be generated without the need for the entire neighboring chunk to be present. Similarly, once we have the terrain composition for a chunk, we can generate all the vegetation and structures in it, and those can again use the terrain composition in neighboring chunks.</p>\n\n\n<hr />\n\n<a name=\"composablegen\"><h2>The ComposableGenerator pipeline</h2></a>\n<p>This leads us directly to the main pipeline that is used for generating terrain in Cuberite. For technical reasons, the terrain composition step is further subdivided into Height generation and Composition generation, and the structures are really called Finishers. For each chunk the generator generates, in this sequence:\n<ul>\n<li>Biomes</li>\n<li>Terrain height</li>\n<li>Terrain composition</li>\n<li>Finishers</li>\n</ul>\n</p>\n\n<img src=\"img/biomes.jpg\" />\n<img src=\"img/terrainheight.jpg\" />\n<img src=\"img/terraincomposition.jpg\" />\n<img src=\"img/finishers.jpg\" />\n<p>The beautiful thing about this is that the individual components can be changed independently. You can have 5 biome generators and 3 height generators and you can let the users mix'n'match.</p>\n<p>This pipeline had been used in Cuberite for about a year, before we realized that is has a flaw: There is no way for it to generate overhangs. We tried to implement a Finisher that would actually carve overhangs into the terrain; this approach has several problems, most severe one of those is that tree and village generation becomes unbelievably difficult - those finishers need to know the basic terrain composition of the neighboring chunks in order to generate, and the composition would be different after the overhangs are carved. So we need to come up with a better way, something that directly generates the overhangs at latest by the Terrain composition stage.</p>\n<p>Luckily we have just the thing. Instead of generating a 2D heightmap, we generate a 3D \"density map\" - we decide about each block in the chunk being generated, whether it is a solid block or an air block. The following pictures try to illustrate this in one less dimension - the heightmap is a 1D function and the density map is a 2D function:</p>\n\n<img src=\"img/heightmap.jpg\" />\n<img src=\"img/densitymap.jpg\" />\n\n<p>This way we can have generators that produce overhangs and yet allow finishers that need the entire composition of the neighboring chunks. However, we pay the price for this in performance, because a 3D noise for the density map needs order of magnitude more CPU cycles than 2D noise for heightmap. Also the RAM usage is increased because instead of storing 16 * 16 height values we need to store 16 * 256 * 16 density values. </p>\n\n<hr />\n\n<a name=\"coherentnoise\"><h2>Using coherent noise for the generation</h2></a>\n<p>For a great tutorial on coherent noise, see the <a href=\"http://libnoise.sourceforge.net/\">LibNoise documentation</a>.</p>\n<p>Coherent noise is a type of noise that has three important properties that we can use to our advantage:\n<ul>\n<li>The noise is smooth - small change in the input coord produces only a small change in the output value</li>\n<li>The noise is algorithmically generated, which means that the same data is generated when the same inputs are given to the noise functions.</li>\n<li>The noise can be seamlessly extended in any direction</li>\n</ul></p>\n\n<p>We'll be mostly using Perlin noise in this article. It is the easiest one to visualise and use and is one of the most useful kinds of coherent noises. Here's an example of a Perlin noise generated in 2 dimensions:</p>\n<img src=\"img/perlin.jpg\" />\n\n<p>It comes only naturally that such a 2D noise can be used as a terrain height map directly:</p>\n<img src=\"img/perlinheightmap.jpg\" />\n\n<p>However, this is not the only use for this noise, and 2 dimensions is not the limit - this noise can be generated for any number of dimensions.</p>\n\n\n\n<hr />\n\n<a name=\"biomegen\"><h2>Generating biomes</h2></a>\n<p>The easiest way to generate biomes is to not generate them at all - simply assign a single constant biome to everywhere. And indeed there are times when this kind of \"generator\" is useful - for the MineCraft's Flat world type, or for testing purposes, or for tematic maps. In Cuberite, this is exactly what the Constant biome generator does.</p>\n\n<p>Of course, there are more interesting test scenarios for which multiple biomes must be generated as easy as possible. For these special needs, there's a CheckerBoard biome generator. As the name suggests, it generates a grid of alternating biomes.</p>\n\n<a name=\"biome.voronoi\"><h3>Voronoi diagram</h3></a>\n<p>Those two generators were more of a technicality, we need to make something more interesting if we're going for a natural look. The Voronoi generator is the first step towards such a change. Recall that a <a href=\"https://en.wikipedia.org/wiki/Voronoi_diagram\">Voronoi diagram</a> is a construct that creates a set of areas where each point in an area is closer to the appropriate seed of the area than the seeds of any other area:</p>\n<img src=\"img/voronoi.png\" />\n\n<p>To generate biomes using this approach, you select random \"seeds\", assign a biome to each one, and then for each \"column\" of the world you find the seed that is the nearest to that column, and use that seed's biome.</p>\n\n<p>The overall shape of a Voronoi diagram is governed by the placement of the seeds. In extreme cases, a seed could affect the entire diagram, which is what we don't want - we need our locality, so that we can generate a chunk's worth of biome data. We also don't want the too much irregular diagrams that are produced when the seeds are in small clusters. We need our seeds to come in random, yet somewhat uniform fashion.</p>\n\n<p>Luckily, we have just the tool: Grid with jitter. Originally used in antialiasing techniques, they can be successfully applied as a source of the seeds for a Voronoi diagram. Simply take a regular 2D grid of seeds with the grid distance being N, and move each seed along the X and Y axis by a random distance, usually in the range [-N / 2, +N / 2]:</p>\n<img src=\"img/jittergrid.jpg\" />\n\n<p>Such a grid is the ideal seed source for a Voronoi biome generator, because not only are the Voronoi cells \"reasonable\", but the seed placement's effect on the diagram is localized - each pixel in the diagram depends on at most 4 x 4 seeds around it. In the following picture, the seed for the requested point (blue) must be within the indicated circle. Even the second-nearest seed, which we will need later, is inside that circle.</p>\n<img src=\"img/jittergridlocality.jpg\" />\n\n<p>Calculating the jitter for each cell can be done easily by using a 2D Perlin noise for each coord. We calculate the noise's value at [X, Z], which gives us a number in the range [-1; 1]. We then multiply the number by N / 2, this gives us the required range of [-N / 2, +N / 2]. Adding this number to the X coord gives us the seed's X position. We use another Perlin noise and the same calculation for the Z coord of the seed.</p>\n\n<p>Here's an example of a biome map generated using the Voronoi + jitter grid, as implemented by the Voronoi biome generator in Cuberite:</p>\n<img src=\"img/voronoijitterbiomes.png\" />\n\n<a name=\"biome.distortedvoronoi\"><h3>Distorted Voronoi</h3></a>\n<p>The biomes are starting to look interesting, but now they have straight-line borders, which looks rather weird and the players will most likely notice very soon. We need to somehow distort the borders to make them look more natural. By far the easiest way to achieve that is to use a little trick: When the generator is asked for the biome at column [X, Z], instead of calculating the Voronoi biome for column [X, Z], we first calculate a random offset for each coord, and add it to the coordinates. So the generator actually responds with the biome for [X + rndX, Z + rndZ].</p>\n\n<p>In order to keep the property that generating for the second time gives us the same result, we need the \"random offset\" to be replicatable - same output for the same input. This is where we use yet another Perlin noise - just like with the jitter for the Voronoi grid, we add a value from a separate noise to each coordinate before sending the coordinates down to the Voronoi generator:</p>\n<code>\nDistortedVoronoiBiome(X, Z) := VoronoiBiome(X + PerlinX(X, Z), Z + PerlinZ(X, Z))\n</code>\n\n<p>The following image shows the effects of the change, as generated by Cuberite's DistortedVoronoi biome generator. It is actually using the very same Voronoi map as the previous image, the only change has been the addition of the distortion:</p>\n<img src=\"img/distortedvoronoibiomes.png\" />\n\n<p>As you can see, this already looks reasonable enough, it could be considered natural biomes, if it weren't for several drawbacks:\n<ul>\n<li>There's no way to limit the neighbors. A desert biome can neighbor a tundra biome. </li>\n<li>All the biomes are considered equal. There's no way to make oceans larger. A mushroom biome is generated right next to other land biomes.</li>\n</ul></p>\n\n<a name=\"biome.multistepmap\"><h3>MultiStepMap</h3></a>\n<p>Our next goal is to remove the first defect of the distorted Voronoi generator: unrelated biomes generating next to each other. You are highly unlikely to find a jungle biome next to a desert biome in the real world, so we want to have as few of those borders as possible in our generator, too. We could further improve on the selection of biome-to-seed in the Voronoi generator. Or we can try a completely different idea altogether.</p>\n\n<p>Recall how we talked about the nature, where the biomes are formed by the specific conditions of a place. What if we could make a similar dependency, but without the terrain? It turns out this is possible rather easily - instead of depending on the terrain, we choose two completely artificial measures. Let's call them Temperature and Humidity. If we knew the temperature of the place, we know what set of biomes are possible for such temperatures - we won't place deserts in the cold and tundra in the hot anymore. Similarly, the humidity will help us sort out the desert vs jungle issue. But how do we get a temperature and humidity? Once again, the Perlin noise comes to the rescue. We can use a simple 2D Perlin noise as the temperature map, and another one as the humidity map.</p>\n\n<p>What we need next is a decision of what biome to generate in certain temperature and humidity combinations. The fastest way for a computer is to have a 2D array, where the temperature is one dimension and humidity the other, and the values in the array specify the biome to generate:</p>\n<img src=\"img/temperaturehumiditydecisionsimple.jpg\" />\n\n<p>We can even \"misuse\" the above diagram to include the hill variants of the biomes and have those hills neighbor each other properly, simply by declaring some of the decision diagram's parts as hills:</p>\n<img src=\"img/temperaturehumiditydecisionhills.jpg\" />\n\n<p>The problem with this approach is that there are biomes that should not depend on temperature or humidity, they generate across all of their values. Biomes like Oceans, Rivers and Mushroom. We could either add them somewhere into the decision diagram, or we can make the generator use a multi-step decision:\n<ul>\n<li>Decide whether the point is in the ocean, land or mushroom</li>\n<li>If it's land, decide if it's real land or river.</li>\n<li>If it's real land, use a TemperatureHumidity approach to generate land-biomes</li>\n</ul>\n</p>\n\n<p>This is the approach implemented in Cuberite's MultiStepMap biome generator. It generates biome maps like this:</p>\n<img src=\"img/multistepmapbiomes.png\" />\n\n<p>To decide whether the point is in the ocean, land or mushroom, the generator first chooses seeds in a grid that will be later fed to a DistortedVoronoi algorithm, the seeds get the \"ocean\" and \"land\" values. Then it considers all the \"ocean\" seeds that are surrounded by 8 other \"ocean\" seeds and turns a random few of them into \"mushroom\". This special seed processing makes the mushroom biomes mostly surrounded by ocean. The following image shows an example seeds grid that the generator might consider, only the two framed cells are allowed to change into mushroom. L = land, O = ocean:</p>\n<img src=\"img/multistepmapgrid.jpg\" />\n\n<p>Next, the generator calculates the DistortedVoronoi for the seeds. For the areas that are calculated as mushroom, the distance to the nearest-seed is used to further shrink the mushroom biome and then to distinguish between mushroom and mushroom-shore (image depicts a Voronoi cell for illustration purposes, it works similarly with DistortedVoronoi). O = ocean, M = mushroom, MS = mushroom shore:</p>\n<img src=\"img/multistepmapdistance.jpg\" />\n\n<a name=\"perlinrivers\">\n<p>The rivers are added only to the areas that have been previously marked as land. A simple 2D Perlin noise is used as the base, where its value is between 0 and a configured threshold value, a river is created. This creates the rivers in a closed-loop-like shapes, occasionally splitting two branches off:</p>\n<img src=\"img/perlinrivers1.jpg\" />\n<img src=\"img/perlinrivers2.jpg\" />\n<img src=\"img/perlinrivers3.jpg\" />\n</a>\n\n<p>For the leftover land biomes, the two Perlin noises, representing temperature and humidity, are used to generate the biomes, as described earlier. Additionally, the temperature map is used to turn the Ocean biome into FrozenOcean, and the River biome into FrozenRiver, wherever the temperature drops below a threshold.</p>\n\n<a name=\"biome.twolevel\"><h3>TwoLevel</h3></a>\n<p>The 1.7 MineCraft update brought a completely new terrain generation, which has sparked renewed interest in the biome generation. A new, potentially simpler way of generating biomes was found, the two-level DistortedVoronoi generator.</p>\n\n<p>The main idea behind it all is that we create large areas of similar biomes. There are several groups of related biomes that can be generated near each other: Desert biomes, Ice biomes, Forest biomes, Mesa biomes. Technically, the Ocean biomes were added as yet another group, so that the oceans will generate in approximately the size of the larger areas, too.</p>\n\n<p>For each column a DistortedVoronoi is used to select, which large area to use. This in turn results in the list of biomes from which to choose. Another DistortedVoronoi, this time with a smaller grid size, is used to select one biome out of that list. Additionally, the smaller DistortedVoronoi calculates not only the nearest seed's distance, but also the distance to the second-nearest seed; the ratio between these two is used as an indicator whether the column is in the \"inside\" or on the \"outskirt\" of the smaller Voronoi cell. This allows us to give certain biomes an \"edge\" biome - the Mushroom biome has a MushroomShore edge, the ExtremeHills biome have an ExtremeHillsEdge biome on the edge, etc.</p>\n\n<p>The images below illustrate the process with regular Voronoi diagrams, for clarity purposes. The real generator uses distortion before querying the small areas.</p>\n<img src=\"img/twolevellargeareas.jpg\" /><br />\n<img src=\"img/twolevelsmallgrid.jpg\" /><br />\n<img src=\"img/twolevelsmallareas.jpg\" /><br />\n\n<p>The following image shows an example output of a TwoLevel biome generator in Cuberite. Note how the mushroom biomes (violet) have mushroom shores (pink) on their edges.</p>\n<img src=\"img/twolevelbiomes.png\" />\n\n<p>Note that rivers are currently not implemented in this generator in Cuberite, but they could be added\nusing the same approach as in MultiStepMap - by using a thresholded 2D Perlin noise.</p>\n\n\n\n<a name=\"biome.grown\"><h3>Grown biomes</h3></a>\n<p>This generator uses a completely new approach to biome generation. Internally, it uses 2D arrays of integers of varying sizes, and defines a few operations on those arrays. At various points in the generator's pipeline, the integers are interpreted as having a different meaning. At the first stage, they diffentiate between ocean and land. Later on they are interpreted as biome groups - ocean biomes, dry biomes, temperate biomes, mountain biomes or ice biomes. In the final stages they represent individual biomes, each number in the array representing the biome of a single-block-wide column in the world. Still, most of the operations are agnostic of this interpretation, they only \"see numbers\".</p>\n<p>At the core of the generator is the <b>\"Zoom\"</b> operation, that enlarges the array almost twice in size (N -&gt; 2*N - 1). For each 2x2 neighboring numbers in the original array it produces a 3x3 array, where the corner values inherit from their corner counterparts of the original array, and the values in the middle get chosen randomly from their appropriate neighbors:</p>\n<table><tr>\n<td><table border=\"1\" cellspacing=\"0\" cellpadding=\"2\"><tr><td>a</td><td>b</td></tr><tr><td>c</td><td>d</td></tr></table></td>\n<td>--- zooom --></td>\n<td><table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n\t<tr><td align=\"center\">a</td><td align=\"center\">a or b</td><td align=\"center\">b</td></tr>\n\t<tr><td align=\"center\">a or c</td><td align=\"center\">a or b or c or d</td><td align=\"center\">b or d</td></tr>\n\t<tr><td align=\"center\">c</td><td align=\"center\">c or d</td><td align=\"center\">d</td></tr>\n</table></td>\n</tr></table>\n\n<style>\n\t.h1 { background-color: #cff; }\n\t.hh { background-color: #fcf; }\n\t.hv { background-color: #ffc; }\n\t.ho { background-color: #fff; }\n\t.hr { background-color: #ddd; }\n\t.bgr { width: 1em; height: 1em; background-color: red; }\n\t.bgg { width: 1em; height: 1em; background-color: green; }\n\t.bgb { width: 1em; height: 1em; background-color: blue; }\n\t.bgc { width: 1em; height: 1em; background-color: cyan; }\n\t.bgy { width: 1em; height: 1em; background-color: yellow; }\n</style>\n\n<p>This scheme is repeated for larger arrays accordingly, for example (highlighted values are the ones directly copied from the source array):</p>\n<table>\n<tr>\n<td><table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n\t<tr><td>0</td><td>0</td><td>1</td><td>1</td></tr>\n\t<tr><td>0</td><td>1</td><td>0</td><td>1</td></tr>\n\t<tr><td>1</td><td>1</td><td>0</td><td>0</td></tr>\n\t<tr><td>0</td><td>1</td><td>1</td><td>0</td></tr>\n</table></td>\n<td>--- Zooom --&gt;</td>\n<td><table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n\t<tr><td class=\"h1\">0</td><td>0</td><td class=\"h1\">0</td><td>1</td><td class=\"h1\">1</td><td>1</td><td class=\"h1\">1</td></tr>\n\t<tr><td>           0</td><td>1</td><td>           0</td><td>1</td><td>           0</td><td>1</td><td>           1</td></tr>\n\t<tr><td class=\"h1\">0</td><td>0</td><td class=\"h1\">1</td><td>1</td><td class=\"h1\">0</td><td>0</td><td class=\"h1\">1</td></tr>\n\t<tr><td>           0</td><td>1</td><td>           1</td><td>1</td><td>           0</td><td>0</td><td>           1</td></tr>\n\t<tr><td class=\"h1\">1</td><td>1</td><td class=\"h1\">1</td><td>0</td><td class=\"h1\">0</td><td>0</td><td class=\"h1\">0</td></tr>\n\t<tr><td>           1</td><td>1</td><td>           1</td><td>1</td><td>           0</td><td>0</td><td>           0</td></tr>\n\t<tr><td class=\"h1\">0</td><td>0</td><td class=\"h1\">1</td><td>1</td><td class=\"h1\">1</td><td>1</td><td class=\"h1\">0</td></tr>\n</table></td>\n</tr></table>\n<p>The basic idea is that we're having a low-resolution image of the \"land\" and we're zooming in; in each zoom iteration we're adding random details - the randomly chosen numbers. This becomes apparent when we enlarge each image to the same dimensions:</p>\n<img src=\"img/zoomedgrown_1.png\"/>\n<img src=\"img/zoomedgrown_2.png\"/>\n<img src=\"img/zoomedgrown_3.png\"/>\n<img src=\"img/zoomedgrown_4.png\"/>\n<img src=\"img/zoomedgrown_5.png\"/>\n<img src=\"img/zoomedgrown_6.png\"/>\n<img src=\"img/zoomedgrown_7.png\"/>\n<p>As you can see, the areas take a nice random-looking shape, but the edges are a little bit too noisy. There's where the second most important operation comes in: the <b>\"Smooth\"</b> slightly reduces the array size (N -&gt; N - 2), losing the values on the edge of the array, and for the internal numbers it considers their 4 neighbors. If both the horizontal neighbors are the same and the vertical neighbors are the same (but not necessarily the same as the horizontal ones), the value is set randomly to either the horizontal or the vertical neihbors' value. If both the horizontal neighbors are the same, the value is set to the value of those neighbors, otherwise if both the vertical neighbors are the same, the value is set to the value of those neighbors. In all the rest cases, the value is kept at its original.</p>\n<table><tr>\n<td><table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n\t<tr><td align=\"center\"></td><td align=\"center\">a</td><td align=\"center\"></td></tr>\n\t<tr><td align=\"center\">b</td><td align=\"center\">X</td><td align=\"center\">c</td></tr>\n\t<tr><td align=\"center\"></td><td align=\"center\">d</td><td align=\"center\"></td></tr>\n</table></td>\n<td><table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n\t<tr><th align=\"center\">Condition</th><th>X becomes</th></tr>\n\t<tr><td align=\"center\">(a == d) && (b == c)</td><td align=\"center\">a or b (random)</td></tr>\n\t<tr><td align=\"center\">a == d</td><td align=\"center\">a</td></tr>\n\t<tr><td align=\"center\">b == c</td><td align=\"center\">b</td></tr>\n\t<tr><td align=\"center\">otherwise</td><td align=\"center\">X (unchanged)</td></tr>\n</table></td>\n</tr></table>\n<p>The following examples show how the decisions work:</p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"4px\">\n<tr><th>Input</th><th>Output</th><th>Notes</th></tr>\n<tr>\n<td><table>\n\t<tr><td/>                      <td class=\"bgb\">&nbsp;</td><td/></tr>\n\t<tr><td class=\"bgr\">&nbsp;</td><td class=\"bgg\">&nbsp;</td><td class=\"bgy\">&nbsp;</td></tr>\n\t<tr><td/>                      <td class=\"bgr\">&nbsp;</td><td/></tr>\n</table></td>\n<td align=\"center\"><table><tr><td class=\"bgg\">&nbsp;</td></tr></table></td>\n<td>Neither pair of neighbors are the same, so the value is left intact</td>\n</tr>\n<tr>\n<td><table>\n\t<tr><td/>                      <td class=\"bgb\">&nbsp;</td><td/></tr>\n\t<tr><td class=\"bgr\">&nbsp;</td><td class=\"bgg\">&nbsp;</td><td class=\"bgr\">&nbsp;</td></tr>\n\t<tr><td/>                      <td class=\"bgc\">&nbsp;</td><td/></tr>\n</table></td>\n<td align=\"center\"><table><tr><td class=\"bgr\">&nbsp;</td></tr></table></td>\n<td>Horizontal neighbors are the same, so the value is copied from them</td>\n</tr>\n<tr>\n<td><table>\n\t<tr><td/>                      <td class=\"bgb\">&nbsp;</td><td/></tr>\n\t<tr><td class=\"bgr\">&nbsp;</td><td class=\"bgg\">&nbsp;</td><td class=\"bgy\">&nbsp;</td></tr>\n\t<tr><td/>                      <td class=\"bgb\">&nbsp;</td><td/></tr>\n</table></td>\n<td align=\"center\"><table><tr><td class=\"bgb\">&nbsp;</td></tr></table></td>\n<td>Vertical neighbors are the same, so the value is copied from them</td>\n</tr>\n<tr>\n<td><table>\n\t<tr><td/>                      <td class=\"bgb\">&nbsp;</td><td/></tr>\n\t<tr><td class=\"bgr\">&nbsp;</td><td class=\"bgg\">&nbsp;</td><td class=\"bgr\">&nbsp;</td></tr>\n\t<tr><td/>                      <td class=\"bgb\">&nbsp;</td><td/></tr>\n</table></td>\n<td align=\"center\"><table><tr><td class=\"bgr\">&nbsp;</td></tr></table></td>\n<td>Each pair of neighbors are the same, so the value is chosen from one of the pairs randomly</td>\n</tr>\n</table>\n<p>This decision is repeated for each value in the array, for example:</p>\n<table>\n<tr>\n<td><table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n\t<tr><td>0</td><td>           0</td><td>           0</td><td>           1</td><td>           1</td><td>           1</td><td>1</td></tr>\n\t<tr><td>0</td><td class=\"h1\">1</td><td class=\"h1\">0</td><td class=\"h1\">1</td><td class=\"h1\">0</td><td class=\"h1\">1</td><td>1</td></tr>\n\t<tr><td>0</td><td class=\"h1\">0</td><td class=\"h1\">1</td><td class=\"h1\">1</td><td class=\"h1\">0</td><td class=\"h1\">0</td><td>1</td></tr>\n\t<tr><td>0</td><td class=\"h1\">1</td><td class=\"h1\">1</td><td class=\"h1\">1</td><td class=\"h1\">0</td><td class=\"h1\">0</td><td>1</td></tr>\n\t<tr><td>1</td><td class=\"h1\">1</td><td class=\"h1\">1</td><td class=\"h1\">0</td><td class=\"h1\">0</td><td class=\"h1\">0</td><td>0</td></tr>\n\t<tr><td>1</td><td class=\"h1\">1</td><td class=\"h1\">1</td><td class=\"h1\">1</td><td class=\"h1\">0</td><td class=\"h1\">0</td><td>0</td></tr>\n\t<tr><td>0</td><td>           0</td><td>           1</td><td>           1</td><td>           1</td><td>           1</td><td>0</td></tr>\n</table></td>\n<td>--- Smooth --&gt;</td>\n<td><table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n\t<tr><td class=\"hr\">0</td><td class=\"hh\">1</td><td class=\"hr\">0</td><td class=\"hh\">1</td><td class=\"ho\">1</td></tr>\n\t<tr><td class=\"hv\">1</td><td class=\"ho\">1</td><td class=\"hv\">1</td><td class=\"hv\">0</td><td class=\"ho\">0</td></tr>\n\t<tr><td class=\"ho\">1</td><td class=\"hh\">1</td><td class=\"ho\">1</td><td class=\"hv\">0</td><td class=\"hv\">0</td></tr>\n\t<tr><td class=\"hh\">1</td><td class=\"hv\">1</td><td class=\"hv\">1</td><td class=\"hh\">0</td><td class=\"hh\">0</td></tr>\n\t<tr><td class=\"hh\">1</td><td class=\"hh\">1</td><td class=\"ho\">1</td><td class=\"ho\">0</td><td class=\"hh\">0</td></tr>\n</table></td>\n</tr>\n<tr><td>Highlighted area is processed into output</td>\n<td/>\n<td>\n<span class=\"ho\">Original value kept</span><br/>\n<span class=\"hr\">Value forced by both horizontal and vertical neighbors, random</span><br/>\n<span class=\"hh\">Value forced by horizontal neighbors</span><br/>\n<span class=\"hv\">Value forced by vertical neighbors</span>\n</td></table>\n<p>The following example shows multiple successive Smooth operations performed on the same data set over and over again:</p>\n<img src=\"img/smoothedgrown_1.png\"/>\n<img src=\"img/smoothedgrown_2.png\"/>\n<img src=\"img/smoothedgrown_3.png\"/>\n<img src=\"img/smoothedgrown_4.png\"/>\n<img src=\"img/smoothedgrown_5.png\"/>\n<img src=\"img/smoothedgrown_6.png\"/>\n<img src=\"img/smoothedgrown_7.png\"/>\n<p>As you can see, the smoothing operation doesn't make much difference after its first pass, so it usually isn't used more than once after each zoom.</p>\n<p>One important thing to note is that both the Zoom and Smooth operations only output the numbers already present in the array, they don't create new numbers. This is important because it allows the late stages of the generator to grow indepent biomes next to each other without them \"bleeding\" into different biomes on their edges.</p>\n<p>The Grown generator uses several more supplementary operations, such as \"AddIslands\", \"ReplaceRandomly\", \"River\", \"Beaches\" and more. There isn't anything too special to those, they perform mostly trivial operations, manipulating the numbers in some way; the main power of the generator lies in the zoom and smooth operations. Perhaps noteworthy is the generation of rivers: it starts with the regular bitmap (only 0 and 1 used), zooms in and smooths for a while and then performs edge detection - a river biome is set in pixels whose neighbors are different, and no change applied when the neighbors are the same. Among other things, this means that there are actually two chains of array operations, and their results are combined together in the \"MixRivers\" operation.</p>\n<p>The following table summarizes the operations, visually:</p>\n<table border=\"1\" cellpadding=\"2\" cellspacing=\"1\">\n<tr><th>Operation</th><th>Input 1</th><th>Input 2</th><th>Output</th><th>Notes</th></tr>\n<tr>\n\t<td>AddIslands</td>\n\t<td><img src=\"img/grownexample_in1.png\"/></td>\n\t<td>-</td>\n\t<td><img src=\"img/grownexample_add_islands.png\"/></td>\n\t<td>Adds a configurable (by percentage) amount of islands to ocean biome group.</td>\n</tr>\n<tr>\n\t<td>AlternateBiomes</td>\n\t<td><img src=\"img/grownexample_in3.png\"/></td>\n\t<td><img src=\"img/grownexample_in_alt.png\"/></td>\n\t<td><img src=\"img/grownexample_alt_biomes.png\"/></td>\n\t<td>Mostly copies the first input, but where the second input has non-ocean biome group, turns the first input's biomes into their alternatives.</td>\n</tr>\n<tr>\n\t<td>Beaches</td>\n\t<td><img src=\"img/grownexample_in3.png\"/></td>\n\t<td>-</td>\n\t<td><img src=\"img/grownexample_beaches.png\"/></td>\n\t<td>Any biome neighboring an ocean is turned into a corresponding beach.</td>\n</tr>\n<tr>\n\t<td>BiomeEdges</td>\n\t<td><img src=\"img/grownexample_in3.png\"/></td>\n\t<td>-</td>\n\t<td><img src=\"img/grownexample_biome_edges.png\"/></td>\n\t<td>If the neighbors of a biome are incompatible (such as desert vs ice plains, or jungle vs anything etc.), turns the biome into a corresponding neutral biome (plains, jungle-edge etc.)</td>\n</tr>\n<tr>\n\t<td>Biomes</td>\n\t<td><img src=\"img/grownexample_in2.png\"/></td>\n\t<td>-</td>\n\t<td><img src=\"img/grownexample_biomes.png\"/></td>\n\t<td>Input is interpreted as biome groups, for each point a random biome corresponding to the group is chosen for the output.</td>\n</tr>\n<tr>\n\t<td>BiomeGroupEdges</td>\n\t<td><img src=\"img/grownexample_in1.png\"/></td>\n\t<td>-</td>\n\t<td><img src=\"img/grownexample_grp_edges.png\"/></td>\n\t<td>Converts biome groups on an edge between two incompatible groups (such as desert and ice) into a neutral one (temperate).</td>\n</tr>\n<tr>\n\t<td>MBiomes</td>\n\t<td><img src=\"img/grownexample_in3.png\"/></td>\n\t<td><img src=\"img/grownexample_in_alt.png\"/></td>\n\t<td><img src=\"img/grownexample_m_biomes.png\"/></td>\n\t<td>Where the second input is zero, copies the first input's biomes; where the second input is nonzero, converts first input's biomes into their M variants. </td>\n</tr>\n<tr>\n\t<td>MixRivers</td>\n\t<td><img src=\"img/grownexample_in3.png\"/></td>\n\t<td><img src=\"img/grownexample_in_river.png\"/></td>\n\t<td><img src=\"img/grownexample_mix_river.png\"/></td>\n\t<td>Copies first input's biomes into the output, unless there's a river biome in the second input and a land biome in the first input - then it sets a river biome in the output instead.</td>\n</tr>\n<tr>\n\t<td>River</td>\n\t<td><img src=\"img/grownexample_in2.png\"/></td>\n\t<td>-</td>\n\t<td><img src=\"img/grownexample_river.png\"/></td>\n\t<td>Somewhat of an edge detector - wherever the input has a different biome neighbors, sets a river biome; otherwise sets an ocean biome.</td>\n</tr>\n<tr>\n\t<td>SetRandomly</td>\n\t<td><img src=\"img/grownexample_in3.png\"/></td>\n\t<td>-</td>\n\t<td><img src=\"img/grownexample_set_rnd.png\"/></td>\n\t<td>Randomly sets points to a specified biome. The amount of changed points is settable as a percentage.</td>\n</tr>\n</table>\n\n\n<p>Of further note is the existence of two sets of the IntGen classes, representing the individual operations. There are the cProtIntGen class descendants, which are used for prototyping the connections between the operations - it's easy to just chain several operations after each other and they automatically use the correct array dimensions. However, it is possible to further optimize the calculations by moving the array dimensions into template parameters (so that they are, in fact, constant from the code's point of view, and so highly optimizable). This is what the cIntGen class descendants do. Unfortunately, this optimization makes it difficult to change the operation chain - when a new operation is added or removed in the chain, the array sizes for the rest of the chain change and they all have to be updated manually. So the optimal strategy was to use the cProtIntGen classes to find out the best-looking combination of operations, and once the combination was found, to rewrite it using cIntGen classes for performance.\n</p>\n\n<br />\n\nHere is a visualizer where you can play with the algorithm that the Grown biome generator uses. Note that rendering the map takes way longer than the zoom/smooth operation.\n<table>\n\t<tr>\n\t\t<td rowspan=\"5\">\n\t\t\t<canvas id=\"stage\" width=\"600\" height=\"600\"></canvas>\n\t\t\t<noscript>JavaScript is needed to use the visualizer</noscript>\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td>\n\t\t\t<button id=\"grownZoomButton\" onclick=\"btnZoom(event.target)\">Zoom</button>\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td>\n\t\t\t<button onclick=\"btnSmooth()\">Smooth</button>\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td>\n\t\t\t<button onclick=\"btnReset()\">Reset</button>\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td>\n\t\t\t<button onclick=\"btnAutomatic(event.target)\">Auto</button>\n\t\t</td>\n\t</tr>\n</table>\n\n<hr />\n\n<a name=\"heightgen\"><h2>Terrain height</h2></a>\n<p>As with biomes, the easiest way to generate terrain height is not generating at all - assigning a constant\nheight value to all columns. This is again useful either for internal tests, and for worlds like MineCraft's\nFlat world.</p>\n\n<p>For a somewhat more realistic landscape, we will employ the good old 2D Perlin noise. We can use it\ndirectly as a heightmap - each value we get from the noise is stretched into the desired range (usually from\n40 to 120 blocks for regular MineCraft worlds) and used as the height value. However, this doesn't play too\nwell with the biomes we've just generated. If the biome says \"ocean\" and the Perlin noise says \"mountain\",\nthe end result will be unpleasant.</p>\n\n<p>So we want a height generator that is biome-aware. The easiest way of doing this is to have a separate\ngenerator for each biome. Simply use the biome map to select which generator to use, then ask the appropriate\ngenerator for the height value. Again, this doesn't work too well - imagine an ExtremeHills biome right next\nto an Ocean biome. If no extra care is taken, the border between these two will be a high wall. The following\nimage shows a 2D representation (for simplification purposes) of the problem:</p>\n<img src=\"img/biomeheights.jpg\" />\n\n<p>This requires some further processing. What we need is for the terrain height to be dependent not only on\nthe immediate biome for that column, but also on the close surroundings of the column. This is exactly the\nkind of task that averaging is designed for. If we take the area of 9x9 biomes centered around the queried\ncolumn, generate height for each of the biomes therein, sum them up and divide by 81 (the number of biomes\nsummed), we will be effectively making a 9-long running average over the terrain, and all the borders will\nsuddenly become smooth. The following image shows the situation from the previous paragraph after applying\nthe averaging process: </p>\n<img src=\"img/biomeheightsavg.jpg\" />\n\n<p>The approach used in Cuberite's Biomal generator is based on this idea, with two slight modifications.\nInstead of using a separate generator for each biome, one generator is used with a different set of input\nparameters for each biomes. These input parameters modify the overall amplitude and frequency of the Perlin\nnoise that the generator produces, thus modifying the final terrain with regards to biomes. Additionally, the\naveraging process is weighted - columns closer to the queried column get a more powerful weight in the sum\nthan the columns further away. The following image shows the output of Cuberite's Biomal terrain height\ngenerator (each block type represents a different biome - ocean in the front (stone), plains and ice plains\nbehind it (lapis, whitewool), extreme hills back right (soulsand), desert hills back left (mossy\ncobble)):</p>\n<a name=\"biomalheights\"><img src=\"img/biomalheights.jpg\" /></a>\n\n<p>One key observation about this whole approach is that in order for it to work, the biomes must be\navailable for columns outside the currently generated chunk, otherwise the columns at the chunk's edge would\nnot be able to properly average their height. This requirement can be fulfilled only by biome generators that\nadhere to the second <a href=\"#expectedproperties\">Expected property</a> - that re-generating will produce\nthe same data. If the biome generator returned different data for the same chunk each time it was invoked, it\nwould become impossible to apply the averaging.</p>\n\n<p>(TODO: height with variations (N/A in MCS yet)</p>\n\n\n<hr />\n\n<a name=\"compositiongen\"><h2>Terrain composition</h2></a>\n<p>As with the other generators, the composition generator category has its easy and debugging items, too.\nThere's the \"special\" composition of \"all the blocks are the same type\", which fills the entire column, from\nthe bottom to the height, with a single blocktype. This generator is useful when testing the generators in\nthe other categories, to speed up the generation by leaving out unnecessary calculations. Another special\ncompositor is a similar one, that fills all blocks with the same type, but the type varies for each biome.\nThis way it's easy to see the generated biomes and possibly the heights for those biomes, as shown in the\nprevious section on the <a href=\"#biomalheights\">height averaging screenshot</a>.</p>\n\n<p>For a natural look, we need to put together a more complicated algorithm. The standard set forth in\nMineCraft is that the top of the world is covered in grass, then there are a few blocks of dirt and finally\nstone. This basic layout is then varied for different biomes - deserts have sand and sandstone instead of the\ngrass and dirt layer. Mushroom biomes have mycelium in place of the grass. This per-biome dependency is\ntrivial to implement - when compositing, simply use the appropriate layout for the column's biome.</p>\n\n<p>The next change concerns oceans. The generated heightmap doesn't include any waterlevel indication\nwhatsoever. So it's up to the terrain compositor to actually decide where to place water. We do this by\nconfiguration - simply have a value in the config file specifying the sealevel height. The compositor then\nhas to add water above any column which has a height lower than that. Additionally, the water needs to\noverride per-biome layout selection - we don't want grass blocks to generate under water when the terrain\nheight in the plains biome drops below the sealevel accidentally.</p>\n\n<p>The final feature in the compositor is the decision between multiple composition layouts within a single\nbiome. A megataiga biome contains patches of non-grass dirt and podzol blocks, and the ocean floor can be\nmade of dirt, gravel, sand or clay. A simple 2D Perlin noise can be used to select the layout to use for a\nspecific column - simply threshold the noise's value by as many thresholds as there are layout variations,\nand use the layout corresponding to the threshold:</p>\n<img src=\"img/perlincompositor1.jpg\" />\n<img src=\"img/perlincompositor2.jpg\" />\n<img src=\"img/perlincompositor3.jpg\" />\n\n<h3>Nether composition</h3>\n<p>So far we've been discussing only the Overworld generator. But MineCraft contains more than that. The\nNether has a completely different look and feel, and quite different processes are required to generate that.\nRecall that MineCraft's Nether is 128 blocks high, with bedrock both at the top and the bottom. Between these\ntwo, the terrain looks more like a cavern than a surface. Not surprisingly, the Nether doesn't need a\ncomplicated height generator, it can use the flat height. However, the terrain composition must take an\naltogether different approach.</p>\n\n<p>The very first idea is to use the Perlin noise, but generate it in 3D, rather than 2D. Then, for each\nblock, evaluate the noise value, if below 0, make it air, if not, make it netherrack.\n\n<p>To make it so that the bedrock at the top and at the bottom is never revealed, we can add a value\nincreasing the more the Y coord gets towards the bottom or the top. This way the thresholding then guarantees\nthat there will be no air anywhere near the bedrock.</p>\n\n<p>(TODO)</p>\n\n\n<hr />\n\n<a name=\"finishgen\"><h2>Finishers</h2></a>\n<p>Finishers are a vast category of various additions to the terrain generator. They range from very easy\nones, such as generating snow on top of the terrain in cold biomes, through medium ones, such as growing\npatches of flowers, complicated ones, such as placing trees and generating caves, all the way to very\ncomplicated ones such as villages and nether fortresses. There is no formal distinction between all these\n\"categories\", the only thing they have in common is that they take a chunk of blocks and modify it in some\nway.</p>\n\n<h3>Snow</h3>\n<p>Snow is probably the easiest of the finishers. It generates a block of snow on top of each block that is\non top of the terrain and is not marked as non-snowable. It checks the chunk's heightmap to determine the top\nblock, then checks whether the block supports snow on its top. Rails, levers and tall grass don't support\nsnow, for example.</p>\n\n<h3>Ice</h3>\n<p>Another example of an easy finisher. This scans through the world and turn each water block on the surface\ninto an ice block if the biome is cold. This means that any water block that is under any kind of other\nblock, such as under a tree's leaves, will still stay water. Thus an additional improvement could be made by\nscanning down from the surface block through blocks that we deem as non-surface, such as leaves, torches,\nladders, fences etc. Note that Cuberite currently implements only the easy solution.</p>\n\n<h3>Bottom lava</h3>\n<p>Most worlds in MineCraft have lava lakes at their bottom. Generating these is pretty straightforward: Use\nthe user-configured depth and replace all the air blocks below this depth with lava blocks. Note however,\nthat this makes this generator dependent on the order in which the finishers are applied. If the mineshafts\ngenerate before bottom lava, the mineshafts that are below the lava level will get filled with lava. On the\nother hand, if bottom lava is generated before the mineshafts, it is possible for a mineshaft to \"drill\nthrough\" a lake of lava. Cuberite doesn't try to solve this and instead lets the admin choose whichever they\nprefer.</p>\n\n<h3>Specific foliage</h3>\n<p>There are generators for specific kinds of foliage. The dead bushes in the desert biome and lilypads in\nthe swamp biome both share the same generating pattern. They are both specific to a single biome and they\nboth require a specific block underneath them in order to generate. Their implementation is simple: pick\nseveral random columns in the chunk. If the column is of the correct biome and has the correct top block,\nadd the foliage block on top.</p>\n\n<p>In order to generate the same set of coordinates when the chunk is re-generated, we use the Perlin noise's\nbasis functions (the ones providing the random values for Perlin cell vertices). These basically work as a\nhash function for the coorinates - the same input coordinates generate the same output value. We use the\nchunk's coordinates as two of the coords, and the iteration number as the third coordinate, to generate a\nrandom number. We then check the biome and the top block at those coordinates, if they allow, we generate the\nfoliage block on top.</p>\n\n<p>Another example of specific foliage is the tall grass in the plains biome. There are quite a lot of these\ntall grass blocks, it would be inefficient to generate them using the random-coords approach described above.\nInstead, we will use a 2D Perlin noise again, with a threshold defining where to put the grass and where\nnot.</p>\n\n<h3>Small foliage</h3>\n<p>For the flowers, grass, mushrooms in caves etc. we want to use a slightly different algorithm. These\nfoliage blocks are customarily generated in small \"clumps\" - there are several blocks of the same type near\ntogether. To generate these, we first select random coords, using the coord hash functions, for a center of a\nclump. Then we select the type of block to generate. Finally, we loop over adding a random (coord hash)\nnumber to the clump center coords to get the block where to generate the foliage block:</p>\n<img src=\"img/smallfoliageclumps.jpg\" />\n\n<p>In order to make the clump more \"round\" and \"centered\", we want the offsets to be closer to the clump\ncenter more often. This is done using a thing called Gaussian function distribution. Instead of having each\nrandom number generate with the same probability, we want higher probability for the numbers around zero,\nlike this:</p>\n<img src=\"img/gaussprobability.jpg\" />\n\n<p>Instead of doing complicated calculations to match this shape exactly, we will use a much easier shape.\nBy adding together two random numbers in the same range, we get the probability distribution that has a\n\"roof\" shape, enough for our needs:</p>\n<img src=\"img/roofprobability.jpg\" />\n\n<p>(For the curious, there is a proof that adding together infinitely many uniform-distributed random numbers\nproduces random numbers with the Gaussian distribution.)</p>\n\n<p>This scheme can be used to produce clumps of flowers, when we select the 2D coords of the clump center on\nthe top surface of the terrain. We simply generate the 2D coords of the foliage blocks and use the terrain\nheight to find the third coord. If we want to generate clumps of mushrooms in the caves, however, we need to\ngenerate the clump center coords in 3D and either use 3 offsets for the mushrooms, or use 2 offsets plus\nsearching for the closest opening Y-wise in the terrain.</p>\n\n<p>Note that the clumps generated by this scheme may overlap several chunks. Therefore it's crucial to\nactually check the surrounding chunks if their clumps overlap into the currently generated chunk, and apply\nthose as well, otherwise there will be visible cuts in the foliage along the chunks borders.</p>\n\n<h3>Springs</h3>\n<p>Water and lava springs are essential for making the underground quite a lot more interesting. They are\nrather easy to generate, but a bit more difficult to get right. Generating simply means that a few random\nlocations (obtained by our familiar coord hashing) are checked and if the block type in there is stone. Then\nwe see all the horizontal neighbors of the block, plus the block underneath. If all of them except one are\nstone, and the one left is air, our block is suitable for turning into a spring. If there were more air\nneighbors, the spring would look somewhat unnatural; if there were no air neighbors, the spring won't flow\nanywhere, so it would be rather useless.</p>\n\n<p>The difficult part about springs is the amount of them to generate. There should be a few springs on the\nsurface, perhaps a bit more in the mountaineous biomes. There should be quite a few more springs underground,\nbut there should definitely be more water springs than lava springs in the upper levels of the terrain, while\nthere should be more lava springs and almost no water springs near the bottom. To accomodate this, the\nCuberite team has made a tool that scanned through MineCraft's terrain and counted the amount of both types\nof springs in relation to their height. Two curves have been found for the distribution of each type of the\nspring:</p>\n<img src=\"img/vanilla_springs_huge.png\" />\n\n<p>Cuberite uses an approximation of the above curves to choose the height at which to generate the\nspring.</p>\n\n<h3>Caves</h3>\n<p>Caves are definitely one of the main things people notice about MineCraft terrain. There are quite a lot\nof different algorithms available to generate terrain with caves, each with different results. Cuberite currently implements three finishers that generate caves:</p>\n<ul>\n<li>MarbleCaves</li>\n<li>DualRidgeCaves</li>\n<li>WormNestCaves</li>\n</ul>\n<p></p>\n\n<hr />\n\n<a name=\"makefaster\"><h2>Making it all faster</h2></a>\n<p>(TODO)</p>\n\n<a name=\"GPU\"><h2>Executing on a GPU</h2></a>\n<p>Much of the terain generation consists of doing the same thing for every single column or block in a chunk. This\nsort of computation is much faster on a GPU as GPUs are massively parallel. High end GPUs can execute up to 30,000\nthreads simultaneously, which would allow them to generate every block in half a chunk in parallel or every column\nin over 100 chunks in parallel. A naive comparison suggests that a 800MHz GPU with 15,000 threads can execute parallel\ncode 250 times faster than a 3GHz CPU with 128 bit SIMD. Obviously we want to harness that power.</p>\n</body>\n</html>\n"
  },
  {
    "path": "dev-docs/Login sequence.txt",
    "content": "\nThis is the connection sequence of the 1.6.2 client to a vanilla server, after the encryption has been established:\n\nS->C: 0xfc (encryption key response) empty payload (4 * 0x00)\nC->S: 0xcd (client statuses)\nS->C: 0x01 (login)\nS->C: 0xfa (plugin message) - \"MC|Brand\": \"vanilla\"\nS->C: 0x06 (compass)\nS->C: 0xca (player capabilities)\nS->C: 0x10 (slot select)\nS->C: 0x04 (time update)\nS->C: 0xc9 (player list item)\nS->C: 0x0d (player pos + look)\nS->C: 0x04 (time update)\nS->C: 0x68 (window contents)\nS->C: 0x67 (slot contents) - Window -1, slot -1\nS->C: 0x67 (slot contents) - Window 0, slot 9 .. 44, only occupied slots\nS->C: 0x38 (chunk bulk)\nS->C: 0x28 (entity metadata) player metadata\nS->C: 0x2c (entity properties) player properties\nS->C: 0x04 (time update)\nS->C: 0x38 (chunk bulk)\nC->S: 0xcc (client settings / locale and view)\nC->S: 0xfa (plugin message) - \"MC|Brand\": \"vanilla\"\nC->S: 0x0d (player pos + look)\nS->C: 0x38 (chunk bulk)"
  },
  {
    "path": "dev-docs/NBT Examples/single chunk NBT data.txt",
    "content": "TAG_Compound(\"\"): 1 items\n{\n TAG_Compound(\"Level\"): 10 items\n {\n  TAG_List(\"TileTicks\"): 0 items of type 1\n  {\n  }\n  TAG_List(\"Entities\"): 0 items of type 1\n  {\n  }\n  TAG_ByteArray(\"Biomes\"): 256 bytes\n  TAG_Long(\"LastUpdate\"): 1041959\n  TAG_Int(\"xPos\"): 0\n  TAG_Int(\"zPos\"): 0\n  TAG_List(\"TileEntities\"): 0 items of type 1\n  {\n  }\n  TAG_Byte(\"TerrainPopulated\"): 1\n  TAG_List(\"Sections\"): 6 items of type 10\n  {\n   TAG_Compound(\"\"): 5 items\n   {\n    TAG_ByteArray(\"Data\"): 2048 bytes\n    TAG_ByteArray(\"SkyLight\"): 2048 bytes\n    TAG_ByteArray(\"BlockLight\"): 2048 bytes\n    TAG_Byte(\"Y\"): 0\n    TAG_ByteArray(\"Blocks\"): 4096 bytes\n   }\n   TAG_Compound(\"\"): 5 items\n   {\n    TAG_ByteArray(\"Data\"): 2048 bytes\n    TAG_ByteArray(\"SkyLight\"): 2048 bytes\n    TAG_ByteArray(\"BlockLight\"): 2048 bytes\n    TAG_Byte(\"Y\"): 1\n    TAG_ByteArray(\"Blocks\"): 4096 bytes\n   }\n   TAG_Compound(\"\"): 5 items\n   {\n    TAG_ByteArray(\"Data\"): 2048 bytes\n    TAG_ByteArray(\"SkyLight\"): 2048 bytes\n    TAG_ByteArray(\"BlockLight\"): 2048 bytes\n    TAG_Byte(\"Y\"): 2\n    TAG_ByteArray(\"Blocks\"): 4096 bytes\n   }\n   TAG_Compound(\"\"): 5 items\n   {\n    TAG_ByteArray(\"Data\"): 2048 bytes\n    TAG_ByteArray(\"SkyLight\"): 2048 bytes\n    TAG_ByteArray(\"BlockLight\"): 2048 bytes\n    TAG_Byte(\"Y\"): 3\n    TAG_ByteArray(\"Blocks\"): 4096 bytes\n   }\n   TAG_Compound(\"\"): 5 items\n   {\n    TAG_ByteArray(\"Data\"): 2048 bytes\n    TAG_ByteArray(\"SkyLight\"): 2048 bytes\n    TAG_ByteArray(\"BlockLight\"): 2048 bytes\n    TAG_Byte(\"Y\"): 4\n    TAG_ByteArray(\"Blocks\"): 4096 bytes\n   }\n   TAG_Compound(\"\"): 5 items\n   {\n    TAG_ByteArray(\"Data\"): 2048 bytes\n    TAG_ByteArray(\"SkyLight\"): 2048 bytes\n    TAG_ByteArray(\"BlockLight\"): 2048 bytes\n    TAG_Byte(\"Y\"): 5\n    TAG_ByteArray(\"Blocks\"): 4096 bytes\n   }\n  }\n }\n}\n"
  },
  {
    "path": "dev-docs/NBT Examples/tile entities.txt",
    "content": "TAG_List(\"TileEntities\"): 3 items of type 10\n{\n TAG_Compound(\"\"): 6 items\n {\n  TAG_String(\"id\"): 10 bytes: \"MobSpawner\"\n  TAG_Short(\"Delay\"): 20\n  TAG_Int(\"z\"): 180\n  TAG_String(\"EntityId\"): 6 bytes: \"Spider\"\n  TAG_Int(\"y\"): 11\n  TAG_Int(\"x\"): -6\n }\n TAG_Compound(\"\"): 5 items\n {\n  TAG_List(\"Items\"): 6 items of type 10\n  {\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 325\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 1\n    TAG_Byte(\"Slot\"): 3\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 296\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 4\n    TAG_Byte(\"Slot\"): 5\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 325\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 1\n    TAG_Byte(\"Slot\"): 11\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 351\n    TAG_Short(\"Damage\"): 3\n    TAG_Byte(\"Count\"): 1\n    TAG_Byte(\"Slot\"): 13\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 296\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 1\n    TAG_Byte(\"Slot\"): 14\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 287\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 2\n    TAG_Byte(\"Slot\"): 15\n   }\n  }\n  TAG_String(\"id\"): 5 bytes: \"Chest\"\n  TAG_Int(\"z\"): 182\n  TAG_Int(\"y\"): 11\n  TAG_Int(\"x\"): -7\n }\n TAG_Compound(\"\"): 5 items\n {\n  TAG_List(\"Items\"): 5 items of type 10\n  {\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 289\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 1\n    TAG_Byte(\"Slot\"): 5\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 329\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 1\n    TAG_Byte(\"Slot\"): 12\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 265\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 4\n    TAG_Byte(\"Slot\"): 17\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 296\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 4\n    TAG_Byte(\"Slot\"): 21\n   }\n   TAG_Compound(\"\"): 4 items\n   {\n    TAG_Short(\"id\"): 289\n    TAG_Short(\"Damage\"): 0\n    TAG_Byte(\"Count\"): 2\n    TAG_Byte(\"Slot\"): 22\n   }\n  }\n  TAG_String(\"id\"): 5 bytes: \"Chest\"\n  TAG_Int(\"z\"): 181\n  TAG_Int(\"y\"): 11\n  TAG_Int(\"x\"): -8\n }\n}"
  },
  {
    "path": "dev-docs/Object ownership.gv",
    "content": "digraph\n{\nrankdir=LR\nRoot -> Server\nRoot -> MonsterConfig\nRoot -> GroupManager\nRoot -> CraftingRecipes\nRoot -> FurnaceRecipe\nRoot -> PluginManager\nRoot -> Authenticator\nRoot -> World\nServer -> ListenThreadIPv4\nServer -> ListenThreadIPv6\nServer -> ClientHandle\nServer -> RCONServer\nPluginManager -> Plugin_NewLua\nPluginManager -> Plugin\nWorld -> SimulatorManager\nWorld -> SandSimulator\nWorld -> WaterSimulator\nWorld -> LavaSimulator\nWorld -> FireSimulator\nWorld -> RedstoneSimulator\nWorld -> WorldStorage\nWorld -> Player\nWorld -> Generator\nWorld -> ChunkSender\nWorld -> LightingThread\n}"
  },
  {
    "path": "dev-docs/Plugin API.md",
    "content": "# Looking for the API documentation for Lua plugins?\n\nSee the [cuberite website](https://api.cuberite.org/) or browse the [source](https://github.com/cuberite/cuberite/tree/master/Server/Plugins/APIDump).\n"
  },
  {
    "path": "dev-docs/SocketThreads states.gv",
    "content": "digraph\n{\n\tnode\n\t[\n\t\tshape=\"box\"\n\t]\n\n\tedge\n\t[\n\t\td\n\t]\n\n\t// Forward-declarations of nodes (so that they are laid out in a specific order:\n\tssNormal\n\tssWritingRestOut\n\tssShuttingDown\n\tssShuttingDown2\n\n\t// Nodes with special labels / shapes:\n\tForceClose\n\t[\n\t\tlabel=\"Force close\"\n\t\tshape=\"ellipse\"\n\t]\n\tX\n\t[\n\t\tlabel=\"Socket closed\"\n\t\tshape=\"ellipse\"\n\t]\n\n\t// Edges:\n\tssNormal -> ssWritingRestOut\n\t[\n\t\tlabel=\"cSocketThreads::RemoveClient()\"\n\t]\n\tssWritingRestOut -> ssShuttingDown\n\t[\n\t\tlabel=\"All outgoing data written\"\n\t]\n\tssShuttingDown -> ssShuttingDown2\n\t[\n\t\tlabel=\"One thread loop\"\n\t]\n\tssShuttingDown2 -> ForceClose\n\t[\n\t\tlabel=\"One thread loop\"\n\t]\n\tssNormal -> ssRemoteClosed\n\t[\n\t\tlabel=\"Remote closed\"\n\t\tcolor=\"red\"\n\t\tfontcolor=\"red\"\n\t]\n\tssWritingRestOut -> X\n\t[\n\t\tlabel=\"Remote closed\"\n\t\tcolor=\"red\"\n\t\tfontcolor=\"red\"\n\t]\n\tssShuttingDown -> X\n\t[\n\t\tlabel=\"Remote closed\"\n\t\tcolor=\"red\"\n\t\tfontcolor=\"red\"\n\t]\n\tssShuttingDown2 -> X\n\t[\n\t\tlabel=\"Remote closed\"\n\t\tcolor=\"red\"\n\t\tfontcolor=\"red\"\n\t]\n\tssRemoteClosed -> X\n\t[\n\t\tlabel=\"cSocketThreads::RemoveClient()\"\n\t]\n\tForceClose -> X\n}\n"
  },
  {
    "path": "dev-docs/_files.txt",
    "content": "\nContents of this folder:\n\nAPI class inheritance - blockentities.gv\n\t- a GraphViz file to visualise inheritance in the API classes in the Wiki for the cBlockEntity class' descendants\n\nAPI class inheritance - entities.gv\n\t- a GraphViz file to visualise inheritance in the API classes in the Wiki for the cEntity class' descendants\n\nLogin Sequence.txt\n\t- Annotated log of packets exchanged between the client and server for login; 1.6.2 protocol\n\nObject ownership.gv\n\t- a GraphViz file to visualise ownership relations in the Cuberite code architecture\n\nSocketThreads states.gv\n\t- a GraphViz file documenting the states for individual sockets in cSocketThreads, and transitions between them\n\nSprings.ods\n\t- a spreadsheet with collected statistics about the occurrence of lava / water springs based on height.\n"
  },
  {
    "path": "dev-docs/js/ValueMap.js",
    "content": "\nconst g_DistanceBetweenSquares = 0;//.01;\nconst g_Colors = [\n\t\"#0000FF\",\n\t\"#00FF00\",\n\t\"#FF0000\",\n\t\"#FF00FF\",\n\t\"#00FFFF\",\n\t\"#FFFF00\",\n\t\"#000000\",\n\t\"#9BADFF\"\n]\n\nclass ValueMap {\n\tconstructor() {\n\t\tthis.values = new Uint8Array(4 * 4);\n\t\tthis.sizeX = 4;\n\t\tthis.sizeZ = 4;\n\t\tthis.reset();\n\t}\n\n\n\treset() {\n\t\tthis.sizeX = 4;\n\t\tthis.sizeZ = 4;\n\t\tthis.values = new Uint8Array(this.sizeX * this.sizeZ);\n\n\t\tfor (let x = 0; x < this.sizeX; x++)\n\t\t{\n\t\t\tfor (let z = 0; z < this.sizeZ; z++)\n\t\t\t{\n\t\t\t\tthis.values[x + this.sizeZ * z] = Math.floor(Math.random() * 8);\n\t\t\t}\n\t\t}\n\t}\n\n\n\tchooseRandomNumber() {\n\t\tlet numArguments = arguments.length;\n\t\treturn arguments[Math.floor(Math.random() * arguments.length)];\n\t}\n\n\n\tsmooth() {\n\t\tlet sizeZ = this.sizeZ - 2;\n\t\tlet sizeX = this.sizeX - 2;\n\t\tlet cache = new Uint8Array((this.sizeX - 2) * (this.sizeZ - 2));\n\t\tfor (let z = 0; z < sizeZ; z++)\n\t\t{\n\t\t\tfor (let x = 0; x < sizeX; x++)\n\t\t\t{\n\t\t\t\tlet val   = this.values[x + 1 + (z + 1) * this.sizeX];\n\t\t\t\tlet above = this.values[x + 1 + z       * this.sizeX];\n\t\t\t\tlet below = this.values[x + 1 + (z + 2) * this.sizeX];\n\t\t\t\tlet left  = this.values[x     + (z + 1) * this.sizeX];\n\t\t\t\tlet right = this.values[x + 2 + (z + 1) * this.sizeX];\n\n\t\t\t\tif ((left == right) && (above == below))\n\t\t\t\t{\n\t\t\t\t\tif (Math.random() < 0.5)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = left;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tval = below;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (left == right)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = left;\n\t\t\t\t\t}\n\t\t\t\t\tif (above == below)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = above;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcache[x + z * sizeX] = val;\n\t\t\t}\n\t\t}\n\t\tthis.values = cache;\n\t\tthis.sizeX -= 2;\n\t\tthis.sizeZ -= 2;\n\t}\n\n\n\tzoom() {\n\t\tlet lowStepX = (this.sizeX - 1) * 2;\n\t\tlet lowStepZ = (this.sizeZ - 1) * 2;\n\t\tlet cache = new Uint8Array(lowStepX * lowStepZ);\n\t\tfor (let z = 0; z < this.sizeZ - 1; z++)\n\t\t{\n\t\t\tlet idx = (z * 2) * lowStepX;\n\t\t\tlet PrevZ0 = this.values[z * this.sizeX];\n\t\t\tlet PrevZ1 = this.values[(z + 1) * this.sizeX];\n\n\t\t\tfor (let x = 0; x < this.sizeX - 1; x++)\n\t\t\t{\n\t\t\t\tlet ValX1Z0 = this.values[x + 1 + z * this.sizeX];\n\t\t\t\tlet ValX1Z1 = this.values[x + 1 + (z + 1) * this.sizeX];\n\t\t\t\tcache[idx] = PrevZ0;\n\t\t\t\tcache[idx + lowStepX] = this.chooseRandomNumber(PrevZ0, PrevZ1);\n\t\t\t\tcache[idx + 1] = this.chooseRandomNumber(PrevZ0, ValX1Z0);\n\t\t\t\tcache[idx + 1 + lowStepX] = this.chooseRandomNumber(PrevZ0, ValX1Z0, PrevZ1, ValX1Z1);\n\t\t\t\tidx += 2;\n\t\t\t\tPrevZ0 = ValX1Z0;\n\t\t\t\tPrevZ1 = ValX1Z1;\n\t\t\t}\n\t\t}\n\t\tthis.values = cache;\n\t\tthis.sizeX = lowStepX;\n\t\tthis.sizeZ = lowStepZ;\n\t}\n\n\n\tvisualize(context, canvas) {\n\t\tcontext.clearRect(0, 0, canvas.width, canvas.height);\n\t\tconst squareSizeX = canvas.width / (this.sizeX - 1) - g_DistanceBetweenSquares;\n\t\tconst squareSizeY = canvas.height / (this.sizeZ - 1) - g_DistanceBetweenSquares;\n\t\tfor (let x = 0; x < this.sizeX - 1; x++)\n\t\t{\n\t\t\tfor (let y = 0; y < this.sizeZ - 1; y++)\n\t\t\t{\n\t\t\t\tlet renderX = canvas.width / (this.sizeX - 1) * x + g_DistanceBetweenSquares;\n\t\t\t\tlet renderY = canvas.height / (this.sizeZ - 1) * y + g_DistanceBetweenSquares;\n\t\t\t\tcontext.fillStyle = g_Colors[this.values[x + y * this.sizeZ]];\n\t\t\t\tcontext.fillRect(renderX, renderY, squareSizeX, squareSizeY);\n\t\t\t}\n\t\t}\n\n\t\tcontext.save();\n\t\tcontext.globalCompositeOperation = 'difference';\n\t\tcontext.fillStyle = 'white';\n\t\tcontext.fillText(\"Size: \" + (this.sizeX - 1) + \"x\" + (this.sizeZ - 1), 5, 10);\n\t\tcontext.restore();\n\t}\n}\n"
  },
  {
    "path": "dev-docs/js/grown.js",
    "content": "\nlet g_Canvas = null;\nlet g_Context = null;\nlet g_ValueMap = null;\n\n\n\n\nfunction init() {\n\tg_Canvas = document.getElementById(\"stage\");\n\tg_Context = g_Canvas.getContext(\"2d\");\n\tg_ValueMap = new ValueMap();\n\tg_ValueMap.visualize(g_Context, g_Canvas);\n}\n\n\n\nfunction btnZoom(btn) {\n\tg_ValueMap.zoom();\n\tg_ValueMap.visualize(g_Context, g_Canvas);\n\tif (\n\t\t(g_ValueMap.sizeX * 2 - 1 > 600) ||\n\t\t(g_ValueMap.sizeZ * 2 - 1 > 600)\n\t) {\n\t\tbtn.disabled = true;\n\t}\n}\n\n\n\nfunction btnSmooth() {\n\tg_ValueMap.smooth();\n\tg_ValueMap.visualize(g_Context, g_Canvas);\n}\n\n\nfunction btnReset() {\n\tg_ValueMap.reset();\n\tg_ValueMap.visualize(g_Context, g_Canvas);\n\t\n\tdocument.getElementById(\"grownZoomButton\").disabled = false;\n}\n\n\nfunction btnAutomatic(target) {\n\ttarget.disabled = true;\n\tdocument.getElementById(\"grownZoomButton\").disabled = true;\n\n\t// Reset the valuemap. We don't want to continue on a 500x500 map.\n\tg_ValueMap.reset();\n\tg_ValueMap.visualize(g_Context, g_Canvas);\n\n\tconst animationTimeBetween = 350;\n\tlet zoom =   () => { g_ValueMap.zoom() };\n\tlet smooth = () => { g_ValueMap.smooth() };\n\tlet actions = [];\n\t\n\tfor (let i = 0; i < 6; i++) actions.push(zoom);   // First zoom 6 times\n\tfor (let i = 0; i < 3; i++) actions.push(smooth); // Then smooth 3 times\n\tfor (let i = 0; i < 2; i++) actions.push(zoom);   // Zoom 2 times\n\tfor (let i = 0; i < 2; i++) actions.push(smooth); // And finally smooth 2 more times.\n\n\tlet update = () => {\n\t\tif (actions[0] == null) {\n\t\t\ttarget.disabled = false;\n\t\t\treturn;\n\t\t}\n\n\t\tactions[0].call();\n\t\tg_ValueMap.visualize(g_Context, g_Canvas);\n\n\t\tactions.splice(0, 1);\n\t\tsetTimeout(update, animationTimeBetween);\n\t};\n\tsetTimeout(update, animationTimeBetween + 500);\n}\n\n\nwindow.onload = init;\n"
  },
  {
    "path": "dev-docs/style.css",
    "content": "table\n{\n\tborder: 1px outset;\n\tborder-spacing: 0px;\n\tborder-collapse: separate;\n}\n\ntd, th\n{\n\tborder: 1px inset\n}\n\n\n// Copied over from Server/Plugins/APIDump/main.css to make the pages look like the API docs:\n\nhtml\n{\n\tbackground-color: #C0C0C0;\n}\n\n\npre\n{\n\tborder: 1px solid #ccc;\n\tbackground-color: #eee;\n\t-moz-tab-size:    2;\n\t-o-tab-size:      2;\n\t-webkit-tab-size: 2;\n\t-ms-tab-size:     2;\n\ttab-size:         2;\n}\n\nbody\n{\n\tmin-width: 400px;\n\tmax-width: 1200px;\n\twidth: 95%;\n\tmargin: 10px auto;\n\tbackground-color: white;\n\tborder: 4px #FF8C00 solid;\n\tborder-radius: 20px;\n\tfont-family: Calibri, Trebuchet MS;\n}\n\nheader\n{\n\ttext-align: center;\n\tfont-family: Segoe UI Light, Helvetica;\n}\n\nfooter\n{\n\ttext-align: center;\n\tfont-family: Segoe UI Light, Helvetica;\n}\n\n#content, #timestamp\n{\n\tpadding: 0px 25px 25px 25px;\n}\n\n"
  },
  {
    "path": "easyinstall.sh",
    "content": "#!/bin/sh\n\n{\n# NOTE: compile.sh looks for this file in order to determine if this is the Cuberite folder.\n# Please modify compile.sh if you want to rename or remove this file.\n# This file was chosen arbitrarily and it is a good enough indicator that we are in the Cuberite folder.\n\nset -e\n\nKERNEL=$(uname -s)\n\necho \"Identifying kernel: $KERNEL\"\n\nif [ \"$KERNEL\" = \"Linux\" ]; then\n\tPLATFORM=$(uname -m)\n\n\techo \"Identifying platform: $PLATFORM\"\n\n\tcase $PLATFORM in\n\t\t\"i686\") DOWNLOADURL=\"https://download.cuberite.org/linux-i686/Cuberite.tar.gz\" ;;\n\t\t\"x86_64\") DOWNLOADURL=\"https://download.cuberite.org/linux-x86_64/Cuberite.tar.gz\" ;;\n\t\t# Assume that all arm devices are a raspi for now.\n\t\tarm*) DOWNLOADURL=\"https://download.cuberite.org/linux-armhf-raspbian/Cuberite.tar.gz\" ;;\n\t\t# Allow install on Raspberry Pi 4 Ubuntu x64 (AArch64) using the ARM builds.\n\t\t\"aarch64\") DOWNLOADURL=\"https://download.cuberite.org/linux-aarch64/Cuberite.tar.gz\"\n\tesac\nelif [ \"$KERNEL\" = \"Darwin\" ]; then\n\t# All Darwins we care about are x86_64\n\tDOWNLOADURL=\"https://download.cuberite.org/darwin-x86_64/Cuberite.tar.gz\"\n#elif [ \"$KERNEL\" = \"FreeBSD\" ]; then\n#\tDOWNLOADURL=\"https://builds.cuberite.org/job/Cuberite%20FreeBSD%20x64%20Master/lastSuccessfulBuild/artifact/Cuberite.tar.gz\"\nelse\n\techo \"Unsupported kernel.\"\n\texit 1\nfi\n\necho \"Downloading precompiled binaries.\"\ncurl -Ls $DOWNLOADURL | tar -xzf -\necho \"Done.\"\n\necho \"Cuberite is now installed, run using 'cd Server; ./Cuberite'.\"\n\n}\n"
  },
  {
    "path": "nightlybuild.sh",
    "content": "#!/usr/bin/env bash\n\nset -ex\n\n# Parse arguments.\nwhile [[ $# -gt 1 ]]\ndo\nkey=\"$1\"\ncase $key in\n    -s|--server-name)\n    SERVERNAME=\"$2\"\n    shift\n    ;;\n    -t|--target)\n    TARGET=\"$2\"\n    shift\n    ;;\n    -c|--compiler)\n    CCOMP=\"$2\"\n    shift\n    ;;\n    -cxx|--cxx-compiler)\n    CXXCOMP=\"$2\"\n    shift\n    ;;\n    -m|--compile-mode)\n    COMPILEMODE=\"-DCMAKE_BUILD_TYPE=$2\"\n    shift\n    ;;\n    -n|--build-number)\n    BUILDID=\"$2\"\n    shift\n    ;;\n    -p|--toolchain-file)\n    TOOLCHAINFILE=\"-DCMAKE_TOOLCHAIN_FILE=$2\"\n    shift\n    ;;\n    -b|--branch)\n    BRANCH=\"$2\"\n    shift\n    ;;\n    -32|--force-32)\n    FORCE32=\"-DFORCE_32=$2\"\n    shift\n    ;;\n    *)\n    ;;\nesac\nshift\ndone\n\ngit submodule update --init\n\n# Set up build information.\nexport CUBERITE_BUILD_SERIES_NAME=\"$SERVERNAME $TARGET $COMPILEMODE ($BRANCH)\"\nexport CUBERITE_BUILD_ID=\"$BUILDID\"\nexport CUBERITE_BUILD_DATETIME=\"`date`\"\n\nif [ -x \"$(command -v ccache)\" ]\nthen\n\texport CCACHE_CPP2=true\n\tCACHE_ARGS=\"-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache\"\nfi\n\n# Build\nCXX=$CXXCOMP CC=$CCOMP cmake . -DNO_NATIVE_OPTIMIZATION=1 ${CACHE_ARGS} ${TOOLCHAINFILE} ${COMPILEMODE} ${FORCE32}\nmake -j 4\n\n\n# Package Server\necho Cuberite \"$CUBERITE_BUILD_SERIES_NAME-$CUBERITE_BUILD_ID\\n$BUILD_URL\" > Server/buildinfo.txt\n\n# h: dereference (archive file/folder instead of symlink)\n# z: gzip (compress)\n# c: create\n# v: verbose\n# T: files-from (list of server files accepted for release archives)\n# f: file (output file location)\npushd Server\ntar -hzcv --exclude .git -T Install/UnixExecutables.list -f ../Cuberite.tar.gz\npopd\nsha1sum Cuberite.tar.gz > Cuberite.tar.gz.sha1\n\n# Package ProtoProxy\n# This tool is very out of date, uncomment when it's being worked on again\n# pushd Tools/ProtoProxy\n# sha1sum ProtoProxy > ProtoProxy.sha1\n# popd\n"
  },
  {
    "path": "src/Bindings/.gitignore",
    "content": "docs/\nlua51.dll\nLuaState_Declaration.inc\nLuaState_Implementation.cpp\nLuaState_Typedefs.inc\n"
  },
  {
    "path": "src/Bindings/AllToLua.bat",
    "content": "\n:: AllToLua.bat\n:: This scripts updates the automatically-generates Lua bindings in Bindings.cpp / Bindings.h\n:: When called without any parameters, it will pause for a keypress at the end\n:: Call with any parameter to disable the wait (for buildserver use)\n\n@echo off\n\n\n\n\n\n:: Regenerate the files:\necho Regenerating LUA bindings . . .\n\"tolua++.exe\" -L BindingsProcessor.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg\n\n\n\n\n: Wait for keypress, if no param given:\necho.\nif %ALLTOLUA_WAIT%N == N pause\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/AllToLua.pkg",
    "content": "\n// AllToLua.pkg\n\n// Defines the bindings that are exported to Lua by the ToLua processor\n\n/*\n\tEach file referenced in the $cfile is parsed by ToLua, and bindings are generated for classes and functions\nmarked with \"// tolua_export\", or between the \"// tolua_begin\" and \"// tolua_end\" markers.\n\n  Note that if class D inherits from class B, then class B needs to be parsed before class D, otherwise the\ninheritance doesn't work properly (#1789).\n*/\n\n\n\n\n$#include \"../Globals.h\"\n\n// Typedefs from Globals.h, so that we don't have to process that file:\ntypedef signed long long Int64;\ntypedef signed int       Int32;\ntypedef signed short     Int16;\ntypedef signed char      Int8;\n\ntypedef unsigned long long UInt64;\ntypedef unsigned int       UInt32;\ntypedef unsigned short     UInt16;\ntypedef unsigned char      UInt8;\n\n\n$cfile \"../Vector3.h\"\n$cfile \"../ChunkDef.h\"\n$cfile \"../BiomeDef.h\"\n\n$cfile \"../IniFile.h\"\n\n$cfile \"../OSSupport/File.h\"\n\n$cfile \"LuaFunctions.h\"\n$cfile \"PluginManager.h\"\n$cfile \"Plugin.h\"\n$cfile \"PluginLua.h\"\n$cfile \"LuaWindow.h\"\n\n$cfile \"../BlockType.h\"\n$cfile \"../BlockInfo.h\"\n$cfile \"../StringUtils.h\"\n$cfile \"../Defines.h\"\n$cfile \"../ChatColor.h\"\n$cfile \"../ClientHandle.h\"\n$cfile \"../Color.h\"\n$cfile \"../EffectID.h\"\n$cfile \"../Server.h\"\n$cfile \"../World.h\"\n$cfile \"../Inventory.h\"\n$cfile \"../Enchantments.h\"\n$cfile \"../Item.h\"\n$cfile \"../ItemGrid.h\"\n$cfile \"../WebAdmin.h\"\n$cfile \"../Root.h\"\n$cfile \"../Cuboid.h\"\n$cfile \"../BoundingBox.h\"\n$cfile \"../BlockArea.h\"\n$cfile \"../Generating/ChunkDesc.h\"\n$cfile \"../CraftingRecipes.h\"\n$cfile \"../UI/Window.h\"\n$cfile \"../CompositeChat.h\"\n$cfile \"../Map.h\"\n$cfile \"../MapManager.h\"\n$cfile \"../Scoreboard.h\"\n$cfile \"../StatisticsManager.h\"\n$cfile \"../Protocol/MojangAPI.h\"\n$cfile \"../UUID.h\"\n\n// Entities:\n$cfile \"../Entities/Entity.h\"\n\n$cfile \"../Entities/EnderCrystal.h\"\n$cfile \"../Entities/Boat.h\"\n$cfile \"../Entities/Pawn.h\"\n$cfile \"../Entities/ProjectileEntity.h\"\n$cfile \"../Entities/ArrowEntity.h\"\n$cfile \"../Entities/EntityEffect.h\"\n$cfile \"../Entities/ExpBottleEntity.h\"\n$cfile \"../Entities/ExpOrb.h\"\n$cfile \"../Entities/FallingBlock.h\"\n$cfile \"../Entities/FireChargeEntity.h\"\n$cfile \"../Entities/FireworkEntity.h\"\n$cfile \"../Entities/Floater.h\"\n$cfile \"../Entities/GhastFireballEntity.h\"\n$cfile \"../Entities/HangingEntity.h\"\n$cfile \"../Entities/ItemFrame.h\"\n$cfile \"../Entities/LeashKnot.h\"\n$cfile \"../Entities/Player.h\"\n$cfile \"../Entities/Painting.h\"\n$cfile \"../Entities/Pickup.h\"\n$cfile \"../Entities/SplashPotionEntity.h\"\n$cfile \"../Entities/ThrownEggEntity.h\"\n$cfile \"../Entities/ThrownEnderPearlEntity.h\"\n$cfile \"../Entities/ThrownSnowballEntity.h\"\n$cfile \"../Entities/TNTEntity.h\"\n$cfile \"../Entities/WitherSkullEntity.h\"\n$cfile \"../Mobs/MonsterTypes.h\"\n$cfile \"../Mobs/Monster.h\"\n\n// Block entities:\n$cfile \"../BlockEntities/BlockEntity.h\"\n$cfile \"../BlockEntities/BeaconEntity.h\"\n$cfile \"../BlockEntities/BedEntity.h\"\n$cfile \"../BlockEntities/BlockEntityWithItems.h\"\n$cfile \"../BlockEntities/BrewingstandEntity.h\"\n$cfile \"../BlockEntities/ChestEntity.h\"\n$cfile \"../BlockEntities/CommandBlockEntity.h\"\n$cfile \"../BlockEntities/DropSpenserEntity.h\"\n$cfile \"../BlockEntities/DispenserEntity.h\"\n$cfile \"../BlockEntities/DropperEntity.h\"\n$cfile \"../BlockEntities/FurnaceEntity.h\"\n$cfile \"../BlockEntities/HopperEntity.h\"\n$cfile \"../BlockEntities/JukeboxEntity.h\"\n$cfile \"../BlockEntities/NoteEntity.h\"\n$cfile \"../BlockEntities/SignEntity.h\"\n$cfile \"../BlockEntities/MobHeadEntity.h\"\n$cfile \"../BlockEntities/MobSpawnerEntity.h\"\n$cfile \"../BlockEntities/FlowerPotEntity.h\"\n\n// Registries:\n$cfile \"../Registries/CustomStatistics.h\"\n\n\n\n\n// To avoid tolua treating Byte as a class, and avoid the need to $cfile entire Globals.h:\ntypedef unsigned char Byte;\n\n\n\n// Aliases\n$renaming Vector3<double> @ Vector3d\n$renaming Vector3<float>  @ Vector3f\n$renaming Vector3<int>    @ Vector3i\n\n\n\n"
  },
  {
    "path": "src/Bindings/AllToLua.sh",
    "content": "#!/bin/bash\n/usr/bin/tolua++ -L BindingsProcessor.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg\n"
  },
  {
    "path": "src/Bindings/AllToLua_lua.bat",
    "content": "\n:: AllToLua_Lua.bat\n:: This scripts updates the automatically-generates Lua bindings in Bindings.cpp / Bindings.h\n:: When called without any parameters, it will pause for a keypress at the end\n:: Call with any parameter to disable the wait (for buildserver use)\n:: This script assumes \"lua\" executable to be in PATH, it uses a pure-lua implementation of the ToLua processor\n\n@echo off\n\n\n\n\n\n:: Regenerate the files:\necho Regenerating LUA bindings . . .\nlua ..\\..\\lib\\tolua++\\src\\bin\\lua\\_driver.lua -L BindingsProcessor.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg\n\n\n\n\n: Wait for keypress, if no param given:\necho.\nif %ALLTOLUA_WAIT%N == N pause\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/BindingsProcessor.lua",
    "content": "\n-- BindingsProcessor.lua\n\n-- Implements additional processing that is done while generating the Lua bindings\n\n--[[\nThe primary purpose of this file is to provide transformations for ToLua - it is loaded by ToLua++\nbefore processing the C++ code.\n\nThis file can also be used as a standalone Lua program to actually generate the bindings, it invokes\nToLua++ if executed by a regular Lua interpreter\n\nThe transformations implemented:\n\t- Modify ToLua++ behavior so that it doesn't generate bindings for private and protected members\n\t- Export additional files to be included in cLuaState:\n\t\t- Forward declarations and typedefs for custom classes' pointers\n\t\t- Pushing and popping of bindings' classes\n\nTo parse DoxyComments, the preprocessor first replaces them with markers and then the parser uses\nthose markers to apply the DoxyComment to the next or previous item in the container, based on\nthe DoxyComment type.\n\nPlaceholders in use (i = internal ToLua++):\n\t- \\1 and \\2: (i) Embedded Lua code\n\t- \\3 and \\4: (i) Embedded C code (\"<>\")\n\t- \\5 and \\6: (i) Embedded C code (\"{}\")\n\t- \\17 and \\18: DoxyComment for next item (\"/** ... */\") via an ID lookup\n\t- \\19 and \\20: DoxyComment for previous item (\"///< ... \\n\") via an ID lookup\n--]]\n\n\n\n\n\n--- Invokes the ToLua++ parser\n-- Called when this script detects it has been run outside of ToLua++'s processing\nlocal function invokeToLua()\n\t-- The values used by ToLua scripts, normally filled from the cmdline params:\n\tflags =\n\t{\n\t\tL = \"BindingsProcessor.lua\",\n\t\to = \"Bindings.cpp\",\n\t\tH = \"Bindings.h\",\n\t\tf = \"AllToLua.pkg\",\n\t\t-- P = true,  -- Prints the structure to stdout, doesn't generate cpp file\n\t}\n\t_extra_parameters = {}\n\tTOLUA_VERSION = \"tolua++-1.0.92\"\n\tTOLUA_LUA_VERSION = \"Lua 5.1\"\n\n\t-- Path to the ToLua scripts\n\tpath = \"../../lib/tolua++/src/bin/lua/\"\n\n\t-- Run the ToLua processing:\n\tdofile(path .. \"all.lua\")\nend\n\n\n\n\n\nlocal access =\n{\n\tpublic = 0,\n\tprotected = 1,\n\tprivate = 2\n}\n\n\n\n\n\n--- Defines classes that have a custom manual Push() implementation and should not generate the automatic one\n-- Map of classname -> true\nlocal g_HasCustomPushImplementation =\n{\n\tcEntity = true,\n}\n\n\n\n\n\n--- Defines classes that have a custom manual GetStackValue() implementation and should not generate the automatic one\n-- Map of classname -> true\nlocal g_HasCustomGetImplementation =\n{\n\tVector3d = true,\n\tVector3f = true,\n\tVector3i = true,\n}\n\n\n\n\n\n--- Array-table of forward DoxyComments that are replaced in preprocess_hook() and substituted back in parser_hook()\n-- We need to use a lookup table because the comments themselves may contain \"//\" which the preprocessor\n-- would eliminate, thus breaking the code\n-- The \"n\" member is a counter for faster insertion\nlocal g_ForwardDoxyComments =\n{\n\tn = 0\n}\n\n\n--- Array-table of backward DoxyComments that are replaced in preprocess_hook() and substituted back in parser_hook()\n-- We need to use a lookup table because the comments themselves may contain \"//\" which the preprocessor\n-- would eliminate, thus breaking the code\n-- The \"n\" member is a counter for faster insertion\nlocal g_BackwardDoxyComments =\n{\n\tn = 0,\n}\n\n\n\n\n\n--- Provides extra parsing in addition to ToLua++'s own\n-- Called by ToLua++ each time it extracts the next piece of code to parse\n-- a_Code is the string representing the code to be parsed\n-- The return value is the remaining code to be parsed in the next iteration\n-- Processes the class access specifiers (public, protected, private), and doxycomments\nfunction parser_hook(a_Code)\n\t-- Process access-specifying labels (public, private, etc)\n\tdo\n\t\tlocal b, e, label = string.find(a_Code, \"^%s*(%w*)%s*:[^:]\") -- we need to check for [^:], otherwise it would match 'namespace::type'\n\t\tif b then\n\t\t\t-- Found a label, get the new access value for it:\n\t\t\tif access[label] then\n\t\t\t\tclassContainer.curr.curr_member_access = access[label]\n\t\t\tend -- else ?\n\t\t\treturn strsub(a_Code, e) -- normally we would use 'e + 1', but we need to preserve the [^:]\n\t\tend\n\tend\n\n\t-- Process forward DoxyComments:\n\tdo\n\t\tlocal b, e, comment = a_Code:find(\"^%s*(%b\\17\\18)\")\n\t\tif (b) then\n\t\t\tlocal curr = classContainer.curr\n\t\t\tif (curr.n and (curr.n > 0)) then\n\t\t\t\tcurr[curr.n].next_DoxyComment = g_ForwardDoxyComments[tonumber(comment:sub(2, -2))]\n\t\t\telse\n\t\t\t\tcurr.first_child_DoxyComment = g_ForwardDoxyComments[tonumber(comment:sub(2, -2))]\n\t\t\tend\n\t\t\treturn strsub(a_Code, e + 1)\n\t\tend\n\tend\n\n\t-- Process backward DoxyComments:\n\tdo\n\t\tlocal b, e, comment = a_Code:find(\"^%s*(%b\\19\\20)\")\n\t\tif (b) then\n\t\t\tcomment = g_BackwardDoxyComments[tonumber(comment:sub(2, -2))]\n\t\t\tlocal currContainer = classContainer.curr\n\t\t\tif (currContainer.n > 0) then\n\t\t\t\tcurrContainer[currContainer.n].DoxyComment = comment\n\t\t\telse\n\t\t\t\tprint(\"Backward DoxyComment lost in \" .. (currContainer.name or currContainer.lname or currContainer.cname or \"<no name>\"))\n\t\t\tend\n\t\t\treturn strsub(a_Code, e + 1)\n\t\tend\n\tend\nend\n\n\n\n\n\n--- Outputs the helper files supplementing the cLuaState class\n-- Writes:\n--   LuaState_Declaration.inc\n--   LuaState_Implementation.cpp\n--   LuaState_Typedefs.inc\nlocal function OutputLuaStateHelpers(a_Package)\n\t-- Collect all class types from ToLua:\n\tlocal types = {}\n\tfor idx, item in ipairs(a_Package) do\n\t\tlocal mt = getmetatable(item) or {}\n\t\tif (mt.classtype == \"class\") then\n\t\t\ttable.insert(types, {name = item.name, lname = item.lname})\n\t\tend\n\tend\n\ttable.sort(types,\n\t\tfunction(a_Item1, a_Item2)\n\t\t\treturn (a_Item1.name:lower() < a_Item2.name:lower())\n\t\tend\n\t)\n\n\t-- Output the typedefs:\n\tdo\n\t\tlocal f = assert(io.open(\"LuaState_Typedefs.inc\", \"w\"))\n\t\tf:write(\"\\n// LuaState_Typedefs.inc\\n\\n// This file is generated along with the Lua bindings by ToLua. Do not edit manually, do not commit to repo.\\n\")\n\t\tf:write(\"// Provides a forward declaration and a typedef for a pointer to each class exported to the Lua API.\\n\")\n\t\tf:write(\"\\n\\n\\n\\n\\n\")\n\t\tfor _, item in ipairs(types) do\n\t\t\tif not(item.name:match(\".*<.*\")) then  -- Skip templates altogether\n\t\t\t\t-- Classes start with a \"c\", everything else is a struct:\n\t\t\t\tif (item.name:sub(1, 1) == \"c\") then\n\t\t\t\t\tf:write(\"class \" .. item.name .. \";\\n\")\n\t\t\t\telse\n\t\t\t\t\tf:write(\"struct \" .. item.name .. \";\\n\")\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tf:write(\"\\n\\n\\n\\n\\n\")\n\t\tfor _, item in ipairs(types) do\n\t\t\tf:write(\"typedef \" .. item.name .. \" * Ptr\" .. item.lname .. \";\\n\")\n\t\t\tf:write(\"typedef const \" .. item.name .. \" * ConstPtr\" .. item.lname .. \";\\n\")\n\t\tend\n\t\tf:write(\"\\n\\n\\n\\n\\n\")\n\t\tf:close()\n\tend\n\n\t-- Output the Push() and GetStackValue() function declarations:\n\tdo\n\t\tlocal f = assert(io.open(\"LuaState_Declaration.inc\", \"w\"))\n\t\tf:write(\"\\n// LuaState_Declaration.inc\\n\\n// This file is generated along with the Lua bindings by ToLua. Do not edit manually, do not commit to repo.\\n\")\n\t\tf:write(\"// Implements a Push() and GetStackValue() function for each class exported to the Lua API.\\n\")\n\t\tf:write(\"// This file expects to be included form inside the cLuaState class definition\\n\")\n\t\tf:write(\"\\n\\n\\n\\n\\n\")\n\t\tfor _, item in ipairs(types) do\n\t\t\tif not(g_HasCustomPushImplementation[item.lname]) then\n\t\t\t\tf:write(\"void Push(\" .. item.name .. \" * a_Value);\\n\")\n\t\t\tend\n\t\tend\n\t\tfor _, item in ipairs(types) do\n\t\t\tif not(g_HasCustomGetImplementation[item.lname]) then\n\t\t\t\tf:write(\"bool GetStackValue(int a_StackPos, Ptr\" .. item.lname .. \" & a_ReturnedVal);\\n\")\n\t\t\t\tf:write(\"bool GetStackValue(int a_StackPos, ConstPtr\" .. item.lname .. \" & a_ReturnedVal);\\n\")\n\t\t\tend\n\t\tend\n\t\tf:write(\"\\n\\n\\n\\n\\n\")\n\t\tf:close()\n\tend\n\n\t-- Output the Push() and GetStackValue() function implementations:\n\tdo\n\t\tlocal f = assert(io.open(\"LuaState_Implementation.cpp\", \"w\"))\n\t\tf:write(\"\\n// LuaState_Implementation.cpp\\n\\n// This file is generated along with the Lua bindings by ToLua. Do not edit manually, do not commit to repo.\\n\")\n\t\tf:write(\"// Implements a Push() and GetStackValue() function for each class exported to the Lua API.\\n\")\n\t\tf:write(\"// This file expects to be compiled as a separate translation unit\\n\")\n\t\tf:write(\"\\n\\n\\n\\n\\n\")\n\t\tf:write(\"#include \\\"Globals.h\\\"\\n#include \\\"LuaState.h\\\"\\n#include \\\"tolua++/include/tolua++.h\\\"\\n\")\n\t\tf:write(\"\\n\\n\\n\\n\\n\")\n\t\tfor _, item in ipairs(types) do\n\t\t\tif not(g_HasCustomPushImplementation[item.lname]) then\n\t\t\t\tf:write(\"void cLuaState::Push(\" .. item.name .. \" * a_Value)\\n{\\n\\tASSERT(IsValid());\\n\")\n\t\t\t\tf:write(\"\\ttolua_pushusertype(m_LuaState, a_Value, \\\"\" .. item.name .. \"\\\");\\n\");\n\t\t\t\tf:write(\"}\\n\\n\\n\\n\\n\\n\")\n\t\t\tend\n\t\tend\n\t\tfor _, item in ipairs(types) do\n\t\t\tif not(g_HasCustomGetImplementation[item.lname]) then\n\t\t\t\tf:write(\"bool cLuaState::GetStackValue(int a_StackPos, Ptr\" .. item.lname .. \" & a_ReturnedVal)\\n{\\n\\tASSERT(IsValid());\\n\")\n\t\t\t\tf:write(\"\\tif (lua_isnil(m_LuaState, a_StackPos))\\n\\t{\\n\")\n\t\t\t\tf:write(\"\\t\\ta_ReturnedVal = nullptr;\\n\")\n\t\t\t\tf:write(\"\\t\\treturn false;\\n\\t}\\n\")\n\t\t\t\tf:write(\"\\ttolua_Error err;\\n\")\n\t\t\t\tf:write(\"\\tif (tolua_isusertype(m_LuaState, a_StackPos, \\\"\" .. item.name .. \"\\\", false, &err))\\n\")\n\t\t\t\tf:write(\"\\t{\\n\")\n\t\t\t\tf:write(\"\\t\\ta_ReturnedVal = *(static_cast<\" .. item.name .. \" **>(lua_touserdata(m_LuaState, a_StackPos)));\\n\")\n\t\t\t\tf:write(\"\\t\\treturn true;\\n\");\n\t\t\t\tf:write(\"\\t}\\n\")\n\t\t\t\tf:write(\"\\treturn false;\\n\")\n\t\t\t\tf:write(\"}\\n\\n\\n\\n\\n\\n\")\n\n\t\t\t\tf:write(\"bool cLuaState::GetStackValue(int a_StackPos, ConstPtr\" .. item.lname .. \" & a_ReturnedVal)\\n{\\n\\tASSERT(IsValid());\\n\")\n\t\t\t\tf:write(\"\\tif (lua_isnil(m_LuaState, a_StackPos))\\n\\t{\\n\")\n\t\t\t\tf:write(\"\\t\\ta_ReturnedVal = nullptr;\\n\")\n\t\t\t\tf:write(\"\\t\\treturn false;\\n\\t}\\n\")\n\t\t\t\tf:write(\"\\ttolua_Error err;\\n\")\n\t\t\t\tf:write(\"\\tif (tolua_isusertype(m_LuaState, a_StackPos, \\\"const \" .. item.name .. \"\\\", false, &err))\\n\")\n\t\t\t\tf:write(\"\\t{\\n\")\n\t\t\t\tf:write(\"\\t\\ta_ReturnedVal = *(static_cast<const \" .. item.name .. \" **>(lua_touserdata(m_LuaState, a_StackPos)));\\n\")\n\t\t\t\tf:write(\"\\t\\treturn true;\\n\");\n\t\t\t\tf:write(\"\\t}\\n\")\n\t\t\t\tf:write(\"\\treturn false;\\n\")\n\t\t\t\tf:write(\"}\\n\\n\\n\\n\\n\\n\")\n\t\t\tend\n\t\tend\n\t\tf:close()\n\tend\nend\n\n\n\n\n\nlocal function FormatString(a_Str)\n\tlocal fmt = string.format(\"%q\", a_Str)\n\treturn (string.gsub(string.gsub(fmt, \"\\\\\\n\", \"\\\\n\"), \"\\\\\\r\\n\", \"\\\\r\\\\n\"))\nend\n\n\n\n\n\nlocal function OutputTable(a_File, a_Table, a_Name, a_Indent, a_Visited, a_Metas)\n\t-- Check and update the \"visited\" status:\n\tif (a_Visited[a_Table]) then\n\t\ta_File:write(a_Indent .. \"{ \\\"visited: \" .. a_Visited[a_Table] .. \"\\\", }\")\n\t\treturn\n\tend\n\ta_Visited[a_Table] = a_Name\n\n\t-- Output the table contents:\n\ta_File:write(a_Indent .. \"{\\n\")\n\tlocal indent = a_Indent .. \"\\t\"\n\tfor k, v in pairs(a_Table) do\n\t\tif (type(k) == \"string\") then\n\t\t\ta_File:write(indent .. \"[\" .. FormatString(k) .. \"] =\")\n\t\telse\n\t\t\ta_File:write(indent .. \"[\" .. tostring(k) .. \"] =\")\n\t\tend\n\t\tlocal t = type(v)\n\t\tif (\n\t\t\t(t == \"number\") or\n\t\t\t(t == \"boolean\")\n\t\t) then\n\t\t\ta_File:write(\" \", tostring(v))\n\t\telseif (t == \"string\") then\n\t\t\ta_File:write(\" \", FormatString(v))\n\t\telseif (t == \"table\") then\n\t\t\tlocal metatab = getmetatable(v)\n\t\t\tif (metatab) then\n\t\t\t\ta_File:write(\"  -- meta: \" .. tostring(metatab))\n\t\t\t\ta_Metas[metatab] = metatab\n\t\t\tend\n\t\t\ta_File:write(\"\\n\")\n\t\t\tOutputTable(a_File, v, a_Name .. \".\" .. tostring(k), indent, a_Visited, a_Metas)\n\t\telse\n\t\t\tprint(\"Unhandled type: \" .. t .. \": \" .. tostring(v))\n\t\t\ta_File:write(\" \", tostring(v))\n\t\tend\n\t\ta_File:write(\",\\n\")\n\tend  -- for k, v - a_Table\n\ta_File:write(a_Indent .. \"}\")\nend\n\n\n\n\n\n--- Outputs the docs for all the functions in the specified class\n-- a_File is the output file\n-- a_Class is the ToLua's classClass object\n-- a_Functions is a dictionary of function descriptions: \"name\" -> { {<description>}, ...}\nlocal function outputClassFunctionDocs(a_File, a_Class, a_Functions)\n\t-- Sort the functions by name:\n\tlocal functions = {}\n\tfor name, descs in pairs(a_Functions) do\n\t\ttable.insert(functions, { Name = name, Descs = descs })\n\tend\n\ttable.sort(functions,\n\t\tfunction (a_Fn1, a_Fn2)\n\t\t\treturn (a_Fn1.Name < a_Fn2.Name)\n\t\tend\n\t)\n\n\t-- If there are no functions, bail out:\n\tif not(functions[1]) then\n\t\treturn\n\tend\n\n\t-- Output the descriptions:\n\ta_File:write(\"\\t\\tFunctions =\\n\\t\\t{\\n\")\n\tfor _, fn in ipairs(functions) do\n\t\tlocal name = fn.Name\n\t\tif (name:sub(1, 1) == \".\") then\n\t\t\tname = \"[\\\"\" .. name .. \"\\\"]\"\n\t\tend\n\t\ta_File:write(\"\\t\\t\\t\", name, \" =\\n\\t\\t\\t{\\n\")\n\t\tfor _, desc in ipairs(fn.Descs) do\n\t\t\ta_File:write(\"\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tParams =\\n\\t\\t\\t\\t\\t{\\n\")\n\t\t\tfor _, param in ipairs(desc.Parameters) do\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\\t\\t{\\n\")\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\\t\\t\\tType = \\\"\", param.Type, \"\\\",\\n\")\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\\t\\t\\tName = \\\"\", param.Name, \"\\\",\\n\")\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\\t\\t},\\n\")\n\t\t\tend\n\t\t\ta_File:write(\"\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\tReturns =\\n\\t\\t\\t\\t\\t{\\n\")\n\t\t\tfor _, ret in ipairs(desc.Returns) do\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\tType = \\\"\", ret.Type, \"\\\",\\n\\t\\t\\t\\t\\t\\t},\\n\")\n\t\t\tend\n\t\t\ta_File:write(\"\\t\\t\\t\\t\\t},\\n\")\n\t\t\tif (desc.IsStatic) then\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\\tIsStatic = true,\\n\")\n\t\t\tend\n\t\t\tif (desc.DoxyComment) then\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\\tDesc = \", string.format(\"%q\", desc.DoxyComment), \",\\n\")\n\t\t\tend\n\t\t\ta_File:write(\"\\t\\t\\t\\t},\\n\")\n\t\tend\n\t\ta_File:write(\"\\t\\t\\t},\\n\")\n\tend\n\ta_File:write(\"\\t\\t},\\n\")\nend\n\n\n\n\n\n--- Outputs the docs for all the member variables in the specified class\n-- a_File is the output file\n-- a_Class is the ToLua's classClass object\n-- a_Variables is a dictionary of variable descriptions: \"name\" -> {<description>}\nlocal function outputClassVariableDocs(a_File, a_Class, a_Variables)\n\t-- Sort the variables by name:\n\tlocal variables = {}\n\tfor name, desc in pairs(a_Variables) do\n\t\ttable.insert(variables, { Name = name, Desc = desc })\n\tend\n\ttable.sort(variables,\n\t\tfunction (a_Var1, a_Var2)\n\t\t\treturn (a_Var1.Name < a_Var2.Name)\n\t\tend\n\t)\n\n\t-- If there are no variables, bail out:\n\tif not(variables[1]) then\n\t\treturn\n\tend\n\n\t-- Output the descriptions:\n\ta_File:write(\"\\t\\tVariables =\\n\\t\\t{\\n\")\n\tfor _, v in ipairs(variables) do\n\t\ta_File:write(\"\\t\\t\\t\", v.Name, \" =\\n\\t\\t\\t{\\n\")\n\t\ta_File:write(\"\\t\\t\\t\\tType = \\\"\", v.Desc.Type, \"\\\",\\n\")\n\t\tif (v.Desc.DoxyComment) then\n\t\t\ta_File:write(\"\\t\\t\\t\\tDesc = \", string.format(\"%q\", v.Desc.DoxyComment), \",\\n\")\n\t\tend\n\t\ta_File:write(\"\\t\\t\\t},\\n\")\n\tend\n\ta_File:write(\"\\t\\t},\\n\")\nend\n\n\n\n\n\n--- Outputs the docs for all the member constants in the specified class\n-- a_File is the output file\n-- a_Class is the ToLua's classClass object\n-- a_Constants is a dictionary of constant descriptions: \"name\" -> {<description>}\n-- a_IgnoredConstants is a dictionary of constants not to be exported: \"name\" -> true (used for ToLua++'s multi-inheritance)\nlocal function outputClassConstantDocs(a_File, a_Class, a_Constants, a_IgnoredConstants)\n\t-- Sort the constants by name:\n\tlocal constants = {}\n\tfor name, desc in pairs(a_Constants) do\n\t\tif not(a_IgnoredConstants[name]) then\n\t\t\ttable.insert(constants, { Name = name, Desc = desc })\n\t\tend\n\tend\n\ttable.sort(constants,\n\t\tfunction (a_Var1, a_Var2)\n\t\t\treturn (a_Var1.Name < a_Var2.Name)\n\t\tend\n\t)\n\n\t-- If there are no constants, bail out:\n\tif not(constants[1]) then\n\t\treturn\n\tend\n\n\t-- Output the descriptions:\n\ta_File:write(\"\\t\\tConstants =\\n\\t\\t{\\n\")\n\tfor _, con in ipairs(constants) do\n\t\ta_File:write(\"\\t\\t\\t\", con.Name, \" =\\n\\t\\t\\t{\\n\")\n\t\ta_File:write(\"\\t\\t\\t\\tType = \\\"\", con.Desc.Type, \"\\\",\\n\")\n\t\tif (con.Desc.DoxyComment) then\n\t\t\ta_File:write(\"\\t\\t\\t\\tDesc = \", string.format(\"%q\", con.Desc.DoxyComment), \",\\n\")\n\t\tend\n\t\ta_File:write(\"\\t\\t\\t},\\n\")\n\tend\n\ta_File:write(\"\\t\\t},\\n\")\nend\n\n\n\n\n\n--- Outputs the docs for all the member enums in the specified class\n-- a_File is the output file\n-- a_Class is the ToLua's classClass object\n-- a_Enums is an array of ToLua's classEnum objects\nlocal function outputClassEnumDocs(a_File, a_Class, a_Enums)\n\t-- If there are no enums, bail out:\n\tif (not(a_Enums) or not(a_Enums[1])) then\n\t\treturn\n\tend\n\n\t-- Sort the enums by name:\n\ttable.sort(a_Enums,\n\t\tfunction (a_Enum1, a_Enum2)\n\t\t\treturn (a_Enum1.name < a_Enum2.name)\n\t\tend\n\t)\n\n\t-- Output the enums:\n\ta_File:write(\"\\t\\tEnums =\\n\\t\\t{\\n\")\n\tfor i, enum in ipairs(a_Enums) do\n\t\tlocal name = enum.name\n\t\tif (not(name) or (name == \"\")) then\n\t\t\tname = string.format(\"unnamedEnum_%d\", i)\n\t\tend\n\t\ta_File:write(\"\\t\\t\\t\", name, \" =\\n\\t\\t\\t{\\n\")\n\t\tlocal valnames = {}\n\t\t-- Make a copy of enum.lnames so that we can sort it:\n\t\tlocal idx = 1\n\t\tfor i, valname in ipairs(enum.lnames) do\n\t\t\tvalnames[idx] = { Name = valname, DoxyComment = enum.DoxyComments[i] }\n\t\t\tidx = idx + 1\n\t\tend\n\t\ttable.sort(valnames,\n\t\t\tfunction (a_Val1, a_Val2)\n\t\t\t\treturn (a_Val1.Name < a_Val2.Name)\n\t\t\tend\n\t\t)\n\t\tfor _, valname in ipairs(valnames) do\n\t\t\tassert(not(valname.Name:find(\"\\17\")))\n\t\t\tassert(not(valname.Name:find(\"\\18\")))\n\t\t\tassert(not(valname.Name:find(\"\\19\")))\n\t\t\tassert(not(valname.Name:find(\"\\20\")))\n\t\t\ta_File:write(\"\\t\\t\\t\\t{\\n\")\n\t\t\ta_File:write(\"\\t\\t\\t\\t\\tName = \\\"\", valname.Name, \"\\\",\\n\")\n\t\t\tif (valname.DoxyComment) then\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\\tDesc = \", string.format(\"%q\", valname.DoxyComment), \",\\n\")\n\t\t\tend\n\t\t\ta_File:write(\"\\t\\t\\t\\t},\\n\")\n\t\tend\n\t\ta_File:write(\"\\t\\t\\t},\\n\")\n\tend\n\ta_File:write(\"\\t\\t},\\n\")\nend\n\n\n\n\n\n--- Outputs the docs for the specified class, which has been parsed for its functions, variables and constants\n-- a_Class is the ToLua's classClass object\n-- a_Functions is a dictionary of function descriptions: \"name\" -> { {<description>}, ...}\n-- a_Variables is a dictionary of variable descriptions: \"name\" -> {<description>}\n-- a_Constants is a dictionary of constant descriptions: \"name\" -> {<description>}\n-- a_Filenames is an array into which the name of the docs file is to be appended\nlocal function outputClassDocs(a_Class, a_Functions, a_Variables, a_Constants, a_Filenames)\n\t-- Add the output file to list of filenames:\n\tlocal fnam = a_Class.lname .. \".lua\"\n\ttable.insert(a_Filenames, fnam)\n\n\t-- Output the header:\n\tlocal f = assert(io.open(\"docs/\" .. fnam, \"w\"))\n\tf:write(\"return\\n{\\n\\t\", a_Class.lname, \" =\\n\\t{\\n\")\n\tif (a_Class.DoxyComment) then\n\t\tf:write(\"\\t\\tDesc = \", string.format(\"%q\", a_Class.DoxyComment), \",\\n\")\n\tend\n\n\t-- If the class inherits from anything, output it here:\n\tlocal ignoredConstants = {}\n\tif (a_Class.base and (a_Class.base ~= \"\")) then\n\t\tlocal bases = {a_Class.base}\n\t\tlocal idx = 2\n\t\tfor _, b in ipairs(a_Class.extra_bases or {}) do\n\t\t\tbases[idx] = b\n\t\t\tidx = idx + 1\n\t\t\t-- ToLua++ handles multiple inheritance by adding \"constants\" for the base types; ignore those:\n\t\t\tignoredConstants[\"__\" .. b .. \"__\"] = true\n\t\tend\n\t\ttable.sort(bases)\n\t\tf:write(\"\\t\\tInherits =\\n\\t\\t{\\n\")\n\t\tfor _, b in ipairs(bases) do\n\t\t\tf:write(\"\\t\\t\\t\", string.format(\"%q\", b), \",\\n\")\n\t\tend\n\t\tf:write(\"\\t\\t},\\n\")\n\tend\n\n\t-- Output the functions:\n\toutputClassFunctionDocs(f, a_Class, a_Functions)\n\n\t-- Output the variables:\n\toutputClassVariableDocs(f, a_Class, a_Variables)\n\n\t-- Output the constants:\n\toutputClassConstantDocs(f, a_Class, a_Constants, ignoredConstants)\n\n\t-- Output the enums:\n\toutputClassEnumDocs(f, a_Class, a_Class.enums)\n\n\t-- Output the footer:\n\tf:write(\"\\t},\\n}\\n\")\n\tf:close()\nend\n\n\n\n\n\n--- Recursively applies the next_DoxyComment member to the next item, and first_child_DoxyComment to first child item in the container.\n-- a_Container is the ToLua++'s table potentially containing children as its array members\nlocal function applyNextDoxyComments(a_Container)\n\t-- Apply the DoxyComment to the first child, if appropriate:\n\tif (a_Container[1] and a_Container.first_child_DoxyComment) then\n\t\ta_Container[1].DoxyComment = a_Container.first_child_DoxyComment\n\tend\n\n\t-- Apply each child's next_DoxyComment to the actual next child:\n\tlocal i = 1\n\twhile (a_Container[i]) do\n\t\tif (a_Container[i].next_DoxyComment) then\n\t\t\tif (a_Container[i + 1]) then\n\t\t\t\ta_Container[i + 1].DoxyComment = a_Container[i].next_DoxyComment\n\t\t\tend\n\t\tend\n\t\tapplyNextDoxyComments(a_Container[i])\n\t\ti = i + 1\n\tend\nend\n\n\n\n\n\n--- Generates documentation for a package.\nlocal function genPackageDocs(a_Self)\n\t-- DEBUG: Output the raw package object:\n\tdo\n\t\tlocal f = io.open(\"docs/_raw.lua\", \"w\")\n\t\tif (f) then\n\t\t\tOutputTable(f, a_Self, \"\", \"\", {}, {})\n\t\t\tf:close()\n\t\tend\n\tend\n\n\tapplyNextDoxyComments(a_Self)\n\n\t-- Generate docs for each member:\n\tlocal i = 1\n\tlocal filenames = {}\n\twhile (a_Self[i]) do\n\t\tif (\n\t\t\ta_Self[i]:check_public_access() and  -- Do not export private and protected members\n\t\t\ta_Self[i].genDocs\n\t\t) then\n\t\t\ta_Self[i]:genDocs(filenames)\n\t\tend\n\t\ti = i + 1\n\tend\n\n\t-- Output the globals' docs:\n\tlocal functions = {}\n\tlocal variables = {}\n\tlocal constants = {}\n\twhile (a_Self[i]) do\n\t\tif (a_Self[i].genMemberDocs) then\n\t\t\ta_Self[i]:genMemberDocs(functions, variables, constants)\n\t\tend\n\t\ti = i + 1\n\tend\n\tlocal oldName = a_Self.lname\n\ta_Self.lname = \"Globals\"\n\toutputClassDocs(a_Self, functions, variables, constants, filenames)\n\ta_Self.lname = oldName\n\n\t-- Output the list of docs files:\n\ttable.sort(filenames)\n\tlocal f = assert(io.open(\"docs/_files.lua\", \"w\"))\n\tf:write(\"return\\n{\\n\")\n\tfor _, fnam in ipairs(filenames) do\n\t\tf:write(\"\\t\\\"\", fnam, \"\\\",\\n\")\n\tend\n\tf:write(\"}\\n\")\n\tf:close()\nend\n\n\n\n\n\nlocal function genClassDocs(a_Self, a_Filenames)\n\tassert(a_Self.lname)\n\tassert(type(a_Filenames) == \"table\")\n\t--[[\n\tprint(\"\\n\\nGenerating docs for class \" .. a_Self.lname)\n\tlocal visited = {[a_Self.parent] = \"<package>\"}\n\tlocal metas = {}\n\tOutputTable(io.stdout, a_Self, a_Self.lname, \"\", visited, metas)\n\t--]]\n\n\t-- Collect the function, variable and constant docs:\n\tlocal i = 1\n\tlocal functions = {}\n\tlocal variables = {}\n\tlocal constants = {}\n\twhile (a_Self[i]) do\n\t\tif (\n\t\t\ta_Self[i]:check_public_access() and  -- Don't export private and protected members\n\t\t\ta_Self[i].genMemberDocs\n\t\t) then\n\t\t\ta_Self[i]:genMemberDocs(functions, variables, constants)\n\t\tend\n\t\ti = i + 1\n\tend\n\n\t-- Output the individual docs\n\toutputClassDocs(a_Self, functions, variables, constants, a_Filenames)\nend\n\n\n\n\n\n--- Parses the specified function's parameters and returns their description as a table\n-- a_Function is the ToLua's classFunction object\nlocal function parseFunctionParameters(a_Function)\n\t-- If the only param is a \"void\", then report no params:\n\tif (\n\t\ta_Function.args and                  -- The params are present\n\t\t(#(a_Function.args) == 1) and        -- There is exactly one param\n\t\t(a_Function.args[1].type == \"void\")  -- The param is a void\n\t) then\n\t\treturn {}\n\tend\n\n\tlocal res = {}\n\tlocal idx = 1\n\tfor _, param in ipairs(a_Function.args or {}) do\n\t\tlocal t = param.type\n\t\tt = t:gsub(\"^const \", \"\")  -- Remove the \"const\" keyword, if present\n\t\tres[idx] =\n\t\t{\n\t\t\tName = param.name,\n\t\t\tType = t,\n\t\t\tIsConst = (param.type:match(\"^const \") ~= nil),\n\t\t}\n\t\tidx = idx + 1\n\tend\n\treturn res\nend\n\n\n\n\n\n--- Parses the specified function's return values and returns their description as a table\n-- a_Function is the ToLua's classFunction object\nlocal function parseFunctionReturns(a_Function)\n\tlocal res = {}\n\tlocal idx = 1\n\tif (a_Function.type and (a_Function.type ~= \"void\")) then\n\t\tres[idx] = { Type = a_Function.type }\n\t\tidx = idx + 1\n\tend\n\tfor _, param in ipairs(a_Function.args or {}) do\n\t\tif ((param.mod == \"&\") or (param.ret == \"&\")) then\n\t\t\tres[idx] = { Type = param.type:gsub(\"^const \", \"\") }\n\t\t\tidx = idx + 1\n\t\tend\n\tend\n\treturn res\nend\n\n\n\n\n\nlocal function genFunctionMemberDocs(a_Self, a_Functions, a_Variables, a_Constants)\n\tassert(a_Self.lname)\n\n\tlocal fn = a_Functions[a_Self.lname] or {}\n\ta_Functions[a_Self.lname] = fn\n\n\tlocal desc =\n\t{\n\t\tLuaName = a_Self.lname,\n\t\tCType = a_Self.type,\n\t\tDoxyComment = a_Self.DoxyComment,\n\t\tParameters = parseFunctionParameters(a_Self),\n\t\tReturns = parseFunctionReturns(a_Self),\n\t}\n\tlocal _, _, hasStatic = string.find(a_Self.mod, \"^%s*(static)\")\n\tif (hasStatic) then\n\t\tdesc.IsStatic = true\n\tend\n\ttable.insert(fn, desc)\nend\n\n\n\n\n\nlocal function genVariableMemberDocs(a_Self, a_Functions, a_Variables, a_Constants)\n\tassert(a_Self.lname)\n\n\tlocal desc =\n\t{\n\t\tName = a_Self.lname,\n\t\tType = a_Self.type,\n\t\tDoxyComment = a_Self.DoxyComment,\n\t}\n\n\tif (string.find(a_Self.type,'const%s+') or string.find(a_Self.mod, 'tolua_readonly') or string.find(a_Self.mod, 'tolua_inherits'))  then\n\t\ta_Constants[a_Self.lname] = desc\n\telse\n\t\ta_Variables[a_Self.lname] = desc\n\tend\nend\n\n\n\n\n\n--- Generates the entire documentation for the API\n-- a_Package is ToLua++'s classPackage object\n-- Checks if the documentation folder is writable, if not, skips the docs generation\n-- Returns true if documentation was generated, false and message if not\nlocal function generateDocs(a_Package)\n\t-- Check if the docs folder is writable:\n\tlocal f, msg = io.open(\"docs/_files.lua\", \"w\")\n\tif not(f) then\n\t\treturn false, \"Cannot access the docs folder: \" .. msg\n\tend\n\tf:close()\n\n\t-- Generate the docs:\n\tclassPackage.genDocs = genPackageDocs\n\tclassClass.genDocs = genClassDocs\n\tclassFunction.genMemberDocs = genFunctionMemberDocs\n\tclassVariable.genMemberDocs = genVariableMemberDocs\n\ta_Package:genDocs()\n\treturn true\nend\n\n\n\n\n\n--- Outputs the cLuaState helper files.\n-- Called by ToLua++ before it starts outputting its generated files.\n-- a_Package is ToLua++'s classPackage object\nfunction pre_output_hook(a_Package)\n\tOutputLuaStateHelpers(a_Package)\n\n\t-- Generate the documentation:\n\t-- (must generate documentation before ToLua++ writes the bindings, because \"static\" information is lost at that point)\n\tlocal isSuccess, msg = generateDocs(a_Package)\n\tif not(isSuccess) then\n\t\tprint(\"API docs haven't been generated due to an error: \" .. (msg or \"<no message>\"))\n\telse\n\t\tprint(\"API docs have been generated.\");\n\tend\nend\n\n\n\n\n\n--- Outputs the documentation files.\n-- Called by ToLua++ after writing its generated files.\n-- a_Package is ToLua++'s classPackage object\nfunction post_output_hook(a_Package)\n\tprint(\"Lua bindings have been generated.\")\nend\n\n\n\n\n\n--- Provides DoxyComment processing while parsing the C++ code.\n-- Called by ToLua++ parser before it starts parsing the code.\n-- a_Package is the ToLua++'s classPackage object, currently unparsed\n-- The C++ code to be parsed is in a_Packade.code\nfunction preprocess_hook(a_Package)\n\tassert(a_Package)\n\tassert(type(a_Package.code) == \"string\")\n\n\t-- Replace all DoxyComments with placeholders so that they aren't erased later on:\n\ta_Package.code = a_Package.code\n\t\t:gsub(\"/%*%*%s*(.-)%s*%*/\",\n\t\t\tfunction (a_Comment)\n\t\t\t\tlocal n = g_ForwardDoxyComments.n + 1\n\t\t\t\tg_ForwardDoxyComments[n] = a_Comment\n\t\t\t\tg_ForwardDoxyComments.n = n\n\t\t\t\treturn \"\\17\" .. n ..\"\\18\"\n\t\t\tend\n\t\t)  -- Replace /** ... */ with an ID into a lookup table wrapped in DC1 and DC2\n\t\t:gsub(\"///<%s*(.-)%s*\\n%s*\",\n\t\t\tfunction (a_Comment)\n\t\t\t\tlocal n = g_BackwardDoxyComments.n + 1\n\t\t\t\tg_BackwardDoxyComments[n] = a_Comment\n\t\t\t\tg_BackwardDoxyComments.n = n\n\t\t\t\treturn \"\\19\" .. n ..\"\\20\\n\"\n\t\t\tend\n\t\t)  -- Replace ///< comments with an ID into a lookup table wrapped in DC3 and DC4\n\n\t--[[\n\t-- Output the preprocessed code out to a file for manual inspection:\n\tlocal f = io.open(\"code_out.cpp\", \"wb\")\n\tf:write(a_Package.code)\n\tf:close()\n\t--]]\nend\n\n\n\n\n\n--- Chooses the smaller of the indices, and the number indicating whether it chose the first or the second\n-- If one of the indices is nil, returns the other one\n-- If both indices are nil, returns nil\nlocal function chooseNextIndex(a_Index1, a_Index2)\n\tif not(a_Index1) then\n\t\treturn a_Index2, 2\n\tend\n\tif not(a_Index2) then\n\t\treturn a_Index1, 1\n\tend\n\tif (a_Index1 > a_Index2) then\n\t\treturn a_Index2, 2\n\telse\n\t\treturn a_Index1, 1\n\tend\nend\n\n\n\n\n\n--- Override for ToLua++'s own code extraction\n-- Called for each \"$cfile\" and \"$hfile\" directive in the package file\n-- a_FileName is the C++ header filename\n-- a_Contents is the code contents of the header file\n-- The function returns the code to be parsed by ToLua++\n-- In addition to the original function, this override extracts all DoxyComments as well\n-- This is needed when a function is marked with \"// tolua_export\" but its DoxyComment is not included\nfunction extract_code(a_FileName, a_Contents)\n\tlocal code = '\\n$#include \"' .. a_FileName .. '\"\\n'\n\ta_Contents= \"\\n\" .. a_Contents .. \"\\n\" -- add blank lines as sentinels\n\tlocal _, e, c, t = strfind(a_Contents, \"\\n([^\\n]-)[Tt][Oo][Ll][Uu][Aa]_([^%s]*)[^\\n]*\\n\")\n\tlocal dcb, dce, dc = strfind(a_Contents, \"/%*%*.-%*/\")\n\tlocal nextEnd, whichOne = chooseNextIndex(e, dce)\n\twhile (nextEnd) do\n\t\tif (whichOne == 2) then\n\t\t\tcode = code .. a_Contents:sub(dcb, dce) .. \"\\n\"\n\t\telse\n\t\t\tt = strlower(t)\n\t\t\tif (t == \"begin\") then\n\t\t\t\t_, nextEnd, c = strfind(a_Contents,\"(.-)\\n[^\\n]*[Tt][Oo][Ll][Uu][Aa]_[Ee][Nn][Dd][^\\n]*\\n\", e)\n\t\t\t\tif not(nextEnd) then\n\t\t\t\t tolua_error(\"Unbalanced 'tolua_begin' directive in header file \" .. a_FileName)\n\t\t\t\tend\n\t\t\tend\n\t\t\tcode = code .. c .. \"\\n\"\n\t\tend\n\t\t_, e, c, t = strfind(a_Contents, \"\\n([^\\n]-)[Tt][Oo][Ll][Uu][Aa]_([^%s]*)[^\\n]*\\n\", nextEnd)\n\t\tdcb, dce, dc = strfind(a_Contents, \"/%*%*.-%*/\", nextEnd)\n\t\tnextEnd, whichOne = chooseNextIndex(e, dce)\n\tend\n\treturn code\nend\n\n\n\n\n\n--- Installs a hook that is called by ToLua++ for each instantiation of classEnumerate\n-- The hook is used to fix DoxyComments in enums\nlocal function installEnumHook()\n\t--Hook for normal enums\n\tlocal oldEnumerate = Enumerate\n\tEnumerate = function (a_Name, a_Body, a_VarName, a_Type)\n\t\t-- We need to remove the DoxyComment items from the enum\n\t\t-- otherwise ToLua++ parser would make an enum value out of them\n\t\ta_Body = string.gsub(a_Body, \",[%s\\n]*}\", \"\\n}\") -- eliminate last ','\n\t\tlocal t = split(strsub(a_Body, 2, -2), ',') -- eliminate braces\n\t\tlocal doxyComments = {}\n\t\tlocal enumValues = {}\n\t\tlocal numEnumValues = 0\n\t\tfor _, txt in ipairs(t) do\n\t\t\ttxt = txt:gsub(\"(%b\\17\\18)\",\n\t\t\t\tfunction (a_CommentID)\n\t\t\t\t\tdoxyComments[numEnumValues + 1] = g_ForwardDoxyComments[tonumber(a_CommentID:sub(2, -2))]\n\t\t\t\t\treturn \"\"\n\t\t\t\tend\n\t\t\t):gsub(\"(%b\\19\\20)\",\n\t\t\t\tfunction (a_CommentID)\n\t\t\t\t\tdoxyComments[numEnumValues] = g_BackwardDoxyComments[tonumber(a_CommentID:sub(2, -2))]\n\t\t\t\t\treturn \"\"\n\t\t\t\tend\n\t\t\t)\n\t\t\tif (txt ~= \"\") then\n\t\t\t\tnumEnumValues = numEnumValues + 1\n\t\t\t\tenumValues[numEnumValues] = txt\n\t\t\tend\n\t\tend\n\t\tlocal res = oldEnumerate(a_Name, \"{\" .. table.concat(enumValues, \",\") .. \"}\", a_VarName, a_Type)\n\t\tres.DoxyComments = doxyComments\n\t\treturn res\n\tend\n\n\t--Hook for scoped enums\n\tlocal oldScopedEnum = ScopedEnum\n\tScopedEnum = function (a_Name, a_Body, a_VarName, a_Type)\n\t\t-- We need to remove the DoxyComment items from the enum class\n\t\t-- otherwise ToLua++ parser would make an enum value out of them\n\t\ta_Body = string.gsub(a_Body, \",[%s\\n]*}\", \"\\n}\") -- eliminate last ','\n\t\tlocal t = split(strsub(a_Body, 2, -2), ',') -- eliminate braces\n\t\tlocal doxyComments = {}\n\t\tlocal enumValues = {}\n\t\tlocal numEnumValues = 0\n\t\tfor _, txt in ipairs(t) do\n\t\t\ttxt = txt:gsub(\"(%b\\17\\18)\",\n\t\t\t\tfunction (a_CommentID)\n\t\t\t\t\tdoxyComments[numEnumValues + 1] = g_ForwardDoxyComments[tonumber(a_CommentID:sub(2, -2))]\n\t\t\t\t\treturn \"\"\n\t\t\t\tend\n\t\t\t):gsub(\"(%b\\19\\20)\",\n\t\t\t\tfunction (a_CommentID)\n\t\t\t\t\tdoxyComments[numEnumValues] = g_BackwardDoxyComments[tonumber(a_CommentID:sub(2, -2))]\n\t\t\t\t\treturn \"\"\n\t\t\t\tend\n\t\t\t)\n\t\t\tif (txt ~= \"\") then\n\t\t\t\tnumEnumValues = numEnumValues + 1\n\t\t\t\tenumValues[numEnumValues] = txt\n\t\t\tend\n\t\tend\n\t\tlocal res = oldScopedEnum(a_Name, \"{\" .. table.concat(enumValues, \",\") .. \"}\", a_VarName, a_Type)\n\t\tres.DoxyComments = doxyComments\n\t\treturn res\n\tend\nend\n\n\n\n\n\nif not(TOLUA_VERSION) then\n\t-- BindingsProcessor has been called standalone, invoke the entire ToLua++ machinery:\n\tprint(\"Generating Lua bindings and docs...\")\n\tinvokeToLua()\n\treturn\nelse\n\t-- We're being executed from inside the ToLua++ parser. Install the needed hooks:\n\tinstallEnumHook()\nend\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/BlockState.cpp",
    "content": "#include \"Globals.h\"\n#include \"BlockState.h\"\n\n\n\n\n\nBlockState::BlockState():\n\tmChecksum(initializeChecksum())\n{\n\t// Nothing needed yet\n}\n\n\n\n\n\nBlockState::BlockState(const AString & aKey, const AString & aValue):\n\tmState({{aKey, aValue}}),\n\tmChecksum(initializeChecksum())\n{\n}\n\n\n\n\n\nBlockState::BlockState(std::initializer_list<std::pair<const AString, AString>> aKeysAndValues):\n\tmState(aKeysAndValues),\n\tmChecksum(initializeChecksum())\n{\n}\n\n\n\n\n\nBlockState::BlockState(const std::map<AString, AString> & aKeysAndValues):\n\tmState(aKeysAndValues),\n\tmChecksum(initializeChecksum())\n{\n}\n\n\n\n\n\nBlockState::BlockState(std::map<AString, AString> && aKeysAndValues):\n\tmState(std::move(aKeysAndValues)),\n\tmChecksum(initializeChecksum())\n{\n}\n\n\n\n\n\nBlockState::BlockState(const BlockState & aCopyFrom, std::initializer_list<std::pair<const AString, AString>> aAdditionalKeysAndValues):\n\tmState(aCopyFrom.mState)\n{\n\tfor (const auto & kav: aAdditionalKeysAndValues)\n\t{\n\t\tmState[kav.first] = kav.second;\n\t}\n\tmChecksum = initializeChecksum();\n}\n\n\n\n\n\nBlockState::BlockState(const BlockState & aCopyFrom, const std::map<AString, AString> & aAdditionalKeysAndValues):\n\tmState(aCopyFrom.mState)\n{\n\tfor (const auto & kav: aAdditionalKeysAndValues)\n\t{\n\t\tmState[kav.first] = kav.second;\n\t}\n\tmChecksum = initializeChecksum();\n}\n\n\n\n\n\nbool BlockState::operator <(const BlockState & aOther) const\n{\n\t// Fast-return this using checksum\n\tif (mChecksum != aOther.mChecksum)\n\t{\n\t\treturn (mChecksum < aOther.mChecksum);\n\t}\n\n\t// Can fast-return this due to how comparison works\n\tif (mState.size() != aOther.mState.size())\n\t{\n\t\treturn (mState.size() < aOther.mState.size());\n\t}\n\n\tauto itA = mState.begin();\n\tauto itOther = aOther.mState.begin();\n\n\t// don't need to check itOther, size checks above ensure size(A) == size(O)\n\twhile (itA != mState.end())\n\t{\n\t\t{\n\t\t\tconst auto cmp = itA->first.compare(itOther->first);\n\t\t\tif (cmp != 0)\n\t\t\t{\n\t\t\t\treturn (cmp < 0);\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tconst auto cmp = itA->second.compare(itOther->second);\n\t\t\tif (cmp != 0)\n\t\t\t{\n\t\t\t\treturn (cmp < 0);\n\t\t\t}\n\t\t}\n\n\t\t++itA;\n\t\t++itOther;\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nbool BlockState::operator ==(const BlockState & aOther) const\n{\n\t// Fast-fail if the checksums differ or differrent counts:\n\tif ((mChecksum != aOther.mChecksum) || (mState.size() != aOther.mState.size()))\n\t{\n\t\treturn false;\n\t}\n\n\t// Slow-check everything if the checksums match:\n\treturn std::equal(mState.begin(), mState.end(), aOther.mState.begin());\n}\n\n\n\n\n\nconst AString & BlockState::value(const AString & aKey) const\n{\n\tauto itr = mState.find(aKey);\n\tif (itr == mState.end())\n\t{\n\t\tstatic AString empty;\n\t\treturn empty;\n\t}\n\treturn itr->second;\n}\n\n\n\n\n\nUInt32 BlockState::initializeChecksum()\n{\n\tremoveEmptyKeys();\n\n\t// Calculate the checksum as a XOR of all mState keys' and values' checksums\n\t// This way we don't depend on the std::map's ordering\n\tUInt32 res = 0;\n\tfor (const auto & kv: mState)\n\t{\n\t\tauto partial = partialChecksum(kv.first) ^ partialChecksum(kv.second);\n\t\tres = res ^ partial;\n\t}\n\treturn res;\n}\n\n\n\n\n\nvoid BlockState::removeEmptyKeys()\n{\n\tfor (auto itr = mState.begin(); itr != mState.end();)\n\t{\n\t\tif (itr->second.empty())\n\t\t{\n\t\t\titr = mState.erase(itr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++itr;\n\t\t}\n\t}\n}\n\n\n\n\n\nUInt32 BlockState::partialChecksum(const AString & aString)\n{\n\tUInt32 shift = 0;\n\tUInt32 res = 0;\n\tfor (auto ch: aString)\n\t{\n\t\tUInt32 v = static_cast<UInt8>(ch);\n\t\tv = v << shift;\n\t\tshift = (shift + 1) % 24;\n\t\tres = res ^ v;\n\t}\n\treturn res;\n}\n"
  },
  {
    "path": "src/Bindings/BlockState.h",
    "content": "#pragma once\n\n#include <initializer_list>\n\n\n\n\n\n/** Represents the state of a single block (previously known as \"block meta\").\nThe state consists of a map of string -> string, plus a mechanism for fast equality checks between two BlockState instances.\nOnce a BlockState instance is created, it is then immutable - there's no way of changing it, only by creating a (modified) copy.\nA BlockState instance can be created from hard-coded data or from dynamic data:\n\tBlockState bs({{\"key1\", \"value1\"}, {key2\", \"value2\"}});  // Hard-coded\n\t- or -\n\tstd::map<AString, AString> map({{\"key1\", \"value1\"}, {key2\", \"value2\"}});\n\tmap[\"key3\"] = \"value3\";\n\tBlockState bs(map);  // From dynamic data\n*/\nclass BlockState\n{\npublic:\n\n\t/** Creates a new instance with an empty map. */\n\tBlockState();\n\n\t/** Creates a new instance consisting of a single key-value pair.\n\tIf the value is empty, it is not stored wihin the map. */\n\tBlockState(const AString & aKey, const AString & aValue);\n\n\t/** Creates a new instance initialized with several (hard-coded) key-value pairs.\n\tAny key with an empty value is not stored within the map. */\n\tBlockState(std::initializer_list<std::pair<const AString, AString>> aKeysAndValues);\n\n\t/** Creates a new instance initialized with several (dynamic) key-value pairs.\n\tMakes a copy of aKeysAndValues for this object.\n\tAny key with an empty value is not stored within the map. */\n\tBlockState(const std::map<AString, AString> & aKeysAndValues);\n\n\t/** Creates a new instance initialized with several (dynamic) key-value pairs.\n\tAny key with an empty value is not stored within the map. */\n\tBlockState(std::map<AString, AString> && aKeysAndValues);\n\n\t/** Creates a copy of the specified BlockState with the (hard-coded) additional keys and values added to it.\n\tAny key in aAdditionalKeysAndValues that is already present in aCopyFrom is overwritten with the aAdditionalKeysAndValues' one.\n\tAny key with an empty value is not stored in the map.\n\t(it's possible to erase a key from aCopyFrom by setting it to empty string in aAdditionalKeysAndValues). */\n\tBlockState(const BlockState & aCopyFrom, std::initializer_list<std::pair<const AString, AString>> aAdditionalKeysAndValues);\n\n\t/** Creates a copy of the specified BlockState with the (dynamic) additional keys and values added to it.\n\tAny key in aAdditionalKeysAndValues that is already present in aCopyFrom is overwritten with the aAdditionalKeysAndValues' one.\n\tAny key with an empty value is not stored in the map.\n\t(it's possible to erase a key from aCopyFrom by setting it to empty string in aAdditionalKeysAndValues). */\n\tBlockState(const BlockState & aCopyFrom, const std::map<AString, AString> & aAdditionalKeysAndValues);\n\n\t/** Less-than comparison. */\n\tbool operator <(const BlockState & aOther) const;\n\n\t/** Fast equality check. */\n\tbool operator ==(const BlockState & aOther) const;\n\n\t/** Fast inequality check. */\n\tbool operator !=(const BlockState & aOther) const\n\t{\n\t\treturn !(operator ==(aOther));\n\t}\n\n\t/** Returns the value at the specified key.\n\tIf the key is not present, returns an empty string. */\n\tconst AString & value(const AString & aKey) const;\n\n\nprotected:\n\n\t/** The state, represented as a string->string map. */\n\tstd::map<AString, AString> mState;\n\n\t/** The checksum used for the fast equality check.\n\tThis is calculated upon creation. */\n\tUInt32 mChecksum;\n\n\n\t/** Normalizes mState and calculates the checksum from it.\n\tRemoves all the empty values from mState.\n\tUsed only from constructors. */\n\tUInt32 initializeChecksum();\n\n\t/** Removes all the keys from mState that have an empty value. */\n\tvoid removeEmptyKeys();\n\n\t/** Calculates the partial checksum of a single string.\n\tUsed from within initializeChecksum(). */\n\tUInt32 partialChecksum(const AString & aString);\n};\n"
  },
  {
    "path": "src/Bindings/BlockTypePalette.cpp",
    "content": "#include \"Globals.h\"\n#include \"BlockTypePalette.h\"\n#include \"json/value.h\"\n#include \"JsonUtils.h\"\n\n\n\n\n\n/** Returns the index into aString >= aStartIdx at which the next separator occurs.\nSeparator is one of \\t, \\n or \\r.\nReturns AString::npos if no such separator. */\nstatic size_t findNextSeparator(const AString & aString, size_t aStartIdx = 0)\n{\n\tfor (size_t i = aStartIdx, len = aString.length(); i < len; ++i)\n\t{\n\t\tswitch (aString[i])\n\t\t{\n\t\t\tcase '\\t':\n\t\t\tcase '\\n':\n\t\t\tcase '\\r':\n\t\t\t{\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t}\n\treturn AString::npos;\n}\n\n\n\n\n\nBlockTypePalette::BlockTypePalette():\n\tmMaxIndex(0)\n{\n}\n\n\n\n\n\nUInt32 BlockTypePalette::index(const AString & aBlockTypeName, const BlockState & aBlockState)\n{\n\tauto idx = maybeIndex(aBlockTypeName, aBlockState);\n\tif (idx.second)\n\t{\n\t\treturn idx.first;\n\t}\n\n\t// Not found, append:\n\tauto index = mMaxIndex++;\n\tmBlockToNumber[aBlockTypeName][aBlockState] = index;\n\tmNumberToBlock[index] = {aBlockTypeName, aBlockState};\n\treturn index;\n}\n\n\n\n\n\nstd::pair<UInt32, bool> BlockTypePalette::maybeIndex(const AString & aBlockTypeName, const BlockState & aBlockState) const\n{\n\tauto itr1 = mBlockToNumber.find(aBlockTypeName);\n\tif (itr1 == mBlockToNumber.end())\n\t{\n\t\treturn {0, false};\n\t}\n\tauto itr2 = itr1->second.find(aBlockState);\n\tif (itr2 == itr1->second.end())\n\t{\n\t\treturn {0, false};\n\t}\n\treturn {itr2->second, true};\n}\n\n\n\n\n\nUInt32 BlockTypePalette::count() const\n{\n\treturn static_cast<UInt32>(mNumberToBlock.size());\n}\n\n\n\n\n\nconst std::pair<AString, BlockState> & BlockTypePalette::entry(UInt32 aIndex) const\n{\n\tauto itr = mNumberToBlock.find(aIndex);\n\tif (itr == mNumberToBlock.end())\n\t{\n\t\tthrow NoSuchIndexException(aIndex);\n\t}\n\treturn itr->second;\n}\n\n\n\n\n\nstd::map<UInt32, UInt32> BlockTypePalette::createTransformMapAddMissing(const BlockTypePalette & aFrom)\n{\n\tstd::map<UInt32, UInt32> res;\n\tfor (const auto & fromEntry: aFrom.mNumberToBlock)\n\t{\n\t\tauto fromIndex = fromEntry.first;\n\t\tconst auto & blockTypeName = fromEntry.second.first;\n\t\tconst auto & blockState = fromEntry.second.second;\n\t\tres[fromIndex] = index(blockTypeName, blockState);\n\t}\n\treturn res;\n}\n\n\n\n\n\nstd::map<UInt32, UInt32> BlockTypePalette::createTransformMapWithFallback(const BlockTypePalette & aFrom, UInt32 aFallbackIndex) const\n{\n\tstd::map<UInt32, UInt32> res;\n\tfor (const auto & fromEntry: aFrom.mNumberToBlock)\n\t{\n\t\tauto fromIndex = fromEntry.first;\n\t\tconst auto & blockTypeName = fromEntry.second.first;\n\t\tconst auto & blockState = fromEntry.second.second;\n\t\tauto thisIndex = maybeIndex(blockTypeName, blockState);\n\t\tif (thisIndex.second)\n\t\t{\n\t\t\t// The entry was found in this\n\t\t\tres[fromIndex] = thisIndex.first;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// The entry was NOT found in this, replace with fallback:\n\t\t\tres[fromIndex] = aFallbackIndex;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n\nvoid BlockTypePalette::loadFromString(const AString & aString)\n{\n\tstatic const AString hdrTsvRegular = \"BlockTypePalette\";\n\tstatic const AString hdrTsvUpgrade = \"UpgradeBlockTypePalette\";\n\n\t// Detect format by checking the header line (none -> JSON):\n\tif (aString.substr(0, hdrTsvRegular.length()) == hdrTsvRegular)\n\t{\n\t\treturn loadFromTsv(aString, false);\n\t}\n\telse if (aString.substr(0, hdrTsvUpgrade.length()) == hdrTsvUpgrade)\n\t{\n\t\treturn loadFromTsv(aString, true);\n\t}\n\treturn loadFromJsonString(aString);\n}\n\n\n\n\n\nvoid BlockTypePalette::loadFromJsonString(const AString & aJsonPalette)\n{\n\t// Parse the string into JSON object:\n\tJson::Value root;\n\tstd::string errs;\n\tif (!JsonUtils::ParseString(aJsonPalette, root, &errs))\n\t{\n\t\tthrow LoadFailedException(errs);\n\t}\n\n\t// Sanity-check the JSON's structure:\n\tif (!root.isObject())\n\t{\n\t\tthrow LoadFailedException(\"Incorrect palette format, expected an object at root.\");\n\t}\n\n\t// Load the palette:\n\tfor (auto itr = root.begin(), end = root.end(); itr != end; ++itr)\n\t{\n\t\tconst auto & blockTypeName = itr.name();\n\t\tconst auto & states = (*itr)[\"states\"];\n\t\tif (states == Json::Value())\n\t\t{\n\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Missing \\\"states\\\" for block type \\\"{}\\\"\"), blockTypeName));\n\t\t}\n\t\tfor (const auto & state: states)\n\t\t{\n\t\t\tauto id = static_cast<UInt32>(std::stoul(state[\"id\"].asString()));\n\t\t\tstd::map<AString, AString> props;\n\t\t\tif (state.isMember(\"properties\"))\n\t\t\t{\n\t\t\t\tconst auto & properties = state[\"properties\"];\n\t\t\t\tif (!properties.isObject())\n\t\t\t\t{\n\t\t\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Member \\\"properties\\\" is not a JSON object (block type \\\"{}\\\", id {}).\"), blockTypeName, id));\n\t\t\t\t}\n\t\t\t\tfor (const auto & key: properties.getMemberNames())\n\t\t\t\t{\n\t\t\t\t\tprops[key] = properties[key].asString();\n\t\t\t\t}\n\t\t\t}\n\t\t\taddMapping(id, blockTypeName, props);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid BlockTypePalette::loadFromTsv(const AString & aTsvPalette, bool aIsUpgrade)\n{\n\tstatic const AString hdrTsvRegular = \"BlockTypePalette\";\n\tstatic const AString hdrTsvUpgrade = \"UpgradeBlockTypePalette\";\n\n\t// Check the file signature:\n\tauto idx = findNextSeparator(aTsvPalette);\n\tif ((idx == AString::npos) || (aTsvPalette[idx] == '\\t'))\n\t{\n\t\tthrow LoadFailedException(\"Invalid signature\");\n\t}\n\tauto signature = aTsvPalette.substr(0, idx);\n\tbool isUpgrade = (signature == hdrTsvUpgrade);\n\tif (!isUpgrade && (signature != hdrTsvRegular))\n\t{\n\t\tthrow LoadFailedException(\"Unknown signature\");\n\t}\n\tif (aTsvPalette[idx] == '\\r')   // CR of the CRLF pair, skip the LF:\n\t{\n\t\tidx += 1;\n\t}\n\n\t// Parse the header:\n\tbool hasHadVersion = false;\n\tAString commonPrefix;\n\tint line = 2;\n\tauto len = aTsvPalette.length();\n\twhile (true)\n\t{\n\t\tauto keyStart = idx + 1;\n\t\tauto keyEnd = findNextSeparator(aTsvPalette, idx + 1);\n\t\tif (keyEnd == AString::npos)\n\t\t{\n\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Invalid header key format on line {}\"), line));\n\t\t}\n\t\tif (keyEnd == idx + 1)  // Empty line, end of headers\n\t\t{\n\t\t\tif (aTsvPalette[keyEnd] == '\\r')  // CR of the CRLF pair, skip the LF:\n\t\t\t{\n\t\t\t\t++keyEnd;\n\t\t\t}\n\t\t\tidx = keyEnd;\n\t\t\t++line;\n\t\t\tbreak;\n\t\t}\n\t\tauto valueEnd = findNextSeparator(aTsvPalette, keyEnd + 1);\n\t\tif ((valueEnd == AString::npos) || (aTsvPalette[valueEnd] == '\\t'))\n\t\t{\n\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Invalid header value format on line {}\"), line));\n\t\t}\n\t\tauto key = aTsvPalette.substr(keyStart, keyEnd - keyStart);\n\t\tif (key == \"FileVersion\")\n\t\t{\n\t\t\tunsigned version = 0;\n\t\t\tauto value = aTsvPalette.substr(keyEnd + 1, valueEnd - keyEnd - 1);\n\t\t\tif (!StringToInteger(value, version))\n\t\t\t{\n\t\t\t\tthrow LoadFailedException(\"Invalid FileVersion value\");\n\t\t\t}\n\t\t\telse if (version != 1)\n\t\t\t{\n\t\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Unknown FileVersion: {}. Only version 1 is supported.\"), version));\n\t\t\t}\n\t\t\thasHadVersion = true;\n\t\t}\n\t\telse if (key == \"CommonPrefix\")\n\t\t{\n\t\t\tcommonPrefix = aTsvPalette.substr(keyEnd + 1, valueEnd - keyEnd - 1);\n\t\t}\n\t\tidx = valueEnd;\n\t\tif (aTsvPalette[idx] == '\\r')  // CR of the CRLF pair, skip the LF:\n\t\t{\n\t\t\t++idx;\n\t\t}\n\t\t++line;\n\t}\n\tif (!hasHadVersion)\n\t{\n\t\tthrow LoadFailedException(\"No FileVersion value\");\n\t}\n\n\t// Parse the data:\n\twhile (idx + 1 < len)\n\t{\n\t\tauto lineStart = idx + 1;\n\t\tauto idEnd = findNextSeparator(aTsvPalette, lineStart);\n\t\tif ((idEnd == AString::npos) || (aTsvPalette[idEnd] != '\\t'))\n\t\t{\n\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Incomplete data on line {} (id)\"), line));\n\t\t}\n\t\tUInt32 id;\n\t\tif (!StringToInteger(aTsvPalette.substr(lineStart, idEnd - lineStart), id))\n\t\t{\n\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Failed to parse id on line {}\"), line));\n\t\t}\n\t\tsize_t metaEnd = idEnd;\n\t\tif (isUpgrade)\n\t\t{\n\t\t\tmetaEnd = findNextSeparator(aTsvPalette, idEnd + 1);\n\t\t\tif ((metaEnd == AString::npos) || (aTsvPalette[metaEnd] != '\\t'))\n\t\t\t{\n\t\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Incomplete data on line {} (meta)\"), line));\n\t\t\t}\n\t\t\tUInt32 meta = 0;\n\t\t\tif (!StringToInteger(aTsvPalette.substr(idEnd + 1, metaEnd - idEnd - 1), meta))\n\t\t\t{\n\t\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Failed to parse meta on line {}\"), line));\n\t\t\t}\n\t\t\tif (meta > 15)\n\t\t\t{\n\t\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Invalid meta value on line {}: {}\"), line, meta));\n\t\t\t}\n\t\t\tid = (id * 16) | meta;\n\t\t}\n\t\tauto blockTypeEnd = findNextSeparator(aTsvPalette, metaEnd + 1);\n\t\tif (blockTypeEnd == AString::npos)\n\t\t{\n\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Incomplete data on line {} (blockTypeName)\"), line));\n\t\t}\n\t\tauto blockTypeName = aTsvPalette.substr(metaEnd + 1, blockTypeEnd - metaEnd - 1);\n\t\tauto blockStateEnd = blockTypeEnd;\n\t\tAStringMap blockState;\n\t\twhile (aTsvPalette[blockStateEnd] == '\\t')\n\t\t{\n\t\t\tauto keyEnd = findNextSeparator(aTsvPalette, blockStateEnd + 1);\n\t\t\tif ((keyEnd == AString::npos) || (aTsvPalette[keyEnd] != '\\t'))\n\t\t\t{\n\t\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Incomplete data on line {} (blockState key)\"), line));\n\t\t\t}\n\t\t\tauto valueEnd = findNextSeparator(aTsvPalette, keyEnd + 1);\n\t\t\tif (valueEnd == AString::npos)\n\t\t\t{\n\t\t\t\tthrow LoadFailedException(fmt::format(FMT_STRING(\"Incomplete data on line {} (blockState value)\"), line));\n\t\t\t}\n\t\t\tauto key = aTsvPalette.substr(blockStateEnd + 1, keyEnd - blockStateEnd - 1);\n\t\t\tauto value = aTsvPalette.substr(keyEnd + 1, valueEnd - keyEnd - 1);\n\t\t\tblockState[key] = value;\n\t\t\tblockStateEnd = valueEnd;\n\t\t}\n\t\taddMapping(id, commonPrefix + blockTypeName, std::move(blockState));\n\t\t++line;\n\t\tif (aTsvPalette[blockStateEnd] == '\\r')  // CR of the CRLF pair, skip the LF:\n\t\t{\n\t\t\t++blockStateEnd;\n\t\t}\n\t\tidx = blockStateEnd;\n\t}\n}\n\n\n\n\n\nvoid BlockTypePalette::addMapping(UInt32 aID, const AString & aBlockTypeName, const BlockState & aBlockState)\n{\n\tmNumberToBlock[aID] = {aBlockTypeName, aBlockState};\n\tmBlockToNumber[aBlockTypeName][aBlockState] = aID;\n\tif (aID > mMaxIndex)\n\t{\n\t\tmMaxIndex = aID;\n\t}\n}\n"
  },
  {
    "path": "src/Bindings/BlockTypePalette.h",
    "content": "#pragma once\n\n#include <utility>\n#include \"BlockState.h\"\n\n\n\n\n\n/** Holds a palette that maps between block type + state and numbers.\nUsed primarily by PalettedBlockArea to map from stringular block representation to numeric,\nand by protocols to map from stringular block representation to protocol-numeric.\nThe object itself provides no thread safety, users of this class need to handle locking, if required.\nNote that the palette itself doesn't support erasing;\nto erase, create a new instance and re-add only the wanted items.\n\nInternally, the object uses two synced maps, one for each translation direction.\n\nThe palette can be loaded from a string (file). The loader supports either the blocks.json file exported by\nthe vanilla server itself (https://wiki.vg/Data_Generators), or a processed text file generated by\nour tool $/Tools/BlockTypePaletteGenerator/, or a hand-written text file describing the upgrade from\n1.12 BlockType + BlockMeta to 1.13 string representations.\nThe text file is a TSV (tab-separated values), which basically means the data is generally structured as\n<value1><tab><value2><tab><value3><tab>...<valueN><eol>, where eol is the platform's CR / CRLF / LF lineend.\nThe file starts with a single value on the first line, \"BlockTypePalette\" or \"UpgradeBlockTypePalette\", which\nis used to detect the file format. The following lines are \"headers\", simple <key><tab><value><eol> entries\nthat contain the metadata about the file. \"FileVersion\" is a compulsory key, \"CommonPrefix\" is supported, others\nare ignored.\nThe headers are followed by an empty line (that signalizes the end of headers) and then the actual data.\nFor regular BlockTypePalette TSV file of version 1, the data is in the format:\n<index><tab><blockTypeName><tab><state1Name><tab><state1Value><tab><state2Name> ... <eol>\nFor the UpgradeBlockTypePalette TSV file of version 1, the data is in the format:\n<blockType><tab><blockMeta><tab><blockTypeName><tab><state1Name><tab><state1Value><tab><state2Name> ... <eol>\nIf a CommonPrefix header is present, its value is pre-pended to each blockTypeName loaded (thus allowing\nthe file to be overall smaller). */\nclass BlockTypePalette\n{\npublic:\n\n\t/** Exception that is thrown if requiesting an index not present in the palette. */\n\tclass NoSuchIndexException:\n\t\tpublic std::runtime_error\n\t{\n\t\tusing Super = std::runtime_error;\n\n\tpublic:\n\t\tNoSuchIndexException(UInt32 aIndex):\n\t\t\tSuper(fmt::format(FMT_STRING(\"No such palette index: {}\"), aIndex))\n\t\t{\n\t\t}\n\t};\n\n\n\t/** Exception that is thrown when loading the palette fails hard (bad format). */\n\tclass LoadFailedException:\n\t\tpublic std::runtime_error\n\t{\n\t\tusing Super = std::runtime_error;\n\n\tpublic:\n\t\tLoadFailedException(const AString & aReason):\n\t\t\tSuper(aReason)\n\t\t{\n\t\t}\n\t};\n\n\n\n\t/** Create a new empty instance. */\n\tBlockTypePalette();\n\n\t/** Returns the index of the specified block type name and state.\n\tIf the combination is not found, it is added to the palette and the new index is returned. */\n\tUInt32 index(const AString & aBlockTypeName, const BlockState & aBlockState);\n\n\t/** Returns the <index, true> of the specified block type name and state, if it exists.\n\tIf the combination is not found, returns <undefined, false>. */\n\tstd::pair<UInt32, bool> maybeIndex(const AString & aBlockTypeName, const BlockState & aBlockState) const;\n\n\t/** Returns the total number of entries in the palette. */\n\tUInt32 count() const;\n\n\t/** Returns the blockspec represented by the specified palette index.\n\tIf the index is not valid, throws a NoSuchIndexException. */\n\tconst std::pair<AString, BlockState> & entry(UInt32 aIndex) const;\n\n\t/** Returns an index-transform map from aFrom to this (this.entry(idx) == aFrom.entry(res[idx])).\n\tEntries from aFrom that are not present in this are added.\n\tUsed when pasting two areas, to transform the src palette to dst palette. */\n\tstd::map<UInt32, UInt32> createTransformMapAddMissing(const BlockTypePalette & aFrom);\n\n\t/** Returns an index-transform map from aFrom to this (this.entry(idx) == aFrom.entry(res[idx])).\n\tEntries from aFrom that are not present in this are assigned the fallback index.\n\tUsed for protocol block type mapping. */\n\tstd::map<UInt32, UInt32> createTransformMapWithFallback(const BlockTypePalette & aFrom, UInt32 aFallbackIndex) const;\n\n\t/** Loads the palette from the string representation.\n\tThrows a LoadFailedException if the loading fails hard (bad string format);\n\tbut still a part of the data may already be loaded at that point.\n\tIf the string specifies duplicate entries (either to already existing entries, or to itself),\n\tthe duplicates replace the current values silently (this allows us to chain multiple files as \"overrides\".\n\tAuto-detects the string format (json / tsv, normal / upgrade palette) and calls the appropriate load function. */\n\tvoid loadFromString(const AString & aString);\n\n\nprotected:\n\n\t/** The mapping from numeric to stringular representation.\n\tmNumberToBlock[index] = {\"blockTypeName\", blockState}. */\n\tstd::map<UInt32, std::pair<AString, BlockState>> mNumberToBlock;\n\n\t/** The mapping from stringular to numeric representation.\n\tmStringToNumber[\"blockTypeName\"][blockState] = index. */\n\tstd::unordered_map<AString, std::map<BlockState, UInt32>> mBlockToNumber;\n\n\t/** The maximum index ever used in the maps.\n\tUsed when adding new entries through the index() call. */\n\tUInt32 mMaxIndex;\n\n\n\t/** Loads the palette from the JSON representation, https://wiki.vg/Data_Generators\n\tThrows a LoadFailedException if the loading fails hard (bad string format);\n\tbut still a part of the data may already be loaded at that point.\n\tSee also: loadFromString(). */\n\tvoid loadFromJsonString(const AString & aJsonPalette);\n\n\t/** Loads the palette from the regular or upgrade TSV representation.\n\taIsUpgrade specifies whether the format is an upgrade TSV (true) or a regular one (false)\n\tThrows a LoadFailedException if the loading fails hard (bad string format);\n\tbut still a part of the data may already be loaded at that point.\n\tSee also: loadFromString(). */\n\tvoid loadFromTsv(const AString & aTsvPalette, bool aIsUpgrade);\n\n\t/** Adds a mapping between the numeric and stringular representation into both maps,\n\tupdates the mMaxIndex, if appropriate.\n\tSilently overwrites any previous mapping for the ID, if present, but keeps the old string->id mapping. */\n\tvoid addMapping(UInt32 aID, const AString & aBlockTypeName, const BlockState & aBlockState);\n};\n"
  },
  {
    "path": "src/Bindings/BlockTypeRegistry.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"BlockTypeRegistry.h\"\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// BlockInfo:\n\nBlockInfo::BlockInfo(\n\tconst AString & aPluginName,\n\tconst AString & aBlockTypeName,\n\tstd::shared_ptr<cBlockHandler> aHandler,\n\tconst std::map<AString, AString> & aHints,\n\tconst std::map<AString, BlockInfo::HintCallback> & aHintCallbacks\n):\n\tm_PluginName(aPluginName),\n\tm_BlockTypeName(aBlockTypeName),\n\tm_Handler(std::move(aHandler)),\n\tm_Hints(aHints),\n\tm_HintCallbacks(aHintCallbacks)\n{\n}\n\n\n\n\n\nAString BlockInfo::hintValue(\n\tconst AString & aHintName,\n\tconst BlockState & aBlockState\n)\n{\n\t// Search the hint callbacks first:\n\tauto itrC = m_HintCallbacks.find(aHintName);\n\tif (itrC != m_HintCallbacks.end())\n\t{\n\t\t// Hint callback found, use it:\n\t\treturn itrC->second(m_BlockTypeName, aBlockState);\n\t}\n\n\t// Search the static hints:\n\tauto itr = m_Hints.find(aHintName);\n\tif (itr != m_Hints.end())\n\t{\n\t\t// Hint found, use it:\n\t\treturn itr->second;\n\t}\n\n\t// Nothing found, return empty string:\n\treturn AString();\n}\n\n\n\n\n\nvoid BlockInfo::setHint(const AString & aHintKey, const AString & aHintValue)\n{\n\tm_Hints[aHintKey] = aHintValue;\n\n\t// Warn if the hint is already provided by a callback (aHintValue will be ignored when evaluating the hint):\n\tauto itrC = m_HintCallbacks.find(aHintKey);\n\tif (itrC != m_HintCallbacks.end())\n\t{\n\t\tLOGINFO(\"Setting a static hint %s for block type %s, but there's already a callback for that hint. The static hint will be ignored.\",\n\t\t\taHintKey.c_str(), m_BlockTypeName.c_str()\n\t\t);\n\t}\n}\n\n\n\n\n\nvoid BlockInfo::removeHint(const AString & aHintKey)\n{\n\tm_Hints.erase(aHintKey);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// BlockTypeRegistry:\n\nvoid BlockTypeRegistry::registerBlockType(\n\tconst AString & aPluginName,\n\tconst AString & aBlockTypeName,\n\tstd::shared_ptr<cBlockHandler> aHandler,\n\tconst std::map<AString, AString> & aHints,\n\tconst std::map<AString, BlockInfo::HintCallback> & aHintCallbacks\n)\n{\n\tauto blockInfo = std::make_shared<BlockInfo>(\n\t\taPluginName, aBlockTypeName, std::move(aHandler), aHints, aHintCallbacks\n\t);\n\n\t// Check previous registrations:\n\tcCSLock lock(m_CSRegistry);\n\tauto itr = m_Registry.find(aBlockTypeName);\n\tif (itr != m_Registry.end())\n\t{\n\t\tif (itr->second->pluginName() != aPluginName)\n\t\t{\n\t\t\tthrow AlreadyRegisteredException(itr->second, blockInfo);\n\t\t}\n\t}\n\n\t// Store the registration:\n\tm_Registry[aBlockTypeName] = blockInfo;\n}\n\n\n\n\n\nstd::shared_ptr<BlockInfo> BlockTypeRegistry::blockInfo(const AString & aBlockTypeName)\n{\n\tcCSLock lock(m_CSRegistry);\n\tauto itr = m_Registry.find(aBlockTypeName);\n\tif (itr == m_Registry.end())\n\t{\n\t\treturn nullptr;\n\t}\n\treturn itr->second;\n}\n\n\n\n\n\nvoid BlockTypeRegistry::removeAllByPlugin(const AString & aPluginName)\n{\n\tcCSLock lock(m_CSRegistry);\n\tfor (auto itr = m_Registry.begin(); itr != m_Registry.end();)\n\t{\n\t\tif (itr->second->pluginName() == aPluginName)\n\t\t{\n\t\t\titr = m_Registry.erase(itr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++itr;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid BlockTypeRegistry::setBlockTypeHint(\n\tconst AString & aBlockTypeName,\n\tconst AString & aHintKey,\n\tconst AString & aHintValue\n)\n{\n\tcCSLock lock(m_CSRegistry);\n\tauto blockInfo = m_Registry.find(aBlockTypeName);\n\tif (blockInfo == m_Registry.end())\n\t{\n\t\tthrow NotRegisteredException(aBlockTypeName, aHintKey, aHintValue);\n\t}\n\tblockInfo->second->setHint(aHintKey, aHintValue);\n}\n\n\n\n\n\nvoid BlockTypeRegistry::removeBlockTypeHint(\n\tconst AString & aBlockTypeName,\n\tconst AString & aHintKey\n)\n{\n\tcCSLock lock(m_CSRegistry);\n\tauto blockInfo = m_Registry.find(aBlockTypeName);\n\tif (blockInfo == m_Registry.end())\n\t{\n\t\treturn;\n\t}\n\tblockInfo->second->removeHint(aHintKey);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// BlockTypeRegistry::AlreadyRegisteredException:\n\nBlockTypeRegistry::AlreadyRegisteredException::AlreadyRegisteredException(\n\tconst std::shared_ptr<BlockInfo> & aPreviousRegistration,\n\tconst std::shared_ptr<BlockInfo> & aNewRegistration\n) :\n\tSuper(message(aPreviousRegistration, aNewRegistration)),\n\tm_PreviousRegistration(aPreviousRegistration),\n\tm_NewRegistration(aNewRegistration)\n{\n}\n\n\n\n\n\nAString BlockTypeRegistry::AlreadyRegisteredException::message(\n\tconst std::shared_ptr<BlockInfo> & aPreviousRegistration,\n\tconst std::shared_ptr<BlockInfo> & aNewRegistration\n)\n{\n\treturn fmt::format(\n\t\tFMT_STRING(\"Attempting to register BlockTypeName {} from plugin {}, while it is already registered in plugin {}\"),\n\t\taNewRegistration->blockTypeName(),\n\t\taNewRegistration->pluginName(),\n\t\taPreviousRegistration->pluginName()\n\t);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// BlockTypeRegistry::NotRegisteredException:\n\nBlockTypeRegistry::NotRegisteredException::NotRegisteredException(\n\tconst AString & aBlockTypeName,\n\tconst AString & aHintKey,\n\tconst AString & aHintValue\n):\n\tSuper(fmt::format(\n\t\tFMT_STRING(\"Attempting to set a hint of nonexistent BlockTypeName.\\n\\tBlockTypeName = {}\\n\\tHintKey = {}\\n\\tHintValue = {}\"),\n\t\taBlockTypeName,\n\t\taHintKey,\n\t\taHintValue\n\t))\n{\n}\n"
  },
  {
    "path": "src/Bindings/BlockTypeRegistry.h",
    "content": "#pragma once\n\n\n\n\n\n#include <map>\n#include <functional>\n\n\n\n\n\n// fwd:\nclass cBlockHandler;\nclass BlockState;\n\n\n\n\n\n/** Complete information about a single block type.\nThe BlockTypeRegistry uses this structure to store the registered information. */\nclass BlockInfo\n{\npublic:\n\n\t/** Callback is used to query block hints dynamically, based on the current BlockState.\n\tUseful for example for redstone lamps that can be turned on or off. */\n\tusing HintCallback = std::function<AString(const AString & aTypeName, const BlockState & aBlockState)>;\n\n\n\t/** Creates a new instance with the specified BlockTypeName and handler / hints / callbacks.\n\taPluginName specifies the name of the plugin to associate with the block type (to allow unload / reload). */\n\tBlockInfo(\n\t\tconst AString & aPluginName,\n\t\tconst AString & aBlockTypeName,\n\t\tstd::shared_ptr<cBlockHandler> aHandler,\n\t\tconst std::map<AString, AString> & aHints = std::map<AString, AString>(),\n\t\tconst std::map<AString, HintCallback> & aHintCallbacks = std::map<AString, HintCallback>()\n\t);\n\n\n\t/** Retrieves the value associated with the specified hint for this specific BlockTypeName and BlockState.\n\tQueries hint callbacks first, then static hints if a callback doesn't exist.\n\tReturns an empty string if hint not found at all. */\n\tAString hintValue(\n\t\tconst AString & aHintName,\n\t\tconst BlockState & aBlockState\n\t);\n\n\t// Simple getters:\n\tconst AString & pluginName() const { return m_PluginName; }\n\tconst AString & blockTypeName() const { return m_BlockTypeName; }\n\tstd::shared_ptr<cBlockHandler> handler() const { return m_Handler; }\n\n\t/** Sets (creates or updates) a static hint.\n\tHints provided by callbacks are unaffected by this - callbacks are \"higher priority\", they overwrite anything set here.\n\tLogs an info message if the hint is already provided by a hint callback. */\n\tvoid setHint(const AString & aHintKey, const AString & aHintValue);\n\n\t/** Removes a hint.\n\tSilently ignored if the hint hasn't been previously set. */\n\tvoid removeHint(const AString & aHintKey);\n\n\nprivate:\n\n\t/** The name of the plugin that registered the block. */\n\tAString m_PluginName;\n\n\t/** The name of the block type, such as \"minecraft:redstone_lamp\" */\n\tAString m_BlockTypeName;\n\n\t/** The callbacks to call for various interaction. */\n\tstd::shared_ptr<cBlockHandler> m_Handler;\n\n\t/** Optional static hints for any subsystem to use, such as \"IsSnowable\" -> \"1\".\n\tHint callbacks are of higher priority than m_Hints - if a hint is provided by a m_HintCallback, its value in m_Hints is ignored. */\n\tstd::map<AString, AString> m_Hints;\n\n\t/** The callbacks for dynamic evaluation of hints, such as \"LightValue\" -> function(BlockTypeName, BlockState).\n\tHint callbacks are of higher priority than m_Hints - if a hint is provided by a m_HintCallback, its value in m_Hints is ignored. */\n\tstd::map<AString, HintCallback> m_HintCallbacks;\n};\n\n\n\n\n\n/** Stores information on all known block types.\nCan dynamically add and remove block types.\nBlock types are identified using BlockTypeName.\nSupports unregistering and re-registering the same type by the same plugin.\nStores the name of the plugin that registered the type, for better plugin error messages (\"already registered in X\")\nand so that we can unload and reload plugins. */\nclass BlockTypeRegistry\n{\npublic:\n\t// fwd:\n\tclass AlreadyRegisteredException;\n\tclass NotRegisteredException;\n\n\n\t/** Creates an empty new instance of the block type registry */\n\tBlockTypeRegistry() = default;\n\n\t/** Registers the specified block type.\n\tIf the block type already exists and the plugin is the same, updates the registration.\n\tIf the block type already exists and the plugin is different, throws an AlreadyRegisteredException. */\n\tvoid registerBlockType(\n\t\tconst AString & aPluginName,\n\t\tconst AString & aBlockTypeName,\n\t\tstd::shared_ptr<cBlockHandler> aHandler,\n\t\tconst std::map<AString, AString> & aHints = std::map<AString, AString>(),\n\t\tconst std::map<AString, BlockInfo::HintCallback> & aHintCallbacks = std::map<AString, BlockInfo::HintCallback>()\n\t);\n\n\t/** Returns the registration information for the specified BlockTypeName.\n\tReturns nullptr if BlockTypeName not found. */\n\tstd::shared_ptr<BlockInfo> blockInfo(const AString & aBlockTypeName);\n\n\t/** Removes all registrations done by the specified plugin. */\n\tvoid removeAllByPlugin(const AString & aPluginName);\n\n\t/** Sets (adds or overwrites) a single Hint value for a BlockType.\n\tThrows NotRegisteredException if the BlockTypeName is not registered. */\n\tvoid setBlockTypeHint(\n\t\tconst AString & aBlockTypeName,\n\t\tconst AString & aHintKey,\n\t\tconst AString & aHintValue\n\t);\n\n\t/** Removes a previously registered single Hint value for a BlockType.\n\tThrows NotRegisteredException if the BlockTypeName is not registered.\n\tSilently ignored if the Hint hasn't been previously set. */\n\tvoid removeBlockTypeHint(\n\t\tconst AString & aBlockTypeName,\n\t\tconst AString & aHintKey\n\t);\n\n\nprivate:\n\n\t/** The actual block type registry.\n\tMaps the BlockTypeName to the BlockInfo instance. */\n\tstd::map<AString, std::shared_ptr<BlockInfo>> m_Registry;\n\n\t/** The CS that protects m_Registry against multithreaded access. */\n\tcCriticalSection m_CSRegistry;\n};\n\n\n\n\n\n/** The exception thrown from BlockTypeRegistry::registerBlockType() if the same block type is being registered from a different plugin. */\nclass BlockTypeRegistry::AlreadyRegisteredException: public std::runtime_error\n{\n\tusing Super = std::runtime_error;\n\npublic:\n\n\t/** Creates a new instance of the exception that provides info on both the original registration and the newly attempted\n\tregistration that caused the failure. */\n\tAlreadyRegisteredException(\n\t\tconst std::shared_ptr<BlockInfo> & aPreviousRegistration,\n\t\tconst std::shared_ptr<BlockInfo> & aNewRegistration\n\t);\n\n\t// Simple getters:\n\tstd::shared_ptr<BlockInfo> previousRegistration() const { return m_PreviousRegistration; }\n\tstd::shared_ptr<BlockInfo> newRegistration()      const { return m_NewRegistration; }\n\n\nprivate:\n\n\tstd::shared_ptr<BlockInfo> m_PreviousRegistration;\n\tstd::shared_ptr<BlockInfo> m_NewRegistration;\n\n\n\t/** Returns the general exception message formatted by the two registrations.\n\tThe output is used when logging. */\n\tstatic AString message(\n\t\tconst std::shared_ptr<BlockInfo> & aPreviousRegistration,\n\t\tconst std::shared_ptr<BlockInfo> & aNewRegistration\n\t);\n};\n\n\n\n\n\n/** The exception thrown from BlockTypeRegistry::setBlockTypeHint() if the block type has not been registered before. */\nclass BlockTypeRegistry::NotRegisteredException: public std::runtime_error\n{\n\tusing Super = std::runtime_error;\n\npublic:\n\n\t/** Creates a new instance of the exception that provides info on both the original registration and the newly attempted\n\tregistration that caused the failure. */\n\tNotRegisteredException(\n\t\tconst AString & aBlockTypeName,\n\t\tconst AString & aHintKey,\n\t\tconst AString & aHintValue\n\t);\n\n\t// Simple getters:\n\tconst AString & blockTypeName() const { return m_BlockTypeName; }\n\n\nprivate:\n\n\tconst AString m_BlockTypeName;\n};\n"
  },
  {
    "path": "src/Bindings/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tBindings.cpp\n\tDeprecatedBindings.cpp\n\tLuaChunkStay.cpp\n\tLuaJson.cpp\n\tLuaNameLookup.cpp\n\tLuaServerHandle.cpp\n\tLuaState.cpp\n\tLuaState_Implementation.cpp\n\tLuaTCPLink.cpp\n\tLuaUDPEndpoint.cpp\n\tLuaWindow.cpp\n\tManualBindings.cpp\n\tManualBindings_BlockArea.cpp\n\tManualBindings_Network.cpp\n\tManualBindings_RankManager.cpp\n\tManualBindings_World.cpp\n\tPlugin.cpp\n\tPluginLua.cpp\n\tPluginManager.cpp\n\n\tBindings.h\n\tDeprecatedBindings.h\n\tLuaChunkStay.h\n\tLuaFunctions.h\n\tLuaJson.h\n\tLuaNameLookup.h\n\tLuaServerHandle.h\n\tLuaState.h\n\tLuaState_Declaration.inc\n\tLuaState_Typedefs.inc\n\tLuaTCPLink.h\n\tLuaUDPEndpoint.h\n\tLuaWindow.h\n\tManualBindings.h\n\tPlugin.h\n\tPluginLua.h\n\tPluginManager.h\n\ttolua++.h\n)\n"
  },
  {
    "path": "src/Bindings/CheckBindingsDependencies.lua",
    "content": "-- CheckBindingsDependencies.lua\n\n-- This script checks whether all files listed in AllToLua.pkg are also in the dependencies for bindings regeneration.\n-- This script is run as part of the CircleCI tests\n\n\n\n\n\n--- Filenames that should be ignored in the AllToLua.pkg file:\n-- Dictionary of \"filename\" -> true for each ignored filename\nlocal g_ShouldIgnorePkg =\n{\n\t-- [\"../IniFile.h\"] = true,\n}\n\n--- Filenames that should be ignored in the CMakeLists.txt file:\n-- Dictionary of \"filename\" -> true for each ignored filename\nlocal g_ShouldIgnoreCMake =\n{\n\t[\"tolua\"] = true,\n\t[\"Bindings/AllToLua.pkg\"] = true,\n\t[\"Bindings/BindingsProcessor.lua\"] = true,\n}\n\n\n\n\n\n--- Returns a sorted list of all files listed in AllToLua.pkg\n-- The returned table has both an array part (list of files) and a dictionary part (\"filename\" -> true)\nlocal function getAllToLuaPkgFiles()\n\tlocal res = {}\n\tfor line in io.lines(\"AllToLua.pkg\") do\n\t\tline:gsub(\"$cfile \\\"(.+)\\\"\",  -- Parse each line with a $cfile directive\n\t\t\tfunction (a_FileName)\n\t\t\t\tif (g_ShouldIgnorePkg[a_FileName]) then\n\t\t\t\t\treturn\n\t\t\t\tend\n\n\t\t\t\t-- Normalize the path: AllToLua is relative to src\\Bindings\n\t\t\t\t-- but the CMake dependencies list is relative to src\\\n\t\t\t\ta_FileName, cnt = a_FileName:gsub(\"%.%./\", \"\")\n\n\t\t\t\t-- If no replacements were done, this entry must point to a file\n\t\t\t\t-- inside the Bindings folder; normalize it\n\t\t\t\tif cnt == 0 then\n\t\t\t\t\ta_FileName = \"Bindings/\" .. a_FileName\n\t\t\t\tend\n\n\t\t\t\ttable.insert(res, a_FileName)\n\t\t\t\tres[a_FileName] = true\n\t\t\tend\n\t\t)\n\tend\n\ttable.sort(res)\n\treturn res\nend\n\n\n\n\n\n--- Returns a sorted list of all files listed as dependencies in CMakeLists.txt\n-- The returned table has both an array part (list of files) and a dictionary part (\"filename\" -> true)\nlocal function getCMakeListsFiles()\n\tlocal f = assert(io.open(\"../../CMake/GenerateBindings.cmake\", \"r\"))\n\tlocal contents = f:read(\"*all\")\n\tf:close()\n\tlocal res = {}\n\tcontents:gsub(\"set%s*(%b())\",  -- Process each CMake's \"set\" statement\n\t\tfunction (a_SetStatement)\n\t\t\tif not(a_SetStatement:find(\"%(BINDING_DEPENDENCIES\")) then\n\t\t\t\treturn\n\t\t\tend\n\t\t\t-- This is the statement setting the dependencies, parse the files:\n\t\t\ta_SetStatement:gsub(\"%s(%S+)%s\",\n\t\t\t\tfunction (a_FileName)\n\t\t\t\t\tif (g_ShouldIgnoreCMake[a_FileName]) then\n\t\t\t\t\t\treturn\n\t\t\t\t\tend\n\t\t\t\t\ttable.insert(res, a_FileName)\n\t\t\t\t\tres[a_FileName] = true\n\t\t\t\tend\n\t\t\t)\n\t\tend\n\t)\n\ttable.sort(res)\n\treturn res\nend\n\n\n\n\n\n-- Check each set of files against the other:\nlocal pkgFiles = getAllToLuaPkgFiles()\nlocal cmakeFiles = getCMakeListsFiles()\nlocal numMissingFiles = 0\nfor _, fnam in ipairs(pkgFiles) do\n\tif not(cmakeFiles[fnam]) then\n\t\tio.stderr:write(\"Bindings dependency file \", fnam, \" is not listed in CMake/GenerateBindings.cmake\\n\")\n\t\tnumMissingFiles = numMissingFiles + 1\n\tend\nend\nfor _, fnam in ipairs(cmakeFiles) do\n\tif not(pkgFiles[fnam]) then\n\t\tio.stderr:write(\"Bindings dependency file \", fnam, \" is not listed in src/Bindings/AllToLua.pkg\\n\")\n\t\tnumMissingFiles = numMissingFiles + 1\n\tend\nend\n\n-- If any mismatch was found, exit with an error code:\nif (numMissingFiles > 0) then\n\tio.stderr:write(\"Bindings dependency mismatches found: \", numMissingFiles, \"\\n\")\n\tos.exit(1)\nend\n"
  },
  {
    "path": "src/Bindings/DeprecatedBindings.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"DeprecatedBindings.h\"\nextern \"C\"\n{\n\t#include \"lua/src/lua.h\"\n\t#include \"lua/src/lauxlib.h\"\n}\n#undef TOLUA_TEMPLATE_BIND\n#include \"tolua++/include/tolua++.h\"\n\n\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"LuaState.h\"\n#include \"../BlockInfo.h\"\n#include \"../BlockEntities/NoteEntity.h\"\n\n\n\n\n\n/* get function: g_BlockLightValue */\n#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockLightValue\nstatic int tolua_get_AllToLua_g_BlockLightValue(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tint BlockType = 0;\n\t#ifndef TOLUA_RELEASE\n\t{\n\t\ttolua_Error tolua_err;\n\t\tif (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))\n\t\t{\n\t\t\ttolua_error(tolua_S, \"#vinvalid type in array indexing.\", &tolua_err);\n\t\t}\n\t}\n\t#endif\n\tLuaState.GetStackValue(2, BlockType);\n\tif ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))\n\t{\n\t\ttolua_error(tolua_S, \"array indexing out of range.\", nullptr);\n\t}\n\tLuaState.Push(cBlockInfo::GetLightValue(static_cast<BLOCKTYPE>(BlockType)));\n\treturn 1;\n}\n#endif  // #ifndef TOLUA_DISABLE\n\n\n\n\n\n/* get function: g_BlockSpreadLightFalloff */\n#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockSpreadLightFalloff\nstatic int tolua_get_AllToLua_g_BlockSpreadLightFalloff(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tint BlockType = 0;\n\t#ifndef TOLUA_RELEASE\n\t{\n\t\ttolua_Error tolua_err;\n\t\tif (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))\n\t\t{\n\t\t\ttolua_error(tolua_S, \"#vinvalid type in array indexing.\", &tolua_err);\n\t\t}\n\t}\n\t#endif\n\tLuaState.GetStackValue(2, BlockType);\n\tif ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))\n\t{\n\t\ttolua_error(tolua_S, \"array indexing out of range.\", nullptr);\n\t}\n\tLuaState.Push(cBlockInfo::GetSpreadLightFalloff(static_cast<BLOCKTYPE>(BlockType)));\n\treturn 1;\n}\n#endif  // #ifndef TOLUA_DISABLE\n\n\n\n\n\n/* get function: g_BlockTransparent */\n#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockTransparent\nstatic int tolua_get_AllToLua_g_BlockTransparent(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tint BlockType = 0;\n\t#ifndef TOLUA_RELEASE\n\t{\n\t\ttolua_Error tolua_err;\n\t\tif (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))\n\t\t{\n\t\t\ttolua_error(tolua_S, \"#vinvalid type in array indexing.\", &tolua_err);\n\t\t}\n\t}\n\t#endif\n\tLuaState.GetStackValue(2, BlockType);\n\tif ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))\n\t{\n\t\ttolua_error(tolua_S, \"array indexing out of range.\", nullptr);\n\t}\n\tLuaState.Push(cBlockInfo::IsTransparent(static_cast<BLOCKTYPE>(BlockType)));\n\treturn 1;\n}\n#endif  // #ifndef TOLUA_DISABLE\n\n\n\n\n\n/* get function: g_BlockOneHitDig */\n#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockOneHitDig\nstatic int tolua_get_AllToLua_g_BlockOneHitDig(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tint BlockType = 0;\n\t#ifndef TOLUA_RELEASE\n\t{\n\t\ttolua_Error tolua_err;\n\t\tif (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))\n\t\t{\n\t\t\ttolua_error(tolua_S, \"#vinvalid type in array indexing.\", &tolua_err);\n\t\t}\n\t}\n\t#endif\n\tLuaState.GetStackValue(2, BlockType);\n\tif ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))\n\t{\n\t\ttolua_error(tolua_S, \"array indexing out of range.\", nullptr);\n\t}\n\tLuaState.Push(cBlockInfo::IsOneHitDig(static_cast<BLOCKTYPE>(BlockType)));\n\treturn 1;\n}\n#endif  // #ifndef TOLUA_DISABLE\n\n\n\n\n\n/* get function: g_BlockPistonBreakable */\n#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockPistonBreakable\nstatic int tolua_get_AllToLua_g_BlockPistonBreakable(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tint BlockType = 0;\n\t#ifndef TOLUA_RELEASE\n\t{\n\t\ttolua_Error tolua_err;\n\t\tif (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))\n\t\t{\n\t\t\ttolua_error(tolua_S, \"#vinvalid type in array indexing.\", &tolua_err);\n\t\t}\n\t}\n\t#endif\n\tLuaState.GetStackValue(2, BlockType);\n\tif ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))\n\t{\n\t\ttolua_error(tolua_S, \"array indexing out of range.\", nullptr);\n\t}\n\tLuaState.Push(cBlockInfo::IsPistonBreakable(static_cast<BLOCKTYPE>(BlockType)));\n\treturn 1;\n}\n#endif  // #ifndef TOLUA_DISABLE\n\n\n\n\n\n/* get function: g_BlockIsSnowable */\n#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockIsSnowable\nstatic int tolua_get_AllToLua_g_BlockIsSnowable(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tint BlockType = 0;\n\t#ifndef TOLUA_RELEASE\n\t{\n\t\ttolua_Error tolua_err;\n\t\tif (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))\n\t\t{\n\t\t\ttolua_error(tolua_S, \"#vinvalid type in array indexing.\", &tolua_err);\n\t\t}\n\t}\n\t#endif\n\tLuaState.GetStackValue(2, BlockType);\n\tif ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))\n\t{\n\t\ttolua_error(tolua_S, \"array indexing out of range.\", nullptr);\n\t}\n\tLuaState.Push(cBlockInfo::IsSnowable(static_cast<BLOCKTYPE>(BlockType)));\n\treturn 1;\n}\n#endif  // #ifndef TOLUA_DISABLE\n\n\n\n\n\n/* get function: g_BlockIsSolid */\n#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockIsSolid\nstatic int tolua_get_AllToLua_g_BlockIsSolid(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tint BlockType = 0;\n\t#ifndef TOLUA_RELEASE\n\t{\n\t\ttolua_Error tolua_err;\n\t\tif (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))\n\t\t{\n\t\t\ttolua_error(tolua_S, \"#vinvalid type in array indexing.\", &tolua_err);\n\t\t}\n\t}\n\t#endif\n\tLuaState.GetStackValue(2, BlockType);\n\tif ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))\n\t{\n\t\ttolua_error(tolua_S, \"array indexing out of range.\", nullptr);\n\t}\n\tLuaState.Push(cBlockInfo::IsSolid(static_cast<BLOCKTYPE>(BlockType)));\n\treturn 1;\n}\n#endif  // #ifndef TOLUA_DISABLE\n\n\n\n\n\n/* get function: g_BlockFullyOccupiesVoxel */\n#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockFullyOccupiesVoxel\nstatic int tolua_get_AllToLua_g_BlockFullyOccupiesVoxel(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tint BlockType = 0;\n\t#ifndef TOLUA_RELEASE\n\t{\n\t\ttolua_Error tolua_err;\n\t\tif (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))\n\t\t{\n\t\t\ttolua_error(tolua_S, \"#vinvalid type in array indexing.\", &tolua_err);\n\t\t}\n\t}\n\t#endif\n\tLuaState.GetStackValue(2, BlockType);\n\tif ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))\n\t{\n\t\ttolua_error(tolua_S, \"array indexing out of range.\", nullptr);\n\t}\n\tLuaState.Push(cBlockInfo::FullyOccupiesVoxel(static_cast<BLOCKTYPE>(BlockType)));\n\treturn 1;\n}\n#endif  // #ifndef TOLUA_DISABLE\n\n\n\n\n\n/* function: StringToMobType */\nstatic int tolua_AllToLua_StringToMobType00(lua_State* tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\t#ifndef TOLUA_RELEASE\n\ttolua_Error tolua_err;\n\tif (\n\t\t!tolua_iscppstring(tolua_S, 1, 0, &tolua_err) ||\n\t\t!tolua_isnoobj(tolua_S, 2, &tolua_err)\n\t\t)\n\t\tgoto tolua_lerror;\n\telse\n\t#endif\n\t{\n\t\tconst AString a_MobString = tolua_tocppstring(LuaState, 1, nullptr);\n\t\teMonsterType MobType = cMonster::StringToMobType(a_MobString);\n\t\ttolua_pushnumber(LuaState, static_cast<lua_Number>(MobType));\n\t\ttolua_pushcppstring(LuaState, a_MobString);\n\t}\n\n\tLOGWARNING(\"Warning in function call 'StringToMobType': StringToMobType() is deprecated. Please use cMonster:StringToMobType()\");\n\tLuaState.LogStackTrace(0);\n\treturn 2;\n\n\t#ifndef TOLUA_RELEASE\ntolua_lerror:\n\ttolua_error(LuaState, \"#ferror in function 'StringToMobType'.\", &tolua_err);\n\treturn 0;\n\t#endif\n}\n\n\n\n\n\nstatic int tolua_cBlockInfo_GetPlaceSound(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamStaticSelf(\"cBlockInfo\") ||\n\t\t!L.CheckParamNumber(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tL.Push(\"\");\n\tLOGWARNING(\"cBlockInfo:GetPlaceSound() is deprecated\");\n\tL.LogStackTrace(0);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_get_cItem_m_Lore(lua_State * tolua_S)\n{\n\t// Maintain legacy m_Lore variable as Lore table split by ` (grave-accent)\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamSelf(\"const cItem\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tconst cItem * Self = nullptr;\n\tL.GetStackValue(1, Self);\n\n\tAString LoreString = StringJoin(Self->m_LoreTable, \"`\");\n\n\tL.Push(LoreString);\n\n\tLOGWARNING(\"cItem.m_Lore is deprecated, use cItem.m_LoreTable instead\");\n\tL.LogStackTrace(0);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_set_cItem_m_Lore(lua_State * tolua_S)\n{\n\t// Maintain legacy m_Lore variable as Lore table split by ` (grave-accent)\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cItem\") ||\n\t\t!L.CheckParamString(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcItem * Self = nullptr;\n\tAString LoreString;\n\tL.GetStackValues(1, Self, LoreString);\n\n\tSelf->m_LoreTable = StringSplit(LoreString, \"`\");\n\n\tLOGWARNING(\"cItem.m_Lore is deprecated, use cItem.m_LoreTable instead\");\n\tL.LogStackTrace(0);\n\treturn 0;\n}\n\n\n\n\n/** function: cNoteEntity: GetNote */\nstatic int tolua_cNoteEntity_GetPitch(lua_State * tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tif (\n\t\t!LuaState.CheckParamUserType(1, \"cNoteEntity\") ||\n\t\t!LuaState.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcNoteEntity * Self = nullptr;\n\n\tif (!LuaState.GetStackValues(1, Self))\n\t{\n\t\ttolua_error(LuaState, \"Failed to read parameters\", nullptr);\n\t}\n\tif (Self == nullptr)\n\t{\n\t\ttolua_error(LuaState, \"invalid 'self' in function 'GetPitch'\", nullptr);\n\t}\n\tLuaState.Push(Self->GetNote());\n\tLOGWARNING(\"Warning: 'cNoteEntity:GetPitch' function is deprecated. Please use 'cNoteEntity:GetNote' instead.\");\n\tLuaState.LogStackTrace(0);\n\treturn 1;\n}\n\n\n\n\n/** function: cNoteEntity: IncrementNote */\nstatic int tolua_cNoteEntity_IncrementPitch(lua_State * tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tif (\n\t\t!LuaState.CheckParamUserType(1, \"cNoteEntity\") ||\n\t\t!LuaState.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcNoteEntity * Self = nullptr;\n\n\tif (!LuaState.GetStackValues(1, Self))\n\t{\n\t\ttolua_error(LuaState, \"Failed to read parameters\", nullptr);\n\t}\n\tif (Self == nullptr)\n\t{\n\t\ttolua_error(LuaState, \"invalid 'self' in function 'SetPitch'\", nullptr);\n\t}\n\n\tSelf->IncrementNote();\n\tLOGWARNING(\"Warning: 'cNoteEntity:IncrementPitch' function is deprecated. Please use 'cNoteEntity:IncrementNote' instead.\");\n\tLuaState.LogStackTrace(0);\n\treturn 1;\n}\n\n\n\n\n/** function: cNoteEntity: SetNote */\nstatic int tolua_cNoteEntity_SetPitch(lua_State * tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tif (\n\t\t!LuaState.CheckParamUserType(1, \"cNoteEntity\") ||\n\t\t!LuaState.CheckParamNumber(2) ||\n\t\t!LuaState.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcNoteEntity * Self = nullptr;\n\tint Note = -1;\n\n\tif (!LuaState.GetStackValues(1, Self, Note))\n\t{\n\t\ttolua_error(LuaState, \"Failed to read parameters\", nullptr);\n\t}\n\tif (Self == nullptr)\n\t{\n\t\ttolua_error(LuaState, \"invalid 'self' in function 'SetPitch'\", nullptr);\n\t}\n\n\tSelf->SetNote(static_cast<unsigned char>(Note % 25));\n\tLOGWARNING(\"Warning: 'cNoteEntity:SetPitch' function is deprecated. Please use 'cNoteEntity:SetNote' instead.\");\n\tLuaState.LogStackTrace(0);\n\treturn 1;\n}\n\n\n\n\n/** function: cWorld:SetSignLines */\nstatic int tolua_cWorld_SetSignLines(lua_State * tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\t#ifndef TOLUA_RELEASE\n\tif (\n\t\t!LuaState.CheckParamUserType(1, \"cWorld\") ||\n\t\t!LuaState.CheckParamNumber(2, 4) ||\n\t\t!LuaState.CheckParamString(5, 8) ||\n\t\t!LuaState.CheckParamUserType(9, \"cPlayer\") ||\n\t\t!LuaState.CheckParamEnd(10)\n\t\t)\n\t\treturn 0;\n\telse\n\t#endif\n\t{\n\t\tcWorld * self = nullptr;\n\t\tcPlayer * Player = nullptr;\n\t\tint BlockX = 0;\n\t\tint BlockY = 0;\n\t\tint BlockZ = 0;\n\t\tAString Line1;\n\t\tAString Line2;\n\t\tAString Line3;\n\t\tAString Line4;\n\n\t\tLuaState.GetStackValues(1, self, BlockX, BlockY, BlockZ, Line1, Line2, Line3, Line4, Player);\n\n\t\t#ifndef TOLUA_RELEASE\n\t\tif (self == nullptr)\n\t\t{\n\t\t\ttolua_error(LuaState, \"invalid 'self' in function 'UpdateSign'\", nullptr);\n\t\t}\n\t\t#endif\n\t\t{\n\t\t\tbool res = self->SetSignLines({BlockX, BlockY, BlockZ}, Line1, Line2, Line3, Line4, Player);\n\t\t\ttolua_pushboolean(LuaState, res ? 1 : 0);\n\t\t}\n\t}\n\tLOGWARNING(\"Warning in function call 'UpdateSign': UpdateSign() is deprecated. Please use SetSignLines()\");\n\tLuaState.LogStackTrace(0);\n\treturn 1;\n}\n\n\n\n\n\n/** Function: cWorld:GrowTree.\nExported manually because of the obsolete int-based overload.\nWhen removing from DeprecatedBindings, make sure the function is exported automatically. */\nstatic int tolua_cWorld_GrowTree(lua_State * a_LuaState)\n{\n\tcLuaState LuaState(a_LuaState);\n\tif (lua_isnumber(LuaState, 2))\n\t{\n\t\t// This is the obsolete signature, warn and translate:\n\t\tLOGWARNING(\"Warning: cWorld:GrowTree function expects Vector3i-based coords rather than int-based coords. Emulating old-style call.\");\n\t\tLuaState.LogStackTrace(0);\n\t\tcWorld * Self = nullptr;\n\t\tint BlockX, BlockY, BlockZ;\n\t\tif (!LuaState.GetStackValues(1, Self, BlockX, BlockY, BlockZ))\n\t\t{\n\t\t\treturn LuaState.ApiParamError(\"Failed to read int-based coord parameters\");\n\t\t}\n\t\tLuaState.Push(Self->GrowTree({BlockX, BlockY, BlockZ}));\n\t\treturn 1;\n\t}\n\n\t// This is the correct signature, execute:\n\tcWorld * Self = nullptr;\n\tVector3i BlockPos;\n\tif (!LuaState.GetStackValues(1, Self, BlockPos))\n\t{\n\t\treturn LuaState.ApiParamError(\"Failed to read Vector3i-based coord parameters\");\n\t}\n\tLuaState.Push(Self->GrowTree(BlockPos));\n\treturn 1;\n}\n\n\n\n\n\n/** Function: cWorld:GrowTreeByBiome.\nExported manually because of the obsolete int-based overload.\nWhen removing from DeprecatedBindings, make sure the function is exported automatically. */\nstatic int tolua_cWorld_GrowTreeByBiome(lua_State * a_LuaState)\n{\n\tcLuaState LuaState(a_LuaState);\n\tif (lua_isnumber(LuaState, 2))\n\t{\n\t\t// This is the obsolete signature, warn and translate:\n\t\tLOGWARNING(\"Warning: cWorld:GrowTreeByBiome function expects Vector3i-based coords rather than int-based coords. Emulating old-style call.\");\n\t\tLuaState.LogStackTrace(0);\n\t\tcWorld * Self = nullptr;\n\t\tint BlockX, BlockY, BlockZ;\n\t\tif (!LuaState.GetStackValues(1, Self, BlockX, BlockY, BlockZ))\n\t\t{\n\t\t\treturn LuaState.ApiParamError(\"Failed to read int-based coord parameters\");\n\t\t}\n\t\tLuaState.Push(Self->GrowTreeByBiome({BlockX, BlockY, BlockZ}));\n\t\treturn 1;\n\t}\n\n\t// This is the correct signature, execute:\n\tcWorld * Self = nullptr;\n\tVector3i BlockPos;\n\tif (!LuaState.GetStackValues(1, Self, BlockPos))\n\t{\n\t\treturn LuaState.ApiParamError(\"Failed to read Vector3i-based coord parameters\");\n\t}\n\tLuaState.Push(Self->GrowTreeByBiome(BlockPos));\n\treturn 1;\n}\n\n\n\n\n\n/** Function: cWorld:GrowTreeFromSapling.\nExported manually because of the obsolete int-based overload and obsolete SaplingMeta parameter.\nWhen removing from DeprecatedBindings, make sure the function is exported automatically. */\nstatic int tolua_cWorld_GrowTreeFromSapling(lua_State * a_LuaState)\n{\n\tcLuaState LuaState(a_LuaState);\n\tif (lua_isnumber(LuaState, 2))\n\t{\n\t\t// This is the obsolete signature, warn and translate:\n\t\tLOGWARNING(\"Warning: cWorld:GrowTreeFromSapling function expects Vector3i-based coords rather than int-based coords. Emulating old-style call.\");\n\t\tLuaState.LogStackTrace(0);\n\t\tcWorld * Self = nullptr;\n\t\tint BlockX, BlockY, BlockZ;\n\t\tif (!LuaState.GetStackValues(1, Self, BlockX, BlockY, BlockZ))\n\t\t{\n\t\t\treturn LuaState.ApiParamError(\"Failed to read int-based coord parameters\");\n\t\t}\n\t\tLuaState.Push(Self->GrowTreeFromSapling({BlockX, BlockY, BlockZ}));\n\t\treturn 1;\n\t}\n\n\t// This is the correct signature, execute:\n\tcWorld * Self = nullptr;\n\tVector3i BlockPos;\n\tif (!LuaState.GetStackValues(1, Self, BlockPos))\n\t{\n\t\treturn LuaState.ApiParamError(\"Failed to read Vector3i-based coord parameters\");\n\t}\n\tif (lua_isnumber(LuaState, 3))\n\t{\n\t\t// There's an extra parameter, the obsolete SaplingMeta\n\t\tLOGWARNING(\"Warning: cWorld:GrowTreeFromSapling function no longer has the SaplingMeta parameter. Ignoring it now.\");\n\t\tLuaState.LogStackTrace(0);\n\t}\n\tLuaState.Push(Self->GrowTreeFromSapling(BlockPos));\n\treturn 1;\n}\n\n\n\n\n\n/** function: cWorld:SetNextBlockTick */\nstatic int tolua_cWorld_SetNextBlockTick(lua_State * tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\n\tif (\n\t\t!LuaState.CheckParamUserType(1, \"cWorld\") ||\n\t\t!LuaState.CheckParamNumber(2, 4) ||\n\t\t!LuaState.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcWorld * Self = nullptr;\n\tint BlockX = 0;\n\tint BlockY = 0;\n\tint BlockZ = 0;\n\n\tif (!LuaState.GetStackValues(1, Self, BlockX, BlockY, BlockZ))\n\t{\n\t\ttolua_error(LuaState, \"Failed to read parameters\", nullptr);\n\t}\n\tif (Self == nullptr)\n\t{\n\t\ttolua_error(LuaState, \"invalid 'self' in function 'SetNextBlockTick'\", nullptr);\n\t}\n\tSelf->SetNextBlockToTick({BlockX, BlockY, BlockZ});\n\tLOGWARNING(\"Warning: 'cWorld:SetNextBlockTick' function is deprecated. Please use 'cWorld:SetNextBlockToTick' instead.\");\n\tLuaState.LogStackTrace(0);\n\treturn 1;\n}\n\n\n\n\n\nvoid DeprecatedBindings::Bind(lua_State * tolua_S)\n{\n\ttolua_beginmodule(tolua_S, nullptr);\n\n\ttolua_array(tolua_S, \"g_BlockLightValue\",          tolua_get_AllToLua_g_BlockLightValue,          nullptr);\n\ttolua_array(tolua_S, \"g_BlockSpreadLightFalloff\",  tolua_get_AllToLua_g_BlockSpreadLightFalloff,  nullptr);\n\ttolua_array(tolua_S, \"g_BlockTransparent\",         tolua_get_AllToLua_g_BlockTransparent,         nullptr);\n\ttolua_array(tolua_S, \"g_BlockOneHitDig\",           tolua_get_AllToLua_g_BlockOneHitDig,           nullptr);\n\ttolua_array(tolua_S, \"g_BlockPistonBreakable\",     tolua_get_AllToLua_g_BlockPistonBreakable,     nullptr);\n\ttolua_array(tolua_S, \"g_BlockIsSnowable\",          tolua_get_AllToLua_g_BlockIsSnowable,          nullptr);\n\ttolua_array(tolua_S, \"g_BlockIsSolid\",             tolua_get_AllToLua_g_BlockIsSolid,             nullptr);\n\ttolua_array(tolua_S, \"g_BlockFullyOccupiesVoxel\",  tolua_get_AllToLua_g_BlockFullyOccupiesVoxel,  nullptr);\n\n\ttolua_function(tolua_S, \"StringToMobType\", tolua_AllToLua_StringToMobType00);\n\n\ttolua_beginmodule(tolua_S, \"cBlockInfo\");\n\t\ttolua_function(tolua_S, \"GetPlaceSound\",          tolua_cBlockInfo_GetPlaceSound);\n\ttolua_endmodule(tolua_S);\n\n\ttolua_beginmodule(tolua_S, \"cItem\");\n\t\ttolua_variable(tolua_S, \"m_Lore\", tolua_get_cItem_m_Lore, tolua_set_cItem_m_Lore);\n\ttolua_endmodule(tolua_S);\n\n\ttolua_beginmodule(tolua_S, \"cNoteEntity\");\n\t\ttolua_function(tolua_S, \"GetPitch\", tolua_cNoteEntity_GetPitch);\n\t\ttolua_function(tolua_S, \"IncrementPitch\", tolua_cNoteEntity_IncrementPitch);\n\t\ttolua_function(tolua_S, \"SetPitch\", tolua_cNoteEntity_SetPitch);\n\ttolua_endmodule(tolua_S);\n\n\ttolua_beginmodule(tolua_S, \"cWorld\");\n\t\ttolua_function(tolua_S, \"GrowTree\",            tolua_cWorld_GrowTree);\n\t\ttolua_function(tolua_S, \"GrowTreeByBiome\",     tolua_cWorld_GrowTreeByBiome);\n\t\ttolua_function(tolua_S, \"GrowTreeFromSapling\", tolua_cWorld_GrowTreeFromSapling);\n\t\ttolua_function(tolua_S, \"SetNextBlockTick\",    tolua_cWorld_SetNextBlockTick);\n\t\ttolua_function(tolua_S, \"UpdateSign\",          tolua_cWorld_SetSignLines);\n\ttolua_endmodule(tolua_S);\n\n\ttolua_endmodule(tolua_S);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/DeprecatedBindings.h",
    "content": "#pragma once\n\nstruct lua_State;\nclass DeprecatedBindings\n{\npublic:\n\tstatic void Bind( lua_State* tolua_S);\n};\n"
  },
  {
    "path": "src/Bindings/DiffAPIDesc.lua",
    "content": "-- DiffAPIDesc.lua\n\n-- Creates a diff file containing documentation that is available from ToLua++'s doxycomment parsing, but not yet included in APIDesc.lua\n\nrequire(\"lfs\")\n\n\n\n\n\n--- Translation for function names whose representation in APIDesc is different from the one in Docs\n-- Dictionary of \"DocsName\" -> \"DescName\"\nlocal g_FunctionNameDocsToDesc =\n{\n\t[\"new\"]    = \"constructor\",\n\t[\"delete\"] = \"destructor\",\n\t[\".add\"]   = \"operator_plus\",\n\t[\".div\"]   = \"operator_div\",\n\t[\".eq\"]    = \"operator_eq\",\n\t[\".mul\"]   = \"operator_mul\",\n\t[\".sub\"]   = \"operator_sub\",\n}\n\n\n\n\n\n--- Translation from C types to Lua types\n-- Dictionary of \"CType\" -> \"LuaType\"\nlocal g_CTypeToLuaType =\n{\n\tAString = \"string\",\n\tbool = \"boolean\",\n\tByte = \"number\",\n\tchar = \"number\",\n\tdouble = \"number\",\n\tfloat = \"number\",\n\tForEachChunkProvider = \"cWorld\",\n\tint = \"number\",\n\tsize_t = \"number\",\n\tunsigned = \"number\",\n\t[\"const AString\"] = \"string\",\n\t[\"const char*\"] = \"string\",\n\t[\"std::string\"] = \"string\",\n\t[\"Vector3<int>\"]    = \"Vector3i\",\n\t[\"Vector3<float>\"]  = \"Vector3f\",\n\t[\"Vector3<double>\"] = \"Vector3d\",\n}\n\n\n\n\n\n--- Functions that should be ignored\n-- Dictionary of \"FunctionName\" -> true for each ignored function\nlocal g_IgnoreFunction =\n{\n\tdestructor = true,\n}\n\n\n\n\n\nlocal function caseInsensitiveCompare(a_Text1, a_Text2)\n\treturn (a_Text1:lower() < a_Text2:lower())\nend\n\n\n\n\n\n--- Loads the APIDesc.lua and its child files, returns the complete description\n-- Returns a table with Classes and Hooks members, Classes being a dictionary of \"ClassName\" -> { desc }\nlocal function loadAPIDesc()\n\t-- Load the main APIDesc.lua file:\n\tlocal apiDescPath = \"../../Server/Plugins/APIDump/\"\n\tlocal desc = dofile(apiDescPath .. \"APIDesc.lua\")\n\tif not(desc) then\n\t\terror(\"Failed to load APIDesc\")\n\tend\n\t\n\t-- Merge in the information from all files in the Classes subfolder:\n\tlocal classesPath = apiDescPath .. \"Classes/\"\n\tfor fnam in lfs.dir(apiDescPath .. \"Classes\") do\n\t\tif (string.find(fnam, \".*%.lua$\")) then\n\t\t\tlocal tbls = dofile(classesPath .. fnam)\n\t\t\tfor k, cls in pairs(tbls) do\n\t\t\t\tdesc.Classes[k] = cls;\n\t\t\tend\n\t\tend\n\tend\n\treturn desc\nend\n\n\n\n\n\n--- Loads the API documentation generated by ToLua++'s parser\n-- Returns a dictionary of \"ClassName\" -> { docs }\nlocal function loadAPIDocs()\n\t-- Get the filelist:\n\tlocal files = dofile(\"docs/_files.lua\")\n\tif not(files) then\n\t\terror(\"Failed to load _files.lua from docs\")\n\tend\n\t\n\t-- Load the docs from all files, merge into a single dictionary:\n\tlocal res = {}\n\tfor _, fnam in ipairs(files) do\n\t\tlocal docs = dofile(\"docs/\" .. fnam)\n\t\tif (docs) then\n\t\t\tfor k, v in pairs(docs) do\n\t\t\t\tassert(not(res[k]))  -- Do we have a duplicate documentation entry?\n\t\t\t\tres[k] = v\n\t\t\tend\n\t\tend\n\tend\n\treturn res\nend\n\n\n\n\n\n--- Returns whether the function signature in the description matches the function documentation\n-- a_FunctionDesc is a single description for a function, as loaded from APIDesc.lua (one <FnDesc> item)\n-- a_FunctionDoc is a single documentation item for a function, as loaded from ToLua++'s parser\nlocal function functionDescMatchesDocs(a_FunctionDesc, a_FunctionDoc)\n\t-- Check the number of parameters:\n\tlocal numParams = 0\n\tlocal numOptionalParams = 0\n\tif (not(a_FunctionDesc.Params) or (a_FunctionDesc.Params == \"\")) then\n\t\tnumParams = 0\n\telse\n\t\tfor _, Param in pairs(a_FunctionDesc.Params) do\n\t\t\tnumParams = numParams + 1\n\t\t\tif Param.IsOptional then\n\t\t\t\tnumOptionalParams = numOptionalParams + 1\n\t\t\tend\n\t\tend\n\tend\n\tlocal numDocParams = #(a_FunctionDoc.Params)\n\tif ((numDocParams > numParams) or (numDocParams < numParams - numOptionalParams)) then\n\t\treturn false\n\tend\n\t\n\treturn true\nend\n\n\n\n\n\n--- Returns an array of function descriptions that are in a_FunctionDocs but are missing from a_FunctionDescs\n-- a_FunctionDescs is an array of function descriptions, as loaded from APIDesc.lua (normalized into array)\n-- a_FunctionDocs is an array of function documentation items, as loaded from ToLua++'s parser\n-- If all descriptions match, nil is returned instead\nlocal function listMissingClassSingleFunctionDescs(a_FunctionDescs, a_FunctionDocs)\n\t-- For each documentation item, try to find a match in a_FunctionDescs:\n\tlocal res = {}\n\tfor _, docs in ipairs(a_FunctionDocs) do\n\t\tlocal hasFound = false\n\t\tfor _, desc in ipairs(a_FunctionDescs) do\n\t\t\tif (functionDescMatchesDocs(desc, docs)) then\n\t\t\t\thasFound = true\n\t\t\t\tbreak\n\t\t\tend\n\t\tend  -- for idx - freeDescs[]\n\t\tif not(hasFound) then\n\t\t\ttable.insert(res, docs)\n\t\tend\n\tend  -- for docs - a_FunctionDocs[]\n\t\n\t-- If no result, return nil instead of an empty table:\n\tif not(res[1]) then\n\t\treturn nil\n\tend\n\treturn res\nend\n\n\n\n\n\n--- Returns a dict of \"FnName\" -> { { <FnDesc> }, ... } that are documented in a_FunctionDocs but missing from a_FunctionDescs\n-- If there are no such descriptions, returns nil instead\n-- a_FunctionDescs is a dict of \"FnName\" -> { <FnDescs> } loaded from APIDesc.lua et al\n--    <FnDescs> may be a single desc or an array of those\n-- a_FunctionDocs is a dict og \"FnName\" -> { { <FnDesc> }, ... } loaded from ToLua++'s parser\nlocal function listMissingClassFunctionDescs(a_FunctionDescs, a_FunctionDocs)\n\t-- Match the docs and descriptions for each separate function:\n\tlocal res = {}\n\tlocal hasSome = false\n\ta_FunctionDescs = a_FunctionDescs or {}\n\ta_FunctionDocs = a_FunctionDocs or {}\n\tfor fnName, fnDocs in pairs(a_FunctionDocs) do\n\t\tlocal fnDescName = g_FunctionNameDocsToDesc[fnName] or fnName\n\t\tif not(g_IgnoreFunction[fnDescName]) then\n\t\t\tlocal fnDescs = a_FunctionDescs[fnDescName]\n\t\t\tif not(fnDescs) then\n\t\t\t\t-- Function not described at all, insert a dummy empty description for the matching:\n\t\t\t\tfnDescs = {}\n\t\t\telseif not(fnDescs[1]) then\n\t\t\t\t-- Function has a single description, convert it to the same format as multi-overload functions use:\n\t\t\t\tfnDescs = { fnDescs }\n\t\t\tend\n\t\t\tlocal missingDocs = listMissingClassSingleFunctionDescs(fnDescs, fnDocs)\n\t\t\tif (missingDocs) then\n\t\t\t\tres[fnName] = missingDocs\n\t\t\t\thasSome = true\n\t\t\tend\n\t\tend  -- not ignored\n\tend  -- for fnName, fnDocs - a_FunctionDocs[]\n\tif not(hasSome) then\n\t\treturn nil\n\tend\n\treturn res\nend\n\n\n\n\n\n--- Returns a dictionary of \"SymbolName\" -> { <desc> } for any variable or constant that is documented but not described\n-- a_VarConstDescs is an array of variable or constant descriptions, as loaded from APIDesc.lua\n-- a_VarConstDocs is an array of variable or constant documentation items, as loaded from ToLua++'s parser\n-- If no symbol is to be returned, returns nil instead\nlocal function listMissingClassVarConstDescs(a_VarConstDescs, a_VarConstDocs)\n\t-- Match the docs and descriptions for each separate function:\n\tlocal res = {}\n\tlocal hasSome = false\n\ta_VarConstDescs = a_VarConstDescs or {}\n\ta_VarConstDocs = a_VarConstDocs or {}\n\tfor symName, symDocs in pairs(a_VarConstDocs) do\n\t\tlocal symDesc = a_VarConstDescs[symName]\n\t\tif (\n\t\t\tnot(symDesc) or        -- Symbol not described at all\n\t\t\tnot(symDesc.Notes) or  -- Non-existent description\n\t\t\t(\n\t\t\t\t(symDesc.Notes == \"\")  and             -- Empty description\n\t\t\t\t(type(symDocs.Notes) == \"string\") and  -- Docs has a string ...\n\t\t\t\t(symDocs.Notes ~= \"\")                  --  ... that is not empty\n\t\t\t)\n\t\t) then\n\t\t\tres[symName] = symDocs\n\t\t\thasSome = true\n\t\tend\n\tend\n\tif not(hasSome) then\n\t\treturn nil\n\tend\n\treturn res\nend\n\n\n\n\n\n--- Fills a_Missing with descriptions that are documented in a_ClassDocs but missing from a_ClassDesc\n-- a_ClassDesc is the class' description loaded from APIDesc et al\n-- a_ClassDocs is the class' documentation loaded from ToLua++'s parser\nlocal function listMissingClassDescs(a_ClassName, a_ClassDesc, a_ClassDocs, a_Missing)\n\tlocal missing =\n\t{\n\t\tFunctions = listMissingClassFunctionDescs(a_ClassDesc.Functions, a_ClassDocs.Functions),\n\t\tConstants = listMissingClassVarConstDescs(a_ClassDesc.Constants, a_ClassDocs.Constants),\n\t\tVariables = listMissingClassVarConstDescs(a_ClassDesc.Variables, a_ClassDocs.Variables),\n\t}\n\tif (\n\t\tnot(missing.Functions) and\n\t\tnot(missing.Constants) and\n\t\tnot(missing.Variables)\n\t) then\n\t\t-- Nothing missing, don't add anything\n\t\treturn\n\tend\n\ta_Missing[a_ClassName] = missing\nend\n\n\n\n\n\n--- Returns a dictionary of \"ClassName\" -> { { <desc> }, ... } of descriptions that are documented in a_Docs but missing from a_Descs\n-- a_Descs is the descriptions loaded from APIDesc et al\n-- a_Docs is the documentation loaded from ToLua++'s parser\nlocal function findMissingDescs(a_Descs, a_Docs)\n\tlocal descClasses = a_Descs.Classes\n\tlocal res = {}\n\tfor clsName, clsDocs in pairs(a_Docs) do\n\t\tlocal clsDesc = descClasses[clsName] or {}\n\t\tlistMissingClassDescs(clsName, clsDesc, clsDocs, res)\n\tend\n\treturn res\nend\n\n\n\n\n\nlocal function outputTable(a_File, a_Table, a_Indent)\n\t-- Extract all indices first:\n\tlocal allIndices = {}\n\tfor k, _ in pairs(a_Table) do\n\t\ttable.insert(allIndices, k)\n\tend\n\t\n\t-- Sort the indices:\n\ttable.sort(allIndices,\n\t\tfunction (a_Index1, a_Index2)\n\t\t\tif (type(a_Index1) == \"number\") then\n\t\t\t\tif (type(a_Index2) == \"number\") then\n\t\t\t\t\t-- Both indices are numeric, sort by value\n\t\t\t\t\treturn (a_Index1 < a_Index2)\n\t\t\t\tend\n\t\t\t\t-- a_Index2 is non-numeric, always goes after a_Index1\n\t\t\t\treturn true\n\t\t\tend\n\t\t\tif (type(a_Index2) == \"number\") then\n\t\t\t\t-- a_Index2 is numeric, a_Index1 is not\n\t\t\t\treturn false\n\t\t\tend\n\t\t\t-- Neither index is numeric, use regular string comparison:\n\t\t\treturn caseInsensitiveCompare(tostring(a_Index1), tostring(a_Index2))\n\t\tend\n\t)\n\t\n\t-- Output by using the index order:\n\ta_File:write(a_Indent, \"{\\n\")\n\tlocal indent = a_Indent .. \"\\t\"\n\tfor _, index in ipairs(allIndices) do\n\t\t-- Write the index:\n\t\ta_File:write(indent, \"[\")\n\t\tif (type(index) == \"string\") then\n\t\t\ta_File:write(string.format(\"%q\", index))\n\t\telse\n\t\t\ta_File:write(index)\n\t\tend\n\t\ta_File:write(\"] =\")\n\t\t\n\t\t-- Write the value:\n\t\tlocal v = a_Table[index]\n\t\tif (type(v) == \"table\") then\n\t\t\ta_File:write(\"\\n\")\n\t\t\toutputTable(a_File, v, indent)\n\t\telseif (type(v) == \"string\") then\n\t\t\ta_File:write(string.format(\" %q\", v))\n\t\telse\n\t\t\ta_File:write(\" \", tostring(v))\n\t\tend\n\t\ta_File:write(\",\\n\")\n\tend\n\ta_File:write(a_Indent, \"}\")\nend\n\n\n\n\n\n--- Returns a description of function params, as used for output\n-- a_Params is nil or an array of parameters from ToLua++'s parser\n-- a_ClassMap is a dictionary of \"ClassName\" -> true for all known classes\nlocal function extractParamsForOutput(a_Params, a_ClassMap)\n\tif not(a_Params) then\n\t\treturn \"\"\n\tend\n\tassert(a_ClassMap)\n\t\n\tlocal params = {}\n\tfor _, param in ipairs(a_Params) do\n\t\tlocal paramType = param.Type or \"\"\n\t\tparamType = g_CTypeToLuaType[paramType] or paramType  -- Translate from C type to Lua type\n\t\tlocal paramName = param.Name or paramType or \"[unknown]\"\n\t\tparamName = paramName:gsub(\"^a_\", \"\")  -- Remove the \"a_\" prefix, if present\n\t\tlocal idxColon = paramType:find(\"::\")  -- Extract children classes and enums within classes\n\t\tlocal paramTypeAnchor = \"\"\n\t\tif (idxColon) then\n\t\t\tparamTypeAnchor = \"#\" .. paramType:sub(idxColon + 2)\n\t\t\tparamType = paramType:sub(1, idxColon - 1)\n\t\tend\n\t\tif (a_ClassMap[paramType]) then\n\t\t\t-- Param type is a class name, make it a link\n\t\t\tif not(param.Name) then\n\t\t\t\tparamName = \"{{\" .. paramType .. paramTypeAnchor .. \"}}\"\n\t\t\telse\n\t\t\t\tparamName = \"{{\" .. paramType .. paramTypeAnchor .. \"|\" .. paramName .. \"}}\"\n\t\t\tend\n\t\tend\n\t\ttable.insert(params, paramName)\n\tend\n\treturn table.concat(params, \", \")\nend\n\n\n\n\n\n--- Returns a single line of function description for output\n-- a_Desc is the function description\n-- a_ClassMap is a dictionary of \"ClassName\" -> true for all known classes\nlocal function formatFunctionDesc(a_Docs, a_ClassMap)\n\tlocal staticClause = \"\"\n\tif (a_Docs.IsStatic) then\n\t\tstaticClause = \"IsStatic = true, \"\n\tend\n\treturn string.format(\"{ Params = %q, Return = %q, %sNotes = %q },\\n\",\n\t\textractParamsForOutput(a_Docs.Params, a_ClassMap),\n\t\textractParamsForOutput(a_Docs.Returns, a_ClassMap),\n\t\tstaticClause,\n\t\t(a_Docs.Desc or \"\"):gsub(\"%.\\n\", \". \"):gsub(\"\\n\", \". \"):gsub(\"%s+\", \" \")\n\t)\nend\n\n\n\n\n\n--- Outputs differences in function descriptions into a file\n-- a_File is the output file\n-- a_Functions is nil or a dictionary of \"FunctionName\" -> { { <desc> }, ... }\n-- a_ClassMap is a dictionary of \"ClassName\" -> true for all known classes\nlocal function outputFunctions(a_File, a_Functions, a_ClassMap)\n\tassert(a_File)\n\tif not(a_Functions) then\n\t\treturn\n\tend\n\t\n\t-- Get a sorted array of all function names:\n\tlocal fnNames = {}\n\tfor fnName, _ in pairs(a_Functions) do\n\t\ttable.insert(fnNames, fnName)\n\tend\n\ttable.sort(fnNames, caseInsensitiveCompare)\n\t\n\t-- Output the function descs:\n\ta_File:write(\"\\t\\tFunctions =\\n\\t\\t{\\n\")\n\tfor _, fnName in ipairs(fnNames) do\n\t\ta_File:write(\"\\t\\t\\t\", g_FunctionNameDocsToDesc[fnName] or fnName, \" =\")\n\t\tlocal docs = a_Functions[fnName]\n\t\tif (docs[2]) then\n\t\t\t-- There are at least two descriptions, use the array format:\n\t\t\ta_File:write(\"\\n\\t\\t\\t{\\n\")\n\t\t\tfor _, doc in ipairs(docs) do\n\t\t\t\ta_File:write(\"\\t\\t\\t\\t\", formatFunctionDesc(doc, a_ClassMap))\n\t\t\tend\n\t\t\ta_File:write(\"\\t\\t\\t},\\n\")\n\t\telse\n\t\t\t-- There's only one description, use the simpler one-line format:\n\t\t\ta_File:write(\" \", formatFunctionDesc(docs[1], a_ClassMap))\n\t\tend\n\tend\n\ta_File:write(\"\\t\\t},\\n\")\nend\n\n\n\n\n\n--- Returns the description of a single variable or constant\n-- a_Docs is the ToLua++'s documentation of the symbol\n-- a_ClassMap is a dictionary of \"ClassName\" -> true for all known classes\nlocal function formatVarConstDesc(a_Docs, a_ClassMap)\n\tlocal descType = \"\"\n\tif (a_Docs.Type) then\n\t\tlocal luaType = g_CTypeToLuaType[a_Docs.Type] or a_Docs.Type\n\t\tif (a_ClassMap[a_Docs.Type]) then\n\t\t\tdescType = string.format(\"Type = {{%q}}, \", luaType);\n\t\telse\n\t\t\tdescType = string.format(\"Type = %q, \", luaType);\n\t\tend\n\tend\n\treturn string.format(\"{ %sNotes = %q },\\n\", descType, a_Docs.Desc or \"\")\nend\n\n\n\n\n\n--- Outputs differences in variables' or constants' descriptions into a file\n-- a_File is the output file\n-- a_VarConst is nil or a dictionary of \"VariableOrConstantName\" -> { <desc> }\n-- a_Header is a string, either \"Variables\" or \"Constants\"\n-- a_ClassMap is a dictionary of \"ClassName\" -> true for all known classes\nlocal function outputVarConst(a_File, a_VarConst, a_Header, a_ClassMap)\n\tassert(a_File)\n\tassert(type(a_Header) == \"string\")\n\tif not(a_VarConst) then\n\t\treturn\n\tend\n\t\n\t-- Get a sorted array of all symbol names:\n\tlocal symNames = {}\n\tfor symName, _ in pairs(a_VarConst) do\n\t\ttable.insert(symNames, symName)\n\tend\n\ttable.sort(symNames, caseInsensitiveCompare)\n\t\n\t-- Output the symbol descs:\n\ta_File:write(\"\\t\\t\", a_Header, \" =\\n\\t\\t{\\n\")\n\tfor _, symName in ipairs(symNames) do\n\t\tlocal docs = a_VarConst[symName]\n\t\ta_File:write(\"\\t\\t\\t\", symName, \" = \", formatVarConstDesc(docs, a_ClassMap))\n\tend\n\ta_File:write(\"\\t\\t},\\n\")\nend\n\n\n\n\n\n--- Outputs the diff into a file\n-- a_Diff is the diff calculated by findMissingDescs()\n-- The output file is written as a Lua source file formatted to match APIDesc.lua\nlocal function outputDiff(a_Diff)\n\t-- Sort the classnames:\n\tlocal classNames = {}\n\tlocal classMap = {}\n\tfor clsName, _ in pairs(a_Diff) do\n\t\ttable.insert(classNames, clsName)\n\t\tclassMap[clsName] = true\n\tend\n\ttable.sort(classNames, caseInsensitiveCompare)\n\t\n\t-- Output each class:\n\tlocal f = assert(io.open(\"APIDiff.lua\", \"w\"))\n\t-- outputTable(f, diff, \"\")\n\tf:write(\"return\\n{\\n\")\n\tfor _, clsName in ipairs(classNames) do\n\t\tf:write(\"\\t\", clsName, \" =\\n\\t{\\n\")\n\t\tlocal desc = a_Diff[clsName]\n\t\toutputFunctions(f, desc.Functions, classMap)\n\t\toutputVarConst(f, desc.Variables, \"Variables\", classMap)\n\t\toutputVarConst(f, desc.Constants, \"Constants\", classMap)\n\t\tf:write(\"\\t},\\n\")\n\tend\n\tf:write(\"}\\n\")\n\tf:close()\nend\n\n\n\n\n\nlocal apiDesc = loadAPIDesc()\nlocal apiDocs = loadAPIDocs()\nlocal diff = findMissingDescs(apiDesc, apiDocs)\noutputDiff(diff)\nprint(\"Diff has been output to file APIDiff.lua.\")\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaChunkStay.cpp",
    "content": "\n// LuaChunkStay.cpp\n\n// Implements the cLuaChunkStay class representing a cChunkStay binding for plugins, used by cWorld:ChunkStay() Lua API\n\n#include \"Globals.h\"\n#include \"LuaChunkStay.h\"\n#include \"PluginLua.h\"\n\n\n\n\n\ncLuaChunkStay::cLuaChunkStay()\n{\n}\n\n\n\n\n\nbool cLuaChunkStay::AddChunks(const cLuaState::cStackTable & a_ChunkCoordsTable)\n{\n\t// This function is expected to be called just once, with all the coords in a table\n\tASSERT(m_Chunks.empty());\n\n\t// Add each set of coords:\n\ta_ChunkCoordsTable.ForEachArrayElement([=](cLuaState & a_LuaState, int a_Index)\n\t\t{\n\t\t\tif (!lua_istable(a_LuaState, -1))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Element #%d is not a table (got %s). Ignoring the element.\",\n\t\t\t\t\t__FUNCTION__, a_Index, lua_typename(a_LuaState, -1)\n\t\t\t\t);\n\t\t\t\ta_LuaState.LogStackTrace();\n\t\t\t\tlua_pop(a_LuaState, 1);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tAddChunkCoord(a_LuaState, a_Index);\n\t\t\treturn false;\n\t\t}\n\t);\n\n\t// If there are no chunks, log a warning and return failure:\n\tif (m_Chunks.empty())\n\t{\n\t\tLOGWARNING(\"%s: No valid chunk coords.\", __FUNCTION__);\n\t\ta_ChunkCoordsTable.GetLuaState().LogStackTrace();\n\t\treturn false;\n\t}\n\n\t// All ok\n\treturn true;\n}\n\n\n\n\n\nvoid cLuaChunkStay::AddChunkCoord(cLuaState & L, int a_Index)\n{\n\t// Check that the element has 2 coords:\n\tint NumCoords = luaL_getn(L, -1);\n\tif (NumCoords != 2)\n\t{\n\t\tLOGWARNING(\"%s: Element #%d doesn't contain 2 coords (got %d). Ignoring the element.\",\n\t\t\t__FUNCTION__, a_Index, NumCoords\n\t\t);\n\t\treturn;\n\t}\n\n\t// Read the two coords from the element:\n\tlua_rawgeti(L, -1, 1);\n\tlua_rawgeti(L, -2, 2);\n\tint ChunkX = luaL_checkint(L, -2);\n\tint ChunkZ = luaL_checkint(L, -1);\n\tlua_pop(L, 2);\n\n\t// Check that a coord is not yet present:\n\tfor (cChunkCoordsVector::iterator itr = m_Chunks.begin(), end = m_Chunks.end(); itr != end; ++itr)\n\t{\n\t\tif ((itr->m_ChunkX == ChunkX) && (itr->m_ChunkZ == ChunkZ))\n\t\t{\n\t\t\tLOGWARNING(\"%s: Element #%d is a duplicate, ignoring it.\",\n\t\t\t\t__FUNCTION__, a_Index\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_Chunks[]\n\n\tm_Chunks.emplace_back(ChunkX, ChunkZ);\n}\n\n\n\n\n\nvoid cLuaChunkStay::Enable(cChunkMap & a_ChunkMap, cLuaState::cCallbackPtr a_OnChunkAvailable, cLuaState::cCallbackPtr a_OnAllChunksAvailable)\n{\n\tm_OnChunkAvailable = std::move(a_OnChunkAvailable);\n\tm_OnAllChunksAvailable = std::move(a_OnAllChunksAvailable);\n\n\t// Enable the ChunkStay:\n\tSuper::Enable(a_ChunkMap);\n}\n\n\n\n\n\nvoid cLuaChunkStay::OnChunkAvailable(int a_ChunkX, int a_ChunkZ)\n{\n\tif (m_OnChunkAvailable != nullptr)\n\t{\n\t\tm_OnChunkAvailable->Call(a_ChunkX, a_ChunkZ);\n\t}\n}\n\n\n\n\n\nbool cLuaChunkStay::OnAllChunksAvailable(void)\n{\n\tif (m_OnAllChunksAvailable != nullptr)\n\t{\n\t\t// Call the callback:\n\t\tm_OnAllChunksAvailable->Call();\n\n\t\t// Remove the callback references - they won't be needed anymore\n\t\tm_OnChunkAvailable.reset();\n\t\tm_OnAllChunksAvailable.reset();\n\t}\n\n\t// Disable the ChunkStay by returning true\n\treturn true;\n}\n\n\n\n\n\nvoid cLuaChunkStay::OnDisabled(void)\n{\n\t// This object is no longer needed, delete it\n\tdelete this;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaChunkStay.h",
    "content": "\n// LuaChunkStay.h\n\n// Declares the cLuaChunkStay class representing a cChunkStay binding for plugins, used by cWorld:ChunkStay() Lua API\n\n\n\n\n\n#pragma once\n\n#include \"LuaState.h\"\n#include \"../ChunkStay.h\"\n\n\n\n\n\n// fwd:\nclass cChunkMap;\n\n\n\n\n\nclass cLuaChunkStay:\n\tpublic cChunkStay\n{\n\tusing Super = cChunkStay;\n\npublic:\n\tcLuaChunkStay();\n\n\tvirtual ~cLuaChunkStay() override { }\n\n\t/** Adds chunks in the specified Lua table.\n\tCan be called only once.\n\tReturns true if any chunk added, false (plus log warning) if none. */\n\tbool AddChunks(const cLuaState::cStackTable & a_ChunkCoords);\n\n\t/** Enables the ChunkStay for the specified chunkmap, with the specified Lua callbacks. */\n\tvoid Enable(cChunkMap & a_ChunkMap, cLuaState::cCallbackPtr a_OnChunkAvailable, cLuaState::cCallbackPtr a_OnAllChunksAvailable);\n\nprotected:\n\t/** The Lua function to call in OnChunkAvailable. Only valid when enabled. */\n\tcLuaState::cCallbackPtr m_OnChunkAvailable;\n\n\t/** The Lua function to call in OnAllChunksAvailable. Only valid when enabled. */\n\tcLuaState::cCallbackPtr m_OnAllChunksAvailable;\n\n\n\t// cChunkStay overrides:\n\tvirtual void OnChunkAvailable(int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnAllChunksAvailable(void) override;\n\tvirtual void OnDisabled(void) override;\n\n\t/** Adds a single chunk coord from the table at the top of the Lua stack.\n\tExpects the top element to be a table, checks that it contains two numbers.\n\tUses those two numbers as chunk coords appended to m_Chunks.\n\tIf the coords are already present, gives a warning and ignores the pair.\n\tThe a_Index parameter is only for the error messages. */\n\tvoid AddChunkCoord(cLuaState & a_LuaState, int a_Index);\n} ;\n\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaFunctions.h",
    "content": "#pragma once\n\n#include <time.h>\n// tolua_begin\n\ninline unsigned int GetTime()\n{\n\t// NB: For caveats, please see https://stackoverflow.com/a/14505248\n\treturn static_cast<unsigned int>(std::chrono::seconds(time(nullptr)).count());\n}\n\n// tolua_end\n"
  },
  {
    "path": "src/Bindings/LuaJson.cpp",
    "content": "\n// LuaJson.cpp\n\n// Implements the Json exposure bindings to Lua\n\n#include \"Globals.h\"\n#include <sstream>\n#include \"LuaJson.h\"\n#include \"LuaState.h\"\n#include \"tolua++/include/tolua++.h\"\n#include \"json/json.h\"\n#include \"../JsonUtils.h\"\n\n\n\n\n\n// fwd:\n\nstatic void PushJsonValue(const Json::Value & a_Value, cLuaState & a_LuaState);\nstatic Json::Value JsonSerializeValue(cLuaState & a_LuaState);\n\n\n\n\n/** Exception thrown when the input cannot be serialized.\nKeeps track of the error message and the problematic value's path in the table.\n*/\nclass CannotSerializeException:\n\tpublic std::runtime_error\n{\n\tusing Super = std::runtime_error;\n\npublic:\n\t/** Constructs a new instance of the exception based on the provided values directly. */\n\texplicit CannotSerializeException(const AString & a_ValueName, const char * a_ErrorMsg):\n\t\tSuper(a_ErrorMsg),\n\t\tm_ValueName(a_ValueName)\n\t{\n\t}\n\n\t/** Constructs a new instance of the exception based on the provided values directly. */\n\texplicit CannotSerializeException(int a_ValueIndex, const char * a_ErrorMsg):\n\t\tSuper(a_ErrorMsg),\n\t\tm_ValueName(fmt::format(FMT_STRING(\"{}\"), a_ValueIndex))\n\t{\n\t}\n\n\t/** Constructs a new instance of the exception that takes the error message and value name from the parent, and prefix the value name with the specified prefix.\n\tUsed for prefixing the value name's path along the call stack that lead to the main exception. */\n\texplicit CannotSerializeException(const CannotSerializeException & a_Parent, const AString & a_ValueNamePrefix):\n\t\tSuper(a_Parent.what()),\n\t\tm_ValueName(a_ValueNamePrefix + \".\" + a_Parent.m_ValueName)\n\t{\n\t}\n\n\t/** Constructs a new instance of the exception that takes the error message and value name from the parent, and prefix the value name with the specified prefix.\n\tUsed for prefixing the value name's path along the call stack that lead to the main exception. */\n\texplicit CannotSerializeException(const CannotSerializeException & a_Parent, int a_ValueNamePrefixIndex):\n\t\tSuper(a_Parent.what()),\n\t\tm_ValueName(fmt::format(FMT_STRING(\"{}\"), a_ValueNamePrefixIndex) + \".\" + a_Parent.m_ValueName)\n\t{\n\t}\n\n\tconst AString & GetValueName() const { return m_ValueName; }\n\nprotected:\n\tAString m_ValueName;\n};\n\n\n\n\n\n/** Pushes the specified Json array as a table on top of the specified Lua state.\nAssumes that a_Value is an array. */\nstatic void PushJsonArray(const Json::Value & a_Value, cLuaState & a_LuaState)\n{\n\t// Create the appropriately-sized Lua table:\n\tlua_createtable(a_LuaState, static_cast<int>(a_Value.size()), 0);\n\n\t// Insert each value to the appropriate index (1-based):\n\tint idx = 1;\n\tfor (const auto & v: a_Value)\n\t{\n\t\t// Include Json null values in the array - it will have holes, but indices will stay the same\n\t\tPushJsonValue(v, a_LuaState);\n\t\tlua_rawseti(a_LuaState, -2, idx);\n\t\tidx += 1;\n\t}  // for v: a_Value[]\n}\n\n\n\n\n\n/** Pushes the specified Json object as a table on top of the specified Lua state.\nAssumes that a_Value is an object. */\nstatic void PushJsonObject(const Json::Value & a_Value, cLuaState & a_LuaState)\n{\n\t// Create the appropriately-sized Lua table:\n\tlua_createtable(a_LuaState, 0, static_cast<int>(a_Value.size()));\n\n\t// Json::Value has no means of iterating over children with their names included.\n\t// We need to iterate over names and \"find\" them in the object again:\n\tauto names = a_Value.getMemberNames();\n\tfor (const auto & n: names)\n\t{\n\t\tauto v = a_Value[n];\n\t\tif (v.isNull())\n\t\t{\n\t\t\t// Skip null values\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Set the value in Lua's table:\n\t\ta_LuaState.Push(n);\n\t\tPushJsonValue(v, a_LuaState);\n\t\tlua_rawset(a_LuaState, -3);\n\t}  // for itr - a_Value[]\n}\n\n\n\n\n\n/** Pushes the specified Json value as an appropriate type on top of the specified Lua state. */\nvoid PushJsonValue(const Json::Value & a_Value, cLuaState & a_LuaState)\n{\n\tswitch (a_Value.type())\n\t{\n\t\tcase Json::nullValue:\n\t\t{\n\t\t\ta_LuaState.Push(cLuaState::Nil);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Json::intValue:\n\t\tcase Json::uintValue:\n\t\tcase Json::realValue:\n\t\t{\n\t\t\ta_LuaState.Push(static_cast<lua_Number>(a_Value.asDouble()));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Json::booleanValue:\n\t\t{\n\t\t\ta_LuaState.Push(a_Value.asBool());\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Json::stringValue:\n\t\t{\n\t\t\ta_LuaState.Push(a_Value.asString());\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Json::arrayValue:\n\t\t{\n\t\t\tPushJsonArray(a_Value, a_LuaState);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase Json::objectValue:\n\t\t{\n\t\t\tPushJsonObject(a_Value, a_LuaState);\n\t\t\tbreak;\n\t\t}\n\t}  // switch (v.type())\n}\n\n\n\n\n\n/** Serializes the Lua table at the top of the specified Lua state's stack into a Json value.\nLets jsoncpp decides whether to serialize into an object or an array. */\nstatic Json::Value JsonSerializeTable(cLuaState & a_LuaState)\n{\n\tJson::Value res;\n\tlua_pushnil(a_LuaState);\n\twhile (lua_next(a_LuaState, -2) != 0)\n\t{\n\t\tif (lua_type(a_LuaState, -2) == LUA_TNUMBER)\n\t\t{\n\t\t\tint idx;\n\t\t\ta_LuaState.GetStackValue(-2, idx);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tres[idx - 1] = JsonSerializeValue(a_LuaState);\n\t\t\t}\n\t\t\tcatch (const CannotSerializeException & exc)\n\t\t\t{\n\t\t\t\tthrow CannotSerializeException(exc, idx);\n\t\t\t}\n\t\t\tcatch (const std::exception & exc)  // Cannot catch Json::Exception, because it's not properly defined\n\t\t\t{\n\t\t\t\tthrow CannotSerializeException(idx, exc.what());\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAString name;\n\t\t\tif (a_LuaState.GetStackValue(-2, name))\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tres[name] = JsonSerializeValue(a_LuaState);\n\t\t\t\t}\n\t\t\t\tcatch (const CannotSerializeException & exc)\n\t\t\t\t{\n\t\t\t\t\tthrow CannotSerializeException(exc, name);\n\t\t\t\t}\n\t\t\t\tcatch (const std::exception & exc)  // Cannot catch Json::Exception, because it's not properly defined\n\t\t\t\t{\n\t\t\t\t\tthrow CannotSerializeException(name, exc.what());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlua_pop(a_LuaState, 1);\n\t}\n\treturn res;\n}\n\n\n\n\n\n/** Serializes the Lua value at the top of the specified Lua state into a Json value. */\nstatic Json::Value JsonSerializeValue(cLuaState & a_LuaState)\n{\n\tswitch (lua_type(a_LuaState, -1))\n\t{\n\t\tcase LUA_TBOOLEAN:\n\t\t{\n\t\t\tbool v;\n\t\t\ta_LuaState.GetStackValue(-1, v);\n\t\t\treturn Json::Value(v);\n\t\t}\n\t\tcase LUA_TNIL:\n\t\t{\n\t\t\treturn Json::Value(Json::nullValue);\n\t\t}\n\t\tcase LUA_TNUMBER:\n\t\t{\n\t\t\tlua_Number v;\n\t\t\ta_LuaState.GetStackValue(-1, v);\n\t\t\treturn Json::Value(v);\n\t\t}\n\t\tcase LUA_TSTRING:\n\t\t{\n\t\t\tAString v;\n\t\t\ta_LuaState.GetStackValue(-1, v);\n\t\t\treturn Json::Value(v);\n\t\t}\n\t\tcase LUA_TTABLE:\n\t\t{\n\t\t\treturn JsonSerializeTable(a_LuaState);\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tLOGD(\"Attempting to serialize an unhandled Lua value type: %d\", lua_type(a_LuaState, -1));\n\t\t\treturn Json::Value(Json::nullValue);\n\t\t}\n\t}\n}\n\n\n\n\n\nstatic int tolua_cJson_Parse(lua_State * a_LuaState)\n{\n\t// Function signature:\n\t// cJson:Parse(\"string\") -> table\n\n\t// Check the param types:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cJson\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the input string:\n\tAString input;\n\tif (!L.GetStackValue(2, input))\n\t{\n\t\tLOGWARNING(\"cJson:Parse(): Cannot read input string\");\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// Parse the string:\n\tJson::Value root;\n\tAString ParseError;\n\tif (!JsonUtils::ParseString(input, root, &ParseError))\n\t{\n\t\tL.Push(cLuaState::Nil, fmt::format(FMT_STRING(\"Parsing Json failed: {}\"), ParseError));\n\t\treturn 2;\n\t}\n\n\t// Push the Json value onto Lua stack:\n\tPushJsonValue(root, L);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cJson_Serialize(lua_State * a_LuaState)\n{\n\t// Function signature:\n\t// cJson:Serialize({table}, [{option1 = value1, option2 = value2}]) -> string\n\n\t// Check the param types:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cJson\") ||\n\t\t!L.CheckParamTable(2) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Push the table to the top of the Lua stack, and call the serializing function:\n\tlua_pushvalue(L, 2);\n\tJson::Value root;\n\ttry\n\t{\n\t\troot = JsonSerializeValue(L);\n\t}\n\tcatch (const CannotSerializeException & exc)\n\t{\n\t\tlua_pushnil(L);\n\t\tL.Push(fmt::format(\n\t\t\tFMT_STRING(\"Cannot serialize into Json, value \\\"{}\\\" caused an error \\\"{}\\\"\"),\n\t\t\texc.GetValueName(), exc.what()\n\t\t));\n\t\treturn 2;\n\t}\n\tlua_pop(L, 1);\n\n\t// Create the writer, with all properties (optional param 3) applied to it:\n\tJson::StreamWriterBuilder builder;\n\tif (lua_istable(L, 3))\n\t{\n\t\tlua_pushnil(L);\n\t\twhile (lua_next(L, -2) != 0)\n\t\t{\n\t\t\tif (lua_type(L, -2) == LUA_TSTRING)\n\t\t\t{\n\t\t\t\tAString propName, propValue;\n\t\t\t\tif (L.GetStackValues(-2, propName, propValue))\n\t\t\t\t{\n\t\t\t\t\tbuilder[propName] = propValue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t\t// Check for invalid settings:\n\t\tJson::Value invalid;\n\t\tif (!builder.validate(&invalid))\n\t\t{\n\t\t\tLOGINFO(\"cJson:Serialize(): detected invalid settings:\");\n\t\t\tfor (const auto & n: invalid.getMemberNames())\n\t\t\t{\n\t\t\t\tLOGINFO(\"  \\\"%s\\\" (\\\"%s\\\")\", n.c_str(), invalid[n].asCString());\n\t\t\t}\n\t\t}\n\t}\n\tauto writer(builder.newStreamWriter());\n\n\t// Serialize the string and push it as the return value:\n\tstd::stringstream ss;\n\twriter->write(root, &ss);\n\tL.Push(ss.str());\n\treturn 1;\n}\n\n\n\n\n\nvoid cLuaJson::Bind(cLuaState & a_LuaState)\n{\n\ttolua_beginmodule(a_LuaState, nullptr);\n\n\t\t// Create the cJson API class:\n\t\ttolua_usertype(a_LuaState, \"cJson\");\n\t\ttolua_cclass(a_LuaState, \"cJson\", \"cJson\", \"\", nullptr);\n\n\t\t// Fill in the functions (alpha-sorted):\n\t\ttolua_beginmodule(a_LuaState, \"cJson\");\n\t\t\ttolua_function(a_LuaState, \"Parse\",     tolua_cJson_Parse);\n\t\t\ttolua_function(a_LuaState, \"Serialize\", tolua_cJson_Serialize);\n\t\ttolua_endmodule(a_LuaState);\n\ttolua_endmodule(a_LuaState);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaJson.h",
    "content": "\n// LuaJson.h\n\n// Declares the Json exposure bindings to Lua\n\n\n\n\n\n#pragma once\n\n\n\n\n\n// fwd:\nclass cLuaState;\n\n\n\n\n\nclass cLuaJson\n{\npublic:\n\t/** Registers the Json library in the specified Lua state. */\n\tstatic void Bind(cLuaState & a_LuaState);\n};\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaNameLookup.cpp",
    "content": "\n// LuaNameLookup.cpp\n\n// Implements the cLuaNameLookup class used as the cNetwork API callbacks for name and IP lookups from Lua\n\n#include \"Globals.h\"\n#include \"LuaNameLookup.h\"\n\n\n\n\n\ncLuaNameLookup::cLuaNameLookup(const AString & a_Query, cLuaState::cTableRefPtr && a_Callbacks):\n\tm_Callbacks(std::move(a_Callbacks)),\n\tm_Query(a_Query)\n{\n}\n\n\n\n\n\nvoid cLuaNameLookup::OnNameResolved(const AString & a_Name, const AString & a_IP)\n{\n\tm_Callbacks->CallTableFn(\"OnNameResolved\", a_Name, a_IP);\n}\n\n\n\n\n\nvoid cLuaNameLookup::OnError(int a_ErrorCode, const AString & a_ErrorMsg)\n{\n\tm_Callbacks->CallTableFn(\"OnError\", m_Query, a_ErrorCode, a_ErrorMsg);\n}\n\n\n\n\n\nvoid cLuaNameLookup::OnFinished(void)\n{\n\tm_Callbacks->CallTableFn(\"OnFinished\", m_Query);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaNameLookup.h",
    "content": "\n// LuaNameLookup.h\n\n// Declares the cLuaNameLookup class used as the cNetwork API callbacks for name and IP lookups from Lua\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/Network.h\"\n#include \"LuaState.h\"\n\n\n\n\n\nclass cLuaNameLookup:\n\tpublic cNetwork::cResolveNameCallbacks\n{\npublic:\n\t/** Creates a new instance of the lookup callbacks for the specified query,\n\tusing the callbacks that are in the specified table. */\n\tcLuaNameLookup(const AString & a_Query, cLuaState::cTableRefPtr && a_Callbacks);\n\nprotected:\n\t/** The Lua table that holds the callbacks to be invoked. */\n\tcLuaState::cTableRefPtr m_Callbacks;\n\n\t/** The query used to start the lookup (either hostname or IP). */\n\tAString m_Query;\n\n\n\t// cNetwork::cResolveNameCallbacks overrides:\n\tvirtual void OnNameResolved(const AString & a_Name, const AString & a_IP) override;\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;\n\tvirtual void OnFinished(void) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaServerHandle.cpp",
    "content": "\n// LuaServerHandle.cpp\n\n// Implements the cLuaServerHandle class wrapping the cServerHandle functionality for Lua API\n\n#include \"Globals.h\"\n#include \"LuaServerHandle.h\"\n#include \"LuaTCPLink.h\"\n#include \"tolua++/include/tolua++.h\"\n\n\n\n\n\ncLuaServerHandle::cLuaServerHandle(UInt16 a_Port, cLuaState::cTableRefPtr && a_Callbacks):\n\tm_Callbacks(std::move(a_Callbacks)),\n\tm_Port(a_Port)\n{\n}\n\n\n\n\n\ncLuaServerHandle::~cLuaServerHandle()\n{\n\t// If the server handle is still open, close it explicitly:\n\tClose();\n}\n\n\n\n\n\nvoid cLuaServerHandle::SetServerHandle(cServerHandlePtr a_ServerHandle, cLuaServerHandlePtr a_Self)\n{\n\tASSERT(m_ServerHandle == nullptr);  // The handle can be set only once\n\n\tm_ServerHandle = std::move(a_ServerHandle);\n\tm_Self = std::move(a_Self);\n}\n\n\n\n\n\nvoid cLuaServerHandle::Close(void)\n{\n\t// Safely grab a copy of the server handle:\n\tcServerHandlePtr ServerHandle = m_ServerHandle;\n\tif (ServerHandle == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// Close the underlying server handle:\n\tServerHandle->Close();\n\n\t// Close all connections at this server:\n\tcLuaTCPLinkPtrs Connections;\n\t{\n\t\tcCSLock Lock(m_CSConnections);\n\t\tstd::swap(Connections, m_Connections);\n\t}\n\tfor (auto & conn: Connections)\n\t{\n\t\tconn->Close();\n\t}\n\tConnections.clear();\n\n\t// Allow the internal server handle to be deallocated:\n\tm_ServerHandle.reset();\n}\n\n\n\n\n\nbool cLuaServerHandle::IsListening(void)\n{\n\t// Safely grab a copy of the server handle:\n\tcServerHandlePtr ServerHandle = m_ServerHandle;\n\tif (ServerHandle == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// Query the underlying server handle:\n\treturn ServerHandle->IsListening();\n}\n\n\n\n\n\nvoid cLuaServerHandle::RemoveLink(cLuaTCPLink * a_Link)\n{\n\tcCSLock Lock(m_CSConnections);\n\tfor (auto itr = m_Connections.begin(), end = m_Connections.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->get() == a_Link)\n\t\t{\n\t\t\tm_Connections.erase(itr);\n\t\t\tbreak;\n\t\t}\n\t}  // for itr - m_Connections[]\n}\n\n\n\n\n\nvoid cLuaServerHandle::Release(void)\n{\n\t// Close the server, if it isn't closed yet:\n\tClose();\n\n\t// Allow self to deallocate:\n\tm_Self.reset();\n}\n\n\n\n\n\ncTCPLink::cCallbacksPtr cLuaServerHandle::OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort)\n{\n\t// Ask the plugin for link callbacks:\n\tcLuaState::cTableRefPtr LinkCallbacks;\n\tif (\n\t\t!m_Callbacks->CallTableFn(\"OnIncomingConnection\", a_RemoteIPAddress, a_RemotePort, m_Port, cLuaState::Return, LinkCallbacks) ||\n\t\t!LinkCallbacks->IsValid()\n\t)\n\t{\n\t\tLOGINFO(\"cNetwork server (port %d) OnIncomingConnection callback failed. Dropping connection.\", m_Port);\n\t\treturn nullptr;\n\t}\n\n\t// Create the link wrapper to use with the callbacks:\n\tauto res = std::make_shared<cLuaTCPLink>(std::move(LinkCallbacks), m_Self);\n\n\t// Add the link to the list of our connections:\n\tcCSLock Lock(m_CSConnections);\n\tm_Connections.push_back(res);\n\n\treturn res;\n}\n\n\n\n\n\nvoid cLuaServerHandle::OnAccepted(cTCPLink & a_Link)\n{\n\t// Notify the plugin:\n\tm_Callbacks->CallTableFn(\"OnAccepted\", static_cast<cLuaTCPLink *>(a_Link.GetCallbacks().get()));\n}\n\n\n\n\n\nvoid cLuaServerHandle::OnError(int a_ErrorCode, const AString & a_ErrorMsg)\n{\n\t// Notify the plugin:\n\tm_Callbacks->CallTableFn(\"OnError\", a_ErrorCode, a_ErrorMsg);\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaServerHandle.h",
    "content": "\n// LuaServerHandle.h\n\n// Declares the cLuaServerHandle class wrapping the cServerHandle functionality for Lua API\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/Network.h\"\n#include \"LuaState.h\"\n\n\n\n\n\n// fwd:\nclass cLuaTCPLink;\ntypedef std::shared_ptr<cLuaTCPLink> cLuaTCPLinkPtr;\ntypedef std::vector<cLuaTCPLinkPtr> cLuaTCPLinkPtrs;\nclass cLuaServerHandle;\ntypedef std::shared_ptr<cLuaServerHandle> cLuaServerHandlePtr;\n\n\n\n\nclass cLuaServerHandle:\n\tpublic cNetwork::cListenCallbacks\n{\npublic:\n\t/** Creates a new instance of the server handle,\n\twrapping the (listen-) callbacks that are in the specified table. */\n\tcLuaServerHandle(UInt16 a_Port, cLuaState::cTableRefPtr && a_Callbacks);\n\n\tvirtual ~cLuaServerHandle() override;\n\n\t/** Called by cNetwork::Listen()'s binding.\n\tSets the server handle around which this instance is wrapped, and a self SharedPtr for link management. */\n\tvoid SetServerHandle(cServerHandlePtr a_ServerHandle, cLuaServerHandlePtr a_Self);\n\n\t/** Terminates all connections and closes the listening socket. */\n\tvoid Close(void);\n\n\t/** Returns true if the server is currently listening. */\n\tbool IsListening(void);\n\n\t/** Removes the link from the list of links that the server is currently tracking. */\n\tvoid RemoveLink(cLuaTCPLink * a_Link);\n\n\t/** Called when Lua garbage-collects the object.\n\tReleases the internal SharedPtr to self, so that the instance may be deallocated. */\n\tvoid Release(void);\n\nprotected:\n\t/** The Lua table that holds the callbacks to be invoked. */\n\tcLuaState::cTableRefPtr m_Callbacks;\n\n\t/** The port on which the server is listening.\n\tUsed mainly for better error reporting. */\n\tUInt16 m_Port;\n\n\t/** The cServerHandle around which this instance is wrapped. */\n\tcServerHandlePtr m_ServerHandle;\n\n\t/** Protects m_Connections against multithreaded access. */\n\tcCriticalSection m_CSConnections;\n\n\t/** All connections that are currently active in this server.\n\tProtected by m_CSConnections. */\n\tcLuaTCPLinkPtrs m_Connections;\n\n\t/** SharedPtr to self, given out to newly created links. */\n\tcLuaServerHandlePtr m_Self;\n\n\n\t// cNetwork::cListenCallbacks overrides:\n\tvirtual cTCPLink::cCallbacksPtr OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort) override;\n\tvirtual void OnAccepted(cTCPLink & a_Link) override;\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaState.cpp",
    "content": "\n// LuaState.cpp\n\n// Implements the cLuaState class representing the wrapper over lua_State *, provides associated helper functions\n\n#include \"Globals.h\"\n#include \"LuaState.h\"\n\nextern \"C\"\n{\n\t#include \"lua/src/lualib.h\"\n}\n\n#undef TOLUA_TEMPLATE_BIND\n#include \"tolua++/include/tolua++.h\"\n#include \"Bindings.h\"\n#include \"ManualBindings.h\"\n#include \"DeprecatedBindings.h\"\n#include \"LuaJson.h\"\n#include \"../Entities/Entity.h\"\n#include \"../BlockEntities/BlockEntity.h\"\n#include \"../DeadlockDetect.h\"\n#include \"../UUID.h\"\n\n\n\n\n\n// Hotpatching the Macro to prevent a Clang Warning (0 for pointer used)\n#undef  lua_tostring\n#define lua_tostring(L, i) lua_tolstring(L, (i), nullptr)\n\n\n\n\n\n// fwd: \"SQLite/lsqlite3.cpp\"\nextern \"C\"\n{\n\tint luaopen_lsqlite3(lua_State * L);\n}\n\n// fwd: \"LuaExpat/lxplib.cpp\":\nint luaopen_lxp(lua_State * L);\n\n\n\n\n\nconst cLuaState::cRet cLuaState::Return = {};\nconst cLuaState::cNil cLuaState::Nil = {};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCanonLuaStates:\n\n/** Tracks the canon cLuaState instances for each lua_State pointer.\nUsed for tracked refs - the ref needs to be tracked by a single cLuaState (the canon state), despite being created from a different (attached) cLuaState.\nThe canon state must be available without accessing the Lua state itself (so it cannot be stored within Lua). */\nclass cCanonLuaStates\n{\npublic:\n\t/** Returns the canon Lua state for the specified lua_State pointer. */\n\tstatic cLuaState * GetCanonState(lua_State * a_LuaState)\n\t{\n\t\tauto & inst = GetInstance();\n\t\tcCSLock lock(inst.m_CS);\n\t\tauto itr = inst.m_CanonStates.find(a_LuaState);\n\t\tif (itr == inst.m_CanonStates.end())\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\t\treturn itr->second;\n\t}\n\n\t/** Adds a new canon cLuaState instance to the map.\n\tUsed when a new Lua state is created, this informs the map that a new canon Lua state should be tracked. */\n\tstatic void Add(cLuaState & a_LuaState)\n\t{\n\t\tauto & inst = GetInstance();\n\t\tcCSLock lock(inst.m_CS);\n\t\tASSERT(inst.m_CanonStates.find(a_LuaState) == inst.m_CanonStates.end());\n\t\tinst.m_CanonStates[a_LuaState.operator lua_State *()] = &a_LuaState;\n\t}\n\n\t/** Removes the bindings between the specified canon state and its lua_State pointer.\n\tUsed when a Lua state is being closed. */\n\tstatic void Remove(cLuaState & a_LuaState)\n\t{\n\t\tauto & inst = GetInstance();\n\t\tcCSLock lock(inst.m_CS);\n\t\tauto itr = inst.m_CanonStates.find(a_LuaState);\n\t\tASSERT(itr != inst.m_CanonStates.end());\n\t\tinst.m_CanonStates.erase(itr);\n\t}\n\nprotected:\n\t/** The mutex protecting m_CanonStates against multithreaded access. */\n\tcCriticalSection m_CS;\n\n\t/** Map of lua_State pointers to their canon cLuaState instances. */\n\tstd::map<lua_State *, cLuaState *> m_CanonStates;\n\n\n\t/** Returns the singleton instance of this class. */\n\tstatic cCanonLuaStates & GetInstance(void)\n\t{\n\t\tstatic cCanonLuaStates canonLuaStates;\n\t\treturn canonLuaStates;\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaStateTracker:\n\nvoid cLuaStateTracker::Add(cLuaState & a_LuaState)\n{\n\tauto & Instance = Get();\n\tcCSLock Lock(Instance.m_CSLuaStates);\n\tInstance.m_LuaStates.push_back(&a_LuaState);\n}\n\n\n\n\n\nvoid cLuaStateTracker::Del(cLuaState & a_LuaState)\n{\n\tauto & Instance = Get();\n\tcCSLock Lock(Instance.m_CSLuaStates);\n\tInstance.m_LuaStates.erase(\n\t\tstd::remove_if(\n\t\t\tInstance.m_LuaStates.begin(), Instance.m_LuaStates.end(),\n\t\t\t[&a_LuaState](cLuaStatePtr a_StoredLuaState)\n\t\t\t{\n\t\t\t\treturn (&a_LuaState == a_StoredLuaState);\n\t\t\t}\n\t\t),\n\t\tInstance.m_LuaStates.end()\n\t);\n}\n\n\n\n\n\nAString cLuaStateTracker::GetStats()\n{\n\tauto & Instance = Get();\n\tcCSLock Lock(Instance.m_CSLuaStates);\n\tAString res;\n\tint Total = 0;\n\tfor (auto state: Instance.m_LuaStates)\n\t{\n\t\tint Mem = 0;\n\t\tif (!state->Call(\"collectgarbage\", \"count\", cLuaState::Return, Mem))\n\t\t{\n\t\t\tres.append(fmt::format(FMT_STRING(\"Cannot query memory for state \\\"{}\\\"\\n\"), state->GetSubsystemName()));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tres.append(fmt::format(FMT_STRING(\"State \\\"{}\\\" is using {} KiB of memory\\n\"), state->GetSubsystemName(), Mem));\n\t\t\tTotal += Mem;\n\t\t}\n\t}\n\tres.append(fmt::format(FMT_STRING(\"Total memory used by Lua: {} KiB\\n\"), Total));\n\treturn res;\n}\n\n\n\n\n\ncLuaStateTracker & cLuaStateTracker::Get()\n{\n\tstatic cLuaStateTracker Inst;  // The singleton\n\treturn Inst;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaState::cTrackedRef:\n\ncLuaState::cTrackedRef::cTrackedRef(void):\n\tm_CS(nullptr)\n{\n}\n\n\n\n\n\nbool cLuaState::cTrackedRef::RefStack(cLuaState & a_LuaState, int a_StackPos)\n{\n\t// Clear any previous callback:\n\tClear();\n\n\t// Add self to LuaState's callback-tracking:\n\tauto canonState = a_LuaState.QueryCanonLuaState();\n\tcanonState->TrackRef(*this);\n\n\t// Store the new callback:\n\tm_CS = &(canonState->m_CS);\n\tm_Ref.RefStack(*canonState, a_StackPos);\n\treturn true;\n}\n\n\n\n\n\nvoid cLuaState::cTrackedRef::Clear(void)\n{\n\t// Free the reference:\n\tlua_State * luaState = nullptr;\n\t{\n\t\tauto cs = m_CS.load();\n\t\tif (cs != nullptr)\n\t\t{\n\t\t\tcCSLock Lock(*cs);\n\t\t\tif (!m_Ref.IsValid())\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tluaState = m_Ref.GetLuaState();\n\t\t\tm_Ref.UnRef();\n\t\t}\n\t}\n\tm_CS = nullptr;\n\n\t// Remove from LuaState's callback-tracking:\n\tif (luaState == nullptr)\n\t{\n\t\treturn;\n\t}\n\tcLuaState(luaState).UntrackRef(*this);\n}\n\n\n\n\n\nbool cLuaState::cTrackedRef::IsValid(void)\n{\n\tauto cs = m_CS.load();\n\tif (cs == nullptr)\n\t{\n\t\treturn false;\n\t}\n\tcCSLock lock(*cs);\n\treturn m_Ref.IsValid();\n}\n\n\n\n\n\nbool cLuaState::cTrackedRef::IsSameLuaState(cLuaState & a_LuaState)\n{\n\tauto cs = m_CS.load();\n\tif (cs == nullptr)\n\t{\n\t\treturn false;\n\t}\n\tcCSLock lock(*cs);\n\tif (!m_Ref.IsValid())\n\t{\n\t\treturn false;\n\t}\n\tauto canonState = a_LuaState.QueryCanonLuaState();\n\tif (canonState == nullptr)\n\t{\n\t\treturn false;\n\t}\n\treturn (m_Ref.GetLuaState() == static_cast<lua_State *>(*canonState));\n}\n\n\n\n\n\nvoid cLuaState::cTrackedRef::Invalidate(void)\n{\n\tauto cs = m_CS.load();\n\tif (cs == nullptr)\n\t{\n\t\t// Already invalid\n\t\treturn;\n\t}\n\tcCSLock Lock(*cs);\n\tif (!m_Ref.IsValid())\n\t{\n\t\tLOGD(\"%s: Inconsistent callback at %p, has a CS but an invalid Ref. This should not happen\",\n\t\t\t__FUNCTION__, static_cast<void *>(this)\n\t\t);\n\t\treturn;\n\t}\n\tm_Ref.UnRef();\n\tm_CS = nullptr;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaState::cCallback:\n\nbool cLuaState::cCallback::RefStack(cLuaState & a_LuaState, int a_StackPos)\n{\n\t// Check if the stack contains a function:\n\tif (!lua_isfunction(a_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\n\treturn Super::RefStack(a_LuaState, a_StackPos);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaState::cOptionalCallback:\n\nbool cLuaState::cOptionalCallback::RefStack(cLuaState & a_LuaState, int a_StackPos)\n{\n\t// If the stack pos is nil, make this an empty callback:\n\tif (lua_isnil(a_LuaState, a_StackPos))\n\t{\n\t\tClear();\n\t\treturn true;\n\t}\n\n\t// Use default cCallback implementation:\n\treturn Super::RefStack(a_LuaState, a_StackPos);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaState::cTableRef:\n\nbool cLuaState::cTableRef::RefStack(cLuaState & a_LuaState, int a_StackPos)\n{\n\t// Check if the stack contains a table:\n\tif (!lua_istable(a_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\n\treturn Super::RefStack(a_LuaState, a_StackPos);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaState::cStackTable:\n\ncLuaState::cStackTable::cStackTable(cLuaState & a_LuaState, int a_StackPos):\n\tm_LuaState(a_LuaState),\n\tm_StackPos(a_StackPos)\n{\n\tASSERT(lua_istable(a_LuaState, a_StackPos));\n}\n\n\n\n\n\nvoid cLuaState::cStackTable::ForEachArrayElement(cFunctionRef<bool(cLuaState & a_LuaState, int a_Index)> a_ElementCallback) const\n{\n\tconst auto numElements = luaL_getn(m_LuaState, m_StackPos);\n\t[[maybe_unused]] const auto stackTop = lua_gettop(m_LuaState);\n\tfor (int idx = 1; idx <= numElements; idx++)\n\t{\n\t\t// Push the idx-th element of the array onto stack top and call the callback:\n\t\tlua_rawgeti(m_LuaState, m_StackPos, idx);\n\t\tauto shouldAbort = a_ElementCallback(m_LuaState, idx);\n\t\tASSERT(lua_gettop(m_LuaState) == stackTop + 1);  // The element callback must not change the Lua stack below the value\n\t\tlua_pop(m_LuaState, 1);\n\t\tif (shouldAbort)\n\t\t{\n\t\t\t// The callback wants to abort\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cLuaState::cStackTable::ForEachElement(cFunctionRef<bool(cLuaState & a_LuaState)> a_ElementCallback) const\n{\n\t[[maybe_unused]] const auto stackTop = lua_gettop(m_LuaState);\n\tlua_pushvalue(m_LuaState, m_StackPos);  // Stk: <table>\n\tlua_pushnil(m_LuaState);                // Stk: <table> nil\n\twhile (lua_next(m_LuaState, -2))        // Stk: <table> <key> <val>\n\t{\n\t\tauto shouldAbort = a_ElementCallback(m_LuaState);\n\t\tASSERT(lua_gettop(m_LuaState) == stackTop + 3);  // The element callback must not change the Lua stack below the value\n\t\tlua_pop(m_LuaState, 1);  // Stk: <table> <key>\n\t\tif (shouldAbort)\n\t\t{\n\t\t\t// The callback wants to abort\n\t\t\tlua_pop(m_LuaState, 2);  // Stk: empty\n\t\t\treturn;\n\t\t}\n\t}\n\t// Stk: <table>\n\tlua_pop(m_LuaState, 1);  // Stk: empty\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaState:\n\ncLuaState::cLuaState(const AString & a_SubsystemName) :\n\tm_LuaState(nullptr),\n\tm_IsOwned(false),\n\tm_SubsystemName(a_SubsystemName),\n\tm_NumCurrentFunctionArgs(-1)\n{\n}\n\n\n\n\n\ncLuaState::cLuaState(lua_State * a_AttachState) :\n\tm_LuaState(a_AttachState),\n\tm_IsOwned(false),\n\tm_SubsystemName(\"<attached>\"),\n\tm_NumCurrentFunctionArgs(-1)\n{\n}\n\n\n\n\n\ncLuaState::~cLuaState()\n{\n\tif (IsValid())\n\t{\n\t\tif (m_IsOwned)\n\t\t{\n\t\t\tClose();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDetach();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cLuaState::Create(void)\n{\n\tif (m_LuaState != nullptr)\n\t{\n\t\tLOGWARNING(\"%s: Trying to create an already-existing LuaState, ignoring.\", __FUNCTION__);\n\t\treturn;\n\t}\n\tm_LuaState = lua_open();\n\tluaL_openlibs(m_LuaState);\n\tm_IsOwned = true;\n\tcLuaStateTracker::Add(*this);\n\tcCanonLuaStates::Add(*this);\n}\n\n\n\n\n\nvoid cLuaState::RegisterAPILibs(void)\n{\n\tauto top = lua_gettop(m_LuaState);\n\ttolua_AllToLua_open(m_LuaState);\n\tASSERT(top == lua_gettop(m_LuaState));\n\tcManualBindings::Bind(m_LuaState);\n\tASSERT(top == lua_gettop(m_LuaState));\n\tDeprecatedBindings::Bind(m_LuaState);\n\tASSERT(top == lua_gettop(m_LuaState));\n\tcLuaJson::Bind(*this);\n\tASSERT(top == lua_gettop(m_LuaState));\n\tluaopen_lsqlite3(m_LuaState);\n\tif (top == lua_gettop(m_LuaState) - 1)\n\t{\n\t\t// lsqlite3 left the \"sqlite3\" table on the stack, pop it:\n\t\tlua_pop(m_LuaState, 1);\n\t}\n\tASSERT(top == lua_gettop(m_LuaState));\n\tluaopen_lxp(m_LuaState);\n\tif (top == lua_gettop(m_LuaState) - 1)\n\t{\n\t\t// lxp left the unregistered \"lxp\" table on the stack, register and pop it (#3304):\n\t\tlua_setglobal(m_LuaState, \"lxp\");\n\t}\n\tASSERT(top == lua_gettop(m_LuaState));\n}\n\n\n\n\n\nvoid cLuaState::Close(void)\n{\n\tif (m_LuaState == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: Trying to close an invalid LuaState, ignoring.\", __FUNCTION__);\n\t\treturn;\n\t}\n\tif (!m_IsOwned)\n\t{\n\t\tLOGWARNING(\n\t\t\t\"%s: Detected mis-use, calling Close() on an attached state (0x%p). Detaching instead.\",\n\t\t\t__FUNCTION__, static_cast<void *>(m_LuaState)\n\t\t);\n\t\tDetach();\n\t\treturn;\n\t}\n\n\t// Invalidate all tracked refs:\n\t{\n\t\tcCSLock Lock(m_CSTrackedRefs);\n\t\tfor (auto & r: m_TrackedRefs)\n\t\t{\n\t\t\tr->Invalidate();\n\t\t}\n\t\tm_TrackedRefs.clear();\n\t}\n\n\tcCanonLuaStates::Remove(*this);\n\tcLuaStateTracker::Del(*this);\n\tlua_close(m_LuaState);\n\tm_LuaState = nullptr;\n\tm_IsOwned = false;\n}\n\n\n\n\n\nvoid cLuaState::Attach(lua_State * a_State)\n{\n\tif (m_LuaState != nullptr)\n\t{\n\t\tLOGINFO(\"%s: Already contains a LuaState (0x%p), will be closed / detached.\", __FUNCTION__, static_cast<void *>(m_LuaState));\n\t\tif (m_IsOwned)\n\t\t{\n\t\t\tClose();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDetach();\n\t\t}\n\t}\n\tm_LuaState = a_State;\n\tm_IsOwned = false;\n}\n\n\n\n\n\nvoid cLuaState::Detach(void)\n{\n\tif (m_LuaState == nullptr)\n\t{\n\t\treturn;\n\t}\n\tif (m_IsOwned)\n\t{\n\t\tLOGWARNING(\n\t\t\t\"%s: Detected a mis-use, calling Detach() when the state is owned. Closing the owned state (0x%p).\",\n\t\t\t__FUNCTION__, static_cast<void *>(m_LuaState)\n\t\t);\n\t\tClose();\n\t\treturn;\n\t}\n\tm_LuaState = nullptr;\n}\n\n\n\n\n\nvoid cLuaState::AddPackagePath(const AString & a_PathVariable, const AString & a_Path)\n{\n\tASSERT_LUA_STACK_BALANCE(m_LuaState);\n\n\t// Get the current path:\n\tlua_getfield(m_LuaState, LUA_GLOBALSINDEX, \"package\");                           // Stk: <package>\n\tlua_getfield(m_LuaState, -1, a_PathVariable.c_str());                            // Stk: <package> <package.path>\n\tsize_t len = 0;\n\tconst char * PackagePath = lua_tolstring(m_LuaState, -1, &len);\n\n\t// Append the new path:\n\tAString NewPackagePath(PackagePath, len);\n\tNewPackagePath.append(LUA_PATHSEP);\n\tNewPackagePath.append(a_Path);\n\n\t// Set the new path to the environment:\n\tlua_pop(m_LuaState, 1);                                                          // Stk: <package>\n\tlua_pushlstring(m_LuaState, NewPackagePath.c_str(), NewPackagePath.length());    // Stk: <package> <NewPackagePath>\n\tlua_setfield(m_LuaState, -2, a_PathVariable.c_str());                            // Stk: <package>\n\tlua_pop(m_LuaState, 1);                                                          // Stk: -\n}\n\n\n\n\n\nbool cLuaState::LoadFile(const AString & a_FileName, bool a_LogWarnings)\n{\n\tASSERT(IsValid());\n\tASSERT_LUA_STACK_BALANCE(m_LuaState);\n\n\t// Load the file:\n\tint s = luaL_loadfile(m_LuaState, a_FileName.c_str());\n\tif (s != 0)\n\t{\n\t\tif (a_LogWarnings)\n\t\t{\n\t\t\tLOGWARNING(\"Can't load %s because of a load error in file %s: %d (%s)\", m_SubsystemName.c_str(), a_FileName.c_str(), s, lua_tostring(m_LuaState, -1));\n\t\t}\n\t\tlua_pop(m_LuaState, 1);\n\t\treturn false;\n\t}\n\n\t// Execute the globals:\n\ts = lua_pcall(m_LuaState, 0, 0, 0);\n\tif (s != 0)\n\t{\n\t\tif (a_LogWarnings)\n\t\t{\n\t\t\tLOGWARNING(\"Can't load %s because of an initialization error in file %s: %d (%s)\", m_SubsystemName.c_str(), a_FileName.c_str(), s, lua_tostring(m_LuaState, -1));\n\t\t}\n\t\tlua_pop(m_LuaState, 1);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::LoadString(const AString & a_StringToLoad, const AString & a_FileName, bool a_LogWarnings)\n{\n\tASSERT(IsValid());\n\tASSERT_LUA_STACK_BALANCE(m_LuaState);\n\n\t// Load the file:\n\tint s = luaL_loadstring(m_LuaState, a_StringToLoad.c_str());\n\tif (s != 0)\n\t{\n\t\tif (a_LogWarnings)\n\t\t{\n\t\t\tLOGWARNING(\"Can't load %s because of a load error in string from \\\"%s\\\": %d (%s)\", m_SubsystemName.c_str(), a_FileName.c_str(), s, lua_tostring(m_LuaState, -1));\n\t\t}\n\t\tlua_pop(m_LuaState, 1);\n\t\treturn false;\n\t}\n\n\t// Execute the globals:\n\ts = lua_pcall(m_LuaState, 0, LUA_MULTRET, 0);\n\tif (s != 0)\n\t{\n\t\tif (a_LogWarnings)\n\t\t{\n\t\t\tLOGWARNING(\"Can't load %s because of an initialization error in string from \\\"%s\\\": %d (%s)\", m_SubsystemName.c_str(), a_FileName.c_str(), s, lua_tostring(m_LuaState, -1));\n\t\t}\n\t\tlua_pop(m_LuaState, 1);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::HasFunction(const char * a_FunctionName)\n{\n\tif (!IsValid())\n\t{\n\t\t// This happens if cPlugin::Initialize() fails with an error\n\t\treturn false;\n\t}\n\n\tASSERT_LUA_STACK_BALANCE(m_LuaState);\n\tlua_getglobal(m_LuaState, a_FunctionName);\n\tbool res = (!lua_isnil(m_LuaState, -1) && lua_isfunction(m_LuaState, -1));\n\tlua_pop(m_LuaState, 1);\n\treturn res;\n}\n\n\n\n\n\nbool cLuaState::PushFunction(const char * a_FunctionName)\n{\n\tASSERT(m_NumCurrentFunctionArgs == -1);  // If not, there's already something pushed onto the stack\n\n\tif (!IsValid())\n\t{\n\t\t// This happens if cPlugin::Initialize() fails with an error\n\t\treturn false;\n\t}\n\n\t// Push the error handler for lua_pcall()\n\tlua_pushcfunction(m_LuaState, &ReportFnCallErrors);\n\n\tlua_getglobal(m_LuaState, a_FunctionName);\n\tif (!lua_isfunction(m_LuaState, -1))\n\t{\n\t\tLOGWARNING(\"Error in %s: Could not find function %s()\", m_SubsystemName.c_str(), a_FunctionName);\n\t\tlua_pop(m_LuaState, 2);\n\t\treturn false;\n\t}\n\tm_CurrentFunctionName.assign(a_FunctionName);\n\tm_NumCurrentFunctionArgs = 0;\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::PushFunction(const cRef & a_FnRef)\n{\n\tASSERT(IsValid());\n\tASSERT(m_NumCurrentFunctionArgs == -1);  // If not, there's already something pushed onto the stack\n\n\t// Push the error handler for lua_pcall()\n\tlua_pushcfunction(m_LuaState, &ReportFnCallErrors);\n\n\tlua_rawgeti(m_LuaState, LUA_REGISTRYINDEX, static_cast<int>(a_FnRef));  // same as lua_getref()\n\tif (!lua_isfunction(m_LuaState, -1))\n\t{\n\t\tlua_pop(m_LuaState, 2);\n\t\treturn false;\n\t}\n\tm_CurrentFunctionName = \"<callback>\";\n\tm_NumCurrentFunctionArgs = 0;\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::PushFunction(const cRef & a_TableRef, const char * a_FnName)\n{\n\tASSERT(IsValid());\n\tASSERT(m_NumCurrentFunctionArgs == -1);  // If not, there's already something pushed onto the stack\n\n\tif (!a_TableRef.IsValid())\n\t{\n\t\treturn false;\n\t}\n\n\t// Push the error handler for lua_pcall()\n\tlua_pushcfunction(m_LuaState, &ReportFnCallErrors);\n\n\t// Get the function from the table:\n\tlua_rawgeti(m_LuaState, LUA_REGISTRYINDEX, static_cast<int>(a_TableRef));\n\tif (!lua_istable(m_LuaState, -1))\n\t{\n\t\t// Not a table, bail out\n\t\tlua_pop(m_LuaState, 2);\n\t\treturn false;\n\t}\n\tlua_getfield(m_LuaState, -1, a_FnName);\n\tif (lua_isnil(m_LuaState, -1) || !lua_isfunction(m_LuaState, -1))\n\t{\n\t\t// Not a valid function, bail out\n\t\tlua_pop(m_LuaState, 3);\n\t\treturn false;\n\t}\n\n\t// Pop the table off the stack:\n\tlua_remove(m_LuaState, -2);\n\n\tm_CurrentFunctionName = fmt::format(FMT_STRING(\"<table-callback {}>\"), a_FnName);\n\tm_NumCurrentFunctionArgs = 0;\n\treturn true;\n}\n\n\n\n\n\nvoid cLuaState::Push(const AString & a_String)\n{\n\tASSERT(IsValid());\n\n\tlua_pushlstring(m_LuaState, a_String.data(), a_String.size());\n}\n\n\n\n\n\nvoid cLuaState::Push(const AStringMap & a_Dictionary)\n{\n\tASSERT(IsValid());\n\n\tlua_createtable(m_LuaState, 0, static_cast<int>(a_Dictionary.size()));\n\tint newTable = lua_gettop(m_LuaState);\n\tfor (const auto & item: a_Dictionary)\n\t{\n\t\tPush(item.first);   // key\n\t\tPush(item.second);  // value\n\t\tlua_rawset(m_LuaState, newTable);\n\t}\n}\n\n\n\n\n\nvoid cLuaState::Push(const AStringVector & a_Vector)\n{\n\tASSERT(IsValid());\n\n\tlua_createtable(m_LuaState, static_cast<int>(a_Vector.size()), 0);\n\tint newTable = lua_gettop(m_LuaState);\n\tint index = 1;\n\tfor (AStringVector::const_iterator itr = a_Vector.begin(), end = a_Vector.end(); itr != end; ++itr, ++index)\n\t{\n\t\tPush(*itr);\n\t\tlua_rawseti(m_LuaState, newTable, index);\n\t}\n}\n\n\n\n\n\nvoid cLuaState::Push(const char * a_Value)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushstring(m_LuaState, a_Value);\n}\n\n\n\n\n\nvoid cLuaState::Push(const cItem & a_Item)\n{\n\tASSERT(IsValid());\n\tauto c = new cItem(a_Item);\n\ttolua_pushusertype_and_takeownership(m_LuaState, c, \"cItem\");\n}\n\n\n\n\n\nvoid cLuaState::Push(const cNil & a_Nil)\n{\n\tASSERT(IsValid());\n\n\tlua_pushnil(m_LuaState);\n}\n\n\n\n\n\nvoid cLuaState::Push(const cLuaState::cRef & a_Ref)\n{\n\tASSERT(IsValid());\n\n\tlua_rawgeti(m_LuaState, LUA_REGISTRYINDEX, static_cast<int>(a_Ref));\n}\n\n\n\n\n\nvoid cLuaState::Push(const ContiguousByteBufferView a_Data)\n{\n\tASSERT(IsValid());\n\n\tlua_pushlstring(m_LuaState, reinterpret_cast<const char *>(a_Data.data()), a_Data.size());\n}\n\n\n\n\n\nvoid cLuaState::Push(const Vector3d & a_Vector)\n{\n\tASSERT(IsValid());\n\tauto c = new Vector3d(a_Vector);\n\ttolua_pushusertype_and_takeownership(m_LuaState, c, \"Vector3<double>\");\n}\n\n\n\n\n\nvoid cLuaState::Push(const Vector3i & a_Vector)\n{\n\tASSERT(IsValid());\n\tauto c = new Vector3i(a_Vector);\n\ttolua_pushusertype_and_takeownership(m_LuaState, c, \"Vector3<int>\");\n}\n\n\n\n\n\nvoid cLuaState::Push(bool a_Value)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushboolean(m_LuaState, a_Value ? 1 : 0);\n}\n\n\n\n\n\nvoid cLuaState::Push(const cEntity * a_Entity)\n{\n\t// Once we can make Lua understand constness, this function shall receive a corresponding function body\n\tPush(const_cast<cEntity * >(a_Entity));\n}\n\n\n\n\n\nvoid cLuaState::Push(cEntity * a_Entity)\n{\n\tASSERT(IsValid());\n\n\tif (a_Entity == nullptr)\n\t{\n\t\tlua_pushnil(m_LuaState);\n\t}\n\telse\n\t{\n\t\tconst char * ClassName = [&]\n\t\t\t{\n\t\t\t\tswitch (a_Entity->GetEntityType())\n\t\t\t\t{\n\t\t\t\t\tcase cEntity::etBoat:         return \"cBoat\";\n\t\t\t\t\tcase cEntity::etExpOrb:       return \"cExpOrb\";\n\t\t\t\t\tcase cEntity::etFallingBlock: return \"cFallingBlock\";\n\t\t\t\t\tcase cEntity::etFloater:      return \"cFloater\";\n\t\t\t\t\tcase cEntity::etItemFrame:    return \"cItemFrame\";\n\t\t\t\t\tcase cEntity::etLeashKnot:    return \"cLeashKnot\";\n\t\t\t\t\tcase cEntity::etPainting:     return \"cPainting\";\n\t\t\t\t\tcase cEntity::etPickup:       return \"cPickup\";\n\t\t\t\t\tcase cEntity::etPlayer:       return \"cPlayer\";\n\t\t\t\t\tcase cEntity::etTNT:          return \"cTNTEntity\";\n\n\t\t\t\t\tcase cEntity::etMonster:\n\t\t\t\t\t{\n\t\t\t\t\t\t// Don't push specific mob types, as those are not exported in the API:\n\t\t\t\t\t\treturn \"cMonster\";\n\t\t\t\t\t}\n\t\t\t\t\tcase cEntity::etProjectile:\n\t\t\t\t\t{\n\t\t\t\t\t\t// Push the specific projectile type:\n\t\t\t\t\t\treturn a_Entity->GetClass();\n\t\t\t\t\t}\n\n\t\t\t\t\tcase cEntity::etEntity:\n\t\t\t\t\tcase cEntity::etEnderCrystal:\n\t\t\t\t\tcase cEntity::etMinecart:\n\t\t\t\t\t{\n\t\t\t\t\t\t// Push the generic entity class type:\n\t\t\t\t\t\treturn \"cEntity\";\n\t\t\t\t\t}\n\t\t\t\t}  // switch (EntityType)\n\t\t\t\tUNREACHABLE(\"Unsupported entity type\");\n\t\t\t}();\n\t\ttolua_pushusertype(m_LuaState, a_Entity, ClassName);\n\t}\n}\n\n\n\n\n\nvoid cLuaState::Push(cLuaServerHandle * a_ServerHandle)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushusertype(m_LuaState, a_ServerHandle, \"cServerHandle\");\n}\n\n\n\n\n\nvoid cLuaState::Push(cLuaTCPLink * a_TCPLink)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushusertype(m_LuaState, a_TCPLink, \"cTCPLink\");\n}\n\n\n\n\n\nvoid cLuaState::Push(cLuaUDPEndpoint * a_UDPEndpoint)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushusertype(m_LuaState, a_UDPEndpoint, \"cUDPEndpoint\");\n}\n\n\n\n\n\nvoid cLuaState::Push(double a_Value)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushnumber(m_LuaState, a_Value);\n}\n\n\n\n\n\nvoid cLuaState::Push(int a_Value)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushnumber(m_LuaState, a_Value);\n}\n\n\n\n\n\nvoid cLuaState::Push(long a_Value)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushnumber(m_LuaState, static_cast<lua_Number>(a_Value));\n}\n\n\n\n\n\nvoid cLuaState::Push(UInt32 a_Value)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushnumber(m_LuaState, a_Value);\n}\n\n\n\n\n\nvoid cLuaState::Push(std::chrono::milliseconds a_Value)\n{\n\tASSERT(IsValid());\n\n\ttolua_pushnumber(m_LuaState, static_cast<lua_Number>(a_Value.count()));\n}\n\n\n\n\n\nvoid cLuaState::Pop(int a_NumValuesToPop)\n{\n\tASSERT(IsValid());\n\n\tlua_pop(m_LuaState, a_NumValuesToPop);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, AString & a_Value)\n{\n\tsize_t len = 0;\n\tconst char * data = lua_tolstring(m_LuaState, a_StackPos, &len);\n\tif (data != nullptr)\n\t{\n\t\ta_Value.assign(data, len);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, AStringMap & a_Value)\n{\n\t// Retrieve all values in a string => string dictionary table:\n\tif (!lua_istable(m_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\tcStackTable tbl(*this, a_StackPos);\n\tbool isValid = true;\n\ttbl.ForEachElement([&isValid, &a_Value](cLuaState & a_LuaState)\n\t\t{\n\t\t\tAString key, val;\n\t\t\tif (a_LuaState.GetStackValues(-2, key, val))\n\t\t\t{\n\t\t\t\ta_Value[key] = val;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tisValid = false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t);\n\treturn isValid;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, AStringVector & a_Value)\n{\n\t// Retrieve all values in an array of string table:\n\tif (!lua_istable(m_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\tcStackTable tbl(*this, a_StackPos);\n\tbool isValid = true;\n\ttbl.ForEachArrayElement([&](cLuaState & a_LuaState, int a_Index)\n\t\t{\n\t\t\tAString tempStr;\n\t\t\tif (a_LuaState.GetStackValue(-1, tempStr))\n\t\t\t{\n\t\t\t\ta_Value.push_back(std::move(tempStr));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tisValid = false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t);\n\treturn isValid;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, bool & a_ReturnedVal)\n{\n\ta_ReturnedVal = (tolua_toboolean(m_LuaState, a_StackPos, a_ReturnedVal ? 1 : 0) > 0);\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cCallback & a_Callback)\n{\n\treturn a_Callback.RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cCallbackPtr & a_Callback)\n{\n\tif (a_Callback == nullptr)\n\t{\n\t\ta_Callback = std::make_unique<cCallback>();\n\t}\n\treturn a_Callback->RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cOptionalCallback & a_Callback)\n{\n\treturn a_Callback.RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cOptionalCallbackPtr & a_Callback)\n{\n\tif (a_Callback == nullptr)\n\t{\n\t\ta_Callback = std::make_unique<cOptionalCallback>();\n\t}\n\treturn a_Callback->RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cCallbackSharedPtr & a_Callback)\n{\n\tif (a_Callback == nullptr)\n\t{\n\t\ta_Callback = std::make_shared<cCallback>();\n\t}\n\treturn a_Callback->RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cPluginManager::CommandResult & a_Result)\n{\n\tif (lua_isnumber(m_LuaState, a_StackPos))\n\t{\n\t\ta_Result = static_cast<cPluginManager::CommandResult>(static_cast<int>((tolua_tonumber(m_LuaState, a_StackPos, a_Result))));\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cRef & a_Ref)\n{\n\ta_Ref.RefStack(*this, a_StackPos);\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cStackTablePtr & a_StackTable)\n{\n\t// Only allow tables to be stored in a_StackTable:\n\tif (!lua_istable(m_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\n\t// Assign the StackTable to the specified stack position:\n\ta_StackTable = std::make_unique<cStackTable>(*this, a_StackPos);\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cTableRef & a_TableRef)\n{\n\treturn a_TableRef.RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cTableRefPtr & a_TableRef)\n{\n\tif (a_TableRef == nullptr)\n\t{\n\t\ta_TableRef = std::make_unique<cTableRef>();\n\t}\n\treturn a_TableRef->RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cTrackedRef & a_Ref)\n{\n\treturn a_Ref.RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cTrackedRefPtr & a_Ref)\n{\n\tif (a_Ref == nullptr)\n\t{\n\t\ta_Ref = std::make_unique<cTrackedRef>();\n\t}\n\treturn a_Ref->RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cTrackedRefSharedPtr & a_Ref)\n{\n\tif (a_Ref == nullptr)\n\t{\n\t\ta_Ref = std::make_shared<cTrackedRef>();\n\t}\n\treturn a_Ref->RefStack(*this, a_StackPos);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, ContiguousByteBuffer & a_Data)\n{\n\tsize_t Length = 0;\n\tconst char * const Data = lua_tolstring(m_LuaState, a_StackPos, &Length);\n\tif (Data != nullptr)\n\t{\n\t\ta_Data.assign(reinterpret_cast<const std::byte *>(Data), Length);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, CustomStatistic & a_Value)\n{\n\tif (lua_isnumber(m_LuaState, a_StackPos))\n\t{\n\t\ta_Value = static_cast<CustomStatistic>(static_cast<std::underlying_type_t<CustomStatistic>>(lua_tonumber(m_LuaState, a_StackPos)));\n\t\treturn true;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, double & a_ReturnedVal)\n{\n\tif (lua_isnumber(m_LuaState, a_StackPos))\n\t{\n\t\ta_ReturnedVal = tolua_tonumber(m_LuaState, a_StackPos, a_ReturnedVal);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, eBlockFace & a_ReturnedVal)\n{\n\tif (!lua_isnumber(m_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\ta_ReturnedVal = static_cast<eBlockFace>(Clamp(\n\t\tstatic_cast<int>(tolua_tonumber(m_LuaState, a_StackPos, a_ReturnedVal)),\n\t\tstatic_cast<int>(BLOCK_FACE_MIN), static_cast<int>(BLOCK_FACE_MAX))\n\t);\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, eWeather & a_ReturnedVal)\n{\n\tif (!lua_isnumber(m_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\ta_ReturnedVal = static_cast<eWeather>(Clamp(\n\t\tstatic_cast<int>(tolua_tonumber(m_LuaState, a_StackPos, a_ReturnedVal)),\n\t\tstatic_cast<int>(wSunny), static_cast<int>(wThunderstorm))\n\t);\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, float & a_ReturnedVal)\n{\n\tif (lua_isnumber(m_LuaState, a_StackPos))\n\t{\n\t\ta_ReturnedVal = static_cast<float>(tolua_tonumber(m_LuaState, a_StackPos, a_ReturnedVal));\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, cUUID & a_Value)\n{\n\tif (lua_isnil(m_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\n\ttolua_Error tolua_Err;\n\tif (tolua_isusertype(m_LuaState, a_StackPos, \"cUUID\", 0, &tolua_Err))\n\t{\n\t\t// Found a cUUID, copy into output value\n\t\tcUUID * PtrUUID = nullptr;\n\t\tGetStackValue(a_StackPos, PtrUUID);\n\t\tif (PtrUUID == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\ta_Value = *PtrUUID;\n\t\treturn true;\n\t}\n\n\t// Try to get a string and parse as a UUID into the output\n\tAString StrUUID;\n\tif (!GetStackValue(a_StackPos, StrUUID))\n\t{\n\t\treturn false;\n\t}\n\treturn a_Value.FromString(StrUUID);\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int a_StackPos, std::string_view & a_Value)\n{\n\tsize_t Length = 0;\n\tconst char * const Value = lua_tolstring(m_LuaState, a_StackPos, &Length);\n\tif (Value != nullptr)\n\t{\n\t\ta_Value = { Value, Length };\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\ntemplate <typename T>\nbool cLuaState::GetStackValue(int a_StackPos, Vector3<T> & a_ReturnedVal)\n{\n\ttolua_Error err;\n\tif (lua_isnil(m_LuaState, a_StackPos))\n\t{\n\t\treturn false;\n\t}\n\tif (tolua_isusertype(m_LuaState, a_StackPos, \"Vector3<double>\", 0, &err))\n\t{\n\t\ta_ReturnedVal = **(static_cast<const Vector3d **>(lua_touserdata(m_LuaState, a_StackPos)));\n\t\treturn true;\n\t}\n\tif (tolua_isusertype(m_LuaState, a_StackPos, \"Vector3<float>\", 0, &err))\n\t{\n\t\ta_ReturnedVal = **(static_cast<const Vector3f **>(lua_touserdata(m_LuaState, a_StackPos)));\n\t\treturn true;\n\t}\n\tif (tolua_isusertype(m_LuaState, a_StackPos, \"Vector3<int>\", 0, &err))\n\t{\n\t\ta_ReturnedVal = **(static_cast<const Vector3i **>(lua_touserdata(m_LuaState, a_StackPos)));\n\t\treturn true;\n\t}\n\n\t// Bonus: Allow simple tables to work as Vector3:\n\tif (lua_istable(m_LuaState, a_StackPos))\n\t{\n\t\tlua_rawgeti(m_LuaState, a_StackPos, 1);\n\t\tlua_rawgeti(m_LuaState, a_StackPos, 2);\n\t\tlua_rawgeti(m_LuaState, a_StackPos, 3);\n\t\tT x, y, z;\n\t\tif (!GetStackValues(-3, x, y, z))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\ta_ReturnedVal = Vector3<T>(x, y, z);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n// Explicitly instantiate the previous function for all Vector3 types:\ntemplate bool cLuaState::GetStackValue(int a_StackPos, Vector3d & a_ReturnedVal);\ntemplate bool cLuaState::GetStackValue(int a_StackPos, Vector3f & a_ReturnedVal);\ntemplate bool cLuaState::GetStackValue(int a_StackPos, Vector3i & a_ReturnedVal);\n\n\n\n\n\ncLuaState::cStackValue cLuaState::WalkToValue(const AString & a_Name)\n{\n\t// There needs to be at least one value on the stack:\n\tASSERT(lua_gettop(m_LuaState) > 0);\n\n\t// Iterate over path and replace the top of the stack with the walked element\n\tlua_pushvalue(m_LuaState, -1);  // Copy the stack value into the \"working area\"\n\tauto path = StringSplit(a_Name, \".\");\n\tfor (const auto & elem: path)\n\t{\n\t\t// If the value is not a table, bail out (error):\n\t\tif (!lua_istable(m_LuaState, -1))\n\t\t{\n\t\t\tlua_pop(m_LuaState, 1);\n\t\t\treturn cStackValue();\n\t\t}\n\n\t\t// Get the next part of the path:\n\t\tlua_getfield(m_LuaState, -1, elem.c_str());\n\n\t\t// Remove the previous value from the stack (keep only the new one):\n\t\tlua_remove(m_LuaState, -2);\n\t}  // for elem - path[]\n\tif (lua_isnil(m_LuaState, -1))\n\t{\n\t\tlua_pop(m_LuaState, 1);\n\t\treturn cStackValue();\n\t}\n\treturn cStackValue(*this);\n}\n\n\n\n\n\ncLuaState::cStackValue cLuaState::WalkToNamedGlobal(const AString & a_Name)\n{\n\t// Iterate over path and replace the top of the stack with the walked element\n\tlua_getglobal(m_LuaState, \"_G\");\n\tauto path = StringSplit(a_Name, \".\");\n\tfor (const auto & elem: path)\n\t{\n\t\t// If the value is not a table, bail out (error):\n\t\tif (!lua_istable(m_LuaState, -1))\n\t\t{\n\t\t\tlua_pop(m_LuaState, 1);\n\t\t\treturn cStackValue();\n\t\t}\n\n\t\t// Get the next part of the path:\n\t\tlua_getfield(m_LuaState, -1, elem.c_str());\n\n\t\t// Remove the previous value from the stack (keep only the new one):\n\t\tlua_remove(m_LuaState, -2);\n\t}  // for elem - path[]\n\tif (lua_isnil(m_LuaState, -1))\n\t{\n\t\tlua_pop(m_LuaState, 1);\n\t\treturn cStackValue();\n\t}\n\treturn cStackValue(*this);\n}\n\n\n\n\n\nbool cLuaState::CallFunction(int a_NumResults)\n{\n\tASSERT (m_NumCurrentFunctionArgs >= 0);  // A function must be pushed to stack first\n\tASSERT(lua_isfunction(m_LuaState, -m_NumCurrentFunctionArgs - 1));  // The function to call\n\tASSERT(lua_isfunction(m_LuaState, -m_NumCurrentFunctionArgs - 2));  // The error handler\n\n\t// Save the current \"stack\" state and reset, in case the callback calls another function:\n\tAString CurrentFunctionName;\n\tstd::swap(m_CurrentFunctionName, CurrentFunctionName);\n\tint NumArgs = m_NumCurrentFunctionArgs;\n\tm_NumCurrentFunctionArgs = -1;\n\n\t// Call the function:\n\tint s = lua_pcall(m_LuaState, NumArgs, a_NumResults, -NumArgs - 2);\n\tif (s != 0)\n\t{\n\t\t// The error has already been printed together with the stacktrace\n\t\tLOGWARNING(\"Error in %s calling function %s()\", m_SubsystemName, CurrentFunctionName);\n\n\t\t// Remove the error handler and error message from the stack:\n\t\tauto top = lua_gettop(m_LuaState);\n\t\tif (top < 2)\n\t\t{\n\t\t\tLogStackValues(fmt::format(FMT_STRING(\"The Lua stack is in an unexpected state, expected at least two values there, but got {}\"), top).c_str());\n\t\t}\n\t\tlua_pop(m_LuaState, std::min(2, top));\n\t\treturn false;\n\t}\n\n\t// Remove the error handler from the stack:\n\tlua_remove(m_LuaState, -a_NumResults - 1);\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamUserTable(int a_StartParam, const char * a_UserTable, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\ttolua_Error tolua_err;\n\tfor (int i = a_StartParam; i <= a_EndParam; i++)\n\t{\n\t\tif (tolua_isusertable(m_LuaState, i, a_UserTable, 0, &tolua_err))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Not the correct parameter\n\t\tlua_Debug entry;\n\t\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\t\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\t\tAString ErrMsg = fmt::format(FMT_STRING(\"#ferror in function '{}'.\"), (entry.name != nullptr) ? entry.name : \"?\");\n\t\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\t\treturn false;\n\t}  // for i - Param\n\n\t// All params checked ok\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamUserType(int a_StartParam, const char * a_UserType, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\ttolua_Error tolua_err;\n\tfor (int i = a_StartParam; i <= a_EndParam; i++)\n\t{\n\t\tif (tolua_isusertype(m_LuaState, i, a_UserType, 0, &tolua_err))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Not the correct parameter\n\t\tlua_Debug entry;\n\t\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\t\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\t\tAString ErrMsg = fmt::format(FMT_STRING(\"#ferror in function '{}'.\"), (entry.name != nullptr) ? entry.name : \"?\");\n\t\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\t\treturn false;\n\t}  // for i - Param\n\n\t// All params checked ok\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamTable(int a_StartParam, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\ttolua_Error tolua_err;\n\tfor (int i = a_StartParam; i <= a_EndParam; i++)\n\t{\n\t\tif (tolua_istable(m_LuaState, i, 0, &tolua_err))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Not the correct parameter\n\t\tlua_Debug entry;\n\t\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\t\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\t\tAString ErrMsg = fmt::format(FMT_STRING(\"#ferror in function '{}'.\"), (entry.name != nullptr) ? entry.name : \"?\");\n\n\t\tBreakIntoDebugger(m_LuaState);\n\n\t\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\t\treturn false;\n\t}  // for i - Param\n\n\t// All params checked ok\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamNumber(int a_StartParam, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\ttolua_Error tolua_err;\n\tfor (int i = a_StartParam; i <= a_EndParam; i++)\n\t{\n\t\tif (tolua_isnumber(m_LuaState, i, 0, &tolua_err))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Not the correct parameter\n\t\tlua_Debug entry;\n\t\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\t\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\t\tAString ErrMsg = fmt::format(FMT_STRING(\"#ferror in function '{}'.\"), (entry.name != nullptr) ? entry.name : \"?\");\n\t\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\t\treturn false;\n\t}  // for i - Param\n\n\t// All params checked ok\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamBool(int a_StartParam, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\ttolua_Error tolua_err;\n\tfor (int i = a_StartParam; i <= a_EndParam; i++)\n\t{\n\t\tif (tolua_isboolean(m_LuaState, i, 0, &tolua_err))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Not the correct parameter\n\t\tlua_Debug entry;\n\t\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\t\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\t\tAString ErrMsg = fmt::format(FMT_STRING(\"#ferror in function '{}'.\"), (entry.name != nullptr) ? entry.name : \"?\");\n\t\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\t\treturn false;\n\t}  // for i - Param\n\n\t// All params checked ok\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamString(int a_StartParam, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\ttolua_Error tolua_err;\n\tfor (int i = a_StartParam; i <= a_EndParam; i++)\n\t{\n\t\tif (lua_isstring(m_LuaState, i))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Not the correct parameter\n\t\tlua_Debug entry;\n\t\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\t\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\t\ttolua_err.array = 0;\n\t\ttolua_err.type = \"string\";\n\t\ttolua_err.index = i;\n\t\tAString ErrMsg = fmt::format(FMT_STRING(\"#ferror in function '{}'.\"), (entry.name != nullptr) ? entry.name : \"?\");\n\t\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\t\treturn false;\n\t}  // for i - Param\n\n\t// All params checked ok\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamFunction(int a_StartParam, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\tfor (int i = a_StartParam; i <= a_EndParam; i++)\n\t{\n\t\tif (lua_isfunction(m_LuaState, i))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Not the correct parameter\n\t\tlua_Debug entry;\n\t\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\t\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\t\tluaL_error(m_LuaState, \"Error in function '%s' parameter #%d. Function expected, got %s\",\n\t\t\t(entry.name != nullptr) ? entry.name : \"?\", i, GetTypeText(i).c_str()\n\t\t);\n\t\treturn false;\n\t}  // for i - Param\n\n\t// All params checked ok\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamFunctionOrNil(int a_StartParam, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\tfor (int i = a_StartParam; i <= a_EndParam; i++)\n\t{\n\t\tif (lua_isfunction(m_LuaState, i) || lua_isnil(m_LuaState, i))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Not the correct parameter\n\t\tlua_Debug entry;\n\t\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\t\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\t\tluaL_error(m_LuaState, \"Error in function '%s' parameter #%d. Function expected, got %s\",\n\t\t\t(entry.name != nullptr) ? entry.name : \"?\", i, GetTypeText(i).c_str()\n\t\t);\n\t\treturn false;\n\t}  // for i - Param\n\n\t// All params checked ok\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamVector3(int a_StartParam, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\tfor (int i = a_StartParam; i <= a_EndParam; ++i)\n\t{\n\t\tif (IsParamVector3(a_StartParam))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tApiParamError(fmt::format(FMT_STRING(\"Failed to read parameter #{}. Vector3 expected, got {}\"), i, GetTypeText(i)));\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamUUID(int a_StartParam, int a_EndParam)\n{\n\tASSERT(IsValid());\n\n\tif (a_EndParam < 0)\n\t{\n\t\ta_EndParam = a_StartParam;\n\t}\n\n\tcUUID tempUUID;\n\tAString tempStr;\n\t// Accept either a cUUID or a string that contains a valid UUID\n\tfor (int i = a_StartParam; i <= a_EndParam; ++i)\n\t{\n\t\ttolua_Error err;\n\t\tif (tolua_isusertype(m_LuaState, i, \"cUUID\", 0, &err) && !lua_isnil(m_LuaState, i))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!tolua_iscppstring(m_LuaState, i, 0, &err))\n\t\t{\n\t\t\tApiParamError(fmt::format(FMT_STRING(\"Failed to read parameter #{}. UUID expected, got {}\"), i, GetTypeText(i)));\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check string is a valid UUID\n\t\tGetStackValue(i, tempStr);\n\t\tif (!tempUUID.FromString(tempStr))\n\t\t{\n\t\t\tApiParamError(fmt::format(FMT_STRING(\"Failed to read parameter #{}. UUID expected, got non-UUID string:\\n\\t\\\"{}\\\"\"), i, tempStr));\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CheckParamEnd(int a_Param)\n{\n\ttolua_Error tolua_err;\n\tif (tolua_isnoobj(m_LuaState, a_Param, &tolua_err) == 1)\n\t{\n\t\treturn true;\n\t}\n\t// Not the correct parameter\n\tlua_Debug entry;\n\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\tAString ErrMsg = fmt::format(FMT_STRING(\"#ferror in function '{}': Too many arguments.\"), (entry.name != nullptr) ? entry.name : \"?\");\n\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\treturn false;\n}\n\n\n\n\n\nbool cLuaState::CheckParamSelf(const char * a_SelfClassName)\n{\n\ttolua_Error tolua_err;\n\tif (tolua_isusertype(m_LuaState, 1, a_SelfClassName, 0, &tolua_err) && !lua_isnil(m_LuaState, 1))\n\t{\n\t\treturn true;\n\t}\n\n\t// Not the correct parameter\n\tlua_Debug entry;\n\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\tAString ErrMsg = fmt::format(\n\t\tFMT_STRING(\"Error in function '{}'. The 'self' parameter is not of the expected type, \\\"instance of {}\\\". \" \\\n\t\t\"Make sure you're using the correct calling convention (obj:fn() instead of obj.fn()).\"),\n\t\t(entry.name != nullptr) ? entry.name : \"<unknown>\", a_SelfClassName\n\t);\n\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\treturn false;\n}\n\n\n\n\n\nbool cLuaState::CheckParamStaticSelf(const char * a_SelfClassName)\n{\n\ttolua_Error tolua_err;\n\tif (tolua_isusertable(m_LuaState, 1, a_SelfClassName, 0, &tolua_err) && !lua_isnil(m_LuaState, 1))\n\t{\n\t\treturn true;\n\t}\n\n\t// Not the correct parameter\n\tlua_Debug entry;\n\tVERIFY(lua_getstack(m_LuaState, 0,   &entry));\n\tVERIFY(lua_getinfo (m_LuaState, \"n\", &entry));\n\tAString ErrMsg = fmt::format(\n\t\tFMT_STRING(\"Error in function '{}'. The 'self' parameter is not of the expected type, \\\"class {}\\\". \" \\\n\t\t\"Make sure you're using the correct calling convention (cClassName:fn() instead of cClassName.fn() or obj:fn()).\"),\n\t\t(entry.name != nullptr) ? entry.name : \"<unknown>\", a_SelfClassName\n\t);\n\ttolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);\n\treturn false;\n}\n\n\n\n\n\nbool cLuaState::IsParamUserType(int a_ParamIdx, const AString & a_UserType)\n{\n\tASSERT(IsValid());\n\n\ttolua_Error tolua_err;\n\treturn (tolua_isusertype(m_LuaState, a_ParamIdx, a_UserType.c_str(), 0, &tolua_err) == 1);\n}\n\n\n\n\n\nbool cLuaState::IsParamNumber(int a_ParamIdx)\n{\n\tASSERT(IsValid());\n\n\ttolua_Error tolua_err;\n\treturn (tolua_isnumber(m_LuaState, a_ParamIdx, 0, &tolua_err) == 1);\n}\n\n\n\n\n\nbool cLuaState::IsParamVector3(int a_ParamIdx)\n{\n\tASSERT(IsValid());\n\n\treturn (\n\t\tIsParamUserType(a_ParamIdx, \"Vector3<double>\") ||\n\t\tIsParamUserType(a_ParamIdx, \"Vector3<float>\") ||\n\t\tIsParamUserType(a_ParamIdx, \"Vector3<int>\") ||\n\t\tlua_istable(m_LuaState, a_ParamIdx)  // Assume any table is good enough\n\t);\n}\n\n\n\n\n\nbool cLuaState::ReportErrors(int a_Status)\n{\n\treturn ReportErrors(m_LuaState, a_Status);\n}\n\n\n\n\n\nbool cLuaState::ReportErrors(lua_State * a_LuaState, int a_Status)\n{\n\tif (a_Status == 0)\n\t{\n\t\t// No error to report\n\t\treturn false;\n\t}\n\n\tLOGWARNING(\"LUA: %d - %s\", a_Status, lua_tostring(a_LuaState, -1));\n\tlua_pop(a_LuaState, 1);\n\treturn true;\n}\n\n\n\n\n\nvoid cLuaState::LogStackTrace(int a_StartingDepth)\n{\n\tLogStackTrace(m_LuaState, a_StartingDepth);\n}\n\n\n\n\n\nvoid cLuaState::LogStackTrace(lua_State * a_LuaState, int a_StartingDepth)\n{\n\tLOGWARNING(\"Stack trace:\");\n\tlua_Debug entry;\n\tint depth = a_StartingDepth;\n\twhile (lua_getstack(a_LuaState, depth, &entry))\n\t{\n\t\tlua_getinfo(a_LuaState, \"Sln\", &entry);\n\t\tLOGWARNING(\"  %s(%d): %s\", entry.short_src, entry.currentline, entry.name ? entry.name : \"(no name)\");\n\t\tdepth++;\n\t}\n\tLOGWARNING(\"Stack trace end\");\n}\n\n\n\n\n\nint cLuaState::ApiParamError(std::string_view a_Msg)\n{\n\t// Retrieve current function name\n\tlua_Debug entry;\n\tVERIFY(lua_getstack(m_LuaState, 0, &entry));\n\tVERIFY(lua_getinfo(m_LuaState, \"n\", &entry));\n\n\t// Compose the error message:\n\tAString errorMsg = fmt::format(\"{0}: {1}\", (entry.name != nullptr) ? entry.name : \"<unknown function>\", a_Msg);\n\n\t// Log everything into the console:\n\tLOGWARNING(\"%s\", errorMsg.c_str());\n\t// cLuaState::LogStackTrace(a_LuaState);  // Do NOT log stack trace, it is already output as part of the Lua error handling\n\tLogStackValues(m_LuaState, \"Parameters on the stack\");\n\n\t// Raise Lua error:\n\tlua_pushstring(m_LuaState, errorMsg.c_str());\n\treturn lua_error(m_LuaState);\n}\n\n\n\n\n\nAString cLuaState::GetTypeText(int a_StackPos)\n{\n\treturn lua_typename(m_LuaState, lua_type(m_LuaState, a_StackPos));\n}\n\n\n\n\n\nint cLuaState::CallFunctionWithForeignParams(\n\tconst AString & a_FunctionName,\n\tcLuaState & a_SrcLuaState,\n\tint a_SrcParamStart,\n\tint a_SrcParamEnd\n)\n{\n\tASSERT(IsValid());\n\tASSERT(a_SrcLuaState.IsValid());\n\n\t// Store the stack position before any changes\n\tint OldTop = lua_gettop(m_LuaState);\n\n\t// Push the function to call, including the error handler:\n\tif (!PushFunction(a_FunctionName.c_str()))\n\t{\n\t\tLOGWARNING(\"Function '%s' not found\", a_FunctionName.c_str());\n\t\tlua_settop(m_LuaState, OldTop);\n\t\treturn -1;\n\t}\n\n\t// Copy the function parameters to the target state\n\tif (CopyStackFrom(a_SrcLuaState, a_SrcParamStart, a_SrcParamEnd) < 0)\n\t{\n\t\t// Something went wrong, fix the stack and exit\n\t\tlua_settop(m_LuaState, OldTop);\n\t\tm_NumCurrentFunctionArgs = -1;\n\t\tm_CurrentFunctionName.clear();\n\t\treturn -1;\n\t}\n\n\t// Call the function, with an error handler:\n\tint s = lua_pcall(m_LuaState, a_SrcParamEnd - a_SrcParamStart + 1, LUA_MULTRET, OldTop + 1);\n\tif (ReportErrors(s))\n\t{\n\t\tLOGWARN(\"Error while calling function '%s' in '%s'\", a_FunctionName.c_str(), m_SubsystemName.c_str());\n\t\t// Reset the stack:\n\t\tlua_settop(m_LuaState, OldTop);\n\n\t\t// Reset the internal checking mechanisms:\n\t\tm_NumCurrentFunctionArgs = -1;\n\t\tm_CurrentFunctionName.clear();\n\n\t\t// Make Lua think everything is okay and return 0 values, so that plugins continue executing.\n\t\t// The failure is indicated by the zero return values.\n\t\treturn 0;\n\t}\n\n\t// Reset the internal checking mechanisms:\n\tm_NumCurrentFunctionArgs = -1;\n\tm_CurrentFunctionName.clear();\n\n\t// Remove the error handler from the stack:\n\tlua_remove(m_LuaState, OldTop + 1);\n\n\t// Return the number of return values:\n\treturn lua_gettop(m_LuaState) - OldTop;\n}\n\n\n\n\n\nint cLuaState::CopyStackFrom(cLuaState & a_SrcLuaState, int a_SrcStart, int a_SrcEnd, int a_NumAllowedNestingLevels)\n{\n\t/*\n\t// DEBUG:\n\tLOGD(\"Copying stack values from %d to %d\", a_SrcStart, a_SrcEnd);\n\ta_SrcLuaState.LogStack(\"Src stack before copying:\");\n\tLogStack(\"Dst stack before copying:\");\n\t*/\n\tfor (int i = a_SrcStart; i <= a_SrcEnd; ++i)\n\t{\n\t\tif (!CopySingleValueFrom(a_SrcLuaState, i, a_NumAllowedNestingLevels))\n\t\t{\n\t\t\tlua_pop(m_LuaState, i - a_SrcStart);\n\t\t\treturn -1;\n\t\t}\n\t}\n\treturn a_SrcEnd - a_SrcStart + 1;\n}\n\n\n\n\n\nbool cLuaState::CopyTableFrom(cLuaState & a_SrcLuaState, int a_SrcStackIdx, int a_NumAllowedNestingLevels)\n{\n\t[[maybe_unused]] const auto srcTop = lua_gettop(a_SrcLuaState);\n\t[[maybe_unused]] const auto dstTop = lua_gettop(m_LuaState);\n\n\t// Create the dest table:\n\tlua_createtable(m_LuaState, 0, 0);            // DST: <table>\n\tlua_pushvalue(a_SrcLuaState, a_SrcStackIdx);  // SRC: <table>\n\tlua_pushnil(a_SrcLuaState);                   // SRC: <table> <key>\n\twhile (lua_next(a_SrcLuaState, -2) != 0)      // SRC: <table> <key> <value>\n\t{\n\t\tASSERT(lua_gettop(a_SrcLuaState) == srcTop + 3);\n\t\tASSERT(lua_gettop(m_LuaState) == dstTop + 1);\n\n\t\t// Copy the key:\n\t\tif (!CopySingleValueFrom(a_SrcLuaState, -2, a_NumAllowedNestingLevels))  // DST: <table> <key>\n\t\t{\n\t\t\tlua_pop(m_LuaState, 1);\n\t\t\tlua_pop(a_SrcLuaState, 3);\n\t\t\tASSERT(lua_gettop(a_SrcLuaState) == srcTop);\n\t\t\tASSERT(lua_gettop(m_LuaState) == dstTop);\n\t\t\treturn false;\n\t\t}\n\t\tASSERT(lua_gettop(a_SrcLuaState) == srcTop + 3);\n\t\tASSERT(lua_gettop(m_LuaState) == dstTop + 2);\n\n\t\t// Copy the value:\n\t\tif (!CopySingleValueFrom(a_SrcLuaState, -1, a_NumAllowedNestingLevels - 1))  // DST: <table> <key> <value>\n\t\t{\n\t\t\tlua_pop(m_LuaState, 2);     // DST: empty\n\t\t\tlua_pop(a_SrcLuaState, 3);  // SRC: empty\n\t\t\tASSERT(lua_gettop(a_SrcLuaState) == srcTop);\n\t\t\tASSERT(lua_gettop(m_LuaState) == dstTop);\n\t\t\treturn false;\n\t\t}\n\t\tASSERT(lua_gettop(a_SrcLuaState) == srcTop + 3);\n\t\tASSERT(lua_gettop(m_LuaState) == dstTop + 3);\n\n\t\t// Set the value and fix up stacks:\n\t\tlua_rawset(m_LuaState, -3);  // DST: <table>\n\t\tlua_pop(a_SrcLuaState, 1);  // SRC: <table> <key>\n\t\tASSERT(lua_gettop(a_SrcLuaState) == srcTop + 2);\n\t\tASSERT(lua_gettop(m_LuaState) == dstTop + 1);\n\t}\n\tlua_pop(a_SrcLuaState, 1);  // SRC: empty\n\tASSERT(lua_gettop(a_SrcLuaState) == srcTop);\n\tASSERT(lua_gettop(m_LuaState) == dstTop + 1);\n\treturn true;\n}\n\n\n\n\n\nbool cLuaState::CopySingleValueFrom(cLuaState & a_SrcLuaState, int a_StackIdx, int a_NumAllowedNestingLevels)\n{\n\tint t = lua_type(a_SrcLuaState, a_StackIdx);\n\tswitch (t)\n\t{\n\t\tcase LUA_TNIL:\n\t\t{\n\t\t\tlua_pushnil(m_LuaState);\n\t\t\treturn true;\n\t\t}\n\t\tcase LUA_TSTRING:\n\t\t{\n\t\t\tAString s;\n\t\t\ta_SrcLuaState.ToString(a_StackIdx, s);\n\t\t\tPush(s);\n\t\t\treturn true;\n\t\t}\n\t\tcase LUA_TBOOLEAN:\n\t\t{\n\t\t\tbool b = (tolua_toboolean(a_SrcLuaState, a_StackIdx, false) != 0);\n\t\t\tPush(b);\n\t\t\treturn true;\n\t\t}\n\t\tcase LUA_TNUMBER:\n\t\t{\n\t\t\tlua_Number d = tolua_tonumber(a_SrcLuaState, a_StackIdx, 0);\n\t\t\tPush(d);\n\t\t\treturn true;\n\t\t}\n\t\tcase LUA_TUSERDATA:\n\t\t{\n\t\t\t// Get the class name:\n\t\t\tconst char * type = nullptr;\n\t\t\tif (lua_getmetatable(a_SrcLuaState, a_StackIdx) == 0)\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Unknown class in pos %d, cannot copy.\", __FUNCTION__, a_StackIdx);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlua_rawget(a_SrcLuaState, LUA_REGISTRYINDEX);  // Stack +1\n\t\t\ttype = lua_tostring(a_SrcLuaState, -1);\n\t\t\tlua_pop(a_SrcLuaState, 1);                     // Stack -1\n\n\t\t\t// Copy the value:\n\t\t\tvoid * ud = tolua_touserdata(a_SrcLuaState, a_StackIdx, nullptr);\n\t\t\ttolua_pushusertype(m_LuaState, ud, type);\n\t\t\treturn true;\n\t\t}\n\t\tcase LUA_TTABLE:\n\t\t{\n\t\t\tif (!CopyTableFrom(a_SrcLuaState, a_StackIdx, a_NumAllowedNestingLevels - 1))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Failed to copy table in pos %d.\", __FUNCTION__, a_StackIdx);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"%s: Unsupported value: '%s' at stack position %d. Can only copy numbers, strings, bools, classes and simple tables!\",\n\t\t\t\t__FUNCTION__, lua_typename(a_SrcLuaState, t), a_StackIdx\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cLuaState::ToString(int a_StackPos, AString & a_String)\n{\n\tsize_t len;\n\tconst char * s = lua_tolstring(m_LuaState, a_StackPos, &len);\n\tif (s != nullptr)\n\t{\n\t\ta_String.assign(s, len);\n\t}\n}\n\n\n\n\n\nvoid cLuaState::LogStackValues(const char * a_Header)\n{\n\tLogStackValues(m_LuaState, a_Header);\n}\n\n\n\n\n\nvoid cLuaState::LogStackValues(lua_State * a_LuaState, const char * a_Header)\n{\n\t// Format string consisting only of %s is used to appease the compiler\n\tASSERT_LUA_STACK_BALANCE(a_LuaState, false);\n\tLOG(\"%s\", (a_Header != nullptr) ? a_Header : \"Lua C API Stack contents:\");\n\tfor (int i = lua_gettop(a_LuaState); i > 0; i--)\n\t{\n\t\tAString Value;\n\t\tint Type = lua_type(a_LuaState, i);\n\t\tswitch (Type)\n\t\t{\n\t\t\tcase LUA_TBOOLEAN: Value.assign((lua_toboolean(a_LuaState, i) != 0) ? \"true\" : \"false\"); break;\n\t\t\tcase LUA_TLIGHTUSERDATA: Value = fmt::format(FMT_STRING(\"{}\"), lua_touserdata(a_LuaState, i)); break;\n\t\t\tcase LUA_TNUMBER:        Value = fmt::format(FMT_STRING(\"{}\"), lua_tonumber(a_LuaState, i)); break;\n\t\t\tcase LUA_TSTRING:\n\t\t\t{\n\t\t\t\tsize_t len;\n\t\t\t\tconst char * txt = lua_tolstring(a_LuaState, i, &len);\n\t\t\t\tValue.assign(txt, std::min<size_t>(len, 50));  // Only log up to 50 characters of the string\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase LUA_TTABLE:         Value = fmt::format(FMT_STRING(\"{}\"), lua_topointer(a_LuaState, i)); break;\n\t\t\tcase LUA_TFUNCTION:      Value = fmt::format(FMT_STRING(\"{}\"), lua_topointer(a_LuaState, i)); break;\n\t\t\tcase LUA_TUSERDATA:\n\t\t\t{\n\t\t\t\tValue = fmt::format(FMT_STRING(\"{} ({})\"), lua_touserdata(a_LuaState, i), tolua_typename(a_LuaState, i));\n\t\t\t\t// tolua_typename pushes the string onto Lua stack, pop it off again:\n\t\t\t\tlua_pop(a_LuaState, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: break;\n\t\t}\n\t\tLOGD(\"  Idx %d: type %d (%s) %s\", i, Type, lua_typename(a_LuaState, Type), Value.c_str());\n\t}  // for i - stack idx\n}\n\n\n\n\n\ncLuaState * cLuaState::QueryCanonLuaState(void) const\n{\n\treturn cCanonLuaStates::GetCanonState(m_LuaState);\n}\n\n\n\n\n\nvoid cLuaState::LogApiCallParamFailure(const char * a_FnName, const char * a_ParamNames)\n{\n\tLOGWARNING(\"%s: Cannot read params: %s, bailing out.\", a_FnName, a_ParamNames);\n\tLogStackTrace();\n\tLogStackValues(\"Values on the stack\");\n}\n\n\n\n\n\nvoid cLuaState::TrackInDeadlockDetect(cDeadlockDetect & a_DeadlockDetect)\n{\n\ta_DeadlockDetect.TrackCriticalSection(m_CS, fmt::format(FMT_STRING(\"cLuaState {}\"), m_SubsystemName));\n}\n\n\n\n\n\nvoid cLuaState::UntrackInDeadlockDetect(cDeadlockDetect & a_DeadlockDetect)\n{\n\ta_DeadlockDetect.UntrackCriticalSection(m_CS);\n}\n\n\n\n\n\nint cLuaState::ReportFnCallErrors(lua_State * a_LuaState)\n{\n\tLOGWARNING(\"LUA: %s\", lua_tostring(a_LuaState, -1));\n\tLogStackTrace(a_LuaState, 1);\n\tBreakIntoDebugger(a_LuaState);\n\treturn 1;  // We left the error message on the stack as the return value\n}\n\n\n\n\n\nint cLuaState::BreakIntoDebugger(lua_State * a_LuaState)\n{\n\tASSERT_LUA_STACK_BALANCE(a_LuaState);\n\t// Call the BreakIntoDebugger function, if available:\n\tlua_getglobal(a_LuaState, \"BreakIntoDebugger\");\n\tif (!lua_isfunction(a_LuaState, -1))\n\t{\n\t\tLOGD(\"LUA: BreakIntoDebugger() not found / not a function\");\n\t\tlua_pop(a_LuaState, 1);\n\t\treturn 1;\n\t}\n\tlua_pushvalue(a_LuaState, -2);  // Copy the string that has been passed to us\n\tLOGD(\"Calling BreakIntoDebugger()...\");\n\tlua_call(a_LuaState, 1, 0);\n\tLOGD(\"Returned from BreakIntoDebugger().\");\n\treturn 0;\n}\n\n\n\n\n\nvoid cLuaState::TrackRef(cTrackedRef & a_Ref)\n{\n\t// Get the CanonLuaState global from Lua:\n\tauto canonState = QueryCanonLuaState();\n\tif (canonState == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: Lua state %p has invalid CanonLuaState!\", __FUNCTION__, static_cast<void *>(m_LuaState));\n\t\treturn;\n\t}\n\n\t// Add the callback:\n\tcCSLock Lock(canonState->m_CSTrackedRefs);\n\tcanonState->m_TrackedRefs.push_back(&a_Ref);\n}\n\n\n\n\n\nvoid cLuaState::UntrackRef(cTrackedRef & a_Ref)\n{\n\t// Get the CanonLuaState global from Lua:\n\tauto canonState = QueryCanonLuaState();\n\tif (canonState == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: Lua state %p has invalid CanonLuaState!\", __FUNCTION__, static_cast<void *>(m_LuaState));\n\t\treturn;\n\t}\n\n\t// Remove the callback (note that another thread may have cleared the callbacks by closing the LuaState):\n\tcCSLock Lock(canonState->m_CSTrackedRefs);\n\tauto & trackedRefs = canonState->m_TrackedRefs;\n\tfor (auto itr = trackedRefs.begin(), end = trackedRefs.end(); itr != end; ++itr)\n\t{\n\t\tif (*itr == &a_Ref)\n\t\t{\n\t\t\ttrackedRefs.erase(itr);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaState::cRef:\n\ncLuaState::cRef::cRef(void) :\n\tm_LuaState(nullptr),\n\tm_Ref(LUA_REFNIL)\n{\n}\n\n\n\n\n\ncLuaState::cRef::cRef(cLuaState & a_LuaState, int a_StackPos) :\n\tm_LuaState(nullptr),\n\tm_Ref(LUA_REFNIL)\n{\n\tRefStack(a_LuaState, a_StackPos);\n}\n\n\n\n\n\ncLuaState::cRef::cRef(cRef && a_FromRef):\n\tm_LuaState(a_FromRef.m_LuaState),\n\tm_Ref(a_FromRef.m_Ref)\n{\n\ta_FromRef.m_LuaState = nullptr;\n\ta_FromRef.m_Ref = LUA_REFNIL;\n}\n\n\n\n\n\ncLuaState::cRef::~cRef()\n{\n\tif (m_LuaState != nullptr)\n\t{\n\t\tUnRef();\n\t}\n}\n\n\n\n\n\nvoid cLuaState::cRef::RefStack(cLuaState & a_LuaState, int a_StackPos)\n{\n\tASSERT(a_LuaState.IsValid());\n\tif (m_LuaState != nullptr)\n\t{\n\t\tUnRef();\n\t}\n\tASSERT(cCanonLuaStates::GetCanonState(a_LuaState)->m_CS.IsLockedByCurrentThread());\n\tm_LuaState = a_LuaState;\n\tlua_pushvalue(a_LuaState, a_StackPos);  // Push a copy of the value at a_StackPos onto the stack\n\tm_Ref = luaL_ref(a_LuaState, LUA_REGISTRYINDEX);\n}\n\n\n\n\n\nvoid cLuaState::cRef::UnRef(void)\n{\n\tif (IsValid())\n\t{\n\t\tASSERT(cCanonLuaStates::GetCanonState(m_LuaState)->m_CS.IsLockedByCurrentThread());\n\t\tluaL_unref(m_LuaState, LUA_REGISTRYINDEX, m_Ref);\n\t}\n\tm_LuaState = nullptr;\n\tm_Ref = LUA_REFNIL;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaState.h",
    "content": "\n// LuaState.h\n\n// Declares the cLuaState class representing the wrapper over lua_State *, provides associated helper functions\n\n/*\nThe contained lua_State can be either owned or attached.\nOwned lua_State is created by calling Create() and the cLuaState automatically closes the state\nOr, lua_State can be attached by calling Attach(), the cLuaState doesn't close such a state\nIf owning a state, trying to attach a state will automatically close the previously owned state.\n\nCalling a Lua function is done internally by pushing the function using PushFunction(), then pushing the\narguments and finally executing CallFunction(). cLuaState automatically keeps track of the number of\narguments and the name of the function (for logging purposes). After the call the return values are read from\nthe stack using GetStackValue(). All of this is wrapped in a templated function overloads cLuaState::Call().\n\nReference management is provided by the cLuaState::cRef class. This is used when you need to hold a reference to\nany Lua object across several function calls. The class is RAII-like, with automatic resource management. Note\nthat the cRef object is not inherently thread-safe and is not notified when its cLuaState is closed. For those\npurposes, cTrackedRef can be used.\n\nCallbacks management is provided by the cLuaState::cCallback class. Use a GetStackValue() with cCallbackPtr\nparameter to store the callback, and then at any time you can use the cCallback's Call() templated function\nto call the callback. The callback management takes care of cLuaState being destroyed - the cCallback object\nstays valid but doesn't call into Lua code anymore, returning false for \"failure\" instead.\n*/\n\n\n\n\n#pragma once\n\nextern \"C\"\n{\n\t#include \"lua/src/lauxlib.h\"\n}\n\n#include \"../Defines.h\"\n#include \"../FunctionRef.h\"\n#include \"../Registries/CustomStatistics.h\"\n#include \"PluginManager.h\"\n#include \"LuaState_Typedefs.inc\"\n\n// fwd:\nclass cLuaServerHandle;\nclass cLuaTCPLink;\nclass cLuaUDPEndpoint;\nclass cDeadlockDetect;\n\n\n\n\n\n/** Encapsulates a Lua state and provides some syntactic sugar for common operations */\nclass cLuaState\n{\npublic:\n\n\t#ifndef NDEBUG\n\t\t/** Asserts that the Lua stack has the same amount of entries when this object is destructed, as when it was constructed.\n\t\tUsed for checking functions that should preserve Lua stack balance. */\n\t\tclass cStackBalanceCheck\n\t\t{\n\t\tpublic:\n\t\t\tcStackBalanceCheck(const char * a_FileName, int a_LineNum, lua_State * a_LuaState, bool a_ShouldLogStack = true):\n\t\t\t\tm_FileName(a_FileName),\n\t\t\t\tm_LineNum(a_LineNum),\n\t\t\t\tm_LuaState(a_LuaState),\n\t\t\t\tm_StackPos(lua_gettop(a_LuaState))\n\t\t\t{\n\t\t\t\tif (a_ShouldLogStack)\n\t\t\t\t{\n\t\t\t\t\t// DEBUG: If an unbalanced stack is reported, uncommenting the next line can help debug the imbalance\n\t\t\t\t\t// cLuaState::LogStackValues(a_LuaState, fmt::format(FMT_STRING(\"Started checking Lua stack balance, currently {} items:\"), m_StackPos).c_str());\n\t\t\t\t\t// Since LogStackValues() itself uses the balance check, we must not call it recursively\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t~cStackBalanceCheck() noexcept(false)\n\t\t\t{\n\t\t\t\tauto currStackPos = lua_gettop(m_LuaState);\n\t\t\t\tif (currStackPos != m_StackPos)\n\t\t\t\t{\n\t\t\t\t\tLOGD(\"Lua stack not balanced. Expected %d items, found %d items. Stack watching started in %s:%d\",\n\t\t\t\t\t\tm_StackPos, currStackPos,\n\t\t\t\t\t\tm_FileName.c_str(), m_LineNum\n\t\t\t\t\t);\n\t\t\t\t\tcLuaState::LogStackValues(m_LuaState);\n\t\t\t\t\tASSERT(!\"Lua stack unbalanced\");  // If this assert fires, the Lua stack is inbalanced, check the callstack / m_FileName / m_LineNum\n\t\t\t\t}\n\t\t\t}\n\n\t\tprotected:\n\t\t\tconst AString m_FileName;\n\t\t\tint m_LineNum;\n\t\t\tlua_State * m_LuaState;\n\t\t\tint m_StackPos;\n\t\t};\n\n\t\t#define STRINGIFY2(X, Y) X##Y\n\t\t#define STRINGIFY(X, Y) STRINGIFY2(X, Y)\n\t\t#define ASSERT_LUA_STACK_BALANCE(...) cStackBalanceCheck STRINGIFY(Check, __COUNTER__)(__FILE__, __LINE__, __VA_ARGS__)\n\t#else\n\t\t#define ASSERT_LUA_STACK_BALANCE(...)\n\t#endif\n\n\n\t/** Makes sure that the Lua state's stack has the same number of elements on destruction as it had on construction of this object (RAII).\n\tCan only remove elements, if there are less than expected, throws. */\n\tclass cStackBalancePopper\n\t{\n\tpublic:\n\t\tcStackBalancePopper(cLuaState & a_LuaState):\n\t\t\tm_LuaState(a_LuaState),\n\t\t\tm_Count(lua_gettop(a_LuaState))\n\t\t{\n\t\t}\n\n\t\t~cStackBalancePopper() noexcept(false)\n\t\t{\n\t\t\tauto curTop = lua_gettop(m_LuaState);\n\t\t\tif (curTop > m_Count)\n\t\t\t{\n\t\t\t\t// There are some leftover elements, adjust the stack:\n\t\t\t\tm_LuaState.LogStackValues(fmt::format(FMT_STRING(\"Re-balancing Lua stack, expected {} values, got {}:\"), m_Count, curTop).c_str());\n\t\t\t\tlua_pop(m_LuaState, curTop - m_Count);\n\t\t\t}\n\t\t\telse if (curTop < m_Count)\n\t\t\t{\n\t\t\t\t// This is an irrecoverable error, rather than letting the Lua engine crash undefinedly later on, abort now:\n\t\t\t\tLOGERROR(\"Unable to re-balance Lua stack, there are elements missing. Expected at least %d elements, got %d.\", m_Count, curTop);\n\t\t\t\tthrow std::runtime_error(fmt::format(FMT_STRING(\"Unable to re-balance Lua stack, there are elements missing. Expected at least {} elements, got {}.\"), m_Count, curTop));\n\t\t\t}\n\t\t}\n\n\tprotected:\n\t\tcLuaState & m_LuaState;\n\t\tint m_Count;\n\t};\n\n\n\t/** Provides a RAII-style locking for the LuaState.\n\tUsed mainly by the cPluginLua internals to provide the actual locking for interface operations, such as callbacks. */\n\tclass cLock\n\t{\n\tpublic:\n\t\tcLock(cLuaState & a_LuaState):\n\t\t\tm_Lock(a_LuaState.m_CS)\n\t\t{\n\t\t}\n\tprotected:\n\t\tcCSLock m_Lock;\n\t};\n\n\n\t/** Used for storing references to object in the global registry.\n\tCan be bound (contains a reference) or unbound (doesn't contain reference).\n\tThe reference can also be reset by calling RefStack(). */\n\tclass cRef\n\t{\n\tpublic:\n\t\t/** Creates an unbound reference object. */\n\t\tcRef(void);\n\n\t\t/** Creates a reference in the specified LuaState for object at the specified StackPos */\n\t\tcRef(cLuaState & a_LuaState, int a_StackPos);\n\n\t\t/** Moves the reference from the specified instance into a newly created instance.\n\t\tThe old instance is then \"!IsValid()\". */\n\t\tcRef(cRef && a_FromRef);\n\n\t\t~cRef();\n\n\t\t/** Creates a reference to Lua object at the specified stack pos, binds this object to it.\n\t\tCalls UnRef() first if previously bound to another reference. */\n\t\tvoid RefStack(cLuaState & a_LuaState, int a_StackPos);\n\n\t\t/** Removes the bound reference, resets the object to Unbound state. */\n\t\tvoid UnRef(void);\n\n\t\t/** Returns true if the reference is valid */\n\t\tbool IsValid(void) const {return (m_Ref != LUA_REFNIL); }\n\n\t\t/** Allows to use this class wherever an int (i. e. ref) is to be used */\n\t\texplicit operator int(void) const { return m_Ref; }\n\n\t\t/** Returns the Lua state associated with the value. */\n\t\tlua_State * GetLuaState(void) { return m_LuaState; }\n\n\t\t/** Creates a Lua reference to the specified object instance in the specified Lua state.\n\t\tThis is useful to make anti-GC references for objects that were created by Lua and need to stay alive longer than Lua GC would normally guarantee. */\n\t\ttemplate <typename T> void CreateFromObject(cLuaState & a_LuaState, T && a_Object)\n\t\t{\n\t\t\ta_LuaState.Push(std::forward<T>(a_Object));\n\t\t\tRefStack(a_LuaState, -1);\n\t\t\ta_LuaState.Pop();\n\t\t}\n\n\tprotected:\n\t\tlua_State * m_LuaState;\n\t\tint m_Ref;\n\n\t\t// Remove the copy-constructor:\n\t\tcRef(const cRef &) = delete;\n\t} ;\n\n\n\t/** Represents a reference to a Lua object that has a tracked lifetime -\n\t- when the Lua state to which it belongs is closed, the object is kept alive, but invalidated.\n\tIs thread-safe and unload-safe.\n\tTo receive the cTrackedRef instance from the Lua side, use RefStack() or (better) cLuaState::GetStackValue().\n\tNote that instances of this class are tracked in the canon LuaState instance, so that\n\tthey can be invalidated when the LuaState is unloaded; due to multithreading issues they can only be tracked\n\tby-ptr, which has an unfortunate effect of disabling the copy and move constructors. */\n\tclass cTrackedRef\n\t{\n\t\tfriend class ::cLuaState;\n\tpublic:\n\t\t/** Creates an unbound ref instance. */\n\t\tcTrackedRef(void);\n\n\t\t~cTrackedRef()\n\t\t{\n\t\t\tClear();\n\t\t}\n\n\t\t/** Set the contained reference to the object at the specified Lua state's stack position.\n\t\tIf another reference has been previously contained, it is Clear()-ed first. */\n\t\tbool RefStack(cLuaState & a_LuaState, int a_StackPos);\n\n\t\t/** Frees the contained reference, if any.\n\t\tUntracks the reference from its canon Lua state. */\n\t\tvoid Clear(void);\n\n\t\t/** Returns true if the contained reference is valid.\n\t\t(Note that depending on this value is not thread-safe, another thread may invalidate the ref in the meantime. It is meant for quick ASSERTs only). */\n\t\tbool IsValid(void);\n\n\t\t/** Returns true if the reference resides in the specified Lua state.\n\t\tInternally, compares the reference's canon Lua state.\n\t\t(Note that depending on this value is not thread-safe, another thread may modify the ref in the meantime. It is meant for quick ASSERTs only). */\n\t\tbool IsSameLuaState(cLuaState & a_LuaState);\n\n\tprotected:\n\t\tfriend class cLuaState;\n\n\t\t/** The mutex protecting m_Ref against multithreaded access.\n\t\tActually points to the canon Lua state's m_CriticalSection.\n\t\tIs nullptr when ref is empty (not bound). */\n\t\tstd::atomic<cCriticalSection *> m_CS;\n\n\t\t/** Reference to the Lua callback */\n\t\tcRef m_Ref;\n\n\n\t\t/** Invalidates the callback, without untracking it from the cLuaState.\n\t\tCalled only from cLuaState when closing the Lua state. */\n\t\tvoid Invalidate(void);\n\n\t\t/** Returns the internal reference.\n\t\tOnly to be used when the cLuaState's CS is held and the cLuaState is known to be valid. */\n\t\tcRef & GetRef() { return m_Ref; }\n\n\t\t/** This class cannot be copied, because it is tracked in the LuaState by-ptr.\n\t\tUse a smart pointer for a copyable object. */\n\t\tcTrackedRef(const cTrackedRef &) = delete;\n\n\t\t/** This class cannot be moved, because it is tracked in the LuaState by-ptr.\n\t\tUse a smart pointer for a copyable object. */\n\t\tcTrackedRef(cTrackedRef &&) = delete;\n\t};\n\ttypedef std::unique_ptr<cTrackedRef> cTrackedRefPtr;\n\ttypedef std::shared_ptr<cTrackedRef> cTrackedRefSharedPtr;\n\n\n\t/** Represents a stored callback to Lua that C++ code can call.\n\tIs thread-safe and unload-safe.\n\tWhen the Lua state is unloaded, the callback returns an error instead of calling into non-existent code.\n\tTo receive the callback instance from the Lua side, use RefStack() or (better) cLuaState::GetStackValue()\n\twith a cCallbackPtr. Note that instances of this class are tracked in the canon LuaState instance, so that\n\tthey can be invalidated when the LuaState is unloaded; due to multithreading issues they can only be tracked\n\tby-ptr, which has an unfortunate effect of disabling the copy and move constructors. */\n\tclass cCallback:\n\t\tpublic cTrackedRef\n\t{\n\t\tusing Super = cTrackedRef;\n\n\tpublic:\n\n\t\tcCallback(void) {}\n\n\t\t/** Calls the Lua callback, if still available.\n\t\tReturns true if callback has been called.\n\t\tReturns false if the Lua state isn't valid anymore. */\n\t\ttemplate <typename... Args>\n\t\tbool Call(Args &&... args)\n\t\t{\n\t\t\tauto cs = m_CS.load();\n\t\t\tif (cs == nullptr)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcCSLock Lock(*cs);\n\t\t\tif (!m_Ref.IsValid())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn cLuaState(m_Ref.GetLuaState()).Call(m_Ref, std::forward<Args>(args)...);\n\t\t}\n\n\t\t/** Set the contained callback to the function in the specified Lua state's stack position.\n\t\tIf a callback has been previously contained, it is unreferenced first.\n\t\tReturns true on success, false on failure (not a function at the specified stack pos). */\n\t\tbool RefStack(cLuaState & a_LuaState, int a_StackPos);\n\n\tprotected:\n\n\t\t/** This class cannot be copied, because it is tracked in the LuaState by-ptr.\n\t\tUse cCallbackPtr for a copyable object. */\n\t\tcCallback(const cCallback &) = delete;\n\n\t\t/** This class cannot be moved, because it is tracked in the LuaState by-ptr.\n\t\tUse cCallbackPtr for a copyable object. */\n\t\tcCallback(cCallback &&) = delete;\n\t};\n\ttypedef std::unique_ptr<cCallback> cCallbackPtr;\n\ttypedef std::shared_ptr<cCallback> cCallbackSharedPtr;\n\n\n\t/** Same thing as cCallback, but GetStackValue() won't fail if the callback value is nil.\n\tUsed for callbacks that are optional - they needn't be present and in such a case they won't get called. */\n\tclass cOptionalCallback:\n\t\tpublic cCallback\n\t{\n\t\tusing Super = cCallback;\n\n\tpublic:\n\n\t\tcOptionalCallback(void) {}\n\n\t\t/** Set the contained callback to the function in the specified Lua state's stack position.\n\t\tIf a callback has been previously contained, it is unreferenced first.\n\t\tReturns true on success, false on failure (not a function at the specified stack pos). */\n\t\tbool RefStack(cLuaState & a_LuaState, int a_StackPos);\n\n\tprotected:\n\n\t\t/** This class cannot be copied, because it is tracked in the LuaState by-ptr.\n\t\tUse cCallbackPtr for a copyable object. */\n\t\tcOptionalCallback(const cOptionalCallback &) = delete;\n\n\t\t/** This class cannot be moved, because it is tracked in the LuaState by-ptr.\n\t\tUse cCallbackPtr for a copyable object. */\n\t\tcOptionalCallback(cOptionalCallback &&) = delete;\n\t};\n\ttypedef std::unique_ptr<cOptionalCallback> cOptionalCallbackPtr;\n\n\n\t/** Represents a stored Lua table with callback functions that C++ code can call.\n\tIs thread-safe and unload-safe.\n\tWhen Lua state is unloaded, the CallFn() will return failure instead of calling into non-existent code.\n\tTo receive the cTableRef instance from the Lua side, use RefStack() or (better) cLuaState::GetStackValue()\n\twith a cTableRefPtr.\n\tNote that instances of this class are tracked in the canon LuaState instance, so that they can be\n\tinvalidated when the LuaState is unloaded; due to multithreading issues they can only be tracked by-ptr,\n\twhich has an unfortunate effect of disabling the copy and move constructors. */\n\tclass cTableRef:\n\t\tpublic cTrackedRef\n\t{\n\t\tusing Super = cTrackedRef;\n\n\tpublic:\n\t\tcTableRef(void) {}\n\n\t\t/** Calls the Lua function stored under the specified name in the referenced table, if still available.\n\t\tReturns true if callback has been called.\n\t\tReturns false if the Lua state isn't valid anymore, or the function doesn't exist. */\n\t\ttemplate <typename... Args>\n\t\tbool CallTableFn(const char * a_FnName, Args &&... args)\n\t\t{\n\t\t\tauto cs = m_CS.load();\n\t\t\tif (cs == nullptr)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcCSLock Lock(*cs);\n\t\t\tif (!m_Ref.IsValid())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn cLuaState(m_Ref.GetLuaState()).CallTableFn(m_Ref, a_FnName, std::forward<Args>(args)...);\n\t\t}\n\n\t\t/** Calls the Lua function stored under the specified name in the referenced table, if still available.\n\t\tA \"self\" parameter is injected in front of all the given parameters and is set to the callback table.\n\t\tReturns true if callback has been called.\n\t\tReturns false if the Lua state isn't valid anymore, or the function doesn't exist. */\n\t\ttemplate <typename... Args>\n\t\tbool CallTableFnWithSelf(const char * a_FnName, Args &&... args)\n\t\t{\n\t\t\tauto cs = m_CS.load();\n\t\t\tif (cs == nullptr)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcCSLock Lock(*cs);\n\t\t\tif (!m_Ref.IsValid())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn cLuaState(m_Ref.GetLuaState()).CallTableFn(m_Ref, a_FnName, m_Ref, std::forward<Args>(args)...);\n\t\t}\n\n\t\t/** Set the contained reference to the table in the specified Lua state's stack position.\n\t\tIf another table has been previously contained, it is unreferenced first.\n\t\tReturns true on success, false on failure (not a table at the specified stack pos). */\n\t\tbool RefStack(cLuaState & a_LuaState, int a_StackPos);\n\t};\n\ttypedef std::unique_ptr<cTableRef> cTableRefPtr;\n\n\n\t/** Represents a parameter that is optional - calling a GetStackValue() with this object will not fail if the value on the Lua stack is nil.\n\tNote that the GetStackValue() will still fail if the param is present but of a different type.\n\tThe class itself is just a marker so that the template magic will select the correct GetStackValue() overload. */\n\ttemplate <typename T>\n\tclass cOptionalParam\n\t{\n\tpublic:\n\t\texplicit cOptionalParam(T & a_Dest):\n\t\t\tm_Dest(a_Dest)\n\t\t{\n\t\t}\n\n\t\tT & GetDest(void) { return m_Dest; }\n\n\tprotected:\n\t\tT & m_Dest;\n\t};\n\n\n\t/** A dummy class that's used only to delimit function args from return values for cLuaState::Call() */\n\tclass cRet\n\t{\n\t} ;\n\tstatic const cRet Return;  // Use this constant to delimit function args from return values for cLuaState::Call()\n\n\n\t/** A dummy class that's used only to push a constant nil as a function parameter in Call(). */\n\tclass cNil\n\t{\n\t};\n\tstatic const cNil Nil;  // Use this constant to give a function a nil parameter in Call()\n\n\n\t/** A RAII class for values pushed onto the Lua stack.\n\tWill pop the value off the stack in the destructor. */\n\tclass cStackValue\n\t{\n\tpublic:\n\t\tcStackValue(void):\n\t\t\tm_LuaState(nullptr)\n\t\t{\n\t\t}\n\n\t\tcStackValue(cLuaState & a_LuaState):\n\t\t\tm_LuaState(a_LuaState)\n\t\t{\n\t\t\tm_StackLen = lua_gettop(a_LuaState);\n\t\t}\n\n\t\tcStackValue(cStackValue && a_Src):\n\t\t\tm_LuaState(nullptr),\n\t\t\tm_StackLen(-1)\n\t\t{\n\t\t\tstd::swap(m_LuaState, a_Src.m_LuaState);\n\t\t\tstd::swap(m_StackLen, a_Src.m_StackLen);\n\t\t}\n\n\t\t~cStackValue() noexcept(false)\n\t\t{\n\t\t\tif (m_LuaState != nullptr)\n\t\t\t{\n\t\t\t\tASSERT(m_StackLen == lua_gettop(m_LuaState));\n\t\t\t\tlua_pop(m_LuaState, 1);\n\t\t\t}\n\t\t}\n\n\t\tvoid Set(cLuaState & a_LuaState)\n\t\t{\n\t\t\tm_LuaState = a_LuaState;\n\t\t\tm_StackLen = lua_gettop(a_LuaState);\n\t\t}\n\n\t\tbool IsValid(void) const\n\t\t{\n\t\t\treturn (m_LuaState != nullptr);\n\t\t}\n\n\tprotected:\n\t\tlua_State * m_LuaState;\n\n\t\t/** Used for debugging, Lua state's stack size is checked against this number to make sure\n\t\tit is the same as when the value was pushed. */\n\t\tint m_StackLen;\n\n\t\t// Remove the copy-constructor:\n\t\tcStackValue(const cStackValue &) = delete;\n\t};\n\n\n\t/** Represents a table on the Lua stack.\n\tProvides easy access to the elements in the table.\n\tNote that this class doesn't have cTrackedRef's thread-safeness and unload-safeness, it is expected to be\n\tused for immediate queries in API bindings. */\n\tclass cStackTable\n\t{\n\tpublic:\n\t\tcStackTable(cLuaState & a_LuaState, int a_StackPos);\n\n\t\t/** Iterates over all array elements in the table consecutively and calls the a_ElementCallback for each.\n\t\tThe callback receives the LuaState in which the table resides, and the element's index. The LuaState has\n\t\tthe element on top of its stack. If the callback returns true, the iteration is aborted, if it returns\n\t\tfalse, the iteration continues with the next element. */\n\t\tvoid ForEachArrayElement(cFunctionRef<bool(cLuaState & a_LuaState, int a_Index)> a_ElementCallback) const;\n\n\t\t/** Iterates over all dictionary elements in the table in random order, and calls the a_ElementCallback for\n\t\teach of them.\n\t\tThe callback receives the LuaState in which the table reside. The LuaState has the element on top of its\n\t\tstack, and the element's key just below it. If the callback returns true, the iteration is aborted, if it\n\t\treturns false, the iteration continues with the next element. */\n\t\tvoid ForEachElement(cFunctionRef<bool(cLuaState & a_LuaState)> a_ElementCallback) const;\n\n\t\tcLuaState & GetLuaState(void) const { return m_LuaState; }\n\n\tprotected:\n\t\t/** The Lua state in which the table resides. */\n\t\tcLuaState & m_LuaState;\n\n\t\t/** The stack index where the table resides in the Lua state. */\n\t\tint m_StackPos;\n\t};\n\ttypedef std::unique_ptr<cStackTable> cStackTablePtr;\n\n\n\t/** Creates a new instance. The LuaState is not initialized.\n\ta_SubsystemName is used for reporting problems in the console, it is \"plugin %s\" for plugins,\n\tor \"LuaScript\" for the cLuaScript template\n\t*/\n\tcLuaState(const AString & a_SubsystemName);\n\n\t/** Creates a new instance. The a_AttachState is attached.\n\tSubsystem name is set to \"<attached>\".\n\t*/\n\texplicit cLuaState(lua_State * a_AttachState);\n\n\t~cLuaState();\n\n\t/** Allows this object to be used in the same way as a lua_State *, for example in the LuaLib functions */\n\toperator lua_State * (void) { return m_LuaState; }\n\n\t/** Creates the m_LuaState, if not created already.\n\tThis state will be automatically closed in the destructor.\n\tThe regular Lua libs are registered, but the MCS API is not registered (so that Lua can be used as\n\tlite-config as well), use RegisterAPILibs() to do that. */\n\tvoid Create(void);\n\n\t/** Registers all the API libraries that MCS provides into m_LuaState. */\n\tvoid RegisterAPILibs(void);\n\n\t/** Closes the m_LuaState, if not closed already */\n\tvoid Close(void);\n\n\t/** Attaches the specified state. Operations will be carried out on this state, but it will not be closed in the destructor */\n\tvoid Attach(lua_State * a_State);\n\n\t/** Detaches a previously attached state. */\n\tvoid Detach(void);\n\n\t/** Returns true if the m_LuaState is valid */\n\tbool IsValid(void) const { return (m_LuaState != nullptr); }\n\n\t/** Returns the name of the subsystem, as specified when the instance was created. */\n\tAString GetSubsystemName(void) const { return m_SubsystemName; }\n\n\t/** Adds the specified path to package.<a_PathVariable> */\n\tvoid AddPackagePath(const AString & a_PathVariable, const AString & a_Path);\n\n\t/** Loads the specified file\n\tReturns false and optionally logs a warning to the console if not successful (but the LuaState is kept open).\n\tm_SubsystemName is displayed in the warning log message. */\n\tbool LoadFile(const AString & a_FileName, bool a_LogWarnings = true);\n\n\t/** Loads the specified string.\n\tReturns false and optionally logs a warning to the console if not successful (but the LuaState is kept open).\n\ta_FileName is the original filename from where the string was read, and is used only for logging. It may be empty.\n\tm_SubsystemName is displayed in the warning log message. */\n\tbool LoadString(const AString & a_StringToLoad, const AString & a_FileName, bool a_LogWarnings = true);\n\n\t/** Returns true if a_FunctionName is a valid Lua function that can be called */\n\tbool HasFunction(const char * a_FunctionName);\n\n\t/** Pushes multiple arguments onto the Lua stack. */\n\ttemplate <typename Arg1, typename Arg2, typename... Args>\n\tvoid Push(Arg1 && a_Arg1, Arg2 && a_Arg2, Args &&... a_Args)\n\t{\n\t\tPush(std::forward<Arg1>(a_Arg1));\n\t\tPush(std::forward<Arg2>(a_Arg2), std::forward<Args>(a_Args)...);\n\t}\n\n\t// Push a const value onto the stack (keep alpha-sorted):\n\t// Note that these functions will make a copy of the actual value, because Lua doesn't have the concept\n\t// of \"const\", and there would be lifetime management problems if they didn't.\n\tvoid Push(const AString & a_String);\n\tvoid Push(const AStringMap & a_Dictionary);\n\tvoid Push(const AStringVector & a_Vector);\n\tvoid Push(const char * a_Value);\n\tvoid Push(const cItem & a_Item);\n\tvoid Push(const cNil & a_Nil);\n\tvoid Push(const cRef & a_Ref);\n\tvoid Push(ContiguousByteBufferView a_Data);\n\tvoid Push(const Vector3d & a_Vector);\n\tvoid Push(const Vector3i & a_Vector);\n\n\t// Push a simple value onto the stack (keep alpha-sorted):\n\tvoid Push(bool a_Value);\n\tvoid Push(cEntity * a_Entity);\n\tvoid Push(const cEntity * a_Entity);\n\tvoid Push(cLuaServerHandle * a_ServerHandle);\n\tvoid Push(cLuaTCPLink * a_TCPLink);\n\tvoid Push(cLuaUDPEndpoint * a_UDPEndpoint);\n\tvoid Push(double a_Value);\n\tvoid Push(int a_Value);\n\tvoid Push(long a_Value);\n\tvoid Push(const UInt32 a_Value);\n\tvoid Push(std::chrono::milliseconds a_time);\n\n\t/** Pops the specified number of values off the top of the Lua stack. */\n\tvoid Pop(int a_NumValuesToPop = 1);\n\n\t// GetStackValue() retrieves the value at a_StackPos, if it is a valid type. If not, a_Value is unchanged.\n\t// Returns whether value was changed\n\t// Enum values are checked for their allowed values and fail if the value is not assigned.\n\tbool GetStackValue(int a_StackPos, AString & a_Value);\n\tbool GetStackValue(int a_StackPos, AStringMap & a_Value);\n\tbool GetStackValue(int a_StackPos, AStringVector & a_Value);\n\tbool GetStackValue(int a_StackPos, bool & a_Value);\n\tbool GetStackValue(int a_StackPos, cCallback & a_Callback);\n\tbool GetStackValue(int a_StackPos, cCallbackPtr & a_Callback);\n\tbool GetStackValue(int a_StackPos, cCallbackSharedPtr & a_Callback);\n\tbool GetStackValue(int a_StackPos, cOptionalCallback & a_Callback);\n\tbool GetStackValue(int a_StackPos, cOptionalCallbackPtr & a_Callback);\n\tbool GetStackValue(int a_StackPos, cPluginManager::CommandResult & a_Result);\n\tbool GetStackValue(int a_StackPos, cRef & a_Ref);\n\tbool GetStackValue(int a_StackPos, cStackTablePtr & a_StackTable);\n\tbool GetStackValue(int a_StackPos, cTableRef & a_TableRef);\n\tbool GetStackValue(int a_StackPos, cTableRefPtr & a_TableRef);\n\tbool GetStackValue(int a_StackPos, cTrackedRef & a_Ref);\n\tbool GetStackValue(int a_StackPos, cTrackedRefPtr & a_Ref);\n\tbool GetStackValue(int a_StackPos, cTrackedRefSharedPtr & a_Ref);\n\tbool GetStackValue(int a_StackPos, ContiguousByteBuffer & a_Data);\n\tbool GetStackValue(int a_StackPos, CustomStatistic & a_Value);\n\tbool GetStackValue(int a_StackPos, double & a_Value);\n\tbool GetStackValue(int a_StackPos, eBlockFace & a_Value);\n\tbool GetStackValue(int a_StackPos, eWeather & a_Value);\n\tbool GetStackValue(int a_StackPos, float & a_ReturnedVal);\n\tbool GetStackValue(int a_StackPos, cUUID & a_Value);\n\tbool GetStackValue(int a_StackPos, std::string_view & a_Value);\n\n\t// template to catch all of the various c++ integral types without overload conflicts\n\ttemplate <class T, typename = std::enable_if_t<std::is_integral_v<T>>>\n\tbool GetStackValue(int a_StackPos, T & a_ReturnedVal)\n\t{\n\t\tif (!lua_isnumber(m_LuaState, a_StackPos))  // Also accepts strings representing a number: https://pgl.yoyo.org/luai/i/lua_isnumber\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tlua_Number Val = lua_tonumber(m_LuaState, a_StackPos);\n\t\tif (Val > std::numeric_limits<T>::max())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (Val < std::numeric_limits<T>::min())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\ta_ReturnedVal = static_cast<T>(Val);\n\t\treturn true;\n\t}\n\n\t/** Retrieves an optional value on the stack - doesn't fail if the stack contains nil instead of the value. */\n\ttemplate <typename T>\n\tbool GetStackValue(int a_StackPos, cOptionalParam<T> && a_ReturnedVal)\n\t{\n\t\tif (lua_isnoneornil(m_LuaState, a_StackPos))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn GetStackValue(a_StackPos, a_ReturnedVal.GetDest());\n\t}\n\n\t/** Retrieves any Vector3 value and coerces it into a Vector3<T>. */\n\ttemplate <typename T>\n\tbool GetStackValue(int a_StackPos, Vector3<T> & a_ReturnedVal);\n\n\t/** Pushes the named value in the table at the top of the stack.\n\ta_Name may be a path containing multiple table levels, such as \"cChatColor.Blue\".\n\tIf the value is found, it is pushed on top of the stack and the returned cStackValue is valid.\n\tIf the value is not found, the stack is unchanged and the returned cStackValue is invalid. */\n\tcStackValue WalkToValue(const AString & a_Name);\n\n\t/** Pushes the named value in the global table to the top of the stack.\n\ta_Name may be a path containing multiple table levels, such as \"cChatColor.Blue\".\n\tIf the value is found in the global table, it is pushed to the top of the stack and the returned cStackValue is valid.\n\tIf the value is not found, the stack is unchanged and the returned cStackValue is invalid. */\n\tcStackValue WalkToNamedGlobal(const AString & a_Name);\n\n\t/** Retrieves the named value in the table at the top of the Lua stack.\n\ta_Name may be a path containing multiple table levels, such as \"_G.cChatColor.Blue\".\n\tReturns true if the value was successfully retrieved, false on error. */\n\ttemplate <typename T> bool GetNamedValue(const AString & a_Name, T & a_Value)\n\t{\n\t\tauto stk = WalkToValue(a_Name);\n\t\tif (!stk.IsValid())\n\t\t{\n\t\t\t// Name not found\n\t\t\treturn false;\n\t\t}\n\t\treturn GetStackValue(-1, a_Value);\n\t}\n\n\t/** Retrieves the named global value. a_Name may be a path containing multiple table levels, such as \"_G.cChatColor.Blue\".\n\tReturns true if the value was successfully retrieved, false on error. */\n\ttemplate <typename T> bool GetNamedGlobal(const AString & a_Name, T & a_Value)\n\t{\n\t\t// Push the globals table onto the stack and make it RAII-removed:\n\t\tlua_getglobal(m_LuaState, \"_G\");\n\t\tcStackValue stk(*this);\n\n\t\t// Get the named global:\n\t\treturn GetNamedValue(a_Name, a_Value);\n\t}\n\n\t// Include the auto-generated Push and GetStackValue() functions:\n\t#include \"LuaState_Declaration.inc\"\n\n\t/** Call the specified Lua function.\n\tReturns true if call succeeded, false if there was an error.\n\tA special param of cRet & signifies the end of param list and the start of return values.\n\tExample call: Call(Fn, Param1, Param2, Param3, cLuaState::Return, Ret1, Ret2) */\n\ttemplate <typename FnT, typename... Args>\n\tbool Call(const FnT & a_Function, Args &&... args)\n\t{\n\t\tcStackBalancePopper balancer(*this);\n\t\tm_NumCurrentFunctionArgs = -1;\n\t\tif (!PushFunction(std::forward<const FnT &>(a_Function)))\n\t\t{\n\t\t\t// Pushing the function failed\n\t\t\treturn false;\n\t\t}\n\t\tauto res = PushCallPop(std::forward<Args>(args)...);\n\t\treturn res;\n\t}\n\n\t/** Retrieves a list of values from the Lua stack, starting at the specified index. */\n\ttemplate <typename Arg1, typename... Args>\n\tinline bool GetStackValues(int a_StartStackPos, Arg1 && a_Arg1, Args &&... args)\n\t{\n\t\tif (!GetStackValue(a_StartStackPos, std::forward<Arg1>(a_Arg1)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\treturn GetStackValues(a_StartStackPos + 1, std::forward<Args>(args)...);\n\t}\n\n\t/** Returns true if the specified parameters on the stack are of the specified usertable type; also logs warning if not. Used for static functions */\n\tbool CheckParamUserTable(int a_StartParam, const char * a_UserTable, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are of the specified usertype; also logs warning if not. Used for regular functions */\n\tbool CheckParamUserType(int a_StartParam, const char * a_UserType, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are tables; also logs warning if not */\n\tbool CheckParamTable(int a_StartParam, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are numbers; also logs warning if not */\n\tbool CheckParamNumber(int a_StartParam, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are bools; also logs warning if not */\n\tbool CheckParamBool(int a_StartParam, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are strings; also logs warning if not */\n\tbool CheckParamString(int a_StartParam, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are functions; also logs warning if not */\n\tbool CheckParamFunction(int a_StartParam, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are functions or nils; also logs warning if not */\n\tbool CheckParamFunctionOrNil(int a_StartParam, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are UUIDs; also logs warning if not\n\tAccepts either cUUID instances or strings that contain UUIDs */\n\tbool CheckParamUUID(int a_StartParam, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameters on the stack are Vector3s; also logs warning if not.\n\tAccepts any Vector3 type instances or tables. */\n\tbool CheckParamVector3(int a_StartParam, int a_EndParam = -1);\n\n\t/** Returns true if the specified parameter on the stack is nil (indicating an end-of-parameters) */\n\tbool CheckParamEnd(int a_Param);\n\n\t/** Returns true if the first parameter is an instance of the expected class name.\n\tReturns false and logs a special warning (\"wrong calling convention\") if not. */\n\tbool CheckParamSelf(const char * a_SelfClassName);\n\n\t/** Returns true if the first parameter is the expected class (static).\n\tReturns false and logs a special warning (\"wrong calling convention\") if not. */\n\tbool CheckParamStaticSelf(const char * a_SelfClassName);\n\n\t/** Returns true if the specified parameter is of the specified class. */\n\tbool IsParamUserType(int a_ParamIdx, const AString & a_UserType);\n\n\t/** Returns true if the specified parameter is a number. */\n\tbool IsParamNumber(int a_ParamIdx);\n\n\t/** Returns true if the specified parameter is any of the Vector3 types. */\n\tbool IsParamVector3(int a_ParamIdx);\n\n\t/** If the status is nonzero, prints the text on the top of Lua stack and returns true */\n\tbool ReportErrors(int status);\n\n\t/** If the status is nonzero, prints the text on the top of Lua stack and returns true */\n\tstatic bool ReportErrors(lua_State * a_LuaState, int status);\n\n\t/** Logs all items in the current stack trace to the server console */\n\tvoid LogStackTrace(int a_StartingDepth = 0);\n\n\t/** Logs all items in the current stack trace to the server console */\n\tstatic void LogStackTrace(lua_State * a_LuaState, int a_StartingDepth = 0);\n\n\t/** Prints the message, prefixed with the current function name, then logs the stack contents and raises a Lua error.\n\tTo be used for bindings when they detect bad parameters.\n\tDoesn't return, but a dummy return type is provided so that Lua API functions may do \"return ApiParamError(...)\". */\n\tint ApiParamError(std::string_view a_Msg);\n\n\t/** Returns the type of the item on the specified position in the stack */\n\tAString GetTypeText(int a_StackPos);\n\n\t/** Calls the function specified by its name, with arguments copied off the foreign state.\n\tIf successful, keeps the return values on the stack and returns their number.\n\tIf unsuccessful, returns a negative number and keeps the stack position unchanged. */\n\tint CallFunctionWithForeignParams(\n\t\tconst AString & a_FunctionName,\n\t\tcLuaState & a_SrcLuaState,\n\t\tint a_SrcParamStart,\n\t\tint a_SrcParamEnd\n\t);\n\n\t/** Copies objects on the stack from the specified state.\n\tOnly numbers, bools, strings, API classes and simple tables containing these (recursively) are copied.\n\ta_NumAllowedNestingLevels specifies how many table nesting levels are allowed, copying fails if there's a deeper table.\n\tIf successful, returns the number of objects copied.\n\tIf failed, returns a negative number and rewinds the stack position. */\n\tint CopyStackFrom(cLuaState & a_SrcLuaState, int a_SrcStart, int a_SrcEnd, int a_NumAllowedNestingLevels = 16);\n\n\t/** Copies a table at the specified stack index of the source Lua state to the top of this Lua state's stack.\n\ta_NumAllowedNestingLevels specifies how many table nesting levels are allowed, copying fails if there's a deeper table.\n\tReturns true if successful, false on failure.\n\tCan copy only simple values - numbers, bools, strings and recursively simple tables. */\n\tbool CopyTableFrom(cLuaState & a_SrcLuaState, int a_TableIdx, int a_NumAllowedNestingLevels);\n\n\t/** Copies a single value from the specified stack index of the source Lua state to the top of this Lua state's stack.\n\ta_NumAllowedNestingLevels specifies how many table nesting levels are allowed, copying fails if there's a deeper table.\n\tReturns true if the value was copied, false on failure. */\n\tbool CopySingleValueFrom(cLuaState & a_SrcLuaState, int a_StackIdx, int a_NumAllowedNestingLevels);\n\n\t/** Reads the value at the specified stack position as a string and sets it to a_String. */\n\tvoid ToString(int a_StackPos, AString & a_String);\n\n\t/** Logs all the elements' types on the API stack, with an optional header for the listing. */\n\tvoid LogStackValues(const char * a_Header = nullptr);\n\n\t/** Logs all the elements' types on the API stack, with an optional header for the listing. */\n\tstatic void LogStackValues(lua_State * a_LuaState, const char * a_Header = nullptr);\n\n\t/** Returns the canon Lua state (the primary cLuaState instance that was used to create, rather than attach, the lua_State structure).\n\tReturns nullptr if the canon Lua state cannot be queried. */\n\tcLuaState * QueryCanonLuaState(void) const;\n\n\t/** Outputs to log a warning about API call being unable to read its parameters from the stack,\n\tlogs the stack trace and stack values. */\n\tvoid LogApiCallParamFailure(const char * a_FnName, const char * a_ParamNames);\n\n\t/** Adds this object's CS to the DeadlockDetect's tracked CSs. */\n\tvoid TrackInDeadlockDetect(cDeadlockDetect & a_DeadlockDetect);\n\n\t/** Removes this object's CS from the DeadlockDetect's tracked CSs. */\n\tvoid UntrackInDeadlockDetect(cDeadlockDetect & a_DeadlockDetect);\n\nprotected:\n\n\tcCriticalSection m_CS;\n\n\tlua_State * m_LuaState;\n\n\t/** If true, the state is owned by this object and will be auto-Closed. False => attached state */\n\tbool m_IsOwned;\n\n\t/** The subsystem name is used for reporting errors to the console, it is either \"plugin %s\" or \"LuaScript\"\n\twhatever is given to the constructor. */\n\tAString m_SubsystemName;\n\n\t/** Name of the currently pushed function (for the Push / Call chain) */\n\tAString m_CurrentFunctionName;\n\n\t/** Number of arguments currently pushed (for the Push / Call chain) */\n\tint m_NumCurrentFunctionArgs;\n\n\t/** The tracked references.\n\tThe cLuaState will invalidate all of these when it is about to be closed.\n\tProtected against multithreaded access by m_CSTrackedRefs. */\n\tstd::vector<cTrackedRef *> m_TrackedRefs;\n\n\t/** Protects m_TrackedRefs against multithreaded access. */\n\tcCriticalSection m_CSTrackedRefs;\n\n\n\t/** Call the Lua function specified by name in the table stored as a reference.\n\tReturns true if call succeeded, false if there was an error (not a table ref, function name not found).\n\tA special param of cRet & signifies the end of param list and the start of return values.\n\tExample call: CallTableFn(TableRef, \"FnName\", Param1, Param2, Param3, cLuaState::Return, Ret1, Ret2) */\n\ttemplate <typename... Args>\n\tbool CallTableFn(const cRef & a_TableRef, const char * a_FnName, Args &&... args)\n\t{\n\t\tif (!PushFunction(a_TableRef, a_FnName))\n\t\t{\n\t\t\t// Pushing the function failed\n\t\t\treturn false;\n\t\t}\n\t\treturn PushCallPop(std::forward<Args>(args)...);\n\t}\n\n\t/** Variadic template terminator: If there's nothing more to push / pop, just call the function.\n\tNote that there are no return values either, because those are prefixed by a cRet value, so the arg list is never empty. */\n\tbool PushCallPop(void)\n\t{\n\t\treturn CallFunction(0);\n\t}\n\n\t/** Variadic template recursor: More params to push. Push them and recurse. */\n\ttemplate <typename T, typename... Args>\n\tinline bool PushCallPop(T && a_Param, Args &&... args)\n\t{\n\t\tPush(std::forward<T>(a_Param));\n\t\tm_NumCurrentFunctionArgs += 1;\n\t\treturn PushCallPop(std::forward<Args>(args)...);\n\t}\n\n\t/** Variadic template terminator: If there's nothing more to push, but return values to collect, call the function and collect the returns. */\n\ttemplate <typename... Args>\n\tbool PushCallPop(cLuaState::cRet, Args &&... args)\n\t{\n\t\t// Calculate the number of return values (number of args left):\n\t\tint NumReturns = sizeof...(args);\n\n\t\t// Call the function:\n\t\tif (!CallFunction(NumReturns))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Collect the return values:\n\t\tGetStackValues(-NumReturns, std::forward<Args>(args)...);\n\t\tlua_pop(m_LuaState, NumReturns);\n\n\t\t// All successful:\n\t\treturn true;\n\t}\n\n\t/** Variadic template terminator: If there are no more values to get, bail out.\n\tThis function is not available in the public API, because it's an error to request no values directly; only internal functions can do that.\n\tIf you get a compile error saying this function is not accessible, check your calling code, you aren't reading any stack values. */\n\tbool GetStackValues(int a_StartingStackPos)\n\t{\n\t\treturn true;\n\t}\n\n\t/** Pushes the function of the specified name onto the stack.\n\tReturns true if successful. Logs a warning on failure (incl. m_SubsystemName)\n\t*/\n\tbool PushFunction(const char * a_FunctionName);\n\n\t/** Pushes a function that has been saved as a reference.\n\tReturns true if successful. Logs a warning on failure\n\t*/\n\tbool PushFunction(const cRef & a_FnRef);\n\n\t/** Pushes a function that is stored under the specified name in a table that has been saved as a reference.\n\tReturns true if successful. */\n\tbool PushFunction(const cRef & a_TableRef, const char * a_FnName);\n\n\t/** Pushes a usertype of the specified class type onto the stack */\n\t// void PushUserType(void * a_Object, const char * a_Type);\n\n\t/**\n\tCalls the function that has been pushed onto the stack by PushFunction(),\n\twith arguments pushed by PushXXX().\n\tReturns true if successful, returns false and logs a warning on failure.\n\tPops the function params, the function itself and the error handler off the stack.\n\tIf successful, leaves a_NumReturnValues new values on Lua stack, corresponding to the return values.\n\tOn failure, leaves no new values on the Lua stack.\n\t*/\n\tbool CallFunction(int a_NumReturnValues);\n\n\t/** Used as the error reporting function for function calls */\n\tstatic int ReportFnCallErrors(lua_State * a_LuaState);\n\n\t/** Tries to break into the MobDebug debugger, if it is installed. */\n\tstatic int BreakIntoDebugger(lua_State * a_LuaState);\n\n\t/** Adds the specified reference to tracking.\n\tThe reference will be invalidated when this Lua state is about to be closed. */\n\tvoid TrackRef(cTrackedRef & a_Ref);\n\n\t/** Removes the specified reference from tracking.\n\tThe reference will no longer be invalidated when this Lua state is about to be closed. */\n\tvoid UntrackRef(cTrackedRef & a_Ref);\n};  // cLuaState\n\n// Instantiate the GetStackValue(Vector3<>) function for all Vector3 types:\nextern template bool cLuaState::GetStackValue(int a_StackPos, Vector3d & a_ReturnedVal);\nextern template bool cLuaState::GetStackValue(int a_StackPos, Vector3f & a_ReturnedVal);\nextern template bool cLuaState::GetStackValue(int a_StackPos, Vector3i & a_ReturnedVal);\n\n\n\n\n\n/** Keeps track of all create cLuaState instances.\nCan query each for the amount of currently used memory. */\nclass cLuaStateTracker\n{\npublic:\n\t/** Adds the specified Lua state to the internal list of LuaStates. */\n\tstatic void Add(cLuaState & a_LuaState);\n\n\t/** Deletes the specified Lua state from the internal list of LuaStates. */\n\tstatic void Del(cLuaState & a_LuaState);\n\n\t/** Returns the statistics for all the registered LuaStates. */\n\tstatic AString GetStats(void);\n\nprotected:\n\ttypedef cLuaState * cLuaStatePtr;\n\ttypedef std::vector<cLuaStatePtr> cLuaStatePtrs;\n\n\t/** The internal list of LuaStates.\n\tProtected against multithreaded access by m_CSLuaStates. */\n\tcLuaStatePtrs m_LuaStates;\n\n\t/** Protects m_LuaStates against multithreaded access. */\n\tcCriticalSection m_CSLuaStates;\n\n\n\t/** Returns the single instance of this class. */\n\tstatic cLuaStateTracker & Get(void);\n};\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaTCPLink.cpp",
    "content": "\n// LuaTCPLink.cpp\n\n// Implements the cLuaTCPLink class representing a Lua wrapper for the cTCPLink class and the callbacks it needs\n\n#include \"Globals.h\"\n#include \"LuaTCPLink.h\"\n#include \"LuaServerHandle.h\"\n#include \"../mbedTLS++/X509Cert.h\"\n#include \"../mbedTLS++/CryptoKey.h\"\n\n\n\n\n\ncLuaTCPLink::cLuaTCPLink(cLuaState::cTableRefPtr && a_Callbacks):\n\tm_Callbacks(std::move(a_Callbacks))\n{\n}\n\n\n\n\n\ncLuaTCPLink::cLuaTCPLink(cLuaState::cTableRefPtr && a_Callbacks, cLuaServerHandleWPtr a_ServerHandle):\n\tm_Callbacks(std::move(a_Callbacks)),\n\tm_Server(std::move(a_ServerHandle))\n{\n}\n\n\n\n\n\ncLuaTCPLink::~cLuaTCPLink()\n{\n\t// If the link is still open, close it:\n\tauto link = m_Link;\n\tif (link != nullptr)\n\t{\n\t\tlink->Close();\n\t}\n\n\tTerminated();\n}\n\n\n\n\n\nbool cLuaTCPLink::Send(const AString & a_Data)\n{\n\t// Safely grab a copy of the link:\n\tauto link = m_Link;\n\tif (link == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// Send the data:\n\treturn link->Send(a_Data);\n}\n\n\n\n\n\nAString cLuaTCPLink::GetLocalIP(void) const\n{\n\t// Safely grab a copy of the link:\n\tauto link = m_Link;\n\tif (link == nullptr)\n\t{\n\t\treturn \"\";\n\t}\n\n\t// Get the IP address:\n\treturn link->GetLocalIP();\n}\n\n\n\n\n\nUInt16 cLuaTCPLink::GetLocalPort(void) const\n{\n\t// Safely grab a copy of the link:\n\tauto link = m_Link;\n\tif (link == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the port:\n\treturn link->GetLocalPort();\n}\n\n\n\n\n\nAString cLuaTCPLink::GetRemoteIP(void) const\n{\n\t// Safely grab a copy of the link:\n\tcTCPLinkPtr link = m_Link;\n\tif (link == nullptr)\n\t{\n\t\treturn \"\";\n\t}\n\n\t// Get the IP address:\n\treturn link->GetRemoteIP();\n}\n\n\n\n\n\nUInt16 cLuaTCPLink::GetRemotePort(void) const\n{\n\t// Safely grab a copy of the link:\n\tcTCPLinkPtr link = m_Link;\n\tif (link == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the port:\n\treturn link->GetRemotePort();\n}\n\n\n\n\n\nvoid cLuaTCPLink::Shutdown(void)\n{\n\t// Safely grab a copy of the link and shut it down:\n\tcTCPLinkPtr link = m_Link;\n\tif (link != nullptr)\n\t{\n\t\tlink->Shutdown();\n\t}\n}\n\n\n\n\n\nvoid cLuaTCPLink::Close(void)\n{\n\t// If the link is still open, close it:\n\tcTCPLinkPtr link = m_Link;\n\tif (link != nullptr)\n\t{\n\t\tlink->Close();\n\t}\n\n\tTerminated();\n}\n\n\n\n\n\nAString cLuaTCPLink::StartTLSClient(\n\tconst AString & a_OwnCertData,\n\tconst AString & a_OwnPrivKeyData,\n\tconst AString & a_OwnPrivKeyPassword,\n\tconst AString & a_TrustedRootCAs\n)\n{\n\tauto link = m_Link;\n\tif (link != nullptr)\n\t{\n\t\tcX509CertPtr ownCert;\n\t\tif (!a_OwnCertData.empty())\n\t\t{\n\t\t\townCert = std::make_shared<cX509Cert>();\n\t\t\tauto res = ownCert->Parse(a_OwnCertData.data(), a_OwnCertData.size());\n\t\t\tif (res != 0)\n\t\t\t{\n\t\t\t\treturn fmt::format(FMT_STRING(\"Cannot parse client certificate: -0x{:x}\"), -res);\n\t\t\t}\n\t\t}\n\t\tcCryptoKeyPtr ownPrivKey;\n\t\tif (!a_OwnPrivKeyData.empty())\n\t\t{\n\t\t\townPrivKey = std::make_shared<cCryptoKey>();\n\t\t\tauto res = ownPrivKey->ParsePrivate(a_OwnPrivKeyData.data(), a_OwnPrivKeyData.size(), a_OwnPrivKeyPassword);\n\t\t\tif (res != 0)\n\t\t\t{\n\t\t\t\treturn fmt::format(FMT_STRING(\"Cannot parse client private key: -0x{:x}\"), -res);\n\t\t\t}\n\t\t}\n\n\t\tcX509CertPtr trustedRootCAs;\n\t\tif (!a_TrustedRootCAs.empty())\n\t\t{\n\t\t\ttrustedRootCAs = std::make_shared<cX509Cert>();\n\t\t\tauto res = trustedRootCAs->Parse(a_TrustedRootCAs.data(), a_TrustedRootCAs.size());\n\t\t\tif (res != 0)\n\t\t\t{\n\t\t\t\treturn fmt::format(\"Cannot parse trusted root CAs: {}\", res);\n\t\t\t}\n\t\t}\n\t\treturn link->StartTLSClient(ownCert, ownPrivKey, trustedRootCAs);\n\t}\n\treturn \"\";\n}\n\n\n\n\n\nAString cLuaTCPLink::StartTLSServer(\n\tconst AString & a_OwnCertData,\n\tconst AString & a_OwnPrivKeyData,\n\tconst AString & a_OwnPrivKeyPassword,\n\tconst AString & a_StartTLSData\n)\n{\n\tauto link = m_Link;\n\tif (link != nullptr)\n\t{\n\t// Create the peer cert:\n\tauto OwnCert = std::make_shared<cX509Cert>();\n\tint res = OwnCert->Parse(a_OwnCertData.data(), a_OwnCertData.size());\n\tif (res != 0)\n\t{\n\t\treturn fmt::format(FMT_STRING(\"Cannot parse server certificate: -0x{:x}\"), -res);\n\t}\n\tauto OwnPrivKey = std::make_shared<cCryptoKey>();\n\tres = OwnPrivKey->ParsePrivate(a_OwnPrivKeyData.data(), a_OwnPrivKeyData.size(), a_OwnPrivKeyPassword);\n\tif (res != 0)\n\t{\n\t\treturn fmt::format(FMT_STRING(\"Cannot parse server private key: -0x{:x}\"), -res);\n\t}\n\n\t\treturn link->StartTLSServer(OwnCert, OwnPrivKey, a_StartTLSData);\n\t}\n\treturn \"\";\n}\n\n\n\n\n\nvoid cLuaTCPLink::Terminated(void)\n{\n\t// Disable the callbacks:\n\tif (m_Callbacks->IsValid())\n\t{\n\t\tm_Callbacks->Clear();\n\t}\n\n\t// If the managing server is still alive, let it know we're terminating:\n\tauto Server = m_Server.lock();\n\tif (Server != nullptr)\n\t{\n\t\tServer->RemoveLink(this);\n\t}\n\n\t// If the link is still open, close it:\n\t{\n\t\tauto link= m_Link;\n\t\tif (link != nullptr)\n\t\t{\n\t\t\tlink->Close();\n\t\t\tm_Link.reset();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cLuaTCPLink::ReceivedCleartextData(const char * a_Data, size_t a_NumBytes)\n{\n\t// Call the callback:\n\tm_Callbacks->CallTableFn(\"OnReceivedData\", this, AString(a_Data, a_NumBytes));\n}\n\n\n\n\n\nvoid cLuaTCPLink::OnConnected(cTCPLink & a_Link)\n{\n\t// Call the callback:\n\tm_Callbacks->CallTableFn(\"OnConnected\", this);\n}\n\n\n\n\n\nvoid cLuaTCPLink::OnError(int a_ErrorCode, const AString & a_ErrorMsg)\n{\n\t// Call the callback:\n\tm_Callbacks->CallTableFn(\"OnError\", this, a_ErrorCode, a_ErrorMsg);\n\n\t// Terminate all processing on the link:\n\tTerminated();\n}\n\n\n\n\n\nvoid cLuaTCPLink::OnLinkCreated(cTCPLinkPtr a_Link)\n{\n\t// Store the cTCPLink for later use:\n\tm_Link = a_Link;\n}\n\n\n\n\n\nvoid cLuaTCPLink::OnReceivedData(const char * a_Data, size_t a_Length)\n{\n\t// Call the callback:\n\tm_Callbacks->CallTableFn(\"OnReceivedData\", this, AString(a_Data, a_Length));\n}\n\n\n\n\n\nvoid cLuaTCPLink::OnRemoteClosed(void)\n{\n\t// Call the callback:\n\tm_Callbacks->CallTableFn(\"OnRemoteClosed\", this);\n\n\t// Terminate all processing on the link:\n\tTerminated();\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaTCPLink.h",
    "content": "\n// LuaTCPLink.h\n\n// Declares the cLuaTCPLink class representing a Lua wrapper for the cTCPLink class and the callbacks it needs\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/Network.h\"\n#include \"LuaState.h\"\n\n\n\n\n\n// fwd:\nclass cLuaServerHandle;\ntypedef std::weak_ptr<cLuaServerHandle> cLuaServerHandleWPtr;\n\n\n\n\n\nclass cLuaTCPLink:\n\tpublic cNetwork::cConnectCallbacks,\n\tpublic cTCPLink::cCallbacks\n{\npublic:\n\t/** Creates a new instance of the link, wrapping the callbacks that are in the specified table. */\n\tcLuaTCPLink(cLuaState::cTableRefPtr && a_Callbacks);\n\n\t/** Creates a new instance of the link, attached to the specified plugin and wrapping the callbacks that are in the specified referenced table. */\n\tcLuaTCPLink(cLuaState::cTableRefPtr && a_Callbacks, cLuaServerHandleWPtr a_Server);\n\n\tvirtual ~cLuaTCPLink() override;\n\n\t/** Sends the data contained in the string to the remote peer.\n\tReturns true if successful, false on immediate failure (queueing the data failed or link not available). */\n\tbool Send(const AString & a_Data);\n\n\t/** Returns the IP address of the local endpoint of the connection. */\n\tAString GetLocalIP(void) const;\n\n\t/** Returns the port used by the local endpoint of the connection. */\n\tUInt16 GetLocalPort(void) const;\n\n\t/** Returns the IP address of the remote endpoint of the connection. */\n\tAString GetRemoteIP(void) const;\n\n\t/** Returns the port used by the remote endpoint of the connection. */\n\tUInt16 GetRemotePort(void) const;\n\n\t/** Closes the link gracefully.\n\tThe link will send any queued outgoing data, then it will send the FIN packet.\n\tThe link will still receive incoming data from remote until the remote closes the connection. */\n\tvoid Shutdown(void);\n\n\t/** Drops the connection without any more processing.\n\tSends the RST packet, queued outgoing and incoming data is lost. */\n\tvoid Close(void);\n\n\t/** Starts a TLS handshake as a client connection.\n\tIf a client certificate should be used for the connection, set the certificate into a_OwnCertData and\n\tits corresponding private key to a_OwnPrivKeyData. If both are empty, no client cert is presented.\n\ta_OwnPrivKeyPassword is the password to be used for decoding PrivKey, empty if not passworded.\n\ta_TrustedRootCAs is a \\n-delimited concatenation of trusted root CAs' certificates in PEM format\n\tReturns empty string on success, non-empty error description on failure. */\n\tAString StartTLSClient(\n\t\tconst AString & a_OwnCertData,\n\t\tconst AString & a_OwnPrivKeyData,\n\t\tconst AString & a_OwnPrivKeyPassword,\n\t\tconst AString & a_TrustedRootCAs\n\t);\n\n\t/** Starts a TLS handshake as a server connection.\n\tSet the server certificate into a_CertData and its corresponding private key to a_OwnPrivKeyData.\n\ta_OwnPrivKeyPassword is the password to be used for decoding PrivKey, empty if not passworded.\n\ta_StartTLSData is any data that should be pushed into the TLS before reading more data from the remote.\n\tThis is used mainly for protocols starting TLS in the middle of communication, when the TLS start command\n\tcan be received together with the TLS Client Hello message in one OnReceivedData() call, to re-queue the\n\tClient Hello message into the TLS handshake buffer.\n\tReturns empty string on success, non-empty error description on failure. */\n\tAString StartTLSServer(\n\t\tconst AString & a_OwnCertData,\n\t\tconst AString & a_OwnPrivKeyData,\n\t\tconst AString & a_OwnPrivKeyPassword,\n\t\tconst AString & a_StartTLSData\n\t);\n\nprotected:\n\n\t/** The Lua table that holds the callbacks to be invoked. */\n\tcLuaState::cTableRefPtr m_Callbacks;\n\n\t/** The underlying link representing the connection.\n\tMay be nullptr. */\n\tcTCPLinkPtr m_Link;\n\n\t/** The server that is responsible for this link, if any. */\n\tcLuaServerHandleWPtr m_Server;\n\n\t/** Common code called when the link is considered as terminated.\n\tReleases m_Link, m_Callbacks and this from m_Server, each when applicable. */\n\tvoid Terminated(void);\n\n\t/** Called by the SSL context when there's incoming data available in the cleartext.\n\tReports the data via the Lua callback function. */\n\tvoid ReceivedCleartextData(const char * a_Data, size_t a_NumBytes);\n\n\t// cNetwork::cConnectCallbacks overrides:\n\tvirtual void OnConnected(cTCPLink & a_Link) override;\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;\n\n\t// cTCPLink::cCallbacks overrides:\n\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) override;\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Length) override;\n\tvirtual void OnRemoteClosed(void) override;\n\t// The OnError() callback is shared with cNetwork::cConnectCallbacks\n};\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaUDPEndpoint.cpp",
    "content": "\n// LuaUDPEndpoint.cpp\n\n// Implements the cLuaUDPEndpoint class representing a Lua wrapper for the cUDPEndpoint class and the callbacks it needs\n\n#include \"Globals.h\"\n#include \"LuaUDPEndpoint.h\"\n\n\n\n\n\ncLuaUDPEndpoint::cLuaUDPEndpoint(cLuaState::cTableRefPtr && a_Callbacks):\n\tm_Callbacks(std::move(a_Callbacks))\n{\n}\n\n\n\n\n\ncLuaUDPEndpoint::~cLuaUDPEndpoint()\n{\n\t// If the endpoint is still open, close it:\n\tauto endpoint = m_Endpoint;\n\tif (endpoint != nullptr)\n\t{\n\t\tendpoint->Close();\n\t}\n\n\tTerminated();\n}\n\n\n\n\n\nbool cLuaUDPEndpoint::Open(UInt16 a_Port, cLuaUDPEndpointPtr a_Self)\n{\n\tASSERT(m_Self == nullptr);  // Must not be opened yet\n\tASSERT(m_Endpoint == nullptr);\n\n\tm_Self = std::move(a_Self);\n\tm_Endpoint = cNetwork::CreateUDPEndpoint(a_Port, *this);\n\treturn m_Endpoint->IsOpen();\n}\n\n\n\n\n\nbool cLuaUDPEndpoint::Send(const AString & a_Data, const AString & a_RemotePeer, UInt16 a_RemotePort)\n{\n\t// Safely grab a copy of the endpoint:\n\tauto endpoint = m_Endpoint;\n\tif (endpoint == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// Send the data:\n\treturn endpoint->Send(a_Data, a_RemotePeer, a_RemotePort);\n}\n\n\n\n\n\nUInt16 cLuaUDPEndpoint::GetPort(void) const\n{\n\t// Safely grab a copy of the endpoint:\n\tauto endpoint = m_Endpoint;\n\tif (endpoint == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the port:\n\treturn endpoint->GetPort();\n}\n\n\n\n\n\nbool cLuaUDPEndpoint::IsOpen(void) const\n{\n\t// Safely grab a copy of the endpoint:\n\tauto endpoint = m_Endpoint;\n\tif (endpoint == nullptr)\n\t{\n\t\t// No endpoint means that we're not open\n\t\treturn false;\n\t}\n\n\t// Get the state:\n\treturn endpoint->IsOpen();\n}\n\n\n\n\n\nvoid cLuaUDPEndpoint::Close(void)\n{\n\t// If the endpoint is still open, close it:\n\tauto endpoint = m_Endpoint;\n\tif (endpoint != nullptr)\n\t{\n\t\tendpoint->Close();\n\t\tm_Endpoint.reset();\n\t}\n\n\tTerminated();\n}\n\n\n\n\n\nvoid cLuaUDPEndpoint::EnableBroadcasts(void)\n{\n\t// Safely grab a copy of the endpoint:\n\tauto endpoint = m_Endpoint;\n\tif (endpoint != nullptr)\n\t{\n\t\tendpoint->EnableBroadcasts();\n\t}\n}\n\n\n\n\n\nvoid cLuaUDPEndpoint::Release(void)\n{\n\t// Close the endpoint, if not already closed:\n\tClose();\n\n\t// Allow self to deallocate:\n\tm_Self.reset();\n}\n\n\n\n\n\nvoid cLuaUDPEndpoint::Terminated(void)\n{\n\t// Disable the callbacks:\n\tm_Callbacks.reset();\n\n\t// If the endpoint is still open, close it:\n\t{\n\t\tauto endpoint = m_Endpoint;\n\t\tif (endpoint != nullptr)\n\t\t{\n\t\t\tendpoint->Close();\n\t\t\tm_Endpoint.reset();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cLuaUDPEndpoint::OnReceivedData(const char * a_Data, size_t a_NumBytes, const AString & a_RemotePeer, UInt16 a_RemotePort)\n{\n\tm_Callbacks->CallTableFn(\"OnReceivedData\", this, AString(a_Data, a_NumBytes), a_RemotePeer, a_RemotePort);\n}\n\n\n\n\n\nvoid cLuaUDPEndpoint::OnError(int a_ErrorCode, const AString & a_ErrorMsg)\n{\n\t// Notify the plugin:\n\tm_Callbacks->CallTableFn(\"OnError\", a_ErrorCode, a_ErrorMsg);\n\n\t// Terminate all processing on the endpoint:\n\tTerminated();\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaUDPEndpoint.h",
    "content": "\n// LuaUDPEndpoint.h\n\n// Declares the cLuaUDPEndpoint class representing a Lua wrapper for the cUDPEndpoint class and the callbacks it needs\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/Network.h\"\n#include \"LuaState.h\"\n\n\n\n\n\n// fwd:\nclass cLuaUDPEndpoint;\ntypedef std::shared_ptr<cLuaUDPEndpoint> cLuaUDPEndpointPtr;\n\n\n\n\n\nclass cLuaUDPEndpoint:\n\tpublic cUDPEndpoint::cCallbacks\n{\npublic:\n\t/** Creates a new instance of the endpoint, wrapping the callbacks that are in the specified table. */\n\tcLuaUDPEndpoint(cLuaState::cTableRefPtr && a_Callbacks);\n\n\tvirtual ~cLuaUDPEndpoint() override;\n\n\t/** Opens the endpoint so that it starts listening for incoming data on the specified port.\n\ta_Self is the shared pointer to self that the object keeps to keep itself alive for as long as it needs (for Lua). */\n\tbool Open(UInt16 a_Port, cLuaUDPEndpointPtr a_Self);\n\n\t/** Sends the data contained in the string to the specified remote peer.\n\tReturns true if successful, false on immediate failure (queueing the data failed etc.) */\n\tbool Send(const AString & a_Data, const AString & a_RemotePeer, UInt16 a_RemotePort);\n\n\t/** Returns the port on which endpoint is listening for incoming data. */\n\tUInt16 GetPort(void) const;\n\n\t/** Returns true if the endpoint is open for incoming data. */\n\tbool IsOpen(void) const;\n\n\t/** Closes the UDP listener. */\n\tvoid Close(void);\n\n\t/** Enables outgoing broadcasts to be made using this endpoint. */\n\tvoid EnableBroadcasts(void);\n\n\t/** Called when Lua garbage-collects the object.\n\tReleases the internal SharedPtr to self, so that the instance may be deallocated. */\n\tvoid Release(void);\n\nprotected:\n\t/** The Lua table that holds the callbacks to be invoked. */\n\tcLuaState::cTableRefPtr m_Callbacks;\n\n\t/** SharedPtr to self, so that the object can keep itself alive for as long as it needs (for Lua). */\n\tcLuaUDPEndpointPtr m_Self;\n\n\t/** The underlying network endpoint.\n\tMay be nullptr. */\n\tcUDPEndpointPtr m_Endpoint;\n\n\n\t/** Common code called when the endpoint is considered as terminated.\n\tReleases m_Endpoint and m_Callbacks, each when applicable. */\n\tvoid Terminated(void);\n\n\t// cUDPEndpoint::cCallbacks overrides:\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Size, const AString & a_RemotePeer, UInt16 a_RemotePort) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaWindow.cpp",
    "content": "// LuaWindow.cpp\n\n// Implements the cLuaWindow class representing a virtual window that plugins may create and open for the player\n\n#include \"Globals.h\"\n#include \"LuaWindow.h\"\n#include \"../Entities/Player.h\"\n#include \"../UI/SlotArea.h\"\n#include \"PluginLua.h\"\nextern \"C\"\n{\n\t#include \"lua/src/lauxlib.h\"  // Needed for LUA_REFNIL\n}\n#include \"../Root.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLuaWindow:\n\ncLuaWindow::cLuaWindow(cLuaState & a_LuaState, cWindow::WindowType a_WindowType, int a_SlotsX, int a_SlotsY, const AString & a_Title) :\n\tSuper(a_WindowType, a_Title),\n\tm_Contents(a_SlotsX, a_SlotsY),\n\tm_LuaState(a_LuaState.QueryCanonLuaState())\n{\n\tASSERT(m_LuaState != nullptr);  // We must have a valid Lua state; this assert fails only if there was no Canon Lua state\n\n\tm_Contents.AddListener(*this);\n\tm_SlotAreas.push_back(new cSlotAreaItemGrid(m_Contents, *this));\n\n\t// If appropriate, add an Armor slot area:\n\tswitch (a_WindowType)\n\t{\n\t\tcase cWindow::wtInventory:\n\t\tcase cWindow::wtWorkbench:\n\t\t{\n\t\t\tm_SlotAreas.push_back(new cSlotAreaArmor(*this));\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\ncLuaWindow::~cLuaWindow()\n{\n\tm_Contents.RemoveListener(*this);\n\n\t// Close open lua window from players, to avoid dangling pointers\n\tcRoot::Get()->ForEachPlayer([this](cPlayer & a_Player)\n\t\t{\n\t\t\tif (a_Player.GetWindow() == this)\n\t\t\t{\n\t\t\t\ta_Player.CloseWindow(false);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t);\n\n\t// Must delete slot areas now, because they are referencing this->m_Contents and would try to access it in cWindow's\n\t// destructor, when the member is already gone.\n\tfor (cSlotAreas::iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t{\n\t\tdelete *itr;\n\t}\n\tm_SlotAreas.clear();\n\n\tASSERT(m_OpenedBy.empty());\n}\n\n\n\n\n\nvoid cLuaWindow::SetOnClicked(cLuaState::cCallbackPtr && a_OnClicked)\n{\n\t// Only one Lua state can be a cLuaWindow object callback:\n\tASSERT(a_OnClicked->IsSameLuaState(*m_LuaState));\n\n\t// Store the new reference, releasing the old one if appropriate:\n\tm_OnClicked = std::move(a_OnClicked);\n}\n\n\n\n\n\nvoid cLuaWindow::SetOnClosing(cLuaState::cCallbackPtr && a_OnClosing)\n{\n\t// Only one Lua state can be a cLuaWindow object callback:\n\tASSERT(a_OnClosing->IsSameLuaState(*m_LuaState));\n\n\t// Store the new reference, releasing the old one if appropriate:\n\tm_OnClosing = std::move(a_OnClosing);\n}\n\n\n\n\n\nvoid cLuaWindow::SetOnSlotChanged(cLuaState::cCallbackPtr && a_OnSlotChanged)\n{\n\t// Only one Lua state can be a cLuaWindow object callback:\n\tASSERT(a_OnSlotChanged->IsSameLuaState(*m_LuaState));\n\n\t// Store the new reference, releasing the old one if appropriate:\n\tm_OnSlotChanged = std::move(a_OnSlotChanged);\n}\n\n\n\n\n\nvoid cLuaWindow::OpenedByPlayer(cPlayer & a_Player)\n{\n\t// If the first player is opening the window, create a Lua Reference to the window object so that Lua will not GC it until the last player closes the window:\n\tif (m_PlayerCount == 0)\n\t{\n\t\tm_LuaRef.CreateFromObject(*m_LuaState, this);\n\t}\n\n\t++m_PlayerCount;\n\tSuper::OpenedByPlayer(a_Player);\n}\n\n\n\n\n\nbool cLuaWindow::ClosedByPlayer(cPlayer & a_Player, bool a_CanRefuse)\n{\n\t// First notify the plugin through the registered callback:\n\tif (m_OnClosing != nullptr)\n\t{\n\t\tbool res;\n\t\tif (\n\t\t\tm_OnClosing->Call(this, &a_Player, a_CanRefuse, cLuaState::Return, res) &&  // The callback succeeded\n\t\t\tres                                                                         // The callback says not to close the window\n\t\t)\n\t\t{\n\t\t\t// The callback disagrees (the higher levels check the CanRefuse flag compliance)\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// If the last player has closed the window, release the Lua reference, so that Lua may GC the object:\n\t--m_PlayerCount;\n\tif (m_PlayerCount == 0)\n\t{\n\t\tm_LuaRef.UnRef();\n\t}\n\n\treturn Super::ClosedByPlayer(a_Player, a_CanRefuse);\n}\n\n\n\n\n\nvoid cLuaWindow::Destroy(void)\n{\n\tSuper::Destroy();\n\n\t// Lua will take care of this object, it will garbage-collect it, so we must not delete it!\n\tm_IsDestroyed = false;\n}\n\n\n\n\n\nvoid cLuaWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas Areas;\n\tfor (auto && Area : m_SlotAreas)\n\t{\n\t\tif (Area != a_ClickedArea)\n\t\t{\n\t\t\tAreas.push_back(Area);\n\t\t}\n\t}\n\n\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, Areas, a_ShouldApply, false);\n}\n\n\n\n\n\nvoid cLuaWindow::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)\n{\n\tASSERT(a_ItemGrid == &m_Contents);\n\n\t// If an OnSlotChanged callback has been registered, call it:\n\tif (m_OnSlotChanged != nullptr)\n\t{\n\t\tm_OnSlotChanged->Call(this, a_SlotNum);\n\t}\n}\n\n\n\n\n\nvoid cLuaWindow::Clicked(cPlayer & a_Player, int a_WindowID, short a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tif (m_OnClicked != nullptr)\n\t{\n\t\t// Plugin can stop a click\n\t\tbool res;\n\t\tif (m_OnClicked->Call(this, &a_Player, a_SlotNum, a_ClickAction, a_ClickedItem, cLuaState::Return, res) && res)\n\t\t{\n\t\t\t// Tell the client the actual state of the window\n\t\t\ta_Player.GetClientHandle()->SendInventorySlot(-1, -1, a_Player.GetDraggingItem());\n\t\t\tBroadcastWholeWindow();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tcWindow::Clicked(a_Player, a_WindowID, a_SlotNum, a_ClickAction, a_ClickedItem);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/LuaWindow.h",
    "content": "\n// LuaWindow.h\n\n// Declares the cLuaWindow class representing a virtual window that plugins may create and open for the player\n\n\n\n\n\n#pragma once\n\n#include \"LuaState.h\"\n#include \"../UI/Window.h\"\n#include \"../ItemGrid.h\"\n\n\nclass cPlayer;\ntypedef cFunctionRef<bool(cPlayer &)> cPlayerListCallback;\n\n\n/** A window that has been created by a Lua plugin and is handled entirely by that plugin\nThis object needs extra care with its lifetime management:\n- It is created by Lua, so Lua expects to garbage-collect it later\n- Normal cWindow objects are deleted in their ClosedByPlayer() function if the last player closes them\n\tTo overcome this, this object overloads the Destroy functions, which doesn't let the ClosedByPlayer()\n\tdelete the window, but rather leaves it dangling, with only Lua having the reference to it.\n- Lua could GC the window while a player is still using it\n\tThe object creates a Lua reference to itself when opened by a player and\n\tremoves the reference when the last player closes the window.\n*/\n// tolua_begin\nclass cLuaWindow :\n\tpublic cWindow\n\t// tolua_end\n\t, public cItemGrid::cListener\n{  // tolua_export\n\tusing Super = cWindow;\n\npublic:\n\t/** Create a window of the specified type, with a slot grid of a_SlotsX * a_SlotsY size.\n\tExported in ManualBindings.cpp */\n\tcLuaWindow(cLuaState & a_LuaState, cWindow::WindowType a_WindowType, int a_SlotsX, int a_SlotsY, const AString & a_Title);\n\n\t// tolua_begin\n\tvirtual ~cLuaWindow() override;\n\n\t/** Returns the internal representation of the contents that are manipulated by Lua */\n\tcItemGrid & GetContents(void) { return m_Contents; }\n\n\t// tolua_end\n\n\t/** Sets the Lua callback to call when the player clicks on the window.\n\tThe window can stop the click from propogating. */\n\tvoid SetOnClicked(cLuaState::cCallbackPtr && a_OnClicked);\n\n\t/** Sets the Lua callback function to call when the window is about to close */\n\tvoid SetOnClosing(cLuaState::cCallbackPtr && a_OnClosing);\n\n\t/** Sets the Lua callback function to call when a slot is changed */\n\tvoid SetOnSlotChanged(cLuaState::cCallbackPtr && a_OnSlotChanged);\n\nprotected:\n\n\t/** Contents of the non-inventory part */\n\tcItemGrid m_Contents;\n\n\t/** The canon Lua state that has opened the window and owns the m_LuaRef */\n\tcLuaState * m_LuaState;\n\n\t/** The Lua callback to call when the player clicked on a slot */\n\tcLuaState::cCallbackPtr m_OnClicked;\n\n\t/** The Lua callback to call when the window is closing for any player */\n\tcLuaState::cCallbackPtr m_OnClosing;\n\n\t/** The Lua callback to call when a slot has changed */\n\tcLuaState::cCallbackPtr m_OnSlotChanged;\n\n\t/** Number of players that are currently using the window.\n\tUsed to manager the m_LuaRef lifetime. */\n\tstd::atomic<int> m_PlayerCount;\n\n\t/** Reference to self, to keep Lua from GCing the object while a player is still using it.\n\tCreated when the first player opens the window, destroyed when the last player closes the window. */\n\tcLuaState::cRef m_LuaRef;\n\n\n\t// cWindow overrides:\n\tvirtual void OpenedByPlayer(cPlayer & a_Player) override;\n\tvirtual void Clicked(\n\t\tcPlayer & a_Player, int a_WindowID,\n\t\tshort a_SlotNum, eClickAction a_ClickAction,\n\t\tconst cItem & a_ClickedItem\n\t) override;\n\tvirtual bool ClosedByPlayer(cPlayer & a_Player, bool a_CanRefuse) override;\n\tvirtual void Destroy(void) override;\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;\n} ;  // tolua_export\n\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/ManualBindings.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ManualBindings.h\"\n#undef TOLUA_TEMPLATE_BIND\n#include <sstream>\n#include <iomanip>\n#include \"tolua++/include/tolua++.h\"\n#include \"mbedtls/md5.h\"\n#include \"mbedtls/sha1.h\"\n#include \"PluginLua.h\"\n#include \"PluginManager.h\"\n#include \"LuaWindow.h\"\n#include \"../BlockArea.h\"\n#include \"../BlockEntities/BeaconEntity.h\"\n#include \"../BlockEntities/BrewingstandEntity.h\"\n#include \"../BlockEntities/ChestEntity.h\"\n#include \"../BlockEntities/CommandBlockEntity.h\"\n#include \"../BlockEntities/DispenserEntity.h\"\n#include \"../BlockEntities/DropperEntity.h\"\n#include \"../BlockEntities/FurnaceEntity.h\"\n#include \"../BlockEntities/HopperEntity.h\"\n#include \"../BlockEntities/NoteEntity.h\"\n#include \"../BlockEntities/MobHeadEntity.h\"\n#include \"../BlockEntities/FlowerPotEntity.h\"\n#include \"../BoundingBox.h\"\n#include \"BuildInfo.h\"\n#include \"../ClientHandle.h\"\n#include \"../CommandOutput.h\"\n#include \"../CompositeChat.h\"\n#include \"../Entities/Player.h\"\n#include \"../Generating/ChunkDesc.h\"\n#include \"../HTTP/UrlParser.h\"\n#include \"../Item.h\"\n#include \"../LineBlockTracer.h\"\n#include \"../Server.h\"\n#include \"../Root.h\"\n#include \"../StringCompression.h\"\n#include \"../WebAdmin.h\"\n#include \"../World.h\"\n\n\n\n\n\n// Hotpatching the Macro to prevent a Clang Warning (0 for pointer used)\n#undef  lua_tostring\n#define lua_tostring(L, i) lua_tolstring(L, (i), nullptr)\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// LuaCommandHandler:\n\n/** Defines a bridge between cPluginManager::cCommandHandler and cLuaState::cCallback. */\nclass LuaCommandHandler:\n\tpublic cPluginManager::cCommandHandler\n{\npublic:\n\tLuaCommandHandler(cLuaState::cCallbackPtr && a_Callback):\n\t\tm_Callback(std::move(a_Callback))\n\t{\n\t}\n\n\tvirtual bool ExecuteCommand(\n\t\tconst AStringVector & a_Split,\n\t\tcPlayer * a_Player,\n\t\tconst AString & a_Command,\n\t\tcCommandOutputCallback * a_Output\n\t) override\n\t{\n\t\tbool res = false;\n\t\tAString s;\n\t\tif (!m_Callback->Call(a_Split, a_Player, a_Command, cLuaState::Return, res, s))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (res && (a_Output != nullptr) && !s.empty())\n\t\t{\n\t\t\ta_Output->Out(s);\n\t\t}\n\t\treturn res;\n\t}\n\nprotected:\n\tcLuaState::cCallbackPtr m_Callback;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cManualBindings:\n\n// Better error reporting for Lua\nint cManualBindings::tolua_do_error(lua_State * L, const char * a_pMsg, tolua_Error * a_pToLuaError)\n{\n\t// Retrieve current function name\n\tlua_Debug entry;\n\tVERIFY(lua_getstack(L, 0, &entry));\n\tVERIFY(lua_getinfo(L, \"n\", &entry));\n\n\t// Insert function name into error msg\n\tAString msg(a_pMsg);\n\tReplaceString(msg, \"#funcname#\", entry.name?entry.name:\"?\");\n\n\t// Send the error to Lua\n\ttolua_error(L, msg.c_str(), a_pToLuaError);\n\treturn 0;\n}\n\n\n\n\n\nint cManualBindings::vlua_do_error(lua_State * L, const char * a_pFormat, fmt::printf_args a_ArgList)\n{\n\t// Retrieve current function name\n\tlua_Debug entry;\n\tVERIFY(lua_getstack(L, 0, &entry));\n\tVERIFY(lua_getinfo(L, \"n\", &entry));\n\n\t// Insert function name into error msg\n\tAString msg(a_pFormat);\n\tReplaceString(msg, \"#funcname#\", (entry.name != nullptr) ? entry.name : \"?\");\n\n\t// Copied from luaL_error and modified\n\tluaL_where(L, 1);\n\tauto Msg = fmt::vsprintf(msg, a_ArgList);\n\tlua_pushlstring(L, Msg.data(), Msg.size());\n\tlua_concat(L, 2);\n\treturn lua_error(L);\n}\n\n\n\n\n\n// Lua bound functions with special return types\nstatic int tolua_Clamp(lua_State * tolua_S)\n{\n\tcLuaState LuaState(tolua_S);\n\tint NumArgs = lua_gettop(LuaState);\n\tif (NumArgs != 3)\n\t{\n\t\treturn cManualBindings::lua_do_error(LuaState, \"Error in function call '#funcname#': Requires 3 arguments, got %i\", NumArgs);\n\t}\n\n\tif (!lua_isnumber(LuaState, 1) || !lua_isnumber(LuaState, 2) || !lua_isnumber(LuaState, 3))\n\t{\n\t\treturn cManualBindings::lua_do_error(LuaState, \"Error in function call '#funcname#': Expected a number for parameters #1, #2 and #3\");\n\t}\n\n\tlua_Number Number = tolua_tonumber(LuaState, 1, 0);\n\tlua_Number Min = tolua_tonumber(LuaState, 2, 0);\n\tlua_Number Max = tolua_tonumber(LuaState, 3, 0);\n\n\tlua_Number Result = Clamp(Number, Min, Max);\n\tLuaState.Push(Result);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_CompressStringZLIB(lua_State * tolua_S)\n{\n\tcLuaState S(tolua_S);\n\tif (\n\t\t!S.CheckParamString(1) ||\n\t\t(\n\t\t\t!S.CheckParamNumber(2) &&\n\t\t\t!S.CheckParamEnd(2)\n\t\t)\n\t)\n\t{\n\t\tcLuaState::LogStackTrace(tolua_S);\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString ToCompress;\n\tint CompressionLevel = 5;\n\tS.GetStackValues(1, ToCompress, CompressionLevel);\n\n\t// Compress the string:\n\tS.Push(Compression::Compressor(CompressionLevel).CompressZLib(ToCompress.data(), ToCompress.size()).GetView());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_UncompressStringZLIB(lua_State * tolua_S)\n{\n\tcLuaState S(tolua_S);\n\tif (\n\t\t!S.CheckParamString(1) ||\n\t\t!S.CheckParamNumber(2)\n\t)\n\t{\n\t\tcLuaState::LogStackTrace(tolua_S);\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tContiguousByteBuffer ToUncompress;\n\tsize_t UncompressedSize = 0;\n\tS.GetStackValues(1, ToUncompress, UncompressedSize);\n\n\ttry\n\t{\n\t\t// Decompress the string:\n\t\tS.Push(Compression::Extractor().ExtractZLib(ToUncompress, UncompressedSize).GetView());\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(Oops.what());\n\t\tcLuaState::LogStackTrace(tolua_S);\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_CompressStringGZIP(lua_State * tolua_S)\n{\n\tcLuaState S(tolua_S);\n\tif (\n\t\t!S.CheckParamString(1) ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\tcLuaState::LogStackTrace(tolua_S);\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tContiguousByteBuffer ToCompress;\n\tS.GetStackValues(1, ToCompress);\n\n\t// Compress the string:\n\tS.Push(Compression::Compressor().CompressGZip(ToCompress).GetView());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_InflateString(lua_State * tolua_S)\n{\n\tcLuaState S(tolua_S);\n\tif (\n\t\t!S.CheckParamString(1) ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\tcLuaState::LogStackTrace(tolua_S);\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tContiguousByteBuffer ToUncompress;\n\tS.GetStackValues(1, ToUncompress);\n\n\ttry\n\t{\n\t\t// Decompress the string:\n\t\tS.Push(Compression::Extractor().ExtractZLib(ToUncompress).GetView());\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(Oops.what());\n\t\tcLuaState::LogStackTrace(tolua_S);\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_StringSplit(lua_State * tolua_S)\n{\n\t// Get the params:\n\tcLuaState LuaState(tolua_S);\n\tAString str, delim;\n\tLuaState.GetStackValues(1, str, delim);\n\n\t// Execute and push the result:\n\tLuaState.Push(StringSplit(str, delim));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_StringSplitWithQuotes(lua_State * tolua_S)\n{\n\tcLuaState S(tolua_S);\n\n\tAString str;\n\tAString delim;\n\n\tS.GetStackValues(1, str, delim);\n\n\tAStringVector Split = StringSplitWithQuotes(str, delim);\n\tS.Push(Split);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_StringSplitAndTrim(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamString(1, 2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Process:\n\tAString str, delim;\n\tL.GetStackValues(1, str, delim);\n\tL.Push(StringSplitAndTrim(str, delim));\n\treturn 1;\n}\n\n\n\n\n\n/** Prints the message to the console, optionally formatting it with a plugin name prefix if the second param on the Lua stack is true. */\nstatic void LogFromLuaStack(lua_State * tolua_S, const std::string_view a_Message, const eLogLevel a_LogLevel)\n{\n\tif (lua_isboolean(tolua_S, 2) && (lua_toboolean(tolua_S, 2) == 1))\n\t{\n\t\tLogger::LogSimple(a_Message, a_LogLevel);\n\t}\n\telse\n\t{\n\t\tLogger::LogSimple(fmt::format(\"[{}] {}\", cManualBindings::GetLuaPlugin(tolua_S)->GetName(), a_Message), a_LogLevel);\n\t}\n}\n\n\n\n\n\n/** Retrieves a string log message from the first param on the Lua stack, optionally prefixes it with plugin name, and prints it to the console. */\nstatic void LogFromLuaStack(lua_State * tolua_S, const eLogLevel a_LogLevel)\n{\n\tcLuaState L(tolua_S);\n\n\t// If there's no param, spit out an error message instead of crashing:\n\tif (!L.CheckParamString(1))\n\t{\n\t\treturn;\n\t}\n\n\tstd::string_view Message;\n\tL.GetStackValue(1, Message);\n\tLogFromLuaStack(tolua_S, Message, a_LogLevel);\n}\n\n\n\n\n\nstatic int tolua_LOG(lua_State * tolua_S)\n{\n\t// If the param is a cCompositeChat, read the data from it:\n\ttolua_Error err;\n\tif (tolua_isusertype(tolua_S, 1, \"cCompositeChat\", false, &err))\n\t{\n\t\tconst auto CompositeChat = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\t\tif (CompositeChat != nullptr)  // isusertype returns true for nil values\n\t\t{\n\t\t\tLogFromLuaStack(tolua_S, CompositeChat->ExtractText(), cCompositeChat::MessageTypeToLogLevel(CompositeChat->GetMessageType()));\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t// Log the message:\n\tLogFromLuaStack(tolua_S, eLogLevel::Regular);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_LOGINFO(lua_State * tolua_S)\n{\n\tLogFromLuaStack(tolua_S, eLogLevel::Info);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_LOGWARN(lua_State * tolua_S)\n{\n\tLogFromLuaStack(tolua_S, eLogLevel::Warning);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_LOGERROR(lua_State * tolua_S)\n{\n\tLogFromLuaStack(tolua_S, eLogLevel::Error);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_Base64Encode(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamString(1) ||\n\t\t!L.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tAString Src;\n\tL.GetStackValue(1, Src);\n\tAString res = Base64Encode(Src);\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_Base64Decode(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamString(1) ||\n\t\t!L.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tAString Src;\n\tL.GetStackValue(1, Src);\n\tAString res = Base64Decode(Src);\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\ncPluginLua * cManualBindings::GetLuaPlugin(lua_State * L)\n{\n\t// Get the plugin identification out of LuaState:\n\tlua_getglobal(L, LUA_PLUGIN_INSTANCE_VAR_NAME);\n\tif (!lua_islightuserdata(L, -1))\n\t{\n\t\tLOGWARNING(\"%s: cannot get plugin instance, what have you done to my Lua state?\", __FUNCTION__);\n\t\tlua_pop(L, 1);\n\t\treturn nullptr;\n\t}\n\tcPluginLua * Plugin = static_cast<cPluginLua *>(const_cast<void*>(lua_topointer(L, -1)));\n\tlua_pop(L, 1);\n\n\treturn Plugin;\n}\n\n\n\n\n\nstatic int tolua_cFile_ChangeFileExt(lua_State * tolua_S)\n{\n\t// API signature:\n\t// ChangeFileExt(string, string) -> string\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2, 3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString FileName, NewExt;\n\tVERIFY(L.GetStackValues(2, FileName, NewExt));\n\tL.Push(cFile::ChangeFileExt(FileName, NewExt));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_Copy(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:Copy(string, string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2, 3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString SrcFile, DstFile;\n\tVERIFY(L.GetStackValues(2, SrcFile, DstFile));\n\tL.Push(cFile::Copy(SrcFile, DstFile));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_CreateFolder(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:CreateFolder(string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString FolderPath;\n\tVERIFY(L.GetStackValues(2, FolderPath));\n\tL.Push(cFile::CreateFolder(FolderPath));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_CreateFolderRecursive(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:CreateFolderRecursive(string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString FolderPath;\n\tVERIFY(L.GetStackValues(2, FolderPath));\n\tL.Push(cFile::CreateFolderRecursive(FolderPath));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_Delete(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:Delete(string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::Delete(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_DeleteFile(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:DeleteFile(string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::DeleteFile(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_DeleteFolder(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:DeleteFolder(string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::DeleteFolder(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_DeleteFolderContents(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:DeleteFolderContents(string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::DeleteFolderContents(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_Exists(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:Exists(string) -> bool\n\n\t// Obsolete, use IsFile() or IsFolder() instead\n\tcLuaState L(tolua_S);\n\tLOGWARNING(\"cFile:Exists() is obsolete, use cFile:IsFolder() or cFile:IsFile() instead!\");\n\tL.LogStackTrace();\n\n\t// Check params:\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::Exists(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_GetFolderContents(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:GetFolderContents(string) -> {string, string, ...}\n\n\t// Check params:\n\tcLuaState LuaState(tolua_S);\n\tif (\n\t\t!LuaState.CheckParamUserTable(1, \"cFile\") ||\n\t\t!LuaState.CheckParamString   (2) ||\n\t\t!LuaState.CheckParamEnd      (3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tAString Folder;\n\tVERIFY(LuaState.GetStackValues(2, Folder));\n\n\t// Execute and push result:\n\tLuaState.Push(cFile::GetFolderContents(Folder));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_GetLastModificationTime(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:GetLastModificationTime(string) -> number\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::GetLastModificationTime(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_GetSize(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:GetSize(string) -> number\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::GetSize(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_IsFile(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:IsFile(string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::IsFile(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_IsFolder(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:IsFolder(string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString Path;\n\tVERIFY(L.GetStackValues(2, Path));\n\tL.Push(cFile::IsFolder(Path));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_ReadWholeFile(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:ReadWholeFile(string) -> string\n\n\t// Check params:\n\tcLuaState LuaState(tolua_S);\n\tif (\n\t\t!LuaState.CheckParamUserTable(1, \"cFile\") ||\n\t\t!LuaState.CheckParamString   (2) ||\n\t\t!LuaState.CheckParamEnd      (3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tAString FileName;\n\tVERIFY(LuaState.GetStackValues(2, FileName));\n\n\t// Execute and push result:\n\tLuaState.Push(cFile::ReadWholeFile(FileName));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cFile_Rename(lua_State * tolua_S)\n{\n\t// API signature:\n\t// cFile:Rename(string, string) -> bool\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cFile\") ||\n\t\t!L.CheckParamString(2, 3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Execute:\n\tAString SrcPath, DstPath;\n\tVERIFY(L.GetStackValues(2, SrcPath, DstPath));\n\tL.Push(cFile::Rename(SrcPath, DstPath));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_GetAllPlugins(lua_State * tolua_S)\n{\n\t// API function no longer available:\n\tLOGWARNING(\"cPluginManager:GetAllPlugins() is no longer available, use cPluginManager:ForEachPlugin() instead\");\n\tcLuaState::LogStackTrace(tolua_S);\n\n\t// Return an empty table:\n\tlua_newtable(tolua_S);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_GetCurrentPlugin(lua_State * S)\n{\n\tcPluginLua * Plugin = cManualBindings::GetLuaPlugin(S);\n\tif (Plugin == nullptr)\n\t{\n\t\t// An error message has already been printed in GetLuaPlugin()\n\t\treturn 0;\n\t}\n\ttolua_pushusertype(S, Plugin, \"cPluginLua\");\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_GetPlugin(lua_State * tolua_S)\n{\n\t// API function no longer available:\n\tLOGWARNING(\"cPluginManager:GetPlugin() is no longer available. Use cPluginManager:DoWithPlugin() or cPluginManager:CallPlugin() instead.\");\n\tcLuaState::LogStackTrace(tolua_S);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_LogStackTrace(lua_State * S)\n{\n\tcLuaState::LogStackTrace(S);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_AddHook_FnRef(cPluginManager * a_PluginManager, cLuaState & S, int a_ParamIdx)\n{\n\t// Helper function for cPluginmanager:AddHook() binding\n\t// Takes care of the new case (#121): args are HOOK_TYPE and CallbackFunction\n\t// The arg types have already been checked\n\n\t// Retrieve the cPlugin from the LuaState:\n\tcPluginLua * Plugin = cManualBindings::GetLuaPlugin(S);\n\tif (Plugin == nullptr)\n\t{\n\t\t// An error message has been already printed in GetLuaPlugin()\n\t\treturn 0;\n\t}\n\n\t// Retrieve and check the hook type\n\tint HookType;\n\tif (!S.GetStackValue(a_ParamIdx, HookType))\n\t{\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Cannot read the hook type.\");\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\tif (!a_PluginManager->IsValidHookType(HookType))\n\t{\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Invalid HOOK_TYPE parameter: %d\", HookType);\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// Add the hook to the plugin\n\tcLuaState::cCallbackPtr callback;\n\tif (!S.GetStackValue(a_ParamIdx + 1, callback))\n\t{\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Cannot read the callback parameter\");\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\tif (!Plugin->AddHookCallback(HookType, std::move(callback)))\n\t{\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Cannot add hook %d, unknown error.\", HookType);\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\ta_PluginManager->AddHook(Plugin, HookType);\n\n\t// Success\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_AddHook_DefFn(cPluginManager * a_PluginManager, cLuaState & S, int a_ParamIdx)\n{\n\t// Helper function for cPluginmanager:AddHook() binding\n\t// Takes care of the old case (#121): args are cPluginLua and HOOK_TYPE\n\t// The arg types have already been checked\n\n\t// Retrieve and check the cPlugin parameter\n\tcPluginLua * Plugin = static_cast<cPluginLua *>(tolua_tousertype(S, a_ParamIdx, nullptr));\n\tif (Plugin == nullptr)\n\t{\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Invalid Plugin parameter, expected a valid cPlugin object. Hook not added\");\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\tif (Plugin != cManualBindings::GetLuaPlugin(S))\n\t{\n\t\t// The plugin parameter passed to us is not our stored plugin. Disallow this!\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Invalid Plugin parameter, cannot add hook to foreign plugins. Hook not added.\");\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// Retrieve and check the hook type\n\tint HookType = static_cast<int>(tolua_tonumber(S, a_ParamIdx + 1, -1));\n\tif (!a_PluginManager->IsValidHookType(HookType))\n\t{\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Invalid HOOK_TYPE parameter: %d\", HookType);\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// Get the standard name for the callback function:\n\tconst char * FnName = cPluginLua::GetHookFnName(HookType);\n\tif (FnName == nullptr)\n\t{\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Unknown hook type (%d). Hook not added.\", HookType);\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// Retrieve the function to call and add it to the plugin:\n\tcLuaState::cCallbackPtr callback;\n\tlua_getglobal(S, FnName);\n\tbool res = S.GetStackValue(-1, callback);\n\tlua_pop(S, 1);\n\tif (!res || !callback->IsValid())\n\t{\n\t\tLOGWARNING(\"cPluginManager.AddHook(): Function %s not found. Hook not added.\", FnName);\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\ta_PluginManager->AddHook(Plugin, HookType);\n\n\t// Success\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_AddHook(lua_State * tolua_S)\n{\n\t/*\n\tFunction signatures:\n\tcPluginManager:AddHook(HOOK_TYPE, CallbackFunction)        -- (1) recommended\n\tcPluginManager.AddHook(HOOK_TYPE, CallbackFunction)        -- (2) accepted silently (#401 deprecates this)\n\tcPluginManager:Get():AddHook(HOOK_TYPE, CallbackFunction)  -- (3) accepted silently\n\tcPluginManager:Get():AddHook(Plugin, HOOK_TYPE)            -- (4) old style (#121), accepted but complained about in the console\n\tcPluginManager.AddHook(Plugin, HOOK_TYPE)                  -- (5) old style (#121) mangled, accepted but complained about in the console\n\t*/\n\n\tcLuaState S(tolua_S);\n\tcPluginManager * PlgMgr = cPluginManager::Get();\n\n\t// If the first param is a cPluginManager instance, use it instead of the global one:\n\tint ParamIdx = 1;\n\ttolua_Error err;\n\tif (tolua_isusertype(S, 1, \"cPluginManager\", 0, &err))\n\t{\n\t\t// Style 2 or 3, retrieve the PlgMgr instance\n\t\tPlgMgr = static_cast<cPluginManager *>(tolua_tousertype(S, 1, nullptr));\n\t\tif (PlgMgr == nullptr)\n\t\t{\n\t\t\tLOGWARNING(\"Malformed plugin, use cPluginManager.AddHook(HOOK_TYPE, CallbackFunction). Fixing the call for you.\");\n\t\t\tS.LogStackTrace();\n\t\t\tPlgMgr = cPluginManager::Get();\n\t\t}\n\t\tParamIdx += 1;\n\t}\n\telse if (tolua_isusertable(S, 1, \"cPluginManager\", 0, &err))\n\t{\n\t\t// Style 1, use the global PlgMgr, but increment ParamIdx\n\t\tParamIdx++;\n\t}\n\n\tif (lua_isnumber(S, ParamIdx) && lua_isfunction(S, ParamIdx + 1))\n\t{\n\t\t// The next params are a number and a function, assume style 1 or 2\n\t\treturn tolua_cPluginManager_AddHook_FnRef(PlgMgr, S, ParamIdx);\n\t}\n\telse if (tolua_isusertype(S, ParamIdx, \"cPlugin\", 0, &err) && lua_isnumber(S, ParamIdx + 1))\n\t{\n\t\t// The next params are a cPlugin and a number, assume style 3 or 4\n\t\tLOGINFO(\"cPluginManager.AddHook(): Deprecated format used, use cPluginManager.AddHook(HOOK_TYPE, CallbackFunction) instead. Fixing the call for you.\");\n\t\tS.LogStackTrace();\n\t\treturn tolua_cPluginManager_AddHook_DefFn(PlgMgr, S, ParamIdx);\n\t}\n\n\tauto ParamDesc = fmt::format(FMT_STRING(\"{}, {}, {}\"), S.GetTypeText(1), S.GetTypeText(2), S.GetTypeText(3));\n\tLOGWARNING(\"cPluginManager:AddHook(): bad parameters. Expected HOOK_TYPE and CallbackFunction, got %s. Hook not added.\", ParamDesc);\n\tS.LogStackTrace();\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_ForEachCommand(lua_State * tolua_S)\n{\n\t/*\n\tFunction signature:\n\tcPluginManager:Get():ForEachCommand(a_CallbackFn) -> bool\n\t*/\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cPluginManager\") ||\n\t\t!L.CheckParamFunction(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(2, FnRef);\n\tif (!FnRef.IsValid())\n\t{\n\t\tLOGWARN(\"Error in function call 'ForEachCommand': Could not get function reference of parameter #1\");\n\t\treturn 0;\n\t}\n\n\t// Callback for enumerating all commands:\n\tclass cLuaCallback : public cPluginManager::cCommandEnumCallback\n\t{\n\tpublic:\n\t\tcLuaCallback(cLuaState & a_LuaState, cLuaState::cRef & a_FnRef):\n\t\t\tm_LuaState(a_LuaState),\n\t\t\tm_FnRef(a_FnRef)\n\t\t{\n\t\t}\n\n\tprivate:\n\t\tvirtual bool Command(const AString & a_Command, const cPlugin * a_Plugin, const AString & a_Permission, const AString & a_HelpString) override\n\t\t{\n\t\t\tUNUSED(a_Plugin);\n\t\t\tbool ret = false;\n\t\t\tm_LuaState.Call(m_FnRef, a_Command, a_Permission, a_HelpString, cLuaState::Return, ret);\n\t\t\treturn ret;\n\t\t}\n\t\tcLuaState & m_LuaState;\n\t\tcLuaState::cRef & m_FnRef;\n\t} Callback(L, FnRef);\n\n\t// Execute and push the returned value:\n\tL.Push(cPluginManager::Get()->ForEachCommand(Callback));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_ForEachConsoleCommand(lua_State * tolua_S)\n{\n\t/*\n\tFunction signature:\n\tcPluginManager:Get():ForEachConsoleCommand(a_CallbackFn) -> bool\n\t*/\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cPluginManager\") ||\n\t\t!L.CheckParamFunction(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(2, FnRef);\n\tif (!FnRef.IsValid())\n\t{\n\t\tLOGWARN(\"Error in function call 'ForEachConsoleCommand': Could not get function reference of parameter #1\");\n\t\treturn 0;\n\t}\n\n\t// Callback for enumerating all commands:\n\tclass cLuaCallback : public cPluginManager::cCommandEnumCallback\n\t{\n\tpublic:\n\t\tcLuaCallback(cLuaState & a_LuaState, cLuaState::cRef & a_FnRef):\n\t\t\tm_LuaState(a_LuaState),\n\t\t\tm_FnRef(a_FnRef)\n\t\t{\n\t\t}\n\n\tprivate:\n\t\tvirtual bool Command(const AString & a_Command, const cPlugin * a_Plugin, const AString & a_Permission, const AString & a_HelpString) override\n\t\t{\n\t\t\tUNUSED(a_Plugin);\n\t\t\tUNUSED(a_Permission);\n\t\t\tbool ret = false;\n\t\t\tm_LuaState.Call(m_FnRef, a_Command, a_HelpString, cLuaState::Return, ret);\n\t\t\treturn ret;\n\t\t}\n\t\tcLuaState & m_LuaState;\n\t\tcLuaState::cRef & m_FnRef;\n\t} Callback(L, FnRef);\n\n\t// Execute and push the returned value:\n\tL.Push(cPluginManager::Get()->ForEachConsoleCommand(Callback));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_BindCommand(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\t\tcPluginManager:Get():BindCommand(Command, Permission, Function, HelpString)  -- regular\n\t\tcPluginManager:BindCommand(Command, Permission, Function, HelpString)        -- static\n\t\tcPluginManager.BindCommand(Command, Permission, Function, HelpString)        -- without the \"self\" param\n\t*/\n\tcLuaState L(a_LuaState);\n\tcPluginLua * Plugin = cManualBindings::GetLuaPlugin(L);\n\tif (Plugin == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the arguments to this API call:\n\ttolua_Error tolua_err;\n\tint idx = 1;\n\tif (\n\t\ttolua_isusertype (L, 1, \"cPluginManager\", 0, &tolua_err) ||\n\t\ttolua_isusertable(L, 1, \"cPluginManager\", 0, &tolua_err)\n\t)\n\t{\n\t\tidx++;\n\t}\n\tif (\n\t\t!tolua_iscppstring(L, idx,     0, &tolua_err) ||\n\t\t!tolua_iscppstring(L, idx + 1, 0, &tolua_err) ||\n\t\t!tolua_iscppstring(L, idx + 3, 0, &tolua_err) ||\n\t\t!tolua_isnoobj    (L, idx + 4, &tolua_err)\n\t)\n\t{\n\t\ttolua_error(L, \"#ferror in function 'BindCommand'.\", &tolua_err);\n\t\treturn 0;\n\t}\n\tif (!lua_isfunction(L, idx + 2))\n\t{\n\t\tluaL_error(L, \"\\\"BindCommand\\\" function expects a function as its 3rd parameter. Command-binding aborted.\");\n\t\treturn 0;\n\t}\n\tcPluginManager * self = cPluginManager::Get();\n\tAString Command, Permission, HelpString;\n\tcLuaState::cCallbackPtr Handler;\n\tL.GetStackValues(idx, Command, Permission, Handler, HelpString);\n\tif (!Handler->IsValid())\n\t{\n\t\tLOGERROR(\"\\\"BindCommand\\\": Cannot create a function reference. Command \\\"%s\\\" not bound.\", Command.c_str());\n\t\treturn 0;\n\t}\n\n\tauto CommandHandler = std::make_shared<LuaCommandHandler>(std::move(Handler));\n\tif (!self->BindCommand(Command, Plugin, CommandHandler, Permission, HelpString))\n\t{\n\t\t// Refused. Possibly already bound. Error message has been given, display the callstack:\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\tL.Push(true);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_BindConsoleCommand(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\t\tcPluginManager:Get():BindConsoleCommand(Command, Function, HelpString)  -- regular\n\t\tcPluginManager:BindConsoleCommand(Command, Function, HelpString)        -- static\n\t\tcPluginManager.BindConsoleCommand(Command, Function, HelpString)        -- without the \"self\" param\n\t*/\n\n\t// Get the plugin identification out of LuaState:\n\tcLuaState L(a_LuaState);\n\tcPluginLua * Plugin = cManualBindings::GetLuaPlugin(L);\n\tif (Plugin == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the arguments to this API call:\n\ttolua_Error tolua_err;\n\tint idx = 1;\n\tif (\n\t\ttolua_isusertype(L, 1, \"cPluginManager\", 0, &tolua_err) ||\n\t\ttolua_isusertable(L, 1, \"cPluginManager\", 0, &tolua_err)\n\t)\n\t{\n\t\tidx++;\n\t}\n\tif (\n\t\t!tolua_iscppstring(L, idx,     0, &tolua_err) ||  // Command\n\t\t!tolua_iscppstring(L, idx + 2, 0, &tolua_err) ||  // HelpString\n\t\t!tolua_isnoobj    (L, idx + 3, &tolua_err)\n\t)\n\t{\n\t\ttolua_error(L, \"#ferror in function 'BindConsoleCommand'.\", &tolua_err);\n\t\treturn 0;\n\t}\n\tif (!lua_isfunction(L, idx + 1))\n\t{\n\t\tluaL_error(L, \"\\\"BindConsoleCommand\\\" function expects a function as its 2nd parameter. Command-binding aborted.\");\n\t\treturn 0;\n\t}\n\tcPluginManager * self = cPluginManager::Get();\n\tAString Command, HelpString;\n\tcLuaState::cCallbackPtr Handler;\n\tL.GetStackValues(idx, Command, Handler, HelpString);\n\tif (!Handler->IsValid())\n\t{\n\t\tLOGERROR(\"\\\"BindConsoleCommand\\\": Cannot create a function reference. Console command \\\"%s\\\" not bound.\", Command.c_str());\n\t\treturn 0;\n\t}\n\n\tauto CommandHandler = std::make_shared<LuaCommandHandler>(std::move(Handler));\n\tif (!self->BindConsoleCommand(Command, Plugin, CommandHandler, HelpString))\n\t{\n\t\t// Refused. Possibly already bound. Error message has been given, display the callstack:\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\tL.Push(true);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_CallPlugin(lua_State * tolua_S)\n{\n\t/*\n\tFunction signature:\n\tcPluginManager:CallPlugin(\"PluginName\", \"FunctionName\", args...)\n\t*/\n\n\t// Check the parameters:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cPluginManager\") ||\n\t\t!L.CheckParamString(2, 3))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Retrieve the plugin name and function name\n\tAString PluginName, FunctionName;\n\tL.ToString(2, PluginName);\n\tL.ToString(3, FunctionName);\n\tif (PluginName.empty() || FunctionName.empty())\n\t{\n\t\tLOGWARNING(\"cPluginManager:CallPlugin(): Invalid plugin name or function name\");\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// If requesting calling the current plugin, refuse:\n\tcPluginLua * ThisPlugin = cManualBindings::GetLuaPlugin(L);\n\tif (ThisPlugin == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\tif (ThisPlugin->GetName() == PluginName)\n\t{\n\t\tLOGWARNING(\"cPluginManager::CallPlugin(): Calling self is not implemented (why would it?)\");\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// Call the destination plugin using a plugin callback:\n\tint NumReturns = 0;\n\tauto PluginCallback = [&](cPlugin & a_Plugin)\n\t\t{\n\t\t\tif (!a_Plugin.IsLoaded())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tNumReturns = static_cast<cPluginLua &>(a_Plugin).CallFunctionFromForeignState(\n\t\t\t\tFunctionName, L, 4, lua_gettop(L)\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\n\tif (!cPluginManager::Get()->DoWithPlugin(PluginName, PluginCallback))\n\t{\n\t\treturn 0;\n\t}\n\tif (NumReturns < 0)\n\t{\n\t\t// The call has failed, there are zero return values. Do NOT return negative number (Lua considers that a \"yield\")\n\t\treturn 0;\n\t}\n\treturn NumReturns;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_ExecuteConsoleCommand(lua_State * tolua_S)\n{\n\t/*\n\tFunction signature:\n\tcPluginManager:ExecuteConsoleCommand(EntireCommandStr) -> OutputString\n\t*/\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cPluginManager\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString Command;\n\tL.GetStackValues(2, Command);\n\tauto Split = StringSplit(Command, \" \");\n\n\t// Store the command output in a string:\n\tcStringAccumCommandOutputCallback CommandOutput;\n\tL.Push(cPluginManager::Get()->ExecuteConsoleCommand(Split, CommandOutput, Command));\n\tL.Push(CommandOutput.GetAccum());\n\treturn 2;\n}\n\n\n\n\n\nstatic int tolua_cPluginManager_FindPlugins(lua_State * tolua_S)\n{\n\t// API function no longer exists:\n\tLOGWARNING(\"cPluginManager:FindPlugins() is obsolete, use cPluginManager:RefreshPluginList() instead!\");\n\tcLuaState::LogStackTrace(tolua_S);\n\n\t// Still, do the actual work performed by the API function when it existed:\n\tcPluginManager::Get()->RefreshPluginList();\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cPlayer_GetPermissions(lua_State * tolua_S)\n{\n\t// Function signature: cPlayer:GetPermissions() -> {permissions-array}\n\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cPlayer\") ||\n\t\t!L.CheckParamEnd     (2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcPlayer * self = static_cast<cPlayer *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: invalid self (%p)\", __FUNCTION__, static_cast<void *>(self));\n\t\treturn 0;\n\t}\n\n\t// Push the permissions:\n\tL.Push(self->GetPermissions());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPlayer_GetRestrictions(lua_State * tolua_S)\n{\n\t// Function signature: cPlayer:GetRestrictions() -> {restrictions-array}\n\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cPlayer\") ||\n\t\t!L.CheckParamEnd     (2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcPlayer * self = static_cast<cPlayer *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: invalid self (%p)\", __FUNCTION__, static_cast<void *>(self));\n\t\treturn 0;\n\t}\n\n\t// Push the permissions:\n\tL.Push(self->GetRestrictions());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPlayer_GetUUID(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamSelf(\"cPlayer\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcPlayer * Self = nullptr;\n\tL.GetStackValue(1, Self);\n\n\t// Return the UUID as a string\n\tL.Push(Self->GetUUID().ToShortString());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPlayer_PlaceBlock(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cPlayer\") ||\n\t\t!L.CheckParamUserType(2, \"Vector3<int>\") ||\n\t\t!L.CheckParamNumber(3, 4) ||\n\t\t!L.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcPlayer * Self;\n\tVector3i Position;\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\tL.GetStackValues(1, Self, Position, BlockType, BlockMeta);\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'position'\");\n\t}\n\n\t// Return the result of placement:\n\tL.Push(Self->PlaceBlock(Position, BlockType, BlockMeta));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPlayer_PermissionMatches(lua_State * tolua_S)\n{\n\t// Function signature: cPlayer:PermissionMatches(PermissionStr, TemplateStr) -> bool\n\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cPlayer\") ||\n\t\t!L.CheckParamString   (2, 3) ||\n\t\t!L.CheckParamEnd      (4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString Permission, Template;\n\tL.GetStackValues(2, Permission, Template);\n\n\t// Push the result of the match:\n\tL.Push(cPlayer::PermissionMatches(StringSplit(Permission, \".\"), StringSplit(Template, \".\")));\n\treturn 1;\n}\n\n\n\n\n\ntemplate <\n\tclass OBJTYPE,\n\tvoid (OBJTYPE::*SetCallback)(cLuaState::cCallbackPtr && a_CallbackFn)\n>\nstatic int tolua_SetObjectCallback(lua_State * tolua_S)\n{\n\t// Function signature: OBJTYPE:SetWhateverCallback(CallbackFunction)\n\n\t// Get the parameters - self and the function reference:\n\tcLuaState L(tolua_S);\n\tOBJTYPE * self;\n\tcLuaState::cCallbackPtr callback;\n\tif (!L.GetStackValues(1, self, callback))\n\t{\n\t\tLOGWARNING(\"%s: Cannot get parameters\", __FUNCTION__);\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// Set the callback\n\t(self->*SetCallback)(std::move(callback));\n\treturn 0;\n}\n\n\n\n\n\n// Callback class used for the WebTab:\nclass cWebTabCallback:\n\tpublic cWebAdmin::cWebTabCallback\n{\npublic:\n\t/** The Lua callback to call to generate the page contents. */\n\tcLuaState::cCallback m_Callback;\n\n\tvirtual bool Call(\n\t\tconst HTTPRequest & a_Request,\n\t\tconst AString & a_UrlPath,\n\t\tAString & a_Content,\n\t\tAString & a_ContentType\n\t) override\n\t{\n\t\tAString content, contentType;\n\t\treturn m_Callback.Call(const_cast<HTTPRequest *>(&a_Request), a_UrlPath, cLuaState::Return, a_Content, a_ContentType);\n\t}\n};\n\n\n\n\n\nstatic int tolua_cPluginLua_AddWebTab(lua_State * tolua_S)\n{\n\t// OBSOLETE, use cWebAdmin:AddWebTab() instead!\n\t// Function signature:\n\t// cPluginLua:AddWebTab(Title, CallbackFn, [UrlPath])\n\n\t// TODO: Warn about obsolete API usage\n\t// Only implement after merging the new API change and letting some time for changes in the plugins\n\n\t// Check params:\n\tcLuaState LuaState(tolua_S);\n\tcPluginLua * self = cManualBindings::GetLuaPlugin(tolua_S);\n\tif (self == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\tif (\n\t\t!LuaState.CheckParamString(2) ||\n\t\t!LuaState.CheckParamFunction(3) ||\n\t\t// Optional string as param 4\n\t\t!LuaState.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString title, urlPath;\n\tauto callback = std::make_shared<cWebTabCallback>();\n\tif (!LuaState.GetStackValues(2, title, callback->m_Callback))\n\t{\n\t\tLOGWARNING(\"cPlugin:AddWebTab(): Cannot read required parameters\");\n\t\treturn 0;\n\t}\n\tif (!LuaState.GetStackValue(4, urlPath))\n\t{\n\t\turlPath = cWebAdmin::GetURLEncodedString(title);\n\t}\n\n\tcRoot::Get()->GetWebAdmin()->AddWebTab(title, urlPath, self->GetName(), callback);\n\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cPlugin_GetDirectory(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\n\t// Log the obsoletion warning:\n\tLOGWARNING(\"cPlugin:GetDirectory() is obsolete, use cPlugin:GetFolderName() instead.\");\n\tL.LogStackTrace();\n\n\t// Retrieve the params:\n\tcPlugin * Plugin = static_cast<cPluginLua *>(tolua_tousertype(tolua_S, 1, nullptr));\n\n\t// Get the folder name:\n\tL.Push(Plugin->GetFolderName());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cPlugin_GetLocalDirectory(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\n\t// Log the obsoletion warning:\n\tLOGWARNING(\"cPlugin:GetLocalDirectory() is obsolete, use cPlugin:GetLocalFolder() instead.\");\n\tL.LogStackTrace();\n\n\t// Retrieve the params:\n\tcPlugin * Plugin = static_cast<cPluginLua *>(tolua_tousertype(tolua_S, 1, nullptr));\n\n\t// Get the folder:\n\tL.Push(Plugin->GetLocalFolder());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_md5(lua_State * tolua_S)\n{\n\t// Calculate the raw md5 checksum byte array:\n\tunsigned char Output[16];\n\tsize_t len = 0;\n\tconst unsigned char * SourceString = reinterpret_cast<const unsigned char *>(lua_tolstring(tolua_S, 1, &len));\n\tif (SourceString == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\tmbedtls_md5(SourceString, len, Output);\n\tlua_pushlstring(tolua_S, reinterpret_cast<const char *>(Output), ARRAYCOUNT(Output));\n\treturn 1;\n}\n\n\n\n\n\n/** Does the same as tolua_md5, but reports that the usage is obsolete and the plugin should use cCrypto.md5(). */\nstatic int tolua_md5_obsolete(lua_State * tolua_S)\n{\n\tLOGWARNING(\"Using md5() is obsolete, please change your plugin to use cCryptoHash.md5()\");\n\tcLuaState::LogStackTrace(tolua_S);\n\treturn tolua_md5(tolua_S);\n}\n\n\n\n\n\nstatic int tolua_md5HexString(lua_State * tolua_S)\n{\n\t// Calculate the raw md5 checksum byte array:\n\tunsigned char md5Output[16];\n\tsize_t len = 0;\n\tconst unsigned char * SourceString = reinterpret_cast<const unsigned char *>(lua_tolstring(tolua_S, 1, &len));\n\tif (SourceString == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\tmbedtls_md5(SourceString, len, md5Output);\n\n\t// Convert the md5 checksum to hex string:\n\tstd::stringstream Output;\n\tOutput << std::hex << std::setfill('0');\n\tfor (size_t i = 0; i < ARRAYCOUNT(md5Output); i++)\n\t{\n\t\tOutput << std::setw(2) << static_cast<unsigned short>(md5Output[i]);  // Need to cast to a number, otherwise a char is output\n\t}\n\tlua_pushlstring(tolua_S, Output.str().c_str(), Output.str().size());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_sha1(lua_State * tolua_S)\n{\n\t// Calculate the raw SHA1 checksum byte array from the input string:\n\tunsigned char Output[20];\n\tsize_t len = 0;\n\tconst unsigned char * SourceString = reinterpret_cast<const unsigned char *>(lua_tolstring(tolua_S, 1, &len));\n\tif (SourceString == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\tmbedtls_sha1(SourceString, len, Output);\n\tlua_pushlstring(tolua_S, reinterpret_cast<const char *>(Output), ARRAYCOUNT(Output));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_sha1HexString(lua_State * tolua_S)\n{\n\t// Calculate the raw SHA1 checksum byte array from the input string:\n\tunsigned char sha1Output[20];\n\tsize_t len = 0;\n\tconst unsigned char * SourceString = reinterpret_cast<const unsigned char *>(lua_tolstring(tolua_S, 1, &len));\n\tif (SourceString == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\tmbedtls_sha1(SourceString, len, sha1Output);\n\n\t// Convert the sha1 checksum to hex string:\n\tstd::stringstream Output;\n\tOutput << std::hex << std::setfill('0');\n\tfor (size_t i = 0; i < ARRAYCOUNT(sha1Output); i++)\n\t{\n\t\tOutput << std::setw(2) << static_cast<unsigned short>(sha1Output[i]);  // Need to cast to a number, otherwise a char is output\n\t}\n\tlua_pushlstring(tolua_S, Output.str().c_str(), Output.str().size());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_get_HTTPRequest_Params(lua_State * a_LuaState)\n{\n\tcLuaState L(a_LuaState);\n\tHTTPRequest * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\ttolua_Error err;\n\t\ttolua_error(a_LuaState, \"Invalid self parameter, expected a HTTPRequest instance\", &err);\n\t\treturn 0;\n\t}\n\tL.Push(self->Params);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_get_HTTPRequest_PostParams(lua_State * a_LuaState)\n{\n\tcLuaState L(a_LuaState);\n\tHTTPRequest * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\ttolua_Error err;\n\t\ttolua_error(a_LuaState, \"Invalid self parameter, expected a HTTPRequest instance\", &err);\n\t\treturn 0;\n\t}\n\tL.Push(self->PostParams);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_get_HTTPRequest_FormData(lua_State* a_LuaState)\n{\n\tcLuaState L(a_LuaState);\n\tHTTPRequest * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\ttolua_Error err;\n\t\ttolua_error(a_LuaState, \"Invalid self parameter, expected a HTTPRequest instance\", &err);\n\t\treturn 0;\n\t}\n\n\tauto & FormData = self->FormData;\n\tlua_newtable(a_LuaState);\n\tint top = lua_gettop(a_LuaState);\n\tfor (auto & Data : FormData)\n\t{\n\t\tlua_pushstring(a_LuaState, Data.first.c_str());\n\t\ttolua_pushusertype(a_LuaState, &Data.second, \"HTTPFormData\");\n\t\t// lua_pushlstring(a_LuaState, Data.second.Value.c_str(), Data.second.Value.size());  // Might contain binary data\n\t\tlua_settable(a_LuaState, top);\n\t}\n\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cUrlParser_GetDefaultPort(lua_State * a_LuaState)\n{\n\t// API function signature:\n\t// cUrlParser:GetDefaultPort(\"scheme\") -> number\n\n\t// Check params:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cUrlParser\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read params from Lua:\n\tAString scheme;\n\tL.GetStackValue(2, scheme);\n\n\t// Execute and push result:\n\tL.Push(cUrlParser::GetDefaultPort(scheme));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cUrlParser_IsKnownScheme(lua_State * a_LuaState)\n{\n\t// API function signature:\n\t// cUrlParser:IsKnownScheme(\"scheme\") -> bool\n\n\t// Check params:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cUrlParser\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read params from Lua:\n\tAString scheme;\n\tL.GetStackValue(2, scheme);\n\n\t// Execute and push result:\n\tL.Push(cUrlParser::IsKnownScheme(scheme));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cUrlParser_Parse(lua_State * a_LuaState)\n{\n\t// API function signature:\n\t// cUrlParser:Parse(\"url\") -> \"scheme\", \"user\", \"password\", \"host\", portnum, \"path\", \"query\", \"fragment\"\n\t// On error, returns nil and error message\n\n\t// Check params:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cUrlParser\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read params from Lua:\n\tAString url;\n\tL.GetStackValue(2, url);\n\n\t// Execute and push result:\n\tAString scheme, username, password, host, path, query, fragment;\n\tUInt16 port;\n\tauto res = cUrlParser::Parse(url, scheme, username, password, host, port, path, query, fragment);\n\tif (!res.first)\n\t{\n\t\t// Error, return nil and error msg:\n\t\tL.Push(cLuaState::Nil, res.second);\n\t\treturn 2;\n\t}\n\tL.Push(scheme, username, password, host, port, path, query, fragment);\n\treturn 8;\n}\n\n\n\n\n\nstatic int tolua_cUrlParser_ParseAuthorityPart(lua_State * a_LuaState)\n{\n\t// API function signature:\n\t// cUrlParser:ParseAuthorityPart(\"authority\") -> \"user\", \"password\", \"host\", portnum\n\t// On error, returns nil and error message\n\t// Parts not specified in the \"authority\" are left empty / zero\n\n\t// Check params:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cUrlParser\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read params from Lua:\n\tAString authPart;\n\tL.GetStackValue(2, authPart);\n\n\t// Execute and push result:\n\tAString username, password, host;\n\tUInt16 port;\n\tauto res = cUrlParser::ParseAuthorityPart(authPart, username, password, host, port);\n\tif (!res.first)\n\t{\n\t\t// Error, return nil and error msg:\n\t\tL.Push(cLuaState::Nil, res.second);\n\t\treturn 2;\n\t}\n\tL.Push(username, password, host, port);\n\treturn 4;\n}\n\n\n\n\n\nstatic int tolua_cUrlParser_UrlDecode(lua_State * tolua_S)\n{\n\t// Check the param types:\n\tcLuaState S(tolua_S);\n\tif (\n\t\t// Don't care about the first param\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the parameters:\n\tAString Input;\n\tS.GetStackValue(2, Input);\n\n\t// Convert and return:\n\tauto res = URLDecode(Input);\n\tif (res.first)\n\t{\n\t\tS.Push(res.second);\n\t}\n\telse\n\t{\n\t\tS.Push(cLuaState::Nil);\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cUrlParser_UrlEncode(lua_State * tolua_S)\n{\n\t// Check the param types:\n\tcLuaState S(tolua_S);\n\tif (\n\t\t// Don't care about the first param\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the parameters:\n\tAString Input;\n\tS.GetStackValue(2, Input);\n\n\t// Convert and return:\n\tS.Push(URLEncode(Input));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWebAdmin_AddWebTab(lua_State * tolua_S)\n{\n\t// Function signatures:\n\t// cWebAdmin:AddWebTab(Title, UrlPath, CallbackFn)\n\n\t// Check params:\n\tcLuaState LuaState(tolua_S);\n\tcPluginLua * self = cManualBindings::GetLuaPlugin(tolua_S);\n\tif (self == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\tif (\n\t\t// Don't care whether the first param is a cWebAdmin instance or class\n\t\t!LuaState.CheckParamString(2, 3) ||\n\t\t!LuaState.CheckParamFunction(4) ||\n\t\t!LuaState.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString title, urlPath;\n\tauto callback = std::make_shared<cWebTabCallback>();\n\tif (!LuaState.GetStackValues(2, title, urlPath, callback->m_Callback))\n\t{\n\t\tLOGWARNING(\"cWebAdmin:AddWebTab(): Cannot read required parameters\");\n\t\treturn 0;\n\t}\n\n\tcRoot::Get()->GetWebAdmin()->AddWebTab(title, urlPath, self->GetName(), callback);\n\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWebAdmin_GetAllWebTabs(lua_State * tolua_S)\n{\n\t// Function signature:\n\t// cWebAdmin:GetAllWebTabs() -> { {\"PluginName\", \"UrlPath\", \"Title\"}, {\"PluginName\", \"UrlPath\", \"Title\"}, ...}\n\n\t// Don't care about params at all\n\n\tauto webTabs = cRoot::Get()->GetWebAdmin()->GetAllWebTabs();\n\tlua_createtable(tolua_S, static_cast<int>(webTabs.size()), 0);\n\tint newTable = lua_gettop(tolua_S);\n\tint index = 1;\n\tcLuaState L(tolua_S);\n\tfor (const auto & wt: webTabs)\n\t{\n\t\tlua_createtable(tolua_S, 0, 3);\n\t\tL.Push(wt->m_PluginName);\n\t\tlua_setfield(tolua_S, -2, \"PluginName\");\n\t\tL.Push(wt->m_UrlPath);\n\t\tlua_setfield(tolua_S, -2, \"UrlPath\");\n\t\tL.Push(wt->m_Title);\n\t\tlua_setfield(tolua_S, -2, \"Title\");\n\t\tlua_rawseti(tolua_S, newTable, index);\n\t\t++index;\n\t}\n\treturn 1;\n}\n\n\n\n\n\n/** Binding for cWebAdmin::GetPage. */\nstatic int tolua_cWebAdmin_GetPage(lua_State * tolua_S)\n{\n\t/*\n\tFunction signature:\n\tcWebAdmin:GetPage(a_HTTPRequest) ->\n\t{\n\t\tContent = \"\",       // Content generated by the plugin\n\t\tContentType = \"\",   // Content type generated by the plugin (default: \"text/html\")\n\t\tUrlPath = \"\",       // URL path of the tab\n\t\tTabTitle = \"\",      // Tab's title, as register via cWebAdmin:AddWebTab()\n\t\tPluginName = \"\",    // Plugin's API name\n\t\tPluginFolder = \"\",  // Plugin's folder name (display name)\n\t}\n\t*/\n\n\t// Check the param types:\n\tcLuaState S(tolua_S);\n\tif (\n\t\t// Don't care about first param, whether it's cWebAdmin instance or class\n\t\t!S.CheckParamUserType(2, \"HTTPRequest\") ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the parameters:\n\tHTTPRequest * request = nullptr;\n\tif (!S.GetStackValue(2, request))\n\t{\n\t\tLOGWARNING(\"cWebAdmin:GetPage(): Cannot read the HTTPRequest parameter.\");\n\t\treturn 0;\n\t}\n\n\t// Generate the page and push the results as a dictionary-table:\n\tauto page = cRoot::Get()->GetWebAdmin()->GetPage(*request);\n\tlua_createtable(S, 0, 6);\n\tS.Push(page.Content);\n\tlua_setfield(S, -2, \"Content\");\n\tS.Push(page.ContentType);\n\tlua_setfield(S, -2, \"ContentType\");\n\tS.Push(page.TabUrlPath);\n\tlua_setfield(S, -2, \"UrlPath\");\n\tS.Push(page.TabTitle);\n\tlua_setfield(S, -2, \"TabTitle\");\n\tS.Push(page.PluginName);\n\tlua_setfield(S, -2, \"PluginName\");\n\tS.Push(cPluginManager::Get()->GetPluginFolderName(page.PluginName));\n\tlua_setfield(S, -2, \"PluginFolder\");\n\treturn 1;\n}\n\n\n\n\n\n/** Binding for cWebAdmin::GetURLEncodedString. */\nstatic int tolua_cWebAdmin_GetURLEncodedString(lua_State * tolua_S)\n{\n\t// Emit the obsoletion warning:\n\tcLuaState S(tolua_S);\n\tLOGWARNING(\"cWebAdmin:GetURLEncodedString() is obsolete, use cUrlParser:UrlEncode() instead.\");\n\tS.LogStackTrace();\n\n\treturn tolua_cUrlParser_UrlEncode(tolua_S);\n}\n\n\n\n\n\nstatic int tolua_cClientHandle_SendPluginMessage(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cClientHandle\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcClientHandle * Client = static_cast<cClientHandle *>(tolua_tousertype(L, 1, nullptr));\n\tif (Client == nullptr)\n\t{\n\t\tLOGWARNING(\"ClientHandle is nil in cClientHandle:SendPluginMessage()\");\n\t\tS.LogStackTrace();\n\t\treturn 0;\n\t}\n\tAString Channel, Message;\n\tChannel.assign(lua_tostring(L, 2), lua_strlen(L, 2));\n\tMessage.assign(lua_tostring(L, 3), lua_strlen(L, 3));\n\tClient->SendPluginMessage(Channel, Message);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cClientHandle_SendTimeUpdate(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cClientHandle\") ||\n\t\t!S.CheckParamNumber(2, 3) ||\n\t\t!S.CheckParamBool(4) ||\n\t\t!S.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcClientHandle * Client;\n\tcTickTimeLong::rep WorldAge, WorldDate;\n\tbool DoDayLightCycle;\n\tS.GetStackValues(1, Client, WorldAge, WorldDate, DoDayLightCycle);\n\tif (Client == nullptr)\n\t{\n\t\treturn S.ApiParamError(\"Invalid 'self'\");\n\t}\n\n\tClient->SendTimeUpdate(cTickTimeLong(WorldAge), cTickTimeLong(WorldDate), DoDayLightCycle);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cClientHandle_GetForgeMods(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cClientHandle\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcClientHandle * Client;\n\tS.GetStackValue(1, Client);\n\n\tS.Push(Client->GetForgeMods());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cClientHandle_GetUUID(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cClientHandle\") ||\n\t\t!L.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcClientHandle * Self;\n\tL.GetStackValue(1, Self);\n\n\t// Return the UUID as a string:\n\tL.Push(Self->GetUUID().ToShortString());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cClientHandle_GenerateOfflineUUID(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamStaticSelf(\"cClientHandle\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString Username;\n\tL.GetStackValue(2, Username);\n\n\t// Return the UUID as a string:\n\tL.Push(cClientHandle::GenerateOfflineUUID(Username).ToShortString());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cClientHandle_IsUUIDOnline(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamStaticSelf(\"cClientHandle\") ||\n\t\t!L.CheckParamUUID(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID UUID;\n\tL.GetStackValue(2, UUID);\n\n\t// Return the result:\n\tL.Push(cClientHandle::IsUUIDOnline(UUID));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cMobHeadEntity_SetOwner(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cMobHeadEntity\") ||\n\t\t!L.CheckParamUUID(2) ||\n\t\t!L.CheckParamString(3, 5) ||\n\t\t!L.CheckParamEnd(6)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\n\t// Get the params:\n\tcMobHeadEntity * Self;\n\tcUUID OwnerUUID;\n\tAString OwnerName, OwnerTexture, OwnerTextureSignature;\n\tL.GetStackValues(1, Self, OwnerUUID, OwnerName, OwnerTexture, OwnerTextureSignature);\n\n\t// Set the owner:\n\tSelf->SetOwner(OwnerUUID, OwnerName, OwnerTexture, OwnerTextureSignature);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cMobHeadEntity_GetOwnerUUID(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cMobHeadEntity\") ||\n\t\t!L.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcMobHeadEntity * Self;\n\tL.GetStackValue(1, Self);\n\n\t// Return the UUID as a string:\n\tcUUID Owner = Self->GetOwnerUUID();\n\tL.Push(Owner.IsNil() ? AString{} : Owner.ToShortString());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cMojangAPI_AddPlayerNameToUUIDMapping(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cMojangAPI\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamUUID(3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Retrieve the parameters:\n\tAString PlayerName;\n\tcUUID UUID;\n\tS.GetStackValues(2, PlayerName, UUID);\n\n\t// Store in the cache:\n\tcRoot::Get()->GetMojangAPI().AddPlayerNameToUUIDMapping(PlayerName, UUID);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cMojangAPI_GetPlayerNameFromUUID(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cMojangAPI\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcUUID UUID;\n\tS.GetStackValue(2, UUID);\n\n\t// If the UseOnlyCached param was given, read it; default to false\n\tbool ShouldUseCacheOnly = false;\n\tif (lua_gettop(L) == 3)\n\t{\n\t\tShouldUseCacheOnly = (lua_toboolean(L, 3) != 0);\n\t\tlua_pop(L, 1);\n\t}\n\n\t// Return the PlayerName:\n\tAString PlayerName = cRoot::Get()->GetMojangAPI().GetPlayerNameFromUUID(UUID, ShouldUseCacheOnly);\n\tS.Push(PlayerName);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cMojangAPI_GetUUIDFromPlayerName(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cMojangAPI\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tAString PlayerName;\n\tS.GetStackValue(2, PlayerName);\n\n\t// If the UseOnlyCached param was given, read it; default to false\n\tbool ShouldUseCacheOnly = false;\n\tif (lua_gettop(L) == 3)\n\t{\n\t\tShouldUseCacheOnly = (lua_toboolean(L, 3) != 0);\n\t\tlua_pop(L, 1);\n\t}\n\n\t// Return the UUID as a string:\n\tcUUID UUID = cRoot::Get()->GetMojangAPI().GetUUIDFromPlayerName(PlayerName, ShouldUseCacheOnly);\n\tS.Push(UUID.IsNil() ? AString{} : UUID.ToShortString());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cMojangAPI_GetUUIDsFromPlayerNames(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cMojangAPI\") ||\n\t\t!S.CheckParamTable(2) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Convert the input table into AStringVector:\n\tAStringVector PlayerNames;\n\tint NumNames = luaL_getn(L, 2);\n\tPlayerNames.reserve(static_cast<size_t>(NumNames));\n\tfor (int i = 1; i <= NumNames; i++)\n\t{\n\t\tlua_rawgeti(L, 2, i);\n\t\tAString Name;\n\t\tS.GetStackValue(-1, Name);\n\t\tif (!Name.empty())\n\t\t{\n\t\t\tPlayerNames.push_back(Name);\n\t\t}\n\t\tlua_pop(L, 1);\n\t}\n\n\t// If the UseOnlyCached param was given, read it; default to false\n\tbool ShouldUseCacheOnly = false;\n\tif (lua_gettop(L) == 3)\n\t{\n\t\tShouldUseCacheOnly = (lua_toboolean(L, 3) != 0);\n\t\tlua_pop(L, 1);\n\t}\n\n\t// Push the output table onto the stack:\n\tlua_newtable(L);\n\n\t// Get the UUIDs:\n\tauto UUIDs = cRoot::Get()->GetMojangAPI().GetUUIDsFromPlayerNames(PlayerNames, ShouldUseCacheOnly);\n\tif (UUIDs.size() != PlayerNames.size())\n\t{\n\t\t// A hard error has occured while processing the request, no UUIDs were returned. Return an empty table:\n\t\treturn 1;\n\t}\n\n\t// Convert to output table, PlayerName -> UUID string:\n\tsize_t len = UUIDs.size();\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tif (UUIDs[i].IsNil())\n\t\t{\n\t\t\t// No UUID was provided for PlayerName[i], skip it in the resulting table\n\t\t\tcontinue;\n\t\t}\n\t\tS.Push(UUIDs[i].ToShortString());\n\t\tlua_setfield(L, 3, PlayerNames[i].c_str());\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cMojangAPI_MakeUUIDDashed(lua_State * L)\n{\n\t// Function now non-existant but kept for API compatibility\n\n\t// Check params:\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cMojangAPI\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID UUID;\n\tS.GetStackValue(2, UUID);\n\n\t// Push the result:\n\tS.Push(UUID.ToLongString());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cMojangAPI_MakeUUIDShort(lua_State * L)\n{\n\t// Function now non-existant but kept for API compatibility\n\n\t// Check params:\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cMojangAPI\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID UUID;\n\tS.GetStackValue(2, UUID);\n\n\t// Push the result:\n\tS.Push(UUID.ToShortString());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_get_cItem_m_LoreTable(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamSelf(\"const cItem\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tconst cItem * Self = nullptr;\n\tL.GetStackValue(1, Self);\n\n\t// Push the result:\n\tL.Push(Self->m_LoreTable);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cItem_EnchantByXPLevels(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cItem\") ||\n\t\t!L.CheckParamNumber(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcItem * Self;\n\tunsigned NumXPLevels;\n\tL.GetStackValue(1, Self);\n\tL.GetStackValue(2, NumXPLevels);\n\n\t// Call:\n\tL.Push(Self->EnchantByXPLevels(NumXPLevels, GetRandomProvider()));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_set_cItem_m_LoreTable(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cItem\") ||\n\t\t!L.CheckParamTable(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcItem * Self = nullptr;\n\tL.GetStackValue(1, Self);\n\n\t// Set the value:\n\tSelf->m_LoreTable.clear();\n\tif (!L.GetStackValue(2, Self->m_LoreTable))\n\t{\n\t\treturn L.ApiParamError(\"cItem.m_LoreTable: Could not read value as an array of strings\");\n\t}\n\treturn 0;\n}\n\n\n\n\n\nstatic int Lua_ItemGrid_GetSlotCoords(lua_State * L)\n{\n\ttolua_Error tolua_err;\n\tif (\n\t\t!tolua_isusertype(L, 1, \"const cItemGrid\", 0, &tolua_err) ||\n\t\t!tolua_isnumber  (L, 2, 0, &tolua_err) ||\n\t\t!tolua_isnoobj   (L, 3, &tolua_err)\n\t)\n\t{\n\t\tgoto tolua_lerror;\n\t}\n\n\t{\n\t\tconst cItemGrid * self = static_cast<const cItemGrid *>(tolua_tousertype(L, 1, nullptr));\n\t\tint SlotNum = static_cast<int>(tolua_tonumber(L, 2, 0));\n\t\tif (self == nullptr)\n\t\t{\n\t\t\ttolua_error(L, \"invalid 'self' in function 'cItemGrid:GetSlotCoords'\", nullptr);\n\t\t\treturn 0;\n\t\t}\n\t\tint X, Y;\n\t\tself->GetSlotCoords(SlotNum, X, Y);\n\t\ttolua_pushnumber(L, static_cast<lua_Number>(X));\n\t\ttolua_pushnumber(L, static_cast<lua_Number>(Y));\n\t\treturn 2;\n\t}\n\ntolua_lerror:\n\ttolua_error(L, \"#ferror in function 'cItemGrid:GetSlotCoords'.\", &tolua_err);\n\treturn 0;\n}\n\n\n\n\n\n/** Provides interface between a Lua table of callbacks and the cBlockTracer::cCallbacks */\nclass cLuaBlockTracerCallbacks :\n\tpublic cBlockTracer::cCallbacks\n{\npublic:\n\tcLuaBlockTracerCallbacks(cLuaState::cTableRefPtr && a_Callbacks):\n\t\tm_Callbacks(std::move(a_Callbacks))\n\t{\n\t}\n\n\tvirtual bool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t{\n\t\tbool res = false;\n\t\tif (m_Callbacks->CallTableFn(\n\t\t\t\"OnNextBlock\",\n\t\t\ta_BlockPos,\n\t\t\ta_BlockType,\n\t\t\ta_BlockMeta,\n\t\t\ta_EntryFace,\n\t\t\tcLuaState::Return, res)\n\t\t)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\t// No such function in the table, skip the callback\n\t\treturn false;\n\t}\n\n\tvirtual bool OnNextBlockNoData(Vector3i a_BlockPos, eBlockFace a_EntryFace) override\n\t{\n\t\tbool res = false;\n\t\tif (m_Callbacks->CallTableFn(\n\t\t\t\"OnNextBlockNoData\",\n\t\t\ta_BlockPos,\n\t\t\ta_EntryFace,\n\t\t\tcLuaState::Return, res)\n\t\t)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\t// No such function in the table, skip the callback\n\t\treturn false;\n\t}\n\n\tvirtual bool OnOutOfWorld(Vector3d a_BlockPos) override\n\t{\n\t\tbool res = false;\n\t\tif (m_Callbacks->CallTableFn(\n\t\t\t\"OnOutOfWorld\",\n\t\t\ta_BlockPos,\n\t\t\tcLuaState::Return, res)\n\t\t)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\t// No such function in the table, skip the callback\n\t\treturn false;\n\t}\n\n\tvirtual bool OnIntoWorld(Vector3d a_BlockPos) override\n\t{\n\t\tbool res = false;\n\t\tif (m_Callbacks->CallTableFn(\"OnIntoWorld\",\n\t\t\ta_BlockPos,\n\t\t\tcLuaState::Return, res)\n\t\t)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\t// No such function in the table, skip the callback\n\t\treturn false;\n\t}\n\n\tvirtual void OnNoMoreHits(void) override\n\t{\n\t\tm_Callbacks->CallTableFn(\"OnNoMoreHits\");\n\t}\n\n\tvirtual void OnNoChunk(void) override\n\t{\n\t\tm_Callbacks->CallTableFn(\"OnNoChunk\");\n\t}\n\nprotected:\n\tcLuaState::cTableRefPtr m_Callbacks;\n};\n\n\n\n\n\n/** Provides interface between a Lua table of callbacks and the cBlockTracer::cCallbacks\nThis is the deprecated version of cLuaBlockTracerCallback, used when the plugin calls\nthe Trace function with number-based coords. */\nclass cLuaBlockTracerCallbacksOld :\n\tpublic cLuaBlockTracerCallbacks\n{\npublic:\n\tcLuaBlockTracerCallbacksOld(cLuaState::cTableRefPtr && a_Callbacks):\n\t\tcLuaBlockTracerCallbacks(std::move(a_Callbacks))\n\t{\n\t}\n\n\tvirtual bool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t{\n\t\tbool res = false;\n\t\tif (m_Callbacks->CallTableFn(\n\t\t\t\"OnNextBlock\",\n\t\t\ta_BlockPos.x, a_BlockPos.y, a_BlockPos.z,\n\t\t\ta_BlockType,\n\t\t\ta_BlockMeta,\n\t\t\ta_EntryFace,\n\t\t\tcLuaState::Return, res)\n\t\t)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\t// No such function in the table, skip the callback\n\t\treturn false;\n\t}\n\n\tvirtual bool OnNextBlockNoData(Vector3i a_BlockPos, eBlockFace a_EntryFace) override\n\t{\n\t\tbool res = false;\n\t\tif (m_Callbacks->CallTableFn(\n\t\t\t\"OnNextBlockNoData\",\n\t\t\ta_BlockPos.x, a_BlockPos.y, a_BlockPos.z,\n\t\t\ta_EntryFace,\n\t\t\tcLuaState::Return, res)\n\t\t)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\t// No such function in the table, skip the callback\n\t\treturn false;\n\t}\n\n\tvirtual bool OnOutOfWorld(Vector3d a_BlockPos) override\n\t{\n\t\tbool res = false;\n\t\tif (m_Callbacks->CallTableFn(\n\t\t\t\"OnOutOfWorld\",\n\t\t\ta_BlockPos.x, a_BlockPos.y, a_BlockPos.z,\n\t\t\tcLuaState::Return, res)\n\t\t)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\t// No such function in the table, skip the callback\n\t\treturn false;\n\t}\n\n\tvirtual bool OnIntoWorld(Vector3d a_BlockPos) override\n\t{\n\t\tbool res = false;\n\t\tif (m_Callbacks->CallTableFn(\n\t\t\t\"OnIntoWorld\",\n\t\t\ta_BlockPos.x, a_BlockPos.y, a_BlockPos.z,\n\t\t\tcLuaState::Return, res)\n\t\t)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\t// No such function in the table, skip the callback\n\t\treturn false;\n\t}\n};\n\n\n\n\n\nstatic int tolua_cLineBlockTracer_FirstSolidHitTrace(lua_State * tolua_S)\n{\n\t/* Supported function signatures:\n\tcLineBlockTracer:FirstSolidHitTrace(World, StartX, StartY, StartZ, EndX, EndY, EndZ) -> bool, [Vector3d, Vector3i, eBlockFace]  // Canonical\n\tcLineBlockTracer:FirstSolidHitTrace(World, Start, End) -> bool, [Vector3d, Vector3i, eBlockFace]                                // Canonical\n\tcLineBlockTracer.FirstSolidHitTrace(World, StartX, StartY, StartZ, EndX, EndY, EndZ) -> bool, [Vector3d, Vector3i, eBlockFace]\n\tcLineBlockTracer.FirstSolidHitTrace(World, Start, End) -> bool, [Vector3d, Vector3i, eBlockFace]\n\t*/\n\n\t// If the first param is the cLineBlockTracer class, shift param index by one:\n\tint idx = 1;\n\ttolua_Error err;\n\tif (tolua_isusertable(tolua_S, 1, \"cLineBlockTracer\", 0, &err))\n\t{\n\t\tidx = 2;\n\t}\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(idx, \"cWorld\")\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (L.IsParamNumber(idx + 1))\n\t{\n\t\t// This is the number variant of the call:\n\t\tif (\n\t\t\t!L.CheckParamNumber(idx + 1, idx + 6) ||\n\t\t\t!L.CheckParamEnd(idx + 7)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\t// Get the params:\n\t\tcWorld * world;\n\t\tdouble startX, startY, startZ;\n\t\tdouble endX, endY, endZ;\n\t\tif (!L.GetStackValues(idx, world, startX, startY, startZ, endX, endY, endZ))\n\t\t{\n\t\t\tLOGWARNING(\"cLineBlockTracer:FirstSolidHitTrace(): Cannot read parameters, aborting the trace.\");\n\t\t\tL.LogStackTrace();\n\t\t\tL.LogStackValues(\"Values on the stack\");\n\t\t\treturn 0;\n\t\t}\n\t\tVector3d hitCoords;\n\t\tVector3i hitBlockCoords;\n\t\teBlockFace hitBlockFace;\n\t\tauto isHit = cLineBlockTracer::FirstSolidHitTrace(*world, Vector3d(startX, startY, startZ), Vector3d(endX, endY, endZ), hitCoords, hitBlockCoords, hitBlockFace);\n\t\tL.Push(isHit);\n\t\tif (!isHit)\n\t\t{\n\t\t\treturn 1;\n\t\t}\n\t\tL.Push(hitCoords);\n\t\tL.Push(hitBlockCoords);\n\t\tL.Push(hitBlockFace);\n\t\treturn 4;\n\t}\n\n\tif (L.IsParamVector3(idx + 1))\n\t{\n\t\t// This is the Vector3-based variant of the call:\n\t\tif (\n\t\t\t!L.CheckParamVector3(idx + 1, idx + 2) ||\n\t\t\t!L.CheckParamEnd(idx + 3)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\t// Get the params:\n\t\tcWorld * world;\n\t\tVector3d start;\n\t\tVector3d end;\n\t\tif (!L.GetStackValues(idx, world, start, end))\n\t\t{\n\t\t\tLOGWARNING(\"cLineBlockTracer:FirstSolidHitTrace(): Cannot read parameters, aborting the trace.\");\n\t\t\tL.LogStackTrace();\n\t\t\tL.LogStackValues(\"Values on the stack\");\n\t\t\treturn 0;\n\t\t}\n\t\tVector3d hitCoords;\n\t\tVector3i hitBlockCoords;\n\t\teBlockFace hitBlockFace;\n\t\tauto isHit = cLineBlockTracer::FirstSolidHitTrace(*world, start, end, hitCoords, hitBlockCoords, hitBlockFace);\n\t\tL.Push(isHit);\n\t\tif (!isHit)\n\t\t{\n\t\t\treturn 1;\n\t\t}\n\t\tL.Push(hitCoords);\n\t\tL.Push(hitBlockCoords);\n\t\tL.Push(hitBlockFace);\n\t\treturn 4;\n\t}\n\n\ttolua_error(L, \"cLineBlockTracer:FirstSolidHitTrace(): Invalid parameters, expected either a set of coords, or two Vector3's\", nullptr);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cLineBlockTracer_LineOfSightTrace(lua_State * tolua_S)\n{\n\t/* Supported function signatures:\n\tcLineBlockTracer:LineOfSightTrace(World, StartX, StartY, StartZ, EndX, EndY, EndZ, Sight) -> bool  // Canonical\n\tcLineBlockTracer:LineOfSightTrace(World, Start, End, Sight) -> bool                                // Canonical\n\tcLineBlockTracer.LineOfSightTrace(World, StartX, StartY, StartZ, EndX, EndY, EndZ, Sight) -> bool\n\tcLineBlockTracer.LineOfSightTrace(World, Start, End, Sight) -> bool\n\t*/\n\n\t// If the first param is the cLineBlockTracer class, shift param index by one:\n\tint idx = 1;\n\ttolua_Error err;\n\tif (tolua_isusertable(tolua_S, 1, \"cLineBlockTracer\", 0, &err))\n\t{\n\t\tidx = 2;\n\t}\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(idx, \"cWorld\")\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (L.IsParamNumber(idx + 1))\n\t{\n\t\t// This is the number variant of the call:\n\t\tif (\n\t\t\t!L.CheckParamNumber(idx + 1, idx + 6) ||\n\t\t\t// Optional param lineOfSight is not checked\n\t\t\t!L.CheckParamEnd(idx + 8)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\t// Get the params:\n\t\tcWorld * world;\n\t\tdouble startX, startY, startZ;\n\t\tdouble endX, endY, endZ;\n\t\tif (!L.GetStackValues(idx, world, startX, startY, startZ, endX, endY, endZ))\n\t\t{\n\t\t\tLOGWARNING(\"cLineBlockTracer:LineOfSightTrace(): Cannot read parameters, aborting the trace.\");\n\t\t\tL.LogStackTrace();\n\t\t\tL.LogStackValues(\"Values on the stack\");\n\t\t\treturn 0;\n\t\t}\n\t\tint lineOfSight = cLineBlockTracer::losAir | cLineBlockTracer::losWater;\n\t\tL.GetStackValue(idx + 7, lineOfSight);\n\t\tL.Push(cLineBlockTracer::LineOfSightTrace(*world, Vector3d(startX, startY, startZ), Vector3d(endX, endY, endZ), lineOfSight));\n\t\treturn 1;\n\t}\n\n\tif (L.IsParamVector3(idx + 1))\n\t{\n\t\t// This is the Vector3-based variant of the call:\n\t\tif (\n\t\t\t!L.CheckParamVector3(idx + 1, idx + 2) ||\n\t\t\t// Optional param lineOfSight is not checked\n\t\t\t!L.CheckParamEnd(idx + 4)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\t// Get the params:\n\t\tcWorld * world;\n\t\tVector3d start;\n\t\tVector3d end;\n\t\tif (!L.GetStackValues(idx, world, start, end))\n\t\t{\n\t\t\tLOGWARNING(\"cLineBlockTracer:LineOfSightTrace(): Cannot read parameters, aborting the trace.\");\n\t\t\tL.LogStackTrace();\n\t\t\tL.LogStackValues(\"Values on the stack\");\n\t\t\treturn 0;\n\t\t}\n\t\tint lineOfSight = cLineBlockTracer::losAirWater;\n\t\tL.GetStackValue(idx + 7, lineOfSight);\n\t\tL.Push(cLineBlockTracer::LineOfSightTrace(*world, start, end, lineOfSight));\n\t\treturn 1;\n\t}\n\n\ttolua_error(L, \"cLineBlockTracer:LineOfSightTrace(): Invalid parameters, expected either a set of coords, or two Vector3's\", nullptr);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cLineBlockTracer_Trace(lua_State * tolua_S)\n{\n\t/* Supported function signatures:\n\tcLineBlockTracer:Trace(World, Callbacks, StartX, StartY, StartZ, EndX, EndY, EndZ)  // Canonical  // DEPRECATED\n\tcLineBlockTracer.Trace(World, Callbacks, StartX, StartY, StartZ, EndX, EndY, EndZ)  // DEPRECATED\n\tcLineBlockTracer:Trace(World, Callbacks, Start, End)  // Canonical\n\tcLineBlockTracer.Trace(World, Callbacks, Start, End)\n\t*/\n\n\t// If the first param is the cLineBlockTracer class, shift param index by one:\n\tint idx = 1;\n\ttolua_Error err;\n\tif (tolua_isusertable(tolua_S, 1, \"cLineBlockTracer\", 0, &err))\n\t{\n\t\tidx = 2;\n\t}\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(idx, \"cWorld\") ||\n\t\t!L.CheckParamTable   (idx + 1)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcWorld * world;\n\tVector3d start;\n\tVector3d end;\n\tcLuaState::cTableRefPtr callbacks;\n\tif (\n\t\tL.IsParamNumber  (idx + 2) &&\n\t\tL.IsParamNumber  (idx + 3) &&\n\t\tL.IsParamNumber  (idx + 4) &&\n\t\tL.IsParamNumber  (idx + 5) &&\n\t\tL.IsParamNumber  (idx + 6) &&\n\t\tL.IsParamNumber  (idx + 7) &&\n\t\tL.CheckParamEnd  (idx + 8)\n\t)\n\t{\n\t\tif (!L.GetStackValues(idx, world, callbacks, start.x, start.y, start.z, end.x, end.y, end.z))\n\t\t{\n\t\t\tLOGWARNING(\"cLineBlockTracer:Trace(): Cannot read parameters (starting at idx %d), aborting the trace.\", idx);\n\t\t\tL.LogStackTrace();\n\t\t\tL.LogStackValues(\"Values on the stack\");\n\t\t\treturn 0;\n\t\t}\n\t\tLOGWARNING(\"cLineBlockTracer:Trace(): Using plain numbers is deprecated, use Vector3 coords instead.\");\n\t\tL.LogStackTrace();\n\t\t// Trace:\n\t\tcLuaBlockTracerCallbacksOld tracerCallbacks(std::move(callbacks));\n\t\tbool res = cLineBlockTracer::Trace(*world, tracerCallbacks, start, end);\n\t\ttolua_pushboolean(L, res ? 1 : 0);\n\t\treturn 1;\n\t}\n\telse if (\n\t\tL.IsParamVector3(idx + 2) &&\n\t\tL.IsParamVector3(idx + 3) &&\n\t\tL.CheckParamEnd (idx + 4)\n\t)\n\t{\n\t\tif (!L.GetStackValues(idx, world, callbacks, start, end))\n\t\t{\n\t\t\tLOGWARNING(\"cLineBlockTracer:Trace(): Cannot read parameters (starting at idx %d), aborting the trace.\", idx);\n\t\t\tL.LogStackTrace();\n\t\t\tL.LogStackValues(\"Values on the stack\");\n\t\t\treturn 0;\n\t\t}\n\t\t// Trace:\n\t\tcLuaBlockTracerCallbacks tracerCallbacks(std::move(callbacks));\n\t\tbool res = cLineBlockTracer::Trace(*world, tracerCallbacks, start, end);\n\t\ttolua_pushboolean(L, res ? 1 : 0);\n\t\treturn 1;\n\t}\n\treturn L.ApiParamError(\"Invalid overload of cLineBlockTracer:Trace()\");\n}\n\n\n\n\n\nstatic int tolua_cLuaWindow_new(lua_State * tolua_S)\n{\n\t// Function signature:\n\t// cLuaWindow:new(type, slotsX, slotsY, title)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cLuaWindow\") ||\n\t\t!L.CheckParamNumber(2, 4) ||\n\t\t!L.CheckParamString(5) ||\n\t\t!L.CheckParamEnd(6)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read params:\n\tint windowType, slotsX, slotsY;\n\tAString title;\n\tif (!L.GetStackValues(2, windowType, slotsX, slotsY, title))\n\t{\n\t\tLOGWARNING(\"%s: Cannot read Lua parameters\", __FUNCTION__);\n\t\tL.LogStackValues();\n\t\tL.LogStackTrace();\n\t}\n\n\t// Create the window and return it:\n\tL.Push(new cLuaWindow(L, static_cast<cLuaWindow::WindowType>(windowType), slotsX, slotsY, title));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cLuaWindow_new_local(lua_State * tolua_S)\n{\n\t// Function signature:\n\t// cLuaWindow:new(type, slotsX, slotsY, title)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cLuaWindow\") ||\n\t\t!L.CheckParamNumber(2, 4) ||\n\t\t!L.CheckParamString(5) ||\n\t\t!L.CheckParamEnd(6)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read params:\n\tint windowType, slotsX, slotsY;\n\tAString title;\n\tif (!L.GetStackValues(2, windowType, slotsX, slotsY, title))\n\t{\n\t\tLOGWARNING(\"%s: Cannot read Lua parameters\", __FUNCTION__);\n\t\tL.LogStackValues();\n\t\tL.LogStackTrace();\n\t}\n\n\t// Create the window, register it for GC and return it:\n\tL.Push(new cLuaWindow(L, static_cast<cLuaWindow::WindowType>(windowType), slotsX, slotsY, title));\n\ttolua_register_gc(tolua_S, lua_gettop(tolua_S));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cRoot_DoWithPlayerByUUID(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cRoot\") ||\n\t\t!L.CheckParamUUID(2) ||\n\t\t!L.CheckParamFunction(3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get parameters:\n\tcRoot * Self;\n\tcUUID PlayerUUID;\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(1, Self, PlayerUUID, FnRef);\n\n\tif (PlayerUUID.IsNil())\n\t{\n\t\treturn L.ApiParamError(\"Expected a non-nil UUID for parameter #1\");\n\t}\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid callback function for parameter #2\");\n\t}\n\n\t// Call the function:\n\tbool res = Self->DoWithPlayerByUUID(PlayerUUID, [&](cPlayer & a_Player)\n\t\t{\n\t\t\tbool ret = false;\n\t\t\tL.Call(FnRef, &a_Player, cLuaState::Return, ret);\n\t\t\treturn ret;\n\t\t}\n\t);\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cRoot_GetBuildCommitID(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tL.Push(BUILD_COMMIT_ID);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cRoot_GetBuildDateTime(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tL.Push(BUILD_DATETIME);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cRoot_GetBuildID(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tL.Push(BUILD_ID);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cRoot_GetBuildSeriesName(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tL.Push(BUILD_SERIES_NAME);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cRoot_GetBrewingRecipe(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cRoot\") ||\n\t\t!L.CheckParamUserType (2, \"const cItem\") ||\n\t\t!L.CheckParamUserType (3, \"const cItem\") ||\n\t\t!L.CheckParamEnd      (4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Check the bottle param:\n\tcItem * Bottle = nullptr;\n\tL.GetStackValue(2, Bottle);\n\tif (Bottle == nullptr)\n\t{\n\t\tLOGWARNING(\"cRoot:GetBrewingRecipe: the Bottle parameter is nil or missing.\");\n\t\treturn 0;\n\t}\n\n\tcItem * Ingredient = nullptr;\n\tL.GetStackValue(3, Ingredient);\n\tif (Ingredient == nullptr)\n\t{\n\t\tLOGWARNING(\"cRoot:GetBrewingRecipe: the Ingredient parameter is nil or missing.\");\n\t\treturn 0;\n\t}\n\n\t// Get the recipe for the input\n\tcBrewingRecipes * BR = cRoot::Get()->GetBrewingRecipes();\n\tconst cBrewingRecipes::cRecipe * Recipe = BR->GetRecipeFrom(*Bottle, *Ingredient);\n\tif (Recipe == nullptr)\n\t{\n\t\t// There is no such brewing recipe for this bottle and ingredient, return no value\n\t\treturn 0;\n\t}\n\n\t// Push the output item\n\tcItem & OutItem = const_cast<cItem &>(Recipe->Output);\n\tL.Push(&OutItem);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cRoot_GetFurnaceRecipe(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserTable(1, \"cRoot\") ||\n\t\t!L.CheckParamUserType (2, \"const cItem\") ||\n\t\t!L.CheckParamEnd      (3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Check the input param:\n\tcItem * Input = nullptr;\n\tL.GetStackValue(2, Input);\n\tif (Input == nullptr)\n\t{\n\t\tLOGWARNING(\"cRoot:GetFurnaceRecipe: the Input parameter is nil or missing.\");\n\t\treturn 0;\n\t}\n\n\t// Get the recipe for the input\n\tcFurnaceRecipe * FR = cRoot::Get()->GetFurnaceRecipe();\n\tconst cFurnaceRecipe::cRecipe * Recipe = FR->GetRecipeFrom(*Input);\n\tif (Recipe == nullptr)\n\t{\n\t\t// There is no such furnace recipe for this input, return no value\n\t\treturn 0;\n\t}\n\n\t// Push the output, number of ticks and input as the three return values:\n\tL.Push(Recipe->Out, Recipe->CookTime, Recipe->In);\n\treturn 3;\n}\n\n\n\n\n\nstatic int tolua_cServer_RegisterForgeMod(lua_State * a_LuaState)\n{\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamSelf(\"cServer\") ||\n\t\t!L.CheckParamString(2, 3) ||\n\t\t!L.CheckParamNumber(4) ||\n\t\t!L.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcServer * Server;\n\tAString Name, Version;\n\tUInt32 Protocol;\n\tL.GetStackValues(1, Server, Name, Version, Protocol);\n\n\tif (!Server->RegisterForgeMod(Name, Version, Protocol))\n\t{\n\t\ttolua_error(L, \"duplicate Forge mod name registration\", nullptr);\n\t\treturn 0;\n\t}\n\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cServer_ScheduleTask(lua_State * a_LuaState)\n{\n\t// Function signature:\n\t// Server:ScheduleTask(NumTicks, Callback)\n\n\t// Retrieve the args:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cServer\") ||\n\t\t!L.CheckParamNumber(2) ||\n\t\t!L.CheckParamFunction(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcServer * Server;\n\tint NumTicks;\n\tauto Task = std::make_shared<cLuaState::cCallback>();\n\tif (!L.GetStackValues(1, Server, NumTicks, Task))\n\t{\n\t\treturn cManualBindings::lua_do_error(a_LuaState, \"Error in function call '#funcname#': Cannot read parameters\");\n\t}\n\tif (Server == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(a_LuaState, \"Error in function call '#funcname#': Not called on an object instance\");\n\t}\n\tif (!Task->IsValid())\n\t{\n\t\treturn cManualBindings::lua_do_error(a_LuaState, \"Error in function call '#funcname#': Could not store the callback parameter\");\n\t}\n\n\tServer->ScheduleTask(cTickTime(NumTicks), [Task](cServer & a_Server)\n\t{\n\t\tTask->Call(&a_Server);\n\t});\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cScoreboard_GetTeamNames(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserType(1, \"cScoreboard\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the groups:\n\tcScoreboard * Scoreboard = static_cast<cScoreboard *>(tolua_tousertype(L, 1, nullptr));\n\tAStringVector Teams = Scoreboard->GetTeamNames();\n\n\t// Push the results:\n\tS.Push(Teams);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cHopperEntity_GetOutputBlockPos(lua_State * tolua_S)\n{\n\t// function cHopperEntity::GetOutputBlockPos()\n\t// Exported manually because tolua would require meaningless params\n\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cHopperEntity\") ||\n\t\t!L.CheckParamNumber  (2) ||\n\t\t!L.CheckParamEnd     (3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcHopperEntity * self = static_cast<cHopperEntity *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cHopperEntity::GetOutputBlockPos()'\", nullptr);\n\t\treturn 0;\n\t}\n\n\tNIBBLETYPE a_BlockMeta = static_cast<NIBBLETYPE>(tolua_tonumber(tolua_S, 2, 0));\n\tauto res = self->GetOutputBlockPos(a_BlockMeta);\n\ttolua_pushboolean(tolua_S, res.first);\n\tif (res.first)\n\t{\n\t\ttolua_pushnumber(tolua_S, static_cast<lua_Number>(res.second.x));\n\t\ttolua_pushnumber(tolua_S, static_cast<lua_Number>(res.second.y));\n\t\ttolua_pushnumber(tolua_S, static_cast<lua_Number>(res.second.z));\n\t\treturn 4;\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cBoundingBox_CalcLineIntersection(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\tbbox:CalcLineIntersection(pt1, pt2) -> bool, [number, blockface]\n\tcBoundingBox:CalcLineIntersection(min, max, pt1, pt2) -> bool, [number, blockface] (static)\n\t*/\n\tcLuaState L(a_LuaState);\n\tVector3d min;\n\tVector3d max;\n\tVector3d pt1;\n\tVector3d pt2;\n\tdouble lineCoeff;\n\teBlockFace blockFace;\n\tbool res;\n\tif (L.GetStackValues(2, min, max, pt1, pt2))  // Try the static signature first\n\t{\n\t\tres = cBoundingBox::CalcLineIntersection(min, max, pt1, pt2, lineCoeff, blockFace);\n\t}\n\telse\n\t{\n\t\tconst cBoundingBox * bbox;\n\t\tif (!L.GetStackValues(1, bbox, pt1, pt2))  // Try the regular signature\n\t\t{\n\t\t\tL.LogStackValues();\n\t\t\ttolua_error(a_LuaState, \"Invalid function params. Expected either bbox:CalcLineIntersection(pt1, pt2) or cBoundingBox:CalcLineIntersection(min, max, pt1, pt2).\", nullptr);\n\t\t\treturn 0;\n\t\t}\n\t\tres = bbox->CalcLineIntersection(pt1, pt2, lineCoeff, blockFace);\n\t}\n\tL.Push(res);\n\tif (res)\n\t{\n\t\tL.Push(lineCoeff, blockFace);\n\t\treturn 3;\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cBoundingBox_Intersect(lua_State * a_LuaState)\n{\n\t/* Function signature:\n\tbbox:Intersect(a_OtherBbox) -> bool, cBoundingBox\n\t*/\n\tcLuaState L(a_LuaState);\n\tconst cBoundingBox * self;\n\tconst cBoundingBox * other;\n\tif (!L.GetStackValues(1, self, other))\n\t{\n\t\tL.LogStackValues();\n\t\ttolua_error(a_LuaState, \"Invalid function params. Expected bbox:Intersect(otherBbox).\", nullptr);\n\t\treturn 0;\n\t}\n\tauto intersection = new cBoundingBox(*self);\n\tauto res = self->Intersect(*other, *intersection);\n\tL.Push(res);\n\tif (!res)\n\t{\n\t\tdelete intersection;\n\t\treturn 1;\n\t}\n\tL.Push(intersection);\n\ttolua_register_gc(L, lua_gettop(L));  // Make Lua own the \"intersection\" object\n\treturn 2;\n}\n\n\n\n\n\nstatic int tolua_cChunkDesc_GetBlockTypeMeta(lua_State * a_LuaState)\n{\n\t/* Function signature:\n\tChunkDesc:GetBlockTypeMeta(RelX, RelY, RelZ) -> BlockType, BlockMeta\n\t*/\n\n\tcLuaState L(a_LuaState);\n\tconst cChunkDesc * self;\n\tint relX, relY, relZ;\n\tif (!L.GetStackValues(1, self, relX, relY, relZ))\n\t{\n\t\tL.LogStackValues();\n\t\ttolua_error(a_LuaState, \"Invalid function params. Expected chunkDesc:GetBlockTypeMeta(relX, relY, relZ)\", nullptr);\n\t\treturn 0;\n\t}\n\tBLOCKTYPE blockType;\n\tNIBBLETYPE blockMeta;\n\tself->GetBlockTypeMeta(relX, relY, relZ, blockType, blockMeta);\n\tL.Push(blockType, blockMeta);\n\treturn 2;\n}\n\n\n\n\n\nstatic int tolua_cColor_GetColor(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\n\tcColor * self;\n\tif (!L.CheckParamSelf(\"cColor\") || !L.GetStackValue(1, self))\n\t{\n\t\treturn 0;\n\t}\n\n\tL.Push(self->GetRed(), self->GetGreen(), self->GetBlue());\n\treturn 3;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_new(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\tcCompositeChat()\n\tcCompositeChat(a_ParseText, a_MessageType)\n\t*/\n\n\t// Check if it's the no-param version:\n\tcLuaState L(a_LuaState);\n\tif (lua_isnone(a_LuaState, 2))\n\t{\n\t\tauto * res = static_cast<cCompositeChat *>(Mtolua_new(cCompositeChat()));\n\t\tL.Push(res);\n\t\treturn 1;\n\t}\n\n\t// Check the second signature:\n\tAString parseText;\n\tif (!L.GetStackValue(2, parseText))\n\t{\n\t\ttolua_Error err;\n\t\ttolua_error(a_LuaState, \"Invalid ParseText parameter (1) in cCompositeChat constructor.\", &err);\n\t\treturn 0;\n\t}\n\tint messageTypeInt = mtCustom;\n\tif (!lua_isnone(a_LuaState, 3))\n\t{\n\t\tif (!L.GetStackValue(3, messageTypeInt))\n\t\t{\n\t\t\ttolua_Error err;\n\t\t\ttolua_error(a_LuaState, \"Invalid type of the MessageType parameter (2) in cCompositeChat constructor.\", &err);\n\t\t\treturn 0;\n\t\t}\n\t\tif ((messageTypeInt < 0) || (messageTypeInt >= mtMaxPlusOne))\n\t\t{\n\t\t\ttolua_Error err;\n\t\t\ttolua_error(a_LuaState, \"Invalid MessageType parameter (2) value in cCompositeChat constructor.\", &err);\n\t\t\treturn 0;\n\t\t}\n\t}\n\tL.Push(static_cast<cCompositeChat *>(Mtolua_new(cCompositeChat(parseText, static_cast<eMessageType>(messageTypeInt)))));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_new_local(lua_State * a_LuaState)\n{\n\t// Use the same constructor as global, just register it for GC:\n\tauto res = tolua_cCompositeChat_new(a_LuaState);\n\tif (res == 1)\n\t{\n\t\ttolua_register_gc(a_LuaState, lua_gettop(a_LuaState));\n\t}\n\treturn res;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_AddShowAchievementPart(lua_State * tolua_S)\n{\n\t// function cCompositeChat:AddShowAchievementPart(PlayerName, Achievement, [Style])\n\t// Exported manually to support call-chaining (return *this)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cCompositeChat\") ||\n\t\t!L.CheckParamString(2, 3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function call cCompositeChat::AddShowAchievementPart(string, string, string) const.\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Add the part:\n\tAString PlayerName, Achievement, Style;\n\tL.GetStackValues(2, PlayerName);\n\tL.GetStackValues(3, Achievement);\n\tL.GetStackValues(4, Style);\n\tself->AddShowAchievementPart(PlayerName, Achievement, Style);\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(tolua_S, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_AddRunCommandPart(lua_State * tolua_S)\n{\n\t// function cCompositeChat:AddRunCommandPart(Message, Command, [Style])\n\t// Exported manually to support call-chaining (return *this)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cCompositeChat\") ||\n\t\t!L.CheckParamString(2, 3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cCompositeChat:AddRunCommandPart'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Add the part:\n\tAString Text, Command, Style = \"na\";\n\tL.GetStackValue(2, Text);\n\tL.GetStackValue(3, Command);\n\tL.GetStackValue(4, Style);\n\tself->AddRunCommandPart(Text, Command, Style);\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(L, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_AddSuggestCommandPart(lua_State * tolua_S)\n{\n\t// function cCompositeChat:AddSuggestCommandPart(Message, Command, [Style])\n\t// Exported manually to support call-chaining (return *this)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cCompositeChat\") ||\n\t\t!L.CheckParamString(2, 3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cCompositeChat:AddSuggestCommandPart'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Add the part:\n\tAString Text, Command, Style;\n\tL.GetStackValue(2, Text);\n\tL.GetStackValue(3, Command);\n\tL.GetStackValue(4, Style);\n\tself->AddSuggestCommandPart(Text, Command, Style);\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(L, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_AddTextPart(lua_State * tolua_S)\n{\n\t// function cCompositeChat:AddTextPart(Message, [Style])\n\t// Exported manually to support call-chaining (return *this)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cCompositeChat\") ||\n\t\t!L.CheckParamString(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cCompositeChat:AddTextPart'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Add the part:\n\tAString Text, Style;\n\tL.GetStackValue(2, Text);\n\tL.GetStackValue(3, Style);\n\tself->AddTextPart(Text, Style);\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(L, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_AddUrlPart(lua_State * tolua_S)\n{\n\t// function cCompositeChat:AddTextPart(Message, Url, [Style])\n\t// Exported manually to support call-chaining (return *this)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cCompositeChat\") ||\n\t\t!L.CheckParamString(2, 3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cCompositeChat:AddUrlPart'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Add the part:\n\tAString Text, Url, Style;\n\tL.GetStackValue(2, Text);\n\tL.GetStackValue(3, Url);\n\tL.GetStackValue(4, Style);\n\tself->AddUrlPart(Text, Url, Style);\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(L, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_Clear(lua_State * tolua_S)\n{\n\t// function cCompositeChat:Clear()\n\t// Exported manually to support call-chaining (return *this)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cCompositeChat\") ||\n\t\t!L.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cCompositeChat:ParseText'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Clear all the parts:\n\tself->Clear();\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(L, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_ParseText(lua_State * tolua_S)\n{\n\t// function cCompositeChat:ParseText(TextMessage)\n\t// Exported manually to support call-chaining (return *this)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cCompositeChat\") ||\n\t\t!L.CheckParamString(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cCompositeChat:ParseText'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Parse the text:\n\tAString Text;\n\tL.GetStackValue(2, Text);\n\tself->ParseText(Text);\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(L, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_SetMessageType(lua_State * tolua_S)\n{\n\t// function cCompositeChat:SetMessageType(MessageType)\n\t// Exported manually to support call-chaining (return *this)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cCompositeChat\") ||\n\t\t!L.CheckParamNumber(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cCompositeChat:SetMessageType'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Set the type:\n\tint MessageType = mtCustom;\n\tL.GetStackValue(2, MessageType);\n\tself->SetMessageType(static_cast<eMessageType>(MessageType));\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(L, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCompositeChat_UnderlineUrls(lua_State * tolua_S)\n{\n\t// function cCompositeChat:UnderlineUrls()\n\t// Exported manually to support call-chaining (return self)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamUserType(1, \"cCompositeChat\"))\n\t{\n\t\treturn 0;\n\t}\n\tcCompositeChat * self = static_cast<cCompositeChat *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"invalid 'self' in function 'cCompositeChat:UnderlineUrls'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Call the processing\n\tself->UnderlineUrls();\n\n\t// Cut away everything from the stack except for the cCompositeChat instance; return that:\n\tlua_settop(L, 1);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cCuboid_Assign(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\n\tif (!L.CheckParamSelf(\"cCuboid\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcCuboid * self = nullptr;\n\tL.GetStackValue(1, self);\n\n\t// Check the old coord-based signature:\n\tint x1, y1, z1, x2, y2, z2;\n\tif (L.GetStackValues(2, x1, y1, z1, x2, y2, z2))\n\t{\n\t\tLOGWARNING(\"cCuboid:Assign(x1, y1, z1, x2, y2, z2) is deprecated, use cCuboid:Assign(Vector3i, Vector3i) instead.\");\n\t\tL.LogStackTrace();\n\t\tself->Assign({x1, y1, z1}, {x2, y2, z2});\n\t\treturn 0;\n\t}\n\n\t// Try the (cCuboid) param version:\n\tcCuboid * other = nullptr;\n\tif (L.GetStackValue(2, other) && (other != nullptr))\n\t{\n\t\tself->Assign(*other);\n\t\treturn 0;\n\t}\n\n\t// Try the (Vector3i, Vector3i) param version:\n\tVector3i pt1;\n\tVector3i pt2;\n\tif (L.GetStackValues(2, pt1, pt2))\n\t{\n\t\tself->Assign(pt1, pt2);\n\t\treturn 0;\n\t}\n\treturn L.ApiParamError(\"Invalid parameter, expected either a cCuboid or two Vector3i-s.\");\n}\n\n\n\n\n\nstatic int tolua_cCuboid_IsInside(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\n\tif (!L.CheckParamSelf(\"cCuboid\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcCuboid * self = nullptr;\n\tL.GetStackValue(1, self);\n\n\t// Check the old coord-based signature:\n\tint x, y, z;\n\tif (L.GetStackValues(2, x, y, z))\n\t{\n\t\tLOGWARNING(\"cCuboid:IsInside(x, y, z) is deprecated, use cCuboid:IsInside(Vector3) instead.\");\n\t\tL.LogStackTrace();\n\t\tL.Push(self->IsInside(Vector3i{x, y, z}));\n\t\treturn 1;\n\t}\n\n\t// Try the Vector3 param version:\n\tVector3d pt;\n\tif (L.GetStackValue(2, pt))\n\t{\n\t\tL.Push(self->IsInside(pt));\n\t\treturn 1;\n\t}\n\treturn L.ApiParamError(\"Invalid parameter #2, expected a Vector3.\");\n}\n\n\n\n\n\nstatic int tolua_cCuboid_Move(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\n\tif (!L.CheckParamSelf(\"cCuboid\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcCuboid * self = nullptr;\n\tL.GetStackValue(1, self);\n\n\t// Check the old coord-based signature:\n\tint x, y, z;\n\tif (L.GetStackValues(2, x, y, z))\n\t{\n\t\tLOGWARNING(\"cCuboid:Move(x, y, z) is deprecated, use cCuboid:Move(Vector3i) instead.\");\n\t\tL.LogStackTrace();\n\t\tself->Move({x, y, z});\n\t\treturn 0;\n\t}\n\n\tVector3i offset;\n\tif (!L.GetStackValue(2, offset))\n\t{\n\t\treturn L.ApiParamError(\"Invalid parameter #2, expected a Vector3.\");\n\t}\n\tself->Move(offset);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cEntity_Destroy(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamSelf(\"cEntity\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcEntity * self = nullptr;\n\tL.GetStackValue(1, self);\n\n\tif (lua_gettop(L) == 2)\n\t{\n\t\tLOGWARNING(\"cEntity:Destroy(bool) is deprecated, use cEntity:Destroy() instead.\");\n\t}\n\n\tif (self->IsPlayer())\n\t{\n\t\treturn L.ApiParamError(\"Cannot call cEntity:Destroy() on a cPlayer, use cClientHandle:Kick() instead.\");\n\t}\n\n\tself->Destroy();\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cEntity_IsSubmerged(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamSelf(\"cEntity\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcEntity * self = nullptr;\n\tL.GetStackValue(1, self);\n\n\t// API function deprecated:\n\tLOGWARNING(\"cEntity:IsSubmerged() is deprecated. Use cEntity:IsHeadInWater() instead.\");\n\tcLuaState::LogStackTrace(tolua_S);\n\n\tL.Push(self->IsHeadInWater());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cEntity_IsSwimming(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamSelf(\"cEntity\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcEntity * self = nullptr;\n\tL.GetStackValue(1, self);\n\n\t// API function deprecated\n\tLOGWARNING(\"cEntity:IsSwimming() is deprecated. Use cEntity:IsInWater() instead.\");\n\tcLuaState::LogStackTrace(tolua_S);\n\n\tL.Push(self->IsInWater());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cEntity_GetPosition(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\n\t// Get the params:\n\tcEntity * self = static_cast<cEntity *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: invalid self (%p)\", __FUNCTION__, static_cast<void *>(self));\n\t\treturn 0;\n\t}\n\n\tL.Push(Mtolua_new((Vector3d)(self->GetPosition())));\n\n\ttolua_register_gc(L, lua_gettop(L));  // Make Lua own the object\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cEntity_GetSpeed(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\n\t// Get the params:\n\tcEntity * self = static_cast<cEntity *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (self == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: invalid self (%p)\", __FUNCTION__, static_cast<void *>(self));\n\t\treturn 0;\n\t}\n\n\tL.Push(Mtolua_new((Vector3d)(self->GetSpeed())));\n\n\ttolua_register_gc(L, lua_gettop(L));  // Make Lua own the object\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_get_StatisticsManager_Custom(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamNumber(2))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tlua_pushstring(tolua_S, \".self\");\n\tlua_rawget(tolua_S, 1);\n\tStatisticsManager * Self = static_cast<StatisticsManager *>(lua_touserdata(tolua_S, -1));\n\tCustomStatistic Statistic;\n\tif (!L.GetStackValue(2, Statistic))\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid custom statistic ID\");\n\t}\n\n\t// Push result if statistic exists:\n\tif (const auto Result = Self->Custom.find(Statistic); Result != Self->Custom.end())\n\t{\n\t\tL.Push(Result->second);\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_set_StatisticsManager_Custom(lua_State * tolua_S)\n{\n\t// Check the params:\n\tcLuaState L(tolua_S);\n\tif (!L.CheckParamNumber(2))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tlua_pushstring(tolua_S, \".self\");\n\tlua_rawget(tolua_S, 1);\n\tStatisticsManager * Self = static_cast<StatisticsManager *>(lua_touserdata(tolua_S, -1));\n\tCustomStatistic Statistic;\n\tStatisticsManager::StatValue Value;\n\tif (!L.GetStackValues(2, Statistic, Value))\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid custom statistic ID and value\");\n\t}\n\n\t// Set the value:\n\tSelf->Custom[Statistic] = Value;\n\n\treturn 0;\n}\n\n\n\n\n\nvoid cManualBindings::Bind(lua_State * tolua_S)\n{\n\ttolua_beginmodule(tolua_S, nullptr);\n\n\t\t// Create the new classes:\n\t\ttolua_usertype(tolua_S, \"cCryptoHash\");\n\t\ttolua_usertype(tolua_S, \"cLineBlockTracer\");\n\t\ttolua_usertype(tolua_S, \"cStringCompression\");\n\t\ttolua_usertype(tolua_S, \"cUrlParser\");\n\t\t// StatisticsManager was already created by cPlayer::GetStatistics' autogenerated bindings.\n\t\ttolua_cclass(tolua_S, \"cCryptoHash\",        \"cCryptoHash\",        \"\", nullptr);\n\t\ttolua_cclass(tolua_S, \"cLineBlockTracer\",   \"cLineBlockTracer\",   \"\", nullptr);\n\t\ttolua_cclass(tolua_S, \"cStringCompression\", \"cStringCompression\", \"\", nullptr);\n\t\ttolua_cclass(tolua_S, \"cUrlParser\",         \"cUrlParser\",         \"\", nullptr);\n\t\ttolua_cclass(tolua_S, \"StatisticsManager\",  \"StatisticsManager\",  \"\", nullptr);\n\n\t\t// Globals:\n\t\ttolua_function(tolua_S, \"Clamp\",                 tolua_Clamp);\n\t\ttolua_function(tolua_S, \"StringSplit\",           tolua_StringSplit);\n\t\ttolua_function(tolua_S, \"StringSplitWithQuotes\", tolua_StringSplitWithQuotes);\n\t\ttolua_function(tolua_S, \"StringSplitAndTrim\",    tolua_StringSplitAndTrim);\n\t\ttolua_function(tolua_S, \"LOG\",                   tolua_LOG);\n\t\ttolua_function(tolua_S, \"LOGINFO\",               tolua_LOGINFO);\n\t\ttolua_function(tolua_S, \"LOGWARN\",               tolua_LOGWARN);\n\t\ttolua_function(tolua_S, \"LOGWARNING\",            tolua_LOGWARN);\n\t\ttolua_function(tolua_S, \"LOGERROR\",              tolua_LOGERROR);\n\t\ttolua_function(tolua_S, \"Base64Encode\",          tolua_Base64Encode);\n\t\ttolua_function(tolua_S, \"Base64Decode\",          tolua_Base64Decode);\n\t\ttolua_function(tolua_S, \"md5\",                   tolua_md5_obsolete);  // OBSOLETE, use cCryptoHash.md5() instead\n\n\t\ttolua_beginmodule(tolua_S, \"cBoundingBox\");\n\t\t\ttolua_function(tolua_S, \"CalcLineIntersection\", tolua_cBoundingBox_CalcLineIntersection);\n\t\t\ttolua_function(tolua_S, \"Intersect\",            tolua_cBoundingBox_Intersect);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cChunkDesc\");\n\t\t\ttolua_function(tolua_S, \"GetBlockTypeMeta\", tolua_cChunkDesc_GetBlockTypeMeta);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cClientHandle\");\n\t\t\ttolua_constant(tolua_S, \"MAX_VIEW_DISTANCE\",   cClientHandle::MAX_VIEW_DISTANCE);\n\t\t\ttolua_constant(tolua_S, \"MIN_VIEW_DISTANCE\",   cClientHandle::MIN_VIEW_DISTANCE);\n\n\t\t\ttolua_function(tolua_S, \"GetForgeMods\", tolua_cClientHandle_GetForgeMods);\n\t\t\ttolua_function(tolua_S, \"SendPluginMessage\",   tolua_cClientHandle_SendPluginMessage);\n\t\t\ttolua_function(tolua_S, \"SendTimeUpdate\",      tolua_cClientHandle_SendTimeUpdate);\n\t\t\ttolua_function(tolua_S, \"GetUUID\",             tolua_cClientHandle_GetUUID);\n\t\t\ttolua_function(tolua_S, \"GenerateOfflineUUID\", tolua_cClientHandle_GenerateOfflineUUID);\n\t\t\ttolua_function(tolua_S, \"IsUUIDOnline\",        tolua_cClientHandle_IsUUIDOnline);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cColor\");\n\t\t\ttolua_function(tolua_S, \"GetColor\", tolua_cColor_GetColor);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cCompositeChat\");\n\t\t\ttolua_function(tolua_S, \"new\",                    tolua_cCompositeChat_new);\n\t\t\ttolua_function(tolua_S, \"new_local\",              tolua_cCompositeChat_new_local);\n\t\t\ttolua_function(tolua_S, \".call\",                  tolua_cCompositeChat_new_local);\n\t\t\ttolua_function(tolua_S, \"AddShowAchievementPart\", tolua_cCompositeChat_AddShowAchievementPart);\n\t\t\ttolua_function(tolua_S, \"AddRunCommandPart\",      tolua_cCompositeChat_AddRunCommandPart);\n\t\t\ttolua_function(tolua_S, \"AddSuggestCommandPart\",  tolua_cCompositeChat_AddSuggestCommandPart);\n\t\t\ttolua_function(tolua_S, \"AddTextPart\",            tolua_cCompositeChat_AddTextPart);\n\t\t\ttolua_function(tolua_S, \"AddUrlPart\",             tolua_cCompositeChat_AddUrlPart);\n\t\t\ttolua_function(tolua_S, \"Clear\",                  tolua_cCompositeChat_Clear);\n\t\t\ttolua_function(tolua_S, \"ParseText\",              tolua_cCompositeChat_ParseText);\n\t\t\ttolua_function(tolua_S, \"SetMessageType\",         tolua_cCompositeChat_SetMessageType);\n\t\t\ttolua_function(tolua_S, \"UnderlineUrls\",          tolua_cCompositeChat_UnderlineUrls);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cCryptoHash\");\n\t\t\ttolua_function(tolua_S, \"md5\", tolua_md5);\n\t\t\ttolua_function(tolua_S, \"md5HexString\", tolua_md5HexString);\n\t\t\ttolua_function(tolua_S, \"sha1\", tolua_sha1);\n\t\t\ttolua_function(tolua_S, \"sha1HexString\", tolua_sha1HexString);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cCuboid\");\n\t\t\ttolua_function(tolua_S, \"Assign\",   tolua_cCuboid_Assign);\n\t\t\ttolua_function(tolua_S, \"IsInside\", tolua_cCuboid_IsInside);\n\t\t\ttolua_function(tolua_S, \"Move\",     tolua_cCuboid_Move);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cEntity\");\n\t\t\ttolua_constant(tolua_S, \"INVALID_ID\", cEntity::INVALID_ID);\n\t\t\ttolua_function(tolua_S, \"Destroy\", tolua_cEntity_Destroy);\n\t\t\ttolua_function(tolua_S, \"IsSubmerged\", tolua_cEntity_IsSubmerged);\n\t\t\ttolua_function(tolua_S, \"IsSwimming\", tolua_cEntity_IsSwimming);\n\t\t\ttolua_function(tolua_S, \"GetPosition\", tolua_cEntity_GetPosition);\n\t\t\ttolua_function(tolua_S, \"GetSpeed\", tolua_cEntity_GetSpeed);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cFile\");\n\t\t\ttolua_function(tolua_S, \"ChangeFileExt\",           tolua_cFile_ChangeFileExt);\n\t\t\ttolua_function(tolua_S, \"Copy\",                    tolua_cFile_Copy);\n\t\t\ttolua_function(tolua_S, \"CreateFolder\",            tolua_cFile_CreateFolder);\n\t\t\ttolua_function(tolua_S, \"CreateFolderRecursive\",   tolua_cFile_CreateFolderRecursive);\n\t\t\ttolua_function(tolua_S, \"Delete\",                  tolua_cFile_Delete);\n\t\t\ttolua_function(tolua_S, \"DeleteFile\",              tolua_cFile_DeleteFile);\n\t\t\ttolua_function(tolua_S, \"DeleteFolder\",            tolua_cFile_DeleteFolder);\n\t\t\ttolua_function(tolua_S, \"DeleteFolderContents\",    tolua_cFile_DeleteFolderContents);\n\t\t\ttolua_function(tolua_S, \"Exists\",                  tolua_cFile_Exists);\n\t\t\ttolua_function(tolua_S, \"GetFolderContents\",       tolua_cFile_GetFolderContents);\n\t\t\ttolua_function(tolua_S, \"GetLastModificationTime\", tolua_cFile_GetLastModificationTime);\n\t\t\ttolua_function(tolua_S, \"GetSize\",                 tolua_cFile_GetSize);\n\t\t\ttolua_function(tolua_S, \"IsFile\",                  tolua_cFile_IsFile);\n\t\t\ttolua_function(tolua_S, \"IsFolder\",                tolua_cFile_IsFolder);\n\t\t\ttolua_function(tolua_S, \"ReadWholeFile\",           tolua_cFile_ReadWholeFile);\n\t\t\ttolua_function(tolua_S, \"Rename\",                  tolua_cFile_Rename);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cHopperEntity\");\n\t\t\ttolua_function(tolua_S, \"GetOutputBlockPos\", tolua_cHopperEntity_GetOutputBlockPos);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cItem\");\n\t\t\ttolua_function(tolua_S, \"EnchantByXPLevels\", tolua_cItem_EnchantByXPLevels);\n\t\t\ttolua_variable(tolua_S, \"m_LoreTable\",       tolua_get_cItem_m_LoreTable, tolua_set_cItem_m_LoreTable);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cItemGrid\");\n\t\t\ttolua_function(tolua_S, \"GetSlotCoords\", Lua_ItemGrid_GetSlotCoords);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cLineBlockTracer\");\n\t\t\ttolua_function(tolua_S, \"FirstSolidHitTrace\", tolua_cLineBlockTracer_FirstSolidHitTrace);\n\t\t\ttolua_function(tolua_S, \"LineOfSightTrace\",   tolua_cLineBlockTracer_LineOfSightTrace);\n\t\t\ttolua_function(tolua_S, \"Trace\",              tolua_cLineBlockTracer_Trace);\n\n\t\t\ttolua_constant(tolua_S, \"losAir\",   cLineBlockTracer::losAir);\n\t\t\ttolua_constant(tolua_S, \"losWater\", cLineBlockTracer::losWater);\n\t\t\ttolua_constant(tolua_S, \"losLava\",  cLineBlockTracer::losLava);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cLuaWindow\");\n\t\t\ttolua_function(tolua_S, \"new\",              tolua_cLuaWindow_new);\n\t\t\ttolua_function(tolua_S, \"new_local\",        tolua_cLuaWindow_new_local);\n\t\t\ttolua_function(tolua_S, \".call\",            tolua_cLuaWindow_new_local);\n\t\t\ttolua_function(tolua_S, \"SetOnClicked\",     tolua_SetObjectCallback<cLuaWindow, &cLuaWindow::SetOnClicked>);\n\t\t\ttolua_function(tolua_S, \"SetOnClosing\",     tolua_SetObjectCallback<cLuaWindow, &cLuaWindow::SetOnClosing>);\n\t\t\ttolua_function(tolua_S, \"SetOnSlotChanged\", tolua_SetObjectCallback<cLuaWindow, &cLuaWindow::SetOnSlotChanged>);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cMapManager\");\n\t\t\ttolua_function(tolua_S, \"DoWithMap\", DoWithID<cMapManager, cMap, &cMapManager::DoWithMap>);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cMobHeadEntity\");\n\t\t\ttolua_function(tolua_S, \"SetOwner\",     tolua_cMobHeadEntity_SetOwner);\n\t\t\ttolua_function(tolua_S, \"GetOwnerUUID\", tolua_cMobHeadEntity_GetOwnerUUID);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cMojangAPI\");\n\t\t\ttolua_function(tolua_S, \"AddPlayerNameToUUIDMapping\", tolua_cMojangAPI_AddPlayerNameToUUIDMapping);\n\t\t\ttolua_function(tolua_S, \"GetPlayerNameFromUUID\",      tolua_cMojangAPI_GetPlayerNameFromUUID);\n\t\t\ttolua_function(tolua_S, \"GetUUIDFromPlayerName\",      tolua_cMojangAPI_GetUUIDFromPlayerName);\n\t\t\ttolua_function(tolua_S, \"GetUUIDsFromPlayerNames\",    tolua_cMojangAPI_GetUUIDsFromPlayerNames);\n\t\t\ttolua_function(tolua_S, \"MakeUUIDDashed\",             tolua_cMojangAPI_MakeUUIDDashed);\n\t\t\ttolua_function(tolua_S, \"MakeUUIDShort\",              tolua_cMojangAPI_MakeUUIDShort);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cPlayer\");\n\t\t\ttolua_function(tolua_S, \"GetPermissions\",    tolua_cPlayer_GetPermissions);\n\t\t\ttolua_function(tolua_S, \"GetRestrictions\",   tolua_cPlayer_GetRestrictions);\n\t\t\ttolua_function(tolua_S, \"GetUUID\",           tolua_cPlayer_GetUUID);\n\t\t\ttolua_function(tolua_S, \"PermissionMatches\", tolua_cPlayer_PermissionMatches);\n\t\t\ttolua_function(tolua_S, \"PlaceBlock\",        tolua_cPlayer_PlaceBlock);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cPlugin\");\n\t\t\ttolua_function(tolua_S, \"GetDirectory\",      tolua_cPlugin_GetDirectory);\n\t\t\ttolua_function(tolua_S, \"GetLocalDirectory\", tolua_cPlugin_GetLocalDirectory);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cPluginLua\");\n\t\t\ttolua_function(tolua_S, \"AddWebTab\", tolua_cPluginLua_AddWebTab);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cPluginManager\");\n\t\t\ttolua_function(tolua_S, \"AddHook\",               tolua_cPluginManager_AddHook);\n\t\t\ttolua_function(tolua_S, \"BindCommand\",           tolua_cPluginManager_BindCommand);\n\t\t\ttolua_function(tolua_S, \"BindConsoleCommand\",    tolua_cPluginManager_BindConsoleCommand);\n\t\t\ttolua_function(tolua_S, \"CallPlugin\",            tolua_cPluginManager_CallPlugin);\n\t\t\ttolua_function(tolua_S, \"DoWithPlugin\",          StaticDoWith<cPluginManager, cPlugin, &cPluginManager::DoWithPlugin>);\n\t\t\ttolua_function(tolua_S, \"ExecuteConsoleCommand\", tolua_cPluginManager_ExecuteConsoleCommand);\n\t\t\ttolua_function(tolua_S, \"FindPlugins\",           tolua_cPluginManager_FindPlugins);\n\t\t\ttolua_function(tolua_S, \"ForEachCommand\",        tolua_cPluginManager_ForEachCommand);\n\t\t\ttolua_function(tolua_S, \"ForEachConsoleCommand\", tolua_cPluginManager_ForEachConsoleCommand);\n\t\t\ttolua_function(tolua_S, \"ForEachPlugin\",         StaticForEach<cPluginManager, cPlugin, &cPluginManager::ForEachPlugin>);\n\t\t\ttolua_function(tolua_S, \"GetAllPlugins\",         tolua_cPluginManager_GetAllPlugins);\n\t\t\ttolua_function(tolua_S, \"GetCurrentPlugin\",      tolua_cPluginManager_GetCurrentPlugin);\n\t\t\ttolua_function(tolua_S, \"GetPlugin\",             tolua_cPluginManager_GetPlugin);\n\t\t\ttolua_function(tolua_S, \"LogStackTrace\",         tolua_cPluginManager_LogStackTrace);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cRoot\");\n\t\t\ttolua_function(tolua_S, \"DoWithPlayerByUUID\",  tolua_cRoot_DoWithPlayerByUUID);\n\t\t\ttolua_function(tolua_S, \"FindAndDoWithPlayer\", DoWith <cRoot, cPlayer, &cRoot::FindAndDoWithPlayer>);\n\t\t\ttolua_function(tolua_S, \"ForEachPlayer\",       ForEach<cRoot, cPlayer, &cRoot::ForEachPlayer>);\n\t\t\ttolua_function(tolua_S, \"ForEachWorld\",        ForEach<cRoot, cWorld,  &cRoot::ForEachWorld>);\n\t\t\ttolua_function(tolua_S, \"GetBrewingRecipe\",    tolua_cRoot_GetBrewingRecipe);\n\t\t\ttolua_function(tolua_S, \"GetBuildCommitID\",    tolua_cRoot_GetBuildCommitID);\n\t\t\ttolua_function(tolua_S, \"GetBuildDateTime\",    tolua_cRoot_GetBuildDateTime);\n\t\t\ttolua_function(tolua_S, \"GetBuildID\",          tolua_cRoot_GetBuildID);\n\t\t\ttolua_function(tolua_S, \"GetBuildSeriesName\",  tolua_cRoot_GetBuildSeriesName);\n\t\t\ttolua_function(tolua_S, \"GetFurnaceRecipe\",    tolua_cRoot_GetFurnaceRecipe);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cScoreboard\");\n\t\t\ttolua_function(tolua_S, \"ForEachObjective\", ForEach<cScoreboard, cObjective, &cScoreboard::ForEachObjective>);\n\t\t\ttolua_function(tolua_S, \"ForEachTeam\",      ForEach<cScoreboard, cTeam,      &cScoreboard::ForEachTeam>);\n\t\t\ttolua_function(tolua_S, \"GetTeamNames\",     tolua_cScoreboard_GetTeamNames);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cServer\");\n\t\t\ttolua_function(tolua_S, \"RegisterForgeMod\",            tolua_cServer_RegisterForgeMod);\n\t\t\ttolua_function(tolua_S, \"ScheduleTask\", tolua_cServer_ScheduleTask);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cStringCompression\");\n\t\t\ttolua_function(tolua_S, \"CompressStringZLIB\",     tolua_CompressStringZLIB);\n\t\t\ttolua_function(tolua_S, \"UncompressStringZLIB\",   tolua_UncompressStringZLIB);\n\t\t\ttolua_function(tolua_S, \"CompressStringGZIP\",     tolua_CompressStringGZIP);\n\t\t\ttolua_function(tolua_S, \"UncompressStringGZIP\",   tolua_InflateString);\n\t\t\ttolua_function(tolua_S, \"InflateString\",          tolua_InflateString);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cUrlParser\");\n\t\t\ttolua_function(tolua_S, \"GetDefaultPort\",     tolua_cUrlParser_GetDefaultPort);\n\t\t\ttolua_function(tolua_S, \"IsKnownScheme\",      tolua_cUrlParser_IsKnownScheme);\n\t\t\ttolua_function(tolua_S, \"Parse\",              tolua_cUrlParser_Parse);\n\t\t\ttolua_function(tolua_S, \"ParseAuthorityPart\", tolua_cUrlParser_ParseAuthorityPart);\n\t\t\ttolua_function(tolua_S, \"UrlDecode\",          tolua_cUrlParser_UrlDecode);\n\t\t\ttolua_function(tolua_S, \"UrlEncode\",          tolua_cUrlParser_UrlEncode);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"cWebAdmin\");\n\t\t\ttolua_function(tolua_S, \"AddWebTab\",                 tolua_cWebAdmin_AddWebTab);\n\t\t\ttolua_function(tolua_S, \"GetAllWebTabs\",             tolua_cWebAdmin_GetAllWebTabs);\n\t\t\ttolua_function(tolua_S, \"GetPage\",                   tolua_cWebAdmin_GetPage);\n\t\t\ttolua_function(tolua_S, \"GetURLEncodedString\",       tolua_cWebAdmin_GetURLEncodedString);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"HTTPRequest\");\n\t\t\ttolua_variable(tolua_S, \"FormData\",   tolua_get_HTTPRequest_FormData,   nullptr);\n\t\t\ttolua_variable(tolua_S, \"Params\",     tolua_get_HTTPRequest_Params,     nullptr);\n\t\t\ttolua_variable(tolua_S, \"PostParams\", tolua_get_HTTPRequest_PostParams, nullptr);\n\t\ttolua_endmodule(tolua_S);\n\n\t\ttolua_beginmodule(tolua_S, \"StatisticsManager\");\n\t\t\ttolua_array(tolua_S, \"Custom\", tolua_get_StatisticsManager_Custom, tolua_set_StatisticsManager_Custom);\n\t\ttolua_endmodule(tolua_S);\n\n\t\tBindNetwork(tolua_S);\n\t\tBindRankManager(tolua_S);\n\t\tBindWorld(tolua_S);\n\t\tBindBlockArea(tolua_S);\n\n\ttolua_endmodule(tolua_S);\n}\n"
  },
  {
    "path": "src/Bindings/ManualBindings.h",
    "content": "\n// ManualBindings.h\n\n// Declares the cManualBindings class used as a namespace for functions exported to the Lua API manually\n\n\n\n\n\n#pragma once\n\n#include \"LuaState.h\"\n\n\n\n\n// fwd:\nstruct tolua_Error;\nclass cPluginLua;\n\n\n\n\n\n/** Provides namespace for the bindings. */\nclass cManualBindings\n{\npublic:\n\t/** Binds all the manually implemented functions to tolua_S. */\n\tstatic void Bind(lua_State * tolua_S);\n\nprotected:\n\t/** Binds the manually implemented cNetwork-related API to tolua_S.\n\tImplemented in ManualBindings_Network.cpp. */\n\tstatic void BindNetwork(lua_State * tolua_S);\n\n\t/** Binds the manually implemented cRankManager glue code to tolua_S.\n\tImplemented in ManualBindings_RankManager.cpp. */\n\tstatic void BindRankManager(lua_State * tolua_S);\n\n\t/** Binds the manually implemented cWorld API functions to tolua_S.\n\tImplemented in ManualBindings_World.cpp. */\n\tstatic void BindWorld(lua_State * tolua_S);\n\n\t/** Binds the manually implemented cBlockArea API functions to tlua_S.\n\tImplemented in ManualBindings_BlockArea.cpp. */\n\tstatic void BindBlockArea(lua_State * tolua_S);\n\n\npublic:\n\t// Helper functions:\n\tstatic cPluginLua * GetLuaPlugin(lua_State * L);\n\tstatic int tolua_do_error(lua_State * L, const char * a_pMsg, tolua_Error * a_pToLuaError);\n\tstatic int vlua_do_error(lua_State * L, const char * a_pFormat, fmt::printf_args a_ArgList);\n\ttemplate <typename... Args>\n\tstatic int lua_do_error(lua_State * L, const char * a_Format, const Args & ... a_Args)\n\t{\n\t\treturn vlua_do_error(L, a_Format, fmt::make_printf_args(a_Args...));\n\t}\n\n\n\t/** Binds the DoWith(ItemName) functions of regular classes. */\n\ttemplate <\n\t\tclass Ty1,\n\t\tclass Ty2,\n\t\tbool (Ty1::*DoWithFn)(const AString &, cFunctionRef<bool(Ty2 &)>)\n\t>\n\tstatic int DoWith(lua_State * tolua_S)\n\t{\n\t\t// Check params:\n\t\tcLuaState L(tolua_S);\n\t\tif (\n\t\t\t!L.CheckParamString(2) ||\n\t\t\t!L.CheckParamFunction(3)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Get parameters:\n\t\tTy1 * Self;\n\t\tAString ItemName;\n\t\tcLuaState::cRef FnRef;\n\t\tL.GetStackValues(1, Self, ItemName, FnRef);\n\t\tif (Self == nullptr)\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t\t}\n\t\tif (ItemName.empty() || (ItemName[0] == 0))\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Expected a non-empty string for parameter #1\");\n\t\t}\n\t\tif (!FnRef.IsValid())\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Expected a valid callback function for parameter #2\");\n\t\t}\n\n\t\t// Call the DoWith function:\n\t\tbool res = (Self->*DoWithFn)(ItemName, [&](Ty2 & a_Item)\n\t\t\t{\n\t\t\t\tbool ret = false;\n\t\t\t\tL.Call(FnRef, &a_Item, cLuaState::Return, ret);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t);\n\n\t\t// Push the result as the return value:\n\t\tL.Push(res);\n\t\treturn 1;\n\t}\n\n\n\n\n\n\t/** Template for static functions DoWith(ItemName), on a type that has a static ::Get() function. */\n\ttemplate <\n\t\tclass Ty1,\n\t\tclass Ty2,\n\t\tbool (Ty1::*DoWithFn)(const AString &, cFunctionRef<bool(Ty2 &)>)\n\t>\n\tstatic int StaticDoWith(lua_State * tolua_S)\n\t{\n\t\t// Check params:\n\t\tcLuaState L(tolua_S);\n\t\tif (\n\t\t\t!L.CheckParamString(2) ||\n\t\t\t!L.CheckParamFunction(3)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Get parameters:\n\t\tAString ItemName;\n\t\tcLuaState::cRef FnRef;\n\t\tL.GetStackValues(2, ItemName, FnRef);\n\t\tif (ItemName.empty() || (ItemName[0] == 0))\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Expected a non-empty string for parameter #1\");\n\t\t}\n\t\tif (!FnRef.IsValid())\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Expected a valid callback function for parameter #2\");\n\t\t}\n\n\t\t// Call the DoWith function:\n\t\tbool res = (Ty1::Get()->*DoWithFn)(ItemName, [&](Ty2 & a_Item)\n\t\t\t{\n\t\t\t\tbool ret = false;\n\t\t\t\tL.Call(FnRef, &a_Item, cLuaState::Return, ret);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t);\n\n\t\t// Push the result as the return value:\n\t\tL.Push(res);\n\t\treturn 1;\n\t}\n\n\n\n\n\n\ttemplate <\n\t\tclass Ty1,\n\t\tclass Ty2,\n\t\tbool (Ty1::*DoWithFn)(UInt32, cFunctionRef<bool(Ty2 &)>)\n\t>\n\tstatic int DoWithID(lua_State * tolua_S)\n\t{\n\t\t// Check params:\n\t\tcLuaState L(tolua_S);\n\t\tif (\n\t\t\t!L.CheckParamNumber(2) ||\n\t\t\t!L.CheckParamFunction(3)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Get parameters:\n\t\tTy1 * Self = nullptr;\n\t\tUInt32 ItemID = 0;\n\t\tcLuaState::cRef FnRef;\n\t\tL.GetStackValues(1, Self, ItemID, FnRef);\n\t\tif (Self == nullptr)\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t\t}\n\t\tif (!FnRef.IsValid())\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Expected a valid callback function for parameter #2\");\n\t\t}\n\n\t\t// Call the DoWith function:\n\t\tbool res = (Self->*DoWithFn)(ItemID, [&](Ty2 & a_Item)\n\t\t\t{\n\t\t\t\tbool ret = false;\n\t\t\t\tL.Call(FnRef, &a_Item, cLuaState::Return, ret);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t);\n\n\t\t// Push the result as the return value:\n\t\tL.Push(res);\n\t\treturn 1;\n\t}\n\n\n\n\n\n\ttemplate <\n\t\tclass Ty1,\n\t\tclass Ty2,\n\t\tbool (Ty1::*ForEachFn)(cFunctionRef<bool(Ty2 &)>)\n\t>\n\tstatic int ForEach(lua_State * tolua_S)\n\t{\n\t\t// Check params:\n\t\tcLuaState L(tolua_S);\n\t\tif (\n\t\t\t!L.CheckParamFunction(2) ||\n\t\t\t!L.CheckParamEnd(3)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Get the params:\n\t\tTy1 * Self = nullptr;\n\t\tcLuaState::cRef FnRef;\n\t\tL.GetStackValues(1, Self, FnRef);\n\t\tif (Self == nullptr)\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'.\");\n\t\t}\n\t\tif (!FnRef.IsValid())\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Expected a valid callback function for parameter #1\");\n\t\t}\n\n\t\t// Call the enumeration:\n\t\tbool res = (Self->*ForEachFn)([&](Ty2 & a_Item)\n\t\t\t{\n\t\t\t\tbool ret = false;  // By default continue the enumeration\n\t\t\t\tL.Call(FnRef, &a_Item, cLuaState::Return, ret);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t);\n\n\t\t// Push the return value:\n\t\tL.Push(res);\n\t\treturn 1;\n\t}\n\n\n\n\n\n\t/** Implements bindings for ForEach() functions in a class that is static (has a ::Get() static function). */\n\ttemplate <\n\t\tclass Ty1,\n\t\tclass Ty2,\n\t\tbool (Ty1::*ForEachFn)(cFunctionRef<bool(Ty2 &)>)\n\t>\n\tstatic int StaticForEach(lua_State * tolua_S)\n\t{\n\t\t// Check params:\n\t\tcLuaState L(tolua_S);\n\t\tif (\n\t\t\t!L.CheckParamFunction(2) ||\n\t\t\t!L.CheckParamEnd(3)\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Get the params:\n\t\tcLuaState::cRef FnRef(L, 2);\n\t\tif (!FnRef.IsValid())\n\t\t{\n\t\t\treturn lua_do_error(tolua_S, \"Error in function call '#funcname#': Expected a valid callback function for parameter #1\");\n\t\t}\n\n\t\t// Call the enumeration:\n\t\tbool res = (Ty1::Get()->*ForEachFn)([&](Ty2 & a_Item)\n\t\t\t{\n\t\t\t\tbool ret = false;  // By default continue the enumeration\n\t\t\t\tL.Call(FnRef, &a_Item, cLuaState::Return, ret);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t);\n\n\t\t// Push the return value:\n\t\tL.Push(res);\n\t\treturn 1;\n\t}\n};\n"
  },
  {
    "path": "src/Bindings/ManualBindings_BlockArea.cpp",
    "content": "// ManualBindings_BlockArea.cpp\n\n// Implements the manual bindings for functions in the cBlockArea class\n\n#include \"Globals.h\"\n#include \"tolua++/include/tolua++.h\"\n#include \"../BlockArea.h\"\n#include \"../World.h\"\n#include \"ManualBindings.h\"\n#include \"LuaState.h\"\n#include \"PluginLua.h\"\n#include \"../WorldStorage/SchematicFileSerializer.h\"\n\n\n\n\n\n/** Template for the bindings for the DoWithXYZAt(X, Y, Z) functions that need to check their coords. */\ntemplate <\n\tclass SELF,\n\tclass ITEM,\n\tbool (SELF::*DoWithFn)(int, int, int, cFunctionRef<bool(ITEM &)>),\n\tbool (SELF::*CoordCheckFn)(int, int, int) const\n>\nstatic int DoWithXYZ(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamNumber(2, 4) ||\n\t\t!L.CheckParamFunction(5) ||\n\t\t!L.CheckParamEnd(6)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get parameters:\n\tSELF * Self = nullptr;\n\tint BlockX = 0;\n\tint BlockY = 0;\n\tint BlockZ = 0;\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(1, Self, BlockX, BlockY, BlockZ, FnRef);\n\tif (Self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self'\");\n\t}\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid callback function for parameter #5\");\n\t}\n\tif (!(Self->*CoordCheckFn)(BlockX, BlockY, BlockZ))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The provided coordinates ({0}) are not valid\"),\n\t\t\tVector3i{BlockX, BlockY, BlockZ}\n\t\t));\n\t}\n\n\t// Call the DoWith function:\n\tbool res = (Self->*DoWithFn)(BlockX, BlockY, BlockZ, [&](ITEM & a_Item)\n\t\t{\n\t\t\tbool ret = false;\n\t\t\tL.Call(FnRef, &a_Item, cLuaState::Return, ret);\n\t\t\treturn ret;\n\t\t}\n\t);\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Reads params that together form a Cuboid.\nThese can be:\n\t- 6 numbers (MinX, MaxX, MinY, MaxY, MinZ, MaxZ)\n\t- 2 Vector3-s (Min, Max)\n\t- cCuboid\nReturns the index of the first parameter following the Cuboid spec.\nRaises an Api error if the params don't specify a Cuboid.\n*/\nstatic int readCuboidOverloadParams(cLuaState & a_LuaState, int a_StartParam, cCuboid & a_Cuboid)\n{\n\tif (a_LuaState.IsParamNumber(a_StartParam))\n\t{\n\t\t// Assume the 6-number version:\n\t\tif (!a_LuaState.GetStackValues(a_StartParam, a_Cuboid.p1.x, a_Cuboid.p2.x, a_Cuboid.p1.y, a_Cuboid.p2.y, a_Cuboid.p1.z, a_Cuboid.p2.z))\n\t\t{\n\t\t\treturn a_LuaState.ApiParamError(\"Cannot read the bounds parameters, expected 6 numbers\");\n\t\t}\n\t\treturn a_StartParam + 6;\n\t}\n\telse if (a_LuaState.IsParamUserType(a_StartParam, \"cCuboid\"))\n\t{\n\t\t// Assume the cCuboid version:\n\t\tcCuboid * c;\n\t\tif (!a_LuaState.GetStackValues(a_StartParam, c))\n\t\t{\n\t\t\treturn a_LuaState.ApiParamError(\"Cannot read the bounds parameter, expected a cCuboid instance\");\n\t\t}\n\t\ta_Cuboid = *c;\n\t\treturn a_StartParam + 1;\n\t}\n\telse\n\t{\n\t\t// Assume the 2-Vector3i version:\n\t\tif (!a_LuaState.GetStackValues(a_StartParam, a_Cuboid.p1, a_Cuboid.p2))\n\t\t{\n\t\t\treturn a_LuaState.ApiParamError(\"Cannot read the bounds parameter, expected two Vector3i instances\");\n\t\t}\n\t\treturn a_StartParam + 2;\n\t}\n}\n\n\n\n\n\n/** Reads params that together form a Vector3i.\nThese can be:\n\t- 3 numbers (x, y, z)\n\t- Vector3i\nReturns the index of the first parameter following the Vector3i spec.\nRaises an Api error if the params don't specify a Vector3i.\n*/\nstatic int readVector3iOverloadParams(cLuaState & a_LuaState, int a_StartParam, Vector3i & a_Coords, const char * a_ParamName)\n{\n\tif (a_LuaState.IsParamNumber(a_StartParam))\n\t{\n\t\t// Assume the 3-number version:\n\t\tif (!a_LuaState.GetStackValues(a_StartParam, a_Coords.x, a_Coords.y, a_Coords.z))\n\t\t{\n\t\t\treturn a_LuaState.ApiParamError(fmt::format(FMT_STRING(\"Cannot read the {}, expected 3 numbers\"), a_ParamName));\n\t\t}\n\t\treturn a_StartParam + 3;\n\t}\n\telse\n\t{\n\t\t// Assume the Vector3i version:\n\t\tif (!a_LuaState.GetStackValues(a_StartParam, a_Coords))\n\t\t{\n\t\t\treturn a_LuaState.ApiParamError(fmt::format(FMT_STRING(\"Cannot read the {}, expected a Vector3i instance\"), a_ParamName));\n\t\t}\n\t\treturn a_StartParam + 1;\n\t}\n}\n\n\n\n\n\n/** Binding for the cBlockArea::Create() functions. Supports two overloads and one default parameter. */\nstatic int tolua_cBlockArea_Create(lua_State * a_LuaState)\n{\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\tcBlockArea * self = nullptr;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read self\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\tint dataTypes = cBlockArea::baTypes | cBlockArea::baMetas | cBlockArea::baBlockEntities;\n\tVector3i size;\n\tauto dataTypesIdx = readVector3iOverloadParams(L, 2, size, \"size\");\n\tL.GetStackValue(dataTypesIdx, dataTypes);\n\tif (!cBlockArea::IsValidDataTypeCombination(dataTypes))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Invalid combination of baDataTypes specified (0x{:02x})\"), dataTypes));\n\t}\n\n\t// Create the area:\n\tif ((size.x <= 0) || (size.y <= 0) || (size.z <= 0))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Invalid sizes, must be greater than zero, got {}\"), size));\n\t}\n\tASSERT(self != nullptr);\n\tself->Create(size, dataTypes);\n\treturn 0;\n}\n\n\n\n\n\n/** Bindings for the cBlockArea:FillRelCuboid() functions. Supports coord overloads and one default parameter. */\nstatic int tolua_cBlockArea_FillRelCuboid(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the common params:\n\tcBlockArea * self = nullptr;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read self\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\t// Check and get the overloaded params:\n\tcCuboid bounds;\n\tauto nextIdx = readCuboidOverloadParams(L, 2, bounds);\n\tbounds.Sort();\n\tif (!(self->IsValidRelCoords(bounds.p1) && self->IsValidRelCoords(bounds.p2)))\n\t{\n\t\treturn L.ApiParamError(fmt::format(\n\t\t\tFMT_STRING(\"The bounds ({0} - {1}) are out of range ({2} - {3})\"),\n\t\t\tbounds.p1,\n\t\t\tbounds.p2,\n\t\t\tVector3i(0, 0, 0),\n\t\t\t(self->GetSize() - Vector3i{1, 1, 1})\n\t\t));\n\t}\n\tint dataTypes = cBlockArea::baTypes | cBlockArea::baMetas | cBlockArea::baBlockEntities;\n\tBLOCKTYPE blockType;\n\tNIBBLETYPE blockMeta = 0, blockLight = 0, blockSkyLight = 0x0f;\n\tif (!L.GetStackValues(nextIdx, dataTypes, blockType))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the datatypes or block type params\");\n\t}\n\tL.GetStackValues(nextIdx + 2, blockMeta, blockLight, blockSkyLight);  // These values are optional\n\tif (!cBlockArea::IsValidDataTypeCombination(dataTypes))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Invalid baDataTypes combination (0x{:02x})\"), dataTypes));\n\t}\n\n\t// Do the actual Fill:\n\tself->FillRelCuboid(bounds, dataTypes, blockType, blockMeta, blockLight, blockSkyLight);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_GetBlockTypeMeta(lua_State * a_LuaState)\n{\n\t// function cBlockArea::GetBlockTypeMeta()\n\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read 'self'\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\tVector3i coords;\n\treadVector3iOverloadParams(L, 2, coords, \"coords\");\n\tif (!self->IsValidCoords(coords))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Coords ({0}) out of range ({1} - {2})\"),\n\t\t\tcoords, self->GetOrigin(), self->GetOrigin() + self->GetSize() - Vector3i{1, 1, 1}\n\t\t));\n\t}\n\tBLOCKTYPE blockType;\n\tNIBBLETYPE blockMeta;\n\tself->GetBlockTypeMeta(coords.x, coords.y, coords.z, blockType, blockMeta);\n\tL.Push(blockType, blockMeta);\n\treturn 2;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_GetCoordRange(lua_State * a_LuaState)\n{\n\t// function cBlockArea::GetCoordRange()\n\t// Returns all three sizes of the area, each minus one, so that they represent the maximum coord value\n\t// Exported manually because there's no direct C++ equivalent,\n\t// plus tolua would generate extra input params for the outputs\n\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' parameter\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\tL.Push(self->GetSizeX() - 1, self->GetSizeY() - 1, self->GetSizeZ() - 1);\n\treturn 3;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_GetNonAirCropRelCoords(lua_State * a_LuaState)\n{\n\t// function cBlockArea::GetNonAirCropRelCoords()\n\t// Exported manually because tolua would generate extra input params for the outputs\n\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcBlockArea * self = nullptr;\n\tBLOCKTYPE ignoreBlockType = E_BLOCK_AIR;\n\tif (!L.GetStackValues(1, self, ignoreBlockType))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read params\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\tif (!self->HasBlockTypes())\n\t{\n\t\treturn L.ApiParamError(\"The area doesn't contain baTypes datatype\");\n\t}\n\n\t// Calculate the crop coords:\n\tint minRelX, minRelY, minRelZ, maxRelX, maxRelY, maxRelZ;\n\tself->GetNonAirCropRelCoords(minRelX, minRelY, minRelZ, maxRelX, maxRelY, maxRelZ, ignoreBlockType);\n\n\t// Push the six crop coords:\n\tL.Push(minRelX, minRelY, minRelZ, maxRelX, maxRelY, maxRelZ);\n\treturn 6;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_GetOrigin(lua_State * a_LuaState)\n{\n\t// function cBlockArea::GetOrigin()\n\t// Returns all three coords of the origin point\n\t// Exported manually because there's no direct C++ equivalent,\n\t// plus tolua would generate extra input params for the outputs\n\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' parameter\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\t// Push the three origin coords:\n\tL.Push(self->GetOriginX(), self->GetOriginY(), self->GetOriginZ());\n\treturn 3;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_GetRelBlockTypeMeta(lua_State * a_LuaState)\n{\n\t// function cBlockArea::GetRelBlockTypeMeta()\n\t// Exported manually because tolua generates extra input params for the outputs\n\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' parameter\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\tif (!self->HasBlockTypes())\n\t{\n\t\treturn L.ApiParamError(\"The area doesn't contain baTypes datatype\");\n\t}\n\tif (!self->HasBlockMetas())\n\t{\n\t\treturn L.ApiParamError(\"The area doesn't contain baMetas datatype\");\n\t}\n\n\tVector3i coords;\n\treadVector3iOverloadParams(L, 2, coords, \"coords\");\n\tif (!self->IsValidRelCoords(coords))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The coords ({0}) are out of range (max {1})\"),\n\t\t\tcoords, (self->GetSize() - Vector3i{1, 1, 1})\n\t\t));\n\t}\n\tBLOCKTYPE blockType;\n\tNIBBLETYPE blockMeta;\n\tself->GetRelBlockTypeMeta(coords.x, coords.y, coords.z, blockType, blockMeta);\n\tL.Push(blockType, blockMeta);\n\treturn 2;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_GetSize(lua_State * a_LuaState)\n{\n\t// function cBlockArea::GetSize()\n\t// Returns all three sizes of the area\n\t// Exported manually because there's no direct C++ equivalent,\n\t// plus tolua would generate extra input params for the outputs\n\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' parameter\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\tL.Push(self->GetSizeX(), self->GetSizeY(), self->GetSizeZ());\n\treturn 3;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_LoadFromSchematicFile(lua_State * a_LuaState)\n{\n\t// function cBlockArea::LoadFromSchematicFile\n\t// Exported manually because function has been moved to SchematicFileSerializer.cpp\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamSelf(\"cBlockArea\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcBlockArea * self;\n\tAString fileName;\n\tif (!L.GetStackValues(1, self, fileName))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the parameters\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\ttry\n\t{\n\t\tcSchematicFileSerializer::LoadFromSchematicFile(*self, fileName);\n\t\tL.Push(true);\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(Oops.what());\n\t\tL.LogStackTrace();\n\t\tL.Push(false);\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_LoadFromSchematicString(lua_State * a_LuaState)\n{\n\t// function cBlockArea::LoadFromSchematicString\n\t// Exported manually because function has been moved to SchematicFileSerializer.cpp\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamSelf(\"cBlockArea\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcBlockArea * self;\n\tContiguousByteBuffer data;\n\tif (!L.GetStackValues(1, self, data))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the parameters\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\ttry\n\t{\n\t\tcSchematicFileSerializer::LoadFromSchematicString(*self, data);\n\t\tL.Push(true);\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(Oops.what());\n\t\tL.LogStackTrace();\n\t\tL.Push(false);\n\t}\n\treturn 1;\n}\n\n\n\n\n\n/** Bindings for the cBlockArea:Read() functions. Supports three overloads and one default parameter. */\nstatic int tolua_cBlockArea_Read(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamSelf(\"cBlockArea\") ||\n\t\t!L.CheckParamUserType(2, \"cWorld\")\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the common params:\n\tcBlockArea * self = nullptr;\n\tcWorld * world = nullptr;\n\tif (!L.GetStackValues(1, self, world))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read self or world\");\n\t}\n\tif (world == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid world instance. The world must be not nil\");\n\t}\n\n\t// Check and get the overloaded params:\n\tcCuboid bounds;\n\tint dataTypes = cBlockArea::baTypes | cBlockArea::baMetas | cBlockArea::baBlockEntities;\n\tauto dataTypesIdx = readCuboidOverloadParams(L, 3, bounds);\n\tL.GetStackValues(dataTypesIdx, dataTypes);\n\tif (!cBlockArea::IsValidDataTypeCombination(dataTypes))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Invalid baDataTypes combination (0x{:02x})\"), dataTypes));\n\t}\n\n\t// Check the coords:\n\tif (!cChunkDef::IsValidHeight(bounds.p1) || !cChunkDef::IsValidHeight(bounds.p2))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Coordinates {0} - {1} exceed world bounds\"), bounds.p1, bounds.p2));\n\t}\n\n\tbounds.Sort();\n\n\t// Do the actual read:\n\tL.Push(self->Read(*world, bounds, dataTypes));\n\treturn 1;\n}\n\n\n\n\n\n/** Bindings for the cBlockArea:RelLine() functions. Supports two overloads and one default parameter.\nAlso supports \"bastard overloads\" (Vector3i, x, y, z), but we don't advertise those. */\nstatic int tolua_cBlockArea_RelLine(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the common params:\n\tcBlockArea * self = nullptr;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read self\");\n\t}\n\n\t// Check and get the overloaded params:\n\tVector3i p1;\n\tauto idx = readVector3iOverloadParams(L, 2, p1, \"start coords\");\n\tVector3i p2;\n\tidx = readVector3iOverloadParams(L, idx, p2, \"end coords\");\n\tint dataTypes = cBlockArea::baTypes | cBlockArea::baMetas | cBlockArea::baBlockEntities;\n\tBLOCKTYPE blockType;\n\tNIBBLETYPE blockMeta, blockLight, blockSkyLight;\n\tL.GetStackValues(idx, dataTypes, blockType, blockMeta, blockLight, blockSkyLight);\n\tif (!cBlockArea::IsValidDataTypeCombination(dataTypes))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Invalid baDataTypes combination (0x{:02x})\"), dataTypes));\n\t}\n\tif ((self->GetDataTypes() & dataTypes) != dataTypes)\n\t{\n\t\treturn L.ApiParamError(fmt::format(\n\t\t\tFMT_STRING(\"Requested datatypes not present in the cBlockArea. Got only 0x{:02x}, requested 0x{:02x}\"),\n\t\t\tself->GetDataTypes(), dataTypes\n\t\t));\n\t}\n\n\t// Draw the line:\n\tself->RelLine(p1, p2, dataTypes, blockType, blockMeta, blockLight, blockSkyLight);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_SaveToSchematicFile(lua_State * a_LuaState)\n{\n\t// function cBlockArea::SaveToSchematicFile\n\t// Exported manually because function has been moved to SchematicFileSerializer.cpp\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamSelf(\"cBlockArea\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcBlockArea * self;\n\tAString fileName;\n\tif (!L.GetStackValues(1, self, fileName))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the parameters\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\ttry\n\t{\n\t\tcSchematicFileSerializer::SaveToSchematicFile(*self, fileName);\n\t\tL.Push(true);\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(Oops.what());\n\t\tL.LogStackTrace();\n\t\tL.Push(false);\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_SaveToSchematicString(lua_State * a_LuaState)\n{\n\t// function cBlockArea::SaveToSchematicString\n\t// Exported manually because function has been moved to SchematicFileSerializer.cpp\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamSelf(\"cBlockArea\") ||\n\t\t!L.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' parameter\");\n\t}\n\tif (self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self', must not be nil\");\n\t}\n\n\ttry\n\t{\n\t\tL.Push(cSchematicFileSerializer::SaveToSchematicString(*self).GetView());\n\t\treturn 1;\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(Oops.what());\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n}\n\n\n\n\n\n/** Bindings for the cBlockArea:Write() functions. Supports two overloads and one default parameter. */\nstatic int tolua_cBlockArea_Write(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamSelf(\"cBlockArea\") ||\n\t\t!L.CheckParamUserType(2, \"cWorld\")\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the common params:\n\tcBlockArea * self = nullptr;\n\tcWorld * world = nullptr;\n\tif (!L.GetStackValues(1, self, world))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read self or world\");\n\t}\n\tif (world == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid world instance. The world must be not nil\");\n\t}\n\n\t// Check and get the overloaded params:\n\tVector3i coords;\n\tint dataTypes = 0;\n\tauto dataTypesIdx = readVector3iOverloadParams(L, 3, coords, \"coords\");\n\tauto HasDataTypes = L.GetStackValues(dataTypesIdx, dataTypes);\n\n\t// Check the dataType parameter validity:\n\tif (HasDataTypes)\n\t{\n\t\tif (!cBlockArea::IsValidDataTypeCombination(dataTypes))\n\t\t{\n\t\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Invalid datatype combination (0x{:02x})\"), dataTypes));\n\t\t}\n\t\tif ((self->GetDataTypes() & dataTypes) != dataTypes)\n\t\t{\n\t\t\treturn L.ApiParamError(fmt::format(\n\t\t\t\tFMT_STRING(\"Requesting datatypes not present in the cBlockArea. Got only 0x{:02x}, requested 0x{:02x}\"),\n\t\t\t\tself->GetDataTypes(), dataTypes\n\t\t\t));\n\t\t}\n\t}\n\n\t// Check and adjust the coord params:\n\t// TODO: Should we report this as a failure? Because the result is definitely not what the plugin assumed\n\t//   ... Or should we silently clone-crop-write the cBlockArea so that the API call does what would be naturally expected?\n\t//   ... Or should we change the cBlockArea::Write() to allow out-of-range Y coords and do the cropping there?\n\t//   ... NOTE: We already support auto-crop in cBlockArea::Merge() itself\n\tif (coords.y < 0)\n\t{\n\t\tLOGWARNING(\"cBlockArea:Write(): MinBlockY less than zero, adjusting to zero\");\n\t\tL.LogStackTrace();\n\t\tcoords.y = 0;\n\t}\n\telse if (coords.y > cChunkDef::Height - self->GetSizeY())\n\t{\n\t\tLOGWARNING(\"cBlockArea:Write(): MinBlockY + m_SizeY more than chunk height, adjusting to chunk height\");\n\t\tL.LogStackTrace();\n\t\tcoords.y = cChunkDef::Height - self->GetSizeY();\n\t}\n\n\t// Do the actual write:\n\tif (HasDataTypes)\n\t{\n\t\tL.Push(self->Write(*world, coords, dataTypes));\n\t}\n\telse\n\t{\n\t\tL.Push(self->Write(*world, coords));\n\t}\n\treturn 1;\n}\n\n\n\n\n\n/** Templated bindings for the GetBlock___() functions.\nDataType is either BLOCKTYPE or NIBBLETYPE.\nDataTypeFlag is the ba___ constant used for the datatype being queried.\nFn is the getter function.\nAlso supports the Vector3i overloads (TODO: document these (?)). */\ntemplate <\n\ttypename DataType,\n\tint DataTypeFlag,\n\tDataType (cBlockArea::*Fn)(int, int, int) const\n>\nstatic int GetBlock(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the common params:\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' param\");\n\t}\n\n\t// Check the datatype's presence:\n\tif ((self->GetDataTypes() & DataTypeFlag) == 0)\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The area doesn't contain the datatype (0x{:02x})\"), DataTypeFlag));\n\t}\n\n\t// Read the overloaded params:\n\tVector3i coords;\n\treadVector3iOverloadParams(L, 2, coords, \"coords\");\n\tif (!self->IsValidCoords(coords))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The coords ({0}) are out of range ({1} - {2})\"),\n\t\t\tcoords, self->GetOrigin(), self->GetOrigin() + self->GetSize() - Vector3i{1, 1, 1}\n\t\t));\n\t}\n\n\t// Get the block info:\n\tL.Push((self->*Fn)(coords.x, coords.y, coords.z));\n\treturn 1;\n}\n\n\n\n\n\n/** Templated bindings for the GetRelBlock___() functions.\nDataType is either BLOCKTYPE or NIBBLETYPE.\nDataTypeFlag is the ba___ constant used for the datatype being queried.\nFn is the getter function.\nAlso supports the Vector3i overloads (TODO: document these (?)). */\ntemplate <\n\ttypename DataType,\n\tint DataTypeFlag,\n\tDataType (cBlockArea::*Fn)(int, int, int) const\n>\nstatic int GetRelBlock(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the common params:\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' param\");\n\t}\n\n\t// Check the datatype's presence:\n\tif ((self->GetDataTypes() & DataTypeFlag) == 0)\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The area doesn't contain the datatype (0x{:02x})\"), DataTypeFlag));\n\t}\n\n\t// Read the overloaded params:\n\tVector3i coords;\n\treadVector3iOverloadParams(L, 2, coords, \"coords\");\n\tif (!self->IsValidRelCoords(coords))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The coords ({0}) are out of range ({1})\"),\n\t\t\tcoords, (self->GetSize() - Vector3i(1, 1, 1))\n\t\t));\n\t}\n\n\t// Get the block info:\n\tL.Push((self->*Fn)(coords.x, coords.y, coords.z));\n\treturn 1;\n}\n\n\n\n\n\n/** Templated bindings for the SetBlock___() functions.\nDataType is either BLOCKTYPE or NIBBLETYPE.\nDataTypeFlag is the ba___ constant used for the datatypebeing manipulated.\nFn is the setter function.\nAlso supports the Vector3i overloads (TODO: document these (?)). */\ntemplate <\n\ttypename DataType,\n\tint DataTypeFlag,\n\tvoid (cBlockArea::*Fn)(int, int, int, DataType)\n>\nstatic int SetBlock(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the common params:\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' param\");\n\t}\n\n\t// Check the datatype's presence:\n\tif ((self->GetDataTypes() & DataTypeFlag) == 0)\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The area doesn't contain the datatype (0x{:02x})\"), DataTypeFlag));\n\t}\n\n\t// Read the overloaded params:\n\tVector3i coords;\n\tauto idx = readVector3iOverloadParams(L, 2, coords, \"coords\");\n\tif (!self->IsValidCoords(coords))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The coords ({0}) are out of range ({1} - {2})\"),\n\t\t\tcoords, self->GetOrigin(), self->GetOrigin() + self->GetSize() - Vector3i{1, 1, 1}\n\t\t));\n\t}\n\tDataType data;\n\tL.GetStackValues(idx, data);\n\n\t// Set the block info:\n\t(self->*Fn)(coords.x, coords.y, coords.z, data);\n\treturn 0;\n}\n\n\n\n\n\n/** Templated bindings for the SetRelBlock___() functions.\nDataType is either BLOCKTYPE or NIBBLETYPE.\nDataTypeFlag is the ba___ constant used for the datatypebeing manipulated.\nFn is the setter function.\nAlso supports the Vector3i overloads (TODO: document these (?)). */\ntemplate <\n\ttypename DataType,\n\tint DataTypeFlag,\n\tvoid (cBlockArea::*Fn)(int, int, int, DataType)\n>\nstatic int SetRelBlock(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the common params:\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' param\");\n\t}\n\n\t// Check the datatype's presence:\n\tif ((self->GetDataTypes() & DataTypeFlag) == 0)\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The area doesn't contain the datatype (0x{:02x})\"), DataTypeFlag));\n\t}\n\n\t// Read the overloaded params:\n\tVector3i coords;\n\tauto idx = readVector3iOverloadParams(L, 2, coords, \"coords\");\n\tif (!self->IsValidRelCoords(coords))\n\t{\n\t\treturn L.ApiParamError(fmt::format(\n\t\t\tFMT_STRING(\"The coords ({0}) are out of range ({1})\"),\n\t\t\tcoords, (self->GetSize() - Vector3i(1, 1, 1))\n\t\t));\n\t}\n\tDataType data;\n\tL.GetStackValues(idx, data);\n\n\t// Set the block info:\n\t(self->*Fn)(coords.x, coords.y, coords.z, data);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_SetBlockTypeMeta(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the common params:\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' param\");\n\t}\n\n\t// Check if block types and metas are present:\n\tif (!self->HasBlockTypes() || !self->HasBlockMetas())\n\t{\n\t\treturn L.ApiParamError(\"The area doesn't contain the datatypes baTypes and baMetas\");\n\t}\n\n\t// Read the overloaded params:\n\tVector3i coords;\n\tauto idx = readVector3iOverloadParams(L, 2, coords, \"coords\");\n\tif (!self->IsValidCoords(coords))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The coords ({0}) are out of range ({1} - {2})\"),\n\t\t\tcoords, self->GetOrigin(), self->GetOrigin() + self->GetSize() - Vector3i{1, 1, 1}\n\t\t));\n\t}\n\n\tBLOCKTYPE block;\n\tNIBBLETYPE meta;\n\tif (!L.GetStackValues(idx, block, meta))\n\t{\n\t\treturn L.ApiParamError(\"Bad number for block type or meta type\");\n\t}\n\n\t// Set block type and meta:\n\tself->SetBlockTypeMeta(coords.x, coords.y, coords.z, block, meta);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cBlockArea_SetRelBlockTypeMeta(lua_State * a_LuaState)\n{\n\t// Check the common params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamSelf(\"cBlockArea\"))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the common params:\n\tcBlockArea * self;\n\tif (!L.GetStackValues(1, self))\n\t{\n\t\treturn L.ApiParamError(\"Cannot read the 'self' param\");\n\t}\n\n\t// Check if block types and metas are present:\n\tif (!self->HasBlockTypes() || !self->HasBlockMetas())\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The area doesn't contain the baTypes or baMetas datatypes (0x{:02x})\"), self->GetDataTypes()));\n\t}\n\n\t// Read the overloaded params:\n\tVector3i coords;\n\tauto idx = readVector3iOverloadParams(L, 2, coords, \"coords\");\n\tif (!self->IsValidRelCoords(coords))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"The coords ({0}) are out of range ({1})\"),\n\t\t\tcoords, (self->GetSize() - Vector3i(1, 1, 1))\n\t\t));\n\t}\n\n\tBLOCKTYPE block;\n\tNIBBLETYPE meta;\n\tif (!L.GetStackValues(idx, block, meta))\n\t{\n\t\treturn L.ApiParamError(\"Bad number for block type or meta type\");\n\t}\n\n\t// Set block type and meta:\n\tself->SetRelBlockTypeMeta(coords.x, coords.y, coords.z, block, meta);\n\treturn 0;\n}\n\n\n\n\n\nvoid cManualBindings::BindBlockArea(lua_State * a_LuaState)\n{\n\ttolua_beginmodule(a_LuaState, nullptr);\n\t\ttolua_beginmodule(a_LuaState, \"cBlockArea\");\n\t\t\ttolua_function(a_LuaState, \"Create\",                  tolua_cBlockArea_Create);\n\t\t\ttolua_function(a_LuaState, \"DoWithBlockEntityAt\",     DoWithXYZ<cBlockArea, cBlockEntity, &cBlockArea::DoWithBlockEntityAt,    &cBlockArea::IsValidCoords>);\n\t\t\ttolua_function(a_LuaState, \"DoWithBlockEntityRelAt\",  DoWithXYZ<cBlockArea, cBlockEntity, &cBlockArea::DoWithBlockEntityRelAt, &cBlockArea::IsValidRelCoords>);\n\t\t\ttolua_function(a_LuaState, \"FillRelCuboid\",           tolua_cBlockArea_FillRelCuboid);\n\t\t\ttolua_function(a_LuaState, \"ForEachBlockEntity\",      ForEach<  cBlockArea, cBlockEntity, &cBlockArea::ForEachBlockEntity>);\n\t\t\ttolua_function(a_LuaState, \"GetBlockLight\",           GetBlock<NIBBLETYPE, cBlockArea::baLight,    &cBlockArea::GetRelBlockLight>);\n\t\t\ttolua_function(a_LuaState, \"GetBlockMeta\",            GetBlock<NIBBLETYPE, cBlockArea::baMetas,    &cBlockArea::GetRelBlockMeta>);\n\t\t\ttolua_function(a_LuaState, \"GetBlockSkyLight\",        GetBlock<NIBBLETYPE, cBlockArea::baSkyLight, &cBlockArea::GetRelBlockSkyLight>);\n\t\t\ttolua_function(a_LuaState, \"GetBlockType\",            GetBlock<BLOCKTYPE,  cBlockArea::baTypes,    &cBlockArea::GetRelBlockType>);\n\t\t\ttolua_function(a_LuaState, \"GetBlockTypeMeta\",        tolua_cBlockArea_GetBlockTypeMeta);\n\t\t\ttolua_function(a_LuaState, \"GetCoordRange\",           tolua_cBlockArea_GetCoordRange);\n\t\t\ttolua_function(a_LuaState, \"GetNonAirCropRelCoords\",  tolua_cBlockArea_GetNonAirCropRelCoords);\n\t\t\ttolua_function(a_LuaState, \"GetOrigin\",               tolua_cBlockArea_GetOrigin);\n\t\t\ttolua_function(a_LuaState, \"GetRelBlockLight\",        GetRelBlock<NIBBLETYPE, cBlockArea::baLight,    &cBlockArea::GetRelBlockLight>);\n\t\t\ttolua_function(a_LuaState, \"GetRelBlockMeta\",         GetRelBlock<NIBBLETYPE, cBlockArea::baMetas,    &cBlockArea::GetRelBlockMeta>);\n\t\t\ttolua_function(a_LuaState, \"GetRelBlockSkyLight\",     GetRelBlock<NIBBLETYPE, cBlockArea::baSkyLight, &cBlockArea::GetRelBlockSkyLight>);\n\t\t\ttolua_function(a_LuaState, \"GetRelBlockType\",         GetRelBlock<BLOCKTYPE,  cBlockArea::baTypes,    &cBlockArea::GetRelBlockType>);\n\t\t\ttolua_function(a_LuaState, \"GetRelBlockTypeMeta\",     tolua_cBlockArea_GetRelBlockTypeMeta);\n\t\t\ttolua_function(a_LuaState, \"GetSize\",                 tolua_cBlockArea_GetSize);\n\t\t\ttolua_function(a_LuaState, \"LoadFromSchematicFile\",   tolua_cBlockArea_LoadFromSchematicFile);\n\t\t\ttolua_function(a_LuaState, \"LoadFromSchematicString\", tolua_cBlockArea_LoadFromSchematicString);\n\t\t\ttolua_function(a_LuaState, \"Read\",                    tolua_cBlockArea_Read);\n\t\t\ttolua_function(a_LuaState, \"RelLine\",                 tolua_cBlockArea_RelLine);\n\t\t\ttolua_function(a_LuaState, \"SaveToSchematicFile\",     tolua_cBlockArea_SaveToSchematicFile);\n\t\t\ttolua_function(a_LuaState, \"SaveToSchematicString\",   tolua_cBlockArea_SaveToSchematicString);\n\t\t\ttolua_function(a_LuaState, \"SetBlockType\",            SetBlock<BLOCKTYPE,  cBlockArea::baTypes,    &cBlockArea::SetRelBlockType>);\n\t\t\ttolua_function(a_LuaState, \"SetBlockMeta\",            SetBlock<NIBBLETYPE, cBlockArea::baMetas,    &cBlockArea::SetRelBlockMeta>);\n\t\t\ttolua_function(a_LuaState, \"SetBlockLight\",           SetBlock<NIBBLETYPE, cBlockArea::baLight,    &cBlockArea::SetRelBlockLight>);\n\t\t\ttolua_function(a_LuaState, \"SetBlockSkyLight\",        SetBlock<NIBBLETYPE, cBlockArea::baSkyLight, &cBlockArea::SetRelBlockSkyLight>);\n\t\t\ttolua_function(a_LuaState, \"SetBlockTypeMeta\",        tolua_cBlockArea_SetBlockTypeMeta);\n\t\t\ttolua_function(a_LuaState, \"SetRelBlockType\",         SetRelBlock<BLOCKTYPE,  cBlockArea::baTypes,    &cBlockArea::SetRelBlockType>);\n\t\t\ttolua_function(a_LuaState, \"SetRelBlockMeta\",         SetRelBlock<NIBBLETYPE, cBlockArea::baMetas,    &cBlockArea::SetRelBlockMeta>);\n\t\t\ttolua_function(a_LuaState, \"SetRelBlockLight\",        SetRelBlock<NIBBLETYPE, cBlockArea::baLight,    &cBlockArea::SetRelBlockLight>);\n\t\t\ttolua_function(a_LuaState, \"SetRelBlockSkyLight\",     SetRelBlock<NIBBLETYPE, cBlockArea::baSkyLight, &cBlockArea::SetRelBlockSkyLight>);\n\t\t\ttolua_function(a_LuaState, \"SetRelBlockTypeMeta\",     tolua_cBlockArea_SetRelBlockTypeMeta);\n\t\t\ttolua_function(a_LuaState, \"Write\",                   tolua_cBlockArea_Write);\n\t\ttolua_endmodule(a_LuaState);\n\ttolua_endmodule(a_LuaState);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/ManualBindings_Network.cpp",
    "content": "\n// ManualBindings_Network.cpp\n\n// Implements the cNetwork-related API bindings for Lua\n// Also implements the cUrlClient bindings\n\n#include \"Globals.h\"\n#include \"ManualBindings.h\"\n#include \"tolua++/include/tolua++.h\"\n#include \"LuaState.h\"\n#include \"LuaTCPLink.h\"\n#include \"LuaNameLookup.h\"\n#include \"LuaServerHandle.h\"\n#include \"LuaUDPEndpoint.h\"\n#include \"../HTTP/UrlClient.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNetwork API functions:\n\n/** Binds cNetwork::Connect */\nstatic int tolua_cNetwork_Connect(lua_State * L)\n{\n\t// Function signature:\n\t// cNetwork:Connect(Host, Port, Callbacks) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cNetwork\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamNumber(3) ||\n\t\t!S.CheckParamTable(4) ||\n\t\t!S.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString host;\n\tint port = 0;\n\tcLuaState::cTableRefPtr callbacks;\n\tif (!S.GetStackValues(2, host, port, callbacks))\n\t{\n\t\treturn S.ApiParamError(\"Cannot read parameters.\");\n\t}\n\n\t// Check validity:\n\tif ((port < 0) || (port > 65535))\n\t{\n\t\treturn S.ApiParamError(fmt::format(FMT_STRING(\"Port number out of range (got {}, range 0 - 65535)\"), port));\n\t}\n\tASSERT(callbacks != nullptr);  // Invalid callbacks would have resulted in GetStackValues() returning false\n\n\t// Create the LuaTCPLink glue class:\n\tauto link = std::make_shared<cLuaTCPLink>(std::move(callbacks));\n\n\t// Try to connect:\n\tbool res = cNetwork::Connect(host, static_cast<UInt16>(port), link, link);\n\tS.Push(res);\n\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cNetwork::CreateUDPEndpoint */\nstatic int tolua_cNetwork_CreateUDPEndpoint(lua_State * L)\n{\n\t// Function signature:\n\t// cNetwork:CreateUDPEndpoint(Port, Callbacks) -> cUDPEndpoint\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cNetwork\") ||\n\t\t!S.CheckParamNumber(2) ||\n\t\t!S.CheckParamTable(3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tint port;\n\tcLuaState::cTableRefPtr callbacks;\n\tif (!S.GetStackValues(2, port, callbacks))\n\t{\n\t\treturn S.ApiParamError(\"Cannot read parameters\");\n\t}\n\n\t// Check validity:\n\tif ((port < 0) || (port > 65535))\n\t{\n\t\treturn S.ApiParamError(fmt::format(FMT_STRING(\"Port number out of range (got {}, range 0 - 65535)\"), port));\n\t}\n\tASSERT(callbacks != nullptr);  // Invalid callbacks would have resulted in GetStackValues() returning false\n\n\t// Create the LuaUDPEndpoint glue class:\n\tauto endpoint = std::make_shared<cLuaUDPEndpoint>(std::move(callbacks));\n\tendpoint->Open(static_cast<UInt16>(port), endpoint);\n\n\t// Register the endpoint to be garbage-collected by Lua:\n\ttolua_pushusertype(L, endpoint.get(), \"cUDPEndpoint\");\n\ttolua_register_gc(L, lua_gettop(L));\n\n\t// Return the endpoint object:\n\tS.Push(endpoint.get());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cNetwork::EnumLocalIPAddresses */\nstatic int tolua_cNetwork_EnumLocalIPAddresses(lua_State * L)\n{\n\t// Function signature:\n\t// cNetwork:EnumLocalIPAddresses() -> {string, ...}\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cNetwork\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Push the enumerated addresses:\n\tS.Push(cNetwork::EnumLocalIPAddresses());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cNetwork::HostnameToIP */\nstatic int tolua_cNetwork_HostnameToIP(lua_State * L)\n{\n\t// Function signature:\n\t// cNetwork:HostnameToIP(Host, Callbacks) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cNetwork\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamTable(3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString host;\n\tcLuaState::cTableRefPtr callbacks;\n\tif (!S.GetStackValues(2, host, callbacks))\n\t{\n\t\treturn S.ApiParamError(\"Cannot read parameters.\");\n\t}\n\tASSERT(callbacks != nullptr);  // Invalid callbacks would have resulted in GetStackValues() returning false\n\n\t// Try to look up:\n\tbool res = cNetwork::HostnameToIP(host, std::make_shared<cLuaNameLookup>(host, std::move(callbacks)));\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cNetwork::IPToHostname */\nstatic int tolua_cNetwork_IPToHostname(lua_State * L)\n{\n\t// Function signature:\n\t// cNetwork:IPToHostname(IP, Callbacks) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cNetwork\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamTable(3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString ip;\n\tcLuaState::cTableRefPtr callbacks;\n\tif (!S.GetStackValues(2, ip, callbacks))\n\t{\n\t\treturn S.ApiParamError(\"Cannot read parameters.\");\n\t}\n\tASSERT(callbacks != nullptr);  // Invalid callbacks would have resulted in GetStackValues() returning false\n\n\t// Try to look up:\n\tbool res = cNetwork::IPToHostName(ip, std::make_shared<cLuaNameLookup>(ip, std::move(callbacks)));\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cNetwork::Listen */\nstatic int tolua_cNetwork_Listen(lua_State * L)\n{\n\t// Function signature:\n\t// cNetwork:Listen(Port, Callbacks) -> cServerHandle\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cNetwork\") ||\n\t\t!S.CheckParamNumber(2) ||\n\t\t!S.CheckParamTable(3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tint port = 0;\n\tcLuaState::cTableRefPtr callbacks;\n\tif (!S.GetStackValues(2, port, callbacks))\n\t{\n\t\treturn S.ApiParamError(\"Cannot read parameters\");\n\t}\n\n\t// Check the validity:\n\tif ((port < 0) || (port > 65535))\n\t{\n\t\treturn S.ApiParamError(fmt::format(FMT_STRING(\"Port number out of range (got {}, range 0 - 65535)\"), port));\n\t}\n\tauto port16 = static_cast<UInt16>(port);\n\n\t// Create the LuaTCPLink glue class:\n\tauto srv = std::make_shared<cLuaServerHandle>(port16, std::move(callbacks));\n\n\t// Listen:\n\tsrv->SetServerHandle(cNetwork::Listen(port16, srv), srv);\n\n\t// Register the server to be garbage-collected by Lua:\n\ttolua_pushusertype(L, srv.get(), \"cServerHandle\");\n\ttolua_register_gc(L, lua_gettop(L));\n\n\t// Return the server handle wrapper:\n\tS.Push(srv.get());\n\treturn 1;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cServerHandle bindings (routed through cLuaServerHandle):\n\n/** Called when Lua destroys the object instance.\nClose the server and let it deallocate on its own (it's in a SharedPtr). */\nstatic int tolua_collect_cServerHandle(lua_State * L)\n{\n\tauto Srv = static_cast<cLuaServerHandle *>(tolua_tousertype(L, 1, nullptr));\n\tASSERT(Srv != nullptr);\n\tSrv->Release();\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cLuaServerHandle::Close */\nstatic int tolua_cServerHandle_Close(lua_State * L)\n{\n\t// Function signature:\n\t// ServerInstance:Close()\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cServerHandle\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the server handle:\n\tauto Srv = *static_cast<cLuaServerHandle **>(lua_touserdata(L, 1));\n\tASSERT(Srv != nullptr);  // Checked by CheckParamSelf()\n\n\t// Close it:\n\tSrv->Close();\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cLuaServerHandle::IsListening */\nstatic int tolua_cServerHandle_IsListening(lua_State * L)\n{\n\t// Function signature:\n\t// ServerInstance:IsListening() -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cServerHandle\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the server handle:\n\tauto Srv = *static_cast<cLuaServerHandle **>(lua_touserdata(L, 1));\n\tASSERT(Srv != nullptr);  // Checked by CheckParamSelf()\n\n\t// Query it:\n\tS.Push(Srv->IsListening());\n\treturn 1;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cTCPLink bindings (routed through cLuaTCPLink):\n\n/** Binds cLuaTCPLink::Close */\nstatic int tolua_cTCPLink_Close(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:Close()\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cTCPLink\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Close the link:\n\tLink->Close();\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cLuaTCPLink::GetLocalIP */\nstatic int tolua_cTCPLink_GetLocalIP(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:GetLocalIP() -> string\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cTCPLink\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Get the IP:\n\tS.Push(Link->GetLocalIP());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cLuaTCPLink::GetLocalPort */\nstatic int tolua_cTCPLink_GetLocalPort(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:GetLocalPort() -> number\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cTCPLink\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Get the Port:\n\tS.Push(Link->GetLocalPort());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cLuaTCPLink::GetRemoteIP */\nstatic int tolua_cTCPLink_GetRemoteIP(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:GetRemoteIP() -> string\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cTCPLink\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Get the IP:\n\tS.Push(Link->GetRemoteIP());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cLuaTCPLink::GetRemotePort */\nstatic int tolua_cTCPLink_GetRemotePort(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:GetRemotePort() -> number\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cTCPLink\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Get the Port:\n\tS.Push(Link->GetRemotePort());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cLuaTCPLink::Send */\nstatic int tolua_cTCPLink_Send(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:Send(DataString)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cTCPLink\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Get the data to send:\n\tAString Data;\n\tS.GetStackValues(2, Data);\n\n\t// Send the data:\n\tLink->Send(Data);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cLuaTCPLink::Shutdown */\nstatic int tolua_cTCPLink_Shutdown(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:Shutdown()\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cTCPLink\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Shutdown the link:\n\tLink->Shutdown();\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cLuaTCPLink::StartTLSClient */\nstatic int tolua_cTCPLink_StartTLSClient(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:StartTLSClient(OwnCert, OwnPrivKey, OwnPrivKeyPassword, TrustedRootCAs) -> [true] or [nil, ErrMsg]\n\n\t// Get the link:\n\tcLuaState S(L);\n\tif (!S.CheckParamSelf(\"cTCPLink\"))\n\t{\n\t\treturn 0;\n\t}\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Read the (optional) params:\n\tAString OwnCert, OwnPrivKey, OwnPrivKeyPassword, TrustedRootCAs;\n\tS.GetStackValues(2, OwnCert, OwnPrivKey, OwnPrivKeyPassword, cLuaState::cOptionalParam<std::string>(TrustedRootCAs));\n\n\t// Start the TLS handshake:\n\tAString res = Link->StartTLSClient(OwnCert, OwnPrivKey, OwnPrivKeyPassword, TrustedRootCAs);\n\tif (!res.empty())\n\t{\n\t\tS.Push(cLuaState::Nil, fmt::format(\n\t\t\tFMT_STRING(\"Cannot start TLS on link to {}:{}: {}\"),\n\t\t\tLink->GetRemoteIP(), Link->GetRemotePort(), res\n\t\t));\n\t\treturn 2;\n\t}\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cLuaTCPLink::StartTLSServer */\nstatic int tolua_cTCPLink_StartTLSServer(lua_State * L)\n{\n\t// Function signature:\n\t// LinkInstance:StartTLSServer(OwnCert, OwnPrivKey, OwnPrivKeyPassword, StartTLSData) -> [true] or [nil, ErrMsg]\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cTCPLink\") ||\n\t\t!S.CheckParamString(2, 4) ||\n\t\t// Param 5 is optional, don't check\n\t\t!S.CheckParamEnd(6)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1));\n\tASSERT(Link != nullptr);  // Checked by CheckParamSelf()\n\n\t// Read the params:\n\tAString OwnCert, OwnPrivKey, OwnPrivKeyPassword, StartTLSData;\n\tS.GetStackValues(2, OwnCert, OwnPrivKey, OwnPrivKeyPassword, StartTLSData);\n\n\t// Start the TLS handshake:\n\tAString res = Link->StartTLSServer(OwnCert, OwnPrivKey, OwnPrivKeyPassword, StartTLSData);\n\tif (!res.empty())\n\t{\n\t\tS.Push(cLuaState::Nil, fmt::format(\n\t\t\tFMT_STRING(\"Cannot start TLS on link to {}:{}: {}\"),\n\t\t\tLink->GetRemoteIP(), Link->GetRemotePort(), res\n\t\t));\n\t\treturn 2;\n\t}\n\tS.Push(true);\n\treturn 1;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cUDPEndpoint bindings (routed through cLuaUDPEndpoint):\n\n/** Called when Lua destroys the object instance.\nClose the endpoint and let it deallocate on its own (it's in a SharedPtr). */\nstatic int tolua_collect_cUDPEndpoint(lua_State * L)\n{\n\tauto endpoint = static_cast<cLuaUDPEndpoint *>(tolua_tousertype(L, 1, nullptr));\n\tASSERT(endpoint != nullptr);\n\tendpoint->Release();\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cLuaUDPEndpoint::Close */\nstatic int tolua_cUDPEndpoint_Close(lua_State * L)\n{\n\t// Function signature:\n\t// EndpointInstance:Close()\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cUDPEndpoint\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the endpoint:\n\tauto endpoint = *static_cast<cLuaUDPEndpoint **>(lua_touserdata(L, 1));\n\tASSERT(endpoint != nullptr);\n\n\t// Close it:\n\tendpoint->Close();\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cLuaUDPEndpoint::EnableBroadcasts */\nstatic int tolua_cUDPEndpoint_EnableBroadcasts(lua_State * L)\n{\n\t// Function signature:\n\t// EndpointInstance:EnableBroadcasts()\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cUDPEndpoint\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the endpoint:\n\tauto endpoint = *static_cast<cLuaUDPEndpoint **>(lua_touserdata(L, 1));\n\tASSERT(endpoint != nullptr);\n\n\t// Enable the broadcasts:\n\tendpoint->EnableBroadcasts();\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cLuaUDPEndpoint::GetPort */\nstatic int tolua_cUDPEndpoint_GetPort(lua_State * L)\n{\n\t// Function signature:\n\t// Endpoint:GetPort() -> number\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cUDPEndpoint\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the endpoint:\n\tauto endpoint = *static_cast<cLuaUDPEndpoint **>(lua_touserdata(L, 1));\n\tASSERT(endpoint != nullptr);\n\n\t// Get the Port:\n\tS.Push(endpoint->GetPort());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cLuaUDPEndpoint::IsOpen */\nstatic int tolua_cUDPEndpoint_IsOpen(lua_State * L)\n{\n\t// Function signature:\n\t// Endpoint:IsOpen() -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cUDPEndpoint\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the endpoint:\n\tauto endpoint = *static_cast<cLuaUDPEndpoint **>(lua_touserdata(L, 1));\n\tASSERT(endpoint != nullptr);\n\n\t// Close it:\n\tS.Push(endpoint->IsOpen());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cLuaUDPEndpoint::Send */\nstatic int tolua_cUDPEndpoint_Send(lua_State * L)\n{\n\t// Function signature:\n\t// Endpoint:Send(DataString)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamSelf(\"cUDPEndpoint\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamNumber(4) ||\n\t\t!S.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the link:\n\tauto endpoint = *static_cast<cLuaUDPEndpoint **>(lua_touserdata(L, 1));\n\tASSERT(endpoint != nullptr);\n\n\t// Get the data to send:\n\tAString data, remotePeer;\n\tint remotePort = 0;\n\tS.GetStackValues(2, data, remotePeer, remotePort);\n\n\t// Check the port:\n\tif ((remotePort < 0) || (remotePort > USHRT_MAX))\n\t{\n\t\treturn S.ApiParamError(fmt::format(FMT_STRING(\"Port number out of range (got {}, range 0 - 65535)\"), remotePort));\n\t}\n\n\t// Send the data:\n\tS.Push(endpoint->Send(data, remotePeer, static_cast<UInt16>(remotePort)));\n\treturn 1;\n}\n\n\n\n\n\n/** Used when the cUrlClient Lua request wants all the callbacks.\nMaps each callback onto a Lua function callback in the callback table. */\nclass cFullUrlClientCallbacks:\n\tpublic cUrlClient::cCallbacks\n{\npublic:\n\t/** Creates a new instance bound to the specified table of callbacks. */\n\tcFullUrlClientCallbacks(cLuaState::cTableRefPtr && a_Callbacks):\n\t\tm_Callbacks(std::move(a_Callbacks))\n\t{\n\t}\n\n\n\t// cUrlClient::cCallbacks overrides:\n\tvirtual void OnConnected(cTCPLink & a_Link) override\n\t{\n\t\t// TODO: Cannot push a cTCPLink to Lua, need to translate via cLuaTCPLink\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnConnected\", cLuaState::Nil, a_Link.GetRemoteIP(), a_Link.GetRemotePort());\n\t}\n\n\n\tvirtual bool OnCertificateReceived() override\n\t{\n\t\t// TODO: The received cert needs proper type specification from the underlying cUrlClient framework and in the Lua engine as well\n\t\tbool res = true;\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnCertificateReceived\", cLuaState::Return, res);\n\t\treturn res;\n\t}\n\n\n\tvirtual void OnTlsHandshakeCompleted() override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnTlsHandshakeCompleted\");\n\t}\n\n\n\tvirtual void OnRequestSent() override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnRequestSent\");\n\t}\n\n\n\tvirtual void OnStatusLine(const AString & a_HttpVersion, int a_StatusCode, const AString & a_Rest) override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnStatusLine\", a_HttpVersion, a_StatusCode, a_Rest);\n\t}\n\n\n\tvirtual void OnHeader(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnHeader\", a_Key, a_Value);\n\t\tm_Headers[a_Key] = a_Value;\n\t}\n\n\n\tvirtual void OnHeadersFinished() override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnHeadersFinished\", m_Headers);\n\t}\n\n\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnBodyData\", AString(static_cast<const char *>(a_Data), a_Size));\n\t}\n\n\n\tvirtual void OnBodyFinished() override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnBodyFinished\");\n\t}\n\n\n\tvirtual void OnError(const AString & a_ErrorMsg) override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnError\", a_ErrorMsg);\n\t}\n\n\n\tvirtual void OnRedirecting(const AString & a_NewLocation) override\n\t{\n\t\tm_Callbacks->CallTableFnWithSelf(\"OnRedirecting\", a_NewLocation);\n\t}\n\n\nprotected:\n\t/** The Lua table containing the callbacks. */\n\tcLuaState::cTableRefPtr m_Callbacks;\n\n\t/** Accumulator for all the headers to be reported in the OnHeadersFinished() callback. */\n\tAStringMap m_Headers;\n};\n\n\n\n\n\n/** Used when the cUrlClient Lua request has just a single callback.\nThe callback is used to report the entire body at once, together with the HTTP headers, or to report an error:\ncallback(\"BodyContents\", {headers})\ncallback(nil, \"ErrorMessage\")\nAccumulates the body contents into a single string until the body is finished.\nAccumulates all HTTP headers into an AStringMap. */\nclass cSimpleUrlClientCallbacks:\n\tpublic cUrlClient::cCallbacks\n{\npublic:\n\t/** Creates a new instance that uses the specified callback to report when request finishes. */\n\tcSimpleUrlClientCallbacks(cLuaState::cCallbackPtr && a_Callback):\n\t\tm_Callback(std::move(a_Callback))\n\t{\n\t}\n\n\n\tvirtual void OnHeader(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\tm_Headers[a_Key] = a_Value;\n\t}\n\n\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override\n\t{\n\t\tm_ResponseBody.append(static_cast<const char *>(a_Data), a_Size);\n\t}\n\n\n\tvirtual void OnBodyFinished() override\n\t{\n\t\tm_Callback->Call(m_ResponseBody, m_Headers);\n\t}\n\n\n\tvirtual void OnError(const AString & a_ErrorMsg) override\n\t{\n\t\tm_Callback->Call(cLuaState::Nil, a_ErrorMsg);\n\t}\n\n\nprotected:\n\n\t/** The callback to call when the request finishes. */\n\tcLuaState::cCallbackPtr m_Callback;\n\n\t/** The accumulator for the partial body data, so that OnBodyFinished() can send the entire thing at once. */\n\tAString m_ResponseBody;\n\n\t/** Accumulator for all the headers to be reported in the combined callback. */\n\tAStringMap m_Headers;\n};\n\n\n\n\n\n/** Common code shared among the cUrlClient request methods.\na_Method is the method name to be used in the request.\na_UrlStackIdx is the position on the Lua stack of the Url parameter. */\nstatic int tolua_cUrlClient_Request_Common(lua_State * a_LuaState, const AString & a_Method, int a_UrlStackIdx)\n{\n\t// Check params:\n\tcLuaState L(a_LuaState);\n\tif (!L.CheckParamString(a_UrlStackIdx))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read params:\n\tAString url, requestBody;\n\tAStringMap headers, options;\n\tcLuaState::cTableRefPtr callbacks;\n\tcLuaState::cCallbackPtr onCompleteBodyCallback;\n\tif (!L.GetStackValues(a_UrlStackIdx, url))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Cannot read URL parameter at idx {}\"), a_UrlStackIdx));\n\t}\n\tcUrlClient::cCallbacksPtr urlClientCallbacks;\n\tif (lua_istable(L, a_UrlStackIdx + 1))\n\t{\n\t\tif (!L.GetStackValue(a_UrlStackIdx + 1, callbacks))\n\t\t{\n\t\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Cannot read the CallbacksTable parameter at idx {}\"), a_UrlStackIdx + 1));\n\t\t}\n\t\turlClientCallbacks = std::make_unique<cFullUrlClientCallbacks>(std::move(callbacks));\n\t}\n\telse if (lua_isfunction(L, a_UrlStackIdx + 1))\n\t{\n\t\tif (!L.GetStackValue(a_UrlStackIdx + 1, onCompleteBodyCallback))\n\t\t{\n\t\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Cannot read the CallbackFn parameter at idx {}\"), a_UrlStackIdx + 1));\n\t\t}\n\t\turlClientCallbacks = std::make_unique<cSimpleUrlClientCallbacks>(std::move(onCompleteBodyCallback));\n\t}\n\telse\n\t{\n\t\tL.ApiParamError(fmt::format(\n\t\t\tFMT_STRING(\"Invalid Callbacks parameter at {}, expected a table or function, got {}\"),\n\t\t\ta_UrlStackIdx + 1, L.GetTypeText(a_UrlStackIdx + 1)\n\t\t));\n\t}\n\tif (!L.GetStackValues(a_UrlStackIdx + 2, cLuaState::cOptionalParam<AStringMap>(headers), cLuaState::cOptionalParam<AString>(requestBody), cLuaState::cOptionalParam<AStringMap>(options)))\n\t{\n\t\tL.ApiParamError(fmt::format(\n\t\t\tFMT_STRING(\"Cannot read the Header, Body or Options parameter at idx {}, {}, {}.\"),\n\t\t\ta_UrlStackIdx + 2, a_UrlStackIdx + 3, a_UrlStackIdx + 4\n\t\t));\n\t}\n\n\t// Make the request:\n\tauto res = cUrlClient::Request(a_Method, url, std::move(urlClientCallbacks), std::move(headers), std::move(requestBody), std::move(options));\n\tif (!res.first)\n\t{\n\t\tL.Push(false);\n\t\tL.Push(res.second);\n\t\treturn 2;\n\t}\n\tL.Push(true);\n\treturn 1;\n}\n\n\n\n\n\n/** Implements cUrlClient:Get() using cUrlClient::Request(). */\nstatic int tolua_cUrlClient_Delete(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\tcUrlClient:Delete(URL, {CallbacksFnTable}, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\tcUrlClient:Delete(URL, OnCompleteBodyCallback, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\t*/\n\n\treturn tolua_cUrlClient_Request_Common(a_LuaState, \"DELETE\", 2);\n}\n\n\n\n\n\n/** Implements cUrlClient:Get() using cUrlClient::Request(). */\nstatic int tolua_cUrlClient_Get(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\tcUrlClient:Get(URL, {CallbacksFnTable}, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\tcUrlClient:Get(URL, OnCompleteBodyCallback, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\t*/\n\n\treturn tolua_cUrlClient_Request_Common(a_LuaState, \"GET\", 2);\n}\n\n\n\n\n\n/** Implements cUrlClient:Post() using cUrlClient::Request(). */\nstatic int tolua_cUrlClient_Post(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\tcUrlClient:Post(URL, {CallbacksFnTable}, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\tcUrlClient:Post(URL, OnCompleteBodyCallback, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\t*/\n\n\treturn tolua_cUrlClient_Request_Common(a_LuaState, \"POST\", 2);\n}\n\n\n\n\n\n/** Implements cUrlClient:Put() using cUrlClient::Request(). */\nstatic int tolua_cUrlClient_Put(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\tcUrlClient:Put(URL, {CallbacksFnTable}, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\tcUrlClient:Put(URL, OnCompleteBodyCallback, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\t*/\n\n\treturn tolua_cUrlClient_Request_Common(a_LuaState, \"PUT\", 2);\n}\n\n\n\n\n\n/** Binds cUrlClient::Request(). */\nstatic int tolua_cUrlClient_Request(lua_State * a_LuaState)\n{\n\t/* Function signatures:\n\tcUrlClient:Request(Method, URL, {CallbacksFnTable}, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\tcUrlClient:Request(Method, URL, OnCompleteBodyCallback, [{HeadersMapTable}], [RequestBody], [{OptionsMapTable}]) -> true / false + string\n\t*/\n\n\t// Check that the Method param is a string:\n\tcLuaState L(a_LuaState);\n\tif (\n\t\t!L.CheckParamStaticSelf(\"cUrlClient\") ||\n\t\t!L.CheckParamString(2))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Redirect the rest to the common code:\n\tAString method;\n\tif (!L.GetStackValue(2, method))\n\t{\n\t\tL.ApiParamError(\"Cannot read the Method parameter\");\n\t}\n\treturn tolua_cUrlClient_Request_Common(a_LuaState, method, 3);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Register the bindings:\n\nvoid cManualBindings::BindNetwork(lua_State * tolua_S)\n{\n\t// Create the cNetwork API classes:\n\ttolua_usertype(tolua_S, \"cNetwork\");\n\ttolua_usertype(tolua_S, \"cServerHandle\");\n\ttolua_usertype(tolua_S, \"cTCPLink\");\n\ttolua_usertype(tolua_S, \"cUDPEndpoint\");\n\ttolua_usertype(tolua_S, \"cUrlClient\");\n\ttolua_cclass(tolua_S, \"cNetwork\",      \"cNetwork\",      \"\", nullptr);\n\ttolua_cclass(tolua_S, \"cServerHandle\", \"cServerHandle\", \"\", tolua_collect_cServerHandle);\n\ttolua_cclass(tolua_S, \"cTCPLink\",      \"cTCPLink\",      \"\", nullptr);\n\ttolua_cclass(tolua_S, \"cUDPEndpoint\",  \"cUDPEndpoint\",  \"\", tolua_collect_cUDPEndpoint);\n\ttolua_cclass(tolua_S, \"cUrlClient\",    \"cUrlClient\",    \"\", nullptr);\n\n\t// Fill in the functions (alpha-sorted):\n\ttolua_beginmodule(tolua_S, \"cNetwork\");\n\t\ttolua_function(tolua_S, \"Connect\",              tolua_cNetwork_Connect);\n\t\ttolua_function(tolua_S, \"CreateUDPEndpoint\",    tolua_cNetwork_CreateUDPEndpoint);\n\t\ttolua_function(tolua_S, \"EnumLocalIPAddresses\", tolua_cNetwork_EnumLocalIPAddresses);\n\t\ttolua_function(tolua_S, \"HostnameToIP\",         tolua_cNetwork_HostnameToIP);\n\t\ttolua_function(tolua_S, \"IPToHostname\",         tolua_cNetwork_IPToHostname);\n\t\ttolua_function(tolua_S, \"Listen\",               tolua_cNetwork_Listen);\n\ttolua_endmodule(tolua_S);\n\n\ttolua_beginmodule(tolua_S, \"cServerHandle\");\n\t\ttolua_function(tolua_S, \"Close\",       tolua_cServerHandle_Close);\n\t\ttolua_function(tolua_S, \"IsListening\", tolua_cServerHandle_IsListening);\n\ttolua_endmodule(tolua_S);\n\n\ttolua_beginmodule(tolua_S, \"cTCPLink\");\n\t\ttolua_function(tolua_S, \"Close\",          tolua_cTCPLink_Close);\n\t\ttolua_function(tolua_S, \"GetLocalIP\",     tolua_cTCPLink_GetLocalIP);\n\t\ttolua_function(tolua_S, \"GetLocalPort\",   tolua_cTCPLink_GetLocalPort);\n\t\ttolua_function(tolua_S, \"GetRemoteIP\",    tolua_cTCPLink_GetRemoteIP);\n\t\ttolua_function(tolua_S, \"GetRemotePort\",  tolua_cTCPLink_GetRemotePort);\n\t\ttolua_function(tolua_S, \"Send\",           tolua_cTCPLink_Send);\n\t\ttolua_function(tolua_S, \"Shutdown\",       tolua_cTCPLink_Shutdown);\n\t\ttolua_function(tolua_S, \"StartTLSClient\", tolua_cTCPLink_StartTLSClient);\n\t\ttolua_function(tolua_S, \"StartTLSServer\", tolua_cTCPLink_StartTLSServer);\n\ttolua_endmodule(tolua_S);\n\n\ttolua_beginmodule(tolua_S, \"cUDPEndpoint\");\n\t\ttolua_function(tolua_S, \"Close\",            tolua_cUDPEndpoint_Close);\n\t\ttolua_function(tolua_S, \"EnableBroadcasts\", tolua_cUDPEndpoint_EnableBroadcasts);\n\t\ttolua_function(tolua_S, \"GetPort\",          tolua_cUDPEndpoint_GetPort);\n\t\ttolua_function(tolua_S, \"IsOpen\",           tolua_cUDPEndpoint_IsOpen);\n\t\ttolua_function(tolua_S, \"Send\",             tolua_cUDPEndpoint_Send);\n\ttolua_endmodule(tolua_S);\n\n\ttolua_beginmodule(tolua_S, \"cUrlClient\");\n\t\ttolua_function(tolua_S, \"Delete\",  tolua_cUrlClient_Delete);\n\t\ttolua_function(tolua_S, \"Get\",     tolua_cUrlClient_Get);\n\t\ttolua_function(tolua_S, \"Post\",    tolua_cUrlClient_Post);\n\t\ttolua_function(tolua_S, \"Put\",     tolua_cUrlClient_Put);\n\t\ttolua_function(tolua_S, \"Request\", tolua_cUrlClient_Request);\n\ttolua_endmodule(tolua_S);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/ManualBindings_RankManager.cpp",
    "content": "\n// ManualBindings_RankManager.cpp\n\n// Implements the cRankManager Lua bindings\n\n#include \"Globals.h\"\n#include \"ManualBindings.h\"\n#include \"tolua++/include/tolua++.h\"\n#include \"LuaState.h\"\n#include \"../Root.h\"\n#include \"../UUID.h\"\n\n\n\n\n\n/** Binds cRankManager::AddGroup */\nstatic int tolua_cRankManager_AddGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:AddGroup(GroupName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString GroupName;\n\tS.GetStackValue(2, GroupName);\n\n\t// Add the group:\n\tcRoot::Get()->GetRankManager()->AddGroup(GroupName);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::AddGroupToRank */\nstatic int tolua_cRankManager_AddGroupToRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:AddGroupToRank(GroupName, RankName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString GroupName, RankName;\n\tS.GetStackValues(2, GroupName, RankName);\n\n\t// Add the group to the rank:\n\tS.Push(cRoot::Get()->GetRankManager()->AddGroupToRank(GroupName, RankName));\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::AddPermissionToGroup */\nstatic int tolua_cRankManager_AddPermissionToGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:AddPermissionToGroup(Permission, GroupName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString GroupName, Permission;\n\tS.GetStackValues(2, Permission, GroupName);\n\n\t// Add the group to the rank:\n\tS.Push(cRoot::Get()->GetRankManager()->AddPermissionToGroup(Permission, GroupName));\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::AddRank */\nstatic int tolua_cRankManager_AddRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:AddRank(RankName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 5) ||\n\t\t!S.CheckParamEnd(6)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString RankName, MsgPrefix, MsgSuffix, MsgNameColorCode;\n\tS.GetStackValues(2, RankName, MsgPrefix, MsgSuffix, MsgNameColorCode);\n\n\t// Add the rank:\n\tcRoot::Get()->GetRankManager()->AddRank(RankName, MsgPrefix, MsgSuffix, MsgNameColorCode);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::AddRestrictionToGroup */\nstatic int tolua_cRankManager_AddRestrictionToGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:AddRestrictionToGroup(Restriction, GroupName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tAString GroupName, Restriction;\n\tS.GetStackValues(2, Restriction, GroupName);\n\n\t// Add the group to the rank:\n\tS.Push(cRoot::Get()->GetRankManager()->AddRestrictionToGroup(Restriction, GroupName));\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::ClearPlayerRanks */\nstatic int tolua_cRankManager_ClearPlayerRanks(lua_State * L)\n{\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Remove all players:\n\tcRoot::Get()->GetRankManager()->ClearPlayerRanks();\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetAllGroups */\nstatic int tolua_cRankManager_GetAllGroups(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetAllGroups() -> arraytable of GroupNames\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the groups:\n\tAStringVector Groups = cRoot::Get()->GetRankManager()->GetAllGroups();\n\n\t// Push the results:\n\tS.Push(Groups);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetAllPermissions */\nstatic int tolua_cRankManager_GetAllPermissions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetAllPermissions() -> arraytable of Permissions\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the permissions:\n\tAStringVector Permissions = cRoot::Get()->GetRankManager()->GetAllPermissions();\n\n\t// Push the results:\n\tS.Push(Permissions);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetAllPermissionsRestrictions */\nstatic int tolua_cRankManager_GetAllPermissionsRestrictions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetAllPermissionsRestrictions() -> arraytable of Permissions and Restrictions together\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Push the results:\n\tS.Push(cRoot::Get()->GetRankManager()->GetAllPermissionsRestrictions());\n\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetAllPlayerUUIDs */\nstatic int tolua_cRankManager_GetAllPlayerUUIDs(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetAllPlayerUUIDs() -> arraytable of Player UUID's\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the player uuid's:\n\tstd::vector<cUUID> Players = cRoot::Get()->GetRankManager()->GetAllPlayerUUIDs();\n\n\t// Convert to string UUIDs\n\tstd::vector<AString> StrUUIDs;\n\tStrUUIDs.reserve(Players.size());\n\tfor (const auto & UUID : Players)\n\t{\n\t\tStrUUIDs.push_back(UUID.ToShortString());\n\t}\n\n\t// Push the results:\n\tS.Push(StrUUIDs);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetAllRanks */\nstatic int tolua_cRankManager_GetAllRanks(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetAllRanks() -> arraytable of RankNames\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Push the results:\n\tS.Push(cRoot::Get()->GetRankManager()->GetAllRanks());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetAllRestrictions */\nstatic int tolua_cRankManager_GetAllRestrictions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetAllRestrictions() -> arraytable of Restrictions\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Push the results:\n\tS.Push(cRoot::Get()->GetRankManager()->GetAllRestrictions());\n\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetDefaultRank */\nstatic int tolua_cRankManager_GetDefaultRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetDefaultRank() -> string\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Return the rank name:\n\tS.Push(cRoot::Get()->GetRankManager()->GetDefaultRank());\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetGroupPermissions */\nstatic int tolua_cRankManager_GetGroupPermissions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetGroupPermissions(GroupName) -> arraytable of permissions\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName;\n\tS.GetStackValue(2, GroupName);\n\n\t// Get the permissions:\n\tAStringVector Permissions = cRoot::Get()->GetRankManager()->GetGroupPermissions(GroupName);\n\n\t// Push the results:\n\tS.Push(Permissions);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetGroupRestrictions */\nstatic int tolua_cRankManager_GetGroupRestrictions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetGroupRestrictions(GroupName) -> arraytable of restrictions\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName;\n\tS.GetStackValue(2, GroupName);\n\n\t// Get the restrictions:\n\tAStringVector Restrictions = cRoot::Get()->GetRankManager()->GetGroupRestrictions(GroupName);\n\n\t// Push the results:\n\tS.Push(Restrictions);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetPlayerGroups */\nstatic int tolua_cRankManager_GetPlayerGroups(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetPlayerGroups(PlayerUUID) -> arraytable of GroupNames\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID PlayerUUID;\n\tS.GetStackValue(2, PlayerUUID);\n\n\t// Get the groups:\n\tAStringVector Groups = cRoot::Get()->GetRankManager()->GetPlayerGroups(PlayerUUID);\n\n\t// Push the results:\n\tS.Push(Groups);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetPlayerMsgVisuals */\nstatic int tolua_cRankManager_GetPlayerMsgVisuals(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetPlayerMsgVisuals(PlayerUUID) -> string, string, string\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID PlayerUUID;\n\tS.GetStackValue(2, PlayerUUID);\n\n\t// Get the permissions:\n\tAString MsgPrefix, MsgSuffix, MsgNameColorCode;\n\tif (!cRoot::Get()->GetRankManager()->GetPlayerMsgVisuals(PlayerUUID, MsgPrefix, MsgSuffix, MsgNameColorCode))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Push the results:\n\tS.Push(MsgPrefix, MsgSuffix, MsgNameColorCode);\n\treturn 3;\n}\n\n\n\n\n\n/** Binds cRankManager::GetPlayerPermissions */\nstatic int tolua_cRankManager_GetPlayerPermissions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetPlayerPermissions(PlayerUUID) -> arraytable of permissions\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID PlayerUUID;\n\tS.GetStackValue(2, PlayerUUID);\n\n\t// Get the permissions:\n\tAStringVector Permissions = cRoot::Get()->GetRankManager()->GetPlayerPermissions(PlayerUUID);\n\n\t// Push the results:\n\tS.Push(Permissions);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetPlayerRestrictions */\nstatic int tolua_cRankManager_GetPlayerRestrictions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetPlayerRestrictions(PlayerUUID) -> arraytable of restrictions\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID PlayerUUID;\n\tS.GetStackValue(2, PlayerUUID);\n\n\t// Get the permissions:\n\tAStringVector Restrictions = cRoot::Get()->GetRankManager()->GetPlayerRestrictions(PlayerUUID);\n\n\t// Push the results:\n\tS.Push(Restrictions);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetPlayerRankName */\nstatic int tolua_cRankManager_GetPlayerRankName(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetPlayerRankName(PlayerUUID) -> string\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID PlayerUUID;\n\tS.GetStackValue(2, PlayerUUID);\n\n\t// Get the rank name:\n\tAString RankName = cRoot::Get()->GetRankManager()->GetPlayerRankName(PlayerUUID);\n\n\t// Push the result:\n\tS.Push(RankName);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetPlayerName */\nstatic int tolua_cRankManager_GetPlayerName(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetPlayerName(PlayerUUID) -> string\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID PlayerUUID;\n\tS.GetStackValue(2, PlayerUUID);\n\n\t// Get the player name:\n\tAString PlayerName = cRoot::Get()->GetRankManager()->GetPlayerName(PlayerUUID);\n\n\t// Push the result:\n\tS.Push(PlayerName);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetRankGroups */\nstatic int tolua_cRankManager_GetRankGroups(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetRankGroups(RankName) -> arraytable of groupnames\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString RankName;\n\tS.GetStackValue(2, RankName);\n\n\t// Get the groups:\n\tAStringVector Groups = cRoot::Get()->GetRankManager()->GetRankGroups(RankName);\n\n\t// Push the results:\n\tS.Push(Groups);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetRankPermissions */\nstatic int tolua_cRankManager_GetRankPermissions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetRankPermissions(RankName) -> arraytable of permissions\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString RankName;\n\tS.GetStackValue(2, RankName);\n\n\t// Get the permissions:\n\tAStringVector Permissions = cRoot::Get()->GetRankManager()->GetRankPermissions(RankName);\n\n\t// Push the results:\n\tS.Push(Permissions);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetRankRestrictions */\nstatic int tolua_cRankManager_GetRankRestrictions(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetRankRestrictions(RankName) -> arraytable of restrictions\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString RankName;\n\tS.GetStackValue(2, RankName);\n\n\t// Get the permissions:\n\tAStringVector Restrictions = cRoot::Get()->GetRankManager()->GetRankRestrictions(RankName);\n\n\t// Push the results:\n\tS.Push(Restrictions);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::GetRankVisuals */\nstatic int tolua_cRankManager_GetRankVisuals(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GetRankVisuals(RankName) -> MsgPrefix, MsgSuffix, MsgNameColorCode\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString RankName;\n\tS.GetStackValue(2, RankName);\n\n\t// Get the visuals:\n\tAString MsgPrefix, MsgSuffix, MsgNameColorCode;\n\tif (!cRoot::Get()->GetRankManager()->GetRankVisuals(RankName, MsgPrefix, MsgSuffix, MsgNameColorCode))\n\t{\n\t\t// No such rank, return nothing:\n\t\treturn 0;\n\t}\n\n\t// Push the results:\n\tS.Push(MsgPrefix, MsgSuffix, MsgNameColorCode);\n\treturn 3;\n}\n\n\n\n\n\n/** Binds cRankManager::GroupExists */\nstatic int tolua_cRankManager_GroupExists(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:GroupExists(GroupName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName;\n\tS.GetStackValue(2, GroupName);\n\n\t// Get the response:\n\tbool res = cRoot::Get()->GetRankManager()->GroupExists(GroupName);\n\n\t// Push the result:\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::IsGroupInRank */\nstatic int tolua_cRankManager_IsGroupInRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:IsGroupInRank(GroupName, RankName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName, RankName;\n\tS.GetStackValues(2, GroupName, RankName);\n\n\t// Get the response:\n\tbool res = cRoot::Get()->GetRankManager()->IsGroupInRank(GroupName, RankName);\n\n\t// Push the result:\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::IsPermissionInGroup */\nstatic int tolua_cRankManager_IsPermissionInGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:IsPermissionInGroup(Permission, GroupName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName, Permission;\n\tS.GetStackValues(2, Permission, GroupName);\n\n\t// Get the response:\n\tbool res = cRoot::Get()->GetRankManager()->IsPermissionInGroup(Permission, GroupName);\n\n\t// Push the result:\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::IsRestrictionInGroup */\nstatic int tolua_cRankManager_IsRestrictionInGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:IsRestrictionInGroup(Restriction, GroupName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName, Restriction;\n\tS.GetStackValues(2, Restriction, GroupName);\n\n\t// Get the response:\n\tbool res = cRoot::Get()->GetRankManager()->IsRestrictionInGroup(Restriction, GroupName);\n\n\t// Push the result:\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::IsPlayerRankSet */\nstatic int tolua_cRankManager_IsPlayerRankSet(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:IsPlayerRankSet(PlayerUUID) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID PlayerUUID;\n\tS.GetStackValue(2, PlayerUUID);\n\n\t// Get the response:\n\tbool res = cRoot::Get()->GetRankManager()->IsPlayerRankSet(PlayerUUID);\n\n\t// Push the result:\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::RankExists */\nstatic int tolua_cRankManager_RankExists(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RankExists(RankName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString RankName;\n\tS.GetStackValue(2, RankName);\n\n\t// Get the response:\n\tbool res = cRoot::Get()->GetRankManager()->RankExists(RankName);\n\n\t// Push the result:\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::RemoveGroup */\nstatic int tolua_cRankManager_RemoveGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RemoveGroup(GroupName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName;\n\tS.GetStackValue(2, GroupName);\n\n\t// Remove the group:\n\tcRoot::Get()->GetRankManager()->RemoveGroup(GroupName);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::RemoveGroupFromRank */\nstatic int tolua_cRankManager_RemoveGroupFromRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RemoveGroupFromRank(GroupName, RankName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName, RankName;\n\tS.GetStackValues(2, GroupName, RankName);\n\n\t// Remove the group:\n\tcRoot::Get()->GetRankManager()->RemoveGroupFromRank(GroupName, RankName);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::RemovePermissionFromGroup */\nstatic int tolua_cRankManager_RemovePermissionFromGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RemovePermissionFromGroup(Permission, GroupName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName, Permission;\n\tS.GetStackValues(2, Permission, GroupName);\n\n\t// Remove the permission:\n\tcRoot::Get()->GetRankManager()->RemovePermissionFromGroup(Permission, GroupName);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::RemoveRestrictionFromGroup */\nstatic int tolua_cRankManager_RemoveRestrictionFromGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RemoveRestrictionFromGroup(Restriction, GroupName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString GroupName, Restriction;\n\tS.GetStackValues(2, Restriction, GroupName);\n\n\t// Remove the restriction:\n\tcRoot::Get()->GetRankManager()->RemoveRestrictionFromGroup(Restriction, GroupName);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::RemovePlayerRank */\nstatic int tolua_cRankManager_RemovePlayerRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RemovePlayerRank(PlayerUUID)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tcUUID PlayerUUID;\n\tS.GetStackValue(2, PlayerUUID);\n\n\t// Remove the player's rank:\n\tcRoot::Get()->GetRankManager()->RemovePlayerRank(PlayerUUID);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::RemoveRank */\nstatic int tolua_cRankManager_RemoveRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RemoveRank(RankName, [ReplacementRankName])\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t// Param 3 is otpional, defaults to nil -> empty string\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString RankName, ReplacementRankName;\n\tS.GetStackValues(2, RankName, ReplacementRankName);\n\n\t// Remove the rank:\n\tcRoot::Get()->GetRankManager()->RemoveRank(RankName, ReplacementRankName);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::RenameGroup */\nstatic int tolua_cRankManager_RenameGroup(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RenameGroup(OldName, NewName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString OldName, NewName;\n\tS.GetStackValues(2, OldName, NewName);\n\n\t// Remove the group:\n\tbool res = cRoot::Get()->GetRankManager()->RenameGroup(OldName, NewName);\n\n\t// Push the result:\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::RenameRank */\nstatic int tolua_cRankManager_RenameRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:RenameRank(OldName, NewName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 3) ||\n\t\t!S.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString OldName, NewName;\n\tS.GetStackValues(2, OldName, NewName);\n\n\t// Remove the rank:\n\tbool res = cRoot::Get()->GetRankManager()->RenameRank(OldName, NewName);\n\n\t// Push the result:\n\tS.Push(res);\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::SetDefaultRank */\nstatic int tolua_cRankManager_SetDefaultRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:SetDefaultRank(RankName) -> bool\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2) ||\n\t\t!S.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString RankName;\n\tS.GetStackValue(2, RankName);\n\n\t// Set the rank, return the result:\n\tS.Push(cRoot::Get()->GetRankManager()->SetDefaultRank(RankName));\n\treturn 1;\n}\n\n\n\n\n\n/** Binds cRankManager::SetPlayerRank */\nstatic int tolua_cRankManager_SetPlayerRank(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:SetPlayerRank(PlayerUUID, PlayerName, RankName)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamStaticSelf(\"cRankManager\") ||\n\t\t!S.CheckParamUUID(2) ||\n\t\t!S.CheckParamString(3, 4) ||\n\t\t!S.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString PlayerName, RankName;\n\tcUUID PlayerUUID;\n\tS.GetStackValues(2, PlayerUUID, PlayerName, RankName);\n\n\t// Set the rank:\n\tcRoot::Get()->GetRankManager()->SetPlayerRank(PlayerUUID, PlayerName, RankName);\n\treturn 0;\n}\n\n\n\n\n\n/** Binds cRankManager::SetRankVisuals */\nstatic int tolua_cRankManager_SetRankVisuals(lua_State * L)\n{\n\t// Function signature:\n\t// cRankManager:SetRankVisuals(RankName, MsgPrefix, MsgSuffix, MsgNameColorCode)\n\n\tcLuaState S(L);\n\tif (\n\t\t!S.CheckParamUserTable(1, \"cRankManager\") ||\n\t\t!S.CheckParamString(2, 5) ||\n\t\t!S.CheckParamEnd(6)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tAString RankName, MsgPrefix, MsgSuffix, MsgNameColorCode;\n\tS.GetStackValues(2, RankName, MsgPrefix, MsgSuffix, MsgNameColorCode);\n\n\t// Set the visuals:\n\tcRoot::Get()->GetRankManager()->SetRankVisuals(RankName, MsgPrefix, MsgSuffix, MsgNameColorCode);\n\treturn 0;\n}\n\n\n\n\n\nvoid cManualBindings::BindRankManager(lua_State * tolua_S)\n{\n\t// Create the cRankManager class in the API:\n\ttolua_usertype(tolua_S, \"cRankManager\");\n\ttolua_cclass(tolua_S, \"cRankManager\", \"cRankManager\", \"\", nullptr);\n\n\t// Fill in the functions (alpha-sorted):\n\ttolua_beginmodule(tolua_S, \"cRankManager\");\n\t\ttolua_function(tolua_S, \"AddGroup\",                      tolua_cRankManager_AddGroup);\n\t\ttolua_function(tolua_S, \"AddGroupToRank\",                tolua_cRankManager_AddGroupToRank);\n\t\ttolua_function(tolua_S, \"AddPermissionToGroup\",          tolua_cRankManager_AddPermissionToGroup);\n\t\ttolua_function(tolua_S, \"AddRestrictionToGroup\",         tolua_cRankManager_AddRestrictionToGroup);\n\t\ttolua_function(tolua_S, \"AddRank\",                       tolua_cRankManager_AddRank);\n\t\ttolua_function(tolua_S, \"ClearPlayerRanks\",              tolua_cRankManager_ClearPlayerRanks);\n\t\ttolua_function(tolua_S, \"GetAllGroups\",                  tolua_cRankManager_GetAllGroups);\n\t\ttolua_function(tolua_S, \"GetAllPermissions\",             tolua_cRankManager_GetAllPermissions);\n\t\ttolua_function(tolua_S, \"GetAllRestrictions\",            tolua_cRankManager_GetAllRestrictions);\n\t\ttolua_function(tolua_S, \"GetAllPermissionsRestrictions\", tolua_cRankManager_GetAllPermissionsRestrictions);\n\t\ttolua_function(tolua_S, \"GetAllPlayerUUIDs\",             tolua_cRankManager_GetAllPlayerUUIDs);\n\t\ttolua_function(tolua_S, \"GetAllRanks\",                   tolua_cRankManager_GetAllRanks);\n\t\ttolua_function(tolua_S, \"GetDefaultRank\",                tolua_cRankManager_GetDefaultRank);\n\t\ttolua_function(tolua_S, \"GetGroupPermissions\",           tolua_cRankManager_GetGroupPermissions);\n\t\ttolua_function(tolua_S, \"GetGroupRestrictions\",          tolua_cRankManager_GetGroupRestrictions);\n\t\ttolua_function(tolua_S, \"GetPlayerGroups\",               tolua_cRankManager_GetPlayerGroups);\n\t\ttolua_function(tolua_S, \"GetPlayerMsgVisuals\",           tolua_cRankManager_GetPlayerMsgVisuals);\n\t\ttolua_function(tolua_S, \"GetPlayerPermissions\",          tolua_cRankManager_GetPlayerPermissions);\n\t\ttolua_function(tolua_S, \"GetPlayerPermissions\",          tolua_cRankManager_GetPlayerRestrictions);\n\t\ttolua_function(tolua_S, \"GetPlayerRankName\",             tolua_cRankManager_GetPlayerRankName);\n\t\ttolua_function(tolua_S, \"GetPlayerName\",                 tolua_cRankManager_GetPlayerName);\n\t\ttolua_function(tolua_S, \"GetRankGroups\",                 tolua_cRankManager_GetRankGroups);\n\t\ttolua_function(tolua_S, \"GetRankPermissions\",            tolua_cRankManager_GetRankPermissions);\n\t\ttolua_function(tolua_S, \"GetRankRestrictions\",           tolua_cRankManager_GetRankRestrictions);\n\t\ttolua_function(tolua_S, \"GetRankVisuals\",                tolua_cRankManager_GetRankVisuals);\n\t\ttolua_function(tolua_S, \"GroupExists\",                   tolua_cRankManager_GroupExists);\n\t\ttolua_function(tolua_S, \"IsGroupInRank\",                 tolua_cRankManager_IsGroupInRank);\n\t\ttolua_function(tolua_S, \"IsPermissionInGroup\",           tolua_cRankManager_IsPermissionInGroup);\n\t\ttolua_function(tolua_S, \"IsRestrictionInGroup\",          tolua_cRankManager_IsRestrictionInGroup);\n\t\ttolua_function(tolua_S, \"IsPlayerRankSet\",               tolua_cRankManager_IsPlayerRankSet);\n\t\ttolua_function(tolua_S, \"RankExists\",                    tolua_cRankManager_RankExists);\n\t\ttolua_function(tolua_S, \"RemoveGroup\",                   tolua_cRankManager_RemoveGroup);\n\t\ttolua_function(tolua_S, \"RemoveGroupFromRank\",           tolua_cRankManager_RemoveGroupFromRank);\n\t\ttolua_function(tolua_S, \"RemovePermissionFromGroup\",     tolua_cRankManager_RemovePermissionFromGroup);\n\t\ttolua_function(tolua_S, \"RemoveRestrictionFromGroup\",    tolua_cRankManager_RemoveRestrictionFromGroup);\n\t\ttolua_function(tolua_S, \"RemovePlayerRank\",              tolua_cRankManager_RemovePlayerRank);\n\t\ttolua_function(tolua_S, \"RemoveRank\",                    tolua_cRankManager_RemoveRank);\n\t\ttolua_function(tolua_S, \"RenameGroup\",                   tolua_cRankManager_RenameGroup);\n\t\ttolua_function(tolua_S, \"RenameRank\",                    tolua_cRankManager_RenameRank);\n\t\ttolua_function(tolua_S, \"SetDefaultRank\",                tolua_cRankManager_SetDefaultRank);\n\t\ttolua_function(tolua_S, \"SetPlayerRank\",                 tolua_cRankManager_SetPlayerRank);\n\t\ttolua_function(tolua_S, \"SetRankVisuals\",                tolua_cRankManager_SetRankVisuals);\n\ttolua_endmodule(tolua_S);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/ManualBindings_World.cpp",
    "content": "\n// ManualBindings_World.cpp\n\n// Implements the manual Lua API bindings for the cWorld class\n\n#include \"Globals.h\"\n#include \"tolua++/include/tolua++.h\"\n#include \"../World.h\"\n#include \"../UUID.h\"\n#include \"ManualBindings.h\"\n#include \"LuaState.h\"\n#include \"PluginLua.h\"\n#include \"LuaChunkStay.h\"\n\n#include \"BlockEntities/BeaconEntity.h\"\n#include \"BlockEntities/BedEntity.h\"\n#include \"BlockEntities/BrewingstandEntity.h\"\n#include \"BlockEntities/ChestEntity.h\"\n#include \"BlockEntities/CommandBlockEntity.h\"\n#include \"BlockEntities/DispenserEntity.h\"\n#include \"BlockEntities/DropSpenserEntity.h\"\n#include \"BlockEntities/DropperEntity.h\"\n#include \"BlockEntities/FlowerPotEntity.h\"\n#include \"BlockEntities/FurnaceEntity.h\"\n#include \"BlockEntities/HopperEntity.h\"\n#include \"BlockEntities/MobHeadEntity.h\"\n#include \"BlockEntities/NoteEntity.h\"\n\n\n\n\n\n/** Check that a Lua parameter is either a vector or 3 numbers in sequence\n\\param L The Lua state\n\\param a_VectorName name of the vector class e.g. \"Vector3<int>\"\n\\param a_Index Index to the start of the vector in the parameter list\n\\param[out] a_NextIndex Index of the next parameter after the vector\n\\retval true if the parameter is a vector or 3 numbers */\nstatic bool CheckParamVectorOr3Numbers(cLuaState & L, const char * a_VectorName, int a_Index, int & a_NextIndex)\n{\n\tif (L.IsParamUserType(a_Index, a_VectorName))\n\t{\n\t\ta_NextIndex = a_Index + 1;\n\t\treturn L.CheckParamUserType(a_Index, a_VectorName);\n\t}\n\n\ta_NextIndex = a_Index + 3;\n\treturn L.CheckParamNumber(a_Index, a_Index + 2);\n}\n\n\n\n\n\n/** Get a vector from the stack, which may be represented in lua as either a `Vector3<T>` or 3 numbers */\ntemplate <typename T>\nstatic bool GetStackVectorOr3Numbers(cLuaState & L, int a_Index, Vector3<T> & a_Return)\n{\n\tif (L.GetStackValue(a_Index, a_Return))\n\t{\n\t\treturn true;\n\t}\n\treturn L.GetStackValues(a_Index, a_Return.x, a_Return.y, a_Return.z);\n}\n\n\n\n\n\n/** Template for the bindings for the DoWithXYZAt(X, Y, Z) functions that don't need to check their coords. */\ntemplate <class BlockEntityType, BLOCKTYPE... BlockTypes>\nstatic int DoWithBlockEntityAt(lua_State * tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\n\t// Check params:\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamFunction(OffsetIndex) ||\n\t\t!L.CheckParamEnd(OffsetIndex + 1)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcWorld * Self = nullptr;\n\tVector3i Position;\n\tcLuaState::cRef FnRef;\n\n\t// Get parameters:\n\tif (\n\t\t!L.GetStackValues(1, Self) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position) ||\n\t\t!L.GetStackValues(OffsetIndex, FnRef)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (Self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self'\");\n\t}\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Expected a valid callback function for parameter {}\"), OffsetIndex));\n\t}\n\n\t// Call the DoWith function:\n\tbool res = Self->DoWithBlockEntityAt(Position, [&L, &FnRef](cBlockEntity & a_BlockEntity)\n\t{\n\t\tif constexpr (sizeof...(BlockTypes) != 0)\n\t\t{\n\t\t\tif (((a_BlockEntity.GetBlockType() != BlockTypes) && ...))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tbool ret = false;\n\t\tL.Call(FnRef, static_cast<BlockEntityType *>(&a_BlockEntity), cLuaState::Return, ret);\n\t\treturn ret;\n\t});\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\ntemplate <\n\tclass Ty1,\n\tclass Ty2,\n\tbool (Ty1::*ForEachFn)(const cBoundingBox &, cFunctionRef<bool(Ty2 &)>)\n>\nstatic int ForEachInBox(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cWorld\") ||\n\t\t!L.CheckParamUserType(2, \"cBoundingBox\") ||\n\t\t!L.CheckParamFunction(3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get the params:\n\tTy1 * Self = nullptr;\n\tcBoundingBox * Box = nullptr;\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(1, Self, Box, FnRef);\n\tif ((Self == nullptr) || (Box == nullptr))\n\t{\n\t\treturn L.ApiParamError(fmt::format(FMT_STRING(\"Invalid world ({}) or boundingbox ({})\"), fmt::ptr(Self), fmt::ptr(Box)));\n\t}\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid callback function for parameter #2\");\n\t}\n\n\tbool res = (Self->*ForEachFn)(*Box, [&](Ty2 & a_Item)\n\t\t{\n\t\t\tbool ret = false;\n\t\t\tif (!L.Call(FnRef, &a_Item, cLuaState::Return, ret))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"Failed to call Lua callback\");\n\t\t\t\tL.LogStackTrace();\n\t\t\t\treturn true;  // Abort enumeration\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\t);\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\ntemplate <class BlockEntityType, BLOCKTYPE... BlockTypes>\nstatic int ForEachBlockEntityInChunk(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamNumber(2, 3) ||\n\t\t!L.CheckParamFunction(4) ||\n\t\t!L.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get parameters:\n\tcWorld * Self = nullptr;\n\tint ChunkX = 0;\n\tint ChunkZ = 0;\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(1, Self, ChunkX, ChunkZ, FnRef);\n\tif (Self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid callback function for parameter #4\");\n\t}\n\n\t// Call the ForEach function:\n\tbool res = Self->ForEachBlockEntityInChunk(ChunkX, ChunkZ, [&L, &FnRef](cBlockEntity & a_BlockEntity)\n\t{\n\t\tif constexpr (sizeof...(BlockTypes) != 0)\n\t\t{\n\t\t\tif (((a_BlockEntity.GetBlockType() != BlockTypes) && ...))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tbool ret = false;\n\t\tL.Call(FnRef, static_cast<BlockEntityType *>(&a_BlockEntity), cLuaState::Return, ret);\n\t\treturn ret;\n\t});\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_BroadcastBlockAction(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tvoid BroadcastBlockAction(number a_BlockX, number a_BlockY, number a_BlockZ, number a_number1, number a_number2, number a_BlockType, cClientHandle a_Exclude)\n\t--or--\n\tvoid BroadcastBlockAction(Vector3<int> a_BlockPos, number a_Byte1, number a_Byte2, number a_BlockType, cClientHandle a_Exclude)\n\t*/\n\n\tcLuaState L(tolua_S);\n\tint Byte1Index;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, Byte1Index) ||\n\t\t!L.CheckParamNumber(Byte1Index, Byte1Index + 2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (Byte1Index != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"BroadcastBlockAction with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\t// Read the params:\n\tcWorld * Self;\n\tVector3i BlockPos;\n\tByte Byte1, Byte2;\n\tBLOCKTYPE BlockType;\n\tconst cClientHandle * Exclude = nullptr;\n\n\tif (\n\t\t!L.GetStackValues(1, Self) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, BlockPos) ||\n\t\t!L.GetStackValues(Byte1Index, Byte1, Byte2, BlockType)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Optional param\n\tL.GetStackValue(Byte1Index + 3, Exclude);\n\n\tSelf->BroadcastBlockAction(BlockPos, Byte1, Byte2, BlockType, Exclude);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_BroadcastSoundEffect(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tvoid BroadcastSoundEffect(string a_SoundName, number a_X, number a_Y, number a_Z, number a_Volume, number a_Pitch, [cClientHandle * a_Exclude])\n\t--or--\n\tvoid BroadcastSoundEffect(string a_SoundName, Vector3d, number a_Volume, number a_Pitch, [cClientHandle a_Exclude])\n\t*/\n\tcLuaState L(tolua_S);\n\tint VolumeIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<double>\", 3, VolumeIndex) ||\n\t\t!L.CheckParamNumber(VolumeIndex, VolumeIndex + 1)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (VolumeIndex != 4)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"BroadcastSoundEffect with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\t// Read the params:\n\tcWorld * Self;\n\tAString SoundName;\n\tVector3d BlockPos;\n\tfloat Volume, Pitch;\n\tconst cClientHandle * Exclude = nullptr;\n\n\tif (\n\t\t!L.GetStackValues(1, Self, SoundName) ||\n\t\t!GetStackVectorOr3Numbers(L, 3, BlockPos) ||\n\t\t!L.GetStackValues(VolumeIndex, Volume, Pitch)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Optional param\n\tL.GetStackValue(VolumeIndex + 2, Exclude);\n\n\tSelf->BroadcastSoundEffect(SoundName, BlockPos, Volume, Pitch, Exclude);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_BroadcastSoundParticleEffect(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:BroadcastSoundParticleEffect(EffectID a_EffectID, Vector3i a_SrcPos, number a_Data, [cClientHandle a_Exclude])\n\t--or--\n\tvoid BroadcastSoundParticleEffect(EffectID a_EffectID, number a_SrcX, number a_SrcY, number a_SrcZ, number a_Data, [cClientHandle a_Exclude])\n\t*/\n\tcLuaState L(tolua_S);\n\tint DataIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamNumber(2) ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 3, DataIndex) ||\n\t\t!L.CheckParamNumber(DataIndex)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (DataIndex != 4)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"BroadcastSoundParticleEffect with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\t// Read the params:\n\tcWorld * World = nullptr;\n\tInt32 EffectId;\n\tVector3i SrcPos;\n\tint Data;\n\tcClientHandle * ExcludeClient = nullptr;\n\n\tif (\n\t\t!L.GetStackValues(1, World, EffectId) ||\n\t\t!GetStackVectorOr3Numbers(L, 3, SrcPos) ||\n\t\t!L.GetStackValue(DataIndex, Data)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Optional param\n\tL.GetStackValue(DataIndex + 1, ExcludeClient);\n\n\tWorld->BroadcastSoundParticleEffect(static_cast<EffectID>(EffectId), SrcPos, Data, ExcludeClient);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_BroadcastParticleEffect(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:BroadcastParticleEffect(\"Name\", PosX, PosY, PosZ, OffX, OffY, OffZ, ParticleData, ParticleAmount, [ExcludeClient], [OptionalParam1], [OptionalParam2])\n\t--or--\n\tWorld:BroadcastParticleEffect(\"Name\", SrcPos, Offset, ParticleData, ParticleAmount, [ExcludeClient], [OptionalParam1], [OptionalParam2])\n\t*/\n\tcLuaState L(tolua_S);\n\tint OffsetIndex, ParticleDataIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamString(2) ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<float>\", 3, OffsetIndex) ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<float>\", OffsetIndex, ParticleDataIndex)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif ((OffsetIndex != 4) || (ParticleDataIndex != 5))  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"BroadcastParticleEffect with 3 position and 3 offset arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\t// Read the params:\n\tcWorld * World = nullptr;\n\tAString Name;\n\tVector3f SrcPos, Offset;\n\tfloat ParticleData;\n\tint ParticleAmount;\n\tcClientHandle * ExcludeClient = nullptr;\n\n\tif (\n\t\t!L.GetStackValues(1, World, Name) ||\n\t\t!GetStackVectorOr3Numbers(L, 3, SrcPos) ||\n\t\t!GetStackVectorOr3Numbers(L, OffsetIndex, Offset) ||\n\t\t!L.GetStackValues(ParticleDataIndex, ParticleData, ParticleAmount)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read up to 3 more optional params:\n\tL.GetStackValue(ParticleDataIndex + 2, ExcludeClient);\n\n\tstd::array<int, 2> Data;\n\tbool HasData = L.GetStackValues(ParticleDataIndex + 3, Data[0], Data[1]);\n\n\tif (HasData)\n\t{\n\t\tWorld->BroadcastParticleEffect(Name, SrcPos, Offset, ParticleData, ParticleAmount, Data, ExcludeClient);\n\t}\n\telse\n\t{\n\t\tWorld->BroadcastParticleEffect(Name, SrcPos, Offset, ParticleData, ParticleAmount, ExcludeClient);\n\t}\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_ChunkStay(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:ChunkStay(ChunkCoordTable, OnChunkAvailable, OnAllChunksAvailable)\n\tChunkCoordTable == { {Chunk1x, Chunk1z}, {Chunk2x, Chunk2z}, ... }\n\t*/\n\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType     (1, \"cWorld\") ||\n\t\t!L.CheckParamTable        (2) ||\n\t\t!L.CheckParamFunctionOrNil(3, 4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tcWorld * world;\n\tcLuaState::cStackTablePtr chunkCoords;\n\tcLuaState::cOptionalCallbackPtr onChunkAvailable, onAllChunksAvailable;  // Callbacks may be unassigned at all - as a request to load / generate chunks\n\tif (!L.GetStackValues(1, world, chunkCoords, onChunkAvailable, onAllChunksAvailable))\n\t{\n\t\tLOGWARNING(\"cWorld:ChunkStay(): Cannot read parameters, bailing out.\");\n\t\tL.LogStackTrace();\n\t\tL.LogStackValues(\"Values on the stack\");\n\t\treturn 0;\n\t}\n\tif (world == nullptr)\n\t{\n\t\tLOGWARNING(\"World:ChunkStay(): invalid world parameter\");\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\tASSERT(chunkCoords != nullptr);  // If the table was invalid, GetStackValues() would have failed\n\n\t// Read the chunk coords:\n\tauto chunkStay = std::make_unique<cLuaChunkStay>();\n\tif (!chunkStay->AddChunks(*chunkCoords))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Activate the ChunkStay:\n\tchunkStay.release()->Enable(*world->GetChunkMap(), std::move(onChunkAvailable), std::move(onAllChunksAvailable));\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_DoExplosionAt(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:DoExplosionAt(ExplosionSize, BlockX, BlockY, BlockZ, CanCauseFire, SourceType, [SourceData])\n\t*/\n\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType     (1, \"cWorld\") ||\n\t\t!L.CheckParamNumber       (2, 5) ||\n\t\t!L.CheckParamBool         (6) ||\n\t\t!L.CheckParamNumber       (7) ||\n\t\t!L.CheckParamEnd          (9)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tcWorld * World;\n\tdouble ExplosionSize;\n\tint BlockX, BlockY, BlockZ;\n\tbool CanCauseFire;\n\tint SourceTypeInt;\n\tif (!L.GetStackValues(1, World, ExplosionSize, BlockX, BlockY, BlockZ, CanCauseFire, SourceTypeInt))\n\t{\n\t\tLOGWARNING(\"World:DoExplosionAt(): invalid parameters\");\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\tif ((SourceTypeInt < 0) || (SourceTypeInt >= esMax))\n\t{\n\t\tLOGWARNING(\"World:DoExplosionAt(): Invalid source type\");\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\teExplosionSource SourceType;\n\tvoid * SourceData;\n\tswitch (SourceTypeInt)\n\t{\n\t\tcase esBed:\n\t\t{\n\t\t\t// esBed receives a Vector3i SourceData param:\n\t\t\tVector3i pos;\n\t\t\tL.GetStackValue(8, pos);\n\t\t\tSourceType = esBed;\n\t\t\tSourceData = &pos;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase esEnderCrystal:\n\t\tcase esGhastFireball:\n\t\tcase esMonster:\n\t\tcase esPrimedTNT:\n\t\tcase esWitherBirth:\n\t\tcase esWitherSkull:\n\t\t{\n\t\t\t// These all receive a cEntity descendant SourceData param:\n\t\t\tcEntity * ent = nullptr;\n\t\t\tL.GetStackValue(8, ent);\n\t\t\tSourceType = static_cast<eExplosionSource>(SourceTypeInt);\n\t\t\tSourceData = ent;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase esOther:\n\t\tcase esPlugin:\n\t\t{\n\t\t\t// esOther and esPlugin ignore their SourceData params\n\t\t\tSourceType = static_cast<eExplosionSource>(SourceTypeInt);\n\t\t\tSourceData = nullptr;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"cWorld:DoExplosionAt(): invalid SourceType parameter: %d\", SourceTypeInt);\n\t\t\tL.LogStackTrace();\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t// Create the actual explosion:\n\tWorld->DoExplosionAt(ExplosionSize, BlockX, BlockY, BlockZ, CanCauseFire, SourceType, SourceData);\n\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_DoWithPlayerByUUID(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamUUID(2) ||\n\t\t!L.CheckParamFunction(3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get parameters:\n\tcWorld * Self;\n\tcUUID PlayerUUID;\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(1, Self, PlayerUUID, FnRef);\n\n\tif (PlayerUUID.IsNil())\n\t{\n\t\treturn L.ApiParamError(\"Expected a non-nil UUID for parameter #1\");\n\t}\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid callback function for parameter #2\");\n\t}\n\n\t// Call the function:\n\tbool res = Self->DoWithPlayerByUUID(PlayerUUID, [&](cPlayer & a_Player)\n\t\t{\n\t\t\tbool ret = false;\n\t\t\tL.Call(FnRef, &a_Player, cLuaState::Return, ret);\n\t\t\treturn ret;\n\t\t}\n\t);\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_DoWithNearestPlayer(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamUserType(2, \"Vector3<double>\") ||\n\t\t!L.CheckParamNumber(3) ||\n\t\t!L.CheckParamFunction(4) ||\n\t\t// Params 5 and 6 are optional bools, no check for those\n\t\t!L.CheckParamEnd(7)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get parameters:\n\tcWorld * Self;\n\tVector3d Position;\n\tdouble RangeLimit;\n\tcLuaState::cRef FnRef;\n\tbool CheckLineOfSight = true, IgnoreSpectators = true;  // Defaults for the optional params\n\tL.GetStackValues(1, Self, Position, RangeLimit, FnRef, CheckLineOfSight, IgnoreSpectators);\n\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid callback function for parameter #3\");\n\t}\n\n\t// Call the function:\n\tbool res = Self->DoWithNearestPlayer(Position, RangeLimit, [&](cPlayer & a_Player)\n\t{\n\t\tbool ret = false;\n\t\tL.Call(FnRef, &a_Player, cLuaState::Return, ret);\n\t\treturn ret;\n\t}, CheckLineOfSight, IgnoreSpectators);\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_FastSetBlock(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:FastSetBlock(BlockX, BlockY, BlockZ)\n\t--or--\n\tWorld:FastSetBlock(Position)\n\t*/\n\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamNumber(OffsetIndex, OffsetIndex + 1) ||\n\t\t!L.CheckParamEnd(OffsetIndex + 2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"FastSetBlock with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\tBLOCKTYPE Type;\n\tNIBBLETYPE Meta;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValues(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position) ||\n\t\t!L.GetStackValues(OffsetIndex, Type, Meta)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'position'\");\n\t}\n\n\tWorld->FastSetBlock(Position, Type, Meta);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_ForEachEntityInChunk(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cWorld\") ||\n\t\t!L.CheckParamNumber(2, 3) ||\n\t\t!L.CheckParamFunction(4) ||\n\t\t!L.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get parameters:\n\tcWorld * Self = nullptr;\n\tint ChunkX = 0;\n\tint ChunkZ = 0;\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(1, Self, ChunkX, ChunkZ, FnRef);\n\tif (Self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self'\");\n\t}\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn L.ApiParamError(\"Expected a valid callback function for parameter #4\");\n\t}\n\n\t// Call the DoWith function:\n\tbool res = Self->ForEachEntityInChunk(ChunkX, ChunkZ, [&](cEntity & a_Item)\n\t\t{\n\t\t\tbool ret = false;\n\t\t\tL.Call(FnRef, &a_Item, cLuaState::Return, ret);\n\t\t\treturn ret;\n\t\t}\n\t);\n\n\t// Push the result as the return value:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_ForEachLoadedChunk(lua_State * tolua_S)\n{\n\t// Exported manually, because tolua doesn't support converting functions to functor types.\n\t// Function signature: ForEachLoadedChunk(callback) -> bool\n\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cWorld\") ||\n\t\t!L.CheckParamFunction(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcPluginLua * Plugin = cManualBindings::GetLuaPlugin(tolua_S);\n\tif (Plugin == nullptr)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Read the params:\n\tcWorld * World = static_cast<cWorld *>(tolua_tousertype(tolua_S, 1, nullptr));\n\tif (World == nullptr)\n\t{\n\t\tLOGWARNING(\"World:ForEachLoadedChunk(): invalid world parameter\");\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\tcLuaState::cRef FnRef;\n\tL.GetStackValues(2, FnRef);\n\tif (!FnRef.IsValid())\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Could not get function reference of parameter #2\");\n\t}\n\n\t// Call the enumeration:\n\tbool ret = World->ForEachLoadedChunk(\n\t\t[&L, &FnRef](int a_ChunkX, int a_ChunkZ) -> bool\n\t\t{\n\t\t\tbool res = false;  // By default continue the enumeration\n\t\t\tL.Call(FnRef, a_ChunkX, a_ChunkZ, cLuaState::Return, res);\n\t\t\treturn res;\n\t\t}\n\t);\n\n\t// Push the return value:\n\tL.Push(ret);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetBlock(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:GetBlock(BlockX, BlockY, BlockZ) -> BlockType\n\t--or--\n\tWorld:GetBlock(Position) -> BlockType\n\t*/\n\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamEnd(OffsetIndex)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"GetBlock with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValues(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\tL.Push(E_BLOCK_AIR);\n\t\treturn 1;\n\t}\n\n\tL.Push(World->GetBlock(Position));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetBlockBlockLight(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:GetBlockBlockLight(BlockX, BlockY, BlockZ) -> BlockLight\n\t--or--\n\tWorld:GetBlockBlockLight(Position) -> BlockLight\n\t*/\n\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamEnd(OffsetIndex)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"GetBlockBlockLight with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValues(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'position'\");\n\t}\n\n\tL.Push(World->GetBlockBlockLight(Position));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetBlockInfo(lua_State * tolua_S)\n{\n\t/* Exported manually, because tolua would generate useless additional parameters (a_BlockType .. a_BlockSkyLight)\n\tFunction signature:\n\tGetBlockInfo(BlockX, BlockY, BlockZ) -> BlockValid, [BlockType, BlockMeta, BlockSkyLight, BlockBlockLight]\n\t--or--\n\tGetBlockInfo(Position) -> BlockValid, [BlockType, BlockMeta, BlockSkyLight, BlockBlockLight]\n\t*/\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamEnd(OffsetIndex)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"GetBlockInfo with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValues(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'position'\");\n\t}\n\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta, BlockSkyLight, BlockBlockLight;\n\n\t// Call the function:\n\tbool res = World->GetBlockInfo(Position, BlockType, BlockMeta, BlockSkyLight, BlockBlockLight);\n\n\t// Push the returned values:\n\tL.Push(res);\n\tif (res)\n\t{\n\t\tL.Push(BlockType, BlockMeta, BlockSkyLight, BlockBlockLight);\n\t\treturn 5;\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetBlockMeta(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:GetBlockMeta(BlockX, BlockY, BlockZ) -> BlockMeta\n\t--or--\n\tWorld:GetBlockMeta(Position) -> BlockMeta\n\t*/\n\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamEnd(OffsetIndex)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"GetBlockMeta with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValues(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\tL.Push(0);\n\t\treturn 1;\n\t}\n\n\tL.Push(World->GetBlockMeta(Position));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetBlockSkyLight(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:GetBlockSkyLight(BlockX, BlockY, BlockZ) -> BlockLight\n\t--or--\n\tWorld:GetBlockSkyLight(Position) -> BlockLight\n\t*/\n\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamEnd(OffsetIndex)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"GetBlockSkyLight with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValues(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'position'\");\n\t}\n\n\tL.Push(World->GetBlockSkyLight(Position));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetBlockTypeMeta(lua_State * tolua_S)\n{\n\t/* Exported manually, because tolua would generate useless additional parameters (a_BlockType, a_BlockMeta)\n\tFunction signature:\n\tGetBlockTypeMeta(BlockX, BlockY, BlockZ) -> BlockValid, [BlockType, BlockMeta]\n\t--or--\n\tGetBlockTypeMeta(Position) -> BlockValid, [BlockType, BlockMeta]\n\t*/\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamEnd(OffsetIndex)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"GetBlockTypeMeta with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValues(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\tL.Push(E_BLOCK_AIR, 0);\n\t\treturn 2;\n\t}\n\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\n\t// Call the function:\n\tbool res = World->GetBlockTypeMeta(Position, BlockType, BlockMeta);\n\n\t// Push the returned values:\n\tL.Push(res);\n\tif (res)\n\t{\n\t\tL.Push(BlockType, BlockMeta);\n\t\treturn 3;\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetSignLines(lua_State * tolua_S)\n{\n\t// Exported manually, because tolua would generate useless additional parameters (a_Line1 .. a_Line4)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cWorld\") ||\n\t\t!L.CheckParamNumber(2, 4) ||\n\t\t!L.CheckParamEnd(5)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tcWorld * Self = nullptr;\n\tint BlockX = 0;\n\tint BlockY = 0;\n\tint BlockZ = 0;\n\tL.GetStackValues(1, Self, BlockX, BlockY, BlockZ);\n\tif (Self == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\t// Call the function:\n\tAString Line1, Line2, Line3, Line4;\n\tbool res = Self->GetSignLines(BlockX, BlockY, BlockZ, Line1, Line2, Line3, Line4);\n\n\t// Push the returned values:\n\tL.Push(res);\n\tif (res)\n\t{\n\t\tL.Push(Line1, Line2, Line3, Line4);\n\t\treturn 5;\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetTimeOfDay(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tcWorld * Self = nullptr;\n\tL.GetStackValues(1, Self);\n\tif (Self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self'\");\n\t}\n\n\t// Call the function:\n\tconst auto Time = Self->GetTimeOfDay();\n\n\t// Push the returned value:\n\tL.Push(Time.count());\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetWorldAge(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamEnd(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tcWorld * Self = nullptr;\n\tL.GetStackValues(1, Self);\n\tif (Self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self'\");\n\t}\n\n\t// Call the function:\n\tconst auto Time = Self->GetWorldAge();\n\n\t// Push the returned value:\n\tL.Push(static_cast<lua_Number>(Time.count()));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_PrepareChunk(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:PrepareChunk(ChunkX, ChunkZ, Callback)\n\t*/\n\n\t// Check the param types:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType     (1, \"cWorld\") ||\n\t\t!L.CheckParamNumber       (2, 3) ||\n\t\t!L.CheckParamFunctionOrNil(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Wrap the Lua callback inside a C++ callback class:\n\tclass cCallback:\n\t\tpublic cChunkCoordCallback\n\t{\n\tpublic:\n\t\t// cChunkCoordCallback override:\n\t\tvirtual void Call(cChunkCoords a_Coords, bool a_IsSuccess) override\n\t\t{\n\t\t\tm_LuaCallback.Call(a_Coords.m_ChunkX, a_Coords.m_ChunkZ, a_IsSuccess);\n\t\t}\n\n\t\tcLuaState::cOptionalCallback m_LuaCallback;\n\t};\n\n\t// Read the params:\n\tcWorld * world = nullptr;\n\tint chunkX = 0;\n\tint chunkZ = 0;\n\tauto Callback = std::make_unique<cCallback>();\n\tL.GetStackValues(1, world, chunkX, chunkZ, Callback->m_LuaCallback);\n\tif (world == nullptr)\n\t{\n\t\tLOGWARNING(\"World:PrepareChunk(): invalid world parameter\");\n\t\tL.LogStackTrace();\n\t\treturn 0;\n\t}\n\n\t// Call the chunk preparation:\n\tworld->PrepareChunk(chunkX, chunkZ, std::move(Callback));\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_QueueTask(lua_State * tolua_S)\n{\n\t// Function signature:\n\t// World:QueueTask(Callback)\n\n\t// Retrieve the args:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cWorld\") ||\n\t\t!L.CheckParamFunction(2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcWorld * World;\n\tcLuaState::cCallbackSharedPtr Task;\n\tif (!L.GetStackValues(1, World, Task))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Cannot read parameters\");\n\t}\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Not called on an object instance\");\n\t}\n\tif (!Task->IsValid())\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Could not store the callback parameter\");\n\t}\n\n\tWorld->QueueTask([Task](cWorld & a_World)\n\t\t{\n\t\t\tTask->Call(&a_World);\n\t\t}\n\t);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_SetBlock(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:SetBlock(BlockX, BlockY, BlockZ, BlockType, BlockMeta)\n\t--or--\n\tWorld:SetBlock(Position, BlockType, BlockMeta)\n\t*/\n\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamNumber(OffsetIndex, OffsetIndex + 1) ||\n\t\t!L.CheckParamEnd(OffsetIndex + 2)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"SetBlock with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\tBLOCKTYPE Type;\n\tNIBBLETYPE Meta;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValues(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position) ||\n\t\t!L.GetStackValues(OffsetIndex, Type, Meta)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'position'\");\n\t}\n\n\tWorld->SetBlock(Position, Type, Meta);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_SetBlockMeta(lua_State * tolua_S)\n{\n\t/* Function signature:\n\tWorld:SetBlockMeta(BlockX, BlockY, BlockZ, BlockMeta)\n\t--or--\n\tWorld:SetBlockMeta(Position, BlockMeta)\n\t*/\n\n\tcLuaState L(tolua_S);\n\tint OffsetIndex;\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!CheckParamVectorOr3Numbers(L, \"Vector3<int>\", 2, OffsetIndex) ||\n\t\t!L.CheckParamNumber(OffsetIndex) ||\n\t\t!L.CheckParamEnd(OffsetIndex + 1)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (OffsetIndex != 3)  // Not the vector overload\n\t{\n\t\tL.LogStackTrace();\n\t\tLOGWARN(\"SetBlockMeta with 3 position arguments is deprecated, use vector-parametered version instead.\");\n\t}\n\n\tcWorld * World;\n\tVector3i Position;\n\tNIBBLETYPE Meta;\n\n\t// Read the params:\n\tif (\n\t\t!L.GetStackValue(1, World) ||\n\t\t!GetStackVectorOr3Numbers(L, 2, Position) ||\n\t\t!L.GetStackValue(OffsetIndex, Meta)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'position'\");\n\t}\n\n\tWorld->SetBlockMeta(Position, Meta);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_SetSignLines(lua_State * tolua_S)\n{\n\t// Exported manually, because tolua would generate useless additional return values (a_Line1 .. a_Line4)\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cWorld\") ||\n\t\t!L.CheckParamNumber(2, 4) ||\n\t\t!L.CheckParamString(5, 8) ||\n\t\t!L.CheckParamEnd(9)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tcWorld * Self = nullptr;\n\tint BlockX = 0;\n\tint BlockY = 0;\n\tint BlockZ = 0;\n\tAString Line1, Line2, Line3, Line4;\n\tL.GetStackValues(1, Self, BlockX, BlockY, BlockZ, Line1, Line2, Line3, Line4);\n\tif (Self == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Invalid 'self'\");\n\t}\n\n\t// Call the function:\n\tbool res = Self->SetSignLines({BlockX, BlockY, BlockZ}, Line1, Line2, Line3, Line4);\n\n\t// Push the returned values:\n\tL.Push(res);\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_SetTimeOfDay(lua_State * tolua_S)\n{\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamNumber(2) ||\n\t\t!L.CheckParamEnd(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tcWorld * Self = nullptr;\n\tcTickTime::rep Time;\n\tL.GetStackValues(1, Self, Time);\n\tif (Self == nullptr)\n\t{\n\t\treturn L.ApiParamError(\"Invalid 'self'\");\n\t}\n\n\t// Call the function:\n\tSelf->SetTimeOfDay(cTickTime(Time));\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_ScheduleTask(lua_State * tolua_S)\n{\n\t// Function signature:\n\t// World:ScheduleTask(NumTicks, Callback)\n\n\t// Retrieve the args:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cWorld\") ||\n\t\t!L.CheckParamNumber  (2) ||\n\t\t!L.CheckParamFunction(3)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\tcWorld * World;\n\tint NumTicks;\n\tauto Task = std::make_shared<cLuaState::cCallback>();\n\tif (!L.GetStackValues(1, World, NumTicks, Task))\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Cannot read parameters\");\n\t}\n\tif (World == nullptr)\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Not called on an object instance\");\n\t}\n\tif (!Task->IsValid())\n\t{\n\t\treturn cManualBindings::lua_do_error(tolua_S, \"Error in function call '#funcname#': Could not store the callback parameter\");\n\t}\n\n\tWorld->ScheduleTask(cTickTime(NumTicks), [Task](cWorld & a_World)\n\t\t{\n\t\t\tTask->Call(&a_World);\n\t\t}\n\t);\n\treturn 0;\n}\n\n\n\n\n\nstatic int tolua_cWorld_SpawnSplitExperienceOrbs(lua_State* tolua_S)\n{\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamUserType(2, \"Vector3<double>\") ||\n\t\t!L.CheckParamNumber(3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\tcWorld * self = nullptr;\n\tVector3d Position;\n\tint Reward;\n\tL.GetStackValues(1, self, Position, Reward);\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"Invalid 'self' in function 'SpawnSplitExperienceOrbs'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Execute and push result:\n\tL.Push(self->SpawnExperienceOrb(Position, Reward));\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_TryGetHeight(lua_State * tolua_S)\n{\n\t/* Exported manually because we don't export optional<T>\n\tFunction signature: world:TryGetHeight(a_World, a_BlockX, a_BlockZ) -> IsValid, Height\n\t*/\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamUserType(1, \"cWorld\") ||\n\t\t!L.CheckParamNumber(2, 3) ||\n\t\t!L.CheckParamEnd(4)\n\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tcWorld * self = nullptr;\n\tint BlockX = 0;\n\tint BlockZ = 0;\n\tL.GetStackValues(1, self, BlockX, BlockZ);\n\tif (self == nullptr)\n\t{\n\t\ttolua_error(tolua_S, \"Invalid 'self' in function 'TryGetHeight'\", nullptr);\n\t\treturn 0;\n\t}\n\n\t// Call the implementation:\n\tauto Height = self->GetHeight(BlockX, BlockZ);\n\tL.Push(Height.has_value());\n\tif (Height.has_value())\n\t{\n\t\tL.Push(Height.value());\n\t\treturn 2;\n\t}\n\treturn 1;\n}\n\n\n\n\n\nstatic int tolua_cWorld_GetHeight(lua_State * tolua_S)\n{\n\t// Signature: world:GetHeight(a_World, a_BlockX, a_BlockZ) -> Height\n\n\t// Check params:\n\tcLuaState L(tolua_S);\n\tif (\n\t\t!L.CheckParamSelf(\"cWorld\") ||\n\t\t!L.CheckParamNumber(2, 3) ||\n\t\t!L.CheckParamEnd(4)\n\t\t)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Get params:\n\tcWorld * self = nullptr;\n\tint BlockX = 0;\n\tint BlockZ = 0;\n\tL.GetStackValues(1, self, BlockX, BlockZ);\n\n\t// Call the implementation:\n\tL.LogStackTrace();\n\tFLOGWARN(\"cWorld:GetHeight is DEPRECATED, use TryGetHeight instead\");\n\tauto Height = self->GetHeight(BlockX, BlockZ);\n\tL.Push(Height.value_or(0));\n\treturn 1;\n}\n\n\n\n\n\nvoid cManualBindings::BindWorld(lua_State * tolua_S)\n{\n\ttolua_beginmodule(tolua_S, nullptr);\n\t\ttolua_beginmodule(tolua_S, \"cWorld\");\n\t\t\ttolua_function(tolua_S, \"BroadcastBlockAction\",         tolua_cWorld_BroadcastBlockAction);\n\t\t\ttolua_function(tolua_S, \"BroadcastSoundEffect\",         tolua_cWorld_BroadcastSoundEffect);\n\t\t\ttolua_function(tolua_S, \"BroadcastSoundParticleEffect\", tolua_cWorld_BroadcastSoundParticleEffect);\n\t\t\ttolua_function(tolua_S, \"BroadcastParticleEffect\",      tolua_cWorld_BroadcastParticleEffect);\n\t\t\ttolua_function(tolua_S, \"ChunkStay\",                    tolua_cWorld_ChunkStay);\n\t\t\ttolua_function(tolua_S, \"DoExplosionAt\",                tolua_cWorld_DoExplosionAt);\n\t\t\ttolua_function(tolua_S, \"DoWithBeaconAt\",               DoWithBlockEntityAt<cBeaconEntity, E_BLOCK_BEACON>);\n\t\t\ttolua_function(tolua_S, \"DoWithBedAt\",                  DoWithBlockEntityAt<cBedEntity, E_BLOCK_BED>);\n\t\t\ttolua_function(tolua_S, \"DoWithBlockEntityAt\",          DoWithBlockEntityAt<cBlockEntity>);\n\t\t\ttolua_function(tolua_S, \"DoWithBrewingstandAt\",         DoWithBlockEntityAt<cBrewingstandEntity, E_BLOCK_BREWING_STAND>);\n\t\t\ttolua_function(tolua_S, \"DoWithChestAt\",                DoWithBlockEntityAt<cChestEntity, E_BLOCK_CHEST, E_BLOCK_TRAPPED_CHEST>);\n\t\t\ttolua_function(tolua_S, \"DoWithCommandBlockAt\",         DoWithBlockEntityAt<cCommandBlockEntity, E_BLOCK_COMMAND_BLOCK>);\n\t\t\ttolua_function(tolua_S, \"DoWithDispenserAt\",            DoWithBlockEntityAt<cDispenserEntity, E_BLOCK_DISPENSER>);\n\t\t\ttolua_function(tolua_S, \"DoWithDropSpenserAt\",          DoWithBlockEntityAt<cDropSpenserEntity, E_BLOCK_DISPENSER, E_BLOCK_DROPPER>);\n\t\t\ttolua_function(tolua_S, \"DoWithDropperAt\",              DoWithBlockEntityAt<cDropperEntity, E_BLOCK_DROPPER>);\n\t\t\ttolua_function(tolua_S, \"DoWithEntityByID\",             DoWithID<cWorld, cEntity, &cWorld::DoWithEntityByID>);\n\t\t\ttolua_function(tolua_S, \"DoWithFlowerPotAt\",            DoWithBlockEntityAt<cFlowerPotEntity, E_BLOCK_FLOWER_POT>);\n\t\t\ttolua_function(tolua_S, \"DoWithFurnaceAt\",              DoWithBlockEntityAt<cFurnaceEntity, E_BLOCK_FURNACE, E_BLOCK_LIT_FURNACE>);\n\t\t\ttolua_function(tolua_S, \"DoWithHopperAt\",               DoWithBlockEntityAt<cHopperEntity, E_BLOCK_HOPPER>);\n\t\t\ttolua_function(tolua_S, \"DoWithMobHeadAt\",              DoWithBlockEntityAt<cMobHeadEntity, E_BLOCK_HEAD>);\n\t\t\ttolua_function(tolua_S, \"DoWithNearestPlayer\",          tolua_cWorld_DoWithNearestPlayer);\n\t\t\ttolua_function(tolua_S, \"DoWithNoteBlockAt\",            DoWithBlockEntityAt<cNoteEntity, E_BLOCK_NOTE_BLOCK>);\n\t\t\ttolua_function(tolua_S, \"DoWithPlayer\",                 DoWith<cWorld, cPlayer, &cWorld::DoWithPlayer>);\n\t\t\ttolua_function(tolua_S, \"DoWithPlayerByUUID\",           tolua_cWorld_DoWithPlayerByUUID);\n\t\t\ttolua_function(tolua_S, \"FastSetBlock\",                 tolua_cWorld_FastSetBlock);\n\t\t\ttolua_function(tolua_S, \"FindAndDoWithPlayer\",          DoWith<cWorld, cPlayer, &cWorld::FindAndDoWithPlayer>);\n\t\t\ttolua_function(tolua_S, \"ForEachBlockEntityInChunk\",    ForEachBlockEntityInChunk<cBlockEntity>);\n\t\t\ttolua_function(tolua_S, \"ForEachBrewingstandInChunk\",   ForEachBlockEntityInChunk<cBrewingstandEntity, E_BLOCK_BREWING_STAND>);\n\t\t\ttolua_function(tolua_S, \"ForEachChestInChunk\",          ForEachBlockEntityInChunk<cChestEntity, E_BLOCK_CHEST, E_BLOCK_TRAPPED_CHEST>);\n\t\t\ttolua_function(tolua_S, \"ForEachEntity\",                ForEach<cWorld, cEntity, &cWorld::ForEachEntity>);\n\t\t\ttolua_function(tolua_S, \"ForEachEntityInBox\",           ForEachInBox<cWorld, cEntity, &cWorld::ForEachEntityInBox>);\n\t\t\ttolua_function(tolua_S, \"ForEachEntityInChunk\",         tolua_cWorld_ForEachEntityInChunk);\n\t\t\ttolua_function(tolua_S, \"ForEachFurnaceInChunk\",        ForEachBlockEntityInChunk<cFurnaceEntity, E_BLOCK_FURNACE, E_BLOCK_LIT_FURNACE>);\n\t\t\ttolua_function(tolua_S, \"ForEachLoadedChunk\",           tolua_cWorld_ForEachLoadedChunk);\n\t\t\ttolua_function(tolua_S, \"ForEachPlayer\",                ForEach<cWorld, cPlayer, &cWorld::ForEachPlayer>);\n\t\t\ttolua_function(tolua_S, \"GetBlock\",                     tolua_cWorld_GetBlock);\n\t\t\ttolua_function(tolua_S, \"GetBlockBlockLight\",           tolua_cWorld_GetBlockBlockLight);\n\t\t\ttolua_function(tolua_S, \"GetBlockInfo\",                 tolua_cWorld_GetBlockInfo);\n\t\t\ttolua_function(tolua_S, \"GetBlockMeta\",                 tolua_cWorld_GetBlockMeta);\n\t\t\ttolua_function(tolua_S, \"GetBlockSkyLight\",             tolua_cWorld_GetBlockSkyLight);\n\t\t\ttolua_function(tolua_S, \"GetBlockTypeMeta\",             tolua_cWorld_GetBlockTypeMeta);\n\t\t\ttolua_function(tolua_S, \"GetHeight\",                    tolua_cWorld_GetHeight);\n\t\t\ttolua_function(tolua_S, \"GetSignLines\",                 tolua_cWorld_GetSignLines);\n\t\t\ttolua_function(tolua_S, \"GetTimeOfDay\",                 tolua_cWorld_GetTimeOfDay);\n\t\t\ttolua_function(tolua_S, \"GetWorldAge\",                  tolua_cWorld_GetWorldAge);\n\t\t\ttolua_function(tolua_S, \"PrepareChunk\",                 tolua_cWorld_PrepareChunk);\n\t\t\ttolua_function(tolua_S, \"QueueTask\",                    tolua_cWorld_QueueTask);\n\t\t\ttolua_function(tolua_S, \"ScheduleTask\",                 tolua_cWorld_ScheduleTask);\n\t\t\ttolua_function(tolua_S, \"SetBlock\",                     tolua_cWorld_SetBlock);\n\t\t\ttolua_function(tolua_S, \"SetBlockMeta\",                 tolua_cWorld_SetBlockMeta);\n\t\t\ttolua_function(tolua_S, \"SetSignLines\",                 tolua_cWorld_SetSignLines);\n\t\t\ttolua_function(tolua_S, \"SetTimeOfDay\",                 tolua_cWorld_SetTimeOfDay);\n\t\t\ttolua_function(tolua_S, \"SpawnSplitExperienceOrbs\",     tolua_cWorld_SpawnSplitExperienceOrbs);\n\t\t\ttolua_function(tolua_S, \"TryGetHeight\",                 tolua_cWorld_TryGetHeight);\n\t\ttolua_endmodule(tolua_S);\n\ttolua_endmodule(tolua_S);\n}\n"
  },
  {
    "path": "src/Bindings/Plugin.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Plugin.h\"\n\n\n\n\n\ncPlugin::cPlugin(const AString & a_FolderName) :\n\tm_Status(cPluginManager::psDisabled),\n\tm_Name(a_FolderName),\n\tm_Version(0),\n\tm_FolderName(a_FolderName)\n{\n}\n\n\n\n\n\ncPlugin::~cPlugin()\n{\n\tLOGD(\"Destroying plugin \\\"%s\\\".\", m_Name.c_str());\n}\n\n\n\n\n\nvoid cPlugin::Unload(void)\n{\n\tauto pm = cPluginManager::Get();\n\tpm->RemovePluginCommands(this);\n\tpm->RemovePluginConsoleCommands(this);\n\tpm->RemoveHooks(this);\n\tOnDisable();\n\tm_Status = cPluginManager::psUnloaded;\n\tm_LoadError.clear();\n}\n\n\n\n\n\nAString cPlugin::GetLocalFolder(void) const\n{\n\treturn \"Plugins\" + cFile::GetPathSeparator() + m_FolderName;\n}\n\n\n\n\n\nvoid cPlugin::SetLoadError(const AString & a_LoadError)\n{\n\tm_Status = cPluginManager::psError;\n\tm_LoadError = a_LoadError;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/Plugin.h",
    "content": "\n// Plugin.h\n\n// Declares the cPlugin class representing an interface that a plugin implementation needs to expose, with some helping functions\n\n\n\n\n\n#pragma once\n\n#include \"../Defines.h\"\n#include \"PluginManager.h\"\n\n\n\n\n// tolua_begin\nclass cPlugin\n{\npublic:\n\t// tolua_end\n\n\t/** Creates a new instance.\n\ta_FolderName is the name of the folder (in the Plugins folder) from which the plugin is loaded.\n\tThe plugin's name defaults to the folder name. */\n\tcPlugin(const AString & a_FolderName);\n\n\tvirtual ~cPlugin();\n\n\t/** Called as the last call into the plugin before it is unloaded. */\n\tvirtual void OnDisable(void) {}\n\n\t/** Loads and initializes the plugin. Sets m_Status to psLoaded or psError accordingly.\n\tReturns true if the initialization succeeded, false otherwise. */\n\tvirtual bool Load(void) = 0;\n\n\t/** Unloads the plugin. Sets m_Status to psDisabled.\n\tThe default implementation removes the plugin's associations with cPluginManager, descendants should call it as well. */\n\tvirtual void Unload(void);\n\n\t// Called each tick\n\tvirtual void Tick(float a_Dt) = 0;\n\n\t/** Calls the specified hook with the params given. Returns the bool that the hook callback returns. */\n\tvirtual bool OnBlockSpread              (cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source) = 0;\n\tvirtual bool OnBlockToPickups           (cWorld & a_World, Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, const cBlockEntity * a_BlockEntity, const cEntity * a_Digger, const cItem * a_Tool, cItems & a_Pickups) = 0;\n\tvirtual bool OnBrewingCompleting        (cWorld & a_World, cBrewingstandEntity & a_BrewingstandEntity) = 0;\n\tvirtual bool OnBrewingCompleted         (cWorld & a_World, cBrewingstandEntity & a_BrewingstandEntity) = 0;\n\tvirtual bool OnChat                     (cPlayer & a_Player, AString & a_Message) = 0;\n\tvirtual bool OnChunkAvailable           (cWorld & a_World, int a_ChunkX, int a_ChunkZ) = 0;\n\tvirtual bool OnChunkGenerated           (cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc) = 0;\n\tvirtual bool OnChunkGenerating          (cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc) = 0;\n\tvirtual bool OnChunkUnloaded            (cWorld & a_World, int a_ChunkX, int a_ChunkZ) = 0;\n\tvirtual bool OnChunkUnloading           (cWorld & a_World, int a_ChunkX, int a_ChunkZ) = 0;\n\tvirtual bool OnCollectingPickup         (cPlayer & a_Player, cPickup & a_Pickup) = 0;\n\tvirtual bool OnCraftingNoRecipe         (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) = 0;\n\tvirtual bool OnDisconnect               (cClientHandle & a_Client, const AString & a_Reason) = 0;\n\tvirtual bool OnEntityAddEffect          (cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier) = 0;\n\tvirtual bool OnEntityTeleport           (cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition) = 0;\n\tvirtual bool OnEntityChangingWorld      (cEntity & a_Entity, cWorld & a_World) = 0;\n\tvirtual bool OnEntityChangedWorld       (cEntity & a_Entity, cWorld & a_World) = 0;\n\tvirtual bool OnExecuteCommand           (cPlayer * a_Player, const AStringVector & a_Split, const AString & a_EntireCommand, cPluginManager::CommandResult & a_Result) = 0;\n\tvirtual bool OnExploded                 (cWorld & a_World, double a_ExplosionSize,   bool a_CanCauseFire,   double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData) = 0;\n\tvirtual bool OnExploding                (cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData) = 0;\n\tvirtual bool OnHandshake                (cClientHandle & a_Client, const AString & a_Username) = 0;\n\tvirtual bool OnHopperPullingItem        (cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum) = 0;\n\tvirtual bool OnHopperPushingItem        (cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum) = 0;\n\tvirtual bool OnDropSpense               (cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum) = 0;\n\tvirtual bool OnKilled                   (cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage) = 0;\n\tvirtual bool OnKilling                  (cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI) = 0;\n\tvirtual bool OnLogin                    (cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username) = 0;\n\tvirtual bool OnLoginForge               (cClientHandle & a_Client, const AStringMap & a_Mods) = 0;\n\tvirtual bool OnPlayerAnimation          (cPlayer & a_Player, int a_Animation) = 0;\n\tvirtual bool OnPlayerBreakingBlock      (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;\n\tvirtual bool OnPlayerBrokenBlock        (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;\n\tvirtual bool OnPlayerDestroyed          (cPlayer & a_Player) = 0;\n\tvirtual bool OnPlayerEating             (cPlayer & a_Player) = 0;\n\tvirtual bool OnPlayerFished             (cPlayer & a_Player, const cItems & a_Reward, const int ExperienceAmount) = 0;\n\tvirtual bool OnPlayerFishing            (cPlayer & a_Player, cItems & a_Reward, int & ExperienceAmount) = 0;\n\tvirtual bool OnPlayerFoodLevelChange    (cPlayer & a_Player, int a_NewFoodLevel) = 0;\n\tvirtual bool OnPlayerJoined             (cPlayer & a_Player) = 0;\n\tvirtual bool OnPlayerLeftClick          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, char a_Status) = 0;\n\tvirtual bool OnPlayerMoving             (cPlayer & a_Player, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition, bool a_PreviousIsOnGround) = 0;\n\tvirtual bool OnPlayerOpeningWindow      (cPlayer & a_Player, cWindow & a_Window) = 0;\n\tvirtual bool OnPlayerPlacedBlock        (cPlayer & a_Player, const sSetBlock & a_BlockChange) = 0;\n\tvirtual bool OnPlayerPlacingBlock       (cPlayer & a_Player, const sSetBlock & a_BlockChange) = 0;\n\tvirtual bool OnPlayerCrouched           (cPlayer & a_Player) = 0;\n\tvirtual bool OnPlayerRightClick         (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) = 0;\n\tvirtual bool OnPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity) = 0;\n\tvirtual bool OnPlayerShooting           (cPlayer & a_Player) = 0;\n\tvirtual bool OnPlayerSpawned            (cPlayer & a_Player) = 0;\n\tvirtual bool OnPlayerTossingItem        (cPlayer & a_Player) = 0;\n\tvirtual bool OnPlayerUsedBlock          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;\n\tvirtual bool OnPlayerUsedItem           (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) = 0;\n\tvirtual bool OnPlayerUsingBlock         (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;\n\tvirtual bool OnPlayerUsingItem          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) = 0;\n\tvirtual bool OnPluginMessage            (cClientHandle & a_Client, const AString & a_Channel, ContiguousByteBufferView a_Message) = 0;\n\tvirtual bool OnPluginsLoaded            (void) = 0;\n\tvirtual bool OnPostCrafting             (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) = 0;\n\tvirtual bool OnPreCrafting              (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) = 0;\n\tvirtual bool OnProjectileHitBlock       (cProjectileEntity & a_Projectile, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Face, const Vector3d & a_BlockHitPos) = 0;\n\tvirtual bool OnProjectileHitEntity      (cProjectileEntity & a_Projectile, cEntity & a_HitEntity) = 0;\n\tvirtual bool OnServerPing               (cClientHandle & a_ClientHandle, AString & a_ServerDescription, int & a_OnlinePlayersCount, int & a_MaxPlayersCount, AString & a_Favicon) = 0;\n\tvirtual bool OnSpawnedEntity            (cWorld & a_World, cEntity & a_Entity) = 0;\n\tvirtual bool OnSpawnedMonster           (cWorld & a_World, cMonster & a_Monster) = 0;\n\tvirtual bool OnSpawningEntity           (cWorld & a_World, cEntity & a_Entity) = 0;\n\tvirtual bool OnSpawningMonster          (cWorld & a_World, cMonster & a_Monster) = 0;\n\tvirtual bool OnTakeDamage               (cEntity & a_Receiver, TakeDamageInfo & a_TakeDamageInfo) = 0;\n\tvirtual bool OnUpdatedSign              (cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player) = 0;\n\tvirtual bool OnUpdatingSign             (cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ,       AString & a_Line1,       AString & a_Line2,       AString & a_Line3,       AString & a_Line4, cPlayer * a_Player) = 0;\n\tvirtual bool OnWeatherChanged           (cWorld & a_World) = 0;\n\tvirtual bool OnWeatherChanging          (cWorld & a_World, eWeather & a_NewWeather) = 0;\n\tvirtual bool OnWorldStarted             (cWorld & a_World) = 0;\n\tvirtual bool OnWorldTick                (cWorld & a_World, std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_LastTickDurationMSec) = 0;\n\n\t// tolua_begin\n\tconst AString & GetName(void) const  { return m_Name; }\n\tvoid SetName(const AString & a_Name) { m_Name = a_Name; }\n\n\tint GetVersion(void) const     { return m_Version; }\n\tvoid SetVersion(int a_Version) { m_Version = a_Version; }\n\n\t/** Returns the name of the folder (in the Plugins folder) from which the plugin is loaded. */\n\tconst AString & GetFolderName(void) const {return m_FolderName; }\n\n\t/** Returns the folder relative to the MCS Executable, from which the plugin is loaded. */\n\tAString GetLocalFolder(void) const;\n\n\t/** Returns the error encountered while loading the plugin. Only valid if m_Status == psError. */\n\tconst AString & GetLoadError(void) const { return m_LoadError; }\n\n\tcPluginManager::ePluginStatus GetStatus(void) const { return m_Status; }\n\n\tbool IsLoaded(void) const { return (m_Status == cPluginManager::psLoaded); }\n\t// tolua_end\n\n\t// Needed for ManualBindings' tolua_ForEach<>\n\tstatic const char * GetClassStatic(void) { return \"cPlugin\"; }\n\nprotected:\n\tfriend class cPluginManager;\n\n\tcPluginManager::ePluginStatus m_Status;\n\n\t/** The name of the plugin, used to identify the plugin in the system and for inter-plugin calls. */\n\tAString m_Name;\n\n\tint m_Version;\n\n\t/** Name of the folder (in the Plugins folder) from which the plugin is loaded. */\n\tAString m_FolderName;\n\n\t/** The error encountered while loading the plugin.\n\tOnly valid if m_Status == psError. */\n\tAString m_LoadError;\n\n\n\t/** Sets m_LoadError to the specified string and m_Status to psError. */\n\tvoid SetLoadError(const AString & a_LoadError);\n};  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/PluginLua.cpp",
    "content": "\n// PluginLua.cpp\n\n// Implements the cPluginLua class representing a plugin written in Lua\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n#include \"Defines.h\"\n#include \"Entities/Minecart.h\"\n\n#ifdef __APPLE__\n\t#define LUA_USE_MACOSX\n#else\n\t#define LUA_USE_POSIX\n#endif\n\n#include \"PluginLua.h\"\n#include \"../CommandOutput.h\"\n#include \"PluginManager.h\"\n#include \"../Item.h\"\n#include \"../Root.h\"\n#include \"../WebAdmin.h\"\n\nextern \"C\"\n{\n\t#include \"lua/src/lauxlib.h\"\n}\n\n#undef TOLUA_TEMPLATE_BIND\n#include \"tolua++/include/tolua++.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPluginLua:\n\ncPluginLua::cPluginLua(const AString & a_PluginDirectory, cDeadlockDetect & a_DeadlockDetect) :\n\tcPlugin(a_PluginDirectory),\n\tm_LuaState(fmt::format(FMT_STRING(\"plugin {}\"), a_PluginDirectory)),\n\tm_DeadlockDetect(a_DeadlockDetect)\n{\n\tm_LuaState.TrackInDeadlockDetect(a_DeadlockDetect);\n}\n\n\n\n\n\ncPluginLua::~cPluginLua()\n{\n\tClose();\n\tm_LuaState.UntrackInDeadlockDetect(m_DeadlockDetect);\n}\n\n\n\n\n\nvoid cPluginLua::Close(void)\n{\n\tcOperation op(*this);\n\t// If already closed, bail out:\n\tif (!op().IsValid())\n\t{\n\t\tASSERT(m_HookMap.empty());\n\t\treturn;\n\t}\n\n\t// Remove the web tabs:\n\tClearWebTabs();\n\n\t// Release all the references in the hook map:\n\tm_HookMap.clear();\n\n\t// Close the Lua engine:\n\top().Close();\n}\n\n\n\n\n\nbool cPluginLua::Load(void)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\tm_LuaState.Create();\n\t\tm_LuaState.RegisterAPILibs();\n\n\t\t// Inject the identification global variables into the state:\n\t\tlua_pushlightuserdata(m_LuaState, this);\n\t\tlua_setglobal(m_LuaState, LUA_PLUGIN_INSTANCE_VAR_NAME);\n\n\t\t// Add the plugin's folder to the package.path and package.cpath variables (#693):\n\t\tm_LuaState.AddPackagePath(\"path\", GetLocalFolder() + \"/?.lua\");\n\t\t#ifdef _WIN32\n\t\t\tm_LuaState.AddPackagePath(\"cpath\", GetLocalFolder() + \"\\\\?.dll\");\n\t\t#else\n\t\t\tm_LuaState.AddPackagePath(\"cpath\", GetLocalFolder() + \"/?.so\");\n\t\t#endif\n\n\t\ttolua_pushusertype(m_LuaState, this, \"cPluginLua\");\n\t\tlua_setglobal(m_LuaState, \"g_Plugin\");\n\t}\n\n\tstd::string PluginPath = GetLocalFolder() + \"/\";\n\n\t// List all Lua files for this plugin. Info.lua has a special handling - make it the last to load:\n\tAStringVector Files = cFile::GetFolderContents(PluginPath);\n\tAStringVector LuaFiles;\n\tbool HasInfoLua = false;\n\tfor (AStringVector::const_iterator itr = Files.begin(), end = Files.end(); itr != end; ++itr)\n\t{\n\t\tsize_t ExtensionStart = itr->find_last_of('.');\n\t\tif ((ExtensionStart != std::string::npos) && (itr->substr(ExtensionStart) == \".lua\"))\n\t\t{\n\t\t\tif (*itr == \"Info.lua\")\n\t\t\t{\n\t\t\t\tHasInfoLua = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLuaFiles.push_back(*itr);\n\t\t\t}\n\t\t}\n\t}\n\tstd::sort(LuaFiles.begin(), LuaFiles.end());\n\n\t// Warn if there are no Lua files in the plugin folder:\n\tif (LuaFiles.empty())\n\t{\n\t\tSetLoadError(\"No lua files found, plugin is probably missing.\");\n\t\tLOGWARNING(\"No lua files found: plugin %s is missing.\", GetName().c_str());\n\t\tClose();\n\t\treturn false;\n\t}\n\n\t// Load all files in the list, including the Info.lua as last, if it exists:\n\tfor (AStringVector::const_iterator itr = LuaFiles.begin(), end = LuaFiles.end(); itr != end; ++itr)\n\t{\n\t\tAString Path = PluginPath + *itr;\n\t\tif (!m_LuaState.LoadFile(Path))\n\t\t{\n\t\t\tSetLoadError(fmt::format(FMT_STRING(\"Failed to load file {}.\"), *itr));\n\t\t\tClose();\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - Files[]\n\tif (HasInfoLua)\n\t{\n\t\tAString Path = PluginPath + \"Info.lua\";\n\t\tif (!m_LuaState.LoadFile(Path))\n\t\t{\n\t\t\tSetLoadError(\"Failed to load file Info.lua.\");\n\t\t\tClose();\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Call the Initialize function:\n\tbool res = false;\n\tif (!m_LuaState.Call(\"Initialize\", this, cLuaState::Return, res))\n\t{\n\t\tSetLoadError(\"Cannot call the Initialize() function.\");\n\t\tLOGWARNING(\"Error in plugin %s: Cannot call the Initialize() function. Plugin is temporarily disabled.\", GetName().c_str());\n\t\tClose();\n\t\treturn false;\n\t}\n\tif (!res)\n\t{\n\t\tSetLoadError(\"The Initialize() function failed.\");\n\t\tLOGINFO(\"Plugin %s: Initialize() call failed, plugin is temporarily disabled.\", GetName().c_str());\n\t\tClose();\n\t\treturn false;\n\t}\n\n\tm_Status = cPluginManager::psLoaded;\n\treturn true;\n}\n\n\n\n\n\nvoid cPluginLua::Unload(void)\n{\n\tClearWebTabs();\n\tSuper::Unload();\n\tClose();\n}\n\n\n\n\n\nvoid cPluginLua::OnDisable(void)\n{\n\tcOperation op(*this);\n\tif (!op().HasFunction(\"OnDisable\"))\n\t{\n\t\treturn;\n\t}\n\top().Call(\"OnDisable\");\n}\n\n\n\n\n\nvoid cPluginLua::Tick(float a_Dt)\n{\n\tCallSimpleHooks(cPluginManager::HOOK_TICK, a_Dt);\n}\n\n\n\n\n\nbool cPluginLua::OnBlockSpread(cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_BLOCK_SPREAD, &a_World, a_BlockX, a_BlockY, a_BlockZ, a_Source);\n}\n\n\n\n\n\nbool cPluginLua::OnBlockToPickups(\n\tcWorld & a_World,\n\tVector3i a_BlockPos,\n\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\tconst cBlockEntity * a_BlockEntity,\n\tconst cEntity * a_Digger,\n\tconst cItem * a_Tool,\n\tcItems & a_Pickups\n)\n{\n\t// TODO: Change the hook signature to reflect the real parameters to this function, once we are allowed to make breaking API changes\n\treturn CallSimpleHooks(\n\t\tcPluginManager::HOOK_BLOCK_TO_PICKUPS,\n\t\t&a_World,\n\t\ta_Digger,\n\t\ta_BlockPos.x, a_BlockPos.y, a_BlockPos.z,\n\t\ta_BlockType, a_BlockMeta, &a_Pickups\n\t);\n}\n\n\n\n\n\nbool cPluginLua::OnBrewingCompleted(cWorld & a_World, cBrewingstandEntity & a_Brewingstand)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_BREWING_COMPLETED, &a_World, &a_Brewingstand);\n}\n\n\n\n\n\nbool cPluginLua::OnBrewingCompleting(cWorld & a_World, cBrewingstandEntity & a_Brewingstand)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_BREWING_COMPLETING, &a_World, &a_Brewingstand);\n}\n\n\n\n\n\nbool cPluginLua::OnChat(cPlayer & a_Player, AString & a_Message)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_CHAT];\n\tfor (auto & hook: hooks)\n\t{\n\t\thook->Call(&a_Player, a_Message, cLuaState::Return, res, a_Message);\n\t\tif (res)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginLua::OnChunkAvailable(cWorld & a_World, int a_ChunkX, int a_ChunkZ)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_CHUNK_AVAILABLE, &a_World, a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nbool cPluginLua::OnChunkGenerated(cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_CHUNK_GENERATED, &a_World, a_ChunkX, a_ChunkZ, a_ChunkDesc);\n}\n\n\n\n\n\nbool cPluginLua::OnChunkGenerating(cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_CHUNK_GENERATING, &a_World, a_ChunkX, a_ChunkZ, a_ChunkDesc);\n}\n\n\n\n\n\nbool cPluginLua::OnChunkUnloaded(cWorld & a_World, int a_ChunkX, int a_ChunkZ)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_CHUNK_UNLOADED, &a_World, a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nbool cPluginLua::OnChunkUnloading(cWorld & a_World, int a_ChunkX, int a_ChunkZ)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_CHUNK_UNLOADING, &a_World, a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nbool cPluginLua::OnCollectingPickup(cPlayer & a_Player, cPickup & a_Pickup)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_COLLECTING_PICKUP, &a_Player, &a_Pickup);\n}\n\n\n\n\n\nbool cPluginLua::OnCraftingNoRecipe(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_CRAFTING_NO_RECIPE, &a_Player, &a_Grid, &a_Recipe);\n}\n\n\n\n\n\nbool cPluginLua::OnDisconnect(cClientHandle & a_Client, const AString & a_Reason)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_DISCONNECT, &a_Client, a_Reason);\n}\n\n\n\n\n\nbool cPluginLua::OnEntityAddEffect(cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_ENTITY_ADD_EFFECT, &a_Entity, a_EffectType, a_EffectDurationTicks, a_EffectIntensity, a_DistanceModifier);\n}\n\n\n\n\n\nbool cPluginLua::OnEntityChangingWorld(cEntity & a_Entity, cWorld & a_World)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_ENTITY_CHANGING_WORLD, &a_Entity, &a_World);\n}\n\n\n\n\n\nbool cPluginLua::OnEntityChangedWorld(cEntity & a_Entity, cWorld & a_World)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_ENTITY_CHANGED_WORLD, &a_Entity, &a_World);\n}\n\n\n\n\n\nbool cPluginLua::OnExecuteCommand(cPlayer * a_Player, const AStringVector & a_Split, const AString & a_EntireCommand, cPluginManager::CommandResult & a_Result)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_EXECUTE_COMMAND];\n\tfor (auto & hook: hooks)\n\t{\n\t\thook->Call(a_Player, a_Split, a_EntireCommand, cLuaState::Return, res, a_Result);\n\t\tif (res)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginLua::OnExploded(cWorld & a_World, double a_ExplosionSize, bool a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_EXPLODED];\n\tfor (auto & hook: hooks)\n\t{\n\t\tswitch (a_Source)\n\t\t{\n\t\t\tcase esBed:           hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<Vector3i *>            (a_SourceData), cLuaState::Return, res); break;\n\t\t\tcase esEnderCrystal:  hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cEntity *>             (a_SourceData), cLuaState::Return, res); break;\n\t\t\tcase esGhastFireball: hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cGhastFireballEntity *>(a_SourceData), cLuaState::Return, res); break;\n\t\t\tcase esMonster:       hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cMonster *>            (a_SourceData), cLuaState::Return, res); break;\n\t\t\tcase esOther:         hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, cLuaState::Return, res); break;\n\t\t\tcase esPlugin:        hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, cLuaState::Return, res); break;\n\t\t\tcase esPrimedTNT:     hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cTNTEntity *>          (a_SourceData), cLuaState::Return, res); break;\n\t\t\tcase esTNTMinecart:   hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cMinecartWithTNT *>    (a_SourceData), cLuaState::Return, res); break;\n\t\t\tcase esWitherBirth:   hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cMonster *>            (a_SourceData), cLuaState::Return, res); break;\n\t\t\tcase esWitherSkull:   hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cWitherSkullEntity *>  (a_SourceData), cLuaState::Return, res); break;\n\t\t\tcase esMax:\n\t\t\t{\n\t\t\t\tASSERT(!\"Invalid explosion source\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (res)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginLua::OnExploding(cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_EXPLODING];\n\tfor (auto & hook: hooks)\n\t{\n\t\tswitch (a_Source)\n\t\t{\n\t\t\tcase esBed:           hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<Vector3i *>            (a_SourceData), cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esEnderCrystal:  hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cEntity *>             (a_SourceData), cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esGhastFireball: hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cGhastFireballEntity *>(a_SourceData), cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esMonster:       hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cMonster *>            (a_SourceData), cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esOther:         hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source,                                                         cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esPlugin:        hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source,                                                         cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esPrimedTNT:     hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cTNTEntity *>          (a_SourceData), cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esTNTMinecart:   hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cMinecartWithTNT *>    (a_SourceData), cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esWitherBirth:   hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cMonster *>            (a_SourceData), cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esWitherSkull:   hook->Call(&a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, static_cast<cWitherSkullEntity *>  (a_SourceData), cLuaState::Return, res, a_CanCauseFire, a_ExplosionSize); break;\n\t\t\tcase esMax:\n\t\t\t{\n\t\t\t\tASSERT(!\"Invalid explosion source\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (res)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginLua::OnHandshake(cClientHandle & a_Client, const AString & a_Username)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_HANDSHAKE, &a_Client, a_Username);\n}\n\n\n\n\n\nbool cPluginLua::OnHopperPullingItem(cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_HOPPER_PULLING_ITEM, &a_World, &a_Hopper, a_DstSlotNum, &a_SrcEntity, a_SrcSlotNum);\n}\n\n\n\n\n\nbool cPluginLua::OnHopperPushingItem(cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_HOPPER_PUSHING_ITEM, &a_World, &a_Hopper, a_SrcSlotNum, &a_DstEntity, a_DstSlotNum);\n}\n\n\n\n\n\nbool cPluginLua::OnDropSpense(cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_DROPSPENSE, &a_World, &a_DropSpenser, a_SlotNum);\n}\n\n\n\n\n\nbool cPluginLua::OnKilled(cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_KILLED];\n\tfor (auto & hook: hooks)\n\t{\n\t\thook->Call(&a_Victim, &a_TDI, a_DeathMessage, cLuaState::Return, res, a_DeathMessage);\n\t\tif (res)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginLua::OnKilling(cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_KILLING, &a_Victim, a_Killer, &a_TDI);\n}\n\n\n\n\n\nbool cPluginLua::OnLogin(cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_LOGIN, &a_Client, a_ProtocolVersion, a_Username);\n}\n\n\n\n\n\nbool cPluginLua::OnLoginForge(cClientHandle & a_Client, const AStringMap & a_Mods)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_LOGIN_FORGE, &a_Client, a_Mods);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerAnimation(cPlayer & a_Player, int a_Animation)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_ANIMATION, &a_Player, a_Animation);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerBreakingBlock(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_BREAKING_BLOCK, &a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerBrokenBlock(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_BROKEN_BLOCK, &a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerDestroyed(cPlayer & a_Player)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_DESTROYED, &a_Player);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerEating(cPlayer & a_Player)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_EATING, &a_Player);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerFoodLevelChange(cPlayer & a_Player, int a_NewFoodLevel)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_FOOD_LEVEL_CHANGE, &a_Player, a_NewFoodLevel);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerFished(cPlayer & a_Player, const cItems & a_Reward, const int ExperienceAmount)\n{\n\tcItems reward(a_Reward);\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_FISHED, &a_Player, &reward, ExperienceAmount);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerFishing(cPlayer & a_Player, cItems & a_Reward, int & ExperienceAmount)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_FISHING, &a_Player, &a_Reward, &ExperienceAmount);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerJoined(cPlayer & a_Player)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_JOINED, &a_Player);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerLeftClick(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, char a_Status)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_LEFT_CLICK, &a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_Status);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerMoving(cPlayer & a_Player, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition, bool a_PreviousIsOnGround)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_MOVING, &a_Player, a_OldPosition, a_NewPosition, a_PreviousIsOnGround);\n}\n\n\n\n\n\nbool cPluginLua::OnEntityTeleport(cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_ENTITY_TELEPORT, &a_Entity, a_OldPosition, a_NewPosition);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerOpeningWindow(cPlayer & a_Player, cWindow & a_Window)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_OPENING_WINDOW, &a_Player, &a_Window);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerPlacedBlock(cPlayer & a_Player, const sSetBlock & a_BlockChange)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_PLACED_BLOCK,\n\t\t&a_Player,\n\t\ta_BlockChange.GetX(), a_BlockChange.GetY(), a_BlockChange.GetZ(),\n\t\ta_BlockChange.m_BlockType, a_BlockChange.m_BlockMeta\n\t);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerPlacingBlock(cPlayer & a_Player, const sSetBlock & a_BlockChange)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_PLACING_BLOCK,\n\t\t&a_Player,\n\t\ta_BlockChange.GetX(), a_BlockChange.GetY(), a_BlockChange.GetZ(),\n\t\ta_BlockChange.m_BlockType, a_BlockChange.m_BlockMeta\n\t);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerCrouched(cPlayer & a_Player)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_CROUCHED,\n\t\t&a_Player);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerRightClick(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_RIGHT_CLICK, &a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_RIGHT_CLICKING_ENTITY, &a_Player, &a_Entity);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerShooting(cPlayer & a_Player)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_SHOOTING, &a_Player);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerSpawned(cPlayer & a_Player)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_SPAWNED, &a_Player);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerTossingItem(cPlayer & a_Player)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_TOSSING_ITEM, &a_Player);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerUsedBlock(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_USED_BLOCK, &a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerUsedItem(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_USED_ITEM, &a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerUsingBlock(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_USING_BLOCK, &a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nbool cPluginLua::OnPlayerUsingItem(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLAYER_USING_ITEM, &a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ);\n}\n\n\n\n\n\nbool cPluginLua::OnPluginMessage(cClientHandle & a_Client, const AString & a_Channel, const ContiguousByteBufferView a_Message)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PLUGIN_MESSAGE, &a_Client, a_Channel, a_Message);\n}\n\n\n\n\n\nbool cPluginLua::OnPluginsLoaded(void)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_PLUGINS_LOADED];\n\tfor (auto & hook: hooks)\n\t{\n\t\tbool ret = false;\n\t\thook->Call(cLuaState::Return, ret);\n\t\tres = res || ret;\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool cPluginLua::OnPostCrafting(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_POST_CRAFTING, &a_Player, &a_Grid, &a_Recipe);\n}\n\n\n\n\n\nbool cPluginLua::OnPreCrafting(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PRE_CRAFTING, &a_Player, &a_Grid, &a_Recipe);\n}\n\n\n\n\n\nbool cPluginLua::OnProjectileHitBlock(cProjectileEntity & a_Projectile, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Face, const Vector3d & a_BlockHitPos)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PROJECTILE_HIT_BLOCK, &a_Projectile, a_BlockX, a_BlockY, a_BlockZ, a_Face, a_BlockHitPos);\n}\n\n\n\n\n\nbool cPluginLua::OnProjectileHitEntity(cProjectileEntity & a_Projectile, cEntity & a_HitEntity)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_PROJECTILE_HIT_ENTITY, &a_Projectile, &a_HitEntity);\n}\n\n\n\n\n\nbool cPluginLua::OnServerPing(cClientHandle & a_ClientHandle, AString & a_ServerDescription, int & a_OnlinePlayersCount, int & a_MaxPlayersCount, AString & a_Favicon)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_SERVER_PING];\n\tfor (auto & hook: hooks)\n\t{\n\t\thook->Call(&a_ClientHandle, a_ServerDescription, a_OnlinePlayersCount, a_MaxPlayersCount, a_Favicon, cLuaState::Return, res, a_ServerDescription, a_OnlinePlayersCount, a_MaxPlayersCount, a_Favicon);\n\t\tif (res)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginLua::OnSpawnedEntity(cWorld & a_World, cEntity & a_Entity)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_SPAWNED_ENTITY, &a_World, &a_Entity);\n}\n\n\n\n\n\nbool cPluginLua::OnSpawnedMonster(cWorld & a_World, cMonster & a_Monster)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_SPAWNED_MONSTER, &a_World, &a_Monster);\n}\n\n\n\n\n\nbool cPluginLua::OnSpawningEntity(cWorld & a_World, cEntity & a_Entity)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_SPAWNING_ENTITY, &a_World, &a_Entity);\n}\n\n\n\n\n\nbool cPluginLua::OnSpawningMonster(cWorld & a_World, cMonster & a_Monster)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_SPAWNING_MONSTER, &a_World, &a_Monster);\n}\n\n\n\n\n\nbool cPluginLua::OnTakeDamage(cEntity & a_Receiver, TakeDamageInfo & a_TDI)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_TAKE_DAMAGE, &a_Receiver, &a_TDI);\n}\n\n\n\n\n\nbool cPluginLua::OnUpdatedSign(\n\tcWorld & a_World,\n\tint a_BlockX, int a_BlockY, int a_BlockZ,\n\tconst AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4,\n\tcPlayer * a_Player\n)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_UPDATED_SIGN, &a_World, a_BlockX, a_BlockY, a_BlockZ, a_Line1, a_Line2, a_Line3, a_Line4, a_Player);\n}\n\n\n\n\n\nbool cPluginLua::OnUpdatingSign(\n\tcWorld & a_World,\n\tint a_BlockX, int a_BlockY, int a_BlockZ,\n\tAString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4,\n\tcPlayer * a_Player\n)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_UPDATING_SIGN];\n\tfor (auto & hook: hooks)\n\t{\n\t\thook->Call(&a_World, a_BlockX, a_BlockY, a_BlockZ, a_Line1, a_Line2, a_Line3, a_Line4, a_Player, cLuaState::Return, res, a_Line1, a_Line2, a_Line3, a_Line4);\n\t\tif (res)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginLua::OnWeatherChanged(cWorld & a_World)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_WEATHER_CHANGED, &a_World);\n}\n\n\n\n\n\nbool cPluginLua::OnWeatherChanging(cWorld & a_World, eWeather & a_NewWeather)\n{\n\tcOperation op(*this);\n\tif (!op().IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool res = false;\n\tauto & hooks = m_HookMap[cPluginManager::HOOK_WEATHER_CHANGING];\n\tfor (auto & hook: hooks)\n\t{\n\t\thook->Call(&a_World, a_NewWeather, cLuaState::Return, res, a_NewWeather);\n\t\tif (res)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginLua::OnWorldStarted(cWorld & a_World)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_WORLD_STARTED, &a_World);\n}\n\n\n\n\n\nbool cPluginLua::OnWorldTick(cWorld & a_World, std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_LastTickDurationMSec)\n{\n\treturn CallSimpleHooks(cPluginManager::HOOK_WORLD_TICK, &a_World, a_Dt, a_LastTickDurationMSec);\n}\n\n\n\n\n\nbool cPluginLua::CanAddOldStyleHook(int a_HookType)\n{\n\tconst char * FnName = GetHookFnName(a_HookType);\n\tif (FnName == nullptr)\n\t{\n\t\t// Unknown hook ID\n\t\tLOGWARNING(\"Plugin %s wants to add an unknown hook ID (%d). The plugin need not work properly.\",\n\t\t\tGetName().c_str(), a_HookType\n\t\t);\n\t\tm_LuaState.LogStackTrace();\n\t\treturn false;\n\t}\n\n\t// Check if the function is available\n\tif (m_LuaState.HasFunction(FnName))\n\t{\n\t\treturn true;\n\t}\n\n\tLOGWARNING(\"Plugin %s wants to add a hook (%d), but it doesn't provide the callback function \\\"%s\\\" for it. The plugin need not work properly.\",\n\t\tGetName().c_str(), a_HookType, FnName\n\t);\n\tm_LuaState.LogStackTrace();\n\treturn false;\n}\n\n\n\n\n\nconst char * cPluginLua::GetHookFnName(int a_HookType)\n{\n\tswitch (a_HookType)\n\t{\n\t\tcase cPluginManager::HOOK_BLOCK_SPREAD:                 return \"OnBlockSpread\";\n\t\tcase cPluginManager::HOOK_BLOCK_TO_PICKUPS:             return \"OnBlockToPickups\";\n\t\tcase cPluginManager::HOOK_CHAT:                         return \"OnChat\";\n\t\tcase cPluginManager::HOOK_CHUNK_AVAILABLE:              return \"OnChunkAvailable\";\n\t\tcase cPluginManager::HOOK_CHUNK_GENERATED:              return \"OnChunkGenerated\";\n\t\tcase cPluginManager::HOOK_CHUNK_GENERATING:             return \"OnChunkGenerating\";\n\t\tcase cPluginManager::HOOK_CHUNK_UNLOADED:               return \"OnChunkUnloaded\";\n\t\tcase cPluginManager::HOOK_CHUNK_UNLOADING:              return \"OnChunkUnloading\";\n\t\tcase cPluginManager::HOOK_COLLECTING_PICKUP:            return \"OnCollectingPickup\";\n\t\tcase cPluginManager::HOOK_CRAFTING_NO_RECIPE:           return \"OnCraftingNoRecipe\";\n\t\tcase cPluginManager::HOOK_DISCONNECT:                   return \"OnDisconnect\";\n\t\tcase cPluginManager::HOOK_PLAYER_ANIMATION:             return \"OnPlayerAnimation\";\n\t\tcase cPluginManager::HOOK_ENTITY_ADD_EFFECT:            return \"OnEntityAddEffect\";\n\t\tcase cPluginManager::HOOK_ENTITY_CHANGING_WORLD:        return \"OnEntityChangingWorld\";\n\t\tcase cPluginManager::HOOK_ENTITY_CHANGED_WORLD:         return \"OnEntityChangedWorld\";\n\t\tcase cPluginManager::HOOK_ENTITY_TELEPORT:              return \"OnEntityTeleport\";\n\t\tcase cPluginManager::HOOK_EXECUTE_COMMAND:              return \"OnExecuteCommand\";\n\t\tcase cPluginManager::HOOK_HANDSHAKE:                    return \"OnHandshake\";\n\t\tcase cPluginManager::HOOK_KILLING:                      return \"OnKilling\";\n\t\tcase cPluginManager::HOOK_LOGIN:                        return \"OnLogin\";\n\t\tcase cPluginManager::HOOK_LOGIN_FORGE:                  return \"OnLoginForge\";\n\t\tcase cPluginManager::HOOK_PLAYER_BREAKING_BLOCK:        return \"OnPlayerBreakingBlock\";\n\t\tcase cPluginManager::HOOK_PLAYER_BROKEN_BLOCK:          return \"OnPlayerBrokenBlock\";\n\t\tcase cPluginManager::HOOK_PLAYER_EATING:                return \"OnPlayerEating\";\n\t\tcase cPluginManager::HOOK_PLAYER_JOINED:                return \"OnPlayerJoined\";\n\t\tcase cPluginManager::HOOK_PLAYER_LEFT_CLICK:            return \"OnPlayerLeftClick\";\n\t\tcase cPluginManager::HOOK_PLAYER_MOVING:                return \"OnPlayerMoving\";\n\t\tcase cPluginManager::HOOK_PLAYER_OPENING_WINDOW:        return \"OnPlayerOpeningWindow\";\n\t\tcase cPluginManager::HOOK_PLAYER_PLACED_BLOCK:          return \"OnPlayerPlacedBlock\";\n\t\tcase cPluginManager::HOOK_PLAYER_PLACING_BLOCK:         return \"OnPlayerPlacingBlock\";\n\t\tcase cPluginManager::HOOK_PLAYER_CROUCHED:        \t\treturn \"OnPlayerCrouched\";\n\t\tcase cPluginManager::HOOK_PLAYER_RIGHT_CLICK:           return \"OnPlayerRightClick\";\n\t\tcase cPluginManager::HOOK_PLAYER_RIGHT_CLICKING_ENTITY: return \"OnPlayerRightClickingEntity\";\n\t\tcase cPluginManager::HOOK_PLAYER_SHOOTING:              return \"OnPlayerShooting\";\n\t\tcase cPluginManager::HOOK_PLAYER_SPAWNED:               return \"OnPlayerSpawned\";\n\t\tcase cPluginManager::HOOK_PLAYER_TOSSING_ITEM:          return \"OnPlayerTossingItem\";\n\t\tcase cPluginManager::HOOK_PLAYER_USED_BLOCK:            return \"OnPlayerUsedBlock\";\n\t\tcase cPluginManager::HOOK_PLAYER_USED_ITEM:             return \"OnPlayerUsedItem\";\n\t\tcase cPluginManager::HOOK_PLAYER_USING_BLOCK:           return \"OnPlayerUsingBlock\";\n\t\tcase cPluginManager::HOOK_PLAYER_USING_ITEM:            return \"OnPlayerUsingItem\";\n\t\tcase cPluginManager::HOOK_PLUGIN_MESSAGE:               return \"OnPluginMessage\";\n\t\tcase cPluginManager::HOOK_PLUGINS_LOADED:               return \"OnPluginsLoaded\";\n\t\tcase cPluginManager::HOOK_POST_CRAFTING:                return \"OnPostCrafting\";\n\t\tcase cPluginManager::HOOK_PRE_CRAFTING:                 return \"OnPreCrafting\";\n\t\tcase cPluginManager::HOOK_SERVER_PING:                  return \"OnServerPing\";\n\t\tcase cPluginManager::HOOK_SPAWNED_ENTITY:               return \"OnSpawnedEntity\";\n\t\tcase cPluginManager::HOOK_SPAWNED_MONSTER:              return \"OnSpawnedMonster\";\n\t\tcase cPluginManager::HOOK_SPAWNING_ENTITY:              return \"OnSpawningEntity\";\n\t\tcase cPluginManager::HOOK_SPAWNING_MONSTER:             return \"OnSpawningMonster\";\n\t\tcase cPluginManager::HOOK_TAKE_DAMAGE:                  return \"OnTakeDamage\";\n\t\tcase cPluginManager::HOOK_TICK:                         return \"OnTick\";\n\t\tcase cPluginManager::HOOK_UPDATED_SIGN:                 return \"OnUpdatedSign\";\n\t\tcase cPluginManager::HOOK_UPDATING_SIGN:                return \"OnUpdatingSign\";\n\t\tcase cPluginManager::HOOK_WEATHER_CHANGED:              return \"OnWeatherChanged\";\n\t\tcase cPluginManager::HOOK_WEATHER_CHANGING:             return \"OnWeatherChanging\";\n\t\tcase cPluginManager::HOOK_WORLD_TICK:                   return \"OnWorldTick\";\n\n\t\tcase cPluginManager::HOOK_NUM_HOOKS:\n\t\t{\n\t\t\t// Satisfy a warning that all enum values should be used in a switch\n\t\t\t// but don't want a default branch, so that we catch new hooks missing from this list.\n\t\t\tbreak;\n\t\t}\n\t}  // switch (a_Hook)\n\tLOGWARNING(\"Requested name of an unknown hook type function: %d (max is %d)\", a_HookType, cPluginManager::HOOK_MAX);\n\tASSERT(!\"Unknown hook requested!\");\n\treturn nullptr;\n}\n\n\n\n\n\nbool cPluginLua::AddHookCallback(int a_HookType, cLuaState::cCallbackPtr && a_Callback)\n{\n\tm_HookMap[a_HookType].push_back(std::move(a_Callback));\n\treturn true;\n}\n\n\n\n\n\nint cPluginLua::CallFunctionFromForeignState(\n\tconst AString & a_FunctionName,\n\tcLuaState & a_ForeignState,\n\tint a_ParamStart,\n\tint a_ParamEnd\n)\n{\n\tcOperation op(*this);\n\n\t// Call the function:\n\tint NumReturns = op().CallFunctionWithForeignParams(a_FunctionName, a_ForeignState, a_ParamStart, a_ParamEnd);\n\tif (NumReturns < 0)\n\t{\n\t\t// The call has failed, an error has already been output to the log, so just silently bail out with the same error\n\t\treturn NumReturns;\n\t}\n\n\t// Copy all the return values:\n\tint Top = lua_gettop(m_LuaState);\n\tint res = a_ForeignState.CopyStackFrom(m_LuaState, Top - NumReturns + 1, Top);\n\n\t// Remove the return values off this stack:\n\tif (NumReturns > 0)\n\t{\n\t\tlua_pop(m_LuaState, NumReturns);\n\t}\n\n\treturn res;\n}\n\n\n\n\n\nvoid cPluginLua::ClearWebTabs(void)\n{\n\tauto webAdmin = cRoot::Get()->GetWebAdmin();\n\tif (webAdmin != nullptr)  // can be nullptr when shutting down the server\n\t{\n\t\twebAdmin->RemoveAllPluginWebTabs(m_Name);\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/PluginLua.h",
    "content": "\n// PluginLua.h\n\n// Declares the cPluginLua class representing a plugin written in Lua\n\n\n\n\n\n#pragma once\n\n#include \"Plugin.h\"\n#include \"LuaState.h\"\n\n// Names for the global variables through which the plugin is identified in its LuaState\n#define LUA_PLUGIN_INSTANCE_VAR_NAME \"_CuberiteInternal_PluginInstance\"\n\n\n\n\n// tolua_begin\nclass cPluginLua:\n\tpublic cPlugin\n{\n\t// tolua_end\n\n\tusing Super = cPlugin;\n\npublic:\n\n\t/** A RAII-style mutex lock for accessing the internal LuaState.\n\tThis will be the only way to retrieve the plugin's LuaState;\n\ttherefore it directly supports accessing the LuaState of the locked plugin.\n\tUsage:\n\t\tcPluginLua::cOperation Op(SomePlugin);\n\t\tOp().Call(...)  // Call a function in the plugin's LuaState\n\t*/\n\tclass cOperation\n\t{\n\tpublic:\n\t\tcOperation(cPluginLua & a_Plugin) :\n\t\t\tm_Plugin(a_Plugin),\n\t\t\tm_Lock(a_Plugin.m_LuaState)\n\t\t{\n\t\t}\n\n\t\tcLuaState & operator ()(void) { return m_Plugin.m_LuaState; }\n\n\tprotected:\n\t\tcPluginLua & m_Plugin;\n\n\t\t/** RAII lock for the Lua state. */\n\t\tcLuaState::cLock m_Lock;\n\t} ;\n\n\n\n\tcPluginLua(const AString & a_PluginDirectory, cDeadlockDetect & a_DeadlockDetect);\n\tvirtual ~cPluginLua() override;\n\n\tvirtual void OnDisable(void) override;\n\tvirtual bool Load(void) override;\n\tvirtual void Unload(void) override;\n\n\tvirtual void Tick(float a_Dt) override;\n\n\tvirtual bool OnBlockSpread              (cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source) override;\n\tvirtual bool OnBlockToPickups           (cWorld & a_World, Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, const cBlockEntity * a_BlockEntity, const cEntity * a_Digger, const cItem * a_Tool, cItems & a_Pickups) override;\n\tvirtual bool OnBrewingCompleting        (cWorld & a_World, cBrewingstandEntity & a_BrewingstandEntity) override;\n\tvirtual bool OnBrewingCompleted         (cWorld & a_World, cBrewingstandEntity & a_BrewingstandEntity) override;\n\tvirtual bool OnChat                     (cPlayer & a_Player, AString & a_Message) override;\n\tvirtual bool OnChunkAvailable           (cWorld & a_World, int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnChunkGenerated           (cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc) override;\n\tvirtual bool OnChunkGenerating          (cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc) override;\n\tvirtual bool OnChunkUnloaded            (cWorld & a_World, int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnChunkUnloading           (cWorld & a_World, int a_ChunkX, int a_ChunkZ) override;\n\tvirtual bool OnCollectingPickup         (cPlayer & a_Player, cPickup & a_Pickup) override;\n\tvirtual bool OnCraftingNoRecipe         (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) override;\n\tvirtual bool OnDisconnect               (cClientHandle & a_Client, const AString & a_Reason) override;\n\tvirtual bool OnEntityAddEffect          (cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier) override;\n\tvirtual bool OnEntityChangingWorld      (cEntity & a_Entity, cWorld & a_World) override;\n\tvirtual bool OnEntityChangedWorld       (cEntity & a_Entity, cWorld & a_World) override;\n\tvirtual bool OnExecuteCommand           (cPlayer * a_Player, const AStringVector & a_Split, const AString & a_EntireCommand, cPluginManager::CommandResult & a_Result) override;\n\tvirtual bool OnExploded                 (cWorld & a_World, double a_ExplosionSize,   bool a_CanCauseFire,   double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData) override;\n\tvirtual bool OnExploding                (cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData) override;\n\tvirtual bool OnHandshake                (cClientHandle & a_Client, const AString & a_Username) override;\n\tvirtual bool OnHopperPullingItem        (cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum) override;\n\tvirtual bool OnHopperPushingItem        (cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum) override;\n\tvirtual bool OnDropSpense               (cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum) override;\n\tvirtual bool OnKilled                   (cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage) override;\n\tvirtual bool OnKilling                  (cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI) override;\n\tvirtual bool OnLogin                    (cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username) override;\n\tvirtual bool OnLoginForge               (cClientHandle & a_Client, const AStringMap & a_Mods) override;\n\tvirtual bool OnPlayerAnimation          (cPlayer & a_Player, int a_Animation) override;\n\tvirtual bool OnPlayerBreakingBlock      (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;\n\tvirtual bool OnPlayerBrokenBlock        (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;\n\tvirtual bool OnPlayerDestroyed          (cPlayer & a_Player) override;\n\tvirtual bool OnPlayerEating             (cPlayer & a_Player) override;\n\tvirtual bool OnPlayerFished             (cPlayer & a_Player, const cItems & a_Reward, const int ExperienceAmount) override;\n\tvirtual bool OnPlayerFishing            (cPlayer & a_Player, cItems & a_Reward, int & ExperienceAmount) override;\n\tvirtual bool OnPlayerFoodLevelChange    (cPlayer & a_Player, int a_NewFoodLevel) override;\n\tvirtual bool OnPlayerJoined             (cPlayer & a_Player) override;\n\tvirtual bool OnPlayerLeftClick          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, char a_Status) override;\n\tvirtual bool OnPlayerMoving             (cPlayer & a_Player, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition, bool a_PreviousIsOnGround) override;\n\tvirtual bool OnPlayerOpeningWindow      (cPlayer & a_Player, cWindow & a_Window) override;\n\tvirtual bool OnPlayerPlacedBlock        (cPlayer & a_Player, const sSetBlock & a_BlockChange) override;\n\tvirtual bool OnPlayerPlacingBlock       (cPlayer & a_Player, const sSetBlock & a_BlockChange) override;\n\tvirtual bool OnPlayerCrouched           (cPlayer & a_Player) override;\n\tvirtual bool OnPlayerRightClick         (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override;\n\tvirtual bool OnPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity) override;\n\tvirtual bool OnPlayerShooting           (cPlayer & a_Player) override;\n\tvirtual bool OnPlayerSpawned            (cPlayer & a_Player) override;\n\tvirtual bool OnEntityTeleport           (cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition) override;\n\tvirtual bool OnPlayerTossingItem        (cPlayer & a_Player) override;\n\tvirtual bool OnPlayerUsedBlock          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;\n\tvirtual bool OnPlayerUsedItem           (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override;\n\tvirtual bool OnPlayerUsingBlock         (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;\n\tvirtual bool OnPlayerUsingItem          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override;\n\tvirtual bool OnPluginMessage            (cClientHandle & a_Client, const AString & a_Channel, ContiguousByteBufferView a_Message) override;\n\tvirtual bool OnPluginsLoaded            (void) override;\n\tvirtual bool OnPostCrafting             (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) override;\n\tvirtual bool OnPreCrafting              (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) override;\n\tvirtual bool OnProjectileHitBlock       (cProjectileEntity & a_Projectile, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Face, const Vector3d & a_BlockHitPos) override;\n\tvirtual bool OnProjectileHitEntity      (cProjectileEntity & a_Projectile, cEntity & a_HitEntity) override;\n\tvirtual bool OnServerPing               (cClientHandle & a_ClientHandle, AString & a_ServerDescription, int & a_OnlinePlayersCount, int & a_MaxPlayersCount, AString & a_Favicon) override;\n\tvirtual bool OnSpawnedEntity            (cWorld & a_World, cEntity & a_Entity) override;\n\tvirtual bool OnSpawnedMonster           (cWorld & a_World, cMonster & a_Monster) override;\n\tvirtual bool OnSpawningEntity           (cWorld & a_World, cEntity & a_Entity) override;\n\tvirtual bool OnSpawningMonster          (cWorld & a_World, cMonster & a_Monster) override;\n\tvirtual bool OnTakeDamage               (cEntity & a_Receiver, TakeDamageInfo & a_TakeDamageInfo) override;\n\tvirtual bool OnUpdatedSign              (cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player) override;\n\tvirtual bool OnUpdatingSign             (cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ,       AString & a_Line1,       AString & a_Line2,       AString & a_Line3,       AString & a_Line4, cPlayer * a_Player) override;\n\tvirtual bool OnWeatherChanged           (cWorld & a_World) override;\n\tvirtual bool OnWeatherChanging          (cWorld & a_World, eWeather & a_NewWeather) override;\n\tvirtual bool OnWorldStarted             (cWorld & a_World) override;\n\tvirtual bool OnWorldTick                (cWorld & a_World, std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_LastTickDurationMSec) override;\n\n\t/** Returns true if the plugin contains the function for the specified hook type, using the old-style registration (#121) */\n\tbool CanAddOldStyleHook(int a_HookType);\n\n\t/** Returns the name of Lua function that should handle the specified hook type in the older (#121) API */\n\tstatic const char * GetHookFnName(int a_HookType);\n\n\t/** Adds a Lua callback to be called for the specified hook.\n\tReturns true if the hook was added successfully. */\n\tbool AddHookCallback(int a_HookType, cLuaState::cCallbackPtr && a_Callback);\n\n\t/** Calls a function in this plugin's LuaState with parameters copied over from a_ForeignState.\n\tThe values that the function returns are placed onto a_ForeignState.\n\tReturns the number of values returned, if successful, or negative number on failure. */\n\tint CallFunctionFromForeignState(\n\t\tconst AString & a_FunctionName,\n\t\tcLuaState & a_ForeignState,\n\t\tint a_ParamStart,\n\t\tint a_ParamEnd\n\t);\n\n\t/** Call a Lua function residing in the plugin. */\n\ttemplate <typename FnT, typename... Args>\n\tbool Call(FnT a_Fn, Args && ... a_Args)\n\t{\n\t\treturn cOperation(*this)().Call(a_Fn, a_Args...);\n\t}\n\nprotected:\n\t/** Provides an array of Lua function references */\n\ttypedef std::vector<cLuaState::cCallbackPtr> cLuaCallbacks;\n\n\t/** Maps hook types into arrays of Lua function references to call for each hook type */\n\ttypedef std::map<int, cLuaCallbacks> cHookMap;\n\n\n\t/** The plugin's Lua state. */\n\tcLuaState m_LuaState;\n\n\t/** Hooks that the plugin has registered. */\n\tcHookMap m_HookMap;\n\n\t/** The DeadlockDetect object to which the plugin's CS is tracked. */\n\tcDeadlockDetect & m_DeadlockDetect;\n\n\n\t/** Releases all Lua references, notifies and removes all m_Resettables[] and closes the m_LuaState. */\n\tvoid Close(void);\n\n\t/** Removes all WebTabs currently registered for this plugin from the WebAdmin. */\n\tvoid ClearWebTabs(void);\n\n\t/** Calls a hook that has the simple format - single bool return value specifying whether the chain should continue.\n\tThe advanced hook types that need more processing implement a similar loop manually instead.\n\tReturns true if any of hook calls wants to abort the hook (returned true), false if all hook calls returned false. */\n\ttemplate <typename... Args>\n\tbool CallSimpleHooks(int a_HookType, Args && ... a_Args)\n\t{\n\t\tcOperation op(*this);\n\t\tauto & hooks = m_HookMap[a_HookType];\n\t\tbool res = false;\n\t\tfor (auto & hook: hooks)\n\t\t{\n\t\t\thook->Call(std::forward<Args>(a_Args)..., cLuaState::Return, res);\n\t\t\tif (res)\n\t\t\t{\n\t\t\t\t// Hook wants to terminate the chain processing\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n};  // tolua_export\n"
  },
  {
    "path": "src/Bindings/PluginManager.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"PluginManager.h\"\n#include \"Plugin.h\"\n#include \"PluginLua.h\"\n#include \"../Item.h\"\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../CommandOutput.h\"\n\n#include \"../IniFile.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\ncPluginManager * cPluginManager::Get(void)\n{\n\treturn cRoot::Get()->GetPluginManager();\n}\n\n\n\n\n\ncPluginManager::cPluginManager(cDeadlockDetect & a_DeadlockDetect) :\n\tm_bReloadPlugins(false),\n\tm_DeadlockDetect(a_DeadlockDetect)\n{\n}\n\n\n\n\n\ncPluginManager::~cPluginManager()\n{\n\tUnloadPluginsNow();\n}\n\n\n\n\n\nvoid cPluginManager::ReloadPlugins(void)\n{\n\tm_bReloadPlugins = true;\n}\n\n\n\n\n\nvoid cPluginManager::RefreshPluginList(void)\n{\n\t// Get a list of currently available folders:\n\tAString PluginsPath = GetPluginsPath() + \"/\";\n\tAStringVector Contents = cFile::GetFolderContents(PluginsPath);\n\tAStringVector Folders;\n\tfor (auto & item: Contents)\n\t{\n\t\tif (!cFile::IsFolder(PluginsPath + item))\n\t\t{\n\t\t\t// We only want folders, and don't want \".\" or \"..\"\n\t\t\tcontinue;\n\t\t}\n\t\tFolders.push_back(item);\n\t}  // for item - Contents[]\n\n\t// Set all plugins with invalid folders as psNotFound:\n\tfor (auto & plugin: m_Plugins)\n\t{\n\t\tif (std::find(Folders.cbegin(), Folders.cend(), plugin->GetFolderName()) == Folders.end())\n\t\t{\n\t\t\tplugin->m_Status = psNotFound;\n\t\t}\n\t}  // for plugin - m_Plugins[]\n\n\t// Add all newly discovered plugins:\n\tfor (auto & folder: Folders)\n\t{\n\t\tbool hasFound = false;\n\t\tfor (auto & plugin: m_Plugins)\n\t\t{\n\t\t\tif (plugin->GetFolderName() == folder)\n\t\t\t{\n\t\t\t\thasFound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // for plugin - m_Plugins[]\n\t\tif (!hasFound)\n\t\t{\n\t\t\tm_Plugins.push_back(std::make_shared<cPluginLua>(folder, m_DeadlockDetect));\n\t\t}\n\t}  // for folder - Folders[]\n}\n\n\n\n\n\nvoid cPluginManager::ReloadPluginsNow(void)\n{\n\tcIniFile a_SettingsIni;\n\ta_SettingsIni.ReadFile(cRoot::Get()->m_SettingsFilename);\n\tReloadPluginsNow(a_SettingsIni);\n}\n\n\n\n\n\nvoid cPluginManager::ReloadPluginsNow(cSettingsRepositoryInterface & a_Settings)\n{\n\tLOG(\"-- Loading Plugins --\");\n\n\t// Unload any existing plugins:\n\tm_bReloadPlugins = false;\n\tUnloadPluginsNow();\n\n\t// Refresh the list of plugins to load new ones from disk / remove the deleted ones:\n\tRefreshPluginList();\n\n\t// Load the plugins:\n\tAStringVector ToLoad = GetFoldersToLoad(a_Settings);\n\tfor (auto & pluginFolder: ToLoad)\n\t{\n\t\tLoadPlugin(pluginFolder);\n\t}  // for pluginFolder - ToLoad[]\n\n\t// Log a report of the loading process\n\tsize_t NumLoadedPlugins = GetNumLoadedPlugins();\n\tif (NumLoadedPlugins == 0)\n\t{\n\t\tLOG(\"-- No Plugins Loaded --\");\n\t}\n\telse if (NumLoadedPlugins == 1)\n\t{\n\t\tLOG(\"-- Loaded 1 Plugin --\");\n\t}\n\telse\n\t{\n\t\tLOG(\"-- Loaded %u Plugins --\", static_cast<unsigned>(NumLoadedPlugins));\n\t}\n\tCallHookPluginsLoaded();\n}\n\n\n\n\n\nvoid cPluginManager::InsertDefaultPlugins(cSettingsRepositoryInterface & a_Settings)\n{\n\ta_Settings.AddKeyName(\"Plugins\");\n\ta_Settings.AddValue(\"Plugins\", \"Core\", \"1\");\n\ta_Settings.AddValue(\"Plugins\", \"ChatLog\", \"1\");\n\ta_Settings.AddValue(\"Plugins\", \"ProtectionAreas\", \"0\");\n}\n\n\n\n\n\nvoid cPluginManager::Tick(float a_Dt)\n{\n\tdecltype(m_PluginsNeedAction) PluginsNeedAction;\n\t{\n\t\tcCSLock Lock(m_CSPluginsNeedAction);\n\t\tstd::swap(m_PluginsNeedAction, PluginsNeedAction);\n\t}\n\n\t// Process deferred actions:\n\tfor (auto & CurrentPlugin : PluginsNeedAction)\n\t{\n\t\tauto & Action = CurrentPlugin.first;\n\t\tauto & Folder = CurrentPlugin.second;\n\n\t\tbool WasLoaded = false;\n\t\tbool WasFound = false;\n\t\tfor (auto & Plugin: m_Plugins)\n\t\t{\n\t\t\tif (Plugin->GetFolderName() == Folder)\n\t\t\t{\n\t\t\t\tWasFound = true;\n\t\t\t\tif (Plugin->IsLoaded())\n\t\t\t\t{\n\t\t\t\t\tswitch (Action)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase PluginAction::Reload :\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Reload plugins by unloading, then loading:\n\t\t\t\t\t\t\tPlugin->Unload();\n\t\t\t\t\t\t\tPlugin->Load();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase PluginAction::Unload :\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Unload plugins that have been scheduled for unloading:\n\t\t\t\t\t\t\tPlugin->Unload();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tWasLoaded = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!WasFound)\n\t\t{\n\t\t\tLOG(\"Cannot act on plugin in folder \\\"%s\\\", there's no such plugin folder\", Folder.c_str());\n\t\t}\n\t\telse if (!WasLoaded)\n\t\t{\n\t\t\tLOG(\"Cannot act on plugin in folder \\\"%s\\\", it has not been loaded.\", Folder.c_str());\n\t\t}\n\t}  // for plugin - m_Plugins[]\n\n\t// If a plugin reload has been scheduled, reload now:\n\tif (m_bReloadPlugins)\n\t{\n\t\tReloadPluginsNow();\n\t}\n\n\tauto Plugins = m_Hooks.find(HOOK_TICK);\n\tif (Plugins == m_Hooks.end())\n\t{\n\t\treturn;\n\t}\n\n\tfor (auto * Plugin : Plugins->second)\n\t{\n\t\tPlugin->Tick(a_Dt);\n\t}\n}\n\n\n\n\n\ntemplate <typename HookFunction>\nbool cPluginManager::GenericCallHook(PluginHook a_HookName, HookFunction a_HookFunction)\n{\n\tauto Plugins = m_Hooks.find(a_HookName);\n\tif (Plugins == m_Hooks.end())\n\t{\n\t\treturn false;\n\t}\n\n\treturn std::any_of(Plugins->second.begin(), Plugins->second.end(), a_HookFunction);\n}\n\n\n\n\n\nbool cPluginManager::CallHookBlockSpread(cWorld & a_World, Vector3i a_BlockPos, eSpreadSource a_Source)\n{\n\treturn GenericCallHook(HOOK_BLOCK_SPREAD, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnBlockSpread(a_World, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_Source);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookBlockToPickups(\n\tcWorld & a_World,\n\tVector3i a_BlockPos,\n\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\tconst cBlockEntity * a_BlockEntity,\n\tconst cEntity * a_Digger,\n\tconst cItem * a_Tool,\n\tcItems & a_Pickups\n)\n{\n\treturn GenericCallHook(HOOK_BLOCK_TO_PICKUPS, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnBlockToPickups(a_World, a_BlockPos, a_BlockType, a_BlockMeta, a_BlockEntity, a_Digger, a_Tool, a_Pickups);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookBrewingCompleted(cWorld & a_World, cBrewingstandEntity & a_Brewingstand)\n{\n\treturn GenericCallHook(HOOK_BREWING_COMPLETED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnBrewingCompleted(a_World, a_Brewingstand);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookBrewingCompleting(cWorld & a_World, cBrewingstandEntity & a_Brewingstand)\n{\n\treturn GenericCallHook(HOOK_BREWING_COMPLETING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnBrewingCompleting(a_World, a_Brewingstand);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookChat(cPlayer & a_Player, AString & a_Message)\n{\n\t// Check if the message contains a command, execute it:\n\tswitch (HandleCommand(a_Player, a_Message, true))\n\t{\n\t\tcase crExecuted:\n\t\t{\n\t\t\t// The command has executed successfully\n\t\t\treturn true;\n\t\t}\n\n\t\tcase crBlocked:\n\t\t{\n\t\t\t// The command was blocked by a plugin using HOOK_EXECUTE_COMMAND\n\t\t\t// The plugin has most likely sent a message to the player already\n\t\t\treturn true;\n\t\t}\n\n\t\tcase crError:\n\t\t{\n\t\t\t// An error in the plugin has prevented the command from executing. Report the error to the player:\n\t\t\ta_Player.SendMessageFailure(fmt::format(FMT_STRING(\"Something went wrong while executing command \\\"{}\\\"\"), a_Message));\n\t\t\treturn true;\n\t\t}\n\n\t\tcase crNoPermission:\n\t\t{\n\t\t\t// The player is not allowed to execute this command\n\t\t\ta_Player.SendMessageFailure(fmt::format(FMT_STRING(\"Forbidden command; insufficient privileges: \\\"{}\\\"\"), a_Message));\n\t\t\treturn true;\n\t\t}\n\n\t\tcase crUnknownCommand:\n\t\t{\n\t\t\t// This was not a known command, keep processing as a message\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Check if the message is a command (starts with a slash). If it is, we know that it wasn't recognised:\n\tif (!a_Message.empty() && (a_Message[0] == '/'))\n\t{\n\t\tAStringVector Split(StringSplit(a_Message, \" \"));\n\t\tASSERT(!Split.empty());  // This should not happen - we know there's at least one char in the message so the split needs to be at least one item long\n\t\ta_Player.SendMessageInfo(fmt::format(FMT_STRING(\"Unknown command: \\\"{}\\\"\"), a_Message));\n\t\tLOGINFO(\"Player %s issued an unknown command: \\\"%s\\\"\", a_Player.GetName(), a_Message);\n\t\treturn true;  // Cancel sending\n\t}\n\n\treturn GenericCallHook(HOOK_CHAT, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnChat(a_Player, a_Message);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookChunkAvailable(cWorld & a_World, int a_ChunkX, int a_ChunkZ)\n{\n\treturn GenericCallHook(HOOK_CHUNK_AVAILABLE, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnChunkAvailable(a_World, a_ChunkX, a_ChunkZ);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookChunkGenerated(cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc)\n{\n\treturn GenericCallHook(HOOK_CHUNK_GENERATED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnChunkGenerated(a_World, a_ChunkX, a_ChunkZ, a_ChunkDesc);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookChunkGenerating(cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc)\n{\n\treturn GenericCallHook(HOOK_CHUNK_GENERATING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnChunkGenerating(a_World, a_ChunkX, a_ChunkZ, a_ChunkDesc);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookChunkUnloaded(cWorld & a_World, int a_ChunkX, int a_ChunkZ)\n{\n\treturn GenericCallHook(HOOK_CHUNK_UNLOADED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnChunkUnloaded(a_World, a_ChunkX, a_ChunkZ);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookChunkUnloading(cWorld & a_World, int a_ChunkX, int a_ChunkZ)\n{\n\treturn GenericCallHook(HOOK_CHUNK_UNLOADING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnChunkUnloading(a_World, a_ChunkX, a_ChunkZ);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookCollectingPickup(cPlayer & a_Player, cPickup & a_Pickup)\n{\n\treturn GenericCallHook(HOOK_COLLECTING_PICKUP, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnCollectingPickup(a_Player, a_Pickup);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookCraftingNoRecipe(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe)\n{\n\treturn GenericCallHook(HOOK_CRAFTING_NO_RECIPE, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnCraftingNoRecipe(a_Player, a_Grid, a_Recipe);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookDisconnect(cClientHandle & a_Client, const AString & a_Reason)\n{\n\treturn GenericCallHook(HOOK_DISCONNECT, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnDisconnect(a_Client, a_Reason);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookEntityAddEffect(cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier)\n{\n\treturn GenericCallHook(HOOK_ENTITY_ADD_EFFECT, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnEntityAddEffect(a_Entity, a_EffectType, a_EffectDurationTicks, a_EffectIntensity, a_DistanceModifier);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookEntityTeleport(cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition)\n{\n\treturn GenericCallHook(HOOK_ENTITY_TELEPORT, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnEntityTeleport(a_Entity, a_OldPosition, a_NewPosition);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookEntityChangingWorld(cEntity & a_Entity, cWorld & a_World)\n{\n\treturn GenericCallHook(HOOK_ENTITY_CHANGING_WORLD, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnEntityChangingWorld(a_Entity, a_World);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookEntityChangedWorld(cEntity & a_Entity, cWorld & a_World)\n{\n\treturn GenericCallHook(HOOK_ENTITY_CHANGED_WORLD, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnEntityChangedWorld(a_Entity, a_World);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookExecuteCommand(cPlayer * a_Player, const AStringVector & a_Split, const AString & a_EntireCommand, CommandResult & a_Result)\n{\n\t// Output the command being executed to log (for troubleshooting deadlocks-in-commands):\n\tif (a_Player != nullptr)\n\t{\n\t\tauto world = a_Player->GetWorld();\n\t\tAString worldName;\n\t\tInt64 worldAge;\n\t\tif (world != nullptr)\n\t\t{\n\t\t\tworldName = world->GetName();\n\t\t\tworldAge = world->GetWorldAge().count();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tworldName = \"<no world>\";\n\t\t\tworldAge = 0;\n\t\t}\n\t\tLOG(\"Player %s is executing command \\\"%s\\\" in world \\\"%s\\\" at world age %lld.\",\n\t\t\ta_Player->GetName().c_str(),\n\t\t\ta_EntireCommand.c_str(),\n\t\t\tworldName.c_str(),\n\t\t\tworldAge\n\t\t);\n\t}\n\n\treturn GenericCallHook(HOOK_EXECUTE_COMMAND, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnExecuteCommand(a_Player, a_Split, a_EntireCommand, a_Result);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookExploded(cWorld & a_World, double a_ExplosionSize, bool a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData)\n{\n\treturn GenericCallHook(HOOK_EXPLODED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnExploded(a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, a_SourceData);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookExploding(cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData)\n{\n\treturn GenericCallHook(HOOK_EXPLODING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnExploding(a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, a_SourceData);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookHandshake(cClientHandle & a_ClientHandle, const AString & a_Username)\n{\n\treturn GenericCallHook(HOOK_HANDSHAKE, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnHandshake(a_ClientHandle, a_Username);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookHopperPullingItem(cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum)\n{\n\treturn GenericCallHook(HOOK_HOPPER_PULLING_ITEM, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnHopperPullingItem(a_World, a_Hopper, a_DstSlotNum, a_SrcEntity, a_SrcSlotNum);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookHopperPushingItem(cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum)\n{\n\treturn GenericCallHook(HOOK_HOPPER_PUSHING_ITEM, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnHopperPushingItem(a_World, a_Hopper, a_SrcSlotNum, a_DstEntity, a_DstSlotNum);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookDropSpense(cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum)\n{\n\treturn GenericCallHook(HOOK_DROPSPENSE, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnDropSpense(a_World, a_DropSpenser, a_SlotNum);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookKilled(cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage)\n{\n\treturn GenericCallHook(HOOK_KILLED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnKilled(a_Victim, a_TDI, a_DeathMessage);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookKilling(cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI)\n{\n\treturn GenericCallHook(HOOK_KILLING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnKilling(a_Victim, a_Killer, a_TDI);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookLogin(cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username)\n{\n\treturn GenericCallHook(HOOK_LOGIN, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnLogin(a_Client, a_ProtocolVersion, a_Username);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookLoginForge(cClientHandle & a_Client, AStringMap & a_Mods)\n{\n\treturn GenericCallHook(HOOK_LOGIN_FORGE, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnLoginForge(a_Client, a_Mods);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerAnimation(cPlayer & a_Player, int a_Animation)\n{\n\treturn GenericCallHook(HOOK_PLAYER_ANIMATION, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerAnimation(a_Player, a_Animation);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerBreakingBlock(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn GenericCallHook(HOOK_PLAYER_BREAKING_BLOCK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerBreakingBlock(a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockFace, a_BlockType, a_BlockMeta);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerBrokenBlock(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn GenericCallHook(HOOK_PLAYER_BROKEN_BLOCK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerBrokenBlock(a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockFace, a_BlockType, a_BlockMeta);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerDestroyed(cPlayer & a_Player)\n{\n\treturn GenericCallHook(HOOK_PLAYER_DESTROYED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerDestroyed(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerEating(cPlayer & a_Player)\n{\n\treturn GenericCallHook(HOOK_PLAYER_EATING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerEating(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerFoodLevelChange(cPlayer & a_Player, int a_NewFoodLevel)\n{\n\treturn GenericCallHook(HOOK_PLAYER_FOOD_LEVEL_CHANGE, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerFoodLevelChange(a_Player, a_NewFoodLevel);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerFished(cPlayer & a_Player, const cItems & a_Reward, const int ExperienceAmount)\n{\n\treturn GenericCallHook(HOOK_PLAYER_FISHED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerFished(a_Player, a_Reward, ExperienceAmount);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerFishing(cPlayer & a_Player, cItems & a_Reward, int & ExperienceAmount)\n{\n\treturn GenericCallHook(HOOK_PLAYER_FISHING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerFishing(a_Player, a_Reward, ExperienceAmount);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerJoined(cPlayer & a_Player)\n{\n\treturn GenericCallHook(HOOK_PLAYER_JOINED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerJoined(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerLeftClick(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, char a_Status)\n{\n\treturn GenericCallHook(HOOK_PLAYER_LEFT_CLICK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerLeftClick(a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockFace, a_Status);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerMoving(cPlayer & a_Player, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition, bool a_PreviousIsOnGround)\n{\n\treturn GenericCallHook(HOOK_PLAYER_MOVING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerMoving(a_Player, a_OldPosition, a_NewPosition, a_PreviousIsOnGround);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerOpeningWindow(cPlayer & a_Player, cWindow & a_Window)\n{\n\treturn GenericCallHook(HOOK_PLAYER_OPENING_WINDOW, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerOpeningWindow(a_Player, a_Window);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerPlacedBlock(cPlayer & a_Player, const sSetBlock & a_BlockChange)\n{\n\treturn GenericCallHook(HOOK_PLAYER_PLACED_BLOCK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerPlacedBlock(a_Player, a_BlockChange);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerPlacingBlock(cPlayer & a_Player, const sSetBlock & a_BlockChange)\n{\n\treturn GenericCallHook(HOOK_PLAYER_PLACING_BLOCK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerPlacingBlock(a_Player, a_BlockChange);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerCrouched(cPlayer & a_Player)\n{\n\treturn GenericCallHook(HOOK_PLAYER_CROUCHED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerCrouched(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerRightClick(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos)\n{\n\treturn GenericCallHook(HOOK_PLAYER_RIGHT_CLICK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerRightClick(a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockFace, a_CursorPos.x, a_CursorPos.y, a_CursorPos.z);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity)\n{\n\treturn GenericCallHook(HOOK_PLAYER_RIGHT_CLICKING_ENTITY, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerRightClickingEntity(a_Player, a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerShooting(cPlayer & a_Player)\n{\n\treturn GenericCallHook(HOOK_PLAYER_SHOOTING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerShooting(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerSpawned(cPlayer & a_Player)\n{\n\treturn GenericCallHook(HOOK_PLAYER_SPAWNED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerSpawned(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerTossingItem(cPlayer & a_Player)\n{\n\treturn GenericCallHook(HOOK_PLAYER_TOSSING_ITEM, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerTossingItem(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerUsedBlock(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn GenericCallHook(HOOK_PLAYER_USED_BLOCK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerUsedBlock(a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockFace, a_CursorPos.x, a_CursorPos.y, a_CursorPos.z, a_BlockType, a_BlockMeta);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerUsedItem(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos)\n{\n\treturn GenericCallHook(HOOK_PLAYER_USED_ITEM, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerUsedItem(a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockFace, a_CursorPos.x, a_CursorPos.y, a_CursorPos.z);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerUsingBlock(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn GenericCallHook(HOOK_PLAYER_USING_BLOCK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerUsingBlock(a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockFace, a_CursorPos.x, a_CursorPos.y, a_CursorPos.z, a_BlockType, a_BlockMeta);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPlayerUsingItem(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos)\n{\n\treturn GenericCallHook(HOOK_PLAYER_USING_ITEM, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPlayerUsingItem(a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockFace, a_CursorPos.x, a_CursorPos.y, a_CursorPos.z);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPluginMessage(cClientHandle & a_Client, const AString & a_Channel, const ContiguousByteBufferView a_Message)\n{\n\treturn GenericCallHook(HOOK_PLUGIN_MESSAGE, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPluginMessage(a_Client, a_Channel, a_Message);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPluginsLoaded(void)\n{\n\tauto Plugins = m_Hooks.find(HOOK_PLUGINS_LOADED);\n\tif (Plugins == m_Hooks.end())\n\t{\n\t\treturn false;\n\t}\n\n\tbool res = false;\n\tfor (auto * Plugin : Plugins->second)\n\t{\n\t\tif (!Plugin->OnPluginsLoaded())\n\t\t{\n\t\t\tres = true;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool cPluginManager::CallHookPostCrafting(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe)\n{\n\treturn GenericCallHook(HOOK_POST_CRAFTING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPostCrafting(a_Player, a_Grid, a_Recipe);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookPreCrafting(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe)\n{\n\treturn GenericCallHook(HOOK_PRE_CRAFTING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnPreCrafting(a_Player, a_Grid, a_Recipe);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookProjectileHitBlock(cProjectileEntity & a_Projectile, Vector3i a_BlockPos, eBlockFace a_Face, const Vector3d & a_BlockHitPos)\n{\n\treturn GenericCallHook(HOOK_PROJECTILE_HIT_BLOCK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnProjectileHitBlock(a_Projectile, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_Face, a_BlockHitPos);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookProjectileHitEntity(cProjectileEntity & a_Projectile, cEntity & a_HitEntity)\n{\n\treturn GenericCallHook(HOOK_PROJECTILE_HIT_ENTITY, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnProjectileHitEntity(a_Projectile, a_HitEntity);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookServerPing(cClientHandle & a_ClientHandle, AString & a_ServerDescription, int & a_OnlinePlayersCount, int & a_MaxPlayersCount, AString & a_Favicon)\n{\n\treturn GenericCallHook(HOOK_SERVER_PING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnServerPing(a_ClientHandle, a_ServerDescription, a_OnlinePlayersCount, a_MaxPlayersCount, a_Favicon);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookSpawnedEntity(cWorld & a_World, cEntity & a_Entity)\n{\n\treturn GenericCallHook(HOOK_SPAWNED_ENTITY, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnSpawnedEntity(a_World, a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookSpawnedMonster(cWorld & a_World, cMonster & a_Monster)\n{\n\treturn GenericCallHook(HOOK_SPAWNED_MONSTER, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnSpawnedMonster(a_World, a_Monster);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookSpawningEntity(cWorld & a_World, cEntity & a_Entity)\n{\n\treturn GenericCallHook(HOOK_SPAWNING_ENTITY, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnSpawningEntity(a_World, a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookSpawningMonster(cWorld & a_World, cMonster & a_Monster)\n{\n\treturn GenericCallHook(HOOK_SPAWNING_MONSTER, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnSpawningMonster(a_World, a_Monster);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookTakeDamage(cEntity & a_Receiver, TakeDamageInfo & a_TDI)\n{\n\treturn GenericCallHook(HOOK_TAKE_DAMAGE, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnTakeDamage(a_Receiver, a_TDI);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookUpdatingSign(cWorld & a_World, Vector3i a_BlockPos, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4, cPlayer * a_Player)\n{\n\treturn GenericCallHook(HOOK_UPDATING_SIGN, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnUpdatingSign(a_World, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_Line1, a_Line2, a_Line3, a_Line4, a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookUpdatedSign(cWorld & a_World, Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player)\n{\n\treturn GenericCallHook(HOOK_UPDATED_SIGN, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnUpdatedSign(a_World, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_Line1, a_Line2, a_Line3, a_Line4, a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookWeatherChanged(cWorld & a_World)\n{\n\treturn GenericCallHook(HOOK_WEATHER_CHANGED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnWeatherChanged(a_World);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookWeatherChanging(cWorld & a_World, eWeather & a_NewWeather)\n{\n\treturn GenericCallHook(HOOK_WEATHER_CHANGING, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnWeatherChanging(a_World, a_NewWeather);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookWorldStarted(cWorld & a_World)\n{\n\treturn GenericCallHook(HOOK_WORLD_STARTED, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnWorldStarted(a_World);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cPluginManager::CallHookWorldTick(cWorld & a_World, std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_LastTickDurationMSec)\n{\n\treturn GenericCallHook(HOOK_WORLD_TICK, [&](cPlugin * a_Plugin)\n\t\t{\n\t\t\treturn a_Plugin->OnWorldTick(a_World, a_Dt, a_LastTickDurationMSec);\n\t\t}\n\t);\n}\n\n\n\n\n\ncPluginManager::CommandResult cPluginManager::HandleCommand(cPlayer & a_Player, const AString & a_Command, bool a_ShouldCheckPermissions)\n{\n\tAStringVector Split(StringSplit(a_Command, \" \"));\n\tif (Split.empty())\n\t{\n\t\treturn crUnknownCommand;\n\t}\n\n\tCommandMap::iterator cmd = m_Commands.find(Split[0]);\n\tif (cmd == m_Commands.end())\n\t{\n\t\t// Command not found\n\t\t// If it started with a slash, ask the plugins if they still want to handle it:\n\t\tif (!a_Command.empty() && (a_Command[0] == '/'))\n\t\t{\n\t\t\tCommandResult Result = crUnknownCommand;\n\t\t\tCallHookExecuteCommand(&a_Player, Split, a_Command, Result);\n\t\t\treturn Result;\n\t\t}\n\t\treturn crUnknownCommand;\n\t}\n\n\t// Ask plugins first if a command is okay to execute the command:\n\tCommandResult Result = crBlocked;\n\tif (CallHookExecuteCommand(&a_Player, Split, a_Command, Result))\n\t{\n\t\tif (Result == crBlocked)\n\t\t{\n\t\t\tLOGINFO(\"Player %s tried executing command \\\"%s\\\" that was stopped by the HOOK_EXECUTE_COMMAND hook\", a_Player.GetName().c_str(), Split[0].c_str());\n\t\t}\n\t\treturn Result;\n\t}\n\n\tif (\n\t\ta_ShouldCheckPermissions &&\n\t\t!cmd->second.m_Permission.empty() &&\n\t\t!a_Player.HasPermission(cmd->second.m_Permission)\n\t)\n\t{\n\t\tLOGINFO(\"Player %s tried to execute forbidden command: \\\"%s\\\"\", a_Player.GetName().c_str(), Split[0].c_str());\n\t\treturn crNoPermission;\n\t}\n\n\tASSERT(cmd->second.m_Handler != nullptr);\n\n\tif (!cmd->second.m_Handler->ExecuteCommand(Split, &a_Player, a_Command, nullptr))\n\t{\n\t\treturn crError;\n\t}\n\n\treturn crExecuted;\n}\n\n\n\n\n\nvoid cPluginManager::UnloadPluginsNow()\n{\n\t// Remove all bindings:\n\tm_Hooks.clear();\n\tm_Commands.clear();\n\tm_ConsoleCommands.clear();\n\n\t// Re-bind built-in console commands:\n\tcServer::BindBuiltInConsoleCommands();\n\n\t// Unload all loaded plugins:\n\tfor (auto & plugin: m_Plugins)\n\t{\n\t\tif (plugin->IsLoaded())\n\t\t{\n\t\t\tplugin->Unload();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cPluginManager::UnloadPlugin(const AString & a_PluginFolder)\n{\n\tcCSLock Lock(m_CSPluginsNeedAction);\n\tm_PluginsNeedAction.emplace_back(PluginAction::Unload, a_PluginFolder);\n}\n\n\n\n\n\nvoid cPluginManager::ReloadPlugin(const AString & a_PluginFolder)\n{\n\tcCSLock Lock(m_CSPluginsNeedAction);\n\tm_PluginsNeedAction.emplace_back(PluginAction::Reload, a_PluginFolder);\n}\n\n\n\n\n\nbool cPluginManager::LoadPlugin(const AString & a_FolderName)\n{\n\tfor (auto & plugin: m_Plugins)\n\t{\n\t\tif (plugin->GetFolderName() == a_FolderName)\n\t\t{\n\t\t\tif (!plugin->IsLoaded())\n\t\t\t{\n\t\t\t\treturn plugin->Load();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}  // for plugin - m_Plugins[]\n\n\t// Plugin not found\n\tLOG(\"Cannot load plugin, folder \\\"%s\\\" not found.\", a_FolderName.c_str());\n\treturn false;\n}\n\n\n\n\n\nvoid cPluginManager::RemoveHooks(cPlugin * a_Plugin)\n{\n\tfor (auto & Hook : m_Hooks)\n\t{\n\t\tHook.second.remove(a_Plugin);\n\t}\n}\n\n\n\n\n\nvoid cPluginManager::RemovePluginCommands(cPlugin * a_Plugin)\n{\n\tfor (CommandMap::iterator itr = m_Commands.begin(); itr != m_Commands.end();)\n\t{\n\t\tif (itr->second.m_Plugin == a_Plugin)\n\t\t{\n\t\t\tCommandMap::iterator EraseMe = itr;  // Stupid GCC doesn't have a std::map::erase() that would return the next iterator\n\t\t\t++itr;\n\t\t\tm_Commands.erase(EraseMe);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++itr;\n\t\t}\n\t}  // for itr - m_Commands[]\n}\n\n\n\n\n\nbool cPluginManager::IsPluginLoaded(const AString & a_PluginName)\n{\n\tfor (auto & plugin: m_Plugins)\n\t{\n\t\tif (plugin->GetName() == a_PluginName)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginManager::BindCommand(\n\tconst AString & a_Command,\n\tcPlugin * a_Plugin,\n\tcCommandHandlerPtr a_Handler,\n\tconst AString & a_Permission,\n\tconst AString & a_HelpString\n)\n{\n\tCommandMap::iterator cmd = m_Commands.find(a_Command);\n\tif (cmd != m_Commands.end())\n\t{\n\t\tLOGWARNING(\"Command \\\"%s\\\" is already bound to plugin \\\"%s\\\".\", a_Command.c_str(), cmd->second.m_Plugin->GetName().c_str());\n\t\treturn false;\n\t}\n\n\tauto & reg = m_Commands[a_Command];\n\treg.m_Plugin     = a_Plugin;\n\treg.m_Handler    = std::move(a_Handler);\n\treg.m_Permission = a_Permission;\n\treg.m_HelpString = a_HelpString;\n\treturn true;\n}\n\n\n\n\n\nbool cPluginManager::ForEachCommand(cCommandEnumCallback & a_Callback)\n{\n\tfor (auto & itr : m_Commands)\n\t{\n\t\tif (a_Callback.Command(itr.first, itr.second.m_Plugin, itr.second.m_Permission, itr.second.m_HelpString))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - m_Commands[]\n\treturn true;\n}\n\n\n\n\n\nbool cPluginManager::IsCommandBound(const AString & a_Command)\n{\n\treturn (m_Commands.find(a_Command) != m_Commands.end());\n}\n\n\n\n\n\nAString cPluginManager::GetCommandPermission(const AString & a_Command)\n{\n\tCommandMap::iterator cmd = m_Commands.find(a_Command);\n\treturn (cmd == m_Commands.end()) ? \"\" : cmd->second.m_Permission;\n}\n\n\n\n\n\ncPluginManager::CommandResult cPluginManager::ExecuteCommand(cPlayer & a_Player, const AString & a_Command)\n{\n\treturn HandleCommand(a_Player, a_Command, true);\n}\n\n\n\n\n\ncPluginManager::CommandResult cPluginManager::ForceExecuteCommand(cPlayer & a_Player, const AString & a_Command)\n{\n\treturn HandleCommand(a_Player, a_Command, false);\n}\n\n\n\n\n\nvoid cPluginManager::RemovePluginConsoleCommands(cPlugin * a_Plugin)\n{\n\tfor (CommandMap::iterator itr = m_ConsoleCommands.begin(); itr != m_ConsoleCommands.end();)\n\t{\n\t\tif (itr->second.m_Plugin == a_Plugin)\n\t\t{\n\t\t\tCommandMap::iterator EraseMe = itr;  // Stupid GCC doesn't have a std::map::erase() that would return the next iterator\n\t\t\t++itr;\n\t\t\tm_ConsoleCommands.erase(EraseMe);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++itr;\n\t\t}\n\t}  // for itr - m_Commands[]\n}\n\n\n\n\n\nbool cPluginManager::BindConsoleCommand(\n\tconst AString & a_Command,\n\tcPlugin * a_Plugin,\n\tcCommandHandlerPtr a_Handler,\n\tconst AString & a_HelpString\n)\n{\n\tCommandMap::iterator cmd = m_ConsoleCommands.find(a_Command);\n\tif (cmd != m_ConsoleCommands.end())\n\t{\n\t\tif (cmd->second.m_Plugin == nullptr)\n\t\t{\n\t\t\tLOGWARNING(\"Console command \\\"%s\\\" is already bound internally by Cuberite, cannot bind in plugin \\\"%s\\\".\", a_Command.c_str(), a_Plugin->GetName().c_str());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLOGWARNING(\"Console command \\\"%s\\\" is already bound to plugin \\\"%s\\\", cannot bind in plugin \\\"%s\\\".\", a_Command.c_str(), cmd->second.m_Plugin->GetName().c_str(), a_Plugin->GetName().c_str());\n\t\t}\n\t\treturn false;\n\t}\n\n\tauto & reg = m_ConsoleCommands[a_Command];\n\treg.m_Plugin     = a_Plugin;\n\treg.m_Handler    = std::move(a_Handler);\n\treg.m_Permission = \"\";\n\treg.m_HelpString = a_HelpString;\n\treturn true;\n}\n\n\n\n\n\nbool cPluginManager::ForEachConsoleCommand(cCommandEnumCallback & a_Callback)\n{\n\tfor (auto & itr : m_ConsoleCommands)\n\t{\n\t\tif (a_Callback.Command(itr.first, itr.second.m_Plugin, \"\", itr.second.m_HelpString))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - m_Commands[]\n\treturn true;\n}\n\n\n\n\n\nbool cPluginManager::IsConsoleCommandBound(const AString & a_Command)\n{\n\treturn (m_ConsoleCommands.find(a_Command) != m_ConsoleCommands.end());\n}\n\n\n\n\n\nbool cPluginManager::ExecuteConsoleCommand(const AStringVector & a_Split, cCommandOutputCallback & a_Output, const AString & a_Command)\n{\n\tif (a_Split.empty())\n\t{\n\t\treturn false;\n\t}\n\n\tCommandMap::iterator cmd = m_ConsoleCommands.find(a_Split[0]);\n\tif (cmd == m_ConsoleCommands.end())\n\t{\n\t\t// Command not found\n\t\t// Still notify the plugins (so that plugins such as Aliases can intercept unknown commands).\n\t\tCommandResult res = crBlocked;\n\t\tCallHookExecuteCommand(nullptr, a_Split, a_Command, res);\n\t\treturn (res == crExecuted);\n\t}\n\n\tif (cmd->second.m_Plugin == nullptr)\n\t{\n\t\t// This is a built-in command\n\t\treturn false;\n\t}\n\n\t// Ask plugins first if a command is okay to execute the console command:\n\tCommandResult res = crBlocked;\n\tif (CallHookExecuteCommand(nullptr, a_Split, a_Command, res))\n\t{\n\t\treturn (res == crExecuted);\n\t}\n\n\treturn cmd->second.m_Handler->ExecuteCommand(a_Split, nullptr, a_Command, &a_Output);\n}\n\n\n\n\n\nvoid cPluginManager::TabCompleteCommand(const AString & a_Text, AStringVector & a_Results, cPlayer * a_Player)\n{\n\tfor (auto & Command : m_Commands)\n\t{\n\t\tif (NoCaseCompare(Command.first.substr(0, a_Text.length()), a_Text) != 0)\n\t\t{\n\t\t\t// Command name doesn't match\n\t\t\tcontinue;\n\t\t}\n\t\tif ((a_Player != nullptr) && !a_Player->HasPermission(Command.second.m_Permission))\n\t\t{\n\t\t\t// Player doesn't have permission for the command\n\t\t\tcontinue;\n\t\t}\n\n\t\t/*  Client expects to only get back the last part of a space separated command.\n\t\tFind the position of the beginning of the last part:\n\t\tPosition of last space + 1 for space separated commands\n\t\tstring::npos + 1 = 0 for commands that are not separated\n\n\t\tThen skip all commands that have too many subcommands.\n\t\tWhen the client asks for suggestions for \"/time s\"\n\t\tthe server must skip all commands that consist of more than 2 words just as\n\t\t\"/time set day\". Or in other words, the position of the last space (separator)\n\t\tin the strings must be equal or string::npos for both. */\n\t\tsize_t LastSpaceInText = a_Text.find_last_of(' ') + 1;\n\t\tsize_t LastSpaceInSuggestion = Command.first.find_last_of(' ') + 1;\n\n\t\tif (LastSpaceInText != LastSpaceInSuggestion)\n\t\t{\n\t\t\t// Suggestion has more subcommands than a_Text\n\t\t\tcontinue;\n\t\t}\n\n\t\ta_Results.push_back(Command.first.substr(LastSpaceInSuggestion));\n\t}\n}\n\n\n\n\n\nbool cPluginManager::IsValidHookType(int a_HookType)\n{\n\treturn ((a_HookType >= 0) && (a_HookType <= HOOK_MAX));\n}\n\n\n\n\n\nbool cPluginManager::DoWithPlugin(const AString & a_PluginName, cPluginCallback a_Callback)\n{\n\t// TODO: Implement locking for plugins\n\tfor (auto & plugin: m_Plugins)\n\t{\n\t\tif (plugin->GetName() == a_PluginName)\n\t\t{\n\t\t\treturn a_Callback(*plugin);\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPluginManager::ForEachPlugin(cPluginCallback a_Callback)\n{\n\t// TODO: Implement locking for plugins\n\tfor (auto & plugin: m_Plugins)\n\t{\n\t\tif (a_Callback(*plugin))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nAString cPluginManager::GetPluginFolderName(const AString & a_PluginName)\n{\n\t// TODO: Implement locking for plugins\n\tfor (auto & plugin: m_Plugins)\n\t{\n\t\tif (plugin->GetName() == a_PluginName)\n\t\t{\n\t\t\treturn plugin->GetFolderName();\n\t\t}\n\t}\n\treturn AString();\n}\n\n\n\n\n\nvoid cPluginManager::AddHook(cPlugin * a_Plugin, int a_Hook)\n{\n\tif (a_Plugin == nullptr)\n\t{\n\t\tLOGWARN(\"Called cPluginManager::AddHook() with a_Plugin == nullptr\");\n\t\treturn;\n\t}\n\tPluginList & Plugins = m_Hooks[a_Hook];\n\tif (std::find(Plugins.cbegin(), Plugins.cend(), a_Plugin) == Plugins.cend())\n\t{\n\t\tPlugins.push_back(a_Plugin);\n\t}\n}\n\n\n\n\n\nsize_t cPluginManager::GetNumPlugins(void) const\n{\n\treturn m_Plugins.size();\n}\n\n\n\n\n\nsize_t cPluginManager::GetNumLoadedPlugins(void) const\n{\n\tsize_t res = 0;\n\tfor (auto & plugin: m_Plugins)\n\t{\n\t\tif (plugin->IsLoaded())\n\t\t{\n\t\t\tres += 1;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cPluginManager::GetFoldersToLoad(cSettingsRepositoryInterface & a_Settings)\n{\n\t// Check if the Plugins section exists.\n\tif (!a_Settings.KeyExists(\"Plugins\"))\n\t{\n\t\tInsertDefaultPlugins(a_Settings);\n\t}\n\n\tAStringVector res;\n\n\t// Get the old format plugin list, and migrate it.\n\t// Upgrade path added on 2020-03-27\n\tauto OldValues = a_Settings.GetValues(\"Plugins\");\n\tfor (const auto & NameValue : OldValues)\n\t{\n\t\tAString ValueName = NameValue.first;\n\t\tif (ValueName.compare(\"Plugin\") == 0)\n\t\t{\n\t\t\tAString PluginFile = NameValue.second;\n\t\t\tif (\n\t\t\t\t!PluginFile.empty() &&\n\t\t\t\t(PluginFile != \"0\") &&\n\t\t\t\t(PluginFile != \"1\")\n\t\t\t)\n\t\t\t{\n\t\t\t\ta_Settings.DeleteValue(\"Plugins\", ValueName);\n\t\t\t\ta_Settings.SetValue(\"Plugins\", PluginFile, \"1\");\n\t\t\t}\n\t\t}\n\t}  // for i - ini values\n\n\t// Get the list of plugins to load:\n\tauto Values = a_Settings.GetValues(\"Plugins\");\n\tfor (const auto & NameValue : Values)\n\t{\n\t\tAString Enabled = NameValue.second;\n\t\tif (Enabled == \"1\")\n\t\t{\n\t\t\tres.push_back(NameValue.first);\n\t\t}\n\t}  // for i - ini values\n\n\treturn res;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Bindings/PluginManager.h",
    "content": "\n#pragma once\n\n\n#include \"../BlockType.h\"\n#include \"../Defines.h\"\n#include \"../FunctionRef.h\"\n\n\n\n\n\n// fwd:\nclass cBlockEntityWithItems;\nclass cBrewingstandEntity;\nclass cChunkDesc;\nclass cClientHandle;\nclass cCommandOutputCallback;\nclass cCraftingGrid;\nclass cCraftingRecipe;\nclass cDropSpenserEntity;\nclass cEntity;\nclass cHopperEntity;\nclass cItems;\nclass cMonster;\nclass cPickup;\nclass cPlayer;\nclass cPlugin;\nclass cProjectileEntity;\nclass cWindow;\nclass cWorld;\nclass cSettingsRepositoryInterface;\nclass cDeadlockDetect;\nstruct TakeDamageInfo;\n\ntypedef std::shared_ptr<cPlugin> cPluginPtr;\ntypedef std::vector<cPluginPtr> cPluginPtrs;\n\n\n\n\n\n// tolua_begin\nclass cPluginManager\n{\npublic:\n\n\tenum CommandResult\n\t{\n\t\tcrExecuted,\n\t\tcrUnknownCommand,\n\t\tcrError,\n\t\tcrBlocked,\n\t\tcrNoPermission,\n\t} ;\n\n\n\t/** Defines the status of a single plugin - whether it is loaded, disabled or errored. */\n\tenum ePluginStatus\n\t{\n\t\t/** The plugin has been loaded successfully. */\n\t\tpsLoaded,\n\n\t\t/** The plugin is disabled in settings.ini. */\n\t\tpsDisabled,\n\n\t\t/** The plugin is enabled in settings.ini but has been unloaded (by a command). */\n\t\tpsUnloaded,\n\n\t\t/** The plugin is enabled in settings.ini but has failed to load.\n\t\tm_LoadError is the description of the error. */\n\t\tpsError,\n\n\t\t/** The plugin has been loaded before, but after a folder refresh it is no longer present.\n\t\tThe plugin will be unloaded in the next call to ReloadPlugins(). */\n\t\tpsNotFound,\n\t};\n\n\n\tenum PluginHook\n\t{\n\t\tHOOK_BLOCK_SPREAD,\n\t\tHOOK_BLOCK_TO_PICKUPS,\n\t\tHOOK_BREWING_COMPLETING,\n\t\tHOOK_BREWING_COMPLETED,\n\t\tHOOK_CHAT,\n\t\tHOOK_CHUNK_AVAILABLE,\n\t\tHOOK_CHUNK_GENERATED,\n\t\tHOOK_CHUNK_GENERATING,\n\t\tHOOK_CHUNK_UNLOADED,\n\t\tHOOK_CHUNK_UNLOADING,\n\t\tHOOK_COLLECTING_PICKUP,\n\t\tHOOK_CRAFTING_NO_RECIPE,\n\t\tHOOK_DISCONNECT,\n\t\tHOOK_PLAYER_ANIMATION,\n\t\tHOOK_ENTITY_ADD_EFFECT,\n\t\tHOOK_ENTITY_CHANGING_WORLD,\n\t\tHOOK_ENTITY_CHANGED_WORLD,\n\t\tHOOK_EXECUTE_COMMAND,\n\t\tHOOK_EXPLODED,\n\t\tHOOK_EXPLODING,\n\t\tHOOK_HANDSHAKE,\n\t\tHOOK_HOPPER_PULLING_ITEM,\n\t\tHOOK_HOPPER_PUSHING_ITEM,\n\t\tHOOK_DROPSPENSE,\n\t\tHOOK_KILLED,\n\t\tHOOK_KILLING,\n\t\tHOOK_LOGIN,\n\t\tHOOK_LOGIN_FORGE,\n\t\tHOOK_PLAYER_BREAKING_BLOCK,\n\t\tHOOK_PLAYER_BROKEN_BLOCK,\n\t\tHOOK_PLAYER_DESTROYED,\n\t\tHOOK_PLAYER_EATING,\n\t\tHOOK_PLAYER_FISHED,\n\t\tHOOK_PLAYER_FISHING,\n\t\tHOOK_PLAYER_FOOD_LEVEL_CHANGE,\n\t\tHOOK_PLAYER_JOINED,\n\t\tHOOK_PLAYER_LEFT_CLICK,\n\t\tHOOK_PLAYER_MOVING,\n\t\tHOOK_PLAYER_OPENING_WINDOW,\n\t\tHOOK_PLAYER_PLACED_BLOCK,\n\t\tHOOK_PLAYER_PLACING_BLOCK,\n\t\tHOOK_PLAYER_CROUCHED,\n\t\tHOOK_PLAYER_RIGHT_CLICK,\n\t\tHOOK_PLAYER_RIGHT_CLICKING_ENTITY,\n\t\tHOOK_PLAYER_SHOOTING,\n\t\tHOOK_PLAYER_SPAWNED,\n\t\tHOOK_ENTITY_TELEPORT,\n\t\tHOOK_PLAYER_TOSSING_ITEM,\n\t\tHOOK_PLAYER_USED_BLOCK,\n\t\tHOOK_PLAYER_USED_ITEM,\n\t\tHOOK_PLAYER_USING_BLOCK,\n\t\tHOOK_PLAYER_USING_ITEM,\n\t\tHOOK_PLUGIN_MESSAGE,\n\t\tHOOK_PLUGINS_LOADED,\n\t\tHOOK_POST_CRAFTING,\n\t\tHOOK_PRE_CRAFTING,\n\t\tHOOK_PROJECTILE_HIT_BLOCK,\n\t\tHOOK_PROJECTILE_HIT_ENTITY,\n\t\tHOOK_SERVER_PING,\n\t\tHOOK_SPAWNED_ENTITY,\n\t\tHOOK_SPAWNED_MONSTER,\n\t\tHOOK_SPAWNING_ENTITY,\n\t\tHOOK_SPAWNING_MONSTER,\n\t\tHOOK_TAKE_DAMAGE,\n\t\tHOOK_TICK,\n\t\tHOOK_UPDATED_SIGN,\n\t\tHOOK_UPDATING_SIGN,\n\t\tHOOK_WEATHER_CHANGED,\n\t\tHOOK_WEATHER_CHANGING,\n\t\tHOOK_WORLD_STARTED,\n\t\tHOOK_WORLD_TICK,\n\n\t\t// tolua_end\n\n\t\t// Note that if a hook type is added, it may need processing in cPlugin::CanAddHook() descendants,\n\t\t//   and it definitely needs adding in cPluginLua::GetHookFnName() !\n\n\t\t// Keep these two as the last items, they are used for validity checking and get their values automagically\n\t\tHOOK_NUM_HOOKS,\n\t\tHOOK_MAX = HOOK_NUM_HOOKS - 1,\n\t} ;  // tolua_export\n\n\n\t/** Defines the deferred actions needed for a plugin */\n\tenum class PluginAction\n\t{\n\t\tReload,\n\t\tUnload\n\t};\n\n\n\t/** Used as a callback for enumerating bound commands */\n\tclass cCommandEnumCallback\n\t{\n\tpublic:\n\t\tvirtual ~cCommandEnumCallback() {}\n\n\t\t/** Called for each command; return true to abort enumeration\n\t\tFor console commands, a_Permission is not used (set to empty string)\n\t\t*/\n\t\tvirtual bool Command(const AString & a_Command, const cPlugin * a_Plugin, const AString & a_Permission, const AString & a_HelpString) = 0;\n\t} ;\n\n\n\t/** Interface that must be provided by any class that implements a command handler, either in-game or console command. */\n\tclass cCommandHandler\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants\n\t\tvirtual ~cCommandHandler() {}\n\n\t\t/** Executes the specified in-game command.\n\t\ta_Split is the command string, split at the spaces.\n\t\ta_Player is the player executing the command, nullptr in case of the console.\n\t\ta_Command is the entire command string.\n\t\ta_Output is the sink into which the additional text returned by the command handler should be sent; only used for console commands. */\n\t\tvirtual bool ExecuteCommand(\n\t\t\tconst AStringVector & a_Split,\n\t\t\tcPlayer * a_Player,\n\t\t\tconst AString & a_Command,\n\t\t\tcCommandOutputCallback * a_Output = nullptr\n\t\t) = 0;\n\t};\n\n\ttypedef std::shared_ptr<cCommandHandler> cCommandHandlerPtr;\n\n\n\t/** The interface used for enumerating and extern-calling plugins */\n\tusing cPluginCallback = cFunctionRef<bool(cPlugin &)>;\n\n\ttypedef std::list<cPlugin *> PluginList;\n\n\n\t/** Called each tick, calls the plugins' OnTick hook, as well as processes plugin events (addition, removal) */\n\tvoid Tick(float a_Dt);\n\n\t/** Returns the instance of the Plugin Manager (there is only ever one) */\n\tstatic cPluginManager * Get(void);  // tolua_export\n\n\t/** Refreshes the m_Plugins list based on the current contents of the Plugins folder.\n\tIf an active plugin's folder is not found anymore, the plugin is set as psNotFound, but not yet unloaded. */\n\tvoid RefreshPluginList();  // tolua_export\n\n\t/** Schedules a reload of the plugins to happen within the next call to Tick(). */\n\tvoid ReloadPlugins();  // tolua_export\n\n\t/** Adds the plugin to the list of plugins called for the specified hook type.\n\tIf a plugin adds multiple handlers for a single hook, it is added only once (ignore-duplicates). */\n\tvoid AddHook(cPlugin * a_Plugin, int a_HookType);\n\n\t/** Returns the number of all plugins in m_Plugins (includes disabled, unloaded and errored plugins). */\n\tsize_t GetNumPlugins() const;  // tolua_export\n\n\t/** Returns the number of plugins that are psLoaded. */\n\tsize_t GetNumLoadedPlugins(void) const;  // tolua_export\n\n\t// Calls for individual hooks. Each returns false if the action is to continue or true if the plugin wants to abort\n\tbool CallHookBlockSpread              (cWorld & a_World, Vector3i a_BlockPos, eSpreadSource a_Source);\n\tbool CallHookBlockToPickups           (cWorld & a_World, Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, const cBlockEntity * a_BlockEntity, const cEntity * a_Digger, const cItem * a_Tool, cItems & a_Pickups);\n\tbool CallHookBrewingCompleting        (cWorld & a_World, cBrewingstandEntity & a_Brewingstand);\n\tbool CallHookBrewingCompleted         (cWorld & a_World, cBrewingstandEntity & a_Brewingstand);\n\tbool CallHookChat                     (cPlayer & a_Player, AString & a_Message);\n\tbool CallHookChunkAvailable           (cWorld & a_World, int a_ChunkX, int a_ChunkZ);\n\tbool CallHookChunkGenerated           (cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc);\n\tbool CallHookChunkGenerating          (cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc);\n\tbool CallHookChunkUnloaded            (cWorld & a_World, int a_ChunkX, int a_ChunkZ);\n\tbool CallHookChunkUnloading           (cWorld & a_World, int a_ChunkX, int a_ChunkZ);\n\tbool CallHookCollectingPickup         (cPlayer & a_Player, cPickup & a_Pickup);\n\tbool CallHookCraftingNoRecipe         (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe);\n\tbool CallHookDisconnect               (cClientHandle & a_Client, const AString & a_Reason);\n\tbool CallHookEntityAddEffect          (cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier);\n\tbool CallHookEntityTeleport           (cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition);\n\tbool CallHookEntityChangingWorld      (cEntity & a_Entity, cWorld & a_World);\n\tbool CallHookEntityChangedWorld       (cEntity & a_Entity, cWorld & a_World);\n\tbool CallHookExecuteCommand           (cPlayer * a_Player, const AStringVector & a_Split, const AString & a_EntireCommand, CommandResult & a_Result);  // If a_Player == nullptr, it is a console cmd\n\tbool CallHookExploded                 (cWorld & a_World, double a_ExplosionSize,   bool a_CanCauseFire,   double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData);\n\tbool CallHookExploding                (cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData);\n\tbool CallHookHandshake                (cClientHandle & a_ClientHandle, const AString & a_Username);\n\tbool CallHookHopperPullingItem        (cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum);\n\tbool CallHookHopperPushingItem        (cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum);\n\tbool CallHookDropSpense               (cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum);\n\tbool CallHookKilled                   (cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage);\n\tbool CallHookKilling                  (cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI);\n\tbool CallHookLogin                    (cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username);\n\tbool CallHookLoginForge               (cClientHandle & a_Client, AStringMap & a_Mods);\n\tbool CallHookPlayerAnimation          (cPlayer & a_Player, int a_Animation);\n\tbool CallHookPlayerBreakingBlock      (cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\tbool CallHookPlayerBrokenBlock        (cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\tbool CallHookPlayerDestroyed          (cPlayer & a_Player);\n\tbool CallHookPlayerEating             (cPlayer & a_Player);\n\tbool CallHookPlayerFished             (cPlayer & a_Player, const cItems & a_Reward, const int ExperienceAmount);\n\tbool CallHookPlayerFishing            (cPlayer & a_Player, cItems & a_Reward, int & ExperienceAmount);\n\tbool CallHookPlayerFoodLevelChange    (cPlayer & a_Player, int a_NewFoodLevel);\n\tbool CallHookPlayerJoined             (cPlayer & a_Player);\n\tbool CallHookPlayerLeftClick          (cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, char a_Status);\n\tbool CallHookPlayerMoving             (cPlayer & a_Player, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition, bool a_PreviousIsOnGround);\n\tbool CallHookPlayerOpeningWindow      (cPlayer & a_Player, cWindow & a_Window);\n\tbool CallHookPlayerPlacedBlock        (cPlayer & a_Player, const sSetBlock & a_BlockChange);\n\tbool CallHookPlayerPlacingBlock       (cPlayer & a_Player, const sSetBlock & a_BlockChange);\n\tbool CallHookPlayerCrouched           (cPlayer & a_Player);\n\tbool CallHookPlayerRightClick         (cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos);\n\tbool CallHookPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity);\n\tbool CallHookPlayerShooting           (cPlayer & a_Player);\n\tbool CallHookPlayerSpawned            (cPlayer & a_Player);\n\tbool CallHookPlayerTossingItem        (cPlayer & a_Player);\n\tbool CallHookPlayerUsedBlock          (cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\tbool CallHookPlayerUsedItem           (cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos);\n\tbool CallHookPlayerUsingBlock         (cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\tbool CallHookPlayerUsingItem          (cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos);\n\tbool CallHookPluginMessage            (cClientHandle & a_Client, const AString & a_Channel, ContiguousByteBufferView a_Message);\n\tbool CallHookPluginsLoaded            (void);\n\tbool CallHookPostCrafting             (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe);\n\tbool CallHookPreCrafting              (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe);\n\tbool CallHookProjectileHitBlock       (cProjectileEntity & a_Projectile, Vector3i a_BlockPos, eBlockFace a_Face, const Vector3d & a_BlockHitPos);\n\tbool CallHookProjectileHitEntity      (cProjectileEntity & a_Projectile, cEntity & a_HitEntity);\n\tbool CallHookServerPing               (cClientHandle & a_ClientHandle, AString & a_ServerDescription, int & a_OnlinePlayersCount, int & a_MaxPlayersCount, AString & a_Favicon);\n\tbool CallHookSpawnedEntity            (cWorld & a_World, cEntity & a_Entity);\n\tbool CallHookSpawnedMonster           (cWorld & a_World, cMonster & a_Monster);\n\tbool CallHookSpawningEntity           (cWorld & a_World, cEntity & a_Entity);\n\tbool CallHookSpawningMonster          (cWorld & a_World, cMonster & a_Monster);\n\tbool CallHookTakeDamage               (cEntity & a_Receiver, TakeDamageInfo & a_TDI);\n\tbool CallHookUpdatedSign              (cWorld & a_World, Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player);\n\tbool CallHookUpdatingSign             (cWorld & a_World, Vector3i a_BlockPos,       AString & a_Line1,       AString & a_Line2,       AString & a_Line3,       AString & a_Line4, cPlayer * a_Player);\n\tbool CallHookWeatherChanged           (cWorld & a_World);\n\tbool CallHookWeatherChanging          (cWorld & a_World, eWeather & a_NewWeather);\n\tbool CallHookWorldStarted             (cWorld & a_World);\n\tbool CallHookWorldTick                (cWorld & a_World, std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_LastTickDurationMSec);\n\n\t/** Queues the specified plugin to be unloaded in the next call to Tick().\n\tNote that this function returns before the plugin is unloaded, to avoid deadlocks. */\n\tvoid UnloadPlugin(const AString & a_PluginFolder);  // tolua_export\n\n\t/** Queues the specified plugin to be reloaded in the next call to Tick().\n\tNote that this function returns before the plugin is unloaded, to avoid deadlocks. */\n\tvoid ReloadPlugin(const AString & a_PluginFolder);  // tolua_export\n\n\t/** Loads the plugin from the specified plugin folder.\n\tReturns true if the plugin was loaded successfully or was already loaded before, false otherwise. */\n\tbool LoadPlugin(const AString & a_PluginFolder);  // tolua_export\n\n\t/** Removes all hooks the specified plugin has registered */\n\tvoid RemoveHooks(cPlugin * a_Plugin);\n\n\t/** Removes the plugin of the specified name from the internal structures and deletes its object. */\n\tvoid RemovePlugin(const AString & a_PluginName);\n\n\t/** Removes all command bindings that the specified plugin has made */\n\tvoid RemovePluginCommands(cPlugin * a_Plugin);\n\n\t/** Returns true if the specified plugin is loaded. */\n\tbool IsPluginLoaded(const AString & a_PluginName);  // tolua_export\n\n\t/** Binds a command to the specified handler.\n\tReturns true if successful, false if command already bound.\n\tExported in ManualBindings.cpp. */\n\tbool BindCommand(\n\t\tconst AString & a_Command,\n\t\tcPlugin * a_Plugin,\n\t\tcCommandHandlerPtr a_Handler,\n\t\tconst AString & a_Permission,\n\t\tconst AString & a_HelpString\n\t);\n\n\t/** Calls a_Callback for each bound command, returns true if all commands were enumerated */\n\tbool ForEachCommand(cCommandEnumCallback & a_Callback);  // Exported in ManualBindings.cpp\n\n\t/** Returns true if the command is in the command map */\n\tbool IsCommandBound(const AString & a_Command);  // tolua_export\n\n\t/** Returns the permission needed for the specified command; empty string if command not found */\n\tAString GetCommandPermission(const AString & a_Command);  // tolua_export\n\n\t/** Executes the command, as if it was requested by a_Player. Checks permissions first. Returns crExecuted if executed. */\n\tCommandResult ExecuteCommand(cPlayer & a_Player, const AString & a_Command);  // tolua_export\n\n\t/** Executes the command, as if it was requested by a_Player. Permisssions are not checked. Returns crExecuted if executed. */\n\tCommandResult ForceExecuteCommand(cPlayer & a_Player, const AString & a_Command);  // tolua_export\n\n\t/** Removes all console command bindings that the specified plugin has made */\n\tvoid RemovePluginConsoleCommands(cPlugin * a_Plugin);\n\n\t/** Binds a console command to the specified handler.\n\tReturns true if successful, false if command already bound.\n\tExported in ManualBindings.cpp. */\n\tbool BindConsoleCommand(\n\t\tconst AString & a_Command,\n\t\tcPlugin * a_Plugin,\n\t\tcCommandHandlerPtr a_Handler,\n\t\tconst AString & a_HelpString\n\t);\n\n\t/** Calls a_Callback for each bound console command, returns true if all commands were enumerated */\n\tbool ForEachConsoleCommand(cCommandEnumCallback & a_Callback);  // Exported in ManualBindings.cpp\n\n\t/** Returns true if the console command is in the command map */\n\tbool IsConsoleCommandBound(const AString & a_Command);  // tolua_export\n\n\t/** Executes the command split into a_Split, as if it was given on the console.\n\tReturns true if executed. Output is sent to the a_Output callback\n\tExported in ManualBindings.cpp with a different signature. */\n\tbool ExecuteConsoleCommand(const AStringVector & a_Split, cCommandOutputCallback & a_Output, const AString & a_Command);\n\n\t/** Appends all commands beginning with a_Text (case-insensitive) into a_Results.\n\tIf a_Player is not nullptr, only commands for which the player has permissions are added.\n\t*/\n\tvoid TabCompleteCommand(const AString & a_Text, AStringVector & a_Results, cPlayer * a_Player);\n\n\t/** Returns true if the specified hook type is within the allowed range */\n\tstatic bool IsValidHookType(int a_HookType);\n\n\t/** Calls the specified callback with the plugin object of the specified plugin.\n\tReturns false if plugin not found, otherwise returns the value that the callback has returned. */\n\tbool DoWithPlugin(const AString & a_PluginName, cPluginCallback a_Callback);\n\n\t/** Calls the specified callback for each plugin in m_Plugins.\n\tReturns true if all plugins have been reported, false if the callback has aborted the enumeration by returning true. */\n\tbool ForEachPlugin(cPluginCallback a_Callback);\n\n\t/** Returns the name of the folder (cPlugin::GetFolderName()) from which the specified plugin was loaded. */\n\tAString GetPluginFolderName(const AString & a_PluginName);  // tolua_export\n\n\t/** Returns the path where individual plugins' folders are expected.\n\tThe path doesn't end in a slash. */\n\tstatic AString GetPluginsPath(void) { return \"Plugins\"; }  // tolua_export\n\nprivate:\n\tfriend class cRoot;\n\n\tclass cCommandReg\n\t{\n\tpublic:\n\t\tcPlugin * m_Plugin;\n\t\tAString   m_Permission;  // Not used for console commands\n\t\tAString   m_HelpString;\n\t\tcCommandHandlerPtr m_Handler;\n\t} ;\n\n\ttypedef std::map<int, cPluginManager::PluginList> HookMap;\n\ttypedef std::map<AString, cCommandReg> CommandMap;\n\n\n\t/** FolderNames of plugins that need an action (unload, reload, ...).\n\tThe plugins will be acted upon within the next call to Tick(), to avoid multithreading issues.\n\tProtected against multithreaded access by m_CSPluginsNeedAction. */\n\tstd::vector<std::pair<PluginAction, AString>> m_PluginsNeedAction;\n\n\t/** Protects m_PluginsToUnload against multithreaded access. */\n\tmutable cCriticalSection m_CSPluginsNeedAction;\n\n\t/** All plugins that have been found in the Plugins folder. */\n\tcPluginPtrs m_Plugins;\n\n\tHookMap    m_Hooks;\n\tCommandMap m_Commands;\n\tCommandMap m_ConsoleCommands;\n\n\t/** If set to true, all the plugins will be reloaded within the next call to Tick(). */\n\tbool m_bReloadPlugins;\n\n\t/** The deadlock detect in which all plugins should track their CSs. */\n\tcDeadlockDetect & m_DeadlockDetect;\n\n\n\tcPluginManager(cDeadlockDetect & a_DeadlockDetect);\n\tvirtual ~cPluginManager();\n\n\t/** Reloads all plugins, defaulting to settings.ini for settings location */\n\tvoid ReloadPluginsNow(void);\n\n\t/** Reloads all plugins with a settings repo expected to be initialised to settings.ini */\n\tvoid ReloadPluginsNow(cSettingsRepositoryInterface & a_Settings);\n\n\t/** Unloads all plugins */\n\tvoid UnloadPluginsNow(void);\n\n\t/** Handles writing default plugins if 'Plugins' key not found using a settings repo expected to be intialised to settings.ini */\n\tvoid InsertDefaultPlugins(cSettingsRepositoryInterface & a_Settings);\n\n\t/** Tries to match a_Command to the internal table of commands, if a match is found, the corresponding plugin is called. Returns crExecuted if the command is executed. */\n\tCommandResult HandleCommand(cPlayer & a_Player, const AString & a_Command, bool a_ShouldCheckPermissions);\n\n\t/** Returns the folders that are specified in the settings ini to load plugins from. */\n\tAStringVector GetFoldersToLoad(cSettingsRepositoryInterface & a_Settings);\n\n\t/** Calls a_HookFunction on each plugin registered to the hook HookName.\n\tReturns false if the action is to continue or true if the plugin wants to abort.\n\tAccessible only from within PluginManager.cpp */\n\ttemplate <typename HookFunction>\n\tbool GenericCallHook(PluginHook a_HookName, HookFunction a_HookFunction);\n} ;  // tolua_export\n\n\n\n"
  },
  {
    "path": "src/Bindings/tolua++.h",
    "content": "\n// tolua++.h\n\n// Redirection file, needed because ToLua++ generates the Bindings.cpp file with >> #include \"tolua++.h\" <<\n// Only used from Bindings.cpp\n\n\n\n\n#include \"tolua++/include/tolua++.h\"\n\n#ifdef _MSC_VER\n\t// Disable specific warnings for the generated Bindings.cpp file:\n\t#pragma warning(disable: 4800)  // 'int' : forcing value to bool 'true' or 'false' (performance warning)\n#endif  // _MSC_VER\n\n\n\n\n"
  },
  {
    "path": "src/BiomeDef.cpp",
    "content": "\n// BiomeDef.cpp\n\n// Implements biome helper functions\n\n\n#include \"Globals.h\"\n#include \"BiomeDef.h\"\n\n\n\n\n// The \"map\" used for biome <-> string conversions:\nstatic struct\n{\n\tEMCSBiome    m_Biome;\n\tconst char * m_String;\n} g_BiomeMap[] =\n{\n\t{biOcean,            \"Ocean\"},\n\t{biPlains,           \"Plains\"},\n\t{biDesert,           \"Desert\"},\n\t{biExtremeHills,     \"ExtremeHills\"},\n\t{biForest,           \"Forest\"},\n\t{biTaiga,            \"Taiga\"},\n\t{biSwampland,        \"Swampland\"},\n\t{biRiver,            \"River\"},\n\t{biNether,           \"Hell\"},\n\t{biNether,           \"Nether\"},\n\t{biEnd,              \"Sky\"},\n\t{biEnd,              \"End\"},\n\t{biFrozenOcean,      \"FrozenOcean\"},\n\t{biFrozenRiver,      \"FrozenRiver\"},\n\t{biIcePlains,        \"IcePlains\"},\n\t{biIcePlains,        \"Tundra\"},\n\t{biIceMountains,     \"IceMountains\"},\n\t{biMushroomIsland,   \"MushroomIsland\"},\n\t{biMushroomShore,    \"MushroomShore\"},\n\t{biBeach,            \"Beach\"},\n\t{biDesertHills,      \"DesertHills\"},\n\t{biForestHills,      \"ForestHills\"},\n\t{biTaigaHills,       \"TaigaHills\"},\n\t{biExtremeHillsEdge, \"ExtremeHillsEdge\"},\n\t{biJungle,           \"Jungle\"},\n\t{biJungleHills,      \"JungleHills\"},\n\n\t// Release 1.7 biomes:\n\t{biJungleEdge,       \"JungleEdge\"},\n\t{biDeepOcean,        \"DeepOcean\"},\n\t{biStoneBeach,       \"StoneBeach\"},\n\t{biColdBeach,        \"ColdBeach\"},\n\t{biBirchForest,      \"BirchForest\"},\n\t{biBirchForestHills, \"BirchForestHills\"},\n\t{biRoofedForest,     \"RoofedForest\"},\n\t{biColdTaiga,        \"ColdTaiga\"},\n\t{biColdTaigaHills,   \"ColdTaigaHills\"},\n\t{biMegaTaiga,        \"MegaTaiga\"},\n\t{biMegaTaigaHills,   \"MegaTaigaHills\"},\n\t{biExtremeHillsPlus, \"ExtremeHillsPlus\"},\n\t{biSavanna,          \"Savanna\"},\n\t{biSavannaPlateau,   \"SavannaPlateau\"},\n\t{biMesa,             \"Mesa\"},\n\t{biMesaPlateauF,     \"MesaPlateauF\"},\n\t{biMesaPlateau,      \"MesaPlateau\"},\n\n\t// Release 1.7 variants:\n\t{biSunflowerPlains,      \"SunflowerPlains\"},\n\t{biDesertM,              \"DesertM\"},\n\t{biExtremeHillsM,        \"ExtremeHillsM\"},\n\t{biFlowerForest,         \"FlowerForest\"},\n\t{biTaigaM,               \"TaigaM\"},\n\t{biSwamplandM,           \"SwamplandM\"},\n\t{biIcePlainsSpikes,      \"IcePlainsSpikes\"},\n\t{biJungleM,              \"JungleM\"},\n\t{biJungleEdgeM,          \"JungleEdgeM\"},\n\t{biBirchForestM,         \"BirchForestM\"},\n\t{biBirchForestHillsM,    \"BirchForestHillsM\"},\n\t{biRoofedForestM,        \"RoofedForestM\"},\n\t{biColdTaigaM,           \"ColdTaigaM\"},\n\t{biMegaSpruceTaiga,      \"MegaSpruceTaiga\"},\n\t{biMegaSpruceTaigaHills, \"MegaSpruceTaigaHills\"},\n\t{biExtremeHillsPlusM,    \"ExtremeHillsPlusM\"},\n\t{biSavannaM,             \"SavannaM\"},\n\t{biSavannaPlateauM,      \"SavannaPlateauM\"},\n\t{biMesaBryce,            \"MesaBryce\"},\n\t{biMesaPlateauFM,        \"MesaPlateauFM\"},\n\t{biMesaPlateauM,         \"MesaPlateauM\"},\n} ;\n\n\n\n\n\nEMCSBiome StringToBiome(const AString & a_BiomeString)\n{\n\t// If it is a number, return it:\n\tint res = atoi(a_BiomeString.c_str());\n\tif ((res != 0) || (a_BiomeString.compare(\"0\") == 0))\n\t{\n\t\tif ((res >= biFirstBiome) && (res < biNumBiomes))\n\t\t{\n\t\t\treturn static_cast<EMCSBiome>(res);\n\t\t}\n\t\telse if ((res >= biFirstVariantBiome) && (res < biNumVariantBiomes))\n\t\t{\n\t\t\treturn static_cast<EMCSBiome>(res);\n\t\t}\n\t\t// It was an invalid number\n\t\treturn biInvalidBiome;\n\t}\n\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_BiomeMap); i++)\n\t{\n\t\tif (NoCaseCompare(g_BiomeMap[i].m_String, a_BiomeString) == 0)\n\t\t{\n\t\t\treturn g_BiomeMap[i].m_Biome;\n\t\t}\n\t}  // for i - BiomeMap[]\n\treturn biInvalidBiome;\n}\n\n\n\n\n\nAString BiomeToString(int a_Biome)\n{\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_BiomeMap); i++)\n\t{\n\t\tif (g_BiomeMap[i].m_Biome == a_Biome)\n\t\t{\n\t\t\treturn g_BiomeMap[i].m_String;\n\t\t}\n\t}\n\treturn AString();\n}\n\n\n\n\n\nbool IsBiomeNoDownfall(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biDesert:\n\t\tcase biDesertHills:\n\t\tcase biDesertM:\n\t\tcase biSavanna:\n\t\tcase biSavannaM:\n\t\tcase biSavannaPlateau:\n\t\tcase biSavannaPlateauM:\n\t\tcase biNether:\n\t\tcase biEnd:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBiomeVeryCold(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biFrozenOcean:\n\t\tcase biFrozenRiver:\n\t\tcase biIcePlains:\n\t\tcase biIceMountains:\n\t\tcase biColdBeach:\n\t\tcase biColdTaiga:\n\t\tcase biColdTaigaHills:\n\t\tcase biIcePlainsSpikes:\n\t\tcase biColdTaigaM:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBiomeCold(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biExtremeHills:\n\t\tcase biTaiga:\n\t\tcase biTaigaHills:\n\t\tcase biExtremeHillsEdge:\n\t\tcase biStoneBeach:\n\t\tcase biMegaTaiga:\n\t\tcase biMegaTaigaHills:\n\t\tcase biExtremeHillsPlus:\n\t\tcase biExtremeHillsM:\n\t\tcase biTaigaM:\n\t\tcase biColdTaigaM:\n\t\tcase biMegaSpruceTaiga:\n\t\tcase biMegaSpruceTaigaHills:\n\t\tcase biExtremeHillsPlusM:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBiomeMountain(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biExtremeHills:\n\t\tcase biExtremeHillsEdge:\n\t\tcase biExtremeHillsM:\n\t\tcase biExtremeHillsPlus:\n\t\tcase biExtremeHillsPlusM:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBiomeMesa(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biMesa:\n\t\tcase biMesaPlateauF:\n\t\tcase biMesaPlateau:\n\t\tcase biMesaBryce:\n\t\tcase biMesaPlateauFM:\n\t\tcase biMesaPlateauM:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nint GetSnowStartHeight(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biIcePlainsSpikes:\n\t\tcase biIcePlains:\n\t\tcase biIceMountains:\n\t\tcase biFrozenRiver:\n\t\tcase biColdBeach:\n\t\tcase biColdTaiga:\n\t\tcase biColdTaigaHills:\n\t\tcase biColdTaigaM:\n\t\t{\n\t\t\t// Always snow\n\t\t\treturn 0;\n\t\t}\n\n\t\tcase biExtremeHills:\n\t\tcase biExtremeHillsM:\n\t\tcase biExtremeHillsPlus:\n\t\tcase biExtremeHillsPlusM:\n\t\tcase biStoneBeach:\n\t\t{\n\t\t\t// Starts snowing at 96\n\t\t\treturn 96;\n\t\t}\n\n\t\tcase biTaiga:\n\t\tcase biTaigaHills:\n\t\tcase biTaigaM:\n\t\t{\n\t\t\t// Start snowing at 130\n\t\t\treturn 130;\n\t\t}\n\n\t\tcase biMegaTaiga:\n\t\tcase biMegaSpruceTaiga:\n\t\tcase biMegaTaigaHills:\n\t\tcase biMegaSpruceTaigaHills:\n\t\t{\n\t\t\t// Start snowing at 160\n\t\t\treturn 160;\n\t\t}\n\n\t\tcase biRiver:\n\t\tcase biOcean:\n\t\tcase biDeepOcean:\n\t\t{\n\t\t\t// Starts snowing at 280\n\t\t\treturn 280;\n\t\t}\n\n\t\tcase biBirchForest:\n\t\tcase biBirchForestHills:\n\t\tcase biBirchForestM:\n\t\tcase biBirchForestHillsM:\n\t\t{\n\t\t\t// Starts snowing at 335\n\t\t\treturn 335;\n\t\t}\n\n\t\tcase biForest:\n\t\tcase biForestHills:\n\t\tcase biFlowerForest:\n\t\tcase biRoofedForest:\n\t\tcase biRoofedForestM:\n\t\t{\n\t\t\t// Starts snowing at 400\n\t\t\treturn 400;\n\t\t}\n\n\t\tcase biPlains:\n\t\tcase biSunflowerPlains:\n\t\tcase biSwampland:\n\t\tcase biSwamplandM:\n\t\tcase biBeach:\n\t\t{\n\t\t\t// Starts snowing at 460\n\t\t\treturn 460;\n\t\t}\n\n\t\tcase biMushroomIsland:\n\t\tcase biMushroomShore:\n\t\t{\n\t\t\t// Starts snowing at 520\n\t\t\treturn 520;\n\t\t}\n\n\t\tcase biJungle:\n\t\tcase biJungleHills:\n\t\tcase biJungleM:\n\t\tcase biJungleEdge:\n\t\tcase biJungleEdgeM:\n\t\t{\n\t\t\t// Starts snowing at 550\n\t\t\treturn 550;\n\t\t}\n\n\t\tcase biDesert:\n\t\tcase biDesertHills:\n\t\tcase biDesertM:\n\t\tcase biSavanna:\n\t\tcase biSavannaM:\n\t\tcase biSavannaPlateau:\n\t\tcase biSavannaPlateauM:\n\t\tcase biMesa:\n\t\tcase biMesaBryce:\n\t\tcase biMesaPlateau:\n\t\tcase biMesaPlateauF:\n\t\tcase biMesaPlateauFM:\n\t\tcase biMesaPlateauM:\n\t\t{\n\t\t\t// These biomes don't actualy have any downfall.\n\t\t\treturn 1000;\n\t\t}\n\n\t\tcase biNether:\n\t\tcase biEnd:\n\t\t{\n\t\t\t// These shouldn't get any snow at all.\n\t\t\treturn 9999;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/BiomeDef.h",
    "content": "\n// BiomeDef.h\n\n// Defines relevant information and methods related to biomes\n\n\n\n\n\n#pragma once\n\n// tolua_begin\n/** Biome IDs\nThe first batch corresponds to the clientside biomes, used by MineCraft.\nBiomeIDs over 255 are used by Cuberite internally and are translated to MC biomes before sending them to client\n*/\nenum EMCSBiome\n{\n\tbiInvalidBiome     = -1,\n\n\tbiFirstBiome       = 0,\n\tbiOcean            = 0,\n\tbiPlains           = 1,\n\tbiDesert           = 2,\n\tbiExtremeHills     = 3,\n\tbiForest           = 4,\n\tbiTaiga            = 5,\n\tbiSwampland        = 6,\n\tbiRiver            = 7,\n\tbiHell             = 8,  // same as Nether\n\tbiNether           = 8,\n\tbiSky              = 9,  // same as biEnd\n\tbiEnd              = 9,\n\tbiFrozenOcean      = 10,\n\tbiFrozenRiver      = 11,\n\tbiIcePlains        = 12,\n\tbiTundra           = 12,  // same as Ice Plains\n\tbiIceMountains     = 13,\n\tbiMushroomIsland   = 14,\n\tbiMushroomShore    = 15,\n\tbiBeach            = 16,\n\tbiDesertHills      = 17,\n\tbiForestHills      = 18,\n\tbiTaigaHills       = 19,\n\tbiExtremeHillsEdge = 20,\n\tbiJungle           = 21,\n\tbiJungleHills      = 22,\n\n\t// Release 1.7 biomes:\n\tbiJungleEdge       = 23,\n\tbiDeepOcean        = 24,\n\tbiStoneBeach       = 25,\n\tbiColdBeach        = 26,\n\tbiBirchForest      = 27,\n\tbiBirchForestHills = 28,\n\tbiRoofedForest     = 29,\n\tbiColdTaiga        = 30,\n\tbiColdTaigaHills   = 31,\n\tbiMegaTaiga        = 32,\n\tbiMegaTaigaHills   = 33,\n\tbiExtremeHillsPlus = 34,\n\tbiSavanna          = 35,\n\tbiSavannaPlateau   = 36,\n\tbiMesa             = 37,\n\tbiMesaPlateauF     = 38,\n\tbiMesaPlateau      = 39,\n\n\t// Automatically capture the maximum consecutive biome value into biMaxBiome:\n\tbiNumBiomes,  // True number of biomes, since they are zero-based\n\tbiMaxBiome = biNumBiomes - 1,  // The maximum biome value\n\n\t// Add this number to the biomes to get the variant\n\tbiVariant = 128,\n\n\t// Release 1.7 biome variants:\n\tbiFirstVariantBiome    = 129,\n\tbiSunflowerPlains      = 129,\n\tbiDesertM              = 130,\n\tbiExtremeHillsM        = 131,\n\tbiFlowerForest         = 132,\n\tbiTaigaM               = 133,\n\tbiSwamplandM           = 134,\n\tbiIcePlainsSpikes      = 140,\n\tbiJungleM              = 149,\n\tbiJungleEdgeM          = 151,\n\tbiBirchForestM         = 155,\n\tbiBirchForestHillsM    = 156,\n\tbiRoofedForestM        = 157,\n\tbiColdTaigaM           = 158,\n\tbiMegaSpruceTaiga      = 160,\n\tbiMegaSpruceTaigaHills = 161,\n\tbiExtremeHillsPlusM    = 162,\n\tbiSavannaM             = 163,\n\tbiSavannaPlateauM      = 164,\n\tbiMesaBryce            = 165,\n\tbiMesaPlateauFM        = 166,\n\tbiMesaPlateauM         = 167,\n\t// Automatically capture the maximum consecutive biome value into biVarientMaxBiome:\n\tbiNumVariantBiomes,  // True number of biomes, since they are zero-based\n\tbiMaxVariantBiome = biNumVariantBiomes - 1,  // The maximum biome value\n} ;\n\n// tolua_end\n\n\n\n\n\n/** Hash for EMCSBiome, so that it can be used in std::unordered_map etc. */\nstruct BiomeHasher\n{\npublic:\n\tstd::size_t operator() (const EMCSBiome a_Biome) const\n\t{\n\t\treturn static_cast<std::size_t>(a_Biome);\n\t}\n};\n\n\n\n\n\n// tolua_begin\n\n/** Translates a biome string to biome enum. Takes either a number or a biome alias (built-in). Returns biInvalidBiome on failure. */\nextern EMCSBiome StringToBiome(const AString & a_BiomeString);\n\n/** Translates biome enum into biome string. Returns empty string on failure (unknown biome). */\nextern AString BiomeToString(int a_Biome);\n\n/** Returns true if the biome has no downfall - deserts and savannas */\nextern bool IsBiomeNoDownfall(EMCSBiome a_Biome);\n\n/** Returns true if the biome is an ocean biome. */\ninline bool IsBiomeOcean(int a_Biome)\n{\n\treturn ((a_Biome == biOcean) || (a_Biome == biDeepOcean));\n}\n\n/** Returns true if the biome is very cold\n(has snow on ground everywhere, turns top water to ice, has snowfall instead of rain everywhere).\nDoesn't report mildly cold biomes (where it snows above certain elevation), use IsBiomeCold() for those. */\nextern bool IsBiomeVeryCold(EMCSBiome a_Biome);\n\n/** Returns true if the biome is cold\n(has snow and snowfall at higher elevations but not at regular heights).\nDoesn't report Very Cold biomes, use IsBiomeVeryCold() for those. */\nextern bool IsBiomeCold(EMCSBiome a_Biome);\n\n/** Returns true if the biome is mountainous (mutations of the extreme hills biome) */\nextern bool IsBiomeMountain(EMCSBiome a_Biome);\n\n/** Returns true if the biome is Mesa or one of its mutations. */\nextern bool IsBiomeMesa(EMCSBiome a_Biome);\n\n/** Returns the height when a biome when a biome starts snowing. */\nextern int GetSnowStartHeight(EMCSBiome a_Biome);\n\n// tolua_end\n"
  },
  {
    "path": "src/BlockArea.cpp",
    "content": "\n// BlockArea.cpp\n\n// NOTE: compile.sh checks for this file in order to determine if this is the Cuberite folder.\n// Please modify compile.sh if you want to rename or remove this file.\n// This file was chosen arbitrarily and it's a good enough indicator we're in the Cuberite folder.\n\n// Implements the cBlockArea object representing an area of block data that can be queried from cWorld and then accessed again without further queries\n// The object also supports writing the blockdata back into cWorld, even into other coords\n\n#include \"Globals.h\"\n#include \"BlockArea.h\"\n#include \"OSSupport/GZipFile.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"ChunkData.h\"\n#include \"BlockEntities/BlockEntity.h\"\n#include \"Item.h\"\n#include \"BlockInfo.h\"\n\n\n\n\n\n// Disable MSVC warnings: \"conditional expression is constant\"\n#ifdef _MSC_VER\n\t#pragma warning(push)\n\t#pragma warning(disable:4127)\n#endif\n\n\n\n\n\ntypedef void (CombinatorFunc)(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta);\n\n/** Merges two blocktypes and blockmetas of the specified sizes and offsets using the specified combinator function\nThis wild construct allows us to pass a function argument and still have it inlined by the compiler. */\ntemplate <bool MetasValid, CombinatorFunc Combinator>\nvoid InternalMergeBlocks(\n\tBLOCKTYPE * a_DstTypes, const BLOCKTYPE * a_SrcTypes,\n\tNIBBLETYPE * a_DstMetas, const NIBBLETYPE * a_SrcMetas,\n\tint a_SizeX, int a_SizeY, int a_SizeZ,\n\tint a_SrcOffX, int a_SrcOffY, int a_SrcOffZ,\n\tint a_DstOffX, int a_DstOffY, int a_DstOffZ,\n\tint a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ,\n\tint a_DstSizeX, int a_DstSizeY, int a_DstSizeZ\n)\n{\n\tUNUSED(a_SrcSizeY);\n\tUNUSED(a_DstSizeY);\n\tfor (int y = 0; y < a_SizeY; y++)\n\t{\n\t\tint SrcBaseY = (y + a_SrcOffY) * a_SrcSizeX * a_SrcSizeZ;\n\t\tint DstBaseY = (y + a_DstOffY) * a_DstSizeX * a_DstSizeZ;\n\t\tfor (int z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tint SrcBaseZ = SrcBaseY + (z + a_SrcOffZ) * a_SrcSizeX;\n\t\t\tint DstBaseZ = DstBaseY + (z + a_DstOffZ) * a_DstSizeX;\n\t\t\tint SrcIdx = SrcBaseZ + a_SrcOffX;\n\t\t\tint DstIdx = DstBaseZ + a_DstOffX;\n\t\t\tfor (int x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tif (MetasValid)\n\t\t\t\t{\n\t\t\t\t\tCombinator(a_DstTypes[DstIdx], a_SrcTypes[SrcIdx], a_DstMetas[DstIdx], a_SrcMetas[SrcIdx]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tNIBBLETYPE FakeDestMeta = 0;\n\t\t\t\t\tCombinator(a_DstTypes[DstIdx], a_SrcTypes[SrcIdx], FakeDestMeta, static_cast<NIBBLETYPE>(0));\n\t\t\t\t}\n\t\t\t\t++DstIdx;\n\t\t\t\t++SrcIdx;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n}\n\n\n\n\n\n/** Combinator used for cBlockArea::msOverwrite merging */\ntemplate <bool MetaValid>\nvoid MergeCombinatorOverwrite(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)\n{\n\ta_DstType = a_SrcType;\n\tif (MetaValid)\n\t{\n\t\ta_DstMeta = a_SrcMeta;\n\t}\n}\n\n\n\n\n\n/** Combinator used for cBlockArea::msFillAir merging */\ntemplate <bool MetaValid>\nvoid MergeCombinatorFillAir(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)\n{\n\tif (a_DstType == E_BLOCK_AIR)\n\t{\n\t\ta_DstType = a_SrcType;\n\t\tif (MetaValid)\n\t\t{\n\t\t\ta_DstMeta = a_SrcMeta;\n\t\t}\n\t}\n\t// \"else\" is the default, already in place\n}\n\n\n\n\n\n/** Combinator used for cBlockArea::msImprint merging */\ntemplate <bool MetaValid>\nvoid MergeCombinatorImprint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)\n{\n\tif (a_SrcType != E_BLOCK_AIR)\n\t{\n\t\ta_DstType = a_SrcType;\n\t\tif (MetaValid)\n\t\t{\n\t\t\ta_DstMeta = a_SrcMeta;\n\t\t}\n\t}\n\t// \"else\" is the default, already in place\n}\n\n\n\n\n\n/** Combinator used for cBlockArea::msLake merging */\ntemplate <bool MetaValid>\nvoid MergeCombinatorLake(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)\n{\n\t// Sponge is the NOP block\n\tif (a_SrcType == E_BLOCK_SPONGE)\n\t{\n\t\treturn;\n\t}\n\n\t// Air is always hollowed out\n\tif (a_SrcType == E_BLOCK_AIR)\n\t{\n\t\ta_DstType = E_BLOCK_AIR;\n\t\tif (MetaValid)\n\t\t{\n\t\t\ta_DstMeta = 0;\n\t\t}\n\t\treturn;\n\t}\n\n\t// Water and lava are never overwritten\n\tswitch (a_DstType)\n\t{\n\t\tcase E_BLOCK_WATER:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Water and lava always overwrite\n\tswitch (a_SrcType)\n\t{\n\t\tcase E_BLOCK_WATER:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t{\n\t\t\ta_DstType = a_SrcType;\n\t\t\tif (MetaValid)\n\t\t\t{\n\t\t\t\ta_DstMeta = a_SrcMeta;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (a_SrcType == E_BLOCK_STONE)\n\t{\n\t\tswitch (a_DstType)\n\t\t{\n\t\t\tcase E_BLOCK_DIRT:\n\t\t\tcase E_BLOCK_GRASS:\n\t\t\tcase E_BLOCK_MYCELIUM:\n\t\t\t{\n\t\t\t\ta_DstType = E_BLOCK_STONE;\n\t\t\t\tif (MetaValid)\n\t\t\t\t{\n\t\t\t\t\ta_DstMeta = 0;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\t// Everything else is left as it is\n}\n\n\n\n\n\n/** Combinator used for cBlockArea::msSpongePrint merging */\ntemplate <bool MetaValid>\nvoid MergeCombinatorSpongePrint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)\n{\n\t// Sponge overwrites nothing, everything else overwrites anything\n\tif (a_SrcType != E_BLOCK_SPONGE)\n\t{\n\t\ta_DstType = a_SrcType;\n\t\tif (MetaValid)\n\t\t{\n\t\t\ta_DstMeta = a_SrcMeta;\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Combinator used for cBlockArea::msDifference merging */\ntemplate <bool MetaValid>\nvoid MergeCombinatorDifference(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)\n{\n\tif ((a_DstType == a_SrcType) && (!MetaValid || (a_DstMeta == a_SrcMeta)))\n\t{\n\t\ta_DstType = E_BLOCK_AIR;\n\t\tif (MetaValid)\n\t\t{\n\t\t\ta_DstMeta = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\ta_DstType = a_SrcType;\n\t\tif (MetaValid)\n\t\t{\n\t\t\ta_DstMeta = a_SrcMeta;\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Combinator used for cBlockArea::msSimpleCompare merging */\ntemplate <bool MetaValid>\nvoid MergeCombinatorSimpleCompare(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)\n{\n\tif ((a_DstType == a_SrcType) && (!MetaValid || (a_DstMeta == a_SrcMeta)))\n\t{\n\t\t// The blocktypes are the same, and the blockmetas are not present or are the same\n\t\ta_DstType = E_BLOCK_AIR;\n\t}\n\telse\n\t{\n\t\t// The blocktypes or blockmetas differ\n\t\ta_DstType = E_BLOCK_STONE;\n\t}\n}\n\n\n\n\n\n/** Combinator used for cBlockArea::msMask merging */\ntemplate <bool MetaValid>\nvoid MergeCombinatorMask(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)\n{\n\t// If the blocks are the same, keep the dest; otherwise replace with air\n\tif ((a_SrcType != a_DstType) || !MetaValid || (a_SrcMeta != a_DstMeta))\n\t{\n\t\ta_DstType = E_BLOCK_AIR;\n\t\tif (MetaValid)\n\t\t{\n\t\t\ta_DstMeta = 0;\n\t\t}\n\t}\n}\n\n// Re-enable previously disabled MSVC warnings\n#ifdef _MSC_VER\n\t#pragma warning(pop)\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBlockArea:\n\ncBlockArea::cBlockArea(void) = default;\n\nbool cBlockArea::IsValidDataTypeCombination(int a_DataTypes)\n{\n\t// BlockEntities require that BlockTypes be present, too\n\tif ((a_DataTypes & baBlockEntities) != 0)\n\t{\n\t\tif ((a_DataTypes & baTypes) == 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// All other combinations are considered valid\n\treturn true;\n}\n\n\n\n\n\nvoid cBlockArea::Clear(void)\n{\n\tm_BlockTypes.reset();\n\tm_BlockMetas.reset();\n\tm_BlockLight.reset();\n\tm_BlockSkyLight.reset();\n\tm_BlockEntities.reset();\n\tm_Origin.Set(0, 0, 0);\n\tm_Size.Set(0, 0, 0);\n}\n\n\n\n\n\nvoid cBlockArea::Create(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes)\n{\n\tASSERT(a_SizeX > 0);\n\tASSERT(a_SizeY > 0);\n\tASSERT(a_SizeZ > 0);\n\tASSERT(IsValidDataTypeCombination(a_DataTypes));\n\n\t// Warn if the height is too much, but proceed with the creation:\n\tif (a_SizeY > cChunkDef::Height)\n\t{\n\t\tLOGWARNING(\"Creating a cBlockArea with height larger than world height (%d). Continuing, but the area may misbehave.\", a_SizeY);\n\t}\n\n\tClear();\n\tSetSize(a_SizeX, a_SizeY, a_SizeZ, a_DataTypes);\n\tFill(a_DataTypes, E_BLOCK_AIR);\n}\n\n\n\n\n\nvoid cBlockArea::Create(const Vector3i & a_Size, int a_DataTypes)\n{\n\tCreate(a_Size.x, a_Size.y, a_Size.z, a_DataTypes);\n}\n\n\n\n\n\nvoid cBlockArea::SetWEOffset(int a_OffsetX, int a_OffsetY, int a_OffsetZ)\n{\n\tm_WEOffset.Set(a_OffsetX, a_OffsetY, a_OffsetZ);\n}\n\n\n\n\n\nvoid cBlockArea::SetWEOffset(const Vector3i & a_Offset)\n{\n\tm_WEOffset.Set(a_Offset.x, a_Offset.y, a_Offset.z);\n}\n\n\n\n\n\nvoid cBlockArea::SetOrigin(int a_OriginX, int a_OriginY, int a_OriginZ)\n{\n\tm_Origin.Set(a_OriginX, a_OriginY, a_OriginZ);\n}\n\n\n\n\n\nvoid cBlockArea::SetOrigin(const Vector3i & a_Origin)\n{\n\tm_Origin.Set(a_Origin.x, a_Origin.y, a_Origin.z);\n}\n\n\n\n\n\nbool cBlockArea::IsValidRelCoords(int a_RelX, int a_RelY, int a_RelZ) const\n{\n\treturn (\n\t\t(a_RelX >= 0) && (a_RelX < m_Size.x) &&\n\t\t(a_RelY >= 0) && (a_RelY < m_Size.y) &&\n\t\t(a_RelZ >= 0) && (a_RelZ < m_Size.z)\n\t);\n}\n\n\n\n\n\nbool cBlockArea::IsValidRelCoords(const Vector3i & a_RelCoords) const\n{\n\treturn IsValidRelCoords(a_RelCoords.x, a_RelCoords.y, a_RelCoords.z);\n}\n\n\n\n\n\nbool cBlockArea::IsValidCoords(int a_BlockX, int a_BlockY, int a_BlockZ) const\n{\n\treturn IsValidRelCoords(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z);\n}\n\n\n\n\n\nbool cBlockArea::IsValidCoords(const Vector3i & a_Coords) const\n{\n\treturn IsValidRelCoords(a_Coords - m_Origin);\n}\n\n\n\n\n\nbool cBlockArea::Read(cForEachChunkProvider & a_ForEachChunkProvider, int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ, int a_DataTypes)\n{\n\tASSERT(IsValidDataTypeCombination(a_DataTypes));\n\tASSERT(cChunkDef::IsValidHeight({a_MinBlockX, a_MinBlockY, a_MinBlockZ}));\n\tASSERT(cChunkDef::IsValidHeight({a_MaxBlockX, a_MaxBlockY, a_MaxBlockZ}));\n\tASSERT(a_MinBlockX <= a_MaxBlockX);\n\tASSERT(a_MinBlockY <= a_MaxBlockY);\n\tASSERT(a_MinBlockZ <= a_MaxBlockZ);\n\n\t// Include the Max coords:\n\ta_MaxBlockX += 1;\n\ta_MaxBlockY += 1;\n\ta_MaxBlockZ += 1;\n\n\t// Allocate the needed memory:\n\tClear();\n\tif (!SetSize(a_MaxBlockX - a_MinBlockX, a_MaxBlockY - a_MinBlockY, a_MaxBlockZ - a_MinBlockZ, a_DataTypes))\n\t{\n\t\treturn false;\n\t}\n\tm_Origin.Set(a_MinBlockX, a_MinBlockY, a_MinBlockZ);\n\tcChunkReader Reader(*this);\n\n\t// Convert block coords to chunks coords:\n\tint MinChunkX, MaxChunkX;\n\tint MinChunkZ, MaxChunkZ;\n\tcChunkDef::AbsoluteToRelative(a_MinBlockX, a_MinBlockY, a_MinBlockZ, MinChunkX, MinChunkZ);\n\tcChunkDef::AbsoluteToRelative(a_MaxBlockX, a_MaxBlockY, a_MaxBlockZ, MaxChunkX, MaxChunkZ);\n\n\t// Query block data:\n\tif (!a_ForEachChunkProvider.ForEachChunkInRect(MinChunkX, MaxChunkX, MinChunkZ, MaxChunkZ, Reader))\n\t{\n\t\tClear();\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cBlockArea::Read(cForEachChunkProvider & a_ForEachChunkProvider, const cCuboid & a_Bounds, int a_DataTypes)\n{\n\treturn Read(\n\t\ta_ForEachChunkProvider,\n\t\ta_Bounds.p1.x, a_Bounds.p2.x,\n\t\ta_Bounds.p1.y, a_Bounds.p2.y,\n\t\ta_Bounds.p1.z, a_Bounds.p2.z,\n\t\ta_DataTypes\n\t);\n}\n\n\n\n\n\nbool cBlockArea::Read(cForEachChunkProvider & a_ForEachChunkProvider, const Vector3i & a_Point1, const Vector3i & a_Point2, int a_DataTypes)\n{\n\treturn Read(\n\t\ta_ForEachChunkProvider,\n\t\ta_Point1.x, a_Point2.x,\n\t\ta_Point1.y, a_Point2.y,\n\t\ta_Point1.z, a_Point2.z,\n\t\ta_DataTypes\n\t);\n}\n\n\n\n\n\nbool cBlockArea::Write(cForEachChunkProvider & a_ForEachChunkProvider, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)\n{\n\tASSERT((a_DataTypes & GetDataTypes()) == a_DataTypes);  // Are you requesting only the data that I have?\n\tASSERT(cChunkDef::IsValidHeight({a_MinBlockX, a_MinBlockY, a_MinBlockZ}));\n\tASSERT(cChunkDef::IsValidHeight({a_MinBlockX, a_MinBlockY + m_Size.y - 1, a_MinBlockZ}));\n\n\treturn a_ForEachChunkProvider.WriteBlockArea(*this, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes);\n}\n\n\n\n\n\nbool cBlockArea::Write(cForEachChunkProvider & a_ForEachChunkProvider, const Vector3i & a_MinCoords, int a_DataTypes)\n{\n\treturn Write(\n\t\ta_ForEachChunkProvider,\n\t\ta_MinCoords.x, a_MinCoords.y, a_MinCoords.z,\n\t\ta_DataTypes\n\t);\n}\n\n\n\n\n\nvoid cBlockArea::CopyTo(cBlockArea & a_Into) const\n{\n\tif (&a_Into == this)\n\t{\n\t\tLOGWARNING(\"Trying to copy a cBlockArea into self, ignoring.\");\n\t\treturn;\n\t}\n\n\ta_Into.Clear();\n\ta_Into.SetSize(m_Size.x, m_Size.y, m_Size.z, GetDataTypes());\n\ta_Into.m_Origin = m_Origin;\n\tsize_t BlockCount = GetBlockCount();\n\tif (HasBlockTypes())\n\t{\n\t\tmemcpy(a_Into.GetBlockTypes(), GetBlockTypes(), BlockCount * sizeof(BLOCKTYPE));\n\t}\n\tif (HasBlockMetas())\n\t{\n\t\tmemcpy(a_Into.GetBlockMetas(), GetBlockMetas(), BlockCount * sizeof(NIBBLETYPE));\n\t}\n\tif (HasBlockLights())\n\t{\n\t\tmemcpy(a_Into.GetBlockLight(), GetBlockLight(), BlockCount * sizeof(NIBBLETYPE));\n\t}\n\tif (HasBlockSkyLights())\n\t{\n\t\tmemcpy(a_Into.GetBlockSkyLight(), GetBlockSkyLight(), BlockCount * sizeof(NIBBLETYPE));\n\t}\n\tif (HasBlockEntities())\n\t{\n\t\ta_Into.m_BlockEntities->clear();\n\t\tfor (const auto & keyPair: *m_BlockEntities)\n\t\t{\n\t\t\tconst auto & pos = keyPair.second->GetPos();\n\t\t\ta_Into.m_BlockEntities->emplace(keyPair.first, keyPair.second->Clone(pos));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::CopyFrom(const cBlockArea & a_From)\n{\n\ta_From.CopyTo(*this);\n}\n\n\n\n\n\nvoid cBlockArea::DumpToRawFile(const AString & a_FileName)\n{\n\tcFile f;\n\tif (!f.Open(a_FileName, cFile::fmWrite))\n\t{\n\t\tLOGWARNING(\"cBlockArea: Cannot open file \\\"%s\\\" for raw dump\", a_FileName.c_str());\n\t\treturn;\n\t}\n\tUInt32 SizeX = ntohl(static_cast<UInt32>(m_Size.x));\n\tUInt32 SizeY = ntohl(static_cast<UInt32>(m_Size.y));\n\tUInt32 SizeZ = ntohl(static_cast<UInt32>(m_Size.z));\n\tf.Write(&SizeX, 4);\n\tf.Write(&SizeY, 4);\n\tf.Write(&SizeZ, 4);\n\tunsigned char DataTypes = static_cast<unsigned char>(GetDataTypes());\n\tf.Write(&DataTypes, 1);\n\tsize_t NumBlocks = GetBlockCount();\n\tif (HasBlockTypes())\n\t{\n\t\tf.Write(GetBlockTypes(), NumBlocks * sizeof(BLOCKTYPE));\n\t}\n\tif (HasBlockMetas())\n\t{\n\t\tf.Write(GetBlockMetas(), NumBlocks);\n\t}\n\tif (HasBlockLights())\n\t{\n\t\tf.Write(GetBlockLight(), NumBlocks);\n\t}\n\tif (HasBlockSkyLights())\n\t{\n\t\tf.Write(GetBlockSkyLight(), NumBlocks);\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::Crop(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ)\n{\n\tif (\n\t\t(a_AddMinX + a_SubMaxX >= m_Size.x) ||\n\t\t(a_AddMinY + a_SubMaxY >= m_Size.y) ||\n\t\t(a_AddMinZ + a_SubMaxZ >= m_Size.z)\n\t)\n\t{\n\t\tLOGWARNING(\"cBlockArea:Crop called with more croping than the dimensions: %d x %d x %d with cropping %d, %d and %d\",\n\t\t\tm_Size.x, m_Size.y, m_Size.z,\n\t\t\ta_AddMinX + a_SubMaxX, a_AddMinY + a_SubMaxY, a_AddMinZ + a_SubMaxZ\n\t\t);\n\t\treturn;\n\t}\n\n\tif (HasBlockTypes())\n\t{\n\t\tCropBlockTypes(a_AddMinX, a_SubMaxX, a_AddMinY, a_SubMaxY, a_AddMinZ, a_SubMaxZ);\n\t}\n\tif (HasBlockMetas())\n\t{\n\t\tCropNibbles(m_BlockMetas, a_AddMinX, a_SubMaxX, a_AddMinY, a_SubMaxY, a_AddMinZ, a_SubMaxZ);\n\t}\n\tif (HasBlockLights())\n\t{\n\t\tCropNibbles(m_BlockLight, a_AddMinX, a_SubMaxX, a_AddMinY, a_SubMaxY, a_AddMinZ, a_SubMaxZ);\n\t}\n\tif (HasBlockSkyLights())\n\t{\n\t\tCropNibbles(m_BlockSkyLight, a_AddMinX, a_SubMaxX, a_AddMinY, a_SubMaxY, a_AddMinZ, a_SubMaxZ);\n\t}\n\tif (HasBlockEntities())\n\t{\n\t\tconst Vector3i AddMin{ a_AddMinX, a_AddMinY, a_AddMinZ };\n\t\tconst cCuboid CropBox{ AddMin, m_Size - Vector3i{a_SubMaxX, a_SubMaxY, a_SubMaxZ} };\n\n\t\t// Move and crop block Entities:\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto Pos = be->GetPos();\n\t\t\tif (CropBox.IsInside(Pos))\n\t\t\t{\n\t\t\t\t// The block entity is within the new coords, recalculate its coords to match the new area:\n\t\t\t\tPos -= AddMin;\n\t\t\t\tbe->SetPos(Pos);\n\t\t\t\tm_BlockEntities->emplace(MakeIndex(Pos.x, Pos.y, Pos.z), std::move(be));\n\t\t\t}\n\t\t}\n\t}\n\n\tm_Origin.Move(a_AddMinX, a_AddMinY, a_AddMinZ);\n\tm_Size.x -= a_AddMinX + a_SubMaxX;\n\tm_Size.y -= a_AddMinY + a_SubMaxY;\n\tm_Size.z -= a_AddMinZ + a_SubMaxZ;\n}\n\n\n\n\n\nvoid cBlockArea::Expand(int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ)\n{\n\tif (HasBlockTypes())\n\t{\n\t\tExpandBlockTypes(a_SubMinX, a_AddMaxX, a_SubMinY, a_AddMaxY, a_SubMinZ, a_AddMaxZ);\n\t}\n\tif (HasBlockMetas())\n\t{\n\t\tExpandNibbles(m_BlockMetas, a_SubMinX, a_AddMaxX, a_SubMinY, a_AddMaxY, a_SubMinZ, a_AddMaxZ);\n\t}\n\tif (HasBlockLights())\n\t{\n\t\tExpandNibbles(m_BlockLight, a_SubMinX, a_AddMaxX, a_SubMinY, a_AddMaxY, a_SubMinZ, a_AddMaxZ);\n\t}\n\tif (HasBlockSkyLights())\n\t{\n\t\tExpandNibbles(m_BlockSkyLight, a_SubMinX, a_AddMaxX, a_SubMinY, a_AddMaxY, a_SubMinZ, a_AddMaxZ);\n\t}\n\tif (HasBlockEntities())\n\t{\n\t\t// Move block entities:\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto posX = be->GetPosX() + a_SubMinX;\n\t\t\tauto posY = be->GetPosY() + a_SubMinY;\n\t\t\tauto posZ = be->GetPosZ() + a_SubMinZ;\n\t\t\tbe->SetPos({posX, posY, posZ});\n\t\t\tm_BlockEntities->emplace(MakeIndex(posX, posY, posZ), std::move(be));\n\t\t}\n\t}\n\n\tm_Origin.Move(-a_SubMinX, -a_SubMinY, -a_SubMinZ);\n\tm_Size.x += a_SubMinX + a_AddMaxX;\n\tm_Size.y += a_SubMinY + a_AddMaxY;\n\tm_Size.z += a_SubMinZ + a_AddMaxZ;\n}\n\n\n\n\n\nvoid cBlockArea::Merge(const cBlockArea & a_Src, int a_RelX, int a_RelY, int a_RelZ, eMergeStrategy a_Strategy)\n{\n\n\tconst NIBBLETYPE * SrcMetas = a_Src.GetBlockMetas();\n\tNIBBLETYPE * DstMetas = GetBlockMetas();\n\n\tbool IsDummyMetas = ((SrcMetas == nullptr) || (DstMetas == nullptr));\n\n\tif (IsDummyMetas)\n\t{\n\t\tMergeByStrategy<false>(a_Src, a_RelX, a_RelY, a_RelZ, a_Strategy, SrcMetas, DstMetas);\n\t}\n\telse\n\t{\n\t\tMergeByStrategy<true>(a_Src, a_RelX, a_RelY, a_RelZ, a_Strategy, SrcMetas, DstMetas);\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::Merge(const cBlockArea & a_Src, const Vector3i & a_RelMinCoords, eMergeStrategy a_Strategy)\n{\n\tMerge(a_Src, a_RelMinCoords.x, a_RelMinCoords.y, a_RelMinCoords.z, a_Strategy);\n}\n\n\n\n\n\nvoid cBlockArea::Fill(int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, NIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight)\n{\n\tif ((a_DataTypes & GetDataTypes()) != a_DataTypes)\n\t{\n\t\tLOGWARNING(\"%s: requested datatypes that are not present in the BlockArea object, trimming those away (req 0x%x, stor 0x%x)\",\n\t\t\t__FUNCTION__, a_DataTypes, GetDataTypes()\n\t\t);\n\t\ta_DataTypes = a_DataTypes & GetDataTypes();\n\t}\n\n\tsize_t BlockCount = GetBlockCount();\n\tif ((a_DataTypes & baTypes) != 0)\n\t{\n\t\tfor (size_t i = 0; i < BlockCount; i++)\n\t\t{\n\t\t\tm_BlockTypes[i] = a_BlockType;\n\t\t}\n\t}\n\tif ((a_DataTypes & baMetas) != 0)\n\t{\n\t\tfor (size_t i = 0; i < BlockCount; i++)\n\t\t{\n\t\t\tm_BlockMetas[i] = a_BlockMeta;\n\t\t}\n\t}\n\tif ((a_DataTypes & baLight) != 0)\n\t{\n\t\tfor (size_t i = 0; i < BlockCount; i++)\n\t\t{\n\t\t\tm_BlockLight[i] = a_BlockLight;\n\t\t}\n\t}\n\tif ((a_DataTypes & baSkyLight) != 0)\n\t{\n\t\tfor (size_t i = 0; i < BlockCount; i++)\n\t\t{\n\t\t\tm_BlockSkyLight[i] = a_BlockSkyLight;\n\t\t}\n\t}\n\n\t// If the area contains block entities, remove those not matching and replace with whatever block entity block was filled\n\tif (HasBlockEntities() && ((a_DataTypes & baTypes) != 0))\n\t{\n\t\tif (cBlockEntity::IsBlockEntityBlockType(a_BlockType))\n\t\t{\n\t\t\tRescanBlockEntities();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_BlockEntities->clear();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::FillRelCuboid(int a_MinRelX, int a_MaxRelX, int a_MinRelY, int a_MaxRelY, int a_MinRelZ, int a_MaxRelZ,\n\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\tNIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight\n)\n{\n\tif ((a_DataTypes & GetDataTypes()) != a_DataTypes)\n\t{\n\t\tLOGWARNING(\"%s: requested datatypes that are not present in the BlockArea object, trimming those away (req 0x%x, stor 0x%x)\",\n\t\t\t__FUNCTION__, a_DataTypes, GetDataTypes()\n\t\t);\n\t\ta_DataTypes = a_DataTypes & GetDataTypes();\n\t}\n\n\tif ((a_DataTypes & baTypes) != 0)\n\t{\n\t\tfor (int y = a_MinRelY; y <= a_MaxRelY; y++) for (int z = a_MinRelZ; z <= a_MaxRelZ; z++) for (int x = a_MinRelX; x <= a_MaxRelX; x++)\n\t\t{\n\t\t\tm_BlockTypes[MakeIndex(x, y, z)] = a_BlockType;\n\t\t}  // for x, z, y\n\t}\n\tif ((a_DataTypes & baMetas) != 0)\n\t{\n\t\tfor (int y = a_MinRelY; y <= a_MaxRelY; y++) for (int z = a_MinRelZ; z <= a_MaxRelZ; z++) for (int x = a_MinRelX; x <= a_MaxRelX; x++)\n\t\t{\n\t\t\tm_BlockMetas[MakeIndex(x, y, z)] = a_BlockMeta;\n\t\t}  // for x, z, y\n\t}\n\tif ((a_DataTypes & baLight) != 0)\n\t{\n\t\tfor (int y = a_MinRelY; y <= a_MaxRelY; y++) for (int z = a_MinRelZ; z <= a_MaxRelZ; z++) for (int x = a_MinRelX; x <= a_MaxRelX; x++)\n\t\t{\n\t\t\tm_BlockLight[MakeIndex(x, y, z)] = a_BlockLight;\n\t\t}  // for x, z, y\n\t}\n\tif ((a_DataTypes & baSkyLight) != 0)\n\t{\n\t\tfor (int y = a_MinRelY; y <= a_MaxRelY; y++) for (int z = a_MinRelZ; z <= a_MaxRelZ; z++) for (int x = a_MinRelX; x <= a_MaxRelX; x++)\n\t\t{\n\t\t\tm_BlockSkyLight[MakeIndex(x, y, z)] = a_BlockSkyLight;\n\t\t}  // for x, z, y\n\t}\n\n\t// If the area contains block entities, remove those in the affected cuboid and replace with whatever block entity block was filled:\n\tif (HasBlockEntities() && ((a_DataTypes & baTypes) != 0))\n\t{\n\t\tif (cBlockEntity::IsBlockEntityBlockType(a_BlockType))\n\t\t{\n\t\t\tRescanBlockEntities();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_BlockEntities->clear();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::FillRelCuboid(const cCuboid & a_RelCuboid,\n\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\tNIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight\n)\n{\n\tFillRelCuboid(\n\t\ta_RelCuboid.p1.x, a_RelCuboid.p2.x,\n\t\ta_RelCuboid.p1.y, a_RelCuboid.p2.y,\n\t\ta_RelCuboid.p1.z, a_RelCuboid.p2.z,\n\t\ta_DataTypes, a_BlockType, a_BlockMeta, a_BlockLight, a_BlockSkyLight\n\t);\n}\n\n\n\n\n\nvoid cBlockArea::RelLine(int a_RelX1, int a_RelY1, int a_RelZ1, int a_RelX2, int a_RelY2, int a_RelZ2,\n\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\tNIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight\n)\n{\n\t// Bresenham-3D algorithm for drawing lines:\n\tint dx = abs(a_RelX2 - a_RelX1);\n\tint dy = abs(a_RelY2 - a_RelY1);\n\tint dz = abs(a_RelZ2 - a_RelZ1);\n\tint sx = (a_RelX1 < a_RelX2) ? 1 : -1;\n\tint sy = (a_RelY1 < a_RelY2) ? 1 : -1;\n\tint sz = (a_RelZ1 < a_RelZ2) ? 1 : -1;\n\n\tif (dx >= std::max(dy, dz))  // x dominant\n\t{\n\t\tint yd = dy - dx / 2;\n\t\tint zd = dz - dx / 2;\n\n\t\tfor (;;)\n\t\t{\n\t\t\tRelSetData(a_RelX1, a_RelY1, a_RelZ1, a_DataTypes, a_BlockType, a_BlockMeta, a_BlockLight, a_BlockSkyLight);\n\n\t\t\tif (a_RelX1 == a_RelX2)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (yd >= 0)  // move along y\n\t\t\t{\n\t\t\t\ta_RelY1 += sy;\n\t\t\t\tyd -= dx;\n\t\t\t}\n\n\t\t\tif (zd >= 0)  // move along z\n\t\t\t{\n\t\t\t\ta_RelZ1 += sz;\n\t\t\t\tzd -= dx;\n\t\t\t}\n\n\t\t\t// move along x\n\t\t\ta_RelX1  += sx;\n\t\t\tyd += dy;\n\t\t\tzd += dz;\n\t\t}\n\t}\n\telse if (dy >= std::max(dx, dz))  // y dominant\n\t{\n\t\tint xd = dx - dy / 2;\n\t\tint zd = dz - dy / 2;\n\n\t\tfor (;;)\n\t\t{\n\t\t\tRelSetData(a_RelX1, a_RelY1, a_RelZ1, a_DataTypes, a_BlockType, a_BlockMeta, a_BlockLight, a_BlockSkyLight);\n\n\t\t\tif (a_RelY1 == a_RelY2)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (xd >= 0)  // move along x\n\t\t\t{\n\t\t\t\ta_RelX1 += sx;\n\t\t\t\txd -= dy;\n\t\t\t}\n\n\t\t\tif (zd >= 0)  // move along z\n\t\t\t{\n\t\t\t\ta_RelZ1 += sz;\n\t\t\t\tzd -= dy;\n\t\t\t}\n\n\t\t\t// move along y\n\t\t\ta_RelY1 += sy;\n\t\t\txd += dx;\n\t\t\tzd += dz;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// z dominant\n\t\tASSERT(dz >= std::max(dx, dy));\n\t\tint xd = dx - dz / 2;\n\t\tint yd = dy - dz / 2;\n\n\t\tfor (;;)\n\t\t{\n\t\t\tRelSetData(a_RelX1, a_RelY1, a_RelZ1, a_DataTypes, a_BlockType, a_BlockMeta, a_BlockLight, a_BlockSkyLight);\n\n\t\t\tif (a_RelZ1 == a_RelZ2)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (xd >= 0)  // move along x\n\t\t\t{\n\t\t\t\ta_RelX1 += sx;\n\t\t\t\txd -= dz;\n\t\t\t}\n\n\t\t\tif (yd >= 0)  // move along y\n\t\t\t{\n\t\t\t\ta_RelY1 += sy;\n\t\t\t\tyd -= dz;\n\t\t\t}\n\n\t\t\t// move along z\n\t\t\ta_RelZ1 += sz;\n\t\t\txd += dx;\n\t\t\tyd += dy;\n\t\t}\n\t}  // if (which dimension is dominant)\n}\n\n\n\n\n\nvoid cBlockArea::RelLine(const Vector3i & a_Point1, const Vector3i & a_Point2,\n\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\tNIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight\n)\n{\n\tRelLine(\n\t\ta_Point1.x, a_Point1.y, a_Point1.z,\n\t\ta_Point2.x, a_Point2.y, a_Point2.z,\n\t\ta_DataTypes, a_BlockType, a_BlockMeta, a_BlockLight, a_BlockSkyLight\n\t);\n}\n\n\n\n\n\nvoid cBlockArea::RotateCCW(void)\n{\n\tif (!HasBlockTypes())\n\t{\n\t\tLOGWARNING(\"cBlockArea: Cannot rotate blockmeta without blocktypes!\");\n\t\treturn;\n\t}\n\n\tif (!HasBlockMetas())\n\t{\n\t\t// There are no blockmetas to rotate, just use the NoMeta function\n\t\tRotateCCWNoMeta();\n\t\treturn;\n\t}\n\n\t// We are guaranteed that both blocktypes and blockmetas exist; rotate both at the same time:\n\tBLOCKARRAY NewTypes{ new BLOCKTYPE[GetBlockCount()] };\n\tNIBBLEARRAY NewMetas{ new NIBBLETYPE[GetBlockCount()] };\n\tfor (int x = 0; x < m_Size.x; x++)\n\t{\n\t\tint NewZ = m_Size.x - x - 1;\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tint NewX = z;\n\t\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t\t{\n\t\t\t\tauto NewIdx = MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x });\n\t\t\t\tauto OldIdx = MakeIndex(x, y, z);\n\t\t\t\tNewTypes[NewIdx] = m_BlockTypes[OldIdx];\n\t\t\t\tNewMetas[NewIdx] = cBlockHandler::For(m_BlockTypes[OldIdx]).MetaRotateCCW(m_BlockMetas[OldIdx]);\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n\tm_BlockTypes = std::move(NewTypes);\n\tm_BlockMetas = std::move(NewMetas);\n\n\t// Rotate the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = be->GetPosZ();\n\t\t\tauto newY = be->GetPosY();\n\t\t\tauto newZ = m_Size.x - be->GetPosX() - 1;\n\t\t\tauto newIdx = newX + newZ * m_Size.z + newY * m_Size.x * m_Size.z;\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n\n\tstd::swap(m_Size.x, m_Size.z);\n}\n\n\n\n\n\nvoid cBlockArea::RotateCW(void)\n{\n\tif (!HasBlockTypes())\n\t{\n\t\tLOGWARNING(\"cBlockArea: Cannot rotate blockmeta without blocktypes!\");\n\t\treturn;\n\t}\n\n\tif (!HasBlockMetas())\n\t{\n\t\t// There are no blockmetas to rotate, just use the NoMeta function\n\t\tRotateCWNoMeta();\n\t\treturn;\n\t}\n\n\t// We are guaranteed that both blocktypes and blockmetas exist; rotate both at the same time:\n\tBLOCKARRAY NewTypes{ new BLOCKTYPE[GetBlockCount()] };\n\tNIBBLEARRAY NewMetas{ new NIBBLETYPE[GetBlockCount()] };\n\tfor (int x = 0; x < m_Size.x; x++)\n\t{\n\t\tint NewZ = x;\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tint NewX = m_Size.z - z - 1;\n\t\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t\t{\n\t\t\t\tauto NewIdx = MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x });\n\t\t\t\tauto OldIdx = MakeIndex(x, y, z);\n\t\t\t\tNewTypes[NewIdx] = m_BlockTypes[OldIdx];\n\t\t\t\tNewMetas[NewIdx] = cBlockHandler::For(m_BlockTypes[OldIdx]).MetaRotateCW(m_BlockMetas[OldIdx]);\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n\tm_BlockTypes = std::move(NewTypes);\n\tm_BlockMetas = std::move(NewMetas);\n\n\t// Rotate the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = m_Size.z - be->GetPosZ() - 1;\n\t\t\tauto newY = be->GetPosY();\n\t\t\tauto newZ = be->GetPosX();\n\t\t\tauto newIdx = newX + newZ * m_Size.z + newY * m_Size.x * m_Size.z;\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n\n\tstd::swap(m_Size.x, m_Size.z);\n}\n\n\n\n\n\nvoid cBlockArea::MirrorXY(void)\n{\n\tif (!HasBlockTypes())\n\t{\n\t\tLOGWARNING(\"cBlockArea: Cannot mirror meta without blocktypes!\");\n\t\treturn;\n\t}\n\n\tif (!HasBlockMetas())\n\t{\n\t\t// There are no blockmetas to mirror, just use the NoMeta function\n\t\tMirrorXYNoMeta();\n\t\treturn;\n\t}\n\n\t// We are guaranteed that both blocktypes and blockmetas exist; mirror both at the same time:\n\tint HalfZ = m_Size.z / 2;\n\tint MaxZ = m_Size.z - 1;\n\tfor (int y = 0; y < m_Size.y; y++)\n\t{\n\t\tfor (int z = 0; z < HalfZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tauto Idx1 = MakeIndex(x, y, z);\n\t\t\t\tauto Idx2 = MakeIndex(x, y, MaxZ - z);\n\t\t\t\tstd::swap(m_BlockTypes[Idx1], m_BlockTypes[Idx2]);\n\t\t\t\tNIBBLETYPE Meta1 = cBlockHandler::For(m_BlockTypes[Idx2]).MetaMirrorXY(m_BlockMetas[Idx1]);\n\t\t\t\tNIBBLETYPE Meta2 = cBlockHandler::For(m_BlockTypes[Idx1]).MetaMirrorXY(m_BlockMetas[Idx2]);\n\t\t\t\tm_BlockMetas[Idx1] = Meta2;\n\t\t\t\tm_BlockMetas[Idx2] = Meta1;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\n\t// Mirror the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = be->GetPosX();\n\t\t\tauto newY = be->GetPosY();\n\t\t\tauto newZ = MaxZ - be->GetPosZ();\n\t\t\tauto newIdx = MakeIndex(newX, newY, newZ);\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::MirrorXZ(void)\n{\n\tif (!HasBlockTypes())\n\t{\n\t\tLOGWARNING(\"cBlockArea: Cannot mirror meta without blocktypes!\");\n\t\treturn;\n\t}\n\n\tif (!HasBlockMetas())\n\t{\n\t\t// There are no blockmetas to mirror, just use the NoMeta function\n\t\tMirrorXZNoMeta();\n\t\treturn;\n\t}\n\n\t// We are guaranteed that both blocktypes and blockmetas exist; mirror both at the same time:\n\tint HalfY = m_Size.y / 2;\n\tint MaxY = m_Size.y - 1;\n\tfor (int y = 0; y < HalfY; y++)\n\t{\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tauto Idx1 = MakeIndex(x, y, z);\n\t\t\t\tauto Idx2 = MakeIndex(x, MaxY - y, z);\n\t\t\t\tstd::swap(m_BlockTypes[Idx1], m_BlockTypes[Idx2]);\n\t\t\t\tNIBBLETYPE Meta1 = cBlockHandler::For(m_BlockTypes[Idx2]).MetaMirrorXZ(m_BlockMetas[Idx1]);\n\t\t\t\tNIBBLETYPE Meta2 = cBlockHandler::For(m_BlockTypes[Idx1]).MetaMirrorXZ(m_BlockMetas[Idx2]);\n\t\t\t\tm_BlockMetas[Idx1] = Meta2;\n\t\t\t\tm_BlockMetas[Idx2] = Meta1;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\n\t// Mirror the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = be->GetPosX();\n\t\t\tauto newY = MaxY - be->GetPosY();\n\t\t\tauto newZ = be->GetPosZ();\n\t\t\tauto newIdx = MakeIndex(newX, newY, newZ);\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::MirrorYZ(void)\n{\n\tif (!HasBlockTypes())\n\t{\n\t\tLOGWARNING(\"cBlockArea: Cannot mirror meta without blocktypes!\");\n\t\treturn;\n\t}\n\n\tif (!HasBlockMetas())\n\t{\n\t\t// There are no blockmetas to mirror, just use the NoMeta function\n\t\tMirrorYZNoMeta();\n\t\treturn;\n\t}\n\n\t// We are guaranteed that both blocktypes and blockmetas exist; mirror both at the same time:\n\tint HalfX = m_Size.x / 2;\n\tint MaxX = m_Size.x - 1;\n\tfor (int y = 0; y < m_Size.y; y++)\n\t{\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < HalfX; x++)\n\t\t\t{\n\t\t\t\tauto Idx1 = MakeIndex(x, y, z);\n\t\t\t\tauto Idx2 = MakeIndex(MaxX - x, y, z);\n\t\t\t\tstd::swap(m_BlockTypes[Idx1], m_BlockTypes[Idx2]);\n\t\t\t\tNIBBLETYPE Meta1 = cBlockHandler::For(m_BlockTypes[Idx2]).MetaMirrorYZ(m_BlockMetas[Idx1]);\n\t\t\t\tNIBBLETYPE Meta2 = cBlockHandler::For(m_BlockTypes[Idx1]).MetaMirrorYZ(m_BlockMetas[Idx2]);\n\t\t\t\tm_BlockMetas[Idx1] = Meta2;\n\t\t\t\tm_BlockMetas[Idx2] = Meta1;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\n\t// Mirror the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = MaxX - be->GetPosX();\n\t\t\tauto newY = be->GetPosY();\n\t\t\tauto newZ = be->GetPosZ();\n\t\t\tauto newIdx = MakeIndex(newX, newY, newZ);\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::RotateCCWNoMeta(void)\n{\n\tif (HasBlockTypes())\n\t{\n\t\tBLOCKARRAY NewTypes{ new BLOCKTYPE[GetBlockCount()] };\n\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t{\n\t\t\tint NewZ = m_Size.x - x - 1;\n\t\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t\t{\n\t\t\t\tint NewX = z;\n\t\t\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t\t\t{\n\t\t\t\t\tNewTypes[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockTypes[MakeIndex(x, y, z)];\n\t\t\t\t}  // for y\n\t\t\t}  // for z\n\t\t}  // for x\n\t\tm_BlockTypes = std::move(NewTypes);\n\t}\n\tif (HasBlockMetas())\n\t{\n\t\tNIBBLEARRAY NewMetas{ new NIBBLETYPE[GetBlockCount()] };\n\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t{\n\t\t\tint NewZ = m_Size.x - x - 1;\n\t\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t\t{\n\t\t\t\tint NewX = z;\n\t\t\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t\t\t{\n\t\t\t\t\tNewMetas[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockMetas[MakeIndex(x, y, z)];\n\t\t\t\t}  // for y\n\t\t\t}  // for z\n\t\t}  // for x\n\t\tm_BlockMetas = std::move(NewMetas);\n\t}\n\n\t// Rotate the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = be->GetPosZ();\n\t\t\tauto newY = be->GetPosY();\n\t\t\tauto newZ = m_Size.x - be->GetPosX() - 1;\n\t\t\tauto newIdx = newX + newZ * m_Size.z + newY * m_Size.x * m_Size.z;\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n\n\tstd::swap(m_Size.x, m_Size.z);\n}\n\n\n\n\n\nvoid cBlockArea::RotateCWNoMeta(void)\n{\n\tif (HasBlockTypes())\n\t{\n\t\tBLOCKARRAY NewTypes{ new BLOCKTYPE[GetBlockCount()] };\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tint NewX = m_Size.z - z - 1;\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tint NewZ = x;\n\t\t\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t\t\t{\n\t\t\t\t\tNewTypes[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockTypes[MakeIndex(x, y, z)];\n\t\t\t\t}  // for y\n\t\t\t}  // for x\n\t\t}  // for z\n\t\tm_BlockTypes = std::move(NewTypes);\n\t}\n\tif (HasBlockMetas())\n\t{\n\t\tNIBBLEARRAY NewMetas{ new NIBBLETYPE[GetBlockCount()] };\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tint NewX = m_Size.z - z - 1;\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tint NewZ = x;\n\t\t\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t\t\t{\n\t\t\t\t\tNewMetas[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockMetas[MakeIndex(x, y, z)];\n\t\t\t\t}  // for y\n\t\t\t}  // for x\n\t\t}  // for z\n\t\tm_BlockMetas = std::move(NewMetas);\n\t}\n\n\t// Rotate the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = m_Size.z - be->GetPosZ() - 1;\n\t\t\tauto newY = be->GetPosY();\n\t\t\tauto newZ = be->GetPosX();\n\t\t\tauto newIdx = newX + newZ * m_Size.z + newY * m_Size.x * m_Size.z;\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n\n\tstd::swap(m_Size.x, m_Size.z);\n}\n\n\n\n\n\nvoid cBlockArea::MirrorXYNoMeta(void)\n{\n\tint HalfZ = m_Size.z / 2;\n\tint MaxZ = m_Size.z - 1;\n\tif (HasBlockTypes())\n\t{\n\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t{\n\t\t\tfor (int z = 0; z < HalfZ; z++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t\t{\n\t\t\t\t\tstd::swap(m_BlockTypes[MakeIndex(x, y, z)], m_BlockTypes[MakeIndex(x, y, MaxZ - z)]);\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}  // if (HasBlockTypes)\n\n\tif (HasBlockMetas())\n\t{\n\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t{\n\t\t\tfor (int z = 0; z < HalfZ; z++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t\t{\n\t\t\t\t\tstd::swap(m_BlockMetas[MakeIndex(x, y, z)], m_BlockMetas[MakeIndex(x, y, MaxZ - z)]);\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}  // if (HasBlockMetas)\n\n\t// Mirror the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = be->GetPosX();\n\t\t\tauto newY = be->GetPosY();\n\t\t\tauto newZ = MaxZ - be->GetPosZ();\n\t\t\tauto newIdx = MakeIndex(newX, newY, newZ);\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::MirrorXZNoMeta(void)\n{\n\tint HalfY = m_Size.y / 2;\n\tint MaxY = m_Size.y - 1;\n\tif (HasBlockTypes())\n\t{\n\t\tfor (int y = 0; y < HalfY; y++)\n\t\t{\n\t\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t\t{\n\t\t\t\t\tstd::swap(m_BlockTypes[MakeIndex(x, y, z)], m_BlockTypes[MakeIndex(x, MaxY - y, z)]);\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}  // if (HasBlockTypes)\n\n\tif (HasBlockMetas())\n\t{\n\t\tfor (int y = 0; y < HalfY; y++)\n\t\t{\n\t\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t\t{\n\t\t\t\t\tstd::swap(m_BlockMetas[MakeIndex(x, y, z)], m_BlockMetas[MakeIndex(x, MaxY - y, z)]);\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}  // if (HasBlockMetas)\n\n\t// Mirror the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = be->GetPosX();\n\t\t\tauto newY = MaxY - be->GetPosY();\n\t\t\tauto newZ = be->GetPosZ();\n\t\t\tauto newIdx = MakeIndex(newX, newY, newZ);\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::MirrorYZNoMeta(void)\n{\n\tint HalfX = m_Size.x / 2;\n\tint MaxX = m_Size.x - 1;\n\tif (HasBlockTypes())\n\t{\n\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t{\n\t\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < HalfX; x++)\n\t\t\t\t{\n\t\t\t\t\tstd::swap(m_BlockTypes[MakeIndex(x, y, z)], m_BlockTypes[MakeIndex(MaxX - x, y, z)]);\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}  // if (HasBlockTypes)\n\n\tif (HasBlockMetas())\n\t{\n\t\tfor (int y = 0; y < m_Size.y; y++)\n\t\t{\n\t\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < HalfX; x++)\n\t\t\t\t{\n\t\t\t\t\tstd::swap(m_BlockMetas[MakeIndex(x, y, z)], m_BlockMetas[MakeIndex(MaxX - x, y, z)]);\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}  // if (HasBlockMetas)\n\n\t// Mirror the BlockEntities:\n\tif (HasBlockEntities())\n\t{\n\t\tcBlockEntities oldBE;\n\t\tstd::swap(oldBE, *m_BlockEntities);\n\t\tfor (auto & keyPair: oldBE)\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto newX = MaxX - be->GetPosX();\n\t\t\tauto newY = be->GetPosY();\n\t\t\tauto newZ = be->GetPosZ();\n\t\t\tauto newIdx = MakeIndex(newX, newY, newZ);\n\t\t\tbe->SetPos({newX, newY, newZ});\n\t\t\tm_BlockEntities->emplace(newIdx, std::move(be));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::SetRelBlockType(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType)\n{\n\tASSERT(m_BlockTypes != nullptr);\n\tauto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);\n\tm_BlockTypes[idx] = a_BlockType;\n\n\t// Update the block entities, if appropriate:\n\tif (HasBlockEntities())\n\t{\n\t\tauto itr = m_BlockEntities->find(idx);\n\t\tif (itr != m_BlockEntities->end())\n\t\t{\n\t\t\tif (itr->second->GetBlockType() == a_BlockType)\n\t\t\t{\n\t\t\t\t// The block entity is for the same block type, keep the current one\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tm_BlockEntities->erase(itr);\n\t\t}\n\t\tif (cBlockEntity::IsBlockEntityBlockType(a_BlockType))\n\t\t{\n\t\t\tNIBBLETYPE meta = HasBlockMetas() ? m_BlockMetas[idx] : 0;\n\t\t\tm_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(a_BlockType, meta, {a_RelX, a_RelY, a_RelZ}));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::SetBlockType(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType)\n{\n\tSetRelBlockType(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z, a_BlockType);\n}\n\n\n\n\n\nvoid cBlockArea::SetRelBlockMeta(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_BlockMeta)\n{\n\tSetRelNibble(a_RelX, a_RelY, a_RelZ, a_BlockMeta, GetBlockMetas());\n}\n\n\n\n\n\nvoid cBlockArea::SetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockMeta)\n{\n\tSetNibble(a_BlockX, a_BlockY, a_BlockZ, a_BlockMeta, GetBlockMetas());\n}\n\n\n\n\n\nvoid cBlockArea::SetRelBlockLight(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_BlockLight)\n{\n\tSetRelNibble(a_RelX, a_RelY, a_RelZ, a_BlockLight, GetBlockLight());\n}\n\n\n\n\n\nvoid cBlockArea::SetBlockLight(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockLight)\n{\n\tSetNibble(a_BlockX, a_BlockY, a_BlockZ, a_BlockLight, GetBlockLight());\n}\n\n\n\n\n\nvoid cBlockArea::SetRelBlockSkyLight(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_BlockSkyLight)\n{\n\tSetRelNibble(a_RelX, a_RelY, a_RelZ, a_BlockSkyLight, GetBlockSkyLight());\n}\n\n\n\n\n\nvoid cBlockArea::SetBlockSkyLight(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockSkyLight)\n{\n\tSetNibble(a_BlockX, a_BlockY, a_BlockZ, a_BlockSkyLight, GetBlockSkyLight());\n}\n\n\n\n\n\nBLOCKTYPE cBlockArea::GetRelBlockType(int a_RelX, int a_RelY, int a_RelZ) const\n{\n\tif (m_BlockTypes == nullptr)\n\t{\n\t\tLOGWARNING(\"cBlockArea: BlockTypes have not been read!\");\n\t\treturn E_BLOCK_AIR;\n\t}\n\treturn m_BlockTypes[MakeIndex(a_RelX, a_RelY, a_RelZ)];\n}\n\n\n\n\n\nBLOCKTYPE cBlockArea::GetBlockType(int a_BlockX, int a_BlockY, int a_BlockZ) const\n{\n\treturn GetRelBlockType(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z);\n}\n\n\n\n\n\nNIBBLETYPE cBlockArea::GetRelBlockMeta(int a_RelX, int a_RelY, int a_RelZ) const\n{\n\treturn GetRelNibble(a_RelX, a_RelY, a_RelZ, GetBlockMetas());\n}\n\n\n\n\n\nNIBBLETYPE cBlockArea::GetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ) const\n{\n\treturn GetNibble(a_BlockX, a_BlockY, a_BlockZ, GetBlockMetas());\n}\n\n\n\n\n\nNIBBLETYPE cBlockArea::GetRelBlockLight(int a_RelX, int a_RelY, int a_RelZ) const\n{\n\treturn GetRelNibble(a_RelX, a_RelY, a_RelZ, GetBlockLight());\n}\n\n\n\n\n\nNIBBLETYPE cBlockArea::GetBlockLight(int a_BlockX, int a_BlockY, int a_BlockZ) const\n{\n\treturn GetNibble(a_BlockX, a_BlockY, a_BlockZ, GetBlockLight());\n}\n\n\n\n\n\nNIBBLETYPE cBlockArea::GetRelBlockSkyLight(int a_RelX, int a_RelY, int a_RelZ) const\n{\n\treturn GetRelNibble(a_RelX, a_RelY, a_RelZ, GetBlockSkyLight());\n}\n\n\n\n\n\nNIBBLETYPE cBlockArea::GetBlockSkyLight(int a_BlockX, int a_BlockY, int a_BlockZ) const\n{\n\treturn GetNibble(a_BlockX, a_BlockY, a_BlockZ, GetBlockSkyLight());\n}\n\n\n\n\n\nvoid cBlockArea::SetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tSetRelBlockTypeMeta(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nvoid cBlockArea::SetRelBlockTypeMeta(int a_RelX,   int a_RelY,   int a_RelZ,   BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tauto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);\n\tif (m_BlockTypes == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: BlockTypes not available but requested to be written to.\", __FUNCTION__);\n\t}\n\telse\n\t{\n\t\tm_BlockTypes[idx] = a_BlockType;\n\t}\n\tif (m_BlockMetas == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: BlockMetas not available but requested to be written to.\", __FUNCTION__);\n\t}\n\telse\n\t{\n\t\tm_BlockMetas[idx] = a_BlockMeta;\n\t}\n\n\t// Update the block entities, if appropriate:\n\tif (HasBlockEntities())\n\t{\n\t\tauto itr = m_BlockEntities->find(idx);\n\t\tif (itr != m_BlockEntities->end())\n\t\t{\n\t\t\tif (itr->second->GetBlockType() == a_BlockType)\n\t\t\t{\n\t\t\t\t// The block entity is for the same block type, keep the current one\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tm_BlockEntities->erase(itr);\n\t\t}\n\t\tif (cBlockEntity::IsBlockEntityBlockType(a_BlockType))\n\t\t{\n\t\t\tm_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, {a_RelX, a_RelY, a_RelZ}));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::GetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n{\n\treturn GetRelBlockTypeMeta(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nvoid cBlockArea::GetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n{\n\tauto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);\n\tif (m_BlockTypes == nullptr)\n\t{\n\t\tLOGWARNING(\"cBlockArea: BlockTypes have not been read!\");\n\t\ta_BlockType = E_BLOCK_AIR;\n\t}\n\telse\n\t{\n\t\ta_BlockType = m_BlockTypes[idx];\n\t}\n\n\tif (m_BlockMetas == nullptr)\n\t{\n\t\tLOGWARNING(\"cBlockArea: BlockMetas have not been read!\");\n\t\ta_BlockMeta = 0;\n\t}\n\telse\n\t{\n\t\ta_BlockMeta = m_BlockMetas[idx];\n\t}\n}\n\n\n\n\n\ncCuboid cBlockArea::GetBounds(void) const\n{\n\treturn cCuboid(\n\t\tm_Origin,\n\t\tm_Origin + m_Size - Vector3i(1, 1, 1)\n\t);\n}\n\n\n\n\n\nsize_t cBlockArea::CountNonAirBlocks(void) const\n{\n\t// Check if blocktypes are valid:\n\tif (m_BlockTypes == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: BlockTypes have not been read!\", __FUNCTION__);\n\t\treturn 0;\n\t}\n\n\t// Count the blocks:\n\tsize_t res = 0;\n\tfor (int y = 0; y < m_Size.y; y++)\n\t{\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tif (m_BlockTypes[MakeIndex(x, y, z)] != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\t++res;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\treturn res;\n}\n\n\n\n\n\nsize_t cBlockArea::CountSpecificBlocks(BLOCKTYPE a_BlockType) const\n{\n\t// If blocktypes are not valid, log a warning and return zero occurences:\n\tif (m_BlockTypes == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: BlockTypes not available!\", __FUNCTION__);\n\t\treturn 0;\n\t}\n\n\t// Count the blocks:\n\tsize_t num = GetBlockCount();\n\tsize_t res = 0;\n\tfor (size_t i = 0; i < num; i++)\n\t{\n\t\tif (m_BlockTypes[i] == a_BlockType)\n\t\t{\n\t\t\tres++;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n\nsize_t cBlockArea::CountSpecificBlocks(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) const\n{\n\t// If blocktypes are not valid, log a warning and return zero occurences:\n\tif (m_BlockTypes == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: BlockTypes not available!\", __FUNCTION__);\n\t\treturn 0;\n\t}\n\n\t// If blockmetas are not valid, log a warning and count only blocktypes:\n\tif (m_BlockMetas == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: BlockMetas not available, comparing blocktypes only!\", __FUNCTION__);\n\t\treturn CountSpecificBlocks(a_BlockType);\n\t}\n\n\t// Count the blocks:\n\tsize_t num = GetBlockCount();\n\tsize_t res = 0;\n\tfor (size_t i = 0; i < num; i++)\n\t{\n\t\tif ((m_BlockTypes[i] == a_BlockType) && (m_BlockMetas[i] == a_BlockMeta))\n\t\t{\n\t\t\tres++;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n\nvoid cBlockArea::GetNonAirCropRelCoords(int & a_MinRelX, int & a_MinRelY, int & a_MinRelZ, int & a_MaxRelX, int & a_MaxRelY, int & a_MaxRelZ, BLOCKTYPE a_IgnoreBlockType)\n{\n\t// Check if blocktypes are valid:\n\tif (m_BlockTypes == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: BlockTypes have not been read!\", __FUNCTION__);\n\t\ta_MinRelX = 1;\n\t\ta_MaxRelX = 0;\n\t\treturn;\n\t}\n\n\t// Walk all the blocks and find the min and max coords for the non-ignored ones:\n\tint MaxX = 0, MinX = m_Size.x - 1;\n\tint MaxY = 0, MinY = m_Size.y - 1;\n\tint MaxZ = 0, MinZ = m_Size.z - 1;\n\tfor (int y = 0; y < m_Size.y; y++)\n\t{\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tif (m_BlockTypes[MakeIndex(x, y, z)] == a_IgnoreBlockType)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// The block is not ignored, update any coords that need updating:\n\t\t\t\tif (x < MinX)\n\t\t\t\t{\n\t\t\t\t\tMinX = x;\n\t\t\t\t}\n\t\t\t\tif (x > MaxX)\n\t\t\t\t{\n\t\t\t\t\tMaxX = x;\n\t\t\t\t}\n\t\t\t\tif (y < MinY)\n\t\t\t\t{\n\t\t\t\t\tMinY = y;\n\t\t\t\t}\n\t\t\t\tif (y > MaxY)\n\t\t\t\t{\n\t\t\t\t\tMaxY = y;\n\t\t\t\t}\n\t\t\t\tif (z < MinZ)\n\t\t\t\t{\n\t\t\t\t\tMinZ = z;\n\t\t\t\t}\n\t\t\t\tif (z > MaxZ)\n\t\t\t\t{\n\t\t\t\t\tMaxZ = z;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\n\t// Assign to the output:\n\ta_MinRelX = MinX;\n\ta_MinRelY = MinY;\n\ta_MinRelZ = MinZ;\n\ta_MaxRelX = MaxX;\n\ta_MaxRelY = MaxY;\n\ta_MaxRelZ = MaxZ;\n}\n\n\n\n\n\nint cBlockArea::GetDataTypes(void) const\n{\n\tint res = 0;\n\tif (m_BlockTypes != nullptr)\n\t{\n\t\tres |= baTypes;\n\t}\n\tif (m_BlockMetas != nullptr)\n\t{\n\t\tres |= baMetas;\n\t}\n\tif (m_BlockLight != nullptr)\n\t{\n\t\tres |= baLight;\n\t}\n\tif (m_BlockSkyLight != nullptr)\n\t{\n\t\tres |= baSkyLight;\n\t}\n\tif (m_BlockEntities != nullptr)\n\t{\n\t\tres |= baBlockEntities;\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool cBlockArea::SetSize(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes)\n{\n\tASSERT(IsValidDataTypeCombination(a_DataTypes));\n\n\tBLOCKARRAY NewBlocks;\n\tNIBBLEARRAY NewMetas;\n\tNIBBLEARRAY NewLight;\n\tNIBBLEARRAY NewSkyLight;\n\tcBlockEntitiesPtr NewBlockEntities;\n\n\t// Try to allocate the new storage\n\tif ((a_DataTypes & baTypes) != 0)\n\t{\n\t\tNewBlocks.reset(new BLOCKTYPE[ToUnsigned(a_SizeX * a_SizeY * a_SizeZ)]);\n\t\tif (NewBlocks == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\tif ((a_DataTypes & baMetas) != 0)\n\t{\n\t\tNewMetas.reset(new NIBBLETYPE[ToUnsigned(a_SizeX * a_SizeY * a_SizeZ)]);\n\t\tif (NewMetas == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\tif ((a_DataTypes & baLight) != 0)\n\t{\n\t\tNewLight.reset(new NIBBLETYPE[ToUnsigned(a_SizeX * a_SizeY * a_SizeZ)]);\n\t\tif (NewLight == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\tif ((a_DataTypes & baSkyLight) != 0)\n\t{\n\t\tNewSkyLight.reset(new NIBBLETYPE[ToUnsigned(a_SizeX * a_SizeY * a_SizeZ)]);\n\t\tif (NewSkyLight == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\tif ((a_DataTypes & baBlockEntities) != 0)\n\t{\n\t\tNewBlockEntities.reset(new cBlockEntities);\n\t\tif (NewBlockEntities == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Commit changes\n\tm_BlockTypes = std::move(NewBlocks);\n\tm_BlockMetas = std::move(NewMetas);\n\tm_BlockLight = std::move(NewLight);\n\tm_BlockSkyLight = std::move(NewSkyLight);\n\tm_BlockEntities = std::move(NewBlockEntities);\n\tm_Size.Set(a_SizeX, a_SizeY, a_SizeZ);\n\treturn true;\n}\n\n\n\n\n\nsize_t cBlockArea::MakeIndexForSize(Vector3i a_RelPos, Vector3i a_Size)\n{\n\tASSERT(a_RelPos.x >= 0);\n\tASSERT(a_RelPos.x < a_Size.x);\n\tASSERT(a_RelPos.y >= 0);\n\tASSERT(a_RelPos.y < a_Size.y);\n\tASSERT(a_RelPos.z >= 0);\n\tASSERT(a_RelPos.z < a_Size.z);\n\n\treturn static_cast<size_t>(a_RelPos.x + a_RelPos.z * a_Size.x + a_RelPos.y * a_Size.x * a_Size.z);\n}\n\n\n\n\n\nbool cBlockArea::DoWithBlockEntityRelAt(int a_RelX, int a_RelY, int a_RelZ, cBlockEntityCallback a_Callback)\n{\n\tASSERT(IsValidRelCoords(a_RelX, a_RelY, a_RelZ));\n\tif (!HasBlockEntities())\n\t{\n\t\treturn false;\n\t}\n\tauto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);\n\tauto itr = m_BlockEntities->find(idx);\n\tif (itr == m_BlockEntities->end())\n\t{\n\t\treturn false;\n\t}\n\treturn a_Callback(*itr->second);\n}\n\n\n\n\n\nbool cBlockArea::DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBlockEntityCallback a_Callback)\n{\n\treturn DoWithBlockEntityRelAt(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z, a_Callback);\n}\n\n\n\n\n\nbool cBlockArea::ForEachBlockEntity(cBlockEntityCallback a_Callback)\n{\n\tif (!HasBlockEntities())\n\t{\n\t\treturn true;\n\t}\n\tfor (auto & keyPair: *m_BlockEntities)\n\t{\n\t\tif (a_Callback(*keyPair.second))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cBlockArea::SetRelNibble(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_Value, NIBBLETYPE * a_Array)\n{\n\tif (a_Array == nullptr)\n\t{\n\t\tLOGWARNING(\"cBlockArea: datatype has not been read!\");\n\t\treturn;\n\t}\n\ta_Array[MakeIndex(a_RelX, a_RelY, a_RelZ)] = a_Value;\n}\n\n\n\n\n\nvoid cBlockArea::SetNibble(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Value, NIBBLETYPE * a_Array)\n{\n\tSetRelNibble(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z, a_Value, a_Array);\n}\n\n\n\n\n\nNIBBLETYPE cBlockArea::GetRelNibble(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE * a_Array) const\n{\n\tif (a_Array == nullptr)\n\t{\n\t\tLOGWARNING(\"cBlockArea: datatype has not been read!\");\n\t\treturn 16;\n\t}\n\treturn a_Array[MakeIndex(a_RelX, a_RelY, a_RelZ)];\n}\n\n\n\n\n\nNIBBLETYPE cBlockArea::GetNibble(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE * a_Array) const\n{\n\treturn GetRelNibble(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z, a_Array);\n}\n\n\n\n\n\nvoid cBlockArea::CropBlockTypes(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ)\n{\n\tint NewSizeX = GetSizeX() - a_AddMinX - a_SubMaxX;\n\tint NewSizeY = GetSizeY() - a_AddMinY - a_SubMaxY;\n\tint NewSizeZ = GetSizeZ() - a_AddMinZ - a_SubMaxZ;\n\tBLOCKARRAY NewBlockTypes{ new BLOCKTYPE[ToUnsigned(NewSizeX * NewSizeY * NewSizeZ)] };\n\tsize_t idx = 0;\n\tfor (int y = 0; y < NewSizeY; y++)\n\t{\n\t\tfor (int z = 0; z < NewSizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < NewSizeX; x++)\n\t\t\t{\n\t\t\t\tauto OldIndex = MakeIndex(x + a_AddMinX, y + a_AddMinY, z + a_AddMinZ);\n\t\t\t\tNewBlockTypes[idx++] = m_BlockTypes[OldIndex];\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\tm_BlockTypes = std::move(NewBlockTypes);\n}\n\n\n\n\n\nvoid cBlockArea::CropNibbles(NIBBLEARRAY & a_Array, int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ)\n{\n\tint NewSizeX = GetSizeX() - a_AddMinX - a_SubMaxX;\n\tint NewSizeY = GetSizeY() - a_AddMinY - a_SubMaxY;\n\tint NewSizeZ = GetSizeZ() - a_AddMinZ - a_SubMaxZ;\n\tNIBBLEARRAY NewNibbles{ new NIBBLETYPE[ToUnsigned(NewSizeX * NewSizeY * NewSizeZ)] };\n\tsize_t idx = 0;\n\tfor (int y = 0; y < NewSizeY; y++)\n\t{\n\t\tfor (int z = 0; z < NewSizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < NewSizeX; x++)\n\t\t\t{\n\t\t\t\tNewNibbles[idx++] = a_Array[MakeIndex(x + a_AddMinX, y + a_AddMinY, z + a_AddMinZ)];\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\ta_Array = std::move(NewNibbles);\n}\n\n\n\n\n\nvoid cBlockArea::ExpandBlockTypes(int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ)\n{\n\tint NewSizeX = m_Size.x + a_SubMinX + a_AddMaxX;\n\tint NewSizeY = m_Size.y + a_SubMinY + a_AddMaxY;\n\tint NewSizeZ = m_Size.z + a_SubMinZ + a_AddMaxZ;\n\tsize_t BlockCount = static_cast<size_t>(NewSizeX * NewSizeY * NewSizeZ);\n\tBLOCKARRAY NewBlockTypes{ new BLOCKTYPE[BlockCount] };\n\tmemset(NewBlockTypes.get(), 0, BlockCount * sizeof(BLOCKTYPE));\n\tsize_t OldIndex = 0;\n\tfor (int y = 0; y < m_Size.y; y++)\n\t{\n\t\tint IndexBaseY = (y + a_SubMinY) * m_Size.x * m_Size.z;\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tint IndexBaseZ = IndexBaseY + (z + a_SubMinZ) * m_Size.x;\n\t\t\tauto idx = static_cast<size_t>(IndexBaseZ + a_SubMinX);\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tNewBlockTypes[idx++] = m_BlockTypes[OldIndex++];\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\tm_BlockTypes = std::move(NewBlockTypes);\n}\n\n\n\n\n\nvoid cBlockArea::ExpandNibbles(NIBBLEARRAY & a_Array, int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ)\n{\n\tint NewSizeX = m_Size.x + a_SubMinX + a_AddMaxX;\n\tint NewSizeY = m_Size.y + a_SubMinY + a_AddMaxY;\n\tint NewSizeZ = m_Size.z + a_SubMinZ + a_AddMaxZ;\n\tsize_t BlockCount = static_cast<size_t>(NewSizeX * NewSizeY * NewSizeZ);\n\tNIBBLEARRAY NewNibbles{ new NIBBLETYPE[BlockCount] };\n\tmemset(NewNibbles.get(), 0, BlockCount * sizeof(NIBBLETYPE));\n\tsize_t OldIndex = 0;\n\tfor (int y = 0; y < m_Size.y; y++)\n\t{\n\t\tint IndexBaseY = (y + a_SubMinY) * m_Size.x * m_Size.z;\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tint IndexBaseZ = IndexBaseY + (z + a_SubMinZ) * m_Size.x;\n\t\t\tauto idx = static_cast<size_t>(IndexBaseZ + a_SubMinX);\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tNewNibbles[idx++] = a_Array[OldIndex++];\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\ta_Array = std::move(NewNibbles);\n}\n\n\n\n\n\nvoid cBlockArea::RelSetData(\n\tint a_RelX, int a_RelY, int a_RelZ,\n\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\tNIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight\n)\n{\n\tif (!IsValidCoords(a_RelX, a_RelY, a_RelZ))\n\t{\n\t\treturn;\n\t}\n\n\tauto Index = MakeIndex(a_RelX, a_RelY, a_RelZ);\n\tif ((a_DataTypes & baTypes) != 0)\n\t{\n\t\tm_BlockTypes[Index] = a_BlockType;\n\t}\n\tif ((a_DataTypes & baMetas) != 0)\n\t{\n\t\tm_BlockMetas[Index] = a_BlockMeta;\n\t}\n\tif ((a_DataTypes & baLight) != 0)\n\t{\n\t\tm_BlockLight[Index] = a_BlockLight;\n\t}\n\tif ((a_DataTypes & baSkyLight) != 0)\n\t{\n\t\tm_BlockSkyLight[Index] = a_BlockSkyLight;\n\t}\n\n\t// Update the block entities, if appropriate:\n\tif (HasBlockEntities())\n\t{\n\t\tauto itr = m_BlockEntities->find(Index);\n\t\tif (itr != m_BlockEntities->end())\n\t\t{\n\t\t\tif (itr->second->GetBlockType() == a_BlockType)\n\t\t\t{\n\t\t\t\t// The block entity is for the same block type, keep the current one\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// The block entity is for a different block type, remove it:\n\t\t\tm_BlockEntities->erase(itr);\n\t\t}\n\t\tif (cBlockEntity::IsBlockEntityBlockType(a_BlockType))\n\t\t{\n\t\t\t// The block type should have a block entity attached to it, create an empty one:\n\t\t\tm_BlockEntities->emplace(Index, cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, {a_RelX, a_RelY, a_RelZ}));\n\t\t}\n\t}\n}\n\n\n\n\n\ntemplate <bool MetasValid>\nvoid cBlockArea::MergeByStrategy(const cBlockArea & a_Src, int a_RelX, int a_RelY, int a_RelZ, eMergeStrategy a_Strategy, const NIBBLETYPE * SrcMetas, NIBBLETYPE * DstMetas)\n{\n\t// Block types are compulsory, block metas are optional\n\tif (!HasBlockTypes() || !a_Src.HasBlockTypes())\n\t{\n\t\tLOGWARNING(\"%s: cannot merge because one of the areas doesn't have blocktypes.\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\t// Dst is *this, Src is a_Src\n\tint SrcOffX = std::max(0, -a_RelX);  // Offset in Src where to start reading\n\tint DstOffX = std::max(0,  a_RelX);  // Offset in Dst where to start writing\n\tint SizeX   = std::min(a_Src.GetSizeX() - SrcOffX, GetSizeX() - DstOffX);  // How many blocks to copy\n\n\tint SrcOffY = std::max(0, -a_RelY);  // Offset in Src where to start reading\n\tint DstOffY = std::max(0,  a_RelY);  // Offset in Dst where to start writing\n\tint SizeY   = std::min(a_Src.GetSizeY() - SrcOffY, GetSizeY() - DstOffY);  // How many blocks to copy\n\n\tint SrcOffZ = std::max(0, -a_RelZ);  // Offset in Src where to start reading\n\tint DstOffZ = std::max(0,  a_RelZ);  // Offset in Dst where to start writing\n\tint SizeZ   = std::min(a_Src.GetSizeZ() - SrcOffZ, GetSizeZ() - DstOffZ);  // How many blocks to copy\n\n\t[&]\n\t{\n\t\tswitch (a_Strategy)\n\t\t{\n\t\t\tcase cBlockArea::msOverwrite:\n\t\t\t{\n\t\t\t\tInternalMergeBlocks<MetasValid, MergeCombinatorOverwrite<MetasValid> >(\n\t\t\t\t\tGetBlockTypes(), a_Src.GetBlockTypes(),\n\t\t\t\t\tDstMetas, SrcMetas,\n\t\t\t\t\tSizeX, SizeY, SizeZ,\n\t\t\t\t\tSrcOffX, SrcOffY, SrcOffZ,\n\t\t\t\t\tDstOffX, DstOffY, DstOffZ,\n\t\t\t\t\ta_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),\n\t\t\t\t\tm_Size.x, m_Size.y, m_Size.z\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}  // case msOverwrite\n\n\t\t\tcase cBlockArea::msFillAir:\n\t\t\t{\n\t\t\t\tInternalMergeBlocks<MetasValid, MergeCombinatorFillAir<MetasValid> >(\n\t\t\t\t\tGetBlockTypes(), a_Src.GetBlockTypes(),\n\t\t\t\t\tDstMetas, SrcMetas,\n\t\t\t\t\tSizeX, SizeY, SizeZ,\n\t\t\t\t\tSrcOffX, SrcOffY, SrcOffZ,\n\t\t\t\t\tDstOffX, DstOffY, DstOffZ,\n\t\t\t\t\ta_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),\n\t\t\t\t\tm_Size.x, m_Size.y, m_Size.z\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}  // case msFillAir\n\n\t\t\tcase cBlockArea::msImprint:\n\t\t\t{\n\t\t\t\tInternalMergeBlocks<MetasValid, MergeCombinatorImprint<MetasValid> >(\n\t\t\t\t\tGetBlockTypes(), a_Src.GetBlockTypes(),\n\t\t\t\t\tDstMetas, SrcMetas,\n\t\t\t\t\tSizeX, SizeY, SizeZ,\n\t\t\t\t\tSrcOffX, SrcOffY, SrcOffZ,\n\t\t\t\t\tDstOffX, DstOffY, DstOffZ,\n\t\t\t\t\ta_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),\n\t\t\t\t\tm_Size.x, m_Size.y, m_Size.z\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}  // case msImprint\n\n\t\t\tcase cBlockArea::msLake:\n\t\t\t{\n\t\t\t\tInternalMergeBlocks<MetasValid, MergeCombinatorLake<MetasValid> >(\n\t\t\t\t\tGetBlockTypes(), a_Src.GetBlockTypes(),\n\t\t\t\t\tDstMetas, SrcMetas,\n\t\t\t\t\tSizeX, SizeY, SizeZ,\n\t\t\t\t\tSrcOffX, SrcOffY, SrcOffZ,\n\t\t\t\t\tDstOffX, DstOffY, DstOffZ,\n\t\t\t\t\ta_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),\n\t\t\t\t\tm_Size.x, m_Size.y, m_Size.z\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}  // case msLake\n\n\t\t\tcase cBlockArea::msSpongePrint:\n\t\t\t{\n\t\t\t\tInternalMergeBlocks<MetasValid, MergeCombinatorSpongePrint<MetasValid> >(\n\t\t\t\t\tGetBlockTypes(), a_Src.GetBlockTypes(),\n\t\t\t\t\tDstMetas, SrcMetas,\n\t\t\t\t\tSizeX, SizeY, SizeZ,\n\t\t\t\t\tSrcOffX, SrcOffY, SrcOffZ,\n\t\t\t\t\tDstOffX, DstOffY, DstOffZ,\n\t\t\t\t\ta_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),\n\t\t\t\t\tm_Size.x, m_Size.y, m_Size.z\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}  // case msSpongePrint\n\n\t\t\tcase cBlockArea::msDifference:\n\t\t\t{\n\t\t\t\tInternalMergeBlocks<MetasValid, MergeCombinatorDifference<MetasValid> >(\n\t\t\t\t\tGetBlockTypes(), a_Src.GetBlockTypes(),\n\t\t\t\t\tDstMetas, SrcMetas,\n\t\t\t\t\tSizeX, SizeY, SizeZ,\n\t\t\t\t\tSrcOffX, SrcOffY, SrcOffZ,\n\t\t\t\t\tDstOffX, DstOffY, DstOffZ,\n\t\t\t\t\ta_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),\n\t\t\t\t\tm_Size.x, m_Size.y, m_Size.z\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}  // case msDifference\n\n\t\t\tcase cBlockArea::msSimpleCompare:\n\t\t\t{\n\t\t\t\tInternalMergeBlocks<MetasValid, MergeCombinatorSimpleCompare<MetasValid> >(\n\t\t\t\t\tGetBlockTypes(), a_Src.GetBlockTypes(),\n\t\t\t\t\tDstMetas, SrcMetas,\n\t\t\t\t\tSizeX, SizeY, SizeZ,\n\t\t\t\t\tSrcOffX, SrcOffY, SrcOffZ,\n\t\t\t\t\tDstOffX, DstOffY, DstOffZ,\n\t\t\t\t\ta_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),\n\t\t\t\t\tm_Size.x, m_Size.y, m_Size.z\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}  // case msSimpleCompare\n\n\t\t\tcase cBlockArea::msMask:\n\t\t\t{\n\t\t\t\tInternalMergeBlocks<MetasValid, MergeCombinatorMask<MetasValid> >(\n\t\t\t\t\tGetBlockTypes(), a_Src.GetBlockTypes(),\n\t\t\t\t\tDstMetas, SrcMetas,\n\t\t\t\t\tSizeX, SizeY, SizeZ,\n\t\t\t\t\tSrcOffX, SrcOffY, SrcOffZ,\n\t\t\t\t\tDstOffX, DstOffY, DstOffZ,\n\t\t\t\t\ta_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),\n\t\t\t\t\tm_Size.x, m_Size.y, m_Size.z\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}  // case msMask\n\t\t}  // switch (a_Strategy)\n\t\tUNREACHABLE(\"Unsupported block area merge strategy\");\n\t}();\n\n\tif (HasBlockEntities())\n\t{\n\t\tif (a_Src.HasBlockEntities())\n\t\t{\n\t\t\tMergeBlockEntities(a_RelX, a_RelY, a_RelZ, a_Src);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRescanBlockEntities();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::MergeBlockEntities(int a_RelX, int a_RelY, int a_RelZ, const cBlockArea & a_Src)\n{\n\t// Only supported with both BlockEntities and BlockTypes (caller should check):\n\tASSERT(HasBlockTypes());\n\tASSERT(HasBlockEntities());\n\tASSERT(a_Src.HasBlockTypes());\n\tASSERT(a_Src.HasBlockEntities());\n\n\t// Remove block entities that no longer match the block at their coords:\n\tRemoveNonMatchingBlockEntities();\n\n\t// Clone BEs from a_Src wherever a BE is missing:\n\tfor (int y = 0; y < m_Size.y; ++y) for (int z = 0; z < m_Size.z; ++z) for (int x = 0; x < m_Size.x; ++x)\n\t{\n\t\tauto idx = MakeIndex(x, y, z);\n\t\tauto type = m_BlockTypes[idx];\n\t\tif (!cBlockEntity::IsBlockEntityBlockType(type))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This block should have a block entity, check that there is one:\n\t\tauto itr = m_BlockEntities->find(idx);\n\t\tif (itr != m_BlockEntities->end())\n\t\t{\n\t\t\t// There is one already\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Copy a BE from a_Src, if it exists there:\n\t\tauto srcX = x + a_RelX;\n\t\tauto srcY = y + a_RelY;\n\t\tauto srcZ = z + a_RelZ;\n\t\tif (a_Src.IsValidRelCoords(srcX, srcY, srcZ))\n\t\t{\n\t\t\tauto srcIdx = a_Src.MakeIndex(srcX, srcY, srcZ);\n\t\t\tauto itrSrc = a_Src.m_BlockEntities->find(srcIdx);\n\t\t\tif (itrSrc != a_Src.m_BlockEntities->end())\n\t\t\t{\n\t\t\t\tm_BlockEntities->emplace(idx, itrSrc->second->Clone({x, y, z}));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\t// No BE found in a_Src, insert a new empty one:\n\t\tNIBBLETYPE meta = HasBlockMetas() ? m_BlockMetas[idx] : 0;\n\t\tm_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(type, meta, {x, y, z}));\n\t}  // for x, z, y\n}\n\n\n\n\n\nvoid cBlockArea::RescanBlockEntities(void)\n{\n\t// Only supported with both BlockEntities and BlockTypes\n\tif (!HasBlockEntities() || !HasBlockTypes())\n\t{\n\t\treturn;\n\t}\n\n\t// Remove block entities that no longer match the block at their coords:\n\tRemoveNonMatchingBlockEntities();\n\n\t// Add block entities for all block types that should have a BE assigned to them:\n\tfor (int y = 0; y < m_Size.y; ++y) for (int z = 0; z < m_Size.z; ++z) for (int x = 0; x < m_Size.x; ++x)\n\t{\n\t\tauto idx = MakeIndex(x, y, z);\n\t\tauto type = m_BlockTypes[idx];\n\t\tif (!cBlockEntity::IsBlockEntityBlockType(type))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// This block should have a block entity, check that there is one:\n\t\tauto itr = m_BlockEntities->find(idx);\n\t\tif (itr != m_BlockEntities->end())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Create a new BE for this block:\n\t\tNIBBLETYPE meta = HasBlockMetas() ? m_BlockMetas[idx] : 0;\n\t\tm_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(type, meta, {x, y, z}));\n\t}  // for x, z, y\n}\n\n\n\n\n\nvoid cBlockArea::RemoveNonMatchingBlockEntities(void)\n{\n\t// Only supported with both BlockEntities and BlockTypes:\n\tASSERT(HasBlockTypes());\n\tASSERT(HasBlockEntities());\n\n\tcBlockEntities oldBE;\n\tstd::swap(oldBE, *m_BlockEntities);\n\tfor (auto & keyPair: oldBE)\n\t{\n\t\tauto type = m_BlockTypes[static_cast<size_t>(keyPair.first)];\n\t\tif (type == keyPair.second->GetBlockType())\n\t\t{\n\t\t\tm_BlockEntities->insert(std::move(keyPair));\n\t\t}\n\t}\n}\n\n\n\n\n\ncBlockEntity * cBlockArea::GetBlockEntityRel(Vector3i a_RelPos)\n{\n\tif (!HasBlockEntities())\n\t{\n\t\treturn nullptr;\n\t}\n\tauto itr = m_BlockEntities->find(MakeIndex(a_RelPos));\n\treturn (itr == m_BlockEntities->end()) ? nullptr : itr->second.get();\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBlockArea::cChunkReader:\n\ncBlockArea::cChunkReader::cChunkReader(cBlockArea & a_Area) :\n\tm_Area(a_Area),\n\tm_AreaBounds(cCuboid(a_Area.GetOrigin(), a_Area.GetOrigin() + a_Area.GetSize() - Vector3i(1, 1, 1))),\n\tm_Origin(a_Area.m_Origin.x, a_Area.m_Origin.y, a_Area.m_Origin.z),\n\tm_CurrentChunkX(0),\n\tm_CurrentChunkZ(0)\n{\n}\n\n\n\n\n\nvoid cBlockArea::cChunkReader::CopyNibbles(NIBBLETYPE * a_AreaDst, const NIBBLETYPE * a_ChunkSrc)\n{\n\tint SizeY = m_Area.m_Size.y;\n\tint MinY = m_Origin.y;\n\n\t// SizeX, SizeZ are the dmensions of the block data to copy from the current chunk (size of the geometric union)\n\t// OffX, OffZ are the offsets of the current chunk data from the area origin\n\t// BaseX, BaseZ are the offsets of the area data within the current chunk from the chunk borders\n\tint SizeX = cChunkDef::Width;\n\tint SizeZ = cChunkDef::Width;\n\tint OffX, OffZ;\n\tint BaseX, BaseZ;\n\tOffX = m_CurrentChunkX * cChunkDef::Width - m_Origin.x;\n\tif (OffX < 0)\n\t{\n\t\tBaseX = -OffX;\n\t\tSizeX += OffX;  // SizeX is decreased, OffX is negative\n\t\tOffX = 0;\n\t}\n\telse\n\t{\n\t\tBaseX = 0;\n\t}\n\tOffZ = m_CurrentChunkZ * cChunkDef::Width - m_Origin.z;\n\tif (OffZ < 0)\n\t{\n\t\tBaseZ = -OffZ;\n\t\tSizeZ += OffZ;  // SizeZ is decreased, OffZ is negative\n\t\tOffZ = 0;\n\t}\n\telse\n\t{\n\t\tBaseZ = 0;\n\t}\n\t// If the chunk extends beyond the area in the X or Z axis, cut off the Size:\n\tif ((m_CurrentChunkX + 1) * cChunkDef::Width > m_Origin.x + m_Area.m_Size.x)\n\t{\n\t\tSizeX -= (m_CurrentChunkX + 1) * cChunkDef::Width - (m_Origin.x + m_Area.m_Size.x);\n\t}\n\tif ((m_CurrentChunkZ + 1) * cChunkDef::Width > m_Origin.z + m_Area.m_Size.z)\n\t{\n\t\tSizeZ -= (m_CurrentChunkZ + 1) * cChunkDef::Width - (m_Origin.z + m_Area.m_Size.z);\n\t}\n\n\tfor (int y = 0; y < SizeY; y++)\n\t{\n\t\tint ChunkY = MinY + y;\n\t\tint AreaY = y;\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint ChunkZ = BaseZ + z;\n\t\t\tint AreaZ = OffZ + z;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint ChunkX = BaseX + x;\n\t\t\t\tint AreaX = OffX + x;\n\t\t\t\ta_AreaDst[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = cChunkDef::GetNibble(a_ChunkSrc, ChunkX, ChunkY, ChunkZ);\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n}\n\n\n\n\n\nbool cBlockArea::cChunkReader::Coords(int a_ChunkX, int a_ChunkZ)\n{\n\tm_CurrentChunkX = a_ChunkX;\n\tm_CurrentChunkZ = a_ChunkZ;\n\treturn true;\n}\n\n\n\n\n\nvoid cBlockArea::cChunkReader::ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData)\n{\n\tint SizeY = m_Area.m_Size.y;\n\tint MinY = m_Origin.y;\n\n\t// SizeX, SizeZ are the dimensions of the block data to copy from the current chunk (size of the geometric union)\n\t// OffX, OffZ are the offsets of the current chunk data from the area origin\n\t// BaseX, BaseZ are the offsets of the area data within the current chunk from the chunk borders\n\tint SizeX = cChunkDef::Width;\n\tint SizeZ = cChunkDef::Width;\n\tint OffX, OffZ;\n\tint BaseX, BaseZ;\n\tOffX = m_CurrentChunkX * cChunkDef::Width - m_Origin.x;\n\tif (OffX < 0)\n\t{\n\t\tBaseX = -OffX;\n\t\tSizeX += OffX;  // SizeX is decreased, OffX is negative\n\t\tOffX = 0;\n\t}\n\telse\n\t{\n\t\tBaseX = 0;\n\t}\n\tOffZ = m_CurrentChunkZ * cChunkDef::Width - m_Origin.z;\n\tif (OffZ < 0)\n\t{\n\t\tBaseZ = -OffZ;\n\t\tSizeZ += OffZ;  // SizeZ is decreased, OffZ is negative\n\t\tOffZ = 0;\n\t}\n\telse\n\t{\n\t\tBaseZ = 0;\n\t}\n\t// If the chunk extends beyond the area in the X or Z axis, cut off the Size:\n\tif ((m_CurrentChunkX + 1) * cChunkDef::Width > m_Origin.x + m_Area.m_Size.x)\n\t{\n\t\tSizeX -= (m_CurrentChunkX + 1) * cChunkDef::Width - (m_Origin.x + m_Area.m_Size.x);\n\t}\n\tif ((m_CurrentChunkZ + 1) * cChunkDef::Width > m_Origin.z + m_Area.m_Size.z)\n\t{\n\t\tSizeZ -= (m_CurrentChunkZ + 1) * cChunkDef::Width - (m_Origin.z + m_Area.m_Size.z);\n\t}\n\n\t// Copy the blocktypes:\n\tif (m_Area.m_BlockTypes != nullptr)\n\t{\n\t\tfor (int y = 0; y < SizeY; y++)\n\t\t{\n\t\t\tint InChunkY = MinY + y;\n\t\t\tint AreaY = y;\n\t\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t\t{\n\t\t\t\tint InChunkZ = BaseZ + z;\n\t\t\t\tint AreaZ = OffZ + z;\n\t\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t\t{\n\t\t\t\t\tint InChunkX = BaseX + x;\n\t\t\t\t\tint AreaX = OffX + x;\n\t\t\t\t\tm_Area.m_BlockTypes[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = a_BlockData.GetBlock({ InChunkX, InChunkY, InChunkZ });\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}\n\n\t// Copy the block metas:\n\tif (m_Area.m_BlockMetas != nullptr)\n\t{\n\t\tfor (int y = 0; y < SizeY; y++)\n\t\t{\n\t\t\tint InChunkY = MinY + y;\n\t\t\tint AreaY = y;\n\t\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t\t{\n\t\t\t\tint InChunkZ = BaseZ + z;\n\t\t\t\tint AreaZ = OffZ + z;\n\t\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t\t{\n\t\t\t\t\tint InChunkX = BaseX + x;\n\t\t\t\t\tint AreaX = OffX + x;\n\t\t\t\t\tm_Area.m_BlockMetas[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = a_BlockData.GetMeta({ InChunkX, InChunkY, InChunkZ });\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}\n\n\t// Copy the blocklight:\n\tif (m_Area.m_BlockLight != nullptr)\n\t{\n\t\tfor (int y = 0; y < SizeY; y++)\n\t\t{\n\t\t\tint InChunkY = MinY + y;\n\t\t\tint AreaY = y;\n\t\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t\t{\n\t\t\t\tint InChunkZ = BaseZ + z;\n\t\t\t\tint AreaZ = OffZ + z;\n\t\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t\t{\n\t\t\t\t\tint InChunkX = BaseX + x;\n\t\t\t\t\tint AreaX = OffX + x;\n\t\t\t\t\tm_Area.m_BlockLight[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = a_LightData.GetBlockLight({ InChunkX, InChunkY, InChunkZ });\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}\n\n\t// Copy the skylight:\n\tif (m_Area.m_BlockSkyLight != nullptr)\n\t{\n\t\tfor (int y = 0; y < SizeY; y++)\n\t\t{\n\t\t\tint InChunkY = MinY + y;\n\t\t\tint AreaY = y;\n\t\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t\t{\n\t\t\t\tint InChunkZ = BaseZ + z;\n\t\t\t\tint AreaZ = OffZ + z;\n\t\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t\t{\n\t\t\t\t\tint InChunkX = BaseX + x;\n\t\t\t\t\tint AreaX = OffX + x;\n\t\t\t\t\tm_Area.m_BlockSkyLight[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = a_LightData.GetSkyLight({ InChunkX, InChunkY, InChunkZ });\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}\n}\n\n\n\n\n\nvoid cBlockArea::cChunkReader::BlockEntity(cBlockEntity * a_BlockEntity)\n{\n\tif (!m_Area.HasBlockEntities())\n\t{\n\t\treturn;\n\t}\n\tif (!m_AreaBounds.IsInside(a_BlockEntity->GetPos()))\n\t{\n\t\treturn;\n\t}\n\tauto areaPos = a_BlockEntity->GetPos() - m_Area.m_Origin;\n\tauto Idx = m_Area.MakeIndex(areaPos);\n\tm_Area.m_BlockEntities->emplace(Idx, a_BlockEntity->Clone(areaPos));\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/BlockArea.h",
    "content": "\n// BlockArea.h\n\n// Interfaces to the cBlockArea object representing an area of block data that can be queried from cWorld and then accessed again without further queries\n// The object also supports writing the blockdata back into cWorld, even into other coords\n\n// NOTE: All Nibble values (meta, blocklight, skylight) are stored one-nibble-per-byte for faster access / editting!\n// NOTE: Lua bindings for this object explicitly check parameter values. C++ code is expected to pass in valid params, so the functions ASSERT on invalid params.\n//    This includes the datatypes (must be present / valid combination), coords and sizes.\n\n\n\n\n\n#pragma once\n\n#include \"BlockType.h\"\n#include \"ForEachChunkProvider.h\"\n#include \"ChunkDataCallback.h\"\n#include \"Cuboid.h\"\n#include \"FunctionRef.h\"\n#include \"BlockEntities/BlockEntity.h\"\n\n\n\n\n// fwd:\nclass cCuboid;\nclass cItem;\nclass cItems;\nusing cBlockEntityCallback = cFunctionRef<bool(cBlockEntity &)>;\n\n\n\n\n// tolua_begin\nclass cBlockArea\n{\n\t// tolua_end\n\tDISALLOW_COPY_AND_ASSIGN(cBlockArea);\n\t// tolua_begin\n\npublic:\n\n\t/** What data is to be queried (bit-mask) */\n\tenum\n\t{\n\t\tbaTypes         =  1,\n\t\tbaMetas         =  2,\n\t\tbaLight         =  4,\n\t\tbaSkyLight      =  8,\n\t\t// baEntities   = 16,  // Not supported yet\n\t\tbaBlockEntities = 32,\n\t} ;\n\n\t/** The per-block strategy to use when merging another block area into this object.\n\tSee the Merge function for the description of these */\n\tenum eMergeStrategy\n\t{\n\t\tmsOverwrite,\n\t\tmsFillAir,\n\t\tmsImprint,\n\t\tmsLake,\n\t\tmsSpongePrint,\n\t\tmsDifference,\n\t\tmsSimpleCompare,\n\t\tmsMask,\n\t} ;\n\n\tcBlockArea(void);\n\n\t/** Returns true if the datatype combination is valid.\n\tInvalid combinations include BlockEntities without BlockTypes. */\n\tstatic bool IsValidDataTypeCombination(int a_DataTypes);\n\n\t/** Clears the data stored to reclaim memory */\n\tvoid Clear(void);\n\n\t// tolua_end\n\n\t/** Creates a new area of the specified size and contents.\n\tOrigin is set to all zeroes.\n\tBlockTypes are set to air, block metas to zero, blocklights to zero and skylights to full light. */\n\tvoid Create(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes = baTypes | baMetas | baBlockEntities);\n\n\t/** Creates a new area of the specified size and contents.\n\tOrigin is set to all zeroes.\n\tBlockTypes are set to air, block metas to zero, blocklights to zero and skylights to full light. */\n\tvoid Create(const Vector3i & a_Size, int a_DataTypes = baTypes | baMetas | baBlockEntities);\n\n\t// tolua_begin\n\n\t/** Resets the origin. No other changes are made, contents are untouched. */\n\tvoid SetOrigin(int a_OriginX, int a_OriginY, int a_OriginZ);\n\n\t/** Resets the origin. No other changes are made, contents are untouched. */\n\tvoid SetOrigin(const Vector3i & a_Origin);\n\n\t/** Returns true if the specified relative coords are within this area's coord range (0 - m_Size). */\n\tbool IsValidRelCoords(int a_RelX, int a_RelY, int a_RelZ) const;\n\n\t/** Returns true if the specified relative coords are within this area's coord range (0 - m_Size). */\n\tbool IsValidRelCoords(const Vector3i & a_RelCoords) const;\n\n\t/** Returns true if the specified coords are within this area's coord range (as indicated by m_Origin). */\n\tbool IsValidCoords(int a_BlockX, int a_BlockY, int a_BlockZ) const;\n\n\t/** Returns true if the specified coords are within this area's coord range (as indicated by m_Origin). */\n\tbool IsValidCoords(const Vector3i & a_Coords) const;\n\n\t// tolua_end\n\n\t/** Reads an area of blocks specified. Returns true if successful. All coords are inclusive. */\n\tbool Read(cForEachChunkProvider & a_ForEachChunkProvider, int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ, int a_DataTypes = baTypes | baMetas | baBlockEntities);\n\n\t/** Reads an area of blocks specified. Returns true if successful. The bounds are included in the read area. */\n\tbool Read(cForEachChunkProvider & a_ForEachChunkProvider, const cCuboid & a_Bounds, int a_DataTypes = baTypes | baMetas | baBlockEntities);\n\n\t/** Reads an area of blocks specified. Returns true if successful. The bounds are included in the read area. */\n\tbool Read(cForEachChunkProvider & a_ForEachChunkProvider, const Vector3i & a_Point1, const Vector3i & a_Point2, int a_DataTypes = baTypes | baMetas | baBlockEntities);\n\n\t// TODO: Write() is not too good an interface: if it fails, there's no way to repeat only for the parts that didn't write\n\t// A better way may be to return a list of cBlockAreas for each part that didn't succeed writing, so that the caller may try again\n\n\t/** Writes the area back into cWorld at the coords specified. Returns true if successful in all chunks, false if only partially / not at all.\n\tDoesn't wake up the simulators. */\n\tbool Write(cForEachChunkProvider & a_ForEachChunkProvider, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes);\n\n\t/** Writes the area back into cWorld at the coords specified. Returns true if successful in all chunks, false if only partially / not at all.\n\tDoesn't wake up the simulators. */\n\tbool Write(cForEachChunkProvider & a_ForEachChunkProvider, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ)\n\t{\n\t\t// Write all available data\n\t\treturn Write(a_ForEachChunkProvider, a_MinBlockX, a_MinBlockY, a_MinBlockZ, GetDataTypes());\n\t}\n\n\t/** Writes the area back into cWorld at the coords specified. Returns true if successful in all chunks, false if only partially / not at all.\n\tDoesn't wake up the simulators. */\n\tbool Write(cForEachChunkProvider & a_ForEachChunkProvider, const Vector3i & a_MinCoords, int a_DataTypes);\n\n\t/** Writes the area back into cWorld at the coords specified. Returns true if successful in all chunks, false if only partially / not at all.\n\tDoesn't wake up the simulators. */\n\tbool Write(cForEachChunkProvider & a_ForEachChunkProvider, const Vector3i & a_MinCoords)\n\t{\n\t\t// Write all available data\n\t\treturn Write(a_ForEachChunkProvider, a_MinCoords.x, a_MinCoords.y, a_MinCoords.z, GetDataTypes());\n\t}\n\n\t// tolua_begin\n\n\t/** Copies this object's contents into the specified BlockArea. */\n\tvoid CopyTo(cBlockArea & a_Into) const;\n\n\t/** Copies the contents from the specified BlockArea into this object. */\n\tvoid CopyFrom(const cBlockArea & a_From);\n\n\t/** For testing purposes only, dumps the area into a file. */\n\tvoid DumpToRawFile(const AString & a_FileName);\n\n\t/** Crops the internal contents by the specified amount of blocks from each border. */\n\tvoid Crop(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ);\n\n\t/** Expands the internal contents by the specified amount of blocks from each border */\n\tvoid Expand(int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ);\n\n\t/** Merges another block area into this one, using the specified block combining strategy\n\tThis function combines another BlockArea into the current object.\n\tThe a_RelX, a_RelY and a_RelZ parameters specify the coords of this BA where a_Src should be copied.\n\tIf both areas contain baBlockEntities, the BEs are merged (with preference of keeping this' ones) (MergeBlockEntities()).\n\tIf only this contains BEs, but a_Src doesn't, the BEs are checked after merge to remove the overwritten ones and create\n\tthe missing ones (UpdateBlockEntities()).\n\tThe strategy parameter specifies how individual blocks are combined together, using the table below.\n\n\t| area block |                 result              |\n\t| this | Src | msOverwrite | msFillAir | msImprint |\n\t+------+-----+-------------+-----------+-----------+\n\t| air  | air | air         | air       | air       |\n\t| A    | air | air         | A         | A         |\n\t| air  | B   | B           | B         | B         |\n\t| A    | B   | B           | A         | B         |\n\n\tSo to sum up:\n\t- msOverwrite completely overwrites all blocks with the Src's blocks\n\t- msFillAir overwrites only those blocks that were air\n\t- msImprint overwrites with only those blocks that are non-air\n\n\tSpecial strategies (evaluate top-down, first match wins):\n\tmsLake:\n\t|    area block     |        |\n\t|   this   | Src    | result |\n\t+----------+--------+--------+\n\t| A        | sponge | A      |  Sponge is the NOP block\n\t| *        | air    | air    |  Air always gets hollowed out, even under the oceans\n\t| water    | *      | water  |  Water is never overwritten\n\t| lava     | *      | lava   |  Lava is never overwritten\n\t| *        | water  | water  |  Water always overwrites anything\n\t| *        | lava   | lava   |  Lava always overwrites anything\n\t| dirt     | stone  | stone  |  Stone overwrites dirt\n\t| grass    | stone  | stone  |    ... and grass\n\t| mycelium | stone  | stone  |    ... and mycelium\n\t| A        | stone  | A      |    ... but nothing else\n\t| A        | *      | A      |  Everything else is left as it is\n\n\tmsSpongePrint:\n\tUsed for most generators, it allows carving out air pockets, too, and uses the Sponge as the NOP block\n\t|    area block     |        |\n\t|   this   | Src    | result |\n\t+----------+--------+--------+\n\t| A        | sponge | A      |  Sponge is the NOP block\n\t| *        | B      | B      |  Everything else overwrites anything\n\n\tmsDifference:\n\tUsed to determine the differences between two areas. Only the differring blocks are preserved:\n\t|  area block  |        |\n\t| this | Src   | result |\n\t+------+-------+--------+\n\t| A    | A     | air    |  Same blocks are replaced with air\n\t| A    | non-A | A      |  Differring blocks are kept from \"this\"\n\n\tmsSimpleCompare:\n\tUsed to determine the differences between two areas. Blocks that differ are replaced with stone, same blocks are replaced with air\n\t|  area block  |        |\n\t| this | Src   | result |\n\t+------+-------+--------+\n\t| A    | A     | air    |  Same blocks are replaced with air\n\t| A    | non-A | stone  |  Differring blocks are replaced with stone\n\n\tmsMask:\n\tCombines two areas, the blocks that are the same are kept, differing ones are reset to air\n\t|  area block  |        |\n\t| this | Src   | result |\n\t+------+-------+--------+\n\t| A    | A     | A      |  Same blocks are kept\n\t| A    | non-A | air    |  Everything else is replaced with air\n\n\t*/\n\tvoid Merge(const cBlockArea & a_Src, int a_RelX, int a_RelY, int a_RelZ, eMergeStrategy a_Strategy);\n\n\t/** Merges another block area into this one, using the specified block combining strategy.\n\tSee Merge() above for details. */\n\tvoid Merge(const cBlockArea & a_Src, const Vector3i & a_RelMinCoords, eMergeStrategy a_Strategy);\n\n\t/** Fills the entire block area with the specified data */\n\tvoid Fill(int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta = 0, NIBBLETYPE a_BlockLight = 0, NIBBLETYPE a_BlockSkyLight = 0x0f);\n\n\t// tolua_end\n\n\t/** Fills a cuboid inside the block area with the specified data */\n\tvoid FillRelCuboid(int a_MinRelX, int a_MaxRelX, int a_MinRelY, int a_MaxRelY, int a_MinRelZ, int a_MaxRelZ,\n\t\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta = 0,\n\t\tNIBBLETYPE a_BlockLight = 0, NIBBLETYPE a_BlockSkyLight = 0x0f\n\t);\n\n\t/** Fills a cuboid inside the block area with the specified data. a_Cuboid must be sorted. */\n\tvoid FillRelCuboid(const cCuboid & a_RelCuboid,\n\t\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta = 0,\n\t\tNIBBLETYPE a_BlockLight = 0, NIBBLETYPE a_BlockSkyLight = 0x0f\n\t);\n\n\t/** Draws a line between two points with the specified data. The line endpoints needn't be valid coords inside the area. */\n\tvoid RelLine(int a_RelX1, int a_RelY1, int a_RelZ1, int a_RelX2, int a_RelY2, int a_RelZ2,\n\t\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta = 0,\n\t\tNIBBLETYPE a_BlockLight = 0, NIBBLETYPE a_BlockSkyLight = 0x0f\n\t);\n\n\t/** Draws a line between two points with the specified data. The line endpoints needn't be valid coords inside the area. */\n\tvoid RelLine(const Vector3i & a_Point1, const Vector3i & a_Point2,\n\t\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta = 0,\n\t\tNIBBLETYPE a_BlockLight = 0, NIBBLETYPE a_BlockSkyLight = 0x0f\n\t);\n\n\t// tolua_begin\n\n\t/** Rotates the entire area counter-clockwise around the Y axis */\n\tvoid RotateCCW(void);\n\n\t/** Rotates the entire area clockwise around the Y axis */\n\tvoid RotateCW(void);\n\n\t/** Mirrors the entire area around the XY plane */\n\tvoid MirrorXY(void);\n\n\t/** Mirrors the entire area around the XZ plane */\n\tvoid MirrorXZ(void);\n\n\t/** Mirrors the entire area around the YZ plane */\n\tvoid MirrorYZ(void);\n\n\t/** Rotates the entire area counter-clockwise around the Y axis, doesn't use blockhandlers for block meta */\n\tvoid RotateCCWNoMeta(void);\n\n\t/** Rotates the entire area clockwise around the Y axis, doesn't use blockhandlers for block meta */\n\tvoid RotateCWNoMeta(void);\n\n\t/** Mirrors the entire area around the XY plane, doesn't use blockhandlers for block meta */\n\tvoid MirrorXYNoMeta(void);\n\n\t/** Mirrors the entire area around the XZ plane, doesn't use blockhandlers for block meta */\n\tvoid MirrorXZNoMeta(void);\n\n\t/** Mirrors the entire area around the YZ plane, doesn't use blockhandlers for block meta */\n\tvoid MirrorYZNoMeta(void);\n\n\t// tolua_end\n\n\t// Setters:\n\tvoid SetRelBlockType    (int a_RelX,   int a_RelY,   int a_RelZ,   BLOCKTYPE  a_BlockType);\n\tvoid SetBlockType       (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE  a_BlockType);\n\tvoid SetRelBlockMeta    (int a_RelX,   int a_RelY,   int a_RelZ,   NIBBLETYPE a_BlockMeta);\n\tvoid SetBlockMeta       (int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockMeta);\n\tvoid SetRelBlockLight   (int a_RelX,   int a_RelY,   int a_RelZ,   NIBBLETYPE a_BlockLight);\n\tvoid SetBlockLight      (int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockLight);\n\tvoid SetRelBlockSkyLight(int a_RelX,   int a_RelY,   int a_RelZ,   NIBBLETYPE a_BlockSkyLight);\n\tvoid SetBlockSkyLight   (int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockSkyLight);\n\n\t// tolua_begin\n\n\tvoid SetWEOffset (int a_OffsetX, int a_OffsetY, int a_OffsetZ);\n\tvoid SetWEOffset (const Vector3i & a_Offset);\n\tconst Vector3i & GetWEOffset  (void) const {return m_WEOffset;}\n\n\t// tolua_end\n\n\t// Getters:\n\tBLOCKTYPE  GetRelBlockType    (int a_RelX,   int a_RelY,   int a_RelZ)   const;\n\tBLOCKTYPE  GetBlockType       (int a_BlockX, int a_BlockY, int a_BlockZ) const;\n\tNIBBLETYPE GetRelBlockMeta    (int a_RelX,   int a_RelY,   int a_RelZ)   const;\n\tNIBBLETYPE GetBlockMeta       (int a_BlockX, int a_BlockY, int a_BlockZ) const;\n\tNIBBLETYPE GetRelBlockLight   (int a_RelX,   int a_RelY,   int a_RelZ)   const;\n\tNIBBLETYPE GetBlockLight      (int a_BlockX, int a_BlockY, int a_BlockZ) const;\n\tNIBBLETYPE GetRelBlockSkyLight(int a_RelX,   int a_RelY,   int a_RelZ)   const;\n\tNIBBLETYPE GetBlockSkyLight   (int a_BlockX, int a_BlockY, int a_BlockZ) const;\n\n\tvoid SetBlockTypeMeta   (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType,   NIBBLETYPE a_BlockMeta);\n\tvoid SetRelBlockTypeMeta(int a_RelX,   int a_RelY,   int a_RelZ,   BLOCKTYPE a_BlockType,   NIBBLETYPE a_BlockMeta);\n\n\tvoid GetBlockTypeMeta   (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const;\n\tvoid GetRelBlockTypeMeta(int a_RelX,   int a_RelY,   int a_RelZ,   BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const;\n\n\tconst Vector3i & GetSize(void) const { return m_Size; }\n\tconst Vector3i & GetOrigin(void) const { return m_Origin; }\n\n\t// tolua_begin\n\n\tcCuboid GetBounds(void) const;\n\n\tint GetSizeX(void) const { return m_Size.x; }\n\tint GetSizeY(void) const { return m_Size.y; }\n\tint GetSizeZ(void) const { return m_Size.z; }\n\n\t/** Returns the volume of the area, as number of blocks */\n\tint GetVolume(void) const { return m_Size.x * m_Size.y * m_Size.z; }\n\n\tint GetOriginX(void) const { return m_Origin.x; }\n\tint GetOriginY(void) const { return m_Origin.y; }\n\tint GetOriginZ(void) const { return m_Origin.z; }\n\n\t/** Returns the datatypes that are stored in the object (bitmask of baXXX values) */\n\tint GetDataTypes(void) const;\n\n\tbool HasBlockTypes    (void) const { return (m_BlockTypes    != nullptr); }\n\tbool HasBlockMetas    (void) const { return (m_BlockMetas    != nullptr); }\n\tbool HasBlockLights   (void) const { return (m_BlockLight    != nullptr); }\n\tbool HasBlockSkyLights(void) const { return (m_BlockSkyLight != nullptr); }\n\tbool HasBlockEntities (void) const { return m_BlockEntities.operator bool(); }\n\n\t/** Returns the count of blocks that are not air.\n\tReturns 0 if blocktypes not available. Block metas are ignored (if present, air with any meta is still considered air). */\n\tsize_t CountNonAirBlocks(void) const;\n\n\t/** Returns how many times the specified block is contained in the area.\n\tThe blocks' meta values are ignored, only the blocktype is compared. */\n\tsize_t CountSpecificBlocks(BLOCKTYPE a_BlockType) const;\n\n\t/** Returns how many times the specified block is contained in the area.\n\tBoth the block's type and meta must match in order to be counted in.\n\tIf the block metas aren't present in the area, logs a warning and ignores the meta specification. */\n\tsize_t CountSpecificBlocks(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) const;\n\n\t// tolua_end\n\n\t/** Returns the minimum and maximum coords in each direction for the first non-ignored block in each direction.\n\tIf there are no non-ignored blocks within the area, or blocktypes are not present, the returned values are reverse-ranges (MinX <- m_RangeX, MaxX <- 0 etc.)\n\tExported to Lua in ManualBindings.cpp. */\n\tvoid GetNonAirCropRelCoords(int & a_MinRelX, int & a_MinRelY, int & a_MinRelZ, int & a_MaxRelX, int & a_MaxRelY, int & a_MaxRelZ, BLOCKTYPE a_IgnoreBlockType = E_BLOCK_AIR);\n\n\t// Clients can use these for faster access to all blocktypes. Be careful though!\n\t/** Returns the internal pointer to the block types */\n\tBLOCKTYPE *  GetBlockTypes   (void) const { return m_BlockTypes.get();    }\n\tNIBBLETYPE * GetBlockMetas   (void) const { return m_BlockMetas.get();    }  // NOTE: one byte per block!\n\tNIBBLETYPE * GetBlockLight   (void) const { return m_BlockLight.get();    }  // NOTE: one byte per block!\n\tNIBBLETYPE * GetBlockSkyLight(void) const { return m_BlockSkyLight.get(); }  // NOTE: one byte per block!\n\tsize_t       GetBlockCount(void) const { return static_cast<size_t>(m_Size.x * m_Size.y * m_Size.z); }\n\tstatic size_t MakeIndexForSize(Vector3i a_RelPos, Vector3i a_Size);\n\n\t/** Returns the index into the internal arrays for the specified coords */\n\tsize_t MakeIndex(Vector3i a_RelPos) const\n\t{\n\t\treturn MakeIndexForSize(a_RelPos, m_Size);\n\t}\n\n\t/** OBSOLETE, use the Vector3i-based overload instead.\n\tReturns the index into the internal arrays for the specified coords */\n\tsize_t MakeIndex(int a_RelX, int a_RelY, int a_RelZ) const\n\t{\n\t\treturn MakeIndexForSize({ a_RelX, a_RelY, a_RelZ }, m_Size);\n\t}\n\n\t/** Calls the callback for the block entity at the specified coords.\n\tReturns false if there is no block entity at those coords, or the block area doesn't have baBlockEntities.\n\tReturns the value that the callback has returned if there is a block entity. */\n\tbool DoWithBlockEntityRelAt(int a_RelX, int a_RelY, int a_RelZ, cBlockEntityCallback a_Callback);\n\n\t/** Calls the callback for the block entity at the specified coords.\n\tReturns false if there is no block entity at those coords.\n\tReturns the value that the callback has returned if there is a block entity. */\n\tbool DoWithBlockEntityAt   (int a_BlockX, int a_BlockY, int a_BlockZ, cBlockEntityCallback a_Callback);\n\n\t/** Calls the callback for all the block entities.\n\tIf the callback returns true, aborts the enumeration and returns false.\n\tIf the callback returns true, continues with the next BE.\n\tReturns true if all block entities have been enumerated (including the case when there is none or the area is without baBlockEntities). */\n\tbool ForEachBlockEntity(cBlockEntityCallback a_Callback);\n\n\t/** Direct read-only access to block entities. */\n\tconst cBlockEntities & GetBlockEntities(void) const { ASSERT(HasBlockEntities()); return *m_BlockEntities.get(); }\n\tcBlockEntities &       GetBlockEntities(void)       { ASSERT(HasBlockEntities()); return *m_BlockEntities.get(); }\n\n\n\nprotected:\n\n\tfriend class cChunkDesc;\n\tfriend class cSchematicFileSerializer;\n\n\tclass cChunkReader:\n\t\tpublic cChunkDataCallback\n\t{\n\tpublic:\n\t\tcChunkReader(cBlockArea & a_Area);\n\n\tprotected:\n\t\tcBlockArea & m_Area;\n\t\tcCuboid m_AreaBounds;  ///< Bounds of the whole area being read, in world coords\n\t\tVector3i m_Origin;\n\t\tint m_CurrentChunkX;\n\t\tint m_CurrentChunkZ;\n\n\t\tvoid CopyNibbles(NIBBLETYPE * a_AreaDst, const NIBBLETYPE * a_ChunkSrc);\n\n\t\t// cChunkDataCallback overrides:\n\t\tvirtual bool Coords(int a_ChunkX, int a_ChunkZ) override;\n\t\tvirtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData) override;\n\t\tvirtual void BlockEntity(cBlockEntity * a_BlockEntity) override;\n\t} ;\n\n\tusing NIBBLEARRAY = std::unique_ptr<NIBBLETYPE[]>;\n\tusing BLOCKARRAY = std::unique_ptr<BLOCKTYPE[]>;\n\tusing cBlockEntitiesPtr = std::unique_ptr<cBlockEntities>;\n\n\tVector3i m_Origin;\n\tVector3i m_Size;\n\n\t/** An extra data value sometimes stored in the .schematic file. Used mainly by the WorldEdit plugin.\n\tcBlockArea doesn't use this value in any way. */\n\tVector3i m_WEOffset;\n\n\tBLOCKARRAY  m_BlockTypes;\n\tNIBBLEARRAY m_BlockMetas;     // Each meta is stored as a separate byte for faster access\n\tNIBBLEARRAY m_BlockLight;     // Each light value is stored as a separate byte for faster access\n\tNIBBLEARRAY m_BlockSkyLight;  // Each light value is stored as a separate byte for faster access\n\n\t/** The block entities contained within the area.\n\tOnly valid if the area was created / read with the baBlockEntities flag.\n\tThe block entities are owned by this object. */\n\tcBlockEntitiesPtr m_BlockEntities;\n\n\t/** Clears the data stored and prepares a fresh new block area with the specified dimensions */\n\tbool SetSize(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes);\n\n\t// Basic Setters:\n\tvoid SetRelNibble(int a_RelX,   int a_RelY,   int a_RelZ,   NIBBLETYPE a_Value, NIBBLETYPE * a_Array);\n\tvoid SetNibble   (int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Value, NIBBLETYPE * a_Array);\n\n\t// Basic Getters:\n\tNIBBLETYPE GetRelNibble(int a_RelX,   int a_RelY,   int a_RelZ,   NIBBLETYPE * a_Array) const;\n\tNIBBLETYPE GetNibble   (int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE * a_Array) const;\n\n\t// Crop helpers:\n\tvoid CropBlockTypes(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ);\n\tvoid CropNibbles   (NIBBLEARRAY & a_Array, int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ);\n\n\t// Expand helpers:\n\tvoid ExpandBlockTypes(int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ);\n\tvoid ExpandNibbles   (NIBBLEARRAY & a_Array, int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ);\n\n\t/** Sets the specified datatypes at the specified location.\n\tIf the coords are not valid, ignores the call (so that RelLine() can work simply). */\n\tvoid RelSetData(\n\t\tint a_RelX, int a_RelY, int a_RelZ,\n\t\tint a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\t\tNIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight\n\t);\n\n\ttemplate <bool MetasValid>\n\tvoid MergeByStrategy(const cBlockArea & a_Src, int a_RelX, int a_RelY, int a_RelZ, eMergeStrategy a_Strategy, const NIBBLETYPE * SrcMetas, NIBBLETYPE * DstMetas);\n\n\t/** Updates m_BlockEntities to remove BEs that no longer match the blocktype at their coords, and clones from a_Src the BEs that are missing.\n\ta_RelX, a_RelY and a_RelZ are relative coords that should be added to all BEs from a_Src before checking them.\n\tIf a block should have a BE but one cannot be found in either this or a_Src, a new one is created. */\n\tvoid MergeBlockEntities(int a_RelX, int a_RelY, int a_RelZ, const cBlockArea & a_Src);\n\n\t/** Updates m_BlockEntities to remove BEs that no longer match the blocktype at their coords, and add new BEs that are missing. */\n\tvoid RescanBlockEntities(void);\n\n\t/** Removes from m_BlockEntities those BEs that no longer match the blocktype at their coords. */\n\tvoid RemoveNonMatchingBlockEntities(void);\n\n\t/** Returns the cBlockEntity at the specified coords, or nullptr if none. */\n\tcBlockEntity * GetBlockEntityRel(Vector3i a_RelPos);\n\n\t// tolua_begin\n} ;\n// tolua_end\n\n\n\n\n"
  },
  {
    "path": "src/BlockEntities/BannerEntity.cpp",
    "content": "\n// BannerEntity.cpp\n\n// Implements the cBannerEntity class representing a banner block in the world\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n#include \"BannerEntity.h\"\n\n#include \"../World.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncBannerEntity::cBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, unsigned char a_BaseColor, AString a_CustomName):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tm_BaseColor(a_BaseColor),\n\tm_CustomName(std::move(a_CustomName))\n{\n\tASSERT((a_BlockType == E_BLOCK_WALL_BANNER) || (a_BlockType == E_BLOCK_STANDING_BANNER));\n}\n\n\n\n\n\ncItems cBannerEntity::ConvertToPickups() const\n{\n\tcItem Item(E_ITEM_BANNER, 1, static_cast<NIBBLETYPE>(GetBaseColor()));\n\tItem.m_CustomName = m_CustomName;\n\treturn Item;\n}\n\n\n\n\n\nvoid cBannerEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cBannerEntity &>(a_Src);\n\tm_BaseColor = src.m_BaseColor;\n\tm_CustomName = src.m_CustomName;\n}\n\n\n\n\n\nvoid cBannerEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendBlockChange(m_Pos, m_BlockType, m_BlockMeta);\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n\n\n\n\n\nbool cBannerEntity::UsedBy(cPlayer * a_Player)\n{\n\tUNUSED(a_Player);\n\treturn false;\n}\n"
  },
  {
    "path": "src/BlockEntities/BannerEntity.h",
    "content": "\n// BannerEntity.h\n\n// Declares the cBannerEntity class representing a single banner in the world\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntity.h\"\n\n\n\n\n\n// tolua_begin\nclass cBannerEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:\n\n\tcBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, unsigned char a_BaseColor = 1, AString a_CustomName = \"\");\n\n\tunsigned char GetBaseColor() const { return m_BaseColor; }\n\tvoid SetBaseColor(unsigned char a_Color) { m_BaseColor = a_Color; }\n\n\tconst AString & GetCustomName() const { return m_CustomName; }\n\tvoid SetCustomName(const AString & a_CustomName) { m_CustomName = a_CustomName; }\n\nprivate:\n\n\tunsigned char m_BaseColor;\n\n\tAString m_CustomName;\n\n\t// cBlockEntity overrides:\n\tvirtual cItems ConvertToPickups() const override;\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/BeaconEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"BeaconEntity.h\"\n#include \"../BlockInfo.h\"\n#include \"../BlockArea.h\"\n#include \"../Entities/Player.h\"\n#include \"../UI/BeaconWindow.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncBeaconEntity::cBeaconEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, 1, 1, a_World),\n\tm_IsActive(false),\n\tm_BeaconLevel(0),\n\tm_PrimaryEffect(cEntityEffect::effNoEffect),\n\tm_SecondaryEffect(cEntityEffect::effNoEffect)\n{\n\tASSERT(a_BlockType == E_BLOCK_BEACON);\n\tif (m_World != nullptr)\n\t{\n\t\tUpdateBeacon();\n\t}\n}\n\n\n\n\n\nchar cBeaconEntity::CalculatePyramidLevel(void)\n{\n\tcBlockArea Area;\n\tint MinY = std::max(GetPosY() - 4, 0);\n\tint MaxY = std::max(GetPosY() - 1, 0);\n\n\tArea.Read(\n\t\t*m_World,\n\t\tGetPosX() - 4, GetPosX() + 4,\n\t\tMinY, MaxY,\n\t\tGetPosZ() - 4, GetPosZ() + 4,\n\t\tcBlockArea::baTypes\n\t);\n\n\tint Layer = 1;\n\tint MiddleXZ = 4;\n\n\tfor (int Y = (Area.GetSizeY() - 1); Y >= 0; Y--)\n\t{\n\t\tfor (int X = MiddleXZ - Layer; X <= (MiddleXZ + Layer); X++)\n\t\t{\n\t\t\tfor (int Z = MiddleXZ - Layer; Z <= (MiddleXZ + Layer); Z++)\n\t\t\t{\n\t\t\t\tif (!IsMineralBlock(Area.GetRelBlockType(X, Y, Z)))\n\t\t\t\t{\n\t\t\t\t\treturn static_cast<char>(Layer - 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tLayer++;\n\t}\n\n\treturn static_cast<char>(Layer - 1);\n}\n\n\n\n\n\nbool cBeaconEntity::IsValidEffect(cEntityEffect::eType a_Effect, char a_BeaconLevel)\n{\n\tswitch (a_Effect)\n\t{\n\t\tcase cEntityEffect::effRegeneration: return (a_BeaconLevel >= 4);\n\t\tcase cEntityEffect::effStrength:     return (a_BeaconLevel >= 3);\n\t\tcase cEntityEffect::effResistance:   return (a_BeaconLevel >= 2);\n\t\tcase cEntityEffect::effJumpBoost:    return (a_BeaconLevel >= 2);\n\t\tcase cEntityEffect::effSpeed:        return (a_BeaconLevel >= 1);\n\t\tcase cEntityEffect::effHaste:        return (a_BeaconLevel >= 1);\n\t\tcase cEntityEffect::effNoEffect:     return true;\n\n\t\tdefault:\n\t\t{\n\t\t\tLOGD(\"%s: Invalid beacon effect: %d\", __FUNCTION__, static_cast<int>(a_Effect));\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cBeaconEntity::SetPrimaryEffect(cEntityEffect::eType a_Effect)\n{\n\tif (!IsValidEffect(a_Effect, m_BeaconLevel))\n\t{\n\t\tm_PrimaryEffect = cEntityEffect::effNoEffect;\n\t\treturn false;\n\t}\n\n\tm_PrimaryEffect = a_Effect;\n\n\t// Send window update:\n\tif (GetWindow() != nullptr)\n\t{\n\t\tGetWindow()->SetProperty(1, static_cast<short>(m_PrimaryEffect));\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cBeaconEntity::SetSecondaryEffect(cEntityEffect::eType a_Effect)\n{\n\tif (!IsValidEffect(a_Effect, m_BeaconLevel))\n\t{\n\t\tm_SecondaryEffect = cEntityEffect::effNoEffect;\n\t\treturn false;\n\t}\n\n\tm_SecondaryEffect = a_Effect;\n\n\t// Send window update:\n\tif (GetWindow() != nullptr)\n\t{\n\t\tGetWindow()->SetProperty(2, static_cast<short>(m_SecondaryEffect));\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cBeaconEntity::IsBeaconBlocked(void)\n{\n\tfor (int Y = m_Pos.y; Y < cChunkDef::Height; ++Y)\n\t{\n\t\tBLOCKTYPE Block = m_World->GetBlock({m_Pos.x, Y, m_Pos.z});\n\t\tif (!cBlockInfo::IsTransparent(Block))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cBeaconEntity::IsMineralBlock(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_DIAMOND_BLOCK:\n\t\tcase E_BLOCK_GOLD_BLOCK:\n\t\tcase E_BLOCK_IRON_BLOCK:\n\t\tcase E_BLOCK_EMERALD_BLOCK:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cBeaconEntity::UpdateBeacon(void)\n{\n\tint OldBeaconLevel = m_BeaconLevel;\n\n\tif (IsBeaconBlocked())\n\t{\n\t\tm_IsActive = false;\n\t\tm_BeaconLevel = 0;\n\t}\n\telse\n\t{\n\t\tm_BeaconLevel = CalculatePyramidLevel();\n\t\tm_IsActive = (m_BeaconLevel > 0);\n\t}\n\n\tif ((m_BeaconLevel != OldBeaconLevel) && (m_BeaconLevel == 4))\n\t{\n\t\t// Send window update:\n\t\tif (GetWindow() != nullptr)\n\t\t{\n\t\t\tGetWindow()->SetProperty(0, m_BeaconLevel);\n\t\t}\n\n\t\tVector3d BeaconPosition(m_Pos);\n\t\tGetWorld()->ForEachPlayer([=](cPlayer & a_Player)\n\t\t\t{\n\t\t\t\tVector3d Distance = BeaconPosition - a_Player.GetPosition();\n\t\t\t\tif (\n\t\t\t\t\t(std::abs(Distance.y) <= 14) &&\n\t\t\t\t\t(std::abs(Distance.x) <= 20) &&\n\t\t\t\t\t(std::abs(Distance.z) <= 20)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\ta_Player.AwardAchievement(CustomStatistic::AchFullBeacon);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t);\n\t}\n}\n\n\n\n\n\nvoid cBeaconEntity::GiveEffects(void)\n{\n\tif (!m_IsActive || (m_BeaconLevel < 0))\n\t{\n\t\treturn;\n\t}\n\n\tdouble Radius = static_cast<double>(m_BeaconLevel) * 10 + 10;\n\tshort EffectLevel = 0;\n\tif ((m_BeaconLevel >= 4) && (m_PrimaryEffect == m_SecondaryEffect))\n\t{\n\t\tEffectLevel = 1;\n\t}\n\n\tbool HasSecondaryEffect = (m_BeaconLevel >= 4) && (m_PrimaryEffect != m_SecondaryEffect) && (m_SecondaryEffect > 0);\n\n\tauto Area = cBoundingBox(m_Pos, Radius, Radius + static_cast<double>(cChunkDef::Height), -Radius);\n\tGetWorld()->ForEachEntityInBox(Area, [&](cEntity & a_Entity)\n\t{\n\t\tif (!a_Entity.IsPlayer())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tauto & Player = static_cast<cPlayer &>(a_Entity);\n\t\tPlayer.AddEntityEffect(m_PrimaryEffect, 180, EffectLevel);\n\n\t\tif (HasSecondaryEffect)\n\t\t{\n\t\t\tPlayer.AddEntityEffect(m_SecondaryEffect, 180, 0);\n\t\t}\n\t\treturn false;\n\t});\n}\n\n\n\n\n\nvoid cBeaconEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cBeaconEntity &>(a_Src);\n\tm_BeaconLevel = src.m_BeaconLevel;\n\tm_Contents.CopyFrom(src.m_Contents);\n\tm_IsActive = src.m_IsActive;\n\tm_PrimaryEffect = src.m_PrimaryEffect;\n\tm_SecondaryEffect = src.m_SecondaryEffect;\n}\n\n\n\n\n\nvoid cBeaconEntity::OnRemoveFromWorld()\n{\n\tconst auto Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\t// Tell window its owner is destroyed:\n\t\tWindow->OwnerDestroyed();\n\t}\n}\n\n\n\n\n\nvoid cBeaconEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n\n\n\n\n\nbool cBeaconEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tusing namespace std::chrono_literals;\n\n\t// Update the beacon every 4 seconds:\n\tif ((GetWorld()->GetWorldTickAge() % 4s) == 0s)\n\t{\n\t\tUpdateBeacon();\n\t\tGiveEffects();\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cBeaconEntity::UsedBy(cPlayer * a_Player)\n{\n\ta_Player->GetStatistics().Custom[CustomStatistic::InteractWithBeacon]++;\n\n\tcWindow * Window = GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tOpenWindow(new cBeaconWindow(this));\n\t\tWindow = GetWindow();\n\t}\n\n\tif (Window != nullptr)\n\t{\n\t\t// if (a_Player->GetWindow() != Window)\n\t\t// -> Because mojang doesn't send a 'close window' packet when you click the cancel button in the beacon inventory ...\n\t\t{\n\t\t\ta_Player->OpenWindow(*Window);\n\t\t}\n\t}\n\treturn true;\n}\n"
  },
  {
    "path": "src/BlockEntities/BeaconEntity.h",
    "content": "\n// BeaconEntity.h\n\n// Declares the cBeaconEntity class representing a single beacon in the world\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntityWithItems.h\"\n\n\n\n\n\n// tolua_begin\nclass cBeaconEntity :\n\tpublic cBlockEntityWithItems\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntityWithItems;\n\npublic:  // tolua_export\n\n\tcBeaconEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual void OnRemoveFromWorld() override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\n\t/** Modify the beacon level. (It is needed to load the beacon corectly) */\n\tvoid SetBeaconLevel(char a_Level) { m_BeaconLevel = a_Level; }\n\n\t// tolua_begin\n\n\t/** Is the beacon active? */\n\tbool IsActive(void) const { return m_IsActive; }\n\n\t/** Returns the beacon level. (0 - 4) */\n\tchar GetBeaconLevel(void) const { return m_BeaconLevel; }\n\n\tcEntityEffect::eType GetPrimaryEffect(void) const { return m_PrimaryEffect; }\n\tcEntityEffect::eType GetSecondaryEffect(void) const { return m_SecondaryEffect; }\n\n\t/** Sets the primary effect. Returns false when the effect is invalid. */\n\tbool SetPrimaryEffect(cEntityEffect::eType a_Effect);\n\n\t/** Sets the secondary effect. Returns false when the effect is invalid. */\n\tbool SetSecondaryEffect(cEntityEffect::eType a_Effect);\n\n\t/** Calculate the amount of layers the pyramid below the beacon has. */\n\tchar CalculatePyramidLevel(void);\n\n\t/** Is the beacon blocked by non-transparent blocks that are higher than the beacon? */\n\tbool IsBeaconBlocked(void);\n\n\t/** Update the beacon. */\n\tvoid UpdateBeacon(void);\n\n\t/** Give the near-players the effects. */\n\tvoid GiveEffects(void);\n\n\t/** Returns true if the block is a diamond block, a golden block, an iron block or an emerald block. */\n\tstatic bool IsMineralBlock(BLOCKTYPE a_BlockType);\n\n\t/** Returns true if the effect can be used. */\n\tstatic bool IsValidEffect(cEntityEffect::eType a_Effect, char a_BeaconLevel);\n\n\t// tolua_end\n\nprotected:\n\n\tbool m_IsActive;\n\tchar m_BeaconLevel;\n\n\tcEntityEffect::eType m_PrimaryEffect, m_SecondaryEffect;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/BedEntity.cpp",
    "content": "\n// BedEntity.cpp\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"BedEntity.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../ClientHandle.h\"\n#include \"../Blocks/BlockBed.h\"\n\n\n\n\n\ncBedEntity::cBedEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, short a_Color):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tm_Color(a_Color)\n{\n\tASSERT(a_BlockType == E_BLOCK_BED);\n}\n\n\n\n\n\ncItems cBedEntity::ConvertToPickups() const\n{\n\treturn cItem(E_ITEM_BED, 1, m_Color);\n}\n\n\n\n\n\nvoid cBedEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cBedEntity &>(a_Src);\n\tm_Color = src.m_Color;\n}\n\n\n\n\n\nvoid cBedEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n\n\n\n\n\nvoid cBedEntity::SetColor(short a_Color)\n{\n\tm_Color = a_Color;\n}\n"
  },
  {
    "path": "src/BlockEntities/BedEntity.h",
    "content": "\n// BedEntity.h\n\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"../BlockType.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cBedEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\tcBedEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, short a_Color = E_META_WOOL_RED);\n\n\t// tolua_begin\n\n\t/** Returns the color of the bed */\n\tshort GetColor(void) const { return m_Color; }\n\n\t/** Set the color of the bed. */\n\tvoid SetColor(short a_Color);\n\n\t/** Returns true if this is the pillow block, it has then the meta 8. */\n\tbool IsPillowBlock(void) { return ((m_BlockMeta & 0x08) == 0x08); }\n\n\t// tolua_end\n\n\t// cBlockEntity overrides:\n\tvirtual cItems ConvertToPickups() const override;\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override { return false; }\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\nprivate:\n\n\tshort m_Color;\n};  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/BlockEntity.cpp",
    "content": "\n// BlockEntity.cpp\n\n// Implements the cBlockEntity class that is the common ancestor for all block entities\n\n#include \"Globals.h\"\n#include \"BannerEntity.h\"\n#include \"BeaconEntity.h\"\n#include \"BedEntity.h\"\n#include \"BlockEntity.h\"\n#include \"EnchantingTableEntity.h\"\n#include \"BrewingstandEntity.h\"\n#include \"ChestEntity.h\"\n#include \"CommandBlockEntity.h\"\n#include \"DispenserEntity.h\"\n#include \"DropperEntity.h\"\n#include \"EnderChestEntity.h\"\n#include \"EndPortalEntity.h\"\n#include \"FlowerPotEntity.h\"\n#include \"FurnaceEntity.h\"\n#include \"HopperEntity.h\"\n#include \"MobHeadEntity.h\"\n#include \"MobSpawnerEntity.h\"\n#include \"JukeboxEntity.h\"\n#include \"NoteEntity.h\"\n#include \"SignEntity.h\"\n\n\n\n\n\ncBlockEntity::cBlockEntity(const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta, const Vector3i a_Pos, cWorld * const a_World) :\n\tm_Pos(a_Pos),\n\tm_RelX(a_Pos.x - cChunkDef::Width * FAST_FLOOR_DIV(a_Pos.x, cChunkDef::Width)),\n\tm_RelZ(a_Pos.z - cChunkDef::Width * FAST_FLOOR_DIV(a_Pos.z, cChunkDef::Width)),\n\tm_BlockType(a_BlockType),\n\tm_BlockMeta(a_BlockMeta),\n\tm_World(a_World)\n{\n}\n\n\n\n\n\nOwnedBlockEntity cBlockEntity::Clone(const Vector3i a_Pos)\n{\n\tauto res = CreateByBlockType(m_BlockType, m_BlockMeta, a_Pos, nullptr);\n\tres->CopyFrom(*this);\n\treturn res;\n}\n\n\n\n\n\ncItems cBlockEntity::ConvertToPickups() const\n{\n\treturn {};\n}\n\n\n\n\n\nvoid cBlockEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\t// Nothing to copy, but check that we're copying the right entity:\n\tASSERT(m_BlockType == a_Src.m_BlockType);\n\tASSERT(m_BlockMeta == a_Src.m_BlockMeta);\n}\n\n\n\n\n\nOwnedBlockEntity cBlockEntity::CreateByBlockType(const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta, const Vector3i a_Pos, cWorld * const a_World)\n{\n\tswitch (a_BlockType)\n\t{\n\t\t// Banners:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_WALL_BANNER:       return std::make_unique<cBannerEntity         >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\n\t\t// Others:\n\t\tcase E_BLOCK_BEACON:            return std::make_unique<cBeaconEntity         >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_BED:               return std::make_unique<cBedEntity            >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_BREWING_STAND:     return std::make_unique<cBrewingstandEntity   >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_CHEST:             return std::make_unique<cChestEntity          >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_COMMAND_BLOCK:     return std::make_unique<cCommandBlockEntity   >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_DISPENSER:         return std::make_unique<cDispenserEntity      >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_DROPPER:           return std::make_unique<cDropperEntity        >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE: return std::make_unique<cEnchantingTableEntity>(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_ENDER_CHEST:       return std::make_unique<cEnderChestEntity     >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_END_PORTAL:        return std::make_unique<cEndPortalEntity      >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_FLOWER_POT:        return std::make_unique<cFlowerPotEntity      >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_FURNACE:           return std::make_unique<cFurnaceEntity        >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_HEAD:              return std::make_unique<cMobHeadEntity        >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_HOPPER:            return std::make_unique<cHopperEntity         >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_JUKEBOX:           return std::make_unique<cJukeboxEntity        >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_LIT_FURNACE:       return std::make_unique<cFurnaceEntity        >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_MOB_SPAWNER:       return std::make_unique<cMobSpawnerEntity     >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_NOTE_BLOCK:        return std::make_unique<cNoteEntity           >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_SIGN_POST:         return std::make_unique<cSignEntity           >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_TRAPPED_CHEST:     return std::make_unique<cChestEntity          >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tcase E_BLOCK_WALLSIGN:          return std::make_unique<cSignEntity           >(a_BlockType, a_BlockMeta, a_Pos, a_World);\n\t\tdefault:\n\t\t{\n\t\t\tLOGD(\"%s: Requesting creation of an unknown block entity - block type %d (%s)\",\n\t\t\t\t__FUNCTION__, a_BlockType, ItemTypeToString(a_BlockType).c_str()\n\t\t\t);\n\t\t\tASSERT(!\"Requesting creation of an unknown block entity\");\n\t\t\treturn nullptr;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockEntity::Destroy()\n{\n}\n\n\n\n\n\nbool cBlockEntity::IsBlockEntityBlockType(const BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_BEACON:\n\t\tcase E_BLOCK_BED:\n\t\tcase E_BLOCK_BREWING_STAND:\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_COMMAND_BLOCK:\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_ENDER_CHEST:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_FLOWER_POT:\n\t\tcase E_BLOCK_FURNACE:\n\t\tcase E_BLOCK_HEAD:\n\t\tcase E_BLOCK_HOPPER:\n\t\tcase E_BLOCK_JUKEBOX:\n\t\tcase E_BLOCK_LIT_FURNACE:\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\tcase E_BLOCK_NOTE_BLOCK:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockEntity::OnAddToWorld(cWorld & a_World, cChunk & a_Chunk)\n{\n\tm_World = &a_World;\n}\n\n\n\n\n\nvoid cBlockEntity::OnRemoveFromWorld()\n{\n}\n\n\n\n\n\nvoid cBlockEntity::SetPos(const Vector3i a_NewPos)\n{\n\tASSERT(m_World == nullptr);  // Cannot move block entities that represent world blocks (only use this for cBlockArea's BEs)\n\tm_Pos = a_NewPos;\n}\n\n\n\n\n\nvoid cBlockEntity::SetWorld(cWorld * const a_World)\n{\n\tm_World = a_World;\n}\n\n\n\n\n\nbool cBlockEntity::Tick(const std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\treturn false;\n}\n"
  },
  {
    "path": "src/BlockEntities/BlockEntity.h",
    "content": "\n#pragma once\n\n#include \"ChunkDef.h\"\n\n\n\n\n\nclass cChunk;\nclass cItems;\nclass cPlayer;\nclass cWorld;\nclass cBlockEntity;\n\nusing OwnedBlockEntity = std::unique_ptr<cBlockEntity>;\nusing cBlockEntities = std::unordered_map<size_t, OwnedBlockEntity>;\n\n\n\n\n\n// tolua_begin\nclass cBlockEntity\n{\nprotected:\n\n\tcBlockEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\npublic:\n\n\t// tolua_end\n\n\tvirtual ~cBlockEntity() = default;  // force a virtual destructor in all descendants\n\n\t/** Makes an exact copy of this block entity, except for its m_World (set to nullptr), and at a new position.\n\tUses CopyFrom() to copy the properties. */\n\tOwnedBlockEntity Clone(Vector3i a_Pos);\n\n\t/** Returns the contents of this block entity that it would drop if broken.\n\tNote that the block handler will usually handle pickups for the block itself, in addition to any items returned here. */\n\tvirtual cItems ConvertToPickups() const;\n\n\t/** Copies all properties of a_Src into this entity, except for its m_World and location.\n\tEach non-abstract descendant should override to copy its specific properties, and call\n\tSuper::CopyFrom(a_Src) to copy the common ones. */\n\tvirtual void CopyFrom(const cBlockEntity & a_Src);\n\n\t/** Creates a new block entity for the specified block type at the specified absolute pos.\n\tIf a_World is valid, then the entity is created bound to that world\n\tReturns nullptr for unknown block types. */\n\tstatic OwnedBlockEntity CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World = nullptr);\n\n\t/** Called when this block entity's associated block is destroyed.\n\tIt is guaranteed that this function is called before OnRemoveFromWorld. */\n\tvirtual void Destroy();\n\n\t/** Returns true if the specified blocktype is supposed to have an associated block entity. */\n\tstatic bool IsBlockEntityBlockType(BLOCKTYPE a_BlockType);\n\n\t/** Called when the block entity object is added to a world. */\n\tvirtual void OnAddToWorld(cWorld & a_World, cChunk & a_Chunk);\n\n\t/** Called when the block entity object is removed from a world.\n\tThis occurs when the chunk it resides in is unloaded, or when the associated block is destroyed.\n\tIf it is the latter, Destroy() is guaranteed to be called first. */\n\tvirtual void OnRemoveFromWorld();\n\n\t/** Sends the packet defining the block entity to the client specified.\n\tTo send to all eligible clients, use cWorld::BroadcastBlockEntity() */\n\tvirtual void SendTo(cClientHandle & a_Client) = 0;\n\n\t/** Updates the internally stored position.\n\tNote that this should not ever be used for world-contained block entities, it is meant only for when BEs in a cBlockArea are manipulated.\n\tAsserts that the block entity is not assigned to a world. */\n\tvoid SetPos(Vector3i a_NewPos);\n\n\tvoid SetWorld(cWorld * a_World);\n\n\t/** Ticks the entity; returns true if the chunk should be marked as dirty as a result of this ticking. By default does nothing. */\n\tvirtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);\n\n\t/** Called when a player uses this entity; should open the UI window.\n\treturns true if the use was successful, return false to use the block as a \"normal\" block */\n\tvirtual bool UsedBy(cPlayer * a_Player) = 0;\n\n\t// tolua_begin\n\n\t// Position, in absolute block coordinates:\n\tVector3i GetPos() const { return m_Pos; }\n\tint GetPosX() const { return m_Pos.x; }\n\tint GetPosY() const { return m_Pos.y; }\n\tint GetPosZ() const { return m_Pos.z; }\n\n\tVector3i GetRelPos() const { return Vector3i(m_RelX, m_Pos.y, m_RelZ); }\n\n\tBLOCKTYPE GetBlockType() const { return m_BlockType; }\n\n\tcWorld * GetWorld() const { return m_World; }\n\n\tint GetChunkX() const { return FAST_FLOOR_DIV(m_Pos.x, cChunkDef::Width); }\n\tint GetChunkZ() const { return FAST_FLOOR_DIV(m_Pos.z, cChunkDef::Width); }\n\n\tint GetRelX() const { return m_RelX; }\n\tint GetRelZ() const { return m_RelZ; }\n\n\t// tolua_end\n\n\nprotected:\n\n\t/** Position in absolute block coordinates */\n\tVector3i m_Pos;\n\n\t/** Position relative to the chunk, used to speed up ticking */\n\tint m_RelX, m_RelZ;\n\n\t/** The blocktype representing this particular instance in the world.\n\tMainly used for multi-block-type entities, such as furnaces / lit furnaces. */\n\tBLOCKTYPE m_BlockType;\n\n\t/** The block meta representing this particular instance in the world\n\tMainly used for directional entities, such as dispensers. */\n\tNIBBLETYPE m_BlockMeta;\n\n\tcWorld * m_World;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/BlockEntityWithItems.cpp",
    "content": "// BlockEntityWithItems.cpp\n\n#include \"Globals.h\"\n#include \"BlockEntityWithItems.h\"\n#include \"../Simulator/RedstoneSimulator.h\"\n\n\n\n\n\ncBlockEntityWithItems::cBlockEntityWithItems(\n\tBLOCKTYPE a_BlockType,\n\tNIBBLETYPE a_BlockMeta,\n\tVector3i a_Pos,\n\tint a_ItemGridWidth, int a_ItemGridHeight,\n\tcWorld * a_World\n):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tcBlockEntityWindowOwner(this),\n\tm_Contents(a_ItemGridWidth, a_ItemGridHeight)\n{\n\tm_Contents.AddListener(*this);\n}\n\n\n\n\n\ncItems cBlockEntityWithItems::ConvertToPickups() const\n{\n\tcItems Pickups;\n\tPickups.AddItemGrid(m_Contents);\n\treturn Pickups;\n}\n\n\n\n\n\nvoid cBlockEntityWithItems::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cBlockEntityWithItems &>(a_Src);\n\tm_Contents.CopyFrom(src.m_Contents);\n}\n\n\n\n\n\nvoid cBlockEntityWithItems::OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum)\n{\n\tUNUSED(a_SlotNum);\n\tASSERT(a_Grid == &m_Contents);\n\n\tif (m_World == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tif (GetWindow() != nullptr)\n\t{\n\t\tGetWindow()->BroadcastWholeWindow();\n\t}\n\n\tm_World->MarkChunkDirty(GetChunkX(), GetChunkZ());\n\n\t// Notify comparators:\n\tm_World->WakeUpSimulators(m_Pos);\n}\n"
  },
  {
    "path": "src/BlockEntities/BlockEntityWithItems.h",
    "content": "\n// BlockEntityWithItems.h\n\n// Declares the cBlockEntityWithItems class representing a common ancestor for all block entities that have an ItemGrid\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"../ItemGrid.h\"\n#include \"../UI/WindowOwner.h\"\n#include \"../World.h\"\n\n\n\n\n\n// tolua_begin\nclass cBlockEntityWithItems :\n\tpublic cBlockEntity,\n\t// tolua_end\n\tpublic cItemGrid::cListener,\n\t// tolua_begin\n\tpublic cBlockEntityWindowOwner\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\tcBlockEntityWithItems(\n\t\tBLOCKTYPE a_BlockType,                      // Type of the block that the entity represents\n\t\tNIBBLETYPE a_BlockMeta,                     // Meta of the block that the entity represents\n\t\tVector3i a_Pos,                             // Abs position of the block entity\n\t\tint a_ItemGridWidth, int a_ItemGridHeight,  // Dimensions of the ItemGrid\n\t\tcWorld * a_World                            // Optional world to assign to the entity\n\t);\n\n\t// cBlockEntity overrides:\n\tvirtual cItems ConvertToPickups() const override;\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\n\t// tolua_begin\n\n\tconst cItem & GetSlot(int a_SlotNum)    const { return m_Contents.GetSlot(a_SlotNum); }\n\tconst cItem & GetSlot(int a_X, int a_Y) const { return m_Contents.GetSlot(a_X, a_Y); }\n\n\tvoid SetSlot(int a_SlotNum,    const cItem & a_Item) { m_Contents.SetSlot(a_SlotNum, a_Item); }\n\tvoid SetSlot(int a_X, int a_Y, const cItem & a_Item) { m_Contents.SetSlot(a_X, a_Y, a_Item); }\n\n\t/** Returns the ItemGrid used for storing the contents */\n\tcItemGrid & GetContents(void) { return m_Contents; }\n\n\t// tolua_end\n\n\t/** Const version of the GetContents() function for C++ type-safety */\n\tconst cItemGrid & GetContents(void) const { return m_Contents; }\n\nprotected:\n\n\tcItemGrid m_Contents;\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum) override;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/BrewingstandEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"BrewingstandEntity.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../UI/BrewingstandWindow.h\"\n#include \"../Entities/Player.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\ncBrewingstandEntity::cBrewingstandEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, ContentsWidth, ContentsHeight, a_World),\n\tm_IsBrewing(false),\n\tm_TimeBrewed(0),\n\tm_RemainingFuel(0)\n{\n\tm_Contents.AddListener(*this);\n}\n\n\n\n\n\nvoid cBrewingstandEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cBrewingstandEntity &>(a_Src);\n\tm_IsBrewing = src.m_IsBrewing;\n\tm_CurrentBrewingRecipes = src.m_CurrentBrewingRecipes;\n\tm_Results = src.m_Results;\n\tm_TimeBrewed = src.m_TimeBrewed;\n\tm_RemainingFuel = src.m_RemainingFuel;\n}\n\n\n\n\n\nvoid cBrewingstandEntity::OnRemoveFromWorld()\n{\n\tconst auto Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\t// Tell window its owner is destroyed:\n\t\tWindow->OwnerDestroyed();\n\t}\n}\n\n\n\n\n\nvoid cBrewingstandEntity::SendTo(cClientHandle & a_Client)\n{\n\t// Nothing needs to be sent\n\tUNUSED(a_Client);\n}\n\n\n\n\n\nbool cBrewingstandEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\n\tif (!m_IsBrewing)\n\t{\n\t\treturn false;\n\t}\n\n\t// The necessary brewing time, has been reached\n\tif (m_TimeBrewed >= m_NeedBrewingTime)\n\t{\n\t\tBroadcastProgress(0, 0);\n\t\tm_IsBrewing = false;\n\t\tm_TimeBrewed = 0;\n\n\t\t// Return if the hook has been cancelled\n\t\tif (cPluginManager::Get()->CallHookBrewingCompleting(*m_World, *this))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Decrease item count, full stacks are allowed in the ingredient slot\n\t\tcItem Ingredient = m_Contents.GetSlot(bsIngredient);\n\t\tIngredient.m_ItemCount -= 1;\n\t\tm_Contents.SetSlot(bsIngredient, Ingredient);\n\n\t\t// Fuel slot\n\t\tm_RemainingFuel--;\n\t\tif (m_RemainingFuel <= 0)\n\t\t{\n\t\t\tif (!m_Contents.GetSlot(bsFuel).IsEmpty())\n\t\t\t{\n\t\t\t\tcItem Fuel = m_Contents.GetSlot(bsFuel);\n\t\t\t\tFuel.m_ItemCount -= 1;\n\t\t\t\tm_Contents.SetSlot(bsFuel, Fuel);\n\t\t\t\tm_RemainingFuel = 20;\n\t\t\t\tBroadcastProgress(1, m_RemainingFuel);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tBroadcastProgress(1, m_RemainingFuel);\n\t\t}\n\n\n\t\t// Loop over all bottle slots and update available bottles\n\t\tconst cBrewingRecipes::cRecipe * Recipe = nullptr;\n\t\tfor (std::size_t i = 0; i < 3; i++)\n\t\t{\n\t\t\tif (m_Contents.GetSlot(static_cast<int>(i)).IsEmpty() || (m_CurrentBrewingRecipes[i] == nullptr))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tRecipe = m_CurrentBrewingRecipes[i];\n\t\t\tm_Contents.SetSlot(static_cast<int>(i), Recipe->Output.CopyOne());\n\t\t}\n\n\t\t// Brewing process completed\n\t\tm_World->BroadcastSoundEffect(\"block.brewing_stand.brew\", m_Pos, 1.0f, 1.0f);\n\t\tcPluginManager::Get()->CallHookBrewingCompleted(*m_World, *this);\n\t\treturn true;\n\t}\n\n\tm_TimeBrewed++;\n\tUpdateProgressBars(false);\n\treturn false;\n}\n\n\n\n\n\nbool cBrewingstandEntity::UsedBy(cPlayer * a_Player)\n{\n\ta_Player->GetStatistics().Custom[CustomStatistic::InteractWithBrewingstand]++;\n\n\tcWindow * Window = GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tOpenWindow(new cBrewingstandWindow(this));\n\t\tWindow = GetWindow();\n\t}\n\n\tif (Window != nullptr)\n\t{\n\t\tif (a_Player->GetWindow() != Window)\n\t\t{\n\t\t\ta_Player->OpenWindow(*Window);\n\t\t}\n\t}\n\n\tif (m_IsBrewing)\n\t{\n\t\tBroadcastProgress(0, m_NeedBrewingTime - m_TimeBrewed);\n\t}\n\telse\n\t{\n\t\tBroadcastProgress(0, 0);\n\t}\n\tBroadcastProgress(1, m_RemainingFuel);\n\treturn true;\n}\n\n\n\n\n\nvoid cBrewingstandEntity::BroadcastProgress(size_t a_ProgressbarID, short a_Value)\n{\n\tcWindow * Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\tWindow->SetProperty(a_ProgressbarID, a_Value);\n\t}\n}\n\n\n\n\n\nvoid cBrewingstandEntity::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)\n{\n\tSuper::OnSlotChanged(a_ItemGrid, a_SlotNum);\n\n\tASSERT(a_ItemGrid == &m_Contents);\n\n\t// Check for fuel\n\tif (m_RemainingFuel <= 0)\n\t{\n\t\tif (GetSlot(bsFuel).IsEmpty())\n\t\t{\n\t\t\t// No remaining fuel stop brewing and bail out\n\t\t\tm_IsBrewing = false;\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Fuel is available, refill\n\t\t\tm_RemainingFuel = 20;\n\t\t\tBroadcastProgress(1, m_RemainingFuel);\n\t\t\tcItem Fuel = m_Contents.GetSlot(bsFuel);\n\t\t\tFuel.m_ItemCount -= 1;\n\t\t\tm_Contents.SetSlot(bsFuel, Fuel);\n\t\t}\n\t}\n\n\t// Check if still a item is in the ingredient slot\n\tif (GetSlot(bsIngredient).IsEmpty())\n\t{\n\t\tif (m_IsBrewing)\n\t\t{\n\t\t\t// Cancel brewing\n\t\t\tBroadcastProgress(0, 0);\n\t\t\tm_IsBrewing = false;\n\t\t\tm_TimeBrewed = 0;\n\t\t}\n\t\treturn;\n\t}\n\n\t// Recheck the bottles\n\tcBrewingRecipes * BR = cRoot::Get()->GetBrewingRecipes();\n\tconst cBrewingRecipes::cRecipe * Recipe = nullptr;\n\tbool Stop = true;\n\tfor (std::size_t i = 0; i < 3; i++)\n\t{\n\t\tif (GetSlot(static_cast<int>(i)).IsEmpty())\n\t\t{\n\t\t\tm_CurrentBrewingRecipes[i] = nullptr;\n\t\t\tm_Results[i].Clear();\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (m_CurrentBrewingRecipes[i] != nullptr)\n\t\t{\n\t\t\tRecipe = m_CurrentBrewingRecipes[i];\n\t\t\tif (Recipe->Ingredient.IsEqual(GetSlot(bsIngredient)) && Recipe->Input.IsEqual(GetSlot(static_cast<int>(i))))\n\t\t\t{\n\t\t\t\tStop = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tRecipe = BR->GetRecipeFrom(m_Contents.GetSlot(static_cast<int>(i)), m_Contents.GetSlot(bsIngredient));\n\t\tif (Recipe != nullptr)\n\t\t{\n\t\t\t// Found a brewing recipe for the items\n\t\t\tm_CurrentBrewingRecipes[i] = Recipe;\n\t\t\tm_Results[i] = Recipe->Output.CopyOne();\n\t\t\tStop = false;\n\t\t}\n\t}\n\n\tif (Stop)\n\t{\n\t\tif (m_IsBrewing)\n\t\t{\n\t\t\t// Cancel brewing\n\t\t\tBroadcastProgress(0, 0);\n\t\t\tm_IsBrewing = false;\n\t\t\tm_TimeBrewed = 0;\n\t\t}\n\t\treturn;\n\t}\n\n\t// Start brewing process, if not running\n\tif (!m_IsBrewing)\n\t{\n\t\tm_IsBrewing = true;\n\t}\n}\n\n\n\n\n\nvoid cBrewingstandEntity::UpdateProgressBars(bool a_ForceUpdate)\n{\n\t// Send an update every 3rd tick, using a higher value makes the progressbar look ugly:\n\tif (!a_ForceUpdate && ((m_World->GetWorldTickAge() % 3_tick) != 0_tick))\n\t{\n\t\treturn;\n\t}\n\n\tBroadcastProgress(0, m_NeedBrewingTime - m_TimeBrewed);\n}\n\n\n\n\n\nvoid cBrewingstandEntity::ContinueBrewing(void)\n{\n\t// Continue brewing if number is greater than 0\n\tif ((m_TimeBrewed > 0) && (m_RemainingFuel > 0))\n\t{\n\t\tm_IsBrewing = true;\n\t}\n}\n\n\n\n\n\nvoid cBrewingstandEntity::LoadRecipes(void)\n{\n\tif (GetSlot(bsIngredient).IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\tcBrewingRecipes * BR = cRoot::Get()->GetBrewingRecipes();\n\tconst cBrewingRecipes::cRecipe * Recipe = nullptr;\n\tfor (std::size_t i = 0; i < 3; i++)\n\t{\n\t\tif (GetSlot(static_cast<int>(i)).IsEmpty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tRecipe = BR->GetRecipeFrom(GetSlot(static_cast<int>(i)), GetSlot(bsIngredient));\n\t\tif (Recipe != nullptr)\n\t\t{\n\t\t\tm_CurrentBrewingRecipes[i] = Recipe;\n\t\t\tm_Results[i] = Recipe->Output.CopyOne();\n\t\t}\n\t}\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/BlockEntities/BrewingstandEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockEntityWithItems.h\"\n#include \"../BrewingRecipes.h\"\n#include \"../Root.h\"\n\n\n\n\n\nclass cClientHandle;\n\n\n\n\n\n// tolua_begin\nclass cBrewingstandEntity :\n\tpublic cBlockEntityWithItems\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntityWithItems;\n\n\t// tolua_begin\n\npublic:\n\n\tenum\n\t{\n\t\tbsLeftBottle        = 0,  // Left bottle slot number\n\t\tbsMiddleBottle      = 1,  // Middle bottle slot number\n\t\tbsRightBottle       = 2,  // Right bottle slot number\n\t\tbsIngredient        = 3,  // Top ingredient slot number\n\t\tbsFuel              = 4,  // Top left fuel slot number\n\n\t\tContentsWidth       = 5,\n\t\tContentsHeight      = 1,\n\t};\n\n\t// tolua_end\n\n\t/** Constructor used for normal operation */\n\tcBrewingstandEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual void OnRemoveFromWorld() override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\n\t// tolua_begin\n\n\t/** Returns the time until the current items finishes brewing, in ticks */\n\tshort GetBrewingTimeLeft(void) const { return m_NeedBrewingTime - m_TimeBrewed; }\n\n\t/** Returns the time that the current items has been brewing, in ticks */\n\tshort GetTimeBrewed(void) { return m_TimeBrewed; }\n\n\t/** Returns the remaining fuel that is left. */\n\tshort GetRemainingFuel(void) { return m_RemainingFuel; }\n\n\t/** Returns the item in the left bottle slot  */\n\tconst cItem & GetLeftBottleSlot(void) const { return GetSlot(bsLeftBottle); }\n\n\t/** Returns the item in the middle bottle slot  */\n\tconst cItem & GetMiddleBottleSlot(void) const { return GetSlot(bsMiddleBottle); }\n\n\t/** Returns the item in the right bottle slot  */\n\tconst cItem & GetRightBottleSlot(void) const { return GetSlot(bsRightBottle); }\n\n\t/** Returns the item in the ingredient slot  */\n\tconst cItem & GetIndgredientSlot(void) const { return GetSlot(bsIngredient); }\n\n\t/** Returns the item in the fuel slot. */\n\tconst cItem & GetFuelSlot(void) const { return GetSlot(bsFuel); }\n\n\t/** Get the expected result item for the given slot number */\n\tconst cItem & GetResultItem(size_t a_SlotNumber) { return m_Results[a_SlotNumber]; }\n\n\t/** Sets the item in the left bottle slot  */\n\tvoid SetLeftBottleSlot(const cItem & a_Item) { SetSlot(bsLeftBottle, a_Item); }\n\n\t/** Sets the item in the middle bottle slot  */\n\tvoid SetMiddleBottleSlot(const cItem & a_Item) { SetSlot(bsMiddleBottle, a_Item); }\n\n\t/** Sets the item in the right bottle slot  */\n\tvoid SetRightBottleSlot(const cItem & a_Item) { SetSlot(bsRightBottle, a_Item); }\n\n\t/** Sets the item in the ingredient slot  */\n\tvoid SetIngredientSlot(const cItem & a_Item) { SetSlot(bsIngredient, a_Item); }\n\n\t/** Sets the item in the fuel slot  */\n\tvoid SetFuelSlot(const cItem & a_Item) { SetSlot(bsFuel, a_Item); }\n\n\t// tolua_end\n\n\t/** Sets the current brewing time. Will be called if the brewing stand gets loaded from the world. */\n\tvoid SetTimeBrewed(short a_TimeBrewed) { m_TimeBrewed = a_TimeBrewed; }\n\n\t/** Sets the remaining fuel. Will be called if the brewing stand gets loaded from the world. */\n\tvoid SetRemainingFuel(short a_RemainingFuel) { m_RemainingFuel = a_RemainingFuel; }\n\n\t/** Starts the brewing proccess. Will be called if the brewing stand gets loaded from the world. */\n\tvoid ContinueBrewing(void);\n\n\t/** Gets the recipes. Will be called if the brewing stand gets loaded from the world. */\n\tvoid LoadRecipes(void);\n\nprotected:\n\n\t/** Set to true if the brewing stand is brewing an item */\n\tbool m_IsBrewing;\n\n\t/** Brewing time is 400 ticks */\n\tconst short m_NeedBrewingTime = 400;\n\n\t/** Store the current brewing recipes */\n\tstd::array<const cBrewingRecipes::cRecipe *, 3> m_CurrentBrewingRecipes = {};\n\n\t/** Result items for the  bottle inputs */\n\tstd::array<cItem, 3> m_Results;\n\n\t/** Amount of ticks that the current item has been brewed */\n\tshort m_TimeBrewed;\n\n\t/** The remaining fuel for the brewing stand. It's the amount of brewing operations that can be done. */\n\tshort m_RemainingFuel;\n\n\t/** Sends the specified progressbar value to all clients of the window */\n\tvoid BroadcastProgress(size_t a_ProgressbarID, short a_Value);\n\n\t// /** Broadcasts progressbar updates, if needed */\n\tvoid UpdateProgressBars(bool a_ForceUpdate = false);\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tBannerEntity.cpp\n\tBeaconEntity.cpp\n\tBedEntity.cpp\n\tBlockEntity.cpp\n\tBlockEntityWithItems.cpp\n\tBrewingstandEntity.cpp\n\tChestEntity.cpp\n\tCommandBlockEntity.cpp\n\tDispenserEntity.cpp\n\tDropSpenserEntity.cpp\n\tDropperEntity.cpp\n\tEnchantingTableEntity.cpp\n\tEndPortalEntity.cpp\n\tEnderChestEntity.cpp\n\tFlowerPotEntity.cpp\n\tFurnaceEntity.cpp\n\tHopperEntity.cpp\n\tJukeboxEntity.cpp\n\tMobHeadEntity.cpp\n\tMobSpawnerEntity.cpp\n\tNoteEntity.cpp\n\tSignEntity.cpp\n\n\tBannerEntity.h\n\tBeaconEntity.h\n\tBedEntity.h\n\tBlockEntity.h\n\tBlockEntityWithItems.h\n\tBrewingstandEntity.h\n\tChestEntity.h\n\tCommandBlockEntity.h\n\tDispenserEntity.h\n\tDropSpenserEntity.h\n\tDropperEntity.h\n\tEnchantingTableEntity.h\n\tEndPortalEntity.h\n\tEnderChestEntity.h\n\tFlowerPotEntity.h\n\tFurnaceEntity.h\n\tHopperEntity.h\n\tJukeboxEntity.h\n\tMobHeadEntity.h\n\tMobSpawnerEntity.h\n\tNoteEntity.h\n\tSignEntity.h\n)\n"
  },
  {
    "path": "src/BlockEntities/ChestEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ChestEntity.h\"\n#include \"../Chunk.h\"\n#include \"../BlockInfo.h\"\n#include \"../Item.h\"\n#include \"../Entities/Player.h\"\n#include \"../UI/ChestWindow.h\"\n#include \"../ClientHandle.h\"\n#include \"../Mobs/Ocelot.h\"\n\n\n\n\n\ncChestEntity::cChestEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, ContentsWidth, ContentsHeight, a_World),\n\tm_NumActivePlayers(0),\n\tm_Neighbour(nullptr)\n{\n}\n\n\n\n\n\ncChestEntity & cChestEntity::GetPrimaryChest()\n{\n\tif (m_Neighbour == nullptr)\n\t{\n\t\treturn *this;\n\t}\n\n\t// The primary chest should be the one with lesser X or Z coord:\n\treturn (\n\t\t(m_Neighbour->GetPosX() < GetPosX()) ||\n\t\t(m_Neighbour->GetPosZ() < GetPosZ())\n\t) ? *m_Neighbour : *this;\n}\n\n\n\n\n\ncChestEntity * cChestEntity::GetSecondaryChest()\n{\n\t// If we're the primary, then our neighbour is the secondary, and vice versa:\n\treturn (&GetPrimaryChest() == this) ? m_Neighbour : this;\n}\n\n\n\n\n\nbool cChestEntity::ScanNeighbour(cChunk & a_Chunk, Vector3i a_Position)\n{\n\tconst auto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(a_Position);\n\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\t// If a chest was in fact there, they'll find us when their chunk loads.\n\t\treturn false;\n\t}\n\n\tconst auto BlockEntity = Chunk->GetBlockEntityRel(a_Position);\n\n\tif ((BlockEntity == nullptr) || (BlockEntity->GetBlockType() != m_BlockType))\n\t{\n\t\t// Neighbouring block is not the same type of chest:\n\t\treturn false;\n\t}\n\n\tm_Neighbour = static_cast<cChestEntity *>(BlockEntity);\n\treturn true;\n}\n\n\n\n\n\nvoid cChestEntity::DestroyWindow()\n{\n\tconst auto Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\tWindow->OwnerDestroyed();\n\t}\n}\n\n\n\n\n\nbool cChestEntity::IsBlocked()\n{\n\treturn (\n\t\t(GetPosY() < cChunkDef::Height - 1) &&\n\t\t(\n\t\t\t!cBlockInfo::IsTransparent(GetWorld()->GetBlock(GetPos().addedY(1))) ||\n\t\t\t!cOcelot::IsCatSittingOnBlock(GetWorld(), Vector3d(GetPos()))\n\t\t)\n\t);\n}\n\n\n\n\n\nvoid cChestEntity::OpenNewWindow(void)\n{\n\tif (m_Neighbour != nullptr)\n\t{\n\t\tASSERT(&GetPrimaryChest() == this);  // Should only open windows for the primary chest.\n\n\t\tOpenWindow(new cChestWindow(this, m_Neighbour));\n\t}\n\telse\n\t{\n\t\t// There is no chest neighbour, open a single-chest window:\n\t\tOpenWindow(new cChestWindow(this));\n\t}\n}\n\n\n\n\n\nvoid cChestEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cChestEntity &>(a_Src);\n\tm_Contents.CopyFrom(src.m_Contents);\n\n\t// Reset the neighbor and player count, there's no sense in copying these:\n\tm_Neighbour = nullptr;\n\tm_NumActivePlayers = 0;\n}\n\n\n\n\n\nvoid cChestEntity::OnAddToWorld(cWorld & a_World, cChunk & a_Chunk)\n{\n\tSuper::OnAddToWorld(a_World, a_Chunk);\n\n\t// Scan horizontally adjacent blocks for any neighbouring chest of the same type:\n\tif (\n\t\tconst auto Position = GetRelPos();\n\n\t\tScanNeighbour(a_Chunk, Position.addedX(-1)) ||\n\t\tScanNeighbour(a_Chunk, Position.addedX(+1)) ||\n\t\tScanNeighbour(a_Chunk, Position.addedZ(-1)) ||\n\t\tScanNeighbour(a_Chunk, Position.addedZ(+1))\n\t)\n\t{\n\t\tm_Neighbour->m_Neighbour = this;\n\t\tm_Neighbour->DestroyWindow();  // Force neighbour's window shut. Does Mojang server do this or should a double window open?\n\t}\n}\n\n\n\n\n\nvoid cChestEntity::OnRemoveFromWorld()\n{\n\tif (m_Neighbour != nullptr)\n\t{\n\t\t// Neighbour may share a window with us, force the window shut:\n\t\tm_Neighbour->DestroyWindow();\n\t\tm_Neighbour->m_Neighbour = nullptr;\n\t}\n\n\tDestroyWindow();\n}\n\n\n\n\n\nvoid cChestEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n\n\n\n\n\nbool cChestEntity::UsedBy(cPlayer * a_Player)\n{\n\tif (IsBlocked())\n\t{\n\t\t// Obstruction, don't open\n\t\treturn true;\n\t}\n\n\tif ((m_Neighbour != nullptr) && m_Neighbour->IsBlocked())\n\t{\n\t\treturn true;\n\t}\n\n\tif (m_BlockType == E_BLOCK_CHEST)\n\t{\n\t\ta_Player->GetStatistics().Custom[CustomStatistic::OpenChest]++;\n\t}\n\telse  // E_BLOCK_TRAPPED_CHEST\n\t{\n\t\ta_Player->GetStatistics().Custom[CustomStatistic::TriggerTrappedChest]++;\n\t}\n\n\tauto & PrimaryChest = GetPrimaryChest();\n\tcWindow * Window = PrimaryChest.GetWindow();\n\n\t// If the window is not created, open it anew:\n\tif (Window == nullptr)\n\t{\n\t\tPrimaryChest.OpenNewWindow();\n\t\tWindow = PrimaryChest.GetWindow();\n\t}\n\n\t// Open the window for the player:\n\tif (Window != nullptr)\n\t{\n\t\tif (a_Player->GetWindow() != Window)\n\t\t{\n\t\t\ta_Player->OpenWindow(*Window);\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cChestEntity::OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum)\n{\n\tASSERT(a_Grid == &m_Contents);\n\n\t// Have cBlockEntityWithItems update redstone and try to broadcast our window:\n\tSuper::OnSlotChanged(a_Grid, a_SlotNum);\n\n\tcWindow * Window = GetWindow();\n\tif ((Window == nullptr) && (m_Neighbour != nullptr))\n\t{\n\t\t// Window was null, Super will have failed.\n\t\t// Neighbour might own the window:\n\t\tWindow = m_Neighbour->GetWindow();\n\t}\n\n\tif (Window != nullptr)\n\t{\n\t\tWindow->BroadcastWholeWindow();\n\t}\n}\n"
  },
  {
    "path": "src/BlockEntities/ChestEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockEntityWithItems.h\"\n#include \"../Simulator/RedstoneSimulator.h\"\n\n\n\n\n\nclass cClientHandle;\n\n\n\n\n\n// tolua_begin\nclass cChestEntity :\n\tpublic cBlockEntityWithItems\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntityWithItems;\n\n\t// tolua_begin\n\npublic:\n\n\tenum\n\t{\n\t\tContentsHeight = 3,\n\t\tContentsWidth  = 9,\n\t} ;\n\n\t// tolua_end\n\n\tcChestEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t/** Gets the number of players who currently have this chest open */\n\tint GetNumberOfPlayers(void) const { return m_NumActivePlayers; }\n\n\t/** Returns the associated primary chest. */\n\tcChestEntity & GetPrimaryChest();\n\n\t/** Returns the associated secondary chest, if any. */\n\tcChestEntity * GetSecondaryChest();\n\n\t/** Search the given horizontally adjacent relative position for a neighbouring chest of the same type.\n\tIf found, links them together with ourselves and returns true. */\n\tbool ScanNeighbour(cChunk & a_Chunk, Vector3i a_Position);\n\n\t/** Sets the number of players who currently have this chest open */\n\tvoid SetNumberOfPlayers(int a_NumActivePlayers) { m_NumActivePlayers = a_NumActivePlayers; }\n\nprivate:\n\n\t/** Number of players who currently have this chest open */\n\tint m_NumActivePlayers;\n\n\t/** Neighbouring chest that links to form a double chest */\n\tcChestEntity * m_Neighbour;\n\n\t/** Forces any players to close the owned window. */\n\tvoid DestroyWindow();\n\n\t/** Returns true if the chest should not be accessible by players. */\n\tbool IsBlocked();\n\n\t/** Opens a new chest window where this is the primary chest and any neighbour is the secondary. */\n\tvoid OpenNewWindow();\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual void OnAddToWorld(cWorld & a_World, cChunk & a_Chunk) override;\n\tvirtual void OnRemoveFromWorld() override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\n\t/** cItemGrid::cListener overrides: */\n\tvirtual void OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum) override;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/CommandBlockEntity.cpp",
    "content": "\n// CommandBlockEntity.cpp\n\n// Implements the cCommandBlockEntity class representing a single command block in the world\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n#include \"CommandBlockEntity.h\"\n\n#include \"../CommandOutput.h\"\n#include \"../Root.h\"\n#include \"../Server.h\"  // ExecuteConsoleCommand()\n#include \"../ChatColor.h\"\n#include \"../World.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncCommandBlockEntity::cCommandBlockEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tm_ShouldExecute(false),\n\tm_Result(0)\n{\n\tASSERT(a_BlockType == E_BLOCK_COMMAND_BLOCK);\n}\n\n\n\n\n\nbool cCommandBlockEntity::UsedBy(cPlayer * a_Player)\n{\n\t// Nothing to do\n\tUNUSED(a_Player);\n\treturn true;\n}\n\n\n\n\n\nvoid cCommandBlockEntity::SetCommand(const AString & a_Cmd)\n{\n\tm_Command = a_Cmd;\n}\n\n\n\n\n\nvoid cCommandBlockEntity::SetLastOutput(const AString & a_LastOut)\n{\n\tm_LastOutput = a_LastOut;\n}\n\n\n\n\n\nvoid cCommandBlockEntity::SetResult(const NIBBLETYPE a_Result)\n{\n\tm_Result = a_Result;\n}\n\n\n\n\n\nconst AString & cCommandBlockEntity::GetCommand(void) const\n{\n\treturn m_Command;\n}\n\n\n\n\n\nconst AString & cCommandBlockEntity::GetLastOutput(void) const\n{\n\treturn m_LastOutput;\n}\n\n\n\n\n\nNIBBLETYPE cCommandBlockEntity::GetResult(void) const\n{\n\treturn m_Result;\n}\n\n\n\n\n\nvoid cCommandBlockEntity::Activate(void)\n{\n\tm_ShouldExecute = true;\n}\n\n\n\n\n\nvoid cCommandBlockEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cCommandBlockEntity &>(a_Src);\n\tm_Command = src.m_Command;\n\tm_LastOutput = src.m_LastOutput;\n\tm_Result = src.m_Result;\n\tm_ShouldExecute = src.m_ShouldExecute;\n}\n\n\n\n\n\nbool cCommandBlockEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\tUNUSED(a_Chunk);\n\tif (!m_ShouldExecute)\n\t{\n\t\treturn false;\n\t}\n\n\tm_ShouldExecute = false;\n\tExecute();\n\treturn true;\n}\n\n\n\n\n\nvoid cCommandBlockEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n\n\n\n\n\nvoid cCommandBlockEntity::Execute()\n{\n\tASSERT(m_World != nullptr);  // Execute should not be called before the command block is attached to a world\n\n\tif (!m_World->AreCommandBlocksEnabled())\n\t{\n\t\treturn;\n\t}\n\n\tif (m_Command.empty())\n\t{\n\t\treturn;\n\t}\n\n\tclass CommandBlockOutCb :\n\t\tpublic cLogCommandDeleteSelfOutputCallback\n\t{\n\t\tcCommandBlockEntity * m_CmdBlock;\n\n\tpublic:\n\t\tCommandBlockOutCb(cCommandBlockEntity * a_CmdBlock) : m_CmdBlock(a_CmdBlock) {}\n\n\t\tvirtual void Out(const AString & a_Text) override\n\t\t{\n\t\t\t// Overwrite field\n\t\t\tm_CmdBlock->SetLastOutput(cClientHandle::FormatChatPrefix(m_CmdBlock->GetWorld()->ShouldUseChatPrefixes(), \"SUCCESS\", cChatColor::Green, cChatColor::White) + a_Text);\n\t\t}\n\t};\n\n\tAString RealCommand = m_Command;\n\n\t// Remove leading slash if it exists, since console commands don't use them\n\tif (RealCommand[0] == '/')\n\t{\n\t\tRealCommand = RealCommand.substr(1, RealCommand.length());\n\t}\n\n\t// Administrator commands are not executable by command blocks:\n\tif (\n\t\t(RealCommand != \"stop\") &&\n\t\t(RealCommand != \"restart\") &&\n\t\t(RealCommand != \"kick\") &&\n\t\t(RealCommand != \"ban\") &&\n\t\t(RealCommand != \"ipban\")\n\t)\n\t{\n\t\tcServer * Server = cRoot::Get()->GetServer();\n\t\tLOGD(\"cCommandBlockEntity: Executing command %s\", m_Command.c_str());\n\t\tServer->QueueExecuteConsoleCommand(RealCommand, *new CommandBlockOutCb(this));\n\t}\n\telse\n\t{\n\t\tSetLastOutput(cClientHandle::FormatChatPrefix(GetWorld()->ShouldUseChatPrefixes(), \"FAILURE\", cChatColor::Rose, cChatColor::White) + \"Adminstration commands can not be executed\");\n\t\tLOGD(\"cCommandBlockEntity: Prevented execution of administration command %s\", m_Command.c_str());\n\t}\n\n\t// TODO 2014-01-18 xdot: Update the signal strength.\n\tm_Result = 0;\n}\n\n\n\n\n"
  },
  {
    "path": "src/BlockEntities/CommandBlockEntity.h",
    "content": "\n// CommandBlockEntity.h\n\n// Declares the cCommandBlockEntity class representing a single command block in the world\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cCommandBlockEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\t/** Creates a new empty command block entity */\n\tcCommandBlockEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\n\tvoid SetLastOutput(const AString & a_LastOut);\n\n\tvoid SetResult(const NIBBLETYPE a_Result);\n\n\t// tolua_begin\n\n\t/** Sets the command block to execute a command in the next tick */\n\tvoid Activate(void);\n\n\t/** Sets the command */\n\tvoid SetCommand(const AString & a_Cmd);\n\n\t/** Retrieves stored command */\n\tconst AString & GetCommand(void) const;\n\n\t/** Retrieves the last line of output generated by the command block */\n\tconst AString & GetLastOutput(void) const;\n\n\t/** Retrieves the result (signal strength) of the last operation */\n\tNIBBLETYPE GetResult(void) const;\n\n\t// tolua_end\n\nprivate:\n\n\t/** Executes the associated command */\n\tvoid Execute();\n\n\tbool m_ShouldExecute;\n\n\tAString m_Command;\n\n\tAString m_LastOutput;\n\n\tNIBBLETYPE m_Result;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/DispenserEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"DispenserEntity.h\"\n#include \"../Chunk.h\"\n#include \"../BlockInfo.h\"\n#include \"../Defines.h\"\n#include \"../World.h\"\n#include \"../Entities/Boat.h\"\n#include \"../Entities/ProjectileEntity.h\"\n#include \"../Simulator/FluidSimulator.h\"\n#include \"../Items/ItemSpawnEgg.h\"\n#include \"../Items/ItemDye.h\"\n\n\n\ncDispenserEntity::cDispenserEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World)\n{\n\tASSERT(a_BlockType == E_BLOCK_DISPENSER);\n}\n\n\n\n\n\nvoid cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)\n{\n\tVector3i DispRelCoord(GetRelPos());\n\tauto Meta = a_Chunk.GetMeta(DispRelCoord);\n\tAddDropSpenserDir(DispRelCoord, Meta);\n\tauto DispChunk = a_Chunk.GetRelNeighborChunkAdjustCoords(DispRelCoord);\n\tif (DispChunk == nullptr)\n\t{\n\t\t// Would dispense into / interact with a non-loaded chunk, ignore the tick\n\t\treturn;\n\t}\n\n\tBLOCKTYPE DispBlock = DispChunk->GetBlock(DispRelCoord);\n\tauto DispAbsCoord = DispChunk->RelativeToAbsolute(DispRelCoord);\n\n\t// Dispense the item:\n\tconst cItem & SlotItem = m_Contents.GetSlot(a_SlotNum);\n\tif (ItemCategory::IsMinecart(SlotItem.m_ItemType) && IsBlockRail(DispBlock))  // only actually place the minecart if there are rails!\n\t{\n\t\tif (m_World->SpawnMinecart(DispAbsCoord.x + 0.5, DispAbsCoord.y + 0.5, DispAbsCoord.z + 0.5, SlotItem.m_ItemType) != cEntity::INVALID_ID)\n\t\t{\n\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t}\n\t\treturn;\n\t}\n\tswitch (SlotItem.m_ItemType)\n\t{\n\t\tcase E_ITEM_BUCKET:\n\t\t{\n\t\t\tLOGD(\"Dispensing empty bucket in slot %d; DispBlock is \\\"%s\\\" (%d).\", a_SlotNum, ItemTypeToString(DispBlock).c_str(), DispBlock);\n\t\t\tswitch (DispBlock)\n\t\t\t{\n\t\t\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\t\t\tcase E_BLOCK_WATER:\n\t\t\t\t{\n\t\t\t\t\tif (ScoopUpLiquid(a_SlotNum, E_ITEM_WATER_BUCKET))\n\t\t\t\t\t{\n\t\t\t\t\t\tDispChunk->SetBlock(DispRelCoord, E_BLOCK_AIR, 0);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t\t\tcase E_BLOCK_LAVA:\n\t\t\t\t{\n\t\t\t\t\tif (ScoopUpLiquid(a_SlotNum, E_ITEM_LAVA_BUCKET))\n\t\t\t\t\t{\n\t\t\t\t\t\tDispChunk->SetBlock(DispRelCoord, E_BLOCK_AIR, 0);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tDropFromSlot(a_Chunk, a_SlotNum);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // E_ITEM_BUCKET\n\n\t\tcase E_ITEM_WATER_BUCKET:\n\t\t{\n\t\t\tLOGD(\"Dispensing water bucket in slot %d; DispBlock is \\\"%s\\\" (%d).\", a_SlotNum, ItemTypeToString(DispBlock).c_str(), DispBlock);\n\t\t\tif (EmptyLiquidBucket(DispBlock, a_SlotNum))\n\t\t\t{\n\t\t\t\tDispChunk->SetBlock(DispRelCoord, E_BLOCK_WATER, 0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDropFromSlot(a_Chunk, a_SlotNum);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_LAVA_BUCKET:\n\t\t{\n\t\t\tLOGD(\"Dispensing lava bucket in slot %d; DispBlock is \\\"%s\\\" (%d).\", a_SlotNum, ItemTypeToString(DispBlock).c_str(), DispBlock);\n\t\t\tif (EmptyLiquidBucket(DispBlock, a_SlotNum))\n\t\t\t{\n\t\t\t\tDispChunk->SetBlock(DispRelCoord, E_BLOCK_LAVA, 0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDropFromSlot(a_Chunk, a_SlotNum);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_SPAWN_EGG:\n\t\t{\n\t\t\tdouble MobX = 0.5 + DispAbsCoord.x;\n\t\t\tdouble MobZ = 0.5 + DispAbsCoord.z;\n\t\t\tauto MonsterType = cItemSpawnEggHandler::ItemDamageToMonsterType(m_Contents.GetSlot(a_SlotNum).m_ItemDamage);\n\t\t\tif (m_World->SpawnMob(MobX, DispAbsCoord.y, MobZ, MonsterType, false) != cEntity::INVALID_ID)\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_TNT:\n\t\t{\n\t\t\t// Spawn a primed TNT entity, if space allows:\n\t\t\tif (!cBlockInfo::IsSolid(DispBlock))\n\t\t\t{\n\t\t\t\tm_World->SpawnPrimedTNT(Vector3d(0.5, 0.5, 0.5) + DispAbsCoord, 80, 0);  // 80 ticks fuse, no initial velocity\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_FLINT_AND_STEEL:\n\t\t{\n\t\t\t// Spawn fire if the block in front is air.\n\t\t\tif (DispBlock == E_BLOCK_AIR)\n\t\t\t{\n\t\t\t\tDispChunk->SetBlock(DispRelCoord, E_BLOCK_FIRE, 0);\n\n\t\t\t\tbool ItemBroke = m_Contents.DamageItem(a_SlotNum, 1);\n\n\t\t\t\tif (ItemBroke)\n\t\t\t\t{\n\t\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_FIRE_CHARGE:\n\t\t{\n\t\t\tif (SpawnProjectileFromDispenser(DispAbsCoord, cProjectileEntity::pkFireCharge, GetShootVector(Meta) * 20) != cEntity::INVALID_ID)\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_ARROW:\n\t\t{\n\t\t\tif (SpawnProjectileFromDispenser(DispAbsCoord, cProjectileEntity::pkArrow, GetShootVector(Meta) * 30 + Vector3d(0, 1, 0)) != cEntity::INVALID_ID)\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_SNOWBALL:\n\t\t{\n\t\t\tif (SpawnProjectileFromDispenser(DispAbsCoord, cProjectileEntity::pkSnowball, GetShootVector(Meta) * 20 + Vector3d(0, 1, 0)) != cEntity::INVALID_ID)\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_EGG:\n\t\t{\n\t\t\tif (SpawnProjectileFromDispenser(DispAbsCoord, cProjectileEntity::pkEgg, GetShootVector(Meta) * 20 + Vector3d(0, 1, 0)) != cEntity::INVALID_ID)\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_BOTTLE_O_ENCHANTING:\n\t\t{\n\t\t\tif (SpawnProjectileFromDispenser(DispAbsCoord, cProjectileEntity::pkExpBottle, GetShootVector(Meta) * 20 + Vector3d(0, 1, 0)) != cEntity::INVALID_ID)\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_POTION:\n\t\t{\n\t\t\tif (SpawnProjectileFromDispenser(DispAbsCoord, cProjectileEntity::pkSplashPotion, GetShootVector(Meta) * 20 + Vector3d(0, 1, 0), &SlotItem) != cEntity::INVALID_ID)\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_DYE:\n\t\t{\n\t\t\tif (SlotItem.m_ItemDamage != E_META_DYE_WHITE)\n\t\t\t{\n\t\t\t\tDropFromSlot(a_Chunk, a_SlotNum);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Simulate a right-click with bonemeal:\n\t\t\tif (cItemDyeHandler::FertilizePlant(*m_World, DispAbsCoord))\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_BOAT:\n\t\tcase E_ITEM_SPRUCE_BOAT:\n\t\tcase E_ITEM_BIRCH_BOAT:\n\t\tcase E_ITEM_JUNGLE_BOAT:\n\t\tcase E_ITEM_ACACIA_BOAT:\n\t\tcase E_ITEM_DARK_OAK_BOAT:\n\t\t{\n\t\t\tVector3d spawnPos = DispAbsCoord;\n\t\t\tif (IsBlockWater(DispBlock))\n\t\t\t{\n\t\t\t\t// Water next to the dispenser, spawn a boat above the water block\n\t\t\t\tspawnPos.y += 1;\n\t\t\t}\n\t\t\telse if (IsBlockWater(DispChunk->GetBlock(DispRelCoord.addedY(-1))))\n\t\t\t{\n\t\t\t\t// Water one block below the dispenser, spawn a boat at the dispenser's Y level\n\t\t\t\t// No adjustment needed\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// There's no eligible water block, drop the boat as a pickup\n\t\t\t\tDropFromSlot(a_Chunk, a_SlotNum);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tspawnPos += GetShootVector(Meta) * 0.8;  // A boat is bigger than one block. Add the shoot vector to put it outside the dispenser.\n\t\t\tspawnPos += Vector3d(0.5, 0.5, 0.5);\n\n\t\t\tif (m_World->SpawnBoat(spawnPos, cBoat::ItemToMaterial(SlotItem)))\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_ITEM_FIREWORK_ROCKET:\n\t\t{\n\t\t\tif (SpawnProjectileFromDispenser(DispAbsCoord, cProjectileEntity::pkFirework, GetShootVector(Meta) * 20 + Vector3d(0, 1, 0), &SlotItem) != cEntity::INVALID_ID)\n\t\t\t{\n\t\t\t\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tDropFromSlot(a_Chunk, a_SlotNum);\n\t\t\tbreak;\n\t\t}\n\t}  // switch (SlotItem.m_ItemType)\n}\n\n\n\n\n\nUInt32 cDispenserEntity::SpawnProjectileFromDispenser(Vector3i a_BlockPos, cProjectileEntity::eKind a_Kind, const Vector3d & a_ShootVector, const cItem * a_Item)\n{\n\treturn m_World->CreateProjectile(Vector3d(0.5, 0.5, 0.5) + a_BlockPos,\n\t\ta_Kind, nullptr, a_Item, &a_ShootVector\n\t);\n}\n\n\n\n\n\nVector3d cDispenserEntity::GetShootVector(NIBBLETYPE a_Meta)\n{\n\tswitch (a_Meta & E_META_DROPSPENSER_FACING_MASK)\n\t{\n\t\tcase E_META_DROPSPENSER_FACING_YP: return Vector3d( 0,  1,  0);\n\t\tcase E_META_DROPSPENSER_FACING_YM: return Vector3d( 0, -1,  0);\n\t\tcase E_META_DROPSPENSER_FACING_XM: return Vector3d(-1,  0,  0);\n\t\tcase E_META_DROPSPENSER_FACING_XP: return Vector3d( 1,  0,  0);\n\t\tcase E_META_DROPSPENSER_FACING_ZM: return Vector3d( 0,  0, -1);\n\t\tcase E_META_DROPSPENSER_FACING_ZP: return Vector3d( 0,  0,  1);\n\t}\n\tLOGWARNING(\"Unhandled dispenser meta: %d\", a_Meta);\n\tASSERT(!\"Unhandled dispenser facing\");\n\treturn Vector3d(0, 1, 0);\n}\n\n\n\n\n\nbool cDispenserEntity::ScoopUpLiquid(int a_SlotNum, short a_ResultingBucketItemType)\n{\n\tcItem LiquidBucket(a_ResultingBucketItemType);\n\tif (m_Contents.GetSlot(a_SlotNum).m_ItemCount == 1)\n\t{\n\t\t// Special case: replacing one empty bucket with one full bucket\n\t\tm_Contents.SetSlot(a_SlotNum, LiquidBucket);\n\t\treturn true;\n\t}\n\n\t// There are stacked buckets at the selected slot, see if a full bucket will fit somewhere else\n\tif (m_Contents.HowManyCanFit(LiquidBucket) < 1)\n\t{\n\t\t// Cannot fit into m_Contents\n\t\treturn false;\n\t}\n\n\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\tm_Contents.AddItem(LiquidBucket);\n\treturn true;\n}\n\n\n\n\n\nbool cDispenserEntity::EmptyLiquidBucket(BLOCKTYPE a_BlockInFront, int a_SlotNum)\n{\n\tif (\n\t\t(a_BlockInFront != E_BLOCK_AIR) &&\n\t\t!IsBlockLiquid(a_BlockInFront) &&\n\t\t!cFluidSimulator::CanWashAway(a_BlockInFront)\n\t)\n\t{\n\t\t// Not a suitable block in front\n\t\treturn false;\n\t}\n\n\tcItem EmptyBucket(E_ITEM_BUCKET, 1);\n\tif (m_Contents.GetSlot(a_SlotNum).m_ItemCount == 1)\n\t{\n\t\t// Change the single full bucket present into a single empty bucket\n\t\tm_Contents.SetSlot(a_SlotNum, EmptyBucket);\n\t\treturn true;\n\t}\n\n\t// There are full buckets stacked at this slot, check if we can fit in the empty bucket\n\tif (m_Contents.HowManyCanFit(EmptyBucket) < 1)\n\t{\n\t\t// The empty bucket wouldn't fit into m_Contents\n\t\treturn false;\n\t}\n\n\t// The empty bucket fits in, remove one full bucket and add the empty one\n\tm_Contents.ChangeSlotCount(a_SlotNum, -1);\n\tm_Contents.AddItem(EmptyBucket);\n\treturn true;\n}\n"
  },
  {
    "path": "src/BlockEntities/DispenserEntity.h",
    "content": "\n#pragma once\n\n#include \"DropSpenserEntity.h\"\n\n\n\n\n\n// tolua_begin\nclass cDispenserEntity :\n\tpublic cDropSpenserEntity\n{\n\t// tolua_end\n\n\tusing Super = cDropSpenserEntity;\n\npublic:  // tolua_export\n\n\t/** Constructor used for normal operation */\n\tcDispenserEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// tolua_begin\n\n\t/** Spawns a projectile of the given kind in front of the dispenser with the specified speed.\n\ta_Item is the item from the internal storage from which the projectile originated.\n\tReturns the UniqueID of the spawned projectile, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnProjectileFromDispenser(\n\t\tVector3i a_BlockPos,\n\t\tcProjectileEntity::eKind a_Kind,\n\t\tconst Vector3d & a_Speed,\n\t\tconst cItem * a_Item = nullptr\n\t);\n\n\t/** OBSOLETE, use the Vector3i-based overload instead.\n\tSpawns a projectile of the given kind in front of the dispenser with the specified speed.\n\ta_Item is the item from the internal storage from which the projectile originated.\n\tReturns the UniqueID of the spawned projectile, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnProjectileFromDispenser(\n\t\tint a_BlockX, int a_BlockY, int a_BlockZ,\n\t\tcProjectileEntity::eKind a_Kind,\n\t\tconst Vector3d & a_Speed,\n\t\tconst cItem * a_Item = nullptr\n\t)\n\t{\n\t\treturn SpawnProjectileFromDispenser({a_BlockX, a_BlockY, a_BlockZ}, a_Kind, a_Speed, a_Item);\n\t}\n\n\t/** Returns a unit vector in the cardinal direction of where the dispenser with the specified meta would be facing. */\n\tstatic Vector3d GetShootVector(NIBBLETYPE a_BlockMeta);\n\n\t// tolua_end\n\nprivate:\n\n\t// cDropSpenser overrides:\n\tvirtual void DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum) override;\n\n\t/** If such a bucket can fit, adds it to m_Contents and returns true */\n\tbool ScoopUpLiquid(int a_SlotNum, short a_ResultingBucketItemType);\n\n\t/** If the a_BlockInFront can be washed away by liquid and the empty bucket can fit,\n\tdoes the m_Contents processing and returns true. Returns false otherwise. */\n\tbool EmptyLiquidBucket(BLOCKTYPE a_BlockInFront, int a_SlotNum);\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/DropSpenserEntity.cpp",
    "content": "\n// DropSpenserEntity.cpp\n\n// Declares the cDropSpenserEntity class representing a common ancestor to the cDispenserEntity and cDropperEntity\n// The dropper and dispenser only needs to override the DropSpenseFromSlot() function to provide the specific item behavior\n\n#include \"Globals.h\"\n#include \"DropSpenserEntity.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../EffectID.h\"\n#include \"../Entities/Player.h\"\n#include \"../Chunk.h\"\n#include \"../UI/DropSpenserWindow.h\"\n\n\n\n\n\ncDropSpenserEntity::cDropSpenserEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, ContentsWidth, ContentsHeight, a_World),\n\tm_ShouldDropSpense(false)\n{\n}\n\n\n\n\n\nvoid cDropSpenserEntity::AddDropSpenserDir(Vector3i & a_RelCoord, NIBBLETYPE a_Direction)\n{\n\tswitch (a_Direction & E_META_DROPSPENSER_FACING_MASK)\n\t{\n\t\tcase E_META_DROPSPENSER_FACING_YM: a_RelCoord.y--; return;\n\t\tcase E_META_DROPSPENSER_FACING_YP: a_RelCoord.y++; return;\n\t\tcase E_META_DROPSPENSER_FACING_ZM: a_RelCoord.z--; return;\n\t\tcase E_META_DROPSPENSER_FACING_ZP: a_RelCoord.z++; return;\n\t\tcase E_META_DROPSPENSER_FACING_XM: a_RelCoord.x--; return;\n\t\tcase E_META_DROPSPENSER_FACING_XP: a_RelCoord.x++; return;\n\t}\n\tLOGWARNING(\"%s: Unhandled direction: %d\", __FUNCTION__, a_Direction);\n}\n\n\n\n\n\nvoid cDropSpenserEntity::DropSpense(cChunk & a_Chunk)\n{\n\t// Pick one of the occupied slots:\n\tstd::array<int, 9> OccupiedSlots;\n\tsize_t SlotsCnt = 0;\n\tfor (int i = m_Contents.GetNumSlots() - 1; i >= 0; i--)\n\t{\n\t\tif (!m_Contents.GetSlot(i).IsEmpty())\n\t\t{\n\t\t\tOccupiedSlots[SlotsCnt] = i;\n\t\t\tSlotsCnt++;\n\t\t}\n\t}  // for i - m_Contents[]\n\n\tif (SlotsCnt == 0)\n\t{\n\t\t// Nothing in the dropspenser, play the click sound\n\t\tm_World->BroadcastSoundEffect(\"block.dispenser.fail\", m_Pos, 1.0f, 1.2f);\n\t\treturn;\n\t}\n\n\tconst size_t RandomSlot = GetRandomProvider().RandInt(SlotsCnt - 1);\n\tconst int SpenseSlot = OccupiedSlots[RandomSlot];\n\n\tif (cPluginManager::Get()->CallHookDropSpense(*m_World, *this, SpenseSlot))\n\t{\n\t\t// Plugin disagrees with the move\n\t\treturn;\n\t}\n\n\t// DropSpense the item, using the specialized behavior in the subclasses:\n\tDropSpenseFromSlot(a_Chunk, SpenseSlot);\n\n\t// Broadcast a smoke and click effects:\n\tNIBBLETYPE Meta = a_Chunk.GetMeta(GetRelPos());\n\tint SmokeDir = 0;\n\tswitch (Meta & E_META_DROPSPENSER_FACING_MASK)\n\t{\n\t\tcase E_META_DROPSPENSER_FACING_YP: SmokeDir = static_cast<int>(SmokeDirection::CENTRE); break;  // YP & YM don't have associated smoke dirs, just do 4 (centre of block)\n\t\tcase E_META_DROPSPENSER_FACING_YM: SmokeDir = static_cast<int>(SmokeDirection::CENTRE); break;\n\t\tcase E_META_DROPSPENSER_FACING_XM: SmokeDir = static_cast<int>(SmokeDirection::EAST); break;\n\t\tcase E_META_DROPSPENSER_FACING_XP: SmokeDir = static_cast<int>(SmokeDirection::WEST); break;\n\t\tcase E_META_DROPSPENSER_FACING_ZM: SmokeDir = static_cast<int>(SmokeDirection::SOUTH); break;\n\t\tcase E_META_DROPSPENSER_FACING_ZP: SmokeDir = static_cast<int>(SmokeDirection::NORTH); break;\n\t}\n\tm_World->BroadcastSoundParticleEffect(EffectID::PARTICLE_SMOKE, GetPos(), SmokeDir);\n\tm_World->BroadcastSoundEffect(\"block.dispenser.dispense\", m_Pos, 1.0f, 1.0f);\n}\n\n\n\n\n\nvoid cDropSpenserEntity::Activate(void)\n{\n\tm_ShouldDropSpense = true;\n}\n\n\n\n\n\nvoid cDropSpenserEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cDropSpenserEntity &>(a_Src);\n\tm_Contents.CopyFrom(src.m_Contents);\n\tm_ShouldDropSpense = src.m_ShouldDropSpense;\n}\n\n\n\n\n\nvoid cDropSpenserEntity::OnRemoveFromWorld()\n{\n\tconst auto Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\t// Tell window its owner is destroyed:\n\t\tWindow->OwnerDestroyed();\n\t}\n}\n\n\n\n\n\nbool cDropSpenserEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\tif (!m_ShouldDropSpense)\n\t{\n\t\treturn false;\n\t}\n\n\tm_ShouldDropSpense = false;\n\tDropSpense(a_Chunk);\n\treturn true;\n}\n\n\n\n\n\nvoid cDropSpenserEntity::SendTo(cClientHandle & a_Client)\n{\n\t// Nothing needs to be sent\n\tUNUSED(a_Client);\n}\n\n\n\n\n\nbool cDropSpenserEntity::UsedBy(cPlayer * a_Player)\n{\n\tif (m_BlockType == E_BLOCK_DISPENSER)\n\t{\n\t\ta_Player->GetStatistics().Custom[CustomStatistic::InspectDispenser]++;\n\t}\n\telse  // E_BLOCK_DROPPER\n\t{\n\t\ta_Player->GetStatistics().Custom[CustomStatistic::InspectDropper]++;\n\t}\n\n\tcWindow * Window = GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tOpenWindow(new cDropSpenserWindow(this));\n\t\tWindow = GetWindow();\n\t}\n\n\tif (Window != nullptr)\n\t{\n\t\tif (a_Player->GetWindow() != Window)\n\t\t{\n\t\t\ta_Player->OpenWindow(*Window);\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cDropSpenserEntity::DropFromSlot(cChunk & a_Chunk, int a_SlotNum)\n{\n\tVector3i dispCoord(m_Pos);\n\tauto Meta = a_Chunk.GetMeta(GetRelPos());\n\tAddDropSpenserDir(dispCoord, Meta);\n\n\tcItems Pickups;\n\tPickups.push_back(m_Contents.RemoveOneItem(a_SlotNum));\n\n\tconst int PickupSpeed = GetRandomProvider().RandInt(2, 6);  // At least 2, at most 6\n\tint PickupSpeedX = 0, PickupSpeedY = 0, PickupSpeedZ = 0;\n\tswitch (Meta & E_META_DROPSPENSER_FACING_MASK)\n\t{\n\t\tcase E_META_DROPSPENSER_FACING_YP: PickupSpeedY =  PickupSpeed; break;\n\t\tcase E_META_DROPSPENSER_FACING_YM: PickupSpeedY = -PickupSpeed; break;\n\t\tcase E_META_DROPSPENSER_FACING_XM: PickupSpeedX = -PickupSpeed; break;\n\t\tcase E_META_DROPSPENSER_FACING_XP: PickupSpeedX =  PickupSpeed; break;\n\t\tcase E_META_DROPSPENSER_FACING_ZM: PickupSpeedZ = -PickupSpeed; break;\n\t\tcase E_META_DROPSPENSER_FACING_ZP: PickupSpeedZ =  PickupSpeed; break;\n\t}\n\n\tdouble MicroX, MicroY, MicroZ;\n\tMicroX = dispCoord.x + 0.5;\n\tMicroY = dispCoord.y + 0.4;  // Slightly less than half, to accomodate actual texture hole on DropSpenser\n\tMicroZ = dispCoord.z + 0.5;\n\n\n\tm_World->SpawnItemPickups(Pickups, MicroX, MicroY, MicroZ, PickupSpeedX, PickupSpeedY, PickupSpeedZ);\n}\n\n\n\n\n"
  },
  {
    "path": "src/BlockEntities/DropSpenserEntity.h",
    "content": "\n// DropSpenser.h\n\n// Declares the cDropSpenser class representing a common ancestor to the cDispenserEntity and cDropperEntity\n// The dropper and dispenser only needs to override the DropSpenseFromSlot() function to provide the specific item behavior\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntityWithItems.h\"\n\n\n\n\n\nclass cClientHandle;\n\n\n\n\n\n// tolua_begin\nclass cDropSpenserEntity :\n\tpublic cBlockEntityWithItems\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntityWithItems;\n\n\t// tolua_begin\n\npublic:\n\n\tenum\n\t{\n\t\tContentsHeight = 3,\n\t\tContentsWidth  = 3,\n\t} ;\n\n\t// tolua_end\n\n\tcDropSpenserEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual void OnRemoveFromWorld() override;\n\tvirtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\n\t// tolua_begin\n\n\t/** Modifies the block coords to match the dropspenser direction given (where the dropspensed pickups should materialize) */\n\tvoid AddDropSpenserDir(Vector3i & a_RelCoord, NIBBLETYPE a_Direction);\n\n\t/** Sets the dropspenser to dropspense an item in the next tick */\n\tvoid Activate(void);\n\n\t// tolua_end\n\nprotected:\n\n\tbool m_ShouldDropSpense;  ///< If true, the dropspenser will dropspense an item in the next tick\n\n\t/** Does the actual work on dropspensing an item. Chooses the slot, calls DropSpenseFromSlot() and handles smoke / sound effects */\n\tvoid DropSpense(cChunk & a_Chunk);\n\n\t/** Override this function to provide the specific behavior for item dropspensing (drop / shoot / pour / ...) */\n\tvirtual void DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum) = 0;\n\n\t/** Helper function, drops one item from the specified slot (like a dropper) */\n\tvoid DropFromSlot(cChunk & a_Chunk, int a_SlotNum);\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/DropperEntity.cpp",
    "content": "\n// DropperEntity.cpp\n\n// Implements the cRtopperEntity class representing a Dropper block entity\n\n#include \"Globals.h\"\n#include \"DropperEntity.h\"\n\n\n\n\n\ncDropperEntity::cDropperEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World)\n{\n\tASSERT(a_BlockType == E_BLOCK_DROPPER);\n}\n\n\n\n\n\nvoid cDropperEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)\n{\n\tDropFromSlot(a_Chunk, a_SlotNum);\n}\n\n\n\n\n"
  },
  {
    "path": "src/BlockEntities/DropperEntity.h",
    "content": "\n// DropperEntity.h\n\n// Declares the cDropperEntity class representing a dropper block entity\n\n\n\n\n\n#pragma once\n\n#include \"DropSpenserEntity.h\"\n\n\n\n\n\n// tolua_begin\nclass cDropperEntity :\n\tpublic cDropSpenserEntity\n{\n\t// tolua_end\n\n\tusing Super = cDropSpenserEntity;\n\npublic:  // tolua_export\n\n\t/** Constructor used for normal operation */\n\tcDropperEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\nprotected:\n\n\t// cDropSpenserEntity overrides:\n\tvirtual void DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum) override;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/EnchantingTableEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"EnchantingTableEntity.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncEnchantingTableEntity::cEnchantingTableEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, AString a_CustomName) :\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tm_CustomName(std::move(a_CustomName))\n{\n\tASSERT(a_BlockType == E_BLOCK_ENCHANTMENT_TABLE);\n}\n\n\n\n\n\ncItems cEnchantingTableEntity::ConvertToPickups() const\n{\n\tcItem Item(E_BLOCK_ENCHANTMENT_TABLE);\n\tItem.m_CustomName = m_CustomName;\n\treturn Item;\n}\n\n\n\n\n\nvoid cEnchantingTableEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\n\tauto & Src = static_cast<const cEnchantingTableEntity &>(a_Src);\n\tm_CustomName = Src.m_CustomName;\n}\n\n\n\n\n\nbool cEnchantingTableEntity::UsedBy(cPlayer * a_Player)\n{\n\tUNUSED(a_Player);\n\treturn true;\n}\n\n\n\n\n\nvoid cEnchantingTableEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n"
  },
  {
    "path": "src/BlockEntities/EnchantingTableEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n\n\n\n\n\nclass cEnchantingTableEntity :\n\tpublic cBlockEntity\n{\n\tusing Super = cBlockEntity;\n\npublic:\n\n\tcEnchantingTableEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, AString a_CustomName = \"\");\n\n\tconst AString & GetCustomName() const { return m_CustomName; }\n\tvoid SetCustomName(const AString & a_CustomName) { m_CustomName = a_CustomName; }\n\nprivate:\n\n\t// cBlockEntity overrides:\n\tvirtual cItems ConvertToPickups() const override;\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\n\tAString m_CustomName;\n};\n"
  },
  {
    "path": "src/BlockEntities/EndPortalEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"EndPortalEntity.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncEndPortalEntity::cEndPortalEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World) :\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World)\n{\n\tASSERT(a_BlockType == E_BLOCK_END_PORTAL);\n}\n\n\n\n\n\nvoid cEndPortalEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n}\n\n\n\n\n\nbool cEndPortalEntity::UsedBy(cPlayer * a_Player)\n{\n\tUNUSED(a_Player);\n\treturn true;\n}\n\n\n\n\n\nvoid cEndPortalEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n"
  },
  {
    "path": "src/BlockEntities/EndPortalEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n\n\n\n\n\nclass cEndPortalEntity :\n\tpublic cBlockEntity\n{\n\tusing Super = cBlockEntity;\n\npublic:\n\n\tcEndPortalEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\nprivate:\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n};\n"
  },
  {
    "path": "src/BlockEntities/EnderChestEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"EnderChestEntity.h\"\n#include \"json/json.h\"\n#include \"../BlockInfo.h\"\n#include \"../Item.h\"\n#include \"../Entities/Player.h\"\n#include \"../UI/EnderChestWindow.h\"\n#include \"../ClientHandle.h\"\n#include \"../Mobs/Ocelot.h\"\n\n\n\n\n\ncEnderChestEntity::cEnderChestEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tcBlockEntityWindowOwner(this)\n{\n\tASSERT(a_BlockType == E_BLOCK_ENDER_CHEST);\n}\n\n\n\n\n\nvoid cEnderChestEntity::SendTo(cClientHandle & a_Client)\n{\n\t// Send a dummy \"number of players with chest open\" packet to make the chest visible:\n\ta_Client.SendBlockAction(m_Pos, 1, 0, m_BlockType);\n}\n\n\n\n\n\nvoid cEnderChestEntity::OnRemoveFromWorld()\n{\n\tconst auto Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\tWindow->OwnerDestroyed();\n\t}\n}\n\n\n\n\n\nbool cEnderChestEntity::UsedBy(cPlayer * a_Player)\n{\n\tif (\n\t\t(GetPosY() < cChunkDef::Height - 1) &&\n\t\t(\n\t\t\t!cBlockInfo::IsTransparent(GetWorld()->GetBlock(GetPos().addedY(1))) ||\n\t\t\t!cOcelot::IsCatSittingOnBlock(GetWorld(), Vector3d(GetPos()))\n\t\t)\n\t)\n\t{\n\t\t// Obstruction, don't open\n\t\treturn false;\n\t}\n\n\ta_Player->GetStatistics().Custom[CustomStatistic::OpenEnderchest]++;\n\n\t// If the window is not created, open it anew:\n\tcWindow * Window = GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tOpenNewWindow();\n\t\tWindow = GetWindow();\n\t}\n\n\t// Open the window for the player:\n\tif (Window != nullptr)\n\t{\n\t\tif (a_Player->GetWindow() != Window)\n\t\t{\n\t\t\ta_Player->OpenWindow(*Window);\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cEnderChestEntity::OpenNewWindow()\n{\n\tOpenWindow(new cEnderChestWindow(this));\n}\n\n\n\n\n\nvoid cEnderChestEntity::LoadFromJson(const Json::Value & a_Value, cItemGrid & a_Grid)\n{\n\tint SlotIdx = 0;\n\tfor (auto & Node : a_Value)\n\t{\n\t\tcItem Item;\n\t\tItem.FromJson(Node);\n\t\ta_Grid.SetSlot(SlotIdx, Item);\n\t\tSlotIdx++;\n\t}\n}\n\n\n\n\n\nvoid cEnderChestEntity::SaveToJson(Json::Value & a_Value, const cItemGrid & a_Grid)\n{\n\tfor (int i = 0; i < a_Grid.GetNumSlots(); i++)\n\t{\n\t\tJson::Value Slot;\n\t\ta_Grid.GetSlot(i).GetJson(Slot);\n\t\ta_Value.append(Slot);\n\t}\n}\n"
  },
  {
    "path": "src/BlockEntities/EnderChestEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"../UI/WindowOwner.h\"\n\n\n\n\n\n// tolua_begin\nclass cEnderChestEntity :\n\tpublic cBlockEntity,\n\tpublic cBlockEntityWindowOwner\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\tcEnderChestEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// cBlockEntity overrides:\n\tvirtual void OnRemoveFromWorld() override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\n\tstatic void LoadFromJson(const Json::Value & a_Value, cItemGrid & a_Grid);\n\tstatic void SaveToJson(Json::Value & a_Value, const cItemGrid & a_Grid);\n\n\t/** Opens a new enderchest window for this enderchest */\n\tvoid OpenNewWindow(void);\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/FlowerPotEntity.cpp",
    "content": "\n// FlowerPotEntity.cpp\n\n// Implements the cFlowerPotEntity class representing a single flower pot in the world\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n#include \"FlowerPotEntity.h\"\n#include \"../Entities/Player.h\"\n#include \"../ClientHandle.h\"\n#include \"../Item.h\"\n\n\n\n\n\ncFlowerPotEntity::cFlowerPotEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World)\n{\n\tASSERT(a_BlockType == E_BLOCK_FLOWER_POT);\n}\n\n\n\n\n\ncItems cFlowerPotEntity::ConvertToPickups() const\n{\n\treturn cItem(m_Item);\n}\n\n\n\n\n\nvoid cFlowerPotEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cFlowerPotEntity &>(a_Src);\n\tm_Item = src.m_Item;\n}\n\n\n\n\n\nbool cFlowerPotEntity::UsedBy(cPlayer * a_Player)\n{\n\tif (IsItemInPot())\n\t{\n\t\treturn false;\n\t}\n\n\ta_Player->GetStatistics().Custom[CustomStatistic::PotFlower]++;\n\n\tcItem SelectedItem = a_Player->GetInventory().GetEquippedItem();\n\tif (IsFlower(SelectedItem.m_ItemType, SelectedItem.m_ItemDamage))\n\t{\n\t\tm_Item = SelectedItem.CopyOne();\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t\tm_World->BroadcastBlockEntity(GetPos(), a_Player->GetClientHandle());\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cFlowerPotEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n\n\n\n\n\nbool cFlowerPotEntity::IsFlower(short m_ItemType, short m_ItemData)\n{\n\tswitch (m_ItemType)\n\t{\n\t\tcase E_BLOCK_DANDELION:\n\t\tcase E_BLOCK_FLOWER:\n\t\tcase E_BLOCK_CACTUS:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_SAPLING:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\t{\n\t\t\treturn (m_ItemData == static_cast<short>(2));\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/BlockEntities/FlowerPotEntity.h",
    "content": "// FlowerPotEntity.h\n\n// Declares the cFlowerPotEntity class representing a single sign in the world\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"../Item.h\"\n\n\n\n\n\n// tolua_begin\nclass cFlowerPotEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\t/** Creates a new flowerpot entity at the specified block coords. a_World may be nullptr */\n\tcFlowerPotEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\n\t// tolua_begin\n\n\t/** Is a flower in the pot? */\n\tbool IsItemInPot(void) { return !m_Item.IsEmpty(); }\n\n\t/** Get the item in the flower pot */\n\tcItem GetItem(void) const { return m_Item; }\n\n\t/** Set the item in the flower pot */\n\tvoid SetItem(const cItem & a_Item) { m_Item = a_Item; }\n\n\t// tolua_end\n\n\t// cBlockEntity overrides:\n\tvirtual cItems ConvertToPickups() const override;\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\n\tstatic bool IsFlower(short m_ItemType, short m_ItemData);\n\nprivate:\n\n\tcItem m_Item;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/FurnaceEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"FurnaceEntity.h\"\n#include \"../UI/FurnaceWindow.h\"\n#include \"../Entities/Player.h\"\n#include \"../Root.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\nenum\n{\n\tPROGRESSBAR_FUEL = 0,\n\tPROGRESSBAR_SMELTING = 2,\n\tPROGRESSBAR_SMELTING_CONFIRM = 3,\n} ;\n\n\n\n\n\ncFurnaceEntity::cFurnaceEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, ContentsWidth, ContentsHeight, a_World),\n\tm_CurrentRecipe(nullptr),\n\tm_IsCooking(a_BlockType == E_BLOCK_LIT_FURNACE),\n\tm_NeedCookTime(0),\n\tm_TimeCooked(0),\n\tm_FuelBurnTime(0),\n\tm_TimeBurned(0),\n\tm_RewardCounter(0),\n\tm_IsLoading(false)\n{\n\tm_Contents.AddListener(*this);\n}\n\n\n\n\n\nvoid cFurnaceEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cFurnaceEntity &>(a_Src);\n\tm_Contents.CopyFrom(src.m_Contents);\n\tm_CurrentRecipe = src.m_CurrentRecipe;\n\tm_FuelBurnTime = src.m_FuelBurnTime;\n\tm_IsCooking = src.m_IsCooking;\n\tm_IsLoading = src.m_IsLoading;\n\tm_LastInput = src.m_LastInput;\n\tm_NeedCookTime = src.m_NeedCookTime;\n\tm_TimeBurned = src.m_TimeBurned;\n\tm_TimeCooked = src.m_TimeCooked;\n}\n\n\n\n\n\nvoid cFurnaceEntity::OnRemoveFromWorld()\n{\n\tconst auto Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\t// Tell window its owner is destroyed:\n\t\tWindow->OwnerDestroyed();\n\t}\n}\n\n\n\n\n\nvoid cFurnaceEntity::SendTo(cClientHandle & a_Client)\n{\n\t// Nothing needs to be sent\n\tUNUSED(a_Client);\n}\n\n\n\n\n\nbool cFurnaceEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\n\tif (m_FuelBurnTime <= 0)\n\t{\n\t\t// If a furnace is out of fuel, the progress bar reverses at twice the speed of cooking.\n\t\tm_TimeCooked = std::max((m_TimeCooked - 2), 0);\n\n\t\t// Reset progressbars, block type, and bail out\n\t\tm_BlockType = E_BLOCK_FURNACE;\n\t\ta_Chunk.FastSetBlock(GetRelPos(), E_BLOCK_FURNACE, m_BlockMeta);\n\t\tUpdateProgressBars();\n\t\treturn false;\n\t}\n\n\tif (m_IsCooking)\n\t{\n\t\tm_TimeCooked++;\n\t\tif (m_TimeCooked >= m_NeedCookTime)\n\t\t{\n\t\t\t// Finished smelting one item\n\t\t\tFinishOne();\n\t\t}\n\t}\n\n\tm_TimeBurned++;\n\tif (m_TimeBurned >= m_FuelBurnTime)\n\t{\n\t\t// The current fuel has been exhausted, use another one, if possible\n\t\tBurnNewFuel();\n\t}\n\n\tUpdateProgressBars();\n\n\treturn true;\n}\n\n\n\n\n\nbool cFurnaceEntity::UsedBy(cPlayer * a_Player)\n{\n\ta_Player->GetStatistics().Custom[CustomStatistic::InteractWithFurnace]++;\n\n\tcWindow * Window = GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tOpenWindow(new cFurnaceWindow(this));\n\t\tWindow = GetWindow();\n\t}\n\n\tif (Window != nullptr)\n\t{\n\t\tif (a_Player->GetWindow() != Window)\n\t\t{\n\t\t\ta_Player->OpenWindow(*Window);\n\t\t}\n\t}\n\n\tUpdateProgressBars(true);\n\treturn true;\n}\n\n\n\n\n\nbool cFurnaceEntity::ContinueCooking(void)\n{\n\tUpdateInput();\n\tUpdateFuel();\n\treturn m_IsCooking;\n}\n\n\n\n\n\nint cFurnaceEntity::GetAndResetReward(void)\n{\n\tint Reward = FloorC(m_RewardCounter);\n\tfloat Remainder = m_RewardCounter - static_cast<float>(Reward);\n\t// Remainder is used as the percent chance of getting an extra xp point\n\tif (GetRandomProvider().RandBool(Remainder))\n\t{\n\t\tReward++;\n\t}\n\tm_RewardCounter = 0.0;\n\treturn Reward;\n}\n\n\n\n\n\nvoid cFurnaceEntity::BroadcastProgress(size_t a_ProgressbarID, short a_Value)\n{\n\tcWindow * Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\tWindow->SetProperty(a_ProgressbarID, a_Value);\n\t}\n}\n\n\n\n\n\nvoid cFurnaceEntity::FinishOne()\n{\n\tm_TimeCooked = 0;\n\tm_RewardCounter += m_CurrentRecipe->Reward;\n\n\tif (m_Contents.GetSlot(fsOutput).IsEmpty())\n\t{\n\t\tm_Contents.SetSlot(fsOutput, *m_CurrentRecipe->Out);\n\t}\n\telse\n\t{\n\t\tm_Contents.ChangeSlotCount(fsOutput, m_CurrentRecipe->Out->m_ItemCount);\n\t}\n\tm_Contents.ChangeSlotCount(fsInput, -m_CurrentRecipe->In->m_ItemCount);\n}\n\n\n\n\n\nvoid cFurnaceEntity::BurnNewFuel(void)\n{\n\tcFurnaceRecipe * FR = cRoot::Get()->GetFurnaceRecipe();\n\tint NewTime = FR->GetBurnTime(m_Contents.GetSlot(fsFuel));\n\tif ((NewTime == 0) || !CanCookInputToOutput())\n\t{\n\t\t// The item in the fuel slot is not suitable\n\t\t// or the input and output isn't available for cooking\n\t\tSetBurnTimes(0, 0);\n\t\tSetIsCooking(false);\n\t\treturn;\n\t}\n\n\t// Burn one new fuel:\n\tSetBurnTimes(NewTime, 0);\n\tSetIsCooking(true);\n\tif (m_Contents.GetSlot(fsFuel).m_ItemType == E_ITEM_LAVA_BUCKET)\n\t{\n\t\tm_Contents.SetSlot(fsFuel, cItem(E_ITEM_BUCKET));\n\t}\n\telse\n\t{\n\t\tm_Contents.ChangeSlotCount(fsFuel, -1);\n\t}\n}\n\n\n\n\n\nvoid cFurnaceEntity::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)\n{\n\tSuper::OnSlotChanged(a_ItemGrid, a_SlotNum);\n\n\tif (m_IsLoading)\n\t{\n\t\treturn;\n\t}\n\n\tASSERT(a_ItemGrid == &m_Contents);\n\tswitch (a_SlotNum)\n\t{\n\t\tcase fsInput:  UpdateInput();  break;\n\t\tcase fsFuel:   UpdateFuel();   break;\n\t\tcase fsOutput: UpdateOutput(); break;\n\t\tdefault: ASSERT(!\"Invalid furnace slot update!\"); break;\n\t}\n}\n\n\n\n\n\nvoid cFurnaceEntity::UpdateInput(void)\n{\n\tif (!m_Contents.GetSlot(fsInput).IsEqual(m_LastInput))\n\t{\n\t\t// The input is different from what we had before, reset the cooking time\n\t\tif (!m_IsLoading)\n\t\t{\n\t\t\tm_TimeCooked = 0;\n\t\t}\n\t}\n\tm_LastInput = m_Contents.GetSlot(fsInput);\n\n\tcFurnaceRecipe * FR = cRoot::Get()->GetFurnaceRecipe();\n\tm_CurrentRecipe = FR->GetRecipeFrom(m_Contents.GetSlot(fsInput));\n\tif (!CanCookInputToOutput())\n\t{\n\t\t// This input cannot be cooked, reset cook counter immediately\n\t\tSetCookTimes(0, 0);\n\t\tSetIsCooking(false);\n\t}\n\telse\n\t{\n\t\tm_NeedCookTime = m_CurrentRecipe->CookTime;\n\n\t\t// Start burning new fuel if there's no flame now:\n\t\tif (GetFuelBurnTimeLeft() <= 0)\n\t\t{\n\t\t\tBurnNewFuel();\n\t\t}\n\t\t// Already burning, set cooking to ensure that cooking is occuring\n\t\telse\n\t\t{\n\t\t\tSetIsCooking(true);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cFurnaceEntity::UpdateFuel(void)\n{\n\tif (m_FuelBurnTime > m_TimeBurned)\n\t{\n\t\t// The current fuel is still burning, don't modify anything:\n\t\treturn;\n\t}\n\n\t// The current fuel is spent, try to burn some more:\n\tBurnNewFuel();\n}\n\n\n\n\n\nvoid cFurnaceEntity::UpdateOutput(void)\n{\n\tif (!CanCookInputToOutput())\n\t{\n\t\t// Cannot cook anymore:\n\t\tSetCookTimes(0, 0);\n\t\tSetIsCooking(false);\n\t\treturn;\n\t}\n\n\t// Can cook, start cooking if not already underway:\n\tm_NeedCookTime = m_CurrentRecipe->CookTime;\n\n\t// Check if fuel needs to start a burn\n\tif (GetFuelBurnTimeLeft() <= 0)\n\t{\n\t\tBurnNewFuel();\n\t}\n\t// Already burning, set cooking to ensure that cooking is occuring\n\telse\n\t{\n\t\tSetIsCooking(true);\n\t}\n}\n\n\n\n\n\nbool cFurnaceEntity::CanCookInputToOutput(void) const\n{\n\tif (m_CurrentRecipe == nullptr)\n\t{\n\t\t// This input cannot be cooked\n\t\treturn false;\n\t}\n\n\tconst cItem & Slot = m_Contents.GetSlot(fsOutput);\n\tif (Slot.IsEmpty())\n\t{\n\t\t// The output is empty, can cook\n\t\treturn true;\n\t}\n\n\tif (!Slot.IsEqual(*m_CurrentRecipe->Out))\n\t{\n\t\t// The output slot is blocked with something that cannot be stacked with the recipe's output\n\t\treturn false;\n\t}\n\n\tif (Slot.IsFullStack())\n\t{\n\t\t// Cannot add any more items to the output slot\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cFurnaceEntity::UpdateProgressBars(bool a_ForceUpdate)\n{\n\t// In order to preserve bandwidth, an update is sent only every 10th tick:\n\tif (!a_ForceUpdate && ((m_World->GetWorldTickAge() % 10_tick) != 0_tick))\n\t{\n\t\treturn;\n\t}\n\n\tint CurFuel = (m_FuelBurnTime > 0) ? 200 - (200 * m_TimeBurned / m_FuelBurnTime) : 0;\n\tBroadcastProgress(PROGRESSBAR_FUEL, static_cast<short>(CurFuel));\n\n\tint CurCook = (m_NeedCookTime > 0) ? (200 * m_TimeCooked / m_NeedCookTime) : 0;\n\tBroadcastProgress(PROGRESSBAR_SMELTING_CONFIRM, 200);  // Post 1.8, Mojang requires a random packet with an ID of three and value of 200. Wat. Wat. Wat.\n\tBroadcastProgress(PROGRESSBAR_SMELTING, static_cast<short>(CurCook));\n}\n\n\n\n\n\nvoid cFurnaceEntity::SetIsCooking(bool a_IsCooking)\n{\n\tif (a_IsCooking == m_IsCooking)\n\t{\n\t\treturn;\n\t}\n\tm_IsCooking = a_IsCooking;\n\n\t// Only light the furnace as it is extinguished only when the fuel runs out, not when cooking stops - handled in this::Tick()\n\tif (m_IsCooking)\n\t{\n\t\tm_BlockType = E_BLOCK_LIT_FURNACE;\n\t\tm_World->FastSetBlock(m_Pos, E_BLOCK_LIT_FURNACE, m_BlockMeta);\n\t}\n}\n"
  },
  {
    "path": "src/BlockEntities/FurnaceEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockEntityWithItems.h\"\n#include \"../FurnaceRecipe.h\"\n\n\n\n\n\nclass cClientHandle;\n\n\n\n\n\n// tolua_begin\nclass cFurnaceEntity :\n\tpublic cBlockEntityWithItems\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntityWithItems;\n\n\t// tolua_begin\n\npublic:\n\n\tenum\n\t{\n\t\tfsInput  = 0,  // Input slot number\n\t\tfsFuel   = 1,  // Fuel slot number\n\t\tfsOutput = 2,  // Output slot number\n\n\t\tContentsWidth  = 3,\n\t\tContentsHeight = 1,\n\t};\n\n\t// tolua_end\n\n\t/** Constructor used for normal operation */\n\tcFurnaceEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual void OnRemoveFromWorld() override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\n\t/** Restarts cooking\n\tUsed after the furnace is loaded from storage to set up the internal variables so that cooking continues, if it was active\n\tReturns true if cooking */\n\tbool ContinueCooking(void);\n\n\t// tolua_begin\n\n\t/** Returns the item in the input slot */\n\tconst cItem & GetInputSlot(void) const { return GetSlot(fsInput); }\n\n\t/** Returns the item in the fuel slot */\n\tconst cItem & GetFuelSlot(void) const { return GetSlot(fsFuel); }\n\n\t/** Returns the item in the output slot */\n\tconst cItem & GetOutputSlot(void) const { return GetSlot(fsOutput); }\n\n\t/** Sets the item in the input slot */\n\tvoid SetInputSlot(const cItem & a_Item) { SetSlot(fsInput, a_Item); }\n\n\t/** Sets the item in the fuel slot */\n\tvoid SetFuelSlot(const cItem & a_Item) { SetSlot(fsFuel, a_Item); }\n\n\t/** Sets the item in the output slot */\n\tvoid SetOutputSlot(const cItem & a_Item) { SetSlot(fsOutput, a_Item); }\n\n\t/** Returns the time that the current item has been cooking, in ticks */\n\tint GetTimeCooked(void) const { return m_TimeCooked; }\n\n\t/** Returns the time until the current item finishes cooking, in ticks */\n\tint GetCookTimeLeft(void) const { return m_NeedCookTime - m_TimeCooked; }\n\n\t/** Returns the time until the current fuel is depleted, in ticks */\n\tint GetFuelBurnTimeLeft(void) const { return m_FuelBurnTime - m_TimeBurned; }\n\n\t/** Returns true if there's time left before the current fuel is depleted */\n\tbool HasFuelTimeLeft(void) const { return (GetFuelBurnTimeLeft() > 0); }\n\n\t/** Calculates, resets, and returns the experience reward in this furnace */\n\tint GetAndResetReward(void);\n\n\t// tolua_end\n\n\tvoid SetBurnTimes(int a_FuelBurnTime, int a_TimeBurned)\n\t{\n\t\tm_FuelBurnTime = a_FuelBurnTime;\n\t\tm_TimeBurned = a_TimeBurned;\n\t}\n\n\tvoid SetCookTimes(int a_NeedCookTime, int a_TimeCooked)\n\t{\n\t\tm_NeedCookTime = a_NeedCookTime;\n\t\tm_TimeCooked = a_TimeCooked;\n\t}\n\n\tvoid SetLoading(bool a_IsLoading)\n\t{\n\t\tm_IsLoading = a_IsLoading;\n\t}\n\n\nprotected:\n\n\t/** The recipe for the current input slot */\n\tconst cFurnaceRecipe::cRecipe * m_CurrentRecipe;\n\n\t/** The item that is being smelted */\n\tcItem m_LastInput;\n\n\t/** Set to true if the furnace is cooking an item */\n\tbool m_IsCooking;\n\n\t/** Amount of ticks needed to fully cook current item */\n\tint m_NeedCookTime;\n\n\t/** Amount of ticks that the current item has been cooking */\n\tint m_TimeCooked;\n\n\t/** Amount of ticks that the current fuel can burn (in total); zero if no fuel burning */\n\tint m_FuelBurnTime;\n\n\t/** Amount of ticks that the current fuel has been burning */\n\tint m_TimeBurned;\n\n\t/** Running total of experience that can be picked up */\n\tfloat m_RewardCounter;\n\n\t/** Is the block currently being loaded into the world? */\n\tbool m_IsLoading;\n\n\t/** Sends the specified progressbar value to all clients of the window */\n\tvoid BroadcastProgress(size_t a_ProgressbarID, short a_Value);\n\n\t/** One item finished cooking */\n\tvoid FinishOne();\n\n\t/** Starts burning a new fuel, if possible */\n\tvoid BurnNewFuel(void);\n\n\t/** Updates the recipe, based on the current input */\n\tvoid UpdateInput(void);\n\n\t/** Called when the fuel slot changes or when the fuel is spent, burns another piece of fuel if appropriate */\n\tvoid UpdateFuel(void);\n\n\t/** Called when the output slot changes */\n\tvoid UpdateOutput(void);\n\n\t/** Returns true if the input can be cooked into output and the item counts allow for another cooking operation */\n\tbool CanCookInputToOutput(void) const;\n\n\t/** Broadcasts progressbar updates, if needed */\n\tvoid UpdateProgressBars(bool a_ForceUpdate = false);\n\n\t/** Sets the m_IsCooking variable, updates the furnace block type based on the value */\n\tvoid SetIsCooking(bool a_IsCooking);\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;\n\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/HopperEntity.cpp",
    "content": "\n// HopperEntity.cpp\n\n// Implements the cHopperEntity representing a hopper block entity\n\n#include \"Globals.h\"\n#include \"HopperEntity.h\"\n#include \"../Chunk.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../UI/HopperWindow.h\"\n#include \"ChestEntity.h\"\n#include \"FurnaceEntity.h\"\n\n\n\n\n\n// How many ticks at minimum between two item transfers to or from the hopper.\n#define TICKS_PER_TRANSFER 8_tick\n\n\n\n\n\ncHopperEntity::cHopperEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, ContentsWidth, ContentsHeight, a_World),\n\tm_LastMoveItemsInTick(0),\n\tm_LastMoveItemsOutTick(0),\n\tm_Locked(false)\n{\n\tASSERT(a_BlockType == E_BLOCK_HOPPER);\n}\n\n\n\n\n\nvoid cHopperEntity::SetLocked(bool a_Value)\n{\n\tm_Locked = a_Value;\n}\n\n\n\n\n\nstd::pair<bool, Vector3i> cHopperEntity::GetOutputBlockPos(NIBBLETYPE a_BlockMeta)\n{\n\tauto pos = GetPos();\n\tswitch (a_BlockMeta)\n\t{\n\t\tcase E_META_HOPPER_FACING_XM: return {true, pos.addedX(-1)};\n\t\tcase E_META_HOPPER_FACING_XP: return {true, pos.addedX( 1)};\n\t\tcase E_META_HOPPER_FACING_YM: return {true, pos.addedY(-1)};\n\t\tcase E_META_HOPPER_FACING_ZM: return {true, pos.addedZ(-1)};\n\t\tcase E_META_HOPPER_FACING_ZP: return {true, pos.addedZ( 1)};\n\t\tdefault:\n\t\t{\n\t\t\t// Not attached\n\t\t\treturn {false, pos};\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cHopperEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cHopperEntity &>(a_Src);\n\tm_LastMoveItemsInTick = src.m_LastMoveItemsInTick;\n\tm_LastMoveItemsOutTick = src.m_LastMoveItemsOutTick;\n}\n\n\n\n\n\nbool cHopperEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\n\tbool isDirty = false;\n\tif (!m_Locked)\n\t{\n\t\tconst auto CurrentTick = a_Chunk.GetWorld()->GetWorldAge();\n\t\tisDirty = MoveItemsIn(a_Chunk, CurrentTick) || isDirty;\n\t\tisDirty = MovePickupsIn(a_Chunk) || isDirty;\n\t\tisDirty = MoveItemsOut(a_Chunk, CurrentTick) || isDirty;\n\t}\n\treturn isDirty;\n}\n\n\n\n\n\nvoid cHopperEntity::SendTo(cClientHandle & a_Client)\n{\n\t// The hopper entity doesn't need anything sent to the client when it's created / gets in the viewdistance\n\t// All the actual handling is in the cWindow UI code that gets called when the hopper is right-clicked\n\n\tUNUSED(a_Client);\n}\n\n\n\n\n\nbool cHopperEntity::UsedBy(cPlayer * a_Player)\n{\n\ta_Player->GetStatistics().Custom[CustomStatistic::InspectHopper]++;\n\n\t// If the window is not created, open it anew:\n\tcWindow * Window = GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tOpenNewWindow();\n\t\tWindow = GetWindow();\n\t}\n\n\t// Open the window for the player:\n\tif (Window != nullptr)\n\t{\n\t\tif (a_Player->GetWindow() != Window)\n\t\t{\n\t\t\ta_Player->OpenWindow(*Window);\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cHopperEntity::OpenNewWindow(void)\n{\n\tOpenWindow(new cHopperWindow(this));\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsIn(cChunk & a_Chunk, const cTickTimeLong a_CurrentTick)\n{\n\tif (m_Pos.y >= cChunkDef::Height)\n\t{\n\t\t// This hopper is at the top of the world, no more blocks above\n\t\treturn false;\n\t}\n\n\tif ((a_CurrentTick - m_LastMoveItemsInTick) < TICKS_PER_TRANSFER)\n\t{\n\t\t// Too early after the previous transfer\n\t\treturn false;\n\t}\n\n\t// Try moving an item in:\n\tbool res = false;\n\tswitch (a_Chunk.GetBlock(GetRelPos().addedY(1)))\n\t{\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\t{\n\t\t\t// Chests have special handling because of double-chests\n\t\t\tres = MoveItemsFromChest(a_Chunk);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_FURNACE:\n\t\tcase E_BLOCK_LIT_FURNACE:\n\t\t{\n\t\t\t// Furnaces have special handling because only the output and leftover fuel buckets shall be moved\n\t\t\tres = MoveItemsFromFurnace(a_Chunk);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_HOPPER:\n\t\t{\n\t\t\tres = MoveItemsFromGrid(*static_cast<cBlockEntityWithItems *>(a_Chunk.GetBlockEntity(this->GetPos().addedY(1))));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// If the item has been moved, reset the last tick:\n\tif (res)\n\t{\n\t\tm_LastMoveItemsInTick = a_CurrentTick;\n\t}\n\n\treturn res;\n}\n\n\n\n\n\nbool cHopperEntity::MovePickupsIn(cChunk & a_Chunk)\n{\n\tclass cHopperPickupSearchCallback\n\t{\n\tpublic:\n\t\tcHopperPickupSearchCallback(Vector3i a_Pos, cItemGrid & a_Contents) :\n\t\t\tm_Pos(a_Pos),\n\t\t\tm_bFoundPickupsAbove(false),\n\t\t\tm_Contents(a_Contents)\n\t\t{\n\t\t}\n\n\t\tbool operator () (cEntity & a_Entity)\n\t\t{\n\t\t\tif (!a_Entity.IsPickup())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tVector3f EntityPos = a_Entity.GetPosition();\n\t\t\tVector3f BlockPos(m_Pos.x + 0.5f, static_cast<float>(m_Pos.y) + 1, m_Pos.z + 0.5f);  // One block above hopper, and search from center outwards\n\t\t\tdouble Distance = (EntityPos - BlockPos).Length();\n\n\t\t\tif (Distance < 0.5)\n\t\t\t{\n\t\t\t\tif (TrySuckPickupIn(static_cast<cPickup &>(a_Entity)))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tbool TrySuckPickupIn(cPickup & a_Pickup)\n\t\t{\n\t\t\tcItem & Item = a_Pickup.GetItem();\n\n\t\t\tfor (int i = 0; i < ContentsWidth * ContentsHeight; i++)\n\t\t\t{\n\t\t\t\tif (m_Contents.IsSlotEmpty(i))\n\t\t\t\t{\n\t\t\t\t\tm_bFoundPickupsAbove = true;\n\t\t\t\t\tm_Contents.SetSlot(i, Item);\n\t\t\t\t\ta_Pickup.Destroy();  // Kill pickup\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse if (m_Contents.GetSlot(i).IsEqual(Item) && !m_Contents.GetSlot(i).IsFullStack())\n\t\t\t\t{\n\t\t\t\t\tm_bFoundPickupsAbove = true;\n\n\t\t\t\t\tauto PreviousCount = m_Contents.GetSlot(i).m_ItemCount;\n\n\t\t\t\t\tItem.m_ItemCount -= m_Contents.ChangeSlotCount(i, Item.m_ItemCount) - PreviousCount;  // Set count to however many items were added\n\n\t\t\t\t\tif (Item.IsEmpty())\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Pickup.Destroy();  // Kill pickup if all items were added\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tbool FoundPickupsAbove(void) const\n\t\t{\n\t\t\treturn m_bFoundPickupsAbove;\n\t\t}\n\n\tprotected:\n\t\tVector3i m_Pos;\n\t\tbool m_bFoundPickupsAbove;\n\t\tcItemGrid & m_Contents;\n\t};\n\n\tcHopperPickupSearchCallback HopperPickupSearchCallback(Vector3i(GetPosX(), GetPosY(), GetPosZ()), m_Contents);\n\ta_Chunk.ForEachEntity(HopperPickupSearchCallback);\n\n\treturn HopperPickupSearchCallback.FoundPickupsAbove();\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, const cTickTimeLong a_CurrentTick)\n{\n\tif ((a_CurrentTick - m_LastMoveItemsOutTick) < TICKS_PER_TRANSFER)\n\t{\n\t\t// Too early after the previous transfer\n\t\treturn false;\n\t}\n\n\t// Get the coords of the block where to output items:\n\tauto meta = a_Chunk.GetMeta(GetRelPos());\n\tauto out = GetOutputBlockPos(meta);\n\tif (!out.first)\n\t{\n\t\t// Not attached to another container\n\t\treturn false;\n\t}\n\tif (out.second.y < 0)\n\t{\n\t\t// Cannot output below the zero-th block level\n\t\treturn false;\n\t}\n\n\t// Convert coords to relative:\n\tauto relCoord = cChunkDef::AbsoluteToRelative(out.second);\n\tauto destChunk = a_Chunk.GetRelNeighborChunkAdjustCoords(relCoord);\n\tif (destChunk == nullptr)\n\t{\n\t\t// The destination chunk has been unloaded, don't tick\n\t\treturn false;\n\t}\n\n\t// Call proper moving function, based on the blocktype present at the coords:\n\tbool res = false;\n\tauto absCoord = destChunk->RelativeToAbsolute(relCoord);\n\tswitch (destChunk->GetBlock(relCoord))\n\t{\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\t{\n\t\t\t// Chests have special handling because of double-chests\n\t\t\tres = MoveItemsToChest(*destChunk, absCoord);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_FURNACE:\n\t\tcase E_BLOCK_LIT_FURNACE:\n\t\t{\n\t\t\t// Furnaces have special handling because of the direction-to-slot relation\n\t\t\tres = MoveItemsToFurnace(*destChunk, absCoord, meta);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_HOPPER:\n\t\t{\n\t\t\tauto blockEntity = static_cast<cBlockEntityWithItems *>(destChunk->GetBlockEntity(absCoord));\n\t\t\tif (blockEntity == nullptr)\n\t\t\t{\n\t\t\t\tFLOGWARNING(\"{0}: A block entity was not found where expected at {1}\", __FUNCTION__, absCoord);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tres = MoveItemsToGrid(*blockEntity);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// If the item has been moved, reset the last tick:\n\tif (res)\n\t{\n\t\tm_LastMoveItemsOutTick = a_CurrentTick;\n\t}\n\n\treturn res;\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)\n{\n\tconst auto ConnectedBlockEntity = a_Chunk.GetBlockEntityRel(GetRelPos().addedY(1));\n\n\tif (ConnectedBlockEntity == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\tconst auto ConnectedChest = static_cast<cChestEntity *>(ConnectedBlockEntity);\n\n\tif (MoveItemsFromGrid(ConnectedChest->GetPrimaryChest()))\n\t{\n\t\treturn true;\n\t}\n\n\tconst auto SecondaryChest = ConnectedChest->GetSecondaryChest();\n\treturn (SecondaryChest != nullptr) && MoveItemsFromGrid(*SecondaryChest);\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsFromFurnace(cChunk & a_Chunk)\n{\n\tauto furnace = static_cast<cFurnaceEntity *>(a_Chunk.GetBlockEntity(m_Pos.addedY(1)));\n\tif (furnace == nullptr)\n\t{\n\t\tFLOGWARNING(\"{0}: A furnace entity was not found where expected, at {1}\", __FUNCTION__, m_Pos.addedY(1));\n\t\treturn false;\n\t}\n\n\t// Try move from the output slot:\n\tif (MoveItemsFromSlot(*furnace, cFurnaceEntity::fsOutput))\n\t{\n\t\tcItem NewOutput(furnace->GetOutputSlot());\n\t\tfurnace->SetOutputSlot(NewOutput.AddCount(-1));\n\t\treturn true;\n\t}\n\n\t// No output moved, check if we can move an empty bucket out of the fuel slot:\n\tif (furnace->GetFuelSlot().m_ItemType == E_ITEM_BUCKET)\n\t{\n\t\tif (MoveItemsFromSlot(*furnace, cFurnaceEntity::fsFuel))\n\t\t{\n\t\t\tfurnace->SetFuelSlot(cItem());\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Nothing can be moved\n\treturn false;\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsFromGrid(cBlockEntityWithItems & a_Entity)\n{\n\tauto & Grid = a_Entity.GetContents();\n\tint NumSlots = Grid.GetNumSlots();\n\n\tfor (int i = 0; i < NumSlots; i++)\n\t{\n\t\tif (Grid.IsSlotEmpty(i))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (MoveItemsFromSlot(a_Entity, i))\n\t\t{\n\t\t\tGrid.ChangeSlotCount(i, -1);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_SlotNum)\n{\n\tcItem One(a_Entity.GetSlot(a_SlotNum).CopyOne());\n\tfor (int i = 0; i < ContentsWidth * ContentsHeight; i++)\n\t{\n\t\tif (m_Contents.IsSlotEmpty(i))\n\t\t{\n\t\t\tif (cPluginManager::Get()->CallHookHopperPullingItem(*m_World, *this, i, a_Entity, a_SlotNum))\n\t\t\t{\n\t\t\t\t// Plugin disagrees with the move\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tm_Contents.SetSlot(i, One);\n\t\t\treturn true;\n\t\t}\n\t\telse if (m_Contents.GetSlot(i).IsEqual(One))\n\t\t{\n\t\t\tif (cPluginManager::Get()->CallHookHopperPullingItem(*m_World, *this, i, a_Entity, a_SlotNum))\n\t\t\t{\n\t\t\t\t// Plugin disagrees with the move\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tauto PreviousCount = m_Contents.GetSlot(i).m_ItemCount;\n\t\t\tm_Contents.ChangeSlotCount(i, 1);\n\n\t\t\tif (PreviousCount + 1 == m_Contents.GetSlot(i).m_ItemCount)\n\t\t\t{\n\t\t\t\t// Successfully added a new item. (Failure condition consistutes: stack full)\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, Vector3i a_Coords)\n{\n\tconst auto ConnectedBlockEntity = a_Chunk.GetBlockEntity(a_Coords);\n\n\tif (ConnectedBlockEntity == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\tconst auto ConnectedChest = static_cast<cChestEntity *>(ConnectedBlockEntity);\n\n\tif (MoveItemsToGrid(ConnectedChest->GetPrimaryChest()))\n\t{\n\t\treturn true;\n\t}\n\n\tconst auto SecondaryChest = ConnectedChest->GetSecondaryChest();\n\treturn (SecondaryChest != nullptr) && MoveItemsToGrid(*SecondaryChest);\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsToFurnace(cChunk & a_Chunk, Vector3i a_Coords, NIBBLETYPE a_HopperMeta)\n{\n\tauto furnace = static_cast<cFurnaceEntity *>(a_Chunk.GetBlockEntity(a_Coords));\n\tif (a_HopperMeta == E_META_HOPPER_FACING_YM)\n\t{\n\t\t// Feed the input slot of the furnace\n\t\treturn MoveItemsToSlot(*furnace, cFurnaceEntity::fsInput);\n\t}\n\telse\n\t{\n\t\t// Feed the fuel slot of the furnace\n\t\treturn MoveItemsToSlot(*furnace, cFurnaceEntity::fsFuel);\n\t}\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsToGrid(cBlockEntityWithItems & a_Entity)\n{\n\t// Iterate through our slots, try to move from each one:\n\tint NumSlots = a_Entity.GetContents().GetNumSlots();\n\tfor (int i = 0; i < NumSlots; i++)\n\t{\n\t\tif (MoveItemsToSlot(a_Entity, i))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cHopperEntity::MoveItemsToSlot(cBlockEntityWithItems & a_Entity, int a_DstSlotNum)\n{\n\tcItemGrid & Grid = a_Entity.GetContents();\n\tif (Grid.IsSlotEmpty(a_DstSlotNum))\n\t{\n\t\t// The slot is empty, move the first non-empty slot from our contents:\n\t\tfor (int i = 0; i < ContentsWidth * ContentsHeight; i++)\n\t\t{\n\t\t\tif (!m_Contents.IsSlotEmpty(i))\n\t\t\t{\n\t\t\t\tif (cPluginManager::Get()->CallHookHopperPushingItem(*m_World, *this, i, a_Entity, a_DstSlotNum))\n\t\t\t\t{\n\t\t\t\t\t// A plugin disagrees with the move\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tGrid.SetSlot(a_DstSlotNum, m_Contents.GetSlot(i).CopyOne());\n\t\t\t\tm_Contents.ChangeSlotCount(i, -1);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\telse\n\t{\n\t\t// The slot is taken, try to top it up:\n\t\tconst cItem & DestSlot = Grid.GetSlot(a_DstSlotNum);\n\t\tif (DestSlot.IsFullStack())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tfor (int i = 0; i < ContentsWidth * ContentsHeight; i++)\n\t\t{\n\t\t\tif (m_Contents.GetSlot(i).IsEqual(DestSlot))\n\t\t\t{\n\t\t\t\tif (cPluginManager::Get()->CallHookHopperPushingItem(*m_World, *this, i, a_Entity, a_DstSlotNum))\n\t\t\t\t{\n\t\t\t\t\t// A plugin disagrees with the move\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tGrid.ChangeSlotCount(a_DstSlotNum, 1);\n\t\t\t\tm_Contents.ChangeSlotCount(i, -1);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/BlockEntities/HopperEntity.h",
    "content": "\n// HopperEntity.h\n\n// Declares the cHopperEntity representing a hopper block entity\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntityWithItems.h\"\n\n\n\n\n\n// tolua_begin\nclass cHopperEntity :\n\tpublic cBlockEntityWithItems\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntityWithItems;\n\n\t// tolua_begin\n\npublic:\n\n\tenum\n\t{\n\t\tContentsHeight = 1,\n\t\tContentsWidth  = 5\n\t} ;\n\n\t// tolua_end\n\n\t/** Constructor used for normal operation */\n\tcHopperEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t/** Returns the block coords of the block receiving the output items, based on the meta\n\tReturns <false, undefined> if unattached.\n\tExported in ManualBindings.cpp. */\n\tstd::pair<bool, Vector3i> GetOutputBlockPos(NIBBLETYPE a_BlockMeta);\n\n\tvoid SetLocked(bool a_Value);\n\nprotected:\n\n\tcTickTimeLong m_LastMoveItemsInTick;\n\tcTickTimeLong m_LastMoveItemsOutTick;\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\n\t/** Opens a new chest window for this chest. Scans for neighbors to open a double chest window, if appropriate. */\n\tvoid OpenNewWindow(void);\n\n\t/** Moves items from the container above it into this hopper. Returns true if the contents have changed. */\n\tbool MoveItemsIn(cChunk & a_Chunk, cTickTimeLong a_CurrentTick);\n\n\t/** Moves pickups from above this hopper into it. Returns true if the contents have changed. */\n\tbool MovePickupsIn(cChunk & a_Chunk);\n\n\t/** Moves items out from this hopper into the destination. Returns true if the contents have changed. */\n\tbool MoveItemsOut(cChunk & a_Chunk, cTickTimeLong a_CurrentTick);\n\n\t/** Moves items from a chest (dblchest) above the hopper into this hopper. Returns true if contents have changed. */\n\tbool MoveItemsFromChest(cChunk & a_Chunk);\n\n\t/** Moves items from a furnace above the hopper into this hopper. Returns true if contents have changed. */\n\tbool MoveItemsFromFurnace(cChunk & a_Chunk);\n\n\t/** Moves items from the specified a_Entity's Contents into this hopper. Returns true if contents have changed. */\n\tbool MoveItemsFromGrid(cBlockEntityWithItems & a_Entity);\n\n\t/** Moves one piece from the specified itemstack into this hopper. Returns true if contents have changed. Doesn't change the itemstack. */\n\tbool MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_SrcSlotNum);\n\n\t/** Moves items to the chest at the specified absolute coords. Returns true if contents have changed */\n\tbool MoveItemsToChest(cChunk & a_Chunk, Vector3i a_Coords);\n\n\t/** Moves items to the furnace at the specified absolute coords. Returns true if contents have changed */\n\tbool MoveItemsToFurnace(cChunk & a_Chunk, Vector3i a_Coords, NIBBLETYPE a_HopperMeta);\n\n\t/** Moves items to the specified ItemGrid. Returns true if contents have changed */\n\tbool MoveItemsToGrid(cBlockEntityWithItems & a_Entity);\n\n\t/** Moves one piece to the specified entity's contents' slot. Returns true if contents have changed. */\n\tbool MoveItemsToSlot(cBlockEntityWithItems & a_Entity, int a_DstSlotNum);\n\nprivate:\n\n\tbool m_Locked;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/JukeboxEntity.cpp",
    "content": "\n// JukeboxEntity.cpp\n\n// Implements the cJukeboxEntity class representing a single jukebox in the world\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n#include \"JukeboxEntity.h\"\n#include \"../World.h\"\n#include \"../EffectID.h\"\n#include \"json/value.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\ncJukeboxEntity::cJukeboxEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tm_Record(0)\n{\n\tASSERT(a_BlockType == E_BLOCK_JUKEBOX);\n}\n\n\n\n\n\nvoid cJukeboxEntity::Destroy(void)\n{\n\tASSERT(m_World != nullptr);\n\tm_World->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_PLAY_MUSIC_DISC, GetPos(), 0);\n}\n\n\n\n\n\ncItems cJukeboxEntity::ConvertToPickups() const\n{\n\treturn IsPlayingRecord() ? cItem(static_cast<short>(m_Record)) : cItems();\n}\n\n\n\n\n\nvoid cJukeboxEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cJukeboxEntity &>(a_Src);\n\tm_Record = src.m_Record;\n}\n\n\n\n\n\nbool cJukeboxEntity::UsedBy(cPlayer * a_Player)\n{\n\tif (IsPlayingRecord())\n\t{\n\t\tEjectRecord();\n\t\treturn true;\n\t}\n\n\tconst cItem & HeldItem = a_Player->GetEquippedItem();\n\tif (PlayRecord(HeldItem.m_ItemType))\n\t{\n\t\ta_Player->GetStatistics().Custom[CustomStatistic::PlayRecord]++;\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// No state change, continue with block placement:\n\treturn false;\n}\n\n\n\n\n\nbool cJukeboxEntity::PlayRecord(int a_Record)\n{\n\tif (!IsRecordItem(a_Record))\n\t{\n\t\t// This isn't a Record Item\n\t\treturn false;\n\t}\n\n\tif (IsPlayingRecord())\n\t{\n\t\t// A Record is already in the Jukebox.\n\t\tEjectRecord();\n\t}\n\n\tm_Record = a_Record;\n\tm_World->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_PLAY_MUSIC_DISC, GetPos(), m_Record);\n\tm_World->SetBlockMeta(m_Pos, E_META_JUKEBOX_ON);\n\treturn true;\n}\n\n\n\n\n\nbool cJukeboxEntity::EjectRecord(void)\n{\n\tif (!IsPlayingRecord())\n\t{\n\t\t// There's no record here\n\t\treturn false;\n\t}\n\n\tm_World->SpawnItemPickups(cItem(static_cast<short>(m_Record)), Vector3d(0.5, 0.5, 0.5) + m_Pos, 10);\n\tm_World->SetBlockMeta(m_Pos, E_META_JUKEBOX_OFF);\n\tm_World->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_PLAY_MUSIC_DISC, GetPos(), 0);\n\n\tm_Record = 0;\n\treturn true;\n}\n\n\n\n\n\nbool cJukeboxEntity::IsPlayingRecord(void) const\n{\n\treturn m_Record != 0;\n}\n\n\n\n\n\nint cJukeboxEntity::GetRecord(void)\n{\n\treturn m_Record;\n}\n\n\n\n\n\nvoid cJukeboxEntity::SetRecord(int a_Record)\n{\n\tm_Record = a_Record;\n}\n"
  },
  {
    "path": "src/BlockEntities/JukeboxEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"../BlockType.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cJukeboxEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\tcJukeboxEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// tolua_begin\n\n\tint  GetRecord(void);\n\tvoid SetRecord(int a_Record);\n\n\t/** Plays the specified Record. Return false if a_Record isn't a playable Record (E_ITEM_XXX_DISC).\n\tIf there is a record already playing, ejects it first. */\n\tbool PlayRecord(int a_Record);\n\n\t/** Ejects the currently held record as a pickup. Return false when no record had been inserted. */\n\tbool EjectRecord(void);\n\n\t/** Is in the Jukebox a Record? */\n\tbool IsPlayingRecord(void) const;\n\n\tstatic bool IsRecordItem(int a_Item)\n\t{\n\t\treturn ((a_Item >= E_ITEM_FIRST_DISC) && (a_Item <= E_ITEM_LAST_DISC));\n\t}\n\n\t// tolua_end\n\n\t// cBlockEntity overrides:\n\tvirtual void Destroy(void) override;\n\tvirtual cItems ConvertToPickups() const override;\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\tvirtual void SendTo(cClientHandle &) override {}\n\nprivate:\n\tint m_Record;\n} ;  // tolua_end\n"
  },
  {
    "path": "src/BlockEntities/MobHeadEntity.cpp",
    "content": "\n// MobHeadEntity.cpp\n\n// Implements the cMobHeadEntity class representing a single skull / head in the world\n\n#include \"Globals.h\"\n#include \"MobHeadEntity.h\"\n#include \"json/json.h\"\n#include \"../Entities/Player.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncMobHeadEntity::cMobHeadEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tm_Type(SKULL_TYPE_SKELETON),\n\tm_Rotation(SKULL_ROTATION_NORTH)\n{\n\tASSERT(a_BlockType == E_BLOCK_HEAD);\n}\n\n\n\n\n\nvoid cMobHeadEntity::SetType(const eMobHeadType & a_Type)\n{\n\tif ((!m_OwnerName.empty()) && (a_Type != SKULL_TYPE_PLAYER))\n\t{\n\t\tm_OwnerName = m_OwnerTexture = m_OwnerTextureSignature = \"\";\n\t\tm_OwnerUUID = cUUID{};\n\t}\n\tm_Type = a_Type;\n}\n\n\n\n\n\nvoid cMobHeadEntity::SetRotation(eMobHeadRotation a_Rotation)\n{\n\tm_Rotation = a_Rotation;\n}\n\n\n\n\n\nvoid cMobHeadEntity::SetOwner(const cPlayer & a_Owner)\n{\n\tif (m_Type != SKULL_TYPE_PLAYER)\n\t{\n\t\treturn;\n\t}\n\n\tm_OwnerName = a_Owner.GetName();\n\tm_OwnerUUID = a_Owner.GetUUID();\n\n\tconst Json::Value & Properties = a_Owner.GetClientHandle()->GetProperties();\n\tfor (auto & Node : Properties)\n\t{\n\t\tif (Node.get(\"name\", \"\").asString() == \"textures\")\n\t\t{\n\t\t\tm_OwnerTexture = Node.get(\"value\", \"\").asString();\n\t\t\tm_OwnerTextureSignature = Node.get(\"signature\", \"\").asString();\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMobHeadEntity::SetOwner(const cUUID & a_OwnerUUID, const AString & a_OwnerName, const AString & a_OwnerTexture, const AString & a_OwnerTextureSignature)\n{\n\tif (m_Type != SKULL_TYPE_PLAYER)\n\t{\n\t\treturn;\n\t}\n\n\tm_OwnerUUID = a_OwnerUUID;\n\tm_OwnerName = a_OwnerName;\n\tm_OwnerTexture = a_OwnerTexture;\n\tm_OwnerTextureSignature = a_OwnerTextureSignature;\n}\n\n\n\n\n\ncItems cMobHeadEntity::ConvertToPickups() const\n{\n\treturn cItem(E_ITEM_HEAD, 1, static_cast<short>(m_Type));\n}\n\n\n\n\n\nvoid cMobHeadEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cMobHeadEntity &>(a_Src);\n\tm_OwnerName = src.m_OwnerName;\n\tm_OwnerTexture = src.m_OwnerTexture;\n\tm_OwnerTextureSignature = src.m_OwnerTextureSignature;\n\tm_OwnerUUID = src.m_OwnerUUID;\n\tm_Rotation = src.m_Rotation;\n\tm_Type = src.m_Type;\n}\n\n\n\n\n\nvoid cMobHeadEntity::SendTo(cClientHandle & a_Client)\n{\n\tcWorld * World = a_Client.GetPlayer()->GetWorld();\n\ta_Client.SendBlockChange(m_Pos, m_BlockType, World->GetBlockMeta(GetPos()));\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n\n\n\n\n\nbool cMobHeadEntity::UsedBy(cPlayer * a_Player)\n{\n\tUNUSED(a_Player);\n\treturn false;\n}\n"
  },
  {
    "path": "src/BlockEntities/MobHeadEntity.h",
    "content": "// MobHeadEntity.h\n\n// Declares the cMobHeadEntity class representing a single skull / head in the world\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"../Defines.h\"\n#include \"../UUID.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cMobHeadEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\t/** Creates a new mob head entity at the specified block coords. a_World may be nullptr */\n\tcMobHeadEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// tolua_begin\n\n\t/** Set the type of the mob head */\n\tvoid SetType(const eMobHeadType & a_SkullType);\n\n\t/** Set the rotation of the mob head */\n\tvoid SetRotation(eMobHeadRotation a_Rotation);\n\n\t/** Set the player for mob heads with player type */\n\tvoid SetOwner(const cPlayer & a_Owner);\n\n\t/** Returns the type of the mob head */\n\teMobHeadType GetType(void) const { return m_Type; }\n\n\t/** Returns the rotation of the mob head */\n\teMobHeadRotation GetRotation(void) const { return m_Rotation; }\n\n\t/** Returns the player name of the mob head */\n\tAString GetOwnerName(void) const { return m_OwnerName; }\n\n\t/** Returns the texture of the mob head */\n\tAString GetOwnerTexture(void) const { return m_OwnerTexture; }\n\n\t/** Returns the texture signature of the mob head */\n\tAString GetOwnerTextureSignature(void) const { return m_OwnerTextureSignature; }\n\n\t// tolua_end\n\n\t/** Sets the player components for the mob heads with player type. */\n\tvoid SetOwner(\n\t\tconst cUUID & a_OwnerUUID, const AString & a_OwnerName,\n\t\tconst AString & a_OwnerTexture, const AString & a_OwnerTextureSignature\n\t);  // Exported in ManualBindings.cpp\n\n\t/** Returns the player UUID of the mob head */\n\tcUUID GetOwnerUUID(void) const { return m_OwnerUUID; }  // Exported in ManualBindings.cpp\n\nprivate:\n\n\teMobHeadType m_Type;\n\teMobHeadRotation m_Rotation;\n\n\tAString m_OwnerName;\n\tcUUID   m_OwnerUUID;\n\tAString m_OwnerTexture;\n\tAString m_OwnerTextureSignature;\n\n\t// cBlockEntity overrides:\n\tvirtual cItems ConvertToPickups() const override;\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/MobSpawnerEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"MobSpawnerEntity.h\"\n\n#include \"../World.h\"\n#include \"../FastRandom.h\"\n#include \"../MobSpawner.h\"\n#include \"../ClientHandle.h\"\n#include \"../Items/ItemSpawnEgg.h\"\n\n\n\n\n\ncMobSpawnerEntity::cMobSpawnerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tm_Entity(mtPig),\n\tm_SpawnDelay(100),\n\tm_IsActive(false)\n{\n\tASSERT(a_BlockType == E_BLOCK_MOB_SPAWNER);\n}\n\n\n\n\n\nvoid cMobSpawnerEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cMobSpawnerEntity &>(a_Src);\n\tm_Entity = src.m_Entity;\n\tm_IsActive = src.m_IsActive;\n\tm_SpawnDelay = src.m_SpawnDelay;\n\tm_SpawnCount = src.m_SpawnCount;\n\tm_SpawnRange = src.m_SpawnRange;\n\tm_MinSpawnDelay = src.m_MinSpawnDelay;\n\tm_MaxSpawnDelay = src.m_MaxSpawnDelay;\n\tm_MaxNearbyEntities = src.m_MaxNearbyEntities;\n\tm_RequiredPlayerRange = src.m_RequiredPlayerRange;\n}\n\n\n\n\n\nvoid cMobSpawnerEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateBlockEntity(*this);\n}\n\n\n\n\n\nbool cMobSpawnerEntity::UsedBy(cPlayer * a_Player)\n{\n\tif (a_Player->GetEquippedItem().m_ItemType == E_ITEM_SPAWN_EGG)\n\t{\n\t\teMonsterType MonsterType = cItemSpawnEggHandler::ItemDamageToMonsterType(a_Player->GetEquippedItem().m_ItemDamage);\n\t\tif (MonsterType == eMonsterType::mtInvalidType)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tm_Entity = MonsterType;\n\t\tResetTimer();\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t\tm_World->BroadcastBlockEntity(GetPos());\n\t\tFLOGD(\"Changed monster spawner at {0} to type {1}.\", GetPos(), cMonster::MobTypeToString(MonsterType));\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cMobSpawnerEntity::UpdateActiveState(void)\n{\n\tm_IsActive = (GetNearbyPlayersNum() > 0);\n}\n\n\n\n\n\nbool cMobSpawnerEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tusing namespace std::chrono_literals;\n\n\t// Update the active flag every 5 seconds:\n\tif ((m_World->GetWorldTickAge() % 5s) == 0s)\n\t{\n\t\tUpdateActiveState();\n\t}\n\n\tif (!m_IsActive)\n\t{\n\t\treturn false;\n\t}\n\n\tif (m_SpawnDelay <= 0)\n\t{\n\t\tSpawnEntity();\n\t\tm_World->BroadcastBlockEntity(GetPos());\n\t\treturn true;\n\t}\n\telse\n\t{\n\t\tm_SpawnDelay--;\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cMobSpawnerEntity::ResetTimer(void)\n{\n\tm_SpawnDelay = GetRandomProvider().RandInt<short>(m_MinSpawnDelay, m_MaxSpawnDelay);\n}\n\n\n\n\n\nvoid cMobSpawnerEntity::SpawnEntity(void)\n{\n\tauto NearbyEntities = GetNearbyMonsterNum(m_Entity);\n\tif (NearbyEntities >= m_MaxNearbyEntities)\n\t{\n\t\tResetTimer();\n\t\treturn;\n\t}\n\n\tbool EntitiesSpawned = m_World->DoWithChunk(GetChunkX(), GetChunkZ(), [this, NearbyEntities](cChunk & a_Chunk)\n\t\t{\n\t\t\tauto & Random = GetRandomProvider();\n\t\t\tauto EntitySpawnTally = NearbyEntities;\n\n\t\t\tbool HaveSpawnedEntity = false;\n\t\t\tfor (short I = 0; I < m_SpawnCount; I++)\n\t\t\t{\n\t\t\t\tif (EntitySpawnTally >= m_MaxNearbyEntities)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tauto SpawnRelPos(GetRelPos());\n\t\t\t\tSpawnRelPos += Vector3i(\n\t\t\t\t\tstatic_cast<int>((Random.RandReal<double>() - Random.RandReal<double>()) * static_cast<double>(m_SpawnRange)),\n\t\t\t\t\tRandom.RandInt(-1, 1),\n\t\t\t\t\tstatic_cast<int>((Random.RandReal<double>() - Random.RandReal<double>()) * static_cast<double>(m_SpawnRange))\n\t\t\t\t);\n\n\t\t\t\tauto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(SpawnRelPos);\n\t\t\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tEMCSBiome Biome = Chunk->GetBiomeAt(SpawnRelPos.x, SpawnRelPos.z);\n\n\t\t\t\tif (cMobSpawner::CanSpawnHere(Chunk, SpawnRelPos, m_Entity, Biome, true))\n\t\t\t\t{\n\t\t\t\t\tauto AbsPos = Chunk->RelativeToAbsolute(SpawnRelPos);\n\t\t\t\t\tauto Monster = cMonster::NewMonsterFromType(m_Entity);\n\t\t\t\t\tif (Monster == nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tMonster->SetPosition(AbsPos);\n\t\t\t\t\tMonster->SetYaw(Random.RandReal(360.0f));\n\t\t\t\t\tif (Chunk->GetWorld()->SpawnMobFinalize(std::move(Monster)) != cEntity::INVALID_ID)\n\t\t\t\t\t{\n\t\t\t\t\t\tHaveSpawnedEntity = true;\n\t\t\t\t\t\tm_World->BroadcastSoundParticleEffect(EffectID::PARTICLE_MOBSPAWN, AbsPos, 0);\n\t\t\t\t\t\tEntitySpawnTally++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn HaveSpawnedEntity;\n\t\t}\n\t);\n\n\tif (EntitiesSpawned)\n\t{\n\t\tResetTimer();\n\t}\n}\n\n\n\n\n\nint cMobSpawnerEntity::GetNearbyPlayersNum(void)\n{\n\tint NumPlayers = 0;\n\n\tauto Callback = [this, &NumPlayers](cEntity & a_Entity)\n\t{\n\t\tif (!a_Entity.IsPlayer())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif ((m_Pos - a_Entity.GetPosition()).Length() <= m_RequiredPlayerRange)\n\t\t{\n\t\t\tNumPlayers++;\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst cBoundingBox PlayerBoundingBox(Vector3d(m_Pos.x, m_Pos.y - m_RequiredPlayerRange, m_Pos.z), m_RequiredPlayerRange, m_RequiredPlayerRange * 2);\n\tm_World->ForEachEntityInBox(PlayerBoundingBox, Callback);\n\n\treturn NumPlayers;\n}\n\n\n\n\n\nint cMobSpawnerEntity::GetNearbyMonsterNum(eMonsterType a_EntityType)\n{\n\tint NumEntities = 0;\n\n\tauto Callback = [this, &NumEntities](cEntity & a_Entity)\n\t{\n\t\tif (!a_Entity.IsMob())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tauto & Mob = static_cast<cMonster &>(a_Entity);\n\t\tif (Mob.GetMobType() == m_Entity)\n\t\t{\n\t\t\tNumEntities++;\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst cBoundingBox EntityBoundingBox(Vector3d(m_Pos.x, m_Pos.y - 4, m_Pos.z), m_SpawnRange, 8);\n\tm_World->ForEachEntityInBox(EntityBoundingBox, Callback);\n\n\treturn NumEntities;\n}\n"
  },
  {
    "path": "src/BlockEntities/MobSpawnerEntity.h",
    "content": "// MobSpawnerEntity.h\n\n// Declares the cMobSpawnerEntity class representing a single mob spawner in the world\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\n// tolua_begin\nclass cMobSpawnerEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\tcMobSpawnerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\tvirtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\t// tolua_begin\n\n\t/** Update the active flag from the mob spawner. This function will called every 5 seconds from the Tick() function. */\n\tvoid UpdateActiveState(void);\n\n\t/** Sets the spawn delay to a new random value. */\n\tvoid ResetTimer(void);\n\n\t/** Spawns the entity. This function automatically change the spawn delay! */\n\tvoid SpawnEntity(void);\n\n\t// Getters\n\tint GetNearbyMonsterNum(eMonsterType a_EntityType);\n\tint GetNearbyPlayersNum(void);\n\n\teMonsterType GetEntity(void) const       { return m_Entity; }\n\tshort GetSpawnCount(void) const          { return m_SpawnCount; }\n\tshort GetSpawnRange(void) const          { return m_SpawnRange; }\n\tshort GetSpawnDelay(void) const          { return m_SpawnDelay; }\n\tshort GetMinSpawnDelay(void) const       { return m_MinSpawnDelay; }\n\tshort GetMaxSpawnDelay(void) const       { return m_MaxSpawnDelay; }\n\tshort GetMaxNearbyEntities(void) const   { return m_MaxNearbyEntities; }\n\tshort GetRequiredPlayerRange(void) const { return m_RequiredPlayerRange; }\n\n\t// Setters\n\tvoid SetEntity(eMonsterType a_EntityType)                { m_Entity = a_EntityType; }\n\tvoid SetSpawnDelay(short a_Delay)                        { m_SpawnDelay = a_Delay; }\n\tvoid SetSpawnCount(short a_SpawnCount)                   { m_SpawnCount = a_SpawnCount; }\n\tvoid SetSpawnRange(short a_SpawnRange)                   { m_SpawnRange = a_SpawnRange; }\n\tvoid SetMinSpawnDelay(short a_Min)                       { m_MinSpawnDelay = a_Min; }\n\tvoid SetMaxSpawnDelay(short a_Max)                       { m_MaxSpawnDelay = a_Max; }\n\tvoid SetMaxNearbyEntities(short a_MaxNearbyEntities)     { m_MaxNearbyEntities = a_MaxNearbyEntities; }\n\tvoid SetRequiredPlayerRange(short a_RequiredPlayerRange) { m_RequiredPlayerRange = a_RequiredPlayerRange; }\n\n\t// tolua_end\n\nprivate:\n\n\t/** The entity to spawn. */\n\teMonsterType m_Entity;\n\n\t/** Time in ticks until the next entity spawns */\n\tshort m_SpawnDelay;\n\n\tbool m_IsActive;\n\n\t/** Number of entities the spawner tries to spawn each activation. */\n\tshort m_SpawnCount = 4;\n\n\t/** Diameter of the square the new monsters are spawned in */\n\tshort m_SpawnRange = 8;\n\n\tshort m_MinSpawnDelay = 200;\n\n\tshort m_MaxSpawnDelay = 800;\n\n\t/** Maximum amount of the same entity type in proximity. */\n\tshort m_MaxNearbyEntities = 6;\n\n\t/** Maximum distance to player for activation */\n\tshort m_RequiredPlayerRange = 16;\n\n} ;  // tolua_end\n"
  },
  {
    "path": "src/BlockEntities/NoteEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"NoteEntity.h\"\n#include \"../World.h\"\n#include \"json/value.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\ncNoteEntity::cNoteEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World),\n\tm_Note(0)\n{\n\tASSERT(a_BlockType == E_BLOCK_NOTE_BLOCK);\n}\n\n\n\n\n\nvoid cNoteEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cNoteEntity &>(a_Src);\n\tm_Note = src.m_Note;\n}\n\n\n\n\n\nbool cNoteEntity::UsedBy(cPlayer * a_Player)\n{\n\ta_Player->GetStatistics().Custom[CustomStatistic::TuneNoteblock]++;\n\tIncrementNote();\n\tMakeSound();\n\treturn true;\n}\n\n\n\n\n\nvoid cNoteEntity::MakeSound(void)\n{\n\tchar Instrument;\n\tAString SampleName;\n\n\tswitch (m_World->GetBlock(m_Pos.addedY(-1)))\n\t{\n\t\tcase E_BLOCK_ACACIA_DOOR:\n\t\tcase E_BLOCK_ACACIA_FENCE:\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:\n\t\tcase E_BLOCK_ACACIA_WOOD_STAIRS:\n\t\tcase E_BLOCK_BIRCH_DOOR:\n\t\tcase E_BLOCK_BIRCH_FENCE:\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:\n\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS:\n\t\tcase E_BLOCK_BOOKCASE:\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_CRAFTING_TABLE:\n\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\tcase E_BLOCK_DARK_OAK_FENCE:\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_DARK_OAK_WOOD_STAIRS:\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_DOUBLE_WOODEN_SLAB:\n\t\tcase E_BLOCK_FENCE:\n\t\tcase E_BLOCK_HUGE_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_HUGE_RED_MUSHROOM:\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_JUKEBOX:\n\t\tcase E_BLOCK_JUNGLE_DOOR:\n\t\tcase E_BLOCK_JUNGLE_FENCE:\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:\n\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:\n\t\tcase E_BLOCK_LOG:\n\t\tcase E_BLOCK_NEW_LOG:\n\t\tcase E_BLOCK_NOTE_BLOCK:\n\t\tcase E_BLOCK_OAK_DOOR:\n\t\tcase E_BLOCK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_OAK_WOOD_STAIRS:\n\t\tcase E_BLOCK_PLANKS:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_SPRUCE_DOOR:\n\t\tcase E_BLOCK_SPRUCE_FENCE:\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:\n\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_TRAPDOOR:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\tcase E_BLOCK_WOODEN_SLAB:\n\t\t{\n\t\t\tInstrument = E_INST_DOUBLE_BASS;\n\t\t\tSampleName = \"block.note.bass\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_GRAVEL:\n\t\tcase E_BLOCK_SAND:\n\t\tcase E_BLOCK_SOULSAND:\n\t\t{\n\t\t\tInstrument = E_INST_SNARE_DRUM;\n\t\t\tSampleName = \"block.note.snare\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_BEACON:\n\t\tcase E_BLOCK_GLASS:\n\t\tcase E_BLOCK_GLASS_PANE:\n\t\tcase E_BLOCK_GLOWSTONE:\n\t\tcase E_BLOCK_SEA_LANTERN:\n\t\tcase E_BLOCK_STAINED_GLASS:\n\t\tcase E_BLOCK_STAINED_GLASS_PANE:\n\t\t{\n\t\t\tInstrument = E_INST_CLICKS;\n\t\t\tSampleName = \"block.note.hat\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_BEDROCK:\n\t\tcase E_BLOCK_BLACK_SHULKER_BOX:\n\t\tcase E_BLOCK_BLOCK_OF_COAL:\n\t\tcase E_BLOCK_BLUE_SHULKER_BOX:\n\t\tcase E_BLOCK_BRICK:\n\t\tcase E_BLOCK_BRICK_STAIRS:\n\t\tcase E_BLOCK_BROWN_SHULKER_BOX:\n\t\tcase E_BLOCK_COAL_ORE:\n\t\tcase E_BLOCK_COBBLESTONE:\n\t\tcase E_BLOCK_COBBLESTONE_STAIRS:\n\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\tcase E_BLOCK_CYAN_SHULKER_BOX:\n\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_EMERALD_ORE:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_END_BRICKS:\n\t\tcase E_BLOCK_END_PORTAL_FRAME:\n\t\tcase E_BLOCK_END_STONE:\n\t\tcase E_BLOCK_ENDER_CHEST:\n\t\tcase E_BLOCK_FURNACE:\n\t\tcase E_BLOCK_GOLD_ORE:\n\t\tcase E_BLOCK_GRAY_SHULKER_BOX:\n\t\tcase E_BLOCK_GREEN_SHULKER_BOX:\n\t\tcase E_BLOCK_IRON_ORE:\n\t\tcase E_BLOCK_LAPIS_ORE:\n\t\tcase E_BLOCK_LIGHT_BLUE_SHULKER_BOX:\n\t\tcase E_BLOCK_LIGHT_GRAY_SHULKER_BOX:\n\t\tcase E_BLOCK_LIME_SHULKER_BOX:\n\t\tcase E_BLOCK_LIT_FURNACE:\n\t\tcase E_BLOCK_MAGENTA_SHULKER_BOX:\n\t\tcase E_BLOCK_MAGMA:\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\tcase E_BLOCK_MOSSY_COBBLESTONE:\n\t\tcase E_BLOCK_NETHER_BRICK:\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:\n\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:\n\t\tcase E_BLOCK_NETHERRACK:\n\t\tcase E_BLOCK_OBSERVER:\n\t\tcase E_BLOCK_OBSIDIAN:\n\t\tcase E_BLOCK_ORANGE_SHULKER_BOX:\n\t\tcase E_BLOCK_PINK_SHULKER_BOX:\n\t\tcase E_BLOCK_PRISMARINE_BLOCK:\n\t\tcase E_BLOCK_PURPLE_SHULKER_BOX:\n\t\tcase E_BLOCK_PURPUR_BLOCK:\n\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:\n\t\tcase E_BLOCK_PURPUR_PILLAR:\n\t\tcase E_BLOCK_PURPUR_SLAB:\n\t\tcase E_BLOCK_PURPUR_STAIRS:\n\t\tcase E_BLOCK_QUARTZ_BLOCK:\n\t\tcase E_BLOCK_QUARTZ_STAIRS:\n\t\tcase E_BLOCK_RED_NETHER_BRICK:\n\t\tcase E_BLOCK_RED_SANDSTONE:\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:\n\t\tcase E_BLOCK_RED_SHULKER_BOX:\n\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\tcase E_BLOCK_SANDSTONE:\n\t\tcase E_BLOCK_SANDSTONE_STAIRS:\n\t\tcase E_BLOCK_STONE:\n\t\tcase E_BLOCK_STONE_BRICK_STAIRS:\n\t\tcase E_BLOCK_STONE_BRICKS:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_STONE_SLAB:\n\t\tcase E_BLOCK_WHITE_SHULKER_BOX:\n\t\tcase E_BLOCK_YELLOW_SHULKER_BOX:\n\t\t{\n\t\t\tInstrument = E_INST_BASS_DRUM;\n\t\t\tSampleName = \"block.note.basedrum\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_CLAY:\n\t\t{\n\t\t\tInstrument = E_INST_FLUTE;\n\t\t\tSampleName = \"block.note.flute\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_GOLD_BLOCK:\n\t\t{\n\t\t\tInstrument = E_INST_BELL;\n\t\t\tSampleName = \"block.note.bell\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_WOOL:\n\t\t{\n\t\t\tInstrument = E_INST_GUITAR;\n\t\t\tSampleName = \"block.note.guitar\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_PACKED_ICE:\n\t\t{\n\t\t\tInstrument = E_INST_CHIME;\n\t\t\tSampleName = \"block.note.chime\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_BONE_BLOCK:\n\t\t{\n\t\t\tInstrument = E_INST_XYLOPHONE;\n\t\t\tSampleName = \"block.note.xylophone\";\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tInstrument = E_INST_HARP_PIANO;\n\t\t\tSampleName = \"block.note.harp\";\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tm_World->BroadcastBlockAction(m_Pos, static_cast<Byte>(Instrument), static_cast<Byte>(m_Note), E_BLOCK_NOTE_BLOCK);\n\n\tm_World->BroadcastSoundEffect(\n\t\tSampleName,\n\t\tm_Pos,\n\t\t3.0f,\n\t\tPitchFromNote(m_Note)\n\t);\n}\n\n\n\n\n\nunsigned char cNoteEntity::GetNote(void)\n{\n\treturn m_Note;\n}\n\n\n\n\n\nvoid cNoteEntity::SetNote(unsigned char a_Note)\n{\n\tm_Note = a_Note % 25;\n}\n\n\n\n\n\nvoid cNoteEntity::IncrementNote(void)\n{\n\tSetNote(m_Note + 1);\n}\n\n\n\n\n\nfloat cNoteEntity::PitchFromNote(unsigned char a_Pitch)\n{\n\t// This replaces the calculation of:\n\t// float calcPitch = static_cast<float>(pow(2.0f, static_cast<float>(m_Note - 12.0f) / 12.0f));\n\t// So 2 ^ ((m_Note - 12) / 12)\n\tswitch (a_Pitch)\n\t{\n\t\tcase 0: return 0.5f;\n\t\tcase 1: return 0.5297315471796477f;\n\t\tcase 2: return 0.5612310241546865f;\n\t\tcase 3: return 0.5946035575013605f;\n\t\tcase 4: return 0.6299605249474366f;\n\t\tcase 5: return 0.6674199270850172f;\n\t\tcase 6: return 0.7071067811865476f;\n\t\tcase 7: return 0.7491535384383408f;\n\t\tcase 8: return 0.7937005259840998f;\n\t\tcase 9: return 0.8408964152537145f;\n\t\tcase 10: return 0.8908987181403393f;\n\t\tcase 11: return 0.9438743126816935f;\n\t\tcase 12: return 1.0f;\n\t\tcase 13: return 1.0594630943592953f;\n\t\tcase 14: return 1.122462048309373f;\n\t\tcase 15: return 1.189207115002721f;\n\t\tcase 16: return 1.2599210498948732f;\n\t\tcase 17: return 1.3348398541700344f;\n\t\tcase 18: return 1.4142135623730951f;\n\t\tcase 19: return 1.4983070768766815f;\n\t\tcase 20: return 1.5874010519681994f;\n\t\tcase 21: return 1.681792830507429f;\n\t\tcase 22: return 1.7817974362806785f;\n\t\tcase 23: return 1.887748625363387f;\n\t\tcase 24: return 2.0f;\n\t}\n\tUNREACHABLE(\"Converted unknown pitch value\");\n}\n"
  },
  {
    "path": "src/BlockEntities/NoteEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n\n\n\n\n\nenum ENUM_NOTE_INSTRUMENTS\n{\n\tE_INST_HARP_PIANO  = 0,\n\tE_INST_DOUBLE_BASS = 1,\n\tE_INST_SNARE_DRUM  = 2,\n\tE_INST_CLICKS      = 3,\n\tE_INST_BASS_DRUM   = 4,\n\tE_INST_FLUTE       = 5,\n\tE_INST_BELL        = 6,\n\tE_INST_GUITAR      = 7,\n\tE_INST_CHIME       = 8,\n\tE_INST_XYLOPHONE   = 9\n};\n\n\n\n\n\n// tolua_begin\n\nclass cNoteEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\t/** Creates a new note entity. a_World may be nullptr */\n\tcNoteEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// tolua_begin\n\n\tunsigned char GetNote(void);\n\tvoid SetNote(unsigned char a_Note);\n\tvoid IncrementNote(void);\n\tvoid MakeSound(void);\n\n\t// tolua_end\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\tvirtual void SendTo(cClientHandle &) override {}\n\n\t/** Returns the relative pitch (used in the protocol)\n\tfrom a note value between 0 and 24 (used in m_Note). */\n\tstatic float PitchFromNote(unsigned char a_Note);\n\nprivate:\n\n\tunsigned char m_Note;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockEntities/SignEntity.cpp",
    "content": "\n// SignEntity.cpp\n\n// Implements the cSignEntity class representing a single sign in the world\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n#include \"json/value.h\"\n#include \"SignEntity.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncSignEntity::cSignEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World):\n\tSuper(a_BlockType, a_BlockMeta, a_Pos, a_World)\n{\n\tASSERT((a_BlockType ==  E_BLOCK_WALLSIGN) || (a_BlockType == E_BLOCK_SIGN_POST));\n\tASSERT(cChunkDef::IsValidHeight(a_Pos));\n}\n\n\n\n\n\nvoid cSignEntity::CopyFrom(const cBlockEntity & a_Src)\n{\n\tSuper::CopyFrom(a_Src);\n\tauto & src = static_cast<const cSignEntity &>(a_Src);\n\tm_Line = src.m_Line;\n}\n\n\n\n\n\nbool cSignEntity::UsedBy(cPlayer * a_Player)\n{\n\tUNUSED(a_Player);\n\treturn true;\n}\n\n\n\n\n\nvoid cSignEntity::SetLines(const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4)\n{\n\tm_Line[0] = a_Line1;\n\tm_Line[1] = a_Line2;\n\tm_Line[2] = a_Line3;\n\tm_Line[3] = a_Line4;\n}\n\n\n\n\n\nvoid cSignEntity::SetLine(size_t a_Index, const AString & a_Line)\n{\n\tif (a_Index >= m_Line.size())\n\t{\n\t\tLOGWARNING(\"%s: setting a non-existent line %d (value \\\"%s\\\"\", __FUNCTION__, a_Index, a_Line.c_str());\n\t\treturn;\n\t}\n\n\tm_Line[a_Index] = a_Line;\n}\n\n\n\n\n\nAString cSignEntity::GetLine(size_t a_Index) const\n{\n\tif (a_Index >= m_Line.size())\n\t{\n\t\tLOGWARNING(\"%s: requesting a non-existent line %d\", __FUNCTION__, a_Index);\n\t\treturn \"\";\n\t}\n\n\treturn m_Line[a_Index];\n}\n\n\n\n\n\nvoid cSignEntity::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendUpdateSign(m_Pos, m_Line[0], m_Line[1], m_Line[2], m_Line[3]);\n}\n"
  },
  {
    "path": "src/BlockEntities/SignEntity.h",
    "content": "// SignEntity.h\n\n// Declares the cSignEntity class representing a single sign in the world\n\n\n\n\n\n#pragma once\n\n#include \"BlockEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cSignEntity :\n\tpublic cBlockEntity\n{\n\t// tolua_end\n\n\tusing Super = cBlockEntity;\n\npublic:  // tolua_export\n\n\t/** Creates a new empty sign entity at the specified block coords and block type (wall or standing). a_World may be nullptr */\n\tcSignEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);\n\n\t// tolua_begin\n\n\t/** Sets all the sign's lines */\n\tvoid SetLines(const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);\n\n\t/** Sets individual line (zero-based index) */\n\tvoid SetLine(size_t a_Index, const AString & a_Line);\n\n\t/** Retrieves individual line (zero-based index) */\n\tAString GetLine(size_t a_Index) const;\n\n\t// tolua_end\n\n\t// cBlockEntity overrides:\n\tvirtual void CopyFrom(const cBlockEntity & a_Src) override;\n\tvirtual bool UsedBy(cPlayer * a_Player) override;\n\tvirtual void SendTo(cClientHandle & a_Client) override;\n\nprivate:\n\n\tstd::array<AString, 4> m_Line;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/BlockInServerPluginInterface.h",
    "content": "\n// BlockInServerPluginInterface.h\n\n// Defines the cBlockInServerPluginInterface class that implements the cBlockPluginInterface for blocks, using the plugin manager\n\n\n\n\n\n#pragma once\n\n#include \"Blocks/BlockPluginInterface.h\"\n#include \"Bindings/PluginManager.h\"\n\n\nclass cWorld;\n\n\nclass cBlockInServerPluginInterface :\n\tpublic cBlockPluginInterface\n{\npublic:\n\tcBlockInServerPluginInterface(cWorld & a_World) : m_World(a_World) {}\n\n\tvirtual bool CallHookBlockSpread(Vector3i a_BlockPos, eSpreadSource a_Source) override\n\t{\n\t\treturn cPluginManager::Get()->CallHookBlockSpread(m_World, a_BlockPos, a_Source);\n\t}\n\n\tvirtual bool CallHookPlayerBreakingBlock(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override\n\t{\n\t\treturn cPluginManager::Get()->CallHookPlayerBreakingBlock(a_Player, a_BlockPos, a_BlockFace, a_BlockType, a_BlockMeta);\n\t}\n\n\tvirtual bool CallHookPlayerBrokenBlock(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override\n\t{\n\t\treturn cPluginManager::Get()->CallHookPlayerBrokenBlock(a_Player, a_BlockPos, a_BlockFace, a_BlockType, a_BlockMeta);\n\t}\n\nprivate:\n\tcWorld & m_World;\n};\n\n\n\n\n"
  },
  {
    "path": "src/BlockInfo.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"BlockInfo.h\"\n#include \"BlockType.h\"\n\n\n\n\n\nbool IsBlockWater(BLOCKTYPE a_BlockType)\n{\n\treturn ((a_BlockType == E_BLOCK_WATER) || (a_BlockType == E_BLOCK_STATIONARY_WATER));\n}\n\n\n\n\n\nbool IsBlockIce(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_FROSTED_ICE:\n\t\tcase E_BLOCK_ICE:\n\t\tcase E_BLOCK_PACKED_ICE:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBlockWaterOrIce(BLOCKTYPE a_BlockType)\n{\n\treturn (IsBlockWater(a_BlockType) || IsBlockIce(a_BlockType));\n}\n\n\n\n\n\nbool IsBlockLava(BLOCKTYPE a_BlockType)\n{\n\treturn ((a_BlockType == E_BLOCK_LAVA) || (a_BlockType == E_BLOCK_STATIONARY_LAVA));\n}\n\n\n\n\n\nbool IsBlockLiquid(BLOCKTYPE a_BlockType)\n{\n\treturn IsBlockWater(a_BlockType) || IsBlockLava(a_BlockType);\n}\n\n\n\n\n\nbool IsBlockRail(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\tcase E_BLOCK_POWERED_RAIL:\n\t\tcase E_BLOCK_RAIL:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nbool IsBlockTypeOfDirt(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_DIRT:\n\t\tcase E_BLOCK_FARMLAND:\n\t\tcase E_BLOCK_GRASS:\n\t\tcase E_BLOCK_GRASS_PATH:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool IsBlockFence(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_ACACIA_FENCE:\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:\n\t\tcase E_BLOCK_BIRCH_FENCE:\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:\n\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\tcase E_BLOCK_DARK_OAK_FENCE:\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_FENCE:\n\t\tcase E_BLOCK_JUNGLE_FENCE:\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\tcase E_BLOCK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_SPRUCE_FENCE:\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBlockShulkerBox(BLOCKTYPE a_BlockType)\n{\n\treturn ((a_BlockType >= E_BLOCK_WHITE_SHULKER_BOX) && (a_BlockType <= E_BLOCK_BLACK_SHULKER_BOX));\n}\n\n\n\n\n\nbool IsBlockMaterialWood(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_ACACIA_DOOR:\n\t\tcase E_BLOCK_ACACIA_FENCE:\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:\n\t\tcase E_BLOCK_ACACIA_WOOD_STAIRS:\n\t\tcase E_BLOCK_BIRCH_DOOR:\n\t\tcase E_BLOCK_BIRCH_FENCE:\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:\n\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS:\n\t\tcase E_BLOCK_BOOKCASE:\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_CRAFTING_TABLE:\n\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\tcase E_BLOCK_DARK_OAK_FENCE:\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_DARK_OAK_WOOD_STAIRS:\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_DOUBLE_WOODEN_SLAB:\n\t\tcase E_BLOCK_FENCE:\n\t\tcase E_BLOCK_HUGE_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_HUGE_RED_MUSHROOM:\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_JUKEBOX:\n\t\tcase E_BLOCK_JUNGLE_DOOR:\n\t\tcase E_BLOCK_JUNGLE_FENCE:\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:\n\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:\n\t\tcase E_BLOCK_LOG:\n\t\tcase E_BLOCK_NEW_LOG:\n\t\tcase E_BLOCK_NOTE_BLOCK:\n\t\tcase E_BLOCK_OAK_DOOR:\n\t\tcase E_BLOCK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_OAK_WOOD_STAIRS:\n\t\tcase E_BLOCK_PLANKS:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_SPRUCE_DOOR:\n\t\tcase E_BLOCK_SPRUCE_FENCE:\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:\n\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_TRAPDOOR:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\tcase E_BLOCK_WOODEN_SLAB:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBlockMaterialPlants(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_BEETROOTS:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_CARROTS:\n\t\tcase E_BLOCK_CHORUS_FLOWER:\n\t\tcase E_BLOCK_CHORUS_PLANT:\n\t\tcase E_BLOCK_COCOA_POD:\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_DANDELION:\n\t\tcase E_BLOCK_FLOWER:\n\t\tcase E_BLOCK_LILY_PAD:\n\t\tcase E_BLOCK_MELON_STEM:\n\t\tcase E_BLOCK_NETHER_WART:\n\t\tcase E_BLOCK_POTATOES:\n\t\tcase E_BLOCK_PUMPKIN_STEM:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_REEDS:\n\t\tcase E_BLOCK_SAPLING:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBlockMaterialVine(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_BIG_FLOWER:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_VINES:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBlockMaterialIron(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:\n\t\tcase E_BLOCK_BREWING_STAND:\n\t\tcase E_BLOCK_CAULDRON:\n\t\tcase E_BLOCK_CHAIN_COMMAND_BLOCK:\n\t\tcase E_BLOCK_COMMAND_BLOCK:\n\t\tcase E_BLOCK_DIAMOND_BLOCK:\n\t\tcase E_BLOCK_EMERALD_BLOCK:\n\t\tcase E_BLOCK_GOLD_BLOCK:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_HOPPER:\n\t\tcase E_BLOCK_IRON_BARS:\n\t\tcase E_BLOCK_IRON_BLOCK:\n\t\tcase E_BLOCK_IRON_DOOR:\n\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\tcase E_BLOCK_LAPIS_BLOCK:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_REPEATING_COMMAND_BLOCK:\n\t\tcase E_BLOCK_STRUCTURE_BLOCK:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBlockMaterialLeaves(BLOCKTYPE a_BlockType)\n{\n\treturn (a_BlockType == E_BLOCK_LEAVES) || (a_BlockType == E_BLOCK_NEW_LEAVES);\n}\n\n\n\n\n\nbool IsBlockMaterialGourd(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_JACK_O_LANTERN:\n\t\tcase E_BLOCK_MELON:\n\t\tcase E_BLOCK_PUMPKIN:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool IsBlockMaterialRock(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_BEDROCK:\n\t\tcase E_BLOCK_BLOCK_OF_COAL:\n\t\tcase E_BLOCK_BONE_BLOCK:\n\t\tcase E_BLOCK_BRICK:\n\t\tcase E_BLOCK_BRICK_STAIRS:\n\t\tcase E_BLOCK_COAL_ORE:\n\t\tcase E_BLOCK_COBBLESTONE:\n\t\tcase E_BLOCK_COBBLESTONE_STAIRS:\n\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_EMERALD_ORE:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_ENDER_CHEST:\n\t\tcase E_BLOCK_END_BRICKS:\n\t\tcase E_BLOCK_END_PORTAL_FRAME:\n\t\tcase E_BLOCK_END_STONE:\n\t\tcase E_BLOCK_FURNACE:\n\t\tcase E_BLOCK_GOLD_ORE:\n\t\tcase E_BLOCK_HARDENED_CLAY:\n\t\tcase E_BLOCK_IRON_ORE:\n\t\tcase E_BLOCK_LAPIS_ORE:\n\t\tcase E_BLOCK_LIT_FURNACE:\n\t\tcase E_BLOCK_MAGMA:\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\tcase E_BLOCK_MOSSY_COBBLESTONE:\n\t\tcase E_BLOCK_NETHERRACK:\n\t\tcase E_BLOCK_NETHER_BRICK:\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:\n\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:\n\t\tcase E_BLOCK_OBSERVER:\n\t\tcase E_BLOCK_OBSIDIAN:\n\t\tcase E_BLOCK_PRISMARINE_BLOCK:\n\t\tcase E_BLOCK_PURPUR_BLOCK:\n\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:\n\t\tcase E_BLOCK_PURPUR_PILLAR:\n\t\tcase E_BLOCK_PURPUR_SLAB:\n\t\tcase E_BLOCK_PURPUR_STAIRS:\n\t\tcase E_BLOCK_QUARTZ_BLOCK:\n\t\tcase E_BLOCK_QUARTZ_STAIRS:\n\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\tcase E_BLOCK_RED_NETHER_BRICK:\n\t\tcase E_BLOCK_RED_SANDSTONE:\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:\n\t\tcase E_BLOCK_SANDSTONE:\n\t\tcase E_BLOCK_SANDSTONE_STAIRS:\n\t\tcase E_BLOCK_STAINED_CLAY:\n\t\tcase E_BLOCK_STONE:\n\t\tcase E_BLOCK_STONE_BRICKS:\n\t\tcase E_BLOCK_STONE_BRICK_STAIRS:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_STONE_SLAB:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBlockInfo:\n\nNIBBLETYPE cBlockInfo::GetLightValue(const BLOCKTYPE Block)\n{\n\t// Emissive blocks:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:    return 9;\n\t\tcase E_BLOCK_BEACON:               return 15;\n\t\tcase E_BLOCK_BREWING_STAND:        return 1;\n\t\tcase E_BLOCK_BROWN_MUSHROOM:       return 1;\n\t\tcase E_BLOCK_BURNING_FURNACE:      return 13;\n\t\tcase E_BLOCK_DRAGON_EGG:           return 1;\n\t\tcase E_BLOCK_ENDER_CHEST:          return 7;\n\t\tcase E_BLOCK_END_PORTAL:           return 15;\n\t\tcase E_BLOCK_END_PORTAL_FRAME:     return 1;\n\t\tcase E_BLOCK_END_ROD:              return 14;\n\t\tcase E_BLOCK_FIRE:                 return 15;\n\t\tcase E_BLOCK_GLOWSTONE:            return 15;\n\t\tcase E_BLOCK_JACK_O_LANTERN:       return 15;\n\t\tcase E_BLOCK_LAVA:                 return 15;\n\t\tcase E_BLOCK_MAGMA:                return 3;\n\t\tcase E_BLOCK_NETHER_PORTAL:        return 11;\n\t\tcase E_BLOCK_REDSTONE_LAMP_ON:     return 15;\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING: return 9;\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON: return 9;\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:    return 7;\n\t\tcase E_BLOCK_SEA_LANTERN:          return 15;\n\t\tcase E_BLOCK_STATIONARY_LAVA:      return 15;\n\t\tcase E_BLOCK_TORCH:                return 14;\n\t\tdefault:                           return 0;\n\t}\n}\n\n\n\n\n\nNIBBLETYPE cBlockInfo::GetSpreadLightFalloff(const BLOCKTYPE Block)\n{\n\tswitch (Block)\n\t{\n\t\t// Spread blocks:\n\t\tcase E_BLOCK_ACACIA_DOOR:\n\t\tcase E_BLOCK_ACACIA_FENCE:\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_AIR:\n\t\tcase E_BLOCK_ANVIL:\n\t\tcase E_BLOCK_BARRIER:\n\t\tcase E_BLOCK_BEACON:\n\t\tcase E_BLOCK_BED:\n\t\tcase E_BLOCK_BEETROOTS:\n\t\tcase E_BLOCK_BIG_FLOWER:\n\t\tcase E_BLOCK_BIRCH_DOOR:\n\t\tcase E_BLOCK_BIRCH_FENCE:\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:\n\t\tcase E_BLOCK_BREWING_STAND:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_CACTUS:\n\t\tcase E_BLOCK_CAKE:\n\t\tcase E_BLOCK_CARPET:\n\t\tcase E_BLOCK_CARROTS:\n\t\tcase E_BLOCK_CAULDRON:\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_CHORUS_FLOWER:\n\t\tcase E_BLOCK_CHORUS_PLANT:\n\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_COCOA_POD:\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_DANDELION:\n\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\tcase E_BLOCK_DARK_OAK_FENCE:\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\tcase E_BLOCK_DRAGON_EGG:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_ENDER_CHEST:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_END_PORTAL_FRAME:\n\t\tcase E_BLOCK_END_ROD:\n\t\tcase E_BLOCK_FENCE:\n\t\tcase E_BLOCK_FIRE:\n\t\tcase E_BLOCK_FLOWER:\n\t\tcase E_BLOCK_FLOWER_POT:\n\t\tcase E_BLOCK_GLASS:\n\t\tcase E_BLOCK_GLASS_PANE:\n\t\tcase E_BLOCK_HEAD:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_HOPPER:\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_IRON_BARS:\n\t\tcase E_BLOCK_IRON_DOOR:\n\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\tcase E_BLOCK_JUNGLE_DOOR:\n\t\tcase E_BLOCK_JUNGLE_FENCE:\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:\n\t\tcase E_BLOCK_LADDER:\n\t\tcase E_BLOCK_LEAVES:\n\t\tcase E_BLOCK_LEVER:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_LILY_PAD:\n\t\tcase E_BLOCK_MELON_STEM:\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\tcase E_BLOCK_NETHER_PORTAL:\n\t\tcase E_BLOCK_NETHER_WART:\n\t\tcase E_BLOCK_NEW_LEAVES:\n\t\tcase E_BLOCK_OAK_DOOR:\n\t\tcase E_BLOCK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_PISTON:\n\t\tcase E_BLOCK_PISTON_EXTENSION:\n\t\tcase E_BLOCK_PISTON_MOVED_BLOCK:\n\t\tcase E_BLOCK_POTATOES:\n\t\tcase E_BLOCK_POWERED_RAIL:\n\t\tcase E_BLOCK_PUMPKIN_STEM:\n\t\tcase E_BLOCK_RAIL:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_SAPLING:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_SPRUCE_DOOR:\n\t\tcase E_BLOCK_SPRUCE_FENCE:\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:\n\t\tcase E_BLOCK_STAINED_GLASS:\n\t\tcase E_BLOCK_STAINED_GLASS_PANE:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_STICKY_PISTON:\n\t\tcase E_BLOCK_STONE_BUTTON:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_SUGARCANE:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_TORCH:\n\t\tcase E_BLOCK_TRAPDOOR:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\tcase E_BLOCK_TRIPWIRE:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_VINES:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE: return 1;\n\n\t\t// Light in ice and water disappears faster:\n\t\tcase E_BLOCK_ICE:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_WATER: return 3;\n\n\t\t// Light does not pass through anything else (note: including tilled farmland, stairs, and slabs):\n\t\tdefault: return 15;\n\t}\n}\n\n\n\n\n\nbool cBlockInfo::CanBeTerraformed(const BLOCKTYPE Block)\n{\n\t// Blocks that can be terraformed:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_COAL_ORE:\n\t\tcase E_BLOCK_COBBLESTONE:\n\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\tcase E_BLOCK_DIRT:\n\t\tcase E_BLOCK_GOLD_ORE:\n\t\tcase E_BLOCK_GRASS:\n\t\tcase E_BLOCK_GRAVEL:\n\t\tcase E_BLOCK_HARDENED_CLAY:\n\t\tcase E_BLOCK_IRON_ORE:\n\t\tcase E_BLOCK_MYCELIUM:\n\t\tcase E_BLOCK_NETHERRACK:\n\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\tcase E_BLOCK_SAND:\n\t\tcase E_BLOCK_SANDSTONE:\n\t\tcase E_BLOCK_SOULSAND:\n\t\tcase E_BLOCK_STAINED_CLAY:\n\t\tcase E_BLOCK_STONE: return true;\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nbool cBlockInfo::FullyOccupiesVoxel(const BLOCKTYPE Block)\n{\n\t// Blocks that fully occupy their voxel - used as a guide for torch placeable blocks, amongst other things:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_BARRIER:\n\t\tcase E_BLOCK_BEDROCK:\n\t\tcase E_BLOCK_BLACK_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_BLOCK_OF_COAL:\n\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:\n\t\tcase E_BLOCK_BLUE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_BONE_BLOCK:\n\t\tcase E_BLOCK_BOOKCASE:\n\t\tcase E_BLOCK_BRICK:\n\t\tcase E_BLOCK_BROWN_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_CHAIN_COMMAND_BLOCK:\n\t\tcase E_BLOCK_CLAY:\n\t\tcase E_BLOCK_COAL_ORE:\n\t\tcase E_BLOCK_COBBLESTONE:\n\t\tcase E_BLOCK_COMMAND_BLOCK:\n\t\tcase E_BLOCK_CONCRETE:\n\t\tcase E_BLOCK_CONCRETE_POWDER:\n\t\tcase E_BLOCK_CRAFTING_TABLE:\n\t\tcase E_BLOCK_CYAN_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_DIAMOND_BLOCK:\n\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\tcase E_BLOCK_DIRT:\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:\n\t\tcase E_BLOCK_DOUBLE_WOODEN_SLAB:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_EMERALD_BLOCK:\n\t\tcase E_BLOCK_EMERALD_ORE:\n\t\tcase E_BLOCK_END_BRICKS:\n\t\tcase E_BLOCK_END_STONE:\n\t\tcase E_BLOCK_FROSTED_ICE:\n\t\tcase E_BLOCK_FURNACE:\n\t\tcase E_BLOCK_GLASS:\n\t\tcase E_BLOCK_GLOWSTONE:\n\t\tcase E_BLOCK_GOLD_BLOCK:\n\t\tcase E_BLOCK_GOLD_ORE:\n\t\tcase E_BLOCK_GRASS:\n\t\tcase E_BLOCK_GRAVEL:\n\t\tcase E_BLOCK_GRAY_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_GREEN_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_HARDENED_CLAY:\n\t\tcase E_BLOCK_HAY_BALE:\n\t\tcase E_BLOCK_HUGE_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_HUGE_RED_MUSHROOM:\n\t\tcase E_BLOCK_ICE:\n\t\tcase E_BLOCK_IRON_BLOCK:\n\t\tcase E_BLOCK_IRON_ORE:\n\t\tcase E_BLOCK_JACK_O_LANTERN:\n\t\tcase E_BLOCK_JUKEBOX:\n\t\tcase E_BLOCK_LAPIS_BLOCK:\n\t\tcase E_BLOCK_LAPIS_ORE:\n\t\tcase E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_LIME_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_LOG:\n\t\tcase E_BLOCK_MAGENTA_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_MAGMA:\n\t\tcase E_BLOCK_MELON:\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\tcase E_BLOCK_MOSSY_COBBLESTONE:\n\t\tcase E_BLOCK_MYCELIUM:\n\t\tcase E_BLOCK_NETHERRACK:\n\t\tcase E_BLOCK_NETHER_BRICK:\n\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:\n\t\tcase E_BLOCK_NETHER_WART_BLOCK:\n\t\tcase E_BLOCK_NEW_LOG:\n\t\tcase E_BLOCK_NOTE_BLOCK:\n\t\tcase E_BLOCK_OBSERVER:\n\t\tcase E_BLOCK_OBSIDIAN:\n\t\tcase E_BLOCK_ORANGE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_PACKED_ICE:\n\t\tcase E_BLOCK_PINK_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_PLANKS:\n\t\tcase E_BLOCK_PRISMARINE_BLOCK:\n\t\tcase E_BLOCK_PUMPKIN:\n\t\tcase E_BLOCK_PURPLE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_PURPUR_BLOCK:\n\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:\n\t\tcase E_BLOCK_PURPUR_PILLAR:\n\t\tcase E_BLOCK_QUARTZ_BLOCK:\n\t\tcase E_BLOCK_REDSTONE_LAMP_OFF:\n\t\tcase E_BLOCK_REDSTONE_LAMP_ON:\n\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\tcase E_BLOCK_RED_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_RED_NETHER_BRICK:\n\t\tcase E_BLOCK_RED_SANDSTONE:\n\t\tcase E_BLOCK_REPEATING_COMMAND_BLOCK:\n\t\tcase E_BLOCK_SAND:\n\t\tcase E_BLOCK_SANDSTONE:\n\t\tcase E_BLOCK_SILVERFISH_EGG:\n\t\tcase E_BLOCK_SPONGE:\n\t\tcase E_BLOCK_STAINED_CLAY:\n\t\tcase E_BLOCK_STAINED_GLASS:\n\t\tcase E_BLOCK_STONE:\n\t\tcase E_BLOCK_STONE_BRICKS:\n\t\tcase E_BLOCK_STRUCTURE_BLOCK:\n\t\tcase E_BLOCK_WHITE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_WOOL:\n\t\tcase E_BLOCK_YELLOW_GLAZED_TERRACOTTA: return true;\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nbool cBlockInfo::IsClickedThrough(const BLOCKTYPE a_Block)\n{\n\t// TODO: Nether Fire too.\n\n\treturn a_Block == E_BLOCK_FIRE;\n}\n\n\n\n\n\nbool cBlockInfo::IsOneHitDig(const BLOCKTYPE Block)\n{\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wfloat-equal\"\n#endif\n\n\t// GetHardness returns exactly 0 for one hit break blocks:\n\treturn GetHardness(Block) == 0;\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n}\n\n\n\n\n\nbool cBlockInfo::IsPistonBreakable(const BLOCKTYPE Block)\n{\n\t// Blocks that break when pushed by piston:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_ACACIA_DOOR:\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_AIR:\n\t\tcase E_BLOCK_BED:\n\t\tcase E_BLOCK_BEETROOTS:\n\t\tcase E_BLOCK_BIG_FLOWER:\n\t\tcase E_BLOCK_BIRCH_DOOR:\n\t\tcase E_BLOCK_BLACK_SHULKER_BOX:\n\t\tcase E_BLOCK_BLUE_SHULKER_BOX:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_BROWN_SHULKER_BOX:\n\t\tcase E_BLOCK_CACTUS:\n\t\tcase E_BLOCK_CAKE:\n\t\tcase E_BLOCK_CARROTS:\n\t\tcase E_BLOCK_CHORUS_FLOWER:\n\t\tcase E_BLOCK_CHORUS_PLANT:\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_COCOA_POD:\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_CYAN_SHULKER_BOX:\n\t\tcase E_BLOCK_DANDELION:\n\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_DRAGON_EGG:\n\t\tcase E_BLOCK_FIRE:\n\t\tcase E_BLOCK_FLOWER:\n\t\tcase E_BLOCK_FLOWER_POT:\n\t\tcase E_BLOCK_GRAY_SHULKER_BOX:\n\t\tcase E_BLOCK_GREEN_SHULKER_BOX:\n\t\tcase E_BLOCK_HEAD:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_IRON_DOOR:\n\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\tcase E_BLOCK_JACK_O_LANTERN:\n\t\tcase E_BLOCK_JUNGLE_DOOR:\n\t\tcase E_BLOCK_LADDER:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_LEAVES:\n\t\tcase E_BLOCK_LEVER:\n\t\tcase E_BLOCK_LIGHT_BLUE_SHULKER_BOX:\n\t\tcase E_BLOCK_LIGHT_GRAY_SHULKER_BOX:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_LILY_PAD:\n\t\tcase E_BLOCK_LIME_SHULKER_BOX:\n\t\tcase E_BLOCK_MAGENTA_SHULKER_BOX:\n\t\tcase E_BLOCK_MELON:\n\t\tcase E_BLOCK_MELON_STEM:\n\t\tcase E_BLOCK_NETHER_WART:\n\t\tcase E_BLOCK_OAK_DOOR:\n\t\tcase E_BLOCK_ORANGE_SHULKER_BOX:\n\t\tcase E_BLOCK_PINK_SHULKER_BOX:\n\t\tcase E_BLOCK_POTATOES:\n\t\tcase E_BLOCK_PUMPKIN:\n\t\tcase E_BLOCK_PUMPKIN_STEM:\n\t\tcase E_BLOCK_PURPLE_SHULKER_BOX:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_RED_SHULKER_BOX:\n\t\tcase E_BLOCK_REEDS:\n\t\tcase E_BLOCK_SAPLING:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_SPRUCE_DOOR:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_STONE_BUTTON:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_TORCH:\n\t\tcase E_BLOCK_TRAPDOOR:\n\t\tcase E_BLOCK_TRIPWIRE:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_VINES:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WATER:\n\t\tcase E_BLOCK_WHITE_SHULKER_BOX:\n\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\tcase E_BLOCK_YELLOW_SHULKER_BOX: return true;\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nbool cBlockInfo::IsRainBlocker(const BLOCKTYPE Block)\n{\n\t// Blocks that block rain or snow's passage:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WALL_BANNER: return true;\n\t\tdefault: return IsSolid(Block);\n\t}\n}\n\n\n\n\n\nbool cBlockInfo::IsSkylightDispersant(const BLOCKTYPE Block)\n{\n\t// Skylight dispersant blocks:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_LEAVES: return true;\n\t\tdefault: return GetSpreadLightFalloff(Block) > 1;\n\t}\n}\n\n\n\n\n\nbool cBlockInfo::IsSnowable(BLOCKTYPE a_BlockType)\n{\n\treturn (\n\t\t(a_BlockType == E_BLOCK_ICE) ||\n\t\t(a_BlockType == E_BLOCK_LEAVES) ||\n\t\t(!IsTransparent(a_BlockType) && (a_BlockType != E_BLOCK_PACKED_ICE))\n\t);\n}\n\n\n\n\n\nbool cBlockInfo::IsSolid(const BLOCKTYPE Block)\n{\n\t// Nonsolid blocks:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_AIR:\n\t\tcase E_BLOCK_BEETROOTS:\n\t\tcase E_BLOCK_BIG_FLOWER:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_CARPET:\n\t\tcase E_BLOCK_CARROTS:\n\t\tcase E_BLOCK_CHORUS_FLOWER:\n\t\tcase E_BLOCK_CHORUS_PLANT:\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_DANDELION:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\tcase E_BLOCK_END_GATEWAY:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_END_ROD:\n\t\tcase E_BLOCK_FIRE:\n\t\tcase E_BLOCK_FLOWER:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_LADDER:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_LEVER:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_MELON_STEM:\n\t\tcase E_BLOCK_NETHER_PORTAL:\n\t\tcase E_BLOCK_POTATOES:\n\t\tcase E_BLOCK_POWERED_RAIL:\n\t\tcase E_BLOCK_RAIL:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_SAPLING:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_STONE_BUTTON:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_SUGARCANE:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_TORCH:\n\t\tcase E_BLOCK_TRIPWIRE:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_VINES:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_WATER:\n\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE: return false;\n\t\tdefault: return true;\n\t}\n}\n\n\n\n\n\nbool cBlockInfo::IsTransparent(const BLOCKTYPE Block)\n{\n\t// Transparent blocks:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_ACACIA_DOOR:\n\t\tcase E_BLOCK_ACACIA_FENCE:\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:\n\t\tcase E_BLOCK_ACACIA_WOOD_STAIRS:\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_AIR:\n\t\tcase E_BLOCK_ANVIL:\n\t\tcase E_BLOCK_BARRIER:\n\t\tcase E_BLOCK_BEACON:\n\t\tcase E_BLOCK_BED:\n\t\tcase E_BLOCK_BEETROOTS:\n\t\tcase E_BLOCK_BIG_FLOWER:\n\t\tcase E_BLOCK_BIRCH_DOOR:\n\t\tcase E_BLOCK_BIRCH_FENCE:\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:\n\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS:\n\t\tcase E_BLOCK_BLACK_SHULKER_BOX:\n\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:\n\t\tcase E_BLOCK_BLUE_SHULKER_BOX:\n\t\tcase E_BLOCK_BREWING_STAND:\n\t\tcase E_BLOCK_BRICK_STAIRS:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_BROWN_SHULKER_BOX:\n\t\tcase E_BLOCK_CACTUS:\n\t\tcase E_BLOCK_CAKE:\n\t\tcase E_BLOCK_CARPET:\n\t\tcase E_BLOCK_CARROTS:\n\t\tcase E_BLOCK_CAULDRON:\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_CHORUS_FLOWER:\n\t\tcase E_BLOCK_CHORUS_PLANT:\n\t\tcase E_BLOCK_COBBLESTONE_STAIRS:\n\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_COCOA_POD:\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_CYAN_SHULKER_BOX:\n\t\tcase E_BLOCK_DANDELION:\n\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\tcase E_BLOCK_DARK_OAK_FENCE:\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_DARK_OAK_WOOD_STAIRS:\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\tcase E_BLOCK_DRAGON_EGG:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_ENDER_CHEST:\n\t\tcase E_BLOCK_END_GATEWAY:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_END_PORTAL_FRAME:\n\t\tcase E_BLOCK_END_ROD:\n\t\tcase E_BLOCK_FARMLAND:\n\t\tcase E_BLOCK_FENCE:\n\t\tcase E_BLOCK_FIRE:\n\t\tcase E_BLOCK_FLOWER:\n\t\tcase E_BLOCK_FLOWER_POT:\n\t\tcase E_BLOCK_FROSTED_ICE:\n\t\tcase E_BLOCK_GLASS:\n\t\tcase E_BLOCK_GLASS_PANE:\n\t\tcase E_BLOCK_GLOWSTONE:\n\t\tcase E_BLOCK_GRASS_PATH:\n\t\tcase E_BLOCK_GRAY_SHULKER_BOX:\n\t\tcase E_BLOCK_GREEN_SHULKER_BOX:\n\t\tcase E_BLOCK_HEAD:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_HOPPER:\n\t\tcase E_BLOCK_ICE:\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_IRON_BARS:\n\t\tcase E_BLOCK_IRON_DOOR:\n\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\tcase E_BLOCK_JACK_O_LANTERN:\n\t\tcase E_BLOCK_JUNGLE_DOOR:\n\t\tcase E_BLOCK_JUNGLE_FENCE:\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:\n\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:\n\t\tcase E_BLOCK_LADDER:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_LEAVES:\n\t\tcase E_BLOCK_LEVER:\n\t\tcase E_BLOCK_LIGHT_BLUE_SHULKER_BOX:\n\t\tcase E_BLOCK_LIGHT_GRAY_SHULKER_BOX:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_LILY_PAD:\n\t\tcase E_BLOCK_LIME_SHULKER_BOX:\n\t\tcase E_BLOCK_LIT_FURNACE:\n\t\tcase E_BLOCK_MAGENTA_SHULKER_BOX:\n\t\tcase E_BLOCK_MELON_STEM:\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:\n\t\tcase E_BLOCK_NETHER_PORTAL:\n\t\tcase E_BLOCK_NETHER_WART:\n\t\tcase E_BLOCK_NEW_LEAVES:\n\t\tcase E_BLOCK_OAK_DOOR:\n\t\tcase E_BLOCK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_OAK_WOOD_STAIRS:\n\t\tcase E_BLOCK_OBSERVER:\n\t\tcase E_BLOCK_ORANGE_SHULKER_BOX:\n\t\tcase E_BLOCK_PINK_SHULKER_BOX:\n\t\tcase E_BLOCK_PISTON:\n\t\tcase E_BLOCK_PISTON_EXTENSION:\n\t\tcase E_BLOCK_PISTON_MOVED_BLOCK:\n\t\tcase E_BLOCK_POTATOES:\n\t\tcase E_BLOCK_POWERED_RAIL:\n\t\tcase E_BLOCK_PUMPKIN_STEM:\n\t\tcase E_BLOCK_PURPLE_SHULKER_BOX:\n\t\tcase E_BLOCK_PURPUR_SLAB:\n\t\tcase E_BLOCK_PURPUR_STAIRS:\n\t\tcase E_BLOCK_QUARTZ_STAIRS:\n\t\tcase E_BLOCK_RAIL:\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:\n\t\tcase E_BLOCK_RED_SHULKER_BOX:\n\t\tcase E_BLOCK_SANDSTONE_STAIRS:\n\t\tcase E_BLOCK_SAPLING:\n\t\tcase E_BLOCK_SEA_LANTERN:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_SPRUCE_DOOR:\n\t\tcase E_BLOCK_SPRUCE_FENCE:\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:\n\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS:\n\t\tcase E_BLOCK_STAINED_GLASS:\n\t\tcase E_BLOCK_STAINED_GLASS_PANE:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_STICKY_PISTON:\n\t\tcase E_BLOCK_STONE_BRICK_STAIRS:\n\t\tcase E_BLOCK_STONE_BUTTON:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_STONE_SLAB:\n\t\tcase E_BLOCK_SUGARCANE:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_TNT:\n\t\tcase E_BLOCK_TORCH:\n\t\tcase E_BLOCK_TRAPDOOR:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\tcase E_BLOCK_TRIPWIRE:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_VINES:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_WATER:\n\t\tcase E_BLOCK_WHITE_SHULKER_BOX:\n\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\tcase E_BLOCK_WOODEN_SLAB:\n\t\tcase E_BLOCK_YELLOW_SHULKER_BOX: return true;\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nbool cBlockInfo::IsUseableBySpectator(const BLOCKTYPE Block)\n{\n\t// Blocks, which a spectator is allowed to interact with:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_BEACON:\n\t\tcase E_BLOCK_BREWING_STAND:\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_HOPPER: return true;\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nfloat cBlockInfo::GetBlockHeight(const BLOCKTYPE Block)\n{\n\t// Block heights:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_ACACIA_FENCE:        return 1.5;\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:   return 1.5;\n\t\tcase E_BLOCK_BED:                 return 0.5625;  // 9 pixels\n\t\tcase E_BLOCK_BIRCH_FENCE:         return 1.5;\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:    return 1.5;\n\t\tcase E_BLOCK_CAKE:                return 0.5;     // 8 pixels\n\t\tcase E_BLOCK_DARK_OAK_FENCE:      return 1.5;\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE: return 1.5;\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:   return 0.75;    // 12 pixels\n\t\t// case E_BLOCK_FARMLAND:         return 0.9375;  // prevents trampling for mobs (#2015) and older clients (MC-85162)\n\t\tcase E_BLOCK_FENCE:               return 1.5;\n\t\tcase E_BLOCK_JUNGLE_FENCE:        return 1.5;\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:   return 1.5;\n\t\tcase E_BLOCK_OAK_FENCE_GATE:      return 1.5;\n\t\tcase E_BLOCK_PURPUR_SLAB:         return 0.5;\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:  return 0.5;\n\t\tcase E_BLOCK_SNOW:                return 0.125;   // one layer is 1 / 8 (2 pixels) tall\n\t\tcase E_BLOCK_SPRUCE_FENCE:        return 1.5;\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:   return 1.5;\n\t\tcase E_BLOCK_STONE_SLAB:          return 0.5;\n\t\tcase E_BLOCK_WOODEN_SLAB:         return 0.5;\n\t\tdefault:                          return 1;\n\t}\n}\n\n\n\n\n\nfloat cBlockInfo::GetHardness(const BLOCKTYPE Block)\n{\n\t// Block hardness:\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_ACACIA_DOOR:                   return 3.0f;\n\t\tcase E_BLOCK_ACACIA_FENCE:                  return 2.0f;\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:             return 2.0f;\n\t\tcase E_BLOCK_ACACIA_WOOD_STAIRS:            return 2.0f;\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:                return 0.7f;\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:             return 0.0f;\n\t\tcase E_BLOCK_AIR:                           return 0.0f;\n\t\tcase E_BLOCK_ANVIL:                         return 5.0f;\n\t\tcase E_BLOCK_BARRIER:                       return INFINITY;\n\t\tcase E_BLOCK_BEACON:                        return 3.0f;\n\t\tcase E_BLOCK_BED:                           return 0.2f;\n\t\tcase E_BLOCK_BEDROCK:                       return INFINITY;\n\t\tcase E_BLOCK_BEETROOTS:                     return 0.0f;\n\t\tcase E_BLOCK_BIG_FLOWER:                    return 0.0f;\n\t\tcase E_BLOCK_BIRCH_DOOR:                    return 3.0f;\n\t\tcase E_BLOCK_BIRCH_FENCE:                   return 2.0f;\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:              return 2.0f;\n\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS:             return 2.0f;\n\t\tcase E_BLOCK_BLACK_GLAZED_TERRACOTTA:       return 1.4f;\n\t\tcase E_BLOCK_BLACK_SHULKER_BOX:             return 2.0f;\n\t\tcase E_BLOCK_BLOCK_OF_COAL:                 return 5.0f;\n\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:             return 5.0f;\n\t\tcase E_BLOCK_BLUE_GLAZED_TERRACOTTA:        return 1.4f;\n\t\tcase E_BLOCK_BLUE_SHULKER_BOX:              return 2.0f;\n\t\tcase E_BLOCK_BONE_BLOCK:                    return 2.0f;\n\t\tcase E_BLOCK_BOOKCASE:                      return 1.5f;\n\t\tcase E_BLOCK_BREWING_STAND:                 return 0.5f;\n\t\tcase E_BLOCK_BRICK:                         return 2.0f;\n\t\tcase E_BLOCK_BRICK_STAIRS:                  return 2.0f;\n\t\tcase E_BLOCK_BROWN_GLAZED_TERRACOTTA:       return 1.4f;\n\t\tcase E_BLOCK_BROWN_MUSHROOM:                return 0.0f;\n\t\tcase E_BLOCK_BROWN_SHULKER_BOX:             return 2.0f;\n\t\tcase E_BLOCK_CACTUS:                        return 0.4f;\n\t\tcase E_BLOCK_CAKE:                          return 0.5f;\n\t\tcase E_BLOCK_CARPET:                        return 0.1f;\n\t\tcase E_BLOCK_CARROTS:                       return 0.0f;\n\t\tcase E_BLOCK_CAULDRON:                      return 2.0f;\n\t\tcase E_BLOCK_CHAIN_COMMAND_BLOCK:           return INFINITY;\n\t\tcase E_BLOCK_CHEST:                         return 2.5f;\n\t\tcase E_BLOCK_CHORUS_FLOWER:                 return 0.4f;\n\t\tcase E_BLOCK_CHORUS_PLANT:                  return 0.4f;\n\t\tcase E_BLOCK_CLAY:                          return 0.6f;\n\t\tcase E_BLOCK_COAL_ORE:                      return 3.0f;\n\t\tcase E_BLOCK_COBBLESTONE:                   return 2.0f;\n\t\tcase E_BLOCK_COBBLESTONE_STAIRS:            return 2.0f;\n\t\tcase E_BLOCK_COBBLESTONE_WALL:              return 2.0f;\n\t\tcase E_BLOCK_COBWEB:                        return 4.0f;\n\t\tcase E_BLOCK_COCOA_POD:                     return 0.2f;\n\t\tcase E_BLOCK_COMMAND_BLOCK:                 return INFINITY;\n\t\tcase E_BLOCK_CONCRETE:                      return 1.8f;\n\t\tcase E_BLOCK_CONCRETE_POWDER:               return 0.5f;\n\t\tcase E_BLOCK_CRAFTING_TABLE:                return 2.5f;\n\t\tcase E_BLOCK_CROPS:                         return 0.0f;\n\t\tcase E_BLOCK_CYAN_GLAZED_TERRACOTTA:        return 1.4f;\n\t\tcase E_BLOCK_CYAN_SHULKER_BOX:              return 2.0f;\n\t\tcase E_BLOCK_DANDELION:                     return 0.0f;\n\t\tcase E_BLOCK_DARK_OAK_DOOR:                 return 3.0f;\n\t\tcase E_BLOCK_DARK_OAK_FENCE:                return 2.0f;\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:           return 2.0f;\n\t\tcase E_BLOCK_DARK_OAK_WOOD_STAIRS:          return 2.0f;\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:               return 0.2f;\n\t\tcase E_BLOCK_DEAD_BUSH:                     return 0.0f;\n\t\tcase E_BLOCK_DETECTOR_RAIL:                 return 0.7f;\n\t\tcase E_BLOCK_DIAMOND_BLOCK:                 return 5.0f;\n\t\tcase E_BLOCK_DIAMOND_ORE:                   return 3.0f;\n\t\tcase E_BLOCK_DIRT:                          return 0.5f;\n\t\tcase E_BLOCK_DISPENSER:                     return 3.5f;\n\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:     return 2.0f;\n\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:             return 2.0f;\n\t\tcase E_BLOCK_DOUBLE_WOODEN_SLAB:            return 2.0f;\n\t\tcase E_BLOCK_DRAGON_EGG:                    return 3.0f;\n\t\tcase E_BLOCK_DROPPER:                       return 3.5f;\n\t\tcase E_BLOCK_EMERALD_BLOCK:                 return 5.0f;\n\t\tcase E_BLOCK_EMERALD_ORE:                   return 3.0f;\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:             return 5.0f;\n\t\tcase E_BLOCK_ENDER_CHEST:                   return 22.5f;\n\t\tcase E_BLOCK_END_BRICKS:                    return 0.8f;\n\t\tcase E_BLOCK_END_GATEWAY:                   return INFINITY;\n\t\tcase E_BLOCK_END_PORTAL:                    return INFINITY;\n\t\tcase E_BLOCK_END_PORTAL_FRAME:              return INFINITY;\n\t\tcase E_BLOCK_END_ROD:                       return 0.0f;\n\t\tcase E_BLOCK_END_STONE:                     return 3.0f;\n\t\tcase E_BLOCK_FARMLAND:                      return 0.6f;\n\t\tcase E_BLOCK_FENCE:                         return 2.0f;\n\t\tcase E_BLOCK_FIRE:                          return 0.0f;\n\t\tcase E_BLOCK_FLOWER:                        return 0.0f;\n\t\tcase E_BLOCK_FLOWER_POT:                    return 0.0f;\n\t\tcase E_BLOCK_FROSTED_ICE:                   return 0.5f;\n\t\tcase E_BLOCK_FURNACE:                       return 3.5f;\n\t\tcase E_BLOCK_GLASS:                         return 0.3f;\n\t\tcase E_BLOCK_GLASS_PANE:                    return 0.3f;\n\t\tcase E_BLOCK_GLOWSTONE:                     return 0.3f;\n\t\tcase E_BLOCK_GOLD_BLOCK:                    return 3.0f;\n\t\tcase E_BLOCK_GOLD_ORE:                      return 3.0f;\n\t\tcase E_BLOCK_GRASS:                         return 0.6f;\n\t\tcase E_BLOCK_GRASS_PATH:                    return 0.6f;\n\t\tcase E_BLOCK_GRAVEL:                        return 0.6f;\n\t\tcase E_BLOCK_GRAY_GLAZED_TERRACOTTA:        return 1.4f;\n\t\tcase E_BLOCK_GRAY_SHULKER_BOX:              return 2.0f;\n\t\tcase E_BLOCK_GREEN_GLAZED_TERRACOTTA:       return 1.4f;\n\t\tcase E_BLOCK_GREEN_SHULKER_BOX:             return 2.0f;\n\t\tcase E_BLOCK_HARDENED_CLAY:                 return 1.25f;\n\t\tcase E_BLOCK_HAY_BALE:                      return 0.5f;\n\t\tcase E_BLOCK_HEAD:                          return 1.0f;\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE: return 0.5f;\n\t\tcase E_BLOCK_HOPPER:                        return 3.0f;\n\t\tcase E_BLOCK_HUGE_BROWN_MUSHROOM:           return 0.2f;\n\t\tcase E_BLOCK_HUGE_RED_MUSHROOM:             return 0.2f;\n\t\tcase E_BLOCK_ICE:                           return 0.5f;\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:           return 0.0f;\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:      return 0.2f;\n\t\tcase E_BLOCK_IRON_BARS:                     return 5.0f;\n\t\tcase E_BLOCK_IRON_BLOCK:                    return 5.0f;\n\t\tcase E_BLOCK_IRON_DOOR:                     return 5.0f;\n\t\tcase E_BLOCK_IRON_ORE:                      return 3.0f;\n\t\tcase E_BLOCK_IRON_TRAPDOOR:                 return 5.0f;\n\t\tcase E_BLOCK_JACK_O_LANTERN:                return 1.0f;\n\t\tcase E_BLOCK_JUKEBOX:                       return 2.0f;\n\t\tcase E_BLOCK_JUNGLE_DOOR:                   return 3.0f;\n\t\tcase E_BLOCK_JUNGLE_FENCE:                  return 2.0f;\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:             return 2.0f;\n\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:            return 2.0f;\n\t\tcase E_BLOCK_LADDER:                        return 0.4f;\n\t\tcase E_BLOCK_LAPIS_BLOCK:                   return 3.0f;\n\t\tcase E_BLOCK_LAPIS_ORE:                     return 3.0f;\n\t\tcase E_BLOCK_LAVA:                          return 100.0f;\n\t\tcase E_BLOCK_LEAVES:                        return 0.2f;\n\t\tcase E_BLOCK_LEVER:                         return 0.5f;\n\t\tcase E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA:  return 1.4f;\n\t\tcase E_BLOCK_LIGHT_BLUE_SHULKER_BOX:        return 2.0f;\n\t\tcase E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA:  return 1.4f;\n\t\tcase E_BLOCK_LIGHT_GRAY_SHULKER_BOX:        return 2.0f;\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE: return 0.5f;\n\t\tcase E_BLOCK_LILY_PAD:                      return 0.0f;\n\t\tcase E_BLOCK_LIME_GLAZED_TERRACOTTA:        return 1.4f;\n\t\tcase E_BLOCK_LIME_SHULKER_BOX:              return 2.0f;\n\t\tcase E_BLOCK_LIT_FURNACE:                   return 3.5f;\n\t\tcase E_BLOCK_LOG:                           return 2.0f;\n\t\tcase E_BLOCK_MAGENTA_GLAZED_TERRACOTTA:     return 1.4f;\n\t\tcase E_BLOCK_MAGENTA_SHULKER_BOX:           return 2.0f;\n\t\tcase E_BLOCK_MAGMA:                         return 0.5f;\n\t\tcase E_BLOCK_MELON:                         return 1.0f;\n\t\tcase E_BLOCK_MELON_STEM:                    return 0.0f;\n\t\tcase E_BLOCK_MOB_SPAWNER:                   return 5.0f;\n\t\tcase E_BLOCK_MOSSY_COBBLESTONE:             return 2.0f;\n\t\tcase E_BLOCK_MYCELIUM:                      return 0.6f;\n\t\tcase E_BLOCK_NETHERRACK:                    return 0.4f;\n\t\tcase E_BLOCK_NETHER_BRICK:                  return 2.0f;\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:            return 2.0f;\n\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:           return 2.0f;\n\t\tcase E_BLOCK_NETHER_PORTAL:                 return INFINITY;\n\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:             return 3.0f;\n\t\tcase E_BLOCK_NETHER_WART:                   return 0.0f;\n\t\tcase E_BLOCK_NETHER_WART_BLOCK:             return 1.0f;\n\t\tcase E_BLOCK_NEW_LEAVES:                    return 0.2f;\n\t\tcase E_BLOCK_NEW_LOG:                       return 2.0f;\n\t\tcase E_BLOCK_NOTE_BLOCK:                    return 0.8f;\n\t\tcase E_BLOCK_OAK_DOOR:                      return 3.0f;\n\t\tcase E_BLOCK_OAK_FENCE_GATE:                return 2.0f;\n\t\tcase E_BLOCK_OAK_WOOD_STAIRS:               return 2.0f;\n\t\tcase E_BLOCK_OBSERVER:                      return 3.5f;\n\t\tcase E_BLOCK_OBSIDIAN:                      return 50.0f;\n\t\tcase E_BLOCK_ORANGE_GLAZED_TERRACOTTA:      return 1.4f;\n\t\tcase E_BLOCK_ORANGE_SHULKER_BOX:            return 2.0f;\n\t\tcase E_BLOCK_PACKED_ICE:                    return 0.5f;\n\t\tcase E_BLOCK_PINK_GLAZED_TERRACOTTA:        return 1.4f;\n\t\tcase E_BLOCK_PINK_SHULKER_BOX:              return 2.0f;\n\t\tcase E_BLOCK_PISTON:                        return 0.5f;\n\t\tcase E_BLOCK_PISTON_EXTENSION:              return 0.5f;\n\t\tcase E_BLOCK_PISTON_MOVED_BLOCK:            return INFINITY;\n\t\tcase E_BLOCK_PLANKS:                        return 2.0f;\n\t\tcase E_BLOCK_POTATOES:                      return 0.0f;\n\t\tcase E_BLOCK_POWERED_RAIL:                  return 0.7f;\n\t\tcase E_BLOCK_PRISMARINE_BLOCK:              return 1.5f;\n\t\tcase E_BLOCK_PUMPKIN:                       return 1.0f;\n\t\tcase E_BLOCK_PUMPKIN_STEM:                  return 0.0f;\n\t\tcase E_BLOCK_PURPLE_GLAZED_TERRACOTTA:      return 1.4f;\n\t\tcase E_BLOCK_PURPLE_SHULKER_BOX:            return 2.0f;\n\t\tcase E_BLOCK_PURPUR_BLOCK:                  return 1.5f;\n\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:            return 2.0f;\n\t\tcase E_BLOCK_PURPUR_PILLAR:                 return 1.5f;\n\t\tcase E_BLOCK_PURPUR_SLAB:                   return 2.0f;\n\t\tcase E_BLOCK_PURPUR_STAIRS:                 return 1.5f;\n\t\tcase E_BLOCK_QUARTZ_BLOCK:                  return 0.8f;\n\t\tcase E_BLOCK_QUARTZ_STAIRS:                 return 0.8f;\n\t\tcase E_BLOCK_RAIL:                          return 0.7f;\n\t\tcase E_BLOCK_REDSTONE_LAMP_OFF:             return 0.3f;\n\t\tcase E_BLOCK_REDSTONE_LAMP_ON:              return 0.3f;\n\t\tcase E_BLOCK_REDSTONE_ORE:                  return 3.0f;\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:          return 0.625f;\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:         return 0.0f;\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:          return 0.0f;\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:            return 0.0f;\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:             return 0.0f;\n\t\tcase E_BLOCK_REDSTONE_WIRE:                 return 0.0f;\n\t\tcase E_BLOCK_RED_GLAZED_TERRACOTTA:         return 1.4f;\n\t\tcase E_BLOCK_RED_MUSHROOM:                  return 0.0f;\n\t\tcase E_BLOCK_RED_NETHER_BRICK:              return 2.0f;\n\t\tcase E_BLOCK_RED_SANDSTONE:                 return 0.8f;\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:            return 2.0f;\n\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:          return 0.8f;\n\t\tcase E_BLOCK_RED_SHULKER_BOX:               return 2.0f;\n\t\tcase E_BLOCK_REPEATING_COMMAND_BLOCK:       return INFINITY;\n\t\tcase E_BLOCK_SAND:                          return 0.5f;\n\t\tcase E_BLOCK_SANDSTONE:                     return 0.8f;\n\t\tcase E_BLOCK_SANDSTONE_STAIRS:              return 0.8f;\n\t\tcase E_BLOCK_SAPLING:                       return 0.0f;\n\t\tcase E_BLOCK_SEA_LANTERN:                   return 0.3f;\n\t\tcase E_BLOCK_SIGN_POST:                     return 1.0f;\n\t\tcase E_BLOCK_SILVERFISH_EGG:                return 0.75f;\n\t\tcase E_BLOCK_SLIME_BLOCK:                   return 0.0f;\n\t\tcase E_BLOCK_SNOW:                          return 0.1f;\n\t\tcase E_BLOCK_SNOW_BLOCK:                    return 0.2f;\n\t\tcase E_BLOCK_SOULSAND:                      return 0.5f;\n\t\tcase E_BLOCK_SPONGE:                        return 0.6f;\n\t\tcase E_BLOCK_SPRUCE_DOOR:                   return 3.0f;\n\t\tcase E_BLOCK_SPRUCE_FENCE:                  return 2.0f;\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:             return 2.0f;\n\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS:            return 2.0f;\n\t\tcase E_BLOCK_STAINED_CLAY:                  return 4.2f;\n\t\tcase E_BLOCK_STAINED_GLASS:                 return 0.3f;\n\t\tcase E_BLOCK_STAINED_GLASS_PANE:            return 0.3f;\n\t\tcase E_BLOCK_STANDING_BANNER:               return 1.0f;\n\t\tcase E_BLOCK_STATIONARY_LAVA:               return 100.0f;\n\t\tcase E_BLOCK_STATIONARY_WATER:              return 100.0f;\n\t\tcase E_BLOCK_STICKY_PISTON:                 return 0.5f;\n\t\tcase E_BLOCK_STONE:                         return 1.5f;\n\t\tcase E_BLOCK_STONE_BRICKS:                  return 1.5f;\n\t\tcase E_BLOCK_STONE_BRICK_STAIRS:            return 1.5f;\n\t\tcase E_BLOCK_STONE_BUTTON:                  return 0.5f;\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:          return 0.5f;\n\t\tcase E_BLOCK_STONE_SLAB:                    return 2.0f;\n\t\tcase E_BLOCK_STRUCTURE_BLOCK:               return INFINITY;\n\t\tcase E_BLOCK_STRUCTURE_VOID:                return 0.0f;\n\t\tcase E_BLOCK_SUGARCANE:                     return 0.0f;\n\t\tcase E_BLOCK_TALL_GRASS:                    return 0.0f;\n\t\tcase E_BLOCK_TNT:                           return 0.0f;\n\t\tcase E_BLOCK_TORCH:                         return 0.0f;\n\t\tcase E_BLOCK_TRAPDOOR:                      return 3.0f;\n\t\tcase E_BLOCK_TRAPPED_CHEST:                 return 2.5f;\n\t\tcase E_BLOCK_TRIPWIRE:                      return 0.0f;\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:                 return 0.0f;\n\t\tcase E_BLOCK_VINES:                         return 0.2f;\n\t\tcase E_BLOCK_WALLSIGN:                      return 1.0f;\n\t\tcase E_BLOCK_WALL_BANNER:                   return 1.0f;\n\t\tcase E_BLOCK_WATER:                         return 100.0f;\n\t\tcase E_BLOCK_WHITE_GLAZED_TERRACOTTA:       return 1.4f;\n\t\tcase E_BLOCK_WHITE_SHULKER_BOX:             return 2.0f;\n\t\tcase E_BLOCK_WOODEN_BUTTON:                 return 0.5f;\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:         return 0.5f;\n\t\tcase E_BLOCK_WOODEN_SLAB:                   return 2.0f;\n\t\tcase E_BLOCK_WOOL:                          return 0.8f;\n\t\tcase E_BLOCK_YELLOW_GLAZED_TERRACOTTA:      return 1.4f;\n\t\tcase E_BLOCK_YELLOW_SHULKER_BOX:            return 2.0f;\n\t\tdefault:                                    return 0;\n\t}\n}\n"
  },
  {
    "path": "src/BlockInfo.h",
    "content": "\n#pragma once\n\n#include \"ChunkDef.h\"\n\n\n\n\n\n// tolua_begin\nclass cBlockInfo\n{\npublic:\n\n\t/** How much light do the blocks emit on their own? */\n\tstatic NIBBLETYPE GetLightValue(BLOCKTYPE Block);\n\n\t/** How much light do the blocks consume? */\n\tstatic NIBBLETYPE GetSpreadLightFalloff(BLOCKTYPE Block);\n\n\t/** Can a finisher change it? */\n\tstatic bool CanBeTerraformed(BLOCKTYPE Block);\n\n\t/** Does this block fully occupy its voxel - is it a 'full' block? */\n\tstatic bool FullyOccupiesVoxel(BLOCKTYPE Block);\n\n\t/** Does the client pretend the block doesn't exist when clicking?\n\tFor example, digging a fire will hit the block below the fire, so fire is \"clicked through\". */\n\tstatic bool IsClickedThrough(BLOCKTYPE a_Block);\n\n\t/** Is a block destroyed after a single hit?\n\tWarning: IsOneHitDig does not take into account enchantments / status effects / swim state / floating state\n\tand therefore may be incorrect. Only use to check if hardness is 0.\n\tIf you want to check if a player would instantly mine a_Block use cPlayer::CanInstantlyMine(a_Block) */\n\tstatic bool IsOneHitDig(BLOCKTYPE Block);\n\n\t/** Can a piston break this block? */\n\tstatic bool IsPistonBreakable(BLOCKTYPE Block);\n\n\t/** Does this block block the passage of rain? */\n\tstatic bool IsRainBlocker(BLOCKTYPE Block);\n\n\t/** Does this block disperse sky light? (only relevant for transparent blocks) */\n\tstatic bool IsSkylightDispersant(BLOCKTYPE Block);\n\n\tstatic bool IsSnowable(BLOCKTYPE Block);\n\n\t/** Is this block solid (player cannot walk through)? */\n\tstatic bool IsSolid(BLOCKTYPE Block);\n\n\t/** Is a block transparent? (https://minecraft.wiki/w/Opacity) */\n\tstatic bool IsTransparent(BLOCKTYPE Block);\n\n\t/** Can a spectator interact with this block? */\n\tstatic bool IsUseableBySpectator(BLOCKTYPE Block);\n\n\t/** Block's height. */\n\tstatic float GetBlockHeight(BLOCKTYPE Block);\n\n\t/** Block's hardness. The greater the value the longer the player needs to break the block. */\n\tstatic float GetHardness(BLOCKTYPE Block);\n};\n// tolua_end\n\n\n\n\nbool IsBlockWater(BLOCKTYPE a_BlockType);\n\nbool IsBlockIce(BLOCKTYPE a_BlockType);\n\nbool IsBlockWaterOrIce(BLOCKTYPE a_BlockType);\n\nbool IsBlockLava(BLOCKTYPE a_BlockType);\n\nbool IsBlockLiquid(BLOCKTYPE a_BlockType);\n\nbool IsBlockRail(BLOCKTYPE a_BlockType);\n\nbool IsBlockTypeOfDirt(BLOCKTYPE a_BlockType);\n\nbool IsBlockFence(BLOCKTYPE a_BlockType);\n\nbool IsBlockShulkerBox(BLOCKTYPE a_BlockType);\n\nbool IsBlockMaterialWood(BLOCKTYPE a_BlockType);\n\nbool IsBlockMaterialPlants(BLOCKTYPE a_BlockType);\n\nbool IsBlockMaterialVine(BLOCKTYPE a_BlockType);\n\nbool IsBlockMaterialIron(BLOCKTYPE a_BlockType);\n\nbool IsBlockMaterialLeaves(BLOCKTYPE a_BlockType);\n\nbool IsBlockMaterialGourd(BLOCKTYPE a_BlockType);\n\nbool IsBlockMaterialRock(BLOCKTYPE a_BlockType);\n"
  },
  {
    "path": "src/BlockState.h",
    "content": "#pragma once\n\n#include \"Registries/BlockTypes.h\"\n\nstruct BlockState\n{\n\tconstexpr BlockState(uint_least16_t StateID) :\n\t\tID(StateID)\n\t{\n\t}\n\n\t/** Gets the block type of this block state. */\n\tBlockType Type() const;\n\n\tbool operator == (BlockState Block) const\n\t{\n\t\treturn ID == Block.ID;\n\t}\n\n\tbool operator != (BlockState Block) const\n\t{\n\t\treturn ID != Block.ID;\n\t}\n\n\t/** The state ID of the block state. */\n\tuint_least16_t ID;\n};\n"
  },
  {
    "path": "src/BlockTracer.h",
    "content": "\n// BlockTracer.h\n\n// Declares the classes common for all blocktracers\n\n\n\n\n\n#pragma once\n\n\n\n\n\n#include \"Defines.h\"\n#include \"ChunkDef.h\"\n\n\n\n\n// fwd: World.h\nclass cWorld;\n\n\n\n\n\nclass cBlockTracer abstract\n{\npublic:\n\t/** The callback class is used to notify the caller of individual events that are being traced.\n\t*/\n\tclass cCallbacks abstract\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called on each block encountered along the path, including the first block (path start)\n\t\tWhen this callback returns true, the tracing is aborted.\n\t\t*/\n\t\tvirtual bool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) = 0;\n\n\t\t/** Called on each block encountered along the path, including the first block (path start), if chunk data is not loaded\n\t\tWhen this callback returns true, the tracing is aborted.\n\t\t*/\n\t\tvirtual bool OnNextBlockNoData(Vector3i a_BlockPos, eBlockFace a_EntryFace)\n\t\t{\n\t\t\tUNUSED(a_BlockPos);\n\t\t\tUNUSED(a_EntryFace);\n\t\t\treturn false;\n\t\t}\n\n\t\t/** Called when the path goes out of world, either below (a_BlockPos.y < 0) or above (a_BlockPos.y >= cChunkDef::Height)\n\t\tThe coords specify the exact point at which the path exited the world.\n\t\tIf this callback returns true, the tracing is aborted.\n\t\tNote that some paths can go out of the world and come back again (parabola),\n\t\tin such a case this callback is followed by OnIntoWorld() and further OnNextBlock() calls\n\t\t*/\n\t\tvirtual bool OnOutOfWorld(Vector3d a_BlockPos)\n\t\t{\n\t\t\tUNUSED(a_BlockPos);\n\t\t\treturn false;\n\t\t}\n\n\t\t/** Called when the path goes into the world, from either below (a_BlockPos.y < 0) or above (a_BlockPos.y >= cChunkDef::Height)\n\t\tThe coords specify the exact point at which the path entered the world.\n\t\tIf this callback returns true, the tracing is aborted.\n\t\tNote that some paths can go out of the world and come back again (parabola),\n\t\tin such a case this callback is followed by further OnNextBlock() calls\n\t\t*/\n\t\tvirtual bool OnIntoWorld(Vector3d a_BlockPos)\n\t\t{\n\t\t\tUNUSED(a_BlockPos);\n\t\t\treturn false;\n\t\t}\n\n\t\t/** Called when the path is sure not to hit any more blocks.\n\t\tNote that for some shapes this might never happen (line with constant Y)\n\t\t*/\n\t\tvirtual void OnNoMoreHits(void) {}\n\n\t\t/** Called when the block tracing walks into a chunk that is not allocated.\n\t\tThis usually means that the tracing is aborted.\n\t\t*/\n\t\tvirtual void OnNoChunk(void) {}\n\t} ;\n\n\n\t/** Creates the BlockTracer parent with the specified callbacks */\n\tcBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks) :\n\t\tm_World(&a_World),\n\t\tm_Callbacks(&a_Callbacks)\n\t{\n\t}\n\n\n\t/** Sets new world, returns the old one. Note that both need to be valid */\n\tcWorld & SetWorld(cWorld & a_World)\n\t{\n\t\tcWorld & Old = *m_World;\n\t\tm_World = &a_World;\n\t\treturn Old;\n\t}\n\n\n\t/** Sets new callbacks, returns the old ones. Note that both need to be valid */\n\tcCallbacks & SetCallbacks(cCallbacks & a_NewCallbacks)\n\t{\n\t\tcCallbacks & Old = *m_Callbacks;\n\t\tm_Callbacks = &a_NewCallbacks;\n\t\treturn Old;\n\t}\n\nprotected:\n\t/** The world upon which to operate */\n\tcWorld * m_World;\n\n\t/** The callback to use for reporting */\n\tcCallbacks * m_Callbacks;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/BlockType.cpp",
    "content": "// BlockType.cpp\n\n// Implements the helper functions for converting Block Type string to int etc.\n\n#include \"Globals.h\"\n#include \"IniFile.h\"\n#include \"Item.h\"\n#include \"Mobs/Monster.h\"\n\n\n\n\n\nclass cBlockIDMap\n{\n\t// Making the map case-insensitive:\n\tstruct Comparator\n\t{\n\t\tbool operator ()(const AString & a_Item1, const AString & a_Item2) const\n\t\t{\n\t\t\treturn (NoCaseCompare(a_Item1, a_Item2) > 0);\n\t\t}\n\t} ;\n\n\ttypedef std::map<AString, std::pair<short, short>, Comparator> ItemMap;\n\npublic:\n\n\tcBlockIDMap(void)\n\t{\n\t\tcIniFile Ini;\n\t\tif (!Ini.ReadFile(\"items.ini\"))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tint KeyID = Ini.FindKey(\"Items\");\n\t\tif (KeyID == cIniFile::noID)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tint NumValues = Ini.GetNumValues(KeyID);\n\t\tfor (int i = 0; i < NumValues; i++)\n\t\t{\n\t\t\tAString Name = Ini.GetValueName(KeyID, i);\n\t\t\tif (Name.empty())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tAString Value = Ini.GetValue(KeyID, i);\n\t\t\tAddToMap(Name, Value);\n\t\t}  // for i - Ini.Values[]\n\t}\n\n\n\tint Resolve(const AString & a_ItemName)\n\t{\n\t\tItemMap::iterator itr = m_Map.find(a_ItemName);\n\t\tif (itr == m_Map.end())\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\treturn itr->second.first;\n\t}\n\n\n\tbool ResolveItem(const AString & a_ItemName, cItem & a_Item)\n\t{\n\t\t// Split into parts divided by either ':' or '^'\n\t\tAStringVector Split = StringSplitAndTrim(a_ItemName, \":^\");\n\t\tif (Split.empty())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tItemMap::iterator itr = m_Map.find(Split[0]);\n\t\tif (itr != m_Map.end())\n\t\t{\n\t\t\t// Resolved as a string, assign the type and the default damage / count\n\t\t\ta_Item.m_ItemType = itr->second.first;\n\t\t\ta_Item.m_ItemDamage = itr->second.second;\n\t\t\tif (a_Item.m_ItemDamage == -1)\n\t\t\t{\n\t\t\t\ta_Item.m_ItemDamage = 0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Not a resolvable string, try pure numbers: \"45:6\", \"45^6\" etc.\n\t\t\tif (!StringToInteger(Split[0], a_Item.m_ItemType))\n\t\t\t{\n\t\t\t\t// Parsing the number failed\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Parse the damage, if present:\n\t\tif (Split.size() < 2)\n\t\t{\n\t\t\t// Not present, set the item as valid and return success:\n\t\t\ta_Item.m_ItemCount = 1;\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!StringToInteger(Split[1], a_Item.m_ItemDamage))\n\t\t{\n\t\t\t// Parsing the number failed\n\t\t\treturn false;\n\t\t}\n\t\ta_Item.m_ItemCount = 1;\n\t\treturn true;\n\t}\n\n\n\tAString Desolve(short a_ItemType, short a_ItemDamage)\n\t{\n\t\t// First try an exact match, both ItemType and ItemDamage (\"birchplanks=5:2\"):\n\t\tfor (ItemMap::iterator itr = m_Map.begin(), end = m_Map.end(); itr != end; ++itr)\n\t\t{\n\t\t\tif ((itr->second.first == a_ItemType) && (itr->second.second == a_ItemDamage))\n\t\t\t{\n\t\t\t\treturn itr->first;\n\t\t\t}\n\t\t}  // for itr - m_Map[]\n\n\t\t// There is no exact match, try matching ItemType only (\"planks=5\"):\n\t\tif (a_ItemDamage == 0)\n\t\t{\n\t\t\tfor (ItemMap::iterator itr = m_Map.begin(), end = m_Map.end(); itr != end; ++itr)\n\t\t\t{\n\t\t\t\tif ((itr->second.first == a_ItemType) && (itr->second.second == -1))\n\t\t\t\t{\n\t\t\t\t\treturn itr->first;\n\t\t\t\t}\n\t\t\t}  // for itr - m_Map[]\n\t\t}\n\n\t\t// No match at all, synthesize a string (\"5:1\"):\n\t\tAString res;\n\t\tif (a_ItemDamage == -1)\n\t\t{\n\t\t\tres = fmt::format(FMT_STRING(\"{}\"), a_ItemType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tres = fmt::format(FMT_STRING(\"{}:{}\"), a_ItemType, a_ItemDamage);\n\t\t}\n\t\treturn res;\n\t}\n\n\nprotected:\n\tItemMap m_Map;\n\n\n\tvoid AddToMap(const AString & a_Name, const AString & a_Value)\n\t{\n\t\tAStringVector Split = StringSplit(a_Value, \":\");\n\t\tif (Split.size() == 1)\n\t\t{\n\t\t\tSplit = StringSplit(a_Value, \"^\");\n\t\t}\n\t\tif (Split.empty())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tshort ItemType;\n\t\tif (!StringToInteger(Split[0], ItemType))\n\t\t{\n\t\t\tASSERT(!\"Invalid item type\");\n\t\t}\n\t\tshort ItemDamage = -1;\n\t\tif (Split.size() > 1 && !StringToInteger(Split[1], ItemDamage))\n\t\t{\n\t\t\tASSERT(!\"Invalid item damage\");\n\t\t}\n\t\tm_Map[a_Name] = std::make_pair(ItemType, ItemDamage);\n\t}\n} ;\n\n\n\n\nstatic cBlockIDMap & GetBlockIDMap()\n{\n\tstatic cBlockIDMap IDMap;\n\treturn IDMap;\n}\n\n\n\n\n\n/*\n// Quick self-test:\nclass Tester\n{\npublic:\n\tTester(void)\n\t{\n\t\tcItem Item;\n\t\tgsBlockIDMap.ResolveItem(\"charcoal\", Item);\n\t\tAString Charcoal = gsBlockIDMap.Desolve(Item.m_ItemType, Item.m_ItemDamage);\n\t\tASSERT(Charcoal == \"charcoal\");\n\t}\n} test;\n//*/\n\n\n\n\n\nint BlockStringToType(const AString & a_BlockTypeString)\n{\n\tint res = atoi(a_BlockTypeString.c_str());\n\tif ((res != 0) || (a_BlockTypeString.compare(\"0\") == 0))\n\t{\n\t\t// It was a valid number, return that\n\t\treturn res;\n\t}\n\n\treturn GetBlockIDMap().Resolve(TrimString(a_BlockTypeString));\n}\n\n\n\n\n\nbool StringToItem(const AString & a_ItemTypeString, cItem & a_Item)\n{\n\tAString ItemName = TrimString(a_ItemTypeString);\n\tif (ItemName.substr(0, 10) == \"minecraft:\")\n\t{\n\t\tItemName = ItemName.substr(10);\n\t}\n\n\treturn GetBlockIDMap().ResolveItem(ItemName, a_Item);\n}\n\n\n\n\n\nAString ItemToString(const cItem & a_Item)\n{\n\treturn GetBlockIDMap().Desolve(a_Item.m_ItemType, a_Item.m_ItemDamage);\n}\n\n\n\n\n\nAString ItemTypeToString(short a_ItemType)\n{\n\treturn GetBlockIDMap().Desolve(a_ItemType, -1);\n}\n\n\n\n\n\nAString ItemToFullString(const cItem & a_Item)\n{\n\treturn fmt::format(FMT_STRING(\"{}:{} * {:d}\"), ItemToString(a_Item), a_Item.m_ItemDamage, a_Item.m_ItemCount);\n}\n\n\n\n\n\ncItem GetIniItemSet(cIniFile & a_IniFile, const char * a_Section, const char * a_Key, const char * a_Default)\n{\n\tAString ItemStr = a_IniFile.GetValueSet(a_Section, a_Key, a_Default);\n\tcItem res;\n\tif (!StringToItem(ItemStr, res))\n\t{\n\t\tres.Empty();\n\t}\n\treturn res;\n}\n\n\n\n\n\n\n"
  },
  {
    "path": "src/BlockType.h",
    "content": "#pragma once\n\n#include \"ChunkDef.h\"\n\n// tolua_begin\n\n\nenum ENUM_BLOCK_TYPE : BLOCKTYPE\n{\n\tE_BLOCK_AIR = 0,\n\tE_BLOCK_STONE = 1,\n\tE_BLOCK_GRASS = 2,\n\tE_BLOCK_DIRT = 3,\n\tE_BLOCK_COBBLESTONE = 4,\n\tE_BLOCK_PLANKS = 5,\n\tE_BLOCK_SAPLING = 6,\n\tE_BLOCK_BEDROCK = 7,\n\tE_BLOCK_WATER = 8,\n\tE_BLOCK_STATIONARY_WATER = 9,\n\tE_BLOCK_LAVA = 10,\n\tE_BLOCK_STATIONARY_LAVA  = 11,\n\tE_BLOCK_SAND = 12,\n\tE_BLOCK_GRAVEL = 13,\n\tE_BLOCK_GOLD_ORE = 14,\n\tE_BLOCK_IRON_ORE = 15,\n\tE_BLOCK_COAL_ORE = 16,\n\tE_BLOCK_LOG = 17,\n\tE_BLOCK_LEAVES = 18,\n\tE_BLOCK_SPONGE = 19,\n\tE_BLOCK_GLASS = 20,\n\tE_BLOCK_LAPIS_ORE = 21,\n\tE_BLOCK_LAPIS_BLOCK = 22,\n\tE_BLOCK_DISPENSER = 23,\n\tE_BLOCK_SANDSTONE = 24,\n\tE_BLOCK_NOTE_BLOCK = 25,\n\tE_BLOCK_BED = 26,\n\tE_BLOCK_POWERED_RAIL = 27,\n\tE_BLOCK_DETECTOR_RAIL = 28,\n\tE_BLOCK_STICKY_PISTON = 29,\n\tE_BLOCK_COBWEB = 30,\n\tE_BLOCK_TALL_GRASS = 31,\n\tE_BLOCK_DEAD_BUSH = 32,\n\tE_BLOCK_PISTON = 33,\n\tE_BLOCK_PISTON_EXTENSION = 34,\n\tE_BLOCK_WOOL = 35,\n\tE_BLOCK_PISTON_MOVED_BLOCK = 36,\n\tE_BLOCK_DANDELION = 37,\n\tE_BLOCK_FLOWER = 38,\n\tE_BLOCK_BROWN_MUSHROOM = 39,\n\tE_BLOCK_RED_MUSHROOM = 40,\n\tE_BLOCK_GOLD_BLOCK = 41,\n\tE_BLOCK_IRON_BLOCK = 42,\n\tE_BLOCK_DOUBLE_STONE_SLAB = 43,\n\tE_BLOCK_STONE_SLAB = 44,\n\tE_BLOCK_BRICK = 45,\n\tE_BLOCK_TNT = 46,\n\tE_BLOCK_BOOKCASE = 47,\n\tE_BLOCK_MOSSY_COBBLESTONE = 48,\n\tE_BLOCK_OBSIDIAN = 49,\n\tE_BLOCK_TORCH = 50,\n\tE_BLOCK_FIRE = 51,\n\tE_BLOCK_MOB_SPAWNER = 52,\n\tE_BLOCK_OAK_WOOD_STAIRS = 53,\n\tE_BLOCK_CHEST = 54,\n\tE_BLOCK_REDSTONE_WIRE = 55,\n\tE_BLOCK_DIAMOND_ORE = 56,\n\tE_BLOCK_DIAMOND_BLOCK = 57,\n\tE_BLOCK_CRAFTING_TABLE = 58,\n\tE_BLOCK_WORKBENCH = 58,\n\tE_BLOCK_WHEAT = 59,\n\tE_BLOCK_CROPS = E_BLOCK_WHEAT,\n\tE_BLOCK_FARMLAND = 60,\n\tE_BLOCK_FURNACE = 61,\n\tE_BLOCK_LIT_FURNACE = 62,\n\tE_BLOCK_BURNING_FURNACE = 62,\n\tE_BLOCK_SIGN_POST = 63,\n\tE_BLOCK_OAK_DOOR = 64,\n\tE_BLOCK_LADDER = 65,\n\tE_BLOCK_RAIL = 66,\n\tE_BLOCK_MINECART_TRACKS = 66,\n\tE_BLOCK_COBBLESTONE_STAIRS = 67,\n\tE_BLOCK_WALLSIGN = 68,\n\tE_BLOCK_LEVER = 69,\n\tE_BLOCK_STONE_PRESSURE_PLATE = 70,\n\tE_BLOCK_IRON_DOOR = 71,\n\tE_BLOCK_WOODEN_PRESSURE_PLATE = 72,\n\tE_BLOCK_REDSTONE_ORE = 73,\n\tE_BLOCK_REDSTONE_ORE_GLOWING = 74,\n\tE_BLOCK_REDSTONE_TORCH_OFF = 75,\n\tE_BLOCK_REDSTONE_TORCH_ON = 76,\n\tE_BLOCK_STONE_BUTTON = 77,\n\tE_BLOCK_SNOW = 78,\n\tE_BLOCK_ICE = 79,\n\tE_BLOCK_SNOW_BLOCK = 80,\n\tE_BLOCK_CACTUS = 81,\n\tE_BLOCK_CLAY = 82,\n\tE_BLOCK_SUGARCANE = 83,\n\tE_BLOCK_REEDS = 83,\n\tE_BLOCK_JUKEBOX = 84,\n\tE_BLOCK_FENCE = 85,\n\tE_BLOCK_PUMPKIN = 86,\n\tE_BLOCK_NETHERRACK = 87,\n\tE_BLOCK_SOULSAND = 88,\n\tE_BLOCK_GLOWSTONE = 89,\n\tE_BLOCK_NETHER_PORTAL = 90,\n\tE_BLOCK_JACK_O_LANTERN = 91,\n\tE_BLOCK_CAKE = 92,\n\tE_BLOCK_REDSTONE_REPEATER_OFF = 93,\n\tE_BLOCK_REDSTONE_REPEATER_ON = 94,\n\tE_BLOCK_STAINED_GLASS = 95,\n\tE_BLOCK_TRAPDOOR = 96,\n\tE_BLOCK_SILVERFISH_EGG = 97,\n\tE_BLOCK_STONE_BRICKS = 98,\n\tE_BLOCK_HUGE_BROWN_MUSHROOM = 99,\n\tE_BLOCK_HUGE_RED_MUSHROOM = 100,\n\tE_BLOCK_IRON_BARS = 101,\n\tE_BLOCK_GLASS_PANE = 102,\n\tE_BLOCK_MELON = 103,\n\tE_BLOCK_PUMPKIN_STEM = 104,\n\tE_BLOCK_MELON_STEM = 105,\n\tE_BLOCK_VINES = 106,\n\tE_BLOCK_OAK_FENCE_GATE = 107,\n\tE_BLOCK_BRICK_STAIRS = 108,\n\tE_BLOCK_STONE_BRICK_STAIRS = 109,\n\tE_BLOCK_MYCELIUM = 110,\n\tE_BLOCK_LILY_PAD = 111,\n\tE_BLOCK_NETHER_BRICK = 112,\n\tE_BLOCK_NETHER_BRICK_FENCE = 113,\n\tE_BLOCK_NETHER_BRICK_STAIRS = 114,\n\tE_BLOCK_NETHER_WART = 115,\n\tE_BLOCK_ENCHANTMENT_TABLE = 116,\n\tE_BLOCK_BREWING_STAND = 117,\n\tE_BLOCK_CAULDRON = 118,\n\tE_BLOCK_END_PORTAL = 119,\n\tE_BLOCK_END_PORTAL_FRAME = 120,\n\tE_BLOCK_END_STONE = 121,\n\tE_BLOCK_DRAGON_EGG = 122,\n\tE_BLOCK_REDSTONE_LAMP_OFF = 123,\n\tE_BLOCK_REDSTONE_LAMP_ON = 124,\n\tE_BLOCK_DOUBLE_WOODEN_SLAB = 125,\n\tE_BLOCK_WOODEN_SLAB = 126,\n\tE_BLOCK_COCOA_POD = 127,\n\tE_BLOCK_SANDSTONE_STAIRS = 128,\n\tE_BLOCK_EMERALD_ORE = 129,\n\tE_BLOCK_ENDER_CHEST = 130,\n\tE_BLOCK_TRIPWIRE_HOOK = 131,\n\tE_BLOCK_TRIPWIRE = 132,\n\tE_BLOCK_EMERALD_BLOCK = 133,\n\tE_BLOCK_SPRUCE_WOOD_STAIRS = 134,\n\tE_BLOCK_BIRCH_WOOD_STAIRS = 135,\n\tE_BLOCK_JUNGLE_WOOD_STAIRS = 136,\n\tE_BLOCK_COMMAND_BLOCK = 137,\n\tE_BLOCK_BEACON = 138,\n\tE_BLOCK_COBBLESTONE_WALL = 139,\n\tE_BLOCK_FLOWER_POT = 140,\n\tE_BLOCK_CARROTS = 141,\n\tE_BLOCK_POTATOES = 142,\n\tE_BLOCK_WOODEN_BUTTON = 143,\n\tE_BLOCK_HEAD = 144,\n\tE_BLOCK_ANVIL = 145,\n\tE_BLOCK_TRAPPED_CHEST = 146,\n\tE_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE = 147,\n\tE_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE = 148,\n\n\tE_BLOCK_INACTIVE_COMPARATOR = 149,\n\tE_BLOCK_ACTIVE_COMPARATOR = 150,\n\tE_BLOCK_DAYLIGHT_SENSOR = 151,\n\tE_BLOCK_BLOCK_OF_REDSTONE = 152,\n\n\tE_BLOCK_NETHER_QUARTZ_ORE = 153,\n\tE_BLOCK_HOPPER = 154,\n\tE_BLOCK_QUARTZ_BLOCK = 155,\n\tE_BLOCK_QUARTZ_STAIRS = 156,\n\tE_BLOCK_ACTIVATOR_RAIL = 157,\n\n\tE_BLOCK_DROPPER = 158,\n\tE_BLOCK_STAINED_CLAY = 159,  // Synonym to terracotta\n\tE_BLOCK_TERRACOTTA = 159,  // Synonym to stained clay\n\tE_BLOCK_STAINED_GLASS_PANE = 160,\n\tE_BLOCK_NEW_LEAVES = 161,  // Acacia and Dark Oak IDs in Minecraft 1.7.x\n\tE_BLOCK_NEW_LOG = 162,\n\tE_BLOCK_ACACIA_WOOD_STAIRS = 163,\n\tE_BLOCK_DARK_OAK_WOOD_STAIRS = 164,\n\tE_BLOCK_SLIME_BLOCK = 165,\n\tE_BLOCK_BARRIER = 166,\n\tE_BLOCK_IRON_TRAPDOOR = 167,\n\tE_BLOCK_PRISMARINE_BLOCK = 168,\n\tE_BLOCK_SEA_LANTERN = 169,\n\tE_BLOCK_HAY_BALE = 170,\n\tE_BLOCK_CARPET = 171,\n\tE_BLOCK_HARDENED_CLAY = 172,\n\tE_BLOCK_BLOCK_OF_COAL = 173,\n\tE_BLOCK_PACKED_ICE = 174,\n\tE_BLOCK_BIG_FLOWER = 175,\n\tE_BLOCK_STANDING_BANNER = 176,\n\tE_BLOCK_WALL_BANNER = 177,\n\tE_BLOCK_INVERTED_DAYLIGHT_SENSOR = 178,\n\tE_BLOCK_RED_SANDSTONE = 179,\n\tE_BLOCK_RED_SANDSTONE_STAIRS = 180,\n\tE_BLOCK_DOUBLE_RED_SANDSTONE_SLAB = 181,\n\tE_BLOCK_RED_SANDSTONE_SLAB = 182,\n\tE_BLOCK_SPRUCE_FENCE_GATE = 183,\n\tE_BLOCK_BIRCH_FENCE_GATE = 184,\n\tE_BLOCK_JUNGLE_FENCE_GATE = 185,\n\tE_BLOCK_DARK_OAK_FENCE_GATE = 186,\n\tE_BLOCK_ACACIA_FENCE_GATE = 187,\n\tE_BLOCK_SPRUCE_FENCE = 188,\n\tE_BLOCK_BIRCH_FENCE = 189,\n\tE_BLOCK_JUNGLE_FENCE = 190,\n\tE_BLOCK_DARK_OAK_FENCE = 191,\n\tE_BLOCK_ACACIA_FENCE = 192,\n\tE_BLOCK_SPRUCE_DOOR = 193,\n\tE_BLOCK_BIRCH_DOOR = 194,\n\tE_BLOCK_JUNGLE_DOOR = 195,\n\tE_BLOCK_ACACIA_DOOR = 196,\n\tE_BLOCK_DARK_OAK_DOOR = 197,\n\tE_BLOCK_END_ROD = 198,\n\tE_BLOCK_CHORUS_PLANT = 199,\n\tE_BLOCK_CHORUS_FLOWER = 200,\n\tE_BLOCK_PURPUR_BLOCK = 201,\n\tE_BLOCK_PURPUR_PILLAR = 202,\n\tE_BLOCK_PURPUR_STAIRS = 203,\n\tE_BLOCK_PURPUR_DOUBLE_SLAB = 204,\n\tE_BLOCK_PURPUR_SLAB = 205,\n\tE_BLOCK_END_BRICKS = 206,\n\tE_BLOCK_BEETROOTS = 207,\n\tE_BLOCK_GRASS_PATH = 208,\n\tE_BLOCK_END_GATEWAY = 209,\n\tE_BLOCK_REPEATING_COMMAND_BLOCK = 210,\n\tE_BLOCK_CHAIN_COMMAND_BLOCK = 211,\n\tE_BLOCK_FROSTED_ICE = 212,\n\tE_BLOCK_MAGMA = 213,\n\tE_BLOCK_NETHER_WART_BLOCK = 214,\n\tE_BLOCK_RED_NETHER_BRICK = 215,\n\tE_BLOCK_BONE_BLOCK = 216,\n\tE_BLOCK_STRUCTURE_VOID = 217,\n\tE_BLOCK_OBSERVER = 218,\n\tE_BLOCK_WHITE_SHULKER_BOX = 219,\n\tE_BLOCK_ORANGE_SHULKER_BOX = 220,\n\tE_BLOCK_MAGENTA_SHULKER_BOX = 221,\n\tE_BLOCK_LIGHT_BLUE_SHULKER_BOX = 222,\n\tE_BLOCK_YELLOW_SHULKER_BOX = 223,\n\tE_BLOCK_LIME_SHULKER_BOX = 224,\n\tE_BLOCK_PINK_SHULKER_BOX = 225,\n\tE_BLOCK_GRAY_SHULKER_BOX = 226,\n\tE_BLOCK_LIGHT_GRAY_SHULKER_BOX = 227,\n\tE_BLOCK_CYAN_SHULKER_BOX = 228,\n\tE_BLOCK_PURPLE_SHULKER_BOX = 229,\n\tE_BLOCK_BLUE_SHULKER_BOX = 230,\n\tE_BLOCK_BROWN_SHULKER_BOX = 231,\n\tE_BLOCK_GREEN_SHULKER_BOX = 232,\n\tE_BLOCK_RED_SHULKER_BOX = 233,\n\tE_BLOCK_BLACK_SHULKER_BOX = 234,\n\tE_BLOCK_WHITE_GLAZED_TERRACOTTA = 235,\n\tE_BLOCK_ORANGE_GLAZED_TERRACOTTA = 236,\n\tE_BLOCK_MAGENTA_GLAZED_TERRACOTTA = 237,\n\tE_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA = 238,\n\tE_BLOCK_YELLOW_GLAZED_TERRACOTTA = 239,\n\tE_BLOCK_LIME_GLAZED_TERRACOTTA = 240,\n\tE_BLOCK_PINK_GLAZED_TERRACOTTA = 241,\n\tE_BLOCK_GRAY_GLAZED_TERRACOTTA = 242,\n\tE_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA = 243,\n\tE_BLOCK_CYAN_GLAZED_TERRACOTTA = 244,\n\tE_BLOCK_PURPLE_GLAZED_TERRACOTTA = 245,\n\tE_BLOCK_BLUE_GLAZED_TERRACOTTA = 246,\n\tE_BLOCK_BROWN_GLAZED_TERRACOTTA = 247,\n\tE_BLOCK_GREEN_GLAZED_TERRACOTTA = 248,\n\tE_BLOCK_RED_GLAZED_TERRACOTTA = 249,\n\tE_BLOCK_BLACK_GLAZED_TERRACOTTA = 250,\n\tE_BLOCK_CONCRETE = 251,\n\tE_BLOCK_CONCRETE_POWDER = 252,\n\t// ...\n\tE_BLOCK_STRUCTURE_BLOCK = 255,\n\n\t// Keep these two as the last values. Update the last block value to the last block with an id less than 255 when adding another block\n\t// IsValidBlock() depends on this (255 gets checked additionally because there is a gap. See https://minecraft.wiki/w/Data_values#Block_IDs\n\tE_BLOCK_NUMBER_OF_TYPES = E_BLOCK_CONCRETE_POWDER + 1,  ///< Number of individual (different) blocktypes\n\tE_BLOCK_MAX_TYPE_ID = E_BLOCK_NUMBER_OF_TYPES - 1,  ///< Maximum BlockType number used\n\n\tE_BLOCK_UNFINISHED = 254,  // Special type used as a placeholder, signifying that the block lacks implementation\n\n\t// Synonym or ID compatibility\n\tE_BLOCK_YELLOW_FLOWER = E_BLOCK_DANDELION,\n\tE_BLOCK_RED_ROSE = E_BLOCK_FLOWER,\n\tE_BLOCK_WOODEN_DOOR = E_BLOCK_OAK_DOOR,\n\tE_BLOCK_FENCE_GATE = E_BLOCK_OAK_FENCE_GATE,\n\tE_BLOCK_WOODEN_STAIRS = E_BLOCK_OAK_WOOD_STAIRS,\n};\n\n\n\n\n\nenum ENUM_ITEM_TYPE : short\n{\n\tE_ITEM_EMPTY = -1,\n\n\tE_ITEM_FIRST = 256,  // First true item type\n\n\tE_ITEM_IRON_SHOVEL = 256,\n\tE_ITEM_IRON_PICKAXE = 257,\n\tE_ITEM_IRON_AXE = 258,\n\tE_ITEM_FLINT_AND_STEEL = 259,\n\tE_ITEM_RED_APPLE = 260,\n\tE_ITEM_BOW = 261,\n\tE_ITEM_ARROW = 262,\n\tE_ITEM_COAL = 263,\n\tE_ITEM_DIAMOND = 264,\n\tE_ITEM_IRON = 265,\n\tE_ITEM_GOLD = 266,\n\tE_ITEM_IRON_SWORD = 267,\n\tE_ITEM_WOODEN_SWORD = 268,\n\tE_ITEM_WOODEN_SHOVEL = 269,\n\tE_ITEM_WOODEN_PICKAXE = 270,\n\tE_ITEM_WOODEN_AXE = 271,\n\tE_ITEM_STONE_SWORD = 272,\n\tE_ITEM_STONE_SHOVEL = 273,\n\tE_ITEM_STONE_PICKAXE = 274,\n\tE_ITEM_STONE_AXE = 275,\n\tE_ITEM_DIAMOND_SWORD = 276,\n\tE_ITEM_DIAMOND_SHOVEL = 277,\n\tE_ITEM_DIAMOND_PICKAXE = 278,\n\tE_ITEM_DIAMOND_AXE = 279,\n\tE_ITEM_STICK = 280,\n\tE_ITEM_BOWL = 281,\n\tE_ITEM_MUSHROOM_SOUP = 282,\n\tE_ITEM_GOLD_SWORD = 283,\n\tE_ITEM_GOLD_SHOVEL = 284,\n\tE_ITEM_GOLD_PICKAXE = 285,\n\tE_ITEM_GOLD_AXE = 286,\n\tE_ITEM_STRING = 287,\n\tE_ITEM_FEATHER = 288,\n\tE_ITEM_GUNPOWDER = 289,\n\tE_ITEM_WOODEN_HOE = 290,\n\tE_ITEM_STONE_HOE = 291,\n\tE_ITEM_IRON_HOE = 292,\n\tE_ITEM_DIAMOND_HOE = 293,\n\tE_ITEM_GOLD_HOE = 294,\n\tE_ITEM_SEEDS = 295,\n\tE_ITEM_WHEAT = 296,\n\tE_ITEM_BREAD = 297,\n\tE_ITEM_LEATHER_CAP = 298,\n\tE_ITEM_LEATHER_TUNIC = 299,\n\tE_ITEM_LEATHER_PANTS = 300,\n\tE_ITEM_LEATHER_BOOTS = 301,\n\tE_ITEM_CHAIN_HELMET = 302,\n\tE_ITEM_CHAIN_CHESTPLATE = 303,\n\tE_ITEM_CHAIN_LEGGINGS = 304,\n\tE_ITEM_CHAIN_BOOTS = 305,\n\tE_ITEM_IRON_HELMET = 306,\n\tE_ITEM_IRON_CHESTPLATE = 307,\n\tE_ITEM_IRON_LEGGINGS = 308,\n\tE_ITEM_IRON_BOOTS = 309,\n\tE_ITEM_DIAMOND_HELMET = 310,\n\tE_ITEM_DIAMOND_CHESTPLATE = 311,\n\tE_ITEM_DIAMOND_LEGGINGS = 312,\n\tE_ITEM_DIAMOND_BOOTS = 313,\n\tE_ITEM_GOLD_HELMET = 314,\n\tE_ITEM_GOLD_CHESTPLATE = 315,\n\tE_ITEM_GOLD_LEGGINGS = 316,\n\tE_ITEM_GOLD_BOOTS = 317,\n\tE_ITEM_FLINT = 318,\n\tE_ITEM_RAW_PORKCHOP = 319,\n\tE_ITEM_COOKED_PORKCHOP = 320,\n\tE_ITEM_PAINTING = 321,\n\tE_ITEM_GOLDEN_APPLE = 322,\n\tE_ITEM_SIGN = 323,\n\tE_ITEM_WOODEN_DOOR = 324,\n\tE_ITEM_BUCKET = 325,\n\tE_ITEM_WATER_BUCKET = 326,\n\tE_ITEM_LAVA_BUCKET = 327,\n\tE_ITEM_MINECART = 328,\n\tE_ITEM_SADDLE = 329,\n\tE_ITEM_IRON_DOOR = 330,\n\tE_ITEM_REDSTONE_DUST = 331,\n\tE_ITEM_SNOWBALL = 332,\n\tE_ITEM_BOAT = 333,\n\tE_ITEM_LEATHER = 334,\n\tE_ITEM_MILK = 335,\n\tE_ITEM_CLAY_BRICK = 336,\n\tE_ITEM_CLAY = 337,\n\tE_ITEM_SUGARCANE = 338,\n\tE_ITEM_SUGAR_CANE = 338,\n\tE_ITEM_PAPER = 339,\n\tE_ITEM_BOOK = 340,\n\tE_ITEM_SLIMEBALL = 341,\n\tE_ITEM_CHEST_MINECART = 342,\n\tE_ITEM_FURNACE_MINECART = 343,\n\tE_ITEM_EGG = 344,\n\tE_ITEM_COMPASS = 345,\n\tE_ITEM_FISHING_ROD = 346,\n\tE_ITEM_CLOCK = 347,\n\tE_ITEM_GLOWSTONE_DUST = 348,\n\tE_ITEM_RAW_FISH = 349,\n\tE_ITEM_COOKED_FISH = 350,\n\tE_ITEM_DYE = 351,\n\tE_ITEM_BONE = 352,\n\tE_ITEM_SUGAR = 353,\n\tE_ITEM_CAKE = 354,\n\tE_ITEM_BED = 355,\n\tE_ITEM_REDSTONE_REPEATER = 356,\n\tE_ITEM_COOKIE = 357,\n\tE_ITEM_MAP = 358,\n\tE_ITEM_SHEARS = 359,\n\tE_ITEM_MELON_SLICE = 360,\n\tE_ITEM_PUMPKIN_SEEDS = 361,\n\tE_ITEM_MELON_SEEDS = 362,\n\tE_ITEM_RAW_BEEF = 363,\n\tE_ITEM_STEAK = 364,\n\tE_ITEM_RAW_CHICKEN = 365,\n\tE_ITEM_COOKED_CHICKEN = 366,\n\tE_ITEM_ROTTEN_FLESH = 367,\n\tE_ITEM_ENDER_PEARL = 368,\n\tE_ITEM_BLAZE_ROD = 369,\n\tE_ITEM_GHAST_TEAR = 370,\n\tE_ITEM_GOLD_NUGGET = 371,\n\tE_ITEM_NETHER_WART = 372,\n\tE_ITEM_POTION = 373,\n\tE_ITEM_POTIONS = 373,  // OBSOLETE, use E_ITEM_POTION instead\n\tE_ITEM_GLASS_BOTTLE = 374,\n\tE_ITEM_SPIDER_EYE = 375,\n\tE_ITEM_FERMENTED_SPIDER_EYE = 376,\n\tE_ITEM_BLAZE_POWDER = 377,\n\tE_ITEM_MAGMA_CREAM = 378,\n\tE_ITEM_BREWING_STAND = 379,\n\tE_ITEM_CAULDRON = 380,\n\tE_ITEM_EYE_OF_ENDER = 381,\n\tE_ITEM_GLISTERING_MELON = 382,\n\tE_ITEM_SPAWN_EGG = 383,\n\tE_ITEM_BOTTLE_O_ENCHANTING = 384,\n\tE_ITEM_FIRE_CHARGE = 385,\n\tE_ITEM_BOOK_AND_QUILL = 386,\n\tE_ITEM_WRITTEN_BOOK = 387,\n\tE_ITEM_EMERALD = 388,\n\tE_ITEM_ITEM_FRAME = 389,\n\tE_ITEM_FLOWER_POT = 390,\n\tE_ITEM_CARROT = 391,\n\tE_ITEM_POTATO = 392,\n\tE_ITEM_BAKED_POTATO = 393,\n\tE_ITEM_POISONOUS_POTATO = 394,\n\tE_ITEM_EMPTY_MAP = 395,\n\tE_ITEM_GOLDEN_CARROT = 396,\n\tE_ITEM_HEAD = 397,\n\tE_ITEM_CARROT_ON_STICK = 398,\n\tE_ITEM_NETHER_STAR = 399,\n\tE_ITEM_PUMPKIN_PIE = 400,\n\tE_ITEM_FIREWORK_ROCKET = 401,\n\tE_ITEM_FIREWORK_STAR = 402,\n\tE_ITEM_ENCHANTED_BOOK = 403,\n\tE_ITEM_COMPARATOR = 404,\n\tE_ITEM_NETHER_BRICK = 405,\n\tE_ITEM_NETHER_QUARTZ = 406,\n\tE_ITEM_MINECART_WITH_TNT = 407,\n\tE_ITEM_MINECART_WITH_HOPPER = 408,\n\tE_ITEM_PRISMARINE_SHARD = 409,\n\tE_ITEM_PRISMARINE_CRYSTALS = 410,\n\tE_ITEM_RAW_RABBIT = 411,\n\tE_ITEM_COOKED_RABBIT = 412,\n\tE_ITEM_RABBIT_STEW = 413,\n\tE_ITEM_RABBITS_FOOT = 414,\n\tE_ITEM_RABBIT_HIDE = 415,\n\tE_ITEM_ARMOR_STAND = 416,\n\tE_ITEM_IRON_HORSE_ARMOR = 417,\n\tE_ITEM_GOLD_HORSE_ARMOR = 418,\n\tE_ITEM_DIAMOND_HORSE_ARMOR = 419,\n\tE_ITEM_LEAD = 420,\n\tE_ITEM_LEASH = E_ITEM_LEAD,\n\tE_ITEM_NAME_TAG = 421,\n\tE_ITEM_MINECART_WITH_COMMAND_BLOCK = 422,\n\tE_ITEM_RAW_MUTTON = 423,\n\tE_ITEM_COOKED_MUTTON = 424,\n\tE_ITEM_BANNER = 425,\n\tE_ITEM_END_CRYSTAL = 426,\n\tE_ITEM_SPRUCE_DOOR = 427,\n\tE_ITEM_BIRCH_DOOR = 428,\n\tE_ITEM_JUNGLE_DOOR = 429,\n\tE_ITEM_ACACIA_DOOR = 430,\n\tE_ITEM_DARK_OAK_DOOR = 431,\n\tE_ITEM_CHORUS_FRUIT = 432,\n\tE_ITEM_POPPED_CHORUS_FRUIT = 433,\n\tE_ITEM_BEETROOT = 434,\n\tE_ITEM_BEETROOT_SEEDS = 435,\n\tE_ITEM_BEETROOT_SOUP = 436,\n\tE_ITEM_DRAGON_BREATH = 437,\n\tE_ITEM_SPLASH_POTION = 438,\n\tE_ITEM_SPECTRAL_ARROW = 439,\n\tE_ITEM_TIPPED_ARROW = 440,\n\tE_ITEM_LINGERING_POTION = 441,\n\tE_ITEM_SHIELD = 442,\n\tE_ITEM_ELYTRA = 443,\n\tE_ITEM_SPRUCE_BOAT = 444,\n\tE_ITEM_BIRCH_BOAT = 445,\n\tE_ITEM_JUNGLE_BOAT = 446,\n\tE_ITEM_ACACIA_BOAT = 447,\n\tE_ITEM_DARK_OAK_BOAT = 448,\n\tE_ITEM_TOTEM_OF_UNDYING = 449,\n\tE_ITEM_SHULKER_SHELL = 450,\n\tE_ITEM_IRON_NUGGET = 452,\n\n\t// Keep these two as the last values of the consecutive list, without a number - they will get their correct number assigned automagically by C++\n\t// IsValidItem() depends on this!\n\tE_ITEM_NUMBER_OF_CONSECUTIVE_TYPES,  ///< Number of individual (different) consecutive itemtypes\n\tE_ITEM_MAX_CONSECUTIVE_TYPE_ID = E_ITEM_NUMBER_OF_CONSECUTIVE_TYPES - 1,  ///< Maximum consecutive ItemType number used\n\n\tE_ITEM_FIRST_DISC = 2256,\n\tE_ITEM_13_DISC = 2256,\n\tE_ITEM_CAT_DISC = 2257,\n\tE_ITEM_BLOCKS_DISC = 2258,\n\tE_ITEM_CHIRP_DISC = 2259,\n\tE_ITEM_FAR_DISC = 2260,\n\tE_ITEM_MALL_DISC = 2261,\n\tE_ITEM_MELLOHI_DISC = 2262,\n\tE_ITEM_STAL_DISC = 2263,\n\tE_ITEM_STRAD_DISC = 2264,\n\tE_ITEM_WARD_DISC = 2265,\n\tE_ITEM_11_DISC = 2266,\n\tE_ITEM_WAIT_DISC = 2267,\n\n\t// Keep these two as the last values of the disc list, without a number - they will get their correct number assigned automagically by C++\n\t// IsValidItem() depends on this!\n\tE_ITEM_LAST_DISC_PLUS_ONE,  ///< Useless, really, but needs to be present for the following value\n\tE_ITEM_LAST_DISC = E_ITEM_LAST_DISC_PLUS_ONE - 1,  ///< Maximum disc itemtype number used\n\n\tE_ITEM_LAST = E_ITEM_LAST_DISC,  ///< Maximum valid ItemType\n};\n\n\n\n\n\nenum ENUM_BLOCK_META : NIBBLETYPE\n{\n\t// Please keep this list alpha-sorted by the blocktype part\n\t// then number-sorted for the same block\n\n\t////////////////////////////////////////////////////////////////////////////////\n\t// Block metas:\n\n\t// E_BLOCK_ANVIL metas\n\tE_BLOCK_ANVIL_Z = 0,\n\tE_BLOCK_ANVIL_X = 1,\n\tE_BLOCK_ANVIL_NO_DAMAGE = 0,\n\tE_BLOCK_ANVIL_LOW_DAMAGE = 4,\n\tE_BLOCK_ANVIL_HIGH_DAMAGE = 8,\n\n\t// E_BLOCK_BED metas:\n\tE_BLOCK_BED_ZP = 0,\n\tE_BLOCK_BED_XM = 1,\n\tE_BLOCK_BED_ZM = 2,\n\tE_BLOCK_BED_XP = 3,\n\tE_BLOCK_BED_OCCUPIED = 4,\n\tE_BLOCK_BED_BED_HEAD = 8,\n\n\t// E_BLOCK_BIG_FLOWER metas:\n\tE_META_BIG_FLOWER_SUNFLOWER         = 0,\n\tE_META_BIG_FLOWER_LILAC             = 1,\n\tE_META_BIG_FLOWER_DOUBLE_TALL_GRASS = 2,\n\tE_META_BIG_FLOWER_LARGE_FERN        = 3,\n\tE_META_BIG_FLOWER_ROSE_BUSH         = 4,\n\tE_META_BIG_FLOWER_PEONY             = 5,\n\t// 0x8 is supposedly a bit flag but all vanilla plants have this value\n\tE_META_BIG_FLOWER_TOP               = 10,\n\n\t// E_BLOCK_BREWING_STAND metas\n\tE_META_BREWING_STAND_FILLED_SLOT_XP    = 1,\n\tE_META_BREWING_STAND_FILLED_SLOT_XM_ZP = 2,\n\tE_META_BREWING_STAND_FILLED_SLOT_XM_ZM = 4,\n\n\t// E_BLOCK_BUTTON metas\n\tE_BLOCK_BUTTON_YM      = 0,\n\tE_BLOCK_BUTTON_XP      = 1,\n\tE_BLOCK_BUTTON_XM      = 2,\n\tE_BLOCK_BUTTON_ZP      = 3,\n\tE_BLOCK_BUTTON_ZM      = 4,\n\tE_BLOCK_BUTTON_YP      = 5,\n\tE_BLOCK_BUTTON_PRESSED = 8,\n\n\t// E_BLOCK_CARPET metas:\n\tE_META_CARPET_WHITE      = 0,\n\tE_META_CARPET_ORANGE     = 1,\n\tE_META_CARPET_MAGENTA    = 2,\n\tE_META_CARPET_LIGHTBLUE  = 3,\n\tE_META_CARPET_YELLOW     = 4,\n\tE_META_CARPET_LIGHTGREEN = 5,\n\tE_META_CARPET_PINK       = 6,\n\tE_META_CARPET_GRAY       = 7,\n\tE_META_CARPET_LIGHTGRAY  = 8,\n\tE_META_CARPET_CYAN       = 9,\n\tE_META_CARPET_PURPLE     = 10,\n\tE_META_CARPET_BLUE       = 11,\n\tE_META_CARPET_BROWN      = 12,\n\tE_META_CARPET_GREEN      = 13,\n\tE_META_CARPET_RED        = 14,\n\tE_META_CARPET_BLACK      = 15,\n\n\t// E_BLOCK_CHEST metas:\n\tE_META_CHEST_FACING_ZM = 2,\n\tE_META_CHEST_FACING_ZP = 3,\n\tE_META_CHEST_FACING_XM = 4,\n\tE_META_CHEST_FACING_XP = 5,\n\n\t// E_BLOCK_CONCRETE metas:\n\tE_META_CONCRETE_WHITE      = 0,\n\tE_META_CONCRETE_ORANGE     = 1,\n\tE_META_CONCRETE_MAGENTA    = 2,\n\tE_META_CONCRETE_LIGHTBLUE  = 3,\n\tE_META_CONCRETE_YELLOW     = 4,\n\tE_META_CONCRETE_LIGHTGREEN = 5,\n\tE_META_CONCRETE_PINK       = 6,\n\tE_META_CONCRETE_GRAY       = 7,\n\tE_META_CONCRETE_LIGHTGRAY  = 8,\n\tE_META_CONCRETE_CYAN       = 9,\n\tE_META_CONCRETE_PURPLE     = 10,\n\tE_META_CONCRETE_BLUE       = 11,\n\tE_META_CONCRETE_BROWN      = 12,\n\tE_META_CONCRETE_GREEN      = 13,\n\tE_META_CONCRETE_RED        = 14,\n\tE_META_CONCRETE_BLACK      = 15,\n\n\t// E_BLOCK_CONCRETE_POWDER metas:\n\tE_META_CONCRETE_POWDER_WHITE      = 0,\n\tE_META_CONCRETE_POWDER_ORANGE     = 1,\n\tE_META_CONCRETE_POWDER_MAGENTA    = 2,\n\tE_META_CONCRETE_POWDER_LIGHTBLUE  = 3,\n\tE_META_CONCRETE_POWDER_YELLOW     = 4,\n\tE_META_CONCRETE_POWDER_LIGHTGREEN = 5,\n\tE_META_CONCRETE_POWDER_PINK       = 6,\n\tE_META_CONCRETE_POWDER_GRAY       = 7,\n\tE_META_CONCRETE_POWDER_LIGHTGRAY  = 8,\n\tE_META_CONCRETE_POWDER_CYAN       = 9,\n\tE_META_CONCRETE_POWDER_PURPLE     = 10,\n\tE_META_CONCRETE_POWDER_BLUE       = 11,\n\tE_META_CONCRETE_POWDER_BROWN      = 12,\n\tE_META_CONCRETE_POWDER_GREEN      = 13,\n\tE_META_CONCRETE_POWDER_RED        = 14,\n\tE_META_CONCRETE_POWDER_BLACK      = 15,\n\n\t// E_BLOCK_DIRT metas:\n\tE_META_DIRT_NORMAL    = 0,\n\tE_META_DIRT_GRASSLESS = 1,\n\tE_META_DIRT_COARSE    = 1,\n\tE_META_DIRT_PODZOL    = 2,\n\n\t// E_BLOCK_DISPENSER / E_BLOCK_DROPPER metas:\n\tE_META_DROPSPENSER_FACING_YM = 0,\n\tE_META_DROPSPENSER_FACING_YP = 1,\n\tE_META_DROPSPENSER_FACING_ZM = 2,\n\tE_META_DROPSPENSER_FACING_ZP = 3,\n\tE_META_DROPSPENSER_FACING_XM = 4,\n\tE_META_DROPSPENSER_FACING_XP = 5,\n\tE_META_DROPSPENSER_FACING_MASK = 7,\n\tE_META_DROPSPENSER_ACTIVATED = 8,\n\n\t// E_BLOCK_DOUBLE_STONE_SLAB metas:\n\tE_META_DOUBLE_STONE_SLAB_STONE            = 0,\n\tE_META_DOUBLE_STONE_SLAB_SANDSTON         = 1,\n\tE_META_DOUBLE_STONE_SLAB_WOODEN           = 2,\n\tE_META_DOUBLE_STONE_SLAB_COBBLESTONE      = 3,\n\tE_META_DOUBLE_STONE_SLAB_BRICK            = 4,\n\tE_META_DOUBLE_STONE_SLAB_STONE_BRICK      = 5,\n\tE_META_DOUBLE_STONE_SLAB_NETHER_BRICK     = 6,\n\tE_META_DOUBLE_STONE_SLAB_QUARTZ           = 7,\n\tE_META_DOUBLE_STONE_SLAB_SMOOTH_STONE     = 8,\n\tE_META_DOUBLE_STONE_SLAB_SMOOTH_SANDSTONE = 9,\n\tE_META_DOUBLE_STONE_SLAB_TILE_QUARTZ      = 10,\n\n\t// E_BLOCK_END_PORTAL_FRAME metas:\n\tE_META_END_PORTAL_FRAME_ZP     = 0,  // Faces towards centre of portal\n\tE_META_END_PORTAL_FRAME_XM     = 1,\n\tE_META_END_PORTAL_FRAME_ZM     = 2,\n\tE_META_END_PORTAL_FRAME_XP     = 3,\n\tE_META_END_PORTAL_FRAME_ZP_EYE = 4,  // Frames with ender eye\n\tE_META_END_PORTAL_FRAME_XM_EYE = 5,\n\tE_META_END_PORTAL_FRAME_ZM_EYE = 6,\n\tE_META_END_PORTAL_FRAME_XP_EYE = 7,\n\tE_META_END_PORTAL_FRAME_NO_EYE = 0,  // Just the eye bitflag\n\tE_META_END_PORTAL_FRAME_EYE    = 4,\n\n\t// E_BLOCK_FLOWER metas:\n\tE_META_FLOWER_POPPY           = 0,\n\tE_META_FLOWER_BLUE_ORCHID     = 1,\n\tE_META_FLOWER_ALLIUM          = 2,\n\tE_META_FLOWER_RED_TULIP       = 4,\n\tE_META_FLOWER_ORANGE_TULIP    = 5,\n\tE_META_FLOWER_WHITE_TULIP     = 6,\n\tE_META_FLOWER_PINK_TULIP      = 7,\n\tE_META_FLOWER_OXEYE_DAISY     = 8,\n\n\t// E_BLOCK_JUKEBOX metas:\n\tE_META_JUKEBOX_OFF = 0,\n\tE_META_JUKEBOX_ON  = 1,\n\n\t// E_BLOCK_HOPPER metas:\n\tE_META_HOPPER_FACING_YM  = 0,\n\tE_META_HOPPER_UNATTACHED = 1,  // Hopper doesn't move items up, there's no YP\n\tE_META_HOPPER_FACING_ZM  = 2,\n\tE_META_HOPPER_FACING_ZP  = 3,\n\tE_META_HOPPER_FACING_XM  = 4,\n\tE_META_HOPPER_FACING_XP  = 5,\n\n\t// E_BLOCK_LEAVES metas:\n\tE_META_LEAVES_APPLE               = 0,\n\tE_META_LEAVES_CONIFER             = 1,\n\tE_META_LEAVES_BIRCH               = 2,\n\tE_META_LEAVES_JUNGLE              = 3,\n\tE_META_LEAVES_APPLE_NO_DECAY      = 4,\n\tE_META_LEAVES_CONIFER_NO_DECAY    = 5,\n\tE_META_LEAVES_BIRCH_NO_DECAY      = 6,\n\tE_META_LEAVES_JUNGLE_NO_DECAY     = 7,\n\tE_META_LEAVES_APPLE_CHECK_DECAY   = 8,\n\tE_META_LEAVES_CONIFER_CHECK_DECAY = 9,\n\tE_META_LEAVES_BIRCH_CHECK_DECAY   = 10,\n\tE_META_LEAVES_JUNGLE_CHECK_DECAY  = 11,\n\n\t// E_BLOCK_MUSHROOM metas:\n\tE_META_MUSHROOM_ALL_SIDES  = 0,\n\tE_META_MUSHROOM_NORTH_WEST = 1,\n\tE_META_MUSHROOM_NORTH      = 2,\n\tE_META_MUSHROOM_NORTH_EAST = 3,\n\tE_META_MUSHROOM_WEST       = 4,\n\tE_META_MUSHROOM_CENTER     = 5,\n\tE_META_MUSHROOM_EAST       = 6,\n\tE_META_MUSHROOM_SOUTH_WEST = 7,\n\tE_META_MUSHROOM_SOUTH      = 8,\n\tE_META_MUSHROOM_SOUTH_EAST = 9,\n\tE_META_MUSHROOM_STEM       = 10,\n\tE_META_MUSHROOM_CAP        = 14,\n\tE_META_MUSHROOM_FULL_STEM  = 15,\n\n\t// E_BLOCK_LEAVES meta cont. (Block ID 161):\n\tE_META_NEWLEAVES_ACACIA               = 0,\n\tE_META_NEWLEAVES_DARK_OAK             = 1,\n\tE_META_NEWLEAVES_ACACIA_NO_DECAY      = 4,\n\tE_META_NEWLEAVES_DARK_OAK_NO_DECAY    = 5,\n\tE_META_NEWLEAVES_ACACIA_CHECK_DECAY   = 8,\n\tE_META_NEWLEAVES_DARK_OAK_CHECK_DECAY = 9,\n\n\t// E_BLOCK_LOG metas:\n\tE_META_LOG_APPLE   = 0,\n\tE_META_LOG_CONIFER = 1,\n\tE_META_LOG_BIRCH   = 2,\n\tE_META_LOG_JUNGLE  = 3,\n\n\t// E_BLOCK_NEW_LOG metas:\n\tE_META_NEW_LOG_ACACIA_WOOD   = 0,\n\tE_META_NEW_LOG_DARK_OAK_WOOD = 1,\n\n\t// E_BLOCK_PISTON metas:\n\tE_META_PISTON_DOWN        = 0,\n\tE_META_PISTON_U           = 1,\n\tE_META_PISTON_ZM          = 2,\n\tE_META_PISTON_ZP          = 3,\n\tE_META_PISTON_XM          = 4,\n\tE_META_PISTON_XP          = 5,\n\tE_META_PISTON_HEAD_STICKY = 8,\n\tE_META_PISTON_EXTENDED    = 8,\n\n\t// E_BLOCK_PLANKS metas:\n\tE_META_PLANKS_OAK      = 0,\n\tE_META_PLANKS_SPRUCE   = 1,\n\tE_META_PLANKS_BIRCH    = 2,\n\tE_META_PLANKS_JUNGLE   = 3,\n\tE_META_PLANKS_ACACIA   = 4,\n\tE_META_PLANKS_DARK_OAK = 5,\n\n\t// E_BLOCK_(XXX_WEIGHTED)_PRESSURE_PLATE metas:\n\tE_META_PRESSURE_PLATE_RAISED    = 0,\n\tE_META_PRESSURE_PLATE_DEPRESSED = 1,\n\n\t// E_BLOCK_PRISMARINE_BLOCK metas:\n\tE_META_PRISMARINE_BLOCK_ROUGH  = 0,\n\tE_META_PRISMARINE_BLOCK_BRICKS = 1,\n\tE_META_PRISMARINE_BLOCK_DARK   = 2,\n\n\t// E_BLOCK_QUARTZ_BLOCK metas:\n\tE_META_QUARTZ_NORMAL    = 0,\n\tE_META_QUARTZ_CHISELLED = 1,\n\tE_META_QUARTZ_PILLAR    = 2,\n\n\t// E_BLOCK_RAIL metas\n\tE_META_RAIL_ZM_ZP        = 0,\n\tE_META_RAIL_XM_XP        = 1,\n\tE_META_RAIL_ASCEND_XP    = 2,\n\tE_META_RAIL_ASCEND_XM    = 3,\n\tE_META_RAIL_ASCEND_ZM    = 4,\n\tE_META_RAIL_ASCEND_ZP    = 5,\n\tE_META_RAIL_CURVED_ZP_XP = 6,\n\tE_META_RAIL_CURVED_ZP_XM = 7,\n\tE_META_RAIL_CURVED_ZM_XM = 8,\n\tE_META_RAIL_CURVED_ZM_XP = 9,\n\n\t// E_BLOCK_RED_SANDSTONE metas:\n\tE_META_RED_SANDSTONE_NORMAL   = 0,\n\tE_META_RED_SANDSTONE_ORNAMENT = 1,\n\tE_META_RED_SANDSTONE_SMOOTH   = 2,\n\n\t// E_BLOCK_REDSTONE_REPEATER_ON / E_BLOCK_REDSTONE_REPEATER_OFF metas:\n\tE_META_REDSTONE_REPEATER_FACING_ZM = 0,\n\tE_META_REDSTONE_REPEATER_FACING_XP = 1,\n\tE_META_REDSTONE_REPEATER_FACING_ZP = 2,\n\tE_META_REDSTONE_REPEATER_FACING_XM = 3,\n\tE_META_REDSTONE_REPEATER_FACING_MASK = 3,\n\n\t// E_BLOCK_SAND metas:\n\tE_META_SAND_NORMAL = 0,\n\tE_META_SAND_RED    = 1,\n\n\t// E_BLOCK_SANDSTONE metas:\n\tE_META_SANDSTONE_NORMAL   = 0,\n\tE_META_SANDSTONE_ORNAMENT = 1,\n\tE_META_SANDSTONE_SMOOTH   = 2,\n\n\t// E_BLOCK_SAPLING metas (lowest 3 bits):\n\tE_META_SAPLING_APPLE    = 0,\n\tE_META_SAPLING_CONIFER  = 1,\n\tE_META_SAPLING_BIRCH    = 2,\n\tE_META_SAPLING_JUNGLE   = 3,\n\tE_META_SAPLING_ACACIA   = 4,\n\tE_META_SAPLING_DARK_OAK = 5,\n\n\t// E_BLOCK_SILVERFISH_EGG metas:\n\tE_META_SILVERFISH_EGG_STONE                = 0,\n\tE_META_SILVERFISH_EGG_COBBLESTONE          = 1,\n\tE_META_SILVERFISH_EGG_STONE_BRICK          = 2,\n\tE_META_SILVERFISH_EGG_MOSSY_STONE_BRICK    = 3,\n\tE_META_SILVERFISH_EGG_CRACKED_STONE_BRICK  = 4,\n\tE_META_SILVERFISH_EGG_CHISELED_STONE_BRICK = 5,\n\n\t// E_BLOCK_SNOW metas:\n\tE_META_SNOW_LAYER_ONE          = 0,\n\tE_META_SNOW_LAYER_TWO          = 1,\n\tE_META_SNOW_LAYER_THREE        = 2,\n\tE_META_SNOW_LAYER_FOUR         = 3,\n\tE_META_SNOW_LAYER_FIVE         = 4,\n\tE_META_SNOW_LAYER_SIX          = 5,\n\tE_META_SNOW_LAYER_SEVEN        = 6,\n\tE_META_SNOW_LAYER_EIGHT        = 7,\n\n\t// E_BLOCK_SPONGE metas:\n\tE_META_SPONGE_DRY              = 0,\n\tE_META_SPONGE_WET              = 1,\n\n\t// E_BLOCK_STAINED_CLAY metas:\n\tE_META_STAINED_CLAY_WHITE      = 0,\n\tE_META_STAINED_CLAY_ORANGE     = 1,\n\tE_META_STAINED_CLAY_MAGENTA    = 2,\n\tE_META_STAINED_CLAY_LIGHTBLUE  = 3,\n\tE_META_STAINED_CLAY_YELLOW     = 4,\n\tE_META_STAINED_CLAY_LIGHTGREEN = 5,\n\tE_META_STAINED_CLAY_PINK       = 6,\n\tE_META_STAINED_CLAY_GRAY       = 7,\n\tE_META_STAINED_CLAY_LIGHTGRAY  = 8,\n\tE_META_STAINED_CLAY_CYAN       = 9,\n\tE_META_STAINED_CLAY_PURPLE     = 10,\n\tE_META_STAINED_CLAY_BLUE       = 11,\n\tE_META_STAINED_CLAY_BROWN      = 12,\n\tE_META_STAINED_CLAY_GREEN      = 13,\n\tE_META_STAINED_CLAY_RED        = 14,\n\tE_META_STAINED_CLAY_BLACK      = 15,\n\n\t// E_BLOCK_STAINED_GLASS metas:\n\tE_META_STAINED_GLASS_WHITE      = 0,\n\tE_META_STAINED_GLASS_ORANGE     = 1,\n\tE_META_STAINED_GLASS_MAGENTA    = 2,\n\tE_META_STAINED_GLASS_LIGHTBLUE  = 3,\n\tE_META_STAINED_GLASS_YELLOW     = 4,\n\tE_META_STAINED_GLASS_LIGHTGREEN = 5,\n\tE_META_STAINED_GLASS_PINK       = 6,\n\tE_META_STAINED_GLASS_GRAY       = 7,\n\tE_META_STAINED_GLASS_LIGHTGRAY  = 8,\n\tE_META_STAINED_GLASS_CYAN       = 9,\n\tE_META_STAINED_GLASS_PURPLE     = 10,\n\tE_META_STAINED_GLASS_BLUE       = 11,\n\tE_META_STAINED_GLASS_BROWN      = 12,\n\tE_META_STAINED_GLASS_GREEN      = 13,\n\tE_META_STAINED_GLASS_RED        = 14,\n\tE_META_STAINED_GLASS_BLACK      = 15,\n\n\t// E_BLOCK_STAINED_GLASS_PANE metas:\n\tE_META_STAINED_GLASS_PANE_WHITE      = 0,\n\tE_META_STAINED_GLASS_PANE_ORANGE     = 1,\n\tE_META_STAINED_GLASS_PANE_MAGENTA    = 2,\n\tE_META_STAINED_GLASS_PANE_LIGHTBLUE  = 3,\n\tE_META_STAINED_GLASS_PANE_YELLOW     = 4,\n\tE_META_STAINED_GLASS_PANE_LIGHTGREEN = 5,\n\tE_META_STAINED_GLASS_PANE_PINK       = 6,\n\tE_META_STAINED_GLASS_PANE_GRAY       = 7,\n\tE_META_STAINED_GLASS_PANE_LIGHTGRAY  = 8,\n\tE_META_STAINED_GLASS_PANE_CYAN       = 9,\n\tE_META_STAINED_GLASS_PANE_PURPLE     = 10,\n\tE_META_STAINED_GLASS_PANE_BLUE       = 11,\n\tE_META_STAINED_GLASS_PANE_BROWN      = 12,\n\tE_META_STAINED_GLASS_PANE_GREEN      = 13,\n\tE_META_STAINED_GLASS_PANE_RED        = 14,\n\tE_META_STAINED_GLASS_PANE_BLACK      = 15,\n\n\t// E_BLOCK_STAIRS metas:\n\tE_BLOCK_STAIRS_XP          = 0,\n\tE_BLOCK_STAIRS_XM          = 1,\n\tE_BLOCK_STAIRS_ZP          = 2,\n\tE_BLOCK_STAIRS_ZM          = 3,\n\tE_BLOCK_STAIRS_UPSIDE_DOWN = 4,\n\n\t// E_BLOCK_STONE metas:\n\tE_META_STONE_STONE             = 0,\n\tE_META_STONE_GRANITE           = 1,\n\tE_META_STONE_POLISHED_GRANITE  = 2,\n\tE_META_STONE_DIORITE           = 3,\n\tE_META_STONE_POLISHED_DIORITE  = 4,\n\tE_META_STONE_ANDESITE          = 5,\n\tE_META_STONE_POLISHED_ANDESITE = 6,\n\n\t// E_BLOCK_STONE_SLAB metas:\n\tE_META_STONE_SLAB_STONE        = 0,\n\tE_META_STONE_SLAB_SANDSTONE    = 1,\n\tE_META_STONE_SLAB_PLANKS       = 2,\n\tE_META_STONE_SLAB_COBBLESTONE  = 3,\n\tE_META_STONE_SLAB_BRICK        = 4,\n\tE_META_STONE_SLAB_STONE_BRICK  = 5,\n\tE_META_STONE_SLAB_NETHER_BRICK = 6,\n\tE_META_STONE_SLAB_QUARTZ       = 7,\n\n\t// E_BLOCK_STONE_BRICKS metas:\n\tE_META_STONE_BRICK_NORMAL   = 0,\n\tE_META_STONE_BRICK_MOSSY    = 1,\n\tE_META_STONE_BRICK_CRACKED  = 2,\n\tE_META_STONE_BRICK_ORNAMENT = 3,\n\n\t// E_BLOCK_TALL_GRASS metas:\n\tE_META_TALL_GRASS_DEAD_SHRUB = 0,\n\tE_META_TALL_GRASS_GRASS      = 1,\n\tE_META_TALL_GRASS_FERN       = 2,\n\tE_META_TALL_GRASS_BIOME      = 3,\n\n\t// E_BLOCK_TORCH, E_BLOCK_REDSTONE_TORCH_OFF, E_BLOCK_REDSTONE_TORCH_ON metas:\n\tE_META_TORCH_EAST  = 1,  // east face of the block, pointing east\n\tE_META_TORCH_WEST  = 2,\n\tE_META_TORCH_SOUTH = 3,\n\tE_META_TORCH_NORTH = 4,\n\tE_META_TORCH_FLOOR = 5,\n\tE_META_TORCH_XM    = 1,  // Torch attached to the XM side of its block\n\tE_META_TORCH_XP    = 2,  // Torch attached to the XP side of its block\n\tE_META_TORCH_ZM    = 3,  // Torch attached to the ZM side of its block\n\tE_META_TORCH_ZP    = 4,  // Torch attached to the ZP side of its block\n\n\t// E_META_LOG metas:\n\tE_META_LOG_OAK_UP_DOWN      = 0,\n\tE_META_LOG_SPRUCE_UP_DOWN   = 1,\n\tE_META_LOG_BIRCH_UP_DOWN    = 2,\n\tE_META_LOG_JUNGLE_UP_DOWN   = 3,\n\tE_META_LOG_OAK_X            = 4,\n\tE_META_LOG_SPRUCE_X         = 5,\n\tE_META_LOG_BIRCH_X          = 6,\n\tE_META_LOG_JUNGLE_X         = 7,\n\tE_META_LOG_OAK_Z            = 8,\n\tE_META_LOG_SPRUCE_Z         = 9,\n\tE_META_LOG_BIRCH_Z          = 10,\n\tE_META_LOG_JUNGLE_Z         = 11,\n\tE_META_LOG_OAK_BARK_ONLY    = 12,\n\tE_META_LOG_SPRUCE_BARK_ONLY = 13,\n\tE_META_LOG_BIRCH_BARK_ONLY  = 14,\n\tE_META_LOG_JUNGLE_BARK_ONLY = 15,\n\n\t// E_META_LOG metas cont. (Block ID 162):\n\tE_META_NEWLOG_ACACIA_UP_DOWN     = 0,\n\tE_META_NEWLOG_DARK_OAK_UP_DOWN   = 1,\n\tE_META_NEWLOG_ACACIA_X           = 4,\n\tE_META_NEWLOG_DARK_OAK_X         = 5,\n\tE_META_NEWLOG_ACACIA_Z           = 8,\n\tE_META_NEWLOG_DARK_OAK_Z         = 9,\n\tE_META_NEWLOG_ACACIA_BARK_ONLY   = 12,\n\tE_META_NEWLOG_DARK_OAK_BARK_ONLY = 13,\n\n\t// E_BLOCK_WOODEN_DOUBLE_SLAB metas:\n\tE_META_WOODEN_DOUBLE_SLAB_OAK      = 0,\n\tE_META_WOODEN_DOUBLE_SLAB_SPRUCE   = 1,\n\tE_META_WOODEN_DOUBLE_SLAB_BIRCH    = 2,\n\tE_META_WOODEN_DOUBLE_SLAB_JUNGLE   = 3,\n\tE_META_WOODEN_DOUBLE_SLAB_ACACIA   = 4,\n\tE_META_WOODEN_DOUBLE_SLAB_DARK_OAK = 5,\n\n\t// E_BLOCK_WOODEN_SLAB metas:\n\tE_META_WOODEN_SLAB_OAK           = 0,\n\tE_META_WOODEN_SLAB_SPRUCE        = 1,\n\tE_META_WOODEN_SLAB_BIRCH         = 2,\n\tE_META_WOODEN_SLAB_JUNGLE        = 3,\n\tE_META_WOODEN_SLAB_ACACIA        = 4,\n\tE_META_WOODEN_SLAB_DARK_OAK      = 5,\n\tE_META_WOODEN_SLAB_UPSIDE_DOWN   = 8,\n\n\t// E_BLOCK_WOOL metas:\n\tE_META_WOOL_WHITE      = 0,\n\tE_META_WOOL_ORANGE     = 1,\n\tE_META_WOOL_MAGENTA    = 2,\n\tE_META_WOOL_LIGHTBLUE  = 3,\n\tE_META_WOOL_YELLOW     = 4,\n\tE_META_WOOL_LIGHTGREEN = 5,\n\tE_META_WOOL_PINK       = 6,\n\tE_META_WOOL_GRAY       = 7,\n\tE_META_WOOL_LIGHTGRAY  = 8,\n\tE_META_WOOL_CYAN       = 9,\n\tE_META_WOOL_PURPLE     = 10,\n\tE_META_WOOL_BLUE       = 11,\n\tE_META_WOOL_BROWN      = 12,\n\tE_META_WOOL_GREEN      = 13,\n\tE_META_WOOL_RED        = 14,\n\tE_META_WOOL_BLACK      = 15,\n};\n\n\n\n\n\nenum ENUM_ITEM_META : short\n{\n\t// Please keep this list alpha-sorted by the itemtype part\n\t// then number-sorted for the same item\n\n\t////////////////////////////////////////////////////////////////////////////////\n\t// Item metas:\n\n\t// E_ITEM_BANNER metas:\n\tE_META_BANNER_BLACK      = 0,\n\tE_META_BANNER_RED        = 1,\n\tE_META_BANNER_GREEN      = 2,\n\tE_META_BANNER_BROWN      = 3,\n\tE_META_BANNER_BLUE       = 4,\n\tE_META_BANNER_PURPLE     = 5,\n\tE_META_BANNER_CYAN       = 6,\n\tE_META_BANNER_LIGHTGRAY  = 7,\n\tE_META_BANNER_GRAY       = 8,\n\tE_META_BANNER_PINK       = 9,\n\tE_META_BANNER_LIGHTGREEN = 10,\n\tE_META_BANNER_YELLOW     = 11,\n\tE_META_BANNER_LIGHTBLUE  = 12,\n\tE_META_BANNER_MAGENTA    = 13,\n\tE_META_BANNER_ORANGE     = 14,\n\tE_META_BANNER_WHITE      = 15,\n\n\t// E_ITEM_COAL metas:\n\tE_META_COAL_NORMAL    = 0,\n\tE_META_COAL_CHARCOAL  = 1,\n\n\t// E_ITEM_DYE metas:\n\tE_META_DYE_BLACK      = 0,\n\tE_META_DYE_RED        = 1,\n\tE_META_DYE_GREEN      = 2,\n\tE_META_DYE_BROWN      = 3,\n\tE_META_DYE_BLUE       = 4,\n\tE_META_DYE_PURPLE     = 5,\n\tE_META_DYE_CYAN       = 6,\n\tE_META_DYE_LIGHTGRAY  = 7,\n\tE_META_DYE_GRAY       = 8,\n\tE_META_DYE_PINK       = 9,\n\tE_META_DYE_LIGHTGREEN = 10,\n\tE_META_DYE_YELLOW     = 11,\n\tE_META_DYE_LIGHTBLUE  = 12,\n\tE_META_DYE_MAGENTA    = 13,\n\tE_META_DYE_ORANGE     = 14,\n\tE_META_DYE_WHITE      = 15,\n\n\t// E_ITEM_GOLDEN_APPLE metas:\n\tE_META_GOLDEN_APPLE_NORMAL = 0,\n\tE_META_GOLDEN_APPLE_ENCHANTED = 1,\n\n\t// E_ITEM_HEAD metas:\n\tE_META_HEAD_SKELETON = 0,\n\tE_META_HEAD_WITHER   = 1,\n\tE_META_HEAD_ZOMBIE   = 2,\n\tE_META_HEAD_PLAYER   = 3,\n\tE_META_HEAD_CREEPER  = 4,\n\tE_META_HEAD_DRAGON   = 5,\n\n\t// E_ITEM_RAW_FISH metas:\n\tE_META_RAW_FISH_FISH       = 0,\n\tE_META_RAW_FISH_SALMON     = 1,\n\tE_META_RAW_FISH_CLOWNFISH  = 2,\n\tE_META_RAW_FISH_PUFFERFISH = 3,\n\n\t// E_ITEM_COOKED_FISH metas:\n\tE_META_COOKED_FISH_FISH       = 0,\n\tE_META_COOKED_FISH_SALMON     = 1,\n\n\t// E_ITEM_MINECART_TRACKS metas:\n\tE_META_TRACKS_X = 1,\n\tE_META_TRACKS_Z = 0,\n\n\t// E_ITEM_SPAWN_EGG metas:\n\t// See also cMonster::eType, since monster type and spawn egg meta are the same\n\tE_META_SPAWN_EGG_PICKUP           = 1,\n\tE_META_SPAWN_EGG_EXPERIENCE_ORB   = 2,\n\tE_META_SPAWN_EGG_WITHER_SKELETON  = 5,\n\tE_META_SPAWN_EGG_LEASH_KNOT       = 8,\n\tE_META_SPAWN_EGG_PAINTING         = 9,\n\tE_META_SPAWN_EGG_ARROW            = 10,\n\tE_META_SPAWN_EGG_SNOWBALL         = 11,\n\tE_META_SPAWN_EGG_FIREBALL         = 12,\n\tE_META_SPAWN_EGG_SMALL_FIREBALL   = 13,\n\tE_META_SPAWN_EGG_ENDER_PEARL      = 14,\n\tE_META_SPAWN_EGG_EYE_OF_ENDER     = 15,\n\tE_META_SPAWN_EGG_SPLASH_POTION    = 16,\n\tE_META_SPAWN_EGG_EXP_BOTTLE       = 17,\n\tE_META_SPAWN_EGG_ITEM_FRAME       = 18,\n\tE_META_SPAWN_EGG_WITHER_SKULL     = 19,\n\tE_META_SPAWN_EGG_PRIMED_TNT       = 20,\n\tE_META_SPAWN_EGG_FALLING_BLOCK    = 21,\n\tE_META_SPAWN_EGG_FIREWORK         = 22,\n\tE_META_SPAWN_EGG_ZOMBIE_VILLAGER  = 27,\n\tE_META_SPAWN_EGG_BOAT             = 41,\n\tE_META_SPAWN_EGG_MINECART         = 42,\n\tE_META_SPAWN_EGG_MINECART_CHEST   = 43,\n\tE_META_SPAWN_EGG_MINECART_FURNACE = 44,\n\tE_META_SPAWN_EGG_MINECART_TNT     = 45,\n\tE_META_SPAWN_EGG_MINECART_HOPPER  = 46,\n\tE_META_SPAWN_EGG_MINECART_SPAWNER = 47,\n\tE_META_SPAWN_EGG_CREEPER          = 50,\n\tE_META_SPAWN_EGG_SKELETON         = 51,\n\tE_META_SPAWN_EGG_SPIDER           = 52,\n\tE_META_SPAWN_EGG_GIANT            = 53,\n\tE_META_SPAWN_EGG_ZOMBIE           = 54,\n\tE_META_SPAWN_EGG_SLIME            = 55,\n\tE_META_SPAWN_EGG_GHAST            = 56,\n\tE_META_SPAWN_EGG_ZOMBIE_PIGMAN    = 57,\n\tE_META_SPAWN_EGG_ENDERMAN         = 58,\n\tE_META_SPAWN_EGG_CAVE_SPIDER      = 59,\n\tE_META_SPAWN_EGG_SILVERFISH       = 60,\n\tE_META_SPAWN_EGG_BLAZE            = 61,\n\tE_META_SPAWN_EGG_MAGMA_CUBE       = 62,\n\tE_META_SPAWN_EGG_ENDER_DRAGON     = 63,\n\tE_META_SPAWN_EGG_WITHER           = 64,\n\tE_META_SPAWN_EGG_BAT              = 65,\n\tE_META_SPAWN_EGG_WITCH            = 66,\n\tE_META_SPAWN_EGG_ENDERMITE        = 67,\n\tE_META_SPAWN_EGG_GUARDIAN         = 68,\n\tE_META_SPAWN_EGG_PIG              = 90,\n\tE_META_SPAWN_EGG_SHEEP            = 91,\n\tE_META_SPAWN_EGG_COW              = 92,\n\tE_META_SPAWN_EGG_CHICKEN          = 93,\n\tE_META_SPAWN_EGG_SQUID            = 94,\n\tE_META_SPAWN_EGG_WOLF             = 95,\n\tE_META_SPAWN_EGG_MOOSHROOM        = 96,\n\tE_META_SPAWN_EGG_SNOW_GOLEM       = 97,\n\tE_META_SPAWN_EGG_OCELOT           = 98,\n\tE_META_SPAWN_EGG_IRON_GOLEM       = 99,\n\tE_META_SPAWN_EGG_HORSE            = 100,\n\tE_META_SPAWN_EGG_RABBIT           = 101,\n\tE_META_SPAWN_EGG_VILLAGER         = 120,\n\tE_META_SPAWN_EGG_ENDER_CRYSTAL    = 200,\n} ;\n\n// tolua_end\n\n\n\n\n// fwd:\nclass cItem;\nclass cIniFile;\n\n\n\n\n\n// tolua_begin\n\n/** Translates a blocktype string into blocktype. Takes either a number or an items.ini alias as input. Returns -1 on failure. */\nextern int BlockStringToType(const AString & a_BlockTypeString);\n\n/** Translates an itemtype string into an item. Takes either a number, number^number, number:number or an items.ini alias as input. Returns true if successful. */\nextern bool StringToItem(const AString & a_ItemTypeString, cItem & a_Item);\n\n/** Translates a full item into a string. If the ItemType is not recognized, the ItemType number is output into the string. */\nextern AString ItemToString(const cItem & a_Item);\n\n/** Translates itemtype into a string. If the type is not recognized, the itemtype number is output into the string. */\nextern AString ItemTypeToString(short a_ItemType);\n\n/** Translates a full item into a fully-specified string (including meta and count). If the ItemType is not recognized, the ItemType number is output into the string. */\nextern AString ItemToFullString(const cItem & a_Item);\n\n/** Returns a cItem representing the item described in an IniFile's value; if the value doesn't exist, creates it with the provided default. */\nextern cItem GetIniItemSet(cIniFile & a_IniFile, const char * a_Section, const char * a_Key, const char * a_Default);\n\n// tolua_end\n"
  },
  {
    "path": "src/Blocks/BlockAir.h",
    "content": "\n#pragma once\n\n\n\n\n\nclass cBlockAirHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Don't drop anything:\n\t\treturn {};\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockAnvil.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n#include \"../Entities/Player.h\"\n#include \"../UI/AnvilWindow.h\"\n\n\n\n\n\nclass cBlockAnvilHandler final :\n\tpublic cYawRotator<cBlockHandler, 0x03, 0x03, 0x00, 0x01, 0x02>\n{\n\tusing Super = cYawRotator<cBlockHandler, 0x03, 0x03, 0x00, 0x01, 0x02>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(m_BlockType, 1, a_BlockMeta >> 2);\n\t}\n\n\n\n\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tcWindow * Window = new cAnvilWindow(a_BlockPos);\n\t\ta_Player.OpenWindow(*Window);\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable() const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 6;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockBed.cpp",
    "content": "\n// BlockBed.cpp\n\n#include \"Globals.h\"\n#include \"BlockBed.h\"\n\n#include \"BroadcastInterface.h\"\n#include \"../Entities/Player.h\"\n#include \"../World.h\"\n#include \"../BoundingBox.h\"\n#include \"../Mobs/Monster.h\"\n\n\n\n\n\nvoid cBlockBedHandler::OnBroken(\n\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\tconst Vector3i a_BlockPos,\n\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\tconst cEntity * a_Digger\n) const\n{\n\tUNUSED(a_Digger);\n\tauto Direction = MetaDataToDirection(a_OldBlockMeta & 0x03);\n\tif ((a_OldBlockMeta & 0x08) != 0)\n\t{\n\t\t// Was pillow\n\t\tVector3i FootPos(a_BlockPos - Direction);\n\t\tif (a_ChunkInterface.GetBlock(FootPos) == E_BLOCK_BED)\n\t\t{\n\t\t\t// First replace the bed with air\n\t\t\ta_ChunkInterface.FastSetBlock(FootPos, E_BLOCK_AIR, 0);\n\n\t\t\t// Then destroy the bed entity\n\t\t\ta_ChunkInterface.SetBlock(FootPos, E_BLOCK_AIR, 0);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Was foot end\n\t\tVector3i PillowPos(a_BlockPos + Direction);\n\t\tif (a_ChunkInterface.GetBlock(PillowPos) == E_BLOCK_BED)\n\t\t{\n\t\t\t// First replace the bed with air\n\t\t\ta_ChunkInterface.FastSetBlock(PillowPos, E_BLOCK_AIR, 0);\n\n\t\t\t// Then destroy the bed entity\n\t\t\ta_ChunkInterface.SetBlock(PillowPos, E_BLOCK_AIR, 0);\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cBlockBedHandler::OnUse(\n\tcChunkInterface & a_ChunkInterface,\n\tcWorldInterface & a_WorldInterface,\n\tcPlayer & a_Player,\n\tVector3i a_BlockPos,\n\teBlockFace a_BlockFace,\n\tconst Vector3i a_CursorPos\n) const\n{\n\t// Source: https://minecraft.wiki/w/Bed#Sleeping\n\n\t// Sleeping in bed only allowed in Overworld, beds explode elsewhere:\n\tif (a_WorldInterface.GetDimension() != dimOverworld)\n\t{\n\t\tauto PosCopy = a_BlockPos;\n\t\ta_WorldInterface.DoExplosionAt(5, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, true, esBed, &PosCopy);\n\t\treturn true;\n\t}\n\n\tauto Meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\n\tif ((Meta & 0x8) == 0)\n\t{\n\t\t// Clicked on the foot of the bed, adjust to the head:\n\t\ta_BlockPos += MetaDataToDirection(Meta & 0x03);\n\n\t\tBLOCKTYPE Type;\n\t\ta_ChunkInterface.GetBlockTypeMeta(a_BlockPos, Type, Meta);\n\t\tif (Type != E_BLOCK_BED)\n\t\t{\n\t\t\t// Bed was incomplete, bail:\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Set the bed position to the pillow block:\n\ta_Player.SetBedPos(a_BlockPos);\n\n\t// Sleeping is allowed only during night and thunderstorms:\n\tif (\n\t\t!(((a_WorldInterface.GetTimeOfDay() > 12541_tick) && (a_WorldInterface.GetTimeOfDay() < 23458_tick)) ||\n\t\t(a_Player.GetWorld()->GetWeather() == wThunderstorm))\n\t)\n\t{\n\t\ta_Player.SendAboveActionBarMessage(\"You can only sleep at night and during thunderstorms\");\n\t\treturn true;\n\t}\n\n\t// Check if the bed is occupied:\n\tif ((Meta & 0x04) == 0x04)\n\t{\n\t\ta_Player.SendAboveActionBarMessage(\"This bed is occupied\");\n\t\treturn true;\n\t}\n\n\t// Cannot sleep if there are hostile mobs nearby:\n\tif (\n\t\t!a_Player.GetWorld()->ForEachEntityInBox({ a_Player.GetPosition().addedY(-5), 8, 10 }, [](cEntity & a_Entity)\n\t\t{\n\t\t\treturn a_Entity.IsMob() && (static_cast<cMonster&>(a_Entity).GetMobFamily() == cMonster::mfHostile);\n\t\t})\n\t)\n\t{\n\t\ta_Player.SendAboveActionBarMessage(\"You may not rest now, there are monsters nearby\");\n\t\treturn true;\n\t}\n\n\t// This will broadcast \"use bed\" for the pillow block, if the player can sleep:\n\ta_Player.SetIsInBed(true);\n\n\t// Check sleeping was successful, if not, bail:\n\tif (!a_Player.IsInBed())\n\t{\n\t\treturn true;\n\t}\n\n\t// Occupy the bed, where 0x4 = occupied bit:\n\ta_ChunkInterface.SetBlockMeta(a_BlockPos, Meta | 0x04);\n\ta_Player.GetStatistics().Custom[CustomStatistic::SleepInBed]++;\n\n\t// When sleeping, the player's bounding box moves to approximately where his head is.\n\t// Set the player's position to somewhere close to the edge of the pillow block:\n\ta_Player.SetPosition(Vector3f(0.4f, 1, 0.4f) * MetaDataToDirection(Meta & 0x03) + Vector3f(0.5f, 0.6875, 0.5f) + a_BlockPos);\n\n\t// Fast-forward the time if all players in the world are in their beds:\n\tif (a_WorldInterface.ForEachPlayer([](cPlayer & a_OtherPlayer) { return !a_OtherPlayer.IsInBed(); }))\n\t{\n\t\ta_WorldInterface.ForEachPlayer([&a_ChunkInterface](cPlayer & a_OtherPlayer)\n\t\t{\n\t\t\tVacateBed(a_ChunkInterface, a_OtherPlayer);\n\t\t\treturn false;\n\t\t});\n\t\ta_WorldInterface.SetTimeOfDay(0_tick);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\ncItems cBlockBedHandler::ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const\n{\n\t// Drops handled by the block entity:\n\treturn {};\n}\n"
  },
  {
    "path": "src/Blocks/BlockBed.h",
    "content": "\n// BlockBed.h\n\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"ChunkInterface.h\"\n#include \"Entities/Player.h\"\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cEntity;\nclass cWorldInterface;\n\n\n\n\n\nclass cBlockBedHandler final :\n\tpublic cYawRotator<cBlockEntityHandler, 0x03, 0x02, 0x03, 0x00, 0x01>\n{\n\tusing Super = cYawRotator<cBlockEntityHandler, 0x03, 0x02, 0x03, 0x00, 0x01>;\n\npublic:\n\n\tusing Super::Super;\n\n\tstatic Vector3i MetaDataToDirection(NIBBLETYPE a_MetaData)\n\t{\n\t\tswitch (a_MetaData)\n\t\t{\n\t\t\tcase 0: return Vector3i(0, 0, 1);\n\t\t\tcase 1: return Vector3i(-1, 0, 0);\n\t\t\tcase 2: return Vector3i(0, 0, -1);\n\t\t\tcase 3: return Vector3i(1, 0, 0);\n\t\t}\n\t\treturn Vector3i();\n\t}\n\n\tstatic void VacateBed(cChunkInterface & a_ChunkInterface, cPlayer & a_Player)\n\t{\n\t\tauto BedPosition = a_Player.GetLastBedPos();\n\n\t\tBLOCKTYPE Type;\n\t\tNIBBLETYPE Meta;\n\t\ta_ChunkInterface.GetBlockTypeMeta(BedPosition, Type, Meta);\n\n\t\tif (Type != E_BLOCK_BED)\n\t\t{\n\t\t\t// Bed was incomplete, just wake:\n\t\t\ta_Player.SetIsInBed(false);\n\t\t\treturn;\n\t\t}\n\n\t\tif ((Meta & 0x8) == 0)\n\t\t{\n\t\t\t// BedPosition is the foot of the bed, adjust to the head:\n\t\t\tBedPosition += MetaDataToDirection(Meta & 0x03);\n\n\t\t\ta_ChunkInterface.GetBlockTypeMeta(BedPosition, Type, Meta);\n\t\t\tif (Type != E_BLOCK_BED)\n\t\t\t{\n\t\t\t\t// Bed was incomplete, just wake:\n\t\t\t\ta_Player.SetIsInBed(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Clear the \"occupied\" bit of the bed's pillow block:\n\t\ta_ChunkInterface.SetBlockMeta(BedPosition, Meta & 0x0b);\n\n\t\t// Wake the player:\n\t\ta_Player.SetIsInBed(false);\n\t}\n\nprivate:\n\n\t// Overrides:\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tconst Vector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override;\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer & a_Player,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override;\n\n\tvirtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, const cItem * a_Tool) const override;\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 28;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockBigFlower.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"ChunkInterface.h\"\n#include \"../BlockInfo.h\"\n#include \"../Items/ItemHandler.h\"\n\n\n\n\nclass cBlockBigFlowerHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override\n\t{\n\t\tif (IsMetaTopPart(a_Meta))\n\t\t{\n\t\t\tBLOCKTYPE BottomType;\n\t\t\tconst auto BottomPosition = a_Position.addedY(-1);\n\t\t\tif (\n\t\t\t\t!cChunkDef::IsValidHeight(BottomPosition) ||\n\t\t\t\t!a_World.GetBlockTypeMeta(BottomPosition, BottomType, a_Meta) ||\n\t\t\t\t(BottomType != E_BLOCK_BIG_FLOWER)\n\t\t\t)\n\t\t\t{\n\t\t\t\t// Can't find the flower meta so assume grass\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tNIBBLETYPE FlowerMeta = a_Meta & 0x07;\n\t\treturn (\n\t\t\t(FlowerMeta == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS) ||\n\t\t\t(FlowerMeta == E_META_BIG_FLOWER_LARGE_FERN)\n\t\t);\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tif (IsMetaTopPart(a_BlockMeta))\n\t\t{\n\t\t\treturn {};\n\t\t}\n\n\t\t// With shears, drop self (even tall grass and fern):\n\t\tif ((a_Tool != nullptr) && (a_Tool->m_ItemType == E_ITEM_SHEARS))\n\t\t{\n\t\t\t// Bit 0x08 specifies whether this is a top part or bottom; cut it off from the pickup:\n\t\t\treturn cItem(m_BlockType, 1, a_BlockMeta & 0x07);\n\t\t}\n\n\t\t// Tall grass drops seeds, large fern drops nothing, others drop self:\n\t\tauto flowerType = a_BlockMeta & 0x07;\n\t\tif (flowerType == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS)\n\t\t{\n\n\t\t\t// Drop seeds, depending on bernoulli trial result:\n\t\t\tif (GetRandomProvider().RandBool(0.875))\n\t\t\t{\n\t\t\t\t// 87.5% chance of dropping nothing:\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\t// 12.5% chance of dropping some seeds.\n\t\t\tconst auto DropNum = FortuneDiscreteRandom(1, 1, 2 * ToolFortuneLevel(a_Tool));\n\t\t\treturn cItem(E_ITEM_SEEDS, DropNum);\n\t\t}\n\t\telse if (flowerType != E_META_BIG_FLOWER_LARGE_FERN)\n\t\t{\n\t\t\treturn cItem(m_BlockType, 1, static_cast<short>(flowerType));\n\t\t}\n\n\t\treturn {};\n\t}\n\n\n\n\n\n\tstatic bool IsMetaTopPart(NIBBLETYPE a_Meta)\n\t{\n\t\treturn ((a_Meta & 0x08) != 0);\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\t// CanBeAt is also called on placement, so the top part can't check for the bottom part.\n\t\t// Both parts can only that they're rooted in grass.\n\n\t\tconst auto RootPosition = a_Position.addedY(IsMetaTopPart(a_Meta) ? -2 : -1);\n\t\treturn cChunkDef::IsValidHeight(RootPosition) && IsBlockTypeOfDirt(a_Chunk.GetBlock(RootPosition));\n\t}\n\n\n\n\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tconst Vector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override\n\t{\n\t\tif (IsMetaTopPart(a_OldBlockMeta))\n\t\t{\n\t\t\tconst auto LowerPart = a_BlockPos.addedY(-1);\n\t\t\tif (a_ChunkInterface.GetBlock(LowerPart) == a_OldBlockType)\n\t\t\t{\n\t\t\t\t// Prevent creative punches from dropping pickups.\n\t\t\t\t// TODO: Simplify to SetBlock and remove the IsMetaTopPart check in DropBlockAsPickups when 1.13 blockstates arrive.\n\t\t\t\tif ((a_Digger != nullptr) && a_Digger->IsPlayer() && static_cast<const cPlayer *>(a_Digger)->IsGameModeCreative())\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.SetBlock(LowerPart, E_BLOCK_AIR, 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.DropBlockAsPickups(LowerPart);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst auto UpperPart = a_BlockPos.addedY(1);\n\t\t\tif (a_ChunkInterface.GetBlock(UpperPart) == a_OldBlockType)\n\t\t\t{\n\t\t\t\ta_ChunkInterface.SetBlock(UpperPart, E_BLOCK_AIR, 0);\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockBookShelf.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\nclass cBlockBookShelfHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(m_BlockType, 1);\n\t\t}\n\t\treturn cItem(E_ITEM_BOOK, 3);\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockBrewingStand.h",
    "content": "\n#pragma once\n\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cBlockBrewingStandHandler final :\n\tpublic cBlockEntityHandler\n{\n\tusing Super = cBlockEntityHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_BREWING_STAND);  // We have to drop the item form of a brewing stand\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 6;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockButton.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n#include \"BlockSlab.h\"\n#include \"BlockStairs.h\"\n#include \"../BlockInfo.h\"\n#include \"../Chunk.h\"\n#include \"Defines.h\"\n#include \"Entities/Player.h\"\n#include \"Mixins/Mixins.h\"\n#include \"ChunkInterface.h\"\n#include \"World.h\"\n\n\n\n\nclass cBlockButtonHandler final :\n\tpublic cClearMetaOnDrop<cMetaRotator<cBlockHandler, 0x07, 0x04, 0x01, 0x03, 0x02, true>>\n{\n\tusing Super = cClearMetaOnDrop<cMetaRotator<cBlockHandler, 0x07, 0x04, 0x01, 0x03, 0x02, true>>;\n\npublic:\n\n\tusing Super::Super;\n\n\t/** Extracts the ON bit from metadata and returns if true if it is set */\n\tstatic bool IsButtonOn(NIBBLETYPE a_Meta)\n\t{\n\t\treturn (a_Meta & 0x08) == 0x08;\n\t}\n\n\t/** Event handler for an arrow striking a block.\n\tPerforms appropriate handling if the arrow intersected a wooden button. */\n\tstatic void OnArrowHit(cWorld & a_World, const Vector3i a_Position, const eBlockFace a_HitFace)\n\t{\n\t\tBLOCKTYPE Type;\n\t\tNIBBLETYPE Meta;\n\t\tconst auto Pos = AddFaceDirection(a_Position, a_HitFace);\n\n\t\tif (\n\t\t\t!a_World.GetBlockTypeMeta(Pos, Type, Meta) ||\n\t\t\tIsButtonOn(Meta) ||\n\t\t\t!IsButtonPressedByArrow(a_World, Pos, Type, Meta)\n\t\t)\n\t\t{\n\t\t\t// Bail if we're not specifically a wooden button, or it's already on\n\t\t\t// or if the arrow didn't intersect. It is very important that nothing is\n\t\t\t// done if the button is depressed, since the release task will already be queued\n\t\t\treturn;\n\t\t}\n\n\t\ta_World.SetBlockMeta(Pos, Meta | 0x08);\n\t\ta_World.WakeUpSimulators(Pos);\n\n\t\t// sound name is ok to be wood, because only wood gets triggered by arrow\n\t\ta_World.GetBroadcastManager().BroadcastSoundEffect(\"block.wood_button.click_on\", Pos, 0.5f, 0.6f);\n\n\t\t// Queue a button reset\n\t\tQueueButtonRelease(a_World, Pos, Type);\n\t}\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tNIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\n\t\t// If button is already on, do nothing:\n\t\tif (IsButtonOn(Meta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Set the ON bit to on\n\t\tMeta |= 0x08;\n\n\t\tconst auto SoundToPlay = (m_BlockType == E_BLOCK_STONE_BUTTON) ? \"block.stone_button.click_on\" : \"block.wood_button.click_on\";\n\n\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, Meta);\n\t\ta_WorldInterface.WakeUpSimulators(a_BlockPos);\n\t\ta_WorldInterface.GetBroadcastManager().BroadcastSoundEffect(SoundToPlay, a_BlockPos, 0.5f, 0.6f, a_Player.GetClientHandle());\n\n\t\t// Queue a button reset (unpress)\n\t\tQueueButtonRelease(*a_Player.GetWorld(), a_BlockPos, m_BlockType);\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Converts the block meta of this button into a block face of the neighbor to which the button is attached. */\n\tinline static eBlockFace BlockMetaDataToBlockFace(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & 0x7)\n\t\t{\n\t\t\tcase 0x0: return BLOCK_FACE_YM;\n\t\t\tcase 0x1: return BLOCK_FACE_XP;\n\t\t\tcase 0x2: return BLOCK_FACE_XM;\n\t\t\tcase 0x3: return BLOCK_FACE_ZP;\n\t\t\tcase 0x4: return BLOCK_FACE_ZM;\n\t\t\tcase 0x5: return BLOCK_FACE_YP;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled block meta!\");\n\t\t\t\treturn BLOCK_FACE_NONE;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tauto SupportRelPos = AddFaceDirection(a_Position, BlockMetaDataToBlockFace(a_Meta), true);\n\t\tif (!cChunkDef::IsValidHeight(SupportRelPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tBLOCKTYPE SupportBlockType;\n\t\tNIBBLETYPE SupportBlockMeta;\n\t\ta_Chunk.UnboundedRelGetBlock(SupportRelPos, SupportBlockType, SupportBlockMeta);\n\t\teBlockFace Face = BlockMetaDataToBlockFace(a_Meta);\n\n\t\t// upside down slabs\n\t\tif (cBlockSlabHandler::IsAnySlabType(SupportBlockType))\n\t\t{\n\t\t\treturn (Face == BLOCK_FACE_YP) && (SupportBlockMeta & E_META_WOODEN_SLAB_UPSIDE_DOWN);\n\t\t}\n\n\t\t// stairs (top and sides)\n\t\tif (cBlockStairsHandler::IsAnyStairType(SupportBlockType))\n\t\t{\n\t\t\tswitch (Face)\n\t\t\t{\n\t\t\t\tcase eBlockFace::BLOCK_FACE_YP:\n\t\t\t\t\treturn (SupportBlockMeta & E_BLOCK_STAIRS_UPSIDE_DOWN);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_XP:\n\t\t\t\t\treturn ((SupportBlockMeta & 0b11) == E_BLOCK_STAIRS_XP);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_XM:\n\t\t\t\t\treturn ((SupportBlockMeta & 0b11) == E_BLOCK_STAIRS_XM);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_ZP:\n\t\t\t\t\treturn ((SupportBlockMeta & 0b11) == E_BLOCK_STAIRS_ZP);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_ZM:\n\t\t\t\t\treturn ((SupportBlockMeta & 0b11) == E_BLOCK_STAIRS_ZM);\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn cBlockInfo::FullyOccupiesVoxel(SupportBlockType);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n\n\t/** Schedules a recurring event at appropriate intervals to release a button at a given position.\n\tThe given block type is checked when the task is executed to ensure the position still contains a button. */\n\tstatic void QueueButtonRelease(cWorld & a_ButtonWorld, const Vector3i a_Position, const BLOCKTYPE a_BlockType)\n\t{\n\t\tconst auto TickDelay = (a_BlockType == E_BLOCK_STONE_BUTTON) ? 20_tick : 30_tick;\n\t\ta_ButtonWorld.ScheduleTask(\n\t\t\tTickDelay,\n\t\t\t[a_Position, a_BlockType](cWorld & a_World)\n\t\t\t{\n\t\t\t\tBLOCKTYPE Type;\n\t\t\t\tNIBBLETYPE Meta;\n\n\t\t\t\tif (\n\t\t\t\t\t!a_World.GetBlockTypeMeta(a_Position, Type, Meta) ||\n\t\t\t\t\t(Type != a_BlockType) || !IsButtonOn(Meta)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t// Total failure or block changed, bail\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (IsButtonPressedByArrow(a_World, a_Position, Type, Meta))\n\t\t\t\t{\n\t\t\t\t\t// Try again in a little while\n\t\t\t\t\tQueueButtonRelease(a_World, a_Position, a_BlockType);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Block hasn't change in the meantime; release it\n\t\t\t\tconst auto SoundToPlayOnRelease = (Type == E_BLOCK_STONE_BUTTON) ? \"block.stone_button.click_off\" : \"block.wood_button.click_off\";\n\n\t\t\t\ta_World.SetBlockMeta(a_Position, Meta & 0x07);\n\t\t\t\ta_World.WakeUpSimulators(a_Position);\n\t\t\t\ta_World.BroadcastSoundEffect(SoundToPlayOnRelease, a_Position, 0.5f, 0.5f);\n\t\t\t}\n\t\t);\n\t}\n\n\t/** Returns true if an arrow was found in the wooden button */\n\tstatic bool IsButtonPressedByArrow(cWorld & a_World, const Vector3i a_ButtonPosition, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_Meta)\n\t{\n\t\tif (a_BlockType != E_BLOCK_WOODEN_BUTTON)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto FaceOffset = GetButtonOffsetOnBlock(a_Meta);\n\t\tconst bool FoundArrow = !a_World.ForEachEntityInBox(\n\t\t\tcBoundingBox(FaceOffset + a_ButtonPosition, 0.2, 0.2),\n\t\t\t[](cEntity & a_Entity)\n\t\t\t{\n\t\t\t\treturn a_Entity.IsArrow();\n\t\t\t}\n\t\t);\n\n\t\treturn FoundArrow;\n\t}\n\n\t/** Returns an offset to the integer world coordinates of a button.\n\tApplying this offset yields the centre of the button's bounding box,\n\tin terms of the position within the block the button with given meta occupies.\n\n\tTODO: this is only approximate, return the exact bbox instead. */\n\tstatic Vector3d GetButtonOffsetOnBlock(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (BlockMetaDataToBlockFace(a_Meta))\n\t\t{\n\t\t\tcase BLOCK_FACE_YM: return { 0.5, 1, 0.5 };\n\t\t\tcase BLOCK_FACE_XP: return { 0, 0.5, 0.5 };\n\t\t\tcase BLOCK_FACE_XM: return { 1, 0.5, 0.5 };\n\t\t\tcase BLOCK_FACE_ZP: return { 0.5, 0.5, 0 };\n\t\t\tcase BLOCK_FACE_ZM: return { 0.5, 0.5, 1 };\n\t\t\tcase BLOCK_FACE_YP: return { 0.5, 0, 0.5 };\n\t\t\tcase BLOCK_FACE_NONE:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tUNREACHABLE(\"Unhandled block face!\");\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockCactus.h",
    "content": "#pragma once\n\n#include \"BlockPlant.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\nclass cBlockCactusHandler final :\n\tpublic cClearMetaOnDrop<cBlockPlant<false>>\n{\n\tusing Super = cClearMetaOnDrop<cBlockPlant<false>>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto SurfacePosition = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(SurfacePosition))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tBLOCKTYPE Surface = a_Chunk.GetBlock(SurfacePosition);\n\t\tif ((Surface != E_BLOCK_SAND) && (Surface != E_BLOCK_CACTUS))\n\t\t{\n\t\t\t// Cactus can only be placed on sand and itself\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check surroundings. Cacti may ONLY be surrounded by non-solid blocks\n\t\tstatic const Vector3i Coords[] =\n\t\t{\n\t\t\t{-1, 0,  0},\n\t\t\t{ 1, 0,  0},\n\t\t\t{ 0, 0, -1},\n\t\t\t{ 0, 0,  1},\n\t\t};\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(Coords); i++)\n\t\t{\n\t\t\tBLOCKTYPE BlockType;\n\t\t\tNIBBLETYPE BlockMeta;\n\t\t\tif (\n\t\t\t\ta_Chunk.UnboundedRelGetBlock(a_Position + Coords[i], BlockType, BlockMeta) &&\n\t\t\t\t(\n\t\t\t\t\tcBlockInfo::IsSolid(BlockType) ||\n\t\t\t\t\t(BlockType == E_BLOCK_LAVA) ||\n\t\t\t\t\t(BlockType == E_BLOCK_STATIONARY_LAVA)\n\t\t\t\t)\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}  // for i - Coords[]\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n\n\n\n\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const override\n\t{\n\t\t// Check the total height of the cacti blocks here:\n\t\tauto Top = a_RelPos.addedY(1);\n\t\twhile (\n\t\t\tcChunkDef::IsValidHeight(Top) &&\n\t\t\t(a_Chunk.GetBlock(Top) == E_BLOCK_CACTUS)\n\t\t)\n\t\t{\n\t\t\tTop.y++;\n\t\t}\n\t\tauto Bottom = a_RelPos.addedY(-1);\n\t\twhile (\n\t\t\tcChunkDef::IsValidHeight(Bottom) &&\n\t\t\t(a_Chunk.GetBlock(Bottom) == E_BLOCK_CACTUS)\n\t\t)\n\t\t{\n\t\t\t--Bottom.y;\n\t\t}\n\n\t\t// Refuse if already too high:\n\t\tauto numToGrow = std::min(a_NumStages, a_Chunk.GetWorld()->GetMaxCactusHeight() + 1 - (Top.y - Bottom.y));\n\t\tif (numToGrow <= 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\tBLOCKTYPE blockType;\n\t\tfor (int i = 0; i < numToGrow; ++i)\n\t\t{\n\t\t\tauto NewTop = Top.addedY(i);\n\t\t\tif (!a_Chunk.UnboundedRelGetBlockType(NewTop, blockType) || (blockType != E_BLOCK_AIR))\n\t\t\t{\n\t\t\t\t// Cannot grow there\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\ta_Chunk.UnboundedRelFastSetBlock(NewTop, E_BLOCK_CACTUS, 0);\n\n\t\t\t// Check surroundings. Cacti may ONLY be surrounded by non-solid blocks; if they aren't, drop as pickup and bail out the growing\n\t\t\tstatic const Vector3i neighborOffsets[] =\n\t\t\t{\n\t\t\t\t{-1, 0,  0},\n\t\t\t\t{ 1, 0,  0},\n\t\t\t\t{ 0, 0, -1},\n\t\t\t\t{ 0, 0,  1},\n\t\t\t} ;\n\t\t\tfor (const auto & ofs: neighborOffsets)\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\ta_Chunk.UnboundedRelGetBlockType(NewTop + ofs, blockType) &&\n\t\t\t\t\t(\n\t\t\t\t\t\tcBlockInfo::IsSolid(blockType) ||\n\t\t\t\t\t\t(blockType == E_BLOCK_LAVA) ||\n\t\t\t\t\t\t(blockType == E_BLOCK_STATIONARY_LAVA)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t// Remove the cactus\n\t\t\t\t\tauto absPos = a_Chunk.RelativeToAbsolute(NewTop);\n\t\t\t\t\ta_Chunk.GetWorld()->DropBlockAsPickups(absPos);\n\t\t\t\t\treturn i + 1;\n\t\t\t\t}\n\t\t\t}  // for neighbor\n\t\t}  // for i - numToGrow\n\t\treturn numToGrow;\n\t}\n\n\tvirtual PlantAction CanGrow(cChunk & a_Chunk, Vector3i a_RelPos) const override\n\t{\n\t\t// Only allow growing if there's an air block above:\n\t\tconst auto RelPosAbove = a_RelPos.addedY(1);\n\t\tif (cChunkDef::IsValidHeight(RelPosAbove) && (a_Chunk.GetBlock(RelPosAbove) == E_BLOCK_AIR))\n\t\t{\n\t\t\treturn Super::CanGrow(a_Chunk, a_RelPos);\n\t\t}\n\t\treturn paStay;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockCake.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockCakeHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tNIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\n\t\tif (!a_Player.Feed(2, 0.4))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\ta_Player.GetStatistics().Custom[CustomStatistic::EatCakeSlice]++;\n\t\tif (Meta >= 5)\n\t\t{\n\t\t\ta_ChunkInterface.DigBlock(a_WorldInterface, a_BlockPos, &a_Player);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, Meta + 1);\n\t\t}\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Give nothing\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 14;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockCarpet.h",
    "content": "\n// BlockCarpet.h\n\n// Declares the cBlockCarpetHandler class representing the handler for the carpet block\n\n\n\n\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockCarpetHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto PosBelow = a_Position.addedY(-1);\n\t\treturn cChunkDef::IsValidHeight(PosBelow) && (a_Chunk.GetBlock(PosBelow) != E_BLOCK_AIR);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase E_META_CARPET_WHITE: return 14;\n\t\t\tcase E_META_CARPET_ORANGE: return 15;\n\t\t\tcase E_META_CARPET_MAGENTA: return 16;\n\t\t\tcase E_META_CARPET_LIGHTBLUE: return 17;\n\t\t\tcase E_META_CARPET_YELLOW: return 18;\n\t\t\tcase E_META_CARPET_LIGHTGREEN: return 19;\n\t\t\tcase E_META_CARPET_PINK: return 20;\n\t\t\tcase E_META_CARPET_GRAY: return 21;\n\t\t\tcase E_META_CARPET_LIGHTGRAY: return 22;\n\t\t\tcase E_META_CARPET_CYAN: return 23;\n\t\t\tcase E_META_CARPET_PURPLE: return 24;\n\t\t\tcase E_META_CARPET_BLUE: return 25;\n\t\t\tcase E_META_CARPET_BROWN: return 26;\n\t\t\tcase E_META_CARPET_GREEN: return 27;\n\t\t\tcase E_META_CARPET_RED: return 28;\n\t\t\tcase E_META_CARPET_BLACK: return 29;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled meta in carpet handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockCauldron.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../Entities/Player.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\nclass cBlockCauldronHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_CAULDRON, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tNIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\t\tauto EquippedItem = a_Player.GetEquippedItem();\n\n\t\tswitch (EquippedItem.m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_BUCKET:\n\t\t\t{\n\t\t\t\tif (Meta == 3)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, 0);\n\t\t\t\t\t// Give new bucket, filled with fluid when the gamemode is not creative:\n\t\t\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_WATER_BUCKET));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_ITEM_WATER_BUCKET:\n\t\t\t{\n\t\t\t\tif (Meta < 3)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, 3);\n\t\t\t\t\t// Give empty bucket back when the gamemode is not creative:\n\t\t\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_BUCKET));\n\t\t\t\t\t}\n\t\t\t\t\ta_Player.GetStatistics().Custom[CustomStatistic::FillCauldron]++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_ITEM_GLASS_BOTTLE:\n\t\t\t{\n\t\t\t\tif (Meta > 0)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, --Meta);\n\t\t\t\t\t// Give new potion when the gamemode is not creative:\n\t\t\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_POTION));\n\t\t\t\t\t}\n\t\t\t\t\ta_Player.GetStatistics().Custom[CustomStatistic::UseCauldron]++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_ITEM_POTION:\n\t\t\t{\n\t\t\t\t// Refill cauldron with water bottles.\n\t\t\t\tif ((Meta < 3) && (EquippedItem.m_ItemDamage == 0))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.SetBlockMeta(Vector3i(a_BlockPos), ++Meta);\n\t\t\t\t\t// Give back an empty bottle when the gamemode is not creative:\n\t\t\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_GLASS_BOTTLE));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_ITEM_LEATHER_BOOTS:\n\t\t\tcase E_ITEM_LEATHER_CAP:\n\t\t\tcase E_ITEM_LEATHER_PANTS:\n\t\t\tcase E_ITEM_LEATHER_TUNIC:\n\t\t\t{\n\t\t\t\t// Resets any color to default:\n\t\t\t\tif ((Meta > 0) && ((EquippedItem.m_ItemColor.GetRed() != 255) || (EquippedItem.m_ItemColor.GetBlue() != 255) || (EquippedItem.m_ItemColor.GetGreen() != 255)))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, --Meta);\n\t\t\t\t\tauto NewItem = cItem(EquippedItem);\n\t\t\t\t\tNewItem.m_ItemColor.Clear();\n\t\t\t\t\ta_Player.ReplaceOneEquippedItemTossRest(NewItem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_BLACK_SHULKER_BOX:\n\t\t\tcase E_BLOCK_BLUE_SHULKER_BOX:\n\t\t\tcase E_BLOCK_BROWN_SHULKER_BOX:\n\t\t\tcase E_BLOCK_CYAN_SHULKER_BOX:\n\t\t\tcase E_BLOCK_GRAY_SHULKER_BOX:\n\t\t\tcase E_BLOCK_GREEN_SHULKER_BOX:\n\t\t\tcase E_BLOCK_LIGHT_BLUE_SHULKER_BOX:\n\t\t\tcase E_BLOCK_LIGHT_GRAY_SHULKER_BOX:\n\t\t\tcase E_BLOCK_LIME_SHULKER_BOX:\n\t\t\tcase E_BLOCK_MAGENTA_SHULKER_BOX:\n\t\t\tcase E_BLOCK_ORANGE_SHULKER_BOX:\n\t\t\tcase E_BLOCK_PINK_SHULKER_BOX:\n\t\t\tcase E_BLOCK_RED_SHULKER_BOX:\n\t\t\tcase E_BLOCK_YELLOW_SHULKER_BOX:\n\t\t\t{\n\t\t\t\t// Resets shulker box color.\n\n\t\t\t\t// TODO: When there is an actual default shulker box add the appropriate changes here! - 19.09.2020 - 12xx12\n\t\t\t\tif (Meta == 0)\n\t\t\t\t{\n\t\t\t\t\t// The cauldron is empty:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Proceed with normal cleaning:\n\t\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, --Meta);\n\t\t\t\tauto NewShulker = cItem(EquippedItem);\n\t\t\t\tNewShulker.m_ItemType = E_BLOCK_PURPLE_SHULKER_BOX;\n\t\t\t\ta_Player.ReplaceOneEquippedItemTossRest(NewShulker);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!EquippedItem.GetHandler().IsPlaceable())\n\t\t{\n\t\t\t// Item not placeable in the first place, our work is done:\n\t\t\treturn true;\n\t\t}\n\n\t\t// This is a workaround for versions < 1.13, where rclking a cauldron with a block, places a block.\n\t\t// Using cauldrons with blocks was added in 1.13 as part of shulker cleaning.\n\t\tconst auto ResendPosition = AddFaceDirection(a_BlockPos, a_BlockFace);\n\t\ta_Player.GetClientHandle()->SendBlockChange(\n\t\t\tResendPosition,\n\t\t\ta_ChunkInterface.GetBlock(ResendPosition),\n\t\t\ta_ChunkInterface.GetBlockMeta(ResendPosition)\n\t\t);\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable() const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tauto WorldPos = a_Chunk.RelativeToAbsolute(a_RelPos);\n\n\t\tif (!a_WorldInterface.IsWeatherWetAtXYZ(WorldPos.addedY(1)))\n\t\t{\n\t\t\t// It's not raining at our current location or we do not have a direct view of the sky\n\t\t\treturn;\n\t\t}\n\n\t\tauto Meta = a_Chunk.GetMeta(a_RelPos);\n\t\tif (Meta < 3)\n\t\t{\n\t\t\ta_Chunk.SetMeta(a_RelPos, Meta + 1);\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 21;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockChest.h",
    "content": "\n#pragma once\n\n#include \"../BlockArea.h\"\n#include \"../Entities/Player.h\"\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cBlockChestHandler final :\n\tpublic cYawRotator<cClearMetaOnDrop<cBlockEntityHandler>, 0x07, 0x03, 0x04, 0x02, 0x05>\n{\n\tusing Super = cYawRotator<cClearMetaOnDrop<cBlockEntityHandler>, 0x07, 0x03, 0x04, 0x02, 0x05>;\n\npublic:\n\n\tusing Super::Super;\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 13;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockCloth.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockClothHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase E_META_WOOL_WHITE: return 14;\n\t\t\tcase E_META_WOOL_ORANGE: return 15;\n\t\t\tcase E_META_WOOL_MAGENTA: return 16;\n\t\t\tcase E_META_WOOL_LIGHTBLUE: return 17;\n\t\t\tcase E_META_WOOL_YELLOW: return 18;\n\t\t\tcase E_META_WOOL_LIGHTGREEN: return 19;\n\t\t\tcase E_META_WOOL_PINK: return 20;\n\t\t\tcase E_META_WOOL_GRAY: return 21;\n\t\t\tcase E_META_WOOL_LIGHTGRAY: return 22;\n\t\t\tcase E_META_WOOL_CYAN: return 23;\n\t\t\tcase E_META_WOOL_PURPLE: return 24;\n\t\t\tcase E_META_WOOL_BLUE: return 25;\n\t\t\tcase E_META_WOOL_BROWN: return 26;\n\t\t\tcase E_META_WOOL_GREEN: return 27;\n\t\t\tcase E_META_WOOL_RED: return 28;\n\t\t\tcase E_META_WOOL_BLACK: return 29;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled meta in wool handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockCobWeb.h",
    "content": "\n// BlockCobWeb.h\n\n// Declares the cBlockCobWebHandler object representing the BlockHandler for cobwebs\n\n#pragma once\n\n\n\n\n\nclass cBlockCobWebHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Silk touch gives cobweb, anything else gives just string:\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(m_BlockType, 1, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn cItem(E_ITEM_STRING, 1, 0);\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 3;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockCocoaPod.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../FastRandom.h\"\n\n\n\n\n\nclass cBlockCocoaPodHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\tstatic NIBBLETYPE BlockFaceToMeta(eBlockFace a_BlockFace)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_ZM: return 0;\n\t\t\tcase BLOCK_FACE_XM: return 3;\n\t\t\tcase BLOCK_FACE_XP: return 1;\n\t\t\tcase BLOCK_FACE_ZP: return 2;\n\t\t\tcase BLOCK_FACE_NONE:\n\t\t\tcase BLOCK_FACE_YM:\n\t\t\tcase BLOCK_FACE_YP:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tUNREACHABLE(\"Unsupported block face\");\n\t}\n\nprivate:\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Check that we're attached to a jungle log block:\n\t\teBlockFace BlockFace = MetaToBlockFace(a_Meta);\n\t\tauto LogPos = AddFaceDirection(a_Position, BlockFace, true);\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\tif (!a_Chunk.UnboundedRelGetBlock(LogPos, BlockType, BlockMeta))\n\t\t{\n\t\t\t// Don't pop if chunk not loaded.\n\t\t\treturn true;\n\t\t}\n\n\t\treturn ((BlockType == E_BLOCK_LOG) && ((BlockMeta & 0x03) == E_META_LOG_JUNGLE));\n\t}\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tif (GetRandomProvider().RandBool(0.20))\n\t\t{\n\t\t\tGrow(a_Chunk, a_RelPos);\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// If fully grown, give 3 items, otherwise just one:\n\t\tauto growState = a_BlockMeta >> 2;\n\t\treturn cItem(E_ITEM_DYE, ((growState >= 2) ? 3 : 1), E_META_DYE_BROWN);\n\t}\n\n\n\n\n\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const override\n\t{\n\t\tauto meta = a_Chunk.GetMeta(a_RelPos);\n\t\tauto typeMeta = meta & 0x03;\n\t\tauto growState = meta >> 2;\n\n\t\tif (growState >= 2)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tauto newState = std::min(growState + a_NumStages, 2);\n\t\ta_Chunk.SetMeta(a_RelPos, static_cast<NIBBLETYPE>(newState << 2 | typeMeta));\n\t\treturn newState - growState;\n\t}\n\n\n\n\n\n\tstatic eBlockFace MetaToBlockFace(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & 0x03)\n\t\t{\n\t\t\tcase 0: return BLOCK_FACE_ZM;\n\t\t\tcase 1: return BLOCK_FACE_XP;\n\t\t\tcase 2: return BLOCK_FACE_ZP;\n\t\t\tcase 3: return BLOCK_FACE_XM;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Bad meta\");\n\t\t\t\treturn BLOCK_FACE_NONE;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 34;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockCommandBlock.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n\n\n\n\n\nclass cBlockCommandBlockHandler final :\n\tpublic cBlockEntityHandler\n{\n\tusing Super = cBlockEntityHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Don't allow as a pickup:\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 10;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockComparator.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n#include \"Mixins/SolidSurfaceUnderneath.h\"\n\n\n\n\n\nclass cBlockComparatorHandler final :\n\tpublic cSolidSurfaceUnderneath<cYawRotator<cBlockHandler, 0x03, 0x00, 0x01, 0x02, 0x03>>\n{\n\tusing Super = cSolidSurfaceUnderneath<cYawRotator<cBlockHandler, 0x03, 0x00, 0x01, 0x02, 0x03>>;\n\npublic:\n\n\tusing Super::Super;\n\n\tinline static bool IsInSubtractionMode(NIBBLETYPE a_Meta)\n\t{\n\t\treturn ((a_Meta & 0x4) == 0x4);\n\t}\n\n\tinline static Vector3i GetFrontCoordinate(Vector3i a_Position, NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase 0x0: a_Position.z--; break;\n\t\t\tcase 0x1: a_Position.x++; break;\n\t\t\tcase 0x2: a_Position.z++; break;\n\t\t\tcase 0x3: a_Position.x--; break;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Unknown metadata: %d\", __FUNCTION__, a_Meta);\n\t\t\t\tASSERT(!\"Unknown metadata while determining orientation of comparator!\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn a_Position;\n\t}\n\n\tinline static Vector3i GetSideCoordinate(Vector3i a_Position, NIBBLETYPE a_Meta, bool a_bInverse)\n\t{\n\t\tif (!a_bInverse)\n\t\t{\n\t\t\tswitch (a_Meta)\n\t\t\t{\n\t\t\t\tcase 0x0: a_Position.x++; break;\n\t\t\t\tcase 0x1: a_Position.z--; break;\n\t\t\t\tcase 0x2: a_Position.x--; break;\n\t\t\t\tcase 0x3: a_Position.z++; break;\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tLOGWARNING(\"%s: Unknown metadata: %d\", __FUNCTION__, a_Meta);\n\t\t\t\t\tASSERT(!\"Unknown metadata while determining orientation of comparator!\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (a_Meta)\n\t\t\t{\n\t\t\t\tcase 0x0: a_Position.x--; break;\n\t\t\t\tcase 0x1: a_Position.z++; break;\n\t\t\t\tcase 0x2: a_Position.x++; break;\n\t\t\t\tcase 0x3: a_Position.z--; break;\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tLOGWARNING(\"%s: Unknown metadata: %d\", __FUNCTION__, a_Meta);\n\t\t\t\t\tASSERT(!\"Unknown metadata while determining orientation of comparator!\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn a_Position;\n\t}\n\n\tinline static Vector3i GetRearCoordinate(Vector3i a_Position, NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase 0x0: a_Position.z++; break;\n\t\t\tcase 0x1: a_Position.x--; break;\n\t\t\tcase 0x2: a_Position.z--; break;\n\t\t\tcase 0x3: a_Position.x++; break;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Unknown metadata: %d\", __FUNCTION__, a_Meta);\n\t\t\t\tASSERT(!\"Unknown metadata while determining orientation of comparator!\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn a_Position;\n\t}\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tconst auto Meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\n\t\t// Toggle the 3rd bit (addition / subtraction):\n\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, Meta ^ 0x04);\n\n\t\t// Update simulators:\n\t\ta_WorldInterface.WakeUpSimulators(a_BlockPos);\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const override\n\t{\n\t\tUNUSED(a_ChunkInterface);\n\t\tUNUSED(a_BlockFace);\n\n\t\ta_WorldInterface.WakeUpSimulators(a_BlockPos);\n\t\ta_WorldInterface.SendBlockTo(a_BlockPos, a_Player);\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_COMPARATOR, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 11;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockConcretePowder.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockConcretePowderHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual void OnPlaced(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta\n\t) const override\n\t{\n\t\tOnNeighborChanged(a_ChunkInterface, a_BlockPos, BLOCK_FACE_NONE);\n\t}\n\n\tvirtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const override\n\t{\n\t\ta_ChunkInterface.DoWithChunkAt(a_BlockPos, [&](cChunk & a_Chunk) { CheckSoaked(cChunkDef::AbsoluteToRelative(a_BlockPos), a_Chunk); return true; });\n\t}\n\n\t/** Check blocks above and around to see if they are water. If one is, converts this into concrete block. */\n\tstatic void CheckSoaked(Vector3i a_Rel, cChunk & a_Chunk)\n\t{\n\t\tconst auto & WaterCheck = cSimulator::AdjacentOffsets;\n\t\tconst bool ShouldSoak = std::any_of(WaterCheck.cbegin(), WaterCheck.cend(), [a_Rel, & a_Chunk](Vector3i a_Offset)\n\t\t{\n\t\t\tBLOCKTYPE NeighborType;\n\t\t\treturn (\n\t\t\t\ta_Chunk.UnboundedRelGetBlockType(a_Rel.x + a_Offset.x, a_Rel.y + a_Offset.y, a_Rel.z + a_Offset.z, NeighborType)\n\t\t\t\t&& IsBlockWater(NeighborType)\n\t\t\t);\n\t\t});\n\n\t\tif (ShouldSoak)\n\t\t{\n\t\t\tNIBBLETYPE BlockMeta;\n\t\t\tBlockMeta = a_Chunk.GetMeta(a_Rel.x, a_Rel.y, a_Rel.z);\n\t\t\ta_Chunk.SetBlock(a_Rel, E_BLOCK_CONCRETE, BlockMeta);\n\t\t}\n\t}\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase E_META_CONCRETE_POWDER_WHITE: return 8;\n\t\t\tcase E_META_CONCRETE_POWDER_ORANGE: return 15;\n\t\t\tcase E_META_CONCRETE_POWDER_MAGENTA: return 16;\n\t\t\tcase E_META_CONCRETE_POWDER_LIGHTBLUE: return 17;\n\t\t\tcase E_META_CONCRETE_POWDER_YELLOW: return 18;\n\t\t\tcase E_META_CONCRETE_POWDER_LIGHTGREEN: return 19;\n\t\t\tcase E_META_CONCRETE_POWDER_PINK: return 20;\n\t\t\tcase E_META_CONCRETE_POWDER_GRAY: return 21;\n\t\t\tcase E_META_CONCRETE_POWDER_LIGHTGRAY: return 22;\n\t\t\tcase E_META_CONCRETE_POWDER_CYAN: return 23;\n\t\t\tcase E_META_CONCRETE_POWDER_PURPLE: return 24;\n\t\t\tcase E_META_CONCRETE_POWDER_BLUE: return 25;\n\t\t\tcase E_META_CONCRETE_POWDER_BROWN: return 26;\n\t\t\tcase E_META_CONCRETE_POWDER_GREEN: return 27;\n\t\t\tcase E_META_CONCRETE_POWDER_RED: return 28;\n\t\t\tcase E_META_CONCRETE_POWDER_BLACK: return 29;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled meta in concrete powder handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockCrops.h",
    "content": "\n#pragma once\n\n#include \"BlockPlant.h\"\n#include \"../FastRandom.h\"\n\n\n\n\n\n/** Common class that takes care of beetroots, carrots, potatoes and wheat */\ntemplate <NIBBLETYPE RipeMeta>\nclass cBlockCropsHandler final :\n\tpublic cBlockPlant<true>\n{\n\tusing Super = cBlockPlant<true>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t/** Calculate the number of seeds to drop when the crop is broken. */\n\tstatic char CalculateSeedCount(char a_Min, char a_BaseRolls, unsigned char a_FortuneLevel)\n\t{\n\t\tstd::binomial_distribution<> Binomial(a_BaseRolls + a_FortuneLevel, 0.57);\n\t\treturn static_cast<char>(a_Min + Binomial(GetRandomProvider().Engine()));\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tauto & rand = GetRandomProvider();\n\n\t\t// If not fully grown, drop the \"seed\" of whatever is growing:\n\t\tif (a_BlockMeta < RipeMeta)\n\t\t{\n\t\t\tswitch (m_BlockType)\n\t\t\t{\n\t\t\t\tcase E_BLOCK_BEETROOTS: return cItem(E_ITEM_BEETROOT_SEEDS);\n\t\t\t\tcase E_BLOCK_CROPS:     return cItem(E_ITEM_SEEDS);\n\t\t\t\tcase E_BLOCK_CARROTS:   return cItem(E_ITEM_CARROT);\n\t\t\t\tcase E_BLOCK_POTATOES:  return cItem(E_ITEM_POTATO);\n\t\t\t}\n\n\t\t\tASSERT(!\"Unhandled block type\");\n\t\t\treturn {};\n\t\t}\n\n\t\t// Fully grown, drop the crop's produce:\n\t\tcItems Res;\n\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_BEETROOTS:\n\t\t\t{\n\t\t\t\tconst auto SeedCount = CalculateSeedCount(0, 3, ToolFortuneLevel(a_Tool));\n\t\t\t\tRes.Add(E_ITEM_BEETROOT_SEEDS, SeedCount);\n\t\t\t\tRes.Add(E_ITEM_BEETROOT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_CROPS:\n\t\t\t{\n\t\t\t\t// https://minecraft.wiki/w/Seeds_(Wheat)\n\t\t\t\tRes.Add(E_ITEM_WHEAT);\n\t\t\t\tconst auto SeedCount = CalculateSeedCount(1, 3, ToolFortuneLevel(a_Tool));\n\t\t\t\tRes.Add(E_ITEM_SEEDS, SeedCount);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_CARROTS:\n\t\t\t{\n\t\t\t\t// https://minecraft.wiki/w/Carrot#Breaking\n\t\t\t\tconst auto CarrotCount = CalculateSeedCount(1, 4, ToolFortuneLevel(a_Tool));\n\t\t\t\tRes.Add(E_ITEM_CARROT, CarrotCount);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_POTATOES:\n\t\t\t{\n\t\t\t\t// https://minecraft.wiki/w/Potato#Breaking\n\t\t\t\tconst auto PotatoCount = CalculateSeedCount(2, 3, ToolFortuneLevel(a_Tool));\n\t\t\t\tRes.Add(E_ITEM_POTATO, PotatoCount);\n\t\t\t\tif (rand.RandBool(0.02))\n\t\t\t\t{\n\t\t\t\t\t// https://minecraft.wiki/w/Poisonous_Potato#Obtaining\n\t\t\t\t\t// With a 2% chance, drop a poisonous potato as well:\n\t\t\t\t\tRes.Add(E_ITEM_POISONOUS_POTATO);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled block type\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (m_BlockType)\n\t\treturn Res;\n\t}\n\n\n\n\n\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const override\n\t{\n\t\tconst auto OldMeta = a_Chunk.GetMeta(a_RelPos);\n\t\tconst auto NewMeta = std::clamp<NIBBLETYPE>(static_cast<NIBBLETYPE>(OldMeta + a_NumStages), 0, RipeMeta);\n\t\ta_Chunk.SetMeta(a_RelPos, NewMeta);\n\t\treturn NewMeta - OldMeta;\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto BlockBelow = a_Position.addedY(-1);\n\n\t\tif (!cChunkDef::IsValidHeight(BlockBelow))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn a_Chunk.GetBlock(BlockBelow) == E_BLOCK_FARMLAND;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockDaylightSensor.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockDaylightSensorHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tif (a_ChunkInterface.GetBlock(a_BlockPos) == E_BLOCK_DAYLIGHT_SENSOR)\n\t\t{\n\t\t\ta_ChunkInterface.SetBlock(a_BlockPos, E_BLOCK_INVERTED_DAYLIGHT_SENSOR, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_ChunkInterface.SetBlock(a_BlockPos, E_BLOCK_DAYLIGHT_SENSOR, 0);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Always drop the regular daylight sensor:\n\t\treturn { E_BLOCK_DAYLIGHT_SENSOR };\n\t}\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockDeadBush.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockDeadBushHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto PosBelow = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(PosBelow))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tBLOCKTYPE BelowBlock = a_Chunk.GetBlock(PosBelow);\n\t\tswitch (BelowBlock)\n\t\t{\n\t\t\tcase E_BLOCK_CLAY:\n\t\t\tcase E_BLOCK_HARDENED_CLAY:\n\t\t\tcase E_BLOCK_STAINED_CLAY:\n\t\t\tcase E_BLOCK_SAND:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault: return false;\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// If cutting down with shears, drop self:\n\t\tif ((a_Tool != nullptr) && (a_Tool->m_ItemType == E_ITEM_SHEARS))\n\t\t{\n\t\t\treturn cItem(m_BlockType, 1, a_BlockMeta);\n\t\t}\n\n\t\t// Drop 0-3 sticks:\n\t\tauto chance = GetRandomProvider().RandInt<char>(3);\n\t\tif (chance > 0)\n\t\t{\n\t\t\treturn cItem(E_ITEM_STICK, chance, 0);\n\t\t}\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockDefaultBlock.h",
    "content": "\n#pragma once\n\n\n\n\n\nclass cDefaultBlockHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n};\n"
  },
  {
    "path": "src/Blocks/BlockDirt.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockDirtHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tif (a_BlockMeta == E_META_DIRT_COARSE)\n\t\t{\n\t\t\t// Drop the coarse block (dirt, meta 1)\n\t\t\treturn cItem(E_BLOCK_DIRT, 1, E_META_DIRT_COARSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn cItem(E_BLOCK_DIRT, 1, E_META_DIRT_NORMAL);\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 10;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockDoor.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"BlockDoor.h\"\n#include \"../EffectID.h\"\n\n\n\n\n\nvoid cBlockDoorHandler::OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos, BLOCKTYPE a_OldBlockType,\n\t\tNIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n) const\n{\n\tUNUSED(a_Digger);\n\t// A part of the multiblock door was broken; the relevant half will drop any pickups as required.\n\t// All that is left to do is to delete the other half of the multiblock.\n\n\tif ((a_OldBlockMeta & 0x08) != 0)\n\t{\n\t\tconst auto Lower = a_BlockPos.addedY(-1);\n\t\tif ((Lower.y >= 0) && IsDoorBlockType(a_ChunkInterface.GetBlock(Lower)))\n\t\t{\n\t\t\t// Was upper part of door, remove lower:\n\t\t\ta_ChunkInterface.SetBlock(Lower, E_BLOCK_AIR, 0);\n\t\t}\n\t}\n\telse\n\t{\n\t\tconst auto Upper = a_BlockPos.addedY(1);\n\t\tif ((Upper.y < cChunkDef::Height) && IsDoorBlockType(a_ChunkInterface.GetBlock(Upper)))\n\t\t{\n\t\t\t// Was lower part, remove upper:\n\t\t\ta_ChunkInterface.SetBlock(Upper, E_BLOCK_AIR, 0);\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cBlockDoorHandler::OnUse(\n\tcChunkInterface & a_ChunkInterface,\n\tcWorldInterface & a_WorldInterface,\n\tcPlayer & a_Player,\n\tconst Vector3i a_BlockPos,\n\teBlockFace a_BlockFace,\n\tconst Vector3i a_CursorPos\n) const\n{\n\tUNUSED(a_WorldInterface);\n\tUNUSED(a_BlockFace);\n\tUNUSED(a_CursorPos);\n\n\tswitch (a_ChunkInterface.GetBlock(a_BlockPos))\n\t{\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unhandled door block type\");\n\t\t}\n\t\tcase E_BLOCK_ACACIA_DOOR:\n\t\tcase E_BLOCK_BIRCH_DOOR:\n\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\tcase E_BLOCK_JUNGLE_DOOR:\n\t\tcase E_BLOCK_SPRUCE_DOOR:\n\t\tcase E_BLOCK_OAK_DOOR:\n\t\t{\n\t\t\tChangeDoor(a_ChunkInterface, a_BlockPos);\n\t\t\ta_Player.GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_WOODEN_DOOR_OPEN, a_BlockPos, 0, a_Player.GetClientHandle());\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_IRON_DOOR:\n\t\t{\n\t\t\t// Prevent iron door from opening on player click (#2415):\n\t\t\tOnCancelRightClick(a_ChunkInterface, a_WorldInterface, a_Player, a_BlockPos, a_BlockFace);\n\n\t\t\t// Allow placement actions to instead take place:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cBlockDoorHandler::OnCancelRightClick(\n\tcChunkInterface & a_ChunkInterface,\n\tcWorldInterface & a_WorldInterface,\n\tcPlayer & a_Player,\n\tconst Vector3i a_BlockPos,\n\teBlockFace a_BlockFace\n) const\n{\n\tUNUSED(a_ChunkInterface);\n\tUNUSED(a_BlockFace);\n\n\ta_WorldInterface.SendBlockTo(a_BlockPos, a_Player);\n\tNIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\n\tif (Meta & 0x08)\n\t{\n\t\t// Current block is top of the door, send the bottom part:\n\t\ta_WorldInterface.SendBlockTo(a_BlockPos.addedY(-1), a_Player);\n\t}\n\telse\n\t{\n\t\t// Current block is bottom of the door, send the top part:\n\t\ta_WorldInterface.SendBlockTo(a_BlockPos.addedY(1), a_Player);\n\t}\n}\n\n\n\n\n\ncBoundingBox cBlockDoorHandler::GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const\n{\n\t// Doors can be placed inside the player\n\treturn cBoundingBox(0, 0, 0, 0, 0, 0);\n}\n\n\n\n\n\nNIBBLETYPE cBlockDoorHandler::MetaRotateCCW(NIBBLETYPE a_Meta) const\n{\n\tif (a_Meta & 0x08)\n\t{\n\t\t// The meta doesn't change for the top block\n\t\treturn a_Meta;\n\t}\n\telse\n\t{\n\t\t// Rotate the bottom block\n\t\treturn Super::MetaRotateCCW(a_Meta);\n\t}\n}\n\n\n\n\n\nNIBBLETYPE cBlockDoorHandler::MetaRotateCW(NIBBLETYPE a_Meta) const\n{\n\tif (a_Meta & 0x08)\n\t{\n\t\t// The meta doesn't change for the top block\n\t\treturn a_Meta;\n\t}\n\telse\n\t{\n\t\t// Rotate the bottom block\n\t\treturn Super::MetaRotateCW(a_Meta);\n\t}\n}\n\n\n\n\n\nNIBBLETYPE cBlockDoorHandler::MetaMirrorXY(NIBBLETYPE a_Meta) const\n{\n\t/*\n\tTop bit (0x08) contains door block position (Top / Bottom). Only Bottom blocks contain position data\n\tReturn a_Meta if panel is a top panel (0x08 bit is set to 1)\n\t*/\n\n\t// Note: Currently, you can not properly mirror the hinges on a double door.  The orientation of the door is stored\n\t// in only the bottom tile while the hinge position is in the top tile.  This function only operates on one tile at a time,\n\t// so the function can only see either the hinge position or orientation, but not both, at any given time.  The class itself\n\t// needs extra datamembers.\n\tif (a_Meta & 0x08)\n\t{\n\t\treturn a_Meta;\n\t}\n\n\t// Holds open / closed meta data. 0x0C == 1100.\n\tNIBBLETYPE OtherMeta = a_Meta & 0x0C;\n\n\t// Mirrors according to a table.  0x03 == 0011.\n\tswitch (a_Meta & 0x03)\n\t{\n\t\tcase 0x03: return 0x01 + OtherMeta;  // South -> North\n\t\tcase 0x01: return 0x03 + OtherMeta;  // North -> South\n\t}\n\n\t// Not Facing North or South; No change.\n\treturn a_Meta;\n}\n\n\n\n\n\nNIBBLETYPE cBlockDoorHandler::MetaMirrorYZ(NIBBLETYPE a_Meta) const\n{\n\t// Top bit (0x08) contains door panel type (Top / Bottom panel)  Only Bottom panels contain position data\n\t// Return a_Meta if panel is a top panel (0x08 bit is set to 1)\n\n\t// Note: Currently, you can not properly mirror the hinges on a double door.  The orientation of the door is stored\n\t// in only the bottom tile while the hinge position is in the top tile.  This function only operates on one tile at a time,\n\t// so the function can only see either the hinge position or orientation, but not both, at any given time.The class itself\n\t// needs extra datamembers.\n\n\tif (a_Meta & 0x08)\n\t{\n\t\treturn a_Meta;\n\t}\n\n\t// Holds open / closed meta data. 0x0C == 1100.\n\tNIBBLETYPE OtherMeta = a_Meta & 0x0C;\n\n\t// Mirrors according to a table.  0x03 == 0011.\n\tswitch (a_Meta & 0x03)\n\t{\n\t\tcase 0x00: return 0x02 + OtherMeta;  // West  -> East\n\t\tcase 0x02: return 0x00 + OtherMeta;  // East  -> West\n\t}\n\n\t// Not Facing North or South; No change.\n\treturn a_Meta;\n}\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockDoor.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../BlockInfo.h\"\n#include \"../Entities/Player.h\"\n#include \"../Chunk.h\"\n#include \"Mixins/Mixins.h\"\n#include \"ChunkInterface.h\"\n#include \"BlockSlab.h\"\n\n\n\n\n\nclass cBlockDoorHandler final :\n\tpublic cYawRotator<cBlockHandler, 0x03, 0x03, 0x00, 0x01, 0x02>\n{\n\tusing Super = cYawRotator<cBlockHandler, 0x03, 0x03, 0x00, 0x01, 0x02>;\n\npublic:\n\n\tusing Super::Super;\n\n\t/** Returns true if door can be placed on the specified block type. */\n\tstatic bool CanBeOn(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\t// Vanilla refuses to place doors on transparent blocks, except top-half slabs and other doors\n\t\t// We need to keep the door compatible with itself, otherwise the top half drops while the bottom half stays\n\n\t\t// Doors can be placed on upside-down slabs\n\t\tif (cBlockSlabHandler::IsAnySlabType(a_BlockType) && ((a_BlockMeta & 0x08) != 0))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\t// Doors can also be placed on other doors\n\t\telse if (IsDoorBlockType(a_BlockType))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\t// Doors can not be placed on transparent blocks, but on any other block\n\t\telse\n\t\t{\n\t\t\treturn !cBlockInfo::IsTransparent(a_BlockType);\n\t\t}\n\t}\n\n\t/** Returns a vector pointing one block in the direction the door is facing (where the outside is). */\n\tinline static Vector3i GetRelativeDirectionToOutside(NIBBLETYPE a_BlockMeta)\n\t{\n\t\tswitch (a_BlockMeta & 0x03)\n\t\t{\n\t\t\tcase 0:  return Vector3i(-1, 0, 0);  // Facing West  / XM\n\t\t\tcase 1:  return Vector3i(0, 0, -1);  // Facing North / ZM\n\t\t\tcase 2:  return Vector3i(1, 0, 0);  // Facing East  / XP\n\t\t\tdefault: return Vector3i(0, 0, 1);  // Facing South / ZP\n\t\t}\n\t}\n\n\t/** Returns true if the specified blocktype is any kind of door */\n\tinline static bool IsDoorBlockType(BLOCKTYPE a_Block)\n\t{\n\t\tswitch (a_Block)\n\t\t{\n\t\t\tcase E_BLOCK_ACACIA_DOOR:\n\t\t\tcase E_BLOCK_BIRCH_DOOR:\n\t\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\t\tcase E_BLOCK_IRON_DOOR:\n\t\t\tcase E_BLOCK_JUNGLE_DOOR:\n\t\t\tcase E_BLOCK_SPRUCE_DOOR:\n\t\t\tcase E_BLOCK_OAK_DOOR:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Returns true iff the door at the specified coords is open.\n\tThe coords may point to either the top part or the bottom part of the door. */\n\tstatic bool IsOpen(cChunkInterface & a_ChunkInterface, const Vector3i a_BlockPos)\n\t{\n\t\tconst auto Meta = GetCompleteDoorMeta(a_ChunkInterface, a_BlockPos);\n\t\treturn (Meta & 0x04) != 0;\n\t}\n\n\t/** Sets the door to the specified state. If the door is already in that state, does nothing. */\n\tstatic void SetOpen(cChunkInterface & a_ChunkInterface, const Vector3i a_BlockPos, bool a_Open)\n\t{\n\t\tBLOCKTYPE Block = a_ChunkInterface.GetBlock(a_BlockPos);\n\t\tif (!IsDoorBlockType(Block))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tNIBBLETYPE Meta = GetCompleteDoorMeta(a_ChunkInterface, a_BlockPos);\n\t\tbool IsOpened = ((Meta & 0x04) != 0);\n\t\tif (IsOpened == a_Open)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Change the door\n\t\tNIBBLETYPE NewMeta = (Meta & 0x07) ^ 0x04;  // Flip the \"IsOpen\" bit (0x04)\n\t\tif ((Meta & 0x08) == 0)\n\t\t{\n\t\t\t// The block is the bottom part of the door\n\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, NewMeta);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// The block is the top part of the door, set the meta to the corresponding top part\n\t\t\tif (a_BlockPos.y > 0)\n\t\t\t{\n\t\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos.addedY(-1), NewMeta);\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override;\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override;\n\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const override;\n\n\tvirtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const override;\n\tvirtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta)  const override;\n\tvirtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta)  const override;\n\tvirtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta)  const override;\n\tvirtual cBoundingBox GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const override;\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_OAK_DOOR:      return cItem(E_ITEM_WOODEN_DOOR);\n\t\t\tcase E_BLOCK_ACACIA_DOOR:   return cItem(E_ITEM_ACACIA_DOOR);\n\t\t\tcase E_BLOCK_BIRCH_DOOR:    return cItem(E_ITEM_BIRCH_DOOR);\n\t\t\tcase E_BLOCK_DARK_OAK_DOOR: return cItem(E_ITEM_DARK_OAK_DOOR);\n\t\t\tcase E_BLOCK_JUNGLE_DOOR:   return cItem(E_ITEM_JUNGLE_DOOR);\n\t\t\tcase E_BLOCK_SPRUCE_DOOR:   return cItem(E_ITEM_SPRUCE_DOOR);\n\t\t\tcase E_BLOCK_IRON_DOOR:     return cItem(E_ITEM_IRON_DOOR);\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled door type!\");\n\t\t\t\treturn {};\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\t// CanBeAt is also called on placement, so the top part can't check for the bottom part.\n\t\t// Both parts can only check that the base of the door (i.e. -2 for a door top) is a valid block.\n\t\tconst auto BasePosition = a_Position.addedY(((a_Meta & 0x8) == 0x8) ? -2 : -1);\n\t\tif (!cChunkDef::IsValidHeight(BasePosition))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\ta_Chunk.GetBlockTypeMeta(BasePosition, BlockType, BlockMeta);\n\n\t\treturn CanBeOn(BlockType, BlockMeta);\n\t}\n\n\n\n\n\n\t/** Returns the complete meta composed from the both parts of the door as (TopMeta << 4) | BottomMeta\n\tThe coords may point to either part of the door.\n\tThe returned value has bit 3 (0x08) set iff the coords point to the top part of the door.\n\tFails silently for (invalid) doors on the world's top and bottom. */\n\tstatic NIBBLETYPE GetCompleteDoorMeta(cChunkInterface & a_ChunkInterface, const Vector3i a_BlockPos)\n\t{\n\t\tNIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\n\t\tif ((Meta & 0x08) != 0)\n\t\t{\n\t\t\t// The coords are pointing at the top part of the door\n\t\t\tconst auto BottomPos = a_BlockPos.addedY(-1);\n\t\t\tif (cChunkDef::IsValidHeight(BottomPos))\n\t\t\t{\n\t\t\t\tNIBBLETYPE DownMeta = a_ChunkInterface.GetBlockMeta(BottomPos);\n\t\t\t\treturn static_cast<NIBBLETYPE>((DownMeta & 0x07) | 0x08 | (Meta << 4));\n\t\t\t}\n\t\t\t// This is the top part of the door at the bottommost layer of the world, there's no bottom:\n\t\t\treturn static_cast<NIBBLETYPE>(0x08 | (Meta << 4));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// The coords are pointing at the bottom part of the door\n\t\t\tconst auto TopPos = a_BlockPos.addedY(1);\n\t\t\tif (cChunkDef::IsValidHeight(TopPos))\n\t\t\t{\n\t\t\t\tNIBBLETYPE UpMeta = a_ChunkInterface.GetBlockMeta(TopPos);\n\t\t\t\treturn static_cast<NIBBLETYPE>(Meta | (UpMeta << 4));\n\t\t\t}\n\t\t\t// This is the bottom part of the door at the topmost layer of the world, there's no top:\n\t\t\treturn Meta;\n\t\t}\n\t}\n\n\n\n\n\n\t/** Changes the door at the specified coords from open to close or vice versa */\n\tstatic void ChangeDoor(cChunkInterface & a_ChunkInterface, const Vector3i a_BlockPos)\n\t{\n\t\tSetOpen(a_ChunkInterface, a_BlockPos, !IsOpen(a_ChunkInterface, a_BlockPos));\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_OAK_DOOR: return 13;\n\t\t\tcase E_BLOCK_SPRUCE_DOOR: return 34;\n\t\t\tcase E_BLOCK_BIRCH_DOOR: return 2;\n\t\t\tcase E_BLOCK_JUNGLE_DOOR: return 10;\n\t\t\tcase E_BLOCK_DARK_OAK_DOOR: return 26;\n\t\t\tcase E_BLOCK_ACACIA_DOOR: return 15;\n\t\t\tcase E_BLOCK_IRON_DOOR: return 6;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled blocktype in door handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockDropSpenser.h",
    "content": "\n// BlockDropSpenser.h\n\n// Declares the cBlockDropSpenserHandler class representing the BlockHandler for Dropper and Dispenser blocks\n\n#pragma once\n\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cBlockDropSpenserHandler final :\n\tpublic cDisplacementYawRotator<cClearMetaOnDrop<cBlockEntityHandler>, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>\n{\n\tusing Super = cDisplacementYawRotator<cClearMetaOnDrop<cBlockEntityHandler>, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 11;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockEnchantingTable.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../Item.h\"\n#include \"../UI/EnchantingWindow.h\"\n#include \"../BlockEntities/EnchantingTableEntity.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cBlockEnchantingTableHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tAString WindowName = \"Enchant\";\n\t\ta_WorldInterface.DoWithBlockEntityAt(a_BlockPos, [&WindowName](cBlockEntity & a_Entity)\n\t\t{\n\t\t\tASSERT(a_Entity.GetBlockType() == E_BLOCK_ENCHANTMENT_TABLE);\n\n\t\t\tconst auto & EnchantingTable = static_cast<cEnchantingTableEntity &>(a_Entity);\n\t\t\tconst auto & CustomName = EnchantingTable.GetCustomName();\n\t\t\tif (!CustomName.empty())\n\t\t\t{\n\t\t\t\tWindowName = CustomName;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t});\n\n\t\tcWindow * Window = new cEnchantingWindow(a_BlockPos, std::move(WindowName));\n\t\ta_Player.OpenWindow(*Window);\n\n\t\treturn true;\n\t}\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Drops handled by the block entity:\n\t\treturn {};\n\t}\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 29;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockEndPortalFrame.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockEndPortalFrameHandler final :\n\tpublic cYawRotator<cBlockHandler, 0x03,\n\t\tE_META_END_PORTAL_FRAME_ZP,\n\t\tE_META_END_PORTAL_FRAME_XM,\n\t\tE_META_END_PORTAL_FRAME_ZM,\n\t\tE_META_END_PORTAL_FRAME_XP\n\t>\n{\n\tusing Super = cYawRotator<\n\t\tcBlockHandler, 0x03,\n\t\tE_META_END_PORTAL_FRAME_ZP,\n\t\tE_META_END_PORTAL_FRAME_XM,\n\t\tE_META_END_PORTAL_FRAME_ZM,\n\t\tE_META_END_PORTAL_FRAME_XP\n\t>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual void OnPlaced(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) const override\n\t{\n\t\t// E_META_END_PORTAL_FRAME_EYE is the bit which signifies the eye of ender is in it.\n\t\t// LOG(\"PortalPlaced, meta %d\", a_BlockMeta);\n\t\tif ((a_BlockMeta & E_META_END_PORTAL_FRAME_EYE) == E_META_END_PORTAL_FRAME_EYE)\n\t\t{\n\t\t\t// LOG(\"Location is %d %d %d\", a_BlockX, a_BlockY, a_BlockZ);\n\t\t\t// Direction is the first two bits, masked by 0x3\n\t\t\tFindAndSetPortal(a_BlockPos, a_BlockMeta & 3, a_ChunkInterface, a_WorldInterface);\n\t\t}\n\t}\n\n\n\n\n\n\t/** Returns false if portal cannot be made, true if portal was made. */\n\tstatic bool FindAndSetPortal(Vector3i a_FirstFrame, NIBBLETYPE a_Direction, cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface)\n\t{\n\t\t/*\n\t\tPORTAL FINDING ALGORITH\n\t\t=======================\n\t\t- Get clicked base block\n\t\t- Check diagonally (clockwise) for another portal block\n\t\t\t- if exists, and has eye, Continue. Abort if any are facing the wrong direction.\n\t\t\t- if doesn't exist, check horizontally (the block to the left of this block). Abort if there is no horizontal block.\n\t\t- After a corner has been met, traverse the portal clockwise, ensuring valid portal frames connect the rectangle.\n\t\t- Track the NorthWest Corner, and the dimensions.\n\t\t- If dimensions are valid, create the portal.\n\t\t*/\n\n\t\tstatic_assert((E_META_END_PORTAL_FRAME_ZM - E_META_END_PORTAL_FRAME_XM) == 1, \"Should be going clockwise\");\n\n\t\tconst int MIN_PORTAL_WIDTH = 3;\n\t\tconst int MAX_PORTAL_WIDTH = 4;\n\n\t\t// Directions to use for the clockwise traversal.\n\t\tstatic const Vector3i Left[] =\n\t\t{\n\t\t\t{ 1, 0,  0},  // 0, South, left block is East  / XP\n\t\t\t{ 0, 0,  1},  // 1, West,  left block is South / ZP\n\t\t\t{-1, 0,  0},  // 2, North, left block is West  / XM\n\t\t\t{ 0, 0, -1},  // 3, East,  left block is North / ZM\n\t\t};\n\t\tstatic const Vector3i LeftForward[] =\n\t\t{\n\t\t\t{ 1, 0,  1},  // 0, South, left block is SouthEast / XP ZP\n\t\t\t{-1, 0,  1},  // 1, West,  left block is SouthWest / XM ZP\n\t\t\t{-1, 0, -1},  // 2, North, left block is NorthWest / XM ZM\n\t\t\t{ 1, 0, -1},  // 3, East,  left block is NorthEast / XP ZM\n\t\t};\n\n\n\t\tint EdgesComplete = -1;  // We start search _before_ finding the first edge\n\t\tVector3i NorthWestCorner;\n\t\tint EdgeWidth[4] = { 1, 1, 1, 1 };\n\t\tNIBBLETYPE CurrentDirection = a_Direction;\n\t\tVector3i CurrentPos = a_FirstFrame;\n\n\t\t// Scan clockwise until we have seen all 4 edges\n\t\twhile (EdgesComplete < 4)\n\t\t{\n\t\t\t// Check if we are at a corner\n\t\t\tVector3i NextPos = CurrentPos + LeftForward[CurrentDirection];\n\t\t\tif (IsPortalFrame(a_ChunkInterface.GetBlock(NextPos)))\n\t\t\t{\n\t\t\t\t// We have found the corner, move clockwise to next edge\n\t\t\t\tif (CurrentDirection == E_META_END_PORTAL_FRAME_XP)\n\t\t\t\t{\n\t\t\t\t\t// We are on the NW (XM, ZM) Corner\n\t\t\t\t\t// Relative to the previous frame, the portal should appear to the right of this portal frame.\n\t\t\t\t\tNorthWestCorner = NextPos - Left[CurrentDirection];\n\t\t\t\t}\n\n\t\t\t\tif (EdgesComplete == -1)\n\t\t\t\t{\n\t\t\t\t\t// Reset current width, we will revisit it last\n\t\t\t\t\tEdgeWidth[CurrentDirection] = 1;\n\t\t\t\t}\n\n\t\t\t\t// Rotate 90 degrees clockwise\n\t\t\t\tCurrentDirection = (CurrentDirection + 1) % 4;\n\t\t\t\tEdgesComplete++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// We are not at a corner, keep walking the edge\n\t\t\t\tNextPos = CurrentPos + Left[CurrentDirection];\n\n\t\t\t\tEdgeWidth[CurrentDirection]++;\n\t\t\t\tif (EdgeWidth[CurrentDirection] > MAX_PORTAL_WIDTH)\n\t\t\t\t{\n\t\t\t\t\t// Don't build a portal that is too long.\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!IsValidFrameAtPos(a_ChunkInterface, NextPos, CurrentDirection))\n\t\t\t{\n\t\t\t\t// Neither the edge nor the corner are valid portal blocks.\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tCurrentPos = NextPos;\n\t\t}\n\n\t\tif ((EdgeWidth[0] != EdgeWidth[2]) || (EdgeWidth[1] != EdgeWidth[3]))\n\t\t{\n\t\t\t// Mismatched Portal Dimensions.\n\t\t\treturn false;\n\t\t}\n\t\tif ((EdgeWidth[0] < MIN_PORTAL_WIDTH) || (EdgeWidth[1] < MIN_PORTAL_WIDTH))\n\t\t{\n\t\t\t// Portal too small.\n\t\t\treturn false;\n\t\t}\n\n\t\t// LOG(\"NW corner (low corner) %d %d %d\", Corner.x, Corner.y, Corner.z);\n\t\t// LOG(\"%d by %d\", Width[0], Width[1]);\n\t\tfor (int i = 0; i < EdgeWidth[0]; i++)\n\t\t{\n\t\t\tfor (int j = 0; j < EdgeWidth[1]; j++)\n\t\t\t{\n\t\t\t\ta_ChunkInterface.SetBlock(NorthWestCorner.x + i, NorthWestCorner.y, NorthWestCorner.z + j, E_BLOCK_END_PORTAL, 0);\n\t\t\t\t// TODO: Create block entity so portal doesn't become invisible on relog.\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Return true if this block is a portal frame, has an eye, and is facing the correct direction. */\n\tstatic bool IsValidFrameAtPos(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, NIBBLETYPE a_ShouldFace)\n\t{\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\n\t\treturn (\n\t\t\ta_ChunkInterface.GetBlockTypeMeta(a_BlockPos, BlockType, BlockMeta) &&\n\t\t\t(BlockType == E_BLOCK_END_PORTAL_FRAME) &&\n\t\t\t(BlockMeta == (a_ShouldFace | E_META_END_PORTAL_FRAME_EYE))\n\t\t);\n\t}\n\n\n\n\n\t/** Return true if this block is a portal frame. */\n\tstatic bool IsPortalFrame(BLOCKTYPE BlockType)\n\t{\n\t\treturn (BlockType == E_BLOCK_END_PORTAL_FRAME);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 27;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockEnderChest.h",
    "content": "\n#pragma once\n\n#include \"Mixins/Mixins.h\"\n\n\n\n\nclass cBlockEnderChestHandler final :\n\tpublic cYawRotator<cBlockEntityHandler, 0x07, 0x03, 0x04, 0x02, 0x05>\n{\n\tusing Super = cYawRotator<cBlockEntityHandler, 0x07, 0x03, 0x04, 0x02, 0x05>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Only drop something when mined with a pickaxe:\n\t\tif (\n\t\t\t(a_Tool != nullptr) &&\n\t\t\tItemCategory::IsPickaxe(a_Tool->m_ItemType)\n\t\t)\n\t\t{\n\t\t\t// Only drop self when mined with a silk-touch pickaxe:\n\t\t\tif (a_Tool->m_Enchantments.GetLevel(cEnchantments::enchSilkTouch) > 0)\n\t\t\t{\n\t\t\t\treturn cItem(E_BLOCK_ENDER_CHEST);\n\t\t\t}\n\n\t\t\treturn cItem(E_BLOCK_OBSIDIAN, 8);\n\t\t}\n\n\t\treturn {};\n\t}\n\n};\n"
  },
  {
    "path": "src/Blocks/BlockEntity.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"ChunkInterface.h\"\n#include \"../Item.h\"\n\n\n\n\n\n/** Wrapper for blocks that have a cBlockEntity descendant attached to them and can be \"used\" by the player.\nForwards the \"use\" event to the block entity. */\nclass cBlockEntityHandler :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\t~cBlockEntityHandler() = default;\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\treturn a_ChunkInterface.UseBlockEntity(&a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z);\n\t}\n\n\tvirtual bool IsUseable() const override\n\t{\n\t\treturn true;\n\t}\n};\n\n\n\n\n\nclass cDefaultBlockEntityHandler final :\n\tpublic cBlockEntityHandler\n{\npublic:\n\n\tusing cBlockEntityHandler::cBlockEntityHandler;\n};\n"
  },
  {
    "path": "src/Blocks/BlockFarmland.h",
    "content": "\n// BlockFarmland.h\n\n// Declares the cBlcokFarmlandHandler representing the block handler for farmland\n\n\n\n\n\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"ChunkInterface.h\"\n#include \"../BlockArea.h\"\n#include \"../Chunk.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\nclass cBlockFarmlandHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\t/** Turns farmland into dirt.\n\tWill first check for any colliding entities and teleport them to a higher position.\n\t*/\n\tstatic void TurnToDirt(cChunk & a_Chunk, Vector3i a_AbsPos)\n\t{\n\t\tauto RelPos = cChunkDef::AbsoluteToRelative(a_AbsPos);\n\t\tTurnToDirt(a_Chunk, a_AbsPos, RelPos);\n\t}\n\n\n\n\n\n\t/** Turns farmland into dirt.\n\tWill first check for any colliding entities and teleport them to a higher position.\n\t*/\n\tstatic void TurnToDirt(cChunk & a_Chunk, const Vector3i a_AbsPos, const Vector3i a_RelPos)\n\t{\n\t\t// Use cBlockInfo::GetBlockHeight when it doesn't break trampling for\n\t\t// mobs and older clients anymore\n\t\tstatic const auto FarmlandHeight = 0.9375;\n\t\tstatic const auto FullHeightDelta = 0.0625;\n\n\t\ta_Chunk.ForEachEntityInBox(\n\t\t\tcBoundingBox(Vector3d(0.5, FarmlandHeight, 0.5) + a_AbsPos, 0.5, FullHeightDelta),\n\t\t\t[&](cEntity & Entity)\n\t\t\t{\n\t\t\t\tconst auto GroundHeight = a_AbsPos.y + 1;\n\n\t\t\t\t// A simple IsOnGround isn't enough. It will return true when\n\t\t\t\t// e.g. a piston pushes a farmland block into an entity's head.\n\t\t\t\t// Maybe it's also possible than an entity is falling, it's\n\t\t\t\t// still not on the ground, but it's less than 0.0625 blocks\n\t\t\t\t// higher than the farmland block\n\t\t\t\tif ((Entity.GetPosY() < a_AbsPos.y + FarmlandHeight) || (Entity.GetPosY() >= GroundHeight))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Players need a packet that will update their position\n\t\t\t\tif (Entity.IsPlayer())\n\t\t\t\t{\n\t\t\t\t\tconst auto HeightIncrease = GroundHeight - Entity.GetPosY();\n\t\t\t\t\tconst auto Player = static_cast<const cPlayer *>(&Entity);\n\n\t\t\t\t\tPlayer->GetClientHandle()->SendPlayerMoveLook(Vector3d(0.0, HeightIncrease, 0.0), 0.0f, 0.0f, true);\n\t\t\t\t}\n\n\t\t\t\tEntity.SetPosY(GroundHeight);\n\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\ta_Chunk.SetBlock(a_RelPos, E_BLOCK_DIRT, 0);\n\t}\n\n\n\n\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_BLOCK_DIRT, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tauto BlockMeta = a_Chunk.GetMeta(a_RelPos);\n\n\t\tif (IsWaterInNear(a_Chunk, a_RelPos))\n\t\t{\n\t\t\t// Water was found, set block meta to 7\n\t\t\ta_Chunk.FastSetBlock(a_RelPos, m_BlockType, 7);\n\t\t\treturn;\n\t\t}\n\n\t\t// Water wasn't found, de-hydrate block:\n\t\tif (BlockMeta > 0)\n\t\t{\n\t\t\ta_Chunk.FastSetBlock(a_RelPos, E_BLOCK_FARMLAND, --BlockMeta);\n\t\t\treturn;\n\t\t}\n\n\t\t// Farmland too dry. If nothing is growing on top, turn back to dirt:\n\t\tauto UpperBlock = cChunkDef::IsValidHeight(a_RelPos.addedY(1)) ? a_Chunk.GetBlock(a_RelPos.addedY(1)) : E_BLOCK_AIR;\n\t\tswitch (UpperBlock)\n\t\t{\n\t\t\tcase E_BLOCK_BEETROOTS:\n\t\t\tcase E_BLOCK_CROPS:\n\t\t\tcase E_BLOCK_POTATOES:\n\t\t\tcase E_BLOCK_CARROTS:\n\t\t\tcase E_BLOCK_MELON_STEM:\n\t\t\tcase E_BLOCK_PUMPKIN_STEM:\n\t\t\t{\n\t\t\t\t// Produce on top, don't revert\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tauto AbsPos = a_Chunk.RelativeToAbsolute(a_RelPos);\n\t\t\t\tTurnToDirt(a_Chunk, AbsPos, a_RelPos);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const override\n\t{\n\t\t// Don't care about any neighbor but the one above us (fix recursion loop in #2213):\n\t\tif (a_WhichNeighbor != BLOCK_FACE_YP)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Don't care about anything if we're at the top of the world:\n\t\tif (a_BlockPos.y >= cChunkDef::Height)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Check whether we should revert to dirt:\n\t\t// TODO: fix for signs and slabs (possibly more blocks) - they should destroy farmland\n\t\tauto upperBlock = a_ChunkInterface.GetBlock(a_BlockPos.addedY(1));\n\t\tif (cBlockInfo::FullyOccupiesVoxel(upperBlock))\n\t\t{\n\t\t\t// Until the fix above is done, this line should also suffice:\n\t\t\t// a_ChunkInterface.SetBlock(a_BlockPos, E_BLOCK_DIRT, 0);\n\t\t\ta_ChunkInterface.DoWithChunkAt(a_BlockPos, [&](cChunk & Chunk)\n\t\t\t{\n\t\t\t\tTurnToDirt(Chunk, a_BlockPos);\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\n\n\t/** Returns true if there's either a water source block close enough to hydrate the specified position, or it's raining there. */\n\tstatic bool IsWaterInNear(const cChunk & a_Chunk, const Vector3i a_RelPos)\n\t{\n\t\tif (a_Chunk.IsWeatherWetAt(a_RelPos.addedY(1)))\n\t\t{\n\t\t\t// Rain hydrates farmland, too\n\t\t\treturn true;\n\t\t}\n\n\t\tconst auto WorldPos = a_Chunk.RelativeToAbsolute(a_RelPos);\n\n\t\t// Search for water in a close proximity:\n\t\t// Ref.: https://minecraft.wiki/w/Farmland#Hydration\n\t\t// TODO: Rewrite this to use the chunk and its neighbors directly\n\t\tcBlockArea Area;\n\t\tif (!Area.Read(*a_Chunk.GetWorld(), WorldPos - Vector3i(4, 0, 4), WorldPos + Vector3i(4, 1, 4)))\n\t\t{\n\t\t\t// Too close to the world edge, cannot check surroundings\n\t\t\treturn false;\n\t\t}\n\n\t\tsize_t NumBlocks = Area.GetBlockCount();\n\t\tBLOCKTYPE * BlockTypes = Area.GetBlockTypes();\n\t\tfor (size_t i = 0; i < NumBlocks; i++)\n\t\t{\n\t\t\tif (IsBlockWater(BlockTypes[i]))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}  // for i - BlockTypes[]\n\n\t\treturn false;\n\t}\n\n\n\n\n\n\tvirtual bool CanSustainPlant(BLOCKTYPE a_Plant) const override\n\t{\n\t\treturn (\n\t\t\t(a_Plant == E_BLOCK_BEETROOTS) ||\n\t\t\t(a_Plant == E_BLOCK_CROPS) ||\n\t\t\t(a_Plant == E_BLOCK_CARROTS) ||\n\t\t\t(a_Plant == E_BLOCK_POTATOES) ||\n\t\t\t(a_Plant == E_BLOCK_MELON_STEM) ||\n\t\t\t(a_Plant == E_BLOCK_PUMPKIN_STEM)\n\t\t);\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockFence.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../BoundingBox.h\"\n#include \"../EffectID.h\"\n#include \"../Entities/LeashKnot.h\"\n#include \"../BoundingBox.h\"\n#include \"../Mobs/PassiveMonster.h\"\n\n\n\nclass cBlockFenceHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t// These are the min and max coordinates (X and Z) for a straight fence.\n\t// 0.4 and 0.6 are really just guesses, but they seem pretty good.\n\t// (0.4 to 0.6 is a fence that's 0.2 wide, down the center of the block)\n\tstatic constexpr double MIN_COORD = 0.4;\n\tstatic constexpr double MAX_COORD = 0.6;\n\n\tvirtual cBoundingBox GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const override\n\t{\n\t\tbool XMSolid = cBlockInfo::IsSolid(a_XM);\n\t\tbool XPSolid = cBlockInfo::IsSolid(a_XP);\n\t\tbool ZMSolid = cBlockInfo::IsSolid(a_ZM);\n\t\tbool ZPSolid = cBlockInfo::IsSolid(a_ZP);\n\n\t\tdouble FENCE_HEIGHT = cBlockInfo::GetBlockHeight(m_BlockType);\n\n\t\t// Entities can never be in the center\n\t\tcBoundingBox PlacementBox(MIN_COORD, MAX_COORD, 0, FENCE_HEIGHT, MIN_COORD, MAX_COORD);\n\n\t\t// For each solid neighbor, the hitbox extends that way\n\t\tif (XMSolid)\n\t\t{\n\t\t\tPlacementBox = PlacementBox.Union(cBoundingBox(0, 0.5, 0, FENCE_HEIGHT, MIN_COORD, MAX_COORD));\n\t\t}\n\t\tif (XPSolid)\n\t\t{\n\t\t\tPlacementBox = PlacementBox.Union(cBoundingBox(0.5, 1.0, 0, FENCE_HEIGHT, MIN_COORD, MAX_COORD));\n\t\t}\n\t\tif (ZMSolid)\n\t\t{\n\t\t\tPlacementBox = PlacementBox.Union(cBoundingBox(MIN_COORD, MAX_COORD, 0, FENCE_HEIGHT, 0.0, 0.5));\n\t\t}\n\t\tif (ZPSolid)\n\t\t{\n\t\t\tPlacementBox = PlacementBox.Union(cBoundingBox(MIN_COORD, MAX_COORD, 0, FENCE_HEIGHT, 0.5, 1.0));\n\t\t}\n\n\t\t// For each corner, fill in the corner\n\t\tif (XMSolid && ZMSolid)\n\t\t{\n\t\t\tPlacementBox = PlacementBox.Union(cBoundingBox(0, 0.5, 0, FENCE_HEIGHT, 0, 0.5));\n\t\t}\n\t\tif (XPSolid && ZMSolid)\n\t\t{\n\t\t\tPlacementBox = PlacementBox.Union(cBoundingBox(0.5, 1.0, 0, FENCE_HEIGHT, 0, 0.5));\n\t\t}\n\t\tif (XPSolid && ZPSolid)\n\t\t{\n\t\t\tPlacementBox = PlacementBox.Union(cBoundingBox(0.5, 1.0, 0, FENCE_HEIGHT, 0.5, 1.0));\n\t\t}\n\t\tif (XMSolid && ZPSolid)\n\t\t{\n\t\t\tPlacementBox = PlacementBox.Union(cBoundingBox(0, 0.5, 0, FENCE_HEIGHT, 0.5, 1.0));\n\t\t}\n\n\t\treturn PlacementBox;\n\t}\n\n\n\n\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tauto LeashKnot = cLeashKnot::FindKnotAtPos(*a_Player.GetWorld(), a_BlockPos);\n\t\tauto KnotAlreadyExists = (LeashKnot != nullptr);\n\n\t\tif (KnotAlreadyExists)\n\t\t{\n\t\t\t// Check leashed nearby mobs to leash them to the knot\n\t\t\tLeashKnot->TiePlayersLeashedMobs(a_Player, KnotAlreadyExists);\n\t\t}\n\t\t// New knot? needs to init and produce sound effect\n\t\telse\n\t\t{\n\t\t\tauto NewLeashKnot = std::make_unique<cLeashKnot>(a_BlockFace, a_BlockPos);\n\t\t\tauto NewLeashKnotPtr = NewLeashKnot.get();\n\n\t\t\tNewLeashKnotPtr->TiePlayersLeashedMobs(a_Player, KnotAlreadyExists);\n\n\t\t\t// Only put the knot in the world if any mob has been leashed to\n\t\t\tif (NewLeashKnotPtr->HasAnyMobLeashed())\n\t\t\t{\n\t\t\t\tif (!NewLeashKnotPtr->Initialize(std::move(NewLeashKnot), *a_Player.GetWorld()))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ta_Player.GetWorld()->BroadcastSoundEffect(\"entity.leashknot.place\", a_Player.GetPosition(), 1, 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const override\n\t{\n\t\ta_WorldInterface.SendBlockTo(a_BlockPos, a_Player);\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override\n\t{\n\t\tUNUSED(a_Digger);\n\t\t// Destroy any leash knot tied to the fence:\n\t\tauto leashKnot = cLeashKnot::FindKnotAtPos(a_WorldInterface, a_BlockPos);\n\t\tif (leashKnot != nullptr)\n\t\t{\n\t\t\tleashKnot->SetShouldSelfDestroy();\n\t\t}\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockFenceGate.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n#include \"../EffectID.h\"\n\n\n\n\nclass cBlockFenceGateHandler final :\n\tpublic cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x02, 0x03, 0x00, 0x01>>\n{\n\tusing Super = cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x02, 0x03, 0x00, 0x01>>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tNIBBLETYPE OldMetaData = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\t\tNIBBLETYPE NewMetaData = YawToMetaData(a_Player.GetYaw());\n\t\tOldMetaData ^= 4;  // Toggle the gate\n\n\t\tif ((OldMetaData & 1) == (NewMetaData & 1))\n\t\t{\n\t\t\t// Standing in front of the gate - apply new direction\n\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, (OldMetaData & 4) | (NewMetaData & 3));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Standing aside - use last direction\n\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, OldMetaData);\n\t\t}\n\t\ta_Player.GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_FENCE_GATE_OPEN, a_BlockPos, 0, a_Player.GetClientHandle());\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const override\n\t{\n\t\ta_WorldInterface.SendBlockTo(a_BlockPos, a_Player);\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_OAK_FENCE_GATE: return 13;\n\t\t\tcase E_BLOCK_SPRUCE_FENCE_GATE: return 34;\n\t\t\tcase E_BLOCK_BIRCH_FENCE_GATE: return 2;\n\t\t\tcase E_BLOCK_JUNGLE_FENCE_GATE: return 10;\n\t\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE: return 26;\n\t\t\tcase E_BLOCK_ACACIA_FENCE_GATE: return 15;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled blocktype in fence gate handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockFire.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockFireHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tstruct Scratch\n\t{\n\t\t/** Portal boundary and direction variables */\n\t\tint XZP = 0, XZM = 0;\n\t\tNIBBLETYPE Dir = 0;\n\t};\n\n\n\n\n\n\tvirtual void OnPlaced(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) const override\n\t{\n\t\t/*\n\t\tPORTAL FINDING ALGORITH\n\t\t=======================\n\t\t- Get clicked base block\n\t\t- Trace upwards to find first obsidian block; aborts if anything other than obsidian or air is encountered.\n\t\t\tUses this value as a reference (the 'ceiling')\n\t\t- For both directions (if one fails, try the other), BASE (clicked) block:\n\t\t\t- Go in one direction, only stop if a non obsidian block is encountered (abort) OR a portal border is encountered (FindObsidianCeiling returns -1)\n\t\t\t- If a border was encountered, go the other direction and repeat above\n\t\t\t- Write borders to XZP and XZM, write direction portal faces to Dir\n\t\t- Loop through boundary variables, and fill with portal blocks based on Dir with meta from Dir\n\t\t*/\n\n\t\tif (a_WorldInterface.GetDimension() == dimEnd)\n\t\t{\n\t\t\t// Can only create portals in the Nether and Overworld (GH #5009):\n\t\t\treturn;\n\t\t}\n\n\t\tScratch Scratch;\n\n\t\t// a_BlockY - 1: Because we want the block below the fire\n\t\tFindAndSetPortalFrame(a_BlockPos.x, a_BlockPos.y - 1, a_BlockPos.z, a_ChunkInterface, a_WorldInterface, Scratch);\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// No pickups from this block\n\t\treturn {};\n\t}\n\n\n\t/** Traces along YP until it finds an obsidian block, returns Y difference or 0 if no portal, and -1 for border\n\tTakes the X, Y, and Z of the base block; with an optional MaxY for portal border finding */\n\tstatic int FindObsidianCeiling(int X, int Y, int Z, cChunkInterface & a_ChunkInterface, int MaxY = 0)\n\t{\n\t\tif (a_ChunkInterface.GetBlock({X, Y, Z}) != E_BLOCK_OBSIDIAN)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\tfor (int newY = Y + 1; newY < cChunkDef::Height; newY++)\n\t\t{\n\t\t\tBLOCKTYPE Block = a_ChunkInterface.GetBlock({X, newY, Z});\n\t\t\tif ((Block == E_BLOCK_AIR) || (Block == E_BLOCK_FIRE))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if (Block == E_BLOCK_OBSIDIAN)\n\t\t\t{\n\t\t\t\t// We found an obsidian ceiling\n\t\t\t\t// Make sure MaxY has a value and newY ('ceiling' location) is at one above the base block\n\t\t\t\t// This is because the frame is a solid obsidian pillar\n\t\t\t\tif ((MaxY != 0) && (newY == Y + 1))\n\t\t\t\t{\n\t\t\t\t\treturn EvaluatePortalBorder(X, newY, Z, MaxY, a_ChunkInterface) ? -1 /* -1 = found a frame */ : 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Return ceiling Y, whoever called this function will decide if it's part of a portal or not\n\t\t\t\t\treturn newY;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t/** Evaluates if coords have a valid border on top, based on MaxY */\n\tstatic bool EvaluatePortalBorder(int X, int FoundObsidianY, int Z, int MaxY, cChunkInterface & a_ChunkInterface)\n\t{\n\t\tfor (int checkBorder = FoundObsidianY + 1; checkBorder <= MaxY - 1; checkBorder++)  // FoundObsidianY + 1: FoundObsidianY has already been checked in FindObsidianCeiling; MaxY - 1: portal doesn't need corners\n\t\t{\n\t\t\tif (a_ChunkInterface.GetBlock({X, checkBorder, Z}) != E_BLOCK_OBSIDIAN)\n\t\t\t{\n\t\t\t\t// Base obsidian, base + 1 obsidian, base + x NOT obsidian -> not complete portal\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t// Everything was obsidian, found a border!\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Finds entire frame in any direction with the coordinates of a base block and fills hole with nether portal (START HERE) */\n\tstatic void FindAndSetPortalFrame(int X, int Y, int Z, cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, Scratch & a_Scratch)\n\t{\n\t\tint MaxY = FindObsidianCeiling(X, Y, Z, a_ChunkInterface);  // Get topmost obsidian block as reference for all other checks\n\t\tint X1 = X + 1, Z1 = Z + 1, X2 = X - 1, Z2 = Z - 1;  // Duplicate XZ values, add / subtract one as we've checked the original already the line above\n\n\t\tif (MaxY == 0)  // Oh noes! Not a portal coordinate :(\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (!FindPortalSliceX(X1, X2, Y, Z, MaxY, a_ChunkInterface, a_Scratch))\n\t\t{\n\t\t\tif (!FindPortalSliceZ(X, Y, Z1, Z2, MaxY, a_ChunkInterface, a_Scratch))\n\t\t\t{\n\t\t\t\treturn;  // No eligible portal construct, abort abort abort!!\n\t\t\t}\n\t\t}\n\n\t\tint PortalHeight = MaxY - Y - 1;\n\t\tint PortalWidth = a_Scratch.XZP - a_Scratch.XZM + 1;\n\t\tif ((PortalHeight < a_WorldInterface.GetMinNetherPortalHeight()) || (PortalHeight > a_WorldInterface.GetMaxNetherPortalHeight()))\n\t\t{\n\t\t\t// The portal isn't high enough, or is too high\n\t\t\treturn;\n\t\t}\n\n\t\tif ((PortalWidth < a_WorldInterface.GetMinNetherPortalWidth()) || (PortalWidth > a_WorldInterface.GetMaxNetherPortalWidth()))\n\t\t{\n\t\t\t// The portal isn't wide enough, or is too wide\n\t\t\treturn;\n\t\t}\n\n\t\tfor (int Height = Y + 1; Height <= MaxY - 1; Height++)  // Loop through boundary to set portal blocks\n\t\t{\n\t\t\tfor (int Width = a_Scratch.XZM; Width <= a_Scratch.XZP; Width++)\n\t\t\t{\n\t\t\t\tif (a_Scratch.Dir == 1)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.SetBlock(Width, Height, Z, E_BLOCK_NETHER_PORTAL, a_Scratch.Dir);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta_ChunkInterface.SetBlock(X, Height, Width, E_BLOCK_NETHER_PORTAL, a_Scratch.Dir);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Evaluates if coordinates are a portal going XP / XM; returns true if so, and writes boundaries to variable\n\tTakes coordinates of base block and Y coord of target obsidian ceiling */\n\tstatic bool FindPortalSliceX(int X1, int X2, int Y, int Z, int MaxY, cChunkInterface & a_ChunkInterface, Scratch & a_Scratch)\n\t{\n\t\ta_Scratch.Dir = 1;  // Set assumed direction (will change if portal turns out to be facing the other direction)\n\t\tbool FoundFrameXP = false, FoundFrameXM = false;\n\t\tfor (; ((a_ChunkInterface.GetBlock({X1, Y, Z}) == E_BLOCK_OBSIDIAN) || (a_ChunkInterface.GetBlock({X1, Y + 1, Z}) == E_BLOCK_OBSIDIAN)); X1++)  // Check XP for obsidian blocks, exempting corners\n\t\t{\n\t\t\tint Value = FindObsidianCeiling(X1, Y, Z, a_ChunkInterface, MaxY);\n\t\t\tint ValueTwo = FindObsidianCeiling(X1, Y + 1, Z, a_ChunkInterface, MaxY);  // For corners without obsidian\n\t\t\tif ((Value == -1) || (ValueTwo == -1))  // FindObsidianCeiling returns -1 upon frame-find\n\t\t\t{\n\t\t\t\tFoundFrameXP = true;  // Found a frame border in this direction, proceed in other direction (don't go further)\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if ((Value != MaxY) && (ValueTwo != MaxY))  // Make sure that there is a valid portal 'slice'\n\t\t\t{\n\t\t\t\treturn false;  // Not valid slice, no portal can be formed\n\t\t\t}\n\t\t}\n\t\ta_Scratch.XZP = X1 - 1;  // Set boundary of frame interior\n\t\tfor (; ((a_ChunkInterface.GetBlock({X2, Y, Z}) == E_BLOCK_OBSIDIAN) || (a_ChunkInterface.GetBlock({X2, Y + 1, Z}) == E_BLOCK_OBSIDIAN)); X2--)  // Go the other direction (XM)\n\t\t{\n\t\t\tint Value = FindObsidianCeiling(X2, Y, Z, a_ChunkInterface, MaxY);\n\t\t\tint ValueTwo = FindObsidianCeiling(X2, Y + 1, Z, a_ChunkInterface, MaxY);\n\t\t\tif ((Value == -1) || (ValueTwo == -1))\n\t\t\t{\n\t\t\t\tFoundFrameXM = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if ((Value != MaxY) && (ValueTwo != MaxY))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\ta_Scratch.XZM = X2 + 1;  // Set boundary, see previous\n\n\t\treturn (FoundFrameXP && FoundFrameXM);\n\t}\n\n\t/** Evaluates if coords are a portal going ZP / ZM; returns true if so, and writes boundaries to variable */\n\tstatic bool FindPortalSliceZ(int X, int Y, int Z1, int Z2, int MaxY, cChunkInterface & a_ChunkInterface, Scratch & a_Scratch)\n\t{\n\t\ta_Scratch.Dir = 2;\n\t\tbool FoundFrameZP = false, FoundFrameZM = false;\n\t\tfor (; ((a_ChunkInterface.GetBlock({X, Y, Z1}) == E_BLOCK_OBSIDIAN) || (a_ChunkInterface.GetBlock({X, Y + 1, Z1}) == E_BLOCK_OBSIDIAN)); Z1++)\n\t\t{\n\t\t\tint Value = FindObsidianCeiling(X, Y, Z1, a_ChunkInterface, MaxY);\n\t\t\tint ValueTwo = FindObsidianCeiling(X, Y + 1, Z1, a_ChunkInterface, MaxY);\n\t\t\tif ((Value == -1) || (ValueTwo == -1))\n\t\t\t{\n\t\t\t\tFoundFrameZP = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if ((Value != MaxY) && (ValueTwo != MaxY))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\ta_Scratch.XZP = Z1 - 1;\n\t\tfor (; ((a_ChunkInterface.GetBlock({X, Y, Z2}) == E_BLOCK_OBSIDIAN) || (a_ChunkInterface.GetBlock({X, Y + 1, Z2}) == E_BLOCK_OBSIDIAN)); Z2--)\n\t\t{\n\t\t\tint Value = FindObsidianCeiling(X, Y, Z2, a_ChunkInterface, MaxY);\n\t\t\tint ValueTwo = FindObsidianCeiling(X, Y + 1, Z2, a_ChunkInterface, MaxY);\n\t\t\tif ((Value == -1) || (ValueTwo == -1))\n\t\t\t{\n\t\t\t\tFoundFrameZM = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if ((Value != MaxY) && (ValueTwo != MaxY))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\ta_Scratch.XZM = Z2 + 1;\n\n\t\treturn (FoundFrameZP && FoundFrameZM);\n\t}\n\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override\n\t{\n\t\treturn true;\n\t}\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 15;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockFlower.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/DirtLikeUnderneath.h\"\n\n\n\n\n\nclass cBlockFlowerHandler final :\n\tpublic cDirtLikeUnderneath<cBlockHandler>\n{\n\tusing Super = cDirtLikeUnderneath<cBlockHandler>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tNIBBLETYPE meta = a_BlockMeta & 0x7;\n\t\treturn cItem(m_BlockType, 1, meta);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockFlowerPot.h",
    "content": "\n#pragma once\n\n\n\n\n\nclass cBlockFlowerPotHandler final :\n\tpublic cBlockEntityHandler\n{\n\tusing Super = cBlockEntityHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_FLOWER_POT, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockFluid.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockFluidHandler :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\t~cBlockFluidHandler() = default;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// No pickups\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override\n\t{\n\t\treturn true;\n\t}\n} ;\n\n\n\n\n\nclass cBlockLavaHandler final :\n\tpublic cBlockFluidHandler\n{\n\tusing Super = cBlockFluidHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tif (a_Chunk.GetWorld()->ShouldLavaSpawnFire())\n\t\t{\n\t\t\t// Try to start up to 5 fires:\n\t\t\tfor (int i = 0; i < 5; i++)\n\t\t\t{\n\t\t\t\tTryStartFireNear(a_RelPos, a_Chunk);\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\t/** Tries to start a fire near the lava at given coords. Returns true if fire started. */\n\tstatic bool TryStartFireNear(const Vector3i a_RelPos, cChunk & a_Chunk)\n\t{\n\t\t// Pick a random block next to this lava block:\n\t\tint rnd = a_Chunk.GetWorld()->GetTickRandomNumber(cChunkDef::NumBlocks * 8) / 7;\n\t\tint x = (rnd % 3) - 1;         // -1 .. 1\n\t\tint y = ((rnd / 4) % 4) - 1;   // -1 .. 2\n\t\tint z = ((rnd / 16) % 3) - 1;  // -1 .. 1\n\t\tauto Pos = a_RelPos + Vector3i(x, y, z);\n\n\t\t// Check if it's fuel:\n\t\tBLOCKTYPE BlockType;\n\t\tif (\n\t\t\t!cChunkDef::IsValidHeight(Pos) ||\n\t\t\t!a_Chunk.UnboundedRelGetBlockType(Pos, BlockType) ||\n\t\t\t!cFireSimulator::IsFuel(BlockType)\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Try to set it on fire:\n\t\tstatic Vector3i CrossCoords[] =\n\t\t{\n\t\t\t{-1,  0,  0},\n\t\t\t{ 1,  0,  0},\n\t\t\t{ 0, -1,  0},\n\t\t\t{ 0,  1,  0},\n\t\t\t{ 0,  0, -1},\n\t\t\t{ 0,  0,  1},\n\t\t} ;\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(CrossCoords); i++)\n\t\t{\n\t\t\tauto NeighborPos = Pos + CrossCoords[i];\n\t\t\tif (\n\t\t\t\tcChunkDef::IsValidHeight(NeighborPos) &&\n\t\t\t\ta_Chunk.UnboundedRelGetBlockType(NeighborPos, BlockType) &&\n\t\t\t\t(BlockType == E_BLOCK_AIR)\n\t\t\t)\n\t\t\t{\n\t\t\t\t// This is an air block next to a fuel next to lava, light the fuel block up:\n\t\t\t\ta_Chunk.UnboundedRelSetBlock(NeighborPos, E_BLOCK_FIRE, 0);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}  // for i - CrossCoords[]\n\t\treturn false;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 4;\n\t}\n\n\n\n\n\n\tvirtual bool CanSustainPlant(BLOCKTYPE a_Plant) const override\n\t{\n\t\treturn false;\n\t}\n} ;\n\n\n\n\n\nclass cBlockWaterHandler final :\n\tpublic cBlockFluidHandler\n{\npublic:\n\n\tusing cBlockFluidHandler::cBlockFluidHandler;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\tif (IsBlockWater(m_BlockType))\n\t\t{\n\t\t\treturn 12;\n\t\t}\n\t\tASSERT(!\"Unhandled blocktype in fluid/water handler!\");\n\t\treturn 0;\n\t}\n\n\tvirtual bool CanSustainPlant(BLOCKTYPE a_Plant) const override\n\t{\n\t\treturn (\n\t\t\t(a_Plant == E_BLOCK_BEETROOTS) ||\n\t\t\t(a_Plant == E_BLOCK_CROPS) ||\n\t\t\t(a_Plant == E_BLOCK_CARROTS) ||\n\t\t\t(a_Plant == E_BLOCK_POTATOES) ||\n\t\t\t(a_Plant == E_BLOCK_MELON_STEM) ||\n\t\t\t(a_Plant == E_BLOCK_PUMPKIN_STEM)\n\t\t);\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockFurnace.h",
    "content": "\n#pragma once\n\n#include \"Mixins/Mixins.h\"\n\n\n\n\nclass cBlockFurnaceHandler final :\n\tpublic cYawRotator<cBlockEntityHandler, 0x07, 0x03, 0x04, 0x02, 0x05>\n{\n\tusing Super = cYawRotator<cBlockEntityHandler, 0x07, 0x03, 0x04, 0x02, 0x05>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_BLOCK_FURNACE);  // We can't drop a lit furnace\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 11;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockGlass.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockGlassHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Only drop self when mined with silk-touch:\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(m_BlockType, 1, a_BlockMeta);\n\t\t}\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockGlazedTerracotta.h",
    "content": "\n#pragma once\n\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cBlockGlazedTerracottaHandler final :\n\tpublic cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x00, 0x01, 0x02, 0x03>>\n{\n\tusing Super = cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x00, 0x01, 0x02, 0x03>>;\n\npublic:\n\n\tusing Super::Super;\n};\n"
  },
  {
    "path": "src/Blocks/BlockGlowstone.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockGlowstoneHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Drop self only when using silk-touch:\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(E_BLOCK_GLOWSTONE);\n\t\t}\n\n\t\t// Number of dust to drop, capped at the max amount of 4.\n\t\tconst auto DropNum = FortuneDiscreteRandom(2, 4, ToolFortuneLevel(a_Tool), 4);\n\t\treturn cItem(E_ITEM_GLOWSTONE_DUST, DropNum);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 2;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockGrass.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../FastRandom.h\"\n#include \"../Root.h\"\n#include \"../Bindings/PluginManager.h\"\n\n\n\n\n\nclass cBlockGrassHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tenum class Survivability\n\t{\n\t\t// Light level so good that the grass can try to spread to neighbours\n\t\tCanSpread,\n\n\t\t// Stay put, light is enough to live on but not propagate\n\t\tDoNothing,\n\n\t\t// Insufficient light, death is upon us\n\t\tDieInDarkness\n\t};\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tif (!ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(E_BLOCK_DIRT, 1, 0);\n\t\t}\n\t\treturn cItem(E_BLOCK_GRASS, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tif (!a_Chunk.IsLightValid())\n\t\t{\n\t\t\ta_Chunk.GetWorld()->QueueLightChunk(a_Chunk.GetPosX(), a_Chunk.GetPosZ());\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (cBlockGrassHandler::DetermineSurvivability(a_Chunk, a_RelPos))\n\t\t{\n\t\t\tcase Survivability::CanSpread: break;\n\t\t\tcase Survivability::DoNothing: return;\n\t\t\tcase Survivability::DieInDarkness:\n\t\t\t{\n\t\t\t\ta_Chunk.FastSetBlock(a_RelPos, E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Grass spreads to adjacent dirt blocks:\n\t\tfor (unsigned i = 0; i < 2; i++)  // Pick two blocks to grow to\n\t\t{\n\t\t\tauto & Random = GetRandomProvider();\n\t\t\tint OfsX = Random.RandInt(-1, 1);\n\t\t\tint OfsY = Random.RandInt(-3, 1);\n\t\t\tint OfsZ = Random.RandInt(-1, 1);\n\n\t\t\tcBlockGrassHandler::TrySpreadTo(a_Chunk, a_RelPos + Vector3i(OfsX, OfsY, OfsZ));\n\t\t}  // for i - repeat twice\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 1;\n\t}\n\nprivate:\n\n\t/** Check if conditions are favourable to a grass block at the given position.\n\tIf they are not, the grass dies and is turned to dirt.\n\tReturns whether conditions are so good that the grass can try to spread to neighbours. */\n\tstatic Survivability DetermineSurvivability(cChunk & a_Chunk, const Vector3i a_RelPos)\n\t{\n\t\tconst auto AbovePos = a_RelPos.addedY(1);\n\t\tif (!cChunkDef::IsValidHeight(AbovePos))\n\t\t{\n\t\t\treturn Survivability::CanSpread;\n\t\t}\n\n\t\t// Grass turns back to dirt when the block above it is not transparent or water.\n\t\t// It does not turn to dirt when a snow layer is above.\n\t\tconst auto Above = a_Chunk.GetBlock(AbovePos);\n\t\tif (\n\t\t\t(Above != E_BLOCK_SNOW) &&\n\t\t\t(!cBlockInfo::IsTransparent(Above) || IsBlockWater(Above)))\n\t\t{\n\t\t\treturn Survivability::DieInDarkness;\n\t\t}\n\n\t\t// Make sure that there is enough light at the source block to spread\n\t\tconst auto Light = std::max(a_Chunk.GetBlockLight(AbovePos), a_Chunk.GetSkyLightAltered(AbovePos));\n\t\treturn (Light >= 9) ? Survivability::CanSpread : Survivability::DoNothing;\n\t}\n\n\n\n\n\n\t/** Attempt to spread grass to a block at the given position. */\n\tstatic void TrySpreadTo(cChunk & a_Chunk, Vector3i a_RelPos)\n\t{\n\t\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t\t{\n\t\t\t// Y Coord out of range\n\t\t\treturn;\n\t\t}\n\n\t\tauto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(a_RelPos);\n\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t{\n\t\t\t// Unloaded chunk\n\t\t\treturn;\n\t\t}\n\n\t\tBLOCKTYPE  DestBlock;\n\t\tNIBBLETYPE DestMeta;\n\t\tChunk->GetBlockTypeMeta(a_RelPos, DestBlock, DestMeta);\n\n\t\tif ((DestBlock != E_BLOCK_DIRT) || (DestMeta != E_META_DIRT_NORMAL))\n\t\t{\n\t\t\t// Not a regular dirt block\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto AbovePos = a_RelPos.addedY(1);\n\t\tconst auto Above = Chunk->GetBlock(AbovePos);\n\t\tconst auto Light = std::max(Chunk->GetBlockLight(AbovePos), Chunk->GetSkyLightAltered(AbovePos));\n\n\t\tif (\n\t\t\t(Light > 4) &&\n\t\t\tcBlockInfo::IsTransparent(Above) &&\n\t\t\t!IsBlockLava(Above) &&\n\t\t\t!IsBlockWaterOrIce(Above)\n\t\t)\n\t\t{\n\t\t\tconst auto AbsPos = Chunk->RelativeToAbsolute(a_RelPos);\n\t\t\tif (!cRoot::Get()->GetPluginManager()->CallHookBlockSpread(*Chunk->GetWorld(), AbsPos, ssGrassSpread))\n\t\t\t{\n\t\t\t\tChunk->FastSetBlock(a_RelPos, E_BLOCK_GRASS, 0);\n\t\t\t}\n\t\t}\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockGravel.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockGravelHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(E_BLOCK_GRAVEL);\n\t\t}\n\n\t\t// Denominator of probability from wiki, don't let it go below 1.\n\t\tconst auto Denominator = std::max(10 - 3 * ToolFortuneLevel(a_Tool), 1);\n\t\tif (GetRandomProvider().RandBool(1.0 / Denominator))\n\t\t{\n\t\t\treturn cItem(E_ITEM_FLINT);\n\t\t}\n\n\t\treturn cItem(E_BLOCK_GRAVEL);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 11;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockHandler.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"BlockHandler.h\"\n#include \"../Item.h\"\n#include \"../World.h\"\n#include \"../Chunk.h\"\n#include \"BlockPluginInterface.h\"\n#include \"BlockAir.h\"\n#include \"BlockAnvil.h\"\n#include \"BlockBed.h\"\n#include \"BlockBigFlower.h\"\n#include \"BlockBookShelf.h\"\n#include \"BlockBrewingStand.h\"\n#include \"BlockButton.h\"\n#include \"BlockCactus.h\"\n#include \"BlockCake.h\"\n#include \"BlockCarpet.h\"\n#include \"BlockCauldron.h\"\n#include \"BlockChest.h\"\n#include \"BlockCloth.h\"\n#include \"BlockCobWeb.h\"\n#include \"BlockCocoaPod.h\"\n#include \"BlockCommandBlock.h\"\n#include \"BlockComparator.h\"\n#include \"BlockConcretePowder.h\"\n#include \"BlockCrops.h\"\n#include \"BlockDaylightSensor.h\"\n#include \"BlockDeadBush.h\"\n#include \"BlockDefaultBlock.h\"\n#include \"BlockDirt.h\"\n#include \"BlockDoor.h\"\n#include \"BlockDropSpenser.h\"\n#include \"BlockEnchantingTable.h\"\n#include \"BlockEndPortalFrame.h\"\n#include \"BlockEnderChest.h\"\n#include \"BlockEntity.h\"\n#include \"BlockFarmland.h\"\n#include \"BlockFence.h\"\n#include \"BlockFenceGate.h\"\n#include \"BlockFire.h\"\n#include \"BlockFlower.h\"\n#include \"BlockFlowerPot.h\"\n#include \"BlockFluid.h\"\n#include \"BlockFurnace.h\"\n#include \"BlockGlass.h\"\n#include \"BlockGlazedTerracotta.h\"\n#include \"BlockGlowstone.h\"\n#include \"BlockGrass.h\"\n#include \"BlockGravel.h\"\n#include \"BlockHopper.h\"\n#include \"BlockHugeMushroom.h\"\n#include \"BlockIce.h\"\n#include \"BlockJukebox.h\"\n#include \"BlockLadder.h\"\n#include \"BlockLeaves.h\"\n#include \"BlockLever.h\"\n#include \"BlockLilypad.h\"\n#include \"BlockMelon.h\"\n#include \"BlockMobHead.h\"\n#include \"BlockMobSpawner.h\"\n#include \"BlockInfested.h\"\n#include \"BlockMushroom.h\"\n#include \"BlockMycelium.h\"\n#include \"BlockNetherWart.h\"\n#include \"BlockNetherrack.h\"\n#include \"BlockNoteBlock.h\"\n#include \"BlockObserver.h\"\n#include \"BlockOre.h\"\n#include \"BlockPackedIce.h\"\n#include \"BlockPiston.h\"\n#include \"BlockPlanks.h\"\n#include \"BlockPortal.h\"\n#include \"BlockPressurePlate.h\"\n#include \"BlockPumpkin.h\"\n#include \"BlockQuartz.h\"\n#include \"BlockRail.h\"\n#include \"BlockRedstoneWire.h\"\n#include \"BlockRedstoneLamp.h\"\n#include \"BlockRedstoneOre.h\"\n#include \"BlockRedstoneRepeater.h\"\n#include \"BlockSand.h\"\n#include \"BlockSapling.h\"\n#include \"BlockSeaLantern.h\"\n#include \"BlockSideways.h\"\n#include \"BlockSignPost.h\"\n#include \"BlockSlab.h\"\n#include \"BlockSlime.h\"\n#include \"BlockSnow.h\"\n#include \"BlockSponge.h\"\n#include \"BlockStairs.h\"\n#include \"BlockStandingBanner.h\"\n#include \"BlockStems.h\"\n#include \"BlockStone.h\"\n#include \"BlockSugarCane.h\"\n#include \"BlockTNT.h\"\n#include \"BlockTallGrass.h\"\n#include \"BlockTorch.h\"\n#include \"BlockTrapdoor.h\"\n#include \"BlockTripwire.h\"\n#include \"BlockTripwireHook.h\"\n#include \"BlockVines.h\"\n#include \"BlockWallBanner.h\"\n#include \"BlockWallSign.h\"\n#include \"BlockWorkbench.h\"\n\n\n\n\n\n/*\n// Tests the meta rotation and mirroring.\n// Note that the cMetaRotator needs to have its assert paths disabled for this test to work!\nstatic class cBlockHandlerRotationTester\n{\npublic:\n\tcBlockHandlerRotationTester(void)\n\t{\n\t\tprintf(\"Performing block handlers test...\\n\");\n\t\tfor (BLOCKTYPE Type = 0; Type < E_BLOCK_MAX_TYPE_ID; Type++)\n\t\t{\n\t\t\tcBlockHandler * Handler = cBlockInfo::GetHandler(Type);\n\t\t\tif (Handler == nullptr)\n\t\t\t{\n\t\t\t\tprintf(\"nullptr handler for block type %d!\\n\", Type);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tAString BlockName = ItemTypeToString(Type);\n\t\t\tfor (NIBBLETYPE Meta = 0; Meta < 16; Meta++)\n\t\t\t{\n\t\t\t\t// Test the CW / CCW rotations:\n\t\t\t\tNIBBLETYPE TestMeta;\n\t\t\t\tTestMeta = Handler->MetaRotateCW(Handler->MetaRotateCW(Handler->MetaRotateCW(Handler->MetaRotateCW(Meta))));\n\t\t\t\tif (TestMeta != Meta)\n\t\t\t\t{\n\t\t\t\t\t// 4 CW rotations should produce no change in the meta\n\t\t\t\t\tprintf(\"Handler for blocktype %d (%s) fails CW 4-rotation test for meta %d: got back %d\\n\", Type, BlockName.c_str(), Meta, TestMeta);\n\t\t\t\t}\n\t\t\t\tTestMeta = Handler->MetaRotateCCW(Handler->MetaRotateCCW(Handler->MetaRotateCCW(Handler->MetaRotateCCW(Meta))));\n\t\t\t\tif (TestMeta != Meta)\n\t\t\t\t{\n\t\t\t\t\t// 4 CCW rotations should produce no change in the meta\n\t\t\t\t\tprintf(\"Handler for blocktype %d (%s) fails CCW 4-rotation test for meta %d: got back %d\\n\", Type, BlockName.c_str(), Meta, TestMeta);\n\t\t\t\t}\n\t\t\t\tTestMeta = Handler->MetaRotateCCW(Handler->MetaRotateCW(Meta));\n\t\t\t\tif (TestMeta != Meta)\n\t\t\t\t{\n\t\t\t\t\t// CCW rotation of a CW rotation should produce no change in the meta\n\t\t\t\t\tprintf(\"Handler for blocktype %d (%s) fails CCW(CW) rotation test for meta %d: got back %d\\n\", Type, BlockName.c_str(), Meta, TestMeta);\n\t\t\t\t}\n\t\t\t\tTestMeta = Handler->MetaRotateCW(Handler->MetaRotateCCW(Meta));\n\t\t\t\tif (TestMeta != Meta)\n\t\t\t\t{\n\t\t\t\t\t// CW rotation of a CCW rotation should produce no change in the meta\n\t\t\t\t\tprintf(\"Handler for blocktype %d (%s) fails CW(CCW) rotation test for meta %d: got back %d\\n\", Type, BlockName.c_str(), Meta, TestMeta);\n\t\t\t\t}\n\n\t\t\t\t// Test the mirroring:\n\t\t\t\tTestMeta = Handler->MetaMirrorXY(Handler->MetaMirrorXY(Meta));\n\t\t\t\tif (TestMeta != Meta)\n\t\t\t\t{\n\t\t\t\t\t// Double-mirroring should produce the same meta:\n\t\t\t\t\tprintf(\"Handler for blocktype %d (%s) fails XY mirror test for meta %d: got back %d\\n\", Type, BlockName.c_str(), Meta, TestMeta);\n\t\t\t\t}\n\t\t\t\tTestMeta = Handler->MetaMirrorXZ(Handler->MetaMirrorXZ(Meta));\n\t\t\t\tif (TestMeta != Meta)\n\t\t\t\t{\n\t\t\t\t\t// Double-mirroring should produce the same meta:\n\t\t\t\t\tprintf(\"Handler for blocktype %d (%s) fails XZ mirror test for meta %d: got back %d\\n\", Type, BlockName.c_str(), Meta, TestMeta);\n\t\t\t\t}\n\t\t\t\tTestMeta = Handler->MetaMirrorYZ(Handler->MetaMirrorYZ(Meta));\n\t\t\t\tif (TestMeta != Meta)\n\t\t\t\t{\n\t\t\t\t\t// Double-mirroring should produce the same meta:\n\t\t\t\t\tprintf(\"Handler for blocktype %d (%s) fails YZ mirror test for meta %d: got back %d\\n\", Type, BlockName.c_str(), Meta, TestMeta);\n\t\t\t\t}\n\n\t\t\t\t// Test mirror-rotating:\n\t\t\t\tTestMeta = Handler->MetaRotateCW(Handler->MetaRotateCW(Handler->MetaMirrorXY(Handler->MetaMirrorYZ(Meta))));\n\t\t\t\tif (TestMeta != Meta)\n\t\t\t\t{\n\t\t\t\t\t// 2 CW rotations should be the same as XY, YZ mirroring:\n\t\t\t\t\tprintf(\"Handler for blocktype %d (%s) fails rotation-mirror test for meta %d: got back %d\\n\", Type, BlockName.c_str(), Meta, TestMeta);\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for Type\n\t\tprintf(\"Block handlers test complete.\\n\");\n\t}\n} g_BlockHandlerRotationTester;\n//*/\n\n\n\n\n\n/** Static list of all block handlers.\nEnsures that a handler can never be nullptr (FS #243) on invalid during restarts or other transition periods. */\nnamespace\n{\n\tconstexpr cBlockDoorHandler               BlockAcaciaDoorHandler            (E_BLOCK_ACACIA_DOOR);\n\tconstexpr cBlockFenceGateHandler          BlockAcaciaFenceGateHandler       (E_BLOCK_ACACIA_FENCE_GATE);\n\tconstexpr cBlockFenceHandler              BlockAcaciaFenceHandler           (E_BLOCK_ACACIA_FENCE);\n\tconstexpr cBlockStairsHandler             BlockAcaciaWoodStairsHandler      (E_BLOCK_ACACIA_WOOD_STAIRS);\n\tconstexpr cBlockRailHandler               BlockActivatorRailHandler         (E_BLOCK_ACTIVATOR_RAIL);\n\tconstexpr cBlockComparatorHandler         BlockActiveComparatorHandler      (E_BLOCK_ACTIVE_COMPARATOR);\n\tconstexpr cBlockAirHandler                BlockAirHandler                   (E_BLOCK_AIR);\n\tconstexpr cBlockAnvilHandler              BlockAnvilHandler                 (E_BLOCK_ANVIL);\n\tconstexpr cDefaultBlockHandler            BlockBarrierHandler               (E_BLOCK_BARRIER);\n\tconstexpr cDefaultBlockEntityHandler      BlockBeaconHandler                (E_BLOCK_BEACON);\n\tconstexpr cBlockBedHandler                BlockBedHandler                   (E_BLOCK_BED);\n\tconstexpr cDefaultBlockHandler            BlockBedrockHandler               (E_BLOCK_BEDROCK);\n\tconstexpr cBlockCropsHandler<3>           BlockBeetrootsHandler             (E_BLOCK_BEETROOTS);  // 4 stages of growth\n\tconstexpr cBlockBigFlowerHandler          BlockBigFlowerHandler             (E_BLOCK_BIG_FLOWER);\n\tconstexpr cBlockDoorHandler               BlockBirchDoorHandler             (E_BLOCK_BIRCH_DOOR);\n\tconstexpr cBlockFenceGateHandler          BlockBirchFenceGateHandler        (E_BLOCK_BIRCH_FENCE_GATE);\n\tconstexpr cBlockFenceHandler              BlockBirchFenceHandler            (E_BLOCK_BIRCH_FENCE);\n\tconstexpr cBlockStairsHandler             BlockBirchWoodStairsHandler       (E_BLOCK_BIRCH_WOOD_STAIRS);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockBlackGlazedTerracottaHandler (E_BLOCK_BLACK_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockBlackShulkerBoxHandler       (E_BLOCK_BLACK_SHULKER_BOX);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockBlueGlazedTerracottaHandler  (E_BLOCK_BLUE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockBlueShulkerBoxHandler        (E_BLOCK_BLUE_SHULKER_BOX);\n\tconstexpr cDefaultBlockHandler            BlockBoneBlockHandler             (E_BLOCK_BONE_BLOCK);\n\tconstexpr cBlockBookShelfHandler          BlockBookcaseHandler              (E_BLOCK_BOOKCASE);\n\tconstexpr cBlockBrewingStandHandler       BlockBrewingStandHandler          (E_BLOCK_BREWING_STAND);\n\tconstexpr cDefaultBlockHandler            BlockBricksHandler                (E_BLOCK_BRICK);\n\tconstexpr cBlockStairsHandler             BlockBrickStairsHandler           (E_BLOCK_BRICK_STAIRS);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockBrownGlazedTerracottaHandler (E_BLOCK_BROWN_GLAZED_TERRACOTTA);\n\tconstexpr cBlockMushroomHandler           BlockBrownMushroomHandler         (E_BLOCK_BROWN_MUSHROOM);\n\tconstexpr cDefaultBlockHandler            BlockBrownShulkerBoxHandler       (E_BLOCK_BROWN_SHULKER_BOX);\n\tconstexpr cBlockCactusHandler             BlockCactusHandler                (E_BLOCK_CACTUS);\n\tconstexpr cBlockCakeHandler               BlockCakeHandler                  (E_BLOCK_CAKE);\n\tconstexpr cBlockCarpetHandler             BlockCarpetHandler                (E_BLOCK_CARPET);\n\tconstexpr cBlockCropsHandler<7>           BlockCarrotsHandler               (E_BLOCK_CARROTS);  // 8 stages of growth\n\tconstexpr cBlockCauldronHandler           BlockCauldronHandler              (E_BLOCK_CAULDRON);\n\tconstexpr cBlockCommandBlockHandler       BlockChainCommandBlockHandler     (E_BLOCK_CHAIN_COMMAND_BLOCK);\n\tconstexpr cBlockChestHandler              BlockChestHandler                 (E_BLOCK_CHEST);\n\tconstexpr cDefaultBlockHandler            BlockChorusFlowerHandler          (E_BLOCK_CHORUS_FLOWER);\n\tconstexpr cDefaultBlockHandler            BlockChorusPlantHandler           (E_BLOCK_CHORUS_PLANT);\n\tconstexpr cDefaultOreHandler              BlockClayHandler                  (E_BLOCK_CLAY);\n\tconstexpr cDefaultBlockHandler            BlockCoalBlockHandler             (E_BLOCK_BLOCK_OF_COAL);\n\tconstexpr cDefaultOreHandler              BlockCoalOreHandler               (E_BLOCK_COAL_ORE);\n\tconstexpr cDefaultBlockHandler            BlockCobblestoneHandler           (E_BLOCK_COBBLESTONE);\n\tconstexpr cBlockStairsHandler             BlockCobblestoneStairsHandler     (E_BLOCK_COBBLESTONE_STAIRS);\n\tconstexpr cDefaultBlockHandler            BlockCobblestoneWallHandler       (E_BLOCK_COBBLESTONE_WALL);\n\tconstexpr cBlockCobWebHandler             BlockCobwebHandler                (E_BLOCK_COBWEB);\n\tconstexpr cBlockCocoaPodHandler           BlockCocoaPodHandler              (E_BLOCK_COCOA_POD);\n\tconstexpr cBlockCommandBlockHandler       BlockCommandBlockHandler          (E_BLOCK_COMMAND_BLOCK);\n\tconstexpr cDefaultBlockHandler            BlockConcreteHandler              (E_BLOCK_CONCRETE);\n\tconstexpr cBlockConcretePowderHandler     BlockConcretePowderHandler        (E_BLOCK_CONCRETE_POWDER);\n\tconstexpr cBlockCropsHandler<7>           BlockCropsHandler                 (E_BLOCK_CROPS);  // 8 stages of growth\n\tconstexpr cBlockGlazedTerracottaHandler   BlockCyanGlazedTerracottaHandler  (E_BLOCK_CYAN_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockCyanShulkerBoxHandler        (E_BLOCK_CYAN_SHULKER_BOX);\n\tconstexpr cBlockDoorHandler               BlockDarkOakDoorHandler           (E_BLOCK_DARK_OAK_DOOR);\n\tconstexpr cBlockFenceGateHandler          BlockDarkOakFenceGateHandler      (E_BLOCK_DARK_OAK_FENCE_GATE);\n\tconstexpr cBlockFenceHandler              BlockDarkOakFenceHandler          (E_BLOCK_DARK_OAK_FENCE);\n\tconstexpr cBlockStairsHandler             BlockDarkOakWoodStairsHandler     (E_BLOCK_DARK_OAK_WOOD_STAIRS);\n\tconstexpr cBlockDaylightSensorHandler     BlockDaylightSensorHandler        (E_BLOCK_DAYLIGHT_SENSOR);\n\tconstexpr cBlockDeadBushHandler           BlockDeadBushHandler              (E_BLOCK_DEAD_BUSH);\n\tconstexpr cBlockRailHandler               BlockDetectorRailHandler          (E_BLOCK_DETECTOR_RAIL);\n\tconstexpr cDefaultBlockHandler            BlockDiamondBlockHandler          (E_BLOCK_DIAMOND_BLOCK);\n\tconstexpr cDefaultOreHandler              BlockDiamondOreHandler            (E_BLOCK_DIAMOND_ORE);\n\tconstexpr cBlockDirtHandler               BlockDirtHandler                  (E_BLOCK_DIRT);\n\tconstexpr cBlockDropSpenserHandler        BlockDispenserHandler             (E_BLOCK_DISPENSER);\n\tconstexpr cBlockDoubleSlabHandler         BlockDoubleRedSandstoneSlabHandler(E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB);\n\tconstexpr cBlockDoubleSlabHandler         BlockDoubleStoneSlabHandler       (E_BLOCK_DOUBLE_STONE_SLAB);\n\tconstexpr cBlockDoubleSlabHandler         BlockDoubleWoodenSlabHandler      (E_BLOCK_DOUBLE_WOODEN_SLAB);\n\tconstexpr cDefaultBlockHandler            BlockDragonEggHandler             (E_BLOCK_DRAGON_EGG);\n\tconstexpr cBlockDropSpenserHandler        BlockDropperHandler               (E_BLOCK_DROPPER);\n\tconstexpr cDefaultBlockHandler            BlockEmeraldBlockHandler          (E_BLOCK_EMERALD_BLOCK);\n\tconstexpr cDefaultOreHandler              BlockEmeraldOreHandler            (E_BLOCK_EMERALD_ORE);\n\tconstexpr cBlockEnchantingTableHandler    BlockEnchantingTableHandler       (E_BLOCK_ENCHANTMENT_TABLE);\n\tconstexpr cDefaultBlockHandler            BlockEndBricksHandler             (E_BLOCK_END_BRICKS);\n\tconstexpr cBlockEnderChestHandler         BlockEnderChestHandler            (E_BLOCK_ENDER_CHEST);\n\tconstexpr cDefaultBlockHandler            BlockEndGatewayHandler            (E_BLOCK_END_GATEWAY);\n\tconstexpr cBlockEndPortalFrameHandler     BlockEndPortalFrameHandler        (E_BLOCK_END_PORTAL_FRAME);\n\tconstexpr cDefaultBlockHandler            BlockEndPortalHandler             (E_BLOCK_END_PORTAL);\n\tconstexpr cDefaultBlockHandler            BlockEndRodHandler                (E_BLOCK_END_ROD);\n\tconstexpr cDefaultBlockHandler            BlockEndStoneHandler              (E_BLOCK_END_STONE);\n\tconstexpr cBlockFarmlandHandler           BlockFarmlandHandler              (E_BLOCK_FARMLAND);\n\tconstexpr cBlockFenceHandler              BlockFenceHandler                 (E_BLOCK_FENCE);\n\tconstexpr cBlockFireHandler               BlockFireHandler                  (E_BLOCK_FIRE);\n\tconstexpr cBlockFlowerPotHandler          BlockFlowerPotHandler             (E_BLOCK_FLOWER_POT);\n\tconstexpr cBlockIceHandler                BlockFrostedIceHandler            (E_BLOCK_FROSTED_ICE);\n\tconstexpr cBlockFurnaceHandler            BlockFurnaceHandler               (E_BLOCK_FURNACE);\n\tconstexpr cBlockGlassHandler              BlockGlassHandler                 (E_BLOCK_GLASS);\n\tconstexpr cBlockGlassHandler              BlockGlassPaneHandler             (E_BLOCK_GLASS_PANE);\n\tconstexpr cBlockGlowstoneHandler          BlockGlowstoneHandler             (E_BLOCK_GLOWSTONE);\n\tconstexpr cDefaultBlockHandler            BlockGoldBlockHandler             (E_BLOCK_GOLD_BLOCK);\n\tconstexpr cDefaultOreHandler              BlockGoldOreHandler               (E_BLOCK_GOLD_ORE);\n\tconstexpr cBlockGrassHandler              BlockGrassHandler                 (E_BLOCK_GRASS);\n\tconstexpr cDefaultBlockHandler            BlockGrassPathHandler             (E_BLOCK_GRASS_PATH);\n\tconstexpr cBlockGravelHandler             BlockGravelHandler                (E_BLOCK_GRAVEL);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockGrayGlazedTerracottaHandler  (E_BLOCK_GRAY_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockGrayShulkerBoxHandler        (E_BLOCK_GRAY_SHULKER_BOX);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockGreenGlazedTerracottaHandler (E_BLOCK_GREEN_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockGreenShulkerBoxHandler       (E_BLOCK_GREEN_SHULKER_BOX);\n\tconstexpr cDefaultBlockHandler            BlockHardenedClayHandler          (E_BLOCK_HARDENED_CLAY);\n\tconstexpr cBlockSidewaysHandler           BlockHayBaleHandler               (E_BLOCK_HAY_BALE);\n\tconstexpr cBlockMobHeadHandler            BlockHeadHandler                  (E_BLOCK_HEAD);\n\tconstexpr cBlockPressurePlateHandler      BlockHeavyWeightedPressurePHandler(E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE);\n\tconstexpr cBlockHopperHandler             BlockHopperHandler                (E_BLOCK_HOPPER);\n\tconstexpr cBlockHugeMushroomHandler       BlockHugeBrownMushroomHandler     (E_BLOCK_HUGE_BROWN_MUSHROOM);\n\tconstexpr cBlockHugeMushroomHandler       BlockHugeRedMushroomHandler       (E_BLOCK_HUGE_RED_MUSHROOM);\n\tconstexpr cBlockIceHandler                BlockIceHandler                   (E_BLOCK_ICE);\n\tconstexpr cBlockComparatorHandler         BlockInactiveComparatorHandler    (E_BLOCK_INACTIVE_COMPARATOR);\n\tconstexpr cBlockInfestedHandler           BlockInfestedBlockHandler         (E_BLOCK_SILVERFISH_EGG);\n\tconstexpr cDefaultBlockHandler            BlockIronBarsHandler              (E_BLOCK_IRON_BARS);\n\tconstexpr cDefaultBlockHandler            BlockIronBlockHandler             (E_BLOCK_IRON_BLOCK);\n\tconstexpr cBlockDoorHandler               BlockIronDoorHandler              (E_BLOCK_IRON_DOOR);\n\tconstexpr cDefaultOreHandler              BlockIronOreHandler               (E_BLOCK_IRON_ORE);\n\tconstexpr cBlockTrapdoorHandler           BlockIronTrapdoorHandler          (E_BLOCK_IRON_TRAPDOOR);\n\tconstexpr cBlockPumpkinHandler            BlockJackOLanternHandler          (E_BLOCK_JACK_O_LANTERN);\n\tconstexpr cBlockJukeboxHandler            BlockJukeboxHandler               (E_BLOCK_JUKEBOX);\n\tconstexpr cBlockDoorHandler               BlockJungleDoorHandler            (E_BLOCK_JUNGLE_DOOR);\n\tconstexpr cBlockFenceGateHandler          BlockJungleFenceGateHandler       (E_BLOCK_JUNGLE_FENCE_GATE);\n\tconstexpr cBlockFenceHandler              BlockJungleFenceHandler           (E_BLOCK_JUNGLE_FENCE);\n\tconstexpr cBlockStairsHandler             BlockJungleWoodStairsHandler      (E_BLOCK_JUNGLE_WOOD_STAIRS);\n\tconstexpr cBlockLadderHandler             BlockLadderHandler                (E_BLOCK_LADDER);\n\tconstexpr cDefaultBlockHandler            BlockLapisBlockHandler            (E_BLOCK_LAPIS_BLOCK);\n\tconstexpr cDefaultOreHandler              BlockLapisOreHandler              (E_BLOCK_LAPIS_ORE);\n\tconstexpr cBlockLavaHandler               BlockLavaHandler                  (E_BLOCK_LAVA);\n\tconstexpr cBlockLeavesHandler             BlockLeavesHandler                (E_BLOCK_LEAVES);\n\tconstexpr cBlockLeverHandler              BlockLeverHandler                 (E_BLOCK_LEVER);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockLightBlueGlazedTerracoHandler(E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockLightBlueShulkerBoxHandler   (E_BLOCK_LIGHT_BLUE_SHULKER_BOX);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockLightGrayGlazedTerracoHandler(E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockLightGrayShulkerBoxHandler   (E_BLOCK_LIGHT_GRAY_SHULKER_BOX);\n\tconstexpr cBlockPressurePlateHandler      BlockLightWeightedPressurePHandler(E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE);\n\tconstexpr cBlockLilypadHandler            BlockLilyPadHandler               (E_BLOCK_LILY_PAD);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockLimeGlazedTerracottaHandler  (E_BLOCK_LIME_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockLimeShulkerBoxHandler        (E_BLOCK_LIME_SHULKER_BOX);\n\tconstexpr cBlockFurnaceHandler            BlockLitFurnaceHandler            (E_BLOCK_LIT_FURNACE);\n\tconstexpr cBlockSidewaysHandler           BlockLogHandler                   (E_BLOCK_LOG);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockMagentaGlazedTerracottHandler(E_BLOCK_MAGENTA_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockMagentaShulkerBoxHandler     (E_BLOCK_MAGENTA_SHULKER_BOX);\n\tconstexpr cDefaultBlockHandler            BlockMagmaHandler                 (E_BLOCK_MAGMA);\n\tconstexpr cBlockMelonHandler              BlockMelonHandler                 (E_BLOCK_MELON);\n\tconstexpr cBlockMelonStemHandler          BlockMelonStemHandler             (E_BLOCK_MELON_STEM);\n\tconstexpr cBlockMobSpawnerHandler         BlockMobSpawnerHandler            (E_BLOCK_MOB_SPAWNER);\n\tconstexpr cDefaultBlockHandler            BlockMossyCobblestoneHandler      (E_BLOCK_MOSSY_COBBLESTONE);\n\tconstexpr cBlockMyceliumHandler           BlockMyceliumHandler              (E_BLOCK_MYCELIUM);\n\tconstexpr cBlockFenceHandler              BlockNetherBrickFenceHandler      (E_BLOCK_NETHER_BRICK_FENCE);\n\tconstexpr cDefaultBlockHandler            BlockNetherBricksHandler          (E_BLOCK_NETHER_BRICK);\n\tconstexpr cBlockStairsHandler             BlockNetherBrickStairsHandler     (E_BLOCK_NETHER_BRICK_STAIRS);\n\tconstexpr cBlockPortalHandler             BlockNetherPortalHandler          (E_BLOCK_NETHER_PORTAL);\n\tconstexpr cDefaultOreHandler              BlockNetherQuartzOreHandler       (E_BLOCK_NETHER_QUARTZ_ORE);\n\tconstexpr cBlockNetherrack                BlockNetherrackHandler            (E_BLOCK_NETHERRACK);\n\tconstexpr cDefaultBlockHandler            BlockNetherWartBlockHandler       (E_BLOCK_NETHER_WART_BLOCK);\n\tconstexpr cBlockNetherWartHandler         BlockNetherWartHandler            (E_BLOCK_NETHER_WART);\n\tconstexpr cBlockLeavesHandler             BlockNewLeavesHandler             (E_BLOCK_NEW_LEAVES);\n\tconstexpr cBlockSidewaysHandler           BlockNewLogHandler                (E_BLOCK_NEW_LOG);\n\tconstexpr cBlockNoteBlockHandler          BlockNoteBlockHandler             (E_BLOCK_NOTE_BLOCK);\n\tconstexpr cBlockDoorHandler               BlockOakDoorHandler               (E_BLOCK_OAK_DOOR);\n\tconstexpr cBlockFenceGateHandler          BlockOakFenceGateHandler          (E_BLOCK_OAK_FENCE_GATE);\n\tconstexpr cBlockStairsHandler             BlockOakWoodStairsHandler         (E_BLOCK_OAK_WOOD_STAIRS);\n\tconstexpr cBlockObserverHandler           BlockObserverHandler              (E_BLOCK_OBSERVER);\n\tconstexpr cDefaultBlockHandler            BlockObsidianHandler              (E_BLOCK_OBSIDIAN);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockOrangeGlazedTerracottaHandler(E_BLOCK_ORANGE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockOrangeShulkerBoxHandler      (E_BLOCK_ORANGE_SHULKER_BOX);\n\tconstexpr cBlockPackedIceHandler          BlockPackedIceHandler             (E_BLOCK_PACKED_ICE);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockPinkGlazedTerracottaHandler  (E_BLOCK_PINK_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockPinkShulkerBoxHandler        (E_BLOCK_PINK_SHULKER_BOX);\n\tconstexpr cBlockPistonHandler             BlockPistonHandler                (E_BLOCK_PISTON);\n\tconstexpr cBlockPistonHeadHandler         BlockPistonHeadHandler;\n\tconstexpr cDefaultBlockHandler            BlockPistonMovedBlockHandler      (E_BLOCK_PISTON_MOVED_BLOCK);\n\tconstexpr cBlockPlanksHandler             BlockPlanksHandler                (E_BLOCK_PLANKS);\n\tconstexpr cBlockCropsHandler<7>           BlockPotatoesHandler              (E_BLOCK_POTATOES);  // 8 stages of growth\n\tconstexpr cBlockRailHandler               BlockPoweredRailHandler           (E_BLOCK_POWERED_RAIL);\n\tconstexpr cDefaultBlockHandler            BlockPrismarineBlockHandler       (E_BLOCK_PRISMARINE_BLOCK);\n\tconstexpr cBlockPumpkinHandler            BlockPumpkinHandler               (E_BLOCK_PUMPKIN);\n\tconstexpr cBlockPumpkinStemHandler        BlockPumpkinStemHandler           (E_BLOCK_PUMPKIN_STEM);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockPurpleGlazedTerracottaHandler(E_BLOCK_PURPLE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockPurpleShulkerBoxHandler      (E_BLOCK_PURPLE_SHULKER_BOX);\n\tconstexpr cDefaultBlockHandler            BlockPurpurBlockHandler           (E_BLOCK_PURPUR_BLOCK);\n\tconstexpr cBlockDoubleSlabHandler         BlockPurpurDoubleSlabHandler      (E_BLOCK_PURPUR_DOUBLE_SLAB);\n\tconstexpr cDefaultBlockHandler            BlockPurpurPillarHandler          (E_BLOCK_PURPUR_PILLAR);\n\tconstexpr cBlockSlabHandler               BlockPurpurSlabHandler            (E_BLOCK_PURPUR_SLAB);\n\tconstexpr cBlockStairsHandler             BlockPurpurStairsHandler          (E_BLOCK_PURPUR_STAIRS);\n\tconstexpr cBlockQuartzHandler             BlockQuartzBlockHandler           (E_BLOCK_QUARTZ_BLOCK);\n\tconstexpr cBlockStairsHandler             BlockQuartzStairsHandler          (E_BLOCK_QUARTZ_STAIRS);\n\tconstexpr cBlockRailHandler               BlockRailHandler                  (E_BLOCK_RAIL);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockRedGlazedTerracottaHandler   (E_BLOCK_RED_GLAZED_TERRACOTTA);\n\tconstexpr cBlockMushroomHandler           BlockRedMushroomHandler           (E_BLOCK_RED_MUSHROOM);\n\tconstexpr cDefaultBlockHandler            BlockRedNetherBricksHandler       (E_BLOCK_RED_NETHER_BRICK);\n\tconstexpr cBlockFlowerHandler             BlockRedRoseHandler               (E_BLOCK_RED_ROSE);\n\tconstexpr cDefaultBlockHandler            BlockRedSandstoneHandler          (E_BLOCK_RED_SANDSTONE);\n\tconstexpr cBlockSlabHandler               BlockRedSandstoneSlabHandler      (E_BLOCK_RED_SANDSTONE_SLAB);\n\tconstexpr cBlockStairsHandler             BlockRedSandstoneStairsHandler    (E_BLOCK_RED_SANDSTONE_STAIRS);\n\tconstexpr cDefaultBlockHandler            BlockRedShulkerBoxHandler         (E_BLOCK_RED_SHULKER_BOX);\n\tconstexpr cDefaultBlockHandler            BlockRedstoneBlockHandler         (E_BLOCK_BLOCK_OF_REDSTONE);\n\tconstexpr cBlockRedstoneLampHandler       BlockRedstoneLampHandler          (E_BLOCK_REDSTONE_LAMP_ON);\n\tconstexpr cBlockGlowingRedstoneOreHandler BlockRedstoneOreGlowingHandler    (E_BLOCK_REDSTONE_ORE_GLOWING);\n\tconstexpr cBlockRedstoneOreHandler        BlockRedstoneOreHandler           (E_BLOCK_REDSTONE_ORE);\n\tconstexpr cBlockRedstoneRepeaterHandler   BlockRedstoneRepeaterOffHandler   (E_BLOCK_REDSTONE_REPEATER_OFF);\n\tconstexpr cBlockRedstoneRepeaterHandler   BlockRedstoneRepeaterOnHandler    (E_BLOCK_REDSTONE_REPEATER_ON);\n\tconstexpr cBlockRedstoneTorchHandler      BlockRedstoneTorchOffHandler      (E_BLOCK_REDSTONE_TORCH_OFF);\n\tconstexpr cBlockRedstoneTorchHandler      BlockRedstoneTorchOnHandler       (E_BLOCK_REDSTONE_TORCH_ON);\n\tconstexpr cBlockRedstoneWireHandler       BlockRedstoneWireHandler          (E_BLOCK_REDSTONE_WIRE);\n\tconstexpr cBlockCommandBlockHandler       BlockRepeatingCommandBlockHandler (E_BLOCK_REPEATING_COMMAND_BLOCK);\n\tconstexpr cBlockSandHandler               BlockSandHandler                  (E_BLOCK_SAND);\n\tconstexpr cDefaultBlockHandler            BlockSandstoneHandler             (E_BLOCK_SANDSTONE);\n\tconstexpr cBlockStairsHandler             BlockSandstoneStairsHandler       (E_BLOCK_SANDSTONE_STAIRS);\n\tconstexpr cBlockSaplingHandler            BlockSaplingHandler               (E_BLOCK_SAPLING);\n\tconstexpr cBlockSeaLanternHandler         BlockSeaLanternHandler            (E_BLOCK_SEA_LANTERN);\n\tconstexpr cBlockSignPostHandler           BlockSignPostHandler              (E_BLOCK_SIGN_POST);\n\tconstexpr cBlockSlimeHandler              BlockSlimeBlockHandler            (E_BLOCK_SLIME_BLOCK);\n\tconstexpr cDefaultBlockHandler            BlockSnowBlockHandler             (E_BLOCK_SNOW_BLOCK);\n\tconstexpr cBlockSnowHandler               BlockSnowHandler                  (E_BLOCK_SNOW);\n\tconstexpr cDefaultBlockHandler            BlockSoulSandHandler              (E_BLOCK_SOULSAND);\n\tconstexpr cBlockSpongeHandler             BlockSpongeHandler                (E_BLOCK_SPONGE);\n\tconstexpr cBlockDoorHandler               BlockSpruceDoorHandler            (E_BLOCK_SPRUCE_DOOR);\n\tconstexpr cBlockFenceGateHandler          BlockSpruceFenceGateHandler       (E_BLOCK_SPRUCE_FENCE_GATE);\n\tconstexpr cBlockFenceHandler              BlockSpruceFenceHandler           (E_BLOCK_SPRUCE_FENCE);\n\tconstexpr cBlockStairsHandler             BlockSpruceWoodStairsHandler      (E_BLOCK_SPRUCE_WOOD_STAIRS);\n\tconstexpr cDefaultBlockHandler            BlockStainedClayHandler           (E_BLOCK_STAINED_CLAY);\n\tconstexpr cBlockGlassHandler              BlockStainedGlassHandler          (E_BLOCK_STAINED_GLASS);\n\tconstexpr cBlockGlassHandler              BlockStainedGlassPaneHandler      (E_BLOCK_STAINED_GLASS_PANE);\n\tconstexpr cBlockStandingBannerHandler     BlockStandingBannerHandler        (E_BLOCK_STANDING_BANNER);\n\tconstexpr cBlockLavaHandler               BlockStationaryLavaHandler        (E_BLOCK_STATIONARY_LAVA);\n\tconstexpr cBlockWaterHandler              BlockStationaryWaterHandler       (E_BLOCK_STATIONARY_WATER);\n\tconstexpr cBlockPistonHandler             BlockStickyPistonHandler          (E_BLOCK_STICKY_PISTON);\n\tconstexpr cDefaultBlockHandler            BlockStoneBricksHandler           (E_BLOCK_STONE_BRICKS);\n\tconstexpr cBlockStairsHandler             BlockStoneBrickStairsHandler      (E_BLOCK_STONE_BRICK_STAIRS);\n\tconstexpr cBlockButtonHandler             BlockStoneButtonHandler           (E_BLOCK_STONE_BUTTON);\n\tconstexpr cBlockStoneHandler              BlockStoneHandler                 (E_BLOCK_STONE);\n\tconstexpr cBlockPressurePlateHandler      BlockStonePressurePlateHandler    (E_BLOCK_STONE_PRESSURE_PLATE);\n\tconstexpr cBlockSlabHandler               BlockStoneSlabHandler             (E_BLOCK_STONE_SLAB);\n\tconstexpr cDefaultBlockHandler            BlockStructureBlockHandler        (E_BLOCK_STRUCTURE_BLOCK);\n\tconstexpr cDefaultBlockHandler            BlockStructureVoidHandler         (E_BLOCK_STRUCTURE_VOID);\n\tconstexpr cBlockSugarCaneHandler          BlockSugarCaneHandler             (E_BLOCK_SUGARCANE);\n\tconstexpr cBlockTallGrassHandler          BlockTallGrassHandler             (E_BLOCK_TALL_GRASS);\n\tconstexpr cBlockTNTHandler                BlockTNTHandler                   (E_BLOCK_TNT);\n\tconstexpr cBlockTorchHandler              BlockTorchHandler                 (E_BLOCK_TORCH);\n\tconstexpr cBlockTrapdoorHandler           BlockTrapdoorHandler              (E_BLOCK_TRAPDOOR);\n\tconstexpr cBlockChestHandler              BlockTrappedChestHandler          (E_BLOCK_TRAPPED_CHEST);\n\tconstexpr cBlockTripwireHandler           BlockTripwireHandler              (E_BLOCK_TRIPWIRE);\n\tconstexpr cBlockTripwireHookHandler       BlockTripwireHookHandler          (E_BLOCK_TRIPWIRE_HOOK);\n\tconstexpr cBlockVinesHandler              BlockVinesHandler                 (E_BLOCK_VINES);\n\tconstexpr cBlockWallBannerHandler         BlockWallBannerHandler            (E_BLOCK_WALL_BANNER);\n\tconstexpr cBlockWallSignHandler           BlockWallsignHandler              (E_BLOCK_WALLSIGN);\n\tconstexpr cBlockWaterHandler              BlockWaterHandler                 (E_BLOCK_WATER);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockWhiteGlazedTerracottaHandler (E_BLOCK_WHITE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockWhiteShulkerBoxHandler       (E_BLOCK_WHITE_SHULKER_BOX);\n\tconstexpr cBlockButtonHandler             BlockWoodenButtonHandler          (E_BLOCK_WOODEN_BUTTON);\n\tconstexpr cBlockPressurePlateHandler      BlockWoodenPressurePlateHandler   (E_BLOCK_WOODEN_PRESSURE_PLATE);\n\tconstexpr cBlockSlabHandler               BlockWoodenSlabHandler            (E_BLOCK_WOODEN_SLAB);\n\tconstexpr cBlockClothHandler              BlockWoolHandler                  (E_BLOCK_WOOL);\n\tconstexpr cBlockWorkbenchHandler          BlockWorkbenchHandler             (E_BLOCK_WORKBENCH);\n\tconstexpr cBlockFlowerHandler             BlockYellowFlowerHandler          (E_BLOCK_YELLOW_FLOWER);\n\tconstexpr cBlockGlazedTerracottaHandler   BlockYellowGlazedTerracottaHandler(E_BLOCK_YELLOW_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultBlockHandler            BlockYellowShulkerBoxHandler      (E_BLOCK_YELLOW_SHULKER_BOX);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBlockHandler:\n\nvoid cBlockHandler::OnUpdate(\n\tcChunkInterface & a_ChunkInterface,\n\tcWorldInterface & a_WorldInterface,\n\tcBlockPluginInterface & a_PluginInterface,\n\tcChunk & a_Chunk,\n\tconst Vector3i a_RelPos\n) const\n{\n}\n\n\n\n\n\nvoid cBlockHandler::OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const\n{\n\tif (a_ChunkInterface.DoWithChunkAt(a_BlockPos, [&](cChunk & a_Chunk) { return CanBeAt(a_Chunk, cChunkDef::AbsoluteToRelative(a_BlockPos), a_Chunk.GetMeta(cChunkDef::AbsoluteToRelative(a_BlockPos))); }))\n\t{\n\t\treturn;\n\t}\n\n\ta_ChunkInterface.DropBlockAsPickups(a_BlockPos);\n}\n\n\n\n\n\nvoid cBlockHandler::NeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_NeighborPos, eBlockFace a_WhichNeighbor)\n{\n\tif (!cChunkDef::IsValidHeight(a_NeighborPos))\n\t{\n\t\treturn;\n\t}\n\n\tcBlockHandler::For(a_ChunkInterface.GetBlock(a_NeighborPos)).OnNeighborChanged(a_ChunkInterface, a_NeighborPos, a_WhichNeighbor);\n}\n\n\n\n\n\ncItems cBlockHandler::ConvertToPickups(NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const\n{\n\tUNUSED(a_Tool);\n\n\t// Add self:\n\treturn cItem(m_BlockType, 1, a_BlockMeta);\n}\n\n\n\n\n\nbool cBlockHandler::CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const\n{\n\treturn true;\n}\n\n\n\n\n\nbool cBlockHandler::IsUseable() const\n{\n\treturn false;\n}\n\n\n\n\n\nbool cBlockHandler::DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const\n{\n\treturn m_BlockType == E_BLOCK_AIR;\n}\n\n\n\n\n\nbool cBlockHandler::IsInsideBlock(const Vector3d a_RelPosition, const NIBBLETYPE a_BlockMeta) const\n{\n\t// Default functionality: Test the height, since we assume full voxels with varying height\n\treturn (a_RelPosition.y < cBlockInfo::GetBlockHeight(m_BlockType));\n}\n\n\n\n\n\ncBoundingBox cBlockHandler::GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const\n{\n\tif (!cBlockInfo::IsSolid(m_BlockType))\n\t{\n\t\t// Non-solid things can be placed within entities\n\t\treturn cBoundingBox(0, 0, 0, 0, 0, 0);\n\t}\n\treturn cBoundingBox(0, 1, 0, cBlockInfo::GetBlockHeight(m_BlockType), 0, 1);\n}\n\n\n\n\n\nvoid cBlockHandler::Check(\n\tcChunkInterface & a_ChunkInterface, cBlockPluginInterface & a_PluginInterface,\n\tVector3i a_RelPos,\n\tcChunk & a_Chunk\n) const\n{\n\tconst auto Position = cChunkDef::RelativeToAbsolute(a_RelPos, a_Chunk.GetPos());\n\tNeighborChanged(a_ChunkInterface, Position.addedX(-1), BLOCK_FACE_XP);\n\tNeighborChanged(a_ChunkInterface, Position.addedX(1), BLOCK_FACE_XM);\n\tNeighborChanged(a_ChunkInterface, Position.addedY(-1), BLOCK_FACE_YP);\n\tNeighborChanged(a_ChunkInterface, Position.addedY(1), BLOCK_FACE_YM);\n\tNeighborChanged(a_ChunkInterface, Position.addedZ(-1), BLOCK_FACE_ZP);\n\tNeighborChanged(a_ChunkInterface, Position.addedZ(1), BLOCK_FACE_ZM);\n}\n\n\n\n\n\nColourID cBlockHandler::GetMapBaseColourID(NIBBLETYPE a_Meta) const\n{\n\t// Zero for transparent\n\treturn 0;\n}\n\n\n\n\n\nbool cBlockHandler::ToolHasSilkTouch(const cItem * a_Tool)\n{\n\treturn ((a_Tool != nullptr) && (a_Tool->m_Enchantments.GetLevel(cEnchantments::enchSilkTouch) > 0));\n}\n\n\n\n\n\nunsigned char cBlockHandler::ToolFortuneLevel(const cItem * a_Tool)\n{\n\tif ((a_Tool != nullptr) && ItemCategory::IsTool(a_Tool->m_ItemType))\n\t{\n\t\t// Return enchantment level, limited to avoid spawning excessive pickups (crashing the server) when modified items are used:\n\t\treturn static_cast<unsigned char>(std::min(8U, a_Tool->m_Enchantments.GetLevel(cEnchantments::enchFortune)));\n\t}\n\n\t// Not a tool:\n\treturn 0;\n}\n\n\n\n\n\nchar cBlockHandler::FortuneDiscreteRandom(char a_MinDrop, char a_DefaultMax, unsigned char a_BonusMax, char a_DropCap)\n{\n\t// First sample the discrete random distribution.\n\tchar DropNum = GetRandomProvider().RandInt<char>(a_MinDrop, static_cast<char>(a_DefaultMax + a_BonusMax));\n\n\t// Then clamp to within range (clamp instead of min incase of overflow):\n\treturn std::clamp<char>(DropNum, a_MinDrop, a_DropCap);\n}\n\n\n\n\n\nconst cBlockHandler & cBlockHandler::For(BLOCKTYPE a_BlockType)\n{\n\t// Switch on the block type, as an enumeration\n\t// Clang will fail if any type is unhandled:\n\tswitch (static_cast<ENUM_BLOCK_TYPE>(a_BlockType))\n\t{\n\t\t// Block handlers, alphabetically sorted:\n\t\tcase E_BLOCK_ACACIA_DOOR:                   return BlockAcaciaDoorHandler;\n\t\tcase E_BLOCK_ACACIA_FENCE:                  return BlockAcaciaFenceHandler;\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:             return BlockAcaciaFenceGateHandler;\n\t\tcase E_BLOCK_ACACIA_WOOD_STAIRS:            return BlockAcaciaWoodStairsHandler;\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:                return BlockActivatorRailHandler;\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:             return BlockActiveComparatorHandler;\n\t\tcase E_BLOCK_AIR:                           return BlockAirHandler;\n\t\tcase E_BLOCK_ANVIL:                         return BlockAnvilHandler;\n\t\tcase E_BLOCK_BARRIER:                       return BlockBarrierHandler;\n\t\tcase E_BLOCK_BEACON:                        return BlockBeaconHandler;\n\t\tcase E_BLOCK_BED:                           return BlockBedHandler;\n\t\tcase E_BLOCK_BEDROCK:                       return BlockBedrockHandler;\n\t\tcase E_BLOCK_BEETROOTS:                     return BlockBeetrootsHandler;\n\t\tcase E_BLOCK_BIG_FLOWER:                    return BlockBigFlowerHandler;\n\t\tcase E_BLOCK_BIRCH_DOOR:                    return BlockBirchDoorHandler;\n\t\tcase E_BLOCK_BIRCH_FENCE:                   return BlockBirchFenceHandler;\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:              return BlockBirchFenceGateHandler;\n\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS:             return BlockBirchWoodStairsHandler;\n\t\tcase E_BLOCK_BLACK_GLAZED_TERRACOTTA:       return BlockBlackGlazedTerracottaHandler;\n\t\tcase E_BLOCK_BLACK_SHULKER_BOX:             return BlockBlackShulkerBoxHandler;\n\t\tcase E_BLOCK_BLOCK_OF_COAL:                 return BlockCoalBlockHandler;\n\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:             return BlockRedstoneBlockHandler;\n\t\tcase E_BLOCK_BLUE_GLAZED_TERRACOTTA:        return BlockBlueGlazedTerracottaHandler;\n\t\tcase E_BLOCK_BLUE_SHULKER_BOX:              return BlockBlueShulkerBoxHandler;\n\t\tcase E_BLOCK_BONE_BLOCK:                    return BlockBoneBlockHandler;\n\t\tcase E_BLOCK_BOOKCASE:                      return BlockBookcaseHandler;\n\t\tcase E_BLOCK_BREWING_STAND:                 return BlockBrewingStandHandler;\n\t\tcase E_BLOCK_BRICK:                         return BlockBricksHandler;\n\t\tcase E_BLOCK_BRICK_STAIRS:                  return BlockBrickStairsHandler;\n\t\tcase E_BLOCK_BROWN_GLAZED_TERRACOTTA:       return BlockBrownGlazedTerracottaHandler;\n\t\tcase E_BLOCK_BROWN_MUSHROOM:                return BlockBrownMushroomHandler;\n\t\tcase E_BLOCK_BROWN_SHULKER_BOX:             return BlockBrownShulkerBoxHandler;\n\t\tcase E_BLOCK_CACTUS:                        return BlockCactusHandler;\n\t\tcase E_BLOCK_CAKE:                          return BlockCakeHandler;\n\t\tcase E_BLOCK_CARPET:                        return BlockCarpetHandler;\n\t\tcase E_BLOCK_CARROTS:                       return BlockCarrotsHandler;\n\t\tcase E_BLOCK_CAULDRON:                      return BlockCauldronHandler;\n\t\tcase E_BLOCK_CHAIN_COMMAND_BLOCK:           return BlockChainCommandBlockHandler;\n\t\tcase E_BLOCK_CHEST:                         return BlockChestHandler;\n\t\tcase E_BLOCK_CHORUS_FLOWER:                 return BlockChorusFlowerHandler;\n\t\tcase E_BLOCK_CHORUS_PLANT:                  return BlockChorusPlantHandler;\n\t\tcase E_BLOCK_CLAY:                          return BlockClayHandler;\n\t\tcase E_BLOCK_COAL_ORE:                      return BlockCoalOreHandler;\n\t\tcase E_BLOCK_COBBLESTONE:                   return BlockCobblestoneHandler;\n\t\tcase E_BLOCK_COBBLESTONE_STAIRS:            return BlockCobblestoneStairsHandler;\n\t\tcase E_BLOCK_COBBLESTONE_WALL:              return BlockCobblestoneWallHandler;\n\t\tcase E_BLOCK_COBWEB:                        return BlockCobwebHandler;\n\t\tcase E_BLOCK_COCOA_POD:                     return BlockCocoaPodHandler;\n\t\tcase E_BLOCK_COMMAND_BLOCK:                 return BlockCommandBlockHandler;\n\t\tcase E_BLOCK_CONCRETE:                      return BlockConcreteHandler;\n\t\tcase E_BLOCK_CONCRETE_POWDER:               return BlockConcretePowderHandler;\n\t\tcase E_BLOCK_CROPS:                         return BlockCropsHandler;\n\t\tcase E_BLOCK_CYAN_GLAZED_TERRACOTTA:        return BlockCyanGlazedTerracottaHandler;\n\t\tcase E_BLOCK_CYAN_SHULKER_BOX:              return BlockCyanShulkerBoxHandler;\n\t\tcase E_BLOCK_DARK_OAK_DOOR:                 return BlockDarkOakDoorHandler;\n\t\tcase E_BLOCK_DARK_OAK_FENCE:                return BlockDarkOakFenceHandler;\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:           return BlockDarkOakFenceGateHandler;\n\t\tcase E_BLOCK_DARK_OAK_WOOD_STAIRS:          return BlockDarkOakWoodStairsHandler;\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:               return BlockDaylightSensorHandler;\n\t\tcase E_BLOCK_DEAD_BUSH:                     return BlockDeadBushHandler;\n\t\tcase E_BLOCK_DETECTOR_RAIL:                 return BlockDetectorRailHandler;\n\t\tcase E_BLOCK_DIAMOND_BLOCK:                 return BlockDiamondBlockHandler;\n\t\tcase E_BLOCK_DIAMOND_ORE:                   return BlockDiamondOreHandler;\n\t\tcase E_BLOCK_DIRT:                          return BlockDirtHandler;\n\t\tcase E_BLOCK_DISPENSER:                     return BlockDispenserHandler;\n\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:     return BlockDoubleRedSandstoneSlabHandler;\n\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:             return BlockDoubleStoneSlabHandler;\n\t\tcase E_BLOCK_DOUBLE_WOODEN_SLAB:            return BlockDoubleWoodenSlabHandler;\n\t\tcase E_BLOCK_DRAGON_EGG:                    return BlockDragonEggHandler;\n\t\tcase E_BLOCK_DROPPER:                       return BlockDropperHandler;\n\t\tcase E_BLOCK_EMERALD_BLOCK:                 return BlockEmeraldBlockHandler;\n\t\tcase E_BLOCK_EMERALD_ORE:                   return BlockEmeraldOreHandler;\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:             return BlockEnchantingTableHandler;\n\t\tcase E_BLOCK_ENDER_CHEST:                   return BlockEnderChestHandler;\n\t\tcase E_BLOCK_END_BRICKS:                    return BlockEndBricksHandler;\n\t\tcase E_BLOCK_END_GATEWAY:                   return BlockEndGatewayHandler;\n\t\tcase E_BLOCK_END_PORTAL:                    return BlockEndPortalHandler;\n\t\tcase E_BLOCK_END_PORTAL_FRAME:              return BlockEndPortalFrameHandler;\n\t\tcase E_BLOCK_END_ROD:                       return BlockEndRodHandler;\n\t\tcase E_BLOCK_END_STONE:                     return BlockEndStoneHandler;\n\t\tcase E_BLOCK_FARMLAND:                      return BlockFarmlandHandler;\n\t\tcase E_BLOCK_FENCE:                         return BlockFenceHandler;\n\t\tcase E_BLOCK_FIRE:                          return BlockFireHandler;\n\t\tcase E_BLOCK_FLOWER_POT:                    return BlockFlowerPotHandler;\n\t\tcase E_BLOCK_FROSTED_ICE:                   return BlockFrostedIceHandler;\n\t\tcase E_BLOCK_FURNACE:                       return BlockFurnaceHandler;\n\t\tcase E_BLOCK_GLASS:                         return BlockGlassHandler;\n\t\tcase E_BLOCK_GLASS_PANE:                    return BlockGlassPaneHandler;\n\t\tcase E_BLOCK_GLOWSTONE:                     return BlockGlowstoneHandler;\n\t\tcase E_BLOCK_GOLD_BLOCK:                    return BlockGoldBlockHandler;\n\t\tcase E_BLOCK_GOLD_ORE:                      return BlockGoldOreHandler;\n\t\tcase E_BLOCK_GRASS:                         return BlockGrassHandler;\n\t\tcase E_BLOCK_GRASS_PATH:                    return BlockGrassPathHandler;\n\t\tcase E_BLOCK_GRAVEL:                        return BlockGravelHandler;\n\t\tcase E_BLOCK_GRAY_GLAZED_TERRACOTTA:        return BlockGrayGlazedTerracottaHandler;\n\t\tcase E_BLOCK_GRAY_SHULKER_BOX:              return BlockGrayShulkerBoxHandler;\n\t\tcase E_BLOCK_GREEN_GLAZED_TERRACOTTA:       return BlockGreenGlazedTerracottaHandler;\n\t\tcase E_BLOCK_GREEN_SHULKER_BOX:             return BlockGreenShulkerBoxHandler;\n\t\tcase E_BLOCK_HARDENED_CLAY:                 return BlockHardenedClayHandler;\n\t\tcase E_BLOCK_HAY_BALE:                      return BlockHayBaleHandler;\n\t\tcase E_BLOCK_HEAD:                          return BlockHeadHandler;\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE: return BlockHeavyWeightedPressurePHandler;\n\t\tcase E_BLOCK_HOPPER:                        return BlockHopperHandler;\n\t\tcase E_BLOCK_HUGE_BROWN_MUSHROOM:           return BlockHugeBrownMushroomHandler;\n\t\tcase E_BLOCK_HUGE_RED_MUSHROOM:             return BlockHugeRedMushroomHandler;\n\t\tcase E_BLOCK_ICE:                           return BlockIceHandler;\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:           return BlockInactiveComparatorHandler;\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:      return BlockDaylightSensorHandler;\n\t\tcase E_BLOCK_IRON_BARS:                     return BlockIronBarsHandler;\n\t\tcase E_BLOCK_IRON_BLOCK:                    return BlockIronBlockHandler;\n\t\tcase E_BLOCK_IRON_DOOR:                     return BlockIronDoorHandler;\n\t\tcase E_BLOCK_IRON_ORE:                      return BlockIronOreHandler;\n\t\tcase E_BLOCK_IRON_TRAPDOOR:                 return BlockIronTrapdoorHandler;\n\t\tcase E_BLOCK_JACK_O_LANTERN:                return BlockJackOLanternHandler;\n\t\tcase E_BLOCK_JUKEBOX:                       return BlockJukeboxHandler;\n\t\tcase E_BLOCK_JUNGLE_DOOR:                   return BlockJungleDoorHandler;\n\t\tcase E_BLOCK_JUNGLE_FENCE:                  return BlockJungleFenceHandler;\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:             return BlockJungleFenceGateHandler;\n\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:            return BlockJungleWoodStairsHandler;\n\t\tcase E_BLOCK_LADDER:                        return BlockLadderHandler;\n\t\tcase E_BLOCK_LAPIS_BLOCK:                   return BlockLapisBlockHandler;\n\t\tcase E_BLOCK_LAPIS_ORE:                     return BlockLapisOreHandler;\n\t\tcase E_BLOCK_LAVA:                          return BlockLavaHandler;\n\t\tcase E_BLOCK_LEAVES:                        return BlockLeavesHandler;\n\t\tcase E_BLOCK_LEVER:                         return BlockLeverHandler;\n\t\tcase E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA:  return BlockLightBlueGlazedTerracoHandler;\n\t\tcase E_BLOCK_LIGHT_BLUE_SHULKER_BOX:        return BlockLightBlueShulkerBoxHandler;\n\t\tcase E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA:  return BlockLightGrayGlazedTerracoHandler;\n\t\tcase E_BLOCK_LIGHT_GRAY_SHULKER_BOX:        return BlockLightGrayShulkerBoxHandler;\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE: return BlockLightWeightedPressurePHandler;\n\t\tcase E_BLOCK_LILY_PAD:                      return BlockLilyPadHandler;\n\t\tcase E_BLOCK_LIME_GLAZED_TERRACOTTA:        return BlockLimeGlazedTerracottaHandler;\n\t\tcase E_BLOCK_LIME_SHULKER_BOX:              return BlockLimeShulkerBoxHandler;\n\t\tcase E_BLOCK_LIT_FURNACE:                   return BlockLitFurnaceHandler;\n\t\tcase E_BLOCK_LOG:                           return BlockLogHandler;\n\t\tcase E_BLOCK_MAGENTA_GLAZED_TERRACOTTA:     return BlockMagentaGlazedTerracottHandler;\n\t\tcase E_BLOCK_MAGENTA_SHULKER_BOX:           return BlockMagentaShulkerBoxHandler;\n\t\tcase E_BLOCK_MAGMA:                         return BlockMagmaHandler;\n\t\tcase E_BLOCK_MELON:                         return BlockMelonHandler;\n\t\tcase E_BLOCK_MELON_STEM:                    return BlockMelonStemHandler;\n\t\tcase E_BLOCK_MOB_SPAWNER:                   return BlockMobSpawnerHandler;\n\t\tcase E_BLOCK_MOSSY_COBBLESTONE:             return BlockMossyCobblestoneHandler;\n\t\tcase E_BLOCK_MYCELIUM:                      return BlockMyceliumHandler;\n\t\tcase E_BLOCK_NETHERRACK:                    return BlockNetherrackHandler;\n\t\tcase E_BLOCK_NETHER_BRICK:                  return BlockNetherBricksHandler;\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:            return BlockNetherBrickFenceHandler;\n\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:           return BlockNetherBrickStairsHandler;\n\t\tcase E_BLOCK_NETHER_PORTAL:                 return BlockNetherPortalHandler;\n\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:             return BlockNetherQuartzOreHandler;\n\t\tcase E_BLOCK_NETHER_WART:                   return BlockNetherWartHandler;\n\t\tcase E_BLOCK_NETHER_WART_BLOCK:             return BlockNetherWartBlockHandler;\n\t\tcase E_BLOCK_NEW_LEAVES:                    return BlockNewLeavesHandler;\n\t\tcase E_BLOCK_NEW_LOG:                       return BlockNewLogHandler;\n\t\tcase E_BLOCK_NOTE_BLOCK:                    return BlockNoteBlockHandler;\n\t\tcase E_BLOCK_OAK_DOOR:                      return BlockOakDoorHandler;\n\t\tcase E_BLOCK_OAK_FENCE_GATE:                return BlockOakFenceGateHandler;\n\t\tcase E_BLOCK_OAK_WOOD_STAIRS:               return BlockOakWoodStairsHandler;\n\t\tcase E_BLOCK_OBSERVER:                      return BlockObserverHandler;\n\t\tcase E_BLOCK_OBSIDIAN:                      return BlockObsidianHandler;\n\t\tcase E_BLOCK_ORANGE_GLAZED_TERRACOTTA:      return BlockOrangeGlazedTerracottaHandler;\n\t\tcase E_BLOCK_ORANGE_SHULKER_BOX:            return BlockOrangeShulkerBoxHandler;\n\t\tcase E_BLOCK_PACKED_ICE:                    return BlockPackedIceHandler;\n\t\tcase E_BLOCK_PINK_GLAZED_TERRACOTTA:        return BlockPinkGlazedTerracottaHandler;\n\t\tcase E_BLOCK_PINK_SHULKER_BOX:              return BlockPinkShulkerBoxHandler;\n\t\tcase E_BLOCK_PISTON:                        return BlockPistonHandler;\n\t\tcase E_BLOCK_PISTON_EXTENSION:              return BlockPistonHeadHandler;\n\t\tcase E_BLOCK_PISTON_MOVED_BLOCK:            return BlockPistonMovedBlockHandler;\n\t\tcase E_BLOCK_PLANKS:                        return BlockPlanksHandler;\n\t\tcase E_BLOCK_POTATOES:                      return BlockPotatoesHandler;\n\t\tcase E_BLOCK_POWERED_RAIL:                  return BlockPoweredRailHandler;\n\t\tcase E_BLOCK_PRISMARINE_BLOCK:              return BlockPrismarineBlockHandler;\n\t\tcase E_BLOCK_PUMPKIN:                       return BlockPumpkinHandler;\n\t\tcase E_BLOCK_PUMPKIN_STEM:                  return BlockPumpkinStemHandler;\n\t\tcase E_BLOCK_PURPLE_GLAZED_TERRACOTTA:      return BlockPurpleGlazedTerracottaHandler;\n\t\tcase E_BLOCK_PURPLE_SHULKER_BOX:            return BlockPurpleShulkerBoxHandler;\n\t\tcase E_BLOCK_PURPUR_BLOCK:                  return BlockPurpurBlockHandler;\n\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:            return BlockPurpurDoubleSlabHandler;\n\t\tcase E_BLOCK_PURPUR_PILLAR:                 return BlockPurpurPillarHandler;\n\t\tcase E_BLOCK_PURPUR_SLAB:                   return BlockPurpurSlabHandler;\n\t\tcase E_BLOCK_PURPUR_STAIRS:                 return BlockPurpurStairsHandler;\n\t\tcase E_BLOCK_QUARTZ_BLOCK:                  return BlockQuartzBlockHandler;\n\t\tcase E_BLOCK_QUARTZ_STAIRS:                 return BlockQuartzStairsHandler;\n\t\tcase E_BLOCK_RAIL:                          return BlockRailHandler;\n\t\tcase E_BLOCK_REDSTONE_LAMP_OFF:             return BlockRedstoneLampHandler;\n\t\tcase E_BLOCK_REDSTONE_LAMP_ON:              return BlockRedstoneLampHandler;\n\t\tcase E_BLOCK_REDSTONE_ORE:                  return BlockRedstoneOreHandler;\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:          return BlockRedstoneOreGlowingHandler;\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:         return BlockRedstoneRepeaterOffHandler;\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:          return BlockRedstoneRepeaterOnHandler;\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:            return BlockRedstoneTorchOffHandler;\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:             return BlockRedstoneTorchOnHandler;\n\t\tcase E_BLOCK_REDSTONE_WIRE:                 return BlockRedstoneWireHandler;\n\t\tcase E_BLOCK_RED_GLAZED_TERRACOTTA:         return BlockRedGlazedTerracottaHandler;\n\t\tcase E_BLOCK_RED_MUSHROOM:                  return BlockRedMushroomHandler;\n\t\tcase E_BLOCK_RED_NETHER_BRICK:              return BlockRedNetherBricksHandler;\n\t\tcase E_BLOCK_RED_ROSE:                      return BlockRedRoseHandler;\n\t\tcase E_BLOCK_RED_SANDSTONE:                 return BlockRedSandstoneHandler;\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:            return BlockRedSandstoneSlabHandler;\n\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:          return BlockRedSandstoneStairsHandler;\n\t\tcase E_BLOCK_RED_SHULKER_BOX:               return BlockRedShulkerBoxHandler;\n\t\tcase E_BLOCK_REPEATING_COMMAND_BLOCK:       return BlockRepeatingCommandBlockHandler;\n\t\tcase E_BLOCK_SAND:                          return BlockSandHandler;\n\t\tcase E_BLOCK_SANDSTONE:                     return BlockSandstoneHandler;\n\t\tcase E_BLOCK_SANDSTONE_STAIRS:              return BlockSandstoneStairsHandler;\n\t\tcase E_BLOCK_SAPLING:                       return BlockSaplingHandler;\n\t\tcase E_BLOCK_SEA_LANTERN:                   return BlockSeaLanternHandler;\n\t\tcase E_BLOCK_SIGN_POST:                     return BlockSignPostHandler;\n\t\tcase E_BLOCK_SILVERFISH_EGG:                return BlockInfestedBlockHandler;\n\t\tcase E_BLOCK_SLIME_BLOCK:                   return BlockSlimeBlockHandler;\n\t\tcase E_BLOCK_SNOW:                          return BlockSnowHandler;\n\t\tcase E_BLOCK_SNOW_BLOCK:                    return BlockSnowBlockHandler;\n\t\tcase E_BLOCK_SOULSAND:                      return BlockSoulSandHandler;\n\t\tcase E_BLOCK_SPONGE:                        return BlockSpongeHandler;\n\t\tcase E_BLOCK_SPRUCE_DOOR:                   return BlockSpruceDoorHandler;\n\t\tcase E_BLOCK_SPRUCE_FENCE:                  return BlockSpruceFenceHandler;\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:             return BlockSpruceFenceGateHandler;\n\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS:            return BlockSpruceWoodStairsHandler;\n\t\tcase E_BLOCK_STAINED_CLAY:                  return BlockStainedClayHandler;\n\t\tcase E_BLOCK_STAINED_GLASS:                 return BlockStainedGlassHandler;\n\t\tcase E_BLOCK_STAINED_GLASS_PANE:            return BlockStainedGlassPaneHandler;\n\t\tcase E_BLOCK_STANDING_BANNER:               return BlockStandingBannerHandler;\n\t\tcase E_BLOCK_STATIONARY_LAVA:               return BlockStationaryLavaHandler;\n\t\tcase E_BLOCK_STATIONARY_WATER:              return BlockStationaryWaterHandler;\n\t\tcase E_BLOCK_STICKY_PISTON:                 return BlockStickyPistonHandler;\n\t\tcase E_BLOCK_STONE:                         return BlockStoneHandler;\n\t\tcase E_BLOCK_STONE_BRICKS:                  return BlockStoneBricksHandler;\n\t\tcase E_BLOCK_STONE_BRICK_STAIRS:            return BlockStoneBrickStairsHandler;\n\t\tcase E_BLOCK_STONE_BUTTON:                  return BlockStoneButtonHandler;\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:          return BlockStonePressurePlateHandler;\n\t\tcase E_BLOCK_STONE_SLAB:                    return BlockStoneSlabHandler;\n\t\tcase E_BLOCK_STRUCTURE_BLOCK:               return BlockStructureBlockHandler;\n\t\tcase E_BLOCK_STRUCTURE_VOID:                return BlockStructureVoidHandler;\n\t\tcase E_BLOCK_SUGARCANE:                     return BlockSugarCaneHandler;\n\t\tcase E_BLOCK_TALL_GRASS:                    return BlockTallGrassHandler;\n\t\tcase E_BLOCK_TNT:                           return BlockTNTHandler;\n\t\tcase E_BLOCK_TORCH:                         return BlockTorchHandler;\n\t\tcase E_BLOCK_TRAPDOOR:                      return BlockTrapdoorHandler;\n\t\tcase E_BLOCK_TRAPPED_CHEST:                 return BlockTrappedChestHandler;\n\t\tcase E_BLOCK_TRIPWIRE:                      return BlockTripwireHandler;\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:                 return BlockTripwireHookHandler;\n\t\tcase E_BLOCK_VINES:                         return BlockVinesHandler;\n\t\tcase E_BLOCK_WALLSIGN:                      return BlockWallsignHandler;\n\t\tcase E_BLOCK_WALL_BANNER:                   return BlockWallBannerHandler;\n\t\tcase E_BLOCK_WATER:                         return BlockWaterHandler;\n\t\tcase E_BLOCK_WHITE_GLAZED_TERRACOTTA:       return BlockWhiteGlazedTerracottaHandler;\n\t\tcase E_BLOCK_WHITE_SHULKER_BOX:             return BlockWhiteShulkerBoxHandler;\n\t\tcase E_BLOCK_WOODEN_BUTTON:                 return BlockWoodenButtonHandler;\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:         return BlockWoodenPressurePlateHandler;\n\t\tcase E_BLOCK_WOODEN_SLAB:                   return BlockWoodenSlabHandler;\n\t\tcase E_BLOCK_WOOL:                          return BlockWoolHandler;\n\t\tcase E_BLOCK_WORKBENCH:                     return BlockWorkbenchHandler;\n\t\tcase E_BLOCK_YELLOW_FLOWER:                 return BlockYellowFlowerHandler;\n\t\tcase E_BLOCK_YELLOW_GLAZED_TERRACOTTA:      return BlockYellowGlazedTerracottaHandler;\n\t\tcase E_BLOCK_YELLOW_SHULKER_BOX:            return BlockYellowShulkerBoxHandler;\n\n\t\t// TODO: these will be removed in 1.13+ migration\n\t\tcase E_BLOCK_NUMBER_OF_TYPES:\n\t\tcase E_BLOCK_UNFINISHED: return BlockAirHandler;\n\t}\n\tUNREACHABLE(\"Getting handler for unexpected block type\");\n}\n"
  },
  {
    "path": "src/Blocks/BlockHandler.h",
    "content": "\n#pragma once\n\n#include \"../Defines.h\"\n#include \"../Item.h\"\n#include \"../BoundingBox.h\"\n\n\n\n\n\n// fwd:\nclass cPlayer;\nclass cChunk;\nclass cBlockPluginInterface;\nclass cChunkInterface;\nclass cWorld;\nclass cWorldInterface;\nclass cItems;\n\n\n\n\n\nclass cBlockHandler\n{\npublic:\n\n\tconstexpr cBlockHandler(BLOCKTYPE a_BlockType) :\n\t\tm_BlockType(a_BlockType)\n\t{\n\t}\n\n\t/** Called when the block gets ticked either by a random tick or by a queued tick.\n\tNote that the coords in a_RelPos are chunk-relative! */\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_BlockPluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const;\n\n\t/** Returns the relative bounding box that must be entity-free in\n\torder for the block to be placed. a_XM, a_XP, etc. stand for the\n\tblocktype of the minus-X neighbor, the positive-X neighbor, etc. */\n\tvirtual cBoundingBox GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const;\n\n\t/** Called by cWorld::SetBlock() after the block has been set */\n\tvirtual void OnPlaced(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta\n\t) const {}\n\n\t/** Called after a block gets broken (replaced with air), by natural means.\n\tThe block is already dug up in the world, the original block type and meta is passed in a_OldBlockType and a_OldBlockMeta.\n\tBy default notifies all direct neighbors via their OnNeighborChanged() callbacks.\n\tYou can determine what kind of entity broke the block (e.g. player) by checking a_Digger! */\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const {}\n\n\t/** Called when a direct neighbor of this block has been changed.\n\tThe position is the block's own position, NOT the changed neighbor's position.\n\ta_WhichNeighbor indicates which neighbor has changed. For example, BLOCK_FACE_YP meant the neighbor above has changed.\n\tBLOCK_FACE_NONE means that it is a neighbor not directly adjacent (diagonal, etc.) */\n\tvirtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const;\n\n\t/** Notifies the specified neighbor that the current block has changed.\n\ta_NeighborPos are the coords of the neighbor to be notified\n\ta_WhichNeighbor specifies which neighbor (relative to a_NeighborPos) has changed.\n\tFor example BLOCK_FACE_YP means that the block at {a_NeighborX, a_NeighborY + 1, a_NeighborZ} has changed.\n\tBLOCK_FACE_NONE means that it is a neighbor not directly adjacent (diagonal, etc.) */\n\tstatic void NeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_NeighborPos, eBlockFace a_WhichNeighbor);\n\n\t/** Called when the player starts digging the block. */\n\tvirtual void OnDigging(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos\n\t) const\n\t{\n\t}\n\n\t/** Called when the user right clicks the block and the block is useable.\n\ta_CursorPos is the cursor position within the clicked block face.\n\tReturns true if the use was successful, return false to use the block as a \"normal\" block */\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const\n\t{\n\t\treturn false;\n\t}\n\n\t/** Called when a right click to this block is cancelled.\n\tDescendants should force the server to send the real state of a block to the client to prevent client assuming the operation was successfull. */\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const\n\t{\n\t}\n\n\t/** Returns the pickups that would result if the block was mined by a_Digger using a_Tool.\n\tDoesn't do any actual block change / mining, only calculates the pickups.\n\ta_Digger is the entity that caused the conversion, usually the player digging.\n\ta_Tool is the tool used for the digging.\n\tThe default implementation drops a single item created from m_BlockType and the current meta. */\n\tvirtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, const cItem * a_Tool = nullptr) const;\n\n\t/** Checks if the block can stay at the specified relative coords in the chunk */\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, Vector3i a_Position, NIBBLETYPE a_Meta) const;\n\n\t/** Checks whether the block has an effect on growing the plant */\n\tvirtual bool CanSustainPlant(BLOCKTYPE a_Plant) const { return false; }\n\n\t/** Called to check whether this block supports a rclk action.\n\tIf it returns true, OnUse() is called */\n\tvirtual bool IsUseable(void) const;\n\n\t/** Checks if the player can build \"inside\" this block.\n\tFor example blocks placed \"on\" snow will be placed at the same position. So: Snow ignores Build collision\n\t@param a_Pos Position of the block\n\t@param a_Player Player trying to build on the block\n\t@param a_Meta Meta value of the block currently at a_Pos */\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, Vector3i a_Position, NIBBLETYPE a_Meta, eBlockFace a_ClickedBlockFace, bool a_ClickedDirectly) const;\n\n\t/** Tests if a_RelPosition is inside the block, where a_RelPosition is relative to the origin of the block.\n\tCoords in a_RelPosition are guaranteed to be in the [0..1] range. */\n\tvirtual bool IsInsideBlock(const Vector3d a_RelPosition, const NIBBLETYPE a_BlockMeta) const;\n\n\t/** Called when one of the neighbors gets set; equivalent to MC block update.\n\tBy default drops (DropBlockAsPickup() / SetBlock()) if the position is no longer suitable (CanBeAt(), DoesDropOnUnsuitable()),\n\totherwise wakes up all simulators on the block. */\n\tvoid Check(\n\t\tcChunkInterface & ChunkInterface, cBlockPluginInterface & a_PluginInterface,\n\t\tVector3i a_RelPos,\n\t\tcChunk & a_Chunk\n\t) const;\n\n\t/** Returns the base colour ID of the block, as will be represented on a map, as per documentation: https://minecraft.wiki/w/Map_item_format */\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const;\n\n\t/** Rotates a given block meta counter-clockwise. Default: no change\n\tReturns block meta following rotation */\n\tvirtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const { return a_Meta; }\n\n\t/** Rotates a given block meta clockwise. Default: no change\n\tReturns block meta following rotation */\n\tvirtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) const { return a_Meta; }\n\n\t/** Mirrors a given block meta around the XY plane. Default: no change\n\tReturns block meta following rotation */\n\tvirtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) const { return a_Meta; }\n\n\t/** Mirros a given block meta around the XZ plane. Default: no change\n\tReturns block meta following rotation */\n\tvirtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) const { return a_Meta; }\n\n\t/** Mirros a given block meta around the YZ plane. Default: no change\n\tReturns block meta following rotation */\n\tvirtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) const { return a_Meta; }\n\n\t/** Grows this block, if it supports growing, by the specified amount of stages (at most).\n\tReturns the number of stages actually grown, zero if not supported (default). */\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const { return 0; }\n\n\t/** Returns true if the specified tool is valid and has a non-zero silk-touch enchantment.\n\tHelper used in many ConvertToPickups() implementations. */\n\tstatic bool ToolHasSilkTouch(const cItem * a_Tool);\n\n\t/** Returns the fortune level of a tool, if it is a valid tool.\n\tCan be used in ConvertToPickups() implementations. */\n\tstatic unsigned char ToolFortuneLevel(const cItem * a_Tool);\n\n\t/** Returns a random number of drops taking into account fortune.\n\tOnly applies to drops following clamped discrete random distribution.\n\ta_DefaultMax is the maximum items from one block without fortune.\n\ta_BonusMax is the amount to increase the max of randInt by, usually the fortune level (but not always)\n\ta_DropCap is the maximum items from one block with fortune,\n\tif unspecified set to 25 to prevent lag or crash with high level tools.\n\tSimilar to uniform_bonus_count at https://minecraft.wiki/w/Loot_table#Functions */\n\tstatic char FortuneDiscreteRandom(char a_MinDrop, char a_DefaultMax, unsigned char a_BonusMax, char a_DropCap = 25);\n\n\t// Gets the blockhandler for the given block type.\n\tstatic const cBlockHandler & For(BLOCKTYPE a_BlockType);\n\nprotected:\n\n\t~cBlockHandler() = default;\n\n\tconst BLOCKTYPE m_BlockType;\n};\n"
  },
  {
    "path": "src/Blocks/BlockHopper.h",
    "content": "\n// BlockHopper.h\n\n// Declares the cBlockHopperHandler class representing the handler for the Hopper block\n\n#include \"Mixins/Mixins.h\"\n\n\n\nclass cBlockHopperHandler final :\n\tpublic cClearMetaOnDrop<cMetaRotator<cBlockEntityHandler, 0x7, E_META_HOPPER_FACING_ZP, E_META_HOPPER_FACING_XM, E_META_HOPPER_FACING_ZM, E_META_HOPPER_FACING_XP>>\n{\n\tusing Super = cClearMetaOnDrop<cMetaRotator<cBlockEntityHandler, 0x7, E_META_HOPPER_FACING_ZP, E_META_HOPPER_FACING_XM, E_META_HOPPER_FACING_ZM, E_META_HOPPER_FACING_XP>>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 11;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockHugeMushroom.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\n/** Handler for huge mushroom blocks. */\nclass cBlockHugeMushroomHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(m_BlockType);\n\t\t}\n\t\telse if ((a_BlockMeta == E_META_MUSHROOM_FULL_STEM) || (a_BlockMeta == E_META_MUSHROOM_STEM))\n\t\t{\n\t\t\t// Stems don't drop anything\n\t\t\treturn cItem();\n\t\t}\n\n\t\tconst auto MushroomType = (m_BlockType == E_BLOCK_HUGE_BROWN_MUSHROOM) ? E_BLOCK_BROWN_MUSHROOM : E_BLOCK_RED_MUSHROOM;\n\t\tconst auto DropNum = GetRandomProvider().RandInt<char>(2);\n\n\t\treturn cItem(MushroomType, DropNum);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn (m_BlockType == E_BLOCK_HUGE_BROWN_MUSHROOM) ? 10 : 28;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockIce.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockIceHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Only drop self when using silk-touch:\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(m_BlockType);\n\t\t}\n\n\t\treturn {};\n\t}\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\t// Disappears instantly in nether:\n\t\tif (a_WorldInterface.GetDimension() == dimNether)\n\t\t{\n\t\t\ta_Chunk.SetBlock(a_RelPos, E_BLOCK_AIR, 0);\n\t\t\treturn;\n\t\t}\n\n\t\t// Artificial light on any of the surrounding block > 11 leads to melting the ice.\n\t\tstatic const std::array<Vector3i, 7> Adjacents\n\t\t{\n\t\t\t{\n\t\t\t\t{ 1, 0, 0 }, { -1, 0, 0 },\n\t\t\t\t{ 0, 1, 0 }, { 0, -1, 0 },\n\t\t\t\t{ 0, 0, 1 }, { 0, 0, -1 }\n\t\t\t}\n\t\t};\n\n\t\tfor (const auto & Offset : Adjacents)\n\t\t{\n\t\t\tauto Position = a_RelPos + Offset;\n\t\t\tconst auto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(Position);\n\n\t\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!Chunk->IsLightValid())\n\t\t\t{\n\t\t\t\tChunk->GetWorld()->QueueLightChunk(Chunk->GetPosX(), Chunk->GetPosZ());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (Chunk->GetBlockLight(Position) > 11)\n\t\t\t{\n\t\t\t\ta_Chunk.SetBlock(a_RelPos, E_BLOCK_STATIONARY_WATER, 0);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override\n\t{\n\t\tUNUSED(a_Digger);\n\t\t// If there's a solid block or a liquid underneath, convert to water, rather than air\n\t\tif (a_BlockPos.y <= 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto Below = a_ChunkInterface.GetBlock(a_BlockPos.addedY(-1));\n\t\tif (cBlockInfo::FullyOccupiesVoxel(Below) || IsBlockLiquid(Below))\n\t\t{\n\t\t\ta_ChunkInterface.SetBlock(a_BlockPos, E_BLOCK_WATER, 0);\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 5;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockInfested.h",
    "content": "\n// BlockInfested.h\n\n// Declares the cBlockInfestedHandler class representing the handler for Silverfish blocks (Mojang calls them Monster Eggs)\n\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cBlockInfestedHandler final:\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tstatic void SpawnSilverfish(cWorldInterface & a_WorldInterface, Vector3i a_BlockPos)\n\t{\n\t\t// TODO: only display animation if the difficulty allows mob spawns - Add when difficulty is implemented\n\n\t\tconst auto Position = Vector3f(a_BlockPos.x + 0.5f, static_cast<float>(a_BlockPos.y), a_BlockPos.z + 0.5f);\n\t\ta_WorldInterface.SpawnMob(Position.x, Position.y, Position.z, mtSilverfish, false);\n\t\ta_WorldInterface.GetBroadcastManager().BroadcastParticleEffect(\"explode\", Position, Vector3f(), 0.1f, 50);\n\t}\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tswitch (a_BlockMeta)\n\t\t{\n\t\t\tcase E_META_SILVERFISH_EGG_STONE:\n\t\t\t{\n\t\t\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t\t\t{\n\t\t\t\t\treturn { E_BLOCK_STONE };\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn { E_BLOCK_COBBLESTONE };\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase E_META_SILVERFISH_EGG_COBBLESTONE:          return { E_BLOCK_COBBLESTONE };\n\t\t\tcase E_META_SILVERFISH_EGG_STONE_BRICK:          return { E_BLOCK_STONE_BRICKS };\n\t\t\tcase E_META_SILVERFISH_EGG_MOSSY_STONE_BRICK:    return cItem(E_BLOCK_STONE_BRICKS, 1, E_META_STONE_BRICK_MOSSY);\n\t\t\tcase E_META_SILVERFISH_EGG_CRACKED_STONE_BRICK:  return cItem(E_BLOCK_STONE_BRICKS, 1, E_META_STONE_BRICK_CRACKED);\n\t\t\tcase E_META_SILVERFISH_EGG_CHISELED_STONE_BRICK: return cItem(E_BLOCK_STONE_BRICKS, 1, E_META_STONE_BRICK_ORNAMENT);\n\t\t}\n\n\t\treturn {};\n\t}\n\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override\n\t{\n\t\tif (a_Digger != nullptr)\n\t\t{\n\t\t\tif (a_Digger->IsPlayer())\n\t\t\t{\n\t\t\t\tconst auto Player = static_cast<const cPlayer *>(a_Digger);\n\t\t\t\tif (Player->IsGameModeCreative())\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (a_Digger->IsMob() || a_Digger->IsTNT())\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tSpawnSilverfish(a_WorldInterface, a_BlockPos);\n\t}\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\treturn 11;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockJukebox.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cBlockJukeboxHandler final :\n\tpublic cClearMetaOnDrop<cBlockEntityHandler>\n{\npublic:\n\n\tusing cClearMetaOnDrop<cBlockEntityHandler>::cClearMetaOnDrop;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 10;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockLadder.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"BlockInfo.h\"\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cBlockLadderHandler final :\n\tpublic cClearMetaOnDrop<cMetaRotator<cBlockHandler, 0x07, 0x02, 0x05, 0x03, 0x04> >\n{\n\tusing Super = cClearMetaOnDrop<cMetaRotator<cBlockHandler, 0x07, 0x02, 0x05, 0x03, 0x04>>;\n\npublic:\n\n\tusing Super::Super;\n\n\n\t/** Returns true if the ladder will be supported by the block through the given blockface. */\n\tstatic bool CanBePlacedOn(const BLOCKTYPE a_BlockType, const eBlockFace a_BlockFace)\n\t{\n\t\tif (\n\t\t\t(a_BlockFace == BLOCK_FACE_NONE) ||\n\t\t\t(a_BlockFace == BLOCK_FACE_BOTTOM) ||\n\t\t\t(a_BlockFace == BLOCK_FACE_TOP)\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn cBlockInfo::FullyOccupiesVoxel(a_BlockType);\n\t}\n\nprivate:\n\n\t/** Converts the ladder block's meta to the block face of the neighbor to which the ladder is attached. */\n\tstatic eBlockFace MetaDataToBlockFace(NIBBLETYPE a_MetaData)\n\t{\n\t\tswitch (a_MetaData)\n\t\t{\n\t\t\tcase 0x2: return BLOCK_FACE_ZM;\n\t\t\tcase 0x3: return BLOCK_FACE_ZP;\n\t\t\tcase 0x4: return BLOCK_FACE_XM;\n\t\t\tcase 0x5: return BLOCK_FACE_XP;\n\t\t\tdefault:  return BLOCK_FACE_ZM;\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tauto Face = MetaDataToBlockFace(a_Meta);\n\t\tauto NeighborRelPos = AddFaceDirection(a_Position, Face, true);\n\t\tBLOCKTYPE NeighborBlockType;\n\t\ta_Chunk.UnboundedRelGetBlockType(NeighborRelPos, NeighborBlockType);\n\t\treturn CanBePlacedOn(NeighborBlockType, Face);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockLeaves.h",
    "content": "#pragma once\n#include \"BlockHandler.h\"\n#include \"../FastRandom.h\"\n#include \"../BlockArea.h\"\n\n\n\n\n\n// Leaves can be this many blocks that away (inclusive) from the log not to decay\n#define LEAVES_CHECK_DISTANCE 6\n\n\n\n\n\nclass cBlockLeavesHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tstatic double FortuneDropProbability(unsigned char a_DefaultDenominator, unsigned char a_FirstDenominatorReduction, unsigned char a_FortuneLevel)\n\t{\n\t\t// Fortune 3 behaves like fortune 4 for some reason\n\t\tif (a_FortuneLevel == 3)\n\t\t{\n\t\t\ta_FortuneLevel++;\n\t\t}\n\n\t\t// Denominator, capped at minimum of 10.\n\t\tconst auto Denominator = std::max<unsigned char>(10, a_DefaultDenominator - a_FortuneLevel * a_FirstDenominatorReduction);\n\t\treturn 1.0 / Denominator;\n\t}\n\n\n\n\n\n\t/** Returns true if the area contains a continous path from the specified block to a log block entirely made out of leaves blocks. */\n\tstatic bool HasNearLog(cBlockArea & a_Area, const Vector3i a_BlockPos)\n\t{\n\t\t// Filter the blocks into a {leaves, log, other (air)} set:\n\t\tauto * Types = a_Area.GetBlockTypes();\n\t\tfor (size_t i = a_Area.GetBlockCount() - 1; i > 0; i--)\n\t\t{\n\t\t\tswitch (Types[i])\n\t\t\t{\n\t\t\t\tcase E_BLOCK_LEAVES:\n\t\t\t\tcase E_BLOCK_LOG:\n\t\t\t\tcase E_BLOCK_NEW_LEAVES:\n\t\t\t\tcase E_BLOCK_NEW_LOG:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tTypes[i] = E_BLOCK_AIR;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for i - Types[]\n\n\t\t// Perform a breadth-first search to see if there's a log connected within 4 blocks of the leaves block:\n\t\t// Simply replace all reachable leaves blocks with a sponge block plus iteration (in the Area) and see if we can reach a log\n\t\ta_Area.SetBlockType(a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, E_BLOCK_SPONGE);\n\t\tfor (int i = 0; i < LEAVES_CHECK_DISTANCE; i++)\n\t\t{\n\t\t\tauto ProcessNeighbor = [&a_Area, i](int cbx, int cby, int cbz) -> bool\n\t\t\t{\n\t\t\t\tswitch (a_Area.GetBlockType(cbx, cby, cbz))\n\t\t\t\t{\n\t\t\t\t\tcase E_BLOCK_LEAVES: a_Area.SetBlockType(cbx, cby, cbz, static_cast<BLOCKTYPE>(E_BLOCK_SPONGE + i + 1)); break;\n\t\t\t\t\tcase E_BLOCK_LOG: return true;\n\t\t\t\t\tcase E_BLOCK_NEW_LEAVES: a_Area.SetBlockType(cbx, cby, cbz, static_cast<BLOCKTYPE>(E_BLOCK_SPONGE + i + 1)); break;\n\t\t\t\t\tcase E_BLOCK_NEW_LOG: return true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\t\t\tfor (int y = std::max(a_BlockPos.y - i, 0); y <= std::min(a_BlockPos.y + i, cChunkDef::Height - 1); y++)\n\t\t\t{\n\t\t\t\tfor (int z = a_BlockPos.z - i; z <= a_BlockPos.z + i; z++)\n\t\t\t\t{\n\t\t\t\t\tfor (int x = a_BlockPos.x - i; x <= a_BlockPos.x + i; x++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (a_Area.GetBlockType(x, y, z) != E_BLOCK_SPONGE + i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tProcessNeighbor(x - 1, y,     z) ||\n\t\t\t\t\t\t\tProcessNeighbor(x + 1, y,     z) ||\n\t\t\t\t\t\t\tProcessNeighbor(x,     y,     z - 1) ||\n\t\t\t\t\t\t\tProcessNeighbor(x,     y,     z + 1) ||\n\t\t\t\t\t\t\tProcessNeighbor(x,     y + 1, z) ||\n\t\t\t\t\t\t\tProcessNeighbor(x,     y - 1, z)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}  // for x\n\t\t\t\t}  // for z\n\t\t\t}  // for y\n\t\t}  // for i - BFS iterations\n\t\treturn false;\n\t}\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// If breaking with shears, drop self:\n\t\tif ((a_Tool != nullptr) && (a_Tool->m_ItemType == E_ITEM_SHEARS))\n\t\t{\n\t\t\treturn cItem(m_BlockType, 1, a_BlockMeta & 0x03);\n\t\t}\n\n\n\t\t// There is a chance to drop a sapling that varies depending on the type of leaf broken.\n\t\t// Note: It is possible (though very rare) for a single leaves block to drop both a sapling and an apple\n\t\tdouble DropProbability;\n\t\tconst auto FortuneLevel = ToolFortuneLevel(a_Tool);\n\t\tauto & Random = GetRandomProvider();\n\t\tcItems Res;\n\n\t\tif ((m_BlockType == E_BLOCK_LEAVES) && ((a_BlockMeta & 0x03) == E_META_LEAVES_JUNGLE))\n\t\t{\n\t\t\t// Jungle leaves have a 2.5% default chance of dropping a sapling.\n\t\t\tDropProbability = FortuneDropProbability(40, 4, FortuneLevel);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Other leaves have a 5% default chance of dropping a sapling.\n\t\t\tDropProbability = FortuneDropProbability(20, 4, FortuneLevel);\n\t\t}\n\n\t\tif (Random.RandBool(DropProbability))\n\t\t{\n\t\t\tRes.Add(\n\t\t\t\tE_BLOCK_SAPLING,\n\t\t\t\t1,\n\t\t\t\t(m_BlockType == E_BLOCK_LEAVES) ? (a_BlockMeta & 0x03) : static_cast<short>(4 + (a_BlockMeta & 0x01))\n\t\t\t);\n\t\t}\n\n\t\t// 0.5 % chance of dropping an apple, increased by fortune, if the leaves' type is Apple Leaves\n\t\tif ((m_BlockType == E_BLOCK_LEAVES) && ((a_BlockMeta & 0x03) == E_META_LEAVES_APPLE))\n\t\t{\n\t\t\tDropProbability = FortuneDropProbability(200, 20, FortuneLevel);\n\t\t\tif (Random.RandBool(DropProbability))\n\t\t\t{\n\t\t\t\tRes.Add(E_ITEM_RED_APPLE);\n\t\t\t}\n\t\t}\n\n\t\t// 2% chance of dropping sticks (yuck) in 1.14\n\t\tDropProbability = FortuneDropProbability(50, 5, FortuneLevel);\n\t\tif (Random.RandBool(DropProbability))\n\t\t{\n\t\t\t// 1 or 2 sticks are dropped on success:\n\t\t\tRes.Add(E_ITEM_STICK, Random.RandInt<char>(1, 2));\n\t\t}\n\n\t\treturn Res;\n\t}\n\n\n\n\n\n\tvirtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const override\n\t{\n\t\tauto meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\n\t\t// Set bit 0x08, so this block gets checked for decay:\n\t\tif ((meta & 0x08) == 0)\n\t\t{\n\t\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, meta | 0x8);\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tauto Meta = a_Chunk.GetMeta(a_RelPos);\n\t\tif ((Meta & 0x04) != 0)\n\t\t{\n\t\t\t// Player-placed leaves, don't decay\n\t\t\treturn;\n\t\t}\n\n\t\tif ((Meta & 0x08) == 0)\n\t\t{\n\t\t\t// These leaves have been checked for decay lately and nothing around them changed\n\t\t\treturn;\n\t\t}\n\n\t\t// Get the data around the leaves:\n\t\tauto worldPos = a_Chunk.RelativeToAbsolute(a_RelPos);\n\t\tcBlockArea Area;\n\t\tif (!Area.Read(\n\t\t\t*a_Chunk.GetWorld(),\n\t\t\tworldPos - Vector3i(LEAVES_CHECK_DISTANCE, LEAVES_CHECK_DISTANCE, LEAVES_CHECK_DISTANCE),\n\t\t\tworldPos + Vector3i(LEAVES_CHECK_DISTANCE, LEAVES_CHECK_DISTANCE, LEAVES_CHECK_DISTANCE),\n\t\t\tcBlockArea::baTypes)\n\t\t)\n\t\t{\n\t\t\t// Cannot check leaves, a chunk is missing too close\n\t\t\treturn;\n\t\t}\n\n\t\tif (HasNearLog(Area, worldPos))\n\t\t{\n\t\t\t// Wood found, the leaves stay; unset the check bit\n\t\t\ta_Chunk.SetMeta(a_RelPos, Meta ^ 0x08);\n\t\t\treturn;\n\t\t}\n\n\t\t// Decay the leaves:\n\t\ta_ChunkInterface.DropBlockAsPickups(worldPos);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockLever.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../Chunk.h\"\n#include \"Blocks/BlockStairs.h\"\n#include \"ChunkDef.h\"\n#include \"Defines.h\"\n#include \"Mixins/Mixins.h\"\n#include \"BlockSlab.h\"\n\n\nclass cBlockLeverHandler final :\n\tpublic cMetaRotator<cBlockHandler, 0x07, 0x04, 0x01, 0x03, 0x02, false>\n{\n\tusing Super = cMetaRotator<cBlockHandler, 0x07, 0x04, 0x01, 0x03, 0x02, false>;\n\npublic:\n\n\tusing Super::Super;\n\n\t/** Extracts the ON bit from metadata and returns if true if it is set */\n\tstatic bool IsLeverOn(NIBBLETYPE a_BlockMeta)\n\t{\n\t\treturn ((a_BlockMeta & 0x8) == 0x8);\n\t}\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\t// Flip the ON bit on / off using the XOR bitwise operation\n\t\tNIBBLETYPE Meta = (a_ChunkInterface.GetBlockMeta(a_BlockPos) ^ 0x08);\n\n\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, Meta);\n\t\ta_WorldInterface.WakeUpSimulators(a_BlockPos);\n\t\ta_WorldInterface.GetBroadcastManager().BroadcastSoundEffect(\"block.lever.click\", a_BlockPos, 0.5f, (Meta & 0x08) ? 0.6f : 0.5f);\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Reset meta to zero:\n\t\treturn cItem(E_BLOCK_LEVER, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Converts the leve block's meta to the block face of the neighbor to which the lever is attached. */\n\tinline static eBlockFace BlockMetaDataToBlockFace(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & 0x7)\n\t\t{\n\t\t\tcase 0x1: return BLOCK_FACE_XP;\n\t\t\tcase 0x2: return BLOCK_FACE_XM;\n\t\t\tcase 0x3: return BLOCK_FACE_ZP;\n\t\t\tcase 0x4: return BLOCK_FACE_ZM;\n\t\t\tcase 0x5:\n\t\t\tcase 0x6: return BLOCK_FACE_YP;\n\t\t\tcase 0x7:\n\t\t\tcase 0x0: return BLOCK_FACE_YM;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled block meta!\");\n\t\t\t\treturn BLOCK_FACE_NONE;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Find the type of block the lever is attached to:\n\t\tauto NeighborFace = BlockMetaDataToBlockFace(a_Meta);\n\t\tauto NeighborPos = AddFaceDirection(a_Position, NeighborFace, true);\n\t\tif (!cChunkDef::IsValidHeight(NeighborPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tBLOCKTYPE NeighborBlockType;\n\t\tNIBBLETYPE NeighborMeta;\n\t\tif (!a_Chunk.UnboundedRelGetBlock(NeighborPos, NeighborBlockType, NeighborMeta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Allow any full block or the \"good\" side of a half-slab:\n\t\tif (cBlockInfo::FullyOccupiesVoxel(NeighborBlockType))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse if (cBlockSlabHandler::IsAnySlabType(NeighborBlockType))\n\t\t{\n\t\t\treturn (\n\t\t\t\t(((NeighborMeta & 0x08) == 0x08) && (NeighborFace == BLOCK_FACE_TOP)) ||\n\t\t\t\t(((NeighborMeta & 0x08) == 0)    && (NeighborFace == BLOCK_FACE_BOTTOM))\n\t\t\t);\n\t\t}\n\t\telse if (cBlockStairsHandler::IsAnyStairType(NeighborBlockType))\n\t\t{\n\t\t\tswitch (NeighborFace)\n\t\t\t{\n\t\t\t\tcase eBlockFace::BLOCK_FACE_YM:\n\t\t\t\t\treturn !(NeighborMeta & E_BLOCK_STAIRS_UPSIDE_DOWN);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_YP:\n\t\t\t\t\treturn (NeighborMeta & E_BLOCK_STAIRS_UPSIDE_DOWN);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_XP:\n\t\t\t\t\treturn ((NeighborMeta & 0b11) == E_BLOCK_STAIRS_XP);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_XM:\n\t\t\t\t\treturn ((NeighborMeta & 0b11) == E_BLOCK_STAIRS_XM);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_ZP:\n\t\t\t\t\treturn ((NeighborMeta & 0b11) == E_BLOCK_STAIRS_ZP);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_ZM:\n\t\t\t\t\treturn ((NeighborMeta & 0b11) == E_BLOCK_STAIRS_ZM);\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase 0x00: return 0x07;  // Ceiling rotation\n\t\t\tcase 0x07: return 0x00;\n\n\t\t\tcase 0x05: return 0x06;  // Ground rotation\n\t\t\tcase 0x06: return 0x05;\n\n\t\t\tdefault:  return Super::MetaRotateCCW(a_Meta);  // Wall Rotation\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase 0x00: return 0x07;  // Ceiling rotation\n\t\t\tcase 0x07: return 0x00;\n\n\t\t\tcase 0x05: return 0x06;  // Ground rotation\n\t\t\tcase 0x06: return 0x05;\n\n\t\t\tdefault:  return Super::MetaRotateCW(a_Meta);  // Wall Rotation\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockLilypad.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockLilypadHandler final :\n\tpublic cClearMetaOnDrop<cBlockHandler>\n{\n\tusing Super = cClearMetaOnDrop<cBlockHandler>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tauto UnderPos = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(UnderPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tBLOCKTYPE UnderType;\n\t\tNIBBLETYPE UnderMeta;\n\t\ta_Chunk.GetBlockTypeMeta(UnderPos, UnderType, UnderMeta);\n\t\treturn (\n\t\t\t(((UnderType == E_BLOCK_STATIONARY_WATER) || (UnderType == E_BLOCK_WATER)) && (UnderMeta == 0)) ||  // A water source is below\n\t\t\t(UnderType == E_BLOCK_ICE) || (UnderType == E_BLOCK_FROSTED_ICE)                                    // Or (frosted) ice\n\t\t);\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockMelon.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockMelonHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tconst auto DropNum = FortuneDiscreteRandom(3, 7, ToolFortuneLevel(a_Tool), 9);\n\t\treturn cItem(E_ITEM_MELON_SLICE, DropNum);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 19;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockMobHead.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n\n\n\n\n\nclass cBlockMobHeadHandler final :\n\tpublic cBlockEntityHandler\n{\n\tusing Super = cBlockEntityHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Drops handled by the block entity:\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockMobSpawner.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../Items/ItemHandler.h\"\n\n\n\n\n\nclass cBlockMobSpawnerHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\treturn a_ChunkInterface.UseBlockEntity(&a_Player, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z);\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable() const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// No pickups\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override\n\t{\n\t\tif (a_Digger == nullptr)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (!a_Digger->IsPlayer())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto Player = static_cast<const cPlayer *>(a_Digger);\n\t\tauto & Handler = Player->GetEquippedItem().GetHandler();\n\t\tif (!Player->IsGameModeSurvival() || !Handler.CanHarvestBlock(E_BLOCK_MOB_SPAWNER))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tauto & Random = GetRandomProvider();\n\t\tint Reward = 15 + Random.RandInt(14) + Random.RandInt(14);\n\t\ta_WorldInterface.SpawnSplitExperienceOrbs(Vector3d(0.5, 0.5, 0.5) + a_BlockPos, Reward);\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockMushroom.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\n/** Handler for the small (singleblock) mushrooms. */\nclass cBlockMushroomHandler final :\n\tpublic cClearMetaOnDrop<cBlockHandler>\n{\n\tusing Super = cClearMetaOnDrop<cBlockHandler>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t// TODO: Add Mushroom Spread\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto BasePos = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(BasePos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// TODO: Cannot be at too much daylight\n\n\t\tswitch (a_Chunk.GetBlock(BasePos))\n\t\t{\n\t\t\tcase E_BLOCK_GLASS:\n\t\t\tcase E_BLOCK_CACTUS:\n\t\t\tcase E_BLOCK_ICE:\n\t\t\tcase E_BLOCK_LEAVES:\n\t\t\tcase E_BLOCK_NEW_LEAVES:\n\t\t\tcase E_BLOCK_AIR:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockMycelium.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockMyceliumHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\t// TODO: Add Mycel Spread\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_BLOCK_DIRT, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 24;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockNetherWart.h",
    "content": "\n#pragma once\n\n#include \"BlockPlant.h\"\n#include \"../FastRandom.h\"\n\n\n\n\n\nclass cBlockNetherWartHandler final :\n\tpublic cBlockPlant<false>\n{\n\tusing Super = cBlockPlant<false>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tif (a_BlockMeta == 0x03)\n\t\t{\n\t\t\t// Fully grown, drop the entire produce:\n\t\t\tconst auto DropNum = FortuneDiscreteRandom(2, 4, ToolFortuneLevel(a_Tool));\n\t\t\treturn cItem(E_ITEM_NETHER_WART, DropNum);\n\t\t}\n\n\t\treturn cItem(E_ITEM_NETHER_WART);\n\t}\n\n\n\n\n\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const override\n\t{\n\t\tauto oldMeta = a_Chunk.GetMeta(a_RelPos);\n\t\tauto meta = std::min(oldMeta + a_NumStages, 3);\n\t\tif ((oldMeta < 3) && (CanGrow(a_Chunk, a_RelPos) == paGrowth))\n\t\t{\n\t\t\ta_Chunk.SetBlock(a_RelPos, m_BlockType, static_cast<NIBBLETYPE>(meta));\n\t\t\treturn meta - oldMeta;\n\t\t}\n\n\t\t// In older versions of cuberite, there was a bug which made wart grow too much. This check fixes previously saved buggy warts.\n\t\tif (oldMeta > 3)\n\t\t{\n\t\t\ta_Chunk.FastSetBlock(a_RelPos, m_BlockType, 3);\n\t\t}\n\t\treturn 0;\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Needs to be placed on top of a Soulsand block:\n\t\tconst auto BasePos = a_Position.addedY(-1);\n\t\treturn cChunkDef::IsValidHeight(BasePos) && (a_Chunk.GetBlock(BasePos) == E_BLOCK_SOULSAND);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 35;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockNetherrack.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockNetherrack final : public cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual bool CanSustainPlant(BLOCKTYPE a_Plant) const override\n\t{\n\t\treturn a_Plant == E_BLOCK_NETHER_WART;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockNoteBlock.h",
    "content": "\n#pragma once\n\n#include \"BlockEntity.h\"\n#include \"../BlockEntities/NoteEntity.h\"\n\n\n\n\n\nclass cBlockNoteBlockHandler final :\n\tpublic cBlockEntityHandler\n{\n\tusing Super = cBlockEntityHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual void OnDigging(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos\n\t) const override\n\t{\n\t\ta_WorldInterface.DoWithBlockEntityAt(a_BlockPos, [](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_NOTE_BLOCK);\n\n\t\t\tstatic_cast<cNoteEntity &>(a_BlockEntity).MakeSound();\n\t\t\treturn false;\n\t\t});\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockObserver.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n\n\nclass cBlockObserverHandler final :\n\tpublic cClearMetaOnDrop<cDisplacementYawRotator<cBlockHandler>>\n{\n\tusing Super = cClearMetaOnDrop<cDisplacementYawRotator<cBlockHandler>>;\n\npublic:\n\n\tusing Super::Super;\n\n\tinline static Vector3i GetObservingFaceOffset(NIBBLETYPE a_Meta)\n\t{\n\t\treturn -GetSignalOutputOffset(a_Meta);\n\t}\n\n\tinline static Vector3i GetSignalOutputOffset(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & 0x7)\n\t\t{\n\t\t\tcase 0x00: return { 0, 1, 0 };\n\t\t\tcase 0x01: return { 0, -1, 0 };\n\t\t\tcase 0x02: return { 0, 0, 1 };\n\t\t\tcase 0x03: return { 0, 0, -1 };\n\t\t\tcase 0x04: return { 1, 0, 0 };\n\t\t\tcase 0x05: return { -1, 0, 0 };\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Unknown metadata: %d\", __FUNCTION__, a_Meta);\n\t\t\t\tASSERT(!\"Unknown metadata while determining orientation of observer!\");\n\t\t\t\treturn { 0, 0, 0 };\n\t\t\t}\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockOre.h",
    "content": "\n#pragma once\n\n#include \"Blocks/BlockHandler.h\"\n#include \"Items/ItemHandler.h\"\n\n\n\n\n\nclass cBlockOreHandler :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\t~cBlockOreHandler() = default;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// If using silk-touch, drop self rather than the resource:\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\tswitch (m_BlockType)\n\t\t\t{\n\t\t\t\t// If it was a glowing redstone ore, drop a normal redstone ore:\n\t\t\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:   return cItem(E_BLOCK_REDSTONE_ORE);\n\t\t\t\tdefault:                             return cItem(m_BlockType);\n\t\t\t}\n\t\t}\n\n\t\tconst auto FortuneLevel = ToolFortuneLevel(a_Tool);\n\n\t\tif ((m_BlockType == E_BLOCK_REDSTONE_ORE) || (m_BlockType == E_BLOCK_REDSTONE_ORE_GLOWING))\n\t\t{   // Redstone follows the discrete random distribution, unlike other ores\n\t\t\tconst auto DropNum = FortuneDiscreteRandom(4, 5, FortuneLevel);\n\t\t\treturn cItem(E_ITEM_REDSTONE_DUST, DropNum);\n\t\t}\n\n\t\tauto & Random = GetRandomProvider();\n\t\tconst auto DropMult = std::max(static_cast<char>(1), FloorC<char>(Random.RandReal(FortuneLevel + 2.0)));\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_LAPIS_ORE:            return cItem(E_ITEM_DYE, DropMult * Random.RandInt<char>(4, 9), 4);\n\t\t\tcase E_BLOCK_DIAMOND_ORE:          return cItem(E_ITEM_DIAMOND, DropMult);\n\t\t\tcase E_BLOCK_EMERALD_ORE:          return cItem(E_ITEM_EMERALD, DropMult);\n\t\t\tcase E_BLOCK_COAL_ORE:             return cItem(E_ITEM_COAL, DropMult);\n\t\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:    return cItem(E_ITEM_NETHER_QUARTZ, DropMult);\n\t\t\tcase E_BLOCK_CLAY:                 return cItem(E_ITEM_CLAY, 4);\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn cItem(m_BlockType);\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override\n\t{\n\t\tif (a_Digger == nullptr)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (!a_Digger->IsPlayer())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto Player = static_cast<const cPlayer *>(a_Digger);\n\t\tif (!Player->IsGameModeSurvival())\n\t\t{\n\t\t\t// Don't drop XP unless the player is in survival mode.\n\t\t\treturn;\n\t\t}\n\n\t\tif (Player->GetEquippedItem().m_Enchantments.GetLevel(cEnchantments::enchSilkTouch) != 0)\n\t\t{\n\t\t\t// Don't drop XP when the ore is mined with the Silk Touch enchantment\n\t\t\treturn;\n\t\t}\n\n\t\tif (!Player->GetEquippedItem().GetHandler().CanHarvestBlock(m_BlockType))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tauto & Random = GetRandomProvider();\n\t\tint Reward = 0;\n\n\t\tswitch (a_OldBlockType)\n\t\t{\n\t\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:\n\t\t\tcase E_BLOCK_LAPIS_ORE:\n\t\t\t{\n\t\t\t\t// Lapis and nether quartz get 2 - 5 experience\n\t\t\t\tReward = Random.RandInt(2, 5);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\t\t{\n\t\t\t\t// Redstone gets 1 - 5 experience\n\t\t\t\tReward = Random.RandInt(1, 5);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\t\tcase E_BLOCK_EMERALD_ORE:\n\t\t\t{\n\t\t\t\t// Diamond and emerald get 3 - 7 experience\n\t\t\t\tReward = Random.RandInt(3, 7);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_COAL_ORE:\n\t\t\t{\n\t\t\t\t// Coal gets 0 - 2 experience\n\t\t\t\tReward = Random.RandInt(2);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: break;\n\t\t}\n\n\t\tif (Reward > 0)\n\t\t{\n\t\t\ta_WorldInterface.SpawnSplitExperienceOrbs(Vector3d(0.5, 0.5, 0.5) + a_BlockPos, Reward);\n\t\t}\n\t}\n} ;\n\n\n\n\n\nclass cDefaultOreHandler final :\n\tpublic cBlockOreHandler\n{\npublic:\n\n\tusing cBlockOreHandler::cBlockOreHandler;\n};\n"
  },
  {
    "path": "src/Blocks/BlockPackedIce.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockPackedIceHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Only drop self when using silk-touch:\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(m_BlockType);\n\t\t}\n\n\t\treturn {};\n\t}\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 5;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockPiston.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"BlockPiston.h\"\n#include \"../BlockInfo.h\"\n#include \"../Item.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../BlockInServerPluginInterface.h\"\n#include \"ChunkInterface.h\"\n\n\n\n\n\n#define PISTON_MAX_PUSH_DISTANCE 12\n\n\n\n\n\nVector3i cBlockPistonHandler::MetadataToOffset(NIBBLETYPE a_PistonMeta)\n{\n\tswitch (a_PistonMeta & 0x07)\n\t{\n\t\tcase 0: return Vector3i( 0, -1,  0);\n\t\tcase 1: return Vector3i( 0,  1,  0);\n\t\tcase 2: return Vector3i( 0,  0, -1);\n\t\tcase 3: return Vector3i( 0,  0,  1);\n\t\tcase 4: return Vector3i(-1,  0,  0);\n\t\tcase 5: return Vector3i( 1,  0,  0);\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"%s: invalid direction %d, ignoring\", __FUNCTION__, a_PistonMeta & 0x07);\n\t\t\tASSERT(!\"Invalid direction\");\n\t\t\treturn Vector3i();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBlockPistonHandler::ExtendPiston(Vector3i a_BlockPos, cWorld & a_World)\n{\n\t{\n\t\t// Broadcast block action first. Will do nothing if piston cannot in fact push\n\n\t\tBLOCKTYPE pistonBlock;\n\t\tNIBBLETYPE pistonMeta;\n\t\tif (a_World.GetBlockTypeMeta(a_BlockPos, pistonBlock, pistonMeta))\n\t\t{\n\t\t\ta_World.BroadcastBlockAction(\n\t\t\t\ta_BlockPos, PistonExtendAction, pistonMeta, pistonBlock\n\t\t\t);\n\t\t}\n\t}\n\n\t// Client expects the server to \"play\" the animation before setting the final blocks\n\t// However, we don't confuse animation with the underlying state of the world, so emulate by delaying 1 tick\n\t// (Probably why vanilla has so many dupe glitches with sand and pistons lolol)\n\n\ta_World.ScheduleTask(1_tick, [a_BlockPos](cWorld & World)\n\t\t{\n\t\t\tBLOCKTYPE pistonBlock;\n\t\t\tNIBBLETYPE pistonMeta;\n\n\n\t\t\tif (\n\t\t\t\t!World.GetBlockTypeMeta(a_BlockPos, pistonBlock, pistonMeta) ||\n\t\t\t\t((pistonBlock != E_BLOCK_PISTON) && !IsSticky(pistonBlock))\n\t\t\t)\n\t\t\t{\n\t\t\t\t// Ensure we operate on a piston to avoid spurious behaviour\n\t\t\t\t// Note that the scheduled task may result in the block type of a_BlockPos changing\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (IsExtended(pistonMeta))\n\t\t\t{\n\t\t\t\t// Already extended, bail out\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tVector3i pushDir = MetadataToOffset(pistonMeta);\n\t\t\tVector3iSet blocksPushed;\n\t\t\tif (!CanPushBlock(a_BlockPos + pushDir, World, true, blocksPushed, pushDir))\n\t\t\t{\n\t\t\t\t// Can't push anything, bail out\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tPushBlocks(blocksPushed, World, pushDir);\n\n\t\t\t// Set the extension and the piston base correctly\n\t\t\tVector3i extensionPos = a_BlockPos + pushDir;\n\t\t\tWorld.SetBlock(a_BlockPos, pistonBlock, pistonMeta | 0x8);\n\t\t\tWorld.SetBlock(extensionPos, E_BLOCK_PISTON_EXTENSION, pistonMeta | (IsSticky(pistonBlock) ? 8 : 0));\n\n\t\t\t// Play sound effect only if extended successfully\n\t\t\tWorld.BroadcastSoundEffect(\"block.piston.extend\", a_BlockPos, 0.5f, 0.7f);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cBlockPistonHandler::RetractPiston(Vector3i a_BlockPos, cWorld & a_World)\n{\n\t{\n\t\tBLOCKTYPE pistonBlock;\n\t\tNIBBLETYPE pistonMeta;\n\t\tif (a_World.GetBlockTypeMeta(a_BlockPos, pistonBlock, pistonMeta))\n\t\t{\n\t\t\ta_World.BroadcastBlockAction(\n\t\t\t\ta_BlockPos, PistonRetractAction, pistonMeta, pistonBlock\n\t\t\t);\n\t\t}\n\t}\n\n\ta_World.ScheduleTask(1_tick, [a_BlockPos](cWorld & World)\n\t\t{\n\t\t\tBLOCKTYPE pistonBlock;\n\t\t\tNIBBLETYPE pistonMeta;\n\n\t\t\tif (\n\t\t\t\t!World.GetBlockTypeMeta(a_BlockPos, pistonBlock, pistonMeta) ||\n\t\t\t\t((pistonBlock != E_BLOCK_PISTON) && !IsSticky(pistonBlock))\n\t\t\t)\n\t\t\t{\n\t\t\t\t// Ensure we operate on a piston to avoid spurious behaviour\n\t\t\t\t// Note that the scheduled task may result in the block type of a_BlockPos changing\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!IsExtended(pistonMeta))\n\t\t\t{\n\t\t\t\t// Already retracted, bail out\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tVector3i pushDir = MetadataToOffset(pistonMeta);\n\n\t\t\t// Check the extension:\n\t\t\tVector3i extensionPos = a_BlockPos + pushDir;\n\t\t\tif (World.GetBlock(extensionPos) != E_BLOCK_PISTON_EXTENSION)\n\t\t\t{\n\t\t\t\tLOGD(\"%s: Piston without an extension - still extending, or just in an invalid state?\", __FUNCTION__);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Remove extension, update base state:\n\t\t\tWorld.SetBlock(extensionPos, E_BLOCK_AIR, 0);\n\t\t\tWorld.SetBlock(a_BlockPos, pistonBlock, pistonMeta & ~(8));\n\n\t\t\t// (Retraction is always successful, but play in the task for consistency)\n\t\t\tWorld.BroadcastSoundEffect(\"block.piston.contract\", a_BlockPos, 0.5f, 0.7f);\n\n\t\t\tif (!IsSticky(pistonBlock))\n\t\t\t{\n\t\t\t\t// No need for block pulling, bail out\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Get the block to pull\n\t\t\tVector3i AdjustedPosition = a_BlockPos + pushDir * 2;\n\t\t\t// Try to \"push\" the pulling block in the opposite direction\n\t\t\tpushDir *= -1;\n\n\t\t\tVector3iSet pushedBlocks;\n\t\t\tif (!CanPushBlock(AdjustedPosition, World, false, pushedBlocks, pushDir))\n\t\t\t{\n\t\t\t\t// Not pushable, bail out\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tPushBlocks(pushedBlocks, World, pushDir);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cBlockPistonHandler::PushBlocks(\n\tconst Vector3iSet & a_BlocksToPush,\n\tcWorld & a_World, const Vector3i & a_PushDir\n)\n{\n\t// Sort blocks to move the blocks first, which are farthest away from the piston\n\t// This prevents the overwriting of existing blocks\n\tstd::vector<Vector3i> sortedBlocks(a_BlocksToPush.begin(), a_BlocksToPush.end());\n\tstd::sort(sortedBlocks.begin(), sortedBlocks.end(), [a_PushDir](const Vector3i & a, const Vector3i & b)\n\t{\n\t\treturn (a.Dot(a_PushDir) > b.Dot(a_PushDir));\n\t});\n\n\t// Move every block\n\tBLOCKTYPE moveBlock;\n\tNIBBLETYPE moveMeta;\n\tfor (auto & moveBlockPos : sortedBlocks)\n\t{\n\t\tif (a_World.GetBlockTypeMeta(moveBlockPos, moveBlock, moveMeta))\n\t\t{\n\t\t\tif (cBlockInfo::IsPistonBreakable(moveBlock))\n\t\t\t{\n\t\t\t\t// Block is breakable, drop it:\n\t\t\t\ta_World.DropBlockAsPickups(moveBlockPos, nullptr, nullptr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Not breakable, just move it\n\t\t\t\ta_World.SetBlock(moveBlockPos, E_BLOCK_AIR, 0);\n\t\t\t\tmoveBlockPos += a_PushDir;\n\t\t\t\ta_World.SetBlock(moveBlockPos, moveBlock, moveMeta);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cBlockPistonHandler::CanPushBlock(\n\tconst Vector3i & a_BlockPos, cWorld & a_World, bool a_RequirePushable,\n\tVector3iSet & a_BlocksPushed, const Vector3i & a_PushDir\n)\n{\n\tif (!cChunkDef::IsValidHeight(a_BlockPos))\n\t{\n\t\t// Can't push a void block.\n\t\treturn false;\n\t}\n\n\tconst static std::array<Vector3i, 6> pushingDirs =\n\t{\n\t\t{\n\t\t\tVector3i(-1,  0,  0), Vector3i(1, 0, 0),\n\t\t\tVector3i( 0, -1,  0), Vector3i(0, 1, 0),\n\t\t\tVector3i( 0,  0, -1), Vector3i(0, 0, 1)\n\t\t}\n\t};\n\n\tBLOCKTYPE currBlock;\n\tNIBBLETYPE currMeta;\n\tif (!a_World.GetBlockTypeMeta(a_BlockPos, currBlock, currMeta))\n\t{\n\t\treturn !a_RequirePushable;\n\t}\n\n\tif (currBlock == E_BLOCK_AIR)\n\t{\n\t\t// Air can be pushed\n\t\treturn true;\n\t}\n\n\tif (!a_RequirePushable && cBlockInfo::IsPistonBreakable(currBlock))\n\t{\n\t\t// Block should not be broken, when it's not in the pushing direction\n\t\treturn true;\n\t}\n\n\tif (!CanPush(currBlock, currMeta))\n\t{\n\t\t// When it's not required to push this block, don't fail\n\t\treturn !a_RequirePushable;\n\t}\n\n\tif (a_BlocksPushed.size() >= PISTON_MAX_PUSH_DISTANCE)\n\t{\n\t\t// Do not allow to push too much blocks\n\t\treturn false;\n\t}\n\n\tif (!a_BlocksPushed.insert(a_BlockPos).second || cBlockInfo::IsPistonBreakable(currBlock))\n\t{\n\t\treturn true;  // Element exist already\n\t}\n\n\tif (currBlock == E_BLOCK_SLIME_BLOCK)\n\t{\n\t\t// Try to push the other directions\n\t\tfor (const auto & testDir : pushingDirs)\n\t\t{\n\t\t\tif (!CanPushBlock(a_BlockPos + testDir, a_World, false, a_BlocksPushed, a_PushDir))\n\t\t\t{\n\t\t\t\t// When it's not possible for a direction, then fail\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Try to push the block in front of this block\n\treturn CanPushBlock(a_BlockPos + a_PushDir, a_World, true, a_BlocksPushed, a_PushDir);\n}\n\n\n\n\n\nvoid cBlockPistonHandler::OnBroken(\n\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\tVector3i a_BlockPos,\n\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\tconst cEntity * a_Digger\n) const\n{\n\tUNUSED(a_Digger);\n\tif (!IsExtended(a_OldBlockMeta))\n\t{\n\t\treturn;\n\t}\n\n\tconst auto Extension = a_BlockPos + MetadataToOffset(a_OldBlockMeta);\n\tif (\n\t\tcChunkDef::IsValidHeight(Extension) &&\n\t\t(a_ChunkInterface.GetBlock(Extension) == E_BLOCK_PISTON_EXTENSION)\n\t)\n\t{\n\t\t// If the piston is extended, destroy the extension as well:\n\t\ta_ChunkInterface.SetBlock(Extension, E_BLOCK_AIR, 0);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBlockPistonHeadHandler:\n\nvoid cBlockPistonHeadHandler::OnBroken(\n\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\tVector3i a_BlockPos,\n\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\tconst cEntity * a_Digger\n) const\n{\n\tUNUSED(a_Digger);\n\tconst auto Base = a_BlockPos - cBlockPistonHandler::MetadataToOffset(a_OldBlockMeta);\n\tif (!cChunkDef::IsValidHeight(Base))\n\t{\n\t\treturn;\n\t}\n\n\tconst auto Block = a_ChunkInterface.GetBlock(Base);\n\tif ((Block == E_BLOCK_PISTON) || (Block == E_BLOCK_STICKY_PISTON))\n\t{\n\t\t// Remove the base of the piston:\n\t\ta_ChunkInterface.SetBlock(Base, E_BLOCK_AIR, 0);\n\t}\n}\n\n\n\n\n\ncItems cBlockPistonHeadHandler::ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const\n{\n\t// Give a normal\\sticky piston base, not piston extension\n\t// With 1.7, the item forms of these technical blocks have been removed, so giving someone this will crash their client...\n\treturn { cItem(((a_BlockMeta & 0x8) == 0x8) ? E_BLOCK_STICKY_PISTON : E_BLOCK_PISTON) };\n}\n"
  },
  {
    "path": "src/Blocks/BlockPiston.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n#include \"../Item.h\"\n\n\n\n\n// fwd:\nclass cWorld;\n\n\n\n\n\nclass cBlockPistonHandler final :\n\tpublic cClearMetaOnDrop<cDisplacementYawRotator<cBlockHandler, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>>\n{\n\tusing Super = cClearMetaOnDrop<cDisplacementYawRotator<cBlockHandler, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>>;\n\npublic:\n\n\tusing Super::Super;\n\n\tstatic eBlockFace MetaDataToDirection(NIBBLETYPE a_MetaData)\n\t{\n\t\tswitch (a_MetaData & 0x7)  // We only want the bottom three bits (4th controls extended-ness))\n\t\t{\n\t\t\tcase 0x0: return BLOCK_FACE_YM;\n\t\t\tcase 0x1: return BLOCK_FACE_YP;\n\t\t\tcase 0x2: return BLOCK_FACE_ZM;\n\t\t\tcase 0x3: return BLOCK_FACE_ZP;\n\t\t\tcase 0x4: return BLOCK_FACE_XM;\n\t\t\tcase 0x5: return BLOCK_FACE_XP;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Invalid Metadata\");\n\t\t\t\treturn BLOCK_FACE_NONE;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Converts piston block's metadata into a unit vector representing the direction in which the piston will extend. */\n\tstatic Vector3i MetadataToOffset(NIBBLETYPE a_PistonMeta);\n\n\tstatic void ExtendPiston(Vector3i a_BlockPos, cWorld & a_World);\n\tstatic void RetractPiston(Vector3i a_BlockPos, cWorld & a_World);\n\n\t/** Returns true if the piston (with the specified meta) is extended */\n\tstatic inline bool IsExtended(NIBBLETYPE a_PistonMeta) { return ((a_PistonMeta & 0x8) != 0x0); }\n\nprivate:\n\n\ttypedef std::unordered_set<Vector3i, VectorHasher<int>> Vector3iSet;\n\n\t/** Piston extension block action */\n\tstatic const Byte PistonExtendAction = 0U;\n\n\t/** Piston retraction block action */\n\tstatic const Byte PistonRetractAction = 1U;\n\n\t/** Returns true if the piston (specified by blocktype) is a sticky piston */\n\tstatic inline bool IsSticky(BLOCKTYPE a_BlockType) { return (a_BlockType == E_BLOCK_STICKY_PISTON); }\n\n\t/** Returns true if the specified block can be pushed by a piston (and left intact) */\n\tstatic inline bool CanPush(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_ANVIL:\n\t\t\tcase E_BLOCK_BARRIER:\n\t\t\tcase E_BLOCK_BEACON:\n\t\t\tcase E_BLOCK_BEDROCK:\n\t\t\tcase E_BLOCK_BREWING_STAND:\n\t\t\tcase E_BLOCK_CHAIN_COMMAND_BLOCK:\n\t\t\tcase E_BLOCK_CHEST:\n\t\t\tcase E_BLOCK_COMMAND_BLOCK:\n\t\t\tcase E_BLOCK_DAYLIGHT_SENSOR:\n\t\t\tcase E_BLOCK_DISPENSER:\n\t\t\tcase E_BLOCK_DROPPER:\n\t\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\t\tcase E_BLOCK_END_GATEWAY:\n\t\t\tcase E_BLOCK_END_PORTAL:\n\t\t\tcase E_BLOCK_END_PORTAL_FRAME:\n\t\t\tcase E_BLOCK_ENDER_CHEST:\n\t\t\tcase E_BLOCK_FURNACE:\n\t\t\tcase E_BLOCK_LIT_FURNACE:\n\t\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:\n\t\t\tcase E_BLOCK_HOPPER:\n\t\t\tcase E_BLOCK_JUKEBOX:\n\t\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\t\tcase E_BLOCK_NETHER_PORTAL:\n\t\t\tcase E_BLOCK_NOTE_BLOCK:\n\t\t\tcase E_BLOCK_OBSIDIAN:\n\t\t\tcase E_BLOCK_PISTON_EXTENSION:\n\t\t\tcase E_BLOCK_REPEATING_COMMAND_BLOCK:\n\t\t\tcase E_BLOCK_STANDING_BANNER:\n\t\t\tcase E_BLOCK_STRUCTURE_BLOCK:\n\t\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\t\tcase E_BLOCK_WALL_BANNER:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcase E_BLOCK_STICKY_PISTON:\n\t\t\tcase E_BLOCK_PISTON:\n\t\t\t{\n\t\t\t\t// A piston can only be pushed if retracted:\n\t\t\t\treturn !IsExtended(a_BlockMeta);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/** Tries to push a block and increases the pushed blocks variable. Returns true if the block is pushable */\n\tstatic bool CanPushBlock(\n\t\tconst Vector3i & a_BlockPos, cWorld & a_World, bool a_RequirePushable,\n\t\tVector3iSet & a_BlocksPushed, const Vector3i & a_PushDir\n\t);\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 11;\n\t}\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override;\n\n\t/** Moves a list of blocks in a specific direction */\n\tstatic void PushBlocks(const Vector3iSet & a_BlocksToPush,\n\t\tcWorld & a_World, const Vector3i & a_PushDir\n\t);\n} ;\n\n\n\n\n\nclass cBlockPistonHeadHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tconstexpr cBlockPistonHeadHandler(void) :\n\t\tSuper(E_BLOCK_PISTON_EXTENSION)\n\t{\n\t}\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override;\n\n\tvirtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, const cItem * a_Tool) const override;\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockPlanks.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockPlanksHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase E_META_PLANKS_BIRCH: return 2;\n\t\t\tcase E_META_PLANKS_JUNGLE: return 10;\n\t\t\tcase E_META_PLANKS_OAK: return 13;\n\t\t\tcase E_META_PLANKS_ACACIA: return 15;\n\t\t\tcase E_META_PLANKS_DARK_OAK: return 26;\n\t\t\tcase E_META_PLANKS_SPRUCE: return 34;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled meta in planks handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockPlant.h",
    "content": "#pragma once\n\n\n#include \"BlockHandler.h\"\n\n\n\n\n/** Base class for plants that use light values to decide whether to grow or not.\nOn block update, the plant decides whether to grow, die or stay as-is, based on the CanGrow() overridable method result. */\ntemplate <bool NeedsLightToGrow>\nclass cBlockPlant :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\t~cBlockPlant() = default;\n\n\t/** The action the plant can take on an update. */\n\tenum PlantAction\n\t{\n\t\tpaDeath,\n\t\tpaGrowth,\n\t\tpaStay\n\t};\n\n\t/** Checks whether there is enough light for the plant to grow.\n\tIf the plant doesn't require light to grow, then it returns paGrowth.\n\tIf the plant requires light to grow and there is enough light, it returns paGrowth.\n\tIf the plant requires light to grow and there isn't enough light, it returns paStay.\n\tIf the plant requires light to grow and there is too little light, it returns paDeath. */\n\tstatic PlantAction HasEnoughLight(cChunk & a_Chunk, Vector3i a_RelPos)\n\t{\n\t\t// If the plant requires light to grow, check to see if there is enough light\n\t\t// Otherwise, return true\n\t\tif (!NeedsLightToGrow)\n\t\t{\n\t\t\treturn paGrowth;\n\t\t}\n\t\tNIBBLETYPE Blocklight = a_Chunk.GetBlockLight(a_RelPos);\n\t\tNIBBLETYPE SkyLight   = a_Chunk.GetSkyLight  (a_RelPos);\n\t\tNIBBLETYPE Light = a_Chunk.GetTimeAlteredLight(SkyLight);\n\n\t\t// If the amount of light provided by blocks is greater than the sky light, use it instead\n\t\tif (Blocklight > Light)\n\t\t{\n\t\t\tLight = Blocklight;\n\t\t}\n\n\t\t// Based on light levels, decide between growth, stay and death:\n\t\tif (Light > 8)\n\t\t{\n\t\t\treturn paGrowth;\n\t\t}\n\t\telse if ((Blocklight < 9) && (SkyLight < 9))\n\t\t{\n\t\t\treturn paDeath;\n\t\t}\n\n\t\treturn paStay;\n\t}\n\n\n\n\n\n\t/** Checks whether a plant can grow grow, based on what is returned from cBlockPlant::HasEnoughLight\n\tand a random check based on what is returned from cBlockPlant::GetGrowthChance.\n\tCan return three values.\n\tpaGrowth when the conditions are right for the plant to grow.\n\tpaStay when the conditions are not quite right.\n\tpaDeath is returned when there isn't enough light for the plant to survive.\n\tPlants that don't require light will never have a paDeath returned\n\t*/\n\tvirtual PlantAction CanGrow(cChunk & a_Chunk, Vector3i a_RelPos) const\n\t{\n\t\t// Plant can grow if it has the required amount of light, and it passes a random chance based on surrounding blocks\n\t\tauto action = HasEnoughLight(a_Chunk, a_RelPos);\n\t\tif ((action == paGrowth) && !GetRandomProvider().RandBool(1.0 / GetGrowthChance(a_Chunk, a_RelPos)))\n\t\t{\n\t\t\taction = paStay;\n\t\t}\n\t\treturn action;\n\t}\n\n\n\n\n\n\t/** Generates an int value between 4 and 25 based on surrounding blocks that affect how quickly the plant grows.\n\tThe higher the value, the less likely the plant is to grow */\n\tvirtual int GetGrowthChance(cChunk & a_Chunk, Vector3i a_RelPos) const\n\t{\n\t\tfloat Chance = 1.0f;\n\t\ta_RelPos.y -= 1;\n\t\tfor (int x = -1; x < 2; ++x)\n\t\t{\n\t\t\tfor (int z = -1; z < 2; ++z)\n\t\t\t{\n\t\t\t\tfloat Adjustment = 0.0f;\n\t\t\t\tBLOCKTYPE Block;\n\t\t\t\tNIBBLETYPE Meta;\n\n\t\t\t\t// If the chunk we are trying to get the block information from is loaded\n\t\t\t\tif (a_Chunk.UnboundedRelGetBlock(a_RelPos + Vector3i(x, 0, z), Block, Meta))\n\t\t\t\t{\n\t\t\t\t\t// If the block affects growth, add to the adjustment\n\t\t\t\t\tif (cBlockHandler::For(Block).CanSustainPlant(m_BlockType))\n\t\t\t\t\t{\n\t\t\t\t\t\tAdjustment = 1.0f;\n\n\t\t\t\t\t\t// Farmland  alters the chance further if it is watered\n\t\t\t\t\t\tif ((Block == E_BLOCK_FARMLAND) && (Meta != 0))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tAdjustment = 3.0f;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If this is not the block right underneath the plant, it has little effect on the growth\n\t\t\t\tif ((x != 0) || (z != 0))\n\t\t\t\t{\n\t\t\t\t\tAdjustment /= 4.0f;\n\t\t\t\t}\n\n\t\t\t\tChance += Adjustment;\n\t\t\t}\n\t\t}\n\t\treturn FloorC(24.0f / Chance) + 1;\n\t}\n\nprivate:\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tauto Action = CanGrow(a_Chunk, a_RelPos);\n\t\tswitch (Action)\n\t\t{\n\t\t\tcase paGrowth:\n\t\t\t{\n\t\t\t\tif (Grow(a_Chunk, a_RelPos) == 0)\n\t\t\t\t{\n\t\t\t\t\tBearFruit(a_Chunk, a_RelPos);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase paDeath:\n\t\t\t{\n\t\t\t\ta_ChunkInterface.SetBlock(a_Chunk.RelativeToAbsolute(a_RelPos), E_BLOCK_AIR, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase paStay: break;  // do nothing\n\t\t}\n\t}\n\n\t/** Grows the final produce next to the stem at the specified position. */\n\tvirtual void BearFruit(cChunk & a_Chunk, const Vector3i a_StemRelPos) const\n\t{\n\t\t// Nothing to do by default\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockPluginInterface.h",
    "content": "\n// BlockPluginInterface.h\n\n// Declares the cBlockPluginInterface class representing an interface that the blockhandlers and itemhandlers use for calling plugins\n\n\n\n\n\n#pragma once\n\n\n\n\n\n// fwd:\nclass cPlayer;\n\n\n\n\n\n/** This interface is used to decouple block handlers from the cPluginManager dependency through cWorld.\nThe block handlers call this interface, which is then implemented by the specific classes that\nthe caller provides.\n*/\nclass cBlockPluginInterface\n{\npublic:\n\tvirtual ~cBlockPluginInterface() {}\n\n\tvirtual bool CallHookBlockSpread(Vector3i a_BlockPos, eSpreadSource a_Source) = 0;\n\tvirtual bool CallHookPlayerBreakingBlock(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;\n\tvirtual bool CallHookPlayerBrokenBlock(cPlayer & a_Player, Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockPortal.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockPortalHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// No pickups\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\t// Spawn zombie pigmen with a 0.05% chance:\n\t\tif (GetRandomProvider().RandBool(0.9995))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tauto WorldPos = a_Chunk.RelativeToAbsolute(a_RelPos);\n\t\ta_WorldInterface.SpawnMob(WorldPos.x, WorldPos.y, WorldPos.z, mtZombiePigman, false);\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tif (!cChunkDef::IsValidHeight(a_Position.addedY(-1)) || !cChunkDef::IsValidHeight(a_Position.addedY(1)))\n\t\t{\n\t\t\treturn false;  // Must be 1 away from the boundary, there will always be another portal or an obsidian between the portal block and the boundary.\n\t\t}\n\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase 0x1:\n\t\t\t{\n\t\t\t\tstatic const std::array<Vector3i, 4> PortalCheck\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\t{ 0, 1, 0 },\n\t\t\t\t\t\t{ 0, -1, 0 },\n\t\t\t\t\t\t{ 1, 0, 0 },\n\t\t\t\t\t\t{ -1, 0, 0 },\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tfor (const auto & Direction : PortalCheck)\n\t\t\t\t{\n\t\t\t\t\tBLOCKTYPE Block;\n\t\t\t\t\ta_Chunk.UnboundedRelGetBlockType(a_Position + Direction, Block);\n\t\t\t\t\tif ((Block != E_BLOCK_NETHER_PORTAL) && (Block != E_BLOCK_OBSIDIAN))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 0x2:\n\t\t\t{\n\t\t\t\tstatic const std::array<Vector3i, 4> PortalCheck\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\t{ 0, 1, 0 },\n\t\t\t\t\t\t{ 0, -1, 0 },\n\t\t\t\t\t\t{ 0, 0, -1 },\n\t\t\t\t\t\t{ 0, 0, 1 },\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tfor (const auto & Direction : PortalCheck)\n\t\t\t\t{\n\t\t\t\t\tBLOCKTYPE Block;\n\t\t\t\t\ta_Chunk.UnboundedRelGetBlockType(a_Position + Direction, Block);\n\t\t\t\t\tif ((Block != E_BLOCK_NETHER_PORTAL) && (Block != E_BLOCK_OBSIDIAN))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 24;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockPressurePlate.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"BlockSlab.h\"\n#include \"../Chunk.h\"\n#include \"BlockStairs.h\"\n\n\n\n\nclass cBlockPressurePlateHandler final :\n\tpublic cClearMetaOnDrop<cBlockHandler>\n{\n\tusing Super = cClearMetaOnDrop<cBlockHandler>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto PosBelow = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(PosBelow))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tBLOCKTYPE Block;\n\t\tNIBBLETYPE BlockMeta;\n\t\ta_Chunk.GetBlockTypeMeta(PosBelow, Block, BlockMeta);\n\n\t\t// upside down slabs\n\t\tif (cBlockSlabHandler::IsAnySlabType(Block))\n\t\t{\n\t\t\treturn BlockMeta & E_META_WOODEN_SLAB_UPSIDE_DOWN;\n\t\t}\n\n\t\t// upside down stairs\n\t\tif (cBlockStairsHandler::IsAnyStairType(Block))\n\t\t{\n\t\t\treturn BlockMeta & E_BLOCK_STAIRS_UPSIDE_DOWN;\n\t\t}\n\n\t\tswitch (Block)\n\t\t{\n\t\t\tcase E_BLOCK_ACACIA_FENCE:\n\t\t\tcase E_BLOCK_BIRCH_FENCE:\n\t\t\tcase E_BLOCK_DARK_OAK_FENCE:\n\t\t\tcase E_BLOCK_FENCE:\n\t\t\tcase E_BLOCK_HOPPER:\n\t\t\tcase E_BLOCK_JUNGLE_FENCE:\n\t\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\t\tcase E_BLOCK_SPRUCE_FENCE:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn !cBlockInfo::IsTransparent(Block);\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_STONE_PRESSURE_PLATE: return 11;\n\t\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE: return 13;\n\t\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE: return 6;\n\t\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE: return 30;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled blocktype in pressure plate handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockPumpkin.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n\n\n\nclass cBlockPumpkinHandler final :\n\tpublic cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x00, 0x01, 0x02, 0x03>>\n{\n\tusing Super = cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x00, 0x01, 0x02, 0x03>>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 15;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockQuartz.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockQuartzHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 8;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockRail.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n#include \"BlockType.h\"\n#include \"Mixins/Mixins.h\"\n#include \"Mixins/SolidSurfaceUnderneath.h\"\n#include \"../BlockInfo.h\"\n#include \"../Chunk.h\"\n#include \"ChunkDef.h\"\n\n\n\n\n\nenum ENUM_PURE\n{\n\tE_PURE_UPDOWN = 0,\n\tE_PURE_DOWN = 1,\n\tE_PURE_NONE = 2\n};\n\n\n\n\n\nclass cBlockRailHandler final :\n\tpublic cSolidSurfaceUnderneath<cClearMetaOnDrop<cBlockHandler>>\n{\n\tusing Super = cSolidSurfaceUnderneath<cClearMetaOnDrop<cBlockHandler>>;\n\npublic:\n\n\tusing Super::Super;\n\n\n\tstatic NIBBLETYPE FindMeta(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, BLOCKTYPE a_RailType)\n\t{\n\t\tNIBBLETYPE Meta = 0;\n\t\tchar RailsCnt = 0;\n\t\tbool Neighbors[8];  // 0 - EAST, 1 - WEST, 2 - NORTH, 3 - SOUTH, 4 - EAST UP, 5 - WEST UP, 6 - NORTH UP, 7 - SOUTH UP\n\t\tmemset(Neighbors, 0, sizeof(Neighbors));\n\t\tNeighbors[0] = (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(1, 0, 0)) || !IsNotConnected(a_ChunkInterface, a_BlockPos, BLOCK_FACE_EAST, E_PURE_DOWN));\n\t\tNeighbors[1] = (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(-1, 0, 0)) || !IsNotConnected(a_ChunkInterface, a_BlockPos, BLOCK_FACE_WEST, E_PURE_DOWN));\n\t\tNeighbors[2] = (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(0, 0, -1)) || !IsNotConnected(a_ChunkInterface, a_BlockPos, BLOCK_FACE_NORTH, E_PURE_DOWN));\n\t\tNeighbors[3] = (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(0, 0, 1)) || !IsNotConnected(a_ChunkInterface, a_BlockPos, BLOCK_FACE_SOUTH, E_PURE_DOWN));\n\t\tNeighbors[4] = (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(1, 1, 0)) || !IsNotConnected(a_ChunkInterface, a_BlockPos + Vector3i(0, 1, 0), BLOCK_FACE_EAST, E_PURE_NONE));\n\t\tNeighbors[5] = (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(-1, 1, 0)) || !IsNotConnected(a_ChunkInterface, a_BlockPos + Vector3i(0, 1, 0), BLOCK_FACE_WEST, E_PURE_NONE));\n\t\tNeighbors[6] = (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(0, 1, -1)) || !IsNotConnected(a_ChunkInterface, a_BlockPos + Vector3i(0, 1, 0), BLOCK_FACE_NORTH, E_PURE_NONE));\n\t\tNeighbors[7] = (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(0, 1, 1)) || !IsNotConnected(a_ChunkInterface, a_BlockPos + Vector3i(0, 1, 0), BLOCK_FACE_SOUTH, E_PURE_NONE));\n\t\tif (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(1, -1, 0)) || !IsNotConnected(a_ChunkInterface, a_BlockPos - Vector3i(0, 1, 0), BLOCK_FACE_EAST))\n\t\t{\n\t\t\tNeighbors[0] = true;\n\t\t}\n\t\tif (IsUnstable(a_ChunkInterface, a_BlockPos - Vector3i(1, 1, 0)) || !IsNotConnected(a_ChunkInterface, a_BlockPos - Vector3i(0, 1, 0), BLOCK_FACE_WEST))\n\t\t{\n\t\t\tNeighbors[1] = true;\n\t\t}\n\t\tif (IsUnstable(a_ChunkInterface, a_BlockPos - Vector3i(0, 1, 1)) || !IsNotConnected(a_ChunkInterface, a_BlockPos - Vector3i(0, 1, 0), BLOCK_FACE_NORTH))\n\t\t{\n\t\t\tNeighbors[2] = true;\n\t\t}\n\t\tif (IsUnstable(a_ChunkInterface, a_BlockPos + Vector3i(0, -1, 1)) || !IsNotConnected(a_ChunkInterface, a_BlockPos - Vector3i(0, 1, 0), BLOCK_FACE_SOUTH))\n\t\t{\n\t\t\tNeighbors[3] = true;\n\t\t}\n\t\tfor (int i = 0; i < 8; i++)\n\t\t{\n\t\t\tif (Neighbors[i])\n\t\t\t{\n\t\t\t\tRailsCnt++;\n\t\t\t}\n\t\t}\n\t\tif (RailsCnt == 1)\n\t\t{\n\t\t\tif (Neighbors[7])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ASCEND_ZP;\n\t\t\t}\n\t\t\telse if (Neighbors[6])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ASCEND_ZM;\n\t\t\t}\n\t\t\telse if (Neighbors[5])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ASCEND_XM;\n\t\t\t}\n\t\t\telse if (Neighbors[4])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ASCEND_XP;\n\t\t\t}\n\t\t\telse if (Neighbors[0] || Neighbors[1])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_XM_XP;\n\t\t\t}\n\t\t\telse if (Neighbors[2] || Neighbors[3])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ZM_ZP;\n\t\t\t}\n\t\t\tASSERT(!\"Weird neighbor count\");\n\t\t\treturn Meta;\n\t\t}\n\t\tfor (int i = 0; i < 4; i++)\n\t\t{\n\t\t\tif (Neighbors[i + 4])\n\t\t\t{\n\t\t\t\tNeighbors[i] = true;\n\t\t\t}\n\t\t}\n\t\tif (RailsCnt > 1)\n\t\t{\n\t\t\tconst bool CanCurve = a_RailType == E_BLOCK_RAIL;\n\n\t\t\tif (Neighbors[3] && Neighbors[0] && CanCurve)\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_CURVED_ZP_XP;\n\t\t\t}\n\t\t\telse if (Neighbors[3] && Neighbors[1] && CanCurve)\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_CURVED_ZP_XM;\n\t\t\t}\n\t\t\telse if (Neighbors[2] && Neighbors[0] && CanCurve)\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_CURVED_ZM_XP;\n\t\t\t}\n\t\t\telse if (Neighbors[2] && Neighbors[1] && CanCurve)\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_CURVED_ZM_XM;\n\t\t\t}\n\t\t\telse if (Neighbors[7] && Neighbors[2])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ASCEND_ZP;\n\t\t\t}\n\t\t\telse if (Neighbors[3] && Neighbors[6])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ASCEND_ZM;\n\t\t\t}\n\t\t\telse if (Neighbors[5] && Neighbors[0])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ASCEND_XM;\n\t\t\t}\n\t\t\telse if (Neighbors[4] && Neighbors[1])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ASCEND_XP;\n\t\t\t}\n\t\t\telse if (Neighbors[0] && Neighbors[1])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_XM_XP;\n\t\t\t}\n\t\t\telse if (Neighbors[2] && Neighbors[3])\n\t\t\t{\n\t\t\t\treturn E_META_RAIL_ZM_ZP;\n\t\t\t}\n\n\t\t\tif (CanCurve)\n\t\t\t{\n\t\t\t\tASSERT(!\"Weird neighbor count\");\n\t\t\t}\n\t\t}\n\t\treturn Meta;\n\t}\n\nprivate:\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, NIBBLETYPE a_Meta) const override\n\t{\n\t\tif (!Super::CanBeAt(a_Chunk, a_Position, a_Meta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase E_META_RAIL_ASCEND_XP:\n\t\t\tcase E_META_RAIL_ASCEND_XM:\n\t\t\tcase E_META_RAIL_ASCEND_ZM:\n\t\t\tcase E_META_RAIL_ASCEND_ZP:\n\t\t\t{\n\t\t\t\t// Mapping between the meta and the neighbors that need checking\n\t\t\t\ta_Meta -= E_META_RAIL_ASCEND_XP;  // Base index at zero\n\t\t\t\tstatic const Vector3i Coords[] =\n\t\t\t\t{\n\t\t\t\t\t{ 1, 0,  0},  // east,  XP\n\t\t\t\t\t{-1, 0,  0},  // west,  XM\n\t\t\t\t\t{ 0, 0, -1},  // north, ZM\n\t\t\t\t\t{ 0, 0,  1},  // south, ZP\n\t\t\t\t} ;\n\t\t\t\tBLOCKTYPE  BlockType;\n\t\t\t\tNIBBLETYPE BlockMeta;\n\t\t\t\tif (!a_Chunk.UnboundedRelGetBlock(a_Position + Coords[a_Meta], BlockType, BlockMeta))\n\t\t\t\t{\n\t\t\t\t\t// Too close to the edge, cannot simulate\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn cBlockInfo::FullyOccupiesVoxel(BlockType);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\tstatic bool IsUnstable(cChunkInterface & a_ChunkInterface, Vector3i a_Pos)\n\t{\n\t\tif (!IsBlockRail(a_ChunkInterface.GetBlock(a_Pos)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tNIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_Pos);\n\t\tswitch (Meta)\n\t\t{\n\t\t\tcase E_META_RAIL_ZM_ZP:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_NORTH, E_PURE_DOWN) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_SOUTH, E_PURE_DOWN)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_XM_XP:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_EAST, E_PURE_DOWN) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_WEST, E_PURE_DOWN)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_ASCEND_XP:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos + Vector3i(0, 1, 0), BLOCK_FACE_EAST) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_WEST)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_ASCEND_XM:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_EAST) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos + Vector3i(0, 1, 0), BLOCK_FACE_WEST)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_ASCEND_ZM:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos + Vector3i(0, 1, 0), BLOCK_FACE_NORTH) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_SOUTH)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_ASCEND_ZP:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_NORTH) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos + Vector3i(0, 1, 0), BLOCK_FACE_SOUTH)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_CURVED_ZP_XP:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_SOUTH) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_EAST)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_CURVED_ZP_XM:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_SOUTH) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_WEST)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_CURVED_ZM_XM:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_NORTH) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_WEST)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase E_META_RAIL_CURVED_ZM_XP:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_NORTH) ||\n\t\t\t\t\tIsNotConnected(a_ChunkInterface, a_Pos, BLOCK_FACE_EAST)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\n\tstatic bool IsNotConnected(cChunkInterface  & a_ChunkInterface, Vector3i a_Pos, eBlockFace a_BlockFace, char a_Pure = 0)\n\t{\n\t\ta_Pos = AddFaceDirection(a_Pos, a_BlockFace, false);\n\n\t\tNIBBLETYPE Meta;\n\n\t\tif (!IsBlockRail(a_ChunkInterface.GetBlock(a_Pos)))\n\t\t{\n\t\t\tif (!IsBlockRail(a_ChunkInterface.GetBlock(a_Pos + Vector3i(0, 1, 0))) || (a_Pure != E_PURE_UPDOWN))\n\t\t\t{\n\t\t\t\tif (!IsBlockRail(a_ChunkInterface.GetBlock(a_Pos - Vector3i(0, 1, 0))) || (a_Pure == E_PURE_NONE))\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tMeta = a_ChunkInterface.GetBlockMeta(a_Pos - Vector3i(0, 1, 0));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tMeta = a_ChunkInterface.GetBlockMeta(a_Pos + Vector3i(0, 1, 0));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMeta = a_ChunkInterface.GetBlockMeta(a_Pos);\n\t\t}\n\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_NORTH:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t(Meta == E_META_RAIL_ZM_ZP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_ASCEND_ZM) ||\n\t\t\t\t\t(Meta == E_META_RAIL_ASCEND_ZP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_CURVED_ZP_XP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_CURVED_ZP_XM)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase BLOCK_FACE_SOUTH:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t(Meta == E_META_RAIL_ZM_ZP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_ASCEND_ZM) ||\n\t\t\t\t\t(Meta == E_META_RAIL_ASCEND_ZP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_CURVED_ZM_XP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_CURVED_ZM_XM)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase BLOCK_FACE_EAST:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t(Meta == E_META_RAIL_XM_XP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_ASCEND_XP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_ASCEND_XM) ||\n\t\t\t\t\t(Meta == E_META_RAIL_CURVED_ZP_XM) ||\n\t\t\t\t\t(Meta == E_META_RAIL_CURVED_ZM_XM)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase BLOCK_FACE_WEST:\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t(Meta == E_META_RAIL_XM_XP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_ASCEND_XP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_ASCEND_XM) ||\n\t\t\t\t\t(Meta == E_META_RAIL_CURVED_ZP_XP) ||\n\t\t\t\t\t(Meta == E_META_RAIL_CURVED_ZM_XP)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase BLOCK_FACE_NONE:\n\t\t\tcase BLOCK_FACE_YM:\n\t\t\tcase BLOCK_FACE_YP:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\n\tvirtual void OnBroken(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,\n\t\tconst cEntity * a_Digger\n\t) const override\n\t{\n\t\tSuper::OnBroken(a_ChunkInterface, a_WorldInterface, a_BlockPos, a_OldBlockType, a_OldBlockMeta, a_Digger);\n\n\t\t// Alert diagonal rails:\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 1,  1,  0), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i(-1,  1,  0), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 0, +1,  1), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 0, +1, -1), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 1, -1,  0), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i(-1, -1,  0), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 0, -1,  1), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 0, -1, -1), BLOCK_FACE_NONE);\n\t}\n\n\n\tvirtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const override\n\t{\n\t\tconst auto Meta = a_ChunkInterface.GetBlockMeta(a_BlockPos);\n\t\tconst auto NewMeta = FindMeta(a_ChunkInterface, a_BlockPos, m_BlockType);\n\t\tif ((Meta != NewMeta) && IsUnstable(a_ChunkInterface, a_BlockPos))\n\t\t{\n\t\t\ta_ChunkInterface.FastSetBlock(a_BlockPos, m_BlockType, (m_BlockType == E_BLOCK_RAIL) ? NewMeta : NewMeta | (Meta & 0x08));\n\t\t}\n\n\t\tSuper::OnNeighborChanged(a_ChunkInterface, a_BlockPos, a_WhichNeighbor);\n\t}\n\n\n\tvirtual void OnPlaced(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta\n\t) const override\n\t{\n\t\tSuper::OnPlaced(a_ChunkInterface, a_WorldInterface, a_BlockPos, a_BlockType, a_BlockMeta);\n\n\t\t// Alert diagonal rails:\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 1,  1,  0), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i(-1,  1,  0), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 0, +1,  1), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 0, +1, -1), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 1, -1,  0), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i(-1, -1,  0), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 0, -1,  1), BLOCK_FACE_NONE);\n\t\tNeighborChanged(a_ChunkInterface, a_BlockPos + Vector3i( 0, -1, -1), BLOCK_FACE_NONE);\n\t}\n\n\n\tvirtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Bit 0x08 is a flag when a_Meta is in the range 0x00--0x05 and 0x0A--0x0F.\n\t\t// Bit 0x08 specifies direction when a_Meta is in the range 0x06-0x09.\n\t\tif ((a_Meta < 0x06) || (a_Meta > 0x09))\n\t\t{\n\t\t\t//  Save powered rail flag.\n\t\t\tNIBBLETYPE OtherMeta = a_Meta & 0x08;\n\t\t\t// Rotates according to table; 0x07 == 0111.\n\t\t\t// Rails can either be flat (North / South) or Ascending (Asc. East)\n\t\t\tswitch (a_Meta & 0x07)\n\t\t\t{\n\t\t\t\tcase 0x00: return 0x01 + OtherMeta;  // North / South -> East / West\n\t\t\t\tcase 0x01: return 0x00 + OtherMeta;  // East / West   -> North / South\n\n\t\t\t\tcase 0x02: return 0x04 + OtherMeta;  // Asc. East   -> Asc. North\n\t\t\t\tcase 0x04: return 0x03 + OtherMeta;  // Asc. North  -> Asc. West\n\t\t\t\tcase 0x03: return 0x05 + OtherMeta;  // Asc. West   -> Asc. South\n\t\t\t\tcase 0x05: return 0x02 + OtherMeta;  // Asc. South  -> Asc. East\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (a_Meta)\n\t\t\t{\n\t\t\t\t// Corner Directions\n\t\t\t\tcase 0x06: return 0x09;  // Northwest Cnr. -> Southwest Cnr.\n\t\t\t\tcase 0x07: return 0x06;  // Northeast Cnr. -> Northwest Cnr.\n\t\t\t\tcase 0x08: return 0x07;  // Southeast Cnr. -> Northeast Cnr.\n\t\t\t\tcase 0x09: return 0x08;  // Southwest Cnr. -> Southeast Cnr.\n\t\t\t}\n\t\t}\n\t\t// To avoid a compiler warning;\n\t\treturn a_Meta;\n\t}\n\n\n\tvirtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Bit 0x08 is a flag for value in the range 0x00--0x05 and specifies direction for values withint 0x006--0x09.\n\t\tif ((a_Meta < 0x06) || (a_Meta > 0x09))\n\t\t{\n\t\t\t//  Save powered rail flag.\n\t\t\tNIBBLETYPE OtherMeta = a_Meta & 0x08;\n\t\t\t// Rotates according to table; 0x07 == 0111.\n\t\t\t// Rails can either be flat (North / South) or Ascending (Asc. East)\n\t\t\tswitch (a_Meta & 0x07)\n\t\t\t{\n\t\t\t\tcase 0x00: return 0x01 + OtherMeta;  // North / South -> East / West\n\t\t\t\tcase 0x01: return 0x00 + OtherMeta;  // East / West   -> North / South\n\n\t\t\t\tcase 0x02: return 0x05 + OtherMeta;  // Asc. East   -> Asc. South\n\t\t\t\tcase 0x05: return 0x03 + OtherMeta;  // Asc. South  -> Asc. West\n\t\t\t\tcase 0x03: return 0x04 + OtherMeta;  // Asc. West   -> Asc. North\n\t\t\t\tcase 0x04: return 0x02 + OtherMeta;  // Asc. North  -> Asc. East\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (a_Meta)\n\t\t\t{\n\t\t\t\t// Corner Directions\n\t\t\t\tcase 0x06: return 0x07;  // Northwest Cnr. -> Northeast Cnr.\n\t\t\t\tcase 0x07: return 0x08;  // Northeast Cnr. -> Southeast Cnr.\n\t\t\t\tcase 0x08: return 0x09;  // Southeast Cnr. -> Southwest Cnr.\n\t\t\t\tcase 0x09: return 0x06;  // Southwest Cnr. -> Northwest Cnr.\n\t\t\t}\n\t\t}\n\t\t// To avoid a compiler warning;\n\t\treturn a_Meta;\n\t}\n\n\n\tvirtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// MirrorXY basically flips the ZP and ZM parts of the meta\n\t\tif (m_BlockType == E_BLOCK_RAIL)\n\t\t{\n\t\t\t// Basic rails can have curves and thus their meta behaves differently from specialized rails:\n\t\t\tswitch (a_Meta)\n\t\t\t{\n\t\t\t\tcase E_META_RAIL_ASCEND_XM:    return E_META_RAIL_ASCEND_XM;\n\t\t\t\tcase E_META_RAIL_ASCEND_XP:    return E_META_RAIL_ASCEND_XP;\n\t\t\t\tcase E_META_RAIL_ASCEND_ZM:    return E_META_RAIL_ASCEND_ZP;\n\t\t\t\tcase E_META_RAIL_ASCEND_ZP:    return E_META_RAIL_ASCEND_ZM;\n\t\t\t\tcase E_META_RAIL_CURVED_ZM_XM: return E_META_RAIL_CURVED_ZP_XM;\n\t\t\t\tcase E_META_RAIL_CURVED_ZM_XP: return E_META_RAIL_CURVED_ZP_XP;\n\t\t\t\tcase E_META_RAIL_CURVED_ZP_XM: return E_META_RAIL_CURVED_ZM_XM;\n\t\t\t\tcase E_META_RAIL_CURVED_ZP_XP: return E_META_RAIL_CURVED_ZM_XP;\n\t\t\t\tcase E_META_RAIL_XM_XP:        return E_META_RAIL_XM_XP;\n\t\t\t\tcase E_META_RAIL_ZM_ZP:        return E_META_RAIL_ZM_ZP;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Specialized rails don't have curves, instead they use bit 0x08 as a flag\n\t\t\tNIBBLETYPE flag = a_Meta & 0x08;\n\t\t\tswitch (a_Meta & 0x07)\n\t\t\t{\n\t\t\t\tcase E_META_RAIL_ASCEND_XM: return flag | E_META_RAIL_ASCEND_XM;\n\t\t\t\tcase E_META_RAIL_ASCEND_XP: return flag | E_META_RAIL_ASCEND_XP;\n\t\t\t\tcase E_META_RAIL_ASCEND_ZM: return flag | E_META_RAIL_ASCEND_ZP;\n\t\t\t\tcase E_META_RAIL_ASCEND_ZP: return flag | E_META_RAIL_ASCEND_ZM;\n\t\t\t\tcase E_META_RAIL_XM_XP:     return flag | E_META_RAIL_XM_XP;\n\t\t\t\tcase E_META_RAIL_ZM_ZP:     return flag | E_META_RAIL_ZM_ZP;\n\t\t\t}\n\t\t}\n\t\tASSERT(!\"Unknown rail meta\");\n\t\treturn a_Meta;\n\t}\n\n\n\tvirtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// MirrorYZ basically flips the XP and XM parts of the meta\n\t\tif (m_BlockType == E_BLOCK_RAIL)\n\t\t{\n\t\t\t// Basic rails can have curves and thus their meta behaves differently from specialized rails:\n\t\t\tswitch (a_Meta)\n\t\t\t{\n\t\t\t\tcase E_META_RAIL_ASCEND_XM:    return E_META_RAIL_ASCEND_XP;\n\t\t\t\tcase E_META_RAIL_ASCEND_XP:    return E_META_RAIL_ASCEND_XM;\n\t\t\t\tcase E_META_RAIL_ASCEND_ZM:    return E_META_RAIL_ASCEND_ZM;\n\t\t\t\tcase E_META_RAIL_ASCEND_ZP:    return E_META_RAIL_ASCEND_ZP;\n\t\t\t\tcase E_META_RAIL_CURVED_ZM_XM: return E_META_RAIL_CURVED_ZM_XP;\n\t\t\t\tcase E_META_RAIL_CURVED_ZM_XP: return E_META_RAIL_CURVED_ZM_XM;\n\t\t\t\tcase E_META_RAIL_CURVED_ZP_XM: return E_META_RAIL_CURVED_ZP_XP;\n\t\t\t\tcase E_META_RAIL_CURVED_ZP_XP: return E_META_RAIL_CURVED_ZP_XM;\n\t\t\t\tcase E_META_RAIL_XM_XP:        return E_META_RAIL_XM_XP;\n\t\t\t\tcase E_META_RAIL_ZM_ZP:        return E_META_RAIL_ZM_ZP;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Specialized rails don't have curves, instead they use bit 0x08 as a flag\n\t\t\tNIBBLETYPE flag = a_Meta & 0x08;\n\t\t\tswitch (a_Meta & 0x07)\n\t\t\t{\n\t\t\t\tcase E_META_RAIL_ASCEND_XM: return flag | E_META_RAIL_ASCEND_XP;\n\t\t\t\tcase E_META_RAIL_ASCEND_XP: return flag | E_META_RAIL_ASCEND_XM;\n\t\t\t\tcase E_META_RAIL_ASCEND_ZM: return flag | E_META_RAIL_ASCEND_ZM;\n\t\t\t\tcase E_META_RAIL_ASCEND_ZP: return flag | E_META_RAIL_ASCEND_ZP;\n\t\t\t\tcase E_META_RAIL_XM_XP:     return flag | E_META_RAIL_XM_XP;\n\t\t\t\tcase E_META_RAIL_ZM_ZP:     return flag | E_META_RAIL_ZM_ZP;\n\t\t\t}\n\t\t}\n\t\tASSERT(!\"Unknown rail meta\");\n\t\treturn a_Meta;\n\t}\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockRedstoneLamp.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockRedstoneLampHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Always drop the Off variant:\n\t\treturn(cItem(E_BLOCK_REDSTONE_LAMP_OFF, 1, 0));\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 15;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockRedstoneOre.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"BlockOre.h\"\n\n\n\n\n\nclass cBlockRedstoneOreHandler final :\n\tpublic cBlockOreHandler\n{\n\tusing Super = cBlockOreHandler;\n\npublic:\n\n\tusing Super::Super;  // Inherit constructor from base\n\n\n\n\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\ta_ChunkInterface.SetBlock(a_BlockPos, E_BLOCK_REDSTONE_ORE_GLOWING, 0);\n\t\treturn false;\n\t}\n\n\n\n\n\n\tvirtual void OnDigging(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos\n\t) const override\n\t{\n\t\ta_ChunkInterface.SetBlock(a_BlockPos, E_BLOCK_REDSTONE_ORE_GLOWING, 0);\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable() const override\n\t{\n\t\treturn true;\n\t}\n};\n\n\n\n\n\nclass cBlockGlowingRedstoneOreHandler final :\n\tpublic cBlockOreHandler\n{\n\tusing Super = cBlockOreHandler;\n\npublic:\n\n\tusing Super::Super;  // Inherit constructor from base\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_BlockPluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tauto BlockPos = a_Chunk.RelativeToAbsolute(a_RelPos);\n\t\ta_ChunkInterface.SetBlock(BlockPos, E_BLOCK_REDSTONE_ORE, 0);\n\t}\n};\n\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockRedstoneRepeater.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"BlockType.h\"\n#include \"Mixins/Mixins.h\"\n#include \"Mixins/SolidSurfaceUnderneath.h\"\n#include \"ChunkInterface.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\nclass cBlockRedstoneRepeaterHandler final :\n\tpublic cSolidSurfaceUnderneath<cYawRotator<cBlockHandler, 0x03, 0x00, 0x01, 0x02, 0x03>>\n{\n\tusing Super = cSolidSurfaceUnderneath<cYawRotator<cBlockHandler, 0x03, 0x00, 0x01, 0x02, 0x03>>;\n\npublic:\n\n\tusing Super::Super;\n\n\tinline static Vector3i GetFrontCoordinateOffset(NIBBLETYPE a_Meta)\n\t{\n\t\treturn -GetRearCoordinateOffset(a_Meta);\n\t}\n\n\tinline static Vector3i GetLeftCoordinateOffset(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & E_META_REDSTONE_REPEATER_FACING_MASK)  // We only want the direction (bottom) bits\n\t\t{\n\t\t\tcase E_META_REDSTONE_REPEATER_FACING_ZM: return { -1, 0, 0 };\n\t\t\tcase E_META_REDSTONE_REPEATER_FACING_XP: return { 0, 0, -1 };\n\t\t\tcase E_META_REDSTONE_REPEATER_FACING_ZP: return { 1, 0, 0 };\n\t\t\tcase E_META_REDSTONE_REPEATER_FACING_XM: return { 0, 0, 1 };\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Unknown metadata: %d\", __FUNCTION__, a_Meta);\n\t\t\t\tASSERT(!\"Unknown metadata while determining orientation of repeater!\");\n\t\t\t\treturn { 0, 0, 0 };\n\t\t\t}\n\t\t}\n\t}\n\n\tinline static Vector3i GetRearCoordinateOffset(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & E_META_REDSTONE_REPEATER_FACING_MASK)  // We only want the direction (bottom) bits\n\t\t{\n\t\t\tcase E_META_REDSTONE_REPEATER_FACING_ZM: return { 0, 0, 1 };\n\t\t\tcase E_META_REDSTONE_REPEATER_FACING_XP: return { -1, 0, 0 };\n\t\t\tcase E_META_REDSTONE_REPEATER_FACING_ZP: return { 0, 0, -1 };\n\t\t\tcase E_META_REDSTONE_REPEATER_FACING_XM: return { 1, 0, 0 };\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Unknown metadata: %d\", __FUNCTION__, a_Meta);\n\t\t\t\tASSERT(!\"Unknown metadata while determining orientation of repeater!\");\n\t\t\t\treturn { 0, 0, 0 };\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\t// Increment the delay setting:\n\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, ((a_ChunkInterface.GetBlockMeta(a_BlockPos) + 0x04) & 0x0f));\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const override\n\t{\n\t\tUNUSED(a_ChunkInterface);\n\t\ta_WorldInterface.SendBlockTo(a_BlockPos, a_Player);\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_REDSTONE_REPEATER, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 11;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockRedstoneWire.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/SolidSurfaceUnderneath.h\"\n\n\n\n\nclass cBlockRedstoneWireHandler final :\n\tpublic cSolidSurfaceUnderneath<cBlockHandler>\n{\n\tusing Super = cSolidSurfaceUnderneath<cBlockHandler>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_REDSTONE_DUST, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockSand.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockSandHandler final :\n\tpublic cBlockHandler\n{\npublic:\n\n\tusing cBlockHandler::cBlockHandler;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 2;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockSapling.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../FastRandom.h\"\n#include \"Mixins/DirtLikeUnderneath.h\"\n\n\n\n\n\nclass cBlockSaplingHandler final :\n\tpublic cDirtLikeUnderneath<cBlockHandler>\n{\n\tusing Super = cDirtLikeUnderneath<cBlockHandler>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// The low 3 bits store the sapling type; bit 0x08 is the growth timer (not used in pickups)\n\t\treturn cItem(m_BlockType, 1, a_BlockMeta & 0x07);\n\t}\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tauto Meta = a_Chunk.GetMeta(a_RelPos);\n\t\tauto Light = std::max(a_Chunk.GetBlockLight(a_RelPos), a_Chunk.GetTimeAlteredLight(a_Chunk.GetSkyLight(a_RelPos)));\n\n\t\t// Only grow if we have the right amount of light\n\t\tif (Light > 8)\n\t\t{\n\t\t\tauto & random = GetRandomProvider();\n\t\t\t// Only grow if we are in the right growth stage and have the right amount of space around them.\n\t\t\tif (((Meta & 0x08) != 0) && random.RandBool(0.45) && CanGrowAt(a_Chunk, a_RelPos.x, a_RelPos.y, a_RelPos.z, Meta))\n\t\t\t{\n\t\t\t\tauto WorldPos = a_Chunk.RelativeToAbsolute(a_RelPos);\n\t\t\t\ta_Chunk.GetWorld()->GrowTree(WorldPos);\n\t\t\t}\n\t\t\t// Only move to the next growth stage if we haven't gone there yet\n\t\t\telse if (((Meta & 0x08) == 0) && random.RandBool(0.45))\n\t\t\t{\n\t\t\t\ta_Chunk.SetMeta(a_RelPos, Meta | 0x08);\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tstatic bool CanGrowAt(cChunk & a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_Meta)\n\t{\n\t\ta_Meta = a_Meta & 0x07;\n\t\tint CheckHeight = 0;\n\t\tbool LargeTree = false;\n\n\t\t// Get the height to check against\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase E_META_SAPLING_APPLE:\n\t\t\t{\n\t\t\t\tCheckHeight = 5;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_META_SAPLING_CONIFER:\n\t\t\t{\n\t\t\t\tCheckHeight = 7;\n\t\t\t\tif (IsLargeTree(a_Chunk, a_RelX, a_RelY, a_RelZ, a_Meta))\n\t\t\t\t{\n\t\t\t\t\tCheckHeight = 16;\n\t\t\t\t\tLargeTree = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_META_SAPLING_BIRCH:\n\t\t\t{\n\t\t\t\tCheckHeight = 6;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_META_SAPLING_JUNGLE:\n\t\t\t{\n\t\t\t\tCheckHeight = 7;\n\t\t\t\tif (IsLargeTree(a_Chunk, a_RelX, a_RelY, a_RelZ, a_Meta))\n\t\t\t\t{\n\t\t\t\t\tCheckHeight = 13;\n\t\t\t\t\tLargeTree = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Acacias don't need horizontal clearance\n\t\t\tcase E_META_SAPLING_ACACIA:\n\t\t\t{\n\t\t\t\tif (!IsLargeTree(a_Chunk, a_RelX, a_RelY, a_RelZ, a_Meta))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tCheckHeight = 7;\n\t\t\t\tLargeTree = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Dark Oaks don't need horizontal clearance\n\t\t\tcase E_META_SAPLING_DARK_OAK:\n\t\t\t{\n\t\t\t\tif (!IsLargeTree(a_Chunk, a_RelX, a_RelY, a_RelZ, a_Meta))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tCheckHeight = 7;\n\t\t\t\tLargeTree = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// We should always get a valid CheckHeight\n\t\tASSERT(CheckHeight != 0);\n\n\t\t// Don't grow a tree if we don't have enough space left above it in the chunk\n\t\tif ((a_RelY + CheckHeight) > cChunkDef::Height)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tbool CanGrow = true;\n\n\t\t// Validate the neighbor blocks. They cannot be solid.\n\t\tBLOCKTYPE check = E_BLOCK_AIR;\n\t\ta_Chunk.UnboundedRelGetBlockType(a_RelX - 1, a_RelY, a_RelZ, check);\n\t\tCanGrow = CanGrow && cBlockInfo::IsTransparent(check);\n\n\t\ta_Chunk.UnboundedRelGetBlockType(a_RelX + 1, a_RelY, a_RelZ, check);\n\t\tCanGrow = CanGrow && cBlockInfo::IsTransparent(check);\n\n\t\ta_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ - 1, check);\n\t\tCanGrow = CanGrow && cBlockInfo::IsTransparent(check);\n\n\t\ta_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ + 1, check);\n\t\tCanGrow = CanGrow && cBlockInfo::IsTransparent(check);\n\n\t\twhile (CheckHeight && CanGrow)\n\t\t{\n\t\t\tcheck = a_Chunk.GetBlock(a_RelX, a_RelY + CheckHeight, a_RelZ);\n\t\t\tCanGrow = CanGrow && ((check == E_BLOCK_AIR) || (check == E_BLOCK_LEAVES));\n\n\t\t\t// We have to check above the neighboring saplings as well\n\t\t\tif (LargeTree)\n\t\t\t{\n\t\t\t\ta_Chunk.UnboundedRelGetBlockType(a_RelX + 1, a_RelY + CheckHeight, a_RelZ, check);\n\t\t\t\tCanGrow = CanGrow && ((check == E_BLOCK_AIR) || (check == E_BLOCK_LEAVES));\n\n\t\t\t\ta_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY + CheckHeight, a_RelZ + 1, check);\n\t\t\t\tCanGrow = CanGrow && ((check == E_BLOCK_AIR) || (check == E_BLOCK_LEAVES));\n\n\t\t\t\ta_Chunk.UnboundedRelGetBlockType(a_RelX + 1, a_RelY + CheckHeight, a_RelZ + 1, check);\n\t\t\t\tCanGrow = CanGrow && ((check == E_BLOCK_AIR) || (check == E_BLOCK_LEAVES));\n\t\t\t}\n\n\t\t\t--CheckHeight;\n\t\t}\n\n\t\treturn CanGrow;\n\t}\n\n\n\n\n\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const override\n\t{\n\t\tauto blockMeta = a_Chunk.GetMeta(a_RelPos);\n\t\tauto typeMeta = blockMeta & 0x07;\n\t\tauto growState = blockMeta >> 3;\n\t\tint res = 0;\n\n\t\t// Try to increase the sapling's growState:\n\t\tif (growState < 1)\n\t\t{\n\t\t\t++growState;\n\t\t\ta_Chunk.FastSetBlock(a_RelPos, m_BlockType, static_cast<NIBBLETYPE>(growState << 3 | typeMeta));\n\t\t\tif (a_NumStages == 1)\n\t\t\t{\n\t\t\t\t// Only asked to grow one stage, which we did. Bail out.\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tres = 1;\n\t\t}\n\n\t\t// The sapling is grown, now it becomes a tree:\n\t\ta_Chunk.GetWorld()->GrowTreeFromSapling(a_Chunk.RelativeToAbsolute(a_RelPos));\n\t\treturn res + 1;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n\n\tstatic bool IsLargeTree(cChunk & a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_Meta)\n\t{\n\t\tBLOCKTYPE type;\n\t\tNIBBLETYPE meta;\n\t\tbool LargeTree = true;\n\t\ta_Chunk.UnboundedRelGetBlock(a_RelX + 1, a_RelY, a_RelZ, type, meta);\n\t\tLargeTree = LargeTree && (type == E_BLOCK_SAPLING) && ((a_Meta & meta) == a_Meta);\n\n\t\ta_Chunk.UnboundedRelGetBlock(a_RelX + 1, a_RelY, a_RelZ + 1, type, meta);\n\t\tLargeTree = LargeTree && (type == E_BLOCK_SAPLING) && ((a_Meta & meta) == a_Meta);\n\n\t\ta_Chunk.UnboundedRelGetBlock(a_RelX, a_RelY, a_RelZ + 1, type, meta);\n\t\tLargeTree = LargeTree && (type == E_BLOCK_SAPLING) && ((a_Meta & meta) == a_Meta);\n\n\t\treturn LargeTree;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockSeaLantern.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockSeaLanternHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Drop self only when using silk-touch:\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(E_BLOCK_SEA_LANTERN);\n\t\t}\n\n\t\t// Number of crystals to drop, capped at the max amount of 5.\n\t\tconst auto DropNum = FortuneDiscreteRandom(2, 3, ToolFortuneLevel(a_Tool), 5);\n\t\treturn cItem(E_ITEM_PRISMARINE_CRYSTALS, DropNum);\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockSideways.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\n/** Handler for blocks that have 3 orientations (hay bale, log), specified by the upper 2 bits in meta.\nAdditionally supports the metadata specifying block sub-type in its lower 2 bits. */\nclass cBlockSidewaysHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Reset the orientation part of meta, keep the sub-type part of meta:\n\t\treturn cItem(m_BlockType, 1, a_BlockMeta & 0x03);\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockSignPost.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\nclass cBlockSignPostHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_SIGN, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto BelowPos = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(BelowPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tBLOCKTYPE Type = a_Chunk.GetBlock(BelowPos);\n\t\treturn (Type == E_BLOCK_SIGN_POST) || (Type == E_BLOCK_WALLSIGN) || cBlockInfo::IsSolid(Type);\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\treturn (a_Meta + 4) & 0x0f;\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\treturn (a_Meta + 12) & 0x0f;\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Mirrors signs over the XY plane (North-South Mirroring)\n\n\t\t// There are 16 meta values which correspond to different directions.\n\t\t// These values are equated to angles on a circle; 0x08 = 180 degrees.\n\t\treturn (a_Meta < 0x08) ? (0x08 - a_Meta) : (0x18 - a_Meta);\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Mirrors signs over the YZ plane (East-West Mirroring)\n\n\t\t// There are 16 meta values which correspond to different directions.\n\t\t// These values are equated to angles on a circle; 0x10 = 360 degrees.\n\t\treturn 0x0f - a_Meta;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 13;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockSlab.h",
    "content": "\n// BlockSlab.h\n\n// Declares cBlockSlabHandler and cBlockDoubleSlabHandler classes\n\n\n\n\n\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"ChunkInterface.h\"\n#include \"../BlockInfo.h\"\n#include \"../Entities/Player.h\"\n#include \"../BlockInfo.h\"\n\n\n\nclass cBlockSlabHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\t/** Returns true if the specified blocktype is one of the slabs handled by this handler */\n\tstatic bool IsAnySlabType(BLOCKTYPE a_BlockType)\n\t{\n\t\treturn (\n\t\t\t(a_BlockType == E_BLOCK_WOODEN_SLAB) ||\n\t\t\t(a_BlockType == E_BLOCK_STONE_SLAB) ||\n\t\t\t(a_BlockType == E_BLOCK_RED_SANDSTONE_SLAB) ||\n\t\t\t(a_BlockType == E_BLOCK_PURPUR_SLAB)\n\t\t);\n\t}\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Reset the \"top half\" flag:\n\t\treturn cItem(m_BlockType, 1, a_BlockMeta & 0x07);\n\t}\n\n\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override\n\t{\n\t\t/* Double slab combining uses build collision checks to replace single slabs with double slabs in the right conditions.\n\t\tFor us to be replaced, the player must be:\n\t\t1. Placing the same slab material.\n\t\t2. Placing the same slab sub-kind (and existing slab is single). */\n\t\tif ((m_BlockType != a_HeldItem.m_ItemType) || ((a_Meta & 0x07) != a_HeldItem.m_ItemDamage))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst bool IsTopSlab = (a_Meta & 0x08) == 0x08;\n\t\tconst auto CanClickCombine = ((a_ClickedBlockFace == BLOCK_FACE_TOP) && !IsTopSlab) || ((a_ClickedBlockFace == BLOCK_FACE_BOTTOM) && IsTopSlab);\n\n\t\t/* When the player clicks on us directly, we'll combine if we're\n\t\ta bottom slab and he clicked the top, or vice versa. Clicking on the sides will not combine.\n\t\tHowever, when indirectly clicked (on the side of another block, that caused placement to go to us)\n\t\tthe conditions are exactly the opposite. */\n\t\treturn a_ClickedDirectly ? CanClickCombine : !CanClickCombine;\n\t}\n\n\n\n\n\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const override\n\t{\n\t\tif ((a_BlockFace == BLOCK_FACE_NONE) || (a_Player.GetEquippedItem().m_ItemType != static_cast<short>(m_BlockType)))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Sends the slab back to the client. It's to refuse a doubleslab placement. */\n\t\ta_Player.GetWorld()->SendBlockTo(a_BlockPos, a_Player);\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Toggle the 4th bit - up / down:\n\t\treturn (a_Meta ^ 0x08);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\ta_Meta &= 0x7;\n\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_STONE_SLAB:\n\t\t\t{\n\t\t\t\tswitch (a_Meta)\n\t\t\t\t{\n\t\t\t\t\tcase E_META_STONE_SLAB_SANDSTONE: return 2;\n\t\t\t\t\tcase E_META_STONE_SLAB_PLANKS: return 13;\n\t\t\t\t\tcase E_META_STONE_SLAB_STONE_BRICK:\n\t\t\t\t\tcase E_META_STONE_SLAB_STONE:\n\t\t\t\t\tcase E_META_STONE_SLAB_COBBLESTONE: return 11;\n\t\t\t\t\tcase E_META_STONE_SLAB_BRICK: return 28;\n\t\t\t\t\tcase E_META_STONE_SLAB_NETHER_BRICK: return 35;\n\t\t\t\t\tcase E_META_STONE_SLAB_QUARTZ: return 8;\n\t\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tASSERT(!\"Unhandled meta in slab handler!\");\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase E_BLOCK_WOODEN_SLAB:\n\t\t\t{\n\t\t\t\tswitch (a_Meta)\n\t\t\t\t{\n\t\t\t\t\tcase E_META_WOODEN_SLAB_BIRCH: return 2;\n\t\t\t\t\tcase E_META_WOODEN_SLAB_JUNGLE: return 10;\n\t\t\t\t\tcase E_META_WOODEN_SLAB_OAK: return 13;\n\t\t\t\t\tcase E_META_WOODEN_SLAB_ACACIA: return 15;\n\t\t\t\t\tcase E_META_WOODEN_SLAB_DARK_OAK: return 26;\n\t\t\t\t\tcase E_META_WOODEN_SLAB_SPRUCE: return 34;\n\t\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tASSERT(!\"Unhandled meta in slab handler!\");\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:\n\t\t\t{\n\t\t\t\treturn 10;\n\t\t\t}\n\t\t\tcase E_BLOCK_PURPUR_SLAB:\n\t\t\t{\n\t\t\t\treturn 16;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled blocktype in slab handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual bool IsInsideBlock(Vector3d a_Position, const NIBBLETYPE a_BlockMeta) const override\n\t{\n\t\tif (a_BlockMeta & 0x08)  // top half\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn cBlockHandler::IsInsideBlock(a_Position, a_BlockMeta);\n\t}\n} ;\n\n\n\n\n\nclass cBlockDoubleSlabHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\tBLOCKTYPE Block = GetSingleSlabType(m_BlockType);\n\t\treturn cItem(Block, 2, a_BlockMeta & 0x7);\n\t}\n\n\n\n\n\n\tinline static BLOCKTYPE GetSingleSlabType(BLOCKTYPE a_BlockType)\n\t{\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:         return E_BLOCK_STONE_SLAB;\n\t\t\tcase E_BLOCK_DOUBLE_WOODEN_SLAB:        return E_BLOCK_WOODEN_SLAB;\n\t\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB: return E_BLOCK_RED_SANDSTONE_SLAB;\n\t\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:        return E_BLOCK_PURPUR_SLAB;\n\t\t}\n\t\tASSERT(!\"Unhandled double slab type!\");\n\t\treturn a_BlockType;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// For doule slabs, the meta values are the same. Only the meaning of the 4th bit changes, but that's ignored in the below handler\n\t\treturn cBlockHandler::For(GetSingleSlabType(m_BlockType)).GetMapBaseColourID(a_Meta);\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockSlime.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockSlimeHandler final :\n\tpublic cClearMetaOnDrop<cBlockHandler>\n{\npublic:\n\n\tusing cClearMetaOnDrop<cBlockHandler>::cClearMetaOnDrop;\n\nprivate:\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 1;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockSnow.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockSnowHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tenum\n\t{\n\t\tFullBlockMeta = 7  // Meta value of a full-height snow block.\n\t};\n\n\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override\n\t{\n\t\tif (a_Meta == 0)\n\t\t{\n\t\t\treturn true;  // If at normal snowfall height (lowest), we ignore collision.\n\t\t}\n\n\t\t// Special case if a player is holding a (thin) snow block and its size can be increased:\n\t\tif ((a_HeldItem.m_ItemType == E_BLOCK_SNOW) && (a_Meta < FullBlockMeta))\n\t\t{\n\t\t\treturn !a_ClickedDirectly || (a_ClickedBlockFace == BLOCK_FACE_YP);  // If clicked an adjacent block, or clicked YP directly, we ignore collision.\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// No drop unless dug up with a shovel:\n\t\tif ((a_Tool == nullptr) || !ItemCategory::IsShovel(a_Tool->m_ItemType))\n\t\t{\n\t\t\treturn {};\n\t\t}\n\n\t\tif (ToolHasSilkTouch(a_Tool))\n\t\t{\n\t\t\treturn cItem(m_BlockType, 1, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Drop as many snowballs as there were \"layers\" of snow:\n\t\t\treturn cItem(E_ITEM_SNOWBALL, 1 + (a_BlockMeta & 0x07), 0);\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto BelowPos = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(BelowPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tauto BlockBelow = a_Chunk.GetBlock(BelowPos);\n\t\tauto MetaBelow = a_Chunk.GetMeta(BelowPos);\n\t\treturn CanBeOn(BlockBelow, MetaBelow);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 14;\n\t}\n\n\n\n\n\n\tvirtual bool IsInsideBlock(const Vector3d a_RelPosition, const NIBBLETYPE a_BlockMeta) const override\n\t{\n\t\treturn a_RelPosition.y < (cBlockInfo::GetBlockHeight(m_BlockType) * (a_BlockMeta & 0x07));\n\t}\n\n\nprivate:\n\n\t/** Returns true if snow can be placed on top of a block with the given type and meta. */\n\tstatic bool CanBeOn(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\t// If block below is snowable, or it is a thin snow block and is a full thin snow block, say yay:\n\t\treturn (\n\t\t\tcBlockInfo::IsSnowable(a_BlockType) ||\n\t\t\t(\n\t\t\t\t(a_BlockType == E_BLOCK_SNOW) &&\n\t\t\t\t(a_BlockMeta == FullBlockMeta)\n\t\t\t)\n\t\t);\n\t}\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockSponge.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockSpongeHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual void OnPlaced(\n\t\tcChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,\n\t\tVector3i a_BlockPos,\n\t\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta\n\t) const override\n\t{\n\t\tOnNeighborChanged(a_ChunkInterface, a_BlockPos, BLOCK_FACE_NONE);\n\t}\n\n\tvirtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const override\n\t{\n\t\ta_ChunkInterface.DoWithChunkAt(a_BlockPos, [&](cChunk & a_Chunk) { CheckSoaked(cChunkDef::AbsoluteToRelative(a_BlockPos), a_Chunk); return true; });\n\t}\n\n\t/** Check blocks around the sponge to see if they are water.\n\tIf a dry sponge is touching water, soak up up to 65 blocks of water,\n\twith a taxicab distance of 7, and turn the sponge into a wet sponge. */\n\tstatic void CheckSoaked(Vector3i a_Rel, cChunk & a_Chunk)\n\t{\n\t\tstruct sSeed\n\t\t{\n\t\t\tsSeed(Vector3i pos, int d)\n\t\t\t{\n\t\t\t\tm_Pos = pos;\n\t\t\t\tm_Depth = d;\n\t\t\t}\n\t\t\tVector3i m_Pos;\n\t\t\tint m_Depth;\n\t\t};\n\n\t\t// Check if this is a dry sponge next to a water block.\n\t\tNIBBLETYPE TargetMeta = a_Chunk.GetMeta(a_Rel.x, a_Rel.y, a_Rel.z);\n\t\tif (TargetMeta != E_META_SPONGE_DRY)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto & WaterCheck = cSimulator::AdjacentOffsets;\n\t\tconst bool ShouldSoak = std::any_of(WaterCheck.cbegin(), WaterCheck.cend(), [a_Rel, &a_Chunk](Vector3i a_Offset)\n\t\t{\n\t\t\treturn IsWet(a_Rel + a_Offset, a_Chunk);\n\t\t});\n\n\t\t// Early return if the sponge isn't touching any water.\n\t\tif (!ShouldSoak)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Use a queue to hold blocks that we want to check, so our search is breadth-first.\n\t\tstd::queue<sSeed> Seeds;\n\t\tint count = 0;\n\t\t// Only go 7 blocks away from the center block.\n\t\tconst int maxDepth = 7;\n\t\t// Start with the 6 blocks around the sponge.\n\t\tfor (unsigned int i = 0; i < 6; i++)\n\t\t{\n\t\t\tSeeds.emplace(a_Rel + WaterCheck[i], maxDepth - 1);\n\t\t}\n\n\t\t// Keep checking blocks that are touching water blocks, or until 65 have been soaked up.\n\t\twhile (!Seeds.empty() && count < 65)\n\t\t{\n\t\t\tsSeed seed = Seeds.front();\n\t\t\tVector3i checkRel = seed.m_Pos;\n\t\t\tif (IsWet(checkRel, a_Chunk))\n\t\t\t{\n\t\t\t\tcount++;\n\t\t\t\tDryUp(checkRel, a_Chunk);\n\t\t\t\tif (seed.m_Depth > 0)\n\t\t\t\t{\n\t\t\t\t\t// If this block was water, and we haven't yet gone too far away,\n\t\t\t\t\t// add its neighbors to the queue to check.\n\t\t\t\t\tfor (unsigned int i = 0; i < 6; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tSeeds.emplace(checkRel + WaterCheck[i], seed.m_Depth - 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tSeeds.pop();\n\t\t}\n\n\t\ta_Chunk.SetBlock(a_Rel, E_BLOCK_SPONGE, E_META_SPONGE_WET);\n\t}\n\n\tstatic void DryUp(Vector3i a_Rel, cChunk & a_Chunk)\n\t{\n\t\t// TODO: support evaporating waterlogged blocks.\n\t\ta_Chunk.UnboundedRelSetBlock(a_Rel.x, a_Rel.y, a_Rel.z, E_BLOCK_AIR, 0);\n\t}\n\n\tstatic bool IsWet(Vector3i a_Rel, cChunk & a_Chunk)\n\t{\n\t\t// TODO: support detecting waterlogged blocks.\n\t\tBLOCKTYPE Type;\n\t\treturn(a_Chunk.UnboundedRelGetBlockType(a_Rel.x, a_Rel.y, a_Rel.z, Type) && IsBlockWater(Type));\n\t}\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 18;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockStairs.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n\n\n\n\nclass cBlockStairsHandler final :\n\tpublic cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x03, 0x00, 0x02, 0x01, true>>\n{\n\tusing Super = cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x03, 0x00, 0x02, 0x01, true>>;\n\npublic:\n\n\tusing Super::Super;\n\n\tstatic bool IsAnyStairType(BLOCKTYPE a_Block)\n\t{\n\t\tswitch (a_Block)\n\t\t{\n\t\t\tcase E_BLOCK_SANDSTONE_STAIRS:\n\t\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS:\n\t\t\tcase E_BLOCK_QUARTZ_STAIRS:\n\t\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:\n\t\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:\n\t\t\tcase E_BLOCK_COBBLESTONE_STAIRS:\n\t\t\tcase E_BLOCK_STONE_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_OAK_WOOD_STAIRS:\n\t\t\tcase E_BLOCK_ACACIA_WOOD_STAIRS:\n\t\t\tcase E_BLOCK_PURPUR_STAIRS:\n\t\t\tcase E_BLOCK_DARK_OAK_WOOD_STAIRS:\n\t\t\tcase E_BLOCK_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\n\tvirtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Toggle bit 3:\n\t\treturn (a_Meta & 0x0b) | ((~a_Meta) & 0x04);\n\t}\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_SANDSTONE_STAIRS:\n\t\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS: return 2;\n\t\t\tcase E_BLOCK_QUARTZ_STAIRS: return 8;\n\t\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:\n\t\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS: return 10;\n\t\t\tcase E_BLOCK_COBBLESTONE_STAIRS:\n\t\t\tcase E_BLOCK_STONE_BRICK_STAIRS: return 11;\n\t\t\tcase E_BLOCK_OAK_WOOD_STAIRS: return 13;\n\t\t\tcase E_BLOCK_ACACIA_WOOD_STAIRS: return 15;\n\t\t\tcase E_BLOCK_PURPUR_STAIRS: return 16;\n\t\t\tcase E_BLOCK_DARK_OAK_WOOD_STAIRS: return 26;\n\t\t\tcase E_BLOCK_BRICK_STAIRS: return 28;\n\t\t\tcase E_BLOCK_NETHER_BRICK_STAIRS: return 35;\n\t\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS: return 34;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled blocktype in stairs handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\t/** EXCEPTION a.k.a. why is this removed:\n\tThis collision-detection is actually more accurate than the client, but since the client itself\n\tsends inaccurate / sparse data, it's easier to just err on the side of the client and keep the\n\ttwo in sync by assuming that if a player hit ANY of the stair's bounding cube, it counts as the ground. */\n\t#if 0\n\tbool IsInsideBlock(Vector3d a_RelPosition, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta)\n\t{\n\t\tif (a_BlockMeta & 0x4)  // upside down\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse if ((a_BlockMeta & 0x3) == 0)  // tall side is east (+X)\n\t\t{\n\t\t\treturn (a_RelPosition.y < ((a_RelPosition.x > 0.5) ? 1.0 : 0.5));\n\t\t}\n\t\telse if ((a_BlockMeta & 0x3) == 1)  // tall side is west (-X)\n\t\t{\n\t\t\treturn (a_RelPosition.y < ((a_RelPosition.x < 0.5) ? 1.0 : 0.5));\n\t\t}\n\t\telse if ((a_BlockMeta & 0x3) == 2)  // tall side is south (+Z)\n\t\t{\n\t\t\treturn (a_RelPosition.y < ((a_RelPosition.z > 0.5) ? 1.0 : 0.5));\n\t\t}\n\t\telse if ((a_BlockMeta & 0x3) == 3)  // tall side is north (-Z)\n\t\t{\n\t\t\treturn (a_RelPosition.y < ((a_RelPosition.z < 0.5) ? 1.0 : 0.5));\n\t\t}\n\t\treturn false;\n\t}\n\t#endif\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockStandingBanner.h",
    "content": "\n// BlockStandingBanner.h\n\n#pragma once\n\n#include \"../BlockInfo.h\"\n#include \"BlockEntity.h\"\n#include \"Mixins/SolidSurfaceUnderneath.h\"\n\n\n\n\n\nclass cBlockStandingBannerHandler final :\n\tpublic cSolidSurfaceUnderneath<cBlockEntityHandler>\n{\n\tusing Super = cSolidSurfaceUnderneath<cBlockEntityHandler>;\n\npublic:\n\n\tusing Super::Super;\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Drops handled by the block entity:\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockStems.h",
    "content": "\n#pragma once\n\n#include \"BlockPlant.h\"\n\n\n\n\n\n/** Handler for stems from which produce grows in an adjacent block (melon, pumpkin) after it becomes ripe (meta == 7).\nProduceBlockType is the blocktype for the produce to be grown.\nStemPickupType is the item type for the pickup resulting from breaking the stem. */\ntemplate <BLOCKTYPE ProduceBlockType, ENUM_ITEM_TYPE StemPickupType>\nclass cBlockStemsHandler final :\n\tpublic cBlockPlant<true>\n{\n\tusing Super = cBlockPlant<true>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t/*\n\t\t\tUse correct percent:\n\t\t\thttps://minecraft.wiki/w/Melon_Seeds#Breaking\n\t\t\thttps://minecraft.wiki/w/Pumpkin_Seeds#Breaking\n\t\t*/\n\n\t\t// Age > 7 (Impossible)\n\t\tif (a_BlockMeta > 7)\n\t\t{\n\t\t\treturn cItem(StemPickupType);\n\t\t}\n\n\t\tconst auto Threshold = GetRandomProvider().RandReal<double>(100);\n\t\tdouble Cumulative = 0;\n\t\tchar Count = 0;\n\n\t\tfor (; Count < 4; Count++)\n\t\t{\n\t\t\tCumulative += m_AgeSeedDropProbability[static_cast<size_t>(a_BlockMeta)][static_cast<size_t>(Count)];\n\t\t\tif (Cumulative > Threshold)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cItem(StemPickupType, Count);\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto BelowPos = a_Position.addedY(-1);\n\t\treturn cChunkDef::IsValidHeight(BelowPos) && (a_Chunk.GetBlock(BelowPos) == E_BLOCK_FARMLAND);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n\n\n\n\n\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const override\n\t{\n\t\tconst auto OldMeta = a_Chunk.GetMeta(a_RelPos);\n\t\tconst auto NewMeta = std::clamp<NIBBLETYPE>(static_cast<NIBBLETYPE>(OldMeta + a_NumStages), 0, 7);\n\t\ta_Chunk.SetMeta(a_RelPos, NewMeta);\n\t\treturn NewMeta - OldMeta;\n\t}\n\n\n\n\n\n\tvirtual void BearFruit(cChunk & a_Chunk, const Vector3i a_StemRelPos) const override\n\t{\n\t\tauto & Random = GetRandomProvider();\n\n\t\t// Check if there's another produce around the stem, if so, abort:\n\t\tstatic constexpr std::array<Vector3i, 4> NeighborOfs =\n\t\t{\n\t\t\t{\n\t\t\t\t{ 1, 0,  0},\n\t\t\t\t{-1, 0,  0},\n\t\t\t\t{ 0, 0,  1},\n\t\t\t\t{ 0, 0, -1},\n\t\t\t}\n\t\t};\n\n\t\tstd::array<BLOCKTYPE, 4> BlockType;\n\t\tif (\n\t\t\t!a_Chunk.UnboundedRelGetBlockType(a_StemRelPos + NeighborOfs[0], BlockType[0]) ||\n\t\t\t!a_Chunk.UnboundedRelGetBlockType(a_StemRelPos + NeighborOfs[1], BlockType[1]) ||\n\t\t\t!a_Chunk.UnboundedRelGetBlockType(a_StemRelPos + NeighborOfs[2], BlockType[2]) ||\n\t\t\t!a_Chunk.UnboundedRelGetBlockType(a_StemRelPos + NeighborOfs[3], BlockType[3]) ||\n\t\t\t(BlockType[0] == ProduceBlockType) ||\n\t\t\t(BlockType[1] == ProduceBlockType) ||\n\t\t\t(BlockType[2] == ProduceBlockType) ||\n\t\t\t(BlockType[3] == ProduceBlockType)\n\t\t)\n\t\t{\n\t\t\t// Neighbors not valid or already taken by the same produce:\n\t\t\treturn;\n\t\t}\n\n\t\t// Pick a direction in which to place the produce:\n\t\tint x = 0, z = 0;\n\t\tconst auto CheckType = Random.RandInt<size_t>(3);  // The index to the neighbors array which should be checked for emptiness\n\t\tswitch (CheckType)\n\t\t{\n\t\t\tcase 0: x =  1; break;\n\t\t\tcase 1: x = -1; break;\n\t\t\tcase 2: z =  1; break;\n\t\t\tcase 3: z = -1; break;\n\t\t}\n\n\t\t// Check that the block in that direction is empty:\n\t\tswitch (BlockType[CheckType])\n\t\t{\n\t\t\tcase E_BLOCK_AIR:\n\t\t\tcase E_BLOCK_SNOW:\n\t\t\tcase E_BLOCK_TALL_GRASS:\n\t\t\tcase E_BLOCK_DEAD_BUSH:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: return;\n\t\t}\n\n\t\t// Check if there's soil under the neighbor. We already know the neighbors are valid. Place produce if ok\n\t\tBLOCKTYPE SoilType;\n\t\tconst auto ProduceRelPos = a_StemRelPos + Vector3i(x, 0, z);\n\t\tVERIFY(a_Chunk.UnboundedRelGetBlockType(ProduceRelPos.addedY(-1), SoilType));\n\n\t\tswitch (SoilType)\n\t\t{\n\t\t\tcase E_BLOCK_DIRT:\n\t\t\tcase E_BLOCK_GRASS:\n\t\t\tcase E_BLOCK_FARMLAND:\n\t\t\t{\n\t\t\t\tconst NIBBLETYPE Meta = (ProduceBlockType == E_BLOCK_MELON) ? 0 : static_cast<NIBBLETYPE>(Random.RandInt(4) % 4);\n\n\t\t\t\tFLOGD(\"Growing melon / pumpkin at {0} (<{1}, {2}> from stem), overwriting {3}, growing on top of {4}, meta {5}\",\n\t\t\t\t\ta_Chunk.RelativeToAbsolute(ProduceRelPos),\n\t\t\t\t\tx, z,\n\t\t\t\t\tItemTypeToString(BlockType[CheckType]),\n\t\t\t\t\tItemTypeToString(SoilType),\n\t\t\t\t\tMeta\n\t\t\t\t);\n\n\t\t\t\t// Place a randomly-facing produce:\n\t\t\t\ta_Chunk.SetBlock(ProduceRelPos, ProduceBlockType, Meta);\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\n\t// https://minecraft.wiki/w/Pumpkin_Seeds#Breaking\n\t// https://minecraft.wiki/w/Melon_Seeds#Breaking\n\t/** The array describes how many seed may be dropped at which age. The inner arrays describe the probability to drop 0, 1, 2, 3 seeds.\n\tThe outer describes the age of the stem. */\n\tstatic constexpr std::array<std::array<double, 4>, 8> m_AgeSeedDropProbability\n\t{\n\t\t{\n\t\t\t{\n\t\t\t\t81.3, 17.42, 1.24, 0.03\n\t\t\t},\n\t\t\t{\n\t\t\t\t65.1, 30.04, 4.62, 0.24\n\t\t\t},\n\t\t\t{\n\t\t\t\t51.2, 38.4, 9.6, 0.8\n\t\t\t},\n\t\t\t{\n\t\t\t\t39.44, 43.02, 15.64, 1.9\n\t\t\t},\n\t\t\t{\n\t\t\t\t29.13, 44.44, 22.22, 3.7\n\t\t\t},\n\t\t\t{\n\t\t\t\t21.6, 43.2, 28.8, 6.4\n\t\t\t},\n\t\t\t{\n\t\t\t\t15.17, 39.82, 34.84, 10.16\n\t\t\t},\n\t\t\t{\n\t\t\t\t10.16, 34.84, 39.82, 15.17\n\t\t\t}\n\t\t}\n\t};\n} ;\n\nusing cBlockMelonStemHandler   = cBlockStemsHandler<E_BLOCK_MELON,   E_ITEM_MELON_SEEDS>;\nusing cBlockPumpkinStemHandler = cBlockStemsHandler<E_BLOCK_PUMPKIN, E_ITEM_PUMPKIN_SEEDS>;\n"
  },
  {
    "path": "src/Blocks/BlockStone.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\nclass cBlockStoneHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Convert stone to cobblestone, unless using silk-touch:\n\t\tif (\n\t\t\t(a_BlockMeta == E_META_STONE_STONE) &&\n\t\t\t!ToolHasSilkTouch(a_Tool)\n\t\t)\n\t\t{\n\t\t\treturn cItem(E_BLOCK_COBBLESTONE, 1, 0);\n\t\t}\n\t\treturn cItem(m_BlockType, 1, a_BlockMeta);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 11;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockSugarCane.h",
    "content": "\n#pragma once\n\n#include \"BlockPlant.h\"\n\n\n\n\n\nclass cBlockSugarCaneHandler final :\n\tpublic cBlockPlant<false>\n{\n\tusing Super = cBlockPlant<false>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_SUGARCANE, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto BelowPos = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(BelowPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tswitch (a_Chunk.GetBlock(BelowPos))\n\t\t{\n\t\t\tcase E_BLOCK_DIRT:\n\t\t\tcase E_BLOCK_GRASS:\n\t\t\tcase E_BLOCK_FARMLAND:\n\t\t\tcase E_BLOCK_SAND:\n\t\t\t{\n\t\t\t\tstatic const Vector3i Coords[] =\n\t\t\t\t{\n\t\t\t\t\t{-1, 0,  0},\n\t\t\t\t\t{ 1, 0,  0},\n\t\t\t\t\t{ 0, 0, -1},\n\t\t\t\t\t{ 0, 0,  1},\n\t\t\t\t} ;\n\t\t\t\tfor (size_t i = 0; i < ARRAYCOUNT(Coords); i++)\n\t\t\t\t{\n\t\t\t\t\tBLOCKTYPE BlockType;\n\t\t\t\t\tNIBBLETYPE BlockMeta;\n\t\t\t\t\tif (!a_Chunk.UnboundedRelGetBlock(BelowPos + Coords[i], BlockType, BlockMeta))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Too close to the edge, cannot simulate\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (IsBlockWater(BlockType) || (BlockType == E_BLOCK_FROSTED_ICE))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}  // for i - Coords[]\n\t\t\t\t// Not directly neighboring a water block\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcase E_BLOCK_SUGARCANE:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n\n\n\n\n\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const override\n\t{\n\t\t// Check the total height of the sugarcane blocks here:\n\t\tauto top = a_RelPos.addedY(1);\n\t\twhile (\n\t\t\tcChunkDef::IsValidHeight(top) &&\n\t\t\t(a_Chunk.GetBlock(top) == E_BLOCK_SUGARCANE)\n\t\t)\n\t\t{\n\t\t\t++top.y;\n\t\t}\n\t\tauto bottom = a_RelPos.addedY(-1);\n\t\twhile (\n\t\t\tcChunkDef::IsValidHeight(bottom) &&\n\t\t\t(a_Chunk.GetBlock(bottom) == E_BLOCK_SUGARCANE)\n\t\t)\n\t\t{\n\t\t\t--bottom.y;\n\t\t}\n\n\t\t// Grow by at most a_NumStages, but no more than max height:\n\t\tauto toGrow = std::min(a_NumStages, a_Chunk.GetWorld()->GetMaxSugarcaneHeight() + 1 - (top.y - bottom.y));\n\t\tfor (int i = 0; i < toGrow; i++)\n\t\t{\n\t\t\tconst auto NewTop = top.addedY(i);\n\t\t\tif (!cChunkDef::IsValidHeight(NewTop))\n\t\t\t{\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\tif (a_Chunk.GetBlock(NewTop) == E_BLOCK_AIR)\n\t\t\t{\n\t\t\t\ta_Chunk.SetBlock(NewTop, E_BLOCK_SUGARCANE, 0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}  // for i\n\t\treturn toGrow;\n\t}\n\n\tvirtual PlantAction CanGrow(cChunk & a_Chunk, Vector3i a_RelPos) const override\n\t{\n\t\t// Only allow growing if there's an air block above:\n\t\tif (((a_RelPos.y + 1) < cChunkDef::Height) && (a_Chunk.GetBlock(a_RelPos.addedY(1)) == E_BLOCK_AIR))\n\t\t{\n\t\t\treturn Super::CanGrow(a_Chunk, a_RelPos);\n\t\t}\n\t\treturn paStay;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockTNT.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockTNTHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const override\n\t{\n\t\ta_WorldInterface.SendBlockTo(a_BlockPos, a_Player);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 4;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockTallGrass.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/DirtLikeUnderneath.h\"\n#include \"ChunkInterface.h\"\n\n\n\n\n\n/** Handles the grass that is 1 block tall */\nclass cBlockTallGrassHandler final :\n\tpublic cDirtLikeUnderneath<cBlockHandler>\n{\n\tusing Super = cDirtLikeUnderneath<cBlockHandler>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// If using shears, drop self:\n\t\tif ((a_Tool != nullptr) && (a_Tool->m_ItemType == E_ITEM_SHEARS))\n\t\t{\n\t\t\treturn cItem(m_BlockType, 1, a_BlockMeta);\n\t\t}\n\n\t\t// Drop seeds, depending on bernoulli trial result:\n\t\tif (GetRandomProvider().RandBool(0.875))  // 87.5% chance of dropping nothing\n\t\t{\n\t\t\treturn {};\n\t\t}\n\n\t\t// 12.5% chance of dropping 0 or more seeds.\n\t\tconst auto DropNum = FortuneDiscreteRandom(1, 1, 2 * ToolFortuneLevel(a_Tool));\n\t\treturn cItem(E_ITEM_SEEDS, DropNum);\n\t}\n\n\n\n\n\n\t/** Growing a tall grass produces a big flower (2-block high fern or double-tall grass). */\n\tvirtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const override\n\t{\n\t\tconst auto TopPos = a_RelPos.addedY(1);\n\t\tif (!cChunkDef::IsValidHeight(TopPos))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tauto blockMeta = a_Chunk.GetMeta(a_RelPos);\n\t\tNIBBLETYPE largeFlowerMeta;\n\t\tswitch (blockMeta)\n\t\t{\n\t\t\tcase E_META_TALL_GRASS_GRASS: largeFlowerMeta = E_META_BIG_FLOWER_DOUBLE_TALL_GRASS; break;\n\t\t\tcase E_META_TALL_GRASS_FERN:  largeFlowerMeta = E_META_BIG_FLOWER_LARGE_FERN; break;\n\t\t\tdefault:                      return 0;\n\t\t}\n\t\ta_Chunk.SetBlock(a_RelPos,           E_BLOCK_BIG_FLOWER, largeFlowerMeta);\n\t\ta_Chunk.SetBlock(TopPos, E_BLOCK_BIG_FLOWER, E_META_BIG_FLOWER_TOP);\n\t\treturn 1;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockTorch.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n#include \"BlockSlab.h\"\n#include \"BlockStairs.h\"\n#include \"../Chunk.h\"\n#include \"BlockType.h\"\n#include \"ChunkInterface.h\"\n#include \"Defines.h\"\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cBlockTorchBaseHandler :\n\tpublic cMetaRotator<cBlockHandler, 0x7, 0x4, 0x1, 0x3, 0x2>\n{\n\tusing Super = cMetaRotator<cBlockHandler, 0x7, 0x4, 0x1, 0x3, 0x2>;\n\npublic:\n\n\tusing Super::Super;\n\n\n\t/** Returns true if the torch can be placed on the specified block's face. */\n\tstatic bool CanBePlacedOn(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_BlockFace)\n\t{\n\t\t// upside down slabs\n\t\tif (cBlockSlabHandler::IsAnySlabType(a_BlockType))\n\t\t{\n\t\t\treturn (a_BlockFace == BLOCK_FACE_YP) && (a_BlockMeta & E_META_WOODEN_SLAB_UPSIDE_DOWN);\n\t\t}\n\n\t\t// stairs (top and sides)\n\t\tif (cBlockStairsHandler::IsAnyStairType(a_BlockType))\n\t\t{\n\t\t\tswitch (a_BlockFace)\n\t\t\t{\n\t\t\t\tcase eBlockFace::BLOCK_FACE_YP:\n\t\t\t\t\treturn (a_BlockMeta & E_BLOCK_STAIRS_UPSIDE_DOWN);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_XP:\n\t\t\t\t\treturn ((a_BlockMeta & 0b11) == E_BLOCK_STAIRS_XP);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_XM:\n\t\t\t\t\treturn ((a_BlockMeta & 0b11) == E_BLOCK_STAIRS_XM);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_ZP:\n\t\t\t\t\treturn ((a_BlockMeta & 0b11) == E_BLOCK_STAIRS_ZP);\n\t\t\t\tcase eBlockFace::BLOCK_FACE_ZM:\n\t\t\t\t\treturn ((a_BlockMeta & 0b11) == E_BLOCK_STAIRS_ZM);\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_END_PORTAL_FRAME:\n\t\t\tcase E_BLOCK_SOULSAND:\n\t\t\t{\n\t\t\t\t// Exceptional vanilla behaviour\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcase E_BLOCK_GLASS:\n\t\t\tcase E_BLOCK_STAINED_GLASS:\n\t\t\tcase E_BLOCK_FENCE:\n\t\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\t\tcase E_BLOCK_SPRUCE_FENCE:\n\t\t\tcase E_BLOCK_BIRCH_FENCE:\n\t\t\tcase E_BLOCK_JUNGLE_FENCE:\n\t\t\tcase E_BLOCK_DARK_OAK_FENCE:\n\t\t\tcase E_BLOCK_ACACIA_FENCE:\n\t\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\t\t{\n\t\t\t\t// Torches can only be placed on top of these blocks\n\t\t\t\treturn (a_BlockFace == BLOCK_FACE_YP);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tif (cBlockInfo::FullyOccupiesVoxel(a_BlockType))\n\t\t\t\t{\n\t\t\t\t\t// Torches can be placed on all sides of full blocks except the bottom\n\t\t\t\t\treturn (a_BlockFace != BLOCK_FACE_YM);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\n\t~cBlockTorchBaseHandler() = default;\n\nprivate:\n\n\t/** Converts the torch block's meta to the block face of the neighbor to which the torch is attached. */\n\tinline static eBlockFace MetaDataToBlockFace(NIBBLETYPE a_MetaData)\n\t{\n\t\tswitch (a_MetaData)\n\t\t{\n\t\t\tcase 0:                  return BLOCK_FACE_TOP;  // By default, the torches stand on the ground\n\t\t\tcase E_META_TORCH_FLOOR: return BLOCK_FACE_TOP;\n\t\t\tcase E_META_TORCH_EAST:  return BLOCK_FACE_EAST;\n\t\t\tcase E_META_TORCH_WEST:  return BLOCK_FACE_WEST;\n\t\t\tcase E_META_TORCH_NORTH: return BLOCK_FACE_NORTH;\n\t\t\tcase E_META_TORCH_SOUTH: return BLOCK_FACE_SOUTH;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled torch metadata\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn BLOCK_FACE_TOP;\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tauto Face = MetaDataToBlockFace(a_Meta);\n\t\tauto NeighborRelPos = AddFaceDirection(a_Position, Face, true);\n\t\tBLOCKTYPE NeighborBlockType;\n\t\tNIBBLETYPE NeighborBlockMeta;\n\t\tif (!a_Chunk.UnboundedRelGetBlock(NeighborRelPos, NeighborBlockType, NeighborBlockMeta))\n\t\t{\n\t\t\t// Neighbor in an unloaded chunk, bail out without changing this.\n\t\t\treturn false;\n\t\t}\n\n\t\treturn CanBePlacedOn(NeighborBlockType, NeighborBlockMeta, Face);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n\n\n\n\n\nclass cBlockTorchHandler final :\n\tpublic cClearMetaOnDrop<cBlockTorchBaseHandler>\n{\n\tusing Super = cClearMetaOnDrop<cBlockTorchBaseHandler>;\n\npublic:\n\n\tusing Super::Super;\n};\n\n\n\n\n\nclass cBlockRedstoneTorchHandler final :\n\tpublic cBlockTorchBaseHandler\n{\n\tusing Super = cBlockTorchBaseHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Always drop the ON torch, meta 0:\n\t\treturn { E_BLOCK_REDSTONE_TORCH_ON };\n\t}\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/BlockTrapdoor.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n#include \"../EffectID.h\"\n\n\n\n\nclass cBlockTrapdoorHandler final :\n\tpublic cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x01, 0x02, 0x00, 0x03, false>>\n{\n\tusing Super = cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x01, 0x02, 0x00, 0x03, false>>;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\tif (m_BlockType == E_BLOCK_IRON_TRAPDOOR)\n\t\t{\n\t\t\t// Iron doors can only be toggled by redstone, not by right-clicking\n\t\t\treturn false;\n\t\t}\n\n\t\t// Flip the ON bit on / off using the XOR bitwise operation\n\t\tNIBBLETYPE Meta = (a_ChunkInterface.GetBlockMeta(a_BlockPos) ^ 0x04);\n\t\ta_ChunkInterface.SetBlockMeta(a_BlockPos, Meta);\n\t\ta_WorldInterface.GetBroadcastManager().BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_FENCE_GATE_OPEN, a_BlockPos, 0, a_Player.GetClientHandle());\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual void OnCancelRightClick(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace\n\t) const override\n\t{\n\t\tUNUSED(a_ChunkInterface);\n\t\ta_WorldInterface.SendBlockTo(a_BlockPos, a_Player);\n\t}\n\n\n\n\n\n\tinline static eBlockFace BlockMetaDataToBlockFace(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & 0x3)\n\t\t{\n\t\t\tcase 0x0: return BLOCK_FACE_ZM;\n\t\t\tcase 0x1: return BLOCK_FACE_ZP;\n\t\t\tcase 0x2: return BLOCK_FACE_XM;\n\t\t\tcase 0x3: return BLOCK_FACE_XP;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled block meta!\");\n\t\t\t\treturn BLOCK_FACE_NONE;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\tswitch (m_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_TRAPDOOR: return 13;\n\t\t\tcase E_BLOCK_IRON_TRAPDOOR: return 6;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled blocktype in trapdoor handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockTripwire.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockTripwireHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_STRING, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockTripwireHook.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n#include \"Mixins/Mixins.h\"\n\n\n\n\n\nclass cBlockTripwireHookHandler final :\n\tpublic cMetaRotator<cClearMetaOnDrop<cBlockHandler>, 0x03, 0x02, 0x03, 0x00, 0x01>\n{\n\tusing Super = cMetaRotator<cClearMetaOnDrop<cBlockHandler>, 0x03, 0x02, 0x03, 0x00, 0x01>;\n\npublic:\n\n\tusing Super::Super;\n\n\tinline static eBlockFace MetadataToDirection(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & 0x03)\n\t\t{\n\t\t\tcase 0x1: return BLOCK_FACE_XM;\n\t\t\tcase 0x3: return BLOCK_FACE_XP;\n\t\t\tcase 0x2: return BLOCK_FACE_ZM;\n\t\t\tcase 0x0: return BLOCK_FACE_ZP;\n\t\t\tdefault: ASSERT(!\"Unhandled tripwire hook metadata!\"); return BLOCK_FACE_NONE;\n\t\t}\n\t}\n\nprivate:\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tconst auto RearPosition = AddFaceDirection(a_Position, MetadataToDirection(a_Meta), true);\n\n\t\tBLOCKTYPE NeighborBlockType;\n\t\tif (!a_Chunk.UnboundedRelGetBlockType(RearPosition, NeighborBlockType))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn cBlockInfo::FullyOccupiesVoxel(NeighborBlockType);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockVines.h",
    "content": "#pragma once\n\n#include \"BlockHandler.h\"\n\n\n\n\n\nclass cBlockVinesHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tstatic const NIBBLETYPE VINE_LOST_SUPPORT = 16;\n\tstatic const NIBBLETYPE VINE_UNCHANGED = 17;\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\treturn GetMaxMeta(a_Chunk, a_Position, a_Meta) != VINE_LOST_SUPPORT;\n\t}\n\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Only drops self when using shears, otherwise drops nothing:\n\t\tif ((a_Tool == nullptr) || (a_Tool->m_ItemType != E_ITEM_SHEARS))\n\t\t{\n\t\t\treturn {};\n\t\t}\n\t\treturn cItem(E_BLOCK_VINES, 1, 0);\n\t}\n\n\n\n\n\n\tstatic char MetaDataToDirection(NIBBLETYPE a_MetaData)\n\t{\n\t\tswitch (a_MetaData)\n\t\t{\n\t\t\tcase 0x1: return BLOCK_FACE_NORTH;\n\t\t\tcase 0x4: return BLOCK_FACE_SOUTH;\n\t\t\tcase 0x8: return BLOCK_FACE_WEST;\n\t\t\tcase 0x2: return BLOCK_FACE_EAST;\n\t\t\tdefault:  return BLOCK_FACE_TOP;\n\t\t}\n\t}\n\n\n\n\n\n\t/** Returns true if the specified block type is good for vines to attach to */\n\tstatic bool IsBlockAttachable(BLOCKTYPE a_BlockType)\n\t{\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_CHEST:\n\t\t\tcase E_BLOCK_ENDER_CHEST:\n\t\t\tcase E_BLOCK_GLASS:\n\t\t\tcase E_BLOCK_PISTON:\n\t\t\tcase E_BLOCK_PISTON_EXTENSION:\n\t\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\t\tcase E_BLOCK_STAINED_GLASS:\n\t\t\tcase E_BLOCK_STICKY_PISTON:\n\t\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\t\t{\n\t\t\t\t// You can't attach a vine to this solid blocks.\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn cBlockInfo::IsSolid(a_BlockType);\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\t/** Returns the meta that has the maximum allowable sides of the vine, given the surroundings and current vine meta.\n\tReturns special values for a vine that can continue to exist unchanged, or must die completely. */\n\tstatic NIBBLETYPE GetMaxMeta(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_CurrentMeta)\n\t{\n\t\tstatic const struct\n\t\t{\n\t\t\tint x, z;\n\t\t\tNIBBLETYPE Bit;\n\t\t} Coords[] =\n\t\t{\n\t\t\t{ 0,  1, 1},  // south, ZP\n\t\t\t{-1,  0, 2},  // west,  XM\n\t\t\t{ 0, -1, 4},  // north, ZM\n\t\t\t{ 1,  0, 8},  // east,  XP\n\t\t} ;\n\n\t\tNIBBLETYPE MaxMeta = 0;\n\t\tfor (auto & Coord : Coords)\n\t\t{\n\t\t\tBLOCKTYPE  BlockType;\n\t\t\tNIBBLETYPE BlockMeta;\n\t\t\tauto checkPos = a_Position.addedXZ(Coord.x, Coord.z);\n\t\t\tif (\n\t\t\t\ta_Chunk.UnboundedRelGetBlock(checkPos.x, checkPos.y, checkPos.z, BlockType, BlockMeta) &&\n\t\t\t\tIsBlockAttachable(BlockType)\n\t\t\t)\n\t\t\t{\n\t\t\t\tMaxMeta |= Coord.Bit;\n\t\t\t}\n\t\t}\n\n\t\t// Check if vine above us, add its meta to MaxMeta:\n\t\tconst auto AbovePos = a_Position.addedY(1);\n\t\tif (cChunkDef::IsValidHeight(AbovePos) && (a_Chunk.GetBlock(AbovePos) == E_BLOCK_VINES))\n\t\t{\n\t\t\tMaxMeta |= a_Chunk.GetMeta(AbovePos);\n\t\t}\n\n\t\tNIBBLETYPE Common = a_CurrentMeta & MaxMeta;  // Neighbors that we have and are legal.\n\t\tif (Common != a_CurrentMeta)\n\t\t{\n\t\t\tbool HasTop = cChunkDef::IsValidHeight(AbovePos) && IsBlockAttachable(a_Chunk.GetBlock(AbovePos));\n\t\t\tif ((Common == 0) && !HasTop)  // Meta equals 0 also means top. Make a last-ditch attempt to save the vine.\n\t\t\t{\n\t\t\t\treturn VINE_LOST_SUPPORT;\n\t\t\t}\n\n\t\t\treturn Common;\n\t\t}\n\n\t\treturn VINE_UNCHANGED;\n\t}\n\n\n\n\n\n\tvirtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const override\n\t{\n\t\ta_ChunkInterface.DoWithChunkAt(a_BlockPos, [&](cChunk & a_Chunk)\n\t\t{\n\n\t\tconst auto Position = cChunkDef::AbsoluteToRelative(a_BlockPos);\n\t\tconst auto MaxMeta = GetMaxMeta(a_Chunk, Position, a_Chunk.GetMeta(Position));\n\n\t\tif (MaxMeta == VINE_UNCHANGED)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// There is a neighbor missing, need to update the meta or even destroy the block.\n\n\t\tif (MaxMeta == VINE_LOST_SUPPORT)\n\t\t{\n\t\t\t// The vine just lost all its support, destroy the block:\n\t\t\ta_Chunk.SetBlock(Position, E_BLOCK_AIR, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// It lost some of its support, set it to what remains (SetBlock to notify neighbors):\n\t\t\ta_Chunk.SetBlock(Position, E_BLOCK_VINES, MaxMeta);\n\t\t}\n\n\t\treturn false;\n\t\t});\n\t}\n\n\n\n\n\n\tvirtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override\n\t{\n\t\treturn !a_ClickedDirectly || (a_HeldItem.m_ItemType != m_BlockType);\n\t}\n\n\n\n\n\n\tvirtual void OnUpdate(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3i a_RelPos\n\t) const override\n\t{\n\t\tUNUSED(a_ChunkInterface);\n\t\tUNUSED(a_WorldInterface);\n\n\t\t// Vine cannot grow down if at the bottom:\n\t\tauto GrowPos = a_RelPos.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(GrowPos))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Grow one block down, if possible:\n\t\tBLOCKTYPE Block;\n\t\ta_Chunk.UnboundedRelGetBlockType(GrowPos, Block);\n\t\tif (Block == E_BLOCK_AIR)\n\t\t{\n\t\t\tauto WorldPos = a_Chunk.RelativeToAbsolute(GrowPos);\n\t\t\tif (!a_PluginInterface.CallHookBlockSpread(WorldPos, ssVineSpread))\n\t\t\t{\n\t\t\t\ta_Chunk.UnboundedRelSetBlock(GrowPos, E_BLOCK_VINES, a_Chunk.GetMeta(a_RelPos));\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\treturn ((a_Meta >> 1) | (a_Meta << 3)) & 0x0f;  // Rotate bits to the right\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\treturn ((a_Meta << 1) | (a_Meta >> 3)) & 0x0f;  // Rotate bits to the left\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Bits 2 and 4 stay, bits 1 and 3 swap\n\t\treturn static_cast<NIBBLETYPE>((a_Meta & 0x0a) | ((a_Meta & 0x01) << 2) | ((a_Meta & 0x04) >> 2));\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) const override\n\t{\n\t\t// Bits 1 and 3 stay, bits 2 and 4 swap\n\t\treturn static_cast<NIBBLETYPE>((a_Meta & 0x05) | ((a_Meta & 0x02) << 2) | ((a_Meta & 0x08) >> 2));\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 7;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockWallBanner.h",
    "content": "\n// BlockWallBanner.h\n\n#pragma once\n\n#include \"../BlockInfo.h\"\n#include \"BlockEntity.h\"\n\n\n\n\n\nclass cBlockWallBannerHandler final :\n\tpublic cBlockEntityHandler\n{\n\tusing Super = cBlockEntityHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Drops handled by the block entity:\n\t\treturn {};\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tVector3i Offset;\n\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase BLOCK_FACE_ZM: Offset = Vector3i( 0, 0,  1); break;\n\t\t\tcase BLOCK_FACE_ZP: Offset = Vector3i( 0, 0, -1); break;\n\t\t\tcase BLOCK_FACE_XM: Offset = Vector3i( 1, 0,  0); break;\n\t\t\tcase BLOCK_FACE_XP: Offset = Vector3i(-1, 0,  0); break;\n\t\t\tdefault: return false;\n\t\t}\n\n\t\tauto NeighborPos = a_Position + Offset;\n\t\tBLOCKTYPE NeighborType;\n\t\tif (!a_Chunk.UnboundedRelGetBlockType(NeighborPos, NeighborType))\n\t\t{\n\t\t\t// The neighbour is not accessible (unloaded chunk), we'll allow it for now.\n\t\t\treturn true;\n\t\t}\n\t\treturn cBlockInfo::IsSolid(NeighborType);\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 0;\n\t}\n} ;\n"
  },
  {
    "path": "src/Blocks/BlockWallSign.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\nclass cBlockWallSignHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\treturn cItem(E_ITEM_SIGN, 1, 0);\n\t}\n\n\n\n\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tauto NeighborPos = a_Position + GetOffsetBehindTheSign(a_Meta);\n\t\tBLOCKTYPE NeighborType;\n\t\tif (!a_Chunk.UnboundedRelGetBlockType(NeighborPos, NeighborType))\n\t\t{\n\t\t\t// The neighbor is not accessible (unloaded chunk), bail out without changing this\n\t\t\treturn true;\n\t\t}\n\t\treturn (NeighborType == E_BLOCK_WALLSIGN) || (NeighborType == E_BLOCK_SIGN_POST) || cBlockInfo::IsSolid(NeighborType);\n\t}\n\n\n\n\n\n\t/** Returns the offset from the sign coords to the block to which the wallsign is attached, based on the wallsign's block meta.\n\tAsserts / returns a zero vector on wrong meta. */\n\tstatic Vector3i GetOffsetBehindTheSign(NIBBLETYPE a_BlockMeta)\n\t{\n\t\tswitch (a_BlockMeta)\n\t\t{\n\t\t\tcase 2: return Vector3i( 0, 0,  1);\n\t\t\tcase 3: return Vector3i( 0, 0, -1);\n\t\t\tcase 4: return Vector3i( 1, 0,  0);\n\t\t\tcase 5: return Vector3i(-1, 0,  0);\n\t\t}\n\t\tASSERT(!\"Invalid wallsign block meta\");\n\t\treturn Vector3i();\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 13;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BlockWorkbench.h",
    "content": "\n#pragma once\n\n#include \"BlockHandler.h\"\n#include \"../UI/CraftingWindow.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cBlockWorkbenchHandler final :\n\tpublic cBlockHandler\n{\n\tusing Super = cBlockHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool OnUse(\n\t\tcChunkInterface & a_ChunkInterface,\n\t\tcWorldInterface & a_WorldInterface,\n\t\tcPlayer & a_Player,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_BlockFace,\n\t\tconst Vector3i a_CursorPos\n\t) const override\n\t{\n\t\ta_Player.GetStatistics().Custom[CustomStatistic::InteractWithCraftingTable]++;\n\n\t\tcWindow * Window = new cCraftingWindow();\n\t\ta_Player.OpenWindow(*Window);\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool IsUseable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override\n\t{\n\t\tUNUSED(a_Meta);\n\t\treturn 13;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/BroadcastInterface.h",
    "content": "\n#pragma once\n\n#include \"../Defines.h\"\n#include \"../Scoreboard.h\"\n\n// fwd:\nclass cClientHandle;\nclass cCompositeChat;\nclass cPlayer;\nclass cWorld;\nenum class EffectID : Int32;\n\n\n\nclass cBroadcastInterface\n{\npublic:\n\tvirtual ~cBroadcastInterface() {}\n\n\t// Broadcast respective packets to all clients of the chunk where the event is taking place\n\t// (Please keep these alpha-sorted)\n\tvirtual void BroadcastAttachEntity               (const cEntity & a_Entity, const cEntity & a_Vehicle) = 0;\n\tvirtual void BroadcastBlockAction                (Vector3i a_BlockPos, Byte a_Byte1, Byte a_Byte2, BLOCKTYPE a_BlockType, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastBlockBreakAnimation        (UInt32 a_EntityID, Vector3i a_BlockPos, Int8 a_Stage, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastBlockEntity                (Vector3i a_BlockPos, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastBossBarUpdateHealth        (const cEntity & a_Entity, UInt32 a_UniqueID, float a_FractionFilled) = 0;\n\tvirtual void BroadcastChat                       (const AString & a_Message, const cClientHandle * a_Exclude = nullptr, eMessageType a_ChatPrefix = mtCustom) = 0;\n\tvirtual void BroadcastChatInfo                   (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastChatFailure                (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastChatSuccess                (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastChatWarning                (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastChatFatal                  (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastChatDeath                  (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastChat                       (const cCompositeChat & a_Message, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastCollectEntity              (const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastDestroyEntity              (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastDetachEntity               (const cEntity & a_Entity, const cEntity & a_PreviousVehicle) = 0;\n\tvirtual void BroadcastEntityEffect               (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, int a_Duration, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastEntityEquipment            (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastEntityHeadLook             (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastEntityLook                 (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastEntityMetadata             (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastEntityPosition             (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastEntityVelocity             (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastEntityAnimation            (const cEntity & a_Entity, EntityAnimation a_Animation, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastLeashEntity                (const cEntity & a_Entity, const cEntity & a_EntityLeashedTo) = 0;\n\tvirtual void BroadcastParticleEffect             (const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastParticleEffect             (const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastPlayerListAddPlayer        (const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastPlayerListHeaderFooter     (const cCompositeChat & a_Header, const cCompositeChat & a_Footer) = 0;\n\tvirtual void BroadcastPlayerListRemovePlayer     (const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_CustomName, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastPlayerListUpdateGameMode   (const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastPlayerListUpdatePing       () = 0;\n\tvirtual void BroadcastRemoveEntityEffect         (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastScoreboardObjective        (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) = 0;\n\tvirtual void BroadcastScoreUpdate                (const AString & a_Objective, const AString & a_PlayerName, cObjective::Score a_Score, Byte a_Mode) = 0;\n\tvirtual void BroadcastDisplayObjective           (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) = 0;\n\tvirtual void BroadcastSoundEffect                (const AString & a_SoundName, Vector3d a_Position, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastSoundParticleEffect        (const EffectID a_EffectID, Vector3i a_SrcPos, int a_Data, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastSpawnEntity                (cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastThunderbolt                (Vector3i a_BlockPos, const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastTimeUpdate                 (const cClientHandle * a_Exclude = nullptr) = 0;\n\tvirtual void BroadcastUnleashEntity              (const cEntity & a_Entity) = 0;\n\tvirtual void BroadcastWeather                    (eWeather a_Weather, const cClientHandle * a_Exclude = nullptr) = 0;\n};\n"
  },
  {
    "path": "src/Blocks/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tBlockBed.cpp\n\tBlockDoor.cpp\n\tBlockHandler.cpp\n\tBlockPiston.cpp\n\tChunkInterface.cpp\n\n\tBlockAir.h\n\tBlockAnvil.h\n\tBlockBed.h\n\tBlockBigFlower.h\n\tBlockBookShelf.h\n\tBlockBrewingStand.h\n\tBlockButton.h\n\tBlockCactus.h\n\tBlockCake.h\n\tBlockCarpet.h\n\tBlockCauldron.h\n\tBlockChest.h\n\tBlockCloth.h\n\tBlockCobWeb.h\n\tBlockCocoaPod.h\n\tBlockCommandBlock.h\n\tBlockComparator.h\n\tBlockConcretePowder.h\n\tBlockCrops.h\n\tBlockDaylightSensor.h\n\tBlockDeadBush.h\n\tBlockDefaultBlock.h\n\tBlockDirt.h\n\tBlockDoor.h\n\tBlockDropSpenser.h\n\tBlockEnchantingTable.h\n\tBlockEnderChest.h\n\tBlockEndPortalFrame.h\n\tBlockEntity.h\n\tBlockFarmland.h\n\tBlockFence.h\n\tBlockFenceGate.h\n\tBlockFire.h\n\tBlockFlower.h\n\tBlockFlowerPot.h\n\tBlockFluid.h\n\tBlockFurnace.h\n\tBlockGlass.h\n\tBlockGlazedTerracotta.h\n\tBlockGlowstone.h\n\tBlockGrass.h\n\tBlockGravel.h\n\tBlockHandler.h\n\tBlockHopper.h\n\tBlockHugeMushroom.h\n\tBlockIce.h\n\tBlockJukebox.h\n\tBlockLadder.h\n\tBlockLeaves.h\n\tBlockLever.h\n\tBlockLilypad.h\n\tBlockMelon.h\n\tBlockMobHead.h\n\tBlockMobSpawner.h\n\tBlockInfested.h\n\tBlockMushroom.h\n\tBlockMycelium.h\n\tBlockNetherrack.h\n\tBlockNetherWart.h\n\tBlockNoteBlock.h\n\tBlockObserver.h\n\tBlockOre.h\n\tBlockPackedIce.h\n\tBlockPiston.h\n\tBlockPlanks.h\n\tBlockPlant.h\n\tBlockPluginInterface.h\n\tBlockPortal.h\n\tBlockPressurePlate.h\n\tBlockPumpkin.h\n\tBlockQuartz.h\n\tBlockRail.h\n\tBlockRedstoneWire.h\n\tBlockRedstoneLamp.h\n\tBlockRedstoneOre.h\n\tBlockRedstoneRepeater.h\n\tBlockSand.h\n\tBlockSapling.h\n\tBlockSeaLantern.h\n\tBlockSideways.h\n\tBlockSignPost.h\n\tBlockSlab.h\n\tBlockSlime.h\n\tBlockSnow.h\n\tBlockSponge.h\n\tBlockStairs.h\n\tBlockStandingBanner.h\n\tBlockStems.h\n\tBlockStone.h\n\tBlockSugarCane.h\n\tBlockTNT.h\n\tBlockTallGrass.h\n\tBlockTorch.h\n\tBlockTrapdoor.h\n\tBlockTripwire.h\n\tBlockTripwireHook.h\n\tBlockVines.h\n\tBlockWallBanner.h\n\tBlockWallSign.h\n\tBlockWorkbench.h\n\tBroadcastInterface.h\n\tChunkInterface.h\n\tGetHandlerCompileTimeTemplate.h\n\tMixins/Mixins.h\n\tWorldInterface.h\n)\n"
  },
  {
    "path": "src/Blocks/ChunkInterface.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"ChunkInterface.h\"\n#include \"BlockHandler.h\"\n#include \"WorldInterface.h\"\n#include \"../ChunkMap.h\"\n#include \"../World.h\"\n\n\n\n\n\nbool cChunkInterface::DoWithChunkAt(Vector3i a_BlockPos, cChunkCallback a_Callback)\n{\n\treturn m_ChunkMap->DoWithChunkAt(a_BlockPos, a_Callback);\n}\n\n\n\n\n\nBLOCKTYPE cChunkInterface::GetBlock(Vector3i a_Pos)\n{\n\treturn m_ChunkMap->GetBlock(a_Pos);\n}\n\n\n\n\n\nNIBBLETYPE cChunkInterface::GetBlockMeta(Vector3i a_Pos)\n{\n\treturn m_ChunkMap->GetBlockMeta(a_Pos);\n}\n\n\n\n\n\nbool cChunkInterface::GetBlockTypeMeta(Vector3i a_Pos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta)\n{\n\treturn m_ChunkMap->GetBlockTypeMeta(a_Pos, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nvoid cChunkInterface::SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tm_ChunkMap->SetBlock(a_BlockPos, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nvoid cChunkInterface::SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_MetaData)\n{\n\tm_ChunkMap->SetBlockMeta(a_BlockPos, a_MetaData);\n}\n\n\n\n\n\nvoid cChunkInterface::FastSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tm_ChunkMap->FastSetBlock(a_BlockPos, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nbool cChunkInterface::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ)\n{\n\treturn m_ChunkMap->UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ);\n}\n\n\n\n\n\nbool cChunkInterface::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback)\n{\n\treturn m_ChunkMap->ForEachChunkInRect(a_MinChunkX, a_MaxChunkX, a_MinChunkZ, a_MaxChunkZ, a_Callback);\n}\n\n\n\n\n\nbool cChunkInterface::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)\n{\n\treturn m_ChunkMap->WriteBlockArea(a_Area, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes);\n}\n\n\n\n\n\nbool cChunkInterface::DigBlock(cWorldInterface & a_WorldInterface, Vector3i a_BlockPos, cEntity * a_Digger)\n{\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\tGetBlockTypeMeta(a_BlockPos, BlockType, BlockMeta);\n\n\tif (!m_ChunkMap->DigBlock(a_BlockPos))\n\t{\n\t\treturn false;\n\t}\n\n\tcBlockHandler::For(BlockType).OnBroken(*this, a_WorldInterface, a_BlockPos, BlockType, BlockMeta, a_Digger);\n\treturn true;\n}\n\n\n\n\n\nvoid cChunkInterface::DropBlockAsPickups(Vector3i a_BlockPos, const cEntity * a_Digger, const cItem * a_Tool)\n{\n\tm_ChunkMap->GetWorld()->DropBlockAsPickups(a_BlockPos, a_Digger, a_Tool);\n}\n"
  },
  {
    "path": "src/Blocks/ChunkInterface.h",
    "content": "\n#pragma once\n\n#include \"../ForEachChunkProvider.h\"\n#include \"../FunctionRef.h\"\n#include \"ChunkDef.h\"\n\n\n\n// fwd:\nclass cItem;\nclass cChunk;\nclass cChunkMap;\nclass cWorldInterface;\nclass cPlayer;\n\n\n\n\n\nclass cChunkInterface:\n\tpublic cForEachChunkProvider\n{\npublic:\n\n\tcChunkInterface(cChunkMap * a_ChunkMap) : m_ChunkMap(a_ChunkMap) {}\n\n\tbool DoWithChunkAt(Vector3i a_BlockPos, cFunctionRef<bool(cChunk &)> a_Callback);\n\n\tBLOCKTYPE GetBlock(Vector3i a_Pos);\n\tNIBBLETYPE GetBlockMeta(Vector3i a_Pos);\n\n\tbool GetBlockTypeMeta(Vector3i a_Pos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta);\n\n\t/** Sets the block at the specified coords to the specified value.\n\tFull processing, incl. updating neighbors, is performed. */\n\tvoid SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** OBSOLETE, use the Vector3i-based overload instead.\n\tSets the block at the specified coords to the specified value.\n\tFull processing, incl. updating neighbors, is performed. */\n\tvoid SetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\treturn SetBlock({a_BlockX, a_BlockY, a_BlockZ}, a_BlockType, a_BlockMeta);\n\t}\n\n\t/** Sets the meta for the specified block, while keeping the blocktype.\n\tIgnored if the chunk is invalid. */\n\tvoid SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_MetaData);\n\n\t/** OBSOLETE, Use the Vector3-based overload instead.\n\tSets the meta for the specified block, while keeping the blocktype.\n\tIgnored if the chunk is invalid. */\n\tvoid SetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_MetaData)\n\t{\n\t\treturn SetBlockMeta({a_BlockX, a_BlockY, a_BlockZ}, a_MetaData);\n\t}\n\n\t/** Sets the block at the specified coords to the specified value.\n\tThe replacement doesn't trigger block updates.\n\tThe replaced blocks aren't checked for block entities (block entity is leaked if it exists at this block). */\n\tvoid FastSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** Use block entity on coordinate.\n\treturns true if the use was successful, return false to use the block as a \"normal\" block */\n\tbool UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ);\n\n\tvirtual bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback) override;\n\n\tvirtual bool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes) override;\n\n\tbool DigBlock(cWorldInterface & a_WorldInterface, Vector3i a_BlockPos, cEntity * a_Digger);\n\n\t/** Digs the block and spawns the relevant pickups, as if a_Digger used a_Tool to dig the block. */\n\tvoid DropBlockAsPickups(Vector3i a_BlockPos, const cEntity * a_Digger = nullptr, const cItem * a_Tool = nullptr);\n\n\nprivate:\n\tcChunkMap * m_ChunkMap;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Blocks/GetHandlerCompileTimeTemplate.h",
    "content": "\n#pragma once\n\nclass cBlockTorchHandler;\nclass cBlockLeverHandler;\nclass cBlockButtonHandler;\nclass cBlockTripwireHookHandler;\nclass cBlockDoorHandler;\nclass cBlockPistonHandler;\n\n\n\n\n\ntemplate<BLOCKTYPE T>\nclass GetHandlerCompileTime;\n\n\n\n\n\ntemplate<>\nclass GetHandlerCompileTime<E_BLOCK_TORCH>\n{\npublic:\n\ttypedef cBlockTorchHandler type;\n};\n\n\n\n\n\ntemplate<>\nclass GetHandlerCompileTime<E_BLOCK_LEVER>\n{\npublic:\n\ttypedef cBlockLeverHandler type;\n};\n\n\n\n\n\ntemplate<>\nclass GetHandlerCompileTime<E_BLOCK_STONE_BUTTON>\n{\npublic:\n\ttypedef cBlockButtonHandler type;\n};\n\n\n\n\n\ntemplate<>\nclass GetHandlerCompileTime<E_BLOCK_TRIPWIRE_HOOK>\n{\npublic:\n\ttypedef cBlockTripwireHookHandler type;\n};\n\n\n\n\n\ntemplate<>\nclass GetHandlerCompileTime<E_BLOCK_WOODEN_DOOR>\n{\npublic:\n\ttypedef cBlockDoorHandler type;\n};\n\n\n\n\n\ntemplate<>\nclass GetHandlerCompileTime<E_BLOCK_PISTON>\n{\npublic:\n\ttypedef cBlockPistonHandler type;\n};\n\n"
  },
  {
    "path": "src/Blocks/Mixins/DirtLikeUnderneath.h",
    "content": "\n#pragma once\n\n#include \"../../Chunk.h\"\n\n/** Mixin to ensure the block has a dirt-like block underneath. */\ntemplate <class Base>\nclass cDirtLikeUnderneath :\n\tpublic Base\n{\n\tusing Super = Base;\npublic:\n\n\tusing Super::Super;\n\n\tconstexpr cDirtLikeUnderneath(BLOCKTYPE a_BlockType):\n\t\tBase(a_BlockType)\n\t{\n\t}\n\nprotected:\n\n\t~cDirtLikeUnderneath() = default;\n\nprotected:\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tif (!Super::CanBeAt(a_Chunk, a_Position, a_Meta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto BelowPos = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(BelowPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn IsBlockTypeOfDirt(a_Chunk.GetBlock(BelowPos));\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/Mixins/Mixins.h",
    "content": "// Mixins.h\n\n// Provides various mixins for easier cBlockHandler descendant implementations\n\n/* The general use case is to derive a handler from these mixins, providing a suitable base to them:\nclass cBlockAir: public cBlockWithNoDrops<cBlockHandler>;\nclass cBlockLadder: public cMetaRotator<cClearMetaOnDrop, ...>\n*/\n\n#pragma once\n\n#include \"../../Item.h\"\n\n\n\n\n\n// MSVC generates warnings for the templated AssertIfNotMatched parameter conditions, so disable it:\n#ifdef _MSC_VER\n\t#pragma warning(disable: 4127)  // Conditional expression is constant\n#endif\n\n\n\n\n\n/** Mixin to clear the block's meta value when converting to a pickup. */\ntemplate <class Base>\nclass cClearMetaOnDrop :\n\tpublic Base\n{\npublic:\n\n\tconstexpr cClearMetaOnDrop(BLOCKTYPE a_BlockType):\n\t\tBase(a_BlockType)\n\t{\n\t}\n\nprotected:\n\n\t~cClearMetaOnDrop() = default;\n\nprivate:\n\n\tvirtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override\n\t{\n\t\t// Reset the meta to zero:\n\t\treturn cItem(this->m_BlockType);\n\t}\n};\n\n\n\n\n\n/** Mixin for rotations and reflections following the standard pattern of \"apply mask, then use a switch\".\nInherit from this class providing your base class as Base, the BitMask for the direction bits in bitmask and the masked value for the directions in North, East, South, West.\nThere is also an aptional parameter AssertIfNotMatched, set this if it is invalid for a block to exist in any other state. */\ntemplate <class Base, NIBBLETYPE BitMask, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West, bool AssertIfNotMatched = false>\nclass cMetaRotator :\n\tpublic Base\n{\npublic:\n\n\tconstexpr cMetaRotator(BLOCKTYPE a_BlockType):\n\t\tBase(a_BlockType)\n\t{\n\t}\n\nprotected:\n\n\t~cMetaRotator() = default;\n\n\tvirtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\tNIBBLETYPE OtherMeta = a_Meta & (~BitMask);\n\t\tswitch (a_Meta & BitMask)\n\t\t{\n\t\t\tcase South: return East  | OtherMeta;\n\t\t\tcase East:  return North | OtherMeta;\n\t\t\tcase North: return West  | OtherMeta;\n\t\t\tcase West:  return South | OtherMeta;\n\t\t}\n\t\tif (AssertIfNotMatched)\n\t\t{\n\t\t\tASSERT(!\"Invalid Meta value\");\n\t\t}\n\t\treturn a_Meta;\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) const override\n\t{\n\t\tNIBBLETYPE OtherMeta = a_Meta & (~BitMask);\n\t\tswitch (a_Meta & BitMask)\n\t\t{\n\t\t\tcase South: return West  | OtherMeta;\n\t\t\tcase West:  return North | OtherMeta;\n\t\t\tcase North: return East  | OtherMeta;\n\t\t\tcase East:  return South | OtherMeta;\n\t\t}\n\t\tif (AssertIfNotMatched)\n\t\t{\n\t\t\tASSERT(!\"Invalid Meta value\");\n\t\t}\n\t\treturn a_Meta;\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) const override\n\t{\n\t\tNIBBLETYPE OtherMeta = a_Meta & (~BitMask);\n\t\tswitch (a_Meta & BitMask)\n\t\t{\n\t\t\tcase South: return North | OtherMeta;\n\t\t\tcase North: return South | OtherMeta;\n\t\t}\n\t\t// Not Facing North or South; No change.\n\t\treturn a_Meta;\n\t}\n\n\n\n\n\n\tvirtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) const override\n\t{\n\t\tNIBBLETYPE OtherMeta = a_Meta & (~BitMask);\n\t\tswitch (a_Meta & BitMask)\n\t\t{\n\t\t\tcase West: return East | OtherMeta;\n\t\t\tcase East: return West | OtherMeta;\n\t\t}\n\t\t// Not Facing East or West; No change.\n\t\treturn a_Meta;\n\t}\n};\n\n\n\n\n\n/** Mixin for blocks whose meta on placement depends on the yaw of the player placing the block. BitMask\nselects the direction bits from the block's meta values. */\ntemplate <\n\tclass Base,\n\tNIBBLETYPE BitMask = 0x07,\n\tNIBBLETYPE North = 0x02,\n\tNIBBLETYPE East = 0x05,\n\tNIBBLETYPE South = 0x03,\n\tNIBBLETYPE West = 0x04,\n\tbool AssertIfNotMatched = false\n>\nclass cYawRotator :\n\tpublic cMetaRotator<Base, BitMask, North, East, South, West, AssertIfNotMatched>\n{\n\tusing Super = cMetaRotator<Base, BitMask, North, East, South, West, AssertIfNotMatched>;\n\npublic:\n\n\tusing Super::Super;\n\n\n\t/** Converts the rotation value as returned by cPlayer::GetYaw() to the appropriate metadata\n\tvalue for a block placed by a player facing that way. */\n\tstatic NIBBLETYPE YawToMetaData(double a_Rotation)\n\t{\n\t\tif ((a_Rotation >= -135) && (a_Rotation < -45))\n\t\t{\n\t\t\treturn East;\n\t\t}\n\t\telse if ((a_Rotation >= -45) && (a_Rotation < 45))\n\t\t{\n\t\t\treturn South;\n\t\t}\n\t\telse if ((a_Rotation >= 45) && (a_Rotation < 135))\n\t\t{\n\t\t\treturn West;\n\t\t}\n\t\telse  // degrees jumping from 180 to -180\n\t\t{\n\t\t\treturn North;\n\t\t}\n\t}\n\nprotected:\n\n\t~cYawRotator() = default;\n};\n\n\n\n\n\n/** Mixin for blocks whose meta on placement depends on the relative position of the player to the block in\naddition to the yaw of the player placing the block. BitMask selects the direction bits from the block's meta values. */\ntemplate <\n\tclass Base,\n\tNIBBLETYPE BitMask = 0x07,\n\tNIBBLETYPE North = 0x02,\n\tNIBBLETYPE East = 0x05,\n\tNIBBLETYPE South = 0x03,\n\tNIBBLETYPE West = 0x04,\n\tNIBBLETYPE Up = 0x00,\n\tNIBBLETYPE Down = 0x01\n>\nclass cDisplacementYawRotator:\n\tpublic cYawRotator<Base, BitMask, North, East, South, West>\n{\n\tusing Super = cYawRotator<Base, BitMask, North, East, South, West>;\n\npublic:\n\n\tusing Super::Super;\n\n\n\t/** Converts the placement position, eye position as returned by cPlayer::GetEyePosition(), and\n\trotation value as returned by cPlayer::GetYaw() to the appropriate metadata value for a block placed by a player facing that way. */\n\tstatic NIBBLETYPE DisplacementYawToMetaData(const Vector3d a_PlacePosition, const Vector3d a_EyePosition, const double a_Rotation)\n\t{\n\t\tif (\n\t\t\tconst auto Displacement = a_EyePosition - a_PlacePosition.addedXZ(0.5, 0.5);\n\t\t\t(std::abs(Displacement.x) < 2) && (std::abs(Displacement.z) < 2)\n\t\t)\n\t\t{\n\t\t\tif (Displacement.y > 2)\n\t\t\t{\n\t\t\t\treturn Up;\n\t\t\t}\n\n\t\t\tif (Displacement.y < 0)\n\t\t\t{\n\t\t\t\treturn Down;\n\t\t\t}\n\t\t}\n\n\t\treturn Super::YawToMetaData(a_Rotation);\n\t}\n\nprotected:\n\n\t~cDisplacementYawRotator() = default;\n\n\n\tvirtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) const override\n\t{\n\t\tNIBBLETYPE OtherMeta = a_Meta & (~BitMask);\n\t\tswitch (a_Meta & BitMask)\n\t\t{\n\t\t\tcase Down: return Up | OtherMeta;  // Down -> Up\n\t\t\tcase Up: return Down | OtherMeta;  // Up -> Down\n\t\t}\n\t\t// Not Facing Up or Down; No change.\n\t\treturn a_Meta;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/Mixins/SolidSurfaceUnderneath.h",
    "content": "\n#pragma once\n\n#include \"../../Chunk.h\"\n#include \"../BlockSlab.h\"\n#include \"../BlockStairs.h\"\n\n/** Mixin to ensure the block has a solid surface underneath. */\ntemplate <class Base>\nclass cSolidSurfaceUnderneath :\n\tpublic Base\n{\n\tusing Super = Base;\npublic:\n\n\tusing Super::Super;\n\n\tconstexpr cSolidSurfaceUnderneath(BLOCKTYPE a_BlockType):\n\t\tBase(a_BlockType)\n\t{\n\t}\n\nprotected:\n\n\t~cSolidSurfaceUnderneath() = default;\n\nprotected:\n\n\tvirtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override\n\t{\n\t\tif (!Super::CanBeAt(a_Chunk, a_Position, a_Meta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto BelowPos = a_Position.addedY(-1);\n\t\tif (!cChunkDef::IsValidHeight(BelowPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tBLOCKTYPE BelowBlock;\n\t\tNIBBLETYPE BelowBlockMeta;\n\t\ta_Chunk.GetBlockTypeMeta(BelowPos, BelowBlock, BelowBlockMeta);\n\n\t\tif (cBlockInfo::FullyOccupiesVoxel(BelowBlock))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// upside down slabs\n\t\tif (cBlockSlabHandler::IsAnySlabType(BelowBlock))\n\t\t{\n\t\t\treturn BelowBlockMeta & E_META_WOODEN_SLAB_UPSIDE_DOWN;\n\t\t}\n\n\t\t// upside down stairs\n\t\tif (cBlockStairsHandler::IsAnyStairType(BelowBlock))\n\t\t{\n\t\t\treturn BelowBlockMeta & E_BLOCK_STAIRS_UPSIDE_DOWN;\n\t\t}\n\n\t\treturn false;\n\t}\n};\n"
  },
  {
    "path": "src/Blocks/WorldInterface.h",
    "content": "\n#pragma once\n\n#include \"../FunctionRef.h\"\n#include \"../Mobs/MonsterTypes.h\"\n\n#include <optional>\n\nclass cBlockEntity;\nclass cBroadcastInterface;\nclass cItems;\nclass cPlayer;\n\nusing cBlockEntityCallback = cFunctionRef<bool(cBlockEntity &)>;\nusing cPlayerListCallback  = cFunctionRef<bool(cPlayer      &)>;\nusing cEntityCallback      = cFunctionRef<bool(cEntity      &)>;\n\n\n\n\nclass cWorldInterface\n{\npublic:\n\tvirtual ~cWorldInterface() {}\n\n\tvirtual cTickTime GetTimeOfDay(void) const = 0;\n\tvirtual cTickTimeLong GetWorldAge(void)  const = 0;\n\n\tvirtual eDimension GetDimension(void) const = 0;\n\n\tvirtual cBroadcastInterface & GetBroadcastManager() = 0;\n\n\tvirtual void DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_BlockY, double a_BlockZ, bool a_CanCauseFire, eExplosionSource a_Source, void * a_SourceData) = 0;\n\n\t/** Calls the callback for the block entity at the specified coords; returns false if there's no block entity at those coords, true if found */\n\tvirtual bool DoWithBlockEntityAt(Vector3i a_Position, cBlockEntityCallback a_Callback) = 0;\n\n\t/** Spawns item pickups for each item in the list. May compress pickups if too many entities: */\n\tvirtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_FlyAwaySpeed = 1.0, bool IsPlayerCreated = false) = 0;\n\n\t/** Spawns item pickups for each item in the list. May compress pickups if too many entities. All pickups get the speed specified. */\n\tvirtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_SpeedX, double a_SpeedY, double a_SpeedZ, bool IsPlayerCreated = false) = 0;\n\n\tvirtual UInt32 SpawnItemPickup(double a_PosX, double a_PosY, double a_PosZ, const cItem & a_Item, float a_SpeedX = 0.f, float a_SpeedY = 0.f, float a_SpeedZ = 0.f, int a_LifetimeTicks = 6000, bool a_CanCombine = true) = 0;\n\n\t/** Spawns a mob of the specified type.\n\tReturns the mob's UniqueID if recognized and spawned, or cEntity::INVALID_ID on failure. */\n\tvirtual UInt32 SpawnMob(double a_PosX, double a_PosY, double a_PosZ, eMonsterType a_MonsterType, bool a_Baby) = 0;\n\n\t/** Spawns an experience orb at the given location with the given reward.\n\tReturns the UniqueID of the spawned experience orb, or cEntity::INVALID_ID on failure. */\n\tvirtual UInt32 SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward) = 0;\n\n\t/** Spawns experience orbs of the specified total value at the given location. The orbs' values are split according to regular Minecraft rules.\n\tReturns an vector of UniqueID of all the orbs. */\n\tvirtual std::vector<UInt32> SpawnSplitExperienceOrbs(Vector3d a_Pos, int a_Reward) = 0;\n\n\t/** Sends the block on those coords to the player */\n\tvirtual void SendBlockTo(int a_BlockX, int a_BlockY, int a_BlockZ, const cPlayer & a_Player) = 0;\n\n\t/** Sends the block on those coords to the player */\n\tinline void SendBlockTo(const Vector3i a_BlockPos, const cPlayer & a_Player)\n\t{\n\t\tSendBlockTo(a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_Player);\n\t}\n\n\t/** Calls the callback for each player in the list; returns true if all players processed, false if the callback aborted by returning true */\n\tvirtual bool ForEachPlayer(cPlayerListCallback a_Callback) = 0;\n\n\t/** Calls the callback for each entity that has a nonempty intersection with the specified boundingbox.\n\tReturns true if all entities processed, false if the callback aborted by returning true.\n\tIf any chunk in the box is missing, ignores the entities in that chunk silently. */\n\tvirtual bool ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback) = 0;\n\n\tvirtual void SetTimeOfDay(cTickTime a_TimeOfDay) = 0;\n\n\t/** Returns true if it is raining or storming at the specified location. This takes into account biomes. */\n\tvirtual bool IsWeatherWetAt(int a_BlockX, int a_BlockZ) = 0;\n\n\t/** Returns true if it is raining or storming at the specified location,\n\tand the rain reaches the specified block position.\n\tReturns the global weather state for unloaded chunks.\n\t*/\n\tvirtual bool IsWeatherWetAtXYZ(Vector3i a_Pos) = 0;\n\n\t/** Returns or sets the minumim or maximum netherportal width */\n\tvirtual int GetMinNetherPortalWidth(void) const = 0;\n\tvirtual int GetMaxNetherPortalWidth(void) const = 0;\n\tvirtual void SetMinNetherPortalWidth(int a_NewMinWidth) = 0;\n\tvirtual void SetMaxNetherPortalWidth(int a_NewMaxWidth) = 0;\n\n\t/** Returns or sets the minumim or maximum netherportal height */\n\tvirtual int GetMinNetherPortalHeight(void) const = 0;\n\tvirtual int GetMaxNetherPortalHeight(void) const = 0;\n\tvirtual void SetMinNetherPortalHeight(int a_NewMinHeight) = 0;\n\tvirtual void SetMaxNetherPortalHeight(int a_NewMaxHeight) = 0;\n\n\t/** Returns the world height at the specified coords; returns nullopt for unloaded / generated chunks */\n\tvirtual std::optional<int> GetHeight(int a_BlockX, int a_BlockZ) = 0;\n\n\t/** Wakes up the simulators for the specified block */\n\tvirtual void WakeUpSimulators(Vector3i a_Block) = 0;\n\n};\n"
  },
  {
    "path": "src/BoundingBox.cpp",
    "content": "// BoundingBox.cpp\n\n// Implements the cBoundingBox class representing an axis-aligned bounding box with floatingpoint coords\n\n#include \"Globals.h\"\n#include \"BoundingBox.h\"\n\n\n\n\n\ncBoundingBox::cBoundingBox(double a_MinX, double a_MaxX, double a_MinY, double a_MaxY, double a_MinZ, double a_MaxZ) :\n\tm_Min(a_MinX, a_MinY, a_MinZ),\n\tm_Max(a_MaxX, a_MaxY, a_MaxZ)\n{\n}\n\n\n\n\n\ncBoundingBox::cBoundingBox(Vector3d a_Min, Vector3d a_Max) :\n\tm_Min(a_Min),\n\tm_Max(a_Max)\n{\n}\n\n\n\n\n\ncBoundingBox::cBoundingBox(Vector3d a_Pos, double a_Radius, double a_Height) :\n\tm_Min(a_Pos.x - a_Radius, a_Pos.y,            a_Pos.z - a_Radius),\n\tm_Max(a_Pos.x + a_Radius, a_Pos.y + a_Height, a_Pos.z + a_Radius)\n{\n}\n\n\n\n\n\ncBoundingBox::cBoundingBox(Vector3d a_Pos, double a_Radius, double a_Height, double a_VerticalOffset) :\n\tm_Min(a_Pos.x - a_Radius, a_Pos.y + a_VerticalOffset, a_Pos.z - a_Radius),\n\tm_Max(a_Pos.x + a_Radius, a_Pos.y + a_VerticalOffset + a_Height, a_Pos.z + a_Radius)\n{\n}\n\n\n\n\n\ncBoundingBox::cBoundingBox(Vector3d a_Pos, double a_CubeLength) :\n\tm_Min(a_Pos.x - a_CubeLength / 2, a_Pos.y - a_CubeLength / 2, a_Pos.z - a_CubeLength / 2),\n\tm_Max(a_Pos.x + a_CubeLength / 2, a_Pos.y + a_CubeLength / 2, a_Pos.z + a_CubeLength / 2)\n{\n}\n\n\n\n\n\nvoid cBoundingBox::Move(double a_OffX, double a_OffY, double a_OffZ)\n{\n\tm_Min.x += a_OffX;\n\tm_Min.y += a_OffY;\n\tm_Min.z += a_OffZ;\n\tm_Max.x += a_OffX;\n\tm_Max.y += a_OffY;\n\tm_Max.z += a_OffZ;\n}\n\n\n\n\n\nvoid cBoundingBox::Move(Vector3d a_Off)\n{\n\tm_Min.x += a_Off.x;\n\tm_Min.y += a_Off.y;\n\tm_Min.z += a_Off.z;\n\tm_Max.x += a_Off.x;\n\tm_Max.y += a_Off.y;\n\tm_Max.z += a_Off.z;\n}\n\n\n\n\n\nvoid cBoundingBox::Expand(double a_ExpandX, double a_ExpandY, double a_ExpandZ)\n{\n\tm_Min.x -= a_ExpandX;\n\tm_Min.y -= a_ExpandY;\n\tm_Min.z -= a_ExpandZ;\n\tm_Max.x += a_ExpandX;\n\tm_Max.y += a_ExpandY;\n\tm_Max.z += a_ExpandZ;\n}\n\n\n\n\n\nbool cBoundingBox::DoesIntersect(const cBoundingBox & a_Other)\n{\n\treturn (\n\t\t((a_Other.m_Min.x <= m_Max.x) && (a_Other.m_Max.x >= m_Min.x)) &&  // X coords intersect\n\t\t((a_Other.m_Min.y <= m_Max.y) && (a_Other.m_Max.y >= m_Min.y)) &&  // Y coords intersect\n\t\t((a_Other.m_Min.z <= m_Max.z) && (a_Other.m_Max.z >= m_Min.z))     // Z coords intersect\n\t);\n}\n\n\n\n\n\ncBoundingBox cBoundingBox::Union(const cBoundingBox & a_Other)\n{\n\treturn cBoundingBox(\n\t\tstd::min(m_Min.x, a_Other.m_Min.x),\n\t\tstd::max(m_Max.x, a_Other.m_Max.x),\n\t\tstd::min(m_Min.y, a_Other.m_Min.y),\n\t\tstd::max(m_Max.y, a_Other.m_Max.y),\n\t\tstd::min(m_Min.z, a_Other.m_Min.z),\n\t\tstd::max(m_Max.z, a_Other.m_Max.z)\n\t);\n}\n\n\n\n\n\nbool cBoundingBox::IsInside(Vector3d a_Point)\n{\n\treturn IsInside(m_Min, m_Max, a_Point);\n}\n\n\n\n\n\nbool cBoundingBox::IsInside(double a_X, double a_Y, double a_Z)\n{\n\treturn IsInside(m_Min, m_Max, a_X, a_Y, a_Z);\n}\n\n\n\n\n\nbool cBoundingBox::IsInside(cBoundingBox & a_Other)\n{\n\t// If both a_Other's coords are inside this, then the entire a_Other is inside\n\treturn (IsInside(a_Other.m_Min) && IsInside(a_Other.m_Max));\n}\n\n\n\n\n\nbool cBoundingBox::IsInside(Vector3d a_Min, Vector3d a_Max)\n{\n\t// If both coords are inside this, then the entire a_Other is inside\n\treturn (IsInside(a_Min) && IsInside(a_Max));\n}\n\n\n\n\n\nbool cBoundingBox::IsInside(Vector3d a_Min, Vector3d a_Max, Vector3d a_Point)\n{\n\treturn (\n\t\t((a_Point.x >= a_Min.x) && (a_Point.x <= a_Max.x)) &&\n\t\t((a_Point.y >= a_Min.y) && (a_Point.y <= a_Max.y)) &&\n\t\t((a_Point.z >= a_Min.z) && (a_Point.z <= a_Max.z))\n\t);\n}\n\n\n\n\n\nbool cBoundingBox::IsInside(Vector3d a_Min, Vector3d a_Max, double a_X, double a_Y, double a_Z)\n{\n\treturn (\n\t\t((a_X >= a_Min.x) && (a_X <= a_Max.x)) &&\n\t\t((a_Y >= a_Min.y) && (a_Y <= a_Max.y)) &&\n\t\t((a_Z >= a_Min.z) && (a_Z <= a_Max.z))\n\t);\n}\n\n\n\n\n\nbool cBoundingBox::CalcLineIntersection(Vector3d a_Line1, Vector3d a_Line2, double & a_LineCoeff, eBlockFace & a_Face) const\n{\n\treturn CalcLineIntersection(m_Min, m_Max, a_Line1, a_Line2, a_LineCoeff, a_Face);\n}\n\n\n\n\n\nbool cBoundingBox::CalcLineIntersection(Vector3d a_Min, Vector3d a_Max, Vector3d a_Line1, Vector3d a_Line2, double & a_LineCoeff, eBlockFace & a_Face)\n{\n\tif (IsInside(a_Min, a_Max, a_Line1))\n\t{\n\t\t// The starting point is inside the bounding box.\n\t\ta_LineCoeff = 0;\n\t\ta_Face = BLOCK_FACE_NONE;  // No faces hit\n\t\treturn true;\n\t}\n\n\teBlockFace Face = BLOCK_FACE_NONE;\n\tdouble Coeff = Vector3d::NO_INTERSECTION;\n\n\t// Check each individual bbox face for intersection with the line, remember the one with the lowest coeff\n\tdouble c = a_Line1.LineCoeffToXYPlane(a_Line2, a_Min.z);\n\tif ((c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c))\n\t{\n\t\tFace = (a_Line1.z > a_Line2.z) ? BLOCK_FACE_ZP : BLOCK_FACE_ZM;\n\t\tCoeff = c;\n\t}\n\tc = a_Line1.LineCoeffToXYPlane(a_Line2, a_Max.z);\n\tif ((c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c))\n\t{\n\t\tFace = (a_Line1.z > a_Line2.z) ? BLOCK_FACE_ZP : BLOCK_FACE_ZM;\n\t\tCoeff = c;\n\t}\n\tc = a_Line1.LineCoeffToXZPlane(a_Line2, a_Min.y);\n\tif ((c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c))\n\t{\n\t\tFace = (a_Line1.y > a_Line2.y) ? BLOCK_FACE_YP : BLOCK_FACE_YM;\n\t\tCoeff = c;\n\t}\n\tc = a_Line1.LineCoeffToXZPlane(a_Line2, a_Max.y);\n\tif ((c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c))\n\t{\n\t\tFace = (a_Line1.y > a_Line2.y) ? BLOCK_FACE_YP : BLOCK_FACE_YM;\n\t\tCoeff = c;\n\t}\n\tc = a_Line1.LineCoeffToYZPlane(a_Line2, a_Min.x);\n\tif ((c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c))\n\t{\n\t\tFace = (a_Line1.x > a_Line2.x) ? BLOCK_FACE_XP : BLOCK_FACE_XM;\n\t\tCoeff = c;\n\t}\n\tc = a_Line1.LineCoeffToYZPlane(a_Line2, a_Max.x);\n\tif ((c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c))\n\t{\n\t\tFace = (a_Line1.x > a_Line2.x) ? BLOCK_FACE_XP : BLOCK_FACE_XM;\n\t\tCoeff = c;\n\t}\n\n\tif (Coeff >= Vector3d::NO_INTERSECTION)\n\t{\n\t\t// There has been no intersection\n\t\treturn false;\n\t}\n\n\ta_LineCoeff = Coeff;\n\ta_Face = Face;\n\treturn true;\n}\n\n\n\n\n\nbool cBoundingBox::Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection) const\n{\n\ta_Intersection.m_Min.x = std::max(m_Min.x, a_Other.m_Min.x);\n\ta_Intersection.m_Max.x = std::min(m_Max.x, a_Other.m_Max.x);\n\tif (a_Intersection.m_Min.x >= a_Intersection.m_Max.x)\n\t{\n\t\treturn false;\n\t}\n\ta_Intersection.m_Min.y = std::max(m_Min.y, a_Other.m_Min.y);\n\ta_Intersection.m_Max.y = std::min(m_Max.y, a_Other.m_Max.y);\n\tif (a_Intersection.m_Min.y >= a_Intersection.m_Max.y)\n\t{\n\t\treturn false;\n\t}\n\ta_Intersection.m_Min.z = std::max(m_Min.z, a_Other.m_Min.z);\n\ta_Intersection.m_Max.z = std::min(m_Max.z, a_Other.m_Max.z);\n\treturn (a_Intersection.m_Min.z < a_Intersection.m_Max.z);\n}\n\n\n\n\n"
  },
  {
    "path": "src/BoundingBox.h",
    "content": "\n// BoundingBox.h\n\n// Declares the cBoundingBox class representing an axis-aligned bounding box with floatingpoint coords\n\n\n\n\n#pragma once\n\n#include \"Defines.h\"\n\n\n\n\n\n// tolua_begin\n\n/** Represents two sets of coords, minimum and maximum for each direction.\nAll the coords within those limits (inclusive the edges) are considered \"inside\" the box.\nFor intersection purposes, though, if the intersection is \"sharp\" in any coord (i. e. zero volume),\nthe boxes are considered non-intersecting. */\nclass cBoundingBox\n{\npublic:\n\tcBoundingBox(double a_MinX, double a_MaxX, double a_MinY, double a_MaxY, double a_MinZ, double a_MaxZ);\n\tcBoundingBox(Vector3d a_Min, Vector3d a_Max);\n\tcBoundingBox(Vector3d a_Pos, double a_Radius, double a_Height);\n\t/** Constructor that allows to define a bounding box given a center point (a_Pos), a horizontal radius (a_Radius),\n\ta height starting from given center point (a_Height) and a vertical offset (a_VerticalOffset) to adjust the vertical starting point.\n\tFor example: cBoundingBox([0, 0, 0], 6, 6, -3) would create a bounding cube from (-3, -3, -3) to (3, 3, 3). */\n\tcBoundingBox(Vector3d a_Pos, double a_Radius, double a_Height, double a_VerticalOffset);\n\tcBoundingBox(Vector3d a_Pos, double a_CubeLength);\n\n\t#ifdef TOLUA_EXPOSITION  // tolua isn't aware of implicitly generated copy constructors\n\t\tcBoundingBox(const cBoundingBox & a_Orig);\n\t#endif\n\n\t/** Moves the entire boundingbox by the specified offset */\n\tvoid Move(double a_OffX, double a_OffY, double a_OffZ);\n\n\t/** Moves the entire boundingbox by the specified offset */\n\tvoid Move(Vector3d a_Off);\n\n\t/** Expands the bounding box by the specified amount in each direction (so the box becomes larger by 2 * Expand in each direction) */\n\tvoid Expand(double a_ExpandX, double a_ExpandY, double a_ExpandZ);\n\n\t/** Returns true if the two bounding boxes intersect */\n\tbool DoesIntersect(const cBoundingBox & a_Other);\n\n\t/** Returns the union of the two bounding boxes */\n\tcBoundingBox Union(const cBoundingBox & a_Other);\n\n\t/** Returns true if the point is inside the bounding box */\n\tbool IsInside(Vector3d a_Point);\n\n\t/** Returns true if the point is inside the bounding box */\n\tbool IsInside(double a_X, double a_Y, double a_Z);\n\n\t/** Returns true if a_Other is inside this bounding box */\n\tbool IsInside(cBoundingBox & a_Other);\n\n\t/** Returns true if a boundingbox specified by a_Min and a_Max is inside this bounding box */\n\tbool IsInside(Vector3d a_Min, Vector3d a_Max);\n\n\t/** Returns true if the specified point is inside the bounding box specified by its min / max corners */\n\tstatic bool IsInside(Vector3d a_Min, Vector3d a_Max, Vector3d a_Point);\n\n\t/** Returns true if the specified point is inside the bounding box specified by its min / max corners */\n\tstatic bool IsInside(Vector3d a_Min, Vector3d a_Max, double a_X, double a_Y, double a_Z);\n\n\t// tolua_end\n\n\t/** Returns true if this bounding box is intersected by the line specified by its two points\n\tAlso calculates the distance along the line in which the intersection occurs, and the face hit (BLOCK_FACE_ constants)\n\tOnly forward collisions (a_LineCoeff >= 0) are returned.\n\tExported to Lua manually, because ToLua++ would generate needless input params (a_LineCoeff, a_Face). */\n\tbool CalcLineIntersection(Vector3d a_LinePoint1, Vector3d a_LinePoint2, double & a_LineCoeff, eBlockFace & a_Face) const;\n\n\t/** Returns true if the specified bounding box is intersected by the line specified by its two points\n\tAlso calculates the distance along the line in which the intersection occurs, and the face hit (BLOCK_FACE_ constants)\n\tOnly forward collisions (a_LineCoeff >= 0) are returned.\n\tExported to Lua manually, because ToLua++ would generate needless input params (a_LineCoeff, a_Face). */\n\tstatic bool CalcLineIntersection(Vector3d a_Min, Vector3d a_Max, Vector3d a_LinePoint1, Vector3d a_LinePoint2, double & a_LineCoeff, eBlockFace & a_Face);\n\n\t/** Calculates the intersection of the two bounding boxes; returns true if nonempty.\n\tExported manually, because ToLua++ would generate needless input params (a_Intersection). */\n\tbool Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection) const;\n\n\t// tolua_begin\n\n\tdouble GetMinX(void) const { return m_Min.x; }\n\tdouble GetMinY(void) const { return m_Min.y; }\n\tdouble GetMinZ(void) const { return m_Min.z; }\n\n\tdouble GetMaxX(void) const { return m_Max.x; }\n\tdouble GetMaxY(void) const { return m_Max.y; }\n\tdouble GetMaxZ(void) const { return m_Max.z; }\n\n\tVector3d GetMin(void) const { return m_Min; }\n\tVector3d GetMax(void) const { return m_Max; }\n\n\t// tolua_end\n\nprotected:\n\tVector3d m_Min;\n\tVector3d m_Max;\n\n} ;  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/BrewingRecipes.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"BrewingRecipes.h\"\n\n#include <fstream>\n\n#define BREWING_RECIPE_FILE \"brewing.txt\"\n\n\n\n\n\ncBrewingRecipes::cBrewingRecipes()\n{\n\tReloadRecipes();\n}\n\n\n\n\n\nvoid cBrewingRecipes::ReloadRecipes(void)\n{\n\tClearRecipes();\n\tLOGD(\"Loading brewing recipes...\");\n\n\tstd::ifstream f(BREWING_RECIPE_FILE, std::ios::in);\n\tif (!f.good())\n\t{\n\t\tLOG(\"Could not open the brewing recipes file \\\"%s\\\". No brewing recipes are available.\", BREWING_RECIPE_FILE);\n\t\treturn;\n\t}\n\n\tunsigned int LineNum = 0;\n\tAString ParsingLine;\n\n\twhile (std::getline(f, ParsingLine))\n\t{\n\t\tLineNum++;\n\t\t// Remove comments from the line:\n\t\tsize_t FirstCommentSymbol = ParsingLine.find('#');\n\t\tif (FirstCommentSymbol != AString::npos)\n\t\t{\n\t\t\tParsingLine.erase(FirstCommentSymbol);\n\t\t}\n\n\t\tif (IsOnlyWhitespace(ParsingLine))\n\t\t{\n\t\t\t// Ignore empty and whitespace only lines\n\t\t\tcontinue;\n\t\t}\n\t\tAddRecipeFromLine(ParsingLine, LineNum);\n\t}  // while (getline(ParsingLine))\n\n\tLOG(\"Loaded %zu brewing recipes\", m_Recipes.size());\n}\n\n\n\n\n\nvoid cBrewingRecipes::AddRecipeFromLine(AString a_Line, unsigned int a_LineNum)\n{\n\ta_Line.erase(std::remove_if(a_Line.begin(), a_Line.end(), isspace), a_Line.end());\n\n\tauto Recipe = std::make_unique<cRecipe>();\n\n\tconst AStringVector & InputAndIngredient = StringSplit(a_Line, \"+\");\n\n\tif (InputAndIngredient.size() != 2)\n\t{\n\t\tLOGWARNING(\"brewing.txt: line %d: A line with '+' was expected\", a_LineNum);\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tconst AStringVector & IngredientAndOutput = StringSplit(InputAndIngredient[1], \"=\");\n\tif (IngredientAndOutput.size() != 2)\n\t{\n\t\tLOGWARNING(\"brewing.txt: line %d: A line with '=' was expected\", a_LineNum);\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tif (!ParseItem(IngredientAndOutput[0], Recipe->Ingredient))\n\t{\n\t\tLOGWARNING(\"brewing.txt: Parsing of the item didn't worked.\");\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tif (!StringToInteger<short>(InputAndIngredient[0], Recipe->Input.m_ItemDamage))\n\t{\n\t\tLOGWARNING(\"brewing.txt: line %d: Cannot parse the damage value for the input item\\\"%s\\\".\", a_LineNum, InputAndIngredient[0].c_str());\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tif (!StringToInteger<short>(IngredientAndOutput[1], Recipe->Output.m_ItemDamage))\n\t{\n\t\tLOGWARNING(\"brewing.txt: line %d: Cannot parse the damage value for the output item\\\"%s\\\".\", a_LineNum, IngredientAndOutput[1].c_str());\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tm_Recipes.push_back(std::move(Recipe));\n}\n\n\n\n\n\nbool cBrewingRecipes::ParseItem(const AString & a_String, cItem & a_Item)\n{\n\treturn StringToItem(a_String, a_Item);\n}\n\n\n\n\n\nvoid cBrewingRecipes::ClearRecipes(void)\n{\n\tm_Recipes.clear();\n}\n\n\n\n\n\nconst cBrewingRecipes::cRecipe * cBrewingRecipes::GetRecipeFrom(const cItem & a_Input, const cItem & a_Ingredient) const\n{\n\tfor (const auto & Recipe : m_Recipes)\n\t{\n\t\tif ((Recipe->Input.IsEqual(a_Input)) && (Recipe->Ingredient.IsEqual(a_Ingredient)))\n\t\t{\n\t\t\treturn Recipe.get();\n\t\t}\n\t}\n\n\t// Check for gunpowder\n\tif (a_Ingredient.m_ItemType == E_ITEM_GUNPOWDER)\n\t{\n\t\tif (a_Input.m_ItemDamage & 0x2000)\n\t\t{\n\t\t\t// Create new recipe and add it to list\n\t\t\tauto Recipe = std::make_unique<cRecipe>();\n\n\t\t\tRecipe->Input.m_ItemType = a_Input.m_ItemDamage;\n\t\t\tRecipe->Output.m_ItemDamage = a_Input.m_ItemDamage + 8192;\n\t\t\tRecipe->Ingredient.m_ItemType = E_ITEM_GUNPOWDER;\n\n\t\t\tauto RecipePtr = Recipe.get();\n\t\t\tm_Recipes.push_back(std::move(Recipe));\n\t\t\treturn RecipePtr;\n\t\t}\n\t\treturn nullptr;\n\t}\n\n\t// Check for splash potion\n\tif (a_Input.m_ItemDamage & 0x4000)\n\t{\n\t\t// Search for the drinkable potion, the ingredients are the same\n\t\tshort SplashItemDamage = a_Input.m_ItemDamage - 8192;\n\n\t\tauto FoundRecipe = std::find_if(m_Recipes.cbegin(), m_Recipes.cend(), [&](const std::unique_ptr<cRecipe>& a_Recipe)\n\t\t{\n\t\t\treturn (\n\t\t\t\t(a_Recipe->Input.m_ItemDamage == SplashItemDamage) &&\n\t\t\t\t(a_Recipe->Ingredient.IsEqual(a_Ingredient))\n\t\t\t);\n\t\t});\n\n\t\tif (FoundRecipe == m_Recipes.cend())\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\n\t\t// Create new recipe and add it to list\n\t\tauto Recipe = std::make_unique<cRecipe>();\n\n\t\tRecipe->Input.m_ItemDamage = a_Input.m_ItemDamage;\n\t\tRecipe->Output.m_ItemDamage = (*FoundRecipe)->Output.m_ItemDamage + 8192;\n\t\tRecipe->Ingredient.m_ItemType = (*FoundRecipe)->Ingredient.m_ItemType;\n\n\t\tauto RecipePtr = Recipe.get();\n\t\tm_Recipes.push_back(std::move(Recipe));\n\t\treturn RecipePtr;\n\t}\n\treturn nullptr;\n}\n\n\n\n\n\nbool cBrewingRecipes::IsIngredient(const cItem & a_Ingredient) const\n{\n\t// Check for gunpowder\n\tif (a_Ingredient.m_ItemType == E_ITEM_GUNPOWDER)\n\t{\n\t\treturn true;\n\t}\n\n\tfor (const auto & Recipe : m_Recipes)\n\t{\n\t\tif (Recipe->Ingredient.IsEqual(a_Ingredient))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cBrewingRecipes::IsBottle(const cItem & a_Item) const\n{\n\treturn (a_Item.m_ItemType == E_ITEM_POTION);\n}\n\n\n\n\n\nbool cBrewingRecipes::IsFuel(const cItem & a_Item) const\n{\n\treturn (a_Item.m_ItemType == E_ITEM_BLAZE_POWDER);\n}\n\n\n\n\n"
  },
  {
    "path": "src/BrewingRecipes.h",
    "content": "\n#pragma once\n\n\n\n\n\n#include \"Item.h\"\n\n\n\n\n\nclass cBrewingRecipes\n{\npublic:\n\tcBrewingRecipes(void);\n\n\tvoid ReloadRecipes(void);\n\n\tstruct cRecipe\n\t{\n\t\tcRecipe()\n\t\t{\n\t\t\t// These items always have the same type\n\t\t\tInput.m_ItemType = E_ITEM_POTION;\n\t\t\tOutput.m_ItemType = E_ITEM_POTION;\n\t\t}\n\n\t\tcItem Input;\n\t\tcItem Output;\n\t\tcItem Ingredient;\n\t};\n\n\t/** Returns a recipe for the specified input, nullptr if no recipe found */\n\tconst cRecipe * GetRecipeFrom(const cItem & a_Input, const cItem & a_Ingredient) const;\n\n\t/** Returns true if the item is a ingredient, false if not. */\n\tbool IsIngredient(const cItem & a_Ingredient) const;\n\n\t/** Returns true if the item is a bottle / potion, false if not. */\n\tbool IsBottle(const cItem & a_Item) const;\n\n\t/** Returns true if the item is the fuel, false if not. */\n\tbool IsFuel(const cItem & a_Item) const;\nprivate:\n\tusing cRecipes = std::vector<std::unique_ptr<cBrewingRecipes::cRecipe>>;\n\n\tvoid ClearRecipes(void);\n\n\t/** Parses the recipe contained in the line, adds it to m_pState's recipes.\n\tLogs a warning to the console on input error. */\n\tvoid AddRecipeFromLine(AString a_Line, unsigned int a_LineNum);\n\n\t/** Parses an item string, returns true if successful. */\n\tbool ParseItem(const AString & a_String, cItem & a_Item);\n\n\t/** The collection of parsed recipes.\n\tGetRecipeFrom may cache splash variants of recipes here but the observable behaviour is constant, so this should be mutable. */\n\tmutable cRecipes m_Recipes;\n};\n"
  },
  {
    "path": "src/Broadcaster.cpp",
    "content": "// Broadcaster.cpp\n\n// Implements the broadcasting functions for cWorld\n\n#include \"Globals.h\"\n#include \"World.h\"\n#include \"Chunk.h\"\n#include \"ClientHandle.h\"\n#include \"Entities/Entity.h\"\n#include \"Entities/Player.h\"\n#include \"BlockEntities/BlockEntity.h\"\n\n\n\n\n\nnamespace\n{\n\n\t/** Calls the function object a_Func for every active client in the world\n\t\\param a_World World the clients are in\n\t\\param a_Exclude Client for which a_Func should not be called\n\t\\param a_Func Function to be called with each non-excluded client */\n\ttemplate <typename Func>\n\tvoid ForClientsInWorld(cWorld & a_World, const cClientHandle * a_Exclude, Func a_Func)\n\t{\n\t\ta_World.ForEachPlayer([&](cPlayer & a_Player)\n\t\t\t{\n\t\t\t\tcClientHandle * Client = a_Player.GetClientHandle();\n\t\t\t\tif ((Client != a_Exclude) && (Client != nullptr) && Client->IsLoggedIn() && !Client->IsDestroyed())\n\t\t\t\t{\n\t\t\t\t\ta_Func(*Client);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t);\n\t}\n\n\n\t/** Calls the function object a_Func for every client who has the specified chunk\n\t\\param a_ChunkCoords Coords of the chunk to query for clients\n\t\\param a_World World that the chunk is in\n\t\\param a_Exclude Client for which a_Func should not be called\n\t\\param a_Func Function to be called with each non-excluded client */\n\ttemplate <typename Func>\n\tvoid ForClientsWithChunk(const cChunkCoords a_ChunkCoords, cWorld & a_World, const cClientHandle * a_Exclude, Func a_Func)\n\t{\n\t\ta_World.DoWithChunk(a_ChunkCoords.m_ChunkX, a_ChunkCoords.m_ChunkZ,\n\t\t\t[&](cChunk & a_Chunk)\n\t\t\t{\n\t\t\t\tfor (auto * Client : a_Chunk.GetAllClients())\n\t\t\t\t{\n\t\t\t\t\tif (Client != a_Exclude)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Func(*Client);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t);\n\t}\n\n\n\n\t/** Calls the function object a_Func for every client who has the chunk at the specified block position\n\t\\param a_WorldPos Coordinates of the block to query for clients\n\t\\param a_World World that the block is in\n\t\\param a_Exclude Client for which a_Func should not be called\n\t\\param a_Func Function to be called with each non-excluded client */\n\ttemplate <typename Func>\n\tvoid ForClientsWithChunkAtPos(const Vector3i a_WorldPos, cWorld & a_World, const cClientHandle * a_Exclude, Func a_Func)\n\t{\n\t\tForClientsWithChunk(cChunkDef::BlockToChunk(a_WorldPos), a_World, a_Exclude, std::move(a_Func));\n\t}\n\n\n\n\t/** Calls the function object a_Func for every client who has the specified entity\n\t\\param a_Entity Entity to query for clients\n\t\\param a_World World that the block is in\n\t\\param a_Exclude Client for which a_Func should not be called\n\t\\param a_Func Function to be called with each non-excluded client */\n\ttemplate <typename Func>\n\tvoid ForClientsWithEntity(const cEntity & a_Entity, cWorld & a_World, const cClientHandle * a_Exclude, Func a_Func)\n\t{\n\t\tcWorld::cLock Lock(a_World);  // Lock world before accessing a_Entity\n\t\tauto Chunk = a_Entity.GetParentChunk();\n\t\tif (Chunk != nullptr)\n\t\t{\n\t\t\tfor (auto * Client : Chunk->GetAllClients())\n\t\t\t{\n\t\t\t\tif (Client != a_Exclude)\n\t\t\t\t{\n\t\t\t\t\ta_Func(*Client);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse  // Some broadcasts happen before the entity's first tick sets its ParentChunk\n\t\t{\n\t\t\tForClientsWithChunk({ a_Entity.GetChunkX(), a_Entity.GetChunkZ() }, a_World, a_Exclude, std::move(a_Func));\n\t\t}\n\t}\n}  // namespace (anonymous)\n\n\n\n\n\nvoid cWorld::BroadcastAttachEntity(const cEntity & a_Entity, const cEntity & a_Vehicle)\n{\n\tForClientsWithEntity(a_Entity, *this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendAttachEntity(a_Entity, a_Vehicle);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastBlockAction(Vector3i a_BlockPos, Byte a_Byte1, Byte a_Byte2, BLOCKTYPE a_BlockType, const cClientHandle * a_Exclude)\n{\n\tForClientsWithChunkAtPos(a_BlockPos, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendBlockAction(a_BlockPos, static_cast<char>(a_Byte1), static_cast<char>(a_Byte2), a_BlockType);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastBlockBreakAnimation(UInt32 a_EntityID, Vector3i a_BlockPos, Int8 a_Stage, const cClientHandle * a_Exclude)\n{\n\tForClientsWithChunkAtPos(a_BlockPos, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendBlockBreakAnim(a_EntityID, a_BlockPos, a_Stage);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastBlockEntity(Vector3i a_BlockPos, const cClientHandle * a_Exclude)\n{\n\tDoWithChunkAt(a_BlockPos, [&](cChunk & a_Chunk)\n\t\t{\n\t\t\tcBlockEntity * Entity = a_Chunk.GetBlockEntity(a_BlockPos);\n\t\t\tif (Entity == nullptr)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor (auto * Client : a_Chunk.GetAllClients())\n\t\t\t{\n\t\t\t\tif (Client != a_Exclude)\n\t\t\t\t{\n\t\t\t\t\tEntity->SendTo(*Client);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastBossBarUpdateHealth(const cEntity & a_Entity, UInt32 a_UniqueID, float a_FractionFilled)\n{\n\tForClientsWithEntity(a_Entity, *this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendBossBarUpdateHealth(a_UniqueID, a_FractionFilled);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastChat(const AString & a_Message, const cClientHandle * a_Exclude, eMessageType a_ChatPrefix)\n{\n\tif ((a_ChatPrefix == mtDeath) && !ShouldBroadcastDeathMessages())\n\t{\n\t\treturn;\n\t}\n\n\tForClientsInWorld(*this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendChat(a_Message, a_ChatPrefix);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastChat(const cCompositeChat & a_Message, const cClientHandle * a_Exclude)\n{\n\tForClientsInWorld(*this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendChat(a_Message);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastCollectEntity(const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Collected, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendCollectEntity(a_Collected, a_Collector, a_Count);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendDestroyEntity(a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastDetachEntity(const cEntity & a_Entity, const cEntity & a_PreviousVehicle)\n{\n\tForClientsWithEntity(a_Entity, *this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendDetachEntity(a_Entity, a_PreviousVehicle);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastDisplayObjective(const AString & a_Objective, cScoreboard::eDisplaySlot a_Display)\n{\n\tForClientsInWorld(*this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendDisplayObjective(a_Objective, a_Display);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityEffect(const cEntity & a_Entity, int a_EffectID, int a_Amplifier, int a_Duration, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityEffect(a_Entity, a_EffectID, a_Amplifier, a_Duration);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityEquipment(const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityEquipment(a_Entity, a_SlotNum, a_Item);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityHeadLook(const cEntity & a_Entity, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityHeadLook(a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityLook(const cEntity & a_Entity, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityLook(a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityMetadata(const cEntity & a_Entity, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityMetadata(a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityPosition(const cEntity & a_Entity, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityPosition(a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityProperties(const cEntity & a_Entity)\n{\n\tForClientsWithEntity(a_Entity, *this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityProperties(a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityVelocity(const cEntity & a_Entity, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityVelocity(a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastEntityAnimation(const cEntity & a_Entity, EntityAnimation a_Animation, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendEntityAnimation(a_Entity, a_Animation);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastLeashEntity(const cEntity & a_Entity, const cEntity & a_EntityLeashedTo)\n{\n\tForClientsWithEntity(a_Entity, *this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendLeashEntity(a_Entity, a_EntityLeashedTo);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastParticleEffect(const AString & a_ParticleName, const Vector3f a_Src, const Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, const cClientHandle * a_Exclude)\n{\n\tForClientsWithChunkAtPos(a_Src, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendParticleEffect(a_ParticleName, a_Src, a_Offset, a_ParticleData, a_ParticleAmount);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastParticleEffect(const AString & a_ParticleName, const Vector3f a_Src, const Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data, const cClientHandle * a_Exclude)\n{\n\tForClientsWithChunkAtPos(a_Src, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendParticleEffect(a_ParticleName, a_Src, a_Offset, a_ParticleData, a_ParticleAmount, a_Data);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastPlayerListAddPlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude)\n{\n\tForClientsInWorld(*this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendPlayerListAddPlayer(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastPlayerListHeaderFooter(const cCompositeChat & a_Header, const cCompositeChat & a_Footer)\n{\n\tForClientsInWorld(*this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendPlayerListHeaderFooter(a_Header, a_Footer);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastPlayerListRemovePlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude)\n{\n\tForClientsInWorld(*this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendPlayerListRemovePlayer(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_CustomName, const cClientHandle * a_Exclude)\n{\n\tForClientsInWorld(*this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendPlayerListUpdateDisplayName(a_Player, a_CustomName);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastPlayerListUpdateGameMode(const cPlayer & a_Player, const cClientHandle * a_Exclude)\n{\n\tForClientsInWorld(*this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendPlayerListUpdateGameMode(a_Player);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastPlayerListUpdatePing()\n{\n\tForClientsInWorld(*this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendPlayerListUpdatePing();\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastRemoveEntityEffect(const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendRemoveEntityEffect(a_Entity, a_EffectID);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode)\n{\n\tForClientsInWorld(*this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendScoreboardObjective(a_Name, a_DisplayName, a_Mode);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastScoreUpdate(const AString & a_Objective, const AString & a_PlayerName, cObjective::Score a_Score, Byte a_Mode)\n{\n\tForClientsInWorld(*this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendScoreUpdate(a_Objective, a_PlayerName, a_Score, a_Mode);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastSoundEffect(const AString & a_SoundName, Vector3d a_Position, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude)\n{\n\tForClientsWithChunkAtPos(a_Position, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendSoundEffect(a_SoundName, a_Position, a_Volume, a_Pitch);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastSoundParticleEffect(const EffectID a_EffectID, Vector3i a_SrcPos, int a_Data, const cClientHandle * a_Exclude)\n{\n\tForClientsWithChunkAtPos(a_SrcPos, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendSoundParticleEffect(a_EffectID, a_SrcPos, a_Data);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastSpawnEntity(cEntity & a_Entity, const cClientHandle * a_Exclude)\n{\n\tForClientsWithEntity(a_Entity, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Entity.SpawnOn(a_Client);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastThunderbolt(Vector3i a_BlockPos, const cClientHandle * a_Exclude)\n{\n\tForClientsWithChunkAtPos(a_BlockPos, *this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendThunderbolt(a_BlockPos);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastTimeUpdate(const cClientHandle * a_Exclude)\n{\n\tForClientsInWorld(*this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendTimeUpdate(GetWorldAge(), GetWorldDate(), IsDaylightCycleEnabled());\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastUnleashEntity(const cEntity & a_Entity)\n{\n\tForClientsWithEntity(a_Entity, *this, nullptr, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendUnleashEntity(a_Entity);\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::BroadcastWeather(eWeather a_Weather, const cClientHandle * a_Exclude)\n{\n\tForClientsInWorld(*this, a_Exclude, [&](cClientHandle & a_Client)\n\t\t{\n\t\t\ta_Client.SendWeather(a_Weather);\n\t\t}\n\t);\n}\n"
  },
  {
    "path": "src/BuildInfo.h.cmake",
    "content": "\n#pragma once\n\n#cmakedefine BUILD_ID\n\n#ifdef BUILD_ID\n\n#undef BUILD_ID\n\n#define BUILD_SERIES_NAME \"@BUILD_SERIES_NAME@\"\n#define BUILD_ID          \"@BUILD_ID@\"\n#define BUILD_COMMIT_ID   \"@BUILD_COMMIT_ID@\"\n#define BUILD_DATETIME    \"@BUILD_DATETIME@\"\n#endif\n\n"
  },
  {
    "path": "src/ByteBuffer.cpp",
    "content": "\n// ByteBuffer.cpp\n\n// Implements the cByteBuffer class representing a ringbuffer of bytes\n\n#include \"Globals.h\"\n\n#include \"ByteBuffer.h\"\n#include \"Endianness.h\"\n#include \"UUID.h\"\n#include \"OSSupport/IsThread.h\"\n\n\n\n\n\n/** When defined, each access to a cByteBuffer object is checked whether it's done in the same thread.\ncByteBuffer assumes that it is not used by multiple threads at once, this macro adds a runtime check for that.\nUnfortunately it is very slow, so it is disabled even for regular DEBUG builds. */\n// #define DEBUG_SINGLE_THREAD_ACCESS\n\n\n/** Constants encoding some values to reduce the amount of magic numbers */\nnamespace VarInt\n{\n\tconstexpr unsigned char SEGMENT_BITS = 0x7F;\n\tconstexpr unsigned char CONTINUE_BIT = 0x80;\n\tconstexpr std::size_t MOVE_BITS  = 7;\n\tconstexpr std::size_t BYTE_COUNT = 5;        // A 32-bit integer can be encoded by at most 5 bytes\n\tconstexpr std::size_t BYTE_COUNT_LONG = 10;  // A 64-bit integer can be encoded by at most 10 bytes\n}\n\n\n\n\n\nnamespace Position\n{\n\t// If the bit indicated in the mask is 0, the the matching offset is applied.\n\tconstexpr int BIT_MASK_IS_NEGATIVE_XZ = 0x02000000;\n\tconstexpr int BIT_MASK_IS_NEGATIVE_Y  = 0x0800;\n\n\tconstexpr int NEGATIVE_OFFSET_XZ = 0x04000000;\n\tconstexpr int NEGATIVE_OFFSET_Y  = 0x01000;\n\n\t// Bit masks when reading the requested bits\n\tconstexpr UInt32 BIT_MASK_XZ = 0x03ffffff;  // 26 bits\n\tconstexpr UInt32 BIT_MASK_Y  = 0x0fff;      // 12 bits\n}\n\n\n\n\n\nnamespace XYZPosition\n{\n\tconstexpr std::size_t BIT_COUNT_X = 38;\n\tconstexpr std::size_t BIT_COUNT_Y = 26;\n}\n\n\n\n\n\nnamespace XZYPosition\n{\n\tconstexpr std::size_t BIT_COUNT_X = 38;\n\tconstexpr std::size_t BIT_COUNT_Z = 12;\n}\n\n\n\n// If a string sent over the protocol is larger than this, a warning is emitted to the console\n#define MAX_STRING_SIZE (512 KiB)\n\n#define NEEDBYTES(Num) if (!CanReadBytes(Num))  return false  // Check if at least Num bytes can be read from  the buffer, return false if not\n#define PUTBYTES(Num)  if (!CanWriteBytes(Num)) return false  // Check if at least Num bytes can be written to the buffer, return false if not\n\n\n\n\n\n#ifdef DEBUG_SINGLE_THREAD_ACCESS\n\n\t/** Simple RAII class that is used for checking that no two threads are using an object simultanously.\n\tIt requires the monitored object to provide the storage for a thread ID.\n\tIt uses that storage to check if the thread ID of consecutive calls is the same all the time. */\n\tclass cSingleThreadAccessChecker\n\t{\n\tpublic:\n\t\tcSingleThreadAccessChecker(std::thread::id * a_ThreadID) :\n\t\t\tm_ThreadID(a_ThreadID)\n\t\t{\n\t\t\tASSERT(\n\t\t\t\t(*a_ThreadID == std::this_thread::get_id()) ||  // Either the object is used by current thread...\n\t\t\t\t(*a_ThreadID == m_EmptyThreadID)                // ... or by no thread at all\n\t\t\t);\n\n\t\t\t// Mark as being used by this thread:\n\t\t\t*m_ThreadID = std::this_thread::get_id();\n\t\t}\n\n\t\t~cSingleThreadAccessChecker()\n\t\t{\n\t\t\t// Mark as not being used by any thread:\n\t\t\t*m_ThreadID = std::thread::id();\n\t\t}\n\n\tprotected:\n\t\t/** Points to the storage used for ID of the thread using the object. */\n\t\tstd::thread::id * m_ThreadID;\n\n\t\t/** The value of an unassigned thread ID, used to speed up checking. */\n\t\tstatic std::thread::id m_EmptyThreadID;\n\t};\n\n\tstd::thread::id cSingleThreadAccessChecker::m_EmptyThreadID;\n\n\t#define CHECK_THREAD cSingleThreadAccessChecker Checker(&m_ThreadID);\n\n#else\n\t#define CHECK_THREAD\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cByteBuffer:\n\ncByteBuffer::cByteBuffer(size_t a_BufferSize) :\n\tm_Buffer(new std::byte[a_BufferSize + 1]),\n\tm_BufferSize(a_BufferSize + 1)\n{\n\t// Allocating one byte more than the buffer size requested, so that we can distinguish between\n\t// completely-full and completely-empty states\n}\n\n\n\n\n\ncByteBuffer::~cByteBuffer()\n{\n\tCheckValid();\n}\n\n\n\n\n\nbool cByteBuffer::Write(const void * a_Bytes, size_t a_Count)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\n\t// Store the current free space for a check after writing:\n\tauto CurFreeSpace = GetFreeSpace();\n\t#ifndef NDEBUG\n\t\tauto CurReadableSpace = GetReadableSpace();\n\t\tsize_t WrittenBytes = 0;\n\t#endif\n\n\tif (CurFreeSpace < a_Count)\n\t{\n\t\treturn false;\n\t}\n\tASSERT(m_BufferSize >= m_WritePos);\n\tauto TillEnd = m_BufferSize - m_WritePos;\n\tauto Bytes = static_cast<const char *>(a_Bytes);\n\tif (TillEnd <= a_Count)\n\t{\n\t\t// Need to wrap around the ringbuffer end\n\t\tif (TillEnd > 0)\n\t\t{\n\t\t\tmemcpy(m_Buffer.get() + m_WritePos, Bytes, TillEnd);\n\t\t\tBytes += TillEnd;\n\t\t\ta_Count -= TillEnd;\n\t\t\t#ifndef NDEBUG\n\t\t\t\tWrittenBytes = TillEnd;\n\t\t\t#endif\n\t\t}\n\t\tm_WritePos = 0;\n\t}\n\n\t// We're guaranteed that we'll fit in a single write op\n\tif (a_Count > 0)\n\t{\n\t\tmemcpy(m_Buffer.get() + m_WritePos, Bytes, a_Count);\n\t\tm_WritePos += a_Count;\n\t\t#ifndef NDEBUG\n\t\t\tWrittenBytes += a_Count;\n\t\t#endif\n\t}\n\n\tASSERT(GetFreeSpace() == CurFreeSpace - WrittenBytes);\n\tASSERT(GetReadableSpace() == CurReadableSpace + WrittenBytes);\n\treturn true;\n}\n\n\n\n\n\nsize_t cByteBuffer::GetFreeSpace(void) const\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tif (m_WritePos >= m_DataStart)\n\t{\n\t\t// Wrap around the buffer end:\n\t\tASSERT(m_BufferSize >= m_WritePos);\n\t\tASSERT((m_BufferSize - m_WritePos + m_DataStart) >= 1);\n\t\treturn m_BufferSize - m_WritePos + m_DataStart - 1;  // -1 Offset since the last byte is used to indicate fullness or emptiness.\n\t}\n\t// Single free space partition:\n\tASSERT(m_BufferSize >= m_WritePos);\n\tASSERT(m_BufferSize - m_WritePos >= 1);\n\treturn m_DataStart - m_WritePos - 1;  // -1 Offset since the last byte is used to indicate fullness or emptiness.\n}\n\n\n\n\n\nsize_t cByteBuffer::GetUsedSpace(void) const\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tASSERT(m_BufferSize >= GetFreeSpace());\n\tASSERT((m_BufferSize - GetFreeSpace()) >= 1);\n\treturn m_BufferSize - GetFreeSpace() - 1;  // -1 Offset since the last byte is used to indicate fullness or emptiness.\n}\n\n\n\n\n\nsize_t cByteBuffer::GetReadableSpace(void) const\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tif (m_ReadPos > m_WritePos)\n\t{\n\t\t// Wrap around the buffer end:\n\t\tASSERT(m_BufferSize >= m_ReadPos);\n\t\treturn m_BufferSize - m_ReadPos + m_WritePos;\n\t}\n\t// Single readable space partition:\n\tASSERT(m_WritePos >= m_ReadPos);\n\treturn m_WritePos - m_ReadPos;\n}\n\n\n\n\n\nbool cByteBuffer::CanBEInt8Represent(int a_Value)\n{\n\treturn (std::numeric_limits<Int8>::min() <= a_Value) && (a_Value <= std::numeric_limits<Int8>::max());\n}\n\n\n\n\n\nbool cByteBuffer::CanBEInt16Represent(int a_Value)\n{\n\treturn (std::numeric_limits<Int16>::min() <= a_Value) && (a_Value <= std::numeric_limits<Int16>::max());\n}\n\n\n\n\n\nbool cByteBuffer::CanReadBytes(size_t a_Count) const\n{\n\tCHECK_THREAD\n\tCheckValid();\n\treturn (a_Count <= GetReadableSpace());\n}\n\n\n\n\n\nbool cByteBuffer::CanWriteBytes(size_t a_Count) const\n{\n\tCHECK_THREAD\n\tCheckValid();\n\treturn (a_Count <= GetFreeSpace());\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEInt8(Int8 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(1);\n\tReadBuf(&a_Value, 1);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEUInt8(UInt8 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(1);\n\tReadBuf(&a_Value, 1);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEInt16(Int16 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(2);\n\tBytes<Int16> bytes;\n\tReadBuf(bytes.data(), bytes.size());\n\ta_Value = NetworkToHost<Int16>(bytes);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEUInt16(UInt16 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(2);\n\tBytes<UInt16> bytes;\n\tReadBuf(bytes.data(), bytes.size());\n\ta_Value = NetworkToHost<UInt16>(bytes);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEInt32(Int32 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(4);\n\tBytes<Int32> bytes;\n\tReadBuf(bytes.data(), bytes.size());\n\ta_Value = NetworkToHost<Int32>(bytes);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEUInt32(UInt32 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(4);\n\tBytes<UInt32> bytes;\n\tReadBuf(bytes.data(), bytes.size());\n\ta_Value = NetworkToHost<UInt32>(bytes);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEInt64(Int64 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(8);\n\tBytes<Int64> bytes;\n\tReadBuf(bytes.data(), bytes.size());\n\ta_Value = NetworkToHost<Int64>(bytes);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEUInt64(UInt64 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(8);\n\tBytes<UInt64> bytes;\n\tReadBuf(bytes.data(), bytes.size());\n\ta_Value = NetworkToHost<UInt64>(bytes);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEFloat(float & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(4);\n\tBytes<float> bytes;\n\tReadBuf(bytes.data(), bytes.size());\n\ta_Value = NetworkToHost<float>(bytes);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBEDouble(double & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(8);\n\tBytes<double> bytes;\n\tReadBuf(bytes.data(), bytes.size());\n\ta_Value = NetworkToHost<double>(bytes);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadBool(bool & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(1);\n\tUInt8 Value = 0;\n\tReadBuf(&Value, 1);\n\ta_Value = (Value != 0);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadVarInt32(UInt32 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tUInt32 Value = 0;\n\tstd::size_t Shift = 0;\n\tunsigned char CurrentByte = 0;\n\tdo\n\t{\n\t\tNEEDBYTES(1);\n\t\tReadBuf(&CurrentByte, 1);\n\t\tValue |= ((static_cast<UInt32>(CurrentByte & VarInt::SEGMENT_BITS)) << Shift);\n\t\tShift += VarInt::MOVE_BITS;\n\t} while ((CurrentByte & VarInt::CONTINUE_BIT) != 0);\n\ta_Value = Value;\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadVarInt64(UInt64 & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tUInt64 Value = 0;\n\tint Shift = 0;\n\tunsigned char b = 0;\n\tdo\n\t{\n\t\tNEEDBYTES(1);\n\t\tReadBuf(&b, 1);\n\t\tValue = Value | ((static_cast<UInt64>(b & VarInt::SEGMENT_BITS)) << Shift);\n\t\tShift += 7;\n\t} while ((b & VarInt::CONTINUE_BIT) != 0);\n\ta_Value = Value;\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadVarUTF8String(AString & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tUInt32 Size = 0;\n\tif (!ReadVarInt(Size))\n\t{\n\t\treturn false;\n\t}\n\tif (Size > MAX_STRING_SIZE)\n\t{\n\t\tLOGWARNING(\"%s: String too large: %u (%u KiB)\", __FUNCTION__, Size, Size / 1024);\n\t}\n\tContiguousByteBuffer Buffer;\n\tif (!ReadSome(Buffer, static_cast<size_t>(Size)))\n\t{\n\t\treturn false;\n\t}\n\t// \"Convert\" a UTF-8 encoded string into system-native char.\n\t// This isn't great, better would be to use codecvt:\n\ta_Value = { reinterpret_cast<const char *>(Buffer.data()), Buffer.size() };\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadLEInt(int & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(4);\n\tReadBuf(&a_Value, 4);\n\n\t#ifdef IS_BIG_ENDIAN\n\t\t// Convert:\n\t\ta_Value = ((a_Value >> 24) & 0xff) | ((a_Value >> 16) & 0xff00) | ((a_Value >> 8) & 0xff0000) | (a_Value & 0xff000000);\n\t#endif\n\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadXYZPosition64(int & a_BlockX, int & a_BlockY, int & a_BlockZ)\n{\n\tCHECK_THREAD\n\tUInt64 Value;\n\tif (!ReadBEUInt64(Value))\n\t{\n\t\treturn false;\n\t}\n\n\t// Convert the 64 received bits into 3 coords:\n\tUInt32 BlockXRaw = (Value >> XYZPosition::BIT_COUNT_X) & Position::BIT_MASK_XZ;\n\tUInt32 BlockYRaw = (Value >> XYZPosition::BIT_COUNT_Y) & Position::BIT_MASK_Y;\n\tUInt32 BlockZRaw = (Value                              & Position::BIT_MASK_XZ);\n\n\t// If the highest bit in the number's range is set, convert the number into negative:\n\ta_BlockX = ((BlockXRaw & Position::BIT_MASK_IS_NEGATIVE_XZ) == 0) ? static_cast<int>(BlockXRaw) : -(Position::NEGATIVE_OFFSET_XZ - static_cast<int>(BlockXRaw));\n\ta_BlockY = ((BlockYRaw & Position::BIT_MASK_IS_NEGATIVE_Y)  == 0) ? static_cast<int>(BlockYRaw) : -(Position::NEGATIVE_OFFSET_Y  - static_cast<int>(BlockYRaw));\n\ta_BlockZ = ((BlockZRaw & Position::BIT_MASK_IS_NEGATIVE_XZ) == 0) ? static_cast<int>(BlockZRaw) : -(Position::NEGATIVE_OFFSET_XZ - static_cast<int>(BlockZRaw));\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadXYZPosition64(Vector3i & a_Position)\n{\n\treturn ReadXYZPosition64(a_Position.x, a_Position.y, a_Position.z);\n}\n\n\n\n\n\nbool cByteBuffer::ReadXZYPosition64(int & a_BlockX, int & a_BlockY, int & a_BlockZ)\n{\n\tCHECK_THREAD\n\tUInt64 Value;\n\tif (!ReadBEUInt64(Value))\n\t{\n\t\treturn false;\n\t}\n\n\t// Convert the 64 received bits into 3 coords:\n\tUInt32 BlockXRaw = (Value >> XZYPosition::BIT_COUNT_X) & Position::BIT_MASK_XZ;\n\tUInt32 BlockZRaw = (Value >> XZYPosition::BIT_COUNT_Z) & Position::BIT_MASK_XZ;\n\tUInt32 BlockYRaw = (Value                              & Position::BIT_MASK_Y);\n\n\t// If the highest bit in the number's range is set, convert the number into negative:\n\ta_BlockX = ((BlockXRaw & Position::BIT_MASK_IS_NEGATIVE_XZ) == 0) ? static_cast<int>(BlockXRaw) : (static_cast<int>(BlockXRaw) - Position::NEGATIVE_OFFSET_XZ);\n\ta_BlockY = ((BlockYRaw & Position::BIT_MASK_IS_NEGATIVE_Y)  == 0) ? static_cast<int>(BlockYRaw) : (static_cast<int>(BlockYRaw) - Position::NEGATIVE_OFFSET_Y);\n\ta_BlockZ = ((BlockZRaw & Position::BIT_MASK_IS_NEGATIVE_XZ) == 0) ? static_cast<int>(BlockZRaw) : (static_cast<int>(BlockZRaw) - Position::NEGATIVE_OFFSET_XZ);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadXZYPosition64(Vector3i & a_Position)\n{\n\treturn ReadXZYPosition64(a_Position.x, a_Position.y, a_Position.z);\n}\n\n\n\n\n\nbool cByteBuffer::ReadUUID(cUUID & a_Value)\n{\n\tCHECK_THREAD\n\n\tstd::array<Byte, 16> UUIDBuf;\n\tif (!ReadBuf(UUIDBuf.data(), UUIDBuf.size()))\n\t{\n\t\treturn false;\n\t}\n\n\ta_Value.FromRaw(UUIDBuf);\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEInt8(Int8 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(1);\n\treturn WriteBuf(&a_Value, 1);\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEInt8(const std::byte a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(1);\n\treturn WriteBuf(&a_Value, 1);\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEUInt8(UInt8 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(1);\n\treturn WriteBuf(&a_Value, 1);\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEInt16(Int16 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(2);\n\tauto Converted = HostToNetwork(a_Value);\n\treturn WriteBuf(Converted.data(), Converted.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEUInt16(UInt16 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(2);\n\tauto Converted = HostToNetwork(a_Value);\n\treturn WriteBuf(Converted.data(), Converted.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEInt32(Int32 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(4);\n\tauto Converted = HostToNetwork(a_Value);\n\treturn WriteBuf(Converted.data(), Converted.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEUInt32(UInt32 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(4);\n\tauto Converted = HostToNetwork(a_Value);\n\treturn WriteBuf(Converted.data(), Converted.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEInt64(Int64 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(8);\n\tauto Converted = HostToNetwork(a_Value);\n\treturn WriteBuf(Converted.data(), Converted.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEUInt64(UInt64 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(8);\n\tauto Converted = HostToNetwork(a_Value);\n\treturn WriteBuf(Converted.data(), Converted.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEFloat(float a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(4);\n\tauto Converted = HostToNetwork(a_Value);\n\treturn WriteBuf(Converted.data(), Converted.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteBEDouble(double a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(8);\n\tauto Converted = HostToNetwork(a_Value);\n\treturn WriteBuf(Converted.data(), Converted.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteBool(bool a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tUInt8 val = a_Value ? 1 : 0;\n\treturn Write(&val, 1);\n}\n\n\n\n\n\nbool cByteBuffer::WriteVarInt32(UInt32 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\n\t// A 32-bit integer can be encoded by at most 5 bytes:\n\tstd::array<unsigned char, VarInt::BYTE_COUNT> Buffer = {};\n\tstd::size_t Pos = 0;\n\tdo\n\t{\n\t\t// Write to buffer either the raw 7 lsb or the 7 lsb and a bit that indicates the number continues\n\t\tBuffer[Pos] = ((a_Value & VarInt::SEGMENT_BITS) | ((a_Value > VarInt::SEGMENT_BITS) ? VarInt::CONTINUE_BIT : 0x00));\n\t\ta_Value >>= VarInt::MOVE_BITS;\n\t\tPos++;\n\t} while (a_Value > 0);\n\n\treturn WriteBuf(Buffer.data(), Pos);\n}\n\n\n\n\n\nbool cByteBuffer::WriteVarInt64(UInt64 a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\n\t// A 64-bit integer can be encoded by at most 10 bytes:\n\tstd::array<unsigned char, VarInt::BYTE_COUNT_LONG> Buffer = {};\n\tstd::size_t Pos = 0;\n\tdo\n\t{\n\t\t// Write to buffer either the raw 7 lsb or the 7 lsb and a bit that indicates the number continues\n\t\tBuffer[Pos] = (a_Value & VarInt::SEGMENT_BITS) | ((a_Value > VarInt::SEGMENT_BITS) ? VarInt::CONTINUE_BIT : 0x00);\n\t\ta_Value = a_Value >> VarInt::MOVE_BITS;\n\t\tPos++;\n\t} while (a_Value > 0);\n\n\treturn WriteBuf(Buffer.data(), Pos);\n}\n\n\n\n\n\nbool cByteBuffer::WriteVarUTF8String(const std::string_view & a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(a_Value.size() + 1);  // This is a lower-bound on the bytes that will be actually written. Fail early.\n\tif (!WriteVarInt32(static_cast<UInt32>(a_Value.size())))\n\t{\n\t\treturn false;\n\t}\n\treturn WriteBuf(a_Value.data(), a_Value.size());\n}\n\n\n\n\n\nbool cByteBuffer::WriteXYZPosition64(Int32 a_BlockX, Int32 a_BlockY, Int32 a_BlockZ)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\treturn WriteBEUInt64(\n\t\t((static_cast<UInt64>(a_BlockX) & Position::BIT_MASK_XZ) << XYZPosition::BIT_COUNT_X) |\n\t\t((static_cast<UInt64>(a_BlockY) & Position::BIT_MASK_Y)  << XYZPosition::BIT_COUNT_Y) |\n\t\t(static_cast<UInt64>(a_BlockZ)  & Position::BIT_MASK_XZ)\n\t);\n}\n\n\n\n\n\nbool cByteBuffer::WriteXZYPosition64(Int32 a_BlockX, Int32 a_BlockY, Int32 a_BlockZ)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\treturn WriteBEUInt64(\n\t\t((static_cast<UInt64>(a_BlockX) & Position::BIT_MASK_XZ) << XZYPosition::BIT_COUNT_X) |\n\t\t((static_cast<UInt64>(a_BlockZ) & Position::BIT_MASK_XZ) << XZYPosition::BIT_COUNT_Z) |\n\t\t(static_cast<UInt64>(a_BlockY)  & Position::BIT_MASK_Y)\n\t);\n}\n\n\n\n\n\nbool cByteBuffer::ReadBuf(void * a_Buffer, size_t a_Count)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(a_Count);\n\tauto Dst = static_cast<char *>(a_Buffer);  // So that we can do byte math\n\tASSERT(m_BufferSize >= m_ReadPos);\n\tsize_t BytesToEndOfBuffer = m_BufferSize - m_ReadPos;\n\tif (BytesToEndOfBuffer <= a_Count)\n\t{\n\t\t// Reading across the ringbuffer end, read the first part and adjust parameters:\n\t\tif (BytesToEndOfBuffer > 0)\n\t\t{\n\t\t\tmemcpy(Dst, m_Buffer.get() + m_ReadPos, BytesToEndOfBuffer);\n\t\t\tDst += BytesToEndOfBuffer;\n\t\t\ta_Count -= BytesToEndOfBuffer;\n\t\t}\n\t\tm_ReadPos = 0;\n\t}\n\n\t// Read the rest of the bytes in a single read (guaranteed to fit):\n\tif (a_Count > 0)\n\t{\n\t\tmemcpy(Dst, m_Buffer.get() + m_ReadPos, a_Count);\n\t\tm_ReadPos += a_Count;\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::WriteBuf(const void * a_Buffer, size_t a_Count)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(a_Count);\n\tauto Src = static_cast<const char *>(a_Buffer);  // So that we can do byte math\n\tASSERT(m_BufferSize >= m_ReadPos);\n\tsize_t BytesToEndOfBuffer = m_BufferSize - m_WritePos;\n\tif (BytesToEndOfBuffer <= a_Count)\n\t{\n\t\t// Reading across the ringbuffer end, read the first part and adjust parameters:\n\t\tmemcpy(m_Buffer.get() + m_WritePos, Src, BytesToEndOfBuffer);\n\t\tSrc += BytesToEndOfBuffer;\n\t\ta_Count -= BytesToEndOfBuffer;\n\t\tm_WritePos = 0;\n\t}\n\n\t// Read the rest of the bytes in a single read (guaranteed to fit):\n\tif (a_Count > 0)\n\t{\n\t\tmemcpy(m_Buffer.get() + m_WritePos, Src, a_Count);\n\t\tm_WritePos += a_Count;\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::WriteBuf(size_t a_Count, unsigned char a_Value)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tPUTBYTES(a_Count);\n\tASSERT(m_BufferSize >= m_ReadPos);\n\tsize_t BytesToEndOfBuffer = m_BufferSize - m_WritePos;\n\tif (BytesToEndOfBuffer <= a_Count)\n\t{\n\t\t// Reading across the ringbuffer end, read the first part and adjust parameters:\n\t\tmemset(m_Buffer.get() + m_WritePos, a_Value, BytesToEndOfBuffer);\n\t\ta_Count -= BytesToEndOfBuffer;\n\t\tm_WritePos = 0;\n\t}\n\n\t// Read the rest of the bytes in a single read (guaranteed to fit):\n\tif (a_Count > 0)\n\t{\n\t\tmemset(m_Buffer.get() + m_WritePos, a_Value, a_Count);\n\t\tm_WritePos += a_Count;\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::ReadSome(ContiguousByteBuffer & a_String, size_t a_Count)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tNEEDBYTES(a_Count);\n\ta_String.clear();\n\ta_String.reserve(a_Count);\n\tASSERT(m_BufferSize >= m_ReadPos);\n\tsize_t BytesToEndOfBuffer = m_BufferSize - m_ReadPos;\n\tif (BytesToEndOfBuffer <= a_Count)\n\t{\n\t\t// Reading across the ringbuffer end, read the first part and adjust parameters:\n\t\tif (BytesToEndOfBuffer > 0)\n\t\t{\n\t\t\ta_String.assign(m_Buffer.get() + m_ReadPos, BytesToEndOfBuffer);\n\t\t\tASSERT(a_Count >= BytesToEndOfBuffer);\n\t\t\ta_Count -= BytesToEndOfBuffer;\n\t\t}\n\t\tm_ReadPos = 0;\n\t}\n\n\t// Read the rest of the bytes in a single read (guaranteed to fit):\n\tif (a_Count > 0)\n\t{\n\t\ta_String.append(m_Buffer.get() + m_ReadPos, a_Count);\n\t\tm_ReadPos += a_Count;\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cByteBuffer::SkipRead(size_t a_Count)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tif (!CanReadBytes(a_Count))\n\t{\n\t\treturn false;\n\t}\n\tAdvanceReadPos(a_Count);\n\treturn true;\n}\n\n\n\n\n\nvoid cByteBuffer::ReadAll(ContiguousByteBuffer & a_Data)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tReadSome(a_Data, GetReadableSpace());\n}\n\n\n\n\n\nbool cByteBuffer::ReadToByteBuffer(cByteBuffer & a_Dst, size_t a_NumBytes)\n{\n\tCHECK_THREAD\n\tif (!a_Dst.CanWriteBytes(a_NumBytes) || !CanReadBytes(a_NumBytes))\n\t{\n\t\t// There's not enough source bytes or space in the dest BB\n\t\treturn false;\n\t}\n\tchar buf[1024];\n\t// > 0 without generating warnings about unsigned comparisons where size_t is unsigned\n\twhile (a_NumBytes != 0)\n\t{\n\t\tsize_t num = (a_NumBytes > sizeof(buf)) ? sizeof(buf) : a_NumBytes;\n\t\tVERIFY(ReadBuf(buf, num));\n\t\tVERIFY(a_Dst.Write(buf, num));\n\t\tASSERT(a_NumBytes >= num);\n\t\ta_NumBytes -= num;\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cByteBuffer::CommitRead(void)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tm_DataStart = m_ReadPos;\n}\n\n\n\n\n\nvoid cByteBuffer::ResetRead(void)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tm_ReadPos = m_DataStart;\n}\n\n\n\n\n\nvoid cByteBuffer::ReadAgain(ContiguousByteBuffer & a_Out) const\n{\n\t// Return the data between m_DataStart and m_ReadPos (the data that has been read but not committed)\n\t// Used by ProtoProxy to repeat communication twice, once for parsing and the other time for the remote party\n\tCHECK_THREAD\n\tCheckValid();\n\tsize_t DataStart = m_DataStart;\n\tif (m_ReadPos < m_DataStart)\n\t{\n\t\t// Across the ringbuffer end, read the first part and adjust next part's start:\n\t\tASSERT(m_BufferSize >= m_DataStart);\n\t\ta_Out.append(m_Buffer.get() + m_DataStart, m_BufferSize - m_DataStart);\n\t\tDataStart = 0;\n\t}\n\tASSERT(m_ReadPos >= DataStart);\n\ta_Out.append(m_Buffer.get() + DataStart, m_ReadPos - DataStart);\n}\n\n\n\n\n\nvoid cByteBuffer::AdvanceReadPos(size_t a_Count)\n{\n\tCHECK_THREAD\n\tCheckValid();\n\tm_ReadPos += a_Count;\n\tif (m_ReadPos >= m_BufferSize)\n\t{\n\t\tm_ReadPos -= m_BufferSize;\n\t}\n}\n\n\n\n\n\nvoid cByteBuffer::CheckValid(void) const\n{\n\tASSERT(m_ReadPos < m_BufferSize);\n\tASSERT(m_WritePos < m_BufferSize);\n}\n\n\n\n\n\nsize_t cByteBuffer::GetVarIntSize(UInt32 a_Value)\n{\n\tsize_t Count = 0;\n\n\tdo\n\t{\n\t\t// If the value cannot be expressed in 7 bits, it needs to take up another byte\n\t\tCount++;\n\t\ta_Value >>= VarInt::MOVE_BITS;\n\t} while (a_Value != 0);\n\n\treturn Count;\n}\n"
  },
  {
    "path": "src/ByteBuffer.h",
    "content": "\n// ByteStream.h\n\n// Interfaces to the cByteBuffer class representing a ringbuffer of bytes\n\n\n\n\n\n#pragma once\n\n\n\n\n\n// fwd:\nclass cUUID;\n\n\n/** An object that can store incoming bytes and lets its clients read the bytes sequentially\nThe bytes are stored in a ringbuffer of constant size; if more than that size\nis requested, the write operation fails.\nThe bytes stored can be retrieved using various ReadXXX functions; these assume that the needed\nnumber of bytes are present in the buffer (ASSERT; for performance reasons).\nThe reading doesn't actually remove the bytes, it only moves the internal read ptr.\nTo remove the bytes, call CommitRead().\nTo re-start reading from the beginning, call ResetRead().\nThis class doesn't implement thread safety, the clients of this class need to provide\ntheir own synchronization.\n*/\nclass cByteBuffer\n{\npublic:\n\n\texplicit cByteBuffer(size_t a_BufferSize);\n\t~cByteBuffer();\n\n\t/** cByteBuffer should not be copied or moved. Use ReadToByteBuffer instead. */\n\tcByteBuffer(const cByteBuffer & a_ByteBuffer) = delete;\n\tcByteBuffer(cByteBuffer && a_ByteBuffer) = delete;\n\n\t/** Writes the bytes specified to the ringbuffer. Returns true if successful, false if not */\n\tbool Write(const void * a_Bytes, size_t a_Count);\n\n\t/** Returns the number of bytes that can be successfully written to the ringbuffer */\n\tsize_t GetFreeSpace(void) const;\n\n\t/** Returns the number of bytes that are currently in the ringbuffer. Note GetReadableBytes() */\n\tsize_t GetUsedSpace(void) const;\n\n\t/** Returns the number of bytes that are currently available for reading (may be less than UsedSpace due to some data having been read already) */\n\tsize_t GetReadableSpace(void) const;\n\n\t/** Returns the current data start index. For debugging purposes. */\n\tsize_t GetDataStart(void) const { return m_DataStart; }\n\n\t/** Returns if the given value can fit in a protocol big-endian 8 bit integer. */\n\tstatic bool CanBEInt8Represent(int a_Value);\n\n\t/** Returns if the given value can fit in a protocol big-endian 16 bit integer. */\n\tstatic bool CanBEInt16Represent(int a_Value);\n\n\t/** Returns true if the specified amount of bytes are available for reading */\n\tbool CanReadBytes(size_t a_Count) const;\n\n\t/** Returns true if the specified amount of bytes are available for writing */\n\tbool CanWriteBytes(size_t a_Count) const;\n\n\t// Read the specified datatype and advance the read pointer; return true if successfully read:\n\tbool ReadBEInt8         (Int8 & a_Value);\n\tbool ReadBEInt16        (Int16 & a_Value);\n\tbool ReadBEInt32        (Int32 & a_Value);\n\tbool ReadBEInt64        (Int64 & a_Value);\n\tbool ReadBEUInt8        (UInt8 & a_Value);\n\tbool ReadBEUInt16       (UInt16 & a_Value);\n\tbool ReadBEUInt32       (UInt32 & a_Value);\n\tbool ReadBEUInt64       (UInt64 & a_Value);\n\tbool ReadBEFloat        (float & a_Value);\n\tbool ReadBEDouble       (double & a_Value);\n\tbool ReadBool           (bool & a_Value);\n\tbool ReadVarInt32       (UInt32 & a_Value);\n\tbool ReadVarInt64       (UInt64 & a_Value);\n\tbool ReadVarUTF8String  (AString & a_Value);  // string length as VarInt, then string as UTF-8\n\tbool ReadLEInt          (int & a_Value);\n\tbool ReadXYZPosition64  (int & a_BlockX, int & a_BlockY, int & a_BlockZ);\n\tbool ReadXYZPosition64  (Vector3i & a_Position);\n\tbool ReadXZYPosition64  (int & a_BlockX, int & a_BlockY, int & a_BlockZ);\n\tbool ReadXZYPosition64  (Vector3i & a_Position);\n\tbool ReadUUID           (cUUID & a_Value);\n\n\t/** Reads VarInt, assigns it to anything that can be assigned from an UInt64 (unsigned short, char, Byte, double, ...) */\n\ttemplate <typename T> bool ReadVarInt(T & a_Value)\n\t{\n\t\tUInt64 v;\n\t\tbool res = ReadVarInt64(v);\n\t\tif (res)\n\t\t{\n\t\t\ta_Value = static_cast<T>(v);\n\t\t}\n\t\treturn res;\n\t}\n\n\t// Write the specified datatype; return true if successfully written\n\tbool WriteBEInt8         (Int8   a_Value);\n\tbool WriteBEInt8         (std::byte a_Value);\n\tbool WriteBEInt16        (Int16  a_Value);\n\tbool WriteBEInt32        (Int32  a_Value);\n\tbool WriteBEInt64        (Int64  a_Value);\n\tbool WriteBEUInt8        (UInt8  a_Value);\n\tbool WriteBEUInt16       (UInt16 a_Value);\n\tbool WriteBEUInt32       (UInt32 a_Value);\n\tbool WriteBEUInt64       (UInt64 a_Value);\n\tbool WriteBEFloat        (float  a_Value);\n\tbool WriteBEDouble       (double a_Value);\n\tbool WriteBool           (bool   a_Value);\n\tbool WriteVarInt32       (UInt32 a_Value);\n\tbool WriteVarInt64       (UInt64 a_Value);\n\tbool WriteVarUTF8String  (const std::string_view & a_Value);  // string length as VarInt, then string as UTF-8\n\tbool WriteXYZPosition64  (Int32 a_BlockX, Int32 a_BlockY, Int32 a_BlockZ);\n\tbool WriteXZYPosition64  (Int32 a_BlockX, Int32 a_BlockY, Int32 a_BlockZ);\n\n\t/** Reads a_Count bytes into a_Buffer; returns true if successful */\n\tbool ReadBuf(void * a_Buffer, size_t a_Count);\n\n\t/** Writes a_Count bytes into a_Buffer; returns true if successful */\n\tbool WriteBuf(const void * a_Buffer, size_t a_Count);\n\n\t/** Writes a_Count bytes into a_Buffer; returns true if successful */\n\tbool WriteBuf(size_t a_Count, unsigned char a_Value);\n\n\t/** Reads a_Count bytes into a_String; returns true if successful */\n\tbool ReadSome(ContiguousByteBuffer & a_String, size_t a_Count);\n\n\t/** Skips reading by a_Count bytes; returns false if not enough bytes in the ringbuffer */\n\tbool SkipRead(size_t a_Count);\n\n\t/** Reads all available data into a_Data */\n\tvoid ReadAll(ContiguousByteBuffer & a_Data);\n\n\t/** Reads the specified number of bytes and writes it into the destination bytebuffer. Returns true on success. */\n\tbool ReadToByteBuffer(cByteBuffer & a_Dst, size_t a_NumBytes);\n\n\t/** Removes the bytes that have been read from the ringbuffer */\n\tvoid CommitRead(void);\n\n\t/** Restarts next reading operation at the start of the ringbuffer */\n\tvoid ResetRead(void);\n\n\t/** Re-reads the data that has been read since the last commit to the current readpos. Used by ProtoProxy to duplicate communication */\n\tvoid ReadAgain(ContiguousByteBuffer & a_Out) const;\n\n\t/** Checks if the internal state is valid (read and write positions in the correct bounds) using ASSERTs */\n\tvoid CheckValid(void) const;\n\n\t/** Gets the number of bytes that are needed to represent the given VarInt */\n\tstatic size_t GetVarIntSize(UInt32 a_Value);\n\nprotected:\n\n\tstd::unique_ptr<std::byte[]> m_Buffer;\n\tsize_t m_BufferSize;  // Total size of the ringbuffer\n\n\tsize_t m_DataStart = 0;  // Where the data starts in the ringbuffer\n\tsize_t m_WritePos = 0;   // Where the data ends in the ringbuffer\n\tsize_t m_ReadPos = 0;    // Where the next read will start in the ringbuffer\n\n\t#ifndef NDEBUG\n\t\t/** The ID of the thread currently accessing the object.\n\t\tUsed for checking that only one thread accesses the object at a time, via cSingleThreadAccessChecker. */\n\t\tmutable std::thread::id m_ThreadID;\n\t#endif\n\n\t/** Advances the m_ReadPos by a_Count bytes */\n\tvoid AdvanceReadPos(size_t a_Count);\n} ;\n"
  },
  {
    "path": "src/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tResources/Cuberite.rc\n\n\tBiomeDef.cpp\n\tBlockArea.cpp\n\tBlockInfo.cpp\n\tBlockType.cpp\n\tBrewingRecipes.cpp\n\tBroadcaster.cpp\n\tBoundingBox.cpp\n\tByteBuffer.cpp\n\tChatColor.cpp\n\tChunk.cpp\n\tChunkData.cpp\n\tChunkGeneratorThread.cpp\n\tChunkMap.cpp\n\tChunkSender.cpp\n\tChunkStay.cpp\n\tCircularBufferCompressor.cpp\n\tClientHandle.cpp\n\tColor.cpp\n\tCommandOutput.cpp\n\tCompositeChat.cpp\n\tCraftingRecipes.cpp\n\tCuboid.cpp\n\tDeadlockDetect.cpp\n\tDefines.cpp\n\tEnchantments.cpp\n\tFastRandom.cpp\n\tFurnaceRecipe.cpp\n\tGlobals.cpp\n\tIniFile.cpp\n\tInventory.cpp\n\tItem.cpp\n\tItemGrid.cpp\n\tJsonUtils.cpp\n\tLightingThread.cpp\n\tLineBlockTracer.cpp\n\tLinearInterpolation.cpp\n\tLoggerListeners.cpp\n\tLogger.cpp\n\tMap.cpp\n\tMapManager.cpp\n\tMemorySettingsRepository.cpp\n\tMobCensus.cpp\n\tMobFamilyCollecter.cpp\n\tMobProximityCounter.cpp\n\tMobSpawner.cpp\n\tMonsterConfig.cpp\n\tNetherPortalScanner.cpp\n\tOverridesSettingsRepository.cpp\n\tProbabDistrib.cpp\n\tRankManager.cpp\n\tRCONServer.cpp\n\tRoot.cpp\n\tScoreboard.cpp\n\tServer.cpp\n\tSetChunkData.cpp\n\tSpawnPrepare.cpp\n\tStatisticsManager.cpp\n\tStringCompression.cpp\n\tStringUtils.cpp\n\tUUID.cpp\n\tVoronoiMap.cpp\n\tWebAdmin.cpp\n\tWorld.cpp\n\tmain.cpp\n\n\tBiomeDef.h\n\tBlockArea.h\n\tBlockInServerPluginInterface.h\n\tBlockInfo.h\n\tBlockState.h\n\tBlockTracer.h\n\tBlockType.h\n\tBrewingRecipes.h\n\tBoundingBox.h\n\tBuildInfo.h.cmake\n\tByteBuffer.h\n\tChatColor.h\n\tChunk.h\n\tChunkData.h\n\tChunkDataCallback.h\n\tChunkDef.h\n\tChunkGeneratorThread.h\n\tChunkMap.h\n\tChunkSender.h\n\tChunkStay.h\n\tCircularBufferCompressor.h\n\tClientHandle.h\n\tColor.h\n\tCommandOutput.h\n\tCompositeChat.h\n\tCraftingRecipes.h\n\tCuboid.h\n\tDeadlockDetect.h\n\tDefines.h\n\tEffectID.h\n\tEnchantments.h\n\tEndianness.h\n\tFastRandom.h\n\tForEachChunkProvider.h\n\tFurnaceRecipe.h\n\tFunctionRef.h\n\tGlobals.h\n\tIniFile.h\n\tInventory.h\n\tItem.h\n\tItemGrid.h\n\tLazyArray.h\n\tJsonUtils.h\n\tLightingThread.h\n\tLineBlockTracer.h\n\tLinearInterpolation.h\n\tLinearUpscale.h\n\tLogger.h\n\tLoggerListeners.h\n\tLoggerSimple.h\n\tMap.h\n\tMapManager.h\n\tMatrix4.h\n\tMemorySettingsRepository.h\n\tMobCensus.h\n\tMobFamilyCollecter.h\n\tMobProximityCounter.h\n\tMobSpawner.h\n\tMonsterConfig.h\n\tNetherPortalScanner.h\n\tOpaqueWorld.h\n\tOverridesSettingsRepository.h\n\tProbabDistrib.h\n\tRankManager.h\n\tRCONServer.h\n\tRoot.h\n\tScoreboard.h\n\tServer.h\n\tSetChunkData.h\n\tSettingsRepositoryInterface.h\n\tSpawnPrepare.h\n\tStatisticsManager.h\n\tStringCompression.h\n\tStringUtils.h\n\tUUID.h\n\tVector3.h\n\tVoronoiMap.h\n\tWebAdmin.h\n\tWorld.h\n\tXMLParser.h\n\tmain.h\n)\n\nset(FOLDERS\n\tBindings BlockEntities Blocks Entities\n\tGenerating HTTP Items mbedTLS++ Mobs Noise\n\tOSSupport Physics Protocol Registries Simulator\n\tSimulator/IncrementalRedstoneSimulator UI WorldStorage\n)\n\n# Add all child source directories:\nforeach(folder ${FOLDERS})\n\tadd_subdirectory(${folder})\nendforeach(folder)\n\nfile(WRITE \"${CMAKE_BINARY_DIR}/include/Globals.h\"\n\t\"/* This file allows Globals.h to be included with an absolute path */\\n#include \\\"${PROJECT_SOURCE_DIR}/src/Globals.h\\\"\\n\")\n\nconfigure_file(\"BuildInfo.h.cmake\" \"${CMAKE_BINARY_DIR}/include/BuildInfo.h\")\ntarget_include_directories(${CMAKE_PROJECT_NAME} PRIVATE \"${CMAKE_BINARY_DIR}/include/\" \".\")\n\n# Generate AllFiles.lst for CheckBasicStyle.lua\nget_target_property(ALL_FILES ${CMAKE_PROJECT_NAME} SOURCES)\nforeach(FILE ${ALL_FILES})\n\t# target_sources converts to absolute but CheckBasicStyle expects relative\n\tfile(RELATIVE_PATH RELATIVE \"${CMAKE_CURRENT_SOURCE_DIR}\" ${FILE})\n\n\t# Convert CMake list into newline-delimited string\n\tset(ALL_FILES_AS_LINES \"${ALL_FILES_AS_LINES}${RELATIVE}\\n\")\nendforeach()\nfile(WRITE AllFiles.lst \"${ALL_FILES_AS_LINES}\")\n\n# Output the executable into the $/Server folder, so that it has access to external resources:\nSET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES\n\tRUNTIME_OUTPUT_DIRECTORY                ${CMAKE_BINARY_DIR}/Server\n\tRUNTIME_OUTPUT_DIRECTORY_DEBUG          ${CMAKE_BINARY_DIR}/Server\n\tRUNTIME_OUTPUT_DIRECTORY_RELEASE        ${CMAKE_BINARY_DIR}/Server\n\tRUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/Server\n\tRUNTIME_OUTPUT_DIRECTORY_MINSIZEREL     ${CMAKE_BINARY_DIR}/Server\n\tRUNTIME_OUTPUT_DIRECTORY_DEBUGPROFILE   ${CMAKE_BINARY_DIR}/Server\n\tRUNTIME_OUTPUT_DIRECTORY_RELEASEPROFILE ${CMAKE_BINARY_DIR}/Server\n)\n\n\n\n# Enable \"-rdynamic\" on Linux, so that external Lua modules can import Lua API symbols from the main executable:\n# ( https://stackoverflow.com/questions/24015025/resolving-symbols-in-shared-object-to-executable )\nif (NOT WIN32)\n\ttarget_link_options(${CMAKE_PROJECT_NAME} PRIVATE \"-rdynamic\")\nendif()\n\n\nMACRO(TO_NATIVE_PATH PATH OUT)\n\tFILE(TO_NATIVE_PATH \"${PATH}\" \"${OUT}\")\n\tIF(MINGW)\n\t\tSTRING(REPLACE \"/\" \"\\\\\" \"${OUT}\" \"${${OUT}}\")\n\tENDIF(MINGW)\nENDMACRO(TO_NATIVE_PATH)\n\n# Create a symbolic link from ${orig} to ${link}\n# If the orig and link point to the same thing, does nothing (-> in-source build)\n# If ${link} already exists, does nothing.\nfunction(make_symlink orig link)\n\t# If both are the same, or link already exists, bail out:\n\tif (\"${orig}\" STREQUAL \"${link}\")\n\t\treturn()\n\tendif()\n\tif (EXISTS ${link})\n\t\treturn()\n\tendif()\n\n\t# Create the symlink (platform-dependent):\n\tmessage(STATUS \"Creating symlink, orig = ${orig}; link = ${link}\")\n\tif (CMAKE_HOST_UNIX)\n\t\tset(command ln -s ${orig} ${link})\n\telse()\n\t\tTO_NATIVE_PATH(\"${orig}\" orig)\n\t\tTO_NATIVE_PATH(\"${link}\" link)\n\t\tif (IS_DIRECTORY ${orig})\n\t\t\tset(command cmd.exe /c mklink /j ${link} ${orig})\n\t\telse()\n\t\t\tset(command cmd.exe /c mklink /h ${link} ${orig})\n\t\tendif()\n\tendif()\n\n\texecute_process(\n\t\tCOMMAND ${command}\n\t\tRESULT_VARIABLE result\n\t\tERROR_VARIABLE stderr\n\t\tOUTPUT_VARIABLE stdout\n\t)\n\n\tif (NOT ${result} EQUAL 0)\n\t\tmessage(FATAL_ERROR \"Could not create symbolic link for: ${link} --> ${orig}: ${stderr} ${stdout}\")\n\tendif()\nendfunction(make_symlink)\n\n\n\n\n\n# Populate the output folder with symlinks to the Server folder's internals:\nset(symlinks\n\tInstall\n\tPlugins\n\tPrefabs\n\tProtocol\n\twebadmin\n\tbrewing.txt\n\tcrafting.txt\n\tfavicon.png\n\tfurnace.txt\n\titems.ini\n\tmonsters.ini\n\tREADME.txt\n)\nmessage(STATUS \"Creating output folder and symlinks...\")\nfile(MAKE_DIRECTORY \"${CMAKE_BINARY_DIR}/Server\")\nforeach (symlink ${symlinks})\n\tmake_symlink(\"${CMAKE_CURRENT_SOURCE_DIR}/../Server/${symlink}\" \"${CMAKE_BINARY_DIR}/Server/${symlink}\")\nendforeach(symlink)\nmake_symlink(\"${CMAKE_CURRENT_SOURCE_DIR}/../BACKERS\"                           \"${CMAKE_BINARY_DIR}/Server/BACKERS\")\nmake_symlink(\"${CMAKE_CURRENT_SOURCE_DIR}/../CONTRIBUTORS\"                      \"${CMAKE_BINARY_DIR}/Server/CONTRIBUTORS\")\nmake_symlink(\"${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE\"                           \"${CMAKE_BINARY_DIR}/Server/LICENSE\")\nmake_symlink(\"${CMAKE_CURRENT_SOURCE_DIR}/../Server/Install/ThirdPartyLicenses\" \"${CMAKE_BINARY_DIR}/Server/ThirdPartyLicenses\")\n\n# Create a folder for Bindings' documentation:\nFILE(MAKE_DIRECTORY \"Bindings/docs\")\nmake_symlink(\"${CMAKE_CURRENT_SOURCE_DIR}/Bindings/docs\" \"${CMAKE_BINARY_DIR}/Server/BindingsDocs\")\n"
  },
  {
    "path": "src/ChatColor.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ChatColor.h\"\n\nconst char * cChatColor::Color         = \"\\xc2\\xa7\";  // The paragraph / section symbol in UTF-8\nconst char * cChatColor::Delimiter     = \"\\xc2\\xa7\";  // The paragraph / section symbol in UTF-8\nconst char * cChatColor::Black         = \"\\xc2\\xa7\"\"0\";\nconst char * cChatColor::Navy          = \"\\xc2\\xa7\"\"1\";\nconst char * cChatColor::Green         = \"\\xc2\\xa7\"\"2\";\nconst char * cChatColor::Blue          = \"\\xc2\\xa7\"\"3\";\nconst char * cChatColor::Red           = \"\\xc2\\xa7\"\"4\";\nconst char * cChatColor::Purple        = \"\\xc2\\xa7\"\"5\";\nconst char * cChatColor::Gold          = \"\\xc2\\xa7\"\"6\";\nconst char * cChatColor::LightGray     = \"\\xc2\\xa7\"\"7\";\nconst char * cChatColor::Gray          = \"\\xc2\\xa7\"\"8\";\nconst char * cChatColor::DarkPurple    = \"\\xc2\\xa7\"\"9\";\nconst char * cChatColor::LightGreen    = \"\\xc2\\xa7\"\"a\";\nconst char * cChatColor::LightBlue     = \"\\xc2\\xa7\"\"b\";\nconst char * cChatColor::Rose          = \"\\xc2\\xa7\"\"c\";\nconst char * cChatColor::LightPurple   = \"\\xc2\\xa7\"\"d\";\nconst char * cChatColor::Yellow        = \"\\xc2\\xa7\"\"e\";\nconst char * cChatColor::White         = \"\\xc2\\xa7\"\"f\";\n\nconst char * cChatColor::Random        = \"\\xc2\\xa7\"\"k\";\nconst char * cChatColor::Bold          = \"\\xc2\\xa7\"\"l\";\nconst char * cChatColor::Strikethrough = \"\\xc2\\xa7\"\"m\";\nconst char * cChatColor::Underlined    = \"\\xc2\\xa7\"\"n\";\nconst char * cChatColor::Italic        = \"\\xc2\\xa7\"\"o\";\nconst char * cChatColor::Plain         = \"\\xc2\\xa7\"\"r\";\n\n\n\n"
  },
  {
    "path": "src/ChatColor.h",
    "content": "\n#pragma once\n\n\n\n\n\n// tolua_begin\nclass cChatColor\n{\npublic:\n\tstatic const char * Delimiter;\n\n\t/** @deprecated use ChatColor::Delimiter instead */\n\tstatic const char * Color;\n\n\tstatic const char * Black;\n\tstatic const char * Navy;\n\tstatic const char * Green;\n\tstatic const char * Blue;\n\tstatic const char * Red;\n\tstatic const char * Purple;\n\tstatic const char * Gold;\n\tstatic const char * LightGray;\n\tstatic const char * Gray;\n\tstatic const char * DarkPurple;\n\tstatic const char * LightGreen;\n\tstatic const char * LightBlue;\n\tstatic const char * Rose;\n\tstatic const char * LightPurple;\n\tstatic const char * Yellow;\n\tstatic const char * White;\n\n\t// Styles\n\t// source: http://wiki.vg/Chat\n\tstatic const char * Random;\n\tstatic const char * Bold;\n\tstatic const char * Strikethrough;\n\tstatic const char * Underlined;\n\tstatic const char * Italic;\n\tstatic const char * Plain;\n};\n\n// tolua_end\n"
  },
  {
    "path": "src/CheckBasicStyle.lua",
    "content": "#!/usr/bin/env lua\n\n-- CheckBasicStyle.lua\n\n--[[\nChecks that all source files (*.cpp, *.h) use the basic style requirements of the project:\n\t- Tabs for indentation, spaces for alignment\n\t- Trailing whitespace on non-empty lines\n\t- Two spaces between code and line-end comment (\"//\")\n\t- Spaces after comma, not before\n\t- Opening braces not at the end of a code line\n\t- Spaces after if, for, while\n\t- Line dividers (////...) exactly 80 slashes\n\t- Multi-level indent change\n\t- (TODO) Spaces before *, /, &\n\t- (TODO) Hex numbers with even digit length\n\t- (TODO) Hex numbers in lowercase\n\t- (TODO) Not using \"* \"-style doxy comment continuation lines\n\nViolations that cannot be checked easily:\n\t- Spaces around \"+\" (there are things like \"a++\", \"++a\", \"a += 1\", \"X+\", \"stack +1\" and ascii-drawn tables)\n\nReports all violations on stdout in a form that is readable by Visual Studio's parser, so that dblclicking\nthe line brings the editor directly to the violation.\n\nReturns 0 on success, 1 on internal failure, 2 if any violations found\n\n--]]\n\n\n\n\n\n-- The list of file extensions that are processed:\nlocal g_ShouldProcessExt =\n{\n\t[\"h\"]   = true,\n\t[\"cpp\"] = true,\n}\n\n--- The list of files not to be processed:\nlocal g_IgnoredFiles =\n{\n\t\"Bindings/Bindings.cpp\",\n\t\"Bindings/Bindings.h\",\n\t\"Bindings/LuaState_Implementation.cpp\",\n\t\"Registries/BlockStates.cpp\",\n\t\"Registries/BlockStates.h\"\n}\n\n--- The list of files not to be processed, as a dictionary (filename => true), built from g_IgnoredFiles\nlocal g_ShouldIgnoreFile = {}\n\n-- Initialize the g_ShouldIgnoreFile map:\nfor _, fnam in ipairs(g_IgnoredFiles) do\n\tg_ShouldIgnoreFile[fnam] = true\nend\n\n--- Keeps track of the number of violations for this folder\nlocal g_NumViolations = 0\n\n\n\n\n\n--- Reports one violation\n-- Pretty-prints the message\n-- Also increments g_NumViolations\nlocal function ReportViolation(a_FileName, a_LineNumber, a_PatStart, a_PatEnd, a_Message)\n\tprint(a_FileName .. \"(\" .. a_LineNumber .. \"): \" .. a_PatStart .. \" .. \" .. a_PatEnd .. \": \" .. a_Message)\n\tg_NumViolations = g_NumViolations + 1\nend\n\n\n\n\n\n--- Searches for the specified pattern, if found, reports it as a violation with the given message\nlocal function ReportViolationIfFound(a_Line, a_FileName, a_LineNum, a_Pattern, a_Message)\n\tlocal patStart, patEnd = a_Line:find(a_Pattern)\n\tif not(patStart) then\n\t\treturn\n\tend\n\tReportViolation(a_FileName, a_LineNum, patStart, patEnd, a_Message)\nend\n\n\n\n\n\nlocal g_ViolationPatterns =\n{\n\t-- Parenthesis around comparisons:\n\t{\"==[^)]+&&\",     \"Add parenthesis around comparison\"},\n\t{\"&&[^(]+==\",     \"Add parenthesis around comparison\"},\n\t{\"==[^)]+||\",     \"Add parenthesis around comparison\"},\n\t{\"||[^(]+==\",     \"Add parenthesis around comparison\"},\n\t{\"!=[^)]+&&\",     \"Add parenthesis around comparison\"},\n\t{\"&&[^(]+!=\",     \"Add parenthesis around comparison\"},\n\t{\"!=[^)]+||\",     \"Add parenthesis around comparison\"},\n\t{\"||[^(]+!=\",     \"Add parenthesis around comparison\"},\n\t{\"<[^)>]*&&\",     \"Add parenthesis around comparison\"},  -- Must take special care of templates: \"template <T> fn(Args && ...)\"\n\t-- Cannot check a < following a && due to functions of the form x fn(y&& a, z<b> c)\n\t{\"<[^)>]*||\",     \"Add parenthesis around comparison\"},  -- Must take special care of templates: \"template <T> fn(Args && ...)\"\n\t{\"||[^(]+<\",      \"Add parenthesis around comparison\"},\n\t-- Cannot check \">\" because of \"obj->m_Flag &&\". Check at least \">=\":\n\t{\">=[^)]+&&\",     \"Add parenthesis around comparison\"},\n\t{\"&&[^(]+>=\",     \"Add parenthesis around comparison\"},\n\t{\">=[^)]+||\",     \"Add parenthesis around comparison\"},\n\t{\"||[^(]+>=\",     \"Add parenthesis around comparison\"},\n\n\t-- Check against indenting using spaces:\n\t{\"^\\t* +\", \"Indenting with a space\"},\n\n\t-- Check against alignment using tabs:\n\t{\"[^%s]\\t+[^%s]\", \"Aligning with a tab\"},\n\n\t-- Check against trailing whitespace:\n\t{\"%s+\\n\", \"Trailing whitespace or whitespace-only line\"},\n\n\t-- Check that all \"//\"-style comments have at least two spaces in front (unless alone on line):\n\t{\"[^%s] //\", \"Needs at least two spaces in front of a \\\"//\\\"-style comment\"},\n\n\t-- Check that all \"//\"-style comments have at least one spaces after:\n\t{\"%s//[^%s/*<]\", \"Needs a space after a \\\"//\\\"-style comment\"},\n\n\t-- Check that doxy-comments are used only in the double-asterisk form:\n\t{\"/// \", \"Use doxycomments in the form /** Comment */\"},\n\n\t-- Check that /* */ comments have whitespace around the insides:\n\t{\"%*%*/\",        \"Wrong comment termination, use */\"},\n\t{\"/%*[^%s*/\\\"]\", \"Needs a space after /*\"},  -- Need to take care of the special \"//*/\" comment ends\n\t{\"/%*%*[^%s*<]\", \"Needs a space after /**\"},\n\t{\"[^%s/*]%*/\",   \"Needs a space before */\"},\n\n\t-- Check against MS XML doxycomments:\n\t{\"/%*%* <\", \"Remove the MS XML markers from comment\"},\n\n\t-- Check that all commas have spaces after them and not in front of them:\n\t{\" ,\", \"Extra space before a \\\",\\\"\"},\n\t{\",[^%s\\\"%%\\']\", \"Needs a space after a \\\",\\\"\"},  -- Report all except >> \",\" << needed for splitting and >>,%s<< needed for formatting\n\n\t-- Check that opening braces are not at the end of a code line:\n\t{\"[^%s].-{\\n?$\", \"Brace should be on a separate line\"},\n\n\t-- Space after keywords:\n\t{\"[^_]if%(\", \"Needs a space after \\\"if\\\"\"},\n\t{\"%sfor%(\", \"Needs a space after \\\"for\\\"\"},\n\t{\"%swhile%(\", \"Needs a space after \\\"while\\\"\"},\n\t{\"%sswitch%(\", \"Needs a space after \\\"switch\\\"\"},\n\t{\"%scatch%(\", \"Needs a space after \\\"catch\\\"\"},\n\t{\"%stemplate<\", \"Needs a space after \\\"template\\\"\"},\n\n\t-- No space after keyword's parenthesis:\n\t{\"[^%a#]if %( \", \"Remove the space after \\\"(\\\"\"},\n\t{\"for %( \", \"Remove the space after \\\"(\\\"\"},\n\t{\"while %( \", \"Remove the space after \\\"(\\\"\"},\n\t{\"catch %( \", \"Remove the space after \\\"(\\\"\"},\n\n\t-- No space before a closing parenthesis:\n\t{\" %)\", \"Remove the space before \\\")\\\"\"},\n\n\t-- Check spaces around \"+\":\n\t{\"^[a-zA-Z0-9]+%+[a-zA-Z0-9]+\",                      \"Add space around +\"},\n\t{\"[!@#$%%%^&*() %[%]\\t][a-zA-Z0-9]+%+[a-zA-Z0-9]+\",  \"Add space around +\"},\n\t--[[\n\t-- Cannot check these because of text such as \"X+\" and \"+2\" appearing in some comments.\n\t{\"^[a-zA-Z0-9]+ %+[a-zA-Z0-9]+\",                     \"Add space after +\"},\n\t{\"[!@#$%%%^&*() %[%]\\t][a-zA-Z0-9]+ %+[a-zA-Z0-9]+\", \"Add space after +\"},\n\t{\"^[a-zA-Z0-9]+%+ [a-zA-Z0-9]+\",                     \"Add space before +\"},\n\t{\"[!@#$%%%^&*() %[%]\\t][a-zA-Z0-9]+%+ [a-zA-Z0-9]+\", \"Add space before +\"},\n\t--]]\n\n\t-- Cannot check spaces around \"-\", because the minus is sometimes used as a hyphen between-words\n\n\t-- Check spaces around \"*\":\n\t{\"^[a-zA-Z0-9]+%*[a-zA-Z0-9]+\",                             \"Add space around *\"},\n\t{\"^[^\\\"]*[!@#$%%%^&*() %[%]\\t][a-zA-Z0-9]+%*[a-zA-Z0-9]+\",  \"Add space around *\"},\n\t{\"^[a-zB-Z0-9]+%* [a-zA-Z0-9]+\",                            \"Add space before *\"},\n\t{\"^[^\\\"]*[!@#$%%%^&*() %[%]\\t][a-zB-Z0-9]+%* [a-zA-Z0-9]+\", \"Add space before *\"},\n\n\t-- Check spaces around \"/\":\n\t{\"^[a-zA-Z0-9]+%/[a-zA-Z0-9]+\",                            \"Add space around /\"},\n\t{\"^[^\\\"]*[!@#$%%%^&*() %[%]\\t][a-zA-Z0-9]+%/[a-zA-Z0-9]+\", \"Add space around /\"},\n\n\t-- Check spaces around \"&\":\n\t{\"^[a-zA-Z0-9]+%&[a-zA-Z0-9]+\",                             \"Add space around &\"},\n\t{\"^[^\\\"]*[!@#$%%%^&*() %[%]\\t][a-zA-Z0-9]+%&[a-zA-Z0-9]+\",  \"Add space around &\"},\n\t{\"^[a-zA-Z0-9]+%& [a-zA-Z0-9]+\",                            \"Add space before &\"},\n\t{\"^[^\\\"]*[!@#$%%%^&*() %[%]\\t][a-zA-Z0-9]+%& [a-zA-Z0-9]+\", \"Add space before &\"},\n\n\t-- Check spaces around \"==\", \"<=\" and \">=\":\n\t{\"==[a-zA-Z0-9]+\",                             \"Add space after ==\"},\n\t{\"[a-zA-Z0-9]+==[^\\\\]\",                        \"Add space before ==\"},\n\t{\"<=[a-zA-Z0-9]+\",                             \"Add space after <=\"},\n\t{\"[a-zA-Z0-9]+<=\",                             \"Add space before <=\"},\n\t{\">=[a-zA-Z0-9]+\",                             \"Add space after >=\"},\n\t{\"[a-zA-Z0-9]+>=\",                             \"Add space before >=\"},\n\n\t-- We don't like \"Type const *\" and \"Type const &\". Use \"const Type *\" and \"const Type &\" instead:\n\t{\"const %&\", \"Use 'const Type &' instead of 'Type const &'\"},\n\t{\"const %*\", \"Use 'const Type *' instead of 'Type const *'\"},\n\n\t-- Check if \"else\" is on the same line as a brace.\n\t{\"}%s*else\", \"else has to be on a separate line\"},\n\t{\"else%s*{\", \"else has to be on a separate line\"},\n\n\t-- Don't allow characters other than ASCII 0 - 127:\n\t{\"[\" .. string.char(128) .. \"-\" .. string.char(255) .. \"]\", \"Character in the extended ASCII range (128 - 255) not allowed\"},\n}\n\n\n\n\n\n--- Processes one file\nlocal function ProcessFile(a_FileName)\n\tassert(type(a_FileName) == \"string\")\n\n\t-- Read the whole file:\n\tlocal f, err = io.open(a_FileName, \"r\")\n\tif (f == nil) then\n\t\tprint(\"Cannot open file \\\"\" .. a_FileName .. \"\\\": \" .. err)\n\t\tprint(\"Aborting\")\n\t\tos.exit(1)\n\tend\n\tlocal all = f:read(\"*all\")\n\tf:close()\n\n\t-- Check that the last line is empty - otherwise processing won't work properly:\n\tlocal lastChar = string.byte(all, string.len(all))\n\tif ((lastChar ~= 13) and (lastChar ~= 10)) then\n\t\tlocal numLines = 1\n\t\tstring.gsub(all, \"\\n\", function() numLines = numLines + 1 end)  -- Count the number of line-ends\n\t\tReportViolation(a_FileName, numLines, 1, 1, \"Missing empty line at file end\")\n\t\treturn\n\tend\n\n\t-- Process each line separately:\n\t-- Ref.: https://stackoverflow.com/questions/10416869/iterate-over-possibly-empty-lines-in-a-way-that-matches-the-expectations-of-exis\n\tlocal lineCounter = 1\n\tlocal lastIndentLevel = 0\n\tlocal isLastLineControl = false\n\tlocal lastNonEmptyLine = 0\n\tlocal isAfterFunction = false\n\tlocal isSourceFile = a_FileName:match(\"%.cpp\")\n\tall = all:gsub(\"\\r\\n\", \"\\n\")  -- normalize CRLF into LF-only\n\tstring.gsub(all .. \"\\n\", \"[^\\n]*\\n\",  -- Iterate over each line, while preserving empty lines\n\t\tfunction(a_Line)\n\t\t\t-- Check against each violation pattern:\n\t\t\tfor _, pat in ipairs(g_ViolationPatterns) do\n\t\t\t\tReportViolationIfFound(a_Line, a_FileName, lineCounter, pat[1], pat[2])\n\t\t\tend\n\n\t\t\t-- Check that divider comments are well formed - 80 slashes plus optional indent:\n\t\t\tlocal dividerStart, dividerEnd = a_Line:find(\"/////*\")\n\t\t\tif (dividerStart) then\n\t\t\t\tif (dividerEnd ~= dividerStart + 79) then\n\t\t\t\t\tReportViolation(a_FileName, lineCounter, 1, 80, \"Divider comment should have exactly 80 slashes\")\n\t\t\t\tend\n\t\t\t\tif (dividerStart > 1) then\n\t\t\t\t\tif (\n\t\t\t\t\t\t(a_Line:sub(1, dividerStart - 1) ~= string.rep(\"\\t\", dividerStart - 1)) or  -- The divider should have only indent in front of it\n\t\t\t\t\t\t(a_Line:len() > dividerEnd + 1)                                             -- The divider should have no other text following it\n\t\t\t\t\t) then\n\t\t\t\t\t\tReportViolation(a_FileName, lineCounter, 1, 80, \"Divider comment shouldn't have any extra text around it\")\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- Check the indent level change from the last line, if it's too much, report:\n\t\t\tlocal indentStart, indentEnd = a_Line:find(\"\\t+\")\n\t\t\tlocal indentLevel = 0\n\t\t\tif (indentStart) then\n\t\t\t\tindentLevel = indentEnd - indentStart\n\t\t\tend\n\t\t\tif (indentLevel > 0) then\n\t\t\t\tif ((lastIndentLevel - indentLevel >= 2) or (lastIndentLevel - indentLevel <= -2)) then\n\t\t\t\t\tReportViolation(a_FileName, lineCounter, 1, indentStart or 1, \"Indent changed more than a single level between the previous line and this one: from \" .. lastIndentLevel .. \" to \" .. indentLevel)\n\t\t\t\tend\n\t\t\t\tlastIndentLevel = indentLevel\n\t\t\tend\n\n\t\t\t-- Check that control statements have braces on separate lines after them:\n\t\t\t-- Note that if statements can be broken into multiple lines, in which case this test is not taken\n\t\t\tif (isLastLineControl) then\n\t\t\t\tif not(a_Line:find(\"^%s*{\") or a_Line:find(\"^%s*#\")) then\n\t\t\t\t\t-- Not followed by a brace, not followed by a preprocessor\n\t\t\t\t\tReportViolation(a_FileName, lineCounter - 1, 1, 1, \"Control statement needs a brace on separate line\")\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal lineWithSpace = \" \" .. a_Line\n\t\t\tisLastLineControl =\n\t\t\t\tlineWithSpace:find(\"^%s+if %b()\") or\n\t\t\t\tlineWithSpace:find(\"^%s+else if %b()\") or\n\t\t\t\tlineWithSpace:find(\"^%s+for %b()\") or\n\t\t\t\tlineWithSpace:find(\"^%s+switch %b()\") or\n\t\t\t\tlineWithSpace:find(\"^%s+else\\n\") or\n\t\t\t\tlineWithSpace:find(\"^%s+else  //\") or\n\t\t\t\tlineWithSpace:find(\"^%s+do %b()\")\n\n\n\t\t\t-- Check that exactly 5 empty lines are left beteen functions and no more than 5 elsewhere\n\t\t\tif not(a_Line:find(\"^\\n\")) then\n\t\t\t\tlocal numEmptyLines = (lineCounter - lastNonEmptyLine) - 1\n\n\t\t\t\tlocal isStartOfFunction = (\n\t\t\t\t\tisAfterFunction and\n\t\t\t\t\ta_Line:find(\"^[%s%w]\")\n\t\t\t\t)\n\n\t\t\t\tif (isSourceFile and isStartOfFunction and (numEmptyLines ~= 5)) then\n\t\t\t\t\tReportViolation(a_FileName, lineCounter - 1, 1, 1, \"Leave exactly 5 empty lines between functions (found \" .. numEmptyLines ..\")\")\n\t\t\t\telseif (numEmptyLines > 5) then\n\t\t\t\t\tReportViolation(a_FileName, lineCounter - 1, 1, 1, \"Leave at most 5 consecutive empty lines (found \" .. numEmptyLines .. \")\")\n\t\t\t\tend\n\n\t\t\t\tlastNonEmptyLine = lineCounter\n\t\t\t\tisAfterFunction = (a_Line == \"}\\n\")\n\t\t\tend\n\n\t\t\tlineCounter = lineCounter + 1\n\t\tend\n\t)\nend\n\n\n\n\n\n--- Processes one item - a file or a folder\nlocal function ProcessItem(a_ItemName)\n\tassert(type(a_ItemName) == \"string\")\n\n\t-- Skip files / folders that should be ignored\n\tif (g_ShouldIgnoreFile[a_ItemName]) then\n\t\treturn\n\tend\n\n\tlocal ext = a_ItemName:match(\"%.([^/%.]-)$\")\n\tif (g_ShouldProcessExt[ext]) then\n\t\tProcessFile(a_ItemName)\n\tend\nend\n\n\n\n\n\n--- Array of files to process. Filled from cmdline arguments\nlocal ToProcess = {}\n\n\n\n\n\n--- Handlers for the command-line arguments\n-- Maps flag => function\nlocal CmdLineHandlers =\n{\n\t-- \"-f file\" checks the specified file\n\t[\"-f\"] = function (a_Args, a_Idx)\n\t\tlocal fnam = a_Args[a_Idx + 1]\n\t\tif not(fnam) then\n\t\t\terror(\"Invalid flag: '-f' needs a filename following it.\")\n\t\tend\n\t\ttable.insert(ToProcess, fnam)\n\t\treturn a_Idx + 2  -- skip the filename in param parsing\n\tend,\n\n\t-- \"-g\" checks files reported by git as being committed.\n\t[\"-g\"] = function (a_Args, a_Idx)\n\t\tlocal f = io.popen(\"git diff --cached --name-only --diff-filter=ACMR\")\n\t\tfor fnam in f:lines() do\n\t\t\ttable.insert(ToProcess, fnam)\n\t\tend\n\tend,\n\n\t-- \"-h\" prints help and exits\n\t[\"-h\"] = function (a_Args, a_Idx)\n\t\tprint([[\nUsage:\")\n\"CheckBasicStyle [<options>]\n\nAvailable options:\n-f <filename> - checks the specified filename\n-g            - checks files reported by Git as being committed\n-h            - prints this help and exits\n-l <listfile> - checks all files listed in the specified listfile\n--            - reads the list of files to check from stdin\n\nWhen no options are given, the script checks all files listed in the AllFiles.lst file.\n\nOnly .cpp and .h files are ever checked.\n]])\n\t\tos.exit(0)\n\tend,\n\n\t-- \"-l listfile\" loads the list of files to check from the specified listfile\n\t[\"-l\"] = function (a_Args, a_Idx)\n\t\tlocal listFile = a_Args[a_Idx + 1]\n\t\tif not(listFile) then\n\t\t\terror(\"Invalid flag: '-l' needs a filename following it.\")\n\t\tend\n\t\tfor fnam in io.lines(listFile) do\n\t\t\ttable.insert(ToProcess, fnam)\n\t\tend\n\t\treturn a_Idx + 2  -- Skip the listfile in param parsing\n\tend,\n\n\t-- \"--\" reads the list of files from stdin\n\t[\"--\"] = function (a_Args, a_Idx)\n\t\tfor fnam in io.lines() do\n\t\t\ttable.insert(ToProcess, fnam)\n\t\tend\n\tend,\n}\n\n\n\n\n\n-- Remove buffering from stdout, so that the output appears immediately in IDEs:\nio.stdout:setvbuf(\"no\")\n\n-- Parse the cmdline arguments to see what files to check:\nlocal idx = 1\nwhile (arg[idx]) do\n\tlocal handler = CmdLineHandlers[arg[idx]]\n\tif not(handler) then\n\t\terror(\"Unknown command-line argument #\" .. idx .. \": \" .. arg[idx])\n\tend\n\tidx = handler(arg, idx) or (idx + 1)  -- Call the handler, let it change the next index if it wants\nend\n\n\n-- By default process all files in the AllFiles.lst file (generated by cmake):\nif not(arg[1]) then\n\tfor fnam in io.lines(\"AllFiles.lst\") do\n\t\ttable.insert(ToProcess, fnam)\n\tend\nend\n\n\n\n\n\n-- Process the files in the list:\nfor _, fnam in ipairs(ToProcess) do\n\n\t-- Remove the optional \"./\" prefix:\n\tif (fnam:sub(1, 2) == \"./\") then\n\t\tfnam = fnam:sub(3)\n\tend\n\n\tProcessItem(fnam)\nend\n\n\n\n\n\n-- Report final verdict:\nprint(\"Number of violations found: \" .. g_NumViolations)\nif (g_NumViolations > 0) then\n\tos.exit(2)\nelse\n\tos.exit(0)\nend\n"
  },
  {
    "path": "src/Chunk.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#ifndef _WIN32\n\t#include <cstdlib>\n#endif\n\n\n#include \"Chunk.h\"\n#include \"BlockInfo.h\"\n#include \"World.h\"\n#include \"ClientHandle.h\"\n#include \"Server.h\"\n#include \"Defines.h\"\n#include \"Entities/Pickup.h\"\n#include \"Item.h\"\n#include \"Noise/Noise.h\"\n#include \"Root.h\"\n#include \"Entities/Player.h\"\n#include \"BlockArea.h\"\n#include \"Bindings/PluginManager.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"Simulator/FluidSimulator.h\"\n#include \"Simulator/RedstoneSimulator.h\"\n#include \"MobCensus.h\"\n#include \"MobSpawner.h\"\n#include \"BlockInServerPluginInterface.h\"\n#include \"SetChunkData.h\"\n#include \"BoundingBox.h\"\n#include \"Blocks/ChunkInterface.h\"\n\n#include \"json/json.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cChunk:\n\ncChunk::cChunk(\n\tint a_ChunkX, int a_ChunkZ,\n\tcChunkMap * a_ChunkMap, cWorld * a_World\n):\n\tm_Presence(cpInvalid),\n\tm_IsLightValid(false),\n\tm_IsDirty(false),\n\tm_IsSaving(false),\n\tm_StayCount(0),\n\tm_PosX(a_ChunkX),\n\tm_PosZ(a_ChunkZ),\n\tm_World(a_World),\n\tm_ChunkMap(a_ChunkMap),\n\tm_WaterSimulatorData(a_World->GetWaterSimulator()->CreateChunkData()),\n\tm_LavaSimulatorData (a_World->GetLavaSimulator ()->CreateChunkData()),\n\tm_RedstoneSimulatorData(a_World->GetRedstoneSimulator()->CreateChunkData()),\n\tm_AlwaysTicked(0)\n{\n\tm_NeighborXM = a_ChunkMap->FindChunk(a_ChunkX - 1, a_ChunkZ);\n\tm_NeighborXP = a_ChunkMap->FindChunk(a_ChunkX + 1, a_ChunkZ);\n\tm_NeighborZM = a_ChunkMap->FindChunk(a_ChunkX, a_ChunkZ - 1);\n\tm_NeighborZP = a_ChunkMap->FindChunk(a_ChunkX, a_ChunkZ + 1);\n\n\tif (m_NeighborXM != nullptr)\n\t{\n\t\tm_NeighborXM->m_NeighborXP = this;\n\t}\n\tif (m_NeighborXP != nullptr)\n\t{\n\t\tm_NeighborXP->m_NeighborXM = this;\n\t}\n\tif (m_NeighborZM != nullptr)\n\t{\n\t\tm_NeighborZM->m_NeighborZP = this;\n\t}\n\tif (m_NeighborZP != nullptr)\n\t{\n\t\tm_NeighborZP->m_NeighborZM = this;\n\t}\n}\n\n\n\n\n\ncChunk::~cChunk()\n{\n\t// LOGINFO(\"### delete cChunk() (%i, %i) from %p, thread 0x%x ###\", m_PosX, m_PosZ, this, GetCurrentThreadId());\n\n\t// Inform our neighbours that we're no longer valid:\n\tif (m_NeighborXM != nullptr)\n\t{\n\t\tm_NeighborXM->m_NeighborXP = nullptr;\n\t}\n\tif (m_NeighborXP != nullptr)\n\t{\n\t\tm_NeighborXP->m_NeighborXM = nullptr;\n\t}\n\tif (m_NeighborZM != nullptr)\n\t{\n\t\tm_NeighborZM->m_NeighborZP = nullptr;\n\t}\n\tif (m_NeighborZP != nullptr)\n\t{\n\t\tm_NeighborZP->m_NeighborZM = nullptr;\n\t}\n\n\tdelete m_WaterSimulatorData;\n\tm_WaterSimulatorData = nullptr;\n\tdelete m_LavaSimulatorData;\n\tm_LavaSimulatorData = nullptr;\n\tdelete m_RedstoneSimulatorData;\n\tm_RedstoneSimulatorData = nullptr;\n}\n\n\n\n\n\nvoid cChunk::BroadcastPendingChanges(void)\n{\n\tif (const auto PendingBlocksCount = m_PendingSendBlocks.size(); PendingBlocksCount >= 10240)\n\t{\n\t\t// Resend the full chunk:\n\t\tfor (const auto ClientHandle : m_LoadedByClient)\n\t\t{\n\t\t\tm_World->ForceSendChunkTo(m_PosX, m_PosZ, cChunkSender::Priority::Medium, ClientHandle);\n\t\t}\n\t}\n\telse if (PendingBlocksCount == 0)\n\t{\n\t\t// Only send block entity changes:\n\t\tfor (const auto ClientHandle : m_LoadedByClient)\n\t\t{\n\t\t\tfor (const auto BlockEntity : m_PendingSendBlockEntities)\n\t\t\t{\n\t\t\t\tBlockEntity->SendTo(*ClientHandle);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Send block and block entity changes:\n\t\tfor (const auto ClientHandle : m_LoadedByClient)\n\t\t{\n\t\t\tClientHandle->SendBlockChanges(m_PosX, m_PosZ, m_PendingSendBlocks);\n\n\t\t\tfor (const auto BlockEntity : m_PendingSendBlockEntities)\n\t\t\t{\n\t\t\t\tBlockEntity->SendTo(*ClientHandle);\n\t\t\t}\n\t\t}\n\t}\n\n\tm_PendingSendBlocks.clear();\n\tm_PendingSendBlockEntities.clear();\n}\n\n\n\n\n\nvoid cChunk::SetPresence(cChunk::ePresence a_Presence)\n{\n\tm_Presence = a_Presence;\n\tif (a_Presence == cpPresent)\n\t{\n\t\tm_World->GetChunkMap()->ChunkValidated();\n\t}\n}\n\n\n\n\n\nvoid cChunk::MarkRegenerating(void)\n{\n\t// Set as queued again:\n\tSetPresence(cpQueued);\n\n\t// Tell all clients attached to this chunk that they want this chunk:\n\tfor (auto ClientHandle : m_LoadedByClient)\n\t{\n\t\tClientHandle->AddWantedChunk(m_PosX, m_PosZ);\n\t}  // for itr - m_LoadedByClient[]\n}\n\n\n\n\n\nbool cChunk::HasPlayerEntities() const\n{\n\treturn std::any_of(\n\t\tm_Entities.begin(), m_Entities.end(),\n\t\t[](const auto & Entity)\n\t\t{\n\t\t\treturn Entity->IsPlayer();\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cChunk::CanUnload(void) const\n{\n\treturn\n\t\tm_LoadedByClient.empty() &&  // The chunk is not used by any client\n\t\t!HasPlayerEntities() &&      // Ensure not only the absence of ClientHandlers, but also of cPlayer objects\n\t\t!m_IsDirty &&                // The chunk has been saved properly or hasn't been touched since the load / gen\n\t\t(m_StayCount == 0) &&        // The chunk is not in a ChunkStay\n\t\t(m_Presence != cpQueued) ;   // The chunk is not queued for loading / generating (otherwise multi-load / multi-gen could occur)\n}\n\n\n\n\n\nbool cChunk::CanUnloadAfterSaving(void) const\n{\n\treturn\n\t\tm_LoadedByClient.empty() &&  // The chunk is not used by any client\n\t\t!HasPlayerEntities() &&      // Ensure not only the absence of ClientHandlers, but also of cPlayer objects\n\t\tm_IsDirty &&                 // The chunk is dirty\n\t\t(m_StayCount == 0) &&        // The chunk is not in a ChunkStay\n\t\t(m_Presence != cpQueued) ;   // The chunk is not queued for loading / generating (otherwise multi-load / multi-gen could occur)\n}\n\n\n\n\n\nvoid cChunk::OnUnload()\n{\n\t// Note: this is only called during normal operation, not during shutdown\n\n\t// Notify all entities of imminent unload:\n\tfor (auto & Entity : m_Entities)\n\t{\n\t\t// Chunks cannot be unloaded when they still contain players:\n\t\tASSERT(!Entity->IsPlayer());\n\n\t\t// Notify the entity:\n\t\tEntity->OnRemoveFromWorld(*Entity->GetWorld());\n\t}\n\n\t// Notify all block entities of imminent unload:\n\tfor (auto & KeyPair : m_BlockEntities)\n\t{\n\t\tKeyPair.second->OnRemoveFromWorld();\n\t}\n}\n\n\n\n\n\nvoid cChunk::MarkSaving(void)\n{\n\tm_IsSaving = true;\n}\n\n\n\n\n\nvoid cChunk::MarkSaved(void)\n{\n\tif (!m_IsSaving)\n\t{\n\t\treturn;\n\t}\n\tm_IsDirty = false;\n}\n\n\n\n\n\nvoid cChunk::MarkLoaded(void)\n{\n\tm_IsDirty = false;\n\tSetPresence(cpPresent);\n}\n\n\n\n\n\nvoid cChunk::MarkLoadFailed(void)\n{\n\tASSERT(m_Presence == cpQueued);\n\n\t// Mark dirty before generating, so that we get saved and don't have to later generate again:\n\tMarkDirty();\n\n\t// The chunk is always needed, generate it:\n\tm_World->GetGenerator().QueueGenerateChunk({ m_PosX, m_PosZ }, false);\n}\n\n\n\n\n\nvoid cChunk::GetAllData(cChunkDataCallback & a_Callback) const\n{\n\tASSERT(m_Presence == cpPresent);\n\n\ta_Callback.LightIsValid(m_IsLightValid);\n\ta_Callback.ChunkData(m_BlockData, m_LightData);\n\ta_Callback.HeightMap(m_HeightMap);\n\ta_Callback.BiomeMap(m_BiomeMap);\n\n\tfor (const auto & Entity : m_Entities)\n\t{\n\t\ta_Callback.Entity(Entity.get());\n\t}\n\n\tfor (auto & KeyPair : m_BlockEntities)\n\t{\n\t\ta_Callback.BlockEntity(KeyPair.second.get());\n\t}\n}\n\n\n\n\n\nvoid cChunk::SetAllData(SetChunkData && a_SetChunkData)\n{\n\tstd::copy_n(a_SetChunkData.HeightMap, std::size(a_SetChunkData.HeightMap), m_HeightMap);\n\tstd::copy_n(a_SetChunkData.BiomeMap, std::size(a_SetChunkData.BiomeMap), m_BiomeMap);\n\n\tm_BlockData = std::move(a_SetChunkData.BlockData);\n\tm_LightData = std::move(a_SetChunkData.LightData);\n\tm_IsLightValid = a_SetChunkData.IsLightValid;\n\n\tm_PendingSendBlocks.clear();\n\tm_PendingSendBlockEntities.clear();\n\n\t// Entities need some extra steps to destroy, so here we're keeping the old ones.\n\t// Move the entities already in the chunk, including player entities, so that we don't lose any:\n\ta_SetChunkData.Entities.insert(\n\t\ta_SetChunkData.Entities.end(),\n\t\tstd::make_move_iterator(m_Entities.begin()),\n\t\tstd::make_move_iterator(m_Entities.end())\n\t);\n\n\t// Store the augmented result:\n\tm_Entities = std::move(a_SetChunkData.Entities);\n\n\t// Set all the entity variables again:\n\tfor (const auto & Entity : m_Entities)\n\t{\n\t\tEntity->SetWorld(m_World);\n\t\tEntity->SetParentChunk(this);\n\t\tEntity->SetIsTicking(true);\n\t}\n\n\t// Remove the block entities present - either the loader / saver has better, or we'll create empty ones:\n\tfor (auto & KeyPair : m_BlockEntities)\n\t{\n\t\tKeyPair.second->Destroy();\n\t\tKeyPair.second->OnRemoveFromWorld();\n\t}\n\n\t// Clear the old ones:\n\tm_BlockEntities = std::move(a_SetChunkData.BlockEntities);\n\n\t// Check that all block entities have a valid blocktype at their respective coords (DEBUG-mode only):\n\n\tfor (auto & KeyPair : m_BlockEntities)\n\t{\n#ifndef NDEBUG\n\t\tcBlockEntity * Block = KeyPair.second.get();\n\t\tBLOCKTYPE EntityBlockType = Block->GetBlockType();\n\t\tBLOCKTYPE WorldBlockType = GetBlock(Block->GetRelX(), Block->GetPosY(), Block->GetRelZ());\n\t\tASSERT(WorldBlockType == EntityBlockType);\n#endif\n\t\t// Reset Pointer\n\t\tKeyPair.second->SetWorld(nullptr);\n\n\t\tauto Pos = cChunkDef::RelativeToAbsolute({KeyPair.second->GetRelX(), 0, KeyPair.second->GetRelZ()}, {m_PosX, m_PosZ});\n\t\tif ((Pos.x != KeyPair.second->GetPosX()) || (Pos.z != KeyPair.second->GetPosZ()))\n\t\t{\n\t\t\tKeyPair.second->SetPos(Pos.addedY(KeyPair.second->GetPosY()));\n\t\t}\n\t\tKeyPair.second->SetWorld(m_World);\n\t}\n\n\t// Set the chunk data as valid.\n\t// This may be needed for some simulators that perform actions upon block adding (Vaporize),\n\t// as well as some block entities upon being added to the chunk (Chests).\n\tSetPresence(cpPresent);\n\n\t// Initialise all block entities:\n\tfor (auto & KeyPair : m_BlockEntities)\n\t{\n\t\tKeyPair.second->OnAddToWorld(*m_World, *this);\n\t}\n\n\t// Wake up all simulators for their respective blocks:\n\tWakeUpSimulators();\n}\n\n\n\n\n\nvoid cChunk::SetLight(\n\tconst cChunkDef::BlockNibbles & a_BlockLight,\n\tconst cChunkDef::BlockNibbles & a_SkyLight\n)\n{\n\t// TODO: We might get cases of wrong lighting when a chunk changes in the middle of a lighting calculation.\n\t// Postponing until we see how bad it is :)\n\n\tm_LightData.SetAll(a_BlockLight, a_SkyLight);\n\n\tMarkDirty();\n\tm_IsLightValid = true;\n}\n\n\n\n\n\nvoid cChunk::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)\n{\n\tif ((a_DataTypes & (cBlockArea::baTypes | cBlockArea::baMetas)) != (cBlockArea::baTypes | cBlockArea::baMetas))\n\t{\n\t\tLOGWARNING(\"cChunk::WriteBlockArea(): unsupported datatype request, can write only types + metas together (0x%x), requested 0x%x. Ignoring.\",\n\t\t\t(cBlockArea::baTypes | cBlockArea::baMetas), a_DataTypes & (cBlockArea::baTypes | cBlockArea::baMetas)\n\t\t);\n\t\treturn;\n\t}\n\n\t// SizeX, SizeZ are the dimensions of the block data to copy to the chunk (size of the geometric union)\n\n\tint BlockStartX = std::max(a_MinBlockX, m_PosX * cChunkDef::Width);\n\tint BlockEndX   = std::min(a_MinBlockX + a_Area.GetSizeX(), (m_PosX + 1) * cChunkDef::Width);\n\tint BlockStartZ = std::max(a_MinBlockZ, m_PosZ * cChunkDef::Width);\n\tint BlockEndZ   = std::min(a_MinBlockZ + a_Area.GetSizeZ(), (m_PosZ + 1) * cChunkDef::Width);\n\tint SizeX = BlockEndX - BlockStartX;  // Size of the union\n\tint SizeZ = BlockEndZ - BlockStartZ;\n\tint SizeY = std::min(a_Area.GetSizeY(), cChunkDef::Height - a_MinBlockY);\n\tint OffX = BlockStartX - m_PosX * cChunkDef::Width;  // Offset within the chunk where the union starts\n\tint OffZ = BlockStartZ - m_PosZ * cChunkDef::Width;\n\tint BaseX = BlockStartX - a_MinBlockX;  // Offset within the area where the union starts\n\tint BaseZ = BlockStartZ - a_MinBlockZ;\n\n\t// Copy blocktype and blockmeta:\n\tBLOCKTYPE *  AreaBlockTypes = a_Area.GetBlockTypes();\n\tNIBBLETYPE * AreaBlockMetas = a_Area.GetBlockMetas();\n\tfor (int y = 0; y < SizeY; y++)\n\t{\n\t\tint ChunkY = a_MinBlockY + y;\n\t\tint AreaY = y;\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint ChunkZ = OffZ + z;\n\t\t\tint AreaZ = BaseZ + z;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint ChunkX = OffX + x;\n\t\t\t\tint AreaX = BaseX + x;\n\t\t\t\tauto idx = a_Area.MakeIndex(AreaX, AreaY, AreaZ);\n\t\t\t\tBLOCKTYPE BlockType = AreaBlockTypes[idx];\n\t\t\t\tNIBBLETYPE BlockMeta = AreaBlockMetas[idx];\n\t\t\t\tFastSetBlock(ChunkX, ChunkY, ChunkZ, BlockType, BlockMeta);\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\n\t// Erase all affected block entities:\n\t{\n\t\t// The affected area, in world coordinates.\n\t\tcCuboid affectedArea(\n\t\t\t{ BlockStartX, a_MinBlockY, BlockStartZ },\n\t\t\t{ BlockEndX, a_MinBlockY + SizeY - 1, BlockEndZ }\n\t\t);\n\n\t\t// Where in the pending block entity send list to start removing the invalidated elements from.\n\t\tauto PendingRemove = m_PendingSendBlockEntities.end();\n\n\t\tfor (auto itr = m_BlockEntities.begin(); itr != m_BlockEntities.end();)\n\t\t{\n\t\t\tif (affectedArea.IsInside(itr->second->GetPos()))\n\t\t\t{\n\t\t\t\titr->second->Destroy();\n\t\t\t\titr->second->OnRemoveFromWorld();\n\n\t\t\t\tPendingRemove = std::remove(m_PendingSendBlockEntities.begin(), PendingRemove, itr->second.get());  // Search the remaining valid pending sends.\n\t\t\t\titr = m_BlockEntities.erase(itr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++itr;\n\t\t\t}\n\t\t}\n\n\t\t// Remove all the deleted block entities from the pending send list:\n\t\tm_PendingSendBlockEntities.erase(PendingRemove, m_PendingSendBlockEntities.end());\n\t}\n\n\t// Clone block entities from a_Area into this chunk:\n\tif ((a_DataTypes & cBlockArea::baBlockEntities) != 0)\n\t{\n\t\tfor (const auto & keyPair: a_Area.GetBlockEntities())\n\t\t{\n\t\t\tauto & be = keyPair.second;\n\t\t\tauto posX = be->GetPosX() + a_MinBlockX;\n\t\t\tauto posY = be->GetPosY() + a_MinBlockY;\n\t\t\tauto posZ = be->GetPosZ() + a_MinBlockZ;\n\t\t\tif (\n\t\t\t\t(posX < m_PosX * cChunkDef::Width) || (posX >= m_PosX * cChunkDef::Width + cChunkDef::Width) ||\n\t\t\t\t(posZ < m_PosZ * cChunkDef::Width) || (posZ >= m_PosZ * cChunkDef::Width + cChunkDef::Width)\n\t\t\t)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// This block entity is inside the chunk.\n\t\t\t// The code above should have removed any that were here before:\n\t\t\tASSERT(GetBlockEntityRel(cChunkDef::AbsoluteToRelative({ posX, posY, posZ })) == nullptr);\n\n\t\t\t// Clone, and add the new one:\n\t\t\tAddBlockEntity(be->Clone({posX, posY, posZ}));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cChunk::Stay(bool a_Stay)\n{\n\tif (a_Stay)\n\t{\n\t\tm_StayCount++;\n\t}\n\telse\n\t{\n\t\tASSERT(m_StayCount != 0);\n\t\tm_StayCount--;\n\t}\n}\n\n\n\n\n\nvoid cChunk::CollectMobCensus(cMobCensus & toFill)\n{\n\ttoFill.CollectSpawnableChunk(*this);\n\tstd::vector<Vector3d> PlayerPositions;\n\tPlayerPositions.reserve(m_LoadedByClient.size());\n\tfor (auto ClientHandle : m_LoadedByClient)\n\t{\n\t\tconst cPlayer * currentPlayer = ClientHandle->GetPlayer();\n\t\tPlayerPositions.push_back(currentPlayer->GetPosition());\n\t}\n\n\tVector3d currentPosition;\n\tfor (auto & entity : m_Entities)\n\t{\n\t\t// LOGD(\"Counting entity #%i (%s)\", (*itr)->GetUniqueID(), (*itr)->GetClass());\n\t\tif (entity->IsMob())\n\t\t{\n\t\t\tauto & Monster = static_cast<cMonster &>(*entity);\n\t\t\tcurrentPosition = Monster.GetPosition();\n\t\t\tfor (const auto & PlayerPos : PlayerPositions)\n\t\t\t{\n\t\t\t\ttoFill.CollectMob(Monster, *this, (currentPosition - PlayerPos).SqrLength());\n\t\t\t}\n\t\t}\n\t}  // for itr - m_Entitites[]\n}\n\n\n\n\n\nvoid cChunk::GetThreeRandomNumbers(int & a_X, int & a_Y, int & a_Z, int a_MaxX, int a_MaxY, int a_MaxZ)\n{\n\tASSERT(\n\t\t(a_MaxX > 0) && (a_MaxY > 0) && (a_MaxZ > 0) &&\n\t\t(a_MaxX <= std::numeric_limits<int>::max() / a_MaxY) &&  // a_MaxX * a_MaxY doesn't overflow\n\t\t(a_MaxX * a_MaxY <= std::numeric_limits<int>::max() / a_MaxZ)  // a_MaxX * a_MaxY * a_MaxZ doesn't overflow\n\t);\n\n\t// MTRand gives an inclusive range [0, Max] but this gives the exclusive range [0, Max)\n\tint OverallMax = (a_MaxX * a_MaxY * a_MaxZ) - 1;\n\tint Random = m_World->GetTickRandomNumber(OverallMax);\n\n\ta_X =   Random % a_MaxX;\n\ta_Y =  (Random / a_MaxX) % a_MaxY;\n\ta_Z = ((Random / a_MaxX) / a_MaxY) % a_MaxZ;\n}\n\n\n\n\n\nvoid cChunk::GetRandomBlockCoords(int & a_X, int & a_Y, int & a_Z)\n{\n\t// MG TODO : check if this kind of optimization (only one random call) is still needed\n\t// MG TODO : if so propagate it\n\n\tGetThreeRandomNumbers(a_X, a_Y, a_Z, cChunkDef::Width, cChunkDef::Height - 2, cChunkDef::Width);\n\ta_Y++;\n}\n\n\n\n\n\nvoid cChunk::SpawnMobs(cMobSpawner & a_MobSpawner)\n{\n\tint CenterX, CenterY, CenterZ;\n\tGetRandomBlockCoords(CenterX, CenterY, CenterZ);\n\n\tBLOCKTYPE PackCenterBlock = GetBlock(CenterX, CenterY, CenterZ);\n\tif (!a_MobSpawner.CheckPackCenter(PackCenterBlock))\n\t{\n\t\treturn;\n\t}\n\n\ta_MobSpawner.NewPack();\n\tint NumberOfTries = 0;\n\tint NumberOfSuccess = 0;\n\tint MaxNbOfSuccess = 4;  // This can be changed during the process for Wolves and Ghasts\n\twhile ((NumberOfTries < 12) && (NumberOfSuccess < MaxNbOfSuccess))\n\t{\n\t\tconst int HorizontalRange = 20;  // MG TODO : relocate\n\t\tconst int VerticalRange = 0;     // MG TODO : relocate\n\t\tint TryX, TryY, TryZ;\n\t\tGetThreeRandomNumbers(TryX, TryY, TryZ, 2 * HorizontalRange + 1, 2 * VerticalRange + 1, 2 * HorizontalRange + 1);\n\t\tTryX -= HorizontalRange;\n\t\tTryY -= VerticalRange;\n\t\tTryZ -= HorizontalRange;\n\t\tTryX += CenterX;\n\t\tTryY += CenterY;\n\t\tTryZ += CenterZ;\n\n\t\tASSERT(TryY > 0);\n\t\tASSERT(TryY < cChunkDef::Height - 1);\n\n\t\tint WorldX, WorldY, WorldZ;\n\t\tPositionToWorldPosition(TryX, TryY, TryZ, WorldX, WorldY, WorldZ);\n\n\t\t// MG TODO :\n\t\t// Moon cycle (for slime)\n\t\t// check player and playerspawn presence < 24 blocks\n\t\t// check mobs presence on the block\n\n\t\t// MG TODO : check that \"Level\" really means Y\n\n\t\t/*\n\t\tNIBBLETYPE SkyLight = 0;\n\n\t\tNIBBLETYPE BlockLight = 0;\n\t\t*/\n\n\t\tNumberOfTries++;\n\n\t\tVector3i Try(TryX, TryY, TryZ);\n\t\tconst auto Chunk = GetRelNeighborChunkAdjustCoords(Try);\n\n\t\tif ((Chunk == nullptr) || !Chunk->IsValid() || !Chunk->IsLightValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tauto newMob = a_MobSpawner.TryToSpawnHere(this, Try, GetBiomeAt(Try.x, Try.z), MaxNbOfSuccess);\n\t\tif (newMob == nullptr)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tdouble ActualX = WorldX + 0.5;\n\t\tdouble ActualZ = WorldZ + 0.5;\n\t\tnewMob->SetPosition(ActualX, WorldY, ActualZ);\n\t\tFLOGD(\"Spawning {0} #{1} at {2}\", newMob->GetClass(), newMob->GetUniqueID(), Vector3i{WorldX, WorldY, WorldZ});\n\t\tNumberOfSuccess++;\n\t}  // while (retry)\n}\n\n\n\n\n\nvoid cChunk::Tick(std::chrono::milliseconds a_Dt)\n{\n\tTickBlocks();\n\n\t// Tick all block entities in this chunk:\n\tfor (auto & KeyPair : m_BlockEntities)\n\t{\n\t\tm_IsDirty = KeyPair.second->Tick(a_Dt, *this) | m_IsDirty;\n\t}\n\n\tfor (auto itr = m_Entities.begin(); itr != m_Entities.end();)\n\t{\n\t\t// Do not tick mobs that are detached from the world. They're either scheduled for teleportation or for removal.\n\t\tif (!(*itr)->IsTicking())\n\t\t{\n\t\t\t++itr;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!((*itr)->IsMob()))  // Mobs are ticked inside cWorld::TickMobs() (as we don't have to tick them if they are far away from players)\n\t\t{\n\t\t\t// Tick all entities in this chunk (except mobs):\n\t\t\tASSERT((*itr)->GetParentChunk() == this);\n\t\t\t(*itr)->Tick(a_Dt, *this);\n\t\t\tASSERT((*itr)->GetParentChunk() == this);\n\t\t}\n\n\t\t// Do not move mobs that are detached from the world to neighbors. They're either scheduled for teleportation or for removal.\n\t\t// Because the schedulded destruction is going to look for them in this chunk. See cEntity::destroy.\n\t\tif (!(*itr)->IsTicking())\n\t\t{\n\t\t\t++itr;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\t((*itr)->GetChunkX() != m_PosX) ||\n\t\t\t((*itr)->GetChunkZ() != m_PosZ)\n\t\t)\n\t\t{\n\t\t\t// Mark as dirty if it was a server-generated entity:\n\t\t\tif (!(*itr)->IsPlayer())\n\t\t\t{\n\t\t\t\tMarkDirty();\n\t\t\t}\n\n\t\t\t// This block is very similar to RemoveEntity, except it uses an iterator to avoid scanning the whole m_Entities\n\t\t\t// The entity moved out of the chunk, move it to the neighbor\n\t\t\t(*itr)->SetParentChunk(nullptr);\n\t\t\tMoveEntityToNewChunk(std::move(*itr));\n\n\t\t\titr = m_Entities.erase(itr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++itr;\n\t\t}\n\t}  // for itr - m_Entitites[]\n\n\tApplyWeatherToTop();\n\n\t// Tick simulators:\n\tm_World->GetSimulatorManager()->SimulateChunk(a_Dt, m_PosX, m_PosZ, this);\n\n\t// Check blocks after everything else to apply at least one round of queued ticks (i.e. cBlockHandler::Check) this tick:\n\tCheckBlocks();\n}\n\n\n\n\n\nvoid cChunk::TickBlock(const Vector3i a_RelPos)\n{\n\tcChunkInterface ChunkInterface(this->GetWorld()->GetChunkMap());\n\tcBlockInServerPluginInterface PluginInterface(*this->GetWorld());\n\tcBlockHandler::For(GetBlock(a_RelPos)).OnUpdate(ChunkInterface, *this->GetWorld(), PluginInterface, *this, a_RelPos);\n}\n\n\n\n\n\nvoid cChunk::MoveEntityToNewChunk(OwnedEntity a_Entity)\n{\n\tcChunk * Neighbor = GetNeighborChunk(a_Entity->GetChunkX() * cChunkDef::Width, a_Entity->GetChunkZ() * cChunkDef::Width);\n\tif (Neighbor == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: Entity at %p (%s, ID %d) moving to a non-existent chunk.\",\n\t\t\t__FUNCTION__, static_cast<void *>(a_Entity.get()), a_Entity->GetClass(), a_Entity->GetUniqueID()\n\t\t);\n\n\t\tNeighbor = &m_ChunkMap->ConstructChunk(a_Entity->GetChunkX(), a_Entity->GetChunkZ());\n\t}\n\n\tASSERT(Neighbor != this);  // Moving into the same chunk? wtf?\n\tauto & Entity = *a_Entity;\n\tNeighbor->AddEntity(std::move(a_Entity));\n\n\tclass cMover :\n\t\tpublic cClientDiffCallback\n\t{\n\t\tvirtual void Removed(cClientHandle * a_Client) override\n\t\t{\n\t\t\ta_Client->SendDestroyEntity(m_Entity);\n\t\t}\n\n\t\tvirtual void Added(cClientHandle * a_Client) override\n\t\t{\n\t\t\tm_Entity.SpawnOn(*a_Client);\n\t\t}\n\n\t\tcEntity & m_Entity;\n\n\tpublic:\n\t\tcMover(cEntity & a_CallbackEntity) :\n\t\t\tm_Entity(a_CallbackEntity)\n\t\t{}\n\t} Mover(Entity);\n\n\tm_ChunkMap->CompareChunkClients(this, Neighbor, Mover);\n}\n\n\n\n\n\nvoid cChunk::CheckBlocks()\n{\n\tcChunkInterface ChunkInterface(m_World->GetChunkMap());\n\tcBlockInServerPluginInterface PluginInterface(*m_World);\n\n\t// Process a limited number of blocks since cBlockHandler::Check may queue more to tick\n\tauto Count = m_BlocksToCheck.size();\n\n\twhile (Count != 0)\n\t{\n\t\tconst auto Pos = m_BlocksToCheck.front();\n\t\tm_BlocksToCheck.pop();\n\t\tCount--;\n\n\t\tcBlockHandler::For(GetBlock(Pos)).Check(ChunkInterface, PluginInterface, Pos, *this);\n\t}\n}\n\n\n\n\n\nvoid cChunk::TickBlocks(void)\n{\n\tcChunkInterface ChunkInterface(m_World->GetChunkMap());\n\tcBlockInServerPluginInterface PluginInterface(*m_World);\n\n\t// Tick random blocks, but the first one should be m_BlockToTick (so that SetNextBlockToTick() works):\n\tcBlockHandler::For(GetBlock(m_BlockToTick)).OnUpdate(ChunkInterface, *m_World, PluginInterface, *this, m_BlockToTick);\n\n\tauto & Random = GetRandomProvider();\n\n\t// Set a new random coord for the next tick:\n\tm_BlockToTick = cChunkDef::IndexToCoordinate(Random.RandInt<size_t>(cChunkDef::NumBlocks - 1));\n\n\t// Choose a number of blocks for each section to randomly tick.\n\t// http://minecraft.wiki/w/Tick#Random_tick\n\tfor (size_t Y = 0; Y < cChunkDef::NumSections; ++Y)\n\t{\n\t\tconst auto Section = m_BlockData.GetSection(Y);\n\t\tif (Section == nullptr)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (int Tick = 0; Tick != 3; Tick++)  // TODO: configurability via gamerule randomTickSpeed\n\t\t{\n\t\t\tconst auto Index = Random.RandInt<size_t>(ChunkBlockData::SectionBlockCount - 1);\n\t\t\tconst auto Position = cChunkDef::IndexToCoordinate(Y * ChunkBlockData::SectionBlockCount + Index);\n\n\t\t\tcBlockHandler::For((*Section)[Index]).OnUpdate(ChunkInterface, *m_World, PluginInterface, *this, Position);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cChunk::ApplyWeatherToTop()\n{\n\tif (\n\t\t(GetRandomProvider().RandBool(0.99)) ||\n\t\t(\n\t\t\t(m_World->GetWeather() != eWeather_Rain) &&\n\t\t\t(m_World->GetWeather() != eWeather_ThunderStorm)\n\t\t)\n\t)\n\t{\n\t\t// Not the right weather, or not at this tick; bail out\n\t\treturn;\n\t}\n\n\tint X = m_World->GetTickRandomNumber(15);\n\tint Z = m_World->GetTickRandomNumber(15);\n\n\tint Height = GetHeight(X, Z);\n\n\tif (GetSnowStartHeight(GetBiomeAt(X, Z)) > Height)\n\t{\n\t\treturn;\n\t}\n\n\tif (GetBlockLight(X, Height, Z) > 10)\n\t{\n\t\t// Snow only generates on blocks with a block light level of 10 or less.\n\t\t// Ref: https://minecraft.wiki/w/Snow_(layer)#Snowfall\n\t\treturn;\n\t}\n\n\tBLOCKTYPE TopBlock = GetBlock(X, Height, Z);\n\tNIBBLETYPE TopMeta = GetMeta (X, Height, Z);\n\tif (m_World->IsDeepSnowEnabled() && (TopBlock == E_BLOCK_SNOW))\n\t{\n\t\tint MaxSize = 7;\n\t\tBLOCKTYPE  BlockType[4];\n\t\tNIBBLETYPE BlockMeta[4];\n\t\tUnboundedRelGetBlock(X - 1, Height, Z,     BlockType[0], BlockMeta[0]);\n\t\tUnboundedRelGetBlock(X + 1, Height, Z,     BlockType[1], BlockMeta[1]);\n\t\tUnboundedRelGetBlock(X,     Height, Z - 1, BlockType[2], BlockMeta[2]);\n\t\tUnboundedRelGetBlock(X,     Height, Z + 1, BlockType[3], BlockMeta[3]);\n\t\tfor (int i = 0; i < 4; i++)\n\t\t{\n\t\t\tswitch (BlockType[i])\n\t\t\t{\n\t\t\t\tcase E_BLOCK_AIR:\n\t\t\t\t{\n\t\t\t\t\tMaxSize = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase E_BLOCK_SNOW:\n\t\t\t\t{\n\t\t\t\t\tMaxSize = std::min(BlockMeta[i] + 1, MaxSize);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (TopMeta < MaxSize)\n\t\t{\n\t\t\tFastSetBlock(X, Height, Z, E_BLOCK_SNOW, TopMeta + 1);\n\t\t}\n\t\telse if (TopMeta > MaxSize)\n\t\t{\n\t\t\tFastSetBlock(X, Height, Z, E_BLOCK_SNOW, TopMeta - 1);\n\t\t}\n\t}\n\telse if (cBlockInfo::IsSnowable(TopBlock) && (Height < cChunkDef::Height - 1))\n\t{\n\t\tSetBlock({X, Height + 1, Z}, E_BLOCK_SNOW, 0);\n\t}\n\telse if (IsBlockWater(TopBlock) && (TopMeta == 0))\n\t{\n\t\tSetBlock({X, Height, Z}, E_BLOCK_ICE, 0);\n\t}\n\telse if (\n\t\t(m_World->IsDeepSnowEnabled()) &&\n\t\t(\n\t\t\t(TopBlock == E_BLOCK_RED_ROSE) ||\n\t\t\t(TopBlock == E_BLOCK_YELLOW_FLOWER) ||\n\t\t\t(TopBlock == E_BLOCK_RED_MUSHROOM) ||\n\t\t\t(TopBlock == E_BLOCK_BROWN_MUSHROOM)\n\t\t)\n\t)\n\t{\n\t\tSetBlock({X, Height, Z}, E_BLOCK_SNOW, 0);\n\t}\n}\n\n\n\n\n\ncItems cChunk::PickupsFromBlock(Vector3i a_RelPos, const cEntity * a_Digger, const cItem * a_Tool)\n{\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\tGetBlockTypeMeta(a_RelPos, BlockType, BlockMeta);\n\n\tcItems Pickups;\n\tconst auto BlockEntity = GetBlockEntityRel(a_RelPos);\n\n\tif ((a_Tool == nullptr) || a_Tool->GetHandler().CanHarvestBlock(BlockType))\n\t{\n\t\tPickups = cBlockHandler::For(BlockType).ConvertToPickups(BlockMeta, a_Tool);\n\n\t\tif (BlockEntity != nullptr)\n\t\t{\n\t\t\tauto BlockEntityPickups = BlockEntity->ConvertToPickups();\n\t\t\tPickups.insert(Pickups.end(), std::make_move_iterator(BlockEntityPickups.begin()), std::make_move_iterator(BlockEntityPickups.end()));\n\t\t}\n\t}\n\n\t// TODO: this should be in cWorld::DropBlockAsPickups. When it's here we can't check the return value and cancel spawning:\n\tcRoot::Get()->GetPluginManager()->CallHookBlockToPickups(\n\t\t*m_World,\n\t\tcChunkDef::RelativeToAbsolute(a_RelPos, GetPos()),\n\t\tBlockType, BlockMeta, BlockEntity,\n\t\ta_Digger, a_Tool, Pickups\n\t);\n\n\treturn Pickups;\n}\n\n\n\n\n\nint cChunk::GrowPlantAt(Vector3i a_RelPos, int a_NumStages)\n{\n\treturn cBlockHandler::For(GetBlock(a_RelPos)).Grow(*this, a_RelPos, a_NumStages);\n}\n\n\n\n\n\nbool cChunk::UnboundedRelGetBlock(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n{\n\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t{\n\t\tLOGWARNING(\"%s: requesting a block with a_RelY out of range: %d\", __FUNCTION__, a_RelPos.y);\n\t\treturn false;\n\t}\n\tauto chunk = GetRelNeighborChunkAdjustCoords(a_RelPos);\n\tif ((chunk == nullptr) || !chunk->IsValid())\n\t{\n\t\t// The chunk is not available, bail out\n\t\treturn false;\n\t}\n\tchunk->GetBlockTypeMeta(a_RelPos, a_BlockType, a_BlockMeta);\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::UnboundedRelGetBlockType(Vector3i a_RelPos, BLOCKTYPE & a_BlockType) const\n{\n\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t{\n\t\tLOGWARNING(\"%s: requesting a block with a_RelY out of range: %d\", __FUNCTION__, a_RelPos.y);\n\t\treturn false;\n\t}\n\tauto chunk = GetRelNeighborChunkAdjustCoords(a_RelPos);\n\tif ((chunk == nullptr) || !chunk->IsValid())\n\t{\n\t\t// The chunk is not available, bail out\n\t\treturn false;\n\t}\n\ta_BlockType = chunk->GetBlock(a_RelPos);\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::UnboundedRelGetBlockMeta(Vector3i a_RelPos, NIBBLETYPE & a_BlockMeta) const\n{\n\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t{\n\t\tLOGWARNING(\"%s: requesting a block with a_RelY out of range: %d\", __FUNCTION__, a_RelPos.y);\n\t\treturn false;\n\t}\n\tauto chunk = GetRelNeighborChunkAdjustCoords(a_RelPos);\n\tif ((chunk == nullptr) || !chunk->IsValid())\n\t{\n\t\t// The chunk is not available, bail out\n\t\treturn false;\n\t}\n\ta_BlockMeta = chunk->GetMeta(a_RelPos);\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::UnboundedRelGetBlockBlockLight(Vector3i a_RelPos, NIBBLETYPE & a_BlockBlockLight) const\n{\n\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t{\n\t\tLOGWARNING(\"%s: requesting a block with a_RelY out of range: %d\", __FUNCTION__, a_RelPos.y);\n\t\treturn false;\n\t}\n\tauto chunk = GetRelNeighborChunkAdjustCoords(a_RelPos);\n\tif ((chunk == nullptr) || !chunk->IsValid())\n\t{\n\t\t// The chunk is not available, bail out\n\t\treturn false;\n\t}\n\ta_BlockBlockLight = chunk->GetBlockLight(a_RelPos);\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::UnboundedRelGetBlockSkyLight(Vector3i a_RelPos, NIBBLETYPE & a_BlockSkyLight) const\n{\n\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t{\n\t\tLOGWARNING(\"%s: requesting a block with a_RelY out of range: %d\", __FUNCTION__, a_RelPos.y);\n\t\treturn false;\n\t}\n\tauto chunk = GetRelNeighborChunkAdjustCoords(a_RelPos);\n\tif ((chunk == nullptr) || !chunk->IsValid())\n\t{\n\t\t// The chunk is not available, bail out\n\t\treturn false;\n\t}\n\ta_BlockSkyLight = chunk->GetSkyLight(a_RelPos);\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::UnboundedRelGetBlockLights(Vector3i a_RelPos, NIBBLETYPE & a_BlockLight, NIBBLETYPE & a_SkyLight) const\n{\n\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t{\n\t\tLOGWARNING(\"%s: requesting a block with a_RelY out of range: %d\", __FUNCTION__, a_RelPos.y);\n\t\treturn false;\n\t}\n\tauto chunk = GetRelNeighborChunkAdjustCoords(a_RelPos);\n\tif ((chunk == nullptr) || !chunk->IsValid())\n\t{\n\t\t// The chunk is not available, bail out\n\t\treturn false;\n\t}\n\ta_BlockLight = chunk->GetBlockLight(a_RelPos);\n\ta_SkyLight   = chunk->GetSkyLight  (a_RelPos);\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::UnboundedRelSetBlock(Vector3i a_RelPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t{\n\t\tLOGWARNING(\"%s: requesting a block with a_RelY out of range: %d\", __FUNCTION__, a_RelPos.y);\n\t\treturn false;\n\t}\n\tauto chunk = GetRelNeighborChunkAdjustCoords(a_RelPos);\n\tif ((chunk == nullptr) || !chunk->IsValid())\n\t{\n\t\t// The chunk is not available, bail out\n\t\treturn false;\n\t}\n\tchunk->SetBlock(a_RelPos, a_BlockType, a_BlockMeta);\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::UnboundedRelFastSetBlock(Vector3i a_RelPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tif (!cChunkDef::IsValidHeight(a_RelPos))\n\t{\n\t\tLOGWARNING(\"%s: requesting a block with a_RelY out of range: %d\", __FUNCTION__, a_RelPos.y);\n\t\treturn false;\n\t}\n\tauto chunk = GetRelNeighborChunkAdjustCoords(a_RelPos);\n\tif ((chunk == nullptr) || !chunk->IsValid())\n\t{\n\t\t// The chunk is not available, bail out\n\t\treturn false;\n\t}\n\tchunk->FastSetBlock(a_RelPos, a_BlockType, a_BlockMeta);\n\treturn true;\n}\n\n\n\n\n\nint cChunk::GetHeight(int a_X, int a_Z) const\n{\n\tASSERT((a_X >= 0) && (a_X < cChunkDef::Width) && (a_Z >= 0) && (a_Z < cChunkDef::Width));\n\treturn m_HeightMap[a_X + a_Z * cChunkDef::Width];\n}\n\n\n\n\n\nbool cChunk::IsWeatherSunnyAt(int a_RelX, int a_RelZ) const\n{\n\treturn m_World->IsWeatherSunny() || IsBiomeNoDownfall(GetBiomeAt(a_RelX, a_RelZ));\n}\n\n\n\n\n\nbool cChunk::IsWeatherWetAt(const int a_RelX, const int a_RelZ) const\n{\n\tconst auto Biome = GetBiomeAt(a_RelX, a_RelZ);\n\treturn m_World->IsWeatherWet() && !IsBiomeNoDownfall(Biome) && !IsBiomeCold(Biome);\n}\n\n\n\n\n\nbool cChunk::IsWeatherWetAt(const Vector3i a_Position) const\n{\n\tif ((a_Position.y < 0) || !IsWeatherWetAt(a_Position.x, a_Position.z))\n\t{\n\t\treturn false;\n\t}\n\n\tif (a_Position.y >= cChunkDef::Height)\n\t{\n\t\treturn true;\n\t}\n\n\tfor (int y = GetHeight(a_Position.x, a_Position.z); y >= a_Position.y; y--)\n\t{\n\t\tif (cBlockInfo::IsRainBlocker(GetBlock({ a_Position.x, y, a_Position.z })))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cChunk::WakeUpSimulators(void)\n{\n\tauto * WaterSimulator = m_World->GetWaterSimulator();\n\tauto * LavaSimulator  = m_World->GetLavaSimulator();\n\tauto * RedstoneSimulator = m_World->GetRedstoneSimulator();\n\n\tfor (size_t SectionIdx = 0; SectionIdx != cChunkDef::NumSections; ++SectionIdx)\n\t{\n\t\tconst auto * Section = m_BlockData.GetSection(SectionIdx);\n\t\tif (Section == nullptr)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (size_t BlockIdx = 0; BlockIdx != ChunkBlockData::SectionBlockCount; ++BlockIdx)\n\t\t{\n\t\t\tconst auto BlockType = (*Section)[BlockIdx];\n\t\t\tconst auto Position = cChunkDef::IndexToCoordinate(BlockIdx + SectionIdx * ChunkBlockData::SectionBlockCount);\n\n\t\t\tRedstoneSimulator->AddBlock(*this, Position, BlockType);\n\t\t\tWaterSimulator->AddBlock(*this, Position, BlockType);\n\t\t\tLavaSimulator->AddBlock(*this, Position, BlockType);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cChunk::SetBlock(Vector3i a_RelPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tFastSetBlock(a_RelPos, a_BlockType, a_BlockMeta);\n\n\t// Queue a check of this block's neighbors:\n\tm_BlocksToCheck.push(a_RelPos);\n\n\t// Wake up the simulators for this block:\n\tGetWorld()->GetSimulatorManager()->WakeUp(*this, a_RelPos);\n\n\t// If there was a block entity, remove it:\n\tif (const auto FindResult = m_BlockEntities.find(cChunkDef::MakeIndex(a_RelPos)); FindResult != m_BlockEntities.end())\n\t{\n\t\tauto & BlockEntity = *FindResult->second;\n\n\t\tBlockEntity.Destroy();\n\t\tBlockEntity.OnRemoveFromWorld();\n\n\t\tm_BlockEntities.erase(FindResult);\n\t\tm_PendingSendBlockEntities.erase(std::remove(m_PendingSendBlockEntities.begin(), m_PendingSendBlockEntities.end(), &BlockEntity), m_PendingSendBlockEntities.end());\n\t}\n\n\t// If the new block is a block entity, create the entity object:\n\tif (cBlockEntity::IsBlockEntityBlockType(a_BlockType))\n\t{\n\t\tAddBlockEntity(cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, RelativeToAbsolute(a_RelPos), m_World));\n\t}\n}\n\n\n\n\n\nvoid cChunk::FastSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, BLOCKTYPE a_BlockMeta)\n{\n\tASSERT(cChunkDef::IsValidRelPos({ a_RelX, a_RelY, a_RelZ }));\n\tASSERT(IsValid());\n\n\tconst BLOCKTYPE OldBlockType = GetBlock(a_RelX, a_RelY, a_RelZ);\n\tconst BLOCKTYPE OldBlockMeta = m_BlockData.GetMeta({ a_RelX, a_RelY, a_RelZ });\n\tif ((OldBlockType == a_BlockType) && (OldBlockMeta == a_BlockMeta))\n\t{\n\t\treturn;\n\t}\n\n\tbool ReplacingLiquids = (\n\t\t((OldBlockType == E_BLOCK_STATIONARY_WATER) && (a_BlockType == E_BLOCK_WATER)) ||             // Replacing stationary water with water\n\t\t((OldBlockType == E_BLOCK_WATER)            && (a_BlockType == E_BLOCK_STATIONARY_WATER)) ||  // Replacing water with stationary water\n\t\t((OldBlockType == E_BLOCK_STATIONARY_LAVA)  && (a_BlockType == E_BLOCK_LAVA)) ||              // Replacing stationary lava with lava\n\t\t((OldBlockType == E_BLOCK_LAVA)             && (a_BlockType == E_BLOCK_STATIONARY_LAVA))      // Replacing lava with stationary lava\n\t);\n\n\tif (!ReplacingLiquids)\n\t{\n\t\tMarkDirty();\n\t}\n\n\tm_BlockData.SetBlock({ a_RelX, a_RelY, a_RelZ }, a_BlockType);\n\n\t// Queue block to be sent only if ...\n\tif (\n\t\t!(                                // ... the old and new blocktypes AREN'T leaves (because the client doesn't need meta updates)\n\t\t\t((OldBlockType == E_BLOCK_LEAVES) && (a_BlockType == E_BLOCK_LEAVES)) ||\n\t\t\t((OldBlockType == E_BLOCK_NEW_LEAVES) && (a_BlockType == E_BLOCK_NEW_LEAVES))\n\t\t) &&                              // ... AND ...\n\t\t(\n\t\t\t(OldBlockMeta != a_BlockMeta) || (!ReplacingLiquids)\n\t\t)\n\t)\n\t{\n\t\tm_PendingSendBlocks.emplace_back(m_PosX, m_PosZ, a_RelX, a_RelY, a_RelZ, a_BlockType, a_BlockMeta);\n\t}\n\n\tm_BlockData.SetMeta({ a_RelX, a_RelY, a_RelZ }, a_BlockMeta);\n\n\t// ONLY recalculate lighting if it's necessary!\n\tif (\n\t\t(cBlockInfo::GetLightValue        (OldBlockType) != cBlockInfo::GetLightValue        (a_BlockType)) ||\n\t\t(cBlockInfo::GetSpreadLightFalloff(OldBlockType) != cBlockInfo::GetSpreadLightFalloff(a_BlockType)) ||\n\t\t(cBlockInfo::IsTransparent        (OldBlockType) != cBlockInfo::IsTransparent        (a_BlockType))\n\t)\n\t{\n\t\tm_IsLightValid = false;\n\t}\n\n\t// Update heightmap, if needed:\n\tif (a_RelY >= m_HeightMap[a_RelX + a_RelZ * cChunkDef::Width])\n\t{\n\t\tif (a_BlockType != E_BLOCK_AIR)\n\t\t{\n\t\t\tm_HeightMap[a_RelX + a_RelZ * cChunkDef::Width] = static_cast<HEIGHTTYPE>(a_RelY);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int y = a_RelY - 1; y > 0; --y)\n\t\t\t{\n\t\t\t\tif (GetBlock(a_RelX, y, a_RelZ) != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\tm_HeightMap[a_RelX + a_RelZ * cChunkDef::Width] = static_cast<HEIGHTTYPE>(y);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for y - column in m_BlockData\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cChunk::SendBlockTo(int a_RelX, int a_RelY, int a_RelZ, cClientHandle * a_Client)\n{\n\tconst auto BlockEntity = GetBlockEntityRel({ a_RelX, a_RelY, a_RelZ });\n\n\tif (a_Client == nullptr)\n\t{\n\t\t// Queue the block (entity) for all clients in the chunk (will be sent in BroadcastPendingBlockChanges()):\n\t\tm_PendingSendBlocks.emplace_back(m_PosX, m_PosZ, a_RelX, a_RelY, a_RelZ, GetBlock(a_RelX, a_RelY, a_RelZ), GetMeta(a_RelX, a_RelY, a_RelZ));\n\t\tif (BlockEntity != nullptr)\n\t\t{\n\t\t\tm_PendingSendBlockEntities.push_back(BlockEntity);\n\t\t}\n\t\treturn;\n\t}\n\n\tconst auto Position = PositionToWorldPosition(a_RelX, a_RelY, a_RelZ);\n\ta_Client->SendBlockChange(Position, GetBlock(a_RelX, a_RelY, a_RelZ), GetMeta(a_RelX, a_RelY, a_RelZ));\n\n\t// FS #268 - if a BlockEntity digging is cancelled by a plugin, the entire block entity must be re-sent to the client:\n\tif (BlockEntity != nullptr)\n\t{\n\t\tBlockEntity->SendTo(*a_Client);\n\t}\n}\n\n\n\n\n\nvoid cChunk::AddBlockEntity(OwnedBlockEntity a_BlockEntity)\n{\n\tconst auto BlockEntityPtr = a_BlockEntity.get();\n\t[[maybe_unused]] const auto Result = m_BlockEntities.emplace(\n\t\tcChunkDef::MakeIndex(a_BlockEntity->GetRelX(), a_BlockEntity->GetPosY(), a_BlockEntity->GetRelZ()),\n\t\tstd::move(a_BlockEntity)\n\t);\n\n\tASSERT(Result.second);  // No block entity already at this position.\n\tBlockEntityPtr->OnAddToWorld(*m_World, *this);\n}\n\n\n\n\n\ncBlockEntity * cChunk::GetBlockEntity(Vector3i a_AbsPos)\n{\n\tconst auto relPos = cChunkDef::AbsoluteToRelative(a_AbsPos);\n\n\tif (!cChunkDef::IsValidRelPos(relPos))\n\t{\n\t\t// Coordinates are outside outside this chunk, no block entities here\n\t\treturn nullptr;\n\t}\n\n\tauto itr = m_BlockEntities.find(cChunkDef::MakeIndex(relPos));\n\treturn (itr == m_BlockEntities.end()) ? nullptr : itr->second.get();\n}\n\n\n\n\n\ncBlockEntity * cChunk::GetBlockEntityRel(Vector3i a_RelPos)\n{\n\tASSERT(cChunkDef::IsValidRelPos(a_RelPos));\n\tauto itr = m_BlockEntities.find(cChunkDef::MakeIndex(a_RelPos));\n\treturn (itr == m_BlockEntities.end()) ? nullptr : itr->second.get();\n}\n\n\n\n\n\nbool cChunk::ShouldBeTicked(void) const\n{\n\treturn IsValid() && (HasAnyClients() || (m_AlwaysTicked > 0));\n}\n\n\n\n\n\nvoid cChunk::SetAlwaysTicked(bool a_AlwaysTicked)\n{\n\tif (a_AlwaysTicked)\n\t{\n\t\tm_AlwaysTicked += 1;\n\t\tStay(a_AlwaysTicked);\n\t}\n\telse\n\t{\n\t\tm_AlwaysTicked -= 1;\n\t\tStay(a_AlwaysTicked);\n\t}\n}\n\n\n\n\n\nbool cChunk::UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z)\n{\n\tcBlockEntity * be = GetBlockEntity(a_X, a_Y, a_Z);\n\tif (be != nullptr)\n\t{\n\t\treturn be->UsedBy(a_Player);\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cChunk::SetBiomeAt(int a_RelX, int a_RelZ, EMCSBiome a_Biome)\n{\n\tcChunkDef::SetBiome(m_BiomeMap, a_RelX, a_RelZ, a_Biome);\n\tMarkDirty();\n}\n\n\n\n\n\nvoid cChunk::SetAreaBiome(int a_MinRelX, int a_MaxRelX, int a_MinRelZ, int a_MaxRelZ, EMCSBiome a_Biome)\n{\n\tfor (int z = a_MinRelZ; z <= a_MaxRelZ; z++)\n\t{\n\t\tfor (int x = a_MinRelX; x <= a_MaxRelX; x++)\n\t\t{\n\t\t\tcChunkDef::SetBiome(m_BiomeMap, x, z, a_Biome);\n\t\t}\n\t}\n\tMarkDirty();\n\n\t// Re-send the chunk to all clients:\n\tfor (auto ClientHandle : m_LoadedByClient)\n\t{\n\t\tm_World->ForceSendChunkTo(m_PosX, m_PosZ, cChunkSender::Priority::Medium, ClientHandle);\n\t}  // for itr - m_LoadedByClient[]\n}\n\n\n\n\n\nbool cChunk::AddClient(cClientHandle * a_Client)\n{\n\tif (std::find(m_LoadedByClient.begin(), m_LoadedByClient.end(), a_Client) != m_LoadedByClient.end())\n\t{\n\t\t// Already there, nothing needed\n\t\treturn false;\n\t}\n\n\tm_LoadedByClient.push_back(a_Client);\n\treturn true;\n}\n\n\n\n\n\nvoid cChunk::RemoveClient(cClientHandle * a_Client)\n{\n\tauto itr = std::remove(m_LoadedByClient.begin(), m_LoadedByClient.end(), a_Client);\n\t// We should always remove at most one client.\n\tASSERT(std::distance(itr, m_LoadedByClient.end()) <= 1);\n\t// Note: itr can equal m_LoadedByClient.end()\n\tm_LoadedByClient.erase(itr, m_LoadedByClient.end());\n\n\tif (!a_Client->IsDestroyed())\n\t{\n\t\tfor (auto & Entity : m_Entities)\n\t\t{\n\t\t\t/*\n\t\t\t// DEBUG:\n\t\t\tLOGD(\"chunk [%i, %i] destroying entity #%i for player \\\"%s\\\"\",\n\t\t\t\tm_PosX, m_PosZ,\n\t\t\t\t(*itr)->GetUniqueID(), a_Client->GetUsername().c_str()\n\t\t\t);\n\t\t\t*/\n\t\t\ta_Client->SendDestroyEntity(*Entity);\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cChunk::HasClient(cClientHandle * a_Client)\n{\n\treturn std::find(m_LoadedByClient.begin(), m_LoadedByClient.end(), a_Client) != m_LoadedByClient.end();\n}\n\n\n\n\n\nbool cChunk::HasAnyClients(void) const\n{\n\treturn !m_LoadedByClient.empty();\n}\n\n\n\n\n\nvoid cChunk::AddEntity(OwnedEntity a_Entity)\n{\n\tif (!a_Entity->IsPlayer())\n\t{\n\t\tMarkDirty();\n\t}\n\n\tauto EntityPtr = a_Entity.get();\n\n\tASSERT(std::find(m_Entities.begin(), m_Entities.end(), a_Entity) == m_Entities.end());  // Not there already\n\tm_Entities.emplace_back(std::move(a_Entity));\n\n\tASSERT(EntityPtr->GetParentChunk() == nullptr);\n\tEntityPtr->SetParentChunk(this);\n}\n\n\n\n\n\nOwnedEntity cChunk::RemoveEntity(cEntity & a_Entity)\n{\n\tASSERT(a_Entity.GetParentChunk() == this);\n\tASSERT(!a_Entity.IsTicking());\n\ta_Entity.SetParentChunk(nullptr);\n\n\t// Mark as dirty if it was a server-generated entity:\n\tif (!a_Entity.IsPlayer())\n\t{\n\t\tMarkDirty();\n\t}\n\n\tOwnedEntity Removed;\n\tm_Entities.erase(\n\t\tstd::remove_if(\n\t\t\tm_Entities.begin(),\n\t\t\tm_Entities.end(),\n\t\t\t[&a_Entity, &Removed](decltype(m_Entities)::value_type & a_Value)\n\t\t\t{\n\t\t\t\tif (a_Value.get() == &a_Entity)\n\t\t\t\t{\n\t\t\t\t\tASSERT(!Removed);\n\t\t\t\t\tRemoved = std::move(a_Value);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t),\n\t\tm_Entities.end()\n\t);\n\n\treturn Removed;\n}\n\n\n\n\n\nbool cChunk::HasEntity(UInt32 a_EntityID) const\n{\n\tfor (const auto & Entity : m_Entities)\n\t{\n\t\tif (Entity->GetUniqueID() == a_EntityID)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cChunk::ForEachEntity(cEntityCallback a_Callback) const\n{\n\t// The entity list is locked by the parent chunkmap's CS\n\tfor (const auto & Entity : m_Entities)\n\t{\n\t\tif (Entity->IsTicking() && a_Callback(*Entity))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - m_Entitites[]\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback) const\n{\n\t// The entity list is locked by the parent chunkmap's CS\n\tfor (const auto & Entity : m_Entities)\n\t{\n\t\tif (!Entity->IsTicking())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (!Entity->GetBoundingBox().DoesIntersect(a_Box))\n\t\t{\n\t\t\t// The entity is not in the specified box\n\t\t\tcontinue;\n\t\t}\n\t\tif (a_Callback(*Entity))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - m_Entitites[]\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::DoWithEntityByID(UInt32 a_EntityID, cEntityCallback a_Callback, bool & a_CallbackResult) const\n{\n\t// The entity list is locked by the parent chunkmap's CS\n\tfor (const auto & Entity : m_Entities)\n\t{\n\t\tif ((Entity->GetUniqueID() == a_EntityID) && (Entity->IsTicking()))\n\t\t{\n\t\t\ta_CallbackResult = a_Callback(*Entity);\n\t\t\treturn true;\n\t\t}\n\t}  // for itr - m_Entitites[]\n\treturn false;\n}\n\n\n\n\n\nbool cChunk::ForEachBlockEntity(cBlockEntityCallback a_Callback)\n{\n\t// The blockentity list is locked by the parent chunkmap's CS\n\n\tfor (auto & KeyPair : m_BlockEntities)\n\t{\n\t\tif (a_Callback(*KeyPair.second))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cChunk::DoWithBlockEntityAt(Vector3i a_Position, cBlockEntityCallback a_Callback)\n{\n\t// The blockentity list is locked by the parent chunkmap's CS\n\n\tconst auto BlockEntity = GetBlockEntityRel(a_Position);\n\tif (BlockEntity == nullptr)\n\t{\n\t\treturn false;  // No block entity here\n\t}\n\n\tconst bool Result = a_Callback(*BlockEntity);\n\tm_PendingSendBlockEntities.push_back(BlockEntity);\n\tMarkDirty();\n\treturn Result;\n}\n\n\n\n\n\nvoid cChunk::GetBlockTypeMeta(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n{\n\ta_BlockType = GetBlock(a_RelPos);\n\ta_BlockMeta = GetMeta(a_RelPos);\n}\n\n\n\n\n\nvoid cChunk::GetBlockInfo(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const\n{\n\ta_BlockType  = GetBlock(a_RelPos);\n\ta_Meta       = m_BlockData.GetMeta(a_RelPos);\n\ta_SkyLight   = m_LightData.GetSkyLight(a_RelPos);\n\ta_BlockLight = m_LightData.GetBlockLight(a_RelPos);\n}\n\n\n\n\n\nbool cChunk::GetChunkAndRelByAbsolute(const Vector3d & a_Position, cChunk ** a_Chunk, Vector3i & a_Rel)\n{\n\treturn GetChunkAndRelByAbsolute(Vector3i(FloorC(a_Position.x), FloorC(a_Position.y), FloorC(a_Position.z)), a_Chunk, a_Rel);\n}\n\n\n\n\n\nbool cChunk::GetChunkAndRelByAbsolute(const Vector3i & a_Position, cChunk ** a_Chunk, Vector3i & a_Rel)\n{\n\t*a_Chunk = this->GetNeighborChunk(a_Position.x, a_Position.z);\n\tif ((*a_Chunk == nullptr) || !(*a_Chunk)->IsValid())\n\t{\n\t\treturn false;\n\t}\n\n\ta_Rel.x = a_Position.x - (*a_Chunk)->GetPosX() * cChunkDef::Width;\n\ta_Rel.y = a_Position.y;\n\ta_Rel.z = a_Position.z - (*a_Chunk)->GetPosZ() * cChunkDef::Width;\n\treturn true;\n}\n\n\n\n\n\ncChunk * cChunk::GetNeighborChunk(int a_BlockX, int a_BlockZ)\n{\n\t// Convert coords to relative, then call the relative version:\n\ta_BlockX -= m_PosX * cChunkDef::Width;\n\ta_BlockZ -= m_PosZ * cChunkDef::Width;\n\treturn GetRelNeighborChunk(a_BlockX, a_BlockZ);\n}\n\n\n\n\n\ncChunk * cChunk::GetRelNeighborChunk(int a_RelX, int a_RelZ)\n{\n\t// If the relative coords are too far away, use the parent's chunk lookup instead:\n\tif ((a_RelX < -128) || (a_RelX > 128) || (a_RelZ < -128) || (a_RelZ > 128))\n\t{\n\t\tint BlockX = m_PosX * cChunkDef::Width + a_RelX;\n\t\tint BlockZ = m_PosZ * cChunkDef::Width + a_RelZ;\n\t\tint ChunkX, ChunkZ;\n\t\tcChunkDef::BlockToChunk(BlockX, BlockZ, ChunkX, ChunkZ);\n\t\treturn m_ChunkMap->FindChunk(ChunkX, ChunkZ);\n\t}\n\n\t// Walk the neighbors:\n\tbool ReturnThis = true;\n\tif (a_RelX < 0)\n\t{\n\t\tif (m_NeighborXM != nullptr)\n\t\t{\n\t\t\tcChunk * Candidate = m_NeighborXM->GetRelNeighborChunk(a_RelX + cChunkDef::Width, a_RelZ);\n\t\t\tif (Candidate != nullptr)\n\t\t\t{\n\t\t\t\treturn Candidate;\n\t\t\t}\n\t\t}\n\t\t// Going X first failed, but if the request is crossing Z as well, let's try the Z first later on.\n\t\tReturnThis = false;\n\t}\n\telse if (a_RelX >= cChunkDef::Width)\n\t{\n\t\tif (m_NeighborXP != nullptr)\n\t\t{\n\t\t\tcChunk * Candidate = m_NeighborXP->GetRelNeighborChunk(a_RelX - cChunkDef::Width, a_RelZ);\n\t\t\tif (Candidate != nullptr)\n\t\t\t{\n\t\t\t\treturn Candidate;\n\t\t\t}\n\t\t}\n\t\t// Going X first failed, but if the request is crossing Z as well, let's try the Z first later on.\n\t\tReturnThis = false;\n\t}\n\n\tif (a_RelZ < 0)\n\t{\n\t\tif (m_NeighborZM != nullptr)\n\t\t{\n\t\t\treturn m_NeighborZM->GetRelNeighborChunk(a_RelX, a_RelZ + cChunkDef::Width);\n\t\t\t// For requests crossing both X and Z, the X-first way has been already tried\n\t\t}\n\t\treturn nullptr;\n\t}\n\telse if (a_RelZ >= cChunkDef::Width)\n\t{\n\t\tif (m_NeighborZP != nullptr)\n\t\t{\n\t\t\treturn m_NeighborZP->GetRelNeighborChunk(a_RelX, a_RelZ - cChunkDef::Width);\n\t\t\t// For requests crossing both X and Z, the X-first way has been already tried\n\t\t}\n\t\treturn nullptr;\n\t}\n\n\treturn (ReturnThis ? this : nullptr);\n}\n\n\n\n\n\ncChunk * cChunk::GetRelNeighborChunkAdjustCoords(Vector3i & a_RelPos) const\n{\n\tcChunk * ToReturn = const_cast<cChunk *>(this);\n\n\t// The most common case: inside this chunk:\n\tif (\n\t\t(a_RelPos.x >= 0) && (a_RelPos.x < cChunkDef::Width) &&\n\t\t(a_RelPos.z >= 0) && (a_RelPos.z < cChunkDef::Width)\n\t)\n\t{\n\t\treturn ToReturn;\n\t}\n\n\t// Request for a different chunk, calculate chunk offset:\n\tint RelX = a_RelPos.x;  // Make a local copy of the coords (faster access)\n\tint RelZ = a_RelPos.z;\n\twhile ((RelX >= cChunkDef::Width) && (ToReturn != nullptr))\n\t{\n\t\tRelX -= cChunkDef::Width;\n\t\tToReturn = ToReturn->m_NeighborXP;\n\t}\n\twhile ((RelX < 0) && (ToReturn != nullptr))\n\t{\n\t\tRelX += cChunkDef::Width;\n\t\tToReturn = ToReturn->m_NeighborXM;\n\t}\n\twhile ((RelZ >= cChunkDef::Width) && (ToReturn != nullptr))\n\t{\n\t\tRelZ -= cChunkDef::Width;\n\t\tToReturn = ToReturn->m_NeighborZP;\n\t}\n\twhile ((RelZ < 0) && (ToReturn != nullptr))\n\t{\n\t\tRelZ += cChunkDef::Width;\n\t\tToReturn = ToReturn->m_NeighborZM;\n\t}\n\tif (ToReturn != nullptr)\n\t{\n\t\ta_RelPos.x = RelX;\n\t\ta_RelPos.z = RelZ;\n\t\treturn ToReturn;\n\t}\n\n\t// The chunk cannot be walked through neighbors, find it through the chunkmap:\n\tint AbsX = a_RelPos.x + m_PosX * cChunkDef::Width;\n\tint AbsZ = a_RelPos.z + m_PosZ * cChunkDef::Width;\n\tint DstChunkX, DstChunkZ;\n\tcChunkDef::BlockToChunk(AbsX, AbsZ, DstChunkX, DstChunkZ);\n\tToReturn = m_ChunkMap->FindChunk(DstChunkX, DstChunkZ);\n\ta_RelPos.x = AbsX - DstChunkX * cChunkDef::Width;\n\ta_RelPos.z = AbsZ - DstChunkZ * cChunkDef::Width;\n\treturn ToReturn;\n}\n\n\n\n\n\nvoid cChunk::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client)\n{\n\tcBlockEntity * Entity = GetBlockEntity(a_BlockX, a_BlockY, a_BlockZ);\n\tif (Entity == nullptr)\n\t{\n\t\treturn;\n\t}\n\tEntity->SendTo(a_Client);\n}\n\n\n\n\n\nvoid cChunk::PositionToWorldPosition(int a_RelX, int a_RelY, int a_RelZ, int & a_BlockX, int & a_BlockY, int & a_BlockZ)\n{\n\ta_BlockY = a_RelY;\n\ta_BlockX = m_PosX * cChunkDef::Width + a_RelX;\n\ta_BlockZ = m_PosZ * cChunkDef::Width + a_RelZ;\n}\n\n\n\n\n\nVector3i cChunk::PositionToWorldPosition(int a_RelX, int a_RelY, int a_RelZ)\n{\n\treturn Vector3i(m_PosX * cChunkDef::Width + a_RelX, a_RelY, m_PosZ * cChunkDef::Width + a_RelZ);\n}\n\n\n\n\n\nNIBBLETYPE cChunk::GetTimeAlteredLight(NIBBLETYPE a_Skylight) const\n{\n\ta_Skylight -= m_World->GetSkyDarkness();\n\t// Because NIBBLETYPE is unsigned, we clamp it to 0 .. 15 by checking for values above 15\n\treturn (a_Skylight < 16)? a_Skylight : 0;\n}\n\n\n\n\n\nbool cChunk::IsSlimeChunk() const\n{\n\treturn m_World->IsSlimeChunk(m_PosX, m_PosZ);\n}\n"
  },
  {
    "path": "src/Chunk.h",
    "content": "\n#pragma once\n\n#include \"BlockEntities/BlockEntity.h\"\n#include \"ChunkData.h\"\n\n#include \"Simulator/FireSimulator.h\"\n#include \"Simulator/SandSimulator.h\"\n\n#include \"ChunkMap.h\"\n\n\n\n\n\nclass cWorld;\nclass cClientHandle;\nclass cPlayer;\nclass cChunkMap;\nclass cBoundingBox;\nclass cChunkDataCallback;\nclass cBlockArea;\nclass cBlockArea;\nclass cFluidSimulatorData;\nclass cMobCensus;\nclass cMobSpawner;\nclass cRedstoneSimulatorChunkData;\n\nstruct SetChunkData;\n\n// A convenience macro for calling GetChunkAndRelByAbsolute.\n#define PREPARE_REL_AND_CHUNK(Position, OriginalChunk) cChunk * Chunk; Vector3i Rel; bool RelSuccess = (OriginalChunk).GetChunkAndRelByAbsolute(Position, &Chunk, Rel)\n\n\nclass cChunk\n{\npublic:\n\n\t/** Represents the presence state of the chunk */\n\tenum ePresence\n\t{\n\t\tcpInvalid,  /**< The chunk is not present at all and is not queued in the loader / generator */\n\t\tcpQueued,   /**< The chunk is not present, but is queued for loading / generation */\n\t\tcpPresent,  /**< The chunk is present */\n\t};\n\n\tcChunk(\n\t\tint a_ChunkX, int a_ChunkZ,   // Chunk coords\n\t\tcChunkMap * a_ChunkMap, cWorld * a_World   // Parent objects\n\t);\n\tcChunk(const cChunk & Other) = delete;\n\t~cChunk();\n\n\t/** Flushes the pending block (entity) queue, and clients' outgoing data buffers. */\n\tvoid BroadcastPendingChanges(void);\n\n\t/** Returns true iff the chunk block data is valid (loaded / generated) */\n\tbool IsValid(void) const {return (m_Presence == cpPresent); }\n\n\t/** Returns true iff the chunk is in the queue for loading / generating */\n\tbool IsQueued(void) const {return (m_Presence == cpQueued); }\n\n\t/** Sets the chunk's presence.\n\tWakes up any calls to cChunkMap::GetHeight() when setting to cpPresent. */\n\tvoid SetPresence(ePresence a_Presence);\n\n\t/** Marks all clients attached to this chunk as wanting this chunk. Also sets presence to cpQueued. */\n\tvoid MarkRegenerating(void);\n\n\t/** Returns true iff the chunk has changed since it was last saved. */\n\tbool IsDirty(void) const {return m_IsDirty; }\n\n\tbool CanUnload(void) const;\n\n\t/** Returns true if the chunk could have been unloaded if it weren't dirty */\n\tbool CanUnloadAfterSaving(void) const;\n\n\t/** Called when the chunkmap unloads unused chunks.\n\tNotifies contained entities that they are being unloaded and should for example, broadcast a destroy packet.\n\tNot called during server shutdown; such cleanup during shutdown is unnecessary. */\n\tvoid OnUnload();\n\n\tbool IsLightValid(void) const {return m_IsLightValid; }\n\n\t/*\n\tTo save a chunk, the WSSchema must:\n\t1. Mark the chunk as being saved (MarkSaving())\n\t2. Get the chunk's data using GetAllData()\n\t3. Mark the chunk as saved (MarkSaved())\n\tIf anywhere inside this sequence another thread mmodifies the chunk, the chunk will not get marked as saved in MarkSaved()\n\t*/\n\tvoid MarkSaving(void);  // Marks the chunk as being saved.\n\tvoid MarkSaved(void);  // Marks the chunk as saved, if it didn't change from the last call to MarkSaving()\n\tvoid MarkLoaded(void);  // Marks the chunk as freshly loaded. Fails if the chunk is already valid\n\n\t/** Queues the chunk for generating. */\n\tvoid MarkLoadFailed(void);\n\n\t/** Gets all chunk data, calls the a_Callback's methods for each data type */\n\tvoid GetAllData(cChunkDataCallback & a_Callback) const;\n\n\t/** Sets all chunk data as either loaded from the storage or generated.\n\tBlockLight and BlockSkyLight are optional, if not present, chunk will be marked as unlighted.\n\tModifies the BlockEntity list in a_SetChunkData - moves the block entities into the chunk. */\n\tvoid SetAllData(SetChunkData && a_SetChunkData);\n\n\tvoid SetLight(\n\t\tconst cChunkDef::BlockNibbles & a_BlockLight,\n\t\tconst cChunkDef::BlockNibbles & a_SkyLight\n\t);\n\n\t/** Writes the specified cBlockArea at the coords specified. Note that the coords may extend beyond the chunk! */\n\tvoid WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes);\n\n\t/** Sets or resets the internal flag that prevents chunk from being unloaded.\n\tThe flag is cumulative - it can be set multiple times and then needs to be un-set that many times\n\tbefore the chunk is unloadable again. */\n\tvoid Stay(bool a_Stay = true);\n\n\t/** Recence all mobs proximities to players in order to know what to do with them */\n\tvoid CollectMobCensus(cMobCensus & toFill);\n\n\t/** Try to Spawn Monsters inside chunk */\n\tvoid SpawnMobs(cMobSpawner & a_MobSpawner);\n\n\tvoid Tick(std::chrono::milliseconds a_Dt);\n\n\t/** Ticks a single block. Used by cWorld::TickQueuedBlocks() to tick the queued blocks */\n\tvoid TickBlock(const Vector3i a_RelPos);\n\n\tint GetPosX(void) const { return m_PosX; }\n\tint GetPosZ(void) const { return m_PosZ; }\n\tcChunkCoords GetPos() const { return {m_PosX, m_PosZ}; }\n\n\tcWorld * GetWorld(void) const { return m_World; }\n\n\tvoid SetBlock(Vector3i a_RelBlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\t// SetBlock() does a lot of work (heightmap, tickblocks, blockentities) so a BlockIdx version doesn't make sense\n\n\tvoid FastSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, BLOCKTYPE a_BlockMeta);  // Doesn't force block updates on neighbors, use for simple changes such as grass growing etc.\n\tvoid FastSetBlock(Vector3i a_RelPos, BLOCKTYPE a_BlockType, BLOCKTYPE a_BlockMeta)\n\t{\n\t\tFastSetBlock(a_RelPos.x, a_RelPos.y, a_RelPos.z, a_BlockType, a_BlockMeta);\n\t}\n\n\tBLOCKTYPE GetBlock(int a_RelX, int a_RelY, int a_RelZ) const { return m_BlockData.GetBlock({ a_RelX, a_RelY, a_RelZ }); }\n\tBLOCKTYPE GetBlock(Vector3i a_RelCoords) const { return m_BlockData.GetBlock(a_RelCoords); }\n\n\tvoid GetBlockTypeMeta(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const;\n\tvoid GetBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n\t{\n\t\tGetBlockTypeMeta({ a_RelX, a_RelY, a_RelZ }, a_BlockType, a_BlockMeta);\n\t}\n\n\tvoid GetBlockInfo(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const;\n\n\t/** Convert absolute coordinates into relative coordinates.\n\tReturns false on failure to obtain a valid chunk. Returns true otherwise.\n\t@param a_Position The position you'd like to convert, a_Position need not be in the calling chunk and can safely be out\n\tof its bounds, but for best performance, it should not be too far from the calling chunk.\n\t@param a_Chunk Returns the chunk in which a_Position is in. If a_Position is within the calling chunk's bounds,\n\treturns the calling chunk. For best performance, a_Position shouldn't be too far from the calling chunk.\n\t@param a_Rel Returns the converted relative position. Note that it is relative to the returned a_Chunk.\n\tThe vector will not be modified if the function returns false. */\n\tbool GetChunkAndRelByAbsolute(const Vector3d & a_Position, cChunk ** a_Chunk, Vector3i & a_Rel);\n\n\t/** Convert absolute coordinates into relative coordinates.\n\tReturns false on failure to obtain a valid chunk. Returns true otherwise.\n\t@param a_Position The position you'd like to convert, a_Position need not be in the calling chunk and can safely be out\n\tof its bounds, but for best performance, it should not be too far from the calling chunk.\n\t@param a_Chunk Returns the chunk in which a_Position is in. If a_Position is within the calling chunk's bounds,\n\treturns the calling chunk. For best performance, a_Position shouldn't be too far from the calling chunk.\n\t@param a_Rel Returns the converted relative position. Note that it is relative to the returned a_Chunk.\n\tThe vector will not be modified if the function returns false. */\n\tbool GetChunkAndRelByAbsolute(const Vector3i & a_Position, cChunk ** a_Chunk, Vector3i & a_Rel);\n\n\t/** Returns the chunk into which the specified block belongs, by walking the neighbors.\n\tWill return self if appropriate. Returns nullptr if not reachable through neighbors. */\n\tcChunk * GetNeighborChunk(int a_BlockX, int a_BlockZ);\n\n\t/** Returns the chunk into which the relatively-specified block belongs, by walking the neighbors.\n\tWill return self if appropriate. Returns nullptr if not reachable through neighbors. */\n\tcChunk * GetRelNeighborChunk(int a_RelX, int a_RelZ);\n\n\t/** Returns the chunk into which the relatively-specified block belongs.\n\tAlso modifies the relative coords from this-relative to return-relative.\n\tWill return self if appropriate.\n\tWill try walking the neighbors first; if that fails, will query the chunkmap. */\n\tcChunk * GetRelNeighborChunkAdjustCoords(Vector3i & a_RelPos) const;\n\n\tEMCSBiome GetBiomeAt(int a_RelX, int a_RelZ) const {return cChunkDef::GetBiome(m_BiomeMap, a_RelX, a_RelZ); }\n\n\t/** Sets the biome at the specified relative coords.\n\tDoesn't resend the chunk to clients. */\n\tvoid SetBiomeAt(int a_RelX, int a_RelZ, EMCSBiome a_Biome);\n\n\t/** Sets the biome in the specified relative coords area. All the coords are inclusive.\n\tSends the chunk to all relevant clients. */\n\tvoid SetAreaBiome(int a_MinRelX, int a_MaxRelX, int a_MinRelZ, int a_MaxRelZ, EMCSBiome a_Biome);\n\n\tint GetHeight( int a_X, int a_Z) const;\n\n\t/** Returns true if it is sunny at the specified location. This takes into account biomes. */\n\tbool IsWeatherSunnyAt(int a_RelX, int a_RelZ) const;\n\n\t/** Returns true if it is raining or storming at the specified location, taking into account biomes. */\n\tbool IsWeatherWetAt(int a_RelX, int a_RelZ) const;\n\n\t/** Returns true if it is raining or storming at the specified location,\n\tand the rain reaches (the bottom of) the specified block position. */\n\tbool IsWeatherWetAt(Vector3i a_Position) const;\n\n\tvoid SendBlockTo(int a_RelX, int a_RelY, int a_RelZ, cClientHandle * a_Client);\n\n\t/** Adds a client to the chunk; returns true if added, false if already there */\n\tbool AddClient(cClientHandle * a_Client);\n\n\t/** Removes the specified client from the chunk; ignored if client not in chunk. */\n\tvoid RemoveClient(cClientHandle * a_Client);\n\n\t/** Returns true if the specified client is present in this chunk. */\n\tbool HasClient(cClientHandle * a_Client);\n\n\t/** Returns true if theres any client in the chunk; false otherwise */\n\tbool HasAnyClients(void) const;\n\n\tvoid AddEntity(OwnedEntity a_Entity);\n\n\t/** Releases ownership of the given entity if it was found in this chunk.\n\tReturns an owning reference to the found entity. */\n\tOwnedEntity RemoveEntity(cEntity & a_Entity);\n\n\tbool HasEntity(UInt32 a_EntityID) const;\n\n\t/** Calls the callback for each entity; returns true if all entities processed, false if the callback aborted by returning true */\n\tbool ForEachEntity(cEntityCallback a_Callback) const;  // Lua-accessible\n\n\t/** Calls the callback for each entity that has a nonempty intersection with the specified boundingbox.\n\tReturns true if all entities processed, false if the callback aborted by returning true. */\n\tbool ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback) const;  // Lua-accessible\n\n\t/** Calls the callback if the entity with the specified ID is found, with the entity object as the callback param. Returns true if entity found. */\n\tbool DoWithEntityByID(UInt32 a_EntityID, cEntityCallback a_Callback, bool & a_CallbackResult) const;  // Lua-accessible\n\n\t/** Calls the callback for each block entity; returns true if all block entities processed, false if the callback aborted by returning true */\n\tbool ForEachBlockEntity(cBlockEntityCallback a_Callback);  // Lua-accessible\n\n\t/** Calls the callback for the block entity at the specified coords; returns false if there's no block entity at those coords, and whatever the callback returns if found. */\n\tbool DoWithBlockEntityAt(Vector3i a_Position, cBlockEntityCallback a_Callback);  // Lua-acessible\n\n\t/** Use block entity on coordinate.\n\treturns true if the use was successful, return false to use the block as a \"normal\" block */\n\tbool UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z);  // [x, y, z] in world block coords\n\n\tvoid SendBlockEntity             (int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client);\n\n\tVector3i PositionToWorldPosition(Vector3i a_RelPos)\n\t{\n\t\treturn PositionToWorldPosition(a_RelPos.x, a_RelPos.y, a_RelPos.z);\n\t}\n\n\tvoid     PositionToWorldPosition(int a_RelX, int a_RelY, int a_RelZ, int & a_BlockX, int & a_BlockY, int & a_BlockZ);\n\tVector3i PositionToWorldPosition(int a_RelX, int a_RelY, int a_RelZ);\n\n\tinline void MarkDirty(void)\n\t{\n\t\tm_IsDirty = true;\n\t\tm_IsSaving = false;\n\t}\n\n\t/** Causes the specified block to be ticked on the next Tick() call.\n\tPlugins can use this via the cWorld:SetNextBlockToTick() API.\n\tOnly one block coord per chunk may be set, a second call overwrites the first call */\n\tinline void SetNextBlockToTick(const Vector3i a_RelPos)\n\t{\n\t\tm_BlockToTick = a_RelPos;\n\t}\n\n\tinline NIBBLETYPE GetMeta(int a_RelX, int a_RelY, int a_RelZ) const\n\t{\n\t\treturn m_BlockData.GetMeta({ a_RelX, a_RelY, a_RelZ });\n\t}\n\n\tNIBBLETYPE GetMeta(Vector3i a_RelPos) const { return m_BlockData.GetMeta(a_RelPos); }\n\n\tvoid SetMeta(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_Meta)\n\t{\n\t\tSetMeta({ a_RelX, a_RelY, a_RelZ }, a_Meta);\n\t}\n\n\tinline void SetMeta(Vector3i a_RelPos, NIBBLETYPE a_Meta)\n\t{\n\t\tm_BlockData.SetMeta(a_RelPos, a_Meta);\n\t\tMarkDirty();\n\t\tm_PendingSendBlocks.emplace_back(m_PosX, m_PosZ, a_RelPos.x, a_RelPos.y, a_RelPos.z, GetBlock(a_RelPos), a_Meta);\n\t}\n\n\t/** Light alterations based on time */\n\tNIBBLETYPE GetTimeAlteredLight(NIBBLETYPE a_Skylight) const;\n\n\t/** Get the level of artificial light illuminating the block (0 - 15) */\n\tinline NIBBLETYPE GetBlockLight(Vector3i a_RelPos) const { return m_LightData.GetBlockLight(a_RelPos); }\n\tinline NIBBLETYPE GetBlockLight(int a_RelX, int a_RelY, int a_RelZ) const { return m_LightData.GetBlockLight({ a_RelX, a_RelY, a_RelZ }); }\n\n\t/** Get the level of sky light illuminating the block (0 - 15) independent of daytime. */\n\tinline NIBBLETYPE GetSkyLight(Vector3i a_RelPos) const { return m_LightData.GetSkyLight(a_RelPos); }\n\tinline NIBBLETYPE GetSkyLight(int a_RelX, int a_RelY, int a_RelZ) const { return m_LightData.GetSkyLight({ a_RelX, a_RelY, a_RelZ }); }\n\n\t/** Get the level of sky light illuminating the block (0 - 15), taking daytime into a account. */\n\tinline NIBBLETYPE GetSkyLightAltered(Vector3i a_RelPos) const { return GetTimeAlteredLight(m_LightData.GetSkyLight(a_RelPos)); }\n\tinline NIBBLETYPE GetSkyLightAltered(int a_RelX, int a_RelY, int a_RelZ) const { return GetSkyLightAltered({ a_RelX, a_RelY, a_RelZ }); }\n\n\t/** Same as GetBlock(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlock(Vector3i a_RelCoords, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const;\n\n\t/** OBSOLETE, use the Vector3i-based overload.\n\tSame as GetBlock(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n\t{\n\t\treturn UnboundedRelGetBlock({a_RelX, a_RelY, a_RelZ}, a_BlockType, a_BlockMeta);\n\t}\n\n\t/** Same as GetBlockType(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockType(Vector3i a_RelCoords, BLOCKTYPE & a_BlockType) const;\n\n\t/** OBSOLETE, use the Vector3i-based overload.\n\tSame as GetBlockType(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockType(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType) const\n\t{\n\t\treturn UnboundedRelGetBlockType({a_RelX, a_RelY, a_RelZ}, a_BlockType);\n\t}\n\n\t/** Same as GetBlockMeta(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockMeta(Vector3i a_RelPos, NIBBLETYPE & a_BlockMeta) const;\n\n\t/** OBSOLETE, use the Vector3i-based overload.\n\tSame as GetBlockMeta(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockMeta(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE & a_BlockMeta) const\n\t{\n\t\treturn UnboundedRelGetBlockMeta({a_RelX, a_RelY, a_RelZ}, a_BlockMeta);\n\t}\n\n\t/** Same as GetBlockBlockLight(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockBlockLight(Vector3i a_RelPos, NIBBLETYPE & a_BlockLight) const;\n\n\t/** OBSOLETE, use the Vector3i-based overload.\n\tSame as GetBlockBlockLight(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockBlockLight(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE & a_BlockLight) const\n\t{\n\t\treturn UnboundedRelGetBlockBlockLight({a_RelX, a_RelY, a_RelZ}, a_BlockLight);\n\t}\n\n\t/** Same as GetBlockSkyLight(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockSkyLight(Vector3i a_RelPos, NIBBLETYPE & a_SkyLight) const;\n\n\t/** OBSOLETE, use the Vector3i-based overload.\n\tSame as GetBlockSkyLight(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockSkyLight(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE & a_SkyLight) const\n\t{\n\t\treturn UnboundedRelGetBlockSkyLight({a_RelX, a_RelY, a_RelZ}, a_SkyLight);\n\t}\n\n\t/** Queries both BlockLight and SkyLight, relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockLights(Vector3i a_RelPos, NIBBLETYPE & a_BlockLight, NIBBLETYPE & a_SkyLight) const;\n\n\t/** OBSOLETE, use the Vector3i-based overload.\n\tQueries both BlockLight and SkyLight, relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelGetBlockLights(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE & a_BlockLight, NIBBLETYPE & a_SkyLight) const\n\t{\n\t\treturn UnboundedRelGetBlockLights({a_RelX, a_RelY, a_RelZ}, a_BlockLight, a_SkyLight);\n\t}\n\n\t/** Same as SetBlock(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelSetBlock(Vector3i a_RelPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** OBSOLETE, use the Vector3i-based overload.\n\tSame as SetBlock(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\treturn UnboundedRelSetBlock({a_RelX, a_RelY, a_RelZ}, a_BlockType, a_BlockMeta);\n\t}\n\n\t/** Same as FastSetBlock(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelFastSetBlock(Vector3i a_RelPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** OBSOLETE, use the Vector3i-based overload.\n\tSame as FastSetBlock(), but relative coords needn't be in this chunk (uses m_Neighbor-s or m_ChunkMap in such a case)\n\tReturns true on success, false if queried chunk not loaded. */\n\tbool UnboundedRelFastSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\treturn UnboundedRelFastSetBlock({a_RelX, a_RelY, a_RelZ}, a_BlockType, a_BlockMeta);\n\t}\n\n\n\n\t// Per-chunk simulator data:\n\tcFireSimulatorChunkData & GetFireSimulatorData (void) { return m_FireSimulatorData; }\n\tcFluidSimulatorData * GetWaterSimulatorData(void) const { return m_WaterSimulatorData; }\n\tcFluidSimulatorData * GetLavaSimulatorData (void) const { return m_LavaSimulatorData; }\n\tcSandSimulatorChunkData & GetSandSimulatorData (void) { return m_SandSimulatorData; }\n\tcRedstoneSimulatorChunkData * GetRedstoneSimulatorData(void) const { return m_RedstoneSimulatorData; }\n\n\t/** Returns the block entity at the specified (absolute) coords.\n\tReturns nullptr if no such BE or outside this chunk. */\n\tcBlockEntity * GetBlockEntity(Vector3i a_AbsPos);\n\n\t/** OBSOLETE, use the Vector3i-based overload instead.\n\tReturns the block entity at the specified (absolute) coords.\n\tReturns nullptr if no such BE or outside this chunk. */\n\tcBlockEntity * GetBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ) { return GetBlockEntity({a_BlockX, a_BlockY, a_BlockZ}); }\n\n\t/** Returns the block entity at the specified (relative) coords.\n\tReturns nullptr if no such BE.\n\tAsserts that the position is a valid relative position. */\n\tcBlockEntity * GetBlockEntityRel(Vector3i a_RelPos);\n\n\t/** Returns true if the chunk should be ticked in the tick-thread.\n\tChecks if there are any clients and if the always-tick flag is set */\n\tbool ShouldBeTicked(void) const;\n\n\t/** Increments (a_AlwaysTicked == true) or decrements (false) the m_AlwaysTicked counter.\n\tIf the m_AlwaysTicked counter is greater than zero, the chunk is ticked in the tick-thread regardless of\n\twhether it has any clients or not. When this is set, the chunk never unloads.\n\tThis function allows nesting and task-concurrency (multiple separate tasks can request ticking and as long\n\tas at least one requests is active the chunk will be ticked). */\n\tvoid SetAlwaysTicked(bool a_AlwaysTicked);\n\n\tconst auto & GetAllClients(void) const\n\t{\n\t\treturn m_LoadedByClient;\n\t}\n\n\t/** Converts the coord relative to this chunk into an absolute coord.\n\tDoesn't check relative coord validity. */\n\tVector3i RelativeToAbsolute(Vector3i a_RelBlockPosition) const\n\t{\n\t\treturn cChunkDef::RelativeToAbsolute(a_RelBlockPosition, {m_PosX, m_PosZ});\n\t}\n\n\t/** Returns true if slimes should spawn in the chunk. */\n\tbool IsSlimeChunk() const;\n\nprivate:\n\n\tfriend class cChunkMap;\n\n\tstruct sSetBlockQueueItem\n\t{\n\t\tInt64 m_Tick;\n\t\tint m_RelX, m_RelY, m_RelZ;\n\t\tBLOCKTYPE m_BlockType;\n\t\tNIBBLETYPE m_BlockMeta;\n\t\tBLOCKTYPE m_PreviousType;\n\n\t\tsSetBlockQueueItem(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType) :\n\t\t\tm_Tick(a_Tick), m_RelX(a_RelX), m_RelY(a_RelY), m_RelZ(a_RelZ), m_BlockType(a_BlockType), m_BlockMeta(a_BlockMeta), m_PreviousType(a_PreviousBlockType)\n\t\t{\n\t\t}\n\t} ;\n\n\ttypedef std::vector<sSetBlockQueueItem> sSetBlockQueueVector;\n\n\n\t/** Holds the presence status of the chunk - if it is present, or in the loader / generator queue, or unloaded */\n\tePresence m_Presence;\n\n\tbool m_IsLightValid;   // True if the blocklight and skylight are calculated\n\tbool m_IsDirty;        // True if the chunk has changed since it was last saved\n\tbool m_IsSaving;       // True if the chunk is being saved\n\n\t/** Blocks that have changed and need to be sent to all clients.\n\tThe protocol has a provision for coalescing block changes, and this is the buffer.\n\tIt will collect the block changes that occur in a tick, before being flushed in BroadcastPendingSendBlocks. */\n\tsSetBlockVector m_PendingSendBlocks;\n\n\t/** Block entities that have been touched and need to be sent to all clients.\n\tBecause block changes are buffered and we need to happen after them, this buffer exists too.\n\tPointers to block entities that were destroyed are guaranteed to be removed from this array by SetAllData, SetBlock, WriteBlockArea. */\n\tstd::vector<cBlockEntity *> m_PendingSendBlockEntities;\n\n\t/** A queue of relative positions to call cBlockHandler::Check on.\n\tProcessed at the end of each tick by CheckBlocks. */\n\tstd::queue<Vector3i> m_BlocksToCheck;\n\n\t// A critical section is not needed, because all chunk access is protected by its parent ChunkMap's csLayers\n\tstd::vector<cClientHandle *> m_LoadedByClient;\n\tstd::vector<OwnedEntity> m_Entities;\n\tcBlockEntities m_BlockEntities;\n\n\t/** Number of times the chunk has been requested to stay (by various cChunkStay objects); if zero, the chunk can be unloaded */\n\tunsigned m_StayCount;\n\n\tint m_PosX, m_PosZ;\n\tcWorld *    m_World;\n\tcChunkMap * m_ChunkMap;\n\n\tChunkBlockData m_BlockData;\n\tChunkLightData m_LightData;\n\n\tcChunkDef::HeightMap m_HeightMap;\n\tcChunkDef::BiomeMap  m_BiomeMap;\n\n\t/** Relative coords of the block to tick first in the next Tick() call.\n\tPlugins can use this to force a tick in a specific block, using cWorld:SetNextBlockToTick() API. */\n\tVector3i m_BlockToTick;\n\n\tcChunk * m_NeighborXM;  // Neighbor at [X - 1, Z]\n\tcChunk * m_NeighborXP;  // Neighbor at [X + 1, Z]\n\tcChunk * m_NeighborZM;  // Neighbor at [X,     Z - 1]\n\tcChunk * m_NeighborZP;  // Neighbor at [X,     Z + 1]\n\n\t// Per-chunk simulator data:\n\tcFireSimulatorChunkData m_FireSimulatorData;\n\tcFluidSimulatorData *   m_WaterSimulatorData;\n\tcFluidSimulatorData *   m_LavaSimulatorData;\n\tcSandSimulatorChunkData m_SandSimulatorData;\n\tcRedstoneSimulatorChunkData * m_RedstoneSimulatorData;\n\n\t/** If greater than zero, the chunk is ticked even if it has no clients.\n\tManipulated by the SetAlwaysTicked() function, allows for nested calls of the function.\n\tThis is the support for plugin-accessible chunk tick forcing. */\n\tunsigned m_AlwaysTicked;\n\n\t// Pick up a random block of this chunk\n\tvoid GetRandomBlockCoords(int & a_X, int & a_Y, int & a_Z);\n\tvoid GetThreeRandomNumbers(int & a_X, int & a_Y, int & a_Z, int a_MaxX, int a_MaxY, int a_MaxZ);\n\n\t/** Takes ownership of a block entity, which MUST actually reside in this chunk. */\n\tvoid AddBlockEntity(OwnedBlockEntity a_BlockEntity);\n\n\t/** Wakes up each simulator for its specific blocks; through all the blocks in the chunk */\n\tvoid WakeUpSimulators(void);\n\n\t/** Checks the block scheduled for checking in m_ToTickBlocks[] */\n\tvoid CheckBlocks();\n\n\t/** Ticks several random blocks in the chunk. */\n\tvoid TickBlocks(void);\n\n\t/** Adds snow to the top of snowy biomes and hydrates farmland / fills cauldrons in rainy biomes */\n\tvoid ApplyWeatherToTop(void);\n\n\t/** Returns the pickups that would be produced, if the specified block was dug up by a_Digger using a_Tool.\n\tDoesn't dig the block, only queries the block handlers and then plugins for the pickups. */\n\tcItems PickupsFromBlock(Vector3i a_RelPos, const cEntity * a_Digger, const cItem * a_Tool);\n\n\t/** Grows the plant at the specified position by at most a_NumStages.\n\tThe block's Grow handler is invoked.\n\tReturns the number of stages the plant has grown, 0 if not a plant. */\n\tint GrowPlantAt(Vector3i a_RelPos, int a_NumStages = 1);\n\n\t/** Called by Tick() when an entity moves out of this chunk into a neighbor; moves the entity and sends spawn / despawn packet to clients */\n\tvoid MoveEntityToNewChunk(OwnedEntity a_Entity);\n\n\t/** Check m_Entities for cPlayer objects. */\n\tbool HasPlayerEntities() const;\n};\n"
  },
  {
    "path": "src/ChunkData.cpp",
    "content": "\n// ChunkData.cpp\n\n// Implements the cChunkData class that represents the block's type, meta, blocklight and skylight storage for a chunk\n\n#include \"Globals.h\"\n#include \"ChunkData.h\"\n#include \"BlockType.h\"\n\n\n\n\n\nnamespace\n{\n\tstruct SectionIndices\n\t{\n\t\tsize_t Section = 0;  // Index into m_Sections\n\t\tsize_t Index = 0;    // Index into a single sChunkSection\n\t};\n\n\tinline SectionIndices IndicesFromRelPos(const Vector3i a_RelPos)\n\t{\n\t\tASSERT(cChunkDef::IsValidRelPos(a_RelPos));\n\n\t\treturn\n\t\t{\n\t\t\tstatic_cast<size_t>(a_RelPos.y / cChunkDef::SectionHeight),\n\t\t\tcChunkDef::MakeIndex(a_RelPos.x, a_RelPos.y % cChunkDef::SectionHeight, a_RelPos.z)\n\t\t};\n\t}\n\n\tbool IsCompressed(const size_t ElementCount)\n\t{\n\t\treturn ElementCount != ChunkBlockData::SectionBlockCount;\n\t}\n\n\ttemplate <size_t ElementCount, typename ValueType>\n\tValueType UnpackDefaultValue(const ValueType DefaultValue)\n\t{\n\t\tif (IsCompressed(ElementCount))\n\t\t{\n\t\t\treturn DefaultValue & 0xF;\n\t\t}\n\n\t\treturn DefaultValue;\n\t}\n}  // namespace (anonymous)\n\n\n\n\n\ntemplate<class ElementType, size_t ElementCount, ElementType DefaultValue>\nvoid ChunkDataStore<ElementType, ElementCount, DefaultValue>::Assign(const ChunkDataStore<ElementType, ElementCount, DefaultValue> & a_Other)\n{\n\tfor (size_t Y = 0; Y != cChunkDef::NumSections; Y++)\n\t{\n\t\tStore[Y].reset();\n\n\t\tif (const auto & Other = a_Other.Store[Y]; Other != nullptr)\n\t\t{\n\t\t\tStore[Y] = std::make_unique<Type>(*Other);\n\t\t}\n\t}\n}\n\n\n\n\n\ntemplate<class ElementType, size_t ElementCount, ElementType DefaultValue>\nElementType ChunkDataStore<ElementType, ElementCount, DefaultValue>::Get(const Vector3i a_Position) const\n{\n\tconst auto Indices = IndicesFromRelPos(a_Position);\n\tconst auto & Section = Store[Indices.Section];\n\n\tif (Section != nullptr)\n\t{\n\t\tif (IsCompressed(ElementCount))\n\t\t{\n\t\t\treturn cChunkDef::ExpandNibble(Section->data(), Indices.Index);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn (*Section)[Indices.Index];\n\t\t}\n\t}\n\n\treturn UnpackDefaultValue<ElementCount>(DefaultValue);\n}\n\n\n\n\n\ntemplate<class ElementType, size_t ElementCount, ElementType DefaultValue>\ntypename ChunkDataStore<ElementType, ElementCount, DefaultValue>::Type * ChunkDataStore<ElementType, ElementCount, DefaultValue>::GetSection(const size_t a_Y) const\n{\n\treturn Store[a_Y].get();\n}\n\n\n\n\n\ntemplate<class ElementType, size_t ElementCount, ElementType DefaultValue>\nvoid ChunkDataStore<ElementType, ElementCount, DefaultValue>::Set(const Vector3i a_Position, const ElementType a_Value)\n{\n\tconst auto Indices = IndicesFromRelPos(a_Position);\n\tauto & Section = Store[Indices.Section];\n\n\tif (Section == nullptr)\n\t{\n\t\tif (a_Value == UnpackDefaultValue<ElementCount>(DefaultValue))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tSection = cpp20::make_unique_for_overwrite<Type>();\n\t\tstd::fill(Section->begin(), Section->end(), DefaultValue);\n\t}\n\n\tif (IsCompressed(ElementCount))\n\t{\n\t\tcChunkDef::PackNibble(Section->data(), Indices.Index, a_Value);\n\t}\n\telse\n\t{\n\t\t(*Section)[Indices.Index] = a_Value;\n\t}\n}\n\n\n\n\n\ntemplate<class ElementType, size_t ElementCount, ElementType DefaultValue>\nvoid ChunkDataStore<ElementType, ElementCount, DefaultValue>::SetSection(const ElementType (& a_Source)[ElementCount], const size_t a_Y)\n{\n\tauto & Section = Store[a_Y];\n\tconst auto SourceEnd = std::end(a_Source);\n\n\tif (Section != nullptr)\n\t{\n\t\tstd::copy(a_Source, SourceEnd, Section->begin());\n\t}\n\telse if (std::any_of(a_Source, SourceEnd, [](const auto Value) { return Value != DefaultValue; }))\n\t{\n\t\tSection = cpp20::make_unique_for_overwrite<Type>();\n\t\tstd::copy(a_Source, SourceEnd, Section->begin());\n\t}\n}\n\n\n\n\n\ntemplate<class ElementType, size_t ElementCount, ElementType DefaultValue>\nvoid ChunkDataStore<ElementType, ElementCount, DefaultValue>::SetAll(const ElementType (& a_Source)[cChunkDef::NumSections * ElementCount])\n{\n\tfor (size_t Y = 0; Y != cChunkDef::NumSections; Y++)\n\t{\n\t\tSetSection(*reinterpret_cast<const ElementType (*)[ElementCount]>(a_Source + Y * ElementCount), Y);\n\t}\n}\n\n\n\n\n\nvoid ChunkBlockData::Assign(const ChunkBlockData & a_Other)\n{\n\tm_Blocks.Assign(a_Other.m_Blocks);\n\tm_Metas.Assign(a_Other.m_Metas);\n}\n\n\n\n\n\nvoid ChunkBlockData::SetAll(const cChunkDef::BlockTypes & a_BlockSource, const cChunkDef::BlockNibbles & a_MetaSource)\n{\n\tm_Blocks.SetAll(a_BlockSource);\n\tm_Metas.SetAll(a_MetaSource);\n}\n\n\n\n\n\nvoid ChunkBlockData::SetSection(const SectionType & a_BlockSource, const SectionMetaType & a_MetaSource, const size_t a_Y)\n{\n\tm_Blocks.SetSection(a_BlockSource, a_Y);\n\tm_Metas.SetSection(a_MetaSource, a_Y);\n}\n\n\n\n\n\nvoid ChunkLightData::Assign(const ChunkLightData & a_Other)\n{\n\tm_BlockLights.Assign(a_Other.m_BlockLights);\n\tm_SkyLights.Assign(a_Other.m_SkyLights);\n}\n\n\n\n\n\nvoid ChunkLightData::SetAll(const cChunkDef::BlockNibbles & a_BlockLightSource, const cChunkDef::BlockNibbles & a_SkyLightSource)\n{\n\tm_BlockLights.SetAll(a_BlockLightSource);\n\tm_SkyLights.SetAll(a_SkyLightSource);\n}\n\n\n\n\n\nvoid ChunkLightData::SetSection(const SectionType & a_BlockLightSource, const SectionType & a_SkyLightSource, const size_t a_Y)\n{\n\tm_BlockLights.SetSection(a_BlockLightSource, a_Y);\n\tm_SkyLights.SetSection(a_SkyLightSource, a_Y);\n}\n\n\n\n\n\ntemplate struct ChunkDataStore<BLOCKTYPE, ChunkBlockData::SectionBlockCount, ChunkBlockData::DefaultValue>;\ntemplate struct ChunkDataStore<NIBBLETYPE, ChunkBlockData::SectionMetaCount, ChunkLightData::DefaultBlockLightValue>;\ntemplate struct ChunkDataStore<NIBBLETYPE, ChunkLightData::SectionLightCount, ChunkLightData::DefaultSkyLightValue>;\n"
  },
  {
    "path": "src/ChunkData.h",
    "content": "\n// ChunkData.h\n\n// Declares the cChunkData class that represents the block's type, meta, blocklight and skylight storage for a chunk\n\n\n\n\n\n#pragma once\n\n#include \"FunctionRef.h\"\n#include \"ChunkDef.h\"\n\n\n\n\n\ntemplate <class ElementType, size_t ElementCount, ElementType DefaultValue>\nstruct ChunkDataStore\n{\n\tusing Type = std::array<ElementType, ElementCount>;\n\n\t/** Copy assign from another ChunkDataStore. */\n\tvoid Assign(const ChunkDataStore<ElementType, ElementCount, DefaultValue> & a_Other);\n\n\t/** Gets one value at the given position.\n\tReturns DefaultValue if the section is not allocated. */\n\tElementType Get(Vector3i a_Position) const;\n\n\t/** Returns a raw pointer to the internal representation of the specified section.\n\tWill be nullptr if the section is not allocated. */\n\tType * GetSection(size_t a_Y) const;\n\n\t/** Sets one value at the given position.\n\tAllocates a section if needed for the operation. */\n\tvoid Set(Vector3i a_Position, ElementType a_Value);\n\n\t/** Copies the data from the specified flat section array into the internal representation.\n\tAllocates a section if needed for the operation. */\n\tvoid SetSection(const ElementType (& a_Source)[ElementCount], size_t a_Y);\n\n\t/** Copies the data from the specified flat array into the internal representation.\n\tAllocates sections that are needed for the operation. */\n\tvoid SetAll(const ElementType (& a_Source)[cChunkDef::NumSections * ElementCount]);\n\n\t/** Contains all the sections this ChunkDataStore manages. */\n\tstd::unique_ptr<Type> Store[cChunkDef::NumSections];\n};\n\n\n\n\n\nclass ChunkBlockData\n{\npublic:\n\n\tstatic constexpr size_t SectionBlockCount = cChunkDef::SectionHeight * cChunkDef::Width * cChunkDef::Width;\n\tstatic constexpr size_t SectionMetaCount = SectionBlockCount / 2;\n\n\tstatic constexpr BLOCKTYPE DefaultValue = 0x00;\n\tstatic constexpr NIBBLETYPE DefaultMetaValue = 0x00;\n\n\tusing SectionType = BLOCKTYPE[SectionBlockCount];\n\tusing SectionMetaType = NIBBLETYPE[SectionMetaCount];\n\nprivate:\n\n\tChunkDataStore<BLOCKTYPE, SectionBlockCount, DefaultValue> m_Blocks;\n\tChunkDataStore<NIBBLETYPE, SectionMetaCount, DefaultMetaValue> m_Metas;\n\npublic:\n\n\tusing BlockArray = decltype(m_Blocks)::Type;\n\tusing MetaArray = decltype(m_Metas)::Type;\n\n\tvoid Assign(const ChunkBlockData & a_Other);\n\n\tBLOCKTYPE GetBlock(Vector3i a_Position) const { return m_Blocks.Get(a_Position); }\n\tNIBBLETYPE GetMeta(Vector3i a_Position) const { return m_Metas.Get(a_Position); }\n\n\tBlockArray * GetSection(size_t a_Y) const { return m_Blocks.GetSection(a_Y); }\n\tMetaArray * GetMetaSection(size_t a_Y) const { return m_Metas.GetSection(a_Y); }\n\n\tvoid SetBlock(Vector3i a_Position, BLOCKTYPE a_Block) { m_Blocks.Set(a_Position, a_Block); }\n\tvoid SetMeta(Vector3i a_Position, NIBBLETYPE a_Meta) { m_Metas.Set(a_Position, a_Meta); }\n\n\tvoid SetAll(const cChunkDef::BlockTypes & a_BlockSource, const cChunkDef::BlockNibbles & a_MetaSource);\n\tvoid SetSection(const SectionType & a_BlockSource, const SectionMetaType & a_MetaSource, size_t a_Y);\n};\n\n\n\n\n\nclass ChunkLightData\n{\npublic:\n\n\tstatic constexpr size_t SectionLightCount = (cChunkDef::SectionHeight * cChunkDef::Width * cChunkDef::Width) / 2;\n\n\tstatic constexpr NIBBLETYPE DefaultBlockLightValue = 0x00;\n\tstatic constexpr NIBBLETYPE DefaultSkyLightValue = 0xFF;\n\n\tusing SectionType = NIBBLETYPE[SectionLightCount];\n\nprivate:\n\n\tChunkDataStore<NIBBLETYPE, SectionLightCount, DefaultBlockLightValue> m_BlockLights;\n\tChunkDataStore<NIBBLETYPE, SectionLightCount, DefaultSkyLightValue> m_SkyLights;\n\npublic:\n\n\tusing LightArray = decltype(m_BlockLights)::Type;\n\n\tvoid Assign(const ChunkLightData & a_Other);\n\n\tNIBBLETYPE GetBlockLight(Vector3i a_Position) const { return m_BlockLights.Get(a_Position); }\n\tNIBBLETYPE GetSkyLight(Vector3i a_Position) const { return m_SkyLights.Get(a_Position); }\n\n\tLightArray * GetBlockLightSection(size_t a_Y) const { return m_BlockLights.GetSection(a_Y); }\n\tLightArray * GetSkyLightSection(size_t a_Y) const { return m_SkyLights.GetSection(a_Y); }\n\n\tvoid SetAll(const cChunkDef::BlockNibbles & a_BlockLightSource, const cChunkDef::BlockNibbles & a_SkyLightSource);\n\tvoid SetSection(const SectionType & a_BlockLightSource, const SectionType & a_SkyLightSource, size_t a_Y);\n};\n\n\n\n\n\n/** Invokes the callback functor for every chunk section containing at least one present block or light section data.\nThis is used to collect all data for all sections.\nIn macro form to work around a Visual Studio 2017 ICE bug. */\n#define ChunkDef_ForEachSection(BlockData, LightData, Callback) \\\n\tdo \\\n\t{ \\\n\t\tfor (size_t Y = 0; Y < cChunkDef::NumSections; ++Y) \\\n\t\t{ \\\n\t\t\tconst auto Blocks = BlockData.GetSection(Y); \\\n\t\t\tconst auto Metas = BlockData.GetMetaSection(Y); \\\n\t\t\tconst auto BlockLights = LightData.GetBlockLightSection(Y); \\\n\t\t\tconst auto SkyLights = LightData.GetSkyLightSection(Y); \\\n\t\t\tif ((Blocks != nullptr) || (Metas != nullptr) || (BlockLights != nullptr) || (SkyLights != nullptr)) \\\n\t\t\t{ \\\n\t\t\t\tCallback \\\n\t\t\t} \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\nextern template struct ChunkDataStore<BLOCKTYPE, ChunkBlockData::SectionBlockCount, ChunkBlockData::DefaultValue>;\nextern template struct ChunkDataStore<NIBBLETYPE, ChunkBlockData::SectionMetaCount, ChunkLightData::DefaultBlockLightValue>;\nextern template struct ChunkDataStore<NIBBLETYPE, ChunkLightData::SectionLightCount, ChunkLightData::DefaultSkyLightValue>;\n"
  },
  {
    "path": "src/ChunkDataCallback.h",
    "content": "\n// ChunkDataCallback.h\n\n// Declares the cChunkDataCallback interface and several trivial descendants, for reading chunk data\n\n\n\n\n\n#pragma once\n\n#include \"ChunkData.h\"\n\n\n\n\n\n/** Interface class used for getting data out of a chunk using the GetAllData() function.\nImplementation must use the pointers immediately and NOT store any of them for later use\nThe virtual methods are called in the same order as they're declared here. */\nclass cChunkDataCallback\n{\npublic:\n\n\tvirtual ~cChunkDataCallback() {}\n\n\t/** Called before any other callbacks to inform of the current coords\n\t(only in processes where multiple chunks can be processed, such as cWorld::ForEachChunkInRect()).\n\tIf false is returned, the chunk is skipped. */\n\tvirtual bool Coords(int a_ChunkX, int a_ChunkZ) { UNUSED(a_ChunkX); UNUSED(a_ChunkZ); return true; }\n\n\t/** Called once to let know if the chunk lighting is valid. Return value is ignored */\n\tvirtual void LightIsValid(bool a_IsLightValid) { UNUSED(a_IsLightValid); }\n\n\t/** Called once to export block data. */\n\tvirtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData) { UNUSED(a_BlockData); UNUSED(a_LightData); }\n\n\t/** Called once to provide heightmap data. */\n\tvirtual void HeightMap(const cChunkDef::HeightMap & a_HeightMap) { UNUSED(a_HeightMap); }\n\n\t/** Called once to provide biome data. */\n\tvirtual void BiomeMap(const cChunkDef::BiomeMap & a_BiomeMap) { UNUSED(a_BiomeMap); }\n\n\t/** Called for each entity in the chunk */\n\tvirtual void Entity(cEntity * a_Entity) { UNUSED(a_Entity); }\n\n\t/** Called for each block entity in the chunk */\n\tvirtual void BlockEntity(cBlockEntity * a_Entity) { UNUSED(a_Entity); }\n} ;\n\n\n\n\n/** A simple implementation of the cChunkDataCallback interface that just copies the cChunkData */\nclass cChunkDataCopyCollector :\n\tpublic cChunkDataCallback\n{\npublic:\n\n\tChunkBlockData m_BlockData;\n\tChunkLightData m_LightData;\n\nprivate:\n\n\tvirtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData) override\n\t{\n\t\tm_BlockData.Assign(a_BlockData);\n\t\tm_LightData.Assign(a_LightData);\n\t}\n};\n"
  },
  {
    "path": "src/ChunkDef.h",
    "content": "\n// ChunkDef.h\n\n// Interfaces to helper types for chunk definitions. Most modules want to include this instead of cChunk.h\n\n\n\n\n\n#pragma once\n\n#include \"BiomeDef.h\"\n\n\n\n// Used to smoothly convert to new axis ordering. One will be removed when deemed stable.\n#define AXIS_ORDER_YZX 1  // Original (1.1-)\n#define AXIS_ORDER_XZY 2  // New (1.2+)\n#define AXIS_ORDER AXIS_ORDER_XZY\n\n\n\n\n\n// fwd\nclass cBlockEntity;\nclass cEntity;\nclass cClientHandle;\nclass cBlockEntity;\nclass cChunkCoords;\n\nusing OwnedEntity = std::unique_ptr<cEntity>;\nusing cEntityList = std::vector<OwnedEntity>;\n\n\n\n\n// tolua_begin\n\n/** The datatype used by blockdata */\ntypedef unsigned char BLOCKTYPE;\n\n/** The datatype used by nibbledata (meta, light, skylight) */\ntypedef unsigned char NIBBLETYPE;\n\n/** The type used by the heightmap */\ntypedef unsigned char HEIGHTTYPE;\n\n// tolua_end\n\n\n\n\n\n/** Wraps the chunk coords into a single structure. */\nclass cChunkCoords\n{\npublic:\n\tint m_ChunkX;\n\tint m_ChunkZ;\n\n\tcChunkCoords(int a_ChunkX, int a_ChunkZ) : m_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ) {}\n\n\n\tbool operator == (const cChunkCoords & a_Other) const\n\t{\n\t\treturn ((m_ChunkX == a_Other.m_ChunkX) && (m_ChunkZ == a_Other.m_ChunkZ));\n\t}\n\n\n\tbool operator != (const cChunkCoords & a_Other) const\n\t{\n\t\treturn !(operator == (a_Other));\n\t}\n\n\n\t/** Simple comparison, to support ordering. */\n\tbool operator < (const cChunkCoords & a_Other) const\n\t{\n\t\tif (a_Other.m_ChunkX == m_ChunkX)\n\t\t{\n\t\t\treturn (m_ChunkZ < a_Other.m_ChunkZ);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn (m_ChunkX < a_Other.m_ChunkX);\n\t\t}\n\t}\n\n\n\t/** Returns a string that describes the chunk coords, suitable for logging. */\n\tAString ToString() const\n\t{\n\t\treturn fmt::format(FMT_STRING(\"[{}, {}]\"), m_ChunkX, m_ChunkZ);\n\t}\n} ;\n\n\n\n\n\n/** Implements custom fmtlib formatting for cChunkCoords. */\nnamespace fmt\n{\n\ttemplate <> struct formatter<cChunkCoords>: formatter<int>\n\t{\n\t\tauto format(cChunkCoords a_Coords, format_context & a_Ctx)\n\t\t{\n\t\t\treturn format_to(a_Ctx.out(), \"[{}, {}]\", a_Coords.m_ChunkX, a_Coords.m_ChunkZ);\n\t\t}\n\t};\n}\n\n\n\n\n\n/** Constants used throughout the code, useful typedefs and utility functions */\nclass cChunkDef\n{\npublic:\n\n\t// Chunk dimensions:\n\tstatic const int Width = 16;\n\tstatic const int Height = 256;\n\tstatic const int NumBlocks = Width * Height * Width;\n\n\tstatic const int SectionHeight = 16;\n\tstatic const size_t NumSections = (cChunkDef::Height / SectionHeight);\n\n\t/** The type used for any heightmap operations and storage; idx = x + Width * z; Height points to the highest non-air block in the column */\n\ttypedef HEIGHTTYPE HeightMap[Width * Width];\n\n\t/** The type used for any biomemap operations and storage inside Cuberite,\n\tusing Cuberite biomes (need not correspond to client representation!)\n\tidx = x + Width * z */\n\ttypedef EMCSBiome BiomeMap[Width * Width];\n\n\t/** The type used for block type operations and storage, AXIS_ORDER ordering */\n\ttypedef BLOCKTYPE BlockTypes[NumBlocks];\n\n\t/** The type used for block data in nibble format, AXIS_ORDER ordering */\n\ttypedef NIBBLETYPE BlockNibbles[NumBlocks / 2];\n\n\n\t/** Converts absolute block coords into relative (chunk + block) coords: */\n\tinline static void AbsoluteToRelative(/* in-out */ int & a_X, int & a_Y, int & a_Z, /* out */ int & a_ChunkX, int & a_ChunkZ)\n\t{\n\t\tUNUSED(a_Y);\n\t\tBlockToChunk(a_X, a_Z, a_ChunkX, a_ChunkZ);\n\n\t\ta_X = a_X - a_ChunkX * Width;\n\t\ta_Z = a_Z - a_ChunkZ * Width;\n\t}\n\n\n\t/** Converts the specified absolute position into a relative position within its chunk.\n\tUse BlockToChunk to query the chunk coords. */\n\tinline static Vector3i AbsoluteToRelative(Vector3i a_BlockPosition)\n\t{\n\t\tcChunkCoords chunkPos = BlockToChunk(a_BlockPosition);\n\t\treturn AbsoluteToRelative(a_BlockPosition, chunkPos);\n\t}\n\n\n\t/** Converts the absolute coords into coords relative to the specified chunk. */\n\tinline static Vector3i AbsoluteToRelative(Vector3i a_BlockPosition, cChunkCoords a_ChunkPos)\n\t{\n\t\treturn { a_BlockPosition.x - a_ChunkPos.m_ChunkX * Width, a_BlockPosition.y, a_BlockPosition.z - a_ChunkPos.m_ChunkZ * Width };\n\t}\n\n\n\t/** Converts relative block coordinates into absolute coordinates with a known chunk location */\n\tinline static Vector3i RelativeToAbsolute(Vector3i a_RelBlockPosition, cChunkCoords a_ChunkCoords)\n\t{\n\t\treturn Vector3i(\n\t\t\ta_RelBlockPosition.x + a_ChunkCoords.m_ChunkX * Width,\n\t\t\ta_RelBlockPosition.y,\n\t\t\ta_RelBlockPosition.z + a_ChunkCoords.m_ChunkZ * Width\n\t\t);\n\t}\n\n\n\t/** Validates a height-coordinate. Returns false if height-coordinate is out of height bounds */\n\tinline static bool IsValidHeight(Vector3i a_BlockPosition)\n\t{\n\t\treturn ((a_BlockPosition.y >= 0) && (a_BlockPosition.y < Height));\n\t}\n\n\n\t/** Validates a width-coordinate. Returns false if width-coordiante is out of width bounds */\n\tinline static bool IsValidWidth(int a_Width)\n\t{\n\t\treturn ((a_Width >= 0) && (a_Width < Width));\n\t}\n\n\n\t/** Validates a chunk relative coordinate. Returns false if the coordiante is out of bounds for a chunk. */\n\tinline static bool IsValidRelPos(Vector3i a_RelPos)\n\t{\n\t\treturn (\n\t\t\tIsValidWidth(a_RelPos.x) &&\n\t\t\tIsValidHeight(a_RelPos) &&\n\t\t\tIsValidWidth(a_RelPos.z)\n\t\t);\n\t}\n\n\n\t/** Converts absolute block coords to chunk coords: */\n\tinline static void BlockToChunk(int a_X, int a_Z, int & a_ChunkX, int & a_ChunkZ)\n\t{\n\t\t// This version is deprecated in favor of the vector version\n\t\t// If you're developing new code, use the other version.\n\t\tconst auto ChunkCoords = BlockToChunk({ a_X, 0, a_Z });\n\t\ta_ChunkX = ChunkCoords.m_ChunkX;\n\t\ta_ChunkZ = ChunkCoords.m_ChunkZ;\n\t}\n\n\n\t/** The Y coordinate of a_Pos is ignored */\n\tinline static cChunkCoords BlockToChunk(const Vector3i a_Position)\n\t{\n\t\treturn { FAST_FLOOR_DIV(a_Position.x, Width), FAST_FLOOR_DIV(a_Position.z, Width) };\n\t}\n\n\n\tinline static size_t MakeIndex(int x, int y, int z)\n\t{\n\t\tASSERT(IsValidRelPos({ x, y, z }));\n\n\t\t#if AXIS_ORDER == AXIS_ORDER_XZY\n\t\t\t// For some reason, NOT using the Horner schema is faster. Weird.\n\t\t\treturn static_cast<size_t>(x + (z * Width) + (y * Width * Width));   // 1.2 uses XZY\n\t\t#elif AXIS_ORDER == AXIS_ORDER_YZX\n\t\t\treturn static_cast<size_t>(y + (z * Width) + (x * Height * Width));  // 1.1 uses YZX\n\t\t#endif\n\t}\n\n\n\tinline static size_t MakeIndex(Vector3i a_RelPos)\n\t{\n\t\treturn MakeIndex(a_RelPos.x, a_RelPos.y, a_RelPos.z);\n\t}\n\n\n\tinline static Vector3i IndexToCoordinate(size_t index)\n\t{\n\t\t#if AXIS_ORDER == AXIS_ORDER_XZY\n\t\t\treturn Vector3i(  // 1.2\n\t\t\t\tstatic_cast<int>(index % cChunkDef::Width),                       // X\n\t\t\t\tstatic_cast<int>(index / (cChunkDef::Width * cChunkDef::Width)),  // Y\n\t\t\t\tstatic_cast<int>((index / cChunkDef::Width) % cChunkDef::Width)   // Z\n\t\t\t);\n\t\t#elif AXIS_ORDER == AXIS_ORDER_YZX\n\t\t\treturn Vector3i(  // 1.1\n\t\t\t\tstatic_cast<int>(index / (cChunkDef::Height * cChunkDef::Width)),  // X\n\t\t\t\tstatic_cast<int>(index % cChunkDef::Height),                       // Y\n\t\t\t\tstatic_cast<int>((index / cChunkDef::Height) % cChunkDef::Width)   // Z\n\t\t\t);\n\t\t#endif\n\t}\n\n\n\tinline static void SetBlock(BLOCKTYPE * a_BlockTypes, int a_X, int a_Y, int a_Z, BLOCKTYPE a_Type)\n\t{\n\t\tASSERT((a_X >= 0) && (a_X < Width));\n\t\tASSERT((a_Y >= 0) && (a_Y < Height));\n\t\tASSERT((a_Z >= 0) && (a_Z < Width));\n\t\ta_BlockTypes[MakeIndex(a_X, a_Y, a_Z)] = a_Type;\n\t}\n\n\n\tinline static void SetBlock(BLOCKTYPE * a_BlockTypes, int a_Index, BLOCKTYPE a_Type)\n\t{\n\t\tASSERT((a_Index >= 0) && (a_Index <= NumBlocks));\n\t\ta_BlockTypes[a_Index] = a_Type;\n\t}\n\n\n\tinline static BLOCKTYPE GetBlock(const BLOCKTYPE * a_BlockTypes, Vector3i a_RelPos)\n\t{\n\t\tASSERT(IsValidRelPos(a_RelPos));\n\t\treturn a_BlockTypes[MakeIndex(a_RelPos)];\n\t}\n\n\n\tinline static BLOCKTYPE GetBlock(const BLOCKTYPE * a_BlockTypes, int a_X, int a_Y, int a_Z)\n\t{\n\t\tASSERT((a_X >= 0) && (a_X < Width));\n\t\tASSERT((a_Y >= 0) && (a_Y < Height));\n\t\tASSERT((a_Z >= 0) && (a_Z < Width));\n\t\treturn a_BlockTypes[MakeIndex(a_X, a_Y, a_Z)];\n\t}\n\n\n\tinline static BLOCKTYPE GetBlock(const BLOCKTYPE * a_BlockTypes, int a_Idx)\n\t{\n\t\tASSERT((a_Idx >= 0) && (a_Idx < NumBlocks));\n\t\treturn a_BlockTypes[a_Idx];\n\t}\n\n\n\tinline static HEIGHTTYPE GetHeight(const HeightMap & a_HeightMap, int a_X, int a_Z)\n\t{\n\t\tASSERT((a_X >= 0) && (a_X < Width));\n\t\tASSERT((a_Z >= 0) && (a_Z < Width));\n\t\treturn a_HeightMap[a_X + Width * a_Z];\n\t}\n\n\n\tinline static void SetHeight(HeightMap & a_HeightMap, int a_X, int a_Z, HEIGHTTYPE a_Height)\n\t{\n\t\tASSERT((a_X >= 0) && (a_X < Width));\n\t\tASSERT((a_Z >= 0) && (a_Z < Width));\n\t\ta_HeightMap[a_X + Width * a_Z] = a_Height;\n\t}\n\n\n\tinline static EMCSBiome GetBiome(const BiomeMap & a_BiomeMap, int a_X, int a_Z)\n\t{\n\t\tASSERT((a_X >= 0) && (a_X < Width));\n\t\tASSERT((a_Z >= 0) && (a_Z < Width));\n\t\treturn a_BiomeMap[a_X + Width * a_Z];\n\t}\n\n\n\tinline static void SetBiome(BiomeMap & a_BiomeMap, int a_X, int a_Z, EMCSBiome a_Biome)\n\t{\n\t\tASSERT((a_X >= 0) && (a_X < Width));\n\t\tASSERT((a_Z >= 0) && (a_Z < Width));\n\t\ta_BiomeMap[a_X + Width * a_Z] = a_Biome;\n\t}\n\n\n\tstatic NIBBLETYPE GetNibble(const NIBBLETYPE * a_Buffer, int x, int y, int z)\n\t{\n\t\tif ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1))\n\t\t{\n\t\t\treturn ExpandNibble(a_Buffer, MakeIndex(x, y, z));\n\t\t}\n\t\tASSERT(!\"cChunkDef::GetNibble(): coords out of chunk range!\");\n\t\treturn 0;\n\t}\n\n\n\tinline static void PackNibble(NIBBLETYPE * const a_Buffer, const size_t a_Index, const NIBBLETYPE a_Nibble)\n\t{\n\t\tASSERT((a_Nibble & 0xF) == a_Nibble);  // Only the lower bits should be set\n\n\t\ta_Buffer[a_Index / 2] = static_cast<NIBBLETYPE>(\n\t\t\t(a_Buffer[a_Index / 2] & (0xf0 >> ((a_Index & 1) * 4))) |  // The untouched nibble\n\t\t\t((a_Nibble & 0x0f) << ((a_Index & 1) * 4))  // The nibble being set\n\t\t);\n\t}\n\n\n\tinline static NIBBLETYPE ExpandNibble(const NIBBLETYPE * const a_Buffer, const size_t a_Index)\n\t{\n\t\treturn (a_Buffer[a_Index / 2] >> ((a_Index & 1) * 4)) & 0x0f;\n\t}\n} ;\n\n\n\n\n\n/** Interface class used for comparing clients of two chunks.\nUsed primarily for entity moving while both chunks are locked. */\nclass cClientDiffCallback\n{\npublic:\n\n\tvirtual ~cClientDiffCallback() {}\n\n\t/** Called for clients that are in Chunk1 and not in Chunk2, */\n\tvirtual void Removed(cClientHandle * a_Client) = 0;\n\n\t/** Called for clients that are in Chunk2 and not in Chunk1. */\n\tvirtual void Added(cClientHandle * a_Client) = 0;\n} ;\n\n\n\n\n\nstruct sSetBlock\n{\n\tint m_RelX, m_RelY, m_RelZ;\n\tint m_ChunkX, m_ChunkZ;\n\tBLOCKTYPE m_BlockType;\n\tNIBBLETYPE m_BlockMeta;\n\n\tsSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta):\n\t\tm_RelX(a_BlockX),\n\t\tm_RelY(a_BlockY),\n\t\tm_RelZ(a_BlockZ),\n\t\tm_BlockType(a_BlockType),\n\t\tm_BlockMeta(a_BlockMeta)\n\t{\n\t\tcChunkDef::AbsoluteToRelative(m_RelX, m_RelY, m_RelZ, m_ChunkX, m_ChunkZ);\n\t}\n\n\tsSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) :\n\t\tsSetBlock(a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_BlockType, a_BlockMeta)\n\t{\n\t}\n\n\tsSetBlock(int a_ChunkX, int a_ChunkZ, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) :\n\t\tm_RelX(a_RelX), m_RelY(a_RelY), m_RelZ(a_RelZ),\n\t\tm_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ),\n\t\tm_BlockType(a_BlockType),\n\t\tm_BlockMeta(a_BlockMeta)\n\t{\n\t\tASSERT((a_RelX >= 0) && (a_RelX < cChunkDef::Width));\n\t\tASSERT((a_RelZ >= 0) && (a_RelZ < cChunkDef::Width));\n\t}\n\n\t/** Returns the absolute X coord of the stored block. */\n\tint GetX(void) const { return m_RelX + cChunkDef::Width * m_ChunkX; }\n\n\t/** Returns the absolute Y coord of the stored block.\n\tIs the same as relative Y coords, because there's no Y relativization. */\n\tint GetY(void) const { return m_RelY; }\n\n\t/** Returns the absolute Z coord of the stored block. */\n\tint GetZ(void) const { return m_RelZ + cChunkDef::Width * m_ChunkZ; }\n\n\t/** Returns the absolute coords of the stored block. */\n\tVector3i GetAbsolutePos() const\n\t{\n\t\treturn Vector3i(GetX(), GetY(), GetZ());\n\t}\n\n\t/** Returns the relative position of the stored block within its chunk. */\n\tVector3i GetRelativePos() const\n\t{\n\t\treturn Vector3i(m_RelX, m_RelY, m_RelZ);\n\t}\n};\n\ntypedef std::vector<sSetBlock> sSetBlockVector;\n\ntypedef std::list<cChunkCoords> cChunkCoordsList;\ntypedef std::vector<cChunkCoords> cChunkCoordsVector;\n\n\n\n\n\n/** A simple hash function for chunk coords, we assume that chunk coords won't use more than 16 bits, so the hash is almost an identity.\nUsed for std::unordered_map<cChunkCoords, ...> */\nclass cChunkCoordsHash\n{\npublic:\n\tsize_t operator () (const cChunkCoords & a_Coords) const\n\t{\n\t\treturn (static_cast<size_t>(a_Coords.m_ChunkX) << 16) ^ static_cast<size_t>(a_Coords.m_ChunkZ);\n\t}\n};\n\n\n\n\n\n/** Interface class used as a callback for operations that involve chunk coords */\nclass cChunkCoordCallback\n{\npublic:\n\n\tvirtual ~cChunkCoordCallback() {}\n\n\t/** Called with the chunk's coords, and an optional operation status flag for operations that support it. */\n\tvirtual void Call(cChunkCoords a_Coords, bool a_IsSuccess) = 0;\n} ;\n\n\n\n\n\n/** Generic template that can store any kind of data together with a triplet of 3 coords */\ntemplate <typename X> class cCoordWithData\n{\npublic:\n\tint x;\n\tint y;\n\tint z;\n\tX   Data;\n\n\tcCoordWithData(int a_X, int a_Y, int a_Z) :\n\t\tx(a_X), y(a_Y), z(a_Z), Data()\n\t{\n\t}\n\n\tcCoordWithData(int a_X, int a_Y, int a_Z, const X & a_Data) :\n\t\tx(a_X), y(a_Y), z(a_Z), Data(a_Data)\n\t{\n\t}\n} ;\n\ntypedef cCoordWithData<int>        cCoordWithInt;\n\ntypedef std::list<cCoordWithInt>   cCoordWithIntList;\ntypedef std::vector<cCoordWithInt> cCoordWithIntVector;\n"
  },
  {
    "path": "src/ChunkGeneratorThread.cpp",
    "content": "#include \"Globals.h\"\n#include \"ChunkGeneratorThread.h\"\n#include \"Generating/ChunkGenerator.h\"\n#include \"Generating/ChunkDesc.h\"\n\n\n\n\n\n/** If the generation queue size exceeds this number, a warning will be output */\nconst size_t QUEUE_WARNING_LIMIT = 1000;\n\n/** If the generation queue size exceeds this number, chunks with no clients will be skipped */\nconst size_t QUEUE_SKIP_LIMIT = 500;\n\n\n\n\n\ncChunkGeneratorThread::cChunkGeneratorThread(void) :\n\tSuper(\"Chunk Generator\"),\n\tm_Generator(nullptr),\n\tm_PluginInterface(nullptr),\n\tm_ChunkSink(nullptr)\n{\n}\n\n\n\n\n\ncChunkGeneratorThread::~cChunkGeneratorThread()\n{\n\tStop();\n}\n\n\n\n\n\nbool cChunkGeneratorThread::Initialize(cPluginInterface & a_PluginInterface, cChunkSink & a_ChunkSink, cIniFile & a_IniFile)\n{\n\tm_PluginInterface = &a_PluginInterface;\n\tm_ChunkSink = &a_ChunkSink;\n\n\tm_Generator = cChunkGenerator::CreateFromIniFile(a_IniFile);\n\tif (m_Generator == nullptr)\n\t{\n\t\tLOGERROR(\"Generator could not start, aborting the server\");\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cChunkGeneratorThread::Stop(void)\n{\n\tm_ShouldTerminate = true;\n\tm_Event.Set();\n\tm_evtRemoved.Set();  // Wake up anybody waiting for empty queue\n\tSuper::Stop();\n\tm_Generator.reset();\n}\n\n\n\n\n\nvoid cChunkGeneratorThread::QueueGenerateChunk(\n\tcChunkCoords a_Coords,\n\tbool a_ForceRegeneration,\n\tcChunkCoordCallback * a_Callback\n)\n{\n\tASSERT(m_ChunkSink->IsChunkQueued(a_Coords));\n\n\t{\n\t\tcCSLock Lock(m_CS);\n\n\t\t// Add to queue, issue a warning if too many:\n\t\tif (m_Queue.size() >= QUEUE_WARNING_LIMIT)\n\t\t{\n\t\t\tLOGWARN(\"WARNING: Adding chunk %s to generation queue; Queue is too big! (%zu)\", a_Coords.ToString().c_str(), m_Queue.size());\n\t\t}\n\t\tm_Queue.emplace_back(a_Coords, a_ForceRegeneration, a_Callback);\n\t}\n\n\tm_Event.Set();\n}\n\n\n\n\n\nvoid cChunkGeneratorThread::GenerateBiomes(cChunkCoords a_Coords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tif (m_Generator != nullptr)\n\t{\n\t\tm_Generator->GenerateBiomes(a_Coords, a_BiomeMap);\n\t}\n}\n\n\n\n\n\nvoid cChunkGeneratorThread::WaitForQueueEmpty(void)\n{\n\tcCSLock Lock(m_CS);\n\twhile (!m_ShouldTerminate && !m_Queue.empty())\n\t{\n\t\tcCSUnlock Unlock(Lock);\n\t\tm_evtRemoved.Wait();\n\t}\n}\n\n\n\n\n\nsize_t cChunkGeneratorThread::GetQueueLength(void) const\n{\n\tcCSLock Lock(m_CS);\n\treturn m_Queue.size();\n}\n\n\n\n\n\nint cChunkGeneratorThread::GetSeed() const\n{\n\treturn m_Generator->GetSeed();\n}\n\n\n\n\n\nEMCSBiome cChunkGeneratorThread::GetBiomeAt(int a_BlockX, int a_BlockZ)\n{\n\tASSERT(m_Generator != nullptr);\n\treturn m_Generator->GetBiomeAt(a_BlockX, a_BlockZ);\n}\n\n\n\n\n\nvoid cChunkGeneratorThread::Execute(void)\n{\n\t// To be able to display performance information, the generator counts the chunks generated.\n\t// When the queue gets empty, the count is reset, so that waiting for the queue is not counted into the total time.\n\tint NumChunksGenerated = 0;  // Number of chunks generated since the queue was last empty\n\tclock_t GenerationStart = clock();  // Clock tick when the queue started to fill\n\tclock_t LastReportTick = clock();  // Clock tick of the last report made (so that performance isn't reported too often)\n\n\twhile (!m_ShouldTerminate)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\twhile (m_Queue.empty())\n\t\t{\n\t\t\tif ((NumChunksGenerated > 16) && (clock() - LastReportTick > CLOCKS_PER_SEC))\n\t\t\t{\n\t\t\t\t/* LOG(\"Chunk generator performance: %.2f ch / sec (%d ch total)\",\n\t\t\t\t\tstatic_cast<double>(NumChunksGenerated) * CLOCKS_PER_SEC/ (clock() - GenerationStart),\n\t\t\t\t\tNumChunksGenerated\n\t\t\t\t); */\n\t\t\t}\n\t\t\tcCSUnlock Unlock(Lock);\n\t\t\tm_Event.Wait();\n\t\t\tif (m_ShouldTerminate)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tNumChunksGenerated = 0;\n\t\t\tGenerationStart = clock();\n\t\t\tLastReportTick = clock();\n\t\t}\n\n\t\tif (m_Queue.empty())\n\t\t{\n\t\t\t// Sometimes the queue remains empty\n\t\t\t// If so, we can't do any front() operations on it!\n\t\t\tcontinue;\n\t\t}\n\n\t\tauto item = m_Queue.front();  // Get next chunk from the queue\n\t\tbool SkipEnabled = (m_Queue.size() > QUEUE_SKIP_LIMIT);\n\t\tm_Queue.erase(m_Queue.begin());  // Remove the item from the queue\n\t\tLock.Unlock();  // Unlock ASAP\n\t\tm_evtRemoved.Set();\n\n\t\t// Display perf info once in a while:\n\t\tif ((NumChunksGenerated > 512) && (clock() - LastReportTick > 2 * CLOCKS_PER_SEC))\n\t\t{\n\t\t\tLOG(\"Chunk generator performance: %.2f ch / sec (%d ch total)\",\n\t\t\t\tstatic_cast<double>(NumChunksGenerated) * CLOCKS_PER_SEC / (clock() - GenerationStart),\n\t\t\t\tNumChunksGenerated\n\t\t\t);\n\t\t\tLastReportTick = clock();\n\t\t}\n\n\t\t// Skip the chunk if it's already generated and regeneration is not forced. Report as success:\n\t\tif (!item.m_ForceRegeneration && m_ChunkSink->IsChunkValid(item.m_Coords))\n\t\t{\n\t\t\tLOGD(\"Chunk %s already generated, skipping generation\", item.m_Coords.ToString().c_str());\n\t\t\tif (item.m_Callback != nullptr)\n\t\t\t{\n\t\t\t\titem.m_Callback->Call(item.m_Coords, true);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Skip the chunk if the generator is overloaded:\n\t\tif (SkipEnabled && !m_ChunkSink->HasChunkAnyClients(item.m_Coords))\n\t\t{\n\t\t\tLOGWARNING(\"Chunk generator overloaded, skipping chunk %s\", item.m_Coords.ToString().c_str());\n\t\t\tif (item.m_Callback != nullptr)\n\t\t\t{\n\t\t\t\titem.m_Callback->Call(item.m_Coords, false);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Generate the chunk:\n\t\tDoGenerate(item.m_Coords);\n\t\tif (item.m_Callback != nullptr)\n\t\t{\n\t\t\titem.m_Callback->Call(item.m_Coords, true);\n\t\t}\n\t\tNumChunksGenerated++;\n\t}  // while (!bStop)\n}\n\n\n\n\n\nvoid cChunkGeneratorThread::DoGenerate(cChunkCoords a_Coords)\n{\n\tASSERT(m_PluginInterface != nullptr);\n\tASSERT(m_ChunkSink != nullptr);\n\n\tcChunkDesc ChunkDesc(a_Coords);\n\tm_PluginInterface->CallHookChunkGenerating(ChunkDesc);\n\tm_Generator->Generate(ChunkDesc);\n\tm_PluginInterface->CallHookChunkGenerated(ChunkDesc);\n\n\t#ifndef NDEBUG\n\t\t// Verify that the generator has produced valid data:\n\t\tChunkDesc.VerifyHeightmap();\n\t#endif\n\n\tm_ChunkSink->OnChunkGenerated(ChunkDesc);\n}\n"
  },
  {
    "path": "src/ChunkGeneratorThread.h",
    "content": "#pragma once\n\n#include \"OSSupport/IsThread.h\"\n#include \"ChunkDef.h\"\n\n\n\n\n// fwd:\nclass cIniFile;\nclass cChunkDesc;\nclass cChunkGenerator;\n\n\n\n\n\n/** Takes requests for generating chunks and processes them in a separate thread one by one.\nThe requests are not added to the queue if there is already a request with the same coords.\nBefore generating, the thread checks if the chunk hasn't been already generated.\nIt is theoretically possible to have multiple generator threads by having multiple instances of this object,\nbut then it MAY happen that the chunk is generated twice.\nIf the generator queue is overloaded, the generator skips chunks with no clients in them. */\nclass cChunkGeneratorThread :\n\tpublic cIsThread\n{\n\tusing Super = cIsThread;\n\npublic:\n\n\t/** The interface through which the plugins are called for their OnChunkGenerating / OnChunkGenerated hooks. */\n\tclass cPluginInterface\n\t{\n\tpublic:\n\t\t// Force a virtual destructor\n\t\tvirtual ~cPluginInterface() {}\n\n\t\t/** Called when the chunk is about to be generated.\n\t\tThe generator may be partly or fully overriden by the implementation. */\n\t\tvirtual void CallHookChunkGenerating(cChunkDesc & a_ChunkDesc) = 0;\n\n\t\t/** Called after the chunk is generated, before it is handed to the chunk sink.\n\t\ta_ChunkDesc contains the generated chunk data. Implementation may modify this data. */\n\t\tvirtual void CallHookChunkGenerated(cChunkDesc & a_ChunkDesc) = 0;\n\t} ;\n\n\n\t/** The interface through which the generated chunks are handed to the cWorld or whoever created us. */\n\tclass cChunkSink\n\t{\n\tpublic:\n\t\t// Force a virtual destructor\n\t\tvirtual ~cChunkSink() {}\n\n\t\t/** Called after the chunk has been generated\n\t\tThe interface may store the chunk, send it over network, whatever.\n\t\tThe chunk is not expected to be modified, but the generator will survive if the implementation\n\t\tchanges the data within. All changes are ignored, though. */\n\t\tvirtual void OnChunkGenerated(cChunkDesc & a_ChunkDesc) = 0;\n\n\t\t/** Called just before the chunk generation is started,\n\t\tto verify that it hasn't been generated in the meantime.\n\t\tIf this callback returns true, the chunk is not generated. */\n\t\tvirtual bool IsChunkValid(cChunkCoords a_Coords) = 0;\n\n\t\t/** Called when the generator is overloaded to skip chunks that are no longer needed.\n\t\tIf this callback returns false, the chunk is not generated. */\n\t\tvirtual bool HasChunkAnyClients(cChunkCoords a_Coords) = 0;\n\n\t\t/** Called to check whether the specified chunk is in the queued state.\n\t\tCurrently used only in Debug-mode asserts. */\n\t\tvirtual bool IsChunkQueued(cChunkCoords a_Coords) = 0;\n\t} ;\n\n\n\tcChunkGeneratorThread (void);\n\tvirtual ~cChunkGeneratorThread() override;\n\n\t/** Read settings from the ini file and initialize in preperation for being started. */\n\tbool Initialize(cPluginInterface & a_PluginInterface, cChunkSink & a_ChunkSink, cIniFile & a_IniFile);\n\n\tvoid Stop(void);\n\n\t/** Queues the chunk for generation\n\tIf a-ForceGenerate is set, the chunk is regenerated even if the data is already present in the chunksink.\n\ta_Callback is called after the chunk is generated. If the chunk was already present, the callback is still called, even if not regenerating.\n\tIt is legal to set the callback to nullptr, no callback is called then.\n\tIf the generator becomes overloaded and skips this chunk, the callback is still called. */\n\tvoid QueueGenerateChunk(cChunkCoords a_Coords, bool a_ForceRegeneration, cChunkCoordCallback * a_Callback = nullptr);\n\n\t/** Generates the biomes for the specified chunk (directly, not in a separate thread). Used by the world loader if biomes failed loading. */\n\tvoid GenerateBiomes(cChunkCoords a_Coords, cChunkDef::BiomeMap & a_BiomeMap);\n\n\tvoid WaitForQueueEmpty();\n\n\tsize_t GetQueueLength() const;\n\n\tint GetSeed() const;\n\n\t/** Returns the biome at the specified coords. Used by ChunkMap if an invalid chunk is queried for biome */\n\tEMCSBiome GetBiomeAt(int a_BlockX, int a_BlockZ);\n\n\nprivate:\n\n\tstruct QueueItem\n\t{\n\t\t/** The chunk coords */\n\t\tcChunkCoords m_Coords;\n\n\t\t/** Force the regeneration of an already existing chunk */\n\t\tbool m_ForceRegeneration;\n\n\t\t/** Callback to call after generating. */\n\t\tcChunkCoordCallback * m_Callback;\n\n\t\tQueueItem(cChunkCoords a_Coords, bool a_ForceRegeneration, cChunkCoordCallback * a_Callback):\n\t\t\tm_Coords(a_Coords),\n\t\t\tm_ForceRegeneration(a_ForceRegeneration),\n\t\t\tm_Callback(a_Callback)\n\t\t{\n\t\t}\n\t};\n\n\tusing Queue = std::list<QueueItem>;\n\n\n\t/** CS protecting access to the queue. */\n\tmutable cCriticalSection m_CS;\n\n\t/** Queue of the chunks to be generated. Protected against multithreaded access by m_CS. */\n\tQueue m_Queue;\n\n\t/** Set when an item is added to the queue or the thread should terminate. */\n\tcEvent m_Event;\n\n\t/** Set when an item is removed from the queue. */\n\tcEvent m_evtRemoved;\n\n\t/** The actual chunk generator engine used. */\n\tstd::unique_ptr<cChunkGenerator> m_Generator;\n\n\t/** The plugin interface that may modify the generated chunks */\n\tcPluginInterface * m_PluginInterface;\n\n\t/** The destination where the generated chunks are sent */\n\tcChunkSink * m_ChunkSink;\n\n\n\t// cIsThread override:\n\tvirtual void Execute(void) override;\n\n\t/** Generates the specified chunk and sets it into the chunksink. */\n\tvoid DoGenerate(cChunkCoords a_Coords);\n};\n\n\n\n\n"
  },
  {
    "path": "src/ChunkMap.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ChunkMap.h\"\n#include \"BlockInfo.h\"\n#include \"World.h\"\n#include \"Root.h\"\n#include \"Entities/Player.h\"\n#include \"Item.h\"\n#include \"Chunk.h\"\n#include \"Generating/Trees.h\"  // used in cChunkMap::ReplaceTreeBlocks() for tree block discrimination\n#include \"BlockArea.h\"\n#include \"Bindings/PluginManager.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"MobCensus.h\"\n#include \"MobSpawner.h\"\n#include \"BoundingBox.h\"\n#include \"SetChunkData.h\"\n#include \"Blocks/ChunkInterface.h\"\n#include \"Entities/Pickup.h\"\n#include \"DeadlockDetect.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cChunkMap:\n\ncChunkMap::cChunkMap(cWorld * a_World) :\n\tm_World(a_World)\n{\n}\n\n\n\n\n\ncChunk & cChunkMap::ConstructChunk(int a_ChunkX, int a_ChunkZ)\n{\n\t// If not exists insert. Then, return the chunk at these coordinates:\n\treturn m_Chunks.try_emplace(\n\t\t{ a_ChunkX, a_ChunkZ },\n\t\ta_ChunkX, a_ChunkZ, this, m_World\n\t).first->second;\n}\n\n\n\n\n\ncChunk & cChunkMap::GetChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT(m_CSChunks.IsLockedByCurrentThread());  // m_CSChunks should already be locked by the operation that called us\n\n\tauto & Chunk = ConstructChunk(a_ChunkX, a_ChunkZ);\n\tif (!Chunk.IsValid() && !Chunk.IsQueued())\n\t{\n\t\tChunk.SetPresence(cChunk::cpQueued);\n\t\tm_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkZ);\n\t}\n\treturn Chunk;\n}\n\n\n\n\n\ncChunk * cChunkMap::FindChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT(m_CSChunks.IsLockedByCurrentThread());\n\n\tconst auto Chunk = m_Chunks.find({ a_ChunkX, a_ChunkZ });\n\treturn (Chunk == m_Chunks.end()) ? nullptr : &Chunk->second;\n}\n\n\n\n\n\nconst cChunk * cChunkMap::FindChunk(int a_ChunkX, int a_ChunkZ) const\n{\n\tASSERT(m_CSChunks.IsLockedByCurrentThread());\n\n\tconst auto Chunk = m_Chunks.find({ a_ChunkX, a_ChunkZ });\n\treturn (Chunk == m_Chunks.end()) ? nullptr : &Chunk->second;\n}\n\n\n\n\n\nvoid cChunkMap::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client)\n{\n\tcCSLock Lock(m_CSChunks);\n\tint ChunkX, ChunkZ;\n\tcChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ);\n\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn;\n\t}\n\tChunk->SendBlockEntity(a_BlockX, a_BlockY, a_BlockZ, a_Client);\n}\n\n\n\n\n\nbool cChunkMap::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ)\n{\n\t// a_Player rclked block entity at the coords specified, handle it\n\tcCSLock Lock(m_CSChunks);\n\tint ChunkX, ChunkZ;\n\tcChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ);\n\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn false;\n\t}\n\treturn Chunk->UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ);\n}\n\n\n\n\n\nbool cChunkMap::DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback a_Callback)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn false;\n\t}\n\treturn a_Callback(*Chunk);\n}\n\n\n\n\n\nbool cChunkMap::DoWithChunkAt(Vector3i a_BlockPos, cChunkCallback a_Callback)\n{\n\tconst auto Position = cChunkDef::BlockToChunk(a_BlockPos);\n\treturn DoWithChunk(Position.m_ChunkX, Position.m_ChunkZ, a_Callback);\n}\n\n\n\n\n\nvoid cChunkMap::WakeUpSimulators(Vector3i a_Block)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Position = cChunkDef::BlockToChunk(a_Block);\n\tconst auto Chunk = FindChunk(Position.m_ChunkX, Position.m_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tm_World->GetSimulatorManager()->WakeUp(*Chunk, cChunkDef::AbsoluteToRelative(a_Block, Position));\n}\n\n\n\n\n\nvoid cChunkMap::MarkChunkDirty(int a_ChunkX, int a_ChunkZ)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn;\n\t}\n\tChunk->MarkDirty();\n}\n\n\n\n\n\nvoid cChunkMap::MarkChunkSaving(int a_ChunkX, int a_ChunkZ)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn;\n\t}\n\tChunk->MarkSaving();\n}\n\n\n\n\n\nvoid cChunkMap::MarkChunkSaved (int a_ChunkX, int a_ChunkZ)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn;\n\t}\n\tChunk->MarkSaved();\n}\n\n\n\n\n\nvoid cChunkMap::SetChunkData(struct SetChunkData && a_SetChunkData)\n{\n\tconst int ChunkX = a_SetChunkData.Chunk.m_ChunkX;\n\tconst int ChunkZ = a_SetChunkData.Chunk.m_ChunkZ;\n\t{\n\t\tcCSLock Lock(m_CSChunks);\n\t\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\t\tASSERT(Chunk != nullptr);  // Chunk cannot have unloaded since it is marked as queued\n\t\tChunk->SetAllData(std::move(a_SetChunkData));\n\n\t\t// Notify relevant ChunkStays:\n\t\tcChunkStays ToBeDisabled;\n\t\tfor (cChunkStays::iterator itr = m_ChunkStays.begin(), end = m_ChunkStays.end(); itr != end; ++itr)\n\t\t{\n\t\t\tif ((*itr)->ChunkAvailable(ChunkX, ChunkZ))\n\t\t\t{\n\t\t\t\t// The chunkstay wants to be disabled, add it to a list of to-be-disabled chunkstays for later processing:\n\t\t\t\tToBeDisabled.push_back(*itr);\n\t\t\t}\n\t\t}  // for itr - m_ChunkStays[]\n\n\t\t// Disable (and possibly remove) the chunkstays that chose to get disabled:\n\t\tfor (cChunkStays::iterator itr = ToBeDisabled.begin(), end = ToBeDisabled.end(); itr != end; ++itr)\n\t\t{\n\t\t\t(*itr)->Disable();\n\t\t}\n\t}\n\n\t// Notify plugins of the chunk becoming available\n\tcPluginManager::Get()->CallHookChunkAvailable(*m_World, ChunkX, ChunkZ);\n}\n\n\n\n\n\nvoid cChunkMap::ChunkLighted(\n\tint a_ChunkX, int a_ChunkZ,\n\tconst cChunkDef::BlockNibbles & a_BlockLight,\n\tconst cChunkDef::BlockNibbles & a_SkyLight\n)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tif (Chunk == nullptr)\n\t{\n\t\t// Chunk probably unloaded in the meantime\n\t\treturn;\n\t}\n\tChunk->SetLight(a_BlockLight, a_SkyLight);\n}\n\n\n\n\n\nbool cChunkMap::GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) const\n{\n\tif (!a_Callback.Coords(a_Coords.m_ChunkX, a_Coords.m_ChunkZ))\n\t{\n\t\t// The callback doesn't want the data\n\t\treturn false;\n\t}\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_Coords.m_ChunkX, a_Coords.m_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\t// The chunk is not present\n\t\treturn false;\n\t}\n\tChunk->GetAllData(a_Callback);\n\treturn true;\n}\n\n\n\n\n\nbool cChunkMap::IsChunkQueued(int a_ChunkX, int a_ChunkZ) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\treturn (Chunk != nullptr) && Chunk->IsQueued();\n}\n\n\n\n\n\nbool cChunkMap::IsWeatherSunnyAt(int a_BlockX, int a_BlockZ) const\n{\n\tint ChunkX, ChunkZ, BlockY = 0;\n\tcChunkDef::AbsoluteToRelative(a_BlockX, BlockY, a_BlockZ, ChunkX, ChunkZ);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn m_World->IsWeatherSunny();\n\t}\n\n\treturn Chunk->IsWeatherSunnyAt(a_BlockX, a_BlockZ);\n}\n\n\n\n\n\nbool cChunkMap::IsWeatherWetAt(int a_BlockX, int a_BlockZ) const\n{\n\tint ChunkX, ChunkZ, BlockY = 0;\n\tcChunkDef::AbsoluteToRelative(a_BlockX, BlockY, a_BlockZ, ChunkX, ChunkZ);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn m_World->IsWeatherWet();\n\t}\n\n\treturn Chunk->IsWeatherWetAt(a_BlockX, a_BlockZ);\n}\n\n\n\n\n\nbool cChunkMap::IsWeatherWetAt(const Vector3i a_Position) const\n{\n\tconst auto ChunkPosition = cChunkDef::BlockToChunk(a_Position);\n\tconst auto Position = cChunkDef::AbsoluteToRelative(a_Position, ChunkPosition);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkPosition.m_ChunkX, ChunkPosition.m_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn m_World->IsWeatherWet();\n\t}\n\n\treturn Chunk->IsWeatherWetAt(Position);\n}\n\n\n\n\n\nbool cChunkMap::IsChunkValid(int a_ChunkX, int a_ChunkZ) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\treturn (Chunk != nullptr) && Chunk->IsValid();\n}\n\n\n\n\n\nbool cChunkMap::HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\treturn (Chunk != nullptr) && Chunk->HasAnyClients();\n}\n\n\n\n\n\nstd::optional<int> cChunkMap::GetHeight(int a_BlockX, int a_BlockZ)\n{\n\t// Returns std::nullopt if chunk not loaded / generated.\n\tcCSLock Lock(m_CSChunks);\n\tint ChunkX, ChunkZ, BlockY = 0;\n\tcChunkDef::AbsoluteToRelative(a_BlockX, BlockY, a_BlockZ, ChunkX, ChunkZ);\n\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn std::nullopt;\n\t}\n\n\treturn Chunk->GetHeight(a_BlockX, a_BlockZ);\n}\n\n\n\n\n\nvoid cChunkMap::FastSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\tChunk->FastSetBlock(relPos, a_BlockType, a_BlockMeta);\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::CollectPickupsByEntity(cEntity & a_Entity)\n{\n\tcCSLock Lock(m_CSChunks);\n\n\tauto BoundingBox = a_Entity.GetBoundingBox();\n\tBoundingBox.Expand(1, 0.5, 1);\n\n\tForEachEntityInBox(BoundingBox, [&a_Entity](cEntity & Entity)\n\t{\n\t\t// Only pickups and projectiles can be picked up:\n\t\tif (Entity.IsPickup())\n\t\t{\n\t\t\t/*\n\t\t\tLOG(\"Pickup %d being collected by player \\\"%s\\\", distance %f\",\n\t\t\t\t(*itr)->GetUniqueID(), a_Player->GetName().c_str(), SqrDist\n\t\t\t);\n\t\t\t*/\n\t\t\tstatic_cast<cPickup &>(Entity).CollectedBy(a_Entity);\n\t\t}\n\t\telse if (Entity.IsProjectile() && a_Entity.IsPlayer())\n\t\t{\n\t\t\tstatic_cast<cProjectileEntity &>(Entity).CollectedBy(static_cast<cPlayer&>(a_Entity));\n\t\t}\n\n\t\t// The entities will MarkDirty when they Destroy themselves\n\t\treturn false;\n\t});\n}\n\n\n\n\n\nBLOCKTYPE cChunkMap::GetBlock(Vector3i a_BlockPos) const\n{\n\tif (!cChunkDef::IsValidHeight(a_BlockPos))\n\t{\n\t\treturn 0;\n\t}\n\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\n\t// Query the chunk, if loaded:\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\treturn Chunk->GetBlock(relPos);\n\t}\n\treturn 0;\n}\n\n\n\n\n\nNIBBLETYPE cChunkMap::GetBlockMeta(Vector3i a_BlockPos) const\n{\n\tif (!cChunkDef::IsValidHeight(a_BlockPos))\n\t{\n\t\treturn 0;\n\t}\n\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\n\t// Query the chunk, if loaded:\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\treturn Chunk->GetMeta(relPos);\n\t}\n\treturn 0;\n}\n\n\n\n\n\nNIBBLETYPE cChunkMap::GetBlockSkyLight(Vector3i a_BlockPos) const\n{\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\n\t// Query the chunk, if loaded:\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\treturn Chunk->GetSkyLight(relPos);\n\t}\n\treturn 0;\n}\n\n\n\n\n\nNIBBLETYPE cChunkMap::GetBlockBlockLight(Vector3i a_BlockPos) const\n{\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\n\t// Query the chunk, if loaded:\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\treturn Chunk->GetBlockLight(relPos);\n\t}\n\treturn 0;\n}\n\n\n\n\n\nvoid cChunkMap::SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_BlockMeta)\n{\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\n\t// Query the chunk, if loaded:\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\tChunk->SetMeta(relPos, a_BlockMeta);\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\tChunk->SetBlock(relPos, a_BlockType, a_BlockMeta);\n\t}\n}\n\n\n\n\n\nbool cChunkMap::GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n{\n\tif (!cChunkDef::IsValidHeight(a_BlockPos))\n\t{\n\t\t// Initialise the params to fulfil our contract.\n\t\ta_BlockType = 0;\n\t\ta_BlockMeta = 0;\n\t\treturn false;\n\t}\n\n\tauto chunkCoord = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkCoord);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkCoord.m_ChunkX, chunkCoord.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\tChunk->GetBlockTypeMeta(relPos, a_BlockType, a_BlockMeta);\n\t\treturn true;\n\t}\n\n\t// Initialise the params to fulfil our contract.\n\ta_BlockType = 0;\n\ta_BlockMeta = 0;\n\treturn false;\n}\n\n\n\n\n\nbool cChunkMap::GetBlockInfo(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const\n{\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\n\t// Query the chunk, if loaded:\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\tChunk->GetBlockInfo(relPos, a_BlockType, a_Meta, a_SkyLight, a_BlockLight);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cChunkMap::ReplaceTreeBlocks(const sSetBlockVector & a_Blocks)\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (sSetBlockVector::const_iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr)\n\t{\n\t\tconst auto Chunk = FindChunk(itr->m_ChunkX, itr->m_ChunkZ);\n\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tVector3i relPos(itr->m_RelX, itr->m_RelY, itr->m_RelZ);\n\t\tswitch (Chunk->GetBlock(relPos))\n\t\t{\n\t\t\tCASE_TREE_OVERWRITTEN_BLOCKS:\n\t\t\t{\n\t\t\t\tChunk->SetBlock(relPos, itr->m_BlockType, itr->m_BlockMeta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_LEAVES:\n\t\t\tcase E_BLOCK_NEW_LEAVES:\n\t\t\t{\n\t\t\t\tif ((itr->m_BlockType == E_BLOCK_LOG) || (itr->m_BlockType == E_BLOCK_NEW_LOG))\n\t\t\t\t{\n\t\t\t\t\tChunk->SetBlock(relPos, itr->m_BlockType, itr->m_BlockMeta);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}  // for itr - a_Blocks[]\n}\n\n\n\n\n\nEMCSBiome cChunkMap::GetBiomeAt(int a_BlockX, int a_BlockZ) const\n{\n\tint ChunkX, ChunkZ, X = a_BlockX, Y = 0, Z = a_BlockZ;\n\tcChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\treturn Chunk->GetBiomeAt(X, Z);\n\t}\n\treturn EMCSBiome::biInvalidBiome;\n}\n\n\n\n\n\nbool cChunkMap::SetBiomeAt(int a_BlockX, int a_BlockZ, EMCSBiome a_Biome)\n{\n\tint ChunkX, ChunkZ, X = a_BlockX, Y = 0, Z = a_BlockZ;\n\tcChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t{\n\t\tChunk->SetBiomeAt(X, Z, a_Biome);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cChunkMap::SetAreaBiome(int a_MinX, int a_MaxX, int a_MinZ, int a_MaxZ, EMCSBiome a_Biome)\n{\n\t// Translate coords to relative:\n\tint Y = 0;\n\tint MinChunkX, MinChunkZ, MinX = a_MinX, MinZ = a_MinZ;\n\tint MaxChunkX, MaxChunkZ, MaxX = a_MaxX, MaxZ = a_MaxZ;\n\tcChunkDef::AbsoluteToRelative(MinX, Y, MinZ, MinChunkX, MinChunkZ);\n\tcChunkDef::AbsoluteToRelative(MaxX, Y, MaxZ, MaxChunkX, MaxChunkZ);\n\n\t// Go through all chunks, set:\n\tbool res = true;\n\tcCSLock Lock(m_CSChunks);\n\tfor (int x = MinChunkX; x <= MaxChunkX; x++)\n\t{\n\t\tint MinRelX = (x == MinChunkX) ? MinX : 0;\n\t\tint MaxRelX = (x == MaxChunkX) ? MaxX : cChunkDef::Width - 1;\n\t\tfor (int z = MinChunkZ; z <= MaxChunkZ; z++)\n\t\t{\n\t\t\tint MinRelZ = (z == MinChunkZ) ? MinZ : 0;\n\t\t\tint MaxRelZ = (z == MaxChunkZ) ? MaxZ : cChunkDef::Width - 1;\n\t\t\tconst auto Chunk = FindChunk(x, z);\n\t\t\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t\t\t{\n\t\t\t\tChunk->SetAreaBiome(MinRelX, MaxRelX, MinRelZ, MaxRelZ, a_Biome);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tres = false;\n\t\t\t}\n\t\t}  // for z\n\t}  // for x\n\treturn res;\n}\n\n\n\n\n\nbool cChunkMap::GetBlocks(sSetBlockVector & a_Blocks, bool a_ContinueOnFailure)\n{\n\tbool res = true;\n\tcCSLock Lock(m_CSChunks);\n\tfor (sSetBlockVector::iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr)\n\t{\n\t\tconst auto Chunk = FindChunk(itr->m_ChunkX, itr->m_ChunkZ);\n\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t{\n\t\t\tif (!a_ContinueOnFailure)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tres = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!cChunkDef::IsValidHeight(itr->GetRelativePos()))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\titr->m_BlockType = Chunk->GetBlock(itr->m_RelX, itr->m_RelY, itr->m_RelZ);\n\t\titr->m_BlockMeta = Chunk->GetMeta(itr->m_RelX, itr->m_RelY, itr->m_RelZ);\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool cChunkMap::DigBlock(Vector3i a_BlockPos)\n{\n\tauto chunkCoords = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkCoords);\n\n\t{\n\t\tcCSLock Lock(m_CSChunks);\n\t\tconst auto Chunk = FindChunk(chunkCoords.m_ChunkX, chunkCoords.m_ChunkZ);\n\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tChunk->SetBlock(relPos, E_BLOCK_AIR, 0);\n\t}\n\treturn true;\n}\n\n\n\n\n\ncItems cChunkMap::PickupsFromBlock(Vector3i a_BlockPos, const cEntity * a_Digger, const cItem * a_Tool)\n{\n\tauto chunkCoords = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkCoords);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkCoords.m_ChunkX, chunkCoords.m_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn {};\n\t}\n\treturn Chunk->PickupsFromBlock(relPos, a_Digger, a_Tool);\n}\n\n\n\n\n\nvoid cChunkMap::SendBlockTo(int a_X, int a_Y, int a_Z, const cPlayer & a_Player)\n{\n\tint ChunkX, ChunkZ;\n\tcChunkDef::AbsoluteToRelative(a_X, a_Y, a_Z, ChunkX, ChunkZ);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkX, ChunkZ);\n\tif ((Chunk != nullptr) && (Chunk->IsValid()))\n\t{\n\t\tChunk->SendBlockTo(a_X, a_Y, a_Z, a_Player.GetClientHandle());\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk1 = FindChunk(a_ChunkX1, a_ChunkZ1);\n\tif (Chunk1 == nullptr)\n\t{\n\t\treturn;\n\t}\n\tconst auto Chunk2 = FindChunk(a_ChunkX2, a_ChunkZ2);\n\tif (Chunk2 == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tCompareChunkClients(Chunk1, Chunk2, a_Callback);\n}\n\n\n\n\n\nvoid cChunkMap::CompareChunkClients(cChunk * a_Chunk1, cChunk * a_Chunk2, cClientDiffCallback & a_Callback)\n{\n\tconst auto & Clients1 = a_Chunk1->GetAllClients();\n\tconst auto & Clients2 = a_Chunk2->GetAllClients();\n\n\t// Find \"removed\" clients:\n\tfor (auto * Client : Clients1)\n\t{\n\t\tbool Found = (std::find(Clients2.begin(), Clients2.end(), Client) != Clients2.end());\n\t\tif (!Found)\n\t\t{\n\t\t\ta_Callback.Removed(Client);\n\t\t}\n\t}  // for Client - Clients1[]\n\n\t// Find \"added\" clients:\n\tfor (auto * Client : Clients2)\n\t{\n\t\tbool Found = (std::find(Clients1.begin(), Clients1.end(), Client) != Clients1.end());\n\t\tif (!Found)\n\t\t{\n\t\t\ta_Callback.Added(Client);\n\t\t}\n\t}  // for Client - Clients2[]\n}\n\n\n\n\n\nbool cChunkMap::AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client)\n{\n\tcCSLock Lock(m_CSChunks);\n\treturn GetChunk(a_ChunkX, a_ChunkZ).AddClient(a_Client);\n}\n\n\n\n\n\nvoid cChunkMap::RemoveChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tASSERT(Chunk != nullptr);\n\tChunk->RemoveClient(a_Client);\n}\n\n\n\n\n\nvoid cChunkMap::RemoveClientFromChunks(cClientHandle * a_Client)\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (auto & Chunk : m_Chunks)\n\t{\n\t\tChunk.second.RemoveClient(a_Client);\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::AddEntity(OwnedEntity a_Entity)\n{\n\tcCSLock Lock(m_CSChunks);\n\tif (FindChunk(a_Entity->GetChunkX(), a_Entity->GetChunkZ()) == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: Entity at %p (%s, ID %d) spawning in a non-existent chunk.\",\n\t\t\t__FUNCTION__, static_cast<void *>(a_Entity.get()), a_Entity->GetClass(), a_Entity->GetUniqueID()\n\t\t);\n\t}\n\n\tconst auto EntityPtr = a_Entity.get();\n\tASSERT(EntityPtr->GetWorld() == m_World);\n\n\tauto & Chunk = ConstructChunk(a_Entity->GetChunkX(), a_Entity->GetChunkZ());\n\tChunk.AddEntity(std::move(a_Entity));\n\n\tEntityPtr->OnAddToWorld(*m_World);\n\tASSERT(!EntityPtr->IsTicking());\n\tEntityPtr->SetIsTicking(true);\n\n\tcPluginManager::Get()->CallHookSpawnedEntity(*m_World, *EntityPtr);\n}\n\n\n\n\n\nvoid cChunkMap::AddPlayer(std::unique_ptr<cPlayer> a_Player)\n{\n\tcCSLock Lock(m_CSChunks);\n\tauto & Chunk = ConstructChunk(a_Player->GetChunkX(), a_Player->GetChunkZ());  // Always construct the chunk for players\n\tASSERT(!Chunk.HasEntity(a_Player->GetUniqueID()));\n\tChunk.AddEntity(std::move(a_Player));\n}\n\n\n\n\n\nbool cChunkMap::HasEntity(UInt32 a_UniqueID) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (const auto & Chunk : m_Chunks)\n\t{\n\t\tif (Chunk.second.IsValid() && Chunk.second.HasEntity(a_UniqueID))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nOwnedEntity cChunkMap::RemoveEntity(cEntity & a_Entity)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = a_Entity.GetParentChunk();\n\n\tif (Chunk == nullptr)\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Remove the entity no matter whether the chunk itself is valid or not (#1190)\n\treturn Chunk->RemoveEntity(a_Entity);\n}\n\n\n\n\n\nbool cChunkMap::ForEachEntity(cEntityCallback a_Callback) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (const auto & Chunk : m_Chunks)\n\t{\n\t\tif (Chunk.second.IsValid() && !Chunk.second.ForEachEntity(a_Callback))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cChunkMap::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback a_Callback)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn false;\n\t}\n\treturn Chunk->ForEachEntity(a_Callback);\n}\n\n\n\n\n\nbool cChunkMap::ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback)\n{\n\t// Calculate the chunk range for the box:\n\tint MinChunkX = FloorC(a_Box.GetMinX() / cChunkDef::Width);\n\tint MinChunkZ = FloorC(a_Box.GetMinZ() / cChunkDef::Width);\n\tint MaxChunkX = FloorC((a_Box.GetMaxX() + cChunkDef::Width) / cChunkDef::Width);\n\tint MaxChunkZ = FloorC((a_Box.GetMaxZ() + cChunkDef::Width) / cChunkDef::Width);\n\n\t// Iterate over each chunk in the range:\n\tcCSLock Lock(m_CSChunks);\n\tfor (int z = MinChunkZ; z <= MaxChunkZ; z++)\n\t{\n\t\tfor (int x = MinChunkX; x <= MaxChunkX; x++)\n\t\t{\n\t\t\tconst auto Chunk = FindChunk(x, z);\n\t\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!Chunk->ForEachEntityInBox(a_Box, a_Callback))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}  // for x\n\t}  // for z\n\treturn true;\n}\n\n\n\n\n\nbool cChunkMap::DoWithEntityByID(UInt32 a_UniqueID, cEntityCallback a_Callback) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tbool res = false;\n\tfor (const auto & Chunk : m_Chunks)\n\t{\n\t\tif (Chunk.second.IsValid() && Chunk.second.DoWithEntityByID(a_UniqueID, a_Callback, res))\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cChunkMap::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback a_Callback)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn false;\n\t}\n\treturn Chunk->ForEachBlockEntity(a_Callback);\n}\n\n\n\n\n\nbool cChunkMap::DoWithBlockEntityAt(const Vector3i a_Position, cBlockEntityCallback a_Callback)\n{\n\tconst auto ChunkPosition = cChunkDef::BlockToChunk(a_Position);\n\tconst auto Relative = cChunkDef::AbsoluteToRelative(a_Position, ChunkPosition);\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkPosition.m_ChunkX, ChunkPosition.m_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn false;\n\t}\n\treturn Chunk->DoWithBlockEntityAt(Relative, a_Callback);\n}\n\n\n\n\n\nvoid cChunkMap::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_Callback)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\n\t// If the chunk is not prepared, queue it in the lighting thread, that will do all the needed processing:\n\tif ((Chunk == nullptr) || !Chunk->IsValid() || !Chunk->IsLightValid())\n\t{\n\t\tm_World->GetLightingThread().QueueChunk(a_ChunkX, a_ChunkZ, std::move(a_Callback));\n\t\treturn;\n\t}\n\n\t// The chunk is present and lit, just call the callback, report as success:\n\tif (a_Callback != nullptr)\n\t{\n\t\ta_Callback->Call({a_ChunkX, a_ChunkZ}, true);\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::GenerateChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tcCSLock Lock(m_CSChunks);\n\tGetChunk(a_ChunkX, a_ChunkZ);  // Touches the chunk, loading or generating it\n}\n\n\n\n\n\nvoid cChunkMap::ChunkLoadFailed(int a_ChunkX, int a_ChunkZ)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tASSERT(Chunk != nullptr);  // Chunk cannot have unloaded since it is marked as queued\n\tChunk->MarkLoadFailed();\n}\n\n\n\n\n\nvoid cChunkMap::MarkChunkRegenerating(int a_ChunkX, int a_ChunkZ)\n{\n\tcCSLock Lock(m_CSChunks);\n\tConstructChunk(a_ChunkX, a_ChunkZ).MarkRegenerating();\n}\n\n\n\n\n\nbool cChunkMap::IsChunkLighted(int a_ChunkX, int a_ChunkZ)\n{\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);\n\tif (Chunk == nullptr)\n\t{\n\t\t// Not present\n\t\treturn false;\n\t}\n\treturn Chunk->IsLightValid();\n}\n\n\n\n\n\nbool cChunkMap::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback)\n{\n\tbool Result = true;\n\tcCSLock Lock(m_CSChunks);\n\tfor (int z = a_MinChunkZ; z <= a_MaxChunkZ; z++)\n\t{\n\t\tfor (int x = a_MinChunkX; x <= a_MaxChunkX; x++)\n\t\t{\n\t\t\tconst auto Chunk = FindChunk(x, z);\n\t\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t\t{\n\t\t\t\t// Not present / not valid\n\t\t\t\tResult = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!a_Callback.Coords(x, z))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tChunk->GetAllData(a_Callback);\n\t\t}\n\t}\n\treturn Result;\n}\n\n\n\n\n\nbool cChunkMap::ForEachLoadedChunk(cFunctionRef<bool(int, int)> a_Callback) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (const auto & Chunk : m_Chunks)\n\t{\n\t\tif (Chunk.second.IsValid())\n\t\t{\n\t\t\tif (a_Callback(Chunk.first.m_ChunkX, Chunk.first.m_ChunkZ))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cChunkMap::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)\n{\n\t// Convert block coords to chunks coords:\n\tint MinChunkX, MaxChunkX;\n\tint MinChunkZ, MaxChunkZ;\n\tint MinBlockX = a_MinBlockX;\n\tint MinBlockY = a_MinBlockY;\n\tint MinBlockZ = a_MinBlockZ;\n\tint MaxBlockX = a_MinBlockX + a_Area.GetSizeX();\n\tint MaxBlockY = a_MinBlockY + a_Area.GetSizeY();\n\tint MaxBlockZ = a_MinBlockZ + a_Area.GetSizeZ();\n\tcChunkDef::AbsoluteToRelative(MinBlockX, MinBlockY, MinBlockZ, MinChunkX, MinChunkZ);\n\tcChunkDef::AbsoluteToRelative(MaxBlockX, MaxBlockY, MaxBlockZ, MaxChunkX, MaxChunkZ);\n\n\t// Iterate over chunks, write data into each:\n\tbool Result = true;\n\tcCSLock Lock(m_CSChunks);\n\tfor (int z = MinChunkZ; z <= MaxChunkZ; z++)\n\t{\n\t\tfor (int x = MinChunkX; x <= MaxChunkX; x++)\n\t\t{\n\t\t\tconst auto Chunk = FindChunk(x, z);\n\t\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t\t{\n\t\t\t\t// Not present / not valid\n\t\t\t\tResult = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tChunk->WriteBlockArea(a_Area, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes);\n\t\t}  // for x\n\t}  // for z\n\treturn Result;\n}\n\n\n\n\n\nvoid cChunkMap::GetChunkStats(int & a_NumChunksValid, int & a_NumChunksDirty) const\n{\n\ta_NumChunksValid = 0;\n\ta_NumChunksDirty = 0;\n\tcCSLock Lock(m_CSChunks);\n\tfor (const auto & Chunk : m_Chunks)\n\t{\n\t\ta_NumChunksValid++;\n\t\tif (Chunk.second.IsDirty())\n\t\t{\n\t\t\ta_NumChunksDirty++;\n\t\t}\n\t}\n}\n\n\n\n\n\nint cChunkMap::GrowPlantAt(Vector3i a_BlockPos, int a_NumStages)\n{\n\tauto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);\n\tcCSLock lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(chunkPos.m_ChunkX, chunkPos.m_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn 0;\n\t}\n\treturn Chunk->GrowPlantAt(relPos, a_NumStages);\n}\n\n\n\n\n\nvoid cChunkMap::SetNextBlockToTick(const Vector3i a_BlockPos)\n{\n\tauto ChunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto RelPos = cChunkDef::AbsoluteToRelative(a_BlockPos, ChunkPos);\n\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkPos.m_ChunkX, ChunkPos.m_ChunkZ);\n\tif (Chunk != nullptr)\n\t{\n\t\tChunk->SetNextBlockToTick(RelPos);\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::CollectMobCensus(cMobCensus & a_ToFill)\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (auto & Chunk : m_Chunks)\n\t{\n\t\t// We do count every Mobs in the world. But we are assuming that every chunk not loaded by any client\n\t\t// doesn't affect us. Normally they should not have mobs because every \"too far\" mobs despawn\n\t\t// If they have (f.i. when player disconnect) we assume we don't have to make them live or despawn\n\t\tif (Chunk.second.IsValid() && Chunk.second.HasAnyClients())\n\t\t{\n\t\t\tChunk.second.CollectMobCensus(a_ToFill);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::SpawnMobs(cMobSpawner & a_MobSpawner)\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (auto & Chunk : m_Chunks)\n\t{\n\t\t// We only spawn close to players\n\t\tif (Chunk.second.IsValid() && Chunk.second.HasAnyClients())\n\t\t{\n\t\t\tChunk.second.SpawnMobs(a_MobSpawner);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::Tick(std::chrono::milliseconds a_Dt)\n{\n\tcCSLock Lock(m_CSChunks);\n\n\t// Do the magic of updating the world:\n\tfor (auto & Chunk : m_Chunks)\n\t{\n\t\tif (Chunk.second.ShouldBeTicked())\n\t\t{\n\t\t\tChunk.second.Tick(a_Dt);\n\t\t}\n\t}\n\n\t// Finally, only after all chunks are ticked, tell the client about all aggregated changes:\n\tfor (auto & Chunk : m_Chunks)\n\t{\n\t\tChunk.second.BroadcastPendingChanges();\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::TickBlock(const Vector3i a_BlockPos)\n{\n\tauto ChunkPos = cChunkDef::BlockToChunk(a_BlockPos);\n\tauto RelPos = cChunkDef::AbsoluteToRelative(a_BlockPos, ChunkPos);\n\tcCSLock Lock(m_CSChunks);\n\tconst auto Chunk = FindChunk(ChunkPos.m_ChunkX, ChunkPos.m_ChunkZ);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn;\n\t}\n\tChunk->TickBlock(RelPos);\n}\n\n\n\n\n\nvoid cChunkMap::UnloadUnusedChunks(void)\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (auto itr = m_Chunks.begin(); itr != m_Chunks.end();)\n\t{\n\t\tif (\n\t\t\titr->second.CanUnload() &&  // Can unload\n\t\t\t!cPluginManager::Get()->CallHookChunkUnloading(*GetWorld(), itr->first.m_ChunkX, itr->first.m_ChunkZ)  // Plugins agree\n\t\t)\n\t\t{\n\t\t\t// First notify plugins:\n\t\t\tcPluginManager::Get()->CallHookChunkUnloaded(*m_World, itr->first.m_ChunkX, itr->first.m_ChunkZ);\n\n\t\t\t// Notify entities within the chunk, while everything's still valid:\n\t\t\titr->second.OnUnload();\n\n\t\t\t// Kill the chunk:\n\t\t\titr = m_Chunks.erase(itr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++itr;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cChunkMap::SaveAllChunks(void) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tfor (const auto & Chunk : m_Chunks)\n\t{\n\t\tif (Chunk.second.IsValid() && Chunk.second.IsDirty())\n\t\t{\n\t\t\tGetWorld()->GetStorage().QueueSaveChunk(Chunk.first.m_ChunkX, Chunk.first.m_ChunkZ);\n\t\t}\n\t}\n}\n\n\n\n\n\nsize_t cChunkMap::GetNumChunks(void) const\n{\n\tcCSLock Lock(m_CSChunks);\n\treturn m_Chunks.size();\n}\n\n\n\n\n\nsize_t cChunkMap::GetNumUnusedDirtyChunks(void) const\n{\n\tcCSLock Lock(m_CSChunks);\n\tsize_t res = 0;\n\tfor (const auto & Chunk : m_Chunks)\n\t{\n\t\tif (Chunk.second.IsValid() && Chunk.second.CanUnloadAfterSaving())\n\t\t{\n\t\t\tres += 1;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n\nvoid cChunkMap::ChunkValidated(void)\n{\n\tm_evtChunkValid.Set();\n}\n\n\n\n\n\nvoid cChunkMap::SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked)\n{\n\tcCSLock Lock(m_CSChunks);\n\tGetChunk(a_ChunkX, a_ChunkZ).SetAlwaysTicked(a_AlwaysTicked);\n}\n\n\n\n\n\nvoid cChunkMap::TrackInDeadlockDetect(cDeadlockDetect & a_DeadlockDetect, const AString & a_WorldName)\n{\n\ta_DeadlockDetect.TrackCriticalSection(m_CSChunks, fmt::format(FMT_STRING(\"World {} chunkmap\"), a_WorldName));\n}\n\n\n\n\n\nvoid cChunkMap::UntrackInDeadlockDetect(cDeadlockDetect & a_DeadlockDetect)\n{\n\ta_DeadlockDetect.UntrackCriticalSection(m_CSChunks);\n}\n\n\n\n\n\nvoid cChunkMap::AddChunkStay(cChunkStay & a_ChunkStay)\n{\n\tcCSLock Lock(m_CSChunks);\n\n\t// Add it to the list:\n\tASSERT(std::find(m_ChunkStays.begin(), m_ChunkStays.end(), &a_ChunkStay) == m_ChunkStays.end());  // Has not yet been added\n\tm_ChunkStays.push_back(&a_ChunkStay);\n\n\t// Schedule all chunks to be loaded / generated, and mark each as locked:\n\tconst cChunkCoordsVector & WantedChunks = a_ChunkStay.GetChunks();\n\tfor (cChunkCoordsVector::const_iterator itr = WantedChunks.begin(); itr != WantedChunks.end(); ++itr)\n\t{\n\t\tauto & Chunk = GetChunk(itr->m_ChunkX, itr->m_ChunkZ);\n\t\tChunk.Stay(true);\n\t\tif (Chunk.IsValid())\n\t\t{\n\t\t\tif (a_ChunkStay.ChunkAvailable(itr->m_ChunkX, itr->m_ChunkZ))\n\t\t\t{\n\t\t\t\t// The chunkstay wants to be deactivated, disable it and bail out:\n\t\t\t\ta_ChunkStay.Disable();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}  // for itr - WantedChunks[]\n}\n\n\n\n\n\n/** Removes the specified cChunkStay descendant from the internal list of ChunkStays. */\nvoid cChunkMap::DelChunkStay(cChunkStay & a_ChunkStay)\n{\n\tcCSLock Lock(m_CSChunks);\n\n\t// Remove from the list of active chunkstays:\n\tbool HasFound = false;\n\tfor (cChunkStays::iterator itr = m_ChunkStays.begin(), end = m_ChunkStays.end(); itr != end; ++itr)\n\t{\n\t\tif (*itr == &a_ChunkStay)\n\t\t{\n\t\t\tm_ChunkStays.erase(itr);\n\t\t\tHasFound = true;\n\t\t\tbreak;\n\t\t}\n\t}  // for itr - m_ChunkStays[]\n\n\tif (!HasFound)\n\t{\n\t\tASSERT(!\"Removing a cChunkStay that hasn't been added!\");\n\t\treturn;\n\t}\n\n\t// Unmark all contained chunks:\n\tconst cChunkCoordsVector & Chunks = a_ChunkStay.GetChunks();\n\tfor (cChunkCoordsVector::const_iterator itr = Chunks.begin(), end = Chunks.end(); itr != end; ++itr)\n\t{\n\t\tconst auto Chunk = FindChunk(itr->m_ChunkX, itr->m_ChunkZ);\n\t\tASSERT(Chunk != nullptr);  // Stayed chunks cannot unload\n\t\tChunk->Stay(false);\n\t}  // for itr - Chunks[]\n\ta_ChunkStay.OnDisabled();\n}\n"
  },
  {
    "path": "src/ChunkMap.h",
    "content": "\n// cChunkMap.h\n\n// Interfaces to the cChunkMap class representing the chunk storage for a single world\n\n#pragma once\n\n#include <optional>\n\n#include \"ChunkDataCallback.h\"\n#include \"EffectID.h\"\n#include \"FunctionRef.h\"\n\n\n\n\nclass cWorld;\nclass cItem;\nclass cItems;\nclass cChunkStay;\nclass cChunk;\nclass cPlayer;\nclass cBlockArea;\nclass cMobCensus;\nclass cMobSpawner;\nclass cBoundingBox;\nclass cDeadlockDetect;\n\nstruct SetChunkData;\n\nusing cChunkCallback        = cFunctionRef<bool(cChunk       &)>;\nusing cEntityCallback       = cFunctionRef<bool(cEntity      &)>;\nusing cBlockEntityCallback  = cFunctionRef<bool(cBlockEntity &)>;\n\n\n\n\n\nclass cChunkMap\n{\npublic:\n\n\tcChunkMap(cWorld * a_World);\n\n\t/** Sends the block entity, if it is at the coords specified, to a_Client */\n\tvoid SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client);\n\n\t/** a_Player rclked block entity at the coords specified, handle it\n\treturns true if the use was successful, return false to use the block as a \"normal\" block */\n\tbool UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z);\n\n\t/** Calls the callback for the chunk specified, with ChunkMapCS locked; returns false if the chunk doesn't exist, otherwise returns the same value as the callback */\n\tbool DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback a_Callback);\n\n\t/** Calls the callback for the chunk at the block position specified, with ChunkMapCS locked; returns false if the chunk doesn't exist, otherwise returns the same value as the callback */\n\tbool DoWithChunkAt(Vector3i a_BlockPos, cChunkCallback a_Callback);\n\n\t/** Wakes up simulators for the specified block */\n\tvoid WakeUpSimulators(Vector3i a_Block);\n\n\t// DEPRECATED, use the vector-parametered version instead.\n\tvoid WakeUpSimulators(int a_BlockX, int a_BlockY, int a_BlockZ)\n\t{\n\t\tLOGWARNING(\"cChunkMap::WakeUpSimulators(int, int, int) is deprecated, use cChunkMap::WakeUpSimulators(Vector3i) instead.\");\n\t\tWakeUpSimulators(Vector3i(a_BlockX, a_BlockY, a_BlockZ));\n\t}\n\n\tvoid MarkChunkDirty     (int a_ChunkX, int a_ChunkZ);\n\tvoid MarkChunkSaving    (int a_ChunkX, int a_ChunkZ);\n\tvoid MarkChunkSaved     (int a_ChunkX, int a_ChunkZ);\n\n\t/** Sets the chunk data as either loaded from the storage or generated.\n\tBlockLight and BlockSkyLight are optional, if not present, chunk will be marked as unlighted.\n\tIf MarkDirty is set, the chunk is set as dirty (used after generating)\n\tModifies the BlockEntity list in a_SetChunkData - moves the block entities into the chunk.\n\t*/\n\tvoid SetChunkData(SetChunkData && a_SetChunkData);\n\n\tvoid ChunkLighted(\n\t\tint a_ChunkX, int a_ChunkZ,\n\t\tconst cChunkDef::BlockNibbles & a_BlockLight,\n\t\tconst cChunkDef::BlockNibbles & a_SkyLight\n\t);\n\n\t/** Calls the callback with the chunk's data, if available (with ChunkCS locked).\n\tReturns true if the chunk was reported successfully, false if not (chunk not present or callback failed). */\n\tbool GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) const;\n\n\t/** Returns true iff the chunk is in the loader / generator queue. */\n\tbool IsChunkQueued(int a_ChunkX, int a_ChunkZ) const;\n\n\tbool IsWeatherSunnyAt(int a_BlockX, int a_BlockZ) const;\n\tbool IsWeatherWetAt(int a_BlockX, int a_BlockZ) const;\n\tbool IsWeatherWetAt(Vector3i a_Position) const;\n\n\tbool IsChunkValid       (int a_ChunkX, int a_ChunkZ) const;\n\tbool HasChunkAnyClients (int a_ChunkX, int a_ChunkZ) const;\n\n\tstd::optional<int> GetHeight(int a_BlockX, int a_BlockZ);  // Returns nullopt if chunk not loaded / generated\n\n\t/** Sets the block at the specified coords to the specified value.\n\tThe replacement doesn't trigger block updates, nor wake up simulators.\n\tThe replaced blocks aren't checked for block entities (block entity is leaked if it exists at this block).\n\tIf the chunk is invalid, the operation is ignored silently. */\n\tvoid FastSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** Makes the specified entity collect all the pickups around them. */\n\tvoid CollectPickupsByEntity(cEntity & a_Entity);\n\n\tBLOCKTYPE  GetBlock          (Vector3i a_BlockPos) const;\n\tNIBBLETYPE GetBlockMeta      (Vector3i a_BlockPos) const;\n\tNIBBLETYPE GetBlockSkyLight  (Vector3i a_BlockPos) const;\n\tNIBBLETYPE GetBlockBlockLight(Vector3i a_BlockPos) const;\n\n\t/** Sets the meta for the specified block, while keeping the blocktype.\n\tIgnored if the chunk is invalid. */\n\tvoid SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_BlockMeta);\n\n\tvoid SetBlock          (Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\t/** Get the block type and meta at the specified coords\n\tWill always initialise a_BlockType and a_BlockMeta if called.\n\tReturns false if the data could not be retrieved, either because the chunk is invalid or the height is invalid.\n\tOtherwise, returns true. */\n\tbool GetBlockTypeMeta  (Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const;\n\tbool GetBlockInfo      (Vector3i, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const;\n\n\t/** Special function used for growing trees, replaces only blocks that tree may overwrite */\n\tvoid ReplaceTreeBlocks(const sSetBlockVector & a_Blocks);\n\n\t/** Returns the biome at the specified coords. Reads the biome from the chunk, if loaded, invalid otherwise. */\n\tEMCSBiome GetBiomeAt(int a_BlockX, int a_BlockZ) const;\n\n\t/** Sets the biome at the specified coords. Returns true if successful, false if not (chunk not loaded).\n\tDoesn't resend the chunk to clients. */\n\tbool SetBiomeAt(int a_BlockX, int a_BlockZ, EMCSBiome a_Biome);\n\n\t/** Sets the biome at the area. Returns true if successful, false if any subarea failed (chunk not loaded).\n\t(Re)sends the chunks to their relevant clients if successful. */\n\tbool SetAreaBiome(int a_MinX, int a_MaxX, int a_MinZ, int a_MaxZ, EMCSBiome a_Biome);\n\n\t/** Retrieves block types and metas of the specified blocks.\n\tIf a chunk is not loaded, doesn't modify the block and consults a_ContinueOnFailure whether to process the rest of the array.\n\tReturns true if all blocks were read, false if any one failed. */\n\tbool GetBlocks(sSetBlockVector & a_Blocks, bool a_ContinueOnFailure);\n\n\t/** Removes the block at the specified coords and wakes up simulators.\n\tReturns false if the chunk is not loaded (and the block is not dug).\n\tReturns true if successful. */\n\tbool DigBlock(Vector3i a_BlockPos);\n\n\t/** Returns all the pickups that would result if the a_Digger dug up the block at a_BlockPos using a_Tool.\n\ta_Digger is usually a player, but can be nullptr for natural causes.\n\ta_Tool is an optional item used to dig up the block, used by the handlers (empty hand vs shears produce different pickups from leaves).\n\tAn empty hand is assumed if a_Tool is nullptr.\n\tReturns an empty cItems object if the chunk is not present. */\n\tcItems PickupsFromBlock(Vector3i a_BlockPos, const cEntity * a_Digger, const cItem * a_Tool);\n\n\t/** Sends the block at the specified coords to the specified player.\n\tUses a blockchange packet to send the block.\n\tIf the relevant chunk isn't loaded, doesn't do anything. */\n\tvoid SendBlockTo(int a_BlockX, int a_BlockY, int a_BlockZ, const cPlayer & a_Player);\n\n\t/** Compares clients of two chunks, calls the callback accordingly */\n\tvoid CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback);\n\n\t/** Compares clients of two chunks, calls the callback accordingly */\n\tvoid CompareChunkClients(cChunk * a_Chunk1, cChunk * a_Chunk2, cClientDiffCallback & a_Callback);\n\n\t/** Adds client to a chunk, if not already present; returns true if added, false if present */\n\tbool AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client);\n\n\t/** Removes the client from the chunk */\n\tvoid RemoveChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client);\n\n\t/** Removes the client from all chunks it is present in */\n\tvoid RemoveClientFromChunks(cClientHandle * a_Client);\n\n\t/** Adds the entity to its appropriate chunk, takes ownership of the entity pointer */\n\tvoid AddEntity(OwnedEntity a_Entity);\n\n\t/** Adds the player to its appropriate chunk, takes ownership of the player pointer */\n\tvoid AddPlayer(std::unique_ptr<cPlayer> a_Player);\n\n\t/** Returns true if the entity with specified ID is present in the chunks */\n\tbool HasEntity(UInt32 a_EntityID) const;\n\n\t/** Removes the entity from its appropriate chunk\n\tReturns an owning reference to the found entity. */\n\tOwnedEntity RemoveEntity(cEntity & a_Entity);\n\n\t/** Calls the callback for each entity in the entire world; returns true if all entities processed, false if the callback aborted by returning true */\n\tbool ForEachEntity(cEntityCallback a_Callback) const;  // Lua-accessible\n\n\t/** Calls the callback for each entity in the specified chunk; returns true if all entities processed, false if the callback aborted by returning true */\n\tbool ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback a_Callback);  // Lua-accessible\n\n\t/** Calls the callback for each entity that has a nonempty intersection with the specified boundingbox.\n\tReturns true if all entities processed, false if the callback aborted by returning true.\n\tIf any chunk in the box is missing, ignores the entities in that chunk silently. */\n\tbool ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback);  // Lua-accessible\n\n\t/** Calls the callback if the entity with the specified ID is found, with the entity object as the callback param.\n\tReturns true if entity found and callback returned false. */\n\tbool DoWithEntityByID(UInt32 a_EntityID, cEntityCallback a_Callback) const;  // Lua-accessible\n\n\t/** Calls the callback for each block entity in the specified chunk.\n\tReturns true if all block entities processed, false if the callback aborted by returning true. */\n\tbool ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback a_Callback);  // Lua-accessible\n\n\t/** Calls the callback for the block entity at the specified coords.\n\tReturns false if there's no block entity at those coords, and whatever the callback returns if found. */\n\tbool DoWithBlockEntityAt(Vector3i a_Position, cBlockEntityCallback a_Callback);  // Lua-acessible\n\n\t/** Queues the chunk for preparing - making sure that it's generated and lit.\n\tThe specified chunk is queued to be loaded or generated, and lit if needed.\n\tThe specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.\n\tIt is legal to call without the callback. */\n\tvoid PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter = {});  // Lua-accessible\n\n\t/** Queues the chunk for generating.\n\tFirst attempts to load the chunk from the storage. If that fails, queues the chunk for generating. */\n\tvoid GenerateChunk(int a_ChunkX, int a_ChunkZ);  // Lua-accessible\n\n\t/** Marks the chunk as failed-to-load */\n\tvoid ChunkLoadFailed(int a_ChunkX, int a_ChunkZ);\n\n\t/** Marks the chunk as being regenerated - all its clients want that chunk again (used by cWorld::RegenerateChunk()) */\n\tvoid MarkChunkRegenerating(int a_ChunkX, int a_ChunkZ);\n\n\tbool IsChunkLighted(int a_ChunkX, int a_ChunkZ);\n\n\t/** Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully */\n\tbool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback);\n\n\t/** Calls the callback for each loaded chunk. Returns true if all chunks have been processed successfully */\n\tbool ForEachLoadedChunk(cFunctionRef<bool(int, int)> a_Callback) const;\n\n\t/** Writes the block area into the specified coords. Returns true if all chunks have been processed. Prefer cBlockArea::Write() instead. */\n\tbool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes);\n\n\t/** Returns the number of valid chunks and the number of dirty chunks */\n\tvoid GetChunkStats(int & a_NumChunksValid, int & a_NumChunksDirty) const;\n\n\t/** Grows the plant at the specified position by at most a_NumStages.\n\tThe block's Grow handler is invoked.\n\tReturns the number of stages the plant has grown, 0 if not a plant. */\n\tint GrowPlantAt(Vector3i a_BlockPos, int a_NumStages = 1);\n\n\t/** Causes the specified block to be ticked on the next Tick() call.\n\tPlugins can use this via the cWorld:SetNextBlockToTick() API.\n\tOnly one block coord per chunk may be set, a second call overwrites the first call */\n\tvoid SetNextBlockToTick(const Vector3i a_BlockPos);\n\n\t/** Make a Mob census, of all mobs, their family, their chunk and their distance to closest player */\n\tvoid CollectMobCensus(cMobCensus & a_ToFill);\n\n\t/** Try to Spawn Monsters inside all Chunks */\n\tvoid SpawnMobs(cMobSpawner & a_MobSpawner);\n\n\tvoid Tick(std::chrono::milliseconds a_Dt);\n\n\t/** Ticks a single block. Used by cWorld::TickQueuedBlocks() to tick the queued blocks */\n\tvoid TickBlock(const Vector3i a_BlockPos);\n\n\tvoid UnloadUnusedChunks(void);\n\tvoid SaveAllChunks(void) const;\n\n\tcWorld * GetWorld(void) const { return m_World; }\n\n\tsize_t GetNumChunks(void) const;\n\n\t/** Returns the number of unused dirty chunks. Those are chunks that we can save and then unload */\n\tsize_t GetNumUnusedDirtyChunks(void) const;\n\n\tvoid ChunkValidated(void);  // Called by chunks that have become valid\n\n\t/** Returns the CS for locking the chunkmap; only cWorld::cLock may use this function! */\n\tcCriticalSection & GetCS(void) const { return m_CSChunks; }\n\n\t/** Increments (a_AlwaysTicked == true) or decrements (false) the m_AlwaysTicked counter for the specified chunk.\n\tIf the m_AlwaysTicked counter is greater than zero, the chunk is ticked in the tick-thread regardless of\n\twhether it has any clients or not.\n\tThis function allows nesting and task-concurrency (multiple separate tasks can request ticking and as long\n\tas at least one requests is active the chunk will be ticked). */\n\tvoid SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked);\n\n\t/** Adds this chunkmap's CS to the DeadlockDetect's tracked CSs. */\n\tvoid TrackInDeadlockDetect(cDeadlockDetect & a_DeadlockDetect, const AString & a_WorldName);\n\n\t/** Removes this chunkmap's CS from the DeadlockDetect's tracked CSs. */\n\tvoid UntrackInDeadlockDetect(cDeadlockDetect & a_DeadlockDetect);\n\nprivate:\n\n\t// Chunks query their neighbors using FindChunk(), while being ticked\n\tfriend class cChunk;\n\n\t// The chunkstay can (de-)register itself using AddChunkStay() and DelChunkStay()\n\tfriend class cChunkStay;\n\n\ttypedef std::list<cChunkStay *> cChunkStays;\n\n\tmutable cCriticalSection m_CSChunks;\n\n\t/** A map of chunk coordinates to chunks.\n\tUses a map (as opposed to unordered_map) because sorted maps are apparently faster. */\n\tstd::map<cChunkCoords, cChunk> m_Chunks;\n\n\tcEvent m_evtChunkValid;  // Set whenever any chunk becomes valid, via ChunkValidated()\n\n\tcWorld * m_World;\n\n\t/** The cChunkStay descendants that are currently enabled in this chunkmap */\n\tcChunkStays m_ChunkStays;\n\n\t/** Returns or creates and returns a chunk pointer corresponding to the given chunk coordinates.\n\tEmplaces this chunk in the chunk map. */\n\tcChunk & ConstructChunk(int a_ChunkX, int a_ChunkZ);\n\n\t/** Constructs a chunk and queues it for loading / generating if not valid, returning it */\n\tcChunk & GetChunk(int a_ChunkX, int a_ChunkZ);\n\n\t/** Locates a chunk ptr in the chunkmap; doesn't create it when not found; assumes m_CSChunks is locked. To be called only from cChunkMap. */\n\tcChunk * FindChunk(int a_ChunkX, int a_ChunkZ);\n\n\t/** Locates a chunk ptr in the chunkmap; doesn't create it when not found; assumes m_CSChunks is locked. To be called only from cChunkMap. */\n\tconst cChunk * FindChunk(int a_ChunkX, int a_ChunkZ) const;\n\n\t/** Adds a new cChunkStay descendant to the internal list of ChunkStays; loads its chunks.\n\tTo be used only by cChunkStay; others should use cChunkStay::Enable() instead */\n\tvoid AddChunkStay(cChunkStay & a_ChunkStay);\n\n\t/** Removes the specified cChunkStay descendant from the internal list of ChunkStays.\n\tTo be used only by cChunkStay; others should use cChunkStay::Disable() instead */\n\tvoid DelChunkStay(cChunkStay & a_ChunkStay);\n\n};\n"
  },
  {
    "path": "src/ChunkSender.cpp",
    "content": "\n// ChunkSender.cpp\n\n// Interfaces to the cChunkSender class representing the thread that waits for chunks becoming ready (loaded / generated) and sends them to clients\n\n\n\n\n\n#include \"Globals.h\"\n#include \"ChunkSender.h\"\n#include \"World.h\"\n#include \"BlockEntities/BlockEntity.h\"\n#include \"ClientHandle.h\"\n#include \"Chunk.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNotifyChunkSender:\n\n\n/** Callback that can be used to notify chunk sender upon another chunkcoord notification */\nclass cNotifyChunkSender :\n\tpublic cChunkCoordCallback\n{\n\tvirtual void Call(cChunkCoords a_Coords, bool a_IsSuccess) override\n\t{\n\t\tcChunkSender & ChunkSender = m_ChunkSender;\n\t\tm_World.DoWithChunk(\n\t\t\ta_Coords.m_ChunkX, a_Coords.m_ChunkZ,\n\t\t\t[&ChunkSender] (cChunk & a_Chunk) -> bool\n\t\t\t{\n\t\t\t\tChunkSender.QueueSendChunkTo(a_Chunk.GetPosX(), a_Chunk.GetPosZ(), cChunkSender::Priority::High, a_Chunk.GetAllClients());\n\t\t\t\treturn true;\n\t\t\t}\n\t\t);\n\t}\n\n\tcChunkSender & m_ChunkSender;\n\n\tcWorld & m_World;\n\npublic:\n\tcNotifyChunkSender(cChunkSender & a_ChunkSender, cWorld & a_World):\n\t\tm_ChunkSender(a_ChunkSender),\n\t\tm_World(a_World)\n\t{\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cChunkSender:\n\ncChunkSender::cChunkSender(cWorld & a_World) :\n\tSuper(\"Chunk Sender\"),\n\tm_World(a_World),\n\tm_Serializer(m_World.GetDimension())\n{\n}\n\n\n\n\n\ncChunkSender::~cChunkSender()\n{\n\tStop();\n}\n\n\n\n\n\nvoid cChunkSender::Stop(void)\n{\n\tm_ShouldTerminate = true;\n\tm_evtQueue.Set();\n\tSuper::Stop();\n}\n\n\n\n\n\nvoid cChunkSender::QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, Priority a_Priority, cClientHandle * a_Client)\n{\n\tASSERT(a_Client != nullptr);\n\t{\n\t\tcChunkCoords Chunk{a_ChunkX, a_ChunkZ};\n\t\tcCSLock Lock(m_CS);\n\t\tauto iter = m_ChunkInfo.find(Chunk);\n\t\tif (iter != m_ChunkInfo.end())\n\t\t{\n\t\t\tauto & info = iter->second;\n\t\t\tif (info.m_Priority < a_Priority)  // Was the chunk's priority boosted?\n\t\t\t{\n\t\t\t\tm_SendChunks.push(sChunkQueue{a_Priority, Chunk});\n\t\t\t\tinfo.m_Priority = a_Priority;\n\t\t\t}\n\t\t\tinfo.m_Clients.insert(a_Client->shared_from_this());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_SendChunks.push(sChunkQueue{a_Priority, Chunk});\n\t\t\tauto info = sSendChunk{Chunk, a_Priority};\n\t\t\tinfo.m_Clients.insert(a_Client->shared_from_this());\n\t\t\tm_ChunkInfo.emplace(Chunk, info);\n\t\t}\n\t}\n\tm_evtQueue.Set();\n}\n\n\n\n\n\nvoid cChunkSender::QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, Priority a_Priority, const std::vector<cClientHandle *> & a_Clients)\n{\n\t{\n\t\tcChunkCoords Chunk{a_ChunkX, a_ChunkZ};\n\t\tcCSLock Lock(m_CS);\n\t\tauto iter = m_ChunkInfo.find(Chunk);\n\t\tif (iter != m_ChunkInfo.end())\n\t\t{\n\t\t\tauto & info = iter->second;\n\t\t\tif (info.m_Priority < a_Priority)  // Was the chunk's priority boosted?\n\t\t\t{\n\t\t\t\tm_SendChunks.push(sChunkQueue{a_Priority, Chunk});\n\t\t\t\tinfo.m_Priority = a_Priority;\n\t\t\t}\n\t\t\tfor (const auto & Client : a_Clients)\n\t\t\t{\n\t\t\t\tinfo.m_Clients.insert(Client->shared_from_this());\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_SendChunks.push(sChunkQueue{a_Priority, Chunk});\n\t\t\tauto info = sSendChunk{Chunk, a_Priority};\n\t\t\tfor (const auto & Client : a_Clients)\n\t\t\t{\n\t\t\t\tinfo.m_Clients.insert(Client->shared_from_this());\n\t\t\t}\n\t\t\tm_ChunkInfo.emplace(Chunk, info);\n\t\t}\n\t}\n\tm_evtQueue.Set();\n}\n\n\n\n\n\nvoid cChunkSender::Execute(void)\n{\n\twhile (!m_ShouldTerminate)\n\t{\n\t\tm_evtQueue.Wait();\n\n\t\t{\n\t\t\tcCSLock Lock(m_CS);\n\t\t\twhile (!m_SendChunks.empty())\n\t\t\t{\n\t\t\t\t// Take one from the queue:\n\t\t\t\tauto Chunk = m_SendChunks.top().m_Chunk;\n\t\t\t\tm_SendChunks.pop();\n\t\t\t\tauto itr = m_ChunkInfo.find(Chunk);\n\t\t\t\tif (itr == m_ChunkInfo.end())\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tauto clients = std::move(itr->second.m_Clients);\n\t\t\t\tm_ChunkInfo.erase(itr);\n\n\t\t\t\tcCSUnlock Unlock(Lock);\n\t\t\t\tSendChunk(Chunk.m_ChunkX, Chunk.m_ChunkZ, clients);\n\t\t\t}\n\t\t}\n\t}  // while (!m_ShouldTerminate)\n}\n\n\n\n\n\nvoid cChunkSender::SendChunk(int a_ChunkX, int a_ChunkZ, const WeakClients & a_Clients)\n{\n\t// Contains strong pointers to clienthandles.\n\tstd::vector<std::shared_ptr<cClientHandle>> Clients;\n\n\t// Ask the client if it still wants the chunk:\n\tfor (const auto & WeakClient : a_Clients)\n\t{\n\t\tauto Client = WeakClient.lock();\n\t\tif ((Client != nullptr) && Client->WantsSendChunk(a_ChunkX, a_ChunkZ))\n\t\t{\n\t\t\tClients.push_back(std::move(Client));\n\t\t}\n\t}\n\n\t// Bail early if every requester disconnected:\n\tif (Clients.empty())\n\t{\n\t\treturn;\n\t}\n\n\t// If the chunk has no clients, no need to packetize it:\n\tif (!m_World.HasChunkAnyClients(a_ChunkX, a_ChunkZ))\n\t{\n\t\treturn;\n\t}\n\n\t// If the chunk is not valid, do nothing - whoever needs it has queued it for loading / generating\n\tif (!m_World.IsChunkValid(a_ChunkX, a_ChunkZ))\n\t{\n\t\treturn;\n\t}\n\n\t// If the chunk is not lighted, queue it for relighting and get notified when it's ready:\n\tif (!m_World.IsChunkLighted(a_ChunkX, a_ChunkZ))\n\t{\n\t\tm_World.QueueLightChunk(a_ChunkX, a_ChunkZ, std::make_unique<cNotifyChunkSender>(*this, m_World));\n\t\treturn;\n\t}\n\n\t// Query and prepare chunk data:\n\tif (!m_World.GetChunkData({a_ChunkX, a_ChunkZ}, *this))\n\t{\n\t\treturn;\n\t}\n\n\t// Send:\n\tm_Serializer.SendToClients(a_ChunkX, a_ChunkZ, m_BlockData, m_LightData, m_BiomeMap, Clients);\n\n\tfor (const auto & Client : Clients)\n\t{\n\t\t// Send block-entity packets:\n\t\tfor (const auto & Pos : m_BlockEntities)\n\t\t{\n\t\t\tm_World.SendBlockEntity(Pos.x, Pos.y, Pos.z, *Client);\n\t\t}  // for itr - m_Packets[]\n\n\t\t// Send entity packets:\n\t\tfor (const auto EntityID : m_EntityIDs)\n\t\t{\n\t\t\tm_World.DoWithEntityByID(EntityID, [Client](cEntity & a_Entity)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t// DEBUG:\n\t\t\t\tLOGD(\"cChunkSender: Entity #%d (%s) at [%f, %f, %f] spawning for player \\\"%s\\\"\",\n\t\t\t\t\ta_Entity.GetUniqueID(), a_Entity.GetClass(),\n\t\t\t\t\ta_Entity.GetPosition().x, a_Entity.GetPosition().y, a_Entity.GetPosition().z,\n\t\t\t\t\tClient->GetUsername().c_str()\n\t\t\t\t);\n\t\t\t\t*/\n\n\t\t\t\t/* This check looks highly suspect.\n\t\t\t\tIts purpose is to check the client still has a valid player object associated,\n\t\t\t\tsince the player destroys itself when the client is destroyed.\n\t\t\t\tIt's done within the world lock to ensure correctness.\n\t\t\t\tA better way involves fixing chunk sending (GH #3696) to obviate calling SpawnOn from this thread in the first place. */\n\t\t\t\tif (!Client->IsDestroyed())\n\t\t\t\t{\n\t\t\t\t\ta_Entity.SpawnOn(*Client);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t}\n\n\tm_BlockEntities.clear();\n\tm_EntityIDs.clear();\n}\n\n\n\n\n\nvoid cChunkSender::BlockEntity(cBlockEntity * a_Entity)\n{\n\tm_BlockEntities.push_back(a_Entity->GetPos());\n}\n\n\n\n\n\nvoid cChunkSender::Entity(cEntity * a_Entity)\n{\n\tm_EntityIDs.push_back(a_Entity->GetUniqueID());\n}\n\n\n\n\n\nvoid cChunkSender::BiomeMap(const cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tfor (size_t i = 0; i < ARRAYCOUNT(m_BiomeMap); i++)\n\t{\n\t\tif (a_BiomeMap[i] < 255)\n\t\t{\n\t\t\t// Normal MC biome, copy as-is:\n\t\t\tm_BiomeMap[i] = static_cast<unsigned char>(a_BiomeMap[i]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// TODO: MCS-specific biome, need to map to some basic MC biome:\n\t\t\tASSERT(!\"Unimplemented MCS-specific biome\");\n\t\t}\n\t}  // for i - m_BiomeMap[]\n}\n"
  },
  {
    "path": "src/ChunkSender.h",
    "content": "\n// ChunkSender.h\n\n// Interfaces to the cChunkSender class representing the thread that waits for chunks becoming ready (loaded / generated) and sends them to clients\n\n/*\nThe whole thing is a thread that runs in a loop, waiting for either:\n\t\"finished chunks\" (ChunkReady()), or\n\t\"chunks to send\" (QueueSendChunkTo())\nto come to a queue.\nAnd once they do, it requests the chunk data and sends it all away, either\n\tbroadcasting (ChunkReady), or\n\tsends to a specific client (QueueSendChunkTo)\nChunk data is queried using the cChunkDataCallback interface.\nIt is cached inside the ChunkSender object during the query and then processed after the query ends.\nNote that the data needs to be compressed only after the query finishes,\nbecause the query callbacks run with ChunkMap's CS locked.\n\nA client may remove itself from all direct requests(QueueSendChunkTo()) by calling RemoveClient();\nthis ensures that the client's Send() won't be called anymore by ChunkSender.\nNote that it may be called by world's BroadcastToChunk() if the client is still in the chunk.\n*/\n\n\n\n#pragma once\n\n#include \"OSSupport/IsThread.h\"\n#include \"ChunkDataCallback.h\"\n#include \"Protocol/ChunkDataSerializer.h\"\n\n\n\n\n\nclass cWorld;\nclass cClientHandle;\n\n\n\n\n\n// fwd:\nclass cChunkSender;\n\n\n\n\n\nclass cChunkSender final :\n\tpublic cIsThread,\n\tpublic cChunkDataCopyCollector\n{\n\tusing Super = cIsThread;\n\npublic:\n\n\tcChunkSender(cWorld & a_World);\n\tvirtual ~cChunkSender() override;\n\n\t/** Tag indicating urgency of chunk to be sent.\n\tOrder MUST be from least to most urgent. */\n\tenum class Priority\n\t{\n\t\tLow,\n\t\tMedium,\n\t\tHigh,\n\t\tCritical\n\t};\n\n\tvoid Stop(void);\n\n\t/** Queues a chunk to be sent to a specific client */\n\tvoid QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, Priority a_Priority, cClientHandle * a_Client);\n\tvoid QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, Priority a_Priority, const std::vector<cClientHandle *> & a_Clients);\n\nprotected:\n\n\tusing WeakClients = std::set<std::weak_ptr<cClientHandle>, std::owner_less<std::weak_ptr<cClientHandle>>>;\n\n\tstruct sChunkQueue\n\t{\n\t\tPriority m_Priority;\n\t\tcChunkCoords m_Chunk;\n\n\t\tbool operator <(const sChunkQueue & a_Other) const\n\t\t{\n\t\t\t// The operator will return true to affirm we're less urgent than Other\n\t\t\t// This comparison depends on the Priority enum ordering lower priority as smaller:\n\t\t\treturn m_Priority < a_Other.m_Priority;\n\t\t}\n\t};\n\n\t/** Used for sending chunks to specific clients */\n\tstruct sSendChunk\n\t{\n\t\tcChunkCoords m_Chunk;\n\t\tWeakClients m_Clients;\n\t\tPriority m_Priority;\n\t\tsSendChunk(cChunkCoords a_Chunk, Priority a_Priority) :\n\t\t\tm_Chunk(a_Chunk),\n\t\t\tm_Priority(a_Priority)\n\t\t{\n\t\t}\n\t};\n\n\tcWorld & m_World;\n\n\t/** An instance of a chunk serializer, held to maintain its internal cache. */\n\tcChunkDataSerializer m_Serializer;\n\n\tcCriticalSection  m_CS;\n\tstd::priority_queue<sChunkQueue> m_SendChunks;\n\tstd::unordered_map<cChunkCoords, sSendChunk, cChunkCoordsHash> m_ChunkInfo;\n\tcEvent m_evtQueue;  // Set when anything is added to m_ChunksReady\n\n\t// Data about the chunk that is being sent:\n\t// NOTE that m_BlockData[] is inherited from the cChunkDataCollector\n\tunsigned char m_BiomeMap[cChunkDef::Width * cChunkDef::Width];\n\tstd::vector<Vector3i> m_BlockEntities;  // Coords of the block entities to send\n\tstd::vector<UInt32> m_EntityIDs;        // Entity-IDs of the entities to send\n\n\t// cIsThread override:\n\tvirtual void Execute(void) override;\n\n\t// cChunkDataCollector overrides:\n\t// (Note that they are called while the ChunkMap's CS is locked - don't do heavy calculations here!)\n\tvirtual void BiomeMap     (const cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void Entity       (cEntity *      a_Entity) override;\n\tvirtual void BlockEntity  (cBlockEntity * a_Entity) override;\n\n\t/** Sends the specified chunk to all the specified clients */\n\tvoid SendChunk(int a_ChunkX, int a_ChunkZ, const WeakClients & a_Clients);\n} ;\n\n\n\n"
  },
  {
    "path": "src/ChunkStay.cpp",
    "content": "\n// ChunkStay.cpp\n\n// Implements the cChunkStay class representing a base for classes that keep chunks loaded\n\n#include \"Globals.h\"\n#include \"ChunkStay.h\"\n#include \"ChunkMap.h\"\n\n\n\n\n\ncChunkStay::cChunkStay(void) :\n\tm_ChunkMap(nullptr)\n{\n}\n\n\n\n\n\ncChunkStay::~cChunkStay()\n{\n\tClear();\n}\n\n\n\n\n\nvoid cChunkStay::Clear(void)\n{\n\tASSERT(m_ChunkMap == nullptr);\n\tm_Chunks.clear();\n}\n\n\n\n\n\nvoid cChunkStay::Add(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT(m_ChunkMap == nullptr);\n\n\tfor (cChunkCoordsVector::const_iterator itr = m_Chunks.begin(); itr != m_Chunks.end(); ++itr)\n\t{\n\t\tif ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ))\n\t\t{\n\t\t\t// Already present\n\t\t\treturn;\n\t\t}\n\t}  // for itr - Chunks[]\n\tm_Chunks.emplace_back(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nvoid cChunkStay::Remove(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT(m_ChunkMap == nullptr);\n\n\tfor (cChunkCoordsVector::iterator itr = m_Chunks.begin(); itr != m_Chunks.end(); ++itr)\n\t{\n\t\tif ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ))\n\t\t{\n\t\t\t// Found, un-\"stay\"\n\t\t\tm_Chunks.erase(itr);\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_Chunks[]\n}\n\n\n\n\n\nvoid cChunkStay::Enable(cChunkMap & a_ChunkMap)\n{\n\tASSERT(m_ChunkMap == nullptr);\n\n\tm_OutstandingChunks = m_Chunks;\n\tm_ChunkMap = &a_ChunkMap;\n\ta_ChunkMap.AddChunkStay(*this);\n}\n\n\n\n\n\nvoid cChunkStay::Disable(void)\n{\n\tASSERT(m_ChunkMap != nullptr);\n\n\tcChunkMap * ChunkMap = m_ChunkMap;\n\tm_ChunkMap = nullptr;\n\tChunkMap->DelChunkStay(*this);\n}\n\n\n\n\n\nbool cChunkStay::ChunkAvailable(int a_ChunkX, int a_ChunkZ)\n{\n\t// Check if this is a chunk that we want:\n\tbool IsMine = false;\n\tfor (cChunkCoordsVector::iterator itr = m_OutstandingChunks.begin(), end = m_OutstandingChunks.end(); itr != end; ++itr)\n\t{\n\t\tif ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ))\n\t\t{\n\t\t\tm_OutstandingChunks.erase(itr);\n\t\t\tIsMine = true;\n\t\t\tbreak;\n\t\t}\n\t}  // for itr - m_OutstandingChunks[]\n\tif (!IsMine)\n\t{\n\t\treturn false;\n\t}\n\n\t// Call the appropriate callbacks:\n\tOnChunkAvailable(a_ChunkX, a_ChunkZ);\n\tif (m_OutstandingChunks.empty())\n\t{\n\t\treturn OnAllChunksAvailable();\n\t}\n\treturn false;\n}\n\n\n\n\n"
  },
  {
    "path": "src/ChunkStay.h",
    "content": "\n// ChunkStay.h\n\n/* Declares the cChunkStay class representing a base for classes that want to wait for certain chunks to load,\nthen do some action on them. While the object is enabled, the chunks contained within are locked and will\nnot unload\n*/\n\n\n\n\n\n#pragma once\n\n#include \"ChunkDef.h\"\n\n\n\n// fwd\nclass cChunkMap;\n\n\n\n\n\n/** Makes chunks stay loaded until this object is cleared or destroyed\nWorks by setting internal flags in the cChunk that it should not be unloaded.\nTo optimize for speed, cChunkStay has an Enabled flag, it will \"stay\" the chunks only when enabled\nand it will refuse chunk-list manipulations when enabled.\nThe object itself is not made thread-safe, it's supposed to be used from a single thread only.\nThis class is abstract, the descendants are expected to provide the OnChunkAvailable() and\nthe OnAllChunksAvailable() callback implementations. Note that those are called from the contexts of\ndifferent threads' - the caller, the Loader or the Generator thread.\n*/\nclass cChunkStay\n{\npublic:\n\tcChunkStay(void);\n\n\t/** Deletes the object. Note that this calls Clear(), which means that the ChunkStay needs to be disabled. */\n\tvirtual ~cChunkStay();\n\n\t/** Clears all the chunks that have been added.\n\tTo be used only while the ChunkStay object is not enabled. */\n\tvoid Clear(void);\n\n\t/** Adds a chunk to be locked from unloading.\n\tTo be used only while the ChunkStay object is not enabled. */\n\tvoid Add(int a_ChunkX, int a_ChunkZ);\n\n\t/** Releases the chunk so that it's no longer locked from unloading.\n\tTo be used only while the ChunkStay object is not enabled. */\n\tvoid Remove(int a_ChunkX, int a_ChunkZ);\n\n\t/** Enables the ChunkStay on the specified chunkmap, causing it to load and generate chunks.\n\tAll the contained chunks are queued for loading / generating. */\n\tvoid Enable (cChunkMap & a_ChunkMap);\n\n\t/** Disables the ChunkStay, the chunks are released and the ChunkStay object can be edited with Add() and Remove() again */\n\tvirtual void Disable(void);\n\n\t/** Returns all the chunks that should be kept */\n\tconst cChunkCoordsVector & GetChunks(void) const { return m_Chunks; }\n\n\t/** Called when a specific chunk become available. */\n\tvirtual void OnChunkAvailable(int a_ChunkX, int a_ChunkZ) = 0;\n\n\t/** Called once all of the contained chunks are available.\n\tIf returns true, the ChunkStay is automatically disabled by the ChunkMap; if it returns false, the ChunkStay is kept. */\n\tvirtual bool OnAllChunksAvailable(void) = 0;\n\n\t/** Called by the ChunkMap when the ChunkStay is disabled. The object may choose to delete itself. */\n\tvirtual void OnDisabled(void) = 0;\n\nprotected:\n\n\tfriend class cChunkMap;\n\n\n\t/** The chunkmap where the object is enabled.\n\tValid only after call to Enable() and before Disable(). */\n\tcChunkMap * m_ChunkMap;\n\n\t/** The list of chunks to lock from unloading. */\n\tcChunkCoordsVector m_Chunks;\n\n\t/** The chunks that still need loading */\n\tcChunkCoordsVector m_OutstandingChunks;\n\n\n\t/** Called by cChunkMap when a chunk is available, checks m_NumLoaded and triggers the appropriate callbacks.\n\tMay be called for chunks outside this ChunkStay.\n\tReturns true if the ChunkStay is to be automatically disabled by the ChunkMap; returns false to keep the ChunkStay. */\n\tbool ChunkAvailable(int a_ChunkX, int a_ChunkZ);\n} ;\n\n\n\n\n\n"
  },
  {
    "path": "src/CircularBufferCompressor.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"CircularBufferCompressor.h\"\n#include \"ByteBuffer.h\"\n\n\n\n\n\nContiguousByteBufferView CircularBufferCompressor::GetView() const\n{\n\treturn m_ContiguousIntermediate;\n}\n\n\n\n\n\nCompression::Result CircularBufferCompressor::Compress()\n{\n\treturn m_Compressor.CompressZLib(m_ContiguousIntermediate);\n}\n\n\n\n\n\nvoid CircularBufferCompressor::ReadFrom(cByteBuffer & Buffer)\n{\n\tBuffer.ReadAll(m_ContiguousIntermediate);\n}\n\n\n\n\n\nvoid CircularBufferCompressor::ReadFrom(cByteBuffer & Buffer, size_t Size)\n{\n\tBuffer.ReadSome(m_ContiguousIntermediate, Size);\n}\n\n\n\n\n\nContiguousByteBufferView CircularBufferExtractor::GetView() const\n{\n\treturn m_ContiguousIntermediate;\n}\n\n\n\n\n\nCompression::Result CircularBufferExtractor::Extract(size_t UncompressedSize)\n{\n\treturn m_Extractor.ExtractZLib(m_ContiguousIntermediate, UncompressedSize);\n}\n\n\n\n\n\nvoid CircularBufferExtractor::ReadFrom(cByteBuffer & Buffer, size_t Size)\n{\n\tBuffer.ReadSome(m_ContiguousIntermediate, Size);\n}\n"
  },
  {
    "path": "src/CircularBufferCompressor.h",
    "content": "\n#pragma once\n\n#include \"StringCompression.h\"\n\n\n\n\n\nclass cByteBuffer;\n\n\n\n\n\nclass CircularBufferCompressor\n{\npublic:\n\n\tContiguousByteBufferView GetView() const;\n\n\tCompression::Result Compress();\n\tvoid ReadFrom(cByteBuffer & Buffer);\n\tvoid ReadFrom(cByteBuffer & Buffer, size_t Size);\n\nprivate:\n\n\tCompression::Compressor m_Compressor;\n\tstd::basic_string<std::byte> m_ContiguousIntermediate;\n};\n\n\n\n\n\nclass CircularBufferExtractor\n{\npublic:\n\n\tContiguousByteBufferView GetView() const;\n\n\tCompression::Result Extract(size_t UncompressedSize);\n\tvoid ReadFrom(cByteBuffer & Buffer, size_t Size);\n\nprivate:\n\n\tCompression::Extractor m_Extractor;\n\tstd::basic_string<std::byte> m_ContiguousIntermediate;\n};\n"
  },
  {
    "path": "src/ClientHandle.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ClientHandle.h\"\n#include \"BlockInfo.h\"\n#include \"Server.h\"\n#include \"World.h\"\n#include \"Chunk.h\"\n#include \"Entities/Pickup.h\"\n#include \"Bindings/PluginManager.h\"\n#include \"Entities/Player.h\"\n#include \"Entities/Minecart.h\"\n#include \"Inventory.h\"\n#include \"BlockEntities/BeaconEntity.h\"\n#include \"BlockEntities/ChestEntity.h\"\n#include \"BlockEntities/CommandBlockEntity.h\"\n#include \"BlockEntities/SignEntity.h\"\n#include \"UI/InventoryWindow.h\"\n#include \"UI/CraftingWindow.h\"\n#include \"UI/Window.h\"\n#include \"UI/AnvilWindow.h\"\n#include \"UI/BeaconWindow.h\"\n#include \"UI/EnchantingWindow.h\"\n#include \"Item.h\"\n#include \"Mobs/Monster.h\"\n#include \"ChatColor.h\"\n#include \"Items/ItemHandler.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"Blocks/BlockBed.h\"\n#include \"Blocks/ChunkInterface.h\"\n#include \"BlockInServerPluginInterface.h\"\n\n#include \"Root.h\"\n\n#include \"Protocol/Authenticator.h\"\n#include \"Protocol/Protocol.h\"\n#include \"CompositeChat.h\"\n#include \"Items/ItemSword.h\"\n\n#include \"mbedtls/md5.h\"\n\n\n\n/** Maximum number of explosions to send this tick, server will start dropping if exceeded. */\n#define MAX_EXPLOSIONS_PER_TICK 20\n\n/** Maximum number of block change interactions a player can perform per tick - exceeding this causes a kick. */\n#define MAX_BLOCK_CHANGE_INTERACTIONS 20\n\n/** Maximum number of bytes that a chat message sent by a player may consist of. */\n#define MAX_CHAT_MSG_LENGTH 1024\n\n/** Maximum number of chunks to stream per tick. */\n#define MAX_CHUNKS_STREAMED_PER_TICK 4\n\n\n\n\n\nint cClientHandle::s_ClientCount = 0;\n\n\nfloat cClientHandle::FASTBREAK_PERCENTAGE;\n\nVector3i cClientHandle::s_IllegalPosition = {0, cChunkDef::Height + 1, 0};\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cClientHandle:\n\ncClientHandle::cClientHandle(const AString & a_IPString, int a_ViewDistance) :\n\tm_CurrentViewDistance(a_ViewDistance),\n\tm_RequestedViewDistance(a_ViewDistance),\n\tm_IPString(a_IPString),\n\tm_Player(nullptr),\n\tm_CachedSentChunk(std::numeric_limits<decltype(m_CachedSentChunk.m_ChunkX)>::max(), std::numeric_limits<decltype(m_CachedSentChunk.m_ChunkZ)>::max()),\n\tm_ProxyConnection(false),\n\tm_HasSentDC(false),\n\tm_LastStreamedChunkX(std::numeric_limits<decltype(m_LastStreamedChunkX)>::max()),  // bogus chunk coords to force streaming upon login\n\tm_LastStreamedChunkZ(std::numeric_limits<decltype(m_LastStreamedChunkZ)>::max()),\n\tm_TicksSinceLastPacket(0),\n\tm_TimeSinceLastUnloadCheck(0),\n\tm_Ping(1000),\n\tm_PingID(1),\n\tm_BlockDigAnimStage(-1),\n\tm_BlockDigAnimSpeed(0),\n\tm_BlockDigAnimPos(s_IllegalPosition),\n\tm_HasStartedDigging(false),\n\tm_LastDigBlockPos(s_IllegalPosition),\n\tm_State(csConnected),\n\tm_NumExplosionsThisTick(0),\n\tm_NumBlockChangeInteractionsThisTick(0),\n\tm_UniqueID(0),\n\tm_HasSentPlayerChunk(false),\n\tm_Locale(\"en_GB\"),\n\tm_LastPlacedSign(s_IllegalPosition),\n\tm_ProtocolVersion(0)\n{\n\ts_ClientCount++;  // Not protected by CS because clients are always constructed from the same thread\n\tm_UniqueID = s_ClientCount;\n\n\tLOGD(\"New ClientHandle created at %p\", static_cast<void *>(this));\n}\n\n\n\n\n\ncClientHandle::~cClientHandle()\n{\n\tASSERT(m_State == csDestroyed);  // Has Destroy() been called?\n\n\tLOGD(\"Deleting client \\\"%s\\\" at %p\", GetUsername().c_str(), static_cast<void *>(this));\n\n\tLOGD(\"ClientHandle at %p deleted\", static_cast<void *>(this));\n}\n\n\n\n\n\nvoid cClientHandle::Destroy(void)\n{\n\tif (!SetState(csDestroyed))\n\t{\n\t\t// Already called\n\t\tLOGD(\"%s: client %p, \\\"%s\\\" already destroyed, bailing out\", __FUNCTION__, static_cast<void *>(this), m_Username.c_str());\n\t\treturn;\n\t}\n\n\tLOGD(\"%s: destroying client %p, \\\"%s\\\" @ %s\", __FUNCTION__, static_cast<void *>(this), m_Username.c_str(), m_IPString.c_str());\n\n\t{\n\t\tcCSLock Lock(m_CSOutgoingData);\n\t\tm_Protocol.HandleOutgoingData(m_OutgoingData);  // Finalise any encryption.\n\t\tm_Link->Send(m_OutgoingData.data(), m_OutgoingData.size());  // Flush remaining data.\n\t\tm_Link->Shutdown();  // Cleanly close the connection.\n\t\tm_Link.reset();  // Release the strong reference cTCPLink holds to ourself.\n\t}\n}\n\n\n\n\n\nAString cClientHandle::FormatChatPrefix(\n\tbool ShouldAppendChatPrefixes, const AString & a_ChatPrefixS,\n\tconst AString & m_Color1, const AString & m_Color2\n)\n{\n\tif (ShouldAppendChatPrefixes)\n\t{\n\t\treturn fmt::format(FMT_STRING(\"{}[{}] {}\"), m_Color1, a_ChatPrefixS, m_Color2);\n\t}\n\telse\n\t{\n\t\treturn m_Color1;\n\t}\n}\n\n\n\n\n\nAString cClientHandle::FormatMessageType(bool ShouldAppendChatPrefixes, eMessageType a_ChatPrefix, const AString & a_AdditionalData)\n{\n\tswitch (a_ChatPrefix)\n\t{\n\t\tcase mtCustom:      return \"\";\n\t\tcase mtFailure:     return FormatChatPrefix(ShouldAppendChatPrefixes, \"INFO\",  cChatColor::Rose,   cChatColor::White);\n\t\tcase mtInformation: return FormatChatPrefix(ShouldAppendChatPrefixes, \"INFO\",  cChatColor::Yellow, cChatColor::White);\n\t\tcase mtSuccess:     return FormatChatPrefix(ShouldAppendChatPrefixes, \"INFO\",  cChatColor::Green,  cChatColor::White);\n\t\tcase mtWarning:     return FormatChatPrefix(ShouldAppendChatPrefixes, \"WARN\",  cChatColor::Rose,   cChatColor::White);\n\t\tcase mtFatal:       return FormatChatPrefix(ShouldAppendChatPrefixes, \"FATAL\", cChatColor::Red,    cChatColor::White);\n\t\tcase mtDeath:       return FormatChatPrefix(ShouldAppendChatPrefixes, \"DEATH\", cChatColor::Gray,   cChatColor::White);\n\t\tcase mtJoin:        return FormatChatPrefix(ShouldAppendChatPrefixes, \"JOIN\",  cChatColor::Yellow, cChatColor::White);\n\t\tcase mtLeave:       return FormatChatPrefix(ShouldAppendChatPrefixes, \"LEAVE\", cChatColor::Yellow, cChatColor::White);\n\t\tcase mtPrivateMessage:\n\t\t{\n\t\t\tif (ShouldAppendChatPrefixes)\n\t\t\t{\n\t\t\t\treturn fmt::format(FMT_STRING(\"{}[MSG: {}] {}{}\"), cChatColor::LightBlue, a_AdditionalData, cChatColor::White, cChatColor::Italic);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn fmt::format(FMT_STRING(\"{}: {}\"), a_AdditionalData, cChatColor::LightBlue);\n\t\t\t}\n\t\t}\n\t\tcase mtMaxPlusOne: break;\n\t}\n\treturn \"\";\n}\n\n\n\n\n\ncUUID cClientHandle::GenerateOfflineUUID(const AString & a_Username)\n{\n\t// Online UUIDs are always version 4 (random)\n\t// We use Version 3 (MD5 hash) UUIDs for the offline UUIDs\n\t// This guarantees that they will never collide with an online UUID and can be distinguished.\n\t// This is also consistent with the vanilla offline UUID scheme.\n\n\treturn cUUID::GenerateVersion3(\"OfflinePlayer:\" + a_Username);\n}\n\n\n\n\n\nbool cClientHandle::IsUUIDOnline(const cUUID & a_UUID)\n{\n\t// Online UUIDs are always version 4 (random)\n\t// We use Version 3 (MD5 hash) UUIDs for the offline UUIDs\n\t// This guarantees that they will never collide with an online UUID and can be distinguished.\n\treturn (a_UUID.Version() == 4);\n}\n\n\n\n\n\nvoid cClientHandle::ProxyInit(const AString & a_IPString, const cUUID & a_UUID)\n{\n\tthis->SetIPString(a_IPString);\n\tthis->SetUUID(a_UUID);\n\n\tthis->m_ProxyConnection = true;\n}\n\n\n\n\n\nvoid cClientHandle::ProxyInit(const AString & a_IPString, const cUUID & a_UUID, const Json::Value & a_Properties)\n{\n\tthis->SetProperties(a_Properties);\n\tthis->ProxyInit(a_IPString, a_UUID);\n}\n\n\n\n\n\nvoid cClientHandle::ProcessProtocolIn(void)\n{\n\t// Process received network data:\n\tdecltype(m_IncomingData) IncomingData;\n\t{\n\t\tcCSLock Lock(m_CSIncomingData);\n\n\t\t// Bail out when nothing was received:\n\t\tif (m_IncomingData.empty())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tstd::swap(IncomingData, m_IncomingData);\n\t}\n\n\ttry\n\t{\n\t\tm_Protocol.HandleIncomingData(*this, IncomingData);\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tKick(Oops.what());\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::ProcessProtocolOut()\n{\n\tdecltype(m_OutgoingData) OutgoingData;\n\t{\n\t\tcCSLock Lock(m_CSOutgoingData);\n\n\t\t// Bail out when there's nothing to send to avoid TCPLink::Send overhead:\n\t\tif (m_OutgoingData.empty())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tstd::swap(OutgoingData, m_OutgoingData);\n\t}\n\n\t// Due to cTCPLink's design of holding a strong pointer to ourself, we need to explicitly reset m_Link.\n\t// This means we need to check it's not nullptr before trying to send, but also capture the link,\n\t// to prevent it being reset between the null check and the Send:\n\tif (auto Link = m_Link; Link != nullptr)\n\t{\n\t\tm_Protocol.HandleOutgoingData(OutgoingData);\n\t\tLink->Send(OutgoingData.data(), OutgoingData.size());\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::Kick(const AString & a_Reason)\n{\n\tif (m_State >= csAuthenticating)  // Don't log pings\n\t{\n\t\tLOGINFO(\"Kicking player %s for \\\"%s\\\"\", m_Username.c_str(), StripColorCodes(a_Reason).c_str());\n\t}\n\tSendDisconnect(a_Reason);\n}\n\n\n\n\n\nbool cClientHandle::BungeeAuthenticate()\n{\n\tif (!m_ProxyConnection && cRoot::Get()->GetServer()->OnlyAllowBungeeCord())\n\t{\n\t\tKick(\"You can only connect to this server using a Proxy.\");\n\n\t\treturn false;\n\t}\n\n\tcServer * Server = cRoot::Get()->GetServer();\n\n\t// Proxy Shared Secret Check (BungeeGuard)\n\tconst AString & ForwardSecret = Server->GetProxySharedSecret();\n\tconst bool AllowBungee = Server->ShouldAllowBungeeCord();\n\tconst bool RequireForwardSecret = AllowBungee && !ForwardSecret.empty();\n\n\tif (RequireForwardSecret)\n\t{\n\t\tfor (auto & Node : GetProperties())\n\t\t{\n\t\t\tif (Node.get(\"name\", \"\").asString() == \"bungeeguard-token\")\n\t\t\t{\n\t\t\t\tAString SentToken = Node.get(\"value\", \"\").asString();\n\n\t\t\t\tif (ForwardSecret.compare(SentToken) == 0)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tKick(\"Unable to authenticate.\");\n\t\treturn false;\n\t}\n\telse if (m_ProxyConnection)\n\t{\n\t\tLOG(\"A player connected through a proxy without requiring a forwarding secret. If open to the internet, this is very insecure!\");\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cClientHandle::Authenticate(AString && a_Name, const cUUID & a_UUID, Json::Value && a_Properties)\n{\n\tcCSLock Lock(m_CSState);\n\t/*\n\tLOGD(\"Processing authentication for client %s @ %s (%p), state = %d\",\n\t\tm_Username.c_str(), m_IPString.c_str(), static_cast<void *>(this), m_State.load()\n\t);\n\t//*/\n\n\tif (m_State != csAuthenticating)\n\t{\n\t\treturn;\n\t}\n\n\tASSERT(m_Player == nullptr);\n\n\tif (!BungeeAuthenticate())\n\t{\n\t\treturn;\n\t}\n\n\tm_Username = std::move(a_Name);\n\n\t// Only assign UUID and properties if not already pre-assigned (BungeeCord sends those in the Handshake packet):\n\tif (m_UUID.IsNil())\n\t{\n\t\tm_UUID = a_UUID;\n\t}\n\tif (m_Properties.empty())\n\t{\n\t\tm_Properties = std::move(a_Properties);\n\t}\n\n\t// Send login success (if the protocol supports it):\n\tm_Protocol->SendLoginSuccess();\n\n\tif (m_ForgeHandshake.IsForgeClient)\n\t{\n\t\tm_ForgeHandshake.BeginForgeHandshake(*this);\n\t}\n\telse\n\t{\n\t\tFinishAuthenticate();\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::FinishAuthenticate()\n{\n\t// Serverside spawned player (so data are loaded).\n\tstd::unique_ptr<cPlayer> Player;\n\n\ttry\n\t{\n\t\tPlayer = std::make_unique<cPlayer>(shared_from_this());\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(\"Player \\\"%s\\\" save or statistics file loading failed: %s\", GetUsername().c_str(), Oops.what());\n\t\tKick(\"Contact an operator.\\n\\nYour player's save files could not be parsed.\\nTo avoid data loss you are prevented from joining.\");\n\t\treturn;\n\t}\n\n\tm_Player = Player.get();\n\n\t/*\n\tLOGD(\"Created a new cPlayer object at %p for client %s @ %s (%p)\",\n\t\tstatic_cast<void *>(m_Player),\n\t\tm_Username.c_str(), m_IPString.c_str(), static_cast<void *>(this)\n\t);\n\t//*/\n\n\tcWorld * World = cRoot::Get()->GetWorld(m_Player->GetLoadedWorldName());\n\tif (World == nullptr)\n\t{\n\t\tWorld = cRoot::Get()->GetDefaultWorld();\n\t}\n\n\t// Atomically increment player count (in server thread):\n\tcRoot::Get()->GetServer()->PlayerCreated();\n\n\tif (!cRoot::Get()->GetPluginManager()->CallHookPlayerJoined(*m_Player))\n\t{\n\t\tcRoot::Get()->BroadcastChatJoin(fmt::format(FMT_STRING(\"{} has joined the game\"), m_Username));\n\t\tLOGINFO(\"Player %s has joined the game\", m_Username);\n\t}\n\n\t// TODO: this accesses the world spawn from the authenticator thread\n\t// World spawn should be sent in OnAddedToWorld.\n\t// Return a server login packet:\n\tm_Protocol->SendLogin(*m_Player, *World);\n\n\t// Send the player's permission level.\n\t// The key effect is to allow 1.9+ clients to open the command block UI.\n\tSendPlayerPermissionLevel();\n\n\tif (m_Player->GetKnownRecipes().empty())\n\t{\n\t\tSendInitRecipes(0);\n\t}\n\telse\n\t{\n\t\tfor (const auto KnownRecipe : m_Player->GetKnownRecipes())\n\t\t{\n\t\t\tSendInitRecipes(KnownRecipe);\n\t\t}\n\t}\n\n\t// Send player list items:\n\tSendPlayerListAddPlayer(*m_Player);  // Add ourself\n\tcRoot::Get()->BroadcastPlayerListsAddPlayer(*m_Player);  // Add ourself to everyone else\n\tcRoot::Get()->SendPlayerLists(m_Player);  // Add everyone else to ourself\n\n\t// Send statistics:\n\tSendStatistics(m_Player->GetStatistics());\n\n\t// Delay the first ping until the client \"settles down\"\n\t// This should fix #889, \"BadCast exception, cannot convert bit to fm\" error in client\n\tm_PingStartTime = std::chrono::steady_clock::now() + std::chrono::seconds(3);  // Send the first KeepAlive packet in 3 seconds\n\n\t// Remove the client handle from the server, it will be ticked from its cPlayer object from now on:\n\tcRoot::Get()->GetServer()->ClientMovedToWorld(this);\n\n\tSetState(csDownloadingWorld);\n\tm_Player->Initialize(std::move(Player), *World);\n\n\t// LOGD(\"Client %s @ %s (%p) has been fully authenticated\", m_Username.c_str(), m_IPString.c_str(), static_cast<void *>(this));\n}\n\n\n\n\n\nvoid cClientHandle::StreamNextChunks(void)\n{\n\tASSERT(m_Player != nullptr);\n\n\tint ChunkPosX = m_Player->GetChunkX();\n\tint ChunkPosZ = m_Player->GetChunkZ();\n\n\tif ((m_LastStreamedChunkX == ChunkPosX) && (m_LastStreamedChunkZ == ChunkPosZ))\n\t{\n\t\t// All chunks are already loaded and the player has not moved, work is done:\n\t\treturn;\n\t}\n\n\t// Player moved chunks and / or loading is not finished, reset to bogus (GH #4531):\n\tm_LastStreamedChunkX = std::numeric_limits<decltype(m_LastStreamedChunkX)>::max();\n\tm_LastStreamedChunkZ = std::numeric_limits<decltype(m_LastStreamedChunkZ)>::max();\n\n\tint StreamedChunks = 0;\n\tVector3d Position = m_Player->GetEyePosition();\n\tVector3d LookVector = m_Player->GetLookVector();\n\n\t// Get the look vector and normalize it.\n\tLookVector.Normalize();\n\n\t// High priority: Load the chunks that are in the view-direction of the player (with a radius of 3)\n\tfor (int Range = 0; Range < m_CurrentViewDistance; Range++)\n\t{\n\t\tVector3d Vector = Position + LookVector * cChunkDef::Width * Range;\n\n\t\t// Get the chunk from the x / z coords.\n\t\tint RangeX, RangeZ = 0;\n\t\tcChunkDef::BlockToChunk(FloorC(Vector.x), FloorC(Vector.z), RangeX, RangeZ);\n\n\t\tfor (int X = 0; X < 7; X++)\n\t\t{\n\t\t\tfor (int Z = 0; Z < 7; Z++)\n\t\t\t{\n\t\t\t\tint ChunkX = RangeX + ((X >= 4) ? (3 - X) : X);\n\t\t\t\tint ChunkZ = RangeZ + ((Z >= 4) ? (3 - Z) : Z);\n\t\t\t\tcChunkCoords Coords(ChunkX, ChunkZ);\n\n\t\t\t\t// Checks if the chunk is in distance\n\t\t\t\tif ((Diff(ChunkX, ChunkPosX) > m_CurrentViewDistance) || (Diff(ChunkZ, ChunkPosZ) > m_CurrentViewDistance))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// If the chunk already loading / loaded -> skip\n\t\t\t\t{\n\t\t\t\t\tcCSLock Lock(m_CSChunkLists);\n\t\t\t\t\tif (\n\t\t\t\t\t\t(m_ChunksToSend.find(Coords) != m_ChunksToSend.end()) ||\n\t\t\t\t\t\t(m_LoadedChunks.find(Coords) != m_LoadedChunks.end())\n\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Unloaded chunk found -> Send it to the client.\n\t\t\t\tStreamChunk(ChunkX, ChunkZ, ((Range <= 2) ? cChunkSender::Priority::Critical : cChunkSender::Priority::Medium));\n\n\t\t\t\tif (++StreamedChunks == MAX_CHUNKS_STREAMED_PER_TICK)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Low priority: Add all chunks that are in range. (From the center out to the edge)\n\tfor (int d = 0; d <= m_CurrentViewDistance; ++d)  // cycle through (square) distance, from nearest to furthest\n\t{\n\t\tconst auto StreamIfUnloaded = [this](const cChunkCoords Chunk)\n\t\t{\n\t\t\t// If the chunk already loading / loaded -> skip\n\t\t\t{\n\t\t\t\tcCSLock Lock(m_CSChunkLists);\n\t\t\t\tif (\n\t\t\t\t\t(m_ChunksToSend.find(Chunk) != m_ChunksToSend.end()) ||\n\t\t\t\t\t(m_LoadedChunks.find(Chunk) != m_LoadedChunks.end())\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Unloaded chunk found -> Send it to the client.\n\t\t\tStreamChunk(Chunk.m_ChunkX, Chunk.m_ChunkZ, cChunkSender::Priority::Low);\n\t\t\treturn true;\n\t\t};\n\n\t\t// For each distance, send the first unloaded chunk in a hollow square centered around current position:\n\t\tfor (int i = -d; i <= d; ++i)\n\t\t{\n\t\t\tif (StreamIfUnloaded({ ChunkPosX + d, ChunkPosZ + i }) || StreamIfUnloaded({ ChunkPosX - d, ChunkPosZ + i }))\n\t\t\t{\n\t\t\t\tif (++StreamedChunks == MAX_CHUNKS_STREAMED_PER_TICK)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (int i = -d + 1; i < d; ++i)\n\t\t{\n\t\t\tif (StreamIfUnloaded({ ChunkPosX + i, ChunkPosZ + d }) || StreamIfUnloaded({ ChunkPosX + i, ChunkPosZ - d }))\n\t\t\t{\n\t\t\t\tif (++StreamedChunks == MAX_CHUNKS_STREAMED_PER_TICK)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All chunks are loaded -> Sets the last loaded chunk coordinates to current coordinates\n\tm_LastStreamedChunkX = ChunkPosX;\n\tm_LastStreamedChunkZ = ChunkPosZ;\n}\n\n\n\n\n\nvoid cClientHandle::UnloadOutOfRangeChunks(void)\n{\n\tint ChunkPosX = FAST_FLOOR_DIV(static_cast<int>(m_Player->GetPosX()), cChunkDef::Width);\n\tint ChunkPosZ = FAST_FLOOR_DIV(static_cast<int>(m_Player->GetPosZ()), cChunkDef::Width);\n\n\tcChunkCoordsList ChunksToRemove;\n\t{\n\t\tcCSLock Lock(m_CSChunkLists);\n\t\tfor (auto itr = m_LoadedChunks.begin(); itr != m_LoadedChunks.end();)\n\t\t{\n\t\t\tconst auto DiffX = Diff((*itr).m_ChunkX, ChunkPosX);\n\t\t\tconst auto DiffZ = Diff((*itr).m_ChunkZ, ChunkPosZ);\n\t\t\tif ((DiffX > m_CurrentViewDistance) || (DiffZ > m_CurrentViewDistance))\n\t\t\t{\n\t\t\t\tChunksToRemove.push_back(*itr);\n\t\t\t\titr = m_LoadedChunks.erase(itr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++itr;\n\t\t\t}\n\t\t}\n\n\t\tfor (auto itr = m_ChunksToSend.begin(); itr != m_ChunksToSend.end();)\n\t\t{\n\t\t\tconst auto DiffX = Diff((*itr).m_ChunkX, ChunkPosX);\n\t\t\tconst auto DiffZ = Diff((*itr).m_ChunkZ, ChunkPosZ);\n\t\t\tif ((DiffX > m_CurrentViewDistance) || (DiffZ > m_CurrentViewDistance))\n\t\t\t{\n\t\t\t\titr = m_ChunksToSend.erase(itr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++itr;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (cChunkCoordsList::iterator itr = ChunksToRemove.begin(); itr != ChunksToRemove.end(); ++itr)\n\t{\n\t\tm_Player->GetWorld()->RemoveChunkClient(itr->m_ChunkX, itr->m_ChunkZ, this);\n\t\tSendUnloadChunk(itr->m_ChunkX, itr->m_ChunkZ);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::StreamChunk(int a_ChunkX, int a_ChunkZ, cChunkSender::Priority a_Priority)\n{\n\tcWorld * World = m_Player->GetWorld();\n\tASSERT(World != nullptr);\n\n\tif (World->AddChunkClient(a_ChunkX, a_ChunkZ, this))\n\t{\n\t\t{\n\t\t\tcCSLock Lock(m_CSChunkLists);\n\t\t\tm_LoadedChunks.emplace(a_ChunkX, a_ChunkZ);\n\t\t\tm_ChunksToSend.emplace(a_ChunkX, a_ChunkZ);\n\t\t}\n\t\tWorld->SendChunkTo(a_ChunkX, a_ChunkZ, a_Priority, this);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::HandleAnimation(const bool a_SwingMainHand)\n{\n\tif (cPluginManager::Get()->CallHookPlayerAnimation(*m_Player, a_SwingMainHand ? 0 : 1))\n\t{\n\t\t// Plugin disagrees, bail out:\n\t\treturn;\n\t}\n\n\tm_Player->GetWorld()->BroadcastEntityAnimation(*m_Player, a_SwingMainHand ? EntityAnimation::PlayerMainHandSwings : EntityAnimation::PlayerOffHandSwings, this);\n}\n\n\n\n\n\nvoid cClientHandle::HandleNPCTrade(int a_SlotNum)\n{\n\t// TODO\n\tLOGWARNING(\"%s: Not implemented yet\", __FUNCTION__);\n}\n\n\n\n\n\nvoid cClientHandle::HandleOpenHorseInventory()\n{\n\tm_Player->OpenHorseInventory();\n}\n\n\n\n\n\nvoid cClientHandle::HandlePing(void)\n{\n\t/* TODO: unused function, handles Legacy Server List Ping\n\thttp://wiki.vg/Protocol#Legacy_Server_List_Ping suggests that servers SHOULD handle this packet */\n\n\t// Somebody tries to retrieve information about the server\n\tconst cServer & Server = *cRoot::Get()->GetServer();\n\n\tauto Reply = fmt::format(FMT_STRING(\"{}{}{}{}{}\"),\n\t\tServer.GetDescription(), cChatColor::Delimiter,\n\t\tServer.GetNumPlayers(),  cChatColor::Delimiter,\n\t\tServer.GetMaxPlayers()\n\t);\n\tKick(Reply);\n}\n\n\n\n\n\nbool cClientHandle::HandleLogin()\n{\n\t{\n\t\tcCSLock lock(m_CSState);\n\t\tif (m_State != csConnected)\n\t\t{\n\t\t\t/*\n\t\t\tLOGD(\"Client %s @ %s (%p, state %d) has disconnected before logging in, bailing out of login\",\n\t\t\t\ta_Username.c_str(), m_IPString.c_str(), static_cast<void *>(this), m_State.load()\n\t\t\t);\n\t\t\t//*/\n\t\t\treturn false;\n\t\t}\n\n\t\t// LOGD(\"Handling login for client %s @ %s (%p), state = %d\", a_Username.c_str(), m_IPString.c_str(), static_cast<void *>(this), m_State.load());\n\n\t\t// Let the plugins know about this event, they may refuse the player:\n\t\tif (cRoot::Get()->GetPluginManager()->CallHookLogin(*this, m_ProtocolVersion, GetUsername()))\n\t\t{\n\t\t\tSendDisconnect(\"Login Rejected!\");\n\t\t\treturn false;\n\t\t}\n\n\t\tm_State = csAuthenticating;\n\t}  // lock(m_CSState)\n\n\t// Schedule for authentication; until then, let the player wait (but do not block):\n\tcRoot::Get()->GetAuthenticator().Authenticate(GetUniqueID(), m_Username, m_Protocol->GetAuthServerID());\n\treturn true;\n}\n\n\n\n\n\nvoid cClientHandle::HandleCreativeInventory(Int16 a_SlotNum, const cItem & a_HeldItem, eClickAction a_ClickAction)\n{\n\t// This is for creative Inventory changes\n\tif (!m_Player->IsGameModeCreative())\n\t{\n\t\tLOGWARNING(\"Got a CreativeInventoryAction packet from user \\\"%s\\\" while not in creative mode. Ignoring.\", m_Username.c_str());\n\t\treturn;\n\t}\n\tif (m_Player->GetWindow()->GetWindowType() != cWindow::wtInventory)\n\t{\n\t\tLOGWARNING(\"Got a CreativeInventoryAction packet from user \\\"%s\\\" while not in the inventory window. Ignoring.\", m_Username.c_str());\n\t\treturn;\n\t}\n\n\tm_Player->GetWindow()->Clicked(*m_Player, 0, a_SlotNum, a_ClickAction, a_HeldItem);\n}\n\n\n\n\n\nvoid cClientHandle::HandleCrouch(const bool a_IsCrouching)\n{\n\tm_Player->SetCrouch(a_IsCrouching);\n}\n\n\n\n\n\nvoid cClientHandle::HandleEnchantItem(UInt8 a_WindowID, UInt8 a_Enchantment)\n{\n\tif (a_Enchantment > 2)\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" tried to select an invalid enchantment - hacked client?\", m_Username.c_str());\n\t\treturn;\n\t}\n\n\t// Bail out if something's wrong with the window:\n\tif (\n\t\t(m_Player->GetWindow() == nullptr) ||\n\t\t(m_Player->GetWindow()->GetWindowID() != a_WindowID) ||\n\t\t(m_Player->GetWindow()->GetWindowType() != cWindow::wtEnchantment)\n\t)\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" tried to enchant without a valid window - hacked client?\", m_Username.c_str());\n\t\treturn;\n\t}\n\n\tcEnchantingWindow * Window = static_cast<cEnchantingWindow *>(m_Player->GetWindow());\n\tconst auto BaseEnchantmentLevel = Window->GetProperty(a_Enchantment);\n\n\t// Survival players must be checked they can afford enchantment and have lapis removed:\n\tif (!m_Player->IsGameModeCreative())\n\t{\n\t\tconst auto XpRequired = m_Player->XpForLevel(BaseEnchantmentLevel);\n\t\tauto LapisStack = *Window->m_SlotArea->GetSlot(1, *m_Player);  // A copy of the lapis stack.\n\t\tconst auto LapisRequired = a_Enchantment + 1;\n\n\t\t// Only allow enchantment if the player has sufficient levels and lapis to enchant:\n\t\tif ((m_Player->GetCurrentXp() >= XpRequired) && (LapisStack.m_ItemCount >= LapisRequired))\n\t\t{\n\t\t\t// We need to reduce the player's level by the number of lapis required.\n\t\t\t// However we need to keep the resulting percentage filled the same.\n\n\t\t\tconst auto TargetLevel = m_Player->GetXpLevel() - LapisRequired;\n\t\t\tconst auto CurrentFillPercent = m_Player->GetXpPercentage();\n\n\t\t\t// The experience to remove in order to reach the start (0% fill) of the target level.\n\t\t\tconst auto DeltaForLevel = -m_Player->GetCurrentXp() + m_Player->XpForLevel(TargetLevel);\n\n\t\t\t// The experience to add to get the same fill percent.\n\t\t\tconst auto DeltaForPercent = CurrentFillPercent * (m_Player->XpForLevel(TargetLevel + 1) - m_Player->XpForLevel(TargetLevel));\n\n\t\t\t// Apply the experience delta, rounded for greater accuracy:\n\t\t\tm_Player->DeltaExperience(static_cast<int>(std::lround(DeltaForLevel + DeltaForPercent)));\n\n\t\t\t// Now reduce the lapis in our stack and send it back:\n\t\t\tLapisStack.AddCount(static_cast<char>(-LapisRequired));\n\t\t\tWindow->m_SlotArea->SetSlot(1, *m_Player, LapisStack);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Not creative and can't afford enchantment, so exit:\n\t\t\tLOGD(\"Player \\\"%s\\\" selected unavailable enchantment - hacked client?\", m_Username.c_str());\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// The enchanted item corresponding to our chosen option (top, middle, bottom).\n\tcItem EnchantedItem = Window->m_SlotArea->SelectEnchantedOption(a_Enchantment);\n\n\t// Set the item slot to our new enchanted item:\n\tWindow->m_SlotArea->SetSlot(0, *m_Player, EnchantedItem);\n\tm_Player->PermuteEnchantmentSeed();\n}\n\n\n\n\n\nvoid cClientHandle::HandlePlayerAbilities(bool a_IsFlying, float FlyingSpeed, float WalkingSpeed)\n{\n\tUNUSED(FlyingSpeed);  // Ignore the client values for these\n\tUNUSED(WalkingSpeed);\n\n\tm_Player->SetFlying(a_IsFlying);\n}\n\n\n\n\n\nvoid cClientHandle::HandlePluginMessage(const AString & a_Channel, const ContiguousByteBufferView a_Message)\n{\n\tif (a_Channel == \"REGISTER\")\n\t{\n\t\tif (HasPluginChannel(a_Channel))\n\t\t{\n\t\t\tSendPluginMessage(\"UNREGISTER\", a_Channel);\n\t\t\treturn;  // Can't register again if already taken - kinda defeats the point of plugin messaging!\n\t\t}\n\n\t\tRegisterPluginChannels(BreakApartPluginChannels(a_Message));\n\t}\n\telse if (a_Channel == \"UNREGISTER\")\n\t{\n\t\tUnregisterPluginChannels(BreakApartPluginChannels(a_Message));\n\t}\n\telse if (a_Channel == \"FML|HS\")\n\t{\n\t\tm_ForgeHandshake.DataReceived(*this, a_Message);\n\t}\n\telse if (!HasPluginChannel(a_Channel))\n\t{\n\t\t// Ignore if client sent something but didn't register the channel first\n\t\tLOGD(\"Player %s sent a plugin message on channel \\\"%s\\\", but didn't REGISTER it first\", GetUsername().c_str(), a_Channel.c_str());\n\t\tSendPluginMessage(\"UNREGISTER\", a_Channel);\n\t\treturn;\n\t}\n\n\tcPluginManager::Get()->CallHookPluginMessage(*this, a_Channel, a_Message);\n}\n\n\n\n\n\nAStringVector cClientHandle::BreakApartPluginChannels(const ContiguousByteBufferView a_PluginChannels)\n{\n\t// Break the string on each NUL character.\n\t// Note that StringSplit() doesn't work on this because NUL is a special char - string terminator\n\tsize_t len = a_PluginChannels.size();\n\tsize_t first = 0;\n\tAStringVector res;\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tif (a_PluginChannels[i] != std::byte(0))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (i > first)\n\t\t{\n\t\t\tconst auto Part = a_PluginChannels.substr(first, i - first);\n\t\t\tres.emplace_back(reinterpret_cast<const char *>(Part.data()), Part.size());\n\t\t}\n\t\tfirst = i + 1;\n\t}  // for i - a_PluginChannels[]\n\tif (first < len)\n\t{\n\t\tconst auto Part = a_PluginChannels.substr(first, len - first);\n\t\tres.emplace_back(reinterpret_cast<const char *>(Part.data()), Part.size());\n\t}\n\treturn res;\n}\n\n\n\n\n\nvoid cClientHandle::RegisterPluginChannels(const AStringVector & a_ChannelList)\n{\n\tfor (AStringVector::const_iterator itr = a_ChannelList.begin(), end = a_ChannelList.end(); itr != end; ++itr)\n\t{\n\t\tm_PluginChannels.insert(*itr);\n\t}  // for itr - a_ChannelList[]\n}\n\n\n\n\n\nvoid cClientHandle::UnregisterPluginChannels(const AStringVector & a_ChannelList)\n{\n\tfor (AStringVector::const_iterator itr = a_ChannelList.begin(), end = a_ChannelList.end(); itr != end; ++itr)\n\t{\n\t\tm_PluginChannels.erase(*itr);\n\t}  // for itr - a_ChannelList[]\n}\n\n\n\n\n\nvoid cClientHandle::HandleBeaconSelection(unsigned a_PrimaryEffect, unsigned a_SecondaryEffect)\n{\n\tcWindow * Window = m_Player->GetWindow();\n\tif ((Window == nullptr) || (Window->GetWindowType() != cWindow::wtBeacon))\n\t{\n\t\treturn;\n\t}\n\tcBeaconWindow * BeaconWindow = static_cast<cBeaconWindow *>(Window);\n\n\tif (Window->GetSlot(*m_Player, 0)->IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\tcEntityEffect::eType PrimaryEffect = cEntityEffect::effNoEffect;\n\tif (a_PrimaryEffect <= static_cast<int>(cEntityEffect::effSaturation))\n\t{\n\t\tPrimaryEffect = static_cast<cEntityEffect::eType>(a_PrimaryEffect);\n\t}\n\tcEntityEffect::eType SecondaryEffect = cEntityEffect::effNoEffect;\n\tif (a_SecondaryEffect <= static_cast<int>(cEntityEffect::effSaturation))\n\t{\n\t\tSecondaryEffect = static_cast<cEntityEffect::eType>(a_SecondaryEffect);\n\t}\n\n\tWindow->SetSlot(*m_Player, 0, cItem());\n\tBeaconWindow->GetBeaconEntity()->SetPrimaryEffect(PrimaryEffect);\n\n\t// Valid effect check. Vanilla don't check this, but we do it :)\n\tif (\n\t\t(SecondaryEffect == cEntityEffect::effNoEffect) ||\n\t\t(SecondaryEffect == cEntityEffect::effRegeneration) ||\n\t\t(SecondaryEffect == BeaconWindow->GetBeaconEntity()->GetPrimaryEffect())\n\t)\n\t{\n\t\tBeaconWindow->GetBeaconEntity()->SetSecondaryEffect(SecondaryEffect);\n\t}\n\telse\n\t{\n\t\tBeaconWindow->GetBeaconEntity()->SetSecondaryEffect(cEntityEffect::effNoEffect);\n\t}\n\n\tm_Player->CloseWindow(true);\n}\n\n\n\n\n\nvoid cClientHandle::HandleCommandBlockBlockChange(Vector3i a_BlockPos, const AString & a_NewCommand)\n{\n\tif (a_NewCommand.empty())\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" send an empty command block string - hacked client?\", m_Username.c_str());\n\t\treturn;\n\t}\n\n\tif ((m_Player == nullptr) || !m_Player->HasPermission(\"cuberite.commandblock.set\"))\n\t{\n\t\tSendChat(\"You cannot edit command blocks on this server\", mtFailure);\n\t\treturn;\n\t}\n\n\tcWorld * World = m_Player->GetWorld();\n\tif (World->AreCommandBlocksEnabled())\n\t{\n\t\tWorld->SetCommandBlockCommand(a_BlockPos, a_NewCommand);\n\t\tSendChat(\"Successfully set command block command\", mtSuccess);\n\t}\n\telse\n\t{\n\t\tSendChat(\"Command blocks are not enabled on this server\", mtFailure);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::HandleCommandBlockEntityChange(UInt32 a_EntityID, const AString & a_NewCommand)\n{\n\t// TODO\n\tLOGWARNING(\"%s: Not implemented yet\", __FUNCTION__);\n}\n\n\n\n\n\nvoid cClientHandle::HandleAnvilItemName(const AString & a_ItemName)\n{\n\tif ((m_Player->GetWindow() == nullptr) || (m_Player->GetWindow()->GetWindowType() != cWindow::wtAnvil))\n\t{\n\t\treturn;\n\t}\n\n\tif (a_ItemName.length() <= 30)\n\t{\n\t\tstatic_cast<cAnvilWindow *>(m_Player->GetWindow())->SetRepairedItemName(a_ItemName, m_Player);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::HandleLeftClick(Vector3i a_BlockPos, eBlockFace a_BlockFace, UInt8 a_Status)\n{\n\tFLOGD(\"HandleLeftClick: {0}; Face: {1}; Stat: {2}\",\n\t\ta_BlockPos, a_BlockFace, a_Status\n\t);\n\n\tm_NumBlockChangeInteractionsThisTick++;\n\n\tif (!CheckBlockInteractionsRate())\n\t{\n\t\tKick(\"Too many blocks were destroyed per unit time - hacked client?\");\n\t\treturn;\n\t}\n\n\tif ((a_Status == DIG_STATUS_STARTED) || (a_Status == DIG_STATUS_FINISHED))\n\t{\n\t\tif (a_BlockFace == BLOCK_FACE_NONE)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t/* Check for clickthrough-blocks:\n\t\tWhen the user breaks a fire block, the client send the wrong block location.\n\t\tWe must find the right block with the face direction. */\n\t\tif (\n\t\t\tconst auto InterferingPosition = AddFaceDirection(a_BlockPos, a_BlockFace);\n\t\t\tcChunkDef::IsValidHeight(InterferingPosition) && cBlockInfo::IsClickedThrough(m_Player->GetWorld()->GetBlock(InterferingPosition))\n\t\t)\n\t\t{\n\t\t\ta_BlockPos = InterferingPosition;\n\t\t}\n\n\t\tif (!IsWithinReach(a_BlockPos))\n\t\t{\n\t\t\tm_Player->SendBlocksAround(a_BlockPos, 2);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tcPluginManager * PlgMgr = cRoot::Get()->GetPluginManager();\n\tif (m_Player->IsFrozen() || PlgMgr->CallHookPlayerLeftClick(*m_Player, a_BlockPos, a_BlockFace, static_cast<char>(a_Status)))\n\t{\n\t\t// A plugin doesn't agree with the action, replace the block on the client and quit:\n\t\tm_Player->SendBlocksAround(a_BlockPos, 2);\n\t\tSendPlayerPosition();  // Prevents the player from falling through the block that was temporarily broken client side.\n\t\treturn;\n\t}\n\n\tswitch (a_Status)\n\t{\n\t\tcase DIG_STATUS_DROP_HELD:  // Drop held item\n\t\t{\n\t\t\tif (PlgMgr->CallHookPlayerTossingItem(*m_Player))\n\t\t\t{\n\t\t\t\t// A plugin doesn't agree with the tossing. The plugin itself is responsible for handling the consequences (possible inventory mismatch)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tm_Player->TossEquippedItem();\n\t\t\treturn;\n\t\t}\n\n\t\tcase DIG_STATUS_SHOOT_EAT:\n\t\t{\n\t\t\tauto & ItemHandler = m_Player->GetEquippedItem().GetHandler();\n\t\t\tif (ItemHandler.IsFood() || ItemHandler.IsDrinkable(m_Player->GetEquippedItem().m_ItemDamage))\n\t\t\t{\n\t\t\t\tm_Player->AbortEating();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (PlgMgr->CallHookPlayerShooting(*m_Player))\n\t\t\t\t{\n\t\t\t\t\t// A plugin doesn't agree with the action. The plugin itself is responsible for handling the consequences (possible inventory mismatch)\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// When bow is in off-hand / shield slot\n\t\t\t\tif (m_Player->GetInventory().GetShieldSlot().m_ItemType == E_ITEM_BOW)\n\t\t\t\t{\n\t\t\t\t\tm_Player->GetInventory().GetShieldSlot().GetHandler().OnItemShoot(m_Player, a_BlockPos, a_BlockFace);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tItemHandler.OnItemShoot(m_Player, a_BlockPos, a_BlockFace);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase DIG_STATUS_STARTED:\n\t\t{\n\t\t\tHandleBlockDigStarted(a_BlockPos, a_BlockFace);\n\t\t\treturn;\n\t\t}\n\n\t\tcase DIG_STATUS_FINISHED:\n\t\t{\n\t\t\tHandleBlockDigFinished(a_BlockPos, a_BlockFace);\n\t\t\treturn;\n\t\t}\n\n\t\tcase DIG_STATUS_CANCELLED:\n\t\t{\n\t\t\t// Block breaking cancelled by player\n\t\t\tFinishDigAnimation();\n\t\t\treturn;\n\t\t}\n\n\t\tcase DIG_STATUS_DROP_STACK:\n\t\t{\n\t\t\tif (PlgMgr->CallHookPlayerTossingItem(*m_Player))\n\t\t\t{\n\t\t\t\t// A plugin doesn't agree with the tossing. The plugin itself is responsible for handling the consequences (possible inventory mismatch)\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tm_Player->TossEquippedItem(64);  // Toss entire slot - if there aren't enough items, the maximum will be ejected\n\t\t\treturn;\n\t\t}\n\n\t\tcase DIG_STATUS_SWAP_ITEM_IN_HAND:\n\t\t{\n\n\t\t\tcItem EquippedItem = m_Player->GetEquippedItem();\n\t\t\tcItem OffhandItem = m_Player->GetOffHandEquipedItem();\n\n\t\t\tcInventory & Inventory = m_Player->GetInventory();\n\t\t\tInventory.SetShieldSlot(EquippedItem);\n\t\t\tInventory.SetEquippedItem(OffhandItem);\n\n\t\t\treturn;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unhandled DIG_STATUS\");\n\t\t\treturn;\n\t\t}\n\t}  // switch (a_Status)\n}\n\n\n\n\n\nvoid cClientHandle::HandleBlockDigStarted(Vector3i a_BlockPos, eBlockFace a_BlockFace)\n{\n\tif (m_Player->IsGameModeAdventure())\n\t{\n\t\t// Players in adventure mode can't destroy blocks\n\t\treturn;\n\t}\n\n\tif (\n\t\tm_HasStartedDigging && (a_BlockPos == m_LastDigBlockPos)\n\t)\n\t{\n\t\t// It is a duplicate packet, drop it right away\n\t\treturn;\n\t}\n\n\tBLOCKTYPE DiggingBlock;\n\tNIBBLETYPE DiggingMeta;\n\tif (!m_Player->GetWorld()->GetBlockTypeMeta(a_BlockPos, DiggingBlock, DiggingMeta))\n\t{\n\t\treturn;\n\t}\n\n\tif (\n\t\tm_Player->IsGameModeCreative() &&\n\t\tItemCategory::IsSword(m_Player->GetInventory().GetEquippedItem().m_ItemType) &&\n\t\t(DiggingBlock != E_BLOCK_FIRE)\n\t)\n\t{\n\t\t// Players can't destroy blocks with a sword in the hand.\n\t\treturn;\n\t}\n\n\t// Set the last digging coords to the block being dug, so that they can be checked in DIG_FINISHED to avoid dig / aim bug in the client:\n\tm_HasStartedDigging = true;\n\tm_LastDigBlockPos = a_BlockPos;\n\n\tif (\n\t\tm_Player->IsGameModeCreative() ||         // In creative mode, digging is done immediately\n\t\tm_Player->CanInstantlyMine(DiggingBlock)  // Sometimes the player is fast enough to instantly mine\n\t)\n\t{\n\t\t// Immediately done:\n\t\tm_BreakProgress = 1;\n\n\t\tHandleBlockDigFinished(a_BlockPos, a_BlockFace);\n\t\treturn;\n\t}\n\n\tm_BreakProgress = 0;\n\n\t// Start dig animation\n\t// TODO: calculate real animation speed\n\t// TODO: Send animation packets even without receiving any other packets\n\tm_BlockDigAnimSpeed = 10;\n\tm_BlockDigAnimPos = a_BlockPos;\n\tm_BlockDigAnimStage = 0;\n\tm_Player->GetWorld()->BroadcastBlockBreakAnimation(static_cast<UInt32>(m_UniqueID), m_BlockDigAnimPos, 0, this);\n\n\tcWorld * World = m_Player->GetWorld();\n\tcChunkInterface ChunkInterface(World->GetChunkMap());\n\tcBlockHandler::For(DiggingBlock).OnDigging(ChunkInterface, *World, *m_Player, a_BlockPos);\n\n\tm_Player->GetEquippedItem().GetHandler().OnDiggingBlock(World, m_Player, m_Player->GetEquippedItem(), a_BlockPos, a_BlockFace);\n}\n\n\n\n\n\nvoid cClientHandle::HandleBlockDigFinished(Vector3i a_BlockPos, eBlockFace a_BlockFace)\n{\n\tif (\n\t\t!m_HasStartedDigging ||           // Hasn't received the DIG_STARTED packet\n\t\t(m_LastDigBlockPos != a_BlockPos)  // DIG_STARTED has had different pos\n\t)\n\t{\n\t\tFLOGD(\"Prevented a dig / aim bug in the client (finish {0} vs start {1}, HSD: {2})\",\n\t\t\ta_BlockPos,\n\t\t\tm_LastDigBlockPos,\n\t\t\t(m_HasStartedDigging ? \"True\" : \"False\")\n\t\t);\n\t\treturn;\n\t}\n\n\tFinishDigAnimation();\n\n\tBLOCKTYPE DugBlock;\n\tNIBBLETYPE DugMeta;\n\tif (!m_Player->GetWorld()->GetBlockTypeMeta(a_BlockPos, DugBlock, DugMeta))\n\t{\n\t\treturn;\n\t}\n\n\tif (!m_Player->IsGameModeCreative())\n\t{\n\t\tm_BreakProgress += m_Player->GetMiningProgressPerTick(DugBlock);\n\n\t\t// Check for very fast tools. Maybe instead of FASTBREAK_PERCENTAGE we should check we are within x multiplied by the progress per tick\n\t\tif (m_BreakProgress < FASTBREAK_PERCENTAGE)\n\t\t{\n\t\t\tLOGD(\"Break progress of player %s was less than expected: %f < %f\\n\", m_Player->GetName().c_str(), m_BreakProgress * 100, FASTBREAK_PERCENTAGE * 100);\n\t\t\t// AntiFastBreak doesn't agree with the breaking. Bail out. Send the block back to the client, so that it knows:\n\t\t\tm_Player->SendBlocksAround(a_BlockPos, 2);\n\t\t\tSendPlayerPosition();  // Prevents the player from falling through the block that was temporarily broken client side.\n\t\t\tm_Player->SendMessage(\"FastBreak?\");  // TODO Anticheat hook\n\t\t\treturn;\n\t\t}\n\t}\n\n\tcWorld * World = m_Player->GetWorld();\n\n\tif (cRoot::Get()->GetPluginManager()->CallHookPlayerBreakingBlock(*m_Player, a_BlockPos, a_BlockFace, DugBlock, DugMeta))\n\t{\n\t\t// A plugin doesn't agree with the breaking. Bail out. Send the block back to the client, so that it knows:\n\t\tm_Player->SendBlocksAround(a_BlockPos, 2);\n\t\tSendPlayerPosition();  // Prevents the player from falling through the block that was temporarily broken client side.\n\t\treturn;\n\t}\n\n\tif (DugBlock == E_BLOCK_AIR)\n\t{\n\t\treturn;\n\t}\n\n\t// Apply hunger:\n\tm_Player->AddFoodExhaustion(0.025);\n\n\t// Damage the tool, but not for 0 hardness blocks:\n\tm_Player->UseEquippedItem(cBlockInfo::IsOneHitDig(DugBlock) ? cItemHandler::dlaBreakBlockInstant : cItemHandler::dlaBreakBlock);\n\n\tcChunkInterface ChunkInterface(World->GetChunkMap());\n\tVector3i absPos(a_BlockPos);\n\tif (m_Player->IsGameModeSurvival())\n\t{\n\t\tWorld->DropBlockAsPickups(absPos, m_Player, &m_Player->GetEquippedItem());\n\t}\n\telse\n\t{\n\t\tWorld->DigBlock(absPos, m_Player);\n\t}\n\n\tWorld->BroadcastSoundParticleEffect(EffectID::PARTICLE_BLOCK_BREAK, absPos, DugBlock, this);\n\tcRoot::Get()->GetPluginManager()->CallHookPlayerBrokenBlock(*m_Player, a_BlockPos, a_BlockFace, DugBlock, DugMeta);\n}\n\n\n\n\n\nvoid cClientHandle::FinishDigAnimation()\n{\n\tif (!m_HasStartedDigging)  // Hasn't received the DIG_STARTED packet\n\t{\n\t\treturn;\n\t}\n\n\tm_HasStartedDigging = false;\n\tif (m_BlockDigAnimStage != -1)\n\t{\n\t\t// End dig animation\n\t\tm_BlockDigAnimStage = -1;\n\t\t// It seems that 10 ends block animation\n\t\tm_Player->GetWorld()->BroadcastBlockBreakAnimation(static_cast<UInt32>(m_UniqueID), m_LastDigBlockPos, 10, this);\n\t}\n\n\tm_LastDigBlockPos = s_IllegalPosition;\n}\n\n\n\n\n\nvoid cClientHandle::HandleRightClick(Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_CursorPos, bool a_UsedMainHand)\n{\n\t/* This function handles three actions:\n\t(1) Place a block;\n\t(2) \"Use\" a block: Interactive with the block, like opening a chest/crafting table/furnace;\n\t(3) Use the held item targeting a block. E.g. farming.\n\n\tSneaking player will not use the block if hand is not empty.\n\tFrozen player can do nothing.\n\tIn Game Mode Spectator, player cannot use item or place block, but can interactive with some block depending on cBlockInfo::IsUseableBySpectator(BlockType)\n\n\tIf the action failed, we need to send an update of the placed block or inventory to the client.\n\n\tActions rejected by plugin will not lead to other attempts.\n\tE.g., when opening a chest with a dirt in hand, if the plugin rejects opening the chest, the dirt will not be placed. */\n\n\tif ((a_BlockFace == BLOCK_FACE_NONE) || !cChunkDef::IsValidHeight(a_BlockPos))\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" sent an invalid click - hacked client?\", m_Username.c_str());\n\t\treturn;\n\t}\n\n\t// TODO: We are still consuming the items in main hand. Remove this override when the off-hand consumption is handled correctly.\n\ta_UsedMainHand = true;\n\n\tcWorld * World = m_Player->GetWorld();\n\tcPluginManager * PlgMgr = cRoot::Get()->GetPluginManager();\n\tconst cItem & HeldItem = a_UsedMainHand ? m_Player->GetEquippedItem() : m_Player->GetInventory().GetShieldSlot();\n\n\tFLOGD(\"HandleRightClick: {0}, face {1}, Cursor {2}, Hand: {3}, HeldItem: {4}\", a_BlockPos, a_BlockFace, a_CursorPos, a_UsedMainHand, ItemToFullString(HeldItem));\n\n\tif (!PlgMgr->CallHookPlayerRightClick(*m_Player, a_BlockPos, a_BlockFace, a_CursorPos) && IsWithinReach(a_BlockPos) && !m_Player->IsFrozen())\n\t{\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\n\t\tif (!World->GetBlockTypeMeta(a_BlockPos, BlockType, BlockMeta))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto & ItemHandler = HeldItem.GetHandler();\n\t\tconst auto & BlockHandler = cBlockHandler::For(BlockType);\n\t\tconst bool BlockUsable = BlockHandler.IsUseable() && (m_Player->IsGameModeSpectator() ? cBlockInfo::IsUseableBySpectator(BlockType) : !(m_Player->IsCrouched() && !HeldItem.IsEmpty()));\n\t\tconst bool ItemPlaceable = ItemHandler.IsPlaceable() && !m_Player->IsGameModeAdventure() && !m_Player->IsGameModeSpectator();\n\t\tconst bool ItemUseable = !m_Player->IsGameModeSpectator();\n\n\t\tif (BlockUsable)\n\t\t{\n\t\t\tcChunkInterface ChunkInterface(World->GetChunkMap());\n\t\t\tif (!PlgMgr->CallHookPlayerUsingBlock(*m_Player, a_BlockPos, a_BlockFace, a_CursorPos, BlockType, BlockMeta))\n\t\t\t{\n\t\t\t\t// Use a block:\n\t\t\t\tif (BlockHandler.OnUse(ChunkInterface, *World, *m_Player, a_BlockPos, a_BlockFace, a_CursorPos))\n\t\t\t\t{\n\t\t\t\t\tPlgMgr->CallHookPlayerUsedBlock(*m_Player, a_BlockPos, a_BlockFace, a_CursorPos, BlockType, BlockMeta);\n\t\t\t\t\treturn;  // Block use was successful, we're done.\n\t\t\t\t}\n\n\t\t\t\t// If block use failed, fall back to placement:\n\t\t\t\tif (ItemPlaceable)\n\t\t\t\t{\n\t\t\t\t\t// Place a block:\n\t\t\t\t\tItemHandler.OnPlayerPlace(*m_Player, HeldItem, a_BlockPos, BlockType, BlockMeta, a_BlockFace, a_CursorPos);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse if (ItemPlaceable)\n\t\t{\n\t\t\t// TODO: Double check that we don't need this for using item and for packet out of range\n\t\t\tm_NumBlockChangeInteractionsThisTick++;\n\t\t\tif (!CheckBlockInteractionsRate())\n\t\t\t{\n\t\t\t\tKick(\"Too many blocks were placed / interacted with per unit time - hacked client?\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Place a block:\n\t\t\tItemHandler.OnPlayerPlace(*m_Player, HeldItem, a_BlockPos, BlockType, BlockMeta, a_BlockFace, a_CursorPos);\n\t\t\treturn;\n\t\t}\n\t\telse if (ItemUseable)\n\t\t{\n\t\t\tif (!PlgMgr->CallHookPlayerUsingItem(*m_Player, a_BlockPos, a_BlockFace, a_CursorPos))\n\t\t\t{\n\t\t\t\t// All plugins agree with using the item.\n\t\t\t\t// Use an item in hand with a target block.\n\n\t\t\t\tcBlockInServerPluginInterface PluginInterface(*World);\n\t\t\t\tItemHandler.OnItemUse(World, m_Player, PluginInterface, HeldItem, a_BlockPos, a_BlockFace);\n\t\t\t\tPlgMgr->CallHookPlayerUsedItem(*m_Player, a_BlockPos, a_BlockFace, a_CursorPos);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// (x) None of the above.\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// TODO: delete OnItemUse bool return, delete onCancelRightClick\n\n\t// Update the target block including the block above and below for 2 block high things:\n\tm_Player->SendBlocksAround(a_BlockPos, 2);\n\n\t// TODO: Send corresponding slot based on hand\n\tm_Player->GetInventory().SendEquippedSlot();\n}\n\n\n\n\n\nvoid cClientHandle::HandleChat(const AString & a_Message)\n{\n\tif ((a_Message.size()) > MAX_CHAT_MSG_LENGTH)\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" sent a chat message exceeding the maximum length - hacked client?\", m_Username.c_str());\n\t\treturn;\n\t}\n\n\t// If a command, perform it:\n\tAString Message(a_Message);\n\tif (cRoot::Get()->GetServer()->Command(*this, Message))\n\t{\n\t\treturn;\n\t}\n\n\t// Not a command, broadcast as a message:\n\tcCompositeChat Msg;\n\tAString Color = m_Player->GetColor();\n\tif (Color.length() == 3)\n\t{\n\t\tColor = AString(\"@\") + Color[2];\n\t}\n\telse\n\t{\n\t\tColor.clear();\n\t}\n\tMsg.AddTextPart(\"<\");\n\tMsg.ParseText(m_Player->GetPrefix());\n\tMsg.AddTextPart(m_Player->GetName(), Color);\n\tMsg.ParseText(m_Player->GetSuffix());\n\tMsg.AddTextPart(\"> \");\n\tif (m_Player->HasPermission(\"cuberite.chat.format\"))\n\t{\n\t\tMsg.ParseText(Message);\n\t}\n\telse\n\t{\n\t\tMsg.AddTextPart(Message);\n\t}\n\tMsg.UnderlineUrls();\n\tcRoot::Get()->BroadcastChat(Msg);\n}\n\n\n\n\n\nvoid cClientHandle::HandlePlayerLook(float a_Rotation, float a_Pitch, bool a_IsOnGround)\n{\n\tm_Player->SetYaw        (a_Rotation);\n\tm_Player->SetHeadYaw    (a_Rotation);\n\tm_Player->SetPitch      (a_Pitch);\n\tm_Player->SetTouchGround(a_IsOnGround);\n}\n\n\n\n\n\nvoid cClientHandle::HandlePlayerMove(Vector3d a_Pos, bool a_IsOnGround)\n{\n\tconst Vector3d OldPosition = GetPlayer()->GetPosition();\n\tconst auto PreviousIsOnGround = GetPlayer()->IsOnGround();\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wfloat-equal\"\n#endif\n\n\tif (\n\t\t(OldPosition == a_Pos) &&\n\t\t(PreviousIsOnGround == a_IsOnGround)\n\t)\n\t{\n\t\t// Nothing changed, no need to do anything:\n\t\treturn;\n\t}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n\tif (m_Player->IsFrozen() || (m_Player->GetHealth() <= 0))\n\t{\n\t\t// \"Repair\" if the client tries to move while frozen or dead:\n\t\tSendPlayerMoveLook();\n\t\treturn;\n\t}\n\n\t// If the player has moved too far, \"repair\" them:\n\tif ((OldPosition - a_Pos).SqrLength() > 100 * 100)\n\t{\n\t\tLOGD(\"Too far away (%0.2f), \\\"repairing\\\" the client\", (OldPosition - a_Pos).Length());\n\t\tSendPlayerMoveLook();\n\t\treturn;\n\t}\n\n\tif (cRoot::Get()->GetPluginManager()->CallHookPlayerMoving(*m_Player, OldPosition, a_Pos, PreviousIsOnGround))\n\t{\n\t\tSendPlayerMoveLook();\n\t\treturn;\n\t}\n\n\t// TODO: should do some checks to see if player is not moving through terrain\n\t// TODO: Official server refuses position packets too far away from each other, kicking \"hacked\" clients; we should, too\n\n\tm_Player->SetPosition(a_Pos);\n\tm_Player->SetTouchGround(a_IsOnGround);\n\tm_Player->UpdateMovementStats(a_Pos - OldPosition, PreviousIsOnGround);\n}\n\n\n\n\n\nvoid cClientHandle::HandlePlayerMoveLook(Vector3d a_Pos, float a_Rotation, float a_Pitch, bool a_IsOnGround)\n{\n\tHandlePlayerMove(a_Pos, a_IsOnGround);\n\tHandlePlayerLook(a_Rotation, a_Pitch, a_IsOnGround);\n}\n\n\n\n\n\nvoid cClientHandle::HandleSlotSelected(Int16 a_SlotNum)\n{\n\tm_Player->GetInventory().SetEquippedSlotNum(a_SlotNum);\n\tm_Player->GetWorld()->BroadcastEntityEquipment(*m_Player, 0, m_Player->GetInventory().GetEquippedItem(), this);\n}\n\n\n\n\n\nvoid cClientHandle::HandleSpectate(const cUUID & a_PlayerUUID)\n{\n\tif (!m_Player->IsGameModeSpectator())\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" tried to spectate when not in spectator mode - hacked client?\", m_Username.c_str());\n\t\treturn;\n\t}\n\n\tm_Player->GetWorld()->DoWithPlayerByUUID(a_PlayerUUID, [=](cPlayer & a_ToSpectate)\n\t{\n\t\tm_Player->TeleportToEntity(a_ToSpectate);\n\t\treturn true;\n\t});\n}\n\n\n\n\n\nvoid cClientHandle::HandleSprint(const bool a_IsSprinting)\n{\n\tm_Player->SetSprint(a_IsSprinting);\n}\n\n\n\n\n\nvoid cClientHandle::HandleStartElytraFlight()\n{\n\tm_Player->SetElytraFlight(true);\n}\n\n\n\n\n\nvoid cClientHandle::HandleSteerVehicle(float a_Forward, float a_Sideways)\n{\n\tm_Player->SteerVehicle(a_Forward, a_Sideways);\n}\n\n\n\n\n\nvoid cClientHandle::HandleWindowClose(UInt8 a_WindowID)\n{\n\tm_Player->CloseWindowIfID(static_cast<char>(a_WindowID));\n}\n\n\n\n\n\nvoid cClientHandle::HandleWindowClick(UInt8 a_WindowID, Int16 a_SlotNum, eClickAction a_ClickAction, const cItem & a_HeldItem)\n{\n\tLOGD(\"WindowClick: WinID %d, SlotNum %d, action: %s, Item %s x %d\",\n\t\ta_WindowID, a_SlotNum, ClickActionToString(a_ClickAction),\n\t\tItemToString(a_HeldItem).c_str(), a_HeldItem.m_ItemCount\n\t);\n\n\tcWindow * Window = m_Player->GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tLOGWARNING(\"Player \\\"%s\\\" clicked in a non-existent window. Ignoring\", m_Username.c_str());\n\t\treturn;\n\t}\n\tm_Player->AddKnownItem(a_HeldItem);\n\tWindow->Clicked(*m_Player, a_WindowID, a_SlotNum, a_ClickAction, a_HeldItem);\n}\n\n\n\n\n\nvoid cClientHandle::HandleUpdateSign(\n\tVector3i a_BlockPos,\n\tconst AString & a_Line1, const AString & a_Line2,\n\tconst AString & a_Line3, const AString & a_Line4\n)\n{\n\tif (m_LastPlacedSign.Equals(a_BlockPos))\n\t{\n\t\tm_LastPlacedSign.Set(0, -1, 0);\n\t\tm_Player->GetWorld()->SetSignLines(a_BlockPos, a_Line1, a_Line2, a_Line3, a_Line4, m_Player);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::HandleUseEntity(UInt32 a_TargetEntityID, bool a_IsLeftClick)\n{\n\t// TODO: Let plugins interfere via a hook\n\n\t// If the player is a spectator, let him spectate\n\tif (m_Player->IsGameModeSpectator() && a_IsLeftClick)\n\t{\n\t\tm_Player->GetWorld()->DoWithEntityByID(a_TargetEntityID, [=](cEntity & a_Entity)\n\t\t{\n\t\t\tm_Player->SpectateEntity(&a_Entity);\n\t\t\treturn true;\n\t\t});\n\t\treturn;\n\t}\n\n\t// If it is a right click, call the entity's OnRightClicked() handler:\n\tif (!a_IsLeftClick)\n\t{\n\t\tcWorld * World = m_Player->GetWorld();\n\t\tWorld->DoWithEntityByID(a_TargetEntityID, [=](cEntity & a_Entity)\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\tcPluginManager::Get()->CallHookPlayerRightClickingEntity(*m_Player, a_Entity) ||\n\t\t\t\t\t(\n\t\t\t\t\t\tm_Player->IsGameModeSpectator() &&  // Spectators cannot interact with every entity\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t!a_Entity.IsMinecart() ||  // They can only interact with minecarts\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t(static_cast<cMinecart &>(a_Entity).GetPayload() != cMinecart::mpChest) &&  // And only if the type matches a minecart with a chest or\n\t\t\t\t\t\t\t\t(static_cast<cMinecart &>(a_Entity).GetPayload() != cMinecart::mpHopper)    // a minecart with a hopper\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ta_Entity.OnRightClicked(*m_Player);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t);\n\t\treturn;\n\t}\n\n\t// If it is a left click, attack the entity:\n\tm_Player->GetWorld()->DoWithEntityByID(a_TargetEntityID, [=](cEntity & a_Entity)\n\t\t{\n\t\t\tif (!a_Entity.GetWorld()->IsPVPEnabled())\n\t\t\t{\n\t\t\t\t// PVP is disabled, disallow players hurting other players:\n\t\t\t\tif (a_Entity.IsPlayer())\n\t\t\t\t{\n\t\t\t\t\t// Player is hurting another player which is not allowed when PVP is disabled so ignore it\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\ta_Entity.TakeDamage(*m_Player);\n\t\t\tm_Player->AddFoodExhaustion(0.3);\n\t\t\tif (a_Entity.IsPawn())\n\t\t\t{\n\t\t\t\tm_Player->NotifyNearbyWolves(static_cast<cPawn*>(&a_Entity), true);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cClientHandle::HandleUseItem(bool a_UsedMainHand)\n{\n\t// Use the held item without targeting a block: eating, drinking, charging a bow, using buckets\n\t// In version 1.8.x, this function shares the same packet id with HandleRightClick.\n\t// In version >= 1.9, there is a new packet id for \"Use Item\".\n\n\t// TODO: We are still consuming the items in main hand. Remove this override when the off-hand consumption is handled correctly.\n\ta_UsedMainHand = true;\n\tconst cItem & HeldItem = a_UsedMainHand ? m_Player->GetEquippedItem() : m_Player->GetInventory().GetShieldSlot();\n\tauto & ItemHandler = HeldItem.GetHandler();\n\tcWorld * World = m_Player->GetWorld();\n\tcPluginManager * PlgMgr = cRoot::Get()->GetPluginManager();\n\n\tLOGD(\"HandleUseItem: Hand: %d; HeldItem: %s\", a_UsedMainHand, ItemToFullString(HeldItem).c_str());\n\n\tconstexpr Vector3i DefaultBlockPos(-1, 255, -1);\n\tconstexpr Vector3i DefaultCursorPos(0, 0, 0);\n\n\tif (PlgMgr->CallHookPlayerRightClick(*m_Player, DefaultBlockPos, BLOCK_FACE_NONE, DefaultCursorPos))\n\t{\n\t\treturn;  // Plugin denied click action\n\t}\n\n\t// Use item in main / off hand\n\t// TODO: do we need to sync the current inventory with client if it fails?\n\tif (m_Player->IsFrozen() || m_Player->IsGameModeSpectator())\n\t{\n\t\treturn;\n\t}\n\n\tif (ItemHandler.IsFood() || ItemHandler.IsDrinkable(HeldItem.m_ItemDamage))\n\t{\n\t\tif (\n\t\t\tItemHandler.IsFood() &&\n\t\t\t(m_Player->IsSatiated() || m_Player->IsGameModeCreative()) &&  // Only non-creative or hungry players can eat\n\t\t\t(HeldItem.m_ItemType != E_ITEM_GOLDEN_APPLE) &&  // Golden apple is a special case, it is used instead of eaten\n\t\t\t(HeldItem.m_ItemType != E_ITEM_CHORUS_FRUIT)     // Chorus fruit is a special case, it is used instead of eaten\n\t\t)\n\t\t{\n\t\t\t// The player is satiated or in creative, and trying to eat\n\t\t\treturn;\n\t\t}\n\t\tif (!PlgMgr->CallHookPlayerEating(*m_Player))\n\t\t{\n\t\t\tm_Player->StartEating();\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Use an item in hand without a target block\n\t\tif (!PlgMgr->CallHookPlayerUsingItem(*m_Player, DefaultBlockPos, BLOCK_FACE_NONE, DefaultCursorPos))\n\t\t{\n\t\t\t// All plugins agree with using the item\n\t\t\tcBlockInServerPluginInterface PluginInterface(*World);\n\t\t\tItemHandler.OnItemUse(World, m_Player, PluginInterface, HeldItem, DefaultBlockPos, BLOCK_FACE_NONE);\n\t\t\tPlgMgr->CallHookPlayerUsedItem(*m_Player, DefaultBlockPos, BLOCK_FACE_NONE, DefaultCursorPos);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::HandleResourcePack(UInt8 a_Status)\n{\n\t// Kick player if client declined the resource pack\n\tif ((a_Status == 1) && cRoot::Get()->GetServer()->ShouldRequireResourcePack())\n\t{\n\t\tKick(\"You must accept the resource pack\");\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::HandleRespawn(void)\n{\n\tif (m_Player->GetHealth() > 0)\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" tried to respawn while alive - hacked client?\", m_Username.c_str());\n\t\treturn;\n\t}\n\n\tm_Player->Respawn();\n\tcRoot::Get()->GetPluginManager()->CallHookPlayerSpawned(*m_Player);\n}\n\n\n\n\n\nvoid cClientHandle::HandleKeepAlive(UInt32 a_KeepAliveID)\n{\n\tif (a_KeepAliveID == m_PingID)\n\t{\n\t\tm_Ping = std::chrono::steady_clock::now() - m_PingStartTime;\n\t}\n}\n\n\n\n\n\nbool cClientHandle::CheckMultiLogin(const AString & a_Username)\n{\n\t// If the multilogin is allowed, skip this check entirely:\n\tif ((cRoot::Get()->GetServer()->DoesAllowMultiLogin()))\n\t{\n\t\treturn true;\n\t}\n\n\t// Check if the player is waiting to be transferred to the World.\n\tif (cRoot::Get()->GetServer()->IsPlayerInQueue(a_Username))\n\t{\n\t\tKick(\"A player of the username is already logged in\");\n\t\treturn false;\n\t}\n\n\t// Check if the player is in any World.\n\tif (cRoot::Get()->DoWithPlayer(a_Username, [](cPlayer &) { return true; }))\n\t{\n\t\tKick(\"A player of the username is already logged in\");\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cClientHandle::HandleHandshake(const AString & a_Username)\n{\n\tif (a_Username.length() > 16)\n\t{\n\t\tKick(\"Your username is too long (>16 characters)\");\n\t\treturn false;\n\t}\n\n\tif (cRoot::Get()->GetPluginManager()->CallHookHandshake(*this, a_Username))\n\t{\n\t\tKick(\"Entry denied by plugin\");\n\t\treturn false;\n\t}\n\n\treturn CheckMultiLogin(a_Username);\n}\n\n\n\n\n\nvoid cClientHandle::HandleLeaveBed()\n{\n\tcChunkInterface Interface(m_Player->GetWorld()->GetChunkMap());\n\tcBlockBedHandler::VacateBed(Interface, *m_Player);\n}\n\n\n\n\n\nvoid cClientHandle::HandleUnmount(void)\n{\n\tm_Player->Detach();\n}\n\n\n\n\n\nvoid cClientHandle::HandleTabCompletion(const AString & a_Text)\n{\n\tAStringVector Results;\n\t// Get player name completions.\n\tif (cRoot::Get()->GetServer()->ShouldAllowMultiWorldTabCompletion())\n\t{\n\t\tResults = cRoot::Get()->GetPlayerTabCompletionMultiWorld(a_Text);\n\t}\n\telse\n\t{\n\t\tm_Player->GetWorld()->TabCompleteUserName(a_Text, Results);\n\t}\n\n\t// Get command completions.\n\tcRoot::Get()->GetPluginManager()->TabCompleteCommand(a_Text, Results, m_Player);\n\tif (Results.empty())\n\t{\n\t\treturn;\n\t}\n\n\t// Sort and send results.\n\tstd::sort(Results.begin(), Results.end());\n\tSendTabCompletionResults(Results);\n}\n\n\n\n\n\nvoid cClientHandle::SendData(const ContiguousByteBufferView a_Data)\n{\n\tif (m_HasSentDC)\n\t{\n\t\t// This could crash the client, because they've already unloaded the world etc., and suddenly a wild packet appears (#31)\n\t\treturn;\n\t}\n\n\tcCSLock Lock(m_CSOutgoingData);\n\tm_OutgoingData += a_Data;\n}\n\n\n\n\n\nvoid cClientHandle::RemoveFromWorld(void)\n{\n\t// Remove all associated chunks:\n\t{\n\t\tcCSLock Lock(m_CSChunkLists);\n\t\tm_LoadedChunks.clear();\n\t\tm_ChunksToSend.clear();\n\t\tm_SentChunks.clear();\n\t}\n\n\t// Flush outgoing data:\n\tProcessProtocolOut();\n\n\t// No need to send Unload Chunk packets, the client unloads automatically.\n\n\t// Here, we set last streamed values to bogus ones so everything is resent:\n\tm_LastStreamedChunkX = std::numeric_limits<decltype(m_LastStreamedChunkX)>::max();\n\tm_LastStreamedChunkZ = std::numeric_limits<decltype(m_LastStreamedChunkZ)>::max();\n\n\t// Restart player unloaded chunk checking and freezing:\n\tm_CachedSentChunk = cChunkCoords(std::numeric_limits<decltype(m_CachedSentChunk.m_ChunkX)>::max(), std::numeric_limits<decltype(m_CachedSentChunk.m_ChunkZ)>::max());\n}\n\n\n\n\n\nbool cClientHandle::IsPlayerChunkSent()\n{\n\treturn m_HasSentPlayerChunk;\n}\n\n\n\n\n\nbool cClientHandle::CheckBlockInteractionsRate(void)\n{\n\tASSERT(m_Player != nullptr);\n\tASSERT(m_Player->GetWorld() != nullptr);\n\n\tif (!cRoot::Get()->GetServer()->ShouldLimitPlayerBlockChanges())\n\t{\n\t\treturn true;\n\t}\n\n\treturn (m_NumBlockChangeInteractionsThisTick <= MAX_BLOCK_CHANGE_INTERACTIONS);\n}\n\n\n\n\n\nbool cClientHandle::IsWithinReach(const Vector3i a_Position) const\n{\n\t// Distance from the block's center to the player's eye height.\n\tconst double Distance = (Vector3d(0.5, 0.5, 0.5) + a_Position - m_Player->GetEyePosition()).SqrLength();\n\n\t// _X 2014-11-25: I've maxed at 5.26 with a Survival client and 5.78 with a Creative client in my tests.\n\treturn Distance <= (m_Player->IsGameModeCreative() ? 33.4084 : 27.6676);\n}\n\n\n\n\n\nvoid cClientHandle::Tick(std::chrono::milliseconds a_Dt)\n{\n\tusing namespace std::chrono_literals;\n\n\tif (IsDestroyed())\n\t{\n\t\treturn;\n\t}\n\n\tm_TicksSinceLastPacket += 1;\n\tif (m_TicksSinceLastPacket > 600)  // 30 seconds time-out\n\t{\n\t\tSendDisconnect(\"Nooooo!! You timed out! D: Come back!\");\n\t\treturn;\n\t}\n\n\t// Freeze the player if they are standing in a chunk not yet sent to the client\n\tm_HasSentPlayerChunk = false;\n\tif (m_Player->GetParentChunk() != nullptr)\n\t{\n\t\t// If the chunk is invalid, it has definitely not been sent to the client yet\n\t\tif (m_Player->GetParentChunk()->IsValid())\n\t\t{\n\t\t\t// Before iterating m_SentChunks, see if the player's coords equal m_CachedSentChunk\n\t\t\t// If so, the chunk has been sent to the client. This is an optimization that saves an iteration of m_SentChunks.\n\t\t\tif (cChunkCoords(m_Player->GetChunkX(), m_Player->GetChunkZ()) == m_CachedSentChunk)\n\t\t\t{\n\t\t\t\tm_HasSentPlayerChunk = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// This block is entered only when the player moves to a new chunk, invalidating the cached coords.\n\t\t\t\t// Otherwise the cached coords are used.\n\t\t\t\tcCSLock Lock(m_CSChunkLists);\n\t\t\t\tauto itr = std::find(m_SentChunks.begin(), m_SentChunks.end(), cChunkCoords(m_Player->GetChunkX(), m_Player->GetChunkZ()));\n\t\t\t\tif (itr != m_SentChunks.end())\n\t\t\t\t{\n\t\t\t\t\tm_CachedSentChunk = *itr;\n\t\t\t\t\tm_HasSentPlayerChunk = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// If the chunk the player's in was just sent, spawn the player:\n\t{\n\t\tcCSLock lock(m_CSState);\n\t\tif (m_HasSentPlayerChunk && (m_State == csDownloadingWorld))\n\t\t{\n\t\t\tm_Protocol->SendPlayerMoveLook();\n\t\t\tm_State = csPlaying;\n\n\t\t\t// Send resource pack (after a MoveLook, because sending it before the initial MoveLook cancels the download screen):\n\t\t\tif (const auto & ResourcePackUrl = cRoot::Get()->GetServer()->GetResourcePackUrl(); !ResourcePackUrl.empty())\n\t\t\t{\n\t\t\t\tSendResourcePack(ResourcePackUrl);\n\t\t\t}\n\t\t}\n\t}  // lock(m_CSState)\n\n\t// Send a ping packet:\n\tif (m_State == csPlaying)\n\t{\n\t\tconst auto Now = std::chrono::steady_clock::now();\n\t\tif ((m_PingStartTime + std::chrono::seconds(2)) <= Now)  // 2 second interval between pings\n\t\t{\n\t\t\tm_PingID++;\n\t\t\tm_PingStartTime = Now;\n\t\t\tm_Protocol->SendKeepAlive(m_PingID);\n\t\t}\n\t}\n\n\t// Send a couple of chunks to the player:\n\tStreamNextChunks();\n\n\t// Unload all chunks that are out of the view distance (every 5 seconds):\n\tif ((m_TimeSinceLastUnloadCheck += a_Dt) > 5s)\n\t{\n\t\tUnloadOutOfRangeChunks();\n\t\tm_TimeSinceLastUnloadCheck = 0s;\n\t}\n\n\t// anticheat fastbreak\n\tif (m_HasStartedDigging)\n\t{\n\t\tBLOCKTYPE Block = m_Player->GetWorld()->GetBlock(m_LastDigBlockPos);\n\t\tm_BreakProgress += m_Player->GetMiningProgressPerTick(Block);\n\t}\n\n\t// Handle block break animation:\n\tif (m_BlockDigAnimStage > -1)\n\t{\n\t\tint lastAnimVal = m_BlockDigAnimStage;\n\t\tm_BlockDigAnimStage += static_cast<int>(m_BlockDigAnimSpeed * a_Dt.count());\n\t\tif (m_BlockDigAnimStage > 9000)\n\t\t{\n\t\t\tm_BlockDigAnimStage = 9000;\n\t\t}\n\t\tif (m_BlockDigAnimStage / 1000 != lastAnimVal / 1000)\n\t\t{\n\t\t\tm_Player->GetWorld()->BroadcastBlockBreakAnimation(static_cast<UInt32>(m_UniqueID), m_BlockDigAnimPos, static_cast<char>(m_BlockDigAnimStage / 1000), this);\n\t\t}\n\t}\n\n\t// Reset explosion & block change counters:\n\tm_NumExplosionsThisTick = 0;\n\tm_NumBlockChangeInteractionsThisTick = 0;\n}\n\n\n\n\n\nvoid cClientHandle::ServerTick(float a_Dt)\n{\n\tProcessProtocolIn();\n\tProcessProtocolOut();\n\n\tm_TicksSinceLastPacket += 1;\n\tif (m_TicksSinceLastPacket > 600)  // 30 seconds\n\t{\n\t\tSendDisconnect(\"Nooooo!! You timed out! D: Come back!\");\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::SendAttachEntity(const cEntity & a_Entity, const cEntity & a_Vehicle)\n{\n\tm_Protocol->SendAttachEntity(a_Entity, a_Vehicle);\n}\n\n\n\n\n\nvoid cClientHandle::SendLeashEntity(const cEntity & a_Entity, const cEntity & a_EntityLeashedTo)\n{\n\tm_Protocol->SendLeashEntity(a_Entity, a_EntityLeashedTo);\n}\n\n\n\n\n\nvoid cClientHandle::SendUnleashEntity(const cEntity & a_Entity)\n{\n\tm_Protocol->SendUnleashEntity(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendBlockAction(Vector3i a_BlockPos, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType)\n{\n\tm_Protocol->SendBlockAction(a_BlockPos, a_Byte1, a_Byte2, a_BlockType);\n}\n\n\n\n\n\nvoid cClientHandle::SendBlockBreakAnim(UInt32 a_EntityID, Vector3i a_BlockPos, char a_Stage)\n{\n\tm_Protocol->SendBlockBreakAnim(a_EntityID, a_BlockPos, a_Stage);\n}\n\n\n\n\n\nvoid cClientHandle::SendBlockChange(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tauto ChunkCoords = cChunkDef::BlockToChunk(a_BlockPos);\n\n\t// Do not send block changes in chunks that weren't sent to the client yet:\n\tcCSLock Lock(m_CSChunkLists);\n\tif (std::find(m_SentChunks.begin(), m_SentChunks.end(), ChunkCoords) != m_SentChunks.end())\n\t{\n\t\tLock.Unlock();\n\t\tm_Protocol->SendBlockChange(a_BlockPos, a_BlockType, a_BlockMeta);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes)\n{\n\tASSERT(!a_Changes.empty());  // We don't want to be sending empty change packets!\n\n\t// Do not send block changes in chunks that weren't sent to the client yet:\n\t{\n\t\tcCSLock Lock(m_CSChunkLists);\n\t\tif (std::find(m_SentChunks.begin(), m_SentChunks.end(), cChunkCoords(a_ChunkX, a_ChunkZ)) == m_SentChunks.end())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Use a dedicated packet for single changes:\n\tif (a_Changes.size() == 1)\n\t{\n\t\tconst auto & Change = a_Changes[0];\n\t\tm_Protocol->SendBlockChange(Change.GetAbsolutePos(), Change.m_BlockType, Change.m_BlockMeta);\n\t\treturn;\n\t}\n\n\tm_Protocol->SendBlockChanges(a_ChunkX, a_ChunkZ, a_Changes);\n}\n\n\n\n\n\nvoid cClientHandle::SendBossBarAdd(UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog)\n{\n\tm_Protocol->SendBossBarAdd(a_UniqueID, a_Title, a_FractionFilled, a_Color, a_DivisionType, a_DarkenSky, a_PlayEndMusic, a_CreateFog);\n}\n\n\n\n\n\nvoid cClientHandle::SendBossBarUpdateFlags(UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog)\n{\n\tm_Protocol->SendBossBarUpdateFlags(a_UniqueID, a_DarkenSky, a_PlayEndMusic, a_CreateFog);\n}\n\n\n\n\n\nvoid cClientHandle::SendBossBarUpdateStyle(UInt32 a_UniqueID, BossBarColor a_Color, BossBarDivisionType a_DivisionType)\n{\n\tm_Protocol->SendBossBarUpdateStyle(a_UniqueID, a_Color, a_DivisionType);\n}\n\n\n\n\n\nvoid cClientHandle::SendBossBarUpdateTitle(UInt32 a_UniqueID, const cCompositeChat & a_Title)\n{\n\tm_Protocol->SendBossBarUpdateTitle(a_UniqueID, a_Title);\n}\n\n\n\n\n\nvoid cClientHandle::SendBossBarRemove(UInt32 a_UniqueID)\n{\n\tm_Protocol->SendBossBarRemove(a_UniqueID);\n}\n\n\n\n\n\nvoid cClientHandle::SendBossBarUpdateHealth(UInt32 a_UniqueID, float a_FractionFilled)\n{\n\tm_Protocol->SendBossBarUpdateHealth(a_UniqueID, a_FractionFilled);\n}\n\n\n\n\n\nvoid cClientHandle::SendCameraSetTo(const cEntity & a_Entity)\n{\n\tm_Protocol->SendCameraSetTo(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendChat(const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData)\n{\n\tcWorld * World = GetPlayer()->GetWorld();\n\tif (World == nullptr)\n\t{\n\t\tWorld = cRoot::Get()->GetWorld(GetPlayer()->GetLoadedWorldName());\n\t\tif (World == nullptr)\n\t\t{\n\t\t\tWorld = cRoot::Get()->GetDefaultWorld();\n\t\t}\n\t}\n\n\tbool ShouldUsePrefixes = World->ShouldUseChatPrefixes();\n\tAString Message = FormatMessageType(ShouldUsePrefixes, a_ChatPrefix, a_AdditionalData);\n\tm_Protocol->SendChat(Message.append(a_Message), ctChatBox, ShouldUsePrefixes);\n}\n\n\n\n\n\nvoid cClientHandle::SendChat(const cCompositeChat & a_Message)\n{\n\tcWorld * World = GetPlayer()->GetWorld();\n\tif (World == nullptr)\n\t{\n\t\tWorld = cRoot::Get()->GetWorld(GetPlayer()->GetLoadedWorldName());\n\t\tif (World == nullptr)\n\t\t{\n\t\t\tWorld = cRoot::Get()->GetDefaultWorld();\n\t\t}\n\t}\n\n\tbool ShouldUsePrefixes = World->ShouldUseChatPrefixes();\n\tm_Protocol->SendChat(a_Message, ctChatBox, ShouldUsePrefixes);\n}\n\n\n\n\n\nvoid cClientHandle::SendChatRaw(const AString & a_MessageRaw, eChatType a_Type)\n{\n\tm_Protocol->SendChatRaw(a_MessageRaw, a_Type);\n}\n\n\n\n\n\nvoid cClientHandle::SendChatAboveActionBar(const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData)\n{\n\tcWorld * World = GetPlayer()->GetWorld();\n\tif (World == nullptr)\n\t{\n\t\tWorld = cRoot::Get()->GetWorld(GetPlayer()->GetLoadedWorldName());\n\t\tif (World == nullptr)\n\t\t{\n\t\t\tWorld = cRoot::Get()->GetDefaultWorld();\n\t\t}\n\t}\n\n\tAString Message = FormatMessageType(World->ShouldUseChatPrefixes(), a_ChatPrefix, a_AdditionalData);\n\tm_Protocol->SendChat(Message.append(a_Message), ctAboveActionBar);\n}\n\n\n\n\n\nvoid cClientHandle::SendChatAboveActionBar(const cCompositeChat & a_Message)\n{\n\tm_Protocol->SendChat(a_Message, ctAboveActionBar, GetPlayer()->GetWorld()->ShouldUseChatPrefixes());\n}\n\n\n\n\n\nvoid cClientHandle::SendChatSystem(const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData)\n{\n\tcWorld * World = GetPlayer()->GetWorld();\n\tif (World == nullptr)\n\t{\n\t\tWorld = cRoot::Get()->GetWorld(GetPlayer()->GetLoadedWorldName());\n\t\tif (World == nullptr)\n\t\t{\n\t\t\tWorld = cRoot::Get()->GetDefaultWorld();\n\t\t}\n\t}\n\n\tauto ShouldUsePrefixes = World->ShouldUseChatPrefixes();\n\tAString Message = FormatMessageType(ShouldUsePrefixes, a_ChatPrefix, a_AdditionalData);\n\tm_Protocol->SendChat(Message.append(a_Message), ctSystem, ShouldUsePrefixes);\n}\n\n\n\n\n\nvoid cClientHandle::SendChatSystem(const cCompositeChat & a_Message)\n{\n\tm_Protocol->SendChat(a_Message, ctSystem, GetPlayer()->GetWorld()->ShouldUseChatPrefixes());\n}\n\n\n\n\n\nvoid cClientHandle::SendChunkData(int a_ChunkX, int a_ChunkZ, const ContiguousByteBufferView a_ChunkData)\n{\n\tASSERT(m_Player != nullptr);\n\n\t// Check chunks being sent, erase them from m_ChunksToSend:\n\tbool Found = false;\n\t{\n\t\tcCSLock Lock(m_CSChunkLists);\n\t\tauto itr = m_ChunksToSend.find(cChunkCoords{a_ChunkX, a_ChunkZ});\n\t\tif (itr != m_ChunksToSend.end())\n\t\t{\n\t\t\tm_ChunksToSend.erase(itr);\n\t\t\tFound = true;\n\t\t}\n\t}\n\tif (!Found)\n\t{\n\t\t// This just sometimes happens. If you have a reliably replicatable situation for this, go ahead and fix it\n\t\t// It's not a big issue anyway, just means that some chunks may be compressed several times\n\t\t// LOG(\"Refusing to send    chunk [%d, %d] to client \\\"%s\\\" at [%d, %d].\", a_ChunkX, a_ChunkZ, m_Username.c_str(), m_Player->GetChunkX(), m_Player->GetChunkZ());\n\t\t// 2020 08 21: seems to happen going through nether portals on 1.8.9\n\t\treturn;\n\t}\n\n\tif (!m_Protocol.VersionRecognitionSuccessful())\n\t{\n\t\t// TODO (#2588): investigate if and why this occurs\n\t\treturn;\n\t}\n\n\tm_Protocol->SendChunkData(a_ChunkData);\n\n\t// Add the chunk to the list of chunks sent to the player:\n\t{\n\t\tcCSLock Lock(m_CSChunkLists);\n\t\tm_SentChunks.emplace_back(a_ChunkX, a_ChunkZ);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::SendCollectEntity(const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count)\n{\n\tm_Protocol->SendCollectEntity(a_Collected, a_Collector, a_Count);\n}\n\n\n\n\n\nvoid cClientHandle::SendDestroyEntity(const cEntity & a_Entity)\n{\n\tm_Protocol->SendDestroyEntity(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendDetachEntity(const cEntity & a_Entity, const cEntity & a_PreviousVehicle)\n{\n\tm_Protocol->SendDetachEntity(a_Entity, a_PreviousVehicle);\n}\n\n\n\n\n\nvoid cClientHandle::SendDisconnect(const AString & a_Reason)\n{\n\tLOGD(\"Sending a DC: \\\"%s\\\"\", StripColorCodes(a_Reason).c_str());\n\n\tm_Protocol.SendDisconnect(*this, a_Reason);\n\tm_HasSentDC = true;\n\tDestroy();\n}\n\n\n\n\n\nvoid cClientHandle::SendEditSign(Vector3i a_BlockPos)\n{\n\tm_LastPlacedSign = a_BlockPos;\n\tm_Protocol->SendEditSign(a_BlockPos);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityEffect(const cEntity & a_Entity, int a_EffectID, int a_Amplifier, int a_Duration)\n{\n\tm_Protocol->SendEntityEffect(a_Entity, a_EffectID, a_Amplifier, a_Duration);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityEquipment(const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item)\n{\n\tm_Protocol->SendEntityEquipment(a_Entity, a_SlotNum, a_Item);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityHeadLook(const cEntity & a_Entity)\n{\n\tASSERT(a_Entity.GetUniqueID() != m_Player->GetUniqueID());  // Must not send for self\n\n\tm_Protocol->SendEntityHeadLook(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityLook(const cEntity & a_Entity)\n{\n\tASSERT(a_Entity.GetUniqueID() != m_Player->GetUniqueID());  // Must not send for self\n\n\tm_Protocol->SendEntityLook(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityMetadata(const cEntity & a_Entity)\n{\n\tm_Protocol->SendEntityMetadata(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityPosition(const cEntity & a_Entity)\n{\n\tm_Protocol->SendEntityPosition(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityProperties(const cEntity & a_Entity)\n{\n\tm_Protocol->SendEntityProperties(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityVelocity(const cEntity & a_Entity)\n{\n\tm_Protocol->SendEntityVelocity(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendExplosion(const Vector3f a_Position, const float a_Power)\n{\n\tif (m_NumExplosionsThisTick > MAX_EXPLOSIONS_PER_TICK)\n\t{\n\t\tLOGD(\"Dropped an explosion!\");\n\t\treturn;\n\t}\n\n\t// Update the statistics:\n\tm_NumExplosionsThisTick++;\n\n\tauto & Random = GetRandomProvider();\n\tconst auto SoundPitchMultiplier = 1.0f + (Random.RandReal() - Random.RandReal()) * 0.2f;\n\n\t// Sound:\n\tSendSoundEffect(\"entity.generic.explode\", a_Position, 4.0f, SoundPitchMultiplier * 0.7f);\n\n\tconst auto ParticleFormula = a_Power * 0.33f;\n\tauto Spread = ParticleFormula * 0.5f;\n\tauto ParticleCount = std::min(static_cast<int>(ParticleFormula * 125), 600);\n\n\t// Dark smoke particles:\n\tSendParticleEffect(\"largesmoke\", a_Position, {0.f, 0.f, 0.f}, Spread, static_cast<int>(ParticleCount));\n\n\tSpread = ParticleFormula * 0.35f;\n\tParticleCount = std::min(static_cast<int>(ParticleFormula * 550), 1800);\n\n\t// Light smoke particles:\n\tSendParticleEffect(\"explode\", a_Position, {0.f, 0.f, 0.f}, Spread, static_cast<int>(ParticleCount));\n\n\t// Shockwave effect:\n\tm_Protocol->SendExplosion(a_Position, a_Power);\n}\n\n\n\n\n\nvoid cClientHandle::SendGameMode(eGameMode a_GameMode)\n{\n\tm_Protocol->SendGameMode(a_GameMode);\n}\n\n\n\n\n\nvoid cClientHandle::SendHealth(void)\n{\n\tm_Protocol->SendHealth();\n}\n\n\n\n\n\nvoid cClientHandle::SendHeldItemChange(int a_ItemIndex)\n{\n\tm_Protocol->SendHeldItemChange(a_ItemIndex);\n}\n\n\n\n\n\nvoid cClientHandle::SendHideTitle(void)\n{\n\tm_Protocol->SendHideTitle();\n}\n\n\n\n\n\nvoid cClientHandle::SendInventorySlot(char a_WindowID, short a_SlotNum, const cItem & a_Item)\n{\n\tm_Protocol->SendInventorySlot(a_WindowID, a_SlotNum, a_Item);\n}\n\n\n\n\n\nvoid cClientHandle::SendMapData(const cMap & a_Map, int a_DataStartX, int a_DataStartY)\n{\n\tm_Protocol->SendMapData(a_Map, a_DataStartX, a_DataStartY);\n}\n\n\n\n\n\nvoid cClientHandle::SendParticleEffect(const AString & a_ParticleName, Vector3f a_Source, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount)\n{\n\tm_Protocol->SendParticleEffect(a_ParticleName, a_Source, a_Offset, a_ParticleData, a_ParticleAmount);\n}\n\n\n\n\n\nvoid cClientHandle::SendParticleEffect(const AString & a_ParticleName, const Vector3f a_Src, const Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data)\n{\n\tm_Protocol->SendParticleEffect(a_ParticleName, a_Src, a_Offset, a_ParticleData, a_ParticleAmount, a_Data);\n}\n\n\n\n\n\nvoid cClientHandle::SendPaintingSpawn(const cPainting & a_Painting)\n{\n\tm_Protocol->SendPaintingSpawn(a_Painting);\n}\n\n\n\n\n\nvoid cClientHandle::SendEntityAnimation(const cEntity & a_Entity, EntityAnimation a_Animation)\n{\n\tm_Protocol->SendEntityAnimation(a_Entity, a_Animation);\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerAbilities()\n{\n\tm_Protocol->SendPlayerAbilities();\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerListAddPlayer(const cPlayer & a_Player)\n{\n\tm_Protocol->SendPlayerListAddPlayer(a_Player);\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerListHeaderFooter(const cCompositeChat & a_Header, const cCompositeChat & a_Footer)\n{\n\tm_Protocol->SendPlayerListHeaderFooter(a_Header, a_Footer);\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerListRemovePlayer(const cPlayer & a_Player)\n{\n\tm_Protocol->SendPlayerListRemovePlayer(a_Player);\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_CustomName)\n{\n\tm_Protocol->SendPlayerListUpdateDisplayName(a_Player, a_CustomName);\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerListUpdateGameMode(const cPlayer & a_Player)\n{\n\tm_Protocol->SendPlayerListUpdateGameMode(a_Player);\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerListUpdatePing()\n{\n\tm_Protocol->SendPlayerListUpdatePing();\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerMoveLook (const Vector3d a_Pos, const float a_Yaw, const float a_Pitch, const bool a_IsRelative)\n{\n\tm_Protocol->SendPlayerMoveLook(a_Pos, a_Yaw, a_Pitch, a_IsRelative);\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerMoveLook(void)\n{\n\t/*\n\tFLOGD(\"Sending PlayerMoveLook: {0:0.2f}, stance {1:0.2f}, OnGround: {2}\",\n\t\tm_Player->GetPosition(), m_Player->GetStance(), m_Player->IsOnGround()\n\t);\n\t*/\n\tm_Protocol->SendPlayerMoveLook();\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerPermissionLevel()\n{\n\tm_Protocol->SendPlayerPermissionLevel();\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerPosition(void)\n{\n\tm_Protocol->SendPlayerPosition();\n}\n\n\n\n\n\nvoid cClientHandle::SendPlayerSpawn(const cPlayer & a_Player)\n{\n\tif (a_Player.GetUniqueID() == m_Player->GetUniqueID())\n\t{\n\t\t// Do NOT send this packet to myself\n\t\treturn;\n\t}\n\n\tLOGD(\"Spawning player \\\"%s\\\" on client \\\"%s\\\" @ %s\",\n\t\ta_Player.GetName().c_str(), GetPlayer()->GetName().c_str(), GetIPString().c_str()\n\t);\n\n\tm_Protocol->SendPlayerSpawn(a_Player);\n}\n\n\n\n\n\nvoid cClientHandle::SendPluginMessage(const AString & a_Channel, const std::string_view a_Message)\n{\n\tm_Protocol->SendPluginMessage(a_Channel, { reinterpret_cast<const std::byte *>(a_Message.data()), a_Message.size() });\n}\n\n\n\n\n\nvoid cClientHandle::SendPluginMessage(const AString & a_Channel, const ContiguousByteBufferView a_Message)\n{\n\tm_Protocol->SendPluginMessage(a_Channel, a_Message);\n}\n\n\n\n\n\nvoid cClientHandle::SendRemoveEntityEffect(const cEntity & a_Entity, int a_EffectID)\n{\n\tm_Protocol->SendRemoveEntityEffect(a_Entity, a_EffectID);\n}\n\n\n\n\n\nvoid cClientHandle::SendResetTitle()\n{\n\tm_Protocol->SendResetTitle();\n}\n\n\n\n\n\nvoid cClientHandle::SendRespawn(const eDimension a_Dimension, const bool a_IsRespawningFromDeath)\n{\n\tif (!a_IsRespawningFromDeath && (a_Dimension == m_Player->GetWorld()->GetDimension()))\n\t{\n\t\t// The client goes crazy if we send a respawn packet with the dimension of the current world\n\t\t// So we send a temporary one first.\n\t\t// This is not needed when the player dies, hence the a_IsRespawningFromDeath flag.\n\t\t// a_IsRespawningFromDeath is true only at cPlayer::Respawn, which is called after the player dies.\n\n\t\t// First send a temporary dimension to placate the client:\n\t\tm_Protocol->SendRespawn((a_Dimension == dimOverworld) ? dimNether : dimOverworld);\n\t}\n\n\tm_Protocol->SendRespawn(a_Dimension);\n}\n\n\n\n\n\nvoid cClientHandle::SendExperience(void)\n{\n\tm_Protocol->SendExperience();\n}\n\n\n\n\n\nvoid cClientHandle::SendExperienceOrb(const cExpOrb & a_ExpOrb)\n{\n\tm_Protocol->SendExperienceOrb(a_ExpOrb);\n}\n\n\n\n\n\nvoid cClientHandle::SendResourcePack(const AString & a_ResourcePackUrl)\n{\n\tm_Protocol->SendResourcePack(a_ResourcePackUrl);\n}\n\n\n\n\n\nvoid cClientHandle::SendScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode)\n{\n\tm_Protocol->SendScoreboardObjective(a_Name, a_DisplayName, a_Mode);\n}\n\n\n\n\n\nvoid cClientHandle::SendScoreUpdate(const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode)\n{\n\tm_Protocol->SendScoreUpdate(a_Objective, a_Player, a_Score, a_Mode);\n}\n\n\n\n\n\nvoid cClientHandle::SendDisplayObjective(const AString & a_Objective, cScoreboard::eDisplaySlot a_Display)\n{\n\tm_Protocol->SendDisplayObjective(a_Objective, a_Display);\n}\n\n\n\n\n\nvoid cClientHandle::SendSetSubTitle(const cCompositeChat & a_SubTitle)\n{\n\tm_Protocol->SendSetSubTitle(a_SubTitle);\n}\n\n\n\n\n\nvoid cClientHandle::SendSetRawSubTitle(const AString & a_SubTitle)\n{\n\tm_Protocol->SendSetRawSubTitle(a_SubTitle);\n}\n\n\n\n\n\nvoid cClientHandle::SendSetTitle(const cCompositeChat & a_Title)\n{\n\tm_Protocol->SendSetTitle(a_Title);\n}\n\n\n\n\n\nvoid cClientHandle::SendSetRawTitle(const AString & a_Title)\n{\n\tm_Protocol->SendSetRawTitle(a_Title);\n}\n\n\n\n\n\nvoid cClientHandle::SendSoundEffect(const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch)\n{\n\tLOG(\"SendSoundEffect with double args is deprecated, use version with vector position parameter.\");\n\tSendSoundEffect(a_SoundName, {a_X, a_Y, a_Z}, a_Volume, a_Pitch);\n}\n\n\n\n\n\nvoid cClientHandle::SendSoundEffect(const AString & a_SoundName, Vector3d a_Position, float a_Volume, float a_Pitch)\n{\n\tm_Protocol->SendSoundEffect(a_SoundName, a_Position, a_Volume, a_Pitch);\n}\n\n\n\n\n\nvoid cClientHandle::SendSoundParticleEffect(const EffectID a_EffectID, Vector3i a_Source, int a_Data)\n{\n\tm_Protocol->SendSoundParticleEffect(a_EffectID, a_Source, a_Data);\n}\n\n\n\n\n\nvoid cClientHandle::SendSpawnEntity(const cEntity & a_Entity)\n{\n\tm_Protocol->SendSpawnEntity(a_Entity);\n}\n\n\n\n\n\nvoid cClientHandle::SendSpawnMob(const cMonster & a_Mob)\n{\n\tm_Protocol->SendSpawnMob(a_Mob);\n}\n\n\n\n\n\nvoid cClientHandle::SendStatistics(const StatisticsManager & a_Manager)\n{\n\tm_Protocol->SendStatistics(a_Manager);\n}\n\n\n\n\n\nvoid cClientHandle::SendTabCompletionResults(const AStringVector & a_Results)\n{\n\tm_Protocol->SendTabCompletionResults(a_Results);\n}\n\n\n\n\n\nvoid cClientHandle::SendThunderbolt(Vector3i a_BlockPos)\n{\n\tm_Protocol->SendThunderbolt(a_BlockPos);\n}\n\n\n\n\n\nvoid cClientHandle::SendTitleTimes(int a_FadeInTicks, int a_DisplayTicks, int a_FadeOutTicks)\n{\n\tm_Protocol->SendTitleTimes(a_FadeInTicks, a_DisplayTicks, a_FadeOutTicks);\n}\n\n\n\n\n\nvoid cClientHandle::SendTimeUpdate(const cTickTimeLong a_WorldAge, const cTickTimeLong a_WorldDate, const bool a_DoDaylightCycle)\n{\n\tm_Protocol->SendTimeUpdate(a_WorldAge, a_WorldDate, a_DoDaylightCycle);\n}\n\n\n\n\n\nvoid cClientHandle::SendUnloadChunk(int a_ChunkX, int a_ChunkZ)\n{\n\t// Remove the chunk from the list of chunks sent to the client:\n\t{\n\t\tcCSLock Lock(m_CSChunkLists);\n\t\tm_SentChunks.remove(cChunkCoords(a_ChunkX, a_ChunkZ));\n\t}\n\n\tm_Protocol->SendUnloadChunk(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nvoid cClientHandle::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)\n{\n\tm_Protocol->SendUpdateBlockEntity(a_BlockEntity);\n}\n\n\n\n\n\nvoid cClientHandle::SendUpdateSign(\n\tVector3i a_BlockPos,\n\tconst AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4\n)\n{\n\tm_Protocol->SendUpdateSign(\n\t\ta_BlockPos,\n\t\ta_Line1, a_Line2, a_Line3, a_Line4\n\t);\n}\n\n\n\n\n\nvoid cClientHandle::SendUnlockRecipe(UInt32 a_RecipeId)\n{\n\tm_Protocol->SendUnlockRecipe(a_RecipeId);\n}\n\n\n\n\n\nvoid cClientHandle::SendInitRecipes(UInt32 a_RecipeId)\n{\n\tm_Protocol->SendInitRecipes(a_RecipeId);\n}\n\n\n\n\n\nvoid cClientHandle::HandleCraftRecipe(UInt32 a_RecipeId)\n{\n\tauto * Window = m_Player->GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tif (Window->GetWindowType() == cWindow::wtInventory)\n\t{\n\t\tstatic_cast<cInventoryWindow *>(Window)->LoadRecipe(*m_Player, a_RecipeId);\n\t}\n\telse if (Window->GetWindowType() == cWindow::wtWorkbench)\n\t{\n\t\tstatic_cast<cCraftingWindow *>(Window)->LoadRecipe(*m_Player, a_RecipeId);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::SendWeather(eWeather a_Weather)\n{\n\tm_Protocol->SendWeather(a_Weather);\n}\n\n\n\n\n\nvoid cClientHandle::SendWholeInventory(const cWindow & a_Window)\n{\n\tm_Protocol->SendWholeInventory(a_Window);\n}\n\n\n\n\n\nvoid cClientHandle::SendWindowClose(const cWindow & a_Window)\n{\n\tm_Protocol->SendWindowClose(a_Window);\n}\n\n\n\n\n\nvoid cClientHandle::SendWindowOpen(const cWindow & a_Window)\n{\n\tm_Protocol->SendWindowOpen(a_Window);\n}\n\n\n\n\n\nvoid cClientHandle::SendWindowProperty(const cWindow & a_Window, size_t a_Property, short a_Value)\n{\n\tm_Protocol->SendWindowProperty(a_Window, a_Property, a_Value);\n}\n\n\n\n\n\nconst AString & cClientHandle::GetUsername(void) const\n{\n\treturn m_Username;\n}\n\n\n\n\n\nvoid cClientHandle::SetUsername(AString && a_Username)\n{\n\tm_Username = std::move(a_Username);\n}\n\n\n\n\n\nvoid cClientHandle::SetViewDistance(int a_ViewDistance)\n{\n\tm_RequestedViewDistance = a_ViewDistance;\n\tLOGD(\"%s is requesting ViewDistance of %d!\", GetUsername().c_str(), m_RequestedViewDistance);\n\n\tcWorld * world = m_Player->GetWorld();\n\tif (world != nullptr)\n\t{\n\t\t// Set the current view distance based on the requested VD and world max VD:\n\t\tm_CurrentViewDistance = Clamp(a_ViewDistance, cClientHandle::MIN_VIEW_DISTANCE, world->GetMaxViewDistance());\n\n\t\t// Restart chunk streaming to respond to new view distance:\n\t\tm_LastStreamedChunkX = std::numeric_limits<decltype(m_LastStreamedChunkX)>::max();\n\t\tm_LastStreamedChunkZ = std::numeric_limits<decltype(m_LastStreamedChunkZ)>::max();\n\t}\n}\n\n\n\n\n\nbool cClientHandle::HasPluginChannel(const AString & a_PluginChannel)\n{\n\treturn (m_PluginChannels.find(a_PluginChannel) != m_PluginChannels.end());\n}\n\n\n\n\n\nbool cClientHandle::WantsSendChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tif (m_State >= csDestroyed)\n\t{\n\t\treturn false;\n\t}\n\n\tcCSLock Lock(m_CSChunkLists);\n\treturn m_ChunksToSend.find(cChunkCoords(a_ChunkX, a_ChunkZ)) != m_ChunksToSend.end();\n}\n\n\n\n\n\nvoid cClientHandle::AddWantedChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tif (m_State >= csDestroyed)\n\t{\n\t\treturn;\n\t}\n\n\tLOGD(\"Adding chunk [%d, %d] to wanted chunks for client %p\", a_ChunkX, a_ChunkZ, static_cast<void *>(this));\n\tcCSLock Lock(m_CSChunkLists);\n\tif (m_ChunksToSend.find(cChunkCoords(a_ChunkX, a_ChunkZ)) == m_ChunksToSend.end())\n\t{\n\t\tm_ChunksToSend.emplace(a_ChunkX, a_ChunkZ);\n\t}\n}\n\n\n\n\n\nvoid cClientHandle::PacketBufferFull(void)\n{\n\t// Too much data in the incoming queue, the server is probably too busy, kick the client:\n\tLOGERROR(\"Too much data in queue for client \\\"%s\\\" @ %s, kicking them.\", m_Username, m_IPString);\n\tSendDisconnect(\"The server is busy; please try again later.\");\n}\n\n\n\n\n\nvoid cClientHandle::PacketUnknown(UInt32 a_PacketType)\n{\n\tLOGERROR(\"Unknown packet type 0x%x from client \\\"%s\\\" @ %s\", a_PacketType, m_Username, m_IPString);\n\n\tSendDisconnect(fmt::format(FMT_STRING(\"Unknown [C->S] PacketType: 0x{:x}\"), a_PacketType));\n}\n\n\n\n\n\nvoid cClientHandle::PacketError(UInt32 a_PacketType)\n{\n\tLOGERROR(\"Protocol error while parsing packet type 0x%02x; disconnecting client \\\"%s\\\"\", a_PacketType, m_Username);\n\tSendDisconnect(\"Protocol error\");\n}\n\n\n\n\n\nvoid cClientHandle::SocketClosed(void)\n{\n\t// The socket has been closed for any reason\n\t/*\n\tLOGD(\"SocketClosed for client %s @ %s (%p), state = %d, m_Player = %p\",\n\t\tm_Username.c_str(), m_IPString.c_str(), static_cast<void *>(this), m_State.load(), static_cast<void *>(m_Player)\n\t);\n\t//*/\n\n\t// Log into console, unless it's a client ping:\n\tif (!m_Username.empty())\n\t{\n\t\tLOGD(\"Client %s @ %s disconnected\", m_Username.c_str(), m_IPString.c_str());\n\t\tcRoot::Get()->GetPluginManager()->CallHookDisconnect(*this, \"Player disconnected\");\n\t}\n\n\t// Queue self for destruction:\n\tDestroy();\n}\n\n\n\n\n\nbool cClientHandle::SetState(eState a_NewState)\n{\n\tcCSLock Lock(m_CSState);\n\tif (a_NewState <= m_State)\n\t{\n\t\treturn false;  // Can only advance the state machine\n\t}\n\tm_State = a_NewState;\n\treturn true;\n}\n\n\n\n\n\nvoid cClientHandle::OnLinkCreated(cTCPLinkPtr a_Link)\n{\n\tm_Link = a_Link;\n}\n\n\n\n\n\nvoid cClientHandle::OnReceivedData(const char * a_Data, size_t a_Length)\n{\n\t// Reset the timeout:\n\tm_TicksSinceLastPacket = 0;\n\n\t// Queue the incoming data to be processed in the tick thread:\n\tcCSLock Lock(m_CSIncomingData);\n\tm_IncomingData.append(reinterpret_cast<const std::byte *>(a_Data), a_Length);\n}\n\n\n\n\n\nvoid cClientHandle::OnRemoteClosed(void)\n{\n\t/*\n\tLOGD(\"Client socket for %s @ %s has been closed.\",\n\t\tm_Username.c_str(), m_IPString.c_str()\n\t);\n\t//*/\n\tSocketClosed();\n}\n\n\n\n\n\nvoid cClientHandle::OnError(int a_ErrorCode, const AString & a_ErrorMsg)\n{\n\tLOGD(\"An error has occurred on client link for %s @ %s: %d (%s). Client disconnected.\",\n\t\tm_Username.c_str(), m_IPString.c_str(), a_ErrorCode, a_ErrorMsg.c_str()\n\t);\n\tSocketClosed();\n}\n"
  },
  {
    "path": "src/ClientHandle.h",
    "content": "\n// cClientHandle.h\n\n// Interfaces to the cClientHandle class representing a client connected to this server. The client need not be a player yet\n\n\n\n\n\n#pragma once\n\n#include \"OSSupport/Network.h\"\n#include \"Defines.h\"\n#include \"Scoreboard.h\"\n#include \"UI/SlotArea.h\"\n#include \"json/json.h\"\n#include \"ChunkSender.h\"\n#include \"EffectID.h\"\n#include \"Protocol/ForgeHandshake.h\"\n#include \"Protocol/ProtocolRecognizer.h\"\n#include \"UUID.h\"\n\n\n\n\n\n// fwd:\nclass cChunkDataSerializer;\nclass cMonster;\nclass cExpOrb;\nclass cPainting;\nclass cPickup;\nclass cPlayer;\nclass cProtocol;\nclass cWindow;\nclass cFallingBlock;\nclass cCompositeChat;\nclass cMap;\nclass cClientHandle;\n\nstruct StatisticsManager;\n\ntypedef std::shared_ptr<cClientHandle> cClientHandlePtr;\n\n\n\n\n\nclass cClientHandle  // tolua_export\n\t: public cTCPLink::cCallbacks, public std::enable_shared_from_this<cClientHandle>\n{  // tolua_export\npublic:  // tolua_export\n\n\t#if defined(ANDROID)\n\t\tstatic const int DEFAULT_VIEW_DISTANCE = 4;  // The default ViewDistance (used when no value is set in Settings.ini)\n\t#else\n\t\tstatic const int DEFAULT_VIEW_DISTANCE = 10;\n\t#endif\n\tstatic const int MAX_VIEW_DISTANCE = 32;\n\tstatic const int MIN_VIEW_DISTANCE = 1;\n\n\t/** The percentage how much a block has to be broken.\n\tShould be a value between 0.7 (70% broken) and 1 (100% broken) depending on lag.\n\tCan be set in settings.ini [AntiCheat] FastBreakPercentage=(from 0 to 100) */\n\tstatic float FASTBREAK_PERCENTAGE;\n\n\t/** Creates a new client with the specified IP address in its description and the specified initial view distance. */\n\tcClientHandle(const AString & a_IPString, int a_ViewDistance);\n\n\tvirtual ~cClientHandle() override;\n\n\tconst AString & GetIPString(void) const { return m_IPString; }  // tolua_export\n\n\t/** Sets the IP string that the client is using. Overrides the IP string that was read from the socket.\n\tUsed mainly by BungeeCord compatibility code. */\n\tvoid SetIPString(const AString & a_IPString) { m_IPString = a_IPString; }\n\n\tcPlayer * GetPlayer(void) { return m_Player; }  // tolua_export\n\n\t/** Returns the player's UUID, as used by the protocol */\n\tconst cUUID & GetUUID(void) const { return m_UUID; }  // Exported in ManualBindings.cpp\n\n\t/** Sets the player's UUID, as used by the protocol.\n\tUsed mainly by BungeeCord compatibility code - when authenticating is done on the BungeeCord server\n\tand the results are passed to MCS running in offline mode. */\n\tvoid SetUUID(const cUUID & a_UUID) { ASSERT(!a_UUID.IsNil()); m_UUID = a_UUID; }\n\n\tconst Json::Value & GetProperties(void) const { return m_Properties; }\n\n\t/** Sets the player's properties, such as skin image and signature.\n\tUsed mainly by BungeeCord compatibility code - property querying is done on the BungeeCord server\n\tand the results are passed to MCS running in offline mode. */\n\tvoid SetProperties(const Json::Value & a_Properties) { m_Properties = a_Properties; }\n\n\t/** Generates an UUID based on the player name provided.\n\tThis is used for the offline (non-auth) mode, when there's no UUID source.\n\tEach username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same. */\n\tstatic cUUID GenerateOfflineUUID(const AString & a_Username);  // Exported in ManualBindings.cpp\n\n\t/** Returns true if the UUID is generated by online auth, false if it is an offline-generated UUID.\n\tWe use Version-3 UUIDs for offline UUIDs, online UUIDs are Version-4, thus we can tell them apart. */\n\tstatic bool IsUUIDOnline(const cUUID & a_UUID);  // Exported in ManualBindings.cpp\n\n\t/** Function to mark bungee / proxy connection on this client, and to add proxy-related data */\n\tvoid ProxyInit(const AString & a_IPString, const cUUID & a_UUID);\n\tvoid ProxyInit(const AString & a_IPString, const cUUID & a_UUID, const Json::Value & a_Properties);\n\n\t/** Processes the data in the network input buffer.\n\tCalled by both cWorld::Tick() and ServerTick(). */\n\tvoid ProcessProtocolIn(void);\n\n\t/** Flushes all buffered outgoing data to the network. */\n\tvoid ProcessProtocolOut();\n\n\t/** Formats the type of message with the proper color and prefix for sending to the client. */\n\tstatic AString FormatMessageType(bool ShouldAppendChatPrefixes, eMessageType a_ChatPrefix, const AString & a_AdditionalData);\n\n\tstatic AString FormatChatPrefix(\n\t\tbool ShouldAppendChatPrefixes, const AString & a_ChatPrefixS,\n\t\tconst AString & m_Color1, const AString & m_Color2\n\t);\n\n\tvoid Kick(const AString & a_Reason);  // tolua_export\n\n\t/** Authenticates the specified user with the bungee proxy server */\n\tbool BungeeAuthenticate();\n\n\t/** Authenticates ourselves, called by cAuthenticator supplying player details from Mojang. */\n\tvoid Authenticate(AString && a_Name, const cUUID & a_UUID, Json::Value && a_Properties);\n\n\t/** Sends a set number of new chunks to the player on every invocation, until all chunks in the view distance have been sent. */\n\tvoid StreamNextChunks();\n\n\t/** Remove all loaded chunks that are no longer in range */\n\tvoid UnloadOutOfRangeChunks(void);\n\n\tinline bool IsLoggedIn(void) const { return (m_State >= csAuthenticating); }\n\n\t/** Called while the client is being ticked from the world via its cPlayer object */\n\tvoid Tick(std::chrono::milliseconds a_Dt);\n\n\t/** Called while the client is being ticked from the cServer object */\n\tvoid ServerTick(float a_Dt);\n\n\tvoid Destroy(void);\n\n\tbool IsPlaying   (void) const { return (m_State == csPlaying); }\n\tbool IsDestroyed (void) const { return (m_State == csDestroyed); }\n\n\t// The following functions send the various packets:\n\t// (Please keep these alpha-sorted)\n\tvoid SendAttachEntity               (const cEntity & a_Entity, const cEntity & a_Vehicle);\n\tvoid SendBlockAction                (Vector3i a_BlockPos, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType);\n\tvoid SendBlockBreakAnim             (UInt32 a_EntityID, Vector3i a_BlockPos, char a_Stage);  // tolua_export\n\tvoid SendBlockChange                (Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);  // tolua_export\n\tvoid SendBlockChanges               (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes);\n\tvoid SendBossBarAdd                 (UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog);  // tolua_export\n\tvoid SendBossBarUpdateFlags         (UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog);  // tolua_export\n\tvoid SendBossBarUpdateStyle         (UInt32 a_UniqueID, BossBarColor a_Color, BossBarDivisionType a_DivisionType);  // tolua_export\n\tvoid SendBossBarUpdateTitle         (UInt32 a_UniqueID, const cCompositeChat & a_Title);  // tolua_export\n\tvoid SendBossBarRemove              (UInt32 a_UniqueID);  // tolua_export\n\tvoid SendBossBarUpdateHealth        (UInt32 a_UniqueID, float a_FractionFilled);  // tolua_export\n\tvoid SendCameraSetTo                (const cEntity & a_Entity);\n\tvoid SendChat                       (const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData = \"\");\n\tvoid SendChat                       (const cCompositeChat & a_Message);\n\tvoid SendChatRaw                    (const AString & a_MessageRaw, eChatType a_Type);\n\tvoid SendChatAboveActionBar         (const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData = \"\");\n\tvoid SendChatAboveActionBar         (const cCompositeChat & a_Message);\n\tvoid SendChatSystem                 (const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData = \"\");\n\tvoid SendChatSystem                 (const cCompositeChat & a_Message);\n\tvoid SendChunkData                  (int a_ChunkX, int a_ChunkZ, ContiguousByteBufferView a_ChunkData);\n\tvoid SendCollectEntity              (const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count);   // tolua_export\n\tvoid SendDestroyEntity              (const cEntity & a_Entity);   // tolua_export\n\tvoid SendDetachEntity               (const cEntity & a_Entity, const cEntity & a_PreviousVehicle);   // tolua_export\n\tvoid SendDisconnect                 (const AString & a_Reason);\n\tvoid SendDisplayObjective           (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display);\n\tvoid SendEditSign                   (Vector3i a_BlockPos);  // tolua_export\n\tvoid SendEntityAnimation            (const cEntity & a_Entity, EntityAnimation a_Animation);  // tolua_export\n\tvoid SendEntityEffect               (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, int a_Duration);\n\tvoid SendEntityEquipment            (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item);\n\tvoid SendEntityHeadLook             (const cEntity & a_Entity);\n\tvoid SendEntityLook                 (const cEntity & a_Entity);\n\tvoid SendEntityMetadata             (const cEntity & a_Entity);\n\tvoid SendEntityPosition             (const cEntity & a_Entity);\n\tvoid SendEntityProperties           (const cEntity & a_Entity);\n\tvoid SendEntityVelocity             (const cEntity & a_Entity);\n\tvoid SendExperience                 (void);\n\tvoid SendExperienceOrb              (const cExpOrb & a_ExpOrb);\n\tvoid SendExplosion                  (Vector3f a_Position, float a_Power);\n\tvoid SendGameMode                   (eGameMode a_GameMode);\n\tvoid SendHealth                     (void);\n\tvoid SendHeldItemChange             (int a_ItemIndex);\n\tvoid SendHideTitle                  (void);   // tolua_export\n\tvoid SendInventorySlot              (char a_WindowID, short a_SlotNum, const cItem & a_Item);\n\tvoid SendLeashEntity                (const cEntity & a_Entity, const cEntity & a_EntityLeashedTo);  // tolua_export\n\tvoid SendMapData                    (const cMap & a_Map, int a_DataStartX, int a_DataStartY);\n\tvoid SendPaintingSpawn              (const cPainting & a_Painting);\n\tvoid SendParticleEffect             (const AString & a_ParticleName, Vector3f a_Source, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount);\n\tvoid SendParticleEffect             (const AString & a_ParticleName, const Vector3f a_Src, const Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data);\n\tvoid SendPlayerAbilities            (void);\n\tvoid SendPlayerListAddPlayer        (const cPlayer & a_Player);\n\tvoid SendPlayerListHeaderFooter     (const cCompositeChat & a_Header, const cCompositeChat & a_Footer);  // tolua_export\n\tvoid SendPlayerListRemovePlayer     (const cPlayer & a_Player);\n\tvoid SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_CustomName);\n\tvoid SendPlayerListUpdateGameMode   (const cPlayer & a_Player);\n\tvoid SendPlayerListUpdatePing       ();\n\tvoid SendPlayerMoveLook             (Vector3d a_Pos, float a_Yaw, float a_Pitch, bool a_IsRelative);\n\tvoid SendPlayerMoveLook             (void);\n\tvoid SendPlayerPermissionLevel      (void);\n\tvoid SendPlayerPosition             (void);\n\tvoid SendPlayerSpawn                (const cPlayer & a_Player);\n\tvoid SendPluginMessage              (const AString & a_Channel, std::string_view a_Message);  // Exported in ManualBindings.cpp\n\tvoid SendPluginMessage              (const AString & a_Channel, ContiguousByteBufferView a_Message);\n\tvoid SendRemoveEntityEffect         (const cEntity & a_Entity, int a_EffectID);\n\tvoid SendResourcePack               (const AString & a_ResourcePackUrl);  // tolua_export\n\tvoid SendResetTitle                 (void);  // tolua_export\n\tvoid SendRespawn                    (eDimension a_Dimension, bool a_IsRespawningFromDeath);\n\tvoid SendScoreUpdate                (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode);\n\tvoid SendScoreboardObjective        (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode);\n\tvoid SendSetSubTitle                (const cCompositeChat & a_SubTitle);  // tolua_export\n\tvoid SendSetRawSubTitle             (const AString & a_SubTitle);  // tolua_export\n\tvoid SendSetTitle                   (const cCompositeChat & a_Title);  // tolua_export\n\tvoid SendSetRawTitle                (const AString & a_Title);  // tolua_export\n\tvoid SendSoundEffect                (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch);  // tolua_export\n\tvoid SendSoundEffect                (const AString & a_SoundName, Vector3d a_Position, float a_Volume, float a_Pitch);  // tolua_export\n\tvoid SendSoundParticleEffect        (const EffectID a_EffectID, Vector3i a_Source, int a_Data);\n\tvoid SendSpawnEntity                (const cEntity & a_Entity);\n\tvoid SendSpawnMob                   (const cMonster & a_Mob);\n\tvoid SendStatistics                 (const StatisticsManager & a_Manager);\n\tvoid SendTabCompletionResults       (const AStringVector & a_Results);\n\tvoid SendThunderbolt                (Vector3i a_BlockPos);  // tolua_export\n\tvoid SendTitleTimes                 (int a_FadeInTicks, int a_DisplayTicks, int a_FadeOutTicks);  // tolua_export\n\tvoid SendTimeUpdate                 (cTickTimeLong a_WorldAge, cTickTimeLong a_WorldDate, bool a_DoDaylightCycle);\n\tvoid SendUnleashEntity              (const cEntity & a_Entity);  // tolua_export\n\tvoid SendUnloadChunk                (int a_ChunkX, int a_ChunkZ);\n\tvoid SendUpdateBlockEntity          (cBlockEntity & a_BlockEntity);\n\tvoid SendUpdateSign                 (Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);\n\n\t/** Send a newly discovered recipe to show the notification and unlock in the recipe book */\n\tvoid SendUnlockRecipe               (UInt32 a_RecipeId);\n\n\t/** Send already known recipes without notification but visible in the recipe book */\n\tvoid SendInitRecipes                (UInt32 a_RecipeId);\n\n\tvoid SendWeather                    (eWeather a_Weather);\n\tvoid SendWholeInventory             (const cWindow & a_Window);\n\tvoid SendWindowClose                (const cWindow & a_Window);\n\tvoid SendWindowOpen                 (const cWindow & a_Window);\n\tvoid SendWindowProperty             (const cWindow & a_Window, size_t a_Property, short a_Value);\n\n\tconst AString & GetUsername(void) const;  // tolua_export\n\tvoid SetUsername(AString && a_Username);\n\n\t// tolua_begin\n\n\tinline short GetPing(void) const { return static_cast<short>(std::chrono::duration_cast<std::chrono::milliseconds>(m_Ping).count()); }\n\n\t/** Sets the maximal view distance. */\n\tvoid SetViewDistance(int a_ViewDistance);\n\n\t/** Returns the view distance that the player currently have. */\n\tint GetViewDistance(void) const { return m_CurrentViewDistance; }\n\n\t/** Returns the view distance that the player request, not the used view distance. */\n\tint GetRequestedViewDistance(void) const { return m_RequestedViewDistance; }\n\n\tvoid SetLocale(const AString & a_Locale) { m_Locale = a_Locale; }\n\tAString GetLocale(void) const { return m_Locale; }\n\n\tint GetUniqueID(void) const { return m_UniqueID; }\n\n\tbool HasPluginChannel(const AString & a_PluginChannel);\n\n\t/** Called by the protocol when it receives the MC|Brand plugin message. Also callable by plugins.\n\tSimply stores the string value. */\n\tvoid SetClientBrand(const AString & a_ClientBrand) { m_ClientBrand = a_ClientBrand; }\n\n\t/** Returns the client brand received in the MC|Brand plugin message or set by a plugin. */\n\tconst AString & GetClientBrand(void) const { return m_ClientBrand; }\n\n\t/** Returns the Forge mods installed on the client. */\n\tconst AStringMap & GetForgeMods(void) const { return m_ForgeMods; }\n\n\t/** Returns true if the client is modded with Forge. */\n\tbool IsForgeClient(void) const { return m_ForgeHandshake.IsForgeClient; }\n\n\t// tolua_end\n\n\t/** Add the Forge mod list to the server ping response. */\n\tvoid ForgeAugmentServerListPing(Json::Value & a_Response)\n\t{\n\t\tm_ForgeHandshake.AugmentServerListPing(*this, a_Response);\n\t}\n\n\t/** Mark a client connection as using Forge. Set by the protocol. */\n\tvoid SetIsForgeClient()\n\t{\n\t\tm_ForgeHandshake.IsForgeClient = true;\n\t}\n\n\t/** Returns true if the client wants the chunk specified to be sent (in m_ChunksToSend) */\n\tbool WantsSendChunk(int a_ChunkX, int a_ChunkZ);\n\n\t/** Adds the chunk specified to the list of chunks wanted for sending (m_ChunksToSend) */\n\tvoid AddWantedChunk(int a_ChunkX, int a_ChunkZ);\n\n\t// Calls that cProtocol descendants use to report state:\n\tvoid PacketBufferFull(void);\n\tvoid PacketUnknown(UInt32 a_PacketType);\n\tvoid PacketError(UInt32 a_PacketType);\n\n\t/** Called when the protocol receives a (hand swing) animation packet. */\n\tvoid HandleAnimation(bool a_SwingMainHand);\n\n\t/** Called when the protocol receives a MC|ItemName plugin message, indicating that the player named\n\tan item in the anvil UI. */\n\tvoid HandleAnvilItemName(const AString & a_ItemName);\n\n\t/** Called when the protocol receives a MC|Beacon plugin message, indicating that the player set an effect\n\tin the beacon UI. */\n\tvoid HandleBeaconSelection(unsigned a_PrimaryEffect, unsigned a_SecondaryEffect);\n\n\t/** Called when the protocol detects a chat packet. */\n\tvoid HandleChat(const AString & a_Message);\n\n\t/** Called when the protocol receives a message, indicating that the player set a new\n\tcommand in the command block UI, for a block-based commandblock. */\n\tvoid HandleCommandBlockBlockChange(Vector3i a_BlockPos, const AString & a_NewCommand);\n\n\t/** Called when the protocol receives a message, indicating that the player set a new\n\tcommand in the command block UI, for an entity-based commandblock (minecart?). */\n\tvoid HandleCommandBlockEntityChange(UInt32 a_EntityID, const AString & a_NewCommand);\n\n\t/** Called when the client clicks the creative inventory window.\n\ta_ClickAction specifies whether the click was inside the window or not (caLeftClick or caLeftClickOutside). */\n\tvoid HandleCreativeInventory(Int16 a_SlotNum, const cItem & a_HeldItem, eClickAction a_ClickAction);\n\n\t/** Handles a player sneaking or unsneaking. */\n\tvoid HandleCrouch(bool a_IsCrouching);\n\n\t/** Called when the player enchants an Item in the Enchanting table UI. */\n\tvoid HandleEnchantItem(UInt8 a_WindowID, UInt8 a_Enchantment);\n\n\t/** Kicks the client if the same username is already logged in.\n\tReturns false if the client has been kicked, true otherwise. */\n\tbool CheckMultiLogin(const AString & a_Username);\n\n\t/** Called when the protocol handshake has been received (for protocol versions that support it;\n\totherwise the first instant when a username is received).\n\tReturns true if the player is to be let in, false if they were disconnected\n\t*/\n\tbool HandleHandshake        (const AString & a_Username);\n\n\t/** Handles a player exiting his bed. */\n\tvoid HandleLeaveBed();\n\n\tvoid HandleKeepAlive        (UInt32 a_KeepAliveID);\n\tvoid HandleLeftClick        (Vector3i a_BlockPos, eBlockFace a_BlockFace, UInt8 a_Status);\n\n\t/** Called when the protocol receives a MC|TrSel packet, indicating that the player used a trade in\n\tthe NPC UI. */\n\tvoid HandleNPCTrade(int a_SlotNum);\n\n\t/** Handles a player opening his inventory while riding a horse. */\n\tvoid HandleOpenHorseInventory();\n\n\tvoid HandlePing             (void);\n\tvoid HandlePlayerAbilities  (bool a_IsFlying, float FlyingSpeed, float WalkingSpeed);\n\tvoid HandlePlayerLook       (float a_Rotation, float a_Pitch, bool a_IsOnGround);\n\n\t/** Verifies and sets player position, performing relevant checks.\n\tCalls relevant methods to process movement related statistics.\n\tRequires state of previous position and on-ground status, so must be called when these are still intact. */\n\tvoid HandlePlayerMove(Vector3d a_Pos, bool a_IsOnGround);\n\n\tvoid HandlePlayerMoveLook(Vector3d a_Pos, float a_Rotation, float a_Pitch, bool a_IsOnGround);\n\n\n\tvoid HandlePluginMessage    (const AString & a_Channel, ContiguousByteBufferView a_Message);\n\tvoid HandleResourcePack     (UInt8 a_Status);\n\tvoid HandleRespawn          (void);\n\tvoid HandleRightClick       (Vector3i a_BlockPos, eBlockFace a_BlockFace, Vector3i a_Cursor, bool a_UsedMainHand);\n\tvoid HandleSlotSelected     (Int16 a_SlotNum);\n\tvoid HandleSpectate         (const cUUID & a_PlayerUUID);\n\n\t/** Handles a player sprinting or slowing back down. */\n\tvoid HandleSprint(bool a_IsSprinting);\n\n\t/** Handles a player starting elytra flight while falling. */\n\tvoid HandleStartElytraFlight();\n\n\tvoid HandleSteerVehicle     (float Forward, float Sideways);\n\tvoid HandleTabCompletion    (const AString & a_Text);\n\tvoid HandleUpdateSign       (\n\t\tVector3i a_BlockPos,\n\t\tconst AString & a_Line1, const AString & a_Line2,\n\t\tconst AString & a_Line3, const AString & a_Line4\n\t);\n\tvoid HandleUnmount          (void);\n\tvoid HandleUseEntity        (UInt32 a_TargetEntityID, bool a_IsLeftClick);\n\tvoid HandleUseItem          (bool a_UsedMainHand);\n\tvoid HandleWindowClick      (UInt8 a_WindowID, Int16 a_SlotNum, eClickAction a_ClickAction, const cItem & a_HeldItem);\n\tvoid HandleWindowClose      (UInt8 a_WindowID);\n\n\t/** Called when a recipe from the recipe book is selected */\n\tvoid HandleCraftRecipe      (UInt32 a_RecipeId);\n\n\t/** Called when the protocol has finished logging the user in.\n\tReturn true to allow the user in; false to kick them. */\n\tbool HandleLogin();\n\n\tvoid SendData(ContiguousByteBufferView a_Data);\n\n\t/** Called when the player moves into a different world.\n\tSends an UnloadChunk packet for each loaded chunk and resets the streamed chunks. */\n\tvoid RemoveFromWorld(void);\n\n\t/** Called by the protocol recognizer when the protocol version is known. */\n\tvoid SetProtocolVersion(UInt32 a_ProtocolVersion) { m_ProtocolVersion = a_ProtocolVersion; }\n\n\t/** Returns the protocol version number of the protocol that the client is talking. Returns zero if the protocol version is not (yet) known. */\n\tUInt32 GetProtocolVersion(void) const { return m_ProtocolVersion; }  // tolua_export\n\n\tbool IsPlayerChunkSent();\n\nprivate:\n\n\tfriend class cForgeHandshake;   // Needs access to FinishAuthenticate()\n\n\t/** The type used for storing the names of registered plugin channels. */\n\ttypedef std::set<AString> cChannels;\n\n\t/** Forge handshake state machine. */\n\tcForgeHandshake m_ForgeHandshake;\n\n\t/** Forge mods and versions installed on this client. */\n\tAStringMap m_ForgeMods;\n\n\t/** The actual view distance used, the minimum of client's requested view distance and world's max view distance. */\n\tint m_CurrentViewDistance;\n\n\t/** The requested view distance from the player. It isn't clamped with 1 and the max view distance of the world. */\n\tint m_RequestedViewDistance;\n\n\tAString m_IPString;\n\n\tAString m_Username;\n\tAString m_Password;\n\tJson::Value m_Properties;\n\n\tcCriticalSection                                   m_CSChunkLists;\n\tstd::unordered_set<cChunkCoords, cChunkCoordsHash> m_LoadedChunks;  // Chunks that the player belongs to\n\tstd::unordered_set<cChunkCoords, cChunkCoordsHash> m_ChunksToSend;  // Chunks that need to be sent to the player (queued because they weren't generated yet or there's not enough time to send them)\n\tcChunkCoordsList                                   m_SentChunks;    // Chunks that are currently sent to the client\n\n\tcMultiVersionProtocol m_Protocol;\n\n\t/** Protects m_IncomingData against multithreaded access. */\n\tcCriticalSection m_CSIncomingData;\n\n\t/** Queue for the incoming data received on the link until it is processed in ProcessProtocolIn().\n\tProtected by m_CSIncomingData. */\n\tContiguousByteBuffer m_IncomingData;\n\n\t/** Protects m_OutgoingData against multithreaded access. */\n\tcCriticalSection m_CSOutgoingData;\n\n\t/** Buffer for storing outgoing data from any thread; will get sent in ProcessProtocolOut() at the end of each tick.\n\tProtected by m_CSOutgoingData. */\n\tContiguousByteBuffer m_OutgoingData;\n\n\t/** A pointer to a World-owned player object, created in FinishAuthenticate when authentication succeeds.\n\tThe player should only be accessed from the tick thread of the World that owns him.\n\tAfter the player object is handed off to the World, its lifetime is managed automatically, and strongly owns this client handle.\n\tThe player self-destructs some time after the client handle enters the Destroyed state.\n\tWe are therefore guaranteed that while m_State < Destroyed, that is when when we need to access m_Player, m_Player is valid. */\n\tcPlayer * m_Player;\n\n\t/** This is an optimization which saves you an iteration of m_SentChunks if you just want to know\n\twhether or not the player is standing at a sent chunk.\n\tIf this is equal to the coordinates of the chunk the player is currrently standing at, then this must be a sent chunk\n\tand a member of m_SentChunks.\n\tOtherwise, this contains an arbitrary value which should not be used. */\n\tcChunkCoords m_CachedSentChunk;\n\n\tbool m_ProxyConnection;  ///< True if player connected from a proxy (Bungee / Velocity)\n\n\tbool m_HasSentDC;  ///< True if a Disconnect packet has been sent in either direction\n\n\t// Chunk position when the last StreamChunks() was called; used to avoid re-streaming while in the same chunk\n\tint m_LastStreamedChunkX;\n\tint m_LastStreamedChunkZ;\n\n\t/** Number of ticks since the last network packet was received (increased in Tick(), reset in OnReceivedData()) */\n\tstd::atomic<int> m_TicksSinceLastPacket;\n\n\t/** The time since UnloadOutOfRangeChunks was last called. */\n\tstd::chrono::milliseconds m_TimeSinceLastUnloadCheck;\n\n\t/** Duration of the last completed client ping. */\n\tstd::chrono::steady_clock::duration m_Ping;\n\n\t/** ID of the last ping request sent to the client. */\n\tUInt32 m_PingID;\n\n\t/** Time of the last ping request sent to the client. */\n\tstd::chrono::steady_clock::time_point m_PingStartTime;\n\n\t// Values required for block dig animation\n\tint m_BlockDigAnimStage;  // Current stage of the animation; -1 if not digging\n\tint m_BlockDigAnimSpeed;  // Current speed of the animation (units ???)\n\tVector3i m_BlockDigAnimPos;\n\n\t// To avoid dig / aim bug in the client, store the last position given in a DIG_START packet and compare to that when processing the DIG_FINISH packet:\n\tbool m_HasStartedDigging;\n\tVector3i m_LastDigBlockPos;\n\n\tenum eState\n\t{\n\t\tcsConnected,             ///< The client has just connected, waiting for their handshake / login\n\t\tcsAuthenticating,        ///< The client has logged in, waiting for external authentication\n\t\tcsDownloadingWorld,      ///< The client is waiting for chunks, we're waiting for the loader to provide and send them\n\t\tcsPlaying,               ///< Normal gameplay\n\t\tcsDestroyed,             ///< The client has been destroyed, the destructor is to be called from the owner thread\n\t} ;\n\n\t/* Mutex protecting m_State from concurrent writes. */\n\tcCriticalSection m_CSState;\n\n\t/** The current (networking) state of the client.\n\tProtected from concurrent writes by m_CSState; but may be read by other threads concurrently.\n\tIf a function depends on m_State or wants to change m_State, it needs to lock m_CSState.\n\tHowever, if it only uses m_State for a quick bail out, or it doesn't break if the client disconnects in the middle of it,\n\tit may just read m_State without locking m_CSState. */\n\tstd::atomic<eState> m_State;\n\n\t/** Number of explosions sent this tick */\n\tint m_NumExplosionsThisTick;\n\n\t/** Number of place or break interactions this tick */\n\tint m_NumBlockChangeInteractionsThisTick;\n\n\tstatic int s_ClientCount;\n\n\tstatic Vector3i s_IllegalPosition;\n\n\t/** ID used for identification during authenticating. Assigned sequentially for each new instance. */\n\tint m_UniqueID;\n\n\t/** Contains the UUID used by Mojang to identify the player's account. */\n\tcUUID m_UUID;\n\n\t/** Set to true when the chunk where the player is is sent to the client. Used for spawning the player */\n\tbool m_HasSentPlayerChunk;\n\n\t/** Client Settings */\n\tAString m_Locale;\n\n\t/** The positions from the last sign that the player placed. It's needed to verify the sign text change. */\n\tVector3i m_LastPlacedSign;\n\n\t/** The plugin channels that the client has registered. */\n\tcChannels m_PluginChannels;\n\n\t/** The brand identification of the client, as received in the MC|Brand plugin message or set from a plugin. */\n\tAString m_ClientBrand;\n\n\t/** The version of the protocol that the client is talking, or 0 if unknown. */\n\tUInt32 m_ProtocolVersion;\n\n\t/** The link that is used for network communication.\n\tm_CSOutgoingData is used to synchronize access for sending data. */\n\tcTCPLinkPtr m_Link;\n\n\t/** The fraction between 0 and 1 (or above), of how far through mining the currently mined block is.\n\t0 for just started, 1 and above for broken. Used for anti-cheat. */\n\tfloat m_BreakProgress;\n\n\t/** Finish logging the user in after authenticating. */\n\tvoid FinishAuthenticate();\n\n\t/** Returns true if the rate block interactions is within a reasonable limit (bot protection) */\n\tbool CheckBlockInteractionsRate(void);\n\n\t/** Returns whether the player could in fact reach the position they're attempting to interact with. */\n\tbool IsWithinReach(Vector3i a_Position) const;\n\n\t/** Adds a single chunk to be streamed to the client; used by StreamChunks() */\n\tvoid StreamChunk(int a_ChunkX, int a_ChunkZ, cChunkSender::Priority a_Priority);\n\n\t/** Handles the DIG_STARTED dig packet: */\n\tvoid HandleBlockDigStarted (Vector3i a_BlockPos, eBlockFace a_BlockFace);\n\n\t/** Handles the DIG_FINISHED dig packet: */\n\tvoid HandleBlockDigFinished(Vector3i a_BlockPos, eBlockFace a_BlockFace);\n\n\t/** The clients will receive a finished dig animation */\n\tvoid FinishDigAnimation();\n\n\t/** Converts the protocol-formatted channel list (NUL-separated) into a proper string vector. */\n\tAStringVector BreakApartPluginChannels(ContiguousByteBufferView a_PluginChannels);\n\n\t/** Adds all of the channels to the list of current plugin channels. Handles duplicates gracefully. */\n\tvoid RegisterPluginChannels(const AStringVector & a_ChannelList);\n\n\t/** Removes all of the channels from the list of current plugin channels. Ignores channels that are not found. */\n\tvoid UnregisterPluginChannels(const AStringVector & a_ChannelList);\n\n\t/** Called when the network socket has been closed. */\n\tvoid SocketClosed(void);\n\n\t/** Called to update m_State.\n\tOnly succeeds if a_NewState > m_State, otherwise returns false. */\n\tbool SetState(eState a_NewState);\n\n\t// cTCPLink::cCallbacks overrides:\n\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) override;\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Length) override;\n\tvirtual void OnRemoteClosed(void) override;\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;\n};  // tolua_export\n"
  },
  {
    "path": "src/Color.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Color.h\"\n\n\n\n\n\n#define COLOR_RED_BITS     0x00FF0000\n#define COLOR_GREEN_BITS   0x0000FF00\n#define COLOR_BLUE_BITS    0x000000FF\n#define COLOR_RED_OFFSET   16\n#define COLOR_GREEN_OFFSET 8\n\n\n\n\n\nvoid cColor::SetColor(unsigned char a_Red, unsigned char a_Green, unsigned char a_Blue)\n{\n\tm_Color = (static_cast<unsigned int>(a_Red) << COLOR_RED_OFFSET) + (static_cast<unsigned int>(a_Green) << COLOR_GREEN_OFFSET) + (static_cast<unsigned int>(a_Blue));\n}\n\n\n\n\n\nvoid cColor::SetRed(unsigned char a_Red)\n{\n\tm_Color = (static_cast<unsigned int>(a_Red) << COLOR_RED_OFFSET) + ((COLOR_GREEN_BITS | COLOR_BLUE_BITS) & m_Color);\n}\n\n\n\n\n\nvoid cColor::SetGreen(unsigned char a_Green)\n{\n\tm_Color = (static_cast<unsigned int>(a_Green) << COLOR_GREEN_OFFSET) + ((COLOR_RED_BITS | COLOR_BLUE_BITS) & m_Color);\n}\n\n\n\n\n\nvoid cColor::SetBlue(unsigned char a_Blue)\n{\n\tm_Color = static_cast<unsigned int>(a_Blue) + ((COLOR_RED_BITS | COLOR_GREEN_BITS) & m_Color);\n}\n\n\n\n\n\nunsigned char cColor::GetRed() const\n{\n\treturn static_cast<unsigned char>((m_Color & COLOR_RED_BITS) >> COLOR_RED_OFFSET);\n}\n\n\n\n\n\nunsigned char cColor::GetGreen() const\n{\n\treturn (m_Color & COLOR_GREEN_BITS) >> COLOR_GREEN_OFFSET;\n}\n\n\n\n\n\nunsigned char cColor::GetBlue() const\n{\n\treturn m_Color & COLOR_BLUE_BITS;\n}\n"
  },
  {
    "path": "src/Color.h",
    "content": "\n// Color.h\n\n// Declares a class to handle item color related code\n\n\n\n\n\n#pragma once\n\n// tolua_begin\nclass cColor\n{\npublic:\n\n\tenum eColorLimits : unsigned int\n\t{\n\t\tCOLOR_MIN = 0,\n\t\tCOLOR_MAX = 255,\n\t\tCOLOR_LIMIT = 256,\n\t\tCOLOR_NONE = 0xFFFFFFFF,\n\t};\n\tcColor() { m_Color = static_cast<unsigned int>(COLOR_NONE);}\n\tcColor(unsigned char a_Red, unsigned char a_Green, unsigned char a_Blue) { SetColor(a_Red, a_Green, a_Blue); }\n\n\t/** Returns whether the color is a valid color */\n\tbool IsValid() const { return m_Color != COLOR_NONE; }\n\n\n\t/** Changes the color */\n\tvoid SetColor(unsigned char a_Red, unsigned char a_Green, unsigned char a_Blue);\n\n\t/** Alters the red value of the color */\n\tvoid SetRed(unsigned char a_Red);\n\n\t/** Alters the green value of the color */\n\tvoid SetGreen(unsigned char a_Green);\n\n\t/** Alters the blue value of the color */\n\tvoid SetBlue(unsigned char a_Blue);\n\n\t/** Returns the red value of the color */\n\tunsigned char GetRed() const;\n\n\t/** Returns the green value of the color */\n\tunsigned char GetGreen() const;\n\n\t/** Returns the blue value of the color */\n\tunsigned char GetBlue() const;\n\n\t/** Resets the color */\n\tvoid Clear() { m_Color = static_cast<unsigned int>(COLOR_NONE); }\n\t// tolua_end\n\n\tunsigned int m_Color;\n\n};  // tolua_export\n"
  },
  {
    "path": "src/CommandOutput.cpp",
    "content": "\n// CommandOutput.cpp\n\n// Implements the various classes that process command output\n\n#include \"Globals.h\"\n#include \"CommandOutput.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStringAccumCommandOutputCallback:\n\nvoid cStringAccumCommandOutputCallback::Out(const AString & a_Text)\n{\n\tm_Accum.append(a_Text);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLogCommandOutputCallback:\n\nvoid cLogCommandOutputCallback::Finished()\n{\n\t// Log each line separately:\n\tsize_t len = m_Accum.length();\n\tsize_t last = 0;\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tswitch (m_Accum[i])\n\t\t{\n\t\t\tcase '\\n':\n\t\t\t{\n\t\t\t\tLOG(\"%s\", m_Accum.substr(last, i - last));\n\t\t\t\tlast = i + 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}  // for i - m_Buffer[]\n\tif (last < len)\n\t{\n\t\tLOG(\"%s\", m_Accum.substr(last));\n\t}\n\n\t// Clear the buffer for the next command output:\n\tm_Accum.clear();\n}\n\n\n\n\n"
  },
  {
    "path": "src/CommandOutput.h",
    "content": "\n// CommandOutput.h\n\n// Declares various classes that process command output\n\n#pragma once\n\n\n\n\n\n/** Interface for a callback that receives command output\nThe Out() function is called for any output the command has produced.\nDescendants override that function to provide specific processing of the output. */\nclass cCommandOutputCallback\n{\npublic:\n\tvirtual ~cCommandOutputCallback() {}  // Force a virtual destructor in subclasses\n\n\t/** Called when the command wants to output anything; may be called multiple times */\n\tvirtual void Out(const AString & a_Text) = 0;\n\n\t/** Outputs the specified text, plus a newline. */\n\tvoid OutLn(const AString & aText)\n\t{\n\t\tOut(aText);\n\t\tOut(\"\\n\");\n\t}\n\n\t/** Called when the command processing has been finished */\n\tvirtual void Finished() {}\n} ;\n\n\n\n\n\n/** Class that discards all command output */\nclass cNullCommandOutputCallback :\n\tpublic cCommandOutputCallback\n{\n\t// cCommandOutputCallback overrides:\n\tvirtual void Out(const AString & a_Text) override\n\t{\n\t\t// Do nothing\n\t\tUNUSED(a_Text);\n\t}\n} ;\n\n\n\n\n\n/** Accumulates all command output into a string. */\nclass cStringAccumCommandOutputCallback:\n\tpublic cCommandOutputCallback\n{\n\tusing Super = cCommandOutputCallback;\n\npublic:\n\n\t// cCommandOutputCallback overrides:\n\tvirtual void Out(const AString & a_Text) override;\n\tvirtual void Finished() override {}\n\n\t/** Returns the accumulated command output in a string. */\n\tconst AString & GetAccum() const { return m_Accum; }\n\nprotected:\n\t/** Output is stored here until the command finishes processing */\n\tAString m_Accum;\n} ;\n\n\n\n\n\n/** Sends all command output to a log, line by line, when the command finishes processing */\nclass cLogCommandOutputCallback :\n\tpublic cStringAccumCommandOutputCallback\n{\npublic:\n\t// cStringAccumCommandOutputCallback overrides:\n\tvirtual void Finished() override;\n} ;\n\n\n\n\n\n/** Sends all command output to a log, line by line; deletes self when command finishes processing */\nclass cLogCommandDeleteSelfOutputCallback:\n\tpublic cLogCommandOutputCallback\n{\n\tusing Super = cLogCommandOutputCallback;\n\n\tvirtual void Finished() override\n\t{\n\t\tSuper::Finished();\n\t\tdelete this;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/CompositeChat.cpp",
    "content": "\n// CompositeChat.cpp\n\n// Implements the cCompositeChat class used to wrap a chat message with multiple parts (text, url, cmd)\n\n#include \"Globals.h\"\n#include \"CompositeChat.h\"\n#include \"ClientHandle.h\"\n#include \"JsonUtils.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCompositeChat:\n\ncCompositeChat::cCompositeChat(void) :\n\tm_MessageType(mtCustom)\n{\n}\n\n\n\n\n\ncCompositeChat::cCompositeChat(const AString & a_ParseText, eMessageType a_MessageType) :\n\tm_MessageType(a_MessageType)\n{\n\tParseText(a_ParseText);\n}\n\n\n\n\n\nvoid cCompositeChat::Clear(void)\n{\n\tm_Parts.clear();\n}\n\n\n\n\n\nvoid cCompositeChat::AddTextPart(const AString & a_Message, const AString & a_Style)\n{\n\tm_Parts.push_back(TextPart{{ a_Message, a_Style, {} } });\n}\n\n\n\n\n\nvoid cCompositeChat::AddClientTranslatedPart(const AString & a_TranslationID, const AStringVector & a_Parameters, const AString & a_Style)\n{\n\tm_Parts.push_back(ClientTranslatedPart{{ a_TranslationID, a_Style, {} }, a_Parameters });\n}\n\n\n\n\n\nvoid cCompositeChat::AddUrlPart(const AString & a_Text, const AString & a_Url, const AString & a_Style)\n{\n\tm_Parts.push_back(UrlPart{{ a_Text, a_Style, {} }, a_Url });\n}\n\n\n\n\n\nvoid cCompositeChat::AddRunCommandPart(const AString & a_Text, const AString & a_Command, const AString & a_Style)\n{\n\tm_Parts.push_back(RunCommandPart{{{ a_Text, a_Style, {} }, a_Command } });\n}\n\n\n\n\n\nvoid cCompositeChat::AddSuggestCommandPart(const AString & a_Text, const AString & a_SuggestedCommand, const AString & a_Style)\n{\n\tm_Parts.push_back(SuggestCommandPart{{{ a_Text, a_Style, {} }, a_SuggestedCommand } });\n}\n\n\n\n\n\nvoid cCompositeChat::AddShowAchievementPart(const AString & a_PlayerName, const AString & a_Achievement, const AString & a_Style)\n{\n\tm_Parts.push_back(ShowAchievementPart{{ a_Achievement, a_Style, {} }, a_PlayerName });\n}\n\n\n\n\n/**\n* Parse the input message to add colors or link then add it to the object.\n*\n* It detects every & of the message and the next character for it to colorize.\n* It detect : in the text to detect link structures.\n*\n* @param a_ParseText The input text to parse\n*/\nvoid cCompositeChat::ParseText(const AString & a_ParseText)\n{\n\tsize_t len = a_ParseText.length();\n\tsize_t cursor = 0;\n\tAString CurrentStyle;\n\tAString CurrentText;\n\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tswitch (a_ParseText[i])\n\t\t{\n\t\t\tcase '&':  //< Color code\n\t\t\t{\n\t\t\t\tif ((i != 0) && (a_ParseText[i-1] == '\\\\'))\n\t\t\t\t{\n\t\t\t\t\tCurrentText.append(a_ParseText, cursor, i - cursor - 1).append(\"&\");\n\t\t\t\t\tAddTextPart(CurrentText, CurrentStyle);\n\t\t\t\t\tCurrentText.clear();\n\t\t\t\t\tcursor = ++i;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (cursor < i)\n\t\t\t\t{\n\t\t\t\t\tCurrentText.append(a_ParseText, cursor, i - cursor);\n\t\t\t\t\tAddTextPart(CurrentText, CurrentStyle);\n\t\t\t\t\tCurrentText.clear();\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t\tcursor = i + 1;\n\n\t\t\t\tif (a_ParseText[i] == 'r')\n\t\t\t\t{\n\t\t\t\t\tCurrentStyle = \"\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCurrentStyle.push_back(a_ParseText[i]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ':':\n\t\t\t{\n\t\t\t\tstatic const constexpr std::array<std::string_view, 2> LinkPrefixes =\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\t\"http\",\n\t\t\t\t\t\t\"https\"\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tfor (const auto & Prefix : LinkPrefixes)\n\t\t\t\t{\n\t\t\t\t\tsize_t PrefixLen = Prefix.size();\n\t\t\t\t\tif (\n\t\t\t\t\t\t(i >= cursor + PrefixLen) &&  // There is enough space in front of the colon for the prefix\n\t\t\t\t\t\t(std::string_view(a_ParseText).substr(i - PrefixLen, PrefixLen) == Prefix)  // the prefix matches\n\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Add everything before this as a text part:\n\t\t\t\t\t\tif (i > cursor+ PrefixLen)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tCurrentText.append(a_ParseText.c_str() + cursor, i - cursor - PrefixLen);\n\t\t\t\t\t\t\tcursor= i - PrefixLen;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!CurrentText.empty())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tAddTextPart(CurrentText, CurrentStyle);\n\t\t\t\t\t\t\tCurrentText.clear();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Go till the last non-whitespace char in the text:\n\t\t\t\t\t\tfor (; i < len; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (isspace(a_ParseText[i]))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tAddUrlPart(a_ParseText.substr(cursor, i - cursor), a_ParseText.substr(cursor, i - cursor), CurrentStyle);\n\t\t\t\t\t\tcursor = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}  // for Prefix - LinkPrefix[]\n\t\t\t\tbreak;\n\t\t\t}  // case ':'\n\t\t}  // switch (a_ParseText[i])\n\t}  // for i - a_ParseText[]\n\tif (cursor < len)\n\t{\n\t\tCurrentText.clear();\n\t\tCurrentText.append(a_ParseText, cursor, len - cursor);\n\t\tAddTextPart(CurrentText, CurrentStyle);\n\t}\n}\n\n\n\n\n\nvoid cCompositeChat::SetMessageType(eMessageType a_MessageType, const AString & a_AdditionalMessageTypeData)\n{\n\tm_MessageType = a_MessageType;\n\tm_AdditionalMessageTypeData = a_AdditionalMessageTypeData;\n}\n\n\n\n\n\nvoid cCompositeChat::UnderlineUrls(void)\n{\n\tfor (auto & Part : m_Parts)\n\t{\n\t\tstd::visit(OverloadedVariantAccess\n\t\t{\n\t\t\t[](TextPart &             a_Part) {  },\n\t\t\t[](ClientTranslatedPart & a_Part) {  },\n\t\t\t[](UrlPart &              a_Part) { a_Part.Style += 'n'; },\n\t\t\t[](RunCommandPart &       a_Part) {  },\n\t\t\t[](SuggestCommandPart &   a_Part) {  },\n\t\t\t[](ShowAchievementPart &  a_Part) {  },\n\t\t}, Part);\n\t}\n}\n\n\n\n\n\nAString cCompositeChat::ExtractText(void) const\n{\n\tAString Msg;\n\tfor (const auto & Part : m_Parts)\n\t{\n\t\tstd::visit(OverloadedVariantAccess\n\t\t{\n\t\t\t[&Msg](const TextPart &             a_Part) { Msg.append(a_Part.Text); },\n\t\t\t[&Msg](const ClientTranslatedPart & a_Part) { Msg.append(a_Part.Text); },\n\t\t\t[&Msg](const UrlPart &              a_Part) { Msg.append(a_Part.Url); },\n\t\t\t[&Msg](const RunCommandPart &       a_Part) { Msg.append(a_Part.Text); },\n\t\t\t[&Msg](const SuggestCommandPart &   a_Part) { Msg.append(a_Part.Text); },\n\t\t\t[    ](const ShowAchievementPart &  a_Part) {  },\n\t\t}, Part);\n\t}\n\treturn Msg;\n}\n\n\n\n\n\neLogLevel cCompositeChat::MessageTypeToLogLevel(eMessageType a_MessageType)\n{\n\tswitch (a_MessageType)\n\t{\n\t\tcase mtCustom:         return eLogLevel::Regular;\n\t\tcase mtFailure:        return eLogLevel::Warning;\n\t\tcase mtInformation:    return eLogLevel::Info;\n\t\tcase mtSuccess:        return eLogLevel::Regular;\n\t\tcase mtWarning:        return eLogLevel::Warning;\n\t\tcase mtFatal:          return eLogLevel::Error;\n\t\tcase mtDeath:          return eLogLevel::Regular;\n\t\tcase mtPrivateMessage: return eLogLevel::Regular;\n\t\tcase mtJoin:           return eLogLevel::Regular;\n\t\tcase mtLeave:          return eLogLevel::Regular;\n\t\tcase mtMaxPlusOne: break;\n\t}\n\tASSERT(!\"Unhandled MessageType\");\n\treturn eLogLevel::Error;\n}\n\n\n\n\n\nAString cCompositeChat::CreateJsonString(bool a_ShouldUseChatPrefixes) const\n{\n\tJson::Value Message;\n\tMessage[\"text\"] = cClientHandle::FormatMessageType(a_ShouldUseChatPrefixes, GetMessageType(), GetAdditionalMessageTypeData());  // The client crashes without this field being present\n\tfor (const auto & Part : m_Parts)\n\t{\n\t\tJson::Value JsonPart;\n\t\tstd::visit(OverloadedVariantAccess\n\t\t{\n\t\t\t[this, &JsonPart](const TextPart & a_Part)\n\t\t\t{\n\t\t\t\tJsonPart[\"text\"] = a_Part.Text;\n\t\t\t\tAddChatPartStyle(JsonPart, a_Part.Style);\n\t\t\t},\n\t\t\t[this, &JsonPart](const ClientTranslatedPart & a_Part)\n\t\t\t{\n\t\t\t\tJsonPart[\"translate\"] = a_Part.Text;\n\t\t\t\tJson::Value With;\n\t\t\t\tfor (const auto & Parameter : a_Part.Parameters)\n\t\t\t\t{\n\t\t\t\t\tWith.append(Parameter);\n\t\t\t\t}\n\t\t\t\tif (!a_Part.Parameters.empty())\n\t\t\t\t{\n\t\t\t\t\tJsonPart[\"with\"] = With;\n\t\t\t\t}\n\t\t\t\tAddChatPartStyle(JsonPart, a_Part.Style);\n\t\t\t},\n\t\t\t[this, &JsonPart](const UrlPart & a_Part)\n\t\t\t{\n\t\t\t\tJsonPart[\"text\"] = a_Part.Text;\n\t\t\t\tJson::Value Url;\n\t\t\t\tUrl[\"action\"] = \"open_url\";\n\t\t\t\tUrl[\"value\"] = a_Part.Url;\n\t\t\t\tJsonPart[\"clickEvent\"] = Url;\n\t\t\t\tAddChatPartStyle(JsonPart, a_Part.Style);\n\t\t\t},\n\t\t\t[this, &JsonPart](const RunCommandPart & a_Part)\n\t\t\t{\n\t\t\t\tJsonPart[\"text\"] = a_Part.Text;\n\t\t\t\tJson::Value Cmd;\n\t\t\t\tCmd[\"action\"] = \"run_command\";\n\t\t\t\tCmd[\"value\"] = a_Part.Command;\n\t\t\t\tJsonPart[\"clickEvent\"] = Cmd;\n\t\t\t\tAddChatPartStyle(JsonPart, a_Part.Style);\n\t\t\t},\n\t\t\t[this, &JsonPart](const SuggestCommandPart & a_Part)\n\t\t\t{\n\t\t\t\tJsonPart[\"text\"] = a_Part.Text;\n\t\t\t\tJson::Value Cmd;\n\t\t\t\tCmd[\"action\"] = \"suggest_command\";\n\t\t\t\tCmd[\"value\"] = a_Part.Command;\n\t\t\t\tJsonPart[\"clickEvent\"] = Cmd;\n\t\t\t\tAddChatPartStyle(JsonPart, a_Part.Style);\n\t\t\t},\n\t\t\t[this, &JsonPart](const ShowAchievementPart & a_Part)\n\t\t\t{\n\t\t\t\tJsonPart[\"translate\"] = \"chat.type.achievement\";\n\n\t\t\t\tJson::Value Ach;\n\t\t\t\tAch[\"action\"] = \"show_achievement\";\n\t\t\t\tAch[\"value\"] = a_Part.Text;\n\n\t\t\t\tJson::Value AchColourAndName;\n\t\t\t\tAchColourAndName[\"color\"] = \"green\";\n\t\t\t\tAchColourAndName[\"translate\"] = a_Part.Text;\n\t\t\t\tAchColourAndName[\"hoverEvent\"] = Ach;\n\n\t\t\t\tJson::Value Extra;\n\t\t\t\tExtra.append(AchColourAndName);\n\n\t\t\t\tJson::Value Name;\n\t\t\t\tName[\"text\"] = a_Part.PlayerName;\n\n\t\t\t\tJson::Value With;\n\t\t\t\tWith.append(Name);\n\t\t\t\tWith.append(Extra);\n\n\t\t\t\tJsonPart[\"with\"] = With;\n\t\t\t\tAddChatPartStyle(JsonPart, a_Part.Style);\n\t\t\t},\n\t\t}, Part);\n\t\tMessage[\"extra\"].append(JsonPart);\n\t}  // for itr - Parts[]\n\n\t#if 1\n\t\t// Serialize as machine-readable string (no whitespace):\n\t\treturn JsonUtils::WriteFastString(Message);\n\t#else\n\t\t// Serialize as human-readable string (pretty-printed):\n\t\treturn JsonUtils::WriteStyledString(msg);\n\t#endif\n}\n\n\n\n\n\nvoid cCompositeChat::AddChatPartStyle(Json::Value & a_Value, const AString & a_PartStyle) const\n{\n\tsize_t len = a_PartStyle.length();\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tswitch (a_PartStyle[i])\n\t\t{\n\t\t\tcase 'k': a_Value[\"obfuscated\"] = Json::Value(true); break;\n\t\t\tcase 'l': a_Value[\"bold\"] = Json::Value(true); break;\n\t\t\tcase 's':  // Deprecated\n\t\t\t\tLOGERROR(\"Value s in AddChatPartStyle() is deprecated\");\n\t\t\tcase 'm': a_Value[\"strikethrough\"] = Json::Value(true); break;\n\t\t\tcase 'u':  // Deprecated\n\t\t\t\tLOGERROR(\"Value u in AddChatPartStyle() is deprecated\");\n\t\t\tcase 'n': a_Value[\"underlined\"] = Json::Value(true); break;\n\t\t\tcase 'i':  // Deprecated\n\t\t\t\tLOGERROR(\"Value i in AddChatPartStyle() is deprecated\");\n\t\t\tcase 'o': a_Value[\"italic\"] = Json::Value(true); break;\n\t\t\tcase '0': a_Value[\"color\"] = Json::Value(\"black\"); break;\n\t\t\tcase '1': a_Value[\"color\"] = Json::Value(\"dark_blue\"); break;\n\t\t\tcase '2': a_Value[\"color\"] = Json::Value(\"dark_green\"); break;\n\t\t\tcase '3': a_Value[\"color\"] = Json::Value(\"dark_aqua\"); break;\n\t\t\tcase '4': a_Value[\"color\"] = Json::Value(\"dark_red\"); break;\n\t\t\tcase '5': a_Value[\"color\"] = Json::Value(\"dark_purple\"); break;\n\t\t\tcase '6': a_Value[\"color\"] = Json::Value(\"gold\"); break;\n\t\t\tcase '7': a_Value[\"color\"] = Json::Value(\"gray\"); break;\n\t\t\tcase '8': a_Value[\"color\"] = Json::Value(\"dark_gray\"); break;\n\t\t\tcase '9': a_Value[\"color\"] = Json::Value(\"blue\"); break;\n\t\t\tcase 'a': a_Value[\"color\"] = Json::Value(\"green\"); break;\n\t\t\tcase 'b': a_Value[\"color\"] = Json::Value(\"aqua\"); break;\n\t\t\tcase 'c': a_Value[\"color\"] = Json::Value(\"red\"); break;\n\t\t\tcase 'd': a_Value[\"color\"] = Json::Value(\"light_purple\"); break;\n\t\t\tcase 'e': a_Value[\"color\"] = Json::Value(\"yellow\"); break;\n\t\t\tcase 'f': a_Value[\"color\"] = Json::Value(\"white\"); break;\n\n\t\t}  // switch (Style[i])\n\t}  // for i - a_PartStyle[]\n}\n"
  },
  {
    "path": "src/CompositeChat.h",
    "content": "\n// CompositeChat.h\n\n// Declares the cCompositeChat class used to wrap a chat message with multiple parts (text, url, cmd)\n\n#pragma once\n\n#include \"Defines.h\"\n#include \"json/json.h\"\n\n\n\n\n\n// tolua_begin\n/** Container for a single chat message composed of multiple functional parts.\nEach part corresponds roughly to the behavior supported by the client messaging:\n\t- plain text, optionaly colorized / styled\n\t- clickable URLs\n\t- clickable commands (run)\n\t- clickable commands (suggest)\nEach part has a text assigned to it that can be styled. The style is specified using a string,\neach character / character combination in the string specifies the style to use:\n\t- (char from 0 - 9 or a - f) = color X\n\t- k = obfuscated\n\t- l = bold\n\t- m = strikethrough\n\t- n = underlined\n\t- o = italic\n\t- r = reset\nIf the protocol version doesn't support all the features, it degrades gracefully.\n*/\nclass cCompositeChat\n{\npublic:\n\t// tolua_end\n\n\n\tstruct BasePart\n\t{\n\t\tAString Text;\n\t\tAString Style;\n\t\tAString AdditionalStyleData;\n\t} ;\n\n\n\n\tstruct TextPart:\n\t\tpublic BasePart\n\t{\n\t} ;\n\n\n\n\tstruct ClientTranslatedPart:\n\t\tpublic BasePart\n\t{\n\t\tAStringVector Parameters;\n\t} ;\n\n\n\n\tstruct UrlPart:\n\t\tpublic BasePart\n\t{\n\t\tAString Url;\n\t} ;\n\n\n\n\tstruct CommandPart:\n\t\tpublic BasePart\n\t{\n\t\tAString Command;\n\t} ;\n\n\n\n\tstruct RunCommandPart:\n\t\tpublic CommandPart\n\t{\n\t} ;\n\n\n\n\tstruct SuggestCommandPart:\n\t\tpublic CommandPart\n\t{\n\t} ;\n\n\n\n\tstruct ShowAchievementPart:\n\t\tpublic BasePart\n\t{\n\t\tAString PlayerName;\n\t} ;\n\n\n\n\t/** Creates a new empty chat message.\n\tExported manually due to the other overload needing a manual export. */\n\tcCompositeChat(void);\n\n\t/** Creates a new chat message and parses the text into parts.\n\tRecognizes \"http:\" and \"https:\" links and &format-character.\n\tUses ParseText() for the actual parsing.\n\tExported manually due to ToLua++ generating extra output parameter. */\n\tcCompositeChat(const AString & a_ParseText, eMessageType a_MessageType = mtCustom);\n\n\t// The following are exported in ManualBindings in order to support chaining - they return \"self\" in Lua (#755)\n\n\t/** Removes all parts from the object. */\n\tvoid Clear(void);\n\n\t/** Adds a plain text part, with optional style.\n\tThe default style is plain white text. */\n\tvoid AddTextPart(const AString & a_Message, const AString & a_Style = \"\");\n\n\t/** Adds a part that is translated client-side, with the formatting parameters and optional style. */\n\tvoid AddClientTranslatedPart(const AString & a_TranslationID, const AStringVector & a_Parameters, const AString & a_Style = \"\");\n\n\t/** Adds a part that opens an URL when clicked.\n\tThe default style is underlined light blue text. */\n\tvoid AddUrlPart(const AString & a_Text, const AString & a_Url, const AString & a_Style = \"nc\");\n\n\t/** Adds a part that runs a command when clicked.\n\tThe default style is underlined light green text. */\n\tvoid AddRunCommandPart(const AString & a_Text, const AString & a_Command, const AString & a_Style = \"na\");\n\n\t/** Adds a part that suggests a command (enters it into the chat message area, but doesn't send) when clicked.\n\tThe default style is underlined yellow text. */\n\tvoid AddSuggestCommandPart(const AString & a_Text, const AString & a_SuggestedCommand, const AString & a_Style = \"nb\");\n\n\t/** Adds a part that fully formats a specified achievement using client translatable strings\n\tTakes achievement name and player awarded to. Displays as {player} has earned the achievement {achievement_name}.\n\t*/\n\tvoid AddShowAchievementPart(const AString & a_PlayerName, const AString & a_Achievement, const AString & a_Style = \"\");\n\n\t/** Parses text into various parts, adds those.\n\tRecognizes \"http:\" and \"https:\" URLs and &color-codes. */\n\tvoid ParseText(const AString & a_ParseText);\n\n\t/** Adds the \"underline\" style to each part that is an URL. */\n\tvoid UnderlineUrls(void);\n\n\t/** Sets the message type, which is indicated by prefixes added to the message when serializing\n\tTakes optional AdditionalMessageTypeData to set m_AdditionalMessageTypeData. See said variable for more documentation.\n\tExported manually, because ToLua++ would generate extra return values. */\n\tvoid SetMessageType(eMessageType a_MessageType, const AString & a_AdditionalMessageTypeData = \"\");\n\n\t// tolua_begin\n\n\t/** Returns the message type set previously by SetMessageType(). */\n\teMessageType GetMessageType(void) const { return m_MessageType; }\n\n\t/** Returns additional data pertaining to message type, for example, the name of a mtPrivateMsg sender */\n\tAString GetAdditionalMessageTypeData(void) const { return m_AdditionalMessageTypeData; }\n\n\t/** Returns the text from the parts that comprises the human-readable data.\n\tUsed for older protocols that don't support composite chat\n\tand for console-logging. */\n\tAString ExtractText(void) const;\n\n\tAString CreateJsonString(bool a_ShouldUseChatPrefixes = true) const;\n\n\t// tolua_end\n\n\tconst auto & GetParts(void) const { return m_Parts; }\n\n\t/** Converts the MessageType to a LogLevel value.\n\tUsed by the logging bindings when logging a cCompositeChat object. */\n\tstatic eLogLevel MessageTypeToLogLevel(eMessageType a_MessageType);\n\n\t/** Adds the chat part's style (represented by the part's stylestring) into the Json object. */\n\tvoid AddChatPartStyle(Json::Value & a_Value, const AString & a_PartStyle) const;\n\nprotected:\n\n\t/** All the parts that */\n\tstd::vector<std::variant<TextPart, ClientTranslatedPart, UrlPart, RunCommandPart, SuggestCommandPart, ShowAchievementPart>> m_Parts;\n\n\t/** The message type, as indicated by prefixes. */\n\teMessageType m_MessageType;\n\n\t/** Additional data pertaining to message type, for example, the name of a mtPrivateMsg sender */\n\tAString m_AdditionalMessageTypeData;\n\n} ;  // tolua_export\n"
  },
  {
    "path": "src/CraftingRecipes.cpp",
    "content": "\n// CraftingRecipes.cpp\n\n// Interfaces to the cCraftingRecipes class representing the storage of crafting recipes\n\n#include \"Globals.h\"\n#include \"CraftingRecipes.h\"\n#include \"Root.h\"\n#include \"Bindings/PluginManager.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCraftingGrid:\n\ncCraftingGrid::cCraftingGrid(int a_Width, int a_Height) :\n\tm_Width(a_Width),\n\tm_Height(a_Height),\n\tm_Items(new cItem[ToUnsigned(a_Width * a_Height)])\n{\n}\n\n\n\n\n\ncCraftingGrid::cCraftingGrid(const cItem * a_Items, int a_Width, int a_Height) :\n\tcCraftingGrid(a_Width, a_Height)\n{\n\tfor (int i = a_Width * a_Height - 1; i >= 0; i--)\n\t{\n\t\tm_Items[i] = a_Items[i];\n\t}\n}\n\n\n\n\n\ncCraftingGrid::cCraftingGrid(const cCraftingGrid & a_Original) :\n\tcCraftingGrid(a_Original.m_Width, a_Original.m_Height)\n{\n\tfor (int i = m_Width * m_Height - 1; i >= 0; i--)\n\t{\n\t\tm_Items[i] = a_Original.m_Items[i];\n\t}\n}\n\n\n\n\n\ncCraftingGrid::~cCraftingGrid()\n{\n\tdelete[] m_Items;\n\tm_Items = nullptr;\n}\n\n\n\n\n\ncItem & cCraftingGrid::GetItem(int x, int y) const\n{\n\t// Accessible through scripting, must verify parameters:\n\tif ((x < 0) || (x >= m_Width) || (y < 0) || (y >= m_Height))\n\t{\n\t\tLOGERROR(\"Attempted to get an invalid item from a crafting grid: (%d, %d), grid dimensions: (%d, %d).\",\n\t\t\tx, y, m_Width, m_Height\n\t\t);\n\t\treturn m_Items[0];\n\t}\n\treturn m_Items[x + m_Width * y];\n}\n\n\n\n\n\nvoid cCraftingGrid::SetItem(int x, int y, ENUM_ITEM_TYPE a_ItemType, char a_ItemCount, short a_ItemHealth)\n{\n\t// Accessible through scripting, must verify parameters:\n\tif ((x < 0) || (x >= m_Width) || (y < 0) || (y >= m_Height))\n\t{\n\t\tLOGERROR(\"Attempted to set an invalid item in a crafting grid: (%d, %d), grid dimensions: (%d, %d).\",\n\t\t\tx, y, m_Width, m_Height\n\t\t);\n\t\treturn;\n\t}\n\n\tm_Items[x + m_Width * y] = cItem(a_ItemType, a_ItemCount, a_ItemHealth);\n}\n\n\n\n\n\nvoid cCraftingGrid::SetItem(int x, int y, const cItem & a_Item)\n{\n\t// Accessible through scripting, must verify parameters:\n\tif ((x < 0) || (x >= m_Width) || (y < 0) || (y >= m_Height))\n\t{\n\t\tLOGERROR(\"Attempted to set an invalid item in a crafting grid: (%d, %d), grid dimensions: (%d, %d).\",\n\t\t\tx, y, m_Width, m_Height\n\t\t);\n\t\treturn;\n\t}\n\n\tm_Items[x + m_Width * y] = a_Item;\n}\n\n\n\n\n\nvoid cCraftingGrid::Clear(void)\n{\n\tfor (int y = 0; y < m_Height; y++) for (int x = 0; x < m_Width; x++)\n\t{\n\t\tm_Items[x + m_Width * y].Empty();\n\t}\n}\n\n\n\n\n\nvoid cCraftingGrid::ConsumeGrid(const cCraftingGrid & a_Grid)\n{\n\tif ((a_Grid.m_Width != m_Width) || (a_Grid.m_Height != m_Height))\n\t{\n\t\tLOGWARNING(\"Consuming a grid of different dimensions: (%d, %d) vs (%d, %d)\",\n\t\t\ta_Grid.m_Width, a_Grid.m_Height, m_Width, m_Height\n\t\t);\n\t}\n\tint MinX = std::min(a_Grid.m_Width,  m_Width);\n\tint MinY = std::min(a_Grid.m_Height, m_Height);\n\tfor (int y = 0; y <  MinY; y++) for (int x = 0; x < MinX; x++)\n\t{\n\t\tint ThatIdx = x + a_Grid.m_Width * y;\n\t\tif (a_Grid.m_Items[ThatIdx].IsEmpty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tint ThisIdx = x + m_Width * y;\n\t\tif (a_Grid.m_Items[ThatIdx].m_ItemType != m_Items[ThisIdx].m_ItemType)\n\t\t{\n\t\t\tLOGWARNING(\"Consuming incompatible grids: item at (%d, %d) is %d in grid and %d in ingredients. Item not consumed.\",\n\t\t\t\tx, y, m_Items[ThisIdx].m_ItemType, a_Grid.m_Items[ThatIdx].m_ItemType\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tchar NumWantedItems = a_Grid.m_Items[ThatIdx].m_ItemCount;\n\t\tif (NumWantedItems > m_Items[ThisIdx].m_ItemCount)\n\t\t{\n\t\t\tLOGWARNING(\"Consuming more items than there actually are in slot (%d, %d), item %d (want %d, have %d). Item zeroed out.\",\n\t\t\t\tx, y, m_Items[ThisIdx].m_ItemType,\n\t\t\t\tNumWantedItems, m_Items[ThisIdx].m_ItemCount\n\t\t\t);\n\t\t\tNumWantedItems = m_Items[ThisIdx].m_ItemCount;\n\t\t}\n\t\tm_Items[ThisIdx].m_ItemCount -= NumWantedItems;\n\t\tif (m_Items[ThisIdx].m_ItemCount == 0)\n\t\t{\n\t\t\tif ((m_Items[ThisIdx].m_ItemType == E_ITEM_MILK) || (m_Items[ThisIdx].m_ItemType == E_ITEM_WATER_BUCKET) || (m_Items[ThisIdx].m_ItemType == E_ITEM_LAVA_BUCKET))\n\t\t\t{\n\t\t\t\tm_Items[ThisIdx] = cItem(E_ITEM_BUCKET);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_Items[ThisIdx].Clear();\n\t\t\t}\n\t\t}\n\t}  // for x, for y\n}\n\n\n\n\n\nvoid cCraftingGrid::CopyToItems(cItem * a_Items) const\n{\n\tfor (int i = m_Height * m_Width - 1; i >= 0; i--)\n\t{\n\t\ta_Items[i] = m_Items[i];\n\t}  // for x, for y\n}\n\n\n\n\n\nvoid cCraftingGrid::Dump(void)\n{\n\tfor (int y = 0; y < m_Height; y++) for (int x = 0; x < m_Width; x++)\n\t{\n\t\t[[maybe_unused]] const int idx = x + m_Width * y;\n\t\tLOGD(\"Slot (%d, %d): Type %d, health %d, count %d\",\n\t\t\tx, y, m_Items[idx].m_ItemType, m_Items[idx].m_ItemDamage, m_Items[idx].m_ItemCount\n\t\t);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCraftingRecipe:\n\ncCraftingRecipe::cCraftingRecipe(const cCraftingGrid & a_CraftingGrid) :\n\tm_Ingredients(a_CraftingGrid)\n{\n}\n\n\n\n\n\nvoid cCraftingRecipe::Clear(void)\n{\n\tm_Ingredients.Clear();\n\tm_Result.Clear();\n}\n\n\n\n\n\nvoid cCraftingRecipe::SetResult(ENUM_ITEM_TYPE a_ItemType, char a_ItemCount, short a_ItemHealth)\n{\n\tm_Result = cItem(a_ItemType, a_ItemCount, a_ItemHealth);\n}\n\n\n\n\n\nvoid cCraftingRecipe::ConsumeIngredients(cCraftingGrid & a_CraftingGrid)\n{\n\ta_CraftingGrid.ConsumeGrid(m_Ingredients);\n}\n\n\n\n\n\nvoid cCraftingRecipe::Dump(void)\n{\n\tLOGD(\"Recipe ingredients:\");\n\tm_Ingredients.Dump();\n\tLOGD(\"Result: Type %d, health %d, count %d\",\n\t\tm_Result.m_ItemType, m_Result.m_ItemDamage, m_Result.m_ItemCount\n\t);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCraftingRecipes:\n\ncCraftingRecipes::cCraftingRecipes(void)\n{\n\tLoadRecipes();\n\tPopulateRecipeNameMap();\n}\n\n\n\n\n\ncCraftingRecipes::~cCraftingRecipes()\n{\n\tClearRecipes();\n}\n\n\n\n\n\nbool cCraftingRecipes::IsNewCraftableRecipe(const cRecipe * a_Recipe, const cItem & a_Item, const std::set<cItem, cItem::sItemCompare> & a_KnownItems)\n{\n\tbool ContainsNewItem = false;\n\tfor (const auto & Ingredient : a_Recipe->m_Ingredients)\n\t{\n\t\tif (\n\t\t\t(Ingredient.m_Item.m_ItemType == a_Item.m_ItemType) &&\n\t\t\t(\n\t\t\t\t(Ingredient.m_Item.m_ItemDamage == a_Item.m_ItemDamage) ||\n\t\t\t\t(Ingredient.m_Item.m_ItemDamage == -1)\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tContainsNewItem = true;\n\t\t}\n\t\tif (a_KnownItems.find(Ingredient.m_Item) == a_KnownItems.end())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn ContainsNewItem;\n}\n\n\n\n\n\nstd::vector<UInt32> cCraftingRecipes::FindNewRecipesForItem(const cItem & a_Item, const std::set<cItem, cItem::sItemCompare> & a_KnownItems)\n{\n\tstd::vector<UInt32> Recipes;\n\tfor (UInt32 i = 0; i < m_Recipes.size(); i++)\n\t{\n\t\tif (m_Recipes[i]->m_RecipeName.empty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (IsNewCraftableRecipe(m_Recipes[i], a_Item, a_KnownItems))\n\t\t{\n\t\t\tRecipes.push_back(i);\n\t\t}\n\t}\n\treturn Recipes;\n}\n\n\n\n\n\nconst std::map<AString, UInt32> & cCraftingRecipes::GetRecipeNameMap()\n{\n\treturn m_RecipeNameMap;\n}\n\n\n\n\n\ncCraftingRecipes::cRecipe * cCraftingRecipes::GetRecipeById(UInt32 a_RecipeId)\n{\n\treturn m_Recipes[a_RecipeId];\n}\n\n\n\n\n\nvoid cCraftingRecipes::GetRecipe(cPlayer & a_Player, cCraftingGrid & a_CraftingGrid, cCraftingRecipe & a_Recipe)\n{\n\t// Allow plugins to intercept recipes using a pre-craft hook:\n\tif (cRoot::Get()->GetPluginManager()->CallHookPreCrafting(a_Player, a_CraftingGrid, a_Recipe))\n\t{\n\t\treturn;\n\t}\n\n\t// Built-in recipes:\n\tstd::unique_ptr<cRecipe> Recipe(FindRecipe(a_CraftingGrid.GetItems(), a_CraftingGrid.GetWidth(), a_CraftingGrid.GetHeight()));\n\ta_Recipe.Clear();\n\tif (Recipe.get() == nullptr)\n\t{\n\t\t// Allow plugins to intercept a no-recipe-found situation:\n\t\tcRoot::Get()->GetPluginManager()->CallHookCraftingNoRecipe(a_Player, a_CraftingGrid, a_Recipe);\n\t\treturn;\n\t}\n\tfor (cRecipeSlots::const_iterator itr = Recipe->m_Ingredients.begin(); itr != Recipe->m_Ingredients.end(); ++itr)\n\t{\n\t\ta_Recipe.SetIngredient(itr->x, itr->y, itr->m_Item);\n\t}  // for itr\n\ta_Recipe.SetResult(Recipe->m_Result);\n\n\t// Allow plugins to intercept recipes after they are processed:\n\tcRoot::Get()->GetPluginManager()->CallHookPostCrafting(a_Player, a_CraftingGrid, a_Recipe);\n}\n\n\n\n\n\nvoid cCraftingRecipes::LoadRecipes(void)\n{\n\tLOGD(\"Loading crafting recipes from crafting.txt...\");\n\tClearRecipes();\n\n\t// Load the crafting.txt file:\n\tcFile f;\n\tif (!f.Open(\"crafting.txt\", cFile::fmRead))\n\t{\n\t\tLOGWARNING(\"Cannot open file \\\"crafting.txt\\\", no crafting recipes will be available!\");\n\t\treturn;\n\t}\n\tAString Everything;\n\tif (!f.ReadRestOfFile(Everything))\n\t{\n\t\tLOGWARNING(\"Cannot read file \\\"crafting.txt\\\", no crafting recipes will be available!\");\n\t\treturn;\n\t}\n\tf.Close();\n\n\t// Split it into lines, then process each line as a single recipe:\n\tAStringVector Split = StringSplit(Everything, \"\\n\");\n\tint LineNum = 1;\n\tfor (AStringVector::const_iterator itr = Split.begin(); itr != Split.end(); ++itr, ++LineNum)\n\t{\n\t\t// Remove anything after a '#' sign and trim away the whitespace:\n\t\tAString Recipe = TrimString(itr->substr(0, itr->find('#')));\n\t\tif (Recipe.empty())\n\t\t{\n\t\t\t// Empty recipe\n\t\t\tcontinue;\n\t\t}\n\t\tAddRecipeLine(LineNum, Recipe);\n\t}  // for itr - Split[]\n\tLOG(\"Loaded %zu crafting recipes\", m_Recipes.size());\n}\n\n\n\n\n\nvoid cCraftingRecipes::PopulateRecipeNameMap(void)\n{\n\tfor (UInt32 i = 0; i < m_Recipes.size(); i++)\n\t{\n\t\tif (!m_Recipes[i]->m_RecipeName.empty())\n\t\t{\n\t\t\tm_RecipeNameMap.emplace(m_Recipes[i]->m_RecipeName, i);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cCraftingRecipes::ClearRecipes(void)\n{\n\tfor (cRecipes::iterator itr = m_Recipes.begin(); itr != m_Recipes.end(); ++itr)\n\t{\n\t\tdelete *itr;\n\t}\n\tm_Recipes.clear();\n}\n\n\n\n\n\nvoid cCraftingRecipes::AddRecipeLine(int a_LineNum, const AString & a_RecipeLine)\n{\n\t// Remove any spaces within the line:\n\tAString RecipeLine(a_RecipeLine);\n\tRecipeLine.erase(std::remove_if(RecipeLine.begin(), RecipeLine.end(), isspace), RecipeLine.end());\n\n\tAStringVector Sides = StringSplit(RecipeLine, \"=\");\n\tif (Sides.size() != 2)\n\t{\n\t\tLOGWARNING(\"crafting.txt: line %d: A single '=' was expected, got %zu\", a_LineNum, Sides.size() - 1);\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_RecipeLine.c_str());\n\t\treturn;\n\t}\n\n\tstd::unique_ptr<cCraftingRecipes::cRecipe> Recipe = std::make_unique<cCraftingRecipes::cRecipe>();\n\n\tAStringVector RecipeSplit = StringSplit(Sides[0], \":\");\n\tconst auto * resultPart = &RecipeSplit[0];\n\tif (RecipeSplit.size() > 1)\n\t{\n\t\tresultPart = &RecipeSplit[1];\n\t\tRecipe->m_RecipeName = RecipeSplit[0];\n\t}\n\t// Parse the result:\n\tAStringVector ResultSplit = StringSplit(*resultPart, \",\");\n\tif (ResultSplit.empty())\n\t{\n\t\tLOGWARNING(\"crafting.txt: line %d: Result is empty, ignoring the recipe.\", a_LineNum);\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_RecipeLine.c_str());\n\t\treturn;\n\t}\n\tif (!ParseItem(ResultSplit[0], Recipe->m_Result))\n\t{\n\t\tLOGWARNING(\"crafting.txt: line %d: Cannot parse result item, ignoring the recipe.\", a_LineNum);\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_RecipeLine.c_str());\n\t\treturn;\n\t}\n\tif (ResultSplit.size() > 1)\n\t{\n\t\tif (!StringToInteger<char>(ResultSplit[1], Recipe->m_Result.m_ItemCount))\n\t\t{\n\t\t\tLOGWARNING(\"crafting.txt: line %d: Cannot parse result count, ignoring the recipe.\", a_LineNum);\n\t\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_RecipeLine.c_str());\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\t\tRecipe->m_Result.m_ItemCount = 1;\n\t}\n\n\t// Parse each ingredient:\n\tAStringVector Ingredients = StringSplit(Sides[1], \"|\");\n\tint Num = 1;\n\tfor (AStringVector::const_iterator itr = Ingredients.begin(); itr != Ingredients.end(); ++itr, ++Num)\n\t{\n\t\tif (!ParseIngredient(*itr, Recipe.get()))\n\t\t{\n\t\t\tLOGWARNING(\"crafting.txt: line %d: Cannot parse ingredient #%d, ignoring the recipe.\", a_LineNum, Num);\n\t\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_RecipeLine.c_str());\n\t\t\treturn;\n\t\t}\n\t}  // for itr - Ingredients[]\n\n\tNormalizeIngredients(Recipe.get());\n\n\tm_Recipes.push_back(Recipe.release());\n}\n\n\n\n\n\nbool cCraftingRecipes::ParseItem(const AString & a_String, cItem & a_Item)\n{\n\t// The caller provides error logging\n\n\tAStringVector Split = StringSplit(a_String, \"^\");\n\tif (Split.empty())\n\t{\n\t\treturn false;\n\t}\n\n\tif (!StringToItem(Split[0], a_Item))\n\t{\n\t\treturn false;\n\t}\n\n\tif (Split.size() > 1)\n\t{\n\t\tAString Damage = TrimString(Split[1]);\n\t\tif (!StringToInteger<short>(Damage, a_Item.m_ItemDamage))\n\t\t{\n\t\t\t// Parsing the number failed\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Success\n\treturn true;\n}\n\n\n\n\n\nbool cCraftingRecipes::ParseIngredient(const AString & a_String, cRecipe * a_Recipe)\n{\n\t// a_String is in this format: \"ItemType^damage, X:Y, X:Y, X:Y...\"\n\tAStringVector Split = StringSplit(a_String, \",\");\n\tif (Split.size() < 2)\n\t{\n\t\t// Not enough split items\n\t\treturn false;\n\t}\n\tcItem Item;\n\tif (!ParseItem(Split[0], Item))\n\t{\n\t\treturn false;\n\t}\n\tItem.m_ItemCount = 1;\n\n\tcCraftingRecipes::cRecipeSlots TempSlots;\n\tfor (AStringVector::const_iterator itr = Split.begin() + 1; itr != Split.end(); ++itr)\n\t{\n\t\t// Parse the coords in the split item:\n\t\tAStringVector Coords = StringSplit(*itr, \":\");\n\t\tif ((Coords.size() == 1) && (TrimString(Coords[0]) == \"*\"))\n\t\t{\n\t\t\tcCraftingRecipes::cRecipeSlot Slot;\n\t\t\tSlot.m_Item = Item;\n\t\t\tSlot.x = -1;\n\t\t\tSlot.y = -1;\n\t\t\tTempSlots.push_back(Slot);\n\t\t\tcontinue;\n\t\t}\n\t\tif (Coords.size() != 2)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tCoords[0] = TrimString(Coords[0]);\n\t\tCoords[1] = TrimString(Coords[1]);\n\t\tif (Coords[0].empty() || Coords[1].empty())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tcCraftingRecipes::cRecipeSlot Slot;\n\t\tSlot.m_Item = Item;\n\t\tswitch (Coords[0][0])\n\t\t{\n\t\t\tcase '1': Slot.x = 0;  break;\n\t\t\tcase '2': Slot.x = 1;  break;\n\t\t\tcase '3': Slot.x = 2;  break;\n\t\t\tcase '*': Slot.x = -1; break;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tswitch (Coords[1][0])\n\t\t{\n\t\t\tcase '1': Slot.y = 0;  break;\n\t\t\tcase '2': Slot.y = 1;  break;\n\t\t\tcase '3': Slot.y = 2;  break;\n\t\t\tcase '*': Slot.y = -1; break;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tTempSlots.push_back(Slot);\n\t}  // for itr - Split[]\n\n\t// Append the ingredients:\n\ta_Recipe->m_Ingredients.insert(a_Recipe->m_Ingredients.end(), TempSlots.begin(), TempSlots.end());\n\treturn true;\n}\n\n\n\n\n\nvoid cCraftingRecipes::NormalizeIngredients(cCraftingRecipes::cRecipe * a_Recipe)\n{\n\t// Calculate the minimum coords for ingredients, excluding the \"anywhere\" items:\n\tint MinX = MAX_GRID_WIDTH, MaxX = 0;\n\tint MinY = MAX_GRID_HEIGHT, MaxY = 0;\n\tfor (cRecipeSlots::const_iterator itr = a_Recipe->m_Ingredients.begin(); itr != a_Recipe->m_Ingredients.end(); ++itr)\n\t{\n\t\tif (itr->x >= 0)\n\t\t{\n\t\t\tMinX = std::min(itr->x, MinX);\n\t\t\tMaxX = std::max(itr->x, MaxX);\n\t\t}\n\t\tif (itr->y >= 0)\n\t\t{\n\t\t\tMinY = std::min(itr->y, MinY);\n\t\t\tMaxY = std::max(itr->y, MaxY);\n\t\t}\n\t}  // for itr - a_Recipe->m_Ingredients[]\n\n\t// Move ingredients so that the minimum coords are 0:0\n\tfor (cRecipeSlots::iterator itr = a_Recipe->m_Ingredients.begin(); itr != a_Recipe->m_Ingredients.end(); ++itr)\n\t{\n\t\tif (itr->x >= 0)\n\t\t{\n\t\t\titr->x -= MinX;\n\t\t}\n\t\tif (itr->y >= 0)\n\t\t{\n\t\t\titr->y -= MinY;\n\t\t}\n\t}  // for itr - a_Recipe->m_Ingredients[]\n\ta_Recipe->m_Width  = std::max(MaxX - MinX + 1, 1);\n\ta_Recipe->m_Height = std::max(MaxY - MinY + 1, 1);\n\n\t// TODO: Compress two same ingredients with the same coords into a single ingredient with increased item count\n}\n\n\n\n\n\ncCraftingRecipes::cRecipe * cCraftingRecipes::FindRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight)\n{\n\tASSERT(a_GridWidth <= MAX_GRID_WIDTH);\n\tASSERT(a_GridHeight <= MAX_GRID_HEIGHT);\n\n\t// Get the real bounds of the crafting grid:\n\tint GridLeft = MAX_GRID_WIDTH, GridTop = MAX_GRID_HEIGHT;\n\tint GridRight = 0,  GridBottom = 0;\n\tfor (int y = 0; y < a_GridHeight; y++) for (int x = 0; x < a_GridWidth; x++)\n\t{\n\t\tif (!a_CraftingGrid[x + y * a_GridWidth].IsEmpty())\n\t\t{\n\t\t\tGridRight  = std::max(x, GridRight);\n\t\t\tGridBottom = std::max(y, GridBottom);\n\t\t\tGridLeft   = std::min(x, GridLeft);\n\t\t\tGridTop    = std::min(y, GridTop);\n\t\t}\n\t}\n\tint GridWidth = GridRight - GridLeft + 1;\n\tint GridHeight = GridBottom - GridTop + 1;\n\n\t// Search in the possibly minimized grid, but keep the stride:\n\tconst cItem * Grid = a_CraftingGrid + GridLeft + (a_GridWidth * GridTop);\n\tcRecipe * Recipe = FindRecipeCropped(Grid, GridWidth, GridHeight, a_GridWidth);\n\tif (Recipe == nullptr)\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// A recipe has been found, move it to correspond to the original crafting grid:\n\tfor (cRecipeSlots::iterator itrS = Recipe->m_Ingredients.begin(); itrS != Recipe->m_Ingredients.end(); ++itrS)\n\t{\n\t\titrS->x += GridLeft;\n\t\titrS->y += GridTop;\n\t}  // for itrS - Recipe->m_Ingredients[]\n\n\treturn Recipe;\n}\n\n\n\n\n\ncCraftingRecipes::cRecipe * cCraftingRecipes::FindRecipeCropped(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride)\n{\n\tfor (cRecipes::const_iterator itr = m_Recipes.begin(); itr != m_Recipes.end(); ++itr)\n\t{\n\t\t// Both the crafting grid and the recipes are normalized. The only variable possible is the \"anywhere\" items.\n\t\t// This still means that the \"anywhere\" item may be the one that is offsetting the grid contents to the right or downwards, so we need to check all possible positions.\n\t\t// E. g. recipe \"A, * | B, 1:1 | ...\" still needs to check grid for B at 2:2 (in case A was in grid's 1:1)\n\t\t// Calculate the maximum offsets for this recipe relative to the grid size, and iterate through all combinations of offsets.\n\t\t// Also, this calculation automatically filters out recipes that are too large for the current grid - the loop won't be entered at all.\n\n\t\tint MaxOfsX = a_GridWidth  - (*itr)->m_Width;\n\t\tint MaxOfsY = a_GridHeight - (*itr)->m_Height;\n\t\tfor (int x = 0; x <= MaxOfsX; x++) for (int y = 0; y <= MaxOfsY; y++)\n\t\t{\n\t\t\tcRecipe * Recipe = MatchRecipe(a_CraftingGrid, a_GridWidth, a_GridHeight, a_GridStride, *itr, x, y);\n\t\t\tif (Recipe != nullptr)\n\t\t\t{\n\t\t\t\treturn Recipe;\n\t\t\t}\n\t\t}  // for y, for x\n\t}  // for itr - m_Recipes[]\n\n\t// No matching recipe found\n\treturn nullptr;\n}\n\n\n\n\n\ncCraftingRecipes::cRecipe * cCraftingRecipes::MatchRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride, const cRecipe * a_Recipe, int a_OffsetX, int a_OffsetY)\n{\n\t// Check the regular items first:\n\tbool HasMatched[MAX_GRID_WIDTH][MAX_GRID_HEIGHT];\n\tmemset(HasMatched, 0, sizeof(HasMatched));\n\tfor (cRecipeSlots::const_iterator itrS = a_Recipe->m_Ingredients.begin(); itrS != a_Recipe->m_Ingredients.end(); ++itrS)\n\t{\n\t\tif ((itrS->x < 0) || (itrS->y < 0))\n\t\t{\n\t\t\t// \"Anywhere\" item, process later\n\t\t\tcontinue;\n\t\t}\n\t\tASSERT(itrS->x + a_OffsetX < a_GridWidth);\n\t\tASSERT(itrS->y + a_OffsetY < a_GridHeight);\n\t\tint GridID = (itrS->x + a_OffsetX) + a_GridStride * (itrS->y + a_OffsetY);\n\n\t\tconst cItem & Item = itrS->m_Item;\n\t\tif (\n\t\t\t(itrS->x >= a_GridWidth) ||\n\t\t\t(itrS->y >= a_GridHeight) ||\n\t\t\t(Item.m_ItemType != a_CraftingGrid[GridID].m_ItemType) ||   // same item type?\n\t\t\t(Item.m_ItemCount > a_CraftingGrid[GridID].m_ItemCount) ||  // not enough items\n\t\t\t(\n\t\t\t\t(Item.m_ItemDamage >= 0) &&  // should compare damage values?\n\t\t\t\t(Item.m_ItemDamage != a_CraftingGrid[GridID].m_ItemDamage)\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\t// Doesn't match\n\t\t\treturn nullptr;\n\t\t}\n\t\tHasMatched[itrS->x + a_OffsetX][itrS->y + a_OffsetY] = true;\n\t}  // for itrS - Recipe->m_Ingredients[]\n\n\t// Process the \"Anywhere\" items now, and only in the cells that haven't matched yet\n\t// The \"anywhere\" items are processed on a first-come-first-served basis.\n\t// Do not use a recipe with one horizontal and one vertical \"anywhere\" (\"*:1, 1:*\") as it may not match properly!\n\tcRecipeSlots MatchedSlots;  // Stores the slots of \"anywhere\" items that have matched, with the match coords\n\tfor (cRecipeSlots::const_iterator itrS = a_Recipe->m_Ingredients.begin(); itrS != a_Recipe->m_Ingredients.end(); ++itrS)\n\t{\n\t\tif ((itrS->x >= 0) && (itrS->y >= 0))\n\t\t{\n\t\t\t// Regular item, already processed\n\t\t\tcontinue;\n\t\t}\n\t\tint StartX = 0, EndX = a_GridWidth  - 1;\n\t\tint StartY = 0, EndY = a_GridHeight - 1;\n\t\tif (itrS->x >= 0)\n\t\t{\n\t\t\tStartX = itrS->x;\n\t\t\tEndX = itrS->x;\n\t\t}\n\t\telse if (itrS->y >= 0)\n\t\t{\n\t\t\tStartY = itrS->y;\n\t\t\tEndY = itrS->y;\n\t\t}\n\t\tbool Found = false;\n\t\tfor (int x = StartX; x <= EndX; x++)\n\t\t{\n\t\t\tfor (int y = StartY; y <= EndY; y++)\n\t\t\t{\n\t\t\t\tif (HasMatched[x][y])\n\t\t\t\t{\n\t\t\t\t\t// Already matched some other item\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint GridIdx = x + a_GridStride * y;\n\t\t\t\tif (\n\t\t\t\t\t(a_CraftingGrid[GridIdx].m_ItemType == itrS->m_Item.m_ItemType) &&\n\t\t\t\t\t(\n\t\t\t\t\t\t(itrS->m_Item.m_ItemDamage < 0) ||  // doesn't want damage comparison\n\t\t\t\t\t\t(itrS->m_Item.m_ItemDamage == a_CraftingGrid[GridIdx].m_ItemDamage)  // the damage matches\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tHasMatched[x][y] = true;\n\t\t\t\t\tFound = true;\n\t\t\t\t\tMatchedSlots.push_back(*itrS);\n\t\t\t\t\tMatchedSlots.back().x = x;\n\t\t\t\t\tMatchedSlots.back().y = y;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t\tif (Found)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // for x\n\t\tif (!Found)\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\t}  // for itrS - a_Recipe->m_Ingredients[]\n\n\t// Check if the whole grid has matched:\n\tfor (int x = 0; x < a_GridWidth; x++) for (int y = 0; y < a_GridHeight; y++)\n\t{\n\t\tif (!HasMatched[x][y] && !a_CraftingGrid[x + a_GridStride * y].IsEmpty())\n\t\t{\n\t\t\t// There's an unmatched item in the grid\n\t\t\treturn nullptr;\n\t\t}\n\t}  // for y, for x\n\n\t// The recipe has matched. Create a copy of the recipe and set its coords to match the crafting grid:\n\tstd::unique_ptr<cRecipe> Recipe = std::make_unique<cRecipe>();\n\tRecipe->m_Result = a_Recipe->m_Result;\n\tRecipe->m_Width  = a_Recipe->m_Width;\n\tRecipe->m_Height = a_Recipe->m_Height;\n\tfor (cRecipeSlots::const_iterator itrS = a_Recipe->m_Ingredients.begin(); itrS != a_Recipe->m_Ingredients.end(); ++itrS)\n\t{\n\t\tif ((itrS->x < 0) || (itrS->y < 0))\n\t\t{\n\t\t\t// \"Anywhere\" item, process later\n\t\t\tcontinue;\n\t\t}\n\t\tRecipe->m_Ingredients.push_back(*itrS);\n\t\tRecipe->m_Ingredients.back().x += a_OffsetX;\n\t\tRecipe->m_Ingredients.back().y += a_OffsetY;\n\t}\n\tRecipe->m_Ingredients.insert(Recipe->m_Ingredients.end(), MatchedSlots.begin(), MatchedSlots.end());\n\n\t// Handle the fireworks-related effects:\n\t// We use Recipe instead of a_Recipe because we want the wildcard ingredients' slot numbers as well, which was just added previously\n\tHandleFireworks(a_CraftingGrid, Recipe.get(), a_GridStride, a_OffsetX, a_OffsetY);\n\n\t// Handle Dyed Leather\n\tHandleDyedLeather(a_CraftingGrid, Recipe.get(), a_GridStride, a_GridWidth, a_GridHeight);\n\n\treturn Recipe.release();\n}\n\n\n\n\n\nvoid cCraftingRecipes::HandleFireworks(const cItem * a_CraftingGrid, cCraftingRecipes::cRecipe * a_Recipe, int a_GridStride, int a_OffsetX, int a_OffsetY)\n{\n\t// TODO: add support for more than one dye in the recipe\n\t// A manual and temporary solution (listing everything) is in crafting.txt for fade colours, but a programmatic solutions needs to be done for everything else\n\n\tif (a_Recipe->m_Result.m_ItemType == E_ITEM_FIREWORK_ROCKET)\n\t{\n\t\tfor (cRecipeSlots::const_iterator itr = a_Recipe->m_Ingredients.begin(); itr != a_Recipe->m_Ingredients.end(); ++itr)\n\t\t{\n\t\t\tswitch (itr->m_Item.m_ItemType)\n\t\t\t{\n\t\t\t\tcase E_ITEM_FIREWORK_STAR:\n\t\t\t\t{\n\t\t\t\t\t// Result was a rocket, found a star - copy star data to rocket data\n\t\t\t\t\tint GridID = (itr->x + a_OffsetX) + a_GridStride * (itr->y + a_OffsetY);\n\t\t\t\t\ta_Recipe->m_Result.m_FireworkItem.CopyFrom(a_CraftingGrid[GridID].m_FireworkItem);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase E_ITEM_GUNPOWDER:\n\t\t\t\t{\n\t\t\t\t\t// Gunpowder - increase flight time\n\t\t\t\t\ta_Recipe->m_Result.m_FireworkItem.m_FlightTimeInTicks += 20;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase E_ITEM_PAPER: break;\n\t\t\t\tdefault: LOG(\"Unexpected item in firework rocket recipe, was the crafting file's fireworks section changed?\"); break;\n\t\t\t}\n\t\t}\n\t}\n\telse if (a_Recipe->m_Result.m_ItemType == E_ITEM_FIREWORK_STAR)\n\t{\n\t\tstd::vector<int> DyeColours;\n\t\tbool FoundStar = false;\n\n\t\tfor (cRecipeSlots::const_iterator itr = a_Recipe->m_Ingredients.begin(); itr != a_Recipe->m_Ingredients.end(); ++itr)\n\t\t{\n\t\t\tswitch (itr->m_Item.m_ItemType)\n\t\t\t{\n\t\t\t\tcase E_ITEM_FIREWORK_STAR:\n\t\t\t\t{\n\t\t\t\t\t// Result was star, found another star - probably adding fade colours, but copy data over anyhow\n\t\t\t\t\tFoundStar = true;\n\t\t\t\t\tint GridID = (itr->x + a_OffsetX) + a_GridStride * (itr->y + a_OffsetY);\n\t\t\t\t\ta_Recipe->m_Result.m_FireworkItem.CopyFrom(a_CraftingGrid[GridID].m_FireworkItem);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase E_ITEM_DYE:\n\t\t\t\t{\n\t\t\t\t\tint GridID = (itr->x + a_OffsetX) + a_GridStride * (itr->y + a_OffsetY);\n\t\t\t\t\tDyeColours.push_back(cFireworkItem::GetVanillaColourCodeFromDye(static_cast<NIBBLETYPE>(a_CraftingGrid[GridID].m_ItemDamage & 0x0f)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase E_ITEM_GUNPOWDER: break;\n\t\t\t\tcase E_ITEM_DIAMOND: a_Recipe->m_Result.m_FireworkItem.m_HasTrail = true; break;\n\t\t\t\tcase E_ITEM_GLOWSTONE_DUST: a_Recipe->m_Result.m_FireworkItem.m_HasFlicker = true; break;\n\n\t\t\t\tcase E_ITEM_FIRE_CHARGE: a_Recipe->m_Result.m_FireworkItem.m_Type = 1; break;\n\t\t\t\tcase E_ITEM_GOLD_NUGGET: a_Recipe->m_Result.m_FireworkItem.m_Type = 2; break;\n\t\t\t\tcase E_ITEM_FEATHER: a_Recipe->m_Result.m_FireworkItem.m_Type = 4; break;\n\t\t\t\tcase E_ITEM_HEAD: a_Recipe->m_Result.m_FireworkItem.m_Type = 3; break;\n\t\t\t\tdefault: LOG(\"Unexpected item in firework star recipe, was the crafting file's fireworks section changed?\"); break;  // ermahgerd BARD ardmins\n\t\t\t}\n\t\t}\n\n\t\tif (FoundStar && (!DyeColours.empty()))\n\t\t{\n\t\t\t// Found a star and a dye? Fade colours.\n\t\t\ta_Recipe->m_Result.m_FireworkItem.m_FadeColours = DyeColours;\n\t\t}\n\t\telse if (!DyeColours.empty())\n\t\t{\n\t\t\t// Only dye? Normal colours.\n\t\t\ta_Recipe->m_Result.m_FireworkItem.m_Colours = DyeColours;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cCraftingRecipes::HandleDyedLeather(const cItem * a_CraftingGrid, cCraftingRecipes::cRecipe * a_Recipe, int a_GridStride, int a_GridWidth, int a_GridHeight)\n{\n\tshort result_type = a_Recipe->m_Result.m_ItemType;\n\tif ((result_type == E_ITEM_LEATHER_CAP) || (result_type == E_ITEM_LEATHER_TUNIC) || (result_type == E_ITEM_LEATHER_PANTS) || (result_type == E_ITEM_LEATHER_BOOTS))\n\t{\n\t\tbool found = false;\n\t\tcItem temp;\n\n\t\tfloat red = 0;\n\t\tfloat green = 0;\n\t\tfloat blue = 0;\n\t\tfloat dye_count = 0;\n\n\t\tfor (int x = 0; x < a_GridWidth; ++x)\n\t\t{\n\t\t\tfor (int y = 0; y < a_GridHeight; ++y)\n\t\t\t{\n\t\t\t\tint GridIdx = x + a_GridStride * y;\n\t\t\t\tif ((a_CraftingGrid[GridIdx].m_ItemType == result_type) && !found)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\ttemp = a_CraftingGrid[GridIdx].CopyOne();\n\t\t\t\t\t// The original color of the item affects the result\n\t\t\t\t\tif (temp.m_ItemColor.IsValid())\n\t\t\t\t\t{\n\t\t\t\t\t\tred += temp.m_ItemColor.GetRed();\n\t\t\t\t\t\tgreen += temp.m_ItemColor.GetGreen();\n\t\t\t\t\t\tblue += temp.m_ItemColor.GetBlue();\n\t\t\t\t\t\t++dye_count;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (a_CraftingGrid[GridIdx].m_ItemType == E_ITEM_DYE)\n\t\t\t\t{\n\t\t\t\t\tswitch (a_CraftingGrid[GridIdx].m_ItemDamage)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase E_META_DYE_BLACK:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 23;\n\t\t\t\t\t\t\tgreen += 23;\n\t\t\t\t\t\t\tblue += 23;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_RED:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 142;\n\t\t\t\t\t\t\tgreen += 47;\n\t\t\t\t\t\t\tblue += 47;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_GREEN:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 95;\n\t\t\t\t\t\t\tgreen += 118;\n\t\t\t\t\t\t\tblue += 47;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_BROWN:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 95;\n\t\t\t\t\t\t\tgreen += 71;\n\t\t\t\t\t\t\tblue += 47;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_BLUE:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 47;\n\t\t\t\t\t\t\tgreen += 71;\n\t\t\t\t\t\t\tblue += 165;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_PURPLE:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 118;\n\t\t\t\t\t\t\tgreen += 59;\n\t\t\t\t\t\t\tblue += 165;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_CYAN:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 71;\n\t\t\t\t\t\t\tgreen += 118;\n\t\t\t\t\t\t\tblue += 142;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_LIGHTGRAY:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 142;\n\t\t\t\t\t\t\tgreen += 142;\n\t\t\t\t\t\t\tblue += 142;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_GRAY:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 71;\n\t\t\t\t\t\t\tgreen += 71;\n\t\t\t\t\t\t\tblue += 71;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_PINK:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 225;\n\t\t\t\t\t\t\tgreen += 118;\n\t\t\t\t\t\t\tblue += 153;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_LIGHTGREEN:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 118;\n\t\t\t\t\t\t\tgreen += 190;\n\t\t\t\t\t\t\tblue += 23;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_YELLOW:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 213;\n\t\t\t\t\t\t\tgreen += 213;\n\t\t\t\t\t\t\tblue += 47;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_LIGHTBLUE:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 95;\n\t\t\t\t\t\t\tgreen += 142;\n\t\t\t\t\t\t\tblue += 201;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_MAGENTA:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 165;\n\t\t\t\t\t\t\tgreen += 71;\n\t\t\t\t\t\t\tblue += 201;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_ORANGE:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 201;\n\t\t\t\t\t\t\tgreen += 118;\n\t\t\t\t\t\t\tblue += 47;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase E_META_DYE_WHITE:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tred += 237;\n\t\t\t\t\t\t\tgreen += 237;\n\t\t\t\t\t\t\tblue += 237;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t++dye_count;\n\t\t\t\t}\n\t\t\t\telse if (a_CraftingGrid[GridIdx].m_ItemType != E_ITEM_EMPTY)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!found)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Calculate the rgb values\n\t\tdouble maximum = static_cast<double>(std::max({red, green, blue}));\n\n\t\tdouble average_red = red / dye_count;\n\t\tdouble average_green = green / dye_count;\n\t\tdouble average_blue = blue / dye_count;\n\t\tdouble average_max = maximum / dye_count;\n\n\t\tdouble max_average = std::max({average_red, average_green, average_blue});\n\n\t\tdouble gain_factor = average_max / max_average;\n\n\n\t\tunsigned char result_red = static_cast<unsigned char>(average_red * gain_factor);\n\t\tunsigned char result_green = static_cast<unsigned char>(average_green * gain_factor);\n\t\tunsigned char result_blue = static_cast<unsigned char>(average_blue * gain_factor);\n\n\t\t// Set the results values\n\t\ta_Recipe->m_Result = temp;\n\t\ta_Recipe->m_Result.m_ItemColor.SetColor(result_red, result_green, result_blue);\n\t}\n}\n"
  },
  {
    "path": "src/CraftingRecipes.h",
    "content": "\n// CraftingRecipes.h\n\n// Interfaces to the cCraftingRecipes class representing the storage of crafting recipes\n\n\n\n\n#pragma once\n\n#include \"Item.h\"\n\n// fwd: cPlayer.h\nclass cPlayer;\n\n\n\n\n\nclass cCraftingGrid  // tolua_export\n{  // tolua_export\npublic:\n\tcCraftingGrid(const cCraftingGrid & a_Original);\n\tcCraftingGrid(int a_Width, int a_Height);  // tolua_export\n\tcCraftingGrid(const cItem * a_Items, int a_Width, int a_Height);\n\t~cCraftingGrid();\n\n\t// tolua_begin\n\tint     GetWidth (void) const {return m_Width; }\n\tint     GetHeight(void) const {return m_Height; }\n\tcItem & GetItem  (int x, int y) const;\n\tvoid    SetItem  (int x, int y, ENUM_ITEM_TYPE a_ItemType, char a_ItemCount, short a_ItemHealth);\n\tvoid    SetItem  (int x, int y, const cItem & a_Item);\n\tvoid    Clear    (void);\n\n\t/** Removes items in a_Grid from m_Items[] (used by cCraftingRecipe::ConsumeIngredients()) */\n\tvoid ConsumeGrid(const cCraftingGrid & a_Grid);\n\n\t/** Dumps the entire crafting grid using LOGD() */\n\tvoid Dump(void);\n\n\t// tolua_end\n\n\tcItem * GetItems(void) const {return m_Items; }\n\n\t/** Copies internal contents into the item array specified. Assumes that the array has the same dimensions as self */\n\tvoid  CopyToItems(cItem * a_Items) const;\n\nprotected:\n\n\tint     m_Width;\n\tint     m_Height;\n\tcItem * m_Items;\n} ;  // tolua_export\n\n\n\n\n\nclass cCraftingRecipe  // tolua_export\n{  // tolua_export\npublic:\n\tcCraftingRecipe(const cCraftingGrid & a_CraftingGrid);\n\n\t// tolua_begin\n\tvoid          Clear               (void);\n\tint           GetIngredientsWidth (void) const {return m_Ingredients.GetWidth(); }\n\tint           GetIngredientsHeight(void) const {return m_Ingredients.GetHeight(); }\n\tcItem &       GetIngredient       (int x, int y) const {return m_Ingredients.GetItem(x, y); }\n\tconst cItem & GetResult           (void) const {return m_Result; }\n\tvoid          SetResult           (ENUM_ITEM_TYPE a_ItemType, char a_ItemCount, short a_ItemHealth);\n\tvoid          SetResult           (const cItem & a_Item)\n\t{\n\t\tm_Result = a_Item;\n\t}\n\n\tvoid          SetIngredient       (int x, int y, ENUM_ITEM_TYPE a_ItemType, char a_ItemCount, short a_ItemHealth)\n\t{\n\t\tm_Ingredients.SetItem(x, y, a_ItemType, a_ItemCount, a_ItemHealth);\n\t}\n\n\tvoid          SetIngredient       (int x, int y, const cItem & a_Item)\n\t{\n\t\tm_Ingredients.SetItem(x, y, a_Item);\n\t}\n\n\t/** Consumes ingredients from the crafting grid specified */\n\tvoid ConsumeIngredients(cCraftingGrid & a_CraftingGrid);\n\n\t/** Dumps the entire recipe using LOGD() */\n\tvoid Dump(void);\n\t// tolua_end\n\nprotected:\n\n\tcCraftingGrid m_Ingredients;  // Adjusted to correspond to the input crafting grid!\n\tcItem         m_Result;\n} ;  // tolua_export\n\n\n\n\n/**\nThe crafting recipes are the configurations to build a result item out of a set\nof ingredient items.\n\nThe recipes are configured in the `crafting.txt`. When populating the crafting\ngrid in game (inventory or crafting table), the items are compared to the\ningredients to find a matching recipe and show and craft the result.\n\nEach recipe is defined via the result, the ingredients and the minecraft recipe\nname.\n\nTo handle the crafting recipes internally efficient the vector index of the\n`cRecipes` is used as `RecipeId`.\n*/\nclass cCraftingRecipes\n{\npublic:\n\tstatic const int MAX_GRID_WIDTH  = 3;\n\tstatic const int MAX_GRID_HEIGHT = 3;\n\n\tcCraftingRecipes(void);\n\t~cCraftingRecipes();\n\n\t/** Returns the recipe for current crafting grid. Doesn't modify the grid. Clears a_Recipe if no recipe found. */\n\tvoid GetRecipe(cPlayer & a_Player, cCraftingGrid & a_CraftingGrid, cCraftingRecipe & a_Recipe);\n\n\t/** Find recipes and returns the RecipeIds which contain the new item and all ingredients are in the known items */\n\tstd::vector<UInt32> FindNewRecipesForItem(const cItem & a_Item, const std::set<cItem, cItem::sItemCompare> & a_KnownItems);\n\n\tstruct cRecipeSlot\n\t{\n\t\tcItem m_Item;\n\t\tint x, y;  // 1..3, or -1 for \"any\"\n\t} ;\n\ttypedef std::vector<cRecipeSlot> cRecipeSlots;\n\n\t/** A single recipe, stored. Each recipe is normalized right after parsing (NormalizeIngredients())\n\tA normalized recipe starts at (0, 0) */\n\tstruct cRecipe\n\t{\n\t\tcRecipeSlots m_Ingredients;\n\t\tcItem        m_Result;\n\t\tAString      m_RecipeName;\n\n\t\t// Size of the regular items in the recipe; \"anywhere\" items are excluded:\n\t\tint m_Width;\n\t\tint m_Height;\n\t} ;\n\n\t/** Returns the recipe by id */\n\tcRecipe * GetRecipeById(UInt32 a_RecipeId);\n\n\t/** Gets a map of all recipes with name and recipe id */\n\tconst std::map<AString, UInt32> & GetRecipeNameMap();\n\nprotected:\n\n\ttypedef std::vector<cRecipe *> cRecipes;\n\n\tcRecipes m_Recipes;\n\n\tvoid LoadRecipes(void);\n\tvoid ClearRecipes(void);\n\n\t/** Parses the recipe line and adds it into m_Recipes. a_LineNum is used for diagnostic warnings only */\n\tvoid AddRecipeLine(int a_LineNum, const AString & a_RecipeLine);\n\n\t/** Parses an item string in the format \"<ItemType>[^<Damage>]\", returns true if successful. */\n\tbool ParseItem(const AString & a_String, cItem & a_Item);\n\n\t/** Parses one ingredient and adds it to the specified recipe. Returns true if successful. */\n\tbool ParseIngredient(const AString & a_String, cRecipe * a_Recipe);\n\n\t/** Moves the recipe to top-left corner, sets its MinWidth / MinHeight */\n\tvoid NormalizeIngredients(cRecipe * a_Recipe);\n\n\t/** Finds a recipe matching the crafting grid. Returns a newly allocated recipe (with all its coords set) or nullptr if not found. Caller must delete return value! */\n\tcRecipe * FindRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight);\n\n\t/** Same as FindRecipe, but the grid is guaranteed to be of minimal dimensions needed */\n\tcRecipe * FindRecipeCropped(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride);\n\n\t/** Checks if the grid matches the specified recipe, offset by the specified offsets. Returns a matched cRecipe * if so, or nullptr if not matching. Caller must delete the return value! */\n\tcRecipe * MatchRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride, const cRecipe * a_Recipe, int a_OffsetX, int a_OffsetY);\n\n\t/** Searches for anything firework related, and does the data setting if appropriate */\n\tvoid HandleFireworks(const cItem * a_CraftingGrid, cCraftingRecipes::cRecipe * a_Recipe, int a_GridStride, int a_OffsetX, int a_OffsetY);\n\n\t/** Searches for anything dye related for leather, calculates the appropriate color value, and sets the resulting value. */\n\tvoid HandleDyedLeather(const cItem * a_CraftingGrid, cCraftingRecipes::cRecipe * a_Recipe, int a_GridStride, int a_GridWidth, int a_GridHeight);\n\nprivate:\n\t/** Mapping the minecraft recipe names to the internal cuberite recipe Ids */\n\tstd::map<AString, UInt32> m_RecipeNameMap;\n\n\t/**\n\tChecks if all ingredients of the a_Recipe are within the a_KnownItems list and\n\tif the a_NewItem is part of the ingredients.\n\tThis makes sure to only find 'newly discovered' recipes.\n\t*/\n\tbool IsNewCraftableRecipe(\n\t\tconst cRecipe * a_Recipe,\n\t\tconst cItem & a_NewItem,\n\t\tconst std::set<cItem, cItem::sItemCompare> & a_KnownItems\n\t);\n\n\t/** Populates the RecipeNameMap */\n\tvoid PopulateRecipeNameMap(void);\n} ;\n"
  },
  {
    "path": "src/Cuboid.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Cuboid.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCuboid:\n\nvoid cCuboid::Assign(Vector3i a_Point1, Vector3i a_Point2)\n{\n\tp1 = a_Point1;\n\tp2 = a_Point2;\n}\n\n\n\n\n\nvoid cCuboid::Sort(void)\n{\n\tif (p1.x > p2.x)\n\t{\n\t\tstd::swap(p1.x, p2.x);\n\t}\n\tif (p1.y > p2.y)\n\t{\n\t\tstd::swap(p1.y, p2.y);\n\t}\n\tif (p1.z > p2.z)\n\t{\n\t\tstd::swap(p1.z, p2.z);\n\t}\n}\n\n\n\n\n\nint cCuboid::GetVolume(void) const\n{\n\tint DifX = abs(p2.x - p1.x) + 1;\n\tint DifY = abs(p2.y - p1.y) + 1;\n\tint DifZ = abs(p2.z - p1.z) + 1;\n\treturn DifX * DifY * DifZ;\n}\n\n\n\n\n\nbool cCuboid::IsCompletelyInside(const cCuboid & a_Outer) const\n{\n\tASSERT(IsSorted());\n\tASSERT(a_Outer.IsSorted());\n\n\treturn (\n\t\t(p1.x >= a_Outer.p1.x) &&\n\t\t(p2.x <= a_Outer.p2.x) &&\n\t\t(p1.y >= a_Outer.p1.y) &&\n\t\t(p2.y <= a_Outer.p2.y) &&\n\t\t(p1.z >= a_Outer.p1.z) &&\n\t\t(p2.z <= a_Outer.p2.z)\n\t);\n}\n\n\n\n\n\nvoid cCuboid::Move(Vector3i a_Offset)\n{\n\tp1.Move(a_Offset);\n\tp2.Move(a_Offset);\n}\n\n\n\n\n\nvoid cCuboid::Expand(int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ)\n{\n\tif (p1.x < p2.x)\n\t{\n\t\tp1.x -= a_SubMinX;\n\t\tp2.x += a_AddMaxX;\n\t}\n\telse\n\t{\n\t\tp2.x -= a_SubMinX;\n\t\tp1.x += a_AddMaxX;\n\t}\n\n\tif (p1.y < p2.y)\n\t{\n\t\tp1.y -= a_SubMinY;\n\t\tp2.y += a_AddMaxY;\n\t}\n\telse\n\t{\n\t\tp2.y -= a_SubMinY;\n\t\tp1.y += a_AddMaxY;\n\t}\n\n\tif (p1.z < p2.z)\n\t{\n\t\tp1.z -= a_SubMinZ;\n\t\tp2.z += a_AddMaxZ;\n\t}\n\telse\n\t{\n\t\tp2.z -= a_SubMinZ;\n\t\tp1.z += a_AddMaxZ;\n\t}\n}\n\n\n\n\n\nvoid cCuboid::Clamp(const cCuboid & a_Limits)\n{\n\tASSERT(IsSorted());\n\tASSERT(a_Limits.IsSorted());\n\n\tp1.x = ::Clamp(p1.x, a_Limits.p1.x, a_Limits.p2.x);\n\tp1.y = ::Clamp(p1.y, a_Limits.p1.y, a_Limits.p2.y);\n\tp1.z = ::Clamp(p1.z, a_Limits.p1.z, a_Limits.p2.z);\n\tp2.x = ::Clamp(p2.x, a_Limits.p1.x, a_Limits.p2.x);\n\tp2.y = ::Clamp(p2.y, a_Limits.p1.y, a_Limits.p2.y);\n\tp2.z = ::Clamp(p2.z, a_Limits.p1.z, a_Limits.p2.z);\n}\n\n\n\n\n\nvoid cCuboid::ClampSize(Vector3i a_MaxSize)\n{\n\tASSERT(IsSorted());\n\n\tif (p2.x - p1.x > a_MaxSize.x)\n\t{\n\t\tp2.x = p1.x + a_MaxSize.x;\n\t}\n\tif (p2.y - p1.y > a_MaxSize.y)\n\t{\n\t\tp2.y = p1.y + a_MaxSize.y;\n\t}\n\tif (p2.z - p1.z > a_MaxSize.z)\n\t{\n\t\tp2.z = p1.z + a_MaxSize.z;\n\t}\n}\n\n\n\n\n\nvoid cCuboid::ClampX(int a_MinX, int a_MaxX)\n{\n\tp1.x = ::Clamp(p1.x, a_MinX, a_MaxX);\n\tp2.x = ::Clamp(p2.x, a_MinX, a_MaxX);\n}\n\n\n\n\n\nvoid cCuboid::ClampY(int a_MinY, int a_MaxY)\n{\n\tp1.y = ::Clamp(p1.y, a_MinY, a_MaxY);\n\tp2.y = ::Clamp(p2.y, a_MinY, a_MaxY);\n}\n\n\n\n\n\nvoid cCuboid::ClampZ(int a_MinZ, int a_MaxZ)\n{\n\tp1.z = ::Clamp(p1.z, a_MinZ, a_MaxZ);\n\tp2.z = ::Clamp(p2.z, a_MinZ, a_MaxZ);\n}\n\n\n\n\n\nbool cCuboid::IsSorted(void) const\n{\n\treturn (\n\t\t(p1.x <= p2.x) &&\n\t\t(p1.y <= p2.y) &&\n\t\t(p1.z <= p2.z)\n\t);\n}\n\n\n\n\n\nvoid cCuboid::Engulf(Vector3i a_Point)\n{\n\tif (a_Point.x < p1.x)\n\t{\n\t\tp1.x = a_Point.x;\n\t}\n\telse if (a_Point.x > p2.x)\n\t{\n\t\tp2.x = a_Point.x;\n\t}\n\n\tif (a_Point.y < p1.y)\n\t{\n\t\tp1.y = a_Point.y;\n\t}\n\telse if (a_Point.y > p2.y)\n\t{\n\t\tp2.y = a_Point.y;\n\t}\n\n\tif (a_Point.z < p1.z)\n\t{\n\t\tp1.z = a_Point.z;\n\t}\n\telse if (a_Point.z > p2.z)\n\t{\n\t\tp2.z = a_Point.z;\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/Cuboid.h",
    "content": "\n#pragma once\n\n\n\n\n\n// tolua_begin\nclass cCuboid\n{\npublic:\n\t// p1 is expected to have the smaller of the coords; Sort() swaps coords to match this\n\tVector3i p1, p2;\n\n\tcCuboid(void) {}\n\tcCuboid(Vector3i a_p1, Vector3i a_p2) : p1(a_p1), p2(a_p2) {}\n\tcCuboid(int a_X1, int a_Y1, int a_Z1) : p1(a_X1, a_Y1, a_Z1), p2(a_X1, a_Y1, a_Z1) {}\n\n\t#ifdef TOLUA_EXPOSITION  // tolua isn't aware of implicitly generated copy constructors\n\t\tcCuboid(const cCuboid & a_Cuboid);\n\t#endif\n\n\t// tolua_end\n\t// Exported in ManualBindings.cpp to support the old deprecated coord-based overload.\n\n\tvoid Assign(Vector3i a_Point1, Vector3i a_Point2);\n\tvoid Assign(const cCuboid & a_SrcCuboid) { *this = a_SrcCuboid; }\n\n\t// tolua_begin\n\n\tvoid Sort(void);\n\n\tint DifX(void) const { return p2.x - p1.x; }\n\tint DifY(void) const { return p2.y - p1.y; }\n\tint DifZ(void) const { return p2.z - p1.z; }\n\n\t/** Returns the volume of the cuboid, in blocks.\n\tNote that the volume considers both coords inclusive.\n\tWorks on unsorted cuboids, too. */\n\tint GetVolume(void) const;\n\n\t/** Returns true if the cuboids have at least one voxel in common. Both coords are considered inclusive.\n\tAssumes both cuboids are sorted. */\n\tinline bool DoesIntersect(const cCuboid & a_Other) const\n\t{\n\t\tASSERT(IsSorted());\n\t\tASSERT(a_Other.IsSorted());\n\n\t\t// In order for cuboids to intersect, each of their coord intervals need to intersect\n\t\treturn (\n\t\t\tDoIntervalsIntersect(p1.x, p2.x, a_Other.p1.x, a_Other.p2.x) &&\n\t\t\tDoIntervalsIntersect(p1.y, p2.y, a_Other.p1.y, a_Other.p2.y) &&\n\t\t\tDoIntervalsIntersect(p1.z, p2.z, a_Other.p1.z, a_Other.p2.z)\n\t\t);\n\t}\n\n\t// tolua_end\n\t// Exported in ManualBindings.cpp to support the old deprecated coord-based overload.\n\n\tbool IsInside(Vector3i v) const\n\t{\n\t\treturn (\n\t\t\t(v.x >= p1.x) && (v.x <= p2.x) &&\n\t\t\t(v.y >= p1.y) && (v.y <= p2.y) &&\n\t\t\t(v.z >= p1.z) && (v.z <= p2.z)\n\t\t);\n\t}\n\n\tbool IsInside(Vector3d v) const\n\t{\n\t\treturn (\n\t\t\t(v.x >= p1.x) && (v.x <= p2.x) &&\n\t\t\t(v.y >= p1.y) && (v.y <= p2.y) &&\n\t\t\t(v.z >= p1.z) && (v.z <= p2.z)\n\t\t);\n\t}\n\n\t// tolua_begin\n\n\t/** Returns true if this cuboid is completely inside the specified cuboid (in all 6 coords).\n\tAssumes both cuboids are sorted. */\n\tbool IsCompletelyInside(const cCuboid & a_Outer) const;\n\n\t// tolua_end\n\n\t/** Moves the cuboid by the specified offset.\n\tExported in ManualBindings to support the old deprecated coord-based overload. */\n\tvoid Move(Vector3i a_Offset);\n\n\t// tolua_begin\n\n\t/** Expands the cuboid by the specified amount in each direction.\n\tWorks on unsorted cuboids as well.\n\tNote that this function doesn't check for underflows when using negative amounts. */\n\tvoid Expand(int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ);\n\n\t/** Clamps this cuboid, so that it doesn't reach outside of a_Limits in any direction.\n\tAssumes both this and a_Limits are sorted. */\n\tvoid Clamp(const cCuboid & a_Limits);\n\n\t/** Clamps this cuboid's p2 so that the cuboid's size doesn't exceed the specified max size.\n\tAssumes this cuboid is sorted. */\n\tvoid ClampSize(Vector3i a_MaxSize);\n\n\t/** Clamps both X coords to the specified range. Works on unsorted cuboids, too. */\n\tvoid ClampX(int a_MinX, int a_MaxX);\n\n\t/** Clamps both Y coords to the specified range. Works on unsorted cuboids, too. */\n\tvoid ClampY(int a_MinY, int a_MaxY);\n\n\t/** Clamps both Z coords to the specified range. Works on unsorted cuboids, too. */\n\tvoid ClampZ(int a_MinZ, int a_MaxZ);\n\n\t/** Returns true if the coords are properly sorted (lesser in p1, greater in p2) */\n\tbool IsSorted(void) const;\n\n\t/** If needed, expands the cuboid so that it contains the specified point. Assumes sorted. Doesn't contract. */\n\tvoid Engulf(Vector3i a_Point);\n\n\t// tolua_end\n\n\t/** Checks the two cuboids for equality. */\n\tbool operator == (const cCuboid & aOther) const\n\t{\n\t\treturn (\n\t\t\t(p1.x == aOther.p1.x) &&\n\t\t\t(p1.y == aOther.p1.y) &&\n\t\t\t(p1.z == aOther.p1.z) &&\n\t\t\t(p2.x == aOther.p2.x) &&\n\t\t\t(p2.y == aOther.p2.y) &&\n\t\t\t(p2.z == aOther.p2.z)\n\t\t);\n\t}\n\n\tbool operator != (const cCuboid & aOther) const\n\t{\n\t\treturn !operator ==(aOther);\n\t}\n\n\n\t// tolua_begin\n\nprivate:\n\n\t/** Returns true if the two specified intervals have a non-empty union */\n\tinline static bool DoIntervalsIntersect(int a_Min1, int a_Max1, int a_Min2, int a_Max2)\n\t{\n\t\tASSERT(a_Min1 <= a_Max1);\n\t\tASSERT(a_Min2 <= a_Max2);\n\t\treturn ((a_Min1 <= a_Max2) && (a_Max1 >= a_Min2));\n\t}\n\n} ;\n// tolua_end\n\n\n\n\n"
  },
  {
    "path": "src/DeadlockDetect.cpp",
    "content": "\n// DeadlockDetect.cpp\n\n// Declares the cDeadlockDetect class that tries to detect deadlocks and aborts the server when it detects one\n\n#include \"Globals.h\"\n#include \"DeadlockDetect.h\"\n#include \"Root.h\"\n#include \"World.h\"\n#include <cstdlib>\n\n\n\n\n\n/** Number of milliseconds per cycle */\nconst int CYCLE_MILLISECONDS = 100;\n\n\n\n\n\ncDeadlockDetect::cDeadlockDetect(void) :\n\tSuper(\"Deadlock Detector\"),\n\tm_IntervalSec(1000)\n{\n}\n\n\n\n\n\ncDeadlockDetect::~cDeadlockDetect()\n{\n\t// Check that all tracked CSs have been removed, report any remaining:\n\tcCSLock lock(m_CS);\n\tif (!m_TrackedCriticalSections.empty())\n\t{\n\t\tLOGWARNING(\"DeadlockDetect: Some CS objects (%u) haven't been removed from tracking\", static_cast<unsigned>(m_TrackedCriticalSections.size()));\n\t\tfor (const auto & tcs: m_TrackedCriticalSections)\n\t\t{\n\t\t\tLOGWARNING(\"  CS %p / %s\",\n\t\t\t\tstatic_cast<void *>(tcs.first),\n\t\t\t\ttcs.second.c_str()\n\t\t\t);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cDeadlockDetect::Start(int a_IntervalSec)\n{\n\tm_IntervalSec = a_IntervalSec;\n\n\t// Read the initial world data:\n\tcRoot::Get()->ForEachWorld([=](cWorld & a_World)\n\t{\n\t\tSetWorldAge(a_World.GetName(), a_World.GetWorldAge());\n\t\treturn false;\n\t});\n\n\tSuper::Start();\n}\n\n\n\n\n\nvoid cDeadlockDetect::TrackCriticalSection(cCriticalSection & a_CS, const AString & a_Name)\n{\n\tcCSLock lock(m_CS);\n\tm_TrackedCriticalSections.emplace_back(&a_CS, a_Name);\n}\n\n\n\n\n\nvoid cDeadlockDetect::UntrackCriticalSection(cCriticalSection & a_CS)\n{\n\tcCSLock lock(m_CS);\n\tfor (auto itr = m_TrackedCriticalSections.begin(), end = m_TrackedCriticalSections.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->first == &a_CS)\n\t\t{\n\t\t\tm_TrackedCriticalSections.erase(itr);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cDeadlockDetect::Execute(void)\n{\n\t// Loop until the signal to terminate:\n\twhile (!m_ShouldTerminate)\n\t{\n\t\t// Check the world ages:\n\t\tcRoot::Get()->ForEachWorld([=](cWorld & a_World)\n\t\t{\n\t\t\tCheckWorldAge(a_World.GetName(), a_World.GetWorldAge());\n\t\t\treturn false;\n\t\t});\n\n\t\tstd::this_thread::sleep_for(std::chrono::milliseconds(CYCLE_MILLISECONDS));\n\t}  // while (should run)\n}\n\n\n\n\n\nvoid cDeadlockDetect::SetWorldAge(const AString & a_WorldName, const cTickTimeLong a_Age)\n{\n\tm_WorldAges[a_WorldName].m_Age = a_Age;\n\tm_WorldAges[a_WorldName].m_NumCyclesSame = 0;\n}\n\n\n\n\n\nvoid cDeadlockDetect::CheckWorldAge(const AString & a_WorldName, const cTickTimeLong a_Age)\n{\n\tWorldAges::iterator itr = m_WorldAges.find(a_WorldName);\n\tif (itr == m_WorldAges.end())\n\t{\n\t\tSetWorldAge(a_WorldName, a_Age);\n\t\treturn;\n\t}\n\n\tcDeadlockDetect::sWorldAge & WorldAge = itr->second;\n\n\tif (WorldAge.m_Age == a_Age)\n\t{\n\t\tWorldAge.m_NumCyclesSame += 1;\n\t\tif (WorldAge.m_NumCyclesSame > (m_IntervalSec * 1000) / CYCLE_MILLISECONDS)\n\t\t{\n\t\t\tDeadlockDetected(a_WorldName, a_Age);\n\t\t}\n\t}\n\telse\n\t{\n\t\tWorldAge.m_Age = a_Age;\n\t\tWorldAge.m_NumCyclesSame = 0;\n\t}\n}\n\n\n\n\n\nvoid cDeadlockDetect::DeadlockDetected(const AString & a_WorldName, const cTickTimeLong a_WorldAge)\n{\n\tLOGERROR(\"Deadlock detected: world %s has been stuck at age %lld. Aborting the server.\",\n\t\ta_WorldName.c_str(), static_cast<long long>(a_WorldAge.count())\n\t);\n\tListTrackedCSs();\n\tASSERT(!\"Deadlock detected\");\n\tstd::abort();\n}\n\n\n\n\n\nvoid cDeadlockDetect::ListTrackedCSs(void)\n{\n\tcCSLock lock(m_CS);\n\tfor (const auto & cs: m_TrackedCriticalSections)\n\t{\n\t\tLOG(\"CS at %p, %s: RecursionCount = %d, ThreadIDHash = %04llx\",\n\t\t\tstatic_cast<void *>(cs.first), cs.second.c_str(),\n\t\t\tcs.first->m_RecursionCount, static_cast<UInt64>(std::hash<std::thread::id>()(cs.first->m_OwningThreadID))\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "src/DeadlockDetect.h",
    "content": "\n// DeadlockDetect.h\n\n// Declares the cDeadlockDetect class that tries to detect deadlocks and aborts the server when it detects one\n\n/*\nThis class simply monitors each world's m_WorldAge, which is expected to grow on each tick.\nIf the world age doesn't grow for several seconds, it's either because the server is Super-overloaded,\nor because the world tick thread hangs in a deadlock. We presume the latter and therefore kill the server.\nOnce we learn to write crashdumps programmatically, we should do so just before killing, to enable debugging.\n*/\n\n\n\n#pragma once\n\n#include \"OSSupport/IsThread.h\"\n\n\n\n\n\nclass cDeadlockDetect:\n\tpublic cIsThread\n{\n\tusing Super = cIsThread;\n\npublic:\n\n\tcDeadlockDetect();\n\tvirtual ~cDeadlockDetect() override;\n\n\t/** Starts the detection. Hides cIsThread's Start, because we need some initialization */\n\tvoid Start(int a_IntervalSec);\n\n\t/** Adds the critical section for tracking.\n\tTracked CSs are listed, together with ownership details, when a deadlock is detected.\n\tA tracked CS must be untracked before it is destroyed.\n\ta_Name is an arbitrary name that is listed along with the CS in the output. */\n\tvoid TrackCriticalSection(cCriticalSection & a_CS, const AString & a_Name);\n\n\t/** Removes the CS from the tracking. */\n\tvoid UntrackCriticalSection(cCriticalSection & a_CS);\n\nprotected:\n\tstruct sWorldAge\n\t{\n\t\t/** Last m_WorldAge that has been detected in this world */\n\t\tcTickTimeLong m_Age;\n\n\t\t/** Number of cycles for which the age has been the same */\n\t\tint m_NumCyclesSame;\n\t} ;\n\n\t/** Maps world name -> sWorldAge */\n\ttypedef std::map<AString, sWorldAge> WorldAges;\n\n\t/** Protects m_TrackedCriticalSections from multithreaded access. */\n\tcCriticalSection m_CS;\n\n\t/** CriticalSections that are tracked (their status output on deadlock).\n\tProtected against multithreaded access by m_CS. */\n\tstd::vector<std::pair<cCriticalSection *, AString>> m_TrackedCriticalSections;\n\n\tWorldAges m_WorldAges;\n\n\t/** Number of secods for which the ages must be the same for the detection to trigger */\n\tint m_IntervalSec;\n\n\n\t// cIsThread overrides:\n\tvirtual void Execute(void) override;\n\n\t/** Sets the initial world age. */\n\tvoid SetWorldAge(const AString & a_WorldName, cTickTimeLong a_Age);\n\n\t/** Checks if the world's age has changed, updates the world's stats; calls DeadlockDetected() if deadlock detected. */\n\tvoid CheckWorldAge(const AString & a_WorldName, cTickTimeLong a_Age);\n\n\t/** Called when a deadlock is detected in a world. Aborts the server.\n\ta_WorldName is the name of the world whose age has triggered the detection.\n\ta_WorldAge is the age (in ticks) in which the world is stuck. */\n\t[[noreturn]] void DeadlockDetected(const AString & a_WorldName, cTickTimeLong a_WorldAge);\n\n\t/** Outputs a listing of the tracked CSs, together with their name and state. */\n\tvoid ListTrackedCSs();\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Defines.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"Defines.h\"\n#include \"BlockType.h\"\n\n\n\n\n\nconst char * ClickActionToString(int a_ClickAction)\n{\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caLeftClick:                    return \"caLeftClick\";\n\t\tcase caRightClick:                   return \"caRightClick\";\n\t\tcase caShiftLeftClick:               return \"caShiftLeftClick\";\n\t\tcase caShiftRightClick:              return \"caShiftRightClick\";\n\t\tcase caNumber1:                      return \"caNumber1\";\n\t\tcase caNumber2:                      return \"caNumber2\";\n\t\tcase caNumber3:                      return \"caNumber3\";\n\t\tcase caNumber4:                      return \"caNumber4\";\n\t\tcase caNumber5:                      return \"caNumber5\";\n\t\tcase caNumber6:                      return \"caNumber6\";\n\t\tcase caNumber7:                      return \"caNumber7\";\n\t\tcase caNumber8:                      return \"caNumber8\";\n\t\tcase caNumber9:                      return \"caNumber9\";\n\t\tcase caMiddleClick:                  return \"caMiddleClick\";\n\t\tcase caDropKey:                      return \"caDropKey\";\n\t\tcase caCtrlDropKey:                  return \"caCtrlDropKey\";\n\t\tcase caLeftClickOutside:             return \"caLeftClickOutside\";\n\t\tcase caRightClickOutside:            return \"caRightClickOutside\";\n\t\tcase caLeftClickOutsideHoldNothing:  return \"caLeftClickOutsideHoldNothing\";\n\t\tcase caRightClickOutsideHoldNothing: return \"caRightClickOutsideHoldNothing\";\n\t\tcase caLeftPaintBegin:               return \"caLeftPaintBegin\";\n\t\tcase caRightPaintBegin:              return \"caRightPaintBegin\";\n\t\tcase caMiddlePaintBegin:             return \"caMiddlePaintBegin\";\n\t\tcase caLeftPaintProgress:            return \"caLeftPaintProgress\";\n\t\tcase caRightPaintProgress:           return \"caRightPaintProgress\";\n\t\tcase caMiddlePaintProgress:          return \"caMiddlePaintProgress\";\n\t\tcase caLeftPaintEnd:                 return \"caLeftPaintEnd\";\n\t\tcase caRightPaintEnd:                return \"caRightPaintEnd\";\n\t\tcase caMiddlePaintEnd:               return \"caMiddlePaintEnd\";\n\t\tcase caDblClick:                     return \"caDblClick\";\n\t\tcase caUnknown:                      return \"caUnknown\";\n\t}\n\tUNREACHABLE(\"Unknown click action\");\n}\n\n\n\n\n\n/** Returns a blockface mirrored around the Y axis (doesn't change up / down). */\neBlockFace MirrorBlockFaceY(eBlockFace a_BlockFace)\n{\n\tswitch (a_BlockFace)\n\t{\n\t\tcase BLOCK_FACE_XM: return BLOCK_FACE_XP;\n\t\tcase BLOCK_FACE_XP: return BLOCK_FACE_XM;\n\t\tcase BLOCK_FACE_ZM: return BLOCK_FACE_ZP;\n\t\tcase BLOCK_FACE_ZP: return BLOCK_FACE_ZM;\n\t\tcase BLOCK_FACE_NONE:\n\t\tcase BLOCK_FACE_YM:\n\t\tcase BLOCK_FACE_YP:\n\t\t{\n\t\t\treturn a_BlockFace;\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported block face\");\n}\n\n\n\n\n\n/** Returns a blockface rotated around the Y axis counter-clockwise. */\neBlockFace RotateBlockFaceCCW(eBlockFace a_BlockFace)\n{\n\tswitch (a_BlockFace)\n\t{\n\t\tcase BLOCK_FACE_XM: return BLOCK_FACE_ZP;\n\t\tcase BLOCK_FACE_XP: return BLOCK_FACE_ZM;\n\t\tcase BLOCK_FACE_ZM: return BLOCK_FACE_XM;\n\t\tcase BLOCK_FACE_ZP: return BLOCK_FACE_XP;\n\t\tcase BLOCK_FACE_NONE:\n\t\tcase BLOCK_FACE_YM:\n\t\tcase BLOCK_FACE_YP:\n\t\t{\n\t\t\treturn a_BlockFace;\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported block face\");\n}\n\n\n\n\n\neBlockFace RotateBlockFaceCW(eBlockFace a_BlockFace)\n{\n\tswitch (a_BlockFace)\n\t{\n\t\tcase BLOCK_FACE_XM: return BLOCK_FACE_ZM;\n\t\tcase BLOCK_FACE_XP: return BLOCK_FACE_ZP;\n\t\tcase BLOCK_FACE_ZM: return BLOCK_FACE_XP;\n\t\tcase BLOCK_FACE_ZP: return BLOCK_FACE_XM;\n\t\tcase BLOCK_FACE_NONE:\n\t\tcase BLOCK_FACE_YM:\n\t\tcase BLOCK_FACE_YP:\n\t\t{\n\t\t\treturn a_BlockFace;\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported block face\");\n}\n\n\n\n\n\neBlockFace ReverseBlockFace(eBlockFace  a_BlockFace)\n{\n\tswitch (a_BlockFace)\n\t{\n\t\tcase BLOCK_FACE_YP:   return BLOCK_FACE_YM;\n\t\tcase BLOCK_FACE_XP:   return BLOCK_FACE_XM;\n\t\tcase BLOCK_FACE_ZP:   return BLOCK_FACE_ZM;\n\t\tcase BLOCK_FACE_YM:   return BLOCK_FACE_YP;\n\t\tcase BLOCK_FACE_XM:   return BLOCK_FACE_XP;\n\t\tcase BLOCK_FACE_ZM:   return BLOCK_FACE_ZP;\n\t\tcase BLOCK_FACE_NONE: return a_BlockFace;\n\t}\n\tUNREACHABLE(\"Unsupported block face\");\n}\n\n\n\n\n\n/** Returns the textual representation of the BlockFace constant. */\nAString BlockFaceToString(eBlockFace a_BlockFace)\n{\n\tswitch (a_BlockFace)\n\t{\n\t\tcase BLOCK_FACE_XM: return \"BLOCK_FACE_XM\";\n\t\tcase BLOCK_FACE_XP: return \"BLOCK_FACE_XP\";\n\t\tcase BLOCK_FACE_YM: return \"BLOCK_FACE_YM\";\n\t\tcase BLOCK_FACE_YP: return \"BLOCK_FACE_YP\";\n\t\tcase BLOCK_FACE_ZM: return \"BLOCK_FACE_ZM\";\n\t\tcase BLOCK_FACE_ZP: return \"BLOCK_FACE_ZP\";\n\t\tcase BLOCK_FACE_NONE: return \"BLOCK_FACE_NONE\";\n\t}\n\tUNREACHABLE(\"Unsupported block face\");\n}\n\n\n\n\n\nbool IsValidBlock(int a_BlockType)\n{\n\treturn (\n\t\t((a_BlockType > -1) && (a_BlockType <= E_BLOCK_MAX_TYPE_ID)) ||\n\t\t(a_BlockType == 255)  // the blocks 253-254 don't exist yet -> https://minecraft.wiki/w/Data_values#Block_IDs\n\t);\n}\n\n\n\n\n\nbool IsValidItem(int a_ItemType)\n{\n\tif (\n\t\t((a_ItemType >= E_ITEM_FIRST) && (a_ItemType <= E_ITEM_MAX_CONSECUTIVE_TYPE_ID)) ||  // Basic items range\n\t\t((a_ItemType >= E_ITEM_FIRST_DISC) && (a_ItemType <= E_ITEM_LAST_DISC))   // Music discs' special range\n\t)\n\t{\n\t\treturn true;\n\t}\n\n\tif (a_ItemType == 0)\n\t{\n\t\treturn false;\n\t}\n\n\treturn IsValidBlock(a_ItemType);\n}\n\n\n\n\n\neDimension StringToDimension(const AString & a_DimensionString)\n{\n\t// First try decoding as a number\n\tint res;\n\tif (StringToInteger(a_DimensionString, res))\n\t{\n\t\t// It was a valid number\n\t\treturn static_cast<eDimension>(res);\n\t}\n\n\t// Decode using a built-in map:\n\tstatic struct\n\t{\n\t\teDimension m_Dimension;\n\t\tconst char * m_String;\n\t} DimensionMap [] =\n\t{\n\t\t{ dimOverworld, \"Overworld\"},\n\t\t{ dimOverworld, \"Normal\"},\n\t\t{ dimOverworld, \"World\"},\n\t\t{ dimNether,    \"Nether\"},\n\t\t{ dimNether,    \"Hell\"},  // Alternate name for Nether\n\t\t{ dimEnd,       \"End\"},\n\t\t{ dimEnd,       \"Sky\"},  // Old name for End\n\t} ;\n\tfor (size_t i = 0; i < ARRAYCOUNT(DimensionMap); i++)\n\t{\n\t\tif (NoCaseCompare(DimensionMap[i].m_String, a_DimensionString) == 0)\n\t\t{\n\t\t\treturn DimensionMap[i].m_Dimension;\n\t\t}\n\t}  // for i - DimensionMap[]\n\n\t// Not found\n\tLOGWARNING(\"Unknown dimension: \\\"%s\\\". Setting to Overworld\", a_DimensionString.c_str());\n\treturn dimOverworld;\n}\n\n\n\n\n\nAString DimensionToString(eDimension a_Dimension)\n{\n\t// Decode using a built-in map:\n\tstatic struct\n\t{\n\t\teDimension m_Dimension;\n\t\tconst char * m_String;\n\t} DimensionMap[] =\n\t{\n\t\t{ dimOverworld, \"Overworld\" },\n\t\t{ dimNether, \"Nether\" },\n\t\t{ dimEnd, \"End\" },\n\t};\n\n\tfor (size_t i = 0; i < ARRAYCOUNT(DimensionMap); i++)\n\t{\n\t\tif (DimensionMap[i].m_Dimension == a_Dimension)\n\t\t{\n\t\t\treturn DimensionMap[i].m_String;\n\t\t}\n\t}  // for i - DimensionMap[]\n\n\t// Not found\n\tLOGWARNING(\"Unknown dimension: \\\"%i\\\". Setting to Overworld\", static_cast<int>(a_Dimension));\n\treturn \"Overworld\";\n}\n\n\n\n\n\nAString DamageTypeToString(eDamageType a_DamageType)\n{\n\t// Make sure to keep this alpha-sorted.\n\tswitch (a_DamageType)\n\t{\n\t\tcase dtAdmin:           return \"dtAdmin\";\n\t\tcase dtAttack:          return \"dtAttack\";\n\t\tcase dtCactusContact:   return \"dtCactusContact\";\n\t\tcase dtMagmaContact:    return \"dtMagmaContact\";\n\t\tcase dtDrowning:        return \"dtDrowning\";\n\t\tcase dtEnderPearl:      return \"dtEnderPearl\";\n\t\tcase dtEnvironment:     return \"dtEnvironment\";\n\t\tcase dtFalling:         return \"dtFalling\";\n\t\tcase dtFireContact:     return \"dtFireContact\";\n\t\tcase dtInVoid:          return \"dtInVoid\";\n\t\tcase dtLavaContact:     return \"dtLavaContact\";\n\t\tcase dtLightning:       return \"dtLightning\";\n\t\tcase dtOnFire:          return \"dtOnFire\";\n\t\tcase dtPoisoning:       return \"dtPoisoning\";\n\t\tcase dtWithering:       return \"dtWithering\";\n\t\tcase dtPotionOfHarming: return \"dtPotionOfHarming\";\n\t\tcase dtRangedAttack:    return \"dtRangedAttack\";\n\t\tcase dtStarving:        return \"dtStarving\";\n\t\tcase dtSuffocating:     return \"dtSuffocation\";\n\t\tcase dtExplosion:       return \"dtExplosion\";\n\t}\n\tUNREACHABLE(\"Unsupported damage type\");\n}\n\n\n\n\n\neDamageType StringToDamageType(const AString & a_DamageTypeString)\n{\n\t// First try decoding as a number:\n\tint res;\n\tif (!StringToInteger(a_DamageTypeString, res))\n\t{\n\t\t// It was a valid number\n\t\treturn static_cast<eDamageType>(res);\n\t}\n\n\t// Decode using a built-in map:\n\tstatic struct\n\t{\n\t\teDamageType  m_DamageType;\n\t\tconst char * m_String;\n\t} DamageTypeMap [] =\n\t{\n\t\t// Cannonical names:\n\t\t{ dtAttack,          \"dtAttack\"},\n\t\t{ dtRangedAttack,    \"dtRangedAttack\"},\n\t\t{ dtLightning,       \"dtLightning\"},\n\t\t{ dtFalling,         \"dtFalling\"},\n\t\t{ dtDrowning,        \"dtDrowning\"},\n\t\t{ dtSuffocating,     \"dtSuffocation\"},\n\t\t{ dtStarving,        \"dtStarving\"},\n\t\t{ dtCactusContact,   \"dtCactusContact\"},\n\t\t{ dtMagmaContact,    \"dtMagmaContact\"},\n\t\t{ dtLavaContact,     \"dtLavaContact\"},\n\t\t{ dtPoisoning,       \"dtPoisoning\"},\n\t\t{ dtWithering,       \"dtWithering\"},\n\t\t{ dtOnFire,          \"dtOnFire\"},\n\t\t{ dtFireContact,     \"dtFireContact\"},\n\t\t{ dtInVoid,          \"dtInVoid\"},\n\t\t{ dtPotionOfHarming, \"dtPotionOfHarming\"},\n\t\t{ dtAdmin,           \"dtAdmin\"},\n\t\t{ dtExplosion,       \"dtExplosion\"},\n\t\t{ dtEnvironment,     \"dtEnvironment\"},\n\n\t\t// Common synonyms:\n\t\t{ dtAttack,        \"dtPawnAttack\"},\n\t\t{ dtAttack,        \"dtEntityAttack\"},\n\t\t{ dtAttack,        \"dtMob\"},\n\t\t{ dtAttack,        \"dtMobAttack\"},\n\t\t{ dtRangedAttack,  \"dtArrowAttack\"},\n\t\t{ dtRangedAttack,  \"dtArrow\"},\n\t\t{ dtRangedAttack,  \"dtProjectile\"},\n\t\t{ dtFalling,       \"dtFall\"},\n\t\t{ dtDrowning,      \"dtDrown\"},\n\t\t{ dtSuffocating,   \"dtSuffocation\"},\n\t\t{ dtStarving,      \"dtStarvation\"},\n\t\t{ dtStarving,      \"dtHunger\"},\n\t\t{ dtCactusContact, \"dtCactus\"},\n\t\t{ dtCactusContact, \"dtCactuses\"},\n\t\t{ dtCactusContact, \"dtCacti\"},\n\t\t{ dtMagmaContact,  \"dtMagma\"},\n\t\t{ dtLavaContact,   \"dtLava\"},\n\t\t{ dtPoisoning,     \"dtPoison\"},\n\t\t{ dtWithering,     \"dtWither\"},\n\t\t{ dtOnFire,        \"dtBurning\"},\n\t\t{ dtFireContact,   \"dtInFire\"},\n\t\t{ dtAdmin,         \"dtPlugin\"},\n\t} ;\n\tfor (size_t i = 0; i < ARRAYCOUNT(DamageTypeMap); i++)\n\t{\n\t\tif (NoCaseCompare(DamageTypeMap[i].m_String, a_DamageTypeString) == 0)\n\t\t{\n\t\t\treturn DamageTypeMap[i].m_DamageType;\n\t\t}\n\t}  // for i - DamageTypeMap[]\n\n\t// Not found:\n\treturn static_cast<eDamageType>(-1);\n}\n\n\n\n\n\nvoid AddFaceDirection(int & a_BlockX, int & a_BlockY, int & a_BlockZ, eBlockFace a_BlockFace, bool a_bInverse)\n{\n\tLOGWARNING(\"AddFaceDirection with X/Y/Z parameters is deprecated, use the vector version\");\n\n\tconst auto Offset = AddFaceDirection({ a_BlockX, a_BlockY, a_BlockZ }, a_BlockFace, a_bInverse);\n\ta_BlockX = Offset.x;\n\ta_BlockY = Offset.y;\n\ta_BlockZ = Offset.z;\n}\n\n\n\n\n\nVector3i AddFaceDirection(const Vector3i a_Position, const eBlockFace a_BlockFace, const bool a_InvertDirection)\n{\n\tconst int Offset = a_InvertDirection ? -1 : 1;\n\n\tswitch (a_BlockFace)\n\t{\n\t\tcase BLOCK_FACE_YP: return a_Position.addedY(+Offset);\n\t\tcase BLOCK_FACE_YM: return a_Position.addedY(-Offset);\n\t\tcase BLOCK_FACE_ZM: return a_Position.addedZ(-Offset);\n\t\tcase BLOCK_FACE_ZP: return a_Position.addedZ(+Offset);\n\t\tcase BLOCK_FACE_XP: return a_Position.addedX(+Offset);\n\t\tcase BLOCK_FACE_XM: return a_Position.addedX(-Offset);\n\t\tcase BLOCK_FACE_NONE: break;\n\t}\n\n\tUNREACHABLE(\"Unsupported block face\");\n}\n\n\n\n\n\nbool ItemCategory::IsPickaxe(short a_ItemType)\n{\n\tswitch (a_ItemType)\n\t{\n\t\tcase E_ITEM_WOODEN_PICKAXE:\n\t\tcase E_ITEM_STONE_PICKAXE:\n\t\tcase E_ITEM_IRON_PICKAXE:\n\t\tcase E_ITEM_GOLD_PICKAXE:\n\t\tcase E_ITEM_DIAMOND_PICKAXE:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool ItemCategory::IsAxe(short a_ItemType)\n{\n\tswitch (a_ItemType)\n\t{\n\t\tcase E_ITEM_WOODEN_AXE:\n\t\tcase E_ITEM_STONE_AXE:\n\t\tcase E_ITEM_IRON_AXE:\n\t\tcase E_ITEM_GOLD_AXE:\n\t\tcase E_ITEM_DIAMOND_AXE:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool ItemCategory::IsSword(short a_ItemID)\n{\n\treturn (a_ItemID == E_ITEM_WOODEN_SWORD)\n\t\t|| (a_ItemID == E_ITEM_STONE_SWORD)\n\t\t|| (a_ItemID == E_ITEM_IRON_SWORD)\n\t\t|| (a_ItemID == E_ITEM_GOLD_SWORD)\n\t\t|| (a_ItemID == E_ITEM_DIAMOND_SWORD);\n}\n\n\n\n\n\nbool ItemCategory::IsHoe(short a_ItemID)\n{\n\treturn (a_ItemID == E_ITEM_WOODEN_HOE)\n\t\t|| (a_ItemID == E_ITEM_STONE_HOE)\n\t\t|| (a_ItemID == E_ITEM_IRON_HOE)\n\t\t|| (a_ItemID == E_ITEM_GOLD_HOE)\n\t\t|| (a_ItemID == E_ITEM_DIAMOND_HOE);\n}\n\n\n\n\n\nbool ItemCategory::IsShovel(short a_ItemID)\n{\n\treturn (a_ItemID == E_ITEM_WOODEN_SHOVEL)\n\t\t|| (a_ItemID == E_ITEM_STONE_SHOVEL)\n\t\t|| (a_ItemID == E_ITEM_IRON_SHOVEL)\n\t\t|| (a_ItemID == E_ITEM_GOLD_SHOVEL)\n\t\t|| (a_ItemID == E_ITEM_DIAMOND_SHOVEL);\n}\n\n\n\n\n\nbool ItemCategory::IsTool(short a_ItemID)\n{\n\treturn IsPickaxe( a_ItemID)\n\t\t|| IsAxe    ( a_ItemID)\n\t\t|| IsSword  ( a_ItemID)\n\t\t|| IsHoe    ( a_ItemID)\n\t\t|| IsShovel ( a_ItemID);\n}\n\n\n\n\n\nbool ItemCategory::IsHelmet(short a_ItemType)\n{\n\treturn (\n\t\t(a_ItemType == E_ITEM_LEATHER_CAP) ||\n\t\t(a_ItemType == E_ITEM_GOLD_HELMET) ||\n\t\t(a_ItemType == E_ITEM_CHAIN_HELMET) ||\n\t\t(a_ItemType == E_ITEM_IRON_HELMET) ||\n\t\t(a_ItemType == E_ITEM_DIAMOND_HELMET)\n\t);\n}\n\n\n\n\n\nbool ItemCategory::IsChestPlate(short a_ItemType)\n{\n\treturn (\n\t\t(a_ItemType == E_ITEM_ELYTRA) ||\n\t\t(a_ItemType == E_ITEM_LEATHER_TUNIC) ||\n\t\t(a_ItemType == E_ITEM_GOLD_CHESTPLATE) ||\n\t\t(a_ItemType == E_ITEM_CHAIN_CHESTPLATE) ||\n\t\t(a_ItemType == E_ITEM_IRON_CHESTPLATE) ||\n\t\t(a_ItemType == E_ITEM_DIAMOND_CHESTPLATE)\n\t);\n}\n\n\n\n\n\nbool ItemCategory::IsLeggings(short a_ItemType)\n{\n\treturn (\n\t\t(a_ItemType == E_ITEM_LEATHER_PANTS) ||\n\t\t(a_ItemType == E_ITEM_GOLD_LEGGINGS) ||\n\t\t(a_ItemType == E_ITEM_CHAIN_LEGGINGS) ||\n\t\t(a_ItemType == E_ITEM_IRON_LEGGINGS) ||\n\t\t(a_ItemType == E_ITEM_DIAMOND_LEGGINGS)\n\t);\n}\n\n\n\n\n\nbool ItemCategory::IsBoots(short a_ItemType)\n{\n\treturn (\n\t\t(a_ItemType == E_ITEM_LEATHER_BOOTS) ||\n\t\t(a_ItemType == E_ITEM_GOLD_BOOTS) ||\n\t\t(a_ItemType == E_ITEM_CHAIN_BOOTS) ||\n\t\t(a_ItemType == E_ITEM_IRON_BOOTS) ||\n\t\t(a_ItemType == E_ITEM_DIAMOND_BOOTS)\n\t);\n}\n\n\n\n\n\nbool ItemCategory::IsMinecart(short a_ItemType)\n{\n\treturn (\n\t\t(a_ItemType == E_ITEM_MINECART) ||\n\t\t(a_ItemType == E_ITEM_CHEST_MINECART) ||\n\t\t(a_ItemType == E_ITEM_FURNACE_MINECART) ||\n\t\t(a_ItemType == E_ITEM_MINECART_WITH_TNT) ||\n\t\t(a_ItemType == E_ITEM_MINECART_WITH_HOPPER)\n\t);\n}\n\n\n\n\n\nbool ItemCategory::IsArmor(short a_ItemType)\n{\n\treturn (\n\t\tIsHelmet(a_ItemType) ||\n\t\tIsChestPlate(a_ItemType) ||\n\t\tIsLeggings(a_ItemType) ||\n\t\tIsBoots(a_ItemType)\n\t);\n}\n\n\n\n\n\nbool ItemCategory::IsHorseArmor(short a_ItemType)\n{\n\tswitch (a_ItemType)\n\t{\n\t\tcase E_ITEM_IRON_HORSE_ARMOR:\n\t\tcase E_ITEM_GOLD_HORSE_ARMOR:\n\t\tcase E_ITEM_DIAMOND_HORSE_ARMOR:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool ItemCategory::IsVillagerFood(short a_ItemType)\n{\n\tswitch (a_ItemType)\n\t{\n\t\tcase E_ITEM_CARROT:\n\t\tcase E_ITEM_POTATO:\n\t\tcase E_ITEM_BREAD:\n\t\tcase E_ITEM_BEETROOT:\n\t\tcase E_ITEM_SEEDS:\n\t\tcase E_ITEM_BEETROOT_SEEDS:\n\t\tcase E_ITEM_WHEAT:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Defines.h",
    "content": "\n#pragma once\n\n\n\n\n\n/** List of slot numbers, used for inventory-painting */\ntypedef std::vector<int> cSlotNums;\n\n\n\n\n\n/** Constant to calculate ticks from seconds \"ticks per second\" */\nconstexpr inline const int TPS = 20;\n// This is not added to the lua API because it broke the build\n\n\n\n\n\n// tolua_begin\n\n/** Experience Orb setup */\nenum\n{\n\t// Open to suggestion on naming convention here :)\n\tMAX_EXPERIENCE_ORB_SIZE = 2000\n} ;\n\n\n\n\n\n/** Block face constants, used in PlayerDigging and PlayerBlockPlacement packets and bbox collision calc */\nenum eBlockFace\n{\n\tBLOCK_FACE_NONE = -1,  // Interacting with no block face - swinging the item in the air\n\tBLOCK_FACE_XM   =  4,  // Interacting with the X- face of the block\n\tBLOCK_FACE_XP   =  5,  // Interacting with the X+ face of the block\n\tBLOCK_FACE_YM   =  0,  // Interacting with the Y- face of the block\n\tBLOCK_FACE_YP   =  1,  // Interacting with the Y+ face of the block\n\tBLOCK_FACE_ZM   =  2,  // Interacting with the Z- face of the block\n\tBLOCK_FACE_ZP   =  3,  // Interacting with the Z+ face of the block\n\n\t// Synonyms using the (deprecated) world directions:\n\tBLOCK_FACE_BOTTOM = BLOCK_FACE_YM,  // Interacting with the bottom   face of the block\n\tBLOCK_FACE_TOP    = BLOCK_FACE_YP,  // Interacting with the top      face of the block\n\tBLOCK_FACE_NORTH  = BLOCK_FACE_ZM,  // Interacting with the northern face of the block\n\tBLOCK_FACE_SOUTH  = BLOCK_FACE_ZP,  // Interacting with the southern face of the block\n\tBLOCK_FACE_WEST   = BLOCK_FACE_XM,  // Interacting with the western  face of the block\n\tBLOCK_FACE_EAST   = BLOCK_FACE_XP,  // Interacting with the eastern  face of the block\n\n\t// Bounds, used for range-checking:\n\tBLOCK_FACE_MIN = -1,\n\tBLOCK_FACE_MAX =  5,\n} ;\n\n\n\n\n\n/** PlayerDigging status constants */\nenum\n{\n\tDIG_STATUS_STARTED           = 0,\n\tDIG_STATUS_CANCELLED         = 1,\n\tDIG_STATUS_FINISHED          = 2,\n\tDIG_STATUS_DROP_STACK        = 3,\n\tDIG_STATUS_DROP_HELD         = 4,\n\tDIG_STATUS_SHOOT_EAT         = 5,\n\tDIG_STATUS_SWAP_ITEM_IN_HAND = 6,\n} ;\n\n\n\n\n\n/** Individual actions sent in the WindowClick packet */\nenum eClickAction\n{\n\t// Sorted by occurrence in the 1.5 protocol\n\tcaLeftClick,\n\tcaRightClick,\n\tcaShiftLeftClick,\n\tcaShiftRightClick,\n\tcaNumber1,\n\tcaNumber2,\n\tcaNumber3,\n\tcaNumber4,\n\tcaNumber5,\n\tcaNumber6,\n\tcaNumber7,\n\tcaNumber8,\n\tcaNumber9,\n\tcaMiddleClick,\n\tcaDropKey,\n\tcaCtrlDropKey,\n\tcaLeftClickOutside,\n\tcaRightClickOutside,\n\tcaLeftClickOutsideHoldNothing,\n\tcaRightClickOutsideHoldNothing,\n\tcaLeftPaintBegin,\n\tcaRightPaintBegin,\n\tcaMiddlePaintBegin,\n\tcaLeftPaintProgress,\n\tcaRightPaintProgress,\n\tcaMiddlePaintProgress,\n\tcaLeftPaintEnd,\n\tcaRightPaintEnd,\n\tcaMiddlePaintEnd,\n\tcaDblClick,\n\t// Add new actions here\n\tcaUnknown = 255,\n\n\t// Keep this list in sync with ClickActionToString() function below!\n} ;\n\n\n\n\n\nenum eGameMode\n{\n\teGameMode_NotSet    = -1,\n\teGameMode_Survival  = 0,\n\teGameMode_Creative  = 1,\n\teGameMode_Adventure = 2,\n\teGameMode_Spectator = 3,\n\n\t// Easier-to-use synonyms:\n\tgmNotSet    = eGameMode_NotSet,\n\tgmSurvival  = eGameMode_Survival,\n\tgmCreative  = eGameMode_Creative,\n\tgmAdventure = eGameMode_Adventure,\n\tgmSpectator = eGameMode_Spectator,\n\n\t// These two are used to check GameMode for validity when converting from integers.\n\tgmMax,  // Gets automatically assigned\n\tgmMin = 0,\n} ;\n\n\n\n\n\nenum eChatType\n{\n\tctChatBox        = 0,\n\tctSystem         = 1,\n\tctAboveActionBar = 2,\n} ;\n\n\n\n\n\nenum eWeather\n{\n\teWeather_Sunny        = 0,\n\teWeather_Rain         = 1,\n\teWeather_ThunderStorm = 2,\n\n\t// Easier-to-use synonyms:\n\twSunny        = eWeather_Sunny,\n\twRain         = eWeather_Rain,\n\twThunderstorm = eWeather_ThunderStorm,\n\twStorm        = wThunderstorm,\n} ;\n\n\n\n\n\nenum eMobHeadType\n{\n\tSKULL_TYPE_SKELETON    = 0,\n\tSKULL_TYPE_WITHER      = 1,\n\tSKULL_TYPE_ZOMBIE      = 2,\n\tSKULL_TYPE_PLAYER      = 3,\n\tSKULL_TYPE_CREEPER     = 4,\n\tSKULL_TYPE_DRAGON      = 5,\n} ;\n\n\n\n\n\nenum eMobHeadRotation\n{\n\tSKULL_ROTATION_NORTH = 0,\n\tSKULL_ROTATION_NORTH_NORTH_EAST = 1,\n\tSKULL_ROTATION_NORTH_EAST = 2,\n\tSKULL_ROTATION_EAST_NORTH_EAST = 3,\n\tSKULL_ROTATION_EAST = 4,\n\tSKULL_ROTATION_EAST_SOUTH_EAST = 5,\n\tSKULL_ROTATION_SOUTH_EAST = 6,\n\tSKULL_ROTATION_SOUTH_SOUTH_EAST = 7,\n\tSKULL_ROTATION_SOUTH = 8,\n\tSKULL_ROTATION_SOUTH_SOUTH_WEST = 9,\n\tSKULL_ROTATION_SOUTH_WEST = 10,\n\tSKULL_ROTATION_WEST_SOUTH_WEST = 11,\n\tSKULL_ROTATION_WEST = 12,\n\tSKULL_ROTATION_WEST_NORTH_WEST = 13,\n\tSKULL_ROTATION_NORTH_WEST = 14,\n\tSKULL_ROTATION_NORTH_NORTH_WEST = 15,\n} ;\n\n\n\n\n\nenum eSkinPart\n{\n\tspCape = 0x01,\n\tspJacket = 0x02,\n\tspLeftSleeve = 0x04,\n\tspRightSleeve = 0x08,\n\tspLeftPants = 0x10,\n\tspRightPants = 0x20,\n\tspHat = 0x40,\n\tspMask = 0x7F,\n};\n\n\n\n\n/** Dimension of a world */\nenum eDimension\n{\n\tdimNether    = -1,\n\tdimOverworld = 0,\n\tdimEnd       = 1,\n\tdimNotSet    = 255,  // For things that need an \"indeterminate\" state, such as cProtocol's LastSentDimension\n} ;\n\n\n\n\n\n/** Damage type, used in the TakeDamageInfo structure and related functions */\nenum eDamageType\n{\n\t// Canonical names for the types (as documented in the plugin wiki):\n\tdtAttack,           // Being attacked by a mob\n\tdtRangedAttack,     // Being attacked by a projectile, possibly from a mob\n\tdtLightning,        // Hit by a lightning strike\n\tdtFalling,          // Falling down; dealt when hitting the ground\n\tdtDrowning,         // Drowning in water / lava\n\tdtSuffocating,      // Suffocating inside a block\n\tdtStarving,         // Hunger\n\tdtCactusContact,    // Contact with a cactus block\n\tdtMagmaContact,     // Contact with a magma block\n\tdtLavaContact,      // Contact with a lava block\n\tdtPoisoning,        // Having the poison effect\n\tdtWithering,        // Having the wither effect\n\tdtOnFire,           // Being on fire\n\tdtFireContact,      // Standing inside a fire block\n\tdtInVoid,           // Falling into the Void (Y < 0)\n\tdtPotionOfHarming,\n\tdtEnderPearl,       // Thrown an ender pearl, teleported by it\n\tdtAdmin,            // Damage applied by an admin command\n\tdtExplosion,        // Damage applied by an explosion\n\tdtEnvironment,      // Damage dealt to mobs from environment: enderman in rain, snow golem in desert\n\n\t// Some common synonyms:\n\tdtPawnAttack   = dtAttack,\n\tdtEntityAttack = dtAttack,\n\tdtMob          = dtAttack,\n\tdtMobAttack    = dtAttack,\n\tdtArrowAttack  = dtRangedAttack,\n\tdtArrow        = dtRangedAttack,\n\tdtProjectile   = dtRangedAttack,\n\tdtFall         = dtFalling,\n\tdtDrown        = dtDrowning,\n\tdtSuffocation  = dtSuffocating,\n\tdtStarvation   = dtStarving,\n\tdtHunger       = dtStarving,\n\tdtCactus       = dtCactusContact,\n\tdtCactuses     = dtCactusContact,\n\tdtCacti        = dtCactusContact,\n\tdtMagma        = dtMagmaContact,\n\tdtLava         = dtLavaContact,\n\tdtPoison       = dtPoisoning,\n\tdtWither       = dtWithering,\n\tdtBurning      = dtOnFire,\n\tdtInFire       = dtFireContact,\n\tdtPlugin       = dtAdmin,\n} ;\n\n\n\n\n\n/** The source of an explosion.\nAlso dictates the type of the additional data passed to the explosion handlers:\n| esBed           | Vector3i *             | Bed exploding in the Nether or in the End\n| esEnderCrystal  | cEnderCrystal *        |\n| esGhastFireball | cGhastFireballEntity * |\n| esMonster       | cMonster *             |\n| esOther         | nullptr                | Any other explosion unaccounted for\n| esPlugin        | nullptr                | Explosion primarily attributed to a plugin\n| esPrimedTNT     | cTNTEntity *           |\n| esWitherBirth   | cMonster *             |\n| esWitherSkull   | cProjectileEntity *    |\n*/\nenum eExplosionSource\n{\n\tesBed,\n\tesEnderCrystal,\n\tesGhastFireball,\n\tesMonster,\n\tesOther,\n\tesPlugin,\n\tesPrimedTNT,\n\tesTNTMinecart,\n\tesWitherBirth,\n\tesWitherSkull,\n\tesMax,\n} ;\n\n\n\n\n\nenum eShrapnelLevel\n{\n\tslNone,\n\tslGravityAffectedOnly,\n\tslAll\n} ;\n\n\n\n\n\nenum eSpreadSource\n{\n\tssFireSpread,\n\tssGrassSpread,\n\tssMushroomSpread,\n\tssMycelSpread,\n\tssVineSpread,\n} ;\n\n\n\n\n\nenum eMessageType\n{\n\t// https://forum.cuberite.org/thread-1212.html\n\t// MessageType...\n\n\tmtCustom,          // Send raw data without any processing\n\tmtFailure,         // Something could not be done (i.e. command not executed due to insufficient privilege)\n\tmtInformation,     // Informational message (i.e. command usage)\n\tmtSuccess,         // Something executed successfully\n\tmtWarning,         // Something concerning (i.e. reload) is about to happen\n\tmtFatal,           // Something catastrophic occured (i.e. plugin crash)\n\tmtDeath,           // Denotes death of player\n\tmtPrivateMessage,  // Player to player messaging identifier\n\tmtJoin,            // A player has joined the server\n\tmtLeave,           // A player has left the server\n\tmtMaxPlusOne,      // The first invalid type, used for checking on LuaAPI boundaries\n\n\t// Common aliases:\n\tmtFail  = mtFailure,\n\tmtError = mtFailure,\n\tmtInfo  = mtInformation,\n\tmtPM    = mtPrivateMessage,\n};\n\n\n\n\n\nenum class BannerPattern\n{\n\tBottomStripe,\n\tTopStripe,\n\tLeftStripe,\n\tRightStripe,\n\tCenterStripeVertical,\n\tMiddleStripeHorizontal,\n\tDownRightStripe,\n\tDownLeftStripe,\n\tSmallVerticalStripes,\n\tDiagonalCross,\n\tSquareCross,\n\tLeftOfDiagonal,\n\tRightOfUpsideDownDiagonal,\n\tLeftOfUpsideDownDiagonal,\n\tRightOfDiagonal,\n\tVerticalHalfLeft,\n\tVerticalHalfRight,\n\tHorizontalHalfTop,\n\tHorizontalHalfBottom,\n\tBottomLeftCorner,\n\tBottomRightCorner,\n\tTopLeftCorner,\n\tTopRightCorner,\n\tBottomTriangle,\n\tTopTriangle,\n\tBottomTriangleSawtooth,\n\tTopTriangleSawtooth,\n\tMiddleCircle,\n\tMiddleRhombus,\n\tBorder,\n\tCurlyBorder,\n\tBrick,\n\tGradient,\n\tGradientUpsideDown,\n\tCreeper,\n\tSkull,\n\tFlower,\n\tMojang,\n\tGlobe,\n\tPiglin\n};\n\n\n\n\n\nenum class BossBarColor\n{\n\tPink,\n\tBlue,\n\tRed,\n\tGreen,\n\tYellow,\n\tPurple,\n\tWhite\n};\n\n\n\n\n\nenum class BossBarDivisionType\n{\n\tNone,\n\tSixNotches,\n\tTenNotches,\n\tTwelveNotches,\n\tTwentyNotches\n};\n\n// tolua_end\n\n\n\n\n\nenum class EntityAnimation\n{\n\tAnimalFallsInLove,\n\tArmorStandGetsHit,\n\tArrowTipSparkles,\n\tDolphinShowsHappiness,\n\tEggCracks,\n\tEntityGetsCriticalHit,\n\tEntityGetsMagicalCriticalHit,\n\tEntityTrailsHoney,\n\tEvokerFangsAttacks,\n\tFireworkRocketExplodes,\n\t// FishingHookReels,\n\tFoxChews,\n\tGuardianAttacks,\n\tHoglinAttacks,\n\tHorseTamingFails,\n\tHorseTamingSucceeds,\n\tIronGolemAttacks,\n\tIronGolemOffersGift,\n\tIronGolemStashesGift,\n\tMinecartSpawnerDelayResets,\n\tMinecartTNTIgnites,\n\tMobSpawns,\n\tOcelotTrusts,\n\tOcelotDistrusts,\n\tPawnBerryBushPricks,\n\tPawnBurns,\n\tPawnChestEquipmentBreaks,\n\tPawnDies,\n\tPawnDrowns,\n\tPawnFeetEquipmentBreaks,\n\tPawnHandItemSwaps,\n\tPawnHeadEquipmentBreaks,\n\tPawnHurts,\n\tPawnLegsEquipmentBreaks,\n\tPawnMainHandEquipmentBreaks,\n\tPawnOffHandEquipmentBreaks,\n\tPawnShieldBlocks,\n\tPawnShieldBreaks,\n\tPawnTeleports,\n\tPawnThornsPricks,\n\tPawnTotemActivates,\n\tPlayerBadOmenActivates,\n\tPlayerEntersBed,\n\tPlayerFinishesEating,\n\tPlayerLeavesBed,\n\tPlayerMainHandSwings,\n\t// PlayerReducedDebugScreenDisables,\n\t// PlayerReducedDebugScreenEnables,\n\tPlayerOffHandSwings,\n\tRabbitJumps,\n\tRavagerAttacks,\n\tRavagerBecomesStunned,\n\tSheepEatsGrass,\n\tSnowballPoofs,\n\t// SquidResetsRotation,\n\tVillagerKisses,\n\tVillagerShowsAnger,\n\tVillagerShowsHappiness,\n\tVillagerSweats,\n\tWitchMagicks,\n\tWolfShakesWater,\n\tWolfTamingFails,\n\tWolfTamingSucceeds,\n\tZoglinAttacks,\n\tZombieVillagerCureFinishes\n};\n\n\n\n\n\n// tolua_begin\n\n/** Returns a textual representation of the click action. */\nconst char * ClickActionToString(int a_ClickAction);\n\n/** Returns a blockface mirrored around the Y axis (doesn't change up / down). */\neBlockFace MirrorBlockFaceY(eBlockFace a_BlockFace);\n\n/** Returns a blockface rotated around the Y axis counter-clockwise. */\neBlockFace RotateBlockFaceCCW(eBlockFace a_BlockFace);\n\n/** Returns a blockface rotated around the Y axis clockwise. */\neBlockFace RotateBlockFaceCW(eBlockFace a_BlockFace);\n\n/** Returns a blockface opposite to the one specified. */\neBlockFace ReverseBlockFace(eBlockFace  a_BlockFace);\n\n/** Returns the textual representation of the BlockFace constant. */\nAString BlockFaceToString(eBlockFace a_BlockFace);\n\n/** Returns true if the specified block type is valid (known). */\nbool IsValidBlock(int a_BlockType);\n\n/** Returns true if the specified item type is valid (known). */\nbool IsValidItem(int a_ItemType);\n\n/** Translates a dimension string to dimension enum. Takes either a number or a dimension alias (built-in). Returns dimOverworld on failure */\nextern eDimension StringToDimension(const AString & a_DimensionString);\n\n/** Translates a dimension enum to dimension string.\nTakes an eDimension enum value and returns \"Overworld\" on failure. */\nextern AString DimensionToString(eDimension a_Dimension);\n\n/** Translates damage type constant to a string representation (built-in). */\nextern AString DamageTypeToString(eDamageType a_DamageType);\n\n/** Translates a damage type string to damage type. Takes either a number or a damage type alias (built-in). Returns -1 on failure */\nextern eDamageType StringToDamageType(const AString & a_DamageString);\n\n/** Modifies the specified coords so that they point to the block adjacent to the one specified through its specified face.\nIf a_Inverse is true, the opposite direction is used instead. */\nvoid AddFaceDirection(int & a_BlockX, int & a_BlockY, int & a_BlockZ, eBlockFace a_BlockFace, bool a_bInverse = false);\n\n/** Returns the coords of a block that is neighboring the specified position through its specified face.\nIf a_InvertDirection is true, the opposite direction is used instead. */\nVector3i AddFaceDirection(Vector3i a_Pos, eBlockFace a_BlockFace, bool a_InvertDirection = false);\n\n// tolua_end\n\n\n\n\n\ninline void EulerToVector(double a_Pan, double a_Pitch, double & a_X, double & a_Y, double & a_Z)\n{\n\t// \ta_X = sinf ( a_Pan / 180 * PI) * cosf ( a_Pitch / 180 * PI);\n\t// \ta_Y = -sinf ( a_Pitch / 180 * PI);\n\t// \ta_Z = -cosf ( a_Pan / 180 * PI) * cosf ( a_Pitch / 180 * PI);\n\ta_X = cos(a_Pan / 180 * M_PI) * cos(a_Pitch / 180 * M_PI);\n\ta_Y = sin(a_Pan / 180 * M_PI) * cos(a_Pitch / 180 * M_PI);\n\ta_Z = sin(a_Pitch / 180 * M_PI);\n}\n\n\n\n\n\ninline void VectorToEuler(double a_X, double a_Y, double a_Z, double & a_Pan, double & a_Pitch)\n{\n\tdouble r = sqrt((a_X * a_X) + (a_Z * a_Z));\n\tif (r < std::numeric_limits<double>::epsilon())\n\t{\n\t\ta_Pan = 0;\n\t}\n\telse\n\t{\n\t\ta_Pan = atan2(a_Z, a_X) * 180 / M_PI - 90;\n\t}\n\n\ta_Pitch = atan2(a_Y, r) * 180 / M_PI;\n}\n\n\n\n\n\ntemplate <class T>\ninline T Diff(T a_Val1, T a_Val2)\n{\n\treturn std::abs(a_Val1 - a_Val2);\n}\n\n\n\n\n\n// tolua_begin\n\n/** Normalizes an angle in degrees to the [-180, +180) range: */\ninline double NormalizeAngleDegrees(const double a_Degrees)\n{\n\tdouble Norm = fmod(a_Degrees + 180, 360);\n\tif (Norm < 0)\n\t{\n\t\tNorm += 360;\n\t}\n\treturn Norm - 180;\n}\n\n\n\n\n\nnamespace ItemCategory\n{\n\tbool IsPickaxe(short a_ItemType);\n\n\tbool IsAxe(short a_ItemType);\n\n\tbool IsSword(short a_ItemType);\n\n\tbool IsHoe(short a_ItemType);\n\n\tbool IsShovel(short a_ItemType);\n\n\tbool IsTool(short a_ItemType);\n\n\tbool IsHelmet(short a_ItemType);\n\n\tbool IsChestPlate(short a_ItemType);\n\n\tbool IsLeggings(short a_ItemType);\n\n\tbool IsBoots(short a_ItemType);\n\n\tbool IsMinecart(short a_ItemType);\n\n\tbool IsArmor(short a_ItemType);\n\n\tbool IsHorseArmor(short a_ItemType);\n\n\tbool IsVillagerFood(short a_ItemType);\n}\n\n// tolua_end\n"
  },
  {
    "path": "src/EffectID.h",
    "content": "#pragma once\n\n// tolua_begin\n\nenum class EffectID : Int32\n{\n\tSFX_RANDOM_DISPENSER_DISPENSE = 1000,\n\tSFX_RANDOM_DISPENSER_DISPENSE_FAIL = 1001,\n\tSFX_RANDOM_DISPENSER_SHOOT = 1002,\n\tSFX_RANDOM_ENDER_EYE_LAUNCH = 1003,\n\tSFX_RANDOM_FIREWORK_SHOT = 1004,\n\tSFX_RANDOM_IRON_DOOR_OPEN = 1005,\n\tSFX_RANDOM_WOODEN_DOOR_OPEN = 1006,\n\tSFX_RANDOM_WOODEN_TRAPDOOR_OPEN = 1007,\n\tSFX_RANDOM_FENCE_GATE_OPEN = 1008,\n\tSFX_RANDOM_FIRE_EXTINGUISH = 1009,\n\tSFX_RANDOM_PLAY_MUSIC_DISC = 1010,\n\tSFX_RANDOM_IRON_DOOR_CLOSE = 1011,\n\tSFX_RANDOM_WOODEN_DOOR_CLOSE = 1012,\n\tSFX_RANDOM_WOODEN_TRAPDOOR_CLOSE = 1013,\n\tSFX_RANDOM_FENCE_GATE_CLOSE = 1014,\n\tSFX_MOB_GHAST_WARN = 1015,\n\tSFX_MOB_GHAST_SHOOT = 1016,\n\tSFX_MOB_ENDERDRAGON_SHOOT = 1017,\n\tSFX_MOB_BLAZE_SHOOT = 1018,\n\tSFX_MOB_ZOMBIE_WOOD = 1019,\n\tSFX_MOB_ZOMBIE_METAL = 1020,\n\tSFX_MOB_ZOMBIE_WOOD_BREAK = 1021,\n\tSFX_MOB_WITHER_BREAK_BLOCK = 1022,\n\tSFX_MOB_WITHER_SPAWN = 1023,\n\tSFX_MOB_WITHER_SHOOT = 1024,\n\tSFX_MOB_BAT_TAKEOFF = 1025,\n\tSFX_MOB_ZOMBIE_INFECT = 1026,\n\tSFX_MOB_ZOMBIE_UNFECT = 1027,\n\tSFX_MOB_ENDERDRAGON_DEATH = 1028,\n\tSFX_RANDOM_ANVIL_BREAK = 1029,\n\tSFX_RANDOM_ANVIL_USE = 1030,\n\tSFX_RANDOM_ANVIL_LAND = 1031,\n\tSFX_RANDOM_PORTAL_TRAVEL = 1032,\n\tSFX_RANDOM_CHORUS_FLOWER_GROW = 1033,\n\tSFX_RANDOM_CHORUS_FLOWER_DEATH = 1034,\n\tSFX_RANDOM_BREWING_STAND_BREW = 1035,\n\tSFX_RANDOM_IRON_TRAPDOOR_OPEN = 1036,\n\tSFX_RANDOM_IRON_TRAPDOOR_CLOSE = 1037,\n\n\tPARTICLE_SMOKE = 2000,\n\tPARTICLE_BLOCK_BREAK = 2001,\n\tPARTICLE_SPLASH_POTION = 2002,\n\tPARTICLE_EYE_OF_ENDER = 2003,\n\tPARTICLE_MOBSPAWN = 2004,\n\tPARTICLE_HAPPY_VILLAGER = 2005,\n\tPARTICLE_DRAGON_BREATH = 2006,\n\tPARTICLE_END_GATEWAY_SPAWN = 3000,\n\tPARTICLE_ENDERDRAGON_GROWL = 3001,\n};\n\nenum class SmokeDirection : Int32\n{\n\tSOUTH_EAST = 0,\n\tSOUTH = 1,\n\tSOUTH_WEST = 2,\n\tEAST = 3,\n\tCENTRE = 4,\n\tWEST = 5,\n\tNORTH_EAST = 6,\n\tNORTH = 7,\n\tNORTH_WEST = 8,\n};\n\n// tolua_end\n"
  },
  {
    "path": "src/Enchantments.cpp",
    "content": "// Enchantments.cpp\n\n// Implements the cEnchantments class representing a storage for item enchantments and stored-enchantments\n\n#include \"Globals.h\"\n#include \"Enchantments.h\"\n#include \"WorldStorage/FastNBT.h\"\n#include \"FastRandom.h\"\n#include \"Noise/Noise.h\"\n#include \"BlockType.h\"\n\n\n\n\n\ncEnchantments::cEnchantments(void)\n{\n\t// Nothing needed yet, but the constructor needs to be declared and impemented in order to be usable\n}\n\n\n\n\n\ncEnchantments::cEnchantments(const AString & a_StringSpec)\n{\n\tAddFromString(a_StringSpec);\n}\n\n\n\n\n\nvoid cEnchantments::Add(const cEnchantments & a_Other)\n{\n\tfor (cEnchantments::cMap::const_iterator itr = a_Other.m_Enchantments.begin(), end = a_Other.m_Enchantments.end(); itr != end; ++itr)\n\t{\n\t\tSetLevel(itr->first, itr->second);\n\t}  // for itr - a_Other.m_Enchantments[]\n}\n\n\n\n\n\nvoid cEnchantments::AddFromString(const AString & a_StringSpec)\n{\n\t// Add enchantments in the stringspec; if a specified enchantment already exists, overwrites it\n\n\t// Split the StringSpec into separate declarations, each in the form \"id=lvl\":\n\tAStringVector Decls = StringSplit(a_StringSpec, \";\");\n\tfor (AStringVector::const_iterator itr = Decls.begin(), end = Decls.end(); itr != end; ++itr)\n\t{\n\t\t// Split each declaration into the id and lvl part:\n\t\tif (itr->empty())\n\t\t{\n\t\t\t// The decl is empty (may happen if there's an extra semicolon at the end), ignore silently\n\t\t\tcontinue;\n\t\t}\n\t\tAStringVector Split = StringSplitAndTrim(*itr, \"=\");\n\t\tif (Split.size() != 2)\n\t\t{\n\t\t\t// Malformed decl\n\t\t\tLOG(\"%s: Malformed enchantment decl: \\\"%s\\\", skipping.\", __FUNCTION__, itr->c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tint id = StringToEnchantmentID(Split[0]);\n\t\tif (id < 0)\n\t\t{\n\t\t\tLOG(\"%s: Failed to parse enchantment \\\"%s\\\", skipping.\", __FUNCTION__, Split[0].c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tunsigned int lvl;\n\t\tif (!StringToInteger(Split[1], lvl))\n\t\t{\n\t\t\t// Level failed to parse\n\t\t\tLOG(\"%s: Failed to parse enchantment level \\\"%s\\\", skipping.\", __FUNCTION__, Split[1].c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tSetLevel(id, lvl);\n\t}  // for itr - Decls[]\n}\n\n\n\n\n\nsize_t cEnchantments::Count() const\n{\n\treturn m_Enchantments.size();\n}\n\n\n\n\n\nAString cEnchantments::ToString() const\n{\n\t// Serialize all the enchantments into a string\n\tAString res;\n\tfor (cEnchantments::cMap::const_iterator itr = m_Enchantments.begin(), end = m_Enchantments.end(); itr != end; ++itr)\n\t{\n\t\tres.append(fmt::format(FMT_STRING(\"{}={};\"), itr->first, itr->second));\n\t}  // for itr - m_Enchantments[]\n\treturn res;\n}\n\n\n\n\n\nunsigned int cEnchantments::GetLevel(int a_EnchantmentID) const\n{\n\t// Return the level for the specified enchantment; 0 if not stored\n\tcMap::const_iterator itr = m_Enchantments.find(a_EnchantmentID);\n\tif (itr != m_Enchantments.end())\n\t{\n\t\treturn itr->second;\n\t}\n\n\t// Not stored, return zero\n\treturn 0;\n}\n\n\n\n\n\nvoid cEnchantments::SetLevel(int a_EnchantmentID, unsigned int a_Level)\n{\n\t// Sets the level for the specified enchantment, adding it if not stored before or removing it if level <= 0\n\tif (a_Level == 0)\n\t{\n\t\t// Delete enchantment, if present:\n\t\tcMap::iterator itr = m_Enchantments.find(a_EnchantmentID);\n\t\tif (itr != m_Enchantments.end())\n\t\t{\n\t\t\tm_Enchantments.erase(itr);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Add / overwrite enchantment\n\t\tm_Enchantments[a_EnchantmentID] = a_Level;\n\t}\n}\n\n\n\n\n\nvoid cEnchantments::Clear(void)\n{\n\tm_Enchantments.clear();\n}\n\n\n\n\n\nbool cEnchantments::IsEmpty(void) const\n{\n\treturn m_Enchantments.empty();\n}\n\n\n\n\n\nunsigned int cEnchantments::GetLevelCap(int a_EnchantmentID)\n{\n\tswitch (a_EnchantmentID)\n\t{\n\t\tcase enchProtection:           return 4;\n\t\tcase enchFireProtection:       return 4;\n\t\tcase enchFeatherFalling:       return 4;\n\t\tcase enchBlastProtection:      return 4;\n\t\tcase enchProjectileProtection: return 4;\n\t\tcase enchRespiration:          return 3;\n\t\tcase enchAquaAffinity:         return 1;\n\t\tcase enchThorns:               return 3;\n\t\tcase enchDepthStrider:         return 3;\n\t\tcase enchSharpness:            return 5;\n\t\tcase enchSmite:                return 5;\n\t\tcase enchBaneOfArthropods:     return 5;\n\t\tcase enchKnockback:            return 2;\n\t\tcase enchFireAspect:           return 2;\n\t\tcase enchLooting:              return 3;\n\t\tcase enchEfficiency:           return 5;\n\t\tcase enchSilkTouch:            return 1;\n\t\tcase enchUnbreaking:           return 3;\n\t\tcase enchFortune:              return 3;\n\t\tcase enchPower:                return 5;\n\t\tcase enchPunch:                return 2;\n\t\tcase enchFlame:                return 1;\n\t\tcase enchInfinity:             return 1;\n\t\tcase enchLuckOfTheSea:         return 3;\n\t\tcase enchLure:                 return 3;\n\t}\n\tLOGWARNING(\"Unknown enchantment ID %d\", a_EnchantmentID);\n\treturn 0;\n}\n\n\n\n\n\nint cEnchantments::GetXPCostMultiplier(int a_EnchantmentID, bool FromBook)\n{\n\tif (FromBook)\n\t{\n\t\tswitch (a_EnchantmentID)\n\t\t{\n\t\t\tcase enchProtection:           return 1;\n\t\t\tcase enchFireProtection:       return 1;\n\t\t\tcase enchFeatherFalling:       return 1;\n\t\t\tcase enchBlastProtection:      return 2;\n\t\t\tcase enchProjectileProtection: return 1;\n\t\t\tcase enchRespiration:          return 2;\n\t\t\tcase enchAquaAffinity:         return 2;\n\t\t\tcase enchThorns:               return 4;\n\t\t\tcase enchDepthStrider:         return 2;\n\t\t\tcase enchSharpness:            return 1;\n\t\t\tcase enchSmite:                return 1;\n\t\t\tcase enchBaneOfArthropods:     return 1;\n\t\t\tcase enchKnockback:            return 1;\n\t\t\tcase enchFireAspect:           return 2;\n\t\t\tcase enchLooting:              return 2;\n\t\t\tcase enchEfficiency:           return 1;\n\t\t\tcase enchSilkTouch:            return 4;\n\t\t\tcase enchUnbreaking:           return 1;\n\t\t\tcase enchFortune:              return 1;\n\t\t\tcase enchPower:                return 1;\n\t\t\tcase enchPunch:                return 2;\n\t\t\tcase enchFlame:                return 2;\n\t\t\tcase enchInfinity:             return 4;\n\t\t\tcase enchLuckOfTheSea:         return 2;\n\t\t\tcase enchLure:                 return 2;\n\t\t}\n\t}\n\telse  // Without book\n\t{\n\t\tswitch (a_EnchantmentID)\n\t\t{\n\t\t\tcase enchProtection:           return 1;\n\t\t\tcase enchFireProtection:       return 2;\n\t\t\tcase enchFeatherFalling:       return 2;\n\t\t\tcase enchBlastProtection:      return 4;\n\t\t\tcase enchProjectileProtection: return 2;\n\t\t\tcase enchRespiration:          return 4;\n\t\t\tcase enchAquaAffinity:         return 4;\n\t\t\tcase enchThorns:               return 8;\n\t\t\tcase enchDepthStrider:         return 4;\n\n\t\t\tcase enchSharpness:            return 1;\n\t\t\tcase enchSmite:                return 2;\n\t\t\tcase enchBaneOfArthropods:     return 2;\n\t\t\tcase enchKnockback:            return 2;\n\t\t\tcase enchFireAspect:           return 4;\n\t\t\tcase enchLooting:              return 4;\n\n\t\t\tcase enchEfficiency:           return 1;\n\t\t\tcase enchSilkTouch:            return 8;\n\t\t\tcase enchUnbreaking:           return 2;\n\t\t\tcase enchFortune:              return 4;\n\t\t\tcase enchPower:                return 1;\n\t\t\tcase enchPunch:                return 4;\n\t\t\tcase enchFlame:                return 4;\n\t\t\tcase enchInfinity:             return 8;\n\t\t\tcase enchLuckOfTheSea:         return 4;\n\t\t\tcase enchLure:                 return 4;\n\t\t}\n\t}\n\tLOGWARNING(\"Unknown enchantment ID %d\", a_EnchantmentID);\n\treturn 0;\n}\n\n\n\n\n\nbool cEnchantments::CanAddEnchantment(int a_EnchantmentID) const\n{\n\tif (GetLevel(a_EnchantmentID) > 0)\n\t{\n\t\treturn true;\n\t}\n\n\tstatic const std::vector<std::set<int> > IncompatibleEnchantments =\n\t{\n\t\t// Armor\n\t\t{ enchProtection, enchFireProtection, enchBlastProtection, enchProjectileProtection },\n\n\t\t// Tool\n\t\t{ enchFortune, enchSilkTouch },\n\n\t\t// Sword\n\t\t{ enchSharpness, enchSmite, enchBaneOfArthropods },\n\n\t\t// Boots\n\t\t// {enchDepthStrider, enchFrostWalker},\n\n\t\t// Bow\n\t\t// {enchInfinity, enchMending}\n\t};\n\n\tfor (const auto & excl: IncompatibleEnchantments)\n\t{\n\t\tif (excl.count(a_EnchantmentID) != 0)\n\t\t{\n\t\t\t// See if we also have any of the enchantments\n\t\t\tfor (auto ench: excl)\n\t\t\t{\n\t\t\t\tif (GetLevel(ench) > 0)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nint cEnchantments::StringToEnchantmentID(const AString & a_EnchantmentName)\n{\n\tstatic const struct\n\t{\n\t\tint m_Value;\n\t\tconst char * m_Name;\n\t} EnchantmentNames[] =\n\t{\n\t\t{ enchProtection,           \"Protection\" },\n\t\t{ enchFireProtection,       \"FireProtection\" },\n\t\t{ enchFeatherFalling,       \"FeatherFalling\" },\n\t\t{ enchBlastProtection,      \"BlastProtection\" },\n\t\t{ enchProjectileProtection, \"ProjectileProtection\" },\n\t\t{ enchRespiration,          \"Respiration\" },\n\t\t{ enchAquaAffinity,         \"AquaAffinity\" },\n\t\t{ enchThorns,               \"Thorns\" },\n\t\t{ enchDepthStrider,         \"DepthStrider\" },\n\t\t{ enchSharpness,            \"Sharpness\" },\n\t\t{ enchSmite,                \"Smite\" },\n\t\t{ enchBaneOfArthropods,     \"BaneOfArthropods\" },\n\t\t{ enchKnockback,            \"Knockback\" },\n\t\t{ enchFireAspect,           \"FireAspect\" },\n\t\t{ enchLooting,              \"Looting\" },\n\t\t{ enchEfficiency,           \"Efficiency\" },\n\t\t{ enchSilkTouch,            \"SilkTouch\" },\n\t\t{ enchUnbreaking,           \"Unbreaking\" },\n\t\t{ enchFortune,              \"Fortune\" },\n\t\t{ enchPower,                \"Power\" },\n\t\t{ enchPunch,                \"Punch\" },\n\t\t{ enchFlame,                \"Flame\" },\n\t\t{ enchInfinity,             \"Infinity\" },\n\t\t{ enchLuckOfTheSea,         \"LuckOfTheSea\" },\n\t\t{ enchLure,                 \"Lure\" },\n\t} ;\n\n\t// First try to parse as a number:\n\tint id = atoi(a_EnchantmentName.c_str());\n\tif ((id != 0) || (a_EnchantmentName == \"0\"))\n\t{\n\t\treturn id;\n\t}\n\n\t// It wasn't a number, do a lookup:\n\tfor (size_t i = 0; i < ARRAYCOUNT(EnchantmentNames); i++)\n\t{\n\t\tif (NoCaseCompare(EnchantmentNames[i].m_Name, a_EnchantmentName) == 0)\n\t\t{\n\t\t\treturn EnchantmentNames[i].m_Value;\n\t\t}\n\t}  // for i - EnchantmentNames[]\n\treturn -1;\n}\n\n\n\n\n\nbool cEnchantments::operator ==(const cEnchantments & a_Other) const\n{\n\treturn m_Enchantments == a_Other.m_Enchantments;\n}\n\n\n\n\n\nbool cEnchantments::operator !=(const cEnchantments & a_Other) const\n{\n\treturn m_Enchantments != a_Other.m_Enchantments;\n}\n\n\n\n\n\nvoid cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short a_ItemType, unsigned a_EnchantmentLevel)\n{\n\tif (ItemCategory::IsSword(a_ItemType))\n\t{\n\t\t// Sharpness\n\t\tif ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 1);\n\t\t}\n\n\t\t// Smite\n\t\tif ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 1);\n\t\t}\n\n\t\t// Bane of Arthropods\n\t\tif ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 1);\n\t\t}\n\n\t\t// Knockback\n\t\tif ((a_EnchantmentLevel >= 25) && (a_EnchantmentLevel <= 75))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchKnockback, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchKnockback, 1);\n\t\t}\n\n\t\t// Fire Aspect\n\t\tif ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFireAspect, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFireAspect, 1);\n\t\t}\n\n\t\t// Looting\n\t\tif ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 1);\n\t\t}\n\t}\n\n\telse if (ItemCategory::IsTool(a_ItemType))\n\t{\n\t\t// Efficiency\n\t\tif ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 81))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 61))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 51))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 1);\n\t\t}\n\n\t\t// Silk Touch\n\t\tif ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchSilkTouch, 1);\n\t\t}\n\n\t\t// Fortune\n\t\tif ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 1);\n\t\t}\n\t}\n\n\telse if (ItemCategory::IsArmor(a_ItemType))\n\t{\n\t\t// Protection\n\t\tif ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 1);\n\t\t}\n\n\t\t// Fire Protection\n\t\tif ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 46))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 26) && (a_EnchantmentLevel <= 38))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 18) && (a_EnchantmentLevel <= 30))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 22))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 1);\n\t\t}\n\n\t\t// Blast Protection\n\t\tif ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 41))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 33))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 25))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 17))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 1);\n\t\t}\n\n\t\t// Projectile Protection\n\t\tif ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 30))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 9) && (a_EnchantmentLevel <= 24))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 3) && (a_EnchantmentLevel <= 18))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 1);\n\t\t}\n\n\t\t// Thorns\n\t\tif ((a_EnchantmentLevel >= 50) && (a_EnchantmentLevel <= 100))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 1);\n\t\t}\n\n\n\t\tif (ItemCategory::IsHelmet(a_ItemType))\n\t\t{\n\t\t\t// Respiration\n\t\t\tif ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 60))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 3);\n\t\t\t}\n\t\t\telse if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 2);\n\t\t\t}\n\t\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 40))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 1);\n\t\t\t}\n\n\t\t\t// Aqua Affinity\n\t\t\tif ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 41))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchAquaAffinity, 1);\n\t\t\t}\n\t\t}\n\n\t\telse if (ItemCategory::IsBoots(a_ItemType))\n\t\t{\n\t\t\t// Feather Fall\n\t\t\tif ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 33))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 4);\n\t\t\t}\n\t\t\telse if ((a_EnchantmentLevel >= 17) && (a_EnchantmentLevel <= 27))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 3);\n\t\t\t}\n\t\t\telse if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 21))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 2);\n\t\t\t}\n\t\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 15))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 1);\n\t\t\t}\n\n\t\t\t// Depth Strider\n\t\t\tif ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 45))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchDepthStrider, 3);\n\t\t\t}\n\t\t\telse if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 35))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchDepthStrider, 2);\n\t\t\t}\n\t\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 25))\n\t\t\t{\n\t\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchDepthStrider, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\telse if (a_ItemType == E_ITEM_BOW)\n\t{\n\t\t// Power\n\t\tif ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 46))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 26))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 16))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 1);\n\t\t}\n\n\t\t// Punch\n\t\tif ((a_EnchantmentLevel >= 32) && (a_EnchantmentLevel <= 57))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchPunch, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 37))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchPunch, 1);\n\t\t}\n\n\t\t// Flame and Infinity\n\t\tif ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFlame, 1);\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchInfinity, 1);\n\t\t}\n\t}\n\n\telse if (a_ItemType == E_ITEM_FISHING_ROD)\n\t{\n\t\t// Luck of the Sea and Lure\n\t\tif ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 3);\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 2);\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 1);\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 1);\n\t\t}\n\t}\n\n\telse if (a_ItemType == E_ITEM_BOOK)\n\t{\n\t\t// All Enchantments\n\n\t\t// Sharpness\n\t\tif ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 1);\n\t\t}\n\n\t\t// Smite\n\t\tif ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 1);\n\t\t}\n\n\t\t// Bane of Arthropods\n\t\tif ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 1);\n\t\t}\n\n\t\t// Knockback\n\t\tif ((a_EnchantmentLevel >= 25) && (a_EnchantmentLevel <= 75))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchKnockback, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchKnockback, 1);\n\t\t}\n\n\t\t// Fire Aspect\n\t\tif ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFireAspect, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFireAspect, 1);\n\t\t}\n\n\t\t// Looting\n\t\tif ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 1);\n\t\t}\n\n\t\t// Efficiency\n\t\tif ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 81))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 61))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 51))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 1);\n\t\t}\n\n\t\t// Silk Touch\n\t\tif ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchSilkTouch, 1);\n\t\t}\n\n\t\t// Fortune\n\t\tif ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 1);\n\t\t}\n\n\t\t// Protection\n\t\tif ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 1);\n\t\t}\n\n\t\t// Fire Protection\n\t\tif ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 46))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 26) && (a_EnchantmentLevel <= 38))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 18) && (a_EnchantmentLevel <= 30))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 22))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 1);\n\t\t}\n\n\t\t// Blast Protection\n\t\tif ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 41))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 33))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 25))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 17))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 1);\n\t\t}\n\n\t\t// Projectile Protection\n\t\tif ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 30))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 9) && (a_EnchantmentLevel <= 24))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 3) && (a_EnchantmentLevel <= 18))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 1);\n\t\t}\n\n\t\t// Thorns\n\t\tif ((a_EnchantmentLevel >= 50) && (a_EnchantmentLevel <= 100))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 1);\n\t\t}\n\n\t\t// Respiration\n\t\tif ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 60))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 40))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 1);\n\t\t}\n\n\t\t// Aqua Affinity\n\t\tif ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 41))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchAquaAffinity, 1);\n\t\t}\n\n\t\t// Feather Fall\n\t\tif ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 33))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 17) && (a_EnchantmentLevel <= 27))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 21))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 15))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 1);\n\t\t}\n\n\t\t// Power\n\t\tif ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 46))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 4);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 26))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 16))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 1);\n\t\t}\n\n\t\t// Punch\n\t\tif ((a_EnchantmentLevel >= 32) && (a_EnchantmentLevel <= 57))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchPunch, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 37))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchPunch, 1);\n\t\t}\n\n\t\t// Flame and Infinity\n\t\tif ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 2, enchFlame, 1);\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchInfinity, 1);\n\t\t}\n\n\t\t// Luck of the Sea and Lure\n\t\tif ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 3);\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 3);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 2);\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 2);\n\t\t}\n\t\telse if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))\n\t\t{\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 1);\n\t\t\tAddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 1);\n\t\t}\n\t}\n\n\t// Unbreaking\n\tif ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71))\n\t{\n\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchUnbreaking, 3);\n\t}\n\telse if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 63))\n\t{\n\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchUnbreaking, 2);\n\t}\n\telse if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55))\n\t{\n\t\tAddEnchantmentWeightToVector(a_Enchantments, 5, enchUnbreaking, 1);\n\t}\n}\n\n\n\n\n\nvoid cEnchantments::AddEnchantmentWeightToVector(cWeightedEnchantments & a_Enchantments, int a_Weight, int a_EnchantmentID, unsigned int a_EnchantmentLevel)\n{\n\tcWeightedEnchantment weightedenchantment;\n\tweightedenchantment.m_Weight = a_Weight;\n\tcEnchantments enchantment;\n\tenchantment.SetLevel(a_EnchantmentID, a_EnchantmentLevel);\n\tweightedenchantment.m_Enchantments = enchantment;\n\ta_Enchantments.push_back(weightedenchantment);\n}\n\n\n\n\n\nvoid cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, int a_EnchantmentID)\n{\n\tfor (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it)\n\t{\n\t\tif ((*it).m_Enchantments.GetLevel(a_EnchantmentID) > 0)\n\t\t{\n\t\t\ta_Enchantments.erase(it);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, const cEnchantments & a_Enchantment)\n{\n\tfor (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it)\n\t{\n\t\tif ((*it).m_Enchantments == a_Enchantment)\n\t\t{\n\t\t\ta_Enchantments.erase(it);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cEnchantments::CheckEnchantmentConflictsFromVector(\n\tcWeightedEnchantments & a_Enchantments, const cEnchantments & a_FirstEnchantment\n)\n{\n\tif (a_FirstEnchantment.GetLevel(cEnchantments::enchProtection) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchFireProtection);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBlastProtection);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProjectileProtection);\n\t}\n\telse if (a_FirstEnchantment.GetLevel(cEnchantments::enchFireProtection) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProtection);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBlastProtection);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProjectileProtection);\n\t}\n\telse if (a_FirstEnchantment.GetLevel(cEnchantments::enchBlastProtection) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProtection);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchFireProtection);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProjectileProtection);\n\t}\n\telse if (a_FirstEnchantment.GetLevel(cEnchantments::enchProjectileProtection) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProtection);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchFireProtection);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBlastProtection);\n\t}\n\n\telse if (a_FirstEnchantment.GetLevel(cEnchantments::enchSharpness) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSmite);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods);\n\t}\n\telse if (a_FirstEnchantment.GetLevel(cEnchantments::enchSmite) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSharpness);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods);\n\t}\n\telse if (a_FirstEnchantment.GetLevel(cEnchantments::enchBaneOfArthropods) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSharpness);\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSmite);\n\t}\n\telse if (a_FirstEnchantment.GetLevel(cEnchantments::enchSilkTouch) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchFortune);\n\t}\n\telse if (a_FirstEnchantment.GetLevel(cEnchantments::enchFortune) > 0)\n\t{\n\t\tRemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSilkTouch);\n\t}\n}\n\n\n\n\n\ncEnchantments cEnchantments::GetRandomEnchantmentFromVector(const cWeightedEnchantments & a_Enchantments, MTRand & a_Random)\n{\n\tint AllWeights = 0;\n\tfor (const auto & Enchantment: a_Enchantments)\n\t{\n\t\tAllWeights += Enchantment.m_Weight;\n\t}\n\tint RandomNumber = a_Random.RandInt(AllWeights - 1);\n\tfor (const auto & Enchantment: a_Enchantments)\n\t{\n\t\tRandomNumber -= Enchantment.m_Weight;\n\t\tif (RandomNumber < 0)\n\t\t{\n\t\t\treturn Enchantment.m_Enchantments;\n\t\t}\n\t}\n\n\treturn cEnchantments();\n}\n\n\n\n\n\ncEnchantments cEnchantments::SelectEnchantmentFromVector(const cWeightedEnchantments & a_Enchantments, int a_Seed)\n{\n\t// Sum up all the enchantments' weights:\n\tint AllWeights = 0;\n\tfor (const auto & Enchantment : a_Enchantments)\n\t{\n\t\tAllWeights += Enchantment.m_Weight;\n\t}\n\n\t// If there's no weight for any of the enchantments, return an empty enchantment\n\tif (AllWeights <= 0)\n\t{\n\t\treturn cEnchantments();\n\t}\n\n\t// Pick a random enchantment:\n\tcNoise Noise(a_Seed);\n\tint RandomNumber = Noise.IntNoise1DInt(AllWeights) / 7 % AllWeights;\n\tfor (const auto & Enchantment : a_Enchantments)\n\t{\n\t\tRandomNumber -= Enchantment.m_Weight;\n\t\tif (RandomNumber <= 0)\n\t\t{\n\t\t\treturn Enchantment.m_Enchantments;\n\t\t}\n\t}\n\n\t// No enchantment picked, return an empty one (we probably shouldn't ever get here):\n\treturn cEnchantments();\n}\n\n\n\n\n"
  },
  {
    "path": "src/Enchantments.h",
    "content": "// Enchantments.h\n\n// Declares the cEnchantments class representing a storage for item enchantments and stored-enchantments\n\n\n\n\n\n#pragma once\n\n#include \"Defines.h\"\n#include \"FastRandom.h\"\n#include \"WorldStorage/EnchantmentSerializer.h\"\n\n\n\n// fwd: \"WorldStorage/FastNBT.h\"\nclass cFastNBTWriter;\nclass cParsedNBT;\n\n\n// fwd:\nstruct cWeightedEnchantment;\n\ntypedef std::vector<cWeightedEnchantment> cWeightedEnchantments;\n\n\n\n\n\n/** Class that stores item enchantments or stored-enchantments\nThe enchantments may be serialized to a stringspec and read back from such stringspec.\nThe format for the stringspec is \"id=lvl;id=lvl;id=lvl...\", with an optional semicolon at the end,\nmapping each enchantment's id onto its level. ID may be either a number or the enchantment name.\nLevel value of 0 means no such enchantment, and it will not be stored in the m_Enchantments.\nSerialization will never put zero-level enchantments into the stringspec and will always use numeric IDs.\n*/\n\n\n// tolua_begin\nclass cEnchantments\n{\npublic:\n\t/** Individual enchantment IDs, corresponding to their NBT IDs: https://minecraft.wiki/w/Data_values#Enchantment_IDs\n\t*/\n\n\tenum eEnchantment\n\t{\n\t\t// Currently missing: Frost walker, curse of binding, sweeping edge, mending, and curse of vanishing.\n\t\tenchProtection           = 0,\n\t\tenchFireProtection       = 1,\n\t\tenchFeatherFalling       = 2,\n\t\tenchBlastProtection      = 3,\n\t\tenchProjectileProtection = 4,\n\t\tenchRespiration          = 5,\n\t\tenchAquaAffinity         = 6,\n\t\tenchThorns               = 7,\n\t\tenchDepthStrider         = 8,\n\t\tenchSharpness            = 16,\n\t\tenchSmite                = 17,\n\t\tenchBaneOfArthropods     = 18,\n\t\tenchKnockback            = 19,\n\t\tenchFireAspect           = 20,\n\t\tenchLooting              = 21,\n\t\tenchEfficiency           = 32,\n\t\tenchSilkTouch            = 33,\n\t\tenchUnbreaking           = 34,\n\t\tenchFortune              = 35,\n\t\tenchPower                = 48,\n\t\tenchPunch                = 49,\n\t\tenchFlame                = 50,\n\t\tenchInfinity             = 51,\n\t\tenchLuckOfTheSea         = 61,\n\t\tenchLure                 = 62,\n\t} ;\n\n\t/** Creates an empty enchantments container */\n\tcEnchantments(void);\n\n\t/** Creates an enchantments container filled with enchantments parsed from stringspec */\n\tcEnchantments(const AString & a_StringSpec);\n\n\t/** Adds the enchantments contained in a_Other into this object.\n\tExisting enchantments are preserved, unless a_Other specifies a different level, in which case the level is changed to the a_Other's one. */\n\tvoid Add(const cEnchantments & a_Other);\n\n\t/** Adds enchantments in the stringspec; if a specified enchantment already exists, overwrites it */\n\tvoid AddFromString(const AString & a_StringSpec);\n\n\t/** Get the count of enchantments */\n\tsize_t Count(void) const;\n\n\t/** Serializes all the enchantments into a string */\n\tAString ToString(void) const;\n\n\t/** Returns the level for the specified enchantment; 0 if not stored */\n\tunsigned int GetLevel(int a_EnchantmentID) const;\n\n\t/** Sets the level for the specified enchantment, adding it if not stored before or removing it if level <= 0 */\n\tvoid SetLevel(int a_EnchantmentID, unsigned int a_Level);\n\n\t/** Removes all enchantments */\n\tvoid Clear(void);\n\n\t/** Returns true if there are no enchantments */\n\tbool IsEmpty(void) const;\n\n\t/** Returns true if the given enchantment could be legally added to this object. Note that adding the enchantment may not actually increase the level. */\n\tbool CanAddEnchantment(int a_EnchantmentID) const;\n\n\t/** Converts enchantment name or ID (number in string) to the numeric representation; returns -1 if enchantment name not found; case insensitive */\n\tstatic int StringToEnchantmentID(const AString & a_EnchantmentName);\n\n\t/** Returns true if a_Other contains exactly the same enchantments and levels */\n\tbool operator ==(const cEnchantments & a_Other) const;\n\n\t// tolua_end\n\n\t/** Get the XP cost multiplier for the enchantment (for anvils).\n\tIf FromBook is true, then this function returns the XP multiplier if\n\tthe enchantment is coming from a book, otherwise it returns the normal\n\titem multiplier. */\n\tstatic int GetXPCostMultiplier(int a_EnchantmentID, bool FromBook);\n\n\t/** Get the maximum level the enchantment can have */\n\tstatic unsigned int GetLevelCap(int a_EnchantmentID);\n\n\t/** Add enchantment weights from item to the vector */\n\tstatic void AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short a_ItemType, unsigned a_EnchantmentLevel);\n\n\t/** Add a enchantment with weight to the vector */\n\tstatic void AddEnchantmentWeightToVector(cWeightedEnchantments & a_Enchantments, int a_Weight, int a_EnchantmentID, unsigned int a_EnchantmentLevel);\n\n\t/** Remove the entire enchantment (with weight) from the vector */\n\tstatic void RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, int a_EnchantmentID);\n\n\t/** Remove the entire enchantment (with weight) from the vector */\n\tstatic void RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, const cEnchantments & a_Enchantment);\n\n\t/** Check enchantment conflicts from enchantments from the vector */\n\tstatic void CheckEnchantmentConflictsFromVector(cWeightedEnchantments & a_Enchantments, const cEnchantments & a_FirstEnchantment);\n\n\t/** Gets random enchantment from Vector and returns it, with randomness derived from the provided PRNG. */\n\tstatic cEnchantments GetRandomEnchantmentFromVector(const cWeightedEnchantments & a_Enchantments, MTRand & a_Random);\n\n\t/** Selects one enchantment from a Vector using cNoise. Mostly used for generators.\n\tUses the enchantments' weights for the random distribution.\n\tIf a_Enchantments is empty, returns an empty enchantment. */\n\tstatic cEnchantments SelectEnchantmentFromVector(const cWeightedEnchantments & a_Enchantments, int a_Seed);\n\n\t/** Returns true if a_Other doesn't contain exactly the same enchantments and levels */\n\tbool operator !=(const cEnchantments & a_Other) const;\n\n\t/** Writes the enchantments into the specified NBT writer; begins with the LIST tag of the specified name (\"ench\" or \"StoredEnchantments\") */\n\tfriend void EnchantmentSerializer::WriteToNBTCompound(const cEnchantments & a_Enchantments, cFastNBTWriter & a_Writer, const AString & a_ListTagName);\n\n\t/** Reads the enchantments from the specified NBT list tag (ench or StoredEnchantments) */\n\tfriend void EnchantmentSerializer::ParseFromNBT(cEnchantments & a_Enchantments, const cParsedNBT & a_NBT, int a_EnchListTagIdx);\n\nprotected:\n\t/** Maps enchantment ID -> enchantment level */\n\ttypedef std::map<int, unsigned int> cMap;\n\n\t/** Currently stored enchantments */\n\tcMap m_Enchantments;\n\npublic:\n\t/** Make this class iterable */\n\tcMap::const_iterator begin() const { return m_Enchantments.begin(); }\n\tcMap::const_iterator end()   const { return m_Enchantments.end(); }\n};  // tolua_export\n\n\n\n\n// Define the cWeightedEnchantment struct for the Enchanting System to store the EnchantmentWeights:\nstruct cWeightedEnchantment\n{\n\tint m_Weight;\n\tcEnchantments m_Enchantments;\n};\n\n\n\n"
  },
  {
    "path": "src/Endianness.h",
    "content": "#pragma once\n\n#include <array>\ntemplate <typename T>\nusing Bytes = std::array<std::byte, sizeof(T)>;\n\n// bit_cast used for going between ulong, float, etc. It's a new C++20 feature\n#ifdef __cpp_lib_bit_cast\n#include <bit>\nusing std::bit_cast;\n\n// Fallback in case we're using C++17\n#else\n// bit-for-bit convert one type to another. In C++ the only non-UB way to do this is *memcpy*. Nearly every other\n// option is a strict aliasing violation.\ntemplate<class To, class From>\nstd::enable_if_t<\n\tsizeof(To) == sizeof(From),\n\tTo>\nbit_cast(const From &src) noexcept\n{\n\tTo dst;\n\tstd::memcpy(&dst, &src, sizeof(To));\n\treturn dst;\n}\n#endif\n\n\n/** Converts a 16-bit host integer or float value to bytes in big-endian (Network) order.\n@tparam Value The host 16-bit type (Int16, UInt16). Usually inferred.\n@param a_Value The input integer or float value.\n@return The resulting bytes. */\ntemplate<typename Value, std::enable_if_t<sizeof(Value) == 2, bool> = true>\ninline Bytes<Value> HostToNetwork(Value a_Value)\n{\n\tUInt16 Bits = bit_cast<UInt16>(a_Value);\n\treturn\n\t{\n\t\tstd::byte(Bits >> 8),\n\t\tstd::byte(Bits)\n\t};\n}\n\n/** Converts a 32-bit host integer or float value to bytes in big-endian (Network) order.\n@tparam Value The host 32-bit type (Int32, UInt32, float). Usually inferred.\n@param a_Value The input integer or float value.\n@return The resulting bytes. */\ntemplate<typename Value, std::enable_if_t<sizeof(Value) == 4, bool> = true>\ninline Bytes<Value> HostToNetwork(Value a_Value)\n{\n\tUInt32 Bits = bit_cast<UInt32>(a_Value);\n\treturn\n\t{\n\t\tstd::byte(Bits >> 24),\n\t\tstd::byte(Bits >> 16),\n\t\tstd::byte(Bits >> 8),\n\t\tstd::byte(Bits)\n\t};\n}\n\n/** Converts a 64-bit host integer or float value to bytes in big-endian (Network) order.\n@tparam Value The host 64-bit type (Int64, UInt64, double). Usually inferred.\n@param a_Value The input integer or float value.\n@return The resulting bytes. */\ntemplate<typename Value, std::enable_if_t<sizeof(Value) == 8, bool> = true>\ninline Bytes<Value> HostToNetwork(Value a_Value)\n{\n\tUInt64 Bits = bit_cast<UInt64>(a_Value);\n\treturn\n\t{\n\t\tstd::byte(Bits >> 56),\n\t\tstd::byte(Bits >> 48),\n\t\tstd::byte(Bits >> 40),\n\t\tstd::byte(Bits >> 32),\n\t\tstd::byte(Bits >> 24),\n\t\tstd::byte(Bits >> 16),\n\t\tstd::byte(Bits >> 8),\n\t\tstd::byte(Bits)\n\t};\n}\n\n/** Reads a 16-bit integer or float value from big-endian (Network) bytes.\n@tparam Value The desired 16-bit type (Int16, UInt16)\n@param a_Value The input bytes.\n@return The resulting integer or float value. */\ntemplate<typename Value, std::enable_if_t<sizeof(Value) == 2, bool> = true>\ninline Value NetworkToHost(Bytes<Value> a_Value)\n{\n\tUInt16 val = UInt16(\n\t\tUInt16(a_Value[0]) << 8 |\n\t\tUInt16(a_Value[1]));\n\treturn bit_cast<Value>(val);\n}\n\n/** Reads a 32-bit integer or float value from big-endian (Network) bytes.\n@tparam Value The desired 32-bit type (Int32, UInt32, float)\n@param a_Value The input bytes.\n@return The resulting integer or float value. */\ntemplate<typename Value, std::enable_if_t<sizeof(Value) == 4, bool> = true>\ninline Value NetworkToHost(Bytes<Value> a_Value)\n{\n\tUInt32 val = UInt32(\n\t\tUInt32(a_Value[0]) << 24 |\n\t\tUInt32(a_Value[1]) << 16 |\n\t\tUInt32(a_Value[2]) << 8 |\n\t\tUInt32(a_Value[3]));\n\treturn bit_cast<Value>(val);\n}\n\n/** Reads a 64-bit integer or float value from big-endian (Network) bytes.\n@tparam Value The desired 64-bit type (Int64, UInt64, double)\n@param a_Value The input bytes.\n@return The resulting integer or float value. */\ntemplate<typename Value, std::enable_if_t<sizeof(Value) == 8, bool> = true>\ninline Value NetworkToHost(Bytes<Value> a_Value)\n{\n\tUInt64 val = UInt64(\n\t\tUInt64(a_Value[0]) << 56 |\n\t\tUInt64(a_Value[1]) << 48 |\n\t\tUInt64(a_Value[2]) << 40 |\n\t\tUInt64(a_Value[3]) << 32 |\n\t\tUInt64(a_Value[4]) << 24 |\n\t\tUInt64(a_Value[5]) << 16 |\n\t\tUInt64(a_Value[6]) << 8 |\n\t\tUInt64(a_Value[7]));\n\treturn bit_cast<Value>(val);\n}\n\n/** Reads an integer or float type from its big-endian (Network) bytes.\n@tparam Value The desired result type (Int16 / 32 / 64, UInt16 / 32 / 64, float, double).\n@param a_Mem A pointer to the first input byte. Length is inferred from the result type.\n@return The resulting integer or float value.\n\nConsider using NetworkToHost when the data is owned since it provides additional type safety (length is known). */\ntemplate<typename Value>\ninline Value NetworkBufToHost(const std::byte* a_Mem)\n{\n\t// Copy unfortunately needed to add the length information required by the rest of the API.\n\t// Gets completely optimised out in my testing.\n\tBytes<Value> bytes;\n\tstd::copy(a_Mem, a_Mem + sizeof(Value), bytes.begin());\n\treturn NetworkToHost<Value>(bytes);\n}\n"
  },
  {
    "path": "src/Entities/ArrowEntity.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Player.h\"\n#include \"ArrowEntity.h\"\n#include \"../Chunk.h\"\n#include \"../Blocks/BlockButton.h\"\n\n\n\n\n\ncArrowEntity::cArrowEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):\n\tSuper(pkArrow, a_Creator, a_Pos, a_Speed, 0.5f, 0.5f),\n\tm_PickupState(psNoPickup),\n\tm_DamageCoeff(2),\n\tm_IsCritical(false),\n\tm_Timer(0),\n\tm_bIsCollected(false)\n{\n\tSetMass(0.1);\n\tSetGravity(-20.0f);\n\n\tFLOGD(\"Created arrow {0} with speed {1:.02f} and rot {{{2:.02f}, {3:.02f}}}\",\n\t\tm_UniqueID, GetSpeed(), GetYaw(), GetPitch()\n\t);\n}\n\n\n\n\n\ncArrowEntity::cArrowEntity(cPlayer & a_Player, double a_Force) :\n\tcArrowEntity(&a_Player, a_Player.GetThrowStartPos(), a_Player.GetThrowSpeed(a_Force * 1.5 * 20))\n{\n\tm_IsCritical = a_Force >= 1;\n\tm_PickupState = a_Player.IsGameModeCreative() ? psInCreative : psInSurvivalOrCreative;\n}\n\n\n\n\n\nbool cArrowEntity::CanPickup(const cPlayer & a_Player) const\n{\n\tswitch (m_PickupState)\n\t{\n\t\tcase psNoPickup:             return false;\n\t\tcase psInSurvivalOrCreative: return (a_Player.IsGameModeSurvival() || a_Player.IsGameModeCreative());\n\t\tcase psInCreative:           return a_Player.IsGameModeCreative();\n\t}\n\tUNREACHABLE(\"Unsupported arrow pickup state\");\n}\n\n\n\n\n\nvoid cArrowEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\t// Save the direction we're going in before Super resets it\n\tauto Speed = GetSpeed();\n\tSpeed.Normalize();\n\n\t/*\n\tThe line tracer returns the arrow hit position located on the face of a block;\n\tif the arrow hit a block at -5, 95, -5 then a_HitPos would start off as -4, 95.5, -4.1,\n\ti.e. it collided with the X face.\n\n\tFirst we subtract a bit of speed vector so it doesn't appear black clientside.\n\n\tThen we add a bit of speed vector to make a_HitPos -4.0001, 95.5, -4.1\n\tand floor to get exactly -5, 95, -5 which is stored in m_HitBlockPos.\n\t*/\n\n\t// Shift the arrow's position slightly back so that less than 50% of the hitbox\n\t// is in the block. Otherwise the arrow can appear black\n\tSuper::OnHitSolidBlock(a_HitPos - (Speed / 100), a_HitFace);\n\n\t// Nudge into the block a tiny bit according to its direction of travel\n\t// Floor to give the coordinates of the block it crashed into\n\tm_HitBlockPos = (a_HitPos + (Speed / 100000)).Floor();\n\n\t// Broadcast arrow hit sound\n\tm_World->BroadcastSoundEffect(\"entity.arrow.hit\", m_HitBlockPos, 0.5f, static_cast<float>(0.75 + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));\n\n\t// Trigger any buttons that were hit\n\t// Wooden buttons will be depressed by the arrow\n\tcBlockButtonHandler::OnArrowHit(*m_World, m_HitBlockPos, a_HitFace);\n\n\tif ((m_World->GetBlock(m_HitBlockPos) == E_BLOCK_TNT) && IsOnFire())\n\t{\n\t\tm_World->SetBlock(m_HitBlockPos, E_BLOCK_AIR, 0);\n\t\tm_World->SpawnPrimedTNT(m_HitBlockPos);\n\t}\n}\n\n\n\n\n\nvoid cArrowEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tSuper::OnHitEntity(a_EntityHit, a_HitPos);\n\n\tint Damage = static_cast<int>(GetSpeed().Length() / 20 * m_DamageCoeff + 0.5);\n\tif (m_IsCritical)\n\t{\n\t\tDamage += m_World->GetTickRandomNumber(Damage / 2 + 2);\n\t}\n\n\tunsigned int PowerLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPower);\n\tif (PowerLevel > 0)\n\t{\n\t\tint ExtraDamage = static_cast<int>(ceil(0.25 * (PowerLevel + 1)));\n\t\tDamage += ExtraDamage;\n\t}\n\n\tdouble Knockback = 10;\n\n\tunsigned int PunchLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPunch);\n\tunsigned int PunchLevelMultiplier = 8;\n\n\tKnockback += PunchLevelMultiplier * PunchLevel;\n\ta_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), Damage, Knockback);\n\n\tif (IsOnFire() && !a_EntityHit.IsInWater())\n\t{\n\t\ta_EntityHit.StartBurning(100);\n\t}\n\n\t// Broadcast successful hit sound\n\tGetWorld()->BroadcastSoundEffect(\"entity.arrow.hit\", GetPosition(), 0.5, static_cast<float>(0.75 + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));\n\n\tDestroy();\n}\n\n\n\n\n\nvoid cArrowEntity::CollectedBy(cPlayer & a_Dest)\n{\n\tif (m_IsInGround && !m_bIsCollected && CanPickup(a_Dest))\n\t{\n\t\t// Do not add the arrow to the inventory when the player is in creative:\n\t\tif (!a_Dest.IsGameModeCreative())\n\t\t{\n\t\t\tint NumAdded = a_Dest.GetInventory().AddItem(cItem(E_ITEM_ARROW));\n\t\t\tif (NumAdded == 0)\n\t\t\t{\n\t\t\t\t// No space in the inventory\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tGetWorld()->BroadcastCollectEntity(*this, a_Dest, 1);\n\t\tGetWorld()->BroadcastSoundEffect(\"entity.item.pickup\", GetPosition(), 0.3f, (1.2f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));\n\t\tm_bIsCollected = true;\n\t}\n}\n\n\n\n\n\nvoid cArrowEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\tm_Timer += a_Dt;\n\n\tif (m_bIsCollected)\n\t{\n\t\tif (m_Timer > std::chrono::milliseconds(500))\n\t\t{\n\t\t\tDestroy();\n\t\t\treturn;\n\t\t}\n\t}\n\telse if (m_Timer > std::chrono::minutes(5))\n\t{\n\t\tDestroy();\n\t\treturn;\n\t}\n\n\tif (m_IsInGround)\n\t{\n\t\tif (m_World->GetBlock(m_HitBlockPos) == E_BLOCK_AIR)  // Block attached to was destroyed?\n\t\t{\n\t\t\tm_IsInGround = false;  // Yes, begin simulating physics again\n\t\t}\n\t}\n\telse if (IsInWater())  // Arrow in water?\n\t{\n\t\tApplyFriction(m_Speed, ARROW_WATER_FRICTION, static_cast<float>(a_Dt.count()));  // Yes, slow down arrow\n\t}\n}\n\n\n\n\n\nbool cArrowEntity::DoesPreventBlockPlacement(void) const\n{\n\treturn false;\n}\n"
  },
  {
    "path": "src/Entities/ArrowEntity.h",
    "content": "\n// ArrowEntity.h\n\n// Declares the cArrowEntity representing the arrow that has been shot by the player or by a skeleton\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cArrowEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\n\t// tolua_begin\n\n\npublic:\n\n\t/** Determines when the arrow can be picked up (depending on player gamemode). Corresponds to the MCA file \"pickup\" field */\n\tenum ePickupState\n\t{\n\t\tpsNoPickup             = 0,\n\t\tpsInSurvivalOrCreative = 1,\n\t\tpsInCreative           = 2,\n\t} ;\n\n\t// tolua_end\n\n\tstatic constexpr float ARROW_WATER_FRICTION = 50.0f;    ///< Value used to calculate arrow speed in water\n\n\tCLASS_PROTODEF(cArrowEntity)\n\n\t/** Creates a new arrow with psNoPickup state and default damage modifier coeff */\n\tcArrowEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);\n\n\t/** Creates a new arrow as shot by a player, initializes it from the player object */\n\tcArrowEntity(cPlayer & a_Player, double a_Force);\n\n\t// tolua_begin\n\n\t/** Returns whether the arrow can be picked up by players */\n\tePickupState GetPickupState(void) const { return m_PickupState; }\n\n\t/** Sets a new pickup state */\n\tvoid SetPickupState(ePickupState a_PickupState) { m_PickupState = a_PickupState; }\n\n\t/** Returns the damage modifier coeff. */\n\tdouble GetDamageCoeff(void) const { return m_DamageCoeff; }\n\n\t/** Sets the damage modifier coeff */\n\tvoid SetDamageCoeff(double a_DamageCoeff) { m_DamageCoeff = a_DamageCoeff; }\n\n\t/** Returns true if the specified player can pick the arrow up */\n\tbool CanPickup(const cPlayer & a_Player) const;\n\n\t/** Returns true if the arrow is set as critical */\n\tbool IsCritical(void) const { return m_IsCritical; }\n\n\t/** Sets the IsCritical flag */\n\tvoid SetIsCritical(bool a_IsCritical) { m_IsCritical = a_IsCritical; }\n\n\t/** Gets the block arrow is in */\n\tVector3i GetBlockHit(void) const { return m_HitBlockPos; }\n\n\t// tolua_end\n\n\t/** Sets the block arrow is in. To be used by the MCA loader only! */\n\tvoid SetBlockHit(const Vector3i & a_BlockHit) { m_HitBlockPos = a_BlockHit; }\n\nprotected:\n\n\t/** Determines when the arrow can be picked up by players */\n\tePickupState m_PickupState;\n\n\t/** The coefficient applied to the damage that the arrow will deal, based on the bow enchantment. 2.0 for normal arrow */\n\tdouble m_DamageCoeff;\n\n\t/** If true, the arrow deals more damage */\n\tbool m_IsCritical;\n\n\t/** Timer for pickup collection animation or five minute timeout */\n\tstd::chrono::milliseconds m_Timer;\n\n\t/** If true, the arrow is in the process of being collected - don't go to anyone else */\n\tbool m_bIsCollected;\n\n\t/** Stores the block position that arrow is lodged into, sets m_IsInGround to false if it becomes air */\n\tVector3i m_HitBlockPos;\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\tvirtual void CollectedBy(cPlayer & a_Player) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\t// cEntity overrides:\n\tvirtual bool DoesPreventBlockPlacement(void) const override;\n\n};  // tolua_export\n"
  },
  {
    "path": "src/Entities/Boat.cpp",
    "content": "\n// Boat.cpp\n\n// Implements the cBoat class representing a boat in the world\n\n#include \"Globals.h\"\n#include \"Boat.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../ClientHandle.h\"\n#include \"Player.h\"\n\n\n\n\n\nclass cBoatCollisionCallback\n{\npublic:\n\n\tcBoatCollisionCallback(cBoat & a_Boat, cEntity * a_Attachee) :\n\t\tm_Boat(a_Boat), m_Attachee(a_Attachee)\n\t{\n\t}\n\n\tbool operator()(cEntity & a_Entity)\n\t{\n\t\t// Checks if boat is empty and if given entity is a mob:\n\t\tif ((m_Attachee == nullptr) && a_Entity.IsMob())\n\t\t{\n\t\t\t// If so attach and stop iterating:\n\t\t\ta_Entity.AttachTo(m_Boat);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\nprotected:\n\n\tcBoat & m_Boat;\n\tcEntity * m_Attachee;\n};\n\n\n\n\n\ncBoat::cBoat(Vector3d a_Pos, eMaterial a_Material) :\n\tSuper(etBoat, a_Pos, 1.375f, 0.5625f),\n\tm_LastDamage(0), m_ForwardDirection(0),\n\tm_DamageTaken(0.0f), m_Material(a_Material),\n\tm_RightPaddleUsed(false), m_LeftPaddleUsed(false)\n{\n\tSetMass(20.0f);\n\tSetGravity(-16.0f);\n\tSetAirDrag(0.05f);\n\tSetMaxHealth(6);\n\tSetHealth(6);\n}\n\n\n\n\n\nvoid cBoat::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\ta_ClientHandle.SendSpawnEntity(*this);\n\ta_ClientHandle.SendEntityMetadata(*this);  // Boat colour\n}\n\n\n\n\n\nvoid cBoat::BroadcastMovementUpdate(const cClientHandle * a_Exclude)\n{\n\t// Cannot use super::BroadcastMovementUpdate here, broadcasting position when not\n\t// expected by the client breaks things. See https://github.com/cuberite/cuberite/pull/4488\n\n\t// Process packet sending every two ticks:\n\tif ((GetWorld()->GetWorldTickAge() % 2_tick) != 0_tick)\n\t{\n\t\treturn;\n\t}\n\n\tVector3i Diff = (GetPosition() * 32.0).Floor() - (m_LastSentPosition * 32.0).Floor();\n\tif (Diff.HasNonZeroLength())  // Have we moved?\n\t{\n\t\tm_World->BroadcastEntityPosition(*this, a_Exclude);\n\t\tm_LastSentPosition = GetPosition();\n\t\tm_bDirtyOrientation = false;\n\t}\n}\n\n\n\n\n\nbool cBoat::DoTakeDamage(TakeDamageInfo & TDI)\n{\n\tm_LastDamage = 10;\n\tif (!Super::DoTakeDamage(TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n\n\tif ((TDI.Attacker != nullptr) && (TDI.Attacker->IsPlayer()))\n\t{\n\t\tcPlayer * Destroyer = static_cast<cPlayer *>(TDI.Attacker);\n\t\tif (Destroyer->IsGameModeCreative())\n\t\t{\n\t\t\tDestroy();\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tif (GetHealth() <= 0)\n\t{\n\t\tif (TDI.Attacker != nullptr)\n\t\t{\n\t\t\tif (TDI.Attacker->IsPlayer())\n\t\t\t{\n\t\t\t\tcItems Pickups;\n\t\t\t\tPickups.Add(MaterialToItem(m_Material));\n\t\t\t\tm_World->SpawnItemPickups(Pickups, GetPosX(), GetPosY(), GetPosZ(), 0, 0, 0, true);\n\t\t\t}\n\t\t}\n\t\tDestroy();\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cBoat::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tif (m_Attachee != nullptr)\n\t{\n\t\tif (m_Attachee->GetUniqueID() == a_Player.GetUniqueID())\n\t\t{\n\t\t\t// This player is already sitting in, they want out.\n\t\t\ta_Player.Detach();\n\t\t\treturn;\n\t\t}\n\n\t\tif (m_Attachee->IsPlayer())\n\t\t{\n\t\t\t// Another player is already sitting in here, cannot attach\n\t\t\treturn;\n\t\t}\n\n\t\t// Detach whatever is sitting in this boat now:\n\t\tm_Attachee->Detach();\n\t}\n\n\t// Attach the player to this boat\n\ta_Player.AttachTo(*this);\n}\n\n\n\n\n\nvoid cBoat::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\tBroadcastMovementUpdate();\n\n\tSetSpeed(GetSpeed() * 0.97);  // Slowly decrease the speed\n\n\tif ((POSY_TOINT < 0) || (POSY_TOINT >= cChunkDef::Height))\n\t{\n\t\treturn;\n\t}\n\n\tif (IsBlockWater(m_World->GetBlock(POS_TOINT)))\n\t{\n\t\tif (GetSpeedY() < 2)\n\t\t{\n\t\t\tAddSpeedY(0.2);\n\t\t}\n\t}\n\n\tif (GetLastDamage() > 0)\n\t{\n\t\tSetLastDamage(GetLastDamage() - 1);\n\t}\n}\n\n\n\n\n\nvoid cBoat::HandleSpeedFromAttachee(float a_Forward, float a_Sideways)\n{\n\tif (GetSpeed().Length() > 7.5)\n\t{\n\t\treturn;\n\t}\n\n\tVector3d ToAddSpeed = m_Attachee->GetLookVector() * (a_Sideways * 0.4) ;\n\tToAddSpeed.y = 0;\n\n\tAddSpeed(ToAddSpeed);\n}\n\n\n\n\n\nvoid cBoat::SetLastDamage(int TimeSinceLastHit)\n{\n\tm_LastDamage = TimeSinceLastHit;\n\n\t// Tell the client to play the shaking animation\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cBoat::UpdatePaddles(bool a_RightPaddleUsed, bool a_LeftPaddleUsed)\n{\n\t// Avoid telling client what it already knows since it may reset animation 1.13+\n\tconst bool Changed = (m_RightPaddleUsed != a_RightPaddleUsed) || (m_LeftPaddleUsed != a_LeftPaddleUsed);\n\n\tm_RightPaddleUsed = a_RightPaddleUsed;\n\tm_LeftPaddleUsed = a_LeftPaddleUsed;\n\n\tif (Changed)\n\t{\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n}\n\n\n\n\n\ncBoat::eMaterial cBoat::ItemToMaterial(const cItem & a_Item)\n{\n\tswitch (a_Item.m_ItemType)\n\t{\n\t\tcase E_ITEM_BOAT:          return bmOak;\n\t\tcase E_ITEM_SPRUCE_BOAT:   return bmSpruce;\n\t\tcase E_ITEM_BIRCH_BOAT:    return bmBirch;\n\t\tcase E_ITEM_JUNGLE_BOAT:   return bmJungle;\n\t\tcase E_ITEM_ACACIA_BOAT:   return bmAcacia;\n\t\tcase E_ITEM_DARK_OAK_BOAT: return bmDarkOak;\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"%s: Item type not handled %d.\", __FUNCTION__, a_Item.m_ItemType);\n\t\t\treturn cBoat::bmOak;\n\t\t}\n\t}\n}\n\n\n\n\n\nAString cBoat::MaterialToString(eMaterial a_Material)\n{\n\tswitch (a_Material)\n\t{\n\t\tcase bmOak:     return \"oak\";\n\t\tcase bmSpruce:  return \"spruce\";\n\t\tcase bmBirch:   return \"birch\";\n\t\tcase bmJungle:  return \"jungle\";\n\t\tcase bmAcacia:  return \"acacia\";\n\t\tcase bmDarkOak: return \"dark_oak\";\n\t}\n\tUNREACHABLE(\"Unsupported boat material\");\n}\n\n\n\n\n\ncBoat::eMaterial cBoat::StringToMaterial(const AString & a_Material)\n{\n\tif (a_Material == \"oak\")\n\t{\n\t\treturn bmOak;\n\t}\n\telse if (a_Material == \"spruce\")\n\t{\n\t\treturn bmSpruce;\n\t}\n\telse if (a_Material == \"birch\")\n\t{\n\t\treturn bmBirch;\n\t}\n\telse if (a_Material == \"jungle\")\n\t{\n\t\treturn bmJungle;\n\t}\n\telse if (a_Material == \"acacia\")\n\t{\n\t\treturn bmAcacia;\n\t}\n\telse if (a_Material == \"dark_oak\")\n\t{\n\t\treturn bmDarkOak;\n\t}\n\telse\n\t{\n\t\treturn bmOak;\n\t}\n}\n\n\n\n\n\ncItem cBoat::MaterialToItem(eMaterial a_Material)\n{\n\tswitch (a_Material)\n\t{\n\t\tcase bmOak:     return cItem(E_ITEM_BOAT);\n\t\tcase bmSpruce:  return cItem(E_ITEM_SPRUCE_BOAT);\n\t\tcase bmBirch:   return cItem(E_ITEM_BIRCH_BOAT);\n\t\tcase bmJungle:  return cItem(E_ITEM_JUNGLE_BOAT);\n\t\tcase bmAcacia:  return cItem(E_ITEM_ACACIA_BOAT);\n\t\tcase bmDarkOak: return cItem(E_ITEM_DARK_OAK_BOAT);\n\t}\n\tUNREACHABLE(\"Unsupported boat material\");\n}\n\n\n\n\n\nvoid cBoat::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\t/** Special version of cEntity::HandlePhysics(...) function for boats, checks if mobs\n\tcolliding with the boat can be attached and does if that's the case, then returns to\n\tnormal physics calcualtions */\n\n\t// Calculate boat's bounding box, run collision callback on all entities in said box\n\tcBoatCollisionCallback BoatCollisionCallback(*this, m_Attachee);\n\tVector3d BoatPosition = GetPosition();\n\tcBoundingBox bbBoat(\n\t\tVector3d(BoatPosition.x, floor(BoatPosition.y), BoatPosition.z), GetWidth() / 2, GetHeight());\n\tm_World->ForEachEntityInBox(bbBoat, BoatCollisionCallback);\n\n\t// Return to calculating physics normally\n\tSuper::HandlePhysics(a_Dt, a_Chunk);\n}\n"
  },
  {
    "path": "src/Entities/Boat.h",
    "content": "\n// Boat.h\n\n// Declares the cBoat class representing a boat in the world\n\n\n\n\n\n#pragma once\n\n#include \"Entity.h\"\n\n\n\n// tolua_begin\n\nclass cBoat:\n\tpublic cEntity\n{\n\t// tolua_end\n\n\tusing Super = cEntity;\n\n\t// tolua_begin\n\npublic:\n\tenum eMaterial\n\t{\n\t\tbmOak,\n\t\tbmSpruce,\n\t\tbmBirch,\n\t\tbmJungle,\n\t\tbmAcacia,\n\t\tbmDarkOak\n\t};\n\n\t// tolua_end\n\n\tCLASS_PROTODEF(cBoat)\n\n\tcBoat(Vector3d a_Pos, eMaterial a_Material);\n\n\t// cEntity overrides:\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\tvirtual void BroadcastMovementUpdate(const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\tvirtual bool DoTakeDamage(TakeDamageInfo & TDI) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void HandleSpeedFromAttachee(float a_Forward, float a_Sideways) override;\n\tvirtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tint GetLastDamage(void) const { return m_LastDamage; }\n\tint GetForwardDirection(void) const { return m_ForwardDirection; }\n\n\tfloat GetDamageTaken(void) const { return m_DamageTaken; }\n\n\t// tolua_begin\n\n\t/** Returns the eMaterial of the boat */\n\teMaterial GetMaterial(void) const { return m_Material; }\n\n\t/** Sets the eMaterial of the boat */\n\tvoid SetMaterial(cBoat::eMaterial a_Material) { m_Material = a_Material; }\n\n\t/** Returns the eMaterial that should be used for a boat created from the specified item. Returns bmOak if not a boat item */\n\tstatic eMaterial ItemToMaterial(const cItem & a_Item);\n\n\t/** Returns the boat item of the boat material */\n\tstatic cItem MaterialToItem(eMaterial a_Material);\n\n\t/** Returns the eMaterial as string */\n\tstatic AString MaterialToString(const eMaterial a_Material);\n\n\t/** Returns the boat material for the passed string. Returns oak if not valid */\n\tstatic eMaterial StringToMaterial(const AString & a_Material);\n\n\t// tolua_end\n\n\tbool IsRightPaddleUsed(void) const { return m_RightPaddleUsed; }\n\tbool IsLeftPaddleUsed(void) const { return m_LeftPaddleUsed; }\n\n\tvoid SetLastDamage(int TimeSinceLastHit);\n\n\tvoid UpdatePaddles(bool rightPaddleUsed, bool leftPaddleUsed);\nprivate:\n\tint m_LastDamage;\n\tint m_ForwardDirection;\n\n\tfloat m_DamageTaken;\n\n\teMaterial m_Material;\n\n\tbool m_RightPaddleUsed;\n\tbool m_LeftPaddleUsed;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tArrowEntity.cpp\n\tBoat.cpp\n\tEnderCrystal.cpp\n\tEntity.cpp\n\tEntityEffect.cpp\n\tExpBottleEntity.cpp\n\tExpOrb.cpp\n\tFallingBlock.cpp\n\tFireChargeEntity.cpp\n\tFireworkEntity.cpp\n\tFloater.cpp\n\tGhastFireballEntity.cpp\n\tHangingEntity.cpp\n\tItemFrame.cpp\n\tLeashKnot.cpp\n\tMinecart.cpp\n\tPainting.cpp\n\tPawn.cpp\n\tPickup.cpp\n\tPlayer.cpp\n\tProjectileEntity.cpp\n\tSplashPotionEntity.cpp\n\tTNTEntity.cpp\n\tThrownEggEntity.cpp\n\tThrownEnderPearlEntity.cpp\n\tThrownSnowballEntity.cpp\n\tWitherSkullEntity.cpp\n\n\tArrowEntity.h\n\tBoat.h\n\tEnderCrystal.h\n\tEntity.h\n\tEntityEffect.h\n\tExpBottleEntity.h\n\tExpOrb.h\n\tFallingBlock.h\n\tFireChargeEntity.h\n\tFireworkEntity.h\n\tFloater.h\n\tGhastFireballEntity.h\n\tHangingEntity.h\n\tItemFrame.h\n\tLeashKnot.h\n\tMinecart.h\n\tPainting.h\n\tPawn.h\n\tPickup.h\n\tPlayer.h\n\tProjectileEntity.h\n\tSplashPotionEntity.h\n\tTNTEntity.h\n\tThrownEggEntity.h\n\tThrownEnderPearlEntity.h\n\tThrownSnowballEntity.h\n\tWitherSkullEntity.h\n)\n"
  },
  {
    "path": "src/Entities/EnderCrystal.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"EnderCrystal.h\"\n#include \"../ClientHandle.h\"\n#include \"../Chunk.h\"\n#include \"../World.h\"\n\n\n\n\n\ncEnderCrystal::cEnderCrystal(Vector3d a_Pos, bool a_ShowBottom) :\n\tcEnderCrystal(a_Pos, {}, false, a_ShowBottom)\n{\n}\n\n\n\n\n\ncEnderCrystal::cEnderCrystal(Vector3d a_Pos, Vector3i a_BeamTarget, bool a_DisplayBeam, bool a_ShowBottom) :\n\tSuper(etEnderCrystal, a_Pos, 2.0f, 2.0f),\n\tm_BeamTarget(a_BeamTarget),\n\tm_DisplayBeam(a_DisplayBeam),\n\tm_ShowBottom(a_ShowBottom)\n{\n\tSetMaxHealth(5);\n}\n\n\n\n\n\nvoid cEnderCrystal::SetShowBottom(bool a_ShowBottom)\n{\n\tm_ShowBottom = a_ShowBottom;\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cEnderCrystal::SetBeamTarget(Vector3i a_BeamTarget)\n{\n\tm_BeamTarget = a_BeamTarget;\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cEnderCrystal::SetDisplayBeam(bool a_DisplayBeam)\n{\n\tm_DisplayBeam = a_DisplayBeam;\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cEnderCrystal::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\ta_ClientHandle.SendSpawnEntity(*this);\n\ta_ClientHandle.SendEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cEnderCrystal::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\tif ((m_World->GetDimension() == dimEnd) && (m_World->GetBlock(POS_TOINT) != E_BLOCK_FIRE))\n\t{\n\t\tm_World->SetBlock(POS_TOINT, E_BLOCK_FIRE, 0);\n\t}\n}\n\n\n\n\n\nvoid cEnderCrystal::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\n\t// Destroy first so the Explodinator doesn't find us (when iterating through entities):\n\tDestroy();\n\n\tm_World->DoExplosionAt(6.0, GetPosX(), GetPosY() + GetHeight() / 2, GetPosZ(), true, esEnderCrystal, this);\n\n\tconst auto Position = GetPosition().Floor();\n\tif (cChunkDef::IsValidHeight(Position))\n\t{\n\t\tm_World->SetBlock(Position, E_BLOCK_FIRE, 0);\n\t}\n}\n"
  },
  {
    "path": "src/Entities/EnderCrystal.h",
    "content": "\n#pragma once\n\n#include \"Entity.h\"\n\n\n\n\n\n// tolua_begin\nclass cEnderCrystal :\n\tpublic cEntity\n{\n\t// tolua_end\n\tusing Super = cEntity;\n\npublic:\n\n\tCLASS_PROTODEF(cEnderCrystal)\n\n\tcEnderCrystal(Vector3d a_Pos, bool a_ShowBottom);\n\tcEnderCrystal(Vector3d a_Pos, Vector3i a_BeamTarget, bool a_DisplayBeam, bool a_ShowBottom);\n\n\t// tolua_begin\n\n\tVector3i GetBeamTarget() const { return m_BeamTarget; }\n\tvoid SetBeamTarget(Vector3i a_BeamTarget);\n\n\t/** If the EnderCrystal should send it's beam to the client and save it. */\n\tbool DisplaysBeam() const { return m_DisplayBeam; }\n\tvoid SetDisplayBeam(bool a_DisplayBeam);\n\n\tbool ShowsBottom() const { return m_ShowBottom; }\n\tvoid SetShowBottom(bool a_ShowBottom);\n\n\t// tolua_end\n\nprivate:\n\n\tVector3i m_BeamTarget;\n\tbool m_DisplayBeam;\n\n\t// If the bedrock base should be displayed.\n\tbool m_ShowBottom;\n\n\t// cEntity overrides:\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\n};  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Entities/Entity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Entity.h\"\n#include \"Player.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../Root.h\"\n#include \"../Matrix4.h\"\n#include \"../ClientHandle.h\"\n#include \"../Chunk.h\"\n#include \"../Simulator/FluidSimulator.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../LineBlockTracer.h\"\n#include \"../Items/ItemHandler.h\"\n#include \"../FastRandom.h\"\n#include \"../NetherPortalScanner.h\"\n#include \"../BoundingBox.h\"\n#include \"../WorldStorage/NamespaceSerializer.h\"\n\n\n\n\nstatic UInt32 GetNextUniqueID(void)\n{\n\tstatic std::atomic<UInt32> counter(1);\n\treturn counter.fetch_add(1);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntity:\n\ncEntity::cEntity(eEntityType a_EntityType, Vector3d a_Pos, float a_Width, float a_Height):\n\tm_UniqueID(GetNextUniqueID()),\n\tm_Health(1),\n\tm_MaxHealth(1),\n\tm_AttachedTo(nullptr),\n\tm_Attachee(nullptr),\n\tm_bDirtyHead(false),\n\tm_bDirtyOrientation(false),\n\tm_bHasSentNoSpeed(true),\n\tm_bOnGround(false),\n\tm_Gravity(-9.81f),\n\tm_AirDrag(0.02f),\n\tm_LastSentPosition(a_Pos),\n\tm_LastPosition(a_Pos),\n\tm_EntityType(a_EntityType),\n\tm_World(nullptr),\n\tm_IsFireproof(false),\n\tm_TicksSinceLastBurnDamage(0),\n\tm_TicksSinceLastLavaDamage(0),\n\tm_TicksSinceLastFireDamage(0),\n\tm_TicksLeftBurning(0),\n\tm_TicksSinceLastVoidDamage(0),\n\tm_IsInFire(false),\n\tm_IsInLava(false),\n\tm_IsInWater(false),\n\tm_IsHeadInWater(false),\n\tm_AirLevel(MAX_AIR_LEVEL),\n\tm_AirTickTimer(DROWNING_TICKS),\n\tm_TicksAlive(0),\n\tm_IsTicking(false),\n\tm_ParentChunk(nullptr),\n\tm_HeadYaw(0.0),\n\tm_Rot(0.0, 0.0, 0.0),\n\tm_Position(a_Pos),\n\tm_WaterSpeed(0, 0, 0),\n\tm_Mass (0.001),  // Default 1g\n\tm_Width(a_Width),\n\tm_Height(a_Height),\n\tm_InvulnerableTicks(0)\n{\n\tm_WorldChangeInfo.m_NewWorld = nullptr;\n}\n\n\n\n\n\nconst char * cEntity::GetClass(void) const\n{\n\treturn \"cEntity\";\n}\n\n\n\n\n\nconst char * cEntity::GetClassStatic(void)\n{\n\treturn \"cEntity\";\n}\n\n\n\n\n\nconst char * cEntity::GetParentClass(void) const\n{\n\treturn \"\";\n}\n\n\n\n\n\nbool cEntity::Initialize(OwnedEntity a_Self, cWorld & a_EntityWorld)\n{\n\tif (cPluginManager::Get()->CallHookSpawningEntity(a_EntityWorld, *this))\n\t{\n\t\treturn false;\n\t}\n\n\t/*\n\t// DEBUG:\n\tFLOGD(\"Initializing entity #{0} ({1}) at {2:.02f}\",\n\t\tm_UniqueID, GetClass(), m_Pos\n\t);\n\t*/\n\n\n\tASSERT(a_Self->IsPlayer() || (m_World == nullptr));  // Players' worlds are loaded from disk.\n\tASSERT(GetParentChunk() == nullptr);\n\tSetWorld(&a_EntityWorld);\n\ta_EntityWorld.AddEntity(std::move(a_Self));\n\n\treturn true;\n}\n\n\n\n\n\nvoid cEntity::OnAcquireSpectator(cPlayer & a_Player)\n{\n\tm_Spectators.push_back(&a_Player);\n}\n\n\n\n\n\nvoid cEntity::OnAddToWorld(cWorld & a_World)\n{\n\t// Spawn the entity on the clients:\n\tm_LastSentPosition = GetPosition();\n\ta_World.BroadcastSpawnEntity(*this);\n\tBroadcastLeashedMobs();\n}\n\n\n\n\n\nvoid cEntity::OnLoseSpectator(cPlayer & a_Player)\n{\n\tconst auto Spectator = std::find(m_Spectators.begin(), m_Spectators.end(), &a_Player);\n\n\tASSERT(Spectator != m_Spectators.end());\n\tstd::swap(*Spectator, m_Spectators.back());\n\tm_Spectators.pop_back();\n}\n\n\n\n\n\nvoid cEntity::OnRemoveFromWorld(cWorld & a_World)\n{\n\t// Remove all mobs from the leashed list of mobs:\n\twhile (!m_LeashedMobs.empty())\n\t{\n\t\tm_LeashedMobs.front()->Unleash(false, true);\n\t}\n\n\tfor (const auto Player : m_Spectators)\n\t{\n\t\tPlayer->OnLoseSpectated();\n\t}\n\n\tm_Spectators.clear();\n\n\tif (m_AttachedTo != nullptr)\n\t{\n\t\tDetach();\n\t}\n\n\tif (m_Attachee != nullptr)\n\t{\n\t\tm_Attachee->Detach();\n\t}\n\n\ta_World.BroadcastDestroyEntity(*this);\n}\n\n\n\n\n\nvoid cEntity::WrapHeadYaw(void)\n{\n\tm_HeadYaw = NormalizeAngleDegrees(m_HeadYaw);\n}\n\n\n\n\n\nvoid cEntity::WrapRotation(void)\n{\n\tm_Rot.x = NormalizeAngleDegrees(m_Rot.x);\n\tm_Rot.y = NormalizeAngleDegrees(m_Rot.y);\n}\n\n\n\n\n\nvoid cEntity::WrapSpeed(void)\n{\n\tm_Speed.x = Clamp(m_Speed.x, -78.0, 78.0);\n\tm_Speed.y = Clamp(m_Speed.y, -78.0, 78.0);\n\tm_Speed.z = Clamp(m_Speed.z, -78.0, 78.0);\n}\n\n\n\n\n\nvoid cEntity::SetParentChunk(cChunk * a_Chunk)\n{\n\tm_ParentChunk = a_Chunk;\n}\n\n\n\n\n\nvoid cEntity::Destroy()\n{\n\tSetIsTicking(false);\n\n\t// Unleash leashed mobs\n\twhile (!m_LeashedMobs.empty())\n\t{\n\t\tm_LeashedMobs.front()->Unleash(true, true);\n\t}\n\n\tauto ParentChunkCoords = cChunkDef::BlockToChunk(GetPosition());\n\tm_World->QueueTask([this, ParentChunkCoords](cWorld & a_World)\n\t{\n\t\tLOGD(\"Destroying entity #%i (%s) from chunk (%d, %d)\",\n\t\t\tthis->GetUniqueID(), this->GetClass(),\n\t\t\tParentChunkCoords.m_ChunkX, ParentChunkCoords.m_ChunkZ\n\t\t);\n\t\tUNUSED(ParentChunkCoords);  // Non Debug mode only\n\n\t\t// Make sure that RemoveEntity returned a valid smart pointer\n\t\t// Also, not storing the returned pointer means automatic destruction\n\t\tVERIFY(a_World.RemoveEntity(*this));\n\t});\n}\n\n\n\n\n\nvoid cEntity::TakeDamage(cEntity & a_Attacker)\n{\n\tint RawDamage = a_Attacker.GetRawDamageAgainst(*this);\n\tTakeDamage(dtAttack, &a_Attacker, RawDamage, a_Attacker.GetKnockbackAmountAgainst(*this));\n}\n\n\n\n\n\nvoid cEntity::TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_RawDamage, double a_KnockbackAmount)\n{\n\tfloat FinalDamage = static_cast<float>(a_RawDamage);\n\tfloat ArmorCover = GetArmorCoverAgainst(a_Attacker, a_DamageType, a_RawDamage);\n\n\tApplyArmorDamage(static_cast<int>(ArmorCover));\n\n\tcEntity::TakeDamage(a_DamageType, a_Attacker, a_RawDamage, FinalDamage, a_KnockbackAmount);\n}\n\n\n\n\n\nvoid cEntity::TakeDamage(eDamageType a_DamageType, UInt32 a_AttackerID, int a_RawDamage, double a_KnockbackAmount)\n{\n\tm_World->DoWithEntityByID(a_AttackerID, [=](cEntity & a_Attacker)\n\t\t{\n\t\t\tcPawn * Attacker;\n\t\t\tif (a_Attacker.IsPawn())\n\t\t\t{\n\t\t\t\tAttacker = static_cast<cPawn*>(&a_Attacker);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAttacker = nullptr;\n\t\t\t}\n\n\t\t\tTakeDamage(a_DamageType, Attacker, a_RawDamage, a_KnockbackAmount);\n\t\t\treturn true;\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cEntity::TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_RawDamage, float a_FinalDamage, double a_KnockbackAmount)\n{\n\tTakeDamageInfo TDI;\n\tTDI.DamageType = a_DamageType;\n\tif ((a_Attacker != nullptr) && a_Attacker->IsPawn())\n\t{\n\t\tTDI.Attacker = a_Attacker;\n\t}\n\telse\n\t{\n\t\tTDI.Attacker = nullptr;\n\t}\n\n\tif (a_RawDamage <= 0)\n\t{\n\t\ta_RawDamage = 0;\n\t}\n\n\tTDI.RawDamage = a_RawDamage;\n\n\tif (a_FinalDamage <= 0)\n\t{\n\t\ta_FinalDamage = 0;\n\t}\n\n\tTDI.FinalDamage = a_FinalDamage;\n\n\tVector3d Heading(0, 0, 0);\n\tif (a_Attacker != nullptr)\n\t{\n\t\tHeading = a_Attacker->GetLookVector();\n\t}\n\n\tint KnockbackHeight = 3;\n\n\tif (IsPlayer())\n\t{\n\t\tKnockbackHeight = 8;\n\t}\n\n\t// Apply slight height to knockback\n\tVector3d FinalKnockback = Vector3d(Heading.x * a_KnockbackAmount, Heading.y + KnockbackHeight, Heading.z * a_KnockbackAmount);\n\n\tTDI.Knockback = FinalKnockback;\n\tDoTakeDamage(TDI);\n}\n\n\n\n\n\nvoid cEntity::SetYawFromSpeed(void)\n{\n\tconst double EPS = 0.0000001;\n\tif ((std::abs(m_Speed.x) < EPS) && (std::abs(m_Speed.z) < EPS))\n\t{\n\t\t// atan2() may overflow or is undefined, pick any number\n\t\tSetYaw(0);\n\t\treturn;\n\t}\n\tSetYaw(atan2(m_Speed.x, m_Speed.z) * 180 / M_PI);\n}\n\n\n\n\n\nvoid cEntity::SetPitchFromSpeed(void)\n{\n\tconst double EPS = 0.0000001;\n\tdouble xz = sqrt(m_Speed.x * m_Speed.x + m_Speed.z * m_Speed.z);  // Speed XZ-plane component\n\tif ((std::abs(xz) < EPS) && (std::abs(m_Speed.y) < EPS))\n\t{\n\t\t// atan2() may overflow or is undefined, pick any number\n\t\tSetPitch(0);\n\t\treturn;\n\t}\n\tSetPitch(atan2(m_Speed.y, xz) * 180 / M_PI);\n}\n\n\n\n\n\nbool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (m_Health <= 0)\n\t{\n\t\t// Can't take damage if already dead\n\t\treturn false;\n\t}\n\n\tif (m_InvulnerableTicks > 0)\n\t{\n\t\t// Entity is invulnerable\n\t\treturn false;\n\t}\n\n\tif (cRoot::Get()->GetPluginManager()->CallHookTakeDamage(*this, a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tif (IsPainting())\n\t{\n\t\tKilledBy(a_TDI);\n\n\t\tif (a_TDI.Attacker != nullptr)\n\t\t{\n\t\t\ta_TDI.Attacker->Killed(*this, a_TDI.DamageType);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tif ((a_TDI.Attacker != nullptr) && (a_TDI.Attacker->IsPlayer()))\n\t{\n\t\tcPlayer * Player = static_cast<cPlayer *>(a_TDI.Attacker);\n\n\t\tPlayer->GetEquippedItem().GetHandler().OnEntityAttack(Player, this);\n\n\t\t// Whether an enchantment boosted this attack's damage.\n\t\tbool MagicalCriticalHit = false;\n\n\t\t// IsOnGround() only is false if the player is moving downwards\n\t\t// Ref: https://minecraft.wiki/w/Damage#Critical_Hits\n\t\tif (!Player->IsOnGround())\n\t\t{\n\t\t\tif ((a_TDI.DamageType == dtAttack) || (a_TDI.DamageType == dtArrowAttack))\n\t\t\t{\n\t\t\t\ta_TDI.FinalDamage *= 1.5f;  // 150% damage\n\t\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::EntityGetsCriticalHit);\n\t\t\t}\n\t\t}\n\n\t\tconst cEnchantments & Enchantments = Player->GetEquippedItem().m_Enchantments;\n\n\t\tint SharpnessLevel = static_cast<int>(Enchantments.GetLevel(cEnchantments::enchSharpness));\n\t\tint SmiteLevel = static_cast<int>(Enchantments.GetLevel(cEnchantments::enchSmite));\n\t\tint BaneOfArthropodsLevel = static_cast<int>(Enchantments.GetLevel(cEnchantments::enchBaneOfArthropods));\n\n\t\tif (SharpnessLevel > 0)\n\t\t{\n\t\t\tMagicalCriticalHit = true;\n\t\t\ta_TDI.FinalDamage += 1.25f * SharpnessLevel;\n\t\t}\n\t\telse if (SmiteLevel > 0)\n\t\t{\n\t\t\tif (IsMob())\n\t\t\t{\n\t\t\t\tcMonster * Monster = static_cast<cMonster *>(this);\n\t\t\t\tswitch (Monster->GetMobType())\n\t\t\t\t{\n\t\t\t\t\tcase mtSkeleton:\n\t\t\t\t\tcase mtWither:\n\t\t\t\t\tcase mtZombie:\n\t\t\t\t\tcase mtZombiePigman:\n\t\t\t\t\tcase mtZombieVillager:\n\t\t\t\t\t{\n\t\t\t\t\t\tMagicalCriticalHit = true;\n\t\t\t\t\t\ta_TDI.FinalDamage += 2.5f * SmiteLevel;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault: break;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (BaneOfArthropodsLevel > 0)\n\t\t{\n\t\t\tif (IsMob())\n\t\t\t{\n\t\t\t\tcMonster * Monster = static_cast<cMonster *>(this);\n\t\t\t\tswitch (Monster->GetMobType())\n\t\t\t\t{\n\t\t\t\t\tcase mtSpider:\n\t\t\t\t\tcase mtCaveSpider:\n\t\t\t\t\tcase mtSilverfish:\n\t\t\t\t\tcase mtEndermite:\n\t\t\t\t\t{\n\t\t\t\t\t\tMagicalCriticalHit = true;\n\t\t\t\t\t\ta_TDI.FinalDamage += 2.5f * BaneOfArthropodsLevel;\n\n\t\t\t\t\t\t// The duration of the effect is a random value between 1 and 1.5 seconds at level I,\n\t\t\t\t\t\t// increasing the max duration by 0.5 seconds each level.\n\t\t\t\t\t\t// Ref: https://minecraft.wiki/w/Enchanting#Bane_of_Arthropods\n\t\t\t\t\t\tint Duration = 20 + GetRandomProvider().RandInt(BaneOfArthropodsLevel * 10);  // Duration in ticks.\n\t\t\t\t\t\tMonster->AddEntityEffect(cEntityEffect::effSlowness, Duration, 4);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault: break;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tint FireAspectLevel = static_cast<int>(Enchantments.GetLevel(cEnchantments::enchFireAspect));\n\t\tif (FireAspectLevel > 0)\n\t\t{\n\t\t\tint BurnTicks = 3;\n\n\t\t\tif (FireAspectLevel > 1)\n\t\t\t{\n\t\t\t\tBurnTicks += 4 * (FireAspectLevel - 1);\n\t\t\t}\n\n\t\t\tif (!IsMob() && !IsInWater())\n\t\t\t{\n\t\t\t\tStartBurning(BurnTicks * 20);\n\t\t\t}\n\t\t\telse if (IsMob() && !IsInWater())\n\t\t\t{\n\t\t\t\tcMonster * Monster = static_cast<cMonster *>(this);\n\t\t\t\tswitch (Monster->GetMobType())\n\t\t\t\t{\n\t\t\t\t\tcase mtGhast:\n\t\t\t\t\tcase mtZombiePigman:\n\t\t\t\t\tcase mtMagmaCube:\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tMagicalCriticalHit = true;\n\t\t\t\t\t\tStartBurning(BurnTicks * 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (MagicalCriticalHit)\n\t\t{\n\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::EntityGetsMagicalCriticalHit);\n\t\t}\n\n\t\tunsigned int ThornsLevel = 0;\n\t\tconst cItem ArmorItems[] = { GetEquippedHelmet(), GetEquippedChestplate(), GetEquippedLeggings(), GetEquippedBoots() };\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(ArmorItems); i++)\n\t\t{\n\t\t\tconst cItem & Item = ArmorItems[i];\n\t\t\tThornsLevel = std::max(ThornsLevel, Item.m_Enchantments.GetLevel(cEnchantments::enchThorns));\n\t\t}\n\n\t\tif (ThornsLevel > 0)\n\t\t{\n\t\t\tint Chance = static_cast<int>(ThornsLevel * 15);\n\n\t\t\tauto & Random = GetRandomProvider();\n\n\t\t\tif (Random.RandBool(Chance / 100.0))\n\t\t\t{\n\t\t\t\ta_TDI.Attacker->TakeDamage(dtAttack, this, 0, Random.RandReal(1.0f, 4.0f), 0);\n\t\t\t}\n\t\t}\n\n\t\tPlayer->GetStatistics().Custom[CustomStatistic::DamageDealt] += FloorC<StatisticsManager::StatValue>(a_TDI.FinalDamage * 10 + 0.5);\n\t}\n\n\tm_Health -= a_TDI.FinalDamage;\n\tm_Health = std::max(m_Health, 0.0f);\n\n\t// Add knockback:\n\tif ((IsMob() || IsPlayer()) && (a_TDI.Attacker != nullptr))\n\t{\n\t\tSetSpeed(a_TDI.Knockback);\n\t}\n\n\tm_World->BroadcastEntityAnimation(*this, [&a_TDI]\n\t{\n\t\tswitch (a_TDI.DamageType)\n\t\t{\n\t\t\tcase eDamageType::dtBurning: return EntityAnimation::PawnBurns;\n\t\t\tcase eDamageType::dtDrowning: return EntityAnimation::PawnDrowns;\n\t\t\tdefault: return EntityAnimation::PawnHurts;\n\t\t}\n\t}());\n\n\tm_InvulnerableTicks = 10;\n\n\tif (m_Health <= 0)\n\t{\n\t\tKilledBy(a_TDI);\n\n\t\tif (a_TDI.Attacker != nullptr)\n\t\t{\n\t\t\ta_TDI.Attacker->Killed(*this, a_TDI.DamageType);\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nint cEntity::GetRawDamageAgainst(const cEntity & a_Receiver)\n{\n\t// Returns the hitpoints that this pawn can deal to a_Receiver using its equipped items\n\t// Ref: https://minecraft.wiki/w/Damage#Dealing_damage as of 2012_12_20\n\tswitch (this->GetEquippedWeapon().m_ItemType)\n\t{\n\t\tcase E_ITEM_WOODEN_SWORD:    return 4;\n\t\tcase E_ITEM_GOLD_SWORD:      return 4;\n\t\tcase E_ITEM_STONE_SWORD:     return 5;\n\t\tcase E_ITEM_IRON_SWORD:      return 6;\n\t\tcase E_ITEM_DIAMOND_SWORD:   return 7;\n\n\t\tcase E_ITEM_WOODEN_AXE:      return 3;\n\t\tcase E_ITEM_GOLD_AXE:        return 3;\n\t\tcase E_ITEM_STONE_AXE:       return 4;\n\t\tcase E_ITEM_IRON_AXE:        return 5;\n\t\tcase E_ITEM_DIAMOND_AXE:     return 6;\n\n\t\tcase E_ITEM_WOODEN_PICKAXE:  return 2;\n\t\tcase E_ITEM_GOLD_PICKAXE:    return 2;\n\t\tcase E_ITEM_STONE_PICKAXE:   return 3;\n\t\tcase E_ITEM_IRON_PICKAXE:    return 4;\n\t\tcase E_ITEM_DIAMOND_PICKAXE: return 5;\n\n\t\tcase E_ITEM_WOODEN_SHOVEL:   return 1;\n\t\tcase E_ITEM_GOLD_SHOVEL:     return 1;\n\t\tcase E_ITEM_STONE_SHOVEL:    return 2;\n\t\tcase E_ITEM_IRON_SHOVEL:     return 3;\n\t\tcase E_ITEM_DIAMOND_SHOVEL:  return 4;\n\t}\n\t// All other equipped items give a damage of 1:\n\treturn 1;\n}\n\n\n\n\n\nvoid cEntity::ApplyArmorDamage(int DamageBlocked)\n{\n\t// cEntities don't necessarily have armor to damage.\n}\n\n\n\n\n\nbool cEntity::ArmorCoversAgainst(eDamageType a_DamageType)\n{\n\t// Ref.: https://minecraft.wiki/w/Armor#Effects as of 2012_12_20\n\tswitch (a_DamageType)\n\t{\n\t\tcase dtOnFire:\n\t\tcase dtSuffocating:\n\t\tcase dtDrowning:  // TODO: This one could be a special case - in various MC versions (PC vs XBox) it is and isn't armor-protected\n\t\tcase dtEnderPearl:\n\t\tcase dtStarving:\n\t\tcase dtInVoid:\n\t\tcase dtPoisoning:\n\t\tcase dtWithering:\n\t\tcase dtPotionOfHarming:\n\t\tcase dtFalling:\n\t\tcase dtLightning:\n\t\tcase dtPlugin:\n\t\tcase dtEnvironment:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tcase dtAttack:\n\t\tcase dtArrowAttack:\n\t\tcase dtCactusContact:\n\t\tcase dtMagmaContact:\n\t\tcase dtLavaContact:\n\t\tcase dtFireContact:\n\t\tcase dtExplosion:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported damage type\");\n}\n\n\n\n\n\nfloat cEntity::GetEnchantmentCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_Damage)\n{\n\tint TotalEPF = 0;\n\n\tconst cItem ArmorItems[] = { GetEquippedHelmet(), GetEquippedChestplate(), GetEquippedLeggings(), GetEquippedBoots() };\n\tfor (size_t i = 0; i < ARRAYCOUNT(ArmorItems); i++)\n\t{\n\t\tconst cItem & Item = ArmorItems[i];\n\n\t\tif ((a_DamageType != dtInVoid) && (a_DamageType != dtAdmin) && (a_DamageType != dtStarving))\n\t\t{\n\t\t\tTotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchProtection)) * 1;\n\t\t}\n\n\t\tif ((a_DamageType == dtBurning) || (a_DamageType == dtFireContact) || (a_DamageType == dtLavaContact) || (a_DamageType == dtMagmaContact))\n\t\t{\n\t\t\tTotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchFireProtection)) * 2;\n\t\t}\n\n\t\tif ((a_DamageType == dtFalling) || (a_DamageType == dtEnderPearl))\n\t\t{\n\t\t\tTotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchFeatherFalling)) * 3;\n\t\t}\n\n\t\tif (a_DamageType == dtExplosion)\n\t\t{\n\t\t\tTotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchBlastProtection)) * 2;\n\t\t}\n\n\t\t// Note: Also blocks against fire charges, etc.\n\t\tif (a_DamageType == dtProjectile)\n\t\t{\n\t\t\tTotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchProjectileProtection)) * 2;\n\t\t}\n\t}\n\tint CappedEPF = std::min(20, TotalEPF);\n\treturn (a_Damage * CappedEPF / 25.0f);\n}\n\n\n\n\n\nfloat cEntity::GetEnchantmentBlastKnockbackReduction()\n{\n\tUInt32 MaxLevel = 0;\n\n\tconst cItem ArmorItems[] = { GetEquippedHelmet(), GetEquippedChestplate(), GetEquippedLeggings(), GetEquippedBoots() };\n\n\tfor (auto & Item : ArmorItems)\n\t{\n\t\tUInt32 Level = Item.m_Enchantments.GetLevel(cEnchantments::enchBlastProtection);\n\t\tif (Level > MaxLevel)\n\t\t{\n\t\t\t// Get max blast protection\n\t\t\tMaxLevel = Level;\n\t\t}\n\t}\n\n\t// Max blast protect level is 4, each level provide 15% knock back reduction\n\tMaxLevel = std::min<UInt32>(MaxLevel, 4);\n\treturn MaxLevel * 0.15f;\n}\n\n\n\n\n\nfloat cEntity::GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_Damage)\n{\n\t// Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover\n\n\t// Filter out damage types that are not protected by armor:\n\tif (!ArmorCoversAgainst(a_DamageType))\n\t{\n\t\treturn 0;\n\t}\n\n\t// Add up all armor points:\n\t// Ref.: https://minecraft.wiki/w/Armor#Defense_points\n\tint ArmorValue = 0;\n\tint Toughness = 0;\n\tswitch (GetEquippedHelmet().m_ItemType)\n\t{\n\t\tcase E_ITEM_LEATHER_CAP:    ArmorValue += 1; break;\n\t\tcase E_ITEM_GOLD_HELMET:    ArmorValue += 2; break;\n\t\tcase E_ITEM_CHAIN_HELMET:   ArmorValue += 2; break;\n\t\tcase E_ITEM_IRON_HELMET:    ArmorValue += 2; break;\n\t\tcase E_ITEM_DIAMOND_HELMET: ArmorValue += 3; Toughness += 2; break;\n\t}\n\tswitch (GetEquippedChestplate().m_ItemType)\n\t{\n\t\tcase E_ITEM_LEATHER_TUNIC:      ArmorValue += 3; break;\n\t\tcase E_ITEM_GOLD_CHESTPLATE:    ArmorValue += 5; break;\n\t\tcase E_ITEM_CHAIN_CHESTPLATE:   ArmorValue += 5; break;\n\t\tcase E_ITEM_IRON_CHESTPLATE:    ArmorValue += 6; break;\n\t\tcase E_ITEM_DIAMOND_CHESTPLATE: ArmorValue += 8; Toughness += 2; break;\n\t}\n\tswitch (GetEquippedLeggings().m_ItemType)\n\t{\n\t\tcase E_ITEM_LEATHER_PANTS:    ArmorValue += 2; break;\n\t\tcase E_ITEM_GOLD_LEGGINGS:    ArmorValue += 3; break;\n\t\tcase E_ITEM_CHAIN_LEGGINGS:   ArmorValue += 4; break;\n\t\tcase E_ITEM_IRON_LEGGINGS:    ArmorValue += 5; break;\n\t\tcase E_ITEM_DIAMOND_LEGGINGS: ArmorValue += 6; Toughness += 2; break;\n\t}\n\tswitch (GetEquippedBoots().m_ItemType)\n\t{\n\t\tcase E_ITEM_LEATHER_BOOTS: ArmorValue += 1; break;\n\t\tcase E_ITEM_GOLD_BOOTS:    ArmorValue += 1; break;\n\t\tcase E_ITEM_CHAIN_BOOTS:   ArmorValue += 1; break;\n\t\tcase E_ITEM_IRON_BOOTS:    ArmorValue += 2; break;\n\t\tcase E_ITEM_DIAMOND_BOOTS: ArmorValue += 3; Toughness += 2; break;\n\t}\n\n\t// TODO: Special armor cases, such as wool, saddles, dog's collar\n\t// Ref.: https://minecraft.wiki/w/Armor#Mob_armor as of 2012_12_20\n\n\tfloat Reduction = std::max(ArmorValue / 5.0f, ArmorValue - a_Damage / (2.0f + Toughness / 4.0f));\n\treturn (a_Damage * std::min(20.0f, Reduction) / 25.0f);\n}\n\n\n\n\n\ndouble cEntity::GetKnockbackAmountAgainst(const cEntity & a_Receiver)\n{\n\t// Default knockback for entities\n\tdouble Knockback = 10;\n\n\t// If we're sprinting, bump up the knockback\n\tif (IsSprinting())\n\t{\n\t\tKnockback = 15;\n\t}\n\n\t// Check for knockback enchantments (punch only applies to shot arrows)\n\tunsigned int KnockbackLevel = GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchKnockback);\n\tunsigned int KnockbackLevelMultiplier = 8;\n\n\tKnockback += KnockbackLevelMultiplier * KnockbackLevel;\n\n\treturn Knockback;\n}\n\n\n\n\n\nvoid cEntity::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tm_Health = 0;\n\n\tcRoot::Get()->GetPluginManager()->CallHookKilling(*this, a_TDI.Attacker, a_TDI);\n\n\tif (m_Health > 0)\n\t{\n\t\t// Plugin wants to 'unkill' the pawn. Abort\n\t\treturn;\n\t}\n\n\t// If the victim is a player the hook is handled by the cPlayer class\n\tif (!IsPlayer())\n\t{\n\t\tAString emptystring;\n\t\tcRoot::Get()->GetPluginManager()->CallHookKilled(*this, a_TDI, emptystring);\n\t}\n\n\t// Drop loot, unless the attacker was a creative mode player:\n\tif (\n\t\t(a_TDI.Attacker == nullptr) ||\n\t\t!a_TDI.Attacker->IsPlayer() ||\n\t\t!static_cast<cPlayer *>(a_TDI.Attacker)->IsGameModeCreative()\n\t)\n\t{\n\t\tcItems Drops;\n\t\tGetDrops(Drops, a_TDI.Attacker);\n\t\tm_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ());\n\t}\n\n\tm_TicksAlive = 0;\n\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnDies);\n}\n\n\n\n\n\nvoid cEntity::Heal(int a_HitPoints)\n{\n\tm_Health += a_HitPoints;\n\tm_Health = std::min(m_Health, m_MaxHealth);\n}\n\n\n\n\n\nvoid cEntity::SetHealth(float a_Health)\n{\n\tm_Health = Clamp(a_Health, 0.0f, m_MaxHealth);\n}\n\n\n\n\n\nvoid cEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tASSERT(IsTicking());\n\tASSERT(GetWorld() != nullptr);\n\tm_TicksAlive++;\n\n\tif (m_InvulnerableTicks > 0)\n\t{\n\t\tm_InvulnerableTicks--;\n\t}\n\n\t// Non-players are destroyed as soon as they fall out of the world:\n\tif ((GetPosY() < 0) && (!IsPlayer()))\n\t{\n\t\tDestroy();\n\t\treturn;\n\t}\n\n\tif (m_AttachedTo != nullptr)\n\t{\n\t\tSetPosition(m_AttachedTo->GetPosition());\n\t}\n\telse\n\t{\n\t\tif (!a_Chunk.IsValid())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Position changed -> Super::Tick() called:\n\t\tGET_AND_VERIFY_CURRENT_CHUNK(NextChunk, POSX_TOINT, POSZ_TOINT);\n\n\t\t// Set swim states (water, lava, and fire):\n\t\tSetSwimState(*NextChunk);\n\n\t\t// Handle catching on fire and burning:\n\t\tTickBurning(*NextChunk);\n\n\t\t// Damage players if they are in the void\n\t\tif (GetPosY() < VOID_BOUNDARY)\n\t\t{\n\t\t\tTickInVoid(*NextChunk);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_TicksSinceLastVoidDamage = 0;\n\t\t}\n\n\t\t// Handle cactus damage or destruction:\n\t\tif (\n\t\t\tIsMob() || IsPickup() ||\n\t\t\t(IsPlayer() && !((static_cast<cPlayer *>(this))->IsGameModeCreative() || (static_cast<cPlayer *>(this))->IsGameModeSpectator()))\n\t\t)\n\t\t{\n\t\t\tDetectCacti();\n\t\t}\n\n\t\t// Handle magma block damage\n\t\tif\n\t\t(\n\t\t\tIsOnGround() &&\n\t\t\t(\n\t\t\t\t(IsMob() && !static_cast<cPawn *>(this)->IsFireproof()) ||\n\t\t\t\t(\n\t\t\t\t\tIsPlayer() && !((static_cast<cPlayer *>(this))->IsGameModeCreative() || (static_cast<cPlayer *>(this))->IsGameModeSpectator())\n\t\t\t\t\t&& !static_cast<cPlayer *>(this)->IsFireproof()\n\t\t\t\t\t&& !static_cast<cPlayer *>(this)->HasEntityEffect(cEntityEffect::effFireResistance)\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tDetectMagma();\n\t\t}\n\n\t\t// Handle drowning:\n\t\tif (IsMob() || IsPlayer())\n\t\t{\n\t\t\tHandleAir();\n\t\t}\n\n\t\tif (!DetectPortal())  // Our chunk is invalid if we have moved to another world\n\t\t{\n\t\t\t// None of the above functions changed position, we remain in the chunk of NextChunk\n\t\t\tHandlePhysics(a_Dt, *NextChunk);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tint BlockX = POSX_TOINT;\n\tint BlockY = POSY_TOINT;\n\tint BlockZ = POSZ_TOINT;\n\n\t// Position changed -> Super::HandlePhysics() called\n\tGET_AND_VERIFY_CURRENT_CHUNK(NextChunk, BlockX, BlockZ);\n\n\t// TODO Add collision detection with entities.\n\tauto DtSec = std::chrono::duration_cast<std::chrono::duration<double>>(a_Dt);\n\tVector3d NextPos = Vector3d(GetPosX(), GetPosY(), GetPosZ());\n\tVector3d NextSpeed = Vector3d(GetSpeedX(), GetSpeedY(), GetSpeedZ());\n\n\tif ((BlockY >= cChunkDef::Height) || (BlockY < 0))\n\t{\n\t\t// Outside of the world\n\t\tAddSpeedY(m_Gravity * DtSec.count());\n\t\tAddPosition(GetSpeed() * DtSec.count());\n\t\treturn;\n\t}\n\n\tint RelBlockX = BlockX - (NextChunk->GetPosX() * cChunkDef::Width);\n\tint RelBlockZ = BlockZ - (NextChunk->GetPosZ() * cChunkDef::Width);\n\tBLOCKTYPE BlockIn = NextChunk->GetBlock( RelBlockX, BlockY, RelBlockZ);\n\tBLOCKTYPE BlockBelow = (BlockY > 0) ? NextChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR;\n\tif (!cBlockInfo::IsSolid(BlockIn))  // Making sure we are not inside a solid block\n\t{\n\t\tif (m_bOnGround)  // check if it's still on the ground\n\t\t{\n\t\t\tif (!cBlockInfo::IsSolid(BlockBelow))  // Check if block below is air or water.\n\t\t\t{\n\t\t\t\tm_bOnGround = false;\n\t\t\t}\n\t\t}\n\t}\n\telse if (!(IsMinecart() || IsTNT() || (IsPickup() && (m_TicksAlive < 15))))\n\t{\n\t\t// Push out entity.\n\t\tBLOCKTYPE GotBlock;\n\n\t\tstatic const struct\n\t\t{\n\t\t\tint x, y, z;\n\t\t} gCrossCoords[] =\n\t\t{\n\t\t\t{ 1, 0,  0},\n\t\t\t{-1, 0,  0},\n\t\t\t{ 0, 0,  1},\n\t\t\t{ 0, 0, -1},\n\t\t} ;\n\n\t\tbool IsNoAirSurrounding = true;\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++)\n\t\t{\n\t\t\tif (!NextChunk->UnboundedRelGetBlockType(RelBlockX + gCrossCoords[i].x, BlockY, RelBlockZ + gCrossCoords[i].z, GotBlock))\n\t\t\t{\n\t\t\t\t// The pickup is too close to an unloaded chunk, bail out of any physics handling\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!cBlockInfo::IsSolid(GotBlock))\n\t\t\t{\n\t\t\t\tNextPos.x += gCrossCoords[i].x;\n\t\t\t\tNextPos.z += gCrossCoords[i].z;\n\t\t\t\tIsNoAirSurrounding = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // for i - gCrossCoords[]\n\n\t\tif (IsNoAirSurrounding)\n\t\t{\n\t\t\tNextPos.y += 0.5;\n\t\t}\n\n\t\tm_bHasSentNoSpeed = false;  // this unlocks movement sending to client in BroadcastMovementUpdate function\n\t\tm_bOnGround = true;\n\n\t\t/*\n\t\t// DEBUG:\n\t\tFLOGD(\"Entity #{0} ({1}) is inside a block at {{2}}\",\n\t\t\tm_UniqueID, GetClass(), Vector3i{BlockX, BlockY, BlockZ}\n\t\t);\n\t\t*/\n\t}\n\n\tif (!m_bOnGround)\n\t{\n\t\tdouble fallspeed;\n\t\tif (IsBlockWater(BlockIn))\n\t\t{\n\t\t\tfallspeed = m_Gravity * DtSec.count() / 3;  // Fall 3x slower in water\n\t\t\tApplyFriction(NextSpeed, 0.7, static_cast<float>(DtSec.count()));\n\t\t}\n\t\telse if (BlockIn == E_BLOCK_COBWEB)\n\t\t{\n\t\t\tNextSpeed.y *= 0.05;  // Reduce overall falling speed\n\t\t\tfallspeed = 0;  // No falling\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Normal gravity\n\t\t\tfallspeed = m_Gravity * DtSec.count();\n\t\t\tNextSpeed -= NextSpeed * (m_AirDrag * 20.0f) * DtSec.count();\n\t\t}\n\t\tNextSpeed.y += static_cast<float>(fallspeed);\n\n\t\t// A real boat floats\n\t\tif (IsBoat())\n\t\t{\n\t\t\t// Find top water block and sit there\n\t\t\tint NextBlockY = BlockY;\n\t\t\tBLOCKTYPE NextBlock = NextChunk->GetBlock(RelBlockX, NextBlockY, RelBlockZ);\n\t\t\twhile (IsBlockWater(NextBlock))\n\t\t\t{\n\t\t\t\tNextBlock = NextChunk->GetBlock(RelBlockX, ++NextBlockY, RelBlockZ);\n\t\t\t}\n\t\t\tNextPos.y = NextBlockY - 0.5;\n\t\t\tNextSpeed.y = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tApplyFriction(NextSpeed, 0.7, static_cast<float>(DtSec.count()));\n\t}\n\n\t// Adjust X and Z speed for COBWEB temporary. This speed modification should be handled inside block handlers since we\n\t// might have different speed modifiers according to terrain.\n\tif (BlockIn == E_BLOCK_COBWEB)\n\t{\n\t\tNextSpeed.x *= 0.25;\n\t\tNextSpeed.z *= 0.25;\n\t}\n\n\t// Get water direction\n\tVector3f WaterDir = m_World->GetWaterSimulator()->GetFlowingDirection({BlockX, BlockY, BlockZ});\n\n\tm_WaterSpeed *= 0.9;  // Reduce speed each tick\n\n\tauto AdjustSpeed = [](double & a_WaterSpeed, float a_WaterDir)\n\t\t{\n\t\t\tif (std::abs(a_WaterDir) > (0.05f / 0.4f))\n\t\t\t{\n\t\t\t\ta_WaterSpeed = 0.4 * a_WaterDir;\n\t\t\t}\n\t\t\telse if (std::abs(a_WaterSpeed) < 0.05)\n\t\t\t{\n\t\t\t\ta_WaterSpeed = 0.0;\n\t\t\t}\n\t\t};\n\tAdjustSpeed(m_WaterSpeed.x, WaterDir.x);\n\tAdjustSpeed(m_WaterSpeed.z, WaterDir.z);\n\n\tNextSpeed += m_WaterSpeed;\n\n\tif (NextSpeed.SqrLength() > 0.0f)\n\t{\n\t\tVector3d HitCoords;\n\t\tVector3i HitBlockCoords;\n\t\teBlockFace HitBlockFace;\n\t\tVector3d wantNextPos = NextPos + NextSpeed * DtSec.count();\n\t\tauto isHit = cLineBlockTracer::FirstSolidHitTrace(*GetWorld(), NextPos, wantNextPos, HitCoords, HitBlockCoords, HitBlockFace);\n\t\tif (isHit)\n\t\t{\n\t\t\t// Set our position to where the block was hit:\n\t\t\tNextPos = HitCoords;\n\n\t\t\t// Avoid movement in the direction of the blockface that has been hit and correct for collision box:\n\t\t\tconst auto HalfWidth = GetWidth() / 2;\n\t\t\tswitch (HitBlockFace)\n\t\t\t{\n\t\t\t\tcase BLOCK_FACE_XM:\n\t\t\t\t{\n\t\t\t\t\tNextSpeed.x = 0;\n\t\t\t\t\tNextPos.x -= HalfWidth;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase BLOCK_FACE_XP:\n\t\t\t\t{\n\t\t\t\t\tNextSpeed.x = 0;\n\t\t\t\t\tNextPos.x += HalfWidth;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase BLOCK_FACE_YM:\n\t\t\t\t{\n\t\t\t\t\tNextSpeed.y = 0;\n\t\t\t\t\tNextPos.y -= GetHeight();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase BLOCK_FACE_YP:\n\t\t\t\t{\n\t\t\t\t\tNextSpeed.y = 0;\n\t\t\t\t\t// We hit the ground, adjust the position to the top of the block:\n\t\t\t\t\tm_bOnGround = true;\n\t\t\t\t\tNextPos.y = HitBlockCoords.y + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase BLOCK_FACE_ZM:\n\t\t\t\t{\n\t\t\t\t\tNextSpeed.z = 0;\n\t\t\t\t\tNextPos.z -= HalfWidth;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase BLOCK_FACE_ZP:\n\t\t\t\t{\n\t\t\t\t\tNextSpeed.z = 0;\n\t\t\t\t\tNextPos.z += HalfWidth;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// We didn't hit anything, so move:\n\t\t\tNextPos += (NextSpeed * DtSec.count());\n\t\t}\n\t}\n\n\tSetPosition(NextPos);\n\tSetSpeed(NextSpeed);\n}\n\n\n\n\n\nvoid cEntity::ApplyFriction(Vector3d & a_Speed, double a_SlowdownMultiplier, float a_Dt)\n{\n\tif (a_Speed.SqrLength() > 0.0004f)\n\t{\n\t\ta_Speed.x *= a_SlowdownMultiplier / (1 + a_Dt);\n\t\tif (fabs(a_Speed.x) < 0.05)\n\t\t{\n\t\t\ta_Speed.x = 0;\n\t\t}\n\t\ta_Speed.z *= a_SlowdownMultiplier / (1 + a_Dt);\n\t\tif (fabs(a_Speed.z) < 0.05)\n\t\t{\n\t\t\ta_Speed.z = 0;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cEntity::TickBurning(cChunk & a_Chunk)\n{\n\t// Remember the current burning state:\n\tbool HasBeenBurning = (m_TicksLeftBurning > 0);\n\n\t// Fireproof entities burn out on the next tick\n\tif (IsFireproof())\n\t{\n\t\tm_TicksLeftBurning = 0;\n\t}\n\n\t// Fire is extinguished by rain:\n\tif (a_Chunk.IsWeatherWetAt(cChunkDef::AbsoluteToRelative(GetPosition().Floor(), a_Chunk.GetPos())))\n\t{\n\t\tm_TicksLeftBurning = 0;\n\t}\n\n\t// Do the burning damage:\n\tif (m_TicksLeftBurning > 0)\n\t{\n\t\tm_TicksSinceLastBurnDamage++;\n\t\tif (m_TicksSinceLastBurnDamage >= BURN_TICKS_PER_DAMAGE)\n\t\t{\n\t\t\tif (!IsFireproof())\n\t\t\t{\n\t\t\t\tTakeDamage(dtOnFire, nullptr, BURN_DAMAGE, 0);\n\t\t\t}\n\t\t\tm_TicksSinceLastBurnDamage = 0;\n\t\t}\n\t\tm_TicksLeftBurning--;\n\t}\n\n\tif (IsInWater())\n\t{\n\t\t// Extinguish the fire\n\t\tm_TicksLeftBurning = 0;\n\t}\n\n\tif (IsInLava())\n\t{\n\t\t// Burn:\n\t\tm_TicksLeftBurning = BURN_TICKS;\n\n\t\t// Periodically damage:\n\t\tm_TicksSinceLastLavaDamage++;\n\t\tif (m_TicksSinceLastLavaDamage >= LAVA_TICKS_PER_DAMAGE)\n\t\t{\n\t\t\tif (!IsFireproof())\n\t\t\t{\n\t\t\t\tTakeDamage(dtLavaContact, nullptr, LAVA_DAMAGE, 0);\n\t\t\t}\n\t\t\tm_TicksSinceLastLavaDamage = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_TicksSinceLastLavaDamage = 0;\n\t}\n\n\tif (IsInFire())\n\t{\n\t\t// Burn:\n\t\tm_TicksLeftBurning = BURN_TICKS;\n\n\t\t// Periodically damage:\n\t\tm_TicksSinceLastFireDamage++;\n\t\tif (m_TicksSinceLastFireDamage >= FIRE_TICKS_PER_DAMAGE)\n\t\t{\n\t\t\tif (!IsFireproof() && !IsInLava())\n\t\t\t{\n\t\t\t\tTakeDamage(dtFireContact, nullptr, FIRE_DAMAGE, 0);\n\t\t\t}\n\t\t\tm_TicksSinceLastFireDamage = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_TicksSinceLastFireDamage = 0;\n\t}\n\n\t// If just started / finished burning, notify descendants:\n\tif ((m_TicksLeftBurning > 0) && !HasBeenBurning)\n\t{\n\t\tOnStartedBurning();\n\t}\n\telse if ((m_TicksLeftBurning <= 0) && HasBeenBurning)\n\t{\n\t\tOnFinishedBurning();\n\t}\n}\n\n\n\n\n\nvoid cEntity::TickInVoid(cChunk & a_Chunk)\n{\n\tif (m_TicksSinceLastVoidDamage == 20)\n\t{\n\t\tTakeDamage(dtInVoid, nullptr, 2, 0);\n\t\tm_TicksSinceLastVoidDamage = 0;\n\t}\n\telse\n\t{\n\t\tm_TicksSinceLastVoidDamage++;\n\t}\n}\n\n\n\n\n\nvoid cEntity::DetectCacti(void)\n{\n\tint MinX = FloorC(GetPosX() - m_Width / 2);\n\tint MaxX = FloorC(GetPosX() + m_Width / 2);\n\tint MinZ = FloorC(GetPosZ() - m_Width / 2);\n\tint MaxZ = FloorC(GetPosZ() + m_Width / 2);\n\tint MinY = Clamp(POSY_TOINT, 0, cChunkDef::Height - 1);\n\tint MaxY = Clamp(FloorC(GetPosY() + m_Height), 0, cChunkDef::Height - 1);\n\n\tfor (int x = MinX; x <= MaxX; x++)\n\t{\n\t\tfor (int z = MinZ; z <= MaxZ; z++)\n\t\t{\n\t\t\tfor (int y = MinY; y <= MaxY; y++)\n\t\t\t{\n\t\t\t\tif (GetWorld()->GetBlock({ x, y, z }) == E_BLOCK_CACTUS)\n\t\t\t\t{\n\t\t\t\t\tTakeDamage(dtCactusContact, nullptr, 1, 0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n}\n\n\n\n\n\nvoid cEntity::DetectMagma(void)\n{\n\tint MinX = FloorC(GetPosX() - m_Width / 2);\n\tint MaxX = FloorC(GetPosX() + m_Width / 2);\n\tint MinZ = FloorC(GetPosZ() - m_Width / 2);\n\tint MaxZ = FloorC(GetPosZ() + m_Width / 2);\n\tint MinY = Clamp(POSY_TOINT - 1, 0, cChunkDef::Height - 1);\n\tint MaxY = Clamp(FloorC(GetPosY() + m_Height), 0, cChunkDef::Height - 1);\n\n\tfor (int x = MinX; x <= MaxX; x++)\n\t{\n\t\tfor (int z = MinZ; z <= MaxZ; z++)\n\t\t{\n\t\t\tfor (int y = MinY; y <= MaxY; y++)\n\t\t\t{\n\t\t\t\tif (GetWorld()->GetBlock({ x, y, z }) == E_BLOCK_MAGMA)\n\t\t\t\t{\n\t\t\t\t\tTakeDamage(dtMagmaContact, nullptr, 1, 0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n}\n\n\n\n\n\nbool cEntity::DetectPortal()\n{\n\tif (GetWorld()->GetDimension() == dimOverworld)\n\t{\n\t\tif (GetWorld()->GetLinkedNetherWorldName().empty() && GetWorld()->GetLinkedEndWorldName().empty())\n\t\t{\n\t\t\t// Teleportation to either dimension not enabled, don't bother proceeding\n\t\t\treturn false;\n\t\t}\n\t}\n\telse if (GetWorld()->GetLinkedOverworldName().empty())\n\t{\n\t\t// Overworld teleportation disabled, abort\n\t\treturn false;\n\t}\n\n\tif (const auto Position = m_Position.Floor(); cChunkDef::IsValidHeight(Position))\n\t{\n\t\tswitch (GetWorld()->GetBlock(Position))\n\t\t{\n\t\t\tcase E_BLOCK_NETHER_PORTAL:\n\t\t\t{\n\t\t\t\tif (m_PortalCooldownData.m_ShouldPreventTeleportation)\n\t\t\t\t{\n\t\t\t\t\t// Just exited a portal, don't teleport again\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ((m_AttachedTo != nullptr) || (m_Attachee != nullptr))\n\t\t\t\t{\n\t\t\t\t\t// Don't let attached entities change worlds, like players riding a minecart\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (IsPlayer() && !(static_cast<cPlayer *>(this))->IsGameModeCreative() && (m_PortalCooldownData.m_TicksDelayed != 80))\n\t\t\t\t{\n\t\t\t\t\t// Delay teleportation for four seconds if the entity is a non-creative player\n\t\t\t\t\tm_PortalCooldownData.m_TicksDelayed++;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tm_PortalCooldownData.m_TicksDelayed = 0;\n\n\t\t\t\t// Nether portal in the nether\n\t\t\t\tif (GetWorld()->GetDimension() == dimNether)\n\t\t\t\t{\n\t\t\t\t\tif (GetWorld()->GetLinkedOverworldName().empty())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tm_PortalCooldownData.m_ShouldPreventTeleportation = true;  // Stop portals from working on respawn\n\n\t\t\t\t\tVector3d TargetPos = GetPosition();\n\t\t\t\t\tTargetPos.x *= 8.0;\n\t\t\t\t\tTargetPos.z *= 8.0;\n\n\t\t\t\t\tcWorld * TargetWorld = cRoot::Get()->GetWorld(GetWorld()->GetLinkedOverworldName());\n\t\t\t\t\tASSERT(TargetWorld != nullptr);  // The linkage checker should have prevented this at startup. See cWorld::start()\n\t\t\t\t\tLOGD(\"Jumping %s -> %s\", DimensionToString(dimNether).c_str(), DimensionToString(TargetWorld->GetDimension()).c_str());\n\t\t\t\t\tnew cNetherPortalScanner(*this, *TargetWorld, TargetPos, cChunkDef::Height);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// Nether portal in the overworld\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (GetWorld()->GetLinkedNetherWorldName().empty())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tm_PortalCooldownData.m_ShouldPreventTeleportation = true;\n\n\t\t\t\t\tVector3d TargetPos = GetPosition();\n\t\t\t\t\tTargetPos.x /= 8.0;\n\t\t\t\t\tTargetPos.z /= 8.0;\n\n\t\t\t\t\tcWorld * TargetWorld = cRoot::Get()->GetWorld(GetWorld()->GetLinkedNetherWorldName());\n\t\t\t\t\tASSERT(TargetWorld != nullptr);  // The linkage checker should have prevented this at startup. See cWorld::start()\n\t\t\t\t\tLOGD(\"Jumping %s -> %s\", DimensionToString(dimOverworld).c_str(), DimensionToString(TargetWorld->GetDimension()).c_str());\n\t\t\t\t\tnew cNetherPortalScanner(*this, *TargetWorld, TargetPos, (cChunkDef::Height / 2));\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase E_BLOCK_END_PORTAL:\n\t\t\t{\n\t\t\t\tif (m_PortalCooldownData.m_ShouldPreventTeleportation)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ((m_AttachedTo != nullptr) || (m_Attachee != nullptr))\n\t\t\t\t{\n\t\t\t\t\t// Don't let attached entities change worlds, like players riding a minecart\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// End portal in the end\n\t\t\t\tif (GetWorld()->GetDimension() == dimEnd)\n\t\t\t\t{\n\t\t\t\t\tif (GetWorld()->GetLinkedOverworldName().empty())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tm_PortalCooldownData.m_ShouldPreventTeleportation = true;\n\n\t\t\t\t\tcWorld * TargetWorld = cRoot::Get()->GetWorld(GetWorld()->GetLinkedOverworldName());\n\t\t\t\t\tASSERT(TargetWorld != nullptr);  // The linkage checker should have prevented this at startup. See cWorld::start()\n\t\t\t\t\tLOGD(\"Jumping %s -> %s\", DimensionToString(dimEnd).c_str(), DimensionToString(TargetWorld->GetDimension()).c_str());\n\n\t\t\t\t\tif (IsPlayer())\n\t\t\t\t\t{\n\t\t\t\t\t\tcPlayer * Player = static_cast<cPlayer *>(this);\n\t\t\t\t\t\tif (Player->GetRespawnWorld() == TargetWorld)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn MoveToWorld(*TargetWorld, Player->GetLastBedPos());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn MoveToWorld(*TargetWorld, false);\n\t\t\t\t}\n\t\t\t\t// End portal in the overworld\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (GetWorld()->GetLinkedEndWorldName().empty())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tm_PortalCooldownData.m_ShouldPreventTeleportation = true;\n\n\t\t\t\t\tcWorld * TargetWorld = cRoot::Get()->GetWorld(GetWorld()->GetLinkedEndWorldName());\n\t\t\t\t\tASSERT(TargetWorld != nullptr);  // The linkage checker should have prevented this at startup. See cWorld::start()\n\t\t\t\t\tLOGD(\"Jumping %s -> %s\", DimensionToString(dimOverworld).c_str(), DimensionToString(TargetWorld->GetDimension()).c_str());\n\t\t\t\t\treturn MoveToWorld(*TargetWorld, false);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tdefault: break;\n\t\t}\n\t}\n\n\t// Allow portals to work again\n\tm_PortalCooldownData.m_ShouldPreventTeleportation = false;\n\tm_PortalCooldownData.m_TicksDelayed = 0;\n\treturn false;\n}\n\n\n\n\n\nvoid cEntity::DoMoveToWorld(const sWorldChangeInfo & a_WorldChangeInfo)\n{\n\tASSERT(a_WorldChangeInfo.m_NewWorld != nullptr);\n\n\t// Reset portal cooldown:\n\tif (a_WorldChangeInfo.m_SetPortalCooldown)\n\t{\n\t\tm_PortalCooldownData.m_TicksDelayed = 0;\n\t\tm_PortalCooldownData.m_ShouldPreventTeleportation = true;\n\t}\n\n\tif (m_World == a_WorldChangeInfo.m_NewWorld)\n\t{\n\t\t// Moving to same world, don't need to remove from world\n\t\tSetPosition(a_WorldChangeInfo.m_NewPosition);\n\t\treturn;\n\t}\n\n\tLOGD(\"Warping entity #%i (%s) from world \\\"%s\\\" to \\\"%s\\\". Source chunk: (%d, %d) \",\n\t\tGetUniqueID(), GetClass(),\n\t\tm_World->GetName(), a_WorldChangeInfo.m_NewWorld->GetName(),\n\t\tGetChunkX(), GetChunkZ()\n\t);\n\n\t// Stop ticking, in preperation for detaching from this world.\n\tSetIsTicking(false);\n\n\t// Remove from the old world\n\tconst auto OldWorld = m_World;\n\tauto Self = m_World->RemoveEntity(*this);\n\n\t// Update entity:\n\tResetPosition(a_WorldChangeInfo.m_NewPosition);\n\tSetWorld(a_WorldChangeInfo.m_NewWorld);\n\n\t// Don't do anything after adding as the old world's CS no longer protects us\n\ta_WorldChangeInfo.m_NewWorld->AddEntity(std::move(Self), OldWorld);\n}\n\n\n\n\n\nbool cEntity::MoveToWorld(cWorld & a_World, Vector3d a_NewPosition, bool a_SetPortalCooldown, bool a_ShouldSendRespawn)\n{\n\t// Ask the plugins if the entity is allowed to change world\n\tif (cRoot::Get()->GetPluginManager()->CallHookEntityChangingWorld(*this, a_World))\n\t{\n\t\t// A Plugin isn't allowing the entity to change world\n\t\treturn false;\n\t}\n\n\tconst auto OldWorld = m_WorldChangeInfo.m_NewWorld;\n\n\t// Create new world change info\n\t// (The last warp command always takes precedence)\n\tm_WorldChangeInfo = { &a_World,  a_NewPosition, a_SetPortalCooldown };\n\n\tif (OldWorld != nullptr)\n\t{\n\t\t// Avoid scheduling multiple warp tasks\n\t\t// Only move ahead if we came from a \"not warping\" state\n\t\treturn true;\n\t}\n\n\t// TODO: move to capture when C++14\n\tconst auto EntityID = GetUniqueID();\n\n\t/* Requirements:\n\tOnly one world change in-flight at any time\n\tNo ticking during world changes\n\tThe last invocation takes effect\n\n\tAs of writing, cWorld ticks entities, clients, and then processes tasks\n\tWe may call MoveToWorld (any number of times - consider multiple /portal commands within a tick) in the first and second stages\n\tQueue a task onto the third stage to invoke DoMoveToWorld ONCE with the last given destination world\n\tStore entity IDs in case client tick found the player disconnected and immediately destroys the object\n\n\tAfter the move begins, no further calls to MoveToWorld is possible since neither the client nor entity is ticked\n\tThis remains until the warp is complete and the destination world resumes ticking.\n\t*/\n\tGetWorld()->QueueTask(\n\t\t[EntityID](cWorld & a_CurWorld)\n\t\t{\n\t\t\ta_CurWorld.DoWithEntityByID(\n\t\t\t\tEntityID,\n\t\t\t\t[](cEntity & a_Entity)\n\t\t\t\t{\n\t\t\t\t\tauto & WCI = a_Entity.m_WorldChangeInfo;\n\t\t\t\t\ta_Entity.DoMoveToWorld(WCI);\n\t\t\t\t\tWCI.m_NewWorld = nullptr;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t);\n\n\treturn true;\n}\n\n\n\n\n\nbool cEntity::MoveToWorld(cWorld & a_World, bool a_ShouldSendRespawn)\n{\n\treturn MoveToWorld(a_World, a_ShouldSendRespawn, Vector3i(a_World.GetSpawnX(), a_World.GetSpawnY(), a_World.GetSpawnZ()));\n}\n\n\n\n\n\nbool cEntity::MoveToWorld(const AString & a_WorldName, bool a_ShouldSendRespawn)\n{\n\tcWorld * World = cRoot::Get()->GetWorld(a_WorldName);\n\tif (World == nullptr)\n\t{\n\t\tLOG(\"%s: Couldn't find world \\\"%s\\\".\", __FUNCTION__, a_WorldName.c_str());\n\t\treturn false;\n\t}\n\n\treturn MoveToWorld(*World, Vector3i(World->GetSpawnX(), World->GetSpawnY(), World->GetSpawnZ()), false, a_ShouldSendRespawn);\n}\n\n\n\n\n\nvoid cEntity::SetSwimState(cChunk & a_Chunk)\n{\n\tm_IsInFire = false;\n\tm_IsInLava = false;\n\tm_IsInWater = false;\n\tm_IsHeadInWater = false;\n\n\tint RelY = FloorC(GetPosY() + 0.1);\n\tint HeadRelY = CeilC(GetPosY() + GetHeight()) - 1;\n\tASSERT(RelY <= HeadRelY);\n\tif ((RelY < 0) || (HeadRelY >= cChunkDef::Height))\n\t{\n\t\treturn;\n\t}\n\n\tint MinRelX = FloorC(GetPosX() - m_Width / 2) - a_Chunk.GetPosX() * cChunkDef::Width;\n\tint MaxRelX = FloorC(GetPosX() + m_Width / 2) - a_Chunk.GetPosX() * cChunkDef::Width;\n\tint MinRelZ = FloorC(GetPosZ() - m_Width / 2) - a_Chunk.GetPosZ() * cChunkDef::Width;\n\tint MaxRelZ = FloorC(GetPosZ() + m_Width / 2) - a_Chunk.GetPosZ() * cChunkDef::Width;\n\tint MinY = Clamp(POSY_TOINT, 0, cChunkDef::Height - 1);\n\tint MaxY = Clamp(FloorC(GetPosY() + m_Height), 0, cChunkDef::Height - 1);\n\n\tfor (int x = MinRelX; x <= MaxRelX; x++)\n\t{\n\t\tfor (int z = MinRelZ; z <= MaxRelZ; z++)\n\t\t{\n\t\t\tfor (int y = MinY; y <= MaxY; y++)\n\t\t\t{\n\t\t\t\tBLOCKTYPE Block;\n\t\t\t\tif (!a_Chunk.UnboundedRelGetBlockType(x, y, z, Block))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\tLOGD(\"SetSwimState failure: RelX = %d, RelY = %d, RelZ = %d, Pos = %.02f, %.02f}\",\n\t\t\t\t\t\tx, y, z, GetPosX(), GetPosZ()\n\t\t\t\t\t);\n\t\t\t\t\t*/\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (Block == E_BLOCK_FIRE)\n\t\t\t\t{\n\t\t\t\t\tm_IsInFire = true;\n\t\t\t\t}\n\t\t\t\telse if (IsBlockLava(Block))\n\t\t\t\t{\n\t\t\t\t\tm_IsInLava = true;\n\t\t\t\t}\n\t\t\t\telse if (IsBlockWater(Block))\n\t\t\t\t{\n\t\t\t\t\tm_IsInWater = true;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n\n\t// Check if the entity's head is in water.\n\tint RelX = POSX_TOINT - a_Chunk.GetPosX() * cChunkDef::Width;\n\tint RelZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width;\n\tint HeadHeight = CeilC(GetPosY() + GetHeight()) - 1;\n\tBLOCKTYPE BlockIn;\n\tif (!a_Chunk.UnboundedRelGetBlockType(RelX, HeadHeight, RelZ, BlockIn))\n\t{\n\t\t/*\n\t\tLOGD(\"SetSwimState failure: RelX = %d, RelY = %d, RelZ = %d, Pos = %.02f, %.02f}\",\n\t\t\tRelX, HeadHeight, RelZ, GetPosX(), GetPosZ()\n\t\t);\n\t\t*/\n\t\treturn;\n\t}\n\tm_IsHeadInWater = IsBlockWater(BlockIn);\n}\n\n\n\n\n\nvoid cEntity::SetIsTicking(bool a_IsTicking)\n{\n\tm_IsTicking = a_IsTicking;\n\tASSERT(!(m_IsTicking && (m_ParentChunk == nullptr)));  // We shouldn't be ticking if we have no parent chunk\n}\n\n\n\n\n\nvoid cEntity::SetSize(const float a_Width, const float a_Height)\n{\n\tm_Width = a_Width;\n\tm_Height = a_Height;\n}\n\n\n\n\n\nvoid cEntity::HandleAir(void)\n{\n\t// Ref.: https://minecraft.wiki/w/Chunk_format\n\t// See if the entity is /submerged/ water (head is in water)\n\t// Get the type of block the entity is standing in:\n\n\tint RespirationLevel = static_cast<int>(GetEquippedHelmet().m_Enchantments.GetLevel(cEnchantments::enchRespiration));\n\n\tif (IsHeadInWater())\n\t{\n\t\tif (!IsPlayer())  // Players control themselves\n\t\t{\n\t\t\tSetSpeedY(1);  // Float in the water\n\t\t}\n\n\t\tif (RespirationLevel > 0)\n\t\t{\n\t\t\tstatic_cast<cPawn *>(this)->AddEntityEffect(cEntityEffect::effNightVision, 200, 5, 0);\n\t\t}\n\n\t\tif (m_AirLevel <= 0)\n\t\t{\n\t\t\t// Runs the air tick timer to check whether the player should be damaged\n\t\t\tif (m_AirTickTimer <= 0)\n\t\t\t{\n\t\t\t\t// Damage player\n\t\t\t\tTakeDamage(dtDrowning, nullptr, 1, 1, 0);\n\t\t\t\t// Reset timer\n\t\t\t\tm_AirTickTimer = DROWNING_TICKS;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_AirTickTimer--;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Reduce air supply\n\t\t\tm_AirLevel--;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Set the air back to maximum\n\t\tm_AirLevel = MAX_AIR_LEVEL;\n\t\tm_AirTickTimer = DROWNING_TICKS;\n\n\t\tif (RespirationLevel > 0)\n\t\t{\n\t\t\tm_AirTickTimer = DROWNING_TICKS + (RespirationLevel * 15 * 20);\n\t\t}\n\n\t}\n}\n\n\n\n\n\nvoid cEntity::ResetPosition(Vector3d a_NewPos)\n{\n\tSetPosition(a_NewPos);\n\tm_LastSentPosition = GetPosition();\n}\n\n\n\n\n\nvoid cEntity::OnStartedBurning(void)\n{\n\t// Broadcast the change:\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cEntity::OnFinishedBurning(void)\n{\n\t// Broadcast the change:\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cEntity::SetMaxHealth(float a_MaxHealth)\n{\n\tm_MaxHealth = a_MaxHealth;\n\n\t// Reset health, if too high:\n\tm_Health = std::min(m_Health, a_MaxHealth);\n}\n\n\n\n\n\nvoid cEntity::SetIsFireproof(bool a_IsFireproof)\n{\n\tm_IsFireproof = a_IsFireproof;\n}\n\n\n\n\n\nvoid cEntity::StartBurning(int a_TicksLeftBurning)\n{\n\tif (m_TicksLeftBurning > 0)\n\t{\n\t\t// Already burning, top up the ticks left burning and bail out:\n\t\tm_TicksLeftBurning = std::max(m_TicksLeftBurning, a_TicksLeftBurning);\n\t\treturn;\n\t}\n\n\tm_TicksLeftBurning = a_TicksLeftBurning;\n\tOnStartedBurning();\n}\n\n\n\n\n\nvoid cEntity::StopBurning(void)\n{\n\tbool HasBeenBurning = (m_TicksLeftBurning > 0);\n\tm_TicksLeftBurning = 0;\n\tm_TicksSinceLastBurnDamage = 0;\n\tm_TicksSinceLastFireDamage = 0;\n\tm_TicksSinceLastLavaDamage = 0;\n\n\t// Notify if the entity has stopped burning\n\tif (HasBeenBurning)\n\t{\n\t\tOnFinishedBurning();\n\t}\n}\n\n\n\n\n\nvoid cEntity::TeleportToEntity(cEntity & a_Entity)\n{\n\tTeleportToCoords(a_Entity.GetPosX(), a_Entity.GetPosY(), a_Entity.GetPosZ());\n}\n\n\n\n\n\nvoid cEntity::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ)\n{\n\t//  ask the plugins to allow teleport to the new position.\n\tif (!cRoot::Get()->GetPluginManager()->CallHookEntityTeleport(*this, m_LastPosition, Vector3d(a_PosX, a_PosY, a_PosZ)))\n\t{\n\t\tSetPosition({a_PosX, a_PosY, a_PosZ});\n\t}\n}\n\n\n\n\n\nvoid cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude)\n{\n\t// Process packet sending every two ticks:\n\tif ((GetWorld()->GetWorldTickAge() % 2_tick) != 0_tick)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_Speed.HasNonZeroLength())\n\t{\n\t\t// Movin'\n\t\tm_World->BroadcastEntityVelocity(*this, a_Exclude);\n\t\tm_bHasSentNoSpeed = false;\n\t}\n\telse if (!m_bHasSentNoSpeed)\n\t{\n\t\t// Speed is zero, send this to clients once only as well as an absolute position\n\t\tm_World->BroadcastEntityVelocity(*this, a_Exclude);\n\t\tm_World->BroadcastEntityPosition(*this, a_Exclude);\n\t\tm_LastSentPosition = GetPosition();\n\t\tm_bDirtyOrientation = false;\n\t\tm_bHasSentNoSpeed = true;\n\t}\n\n\tif ((m_Position - m_LastSentPosition).HasNonZeroLength())  // Have we moved?\n\t{\n\t\tm_World->BroadcastEntityPosition(*this, a_Exclude);\n\n\t\t// Clients seem to store two positions, one for the velocity packet and one for the teleport / relmove packet\n\t\t// The latter is only changed with a relmove / teleport, and m_LastSentPosition stores this position\n\t\tm_LastSentPosition = GetPosition();\n\t\tm_bDirtyOrientation = false;\n\t}\n\n\tif (m_bDirtyHead)\n\t{\n\t\tm_World->BroadcastEntityHeadLook(*this, a_Exclude);\n\t\tm_bDirtyHead = false;\n\t}\n\n\tif (m_bDirtyOrientation)\n\t{\n\t\t// Send individual update in case above (sending with rel-move packet) wasn't done\n\t\tGetWorld()->BroadcastEntityLook(*this, a_Exclude);\n\t\tm_bDirtyOrientation = false;\n\t}\n}\n\n\n\n\n\ncEntity * cEntity::GetAttached()\n{\n\treturn m_AttachedTo;\n}\n\n\n\n\n\nvoid cEntity::AttachTo(cEntity & a_AttachTo)\n{\n\tif (m_AttachedTo == &a_AttachTo)\n\t{\n\t\t// Already attached to that entity, nothing to do here:\n\t\treturn;\n\t}\n\n\tif (m_AttachedTo != nullptr)\n\t{\n\t\t// Detach from any previous entity:\n\t\tDetach();\n\t}\n\n\t// Update state information:\n\tm_AttachedTo = &a_AttachTo;\n\ta_AttachTo.m_Attachee = this;\n\n\tm_World->BroadcastAttachEntity(*this, a_AttachTo);\n}\n\n\n\n\n\nvoid cEntity::Detach(void)\n{\n\tif (m_AttachedTo == nullptr)\n\t{\n\t\t// Already not attached to any entity, our work is done:\n\t\treturn;\n\t}\n\n\tm_World->BroadcastDetachEntity(*this, *m_AttachedTo);\n\n\tm_AttachedTo->m_Attachee = nullptr;\n\tm_AttachedTo = nullptr;\n\n\tOnDetach();\n}\n\n\n\n\n\nbool cEntity::IsA(const char * a_ClassName) const\n{\n\treturn ((a_ClassName != nullptr) && (strcmp(a_ClassName, \"cEntity\") == 0));\n}\n\n\n\n\n\nbool cEntity::IsAttachedTo(const cEntity * a_Entity) const\n{\n\treturn (\n\t\t(m_AttachedTo != nullptr) &&\n\t\t(a_Entity->GetUniqueID() == m_AttachedTo->GetUniqueID())\n\t);\n}\n\n\n\n\n\nbool cEntity::IsOrientationDirty() const\n{\n\treturn m_bDirtyOrientation;\n}\n\n\n\n\n\nvoid cEntity::SetHeadYaw(double a_HeadYaw)\n{\n\tm_HeadYaw = a_HeadYaw;\n\tm_bDirtyHead = true;\n\tWrapHeadYaw();\n}\n\n\n\n\n\nvoid cEntity::SetMass(double a_Mass)\n{\n\t// Make sure that mass is not zero. 1g is the default because we\n\t// have to choose a number. It's perfectly legal to have a mass\n\t// less than 1g as long as is NOT equal or less than zero.\n\tm_Mass = std::max(a_Mass, 0.001);\n}\n\n\n\n\n\nvoid cEntity::SetYaw(double a_Yaw)\n{\n\tm_Rot.x = a_Yaw;\n\tm_bDirtyOrientation = true;\n\tWrapRotation();\n}\n\n\n\n\n\nvoid cEntity::SetPitch(double a_Pitch)\n{\n\tm_Rot.y = a_Pitch;\n\tm_bDirtyOrientation = true;\n\tWrapRotation();\n}\n\n\n\n\n\nvoid cEntity::SetRoll(double a_Roll)\n{\n\tm_Rot.z = a_Roll;\n\tm_bDirtyOrientation = true;\n}\n\n\n\n\n\nvoid cEntity::SetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ)\n{\n\tm_Speed.Set(a_SpeedX, a_SpeedY, a_SpeedZ);\n\tWrapSpeed();\n}\n\n\n\n\n\nvoid cEntity::SetSpeedX(double a_SpeedX)\n{\n\tSetSpeed(a_SpeedX, m_Speed.y, m_Speed.z);\n}\n\n\n\n\n\nvoid cEntity::SetSpeedY(double a_SpeedY)\n{\n\tSetSpeed(m_Speed.x, a_SpeedY, m_Speed.z);\n}\n\n\n\n\n\nvoid cEntity::SetSpeedZ(double a_SpeedZ)\n{\n\tSetSpeed(m_Speed.x, m_Speed.y, a_SpeedZ);\n}\n\n\n\n\n\nvoid cEntity::AddSpeed(double a_AddSpeedX, double a_AddSpeedY, double a_AddSpeedZ)\n{\n\tSetSpeed(m_Speed.x + a_AddSpeedX, m_Speed.y + a_AddSpeedY, m_Speed.z + a_AddSpeedZ);\n}\n\n\n\n\n\nvoid cEntity::AddSpeedX(double a_AddSpeedX)\n{\n\tAddSpeed(a_AddSpeedX, 0, 0);\n}\n\n\n\n\n\nvoid cEntity::AddSpeedY(double a_AddSpeedY)\n{\n\tAddSpeed(0, a_AddSpeedY, 0);\n}\n\n\n\n\n\nvoid cEntity::AddSpeedZ(double a_AddSpeedZ)\n{\n\tAddSpeed(0, 0, a_AddSpeedZ);\n}\n\n\n\n\n\nvoid cEntity::HandleSpeedFromAttachee(float a_Forward, float a_Sideways)\n{\n\tVector3d LookVector = m_Attachee->GetLookVector();\n\tdouble AddSpeedX = LookVector.x * a_Forward + LookVector.z * a_Sideways;\n\tdouble AddSpeedZ = LookVector.z * a_Forward - LookVector.x * a_Sideways;\n\tSetSpeed(AddSpeedX, 0, AddSpeedZ);\n\tBroadcastMovementUpdate();\n}\n\n\n\n\n\nvoid cEntity::SteerVehicle(float a_Forward, float a_Sideways)\n{\n\tif (m_AttachedTo == nullptr)\n\t{\n\t\treturn;\n\t}\n\tif ((a_Forward != 0.0f) || (a_Sideways != 0.0f))\n\t{\n\t\tm_AttachedTo->HandleSpeedFromAttachee(a_Forward, a_Sideways);\n\t}\n}\n\n\n\n\n\nbool cEntity::IsTicking(void) const\n{\n\tASSERT(!(m_IsTicking && (m_ParentChunk == nullptr)));  // We shouldn't be ticking if we have no parent chunk\n\treturn m_IsTicking;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Get look vector (this is NOT a rotation!)\nVector3d cEntity::GetLookVector(void) const\n{\n\tMatrix4d m;\n\tm.Init(Vector3d(), 0, m_Rot.x, -m_Rot.y);\n\tVector3d Look = m.Transform(Vector3d(0, 0, 1));\n\treturn Look;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Set position\nvoid cEntity::SetPosition(const Vector3d & a_Position)\n{\n\t// Clamp the positions to exactly representable single-precision floating point values\n\t// This is necessary to avoid rounding errors in the noise generator and overflows in the chunk loader\n\tconst double MaxFloat = std::pow(2, std::numeric_limits<float>().digits);\n\n\tconst double ClampedPosX = Clamp(a_Position.x, -MaxFloat, MaxFloat);\n\tconst double ClampedPosY = Clamp(a_Position.y, -MaxFloat, MaxFloat);\n\tconst double ClampedPosZ = Clamp(a_Position.z, -MaxFloat, MaxFloat);\n\n\tm_LastPosition = m_Position;\n\tm_Position = {ClampedPosX, ClampedPosY, ClampedPosZ};\n}\n\n\n\n\n\nvoid cEntity::AddLeashedMob(cMonster * a_Monster)\n{\n\t// Not there already\n\tASSERT(std::find(m_LeashedMobs.begin(), m_LeashedMobs.end(), a_Monster) == m_LeashedMobs.end());\n\n\tm_LeashedMobs.push_back(a_Monster);\n}\n\n\n\n\n\nvoid cEntity::RemoveLeashedMob(cMonster * a_Monster)\n{\n\tASSERT(a_Monster->GetLeashedTo() == this);\n\n\t// Must exists\n\tASSERT(std::find(m_LeashedMobs.begin(), m_LeashedMobs.end(), a_Monster) != m_LeashedMobs.end());\n\n\tm_LeashedMobs.remove(a_Monster);\n}\n\n\n\n\n\nvoid cEntity::BroadcastLeashedMobs()\n{\n\t// If has any mob leashed broadcast every leashed entity to this\n\tif (HasAnyMobLeashed())\n\t{\n\t\tfor (auto LeashedMob : m_LeashedMobs)\n\t\t{\n\t\t\tm_World->BroadcastLeashEntity(*LeashedMob, *this);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cEntity::OnDetach()\n{\n}\n\n\n\n\n\nvoid cEntity::BroadcastDeathMessage(TakeDamageInfo & a_TDI)\n{\n\tcPluginManager * PluginManager = cRoot::Get()->GetPluginManager();\n\n\tAString Name;\n\tif (IsPlayer())\n\t{\n\t\tcPlayer * Player = static_cast<cPlayer *>(this);\n\t\tName = Player->GetName();\n\t}\n\telse if (IsMob())\n\t{\n\t\tcMonster * Monster = static_cast<cMonster *>(this);\n\t\tif (Monster->HasCustomName())\n\t\t{\n\t\t\tName = Monster->GetCustomName();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tName = NamespaceSerializer::PrettifyEntityName(AString(NamespaceSerializer::From(Monster->GetMobType())), Monster->IsTame());\n\t\t}\n\t}\n\telse\n\t{\n\t\t// If the entity is neither a player nor a mob, we should quit.\n\t\treturn;\n\t}\n\n\tif (a_TDI.Attacker == nullptr)\n\t{\n\t\tconst AString DamageText = [&]\n\t\t\t{\n\t\t\t\tswitch (a_TDI.DamageType)\n\t\t\t\t{\n\t\t\t\t\tcase dtRangedAttack:    return \"was shot\";\n\t\t\t\t\tcase dtLightning:       return \"was plasmified by lightining\";\n\t\t\t\t\tcase dtFalling:         return GetRandomProvider().RandBool() ? \"fell to death\" : \"hit the ground too hard\";\n\t\t\t\t\tcase dtDrowning:        return \"drowned\";\n\t\t\t\t\tcase dtSuffocating:     return GetRandomProvider().RandBool() ? \"git merge'd into a block\" : \"fused with a block\";\n\t\t\t\t\tcase dtStarving:        return \"forgot the importance of food\";\n\t\t\t\t\tcase dtCactusContact:   return \"was impaled on a cactus\";\n\t\t\t\t\tcase dtMagmaContact:    return \"discovered the floor was lava\";\n\t\t\t\t\tcase dtLavaContact:     return \"was melted by lava\";\n\t\t\t\t\tcase dtPoisoning:       return \"died from septicaemia\";\n\t\t\t\t\tcase dtWithering:       return \"is a husk of their former selves\";\n\t\t\t\t\tcase dtOnFire:          return \"forgot to stop, drop, and roll\";\n\t\t\t\t\tcase dtFireContact:     return \"burnt themselves to death\";\n\t\t\t\t\tcase dtInVoid:          return \"somehow fell out of the world\";\n\t\t\t\t\tcase dtPotionOfHarming: return \"was magicked to death\";\n\t\t\t\t\tcase dtEnderPearl:      return \"misused an ender pearl\";\n\t\t\t\t\tcase dtAdmin:           return \"was administrator'd\";\n\t\t\t\t\tcase dtExplosion:       return \"blew up\";\n\t\t\t\t\tcase dtAttack:          return \"was attacked by thin air\";\n\t\t\t\t\tcase dtEnvironment:     return \"played too much dress up\";  // This is not vanilla - added a own pun\n\t\t\t\t}\n\t\t\t\tUNREACHABLE(\"Unsupported damage type\");\n\t\t\t}();\n\t\tauto DeathMessage = fmt::format(FMT_STRING(\"{} {}\"), Name, DamageText);\n\t\tPluginManager->CallHookKilled(*this, a_TDI, DeathMessage);\n\t\tif (!DeathMessage.empty())\n\t\t{\n\t\t\tGetWorld()->BroadcastChatDeath(DeathMessage);\n\t\t}\n\t}\n\telse if (a_TDI.Attacker->IsPlayer())\n\t{\n\t\tcPlayer * Killer = static_cast<cPlayer *>(a_TDI.Attacker);\n\t\tauto DeathMessage = fmt::format(FMT_STRING(\"{0} was killed by {1}\"), Name, Killer->GetName());\n\t\tPluginManager->CallHookKilled(*this, a_TDI, DeathMessage);\n\t\tif (!DeathMessage.empty())\n\t\t{\n\t\t\tGetWorld()->BroadcastChatDeath(DeathMessage);\n\t\t}\n\t}  // This will trigger if a player / tamed pet has been killed by another mob / tamed pet.\n\telse if (a_TDI.Attacker->IsMob())\n\t{\n\t\tcMonster * Monster = static_cast<cMonster *>(a_TDI.Attacker);\n\n\t\tAString DeathMessage;\n\t\tif (Monster->HasCustomName())\n\t\t{\n\t\t\tDeathMessage = fmt::format(FMT_STRING(\"{0} was killed by {1}\"), Name, Monster->GetCustomName());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAString KillerName = NamespaceSerializer::PrettifyEntityName(AString(NamespaceSerializer::From(Monster->GetMobType())), Monster->IsTame());\n\t\t\tDeathMessage = fmt::format(FMT_STRING(\"{0} was killed by a {1}\"), Name, KillerName);\n\t\t}\n\n\t\tPluginManager->CallHookKilled(*this, a_TDI, DeathMessage);\n\t\tif (!DeathMessage.empty())\n\t\t{\n\t\t\tGetWorld()->BroadcastChatDeath(DeathMessage);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Entities/Entity.h",
    "content": "\n#pragma once\n\n#include \"../BoundingBox.h\"\n#include \"../Item.h\"\n#include \"../OSSupport/AtomicUniquePtr.h\"\n\n\n\n\n\n// Place this macro in the public section of each cEntity descendant class and you're done :)\n#define CLASS_PROTODEF(classname) \\\n\tvirtual bool IsA(const char * a_ClassName) const override\\\n\t{ \\\n\t\treturn ((a_ClassName != nullptr) && ((strcmp(a_ClassName, #classname) == 0) || Super::IsA(a_ClassName))); \\\n\t} \\\n\tvirtual const char * GetClass(void) const override \\\n\t{ \\\n\t\treturn #classname; \\\n\t} \\\n\tstatic const char * GetClassStatic(void) \\\n\t{ \\\n\t\treturn #classname; \\\n\t} \\\n\tvirtual const char * GetParentClass(void) const override \\\n\t{ \\\n\t\treturn Super::GetClass(); \\\n\t}\n\n#define POSX_TOINT FloorC(GetPosX())\n#define POSY_TOINT FloorC(GetPosY())\n#define POSZ_TOINT FloorC(GetPosZ())\n#define POS_TOINT  GetPosition().Floor()\n\n#define GET_AND_VERIFY_CURRENT_CHUNK(ChunkVarName, X, Z) \\\n\tcChunk * ChunkVarName = a_Chunk.GetNeighborChunk(X, Z); \\\n\tdo { \\\n\t\tif ((ChunkVarName == nullptr) || !ChunkVarName->IsValid()) \\\n\t\t{ \\\n\t\t\treturn; \\\n\t\t} \\\n\t} while (false)\n\n\n\n\nclass cWorld;\nclass cClientHandle;\nclass cPlayer;\nclass cChunk;\nclass cMonster;\n\n\n\n\n\n// tolua_begin\nstruct TakeDamageInfo\n{\n\teDamageType DamageType;   // Where does the damage come from? Being hit / on fire / contact with cactus / ...\n\tcEntity *   Attacker;     // The attacking entity; valid only for dtAttack\n\tint         RawDamage;    // What damage would the receiver get without any armor. Usually: attacker mob type + weapons\n\tfloat       FinalDamage;  // What actual damage will be received. Usually: m_RawDamage minus armor\n\tVector3d    Knockback;    // The amount and direction of knockback received from the damage\n\t// TODO: Effects - list of effects that the hit is causing. Unknown representation yet\n} ;\n// tolua_end\n\n\n\n\n\n// tolua_begin\nclass cEntity\n{\nprotected:\n\t/** State variables for MoveToWorld. */\n\tstruct sWorldChangeInfo\n\t{\n\t\tcWorld * m_NewWorld;\n\t\tVector3d m_NewPosition;\n\t\tbool m_SetPortalCooldown;\n\t};\n\npublic:\n\n\tenum eEntityType\n\t{\n\t\tetEntity,  // For all other types\n\t\tetEnderCrystal,\n\t\tetPlayer,\n\t\tetPickup,\n\t\tetMonster,\n\t\tetFallingBlock,\n\t\tetMinecart,\n\t\tetBoat,\n\t\tetTNT,\n\t\tetProjectile,\n\t\tetExpOrb,\n\t\tetFloater,\n\t\tetItemFrame,\n\t\tetPainting,\n\t\tetLeashKnot,\n\n\t\t// Common variations\n\t\tetMob = etMonster,  // DEPRECATED, use etMonster instead!\n\t} ;\n\n\t// tolua_end\n\n\tstatic const int FIRE_TICKS_PER_DAMAGE = 10;   ///< Ticks to wait between damaging an entity when it stands in fire\n\tstatic const int FIRE_DAMAGE           = 1;    ///< Damage to deal when standing in fire\n\tstatic const int LAVA_TICKS_PER_DAMAGE = 10;   ///< Ticks to wait between damaging an entity when it stands in lava\n\tstatic const int LAVA_DAMAGE           = 4;    ///< Damage to deal when standing in lava\n\tstatic const int BURN_TICKS_PER_DAMAGE = 20;   ///< Ticks to wait between damaging an entity when it is burning\n\tstatic const int BURN_DAMAGE           = 1;    ///< Damage to deal when the entity is burning\n\n\tstatic const int BURN_TICKS            = 160;  ///< Ticks to keep an entity burning after it has stood in lava / fire\n\n\tstatic const int MAX_AIR_LEVEL         = 300;  ///< Maximum air an entity can have\n\tstatic const int DROWNING_TICKS        = 20;   ///< Number of ticks per heart of damage\n\n\tstatic const int VOID_BOUNDARY         = -64;  ///< Y position to begin applying void damage\n\tstatic const int FALL_DAMAGE_HEIGHT    = 4;    ///< Y difference after which fall damage is applied\n\n\t/** Special ID that is considered an \"invalid value\", signifying no entity. */\n\tstatic const UInt32 INVALID_ID = 0;  // Exported to Lua in ManualBindings.cpp, ToLua doesn't parse initialized constants.\n\n\n\tcEntity(eEntityType a_EntityType, Vector3d a_Pos, float a_Width, float a_Height);\n\tvirtual ~cEntity() = default;\n\n\t/** Spawns the entity in the world; returns true if spawned, false if not (plugin disallowed).\n\tAdds the entity to the world. */\n\tbool Initialize(OwnedEntity a_Self, cWorld & a_EntityWorld);\n\n\t/** Called when a player begins spectating this entity. */\n\tvoid OnAcquireSpectator(cPlayer & a_Player);\n\n\t/** Called when the entity is added to a world.\n\te.g after first spawning or after successfuly moving between worlds.\n\t\\param a_World The world being added to. */\n\tvirtual void OnAddToWorld(cWorld & a_World);\n\n\t/** Called when a player stops spectating this entity. */\n\tvoid OnLoseSpectator(cPlayer & a_Player);\n\n\t/** Called when the entity is removed from a world.\n\te.g. When the entity is destroyed or moved to a different world.\n\t\\param a_World The world being removed from. */\n\tvirtual void OnRemoveFromWorld(cWorld & a_World);\n\n\t// tolua_begin\n\n\teEntityType GetEntityType(void) const { return m_EntityType; }\n\n\tbool IsArrow       (void) const { return IsA(\"cArrowEntity\");              }\n\tbool IsEnderCrystal(void) const { return (m_EntityType == etEnderCrystal); }\n\tbool IsPlayer      (void) const { return (m_EntityType == etPlayer);       }\n\tbool IsPickup      (void) const { return (m_EntityType == etPickup);       }\n\tbool IsMob         (void) const { return (m_EntityType == etMonster);      }\n\tbool IsPawn        (void) const { return (IsMob() || IsPlayer());          }\n\tbool IsFallingBlock(void) const { return (m_EntityType == etFallingBlock); }\n\tbool IsMinecart    (void) const { return (m_EntityType == etMinecart);     }\n\tbool IsBoat        (void) const { return (m_EntityType == etBoat);         }\n\tbool IsTNT         (void) const { return (m_EntityType == etTNT);          }\n\tbool IsProjectile  (void) const { return (m_EntityType == etProjectile);   }\n\tbool IsExpOrb      (void) const { return (m_EntityType == etExpOrb);       }\n\tbool IsFloater     (void) const { return (m_EntityType == etFloater);      }\n\tbool IsItemFrame   (void) const { return (m_EntityType == etItemFrame);    }\n\tbool IsLeashKnot   (void) const { return (m_EntityType == etLeashKnot);    }\n\tbool IsPainting    (void) const { return (m_EntityType == etPainting);     }\n\n\t/** Returns true if the entity is of the specified class or a subclass (cPawn's IsA(\"cEntity\") returns true) */\n\tvirtual bool IsA(const char * a_ClassName) const;\n\n\t/** Returns the class name of this class */\n\tstatic const char * GetClassStatic(void);\n\n\t/** Returns the topmost class name for the object */\n\tvirtual const char * GetClass(void) const;\n\n\t/** Returns the topmost class's parent class name for the object. cEntity returns an empty string (no parent). */\n\tvirtual const char * GetParentClass(void) const;\n\n\t/** Returns whether blocks can be placed intersecting this entities' hitbox */\n\tvirtual bool DoesPreventBlockPlacement(void) const { return true; }\n\n\tcWorld * GetWorld(void) const { return m_World; }\n\n\tdouble           GetHeadYaw   (void) const { return m_HeadYaw; }  // In degrees\n\tfloat            GetHeight    (void) const { return m_Height;  }\n\tdouble           GetMass      (void) const { return m_Mass;    }\n\tdouble           GetPosX      (void) const { return m_Position.x; }\n\tdouble           GetPosY      (void) const { return m_Position.y; }\n\tdouble           GetPosZ      (void) const { return m_Position.z; }\n\tdouble           GetYaw       (void) const { return m_Rot.x;   }  // In degrees, [-180, +180)\n\tdouble           GetPitch     (void) const { return m_Rot.y;   }  // In degrees, [-180, +180), but normal client clips to [-90, +90]\n\tdouble           GetRoll      (void) const { return m_Rot.z;   }  // In degrees, unused in current client\n\tVector3d         GetLookVector(void) const;\n\tdouble           GetSpeedX    (void) const { return m_Speed.x; }\n\tdouble           GetSpeedY    (void) const { return m_Speed.y; }\n\tdouble           GetSpeedZ    (void) const { return m_Speed.z; }\n\tfloat            GetWidth     (void) const { return m_Width;   }\n\n\tint GetChunkX(void) const { return FloorC(m_Position.x / cChunkDef::Width); }\n\tint GetChunkZ(void) const { return FloorC(m_Position.z / cChunkDef::Width); }\n\n\t// Get the Entity's axis aligned bounding box, with absolute (world-relative) coordinates.\n\tcBoundingBox GetBoundingBox() const { return cBoundingBox(GetPosition(), GetWidth() / 2, GetHeight()); }\n\n\tvoid SetHeadYaw (double a_HeadYaw);\n\tvoid SetMass    (double a_Mass);\n\tvoid SetPosX    (double a_PosX) { SetPosition({a_PosX, m_Position.y, m_Position.z}); }\n\tvoid SetPosY    (double a_PosY) { SetPosition({m_Position.x, a_PosY, m_Position.z}); }\n\tvoid SetPosZ    (double a_PosZ) { SetPosition({m_Position.x, m_Position.y, a_PosZ}); }\n\tvoid SetPosition(double a_PosX, double a_PosY, double a_PosZ) { SetPosition({a_PosX, a_PosY, a_PosZ}); }\n\tvoid SetPosition(const Vector3d & a_Position);\n\tvoid SetYaw     (double a_Yaw);    // In degrees, normalizes to [-180, +180)\n\tvoid SetPitch   (double a_Pitch);  // In degrees, normalizes to [-180, +180)\n\tvoid SetRoll    (double a_Roll);   // In degrees, normalizes to [-180, +180)\n\n\t/** Sets the speed of the entity, measured in m / sec */\n\tvoid SetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ);\n\n\t/** Sets the speed of the entity, measured in m / sec */\n\tvoid SetSpeed(Vector3d a_Speed) { SetSpeed(a_Speed.x, a_Speed.y, a_Speed.z); }\n\n\t/** Sets the speed in the X axis, leaving the other speed components intact. Measured in m / sec. */\n\tvoid SetSpeedX(double a_SpeedX);\n\n\t/** Sets the speed in the Y axis, leaving the other speed components intact. Measured in m / sec. */\n\tvoid SetSpeedY(double a_SpeedY);\n\n\t/** Sets the speed in the Z axis, leaving the other speed components intact. Measured in m / sec. */\n\tvoid SetSpeedZ(double a_SpeedZ);\n\n\tvoid AddPosX    (double a_AddPosX) { AddPosition(a_AddPosX, 0, 0); }\n\tvoid AddPosY    (double a_AddPosY) { AddPosition(0, a_AddPosY, 0); }\n\tvoid AddPosZ    (double a_AddPosZ) { AddPosition(0, 0, a_AddPosZ); }\n\tvoid AddPosition(double a_AddPosX, double a_AddPosY, double a_AddPosZ) { SetPosition(m_Position + Vector3d(a_AddPosX, a_AddPosY, a_AddPosZ)); }\n\tvoid AddPosition(const Vector3d & a_AddPos) { AddPosition(a_AddPos.x, a_AddPos.y, a_AddPos.z); }\n\tvoid AddSpeed   (double a_AddSpeedX, double a_AddSpeedY, double a_AddSpeedZ);\n\tvoid AddSpeed   (const Vector3d & a_AddSpeed) { AddSpeed(a_AddSpeed.x, a_AddSpeed.y, a_AddSpeed.z); }\n\tvoid AddSpeedX  (double a_AddSpeedX);\n\tvoid AddSpeedY  (double a_AddSpeedY);\n\tvoid AddSpeedZ  (double a_AddSpeedZ);\n\n\tvirtual void HandleSpeedFromAttachee(float a_Forward, float a_Sideways);\n\tvoid SteerVehicle(float a_Forward, float a_Sideways);\n\n\tinline UInt32 GetUniqueID(void) const { return m_UniqueID; }\n\n\t/** Deprecated. Use IsTicking instead. */\n\tinline bool IsDestroyed() const {return !IsTicking();}\n\n\t/** Returns true if the entity is valid and ticking. Returns false if the entity is not ticking and is about to leave\n\tits current world either via teleportation or destruction.\n\tIf this returns false, you must stop using the cEntity pointer you have. */\n\tbool IsTicking(void) const;\n\n\t// tolua_end\n\t/** Destroys the entity, schedules it for memory freeing and broadcasts the DestroyEntity packet */\n\tvoid Destroy();\n\t// tolua_begin\n\n\t/** Makes this pawn take damage from an attack by a_Attacker. Damage values are calculated automatically and DoTakeDamage() called */\n\tvoid TakeDamage(cEntity & a_Attacker);\n\n\t/** Makes this entity take the specified damage. The final damage is calculated using current armor, then DoTakeDamage() called */\n\tvoid TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_RawDamage, double a_KnockbackAmount);\n\n\t/** Makes this entity take the specified damage. The final damage is calculated using current armor, then DoTakeDamage() called */\n\tvoid TakeDamage(eDamageType a_DamageType, UInt32 a_Attacker, int a_RawDamage, double a_KnockbackAmount);\n\n\t/** Makes this entity take the specified damage. The values are packed into a TDI, knockback calculated, then sent through DoTakeDamage() */\n\tvoid TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_RawDamage, float a_FinalDamage, double a_KnockbackAmount);\n\n\tfloat GetGravity(void) const { return m_Gravity; }\n\n\tvoid SetGravity(float a_Gravity) { m_Gravity = a_Gravity; }\n\n\tfloat GetAirDrag(void) const { return m_AirDrag; }\n\n\tvoid SetAirDrag(float a_AirDrag) { m_AirDrag = a_AirDrag; }\n\n\t/** Sets the rotation to match the speed vector (entity goes \"face-forward\") */\n\tvoid SetYawFromSpeed(void);\n\n\t/** Sets the pitch to match the speed vector (entity gies \"face-forward\") */\n\tvoid SetPitchFromSpeed(void);\n\n\t// tolua_end\n\n\t/** Exported in ManualBindings */\n\tconst Vector3d & GetPosition(void) const { return m_Position; }\n\n\t/** Exported in ManualBindings */\n\tconst Vector3d & GetSpeed(void) const { return m_Speed; }\n\n\t/** Returns the last position we sent to all the clients. Use this to\n\tinitialize clients with our position. */\n\tVector3d GetLastSentPosition(void) const { return m_LastSentPosition; }\n\n\t/** Makes this entity take damage specified in the a_TDI.\n\tThe TDI is sent through plugins first, then applied.\n\tIf it returns false, the entity hasn't receive any damage. */\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI);\n\n\t// tolua_begin\n\n\t/** Returns the hitpoints that this pawn can deal to a_Receiver using its equipped items */\n\tvirtual int GetRawDamageAgainst(const cEntity & a_Receiver);\n\n\t/** Returns whether armor will protect against the specified damage type */\n\tvirtual bool ArmorCoversAgainst(eDamageType a_DamageType);\n\n\t/** Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover */\n\tvirtual float GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_RawDamage);\n\n\t/** Returns the hitpoints that the currently equipped armor's enchantments would cover */\n\tvirtual float GetEnchantmentCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_Damage);\n\n\t/** Returns explosion knock back reduction percent from blast protection level\n\t@return knock back reduce percent */\n\tvirtual float GetEnchantmentBlastKnockbackReduction();\n\n\t/** Returns the knockback amount that the currently equipped items would cause to a_Receiver on a hit */\n\tvirtual double GetKnockbackAmountAgainst(const cEntity & a_Receiver);\n\n\t/** Returns the curently equipped weapon; empty item if none */\n\tvirtual cItem GetEquippedWeapon(void) const { return cItem(); }\n\n\t/** Returns the currently equipped helmet; empty item if none */\n\tvirtual cItem GetEquippedHelmet(void) const { return cItem(); }\n\n\t/** Returns the currently equipped chestplate; empty item if none */\n\tvirtual cItem GetEquippedChestplate(void) const { return cItem(); }\n\n\t/** Returns the currently equipped leggings; empty item if none */\n\tvirtual cItem GetEquippedLeggings(void) const { return cItem(); }\n\n\t/** Returns the currently equipped boots; empty item if none */\n\tvirtual cItem GetEquippedBoots(void) const { return cItem(); }\n\n\t/** Returns the currently offhand equipped item; empty item if none */\n\tvirtual cItem GetOffHandEquipedItem(void) const { return cItem(); }\n\n\t/** Applies damage to the armor after the armor blocked the given amount */\n\tvirtual void ApplyArmorDamage(int DamageBlocked);\n\n\t// tolua_end\n\n\t/** Called when the health drops below zero. a_TDI's Attacker may be nullptr (environmental damage) */\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI);\n\n\t// tolua_begin\n\n\t/** Called when the entity kills another entity. */\n\tvirtual void Killed(const cEntity & a_Victim, eDamageType a_DamageType) {}\n\n\t/** Heals the specified amount of HPs */\n\tvirtual void Heal(int a_HitPoints);\n\n\t/** Returns the health of this entity */\n\tfloat GetHealth(void) const { return m_Health; }\n\n\t/** Sets the health of this entity; doesn't broadcast any hurt animation */\n\tvoid SetHealth(float a_Health);\n\n\t// tolua_end\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);\n\n\t/** Handles the physics of the entity - updates position based on speed, updates speed based on environment */\n\tvirtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);\n\n\t/** Updates the state related to this entity being on fire */\n\tvirtual void TickBurning(cChunk & a_Chunk);\n\n\t/** Detects the time for application of cacti damage */\n\tvirtual void DetectCacti(void);\n\n\t/** Detects the time for application of magma block damage */\n\tvirtual void DetectMagma(void);\n\n\t/** Detects whether we are in a portal block and begins teleportation procedures if so\n\tReturns true if MoveToWorld() was called, false if not\n\t*/\n\tvirtual bool DetectPortal(void);\n\n\t/** Handles when the entity is in the void */\n\tvirtual void TickInVoid(cChunk & a_Chunk);\n\n\t/** Called when the entity starts burning */\n\tvirtual void OnStartedBurning(void);\n\n\t/** Called when the entity finishes burning */\n\tvirtual void OnFinishedBurning(void);\n\n\t// tolua_begin\n\n\t/** Sets the maximum value for the health */\n\tvoid SetMaxHealth(float a_MaxHealth);\n\n\tfloat GetMaxHealth(void) const { return m_MaxHealth; }\n\n\t/** Sets whether the entity is fireproof */\n\tvoid SetIsFireproof(bool a_IsFireproof);\n\n\tvirtual bool IsFireproof(void) const { return m_IsFireproof; }\n\n\t/** Puts the entity on fire for the specified amount of ticks */\n\tvoid StartBurning(int a_TicksLeftBurning);\n\n\t/** Stops the entity from burning, resets all burning timers */\n\tvoid StopBurning(void);\n\n\t// tolua_end\n\n\t/** Descendants override this function to send a command to the specified client to spawn the entity on the client.\n\tTo spawn on all eligible clients, use cChunkMap::BroadcastSpawnEntity() */\n\tvirtual void SpawnOn(cClientHandle & a_Client) = 0;\n\n\t// tolua_begin\n\n\t/** Teleports to the entity specified */\n\tvirtual void TeleportToEntity(cEntity & a_Entity);\n\n\t/** Teleports to the coordinates specified */\n\tvirtual void TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ);\n\n\tbool MoveToWorld(cWorld & a_World, Vector3d a_NewPosition, bool a_ShouldSetPortalCooldown = false, bool a_ShouldSendRespawn = true);\n\n\tbool MoveToWorld(cWorld & a_World, bool a_ShouldSendRespawn, Vector3d a_NewPosition)\n\t{\n\t\treturn MoveToWorld(a_World, a_NewPosition, false, a_ShouldSendRespawn);\n\t}\n\n\t/** Moves entity to specified world, taking a world pointer */\n\tbool MoveToWorld(cWorld & a_World, bool a_ShouldSendRespawn = true);\n\n\t/** Moves entity to specified world, taking a world name */\n\tbool MoveToWorld(const AString & a_WorldName, bool a_ShouldSendRespawn = true);\n\n\t// tolua_end\n\n\t/** Returns true if a world change is scheduled to happen. */\n\tbool IsWorldChangeScheduled() const\n\t{\n\t\treturn (m_WorldChangeInfo.m_NewWorld != nullptr);\n\t}\n\n\t/** Updates clients of changes in the entity. */\n\tvirtual void BroadcastMovementUpdate(const cClientHandle * a_Exclude = nullptr);\n\n\t/** Gets entity (vehicle) attached to this entity */\n\tcEntity * GetAttached();\n\n\t/** Attaches to the specified entity; detaches from any previous one first. */\n\tvoid AttachTo(cEntity & a_AttachTo);\n\n\t/** Detaches from the currently attached entity, if any. */\n\tvoid Detach(void);\n\n\t/** Returns true if this entity is attached to the specified entity */\n\tbool IsAttachedTo(const cEntity * a_Entity) const;\n\n\t/** Returns whether the entity's orientation has been set manually.\n\tPrimarily inteded for protocol use. */\n\tbool IsOrientationDirty() const;\n\n\t/** Makes sure head yaw is not over the specified range. */\n\tvoid WrapHeadYaw();\n\n\t/** Makes sure rotation is not over the specified range. */\n\tvoid WrapRotation();\n\n\t/** Makes speed is not over 20. Max speed is 20 blocks / second */\n\tvoid WrapSpeed();\n\n\t// tolua_begin\n\n\t// COMMON metadata flags; descendants may override the defaults:\n\tvirtual bool IsCrouched    (void) const { return false; }\n\tvirtual bool IsElytraFlying(void) const { return false; }\n\tvirtual bool IsInvisible   (void) const { return false; }\n\tvirtual bool IsOnFire      (void) const { return m_TicksLeftBurning > 0; }\n\tvirtual bool IsRclking     (void) const { return false; }\n\tvirtual bool IsRiding      (void) const { return false; }\n\tvirtual bool IsSprinting   (void) const { return false; }\n\n\t/** Returns true if any part of the entity is in a fire block */\n\tvirtual bool IsInFire(void) const { return m_IsInFire; }\n\n\t/** Returns true if any part of the entity is in a lava block */\n\tvirtual bool IsInLava(void) const { return m_IsInLava; }\n\n\t/** Returns true if any part of the entity is in a water block */\n\tvirtual bool IsInWater(void) const { return m_IsInWater; }\n\n\t/** Returns true if any part of the entity is in a water block */\n\tvirtual bool IsHeadInWater(void) const { return m_IsHeadInWater; }\n\n\t/** Gets remaining air of a monster */\n\tint GetAirLevel(void) const { return m_AirLevel; }\n\n\t/** Gets number of ticks this entity has been alive for */\n\tlong int GetTicksAlive(void) const { return m_TicksAlive; }\n\n\t/** Gets the invulnerable ticks from the entity */\n\tint GetInvulnerableTicks(void) const { return m_InvulnerableTicks; }\n\n\t/** Set the invulnerable ticks from the entity */\n\tvoid SetInvulnerableTicks(int a_InvulnerableTicks) { m_InvulnerableTicks = a_InvulnerableTicks; }\n\n\t/** Returns whether the entity is on ground or not */\n\tvirtual bool IsOnGround(void) const { return m_bOnGround; }\n\n\t// tolua_end\n\n\t/** Called when the specified player right-clicks this entity */\n\tvirtual void OnRightClicked(cPlayer & a_Player) {}\n\n\t/** Returns the list of drops for this pawn when it is killed. May check a_Killer for special handling (sword of looting etc.). Called from KilledBy(). */\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr)\n\t{\n\t\tUNUSED(a_Drops);\n\t\tUNUSED(a_Killer);\n\t}\n\n\t/** Sets the internal world pointer to a new cWorld, doesn't update anything else. */\n\tvoid SetWorld(cWorld * a_World) { m_World = a_World; }\n\n\t/** Sets the parent chunk, which is the chunk responsible for ticking this entity.\n\tOnly cChunk::AddEntity and cChunk::RemoveEntity cChunk::~cChunk should ever call this. */\n\tvoid SetParentChunk(cChunk * a_Chunk);\n\n\t/** Returns the chunk responsible for ticking this entity. */\n\tcChunk * GetParentChunk() { return m_ParentChunk; }\n\tconst cChunk * GetParentChunk() const { return m_ParentChunk; }\n\n\t/** Set the entity's status to either ticking or not ticking. */\n\tvoid SetIsTicking(bool a_IsTicking);\n\n\t/** Update an entity's size, for example, on body stance changes. */\n\tvoid SetSize(float a_Width, float a_Height);\n\n\t/** Adds a mob to the leashed list of mobs. */\n\tvoid AddLeashedMob(cMonster * a_Monster);\n\n\t/** Removes a mob from the leashed list of mobs. */\n\tvoid RemoveLeashedMob(cMonster * a_Monster);\n\n\t/** Returs whether the entity has any mob leashed to it. */\n\tbool HasAnyMobLeashed() const { return m_LeashedMobs.size() > 0; }\n\n\t/** Announces a death message on chat about killing the entity. */\n\tvoid BroadcastDeathMessage(TakeDamageInfo & a_TDI);\n\nprotected:\n\n\t/** Structure storing the portal delay timer and cooldown boolean */\n\tstruct sPortalCooldownData\n\t{\n\t\t/** Ticks since entry of portal, used to delay teleportation */\n\t\tunsigned short m_TicksDelayed;\n\n\t\t/** Whether the entity has just exited the portal, and should therefore not be teleported again.\n\t\tThis prevents teleportation loops, and is reset when the entity has moved out of the portal. */\n\t\tbool m_ShouldPreventTeleportation;\n\t};\n\n\n\t/** Measured in meters / second (m / s) */\n\tVector3d m_Speed;\n\n\t/** The ID of the entity that is guaranteed to be unique within a single run of the server.\n\tAlways nonzero (a zero UniqueID (cEntity::INVALID_ID) is used for error reporting).\n\tNote that the UniqueID is not persisted through storage. */\n\tUInt32 m_UniqueID;\n\n\tfloat m_Health;\n\tfloat m_MaxHealth;\n\n\t/** The entity to which this entity is attached (vehicle), nullptr if none. */\n\tcEntity * m_AttachedTo;\n\n\t/** The entity which is attached to this entity (rider), nullptr if none. */\n\tcEntity * m_Attachee;\n\n\t/** Stores whether head yaw has been set manually */\n\tbool m_bDirtyHead;\n\n\t/** Stores whether our yaw / pitch / roll (body orientation) has been set manually */\n\tbool m_bDirtyOrientation;\n\n\t/** Stores whether we have sent a Velocity packet with a speed of zero (no speed) to the client\n\tEnsures that said packet is sent only once */\n\tbool m_bHasSentNoSpeed;\n\n\t/** Stores if the entity is on the ground */\n\tbool m_bOnGround;\n\n\t/** Stores gravity that is applied to an entity every tick\n\tFor realistic effects, this should be negative. For spaaaaaaace, this can be zero or even positive */\n\tfloat m_Gravity;\n\n\t/** Stores the air drag that is applied to the entity every tick, measured in speed ratio per tick\n\tActs as air friction and slows down flight\n\tWill be interpolated if the server tick rate varies\n\tData: https://minecraft.wiki/w/Entity#Motion_of_entities */\n\tfloat m_AirDrag;\n\n\t/** Last position sent to client via the Relative Move or Teleport packets (not Velocity)\n\tOnly updated if cEntity::BroadcastMovementUpdate() is called! */\n\tVector3d m_LastSentPosition;\n\n\tVector3d m_LastPosition;\n\n\teEntityType m_EntityType;\n\n\tcWorld * m_World;\n\n\t/** If field m_NewWorld not nullptr, a world change is scheduled and a task is queued in the current world. */\n\tsWorldChangeInfo m_WorldChangeInfo;\n\n\t/** Whether the entity is capable of taking fire or lava damage. */\n\tbool m_IsFireproof;\n\n\t/** Time, in ticks, since the last damage dealt by being on fire. Valid only if on fire (IsOnFire()) */\n\tint m_TicksSinceLastBurnDamage;\n\n\t/** Time, in ticks, since the last damage dealt by standing in lava. Reset to zero when moving out of lava. */\n\tint m_TicksSinceLastLavaDamage;\n\n\t/** Time, in ticks, since the last damage dealt by standing in fire. Reset to zero when moving out of fire. */\n\tint m_TicksSinceLastFireDamage;\n\n\t/** Time, in ticks, until the entity extinguishes its fire */\n\tint m_TicksLeftBurning;\n\n\t/** Time, in ticks, since the last damage dealt by the void. Reset to zero when moving out of the void. */\n\tint m_TicksSinceLastVoidDamage;\n\n\t/** If any part of the entity is in a fire block */\n\tbool m_IsInFire;\n\n\t/** If any part of the entity is in a lava block */\n\tbool m_IsInLava;\n\n\t/** If any part of the entity is in a water block */\n\tbool m_IsInWater;\n\n\t/** If the entity's head is in a water block */\n\tbool m_IsHeadInWater;\n\n\t/** Air level of a mobile */\n\tint m_AirLevel;\n\tint m_AirTickTimer;\n\n\t/** Portal delay timer and cooldown boolean data */\n\tsPortalCooldownData m_PortalCooldownData;\n\n\t/** The number of ticks this entity has been alive for */\n\tlong int m_TicksAlive;\n\n\t/** Handles the moving of this entity between worlds.\n\tShould handle degenerate cases such as moving to the same world. */\n\tvoid DoMoveToWorld(const sWorldChangeInfo & a_WorldChangeInfo);\n\n\t/** Applies friction to an entity\n\t@param a_Speed The speed vector to apply changes to\n\t@param a_SlowdownMultiplier The factor to reduce the speed by */\n\tstatic void ApplyFriction(Vector3d & a_Speed, double a_SlowdownMultiplier, float a_Dt);\n\n\t/** Called in each tick to handle air-related processing i.e. drowning */\n\tvirtual void HandleAir(void);\n\n\t/** Called once per tick to set m_IsInFire, m_IsInLava, m_IsInWater and\n\tm_IsHeadInWater */\n\tvirtual void SetSwimState(cChunk & a_Chunk);\n\n\t/** Set the entities position and last sent position.\n\tOnly to be used when the caller will broadcast a teleport or equivalent to clients. */\n\tvirtual void ResetPosition(Vector3d a_NewPos);\n\n\t/** If has any mobs are leashed, broadcasts every leashed entity to this. */\n\tvoid BroadcastLeashedMobs();\n\n\t/** Called when this entity dismounts from m_AttachedTo. */\n\tvirtual void OnDetach();\n\nprivate:\n\n\t/** Whether the entity is ticking or not. If not, it is scheduled for removal or world-teleportation. */\n\tbool m_IsTicking;\n\n\t/** The chunk which is responsible for ticking this entity. */\n\tcChunk * m_ParentChunk;\n\n\t/** Measured in degrees, [-180, +180) */\n\tdouble   m_HeadYaw;\n\n\t/** Measured in degrees, [-180, +180) */\n\tVector3d m_Rot;\n\n\t/** Position of the entity's XZ center and Y bottom */\n\tVector3d m_Position;\n\n\t/** Measured in meter / second */\n\tVector3d m_WaterSpeed;\n\n\t/** Measured in Kilograms (Kg) */\n\tdouble m_Mass;\n\n\t/** Width of the entity, in the XZ plane. Since entities are represented as cylinders, this is more of a diameter. */\n\tfloat m_Width;\n\n\t/** Height of the entity (Y axis). */\n\tfloat m_Height;\n\n\t/** If a player hit a entity, the entity receive a invulnerable of 10 ticks.\n\tWhile this ticks, a player can't hit this entity. */\n\tint m_InvulnerableTicks;\n\n\ttypedef std::list<cMonster *> cMonsterList;\n\n\t/** List of leashed mobs to this entity */\n\tcMonsterList m_LeashedMobs;\n\n\t/** List of players who are spectating this entity. */\n\tstd::vector<cPlayer *> m_Spectators;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/EntityEffect.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"EntityEffect.h\"\n#include \"Player.h\"\n#include \"../Chunk.h\"\n#include \"../Mobs/Monster.h\"\n\n\n\n\n\nint cEntityEffect::GetPotionColor(short a_ItemDamage)\n{\n\t// Lowest six bits\n\treturn (a_ItemDamage & 0x3f);\n}\n\n\n\n\n\ncEntityEffect::eType cEntityEffect::GetPotionEffectType(short a_ItemDamage)\n{\n\t// Lowest four bits\n\t// Potion effect bits are different from entity effect values\n\t// For reference: https://minecraft.wiki/w/Java_Edition_data_values#.22Potion_effect.22_bits\n\tswitch (a_ItemDamage & 0x0f)\n\t{\n\t\tcase 0x01: return cEntityEffect::effRegeneration;\n\t\tcase 0x02: return cEntityEffect::effSpeed;\n\t\tcase 0x03: return cEntityEffect::effFireResistance;\n\t\tcase 0x04: return cEntityEffect::effPoison;\n\t\tcase 0x05: return cEntityEffect::effInstantHealth;\n\t\tcase 0x06: return cEntityEffect::effNightVision;\n\t\tcase 0x08: return cEntityEffect::effWeakness;\n\t\tcase 0x09: return cEntityEffect::effStrength;\n\t\tcase 0x0a: return cEntityEffect::effSlowness;\n\t\tcase 0x0b: return cEntityEffect::effJumpBoost;\n\t\tcase 0x0c: return cEntityEffect::effInstantDamage;\n\t\tcase 0x0d: return cEntityEffect::effWaterBreathing;\n\t\tcase 0x0e: return cEntityEffect::effInvisibility;\n\n\t\t// No effect potions\n\t\tcase 0x00:\n\t\tcase 0x07:\n\t\tcase 0x0f:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn cEntityEffect::effNoEffect;\n}\n\n\n\n\n\nshort cEntityEffect::GetPotionEffectIntensity(short a_ItemDamage)\n{\n\t// Level II potion if the fifth lowest bit is set\n\treturn ((a_ItemDamage & 0x20) != 0) ? 1 : 0;\n}\n\n\n\n\n\nint cEntityEffect::GetPotionEffectDuration(short a_ItemDamage)\n{\n\t// Base duration in ticks\n\tint base = 0;\n\tdouble TierCoeff = 1, ExtCoeff = 1, SplashCoeff = 1;\n\n\tswitch (GetPotionEffectType(a_ItemDamage))\n\t{\n\t\tcase cEntityEffect::effRegeneration:\n\t\tcase cEntityEffect::effPoison:\n\t\t{\n\t\t\tbase = 900;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntityEffect::effSpeed:\n\t\tcase cEntityEffect::effFireResistance:\n\t\tcase cEntityEffect::effNightVision:\n\t\tcase cEntityEffect::effStrength:\n\t\tcase cEntityEffect::effWaterBreathing:\n\t\tcase cEntityEffect::effJumpBoost:\n\t\tcase cEntityEffect::effInvisibility:\n\t\t{\n\t\t\tbase = 3600;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntityEffect::effWeakness:\n\t\tcase cEntityEffect::effSlowness:\n\t\t{\n\t\t\tbase = 1800;\n\t\t\tbreak;\n\t\t}\n\t\tdefault: break;\n\t}\n\n\t// If potion is level II, half the duration. If not, stays the same\n\tTierCoeff = (GetPotionEffectIntensity(a_ItemDamage) > 0) ? 0.5 : 1;\n\n\t// If potion is extended, multiply duration by 8 / 3. If not, stays the same\n\t// Extended potion if sixth lowest bit is set\n\tExtCoeff = (a_ItemDamage & 0x40) ? (8.0 / 3.0) : 1;\n\n\t// If potion is splash potion, multiply duration by 3 / 4. If not, stays the same\n\tSplashCoeff = IsPotionDrinkable(a_ItemDamage) ? 1 : 0.75;\n\n\t// Ref.:\n\t//   https://minecraft.wiki/w/Java_Edition_data_values#.22Tier.22_bit\n\t//   https://minecraft.wiki/w/Java_Edition_data_values#.22Extended_duration.22_bit\n\t//   https://minecraft.wiki/w/Java_Edition_data_values#.22Splash_potion.22_bit\n\n\treturn static_cast<int>(base * TierCoeff * ExtCoeff * SplashCoeff);\n}\n\n\n\n\n\nbool cEntityEffect::IsPotionDrinkable(short a_ItemDamage)\n{\n\t// Potions are drinkable if they are not splash potions.\n\t// i.e. potions are drinkable if the 14th lowest bit is not set\n\t// Ref.: https://minecraft.wiki/w/Java_Edition_data_values#.22Splash_potion.22_bit\n\treturn ((a_ItemDamage & 0x4000) == 0);\n}\n\n\n\n\n\ncEntityEffect::cEntityEffect():\n\tm_Ticks(0),\n\tm_Duration(0),\n\tm_Intensity(0),\n\tm_DistanceModifier(1)\n{\n\n}\n\n\n\n\n\ncEntityEffect::cEntityEffect(int a_Duration, short a_Intensity, double a_DistanceModifier):\n\tm_Ticks(0),\n\tm_Duration(a_Duration),\n\tm_Intensity(a_Intensity),\n\tm_DistanceModifier(a_DistanceModifier)\n{\n\n}\n\n\n\n\n\ncEntityEffect::cEntityEffect(const cEntityEffect & a_OtherEffect):\n\tm_Ticks(a_OtherEffect.m_Ticks),\n\tm_Duration(a_OtherEffect.m_Duration),\n\tm_Intensity(a_OtherEffect.m_Intensity),\n\tm_DistanceModifier(a_OtherEffect.m_DistanceModifier)\n{\n\n}\n\n\n\n\n\ncEntityEffect & cEntityEffect::operator =(cEntityEffect a_OtherEffect)\n{\n\tstd::swap(m_Ticks, a_OtherEffect.m_Ticks);\n\tstd::swap(m_Duration, a_OtherEffect.m_Duration);\n\tstd::swap(m_Intensity, a_OtherEffect.m_Intensity);\n\tstd::swap(m_DistanceModifier, a_OtherEffect.m_DistanceModifier);\n\treturn *this;\n}\n\n\n\n\n\nstd::unique_ptr<cEntityEffect> cEntityEffect::CreateEntityEffect(cEntityEffect::eType a_EffectType, int a_Duration, short a_Intensity, double a_DistanceModifier)\n{\n\tswitch (a_EffectType)\n\t{\n\t\tcase cEntityEffect::effNoEffect:       return std::make_unique<cEntityEffect              >(a_Duration, a_Intensity, a_DistanceModifier);\n\n\t\tcase cEntityEffect::effAbsorption:     return std::make_unique<cEntityEffectAbsorption    >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effBlindness:      return std::make_unique<cEntityEffectBlindness     >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effFireResistance: return std::make_unique<cEntityEffectFireResistance>(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effHaste:          return std::make_unique<cEntityEffectHaste         >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effHealthBoost:    return std::make_unique<cEntityEffectHealthBoost   >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effHunger:         return std::make_unique<cEntityEffectHunger        >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effInstantDamage:  return std::make_unique<cEntityEffectInstantDamage >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effInstantHealth:  return std::make_unique<cEntityEffectInstantHealth >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effInvisibility:   return std::make_unique<cEntityEffectInvisibility  >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effJumpBoost:      return std::make_unique<cEntityEffectJumpBoost     >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effMiningFatigue:  return std::make_unique<cEntityEffectMiningFatigue >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effNausea:         return std::make_unique<cEntityEffectNausea        >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effNightVision:    return std::make_unique<cEntityEffectNightVision   >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effPoison:         return std::make_unique<cEntityEffectPoison        >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effRegeneration:   return std::make_unique<cEntityEffectRegeneration  >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effResistance:     return std::make_unique<cEntityEffectResistance    >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effSaturation:     return std::make_unique<cEntityEffectSaturation    >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effSlowness:       return std::make_unique<cEntityEffectSlowness      >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effSpeed:          return std::make_unique<cEntityEffectSpeed         >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effStrength:       return std::make_unique<cEntityEffectStrength      >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effWaterBreathing: return std::make_unique<cEntityEffectWaterBreathing>(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effWeakness:       return std::make_unique<cEntityEffectWeakness      >(a_Duration, a_Intensity, a_DistanceModifier);\n\t\tcase cEntityEffect::effWither:         return std::make_unique<cEntityEffectWither        >(a_Duration, a_Intensity, a_DistanceModifier);\n\t}\n\tUNREACHABLE(\"Unsupported entity effect\");\n}\n\n\n\n\n\nvoid cEntityEffect::OnTick(cPawn & a_Target)\n{\n\t// Reduce the effect's duration\n\t++m_Ticks;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectSpeed:\n\nvoid cEntityEffectSpeed::OnActivate(cPawn & a_Target)\n{\n\tif (a_Target.IsMob())\n\t{\n\t\tcMonster * Mob = static_cast<cMonster*>(&a_Target);\n\t\tMob->SetRelativeWalkSpeed(Mob->GetRelativeWalkSpeed() + 0.2 * m_Intensity);\n\t}\n\telse if (a_Target.IsPlayer())\n\t{\n\t\tcPlayer * Player = static_cast<cPlayer*>(&a_Target);\n\t\tPlayer->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() + 0.2 * m_Intensity);\n\t\tPlayer->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() + 0.26 * m_Intensity);\n\t\tPlayer->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() + 0.2 * m_Intensity);\n\t}\n}\n\n\n\n\n\nvoid cEntityEffectSpeed::OnDeactivate(cPawn & a_Target)\n{\n\tif (a_Target.IsMob())\n\t{\n\t\tcMonster * Mob = static_cast<cMonster*>(&a_Target);\n\t\tMob->SetRelativeWalkSpeed(Mob->GetRelativeWalkSpeed() - 0.2 * m_Intensity);\n\t}\n\telse if (a_Target.IsPlayer())\n\t{\n\t\tcPlayer * Player = static_cast<cPlayer*>(&a_Target);\n\t\tPlayer->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() - 0.2 * m_Intensity);\n\t\tPlayer->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() - 0.26 * m_Intensity);\n\t\tPlayer->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() - 0.2 * m_Intensity);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectSlowness:\n\nvoid cEntityEffectSlowness::OnActivate(cPawn & a_Target)\n{\n\tif (a_Target.IsMob())\n\t{\n\t\tcMonster * Mob = static_cast<cMonster*>(&a_Target);\n\t\tMob->SetRelativeWalkSpeed(Mob->GetRelativeWalkSpeed() - 0.15 * m_Intensity);\n\t}\n\telse if (a_Target.IsPlayer())\n\t{\n\t\tcPlayer * Player = static_cast<cPlayer*>(&a_Target);\n\t\tPlayer->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() - 0.15 * m_Intensity);\n\t\tPlayer->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() - 0.195 * m_Intensity);\n\t\tPlayer->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() - 0.15 * m_Intensity);\n\t}\n}\n\n\n\n\n\nvoid cEntityEffectSlowness::OnDeactivate(cPawn & a_Target)\n{\n\tif (a_Target.IsMob())\n\t{\n\t\tcMonster * Mob = static_cast<cMonster*>(&a_Target);\n\t\tMob->SetRelativeWalkSpeed(Mob->GetRelativeWalkSpeed() + 0.15 * m_Intensity);\n\t}\n\telse if (a_Target.IsPlayer())\n\t{\n\t\tcPlayer * Player = static_cast<cPlayer*>(&a_Target);\n\t\tPlayer->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() + 0.15 * m_Intensity);\n\t\tPlayer->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() + 0.195 * m_Intensity);\n\t\tPlayer->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() + 0.15 * m_Intensity);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectInstantHealth:\n\nvoid cEntityEffectInstantHealth::OnActivate(cPawn & a_Target)\n{\n\t// Base amount = 6, doubles for every increase in intensity\n\tint amount = static_cast<int>(6 * (1 << m_Intensity) * m_DistanceModifier);\n\n\tif (a_Target.IsMob() && static_cast<cMonster &>(a_Target).IsUndead())\n\t{\n\t\ta_Target.TakeDamage(dtPotionOfHarming, nullptr, amount, 0);  // TODO: Store attacker in a pointer-safe way, pass to TakeDamage\n\t\treturn;\n\t}\n\ta_Target.Heal(amount);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectInstantDamage:\n\nvoid cEntityEffectInstantDamage::OnActivate(cPawn & a_Target)\n{\n\t// Base amount = 6, doubles for every increase in intensity\n\tint amount = static_cast<int>(6 * (1 << m_Intensity) * m_DistanceModifier);\n\n\tif (a_Target.IsMob() && static_cast<cMonster &>(a_Target).IsUndead())\n\t{\n\t\ta_Target.Heal(amount);\n\t\treturn;\n\t}\n\ta_Target.TakeDamage(dtPotionOfHarming, nullptr, amount, 0);  // TODO: Store attacker in a pointer-safe way, pass to TakeDamage\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectRegeneration:\n\nvoid cEntityEffectRegeneration::OnTick(cPawn & a_Target)\n{\n\tSuper::OnTick(a_Target);\n\n\tif (a_Target.IsMob() && static_cast<cMonster &>(a_Target).IsUndead())\n\t{\n\t\treturn;\n\t}\n\n\t// Regen frequency = 50 ticks, divided by potion level (Regen II = 25 ticks)\n\tint frequency = std::max(1, FloorC(50.0 / static_cast<double>(m_Intensity + 1)));\n\n\tif ((m_Ticks % frequency) != 0)\n\t{\n\t\treturn;\n\t}\n\n\ta_Target.Heal(1);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectHunger:\n\nvoid cEntityEffectHunger::OnTick(cPawn & a_Target)\n{\n\tSuper::OnTick(a_Target);\n\n\tif (a_Target.IsPlayer())\n\t{\n\t\tcPlayer & Target = static_cast<cPlayer &>(a_Target);\n\t\tTarget.AddFoodExhaustion(0.025 * (static_cast<double>(GetIntensity()) + 1.0));  // 0.5 per second = 0.025 per tick\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectInvisibility:\n\nvoid cEntityEffectInvisibility::BroadcastMetadata(cPawn & a_Target)\n{\n\tauto World = a_Target.GetWorld();\n\tif (World != nullptr)\n\t{\n\t\tWorld->BroadcastEntityMetadata(a_Target);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectWeakness:\n\nvoid cEntityEffectWeakness::OnTick(cPawn & a_Target)\n{\n\tSuper::OnTick(a_Target);\n\n\t// Damage reduction = 0.5 damage, multiplied by potion level (Weakness II = 1 damage)\n\t// double dmg_reduc = 0.5 * (a_Effect.GetIntensity() + 1);\n\n\t// TODO: Implement me!\n\t// TODO: Weakened villager zombies can be turned back to villagers with the god apple\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectPoison:\n\nvoid cEntityEffectPoison::OnTick(cPawn & a_Target)\n{\n\tSuper::OnTick(a_Target);\n\n\tif (a_Target.IsMob())\n\t{\n\t\tcMonster & Target = static_cast<cMonster &>(a_Target);\n\n\t\t// Doesn't effect undead mobs, spiders\n\t\tif (\n\t\t\tTarget.IsUndead() ||\n\t\t\t(Target.GetMobType() == mtSpider) ||\n\t\t\t(Target.GetMobType() == mtCaveSpider)\n\t\t)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Poison frequency = 25 ticks, divided by potion level (Poison II = 12 ticks)\n\tint frequency = std::max(1, FloorC(25.0 / static_cast<double>(m_Intensity + 1)));\n\n\tif ((m_Ticks % frequency) == 0)\n\t{\n\t\t// Cannot take poison damage when health is at 1\n\t\tif (a_Target.GetHealth() > 1)\n\t\t{\n\t\t\ta_Target.TakeDamage(dtPoisoning, nullptr, 1, 0);\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectWither:\n\nvoid cEntityEffectWither::OnTick(cPawn & a_Target)\n{\n\tSuper::OnTick(a_Target);\n\n\t// Damage frequency = 40 ticks, divided by effect level (Wither II = 20 ticks)\n\tint frequency = std::max(1, FloorC(40.0 / static_cast<double>(m_Intensity + 1)));\n\n\tif ((m_Ticks % frequency) == 0)\n\t{\n\t\ta_Target.TakeDamage(dtWither, nullptr, 1, 0);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEntityEffectSaturation:\n\nvoid cEntityEffectSaturation::OnTick(cPawn & a_Target)\n{\n\tif (a_Target.IsPlayer())\n\t{\n\t\tcPlayer & Target = static_cast<cPlayer &>(a_Target);\n\t\tTarget.SetFoodSaturationLevel(Target.GetFoodSaturationLevel() + (1 + m_Intensity));  // Increase saturation 1 per tick, adds 1 for every increase in level\n\t}\n}\n"
  },
  {
    "path": "src/Entities/EntityEffect.h",
    "content": "#pragma once\n\nclass cPawn;\n\n// tolua_begin\nclass cEntityEffect\n{\npublic:\n\n\t/** All types of entity effects (numbers correspond to protocol / storage types) */\n\tenum eType\n\t{\n\t\teffNoEffect       = 0,\n\t\teffSpeed          = 1,\n\t\teffSlowness       = 2,\n\t\teffHaste          = 3,\n\t\teffMiningFatigue  = 4,\n\t\teffStrength       = 5,\n\t\teffInstantHealth  = 6,\n\t\teffInstantDamage  = 7,\n\t\teffJumpBoost      = 8,\n\t\teffNausea         = 9,\n\t\teffRegeneration   = 10,\n\t\teffResistance     = 11,\n\t\teffFireResistance = 12,\n\t\teffWaterBreathing = 13,\n\t\teffInvisibility   = 14,\n\t\teffBlindness      = 15,\n\t\teffNightVision    = 16,\n\t\teffHunger         = 17,\n\t\teffWeakness       = 18,\n\t\teffPoison         = 19,\n\t\teffWither         = 20,\n\t\teffHealthBoost    = 21,\n\t\teffAbsorption     = 22,\n\t\teffSaturation     = 23,\n\t} ;\n\n\t/** Returns the potion color (used by the client for visuals), based on the potion's damage value */\n\tstatic int GetPotionColor(short a_ItemDamage);\n\n\n\t/** Translates the potion's damage value into the entity effect that the potion gives */\n\tstatic cEntityEffect::eType GetPotionEffectType(short a_ItemDamage);\n\n\n\t/** Retrieves the intensity level from the potion's damage value. Returns 0 for level I potions, 1 for level II potions. */\n\tstatic short GetPotionEffectIntensity(short a_ItemDamage);\n\n\n\t/** Returns the effect duration, in ticks, based on the potion's damage value */\n\tstatic int GetPotionEffectDuration(short a_ItemDamage);\n\n\t/** Returns true if the potion with the given damage is drinkable */\n\tstatic bool IsPotionDrinkable(short a_ItemDamage);\n\n\t// tolua_end\n\n\t/** Creates an empty entity effect */\n\tcEntityEffect(void);\n\n\t/** Creates an entity effect of the specified type\n\t@param a_Duration         How long this effect will last, in ticks\n\t@param a_Intensity        How strong the effect will be applied\n\t@param a_DistanceModifier The distance modifier for affecting potency, defaults to 1 */\n\tcEntityEffect(int a_Duration, short a_Intensity, double a_DistanceModifier = 1);\n\n\t/** Creates an entity effect by copying another\n\t@param a_OtherEffect      The other effect to copy */\n\tcEntityEffect(const cEntityEffect & a_OtherEffect);\n\n\t/** Creates an entity effect by copying another\n\t@param a_OtherEffect      The other effect to copy */\n\tcEntityEffect & operator =(cEntityEffect a_OtherEffect);\n\n\tvirtual ~cEntityEffect(void) = default;\n\n\t/** Creates a pointer to the proper entity effect from the effect type\n\t@warning This function creates raw pointers that must be manually managed.\n\t@param a_EffectType       The effect type to create the effect from\n\t@param a_Duration         How long this effect will last, in ticks\n\t@param a_Intensity        How strong the effect will be applied\n\t@param a_DistanceModifier The distance modifier for affecting potency, defaults to 1 */\n\tstatic std::unique_ptr<cEntityEffect> CreateEntityEffect(cEntityEffect::eType a_EffectType, int a_Duration, short a_Intensity, double a_DistanceModifier);\n\n\t/** Returns how many ticks this effect has been active for */\n\tint GetTicks(void) const { return m_Ticks; }\n\n\t/** Returns the duration of the effect */\n\tint GetDuration(void) const { return m_Duration; }\n\n\t/** Returns how strong the effect will be applied */\n\tshort GetIntensity(void) const { return m_Intensity; }\n\n\t/** Returns the distance modifier for affecting potency */\n\tdouble GetDistanceModifier(void) const { return m_DistanceModifier; }\n\n\tvoid SetTicks(int a_Ticks)                          { m_Ticks            = a_Ticks;            }\n\tvoid SetDuration(int a_Duration)                    { m_Duration         = a_Duration;         }\n\tvoid SetIntensity(short a_Intensity)                { m_Intensity        = a_Intensity;        }\n\tvoid SetDistanceModifier(double a_DistanceModifier) { m_DistanceModifier = a_DistanceModifier; }\n\n\t/** Called on each tick.\n\tBy default increases the m_Ticks, descendants may override to provide additional processing. */\n\tvirtual void OnTick(cPawn & a_Target);\n\n\t/** Called when the effect is first added to an entity */\n\tvirtual void OnActivate(cPawn & a_Target) { }\n\n\t/** Called when the effect is removed from an entity */\n\tvirtual void OnDeactivate(cPawn & a_Target) { }\n\nprotected:\n\t/** How many ticks this effect has been active for */\n\tint m_Ticks;\n\n\t/** How long this effect will last, in ticks */\n\tint m_Duration;\n\n\t/** How strong the effect will be applied */\n\tshort m_Intensity;\n\n\t/** The distance modifier for affecting potency */\n\tdouble m_DistanceModifier;\n};  // tolua_export\n\n\n\n\n\nclass cEntityEffectSpeed:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectSpeed(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\tvirtual void OnActivate(cPawn & a_Target) override;\n\n\tvirtual void OnDeactivate(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectSlowness:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectSlowness(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\tvirtual void OnActivate(cPawn & a_Target) override;\n\n\tvirtual void OnDeactivate(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectHaste:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectHaste(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectMiningFatigue:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectMiningFatigue(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectStrength:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectStrength(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectInstantHealth:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectInstantHealth(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\tvirtual void OnActivate(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectInstantDamage:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectInstantDamage(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\tvirtual void OnActivate(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectJumpBoost:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectJumpBoost(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectNausea:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectNausea(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectRegeneration:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectRegeneration(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\tvirtual void OnTick(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectResistance:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectResistance(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectFireResistance:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectFireResistance(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectWaterBreathing:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectWaterBreathing(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectInvisibility:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectInvisibility(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\tvirtual void OnActivate  (cPawn & a_Target) override { BroadcastMetadata(a_Target); }\n\tvirtual void OnDeactivate(cPawn & a_Target) override { BroadcastMetadata(a_Target); }\n\nprivate:\n\tstatic void BroadcastMetadata(cPawn & a_Target);\n};\n\n\n\n\n\nclass cEntityEffectBlindness:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectBlindness(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectNightVision:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectNightVision(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectHunger:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectHunger(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\t// cEntityEffect overrides:\n\tvirtual void OnTick(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectWeakness:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectWeakness(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\t// cEntityEffect overrides:\n\tvirtual void OnTick(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectPoison:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectPoison(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\t// cEntityEffect overrides:\n\tvirtual void OnTick(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectWither:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectWither(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\t// cEntityEffect overrides:\n\tvirtual void OnTick(cPawn & a_Target) override;\n};\n\n\n\n\n\nclass cEntityEffectHealthBoost:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectHealthBoost(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectAbsorption:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectAbsorption(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n};\n\n\n\n\n\nclass cEntityEffectSaturation:\n\tpublic cEntityEffect\n{\n\tusing Super = cEntityEffect;\n\npublic:\n\n\tcEntityEffectSaturation(int a_Duration, short a_Intensity, double a_DistanceModifier = 1):\n\t\tSuper(a_Duration, a_Intensity, a_DistanceModifier)\n\t{\n\t}\n\n\tvirtual void OnTick(cPawn & a_Target) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Entities/ExpBottleEntity.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ExpBottleEntity.h\"\n#include \"../World.h\"\n#include \"../EffectID.h\"\n\n\n\n\n\ncExpBottleEntity::cExpBottleEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed) :\n\tSuper(pkExpBottle, a_Creator, a_Pos, 0.25f, 0.25f)\n{\n\tSetSpeed(a_Speed);\n}\n\n\n\n\n\nvoid cExpBottleEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\tBreak(a_HitPos);\n}\n\n\n\n\n\nvoid cExpBottleEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tBreak(a_HitPos);\n}\n\n\n\n\n\nvoid cExpBottleEntity::Break(Vector3d a_HitPos)\n{\n\t// Spawn an experience orb with a reward between 3 and 11.\n\tm_World->BroadcastSoundParticleEffect(EffectID::PARTICLE_SPLASH_POTION, GetPosition().Floor(), 0);\n\tm_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), GetRandomProvider().RandInt(3, 11));\n\tDestroy();\n}\n"
  },
  {
    "path": "src/Entities/ExpBottleEntity.h",
    "content": "\n// ExpBottleEntity.h\n\n// Declares the cExpBottleEntity class representing the thrown exp bottle\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cExpBottleEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cExpBottleEntity)\n\n\tcExpBottleEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);\n\nprotected:\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n\tvirtual void OnHitEntity    (cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\n\t/** Breaks the bottle, fires its particle effects and sounds\n\t@param a_HitPos     The position where the bottle will break */\n\tvoid Break(Vector3d a_HitPos);\n\n};  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Entities/ExpOrb.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"ExpOrb.h\"\n#include \"Player.h\"\n#include \"../ClientHandle.h\"\n\n\ncExpOrb::cExpOrb(Vector3d a_Pos, int a_Reward):\n\tSuper(etExpOrb, a_Pos, 0.5f, 0.5f),\n\tm_Reward(a_Reward),\n\tm_Timer(0)\n{\n\tSetMaxHealth(5);\n\tSetHealth(5);\n\tSetGravity(-16);\n\tSetAirDrag(0.02f);\n}\n\n\n\n\n\nvoid cExpOrb::SpawnOn(cClientHandle & a_Client)\n{\n\ta_Client.SendExperienceOrb(*this);\n\tm_bDirtyOrientation = false;\n\tm_bDirtyHead = false;\n}\n\n\n\n\n\nvoid cExpOrb::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tDetectCacti();\n\tm_TicksAlive++;\n\n\t// Find closest player within 6.5 meter (slightly increase detect range to have same effect in client)\n\tbool FoundPlayer = m_World->DoWithNearestPlayer(GetPosition(), 6.5, [&](cPlayer & a_Player) -> bool\n\t{\n\t\tVector3f a_PlayerPos(a_Player.GetPosition());\n\t\ta_PlayerPos.y += 0.8f;\n\t\tVector3f a_Distance = a_PlayerPos - GetPosition();\n\t\tdouble Distance = a_Distance.Length();\n\n\t\tif (Distance < 0.7f)\n\t\t{\n\t\t\ta_Player.DeltaExperience(m_Reward);\n\n\t\t\tm_World->BroadcastSoundEffect(\"entity.experience_orb.pickup\", GetPosition(), 0.5f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));\n\t\t\tDestroy();\n\t\t\treturn true;\n\t\t}\n\n\t\t// Experience orb will \"float\" or glide toward the player up to a distance of 6 blocks.\n\t\t// speeding up as they get nearer to the player, Speed range 6 - 12 m per second, accelerate 60 m per second^2\n\t\tVector3d SpeedDelta(a_Distance);\n\t\tSpeedDelta.Normalize();\n\t\tSpeedDelta *= 3;\n\n\t\tVector3d CurrentSpeed = GetSpeed();\n\t\tCurrentSpeed += SpeedDelta;\n\t\tif (CurrentSpeed.Length() > 12)\n\t\t{\n\t\t\tCurrentSpeed.Normalize();\n\t\t\tCurrentSpeed *= 12;\n\t\t}\n\n\t\tSetSpeed(CurrentSpeed);\n\t\tm_Gravity = 0;\n\n\t\treturn true;\n\t}, false, true);  // Don't check line of sight, ignore spectator mode player\n\n\tif (!FoundPlayer)\n\t{\n\t\tm_Gravity = -16;\n\t}\n\n\tHandlePhysics(a_Dt, a_Chunk);\n\tBroadcastMovementUpdate();\n\n\tm_Timer += a_Dt;\n\tif (m_Timer >= std::chrono::minutes(5))\n\t{\n\t\tDestroy();\n\t}\n}\n\n\n\n\n\nbool cExpOrb::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (a_TDI.DamageType == dtCactusContact)\n\t{\n\t\tDestroy();\n\t\treturn true;\n\t}\n\n\treturn Super::DoTakeDamage(a_TDI);\n}\n\n\n\n\n\nstd::vector<int> cExpOrb::Split(int a_Reward)\n{\n\tconst static std::array<int, 11> BaseValue = {{1, 3, 7, 17, 37, 73, 149, 307, 617, 1237, 2477}};\n\n\tstd::vector<int> Rewards;\n\tsize_t Index = BaseValue.size() - 1;  // Last one\n\n\twhile (a_Reward > 0)\n\t{\n\t\twhile (a_Reward < BaseValue[Index])\n\t\t{\n\t\t\tIndex--;\n\t\t}\n\n\t\ta_Reward -= BaseValue[Index];\n\t\tRewards.push_back(BaseValue[Index]);\n\t}\n\n\treturn Rewards;\n}\n\n\n"
  },
  {
    "path": "src/Entities/ExpOrb.h",
    "content": "\n#pragma once\n\n#include \"Entity.h\"\n\n\n\n\n\n// tolua_begin\nclass cExpOrb:\n\tpublic cEntity\n{\n\t// tolua_end\n\n\tusing Super = cEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cExpOrb)\n\n\tcExpOrb(Vector3d a_Pos, int a_Reward);\n\n\t// Override functions\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\n\tvirtual void SpawnOn(cClientHandle & a_Client) override;\n\n\t// tolua_begin\n\n\t/** Returns the number of ticks that this entity has existed */\n\tint GetAge(void) const { return std::chrono::duration_cast<cTickTime>(m_Timer).count(); }\n\n\t/** Set the number of ticks that this entity has existed */\n\tvoid SetAge(int a_Age) { m_Timer = cTickTime(a_Age); }\n\n\t/** Get the exp amount */\n\tint GetReward(void) const { return m_Reward; }\n\n\t/** Set the exp amount */\n\tvoid SetReward(int a_Reward) { m_Reward = a_Reward; }\n\n\t// tolua_end\n\n\t/** Split reward into small values according to regular Minecraft rules */\n\tstatic std::vector<int> Split(int a_Reward);\n\nprotected:\n\tint m_Reward;\n\n\t/** The number of ticks that the entity has existed / timer between collect and destroy; in msec */\n\tstd::chrono::milliseconds m_Timer;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/FallingBlock.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"FallingBlock.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../ClientHandle.h\"\n#include \"../Simulator/SandSimulator.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\ncFallingBlock::cFallingBlock(Vector3d a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta):\n\tSuper(etFallingBlock, a_Position, 0.98f, 0.98f),\n\tm_BlockType(a_BlockType),\n\tm_BlockMeta(a_BlockMeta)\n{\n\tSetGravity(-16.0f);\n\tSetAirDrag(0.02f);\n}\n\n\n\n\n\nvoid cFallingBlock::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\ta_ClientHandle.SendSpawnEntity(*this);\n}\n\n\n\n\n\nvoid cFallingBlock::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\t// GetWorld()->BroadcastTeleportEntity(*this);  // Test position\n\n\tint BlockX = POSX_TOINT;\n\tint BlockY = static_cast<int>(GetPosY() - 0.5);\n\tint BlockZ = POSZ_TOINT;\n\n\tif (BlockY < 0)\n\t{\n\t\t// Fallen out of this world, just continue falling until out of sight, then destroy:\n\t\tif (BlockY < VOID_BOUNDARY)\n\t\t{\n\t\t\tDestroy();\n\t\t}\n\t\treturn;\n\t}\n\n\tif (BlockY >= cChunkDef::Height)\n\t{\n\t\t// Above the world, just wait for it to fall back down\n\t\treturn;\n\t}\n\n\tBLOCKTYPE BlockBelow = a_Chunk.GetBlock(BlockX - a_Chunk.GetPosX() * cChunkDef::Width, BlockY, BlockZ - a_Chunk.GetPosZ() * cChunkDef::Width);\n\tNIBBLETYPE BelowMeta = a_Chunk.GetMeta(BlockX - a_Chunk.GetPosX() * cChunkDef::Width, BlockY, BlockZ - a_Chunk.GetPosZ() * cChunkDef::Width);\n\tif (cSandSimulator::DoesBreakFallingThrough(BlockBelow, BelowMeta))\n\t{\n\t\t// Fallen onto a block that breaks this into pickups (e. g. half-slab)\n\t\t// Must finish the fall with coords one below the block:\n\t\tcSandSimulator::FinishFalling(m_World, BlockX, BlockY, BlockZ, m_BlockType, m_BlockMeta);\n\t\tDestroy();\n\t\treturn;\n\t}\n\telse if (!cSandSimulator::CanContinueFallThrough(BlockBelow))\n\t{\n\t\t// Fallen onto a solid block\n\t\t/*\n\t\tFLOGD(\n\t\t\t\"Sand: Checked below at {0} (rel {1}), it's {2}, finishing the fall.\",\n\t\t\tVector3i{BlockX, BlockY, BlockZ},\n\t\t\tcChunkDef::AbsoluteToRelative({BlockX, BlockY, BlockZ}, {a_Chunk.GetPosX(), a_Chunk.GetPosZ()}),\n\t\t\tItemTypeToString(BlockBelow)\n\t\t);\n\t\t*/\n\n\t\tif (BlockY < cChunkDef::Height - 1)\n\t\t{\n\t\t\tcSandSimulator::FinishFalling(m_World, BlockX, BlockY + 1, BlockZ, m_BlockType, m_BlockMeta);\n\t\t}\n\t\tDestroy();\n\t\treturn;\n\t}\n\telse if ((m_BlockType == E_BLOCK_CONCRETE_POWDER) && IsBlockWater(BlockBelow))\n\t{\n\t\t// Concrete powder falling into water solidifies on the first water it touches\n\t\tcSandSimulator::FinishFalling(m_World, BlockX, BlockY, BlockZ, E_BLOCK_CONCRETE, m_BlockMeta);\n\t\tDestroy();\n\t\treturn;\n\t}\n\n\tfloat MilliDt = a_Dt.count() * 0.001f;\n\tAddSpeedY(MilliDt * -9.8f);\n\tAddPosition(GetSpeed() * MilliDt);\n\n\t// If not static (one billionth precision) broadcast movement\n\tif ((fabs(GetSpeedX()) > std::numeric_limits<double>::epsilon()) || (fabs(GetSpeedZ()) > std::numeric_limits<double>::epsilon()))\n\t{\n\t\tBroadcastMovementUpdate();\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/Entities/FallingBlock.h",
    "content": "\n#pragma once\n\n#include \"Entity.h\"\n\n\n\n\n\n// tolua_begin\nclass cFallingBlock :\n\tpublic cEntity\n{\n\t// tolua_end\n\n\tusing Super = cEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cFallingBlock)\n\n\t/** Creates a new falling block.\n\ta_Position is expected in world coords */\n\tcFallingBlock(Vector3d a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t// tolua_begin\n\n\tBLOCKTYPE  GetBlockType(void) const { return m_BlockType; }\n\tNIBBLETYPE GetBlockMeta(void) const { return m_BlockMeta; }\n\n\t// tolua_end\n\n\t// cEntity overrides:\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\nprivate:\n\tBLOCKTYPE  m_BlockType;\n\tNIBBLETYPE m_BlockMeta;\n} ;  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Entities/FireChargeEntity.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"FireChargeEntity.h\"\n#include \"../World.h\"\n\n\n\n\n\ncFireChargeEntity::cFireChargeEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):\n\tSuper(pkFireCharge, a_Creator, a_Pos, 0.3125f, 0.3125f)\n{\n\tSetSpeed(a_Speed);\n\tSetGravity(0);\n\tSetAirDrag(0);\n}\n\n\n\n\n\nvoid cFireChargeEntity::Explode(Vector3i a_Block)\n{\n\tif (m_World->GetBlock(a_Block) == E_BLOCK_AIR)\n\t{\n\t\tm_World->SetBlock(a_Block, E_BLOCK_FIRE, 1);\n\t}\n}\n\n\n\n\n\nvoid cFireChargeEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\tDestroy();\n\tExplode(a_HitPos.Floor());\n}\n\n\n\n\n\nvoid cFireChargeEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tSuper::OnHitEntity(a_EntityHit, a_HitPos);\n\n\tDestroy();\n\tExplode(a_HitPos.Floor());\n\n\tif (!a_EntityHit.IsFireproof())\n\t{\n\t\t// TODO Damage Entity with 5 damage(from https://minecraft.wiki/w/Blaze#Blaze_fireball)\n\t\ta_EntityHit.StartBurning(5 * 20);  // 5 seconds of burning\n\t}\n}\n"
  },
  {
    "path": "src/Entities/FireChargeEntity.h",
    "content": "\n// FireChargeEntity.h\n\n// Declares the cFireChargeEntity representing the fire charge shot by the blaze\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cFireChargeEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cFireChargeEntity)\n\n\tcFireChargeEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);\n\nprotected:\n\n\tvoid Explode(Vector3i a_Block);\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\n} ;  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Entities/FireworkEntity.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"FireworkEntity.h\"\n#include \"../World.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\ncFireworkEntity::cFireworkEntity(cEntity * a_Creator, Vector3d a_Pos, const cItem & a_Item) :\n\tSuper(pkFirework, a_Creator, a_Pos, 0.25f, 0.25f),\n\tm_TicksToExplosion(a_Item.m_FireworkItem.m_FlightTimeInTicks),\n\tm_FireworkItem(a_Item)\n{\n\tSetGravity(0);\n\tSetAirDrag(0);\n}\n\n\n\n\n\nvoid cFireworkEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tint RelX = POSX_TOINT - a_Chunk.GetPosX() * cChunkDef::Width;\n\tint RelZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width;\n\tint PosY = POSY_TOINT;\n\n\tif ((PosY < 0) || (PosY >= cChunkDef::Height))\n\t{\n\t\tAddSpeedY(1);\n\t\tAddPosition(GetSpeed() * (static_cast<double>(a_Dt.count()) / 1000));\n\t\treturn;\n\t}\n\n\tif (m_IsInGround)\n\t{\n\t\tif (a_Chunk.GetBlock(RelX, POSY_TOINT + 1, RelZ) == E_BLOCK_AIR)\n\t\t{\n\t\t\tm_IsInGround = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (a_Chunk.GetBlock(RelX, POSY_TOINT + 1, RelZ) != E_BLOCK_AIR)\n\t\t{\n\t\t\tOnHitSolidBlock(GetPosition(), BLOCK_FACE_YM);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tAddSpeedY(1);\n\tAddPosition(GetSpeed() * (static_cast<double>(a_Dt.count()) / 1000));\n}\n\n\n\n\n\nvoid cFireworkEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (m_TicksToExplosion <= 0)\n\t{\n\t\t// TODO: Notify the plugins\n\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::FireworkRocketExplodes);\n\t\tDestroy();\n\t\treturn;\n\t}\n\n\tm_TicksToExplosion -= 1;\n}\n"
  },
  {
    "path": "src/Entities/FireworkEntity.h",
    "content": "\n// FireworkEntity.h\n\n// Declares the cFireworkEntity class representing the flying firework rocket\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cFireworkEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cFireworkEntity)\n\n\tcFireworkEntity(cEntity * a_Creator, Vector3d a_Pos, const cItem & a_Item);\n\n\t// tolua_begin\n\n\t/** Returns the item used to create the rocket (has all the firework effects on it) */\n\tconst cItem & GetItem(void) const { return m_FireworkItem; }\n\n\t/** Sets the item that is used to create the rocket (has all the firework effects on it) */\n\tvoid SetItem(const cItem & a_Item) { m_FireworkItem = a_Item; }\n\n\t/** Returns the number of ticks left until the firework explosion. */\n\tint GetTicksToExplosion(void) const { return m_TicksToExplosion; }\n\n\t/** Sets the number of ticks left until the firework explosion. */\n\tvoid SetTicksToExplosion(int a_TicksToExplosion) { m_TicksToExplosion = a_TicksToExplosion; }\n\n\t// tolua_end\n\nprotected:\n\n\t// cProjectileEntity overrides:\n\tvirtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\nprivate:\n\n\tint m_TicksToExplosion;\n\tcItem m_FireworkItem;\n\n};  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Entities/Floater.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"../BlockInfo.h\"\n#include \"../BoundingBox.h\"\n#include \"../Chunk.h\"\n#include \"Floater.h\"\n#include \"Player.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFloaterEntityCollisionCallback\nclass cFloaterEntityCollisionCallback\n{\npublic:\n\tcFloaterEntityCollisionCallback(cFloater * a_Floater, const Vector3d & a_Pos, const Vector3d & a_NextPos) :\n\t\tm_Floater(a_Floater),\n\t\tm_Pos(a_Pos),\n\t\tm_NextPos(a_NextPos),\n\t\tm_MinCoeff(1),\n\t\tm_HitEntity(nullptr)\n\t{\n\t}\n\tbool operator () (cEntity & a_Entity)\n\t{\n\t\tif (!a_Entity.IsMob())  // Floaters can only pull mobs not other entities.\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tauto EntBox = a_Entity.GetBoundingBox();\n\n\t\tdouble LineCoeff;\n\t\teBlockFace Face;\n\t\tEntBox.Expand(m_Floater->GetWidth() / 2, m_Floater->GetHeight() / 2, m_Floater->GetWidth() / 2);\n\t\tif (!EntBox.CalcLineIntersection(m_Pos, m_NextPos, LineCoeff, Face))\n\t\t{\n\t\t\t// No intersection whatsoever\n\t\t\treturn false;\n\t\t}\n\n\t\tif (LineCoeff < m_MinCoeff)\n\t\t{\n\t\t\t// The entity is closer than anything we've stored so far, replace it as the potential victim\n\t\t\tm_MinCoeff = LineCoeff;\n\t\t\tm_HitEntity = &a_Entity;\n\t\t}\n\n\t\t// Don't break the enumeration, we want all the entities\n\t\treturn false;\n\t}\n\n\t/** Returns the nearest entity that was hit, after the enumeration has been completed */\n\tcEntity * GetHitEntity(void) const { return m_HitEntity; }\n\n\t/** Returns true if the callback has encountered a true hit */\n\tbool HasHit(void) const { return (m_MinCoeff < 1); }\n\nprotected:\n\tcFloater * m_Floater;\n\tconst Vector3d & m_Pos;\n\tconst Vector3d & m_NextPos;\n\tdouble m_MinCoeff;  // The coefficient of the nearest hit on the Pos line\n\n\t// Although it's bad(tm) to store entity ptrs from a callback, we can afford it here, because the entire callback\n\t// is processed inside the tick thread, so the entities won't be removed in between the calls and the final processing\n\tcEntity * m_HitEntity;  // The nearest hit entity\n} ;\n\n\n\n\n\ncFloater::cFloater(Vector3d a_Pos, Vector3d a_Speed, UInt32 a_PlayerID, int a_CountDownTime) :\n\tSuper(etFloater, a_Pos, 0.25f, 0.25f),\n\tm_BitePos(a_Pos),\n\tm_CanPickupItem(false),\n\tm_PickupCountDown(0),\n\tm_CountDownTime(a_CountDownTime),\n\tm_PlayerID(a_PlayerID),\n\tm_AttachedMobID(cEntity::INVALID_ID)\n{\n\tSetSpeed(a_Speed);\n}\n\n\n\n\n\nvoid cFloater::SpawnOn(cClientHandle & a_Client)\n{\n\ta_Client.SendSpawnEntity(*this);\n}\n\n\n\n\n\nvoid cFloater::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tHandlePhysics(a_Dt, a_Chunk);\n\n\tPREPARE_REL_AND_CHUNK(GetPosition().Floor(), a_Chunk);\n\tif (!RelSuccess)\n\t{\n\t\treturn;\n\t}\n\n\tauto & Random = GetRandomProvider();\n\tif (IsBlockWater(Chunk->GetBlock(Rel)) && (Chunk->GetMeta(Rel) == 0))\n\t{\n\t\tif (!m_CanPickupItem && (m_AttachedMobID == cEntity::INVALID_ID))  // Check if you can't already pickup a fish and if the floater isn't attached to a mob.\n\t\t{\n\t\t\tif (m_CountDownTime <= 0)\n\t\t\t{\n\t\t\t\tm_BitePos = GetPosition();\n\t\t\t\tm_World->BroadcastSoundEffect(\"entity.bobber.splash\", GetPosition(), 1, 1);\n\t\t\t\tAddSpeedY(-10);\n\t\t\t\tm_CanPickupItem = true;\n\t\t\t\tm_PickupCountDown = 20;\n\t\t\t\tm_CountDownTime = Random.RandInt(100, 900);\n\t\t\t\tLOGD(\"Floater %i can be picked up\", GetUniqueID());\n\t\t\t}\n\t\t\telse if (m_CountDownTime == 20)  // Calculate the position where the particles should spawn and start producing them.\n\t\t\t{\n\t\t\t\tLOGD(\"Started producing particles for floater %i\", GetUniqueID());\n\t\t\t\tm_ParticlePos.Set(GetPosX() + Random.RandInt(-4, 4), GetPosY(), GetPosZ() + Random.RandInt(-4, 4));\n\t\t\t\tm_World->BroadcastParticleEffect(\"splash\", static_cast<Vector3f>(m_ParticlePos), Vector3f{}, 0, 15);\n\t\t\t}\n\t\t\telse if (m_CountDownTime < 20)\n\t\t\t{\n\t\t\t\tm_ParticlePos = (m_ParticlePos + (GetPosition() - m_ParticlePos) / 6);\n\t\t\t\tm_World->BroadcastParticleEffect(\"splash\", static_cast<Vector3f>(m_ParticlePos), Vector3f{}, 0, 15);\n\t\t\t}\n\n\t\t\tm_CountDownTime--;\n\t\t\tif (Chunk->IsWeatherWetAt(Rel))\n\t\t\t{\n\t\t\t\tif (Random.RandBool(0.25))  // 25% chance of an extra countdown when being rained on.\n\t\t\t\t{\n\t\t\t\t\tm_CountDownTime--;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse  // if the floater is underground it has a 50% chance of not decreasing the countdown.\n\t\t\t{\n\t\t\t\tif (Random.RandBool())\n\t\t\t\t{\n\t\t\t\t\tm_CountDownTime++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check water at the top of floater otherwise it floats into the air above the water\n\tif (\n\t\tconst auto Above = Rel.addedY(FloorC(GetPosY() + GetHeight()));\n\t\t(Above.y < cChunkDef::Height) && IsBlockWater(m_World->GetBlock(Above))\n\t)\n\t{\n\t\tSetSpeedY(0.7);\n\t}\n\n\tif (CanPickup())  // Make sure the floater \"loses its fish\"\n\t{\n\t\tm_PickupCountDown--;\n\t\tif (m_PickupCountDown == 0)\n\t\t{\n\t\t\tm_CanPickupItem = false;\n\t\t\tLOGD(\"The fish is gone. Floater %i can not pick an item up.\", GetUniqueID());\n\t\t}\n\t}\n\n\tif ((GetSpeed().Length() > 4) && (m_AttachedMobID == cEntity::INVALID_ID))\n\t{\n\t\tcFloaterEntityCollisionCallback Callback(this, GetPosition(), GetPosition() + GetSpeed() / 20);\n\n\t\ta_Chunk.ForEachEntity(Callback);\n\t\tif (Callback.HasHit())\n\t\t{\n\t\t\tAttachTo(*Callback.GetHitEntity());\n\t\t\tCallback.GetHitEntity()->TakeDamage(*this);  // TODO: the player attacked the mob not the floater.\n\t\t\tm_AttachedMobID = Callback.GetHitEntity()->GetUniqueID();\n\t\t}\n\t}\n\n\tif (!m_World->DoWithEntityByID(m_PlayerID, [](cEntity &) { return true; }))  // The owner doesn't exist anymore. Destroy the floater entity.\n\t{\n\t\tDestroy();\n\t}\n\n\tif (m_AttachedMobID != cEntity::INVALID_ID)\n\t{\n\t\tif (!m_World->DoWithEntityByID(m_AttachedMobID, [](cEntity &) { return true; }))\n\t\t{\n\t\t\t// The mob the floater was attached to doesn't exist anymore.\n\t\t\tm_AttachedMobID = cEntity::INVALID_ID;\n\t\t}\n\t}\n\n\tSetSpeedX(GetSpeedX() * 0.95);\n\tSetSpeedZ(GetSpeedZ() * 0.95);\n\n\tBroadcastMovementUpdate();\n}\n"
  },
  {
    "path": "src/Entities/Floater.h",
    "content": "\n#pragma once\n\n#include \"Entity.h\"\n\n\n\n\n\n// tolua_begin\nclass cFloater :\n\tpublic cEntity\n{\n\t// tolua_end\n\n\tusing Super = cEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cFloater)\n\n\tcFloater(Vector3d a_Pos, Vector3d a_Speed, UInt32 a_PlayerID, int a_CountDownTime);\n\n\tvirtual void SpawnOn(cClientHandle & a_Client) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\t// tolua_begin\n\tbool CanPickup(void)       const { return m_CanPickupItem; }\n\tUInt32 GetOwnerID(void)       const { return m_PlayerID; }\n\tUInt32 GetAttachedMobID(void) const { return m_AttachedMobID; }\n\tVector3d GetBitePos(void)     const { return m_BitePos; }\n\t// tolua_end\n\nprotected:\n\t// Position\n\tVector3d m_ParticlePos;\n\n\t// Position just before the floater gets pulled under by a fish\n\tVector3d m_BitePos;\n\n\t// Bool needed to check if you can get a fish.\n\tbool m_CanPickupItem;\n\n\t// Countdown times\n\tint m_PickupCountDown;\n\tint m_CountDownTime;\n\n\t// Entity IDs\n\tUInt32 m_PlayerID;\n\tUInt32 m_AttachedMobID;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/GhastFireballEntity.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"GhastFireballEntity.h\"\n#include \"../World.h\"\n\n\n\n\n\ncGhastFireballEntity::cGhastFireballEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):\n\tSuper(pkGhastFireball, a_Creator, a_Pos, 1, 1)\n{\n\tSetSpeed(a_Speed);\n\tSetGravity(0);\n\tSetAirDrag(0);\n}\n\n\n\n\n\nvoid cGhastFireballEntity::Explode(Vector3i a_Block)\n{\n\tm_World->DoExplosionAt(1, a_Block.x, a_Block.y, a_Block.z, true, esGhastFireball, this);\n}\n\n\n\n\n\nvoid cGhastFireballEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\tDestroy();\n\tExplode(a_HitPos.Floor());\n}\n\n\n\n\n\nvoid cGhastFireballEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tDestroy();\n\tExplode(a_HitPos.Floor());\n}\n"
  },
  {
    "path": "src/Entities/GhastFireballEntity.h",
    "content": "\n// GhastFireballEntity.h\n\n// Declares the cGhastFireballEntity class representing the ghast fireball in flight.\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cGhastFireballEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cGhastFireballEntity)\n\n\tcGhastFireballEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);\n\nprotected:\n\n\tvoid Explode(Vector3i a_Block);\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\n\t// TODO: Deflecting the fireballs by arrow- or sword- hits\n\n} ;  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Entities/HangingEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"HangingEntity.h\"\n#include \"BlockInfo.h\"\n#include \"Player.h\"\n#include \"Chunk.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncHangingEntity::cHangingEntity(eEntityType a_EntityType, eBlockFace a_Facing, Vector3d a_Pos) :\n\tSuper(a_EntityType, a_Pos, 0.5f, 0.5f),\n\tm_Facing(cHangingEntity::BlockFaceToProtocolFace(a_Facing))\n{\n\tSetMaxHealth(1);\n\tSetHealth(1);\n}\n\n\n\n\n\nbool cHangingEntity::IsValidSupportBlock(const BLOCKTYPE a_BlockType)\n{\n\treturn cBlockInfo::IsSolid(a_BlockType) && (a_BlockType != E_BLOCK_REDSTONE_REPEATER_OFF) && (a_BlockType != E_BLOCK_REDSTONE_REPEATER_ON);\n}\n\n\n\n\n\nvoid cHangingEntity::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\n\tDestroy();\n}\n\n\n\n\n\nvoid cHangingEntity::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\tSetYaw(GetProtocolFacing() * 90);\n}\n\n\n\n\n\nvoid cHangingEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\n\t// Check for a valid support block once every 64 ticks (3.2 seconds):\n\tif ((m_World->GetWorldTickAge() % 64_tick) != 0_tick)\n\t{\n\t\treturn;\n\t}\n\n\tBLOCKTYPE Block;\n\tconst auto SupportPosition = AddFaceDirection(cChunkDef::AbsoluteToRelative(GetPosition()), ProtocolFaceToBlockFace(m_Facing), true);\n\tif (!a_Chunk.UnboundedRelGetBlockType(SupportPosition, Block) || IsValidSupportBlock(Block))\n\t{\n\t\treturn;\n\t}\n\n\t// Take environmental damage, intending to self-destruct, with \"take damage\" handling done by child classes:\n\tTakeDamage(dtEnvironment, nullptr, static_cast<int>(GetMaxHealth()), 0);\n}\n"
  },
  {
    "path": "src/Entities/HangingEntity.h",
    "content": "\n#pragma once\n\n#include \"Entity.h\"\n\n\n\n\n\n// tolua_begin\nclass cHangingEntity :\n\tpublic cEntity\n{\n\t// tolua_end\n\n\tusing Super = cEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cHangingEntity)\n\n\tcHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, Vector3d a_Pos);\n\n\t/** Returns the direction in which the entity is facing. */\n\teBlockFace GetFacing() const { return cHangingEntity::ProtocolFaceToBlockFace(m_Facing); }  // tolua_export\n\n\t/** Returns the direction in which the entity is facing. */\n\tByte GetProtocolFacing() const { return m_Facing; }\n\n\t/** Returns if the given block can support hanging entity placements. */\n\tstatic bool IsValidSupportBlock(BLOCKTYPE a_BlockType);  // tolua_export\n\n\t/** Set the direction in which the entity is facing. */\n\tvoid SetFacing(eBlockFace a_Facing) { m_Facing = cHangingEntity::BlockFaceToProtocolFace(a_Facing); }  // tolua_export\n\n\t/** Set the direction in which the entity is facing. */\n\tvoid SetProtocolFacing(Byte a_Facing)\n\t{\n\t\tASSERT(a_Facing <= 3);\n\t\tm_Facing = a_Facing;\n\t}\n\nprotected:\n\n\tByte m_Facing;\n\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\t/** Converts protocol hanging item facing to eBlockFace values */\n\tinline static eBlockFace ProtocolFaceToBlockFace(Byte a_ProtocolFace)\n\t{\n\t\t// The client uses different values for item frame directions and block faces. Our constants are for the block faces, so we convert them here to item frame faces\n\t\tswitch (a_ProtocolFace)\n\t\t{\n\t\t\tcase 0: return BLOCK_FACE_ZP;\n\t\t\tcase 2: return BLOCK_FACE_ZM;\n\t\t\tcase 1: return BLOCK_FACE_XM;\n\t\t\tcase 3: return BLOCK_FACE_XP;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLOGINFO(\"Invalid facing (%d) in a cHangingEntity, adjusting to BLOCK_FACE_XP.\", a_ProtocolFace);\n\t\t\t\tASSERT(!\"Tried to convert a bad facing!\");\n\n\t\t\t\treturn cHangingEntity::ProtocolFaceToBlockFace(3);\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/** Converts eBlockFace values to protocol hanging item faces */\n\tinline static Byte BlockFaceToProtocolFace(eBlockFace a_BlockFace)\n\t{\n\t\t// The client uses different values for item frame directions and block faces. Our constants are for the block faces, so we convert them here to item frame faces\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_ZP: return 0;\n\t\t\tcase BLOCK_FACE_ZM: return 2;\n\t\t\tcase BLOCK_FACE_XM: return 1;\n\t\t\tcase BLOCK_FACE_XP: return 3;\n\t\t\tcase BLOCK_FACE_YP:\n\t\t\tcase BLOCK_FACE_YM:\n\t\t\tcase BLOCK_FACE_NONE:\n\t\t\t{\n\t\t\t\t// Uncomment when entities are initialised with their real data, instead of dummy values:\n\t\t\t\t// LOGINFO(\"Invalid facing (%d) in a cHangingEntity, adjusting to BLOCK_FACE_XP.\", a_BlockFace);\n\t\t\t\t// ASSERT(!\"Tried to convert a bad facing!\");\n\n\t\t\t\treturn cHangingEntity::BlockFaceToProtocolFace(BLOCK_FACE_XP);\n\t\t\t}\n\t\t}\n\t\tUNREACHABLE(\"Unsupported block face\");\n\t}\n};  // tolua_export\n"
  },
  {
    "path": "src/Entities/ItemFrame.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ItemFrame.h\"\n#include \"Player.h\"\n#include \"../ClientHandle.h\"\n#include \"Chunk.h\"\n\n\n\n\n\ncItemFrame::cItemFrame(eBlockFace a_BlockFace, Vector3d a_Pos):\n\tSuper(etItemFrame, a_BlockFace, a_Pos),\n\tm_Item(E_BLOCK_AIR),\n\tm_ItemRotation(0)\n{\n}\n\n\n\n\n\nbool cItemFrame::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\t// Take environmental or non-player damage normally:\n\tif (m_Item.IsEmpty() || (a_TDI.Attacker == nullptr) || !a_TDI.Attacker->IsPlayer())\n\t{\n\t\treturn Super::DoTakeDamage(a_TDI);\n\t}\n\n\t// Only pop out a pickup if attacked by a non-creative player:\n\tif (!static_cast<cPlayer *>(a_TDI.Attacker)->IsGameModeCreative())\n\t{\n\t\t// Where the pickup spawns, offset by half cPickup height to centre in the block.\n\t\tconst auto SpawnPosition = GetPosition().addedY(-0.125);\n\n\t\t// The direction the pickup travels to simulate a pop-out effect.\n\t\tconst auto FlyOutSpeed = AddFaceDirection(Vector3i(), ProtocolFaceToBlockFace(m_Facing)) * 2;\n\n\t\t// Spawn the frame's held item:\n\t\tGetWorld()->SpawnItemPickup(SpawnPosition, m_Item, FlyOutSpeed);\n\t}\n\n\t// In any case we have a held item and were hit by a player, so clear it:\n\tm_Item.Empty();\n\tm_ItemRotation = 0;\n\ta_TDI.FinalDamage = 0;\n\tSetInvulnerableTicks(0);\n\tGetWorld()->BroadcastEntityMetadata(*this);\n\treturn false;\n}\n\n\n\n\n\nvoid cItemFrame::GetDrops(cItems & a_Items, cEntity * a_Killer)\n{\n\tif (!m_Item.IsEmpty())\n\t{\n\t\ta_Items.push_back(m_Item);\n\t}\n\n\ta_Items.emplace_back(E_ITEM_ITEM_FRAME);\n}\n\n\n\n\n\nvoid cItemFrame::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tif (!m_Item.IsEmpty())\n\t{\n\t\t// Item not empty, rotate, clipping values to zero to seven inclusive\n\t\tm_ItemRotation++;\n\t\tif (m_ItemRotation >= 8)\n\t\t{\n\t\t\tm_ItemRotation = 0;\n\t\t}\n\t}\n\telse if (!a_Player.GetEquippedItem().IsEmpty())\n\t{\n\t\t// Item empty, and player held item not empty - add this item to self\n\t\tm_Item = a_Player.GetEquippedItem();\n\t\tm_Item.m_ItemCount = 1;\n\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t}\n\n\tGetWorld()->BroadcastEntityMetadata(*this);  // Update clients\n\tGetParentChunk()->MarkDirty();               // Mark chunk dirty to save rotation or item\n}\n\n\n\n\n\nvoid cItemFrame::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\tSuper::SpawnOn(a_ClientHandle);\n\ta_ClientHandle.SendSpawnEntity(*this);\n\ta_ClientHandle.SendEntityMetadata(*this);\n\n\tif (m_Item.m_ItemType == E_ITEM_MAP)\n\t{\n\t\tcMap * Map = GetWorld()->GetMapManager().GetMapData(static_cast<unsigned>(m_Item.m_ItemDamage));\n\t\tif (Map != nullptr)\n\t\t{\n\t\t\ta_ClientHandle.SendMapData(*Map, 0, 0);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Entities/ItemFrame.h",
    "content": "\n#pragma once\n\n#include \"HangingEntity.h\"\n\n\n\n\n\n// tolua_begin\nclass cItemFrame :\n\tpublic cHangingEntity\n{\n\t// tolua_end\n\n\tusing Super = cHangingEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cItemFrame)\n\n\tcItemFrame(eBlockFace a_BlockFace, Vector3d a_Pos);\n\n\t// tolua_begin\n\n\t/** Returns the item in the frame */\n\tconst cItem & GetItem(void) const { return m_Item; }\n\n\t/** Set the item in the frame */\n\tvoid SetItem(cItem & a_Item) { m_Item = a_Item; }\n\n\t/** Returns the rotation from the item in the frame */\n\tByte GetItemRotation(void) const { return m_ItemRotation; }\n\n\t/** Set the rotation from the item in the frame */\n\tvoid SetItemRotation(Byte a_ItemRotation) { m_ItemRotation = a_ItemRotation; }\n\n\t// tolua_end\n\nprivate:\n\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\tvirtual void GetDrops(cItems & a_Items, cEntity * a_Killer) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\n\tcItem m_Item;\n\tByte m_ItemRotation;\n\n};  // tolua_export\n"
  },
  {
    "path": "src/Entities/LeashKnot.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"LeashKnot.h\"\n#include \"Player.h\"\n#include \"../Mobs/Monster.h\"\n#include \"../BoundingBox.h\"\n#include \"../ClientHandle.h\"\n\n// Ticks to wait in Tick function to optimize calculations\n#define TICK_STEP 10\n\n\n\n\n\ncLeashKnot::cLeashKnot(eBlockFace a_BlockFace, Vector3d a_Pos) :\n\tSuper(etLeashKnot, a_BlockFace, a_Pos),\n\tm_ShouldSelfDestroy(false),\n\tm_TicksToSelfDestroy(20 * 1)\n{\n}\n\n\n\n\n\nvoid cLeashKnot::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tTiePlayersLeashedMobs(a_Player, true);\n\n\tGetWorld()->BroadcastEntityMetadata(*this);  // Update clients\n}\n\n\n\n\n\nvoid cLeashKnot::TiePlayersLeashedMobs(cPlayer & a_Player, bool a_ShouldBroadcast)\n{\n\t// Check leashed nearby mobs to tie them to this knot\n\t// taking world from player (instead from this) because this can be called before entity was initialized\n\ta_Player.GetWorld()->ForEachEntityInBox(cBoundingBox(GetPosition(), 8, 8, -4), [&](cEntity & a_Entity)\n\t\t{\n\t\t\t// If the entity is not a monster skip it\n\t\t\tif (a_Entity.GetEntityType() != cEntity::eEntityType::etMonster)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tauto & PotentialLeashed = static_cast<cMonster&>(a_Entity);\n\n\t\t\t// If can't be leashed skip it\n\t\t\tif (!PotentialLeashed.CanBeLeashed())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If it's not leashed to the player skip it\n\t\t\tif (\n\t\t\t\t!PotentialLeashed.IsLeashed() ||\n\t\t\t\t!PotentialLeashed.GetLeashedTo()->IsPlayer() ||\n\t\t\t\t(PotentialLeashed.GetLeashedTo()->GetUniqueID() != a_Player.GetUniqueID())\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// All conditions met, unleash from player and leash to fence\n\t\t\tPotentialLeashed.Unleash(false, false);\n\t\t\tPotentialLeashed.LeashTo(*this, a_ShouldBroadcast);\n\t\t\treturn false;\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cLeashKnot::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\tm_World->BroadcastSoundEffect(\"entity.leashknot.break\", GetPosition(), 1, 1);\n\tDestroy();\n}\n\n\n\n\n\nvoid cLeashKnot::GetDrops(cItems & a_Items, cEntity * a_Killer)\n{\n\tif ((a_Killer != nullptr) && a_Killer->IsPlayer() && !static_cast<cPlayer *>(a_Killer)->IsGameModeCreative())\n\t{\n\t\ta_Items.emplace_back(E_ITEM_LEASH);\n\t}\n}\n\n\n\n\n\nvoid cLeashKnot::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\tSuper::SpawnOn(a_ClientHandle);\n\ta_ClientHandle.SendSpawnEntity(*this);\n\ta_ClientHandle.SendEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cLeashKnot::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tm_TicksAlive++;\n\n\tif ((m_TicksAlive % TICK_STEP) != 0)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_ShouldSelfDestroy)\n\t{\n\t\tm_TicksToSelfDestroy -= TICK_STEP;\n\n\t\tif (m_TicksToSelfDestroy <= 0)\n\t\t{\n\t\t\tDestroy();\n\t\t\tm_World->BroadcastSoundEffect(\"entity.leashknot.break\", GetPosition(), 1, 1);\n\t\t}\n\t}\n}\n\n\n\n\n\ncLeashKnot * cLeashKnot::FindKnotAtPos(cWorldInterface & a_WorldInterface, Vector3i a_BlockPos)\n{\n\tcLeashKnot * LeashKnot = nullptr;\n\ta_WorldInterface.ForEachEntityInBox(cBoundingBox(a_BlockPos, 0.5, 1), [&](cEntity & a_Entity)\n\t\t{\n\t\t\tif (a_Entity.IsLeashKnot())\n\t\t\t{\n\t\t\t\tLeashKnot = static_cast<cLeashKnot *>(&a_Entity);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t);\n\n\treturn LeashKnot;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Entities/LeashKnot.h",
    "content": "\n#pragma once\n\n#include \"HangingEntity.h\"\n\n\nclass cWorldInterface;\n\n\n\n\n// tolua_begin\nclass cLeashKnot :\n\tpublic cHangingEntity\n{\n\t// tolua_end\n\tusing Super = cHangingEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cLeashKnot)\n\n\tcLeashKnot(eBlockFace a_BlockFace, Vector3d a_Pos);\n\n\t/** Looks for mobs leashed to a player and ties them to this knot */\n\tvoid TiePlayersLeashedMobs(cPlayer & a_Player, bool a_ShouldBroadCast);\n\n\tvoid SetShouldSelfDestroy() { m_ShouldSelfDestroy = true; }\n\n\t/** Returns the leash knot entity representing the knot at the specified position. Returns nullptr if there's no knot. */\n\tstatic cLeashKnot * FindKnotAtPos(cWorldInterface & a_WorldInterface, Vector3i a_BlockPos);\n\nprivate:\n\n\t/** When a fence is destroyed, the knot on it gets destroyed after a while. This flag turns on the countdown to self destroy. */\n\tbool m_ShouldSelfDestroy;\n\tint m_TicksToSelfDestroy;\n\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\tvirtual void GetDrops(cItems & a_Items, cEntity * a_Killer) override;\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n};  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Entities/Minecart.cpp",
    "content": "\n// Minecart.cpp\n\n// Implements the cMinecart class representing a minecart in the world\n// Handles physics when a minecart is on any type of rail (overrides simulator in Entity.cpp)\n// Indiana Jones!\n\n#include \"Globals.h\"\n#include \"ChunkDef.h\"\n#include \"Defines.h\"\n#include \"Minecart.h\"\n#include \"../BlockInfo.h\"\n#include \"../ClientHandle.h\"\n#include \"../Chunk.h\"\n#include \"Player.h\"\n#include \"../BoundingBox.h\"\n#include \"../UI/MinecartWithChestWindow.h\"\n\n#define NO_SPEED 0.0\n#define MAX_SPEED 8\n#define MAX_SPEED_NEGATIVE -MAX_SPEED\n#define DIR_NORTH_SOUTH 270\n#define DIR_EAST_WEST 180\n#define DIR_NORTH_WEST 315\n#define DIR_NORTH_EAST 225\n#define DIR_SOUTH_WEST 135\n#define DIR_SOUTH_EAST 45\n\nclass cMinecartAttachCallback\n{\npublic:\n\tcMinecartAttachCallback(cMinecart & a_Minecart, cEntity * a_Attachee) :\n\t\tm_Minecart(a_Minecart), m_Attachee(a_Attachee)\n\t{\n\t}\n\n\tbool operator()(cEntity & a_Entity)\n\t{\n\t\t// Check if minecart is empty and if given entity is a mob:\n\t\tif ((m_Attachee == nullptr) && a_Entity.IsMob())\n\t\t{\n\t\t\t// If so, attach to minecart and stop iterating:\n\t\t\ta_Entity.AttachTo(m_Minecart);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\nprotected:\n\n\tcMinecart & m_Minecart;\n\tcEntity * m_Attachee;\n};\n\n\n\n\n\nclass cMinecartCollisionCallback\n{\npublic:\n\tcMinecartCollisionCallback(Vector3d a_Pos, double a_Height, double a_Width, UInt32 a_UniqueID, UInt32 a_AttacheeUniqueID) :\n\t\tm_DoesIntersect(false),\n\t\tm_CollidedEntityPos(0, 0, 0),\n\t\tm_Pos(a_Pos),\n\t\tm_Height(a_Height),\n\t\tm_Width(a_Width),\n\t\tm_UniqueID(a_UniqueID),\n\t\tm_AttacheeUniqueID(a_AttacheeUniqueID)\n\t{\n\t}\n\n\tbool operator () (cEntity & a_Entity)\n\t{\n\t\tif (\n\t\t\t(\n\t\t\t\t!a_Entity.IsPlayer() ||\n\t\t\t\tstatic_cast<cPlayer &>(a_Entity).IsGameModeSpectator()  // Spectators doesn't collide with anything\n\t\t\t) &&\n\t\t\t!a_Entity.IsMob() &&\n\t\t\t!a_Entity.IsMinecart() &&\n\t\t\t!a_Entity.IsBoat()\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\telse if ((a_Entity.GetUniqueID() == m_UniqueID) || (a_Entity.GetUniqueID() == m_AttacheeUniqueID))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tcBoundingBox bbEntity(a_Entity.GetPosition(), a_Entity.GetWidth() / 2, a_Entity.GetHeight());\n\t\tcBoundingBox bbMinecart(Vector3d(m_Pos.x, floor(m_Pos.y), m_Pos.z), m_Width / 2, m_Height);\n\n\t\tif (bbEntity.DoesIntersect(bbMinecart))\n\t\t{\n\t\t\tm_CollidedEntityPos = a_Entity.GetPosition();\n\t\t\tm_DoesIntersect = true;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tbool FoundIntersection(void) const\n\t{\n\t\treturn m_DoesIntersect;\n\t}\n\n\tVector3d GetCollidedEntityPosition(void) const\n\t{\n\t\treturn m_CollidedEntityPos;\n\t}\n\nprotected:\n\tbool m_DoesIntersect;\n\n\tVector3d m_CollidedEntityPos;\n\n\tVector3d m_Pos;\n\tdouble m_Height, m_Width;\n\tUInt32 m_UniqueID;\n\tUInt32 m_AttacheeUniqueID;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMinecart:\n\ncMinecart::cMinecart(ePayload a_Payload, Vector3d a_Pos):\n\tSuper(etMinecart, a_Pos, 0.98f, 0.7f),\n\tm_Payload(a_Payload),\n\tm_LastDamage(0),\n\tm_DetectorRailPosition(0, 0, 0),\n\tm_bIsOnDetectorRail(false)\n{\n\tSetMass(20.0f);\n\tSetGravity(-16.0f);\n\tSetAirDrag(0.05f);\n\tSetMaxHealth(6);\n\tSetHealth(6);\n}\n\n\n\n\n\nvoid cMinecart::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\ta_ClientHandle.SendSpawnEntity(*this);\n\ta_ClientHandle.SendEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cMinecart::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tASSERT(IsTicking());\n\n\tint PosY = POSY_TOINT;\n\tif ((PosY <= 0) || (PosY >= cChunkDef::Height))\n\t{\n\t\t// Outside the world, just process normal falling physics\n\t\tSuper::HandlePhysics(a_Dt, a_Chunk);\n\t\tBroadcastMovementUpdate();\n\t\treturn;\n\t}\n\n\t// pos need floor, then call vec3i overload func\n\t// if use default double -> int, will cast -1.xx -> -1(actually need to be -2)\n\tauto relPos = cChunkDef::AbsoluteToRelative(GetPosition().Floor());\n\n\tauto chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(relPos);\n\tif (chunk == nullptr)\n\t{\n\t\t// Inside an unloaded chunk, bail out all processing\n\t\treturn;\n\t}\n\n\tif (m_bIsOnDetectorRail && !Vector3i(POSX_TOINT, POSY_TOINT, POSZ_TOINT).Equals(m_DetectorRailPosition))\n\t{\n\t\t// Check if the rail is still there\n\t\tif (m_World->GetBlock(m_DetectorRailPosition) == E_BLOCK_DETECTOR_RAIL)\n\t\t{\n\t\t\tm_World->SetBlock(m_DetectorRailPosition, E_BLOCK_DETECTOR_RAIL, m_World->GetBlockMeta(m_DetectorRailPosition) & 0x07);\n\t\t}\n\n\t\tm_bIsOnDetectorRail = false;\n\t}\n\n\tBLOCKTYPE InsideType;\n\tNIBBLETYPE InsideMeta;\n\tchunk->GetBlockTypeMeta(relPos, InsideType, InsideMeta);\n\n\tif (!IsBlockRail(InsideType))\n\t{\n\t\t// When a descending minecart hits a flat rail, it goes through the ground; check for this\n\t\tchunk->GetBlockTypeMeta(relPos.addedY(1), InsideType, InsideMeta);\n\t\tif (IsBlockRail(InsideType))\n\t\t{\n\t\t\t// Push cart upwards\n\t\t\tAddPosY(1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// When a minecart gets to a descending rail, it should go down.\n\t\t\tchunk->GetBlockTypeMeta(relPos.addedY(-1), InsideType, InsideMeta);\n\t\t\tif (IsBlockRail(InsideType))\n\t\t\t{\n\t\t\t\t// Push cart downwards\n\t\t\t\tAddPosY(-1);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (IsBlockRail(InsideType))\n\t{\n\t\tif (InsideType == E_BLOCK_RAIL)\n\t\t{\n\t\t\tSnapToRail(InsideMeta);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSnapToRail(InsideMeta & 0x07);\n\t\t}\n\n\t\tswitch (InsideType)\n\t\t{\n\t\t\tcase E_BLOCK_RAIL: HandleRailPhysics(InsideMeta, a_Dt); break;\n\t\t\tcase E_BLOCK_ACTIVATOR_RAIL: HandleActivatorRailPhysics(InsideMeta, a_Dt); break;\n\t\t\tcase E_BLOCK_POWERED_RAIL: HandlePoweredRailPhysics(InsideMeta); break;\n\t\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\t\t{\n\t\t\t\tm_DetectorRailPosition = Vector3i(POSX_TOINT, POSY_TOINT, POSZ_TOINT);\n\t\t\t\tm_bIsOnDetectorRail = true;\n\t\t\t\tHandleDetectorRailPhysics(InsideMeta, a_Dt);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: VERIFY(!\"Unhandled rail type despite checking if block was rail!\"); break;\n\t\t}\n\n\t\tAddPosition(GetSpeed() * (static_cast<double>(a_Dt.count()) / 1000));  // Commit changes; as we use our own engine when on rails, this needs to be done, whereas it is normally in Entity.cpp\n\t}\n\telse\n\t{\n\t\t// Not on rail, default physics\n\t\tSetPosY(floor(GetPosY()) + 0.35);  // HandlePhysics overrides this if minecart can fall, else, it is to stop ground clipping minecart bottom when off-rail\n\t\tSuper::HandlePhysics(a_Dt, *chunk);\n\t}\n\n\t// Enforce speed limit:\n\tm_Speed.Clamp(MAX_SPEED_NEGATIVE, MAX_SPEED);\n\n\t// Broadcast positioning changes to client\n\tBroadcastMovementUpdate();\n}\n\n\n\n\n\nvoid cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt)\n{\n\t/*\n\tNOTE: Please bear in mind that taking away from negatives make them even more negative,\n\tadding to negatives make them positive, etc.\n\t*/\n\n\tswitch (a_RailMeta)\n\t{\n\t\tcase E_META_RAIL_ZM_ZP:  // NORTHSOUTH\n\t\t{\n\t\t\tSetYaw(DIR_NORTH_SOUTH);\n\t\t\tSetPosY(floor(GetPosY()) + 0.55);\n\t\t\tSetSpeedY(NO_SPEED);  // Don't move vertically as on ground\n\t\t\tSetSpeedX(NO_SPEED);  // Correct diagonal movement from curved rails\n\n\t\t\t// Execute both the entity and block collision checks\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (GetSpeedZ() != NO_SPEED)  // Don't do anything if cart is stationary\n\t\t\t{\n\t\t\t\tif (GetSpeedZ() > 0)\n\t\t\t\t{\n\t\t\t\t\t// Going SOUTH, slow down\n\t\t\t\t\tApplyAcceleration({ 0.0, 0.0, 1.0 }, -0.1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Going NORTH, slow down\n\t\t\t\t\tApplyAcceleration({ 0.0, 0.0, -1.0 }, -0.1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_XM_XP:  // EASTWEST\n\t\t{\n\t\t\tSetYaw(DIR_EAST_WEST);\n\t\t\tSetPosY(floor(GetPosY()) + 0.55);\n\t\t\tSetSpeedY(NO_SPEED);\n\t\t\tSetSpeedZ(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (GetSpeedX() != NO_SPEED)\n\t\t\t{\n\t\t\t\tif (GetSpeedX() > 0)\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ 1.0, 0.0, 0.0 }, -0.1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ -1.0, 0.0, 0.0 }, -0.1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_ZM:  // ASCEND NORTH\n\t\t{\n\t\t\tSetYaw(DIR_NORTH_SOUTH);\n\t\t\tSetSpeedX(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (GetSpeedZ() >= 0)\n\t\t\t{\n\t\t\t\t// SpeedZ POSITIVE, going SOUTH\n\t\t\t\tAddSpeedZ(0.5);  // Speed up\n\t\t\t\tSetSpeedY(-GetSpeedZ());  // Downward movement is negative (0 minus positive numbers is negative)\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// SpeedZ NEGATIVE, going NORTH\n\t\t\t\tAddSpeedZ(1);  // Slow down\n\t\t\t\tSetSpeedY(-GetSpeedZ());  // Upward movement is positive (0 minus negative number is positive number)\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_ZP:  // ASCEND SOUTH\n\t\t{\n\t\t\tSetYaw(DIR_NORTH_SOUTH);\n\t\t\tSetSpeedX(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (GetSpeedZ() > 0)\n\t\t\t{\n\t\t\t\t// SpeedZ POSITIVE, going SOUTH\n\t\t\t\tAddSpeedZ(-1);  // Slow down\n\t\t\t\tSetSpeedY(GetSpeedZ());  // Upward movement positive\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// SpeedZ NEGATIVE, going NORTH\n\t\t\t\tAddSpeedZ(-0.5);  // Speed up\n\t\t\t\tSetSpeedY(GetSpeedZ());  // Downward movement negative\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_XM:  // ASCEND EAST\n\t\t{\n\t\t\tSetYaw(DIR_EAST_WEST);\n\t\t\tSetSpeedZ(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (GetSpeedX() >= NO_SPEED)\n\t\t\t{\n\t\t\t\tAddSpeedX(0.5);\n\t\t\t\tSetSpeedY(-GetSpeedX());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAddSpeedX(1);\n\t\t\t\tSetSpeedY(-GetSpeedX());\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_XP:  // ASCEND WEST\n\t\t{\n\t\t\tSetYaw(DIR_EAST_WEST);\n\t\t\tSetSpeedZ(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (GetSpeedX() > 0)\n\t\t\t{\n\t\t\t\tAddSpeedX(-1);\n\t\t\t\tSetSpeedY(GetSpeedX());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAddSpeedX(-0.5);\n\t\t\t\tSetSpeedY(GetSpeedX());\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZM_XM:  // Ends pointing NORTH and WEST\n\t\t{\n\t\t\tSetYaw(DIR_NORTH_WEST);  // Set correct rotation server side\n\t\t\tSetPosY(floor(GetPosY()) + 0.55);  // Levitate dat cart\n\t\t\tSetSpeedY(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// SnapToRail handles turning\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZM_XP:  // Curved NORTH EAST\n\t\t{\n\t\t\tSetYaw(DIR_NORTH_EAST);\n\t\t\tSetPosY(floor(GetPosY()) + 0.55);\n\t\t\tSetSpeedY(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZP_XM:  // Curved SOUTH WEST\n\t\t{\n\t\t\tSetYaw(DIR_SOUTH_WEST);\n\t\t\tSetPosY(floor(GetPosY()) + 0.55);\n\t\t\tSetSpeedY(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZP_XP:  // Curved SOUTH EAST\n\t\t{\n\t\t\tSetYaw(DIR_SOUTH_EAST);\n\t\t\tSetPosY(floor(GetPosY()) + 0.55);\n\t\t\tSetSpeedY(NO_SPEED);\n\n\t\t\tauto BlckCol = TestBlockCollision(a_RailMeta);\n\t\t\tauto EntCol = TestEntityCollision(a_RailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported rail meta type\");\n}\n\n\n\n\n\nvoid cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta)\n{\n\t// If the rail is powered set to speed up else slow down.\n\tconst bool IsRailPowered = ((a_RailMeta & 0x8) == 0x8);\n\tconst double Acceleration = IsRailPowered ? 1.0 : -2.0;\n\t// PoweredRail only has 5 status in low 3bit. so we need do a logical and to get correct powered rail meta data.\n\tNIBBLETYPE PoweredRailMeta = a_RailMeta & 0x7;\n\tswitch (PoweredRailMeta)\n\t{\n\t\tcase E_META_RAIL_ZM_ZP:  // NORTHSOUTH\n\t\t{\n\t\t\tSetYaw(DIR_NORTH_SOUTH);\n\t\t\tSetPosY(floor(GetPosY()) + 0.55);\n\t\t\tSetSpeedY(0);\n\t\t\tSetSpeedX(0);\n\n\t\t\tbool BlckCol = TestBlockCollision(PoweredRailMeta), EntCol = TestEntityCollision(PoweredRailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (GetSpeedZ() != NO_SPEED)\n\t\t\t{\n\t\t\t\tif (GetSpeedZ() > NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ 0.0, 0.0, 1.0 }, Acceleration);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ 0.0, 0.0, -1.0 }, Acceleration);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If rail is powered check for nearby blocks that could kick-start the minecart\n\t\t\telse if (IsRailPowered)\n\t\t\t{\n\t\t\t\tbool IsBlockZP = IsSolidBlockAtOffset(0, 0, 1);\n\t\t\t\tbool IsBlockZM = IsSolidBlockAtOffset(0, 0, -1);\n\t\t\t\t// Only kick-start the minecart if a block is on one side, but not both\n\t\t\t\tif (IsBlockZM && !IsBlockZP)\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ 0.0, 0.0, 1.0 }, Acceleration);\n\t\t\t\t}\n\t\t\t\telse if (!IsBlockZM && IsBlockZP)\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ 0.0, 0.0, -1.0 }, Acceleration);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_XM_XP:  // EASTWEST\n\t\t{\n\t\t\tSetYaw(DIR_EAST_WEST);\n\t\t\tSetPosY(floor(GetPosY()) + 0.55);\n\t\t\tSetSpeedY(NO_SPEED);\n\t\t\tSetSpeedZ(NO_SPEED);\n\n\t\t\tbool BlckCol = TestBlockCollision(PoweredRailMeta), EntCol = TestEntityCollision(PoweredRailMeta);\n\t\t\tif (EntCol || BlckCol)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (GetSpeedX() != NO_SPEED)\n\t\t\t{\n\t\t\t\tif (GetSpeedX() > NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ 1.0, 0.0, 0.0 }, Acceleration);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ -1.0, 0.0, 0.0 }, Acceleration);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If rail is powered check for nearby blocks that could kick-start the minecart\n\t\t\telse if (IsRailPowered)\n\t\t\t{\n\t\t\t\tbool IsBlockXP = IsSolidBlockAtOffset(1, 0, 0);\n\t\t\t\tbool IsBlockXM = IsSolidBlockAtOffset(-1, 0, 0);\n\t\t\t\t// Only kick-start the minecart if a block is on one side, but not both\n\t\t\t\tif (IsBlockXM && !IsBlockXP)\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ 1.0, 0.0, 0.0 }, Acceleration);\n\t\t\t\t}\n\t\t\t\telse if (!IsBlockXM && IsBlockXP)\n\t\t\t\t{\n\t\t\t\t\tApplyAcceleration({ -1.0, 0.0, 0.0 }, Acceleration);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_XM:  // ASCEND EAST\n\t\t{\n\t\t\tSetYaw(DIR_EAST_WEST);\n\t\t\tSetSpeedZ(NO_SPEED);\n\n\t\t\tif (GetSpeedX() >= NO_SPEED)\n\t\t\t{\n\t\t\t\tApplyAcceleration({ 1.0, 0.0, 0.0 }, Acceleration);\n\t\t\t\tSetSpeedY(-GetSpeedX());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tApplyAcceleration({ -1.0, 0.0, 0.0 }, Acceleration);\n\t\t\t\tSetSpeedY(-GetSpeedX());\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_XP:  // ASCEND WEST\n\t\t{\n\t\t\tSetYaw(DIR_EAST_WEST);\n\t\t\tSetSpeedZ(NO_SPEED);\n\n\t\t\tif (GetSpeedX() > NO_SPEED)\n\t\t\t{\n\t\t\t\tApplyAcceleration({ 1.0, 0.0, 0.0 }, Acceleration);\n\t\t\t\tSetSpeedY(GetSpeedX());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tApplyAcceleration({ -1.0, 0.0, 0.0 }, Acceleration);\n\t\t\t\tSetSpeedY(GetSpeedX());\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_ZM:  // ASCEND NORTH\n\t\t{\n\t\t\tSetYaw(DIR_NORTH_SOUTH);\n\t\t\tSetSpeedX(NO_SPEED);\n\n\t\t\tif (GetSpeedZ() >= NO_SPEED)\n\t\t\t{\n\t\t\t\tApplyAcceleration({ 0.0, 0.0, 1.0 }, Acceleration);\n\t\t\t\tSetSpeedY(-GetSpeedZ());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tApplyAcceleration({ 0.0, 0.0, -1.0 }, Acceleration);\n\t\t\t\tSetSpeedY(-GetSpeedZ());\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_ZP:  // ASCEND SOUTH\n\t\t{\n\t\t\tSetYaw(DIR_NORTH_SOUTH);\n\t\t\tSetSpeedX(NO_SPEED);\n\n\t\t\tif (GetSpeedZ() > NO_SPEED)\n\t\t\t{\n\t\t\t\tApplyAcceleration({ 0.0, 0.0, 1.0 }, Acceleration);\n\t\t\t\tSetSpeedY(GetSpeedZ());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tApplyAcceleration({ 0.0, 0.0, -1.0 }, Acceleration);\n\t\t\t\tSetSpeedY(GetSpeedZ());\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: ASSERT(!\"Unhandled powered rail metadata!\"); break;\n\t}\n}\n\n\n\n\n\nvoid cMinecart::HandleDetectorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt)\n{\n\tm_World->SetBlockMeta(m_DetectorRailPosition, a_RailMeta | 0x08);\n\n\t// No special handling\n\tHandleRailPhysics(a_RailMeta & 0x07, a_Dt);\n}\n\n\n\n\n\nvoid cMinecart::HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt)\n{\n\tHandleRailPhysics(a_RailMeta & 0x07, a_Dt);\n\t// TODO - shake minecart, throw entities out\n}\n\n\n\n\n\nvoid cMinecart::SnapToRail(NIBBLETYPE a_RailMeta)\n{\n\tswitch (a_RailMeta)\n\t{\n\t\tcase E_META_RAIL_ASCEND_XM:\n\t\tcase E_META_RAIL_ASCEND_XP:\n\t\tcase E_META_RAIL_XM_XP:\n\t\t{\n\t\t\tSetSpeedZ(NO_SPEED);\n\t\t\tSetPosZ(floor(GetPosZ()) + 0.5);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_ZM:\n\t\tcase E_META_RAIL_ASCEND_ZP:\n\t\tcase E_META_RAIL_ZM_ZP:\n\t\t{\n\t\t\tSetSpeedX(NO_SPEED);\n\t\t\tSetPosX(floor(GetPosX()) + 0.5);\n\t\t\tbreak;\n\t\t}\n\t\t// Curved rail physics: once minecart has reached more than half of the block in the direction that it is travelling in, jerk it in the direction of curvature\n\t\tcase E_META_RAIL_CURVED_ZM_XM:\n\t\t{\n\t\t\tif (GetPosZ() > floor(GetPosZ()) + 0.5)\n\t\t\t{\n\t\t\t\tif (GetSpeedZ() > NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tSetSpeedX(-GetSpeedZ() * 0.7);\n\t\t\t\t}\n\n\t\t\t\tSetSpeedZ(NO_SPEED);\n\t\t\t\tSetPosZ(floor(GetPosZ()) + 0.5);\n\t\t\t}\n\t\t\telse if (GetPosX() > floor(GetPosX()) + 0.5)\n\t\t\t{\n\t\t\t\tif (GetSpeedX() > 0)\n\t\t\t\t{\n\t\t\t\t\tSetSpeedZ(-GetSpeedX() * 0.7);\n\t\t\t\t}\n\n\t\t\t\tSetSpeedX(NO_SPEED);\n\t\t\t\tSetPosX(floor(GetPosX()) + 0.5);\n\t\t\t}\n\t\t\tSetSpeedY(NO_SPEED);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZM_XP:\n\t\t{\n\t\t\tif (GetPosZ() > floor(GetPosZ()) + 0.5)\n\t\t\t{\n\t\t\t\tif (GetSpeedZ() > NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tSetSpeedX(GetSpeedZ() * 0.7);\n\t\t\t\t}\n\n\t\t\t\tSetSpeedZ(NO_SPEED);\n\t\t\t\tSetPosZ(floor(GetPosZ()) + 0.5);\n\t\t\t}\n\t\t\telse if (GetPosX() < floor(GetPosX()) + 0.5)\n\t\t\t{\n\t\t\t\tif (GetSpeedX() < NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tSetSpeedZ(GetSpeedX() * 0.7);\n\t\t\t\t}\n\n\t\t\t\tSetSpeedX(NO_SPEED);\n\t\t\t\tSetPosX(floor(GetPosX()) + 0.5);\n\t\t\t}\n\t\t\tSetSpeedY(NO_SPEED);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZP_XM:\n\t\t{\n\t\t\tif (GetPosZ() < floor(GetPosZ()) + 0.5)\n\t\t\t{\n\t\t\t\tif (GetSpeedZ() < NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tSetSpeedX(GetSpeedZ() * 0.7);\n\t\t\t\t}\n\n\t\t\t\tSetSpeedZ(NO_SPEED);\n\t\t\t\tSetPosZ(floor(GetPosZ()) + 0.5);\n\t\t\t}\n\t\t\telse if (GetPosX() > floor(GetPosX()) + 0.5)\n\t\t\t{\n\t\t\t\tif (GetSpeedX() > NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tSetSpeedZ(GetSpeedX() * 0.7);\n\t\t\t\t}\n\n\t\t\t\tSetSpeedX(NO_SPEED);\n\t\t\t\tSetPosX(floor(GetPosX()) + 0.5);\n\t\t\t}\n\t\t\tSetSpeedY(NO_SPEED);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZP_XP:\n\t\t{\n\t\t\tif (GetPosZ() < floor(GetPosZ()) + 0.5)\n\t\t\t{\n\t\t\t\tif (GetSpeedZ() < NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tSetSpeedX(-GetSpeedZ() * 0.7);\n\t\t\t\t}\n\n\t\t\t\tSetSpeedZ(NO_SPEED);\n\t\t\t\tSetPosZ(floor(GetPosZ()) + 0.5);\n\t\t\t}\n\t\t\telse if (GetPosX() < floor(GetPosX()) + 0.5)\n\t\t\t{\n\t\t\t\tif (GetSpeedX() < NO_SPEED)\n\t\t\t\t{\n\t\t\t\t\tSetSpeedZ(-GetSpeedX() * 0.7);\n\t\t\t\t}\n\n\t\t\t\tSetSpeedX(NO_SPEED);\n\t\t\t\tSetPosX(floor(GetPosX()) + 0.5);\n\t\t\t}\n\t\t\tSetSpeedY(0);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: break;\n\t}\n}\n\n\n\n\n\nbool cMinecart::IsSolidBlockAtPosition(Vector3i a_Pos)\n{\n\tBLOCKTYPE Block = m_World->GetBlock(a_Pos);\n\treturn !IsBlockRail(Block) && cBlockInfo::IsSolid(Block);\n}\n\n\n\n\n\nbool cMinecart::IsSolidBlockAtOffset(int a_XOffset, int a_YOffset, int a_ZOffset)\n{\n\treturn IsSolidBlockAtPosition({POSX_TOINT + a_XOffset, POSY_TOINT + a_YOffset, POSZ_TOINT + a_ZOffset});\n}\n\n\n\n\n\nbool cMinecart::IsBlockCollisionAtOffset(Vector3i a_Offset)\n{\n\tauto BlockPosition = GetPosition().Floor() + a_Offset;\n\tif (!IsSolidBlockAtPosition(BlockPosition))\n\t{\n\t\treturn false;\n\t}\n\n\tauto bbBlock = cBoundingBox(\n\t\tstatic_cast<Vector3d>(BlockPosition),\n\t\tstatic_cast<Vector3d>(BlockPosition + Vector3i(1, 1, 1))\n\t);\n\n\treturn GetBoundingBox().DoesIntersect(bbBlock);\n}\n\n\n\n\n\nbool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)\n{\n\tauto SpeedX = GetSpeedX();\n\tauto SpeedZ = GetSpeedZ();\n\n\t// Don't do anything if minecarts aren't moving.\n\t#ifdef __clang__\n\t\t#pragma clang diagnostic push\n\t\t#pragma clang diagnostic ignored \"-Wfloat-equal\"\n\t#endif\n\n\tif ((SpeedX == 0) && (SpeedZ == 0))\n\t{\n\t\treturn false;\n\t}\n\n\t#ifdef __clang__\n\t\t#pragma clang diagnostic pop\n\t#endif\n\n\tauto StopTheCart = true;\n\tauto StopOffset = Vector3d();\n\n\tswitch (a_RailMeta)\n\t{\n\t\tcase E_META_RAIL_ZM_ZP:\n\t\t{\n\t\t\tif (SpeedZ > 0)\n\t\t\t{\n\t\t\t\tStopOffset = Vector3d(0, 0, 0.4);\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 0, 1});\n\t\t\t}\n\t\t\telse  // SpeedZ < 0\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 0, -1});\n\t\t\t\tStopOffset = Vector3d(0, 0, 0.65);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_XM_XP:\n\t\t{\n\t\t\tif (SpeedX > 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({1, 0, 0});\n\t\t\t\tStopOffset = Vector3d(0.4, 0, 0);\n\t\t\t}\n\t\t\telse  // SpeedX < 0\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({-1, 0, 0});\n\t\t\t\tStopOffset = Vector3d(0.65, 0, 0);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Ascending rails check for one block on the way up, two on the way down.\n\t\tcase E_META_RAIL_ASCEND_XM:\n\t\t{\n\t\t\tStopOffset = Vector3d(0.5, 0, 0);\n\n\t\t\tif (SpeedX < 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({-1, 1, 0});\n\t\t\t}\n\t\t\telse  // SpeedX > 0\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({1, 0, 0}) || IsBlockCollisionAtOffset({1, 1, 0});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_XP:\n\t\t{\n\t\t\tStopOffset = Vector3d(0.5, 0, 0);\n\n\t\t\tif (SpeedX > 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({1, 1, 0});\n\t\t\t}\n\t\t\telse  // SpeedX < 0\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({-1, 0, 0}) || IsBlockCollisionAtOffset({-1, 1, 0});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_ZM:\n\t\t{\n\t\t\tStopOffset = Vector3d(0, 0, 0.5);\n\n\t\t\tif (SpeedZ < 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 1, -1});\n\t\t\t}\n\t\t\telse  // SpeedZ > 0\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 0, 1}) || IsBlockCollisionAtOffset({0, 1, 1});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_ASCEND_ZP:\n\t\t{\n\t\t\tStopOffset = Vector3d(0, 0, 0.5);\n\n\t\t\tif (SpeedZ > 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 1, 1});\n\t\t\t}\n\t\t\telse  // SpeedZ < 0\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 0, -1}) || IsBlockCollisionAtOffset({0, 1, -1});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Curved rails allow movement across both the x and z axes. But when the cart is\n\t\t// moving towards one of the rail endpoints, it will always have velocity towards\n\t\t// the direction of that endpoint in the same axis.\n\t\tcase E_META_RAIL_CURVED_ZP_XP:\n\t\t{\n\t\t\tStopOffset = Vector3d(0.5, 0, 0.5);\n\n\t\t\tif (SpeedZ > 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 0, 1});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (SpeedX > 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({1, 0, 0});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZP_XM:\n\t\t{\n\t\t\tStopOffset = Vector3d(0.5, 0, 0.5);\n\n\t\t\tif (SpeedZ > 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 0, 1});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (SpeedX < 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({-1, 0, 0});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZM_XM:\n\t\t{\n\t\t\tStopOffset = Vector3d(0.5, 0, 0.5);\n\n\t\t\tif (SpeedZ < 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 0, -1});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (SpeedX < 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({-1, 0, 0});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZM_XP:\n\t\t{\n\t\t\tStopOffset = Vector3d(0.5, 0, 0.5);\n\n\t\t\tif (SpeedZ < 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({0, 0, -1});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (SpeedX > 0)\n\t\t\t{\n\t\t\t\tStopTheCart = IsBlockCollisionAtOffset({1, 0, 0});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (StopTheCart)\n\t{\n\t\tSetSpeed(0, 0, 0);\n\n\t\t#ifdef __clang__\n\t\t\t#pragma clang diagnostic push\n\t\t\t#pragma clang diagnostic ignored \"-Wfloat-equal\"\n\t\t#endif\n\n\t\tif (StopOffset.x != 0)\n\t\t{\n\t\t\tSetPosX(POSX_TOINT + StopOffset.x);\n\t\t}\n\t\tif (StopOffset.z != 0)\n\t\t{\n\t\t\tSetPosZ(POSZ_TOINT + StopOffset.z);\n\t\t}\n\n\t\t#ifdef __clang__\n\t\t\t#pragma clang diagnostic pop\n\t\t#endif\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nbool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)\n{\n\tcMinecartCollisionCallback MinecartCollisionCallback(\n\t\tGetPosition(), GetHeight(), GetWidth(), GetUniqueID(),\n\t\t((m_Attachee == nullptr) ? cEntity::INVALID_ID : m_Attachee->GetUniqueID())\n\t);\n\tint ChunkX, ChunkZ;\n\tcChunkDef::BlockToChunk(POSX_TOINT, POSZ_TOINT, ChunkX, ChunkZ);\n\tm_World->ForEachEntityInChunk(ChunkX, ChunkZ, MinecartCollisionCallback);\n\n\tif (!MinecartCollisionCallback.FoundIntersection())\n\t{\n\t\treturn false;\n\t}\n\n\t// Collision was true, create bounding box for minecart, call attach callback for all entities within that box\n\tcMinecartAttachCallback MinecartAttachCallback(*this, m_Attachee);\n\tVector3d MinecartPosition = GetPosition();\n\tcBoundingBox bbMinecart(Vector3d(MinecartPosition.x, floor(MinecartPosition.y), MinecartPosition.z), GetWidth() / 2, GetHeight());\n\tm_World->ForEachEntityInBox(bbMinecart, MinecartAttachCallback);\n\n\tswitch (a_RailMeta)\n\t{\n\t\tcase E_META_RAIL_ZM_ZP:\n\t\t{\n\t\t\tif (MinecartCollisionCallback.GetCollidedEntityPosition().z >= GetPosZ())\n\t\t\t{\n\t\t\t\tif (GetSpeedZ() > 0)  // True if minecart is moving into the direction of the entity\n\t\t\t\t{\n\t\t\t\t\tSetSpeedZ(0);  // Entity handles the pushing\n\t\t\t\t}\n\t\t\t}\n\t\t\telse  // if (MinecartCollisionCallback.GetCollidedEntityPosition().z < GetPosZ())\n\t\t\t{\n\t\t\t\tif (GetSpeedZ() < 0)  // True if minecart is moving into the direction of the entity\n\t\t\t\t{\n\t\t\t\t\tSetSpeedZ(0);  // Entity handles the pushing\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tcase E_META_RAIL_XM_XP:\n\t\t{\n\t\t\tif (MinecartCollisionCallback.GetCollidedEntityPosition().x >= GetPosX())\n\t\t\t{\n\t\t\t\tif (GetSpeedX() > 0)  // True if minecart is moving into the direction of the entity\n\t\t\t\t{\n\t\t\t\t\tSetSpeedX(0);  // Entity handles the pushing\n\t\t\t\t}\n\t\t\t}\n\t\t\telse  // if (MinecartCollisionCallback.GetCollidedEntityPosition().x < GetPosX())\n\t\t\t{\n\t\t\t\tif (GetSpeedX() < 0)  // True if minecart is moving into the direction of the entity\n\t\t\t\t{\n\t\t\t\t\tSetSpeedX(0);  // Entity handles the pushing\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZM_XM:\n\t\tcase E_META_RAIL_CURVED_ZP_XP:\n\t\t{\n\t\t\tVector3d Distance = MinecartCollisionCallback.GetCollidedEntityPosition() - Vector3d(GetPosX(), 0, GetPosZ());\n\n\t\t\t// Prevent division by small numbers\n\t\t\tif (std::abs(Distance.z) < 0.001)\n\t\t\t{\n\t\t\t\tDistance.z = 0.001;\n\t\t\t}\n\n\t\t\t/* Check to which side the minecart is to be pushed.\n\t\t\tLet's consider a z-x-coordinate system where the minecart is the center (0, 0).\n\t\t\tThe minecart moves along the line x = -z, the perpendicular line to this is x = z.\n\t\t\tIn order to decide to which side the minecart is to be pushed, it must be checked on what side of the perpendicular line the pushing entity is located. */\n\t\t\tif (\n\t\t\t\t((Distance.z > 0) && ((Distance.x / Distance.z) >= 1)) ||\n\t\t\t\t((Distance.z < 0) && ((Distance.x / Distance.z) <= 1))\n\t\t\t)\n\t\t\t{\n\t\t\t\t// Moving -X +Z\n\t\t\t\tif ((-GetSpeedX() * 0.4 / sqrt(2.0)) < 0.01)\n\t\t\t\t{\n\t\t\t\t\t// ~ SpeedX >= 0 Immobile or not moving in the \"right\" direction. Give it a bump!\n\t\t\t\t\tAddSpeedX(-4 / sqrt(2.0));\n\t\t\t\t\tAddSpeedZ(4 / sqrt(2.0));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// ~ SpeedX < 0 Moving in the \"right\" direction. Only accelerate it a bit.\n\t\t\t\t\tSetSpeedX(GetSpeedX() * 0.4 / sqrt(2.0));\n\t\t\t\t\tSetSpeedZ(GetSpeedZ() * 0.4 / sqrt(2.0));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ((GetSpeedX() * 0.4 / sqrt(2.0)) < 0.01)\n\t\t\t{\n\t\t\t\t// Moving +X -Z\n\t\t\t\t// ~ SpeedX <= 0 Immobile or not moving in the \"right\" direction\n\t\t\t\tAddSpeedX(4 / sqrt(2.0));\n\t\t\t\tAddSpeedZ(-4 / sqrt(2.0));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// ~ SpeedX > 0 Moving in the \"right\" direction\n\t\t\t\tSetSpeedX(GetSpeedX() * 0.4 / sqrt(2.0));\n\t\t\t\tSetSpeedZ(GetSpeedZ() * 0.4 / sqrt(2.0));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_RAIL_CURVED_ZM_XP:\n\t\tcase E_META_RAIL_CURVED_ZP_XM:\n\t\t{\n\t\t\tVector3d Distance = MinecartCollisionCallback.GetCollidedEntityPosition() - Vector3d(GetPosX(), 0, GetPosZ());\n\n\t\t\t// Prevent division by small numbers\n\t\t\tif (std::abs(Distance.z) < 0.001)\n\t\t\t{\n\t\t\t\tDistance.z = 0.001;\n\t\t\t}\n\n\t\t\t/* Check to which side the minecart is to be pushed.\n\t\t\tLet's consider a z-x-coordinate system where the minecart is the center (0, 0).\n\t\t\tThe minecart moves along the line x = z, the perpendicular line to this is x = -z.\n\t\t\tIn order to decide to which side the minecart is to be pushed, it must be checked on what side of the perpendicular line the pushing entity is located. */\n\t\t\tif (\n\t\t\t\t((Distance.z > 0) && ((Distance.x / Distance.z) <= -1)) ||\n\t\t\t\t((Distance.z < 0) && ((Distance.x / Distance.z) >= -1))\n\t\t\t)\n\t\t\t{\n\t\t\t\t// Moving +X +Z\n\t\t\t\tif ((GetSpeedX() * 0.4) < 0.01)\n\t\t\t\t{\n\t\t\t\t\t// ~ SpeedX <= 0 Immobile or not moving in the \"right\" direction\n\t\t\t\t\tAddSpeedX(4 / sqrt(2.0));\n\t\t\t\t\tAddSpeedZ(4 / sqrt(2.0));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// ~ SpeedX > 0 Moving in the \"right\" direction\n\t\t\t\t\tSetSpeedX(GetSpeedX() * 0.4 / sqrt(2.0));\n\t\t\t\t\tSetSpeedZ(GetSpeedZ() * 0.4 / sqrt(2.0));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ((-GetSpeedX() * 0.4) < 0.01)\n\t\t\t{\n\t\t\t\t// Moving -X -Z\n\t\t\t\t// ~ SpeedX >= 0 Immobile or not moving in the \"right\" direction\n\t\t\t\tAddSpeedX(-4 / sqrt(2.0));\n\t\t\t\tAddSpeedZ(-4 / sqrt(2.0));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// ~ SpeedX < 0 Moving in the \"right\" direction\n\t\t\t\tSetSpeedX(GetSpeedX() * 0.4 / sqrt(2.0));\n\t\t\t\tSetSpeedZ(GetSpeedZ() * 0.4 / sqrt(2.0));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: break;\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nbool cMinecart::DoTakeDamage(TakeDamageInfo & TDI)\n{\n\tif ((TDI.Attacker != nullptr) && TDI.Attacker->IsPlayer() && static_cast<cPlayer *>(TDI.Attacker)->IsGameModeCreative())\n\t{\n\t\tTDI.FinalDamage = GetMaxHealth();  // Instant hit for creative\n\t\tSetInvulnerableTicks(0);\n\t\treturn Super::DoTakeDamage(TDI);  // No drops for creative\n\t}\n\n\tm_LastDamage = static_cast<int>(TDI.FinalDamage);\n\tif (!Super::DoTakeDamage(TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n\n\treturn true;\n}\n\n\n\n\n\nvoid cMinecart::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\n\tDestroy();\n}\n\n\n\n\n\nvoid cMinecart::OnRemoveFromWorld(cWorld & a_World)\n{\n\tif (m_bIsOnDetectorRail)\n\t{\n\t\tm_World->SetBlock(m_DetectorRailPosition, E_BLOCK_DETECTOR_RAIL, m_World->GetBlockMeta(m_DetectorRailPosition) & 0x07);\n\t}\n\n\tSuper::OnRemoveFromWorld(a_World);\n}\n\n\n\n\n\nvoid cMinecart::HandleSpeedFromAttachee(float a_Forward, float a_Sideways)\n{\n\t// limit normal minecart speed max lower than 4\n\t// once speed is higher than 4, no more add speed.\n\tif (GetSpeed().Length() > 4)\n\t{\n\t\treturn;\n\t}\n\tVector3d LookVector = m_Attachee->GetLookVector();\n\tVector3d ToAddSpeed = LookVector * (a_Forward * 0.4) ;\n\tToAddSpeed.y = 0;\n\tAddSpeed(ToAddSpeed);\n}\n\n\n\n\n\nvoid cMinecart::ApplyAcceleration(Vector3d a_ForwardDirection, double a_Acceleration)\n{\n\tdouble CurSpeed = GetSpeed().Dot(a_ForwardDirection);\n\tdouble NewSpeed = CurSpeed + a_Acceleration;\n\n\tif (NewSpeed < 0.0)\n\t{\n\t\t// Prevent deceleration from turning the minecart around.\n\t\tNewSpeed = 0.0;\n\t}\n\n\tauto Acceleration = a_ForwardDirection * (NewSpeed - CurSpeed);\n\n\tAddSpeed(Acceleration);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRideableMinecart:\n\ncRideableMinecart::cRideableMinecart(Vector3d a_Pos, const cItem & a_Content, int a_ContentHeight):\n\tSuper(mpNone, a_Pos),\n\tm_Content(a_Content),\n\tm_ContentHeight(a_ContentHeight)\n{\n}\n\n\n\n\n\nvoid cRideableMinecart::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\ta_Drops.emplace_back(E_ITEM_MINECART);\n}\n\n\n\n\n\nvoid cRideableMinecart::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tif (m_Attachee != nullptr)\n\t{\n\t\tif (m_Attachee->GetUniqueID() == a_Player.GetUniqueID())\n\t\t{\n\t\t\t// This player is already sitting in, they want out.\n\t\t\ta_Player.Detach();\n\t\t\treturn;\n\t\t}\n\n\t\tif (m_Attachee->IsPlayer())\n\t\t{\n\t\t\t// Another player is already sitting in here, cannot attach\n\t\t\treturn;\n\t\t}\n\n\t\t// Detach whatever is sitting in this minecart now:\n\t\tm_Attachee->Detach();\n\t}\n\n\t// Attach the player to this minecart:\n\ta_Player.AttachTo(*this);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMinecartWithChest:\n\ncMinecartWithChest::cMinecartWithChest(Vector3d a_Pos):\n\tSuper(mpChest, a_Pos),\n\tcEntityWindowOwner(this),\n\tm_Contents(ContentsWidth, ContentsHeight)\n{\n\tm_Contents.AddListener(*this);\n}\n\n\n\n\n\nvoid cMinecartWithChest::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tm_Contents.CopyToItems(a_Drops);\n\ta_Drops.emplace_back(E_ITEM_CHEST_MINECART);\n}\n\n\n\n\n\nvoid cMinecartWithChest::OnRemoveFromWorld(cWorld & a_World)\n{\n\tconst auto Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\tWindow->OwnerDestroyed();\n\t}\n\n\tSuper::OnRemoveFromWorld(a_World);\n}\n\n\n\n\n\nvoid cMinecartWithChest::OnRightClicked(cPlayer & a_Player)\n{\n\t// If the window is not created, open it anew:\n\tcWindow * Window = GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tOpenNewWindow();\n\t\tWindow = GetWindow();\n\t}\n\n\t// Open the window for the player:\n\tif (Window != nullptr)\n\t{\n\t\tif (a_Player.GetWindow() != Window)\n\t\t{\n\t\t\ta_Player.OpenWindow(*Window);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMinecartWithChest::OpenNewWindow()\n{\n\tOpenWindow(new cMinecartWithChestWindow(this));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMinecartWithFurnace:\n\ncMinecartWithFurnace::cMinecartWithFurnace(Vector3d a_Pos):\n\tSuper(mpFurnace, a_Pos),\n\tm_FueledTimeLeft(-1),\n\tm_IsFueled(false)\n{\n}\n\n\n\n\n\nvoid cMinecartWithFurnace::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\ta_Drops.emplace_back(E_ITEM_FURNACE_MINECART);\n}\n\n\n\n\n\nvoid cMinecartWithFurnace::OnRightClicked(cPlayer & a_Player)\n{\n\tif (a_Player.GetEquippedItem().m_ItemType == E_ITEM_COAL)\n\t{\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t\tif (!m_IsFueled)  // We don't want to change the direction by right clicking it.\n\t\t{\n\t\t\tAddSpeed(a_Player.GetLookVector().x, 0, a_Player.GetLookVector().z);\n\t\t}\n\t\tm_IsFueled = true;\n\t\tm_FueledTimeLeft = m_FueledTimeLeft + 600;  // The minecart will be active 600 more ticks.\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n}\n\n\n\n\n\nvoid cMinecartWithFurnace::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (m_IsFueled)\n\t{\n\t\tm_FueledTimeLeft--;\n\t\tif (m_FueledTimeLeft < 0)\n\t\t{\n\t\t\tm_IsFueled = false;\n\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t\treturn;\n\t\t}\n\n\t\tif (GetSpeed().Length() > 6)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tAddSpeed(GetSpeed() / 4);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMinecartWithTNT:\n\ncMinecartWithTNT::cMinecartWithTNT(Vector3d a_Pos):\n\tSuper(mpTNT, a_Pos)\n{\n}\n\n\n\n\n\nvoid cMinecartWithTNT::HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt)\n{\n\tSuper::HandleActivatorRailPhysics(a_RailMeta, a_Dt);\n\n\tif ((a_RailMeta & 0x08) && !m_isTNTFused)\n\t{\n\t\tm_isTNTFused = true;\n\t\tm_TNTFuseTicksLeft = 80;\n\t\tm_World->BroadcastSoundEffect(\"entity.tnt.primed\", GetPosition(), 1.0f, 1.0f);\n\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::MinecartTNTIgnites);\n\t}\n}\n\n\n\n\n\nvoid cMinecartWithTNT::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\ta_Drops.emplace_back(E_ITEM_MINECART_WITH_TNT);\n}\n\n\n\n\n\nvoid cMinecartWithTNT::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\treturn;\n\t}\n\n\tif (m_isTNTFused)\n\t{\n\t\tif (m_TNTFuseTicksLeft > 0)\n\t\t{\n\t\t\t--m_TNTFuseTicksLeft;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDestroy();\n\t\t\tm_World->DoExplosionAt(4.0, GetPosX(), GetPosY() + GetHeight() / 2, GetPosZ(), true, esTNTMinecart, this);\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMinecartWithHopper:\n\ncMinecartWithHopper::cMinecartWithHopper(Vector3d a_Pos):\n\tSuper(mpHopper, a_Pos)\n{\n}\n\n// TODO: Make it suck up blocks and travel further than any other cart and physics and put and take blocks\n// AND AVARYTHING!!\n\n\n\n\n\nvoid cMinecartWithHopper::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\ta_Drops.emplace_back(E_ITEM_MINECART_WITH_HOPPER);\n}\n"
  },
  {
    "path": "src/Entities/Minecart.h",
    "content": "\n// Minecart.h\n\n// Declares the cMinecart class representing a minecart in the world\n\n\n\n\n\n#pragma once\n\n#include \"Entity.h\"\n#include \"../World.h\"\n#include \"../UI/WindowOwner.h\"\n\n\n\n\n\nclass cMinecart :\n\tpublic cEntity\n{\n\tusing Super = cEntity;\n\npublic:\n\tCLASS_PROTODEF(cMinecart)\n\n\t/** Minecart payload, values correspond to packet subtype */\n\tenum ePayload\n\t{\n\t\tmpNone    = 0,  // Empty minecart, ridable by player or mobs\n\t\tmpChest   = 1,  // Minecart-with-chest, can store a grid of 3 * 8 items\n\t\tmpFurnace = 2,  // Minecart-with-furnace, can be powered\n\t\tmpTNT     = 3,  // Minecart-with-TNT, can be blown up with activator rail\n\t\tmpHopper  = 5,  // Minecart-with-hopper, can be hopper\n\t\t// TODO: Spawner minecarts, (and possibly any block in a minecart with NBT editing)\n\t} ;\n\n\t// cEntity overrides:\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\tvirtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual bool DoTakeDamage(TakeDamageInfo & TDI) override;\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\tvirtual void OnRemoveFromWorld(cWorld & a_World) override;\n\tvirtual void HandleSpeedFromAttachee(float a_Forward, float a_Sideways) override;\n\tint LastDamage(void) const { return m_LastDamage; }\n\tePayload GetPayload(void) const { return m_Payload; }\n\nprotected:\n\n\tePayload m_Payload;\n\tint m_LastDamage;\n\tVector3i m_DetectorRailPosition;\n\tbool m_bIsOnDetectorRail;\n\n\t/** Applies an acceleration to the minecart parallel to a_ForwardDirection but without allowing backward speed. */\n\tvoid ApplyAcceleration(Vector3d a_ForwardDirection, double a_Acceleration);\n\n\tcMinecart(ePayload a_Payload, Vector3d a_Pos);\n\n\t/** Handles physics on normal rails\n\tFor each tick, slow down on flat rails, speed up or slow down on ascending / descending rails (depending on direction), and turn on curved rails. */\n\tvoid HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt);\n\n\t/** Handles powered rail physics\n\t\tEach tick, speed up or slow down cart, depending on metadata of rail (powered or not)\n\t*/\n\tvoid HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta);\n\n\t/** Handles detector rail activation\n\t\tActivates detector rails when a minecart is on them. Calls HandleRailPhysics() for physics simulations\n\t*/\n\tvoid HandleDetectorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt);\n\n\t/** Handles activator rails */\n\tvirtual void HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt);\n\n\t/** Snaps a mincecart to a rail's axis, resetting its speed\n\t\tFor curved rails, it changes the cart's direction as well as snapping it to axis */\n\tvoid SnapToRail(NIBBLETYPE a_RailMeta);\n\t/** Tests if a solid block is in front of a cart, and stops the cart (and returns true) if so; returns false if no obstruction */\n\tbool TestBlockCollision(NIBBLETYPE a_RailMeta);\n\t/** Tests if there is a block at the specified position which is impassable to minecarts */\n\tbool IsSolidBlockAtPosition(Vector3i a_Offset);\n\t/** Tests if a solid block is at a specific offset of the minecart position */\n\tbool IsSolidBlockAtOffset(int a_XOffset, int a_YOffset, int a_ZOffset);\n\n\tbool IsBlockCollisionAtOffset(Vector3i a_Offset);\n\n\t/** Tests if this mincecart's bounding box is intersecting another entity's bounding box (collision) and pushes mincecart away if necessary */\n\tbool TestEntityCollision(NIBBLETYPE a_RailMeta);\n} ;\n\n\n\n\n\nclass cRideableMinecart final :\n\tpublic cMinecart\n{\n\tusing Super = cMinecart;\n\npublic:\n\n\tCLASS_PROTODEF(cRideableMinecart)\n\n\tcRideableMinecart(Vector3d a_Pos, const cItem & a_Content, int a_ContentHeight);\n\n\tconst cItem & GetContent(void) const { return m_Content; }\n\tint GetBlockHeight(void) const { return m_ContentHeight; }\n\n\t// cEntity overrides:\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\nprotected:\n\n\tcItem m_Content;\n\tint m_ContentHeight;\n} ;\n\n\n\n\n\nclass cMinecartWithChest final :\n\tpublic cMinecart,\n\tpublic cItemGrid::cListener,\n\tpublic cEntityWindowOwner\n{\n\tusing Super = cMinecart;\n\npublic:\n\n\tCLASS_PROTODEF(cMinecartWithChest)\n\n\tcMinecartWithChest(Vector3d a_Pos);\n\n\tenum\n\t{\n\t\tContentsHeight = 3,\n\t\tContentsWidth = 9,\n\t};\n\n\tconst cItem & GetSlot(int a_Idx) const { return m_Contents.GetSlot(a_Idx); }\n\tvoid SetSlot(int a_Idx, const cItem & a_Item) { m_Contents.SetSlot(a_Idx, a_Item); }\n\n\nprotected:\n\n\tcItemGrid m_Contents;\n\tvoid OpenNewWindow(void);\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum) override\n\t{\n\t\tUNUSED(a_SlotNum);\n\t\tASSERT(a_Grid == &m_Contents);\n\t\tif (m_World != nullptr)\n\t\t{\n\t\t\tif (GetWindow() != nullptr)\n\t\t\t{\n\t\t\t\tGetWindow()->BroadcastWholeWindow();\n\t\t\t}\n\n\t\t\tm_World->MarkChunkDirty(GetChunkX(), GetChunkZ());\n\t\t}\n\t}\n\n\t// cEntity overrides:\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void OnRemoveFromWorld(cWorld & a_World) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n} ;\n\n\n\n\n\nclass cMinecartWithFurnace final :\n\tpublic cMinecart\n{\n\tusing Super = cMinecart;\n\npublic:\n\n\tCLASS_PROTODEF(cMinecartWithFurnace)\n\n\tcMinecartWithFurnace(Vector3d a_Pos);\n\n\t// cEntity overrides:\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\t// Set functions.\n\tvoid SetIsFueled(bool a_IsFueled, int a_FueledTimeLeft = -1) {m_IsFueled = a_IsFueled; m_FueledTimeLeft = a_FueledTimeLeft;}\n\n\t// Get functions.\n\tint  GetFueledTimeLeft(void) const {return m_FueledTimeLeft; }\n\tbool IsFueled (void)         const {return m_IsFueled;}\n\nprivate:\n\n\tint m_FueledTimeLeft;\n\tbool m_IsFueled;\n\n} ;\n\n\n\n\n\nclass cMinecartWithTNT final :\n\tpublic cMinecart\n{\n\tusing Super = cMinecart;\n\npublic:\n\n\tCLASS_PROTODEF(cMinecartWithTNT)\n\n\tcMinecartWithTNT(Vector3d a_Pos);\n\tvoid Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\nprivate:\n\tint m_TNTFuseTicksLeft;\n\tbool m_isTNTFused = false;\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvoid HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt) override;\n} ;\n\n\n\n\n\nclass cMinecartWithHopper final :\n\tpublic cMinecart\n{\n\tusing Super = cMinecart;\n\npublic:\n\n\tCLASS_PROTODEF(cMinecartWithHopper)\n\n\tcMinecartWithHopper(Vector3d a_Pos);\n\nprivate:\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n} ;\n"
  },
  {
    "path": "src/Entities/Painting.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Painting.h\"\n#include \"Player.h\"\n#include \"../ClientHandle.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\ncPainting::cPainting(const AString & a_Name, eBlockFace a_Direction, Vector3d a_Pos):\n\tSuper(etPainting, a_Direction, a_Pos),\n\tm_Name(a_Name)\n{\n}\n\n\n\n\n\nvoid cPainting::SpawnOn(cClientHandle & a_Client)\n{\n\tSuper::SpawnOn(a_Client);\n\ta_Client.SendPaintingSpawn(*this);\n\n\tm_World->BroadcastSoundEffect(\"entity.painting.place\", GetPosition(), 1, 1);\n}\n\n\n\n\n\nvoid cPainting::GetDrops(cItems & a_Items, cEntity * a_Killer)\n{\n\ta_Items.emplace_back(E_ITEM_PAINTING);\n}\n\n\n\n\n\nvoid cPainting::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\n\tm_World->BroadcastSoundEffect(\"entity.painting.break\", GetPosition(), 1, 1);\n}\n"
  },
  {
    "path": "src/Entities/Painting.h",
    "content": "\n#pragma once\n\n#include \"HangingEntity.h\"\n\n\n\n\n\n// tolua_begin\nclass cPainting :\n\tpublic cHangingEntity\n{\n\t// tolua_end\n\n\tusing Super = cHangingEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cPainting)\n\n\tcPainting(const AString & a_Name, eBlockFace a_Direction, Vector3d a_Pos);\n\n\t/** Returns the protocol name of the painting */\n\tconst AString & GetName(void) const { return m_Name; }  // tolua_export\n\nprivate:\n\n\tvirtual void SpawnOn(cClientHandle & a_Client) override;\n\tvirtual void GetDrops(cItems & a_Items, cEntity * a_Killer) override;\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\n\tAString m_Name;\n\n};  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Entities/Pawn.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Pawn.h\"\n#include \"Player.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../BoundingBox.h\"\n#include \"../Blocks/BlockHandler.h\"\n#include \"../Blocks/BlockFarmland.h\"\n#include \"../EffectID.h\"\n#include \"../Mobs/Monster.h\"\n\n\n\n\ncPawn::cPawn(eEntityType a_EntityType, float a_Width, float a_Height) :\n\tSuper(a_EntityType, Vector3d(), a_Width, a_Height),\n\tm_EntityEffects(tEffectMap()),\n\tm_LastGroundHeight(0),\n\tm_bTouchGround(false)\n{\n\tSetGravity(-32.0f);\n\tSetAirDrag(0.02f);\n}\n\n\n\n\n\nvoid cPawn::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tstd::vector<cEntityEffect *> EffectsToTick;\n\n\t// Iterate through this entity's applied effects\n\tfor (tEffectMap::iterator iter = m_EntityEffects.begin(); iter != m_EntityEffects.end();)\n\t{\n\t\t// Copies values to prevent pesky wrong accesses and erasures\n\t\tcEntityEffect::eType EffectType = iter->first;\n\t\tcEntityEffect * Effect = iter->second.get();\n\n\t\t// Iterates (must be called before any possible erasure)\n\t\t++iter;\n\n\t\t// Remove effect if duration has elapsed\n\t\tif (Effect->GetDuration() - Effect->GetTicks() <= 0)\n\t\t{\n\t\t\tRemoveEntityEffect(EffectType);\n\t\t}\n\t\t// Call OnTick later to make sure the iterator won't be invalid\n\t\telse\n\t\t{\n\t\t\tEffectsToTick.push_back(Effect);\n\t\t}\n\n\t\t// TODO: Check for discrepancies between client and server effect values\n\t}\n\n\n\tfor (auto * Effect : EffectsToTick)\n\t{\n\t\tEffect->OnTick(*this);\n\t}\n\n\t// Spectators cannot push entities around\n\tif ((!IsPlayer()) || (!static_cast<cPlayer *>(this)->IsGameModeSpectator()))\n\t{\n\t\tm_World->ForEachEntityInBox(GetBoundingBox(), [=](cEntity & a_Entity)\n\t\t\t{\n\t\t\t\tif (a_Entity.GetUniqueID() == GetUniqueID())\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// we only push other mobs, boats and minecarts\n\t\t\t\tif ((a_Entity.GetEntityType() != etMonster) && (a_Entity.GetEntityType() != etMinecart) && (a_Entity.GetEntityType() != etBoat))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// do not push a boat / minecart you're sitting in\n\t\t\t\tif (IsAttachedTo(&a_Entity))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tVector3d v3Delta = a_Entity.GetPosition() - GetPosition();\n\t\t\t\tv3Delta.y = 0.0;  // we only push sideways\n\t\t\t\tv3Delta *= 1.0 / (v3Delta.Length() + 0.01);  // we push harder if we're close\n\t\t\t\t// QUESTION: is there an additional multiplier for this? current shoving seems a bit weak\n\n\t\t\t\ta_Entity.AddSpeed(v3Delta);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t);\n\t}\n\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\tHandleFalling();\n\n\t// Handle item pickup\n\tif (m_Health > 0)\n\t{\n\t\tif (IsPlayer())\n\t\t{\n\t\t\tm_World->CollectPickupsByEntity(*this);\n\t\t}\n\t\telse if (IsMob())\n\t\t{\n\t\t\tcMonster & Mob = static_cast<cMonster &>(*this);\n\t\t\tif (Mob.CanPickUpLoot())\n\t\t\t{\n\t\t\t\tm_World->CollectPickupsByEntity(*this);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cPawn::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tClearEntityEffects();\n\n\t// Is death eligible for totem reanimation?\n\tif (DeductTotem(a_TDI.DamageType))\n\t{\n\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnTotemActivates);\n\n\t\tAddEntityEffect(cEntityEffect::effAbsorption, 100, 1);\n\t\tAddEntityEffect(cEntityEffect::effRegeneration, 900, 1);\n\t\tAddEntityEffect(cEntityEffect::effFireResistance, 800, 0);\n\n\t\tm_Health = 1;\n\t\treturn;\n\t}\n\n\tSuper::KilledBy(a_TDI);\n}\n\n\n\n\n\nbool cPawn::IsFireproof(void) const\n{\n\treturn Super::IsFireproof() || HasEntityEffect(cEntityEffect::effFireResistance);\n}\n\n\n\n\n\nbool cPawn::IsInvisible() const\n{\n\treturn HasEntityEffect(cEntityEffect::effInvisibility);\n}\n\n\n\n\n\nvoid cPawn::HandleAir(void)\n{\n\tif (IsHeadInWater() && HasEntityEffect(cEntityEffect::effWaterBreathing))\n\t{\n\t\t// Prevent the oxygen from decreasing\n\t\treturn;\n\t}\n\n\tSuper::HandleAir();\n}\n\n\n\n\n\nvoid cPawn::AddEntityEffect(cEntityEffect::eType a_EffectType, int a_Duration, short a_Intensity, double a_DistanceModifier)\n{\n\t// Check if the plugins allow the addition:\n\tif (cPluginManager::Get()->CallHookEntityAddEffect(*this, a_EffectType, a_Duration, a_Intensity, a_DistanceModifier))\n\t{\n\t\t// A plugin disallows the addition, bail out.\n\t\treturn;\n\t}\n\n\t// No need to add empty effects:\n\tif (a_EffectType == cEntityEffect::effNoEffect)\n\t{\n\t\treturn;\n\t}\n\ta_Duration = static_cast<int>(a_Duration * a_DistanceModifier);\n\n\t// If we already have the effect, we have to deactivate it or else it will act cumulatively\n\tauto ExistingEffect = m_EntityEffects.find(a_EffectType);\n\tif (ExistingEffect != m_EntityEffects.end())\n\t{\n\t\tExistingEffect->second->OnDeactivate(*this);\n\t}\n\n\tauto Res = m_EntityEffects.emplace(a_EffectType, cEntityEffect::CreateEntityEffect(a_EffectType, a_Duration, a_Intensity, a_DistanceModifier));\n\tm_World->BroadcastEntityEffect(*this, a_EffectType, a_Intensity, a_Duration);\n\tcEntityEffect * Effect = Res.first->second.get();\n\tEffect->OnActivate(*this);\n}\n\n\n\n\n\nvoid cPawn::RemoveEntityEffect(cEntityEffect::eType a_EffectType)\n{\n\tm_World->BroadcastRemoveEntityEffect(*this, a_EffectType);\n\tauto itr = m_EntityEffects.find(a_EffectType);\n\tif (itr != m_EntityEffects.end())\n\t{\n\t\t// Erase from effect map before calling OnDeactivate to allow metadata broadcasts (e.g. for invisibility effect)\n\t\tauto Effect = std::move(itr->second);\n\t\tm_EntityEffects.erase(itr);\n\t\tEffect->OnDeactivate(*this);\n\t}\n}\n\n\n\n\n\nbool cPawn::HasEntityEffect(cEntityEffect::eType a_EffectType) const\n{\n\treturn m_EntityEffects.find(a_EffectType) != m_EntityEffects.end();\n}\n\n\n\n\n\nvoid cPawn::ClearEntityEffects()\n{\n\t// Iterate through this entity's applied effects\n\tfor (tEffectMap::iterator iter = m_EntityEffects.begin(); iter != m_EntityEffects.end();)\n\t{\n\t\t// Copy values to prevent pesky wrong erasures\n\t\tcEntityEffect::eType EffectType = iter->first;\n\n\t\t// Iterates (must be called before any possible erasure)\n\t\t++iter;\n\n\t\t// Remove effect\n\t\tRemoveEntityEffect(EffectType);\n\t}\n}\n\n\n\n\n\nvoid cPawn::NoLongerTargetingMe(cMonster * a_Monster)\n{\n\tASSERT(IsTicking());  // Our destroy override is supposed to clear all targets before we're destroyed.\n\tfor (auto i = m_TargetingMe.begin(); i != m_TargetingMe.end(); ++i)\n\t{\n\t\tcMonster * Monster = *i;\n\t\tif (Monster == a_Monster)\n\t\t{\n\t\t\tASSERT(Monster->GetTarget() != this);  // The monster is notifying us it is no longer targeting us, assert if that's a lie\n\t\t\tm_TargetingMe.erase(i);\n\t\t\treturn;\n\t\t}\n\t}\n\tASSERT(false);  // If this happens, something is wrong. Perhaps the monster never called TargetingMe() or called NoLongerTargetingMe() twice.\n}\n\n\n\n\n\nvoid cPawn::TargetingMe(cMonster * a_Monster)\n{\n\tASSERT(IsTicking());\n\tASSERT(m_TargetingMe.size() < 10000);\n\tASSERT(a_Monster->GetTarget() == this);\n\tm_TargetingMe.push_back(a_Monster);\n}\n\n\n\n\n\nvoid cPawn::HandleFalling(void)\n{\n\t/* Not pretty looking, and is more suited to wherever server-sided collision detection is implemented.\n\tThe following condition sets on-ground-ness if\n\tThe player isn't swimming or flying (client hardcoded conditions) and\n\tthey're on a block (Y is exact) - ensure any they could be standing on (including on the edges) is solid or\n\tthey're on a slab (Y significand is 0.5) - ditto with slab check\n\tthey're on a snow layer (Y divisible by 0.125) - ditto with snow layer check\n\t*/\n\n\tstatic const auto HalfWidth = GetWidth() / 2;\n\tstatic const auto EPS = 0.0001;\n\n\t/* Since swimming is decided in a tick and is asynchronous to this, we have to check for dampeners ourselves.\n\tThe behaviour as of 1.8.9 is the following:\n\t- Landing in water alleviates all fall damage\n\t- Passing through any liquid (water + lava) and cobwebs \"slows\" the player down,\n\ti.e. resets the fall distance to that block, but only after checking for fall damage\n\t(this means that plummeting into lava will still kill the player via fall damage, although cobwebs\n\twill slow players down enough to have multiple updates that keep them alive)\n\t- Slime blocks reverse falling velocity, unless it's a crouching player, in which case they act as standard blocks.\n\tThey also reset the topmost point of the damage calculation with each bounce,\n\tso if the block is removed while the player is bouncing or crouches after a bounce, the last bounce's zenith is considered as fall damage.\n\n\tWith this in mind, we first check the block at the player's feet, then the one below that (because fences),\n\tand decide which behaviour we want to go with.\n\t*/\n\tconst auto BlockAtFoot = (cChunkDef::IsValidHeight(POS_TOINT)) ? GetWorld()->GetBlock(POS_TOINT) : static_cast<BLOCKTYPE>(E_BLOCK_AIR);\n\n\t/* We initialize these with what the foot is really IN, because for sampling we will move down with the epsilon above */\n\tbool IsFootInWater = IsBlockWater(BlockAtFoot);\n\tbool IsFootOnSlimeBlock = false;\n\n\t/* The \"cross\" we sample around to account for the player width/girth */\n\tstatic const struct\n\t{\n\t\tint x, z;\n\t} CrossSampleCoords[] =\n\t{\n\t\t{ 0, 0 },\n\t\t{ 1, 0 },\n\t\t{ -1, 0 },\n\t\t{ 0, 1 },\n\t\t{ 0, -1 },\n\t};\n\n\t/* The blocks we're interested in relative to the player to account for larger than 1 blocks.\n\tThis can be extended to do additional checks in case there are blocks that are represented as one block\n\tin memory but have a hitbox larger than 1 (like fences) */\n\tstatic const Vector3i BlockSampleOffsets[] =\n\t{\n\t\t{ 0, 0, 0 },  // TODO: something went wrong here (offset 0?)\n\t\t{ 0, -1, 0 },  // Potentially causes mis-detection (IsFootInWater) when player stands on block diagonal to water (i.e. on side of pool)\n\t};\n\n\t/* Here's the rough outline of how this mechanism works:\n\tWe take the player's pointlike position (sole of feet), and expand it into a crosslike shape.\n\tIf any of the five points hit a block, we consider the player to be \"on\" (or \"in\") the ground. */\n\tbool OnGround = false;\n\tfor (size_t i = 0; i < ARRAYCOUNT(CrossSampleCoords); i++)\n\t{\n\t\t/* We calculate from the player's position, one of the cross-offsets above, and we move it down slightly so it's beyond inaccuracy.\n\t\tThe added advantage of this method is that if the player is simply standing on the floor,\n\t\tthe point will move into the next block, and the floor() will retrieve that instead of air. */\n\t\tVector3d CrossTestPosition = GetPosition() + Vector3d(CrossSampleCoords[i].x * HalfWidth, -EPS, CrossSampleCoords[i].z * HalfWidth);\n\n\t\t/* We go through the blocks that we consider \"relevant\" */\n\t\tfor (size_t j = 0; j < ARRAYCOUNT(BlockSampleOffsets); j++)\n\t\t{\n\t\t\tVector3i BlockTestPosition = CrossTestPosition.Floor() + BlockSampleOffsets[j];\n\n\t\t\tif (!cChunkDef::IsValidHeight(BlockTestPosition))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tBLOCKTYPE BlockType = GetWorld()->GetBlock(BlockTestPosition);\n\t\t\tNIBBLETYPE BlockMeta = GetWorld()->GetBlockMeta(BlockTestPosition);\n\n\t\t\t/* we do the cross-shaped sampling to check for water / liquids, but only on our level because water blocks are never bigger than unit voxels */\n\t\t\tif (j == 0)\n\t\t\t{\n\t\t\t\tIsFootInWater |= IsBlockWater(BlockType);\n\t\t\t\tIsFootOnSlimeBlock |= (BlockType == E_BLOCK_SLIME_BLOCK);\n\t\t\t}\n\n\t\t\t/* If the block is solid, and the blockhandler confirms the block to be inside, we're officially on the ground. */\n\t\t\tif ((cBlockInfo::IsSolid(BlockType)) && (cBlockHandler::For(BlockType).IsInsideBlock(CrossTestPosition - BlockTestPosition, BlockMeta)))\n\t\t\t{\n\t\t\t\tOnGround = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* So here's the use of the rules above: */\n\t/* 1. Falling in water absorbs all fall damage */\n\tbool FallDamageAbsorbed = IsFootInWater;\n\n\t/* 2. Falling in liquid (lava, water, cobweb) or hitting a slime block resets the \"fall zenith\".\n\tNote: Even though the pawn bounces back with no damage after hitting the slime block,\n\tthe \"fall zenith\" will continue to increase back up when flying upwards - which is good */\n\tbool ShouldBounceOnSlime = true;\n\n\tif (IsPlayer())\n\t{\n\t\tauto Player = static_cast<cPlayer *>(this);\n\n\t\t/* 3. If the player is flying or climbing, absorb fall damage */\n\t\tFallDamageAbsorbed |= Player->IsFlying() || Player->IsClimbing() || Player->GetIsTeleporting();\n\n\t\t/* 4. If the player is about to bounce on a slime block and is not crouching, absorb all fall damage  */\n\t\tShouldBounceOnSlime = !Player->IsCrouched();\n\t\tFallDamageAbsorbed |= (IsFootOnSlimeBlock && ShouldBounceOnSlime);\n\t}\n\telse\n\t{\n\t\t/* 5. Bouncing on a slime block absorbs all fall damage  */\n\t\tFallDamageAbsorbed |= IsFootOnSlimeBlock;\n\t}\n\n\t/* If the player is not crouching or is not a player, shoot them back up.\n\tNOTE: this will only work in some cases; should be done in HandlePhysics() */\n\tif (IsFootOnSlimeBlock && ShouldBounceOnSlime)\n\t{\n\t\t// TODO: doesn't work too well, causes dissatisfactory experience for players on slime blocks - SetSpeedY(-GetSpeedY());\n\t}\n\n\t// TODO: put player speed into GetSpeedY, and use that.\n\t// If flying, climbing, swimming, or going up...\n\tif (FallDamageAbsorbed || ((GetPosition() - m_LastPosition).y > 0))\n\t{\n\t\t// ...update the ground height to have the highest position of the player (i.e. jumping up adds to the eventual fall damage)\n\t\tm_LastGroundHeight = GetPosY();\n\t}\n\n\tif (OnGround)\n\t{\n\t\tconst auto FallHeight = m_LastGroundHeight - GetPosY();\n\t\tauto Damage = static_cast<int>(FallHeight - 3.0);\n\n\t\tconst auto Below = POS_TOINT.addedY(-1);\n\t\tconst auto BlockBelow = (cChunkDef::IsValidHeight(Below)) ? GetWorld()->GetBlock(Below) : static_cast<BLOCKTYPE>(E_BLOCK_AIR);\n\n\t\tif ((Damage > 0) && !FallDamageAbsorbed)\n\t\t{\n\t\t\tif (IsElytraFlying())\n\t\t\t{\n\t\t\t\tDamage = static_cast<int>(static_cast<float>(Damage) * 0.33);\n\t\t\t}\n\n\t\t\tif (BlockBelow == E_BLOCK_HAY_BALE)\n\t\t\t{\n\t\t\t\tDamage = std::clamp(static_cast<int>(static_cast<float>(Damage) * 0.2), 1, 20);\n\t\t\t}\n\n\t\t\t// Fall particles\n\t\t\t// TODO: falling on a partial (e.g. slab) block shouldn't broadcast particles of the block below\n\t\t\tGetWorld()->BroadcastParticleEffect(\n\t\t\t\t\"blockdust\",\n\t\t\t\tGetPosition(),\n\t\t\t\t{ 0, 0, 0 },\n\t\t\t\t(Damage - 1.f) * ((0.3f - 0.1f) / (15.f - 1.f)) + 0.1f,  // Map damage (1 - 15) to particle speed (0.1 - 0.3)\n\t\t\t\tstatic_cast<int>((Damage - 1.f) * ((50.f - 20.f) / (15.f - 1.f)) + 20.f),  // Map damage (1 - 15) to particle quantity (20 - 50)\n\t\t\t\t{ { BlockBelow, 0 } }\n\t\t\t);\n\n\t\t\tTakeDamage(dtFalling, nullptr, Damage, static_cast<float>(Damage), 0);\n\t\t}\n\n\t\tm_bTouchGround = true;\n\t\tm_LastGroundHeight = GetPosY();\n\n\t\t// Farmland trampling. Mobs smaller than 0.512 cubic blocks won't trample (Java Edition's behavior)\n\t\t// We only have width and height, so we have to calculate Width^2\n\t\tif (GetWorld()->IsFarmlandTramplingEnabled())\n\t\t{\n\t\t\tHandleFarmlandTrampling(FallHeight, BlockAtFoot, BlockBelow);\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_bTouchGround = false;\n\t}\n\n\t/* Note: it is currently possible to fall through lava and still die from fall damage\n\tbecause of the client skipping an update about the lava block. This can only be resolved by\n\tsomehow integrating these above checks into the tracer in HandlePhysics. */\n}\n\n\n\n\n\nvoid cPawn::HandleFarmlandTrampling(const double a_FallHeight, const BLOCKTYPE a_BlockAtFoot, const BLOCKTYPE a_BlockBelow)\n{\n\t// No trampling if FallHeight <= 0.6875\n\tif (a_FallHeight <= 0.6875)\n\t{\n\t\treturn;\n\t}\n\t// No trampling for mobs smaller than 0.512 cubic blocks\n\tif (GetWidth() * GetWidth() * GetHeight() < 0.512)\n\t{\n\t\treturn;\n\t}\n\n\tauto AbsPos = POS_TOINT;\n\n\t// Check if the foot is \"inside\" a farmland - for 1.10.1 and newer clients\n\t// If it isn't, check if the block below is a farmland - for mobs and older clients\n\tif (a_BlockAtFoot != E_BLOCK_FARMLAND)\n\t{\n\t\t// These are probably the only blocks which:\n\t\t// - can be placed on a farmland and shouldn't destroy it\n\t\t// - will stop the player from falling down further\n\t\t// - are less than 1 block high\n\t\tif ((a_BlockAtFoot == E_BLOCK_HEAD) || (a_BlockAtFoot == E_BLOCK_FLOWER_POT))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Finally, check whether the block below is farmland\n\t\tif (a_BlockBelow != E_BLOCK_FARMLAND)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// If we haven't returned, decrease the height\n\t\tAbsPos.y -= 1;\n\t}\n\n\tbool ShouldTrample = true;\n\tauto & Random = GetRandomProvider();\n\n\t// For FallHeight <= 1.5625 we need to get a random bool\n\tif (a_FallHeight <= 1.0625)\n\t{\n\t\tShouldTrample = Random.RandBool(0.25);\n\t}\n\telse if (a_FallHeight <= 1.5625)\n\t{\n\t\tShouldTrample = Random.RandBool(0.66);\n\t}\n\t// For FallHeight > 1.5625 we always trample - ShouldTrample remains true\n\n\tif (ShouldTrample)\n\t{\n\t\tGetWorld()->DoWithChunkAt(AbsPos, [&](cChunk & Chunk)\n\t\t{\n\t\t\tcBlockFarmlandHandler::TurnToDirt(Chunk, AbsPos);\n\t\t\treturn true;\n\t\t});\n\t}\n}\n\n\n\n\n\nvoid cPawn::OnRemoveFromWorld(cWorld & a_World)\n{\n\tStopEveryoneFromTargetingMe();\n\tSuper::OnRemoveFromWorld(a_World);\n}\n\n\n\n\n\nvoid cPawn::StopEveryoneFromTargetingMe()\n{\n\tstd::vector<cMonster*>::iterator i = m_TargetingMe.begin();\n\twhile (i != m_TargetingMe.end())\n\t{\n\t\tcMonster * Monster = *i;\n\t\tASSERT(Monster->GetTarget() == this);\n\t\tMonster->UnsafeUnsetTarget();\n\t\ti = m_TargetingMe.erase(i);\n\t}\n\tASSERT(m_TargetingMe.size() == 0);\n}\n\n\n\n\n\nstd::map<cEntityEffect::eType, cEntityEffect *> cPawn::GetEntityEffects() const\n{\n\tstd::map<cEntityEffect::eType, cEntityEffect *> Effects;\n\tfor (auto & Effect : m_EntityEffects)\n\t{\n\t\tEffects.insert({ Effect.first, Effect.second.get() });\n\t}\n\treturn Effects;\n}\n\n\n\n\n\ncEntityEffect * cPawn::GetEntityEffect(cEntityEffect::eType a_EffectType) const\n{\n\tauto itr = m_EntityEffects.find(a_EffectType);\n\treturn (itr != m_EntityEffects.end()) ? itr->second.get() : nullptr;\n}\n\n\n\n\n\nvoid cPawn::ResetPosition(Vector3d a_NewPosition)\n{\n\tSuper::ResetPosition(a_NewPosition);\n\tm_LastGroundHeight = GetPosY();\n}\n\n\n\n\n\nbool cPawn::DeductTotem(const eDamageType a_DamageType)\n{\n\tif ((a_DamageType == dtAdmin) || (a_DamageType == dtInVoid))\n\t{\n\t\t// Beyond saving:\n\t\treturn false;\n\t}\n\n\tif (!IsPlayer())\n\t{\n\t\t// TODO: implement when mobs will be able to pick up items based on CanPickUpLoot attribute:\n\t\treturn false;\n\t}\n\n\t// If the player is holding a totem of undying in their off-hand or\n\t// main-hand slot and receives otherwise fatal damage, the totem saves the player from death.\n\n\tauto & inv = static_cast<cPlayer *>(this)->GetInventory();\n\tif (inv.GetEquippedItem().m_ItemType == E_ITEM_TOTEM_OF_UNDYING)\n\t{\n\t\tinv.SetEquippedItem({});\n\t\treturn true;\n\t}\n\tif (inv.GetShieldSlot().m_ItemType == E_ITEM_TOTEM_OF_UNDYING)\n\t{\n\t\tinv.SetShieldSlot({});\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPawn::FindTeleportDestination(cWorld & a_World, const int a_HeightRequired, const unsigned int a_NumTries, Vector3d & a_Destination, const Vector3i a_MinBoxCorner, const Vector3i a_MaxBoxCorner)\n{\n\t/*\n\tAlgorithm:\n\tChoose random destination.\n\tSeek downwards, regardless of distance until the block is made of movement-blocking material: https://minecraft.wiki/w/Materials\n\tSucceeds if no liquid or solid blocks prevents from standing at destination.\n\t*/\n\tauto & Random = GetRandomProvider();\n\n\tfor (unsigned int i = 0; i < a_NumTries; i++)\n\t{\n\t\tconst int DestX = Random.RandInt(a_MinBoxCorner.x, a_MaxBoxCorner.x);\n\t\tint DestY = Random.RandInt(a_MinBoxCorner.y, a_MaxBoxCorner.y);\n\t\tconst int DestZ = Random.RandInt(a_MinBoxCorner.z, a_MaxBoxCorner.z);\n\n\t\t// Seek downwards from initial destination until we find a solid block or go into the void\n\t\tBLOCKTYPE DestBlock = a_World.GetBlock({DestX, DestY, DestZ});\n\t\twhile ((DestY >= 0) && !cBlockInfo::IsSolid(DestBlock))\n\t\t{\n\t\t\tDestBlock = a_World.GetBlock({DestX, DestY, DestZ});\n\t\t\tDestY--;\n\t\t}\n\n\t\t// Couldn't find a solid block so move to next attempt\n\t\tif (DestY < 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Succeed if blocks above destination are empty\n\t\tbool Success = true;\n\t\tfor (int j = 1; j <= a_HeightRequired; j++)\n\t\t{\n\t\t\tBLOCKTYPE TestBlock = a_World.GetBlock({DestX, DestY + j, DestZ});\n\t\t\tif (cBlockInfo::IsSolid(TestBlock) || IsBlockLiquid(TestBlock))\n\t\t\t{\n\t\t\t\tSuccess = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!Success)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Offsets for entity to be centred and standing on solid block\n\t\ta_Destination = Vector3d(DestX + 0.5, DestY + 1, DestZ + 0.5);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cPawn::FindTeleportDestination(cWorld & a_World, const int a_HeightRequired, const unsigned int a_NumTries, Vector3d & a_Destination, const cBoundingBox a_BoundingBox)\n{\n\treturn FindTeleportDestination(a_World, a_HeightRequired, a_NumTries, a_Destination, a_BoundingBox.GetMin(), a_BoundingBox.GetMax());\n}\n\n\n\n\n\nbool cPawn::FindTeleportDestination(cWorld & a_World, const int a_HeightRequired, const unsigned int a_NumTries, Vector3d & a_Destination, Vector3i a_Centre, const int a_HalfCubeWidth)\n{\n\tVector3i MinCorner(a_Centre.x - a_HalfCubeWidth, a_Centre.y - a_HalfCubeWidth, a_Centre.z - a_HalfCubeWidth);\n\tVector3i MaxCorner(a_Centre.x + a_HalfCubeWidth, a_Centre.y + a_HalfCubeWidth, a_Centre.z + a_HalfCubeWidth);\n\treturn FindTeleportDestination(a_World, a_HeightRequired, a_NumTries, a_Destination, MinCorner, MaxCorner);\n}\n"
  },
  {
    "path": "src/Entities/Pawn.h",
    "content": "\n#pragma once\n\n#include \"Entity.h\"\n#include \"EntityEffect.h\"\n\n// fwd cMonster\nclass cMonster;\n\n\n\n\n\n// tolua_begin\nclass cPawn:\n\tpublic cEntity\n{\n\t// tolua_end\n\tusing Super = cEntity;\n\npublic:\n\n\tCLASS_PROTODEF(cPawn)\n\n\tcPawn(eEntityType a_EntityType, float a_Width, float a_Height);\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\n\tvirtual bool IsFireproof(void) const override;\n\tvirtual bool IsInvisible() const override;\n\tvirtual void HandleAir(void) override;\n\tvirtual void HandleFalling(void);\n\tvirtual void OnRemoveFromWorld(cWorld & a_World) override;\n\n\t/** Handles farmland trampling when hitting the ground.\n\tAlgorithm:\n\tfall height <= 0.6875 blocks: no trampling\n\tfall height > 0.6875 and <= 1.0625: 25% chance of trampling\n\tfall height > 1.0625 and <= 1.5625: 66% chance of trampling\n\tfall height > 1.5625: always trample\n\tThe values may differ from vanilla, they were determined experimentally.\n\tAdditionaly, mobs smaller than 0.512 cubic blocks won't trample.\n\t*/\n\tvoid HandleFarmlandTrampling(double a_FallHeight, BLOCKTYPE a_BlockAtFoot, BLOCKTYPE a_BlockBelow);\n\n\t/** Tells all pawns which are targeting us to stop targeting us. */\n\tvoid StopEveryoneFromTargetingMe();\n\n\n\n\t// tolua_begin\n\n\t/** Applies an entity effect.\n\tChecks with plugins if they allow the addition.\n\ta_EffectIntensity is the level of the effect (0 = Potion I, 1 = Potion II, etc).\n\ta_DistanceModifier is the scalar multiplied to the potion duration (only applies to splash potions).\n\t*/\n\tvoid AddEntityEffect(cEntityEffect::eType a_EffectType, int a_EffectDurationTicks, short a_EffectIntensity, double a_DistanceModifier = 1);\n\n\t/** Removes a currently applied entity effect. */\n\tvoid RemoveEntityEffect(cEntityEffect::eType a_EffectType);\n\n\t/** Returns true, if the entity effect is currently applied. */\n\tbool HasEntityEffect(cEntityEffect::eType a_EffectType) const;\n\n\t/** Removes all currently applied entity effects (used when drinking milk) */\n\tvoid ClearEntityEffects(void);\n\n\t// tolua_end\n\n\t/** Remove the monster from the list of monsters targeting this pawn. */\n\tvoid NoLongerTargetingMe(cMonster * a_Monster);\n\n\t/** Add the monster to the list of monsters targeting this pawn. (Does not check if already in list!) */\n\tvoid TargetingMe(cMonster * a_Monster);\n\n\t/** Returns all entity effects */\n\tstd::map<cEntityEffect::eType, cEntityEffect *> GetEntityEffects() const;\n\n\t/** Returns the entity effect, if it is currently applied or nullptr if not. */\n\tcEntityEffect * GetEntityEffect(cEntityEffect::eType a_EffectType) const;\n\n\t// tolua_begin\n\n\tstatic bool FindTeleportDestination(cWorld & a_World, const int a_HeightRequired, const unsigned int a_NumTries, Vector3d & a_Destination, const Vector3i a_MinBoxCorner, const Vector3i a_MaxBoxCorner);\n\n\tstatic bool FindTeleportDestination(cWorld & a_World, const int a_HeightRequired, const unsigned int a_NumTries, Vector3d & a_Destination, const cBoundingBox a_BoundingBox);\n\n\t/** Used by enderman and chorus fruit.\n\tChecks for valid destinations in a cube of length 2 * a_HalfCubeWidth centred at a_Centre.\n\tReturns true and places destination in a_Destination if successful.\n\tReturns false if destination could be found after a_NumTries attempts.\n\tDetails at: https://minecraft.wiki/w/Enderman#Teleportation. */\n\tstatic bool FindTeleportDestination(cWorld & a_World, const int a_HeightRequired, const unsigned int a_NumTries, Vector3d & a_Destination, Vector3i a_Centre, const int a_HalfCubeWidth);\n\n\t// tolua_end\n\nprotected:\n\n\ttypedef std::map<cEntityEffect::eType, std::unique_ptr<cEntityEffect>> tEffectMap;\n\ttEffectMap m_EntityEffects;\n\n\tdouble m_LastGroundHeight;\n\tbool m_bTouchGround;\n\n\tvirtual void ResetPosition(Vector3d a_NewPosition) override;\n\nprivate:\n\n\t/** A list of all monsters that are targeting this pawn. */\n\tstd::vector<cMonster*> m_TargetingMe;\n\n\t/** Attempt to activate a Totem of Undying.\n\tIf activation for the given type of damage was successful, consumes the totem and returns true. */\n\tbool DeductTotem(eDamageType a_DamageType);\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/Pickup.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#ifndef _WIN32\n#include <cstdlib>\n#endif\n\n#include \"Pickup.h\"\n#include \"Player.h\"\n#include \"../Mobs/Villager.h\"\n#include \"../ClientHandle.h\"\n#include \"../World.h\"\n#include \"../Server.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../Registries/Items.h\"\n#include \"../Root.h\"\n#include \"../Chunk.h\"\n\n\n\n\nclass cPickupCombiningCallback\n{\npublic:\n\tcPickupCombiningCallback(Vector3d a_Position, cPickup * a_Pickup) :\n\t\tm_FoundMatchingPickup(false),\n\t\tm_Position(a_Position),\n\t\tm_Pickup(a_Pickup)\n\t{\n\t}\n\n\tbool operator () (cEntity & a_Entity)\n\t{\n\t\tASSERT(a_Entity.IsTicking());\n\t\tif (!a_Entity.IsPickup() || (a_Entity.GetUniqueID() <= m_Pickup->GetUniqueID()) || !a_Entity.IsOnGround())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\n\t\tVector3d EntityPos = a_Entity.GetPosition();\n\t\tdouble Distance = (EntityPos - m_Position).Length();\n\n\t\tauto & OtherPickup = static_cast<cPickup &>(a_Entity);\n\t\tcItem & Item = OtherPickup.GetItem();\n\t\tif ((Distance < 1.2) && Item.IsEqual(m_Pickup->GetItem()) && OtherPickup.CanCombine())\n\t\t{\n\t\t\tshort CombineCount = static_cast<short>(Item.m_ItemCount);\n\t\t\tif ((CombineCount + static_cast<short>(m_Pickup->GetItem().m_ItemCount)) > static_cast<short>(Item.GetMaxStackSize()))\n\t\t\t{\n\t\t\t\tCombineCount = Item.GetMaxStackSize() - m_Pickup->GetItem().m_ItemCount;\n\t\t\t}\n\n\t\t\tif (CombineCount <= 0)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tm_Pickup->GetItem().AddCount(static_cast<char>(CombineCount));\n\t\t\tItem.m_ItemCount -= static_cast<char>(CombineCount);\n\n\t\t\tif (Item.m_ItemCount <= 0)\n\t\t\t{\n\t\t\t\ta_Entity.GetWorld()->BroadcastCollectEntity(a_Entity, *m_Pickup, static_cast<unsigned>(CombineCount));\n\t\t\t\ta_Entity.Destroy();\n\n\t\t\t\t// Reset the timer\n\t\t\t\tm_Pickup->SetAge(0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ta_Entity.GetWorld()->BroadcastEntityMetadata(a_Entity);\n\t\t\t}\n\t\t\tm_FoundMatchingPickup = true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tinline bool FoundMatchingPickup()\n\t{\n\t\treturn m_FoundMatchingPickup;\n\t}\n\nprotected:\n\tbool m_FoundMatchingPickup;\n\n\tVector3d m_Position;\n\tcPickup * m_Pickup;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPickup:\n\ncPickup::cPickup(Vector3d a_Pos, const cItem & a_Item, bool IsPlayerCreated, Vector3f a_Speed, int a_LifetimeTicks, bool a_CanCombine):\n\tSuper(etPickup, a_Pos, 0.25f, 0.25f),\n\tm_Timer(0),\n\tm_Item(a_Item),\n\tm_bCollected(false),\n\tm_bIsPlayerCreated(IsPlayerCreated),\n\tm_bCanCombine(a_CanCombine),\n\tm_Lifetime(cTickTime(a_LifetimeTicks))\n{\n\tSetGravity(-16.0f);\n\tSetAirDrag(0.02f);\n\tSetMaxHealth(5);\n\tSetHealth(5);\n\tSetSpeed(a_Speed);\n}\n\n\n\n\n\nvoid cPickup::SpawnOn(cClientHandle & a_Client)\n{\n\ta_Client.SendSpawnEntity(*this);\n\ta_Client.SendEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cPickup::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\tBroadcastMovementUpdate();  // Notify clients of position\n\n\tm_Timer += a_Dt;\n\n\tif (!m_bCollected)\n\t{\n\t\tint BlockY = POSY_TOINT;\n\t\tint BlockX = POSX_TOINT;\n\t\tint BlockZ = POSZ_TOINT;\n\n\t\tif ((BlockY >= 0) && (BlockY < cChunkDef::Height))  // Don't do anything except for falling when outside the world\n\t\t{\n\t\t\t// Position might have changed due to physics. So we have to make sure we have the correct chunk.\n\t\t\tGET_AND_VERIFY_CURRENT_CHUNK(CurrentChunk, BlockX, BlockZ);\n\n\t\t\t// Destroy the pickup if it is on fire:\n\t\t\tif (IsOnFire())\n\t\t\t{\n\t\t\t\tm_bCollected = true;\n\t\t\t\tm_Timer = std::chrono::milliseconds(0);  // We have to reset the timer.\n\t\t\t\tm_Timer += a_Dt;  // In case we have to destroy the pickup in the same tick.\n\t\t\t\tif (m_Timer > std::chrono::milliseconds(500))\n\t\t\t\t{\n\t\t\t\t\tDestroy();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to combine the pickup with adjacent same-item pickups:\n\t\t\tif ((m_Item.m_ItemCount < m_Item.GetMaxStackSize()) && IsOnGround() && CanCombine())  // Don't combine if already full or not on ground\n\t\t\t{\n\t\t\t\t// By using a_Chunk's ForEachEntity() instead of cWorld's, pickups don't combine across chunk boundaries.\n\t\t\t\t// That is a small price to pay for not having to traverse the entire world for each entity.\n\t\t\t\t// The speedup in the tick thread is quite considerable.\n\t\t\t\tcPickupCombiningCallback PickupCombiningCallback(GetPosition(), this);\n\t\t\t\ta_Chunk.ForEachEntity(PickupCombiningCallback);\n\t\t\t\tif (PickupCombiningCallback.FoundMatchingPickup())\n\t\t\t\t{\n\t\t\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (m_Timer > std::chrono::milliseconds(500))  // 0.5 second\n\t\t{\n\t\t\tDestroy();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (m_Timer > m_Lifetime)\n\t{\n\t\tDestroy();\n\t\treturn;\n\t}\n}\n\n\n\n\n\nbool cPickup::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (a_TDI.DamageType == dtCactusContact)\n\t{\n\t\tDestroy();\n\t\treturn true;\n\t}\n\n\treturn Super::DoTakeDamage(a_TDI);\n}\n\n\n\n\n\nbool cPickup::CollectedBy(cEntity & a_Dest)\n{\n\tif (m_bCollected)\n\t{\n\t\t// LOG(\"Pickup %d cannot be collected by \\\"%s\\\", because it has already been collected.\", m_UniqueID, a_Dest->GetName().c_str());\n\t\treturn false;  // It's already collected!\n\t}\n\n\t// This type of entity can't pickup items\n\tif (!a_Dest.IsPawn())\n\t{\n\t\treturn false;\n\t}\n\n\t// Two seconds if player created the pickup (vomiting), half a second if anything else\n\tif (m_Timer < (m_bIsPlayerCreated ? std::chrono::seconds(2) : std::chrono::milliseconds(500)))\n\t{\n\t\t// LOG(\"Pickup %d cannot be collected by \\\"%s\\\", because it is not old enough.\", m_UniqueID, a_Dest->GetName().c_str());\n\t\treturn false;  // Not old enough\n\t}\n\n\t// Checking for villagers\n\tif (!a_Dest.IsPlayer() && a_Dest.IsMob())\n\t{\n\n\t\tauto & Mob = static_cast<cMonster &>(a_Dest);\n\t\tif (Mob.GetMobType() == mtVillager)\n\t\t{\n\t\t\t// Villagers only pickup food\n\t\t\tif (!ItemCategory::IsVillagerFood(m_Item.m_ItemType))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tauto & Villager = static_cast<cVillager &>(Mob);\n\t\t\tchar NumAdded = Villager.GetInventory().AddItem(m_Item);\n\t\t\tif (NumAdded > 0)\n\t\t\t{\n\t\t\t\tm_Item.m_ItemCount -= NumAdded;\n\t\t\t\tm_World->BroadcastCollectEntity(*this, a_Dest, static_cast<unsigned>(NumAdded));\n\n\t\t\t\t// Also send the \"pop\" sound effect with a somewhat random pitch (fast-random using EntityID ;)\n\t\t\t\tm_World->BroadcastSoundEffect(\"entity.item.pickup\", GetPosition(), 0.3f, (1.2f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));\n\t\t\t\tif (m_Item.m_ItemCount <= 0)\n\t\t\t\t{\n\t\t\t\t\t// All of the pickup has been collected, schedule the pickup for destroying\n\t\t\t\t\tm_bCollected = true;\n\t\t\t\t}\n\t\t\t\tm_Timer = std::chrono::milliseconds(0);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Pickup cannot be collected because the entity has not enough space\n\t\t\treturn false;\n\t\t}\n\t}\n\telse if (a_Dest.IsPlayer())\n\t{\n\t\tauto & Player = static_cast<cPlayer &>(a_Dest);\n\n\t\t// If the player is a spectator, he cannot collect anything\n\t\tif (Player.IsGameModeSpectator())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (cRoot::Get()->GetPluginManager()->CallHookCollectingPickup(Player, *this))\n\t\t{\n\t\t\t// LOG(\"Pickup %d cannot be collected by \\\"%s\\\", because a plugin has said no.\", m_UniqueID, a_Dest->GetName().c_str());\n\t\t\treturn false;\n\t\t}\n\n\t\tchar NumAdded = Player.GetInventory().AddItem(m_Item);\n\t\tif (NumAdded > 0)\n\t\t{\n\t\t\t// Check achievements\n\t\t\tswitch (m_Item.m_ItemType)\n\t\t\t{\n\t\t\t\tcase E_BLOCK_LOG:      Player.AwardAchievement(CustomStatistic::AchMineWood); break;\n\t\t\t\tcase E_ITEM_LEATHER:   Player.AwardAchievement(CustomStatistic::AchKillCow);  break;\n\t\t\t\tcase E_ITEM_DIAMOND:   Player.AwardAchievement(CustomStatistic::AchDiamonds); break;\n\t\t\t\tcase E_ITEM_BLAZE_ROD: Player.AwardAchievement(CustomStatistic::AchBlazeRod); break;\n\t\t\t\tdefault: break;\n\t\t\t}\n\n\t\t\tm_Item.m_ItemCount -= NumAdded;\n\t\t\tm_World->BroadcastCollectEntity(*this, a_Dest, static_cast<unsigned>(NumAdded));\n\n\t\t\t// Also send the \"pop\" sound effect with a somewhat random pitch (fast-random using EntityID ;)\n\t\t\tm_World->BroadcastSoundEffect(\"entity.item.pickup\", GetPosition(), 0.3f, (1.2f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));\n\t\t\tif (m_Item.m_ItemCount <= 0)\n\t\t\t{\n\t\t\t\t// All of the pickup has been collected, schedule the pickup for destroying\n\t\t\t\tm_bCollected = true;\n\t\t\t}\n\t\t\tm_Timer = std::chrono::milliseconds(0);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// LOG(\"Pickup %d cannot be collected by \\\"%s\\\", because there's no space in the inventory.\", a_Dest->GetName().c_str(), m_UniqueID);\n\treturn false;\n}\n"
  },
  {
    "path": "src/Entities/Pickup.h",
    "content": "\n#pragma once\n\n#include \"Entity.h\"\n#include \"../Item.h\"\n\n\n\n\n\nclass cPlayer;\n\n\n\n\n\n// tolua_begin\nclass cPickup :\n\tpublic cEntity\n{\n\t// tolua_end\n\n\tusing Super = cEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cPickup)\n\n\tcPickup(Vector3d a_Pos, const cItem & a_Item, bool IsPlayerCreated, Vector3f a_Speed = Vector3f(), int a_LifetimeTicks = 6000, bool a_CanCombine = true);\n\n\tcItem &       GetItem(void)       {return m_Item; }  // tolua_export\n\tconst cItem & GetItem(void) const {return m_Item; }\n\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\n\tbool CollectedBy(cEntity & a_Dest);  // tolua_export\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\n\tvirtual bool DoesPreventBlockPlacement(void) const override { return false; }\n\n\t/** Returns whether this pickup is allowed to combine with other similar pickups */\n\tbool CanCombine(void) const { return m_bCanCombine; }  // tolua_export\n\n\t/** Sets whether this pickup is allowed to combine with other similar pickups */\n\tvoid SetCanCombine(bool a_CanCombine) { m_bCanCombine = a_CanCombine; }  // tolua_export\n\n\t/** Returns the number of ticks that this entity has existed */\n\tint GetAge(void) const { return std::chrono::duration_cast<cTickTime>(m_Timer).count(); }     // tolua_export\n\n\t/** Set the number of ticks that this entity has existed */\n\tvoid SetAge(int a_Age) { m_Timer = cTickTime(a_Age); }  // tolua_export\n\n\t/** Returns the number of ticks that this pickup should live for */\n\tint GetLifetime(void) const { return std::chrono::duration_cast<cTickTime>(m_Lifetime).count(); }  // tolua_export\n\n\t/** Set the number of ticks that this pickup should live for */\n\tvoid SetLifetime(int a_Lifetime) { m_Lifetime = cTickTime(a_Lifetime); }  // tolua_export\n\n\t/** Returns true if the pickup has already been collected */\n\tbool IsCollected(void) const { return m_bCollected; }  // tolua_export\n\n\t/** Returns true if created by player (i.e. vomiting), used for determining picking-up delay time */\n\tbool IsPlayerCreated(void) const { return m_bIsPlayerCreated; }  // tolua_export\n\nprivate:\n\n\t/** The number of ticks that the entity has existed / timer between collect and destroy; in msec */\n\tstd::chrono::milliseconds m_Timer;\n\n\tcItem m_Item;\n\n\tbool m_bCollected;\n\n\tbool m_bIsPlayerCreated;\n\n\tbool m_bCanCombine;\n\n\tstd::chrono::milliseconds m_Lifetime;\n};  // tolua_export\n"
  },
  {
    "path": "src/Entities/Player.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Player.h\"\n#include \"../Mobs/Wolf.h\"\n#include \"../Mobs/Horse.h\"\n#include \"../BoundingBox.h\"\n#include \"../ChatColor.h\"\n#include \"../Server.h\"\n#include \"../UI/InventoryWindow.h\"\n#include \"../UI/WindowOwner.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../BlockEntities/BlockEntity.h\"\n#include \"../BlockEntities/EnderChestEntity.h\"\n#include \"../Root.h\"\n#include \"../Chunk.h\"\n#include \"../Items/ItemHandler.h\"\n#include \"../FastRandom.h\"\n#include \"../ClientHandle.h\"\n\n#include \"../WorldStorage/StatisticsSerializer.h\"\n#include \"../CompositeChat.h\"\n\n#include \"../Blocks/BlockHandler.h\"\n#include \"../Blocks/BlockSlab.h\"\n#include \"../Blocks/ChunkInterface.h\"\n\n#include \"../IniFile.h\"\n#include \"../JsonUtils.h\"\n#include \"json/json.h\"\n\n#include \"../CraftingRecipes.h\"\n\n\n\n\n\nnamespace\n{\n\n/** Returns the folder for the player data based on the UUID given.\nThis can be used both for online and offline UUIDs. */\nAString GetUUIDFolderName(const cUUID & a_Uuid)\n{\n\tAString UUID = a_Uuid.ToShortString();\n\n\tAString res(\"players/\");\n\tres.append(UUID, 0, 2);\n\tres.push_back('/');\n\treturn res;\n}\n\n}  // namespace (anonymous)\n\n\n\n\n\nconst int cPlayer::MAX_HEALTH = 20;\n\nconst int cPlayer::MAX_FOOD_LEVEL = 20;\n\n// Number of ticks it takes to eat an item.\n#define EATING_TICKS 30_tick\n\n// 6000 ticks or 5 minutes\n#define PLAYER_INVENTORY_SAVE_INTERVAL 6000\n\n// Food saturation for newly-joined or just-respawned players.\n#define RESPAWN_FOOD_SATURATION 5\n\n#define XP_TO_LEVEL15 255\n#define XP_PER_LEVEL_TO15 17\n#define XP_TO_LEVEL30 825\n\n\n\n\n\ncPlayer::BodyStanceCrouching::BodyStanceCrouching(cPlayer & a_Player)\n{\n\ta_Player.SetSize(0.6f, 1.65f);\n}\n\n\n\n\n\ncPlayer::BodyStanceSleeping::BodyStanceSleeping(cPlayer & a_Player)\n{\n\ta_Player.SetSize(0.2f, 0.2f);\n}\n\n\n\n\n\ncPlayer::BodyStanceStanding::BodyStanceStanding(cPlayer & a_Player)\n{\n\ta_Player.SetSize(0.6f, 1.8f);\n}\n\n\n\n\n\ncPlayer::BodyStanceGliding::BodyStanceGliding(cPlayer & a_Player) :\n\tTicksElytraFlying(0)\n{\n\ta_Player.SetSize(0.6f, 0.6f);\n}\n\n\n\n\n\ncPlayer::cPlayer(const std::shared_ptr<cClientHandle> & a_Client) :\n\tSuper(etPlayer, 0.6f, 1.8f),\n\tm_BodyStance(BodyStanceStanding(*this)),\n\tm_Inventory(*this),\n\tm_EnderChestContents(9, 3),\n\tm_DefaultWorldPath(cRoot::Get()->GetDefaultWorld()->GetDataPath()),\n\tm_ClientHandle(a_Client),\n\tm_NormalMaxSpeed(1.0),\n\tm_SprintingMaxSpeed(1.3),\n\tm_FlyingMaxSpeed(1.0),\n\tm_IsChargingBow(false),\n\tm_IsFishing(false),\n\tm_IsFrozen(false),\n\tm_IsLeftHanded(false),\n\tm_IsTeleporting(false),\n\tm_EatingFinishTick(-1),\n\tm_BowCharge(0),\n\tm_FloaterID(cEntity::INVALID_ID),\n\tm_Team(nullptr),\n\tm_Spectating(nullptr),\n\tm_TicksUntilNextSave(PLAYER_INVENTORY_SAVE_INTERVAL),\n\tm_SkinParts(0)\n{\n\tASSERT(GetName().length() <= 16);  // Otherwise this player could crash many clients...\n\n\tm_InventoryWindow = new cInventoryWindow(*this);\n\tm_CurrentWindow = m_InventoryWindow;\n\tm_InventoryWindow->OpenedByPlayer(*this);\n\n\tLoadFromDisk();\n\tSetMaxHealth(MAX_HEALTH);\n\tUpdateCapabilities();  // Only required for plugins listening to HOOK_SPAWNING_ENTITY to not read uninitialised variables.\n}\n\n\n\n\n\ncPlayer::~cPlayer(void)\n{\n\tLOGD(\"Deleting cPlayer \\\"%s\\\" at %p, ID %d\", GetName().c_str(), static_cast<void *>(this), GetUniqueID());\n\n\t// \"Times ragequit\":\n\tm_Stats.Custom[CustomStatistic::LeaveGame]++;\n\n\tSaveToDisk();\n\n\tdelete m_InventoryWindow;\n\n\tLOGD(\"Player %p deleted\", static_cast<void *>(this));\n}\n\n\n\n\n\nvoid cPlayer::OnLoseSpectated()\n{\n\tm_ClientHandle->SendCameraSetTo(*this);\n\tm_ClientHandle->SendPlayerMoveLook();\n\tm_Spectating = nullptr;\n}\n\n\n\n\n\nint cPlayer::CalcLevelFromXp(int a_XpTotal)\n{\n\t// level 0 to 15\n\tif (a_XpTotal <= XP_TO_LEVEL15)\n\t{\n\t\treturn a_XpTotal / XP_PER_LEVEL_TO15;\n\t}\n\n\t// level 30+\n\tif (a_XpTotal > XP_TO_LEVEL30)\n\t{\n\t\treturn static_cast<int>((151.5 + sqrt( 22952.25 - (14 * (2220 - a_XpTotal)))) / 7);\n\t}\n\n\t// level 16 to 30\n\treturn static_cast<int>((29.5 + sqrt( 870.25 - (6 * ( 360 - a_XpTotal)))) / 3);\n}\n\n\n\n\n\nconst std::set<UInt32> & cPlayer::GetKnownRecipes() const\n{\n\treturn m_KnownRecipes;\n}\n\n\n\n\n\nint cPlayer::XpForLevel(int a_Level)\n{\n\t// level 0 to 15\n\tif (a_Level <= 15)\n\t{\n\t\treturn a_Level * XP_PER_LEVEL_TO15;\n\t}\n\n\t// level 30+\n\tif (a_Level >= 31)\n\t{\n\t\treturn static_cast<int>((3.5 * a_Level * a_Level) - (151.5 * a_Level) + 2220);\n\t}\n\n\t// level 16 to 30\n\treturn static_cast<int>((1.5 * a_Level * a_Level) - (29.5 * a_Level) + 360);\n}\n\n\n\n\n\nint cPlayer::GetXpLevel() const\n{\n\treturn CalcLevelFromXp(m_CurrentXp);\n}\n\n\n\n\n\nfloat cPlayer::GetXpPercentage() const\n{\n\tint currentLevel = CalcLevelFromXp(m_CurrentXp);\n\tint currentLevel_XpBase = XpForLevel(currentLevel);\n\n\treturn static_cast<float>(m_CurrentXp - currentLevel_XpBase) /\n\t\tstatic_cast<float>(XpForLevel(1 + currentLevel) - currentLevel_XpBase);\n}\n\n\n\n\n\nbool cPlayer::SetCurrentExperience(int a_CurrentXp)\n{\n\tif (!(a_CurrentXp >= 0) || (a_CurrentXp > (std::numeric_limits<int>::max() - m_LifetimeTotalXp)))\n\t{\n\t\tLOGWARNING(\"Tried to update experiece with an invalid Xp value: %d\", a_CurrentXp);\n\t\treturn false;  // oops, they gave us a dodgey number\n\t}\n\n\tm_CurrentXp = a_CurrentXp;\n\n\t// Update experience:\n\tm_ClientHandle->SendExperience();\n\n\treturn true;\n}\n\n\n\n\n\nint cPlayer::DeltaExperience(int a_Xp_delta)\n{\n\tif (a_Xp_delta > (std::numeric_limits<int>().max() - m_CurrentXp))\n\t{\n\t\t// Value was bad, abort and report\n\t\tLOGWARNING(\"Attempt was made to increment Xp by %d, which overflowed the int datatype. Ignoring.\", a_Xp_delta);\n\t\treturn -1;  // Should we instead just return the current Xp?\n\t}\n\n\tm_CurrentXp += a_Xp_delta;\n\n\t// Make sure they didn't subtract too much\n\tm_CurrentXp = std::max(m_CurrentXp, 0);\n\n\n\t// Update total for score calculation\n\tif (a_Xp_delta > 0)\n\t{\n\t\tm_LifetimeTotalXp += a_Xp_delta;\n\t}\n\n\tLOGD(\"Player \\\"%s\\\" gained / lost %d experience, total is now: %d\", GetName().c_str(), a_Xp_delta, m_CurrentXp);\n\n\t// Set experience to be updated:\n\tm_ClientHandle->SendExperience();\n\n\treturn m_CurrentXp;\n}\n\n\n\n\n\nvoid cPlayer::StartChargingBow(void)\n{\n\tLOGD(\"Player \\\"%s\\\" started charging their bow\", GetName().c_str());\n\tm_IsChargingBow = true;\n\tm_BowCharge = 0;\n\tm_World->BroadcastEntityMetadata(*this, m_ClientHandle.get());\n}\n\n\n\n\n\nint cPlayer::FinishChargingBow(void)\n{\n\tLOGD(\"Player \\\"%s\\\" finished charging their bow at a charge of %d\", GetName().c_str(), m_BowCharge);\n\tint res = m_BowCharge;\n\tm_IsChargingBow = false;\n\tm_BowCharge = 0;\n\tm_World->BroadcastEntityMetadata(*this, m_ClientHandle.get());\n\n\treturn res;\n}\n\n\n\n\n\nvoid cPlayer::CancelChargingBow(void)\n{\n\tLOGD(\"Player \\\"%s\\\" cancelled charging their bow at a charge of %d\", GetName().c_str(), m_BowCharge);\n\tm_IsChargingBow = false;\n\tm_BowCharge = 0;\n\tm_World->BroadcastEntityMetadata(*this, m_ClientHandle.get());\n}\n\n\n\n\n\nvoid cPlayer::SetTouchGround(bool a_bTouchGround)\n{\n\tif (IsGameModeSpectator())  // You can fly through the ground in Spectator\n\t{\n\t\treturn;\n\t}\n\n\tUNUSED(a_bTouchGround);\n\t/* Unfortunately whatever the reason, there are still desyncs in on-ground status between the client and server. For example:\n\t\t1. Walking off a ledge (whatever height)\n\t\t2. Initial login\n\tThus, it is too risky to compare their value against ours and kick them for hacking */\n}\n\n\n\n\n\nvoid cPlayer::Heal(int a_Health)\n{\n\tSuper::Heal(a_Health);\n\tm_ClientHandle->SendHealth();\n}\n\n\n\n\n\nvoid cPlayer::SetFoodLevel(int a_FoodLevel)\n{\n\tint FoodLevel = Clamp(a_FoodLevel, 0, MAX_FOOD_LEVEL);\n\n\tif (cRoot::Get()->GetPluginManager()->CallHookPlayerFoodLevelChange(*this, FoodLevel))\n\t{\n\t\treturn;\n\t}\n\n\tm_FoodLevel = FoodLevel;\n\tm_ClientHandle->SendHealth();\n}\n\n\n\n\n\nvoid cPlayer::SetFoodSaturationLevel(double a_FoodSaturationLevel)\n{\n\tm_FoodSaturationLevel = Clamp(a_FoodSaturationLevel, 0.0, static_cast<double>(m_FoodLevel));\n}\n\n\n\n\n\nvoid cPlayer::SetFoodTickTimer(int a_FoodTickTimer)\n{\n\tm_FoodTickTimer = a_FoodTickTimer;\n}\n\n\n\n\n\nvoid cPlayer::SetFoodExhaustionLevel(double a_FoodExhaustionLevel)\n{\n\tm_FoodExhaustionLevel = Clamp(a_FoodExhaustionLevel, 0.0, 40.0);\n}\n\n\n\n\n\nbool cPlayer::Feed(int a_Food, double a_Saturation)\n{\n\tif (IsSatiated())\n\t{\n\t\treturn false;\n\t}\n\n\tSetFoodSaturationLevel(m_FoodSaturationLevel + a_Saturation);\n\tSetFoodLevel(m_FoodLevel + a_Food);\n\treturn true;\n}\n\n\n\n\n\nvoid cPlayer::AddFoodExhaustion(double a_Exhaustion)\n{\n\tif (!(IsGameModeCreative() || IsGameModeSpectator()))\n\t{\n\t\tm_FoodExhaustionLevel = std::min(m_FoodExhaustionLevel + a_Exhaustion, 40.0);\n\t}\n}\n\n\n\n\n\nbool cPlayer::IsInBed(void) const\n{\n\treturn std::holds_alternative<BodyStanceSleeping>(m_BodyStance);\n}\n\n\n\n\n\nbool cPlayer::IsLeftHanded() const\n{\n\treturn m_IsLeftHanded;\n}\n\n\n\n\n\nbool cPlayer::IsStanding() const\n{\n\treturn std::holds_alternative<BodyStanceStanding>(m_BodyStance);\n}\n\n\n\n\n\nvoid cPlayer::TossItems(const cItems & a_Items)\n{\n\tif (IsGameModeSpectator())  // Players can't toss items in spectator\n\t{\n\t\treturn;\n\t}\n\n\tm_Stats.Custom[CustomStatistic::Drop] += static_cast<StatisticsManager::StatValue>(a_Items.Size());\n\n\tconst auto Speed = (GetLookVector() + Vector3d(0, 0.2, 0)) * 6;  // A dash of height and a dollop of speed\n\tconst auto Position = GetEyePosition() - Vector3d(0, 0.2, 0);  // Correct for eye-height weirdness\n\tm_World->SpawnItemPickups(a_Items, Position, Speed, true);  // 'true' because created by player\n}\n\n\n\n\n\nvoid cPlayer::SetIsInBed(const bool a_GoToBed)\n{\n\tif (a_GoToBed && IsStanding())\n\t{\n\t\tm_BodyStance = BodyStanceSleeping(*this);\n\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::PlayerEntersBed);\n\t}\n\telse if (!a_GoToBed && IsInBed())\n\t{\n\t\tm_BodyStance = BodyStanceStanding(*this);\n\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::PlayerLeavesBed);\n\t}\n}\n\n\n\n\n\nvoid cPlayer::StartEating(void)\n{\n\t// Set the timer:\n\tm_EatingFinishTick = m_World->GetWorldAge() + EATING_TICKS;\n\n\t// Send the packet:\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cPlayer::FinishEating(void)\n{\n\t// Reset the timer:\n\tm_EatingFinishTick = -1_tick;\n\n\t// Send the packets:\n\tm_ClientHandle->SendEntityAnimation(*this, EntityAnimation::PlayerFinishesEating);\n\tm_World->BroadcastEntityMetadata(*this);\n\n\t// consume the item:\n\tcItem Item(GetEquippedItem());\n\tItem.m_ItemCount = 1;\n\tauto & ItemHandler = Item.GetHandler();\n\tif (!ItemHandler.EatItem(this, &Item))\n\t{\n\t\treturn;\n\t}\n\tItemHandler.OnFoodEaten(m_World, this, &Item);\n}\n\n\n\n\n\nvoid cPlayer::AbortEating(void)\n{\n\tm_EatingFinishTick = -1_tick;\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cPlayer::ClearInventoryPaintSlots(void)\n{\n\t// Clear the list of slots that are being inventory-painted. Used by cWindow only\n\tm_InventoryPaintSlots.clear();\n}\n\n\n\n\n\nvoid cPlayer::AddInventoryPaintSlot(int a_SlotNum)\n{\n\t// Add a slot to the list for inventory painting. Used by cWindow only\n\tm_InventoryPaintSlots.push_back(a_SlotNum);\n}\n\n\n\n\n\nconst cSlotNums & cPlayer::GetInventoryPaintSlots(void) const\n{\n\t// Return the list of slots currently stored for inventory painting. Used by cWindow only\n\treturn m_InventoryPaintSlots;\n}\n\n\n\n\n\ndouble cPlayer::GetMaxSpeed(void) const\n{\n\tif (IsFlying())\n\t{\n\t\treturn m_FlyingMaxSpeed;\n\t}\n\telse if (IsSprinting())\n\t{\n\t\treturn m_SprintingMaxSpeed;\n\t}\n\telse\n\t{\n\t\treturn m_NormalMaxSpeed;\n\t}\n}\n\n\n\n\n\nvoid cPlayer::SetNormalMaxSpeed(double a_Speed)\n{\n\tm_NormalMaxSpeed = a_Speed;\n\n\tif (!m_IsFrozen)\n\t{\n\t\t// If we are frozen, we do not send this yet. We send when unfreeze() is called\n\t\tm_World->BroadcastEntityProperties(*this);\n\t}\n}\n\n\n\n\n\nvoid cPlayer::SetSprintingMaxSpeed(double a_Speed)\n{\n\tm_SprintingMaxSpeed = a_Speed;\n\n\tif (!m_IsFrozen)\n\t{\n\t\t// If we are frozen, we do not send this yet. We send when unfreeze() is called\n\t\tm_World->BroadcastEntityProperties(*this);\n\t}\n}\n\n\n\n\n\nvoid cPlayer::SetFlyingMaxSpeed(double a_Speed)\n{\n\tm_FlyingMaxSpeed = a_Speed;\n\n\tif (!m_IsFrozen)\n\t{\n\t\t// If we are frozen, we do not send this yet. We send when unfreeze() is called\n\t\tm_ClientHandle->SendPlayerAbilities();\n\t}\n}\n\n\n\n\n\nvoid cPlayer::SetCrouch(const bool a_ShouldCrouch)\n{\n\tif (a_ShouldCrouch && IsStanding())\n\t{\n\t\tm_BodyStance = BodyStanceCrouching(*this);\n\n\t\t// Handle spectator mode detach:\n\t\tif (IsGameModeSpectator())\n\t\t{\n\t\t\tSpectateEntity(nullptr);\n\t\t}\n\n\t\tcRoot::Get()->GetPluginManager()->CallHookPlayerCrouched(*this);\n\t}\n\telse if (!a_ShouldCrouch && IsCrouched())\n\t{\n\t\tm_BodyStance = BodyStanceStanding(*this);\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cPlayer::SetElytraFlight(const bool a_ShouldElytraFly)\n{\n\tif (a_ShouldElytraFly && IsStanding() && !IsOnGround() && !IsInWater() && !IsRiding() && (GetEquippedChestplate().m_ItemType == E_ITEM_ELYTRA))\n\t{\n\t\tm_BodyStance = BodyStanceGliding(*this);\n\t}\n\telse if (!a_ShouldElytraFly && IsElytraFlying())\n\t{\n\t\tm_BodyStance = BodyStanceStanding(*this);\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cPlayer::SetFlying(const bool a_ShouldFly)\n{\n\tif (a_ShouldFly == m_IsFlying)\n\t{\n\t\treturn;\n\t}\n\n\tm_IsFlying = a_ShouldFly;\n\tif (!m_IsFrozen)\n\t{\n\t\t// If we are frozen, we do not send this yet. We send when unfreeze() is called\n\t\tm_ClientHandle->SendPlayerAbilities();\n\t}\n}\n\n\n\n\n\nvoid cPlayer::SetLeftHanded(const bool a_IsLeftHanded)\n{\n\tm_IsLeftHanded = a_IsLeftHanded;\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cPlayer::SetSprint(const bool a_ShouldSprint)\n{\n\tif (a_ShouldSprint && IsStanding())\n\t{\n\t\tm_BodyStance = BodyStanceSprinting();\n\t}\n\telse if (!a_ShouldSprint && IsSprinting())\n\t{\n\t\tm_BodyStance = BodyStanceStanding(*this);\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n\tm_World->BroadcastEntityProperties(*this);\n}\n\n\n\n\n\nvoid cPlayer::SetCanFly(bool a_CanFly)\n{\n\tif (a_CanFly == m_IsFlightCapable)\n\t{\n\t\treturn;\n\t}\n\n\tm_IsFlightCapable = a_CanFly;\n\tm_ClientHandle->SendPlayerAbilities();\n}\n\n\n\n\n\nvoid cPlayer::SetCustomName(const AString & a_CustomName)\n{\n\tif (m_CustomName == a_CustomName)\n\t{\n\t\treturn;\n\t}\n\n\tm_World->BroadcastPlayerListRemovePlayer(*this);\n\n\tm_CustomName = a_CustomName;\n\tif (m_CustomName.length() > 16)\n\t{\n\t\tm_CustomName = m_CustomName.substr(0, 16);\n\t}\n\n\tm_World->BroadcastPlayerListAddPlayer(*this);\n\tm_World->BroadcastSpawnEntity(*this, m_ClientHandle.get());\n}\n\n\n\n\n\nvoid cPlayer::SetBedPos(const Vector3i a_Position)\n{\n\tSetBedPos(a_Position, *m_World);\n}\n\n\n\n\n\nvoid cPlayer::SetBedPos(const Vector3i a_Position, const cWorld & a_World)\n{\n\tm_RespawnPosition = a_Position;\n\tm_IsRespawnPointForced = false;\n\tm_SpawnWorldName = a_World.GetName();\n}\n\n\n\n\n\nvoid cPlayer::SetRespawnPosition(const Vector3i a_Position, const cWorld & a_World)\n{\n\tm_RespawnPosition = a_Position;\n\tm_IsRespawnPointForced = true;\n\tm_SpawnWorldName = a_World.GetName();\n}\n\n\n\n\n\ncWorld * cPlayer::GetRespawnWorld()\n{\n\tif (const auto World = cRoot::Get()->GetWorld(m_SpawnWorldName); World != nullptr)\n\t{\n\t\treturn World;\n\t}\n\n\treturn cRoot::Get()->GetDefaultWorld();\n}\n\n\n\n\n\nvoid cPlayer::NotifyNearbyWolves(cPawn * a_Opponent, bool a_IsPlayerInvolved)\n{\n\tASSERT(a_Opponent != nullptr);\n\n\tm_World->ForEachEntityInBox(cBoundingBox(GetPosition(), 16), [&] (cEntity & a_Entity)\n\t\t{\n\t\t\tif (a_Entity.IsMob())\n\t\t\t{\n\t\t\t\tauto & Mob = static_cast<cMonster&>(a_Entity);\n\t\t\t\tif (Mob.GetMobType() == mtWolf)\n\t\t\t\t{\n\t\t\t\t\tauto & Wolf = static_cast<cWolf&>(Mob);\n\t\t\t\t\tWolf.ReceiveNearbyFightInfo(GetUUID(), a_Opponent, a_IsPlayerInvolved);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cPlayer::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\n\tif (m_Health > 0)\n\t{\n\t\treturn;  //  not dead yet =]\n\t}\n\n\tm_IsVisible = false;  // So new clients don't see the player\n\n\t// Detach player from object / entity. If the player dies, the server still says\n\t// that the player is attached to the entity / object\n\tDetach();\n\n\t// Puke out all the items\n\tcItems Pickups;\n\tm_Inventory.CopyToItems(Pickups);\n\tm_Inventory.Clear();\n\n\tif (GetName() == \"Notch\")\n\t{\n\t\tPickups.Add(cItem(E_ITEM_RED_APPLE));\n\t}\n\tm_Stats.Custom[CustomStatistic::Drop] +=  static_cast<StatisticsManager::StatValue>(Pickups.Size());\n\n\tm_World->SpawnItemPickups(Pickups, GetPosX(), GetPosY(), GetPosZ(), 10);\n\tSaveToDisk();  // Save it, yeah the world is a tough place !\n\n\tBroadcastDeathMessage(a_TDI);\n\n\tm_Stats.Custom[CustomStatistic::Deaths]++;\n\tm_Stats.Custom[CustomStatistic::TimeSinceDeath] = 0;\n\n\tm_World->GetScoreBoard().AddPlayerScore(GetName(), cObjective::otDeathCount, 1);\n}\n\n\n\n\n\nvoid cPlayer::Killed(const cEntity & a_Victim, eDamageType a_DamageType)\n{\n\tcScoreboard & ScoreBoard = m_World->GetScoreBoard();\n\n\tif (a_Victim.IsPlayer())\n\t{\n\t\tm_Stats.Custom[CustomStatistic::PlayerKills]++;\n\n\t\tScoreBoard.AddPlayerScore(GetName(), cObjective::otPlayerKillCount, 1);\n\t}\n\telse if (a_Victim.IsMob())\n\t{\n\t\tconst auto & Monster = static_cast<const cMonster &>(a_Victim);\n\n\t\tif (Monster.GetMobFamily() == cMonster::mfHostile)\n\t\t{\n\t\t\tAwardAchievement(CustomStatistic::AchKillEnemy);\n\t\t}\n\n\t\tif ((Monster.GetMobType() == eMonsterType::mtSkeleton) && (a_DamageType == eDamageType::dtRangedAttack))\n\t\t{\n\t\t\tconst double DistX = GetPosX() - Monster.GetPosX();\n\t\t\tconst double DistZ = GetPosZ() - Monster.GetPosZ();\n\n\t\t\tif ((DistX * DistX + DistZ * DistZ) >= 2500.0)\n\t\t\t{\n\t\t\t\tAwardAchievement(CustomStatistic::AchSnipeSkeleton);\n\t\t\t}\n\t\t}\n\n\t\tm_Stats.Custom[CustomStatistic::MobKills]++;\n\t}\n\n\tScoreBoard.AddPlayerScore(GetName(), cObjective::otTotalKillCount, 1);\n}\n\n\n\n\n\nvoid cPlayer::Respawn(void)\n{\n\tASSERT(m_World != nullptr);\n\n\tm_Health = GetMaxHealth();\n\tSetInvulnerableTicks(20);\n\n\t// Reset food level:\n\tm_FoodLevel = MAX_FOOD_LEVEL;\n\tm_FoodSaturationLevel = RESPAWN_FOOD_SATURATION;\n\tm_FoodExhaustionLevel = 0;\n\n\t// Reset Experience\n\tm_CurrentXp = 0;\n\tm_LifetimeTotalXp = 0;\n\t// ToDo: send score to client? How?\n\n\t// Extinguish the fire:\n\tStopBurning();\n\n\t// Disable flying:\n\tSetFlying(false);\n\n\tif (!m_IsRespawnPointForced)\n\t{\n\t\t// Check if the bed is still present:\n\t\tif (GetRespawnWorld()->GetBlock(m_RespawnPosition) != E_BLOCK_BED)\n\t\t{\n\t\t\tconst auto & DefaultWorld = *cRoot::Get()->GetDefaultWorld();\n\n\t\t\t// If not, reset spawn to default and inform:\n\t\t\tSetRespawnPosition(Vector3i(DefaultWorld.GetSpawnX(), DefaultWorld.GetSpawnY(), DefaultWorld.GetSpawnZ()), DefaultWorld);\n\t\t\tSendAboveActionBarMessage(\"Your home bed was missing or obstructed\");\n\t\t}\n\n\t\t// TODO: bed obstruction check here\n\t}\n\n\n\tif (const auto RespawnWorld = GetRespawnWorld(); m_World != RespawnWorld)\n\t{\n\t\tMoveToWorld(*RespawnWorld, m_RespawnPosition, false, false);\n\t}\n\telse\n\t{\n\t\tm_ClientHandle->SendRespawn(m_World->GetDimension(), true);\n\t\tTeleportToCoords(m_RespawnPosition.x, m_RespawnPosition.y, m_RespawnPosition.z);\n\t}\n\n\t// The Notchian client enters a weird glitched state when trying to \"resurrect\" dead players\n\t// To prevent that, destroy the existing client-side entity, and create a new one with the same ID\n\t// This does not make any difference to more modern clients\n\tm_World->BroadcastDestroyEntity(*this, &*m_ClientHandle);\n\tm_World->BroadcastSpawnEntity(*this, &*m_ClientHandle);\n\n\n\tSetVisible(true);\n}\n\n\n\n\n\ndouble cPlayer::GetEyeHeight(void) const\n{\n\treturn GetEyePosition().y - GetPosY();\n}\n\n\n\n\n\nVector3d cPlayer::GetEyePosition(void) const\n{\n\tif (IsCrouched())\n\t{\n\t\treturn GetPosition().addedY(1.54);\n\t}\n\n\tif (IsElytraFlying())\n\t{\n\t\treturn GetPosition().addedY(0.4);\n\t}\n\n\tif (IsInBed())\n\t{\n\t\treturn GetPosition().addedY(0.2);\n\t}\n\n\treturn GetPosition().addedY(1.6);\n}\n\n\n\n\n\nbool cPlayer::IsGameModeCreative(void) const\n{\n\treturn (GetEffectiveGameMode() == gmCreative);\n}\n\n\n\n\n\nbool cPlayer::IsGameModeSurvival(void) const\n{\n\treturn (GetEffectiveGameMode() == gmSurvival);\n}\n\n\n\n\n\nbool cPlayer::IsGameModeAdventure(void) const\n{\n\treturn (GetEffectiveGameMode() == gmAdventure);\n}\n\n\n\n\n\nbool cPlayer::IsGameModeSpectator(void) const\n{\n\treturn (GetEffectiveGameMode() == gmSpectator);\n}\n\n\n\n\n\nbool cPlayer::CanMobsTarget(void) const\n{\n\treturn (IsGameModeSurvival() || IsGameModeAdventure()) && (m_Health > 0);\n}\n\n\n\n\n\nAString cPlayer::GetIP(void) const\n{\n\treturn m_ClientHandle->GetIPString();\n}\n\n\n\n\n\nvoid cPlayer::SetTeam(cTeam * a_Team)\n{\n\tif (m_Team == a_Team)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_Team)\n\t{\n\t\tm_Team->RemovePlayer(GetName());\n\t}\n\n\tm_Team = a_Team;\n\n\tif (m_Team)\n\t{\n\t\tm_Team->AddPlayer(GetName());\n\t}\n}\n\n\n\n\n\ncTeam * cPlayer::UpdateTeam(void)\n{\n\tif (m_World == nullptr)\n\t{\n\t\tSetTeam(nullptr);\n\t}\n\telse\n\t{\n\t\tcScoreboard & Scoreboard = m_World->GetScoreBoard();\n\n\t\tSetTeam(Scoreboard.QueryPlayerTeam(GetName()));\n\t}\n\n\treturn m_Team;\n}\n\n\n\n\n\nvoid cPlayer::OpenWindow(cWindow & a_Window)\n{\n\tif (cRoot::Get()->GetPluginManager()->CallHookPlayerOpeningWindow(*this, a_Window))\n\t{\n\t\treturn;\n\t}\n\n\tif (&a_Window != m_CurrentWindow)\n\t{\n\t\tCloseWindow(false);\n\t}\n\n\ta_Window.OpenedByPlayer(*this);\n\tm_CurrentWindow = &a_Window;\n\ta_Window.SendWholeWindow(*GetClientHandle());\n}\n\n\n\n\n\nvoid cPlayer::CloseWindow(bool a_CanRefuse)\n{\n\tif (m_CurrentWindow == nullptr)\n\t{\n\t\tm_CurrentWindow = m_InventoryWindow;\n\t\treturn;\n\t}\n\n\tif (m_CurrentWindow->ClosedByPlayer(*this, a_CanRefuse) || !a_CanRefuse)\n\t{\n\t\t// Close accepted, go back to inventory window (the default):\n\t\tm_CurrentWindow = m_InventoryWindow;\n\t}\n\telse\n\t{\n\t\t// Re-open the window\n\t\tm_CurrentWindow->OpenedByPlayer(*this);\n\t\tm_CurrentWindow->SendWholeWindow(*GetClientHandle());\n\t}\n}\n\n\n\n\n\nvoid cPlayer::CloseWindowIfID(char a_WindowID, bool a_CanRefuse)\n{\n\tif ((m_CurrentWindow == nullptr) || (m_CurrentWindow->GetWindowID() != a_WindowID))\n\t{\n\t\treturn;\n\t}\n\tCloseWindow();\n}\n\n\n\n\n\nvoid cPlayer::SendMessage(const AString & a_Message)\n{\n\tm_ClientHandle->SendChat(a_Message, mtCustom);\n}\n\n\n\n\n\nvoid cPlayer::SendMessageInfo(const AString & a_Message)\n{\n\tm_ClientHandle->SendChat(a_Message, mtInformation);\n}\n\n\n\n\n\nvoid cPlayer::SendMessageFailure(const AString & a_Message)\n{\n\tm_ClientHandle->SendChat(a_Message, mtFailure);\n}\n\n\n\n\n\nvoid cPlayer::SendMessageSuccess(const AString & a_Message)\n{\n\tm_ClientHandle->SendChat(a_Message, mtSuccess);\n}\n\n\n\n\n\nvoid cPlayer::SendMessageWarning(const AString & a_Message)\n{\n\tm_ClientHandle->SendChat(a_Message, mtWarning);\n}\n\n\n\n\n\nvoid cPlayer::SendMessageFatal(const AString & a_Message)\n{\n\tm_ClientHandle->SendChat(a_Message, mtFailure);\n}\n\n\n\n\n\nvoid cPlayer::SendMessagePrivateMsg(const AString & a_Message, const AString & a_Sender)\n{\n\tm_ClientHandle->SendChat(a_Message, mtPrivateMessage, a_Sender);\n}\n\n\n\n\n\nvoid cPlayer::SendMessage(const cCompositeChat & a_Message)\n{\n\tm_ClientHandle->SendChat(a_Message);\n}\n\n\n\n\n\nvoid cPlayer::SendMessageRaw(const AString & a_MessageRaw, eChatType a_Type)\n{\n\tm_ClientHandle->SendChatRaw(a_MessageRaw, a_Type);\n}\n\n\n\n\n\nvoid cPlayer::SendSystemMessage(const AString & a_Message)\n{\n\tm_ClientHandle->SendChatSystem(a_Message, mtCustom);\n}\n\n\n\n\n\nvoid cPlayer::SendAboveActionBarMessage(const AString & a_Message)\n{\n\tm_ClientHandle->SendChatAboveActionBar(a_Message, mtCustom);\n}\n\n\n\n\n\nvoid cPlayer::SendSystemMessage(const cCompositeChat & a_Message)\n{\n\tm_ClientHandle->SendChatSystem(a_Message);\n}\n\n\n\n\n\nvoid cPlayer::SendAboveActionBarMessage(const cCompositeChat & a_Message)\n{\n\tm_ClientHandle->SendChatAboveActionBar(a_Message);\n}\n\n\n\n\n\nconst AString & cPlayer::GetName(void) const\n{\n\treturn m_ClientHandle->GetUsername();\n}\n\n\n\n\n\nvoid cPlayer::SetGameMode(eGameMode a_GameMode)\n{\n\tif ((a_GameMode < gmMin) || (a_GameMode >= gmMax))\n\t{\n\t\tLOGWARNING(\"%s: Setting invalid gamemode: %d\", GetName().c_str(), a_GameMode);\n\t\treturn;\n\t}\n\n\tif (m_GameMode == a_GameMode)\n\t{\n\t\t// New gamemode unchanged, we're done:\n\t\treturn;\n\t}\n\n\tm_GameMode = a_GameMode;\n\tUpdateCapabilities();\n\n\tif (IsGameModeSpectator())\n\t{\n\t\t// Spectators cannot ride entities:\n\t\tDetach();\n\t}\n\telse\n\t{\n\t\t// Non-spectators may not spectate:\n\t\tSpectateEntity(nullptr);\n\t}\n\n\tm_ClientHandle->SendGameMode(a_GameMode);\n\tm_ClientHandle->SendInventorySlot(-1, -1, m_DraggingItem);\n\tm_World->BroadcastPlayerListUpdateGameMode(*this);\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cPlayer::UpdateCapabilities()\n{\n\tif (IsGameModeCreative())\n\t{\n\t\tm_IsFlightCapable = true;\n\t\tm_IsVisible = true;\n\t}\n\telse if (IsGameModeSpectator())\n\t{\n\t\tm_DraggingItem.Empty();  // Clear the current dragging item of spectators.\n\t\tm_IsFlightCapable = true;\n\t\tm_IsFlying = true;  // Spectators are always in flight mode.\n\t\tm_IsVisible = false;  // Spectators are invisible.\n\t}\n\telse\n\t{\n\t\tm_IsFlightCapable = false;\n\t\tm_IsFlying = false;\n\t\tm_IsVisible = true;\n\t}\n}\n\n\n\n\n\nvoid cPlayer::AwardAchievement(const CustomStatistic a_Ach)\n{\n\t// Check if the prerequisites are met:\n\tif (!m_Stats.SatisfiesPrerequisite(a_Ach))\n\t{\n\t\treturn;\n\t}\n\n\t// Increment the statistic and check if we already have it:\n\tif (m_Stats.Custom[a_Ach]++ != 1)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_World->ShouldBroadcastAchievementMessages())\n\t{\n\t\tcCompositeChat Msg;\n\t\tMsg.SetMessageType(mtSuccess);\n\t\t// TODO: cCompositeChat should not use protocol-specific strings\n\t\t// Msg.AddShowAchievementPart(GetName(), nameNew);\n\t\tMsg.AddTextPart(\"Achievement get!\");\n\t\tm_World->BroadcastChat(Msg);\n\t}\n\n\t// Achievement Get!\n\tm_ClientHandle->SendStatistics(m_Stats);\n}\n\n\n\n\n\nvoid cPlayer::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ)\n{\n\t//  ask plugins to allow teleport to the new position.\n\tif (!cRoot::Get()->GetPluginManager()->CallHookEntityTeleport(*this, m_LastPosition, Vector3d(a_PosX, a_PosY, a_PosZ)))\n\t{\n\t\tm_IsTeleporting = true;\n\n\t\tDetach();\n\t\tSetPosition({a_PosX, a_PosY, a_PosZ});\n\t\tFreezeInternal(GetPosition(), false);\n\n\t\tm_ClientHandle->SendPlayerMoveLook();\n\t}\n}\n\n\n\n\n\nvoid cPlayer::Freeze(const Vector3d & a_Location)\n{\n\tFreezeInternal(a_Location, true);\n}\n\n\n\n\n\nbool cPlayer::IsFrozen()\n{\n\treturn m_IsFrozen;\n}\n\n\n\n\n\nvoid cPlayer::Unfreeze()\n{\n\tif (IsElytraFlying())\n\t{\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n\n\tm_ClientHandle->SendPlayerAbilities();\n\tm_World->BroadcastEntityProperties(*this);\n\n\tm_IsFrozen = false;\n\tBroadcastMovementUpdate(m_ClientHandle.get());\n\tGetClientHandle()->SendPlayerPosition();\n}\n\n\n\n\n\nvoid cPlayer::SendRotation(double a_YawDegrees, double a_PitchDegrees)\n{\n\tSetYaw(a_YawDegrees);\n\tSetPitch(a_PitchDegrees);\n\tm_ClientHandle->SendPlayerMoveLook();\n}\n\n\n\n\n\nvoid cPlayer::SpectateEntity(cEntity * a_Target)\n{\n\tif (a_Target == this)\n\t{\n\t\t// Canonicalise self-pointers:\n\t\ta_Target = nullptr;\n\t}\n\n\tif (m_Spectating == a_Target)\n\t{\n\t\t// Already spectating requested target:\n\t\treturn;\n\t}\n\n\tif (a_Target == nullptr)\n\t{\n\t\tm_Spectating->OnLoseSpectator(*this);\n\t\tOnLoseSpectated();\n\t\treturn;\n\t}\n\n\tm_Spectating = a_Target;\n\ta_Target->OnAcquireSpectator(*this);\n\tm_ClientHandle->SendCameraSetTo(*a_Target);\n}\n\n\n\n\n\nVector3d cPlayer::GetThrowStartPos(void) const\n{\n\tVector3d res = GetEyePosition();\n\n\t// Adjust the position to be just outside the player's bounding box:\n\tres.x += 0.16 * cos(GetPitch());\n\tres.y += -0.1;\n\tres.z += 0.16 * sin(GetPitch());\n\n\treturn res;\n}\n\n\n\n\n\nVector3d cPlayer::GetThrowSpeed(double a_SpeedCoeff) const\n{\n\tVector3d res = GetLookVector();\n\tres.Normalize();\n\n\t// TODO: Add a slight random change (+-0.0075 in each direction)\n\n\treturn res * a_SpeedCoeff;\n}\n\n\n\n\n\neGameMode cPlayer::GetEffectiveGameMode(void) const\n{\n\treturn (m_GameMode == gmNotSet) ? m_World->GetGameMode() : m_GameMode;\n}\n\n\n\n\n\nvoid cPlayer::ForceSetSpeed(const Vector3d & a_Speed)\n{\n\tSetSpeed(a_Speed);\n}\n\n\n\n\n\nvoid cPlayer::SetVisible(bool a_bVisible)\n{\n\tif (a_bVisible && !m_IsVisible)\n\t{\n\t\tm_IsVisible = true;\n\t}\n\tif (!a_bVisible && m_IsVisible)\n\t{\n\t\tm_IsVisible = false;\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nMTRand cPlayer::GetEnchantmentRandomProvider()\n{\n\treturn m_EnchantmentSeed;\n}\n\n\n\n\n\nvoid cPlayer::PermuteEnchantmentSeed()\n{\n\t// Get a new random integer and save that as the seed:\n\tm_EnchantmentSeed = GetRandomProvider().RandInt<unsigned int>();\n}\n\n\n\n\n\nbool cPlayer::HasPermission(const AString & a_Permission) const\n{\n\tif (a_Permission.empty())\n\t{\n\t\t// Empty permission request is always granted\n\t\treturn true;\n\t}\n\n\tAStringVector Split = StringSplit(a_Permission, \".\");\n\n\t// Iterate over all restrictions; if any matches, then return failure:\n\tfor (auto & Restriction: m_SplitRestrictions)\n\t{\n\t\tif (PermissionMatches(Split, Restriction))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for Restriction - m_SplitRestrictions[]\n\n\t// Iterate over all granted permissions; if any matches, then return success:\n\tfor (auto & Permission: m_SplitPermissions)\n\t{\n\t\tif (PermissionMatches(Split, Permission))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}  // for Permission - m_SplitPermissions[]\n\n\t// No granted permission matches\n\treturn false;\n}\n\n\n\n\n\nbool cPlayer::PermissionMatches(const AStringVector & a_Permission, const AStringVector & a_Template)\n{\n\t// Check the sub-items if they are the same or there's a wildcard:\n\tsize_t lenP = a_Permission.size();\n\tsize_t lenT = a_Template.size();\n\tsize_t minLen = std::min(lenP, lenT);\n\tfor (size_t i = 0; i < minLen; i++)\n\t{\n\t\tif (a_Template[i] == \"*\")\n\t\t{\n\t\t\t// Has matched so far and now there's a wildcard in the template, so the permission matches:\n\t\t\treturn true;\n\t\t}\n\t\tif (a_Permission[i] != a_Template[i])\n\t\t{\n\t\t\t// Found a mismatch\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// So far all the sub-items have matched\n\t// If the sub-item count is the same, then the permission matches\n\treturn (lenP == lenT);\n}\n\n\n\n\n\nAString cPlayer::GetColor(void) const\n{\n\tif (m_MsgNameColorCode.empty() || (m_MsgNameColorCode == \"-\"))\n\t{\n\t\t// Color has not been assigned, return an empty string:\n\t\treturn AString();\n\t}\n\n\t// Return the color, including the delimiter:\n\treturn cChatColor::Delimiter + m_MsgNameColorCode;\n}\n\n\n\n\n\nAString cPlayer::GetPrefix(void) const\n{\n\treturn m_MsgPrefix;\n}\n\n\n\n\n\nAString cPlayer::GetSuffix(void) const\n{\n\treturn m_MsgSuffix;\n}\n\n\n\n\n\nAString cPlayer::GetPlayerListName() const\n{\n\tconst AString & Color = GetColor();\n\n\tif (HasCustomName())\n\t{\n\t\treturn m_CustomName;\n\t}\n\telse if ((GetName().length() <= 14) && !Color.empty())\n\t{\n\t\treturn fmt::format(FMT_STRING(\"{}{}\"), Color, GetName());\n\t}\n\telse\n\t{\n\t\treturn GetName();\n\t}\n}\n\n\n\n\n\nvoid cPlayer::SetDraggingItem(const cItem & a_Item)\n{\n\tif (GetWindow() != nullptr)\n\t{\n\t\tm_DraggingItem = a_Item;\n\t\tGetClientHandle()->SendInventorySlot(-1, -1, m_DraggingItem);\n\t}\n}\n\n\n\n\n\nvoid cPlayer::TossEquippedItem(char a_Amount)\n{\n\tcItems Drops;\n\tcItem DroppedItem(GetInventory().GetEquippedItem());\n\tif (!DroppedItem.IsEmpty())\n\t{\n\t\tchar NewAmount = a_Amount;\n\t\tif (NewAmount > GetInventory().GetEquippedItem().m_ItemCount)\n\t\t{\n\t\t\tNewAmount = GetInventory().GetEquippedItem().m_ItemCount;  // Drop only what's there\n\t\t}\n\n\t\tGetInventory().GetHotbarGrid().ChangeSlotCount(GetInventory().GetEquippedSlotNum() /* Returns hotbar subslot, which HotbarGrid takes */, -a_Amount);\n\n\t\tDroppedItem.m_ItemCount = NewAmount;\n\t\tDrops.push_back(DroppedItem);\n\t}\n\n\tTossItems(Drops);\n}\n\n\n\n\n\nvoid cPlayer::ReplaceOneEquippedItemTossRest(const cItem & a_Item)\n{\n\tauto PlacedCount = GetInventory().ReplaceOneEquippedItem(a_Item);\n\tchar ItemCountToToss = a_Item.m_ItemCount - static_cast<char>(PlacedCount);\n\n\tif (ItemCountToToss == 0)\n\t{\n\t\treturn;\n\t}\n\n\tcItem Pickup = a_Item;\n\tPickup.m_ItemCount = ItemCountToToss;\n\tTossPickup(Pickup);\n}\n\n\n\n\n\nvoid cPlayer::TossHeldItem(char a_Amount)\n{\n\tcItems Drops;\n\tcItem & Item = GetDraggingItem();\n\tif (!Item.IsEmpty())\n\t{\n\t\tchar OriginalItemAmount = Item.m_ItemCount;\n\t\tItem.m_ItemCount = std::min(OriginalItemAmount, a_Amount);\n\t\tDrops.push_back(Item);\n\n\t\tif (OriginalItemAmount > a_Amount)\n\t\t{\n\t\t\tItem.m_ItemCount = OriginalItemAmount - a_Amount;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tItem.Empty();\n\t\t}\n\t}\n\n\tTossItems(Drops);\n}\n\n\n\n\n\nvoid cPlayer::TossPickup(const cItem & a_Item)\n{\n\tcItems Drops;\n\tDrops.push_back(a_Item);\n\n\tTossItems(Drops);\n}\n\n\n\n\n\nvoid cPlayer::LoadFromDisk()\n{\n\tRefreshRank();\n\n\tJson::Value Root;\n\tconst auto & UUID = GetUUID();\n\tconst auto & FileName = GetUUIDFileName(UUID);\n\n\ttry\n\t{\n\t\t// Load the data from the save file and parse:\n\t\tInputFileStream(FileName) >> Root;\n\n\t\t// Load the player stats.\n\t\t// We use the default world name (like bukkit) because stats are shared between dimensions / worlds.\n\t\tStatisticsSerializer::Load(m_Stats, m_DefaultWorldPath, UUID.ToLongString());\n\t}\n\tcatch (const InputFileStream::failure &)\n\t{\n\t\tif (errno != ENOENT)\n\t\t{\n\t\t\t// Save file exists but unreadable:\n\t\t\tthrow;\n\t\t}\n\n\t\t// This is a new player whom we haven't seen yet with no save file, let them have the defaults:\n\t\tLOG(\"Player \\\"%s\\\" (%s) save or statistics file not found, resetting to defaults\", GetName().c_str(), UUID.ToShortString().c_str());\n\t}\n\n\tm_CurrentWorldName = Root.get(\"world\", cRoot::Get()->GetDefaultWorld()->GetName()).asString();\n\tm_World = cRoot::Get()->GetWorld(m_CurrentWorldName);\n\n\tif (const auto & PlayerPosition = Root[\"position\"]; PlayerPosition.size() == 3)\n\t{\n\t\tSetPosition(PlayerPosition[0].asDouble(), PlayerPosition[1].asDouble(), PlayerPosition[2].asDouble());\n\t}\n\telse\n\t{\n\t\tSetPosition(Vector3d(0.5, 0.5, 0.5) + Vector3i(m_World->GetSpawnX(), m_World->GetSpawnY(), m_World->GetSpawnZ()));\n\t}\n\n\tif (const auto & PlayerRotation = Root[\"rotation\"]; PlayerRotation.size() == 3)\n\t{\n\t\tSetYaw  (PlayerRotation[0].asDouble());\n\t\tSetPitch(PlayerRotation[1].asDouble());\n\t\tSetRoll (PlayerRotation[2].asDouble());\n\t}\n\n\tm_Health              = Root.get(\"health\",         MAX_HEALTH).asFloat();\n\tm_AirLevel            = Root.get(\"air\",            MAX_AIR_LEVEL).asInt();\n\tm_FoodLevel           = Root.get(\"food\",           MAX_FOOD_LEVEL).asInt();\n\tm_FoodSaturationLevel = Root.get(\"foodSaturation\", RESPAWN_FOOD_SATURATION).asDouble();\n\tm_FoodTickTimer       = Root.get(\"foodTickTimer\",  0).asInt();\n\tm_FoodExhaustionLevel = Root.get(\"foodExhaustion\", 0).asDouble();\n\tm_LifetimeTotalXp     = Root.get(\"xpTotal\",        0).asInt();\n\tm_CurrentXp           = Root.get(\"xpCurrent\",      0).asInt();\n\tm_IsFlying            = Root.get(\"isflying\",       0).asBool();\n\tm_EnchantmentSeed     = Root.get(\"enchantmentSeed\", GetRandomProvider().RandInt<unsigned int>()).asUInt();\n\n\tJson::Value & JSON_KnownItems = Root[\"knownItems\"];\n\tfor (UInt32 i = 0; i < JSON_KnownItems.size(); i++)\n\t{\n\t\tcItem Item;\n\t\tItem.FromJson(JSON_KnownItems[i]);\n\t\tm_KnownItems.insert(Item);\n\t}\n\n\tconst auto & RecipeNameMap = cRoot::Get()->GetCraftingRecipes()->GetRecipeNameMap();\n\n\tJson::Value & JSON_KnownRecipes = Root[\"knownRecipes\"];\n\tfor (UInt32 i = 0; i < JSON_KnownRecipes.size(); i++)\n\t{\n\t\tauto RecipeId = RecipeNameMap.find(JSON_KnownRecipes[i].asString());\n\t\tif (RecipeId != RecipeNameMap.end())\n\t\t{\n\t\t\tm_KnownRecipes.insert(RecipeId->second);\n\t\t}\n\t}\n\n\tm_GameMode = static_cast<eGameMode>(Root.get(\"gamemode\", eGameMode_NotSet).asInt());\n\n\tm_Inventory.LoadFromJson(Root[\"inventory\"]);\n\tm_Inventory.SetEquippedSlotNum(Root.get(\"equippedItemSlot\", 0).asInt());\n\n\tcEnderChestEntity::LoadFromJson(Root[\"enderchestinventory\"], m_EnderChestContents);\n\n\tm_RespawnPosition.x = Root.get(\"SpawnX\", m_World->GetSpawnX()).asInt();\n\tm_RespawnPosition.y = Root.get(\"SpawnY\", m_World->GetSpawnY()).asInt();\n\tm_RespawnPosition.z = Root.get(\"SpawnZ\", m_World->GetSpawnZ()).asInt();\n\tm_IsRespawnPointForced = Root.get(\"SpawnForced\", true).asBool();\n\tm_SpawnWorldName = Root.get(\"SpawnWorld\", m_World->GetName()).asString();\n\n\tFLOGD(\"Player \\\"{0}\\\" with save file \\\"{1}\\\" is spawning at {2:.2f} in world \\\"{3}\\\"\",\n\t\tGetName(), FileName, GetPosition(), m_World->GetName()\n\t);\n}\n\n\n\n\n\nvoid cPlayer::OpenHorseInventory()\n{\n\tif (\n\t\t(m_AttachedTo == nullptr) ||\n\t\t!m_AttachedTo->IsMob()\n\t)\n\t{\n\t\treturn;\n\t}\n\n\tauto & Mob = static_cast<cMonster &>(*m_AttachedTo);\n\n\tif (Mob.GetMobType() != mtHorse)\n\t{\n\t\treturn;\n\t}\n\n\tauto & Horse = static_cast<cHorse &>(Mob);\n\t// The client sends requests for untame horses as well but shouldn't actually open\n\tif (Horse.IsTame())\n\t{\n\t\tHorse.PlayerOpenWindow(*this);\n\t}\n}\n\n\n\n\n\nvoid cPlayer::SaveToDisk()\n{\n\tconst auto & UUID = GetUUID();\n\tcFile::CreateFolderRecursive(GetUUIDFolderName(UUID));\n\n\t// create the JSON data\n\tJson::Value JSON_PlayerPosition;\n\tJSON_PlayerPosition.append(Json::Value(GetPosX()));\n\tJSON_PlayerPosition.append(Json::Value(GetPosY()));\n\tJSON_PlayerPosition.append(Json::Value(GetPosZ()));\n\n\tJson::Value JSON_PlayerRotation;\n\tJSON_PlayerRotation.append(Json::Value(GetYaw()));\n\tJSON_PlayerRotation.append(Json::Value(GetPitch()));\n\tJSON_PlayerRotation.append(Json::Value(GetRoll()));\n\n\tJson::Value JSON_Inventory;\n\tm_Inventory.SaveToJson(JSON_Inventory);\n\n\tJson::Value JSON_EnderChestInventory;\n\tcEnderChestEntity::SaveToJson(JSON_EnderChestInventory, m_EnderChestContents);\n\n\tJson::Value JSON_KnownItems;\n\tfor (const auto & KnownItem : m_KnownItems)\n\t{\n\t\tJson::Value JSON_Item;\n\t\tKnownItem.GetJson(JSON_Item);\n\t\tJSON_KnownItems.append(JSON_Item);\n\t}\n\n\tJson::Value JSON_KnownRecipes;\n\tfor (auto KnownRecipe : m_KnownRecipes)\n\t{\n\t\tauto Recipe = cRoot::Get()->GetCraftingRecipes()->GetRecipeById(KnownRecipe);\n\t\tJSON_KnownRecipes.append(Recipe->m_RecipeName);\n\t}\n\n\tJson::Value root;\n\troot[\"position\"]            = JSON_PlayerPosition;\n\troot[\"rotation\"]            = JSON_PlayerRotation;\n\troot[\"inventory\"]           = JSON_Inventory;\n\troot[\"knownItems\"]          = JSON_KnownItems;\n\troot[\"knownRecipes\"]        = JSON_KnownRecipes;\n\troot[\"equippedItemSlot\"]    = m_Inventory.GetEquippedSlotNum();\n\troot[\"enderchestinventory\"] = JSON_EnderChestInventory;\n\troot[\"health\"]              = m_Health;\n\troot[\"xpTotal\"]             = m_LifetimeTotalXp;\n\troot[\"xpCurrent\"]           = m_CurrentXp;\n\troot[\"air\"]                 = m_AirLevel;\n\troot[\"food\"]                = m_FoodLevel;\n\troot[\"foodSaturation\"]      = m_FoodSaturationLevel;\n\troot[\"foodTickTimer\"]       = m_FoodTickTimer;\n\troot[\"foodExhaustion\"]      = m_FoodExhaustionLevel;\n\troot[\"isflying\"]            = IsFlying();\n\troot[\"lastknownname\"]       = GetName();\n\troot[\"SpawnX\"]              = GetLastBedPos().x;\n\troot[\"SpawnY\"]              = GetLastBedPos().y;\n\troot[\"SpawnZ\"]              = GetLastBedPos().z;\n\troot[\"SpawnForced\"]         = m_IsRespawnPointForced;\n\troot[\"SpawnWorld\"]          = m_SpawnWorldName;\n\troot[\"enchantmentSeed\"]     = m_EnchantmentSeed;\n\troot[\"world\"]               = m_CurrentWorldName;\n\troot[\"gamemode\"]            = static_cast<int>(m_GameMode);\n\n\tauto JsonData = JsonUtils::WriteStyledString(root);\n\tAString SourceFile = GetUUIDFileName(UUID);\n\n\tcFile f;\n\tif (!f.Open(SourceFile, cFile::fmWrite))\n\t{\n\t\tLOGWARNING(\"Error writing player \\\"%s\\\" to file \\\"%s\\\": cannot open file. Player will lose their progress\",\n\t\t\tGetName().c_str(), SourceFile.c_str()\n\t\t);\n\t\treturn;\n\t}\n\tif (f.Write(JsonData.c_str(), JsonData.size()) != static_cast<int>(JsonData.size()))\n\t{\n\t\tLOGWARNING(\"Error writing player \\\"%s\\\" to file \\\"%s\\\": cannot save data. Player will lose their progress\",\n\t\t\tGetName().c_str(), SourceFile.c_str()\n\t\t);\n\t\treturn;\n\t}\n\n\ttry\n\t{\n\t\t// Save the player stats.\n\t\t// We use the default world name (like bukkit) because stats are shared between dimensions / worlds.\n\t\t// TODO: save together with player.dat, not in some other place.\n\t\tStatisticsSerializer::Save(m_Stats, m_DefaultWorldPath, GetUUID().ToLongString());\n\t}\n\tcatch (...)\n\t{\n\t\tLOGWARNING(\"Error writing player \\\"%s\\\" statistics to file\", GetName().c_str());\n\t}\n}\n\n\n\n\n\nvoid cPlayer::UseEquippedItem(short a_Damage)\n{\n\t// No durability loss in creative or spectator modes:\n\tif (IsGameModeCreative() || IsGameModeSpectator())\n\t{\n\t\treturn;\n\t}\n\n\tUseItem(cInventory::invHotbarOffset + m_Inventory.GetEquippedSlotNum(), a_Damage);\n}\n\n\n\n\n\nvoid cPlayer::UseEquippedItem(cItemHandler::eDurabilityLostAction a_Action)\n{\n\t// Get item being used:\n\tcItem Item = GetEquippedItem();\n\n\t// Get base damage for action type:\n\tshort Dmg = Item.GetHandler().GetDurabilityLossByAction(a_Action);\n\n\tUseEquippedItem(Dmg);\n}\n\n\n\n\n\nvoid cPlayer::UseItem(int a_SlotNumber, short a_Damage)\n{\n\tconst cItem & Item = m_Inventory.GetSlot(a_SlotNumber);\n\n\tif (Item.IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\t// Ref: https://minecraft.wiki/w/Enchanting#Unbreaking\n\tunsigned int UnbreakingLevel = Item.m_Enchantments.GetLevel(cEnchantments::enchUnbreaking);\n\tdouble chance = ItemCategory::IsArmor(Item.m_ItemType)\n\t\t? (0.6 + (0.4 / (UnbreakingLevel + 1))) : (1.0 / (UnbreakingLevel + 1));\n\n\t// When durability is reduced by multiple points\n\t// Unbreaking is applied for each point of reduction.\n\tstd::binomial_distribution<short> Dist(a_Damage, chance);\n\tshort ReducedDamage = Dist(GetRandomProvider().Engine());\n\n\tif (m_Inventory.DamageItem(a_SlotNumber, ReducedDamage))\n\t{\n\t\t// The item broke. Broadcast the correct animation:\n\t\tif (Item.m_ItemType == E_ITEM_SHIELD)\n\t\t{\n\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnShieldBreaks);\n\t\t}\n\t\telse if (a_SlotNumber == (cInventory::invHotbarOffset + m_Inventory.GetEquippedSlotNum()))\n\t\t{\n\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnMainHandEquipmentBreaks);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (a_SlotNumber)\n\t\t\t{\n\t\t\t\tcase cInventory::invArmorOffset:     return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnHeadEquipmentBreaks);\n\t\t\t\tcase cInventory::invArmorOffset + 1: return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnChestEquipmentBreaks);\n\t\t\t\tcase cInventory::invArmorOffset + 2: return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnLegsEquipmentBreaks);\n\t\t\t\tcase cInventory::invArmorOffset + 3: return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnFeetEquipmentBreaks);\n\t\t\t\tcase cInventory::invShieldOffset:    return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnOffHandEquipmentBreaks);\n\t\t\t}\n\t\t}\n\t}\n\telse if (Item.m_ItemType == E_ITEM_SHIELD)\n\t{\n\t\t// The item survived. Special case for shield blocking:\n\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnShieldBlocks);\n\t}\n}\n\n\n\n\n\nvoid cPlayer::HandleFood(void)\n{\n\t// Ref.: https://minecraft.wiki/w/Hunger\n\n\tif (IsGameModeCreative() || IsGameModeSpectator())\n\t{\n\t\t// Hunger is disabled for Creative and Spectator\n\t\treturn;\n\t}\n\n\t// Apply food exhaustion that has accumulated:\n\tif (m_FoodExhaustionLevel > 4.0)\n\t{\n\t\tm_FoodExhaustionLevel -= 4.0;\n\n\t\tif (m_FoodSaturationLevel > 0.0)\n\t\t{\n\t\t\tm_FoodSaturationLevel = std::max(m_FoodSaturationLevel - 1.0, 0.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSetFoodLevel(m_FoodLevel - 1);\n\t\t}\n\t}\n\n\t// Heal or damage, based on the food level, using the m_FoodTickTimer:\n\tif ((m_FoodLevel >= 18) || (m_FoodLevel <= 0))\n\t{\n\t\tm_FoodTickTimer++;\n\t\tif (m_FoodTickTimer >= 80)\n\t\t{\n\t\t\tm_FoodTickTimer = 0;\n\n\t\t\tif ((m_FoodLevel >= 18) && (GetHealth() < GetMaxHealth()))\n\t\t\t{\n\t\t\t\t// Regenerate health from food, incur 3 pts of food exhaustion:\n\t\t\t\tHeal(1);\n\t\t\t\tAddFoodExhaustion(3.0);\n\t\t\t}\n\t\t\telse if ((m_FoodLevel <= 0) && (m_Health > 1))\n\t\t\t{\n\t\t\t\t// Damage from starving\n\t\t\t\tTakeDamage(dtStarving, nullptr, 1, 1, 0);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_FoodTickTimer = 0;\n\t}\n}\n\n\n\n\n\nvoid cPlayer::HandleFloater()\n{\n\tif (GetEquippedItem().m_ItemType == E_ITEM_FISHING_ROD)\n\t{\n\t\treturn;\n\t}\n\tm_World->DoWithEntityByID(m_FloaterID, [](cEntity & a_Entity)\n\t\t{\n\t\t\ta_Entity.Destroy();\n\t\t\treturn true;\n\t\t}\n\t);\n\tSetIsFishing(false);\n}\n\n\n\n\n\nbool cPlayer::IsClimbing(void) const\n{\n\tconst auto Position = GetPosition().Floor();\n\n\tif (!cChunkDef::IsValidHeight(Position))\n\t{\n\t\treturn false;\n\t}\n\n\tBLOCKTYPE Block = m_World->GetBlock(Position);\n\tswitch (Block)\n\t{\n\t\tcase E_BLOCK_LADDER:\n\t\tcase E_BLOCK_VINES:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nvoid cPlayer::UpdateMovementStats(const Vector3d & a_DeltaPos, bool a_PreviousIsOnGround)\n{\n\tif (m_IsTeleporting)\n\t{\n\t\tm_IsTeleporting = false;\n\t\treturn;\n\t}\n\n\tconst auto Value = FloorC<StatisticsManager::StatValue>(a_DeltaPos.Length() * 100 + 0.5);\n\tif (m_AttachedTo == nullptr)\n\t{\n\t\tif (IsFlying())\n\t\t{\n\t\t\tm_Stats.Custom[CustomStatistic::FlyOneCm] += Value;\n\t\t\t// May be flying and doing any of the following:\n\t\t}\n\n\t\tif (IsClimbing())\n\t\t{\n\t\t\tif (a_DeltaPos.y > 0.0)  // Going up\n\t\t\t{\n\t\t\t\tm_Stats.Custom[CustomStatistic::ClimbOneCm] += FloorC<StatisticsManager::StatValue>(a_DeltaPos.y * 100 + 0.5);\n\t\t\t}\n\t\t}\n\t\telse if (IsInWater())\n\t\t{\n\t\t\tif (m_IsHeadInWater)\n\t\t\t{\n\t\t\t\tm_Stats.Custom[CustomStatistic::WalkUnderWaterOneCm] += Value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_Stats.Custom[CustomStatistic::WalkOnWaterOneCm] += Value;\n\t\t\t}\n\t\t\tAddFoodExhaustion(0.00015 * static_cast<double>(Value));\n\t\t}\n\t\telse if (IsOnGround())\n\t\t{\n\t\t\tif (IsCrouched())\n\t\t\t{\n\t\t\t\tm_Stats.Custom[CustomStatistic::CrouchOneCm] += Value;\n\t\t\t\tAddFoodExhaustion(0.0001 * static_cast<double>(Value));\n\t\t\t}\n\t\t\tif (IsSprinting())\n\t\t\t{\n\t\t\t\tm_Stats.Custom[CustomStatistic::SprintOneCm] += Value;\n\t\t\t\tAddFoodExhaustion(0.001 * static_cast<double>(Value));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_Stats.Custom[CustomStatistic::WalkOneCm] += Value;\n\t\t\t\tAddFoodExhaustion(0.0001 * static_cast<double>(Value));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If a jump just started, process food exhaustion:\n\t\t\tif ((a_DeltaPos.y > 0.0) && a_PreviousIsOnGround)\n\t\t\t{\n\t\t\t\tm_Stats.Custom[CustomStatistic::Jump]++;\n\t\t\t\tAddFoodExhaustion((IsSprinting() ? 0.008 : 0.002) * static_cast<double>(Value));\n\t\t\t}\n\t\t\telse if (a_DeltaPos.y < 0.0)\n\t\t\t{\n\t\t\t\t// Increment statistic\n\t\t\t\tm_Stats.Custom[CustomStatistic::FallOneCm] += static_cast<StatisticsManager::StatValue>(-a_DeltaPos.y * 100 + 0.5);\n\t\t\t}\n\t\t\t// TODO: good opportunity to detect illegal flight (check for falling tho)\n\t\t}\n\t}\n\telse\n\t{\n\t\tswitch (m_AttachedTo->GetEntityType())\n\t\t{\n\t\t\tcase cEntity::etMinecart: m_Stats.Custom[CustomStatistic::MinecartOneCm] += Value; break;\n\t\t\tcase cEntity::etBoat:     m_Stats.Custom[CustomStatistic::BoatOneCm]     += Value; break;\n\t\t\tcase cEntity::etMonster:\n\t\t\t{\n\t\t\t\tcMonster * Monster = static_cast<cMonster *>(m_AttachedTo);\n\t\t\t\tswitch (Monster->GetMobType())\n\t\t\t\t{\n\t\t\t\t\tcase mtPig:   m_Stats.Custom[CustomStatistic::PigOneCm]   += Value; break;\n\t\t\t\t\tcase mtHorse: m_Stats.Custom[CustomStatistic::HorseOneCm] += Value; break;\n\t\t\t\t\tdefault: break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: break;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cPlayer::LoadRank(void)\n{\n\t// Update our permissions:\n\tRefreshRank();\n\n\t// Send a permission level update:\n\tm_ClientHandle->SendPlayerPermissionLevel();\n}\n\n\n\n\n\nvoid cPlayer::SendBlocksAround(Vector3i a_BlockPos, int a_Range)\n{\n\t// Collect the coords of all the blocks to send:\n\tsSetBlockVector blks;\n\tfor (int y = a_BlockPos.y - a_Range + 1; y < a_BlockPos.y + a_Range; y++)\n\t{\n\t\tfor (int z = a_BlockPos.z - a_Range + 1; z < a_BlockPos.z + a_Range; z++)\n\t\t{\n\t\t\tfor (int x = a_BlockPos.x - a_Range + 1; x < a_BlockPos.x + a_Range; x++)\n\t\t\t{\n\t\t\t\tblks.emplace_back(x, y, z, E_BLOCK_AIR, static_cast<NIBBLETYPE>(0));  // Use fake blocktype, it will get set later on.\n\t\t\t}\n\t\t}\n\t}  // for y\n\n\t// Get the values of all the blocks:\n\tif (!m_World->GetBlocks(blks, false))\n\t{\n\t\tLOGD(\"%s: Cannot query all blocks, not sending an update\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\t// Divide the block changes by their respective chunks:\n\tstd::unordered_map<cChunkCoords, sSetBlockVector, cChunkCoordsHash> Changes;\n\tfor (const auto & blk: blks)\n\t{\n\t\tChanges[cChunkCoords(blk.m_ChunkX, blk.m_ChunkZ)].push_back(blk);\n\t}  // for blk - blks[]\n\tblks.clear();\n\n\t// Send the blocks for each affected chunk:\n\tfor (auto itr = Changes.cbegin(), end = Changes.cend(); itr != end; ++itr)\n\t{\n\t\tm_ClientHandle->SendBlockChanges(itr->first.m_ChunkX, itr->first.m_ChunkZ, itr->second);\n\t}\n}\n\n\n\n\n\nbool cPlayer::DoesPlacingBlocksIntersectEntity(const std::initializer_list<sSetBlock> a_Blocks) const\n{\n\t// Compute the bounding box for each block to be placed\n\tstd::vector<cBoundingBox> PlacementBoxes;\n\tcBoundingBox PlacingBounds(0, 0, 0, 0, 0, 0);\n\tbool HasInitializedBounds = false;\n\tfor (auto blk: a_Blocks)\n\t{\n\t\tint x = blk.GetX();\n\t\tint y = blk.GetY();\n\t\tint z = blk.GetZ();\n\t\tcBoundingBox BlockBox = cBlockHandler::For(blk.m_BlockType).GetPlacementCollisionBox(\n\t\t\tm_World->GetBlock({ x - 1, y, z }),\n\t\t\tm_World->GetBlock({ x + 1, y, z }),\n\t\t\t(y == 0) ? static_cast<BLOCKTYPE>(E_BLOCK_AIR) : m_World->GetBlock({ x, y - 1, z }),\n\t\t\t(y == cChunkDef::Height - 1) ? static_cast<BLOCKTYPE>(E_BLOCK_AIR) : m_World->GetBlock({ x, y + 1, z }),\n\t\t\tm_World->GetBlock({ x, y, z - 1 }),\n\t\t\tm_World->GetBlock({ x, y, z + 1 })\n\t\t);\n\t\tBlockBox.Move(x, y, z);\n\n\t\tPlacementBoxes.push_back(BlockBox);\n\n\t\tif (HasInitializedBounds)\n\t\t{\n\t\t\tPlacingBounds = PlacingBounds.Union(BlockBox);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPlacingBounds = BlockBox;\n\t\t\tHasInitializedBounds = true;\n\t\t}\n\t}\n\n\tcWorld * World = GetWorld();\n\n\t// Check to see if any entity intersects any block being placed\n\treturn !World->ForEachEntityInBox(PlacingBounds, [&](cEntity & a_Entity)\n\t\t{\n\t\t\t// The distance inside the block the entity can still be.\n\t\t\tconst double EPSILON = 0.0005;\n\n\t\t\tif (!a_Entity.DoesPreventBlockPlacement())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tauto EntBox = a_Entity.GetBoundingBox();\n\t\t\tfor (auto BlockBox : PlacementBoxes)\n\t\t\t{\n\t\t\t\t// Put in a little bit of wiggle room\n\t\t\t\tBlockBox.Expand(-EPSILON, -EPSILON, -EPSILON);\n\t\t\t\tif (EntBox.DoesIntersect(BlockBox))\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t);\n}\n\n\n\n\n\nconst cUUID & cPlayer::GetUUID(void) const\n{\n\treturn m_ClientHandle->GetUUID();\n}\n\n\n\n\n\nbool cPlayer::PlaceBlock(const Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\treturn PlaceBlocks({ { a_Position, a_BlockType, a_BlockMeta } });\n}\n\n\n\n\n\nbool cPlayer::PlaceBlocks(const std::initializer_list<sSetBlock> a_Blocks)\n{\n\tif (DoesPlacingBlocksIntersectEntity(a_Blocks))\n\t{\n\t\t// Abort - re-send all the current blocks in the a_Blocks' coords to the client:\n\t\tfor (const auto & ResendBlock : a_Blocks)\n\t\t{\n\t\t\tm_World->SendBlockTo(ResendBlock.GetX(), ResendBlock.GetY(), ResendBlock.GetZ(), *this);\n\t\t}\n\t\treturn false;\n\t}\n\n\tcPluginManager * pm = cPluginManager::Get();\n\n\t// Check the blocks CanBeAt, and call the \"placing\" hooks; if any fail, abort:\n\tfor (const auto & Block : a_Blocks)\n\t{\n\t\tif (\n\t\t\t!m_World->DoWithChunkAt(Block.GetAbsolutePos(), [&Block](cChunk & a_Chunk)\n\t\t\t{\n\t\t\t\treturn cBlockHandler::For(Block.m_BlockType).CanBeAt(a_Chunk, Block.GetRelativePos(), Block.m_BlockMeta);\n\t\t\t})\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (pm->CallHookPlayerPlacingBlock(*this, Block))\n\t\t{\n\t\t\t// Abort - re-send all the current blocks in the a_Blocks' coords to the client:\n\t\t\tfor (const auto & ResendBlock : a_Blocks)\n\t\t\t{\n\t\t\t\tm_World->SendBlockTo(ResendBlock.GetX(), ResendBlock.GetY(), ResendBlock.GetZ(), *this);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tcChunkInterface ChunkInterface(m_World->GetChunkMap());\n\tfor (const auto & Block : a_Blocks)\n\t{\n\t\t// Set the blocks:\n\t\tm_World->PlaceBlock(Block.GetAbsolutePos(), Block.m_BlockType, Block.m_BlockMeta);\n\n\t\t// Call the \"placed\" hooks:\n\t\tpm->CallHookPlayerPlacedBlock(*this, Block);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cPlayer::SetSkinParts(int a_Parts)\n{\n\tm_SkinParts = a_Parts & spMask;\n\tm_World->BroadcastEntityMetadata(*this, m_ClientHandle.get());\n}\n\n\n\n\n\nAString cPlayer::GetUUIDFileName(const cUUID & a_UUID)\n{\n\tAString UUID = a_UUID.ToLongString();\n\n\tAString res(\"players/\");\n\tres.append(UUID, 0, 2);\n\tres.push_back('/');\n\tres.append(UUID, 2, AString::npos);\n\tres.append(\".json\");\n\treturn res;\n}\n\n\n\n\n\nvoid cPlayer::FreezeInternal(const Vector3d & a_Location, bool a_ManuallyFrozen)\n{\n\tSetSpeed(0, 0, 0);\n\tSetPosition(a_Location);\n\tm_IsFrozen = true;\n\tm_IsManuallyFrozen = a_ManuallyFrozen;\n\n\tdouble NormalMaxSpeed = GetNormalMaxSpeed();\n\tdouble SprintMaxSpeed = GetSprintingMaxSpeed();\n\tdouble FlyingMaxpeed = GetFlyingMaxSpeed();\n\tbool IsFlying = m_IsFlying;\n\n\t// Set the client-side speed to 0\n\tm_NormalMaxSpeed = 0;\n\tm_SprintingMaxSpeed = 0;\n\tm_FlyingMaxSpeed = 0;\n\tm_IsFlying = true;\n\n\t// Send the client its fake speed and max speed of 0\n\tm_ClientHandle->SendPlayerMoveLook();\n\tm_ClientHandle->SendPlayerAbilities();\n\tm_ClientHandle->SendEntityVelocity(*this);\n\tm_World->BroadcastEntityProperties(*this);\n\n\t// Keep the server side speed variables as they were in the first place\n\tm_NormalMaxSpeed = NormalMaxSpeed;\n\tm_SprintingMaxSpeed = SprintMaxSpeed;\n\tm_FlyingMaxSpeed = FlyingMaxpeed;\n\tm_IsFlying = IsFlying;\n}\n\n\n\n\n\nfloat cPlayer::GetLiquidHeightPercent(NIBBLETYPE a_Meta)\n{\n\tif (a_Meta >= 8)\n\t{\n\t\ta_Meta = 0;\n\t}\n\treturn static_cast<float>(a_Meta + 1) / 9.0f;\n}\n\n\n\n\n\nbool cPlayer::IsInsideWater()\n{\n\tconst auto EyePos = GetEyePosition().Floor();\n\n\tif (!cChunkDef::IsValidHeight(EyePos))\n\t{\n\t\t// Not in water if in void.\n\t\treturn false;\n\t}\n\n\tBLOCKTYPE Block;\n\tNIBBLETYPE Meta;\n\tif (\n\t\t!m_World->GetBlockTypeMeta(GetEyePosition().Floor(), Block, Meta) ||\n\t\t((Block != E_BLOCK_WATER) && (Block != E_BLOCK_STATIONARY_WATER))\n\t)\n\t{\n\t\treturn false;\n\t}\n\n\tconst auto EyeHeight = GetEyeHeight();\n\tfloat f = GetLiquidHeightPercent(Meta) - 0.11111111f;\n\tfloat f1 = static_cast<float>(EyeHeight + 1) - f;\n\treturn EyeHeight < f1;\n}\n\n\n\n\n\nfloat cPlayer::GetDigSpeed(BLOCKTYPE a_Block)\n{\n\t// Based on: https://minecraft.wiki/w/Breaking#Speed\n\n\t// Get the base speed multiplier of the equipped tool for the mined block\n\tfloat MiningSpeed = GetEquippedItem().GetHandler().GetBlockBreakingStrength(a_Block);\n\n\t// If we can harvest the block then we can apply material and enchantment bonuses\n\tif (GetEquippedItem().GetHandler().CanHarvestBlock(a_Block))\n\t{\n\t\tif (MiningSpeed > 1.0f)  // If the base multiplier for this block is greater than 1, now we can check enchantments\n\t\t{\n\t\t\tunsigned int EfficiencyModifier = GetEquippedItem().m_Enchantments.GetLevel(cEnchantments::eEnchantment::enchEfficiency);\n\t\t\tif (EfficiencyModifier > 0)  // If an efficiency enchantment is present, apply formula as on wiki\n\t\t\t{\n\t\t\t\tMiningSpeed += (EfficiencyModifier * EfficiencyModifier) + 1;\n\t\t\t}\n\t\t}\n\t}\n\telse  // If we can't harvest the block then no bonuses:\n\t{\n\t\tMiningSpeed = 1;\n\t}\n\n\t// Haste increases speed by 20% per level\n\tauto Haste = GetEntityEffect(cEntityEffect::effHaste);\n\tif (Haste != nullptr)\n\t{\n\t\tint intensity = Haste->GetIntensity() + 1;\n\t\tMiningSpeed *= 1.0f + (intensity * 0.2f);\n\t}\n\n\t// Mining fatigue decreases speed a lot\n\tauto MiningFatigue = GetEntityEffect(cEntityEffect::effMiningFatigue);\n\tif (MiningFatigue != nullptr)\n\t{\n\t\tint intensity = MiningFatigue->GetIntensity();\n\t\tswitch (intensity)\n\t\t{\n\t\t\tcase 0:  MiningSpeed *= 0.3f;     break;\n\t\t\tcase 1:  MiningSpeed *= 0.09f;    break;\n\t\t\tcase 2:  MiningSpeed *= 0.0027f;  break;\n\t\t\tdefault: MiningSpeed *= 0.00081f; break;\n\n\t\t}\n\t}\n\n\t// 5x speed loss for being in water\n\tif (IsInsideWater() && !(GetEquippedItem().m_Enchantments.GetLevel(cEnchantments::eEnchantment::enchAquaAffinity) > 0))\n\t{\n\t\tMiningSpeed /= 5.0f;\n\t}\n\n\t// 5x speed loss for not touching ground\n\tif (!IsOnGround())\n\t{\n\t\tMiningSpeed /= 5.0f;\n\t}\n\n\treturn MiningSpeed;\n}\n\n\n\n\n\nfloat cPlayer::GetMiningProgressPerTick(BLOCKTYPE a_Block)\n{\n\t// Based on https://minecraft.wiki/w/Breaking#Calculation\n\t// If we know it's instantly breakable then quit here:\n\tif (cBlockInfo::IsOneHitDig(a_Block))\n\t{\n\t\treturn 1;\n\t}\n\n\tconst bool CanHarvest = GetEquippedItem().GetHandler().CanHarvestBlock(a_Block);\n\tconst float BlockHardness = cBlockInfo::GetHardness(a_Block) * (CanHarvest ? 1.5f : 5.0f);\n\tASSERT(BlockHardness > 0);  // Can't divide by 0 or less, IsOneHitDig should have returned true\n\n\t// LOGD(\"Time to mine block = %f\", BlockHardness/DigSpeed);\n\t// Number of ticks to mine = (20 * BlockHardness)/DigSpeed;\n\t// Therefore take inverse to get fraction mined per tick:\n\treturn GetDigSpeed(a_Block) / (20.0f * BlockHardness);\n}\n\n\n\n\n\nbool cPlayer::CanInstantlyMine(BLOCKTYPE a_Block)\n{\n\t// Based on: https://minecraft.wiki/w/Breaking#Calculation\n\n\t// If the dig speed is greater than 30 times the hardness, then the wiki says we can instantly mine:\n\treturn GetDigSpeed(a_Block) > (30 * cBlockInfo::GetHardness(a_Block));\n}\n\n\n\n\n\nvoid cPlayer::AddKnownItem(const cItem & a_Item)\n{\n\tif (a_Item.m_ItemType < 0)\n\t{\n\t\treturn;\n\t}\n\n\tauto Response = m_KnownItems.insert(a_Item.CopyOne());\n\tif (!Response.second)\n\t{\n\t\t// The item was already known, bail out:\n\t\treturn;\n\t}\n\n\t// Process the recipes that got unlocked by this newly-known item:\n\tauto Recipes = cRoot::Get()->GetCraftingRecipes()->FindNewRecipesForItem(a_Item, m_KnownItems);\n\tfor (const auto & RecipeId : Recipes)\n\t{\n\t\tAddKnownRecipe(RecipeId);\n\t}\n}\n\n\n\n\n\nvoid cPlayer::AddKnownRecipe(UInt32 a_RecipeId)\n{\n\tauto Response = m_KnownRecipes.insert(a_RecipeId);\n\tif (!Response.second)\n\t{\n\t\t// The recipe was already known, bail out:\n\t\treturn;\n\t}\n\tm_ClientHandle->SendUnlockRecipe(a_RecipeId);\n}\n\n\n\n\n\nvoid cPlayer::TickFreezeCode()\n{\n\tif (m_IsFrozen)\n\t{\n\t\tif ((!m_IsManuallyFrozen) && (GetClientHandle()->IsPlayerChunkSent()))\n\t\t{\n\t\t\t// If the player was automatically frozen, unfreeze if the chunk the player is inside is loaded and sent\n\t\t\tUnfreeze();\n\n\t\t\t// Pull the player out of any solids that might have loaded on them.\n\t\t\tPREPARE_REL_AND_CHUNK(GetPosition(), *(GetParentChunk()));\n\t\t\tif (RelSuccess)\n\t\t\t{\n\t\t\t\tint NewY = Rel.y;\n\t\t\t\tif (NewY < 0)\n\t\t\t\t{\n\t\t\t\t\tNewY = 0;\n\t\t\t\t}\n\t\t\t\twhile (NewY < cChunkDef::Height - 2)\n\t\t\t\t{\n\t\t\t\t\t// If we find a position with enough space for the player\n\t\t\t\t\tif (\n\t\t\t\t\t\t!cBlockInfo::IsSolid(Chunk->GetBlock(Rel.x, NewY, Rel.z)) &&\n\t\t\t\t\t\t!cBlockInfo::IsSolid(Chunk->GetBlock(Rel.x, NewY + 1, Rel.z))\n\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\t// If the found position is not the same as the original\n\t\t\t\t\t\tif (NewY != Rel.y)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSetPosition(GetPosition().x, NewY, GetPosition().z);\n\t\t\t\t\t\t\tGetClientHandle()->SendPlayerPosition();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t++NewY;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if ((GetWorld()->GetWorldTickAge() % 100_tick) == 0_tick)\n\t\t{\n\t\t\t// Despite the client side freeze, the player may be able to move a little by\n\t\t\t// Jumping or canceling flight. Re-freeze every now and then\n\t\t\tFreezeInternal(GetPosition(), m_IsManuallyFrozen);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!GetClientHandle()->IsPlayerChunkSent() || (!GetParentChunk()->IsValid()))\n\t\t{\n\t\t\tFreezeInternal(GetPosition(), false);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cPlayer::RefreshRank()\n{\n\tconst auto & UUID = GetUUID();\n\tcRankManager * RankMgr = cRoot::Get()->GetRankManager();\n\n\t// Load the values from cRankManager:\n\tm_Rank = RankMgr->GetPlayerRankName(UUID);\n\tif (m_Rank.empty())\n\t{\n\t\tm_Rank = RankMgr->GetDefaultRank();\n\t}\n\telse\n\t{\n\t\t// Update the name:\n\t\tRankMgr->UpdatePlayerName(UUID, GetName());\n\t}\n\tm_Permissions = RankMgr->GetPlayerPermissions(UUID);\n\tm_Restrictions = RankMgr->GetPlayerRestrictions(UUID);\n\tRankMgr->GetRankVisuals(m_Rank, m_MsgPrefix, m_MsgSuffix, m_MsgNameColorCode);\n\n\t// Break up the individual permissions on each dot, into m_SplitPermissions:\n\tm_SplitPermissions.clear();\n\tm_SplitPermissions.reserve(m_Permissions.size());\n\tfor (auto & Permission : m_Permissions)\n\t{\n\t\tm_SplitPermissions.push_back(StringSplit(Permission, \".\"));\n\t}\n\n\t// Break up the individual restrictions on each dot, into m_SplitRestrictions:\n\tm_SplitRestrictions.clear();\n\tm_SplitRestrictions.reserve(m_Restrictions.size());\n\tfor (auto & Restriction : m_Restrictions)\n\t{\n\t\tm_SplitRestrictions.push_back(StringSplit(Restriction, \".\"));\n\t}\n}\n\n\n\n\n\nvoid cPlayer::ApplyArmorDamage(int a_DamageBlocked)\n{\n\tshort ArmorDamage = static_cast<short>(std::max(a_DamageBlocked / 4, 1));\n\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tUseItem(cInventory::invArmorOffset + i, ArmorDamage);\n\t}\n}\n\n\n\n\n\nvoid cPlayer::BroadcastMovementUpdate(const cClientHandle * a_Exclude)\n{\n\tif (!m_IsFrozen && m_Speed.SqrLength() > 0.001)\n\t{\n\t\t// If the player is not frozen, has a non-zero speed,\n\t\t// send the speed to the client so he is forced to move so:\n\t\tm_ClientHandle->SendEntityVelocity(*this);\n\t}\n\n\t// Since we do no physics processing for players, speed will otherwise never decrease:\n\tm_Speed.Set(0, 0, 0);\n\n\tSuper::BroadcastMovementUpdate(a_Exclude);\n}\n\n\n\n\n\nbool cPlayer::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\t// Filters out damage for creative mode / friendly fire.\n\n\tif ((a_TDI.DamageType != dtInVoid) && (a_TDI.DamageType != dtPlugin))\n\t{\n\t\tif (IsGameModeCreative() || IsGameModeSpectator())\n\t\t{\n\t\t\t// No damage / health in creative or spectator mode if not void or plugin damage\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif ((a_TDI.Attacker != nullptr) && (a_TDI.Attacker->IsPlayer()))\n\t{\n\t\tcPlayer * Attacker = static_cast<cPlayer *>(a_TDI.Attacker);\n\n\t\tif ((m_Team != nullptr) && (m_Team == Attacker->m_Team))\n\t\t{\n\t\t\tif (!m_Team->AllowsFriendlyFire())\n\t\t\t{\n\t\t\t\t// Friendly fire is disabled\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (Super::DoTakeDamage(a_TDI))\n\t{\n\t\t// Any kind of damage adds food exhaustion\n\t\tAddFoodExhaustion(0.3f);\n\t\tm_ClientHandle->SendHealth();\n\n\t\t// Tell the wolves\n\t\tif (a_TDI.Attacker != nullptr)\n\t\t{\n\t\t\tif (a_TDI.Attacker->IsPawn())\n\t\t\t{\n\t\t\t\tNotifyNearbyWolves(static_cast<cPawn*>(a_TDI.Attacker), true);\n\t\t\t}\n\t\t}\n\t\tm_Stats.Custom[CustomStatistic::DamageTaken] += FloorC<StatisticsManager::StatValue>(a_TDI.FinalDamage * 10 + 0.5);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nfloat cPlayer::GetEnchantmentBlastKnockbackReduction()\n{\n\tif (\n\t\tIsGameModeSpectator() ||\n\t\t(IsGameModeCreative() && !IsOnGround())\n\t)\n\t{\n\t\treturn 1;  // No impact from explosion\n\t}\n\n\treturn Super::GetEnchantmentBlastKnockbackReduction();\n}\n\n\n\n\n\nbool cPlayer::IsCrouched(void) const\n{\n\treturn std::holds_alternative<BodyStanceCrouching>(m_BodyStance);\n}\n\n\n\n\n\nbool cPlayer::IsSprinting(void) const\n{\n\treturn std::holds_alternative<BodyStanceSprinting>(m_BodyStance);\n}\n\n\n\n\n\nbool cPlayer::IsElytraFlying(void) const\n{\n\treturn std::holds_alternative<BodyStanceGliding>(m_BodyStance);\n}\n\n\n\n\n\nbool cPlayer::IsInvisible() const\n{\n\treturn !m_IsVisible || Super::IsInvisible();\n}\n\n\n\n\n\nvoid cPlayer::OnAddToWorld(cWorld & a_World)\n{\n\t// Sends player spawn:\n\tSuper::OnAddToWorld(a_World);\n\n\t// Update world name tracking:\n\tm_CurrentWorldName = m_World->GetName();\n\n\t// Fix to stop the player falling through the world, until we get serversided collision detection:\n\tFreezeInternal(GetPosition(), false);\n\n\t// UpdateCapabilities was called in the constructor, and in OnRemoveFromWorld, possibly changing our visibility.\n\t// If world is in spectator mode, invisibility will need updating. If we just connected, we might be on fire from a previous game.\n\t// Hence, tell the client by sending metadata:\n\tm_ClientHandle->SendEntityMetadata(*this);\n\n\t// Send contents of the inventory window:\n\tm_ClientHandle->SendWholeInventory(*m_CurrentWindow);\n\n\t// Send health (the respawn packet, which understandably resets health, is also used for world travel...):\n\tm_ClientHandle->SendHealth();\n\n\t// Send experience, similar story with the respawn packet:\n\tm_ClientHandle->SendExperience();\n\n\t// Send hotbar active slot (also reset by respawn):\n\tm_ClientHandle->SendHeldItemChange(m_Inventory.GetEquippedSlotNum());\n\n\t// Update player team:\n\tUpdateTeam();\n\n\t// Send scoreboard data:\n\tm_World->GetScoreBoard().SendTo(*m_ClientHandle);\n\n\t// Update the view distance:\n\tm_ClientHandle->SetViewDistance(m_ClientHandle->GetRequestedViewDistance());\n\n\t// Send current weather of target world:\n\tm_ClientHandle->SendWeather(a_World.GetWeather());\n\n\t// Send time:\n\tm_ClientHandle->SendTimeUpdate(a_World.GetWorldAge(), a_World.GetWorldDate(), a_World.IsDaylightCycleEnabled());\n\n\t// Finally, deliver the notification hook:\n\tcRoot::Get()->GetPluginManager()->CallHookPlayerSpawned(*this);\n}\n\n\n\n\n\nvoid cPlayer::OnDetach()\n{\n\tif (m_IsTeleporting)\n\t{\n\t\t// If they are teleporting, no need to figure out position:\n\t\treturn;\n\t}\n\n\tint PosX = POSX_TOINT;\n\tint PosY = POSY_TOINT;\n\tint PosZ = POSZ_TOINT;\n\n\t// Search for a position within an area to teleport player after detachment\n\t// Position must be solid land with two air blocks above.\n\t// If nothing found, player remains where they are.\n\tfor (int x = PosX - 1; x <= (PosX + 1); ++x)\n\t{\n\t\tfor (int y = PosY; y <= (PosY + 3); ++y)\n\t\t{\n\t\t\tfor (int z = PosZ - 1; z <= (PosZ + 1); ++z)\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t(m_World->GetBlock({ x, y, z }) == E_BLOCK_AIR) &&\n\t\t\t\t\t(m_World->GetBlock({ x, y + 1, z }) == E_BLOCK_AIR) &&\n\t\t\t\t\tcBlockInfo::IsSolid(m_World->GetBlock({ x, y - 1, z }))\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tTeleportToCoords(x + 0.5, y, z + 0.5);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cPlayer::OnRemoveFromWorld(cWorld & a_World)\n{\n\tSuper::OnRemoveFromWorld(a_World);\n\n\t// Remove any references to this player pointer by windows in the old world:\n\tCloseWindow(false);\n\n\t// Stop spectation and remove our reference from the spectated:\n\tSpectateEntity(nullptr);\n\n\t// Remove the client handle from the world:\n\tm_World->RemoveClientFromChunks(m_ClientHandle.get());\n\n\tif (m_ClientHandle->IsDestroyed())  // Note: checking IsWorldChangeScheduled not appropriate here since we can disconnecting while having a scheduled warp\n\t{\n\t\t// Disconnecting, do the necessary cleanup.\n\t\t// This isn't in the destructor to avoid crashing accessing destroyed objects during shutdown.\n\n\t\tif (!cRoot::Get()->GetPluginManager()->CallHookPlayerDestroyed(*this))\n\t\t{\n\t\t\tcRoot::Get()->BroadcastChatLeave(fmt::format(FMT_STRING(\"{} has left the game\"), GetName()));\n\t\t\tLOGINFO(\"Player %s has left the game\", GetName());\n\t\t}\n\n\t\t// Remove ourself from everyone's lists:\n\t\tcRoot::Get()->BroadcastPlayerListsRemovePlayer(*this);\n\n\t\t// Atomically decrement player count (in world thread):\n\t\tcRoot::Get()->GetServer()->PlayerDestroyed();\n\n\t\t// We're just disconnecting. The remaining code deals with going through portals, so bail:\n\t\treturn;\n\t}\n\n\tconst auto DestinationDimension = m_WorldChangeInfo.m_NewWorld->GetDimension();\n\n\t// Award relevant achievements:\n\tif (DestinationDimension == dimEnd)\n\t{\n\t\tAwardAchievement(CustomStatistic::AchTheEnd);\n\t}\n\telse if (DestinationDimension == dimNether)\n\t{\n\t\tAwardAchievement(CustomStatistic::AchPortal);\n\t}\n\n\t// Set capabilities based on new world:\n\tUpdateCapabilities();\n\n\t// Clientside warp start:\n\tm_ClientHandle->SendRespawn(DestinationDimension, false);\n\tm_ClientHandle->SendPlayerListUpdateGameMode(*this);\n\tm_World->BroadcastPlayerListUpdateGameMode(*this);\n\n\t// Clear sent chunk lists from the clienthandle:\n\tm_ClientHandle->RemoveFromWorld();\n}\n\n\n\n\n\nvoid cPlayer::SpawnOn(cClientHandle & a_Client)\n{\n\tif (m_ClientHandle.get() == &a_Client)\n\t{\n\t\treturn;\n\t}\n\n\ta_Client.SendPlayerSpawn(*this);\n\ta_Client.SendEntityHeadLook(*this);\n\ta_Client.SendEntityEquipment(*this, 0, m_Inventory.GetEquippedItem());\n\ta_Client.SendEntityEquipment(*this, 1, m_Inventory.GetEquippedBoots());\n\ta_Client.SendEntityEquipment(*this, 2, m_Inventory.GetEquippedLeggings());\n\ta_Client.SendEntityEquipment(*this, 3, m_Inventory.GetEquippedChestplate());\n\ta_Client.SendEntityEquipment(*this, 4, m_Inventory.GetEquippedHelmet());\n}\n\n\n\n\n\nvoid cPlayer::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tif (m_ClientHandle->IsDestroyed())\n\t{\n\t\tDestroy();\n\t\treturn;\n\t}\n\n\tif (!m_ClientHandle->IsPlaying())\n\t{\n\t\t// We're not yet in the game, ignore everything:\n\t\treturn;\n\t}\n\n\t{\n\t\tconst auto TicksElapsed = static_cast<StatisticsManager::StatValue>(std::chrono::duration_cast<cTickTime>(a_Dt).count());\n\n\t\tm_Stats.Custom[CustomStatistic::PlayOneMinute] += TicksElapsed;\n\t\tm_Stats.Custom[CustomStatistic::TimeSinceDeath] += TicksElapsed;\n\n\t\tif (IsCrouched())\n\t\t{\n\t\t\tm_Stats.Custom[CustomStatistic::SneakTime] += TicksElapsed;\n\t\t}\n\t}\n\n\tASSERT((GetParentChunk() != nullptr) && (GetParentChunk()->IsValid()));\n\tASSERT(a_Chunk.IsValid());\n\n\t// Handle a frozen player:\n\tTickFreezeCode();\n\n\tif (\n\t\tm_IsFrozen ||  // Don't do Tick updates if frozen\n\t\tIsWorldChangeScheduled()  // If we're about to change worlds (e.g. respawn), abort processing all world interactions (GH #3939)\n\t)\n\t{\n\t\treturn;\n\t}\n\n\tSuper::Tick(a_Dt, a_Chunk);\n\n\t// Handle charging the bow:\n\tif (m_IsChargingBow)\n\t{\n\t\tm_BowCharge += 1;\n\t}\n\n\t// Handle syncing our position with the entity being spectated:\n\tif (IsGameModeSpectator() && (m_Spectating != nullptr))\n\t{\n\t\tSetYaw(m_Spectating->GetYaw());\n\t\tSetPitch(m_Spectating->GetPitch());\n\t\tSetRoll(m_Spectating->GetRoll());\n\t\tSetPosition(m_Spectating->GetPosition());\n\t}\n\n\tif (IsElytraFlying())\n\t{\n\t\t// Damage elytra, once per second:\n\t\t{\n\t\t\tusing namespace std::chrono_literals;\n\n\t\t\tauto & TicksFlying = std::get<BodyStanceGliding>(m_BodyStance).TicksElytraFlying;\n\t\t\tconst auto TotalFlew = TicksFlying + a_Dt;\n\t\t\tconst auto Periods = static_cast<short>(TotalFlew / 1s);\n\t\t\tTicksFlying = std::chrono::duration_cast<cTickTime>(TotalFlew - Periods * 1s);\n\n\t\t\tUseItem(cInventory::invArmorOffset + 1, Periods);\n\t\t}\n\n\t\t// Check if flight is still possible:\n\t\tif (IsOnGround() || IsInWater() || IsRiding() || (GetEquippedChestplate().m_ItemType != E_ITEM_ELYTRA))\n\t\t{\n\t\t\tSetElytraFlight(false);\n\t\t}\n\t}\n\telse if (IsInBed())\n\t{\n\t\t// Check if sleeping is still possible:\n\t\tif ((GetPosition().Floor() != m_RespawnPosition) || (m_World->GetBlock(m_RespawnPosition) != E_BLOCK_BED))\n\t\t{\n\t\t\tm_ClientHandle->HandleLeaveBed();\n\t\t}\n\t}\n\n\tBroadcastMovementUpdate(m_ClientHandle.get());\n\n\tif (m_Health > 0)  // make sure player is alive\n\t{\n\t\tif ((m_EatingFinishTick >= 0_tick) && (m_EatingFinishTick <= m_World->GetWorldAge()))\n\t\t{\n\t\t\tFinishEating();\n\t\t}\n\n\t\tHandleFood();\n\t}\n\n\tif (m_IsFishing)\n\t{\n\t\tHandleFloater();\n\t}\n\n\t// Update items (e.g. Maps)\n\tm_Inventory.UpdateItems();\n\n\tif (m_TicksUntilNextSave == 0)\n\t{\n\t\tSaveToDisk();\n\t\tm_TicksUntilNextSave = PLAYER_INVENTORY_SAVE_INTERVAL;\n\t}\n\telse\n\t{\n\t\tm_TicksUntilNextSave--;\n\t}\n}\n"
  },
  {
    "path": "src/Entities/Player.h",
    "content": "\n#pragma once\n\n#include \"Pawn.h\"\n#include \"../Inventory.h\"\n#include \"../Defines.h\"\n#include \"../World.h\"\n#include \"../Items/ItemHandler.h\"\n\n#include \"../StatisticsManager.h\"\n\n#include \"../UUID.h\"\n\n\n\n\n\nclass cWindow;\nclass cClientHandle;\nclass cTeam;\n\n\n\n\n\n// tolua_begin\nclass cPlayer:\n\tpublic cPawn\n{\n\t// tolua_end\n\n\tusing Super = cPawn;\n\n\t/** Tag representing a sneaking pose. */\n\tstruct BodyStanceCrouching\n\t{\n\t\tBodyStanceCrouching(cPlayer & a_Player);\n\t};\n\n\t/** Tag representing a sleeping pose.\n\tSet by a right click on unoccupied bed, unset by a time fast forward or teleport. */\n\tstruct BodyStanceSleeping\n\t{\n\t\tBodyStanceSleeping(cPlayer & a_Player);\n\t};\n\n\t/** Tag representing a sprinting pose. */\n\tstruct BodyStanceSprinting\n\t{\n\t};\n\n\t/** Tag representing the neutral stance. */\n\tstruct BodyStanceStanding\n\t{\n\t\tBodyStanceStanding(cPlayer & a_Player);\n\t};\n\n\t/** Tag representing a swimming or elytra flying pose. */\n\tstruct BodyStanceGliding\n\t{\n\t\tBodyStanceGliding(cPlayer & a_Player);\n\n\t\tcTickTime TicksElytraFlying;\n\t};\n\n\t/*\n\tstruct HandStanceNeutral\n\t{\n\t};\n\n\tstruct HandStandChargingBow\n\t{\n\t\tint m_BowCharge;\n\t};\n\n\tstruct HandStanceEating\n\t{\n\t};\n\t*/\n\n\t// tolua_begin\n\npublic:\n\n\tstatic const int MAX_HEALTH;\n\n\tstatic const int MAX_FOOD_LEVEL;\n\n\t// tolua_end\n\n\tCLASS_PROTODEF(cPlayer)\n\n\tcPlayer(const std::shared_ptr<cClientHandle> & a_Client);\n\tvirtual ~cPlayer() override;\n\n\t/** Called when spectation stops, because the player crouched or when the entity we're spectating gets removed from the world. */\n\tvoid OnLoseSpectated();\n\n\t// tolua_begin\n\n\t/** Sets the experience total\n\tReturns true on success\n\t\"should\" really only be called at init or player death, plugins excepted\n\t*/\n\tbool SetCurrentExperience(int a_XpTotal);\n\n\t/* changes Xp by Xp_delta, you \"shouldn't\" inc more than MAX_EXPERIENCE_ORB_SIZE\n\tWont't allow xp to go negative\n\tReturns the new current experience, -1 on error\n\t*/\n\tint DeltaExperience(int a_Xp_delta);\n\n\t/** Gets the experience total - XpTotal for score on death */\n\tinline int GetXpLifetimeTotal(void) { return m_LifetimeTotalXp; }\n\n\t/** Gets the current experience */\n\tinline int GetCurrentXp(void) { return m_CurrentXp; }\n\n\t/** Gets the current level - XpLevel */\n\tint GetXpLevel(void) const;\n\n\t/** Gets the experience bar percentage - XpP */\n\tfloat GetXpPercentage(void) const;\n\n\t/** Calculates the amount of XP needed for a given level\n\tRef: https://minecraft.wiki/w/XP\n\t*/\n\tstatic int XpForLevel(int a_Level);\n\n\t/** Inverse of XpForLevel\n\tRef: https://minecraft.wiki/w/XP\n\tvalues are as per this with pre-calculations\n\t*/\n\tstatic int CalcLevelFromXp(int a_CurrentXp);\n\n\t// tolua_end\n\n\t/** Gets the set of IDs for recipes this player has discovered. */\n\tconst std::set<UInt32> & GetKnownRecipes() const;\n\n\t/** Starts charging the equipped bow */\n\tvoid StartChargingBow(void);\n\n\t/** Finishes charging the current bow. Returns the number of ticks for which the bow has been charged */\n\tint FinishChargingBow(void);\n\n\t/** Cancels the current bow charging */\n\tvoid CancelChargingBow(void);\n\n\t/** Gets If The Player Is Teleporting To Fix https://github.com/cuberite/cuberite/issues/5542 */\n\tbool GetIsTeleporting() { return m_IsTeleporting; }\n\n\t/** Returns true if the player is currently charging the bow */\n\tbool IsChargingBow(void) const { return m_IsChargingBow; }\n\n\tvoid SetTouchGround(bool a_bTouchGround);\n\tdouble GetEyeHeight(void) const;  // tolua_export\n\tVector3d GetEyePosition(void) const;  // tolua_export\n\tinline cInventory &       GetInventory(void)       { return m_Inventory; }  // tolua_export\n\tinline const cInventory & GetInventory(void) const { return m_Inventory; }\n\n\t/** Gets the contents of the player's associated enderchest */\n\tcItemGrid & GetEnderChestContents(void) { return m_EnderChestContents; }\n\n\tinline const cItem & GetEquippedItem(void) const { return GetInventory().GetEquippedItem(); }  // tolua_export\n\n\t/** Returns whether the player is climbing (ladders, vines etc.) */\n\tbool IsClimbing(void) const;\n\n\tvirtual void TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ) override;\n\n\t/** Updates player's capabilities - flying, visibility, etc. from their gamemode. */\n\tvoid UpdateCapabilities();\n\n\t// tolua_begin\n\n\t/** Prevent the player from moving and lock him into a_Location. */\n\tvoid Freeze(const Vector3d & a_Location);\n\n\t/** Is the player frozen? */\n\tbool IsFrozen();\n\n\t/** Cancels Freeze(...) and allows the player to move naturally. */\n\tvoid Unfreeze();\n\n\t/** Sends the \"look\" packet to the player, forcing them to set their rotation to the specified values.\n\ta_YawDegrees is clipped to range [-180, +180),\n\ta_PitchDegrees is clipped to range [-180, +180) but the client only uses [-90, +90]\n\t*/\n\tvoid SendRotation(double a_YawDegrees, double a_PitchDegrees);\n\n\t/** Spectates the target entity. If a_Target is nullptr or a pointer to self, end spectation. */\n\tvoid SpectateEntity(cEntity * a_Target);\n\n\t/** Returns the position where projectiles thrown by this player should start, player eye position + adjustment */\n\tVector3d GetThrowStartPos(void) const;\n\n\t/** Returns the initial speed vector of a throw, with a 3D length of a_SpeedCoeff. */\n\tVector3d GetThrowSpeed(double a_SpeedCoeff) const;\n\n\t/** Returns the current gamemode. Partly OBSOLETE, you should use IsGameModeXXX() functions wherever applicable */\n\teGameMode GetGameMode(void) const { return m_GameMode; }\n\n\t/** Returns the current effective gamemode (inherited gamemode is resolved before returning) */\n\teGameMode GetEffectiveGameMode(void) const;\n\n\t/** Sets the gamemode for the player.\n\tThe gamemode may be gmNotSet, in that case the player inherits the world's gamemode.\n\tUpdates the gamemode on the client (sends the packet)\n\t*/\n\tvoid SetGameMode(eGameMode a_GameMode);\n\n\t/** Returns true if the player is in Creative mode, either explicitly, or by inheriting from current world */\n\tbool IsGameModeCreative(void) const;\n\n\t/** Returns true if the player is in Survival mode, either explicitly, or by inheriting from current world */\n\tbool IsGameModeSurvival(void) const;\n\n\t/** Returns true if the player is in Adventure mode, either explicitly, or by inheriting from current world */\n\tbool IsGameModeAdventure(void) const;\n\n\t/** Returns true if the player is in Spectator mode, either explicitly, or by inheriting from current world */\n\tbool IsGameModeSpectator(void) const;\n\n\t/** Returns true if the player is fireproof\n\tStops players burning in creative or spectator modes.\n\t*/\n\tvirtual bool IsFireproof() const override\n\t{\n\t\treturn (m_IsFireproof || IsGameModeCreative() || IsGameModeSpectator());\n\n\t}\n\n\t/** Returns true if the player can be targeted by Mobs */\n\tbool CanMobsTarget(void) const;\n\n\tAString GetIP(void) const;  // tolua_export\n\n\t/** Return the associated statistic and achievement manager. */\n\tStatisticsManager & GetStatistics() { return m_Stats; }\n\n\t/** Returns the associated team, nullptr if none */\n\tcTeam * GetTeam(void) { return m_Team; }  // tolua_export\n\n\t/** Returns the associated team, nullptr if none */\n\tconst cTeam * GetTeam(void) const { return m_Team; }\n\n\t/** Sets the player team, nullptr if none */\n\tvoid SetTeam(cTeam * a_Team);\n\n\t// tolua_end\n\n\t/** Forces the player to query the scoreboard for his team */\n\tcTeam * UpdateTeam(void);\n\n\t/** Awards the player an achievement.\n\tIf all prerequisites are met, this method will award the achievement and will broadcast a chat message.\n\tIf the achievement has been already awarded to the player, this method will just increment the stat counter. */\n\tvoid AwardAchievement(CustomStatistic a_Ach);\n\n\t/** Forces the player to move in the given direction.\n\t@deprecated Use SetSpeed instead. */\n\tvoid ForceSetSpeed(const Vector3d & a_Speed);  // tolua_export\n\n\tcWindow * GetWindow(void) { return m_CurrentWindow; }  // tolua_export\n\tconst cWindow * GetWindow(void) const { return m_CurrentWindow; }\n\n\t// tolua_begin\n\n\t/** Opens the specified window; closes the current one first using CloseWindow() */\n\tvoid OpenWindow(cWindow & a_Window);\n\n\t/** Closes the current window, resets current window to m_InventoryWindow. A plugin may refuse the closing if a_CanRefuse is true */\n\tvoid CloseWindow(bool a_CanRefuse = true);\n\n\t/** Closes the current window if it matches the specified ID, resets current window to m_InventoryWindow */\n\tvoid CloseWindowIfID(char a_WindowID, bool a_CanRefuse = true);\n\n\tcClientHandle * GetClientHandle(void) const { return m_ClientHandle.get(); }\n\n\t// tolua_end\n\n\t/** Get a copy of the PRNG for enchanting related generation, don't use this for other purposes.\n\tThe PRNG's state is initialised with an internal seed, such that until PermuteEnchantmentSeed is called, this function returns the same PRNG. */\n\tMTRand GetEnchantmentRandomProvider();\n\n\t/** Permute the seed for enchanting related PRNGs, don't use this for other purposes. */\n\tvoid PermuteEnchantmentSeed();\n\n\t// tolua_begin\n\n\tvoid SendMessage              (const AString & a_Message);\n\tvoid SendMessageInfo          (const AString & a_Message);\n\tvoid SendMessageFailure       (const AString & a_Message);\n\tvoid SendMessageSuccess       (const AString & a_Message);\n\tvoid SendMessageWarning       (const AString & a_Message);\n\tvoid SendMessageFatal         (const AString & a_Message);\n\tvoid SendMessagePrivateMsg    (const AString & a_Message, const AString & a_Sender);\n\tvoid SendMessage              (const cCompositeChat & a_Message);\n\tvoid SendMessageRaw           (const AString & a_MessageRaw, eChatType a_Type = eChatType::ctChatBox);\n\tvoid SendSystemMessage        (const AString & a_Message);\n\tvoid SendAboveActionBarMessage(const AString & a_Message);\n\tvoid SendSystemMessage        (const cCompositeChat & a_Message);\n\tvoid SendAboveActionBarMessage(const cCompositeChat & a_Message);\n\n\tconst AString & GetName(void) const;\n\n\t// tolua_end\n\n\tbool HasPermission(const AString & a_Permission) const;  // tolua_export\n\n\t/** Returns true iff a_Permission matches the a_Template.\n\tA match is defined by either being exactly the same, or each sub-item matches until there's a wildcard in a_Template.\n\tIe. {\"a\", \"b\", \"c\"} matches {\"a\", \"b\", \"*\"} but doesn't match {\"a\", \"b\"} */\n\tstatic bool PermissionMatches(const AStringVector & a_Permission, const AStringVector & a_Template);  // Exported in ManualBindings with AString params\n\n\t/** Returns all the permissions that the player has assigned to them. */\n\tconst AStringVector & GetPermissions(void) const { return m_Permissions; }  // Exported in ManualBindings.cpp\n\n\t/** Returns all the restrictions that the player has assigned to them. */\n\tconst AStringVector & GetRestrictions(void) const { return m_Restrictions; }  // Exported in ManualBindings.cpp\n\n\t// tolua_begin\n\n\t/** Returns the full color code to use for this player, based on their rank.\n\tThe returned value either is empty, or includes the cChatColor::Delimiter. */\n\tAString GetColor(void) const;\n\n\t/** Returns the player name prefix, may contain @ format directives */\n\tAString GetPrefix(void) const;\n\n\t/** Returns the player name suffix, may contain @ format directives */\n\tAString GetSuffix(void) const;\n\n\t/** Returns the name that is used in the playerlist. */\n\tAString GetPlayerListName(void) const;\n\n\t/** tosses the item in the selected hotbar slot */\n\tvoid TossEquippedItem(char a_Amount = 1);\n\n\t/** Removes one item from the the current equipped item stack, and attempts to add the specified item stack\n\tback to the same slot. If it is not possible to place the item in the same slot, tries to place the specified\n\titem elsewhere in the inventory. If this is not possible, then any remaining items are tossed. If the currently\n\tequipped slot is empty, its contents are simply set to the given Item.\n\t*/\n\tvoid ReplaceOneEquippedItemTossRest(const cItem &);\n\n\t/** tosses the item held in hand (when in UI windows) */\n\tvoid TossHeldItem(char a_Amount = 1);\n\n\t/** tosses a pickup newly created from a_Item */\n\tvoid TossPickup(const cItem & a_Item);\n\n\t/** Heals the player by the specified amount of HPs (positive only); sends health update */\n\tvirtual void Heal(int a_Health) override;\n\n\tint    GetFoodLevel                 (void) const { return m_FoodLevel; }\n\tdouble GetFoodSaturationLevel       (void) const { return m_FoodSaturationLevel; }\n\tint    GetFoodTickTimer             (void) const { return m_FoodTickTimer; }\n\tdouble GetFoodExhaustionLevel       (void) const { return m_FoodExhaustionLevel; }\n\n\t/** Returns true if the player is satiated, i. e. their foodlevel is at the max and they cannot eat anymore */\n\tbool IsSatiated(void) const { return (m_FoodLevel >= MAX_FOOD_LEVEL); }\n\n\tvoid SetFoodLevel                 (int a_FoodLevel);\n\tvoid SetFoodSaturationLevel       (double a_FoodSaturationLevel);\n\tvoid SetFoodTickTimer             (int a_FoodTickTimer);\n\tvoid SetFoodExhaustionLevel       (double a_FoodExhaustionLevel);\n\n\t/** Adds to FoodLevel and FoodSaturationLevel, returns true if any food has been consumed, false if player \"full\" */\n\tbool Feed(int a_Food, double a_Saturation);\n\n\t/** Adds the specified exhaustion to m_FoodExhaustion. Expects only positive values. */\n\tvoid AddFoodExhaustion(double a_Exhaustion);\n\n\t/** Returns true if the player is currently in the process of eating the currently equipped item */\n\tbool IsEating(void) const { return m_EatingFinishTick >= 0_tick; }\n\n\t/** Returns true if the player is currently flying */\n\tbool IsFlying(void) const { return m_IsFlying; }\n\n\t/** Returns true if a player is sleeping in a bed. */\n\tbool IsInBed(void) const;\n\n\t/** Returns true if the player's left hand is dominant. */\n\tbool IsLeftHanded() const;\n\n\t/** Returns true if the player has thrown out a floater */\n\tbool IsFishing(void) const { return m_IsFishing; }\n\n\tvoid SetIsFishing(bool a_IsFishing, UInt32 a_FloaterID = cEntity::INVALID_ID) { m_IsFishing = a_IsFishing; m_FloaterID = a_FloaterID; }\n\n\tUInt32 GetFloaterID(void) const { return m_FloaterID; }\n\n\t// tolua_end\n\n\t/** Returns true if a player is standing normally, that is, in a neutral pose. */\n\tbool IsStanding() const;\n\n\t/** Tosses a list of items. */\n\tvoid TossItems(const cItems & a_Items);\n\n\t/** Sets a player's in-bed state.\n\tWe can't be sure plugins will keep this value updated, so no exporting.\n\tIf value is false (not in bed), will update players of the fact that they have been ejected from the bed. */\n\tvoid SetIsInBed(bool a_IsInBed);\n\n\t/** Starts eating the currently equipped item. Resets the eating timer and sends the proper animation packet */\n\tvoid StartEating(void);\n\n\t/** Finishes eating the currently equipped item. Consumes the item, updates health and broadcasts the packets */\n\tvoid FinishEating(void);\n\n\t/** Aborts the current eating operation */\n\tvoid AbortEating(void);\n\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\n\tvirtual void Killed(const cEntity & a_Victim, eDamageType a_DamageType) override;\n\n\tvoid Respawn(void);  // tolua_export\n\n\tvoid SetVisible( bool a_bVisible);  // tolua_export\n\n\t/** Saves all player data, such as inventory, to JSON. */\n\tvoid SaveToDisk(void);\n\n\t/** Loads the player data from the save file.\n\tSets m_World to the world where the player will spawn, based on the stored world name or the default world by calling LoadFromFile(). */\n\tvoid LoadFromDisk();\n\n\tconst AString & GetLoadedWorldName() const { return m_CurrentWorldName; }\n\n\t/** Opens the inventory of any tame horse the player is riding.\n\tIf the player is not riding a horse or if the horse is untamed, does nothing. */\n\tvoid OpenHorseInventory();\n\n\t/** Damage the player's equipped item by a_Damage, possibly less if the\n\tequipped item is enchanted. */\n\tvoid UseEquippedItem(short a_Damage = 1);\n\n\t/** Damage the player's equipped item by the amount of damage such an item\n\tis damaged by when used for a_Action */\n\tvoid UseEquippedItem(cItemHandler::eDurabilityLostAction a_Action);\n\n\t/** Damage the item in a_SlotNumber by a_Damage, possibly less if the\n\tequipped item is enchanted. */\n\tvoid UseItem(int a_SlotNumber, short a_Damage = 1);\n\n\t/** In UI windows, get the item that the player is dragging */\n\tcItem & GetDraggingItem(void) {return m_DraggingItem; }  // tolua_export\n\n\t/** In UI windows, set the item that the player is dragging */\n\tvoid SetDraggingItem(const cItem & a_Item);  // tolua_export\n\n\t// In UI windows, when inventory-painting:\n\t/** Clears the list of slots that are being inventory-painted. To be used by cWindow only */\n\tvoid ClearInventoryPaintSlots(void);\n\n\t/** Adds a slot to the list for inventory painting. To be used by cWindow only */\n\tvoid AddInventoryPaintSlot(int a_SlotNum);\n\n\t/** Returns the list of slots currently stored for inventory painting. To be used by cWindow only */\n\tconst cSlotNums & GetInventoryPaintSlots(void) const;\n\n\t// tolua_begin\n\n\t/** Returns the current relative maximum speed (takes current sprinting / flying state into account) */\n\tdouble GetMaxSpeed(void) const;\n\n\t/** Gets the normal relative maximum speed */\n\tdouble GetNormalMaxSpeed(void) const { return m_NormalMaxSpeed; }\n\n\t/** Gets the sprinting relative maximum speed */\n\tdouble GetSprintingMaxSpeed(void) const { return m_SprintingMaxSpeed; }\n\n\t/** Gets the flying relative maximum speed */\n\tdouble GetFlyingMaxSpeed(void) const { return m_FlyingMaxSpeed; }\n\n\t/** Sets the normal relative maximum speed. Sends the update to player, if needed. */\n\tvoid SetNormalMaxSpeed(double a_Speed);\n\n\t/** Sets the sprinting relative maximum speed. Sends the update to player, if needed. */\n\tvoid SetSprintingMaxSpeed(double a_Speed);\n\n\t/** Sets the flying relative maximum speed. Sends the update to player, if needed. */\n\tvoid SetFlyingMaxSpeed(double a_Speed);\n\n\t/** Starts or stops crouching, if our current body stance permits, broadcasting the state change. */\n\tvoid SetCrouch(bool a_ShouldCrouch);\n\n\t/** Starts or stops elytra flight, if our current body stance permits, broadcasting the state change. */\n\tvoid SetElytraFlight(bool a_ShouldElytraFly);\n\n\t/** Starts or stops flying, broadcasting the state change. */\n\tvoid SetFlying(bool a_ShouldFly);\n\n\t/** Sets the dominant hand of the player. */\n\tvoid SetLeftHanded(bool a_IsLeftHanded);\n\n\t/** Starts or stops sprinting, if our current body stance permits, broadcasting the state change. */\n\tvoid SetSprint(bool a_ShouldSprint);\n\n\t/** If true the player can fly even when he's not in creative. */\n\tvoid SetCanFly(bool a_CanFly);\n\n\t/** Returns true if the player has a custom name. */\n\tbool HasCustomName(void) const { return !m_CustomName.empty(); }\n\n\t/** Returns the custom name of this player. If the player hasn't a custom name, it will return an empty string. */\n\tconst AString & GetCustomName(void) const { return m_CustomName; }\n\n\t/** Sets the custom name of this player. If you want to disable the custom name, simply set an empty string.\n\tThe custom name will be used in the tab-list, in the player nametag and in the tab-completion. */\n\tvoid SetCustomName(const AString & a_CustomName);\n\n\t/** Gets the player's potential respawn position (named LastBedPos for compatibility reasons). */\n\tVector3i GetLastBedPos(void) const { return m_RespawnPosition; }\n\n\t/** Returns if the respawn point is unconditionally used. */\n\tbool IsRespawnPointForced(void) const { return m_IsRespawnPointForced; }\n\n\t/** Sets the player's bed position to the specified position.\n\tSets the respawn world to the player's world and unforces the respawn point.\n\tThe given position will be used subject to bed checks when respawning. */\n\tvoid SetBedPos(Vector3i a_Position);\n\n\t/** Sets the player's bed position to the specified position.\n\tThe spawn point is unforced. The given position will be used subject to bed checks when respawning. */\n\tvoid SetBedPos(Vector3i a_Position, const cWorld & a_World);\n\n\t/** Sets the player's forced respawn position and world. */\n\tvoid SetRespawnPosition(Vector3i a_Position, const cWorld & a_World);\n\n\t// tolua_end\n\n\t// TODO lua export GetRespawnWorld\n\tcWorld * GetRespawnWorld();\n\n\t/** Update movement-related statistics. */\n\tvoid UpdateMovementStats(const Vector3d & a_DeltaPos, bool a_PreviousIsOnGround);\n\n\t/** Whether placing the given blocks would intersect any entitiy */\n\tbool DoesPlacingBlocksIntersectEntity(std::initializer_list<sSetBlock> a_Blocks) const;\n\n\t/** Returns the UUID that has been read from the client, or nil if not available. */\n\tconst cUUID & GetUUID(void) const;  // Exported in ManualBindings.cpp\n\n\t// tolua_begin\n\n\t/** Returns wheter the player can fly or not. */\n\tvirtual bool CanFly(void) const { return m_IsFlightCapable; }\n\n\t/** (Re)loads the rank and permissions from the cRankManager and sends a permission level update to the client. */\n\tvoid LoadRank(void);\n\n\t/** Sends the block in the specified range around the specified coord to the client\n\tas a block change packet.\n\tThe blocks in range (a_BlockX - a_Range, a_BlockX + a_Range) are sent (NY-metric). */\n\tvoid SendBlocksAround(Vector3i a_BlockPos, int a_Range = 1);\n\n\tbool HasSkinPart(eSkinPart a_Part) const { return (m_SkinParts & a_Part) != 0; }\n\tint GetSkinParts(void) const { return m_SkinParts; }\n\tvoid SetSkinParts(int a_Parts);\n\n\t// tolua_end\n\n\t/** Attempts to place the block in the world with a call to PlaceBlocks. */\n\tbool PlaceBlock(Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** Calls the block placement hooks and places the blocks in the world.\n\tFirst the \"placing\" hooks for all the blocks are called, then the blocks are placed, and finally the \"placed\" hooks are called.\n\tIf the any of the \"placing\" hooks aborts, none of the blocks are placed and the function returns false.\n\tReturns true if all the blocks are placed. */\n\tbool PlaceBlocks(std::initializer_list<sSetBlock> a_Blocks);\n\n\t/** Notify nearby wolves that the player or one of the player's wolves took damage or did damage to an entity\n\t@param a_Opponent the opponent we're fighting.\n\t@param a_IsPlayerInvolved Should be true if the player took or did damage, and false if one of the player's wolves took or did damage.\n\t*/\n\tvoid NotifyNearbyWolves(cPawn * a_Opponent, bool a_IsPlayerInvolved);\n\n\t/** Returns the progress mined per tick for the block a_Block as a fraction\n\t(1 would be completely mined)\n\tDepends on hardness values so check those are correct.\n\tSource: https://minecraft.wiki/w/Breaking#Calculation */\n\tfloat GetMiningProgressPerTick(BLOCKTYPE a_Block);\n\n\t/** Given tool, enchantments, status effects, and world position\n\treturns whether a_Block would be instantly mined.\n\tDepends on hardness values so check those are correct.\n\tSource: https://minecraft.wiki/w/Breaking#Instant_breaking */\n\tbool CanInstantlyMine(BLOCKTYPE a_Block);\n\n\t/** Adds an Item to the list of known items.\n\tIf the item is already known, does nothing. */\n\tvoid AddKnownItem(const cItem & a_Item);\n\n\t// cEntity overrides:\n\tvirtual cItem GetEquippedWeapon(void) const override { return m_Inventory.GetEquippedItem(); }\n\tvirtual cItem GetEquippedHelmet(void) const override { return m_Inventory.GetEquippedHelmet(); }\n\tvirtual cItem GetEquippedChestplate(void) const override { return m_Inventory.GetEquippedChestplate(); }\n\tvirtual cItem GetEquippedLeggings(void) const override { return m_Inventory.GetEquippedLeggings(); }\n\tvirtual cItem GetEquippedBoots(void) const override { return m_Inventory.GetEquippedBoots(); }\n\tvirtual cItem GetOffHandEquipedItem(void) const override { return m_Inventory.GetShieldSlot(); }\n\tvirtual bool IsCrouched(void) const override;\n\tvirtual bool IsOnGround(void) const override { return m_bTouchGround; }\n\tvirtual bool IsSprinting(void) const override;\n\nprivate:\n\n\ttypedef std::vector<std::vector<AString> > AStringVectorVector;\n\n\t/** The current body stance the player has adopted. */\n\tstd::variant<BodyStanceCrouching, BodyStanceSleeping, BodyStanceSprinting, BodyStanceStanding, BodyStanceGliding> m_BodyStance;\n\n\t/** The name of the rank assigned to this player. */\n\tAString m_Rank;\n\n\t/** All the permissions that this player has, based on their rank. */\n\tAStringVector m_Permissions;\n\n\t/** All the restrictions that this player has, based on their rank. */\n\tAStringVector m_Restrictions;\n\n\t/** All the permissions that this player has, based on their rank, split into individual dot-delimited parts.\n\tThis is used mainly by the HasPermission() function to optimize the lookup. */\n\tAStringVectorVector m_SplitPermissions;\n\n\t/** All the restrictions that this player has, based on their rank, split into individual dot-delimited parts.\n\tThis is used mainly by the HasPermission() function to optimize the lookup. */\n\tAStringVectorVector m_SplitRestrictions;\n\n\t// Message visuals:\n\tAString m_MsgPrefix, m_MsgSuffix;\n\tAString m_MsgNameColorCode;\n\n\t// Food-related variables:\n\t/** Represents the food bar, one point equals half a \"drumstick\" */\n\tint m_FoodLevel;\n\n\t/** \"Overcharge\" for the m_FoodLevel; is depleted before m_FoodLevel */\n\tdouble m_FoodSaturationLevel;\n\n\t/** Count-up to the healing or damaging action, based on m_FoodLevel */\n\tint m_FoodTickTimer;\n\n\t/** A \"buffer\" which adds up hunger before it is substracted from m_FoodSaturationLevel or m_FoodLevel. Each action adds a little */\n\tdouble m_FoodExhaustionLevel;\n\n\t/** Stores the player's inventory, consisting of crafting grid, hotbar, and main slots */\n\tcInventory m_Inventory;\n\n\t/** An item grid that stores the player specific enderchest contents */\n\tcItemGrid m_EnderChestContents;\n\n\tcWindow * m_CurrentWindow;\n\tcWindow * m_InventoryWindow;\n\n\t/** The player's potential respawn position, initialised to world spawn by default.\n\tDuring player respawn from death, if m_IsRespawnPointForced is false and no bed exists here, it will be reset to world spawn. */\n\tVector3i m_RespawnPosition;\n\n\t/** The name of the world which the player respawns in upon death.\n\tThis is stored as a string to enable SaveToDisk to not touch cRoot, and thus can be safely called in the player's destructor. */\n\tstd::string m_SpawnWorldName;\n\n\t/** The name of the world which the player currently resides in.\n\tStored in addition to m_World to allow SaveToDisk to be safely called in the player's destructor. */\n\tstd::string m_CurrentWorldName;\n\n\t/** The save path of the default world. */\n\tstd::string m_DefaultWorldPath;\n\n\teGameMode m_GameMode;\n\n\t/** The item being dragged by the cursor while in a UI window */\n\tcItem m_DraggingItem;\n\n\tstd::shared_ptr<cClientHandle> m_ClientHandle;\n\n\tcSlotNums m_InventoryPaintSlots;\n\n\t/** Max speed, relative to the game default.\n\t1 means regular speed, 2 means twice as fast, 0.5 means half-speed.\n\tDefault value is 1. */\n\tdouble m_NormalMaxSpeed;\n\n\t/** Max speed, relative to the game default max speed, when sprinting.\n\t1 means regular speed, 2 means twice as fast, 0.5 means half-speed.\n\tDefault value is 1.3. */\n\tdouble m_SprintingMaxSpeed;\n\n\t/** Max speed, relative to the game default flying max speed, when flying.\n\t1 means regular speed, 2 means twice as fast, 0.5 means half-speed.\n\tDefault value is 1. */\n\tdouble m_FlyingMaxSpeed;\n\n\tbool m_IsChargingBow;\n\tbool m_IsFishing;\n\n\t/** If this is true the player can fly. Even if he is not in creative. */\n\tbool m_IsFlightCapable;\n\n\tbool m_IsFlying;\n\n\t/** If true, we are locking m_Position to m_FrozenPosition. */\n\tbool m_IsFrozen;\n\n\t/** Whether the player is left-handed, or right-handed. */\n\tbool m_IsLeftHanded;\n\n\t/** Was the player frozen manually by a plugin or automatically by the server? */\n\tbool m_IsManuallyFrozen;\n\n\t/** Whether we unconditionally respawn to m_RespawnPosition, or check if a bed is unobstructed and available first. */\n\tbool m_IsRespawnPointForced;\n\n\t/** Flag used by food handling system to determine whether a teleport has just happened.\n\tWill not apply food penalties if found to be true; will set to false after processing. */\n\tbool m_IsTeleporting;\n\n\tbool m_IsVisible;\n\n\t/** The world tick in which eating will be finished. -1 if not eating */\n\tcTickTimeLong m_EatingFinishTick;\n\n\t/** Player Xp level */\n\tint m_LifetimeTotalXp;\n\tint m_CurrentXp;\n\tunsigned int m_EnchantmentSeed;\n\n\tint m_BowCharge;\n\n\tUInt32 m_FloaterID;\n\n\tcTeam * m_Team;\n\n\t/** The entity that this player is spectating, nullptr if none. */\n\tcEntity * m_Spectating;\n\n\tStatisticsManager m_Stats;\n\n\t/** How long till the player's inventory will be saved\n\tDefault save interval is #defined in PLAYER_INVENTORY_SAVE_INTERVAL */\n\tunsigned int m_TicksUntilNextSave;\n\n\tAString m_CustomName;\n\n\t/** Displayed skin part bit mask */\n\tint m_SkinParts;\n\n\t/** List on known recipes as Ids */\n\tstd::set<UInt32> m_KnownRecipes;\n\n\t/** List of known items as Ids */\n\tstd::set<cItem, cItem::sItemCompare> m_KnownItems;\n\n\t/** Called in each tick to handle food-related processing */\n\tvoid HandleFood(void);\n\n\t/** Called in each tick if the player is fishing to make sure the floater dissapears when the player doesn't have a fishing rod as equipped item. */\n\tvoid HandleFloater(void);\n\n\t/** Returns the filename for the player data based on the UUID given.\n\tThis can be used both for online and offline UUIDs. */\n\tAString GetUUIDFileName(const cUUID & a_UUID);\n\n\t/** Pins the player to a_Location until Unfreeze() is called.\n\tIf ManuallyFrozen is false, the player will unfreeze when the chunk is loaded. */\n\tvoid FreezeInternal(const Vector3d & a_Location, bool a_ManuallyFrozen);\n\n\t/** Returns how high the liquid is in percent. Used by IsInsideWater */\n\tfloat GetLiquidHeightPercent(NIBBLETYPE a_Meta);\n\n\t/** Checks if the player is inside of water */\n\tbool IsInsideWater();\n\n\t/** Returns the dig speed using the current tool on the block a_Block.\n\tReturns one if using hand.\n\tIf the player is using a tool that is good to break the block the value is higher.\n\tIf he has an enchanted tool with efficiency or he has a haste or mining fatique effect it gets multiplied by a specific factor depending on the strength of the effect or enchantment.\n\tIn he is in water it gets divided by 5 except if his tool is enchanted with aqua affinity.\n\tIf he is not on ground it also gets divided by 5.\n\tSource: https://minecraft.wiki/w/Breaking#Calculation */\n\tfloat GetDigSpeed(BLOCKTYPE a_Block);\n\n\t/** Add the recipe Id to the known recipes.\n\tIf the recipe is already known, does nothing. */\n\tvoid AddKnownRecipe(UInt32 RecipeId);\n\n\tvoid TickFreezeCode();\n\n\t/** (Re)loads the rank and permissions from the cRankManager.\n\tLoads the m_Rank, m_Permissions, m_MsgPrefix, m_MsgSuffix and m_MsgNameColorCode members. */\n\tvoid RefreshRank();\n\n\t// cEntity overrides:\n\tvirtual void ApplyArmorDamage(int DamageBlocked) override;\n\tvirtual void BroadcastMovementUpdate(const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual bool DoTakeDamage(TakeDamageInfo & TDI) override;\n\tvirtual float GetEnchantmentBlastKnockbackReduction() override;\n\tvirtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk &) override { UNUSED(a_Dt); }\n\tvirtual bool IsElytraFlying(void) const override;\n\tvirtual bool IsInvisible() const override;\n\tvirtual bool IsRclking(void) const override { return IsEating() || IsChargingBow(); }\n\tvirtual void OnAddToWorld(cWorld & a_World) override;\n\tvirtual void OnDetach() override;\n\tvirtual void OnRemoveFromWorld(cWorld & a_World) override;\n\tvirtual void SpawnOn(cClientHandle & a_Client) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/ProjectileEntity.cpp",
    "content": "\n// ProjectileEntity.cpp\n\n// Implements the cProjectileEntity class representing the common base class for projectiles, as well as individual projectile types\n\n#include \"Globals.h\"\n\n#include \"../Bindings/PluginManager.h\"\n#include \"ProjectileEntity.h\"\n#include \"../BlockInfo.h\"\n#include \"../ClientHandle.h\"\n#include \"../LineBlockTracer.h\"\n#include \"../BoundingBox.h\"\n#include \"../ChunkMap.h\"\n#include \"../Chunk.h\"\n\n#include \"ArrowEntity.h\"\n#include \"ThrownEggEntity.h\"\n#include \"ThrownEnderPearlEntity.h\"\n#include \"ExpBottleEntity.h\"\n#include \"ThrownSnowballEntity.h\"\n#include \"FireChargeEntity.h\"\n#include \"FireworkEntity.h\"\n#include \"GhastFireballEntity.h\"\n#include \"WitherSkullEntity.h\"\n#include \"SplashPotionEntity.h\"\n#include \"Player.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProjectileTracerCallback:\n\nclass cProjectileTracerCallback :\n\tpublic cBlockTracer::cCallbacks\n{\npublic:\n\tcProjectileTracerCallback(cProjectileEntity * a_Projectile) :\n\t\tm_Projectile(a_Projectile),\n\t\tm_SlowdownCoeff(0.99)  // Default slowdown when not in water\n\t{\n\t}\n\n\tdouble GetSlowdownCoeff(void) const { return m_SlowdownCoeff; }\n\nprotected:\n\tcProjectileEntity * m_Projectile;\n\tdouble m_SlowdownCoeff;\n\n\t// cCallbacks overrides:\n\tvirtual bool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t{\n\t\t/*\n\t\t// DEBUG:\n\t\tFLOGD(\"Hit block {0}:{1} at {2} face {3}, {4} ({5})\",\n\t\t\ta_BlockType, a_BlockMeta,\n\t\t\tVector3i{a_BlockX, a_BlockY, a_BlockZ}, a_EntryFace,\n\t\t\tcBlockInfo::IsSolid(a_BlockType) ? \"solid\" : \"non-solid\",\n\t\t\tItemToString(cItem(a_BlockType, 1, a_BlockMeta))\n\t\t);\n\t\t*/\n\n\t\tif (cBlockInfo::IsSolid(a_BlockType))\n\t\t{\n\t\t\t// The projectile hit a solid block, calculate the exact hit coords:\n\t\t\tcBoundingBox bb(a_BlockPos, a_BlockPos + Vector3i(1, 1, 1));  // Bounding box of the block hit\n\t\t\tconst Vector3d LineStart = m_Projectile->GetPosition();  // Start point for the imaginary line that goes through the block hit\n\t\t\tconst Vector3d LineEnd = LineStart + m_Projectile->GetSpeed();  // End point for the imaginary line that goes through the block hit\n\t\t\tdouble LineCoeff = 0;  // Used to calculate where along the line an intersection with the bounding box occurs\n\t\t\teBlockFace Face;  // Face hit\n\n\t\t\tif (bb.CalcLineIntersection(LineStart, LineEnd, LineCoeff, Face))\n\t\t\t{\n\t\t\t\tVector3d Intersection = LineStart + m_Projectile->GetSpeed() * LineCoeff;  // Point where projectile goes into the hit block\n\n\t\t\t\tif (cPluginManager::Get()->CallHookProjectileHitBlock(*m_Projectile, a_BlockPos, Face, Intersection))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tm_Projectile->OnHitSolidBlock(Intersection, Face);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLOGD(\"WEIRD! block tracer reports a hit, but BBox tracer doesn't. Ignoring the hit.\");\n\t\t\t}\n\t\t}\n\n\t\t// Convey some special effects from special blocks:\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_LAVA:\n\t\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t\t{\n\t\t\t\tm_Projectile->StartBurning(30);\n\t\t\t\tm_SlowdownCoeff = std::min(m_SlowdownCoeff, 0.9);  // Slow down to 0.9* the speed each tick when moving through lava\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_BLOCK_WATER:\n\t\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\t\t{\n\t\t\t\tm_Projectile->StopBurning();\n\t\t\t\tm_SlowdownCoeff = std::min(m_SlowdownCoeff, 0.8);  // Slow down to 0.8* the speed each tick when moving through water\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (a_BlockType)\n\n\t\t// Continue tracing\n\t\treturn false;\n\t}\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProjectileEntityCollisionCallback:\n\nclass cProjectileEntityCollisionCallback\n{\npublic:\n\tcProjectileEntityCollisionCallback(cProjectileEntity * a_Projectile, const Vector3d & a_Pos, const Vector3d & a_NextPos) :\n\t\tm_Projectile(a_Projectile),\n\t\tm_Pos(a_Pos),\n\t\tm_NextPos(a_NextPos),\n\t\tm_MinCoeff(1),\n\t\tm_HitEntity(nullptr)\n\t{\n\t}\n\n\n\tbool operator () (cEntity & a_Entity)\n\t{\n\t\tif (\n\t\t\t(&a_Entity == m_Projectile) ||          // Do not check collisions with self\n\t\t\t(a_Entity.GetUniqueID() == m_Projectile->GetCreatorUniqueID())  // Do not check whoever shot the projectile\n\t\t)\n\t\t{\n\t\t\t// Don't check creator only for the first 5 ticks so that projectiles can collide with the creator\n\t\t\tif (m_Projectile->GetTicksAlive() <= 5)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tauto EntBox = a_Entity.GetBoundingBox();\n\n\t\t// Instead of colliding the bounding box with another bounding box in motion, we collide an enlarged bounding box with a hairline.\n\t\t// The results should be good enough for our purposes\n\t\tdouble LineCoeff;\n\t\teBlockFace Face;\n\t\tEntBox.Expand(m_Projectile->GetWidth() / 2, m_Projectile->GetHeight() / 2, m_Projectile->GetWidth() / 2);\n\t\tif (!EntBox.CalcLineIntersection(m_Pos, m_NextPos, LineCoeff, Face))\n\t\t{\n\t\t\t// No intersection whatsoever\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\n\t\t\t!a_Entity.IsMob() &&\n\t\t\t!a_Entity.IsMinecart() &&\n\t\t\t(\n\t\t\t\t!a_Entity.IsPlayer() ||\n\t\t\t\tstatic_cast<cPlayer &>(a_Entity).IsGameModeSpectator()\n\t\t\t) &&\n\t\t\t!a_Entity.IsBoat() &&\n\t\t\t!a_Entity.IsEnderCrystal()\n\t\t)\n\t\t{\n\t\t\t// Not an entity that interacts with a projectile\n\t\t\treturn false;\n\t\t}\n\n\t\tif (cPluginManager::Get()->CallHookProjectileHitEntity(*m_Projectile, a_Entity))\n\t\t{\n\t\t\t// A plugin disagreed.\n\t\t\treturn false;\n\t\t}\n\n\t\tif (LineCoeff < m_MinCoeff)\n\t\t{\n\t\t\t// The entity is closer than anything we've stored so far, replace it as the potential victim\n\t\t\tm_MinCoeff = LineCoeff;\n\t\t\tm_HitEntity = &a_Entity;\n\t\t}\n\n\t\t// Don't break the enumeration, we want all the entities\n\t\treturn false;\n\t}\n\n\t/** Returns the nearest entity that was hit, after the enumeration has been completed */\n\tcEntity * GetHitEntity(void) const { return m_HitEntity; }\n\n\t/** Returns the line coeff where the hit was encountered, after the enumeration has been completed */\n\tdouble GetMinCoeff(void) const { return m_MinCoeff; }\n\n\t/** Returns true if the callback has encountered a true hit */\n\tbool HasHit(void) const { return (m_MinCoeff < 1); }\n\nprotected:\n\tcProjectileEntity * m_Projectile;\n\tconst Vector3d & m_Pos;\n\tconst Vector3d & m_NextPos;\n\tdouble m_MinCoeff;  // The coefficient of the nearest hit on the Pos line\n\n\t// Although it's bad(tm) to store entity ptrs from a callback, we can afford it here, because the entire callback\n\t// is processed inside the tick thread, so the entities won't be removed in between the calls and the final processing\n\tcEntity * m_HitEntity;  // The nearest hit entity\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProjectileEntity:\n\ncProjectileEntity::cProjectileEntity(eKind a_Kind, cEntity * a_Creator, Vector3d a_Pos, float a_Width, float a_Height):\n\tSuper(etProjectile, a_Pos, a_Width, a_Height),\n\tm_ProjectileKind(a_Kind),\n\tm_CreatorData(\n\t\t((a_Creator != nullptr) ? a_Creator->GetUniqueID() : cEntity::INVALID_ID),\n\t\t((a_Creator != nullptr) ? (a_Creator->IsPlayer() ? static_cast<cPlayer *>(a_Creator)->GetName() : \"\") : \"\"),\n\t\t((a_Creator != nullptr) ? a_Creator->GetEquippedWeapon().m_Enchantments : cEnchantments())\n\t),\n\tm_IsInGround(false)\n{\n\tSetGravity(-12.0f);\n\tSetAirDrag(0.01f);\n}\n\n\n\n\n\ncProjectileEntity::cProjectileEntity(eKind a_Kind, cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed, float a_Width, float a_Height):\n\tcProjectileEntity(a_Kind, a_Creator, a_Pos, a_Width, a_Height)\n{\n\tSetSpeed(a_Speed);\n\tSetYawFromSpeed();\n\tSetPitchFromSpeed();\n}\n\n\n\n\n\nstd::unique_ptr<cProjectileEntity> cProjectileEntity::Create(\n\teKind a_Kind,\n\tcEntity * a_Creator,\n\tVector3d a_Pos,\n\tconst cItem * a_Item,\n\tconst Vector3d * a_Speed\n)\n{\n\tVector3d Speed;\n\tif (a_Speed != nullptr)\n\t{\n\t\tSpeed = *a_Speed;\n\t}\n\n\tswitch (a_Kind)\n\t{\n\t\tcase pkArrow:         return std::make_unique<cArrowEntity>           (a_Creator, a_Pos, Speed);\n\t\tcase pkEgg:           return std::make_unique<cThrownEggEntity>       (a_Creator, a_Pos, Speed);\n\t\tcase pkEnderPearl:    return std::make_unique<cThrownEnderPearlEntity>(a_Creator, a_Pos, Speed);\n\t\tcase pkSnowball:      return std::make_unique<cThrownSnowballEntity>  (a_Creator, a_Pos, Speed);\n\t\tcase pkGhastFireball: return std::make_unique<cGhastFireballEntity>   (a_Creator, a_Pos, Speed);\n\t\tcase pkFireCharge:    return std::make_unique<cFireChargeEntity>      (a_Creator, a_Pos, Speed);\n\t\tcase pkExpBottle:     return std::make_unique<cExpBottleEntity>       (a_Creator, a_Pos, Speed);\n\t\tcase pkSplashPotion:  return std::make_unique<cSplashPotionEntity>    (a_Creator, a_Pos, Speed, *a_Item);\n\t\tcase pkWitherSkull:   return std::make_unique<cWitherSkullEntity>     (a_Creator, a_Pos, Speed);\n\t\tcase pkFirework:\n\t\t{\n\t\t\tASSERT(a_Item != nullptr);\n\t\t\tif (a_Item->m_FireworkItem.m_Colours.empty())\n\t\t\t{\n\t\t\t\treturn nullptr;\n\t\t\t}\n\n\t\t\treturn std::make_unique<cFireworkEntity>(a_Creator, a_Pos, *a_Item);\n\t\t}\n\t}\n\n\tLOGWARNING(\"%s: Unknown projectile kind: %d\", __FUNCTION__, a_Kind);\n\treturn nullptr;\n}\n\n\n\n\n\nvoid cProjectileEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\t// Set the position based on what face was hit:\n\tSetPosition(a_HitPos);\n\tSetSpeed(0, 0, 0);\n\n\t// DEBUG:\n\tFLOGD(\"Projectile {0}: pos {1:.02f}, hit solid block at face {2}\",\n\t\tm_UniqueID, a_HitPos, a_HitFace\n\t);\n\n\tm_IsInGround = true;\n}\n\n\n\n\n\nvoid cProjectileEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tUNUSED(a_HitPos);\n\n\t// If we were created by a player and we hit a pawn, notify attacking player's wolves\n\tif (a_EntityHit.IsPawn() && (GetCreatorName() != \"\"))\n\t{\n\t\tauto EntityHit = static_cast<cPawn *>(&a_EntityHit);\n\t\tm_World->DoWithEntityByID(GetCreatorUniqueID(), [=](cEntity & a_Hitter)\n\t\t\t{\n\t\t\t\tstatic_cast<cPlayer&>(a_Hitter).NotifyNearbyWolves(EntityHit, true);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t);\n\t}\n}\n\n\n\n\n\nAString cProjectileEntity::GetMCAClassName(void) const\n{\n\tswitch (m_ProjectileKind)\n\t{\n\t\tcase pkArrow:         return \"Arrow\";\n\t\tcase pkSnowball:      return \"Snowball\";\n\t\tcase pkEgg:           return \"Egg\";\n\t\tcase pkGhastFireball: return \"Fireball\";\n\t\tcase pkFireCharge:    return \"SmallFireball\";\n\t\tcase pkEnderPearl:    return \"ThrownEnderpearl\";\n\t\tcase pkExpBottle:     return \"ThrownExpBottle\";\n\t\tcase pkSplashPotion:  return \"SplashPotion\";\n\t\tcase pkWitherSkull:   return \"WitherSkull\";\n\t\tcase pkFirework:      return \"Firework\";\n\t}\n\tUNREACHABLE(\"Unsupported projectile kind\");\n}\n\n\n\n\n\nvoid cProjectileEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\tBroadcastMovementUpdate();\n}\n\n\n\n\n\nvoid cProjectileEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tif (m_IsInGround)\n\t{\n\t\t// Already-grounded projectiles don't move at all\n\t\treturn;\n\t}\n\n\tauto DtSec = std::chrono::duration_cast<std::chrono::duration<double>>(a_Dt);\n\n\tconst Vector3d DeltaSpeed = GetSpeed() * DtSec.count();\n\tconst Vector3d Pos = GetPosition();\n\tconst Vector3d NextPos = Pos + DeltaSpeed;\n\n\t// Test for entity collisions:\n\tcProjectileEntityCollisionCallback EntityCollisionCallback(this, Pos, NextPos);\n\ta_Chunk.ForEachEntity(EntityCollisionCallback);\n\tif (EntityCollisionCallback.HasHit())\n\t{\n\t\t// An entity was hit:\n\t\tVector3d HitPos = Pos + (NextPos - Pos) * EntityCollisionCallback.GetMinCoeff();\n\n\t\t// DEBUG:\n\t\tFLOGD(\"Projectile {0} has hit an entity {1} ({2}) at {3:.02f} (coeff {4:.03f})\",\n\t\t\tm_UniqueID,\n\t\t\tEntityCollisionCallback.GetHitEntity()->GetUniqueID(),\n\t\t\tEntityCollisionCallback.GetHitEntity()->GetClass(),\n\t\t\tHitPos,\n\t\t\tEntityCollisionCallback.GetMinCoeff()\n\t\t);\n\n\t\tOnHitEntity(*(EntityCollisionCallback.GetHitEntity()), HitPos);\n\t\tif (!IsTicking())\n\t\t{\n\t\t\treturn;  // We were destroyed by an override of OnHitEntity\n\t\t}\n\t}\n\t// TODO: Test the entities in the neighboring chunks, too\n\n\t// Trace the tick's worth of movement as a line:\n\tcProjectileTracerCallback TracerCallback(this);\n\tif (!cLineBlockTracer::Trace(*m_World, TracerCallback, Pos, NextPos))\n\t{\n\t\t// Something has been hit, abort all other processing\n\t\treturn;\n\t}\n\t// The tracer also checks the blocks for slowdown blocks - water and lava - and stores it for later in its SlowdownCoeff\n\n\t// Update the position:\n\tSetPosition(NextPos);\n\n\t// Add slowdown and gravity effect to the speed:\n\tVector3d NewSpeed(GetSpeed());\n\tNewSpeed.y += m_Gravity * DtSec.count();\n\tNewSpeed -= NewSpeed * (m_AirDrag * 20.0f) * DtSec.count();\n\tSetSpeed(NewSpeed);\n\tSetYawFromSpeed();\n\tSetPitchFromSpeed();\n\n\t/*\n\tFLOGD(\"Projectile {0}: pos {1:.02f}, speed {2:.02f}, rot {{{3:.02f}, {4:.02f}}}\",\n\t\tm_UniqueID, GetPos(), GetSpeed(), GetYaw(), GetPitch()\n\t);\n\t*/\n}\n\n\n\n\n\nvoid cProjectileEntity::SpawnOn(cClientHandle & a_Client)\n{\n\ta_Client.SendSpawnEntity(*this);\n\ta_Client.SendEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cProjectileEntity::CollectedBy(cPlayer & a_Dest)\n{\n\t// Overriden in arrow\n\tUNUSED(a_Dest);\n}\n\n"
  },
  {
    "path": "src/Entities/ProjectileEntity.h",
    "content": "\n// ProjectileEntity.h\n\n// Declares the cProjectileEntity class representing the common base class for projectiles\n\n\n\n\n\n#pragma once\n\n#include \"Entity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cProjectileEntity :\n\tpublic cEntity\n{\n\t// tolua_end\n\n\tusing Super = cEntity;\n\n\t// tolua_begin\n\n\npublic:\n\n\t/** The kind of the projectile. */\n\tenum eKind\n\t{\n\t\tpkArrow,\n\t\tpkSnowball,\n\t\tpkEgg,\n\t\tpkGhastFireball,\n\t\tpkFireCharge,\n\t\tpkEnderPearl,\n\t\tpkExpBottle,\n\t\tpkSplashPotion,\n\t\tpkFirework,\n\t\tpkWitherSkull,\n\t} ;\n\n\t// tolua_end\n\n\tCLASS_PROTODEF(cProjectileEntity)\n\n\tcProjectileEntity(eKind a_Kind, cEntity * a_Creator, Vector3d a_Pos, float a_Width, float a_Height);\n\tcProjectileEntity(eKind a_Kind, cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed, float a_Width, float a_Height);\n\n\t/** Creates a new instance of the specified projectile entity.\n\ta_Item is the item from which the projectile originated (such as firework or arrow). */\n\tstatic std::unique_ptr<cProjectileEntity> Create(\n\t\teKind a_Kind,\n\t\tcEntity * a_Creator,\n\t\tVector3d a_Pos,\n\t\tconst cItem * a_Item,\n\t\tconst Vector3d * a_Speed = nullptr\n\t);\n\n\t/** OBSOLETE, use the Vector3d-based overload instead.\n\tCreates a new instance of the specified projectile entity.\n\ta_Item is the item from which the projectile originated (such as firework or arrow). */\n\tstatic std::unique_ptr<cProjectileEntity> Create(\n\t\teKind a_Kind,\n\t\tcEntity * a_Creator,\n\t\tdouble a_PosX, double a_PosY, double a_PosZ,\n\t\tconst cItem * a_Item,\n\t\tconst Vector3d * a_Speed = nullptr\n\t)\n\t{\n\t\treturn Create(a_Kind, a_Creator, {a_PosX, a_PosY, a_PosZ}, a_Item, a_Speed);\n\t}\n\n\t/** Called by the physics blocktracer when the entity hits a solid block, the hit position and the face hit (BLOCK_FACE_) is given */\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace);\n\n\t/** Called by the physics blocktracer when the entity hits another entity */\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos);\n\n\t/** Called by Chunk when the projectile is eligible for player collection */\n\tvirtual void CollectedBy(cPlayer & a_Dest);\n\n\t// tolua_begin\n\n\t/** Returns the kind of the projectile (fast class identification) */\n\teKind GetProjectileKind(void) const { return m_ProjectileKind; }\n\n\t/** Returns the unique ID of the entity who created this projectile\n\tMay return an ID <0\n\t*/\n\tUInt32 GetCreatorUniqueID(void) const { return m_CreatorData.m_UniqueID; }\n\n\t/** Returns the name of the player that created the projectile\n\tWill be empty for non-player creators\n\t*/\n\tAString GetCreatorName(void) const { return m_CreatorData.m_Name; }\n\n\t/** Returns the string that is used as the entity type (class name) in MCA files */\n\tAString GetMCAClassName(void) const;\n\n\t/** Returns true if the projectile has hit the ground and is stuck there */\n\tbool IsInGround(void) const { return m_IsInGround; }\n\n\t// tolua_end\n\n\t/** Sets the internal InGround flag. To be used by MCA loader only! */\n\tvoid SetIsInGround(bool a_IsInGround) { m_IsInGround = a_IsInGround; }\n\nprotected:\n\n\t/** A structure that stores the Entity ID and Playername of the projectile's creator\n\tUsed to migitate invalid pointers caused by the creator being destroyed. */\n\tstruct CreatorData\n\t{\n\t\tCreatorData(UInt32 a_UniqueID, const AString & a_Name, const cEnchantments & a_Enchantments) :\n\t\t\tm_UniqueID(a_UniqueID),\n\t\t\tm_Name(a_Name),\n\t\t\tm_Enchantments(a_Enchantments)\n\t\t{\n\t\t}\n\n\t\tconst UInt32 m_UniqueID;\n\t\tAString m_Name;\n\t\tcEnchantments m_Enchantments;\n\t};\n\n\t/** The type of projectile I am */\n\teKind m_ProjectileKind;\n\n\t/** The structure for containing the entity ID and name who has created this projectile\n\tThe ID and / or name may be nullptr (e.g. for dispensers / mobs). */\n\tCreatorData m_CreatorData;\n\n\t/** True if the projectile has hit the ground and is stuck there */\n\tbool m_IsInGround;\n\n\t// cEntity overrides:\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void SpawnOn(cClientHandle & a_Client) final override;\n\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/SplashPotionEntity.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"SplashPotionEntity.h\"\n#include \"Pawn.h\"\n#include \"../EffectID.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSplashPotionEntity:\n\ncSplashPotionEntity::cSplashPotionEntity(\n\tcEntity * a_Creator,\n\tVector3d a_Pos,\n\tVector3d a_Speed,\n\tconst cItem & a_Item\n):\n\tSuper(pkSplashPotion, a_Creator, a_Pos, a_Speed, 0.25f, 0.25f),\n\tm_Item(a_Item)\n{\n\tm_EntityEffectType = cEntityEffect::GetPotionEffectType(a_Item.m_ItemDamage);\n\tm_EntityEffect = cEntityEffect(\n\t\tcEntityEffect::GetPotionEffectDuration(a_Item.m_ItemDamage),\n\t\tcEntityEffect::GetPotionEffectIntensity(a_Item.m_ItemDamage)\n\t);\n\tm_PotionColor = cEntityEffect::GetPotionColor(a_Item.m_ItemDamage);\n}\n\n\n\n\n\nvoid cSplashPotionEntity::Splash(Vector3d a_HitPos)\n{\n\t// Look for entities in 8.25 (width) x 4.25 (height) cuboid _centred_ on hit position:\n\tm_World->ForEachEntityInBox({ a_HitPos.addedY(-4.25 / 2), 8.25 / 2, 4.25 }, [this, a_HitPos](cEntity & a_Entity)\n\t{\n\t\tif (!a_Entity.IsPawn())\n\t\t{\n\t\t\t// Not an entity that can take effects\n\t\t\treturn false;\n\t\t}\n\n\t\tdouble SplashDistance = (a_Entity.GetPosition() - a_HitPos).Length();\n\t\tdouble Reduction = -0.25 * SplashDistance + 1.0;  // y = -0.25x + 1, where x is the distance from the player. Approximation for potion splash.\n\t\tReduction = std::max(Reduction, 0.0);\n\n\t\tstatic_cast<cPawn &>(a_Entity).AddEntityEffect(m_EntityEffectType, m_EntityEffect.GetDuration(), m_EntityEffect.GetIntensity(), Reduction);\n\t\treturn false;\n\t});\n\n\tm_World->BroadcastSoundParticleEffect(\n\t\tEffectID::PARTICLE_SPLASH_POTION,\n\t\ta_HitPos.Floor(),\n\t\tm_PotionColor\n\t);\n}\n\n\n\n\n\nvoid cSplashPotionEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tSuper::OnHitEntity(a_EntityHit, a_HitPos);\n\n\ta_EntityHit.TakeDamage(dtRangedAttack, this, 0, 1);\n\tSplash(a_HitPos);\n\tDestroy();\n}\n\n\n\n\n\nvoid cSplashPotionEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\tSuper::OnHitSolidBlock(a_HitPos, a_HitFace);\n\n\tSplash(a_HitPos);\n\tDestroy();\n}\n"
  },
  {
    "path": "src/Entities/SplashPotionEntity.h",
    "content": "\n// SplashPotionEntity.h\n\n// Declares the cSplashPotionEntity class representing a splash potion that has been thrown\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n#include \"EntityEffect.h\"\n#include \"../World.h\"\n\n\n\nclass cEntity;\n\n\n\n// tolua_begin\n\nclass cSplashPotionEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cSplashPotionEntity)\n\n\tcSplashPotionEntity(\n\t\tcEntity * a_Creator,\n\t\tVector3d a_Pos,\n\t\tVector3d a_Speed,\n\t\tconst cItem & a_Item\n\t);\n\n\t// tolua_begin\n\tcEntityEffect::eType GetEntityEffectType(void) const { return m_EntityEffectType; }\n\tint                  GetPotionColor(void)      const { return m_PotionColor; }\n\tconst cItem &        GetItem(void)             const { return m_Item; }\n\n\tvoid SetEntityEffectType(cEntityEffect::eType a_EntityEffectType) { m_EntityEffectType = a_EntityEffectType; }\n\tvoid SetPotionColor(int a_PotionColor) { m_PotionColor = a_PotionColor; }\n\n\t// tolua_end\n\n\tcEntityEffect        GetEntityEffect(void)     const { return m_EntityEffect; }\n\tvoid SetEntityEffect(cEntityEffect a_EntityEffect) { m_EntityEffect = a_EntityEffect; }\n\nprivate:\n\n\tcEntityEffect::eType m_EntityEffectType;\n\tcEntityEffect m_EntityEffect;\n\tint m_PotionColor;\n\tcItem m_Item;\n\n\t/** Splashes the potion, fires its particle effects and sounds\n\t@param a_HitPos     The position where the potion will splash */\n\tvoid Splash(Vector3d a_HitPos);\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/TNTEntity.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"TNTEntity.h\"\n#include \"../World.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncTNTEntity::cTNTEntity(Vector3d a_Pos, unsigned a_FuseTicks) :\n\tSuper(etTNT, a_Pos, 0.98f, 0.98f),\n\tm_FuseTicks(a_FuseTicks)\n{\n\tSetGravity(-16.0f);\n\tSetAirDrag(0.02f);\n}\n\n\n\n\n\nvoid cTNTEntity::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\ta_ClientHandle.SendSpawnEntity(*this);\n\tm_bDirtyOrientation = false;  // TODO: why?\n\tm_bDirtyHead = false;\n}\n\n\n\n\n\nvoid cTNTEntity::Explode(void)\n{\n\tFLOGD(\"BOOM at {0}\", GetPosition());\n\n\t// Destroy first so the Explodinator doesn't find us (when iterating through entities):\n\tDestroy();\n\n\t// TODO: provided centred coordinates to all calls to DoExplosionAt, from entities and blocks\n\t// This is to ensure maximum efficiency of explosions\n\tm_World->DoExplosionAt(4.0, GetPosX(), GetPosY() + GetHeight() / 2, GetPosZ(), true, esPrimedTNT, this);\n}\n\n\n\n\n\nvoid cTNTEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tBroadcastMovementUpdate();\n\n\tif (m_FuseTicks > 0)\n\t{\n\t\t--m_FuseTicks;\n\t}\n\n\tif (m_FuseTicks == 0)\n\t{\n\t\tExplode();\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/Entities/TNTEntity.h",
    "content": "\n#pragma once\n\n#include \"Entity.h\"\n\n\n\n\n// tolua_begin\nclass cTNTEntity:\n\tpublic cEntity\n{\n\n\t// tolua_end\n\n\tusing Super = cEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cTNTEntity)\n\n\tcTNTEntity(Vector3d a_Pos, unsigned a_FuseTicks = 80);\n\n\t// cEntity overrides:\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\t// tolua_begin\n\n\t/** Explode the tnt */\n\tvoid Explode(void);\n\n\t/** Returns the fuse ticks until the tnt will explode */\n\tunsigned GetFuseTicks(void) const { return m_FuseTicks; }\n\n\t/** Set the fuse ticks until the tnt will explode */\n\tvoid SetFuseTicks(unsigned a_FuseTicks) { m_FuseTicks = a_FuseTicks; }\n\n\t// tolua_end\n\nprotected:\n\tunsigned m_FuseTicks;      ///< How much ticks is left, while the tnt will explode\n};  // tolua_export\n"
  },
  {
    "path": "src/Entities/ThrownEggEntity.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ThrownEggEntity.h\"\n#include \"../World.h\"\n\n\n\n\n\ncThrownEggEntity::cThrownEggEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):\n\tSuper(pkEgg, a_Creator, a_Pos, a_Speed, 0.25f, 0.25f)\n{\n}\n\n\n\n\n\nvoid cThrownEggEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tSuper::OnHitEntity(a_EntityHit, a_HitPos);\n\n\tint Damage = 0;\n\tif (a_EntityHit.IsMob() && (static_cast<cMonster &>(a_EntityHit).GetMobType() == mtEnderDragon))\n\t{\n\t\t// Enderdragons take 1 damage:\n\t\tDamage = 1;\n\t}\n\telse if (a_EntityHit.IsEnderCrystal())\n\t{\n\t\t// Endercrystals are destroyed:\n\t\tDamage = CeilC(a_EntityHit.GetHealth());\n\t}\n\n\ta_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), Damage, 1);\n\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::EggCracks);\n\n\tTrySpawnChicken(a_HitPos);\n\tDestroy();\n}\n\n\n\n\n\nvoid cThrownEggEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\tSuper::OnHitSolidBlock(a_HitPos, a_HitFace);\n\n\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::EggCracks);\n\n\tTrySpawnChicken(a_HitPos);\n\tDestroy();\n}\n\n\n\n\n\nvoid cThrownEggEntity::TrySpawnChicken(Vector3d a_HitPos)\n{\n\tauto & Random = GetRandomProvider();\n\tif (Random.RandBool(0.125))\n\t{\n\t\tm_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, mtChicken, true);\n\t}\n\telse if (Random.RandBool(1.0 / 33.0))\n\t{\n\t\tm_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, mtChicken, true);\n\t\tm_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, mtChicken, true);\n\t\tm_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, mtChicken, true);\n\t\tm_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, mtChicken, true);\n\t}\n}\n"
  },
  {
    "path": "src/Entities/ThrownEggEntity.h",
    "content": "\n// ThrownEggEntity.h\n\n// Declares the cThrownEggEntity class representing a regular thrown egg\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cThrownEggEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cThrownEggEntity)\n\n\tcThrownEggEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);\n\nprivate:\n\n\t/** Randomly decides whether to spawn a chicken where the egg lands. */\n\tvoid TrySpawnChicken(Vector3d a_HitPos);\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/ThrownEnderPearlEntity.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"FastRandom.h\"\n#include \"Mobs/MonsterTypes.h\"\n#include \"ThrownEnderPearlEntity.h\"\n#include \"Player.h\"\n\n\n\n\n\ncThrownEnderPearlEntity::cThrownEnderPearlEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):\n\tSuper(pkEnderPearl, a_Creator, a_Pos, a_Speed, 0.25f, 0.25f)\n{\n}\n\n\n\n\n\nvoid cThrownEnderPearlEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tSuper::OnHitEntity(a_EntityHit, a_HitPos);\n\n\tint Damage = 0;\n\tif (a_EntityHit.IsEnderCrystal())\n\t{\n\t\t// Endercrystals are destroyed:\n\t\tDamage = CeilC(a_EntityHit.GetHealth());\n\t}\n\n\ta_EntityHit.TakeDamage(dtRangedAttack, this, Damage, 1);\n\tTeleportCreator(a_HitPos);\n\tDestroy();\n}\n\n\n\n\n\nvoid cThrownEnderPearlEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\tSuper::OnHitSolidBlock(a_HitPos, a_HitFace);\n\n\tTeleportCreator(a_HitPos);\n\tDestroy();\n}\n\n\n\n\n\nvoid cThrownEnderPearlEntity::TeleportCreator(Vector3d a_HitPos)\n{\n\tif (m_CreatorData.m_Name.empty())\n\t{\n\t\treturn;\n\t}\n\n\n\n\tGetWorld()->FindAndDoWithPlayer(m_CreatorData.m_Name, [=](cPlayer & a_Entity)\n\t{\n\n\t\tauto & Random = GetRandomProvider();\n\n\t\t// 5% chance to spawn an endermite\n\t\tif (Random.RandBool(0.05))\n\t\t{\n\t\t\tVector3d PlayerPosition = a_Entity.GetPosition();\n\t\t\tm_World->SpawnMob(PlayerPosition.x, PlayerPosition.y, PlayerPosition.z, mtEndermite);\n\t\t}\n\n\n\t\t// Teleport the creator here, make them take 5 damage:\n\t\ta_Entity.TeleportToCoords(a_HitPos.x, a_HitPos.y + 0.2, a_HitPos.z);\n\t\ta_Entity.TakeDamage(dtEnderPearl, this, 5, 0);\n\n\t\treturn false;\n\t});\n}\n"
  },
  {
    "path": "src/Entities/ThrownEnderPearlEntity.h",
    "content": "\n// ThrownEnderPearlEntity.h\n\n// Declares the cThrownEnderPeralEntity class representing an ender pearl being thrown\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cThrownEnderPearlEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cThrownEnderPearlEntity)\n\n\tcThrownEnderPearlEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);\n\nprivate:\n\n\t/** Teleports the creator where the ender pearl lands */\n\tvoid TeleportCreator(Vector3d a_HitPos);\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/ThrownSnowballEntity.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ThrownSnowballEntity.h\"\n#include \"../World.h\"\n\n\n\n\n\ncThrownSnowballEntity::cThrownSnowballEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):\n\tSuper(pkSnowball, a_Creator, a_Pos, a_Speed, 0.25f, 0.25f)\n{\n}\n\n\n\n\n\nvoid cThrownSnowballEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\tSuper::OnHitEntity(a_EntityHit, a_HitPos);\n\n\tint Damage = 0;\n\tif (a_EntityHit.IsMob() && (static_cast<cMonster &>(a_EntityHit).GetMobType() == mtBlaze))\n\t{\n\t\t// Blazes take 3 damage:\n\t\tDamage = 3;\n\t}\n\telse if (a_EntityHit.IsEnderCrystal())\n\t{\n\t\t// Endercrystals are destroyed:\n\t\tDamage = CeilC(a_EntityHit.GetHealth());\n\t}\n\n\ta_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), Damage, 1);\n\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::SnowballPoofs);\n\tDestroy();\n}\n\n\n\n\n\nvoid cThrownSnowballEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\tSuper::OnHitSolidBlock(a_HitPos, a_HitFace);\n\n\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::SnowballPoofs);\n\tDestroy();\n}\n"
  },
  {
    "path": "src/Entities/ThrownSnowballEntity.h",
    "content": "\n// ThrownSnowballEntity.h\n\n// Declares the cThrownSnowballEntity representing a snowball that has been thrown\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cThrownSnowballEntity :\n\tpublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cThrownSnowballEntity)\n\n\tcThrownSnowballEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);\n\nprivate:\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Entities/WitherSkullEntity.cpp",
    "content": "\n//  WitherSkullEntity.cpp\n\n// Implements the cWitherSkullEntity class representing the entity used by both blue and black wither skulls\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"WitherSkullEntity.h\"\n#include \"../World.h\"\n\n\n\n\n\ncWitherSkullEntity::cWitherSkullEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):\n\tSuper(pkWitherSkull, a_Creator, a_Pos, 0.3125f, 0.3125f)\n{\n\tSetSpeed(a_Speed);\n\tSetGravity(0);\n\tSetAirDrag(0);\n}\n\n\n\n\n\nvoid cWitherSkullEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)\n{\n\t// TODO: Explode\n\t// TODO: Apply wither effect to entities nearby\n\tDestroy();\n}\n\n\n\n\n\nvoid cWitherSkullEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)\n{\n\t// TODO: If entity is Ender Crystal, destroy it\n\ta_EntityHit.TakeDamage(dtRangedAttack, this, 0, 1);\n\n\t// TODO: Explode\n\t// TODO: Apply wither effect to entity and others nearby\n\n\tDestroy();\n}\n\n\n\n\n"
  },
  {
    "path": "src/Entities/WitherSkullEntity.h",
    "content": "\n// WitherSkullEntity.h\n\n// Declares the cWitherSkullEntity class representing the entity used by both blue and black wither skulls\n\n\n\n\n\n#pragma once\n\n#include \"ProjectileEntity.h\"\n\n\n\n\n\n// tolua_begin\n\nclass cWitherSkullEntity :\npublic cProjectileEntity\n{\n\t// tolua_end\n\n\tusing Super = cProjectileEntity;\n\npublic:  // tolua_export\n\n\tCLASS_PROTODEF(cWitherSkullEntity)\n\n\tcWitherSkullEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);\n\nprotected:\n\n\t// cProjectileEntity overrides:\n\tvirtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;\n\tvirtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;\n\n} ;  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/FastRandom.cpp",
    "content": "\n// FastRandom.cpp\n\n\n#include \"Globals.h\"\n#include \"FastRandom.h\"\n\n\n\n\n\nMTRand & GetRandomProvider()\n{\n\tthread_local MTRand Random = []\n\t\t{\n\t\t\tcRandomDeviceSeeder Seeder;\n\t\t\treturn MTRand(Seeder);\n\t\t}();\n\treturn Random;\n}\n\n\n\n\n\nUInt32 Detail::GetRandomSeed()\n{\n\tthread_local UInt32 SeedCounter = []\n\t\t{\n\t\t\tstd::random_device rd;\n\t\t\tstd::uniform_int_distribution<UInt32> dist;\n\t\t\treturn dist(rd);\n\t\t}();\n\treturn ++SeedCounter;\n}\n"
  },
  {
    "path": "src/FastRandom.h",
    "content": "\n// FastRandom.h\n\n// Declares the cFastRandom class representing a fast random number generator\n\n/*\nThe cFastRandom alias should be avoided in favor of the result of a call to GetRandomProvider().\nThe MTRand generator used is faster, has a better range and provides higher quality randomness.\nNote that MTRand is relatively costly to construct and so instances should be long lived,\nprefer calls to GetRandomProvider over creating new instances.\n*/\n\n\n\n\n\n#pragma once\n\n\n\n\n\nnamespace Detail\n{\n\t/** Returns a low quality seed. */\n\tUInt32 GetRandomSeed();\n\n\t/** Aliases true_type if Char is any variant of char ignoring signed-ness. */\n\ttemplate <class Char>\n\tusing IsChar = typename std::is_same<typename std::make_signed<Char>::type, signed char>::type;\n\n\ttemplate <class IntType>\n\tstruct cUniformImpl :\n\t\tpublic std::conditional<\n\t\t\tIsChar<IntType>::value,\n\t\t\ttypename std::conditional<  // Match signed-ness of IntType\n\t\t\t\tstd::is_signed<IntType>::value,\n\t\t\t\tstd::uniform_int_distribution<short>,\n\t\t\t\tstd::uniform_int_distribution<unsigned short>\n\t\t\t>::type,\n\t\t\tstd::uniform_int_distribution<IntType>\n\t\t>\n\t{\n\t};\n\n\t/** uniform_int_distribution<char> is undefined so this aliases a valid type. */\n\ttemplate <class IntType>\n\tusing cUniform = typename cUniformImpl<IntType>::type;\n}\n\n\n\n\n\n/** Class to wrap any random engine to provide a more convenient interface. */\ntemplate <class RandomEngine>\nclass cRandomWrapper\n{\npublic:\n\t/** Initialize with a low quality seed. */\n\tcRandomWrapper():\n\t\tm_Engine(Detail::GetRandomSeed())\n\t{\n\t}\n\n\n\t/** Initialize with a SeedSequence. */\n\ttemplate <class SeedSeq>\n\tcRandomWrapper(SeedSeq & a_SeedSeq):\n\t\tm_Engine(a_SeedSeq)\n\t{\n\t}\n\n\n\n\t/** Return a random IntType in the range [a_Min, a_Max]. */\n\ttemplate <class IntType = int>\n\tIntType RandInt(IntType a_Min, IntType a_Max)\n\t{\n\t\tASSERT(\n\t\t\t(a_Max >= a_Min) &&\n\t\t\t(a_Max <= std::numeric_limits<IntType>::max()) &&\n\t\t\t(a_Min >= std::numeric_limits<IntType>::min())\n\t\t);\n\t\tDetail::cUniform<IntType> dist(\n\t\t\tstatic_cast<IntType>(a_Min),\n\t\t\tstatic_cast<IntType>(a_Max)\n\t\t);\n\t\treturn static_cast<IntType>(dist(m_Engine));\n\t}\n\n\n\n\n\n\t/** Return a random IntType in the range [0, a_Max]. */\n\ttemplate <class IntType = int>\n\tIntType RandInt(IntType a_Max)\n\t{\n\t\tASSERT((a_Max >= 0) && (a_Max <= std::numeric_limits<IntType>::max()));\n\t\tDetail::cUniform<IntType> dist(IntType(0), static_cast<IntType>(a_Max));\n\t\treturn static_cast<IntType>(dist(m_Engine));\n\t}\n\n\n\n\n\n\t/** Return a random IntType in the range [0, std::numeric_limits<IntType>::max()]. */\n\ttemplate <class IntType = int>\n\tIntType RandInt()\n\t{\n\t\tDetail::cUniform<IntType> dist(IntType(0), std::numeric_limits<IntType>::max());\n\t\treturn static_cast<IntType>(dist(m_Engine));\n\t}\n\n\n\n\n\n\t/** Return a random RealType in the range [a_Min, a_Max). */\n\ttemplate <class RealType = float>\n\tRealType RandReal(RealType a_Min, RealType a_Max)\n\t{\n\t\tstd::uniform_real_distribution<RealType> dist(a_Min, a_Max);\n\t\treturn dist(m_Engine);\n\t}\n\n\n\n\n\n\t/** Return a random RealType in the range [0, a_Max). */\n\ttemplate <class RealType = float>\n\tRealType RandReal(RealType a_Max)\n\t{\n\t\tstd::uniform_real_distribution<RealType> dist(RealType(0), a_Max);\n\t\treturn dist(m_Engine);\n\t}\n\n\n\n\n\n\t/** Return a random RealType in the range [0, 1). */\n\ttemplate <class RealType = float>\n\tRealType RandReal()\n\t{\n\t\tstd::uniform_real_distribution<RealType> dist;\n\t\treturn dist(m_Engine);\n\t}\n\n\n\n\n\n\t/** Return a random bool with the given probability of being true. */\n\tbool RandBool(double a_TrueProbability = 0.5)\n\t{\n\t\tstd::bernoulli_distribution dist(a_TrueProbability);\n\t\treturn dist(m_Engine);\n\t}\n\n\n\n\n\t/** Returns a reference to the underlying random engine. */\n\tRandomEngine & Engine()\n\t{\n\t\treturn m_Engine;\n\t}\n\nprivate:\n\n\tRandomEngine m_Engine;\n};\n\n\n\n\n\n/** Utility to seed a random engine with maximal entropy from random_device. */\nstruct cRandomDeviceSeeder\n{\n\tusing result_type = std::random_device::result_type;\n\n\ttemplate <class Itr>\n\tvoid generate(Itr first, Itr last)\n\t{\n\t\tstd::random_device rd;\n\t\tstd::uniform_int_distribution<result_type> dist;\n\t\tfor (; first != last; ++first)\n\t\t{\n\t\t\t*first = dist(rd);\n\t\t}\n\t}\n};\n\n\n\n\n\nusing cFastRandom = cRandomWrapper<std::minstd_rand>;\nusing MTRand = cRandomWrapper<std::mt19937>;\n\n/** Returns the current thread's random number source. */\nMTRand & GetRandomProvider();\n"
  },
  {
    "path": "src/ForEachChunkProvider.h",
    "content": "\n// ForEachChunkProvider.h\n\n// Declares the cForEachChunkProvider class which acts as an interface for classes that provide a ForEachChunkInRect() function\n// Primarily serves as a decoupling between cBlockArea and cWorld\n\n\n\n\n\n#pragma once\n\n\n\n\n// fwd:\nclass cChunkDataCallback;\nclass cBlockArea;\n\n\n\n\n\nclass cForEachChunkProvider\n{\npublic:\n\tvirtual ~cForEachChunkProvider() {}\n\n\t/** Calls the callback for each chunk in the specified range. */\n\tvirtual bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback) = 0;\n\n\t/** Writes the block area into the specified coords.\n\tReturns true if all chunks have been processed.\n\ta_DataTypes is a bitmask of cBlockArea::baXXX constants ORed together.\n\t*/\n\tvirtual bool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes) = 0;\n};\n\n\n\n\n"
  },
  {
    "path": "src/FunctionRef.h",
    "content": "\n#pragma once\n\n// Declared only so it can be partially specialized\ntemplate <class Signature>\nclass cFunctionRef;\n\n/** A light-weight, type-erased reference to a function object.\n\n### Usage\n\n`cFunctionRef` is used whenever you call a normal function with a lambda. e.g.\none of the `cWorld::DoWith` functions,\n\n\tm_World->DoWithChunkAt(BlockPos, [](cChunk & a_Chunk) -> bool\n\t\t{\n\t\t\t...\n\t\t}\n\t);\n\nIt looks like you're calling it with a lambda but that would require\n`DoWithChunkAt` to be a template. The function is really being called with\n`cFunctionRef<bool(cChunk&)>` which is constructed from the lambda via a\ntemplated constructor. This gives you a generic pointer to the lambda which\ndoesn't depend on the type of the function object it references.\n\n### Notes\n\n- This is similar to a `std::function` but doesn't copy the function object.\nThis means that mutable function objects will be modified for the caller but\nwould not be if using a `std::function` (See #3990 for implications of this).\n\n- A `cFunctionRef` has no empty state but is non-owning and so is safe to call as\nlong as the referred object is still alive. */\ntemplate <class Ret, class... Args>\nclass cFunctionRef<Ret(Args...)>\n{\npublic:\n\t/** Construct from a function object. */\n\ttemplate <class FunctionObject,\n\t\ttypename std::enable_if<  // Don't disable the default copy constructor\n\t\t\t!std::is_same<typename std::decay<FunctionObject>::type, cFunctionRef>::value,\n\t\tint>::type = 0\n\t>\n\tcFunctionRef(FunctionObject && a_FunctionObject)\n\t{\n\t\t// Store an opaque reference to the object.\n\t\tm_CallableData = &a_FunctionObject;\n\n\t\t// Along with a function that knows how to call the object.\n\t\tm_CallFunction = &ObjectFunctionCaller<FunctionObject>;\n\t}\n\n\t/** Call the referenced function object */\n\tRet operator () (Args... a_Args)\n\t{\n\t\treturn m_CallFunction(m_CallableData, std::forward<Args>(a_Args)...);\n\t}\n\nprivate:\n\n\t/** Function that performs the call. */\n\ttemplate <class ObjectType>\n\tstatic Ret ObjectFunctionCaller(void * a_Callable, Args...  a_Args)\n\t{\n\t\t// Convert opaque reference to the concrete type.\n\t\tusing ObjectPtr = typename std::add_pointer<ObjectType>::type;\n\t\tauto & Object = *static_cast<ObjectPtr>(a_Callable);\n\n\t\t// Forward the call down to the object.\n\t\treturn Object(std::forward<Args>(a_Args)...);\n\t}\n\n\tusing cCallFunction = Ret(*)(void *, Args...);\n\n\t/** Type erased reference to a callable. */\n\tvoid * m_CallableData;\n\n\t/** Function that knows how to call the type erased reference. */\n\tcCallFunction m_CallFunction;\n};\n\n\n"
  },
  {
    "path": "src/FurnaceRecipe.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"FurnaceRecipe.h\"\n#include \"Item.h\"\n\n#include <fstream>\n\n#define FURNACE_RECIPE_FILE \"furnace.txt\"\n\n\n\n\n\ntypedef std::list<cFurnaceRecipe::cRecipe> RecipeList;\ntypedef std::list<cFurnaceRecipe::cFuel> FuelList;\n\n\n\n\n\nstruct cFurnaceRecipe::sFurnaceRecipeState\n{\n\tRecipeList Recipes;\n\tFuelList Fuel;\n};\n\n\n\n\n\ncFurnaceRecipe::cFurnaceRecipe()\n\t: m_pState(new sFurnaceRecipeState)\n{\n\tReloadRecipes();\n}\n\n\n\n\n\ncFurnaceRecipe::~cFurnaceRecipe()\n{\n\tClearRecipes();\n\tdelete m_pState;\n\tm_pState = nullptr;\n}\n\n\n\n\n\nvoid cFurnaceRecipe::ReloadRecipes(void)\n{\n\tClearRecipes();\n\tLOGD(\"Loading furnace recipes...\");\n\n\tstd::ifstream f(FURNACE_RECIPE_FILE, std::ios::in);\n\tif (!f.good())\n\t{\n\t\tLOG(\"Could not open the furnace recipes file \\\"%s\\\". No furnace recipes are available.\", FURNACE_RECIPE_FILE);\n\t\treturn;\n\t}\n\n\tunsigned int LineNum = 0;\n\tAString ParsingLine;\n\n\twhile (std::getline(f, ParsingLine))\n\t{\n\t\tLineNum++;\n\n\t\t// Remove comments from the line:\n\t\tsize_t FirstCommentSymbol = ParsingLine.find('#');\n\t\tif ((FirstCommentSymbol != AString::npos) && (FirstCommentSymbol != 0))\n\t\t{\n\t\t\tParsingLine.erase(ParsingLine.begin() + static_cast<long>(FirstCommentSymbol), ParsingLine.end());\n\t\t}\n\n\t\tif (IsOnlyWhitespace(ParsingLine))\n\t\t{\n\t\t\t// Ignore empty and whitespace only lines\n\t\t\tcontinue;\n\t\t}\n\n\t\tswitch (ParsingLine[0])\n\t\t{\n\t\t\tcase '#':\n\t\t\t{\n\t\t\t\t// Comment\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase '!':\n\t\t\t{\n\t\t\t\tAddFuelFromLine(ParsingLine, LineNum);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tAddRecipeFromLine(ParsingLine, LineNum);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (ParsingLine[0])\n\t}  // while (getline(ParsingLine))\n\n\tLOG(\"Loaded %zu furnace recipes and %zu fuels\", m_pState->Recipes.size(), m_pState->Fuel.size());\n}\n\n\n\n\n\nvoid cFurnaceRecipe::AddFuelFromLine(const AString & a_Line, unsigned int a_LineNum)\n{\n\tAString Line(a_Line);\n\tLine.erase(Line.begin());  // Remove the beginning \"!\"\n\tLine.erase(std::remove_if(Line.begin(), Line.end(), isspace), Line.end());\n\n\tstd::unique_ptr<cItem> Item = std::make_unique<cItem>();\n\tint BurnTime;\n\n\tconst AStringVector & Sides = StringSplit(Line, \"=\");\n\tif (Sides.size() != 2)\n\t{\n\t\tLOGWARNING(\"furnace.txt: line %d: A single '=' was expected, got %zu\", a_LineNum, Sides.size() - 1);\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tif (!ParseItem(Sides[0], *Item))\n\t{\n\t\tLOGWARNING(\"furnace.txt: line %d: Cannot parse item \\\"%s\\\".\", a_LineNum, Sides[0].c_str());\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tif (!StringToInteger<int>(Sides[1], BurnTime))\n\t{\n\t\tLOGWARNING(\"furnace.txt: line %d: Cannot parse burn time.\", a_LineNum);\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\t// Add to fuel list:\n\tcFuel Fuel;\n\tFuel.In = Item.release();\n\tFuel.BurnTime = BurnTime;\n\tm_pState->Fuel.push_back(Fuel);\n}\n\n\n\n\n\nvoid cFurnaceRecipe::AddRecipeFromLine(const AString & a_Line, unsigned int a_LineNum)\n{\n\tAString Line(a_Line);\n\tLine.erase(std::remove_if(Line.begin(), Line.end(), isspace), Line.end());\n\n\tint CookTime = 200;\n\tfloat Reward = 0;\n\tstd::unique_ptr<cItem> InputItem = std::make_unique<cItem>();\n\tstd::unique_ptr<cItem> OutputItem = std::make_unique<cItem>();\n\n\tconst AStringVector & Sides = StringSplit(Line, \"=\");\n\tif (Sides.size() != 2)\n\t{\n\t\tLOGWARNING(\"furnace.txt: line %d: A single '=' was expected, got %zu\", a_LineNum, Sides.size() - 1);\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tconst AStringVector & InputSplit = StringSplit(Sides[0], \"@\");\n\tif (!ParseItem(InputSplit[0], *InputItem))\n\t{\n\t\tLOGWARNING(\"furnace.txt: line %d: Cannot parse input item \\\"%s\\\".\", a_LineNum, InputSplit[0].c_str());\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\n\tif (InputSplit.size() > 1)\n\t{\n\t\tif (!StringToInteger<int>(InputSplit[1], CookTime))\n\t\t{\n\t\t\tLOGWARNING(\"furnace.txt: line %d: Cannot parse cook time \\\"%s\\\".\", a_LineNum, InputSplit[1].c_str());\n\t\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\t\treturn;\n\t\t}\n\t}\n\tconst AStringVector & OutputSplit = StringSplit(Sides[1], \"$\");\n\tif (!ParseItem(OutputSplit[0], *OutputItem))\n\t{\n\t\tLOGWARNING(\"furnace.txt: line %d: Cannot parse output item \\\"%s\\\".\", a_LineNum, OutputSplit[0].c_str());\n\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\treturn;\n\t}\n\tif (OutputSplit.size() > 1)\n\t{\n\t\tif (!StringToFloat(OutputSplit[1], Reward))\n\t\t{\n\t\t\tLOGWARNING(\"furnace.txt: line %d: Cannot parse reward \\\"%s\\\".\", a_LineNum, OutputSplit[1].c_str());\n\t\t\tLOGINFO(\"Offending line: \\\"%s\\\"\", a_Line.c_str());\n\t\t\treturn;\n\t\t}\n\t}\n\tcRecipe Recipe;\n\tRecipe.In = InputItem.release();\n\tRecipe.Out = OutputItem.release();\n\tRecipe.CookTime = CookTime;\n\tRecipe.Reward = Reward;\n\tm_pState->Recipes.push_back(Recipe);\n}\n\n\n\n\n\nbool cFurnaceRecipe::ParseItem(const AString & a_String, cItem & a_Item)\n{\n\tAString ItemString = a_String;\n\n\tconst AStringVector & SplitAmount = StringSplit(ItemString, \",\");\n\tItemString = SplitAmount[0];\n\n\tconst AStringVector & SplitMeta = StringSplit(ItemString, \":\");\n\tItemString = SplitMeta[0];\n\n\tif (!StringToItem(ItemString, a_Item))\n\t{\n\t\treturn false;\n\t}\n\n\tif (SplitAmount.size() > 1)\n\t{\n\t\tif (!StringToInteger<char>(SplitAmount[1], a_Item.m_ItemCount))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (SplitMeta.size() > 1)\n\t{\n\t\tif (!StringToInteger<short>(SplitMeta[1], a_Item.m_ItemDamage))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cFurnaceRecipe::ClearRecipes(void)\n{\n\tfor (RecipeList::iterator itr = m_pState->Recipes.begin(); itr != m_pState->Recipes.end(); ++itr)\n\t{\n\t\tcRecipe Recipe = *itr;\n\t\tdelete Recipe.In;\n\t\tRecipe.In = nullptr;\n\t\tdelete Recipe.Out;\n\t\tRecipe.Out = nullptr;\n\t}\n\tm_pState->Recipes.clear();\n\n\tfor (FuelList::iterator itr = m_pState->Fuel.begin(); itr != m_pState->Fuel.end(); ++itr)\n\t{\n\t\tcFuel Fuel = *itr;\n\t\tdelete Fuel.In;\n\t\tFuel.In = nullptr;\n\t}\n\tm_pState->Fuel.clear();\n}\n\n\n\n\n\nconst cFurnaceRecipe::cRecipe * cFurnaceRecipe::GetRecipeFrom(const cItem & a_Ingredient) const\n{\n\tconst cRecipe * BestRecipe = nullptr;\n\tfor (RecipeList::const_iterator itr = m_pState->Recipes.begin(); itr != m_pState->Recipes.end(); ++itr)\n\t{\n\t\tconst cRecipe & Recipe = *itr;\n\t\tif ((Recipe.In->m_ItemType == a_Ingredient.m_ItemType) && (Recipe.In->m_ItemCount <= a_Ingredient.m_ItemCount))\n\t\t{\n\t\t\tif (BestRecipe && (BestRecipe->In->m_ItemCount > Recipe.In->m_ItemCount))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if ((Recipe.In->m_ItemDamage == -1) || (Recipe.In->m_ItemDamage == a_Ingredient.m_ItemDamage))\n\t\t\t{\n\t\t\t\tBestRecipe = &Recipe;\n\t\t\t}\n\t\t}\n\t}\n\treturn BestRecipe;\n}\n\n\n\n\n\nbool cFurnaceRecipe::IsFuel(const cItem & a_Item) const\n{\n\tfor (auto & Fuel : m_pState->Fuel)\n\t{\n\t\tif ((Fuel.In->m_ItemType == a_Item.m_ItemType) && (Fuel.In->m_ItemCount <= a_Item.m_ItemCount))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nint cFurnaceRecipe::GetBurnTime(const cItem & a_Fuel) const\n{\n\tint BestFuel = 0;\n\tfor (FuelList::const_iterator itr = m_pState->Fuel.begin(); itr != m_pState->Fuel.end(); ++itr)\n\t{\n\t\tconst cFuel & Fuel = *itr;\n\t\tif ((Fuel.In->m_ItemType == a_Fuel.m_ItemType) && (Fuel.In->m_ItemCount <= a_Fuel.m_ItemCount))\n\t\t{\n\t\t\tif (BestFuel > 0 && (BestFuel > Fuel.BurnTime))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tBestFuel = Fuel.BurnTime;\n\t\t\t}\n\t\t}\n\t}\n\treturn BestFuel;\n}\n\n\n\n"
  },
  {
    "path": "src/FurnaceRecipe.h",
    "content": "\n#pragma once\n\n\n\n\n\nclass cItem;\n\n\n\n\n\nclass cFurnaceRecipe\n{\npublic:\n\tcFurnaceRecipe(void);\n\t~cFurnaceRecipe();\n\n\tvoid ReloadRecipes(void);\n\n\tstruct cFuel\n\t{\n\t\tcItem * In;\n\t\tint BurnTime;  ///< How long this fuel burns, in ticks\n\t};\n\n\tstruct cRecipe\n\t{\n\t\tcItem * In;\n\t\tcItem * Out;\n\t\tint CookTime;  ///< How long this recipe takes to smelt, in ticks\n\t\tfloat Reward;  ///< Experience reward for creating 1 of this item\n\t};\n\n\t/** Returns a recipe for the specified input, nullptr if no recipe found */\n\tconst cRecipe * GetRecipeFrom(const cItem & a_Ingredient) const;\n\n\t/** Returns true if the item is a fuel, false if not. */\n\tbool IsFuel(const cItem & a_Item) const;\n\n\t/** Returns the amount of time that the specified fuel burns, in ticks */\n\tint GetBurnTime(const cItem & a_Fuel) const;\n\nprivate:\n\tvoid ClearRecipes(void);\n\n\t/** Parses the fuel contained in the line, adds it to m_pState's fuels.\n\tLogs a warning to the console on input error. */\n\tvoid AddFuelFromLine(const AString & a_Line, unsigned int a_LineNum);\n\n\t/** Parses the recipe contained in the line, adds it to m_pState's recipes.\n\tLogs a warning to the console on input error. */\n\tvoid AddRecipeFromLine(const AString & a_Line, unsigned int a_LineNum);\n\n\t/** Parses an item string in the format \"<ItemType>[: <Damage>][, <Amount>]\", returns true if successful. */\n\tbool ParseItem(const AString & a_String, cItem & a_Item);\n\n\tstruct sFurnaceRecipeState;\n\tsFurnaceRecipeState * m_pState;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Generating/BioGen.cpp",
    "content": "\n// BioGen.cpp\n\n// Implements the various biome generators\n\n#include \"Globals.h\"\n#include \"BioGen.h\"\n#include \"IntGen.h\"\n#include \"ProtIntGen.h\"\n#include \"../IniFile.h\"\n#include \"../LinearUpscale.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenConstant:\n\nvoid cBioGenConstant::GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tUNUSED(a_ChunkCoords);\n\tfor (size_t i = 0; i < ARRAYCOUNT(a_BiomeMap); i++)\n\t{\n\t\ta_BiomeMap[i] = m_Biome;\n\t}\n}\n\n\n\n\n\nvoid cBioGenConstant::InitializeBiomeGen(cIniFile & a_IniFile)\n{\n\tAString defaultBiome;\n\tswitch (StringToDimension(a_IniFile.GetValue(\"General\", \"Dimension\", \"Overworld\")))\n\t{\n\t\tcase dimOverworld: defaultBiome = \"Plains\";    break;\n\t\tcase dimNether:    defaultBiome = \"Nether\";    break;\n\t\tcase dimEnd:       defaultBiome = \"End\";       break;\n\t\tcase dimNotSet:    defaultBiome = \"Swampland\"; break;\n\t}\n\tAString Biome = a_IniFile.GetValueSet(\"Generator\", \"ConstantBiome\", defaultBiome);\n\tm_Biome = StringToBiome(Biome);\n\tif (m_Biome == biInvalidBiome)\n\t{\n\t\tLOGWARN(\"[Generator]::ConstantBiome value \\\"%s\\\" not recognized, using \\\"Plains\\\".\", Biome.c_str());\n\t\tm_Biome = biPlains;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenCache:\n\ncBioGenCache::cBioGenCache(cBiomeGen & a_BioGenToCache, size_t a_CacheSize) :\n\tm_BioGenToCache(a_BioGenToCache),\n\tm_CacheSize(a_CacheSize),\n\tm_NumHits(0),\n\tm_NumMisses(0),\n\tm_TotalChain(0)\n{\n\tm_CacheData.resize(m_CacheSize);\n\tm_CacheOrder.resize(m_CacheSize);\n\tfor (size_t i = 0; i < m_CacheSize; i++)\n\t{\n\t\tm_CacheOrder[i] = i;\n\t}\n}\n\n\n\n\n\nvoid cBioGenCache::GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tif (((m_NumHits + m_NumMisses) % 1024) == 10)\n\t{\n\t\t// LOGD(\"BioGenCache: %u hits, %u misses, saved %.2f %%\", static_cast<unsigned>(m_NumHits), static_cast<unsigned>(m_NumMisses), 100.0 * m_NumHits / (m_NumHits + m_NumMisses));\n\t\t// LOGD(\"BioGenCache: Avg cache chain length: %.2f\", static_cast<double>(m_TotalChain) / m_NumHits);\n\t}\n\n\tfor (size_t i = 0; i < m_CacheSize; i++)\n\t{\n\t\tif (m_CacheData[m_CacheOrder[i]].m_Coords != a_ChunkCoords)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Found it in the cache\n\t\tsize_t Idx = m_CacheOrder[i];\n\n\t\t// Move to front:\n\t\tfor (size_t j = i; j > 0; j--)\n\t\t{\n\t\t\tm_CacheOrder[j] = m_CacheOrder[j - 1];\n\t\t}\n\t\tm_CacheOrder[0] = Idx;\n\n\t\t// Use the cached data:\n\t\tmemcpy(a_BiomeMap, m_CacheData[Idx].m_BiomeMap, sizeof(a_BiomeMap));\n\n\t\tm_NumHits++;\n\t\tm_TotalChain += i;\n\t\treturn;\n\t}  // for i - cache\n\n\t// Not in the cache:\n\tm_NumMisses++;\n\tm_BioGenToCache.GenBiomes(a_ChunkCoords, a_BiomeMap);\n\n\t// Insert it as the first item in the MRU order:\n\tsize_t Idx = m_CacheOrder[m_CacheSize - 1];\n\tfor (size_t i = m_CacheSize - 1; i > 0; i--)\n\t{\n\t\tm_CacheOrder[i] = m_CacheOrder[i - 1];\n\t}  // for i - m_CacheOrder[]\n\tm_CacheOrder[0] = Idx;\n\tmemcpy(m_CacheData[Idx].m_BiomeMap, a_BiomeMap, sizeof(a_BiomeMap));\n\tm_CacheData[Idx].m_Coords = a_ChunkCoords;\n}\n\n\n\n\n\nvoid cBioGenCache::InitializeBiomeGen(cIniFile & a_IniFile)\n{\n\tSuper::InitializeBiomeGen(a_IniFile);\n\tm_BioGenToCache.InitializeBiomeGen(a_IniFile);\n}\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenMulticache:\n\ncBioGenMulticache::cBioGenMulticache(std::unique_ptr<cBiomeGen> a_BioGenToCache, size_t a_SubCacheSize, size_t a_NumSubCaches) :\n\tm_NumSubCaches(a_NumSubCaches),\n\tm_Underlying(std::move(a_BioGenToCache))\n{\n\tm_Caches.reserve(a_NumSubCaches);\n\tfor (size_t i = 0; i < a_NumSubCaches; i++)\n\t{\n\t\tm_Caches.push_back(std::make_unique<cBioGenCache>(*m_Underlying, a_SubCacheSize));\n\t}\n}\n\n\n\n\n\nvoid cBioGenMulticache::GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tconst size_t coefficient = 3;\n\tconst size_t cacheIdx = (static_cast<size_t>(a_ChunkCoords.m_ChunkX) + coefficient * static_cast<size_t>(a_ChunkCoords.m_ChunkZ)) % m_NumSubCaches;\n\n\tm_Caches[cacheIdx]->GenBiomes(a_ChunkCoords, a_BiomeMap);\n}\n\n\n\n\n\nvoid cBioGenMulticache::InitializeBiomeGen(cIniFile & a_IniFile)\n{\n\tfor (auto & itr : m_Caches)\n\t{\n\t\titr->InitializeBiomeGen(a_IniFile);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBiomeGenList:\n\nvoid cBiomeGenList::InitializeBiomes(const AString & a_Biomes)\n{\n\tAStringVector Split = StringSplitAndTrim(a_Biomes, \",\");\n\n\t// Convert each string in the list into biome:\n\tfor (AStringVector::const_iterator itr = Split.begin(); itr != Split.end(); ++itr)\n\t{\n\t\tAStringVector Split2 = StringSplit(*itr, \":\");\n\t\tif (Split2.size() < 1)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tint Count = 1;\n\t\tif (Split2.size() >= 2)\n\t\t{\n\t\t\tif (!StringToInteger(Split2[1], Count))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"Cannot decode biome count: \\\"%s\\\"; using 1.\", Split2[1].c_str());\n\t\t\t\tCount = 1;\n\t\t\t}\n\t\t}\n\t\tEMCSBiome Biome = StringToBiome(Split2[0]);\n\t\tif (Biome != biInvalidBiome)\n\t\t{\n\t\t\tfor (int i = 0; i < Count; i++)\n\t\t\t{\n\t\t\t\tm_Biomes.push_back(Biome);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLOGWARNING(\"Cannot decode biome name: \\\"%s\\\"; skipping\", Split2[0].c_str());\n\t\t}\n\t}  // for itr - Split[]\n\tif (!m_Biomes.empty())\n\t{\n\t\tm_BiomesCount = static_cast<int>(m_Biomes.size());\n\t\treturn;\n\t}\n\n\t// There were no biomes, add default biomes:\n\tstatic EMCSBiome Biomes[] =\n\t{\n\t\tbiOcean,\n\t\tbiPlains,\n\t\tbiDesert,\n\t\tbiExtremeHills,\n\t\tbiForest,\n\t\tbiTaiga,\n\t\tbiSwampland,\n\t\tbiRiver,\n\t\tbiFrozenOcean,\n\t\tbiFrozenRiver,\n\t\tbiIcePlains,\n\t\tbiIceMountains,\n\t\tbiMushroomIsland,\n\t\tbiMushroomShore,\n\t\tbiBeach,\n\t\tbiDesertHills,\n\t\tbiForestHills,\n\t\tbiTaigaHills,\n\t\tbiExtremeHillsEdge,\n\t\tbiJungle,\n\t\tbiJungleHills,\n\t} ;\n\tm_Biomes.reserve(ARRAYCOUNT(Biomes));\n\tfor (size_t i = 0; i < ARRAYCOUNT(Biomes); i++)\n\t{\n\t\tm_Biomes.push_back(Biomes[i]);\n\t}\n\tm_BiomesCount = static_cast<int>(m_Biomes.size());\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenCheckerboard:\n\nvoid cBioGenCheckerboard::GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tint Base = (cChunkDef::Width * a_ChunkCoords.m_ChunkZ + z) / m_BiomeSize;\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint Add = cChunkDef::Width * a_ChunkCoords.m_ChunkX + x;\n\t\t\tsize_t BiomeIdx = static_cast<size_t>((((Base + Add / m_BiomeSize) % m_BiomesCount) + m_BiomesCount) % m_BiomesCount);  // Need to add and modulo twice because of negative numbers\n\t\t\ta_BiomeMap[x + cChunkDef::Width * z] = m_Biomes[BiomeIdx];\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBioGenCheckerboard::InitializeBiomeGen(cIniFile & a_IniFile)\n{\n\tSuper::InitializeBiomeGen(a_IniFile);\n\tAString Biomes = a_IniFile.GetValueSet (\"Generator\", \"CheckerBoardBiomes\",    \"\");\n\tm_BiomeSize    = a_IniFile.GetValueSetI(\"Generator\", \"CheckerboardBiomeSize\", 64);\n\tm_BiomeSize = (m_BiomeSize < 8) ? 8 : m_BiomeSize;\n\tInitializeBiomes(Biomes);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenVoronoi :\n\nvoid cBioGenVoronoi::GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tint BaseZ = cChunkDef::Width * a_ChunkCoords.m_ChunkZ;\n\tint BaseX = cChunkDef::Width * a_ChunkCoords.m_ChunkX;\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tint AbsoluteZ = BaseZ + z;\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint VoronoiCellValue = m_Voronoi.GetValueAt(BaseX + x, AbsoluteZ) / 8;\n\t\t\tcChunkDef::SetBiome(a_BiomeMap, x, z, m_Biomes[static_cast<size_t>(VoronoiCellValue % m_BiomesCount)]);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cBioGenVoronoi::InitializeBiomeGen(cIniFile & a_IniFile)\n{\n\tSuper::InitializeBiomeGen(a_IniFile);\n\tint CellSize     = a_IniFile.GetValueSetI(\"Generator\", \"VoronoiCellSize\", 128);\n\tint JitterSize   = a_IniFile.GetValueSetI(\"Generator\", \"VoronoiJitterSize\", CellSize);\n\tint OddRowOffset = a_IniFile.GetValueSetI(\"Generator\", \"VoronoiOddRowOffset\", 0);\n\tm_Voronoi.SetCellSize(CellSize);\n\tm_Voronoi.SetJitterSize(JitterSize);\n\tm_Voronoi.SetOddRowOffset(OddRowOffset);\n\tInitializeBiomes(a_IniFile.GetValueSet (\"Generator\", \"VoronoiBiomes\",   \"\"));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenDistortedVoronoi:\n\nvoid cBioGenDistortedVoronoi::GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tint BaseZ = cChunkDef::Width * a_ChunkCoords.m_ChunkZ;\n\tint BaseX = cChunkDef::Width * a_ChunkCoords.m_ChunkX;\n\n\t// Distortions for linear interpolation:\n\tint DistortX[cChunkDef::Width + 1][cChunkDef::Width + 1];\n\tint DistortZ[cChunkDef::Width + 1][cChunkDef::Width + 1];\n\tfor (int x = 0; x <= 4; x++) for (int z = 0; z <= 4; z++)\n\t{\n\t\tDistort(BaseX + x * 4, BaseZ + z * 4, DistortX[4 * x][4 * z], DistortZ[4 * x][4 * z]);\n\t}\n\n\tLinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortX[0][0]);\n\tLinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortZ[0][0]);\n\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint VoronoiCellValue = m_Voronoi.GetValueAt(DistortX[x][z], DistortZ[x][z]) / 8;\n\t\t\tcChunkDef::SetBiome(a_BiomeMap, x, z, m_Biomes[static_cast<size_t>(VoronoiCellValue % m_BiomesCount)]);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cBioGenDistortedVoronoi::InitializeBiomeGen(cIniFile & a_IniFile)\n{\n\tSuper::InitializeBiomeGen(a_IniFile);\n\tm_CellSize = a_IniFile.GetValueSetI(\"Generator\", \"DistortedVoronoiCellSize\", 96);\n\tm_Voronoi.SetCellSize(m_CellSize);\n\tInitializeBiomes(a_IniFile.GetValueSet(\"Generator\", \"DistortedVoronoiBiomes\", \"\"));\n}\n\n\n\n\n\nvoid cBioGenDistortedVoronoi::Distort(int a_BlockX, int a_BlockZ, int & a_DistortedX, int & a_DistortedZ)\n{\n\tdouble NoiseX = m_Noise.CubicNoise3D(static_cast<float>(a_BlockX / m_CellSize), static_cast<float>(a_BlockZ / m_CellSize), 1000);\n\tNoiseX += 0.5 * m_Noise.CubicNoise3D(2 *  static_cast<float>(a_BlockX / m_CellSize), 2 *  static_cast<float>(a_BlockZ / m_CellSize), 2000);\n\tNoiseX += 0.08 * m_Noise.CubicNoise3D(16 * static_cast<float>(a_BlockX / m_CellSize), 16 * static_cast<float>(a_BlockZ / m_CellSize), 3000);\n\tdouble NoiseZ = m_Noise.CubicNoise3D(static_cast<float>(a_BlockX / m_CellSize), static_cast<float>(a_BlockZ / m_CellSize), 4000);\n\tNoiseZ += 0.5 * m_Noise.CubicNoise3D(2 *  static_cast<float>(a_BlockX / m_CellSize), 2 *  static_cast<float>(a_BlockZ / m_CellSize), 5000);\n\tNoiseZ += 0.08 * m_Noise.CubicNoise3D(16 * static_cast<float>(a_BlockX / m_CellSize), 16 * static_cast<float>(a_BlockZ / m_CellSize), 6000);\n\n\ta_DistortedX = a_BlockX + static_cast<int>(m_CellSize * 0.5 * NoiseX);\n\ta_DistortedZ = a_BlockZ + static_cast<int>(m_CellSize * 0.5 * NoiseZ);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenMultiStepMap :\n\ncBioGenMultiStepMap::cBioGenMultiStepMap(int a_Seed) :\n\tm_Noise1(a_Seed + 1000),\n\tm_Noise2(a_Seed + 2000),\n\tm_Noise3(a_Seed + 3000),\n\tm_Noise4(a_Seed + 4000),\n\tm_Noise5(a_Seed + 5000),\n\tm_Noise6(a_Seed + 6000),\n\tm_Seed(a_Seed),\n\tm_OceanCellSize(384),\n\tm_MushroomIslandSize(64),\n\tm_RiverCellSize(384),\n\tm_RiverWidthThreshold(0.125),\n\tm_LandBiomesSize(1024)\n{\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::InitializeBiomeGen(cIniFile & a_IniFile)\n{\n\tm_OceanCellSize       =        a_IniFile.GetValueSetI(\"Generator\", \"MultiStepMapOceanCellSize\",      m_OceanCellSize);\n\tm_MushroomIslandSize  =        a_IniFile.GetValueSetI(\"Generator\", \"MultiStepMapMushroomIslandSize\", m_MushroomIslandSize);\n\tm_RiverCellSize       =        a_IniFile.GetValueSetI(\"Generator\", \"MultiStepMapRiverCellSize\",      m_RiverCellSize);\n\tm_RiverWidthThreshold =        a_IniFile.GetValueSetF(\"Generator\", \"MultiStepMapRiverWidth\",         m_RiverWidthThreshold);\n\tm_LandBiomesSize      = static_cast<float>(a_IniFile.GetValueSetI(\"Generator\", \"MultiStepMapLandBiomeSize\",      static_cast<int>(m_LandBiomesSize)));\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tDecideOceanLandMushroom(a_ChunkCoords, a_BiomeMap);\n\tAddRivers(a_ChunkCoords, a_BiomeMap);\n\tApplyTemperatureHumidity(a_ChunkCoords, a_BiomeMap);\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::DecideOceanLandMushroom(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\t// Distorted Voronoi over 3 biomes, with mushroom having only a special occurence.\n\n\t// Prepare a distortion lookup table, by distorting a 5x5 area and using that as 1:4 zoom (linear interpolate):\n\tint BaseZ = cChunkDef::Width * a_ChunkCoords.m_ChunkZ;\n\tint BaseX = cChunkDef::Width * a_ChunkCoords.m_ChunkX;\n\tint DistortX[cChunkDef::Width + 1][cChunkDef::Width + 1];\n\tint DistortZ[cChunkDef::Width + 1][cChunkDef::Width + 1];\n\tint DistortSize = m_OceanCellSize / 2;\n\tfor (int x = 0; x <= 4; x++) for (int z = 0; z <= 4; z++)\n\t{\n\t\tDistort(BaseX + x * 4, BaseZ + z * 4, DistortX[4 * x][4 * z], DistortZ[4 * x][4 * z], DistortSize);\n\t}\n\tLinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortX[0][0]);\n\tLinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortZ[0][0]);\n\n\t// Prepare a 9x9 area of neighboring cell seeds\n\t// (assuming that 7x7 cell area is larger than a chunk being generated)\n\tconst int NEIGHBORHOOD_SIZE = 4;  // How many seeds in each direction to check\n\tint CellX = BaseX / m_OceanCellSize;\n\tint CellZ = BaseZ / m_OceanCellSize;\n\tint SeedX[2 * NEIGHBORHOOD_SIZE + 1][2 * NEIGHBORHOOD_SIZE + 1];\n\tint SeedZ[2 * NEIGHBORHOOD_SIZE + 1][2 * NEIGHBORHOOD_SIZE + 1];\n\tEMCSBiome SeedV[2 * NEIGHBORHOOD_SIZE + 1][2 * NEIGHBORHOOD_SIZE + 1];\n\tfor (int xc = 0; xc < 2 * NEIGHBORHOOD_SIZE + 1; xc++)\n\t{\n\t\tint RealCellX = xc + CellX - NEIGHBORHOOD_SIZE;\n\t\tint CellBlockX = RealCellX * m_OceanCellSize;\n\t\tfor (int zc = 0; zc < 2 * NEIGHBORHOOD_SIZE + 1; zc++)\n\t\t{\n\t\t\tint RealCellZ = zc + CellZ - NEIGHBORHOOD_SIZE;\n\t\t\tint CellBlockZ = RealCellZ * m_OceanCellSize;\n\t\t\tint OffsetX = (m_Noise2.IntNoise3DInt(RealCellX, 16 * RealCellX + 32 * RealCellZ, RealCellZ) / 8) % m_OceanCellSize;\n\t\t\tint OffsetZ = (m_Noise4.IntNoise3DInt(RealCellX, 32 * RealCellX - 16 * RealCellZ, RealCellZ) / 8) % m_OceanCellSize;\n\t\t\tSeedX[xc][zc] = CellBlockX + OffsetX;\n\t\t\tSeedZ[xc][zc] = CellBlockZ + OffsetZ;\n\t\t\tSeedV[xc][zc] = (((m_Noise6.IntNoise3DInt(RealCellX, RealCellX - RealCellZ + 1000, RealCellZ) / 11) % 256) > 90) ? biOcean : (biInvalidBiome);\n\t\t}  // for z\n\t}  // for x\n\n\tfor (int xc = 1; xc < 2 * NEIGHBORHOOD_SIZE; xc++) for (int zc = 1; zc < 2 * NEIGHBORHOOD_SIZE; zc++)\n\t{\n\t\tif (\n\t\t\t(SeedV[xc    ][zc]     == biOcean) &&\n\t\t\t(SeedV[xc - 1][zc]     == biOcean) &&\n\t\t\t(SeedV[xc + 1][zc]     == biOcean) &&\n\t\t\t(SeedV[xc    ][zc - 1] == biOcean) &&\n\t\t\t(SeedV[xc    ][zc + 1] == biOcean) &&\n\t\t\t(SeedV[xc - 1][zc - 1] == biOcean) &&\n\t\t\t(SeedV[xc + 1][zc - 1] == biOcean) &&\n\t\t\t(SeedV[xc - 1][zc + 1] == biOcean) &&\n\t\t\t(SeedV[xc + 1][zc + 1] == biOcean)\n\t\t)\n\t\t{\n\t\t\tSeedV[xc][zc] = biMushroomIsland;\n\t\t}\n\t}\n\n\t// For each column find the nearest distorted cell and use its value as the biome:\n\tint MushroomOceanThreshold = m_OceanCellSize * m_OceanCellSize * m_MushroomIslandSize / 1024;\n\tint MushroomShoreThreshold = m_OceanCellSize * m_OceanCellSize * m_MushroomIslandSize / 2048;\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint AbsoluteZ = DistortZ[x][z];\n\t\t\tint AbsoluteX = DistortX[x][z];\n\t\t\tint MinDist = m_OceanCellSize * m_OceanCellSize * 16;  // There has to be a cell closer than this\n\t\t\tEMCSBiome Biome = biPlains;\n\t\t\t// Find the nearest cell seed:\n\t\t\tfor (int xs = 1; xs < 2 * NEIGHBORHOOD_SIZE; xs++) for (int zs = 1; zs < 2 * NEIGHBORHOOD_SIZE; zs++)\n\t\t\t{\n\t\t\t\tint Dist = (SeedX[xs][zs] - AbsoluteX) * (SeedX[xs][zs] - AbsoluteX) + (SeedZ[xs][zs] - AbsoluteZ) * (SeedZ[xs][zs] - AbsoluteZ);\n\t\t\t\tif (Dist >= MinDist)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tMinDist = Dist;\n\t\t\t\tBiome = SeedV[xs][zs];\n\t\t\t\t// Shrink mushroom biome and add a shore:\n\t\t\t\tif (Biome == biMushroomIsland)\n\t\t\t\t{\n\t\t\t\t\tif (Dist > MushroomOceanThreshold)\n\t\t\t\t\t{\n\t\t\t\t\t\tBiome = biOcean;\n\t\t\t\t\t}\n\t\t\t\t\telse if (Dist > MushroomShoreThreshold)\n\t\t\t\t\t{\n\t\t\t\t\t\tBiome = biMushroomShore;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}  // for zs, xs\n\n\t\t\tcChunkDef::SetBiome(a_BiomeMap, x, z, Biome);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::AddRivers(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfloat NoiseCoordZ = static_cast<float>(a_ChunkCoords.m_ChunkZ * cChunkDef::Width + z) / m_RiverCellSize;\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tif (cChunkDef::GetBiome(a_BiomeMap, x, z) != biInvalidBiome)\n\t\t\t{\n\t\t\t\t// Biome already set, skip this column\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfloat NoiseCoordX = static_cast<float>(a_ChunkCoords.m_ChunkX * cChunkDef::Width + x) / m_RiverCellSize;\n\n\t\t\tdouble Noise = m_Noise1.CubicNoise2D(    NoiseCoordX,     NoiseCoordZ);\n\t\t\tNoise += 0.5 * m_Noise3.CubicNoise2D(2 * NoiseCoordX, 2 * NoiseCoordZ);\n\t\t\tNoise += 0.1 * m_Noise5.CubicNoise2D(8 * NoiseCoordX, 8 * NoiseCoordZ);\n\n\t\t\tif ((Noise > 0) && (Noise < m_RiverWidthThreshold))\n\t\t\t{\n\t\t\t\tcChunkDef::SetBiome(a_BiomeMap, x, z, biRiver);\n\t\t\t}\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::ApplyTemperatureHumidity(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tIntMap TemperatureMap;\n\tIntMap HumidityMap;\n\tBuildTemperatureHumidityMaps(a_ChunkCoords, TemperatureMap, HumidityMap);\n\n\tFreezeWaterBiomes(a_BiomeMap, TemperatureMap);\n\tDecideLandBiomes(a_BiomeMap, TemperatureMap, HumidityMap);\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::Distort(int a_BlockX, int a_BlockZ, int & a_DistortedX, int & a_DistortedZ, int a_CellSize)\n{\n\tdouble NoiseX = m_Noise3.CubicNoise2D(     static_cast<float>(a_BlockX / a_CellSize),      static_cast<float>(a_BlockZ / a_CellSize));\n\tNoiseX += 0.5 * m_Noise2.CubicNoise2D(2 *  static_cast<float>(a_BlockX / a_CellSize), 2 *  static_cast<float>(a_BlockZ / a_CellSize));\n\tNoiseX += 0.1 * m_Noise1.CubicNoise2D(16 * static_cast<float>(a_BlockX / a_CellSize), 16 * static_cast<float>(a_BlockZ / a_CellSize));\n\tdouble NoiseZ = m_Noise6.CubicNoise2D(     static_cast<float>(a_BlockX / a_CellSize),      static_cast<float>(a_BlockZ / a_CellSize));\n\tNoiseZ += 0.5 * m_Noise5.CubicNoise2D(2 *  static_cast<float>(a_BlockX / a_CellSize), 2 *  static_cast<float>(a_BlockZ / a_CellSize));\n\tNoiseZ += 0.1 * m_Noise4.CubicNoise2D(16 * static_cast<float>(a_BlockX / a_CellSize), 16 * static_cast<float>(a_BlockZ / a_CellSize));\n\n\ta_DistortedX = a_BlockX + static_cast<int>(a_CellSize * 0.5 * NoiseX);\n\ta_DistortedZ = a_BlockZ + static_cast<int>(a_CellSize * 0.5 * NoiseZ);\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::BuildTemperatureHumidityMaps(cChunkCoords a_ChunkCoords, IntMap & a_TemperatureMap, IntMap & a_HumidityMap)\n{\n\t// Linear interpolation over 8x8 blocks; use double for better precision:\n\tDblMap TemperatureMap;\n\tDblMap HumidityMap;\n\tfor (int z = 0; z < 17; z += 8)\n\t{\n\t\tfloat NoiseCoordZ = static_cast<float>(a_ChunkCoords.m_ChunkZ * cChunkDef::Width + z) / m_LandBiomesSize;\n\t\tfor (int x = 0; x < 17; x += 8)\n\t\t{\n\t\t\tfloat NoiseCoordX = static_cast<float>(a_ChunkCoords.m_ChunkX * cChunkDef::Width + x) / m_LandBiomesSize;\n\n\t\t\tdouble NoiseT = m_Noise1.CubicNoise2D(    NoiseCoordX,     NoiseCoordZ);\n\t\t\tNoiseT += 0.5 * m_Noise2.CubicNoise2D(2 * NoiseCoordX, 2 * NoiseCoordZ);\n\t\t\tNoiseT += 0.1 * m_Noise3.CubicNoise2D(8 * NoiseCoordX, 8 * NoiseCoordZ);\n\t\t\tTemperatureMap[x + 17 * z] = NoiseT;\n\n\t\t\tdouble NoiseH = m_Noise4.CubicNoise2D(    NoiseCoordX,     NoiseCoordZ);\n\t\t\tNoiseH += 0.5 * m_Noise5.CubicNoise2D(2 * NoiseCoordX, 2 * NoiseCoordZ);\n\t\t\tNoiseH += 0.1 * m_Noise6.CubicNoise2D(8 * NoiseCoordX, 8 * NoiseCoordZ);\n\t\t\tHumidityMap[x + 17 * z] = NoiseH;\n\t\t}  // for x\n\t}  // for z\n\tLinearUpscale2DArrayInPlace<17, 17, 8, 8>(TemperatureMap);\n\tLinearUpscale2DArrayInPlace<17, 17, 8, 8>(HumidityMap);\n\n\t// Re-map into integral values in [0 .. 255] range:\n\tfor (size_t idx = 0; idx < ARRAYCOUNT(a_TemperatureMap); idx++)\n\t{\n\t\ta_TemperatureMap[idx] = Clamp(static_cast<int>(128 + TemperatureMap[idx] * 128), 0, 255);\n\t\ta_HumidityMap[idx]    = Clamp(static_cast<int>(128 + HumidityMap[idx]    * 128), 0, 255);\n\t}\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::DecideLandBiomes(cChunkDef::BiomeMap & a_BiomeMap, const IntMap & a_TemperatureMap, const IntMap & a_HumidityMap)\n{\n\tstatic const EMCSBiome BiomeMap[] =\n\t{\n\t\t//       0         1         2               3               4               5               6         7         8         9         10              11              12              13              14             15\n\t\t/*  0 */ biTundra, biTundra, biTundra,       biTundra,       biPlains,       biPlains,       biPlains, biPlains, biPlains, biPlains, biDesert,       biDesert,      biDesert,       biDesert,       biDesert,      biDesert,\n\t\t/*  1 */ biTundra, biTundra, biTundra,       biTundra,       biPlains,       biPlains,       biPlains, biPlains, biPlains, biPlains, biDesert,       biDesert,      biDesert,       biDesert,       biDesert,      biDesert,\n\t\t/*  2 */ biTundra, biTundra, biTundra,       biTundra,       biPlains,       biExtremeHills, biPlains, biPlains, biPlains, biPlains, biDesert,       biDesert,      biDesertHills,  biDesertHills,  biDesert,      biDesert,\n\t\t/*  3 */ biTundra, biTundra, biTundra,       biTundra,       biExtremeHills, biExtremeHills, biPlains, biPlains, biPlains, biPlains, biDesert,       biDesert,      biDesertHills,  biDesertHills,  biDesert,      biDesert,\n\t\t/*  4 */ biTundra, biTundra, biIceMountains, biIceMountains, biExtremeHills, biExtremeHills, biPlains, biPlains, biPlains, biPlains, biForestHills,  biForestHills, biExtremeHills, biExtremeHills, biDesertHills, biDesert,\n\t\t/*  5 */ biTundra, biTundra, biIceMountains, biIceMountains, biExtremeHills, biExtremeHills, biPlains, biPlains, biPlains, biPlains, biForestHills,  biForestHills, biExtremeHills, biExtremeHills, biDesertHills, biDesert,\n\t\t/*  6 */ biTundra, biTundra, biIceMountains, biIceMountains, biForestHills,  biForestHills,  biForest, biForest, biForest, biForest, biForest,       biForestHills, biExtremeHills, biExtremeHills, biPlains,      biPlains,\n\t\t/*  7 */ biTundra, biTundra, biIceMountains, biIceMountains, biForestHills,  biForestHills,  biForest, biForest, biForest, biForest, biForest,       biForestHills, biExtremeHills, biExtremeHills, biPlains,      biPlains,\n\t\t/*  8 */ biTundra, biTundra, biTaiga,        biTaiga,        biForest,       biForest,       biForest, biForest, biForest, biForest, biForest,       biForestHills, biExtremeHills, biExtremeHills, biPlains,      biPlains,\n\t\t/*  9 */ biTundra, biTundra, biTaiga,        biTaiga,        biForest,       biForest,       biForest, biForest, biForest, biForest, biForest,       biForestHills, biExtremeHills, biExtremeHills, biPlains,      biPlains,\n\t\t/* 10 */ biTaiga,  biTaiga,  biTaiga,        biIceMountains, biForestHills,  biForestHills,  biForest, biForest, biForest, biForest, biJungle,       biJungle,      biSwampland,    biSwampland,    biSwampland,   biSwampland,\n\t\t/* 11 */ biTaiga,  biTaiga,  biIceMountains, biIceMountains, biExtremeHills, biForestHills,  biForest, biForest, biForest, biForest, biJungle,       biJungle,      biSwampland,    biSwampland,    biSwampland,   biSwampland,\n\t\t/* 12 */ biTaiga,  biTaiga,  biIceMountains, biIceMountains, biExtremeHills, biJungleHills,  biJungle, biJungle, biJungle, biJungle, biJungle,       biJungle,      biSwampland,    biSwampland,    biSwampland,   biSwampland,\n\t\t/* 13 */ biTaiga,  biTaiga,  biTaiga,        biIceMountains, biJungleHills,  biJungleHills,  biJungle, biJungle, biJungle, biJungle, biJungle,       biJungle,      biSwampland,    biSwampland,    biSwampland,   biSwampland,\n\t\t/* 14 */ biTaiga,  biTaiga,  biTaiga,        biTaiga,        biJungle,       biJungle,       biJungle, biJungle, biJungle, biJungle, biJungle,       biJungle,      biSwampland,    biSwampland,    biSwampland,   biSwampland,\n\t\t/* 15 */ biTaiga,  biTaiga,  biTaiga,        biTaiga,        biJungle,       biJungle,       biJungle, biJungle, biJungle, biJungle, biJungle,       biJungle,      biSwampland,    biSwampland,    biSwampland,   biSwampland,\n\t} ;\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tint idxZ = 17 * z;\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tif (cChunkDef::GetBiome(a_BiomeMap, x, z) != biInvalidBiome)\n\t\t\t{\n\t\t\t\t// Already set before\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tint idx = idxZ + x;\n\t\t\tint Temperature = a_TemperatureMap[idx] / 16;  // -> [0..15] range\n\t\t\tint Humidity    = a_HumidityMap[idx]    / 16;  // -> [0..15] range\n\t\t\tcChunkDef::SetBiome(a_BiomeMap, x, z, BiomeMap[Temperature + 16 * Humidity]);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cBioGenMultiStepMap::FreezeWaterBiomes(cChunkDef::BiomeMap & a_BiomeMap, const IntMap & a_TemperatureMap)\n{\n\tint idx = 0;\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++, idx++)\n\t\t{\n\t\t\tif (a_TemperatureMap[idx] > 4 * 16)\n\t\t\t{\n\t\t\t\t// Not frozen\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tswitch (cChunkDef::GetBiome(a_BiomeMap, x, z))\n\t\t\t{\n\t\t\t\tcase biRiver: cChunkDef::SetBiome(a_BiomeMap, x, z, biFrozenRiver); break;\n\t\t\t\tcase biOcean: cChunkDef::SetBiome(a_BiomeMap, x, z, biFrozenOcean); break;\n\t\t\t\tdefault: break;\n\t\t\t}\n\t\t}  // for x\n\t\tidx += 1;\n\t}  // for z\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenTwoLevel:\n\ncBioGenTwoLevel::cBioGenTwoLevel(int a_Seed) :\n\tm_VoronoiLarge(a_Seed + 1000),\n\tm_VoronoiSmall(a_Seed + 2000),\n\tm_Noise1(a_Seed + 5001),\n\tm_Noise2(a_Seed + 5002),\n\tm_Noise3(a_Seed + 5003),\n\tm_Noise4(a_Seed + 5004),\n\tm_Noise5(a_Seed + 5005),\n\tm_Noise6(a_Seed + 5006),\n\tm_FreqX1(0.0),\n\tm_AmpX1(0.0),\n\tm_FreqX2(0.0),\n\tm_AmpX2(0.0),\n\tm_FreqX3(0.0),\n\tm_AmpX3(0.0),\n\tm_FreqZ1(0.0),\n\tm_AmpZ1(0.0),\n\tm_FreqZ2(0.0),\n\tm_AmpZ2(0.0),\n\tm_FreqZ3(0.0),\n\tm_AmpZ3(0.0)\n{\n}\n\n\n\n\n\nvoid cBioGenTwoLevel::GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tint BaseZ = cChunkDef::Width * a_ChunkCoords.m_ChunkZ;\n\tint BaseX = cChunkDef::Width * a_ChunkCoords.m_ChunkX;\n\n\t// Distortions for linear interpolation:\n\tint DistortX[cChunkDef::Width + 1][cChunkDef::Width + 1];\n\tint DistortZ[cChunkDef::Width + 1][cChunkDef::Width + 1];\n\tfor (int x = 0; x <= 4; x++) for (int z = 0; z <= 4; z++)\n\t{\n\t\tfloat BlockX = static_cast<float>(BaseX + x * 4);\n\t\tfloat BlockZ = static_cast<float>(BaseZ + z * 4);\n\t\tdouble NoiseX = m_AmpX1 * m_Noise1.CubicNoise2D(BlockX * m_FreqX1, BlockZ * m_FreqX1);\n\t\tNoiseX       += m_AmpX2 * m_Noise2.CubicNoise2D(BlockX * m_FreqX2, BlockZ * m_FreqX2);\n\t\tNoiseX       += m_AmpX3 * m_Noise3.CubicNoise2D(BlockX * m_FreqX3, BlockZ * m_FreqX3);\n\t\tdouble NoiseZ = m_AmpZ1 * m_Noise4.CubicNoise2D(BlockX * m_FreqZ1, BlockZ * m_FreqZ1);\n\t\tNoiseZ       += m_AmpZ2 * m_Noise5.CubicNoise2D(BlockX * m_FreqZ2, BlockZ * m_FreqZ2);\n\t\tNoiseZ       += m_AmpZ3 * m_Noise6.CubicNoise2D(BlockX * m_FreqZ3, BlockZ * m_FreqZ3);\n\n\t\tDistortX[4 * x][4 * z] = static_cast<int>(BlockX + NoiseX);\n\t\tDistortZ[4 * x][4 * z] = static_cast<int>(BlockZ + NoiseZ);\n\t}\n\n\tLinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortX[0][0]);\n\tLinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortZ[0][0]);\n\n\t// Apply distortion to each block coord, then query the voronoi maps for biome group and biome index and choose biome based on that:\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint SeedX, SeedZ, MinDist2;\n\t\t\tint BiomeGroup = m_VoronoiLarge.GetValueAt(DistortX[x][z], DistortZ[x][z], SeedX, SeedZ, MinDist2) / 7;\n\t\t\tsize_t BiomeIdx   = static_cast<size_t>(m_VoronoiSmall.GetValueAt(DistortX[x][z], DistortZ[x][z], SeedX, SeedZ, MinDist2) / 11);\n\t\t\tint MinDist1 = (DistortX[x][z] - SeedX) * (DistortX[x][z] - SeedX) + (DistortZ[x][z] - SeedZ) * (DistortZ[x][z] - SeedZ);\n\t\t\tcChunkDef::SetBiome(a_BiomeMap, x, z, SelectBiome(BiomeGroup, BiomeIdx, (MinDist1 < MinDist2 / 4) ? 1 : 0));\n\t\t}\n\t}\n}\n\n\n\n\n\nEMCSBiome cBioGenTwoLevel::SelectBiome(int a_BiomeGroup, size_t a_BiomeIdx, int a_DistLevel)\n{\n\t// TODO: Move this into settings\n\tstruct BiomeLevels\n\t{\n\t\tEMCSBiome InnerBiome;\n\t\tEMCSBiome OuterBiome;\n\t} ;\n\n\tstatic BiomeLevels bgOceanBlocks[] =\n\t{\n\t\t{ biOcean, biOcean, },\n\t\t{ biOcean, biOcean, },\n\t\t{ biOcean, biOcean, },\n\t\t{ biOcean, biOcean, },\n\t\t{ biOcean, biDeepOcean, },\n\t\t{ biOcean, biDeepOcean, },\n\t\t{ biDeepOcean, biDeepOcean, },\n\t\t{ biDeepOcean, biDeepOcean, },\n\t\t{ biDeepOcean, biDeepOcean, },\n\t\t{ biDeepOcean, biDeepOcean, },\n\t\t{ biMushroomIsland, biMushroomShore, }\n\t} ;\n\tstatic BiomeLevels bgFrozenBlocks[] =\n\t{\n\t\t{ biIcePlains,         biIcePlains, },\n\t\t{ biIceMountains,      biIceMountains, },\n\t\t{ biFrozenOcean,       biFrozenRiver, },\n\t\t{ biColdTaiga,         biColdTaiga, },\n\t\t{ biColdTaigaHills,    biColdTaigaHills, },\n\t\t{ biColdTaigaM,        biColdTaigaM, },\n\t\t{ biIcePlainsSpikes,   biIcePlainsSpikes, },\n\t\t{ biExtremeHills,      biExtremeHillsEdge, },\n\t\t{ biExtremeHillsPlus,  biExtremeHillsEdge, },\n\t\t{ biExtremeHillsPlusM, biExtremeHillsPlusM, },\n\t} ;\n\tstatic BiomeLevels bgTemperateBlocks[] =\n\t{\n\t\t{ biBirchForestHills,  biBirchForest, },\n\t\t{ biBirchForest,       biBirchForest, },\n\t\t{ biBirchForestHillsM, biBirchForestM, },\n\t\t{ biBirchForestM,      biBirchForestM, },\n\t\t{ biForest,            biForestHills, },\n\t\t{ biFlowerForest,      biFlowerForest, },\n\t\t{ biRoofedForest,      biForest, },\n\t\t{ biRoofedForest,      biRoofedForest, },\n\t\t{ biRoofedForestM,     biForest, },\n\t\t{ biPlains,            biPlains, },\n\t\t{ biSunflowerPlains,   biSunflowerPlains, },\n\t\t{ biSwampland,         biSwampland, },\n\t\t{ biSwamplandM,        biSwamplandM, },\n\t} ;\n\tstatic BiomeLevels bgWarmBlocks[] =\n\t{\n\t\t{ biDesertHills,    biDesert, },\n\t\t{ biDesert,         biDesert, },\n\t\t{ biDesertM,        biDesertM, },\n\t\t{ biSavannaPlateau, biSavanna, },\n\t\t{ biSavanna,        biSavanna, },\n\t\t{ biSavannaM,       biSavannaM, },\n\t} ;\n\tstatic BiomeLevels bgMesaBlocks[] =\n\t{\n\t\t{ biMesaPlateau,    biMesa, },\n\t\t{ biMesaPlateauF,   biMesa, },\n\t\t{ biMesaPlateauFM,  biMesa, },\n\t\t{ biMesaPlateauM,   biMesa, },\n\t\t{ biMesaBryce,      biMesaBryce, },\n\t\t{ biSavanna,        biSavanna, },\n\t\t{ biSavannaPlateau, biSavanna, },\n\t} ;\n\tstatic BiomeLevels bgConifersBlocks[] =\n\t{\n\t\t{ biTaiga,                biTaiga, },\n\t\t{ biTaigaM,               biTaigaM, },\n\t\t{ biMegaTaiga,            biMegaTaiga, },\n\t\t{ biMegaSpruceTaiga,      biMegaSpruceTaiga, },\n\t\t{ biMegaSpruceTaigaHills, biMegaSpruceTaiga, }\n\t} ;\n\tstatic BiomeLevels bgDenseTreesBlocks[] =\n\t{\n\t\t{ biJungleHills, biJungle, },\n\t\t{ biJungle, biJungleEdge, },\n\t\t{ biJungleM, biJungleEdgeM, },\n\t} ;\n\tstatic struct\n\t{\n\t\tBiomeLevels * Biomes;\n\t\tsize_t        Count;\n\t} BiomeGroups[] =\n\t{\n\t\t{ bgOceanBlocks,      ARRAYCOUNT(bgOceanBlocks), },\n\t\t{ bgOceanBlocks,      ARRAYCOUNT(bgOceanBlocks), },\n\t\t{ bgFrozenBlocks,     ARRAYCOUNT(bgFrozenBlocks), },\n\t\t{ bgFrozenBlocks,     ARRAYCOUNT(bgFrozenBlocks), },\n\t\t{ bgTemperateBlocks,  ARRAYCOUNT(bgTemperateBlocks), },\n\t\t{ bgTemperateBlocks,  ARRAYCOUNT(bgTemperateBlocks), },\n\t\t{ bgConifersBlocks,   ARRAYCOUNT(bgConifersBlocks), },\n\t\t{ bgConifersBlocks,   ARRAYCOUNT(bgConifersBlocks), },\n\t\t{ bgWarmBlocks,       ARRAYCOUNT(bgWarmBlocks), },\n\t\t{ bgWarmBlocks,       ARRAYCOUNT(bgWarmBlocks), },\n\t\t{ bgMesaBlocks,       ARRAYCOUNT(bgMesaBlocks), },\n\t\t{ bgDenseTreesBlocks, ARRAYCOUNT(bgDenseTreesBlocks), },\n\t} ;\n\tsize_t Group = static_cast<size_t>(a_BiomeGroup) % ARRAYCOUNT(BiomeGroups);\n\tsize_t Index = a_BiomeIdx % BiomeGroups[Group].Count;\n\treturn (a_DistLevel > 0) ? BiomeGroups[Group].Biomes[Index].InnerBiome : BiomeGroups[Group].Biomes[Index].OuterBiome;\n}\n\n\n\n\n\nvoid cBioGenTwoLevel::InitializeBiomeGen(cIniFile & a_IniFile)\n{\n\tm_VoronoiLarge.SetCellSize(a_IniFile.GetValueSetI(\"Generator\", \"TwoLevelLargeCellSize\", 1024));\n\tm_VoronoiSmall.SetCellSize(a_IniFile.GetValueSetI(\"Generator\", \"TwoLevelSmallCellSize\", 128));\n\tm_FreqX1 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortXOctave1Freq\", 0.01));\n\tm_AmpX1  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortXOctave1Amp\",  80));\n\tm_FreqX2 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortXOctave2Freq\", 0.05));\n\tm_AmpX2  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortXOctave2Amp\",  20));\n\tm_FreqX3 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortXOctave3Freq\", 0.1));\n\tm_AmpX3  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortXOctave3Amp\",  8));\n\tm_FreqZ1 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortZOctave1Freq\", 0.01));\n\tm_AmpZ1  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortZOctave1Amp\",  80));\n\tm_FreqZ2 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortZOctave2Freq\", 0.05));\n\tm_AmpZ2  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortZOctave2Amp\",  20));\n\tm_FreqZ3 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortZOctave3Freq\", 0.1));\n\tm_AmpZ3  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"TwoLevelDistortZOctave3Amp\",  8));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenGrown:\n\nclass cBioGenGrown:\n\tpublic cBiomeGen\n{\npublic:\n\tcBioGenGrown(int a_Seed)\n\t{\n\t\tauto FinalRivers =\n\n\t\t\tstd::make_shared<cIntGenChoice<2, 7>>(a_Seed + 12)\n\t\t\t| MakeIntGen<cIntGenZoom  <10>>(a_Seed + 11)\n\t\t\t| MakeIntGen<cIntGenSmooth<8>>(a_Seed + 6)\n\t\t\t| MakeIntGen<cIntGenSmooth<6>>(a_Seed + 5)\n\t\t\t| MakeIntGen<cIntGenZoom  <8>>(a_Seed + 10)\n\t\t\t| MakeIntGen<cIntGenSmooth<6>>(a_Seed + 5)\n\t\t\t| MakeIntGen<cIntGenZoom  <8>>(a_Seed + 9)\n\t\t\t| MakeIntGen<cIntGenSmooth<6>>(a_Seed + 5)\n\t\t\t| MakeIntGen<cIntGenZoom  <8>>(a_Seed + 8)\n\t\t\t| MakeIntGen<cIntGenSmooth<6>>(a_Seed + 5)\n\t\t\t| MakeIntGen<cIntGenZoom  <9>>(a_Seed + 4)\n\t\t\t| MakeIntGen<cIntGenRiver <7>>(a_Seed + 3)\n\t\t\t| MakeIntGen<cIntGenZoom  <10>>(a_Seed + 2)\n\t\t\t| MakeIntGen<cIntGenSmooth<8>>(a_Seed + 1);\n\n\t\tauto alteration =\n\t\t\tstd::make_shared<cIntGenZoom     <8>>(a_Seed,\n\t\t\tstd::make_shared<cIntGenLandOcean<6>>(a_Seed, 20\n\t\t));\n\n\t\tauto alteration2 =\n\t\t\tstd::make_shared<cIntGenZoom     <8>>(a_Seed + 1,\n\t\t\tstd::make_shared<cIntGenZoom     <6>>(a_Seed + 2,\n\t\t\tstd::make_shared<cIntGenZoom     <5>>(a_Seed + 1,\n\t\t\tstd::make_shared<cIntGenZoom     <4>>(a_Seed + 2,\n\t\t\tstd::make_shared<cIntGenLandOcean<4>>(a_Seed + 1, 10\n\t\t)))));\n\n\t\tauto FinalBiomes =\n\t\t\tstd::make_shared<cIntGenSmooth         <8>> (a_Seed + 1,\n\t\t\tstd::make_shared<cIntGenZoom           <10>>(a_Seed + 15,\n\t\t\tstd::make_shared<cIntGenSmooth         <7>> (a_Seed + 1,\n\t\t\tstd::make_shared<cIntGenZoom           <9>> (a_Seed + 16,\n\t\t\tstd::make_shared<cIntGenBeaches        <6>> (\n\t\t\tstd::make_shared<cIntGenZoom           <8>> (a_Seed + 1,\n\t\t\tstd::make_shared<cIntGenAddIslands     <6>> (a_Seed + 2004, 10,\n\t\t\tstd::make_shared<cIntGenAddToOcean     <6>> (a_Seed + 10, 500, biDeepOcean,\n\t\t\tstd::make_shared<cIntGenReplaceRandomly<8>> (a_Seed + 1, biPlains, biSunflowerPlains, 20,\n\t\t\tstd::make_shared<cIntGenMBiomes        <8>> (a_Seed + 5, alteration2,\n\t\t\tstd::make_shared<cIntGenAlternateBiomes<8>> (a_Seed + 1, alteration,\n\t\t\tstd::make_shared<cIntGenBiomeEdges     <8>> (a_Seed + 3,\n\t\t\tstd::make_shared<cIntGenZoom           <10>>(a_Seed + 2,\n\t\t\tstd::make_shared<cIntGenZoom           <7>> (a_Seed + 4,\n\t\t\tstd::make_shared<cIntGenReplaceRandomly<5>> (a_Seed + 99, biIcePlains, biIcePlainsSpikes, 50,\n\t\t\tstd::make_shared<cIntGenZoom           <5>> (a_Seed + 8,\n\t\t\tstd::make_shared<cIntGenAddToOcean     <4>> (a_Seed + 10, 300, biDeepOcean,\n\t\t\tstd::make_shared<cIntGenAddToOcean     <6>> (a_Seed + 9, 8, biMushroomIsland,\n\t\t\tstd::make_shared<cIntGenBiomes         <8>> (a_Seed + 3000,\n\t\t\tstd::make_shared<cIntGenAddIslands     <8>> (a_Seed + 2000, 200,\n\t\t\tstd::make_shared<cIntGenZoom           <8>> (a_Seed + 5,\n\t\t\tstd::make_shared<cIntGenRareBiomeGroups<6>> (a_Seed + 5, 50,\n\t\t\tstd::make_shared<cIntGenBiomeGroupEdges<6>> (\n\t\t\tstd::make_shared<cIntGenAddIslands     <8>> (a_Seed + 2000, 200,\n\t\t\tstd::make_shared<cIntGenZoom           <8>> (a_Seed + 7,\n\t\t\tstd::make_shared<cIntGenSetRandomly    <6>> (a_Seed + 8, 50, bgOcean,\n\t\t\tstd::make_shared<cIntGenReplaceRandomly<6>> (a_Seed + 101, bgIce, bgTemperate, 150,\n\t\t\tstd::make_shared<cIntGenAddIslands     <6>> (a_Seed + 2000, 200,\n\t\t\tstd::make_shared<cIntGenSetRandomly    <6>> (a_Seed + 9, 50, bgOcean,\n\t\t\tstd::make_shared<cIntGenLandOcean      <5>> (a_Seed + 100, 30)\n\t\t\t| MakeIntGen<cIntGenZoom           <6>> (a_Seed + 10)\n\t\t)))))))))))))))))))))))))))));\n\n\t\tm_Gen =\n\t\t\tstd::make_shared<cIntGenSmooth   <16>>(a_Seed,\n\t\t\tstd::make_shared<cIntGenZoom     <18>>(a_Seed,\n\t\t\tstd::make_shared<cIntGenSmooth   <11>>(a_Seed,\n\t\t\tstd::make_shared<cIntGenZoom     <13>>(a_Seed,\n\t\t\tstd::make_shared<cIntGenMixRivers<8>> (\n\t\t\tFinalBiomes, FinalRivers\n\t\t)))));\n\t}\n\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_Biomes) override\n\t{\n\t\tcIntGen<16, 16>::Values vals;\n\t\tm_Gen->GetInts(a_ChunkCoords.m_ChunkX * cChunkDef::Width, a_ChunkCoords.m_ChunkZ * cChunkDef::Width, vals);\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\tcChunkDef::SetBiome(a_Biomes, x, z, static_cast<EMCSBiome>(vals[x + cChunkDef::Width * z]));\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tstd::shared_ptr<cIntGen<16, 16>> m_Gen;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBioGenProtGrown:\n\nclass cBioGenProtGrown:\n\tpublic cBiomeGen\n{\npublic:\n\tcBioGenProtGrown(int a_Seed)\n\t{\n\t\tauto FinalRivers =\n\t\t\tstd::make_shared<cProtIntGenSmooth>(a_Seed + 1,\n\t\t\tstd::make_shared<cProtIntGenZoom  >(a_Seed + 2,\n\t\t\tstd::make_shared<cProtIntGenRiver >(a_Seed + 3,\n\t\t\tstd::make_shared<cProtIntGenZoom  >(a_Seed + 4,\n\t\t\tstd::make_shared<cProtIntGenSmooth>(a_Seed + 5,\n\t\t\tstd::make_shared<cProtIntGenZoom  >(a_Seed + 8,\n\t\t\tstd::make_shared<cProtIntGenSmooth>(a_Seed + 5,\n\t\t\tstd::make_shared<cProtIntGenZoom  >(a_Seed + 9,\n\t\t\tstd::make_shared<cProtIntGenSmooth>(a_Seed + 5,\n\t\t\tstd::make_shared<cProtIntGenZoom  >(a_Seed + 10,\n\t\t\tstd::make_shared<cProtIntGenSmooth>(a_Seed + 5,\n\t\t\tstd::make_shared<cProtIntGenSmooth>(a_Seed + 6,\n\t\t\tstd::make_shared<cProtIntGenZoom  >(a_Seed + 11,\n\t\t\tstd::make_shared<cProtIntGenChoice>(a_Seed + 12, 2\n\t\t))))))))))))));\n\n\t\tauto alteration =\n\t\t\tstd::make_shared<cProtIntGenZoom     >(a_Seed,\n\t\t\tstd::make_shared<cProtIntGenLandOcean>(a_Seed, 20\n\t\t));\n\n\t\tauto alteration2 =\n\t\t\tstd::make_shared<cProtIntGenZoom     >(a_Seed + 1,\n\t\t\tstd::make_shared<cProtIntGenZoom     >(a_Seed + 2,\n\t\t\tstd::make_shared<cProtIntGenZoom     >(a_Seed + 1,\n\t\t\tstd::make_shared<cProtIntGenZoom     >(a_Seed + 2,\n\t\t\tstd::make_shared<cProtIntGenLandOcean>(a_Seed + 1, 10\n\t\t)))));\n\n\t\tauto FinalBiomes =\n\t\t\tstd::make_shared<cProtIntGenSmooth         >(a_Seed + 1,\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 15,\n\t\t\tstd::make_shared<cProtIntGenSmooth         >(a_Seed + 1,\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 16,\n\t\t\tstd::make_shared<cProtIntGenBeaches        >(\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 1,\n\t\t\tstd::make_shared<cProtIntGenAddIslands     >(a_Seed + 2004, 10,\n\t\t\tstd::make_shared<cProtIntGenAddToOcean     >(a_Seed + 10, 500, biDeepOcean,\n\t\t\tstd::make_shared<cProtIntGenReplaceRandomly>(a_Seed + 1, biPlains, biSunflowerPlains, 20,\n\t\t\tstd::make_shared<cProtIntGenMBiomes        >(a_Seed + 5, alteration2,\n\t\t\tstd::make_shared<cProtIntGenAlternateBiomes>(a_Seed + 1, alteration,\n\t\t\tstd::make_shared<cProtIntGenBiomeEdges     >(a_Seed + 3,\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 2,\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 4,\n\t\t\tstd::make_shared<cProtIntGenReplaceRandomly>(a_Seed + 99, biIcePlains, biIcePlainsSpikes, 50,\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 8,\n\t\t\tstd::make_shared<cProtIntGenAddToOcean     >(a_Seed + 10, 300, biDeepOcean,\n\t\t\tstd::make_shared<cProtIntGenAddToOcean     >(a_Seed + 9, 8, biMushroomIsland,\n\t\t\tstd::make_shared<cProtIntGenBiomes         >(a_Seed + 3000,\n\t\t\tstd::make_shared<cProtIntGenAddIslands     >(a_Seed + 2000, 200,\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 5,\n\t\t\tstd::make_shared<cProtIntGenRareBiomeGroups>(a_Seed + 5, 50,\n\t\t\tstd::make_shared<cProtIntGenBiomeGroupEdges>(\n\t\t\tstd::make_shared<cProtIntGenAddIslands     >(a_Seed + 2000, 200,\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 7,\n\t\t\tstd::make_shared<cProtIntGenSetRandomly    >(a_Seed + 8, 50, bgOcean,\n\t\t\tstd::make_shared<cProtIntGenReplaceRandomly>(a_Seed + 101, bgIce, bgTemperate, 150,\n\t\t\tstd::make_shared<cProtIntGenAddIslands     >(a_Seed + 2000, 200,\n\t\t\tstd::make_shared<cProtIntGenSetRandomly    >(a_Seed + 9, 50, bgOcean,\n\t\t\tstd::make_shared<cProtIntGenZoom           >(a_Seed + 10,\n\t\t\tstd::make_shared<cProtIntGenLandOcean      >(a_Seed + 100, 30\n\t\t)))))))))))))))))))))))))))))));\n\n\t\tm_Gen =\n\t\t\tstd::make_shared<cProtIntGenSmooth   >(a_Seed,\n\t\t\tstd::make_shared<cProtIntGenZoom     >(a_Seed,\n\t\t\tstd::make_shared<cProtIntGenSmooth   >(a_Seed,\n\t\t\tstd::make_shared<cProtIntGenZoom     >(a_Seed,\n\t\t\tstd::make_shared<cProtIntGenMixRivers>(\n\t\t\tFinalBiomes, FinalRivers\n\t\t)))));\n\t}\n\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_Biomes) override\n\t{\n\t\tint vals[16 * 16];\n\t\tm_Gen->GetInts(a_ChunkCoords.m_ChunkX * cChunkDef::Width, a_ChunkCoords.m_ChunkZ * cChunkDef::Width, 16, 16, vals);\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\tcChunkDef::SetBiome(a_Biomes, x, z, static_cast<EMCSBiome>(vals[x + cChunkDef::Width * z]));\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tstd::shared_ptr<cProtIntGen> m_Gen;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBiomeGen:\n\nstd::unique_ptr<cBiomeGen> cBiomeGen::CreateBiomeGen(cIniFile & a_IniFile, int a_Seed, bool & a_CacheOffByDefault)\n{\n\tAString BiomeGenName = a_IniFile.GetValue(\"Generator\", \"BiomeGen\");\n\tif (BiomeGenName.empty())\n\t{\n\t\tLOGWARN(\"[Generator] BiomeGen value not set in world.ini, using \\\"Grown\\\".\");\n\t\tBiomeGenName = \"Grown\";\n\t}\n\n\tstd::unique_ptr<cBiomeGen> res;\n\ta_CacheOffByDefault = false;\n\tif (NoCaseCompare(BiomeGenName, \"constant\") == 0)\n\t{\n\t\tres = std::make_unique<cBioGenConstant>();\n\t\ta_CacheOffByDefault = true;  // we're generating faster than a cache would retrieve data :)\n\t}\n\telse if (NoCaseCompare(BiomeGenName, \"checkerboard\") == 0)\n\t{\n\t\tres = std::make_unique<cBioGenCheckerboard>();\n\t\ta_CacheOffByDefault = true;  // we're (probably) generating faster than a cache would retrieve data\n\t}\n\telse if (NoCaseCompare(BiomeGenName, \"voronoi\") == 0)\n\t{\n\t\tres = std::make_unique<cBioGenVoronoi>(a_Seed);\n\t}\n\telse if (NoCaseCompare(BiomeGenName, \"distortedvoronoi\") == 0)\n\t{\n\t\tres = std::make_unique<cBioGenDistortedVoronoi>(a_Seed);\n\t}\n\telse if (NoCaseCompare(BiomeGenName, \"twolevel\") == 0)\n\t{\n\t\tres = std::make_unique<cBioGenTwoLevel>(a_Seed);\n\t}\n\telse if (NoCaseCompare(BiomeGenName, \"multistepmap\") == 0)\n\t{\n\t\tres = std::make_unique<cBioGenMultiStepMap>(a_Seed);\n\t}\n\telse if (NoCaseCompare(BiomeGenName, \"grownprot\") == 0)\n\t{\n\t\tres = std::make_unique<cBioGenProtGrown>(a_Seed);\n\t}\n\telse\n\t{\n\t\tif (NoCaseCompare(BiomeGenName, \"grown\") != 0)\n\t\t{\n\t\t\tLOGWARNING(\"Unknown BiomeGen \\\"%s\\\", using \\\"Grown\\\" instead.\", BiomeGenName.c_str());\n\t\t}\n\t\tres = std::make_unique<cBioGenGrown>(a_Seed);\n\t}\n\tres->InitializeBiomeGen(a_IniFile);\n\n\treturn res;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Performance tests:\n\n// Change to 1 to enable the perf test:\n#if 0\n\n#include <iostream>\n\nclass cBioGenPerfTest\n{\npublic:\n\tcBioGenPerfTest()\n\t{\n\t\tstd::cout << \"BioGen performance tests commencing, please wait...\" << std::endl;\n\t\tTestGen(\"MultiStepMap\", std::make_unique<cBioGenMultiStepMap>(1).get());\n\t\tTestGen(\"Grown\",        std::make_unique<cBioGenGrown>(1).get());\n\t\tTestGen(\"GrownProt\",    std::make_unique<cBioGenProtGrown>(1).get());\n\t\tstd::cout << \"BioGen performance tests complete.\" << std::endl;\n\t}\n\nprotected:\n\tvoid TestGen(const AString && a_GenName, cBiomeGen * a_BioGen)\n\t{\n\t\t// Initialize the default settings for the generator:\n\t\tcIniFile iniFile;\n\t\ta_BioGen->InitializeBiomeGen(iniFile);\n\n\t\t// Generate the biomes:\n\t\tauto start = std::chrono::system_clock::now();\n\t\tfor (int z = 0; z < 100; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < 100; x++)\n\t\t\t{\n\t\t\t\tcChunkDef::BiomeMap biomes;\n\t\t\t\ta_BioGen->GenBiomes(x, z, biomes);\n\t\t\t}  // for x\n\t\t}  // for z\n\t\tauto dur = std::chrono::system_clock::now() - start;\n\t\tdouble milliseconds = static_cast<double>((std::chrono::duration_cast<std::chrono::milliseconds>(dur)).count());\n\n\t\tstd::cout << a_GenName << \": \" << 1000.0 * 100.0 * 100.0 / milliseconds << \" chunks per second\" << std::endl;\n\t}\n} g_BioGenPerfTest;\n\n#endif\n"
  },
  {
    "path": "src/Generating/BioGen.h",
    "content": "\n// BioGen.h\n\n/*\nInterfaces to the various biome generators:\n\t- cBioGenConstant\n\t- cBioGenCheckerboard\n\t- cBioGenDistortedVoronoi\n*/\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Noise/Noise.h\"\n#include \"../VoronoiMap.h\"\n\n\n\n\n\nclass cBioGenConstant :\n\tpublic cBiomeGen\n{\npublic:\n\tcBioGenConstant(void) : m_Biome(biPlains) {}\n\nprotected:\n\n\tEMCSBiome m_Biome;\n\n\t// cBiomeGen overrides:\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\n/** A simple cache that stores N most recently generated chunks' biomes; N being settable upon creation */\nclass cBioGenCache:\n\tpublic cBiomeGen\n{\n\tusing Super = cBiomeGen;\n\npublic:\n\n\tcBioGenCache(cBiomeGen & a_BioGenToCache, size_t a_CacheSize);\n\nprotected:\n\n\tfriend class cBioGenMulticache;\n\n\tcBiomeGen & m_BioGenToCache;\n\n\tstruct sCacheData\n\t{\n\t\tcChunkCoords m_Coords;\n\t\tcChunkDef::BiomeMap m_BiomeMap;\n\n\t\t/** Default constructor: Fill in bogus coords so that the item is not used in the cache until properly calculated. */\n\t\tsCacheData():\n\t\t\tm_Coords(0x7fffffff, 0x7fffffff)\n\t\t{\n\t\t}\n\t} ;\n\n\t// To avoid moving large amounts of data for the MRU behavior, we MRU-ize indices to an array of the actual data\n\tsize_t                  m_CacheSize;\n\tstd::vector<size_t>     m_CacheOrder;  // MRU-ized order, indices into m_CacheData array\n\tstd::vector<sCacheData> m_CacheData;   // m_CacheData[m_CacheOrder[0]] is the most recently used\n\n\t// Cache statistics\n\tsize_t m_NumHits;\n\tsize_t m_NumMisses;\n\tsize_t m_TotalChain;  // Number of cache items walked to get to a hit (only added for hits)\n\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\nclass cBioGenMulticache:\n\tpublic cBiomeGen\n{\n\tusing Super = cBiomeGen;\n\npublic:\n\t/* Creates a new multicache - a cache that divides the caching into several sub-caches based on the chunk coords.\n\tThis allows us to use shorter cache depths with faster lookups for more covered area. (#381)\n\ta_SubCacheSize defines the size of each sub-cache\n\ta_NumSubCaches defines how many sub-caches are used for the multicache. */\n\tcBioGenMulticache(std::unique_ptr<cBiomeGen> a_BioGenToCache, size_t a_SubCacheSize, size_t a_NumSubCaches);\n\nprotected:\n\n\t/** Number of sub-caches. Pulled out of m_Caches.size() for faster access. */\n\tsize_t m_NumSubCaches;\n\n\t/** Individual sub-caches. */\n\tstd::vector<std::unique_ptr<cBioGenCache>> m_Caches;\n\n\t/** The underlying biome generator. */\n\tstd::unique_ptr<cBiomeGen> m_Underlying;\n\n\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) override;\n};\n\n\n\n\n\n/** Base class for generators that use a list of available biomes. This class takes care of the list. */\nclass cBiomeGenList:\n\tpublic cBiomeGen\n{\n\tusing Super = cBiomeGen;\n\nprotected:\n\n\t// List of biomes that the generator is allowed to generate:\n\ttypedef std::vector<EMCSBiome> EMCSBiomes;\n\tEMCSBiomes m_Biomes;\n\tint        m_BiomesCount;  // Pulled out of m_Biomes for faster access\n\n\t/** Parses the INI file setting string into m_Biomes. */\n\tvoid InitializeBiomes(const AString & a_Biomes);\n} ;\n\n\n\n\n\nclass cBioGenCheckerboard:\n\tpublic cBiomeGenList\n{\n\tusing Super = cBiomeGenList;\n\nprotected:\n\n\tint m_BiomeSize;\n\n\t// cBiomeGen overrides:\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\nclass cBioGenVoronoi:\n\tpublic cBiomeGenList\n{\n\tusing Super = cBiomeGenList;\n\npublic:\n\n\tcBioGenVoronoi(int a_Seed) :\n\t\tm_Voronoi(a_Seed)\n\t{\n\t}\n\nprotected:\n\n\tcVoronoiMap m_Voronoi;\n\n\t// cBiomeGen overrides:\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) override;\n\n\tEMCSBiome VoronoiBiome(int a_BlockX, int a_BlockZ);\n} ;\n\n\n\n\n\nclass cBioGenDistortedVoronoi:\n\tpublic cBiomeGenList\n{\n\tusing Super = cBiomeGenList;\n\npublic:\n\n\tcBioGenDistortedVoronoi(int a_Seed):\n\t\tm_Noise(a_Seed),\n\t\tm_Voronoi(a_Seed),\n\t\tm_CellSize(0)\n\t{\n\t}\n\nprotected:\n\t/** Noise used for the distortion */\n\tcNoise m_Noise;\n\n\t/** The underlying Voronoi map of the biomes */\n\tcVoronoiMap m_Voronoi;\n\n\t/** Size of the Voronoi cells, also used for distortion amplitude */\n\tint m_CellSize;\n\n\t// cBiomeGen overrides:\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) override;\n\n\t/** Distorts the coords using a Perlin-like noise */\n\tvoid Distort(int a_BlockX, int a_BlockZ, int & a_DistortedX, int & a_DistortedZ);\n} ;\n\n\n\n\n\nclass cBioGenMultiStepMap:\n\tpublic cBiomeGen\n{\n\tusing Super = cBiomeGen;\n\npublic:\n\n\tcBioGenMultiStepMap(int a_Seed);\n\nprotected:\n\t// Noises used for composing the perlin-noise:\n\tcNoise m_Noise1;\n\tcNoise m_Noise2;\n\tcNoise m_Noise3;\n\tcNoise m_Noise4;\n\tcNoise m_Noise5;\n\tcNoise m_Noise6;\n\n\tint    m_Seed;\n\tint    m_OceanCellSize;\n\tint    m_MushroomIslandSize;\n\tint    m_RiverCellSize;\n\tdouble m_RiverWidthThreshold;\n\tfloat  m_LandBiomesSize;\n\n\ttypedef int    IntMap[17 * 17];  // x + 17 * z, expected trimmed into [0..255] range\n\ttypedef double DblMap[17 * 17];  // x + 17 * z, expected trimmed into [0..1] range\n\n\t// cBiomeGen overrides:\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) override;\n\n\t/** Step 1: Decides between ocean, land and mushroom, using a DistVoronoi with special conditions and post-processing for mushroom islands\n\tSets biomes to biOcean, -1 (i.e. land), biMushroomIsland or biMushroomShore. */\n\tvoid DecideOceanLandMushroom(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap);\n\n\t/** Step 2: Add rivers to the land\n\tFlips some \"-1\" biomes into biRiver. */\n\tvoid AddRivers(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap);\n\n\t/** Step 3: Decide land biomes using a temperature / humidity map; freeze ocean / river in low temperatures.\n\tFlips all remaining \"-1\" biomes into land biomes. Also flips some biOcean and biRiver into biFrozenOcean, biFrozenRiver, based on temp map. */\n\tvoid ApplyTemperatureHumidity(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap);\n\n\t/** Distorts the coords using a Perlin-like noise, with a specified cell-size */\n\tvoid Distort(int a_BlockX, int a_BlockZ, int & a_DistortedX, int & a_DistortedZ, int a_CellSize);\n\n\t/** Builds two Perlin-noise maps, one for temperature, the other for humidity. Trims both into [0..255] range */\n\tvoid BuildTemperatureHumidityMaps(cChunkCoords a_ChunkCoords, IntMap & a_TemperatureMap, IntMap & a_HumidityMap);\n\n\t/** Flips all remaining \"-1\" biomes into land biomes using the two maps */\n\tvoid DecideLandBiomes(cChunkDef::BiomeMap & a_BiomeMap, const IntMap & a_TemperatureMap, const IntMap & a_HumidityMap);\n\n\t/** Flips biOcean and biRiver into biFrozenOcean and biFrozenRiver if the temperature is too low */\n\tvoid FreezeWaterBiomes(cChunkDef::BiomeMap & a_BiomeMap, const IntMap & a_TemperatureMap);\n} ;\n\n\n\n\n\nclass cBioGenTwoLevel:\n\tpublic cBiomeGen\n{\n\tusing Super = cBiomeGen;\n\npublic:\n\n\tcBioGenTwoLevel(int a_Seed);\n\nprotected:\n\t/** The Voronoi map that decides the groups of biomes */\n\tcVoronoiMap m_VoronoiLarge;\n\n\t/** The Voronoi map that decides biomes inside individual biome groups */\n\tcVoronoiMap m_VoronoiSmall;\n\n\t// The noises used for the distortion:\n\tcNoise m_Noise1;\n\tcNoise m_Noise2;\n\tcNoise m_Noise3;\n\tcNoise m_Noise4;\n\tcNoise m_Noise5;\n\tcNoise m_Noise6;\n\n\t// Frequencies and amplitudes for the distortion noises:\n\tfloat m_FreqX1, m_AmpX1;\n\tfloat m_FreqX2, m_AmpX2;\n\tfloat m_FreqX3, m_AmpX3;\n\tfloat m_FreqZ1, m_AmpZ1;\n\tfloat m_FreqZ2, m_AmpZ2;\n\tfloat m_FreqZ3, m_AmpZ3;\n\n\n\t// cBiomeGen overrides:\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) override;\n\n\t/** Selects biome from the specified biome group, based on the specified index.\n\tNote that both params may overflow\n\ta_DistLevel is either 0 or 1; zero when it is at the edge of the small Voronoi cell, 1 near the center */\n\tEMCSBiome SelectBiome(int a_BiomeGroup, size_t a_BiomeIdx, int a_DistLevel);\n} ;\n"
  },
  {
    "path": "src/Generating/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tBioGen.cpp\n\tCaves.cpp\n\tChunkDesc.cpp\n\tChunkGenerator.cpp\n\tCompoGen.cpp\n\tCompoGenBiomal.cpp\n\tComposableGenerator.cpp\n\tDistortedHeightmap.cpp\n\tDungeonRoomsFinisher.cpp\n\tEndGen.cpp\n\tEnderDragonFightStructuresGen.cpp\n\tFinishGen.cpp\n\tGridStructGen.cpp\n\tHeiGen.cpp\n\tMineShafts.cpp\n\tNoise3DGenerator.cpp\n\tPieceGeneratorBFSTree.cpp\n\tPieceModifier.cpp\n\tPiecePool.cpp\n\tPieceStructuresGen.cpp\n\tPrefab.cpp\n\tPrefabPiecePool.cpp\n\tPrefabStructure.cpp\n\tRavines.cpp\n\tRoughRavines.cpp\n\tSinglePieceStructuresGen.cpp\n\tStructGen.cpp\n\tTrees.cpp\n\tTwoHeights.cpp\n\tVerticalLimit.cpp\n\tVerticalStrategy.cpp\n\tVillageGen.cpp\n\n\tBioGen.h\n\tCaves.h\n\tChunkDesc.h\n\tChunkGenerator.h\n\tCompoGen.h\n\tCompoGenBiomal.h\n\tComposableGenerator.h\n\tCompositedHeiGen.h\n\tDistortedHeightmap.h\n\tDungeonRoomsFinisher.h\n\tEndGen.h\n\tEnderDragonFightStructuresGen.h\n\tFinishGen.h\n\tGridStructGen.h\n\tHeiGen.h\n\tIntGen.h\n\tMineShafts.h\n\tNoise3DGenerator.h\n\tPieceGeneratorBFSTree.h\n\tPieceModifier.h\n\tPiecePool.h\n\tPieceStructuresGen.h\n\tPrefab.h\n\tPrefabPiecePool.h\n\tPrefabStructure.h\n\tProtIntGen.h\n\tRavines.h\n\tRoughRavines.h\n\tShapeGen.cpp\n\tSinglePieceStructuresGen.h\n\tStructGen.h\n\tTrees.h\n\tTwoHeights.h\n\tVerticalLimit.h\n\tVerticalStrategy.h\n\tVillageGen.h\n)\n"
  },
  {
    "path": "src/Generating/Caves.cpp",
    "content": "\n// Caves.cpp\n\n// Implements the various cave structure generators:\n//   - cStructGenWormNestCaves\n//   - cStructGenDualRidgeCaves\n//   - cStructGenMarbleCaves\n//   - cStructGenNetherCaves\n\n/*\nWormNestCave generator:\nCaves are generated in \"nests\" - groups of tunnels generated from a single point.\nFor each chunk, all the nests that could intersect it are generated.\nFor each nest, first the schematic structure is generated (tunnel from ... to ..., branch, tunnel2 from ... to ...)\nThen each tunnel is randomized by inserting points in between its ends.\nFinally each tunnel is smoothed and Bresenham-3D-ed so that it is a collection of spheres with their centers next to each other.\nWhen the tunnels are ready, they are simply carved into the chunk, one by one.\nTo optimize, each tunnel keeps track of its bounding box, so that it can be skipped for chunks that don't intersect it.\n\nMarbleCaves generator:\nFor each voxel a 3D noise function is evaluated, if the value crosses a boundary, the voxel is dug out, otherwise it is kept.\nProblem with this is the amount of CPU work needed for each chunk.\nAlso the overall shape of the generated holes is unsatisfactory - there are whole \"sheets\" of holes in the ground.\n\nDualRidgeCaves generator:\nInstead of evaluating a single noise function, two different noise functions are multiplied. This produces\nregular tunnels instead of sheets. However due to the sheer amount of CPU work needed, the noise functions need to be\nreduced in complexity in order for this generator to be useful, so the caves' shapes are \"bubbly\" at best.\n*/\n\n#include \"Globals.h\"\n#include \"Caves.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\nconst int MIN_RADIUS = 3;\nconst int MAX_RADIUS = 8;\n\n\n\n\n\nstruct cCaveDefPoint\n{\n\tint m_BlockX;\n\tint m_BlockY;\n\tint m_BlockZ;\n\tint m_Radius;\n\n\tcCaveDefPoint(int a_BlockX, int a_BlockY, int a_BlockZ, int a_Radius) :\n\t\tm_BlockX(a_BlockX),\n\t\tm_BlockY(a_BlockY),\n\t\tm_BlockZ(a_BlockZ),\n\t\tm_Radius(a_Radius)\n\t{\n\t}\n} ;\n\ntypedef std::vector<cCaveDefPoint> cCaveDefPoints;\n\n\n\n\n\n/** A single non-branching tunnel of a WormNestCave */\nclass cCaveTunnel\n{\n\t// The bounding box, including the radii around defpoints:\n\tint m_MinBlockX, m_MaxBlockX;\n\tint m_MinBlockY, m_MaxBlockY;\n\tint m_MinBlockZ, m_MaxBlockZ;\n\n\t/** Generates the shaping defpoints for the cave, based on the cave block coords and noise */\n\tvoid Randomize(cNoise & a_Noise);\n\n\t/** Refines (adds and smooths) defpoints from a_Src into a_Dst; returns false if no refinement possible (segments too short) */\n\tbool RefineDefPoints(const cCaveDefPoints & a_Src, cCaveDefPoints & a_Dst);\n\n\t/** Does rounds of smoothing, two passes of RefineDefPoints(), as long as they return true */\n\tvoid Smooth(void);\n\n\t/** Linearly interpolates the points so that the maximum distance between two neighbors is max 1 block */\n\tvoid FinishLinear(void);\n\n\t/** Calculates the bounding box of the points present */\n\tvoid CalcBoundingBox(void);\n\npublic:\n\tcCaveDefPoints m_Points;\n\n\tcCaveTunnel(\n\t\tint a_BlockStartX, int a_BlockStartY, int a_BlockStartZ, int a_StartRadius,\n\t\tint a_BlockEndX,   int a_BlockEndY,   int a_BlockEndZ,   int a_EndRadius,\n\t\tcNoise & a_Noise\n\t);\n\n\t/** Carves the tunnel into the chunk specified */\n\tvoid ProcessChunk(\n\t\tint a_ChunkX, int a_ChunkZ,\n\t\tcChunkDef::BlockTypes & a_BlockTypes,\n\t\tcChunkDesc::BlockNibbleBytes & a_BlockMetas,\n\t\tcChunkDef::HeightMap & a_HeightMap\n\t);\n\n\t#ifndef NDEBUG\n\tAString ExportAsSVG(int a_Color, int a_OffsetX, int a_OffsetZ) const;\n\t#endif  // !NDEBUG\n} ;\n\ntypedef std::vector<cCaveTunnel *> cCaveTunnels;\n\n\n\n\n\n/** A collection of connected tunnels, possibly branching. */\nclass cStructGenWormNestCaves::cCaveSystem:\n\tpublic cGridStructGen::cStructure\n{\n\tusing Super = cGridStructGen::cStructure;\n\npublic:\n\n\t// The generating block position; is read directly in cStructGenWormNestCaves::GetCavesForChunk()\n\tint m_BlockX;\n\tint m_BlockZ;\n\n\tcCaveSystem(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ, int a_MaxOffset, int a_Size, cNoise & a_Noise);\n\tvirtual ~cCaveSystem() override;\n\nprotected:\n\tint m_Size;\n\tcCaveTunnels m_Tunnels;\n\n\tvoid Clear(void);\n\n\t/** Generates a_Segment successive tunnels, with possible branches. Generates the same output for the same [x, y, z, a_Segments] */\n\tvoid GenerateTunnelsFromPoint(\n\t\tint a_OriginX, int a_OriginY, int a_OriginZ,\n\t\tcNoise & a_Noise, int a_Segments\n\t);\n\n\t/** Returns a radius based on the location provided. */\n\tint GetRadius(cNoise & a_Noise, int a_OriginX, int a_OriginY, int a_OriginZ);\n\n\t// cGridStructGen::cStructure overrides:\n\tvirtual void DrawIntoChunk(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCaveTunnel:\n\ncCaveTunnel::cCaveTunnel(\n\tint a_BlockStartX, int a_BlockStartY, int a_BlockStartZ, int a_StartRadius,\n\tint a_BlockEndX,   int a_BlockEndY,   int a_BlockEndZ,   int a_EndRadius,\n\tcNoise & a_Noise\n)\n{\n\tm_Points.emplace_back(a_BlockStartX, a_BlockStartY, a_BlockStartZ, a_StartRadius);\n\tm_Points.emplace_back(a_BlockEndX,   a_BlockEndY,   a_BlockEndZ,   a_EndRadius);\n\n\tif ((a_BlockStartY <= 0) && (a_BlockEndY <= 0))\n\t{\n\t\t// Don't bother detailing this cave, it's under the world anyway\n\t\tm_MinBlockX = m_MaxBlockX = 0;\n\t\tm_MinBlockY = m_MaxBlockY = -1;\n\t\tm_MinBlockZ = m_MaxBlockZ = 0;\n\t\treturn;\n\t}\n\n\tRandomize(a_Noise);\n\tSmooth();\n\n\t// We know that the linear finishing won't affect the bounding box, so let's calculate it now, as we have less data:\n\tCalcBoundingBox();\n\n\tFinishLinear();\n}\n\n\n\n\n\nvoid cCaveTunnel::Randomize(cNoise & a_Noise)\n{\n\t// Repeat 4 times:\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\t// For each already present point, insert a point in between it and its predecessor, shifted randomly.\n\t\tcCaveDefPoint & Point = m_Points.front();\n\t\tint PrevX = Point.m_BlockX;\n\t\tint PrevY = Point.m_BlockY;\n\t\tint PrevZ = Point.m_BlockZ;\n\t\tint PrevR = Point.m_Radius;\n\t\tcCaveDefPoints Pts;\n\t\tPts.reserve(m_Points.size() * 2 + 1);\n\t\tPts.push_back(Point);\n\t\tfor (cCaveDefPoints::const_iterator itr = m_Points.begin() + 1, end = m_Points.end(); itr != end; ++itr)\n\t\t{\n\t\t\tint Random = a_Noise.IntNoise3DInt(PrevX, PrevY, PrevZ + i) / 11;\n\t\t\tint len = (PrevX - itr->m_BlockX) * (PrevX - itr->m_BlockX);\n\t\t\tlen += (PrevY - itr->m_BlockY) * (PrevY - itr->m_BlockY);\n\t\t\tlen += (PrevZ - itr->m_BlockZ) * (PrevZ - itr->m_BlockZ);\n\t\t\tlen = 3 * static_cast<int>(sqrt(static_cast<double>(len))) / 4;\n\t\t\tint Rad = std::min(MAX_RADIUS, std::max(MIN_RADIUS, (PrevR + itr->m_Radius) / 2 + (Random % 3) - 1));\n\t\t\tRandom /= 4;\n\t\t\tint x = (itr->m_BlockX + PrevX) / 2 + (Random % (len + 1) - len / 2);\n\t\t\tRandom /= 256;\n\t\t\tint y = (itr->m_BlockY + PrevY) / 2 + (Random % (len / 2 + 1) - len / 4);\n\t\t\tRandom /= 256;\n\t\t\tint z = (itr->m_BlockZ + PrevZ) / 2 + (Random % (len + 1) - len / 2);\n\t\t\tPts.emplace_back(x, y, z, Rad);\n\t\t\tPts.push_back(*itr);\n\t\t\tPrevX = itr->m_BlockX;\n\t\t\tPrevY = itr->m_BlockY;\n\t\t\tPrevZ = itr->m_BlockZ;\n\t\t\tPrevR = itr->m_Radius;\n\t\t}\n\t\tstd::swap(Pts, m_Points);\n\t}\n}\n\n\n\n\n\nbool cCaveTunnel::RefineDefPoints(const cCaveDefPoints & a_Src, cCaveDefPoints & a_Dst)\n{\n\tif (a_Src.size() < 2)\n\t{\n\t\t// There are no midpoints, nothing to smooth\n\t\treturn true;\n\t}\n\n\t// Smoothing: for each line segment, add points on its 1 / 4 lengths\n\tbool res = false;\n\tsize_t Num = a_Src.size() - 2;  // this many intermediary points\n\ta_Dst.clear();\n\ta_Dst.reserve(Num * 2 + 2);\n\tcCaveDefPoints::const_iterator itr = a_Src.begin() + 1;\n\tconst cCaveDefPoint & Source = a_Src.front();\n\ta_Dst.push_back(Source);\n\tint PrevX = Source.m_BlockX;\n\tint PrevY = Source.m_BlockY;\n\tint PrevZ = Source.m_BlockZ;\n\tint PrevR = Source.m_Radius;\n\tfor (size_t i = 0; i <= Num; ++i, ++itr)\n\t{\n\t\tint dx = itr->m_BlockX - PrevX;\n\t\tint dy = itr->m_BlockY - PrevY;\n\t\tint dz = itr->m_BlockZ - PrevZ;\n\t\tif (abs(dx) + abs(dz) + abs(dy) < 6)\n\t\t{\n\t\t\t// Too short a segment to smooth-subdivide into quarters\n\t\t\tPrevX = itr->m_BlockX;\n\t\t\tPrevY = itr->m_BlockY;\n\t\t\tPrevZ = itr->m_BlockZ;\n\t\t\tPrevR = itr->m_Radius;\n\t\t\tcontinue;\n\t\t}\n\t\tint dr = itr->m_Radius - PrevR;\n\t\tint Rad1 = std::max(PrevR + 1 * dr / 4, 1);\n\t\tint Rad2 = std::max(PrevR + 3 * dr / 4, 1);\n\t\ta_Dst.emplace_back(PrevX + 1 * dx / 4, PrevY + 1 * dy / 4, PrevZ + 1 * dz / 4, Rad1);\n\t\ta_Dst.emplace_back(PrevX + 3 * dx / 4, PrevY + 3 * dy / 4, PrevZ + 3 * dz / 4, Rad2);\n\t\tPrevX = itr->m_BlockX;\n\t\tPrevY = itr->m_BlockY;\n\t\tPrevZ = itr->m_BlockZ;\n\t\tPrevR = itr->m_Radius;\n\t\tres = true;\n\t}\n\ta_Dst.push_back(a_Src.back());\n\treturn res && (a_Src.size() < a_Dst.size());\n}\n\n\n\n\n\nvoid cCaveTunnel::Smooth(void)\n{\n\tcCaveDefPoints Pts;\n\tfor (;;)\n\t{\n\t\tif (!RefineDefPoints(m_Points, Pts))\n\t\t{\n\t\t\tstd::swap(Pts, m_Points);\n\t\t\treturn;\n\t\t}\n\t\tif (!RefineDefPoints(Pts, m_Points))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cCaveTunnel::FinishLinear(void)\n{\n\t// For each segment, use Bresenham's 3D line algorithm to draw a \"line\" of defpoints\n\tcCaveDefPoints Pts;\n\tstd::swap(Pts, m_Points);\n\n\tm_Points.reserve(Pts.size() * 3);\n\tcCaveDefPoint & PrevPoint = Pts.front();\n\tint PrevX = PrevPoint.m_BlockX;\n\tint PrevY = PrevPoint.m_BlockY;\n\tint PrevZ = PrevPoint.m_BlockZ;\n\tfor (cCaveDefPoints::const_iterator itr = Pts.begin() + 1, end = Pts.end(); itr != end; ++itr)\n\t{\n\t\tint x1 = itr->m_BlockX;\n\t\tint y1 = itr->m_BlockY;\n\t\tint z1 = itr->m_BlockZ;\n\t\tint dx = abs(x1 - PrevX);\n\t\tint dy = abs(y1 - PrevY);\n\t\tint dz = abs(z1 - PrevZ);\n\t\tint sx = (PrevX < x1) ? 1 : -1;\n\t\tint sy = (PrevY < y1) ? 1 : -1;\n\t\tint sz = (PrevZ < z1) ? 1 : -1;\n\t\tint R = itr->m_Radius;\n\n\t\tif (dx >= std::max(dy, dz))  // x dominant\n\t\t{\n\t\t\tint yd = dy - dx / 2;\n\t\t\tint zd = dz - dx / 2;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tm_Points.emplace_back(PrevX, PrevY, PrevZ, R);\n\n\t\t\t\tif (PrevX == x1)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (yd >= 0)  // move along y\n\t\t\t\t{\n\t\t\t\t\tPrevY += sy;\n\t\t\t\t\tyd -= dx;\n\t\t\t\t}\n\n\t\t\t\tif (zd >= 0)  // move along z\n\t\t\t\t{\n\t\t\t\t\tPrevZ += sz;\n\t\t\t\t\tzd -= dx;\n\t\t\t\t}\n\n\t\t\t\t// move along x\n\t\t\t\tPrevX  += sx;\n\t\t\t\tyd += dy;\n\t\t\t\tzd += dz;\n\t\t\t}\n\t\t}\n\t\telse if (dy >= std::max(dx, dz))  // y dominant\n\t\t{\n\t\t\tint xd = dx - dy / 2;\n\t\t\tint zd = dz - dy / 2;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tm_Points.emplace_back(PrevX, PrevY, PrevZ, R);\n\n\t\t\t\tif (PrevY == y1)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (xd >= 0)  // move along x\n\t\t\t\t{\n\t\t\t\t\tPrevX += sx;\n\t\t\t\t\txd -= dy;\n\t\t\t\t}\n\n\t\t\t\tif (zd >= 0)  // move along z\n\t\t\t\t{\n\t\t\t\t\tPrevZ += sz;\n\t\t\t\t\tzd -= dy;\n\t\t\t\t}\n\n\t\t\t\t// move along y\n\t\t\t\tPrevY += sy;\n\t\t\t\txd += dx;\n\t\t\t\tzd += dz;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// z dominant\n\t\t\tASSERT(dz >= std::max(dx, dy));\n\t\t\tint xd = dx - dz / 2;\n\t\t\tint yd = dy - dz / 2;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tm_Points.emplace_back(PrevX, PrevY, PrevZ, R);\n\n\t\t\t\tif (PrevZ == z1)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (xd >= 0)  // move along x\n\t\t\t\t{\n\t\t\t\t\tPrevX += sx;\n\t\t\t\t\txd -= dz;\n\t\t\t\t}\n\n\t\t\t\tif (yd >= 0)  // move along y\n\t\t\t\t{\n\t\t\t\t\tPrevY += sy;\n\t\t\t\t\tyd -= dz;\n\t\t\t\t}\n\n\t\t\t\t// move along z\n\t\t\t\tPrevZ += sz;\n\t\t\t\txd += dx;\n\t\t\t\tyd += dy;\n\t\t\t}\n\t\t}  // if (which dimension is dominant)\n\t}  // for itr\n}\n\n\n\n\n\nvoid cCaveTunnel::CalcBoundingBox(void)\n{\n\tcCaveDefPoint & Point = m_Points.front();\n\tm_MinBlockX = m_MaxBlockX = Point.m_BlockX;\n\tm_MinBlockY = m_MaxBlockY = Point.m_BlockY;\n\tm_MinBlockZ = m_MaxBlockZ = Point.m_BlockZ;\n\tfor (cCaveDefPoints::const_iterator itr = m_Points.begin() + 1, end = m_Points.end(); itr != end; ++itr)\n\t{\n\t\tm_MinBlockX = std::min(m_MinBlockX, itr->m_BlockX - itr->m_Radius);\n\t\tm_MaxBlockX = std::max(m_MaxBlockX, itr->m_BlockX + itr->m_Radius);\n\t\tm_MinBlockY = std::min(m_MinBlockY, itr->m_BlockY - itr->m_Radius);\n\t\tm_MaxBlockY = std::max(m_MaxBlockY, itr->m_BlockY + itr->m_Radius);\n\t\tm_MinBlockZ = std::min(m_MinBlockZ, itr->m_BlockZ - itr->m_Radius);\n\t\tm_MaxBlockZ = std::max(m_MaxBlockZ, itr->m_BlockZ + itr->m_Radius);\n\t}  // for itr - m_Points[]\n}\n\n\n\n\n\nvoid cCaveTunnel::ProcessChunk(\n\tint a_ChunkX, int a_ChunkZ,\n\tcChunkDef::BlockTypes & a_BlockTypes,\n\tcChunkDesc::BlockNibbleBytes & a_BlockMetas,\n\tcChunkDef::HeightMap & a_HeightMap\n)\n{\n\tint BaseX = a_ChunkX * cChunkDef::Width;\n\tint BaseZ = a_ChunkZ * cChunkDef::Width;\n\tif (\n\t\t(BaseX > m_MaxBlockX) || (BaseX + cChunkDef::Width < m_MinBlockX) ||\n\t\t(BaseZ > m_MaxBlockZ) || (BaseZ + cChunkDef::Width < m_MinBlockZ)\n\t)\n\t{\n\t\t// Tunnel does not intersect the chunk at all, bail out\n\t\treturn;\n\t}\n\n\tint BlockStartX = a_ChunkX * cChunkDef::Width;\n\tint BlockStartZ = a_ChunkZ * cChunkDef::Width;\n\tint BlockEndX = BlockStartX + cChunkDef::Width;\n\tint BlockEndZ = BlockStartZ + cChunkDef::Width;\n\tfor (cCaveDefPoints::const_iterator itr = m_Points.begin(), end = m_Points.end(); itr != end; ++itr)\n\t{\n\t\tif (\n\t\t\t(itr->m_BlockX + itr->m_Radius < BlockStartX) ||\n\t\t\t(itr->m_BlockX - itr->m_Radius > BlockEndX) ||\n\t\t\t(itr->m_BlockZ + itr->m_Radius < BlockStartZ) ||\n\t\t\t(itr->m_BlockZ - itr->m_Radius > BlockEndZ)\n\t\t)\n\t\t{\n\t\t\t// Cannot intersect, bail out early\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Carve out a sphere around the xyz point, m_Radius in diameter; skip 3 / 7 off the top and bottom:\n\t\tint DifX = itr->m_BlockX - BlockStartX;  // substitution for faster calc\n\t\tint DifY = itr->m_BlockY;\n\t\tint DifZ = itr->m_BlockZ - BlockStartZ;  // substitution for faster calc\n\t\tint Bottom = std::max(itr->m_BlockY - 3 * itr->m_Radius / 7, 1);\n\t\tint Top    = std::min(itr->m_BlockY + 3 * itr->m_Radius / 7, static_cast<int>(cChunkDef::Height));\n\t\tint SqRad  = itr->m_Radius * itr->m_Radius;\n\t\tfor (int z = 0; z < cChunkDef::Width; z++) for (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tfor (int y = Bottom; y <= Top; y++)\n\t\t\t{\n\t\t\t\tint SqDist = (DifX - x) * (DifX - x) + (DifY - y) * (DifY - y) + (DifZ - z) * (DifZ - z);\n\t\t\t\tif (4 * SqDist <= SqRad)\n\t\t\t\t{\n\t\t\t\t\tif (cBlockInfo::CanBeTerraformed(cChunkDef::GetBlock(a_BlockTypes, x, y, z)))\n\t\t\t\t\t{\n\t\t\t\t\t\tcChunkDef::SetBlock(a_BlockTypes, x, y, z, E_BLOCK_AIR);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (SqDist <= SqRad * 2)\n\t\t\t\t{\n\t\t\t\t\tif (cChunkDef::GetBlock(a_BlockTypes, x, y, z) == E_BLOCK_SAND)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst auto Index = cChunkDef::MakeIndex(x, y, z);\n\t\t\t\t\t\tif (a_BlockMetas[Index] == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_BlockMetas[Index] = 0;\n\t\t\t\t\t\t\tcChunkDef::SetBlock(a_BlockTypes, x, y, z, E_BLOCK_RED_SANDSTONE);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcChunkDef::SetBlock(a_BlockTypes, x, y, z, E_BLOCK_SANDSTONE);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for x, z\n\t}  // for itr - m_Points[]\n\n\t/*\n\t#ifndef NDEBUG\n\t// For debugging purposes, outline the shape of the cave using glowstone, after carving the entire cave:\n\tfor (cCaveDefPoints::const_iterator itr = m_Points.begin(), end = m_Points.end(); itr != end; ++itr)\n\t{\n\t\tint DifX = itr->m_BlockX - BlockStartX;  // substitution for faster calc\n\t\tint DifZ = itr->m_BlockZ - BlockStartZ;  // substitution for faster calc\n\t\tif (\n\t\t\t(DifX >= 0) && (DifX < cChunkDef::Width) &&\n\t\t\t(itr->m_BlockY > 0) && (itr->m_BlockY < cChunkDef::Height) &&\n\t\t\t(DifZ >= 0) && (DifZ < cChunkDef::Width)\n\t\t)\n\t\t{\n\t\t\tcChunkDef::SetBlock(a_BlockTypes, DifX, itr->m_BlockY, DifZ, E_BLOCK_GLOWSTONE);\n\t\t}\n\t}  // for itr - m_Points[]\n\t#endif  // !NDEBUG\n\t//*/\n}\n\n\n\n\n\n#ifndef NDEBUG\nAString cCaveTunnel::ExportAsSVG(int a_Color, int a_OffsetX, int a_OffsetZ) const\n{\n\tAString SVG;\n\tSVG.reserve(m_Points.size() * 20 + 200);\n\tSVG.append(fmt::format(FMT_STRING(\"<path style=\\\"fill:none;stroke:#{:06x};stroke-width:1px;\\\"\\nd=\\\"\"), a_Color));\n\tchar Prefix = 'M';  // The first point needs \"M\" prefix, all the others need \"L\"\n\tfor (cCaveDefPoints::const_iterator itr = m_Points.begin(); itr != m_Points.end(); ++itr)\n\t{\n\t\tSVG.append(fmt::format(FMT_STRING(\"{} {}, {} \"), Prefix, a_OffsetX + itr->m_BlockX, a_OffsetZ + itr->m_BlockZ));\n\t\tPrefix = 'L';\n\t}\n\tSVG.append(\"\\\"/>\\n\");\n\treturn SVG;\n}\n#endif  // !NDEBUG\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenWormNestCaves::cCaveSystem:\n\ncStructGenWormNestCaves::cCaveSystem::cCaveSystem(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ, int a_MaxOffset, int a_Size, cNoise & a_Noise) :\n\tSuper(a_GridX, a_GridZ, a_OriginX, a_OriginZ),\n\tm_Size(a_Size)\n{\n\tint Num = 1 + a_Noise.IntNoise2DInt(a_OriginX, a_OriginZ) % 3;\n\tfor (int i = 0; i < Num; i++)\n\t{\n\t\tint OriginX = a_OriginX + (a_Noise.IntNoise3DInt(13 * a_OriginX, 17 * a_OriginZ, 11 * i) / 19) % a_MaxOffset;\n\t\tint OriginZ = a_OriginZ + (a_Noise.IntNoise3DInt(17 * a_OriginX, 13 * a_OriginZ, 11 * i) / 23) % a_MaxOffset;\n\t\tint OriginY  = 20 + (a_Noise.IntNoise3DInt(19 * a_OriginX, 13 * a_OriginZ, 11 * i) / 17) % 20;\n\n\t\t// Generate three branches from the origin point:\n\t\t// The tunnels generated depend on X, Y, Z and Branches,\n\t\t// for the same set of numbers it generates the same offsets!\n\t\t// That's why we add a +1 to X in the third line\n\t\tGenerateTunnelsFromPoint(OriginX,     OriginY, OriginZ, a_Noise, 3);\n\t\tGenerateTunnelsFromPoint(OriginX,     OriginY, OriginZ, a_Noise, 2);\n\t\tGenerateTunnelsFromPoint(OriginX + 1, OriginY, OriginZ, a_Noise, 3);\n\t}\n}\n\n\n\n\n\ncStructGenWormNestCaves::cCaveSystem::~cCaveSystem()\n{\n\tClear();\n}\n\n\n\n\n\nvoid cStructGenWormNestCaves::cCaveSystem::DrawIntoChunk(cChunkDesc & a_ChunkDesc)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\tcChunkDef::BlockTypes        & BlockTypes = a_ChunkDesc.GetBlockTypes();\n\tcChunkDef::HeightMap         &  HeightMap = a_ChunkDesc.GetHeightMap();\n\tcChunkDesc::BlockNibbleBytes & BlockMetas = a_ChunkDesc.GetBlockMetasUncompressed();\n\tfor (cCaveTunnels::const_iterator itr = m_Tunnels.begin(), end = m_Tunnels.end(); itr != end; ++itr)\n\t{\n\t\t(*itr)->ProcessChunk(ChunkX, ChunkZ, BlockTypes, BlockMetas, HeightMap);\n\t}  // for itr - m_Tunnels[]\n}\n\n\n\n\n\nvoid cStructGenWormNestCaves::cCaveSystem::Clear(void)\n{\n\tfor (cCaveTunnels::const_iterator itr = m_Tunnels.begin(), end = m_Tunnels.end(); itr != end; ++itr)\n\t{\n\t\tdelete *itr;\n\t}\n\tm_Tunnels.clear();\n}\n\n\n\n\n\nvoid cStructGenWormNestCaves::cCaveSystem::GenerateTunnelsFromPoint(\n\tint a_OriginX, int a_OriginY, int a_OriginZ,\n\tcNoise & a_Noise, int a_NumSegments\n)\n{\n\tint DoubleSize = m_Size * 2;\n\tint Radius = GetRadius(a_Noise, a_OriginX + a_OriginY, a_OriginY + a_OriginZ, a_OriginZ + a_OriginX);\n\tfor (int i = a_NumSegments - 1; i >= 0; --i)\n\t{\n\t\tint EndX = a_OriginX + (((a_Noise.IntNoise3DInt(a_OriginX, a_OriginY, a_OriginZ + 11 * a_NumSegments) / 7) % DoubleSize) - m_Size) / 2;\n\t\tint EndY = a_OriginY + (((a_Noise.IntNoise3DInt(a_OriginY, 13 * a_NumSegments, a_OriginZ + a_OriginX) / 7) % DoubleSize) - m_Size) / 4;\n\t\tint EndZ = a_OriginZ + (((a_Noise.IntNoise3DInt(a_OriginZ + 17 * a_NumSegments, a_OriginX, a_OriginY) / 7) % DoubleSize) - m_Size) / 2;\n\t\tint EndR = GetRadius(a_Noise, a_OriginX + 7 * i, a_OriginY + 11 * i, a_OriginZ + a_OriginX);\n\t\tm_Tunnels.push_back(new cCaveTunnel(a_OriginX, a_OriginY, a_OriginZ, Radius, EndX, EndY, EndZ, EndR, a_Noise));\n\t\tGenerateTunnelsFromPoint(EndX, EndY, EndZ, a_Noise, i);\n\t\ta_OriginX = EndX;\n\t\ta_OriginY = EndY;\n\t\ta_OriginZ = EndZ;\n\t\tRadius = EndR;\n\t}  // for i - a_NumSegments\n}\n\n\n\n\n\nint cStructGenWormNestCaves::cCaveSystem::GetRadius(cNoise & a_Noise, int a_OriginX, int a_OriginY, int a_OriginZ)\n{\n\t// Instead of a flat distribution noise function, we need to shape it, so that most caves are smallish and only a few select are large\n\tint rnd = a_Noise.IntNoise3DInt(a_OriginX, a_OriginY, a_OriginZ) / 11;\n\t/*\n\t// Not good enough:\n\t// The algorithm of choice: emulate gauss-distribution noise by adding 3 flat noises, then fold it in half using absolute value.\n\t// To save on processing, use one random value and extract 3 bytes to be separately added as the gaussian noise\n\tint sum = (rnd & 0xff) + ((rnd >> 8) & 0xff) + ((rnd >> 16) & 0xff);\n\t// sum is now a gaussian-distribution noise within [0 .. 767], with center at 384.\n\t// We want mapping 384 -> 3, 0 -> 19, 768 -> 19, so divide by 24 to get [0 .. 31] with center at 16, then use abs() to fold around the center\n\tint res = 3 + abs((sum / 24) - 16);\n\t*/\n\n\t// Algorithm of choice: random value in the range of zero to random value - heavily towards zero\n\tint res = MIN_RADIUS + (rnd >> 8) % ((rnd % (MAX_RADIUS - MIN_RADIUS)) + 1);\n\treturn res;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenWormNestCaves:\n\ncGridStructGen::cStructurePtr cStructGenWormNestCaves::CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ)\n{\n\treturn cStructurePtr(new cCaveSystem(a_GridX, a_GridZ, a_OriginX, a_OriginZ, m_MaxOffset, m_Size, m_Noise));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenMarbleCaves:\n\nstatic float GetMarbleNoise( float x, float y, float z, cNoise & a_Noise)\n{\n\tstatic const float PI_2 = 1.57079633f;\n\tfloat oct1 = (a_Noise.CubicNoise3D(x * 0.1f, y * 0.1f, z * 0.1f)) * 4;\n\n\toct1 = oct1 * oct1 * oct1;\n\tif (oct1 < 0.f)\n\t{\n\t\toct1 = PI_2;\n\t}\n\tif (oct1 > PI_2)\n\t{\n\t\toct1 = PI_2;\n\t}\n\n\treturn oct1;\n}\n\n\n\n\n\nvoid cStructGenMarbleCaves::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tcNoise Noise(m_Seed);\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tconst float zz = static_cast<float>(a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z);\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tconst float xx = static_cast<float>(a_ChunkDesc.GetChunkX() * cChunkDef::Width + x);\n\n\t\t\tint Top = a_ChunkDesc.GetHeight(x, z);\n\t\t\tfor (int y = 1; y < Top; ++y)\n\t\t\t{\n\t\t\t\tif (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_STONE)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst float yy = static_cast<float>(y);\n\t\t\t\tconst float WaveNoise = 1;\n\t\t\t\tif (cosf(GetMarbleNoise(xx, yy * 0.5f, zz, Noise)) * fabs(cosf(yy * 0.2f + WaveNoise * 2) * 0.75f + WaveNoise) > 0.0005f)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_AIR);\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenDualRidgeCaves:\n\nvoid cStructGenDualRidgeCaves::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tconst float zz = static_cast<float>(a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z) / 10;\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tconst float xx = static_cast<float>(a_ChunkDesc.GetChunkX() * cChunkDef::Width + x) / 10;\n\n\t\t\tint Top = a_ChunkDesc.GetHeight(x, z);\n\t\t\tfor (int y = 1; y <= Top; ++y)\n\t\t\t{\n\t\t\t\tconst float yy = static_cast<float>(y / 10);\n\t\t\t\tfloat n1 = m_Noise1.CubicNoise3D(xx, yy, zz);\n\t\t\t\tfloat n2 = m_Noise2.CubicNoise3D(xx, yy, zz);\n\t\t\t\tfloat n3 = m_Noise1.CubicNoise3D(xx * 4, yy * 4, zz * 4) / 4;\n\t\t\t\tfloat n4 = m_Noise2.CubicNoise3D(xx * 4, yy * 4, zz * 4) / 4;\n\t\t\t\tif ((std::abs(n1 + n3) * std::abs(n2 + n4)) > m_Threshold)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_AIR);\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/Caves.h",
    "content": "\n// Caves.h\n\n// Interfaces to the various cave structure generators:\n//   - cStructGenWormNestCaves\n//   - cStructGenMarbleCaves\n//   - cStructGenNetherCaves\n\n\n\n\n\n#pragma once\n\n#include \"GridStructGen.h\"\n\n\n\n\n\nclass cStructGenMarbleCaves :\n\tpublic cFinishGen\n{\npublic:\n\tcStructGenMarbleCaves(int a_Seed) : m_Seed(a_Seed) {}\n\nprotected:\n\n\tint m_Seed;\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cStructGenDualRidgeCaves :\n\tpublic cFinishGen\n{\npublic:\n\tcStructGenDualRidgeCaves(int a_Seed, float a_Threshold) :\n\t\tm_Noise1(a_Seed),\n\t\tm_Noise2(2 * a_Seed + 19999),\n\t\tm_Seed(a_Seed),\n\t\tm_Threshold(a_Threshold)\n\t{\n\t}\n\nprotected:\n\tcNoise m_Noise1;\n\tcNoise m_Noise2;\n\tint    m_Seed;\n\tfloat  m_Threshold;\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cStructGenWormNestCaves:\n\tpublic cGridStructGen\n{\n\tusing Super = cGridStructGen;\n\npublic:\n\n\tcStructGenWormNestCaves(int a_Seed, int a_Size = 64, int a_Grid = 96, int a_MaxOffset = 128) :\n\t\tSuper(a_Seed, a_Grid, a_Grid, a_MaxOffset, a_MaxOffset, a_Size, a_Size, 100),\n\t\tm_Size(a_Size),\n\t\tm_MaxOffset(a_MaxOffset),\n\t\tm_Grid(a_Grid)\n\t{\n\t}\n\nprotected:\n\n\tclass cCaveSystem;  // fwd: Caves.cpp\n\n\tint          m_Size;  // relative size of the cave systems' caves. Average number of blocks of each initial tunnel\n\tint          m_MaxOffset;  // maximum offset of the cave nest origin from the grid cell the nest belongs to\n\tint          m_Grid;  // average spacing of the nests\n\n\t// cGridStructGen override:\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Generating/ChunkDesc.cpp",
    "content": "\n// ChunkDesc.cpp\n\n// Implements the cChunkDesc class representing the chunk description used while generating a chunk. This class is also exported to Lua for HOOK_CHUNK_GENERATING.\n\n#include \"Globals.h\"\n#include \"ChunkDesc.h\"\n#include \"../Noise/Noise.h\"\n#include \"../BlockEntities/BlockEntity.h\"\n#include \"../Entities/Entity.h\"\n\n\n\n\n\ncChunkDesc::cChunkDesc(cChunkCoords a_Coords) :\n\tm_Coords(a_Coords),\n\tm_bUseDefaultBiomes(true),\n\tm_bUseDefaultHeight(true),\n\tm_bUseDefaultComposition(true),\n\tm_bUseDefaultFinish(true)\n{\n\tm_BlockArea.Create(cChunkDef::Width, cChunkDef::Height, cChunkDef::Width);\n\t/*\n\tmemset(m_BlockTypes, 0, sizeof(cChunkDef::BlockTypes));\n\tmemset(m_BlockMeta,  0, sizeof(cChunkDef::BlockNibbles));\n\t*/\n\tmemset(m_BiomeMap,   0, sizeof(cChunkDef::BiomeMap));\n\tmemset(m_HeightMap,  0, sizeof(cChunkDef::HeightMap));\n}\n\n\n\n\n\ncChunkDesc::~cChunkDesc()\n{\n\t// Nothing needed yet\n}\n\n\n\n\n\nvoid cChunkDesc::SetChunkCoords(cChunkCoords a_Coords)\n{\n\tm_Coords = a_Coords;\n}\n\n\n\n\n\nvoid cChunkDesc::FillBlocks(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tm_BlockArea.Fill(cBlockArea::baTypes | cBlockArea::baMetas, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nvoid cChunkDesc::SetBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tm_BlockArea.SetRelBlockTypeMeta(a_RelX, a_RelY, a_RelZ, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nvoid cChunkDesc::GetBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n{\n\tm_BlockArea.GetRelBlockTypeMeta(a_RelX, a_RelY, a_RelZ, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nvoid cChunkDesc::SetBlockType(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType)\n{\n\tcChunkDef::SetBlock(m_BlockArea.GetBlockTypes(), a_RelX, a_RelY, a_RelZ, a_BlockType);\n}\n\n\n\n\n\nBLOCKTYPE cChunkDesc::GetBlockType(int a_RelX, int a_RelY, int a_RelZ) const\n{\n\treturn cChunkDef::GetBlock(m_BlockArea.GetBlockTypes(), a_RelX, a_RelY, a_RelZ);\n}\n\n\n\n\n\nNIBBLETYPE cChunkDesc::GetBlockMeta(int a_RelX, int a_RelY, int a_RelZ) const\n{\n\treturn m_BlockArea.GetRelBlockMeta(a_RelX, a_RelY, a_RelZ);\n}\n\n\n\n\n\nvoid cChunkDesc::SetBlockMeta(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_BlockMeta)\n{\n\tm_BlockArea.SetRelBlockMeta(a_RelX, a_RelY, a_RelZ, a_BlockMeta);\n}\n\n\n\n\n\nvoid cChunkDesc::SetBiome(int a_RelX, int a_RelZ, EMCSBiome a_BiomeID)\n{\n\tcChunkDef::SetBiome(m_BiomeMap, a_RelX, a_RelZ, a_BiomeID);\n}\n\n\n\n\n\nEMCSBiome cChunkDesc::GetBiome(int a_RelX, int a_RelZ) const\n{\n\treturn cChunkDef::GetBiome(m_BiomeMap, a_RelX, a_RelZ);\n}\n\n\n\n\n\nvoid cChunkDesc::SetHeight(int a_RelX, int a_RelZ, HEIGHTTYPE a_Height)\n{\n\tcChunkDef::SetHeight(m_HeightMap, a_RelX, a_RelZ, a_Height);\n}\n\n\n\n\n\nHEIGHTTYPE cChunkDesc::GetHeight(int a_RelX, int a_RelZ) const\n{\n\treturn cChunkDef::GetHeight(m_HeightMap, a_RelX, a_RelZ);\n}\n\n\n\n\n\nvoid cChunkDesc::SetHeightFromShape(const Shape & a_Shape)\n{\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tfor (HEIGHTTYPE y = cChunkDef::Height - 1; y > 0; y--)\n\t\t\t{\n\t\t\t\tif (a_Shape[y + x * 256 + z * 16 * 256] != 0)\n\t\t\t\t{\n\t\t\t\t\tcChunkDef::SetHeight(m_HeightMap, x, z, y);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cChunkDesc::GetShapeFromHeight(Shape & a_Shape) const\n{\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint height = cChunkDef::GetHeight(m_HeightMap, x, z);\n\t\t\tfor (int y = 0; y <= height; y++)\n\t\t\t{\n\t\t\t\ta_Shape[y + x * 256 + z * 16 * 256] = 1;\n\t\t\t}\n\n\t\t\tfor (int y = height + 1; y < cChunkDef::Height; y++)\n\t\t\t{\n\t\t\t\ta_Shape[y + x * 256 + z * 16 * 256] = 0;\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cChunkDesc::SetUseDefaultBiomes(bool a_bUseDefaultBiomes)\n{\n\tm_bUseDefaultBiomes = a_bUseDefaultBiomes;\n}\n\n\n\n\n\nbool cChunkDesc::IsUsingDefaultBiomes(void) const\n{\n\treturn m_bUseDefaultBiomes;\n}\n\n\n\n\n\nvoid cChunkDesc::SetUseDefaultHeight(bool a_bUseDefaultHeight)\n{\n\tm_bUseDefaultHeight = a_bUseDefaultHeight;\n}\n\n\n\n\n\nbool cChunkDesc::IsUsingDefaultHeight(void) const\n{\n\treturn m_bUseDefaultHeight;\n}\n\n\n\n\n\nvoid cChunkDesc::SetUseDefaultComposition(bool a_bUseDefaultComposition)\n{\n\tm_bUseDefaultComposition = a_bUseDefaultComposition;\n}\n\n\n\n\n\nbool cChunkDesc::IsUsingDefaultComposition(void) const\n{\n\treturn m_bUseDefaultComposition;\n}\n\n\n\n\n\nvoid cChunkDesc::SetUseDefaultFinish(bool a_bUseDefaultFinish)\n{\n\tm_bUseDefaultFinish = a_bUseDefaultFinish;\n}\n\n\n\n\n\nbool cChunkDesc::IsUsingDefaultFinish(void) const\n{\n\treturn m_bUseDefaultFinish;\n}\n\n\n\n\n\nvoid cChunkDesc::WriteBlockArea(const cBlockArea & a_BlockArea, int a_RelX, int a_RelY, int a_RelZ, cBlockArea::eMergeStrategy a_MergeStrategy)\n{\n\tm_BlockArea.Merge(a_BlockArea, a_RelX, a_RelY, a_RelZ, a_MergeStrategy);\n}\n\n\n\n\n\nvoid cChunkDesc::ReadBlockArea(cBlockArea & a_Dest, int a_MinRelX, int a_MaxRelX, int a_MinRelY, int a_MaxRelY, int a_MinRelZ, int a_MaxRelZ)\n{\n\t// Normalize the coords:\n\tif (a_MinRelX > a_MaxRelX)\n\t{\n\t\tstd::swap(a_MinRelX, a_MaxRelX);\n\t}\n\tif (a_MinRelY > a_MaxRelY)\n\t{\n\t\tstd::swap(a_MinRelY, a_MaxRelY);\n\t}\n\tif (a_MinRelZ > a_MaxRelZ)\n\t{\n\t\tstd::swap(a_MinRelZ, a_MaxRelZ);\n\t}\n\n\t// Include the Max coords:\n\ta_MaxRelX += 1;\n\ta_MaxRelY += 1;\n\ta_MaxRelZ += 1;\n\n\t// Check coords validity:\n\tif (a_MinRelX < 0)\n\t{\n\t\tLOGWARNING(\"%s: MinRelX less than zero, adjusting to zero\", __FUNCTION__);\n\t\ta_MinRelX = 0;\n\t}\n\telse if (a_MinRelX >= cChunkDef::Width)\n\t{\n\t\tLOGWARNING(\"%s: MinRelX more than chunk width, adjusting to chunk width\", __FUNCTION__);\n\t\ta_MinRelX = cChunkDef::Width - 1;\n\t}\n\tif (a_MaxRelX < 0)\n\t{\n\t\tLOGWARNING(\"%s: MaxRelX less than zero, adjusting to zero\", __FUNCTION__);\n\t\ta_MaxRelX = 0;\n\t}\n\telse if (a_MaxRelX > cChunkDef::Width)\n\t{\n\t\tLOGWARNING(\"%s: MaxRelX more than chunk width, adjusting to chunk width\", __FUNCTION__);\n\t\ta_MaxRelX = cChunkDef::Width;\n\t}\n\n\tif (a_MinRelY < 0)\n\t{\n\t\tLOGWARNING(\"%s: MinRelY less than zero, adjusting to zero\", __FUNCTION__);\n\t\ta_MinRelY = 0;\n\t}\n\telse if (a_MinRelY >= cChunkDef::Height)\n\t{\n\t\tLOGWARNING(\"%s: MinRelY more than chunk height, adjusting to chunk height\", __FUNCTION__);\n\t\ta_MinRelY = cChunkDef::Height - 1;\n\t}\n\tif (a_MaxRelY < 0)\n\t{\n\t\tLOGWARNING(\"%s: MaxRelY less than zero, adjusting to zero\", __FUNCTION__);\n\t\ta_MaxRelY = 0;\n\t}\n\telse if (a_MaxRelY > cChunkDef::Height)\n\t{\n\t\tLOGWARNING(\"%s: MaxRelY more than chunk height, adjusting to chunk height\", __FUNCTION__);\n\t\ta_MaxRelY = cChunkDef::Height;\n\t}\n\n\tif (a_MinRelZ < 0)\n\t{\n\t\tLOGWARNING(\"%s: MinRelZ less than zero, adjusting to zero\", __FUNCTION__);\n\t\ta_MinRelZ = 0;\n\t}\n\telse if (a_MinRelZ >= cChunkDef::Width)\n\t{\n\t\tLOGWARNING(\"%s: MinRelZ more than chunk width, adjusting to chunk width\", __FUNCTION__);\n\t\ta_MinRelZ = cChunkDef::Width - 1;\n\t}\n\tif (a_MaxRelZ < 0)\n\t{\n\t\tLOGWARNING(\"%s: MaxRelZ less than zero, adjusting to zero\", __FUNCTION__);\n\t\ta_MaxRelZ = 0;\n\t}\n\telse if (a_MaxRelZ > cChunkDef::Width)\n\t{\n\t\tLOGWARNING(\"%s: MaxRelZ more than chunk width, adjusting to chunk width\", __FUNCTION__);\n\t\ta_MaxRelZ = cChunkDef::Width;\n\t}\n\n\t// Prepare the block area:\n\tint SizeX = a_MaxRelX - a_MinRelX;\n\tint SizeY = a_MaxRelY - a_MinRelY;\n\tint SizeZ = a_MaxRelZ - a_MinRelZ;\n\ta_Dest.Clear();\n\ta_Dest.m_Origin.x = m_Coords.m_ChunkX * cChunkDef::Width + a_MinRelX;\n\ta_Dest.m_Origin.y = a_MinRelY;\n\ta_Dest.m_Origin.z = m_Coords.m_ChunkZ * cChunkDef::Width + a_MinRelZ;\n\ta_Dest.SetSize(SizeX, SizeY, SizeZ, cBlockArea::baTypes | cBlockArea::baMetas);\n\n\tfor (int y = 0; y < SizeY; y++)\n\t{\n\t\tint CDY = a_MinRelY + y;\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint CDZ = a_MinRelZ + z;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint CDX = a_MinRelX + x;\n\t\t\t\tBLOCKTYPE BlockType;\n\t\t\t\tNIBBLETYPE BlockMeta;\n\t\t\t\tGetBlockTypeMeta(CDX, CDY, CDZ, BlockType, BlockMeta);\n\t\t\t\ta_Dest.SetRelBlockTypeMeta(x, y, z, BlockType, BlockMeta);\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n}\n\n\n\n\n\nHEIGHTTYPE cChunkDesc::GetMaxHeight(void) const\n{\n\tHEIGHTTYPE MaxHeight = m_HeightMap[0];\n\tfor (size_t i = 1; i < ARRAYCOUNT(m_HeightMap); i++)\n\t{\n\t\tif (m_HeightMap[i] > MaxHeight)\n\t\t{\n\t\t\tMaxHeight = m_HeightMap[i];\n\t\t}\n\t}\n\treturn MaxHeight;\n}\n\n\n\n\n\nHEIGHTTYPE cChunkDesc::GetMinHeight(void) const\n{\n\tHEIGHTTYPE MinHeight = m_HeightMap[0];\n\tfor (size_t i = 1; i < ARRAYCOUNT(m_HeightMap); i++)\n\t{\n\t\tif (m_HeightMap[i] < MinHeight)\n\t\t{\n\t\t\tMinHeight = m_HeightMap[i];\n\t\t}\n\t}\n\treturn MinHeight;\n}\n\n\n\n\n\nvoid cChunkDesc::FillRelCuboid(\n\tint a_MinX, int a_MaxX,\n\tint a_MinY, int a_MaxY,\n\tint a_MinZ, int a_MaxZ,\n\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta\n)\n{\n\tint MinX = std::max(a_MinX, 0);\n\tint MinY = std::max(a_MinY, 0);\n\tint MinZ = std::max(a_MinZ, 0);\n\tint MaxX = std::min(a_MaxX, cChunkDef::Width - 1);\n\tint MaxY = std::min(a_MaxY, cChunkDef::Height - 1);\n\tint MaxZ = std::min(a_MaxZ, cChunkDef::Width - 1);\n\n\tfor (int y = MinY; y <= MaxY; y++)\n\t{\n\t\tfor (int z = MinZ; z <= MaxZ; z++)\n\t\t{\n\t\t\tfor (int x = MinX; x <= MaxX; x++)\n\t\t\t{\n\t\t\t\tSetBlockTypeMeta(x, y, z, a_BlockType, a_BlockMeta);\n\t\t\t}\n\t\t}  // for z\n\t}  // for y\n}\n\n\n\n\n\nvoid cChunkDesc::ReplaceRelCuboid(\n\tint a_MinX, int a_MaxX,\n\tint a_MinY, int a_MaxY,\n\tint a_MinZ, int a_MaxZ,\n\tBLOCKTYPE a_SrcType, NIBBLETYPE a_SrcMeta,\n\tBLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta\n)\n{\n\tint MinX = std::max(a_MinX, 0);\n\tint MinY = std::max(a_MinY, 0);\n\tint MinZ = std::max(a_MinZ, 0);\n\tint MaxX = std::min(a_MaxX, cChunkDef::Width - 1);\n\tint MaxY = std::min(a_MaxY, cChunkDef::Height - 1);\n\tint MaxZ = std::min(a_MaxZ, cChunkDef::Width - 1);\n\n\tfor (int y = MinY; y <= MaxY; y++)\n\t{\n\t\tfor (int z = MinZ; z <= MaxZ; z++)\n\t\t{\n\t\t\tfor (int x = MinX; x <= MaxX; x++)\n\t\t\t{\n\t\t\t\tBLOCKTYPE BlockType;\n\t\t\t\tNIBBLETYPE BlockMeta;\n\t\t\t\tGetBlockTypeMeta(x, y, z, BlockType, BlockMeta);\n\t\t\t\tif ((BlockType == a_SrcType) && (BlockMeta == a_SrcMeta))\n\t\t\t\t{\n\t\t\t\t\tSetBlockTypeMeta(x, y, z, a_DstType, a_DstMeta);\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for z\n\t}  // for y\n}\n\n\n\n\n\nvoid cChunkDesc::FloorRelCuboid(\n\tint a_MinX, int a_MaxX,\n\tint a_MinY, int a_MaxY,\n\tint a_MinZ, int a_MaxZ,\n\tBLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta\n)\n{\n\tint MinX = std::max(a_MinX, 0);\n\tint MinY = std::max(a_MinY, 0);\n\tint MinZ = std::max(a_MinZ, 0);\n\tint MaxX = std::min(a_MaxX, cChunkDef::Width - 1);\n\tint MaxY = std::min(a_MaxY, cChunkDef::Height - 1);\n\tint MaxZ = std::min(a_MaxZ, cChunkDef::Width - 1);\n\n\tfor (int y = MinY; y <= MaxY; y++)\n\t{\n\t\tfor (int z = MinZ; z <= MaxZ; z++)\n\t\t{\n\t\t\tfor (int x = MinX; x <= MaxX; x++)\n\t\t\t{\n\t\t\t\tswitch (GetBlockType(x, y, z))\n\t\t\t\t{\n\t\t\t\t\tcase E_BLOCK_AIR:\n\t\t\t\t\tcase E_BLOCK_WATER:\n\t\t\t\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\t\t\t\t{\n\t\t\t\t\t\tSetBlockTypeMeta(x, y, z, a_DstType, a_DstMeta);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}  // switch (GetBlockType)\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n}\n\n\n\n\n\nvoid cChunkDesc::RandomFillRelCuboid(\n\tint a_MinX, int a_MaxX,\n\tint a_MinY, int a_MaxY,\n\tint a_MinZ, int a_MaxZ,\n\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\tint a_RandomSeed, int a_ChanceOutOf10k\n)\n{\n\tcNoise Noise(a_RandomSeed);\n\tint MinX = std::max(a_MinX, 0);\n\tint MinY = std::max(a_MinY, 0);\n\tint MinZ = std::max(a_MinZ, 0);\n\tint MaxX = std::min(a_MaxX, cChunkDef::Width - 1);\n\tint MaxY = std::min(a_MaxY, cChunkDef::Height - 1);\n\tint MaxZ = std::min(a_MaxZ, cChunkDef::Width - 1);\n\n\tfor (int y = MinY; y <= MaxY; y++)\n\t{\n\t\tfor (int z = MinZ; z <= MaxZ; z++)\n\t\t{\n\t\t\tfor (int x = MinX; x <= MaxX; x++)\n\t\t\t{\n\t\t\t\tint rnd = (Noise.IntNoise3DInt(x, y, z) / 7) % 10000;\n\t\t\t\tif (rnd <= a_ChanceOutOf10k)\n\t\t\t\t{\n\t\t\t\t\tSetBlockTypeMeta(x, y, z, a_BlockType, a_BlockMeta);\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for z\n\t}  // for y\n}\n\n\n\n\n\ncBlockEntity * cChunkDesc::GetBlockEntity(int a_RelX, int a_RelY, int a_RelZ)\n{\n\tconst auto Idx = cChunkDef::MakeIndex(a_RelX, a_RelY, a_RelZ);\n\tconst auto Iterator = m_BlockArea.GetBlockEntities().find(Idx);\n\n\tif (Iterator != m_BlockArea.GetBlockEntities().end())\n\t{\n\t\t// Already in the list:\n\t\tcBlockEntity * BlockEntity = Iterator->second.get();\n\t\tif (BlockEntity->GetBlockType() == GetBlockType(a_RelX, a_RelY, a_RelZ))\n\t\t{\n\t\t\t// Correct type, already present. Return it:\n\t\t\treturn BlockEntity;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Wrong type, the block type has been overwritten. Erase and create new:\n\t\t\tm_BlockArea.GetBlockEntities().erase(Iterator);\n\t\t}\n\t}\n\n\tint AbsX = a_RelX + m_Coords.m_ChunkX * cChunkDef::Width;\n\tint AbsZ = a_RelZ + m_Coords.m_ChunkZ * cChunkDef::Width;\n\n\t// The block entity is not created yet, try to create it and add to list:\n\tauto BlockEntity = cBlockEntity::CreateByBlockType(GetBlockType(a_RelX, a_RelY, a_RelZ), GetBlockMeta(a_RelX, a_RelY, a_RelZ), {AbsX, a_RelY, AbsZ});\n\tif (BlockEntity == nullptr)\n\t{\n\t\t// No block entity for this block type\n\t\treturn nullptr;\n\t}\n\tauto res = m_BlockArea.GetBlockEntities().emplace(Idx, std::move(BlockEntity));\n\treturn res.first->second.get();\n}\n\n\n\n\n\nvoid cChunkDesc::UpdateHeightmap(void)\n{\n\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t{\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tHEIGHTTYPE Height = 0;\n\t\t\tfor (HEIGHTTYPE y = cChunkDef::Height - 1; y > 0; y--)\n\t\t\t{\n\t\t\t\tBLOCKTYPE BlockType = GetBlockType(x, y, z);\n\t\t\t\tif (BlockType != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\tHeight = y;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t\tSetHeight(x, z, Height);\n\t\t}  // for z\n\t}  // for x\n}\n\n\n\n\n\nvoid cChunkDesc::CompressBlockMetas(cChunkDef::BlockNibbles & a_DestMetas)\n{\n\tconst NIBBLETYPE * AreaMetas = m_BlockArea.GetBlockMetas();\n\tfor (size_t i = 0; i < ARRAYCOUNT(a_DestMetas); i++)\n\t{\n\t\ta_DestMetas[i] = static_cast<NIBBLETYPE>(AreaMetas[2 * i] | (AreaMetas[2 * i + 1] << 4));\n\t}\n}\n\n\n\n\n\n#ifndef NDEBUG\n\nvoid cChunkDesc::VerifyHeightmap(void)\n{\n\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t{\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int y = cChunkDef::Height - 1; y > 0; y--)\n\t\t\t{\n\t\t\t\tBLOCKTYPE BlockType = GetBlockType(x, y, z);\n\t\t\t\tif (BlockType != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\tint Height = GetHeight(x, z);\n\t\t\t\t\tASSERT(Height == y);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n}\n\n#endif  // !NDEBUG\n\n\n\n\n\n"
  },
  {
    "path": "src/Generating/ChunkDesc.h",
    "content": "\n// ChunkDesc.h\n\n// Declares the cChunkDesc class representing the chunk description used while generating a chunk. This class is also exported to Lua for HOOK_CHUNK_GENERATING.\n\n\n\n\n\n#pragma once\n\n#include \"../BlockArea.h\"\n#include \"../Cuboid.h\"\n\n\n\n\n\n// fwd: ../BlockArea.h\nclass cBlockArea;\n\n\n\n\n\n// tolua_begin\nclass cChunkDesc\n{\npublic:\n\t// tolua_end\n\n\t/** The datatype used to represent the entire chunk worth of shape.\n\t0 = air\n\t1 = solid\n\tIndexed as [y + 256 * x + 256 * 16 * z]. */\n\ttypedef Byte Shape[256 * 16 * 16];\n\n\t/** Uncompressed block metas, 1 meta per byte */\n\ttypedef NIBBLETYPE BlockNibbleBytes[cChunkDef::NumBlocks];\n\n\n\tcChunkDesc(cChunkCoords a_Coords);\n\t~cChunkDesc();\n\n\tvoid SetChunkCoords(cChunkCoords a_Coords);\n\n\t// tolua_begin\n\n\tint GetChunkX() const { return m_Coords.m_ChunkX; }  // Prefer GetChunkCoords() instead\n\tint GetChunkZ() const { return m_Coords.m_ChunkZ; }  // Prefer GetChunkCoords() instead\n\n\t// tolua_end\n\n\tcChunkCoords GetChunkCoords() const { return m_Coords; }\n\n\t// tolua_begin\n\n\tvoid       FillBlocks(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\tvoid       SetBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t// tolua_end\n\t/** Returns the BlockType and BlockMeta at the specified coords.\n\tExported to Lua manually to avoid extra parameters generated by ToLua++. */\n\tvoid GetBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const;\n\t// tolua_begin\n\n\tvoid       SetBlockType(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType);\n\tBLOCKTYPE  GetBlockType(int a_RelX, int a_RelY, int a_RelZ) const;\n\n\tvoid       SetBlockMeta(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_BlockMeta);\n\tNIBBLETYPE GetBlockMeta(int a_RelX, int a_RelY, int a_RelZ) const;\n\n\tvoid       SetBiome(int a_RelX, int a_RelZ, EMCSBiome a_BiomeID);\n\tEMCSBiome  GetBiome(int a_RelX, int a_RelZ) const;\n\n\t// These operate on the heightmap, so they could get out of sync with the data\n\t// Use UpdateHeightmap() to re-calculate heightmap from the block data\n\tvoid       SetHeight(int a_RelX, int a_RelZ, HEIGHTTYPE a_Height);\n\tHEIGHTTYPE GetHeight(int a_RelX, int a_RelZ) const;\n\n\t// tolua_end\n\n\t/** Sets the heightmap to match the given shape data.\n\tNote that this ignores overhangs; the method is mostly used by old composition generators. */\n\tvoid SetHeightFromShape(const Shape & a_Shape);\n\n\t/** Sets the shape in a_Shape to match the heightmap stored currently in m_HeightMap. */\n\tvoid GetShapeFromHeight(Shape & a_Shape) const;\n\n\t/** Returns the index into the internal shape array for the specified coords */\n\tinline static size_t MakeShapeIndex(int a_X, int a_Y, int a_Z)\n\t{\n\t\treturn static_cast<size_t>(a_Y + a_X * cChunkDef::Height + a_Z * cChunkDef::Height * cChunkDef::Width);\n\t}\n\n\tinline static void SetShapeIsSolidAt(Shape & a_Shape, int a_X, int a_Y, int a_Z, bool a_IsSolid)\n\t{\n\t\tauto index = MakeShapeIndex(a_X, a_Y, a_Z);\n\t\ta_Shape[index] = a_IsSolid ? 1 : 0;\n\t}\n\n\tinline static bool GetShapeIsSolidAt(const Shape & a_Shape, int a_X, int a_Y, int a_Z)\n\t{\n\t\tauto index = MakeShapeIndex(a_X, a_Y, a_Z);\n\t\treturn a_Shape[index];\n\t}\n\n\t// tolua_begin\n\n\t// Default generation:\n\tvoid SetUseDefaultBiomes(bool a_bUseDefaultBiomes);\n\tbool IsUsingDefaultBiomes(void) const;\n\tvoid SetUseDefaultHeight(bool a_bUseDefaultHeight);\n\tbool IsUsingDefaultHeight(void) const;\n\tvoid SetUseDefaultComposition(bool a_bUseDefaultComposition);\n\tbool IsUsingDefaultComposition(void) const;\n\tvoid SetUseDefaultFinish(bool a_bUseDefaultFinish);\n\tbool IsUsingDefaultFinish(void) const;\n\n\t/** Writes the block area into the chunk, with its origin set at the specified relative coords. Area's data overwrite everything in the chunk. */\n\tvoid WriteBlockArea(const cBlockArea & a_BlockArea, int a_RelX, int a_RelY, int a_RelZ, cBlockArea::eMergeStrategy a_MergeStrategy = cBlockArea::msOverwrite);\n\n\t/** Reads an area from the chunk into a cBlockArea, blocktypes and blockmetas */\n\tvoid ReadBlockArea(cBlockArea & a_Dest, int a_MinRelX, int a_MaxRelX, int a_MinRelY, int a_MaxRelY, int a_MinRelZ, int a_MaxRelZ);\n\n\t/** Returns the maximum height value in the heightmap. */\n\tHEIGHTTYPE GetMaxHeight(void) const;\n\n\t/** Returns the minimum height value in the heightmap. */\n\tHEIGHTTYPE GetMinHeight(void) const;\n\n\t/** Fills the relative cuboid with specified block; allows cuboid out of range of this chunk */\n\tvoid FillRelCuboid(\n\t\tint a_MinX, int a_MaxX,\n\t\tint a_MinY, int a_MaxY,\n\t\tint a_MinZ, int a_MaxZ,\n\t\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta\n\t);\n\n\t/** Fills the relative cuboid with specified block; allows cuboid out of range of this chunk */\n\tvoid FillRelCuboid(const cCuboid & a_RelCuboid, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\tFillRelCuboid(\n\t\t\ta_RelCuboid.p1.x, a_RelCuboid.p2.x,\n\t\t\ta_RelCuboid.p1.y, a_RelCuboid.p2.y,\n\t\t\ta_RelCuboid.p1.z, a_RelCuboid.p2.z,\n\t\t\ta_BlockType, a_BlockMeta\n\t\t);\n\t}\n\n\t/** Replaces the specified src blocks in the cuboid by the dst blocks; allows cuboid out of range of this chunk */\n\tvoid ReplaceRelCuboid(\n\t\tint a_MinX, int a_MaxX,\n\t\tint a_MinY, int a_MaxY,\n\t\tint a_MinZ, int a_MaxZ,\n\t\tBLOCKTYPE a_SrcType, NIBBLETYPE a_SrcMeta,\n\t\tBLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta\n\t);\n\n\t/** Replaces the specified src blocks in the cuboid by the dst blocks; allows cuboid out of range of this chunk */\n\tvoid ReplaceRelCuboid(\n\t\tconst cCuboid & a_RelCuboid,\n\t\tBLOCKTYPE a_SrcType, NIBBLETYPE a_SrcMeta,\n\t\tBLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta\n\t)\n\t{\n\t\tReplaceRelCuboid(\n\t\t\ta_RelCuboid.p1.x, a_RelCuboid.p2.x,\n\t\t\ta_RelCuboid.p1.y, a_RelCuboid.p2.y,\n\t\t\ta_RelCuboid.p1.z, a_RelCuboid.p2.z,\n\t\t\ta_SrcType, a_SrcMeta,\n\t\t\ta_DstType, a_DstMeta\n\t\t);\n\t}\n\n\t/** Replaces the blocks in the cuboid by the dst blocks if they are considered non-floor (air, water); allows cuboid out of range of this chunk */\n\tvoid FloorRelCuboid(\n\t\tint a_MinX, int a_MaxX,\n\t\tint a_MinY, int a_MaxY,\n\t\tint a_MinZ, int a_MaxZ,\n\t\tBLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta\n\t);\n\n\t/** Replaces the blocks in the cuboid by the dst blocks if they are considered non-floor (air, water); allows cuboid out of range of this chunk */\n\tvoid FloorRelCuboid(\n\t\tconst cCuboid & a_RelCuboid,\n\t\tBLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta\n\t)\n\t{\n\t\tFloorRelCuboid(\n\t\t\ta_RelCuboid.p1.x, a_RelCuboid.p2.x,\n\t\t\ta_RelCuboid.p1.y, a_RelCuboid.p2.y,\n\t\t\ta_RelCuboid.p1.z, a_RelCuboid.p2.z,\n\t\t\ta_DstType, a_DstMeta\n\t\t);\n\t}\n\n\t/** Fills the relative cuboid with specified block with a random chance; allows cuboid out of range of this chunk */\n\tvoid RandomFillRelCuboid(\n\t\tint a_MinX, int a_MaxX,\n\t\tint a_MinY, int a_MaxY,\n\t\tint a_MinZ, int a_MaxZ,\n\t\tBLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\t\tint a_RandomSeed, int a_ChanceOutOf10k\n\t);\n\n\t/** Fills the relative cuboid with specified block with a random chance; allows cuboid out of range of this chunk */\n\tvoid RandomFillRelCuboid(\n\t\tconst cCuboid & a_RelCuboid, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,\n\t\tint a_RandomSeed, int a_ChanceOutOf10k\n\t)\n\t{\n\t\tRandomFillRelCuboid(\n\t\t\ta_RelCuboid.p1.x, a_RelCuboid.p2.x,\n\t\t\ta_RelCuboid.p1.y, a_RelCuboid.p2.y,\n\t\t\ta_RelCuboid.p1.z, a_RelCuboid.p2.z,\n\t\t\ta_BlockType, a_BlockMeta,\n\t\t\ta_RandomSeed, a_ChanceOutOf10k\n\t\t);\n\t}\n\n\t/** Returns the block entity at the specified coords.\n\tIf there is no block entity at those coords, tries to create one, based on the block type\n\tIf the blocktype doesn't support a block entity, returns nullptr. */\n\tcBlockEntity * GetBlockEntity(int a_RelX, int a_RelY, int a_RelZ);\n\n\t/** Updates the heightmap to match the current contents.\n\tUseful for plugins when writing custom block areas into the chunk */\n\tvoid UpdateHeightmap(void);\n\n\t// tolua_end\n\n\t// Accessors used by cChunkGenerator::Generator descendants:\n\tinline cChunkDef::BiomeMap &     GetBiomeMap              (void) { return m_BiomeMap; }\n\tinline cChunkDef::BlockTypes &   GetBlockTypes            (void) { return *(reinterpret_cast<cChunkDef::BlockTypes *>(m_BlockArea.GetBlockTypes())); }\n\t// CANNOT, different compression!\n\t// inline cChunkDef::BlockNibbles & GetBlockMetas            (void) { return *((cChunkDef::BlockNibbles *)m_BlockArea.GetBlockMetas()); }\n\tinline BlockNibbleBytes &        GetBlockMetasUncompressed(void) { return *(reinterpret_cast<BlockNibbleBytes *>(m_BlockArea.GetBlockMetas())); }\n\tinline cChunkDef::HeightMap &    GetHeightMap             (void) { return m_HeightMap; }\n\tinline cEntityList &             GetEntities              (void) { return m_Entities; }\n\tinline const cBlockEntities &    GetBlockEntities         (void) const { return m_BlockArea.GetBlockEntities(); }\n\tinline cBlockEntities &          GetBlockEntities         (void) { return m_BlockArea.GetBlockEntities(); }\n\n\tinline const cChunkDef::BiomeMap &     GetBiomeMap()   const { return m_BiomeMap; }\n\tinline const cChunkDef::BlockTypes &   GetBlockTypes() const { return *(reinterpret_cast<cChunkDef::BlockTypes *>(m_BlockArea.GetBlockTypes())); }\n\tinline const cChunkDef::HeightMap &    GetHeightMap()  const { return m_HeightMap; }\n\n\t/** Compresses the metas from the BlockArea format (1 meta per byte) into regular format (2 metas per byte) */\n\tvoid CompressBlockMetas(cChunkDef::BlockNibbles & a_DestMetas);\n\n\t#ifndef NDEBUG\n\t/** Verifies that the heightmap corresponds to blocktype contents; if not, asserts on that column */\n\tvoid VerifyHeightmap(void);\n\t#endif  // !NDEBUG\n\nprivate:\n\tcChunkCoords m_Coords;\n\n\tcChunkDef::BiomeMap     m_BiomeMap;\n\tcBlockArea              m_BlockArea;\n\tcChunkDef::HeightMap    m_HeightMap;\n\tcEntityList             m_Entities;\n\n\tbool m_bUseDefaultBiomes;\n\tbool m_bUseDefaultHeight;\n\tbool m_bUseDefaultComposition;\n\tbool m_bUseDefaultFinish;\n} ;  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Generating/ChunkGenerator.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"ChunkGenerator.h\"\n#include \"ChunkDesc.h\"\n#include \"ComposableGenerator.h\"\n#include \"Noise3DGenerator.h\"\n#include \"../IniFile.h\"\n#include \"../FastRandom.h\"\n\n\n\n\n\nvoid cChunkGenerator::Initialize(cIniFile & a_IniFile)\n{\n\t// Get the seed; create a new one and log it if not found in the INI file:\n\tif (a_IniFile.HasValue(\"Seed\", \"Seed\"))\n\t{\n\t\tm_Seed = a_IniFile.GetValueI(\"Seed\", \"Seed\");\n\t}\n\telse\n\t{\n\t\tm_Seed = GetRandomProvider().RandInt();\n\t\tLOGINFO(\"Chosen a new random seed for world: %d\", m_Seed);\n\t\ta_IniFile.SetValueI(\"Seed\", \"Seed\", m_Seed);\n\t}\n\n\tm_Dimension = StringToDimension(a_IniFile.GetValue(\"General\", \"Dimension\", \"Overworld\"));\n}\n\n\n\n\n\nstd::unique_ptr<cChunkGenerator> cChunkGenerator::CreateFromIniFile(cIniFile & a_IniFile)\n{\n\t// Get the generator engine based on the INI file settings:\n\tstd::unique_ptr<cChunkGenerator> res;\n\tAString GeneratorName = a_IniFile.GetValueSet(\"Generator\", \"Generator\", \"Composable\");\n\tif (NoCaseCompare(GeneratorName, \"Noise3D\") == 0)\n\t{\n\t\tres.reset(new cNoise3DGenerator());\n\t}\n\telse\n\t{\n\t\tif (NoCaseCompare(GeneratorName, \"composable\") != 0)\n\t\t{\n\t\t\tLOGWARN(\"[Generator]::Generator value \\\"%s\\\" not recognized, using \\\"Composable\\\".\", GeneratorName.c_str());\n\t\t}\n\t\tres.reset(new cComposableGenerator());\n\t}\n\n\tif (res == nullptr)\n\t{\n\t\tLOGERROR(\"Generator could not start, aborting the server\");\n\t\treturn nullptr;\n\t}\n\n\tres->Initialize(a_IniFile);\n\treturn res;\n}\n\n\n\n\n\nEMCSBiome cChunkGenerator::GetBiomeAt(int a_BlockX, int a_BlockZ)\n{\n\tcChunkDef::BiomeMap Biomes;\n\tint Y = 0;\n\tint ChunkX, ChunkZ;\n\tcChunkDef::AbsoluteToRelative(a_BlockX, Y, a_BlockZ, ChunkX, ChunkZ);\n\tGenerateBiomes({ChunkX, ChunkZ}, Biomes);\n\treturn cChunkDef::GetBiome(Biomes, a_BlockX, a_BlockZ);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/ChunkGenerator.h",
    "content": "#pragma once\n\n#include \"../Defines.h\"\n#include \"ChunkDef.h\"\n\n\n\n// fwd:\nclass cIniFile;\nclass cChunkDesc;\n\n\n\n\n\n/** The interface that all chunk generators must implement to provide the generated chunks.\nAlso a static factory that creates the descendants based on INI file settings.\nThe cChunkGeneratorThread uses this interface to generate chunks for a single world.\nThs calls to generate chunks are synchronous - they don't return until the chunk is fully generated. */\nclass cChunkGenerator\n{\npublic:\n\tvirtual ~cChunkGenerator() {}  // Force a virtual destructor\n\n\t/** Called to initialize the generator on server startup.\n\tDescendants should call Super::Initialize() before initializing themselves. */\n\tvirtual void Initialize(cIniFile & a_IniFile);\n\n\t/** Generates the biomes for the specified chunk.\n\tUsed by the world loader if biomes failed loading. */\n\tvirtual void GenerateBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) = 0;\n\n\t/** Returns the biome at the specified coords.\n\tUsed by ChunkMap if an invalid chunk is queried for biome.\n\tThe default implementation uses GenerateBiomes(). */\n\tvirtual EMCSBiome GetBiomeAt(int a_BlockX, int a_BlockZ);\n\n\t/** Does the actual chunk generation.\n\tDescendants need to override this and generate into a_ChunkDesc. */\n\tvirtual void Generate(cChunkDesc & a_ChunkDesc) = 0;\n\n\t/** Returns the seed that was read from the INI file. */\n\tint GetSeed(void) const { return m_Seed; }\n\n\t/** Creates and initializes the entire generator based on the settings in the INI file.\n\tInitializes the generator, so that it can be used immediately after this call returns. */\n\tstatic std::unique_ptr<cChunkGenerator> CreateFromIniFile(cIniFile & a_IniFile);\n\n\nprotected:\n\n\t/** The main seed, read from the INI file, used for the entire generator. */\n\tint m_Seed;\n\n\t/** The dimension, read from the INI file. */\n\teDimension m_Dimension;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Generating/CompoGen.cpp",
    "content": "\n// CompoGen.cpp\n\n/* Implements the various terrain composition generators:\n\t- cCompoGenSameBlock\n\t- cCompoGenDebugBiomes\n\t- cCompoGenClassic\n*/\n\n#include \"Globals.h\"\n#include \"CompoGen.h\"\n#include \"../Item.h\"\n#include \"../LinearUpscale.h\"\n#include \"../IniFile.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCompoGenSameBlock:\n\nvoid cCompoGenSameBlock::ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape)\n{\n\ta_ChunkDesc.SetHeightFromShape(a_Shape);\n\ta_ChunkDesc.FillBlocks(E_BLOCK_AIR, 0);\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint Start;\n\t\t\tif (m_IsBedrocked)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(x, 0, z, E_BLOCK_BEDROCK);\n\t\t\t\tStart = 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStart = 0;\n\t\t\t}\n\t\t\tfor (int y = a_ChunkDesc.GetHeight(x, z); y >= Start; y--)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, m_BlockType);\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n}\n\n\n\n\n\nvoid cCompoGenSameBlock::InitializeCompoGen(cIniFile & a_IniFile)\n{\n\tm_BlockType = static_cast<BLOCKTYPE>(GetIniItemSet(a_IniFile, \"Generator\", \"SameBlockType\", \"stone\").m_ItemType);\n\tm_IsBedrocked = (a_IniFile.GetValueSetI(\"Generator\", \"SameBlockBedrocked\", 1) != 0);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCompoGenDebugBiomes:\n\nvoid cCompoGenDebugBiomes::ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape)\n{\n\tstatic BLOCKTYPE Blocks[] =\n\t{\n\t\tE_BLOCK_STONE,\n\t\tE_BLOCK_COBBLESTONE,\n\t\tE_BLOCK_LOG,\n\t\tE_BLOCK_PLANKS,\n\t\tE_BLOCK_SANDSTONE,\n\t\tE_BLOCK_WOOL,\n\t\tE_BLOCK_COAL_ORE,\n\t\tE_BLOCK_IRON_ORE,\n\t\tE_BLOCK_GOLD_ORE,\n\t\tE_BLOCK_DIAMOND_ORE,\n\t\tE_BLOCK_LAPIS_ORE,\n\t\tE_BLOCK_REDSTONE_ORE,\n\t\tE_BLOCK_IRON_BLOCK,\n\t\tE_BLOCK_GOLD_BLOCK,\n\t\tE_BLOCK_DIAMOND_BLOCK,\n\t\tE_BLOCK_LAPIS_BLOCK,\n\t\tE_BLOCK_BRICK,\n\t\tE_BLOCK_MOSSY_COBBLESTONE,\n\t\tE_BLOCK_OBSIDIAN,\n\t\tE_BLOCK_NETHERRACK,\n\t\tE_BLOCK_SOULSAND,\n\t\tE_BLOCK_NETHER_BRICK,\n\t\tE_BLOCK_BEDROCK,\n\t} ;\n\n\ta_ChunkDesc.SetHeightFromShape(a_Shape);\n\ta_ChunkDesc.FillBlocks(E_BLOCK_AIR, 0);\n\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tBLOCKTYPE BlockType = Blocks[a_ChunkDesc.GetBiome(x, z)];\n\t\t\tfor (int y = a_ChunkDesc.GetHeight(x, z); y >= 0; y--)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, BlockType);\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCompoGenClassic:\n\ncCompoGenClassic::cCompoGenClassic(void) :\n\tm_SeaLevel(60),\n\tm_BeachHeight(2),\n\tm_BeachDepth(4),\n\tm_BlockTop(E_BLOCK_GRASS),\n\tm_BlockMiddle(E_BLOCK_DIRT),\n\tm_BlockBottom(E_BLOCK_STONE),\n\tm_BlockBeach(E_BLOCK_SAND),\n\tm_BlockBeachBottom(E_BLOCK_SANDSTONE),\n\tm_BlockSea(E_BLOCK_STATIONARY_WATER)\n{\n}\n\n\n\n\n\nvoid cCompoGenClassic::ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape)\n{\n\t/* The classic composition means:\n\t\t- 1 layer of grass, 3 of dirt and the rest stone, if the height > sealevel + beachheight\n\t\t- 3 sand and a 1 sandstone, rest stone if between sealevel and sealevel + beachheight\n\t\t- water from waterlevel to height, then 3 sand, 1 sandstone, the rest stone, if water depth < beachdepth\n\t\t- water from waterlevel, then 3 dirt, the rest stone otherwise\n\t\t- bedrock at the bottom\n\t*/\n\n\ta_ChunkDesc.FillBlocks(E_BLOCK_AIR, 0);\n\ta_ChunkDesc.SetHeightFromShape(a_Shape);\n\n\t// The patterns to use for different situations, must be same length!\n\tconst BLOCKTYPE PatternGround[] = {m_BlockTop,    m_BlockMiddle, m_BlockMiddle, m_BlockMiddle} ;\n\tconst BLOCKTYPE PatternBeach[]  = {m_BlockBeach,  m_BlockBeach,  m_BlockBeach,  m_BlockBeachBottom} ;\n\tconst BLOCKTYPE PatternOcean[]  = {m_BlockMiddle, m_BlockMiddle, m_BlockMiddle, m_BlockBottom} ;\n\tstatic int PatternLength = ARRAYCOUNT(PatternGround);\n\tASSERT(ARRAYCOUNT(PatternGround) == ARRAYCOUNT(PatternBeach));\n\tASSERT(ARRAYCOUNT(PatternGround) == ARRAYCOUNT(PatternOcean));\n\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint Height = a_ChunkDesc.GetHeight(x, z);\n\t\t\tconst BLOCKTYPE * Pattern;\n\t\t\tif (Height > m_SeaLevel + m_BeachHeight)\n\t\t\t{\n\t\t\t\tPattern = PatternGround;\n\t\t\t}\n\t\t\telse if (Height > m_SeaLevel - m_BeachDepth)\n\t\t\t{\n\t\t\t\tPattern = PatternBeach;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tPattern = PatternOcean;\n\t\t\t}\n\n\t\t\t// Fill water from sealevel down to height (if any):\n\t\t\tfor (int y = m_SeaLevel; y >= Height; --y)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, m_BlockSea);\n\t\t\t}\n\n\t\t\t// Fill from height till the bottom:\n\t\t\tfor (int y = Height; y >= 1; y--)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, (Height - y < PatternLength) ? Pattern[Height - y] : m_BlockBottom);\n\t\t\t}\n\n\t\t\t// The last layer is always bedrock:\n\t\t\ta_ChunkDesc.SetBlockType(x, 0, z, E_BLOCK_BEDROCK);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cCompoGenClassic::InitializeCompoGen(cIniFile & a_IniFile)\n{\n\tm_SeaLevel         = a_IniFile.GetValueSetI(\"Generator\", \"SeaLevel\",           m_SeaLevel);\n\tm_BeachHeight      = a_IniFile.GetValueSetI(\"Generator\", \"ClassicBeachHeight\", m_BeachHeight);\n\tm_BeachDepth       = a_IniFile.GetValueSetI(\"Generator\", \"ClassicBeachDepth\",  m_BeachDepth);\n\tm_BlockTop         = static_cast<BLOCKTYPE>(GetIniItemSet(a_IniFile, \"Generator\", \"ClassicBlockTop\",         \"grass\").m_ItemType);\n\tm_BlockMiddle      = static_cast<BLOCKTYPE>(GetIniItemSet(a_IniFile, \"Generator\", \"ClassicBlockMiddle\",      \"dirt\").m_ItemType);\n\tm_BlockBottom      = static_cast<BLOCKTYPE>(GetIniItemSet(a_IniFile, \"Generator\", \"ClassicBlockBottom\",      \"stone\").m_ItemType);\n\tm_BlockBeach       = static_cast<BLOCKTYPE>(GetIniItemSet(a_IniFile, \"Generator\", \"ClassicBlockBeach\",       \"sand\").m_ItemType);\n\tm_BlockBeachBottom = static_cast<BLOCKTYPE>(GetIniItemSet(a_IniFile, \"Generator\", \"ClassicBlockBeachBottom\", \"sandstone\").m_ItemType);\n\tm_BlockSea         = static_cast<BLOCKTYPE>(GetIniItemSet(a_IniFile, \"Generator\", \"ClassicBlockSea\",         \"stationarywater\").m_ItemType);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCompoGenNether:\n\ncCompoGenNether::cCompoGenNether(int a_Seed) :\n\tm_Noise1(a_Seed + 10),\n\tm_Noise2(a_Seed * a_Seed * 10 + a_Seed * 1000 + 6000),\n\tm_MaxThreshold(25000)\n{\n}\n\n\n\n\n\nvoid cCompoGenNether::ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape)\n{\n\tHEIGHTTYPE MaxHeight = a_ChunkDesc.GetMaxHeight();\n\n\tconst int SEGMENT_HEIGHT = 8;\n\tconst int INTERPOL_X = 16;  // Must be a divisor of 16\n\tconst int INTERPOL_Z = 16;  // Must be a divisor of 16\n\t// Interpolate the chunk in 16 * SEGMENT_HEIGHT * 16 \"segments\", each SEGMENT_HEIGHT blocks high and each linearly interpolated separately.\n\t// Have two buffers, one for the lowest floor and one for the highest floor, so that Y-interpolation can be done between them\n\t// Then swap the buffers and use the previously-top one as the current-bottom, without recalculating it.\n\n\tint FloorBuf1[17 * 17];\n\tint FloorBuf2[17 * 17];\n\tint * FloorHi = FloorBuf1;\n\tint * FloorLo = FloorBuf2;\n\tint BaseX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint BaseZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\n\t// Interpolate the lowest floor:\n\tfor (int z = 0; z <= 16 / INTERPOL_Z; z++) for (int x = 0; x <= 16 / INTERPOL_X; x++)\n\t{\n\t\t// We need to store the intermediate result in a volatile variable, otherwise gcc -O2 optimizes\n\t\t// through the undefined behavior in cNoise and produces different data than the other platforms / build types (#4384)\n\t\tvolatile int intermediate =\n\t\t\tm_Noise1.IntNoise3DInt(BaseX + INTERPOL_X * x, 0, BaseZ + INTERPOL_Z * z) *\n\t\t\tm_Noise2.IntNoise3DInt(BaseX + INTERPOL_X * x, 0, BaseZ + INTERPOL_Z * z);\n\t\tFloorLo[INTERPOL_X * x + 17 * INTERPOL_Z * z] = intermediate / 256;\n\t}  // for x, z - FloorLo[]\n\tLinearUpscale2DArrayInPlace<17, 17, INTERPOL_X, INTERPOL_Z>(FloorLo);\n\n\t// Interpolate segments:\n\tfor (int Segment = 0; Segment < MaxHeight; Segment += SEGMENT_HEIGHT)\n\t{\n\t\t// First update the high floor:\n\t\tfor (int z = 0; z <= 16 / INTERPOL_Z; z++) for (int x = 0; x <= 16 / INTERPOL_X; x++)\n\t\t{\n\t\t\t// We need to store the intermediate result in a volatile variable, otherwise gcc -O2 optimizes\n\t\t\t// through the undefined behavior in cNoise and produces different data than the other platforms / build types (#4384)\n\t\t\tvolatile int intermediate =\n\t\t\t\tm_Noise1.IntNoise3DInt(BaseX + INTERPOL_X * x, Segment + SEGMENT_HEIGHT, BaseZ + INTERPOL_Z * z) *\n\t\t\t\tm_Noise2.IntNoise3DInt(BaseX + INTERPOL_Z * x, Segment + SEGMENT_HEIGHT, BaseZ + INTERPOL_Z * z);\n\t\t\tFloorHi[INTERPOL_X * x + 17 * INTERPOL_Z * z] = intermediate / 256;\n\t\t}  // for x, z - FloorLo[]\n\t\tLinearUpscale2DArrayInPlace<17, 17, INTERPOL_X, INTERPOL_Z>(FloorHi);\n\n\t\t// Interpolate between FloorLo and FloorHi:\n\t\tfor (int z = 0; z < 16; z++) for (int x = 0; x < 16; x++)\n\t\t{\n\t\t\tint Threshold = static_cast<int>(m_Noise1.CubicNoise2D(static_cast<float>(BaseX + x) / 75, static_cast<float>(BaseZ + z) / 75) * m_MaxThreshold);\n\t\t\tint Lo = FloorLo[x + 17 * z] / 256;\n\t\t\tint Hi = FloorHi[x + 17 * z] / 256;\n\t\t\tfor (int y = 0; y < SEGMENT_HEIGHT; y++)\n\t\t\t{\n\t\t\t\tint Val = Lo + (Hi - Lo) * y / SEGMENT_HEIGHT;\n\t\t\t\tif (Val < Threshold)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y + Segment, z, E_BLOCK_NETHERRACK);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Swap the floors:\n\t\tstd::swap(FloorLo, FloorHi);\n\t}\n\n\t// Bedrock at the bottom and at the top, cover ceiling with netherrack:\n\tfor (int z = 0; z < 16; z++) for (int x = 0; x < 16; x++)\n\t{\n\t\ta_ChunkDesc.SetBlockType(x, 0, z, E_BLOCK_BEDROCK);\n\n\t\tint Height = a_ChunkDesc.GetHeight(x, z);\n\t\ta_ChunkDesc.SetBlockType(x, Height, z, E_BLOCK_BEDROCK);\n\n\t\tNOISE_DATATYPE CeilingDisguise = (m_Noise1.CubicNoise2D(static_cast<float>(a_ChunkDesc.GetChunkX() * cChunkDef::Width + x) / 10, static_cast<float>(a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z) / 10));\n\t\tif (CeilingDisguise < 0)\n\t\t{\n\t\t\tCeilingDisguise = -CeilingDisguise;\n\t\t}\n\n\t\tint CeilingDisguiseHeight = Height - 2 - FloorC(CeilingDisguise * 3);\n\n\t\tfor (int y = Height - 1; y > CeilingDisguiseHeight; y--)\n\t\t{\n\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_NETHERRACK);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cCompoGenNether::InitializeCompoGen(cIniFile & a_IniFile)\n{\n\tm_MaxThreshold = a_IniFile.GetValueSetF(\"Generator\", \"NetherMaxThreshold\", m_MaxThreshold);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCompoGenCache:\n\ncCompoGenCache::cCompoGenCache(std::unique_ptr<cTerrainCompositionGen> a_Underlying, int a_CacheSize) :\n\tm_Underlying(std::move(a_Underlying)),\n\tm_CacheSize(a_CacheSize),\n\tm_CacheOrder(new int[ToUnsigned(a_CacheSize)]),\n\tm_CacheData(new sCacheData[ToUnsigned(a_CacheSize)]),\n\tm_NumHits(0),\n\tm_NumMisses(0),\n\tm_TotalChain(0)\n{\n\tfor (int i = 0; i < m_CacheSize; i++)\n\t{\n\t\tm_CacheOrder[i] = i;\n\t\tm_CacheData[i].m_ChunkX = 0x7fffffff;\n\t\tm_CacheData[i].m_ChunkZ = 0x7fffffff;\n\t}\n}\n\n\n\n\n\ncCompoGenCache::~cCompoGenCache()\n{\n\tdelete[] m_CacheData;\n\tm_CacheData = nullptr;\n\tdelete[] m_CacheOrder;\n\tm_CacheOrder = nullptr;\n}\n\n\n\n\n\nvoid cCompoGenCache::ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape)\n{\n\t#ifndef NDEBUG\n\tif (((m_NumHits + m_NumMisses) % 1024) == 10)\n\t{\n\t\t// LOGD(\"CompoGenCache: %d hits, %d misses, saved %.2f %%\", m_NumHits, m_NumMisses, 100.0 * m_NumHits / (m_NumHits + m_NumMisses));\n\t\t// LOGD(\"CompoGenCache: Avg cache chain length: %.2f\", static_cast<float>(m_TotalChain) / m_NumHits);\n\t}\n\t#endif  // !NDEBUG\n\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\n\tfor (int i = 0; i < m_CacheSize; i++)\n\t{\n\t\tif (\n\t\t\t(m_CacheData[m_CacheOrder[i]].m_ChunkX != ChunkX) ||\n\t\t\t(m_CacheData[m_CacheOrder[i]].m_ChunkZ != ChunkZ)\n\t\t)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Found it in the cache\n\t\tint Idx = m_CacheOrder[i];\n\n\t\t// Move to front:\n\t\tfor (int j = i; j > 0; j--)\n\t\t{\n\t\t\tm_CacheOrder[j] = m_CacheOrder[j - 1];\n\t\t}\n\t\tm_CacheOrder[0] = Idx;\n\n\t\t// Use the cached data:\n\t\tmemcpy(a_ChunkDesc.GetBlockTypes(),             m_CacheData[Idx].m_BlockTypes, sizeof(a_ChunkDesc.GetBlockTypes()));\n\t\tmemcpy(a_ChunkDesc.GetBlockMetasUncompressed(), m_CacheData[Idx].m_BlockMetas, sizeof(a_ChunkDesc.GetBlockMetasUncompressed()));\n\t\tmemcpy(a_ChunkDesc.GetHeightMap(),              m_CacheData[Idx].m_HeightMap,  sizeof(a_ChunkDesc.GetHeightMap()));\n\n\t\tm_NumHits++;\n\t\tm_TotalChain += i;\n\t\treturn;\n\t}  // for i - cache\n\n\t// Not in the cache:\n\tm_NumMisses++;\n\tm_Underlying->ComposeTerrain(a_ChunkDesc, a_Shape);\n\n\t// Insert it as the first item in the MRU order:\n\tint Idx = m_CacheOrder[m_CacheSize - 1];\n\tfor (int i = m_CacheSize - 1; i > 0; i--)\n\t{\n\t\tm_CacheOrder[i] = m_CacheOrder[i - 1];\n\t}  // for i - m_CacheOrder[]\n\tm_CacheOrder[0] = Idx;\n\tmemcpy(m_CacheData[Idx].m_BlockTypes, a_ChunkDesc.GetBlockTypes(),             sizeof(a_ChunkDesc.GetBlockTypes()));\n\tmemcpy(m_CacheData[Idx].m_BlockMetas, a_ChunkDesc.GetBlockMetasUncompressed(), sizeof(a_ChunkDesc.GetBlockMetasUncompressed()));\n\tmemcpy(m_CacheData[Idx].m_HeightMap,  a_ChunkDesc.GetHeightMap(),              sizeof(a_ChunkDesc.GetHeightMap()));\n\tm_CacheData[Idx].m_ChunkX = ChunkX;\n\tm_CacheData[Idx].m_ChunkZ = ChunkZ;\n}\n\n\n\n\n\nvoid cCompoGenCache::InitializeCompoGen(cIniFile & a_IniFile)\n{\n\tm_Underlying->InitializeCompoGen(a_IniFile);\n}\n"
  },
  {
    "path": "src/Generating/CompoGen.h",
    "content": "\n// CompoGen.h\n\n/* Interfaces to the various terrain composition generators:\n\t- cCompoGenSameBlock\n\t- cCompoGenDebugBiomes\n\t- cCompoGenClassic\n\t- cCompoGenBiomal\n\t- cCompoGenNether\n\t- cCompoGenCache\n*/\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Noise/Noise.h\"\n\n\n\n\n\nclass cCompoGenSameBlock :\n\tpublic cTerrainCompositionGen\n{\npublic:\n\tcCompoGenSameBlock(void) :\n\t\tm_BlockType(E_BLOCK_STONE),\n\t\tm_IsBedrocked(true)\n\t{}\n\nprotected:\n\n\tBLOCKTYPE m_BlockType;\n\tbool      m_IsBedrocked;\n\n\t// cTerrainCompositionGen overrides:\n\tvirtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override;\n\tvirtual void InitializeCompoGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\nclass cCompoGenDebugBiomes :\n\tpublic cTerrainCompositionGen\n{\npublic:\n\tcCompoGenDebugBiomes(void) {}\n\nprotected:\n\n\t// cTerrainCompositionGen overrides:\n\tvirtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override;\n} ;\n\n\n\n\n\nclass cCompoGenClassic :\n\tpublic cTerrainCompositionGen\n{\npublic:\n\tcCompoGenClassic(void);\n\nprotected:\n\n\tint m_SeaLevel;\n\tint m_BeachHeight;\n\tint m_BeachDepth;\n\tBLOCKTYPE m_BlockTop;\n\tBLOCKTYPE m_BlockMiddle;\n\tBLOCKTYPE m_BlockBottom;\n\tBLOCKTYPE m_BlockBeach;\n\tBLOCKTYPE m_BlockBeachBottom;\n\tBLOCKTYPE m_BlockSea;\n\n\t// cTerrainCompositionGen overrides:\n\tvirtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override;\n\tvirtual void InitializeCompoGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\nclass cCompoGenNether :\n\tpublic cTerrainCompositionGen\n{\npublic:\n\tcCompoGenNether(int a_Seed);\n\nprotected:\n\tcNoise m_Noise1;\n\tcNoise m_Noise2;\n\n\tdouble m_MaxThreshold;\n\n\t// cTerrainCompositionGen overrides:\n\tvirtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override;\n\tvirtual void InitializeCompoGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\n/** Caches most-recently-used chunk composition of another composition generator. Caches only the types and metas */\nclass cCompoGenCache :\n\tpublic cTerrainCompositionGen\n{\npublic:\n\tcCompoGenCache(std::unique_ptr<cTerrainCompositionGen> a_Underlying, int a_CacheSize);\n\tvirtual ~cCompoGenCache() override;\n\n\t// cTerrainCompositionGen override:\n\tvirtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override;\n\tvirtual void InitializeCompoGen(cIniFile & a_IniFile) override;\n\nprotected:\n\n\tstd::unique_ptr<cTerrainCompositionGen> m_Underlying;\n\n\tstruct sCacheData\n\t{\n\t\tint m_ChunkX;\n\t\tint m_ChunkZ;\n\t\tcChunkDef::BlockTypes        m_BlockTypes;\n\t\tcChunkDesc::BlockNibbleBytes m_BlockMetas;  // The metas are uncompressed, 1 meta per byte\n\t\tcChunkDef::HeightMap         m_HeightMap;\n\t} ;\n\n\t// To avoid moving large amounts of data for the MRU behavior, we MRU-ize indices to an array of the actual data\n\tint          m_CacheSize;\n\tint *        m_CacheOrder;  // MRU-ized order, indices into m_CacheData array\n\tsCacheData * m_CacheData;   // m_CacheData[m_CacheOrder[0]] is the most recently used\n\n\t// Cache statistics\n\tint m_NumHits;\n\tint m_NumMisses;\n\tint m_TotalChain;  // Number of cache items walked to get to a hit (only added for hits)\n} ;\n"
  },
  {
    "path": "src/Generating/CompoGenBiomal.cpp",
    "content": "\n// CompoGenBiomal.cpp\n\n// Implements the cCompoGenBiomal class representing the biome-aware composition generator\n\n#include \"Globals.h\"\n\n#include \"CompoGenBiomal.h\"\n\n#include \"../IniFile.h\"\n#include \"../Noise/Noise.h\"\n#include \"../LinearUpscale.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPattern:\n\n/** This class is used to store a column pattern initialized at runtime,\nso that the program doesn't need to explicitly set 256 values for each pattern\nEach pattern has 256 blocks so that there's no need to check pattern bounds when assigning the\npattern - there will always be enough pattern left, even for the whole-chunk-height columns. */\nclass cPattern\n{\npublic:\n\tstruct BlockInfo\n\t{\n\t\tBLOCKTYPE  m_BlockType = E_BLOCK_STONE;\n\t\tNIBBLETYPE m_BlockMeta = 0;\n\t};\n\n\tconstexpr cPattern(std::initializer_list<BlockInfo> a_TopBlocks)\n\t{\n\t\tASSERT(a_TopBlocks.size() <= cChunkDef::Height);\n\t\t// Copy the pattern into the top:\n\t\tsize_t i = 0;\n\t\tfor (const auto & Block : a_TopBlocks)\n\t\t{\n\t\t\tm_Pattern[i] = Block;\n\t\t\t++i;\n\t\t}\n\n\t\t// The remaining blocks default to stone\n\t}\n\n\tconst BlockInfo * Get(void) const { return m_Pattern; }\n\nprotected:\n\tBlockInfo m_Pattern[cChunkDef::Height] = {};\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Land top block patterns:\n\nstatic constexpr cPattern patGrass =\n{\n\t{E_BLOCK_GRASS, 0},\n\t{E_BLOCK_DIRT,  E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT,  E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT,  E_META_DIRT_NORMAL},\n} ;\n\nstatic constexpr cPattern patSand =\n{\n\t{ E_BLOCK_SAND, 0},\n\t{ E_BLOCK_SAND, 0},\n\t{ E_BLOCK_SAND, 0},\n\t{ E_BLOCK_SANDSTONE, 0},\n} ;\n\nstatic constexpr cPattern patDirt =\n{\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n} ;\n\nstatic constexpr cPattern patPodzol =\n{\n\t{E_BLOCK_DIRT, E_META_DIRT_PODZOL},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n} ;\n\nstatic constexpr cPattern patGrassLess =\n{\n\t{E_BLOCK_DIRT, E_META_DIRT_GRASSLESS},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n\t{E_BLOCK_DIRT, E_META_DIRT_NORMAL},\n} ;\n\nstatic constexpr cPattern patMycelium =\n{\n\t{E_BLOCK_MYCELIUM, 0},\n\t{E_BLOCK_DIRT,     0},\n\t{E_BLOCK_DIRT,     0},\n\t{E_BLOCK_DIRT,     0},\n} ;\n\nstatic constexpr cPattern patGravel =\n{\n\t{E_BLOCK_GRAVEL, 0},\n\t{E_BLOCK_GRAVEL, 0},\n\t{E_BLOCK_GRAVEL, 0},\n\t{E_BLOCK_STONE,  0},\n} ;\n\nstatic constexpr cPattern patStone =\n{\n\t{E_BLOCK_STONE,   0},\n\t{E_BLOCK_STONE,   0},\n\t{E_BLOCK_STONE,   0},\n\t{E_BLOCK_STONE,   0},\n} ;\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Ocean floor patterns:\n\nstatic constexpr cPattern patOFSand =\n{\n\t{E_BLOCK_SAND, 0},\n\t{E_BLOCK_SAND, 0},\n\t{E_BLOCK_SAND, 0},\n\t{E_BLOCK_SANDSTONE, 0}\n} ;\n\nstatic constexpr cPattern patOFClay =\n{\n\t{ E_BLOCK_CLAY, 0},\n\t{ E_BLOCK_CLAY, 0},\n\t{ E_BLOCK_SAND, 0},\n\t{ E_BLOCK_SAND, 0},\n} ;\n\nstatic constexpr cPattern patOFOrangeClay =\n{\n\t{ E_BLOCK_STAINED_CLAY, E_META_STAINED_GLASS_ORANGE},\n\t{ E_BLOCK_STAINED_CLAY, E_META_STAINED_GLASS_ORANGE},\n\t{ E_BLOCK_STAINED_CLAY, E_META_STAINED_GLASS_ORANGE},\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCompoGenBiomal:\n\nclass cCompoGenBiomal :\n\tpublic cTerrainCompositionGen\n{\npublic:\n\tcCompoGenBiomal(int a_Seed) :\n\t\tm_SeaLevel(62),\n\t\tm_OceanFloorSelect(a_Seed + 1),\n\t\tm_MesaFloor(a_Seed + 2)\n\t{\n\t\tinitMesaPattern(a_Seed);\n\t}\n\nprotected:\n\t/** The block height at which water is generated instead of air. */\n\tHEIGHTTYPE m_SeaLevel;\n\n\t/** The pattern used for mesa biomes. Initialized by seed on generator creation. */\n\tcPattern::BlockInfo m_MesaPattern[2 * cChunkDef::Height];\n\n\t/** Noise used for selecting between dirt and sand on the ocean floor. */\n\tcNoise m_OceanFloorSelect;\n\n\t/** Noise used for the floor of the clay blocks in mesa biomes. */\n\tcNoise m_MesaFloor;\n\n\n\t// cTerrainCompositionGen overrides:\n\tvirtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override\n\t{\n\t\ta_ChunkDesc.FillBlocks(E_BLOCK_AIR, 0);\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\tComposeColumn(a_ChunkDesc, x, z, &(a_Shape[x * 256 + z * 16 * 256]));\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\n\n\n\tvirtual void InitializeCompoGen(cIniFile & a_IniFile) override\n\t{\n\t\tm_SeaLevel = static_cast<HEIGHTTYPE>(a_IniFile.GetValueSetI(\"Generator\", \"SeaLevel\", m_SeaLevel));\n\t}\n\n\n\n\t/** Initializes the m_MesaPattern with a pattern based on the generator's seed. */\n\tvoid initMesaPattern(int a_Seed)\n\t{\n\t\t// In a loop, choose whether to use one, two or three layers of stained clay, then choose a color and width for each layer\n\t\t// Separate each group with another layer of hardened clay\n\t\tcNoise patternNoise(a_Seed);\n\t\tstatic NIBBLETYPE allowedColors[] =\n\t\t{\n\t\t\tE_META_STAINED_CLAY_YELLOW,\n\t\t\tE_META_STAINED_CLAY_YELLOW,\n\t\t\tE_META_STAINED_CLAY_RED,\n\t\t\tE_META_STAINED_CLAY_RED,\n\t\t\tE_META_STAINED_CLAY_WHITE,\n\t\t\tE_META_STAINED_CLAY_BROWN,\n\t\t\tE_META_STAINED_CLAY_BROWN,\n\t\t\tE_META_STAINED_CLAY_BROWN,\n\t\t\tE_META_STAINED_CLAY_ORANGE,\n\t\t\tE_META_STAINED_CLAY_ORANGE,\n\t\t\tE_META_STAINED_CLAY_ORANGE,\n\t\t\tE_META_STAINED_CLAY_ORANGE,\n\t\t\tE_META_STAINED_CLAY_ORANGE,\n\t\t\tE_META_STAINED_CLAY_ORANGE,\n\t\t\tE_META_STAINED_CLAY_LIGHTGRAY,\n\t\t} ;\n\t\tstatic int layerSizes[] =  // Adjust the chance so that thinner layers occur more commonly\n\t\t{\n\t\t\t1, 1, 1, 1, 1, 1,\n\t\t\t2, 2, 2, 2,\n\t\t\t3, 3,\n\t\t} ;\n\t\tint idx = ARRAYCOUNT(m_MesaPattern) - 1;\n\t\twhile (idx >= 0)\n\t\t{\n\t\t\t// A layer group of 1 - 2 color stained clay:\n\t\t\tint rnd = patternNoise.IntNoise1DInt(idx) / 7;\n\t\t\tint numLayers = (rnd % 2) + 1;\n\t\t\trnd /= 2;\n\t\t\tfor (int lay = 0; lay < numLayers; lay++)\n\t\t\t{\n\t\t\t\tint numBlocks = layerSizes[(static_cast<size_t>(rnd) % ARRAYCOUNT(layerSizes))];\n\t\t\t\tNIBBLETYPE Color = allowedColors[static_cast<size_t>(rnd / 4) % ARRAYCOUNT(allowedColors)];\n\t\t\t\tif (\n\t\t\t\t\t((numBlocks == 3) && (numLayers == 2)) ||  // In two-layer mode disallow the 3-high layers:\n\t\t\t\t\t(Color == E_META_STAINED_CLAY_WHITE))      // White stained clay can ever be only 1 block high\n\t\t\t\t{\n\t\t\t\t\tnumBlocks = 1;\n\t\t\t\t}\n\t\t\t\tnumBlocks = std::min(idx + 1, numBlocks);  // Limit by idx so that we don't have to check inside the loop\n\t\t\t\trnd /= 32;\n\t\t\t\tfor (int block = 0; block < numBlocks; block++, idx--)\n\t\t\t\t{\n\t\t\t\t\tm_MesaPattern[idx].m_BlockMeta = Color;\n\t\t\t\t\tm_MesaPattern[idx].m_BlockType = E_BLOCK_STAINED_CLAY;\n\t\t\t\t}  // for block\n\t\t\t}  // for lay\n\n\t\t\t// A layer of hardened clay in between the layer group:\n\t\t\tint numBlocks = (rnd % 4) + 1;  // All heights the same probability\n\t\t\tif ((numLayers == 2) && (numBlocks < 4))\n\t\t\t{\n\t\t\t\t// For two layers of stained clay, add an extra block of hardened clay:\n\t\t\t\tnumBlocks++;\n\t\t\t}\n\t\t\tnumBlocks = std::min(idx + 1, numBlocks);  // Limit by idx so that we don't have to check inside the loop\n\t\t\tfor (int block = 0; block < numBlocks; block++, idx--)\n\t\t\t{\n\t\t\t\tm_MesaPattern[idx].m_BlockMeta = 0;\n\t\t\t\tm_MesaPattern[idx].m_BlockType = E_BLOCK_HARDENED_CLAY;\n\t\t\t}  // for block\n\t\t}  // while (idx >= 0)\n\t}\n\n\n\n\t/** Composes a single column in a_ChunkDesc. Chooses what to do based on the biome in that column. */\n\tvoid ComposeColumn(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelZ, const Byte * a_ShapeColumn)\n\t{\n\t\t// Frequencies for the podzol floor selecting noise:\n\t\tconst NOISE_DATATYPE FrequencyX = 8;\n\t\tconst NOISE_DATATYPE FrequencyZ = 8;\n\n\t\tEMCSBiome Biome = a_ChunkDesc.GetBiome(a_RelX, a_RelZ);\n\t\tswitch (Biome)\n\t\t{\n\t\t\tcase biOcean:\n\t\t\tcase biPlains:\n\t\t\tcase biForest:\n\t\t\tcase biTaiga:\n\t\t\tcase biSwampland:\n\t\t\tcase biRiver:\n\t\t\tcase biFrozenOcean:\n\t\t\tcase biFrozenRiver:\n\t\t\tcase biIcePlains:\n\t\t\tcase biIceMountains:\n\t\t\tcase biForestHills:\n\t\t\tcase biTaigaHills:\n\t\t\tcase biExtremeHillsEdge:\n\t\t\tcase biExtremeHillsPlus:\n\t\t\tcase biExtremeHills:\n\t\t\tcase biJungle:\n\t\t\tcase biJungleHills:\n\t\t\tcase biJungleEdge:\n\t\t\tcase biDeepOcean:\n\t\t\tcase biStoneBeach:\n\t\t\tcase biColdBeach:\n\t\t\tcase biBirchForest:\n\t\t\tcase biBirchForestHills:\n\t\t\tcase biRoofedForest:\n\t\t\tcase biColdTaiga:\n\t\t\tcase biColdTaigaHills:\n\t\t\tcase biSavanna:\n\t\t\tcase biSavannaPlateau:\n\t\t\tcase biSunflowerPlains:\n\t\t\tcase biFlowerForest:\n\t\t\tcase biTaigaM:\n\t\t\tcase biSwamplandM:\n\t\t\tcase biIcePlainsSpikes:\n\t\t\tcase biJungleM:\n\t\t\tcase biJungleEdgeM:\n\t\t\tcase biBirchForestM:\n\t\t\tcase biBirchForestHillsM:\n\t\t\tcase biRoofedForestM:\n\t\t\tcase biColdTaigaM:\n\t\t\tcase biSavannaM:\n\t\t\tcase biSavannaPlateauM:\n\t\t\t{\n\t\t\t\tFillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, patGrass.Get(), a_ShapeColumn);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase biMegaTaiga:\n\t\t\tcase biMegaTaigaHills:\n\t\t\tcase biMegaSpruceTaiga:\n\t\t\tcase biMegaSpruceTaigaHills:\n\t\t\t{\n\t\t\t\t// Select the pattern to use - podzol, grass or grassless dirt:\n\t\t\t\tNOISE_DATATYPE NoiseX = (static_cast<NOISE_DATATYPE>(a_ChunkDesc.GetChunkX() * cChunkDef::Width + a_RelX)) / FrequencyX;\n\t\t\t\tNOISE_DATATYPE NoiseY = (static_cast<NOISE_DATATYPE>(a_ChunkDesc.GetChunkZ() * cChunkDef::Width + a_RelZ)) / FrequencyZ;\n\t\t\t\tNOISE_DATATYPE Val = m_OceanFloorSelect.CubicNoise2D(NoiseX, NoiseY);\n\t\t\t\tconst cPattern::BlockInfo * Pattern = (Val < -0.9) ? patGrassLess.Get() : ((Val > 0) ? patPodzol.Get() : patGrass.Get());\n\t\t\t\tFillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, Pattern, a_ShapeColumn);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase biDesertHills:\n\t\t\tcase biDesert:\n\t\t\tcase biDesertM:\n\t\t\tcase biBeach:\n\t\t\t{\n\t\t\t\tFillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, patSand.Get(), a_ShapeColumn);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase biMushroomIsland:\n\t\t\tcase biMushroomShore:\n\t\t\t{\n\t\t\t\tFillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, patMycelium.Get(), a_ShapeColumn);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase biMesa:\n\t\t\tcase biMesaPlateauF:\n\t\t\tcase biMesaPlateau:\n\t\t\tcase biMesaBryce:\n\t\t\tcase biMesaPlateauFM:\n\t\t\tcase biMesaPlateauM:\n\t\t\t{\n\t\t\t\t// Mesa biomes need special handling, because they don't follow the usual \"4 blocks from top pattern\",\n\t\t\t\t// instead, they provide a \"from bottom\" pattern with varying base height,\n\t\t\t\t// usually 4 blocks below the ocean level\n\t\t\t\tFillColumnMesa(a_ChunkDesc, a_RelX, a_RelZ, a_ShapeColumn);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase biExtremeHillsPlusM:\n\t\t\tcase biExtremeHillsM:\n\t\t\t{\n\t\t\t\t// Select the pattern to use - gravel, stone or grass:\n\t\t\t\tNOISE_DATATYPE NoiseX = (static_cast<NOISE_DATATYPE>(a_ChunkDesc.GetChunkX() * cChunkDef::Width + a_RelX)) / FrequencyX;\n\t\t\t\tNOISE_DATATYPE NoiseY = (static_cast<NOISE_DATATYPE>(a_ChunkDesc.GetChunkZ() * cChunkDef::Width + a_RelZ)) / FrequencyZ;\n\t\t\t\tNOISE_DATATYPE Val = m_OceanFloorSelect.CubicNoise2D(NoiseX, NoiseY);\n\t\t\t\tconst cPattern::BlockInfo * Pattern = (Val < 0.0) ? patStone.Get() : patGrass.Get();\n\t\t\t\tFillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, Pattern, a_ShapeColumn);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase biInvalidBiome:\n\t\t\tcase biNether:\n\t\t\tcase biEnd:\n\t\t\tcase biNumBiomes:\n\t\t\tcase biVariant:\n\t\t\tcase biNumVariantBiomes:\n\t\t\t{\n\t\t\t\t// This generator is not supposed to be used for these biomes, but it has to produce *something*\n\t\t\t\t// so let's produce stone:\n\t\t\t\tFillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, patStone.Get(), a_ShapeColumn);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}  // switch (Biome)\n\t}\n\n\n\n\t/** Fills the specified column with the specified pattern; restarts the pattern when air is reached,\n\tswitches to ocean floor pattern if ocean is reached. Always adds bedrock at the very bottom. */\n\tvoid FillColumnPattern(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelZ, const cPattern::BlockInfo * a_Pattern, const Byte * a_ShapeColumn)\n\t{\n\t\tbool HasHadWater = false;\n\t\tint PatternIdx = 0;\n\t\tHEIGHTTYPE top = a_ChunkDesc.GetHeight(a_RelX, a_RelZ);\n\t\tif (top < m_SeaLevel)\n\t\t{\n\t\t\ttop = m_SeaLevel;\n\t\t\ta_ChunkDesc.SetHeight(a_RelX, a_RelZ, top - 1);\n\t\t}\n\t\tfor (int y = top; y > 0; y--)\n\t\t{\n\t\t\tif (a_ShapeColumn[y] > 0)\n\t\t\t{\n\t\t\t\t// \"ground\" part, use the pattern:\n\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(a_RelX, y, a_RelZ, a_Pattern[PatternIdx].m_BlockType, a_Pattern[PatternIdx].m_BlockMeta);\n\t\t\t\tPatternIdx++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// \"air\" or \"water\" part:\n\t\t\t// Reset the pattern index to zero, so that the pattern is repeated from the top again:\n\t\t\tPatternIdx = 0;\n\n\t\t\tif (y >= m_SeaLevel)\n\t\t\t{\n\t\t\t\t// \"air\" part, do nothing\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ta_ChunkDesc.SetBlockType(a_RelX, y, a_RelZ, E_BLOCK_STATIONARY_WATER);\n\t\t\tif (HasHadWater)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Select the ocean-floor pattern to use:\n\t\t\tif (a_ChunkDesc.GetBiome(a_RelX, a_RelZ) == biDeepOcean)\n\t\t\t{\n\t\t\t\ta_Pattern = patGravel.Get();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ta_Pattern = ChooseOceanFloorPattern(a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ(), a_RelX, a_RelZ);\n\t\t\t}\n\t\t\tHasHadWater = true;\n\t\t}  // for y\n\t\tif (a_ShapeColumn[0] > 0)\n\t\t{\n\t\t\ta_ChunkDesc.SetBlockType(a_RelX, 0, a_RelZ, E_BLOCK_BEDROCK);\n\t\t}\n\t}\n\n\n\n\t/** Fills the specified column with mesa pattern, based on the column height */\n\tvoid FillColumnMesa(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelZ, const Byte * a_ShapeColumn)\n\t{\n\t\t// Frequencies for the clay floor noise:\n\t\tconst NOISE_DATATYPE FrequencyX = 50;\n\t\tconst NOISE_DATATYPE FrequencyZ = 50;\n\n\t\tint Top = a_ChunkDesc.GetHeight(a_RelX, a_RelZ);\n\t\tif (Top < m_SeaLevel)\n\t\t{\n\t\t\t// The terrain is below sealevel, handle as regular ocean with red sand floor:\n\t\t\tFillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, patOFOrangeClay.Get(), a_ShapeColumn);\n\t\t\treturn;\n\t\t}\n\n\t\tNOISE_DATATYPE NoiseX = (static_cast<NOISE_DATATYPE>(a_ChunkDesc.GetChunkX() * cChunkDef::Width + a_RelX)) / FrequencyX;\n\t\tNOISE_DATATYPE NoiseY = (static_cast<NOISE_DATATYPE>(a_ChunkDesc.GetChunkZ() * cChunkDef::Width + a_RelZ)) / FrequencyZ;\n\t\tint ClayFloor = m_SeaLevel - 6 + static_cast<int>(4.f * m_MesaFloor.CubicNoise2D(NoiseX, NoiseY));\n\t\tif (ClayFloor >= Top)\n\t\t{\n\t\t\tClayFloor = Top - 1;\n\t\t}\n\n\t\tif (Top - m_SeaLevel < 5)\n\t\t{\n\t\t\t// Simple case: top is red sand, then hardened clay down to ClayFloor, then stone:\n\t\t\ta_ChunkDesc.SetBlockTypeMeta(a_RelX, Top, a_RelZ, E_BLOCK_SAND, E_META_SAND_RED);\n\t\t\tfor (int y = Top - 1; y >= ClayFloor; y--)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(a_RelX, y, a_RelZ, E_BLOCK_HARDENED_CLAY);\n\t\t\t}\n\t\t\tfor (int y = ClayFloor - 1; y > 0; y--)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(a_RelX, y, a_RelZ, E_BLOCK_STONE);\n\t\t\t}\n\t\t\ta_ChunkDesc.SetBlockType(a_RelX, 0, a_RelZ, E_BLOCK_BEDROCK);\n\t\t\treturn;\n\t\t}\n\n\t\t// Difficult case: use the mesa pattern and watch for overhangs:\n\t\tint PatternIdx = cChunkDef::Height - (Top - ClayFloor);  // We want the block at index ClayFloor to be pattern's 256th block (first stone)\n\t\tconst cPattern::BlockInfo * Pattern = m_MesaPattern;\n\t\tbool HasHadWater = false;\n\t\tfor (int y = Top; y > 0; y--)\n\t\t{\n\t\t\tif (a_ShapeColumn[y] > 0)\n\t\t\t{\n\t\t\t\t// \"ground\" part, use the pattern:\n\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(a_RelX, y, a_RelZ, Pattern[PatternIdx].m_BlockType, Pattern[PatternIdx].m_BlockMeta);\n\t\t\t\tPatternIdx++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (y >= m_SeaLevel)\n\t\t\t{\n\t\t\t\t// \"air\" part, do nothing\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// \"water\" part, fill with water and choose new pattern for ocean floor, if not chosen already:\n\t\t\tPatternIdx = 0;\n\t\t\ta_ChunkDesc.SetBlockType(a_RelX, y, a_RelZ, E_BLOCK_STATIONARY_WATER);\n\t\t\tif (HasHadWater)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Select the ocean-floor pattern to use:\n\t\t\tPattern = ChooseOceanFloorPattern(a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ(), a_RelX, a_RelZ);\n\t\t\tHasHadWater = true;\n\t\t}  // for y\n\t\ta_ChunkDesc.SetBlockType(a_RelX, 0, a_RelZ, E_BLOCK_BEDROCK);\n\n\t\tEMCSBiome MesaVersion = a_ChunkDesc.GetBiome(a_RelX, a_RelZ);\n\t\tif ((MesaVersion == biMesaPlateauF) || (MesaVersion == biMesaPlateauFM))\n\t\t{\n\t\t\tif (Top < 95 + static_cast<int>(m_MesaFloor.CubicNoise2D(NoiseY * 2, NoiseX * 2) * 6))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tBLOCKTYPE Block = (m_MesaFloor.CubicNoise2D(NoiseX * 4, NoiseY * 4) < 0) ? E_BLOCK_DIRT : E_BLOCK_GRASS;\n\t\t\tNIBBLETYPE Meta = (Block == E_BLOCK_GRASS) ? 0 : 1;\n\n\t\t\ta_ChunkDesc.SetBlockTypeMeta(a_RelX, Top, a_RelZ, Block, Meta);\n\t\t}\n\t}\n\n\n\n\t/** Returns the pattern to use for an ocean floor in the specified column.\n\tThe returned pattern is guaranteed to be 256 blocks long. */\n\tconst cPattern::BlockInfo * ChooseOceanFloorPattern(int a_ChunkX, int a_ChunkZ, int a_RelX, int a_RelZ)\n\t{\n\t\t// Frequencies for the ocean floor selecting noise:\n\t\tconst NOISE_DATATYPE FrequencyX = 3;\n\t\tconst NOISE_DATATYPE FrequencyZ = 3;\n\n\t\t// Select the ocean-floor pattern to use:\n\t\tNOISE_DATATYPE NoiseX = (static_cast<NOISE_DATATYPE>(a_ChunkX * cChunkDef::Width + a_RelX)) / FrequencyX;\n\t\tNOISE_DATATYPE NoiseY = (static_cast<NOISE_DATATYPE>(a_ChunkZ * cChunkDef::Width + a_RelZ)) / FrequencyZ;\n\t\tNOISE_DATATYPE Val = m_OceanFloorSelect.CubicNoise2D(NoiseX, NoiseY);\n\t\tif (Val < -0.95)\n\t\t{\n\t\t\treturn patOFClay.Get();\n\t\t}\n\t\telse if (Val < 0)\n\t\t{\n\t\t\treturn patOFSand.Get();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn patDirt.Get();\n\t\t}\n\t}\n} ;\n\n\n\n\n\nstd::unique_ptr<cTerrainCompositionGen> CreateCompoGenBiomal(int a_Seed)\n{\n\treturn std::make_unique<cCompoGenBiomal>(a_Seed);\n}\n"
  },
  {
    "path": "src/Generating/CompoGenBiomal.h",
    "content": "\n// CompoGenBiomal.h\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n\n\n\n\n\n/** Returns a new instance of the Biomal composition generator. */\nstd::unique_ptr<cTerrainCompositionGen> CreateCompoGenBiomal(int a_Seed);\n"
  },
  {
    "path": "src/Generating/ComposableGenerator.cpp",
    "content": "\n// ComposableGenerator.cpp\n\n// Implements the cComposableGenerator class representing the chunk generator that takes the composition approach to generating chunks\n\n#include \"Globals.h\"\n\n#include \"ComposableGenerator.h\"\n#include \"../IniFile.h\"\n\n// Individual composed algorithms:\n#include \"BioGen.h\"\n#include \"HeiGen.h\"\n#include \"CompoGen.h\"\n#include \"StructGen.h\"\n#include \"FinishGen.h\"\n\n#include \"CompoGenBiomal.h\"\n\n#include \"CompositedHeiGen.h\"\n\n#include \"Caves.h\"\n#include \"DistortedHeightmap.h\"\n#include \"DungeonRoomsFinisher.h\"\n#include \"EndGen.h\"\n#include \"EnderDragonFightStructuresGen.h\"\n#include \"MineShafts.h\"\n#include \"Noise3DGenerator.h\"\n#include \"Ravines.h\"\n#include \"RoughRavines.h\"\n#include \"SinglePieceStructuresGen.h\"\n#include \"VillageGen.h\"\n#include \"PieceStructuresGen.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cTerrainCompositionGen:\n\nstd::unique_ptr<cTerrainCompositionGen> cTerrainCompositionGen::CreateCompositionGen(\n\tcIniFile & a_IniFile,\n\tcBiomeGen & a_BiomeGen,\n\tcTerrainShapeGen & a_ShapeGen,\n\tint a_Seed\n)\n{\n\tAString CompoGenName = a_IniFile.GetValue(\"Generator\", \"CompositionGen\");\n\tif (CompoGenName.empty())\n\t{\n\t\tLOGWARN(\"[Generator] CompositionGen value not set in world.ini, using \\\"Biomal\\\".\");\n\t\tCompoGenName = \"Biomal\";\n\t}\n\n\t// Compositor list is alpha-sorted\n\tstd::unique_ptr<cTerrainCompositionGen> res;\n\tif (NoCaseCompare(CompoGenName, \"Biomal\") == 0)\n\t{\n\t\tres = CreateCompoGenBiomal(a_Seed);\n\t}\n\telse if (NoCaseCompare(CompoGenName, \"BiomalNoise3D\") == 0)\n\t{\n\t\t// The composition that used to be provided with BiomalNoise3D is now provided by the Biomal compositor:\n\t\tres = CreateCompoGenBiomal(a_Seed);\n\t}\n\telse if (NoCaseCompare(CompoGenName, \"Classic\") == 0)\n\t{\n\t\tres = std::make_unique<cCompoGenClassic>();\n\t}\n\telse if (NoCaseCompare(CompoGenName, \"DebugBiomes\") == 0)\n\t{\n\t\tres = std::make_unique<cCompoGenDebugBiomes>();\n\t}\n\telse if (NoCaseCompare(CompoGenName, \"DistortedHeightmap\") == 0)\n\t{\n\t\t// The composition that used to be provided with DistortedHeightmap is now provided by the Biomal compositor:\n\t\tres = CreateCompoGenBiomal(a_Seed);\n\t}\n\telse if (NoCaseCompare(CompoGenName, \"End\") == 0)\n\t{\n\t\tres = std::make_unique<cEndGen>(a_Seed);\n\t}\n\telse if (NoCaseCompare(CompoGenName, \"Nether\") == 0)\n\t{\n\t\tres = std::make_unique<cCompoGenNether>(a_Seed);\n\t}\n\telse if (NoCaseCompare(CompoGenName, \"Noise3D\") == 0)\n\t{\n\t\t// The composition that used to be provided with Noise3D is now provided by the Biomal compositor:\n\t\tres = CreateCompoGenBiomal(a_Seed);\n\t}\n\telse if (NoCaseCompare(CompoGenName, \"SameBlock\") == 0)\n\t{\n\t\tres = std::make_unique<cCompoGenSameBlock>();\n\t}\n\telse\n\t{\n\t\tLOGWARN(\"Unknown CompositionGen \\\"%s\\\", using \\\"Biomal\\\" instead.\", CompoGenName.c_str());\n\t\ta_IniFile.SetValue(\"Generator\", \"CompositionGen\", \"Biomal\");\n\t\treturn CreateCompositionGen(a_IniFile, a_BiomeGen, a_ShapeGen, a_Seed);\n\t}\n\tASSERT(res != nullptr);\n\n\t// Read the settings from the ini file:\n\tres->InitializeCompoGen(a_IniFile);\n\n\treturn res;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cComposableGenerator:\n\ncComposableGenerator::cComposableGenerator():\n\tm_BiomeGen(),\n\tm_ShapeGen(),\n\tm_CompositionGen()\n{\n}\n\n\n\n\n\nvoid cComposableGenerator::Initialize(cIniFile & a_IniFile)\n{\n\tSuper::Initialize(a_IniFile);\n\n\t// Add the defaults, if they're not overridden:\n\tInitializeGeneratorDefaults(a_IniFile, m_Dimension);\n\n\tInitBiomeGen(a_IniFile);\n\tInitShapeGen(a_IniFile);\n\tInitCompositionGen(a_IniFile);\n\tInitFinishGens(a_IniFile);\n}\n\n\n\n\n\nvoid cComposableGenerator::GenerateBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tif (m_BiomeGen != nullptr)  // Quick fix for generator deinitializing before the world storage finishes loading\n\t{\n\t\tm_BiomeGen->GenBiomes(a_ChunkCoords, a_BiomeMap);\n\t}\n}\n\n\n\n\n\nvoid cComposableGenerator::Generate(cChunkDesc & a_ChunkDesc)\n{\n\tif (a_ChunkDesc.IsUsingDefaultBiomes())\n\t{\n\t\tm_BiomeGen->GenBiomes(a_ChunkDesc.GetChunkCoords(), a_ChunkDesc.GetBiomeMap());\n\t}\n\n\tcChunkDesc::Shape shape;\n\tif (a_ChunkDesc.IsUsingDefaultHeight())\n\t{\n\t\tm_ShapeGen->GenShape(a_ChunkDesc.GetChunkCoords(), shape);\n\t\ta_ChunkDesc.SetHeightFromShape(shape);\n\t}\n\telse\n\t{\n\t\t// Convert the heightmap in a_ChunkDesc into shape:\n\t\ta_ChunkDesc.GetShapeFromHeight(shape);\n\t}\n\n\tbool ShouldUpdateHeightmap = false;\n\tif (a_ChunkDesc.IsUsingDefaultComposition())\n\t{\n\t\tm_CompositionGen->ComposeTerrain(a_ChunkDesc, shape);\n\t}\n\n\tif (a_ChunkDesc.IsUsingDefaultFinish())\n\t{\n\t\tfor (const auto & Finisher : m_FinishGens)\n\t\t{\n\t\t\tFinisher->GenFinish(a_ChunkDesc);\n\t\t}\n\t\tShouldUpdateHeightmap = true;\n\t}\n\n\tif (ShouldUpdateHeightmap)\n\t{\n\t\ta_ChunkDesc.UpdateHeightmap();\n\t}\n}\n\n\n\n\n\nvoid cComposableGenerator::InitializeGeneratorDefaults(cIniFile & a_IniFile, eDimension a_Dimension)\n{\n\tswitch (a_Dimension)\n\t{\n\t\tcase dimOverworld:\n\t\t{\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"BiomeGen\",       \"Grown\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"ShapeGen\",       \"BiomalNoise3D\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"CompositionGen\", \"Biomal\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"Finishers\",\n\t\t\t\t\"RoughRavines, \"\n\t\t\t\t\"WormNestCaves, \"\n\t\t\t\t\"WaterLakes, \"\n\t\t\t\t\"WaterSprings, \"\n\t\t\t\t\"LavaLakes, \"\n\t\t\t\t\"LavaSprings, \"\n\t\t\t\t\"OreNests, \"\n\t\t\t\t\"Mineshafts, \"\n\t\t\t\t\"Trees, \"\n\t\t\t\t\"Villages, \"\n\t\t\t\t\"SinglePieceStructures: JungleTemple|WitchHut|DesertPyramid|DesertWell, \"\n\t\t\t\t\"TallGrass, \"\n\t\t\t\t\"SprinkleFoliage, \"\n\t\t\t\t\"Ice, \"\n\t\t\t\t\"Snow, \"\n\t\t\t\t\"Lilypads, \"\n\t\t\t\t\"BottomLava, \"\n\t\t\t\t\"DeadBushes, \"\n\t\t\t\t\"NaturalPatches, \"\n\t\t\t\t\"PreSimulator, \"\n\t\t\t\t\"Animals, \"\n\t\t\t\t\"OverworldClumpFlowers, \"\n\t\t\t\t\"ForestRocks\"\n\t\t\t);\n\t\t\tbreak;\n\t\t}  // dimOverworld\n\n\t\tcase dimNether:\n\t\t{\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"Generator\",        \"Composable\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"BiomeGen\",         \"Constant\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"ConstantBiome\",    \"Nether\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"ShapeGen\",         \"HeightMap\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"HeightGen\",        \"Flat\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"FlatHeight\",       \"128\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"CompositionGen\",   \"Nether\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"Finishers\",\n\t\t\t\t\"SoulsandRims, \"\n\t\t\t\t\"WormNestCaves, \"\n\t\t\t\t\"BottomLava, \"\n\t\t\t\t\"LavaSprings, \"\n\t\t\t\t\"NetherClumpFoliage, \"\n\t\t\t\t\"NetherOreNests, \"\n\t\t\t\t\"PieceStructures: NetherFort, \"\n\t\t\t\t\"GlowStone, \"\n\t\t\t\t\"PreSimulator\");\n\t\t\tbreak;\n\t\t}  // dimNether\n\n\t\tcase dimEnd:\n\t\t{\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"BiomeGen\",       \"Constant\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"ConstantBiome\",  \"End\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"ShapeGen\",       \"End\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"CompositionGen\", \"End\");\n\t\t\ta_IniFile.GetValueSet(\"Generator\", \"Finishers\",      \"EnderDragonFightStructures\");\n\t\t\tbreak;\n\t\t}  // dimEnd\n\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unhandled dimension\");\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cComposableGenerator::InitBiomeGen(cIniFile & a_IniFile)\n{\n\tbool CacheOffByDefault = false;\n\tm_BiomeGen = cBiomeGen::CreateBiomeGen(a_IniFile, m_Seed, CacheOffByDefault);\n\n\t// Add a cache, if requested:\n\t// The default is 16 * 128 caches, which is 2 MiB of RAM. Reasonable, for the amount of work this is saving.\n\tint CacheSize = a_IniFile.GetValueSetI(\"Generator\", \"BiomeGenCacheSize\", CacheOffByDefault ? 0 : 16);\n\tif (CacheSize <= 0)\n\t{\n\t\treturn;\n\t}\n\tint MultiCacheLength = a_IniFile.GetValueSetI(\"Generator\", \"BiomeGenMultiCacheLength\", 128);\n\tif (CacheSize < 4)\n\t{\n\t\tLOGWARNING(\"Biomegen cache size set too low, would hurt performance instead of helping. Increasing from %d to %d\",\n\t\t\tCacheSize, 4\n\t\t);\n\t\tCacheSize = 4;\n\t}\n\tLOGD(\"Using a cache for biomegen of size %d.\", CacheSize);\n\tif (MultiCacheLength > 0)\n\t{\n\t\tLOGD(\"Enabling multicache for biomegen of length %d.\", MultiCacheLength);\n\t\tm_BiomeGen = std::make_unique<cBioGenMulticache>(std::move(m_BiomeGen), static_cast<size_t>(CacheSize), static_cast<size_t>(MultiCacheLength));\n\t}\n\telse\n\t{\n\t\tm_BiomeGen = std::make_unique<cBioGenMulticache>(std::move(m_BiomeGen), static_cast<size_t>(CacheSize), 1);\n\t}\n}\n\n\n\n\n\nvoid cComposableGenerator::InitShapeGen(cIniFile & a_IniFile)\n{\n\tbool CacheOffByDefault = false;\n\tm_ShapeGen = cTerrainShapeGen::CreateShapeGen(\n\t\ta_IniFile,\n\t\t*m_BiomeGen,\n\t\tm_Seed,\n\t\tCacheOffByDefault\n\t);\n\n\t/*\n\t// TODO\n\t// Add a cache, if requested:\n\tint CacheSize = a_IniFile.GetValueSetI(\"Generator\", \"ShapeGenCacheSize\", CacheOffByDefault ? 0 : 64);\n\tif (CacheSize > 0)\n\t{\n\t\tif (CacheSize < 4)\n\t\t{\n\t\t\tLOGWARNING(\"Heightgen cache size set too low, would hurt performance instead of helping. Increasing from %d to %d\",\n\t\t\t\tCacheSize, 4\n\t\t\t);\n\t\t\tCacheSize = 4;\n\t\t}\n\t\tLOGD(\"Using a cache for Heightgen of size %d.\", CacheSize);\n\t\tm_HeightGen = cTerrainHeightGenPtr(new cHeiGenCache(m_HeightGen, CacheSize));\n\t}\n\t*/\n}\n\n\n\n\n\nvoid cComposableGenerator::InitCompositionGen(cIniFile & a_IniFile)\n{\n\tm_CompositionGen = cTerrainCompositionGen::CreateCompositionGen(\n\t\ta_IniFile,\n\t\t*m_BiomeGen,\n\t\t*m_ShapeGen,\n\t\tm_Seed\n\t);\n\n\t// Add a cache over the composition generator:\n\t// Even a cache of size 1 is useful due to the CompositedHeiGen cache after us doing re-composition on its misses\n\tint CompoGenCacheSize = a_IniFile.GetValueSetI(\"Generator\", \"CompositionGenCacheSize\", 64);\n\tif (CompoGenCacheSize > 0)\n\t{\n\t\tm_CompositionGen = std::make_unique<cCompoGenCache>(std::move(m_CompositionGen), CompoGenCacheSize);\n\t}\n\n\t// Create a cache of the composited heightmaps, so that finishers may use it:\n\tm_CompositedHeightCache = std::make_unique<cHeiGenMultiCache>(std::make_unique<cCompositedHeiGen>(*m_BiomeGen, *m_ShapeGen, *m_CompositionGen), 16, 128);\n\t// 128 subcaches of depth 16 each = 0.5 MiB of RAM. Acceptable, for the amount of work this saves.\n}\n\n\n\n\n\nvoid cComposableGenerator::InitFinishGens(cIniFile & a_IniFile)\n{\n\tauto seaLevel = a_IniFile.GetValueI(\"Generator\", \"SeaLevel\");\n\n\tAString Finishers = a_IniFile.GetValue(\"Generator\", \"Finishers\");\n\n\t// Create all requested finishers:\n\tAStringVector Str = StringSplitAndTrim(Finishers, \",\");\n\tfor (AStringVector::const_iterator itr = Str.begin(); itr != Str.end(); ++itr)\n\t{\n\t\tauto split = StringSplitAndTrim(*itr, \":\");\n\t\tif (split.empty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tconst auto & finisher = split[0];\n\t\t// Finishers, alpha-sorted:\n\t\tif (NoCaseCompare(finisher, \"Animals\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenPassiveMobs>(m_Seed, a_IniFile, m_Dimension));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"BottomLava\") == 0)\n\t\t{\n\t\t\tint DefaultBottomLavaLevel = (m_Dimension == dimNether) ? 30 : 10;\n\t\t\tint BottomLavaLevel = a_IniFile.GetValueSetI(\"Generator\", \"BottomLavaLevel\", DefaultBottomLavaLevel);\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenBottomLava>(BottomLavaLevel));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"DeadBushes\") == 0)\n\t\t{\n\t\t\t// A list with all the allowed biomes.\n\t\t\tcFinishGenSingleTopBlock::BiomeList AllowedBiomes;\n\t\t\tAllowedBiomes.push_back(biDesert);\n\t\t\tAllowedBiomes.push_back(biDesertHills);\n\t\t\tAllowedBiomes.push_back(biDesertM);\n\t\t\tAllowedBiomes.push_back(biMesa);\n\t\t\tAllowedBiomes.push_back(biMesaBryce);\n\t\t\tAllowedBiomes.push_back(biMesaPlateau);\n\t\t\tAllowedBiomes.push_back(biMesaPlateauF);\n\t\t\tAllowedBiomes.push_back(biMesaPlateauFM);\n\t\t\tAllowedBiomes.push_back(biMesaPlateauM);\n\t\t\tAllowedBiomes.push_back(biMegaTaiga);\n\n\t\t\t// A list with all the allowed blocks that can be below the dead bush.\n\t\t\tcFinishGenSingleTopBlock::BlockList AllowedBlocks;\n\t\t\tAllowedBlocks.push_back(E_BLOCK_SAND);\n\t\t\tAllowedBlocks.push_back(E_BLOCK_HARDENED_CLAY);\n\t\t\tAllowedBlocks.push_back(E_BLOCK_STAINED_CLAY);\n\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenSingleTopBlock>(m_Seed, E_BLOCK_DEAD_BUSH, AllowedBiomes, 2, AllowedBlocks));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"DirectOverhangs\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenDirectOverhangs>(m_Seed));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"DirtPockets\") == 0)\n\t\t{\n\t\t\tauto Gen = std::make_unique<cFinishGenOrePockets>(m_Seed + 1, cFinishGenOrePockets::DefaultNaturalPatches());\n\t\t\tGen->Initialize(a_IniFile, \"DirtPockets\");\n\t\t\tm_FinishGens.push_back(std::move(Gen));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"DistortedMembraneOverhangs\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenDistortedMembraneOverhangs>(m_Seed));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"DualRidgeCaves\") == 0)\n\t\t{\n\t\t\tfloat Threshold = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"DualRidgeCavesThreshold\", 0.3));\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenDualRidgeCaves>(m_Seed, Threshold));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"DungeonRooms\") == 0)\n\t\t{\n\t\t\tint     GridSize      = a_IniFile.GetValueSetI(\"Generator\", \"DungeonRoomsGridSize\", 48);\n\t\t\tint     MaxSize       = a_IniFile.GetValueSetI(\"Generator\", \"DungeonRoomsMaxSize\", 7);\n\t\t\tint     MinSize       = a_IniFile.GetValueSetI(\"Generator\", \"DungeonRoomsMinSize\", 5);\n\t\t\tAString HeightDistrib = a_IniFile.GetValueSet (\"Generator\", \"DungeonRoomsHeightDistrib\", \"0, 0; 10, 10; 11, 500; 40, 500; 60, 40; 90, 1\");\n\t\t\tm_FinishGens.push_back(std::make_unique<cDungeonRoomsFinisher>(*m_ShapeGen, m_Seed, GridSize, MaxSize, MinSize, HeightDistrib));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"EnderDragonFightStructures\") == 0)\n\t\t{\n\t\t\tAString Pillars = a_IniFile.GetValueSet(\"Generator\", \"ObsidianPillars\",\n\t\t\t\t\"76|3|false; 79|3|true; 82|3|true; \"\n\t\t\t\t\"85|4|false; 88|4|false; 91|4|false; \"\n\t\t\t\t\"94|5|false; 97|5|false; 100|5|false; \"\n\t\t\t\t\"103|6|false\");\n\t\t\tint Radius = a_IniFile.GetValueSetI(\"Generator\", \"ObsidianPillarsRadius\", 43);\n\t\t\tauto Gen = std::make_unique<cEnderDragonFightStructuresGen>(m_Seed);\n\t\t\tGen->Init(Pillars, Radius);\n\t\t\tm_FinishGens.push_back(std::move(Gen));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"ForestRocks\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenForestRocks>(m_Seed, a_IniFile));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"GlowStone\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenGlowStone>(m_Seed));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"Ice\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenIce>());\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"LavaLakes\") == 0)\n\t\t{\n\t\t\tint Probability = a_IniFile.GetValueSetI(\"Generator\", \"LavaLakesProbability\", 10);\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenLakes>(m_Seed * 5 + 16873, E_BLOCK_STATIONARY_LAVA, *m_ShapeGen, Probability));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"LavaSprings\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenFluidSprings>(m_Seed, E_BLOCK_LAVA, a_IniFile, m_Dimension));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"Lilypads\") == 0)\n\t\t{\n\t\t\t// A list with all the allowed biomes.\n\t\t\tcFinishGenSingleTopBlock::BiomeList AllowedBiomes;\n\t\t\tAllowedBiomes.push_back(biSwampland);\n\t\t\tAllowedBiomes.push_back(biSwamplandM);\n\n\t\t\t// A list with all the allowed blocks that can be below the lilypad.\n\t\t\tcFinishGenSingleTopBlock::BlockList AllowedBlocks;\n\t\t\tAllowedBlocks.push_back(E_BLOCK_WATER);\n\t\t\tAllowedBlocks.push_back(E_BLOCK_STATIONARY_WATER);\n\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenSingleTopBlock>(m_Seed, E_BLOCK_LILY_PAD, AllowedBiomes, 4, AllowedBlocks));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"MarbleCaves\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenMarbleCaves>(m_Seed));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"MineShafts\") == 0)\n\t\t{\n\t\t\tint GridSize        = a_IniFile.GetValueSetI(\"Generator\", \"MineShaftsGridSize\",        512);\n\t\t\tint MaxOffset       = a_IniFile.GetValueSetI(\"Generator\", \"MineShaftsMaxOffset\",       256);\n\t\t\tint MaxSystemSize   = a_IniFile.GetValueSetI(\"Generator\", \"MineShaftsMaxSystemSize\",   160);\n\t\t\tint ChanceCorridor  = a_IniFile.GetValueSetI(\"Generator\", \"MineShaftsChanceCorridor\",  600);\n\t\t\tint ChanceCrossing  = a_IniFile.GetValueSetI(\"Generator\", \"MineShaftsChanceCrossing\",  200);\n\t\t\tint ChanceStaircase = a_IniFile.GetValueSetI(\"Generator\", \"MineShaftsChanceStaircase\", 200);\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenMineShafts>(\n\t\t\t\tm_Seed, GridSize, MaxOffset, MaxSystemSize,\n\t\t\t\tChanceCorridor, ChanceCrossing, ChanceStaircase\n\t\t\t));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"NaturalPatches\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenOreNests>(m_Seed + 1, cFinishGenOreNests::DefaultNaturalPatches()));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"NetherClumpFoliage\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenNetherClumpFoliage>(m_Seed));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"NetherOreNests\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenOreNests>(m_Seed + 2, cFinishGenOreNests::DefaultNetherOres()));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"OreNests\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenOreNests>(m_Seed + 3, cFinishGenOreNests::DefaultOverworldOres()));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"OrePockets\") == 0)\n\t\t{\n\t\t\tauto Gen = std::make_unique<cFinishGenOrePockets>(m_Seed + 2, cFinishGenOrePockets::DefaultOverworldOres());\n\t\t\tGen->Initialize(a_IniFile, \"OrePockets\");\n\t\t\tm_FinishGens.push_back(std::move(Gen));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"OverworldClumpFlowers\") == 0)\n\t\t{\n\t\t\tauto flowers = cFinishGenClumpTopBlock::ParseIniFile(a_IniFile, \"OverworldClumpFlowers\");\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenClumpTopBlock>(m_Seed, flowers));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"PieceStructures\") == 0)\n\t\t{\n\t\t\tif (split.size() < 2)\n\t\t\t{\n\t\t\t\tLOGWARNING(\"The PieceStructures generator needs the structures to use. Example: \\\"PieceStructures: NetherFort\\\".\");\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tauto Gen = std::make_unique<cPieceStructuresGen>(m_Seed);\n\t\t\tif (Gen->Initialize(split[1], seaLevel, *m_BiomeGen, *m_CompositedHeightCache))\n\t\t\t{\n\t\t\t\tm_FinishGens.push_back(std::move(Gen));\n\t\t\t}\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"PreSimulator\") == 0)\n\t\t{\n\t\t\t// Load the settings\n\t\t\tbool PreSimulateFallingBlocks = a_IniFile.GetValueSetB(\"Generator\", \"PreSimulatorFallingBlocks\", true);\n\t\t\tbool PreSimulateWater         = a_IniFile.GetValueSetB(\"Generator\", \"PreSimulatorWater\", true);\n\t\t\tbool PreSimulateLava          = a_IniFile.GetValueSetB(\"Generator\", \"PreSimulatorLava\", true);\n\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenPreSimulator>(PreSimulateFallingBlocks, PreSimulateWater, PreSimulateLava));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"Ravines\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenRavines>(m_Seed, 128));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"RoughRavines\") == 0)\n\t\t{\n\t\t\tint GridSize                  = a_IniFile.GetValueSetI(\"Generator\", \"RoughRavinesGridSize\",              256);\n\t\t\tint MaxOffset                 = a_IniFile.GetValueSetI(\"Generator\", \"RoughRavinesMaxOffset\",             128);\n\t\t\tint MaxSize                   = a_IniFile.GetValueSetI(\"Generator\", \"RoughRavinesMaxSize\",               128);\n\t\t\tint MinSize                   = a_IniFile.GetValueSetI(\"Generator\", \"RoughRavinesMinSize\",                64);\n\t\t\tdouble MaxCenterWidth         = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMaxCenterWidth\",          8);\n\t\t\tdouble MinCenterWidth         = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMinCenterWidth\",          2);\n\t\t\tdouble MaxRoughness           = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMaxRoughness\",            0.2);\n\t\t\tdouble MinRoughness           = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMinRoughness\",            0.05);\n\t\t\tdouble MaxFloorHeightEdge     = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMaxFloorHeightEdge\",      8);\n\t\t\tdouble MinFloorHeightEdge     = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMinFloorHeightEdge\",     30);\n\t\t\tdouble MaxFloorHeightCenter   = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMaxFloorHeightCenter\",   20);\n\t\t\tdouble MinFloorHeightCenter   = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMinFloorHeightCenter\",    6);\n\t\t\tdouble MaxCeilingHeightEdge   = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMaxCeilingHeightEdge\",   56);\n\t\t\tdouble MinCeilingHeightEdge   = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMinCeilingHeightEdge\",   38);\n\t\t\tdouble MaxCeilingHeightCenter = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMaxCeilingHeightCenter\", 58);\n\t\t\tdouble MinCeilingHeightCenter = a_IniFile.GetValueSetF(\"Generator\", \"RoughRavinesMinCeilingHeightCenter\", 36);\n\t\t\tm_FinishGens.push_back(std::make_unique<cRoughRavines>(\n\t\t\t\tm_Seed, MaxSize, MinSize,\n\t\t\t\tstatic_cast<float>(MaxCenterWidth),\n\t\t\t\tstatic_cast<float>(MinCenterWidth),\n\t\t\t\tstatic_cast<float>(MaxRoughness),\n\t\t\t\tstatic_cast<float>(MinRoughness),\n\t\t\t\tstatic_cast<float>(MaxFloorHeightEdge),\n\t\t\t\tstatic_cast<float>(MinFloorHeightEdge),\n\t\t\t\tstatic_cast<float>(MaxFloorHeightCenter),\n\t\t\t\tstatic_cast<float>(MinFloorHeightCenter),\n\t\t\t\tstatic_cast<float>(MaxCeilingHeightEdge),\n\t\t\t\tstatic_cast<float>(MinCeilingHeightEdge),\n\t\t\t\tstatic_cast<float>(MaxCeilingHeightCenter),\n\t\t\t\tstatic_cast<float>(MinCeilingHeightCenter),\n\t\t\t\tGridSize, MaxOffset\n\t\t\t));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"SinglePieceStructures\") == 0)\n\t\t{\n\t\t\tif (split.size() < 2)\n\t\t\t{\n\t\t\t\tLOGWARNING(\"The SinglePieceStructures generator needs the structures to use. Example: \\\"SinglePieceStructures: DesertPyramid\\\".\");\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tauto Gen = std::make_unique<cSinglePieceStructuresGen>(m_Seed);\n\t\t\tif (Gen->Initialize(split[1], seaLevel, *m_BiomeGen, *m_CompositedHeightCache))\n\t\t\t{\n\t\t\t\tm_FinishGens.push_back(std::move(Gen));\n\t\t\t}\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"SoulsandRims\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenSoulsandRims>(m_Seed));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"Snow\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenSnow>());\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"SprinkleFoliage\") == 0)\n\t\t{\n\t\t\tint MaxCactusHeight \t= a_IniFile.GetValueI(\"Plants\", \"MaxCactusHeight\", 3);\n\t\t\tint MaxSugarcaneHeight \t= a_IniFile.GetValueI(\"Plants\", \"MaxSugarcaneHeight\", 3);\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenSprinkleFoliage>(m_Seed, MaxCactusHeight, MaxSugarcaneHeight));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"TallGrass\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenTallGrass>(m_Seed));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"Trees\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenTrees>(m_Seed, *m_BiomeGen, *m_ShapeGen, *m_CompositionGen));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"Villages\") == 0)\n\t\t{\n\t\t\tint GridSize   = a_IniFile.GetValueSetI(\"Generator\", \"VillageGridSize\",  384);\n\t\t\tint MaxOffset  = a_IniFile.GetValueSetI(\"Generator\", \"VillageMaxOffset\", 128);\n\t\t\tint MaxDepth   = a_IniFile.GetValueSetI(\"Generator\", \"VillageMaxDepth\",    2);\n\t\t\tint MaxSize    = a_IniFile.GetValueSetI(\"Generator\", \"VillageMaxSize\",   128);\n\t\t\tint MinDensity = a_IniFile.GetValueSetI(\"Generator\", \"VillageMinDensity\", 50);\n\t\t\tint MaxDensity = a_IniFile.GetValueSetI(\"Generator\", \"VillageMaxDensity\", 80);\n\t\t\tAString PrefabList = a_IniFile.GetValueSet(\"Generator\", \"VillagePrefabs\", \"PlainsVillage, SandVillage\");\n\t\t\tauto Prefabs = StringSplitAndTrim(PrefabList, \",\");\n\t\t\tm_FinishGens.push_back(std::make_unique<cVillageGen>(m_Seed, GridSize, MaxOffset, MaxDepth, MaxSize, MinDensity, MaxDensity, *m_BiomeGen, *m_CompositedHeightCache, seaLevel, Prefabs));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"Vines\") == 0)\n\t\t{\n\t\t\tint Level = a_IniFile.GetValueSetI(\"Generator\", \"VinesLevel\", 40);\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenVines>(m_Seed, Level));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"WaterLakes\") == 0)\n\t\t{\n\t\t\tint Probability = a_IniFile.GetValueSetI(\"Generator\", \"WaterLakesProbability\", 25);\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenLakes>(m_Seed * 3 + 652, E_BLOCK_STATIONARY_WATER, *m_ShapeGen, Probability));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"WaterSprings\") == 0)\n\t\t{\n\t\t\tm_FinishGens.push_back(std::make_unique<cFinishGenFluidSprings>(m_Seed, E_BLOCK_WATER, a_IniFile, m_Dimension));\n\t\t}\n\t\telse if (NoCaseCompare(finisher, \"WormNestCaves\") == 0)\n\t\t{\n\t\t\tint Size      = a_IniFile.GetValueSetI(\"Generator\", \"WormNestCavesSize\", 64);\n\t\t\tint Grid      = a_IniFile.GetValueSetI(\"Generator\", \"WormNestCavesGrid\", 96);\n\t\t\tint MaxOffset = a_IniFile.GetValueSetI(\"Generator\", \"WormNestMaxOffset\", 32);\n\t\t\tm_FinishGens.push_back(std::make_unique<cStructGenWormNestCaves>(m_Seed, Size, Grid, MaxOffset));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLOGWARNING(\"Unknown Finisher in the [Generator] section: \\\"%s\\\". Ignoring.\", finisher.c_str());\n\t\t}\n\t}  // for itr - Str[]\n}\n"
  },
  {
    "path": "src/Generating/ComposableGenerator.h",
    "content": "\n// ComposableGenerator.h\n\n// Declares the cComposableGenerator class representing the chunk generator that takes the composition approach to generating chunks\n\n/*\nGenerating works by composing several algorithms:\nBiome, TerrainHeight, TerrainComposition, Ores, Structures and SmallFoliage\nEach algorithm may be chosen from a pool of available algorithms in the same class and combined with others,\nbased on user's preferences in the world.ini.\nSee https://forum.cuberite.org/thread-409.html for details.\n*/\n\n\n\n\n\n#pragma once\n\n#include \"ChunkGenerator.h\"\n#include \"ChunkDesc.h\"\n\n\n\n\n\n// Forward-declare the shared pointers to subgenerator classes:\nclass cBiomeGen;\nclass cTerrainShapeGen;\nclass cTerrainHeightGen;\nclass cTerrainCompositionGen;\nclass cFinishGen;\n\n\n\n\n\n/** The interface that a biome generator must implement\nA biome generator takes chunk coords on input and outputs an array of biome indices for that chunk on output.\nThe output array is sequenced in the same way as the MapChunk packet's biome data.\n*/\nclass cBiomeGen\n{\npublic:\n\tvirtual ~cBiomeGen() {}  // Force a virtual destructor in descendants\n\n\t/** Generates biomes for the given chunk */\n\tvirtual void GenBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) = 0;\n\n\t/** Reads parameters from the ini file, prepares generator for use. */\n\tvirtual void InitializeBiomeGen(cIniFile & a_IniFile) {}\n\n\t/** Creates the correct BiomeGen descendant based on the ini file settings.\n\ta_Seed is the seed read from the INI file.\n\ta_CacheOffByDefault gets set to whether the cache should be disabled by default.\n\tUsed in BiomeVisualiser, too.\n\tImplemented in BioGen.cpp! */\n\tstatic std::unique_ptr<cBiomeGen> CreateBiomeGen(\n\t\tcIniFile & a_IniFile,\n\t\tint a_Seed,\n\t\tbool & a_CacheOffByDefault\n\t);\n} ;\n\n\n\n\n\n/** The interface that a terrain shape generator must implement\nA terrain shape generator takes chunk coords on input and outputs a 3D array of \"shape\" for that chunk. The shape here\nrepresents the distinction between air and solid; there's no representation of Water since that is added by the\ncomposition geenrator.\nThe output array is indexed [y + 256 * z + 16 * 256 * x], so that it's fast to later compose a single column of the terrain,\nwhich is the dominant operation following the shape generation.\nThe generator may request biome information from the underlying BiomeGen, it may even request information for\nother chunks than the one it's currently generating (neighbors - for averaging)\n*/\nclass cTerrainShapeGen\n{\npublic:\n\tvirtual ~cTerrainShapeGen() {}  // Force a virtual destructor in descendants\n\n\t/** Generates the shape for the given chunk */\n\tvirtual void GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape) = 0;\n\n\t/** Reads parameters from the ini file, prepares generator for use. */\n\tvirtual void InitializeShapeGen(cIniFile & a_IniFile) {}\n\n\t/** Creates the correct TerrainShapeGen descendant based on the ini file settings and the seed provided.\n\ta_BiomeGen is the underlying biome generator, some shape generators may depend on it providing additional biomes data around the chunk\n\ta_CacheOffByDefault gets set to whether the cache should be disabled by default\n\tImplemented in ShapeGen.cpp!\n\t*/\n\tstatic std::unique_ptr<cTerrainShapeGen> CreateShapeGen(\n\t\tcIniFile & a_IniFile,\n\t\tcBiomeGen & a_BiomeGen,\n\t\tint a_Seed,\n\t\tbool & a_CacheOffByDefault\n\t);\n} ;\n\n\n\n\n\n/** The interface that is used to query terrain height from the shape generator.\nUsually the structure generators require only the final heightmap, and generating the whole shape only to\nconsume the heightmap is wasteful, so this interface is used instead; it has a cache implemented over it so\nthat data is retained. */\nclass cTerrainHeightGen\n{\npublic:\n\tvirtual ~cTerrainHeightGen() {}  // Force a virtual destructor in descendants\n\n\t/** Retrieves the heightmap for the specified chunk. */\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) = 0;\n\n\t/** Initializes the generator, reading its parameters from the INI file. */\n\tvirtual void InitializeHeightGen(cIniFile & a_IniFile) {}\n\n\t/** Returns the height at the specified column.\n\tThe default implementation calls GenHeightMap(), and then queries the heightmap.\n\tDescendants may provide a better-performing method. */\n\tvirtual HEIGHTTYPE GetHeightAt(int a_BlockX, int a_BlockZ)\n\t{\n\t\tauto chunkCoords = cChunkDef::BlockToChunk({a_BlockX, 0, a_BlockZ});\n\t\tcChunkDef::HeightMap heightMap;\n\t\tGenHeightMap(chunkCoords, heightMap);\n\t\treturn cChunkDef::GetHeight(heightMap, a_BlockX - chunkCoords.m_ChunkX * cChunkDef::Width, a_BlockZ - chunkCoords.m_ChunkZ * cChunkDef::Width);\n\t}\n\n\t/** Creates a cTerrainHeightGen descendant based on the INI file settings. */\n\tstatic std::unique_ptr<cTerrainHeightGen> CreateHeightGen(\n\t\tcIniFile & a_IniFile,\n\t\tcBiomeGen & a_BiomeGen,\n\t\tint a_Seed,\n\t\tbool & a_CacheOffByDefault\n\t);\n} ;\n\n\n\n\n\n/** The interface that a terrain composition generator must implement\nTerrain composition takes chunk coords on input and outputs the blockdata for that entire chunk, along with\nthe list of entities. It is supposed to make use of the underlying TerrainHeightGen and BiomeGen for that purpose,\nbut it may request information for other chunks than the one it's currently generating from them.\n*/\nclass cTerrainCompositionGen\n{\npublic:\n\tvirtual ~cTerrainCompositionGen() {}  // Force a virtual destructor in descendants\n\n\t/** Generates the chunk's composition into a_ChunkDesc, using the terrain shape provided in a_Shape.\n\tIs expected to fill a_ChunkDesc's heightmap with the data from a_Shape. */\n\tvirtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) = 0;\n\n\t/** Reads parameters from the ini file, prepares generator for use. */\n\tvirtual void InitializeCompoGen(cIniFile & a_IniFile) {}\n\n\t/** Creates the correct TerrainCompositionGen descendant based on the ini file settings and the seed provided.\n\ta_BiomeGen is the underlying biome generator, some composition generators may depend on it providing additional biomes around the chunk\n\ta_ShapeGen is the underlying shape generator, some composition generators may depend on it providing additional shape around the chunk. */\n\tstatic std::unique_ptr<cTerrainCompositionGen> CreateCompositionGen(\n\t\tcIniFile & a_IniFile,\n\t\tcBiomeGen & a_BiomeGen,\n\t\tcTerrainShapeGen & a_ShapeGen,\n\t\tint a_Seed\n\t);\n} ;\n\n\n\n\n\n/** The interface that a finisher must implement\nFinisher implements changes to the chunk after the rough terrain has been generated.\nExamples of finishers are trees, snow, ore, lilypads and others.\nNote that a worldgenerator may contain multiple finishers, chained one after another.\nAlso note that previously we used to distinguish between a structuregen and a finisher; this distinction is\nno longer relevant, all structure generators are considered finishers now (#398)\n*/\nclass cFinishGen\n{\npublic:\n\tvirtual ~cFinishGen() {}  // Force a virtual destructor in descendants\n\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) = 0;\n} ;\n\n\n\n\n\nclass cComposableGenerator:\n\tpublic cChunkGenerator\n{\n\tusing Super = cChunkGenerator;\n\npublic:\n\n\tcComposableGenerator();\n\n\t// cChunkGenerator::cGenerator overrides:\n\tvirtual void Initialize(cIniFile & a_IniFile) override;\n\tvirtual void GenerateBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void Generate(cChunkDesc & a_ChunkDesc) override;\n\n\t/** If there's no particular sub-generator set in the INI file,\n\tadds the default one, based on the dimension. */\n\tstatic void InitializeGeneratorDefaults(cIniFile & a_IniFile, eDimension a_Dimension);\n\n\nprotected:\n\n\t// The generator's composition:\n\t/** The biome generator. */\n\tstd::unique_ptr<cBiomeGen> m_BiomeGen;\n\n\t/** The terrain shape generator. */\n\tstd::unique_ptr<cTerrainShapeGen> m_ShapeGen;\n\n\t/** The terrain composition generator. */\n\tstd::unique_ptr<cTerrainCompositionGen> m_CompositionGen;\n\n\t/** The cache for the heights of the composited terrain. */\n\tstd::unique_ptr<cTerrainHeightGen> m_CompositedHeightCache;\n\n\t/** The finisher generators, in the order in which they are applied. */\n\tstd::vector<std::unique_ptr<cFinishGen>> m_FinishGens;\n\n\n\t/** Reads the BiomeGen settings from the ini and initializes m_BiomeGen accordingly */\n\tvoid InitBiomeGen(cIniFile & a_IniFile);\n\n\t/** Reads the ShapeGen settings from the ini and initializes m_ShapeGen accordingly */\n\tvoid InitShapeGen(cIniFile & a_IniFile);\n\n\t/** Reads the CompositionGen settings from the ini and initializes m_CompositionGen accordingly */\n\tvoid InitCompositionGen(cIniFile & a_IniFile);\n\n\t/** Reads the finishers from the ini and initializes m_FinishGens accordingly */\n\tvoid InitFinishGens(cIniFile & a_IniFile);\n} ;\n"
  },
  {
    "path": "src/Generating/CompositedHeiGen.h",
    "content": "\n// CompositedHeiGen.h\n\n// Declares the cCompositedHeiGen class representing a cTerrainHeightGen descendant that calculates heightmap of the composited terrain\n// This is used to further cache heightmaps for chunks already generated for finishers that require only heightmap information\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n\n\n\n\n\nclass cCompositedHeiGen:\n\tpublic cTerrainHeightGen\n{\npublic:\n\tcCompositedHeiGen(cBiomeGen & a_BiomeGen, cTerrainShapeGen & a_ShapeGen, cTerrainCompositionGen & a_CompositionGen):\n\t\tm_BiomeGen(a_BiomeGen),\n\t\tm_ShapeGen(a_ShapeGen),\n\t\tm_CompositionGen(a_CompositionGen)\n\t{\n\t}\n\n\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override\n\t{\n\t\tcChunkDesc::Shape shape;\n\t\tm_ShapeGen.GenShape(a_ChunkCoords, shape);\n\t\tcChunkDesc desc(a_ChunkCoords);\n\t\tm_BiomeGen.GenBiomes(a_ChunkCoords, desc.GetBiomeMap());  // Need to initialize biomes for the composition gen\n\t\tdesc.SetHeightFromShape(shape);\n\t\tm_CompositionGen.ComposeTerrain(desc, shape);\n\t\tmemcpy(a_HeightMap, desc.GetHeightMap(), sizeof(a_HeightMap));\n\t}\n\nprotected:\n\tcBiomeGen & m_BiomeGen;\n\tcTerrainShapeGen & m_ShapeGen;\n\tcTerrainCompositionGen & m_CompositionGen;\n};\n"
  },
  {
    "path": "src/Generating/DistortedHeightmap.cpp",
    "content": "\n// DistortedHeightmap.cpp\n\n// Implements the cDistortedHeightmap class representing the height and composition generator capable of overhangs\n\n#include \"Globals.h\"\n\n#include \"DistortedHeightmap.h\"\n#include \"../IniFile.h\"\n#include \"../LinearUpscale.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cDistortedHeightmap:\n\n/** This table assigns a relative maximum overhang size in each direction to biomes.\nBoth numbers indicate a number which will multiply the noise value for each coord;\nthis means that you can have different-sized overhangs in each direction.\nUsually you'd want to keep both numbers the same.\nThe numbers are \"relative\", not absolute maximum; overhangs of a slightly larger size are possible\ndue to the way that noise is calculated.\n*/\nconst cDistortedHeightmap::sGenParam cDistortedHeightmap::m_GenParam[256] =\n{\n\t/* Biome              |   AmpX | AmpZ */\n\t/* biOcean            */ { 1.5f,  1.5f},\n\t/* biPlains           */ { 0.5f,  0.5f},\n\t/* biDesert           */ { 0.5f,  0.5f},\n\t/* biExtremeHills     */ {16.0f, 16.0f},\n\t/* biForest           */ { 3.0f,  3.0f},\n\t/* biTaiga            */ { 1.5f,  1.5f},\n\n\t/* biSwampland        */ { 0.0f,  0.0f},\n\t/* biRiver            */ { 0.0f,  0.0f},\n\t/* biNether           */ { 0.0f,  0.0f},  // Unused, but must be here due to indexing\n\t/* biSky              */ { 0.0f,  0.0f},  // Unused, but must be here due to indexing\n\t/* biFrozenOcean      */ { 0.0f,  0.0f},\n\t/* biFrozenRiver      */ { 0.0f,  0.0f},\n\t/* biIcePlains        */ { 0.0f,  0.0f},\n\t/* biIceMountains     */ { 8.0f,  8.0f},\n\t/* biMushroomIsland   */ { 4.0f,  4.0f},\n\t/* biMushroomShore    */ { 0.0f,  0.0f},\n\t/* biBeach            */ { 0.0f,  0.0f},\n\t/* biDesertHills      */ { 5.0f,  5.0f},\n\t/* biForestHills      */ { 6.0f,  6.0f},\n\t/* biTaigaHills       */ { 8.0f,  8.0f},\n\t/* biExtremeHillsEdge */ { 7.0f,  7.0f},\n\t/* biJungle           */ { 4.0f,  4.0f},\n\t/* biJungleHills      */ { 8.0f,  8.0f},\n\t/* biJungleEdge       */ { 3.0f,  3.0f},  // 23\n\t/* biDeepOcean        */ { 1.0f,  1.0f},  // 24\n\t/* biStoneBeach       */ { 1.0f,  1.0f},  // 25\n\t/* biColdBeach        */ { 1.0f,  1.0f},  // 26\n\t/* biBirchForest      */ { 3.0f,  3.0f},  // 27\n\t/* biBirchForestHills */ { 6.0f,  6.0f},  // 28\n\t/* biRoofedForest     */ { 3.0f,  3.0f},  // 29\n\t/* biColdTaiga        */ { 0.5f,  0.5f},  // 30\n\t/* biColdTaigaHills   */ { 4.0f,  4.0f},  // 31\n\t/* biMegaTaiga        */ { 1.0f,  1.0f},  // 32\n\t/* biMegaTaigaHills   */ { 4.0f,  4.0f},  // 33\n\t/* biExtremeHillsPlus */ {32.0f, 32.0f},  // 34  - anyone say extreme plus? Make it extreme plus, then :)\n\t/* biSavanna          */ { 2.0f,  2.0f},  // 35\n\t/* biSavannaPlateau   */ { 3.0f,  3.0f},  // 36\n\t/* biMesa             */ { 2.0f,  2.0f},  // 37\n\t/* biMesaPlateauF     */ { 2.0f,  2.0f},  // 38\n\t/* biMesaPlateau      */ { 2.0f,  2.0f},  // 39\n\n\t// biomes 40 .. 128 are unused, 89 empty placeholders here:\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 40 .. 49\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 50 .. 59\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 60 .. 69\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 70 .. 79\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 80 .. 89\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 90 .. 99\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 100 .. 109\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 110 .. 119\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},                // 120 .. 128\n\n\t// Release 1.7 biome variants:\n\t/* biSunflowerPlains      */ { 1.0f,  1.0f},  // 129\n\t/* biDesertM              */ { 1.0f,  1.0f},  // 130\n\t/* biExtremeHillsM        */ {16.0f, 16.0f},  // 131\n\t/* biFlowerForest         */ { 4.0f,  4.0f},  // 132\n\t/* biTaigaM               */ { 3.0f,  3.0f},  // 133\n\t/* biSwamplandM           */ { 0.0f,  0.0f},  // 134\n\n\t// Biomes 135 .. 139 unused, 5 empty placeholders here:\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 135 .. 139\n\n\t/* biIcePlainsSpikes      */ { 1.0f,  1.0f},  // 140\n\n\t// Biomes 141 .. 148 unused, 8 empty placeholders here:\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},  // 141 .. 148\n\n\t/* biJungleM              */ { 4.0f,  4.0f},  // 149\n\t{0.0f, 0.0f},                                 // 150\n\t/* biJungleEdgeM          */ { 3.0f,  3.0f},  // 151\n\t{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f},     // 152 .. 154\n\t/* biBirchForestM         */ { 3.0f,  3.0f},  // 155\n\t/* biBirchForestHillsM    */ { 5.0f,  5.0f},  // 156\n\t/* biRoofedForestM        */ { 2.0f,  2.0f},  // 157\n\t/* biColdTaigaM           */ { 1.0f,  1.0f},  // 158\n\t{0.0f, 0.0f},                                 // 159\n\t/* biMegaSpruceTaiga      */ { 3.0f,  3.0f},  // 160\n\t/* biMegaSpruceTaigaHills */ { 3.0f,  3.0f},  // 161\n\t/* biExtremeHillsPlusM    */ {32.0f, 32.0f},  // 162\n\t/* biSavannaM             */ { 2.0f,  2.0f},  // 163\n\t/* biSavannaPlateauM      */ { 3.0f,  3.0f},  // 164\n\t/* biMesaBryce            */ { 0.5f,  0.5f},  // 165\n\t/* biMesaPlateauFM        */ { 2.0f,  2.0f},  // 166\n\t/* biMesaPlateauM         */ { 2.0f,  2.0f},  // 167\n} ;\n\n\n\n\n\ncDistortedHeightmap::cDistortedHeightmap(int a_Seed, cBiomeGen & a_BiomeGen) :\n\tm_NoiseDistortX(a_Seed + 1000),\n\tm_NoiseDistortZ(a_Seed + 2000),\n\tm_CurChunkCoords(0x7fffffff, 0x7fffffff),  // Set impossible coords for the chunk so that it's always considered stale\n\tm_BiomeGen(a_BiomeGen),\n\tm_UnderlyingHeiGen(a_Seed, a_BiomeGen),\n\tm_HeightGen(m_UnderlyingHeiGen, 64),\n\tm_IsInitialized(false)\n{\n\tm_NoiseDistortX.AddOctave(static_cast<NOISE_DATATYPE>(1),    static_cast<NOISE_DATATYPE>(0.5));\n\tm_NoiseDistortX.AddOctave(static_cast<NOISE_DATATYPE>(0.5),  static_cast<NOISE_DATATYPE>(1));\n\tm_NoiseDistortX.AddOctave(static_cast<NOISE_DATATYPE>(0.25), static_cast<NOISE_DATATYPE>(2));\n\n\tm_NoiseDistortZ.AddOctave(static_cast<NOISE_DATATYPE>(1),    static_cast<NOISE_DATATYPE>(0.5));\n\tm_NoiseDistortZ.AddOctave(static_cast<NOISE_DATATYPE>(0.5),  static_cast<NOISE_DATATYPE>(1));\n\tm_NoiseDistortZ.AddOctave(static_cast<NOISE_DATATYPE>(0.25), static_cast<NOISE_DATATYPE>(2));\n}\n\n\n\n\n\nvoid cDistortedHeightmap::Initialize(cIniFile & a_IniFile)\n{\n\tif (m_IsInitialized)\n\t{\n\t\treturn;\n\t}\n\n\t// Read the params from the INI file:\n\tm_SeaLevel   =                 a_IniFile.GetValueSetI(\"Generator\", \"SeaLevel\",                     62);\n\tm_FrequencyX = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"DistortedHeightmapFrequencyX\", 10));\n\tm_FrequencyY = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"DistortedHeightmapFrequencyY\", 10));\n\tm_FrequencyZ = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"DistortedHeightmapFrequencyZ\", 10));\n\n\tm_IsInitialized = true;\n}\n\n\n\n\n\nvoid cDistortedHeightmap::PrepareState(cChunkCoords a_ChunkCoords)\n{\n\tif (m_CurChunkCoords == a_ChunkCoords)\n\t{\n\t\treturn;\n\t}\n\tm_CurChunkCoords = a_ChunkCoords;\n\n\n\tm_HeightGen.GenHeightMap(a_ChunkCoords, m_CurChunkHeights);\n\tUpdateDistortAmps();\n\tGenerateHeightArray();\n}\n\n\n\n\n\nvoid cDistortedHeightmap::GenerateHeightArray(void)\n{\n\t// Generate distortion noise:\n\tNOISE_DATATYPE DistortNoiseX[DIM_X * DIM_Y * DIM_Z];\n\tNOISE_DATATYPE DistortNoiseZ[DIM_X * DIM_Y * DIM_Z];\n\tNOISE_DATATYPE Workspace[DIM_X * DIM_Y * DIM_Z];\n\tNOISE_DATATYPE StartX = static_cast<NOISE_DATATYPE>(m_CurChunkCoords.m_ChunkX * cChunkDef::Width) / m_FrequencyX;\n\tNOISE_DATATYPE EndX   = static_cast<NOISE_DATATYPE>((m_CurChunkCoords.m_ChunkX + 1) * cChunkDef::Width - 1) / m_FrequencyX;\n\tNOISE_DATATYPE StartY = 0;\n\tNOISE_DATATYPE EndY   = static_cast<NOISE_DATATYPE>(257) / m_FrequencyY;\n\tNOISE_DATATYPE StartZ = static_cast<NOISE_DATATYPE>(m_CurChunkCoords.m_ChunkZ * cChunkDef::Width) / m_FrequencyZ;\n\tNOISE_DATATYPE EndZ   = static_cast<NOISE_DATATYPE>((m_CurChunkCoords.m_ChunkZ + 1) * cChunkDef::Width - 1) / m_FrequencyZ;\n\n\tm_NoiseDistortX.Generate3D(DistortNoiseX, DIM_X, DIM_Y, DIM_Z, StartX, EndX, StartY, EndY, StartZ, EndZ, Workspace);\n\tm_NoiseDistortZ.Generate3D(DistortNoiseZ, DIM_X, DIM_Y, DIM_Z, StartX, EndX, StartY, EndY, StartZ, EndZ, Workspace);\n\n\t// The distorted heightmap, before linear upscaling\n\tNOISE_DATATYPE DistHei[DIM_X * DIM_Y * DIM_Z];\n\n\t// Distort the heightmap using the distortion:\n\tfor (int z = 0; z < DIM_Z; z++)\n\t{\n\t\tint AmpIdx = z * DIM_X;\n\t\tfor (int y = 0; y < DIM_Y; y++)\n\t\t{\n\t\t\tint NoiseArrayIdx = z * DIM_X * DIM_Y + y * DIM_X;\n\t\t\tfor (int x = 0; x < DIM_X; x++)\n\t\t\t{\n\t\t\t\tNOISE_DATATYPE DistX = DistortNoiseX[NoiseArrayIdx + x] * m_DistortAmpX[AmpIdx + x];\n\t\t\t\tNOISE_DATATYPE DistZ = DistortNoiseZ[NoiseArrayIdx + x] * m_DistortAmpZ[AmpIdx + x];\n\t\t\t\tDistX += static_cast<NOISE_DATATYPE>(m_CurChunkCoords.m_ChunkX * cChunkDef::Width + x * INTERPOL_X);\n\t\t\t\tDistZ += static_cast<NOISE_DATATYPE>(m_CurChunkCoords.m_ChunkZ * cChunkDef::Width + z * INTERPOL_Z);\n\t\t\t\t// Adding 0.5 helps alleviate the interpolation artifacts\n\t\t\t\tDistHei[NoiseArrayIdx + x] = static_cast<NOISE_DATATYPE>(GetHeightmapAt(DistX, DistZ)) + static_cast<NOISE_DATATYPE>(0.5);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Upscale the distorted heightmap into full dimensions:\n\tLinearUpscale3DArray(\n\t\tDistHei, DIM_X, DIM_Y, DIM_Z,\n\t\tm_DistortedHeightmap, INTERPOL_X, INTERPOL_Y, INTERPOL_Z\n\t);\n\n\t// DEBUG: Debug3DNoise(m_DistortedHeightmap, 17, 257, 17, fmt::format(FMT_STRING(\"DistortedHeightmap_{}_{}\"), m_CurChunkX, m_CurChunkZ));\n}\n\n\n\n\n\nvoid cDistortedHeightmap::GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape)\n{\n\tPrepareState(a_ChunkCoords);\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint idx = x + 17 * 257 * z;\n\t\t\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t\t\t{\n\t\t\t\ta_Shape[y + x * 256 + z * 16 * 256] = (y < m_DistortedHeightmap[idx + y * 17]) ? 1 : 0;\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cDistortedHeightmap::InitializeShapeGen(cIniFile & a_IniFile)\n{\n\tInitialize(a_IniFile);\n}\n\n\n\n\n\nint cDistortedHeightmap::GetHeightmapAt(NOISE_DATATYPE a_X, NOISE_DATATYPE a_Z)\n{\n\tint RelX = FloorC(a_X);\n\tint RelY = 0;\n\tint RelZ = FloorC(a_Z);\n\tint ChunkX, ChunkZ;\n\tcChunkDef::AbsoluteToRelative(RelX, RelY, RelZ, ChunkX, ChunkZ);\n\n\t// If we're within the same chunk, return the pre-cached heightmap:\n\tif ((ChunkX == m_CurChunkCoords.m_ChunkX) && (ChunkZ == m_CurChunkCoords.m_ChunkZ))\n\t{\n\t\treturn cChunkDef::GetHeight(m_CurChunkHeights, RelX, RelZ);\n\t}\n\n\t// Ask the cache:\n\tHEIGHTTYPE res = 0;\n\tif (m_HeightGen.GetHeightAt(ChunkX, ChunkZ, RelX, RelZ, res))\n\t{\n\t\t// The height was in the cache\n\t\treturn res;\n\t}\n\n\t// The height is not in the cache, generate full heightmap and get it there:\n\tcChunkDef::HeightMap Heightmap;\n\tm_HeightGen.GenHeightMap({ChunkX, ChunkZ}, Heightmap);\n\treturn cChunkDef::GetHeight(Heightmap, RelX, RelZ);\n}\n\n\n\n\n\nvoid cDistortedHeightmap::UpdateDistortAmps(void)\n{\n\tBiomeNeighbors Biomes;\n\tfor (int z = -1; z <= 1; z++)\n\t{\n\t\tfor (int x = -1; x <= 1; x++)\n\t\t{\n\t\t\tm_BiomeGen.GenBiomes({m_CurChunkCoords.m_ChunkX + x, m_CurChunkCoords.m_ChunkZ + z}, Biomes[x + 1][z + 1]);\n\t\t}  // for x\n\t}  // for z\n\n\tfor (int z = 0; z < DIM_Z; z++)\n\t{\n\t\tfor (int x = 0; x < DIM_Z; x++)\n\t\t{\n\t\t\tGetDistortAmpsAt(Biomes, x * INTERPOL_X, z * INTERPOL_Z, m_DistortAmpX[x + DIM_X * z], m_DistortAmpZ[x + DIM_X * z]);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cDistortedHeightmap::GetDistortAmpsAt(BiomeNeighbors & a_Neighbors, int a_RelX, int a_RelZ, NOISE_DATATYPE & a_DistortAmpX, NOISE_DATATYPE & a_DistortAmpZ)\n{\n\t// Sum up how many biomes of each type there are in the neighborhood:\n\tint BiomeCounts[256];\n\tmemset(BiomeCounts, 0, sizeof(BiomeCounts));\n\tint Sum = 0;\n\tfor (int z = -8; z <= 8; z++)\n\t{\n\t\tint FinalZ = a_RelZ + z + cChunkDef::Width;\n\t\tint IdxZ = FinalZ / cChunkDef::Width;\n\t\tint ModZ = FinalZ % cChunkDef::Width;\n\t\tint WeightZ = 9 - abs(z);\n\t\tfor (int x = -8; x <= 8; x++)\n\t\t{\n\t\t\tint FinalX = a_RelX + x + cChunkDef::Width;\n\t\t\tint IdxX = FinalX / cChunkDef::Width;\n\t\t\tint ModX = FinalX % cChunkDef::Width;\n\t\t\tEMCSBiome Biome = cChunkDef::GetBiome(a_Neighbors[IdxX][IdxZ], ModX, ModZ);\n\t\t\tint WeightX = 9 - abs(x);\n\t\t\tBiomeCounts[Biome] += WeightX + WeightZ;\n\t\t\tSum += WeightX + WeightZ;\n\t\t}  // for x\n\t}  // for z\n\n\tif (Sum <= 0)\n\t{\n\t\t// No known biome around? Weird. Return a bogus value:\n\t\tASSERT(!\"cHeiGenBiomal: Biome sum failed, no known biome around\");\n\t\ta_DistortAmpX = 16;\n\t\ta_DistortAmpZ = 16;\n\t}\n\n\t// For each biome type that has a nonzero count, calc its amps and add it:\n\tNOISE_DATATYPE AmpX = 0;\n\tNOISE_DATATYPE AmpZ = 0;\n\tfor (size_t i = 0; i < ARRAYCOUNT(BiomeCounts); i++)\n\t{\n\t\tif (BiomeCounts[i] <= 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t/*\n\t\t// Sanity checks for biome parameters, enable them to check the biome param table in runtime (slow):\n\t\tASSERT(m_GenParam[i].m_DistortAmpX >= 0);\n\t\tASSERT(m_GenParam[i].m_DistortAmpX < 100);\n\t\tASSERT(m_GenParam[i].m_DistortAmpX >= 0);\n\t\tASSERT(m_GenParam[i].m_DistortAmpX < 100);\n\t\t*/\n\n\t\tAmpX += BiomeCounts[i] * m_GenParam[i].m_DistortAmpX;\n\t\tAmpZ += BiomeCounts[i] * m_GenParam[i].m_DistortAmpZ;\n\t}\n\ta_DistortAmpX = AmpX / Sum;\n\ta_DistortAmpZ = AmpZ / Sum;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/DistortedHeightmap.h",
    "content": "\n// DistortedHeightmap.h\n\n// Declares the cDistortedHeightmap class representing the height and composition generator capable of overhangs\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"HeiGen.h\"\n\n\n\n\n\n#define NOISE_SIZE_Y (257 + 32)\n\n\n\n\n\nclass cDistortedHeightmap :\n\tpublic cTerrainShapeGen\n{\npublic:\n\tcDistortedHeightmap(int a_Seed, cBiomeGen & a_BiomeGen);\n\nprotected:\n\ttypedef cChunkDef::BiomeMap BiomeNeighbors[3][3];\n\n\t// Linear upscaling step sizes, must be divisors of cChunkDef::Width and cChunkDef::Height, respectively:\n\tstatic const int INTERPOL_X = 8;\n\tstatic const int INTERPOL_Y = 4;\n\tstatic const int INTERPOL_Z = 8;\n\n\t// Linear upscaling buffer dimensions, calculated from the step sizes:\n\tstatic const int DIM_X = 1 +  (17 / INTERPOL_X);\n\tstatic const int DIM_Y = 1 + (257 / INTERPOL_Y);\n\tstatic const int DIM_Z = 1 +  (17 / INTERPOL_Z);\n\n\tcPerlinNoise m_NoiseDistortX;\n\tcPerlinNoise m_NoiseDistortZ;\n\n\tint m_SeaLevel;\n\tNOISE_DATATYPE m_FrequencyX;\n\tNOISE_DATATYPE m_FrequencyY;\n\tNOISE_DATATYPE m_FrequencyZ;\n\n\tcChunkCoords m_CurChunkCoords;\n\tNOISE_DATATYPE m_DistortedHeightmap[17 * 257 * 17];\n\n\t/** The bime generator to query for biomes. */\n\tcBiomeGen & m_BiomeGen;\n\n\t/** The generator that provides the base heightmap (before distortion). */\n\tcHeiGenBiomal m_UnderlyingHeiGen;\n\n\t/** Cache for m_UnderlyingHeiGen. */\n\tcHeiGenCache m_HeightGen;\n\n\t/** Heightmap for the current chunk, before distortion (from m_HeightGen). Used for optimization. */\n\tcChunkDef::HeightMap m_CurChunkHeights;\n\n\t// Per-biome terrain generator parameters:\n\tstruct sGenParam\n\t{\n\t\tNOISE_DATATYPE m_DistortAmpX;\n\t\tNOISE_DATATYPE m_DistortAmpZ;\n\t} ;\n\tstatic const sGenParam m_GenParam[256];\n\n\t// Distortion amplitudes for each direction, before linear upscaling\n\tNOISE_DATATYPE m_DistortAmpX[DIM_X * DIM_Z];\n\tNOISE_DATATYPE m_DistortAmpZ[DIM_X * DIM_Z];\n\n\t/** True if Initialize() has been called. Used to initialize-once even with multiple init entrypoints (HeiGen / CompoGen). */\n\tbool m_IsInitialized;\n\n\n\t/** Unless the LastChunk coords are equal to coords given, prepares the internal state (noise arrays, heightmap). */\n\tvoid PrepareState(cChunkCoords a_ChunkCoords);\n\n\t/** Generates the m_DistortedHeightmap array for the current chunk. */\n\tvoid GenerateHeightArray(void);\n\n\t/** Calculates the heightmap value (before distortion) at the specified (floating-point) coords. */\n\tint GetHeightmapAt(NOISE_DATATYPE a_X, NOISE_DATATYPE a_Z);\n\n\t/** Updates m_DistortAmpX/Z[] based on m_CurChunkX and m_CurChunkZ. */\n\tvoid UpdateDistortAmps(void);\n\n\t/** Calculates the X and Z distortion amplitudes based on the neighbors' biomes. */\n\tvoid GetDistortAmpsAt(BiomeNeighbors & a_Neighbors, int a_RelX, int a_RelZ, NOISE_DATATYPE & a_DistortAmpX, NOISE_DATATYPE & a_DistortAmpZ);\n\n\t/** Reads the settings from the ini file. Skips reading if already initialized. */\n\tvoid Initialize(cIniFile & a_IniFile);\n\n\n\t// cTerrainShapeGen overrides:\n\tvirtual void GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape) override;\n\tvirtual void InitializeShapeGen(cIniFile & a_IniFile) override;\n} ;\n"
  },
  {
    "path": "src/Generating/DungeonRoomsFinisher.cpp",
    "content": "\n// DungeonRoomsFinisher.cpp\n\n// Declares the cDungeonRoomsFinisher class representing the finisher that generates dungeon rooms\n\n#include \"Globals.h\"\n#include \"DungeonRoomsFinisher.h\"\n#include \"../BlockInfo.h\"\n#include \"../FastRandom.h\"\n#include \"../BlockEntities/ChestEntity.h\"\n#include \"../BlockEntities/MobSpawnerEntity.h\"\n\n\n\n\n\n/** Height, in blocks, of the internal dungeon room open space. This many air blocks Y-wise. */\nstatic const int ROOM_HEIGHT = 4;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cDungeonRoom:\n\nclass cDungeonRoom:\n\tpublic cGridStructGen::cStructure\n{\n\tusing Super = cGridStructGen::cStructure;\n\npublic:\n\n\tcDungeonRoom(\n\t\tint a_GridX, int a_GridZ,\n\t\tint a_OriginX, int a_OriginZ,\n\t\tint a_HalfSizeX, int a_HalfSizeZ,\n\t\tint a_FloorHeight,\n\t\tcNoise & a_Noise\n\t):\n\t\tSuper(a_GridX, a_GridZ, a_OriginX, a_OriginZ),\n\t\tm_StartX(a_OriginX - a_HalfSizeX),\n\t\tm_EndX(a_OriginX + a_HalfSizeX),\n\t\tm_StartZ(a_OriginZ - a_HalfSizeZ),\n\t\tm_EndZ(a_OriginZ + a_HalfSizeZ),\n\t\tm_FloorHeight(a_FloorHeight)\n\t{\n\t\t/*\n\t\tPick coords next to the wall for the chests.\n\t\tThis is done by indexing the possible coords, picking any one for the first chest\n\t\tand then picking another position for the second chest that is not adjacent to the first pos\n\t\t*/\n\t\tint rnd = a_Noise.IntNoise2DInt(a_OriginX, a_OriginZ) / 7;\n\t\tint SizeX = m_EndX - m_StartX - 1;\n\t\tint SizeZ = m_EndZ - m_StartZ - 1;\n\t\tint NumPositions = 2 * SizeX + 2 * SizeZ;\n\t\tint FirstChestPos = rnd % NumPositions;  // The corner positions are a bit more likely, but we don't mind\n\t\trnd = rnd / 512;\n\t\tint SecondChestPos = (FirstChestPos + 2 + (rnd % (NumPositions - 3))) % NumPositions;\n\t\tm_Chest1 = DecodeChestCoords(FirstChestPos,  SizeX, SizeZ);\n\t\tm_Chest2 = DecodeChestCoords(SecondChestPos, SizeX, SizeZ);\n\n\t\t// Choose what the mobspawner will spawn.\n\t\t// 25% chance for a spider, 25% for a skeleton and 50% chance to get a zombie spawer.\n\t\tint MobType = (a_Noise.IntNoise3DInt(a_OriginX, m_FloorHeight, a_OriginZ) / 7) % 100;\n\t\tif (MobType <= 25)\n\t\t{\n\t\t\tm_MonsterType = mtSkeleton;\n\t\t}\n\t\telse if (MobType <= 50)\n\t\t{\n\t\t\tm_MonsterType = mtSpider;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_MonsterType = mtZombie;\n\t\t}\n\t}\n\nprotected:\n\n\t// The X range of the room, start inclusive, end exclusive:\n\tint m_StartX, m_EndX;\n\n\t// The Z range of the room, start inclusive, end exclusive:\n\tint m_StartZ, m_EndZ;\n\n\t/** The Y coord of the floor of the room */\n\tint m_FloorHeight;\n\n\t/** The (absolute) coords of the first chest. The Y coord represents the chest's Meta value (facing). */\n\tVector3i m_Chest1;\n\n\t/** The (absolute) coords of the second chest. The Y coord represents the chest's Meta value (facing). */\n\tVector3i m_Chest2;\n\n\t/** The monster type for the mobspawner entity. */\n\teMonsterType m_MonsterType;\n\n\n\t/** Decodes the position index along the room walls into a proper 2D position for a chest.\n\tThe Y coord of the returned vector specifies the chest's meta value. */\n\tVector3i DecodeChestCoords(int a_PosIdx, int a_SizeX, int a_SizeZ)\n\t{\n\t\tif (a_PosIdx < a_SizeX)\n\t\t{\n\t\t\t// Return a coord on the ZM side of the room:\n\t\t\treturn Vector3i(m_StartX + a_PosIdx + 1, E_META_CHEST_FACING_ZP, m_StartZ + 1);\n\t\t}\n\t\ta_PosIdx -= a_SizeX;\n\t\tif (a_PosIdx < a_SizeZ)\n\t\t{\n\t\t\t// Return a coord on the XP side of the room:\n\t\t\treturn Vector3i(m_EndX - 1, E_META_CHEST_FACING_XM, m_StartZ + a_PosIdx + 1);\n\t\t}\n\t\ta_PosIdx -= a_SizeZ;\n\t\tif (a_PosIdx < a_SizeX)\n\t\t{\n\t\t\t// Return a coord on the ZP side of the room:\n\t\t\treturn Vector3i(m_StartX + a_PosIdx + 1, E_META_CHEST_FACING_ZM, m_StartZ + 1);\n\t\t}\n\t\ta_PosIdx -= a_SizeX;\n\t\t// Return a coord on the XM side of the room:\n\t\treturn Vector3i(m_StartX + 1, E_META_CHEST_FACING_XP, m_StartZ + a_PosIdx + 1);\n\t}\n\n\n\n\t/** Fills the specified area of blocks in the chunk with the specified blocktype if they are one of the overwritten block types.\n\tThe coords are absolute, start coords are inclusive, end coords are exclusive. */\n\tvoid ReplaceCuboid(cChunkDesc & a_ChunkDesc, int a_StartX, int a_StartY, int a_StartZ, int a_EndX, int a_EndY, int a_EndZ, BLOCKTYPE a_DstBlockType)\n\t{\n\t\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\tint RelStartX = Clamp(a_StartX - BlockX, 0, cChunkDef::Width);\n\t\tint RelStartZ = Clamp(a_StartZ - BlockZ, 0, cChunkDef::Width);\n\t\tint RelEndX   = Clamp(a_EndX - BlockX,   0, cChunkDef::Width);\n\t\tint RelEndZ   = Clamp(a_EndZ - BlockZ,   0, cChunkDef::Width);\n\t\tfor (int y = a_StartY; y < a_EndY; y++)\n\t\t{\n\t\t\tfor (int z = RelStartZ; z < RelEndZ; z++)\n\t\t\t{\n\t\t\t\tfor (int x = RelStartX; x < RelEndX; x++)\n\t\t\t\t{\n\t\t\t\t\tif (cBlockInfo::CanBeTerraformed(a_ChunkDesc.GetBlockType(x, y, z)))\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, a_DstBlockType);\n\t\t\t\t\t}\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for z\n\t}\n\n\n\n\t/** Fills the specified area of blocks in the chunk with a random pattern of the specified blocktypes, if they are one of the overwritten block types.\n\tThe coords are absolute, start coords are inclusive, end coords are exclusive. The first blocktype uses 75% chance, the second 25% chance. */\n\tvoid ReplaceCuboidRandom(cChunkDesc & a_ChunkDesc, int a_StartX, int a_StartY, int a_StartZ, int a_EndX, int a_EndY, int a_EndZ, BLOCKTYPE a_DstBlockType1, BLOCKTYPE a_DstBlockType2)\n\t{\n\t\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\tint RelStartX = Clamp(a_StartX - BlockX, 0, cChunkDef::Width - 1);\n\t\tint RelStartZ = Clamp(a_StartZ - BlockZ, 0, cChunkDef::Width - 1);\n\t\tint RelEndX   = Clamp(a_EndX - BlockX,   0, cChunkDef::Width);\n\t\tint RelEndZ   = Clamp(a_EndZ - BlockZ,   0, cChunkDef::Width);\n\t\tauto & rnd = GetRandomProvider();\n\t\tfor (int y = a_StartY; y < a_EndY; y++)\n\t\t{\n\t\t\tfor (int z = RelStartZ; z < RelEndZ; z++)\n\t\t\t{\n\t\t\t\tfor (int x = RelStartX; x < RelEndX; x++)\n\t\t\t\t{\n\t\t\t\t\tif (cBlockInfo::CanBeTerraformed(a_ChunkDesc.GetBlockType(x, y, z)))\n\t\t\t\t\t{\n\t\t\t\t\t\tBLOCKTYPE BlockType = rnd.RandBool(0.75) ? a_DstBlockType1 : a_DstBlockType2;\n\t\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, BlockType);\n\t\t\t\t\t}\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for z\n\t}\n\n\n\n\t/** Tries to place a chest at the specified (absolute) coords.\n\tDoes nothing if the coords are outside the chunk. */\n\tvoid TryPlaceChest(cChunkDesc & a_ChunkDesc, const Vector3i & a_Chest)\n\t{\n\t\tint RelX = a_Chest.x - a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\tint RelZ = a_Chest.z - a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\tif (\n\t\t\t(RelX < 0) || (RelX >= cChunkDef::Width) ||  // The X coord is not in this chunk\n\t\t\t(RelZ < 0) || (RelZ >= cChunkDef::Width)     // The Z coord is not in this chunk\n\t\t)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\ta_ChunkDesc.SetBlockTypeMeta(RelX, m_FloorHeight + 1, RelZ, E_BLOCK_CHEST, static_cast<NIBBLETYPE>(a_Chest.y));\n\n\t\t// Fill the chest with random loot\n\t\tstatic const cLootProbab LootProbab[] =\n\t\t{\n\t\t\t// Item,                          MinAmount, MaxAmount, Weight\n\t\t\t{ cItem(E_ITEM_GOLDEN_APPLE),        1,         1,         1 },\n\t\t\t{ cItem(E_ITEM_DIAMOND_HORSE_ARMOR), 1,         1,         1 },\n\t\t\t{ cItem(E_ITEM_GOLD_HORSE_ARMOR),    1,         1,         2 },\n\t\t\t{ cItem(E_ITEM_GOLD),                1,         4,         2 },\n\t\t\t{ cItem(E_ITEM_13_DISC),             1,         1,         4 },\n\t\t\t{ cItem(E_ITEM_CAT_DISC),            1,         1,         4 },\n\t\t\t{ cItem(E_ITEM_IRON_HORSE_ARMOR),    1,         1,         5 },\n\t\t\t{ cItem(E_ITEM_IRON),                1,         4,        10 },\n\t\t\t{ cItem(E_ITEM_WHEAT),               1,         4,        10 },\n\t\t\t{ cItem(E_ITEM_GUNPOWDER),           1,         4,        10 },\n\t\t\t{ cItem(E_ITEM_STRING),              1,         4,        10 },\n\t\t\t{ cItem(E_ITEM_REDSTONE_DUST),       1,         4,        10 },\n\t\t\t{ cItem(E_ITEM_COAL),                1,         4,        10 },\n\t\t\t{ cItem(E_ITEM_BONE),                1,         4,        10 },\n\t\t\t{ cItem(E_ITEM_ROTTEN_FLESH),        1,         4,        10 },\n\t\t\t{ cItem(E_ITEM_SADDLE),              1,         1,        10 },\n\t\t\t{ cItem(E_ITEM_BUCKET),              1,         1,        10 },\n\t\t\t{ cItem(E_ITEM_BREAD),               1,         1,        10 },\n\t\t\t{ cItem(E_ITEM_NAME_TAG),            1,         1,        10 },\n\t\t\t{ cItem(E_ITEM_BEETROOT_SEEDS),      2,         4,        10 },\n\t\t\t{ cItem(E_ITEM_MELON_SEEDS),         2,         4,        10 },\n\t\t\t{ cItem(E_ITEM_PUMPKIN_SEEDS),       2,         4,        10 },\n\t\t} ;\n\n\t\tcChestEntity * ChestEntity = static_cast<cChestEntity *>(a_ChunkDesc.GetBlockEntity(RelX, m_FloorHeight + 1, RelZ));\n\t\tASSERT((ChestEntity != nullptr) && (ChestEntity->GetBlockType() == E_BLOCK_CHEST));\n\t\tcNoise Noise(a_ChunkDesc.GetChunkX() ^ a_ChunkDesc.GetChunkZ());\n\t\tint NumSlots = 3 + ((Noise.IntNoise3DInt(a_Chest.x, a_Chest.y, a_Chest.z) / 11) % 4);\n\t\tint Seed = Noise.IntNoise2DInt(RelX, RelZ);\n\t\tChestEntity->GetContents().GenerateRandomLootWithBooks(LootProbab, ARRAYCOUNT(LootProbab), NumSlots, Seed);\n\t}\n\n\n\n\t// cGridStructGen::cStructure override:\n\tvirtual void DrawIntoChunk(cChunkDesc & a_ChunkDesc) override\n\t{\n\t\tif (\n\t\t\t(m_EndX   <  a_ChunkDesc.GetChunkX() * cChunkDef::Width) ||\n\t\t\t(m_StartX >= a_ChunkDesc.GetChunkX() * cChunkDef::Width + cChunkDef::Width) ||\n\t\t\t(m_EndZ   <  a_ChunkDesc.GetChunkZ() * cChunkDef::Width) ||\n\t\t\t(m_StartZ >= a_ChunkDesc.GetChunkZ() * cChunkDef::Width + cChunkDef::Width)\n\t\t)\n\t\t{\n\t\t\t// The chunk is not intersecting the room at all, bail out\n\t\t\treturn;\n\t\t}\n\n\t\tint b = m_FloorHeight + 1;  // Bottom\n\t\tint t = m_FloorHeight + 1 + ROOM_HEIGHT;  // Top\n\t\tReplaceCuboidRandom(a_ChunkDesc, m_StartX, m_FloorHeight, m_StartZ, m_EndX + 1, b, m_EndZ + 1, E_BLOCK_MOSSY_COBBLESTONE, E_BLOCK_COBBLESTONE);  // Floor\n\t\tReplaceCuboid(a_ChunkDesc, m_StartX + 1, b, m_StartZ + 1, m_EndX, t, m_EndZ, E_BLOCK_AIR);  // Insides\n\n\t\t// Walls:\n\t\tReplaceCuboid(a_ChunkDesc, m_StartX, b, m_StartZ, m_StartX + 1, t, m_EndZ,       E_BLOCK_COBBLESTONE);  // XM wall\n\t\tReplaceCuboid(a_ChunkDesc, m_EndX,   b, m_StartZ, m_EndX + 1,   t, m_EndZ,       E_BLOCK_COBBLESTONE);  // XP wall\n\t\tReplaceCuboid(a_ChunkDesc, m_StartX, b, m_StartZ, m_EndX + 1,   t, m_StartZ + 1, E_BLOCK_COBBLESTONE);  // ZM wall\n\t\tReplaceCuboid(a_ChunkDesc, m_StartX, b, m_EndZ,   m_EndX + 1,   t, m_EndZ + 1,   E_BLOCK_COBBLESTONE);  // ZP wall\n\n\t\t// Place chests:\n\t\tTryPlaceChest(a_ChunkDesc, m_Chest1);\n\t\tTryPlaceChest(a_ChunkDesc, m_Chest2);\n\n\t\t// Place the spawner:\n\t\tint CenterX = (m_StartX + m_EndX) / 2 - a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\tint CenterZ = (m_StartZ + m_EndZ) / 2 - a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\tif (\n\t\t\t(CenterX >= 0) && (CenterX < cChunkDef::Width) &&\n\t\t\t(CenterZ >= 0) && (CenterZ < cChunkDef::Width)\n\t\t)\n\t\t{\n\t\t\ta_ChunkDesc.SetBlockTypeMeta(CenterX, b, CenterZ, E_BLOCK_MOB_SPAWNER, 0);\n\t\t\tcMobSpawnerEntity * MobSpawner = static_cast<cMobSpawnerEntity *>(a_ChunkDesc.GetBlockEntity(CenterX, b, CenterZ));\n\t\t\tASSERT((MobSpawner != nullptr) && (MobSpawner->GetBlockType() == E_BLOCK_MOB_SPAWNER));\n\t\t\tMobSpawner->SetEntity(m_MonsterType);\n\t\t}\n\t}\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cDungeonRoomsFinisher:\n\ncDungeonRoomsFinisher::cDungeonRoomsFinisher(cTerrainShapeGen & a_ShapeGen, int a_Seed, int a_GridSize, int a_MaxSize, int a_MinSize, const AString & a_HeightDistrib) :\n\tSuper(a_Seed + 100, a_GridSize, a_GridSize, a_GridSize, a_GridSize, a_MaxSize, a_MaxSize, 1024),\n\tm_ShapeGen(a_ShapeGen),\n\tm_MaxHalfSize((a_MaxSize + 1) / 2),\n\tm_MinHalfSize((a_MinSize + 1) / 2),\n\tm_HeightProbability(cChunkDef::Height)\n{\n\t// Initialize the height probability distribution:\n\tm_HeightProbability.SetDefString(a_HeightDistrib);\n\n\t// Normalize the min and max size:\n\tif (m_MinHalfSize > m_MaxHalfSize)\n\t{\n\t\tstd::swap(m_MinHalfSize, m_MaxHalfSize);\n\t}\n}\n\n\n\n\n\ncDungeonRoomsFinisher::cStructurePtr cDungeonRoomsFinisher::CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ)\n{\n\t// Select a random room size in each direction:\n\tint rnd = m_Noise.IntNoise2DInt(a_OriginX, a_OriginZ) / 7;\n\tint HalfSizeX = m_MinHalfSize + (rnd % (m_MaxHalfSize - m_MinHalfSize + 1));\n\trnd = rnd / 32;\n\tint HalfSizeZ = m_MinHalfSize + (rnd % (m_MaxHalfSize - m_MinHalfSize + 1));\n\trnd = rnd / 32;\n\n\t// Select a random floor height for the room, based on the height generator:\n\tint ChunkX, ChunkZ;\n\tint RelX = a_OriginX, RelY = 0, RelZ = a_OriginZ;\n\tcChunkDef::AbsoluteToRelative(RelX, RelY, RelZ, ChunkX, ChunkZ);\n\tcChunkDesc::Shape shape;\n\tm_ShapeGen.GenShape({ChunkX, ChunkZ}, shape);\n\tint height = 0;\n\tint idx = RelX * 256 + RelZ * 16 * 256;\n\tfor (int y = 6; y < cChunkDef::Height; y++)\n\t{\n\t\tif (shape[idx + y] != 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\theight = Clamp(m_HeightProbability.MapValue(rnd % m_HeightProbability.GetSum()), 10, y - 5);\n\t}\n\n\t// Create the dungeon room descriptor:\n\treturn cStructurePtr(new cDungeonRoom(a_GridX, a_GridZ, a_OriginX, a_OriginZ, HalfSizeX, HalfSizeZ, height, m_Noise));\n}\n"
  },
  {
    "path": "src/Generating/DungeonRoomsFinisher.h",
    "content": "\n// DungeonRoomsFinisher.h\n\n// Declares the cDungeonRoomsFinisher class representing the finisher that generates dungeon rooms\n\n\n\n\n\n#pragma once\n\n#include \"GridStructGen.h\"\n#include \"../ProbabDistrib.h\"\n\n\n\n\n\nclass cDungeonRoomsFinisher:\n\tpublic cGridStructGen\n{\n\tusing Super = cGridStructGen;\n\npublic:\n\n\t/** Creates a new dungeon room finisher.\n\ta_ShapeGen is the underlying terrain shape generator, so that the rooms can always be placed under the terrain.\n\ta_MaxSize and a_MinSize are the maximum and minimum sizes of the room's internal (air) area, in blocks across.\n\ta_HeightDistrib is the string defining the height distribution for the rooms (cProbabDistrib format). */\n\tcDungeonRoomsFinisher(cTerrainShapeGen & a_ShapeGen, int a_Seed, int a_GridSize, int a_MaxSize, int a_MinSize, const AString & a_HeightDistrib);\n\nprotected:\n\n\t/** The shape gen that is used for limiting the rooms' Y coords */\n\tcTerrainShapeGen & m_ShapeGen;\n\n\t/** Maximum half-size (from center to wall) of the dungeon room's inner (air) area. Default is 3 (vanilla). */\n\tint m_MaxHalfSize;\n\n\t/** Minimum half-size (from center to wall) of the dungeon room's inner (air) area. Default is 2 (vanilla). */\n\tint m_MinHalfSize;\n\n\t/** The height probability distribution to make the spawners more common in layers 10 - 40, less common outside this range. */\n\tcProbabDistrib m_HeightProbability;\n\n\n\t// cGridStructGen overrides:\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override;\n} ;\n"
  },
  {
    "path": "src/Generating/EndGen.cpp",
    "content": "\n// EndGen.cpp\n\n// Implements the cEndGen class representing the generator for the End, both as a HeightGen and CompositionGen\n\n#include \"Globals.h\"\n#include \"EndGen.h\"\n#include \"../IniFile.h\"\n#include \"../LinearUpscale.h\"\n\n\n\n\n\nenum\n{\n\t// Interpolation cell size:\n\tINTERPOL_X = 4,\n\tINTERPOL_Y = 4,\n\tINTERPOL_Z = 4,\n\n\t// Size of chunk data, downscaled before interpolation:\n\tDIM_X = 16  / INTERPOL_X + 1,\n\tDIM_Y = 256 / INTERPOL_Y + 1,\n\tDIM_Z = 16  / INTERPOL_Z + 1,\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEndGen:\n\ncEndGen::cEndGen(int a_Seed) :\n\tm_Seed(a_Seed),\n\tm_Perlin(m_Seed),\n\tm_MainIslandSize(200),\n\tm_IslandThickness(32),\n\tm_IslandYOffset(30),\n\tm_MainIslandFrequencyX(100),\n\tm_MainIslandFrequencyY(80),\n\tm_MainIslandFrequencyZ(100),\n\tm_MainIslandMinThreshold(0.2f),\n\tm_SmallIslandFrequencyX(50),\n\tm_SmallIslandFrequencyY(80),\n\tm_SmallIslandFrequencyZ(50),\n\tm_SmallIslandMinThreshold(-0.5f),\n\tm_LastChunkCoords(0x7fffffff, 0x7fffffff)  // Use dummy coords that won't ever be used by real chunks\n{\n\tm_Perlin.AddOctave(1, 1);\n\tm_Perlin.AddOctave(2, 0.5);\n\tm_Perlin.AddOctave(4, 0.25);\n}\n\n\n\n\n\nvoid cEndGen::InitializeShapeGen(cIniFile & a_IniFile)\n{\n\tm_MainIslandSize = a_IniFile.GetValueSetI(\"Generator\", \"EndGenMainIslandSize\", m_MainIslandSize);\n\tm_IslandThickness = a_IniFile.GetValueSetI(\"Generator\", \"EndGenIslandThickness\", m_IslandThickness);\n\tm_IslandYOffset = a_IniFile.GetValueSetI(\"Generator\", \"EndGenIslandYOffset\", m_IslandYOffset);\n\n\tm_MainIslandFrequencyX   = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"EndGenMainFrequencyX\", m_MainIslandFrequencyX));\n\tm_MainIslandFrequencyY   = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"EndGenMainFrequencyY\", m_MainIslandFrequencyY));\n\tm_MainIslandFrequencyZ   = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"EndGenMainFrequencyZ\", m_MainIslandFrequencyZ));\n\tm_MainIslandMinThreshold = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"EndGenMainMinThreshold\", m_MainIslandMinThreshold));\n\n\tm_SmallIslandFrequencyX   = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"EndGenSmallFrequencyX\", m_SmallIslandFrequencyX));\n\tm_SmallIslandFrequencyY   = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"EndGenSmallFrequencyY\", m_SmallIslandFrequencyY));\n\tm_SmallIslandFrequencyZ   = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"EndGenSmallFrequencyZ\", m_SmallIslandFrequencyZ));\n\tm_SmallIslandMinThreshold = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"EndGenSmallMinThreshold\", m_SmallIslandMinThreshold));\n\n}\n\n\n\n\n\nvoid cEndGen::PrepareState(cChunkCoords a_ChunkCoords)\n{\n\tif (m_LastChunkCoords == a_ChunkCoords)\n\t{\n\t\treturn;\n\t}\n\n\tm_LastChunkCoords = a_ChunkCoords;\n\n\tGenerateNoiseArray();\n}\n\n\n\n\n\nvoid cEndGen::GenerateNoiseArray(void)\n{\n\tNOISE_DATATYPE NoiseData[DIM_X * DIM_Y * DIM_Z];  // [x + DIM_X * z + DIM_X * DIM_Z * y]\n\tNOISE_DATATYPE Workspace[DIM_X * DIM_Y * DIM_Z];  // [x + DIM_X * z + DIM_X * DIM_Z * y]\n\n\t// Choose the frequency to use depending on the distance from spawn.\n\tauto distanceFromSpawn = cChunkDef::RelativeToAbsolute({ cChunkDef::Width / 2, 0, cChunkDef::Width / 2 }, m_LastChunkCoords).Length();\n\tauto frequencyX = distanceFromSpawn > m_MainIslandSize * 2 ? m_SmallIslandFrequencyX : m_MainIslandFrequencyX;\n\tauto frequencyY = distanceFromSpawn > m_MainIslandSize * 2 ? m_SmallIslandFrequencyY : m_MainIslandFrequencyY;\n\tauto frequencyZ = distanceFromSpawn > m_MainIslandSize * 2 ? m_SmallIslandFrequencyZ : m_MainIslandFrequencyZ;\n\n\t// Generate the downscaled noise:\n\tauto StartX = static_cast<NOISE_DATATYPE>(m_LastChunkCoords.m_ChunkX       * cChunkDef::Width) / frequencyX;\n\tauto EndX   = static_cast<NOISE_DATATYPE>((m_LastChunkCoords.m_ChunkX + 1) * cChunkDef::Width) / frequencyX;\n\tauto StartZ = static_cast<NOISE_DATATYPE>(m_LastChunkCoords.m_ChunkZ       * cChunkDef::Width) / frequencyZ;\n\tauto EndZ   = static_cast<NOISE_DATATYPE>((m_LastChunkCoords.m_ChunkZ + 1) * cChunkDef::Width) / frequencyZ;\n\tauto StartY = 0.0f;\n\tauto EndY   = static_cast<NOISE_DATATYPE>(cChunkDef::Height) / frequencyY;\n\tm_Perlin.Generate3D(NoiseData, DIM_X, DIM_Z, DIM_Y, StartX, EndX, StartZ, EndZ, StartY, EndY, Workspace);\n\n\t// Add distance:\n\tfor (int y = 0; y < DIM_Y; y++)\n\t{\n\t\tauto ValY = static_cast<NOISE_DATATYPE>(2 * INTERPOL_Y * y - m_IslandThickness) / m_IslandThickness;\n\t\tValY = static_cast<NOISE_DATATYPE>(std::pow(ValY, 6));\n\t\tfor (int z = 0; z < DIM_Z; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < DIM_X; x++)\n\t\t\t{\n\t\t\t\tNoiseData[x + DIM_X * z + DIM_X * DIM_Z * y] += ValY;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n\n\t// Upscale into real chunk size:\n\tLinearUpscale3DArray(NoiseData, DIM_X, DIM_Z, DIM_Y, m_NoiseArray, INTERPOL_X, INTERPOL_Z, INTERPOL_Y);\n}\n\n\n\n\n\nvoid cEndGen::GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape)\n{\n\tPrepareState(a_ChunkCoords);\n\n\tint MaxY = std::min(static_cast<int>(1.75 * m_IslandThickness + m_IslandYOffset), cChunkDef::Height - 1);\n\n\t// Choose which threshold to use depending on the distance from spawn.\n\tdouble chunkDistanceFromSpawn = cChunkDef::RelativeToAbsolute({ cChunkDef::Width / 2, 0, cChunkDef::Width / 2 }, a_ChunkCoords).Length();\n\tdouble minThreshold = chunkDistanceFromSpawn > m_MainIslandSize * 2 ? m_SmallIslandMinThreshold : m_MainIslandMinThreshold;\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\t// Calculate the required treshold based on the distance from spawn.\n\t\t\t// This way a void can be generated between the main island and the other islands.\n\t\t\tdouble distanceFromSpawn = cChunkDef::RelativeToAbsolute({ x, 0, z }, a_ChunkCoords).Length();\n\t\t\tdouble pow = std::pow((distanceFromSpawn - m_MainIslandSize) / m_MainIslandSize / 2, 3);\n\t\t\tdouble mult = 3 * ((distanceFromSpawn - m_MainIslandSize) / m_MainIslandSize);\n\t\t\tdouble threshold = std::min(pow - mult, minThreshold);\n\n\t\t\tfor (int y = 0; y < m_IslandYOffset; y++)\n\t\t\t{\n\t\t\t\tcChunkDesc::SetShapeIsSolidAt(a_Shape, x, y, z, false);\n\t\t\t}\n\t\t\tfor (int y = m_IslandYOffset; y < MaxY; y++)\n\t\t\t{\n\t\t\t\tcChunkDesc::SetShapeIsSolidAt(a_Shape, x, y, z, m_NoiseArray[(y - m_IslandYOffset) * 17 * 17 + z * 17 + x] <= threshold);\n\t\t\t}\n\t\t\tfor (int y = MaxY; y < cChunkDef::Height; y++)\n\t\t\t{\n\t\t\t\tcChunkDesc::SetShapeIsSolidAt(a_Shape, x, y, z, false);\n\t\t\t}\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cEndGen::ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape)\n{\n\ta_ChunkDesc.FillBlocks(E_BLOCK_AIR, 0);\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t\t\t{\n\t\t\t\tif (cChunkDesc::GetShapeIsSolidAt(a_Shape, x, y, z))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_END_STONE);\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/EndGen.h",
    "content": "\n// EndGen.h\n\n// Declares the cEndGen class representing the generator for the End, both as a HeightGen and CompositionGen\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Noise/Noise.h\"\n\n\n\n\n\nclass cEndGen :\n\tpublic cTerrainShapeGen,\n\tpublic cTerrainCompositionGen\n{\npublic:\n\tcEndGen(int a_Seed);\n\nprotected:\n\n\t/** Seed for the noise */\n\tint m_Seed;\n\n\t/** The Perlin noise used for generating */\n\tcPerlinNoise m_Perlin;\n\n\t// XYZ size of the \"island\", in blocks:\n\tint m_MainIslandSize;\n\tint m_IslandThickness;\n\tint m_IslandYOffset;\n\n\t// XYZ Frequencies of the noise functions:\n\tNOISE_DATATYPE m_MainIslandFrequencyX;\n\tNOISE_DATATYPE m_MainIslandFrequencyY;\n\tNOISE_DATATYPE m_MainIslandFrequencyZ;\n\tNOISE_DATATYPE m_MainIslandMinThreshold;\n\n\t// XYZ Frequencies of the noise functions on the smaller islands:\n\tNOISE_DATATYPE m_SmallIslandFrequencyX;\n\tNOISE_DATATYPE m_SmallIslandFrequencyY;\n\tNOISE_DATATYPE m_SmallIslandFrequencyZ;\n\tNOISE_DATATYPE m_SmallIslandMinThreshold;\n\n\n\t// Noise array for the last chunk (in the noise range)\n\tcChunkCoords m_LastChunkCoords;\n\tNOISE_DATATYPE m_NoiseArray[17 * 17 * 257];  // x + 17 * z + 17 * 17 * y\n\n\n\t/** Unless the LastChunk coords are equal to coords given, prepares the internal state (noise array) */\n\tvoid PrepareState(cChunkCoords a_ChunkCoords);\n\n\t/** Generates the m_NoiseArray array for the current chunk */\n\tvoid GenerateNoiseArray(void);\n\n\t// cTerrainShapeGen overrides:\n\tvirtual void GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape) override;\n\tvirtual void InitializeShapeGen(cIniFile & a_IniFile) override;\n\n\n\t// cTerrainCompositionGen overrides:\n\tvirtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override;\n} ;\n"
  },
  {
    "path": "src/Generating/EnderDragonFightStructuresGen.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"EnderDragonFightStructuresGen.h\"\n#include \"../Chunk.h\"\n#include \"../Entities/EnderCrystal.h\"\n#include \"../WorldStorage/SchematicFileSerializer.h\"\n\nconst std::array<Vector3i, 48> cEnderDragonFightStructuresGen::m_CagePos =\n{\n\t{\n\t\t// First layer\n\t\t{-2, -1, -2}, {-2, -1, -1}, {-2, -1, 0}, {-2, -1, 1}, {-2, -1, 2},\n\t\t{2,  -1, -2}, {2,  -1, -1}, {2,  -1, 0}, {2,  -1, 1}, {2,  -1, 2},\n\t\t{-1, -1, -2}, {0,  -1, -2}, {1,  -1, -2},\n\t\t{-1, -1, 2},  {0,  -1, 2},  {1,  -1, 2},\n\n\t\t// Second layer\n\t\t{-2, 0, -2}, {-2, 0, -1}, {-2, 0, 0}, {-2, 0, 1}, {-2, 0, 2},\n\t\t{2,  0, -2}, {2,  0, -1}, {2,  0, 0}, {2,  0, 1}, {2,  0, 2},\n\t\t{-1, 0, -2}, {0,  0, -2}, {1,  0, -2},\n\t\t{-1, 0, 2},  {0,  0, 2},  {1,  0, 2},\n\n\t\t// Third layer\n\t\t{-2, 1, -2}, {-2, 1, -1}, {-2, 1, 0}, {-2, 1, 1}, {-2, 1, 2},\n\t\t{2,  1, -2}, {2,  1, -1}, {2,  1, 0}, {2,  1, 1}, {2,  1, 2},\n\t\t{-1, 1, -2}, {0,  1, -2}, {1,  1, -2},\n\t\t{-1, 1, 2},  {0,  1, 2},  {1,  1, 2},\n\t}\n};\n\n\n\n\n\nconst std::array<Vector3i, 26> cEnderDragonFightStructuresGen::m_CageAir =\n{\n\t{\n\t\t// First layer\n\t\t{-1, -1, -1}, {0, -1, -1}, {1, -1, -1},\n\t\t{-1, -1, 1},  {0, -1, 1},  {1, -1, 1},\n\t\t{-1, -1, 0}, {1, -1, 0},\n\n\t\t// Second layer\n\t\t{-1, 0, -1}, {0, 0, -1}, {1, 0, -1},\n\t\t{-1, 0, 1},  {0, 0, 1},  {1, 0, 1},\n\t\t{-1, 0, 0}, {1, 0, 0}, {0, 0, 0},\n\n\t\t// Third layer\n\t\t{-1, 1, -1}, {0, 1, -1}, {1, 1, -1},\n\t\t{-1, 1, 1},  {0, 1, 1},  {1, 1, 1},\n\t\t{-1, 1, 0}, {1, 1, 0}, {0, 1, 0},\n\t}\n};\n\n\n\n\n\ncEnderDragonFightStructuresGen::cEnderDragonFightStructuresGen(int a_Seed) :\n\t\tm_Noise(a_Seed)\n{\n}\n\n\n\n\n\nvoid cEnderDragonFightStructuresGen::Init(const AString & a_TowerProperties, int a_Radius)\n{\n\tconst auto ChunkWidth = cChunkDef::Width;\n\t// Loads the fountain schematic\n\tif (!cFile::IsFile(AString(\"Prefabs\") + cFile::GetPathSeparator() + \"SinglePieceStructures\" + cFile::GetPathSeparator() + \"EndFountain.schematic\"))\n\t{\n\t\tLOGWARNING(\"EnderDragonFightStructuresGen is missing its end fountain prefab, please update your Cuberite server files! There will be no end fountain!\");\n\t}\n\telse\n\t{\n\t\tcSchematicFileSerializer::LoadFromSchematicFile(m_Fountain, AString(\"Prefabs\") + cFile::GetPathSeparator() + \"SinglePieceStructures\" + cFile::GetPathSeparator() + \"EndFountain.schematic\");\n\t}\n\n\t// Reads the given tower properties\n\tconst auto TowerPropertiesVector = StringSplitAndTrim(a_TowerProperties, \";\");\n\tstd::vector<sTowerProperties> TowerProperties;\n\tfor (const auto & TowerProperty : TowerPropertiesVector)\n\t{\n\t\tconst auto TowerPropertyVector = StringSplitAndTrim(TowerProperty, \"|\");\n\t\tif (TowerPropertyVector.size() != 3)\n\t\t{\n\t\t\tLOGWARNING(\"Got unknown parameters on generating obsidian pillars: %s, Please use \\\"Height|Radius|HasCage\\\"; ...\", TowerProperty);\n\t\t\tcontinue;\n\t\t}\n\t\tint Height = std::min(std::stoi(TowerPropertyVector[0]), cChunkDef::Height - 2);  // The highest block placed is two blocks above the given height (the cage above some towers)\n\t\tint Radius = std::stoi(TowerPropertyVector[1]);\n\t\tbool HasCage;\n\t\tif (NoCaseCompare(TowerPropertyVector[2], \"true\") == 0)\n\t\t{\n\t\t\tHasCage = true;\n\t\t}\n\t\telse if (NoCaseCompare(TowerPropertyVector[2], \"false\") == 0)\n\t\t{\n\t\t\tHasCage = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLOGWARNING(\"Got unknown value for boolean of the tower: %s should have a cage! %s. Tower will not be generated!\", TowerProperty, TowerPropertyVector[2]);\n\t\t\tcontinue;\n\t\t}\n\t\tTowerProperties.push_back({Vector3d(), Height, Radius, HasCage});\n\t}\n\t// A random angle in radian\n\tdouble Angle = m_Noise.IntNoise1D(m_Noise.GetSeed()) * M_PI + M_PI;\n\t// Shuffles the order of the towers\n\tstd::shuffle(TowerProperties.begin(), TowerProperties.end(), std::default_random_engine(static_cast<std::default_random_engine::result_type>(m_Noise.GetSeed())));\n\t// Generate Positions in a circle\n\tfor (size_t I = 0; I < TowerProperties.size(); I++)\n\t{\n\t\tauto TowerPos = Vector3i(FloorC(a_Radius * cos(Angle)), 0, FloorC(a_Radius * sin(Angle)));\n\t\tTowerProperties[I].m_Pos = TowerPos;\n\n\t\t// Check all crossed chunks\n\t\tfor (int X = -TowerProperties[I].m_Radius - ChunkWidth; X <= TowerProperties[I].m_Radius + ChunkWidth; X+=std::min(TowerProperties[I].m_Radius, ChunkWidth))\n\t\t{\n\t\t\tfor (int Z = -TowerProperties[I].m_Radius - ChunkWidth; Z <= TowerProperties[I].m_Radius + ChunkWidth; Z+=std::min(TowerProperties[I].m_Radius, ChunkWidth))\n\t\t\t{\n\t\t\t\tauto Chunk = cChunkDef::BlockToChunk({TowerPos.x + X, 0, TowerPos.z + Z});\n\t\t\t\t// Update limits\n\t\t\t\tm_MinX = std::min(Chunk.m_ChunkX, m_MinX);\n\t\t\t\tm_MinZ = std::min(Chunk.m_ChunkZ, m_MinZ);\n\n\t\t\t\tm_MaxX = std::max(Chunk.m_ChunkX, m_MaxX);\n\t\t\t\tm_MaxZ = std::max(Chunk.m_ChunkZ, m_MaxZ);\n\t\t\t\t// If the tower is not in chunk put it in\n\t\t\t\tbool ShouldPlace = true;\n\t\t\t\tfor (const auto & Property : m_TowerPos[Chunk])\n\t\t\t\t{\n\t\t\t\t\tShouldPlace &= !(TowerPos == Property.m_Pos);\n\t\t\t\t}\n\t\t\t\tif (ShouldPlace)\n\t\t\t\t{\n\t\t\t\t\tm_TowerPos[Chunk].emplace_back(TowerProperties[I]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Generate angle of next tower\n\t\tAngle = fmod(Angle + (2.0 * M_PI / static_cast<double>(TowerProperties.size())), 2.0 * M_PI);\n\t}\n}\n\n\n\n\n\nvoid cEnderDragonFightStructuresGen::GenFinish(cChunkDesc &a_ChunkDesc)\n{\n\tauto Coords = a_ChunkDesc.GetChunkCoords();\n\t// If not in the chunks to write\n\tif ((Coords.m_ChunkX > m_MaxX) ||\n\t\t(Coords.m_ChunkX < m_MinX) ||\n\t\t(Coords.m_ChunkZ > m_MaxZ) ||\n\t\t(Coords.m_ChunkZ < m_MinZ))\n\t{\n\t\treturn;\n\t}\n\t// Places the exit portal\n\tif (Coords == cChunkCoords({0, 0}))\n\t{\n\t\t/*\n\t\tauto EnderDragon = std::make_unique<cEnderDragon>();\n\t\tEnderDragon->SetPosition({0.0, static_cast<double>(a_ChunkDesc.GetHeight(0, 0) + 20), 0.0});  // Spawns the dragon 20 blocks above the terrain at (0, 0)\n\t\ta_ChunkDesc.GetEntities().emplace_back(std::move(EnderDragon));\n\t\t*/  // Todo: 25.10.20 - Add the ender dragon spawning when the dragon behaves properly - 12xx12\n\t\ta_ChunkDesc.WriteBlockArea(m_Fountain,\n\t\t\tstatic_cast<int>(FloorC(-m_Fountain.GetSizeX() / 2)),\n\t\t\t62,\n\t\t\tstatic_cast<int>(FloorC(-m_Fountain.GetSizeX() / 2)),\n\t\t\tcBlockArea::msSpongePrint\n\t\t);\n\t}\n\telse if (Coords == cChunkCoords({-1, 0}))\n\t{\n\t\ta_ChunkDesc.WriteBlockArea(m_Fountain,\n\t\t\tcChunkDef::Width - static_cast<int>(FloorC(m_Fountain.GetSizeX() / 2)),\n\t\t\t62,\n\t\t\tstatic_cast<int>(FloorC(-m_Fountain.GetSizeZ() / 2)),\n\t\t\tcBlockArea::msSpongePrint\n\t\t);\n\t}\n\telse if (Coords == cChunkCoords({0, -1}))\n\t{\n\t\ta_ChunkDesc.WriteBlockArea(m_Fountain,\n\t\t\tstatic_cast<int>(FloorC(-m_Fountain.GetSizeX() / 2)),\n\t\t\t62,\n\t\t\tcChunkDef::Width - static_cast<int>(FloorC(m_Fountain.GetSizeZ() / 2)),\n\t\t\tcBlockArea::msSpongePrint);\n\t}\n\telse if (Coords == cChunkCoords({-1, -1}))\n\t{\n\t\ta_ChunkDesc.WriteBlockArea(m_Fountain,\n\t\t\tcChunkDef::Width - static_cast<int>(FloorC(m_Fountain.GetSizeX() / 2)),\n\t\t\t62,\n\t\t\tcChunkDef::Width - static_cast<int>(FloorC(m_Fountain.GetSizeZ() / 2)),\n\t\t\tcBlockArea::msSpongePrint);\n\t}\n\tauto It = m_TowerPos.find(Coords);\n\tif (It == m_TowerPos.end())\n\t{\n\t\treturn;\n\t}\n\tfor (const auto & Property : It->second)\n\t{\n\t\tPlaceTower(a_ChunkDesc, Property);\n\t}\n}\n\n\n\n\n\nvoid cEnderDragonFightStructuresGen::PlaceTower(cChunkDesc &a_ChunkDesc, const sTowerProperties & a_Properties)\n{\n\tauto Pos = cChunkDef::AbsoluteToRelative(a_Properties.m_Pos, a_ChunkDesc.GetChunkCoords());\n\t// Place obsidian pillar\n\tfor (int X = -a_Properties.m_Radius; X < a_Properties.m_Radius; X++)\n\t{\n\t\tfor (int Z = -a_Properties.m_Radius; Z < a_Properties.m_Radius; Z++)\n\t\t{\n\t\t\tVector3i NewPos = {Pos.x + X, 1, Pos.z + Z};\n\t\t\tif (cChunkDef::IsValidRelPos(NewPos))\n\t\t\t{\n\t\t\t\t// The 3 was achieved by trial and error till the shape matched the notchian implementation\n\t\t\t\tif ((NewPos - Vector3i(Pos.x, 1, Pos.z)).SqrLength() < a_Properties.m_Radius * a_Properties.m_Radius - 3)\n\t\t\t\t{\n\t\t\t\t\tfor (int Y = 0; Y <= a_Properties.m_Height - 2; Y++)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockType(NewPos.x, Y, NewPos.z, E_BLOCK_OBSIDIAN);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Spawn the iron bars if there are some\n\tif (a_Properties.m_HasCage)\n\t{\n\t\t// Place walls\n\t\tfor (const auto & Offset : m_CagePos)\n\t\t{\n\t\t\tif (cChunkDef::IsValidRelPos(Vector3d(Pos.x, a_Properties.m_Height, Pos.z) + Offset))\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(Pos.x + Offset.x, a_Properties.m_Height + Offset.y, Pos.z + Offset.z, E_BLOCK_IRON_BARS);\n\t\t\t}\n\t\t}\n\t\t// Remove any block that may generate inside the cage\n\t\tfor (const auto & Offset : m_CageAir)\n\t\t{\n\t\t\tif (cChunkDef::IsValidRelPos(Pos + Offset))\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(Pos.x + Offset.x, a_Properties.m_Height + Offset.y, Pos.z + Offset.z, E_BLOCK_AIR);\n\t\t\t}\n\t\t}\n\t\t// Place roof\n\t\tfor (int X = -2; X <= 2; ++X)\n\t\t{\n\t\t\tfor (int Z = -2; Z <= 2; ++Z)\n\t\t\t{\n\t\t\t\tif (cChunkDef::IsValidRelPos({Pos.x + X, 1, Pos.z + Z}))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(Pos.x + X, a_Properties.m_Height + 2, Pos.z + Z, E_BLOCK_IRON_BARS);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Place the top decoration if the origin is in this chunk\n\tif (cChunkDef::IsValidRelPos(Pos))\n\t{\n\t\t// Spawn the bedrock\n\t\ta_ChunkDesc.SetBlockType(Pos.x, a_Properties.m_Height - 1, Pos.z, E_BLOCK_BEDROCK);\n\t\t// Spawn the fire\n\t\ta_ChunkDesc.SetBlockType(Pos.x, a_Properties.m_Height, Pos.z, E_BLOCK_FIRE);\n\t\t// Spawn the ender crystal of the origin position is in this chunk\n\t\tauto EnderCrystal = std::make_unique<cEnderCrystal>(Vector3d(0.5, a_Properties.m_Height, 0.5) + a_Properties.m_Pos, true);\n\t\ta_ChunkDesc.GetEntities().emplace_back(std::move(EnderCrystal));\n\t}\n}\n"
  },
  {
    "path": "src/Generating/EnderDragonFightStructuresGen.h",
    "content": "\n#pragma once\n\n/*\nhttps://minecraft.wiki/w/End_spike\nhttps://minecraft.wiki/w/End_Crystal\nhttps://minecraft.wiki/w/Ender_Dragon\n*/\n\n#include \"FinishGen.h\"\n\nclass cEnderDragonFightStructuresGen :\n\tpublic cFinishGen\n{\npublic:\n\tcEnderDragonFightStructuresGen(int a_Seed);\n\tvoid Init(const AString & a_TowerProperties, int a_Radius);\n\nprotected:\n\tstruct sTowerProperties\n\t{\n\t\tVector3i m_Pos;\n\t\tint m_Height;\n\t\tint m_Radius;\n\t\tbool m_HasCage;\n\t};\n\n\tcNoise m_Noise;\n\tstd::map<cChunkCoords, std::vector<sTowerProperties>> m_TowerPos;\n\tstatic const std::array<Vector3i, 48> m_CagePos;\n\tstatic const std::array<Vector3i, 26> m_CageAir;\n\tcBlockArea m_Fountain;\n\n\tint m_MinX = -1, m_MaxX = 1, m_MinZ = -1, m_MaxZ = 1;\n\n\tvoid GenFinish(cChunkDesc &a_ChunkDesc) override;\n\tvoid PlaceTower(cChunkDesc & a_ChunkDesc, const sTowerProperties & a_TowerProperties);\n};\n"
  },
  {
    "path": "src/Generating/FinishGen.cpp",
    "content": "\n// FinishGen.cpp\n\n/* Implements the various finishing generators:\n\t- cFinishGenSnow\n\t- cFinishGenIce\n\t- cFinishGenSprinkleFoliage\n*/\n\n#include \"Globals.h\"\n\n#include \"FinishGen.h\"\n#include \"../Simulator/FluidSimulator.h\"  // for cFluidSimulator::CanWashAway()\n#include \"../Simulator/FireSimulator.h\"\n#include \"../IniFile.h\"\n#include \"../MobSpawner.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\n#define DEF_NETHER_WATER_SPRINGS    \"0, 1; 255, 1\"\n#define DEF_NETHER_LAVA_SPRINGS     \"0, 0; 30, 0; 31, 50; 120, 50; 127, 0\"\n#define DEF_OVERWORLD_WATER_SPRINGS \"0, 0; 10, 10; 11, 75; 16, 83; 20, 83; 24, 78; 32, 62; 40, 40; 44, 15; 48, 7; 56, 2; 64, 1; 255, 0\"\n#define DEF_OVERWORLD_LAVA_SPRINGS  \"0, 0; 10, 5; 11, 45; 48, 2; 64, 1; 255, 0\"\n#define DEF_END_WATER_SPRINGS       \"0, 1; 255, 1\"\n#define DEF_END_LAVA_SPRINGS        \"0, 1; 255, 1\"\n#define DEF_ANIMAL_SPAWN_PERCENT    10\n#define DEF_NO_ANIMALS              0\n\n\n\n\n\nstatic inline bool IsWater(BLOCKTYPE a_BlockType)\n{\n\treturn (a_BlockType == E_BLOCK_STATIONARY_WATER) || (a_BlockType == E_BLOCK_WATER);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenNetherClumpFoliage:\n\nvoid cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\n\tint Val1 = m_Noise.IntNoise2DInt(ChunkX ^ ChunkZ, ChunkZ + ChunkX);\n\tint Val2 = m_Noise.IntNoise2DInt(ChunkZ ^ ChunkX, ChunkZ - ChunkX);\n\n\tint PosX = Val1 % 16;\n\tint PosZ = Val2 % 16;\n\n\tfor (int y = 1; y < cChunkDef::Height; y++)\n\t{\n\t\tif (a_ChunkDesc.GetBlockType(PosX, y, PosZ) != E_BLOCK_AIR)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!cBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(PosX, y - 1, PosZ)))  // Only place on solid blocks\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Choose what block to use.\n\t\tNOISE_DATATYPE BlockType = m_Noise.IntNoise3D(static_cast<int>(ChunkX), y, static_cast<int>(ChunkZ));\n\t\tif (BlockType < -0.7)\n\t\t{\n\t\t\tTryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM);\n\t\t}\n\t\telse if (BlockType < 0)\n\t\t{\n\t\t\tTryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_RED_MUSHROOM);\n\t\t}\n\t\telse if (BlockType < 0.7)\n\t\t{\n\t\t\tTryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_FIRE);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cFinishGenNetherClumpFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Block)\n{\n\tbool IsFireBlock = a_Block == E_BLOCK_FIRE;\n\n\tint MinX = a_RelX - 4;\n\tif (MinX < 0)  // Check if the coordinate is outside the chunk. If it it then adjust it.\n\t{\n\t\tMinX = 0;\n\t}\n\n\tint MaxX = a_RelX + 4;\n\tif (MaxX > cChunkDef::Width)  // Check if the coordinate is outside the chunk. If it it then adjust it.\n\t{\n\t\tMaxX = cChunkDef::Width;\n\t}\n\n\tint MinZ = a_RelZ - 4;\n\tif (MinZ < 0)  // Check if the coordinate is outside the chunk. If it it then adjust it.\n\t{\n\t\tMinZ = 0;\n\t}\n\n\tint MaxZ = a_RelZ + 4;\n\tif (MaxZ > cChunkDef::Width)  // Check if the coordinate is outside the chunk. If it it then adjust it.\n\t{\n\t\tMaxZ = cChunkDef::Width;\n\t}\n\n\tint MinY = a_RelY - 2;\n\tif (MinY < 0)  // Check if the coordinate is outside the chunk. If it it then adjust it.\n\t{\n\t\tMinY = 0;\n\t}\n\n\tint MaxY = a_RelY + 2;\n\tif (MaxY > cChunkDef::Height)  // Check if the coordinate is outside the chunk. If it it then adjust it.\n\t{\n\t\tMaxY = cChunkDef::Height;\n\t}\n\n\tfor (int x = MinX; x < MaxX; x++)\n\t{\n\t\tint xx = a_ChunkDesc.GetChunkX() * cChunkDef::Width + x;\n\t\tfor (int z = MinZ; z < MaxZ; z++)\n\t\t{\n\t\t\tint zz = a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z;\n\t\t\tfor (int y = MinY; y < MaxY; y++)\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t((x < 0) || (x >= cChunkDef::Width)) ||\n\t\t\t\t\t((y < 0) || (y >= cChunkDef::Height)) ||\n\t\t\t\t\t((z < 0) || (z >= cChunkDef::Width))\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR)  // Don't replace non air blocks.\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tBLOCKTYPE BlockBelow = a_ChunkDesc.GetBlockType(x, y - 1, z);\n\t\t\t\tif (!cBlockInfo::FullyOccupiesVoxel(BlockBelow))  // Only place on solid blocks\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (IsFireBlock)  // don't place fire on non-forever burning blocks.\n\t\t\t\t{\n\t\t\t\t\tif (!cFireSimulator::DoesBurnForever(BlockBelow))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tNOISE_DATATYPE Val = m_Noise.IntNoise2D(xx, zz);\n\t\t\t\tif (Val < -0.5)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, a_Block);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenClumpTopBlock\n\nvoid cFinishGenClumpTopBlock::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\n\tint NoiseVal = m_Noise.IntNoise2DInt(ChunkX, ChunkZ);\n\tEMCSBiome Biome = a_ChunkDesc.GetBiome(cChunkDef::Width / 2, cChunkDef::Width / 2);\n\tBiomeInfo info = m_FlowersPerBiome[static_cast<size_t>(Biome)];\n\n\tconst auto & PossibleBlocks = info.m_Blocks;\n\tif (PossibleBlocks.empty())\n\t{\n\t\t// No need to go any further. This biome can't generate any blocks.\n\t\treturn;\n\t}\n\n\tint NumClumps = info.m_MaxNumClumpsPerChunk - info.m_MinNumClumpsPerChunk;\n\tif (NumClumps == 0)\n\t{\n\t\tNumClumps = 1;\n\t}\n\n\tNumClumps = NoiseVal % NumClumps + info.m_MinNumClumpsPerChunk;\n\tfor (int i = 0; i < NumClumps; i++)\n\t{\n\t\tint Val1 = m_Noise.IntNoise2DInt(ChunkX * ChunkZ * i, ChunkZ + ChunkX + i);\n\t\tint Val2 = m_Noise.IntNoise2DInt(ChunkZ * ChunkX + i, ChunkZ - ChunkX * i);\n\t\tint BlockVal = m_Noise.IntNoise2DInt(Val1, Val2);\n\n\t\tint PosX = Val1 % (cChunkDef::Width - RANGE_FROM_CENTER * 2) + RANGE_FROM_CENTER;\n\t\tint PosZ = Val2 % (cChunkDef::Width - RANGE_FROM_CENTER * 2) + RANGE_FROM_CENTER;\n\n\t\tint TotalWeight = 0;\n\t\tfor (const auto & Block : PossibleBlocks)\n\t\t{\n\t\t\tTotalWeight += Block.m_Weight;\n\t\t}\n\n\t\t// Prevent division by 0\n\t\tTotalWeight = (TotalWeight != 0) ? TotalWeight : 1;\n\t\tint Weight = BlockVal % TotalWeight;\n\t\tfor (const auto & Block : PossibleBlocks)\n\t\t{\n\t\t\tWeight -= Block.m_Weight;\n\t\t\tif (Weight < 0)\n\t\t\t{\n\t\t\t\tTryPlaceFoliageClump(a_ChunkDesc, PosX, PosZ, Block.m_BlockType, Block.m_BlockMeta, Block.m_BlockType == E_BLOCK_BIG_FLOWER);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cFinishGenClumpTopBlock::TryPlaceFoliageClump(cChunkDesc & a_ChunkDesc, int a_CenterX, int a_CenterZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, bool a_IsDoubleTall)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\n\tint NumBlocks = m_Noise.IntNoise2DInt(a_CenterX + ChunkX * 16, a_CenterZ + ChunkZ * 16) % (MAX_NUM_FOLIAGE - MIN_NUM_FOLIAGE) + MIN_NUM_FOLIAGE + 1;\n\tfor (int i = 1; i < NumBlocks; i++)\n\t{\n\t\tint Rnd = m_Noise.IntNoise2DInt(ChunkX + ChunkZ + i, ChunkX - ChunkZ - i) / 59;\n\t\tint x = a_CenterX + (((Rnd % 59) % RANGE_FROM_CENTER * 2) - RANGE_FROM_CENTER);\n\t\tint z = a_CenterZ + (((Rnd / 97) % RANGE_FROM_CENTER * 2) - RANGE_FROM_CENTER);\n\t\tint Top = a_ChunkDesc.GetHeight(x, z);\n\n\t\t// Doesn't place if the blocks can't be placed. Checked value also depends on a_IsDoubleTall\n\t\tif (Top + 1 + (a_IsDoubleTall ? 1 : 0) >= cChunkDef::Height)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tauto GroundBlockType = a_ChunkDesc.GetBlockType(x, Top, z);\n\t\tif (\n\t\t\t(GroundBlockType == E_BLOCK_GRASS) || (\n\t\t\t\t(GroundBlockType == E_BLOCK_MYCELIUM) && ((a_BlockType == E_BLOCK_RED_MUSHROOM) || (a_BlockType == E_BLOCK_BROWN_MUSHROOM))\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, Top + 1, z, a_BlockType, a_BlockMeta);\n\t\t\tif (a_IsDoubleTall)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, Top + 2, z, E_BLOCK_BIG_FLOWER, E_META_BIG_FLOWER_TOP);\n\t\t\t\ta_ChunkDesc.SetHeight(x, z, static_cast<HEIGHTTYPE>(Top + 2));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetHeight(x, z, static_cast<HEIGHTTYPE>(Top + 1));\n\t\t\t}\n\t\t}\n\t}\n\n}\n\n\n\n\n\nvoid cFinishGenClumpTopBlock::ParseConfigurationString(const AString & a_RawClumpInfo, std::vector<BiomeInfo> & a_Output)\n{\n\t// Initialize the vector for all biomes.\n\tfor (int i = static_cast<int>(a_Output.size()); i <= static_cast<int>(biMaxVariantBiome); i++)\n\t{\n\t\t// Push empty BiomeInfo structure to be later directly accessed by index:\n\t\ta_Output.emplace_back();\n\t}\n\n\tAStringVector ClumpInfo = StringSplitAndTrim(a_RawClumpInfo, \"=\");\n\n\t// Information about a clump is divided in 2 parts. The biomes they can be in and the blocks that can be placed.\n\tif (ClumpInfo.size() != 2)\n\t{\n\t\tLOGWARNING(\"OverworldClumpFoliage: Data missing for \\\"%s\\\". Please divide biome and blocks with a semi colon\", a_RawClumpInfo.c_str());\n\t\treturn;\n\t}\n\n\tAStringVector Biomes = StringSplitAndTrim(ClumpInfo[0], \";\");\n\tAStringVector Blocks = StringSplitAndTrim(ClumpInfo[1], \";\");\n\n\tfor (const auto & RawBiomeInfo : Biomes)\n\t{\n\t\tconst AStringVector BiomeInfo = StringSplitAndTrim(RawBiomeInfo, \",\");\n\t\tconst AString & BiomeName = BiomeInfo[0];\n\t\tconst EMCSBiome Biome = StringToBiome(BiomeName);\n\t\tif (Biome == biInvalidBiome)\n\t\t{\n\t\t\tLOGWARNING(\"Biome \\\"%s\\\" is invalid.\", BiomeName.c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// The index of Biome in the output vector.\n\t\tconst size_t BiomeIndex = static_cast<size_t>(Biome);\n\n\t\tif (BiomeInfo.size() == 2)\n\t\t{\n\t\t\t// Only the minimum amount of clumps per chunk is changed.\n\t\t\tint MinNumClump = 1;\n\t\t\tif (!StringToInteger(BiomeInfo[1], MinNumClump))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"OverworldClumpFoliage: Invalid data in \\\"%s\\\". Second parameter is either not existing or a number\", RawBiomeInfo.c_str());\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ta_Output[BiomeIndex].m_MinNumClumpsPerChunk = MinNumClump;\n\n\t\t\t// In case the minimum number is higher than the current maximum value we change the max to the minimum value.\n\t\t\ta_Output[BiomeIndex].m_MaxNumClumpsPerChunk = std::max(MinNumClump, a_Output[BiomeIndex].m_MaxNumClumpsPerChunk);\n\t\t}\n\t\telse if (BiomeInfo.size() == 3)\n\t\t{\n\t\t\t// Both the minimum and maximum amount of clumps per chunk is changed.\n\t\t\tint MinNumClumps = 0, MaxNumClumps = 1;\n\t\t\tif (!StringToInteger(BiomeInfo[1], MinNumClumps) || !StringToInteger(BiomeInfo[2], MaxNumClumps))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"Invalid data in \\\"%s\\\". Second parameter is either not existing or a number\", RawBiomeInfo.c_str());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ta_Output[BiomeIndex].m_MaxNumClumpsPerChunk = MaxNumClumps + 1;\n\t\t\ta_Output[BiomeIndex].m_MinNumClumpsPerChunk = MinNumClumps;\n\t\t}\n\n\t\t// TODO: Make the weight configurable.\n\t\tfor (const auto & BlockName : Blocks)\n\t\t{\n\t\t\tcItem Block;\n\t\t\tif (!StringToItem(BlockName, Block) || !IsValidBlock(Block.m_ItemType))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"Block \\\"%s\\\" is invalid\", BlockName.c_str());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Construct the FoliageInfo:\n\t\t\ta_Output[BiomeIndex].m_Blocks.emplace_back(\n\t\t\t\tstatic_cast<BLOCKTYPE>(Block.m_ItemType), static_cast<NIBBLETYPE>(Block.m_ItemDamage), 100\n\t\t\t);\n\t\t}\n\t}\n}\n\n\n\n\n\nstd::vector<cFinishGenClumpTopBlock::BiomeInfo> cFinishGenClumpTopBlock::ParseIniFile(cIniFile & a_IniFile, const AString & a_ClumpPrefix)\n{\n\tstd::vector<cFinishGenClumpTopBlock::BiomeInfo> Foliage;\n\tint NumGeneratorValues = a_IniFile.GetNumValues(\"Generator\");\n\tint GeneratorKeyId = a_IniFile.FindKey(\"Generator\");\n\tfor (int i = 0; i < NumGeneratorValues; i++)\n\t{\n\t\tAString ValueName = a_IniFile.GetValueName(\"Generator\", i);\n\t\tif (ValueName.substr(0, a_ClumpPrefix.size()) == a_ClumpPrefix)\n\t\t{\n\t\t\tAString RawClump = a_IniFile.GetValue(GeneratorKeyId, i);\n\t\t\tcFinishGenClumpTopBlock::ParseConfigurationString(RawClump, Foliage);\n\t\t}\n\t}\n\n\tif (Foliage.empty())\n\t{\n\t\tcFinishGenClumpTopBlock::ParseConfigurationString(a_IniFile.GetValueSet(\"Generator\", a_ClumpPrefix + \"-1\", \"Forest, -2, 2; ForestHills, -3, 2; FlowerForest = yellowflower; redflower; lilac; rosebush\"), Foliage);\n\t\tcFinishGenClumpTopBlock::ParseConfigurationString(a_IniFile.GetValueSet(\"Generator\", a_ClumpPrefix + \"-2\", \"Plains, -2, 1; SunflowerPlains = yellowflower; redflower; azurebluet; redtulip; orangetulip; whitetulip; pinktulip; oxeyedaisy\"), Foliage);\n\t\tcFinishGenClumpTopBlock::ParseConfigurationString(a_IniFile.GetValueSet(\"Generator\", a_ClumpPrefix + \"-3\", \"SunflowerPlains, 1, 2 = sunflower\"), Foliage);\n\t\tcFinishGenClumpTopBlock::ParseConfigurationString(a_IniFile.GetValueSet(\"Generator\", a_ClumpPrefix + \"-4\", \"FlowerForest, 2, 5 = allium; redtulip; orangetulip; whitetulip; pinktulip; oxeyedaisy\"), Foliage);\n\t\tcFinishGenClumpTopBlock::ParseConfigurationString(a_IniFile.GetValueSet(\"Generator\", a_ClumpPrefix + \"-5\", \"Swampland; SwamplandM = brownmushroom; redmushroom; blueorchid\"), Foliage);\n\t\tcFinishGenClumpTopBlock::ParseConfigurationString(a_IniFile.GetValueSet(\"Generator\", a_ClumpPrefix + \"-6\", \"MushroomIsland; MushroomShore; MegaTaiga; MegaTaigaHills; MegaSpruceTaiga; MegaSpruceTaigaHills = brownmushroom; redmushroom\"), Foliage);\n\t\tcFinishGenClumpTopBlock::ParseConfigurationString(a_IniFile.GetValueSet(\"Generator\", a_ClumpPrefix + \"-7\", \"RoofedForest, 1, 5; RoofedForestM, 1, 5 = rosebush; peony; lilac; grass\"), Foliage);\n\t\tcFinishGenClumpTopBlock::ParseConfigurationString(a_IniFile.GetValueSet(\"Generator\", a_ClumpPrefix + \"-8\", \"MegaTaiga; MegaTaigaHills = deadbush\"), Foliage);\n\t}\n\n\treturn Foliage;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenGlowStone:\n\nvoid cFinishGenGlowStone::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\n\t// Change the number of attempts to create a vein depending on the maximum height of the chunk. A standard Nether could have 5 veins at most.\n\tint NumGlowStone = m_Noise.IntNoise2DInt(ChunkX, ChunkZ) % a_ChunkDesc.GetMaxHeight() / 23;\n\n\tfor (int i = 1; i <= NumGlowStone; i++)\n\t{\n\t\t// The maximum size for a string of glowstone can get 3 - 5 blocks long\n\t\tint Size = 3 + m_Noise.IntNoise3DInt(ChunkX, i, ChunkZ) % 3;\n\n\t\t// Generate X / Z coordinates.\n\t\tint X = Size + (m_Noise.IntNoise2DInt(i, Size) % (cChunkDef::Width - Size * 2));\n\t\tint Z = Size + (m_Noise.IntNoise2DInt(X, i)    % (cChunkDef::Width - Size * 2));\n\n\t\tint Height = a_ChunkDesc.GetHeight(X, Z);\n\t\tfor (int y = Height; y > Size; y--)\n\t\t{\n\t\t\tif (!cBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(X, y, Z)))\n\t\t\t{\n\t\t\t\t// Current block isn't solid, bail out\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (a_ChunkDesc.GetBlockType(X, y - 1, Z) != E_BLOCK_AIR)\n\t\t\t{\n\t\t\t\t// The block below isn't air, bail out\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((m_Noise.IntNoise3DInt(X, y, Z) % 100) < 95)\n\t\t\t{\n\t\t\t\t// Have a 5% chance of creating the glowstone\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tTryPlaceGlowstone(a_ChunkDesc, X, y, Z, Size, 5 + m_Noise.IntNoise3DInt(X, y, Z) % 7);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cFinishGenGlowStone::TryPlaceGlowstone(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, int a_Size, int a_NumStrings)\n{\n\t// The starting point of every glowstone string\n\tVector3i StartPoint = Vector3i(a_RelX, a_RelY, a_RelZ);\n\n\t// Array with possible directions for a string of glowstone to go to.\n\tconst Vector3i AvailableDirections[] =\n\t{\n\t\t{ -1,  0,  0 }, { 1, 0, 0 },\n\t\t{  0, -1,  0 },  // Don't let the glowstone go up\n\t\t{  0,  0, -1 }, { 0, 0, 1 },\n\n\t\t// Diagonal direction. Only X or Z with Y.\n\t\t// If all were changed the glowstone string looks awkward\n\t\t{ 0, -1,  1 }, {  1, -1, 0 },\n\t\t{ 0, -1, -1 }, { -1, -1, 0 },\n\n\t};\n\n\tfor (int i = 1; i <= a_NumStrings; i++)\n\t{\n\t\t// The current position of the string that is being generated\n\t\tVector3i CurrentPos = Vector3i(StartPoint);\n\n\t\t// A vector where the previous direction of a glowstone string is stored.\n\t\t// This is used to make the strings change direction when going one block further\n\t\tVector3i PreviousDirection = Vector3i();\n\n\t\tfor (int j = 0; j < a_Size; j++)\n\t\t{\n\t\t\tVector3i Direction = AvailableDirections[static_cast<size_t>(m_Noise.IntNoise3DInt(CurrentPos.x, CurrentPos.y * i, CurrentPos.z)) % ARRAYCOUNT(AvailableDirections)];\n\t\t\tint Attempts = 2;  // multiply by 1 would make no difference, so multiply by 2 instead\n\n\t\t\twhile (Direction.Equals(PreviousDirection))\n\t\t\t{\n\t\t\t\t// To make the glowstone branches look better we want to make the direction change every time.\n\t\t\t\tDirection = AvailableDirections[static_cast<size_t>(m_Noise.IntNoise3DInt(CurrentPos.x, CurrentPos.y * i * Attempts, CurrentPos.z)) % ARRAYCOUNT(AvailableDirections)];\n\t\t\t\tAttempts++;\n\t\t\t}\n\n\t\t\t// Update the previous direction variable\n\t\t\tPreviousDirection = Direction;\n\n\t\t\t// Update the position of the glowstone string\n\t\t\tCurrentPos += Direction;\n\t\t\tif (cBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(CurrentPos.x, CurrentPos.y, CurrentPos.z)) && (a_ChunkDesc.GetBlockType(CurrentPos.x, CurrentPos.y, CurrentPos.z) != E_BLOCK_GLOWSTONE))\n\t\t\t{\n\t\t\t\t// The glowstone hit something solid, and it wasn't glowstone. Stop the string.\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Place a glowstone block.\n\t\t\ta_ChunkDesc.SetBlockType(CurrentPos.x, CurrentPos.y, CurrentPos.z, E_BLOCK_GLOWSTONE);\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenTallGrass:\n\nvoid cFinishGenTallGrass::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t{\n\t\tint xx = x + a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tint zz = z + a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\t\tint BiomeDensity = GetBiomeDensity(a_ChunkDesc.GetBiome(x, z));\n\n\t\t\t// Choose if we want to place long grass here. If not then bail out:\n\t\t\tif ((m_Noise.IntNoise2DInt(xx + m_Noise.IntNoise1DInt(xx), zz + m_Noise.IntNoise1DInt(zz)) / 7 % 100) > BiomeDensity)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the top block + 1. This is the place where the grass would finaly be placed:\n\t\t\tint y = a_ChunkDesc.GetHeight(x, z) + 1;\n\n\t\t\tif (y >= cChunkDef::Height - 1)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Walk below trees:\n\t\t\tauto BlockBelow = a_ChunkDesc.GetBlockType(x, y - 1, z);\n\t\t\tbool failed = false;  // marker if the search for a valid position was successful\n\n\t\t\twhile (\n\t\t\t\t(BlockBelow == E_BLOCK_LEAVES) ||\n\t\t\t\t(BlockBelow == E_BLOCK_NEW_LEAVES) ||\n\t\t\t\t(BlockBelow == E_BLOCK_LOG) ||\n\t\t\t\t(BlockBelow == E_BLOCK_NEW_LOG) ||\n\t\t\t\t(BlockBelow == E_BLOCK_AIR)\n\t\t\t)\n\t\t\t{\n\t\t\t\ty--;\n\t\t\t\tif (!cChunkDef::IsValidHeight({x, y - 1, z}))\n\t\t\t\t{\n\t\t\t\t\tfailed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tBlockBelow = a_ChunkDesc.GetBlockType(x, y - 1, z);\n\t\t\t}\n\n\t\t\tif (failed)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check if long grass can be placed:\n\t\t\tif (\n\t\t\t\t(a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) ||\n\t\t\t\t((a_ChunkDesc.GetBlockType(x, y - 1, z) != E_BLOCK_GRASS) && (a_ChunkDesc.GetBlockType(x, y - 1, z) != E_BLOCK_DIRT))\n\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Choose what long grass meta we should use:\n\t\t\tint GrassType = m_Noise.IntNoise2DInt(xx * 50, zz * 50) / 7 % 100;\n\t\t\tif ((GrassType < 60) && CanGrassGrow(a_ChunkDesc.GetBiome(x, z)))\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_TALL_GRASS, E_META_TALL_GRASS_GRASS);\n\t\t\t}\n\t\t\telse if ((GrassType < 90) && CanFernGrow(a_ChunkDesc.GetBiome(x, z)))\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_TALL_GRASS, E_META_TALL_GRASS_FERN);\n\t\t\t}\n\t\t\telse if (!IsBiomeVeryCold(a_ChunkDesc.GetBiome(x, z)))\n\t\t\t{\n\t\t\t\t// If double long grass we have to choose what type we should use:\n\t\t\t\tif (a_ChunkDesc.GetBlockType(x, y + 1, z) == E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\tNIBBLETYPE Meta;\n\t\t\t\t\tif (CanGrassGrow(a_ChunkDesc.GetBiome(x, z)))\n\t\t\t\t\t{\n\t\t\t\t\t\tMeta = (m_Noise.IntNoise2DInt(xx * 100, zz * 100) / 7 % 100) > 25 ? E_META_BIG_FLOWER_DOUBLE_TALL_GRASS : E_META_BIG_FLOWER_LARGE_FERN;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tMeta = E_META_BIG_FLOWER_LARGE_FERN;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((Meta != E_META_BIG_FLOWER_LARGE_FERN) || CanLargeFernGrow(a_ChunkDesc.GetBiome(x, z)))\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_BIG_FLOWER, Meta);\n\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y + 1, z, E_BLOCK_BIG_FLOWER, E_META_BIG_FLOWER_TOP);\n\t\t\t\t\t\ta_ChunkDesc.SetHeight(x, z, static_cast<HEIGHTTYPE>(y + 1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNIBBLETYPE meta = static_cast<NIBBLETYPE>((m_Noise.IntNoise2DInt(xx * 50, zz * 50) / 7 % 2) + 1);\n\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_TALL_GRASS, meta);\n\t\t\t\ta_ChunkDesc.SetHeight(x, z, static_cast<HEIGHTTYPE>(y));\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cFinishGenTallGrass::CanFernGrow(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biJungle:\n\t\tcase biJungleEdge:\n\t\tcase biJungleEdgeM:\n\t\tcase biJungleHills:\n\t\tcase biJungleM:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\treturn CanLargeFernGrow(a_Biome);\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cFinishGenTallGrass::CanLargeFernGrow(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biColdTaiga:\n\t\tcase biColdTaigaHills:\n\t\tcase biColdTaigaM:\n\n\t\tcase biTaiga:\n\t\tcase biTaigaHills:\n\t\tcase biTaigaM:\n\n\t\tcase biMegaSpruceTaiga:\n\t\tcase biMegaSpruceTaigaHills:\n\t\tcase biMegaTaiga:\n\t\tcase biMegaTaigaHills:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nint cFinishGenTallGrass::GetBiomeDensity(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biSavanna:\n\t\tcase biSavannaM:\n\t\tcase biSavannaPlateau:\n\t\tcase biSavannaPlateauM:\n\t\tcase biPlains:\n\t\t{\n\t\t\treturn 70;\n\t\t}\n\n\t\tcase biExtremeHillsEdge:\n\t\tcase biExtremeHillsPlus:\n\t\tcase biExtremeHills:\n\t\tcase biExtremeHillsPlusM:\n\t\tcase biExtremeHillsM:\n\t\tcase biIceMountains:\n\t\t{\n\t\t\treturn 3;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\treturn 20;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cFinishGenTallGrass::CanGrassGrow(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biMegaTaiga:\n\t\tcase biMegaTaigaHills:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenVines\n\nbool cFinishGenVines::IsJungleVariant(EMCSBiome a_Biome)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biJungle:\n\t\tcase biJungleEdge:\n\t\tcase biJungleEdgeM:\n\t\tcase biJungleHills:\n\t\tcase biJungleM:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cFinishGenVines::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t{\n\t\tint xx = x + a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tint zz = z + a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\t\tif (!IsJungleVariant(a_ChunkDesc.GetBiome(x, z)))\n\t\t\t{\n\t\t\t\t// Current biome isn't a jungle\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((m_Noise.IntNoise2DInt(xx, zz) % 101) < 50)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tint Height = a_ChunkDesc.GetHeight(x, z);\n\t\t\tfor (int y = Height; y > m_Level; y--)\n\t\t\t{\n\t\t\t\tif (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\t// Can't place vines in non-air blocks\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ((m_Noise.IntNoise3DInt(xx, y, zz) % 101) < 50)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tstd::vector<NIBBLETYPE> Places;\n\t\t\t\tif ((x + 1 < cChunkDef::Width) && cBlockInfo::FullyOccupiesVoxel(a_ChunkDesc.GetBlockType(x + 1, y, z)))\n\t\t\t\t{\n\t\t\t\t\tPlaces.push_back(8);\n\t\t\t\t}\n\n\t\t\t\tif ((x - 1 > 0) && cBlockInfo::FullyOccupiesVoxel(a_ChunkDesc.GetBlockType(x - 1, y, z)))\n\t\t\t\t{\n\t\t\t\t\tPlaces.push_back(2);\n\t\t\t\t}\n\n\t\t\t\tif ((z + 1 < cChunkDef::Width) && cBlockInfo::FullyOccupiesVoxel(a_ChunkDesc.GetBlockType(x, y, z + 1)))\n\t\t\t\t{\n\t\t\t\t\tPlaces.push_back(1);\n\t\t\t\t}\n\n\t\t\t\tif ((z - 1 > 0) && cBlockInfo::FullyOccupiesVoxel(a_ChunkDesc.GetBlockType(x, y, z - 1)))\n\t\t\t\t{\n\t\t\t\t\tPlaces.push_back(4);\n\t\t\t\t}\n\n\t\t\t\tif (Places.size() == 0)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tNIBBLETYPE Meta = Places[static_cast<size_t>(m_Noise.IntNoise3DInt(xx, y, zz)) % Places.size()];\n\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_VINES, Meta);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenSprinkleFoliage:\n\nbool cFinishGenSprinkleFoliage::TryAddCactus(cChunkDesc & a_ChunkDesc, int a_RelX, HEIGHTTYPE & a_RelY, int a_RelZ)\n{\n\tif (!IsDesertVariant(a_ChunkDesc.GetBiome(a_RelX, a_RelZ)))\n\t{\n\t\treturn false;\n\t}\n\n\tint CactusHeight = 1 + (m_Noise.IntNoise2DInt(a_RelX, a_RelZ) % m_MaxCactusHeight);\n\n\t// We'll be doing comparison with blocks above, so the coords should be 1 block away from chunk top\n\tif (a_RelY + CactusHeight >= cChunkDef::Height - 1)\n\t{\n\t\tCactusHeight = cChunkDef::Height - a_RelY - 1;\n\t}\n\n\t// We'll be doing comparison to neighbors, so require the coords to be 1 block away from the chunk edges:\n\tif (\n\t\t(a_RelX < 1) || (a_RelX >= cChunkDef::Width - 1) ||\n\t\t(a_RelZ < 1) || (a_RelZ >= cChunkDef::Width - 1)\n\t)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (int i = 0; i < CactusHeight; i++)\n\t{\n\t\tconst bool cactusExists = i != 0;\n\n\t\tconst int y = a_RelY + 1;\n\t\tif (\n\t\t\tcBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(a_RelX + 1, y, a_RelZ)) \t ||\n\t\t\tcBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(a_RelX - 1, y, a_RelZ)) \t ||\n\t\t\tcBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(a_RelX, \t y, a_RelZ + 1)) ||\n\t\t\tcBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(a_RelX, \t y, a_RelZ - 1))\n\t\t)\n\t\t{\n\t\t\treturn cactusExists;\n\t\t}\n\n\t\t// All conditions are met, we can place a cactus here\n\t\ta_ChunkDesc.SetBlockType(a_RelX, ++a_RelY, a_RelZ, E_BLOCK_CACTUS);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenSprinkleFoliage:\n\nbool cFinishGenSprinkleFoliage::TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_RelX, HEIGHTTYPE & a_RelY, int a_RelZ)\n{\n\tint SugarcaneHeight = 1 + (m_Noise.IntNoise2DInt(a_RelX, a_RelZ) % m_MaxSugarcaneHeight);\n\n\t// Only allow dirt, grass, sand and sugarcane below sugarcane:\n\tswitch (a_ChunkDesc.GetBlockType(a_RelX, a_RelY, a_RelZ))\n\t{\n\t\tcase E_BLOCK_DIRT:\n\t\tcase E_BLOCK_GRASS:\n\t\tcase E_BLOCK_SAND:\n\t\tcase E_BLOCK_SUGARCANE:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// We'll be doing comparison with blocks above, so the coords should be 1 block away from chunk top\n\tif (a_RelY + SugarcaneHeight >= cChunkDef::Height - 1)\n\t{\n\t\tSugarcaneHeight = cChunkDef::Height - a_RelY - 1;\n\t}\n\n\t// We'll be doing comparison to neighbors, so require the coords to be 1 block away from the chunk edges:\n\tif (\n\t\t(a_RelX < 1) || (a_RelX >= cChunkDef::Width  - 1) ||\n\t\t(a_RelZ < 1) || (a_RelZ >= cChunkDef::Width  - 1)\n\t)\n\t{\n\t\treturn false;\n\t}\n\n\t// Water is required next to the block below the sugarcane (if the block below isn't sugarcane already)\n\tif (\n\t\t!IsWater(a_ChunkDesc.GetBlockType(a_RelX - 1, a_RelY, a_RelZ)) &&\n\t\t!IsWater(a_ChunkDesc.GetBlockType(a_RelX + 1, a_RelY, a_RelZ)) &&\n\t\t!IsWater(a_ChunkDesc.GetBlockType(a_RelX,     a_RelY, a_RelZ - 1)) &&\n\t\t!IsWater(a_ChunkDesc.GetBlockType(a_RelX,     a_RelY, a_RelZ + 1)) &&\n\t\ta_ChunkDesc.GetBlockType(a_RelX, a_RelY, a_RelZ) != E_BLOCK_SUGARCANE\n\t)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (int i = 0; i < SugarcaneHeight; i++)\n\t{\n\t\t// All conditions met, place a sugarcane here\n\t\ta_ChunkDesc.SetBlockType(a_RelX, ++a_RelY, a_RelZ, E_BLOCK_SUGARCANE);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\t// Generate small foliage (1-block):\n\n\t// TODO: Update heightmap with 1-block-tall foliage\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z;\n\t\tconst float zz = static_cast<float>(BlockZ);\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width + x;\n\t\t\tif (((m_Noise.IntNoise2DInt(BlockX, BlockZ) / 8) % 128) < 124)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tHEIGHTTYPE Top = a_ChunkDesc.GetHeight(x, z);\n\t\t\tif (Top > 250)\n\t\t\t{\n\t\t\t\t// Nothing grows above Y=250\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (a_ChunkDesc.GetBlockType(x, Top + 1, z) != E_BLOCK_AIR)\n\t\t\t{\n\t\t\t\t// Space already taken by something else, don't grow here\n\t\t\t\t// WEIRD, since we're using heightmap, so there should NOT be anything above it\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst float xx = static_cast<float>(BlockX);\n\t\t\tfloat val1 = m_Noise.CubicNoise2D(xx * 0.1f,  zz * 0.1f);\n\t\t\tfloat val2 = m_Noise.CubicNoise2D(xx * 0.01f, zz * 0.01f);\n\t\t\tswitch (a_ChunkDesc.GetBlockType(x, Top, z))\n\t\t\t{\n\t\t\t\tcase E_BLOCK_GRASS:\n\t\t\t\t{\n\t\t\t\t\tif (TryAddSugarcane(a_ChunkDesc, x, Top, z))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Checks and block placing are handled in the TryAddSugarcane method\n\t\t\t\t\t}\n\t\t\t\t\telse if ((val1 > 0.5) && (val2 < -0.5))\n\t\t\t\t\t{\n\t\t\t\t\t\tfloat val3 = m_Noise.CubicNoise2D(xx * 0.01f + 10, zz * 0.01f + 10);\n\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, ++Top, z, E_BLOCK_PUMPKIN, static_cast<unsigned>(val3 * 8) % 4);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}  // case E_BLOCK_GRASS\n\n\t\t\t\tcase E_BLOCK_SAND:\n\t\t\t\t{\n\t\t\t\t\tif (val1 + val2 > 0.5f)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!TryAddCactus(a_ChunkDesc, x, Top, z))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTryAddSugarcane(a_ChunkDesc, x, Top, z);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tTryAddSugarcane(a_ChunkDesc, x, Top, z);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // switch (TopBlock)\n\t\t\ta_ChunkDesc.SetHeight(x, z, Top);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nbool cFinishGenSprinkleFoliage::IsDesertVariant(EMCSBiome a_Biome)\n{\n\treturn\n\t(\n\t\t(a_Biome == biDesertHills) ||\n\t\t(a_Biome == biDesert) ||\n\t\t(a_Biome == biDesertM)\n\t);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenSoulsandRims\n\nvoid cFinishGenSoulsandRims::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint ChunkZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tHEIGHTTYPE MaxHeight = a_ChunkDesc.GetMaxHeight();\n\n\tfor (int x = 0; x < 16; x++)\n\t{\n\t\tint xx = ChunkX + x;\n\t\tfor (int z = 0; z < 16; z++)\n\t\t{\n\t\t\tint zz = ChunkZ + z;\n\n\t\t\t// Place soulsand rims when netherrack gets thin\n\t\t\tfor (int y = 2; y < MaxHeight - 2; y++)\n\t\t\t{\n\t\t\t\t// The current block is air. Let's bail ut.\n\t\t\t\tBLOCKTYPE Block = a_ChunkDesc.GetBlockType(x, y, z);\n\t\t\t\tif (Block != E_BLOCK_NETHERRACK)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t((a_ChunkDesc.GetBlockType(x, y + 1, z) != E_BLOCK_AIR) &&\n\t\t\t\t\t( a_ChunkDesc.GetBlockType(x, y + 2, z) != E_BLOCK_AIR)) ||\n\t\t\t\t\t((a_ChunkDesc.GetBlockType(x, y - 1, z) != E_BLOCK_AIR) &&\n\t\t\t\t\t( a_ChunkDesc.GetBlockType(x, y - 2, z) != E_BLOCK_AIR))\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tNOISE_DATATYPE NoiseX = (static_cast<NOISE_DATATYPE>(xx)) / 32;\n\t\t\t\tNOISE_DATATYPE NoiseY = (static_cast<NOISE_DATATYPE>(zz)) / 32;\n\t\t\t\tNOISE_DATATYPE CompBlock = m_Noise.CubicNoise3D(NoiseX, static_cast<float>(y) / 4, NoiseY);\n\t\t\t\tif (CompBlock < 0)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_SOULSAND);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenSnow:\n\nvoid cFinishGenSnow::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\t// Add a snow block in snowy biomes onto blocks that can be snowed over\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tHEIGHTTYPE Height = a_ChunkDesc.GetHeight(x, z);\n\t\t\tif (GetSnowStartHeight(a_ChunkDesc.GetBiome(x, z)) > Height)\n\t\t\t{\n\t\t\t\t// Height isn't high enough for snow to start forming.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!cBlockInfo::IsSnowable(a_ChunkDesc.GetBlockType(x, Height, z)) || (Height >= cChunkDef::Height - 1))\n\t\t\t{\n\t\t\t\t// The top block can't be snown over.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ta_ChunkDesc.SetBlockType(x, Height + 1, z, E_BLOCK_SNOW);\n\t\t\ta_ChunkDesc.SetHeight(x, z, Height + 1);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenIce:\n\nvoid cFinishGenIce::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\t// Turn surface water into ice in icy biomes\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint Height = a_ChunkDesc.GetHeight(x, z);\n\t\t\tif (GetSnowStartHeight(a_ChunkDesc.GetBiome(x, z)) > Height)\n\t\t\t{\n\t\t\t\t// Height isn't high enough for snow to start forming.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!IsBlockWater(a_ChunkDesc.GetBlockType(x, Height, z)))\n\t\t\t{\n\t\t\t\t// The block isn't a water block.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (a_ChunkDesc.GetBlockMeta(x, Height, z) != 0)\n\t\t\t{\n\t\t\t\t// The water block isn't a source block.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ta_ChunkDesc.SetBlockType(x, Height, z, E_BLOCK_ICE);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenSingleTopBlock:\n\nint cFinishGenSingleTopBlock::GetNumToGen(const cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tint res = 0;\n\tfor (size_t i = 0; i < ARRAYCOUNT(a_BiomeMap); i++)\n\t{\n\t\tif (IsAllowedBiome(a_BiomeMap[i]))\n\t\t{\n\t\t\tres++;\n\t\t}\n\t}  // for i - a_BiomeMap[]\n\treturn m_Amount * res / 256;\n}\n\n\n\n\n\nvoid cFinishGenSingleTopBlock::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint NumToGen = GetNumToGen(a_ChunkDesc.GetBiomeMap());\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\tfor (int i = 0; i < NumToGen; i++)\n\t{\n\t\tint x = (m_Noise.IntNoise3DInt(ChunkX + ChunkZ, ChunkZ, i) / 13) % cChunkDef::Width;\n\t\tint z = (m_Noise.IntNoise3DInt(ChunkX - ChunkZ, i, ChunkZ) / 11) % cChunkDef::Width;\n\n\t\t// Place the block at {x, z} if possible:\n\t\tEMCSBiome Biome = a_ChunkDesc.GetBiome(x, z);\n\t\tif (!IsAllowedBiome(Biome))\n\t\t{\n\t\t\t// Incorrect biome\n\t\t\tcontinue;\n\t\t}\n\n\t\tHEIGHTTYPE Height = a_ChunkDesc.GetHeight(x, z);\n\t\tif (Height >= cChunkDef::Height - 1)\n\t\t{\n\t\t\t// Too high up\n\t\t\tcontinue;\n\t\t}\n\t\tif (a_ChunkDesc.GetBlockType(x, Height + 1, z) != E_BLOCK_AIR)\n\t\t{\n\t\t\t// Not an empty block\n\t\t\tcontinue;\n\t\t}\n\n\t\tBLOCKTYPE BlockBelow = a_ChunkDesc.GetBlockType(x, Height, z);\n\t\tif (!IsAllowedBlockBelow(BlockBelow))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\ta_ChunkDesc.SetBlockType(x, Height + 1, z, m_BlockType);\n\t\ta_ChunkDesc.SetHeight(x, z, Height + 1);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenBottomLava:\n\nvoid cFinishGenBottomLava::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tcChunkDef::BlockTypes & BlockTypes = a_ChunkDesc.GetBlockTypes();\n\tfor (int y = m_Level; y > 0; y--)\n\t{\n\t\tfor (int z = 0; z < cChunkDef::Width; z++) for (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tconst auto Index = cChunkDef::MakeIndex(x, y, z);\n\t\t\tif (BlockTypes[Index] == E_BLOCK_AIR)\n\t\t\t{\n\t\t\t\tBlockTypes[Index] = E_BLOCK_STATIONARY_LAVA;\n\t\t\t}\n\t\t}  // for x, for z\n\t}  // for y\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenPreSimulator:\n\ncFinishGenPreSimulator::cFinishGenPreSimulator(bool a_PreSimulateFallingBlocks, bool a_PreSimulateWater, bool a_PreSimulateLava) :\n\tm_PreSimulateFallingBlocks(a_PreSimulateFallingBlocks),\n\tm_PreSimulateWater(a_PreSimulateWater),\n\tm_PreSimulateLava(a_PreSimulateLava)\n{\n\t// Nothing needed yet\n}\n\n\n\n\n\nvoid cFinishGenPreSimulator::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tif (m_PreSimulateFallingBlocks)\n\t{\n\t\tCollapseSandGravel(a_ChunkDesc);\n\t}\n\n\tif (m_PreSimulateWater)\n\t{\n\t\tStationarizeFluid(a_ChunkDesc.GetBlockTypes(), a_ChunkDesc.GetHeightMap(), E_BLOCK_WATER, E_BLOCK_STATIONARY_WATER);\n\t}\n\n\tif (m_PreSimulateLava)\n\t{\n\t\tStationarizeFluid(a_ChunkDesc.GetBlockTypes(), a_ChunkDesc.GetHeightMap(), E_BLOCK_LAVA, E_BLOCK_STATIONARY_LAVA);\n\t}\n\t// TODO: other operations\n}\n\n\n\n\n\nvoid cFinishGenPreSimulator::CollapseSandGravel(cChunkDesc & a_ChunkDesc)\n{\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint LastY = -1;\n\t\t\tint HeightY = 0;\n\t\t\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t\t\t{\n\t\t\t\tBLOCKTYPE Block = a_ChunkDesc.GetBlockType(x, y, z);\n\t\t\t\tswitch (Block)\n\t\t\t\t{\n\t\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\t// Set the last block onto which stuff can fall to this height:\n\t\t\t\t\t\tLastY = y;\n\t\t\t\t\t\tHeightY = y;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase E_BLOCK_AIR:\n\t\t\t\t\t{\n\t\t\t\t\t\t// Do nothing\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase E_BLOCK_FIRE:\n\t\t\t\t\tcase E_BLOCK_WATER:\n\t\t\t\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\t\t\t\tcase E_BLOCK_LAVA:\n\t\t\t\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t\t\t\t{\n\t\t\t\t\t\t// Do nothing, only remember this height as potentially highest\n\t\t\t\t\t\tHeightY = y;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase E_BLOCK_SAND:\n\t\t\t\t\tcase E_BLOCK_GRAVEL:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (LastY < y - 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto BlockMeta = a_ChunkDesc.GetBlockMeta(x, y, z);\n\t\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, LastY + 1, z, Block, BlockMeta);\n\t\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_AIR, 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tLastY++;\n\t\t\t\t\t\tif (LastY > HeightY)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tHeightY = LastY;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}  // switch (GetBlock)\n\t\t\t}  // for y\n\t\t\ta_ChunkDesc.SetHeight(x, z, static_cast<HEIGHTTYPE>(HeightY));\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cFinishGenPreSimulator::StationarizeFluid(\n\tcChunkDef::BlockTypes & a_BlockTypes,    // Block types to read and change\n\tcChunkDef::HeightMap & a_HeightMap,      // Height map to read\n\tBLOCKTYPE a_Fluid,\n\tBLOCKTYPE a_StationaryFluid\n)\n{\n\t// Turn fluid in the middle to stationary, unless it has air or washable block next to it:\n\tfor (int z = 1; z < cChunkDef::Width - 1; z++)\n\t{\n\t\tfor (int x = 1; x < cChunkDef::Width - 1; x++)\n\t\t{\n\t\t\tfor (int y = cChunkDef::GetHeight(a_HeightMap, x, z); y >= 0; y--)\n\t\t\t{\n\t\t\t\tBLOCKTYPE Block = cChunkDef::GetBlock(a_BlockTypes, x, y, z);\n\t\t\t\tif ((Block != a_Fluid) && (Block != a_StationaryFluid))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstatic const struct\n\t\t\t\t{\n\t\t\t\t\tint x, y, z;\n\t\t\t\t} Coords[] =\n\t\t\t\t{\n\t\t\t\t\t{1, 0, 0},\n\t\t\t\t\t{-1, 0, 0},\n\t\t\t\t\t{0, 0, 1},\n\t\t\t\t\t{0, 0, -1},\n\t\t\t\t\t{0, -1, 0}\n\t\t\t\t} ;\n\t\t\t\tBLOCKTYPE BlockToSet = a_StationaryFluid;  // By default, don't simulate this block\n\t\t\t\tfor (size_t i = 0; i < ARRAYCOUNT(Coords); i++)\n\t\t\t\t{\n\t\t\t\t\tif ((y == 0) && (Coords[i].y < 0))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tBLOCKTYPE Neighbor = cChunkDef::GetBlock(a_BlockTypes, x + Coords[i].x, y + Coords[i].y, z + Coords[i].z);\n\t\t\t\t\tif ((Neighbor == E_BLOCK_AIR) || cFluidSimulator::CanWashAway(Neighbor))\n\t\t\t\t\t{\n\t\t\t\t\t\t// There is an air / washable neighbor, simulate this block\n\t\t\t\t\t\tBlockToSet = a_Fluid;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}  // for i - Coords[]\n\t\t\t\tcChunkDef::SetBlock(a_BlockTypes, x, y, z, BlockToSet);\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n\n\t// Turn fluid at the chunk edges into non-stationary fluid:\n\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t{\n\t\tfor (int i = 0; i < cChunkDef::Width; i++)  // i stands for both x and z here\n\t\t{\n\t\t\tif (cChunkDef::GetBlock(a_BlockTypes, 0, y, i) == a_StationaryFluid)\n\t\t\t{\n\t\t\t\tcChunkDef::SetBlock(a_BlockTypes, 0, y, i, a_Fluid);\n\t\t\t}\n\t\t\tif (cChunkDef::GetBlock(a_BlockTypes, i, y, 0) == a_StationaryFluid)\n\t\t\t{\n\t\t\t\tcChunkDef::SetBlock(a_BlockTypes, i, y, 0, a_Fluid);\n\t\t\t}\n\t\t\tif (cChunkDef::GetBlock(a_BlockTypes, cChunkDef::Width - 1, y, i) == a_StationaryFluid)\n\t\t\t{\n\t\t\t\tcChunkDef::SetBlock(a_BlockTypes, cChunkDef::Width - 1, y, i, a_Fluid);\n\t\t\t}\n\t\t\tif (cChunkDef::GetBlock(a_BlockTypes, i, y, cChunkDef::Width - 1) == a_StationaryFluid)\n\t\t\t{\n\t\t\t\tcChunkDef::SetBlock(a_BlockTypes, i, y, cChunkDef::Width - 1, a_Fluid);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenFluidSprings:\n\ncFinishGenFluidSprings::cFinishGenFluidSprings(int a_Seed, BLOCKTYPE a_Fluid, cIniFile & a_IniFile, eDimension a_Dimension) :\n\tm_Noise(a_Seed + a_Fluid * 100),  // Need to take fluid into account, otherwise water and lava springs generate next to each other\n\tm_HeightDistribution(cChunkDef::Height - 1),\n\tm_Fluid(a_Fluid)\n{\n\tbool IsWater = (a_Fluid == E_BLOCK_WATER);\n\tAString SectionName = IsWater ? \"WaterSprings\" : \"LavaSprings\";\n\tAString DefaultHeightDistribution;\n\tint DefaultChance = 0;\n\tswitch (a_Dimension)\n\t{\n\t\tcase dimNether:\n\t\t{\n\t\t\tDefaultHeightDistribution = IsWater ? DEF_NETHER_WATER_SPRINGS : DEF_NETHER_LAVA_SPRINGS;\n\t\t\tDefaultChance = IsWater ? 0 : 15;\n\t\t\tbreak;\n\t\t}\n\t\tcase dimOverworld:\n\t\t{\n\t\t\tDefaultHeightDistribution = IsWater ? DEF_OVERWORLD_WATER_SPRINGS : DEF_OVERWORLD_LAVA_SPRINGS;\n\t\t\tDefaultChance = IsWater ? 24 : 9;\n\t\t\tbreak;\n\t\t}\n\t\tcase dimEnd:\n\t\t{\n\t\t\tDefaultHeightDistribution = IsWater ? DEF_END_WATER_SPRINGS : DEF_END_LAVA_SPRINGS;\n\t\t\tDefaultChance = 0;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unhandled world dimension\");\n\t\t\tbreak;\n\t\t}\n\t}  // switch (dimension)\n\tAString HeightDistribution = a_IniFile.GetValueSet(SectionName, \"HeightDistribution\", DefaultHeightDistribution);\n\tif (!m_HeightDistribution.SetDefString(HeightDistribution) || (m_HeightDistribution.GetSum() <= 0))\n\t{\n\t\tLOGWARNING(\"[%sSprings]: HeightDistribution is invalid, using the default of \\\"%s\\\".\",\n\t\t\t(a_Fluid == E_BLOCK_WATER) ? \"Water\" : \"Lava\",\n\t\t\tDefaultHeightDistribution.c_str()\n\t\t);\n\t\tm_HeightDistribution.SetDefString(DefaultHeightDistribution);\n\t}\n\tm_Chance = a_IniFile.GetValueSetI(SectionName, \"Chance\", DefaultChance);\n}\n\n\n\n\n\nvoid cFinishGenFluidSprings::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint ChanceRnd = (m_Noise.IntNoise3DInt(128 * a_ChunkDesc.GetChunkX(), 512, 256 * a_ChunkDesc.GetChunkZ()) / 13) % 100;\n\tif (ChanceRnd > m_Chance)\n\t{\n\t\t// Not in this chunk\n\t\treturn;\n\t}\n\n\t// Get the height at which to try:\n\tint Height = m_Noise.IntNoise3DInt(128 * a_ChunkDesc.GetChunkX(), 1024, 256 * a_ChunkDesc.GetChunkZ()) / 11;\n\tHeight %= m_HeightDistribution.GetSum();\n\tHeight = m_HeightDistribution.MapValue(Height);\n\n\t// Try adding the spring at the height, if unsuccessful, move lower:\n\tfor (int y = Height; y > 1; y--)\n\t{\n\t\t// TODO: randomize the order in which the coords are being checked\n\t\tfor (int z = 1; z < cChunkDef::Width - 1; z++)\n\t\t{\n\t\t\tfor (int x = 1; x < cChunkDef::Width - 1; x++)\n\t\t\t{\n\t\t\t\tswitch (a_ChunkDesc.GetBlockType(x, y, z))\n\t\t\t\t{\n\t\t\t\t\tcase E_BLOCK_NETHERRACK:\n\t\t\t\t\tcase E_BLOCK_STONE:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (TryPlaceSpring(a_ChunkDesc, x, y, z))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Succeeded, bail out\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}  // switch (BlockType)\n\t\t\t}  // for x\n\t\t}  // for y\n\t}  // for y\n}\n\n\n\n\n\nbool cFinishGenFluidSprings::TryPlaceSpring(cChunkDesc & a_ChunkDesc, int x, int y, int z)\n{\n\t// In order to place a spring, it needs exactly one of the XZ neighbors or a below neighbor to be air\n\t// Also, its neighbor on top of it must be non-air\n\tif (a_ChunkDesc.GetBlockType(x, y + 1, z) == E_BLOCK_AIR)\n\t{\n\t\treturn false;\n\t}\n\n\tstatic const struct\n\t{\n\t\tint x, y, z;\n\t} Coords[] =\n\t{\n\t\t{-1,  0,  0},\n\t\t{ 1,  0,  0},\n\t\t{ 0, -1,  0},\n\t\t{ 0,  0, -1},\n\t\t{ 0,  0,  1},\n\t} ;\n\tint NumAirNeighbors = 0;\n\tfor (size_t i = 0; i < ARRAYCOUNT(Coords); i++)\n\t{\n\t\tswitch (a_ChunkDesc.GetBlockType(x + Coords[i].x, y + Coords[i].y, z + Coords[i].z))\n\t\t{\n\t\t\tcase E_BLOCK_AIR:\n\t\t\t{\n\t\t\t\tNumAirNeighbors += 1;\n\t\t\t\tif (NumAirNeighbors > 1)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (NumAirNeighbors == 0)\n\t{\n\t\treturn false;\n\t}\n\n\t// Has exactly one air neighbor, place a spring:\n\ta_ChunkDesc.SetBlockTypeMeta(x, y, z, m_Fluid, 0);\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenPassiveMobs:\n\ncFinishGenPassiveMobs::cFinishGenPassiveMobs(int a_Seed, cIniFile & a_IniFile, eDimension a_Dimension) :\n\tm_Noise(a_Seed)\n{\n\tAString SectionName = \"Animals\";\n\tint DefaultAnimalSpawnChunkPercentage = DEF_ANIMAL_SPAWN_PERCENT;\n\tswitch (a_Dimension)\n\t{\n\t\tcase dimOverworld:\n\t\t{\n\t\t\tDefaultAnimalSpawnChunkPercentage = DEF_ANIMAL_SPAWN_PERCENT;\n\t\t\tbreak;\n\t\t}\n\t\tcase dimNether:\n\t\tcase dimEnd:  // No nether or end animals (currently)\n\t\t{\n\t\t\tDefaultAnimalSpawnChunkPercentage = DEF_NO_ANIMALS;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unhandled world dimension\");\n\t\t\tDefaultAnimalSpawnChunkPercentage = DEF_NO_ANIMALS;\n\t\t\tbreak;\n\t\t}\n\t}  // switch (dimension)\n\tm_AnimalProbability = a_IniFile.GetValueSetI(SectionName, \"AnimalSpawnChunkPercentage\", DefaultAnimalSpawnChunkPercentage);\n\tif ((m_AnimalProbability < 0) || (m_AnimalProbability > 100))\n\t{\n\t\tLOGWARNING(\"[Animals]: AnimalSpawnChunkPercentage is invalid, using the default of \\\"%d\\\".\", DefaultAnimalSpawnChunkPercentage);\n\t\tm_AnimalProbability = DefaultAnimalSpawnChunkPercentage;\n\t}\n}\n\n\n\n\n\nvoid cFinishGenPassiveMobs::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint chunkX = a_ChunkDesc.GetChunkX();\n\tint chunkZ = a_ChunkDesc.GetChunkZ();\n\tint ChanceRnd = (m_Noise.IntNoise2DInt(chunkX, chunkZ) / 7) % 100;\n\tif (ChanceRnd > m_AnimalProbability)\n\t{\n\t\treturn;\n\t}\n\n\teMonsterType RandomMob = GetRandomMob(a_ChunkDesc);\n\tif (RandomMob == mtInvalidType)\n\t{\n\t\t// No mobs here. Don't send an error, because if the biome was a desert it would return mtInvalidType as well.\n\t\treturn;\n\t}\n\n\t// Try spawning a pack center 10 times, should get roughly the same probability\n\tfor (int Tries = 0; Tries < 10; Tries++)\n\t{\n\t\tint PackCenterX = (m_Noise.IntNoise2DInt(chunkX + chunkZ, Tries) / 7) % cChunkDef::Width;\n\t\tint PackCenterZ = (m_Noise.IntNoise2DInt(chunkX, chunkZ + Tries) / 7) % cChunkDef::Width;\n\t\tif (TrySpawnAnimals(a_ChunkDesc, PackCenterX, a_ChunkDesc.GetHeight(PackCenterX, PackCenterZ), PackCenterZ, RandomMob))\n\t\t{\n\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t{\n\t\t\t\tint OffsetX = (m_Noise.IntNoise2DInt(chunkX + chunkZ + i, Tries) / 7) % cChunkDef::Width;\n\t\t\t\tint OffsetZ = (m_Noise.IntNoise2DInt(chunkX, chunkZ + Tries + i) / 7) % cChunkDef::Width;\n\t\t\t\tTrySpawnAnimals(a_ChunkDesc, OffsetX, a_ChunkDesc.GetHeight(OffsetX, OffsetZ), OffsetZ, RandomMob);\n\t\t\t}\n\t\t\treturn;\n\n\t\t}  // if pack center spawn successful\n\t}  // for tries\n}\n\n\n\n\n\nbool cFinishGenPassiveMobs::TrySpawnAnimals(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, eMonsterType AnimalToSpawn)\n{\n\tif ((a_RelY >= cChunkDef::Height - 1) || (a_RelY <= 0))\n\t{\n\t\treturn false;\n\t}\n\n\tBLOCKTYPE BlockAtHead    = a_ChunkDesc.GetBlockType(a_RelX, a_RelY + 1, a_RelZ);\n\tBLOCKTYPE BlockAtFeet    = a_ChunkDesc.GetBlockType(a_RelX, a_RelY, a_RelZ);\n\tBLOCKTYPE BlockUnderFeet = a_ChunkDesc.GetBlockType(a_RelX, a_RelY - 1, a_RelZ);\n\n\t// Check block below (opaque, grass, water), and above (air)\n\tif ((AnimalToSpawn == mtSquid) && (BlockAtFeet != E_BLOCK_WATER))\n\t{\n\t\treturn false;\n\t}\n\tif (\n\t\t(AnimalToSpawn != mtSquid) &&\n\t\t(BlockAtHead != E_BLOCK_AIR) &&\n\t\t(BlockAtFeet != E_BLOCK_AIR) &&\n\t\t(!cBlockInfo::IsTransparent(BlockUnderFeet))\n\t)\n\t{\n\t\treturn false;\n\t}\n\tif (\n\t\t(BlockUnderFeet != E_BLOCK_GRASS) &&\n\t\t((AnimalToSpawn == mtWolf) || (AnimalToSpawn == mtRabbit) || (AnimalToSpawn == mtCow) || (AnimalToSpawn == mtSheep) || (AnimalToSpawn == mtChicken) || (AnimalToSpawn == mtPig))\n\t)\n\t{\n\t\treturn false;\n\t}\n\tif ((AnimalToSpawn == mtMooshroom) && (BlockUnderFeet != E_BLOCK_MYCELIUM))\n\t{\n\t\treturn false;\n\t}\n\n\tdouble AnimalX = static_cast<double>(a_ChunkDesc.GetChunkX() * cChunkDef::Width + a_RelX + 0.5);\n\tdouble AnimalY = a_RelY;\n\tdouble AnimalZ = static_cast<double>(a_ChunkDesc.GetChunkZ() * cChunkDef::Width + a_RelZ + 0.5);\n\n\tauto NewMob = cMonster::NewMonsterFromType(AnimalToSpawn);\n\tNewMob->SetHealth(NewMob->GetMaxHealth());\n\tNewMob->SetPosition(AnimalX, AnimalY, AnimalZ);\n\tFLOGD(\"Spawning {0} #{1} at {2:.02f}\", NewMob->GetClass(), NewMob->GetUniqueID(), NewMob->GetPosition());\n\ta_ChunkDesc.GetEntities().emplace_back(std::move(NewMob));\n\n\treturn true;\n}\n\n\n\n\n\neMonsterType cFinishGenPassiveMobs::GetRandomMob(cChunkDesc & a_ChunkDesc)\n{\n\tstd::vector<eMonsterType> ListOfSpawnables;\n\tint chunkX = a_ChunkDesc.GetChunkX();\n\tint chunkZ = a_ChunkDesc.GetChunkZ();\n\tint x = (m_Noise.IntNoise2DInt(chunkX, chunkZ + 10) / 7) % cChunkDef::Width;\n\tint z = (m_Noise.IntNoise2DInt(chunkX + chunkZ, chunkZ) / 7) % cChunkDef::Width;\n\n\tfor (auto MobType : cMobSpawner::GetAllowedMobTypes(a_ChunkDesc.GetBiome(x, z)))\n\t{\n\t\tif (cMonster::FamilyFromType(MobType) == cMonster::eFamily::mfPassive)\n\t\t{\n\t\t\tListOfSpawnables.push_back(MobType);\n\t\t}\n\t}\n\n\tif (ListOfSpawnables.empty())\n\t{\n\t\treturn mtInvalidType;\n\t}\n\n\tauto RandMob = (static_cast<size_t>(m_Noise.IntNoise2DInt(chunkX - chunkZ + 2, chunkX + 5) / 7) % ListOfSpawnables.size());\n\treturn ListOfSpawnables[RandMob];\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenOres:\n\nvoid cFinishGenOres::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint seq = 1;\n\n\t// Generate the ores from the ore list.\n\tfor (const auto & ore: m_OreInfos)\n\t{\n\t\tGenerateOre(\n\t\t\ta_ChunkDesc,\n\t\t\tore.m_BlockType, ore.m_BlockMeta,\n\t\t\tore.m_MaxHeight, ore.m_NumNests, ore.m_NestSize,\n\t\t\tseq\n\t\t);\n\t\tseq++;\n\t}\n}\n\n\n\n\n\nconst cFinishGenOres::OreInfos & cFinishGenOres::DefaultOverworldOres(void)\n{\n\tstatic OreInfos res\n\t{\n\t\t// OreType,              OreMeta, MaxHeight, NumNests, NestSize\n\t\t{E_BLOCK_COAL_ORE,       0,       127,       20,       16},\n\t\t{E_BLOCK_IRON_ORE,       0,        64,       20,        8},\n\t\t{E_BLOCK_GOLD_ORE,       0,        32,        2,        8},\n\t\t{E_BLOCK_REDSTONE_ORE,   0,        16,        8,        7},\n\t\t{E_BLOCK_DIAMOND_ORE,    0,        15,        1,        7},\n\t\t{E_BLOCK_LAPIS_ORE,      0,        30,        1,        6},\n\t\t{E_BLOCK_EMERALD_ORE,    0,        32,       11,        1},\n\t\t{E_BLOCK_SILVERFISH_EGG, 0,        64,        7,        9},\n\t};\n\treturn res;\n}\n\n\n\n\n\nconst cFinishGenOres::OreInfos & cFinishGenOres::DefaultNetherOres(void)\n{\n\tstatic OreInfos res\n\t{\n\t\t// OreType,                 OreMeta, MaxHeight, NumNests, NestSize\n\t\t{E_BLOCK_NETHER_QUARTZ_ORE, 0,       127,       20,       8},\n\t};\n\treturn res;\n}\n\n\n\n\n\nconst cFinishGenOres::OreInfos & cFinishGenOres::DefaultNaturalPatches(void)\n{\n\tstatic OreInfos res\n\t{\n\t\t// OreType,      OreMeta,               MaxHeight, NumNests, NestSize\n\t\t{E_BLOCK_DIRT,   0,                     127,       20,       32},\n\t\t{E_BLOCK_GRAVEL, 0,                     127,       10,       32},\n\t\t{E_BLOCK_STONE,  E_META_STONE_GRANITE,  127,       20,       32},\n\t\t{E_BLOCK_STONE,  E_META_STONE_DIORITE,  127,       20,       32},\n\t\t{E_BLOCK_STONE,  E_META_STONE_ANDESITE, 127,       20,       32},\n\t};\n\treturn res;\n}\n\n\n\n\n\ncFinishGenOres::OreInfos cFinishGenOres::OreInfosFromString(const AString & a_OreInfosString)\n{\n\t// The string is expected to be formatted as \"<OreInfo1> | <OreInfo2> | <OreInfo3> | ...\"\n\t// Each OreInfo is expected to be formatted as \"<OreType> : <OreMeta> : <MaxHeight> : <NumNests> : <NestSize>\"\n\n\tOreInfos res;\n\tauto ores = StringSplitAndTrim(a_OreInfosString, \"|\");\n\tfor (const auto & ore: ores)\n\t{\n\t\tauto parts = StringSplitAndTrim(ore, \":\");\n\t\tif (parts.size() != 5)\n\t\t{\n\t\t\tLOGWARNING(\"Cannot parse ore information from string, not enough OreInfo members (exp 5, got %d). Offending item: \\\"%s\\\".\",\n\t\t\t\tstatic_cast<unsigned>(parts.size()), ore.c_str()\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tauto oreType = BlockStringToType(parts[0]);\n\t\tif (oreType < 0)\n\t\t{\n\t\t\tLOGWARNING(\"Cannot parse ore information from string, invalid OreType: \\\"%s\\\".\", parts[0].c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tNIBBLETYPE oreMeta;\n\t\tint maxHeight, numNests, nestSize;\n\t\tif (\n\t\t\t!StringToInteger(parts[1], oreMeta) ||\n\t\t\t!StringToInteger(parts[2], maxHeight) ||\n\t\t\t!StringToInteger(parts[3], numNests) ||\n\t\t\t!StringToInteger(parts[4], nestSize)\n\t\t)\n\t\t{\n\t\t\tLOGWARNING(\"Cannot parse ore information from string, invalid number in OreInfo \\\"%s\\\".\", ore.c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tres.emplace_back(static_cast<BLOCKTYPE>(oreType), oreMeta, maxHeight, numNests, nestSize);\n\t}  // for i - split[]\n\treturn res;\n}\n\n\n\n\n\nAString cFinishGenOres::OreInfosToString(const cFinishGenOres::OreInfos & a_OreInfos)\n{\n\tAString res;\n\tfor (const auto & ore: a_OreInfos)\n\t{\n\t\tif (!res.empty())\n\t\t{\n\t\t\tres.append(\" | \");\n\t\t}\n\t\tres.append(fmt::format(FMT_STRING(\"{}:{}:{}:{}:{}\"),\n\t\t\tItemTypeToString(ore.m_BlockType), ore.m_BlockMeta,\n\t\t\tore.m_MaxHeight, ore.m_NumNests, ore.m_NestSize\n\t\t));\n\t}  // for ore - a_OreInfos[]\n\treturn res;\n}\n\n\n\n\n\nvoid cFinishGenOres::SetSeed(int a_Seed)\n{\n\tm_Noise.SetSeed(a_Seed);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenOreNests:\n\nvoid cFinishGenOreNests::GenerateOre(\n\tcChunkDesc & a_ChunkDesc,\n\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta,\n\tint a_MaxHeight, int a_NumNests, int a_NestSize,\n\tint a_Seq\n)\n{\n\t// This function generates several \"nests\" of ore, each nest consisting of number of ore blocks relatively adjacent to each other.\n\t// It does so by making a random XYZ walk and adding ore along the way in cuboids of different (random) sizes\n\t// Only \"terraformable\" blocks get replaced with ore, all other blocks stay (so the nest can actually be smaller than specified).\n\n\t// If there is an attempt to generate Emerald ores in a chunk with no mountains biome abort\n\t// There are just four points sampled to avoid searching all 16 * 16 blocks:\n\tif (a_OreType == E_BLOCK_EMERALD_ORE)\n\t{\n\t\tconst auto BiomeSampleOne =   a_ChunkDesc.GetBiome( 4,  4);\n\t\tconst auto BiomeSampleTwo =   a_ChunkDesc.GetBiome( 4, 12);\n\t\tconst auto BiomeSampleThree = a_ChunkDesc.GetBiome(12,  4);\n\t\tconst auto BiomeSampleFour =  a_ChunkDesc.GetBiome(12, 12);\n\n\t\tif (\n\t\t\t!IsBiomeMountain(BiomeSampleOne) &&\n\t\t\t!IsBiomeMountain(BiomeSampleTwo) &&\n\t\t\t!IsBiomeMountain(BiomeSampleThree) &&\n\t\t\t!IsBiomeMountain(BiomeSampleFour)\n\t\t)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Gold ores are generated more often in Mesa-Type-Biomes:\n\t// https://minecraft.wiki/w/Gold_Ore\n\tif (a_OreType == E_BLOCK_GOLD_ORE)\n\t{\n\t\tconst auto BiomeSampleOne =   a_ChunkDesc.GetBiome( 4,  4);\n\t\tconst auto BiomeSampleTwo =   a_ChunkDesc.GetBiome( 4, 12);\n\t\tconst auto BiomeSampleThree = a_ChunkDesc.GetBiome(12,  4);\n\t\tconst auto BiomeSampleFour =  a_ChunkDesc.GetBiome(12, 12);\n\n\t\tif (\n\t\t\tIsBiomeMesa(BiomeSampleOne) ||\n\t\t\tIsBiomeMesa(BiomeSampleTwo) ||\n\t\t\tIsBiomeMesa(BiomeSampleThree) ||\n\t\t\tIsBiomeMesa(BiomeSampleFour)\n\t\t)\n\t\t{\n\t\t\ta_MaxHeight = 76;\n\t\t\ta_NumNests = 22;  // 2 times default + 20 times mesa bonus\n\t\t}\n\t}\n\n\tif (a_OreType == E_BLOCK_SILVERFISH_EGG)\n\t{\n\t\tconst auto BiomeSampleOne =   a_ChunkDesc.GetBiome( 4,  4);\n\t\tconst auto BiomeSampleTwo =   a_ChunkDesc.GetBiome( 4, 12);\n\t\tconst auto BiomeSampleThree = a_ChunkDesc.GetBiome(12,  4);\n\t\tconst auto BiomeSampleFour =  a_ChunkDesc.GetBiome(12, 12);\n\n\t\tif (\n\t\t\t!IsBiomeMountain(BiomeSampleOne) &&\n\t\t\t!IsBiomeMountain(BiomeSampleTwo) &&\n\t\t\t!IsBiomeMountain(BiomeSampleThree) &&\n\t\t\t!IsBiomeMountain(BiomeSampleFour)\n\t\t)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tauto chunkX = a_ChunkDesc.GetChunkX();\n\tauto chunkZ = a_ChunkDesc.GetChunkZ();\n\tauto & blockTypes = a_ChunkDesc.GetBlockTypes();\n\tauto & blockMetas = a_ChunkDesc.GetBlockMetasUncompressed();\n\tfor (int i = 0; i < a_NumNests; i++)\n\t{\n\t\tint nestRnd = m_Noise.IntNoise3DInt(chunkX + i, a_Seq, chunkZ + 64 * i) / 8;\n\t\tint BaseX = nestRnd % cChunkDef::Width;\n\t\tnestRnd /= cChunkDef::Width;\n\t\tint BaseZ = nestRnd % cChunkDef::Width;\n\t\tnestRnd /= cChunkDef::Width;\n\t\tint BaseY = nestRnd % a_MaxHeight;\n\t\tnestRnd /= a_MaxHeight;\n\t\tint NestSize = a_NestSize + (nestRnd % (std::max(a_NestSize, 4) / 4));  // The actual nest size may be up to 1 / 4 larger\n\t\tint Num = 0;\n\t\twhile (Num < NestSize)\n\t\t{\n\t\t\t// Put a cuboid around [BaseX, BaseY, BaseZ]\n\t\t\tint rnd = m_Noise.IntNoise3DInt(chunkX + 64 * i, 2 * a_Seq + Num, chunkZ + 32 * i) / 8;\n\t\t\tint xsize = rnd % 2;\n\t\t\tint ysize = (rnd / 4) % 2;\n\t\t\tint zsize = (rnd / 16) % 2;\n\t\t\trnd >>= 8;\n\t\t\tfor (int x = xsize; x >= 0; --x)\n\t\t\t{\n\t\t\t\tint BlockX = BaseX + x;\n\t\t\t\tif (!cChunkDef::IsValidWidth(BlockX))\n\t\t\t\t{\n\t\t\t\t\tNum++;  // So that the cycle finishes even if the base coords wander away from the chunk\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfor (int y = ysize; y >= 0; --y)\n\t\t\t\t{\n\t\t\t\t\tint BlockY = BaseY + y;\n\t\t\t\t\tif (!cChunkDef::IsValidHeight({BlockX, BlockY, BaseZ}))\n\t\t\t\t\t{\n\t\t\t\t\t\tNum++;  // So that the cycle finishes even if the base coords wander away from the chunk\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tfor (int z = zsize; z >= 0; --z)\n\t\t\t\t\t{\n\t\t\t\t\t\tint BlockZ = BaseZ + z;\n\t\t\t\t\t\tif (!cChunkDef::IsValidWidth(BlockZ))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tNum++;  // So that the cycle finishes even if the base coords wander away from the chunk\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst auto Index = cChunkDef::MakeIndex(BlockX, BlockY, BlockZ);\n\t\t\t\t\t\tconst auto blockType = blockTypes[Index];\n\t\t\t\t\t\tif ((blockType == E_BLOCK_STONE) || (blockType == E_BLOCK_NETHERRACK))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tblockTypes[Index] = a_OreType;\n\t\t\t\t\t\t\tblockMetas[Index] = a_OreMeta;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tNum++;\n\t\t\t\t\t}  // for z\n\t\t\t\t}  // for y\n\t\t\t}  // for x\n\n\t\t\t// Move the base to a neighbor voxel\n\t\t\tswitch (rnd % 4)\n\t\t\t{\n\t\t\t\tcase 0: BaseX--; break;\n\t\t\t\tcase 1: BaseX++; break;\n\t\t\t}\n\t\t\tswitch ((rnd >> 3) % 4)\n\t\t\t{\n\t\t\t\tcase 0: BaseY--; break;\n\t\t\t\tcase 1: BaseY++; break;\n\t\t\t}\n\t\t\tswitch ((rnd >> 6) % 4)\n\t\t\t{\n\t\t\t\tcase 0: BaseZ--; break;\n\t\t\t\tcase 1: BaseZ++; break;\n\t\t\t}\n\t\t}  // while (Num < NumBlocks)\n\t}  // for i - NumNests\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFinishGenOrePockets:\n\nvoid cFinishGenOrePockets::Initialize(cIniFile & a_IniFile, const AString & a_GenName)\n{\n\t// Read the OreInfos configuration:\n\tauto valueName = a_GenName + \"Blocks\";\n\tauto pocketCfg = a_IniFile.GetValue(\"Generator\", valueName, \"\");\n\tif (pocketCfg.empty())\n\t{\n\t\t// There's no config currently stored in the INI file. Store the defaults as the config:\n\t\ta_IniFile.SetValue(\"Generator\", valueName, OreInfosToString(m_OreInfos));\n\t}\n\telse\n\t{\n\t\tm_OreInfos = OreInfosFromString(pocketCfg);\n\t}\n\n\t// Read the optional seed configuration (but do not store the default):\n\tvalueName = a_GenName + \"Seed\";\n\tSetSeed(a_IniFile.GetValueI(\"Generator\", valueName, m_Noise.GetSeed()));\n}\n\n\n\n\n\nvoid cFinishGenOrePockets::GenerateOre(\n\tcChunkDesc & a_ChunkDesc,\n\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta,\n\tint a_MaxHeight, int a_NumNests, int a_NestSize,\n\tint a_Seq\n)\n{\n\t// This function generates several \"pockets\" of the specified ore\n\t// Each chunk can contain only pockets that are generated for that chunk, or for its XM / ZM neighbors.\n\n\t// Generate for the 3 neighbors in the XP / ZP direction as well, so that pockets crossing the boundaries are accounted for as well:\n\tint chunkZ = a_ChunkDesc.GetChunkZ();\n\tint chunkX = a_ChunkDesc.GetChunkX();\n\timprintChunkOrePockets(chunkX - 1, chunkZ - 1, a_ChunkDesc, a_OreType, a_OreMeta, a_MaxHeight, a_NumNests, a_NestSize, a_Seq);\n\timprintChunkOrePockets(chunkX - 1, chunkZ,     a_ChunkDesc, a_OreType, a_OreMeta, a_MaxHeight, a_NumNests, a_NestSize, a_Seq);\n\timprintChunkOrePockets(chunkX,     chunkZ - 1, a_ChunkDesc, a_OreType, a_OreMeta, a_MaxHeight, a_NumNests, a_NestSize, a_Seq);\n\timprintChunkOrePockets(chunkX,     chunkZ,     a_ChunkDesc, a_OreType, a_OreMeta, a_MaxHeight, a_NumNests, a_NestSize, a_Seq);\n}\n\n\n\n\n\nvoid cFinishGenOrePockets::imprintChunkOrePockets(\n\tint a_ChunkX, int a_ChunkZ,\n\tcChunkDesc & a_ChunkDesc,\n\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta,\n\tint a_MaxHeight, int a_NumNests, int a_NestSize,\n\tint a_Seq\n)\n{\n\t// Pick a starting coord for each nest:\n\tint baseBlockX = a_ChunkX * cChunkDef::Width;\n\tint baseBlockZ = a_ChunkZ * cChunkDef::Width;\n\tfor (int i = 0; i < a_NumNests; i++)\n\t{\n\t\tint nestRnd = m_Noise.IntNoise3DInt(a_ChunkX + i, a_Seq, a_ChunkZ + 64 * i) / 7;\n\t\tint baseX = (nestRnd % cChunkDef::Width) + baseBlockX;\n\t\tnestRnd /= cChunkDef::Width;\n\t\tint baseZ = (nestRnd % cChunkDef::Width) + baseBlockZ;\n\t\tnestRnd /= cChunkDef::Width;\n\t\tint baseY = nestRnd % a_MaxHeight;\n\t\tnestRnd /= a_MaxHeight;\n\t\timprintPocket(\n\t\t\ta_ChunkDesc,\n\t\t\tbaseX, baseY, baseZ,\n\t\t\ta_NestSize, i + 200 * a_Seq,\n\t\t\ta_OreType, a_OreMeta\n\t\t);\n\t}  // for i - NumNests\n}\n\n\n\n\n\nvoid cFinishGenOrePockets::imprintPocket(\n\tcChunkDesc & a_ChunkDesc,\n\tint a_MinPocketX, int a_PocketY, int a_MinPocketZ,\n\tint a_NestSize, int a_Seq,\n\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta\n)\n{\n\t// A line segment in a random direction is chosen. Then, several spheres are formed along this line segment,\n\t// with their diameters diminishing towards the line ends (one half of a sinusoid)\n\n\tdouble x1 = static_cast<double>(a_MinPocketX) + 0.5;\n\tdouble y1 = static_cast<double>(a_PocketY)    + 0.5;\n\tdouble z1 = static_cast<double>(a_MinPocketZ) + 0.5;\n\tint rnd = m_Noise.IntNoise2DInt(a_MinPocketX + 7 * a_Seq, a_MinPocketZ + a_PocketY * 11) / 7;\n\tdouble angle = static_cast<double>(rnd % 256) / (256.0 * M_PI / 2.0);  // range [0 .. pi / 2]\n\trnd /= 256;\n\tdouble length = static_cast<double>(a_NestSize) / 4.0;\n\tdouble x2 = x1 + sin(angle) * length;  // Always larger than x1\n\tdouble z2 = z1 + cos(angle) * length;  // Always larger than z1\n\tdouble y2 = y1 + static_cast<double>((rnd % 3) - 1);  // Up to 1 block away from y1\n\n\t// Iterate over the line segment in a total of a_NestSize steps:\n\tdouble stepX = (x2 - x1) / static_cast<double>(a_NestSize);\n\tdouble stepY = (y2 - y1) / static_cast<double>(a_NestSize);\n\tdouble stepZ = (z2 - z1) / static_cast<double>(a_NestSize);\n\tdouble stepR = M_PI / static_cast<double>(a_NestSize);\n\tdouble size = static_cast<double>(a_NestSize) / 16.0;\n\tfor (int i = 0; i < a_NestSize; ++i)\n\t{\n\t\tdouble iDbl = static_cast<double>(i);\n\t\tdouble sphereX = x1 + stepX * iDbl;\n\t\tdouble sphereY = y1 + stepY * iDbl;\n\t\tdouble sphereZ = z1 + stepZ * iDbl;\n\t\tdouble radius = (sin(stepR * iDbl) + 1.0) * size + 1.0;\n\t\timprintSphere(a_ChunkDesc, sphereX, sphereY, sphereZ, radius, a_OreType, a_OreMeta);\n\t}  // for i\n}\n\n\n\n\n\nvoid cFinishGenOrePockets::imprintSphere(\n\tcChunkDesc & a_ChunkDesc,\n\tdouble a_SphereX, double a_SphereY, double a_SphereZ, double a_Radius,\n\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta\n)\n{\n\t// Get the sphere's bounding box, unioned with the chunk's bounding box (possibly empty):\n\tint baseX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint baseZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tint minX = std::max(FloorC(a_SphereX - a_Radius), baseX);\n\tint minY = std::max(FloorC(a_SphereY - a_Radius), 0);\n\tint minZ = std::max(FloorC(a_SphereZ - a_Radius), baseZ);\n\tint maxX = std::min(CeilC(a_SphereX + a_Radius), baseX + cChunkDef::Width - 1);\n\tint maxY = std::min(CeilC(a_SphereY + a_Radius), cChunkDef::Height - 1);\n\tint maxZ = std::min(CeilC(a_SphereZ + a_Radius), baseZ + cChunkDef::Width - 1);\n\n\t/*\n\t// DEBUG:\n\tint blockX = FloorC(a_SphereX);\n\tint blockY = FloorC(a_SphereY);\n\tint blockZ = FloorC(a_SphereZ);\n\tif (\n\t\t(blockX >= baseX) && (blockX < baseX + cChunkDef::Width) &&\n\t\t(blockY >= 0) && (blockY < cChunkDef::Height) &&\n\t\t(blockZ >= baseZ) && (blockZ < baseZ + cChunkDef::Width)\n\t)\n\t{\n\t\t// FLOGD(\"Imprinting a sphere center at {0}\", Vector3i{blockX, blockY, blockZ});\n\t\ta_ChunkDesc.SetBlockTypeMeta(blockX - baseX, blockY, blockZ - baseZ, a_OreType, a_OreMeta);\n\t}\n\treturn;\n\t//*/\n\n\t// Imprint the parts of the sphere intersecting the chunk:\n\tdouble radiusSq = a_Radius * a_Radius / 4.0;\n\tfor (int y = minY; y <= maxY; y++)\n\t{\n\t\tdouble relY = static_cast<double>(y) + 0.5 - a_SphereY;\n\t\tdouble relYSq = relY * relY;\n\t\tif (relYSq > radiusSq)\n\t\t{\n\t\t\t// outside the sphere, bail out\n\t\t\tcontinue;\n\t\t}\n\t\tfor (int z = minZ; z <= maxZ; z++)\n\t\t{\n\t\t\tdouble relZ = static_cast<double>(z) + 0.5 - a_SphereZ;\n\t\t\tdouble relZSq = relZ * relZ;\n\t\t\tif (relZSq + relYSq > radiusSq)\n\t\t\t{\n\t\t\t\t// outside the sphere, bail out\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (int x = minX; x <= maxX; x++)\n\t\t\t{\n\t\t\t\tdouble relX = static_cast<double>(x) + 0.5 - a_SphereX;\n\t\t\t\tdouble relXSq = relX * relX;\n\t\t\t\tif (relZSq + relYSq + relXSq > radiusSq)\n\t\t\t\t{\n\t\t\t\t\t// outside the sphere, bail out\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint bX = x - baseX;\n\t\t\t\tint bZ = z - baseZ;\n\t\t\t\tauto blockType = a_ChunkDesc.GetBlockType(bX, y, bZ);\n\t\t\t\tif ((blockType == E_BLOCK_STONE) || (blockType == E_BLOCK_NETHERRACK))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(bX, y, bZ, a_OreType, a_OreMeta);\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}  // for y\n}\n\n\n\n\n\ncFinishGenForestRocks::cFinishGenForestRocks(int a_Seed, cIniFile & a_IniFile) : m_Noise(a_Seed)\n{\n}\n\n\n\n\n\nvoid cFinishGenForestRocks::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\t// Choose random position in chunk and place boulder around it\n\tauto Pos = Vector3i(\n\t\tm_Noise.IntNoise2DInt(a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ()) % cChunkDef::Width,\n\t\t0,\n\t\tm_Noise.IntNoise2DInt(a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ()) % cChunkDef::Width\n\t\t);\n\tPos.y = a_ChunkDesc.GetHeight(Pos.x, Pos.z) % cChunkDef::Height;\n\n\tauto Biome = a_ChunkDesc.GetBiome(Pos.x, Pos.z);\n\tif ((Biome != biMegaTaiga) && (Biome != biMegaTaigaHills))\n\t{\n\t\treturn;\n\t}\n\n\t// Determines the size of the boulder\n\tconst int TwoLimit = 70;\n\tconst int ThreeLimit = 90;\n\n\tauto RadiusChance = m_Noise.IntNoise2DInt(a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ()) % 100;\n\tint Radius = 1;\n\tif (RadiusChance > TwoLimit && RadiusChance <= ThreeLimit)\n\t{\n\t\tRadius = 2;\n\t}\n\telse if (RadiusChance > ThreeLimit)\n\t{\n\t\tRadius = 3;\n\t}\n\n\tPos.x = Clamp(Pos.x, Radius, cChunkDef::Width - Radius - 1);\n\tPos.z = Clamp(Pos.z, Radius, cChunkDef::Width - Radius - 1);\n\n\tauto StartBlock = a_ChunkDesc.GetBlockType(Pos.x, Pos.y, Pos.z);\n\twhile (!((StartBlock == E_BLOCK_DIRT) || (StartBlock == E_BLOCK_GRASS)))\n\t{\n\t\tPos.y -= 1;\n\t\tif (!cChunkDef::IsValidRelPos(Pos.addedY(-Radius)))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tStartBlock = a_ChunkDesc.GetBlockType(Pos.x, Pos.y, Pos.z);\n\t}\n\n\n\tPos.y -= Radius - 1;\n\t// Pos.y = Clamp(Pos.y - m_Noise.IntNoise2DInt(a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ()) % Radius + 1, 0, cChunkDef::Height);\n\n\tfor (int x = -Radius; x <= Radius; x++)\n\t{\n\t\tfor (int y = -Radius; y <= Radius; y++)\n\t\t{\n\t\t\tfor (int z = -Radius; z <= Radius; z++)\n\t\t\t{\n\t\t\t\tif (!cChunkDef::IsValidRelPos({ Pos.x + x, Pos.y + y, Pos.z + z }))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (Vector3d(x, y, z).SqrLength() > Radius * Radius + 1)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(Pos.x + x, Pos.y + y, Pos.z + z, E_BLOCK_MOSSY_COBBLESTONE, 0);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Generating/FinishGen.h",
    "content": "\n// FinishGen.h\n\n/* Interfaces to the various finishing generators:\n\t- cFinishGenSnow\n\t- cFinishGenIce\n\t- cFinishGenSprinkleFoliage\n\t- cFinishGenLilypads\n\t- cFinishGenBottomLava\n\t- cFinishGenPreSimulator\n\t- cFinishGenDeadBushes\n*/\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Noise/Noise.h\"\n#include \"../ProbabDistrib.h\"\n#include \"../Mobs/Monster.h\"\n\n\n\n\n\nclass cFinishGenSnow :\n\tpublic cFinishGen\n{\nprotected:\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cFinishGenIce :\n\tpublic cFinishGen\n{\nprotected:\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cFinishGenNetherClumpFoliage :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenNetherClumpFoliage(int a_Seed) :\n\t\tm_Noise(a_Seed),\n\t\tm_Seed(a_Seed)\n\t{\n\t}\n\nprotected:\n\tcNoise m_Noise;\n\tint    m_Seed;\n\n\tvoid TryPlaceClump(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Block);\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cFinishGenClumpTopBlock :\n\tpublic cFinishGen\n{\npublic:\n\t// Contains the meta, type and weight for a clump block\n\tstruct FoliageInfo\n\t{\n\t\tBLOCKTYPE m_BlockType;\n\t\tNIBBLETYPE m_BlockMeta;\n\t\tint m_Weight;\n\n\t\tFoliageInfo(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, int a_Weight) :\n\t\t\tm_BlockType(a_BlockType),\n\t\t\tm_BlockMeta(a_BlockMeta),\n\t\t\tm_Weight(a_Weight)\n\t\t{}\n\t};\n\n\t// Contains the minimum and maximum amount of clumps for a biome and it's blocks.\n\tstruct BiomeInfo\n\t{\n\t\tint m_MinNumClumpsPerChunk;\n\t\tint m_MaxNumClumpsPerChunk;\n\t\tstd::vector<FoliageInfo> m_Blocks;\n\n\t\tBiomeInfo() :\n\t\t\tm_MinNumClumpsPerChunk(0),\n\t\t\tm_MaxNumClumpsPerChunk(2),\n\t\t\tm_Blocks()\n\t\t{}\n\n\t\tBiomeInfo(int a_MinNumClumpsPerChunk, int a_MaxNumClumpsPerChunk, std::vector<FoliageInfo> a_Blocks) :\n\t\t\tm_MinNumClumpsPerChunk(a_MinNumClumpsPerChunk),\n\t\t\tm_MaxNumClumpsPerChunk(a_MaxNumClumpsPerChunk),\n\t\t\tm_Blocks(std::move(a_Blocks))\n\t\t{}\n\t};\n\n\n\tcFinishGenClumpTopBlock(int a_Seed, std::vector<BiomeInfo> a_BlockList) :\n\t\tm_Noise(a_Seed),\n\t\tm_FlowersPerBiome()\n\t{\n\t\tstd::swap(a_BlockList, m_FlowersPerBiome);\n\t}\n\n\t/** Parses a string and puts a vector with a length of biMaxVariantBiome in a_Output.\n\tThe format of the string is \"<Biomes separated with a comma>;<Blocks separated with a comma>\". This can also be repeated with a | */\n\tstatic void ParseConfigurationString(const AString & a_String, std::vector<BiomeInfo> & a_Output);\n\n\t/** Parses an inifile in search for all clumps */\n\tstatic std::vector<BiomeInfo> ParseIniFile(cIniFile & a_IniFile, const AString & a_ClumpPrefix);\nprotected:\n\n\tcNoise m_Noise;\n\tstd::vector<BiomeInfo> m_FlowersPerBiome;\n\n\t/** The maximum number of foliage per clump */\n\tconst int MAX_NUM_FOLIAGE = 8;\n\n\t/** The minimum number of foliage per clump */\n\tconst int MIN_NUM_FOLIAGE = 4;\n\n\t/** The maximum range a foliage can be placed from the center of the clump */\n\tconst int RANGE_FROM_CENTER = 5;\n\n\tvoid TryPlaceFoliageClump(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, bool a_IsDoubleTall);\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n};\n\n\n\n\n\nclass cFinishGenGlowStone :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenGlowStone(int a_Seed) :\n\t\tm_Noise(a_Seed),\n\t\tm_Seed(a_Seed)\n\t{\n\t}\n\nprotected:\n\tcNoise m_Noise;\n\tint    m_Seed;\n\n\tvoid TryPlaceGlowstone(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, int a_Size, int a_NumStrings);\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cFinishGenTallGrass :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenTallGrass(int a_Seed) : m_Noise(a_Seed), m_Seed(a_Seed) {}\n\nprotected:\n\tcNoise m_Noise;\n\tint m_Seed;\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\n\tstatic bool CanFernGrow(EMCSBiome a_Biome);\n\tstatic bool CanLargeFernGrow(EMCSBiome a_Biome);\n\tstatic int GetBiomeDensity(EMCSBiome a_Biome);\n\tstatic bool CanGrassGrow(EMCSBiome a_Biome);\n};\n\n\n\n\n\nclass cFinishGenVines :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenVines(int a_Seed, int a_Level) :\n\t\tm_Noise(a_Seed),\n\t\tm_Level(a_Level)\n\t{\n\t}\n\n\tbool IsJungleVariant(EMCSBiome a_Biome);\n\nprotected:\n\tcNoise m_Noise;\n\tint    m_Level;\n\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n};\n\n\n\n\n\nclass cFinishGenSoulsandRims :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenSoulsandRims(int a_Seed) :\n\t\tm_Noise(a_Seed)\n\t{\n\t}\n\nprotected:\n\tcNoise m_Noise;\n\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cFinishGenSprinkleFoliage :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenSprinkleFoliage(int a_Seed, int a_MaxCactusHeight, int a_MaxSugarcaneHeight):\n\t\tm_Noise(a_Seed),\n\t\tm_Seed(a_Seed),\n\t\tm_MaxCactusHeight(a_MaxCactusHeight),\n\t\tm_MaxSugarcaneHeight(a_MaxSugarcaneHeight)\n\t{\n\t}\nprotected:\n\tcNoise m_Noise;\n\tint    m_Seed;\n\tint    m_MaxCactusHeight;\n\tint    m_MaxSugarcaneHeight;\n\n\t/** Tries to place sugarcane at the coords specified, returns true if successful, updates the top variable (hence the & a_RefY) */\n\tbool TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_RelX, HEIGHTTYPE & a_RelY, int a_RelZ);\n\n\t/** Tries to place cactus at the coords specified, returns true if successful, updates the top variable (hence the & a_RefY) */\n\tbool TryAddCactus(cChunkDesc & a_ChunkDesc, int a_RelX, HEIGHTTYPE & a_RelY, int a_RelZ);\n\n\t// Returns true is the specified biome is a desert or its variant\n\tstatic bool IsDesertVariant(EMCSBiome a_biome);\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\n/** This class adds a single top block in random positions in the specified biome on top of specified allowed blocks.\nUsed for:\n- Lilypads finisher\n- DeadBushes finisher */\nclass cFinishGenSingleTopBlock :\n\tpublic cFinishGen\n{\npublic:\n\ttypedef std::vector<BLOCKTYPE> BlockList;\n\tbool m_IsAllowedBelow[256];\n\n\ttypedef std::vector<EMCSBiome> BiomeList;\n\tbool m_IsBiomeAllowed[256];\n\n\n\tcFinishGenSingleTopBlock(\n\t\tint a_Seed, BLOCKTYPE a_BlockType, BiomeList a_Biomes, int a_Amount,\n\t\tBlockList a_AllowedBelow\n\t) :\n\t\tm_Noise(a_Seed),\n\t\tm_BlockType(a_BlockType),\n\t\tm_Amount(a_Amount)\n\t{\n\t\t// Initialize all the block types.\n\t\tfor (size_t idx = 0; idx < ARRAYCOUNT(m_IsAllowedBelow); ++idx)\n\t\t{\n\t\t\tm_IsAllowedBelow[idx] = false;\n\t\t}\n\n\t\t// Load the allowed blocks into m_IsAllowedBelow\n\t\tfor (BlockList::iterator itr = a_AllowedBelow.begin(); itr != a_AllowedBelow.end(); ++itr)\n\t\t{\n\t\t\tm_IsAllowedBelow[*itr] = true;\n\t\t}\n\n\t\t// Initialize all the biome types.\n\t\tfor (size_t idx = 0; idx < ARRAYCOUNT(m_IsBiomeAllowed); ++idx)\n\t\t{\n\t\t\tm_IsBiomeAllowed[idx] = false;\n\t\t}\n\n\t\t// Load the allowed biomes into m_IsBiomeAllowed\n\t\tfor (BiomeList::iterator itr = a_Biomes.begin(); itr != a_Biomes.end(); ++itr)\n\t\t{\n\t\t\tm_IsBiomeAllowed[*itr] = true;\n\t\t}\n\t}\n\nprotected:\n\tcNoise m_Noise;\n\tBLOCKTYPE m_BlockType;\n\n\t/** Relative amount of blocks to try adding. 1 = one block per 256 biome columns. */\n\tint m_Amount;\n\n\n\tint GetNumToGen(const cChunkDef::BiomeMap & a_BiomeMap);\n\n\t/** Returns true if the given biome is a biome that is allowed. */\n\tinline bool IsAllowedBiome(EMCSBiome a_Biome)\n\t{\n\t\treturn m_IsBiomeAllowed[a_Biome];\n\t}\n\n\t/** Returns true if the given blocktype may be below m_BlockType */\n\tinline bool IsAllowedBlockBelow(BLOCKTYPE a_BlockBelow)\n\t{\n\t\treturn m_IsAllowedBelow[a_BlockBelow];\n\t}\n\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cFinishGenBottomLava :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenBottomLava(int a_Level) :\n\t\tm_Level(a_Level)\n\t{\n\t}\n\n\tint GetLevel(void) const { return m_Level; }\nprotected:\n\tint m_Level;\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cFinishGenPreSimulator :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenPreSimulator(bool a_PreSimulateFallingBlocks, bool a_PreSimulateWater, bool a_PreSimulateLava);\n\nprotected:\n\n\tbool m_PreSimulateFallingBlocks;\n\tbool m_PreSimulateWater;\n\tbool m_PreSimulateLava;\n\n\t/** Drops hanging sand and gravel down to the ground, recalculates heightmap */\n\tvoid CollapseSandGravel(cChunkDesc & a_ChunkDesc);\n\n\t/** For each fluid block:\n\t- if all surroundings are of the same fluid, makes it stationary; otherwise makes it flowing (excl. top)\n\t- all fluid on the chunk's edge is made flowing */\n\tvoid StationarizeFluid(\n\t\tcChunkDef::BlockTypes & a_BlockTypes,    // Block types to read and change\n\t\tcChunkDef::HeightMap & a_HeightMap,      // Height map to read\n\t\tBLOCKTYPE a_Fluid,\n\t\tBLOCKTYPE a_StationaryFluid\n\t);\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cFinishGenFluidSprings :\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenFluidSprings(int a_Seed, BLOCKTYPE a_Fluid, cIniFile & a_IniFile, eDimension a_Dimension);\n\nprotected:\n\n\tcNoise         m_Noise;\n\tcProbabDistrib m_HeightDistribution;\n\tBLOCKTYPE      m_Fluid;\n\tint            m_Chance;  ///< Chance, [0..100], that a spring will be generated in a chunk\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\n\t/** Tries to place a spring at the specified coords, checks neighbors. Returns true if successful. */\n\tbool TryPlaceSpring(cChunkDesc & a_ChunkDesc, int x, int y, int z);\n} ;\n\n\n\n\n\n/** This class populates generated chunks with packs of biome-dependant animals\nAnimals: cows, sheep, pigs, mooshrooms, squid, horses, wolves, ocelots */\nclass cFinishGenPassiveMobs :\n\tpublic cFinishGen\n{\npublic:\n\n\tcFinishGenPassiveMobs(int a_Seed, cIniFile & a_IniFile, eDimension a_Dimension);\n\nprotected:\n\n\t/** The noise used as the source of randomness */\n\tcNoise m_Noise;\n\n\t/** Chance, [0..100], that an animal pack will be generated in a chunk */\n\tint m_AnimalProbability;\n\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\n\t/** Returns false if an animal cannot spawn at given coords, else adds it to the chunk's entity list and returns true */\n\tbool TrySpawnAnimals(cChunkDesc & a_ChunkDesc, int x, int y, int z, eMonsterType AnimalToSpawn);\n\n\t/** Picks a random animal from biome-dependant list for a random position in the chunk.\n\tReturns the chosen mob type, or mtInvalid if no mob chosen. */\n\teMonsterType GetRandomMob(cChunkDesc & a_ChunkDesc);\n} ;\n\n\n\n\n\n/** Base class for generators that have an ore list attached to them.\nProvides the storage and parsing for the ore list, as well as the generic plumbing for generating individual ores.\nDescendants should override GenerateOre() to provide the specific ore generation technique.\nNote that this class uses the \"Nest\" terminology for individual packs of ore, it doesn't imply any shape or algorithm. */\nclass cFinishGenOres:\n\tpublic cFinishGen\n{\n\tusing Super = cFinishGen;\n\npublic:\n\n\tstruct OreInfo\n\t{\n\t\tBLOCKTYPE  m_BlockType;  // The type of the nest.\n\t\tNIBBLETYPE m_BlockMeta;  // The block meta\n\t\tint        m_MaxHeight;  // The highest possible a nest can occur\n\t\tint        m_NumNests;   // How many nests per chunk\n\t\tint        m_NestSize;   // The amount of blocks a nest can have.\n\n\t\tOreInfo() :\n\t\t\tm_BlockType(0),\n\t\t\tm_BlockMeta(0),\n\t\t\tm_MaxHeight(0),\n\t\t\tm_NumNests(0),\n\t\t\tm_NestSize(0)\n\t\t{\n\t\t}\n\n\t\tOreInfo(BLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta, int a_MaxHeight, int a_NumNests, int a_NestSize) :\n\t\t\tm_BlockType(a_OreType),\n\t\t\tm_BlockMeta(a_OreMeta),\n\t\t\tm_MaxHeight(a_MaxHeight),\n\t\t\tm_NumNests(a_NumNests),\n\t\t\tm_NestSize(a_NestSize)\n\t\t{\n\t\t}\n\t};\n\n\ttypedef std::vector<OreInfo> OreInfos;\n\n\tcFinishGenOres(int a_Seed, const OreInfos & a_OreInfos):\n\t\tm_Noise(a_Seed),\n\t\tm_OreInfos(a_OreInfos)\n\t{\n\t}\n\n\t// cFinishGen overrides:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\n\t/** Returns a vector of OreInfo structures describing the default Overworld ores, usable in the constructor. */\n\tstatic const OreInfos & DefaultOverworldOres(void);\n\n\t/** Returns a vector of OreInfo structures describing the default Nether ores, usable in the constructor. */\n\tstatic const OreInfos & DefaultNetherOres(void);\n\n\t/** Returns a vector of OreInfo structures describing the default Overworld non-ore pockets (dirt, diorite etc), usable in the constructor. */\n\tstatic const OreInfos & DefaultNaturalPatches(void);\n\n\t/** Parses the parameter string into OreInfos array.\n\tSee OreInfosToString() for the complementary function.\n\tUsed for loading configuration from INI files. */\n\tstatic OreInfos OreInfosFromString(const AString & a_OreInfosString);\n\n\t/** Returns a string that represents the OreInfos given as the parameter.\n\tSee OreInfosFromString() for the complementary function.\n\tUsed for storing defaults in the INI file. */\n\tstatic AString OreInfosToString(const OreInfos & a_OreInfos);\n\n\t/** (Re-)sets the seed used by the internal generating mechanisms. */\n\tvoid SetSeed(int a_Seed);\n\nprotected:\n\t/** The noise used for generating. */\n\tcNoise m_Noise;\n\n\t/** All the ores enabled in this generator. */\n\tOreInfos m_OreInfos;\n\n\n\t/** Generates a single ore in the specified chunk image.\n\ta_Seq is the sequencing number (used as a complement to seed to make each ore in the same chunk have different nests) */\n\tvirtual void GenerateOre(\n\t\tcChunkDesc & a_ChunkDesc,\n\t\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta,\n\t\tint a_MaxHeight, int a_NumNests, int a_NestSize,\n\t\tint a_Seq\n\t) = 0;\n\n\t// TODO: Helper function to parse a config string into m_OreInfos\n};\n\n\n\n\n\nclass cFinishGenOreNests:\n\tpublic cFinishGenOres\n{\n\tusing Super = cFinishGenOres;\n\npublic:\n\n\tcFinishGenOreNests(int a_Seed, const OreInfos & a_OreInfos):\n\t\tSuper(a_Seed, a_OreInfos)\n\t{}\n\nprotected:\n\n\t// cFinishGenOreClumps overrides:\n\tvirtual void GenerateOre(\n\t\tcChunkDesc & a_ChunkDesc,\n\t\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta,\n\t\tint a_MaxHeight, int a_NumNests, int a_NestSize,\n\t\tint a_Seq\n\t) override;\n} ;\n\n\n\n\n\nclass cFinishGenOrePockets:\n\tpublic cFinishGenOres\n{\n\tusing Super = cFinishGenOres;\n\npublic:\n\n\tcFinishGenOrePockets(int a_Seed, const OreInfos & a_OreInfos):\n\t\tSuper(a_Seed, a_OreInfos)\n\t{}\n\n\t/** Reads the configuration from the specified INI file.\n\ta_GenName is the name of the generator (this class may be used for OrePockets and DirtPockets, each has a different default). */\n\tvoid Initialize(cIniFile & a_IniFile, const AString & a_GenName);\n\nprotected:\n\n\t// cFinishGenOreClumps overrides:\n\tvirtual void GenerateOre(\n\t\tcChunkDesc & a_ChunkDesc,\n\t\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta,\n\t\tint a_MaxNestHeight, int a_NumNests, int a_NestSize,\n\t\tint a_Seq\n\t) override;\n\n\t/** Calculates the pockets for the specified chunk and imprints them into the specified ChunkDesc (not necessarily the same chunk).\n\ta_Seq is the sequence number of the ore, to provide another source of randomness. */\n\tvoid imprintChunkOrePockets(\n\t\tint a_ChunkX, int a_ChunkZ,\n\t\tcChunkDesc & a_ChunkDesc,\n\t\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta,\n\t\tint a_MaxHeight, int a_NumNests, int a_NestSize,\n\t\tint a_Seq\n\t);\n\n\t/** Imprints a single pocket of the specified ore at the specified coords into the chunk.\n\tThe pocket shape has its minimum X and Z coords specified, Y can be anywhere around the specified Y coord.\n\ta_Seq is the sequence number of the ore, to provide another source of randomness. */\n\tvoid imprintPocket(\n\t\tcChunkDesc & a_ChunkDesc,\n\t\tint a_MinPocketX, int a_PocketY, int a_MinPocketZ,\n\t\tint a_NestSize, int a_Seq,\n\t\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta\n\t);\n\n\t/** Imprints a single sphere of the specified ore at the specified coords. */\n\tvoid imprintSphere(\n\t\tcChunkDesc & a_ChunkDesc,\n\t\tdouble a_SphereX, double a_SphereY, double a_SphereZ, double a_Radius,\n\t\tBLOCKTYPE a_OreType, NIBBLETYPE a_OreMeta\n\t);\n};\n\n\n\n\n\nclass cFinishGenForestRocks:\n\tpublic cFinishGen\n{\npublic:\n\tcFinishGenForestRocks(int a_Seed, cIniFile & a_IniFile);\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\nprivate:\n\tcNoise m_Noise;\n};\n"
  },
  {
    "path": "src/Generating/GridStructGen.cpp",
    "content": "\n// GridStructGen.cpp\n\n// Implements the cGridStructGen class representing a common base class for structure generators that place structures in a semi-random grid\n\n#include \"Globals.h\"\n#include \"GridStructGen.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cEmptyStructure:\n\n/** A cStructure descendant representing an empty structure.\nUsed when the generator descended from cGridStructGen doesn't return any structure, to keep at least the\nOrigin coords so that the structure isn't queried over and over again. */\nclass cEmptyStructure:\n\tpublic cGridStructGen::cStructure\n{\n\tusing Super = cGridStructGen::cStructure;\n\npublic:\n\n\tcEmptyStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) :\n\t\tSuper(a_GridX, a_GridZ, a_OriginX, a_OriginZ)\n\t{\n\t}\n\nprotected:\n\tvirtual void DrawIntoChunk(cChunkDesc & a_ChunkDesc) override\n\t{\n\t\t// Do nothing\n\t}\n} ;\n\n\n\n\n\ncGridStructGen::cGridStructGen(\n\tint a_Seed,\n\tint a_GridSizeX, int a_GridSizeZ,\n\tint a_MaxOffsetX, int a_MaxOffsetZ,\n\tint a_MaxStructureSizeX, int a_MaxStructureSizeZ,\n\tsize_t a_MaxCacheSize\n) :\n\tm_Seed(a_Seed),\n\tm_Noise(a_Seed),\n\tm_GridSizeX(a_GridSizeX),\n\tm_GridSizeZ(a_GridSizeZ),\n\tm_MaxOffsetX(a_MaxOffsetX),\n\tm_MaxOffsetZ(a_MaxOffsetZ),\n\tm_MaxStructureSizeX(a_MaxStructureSizeX),\n\tm_MaxStructureSizeZ(a_MaxStructureSizeZ),\n\tm_MaxCacheSize(a_MaxCacheSize)\n{\n\tif (m_GridSizeX == 0)\n\t{\n\t\tLOG(\"Grid Size cannot be zero, setting to 1\");\n\t\tm_GridSizeX = 1;\n\t}\n\tif (m_GridSizeZ == 0)\n\t{\n\t\tLOG(\"Grid Size cannot be zero, setting to 1\");\n\t\tm_GridSizeZ = 1;\n\t}\n\tsize_t NumStructuresPerQuery = static_cast<size_t>(((m_MaxStructureSizeX + m_MaxOffsetX) / m_GridSizeX + 1) * ((m_MaxStructureSizeZ + m_MaxOffsetZ) / m_GridSizeZ + 1));\n\tif (NumStructuresPerQuery > m_MaxCacheSize)\n\t{\n\t\tm_MaxCacheSize = NumStructuresPerQuery * 4;\n\t\tLOGINFO(\n\t\t\t\"cGridStructGen: The cache size is too small (%u), increasing the cache size to %u to avoid inefficiency.\",\n\t\t\tstatic_cast<unsigned>(a_MaxCacheSize), static_cast<unsigned>(m_MaxCacheSize)\n\t\t);\n\t}\n}\n\n\n\n\n\ncGridStructGen::cGridStructGen(int a_Seed):\n\tm_BaseSeed(a_Seed),\n\tm_Seed(a_Seed),\n\tm_Noise(a_Seed),\n\tm_GridSizeX(256),\n\tm_GridSizeZ(256),\n\tm_MaxOffsetX(128),\n\tm_MaxOffsetZ(128),\n\tm_MaxStructureSizeX(128),\n\tm_MaxStructureSizeZ(128),\n\tm_MaxCacheSize(256)\n{\n}\n\n\n\n\n\nvoid cGridStructGen::SetGeneratorParams(const AStringMap & a_GeneratorParams)\n{\n\tASSERT(m_Cache.empty());  // No changing the params after chunks are generated\n\tm_GridSizeX         = GetStringMapInteger<int>   (a_GeneratorParams, \"GridSizeX\",         m_GridSizeX);\n\tm_GridSizeZ         = GetStringMapInteger<int>   (a_GeneratorParams, \"GridSizeZ\",         m_GridSizeZ);\n\tm_MaxOffsetX        = GetStringMapInteger<int>   (a_GeneratorParams, \"MaxOffsetX\",        m_MaxOffsetX);\n\tm_MaxOffsetZ        = GetStringMapInteger<int>   (a_GeneratorParams, \"MaxOffsetZ\",        m_MaxOffsetZ);\n\tm_MaxStructureSizeX = GetStringMapInteger<int>   (a_GeneratorParams, \"MaxStructureSizeX\", m_MaxStructureSizeX);\n\tm_MaxStructureSizeZ = GetStringMapInteger<int>   (a_GeneratorParams, \"MaxStructureSizeZ\", m_MaxStructureSizeZ);\n\tm_MaxCacheSize      = GetStringMapInteger<size_t>(a_GeneratorParams, \"MaxCacheSize\",      m_MaxCacheSize);\n\n\t// Silently fix out-of-range parameters:\n\tif (m_MaxOffsetX < 1)\n\t{\n\t\tm_MaxOffsetX = 1;\n\t}\n\tif (m_MaxOffsetZ < 1)\n\t{\n\t\tm_MaxOffsetZ = 1;\n\t}\n\n\t// Set the seed based on the seed offset from the parameters:\n\tauto seedOffset = GetStringMapInteger<int>(a_GeneratorParams, \"SeedOffset\", 0);\n\tm_Seed = m_BaseSeed + seedOffset;\n\tm_Noise.SetSeed(m_Seed);\n}\n\n\n\n\n\nvoid cGridStructGen::GetStructuresForChunk(int a_ChunkX, int a_ChunkZ, cStructurePtrs & a_Structures)\n{\n\t// Calculate the min and max grid coords of the structures to be returned:\n\tint MinBlockX = a_ChunkX * cChunkDef::Width - m_MaxStructureSizeX - m_MaxOffsetX;\n\tint MinBlockZ = a_ChunkZ * cChunkDef::Width - m_MaxStructureSizeZ - m_MaxOffsetZ;\n\tint MaxBlockX = a_ChunkX * cChunkDef::Width + m_MaxStructureSizeX + m_MaxOffsetX + cChunkDef::Width - 1;\n\tint MaxBlockZ = a_ChunkZ * cChunkDef::Width + m_MaxStructureSizeZ + m_MaxOffsetZ + cChunkDef::Width - 1;\n\tint MinGridX = MinBlockX / m_GridSizeX;\n\tint MinGridZ = MinBlockZ / m_GridSizeZ;\n\tint MaxGridX = (MaxBlockX + m_GridSizeX - 1) / m_GridSizeX;\n\tint MaxGridZ = (MaxBlockZ + m_GridSizeZ - 1) / m_GridSizeZ;\n\tint MinX = MinGridX * m_GridSizeX;\n\tint MaxX = MaxGridX * m_GridSizeX;\n\tint MinZ = MinGridZ * m_GridSizeZ;\n\tint MaxZ = MaxGridZ * m_GridSizeZ;\n\n\t// Walk the cache, move each structure that we want into a_Structures:\n\tfor (cStructurePtrs::iterator itr = m_Cache.begin(), end = m_Cache.end(); itr != end;)\n\t{\n\t\tif (\n\t\t\t((*itr)->m_GridX >= MinX) && ((*itr)->m_GridX < MaxX) &&\n\t\t\t((*itr)->m_GridZ >= MinZ) && ((*itr)->m_GridZ < MaxZ)\n\t\t)\n\t\t{\n\t\t\t// want\n\t\t\ta_Structures.push_back(*itr);\n\t\t\titr = m_Cache.erase(itr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// don't want\n\t\t\t++itr;\n\t\t}\n\t}  // for itr - m_Cache[]\n\n\t// Create those structures that haven't been in the cache:\n\tfor (int x = MinGridX; x < MaxGridX; x++)\n\t{\n\t\tint GridX = x * m_GridSizeX;\n\t\tfor (int z = MinGridZ; z < MaxGridZ; z++)\n\t\t{\n\t\t\tint GridZ = z * m_GridSizeZ;\n\t\t\tbool Found = false;\n\t\t\tfor (cStructurePtrs::const_iterator itr = a_Structures.begin(), end = a_Structures.end(); itr != end; ++itr)\n\t\t\t{\n\t\t\t\tif (((*itr)->m_GridX == GridX) && ((*itr)->m_GridZ == GridZ))\n\t\t\t\t{\n\t\t\t\t\tFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for itr - a_Structures[]\n\t\t\tif (!Found)\n\t\t\t{\n\t\t\t\tint OriginX = GridX + ((m_Noise.IntNoise2DInt(GridX + 3, GridZ + 5) / 7) % (m_MaxOffsetX * 2)) - m_MaxOffsetX;\n\t\t\t\tint OriginZ = GridZ + ((m_Noise.IntNoise2DInt(GridX + 5, GridZ + 3) / 7) % (m_MaxOffsetZ * 2)) - m_MaxOffsetZ;\n\t\t\t\tcStructurePtr Structure = CreateStructure(GridX, GridZ, OriginX, OriginZ);\n\t\t\t\tif (Structure.get() == nullptr)\n\t\t\t\t{\n\t\t\t\t\tStructure.reset(new cEmptyStructure(GridX, GridZ, OriginX, OriginZ));\n\t\t\t\t}\n\t\t\t\ta_Structures.push_back(Structure);\n\t\t\t}\n\t\t}  // for z\n\t}  // for x\n\n\t// Copy a_Forts into m_Cache to the beginning:\n\tcStructurePtrs StructuresCopy (a_Structures);\n\tm_Cache.splice(m_Cache.begin(), StructuresCopy, StructuresCopy.begin(), StructuresCopy.end());\n\n\t// Trim the cache if it's too long:\n\tsize_t CacheSize = 0;\n\tfor (cStructurePtrs::iterator itr = m_Cache.begin(), end = m_Cache.end(); itr != end; ++itr)\n\t{\n\t\tCacheSize += (*itr)->GetCacheCost();\n\t\tif (CacheSize > m_MaxCacheSize)\n\t\t{\n\t\t\t// Erase all items from this one till the cache end\n\t\t\tm_Cache.erase(itr, m_Cache.end());\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cGridStructGen::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\tcStructurePtrs Structures;\n\tGetStructuresForChunk(ChunkX, ChunkZ, Structures);\n\tfor (cStructurePtrs::const_iterator itr = Structures.begin(); itr != Structures.end(); ++itr)\n\t{\n\t\t(*itr)->DrawIntoChunk(a_ChunkDesc);\n\t}  // for itr - Structures[]\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/Generating/GridStructGen.h",
    "content": "\n// GridStructGen.h\n\n// Declares the cGridStructGen class representing a common base class for structure generators that place structures in a semi-random grid\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Noise/Noise.h\"\n\n\n\n\n\n/** Generates structures in a semi-random grid.\nDefines a grid in the XZ space with predefined cell size in each direction. Each cell then receives exactly\none structure (provided by the descendant class). The structure is placed within the cell, but doesn't need\nto be bounded by the cell, it can be well outside the cell; the generator uses the MaxStructureSize parameter\nto determine how far away from the cell the structure can be at most. Each structure has an offset from the\ngrid's center point, the offset is generated randomly from a range given to this class as a parameter.\n\nEach structure thus contains the coords of its grid center (m_GridX, m_GridZ) and the actual origin from\nwhich it's built (m_OriginX, m_OriginZ).\n\nThis class provides a cache for the structures generated for successive chunks and manages that cache. It\nalso provides the cFinishGen override that uses the cache to actually generate the structure into chunk data.\n\nAfter generating each chunk the cache is checked for size, each item in the cache has a cost associated with\nit and the cache is trimmed (from its least-recently-used end) so that the sum of the cost in the cache is\nless than m_MaxCacheSize\n\nTo use this class, declare a descendant class that implements the overridable methods, then create an\ninstance of that class. The descendant must provide the CreateStructure() function that is called to generate\na structure at the specific grid cell.\n\nThe descendant must use a specific cStructure descendant to provide the actual structure that gets generated.\nThe structure must provide the DrawIntoChunk() function that generates the structure into the chunk data, and\ncan override the GetCacheCost() function that returns the cost of that structure in the cache.\n*/\nclass cGridStructGen :\n\tpublic cFinishGen\n{\npublic:\n\t/** Represents a single structure that occupies the grid point. Knows how to draw itself into a chunk. */\n\tclass cStructure\n\t{\n\tpublic:\n\t\t/** The grid point for which the structure is generated. */\n\t\tint m_GridX, m_GridZ;\n\n\t\t/** The origin (the coords for which the structure is generated) */\n\t\tint m_OriginX, m_OriginZ;\n\n\n\t\t/** Creates a structure that has its origin set at the specified coords. */\n\t\tcStructure (int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) :\n\t\t\tm_GridX(a_GridX),\n\t\t\tm_GridZ(a_GridZ),\n\t\t\tm_OriginX(a_OriginX),\n\t\t\tm_OriginZ(a_OriginZ)\n\t\t{\n\t\t}\n\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cStructure() {}\n\n\t\t/** Draws self into the specified chunk */\n\t\tvirtual void DrawIntoChunk(cChunkDesc & a_ChunkDesc) = 0;\n\n\t\t/** Returns the cost of keeping this structure in the cache */\n\t\tvirtual size_t GetCacheCost(void) const { return 1; }\n\t} ;\n\ttypedef std::shared_ptr<cStructure> cStructurePtr;\n\ttypedef std::list<cStructurePtr> cStructurePtrs;\n\n\n\tcGridStructGen(\n\t\tint a_Seed,\n\t\tint a_GridSizeX, int a_GridSizeZ,\n\t\tint a_MaxOffsetX, int a_MaxOffsetZ,\n\t\tint a_MaxStructureSizeX, int a_MaxStructureSizeZ,\n\t\tsize_t a_MaxCacheSize\n\t);\n\n\t/** Creates a new instance that has the generation parameters set to defaults.\n\tThis is used for instances that are later loaded from a file. */\n\tcGridStructGen(int a_Seed);\n\n\t/** Sets the generator params based on the dictionary passed in.\n\tNote that this must not be called anymore after generating a chunk. */\n\tvoid SetGeneratorParams(const AStringMap & a_GeneratorParams);\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\nprotected:\n\t/** Base seed of the world for which the generator generates chunk. */\n\tint m_BaseSeed;\n\n\t/** Seed for generating grid offsets and also available for descendants.\n\tCalculated from m_BaseSeed by adding the SeedOffset parameter loaded from the cubeset file (if applicable); otherwise the same as m_BaseSeed. */\n\tint m_Seed;\n\n\t/** The noise used for generating grid offsets. */\n\tcNoise m_Noise;\n\n\t/** The size of each grid's cell in the X axis */\n\tint m_GridSizeX;\n\n\t/** The size of each grid's cell in the Z axis */\n\tint m_GridSizeZ;\n\n\t/** The maximum offset of the structure's origin from the grid midpoint, in X coord. */\n\tint m_MaxOffsetX;\n\n\t/** The maximum offset of the structure's origin from the grid midpoint, in Z coord. */\n\tint m_MaxOffsetZ;\n\n\t/** Maximum theoretical size of the structure in the X axis.\n\tThis limits the structures considered for a single chunk, so the lesser the number, the better performance.\n\tStructures large than this may get cropped. */\n\tint m_MaxStructureSizeX;\n\n\t/** Maximum theoretical size of the structure in the Z axis.\n\tThis limits the structures considered for a single chunk, so the lesser the number, the better performance.\n\tStructures large than this may get cropped. */\n\tint m_MaxStructureSizeZ;\n\n\t/** Maximum allowed sum of costs for items in the cache. Items that are over this cost are removed from the\n\tcache, oldest-first */\n\tsize_t m_MaxCacheSize;\n\n\t/** Cache for the most recently generated structures, ordered by the recentness. */\n\tcStructurePtrs m_Cache;\n\n\n\t/** Clears everything from the cache */\n\tvoid ClearCache(void);\n\n\t/** Returns all structures that may intersect the given chunk.\n\tThe structures are considered as intersecting iff their bounding box (defined by m_MaxStructureSize)\n\taround their gridpoint intersects the chunk. */\n\tvoid GetStructuresForChunk(int a_ChunkX, int a_ChunkZ, cStructurePtrs & a_Structures);\n\n\t// Functions for the descendants to override:\n\t/** Create a new structure at the specified gridpoint */\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) = 0;\n} ;\n\n\n\n\n\n"
  },
  {
    "path": "src/Generating/HeiGen.cpp",
    "content": "\n// HeiGen.cpp\n\n// Implements the various terrain height generators\n\n#include \"Globals.h\"\n#include \"HeiGen.h\"\n#include \"../LinearUpscale.h\"\n#include \"../IniFile.h\"\n#include \"DistortedHeightmap.h\"\n#include \"EndGen.h\"\n#include \"Noise3DGenerator.h\"\n#include \"ProtIntGen.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeiGenSteppy:\n\nclass cHeiGenSteppy:\n\tpublic cTerrainHeightGen\n{\npublic:\n\tcHeiGenSteppy(int a_Seed) :\n\t\tm_Seed(a_Seed)\n\t{\n\t\tm_Gen =\n\t\t\tstd::make_shared<cProtIntGenWeightAvg<16, 1, 0>>(\n\t\t\tstd::make_shared<cProtIntGenSmooth>             (a_Seed + 1,\n\t\t\tstd::make_shared<cProtIntGenZoom>               (a_Seed + 2,\n\t\t\tstd::make_shared<cProtIntGenSmooth>             (a_Seed + 3,\n\t\t\tstd::make_shared<cProtIntGenZoom>               (a_Seed + 4,\n\t\t\tstd::make_shared<cProtIntGenAddRnd>             (a_Seed + 5, 1,\n\t\t\tstd::make_shared<cProtIntGenSmooth>             (a_Seed + 6,\n\t\t\tstd::make_shared<cProtIntGenZoom>               (a_Seed + 7,\n\t\t\tstd::make_shared<cProtIntGenRndBetween>         (a_Seed + 8, 60,\n\t\t\tstd::make_shared<cProtIntGenAddRnd>             (a_Seed + 9, 1,\n\t\t\tstd::make_shared<cProtIntGenSmooth>             (a_Seed + 1,\n\t\t\tstd::make_shared<cProtIntGenZoom>               (a_Seed + 2,\n\t\t\tstd::make_shared<cProtIntGenRndBetween>         (a_Seed + 3, 60,\n\t\t\tstd::make_shared<cProtIntGenSmooth>             (a_Seed + 4,\n\t\t\tstd::make_shared<cProtIntGenZoom>               (a_Seed + 5,\n\t\t\tstd::make_shared<cProtIntGenRndBetween>         (a_Seed + 6, 60,\n\t\t\tstd::make_shared<cProtIntGenRndChoice>          (a_Seed + 7, 10, 50, 50,\n\t\t\tstd::make_shared<cProtIntGenSmooth>             (a_Seed + 8,\n\t\t\tstd::make_shared<cProtIntGenZoom>               (a_Seed + 9,\n\t\t\tstd::make_shared<cProtIntGenRndChoice>          (a_Seed + 1, 10, 50, 50,\n\t\t\tstd::make_shared<cProtIntGenAddRnd>             (a_Seed + 2, 2,\n\t\t\tstd::make_shared<cProtIntGenZoom>               (a_Seed + 3,\n\t\t\tstd::make_shared<cProtIntGenZoom>               (a_Seed + 4,\n\t\t\tstd::make_shared<cProtIntGenChoice>             (a_Seed + 5, 10)\n\t\t)))))))))))))))))))))));\n\t}\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override\n\t{\n\t\tint heights[cChunkDef::Width * cChunkDef::Width];\n\t\tm_Gen->GetInts(\n\t\t\ta_ChunkCoords.m_ChunkX * cChunkDef::Width, a_ChunkCoords.m_ChunkZ * cChunkDef::Width,\n\t\t\tstatic_cast<size_t>(cChunkDef::Width), static_cast<size_t>(cChunkDef::Width), heights\n\t\t);\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(heights); i++)\n\t\t{\n\t\t\ta_HeightMap[i] = static_cast<HEIGHTTYPE>(std::max(std::min(60 + heights[i], cChunkDef::Height - 60), 40));\n\t\t}\n\t}\n\nprotected:\n\tint m_Seed;\n\n\tstd::shared_ptr<cProtIntGen> m_Gen;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeiGenFlat:\n\nvoid cHeiGenFlat::GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap)\n{\n\tUNUSED(a_ChunkCoords);\n\tfor (size_t i = 0; i < ARRAYCOUNT(a_HeightMap); i++)\n\t{\n\t\ta_HeightMap[i] = m_Height;\n\t}\n}\n\n\n\n\n\nvoid cHeiGenFlat::InitializeHeightGen(cIniFile & a_IniFile)\n{\n\tm_Height = static_cast<HEIGHTTYPE>(a_IniFile.GetValueSetI(\"Generator\", \"FlatHeight\", m_Height));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeiGenCache:\n\ncHeiGenCache::cHeiGenCache(cTerrainHeightGen & a_HeiGenToCache, size_t a_CacheSize) :\n\tm_HeiGenToCache(a_HeiGenToCache),\n\tm_CacheSize(a_CacheSize),\n\tm_NumHits(0),\n\tm_NumMisses(0),\n\tm_TotalChain(0)\n{\n\tm_CacheOrder.resize(a_CacheSize);\n\tm_CacheData.resize(a_CacheSize);\n\tfor (size_t i = 0; i < m_CacheSize; i++)\n\t{\n\t\tm_CacheOrder[i] = i;\n\t}\n}\n\n\n\n\n\nvoid cHeiGenCache::GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap)\n{\n\t/*\n\tif (((m_NumHits + m_NumMisses) % 1024) == 10)\n\t{\n\t\tLOGD(\"HeiGenCache: %d hits, %d misses, saved %.2f %%\", m_NumHits, m_NumMisses, 100.0 * m_NumHits / (m_NumHits + m_NumMisses));\n\t\tLOGD(\"HeiGenCache: Avg cache chain length: %.2f\", static_cast<double>(m_TotalChain) / m_NumHits);\n\t}\n\t//*/\n\n\tfor (size_t i = 0; i < m_CacheSize; i++)\n\t{\n\t\tif (m_CacheData[m_CacheOrder[i]].m_Coords != a_ChunkCoords)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Found it in the cache\n\t\tauto Idx = m_CacheOrder[i];\n\n\t\t// Move to front:\n\t\tfor (size_t j = i; j > 0; j--)\n\t\t{\n\t\t\tm_CacheOrder[j] = m_CacheOrder[j - 1];\n\t\t}\n\t\tm_CacheOrder[0] = Idx;\n\n\t\t// Use the cached data:\n\t\tmemcpy(a_HeightMap, m_CacheData[Idx].m_HeightMap, sizeof(a_HeightMap));\n\n\t\tm_NumHits++;\n\t\tm_TotalChain += i;\n\t\treturn;\n\t}  // for i - cache\n\n\t// Not in the cache:\n\tm_NumMisses++;\n\tm_HeiGenToCache.GenHeightMap(a_ChunkCoords, a_HeightMap);\n\n\t// Insert it as the first item in the MRU order:\n\tauto Idx = m_CacheOrder[m_CacheSize - 1];\n\tfor (auto i = m_CacheSize - 1; i > 0; i--)\n\t{\n\t\tm_CacheOrder[i] = m_CacheOrder[i - 1];\n\t}  // for i - m_CacheOrder[]\n\tm_CacheOrder[0] = Idx;\n\tmemcpy(m_CacheData[Idx].m_HeightMap, a_HeightMap, sizeof(a_HeightMap));\n\tm_CacheData[Idx].m_Coords = a_ChunkCoords;\n}\n\n\n\n\n\nHEIGHTTYPE cHeiGenCache::GetHeightAt(int a_BlockX, int a_BlockZ)\n{\n\t// First try if the chunk is already in the cache:\n\tint chunkX, chunkZ;\n\tcChunkDef::BlockToChunk(a_BlockX, a_BlockZ, chunkX, chunkZ);\n\tHEIGHTTYPE res;\n\tif (GetHeightAt(chunkX, chunkZ, a_BlockX - chunkX * cChunkDef::Width, a_BlockZ - chunkZ * cChunkDef::Width, res))\n\t{\n\t\treturn res;\n\t}\n\n\t// Chunk not in cache, generate the chunk and ask again:\n\tcChunkDef::HeightMap heightMap;\n\tGenHeightMap({chunkX, chunkZ}, heightMap);\n\treturn cChunkDef::GetHeight(heightMap, a_BlockX - chunkX * cChunkDef::Width, a_BlockZ - chunkZ * cChunkDef::Width);\n}\n\n\n\n\n\nbool cHeiGenCache::GetHeightAt(int a_ChunkX, int a_ChunkZ, int a_RelX, int a_RelZ, HEIGHTTYPE & a_Height)\n{\n\tfor (size_t i = 0; i < m_CacheSize; i++)\n\t{\n\t\tif ((m_CacheData[i].m_Coords.m_ChunkX == a_ChunkX) && (m_CacheData[i].m_Coords.m_ChunkZ == a_ChunkZ))\n\t\t{\n\t\t\ta_Height = cChunkDef::GetHeight(m_CacheData[i].m_HeightMap, a_RelX, a_RelZ);\n\t\t\treturn true;\n\t\t}\n\t}  // for i - m_CacheData[]\n\treturn false;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeiGenMultiCache:\n\ncHeiGenMultiCache::cHeiGenMultiCache(std::unique_ptr<cTerrainHeightGen> a_HeiGenToCache, size_t a_SubCacheSize, size_t a_NumSubCaches):\n\tm_NumSubCaches(a_NumSubCaches),\n\tm_Underlying(std::move(a_HeiGenToCache))\n{\n\t// Create the individual sub-caches:\n\tm_SubCaches.reserve(a_NumSubCaches);\n\tfor (size_t i = 0; i < a_NumSubCaches; i++)\n\t{\n\t\tm_SubCaches.push_back(std::make_unique<cHeiGenCache>(*m_Underlying, a_SubCacheSize));\n\t}\n}\n\n\n\n\n\nvoid cHeiGenMultiCache::GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap)\n{\n\t// Get the subcache responsible for this chunk:\n\tconst size_t cacheIdx = (static_cast<size_t>(a_ChunkCoords.m_ChunkX) + m_CoeffZ * static_cast<size_t>(a_ChunkCoords.m_ChunkZ)) % m_NumSubCaches;\n\n\t// Ask the subcache:\n\tm_SubCaches[cacheIdx]->GenHeightMap(a_ChunkCoords, a_HeightMap);\n}\n\n\n\n\n\nHEIGHTTYPE cHeiGenMultiCache::GetHeightAt(int a_BlockX, int a_BlockZ)\n{\n\t// First try if the chunk is already in the cache:\n\tint chunkX, chunkZ;\n\tcChunkDef::BlockToChunk(a_BlockX, a_BlockZ, chunkX, chunkZ);\n\tHEIGHTTYPE res;\n\tif (GetHeightAt(chunkX, chunkZ, a_BlockX - chunkX * cChunkDef::Width, a_BlockZ - chunkZ * cChunkDef::Width, res))\n\t{\n\t\treturn res;\n\t}\n\n\t// Chunk not in cache, generate the chunk and ask again:\n\tcChunkDef::HeightMap heightMap;\n\tGenHeightMap({chunkX, chunkZ}, heightMap);\n\treturn cChunkDef::GetHeight(heightMap, a_BlockX - chunkX * cChunkDef::Width, a_BlockZ - chunkZ * cChunkDef::Width);\n}\n\n\n\n\n\nbool cHeiGenMultiCache::GetHeightAt(int a_ChunkX, int a_ChunkZ, int a_RelX, int a_RelZ, HEIGHTTYPE & a_Height)\n{\n\t// Get the subcache responsible for this chunk:\n\tconst size_t cacheIdx = (static_cast<size_t>(a_ChunkX) + m_CoeffZ * static_cast<size_t>(a_ChunkZ)) % m_NumSubCaches;\n\n\t// Ask the subcache:\n\treturn m_SubCaches[cacheIdx]->GetHeightAt(a_ChunkX, a_ChunkZ, a_RelX, a_RelZ, a_Height);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeiGenClassic:\n\ncHeiGenClassic::cHeiGenClassic(int a_Seed) :\n\tm_Seed(a_Seed),\n\tm_Noise(a_Seed),\n\tm_HeightFreq1(1.0f),\n\tm_HeightAmp1(1.0f),\n\tm_HeightFreq2(0.5f),\n\tm_HeightAmp2(0.5f),\n\tm_HeightFreq3(0.1f),\n\tm_HeightAmp3(0.1f)\n{\n}\n\n\n\n\n\nfloat cHeiGenClassic::GetNoise(float x, float y)\n{\n\tfloat oct1 = m_Noise.CubicNoise2D(x * m_HeightFreq1, y * m_HeightFreq1) * m_HeightAmp1;\n\tfloat oct2 = m_Noise.CubicNoise2D(x * m_HeightFreq2, y * m_HeightFreq2) * m_HeightAmp2;\n\tfloat oct3 = m_Noise.CubicNoise2D(x * m_HeightFreq3, y * m_HeightFreq3) * m_HeightAmp3;\n\n\tfloat height = m_Noise.CubicNoise2D(x * 0.1f, y * 0.1f) * 2;\n\n\tfloat flatness = ((m_Noise.CubicNoise2D(x * 0.5f, y * 0.5f) + 1.f) * 0.5f) * 1.1f;  // 0 ... 1.5\n\tflatness *= flatness * flatness;\n\n\treturn (oct1 + oct2 + oct3) * flatness + height;\n}\n\n\n\n\n\nvoid cHeiGenClassic::GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap)\n{\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tconst float zz = static_cast<float>(a_ChunkCoords.m_ChunkZ * cChunkDef::Width + z);\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tconst float xx = static_cast<float>(a_ChunkCoords.m_ChunkX * cChunkDef::Width + x);\n\n\t\t\tHEIGHTTYPE hei = static_cast<HEIGHTTYPE>(Clamp(static_cast<int>(64 + (GetNoise(xx * 0.05f, zz * 0.05f) * 16)), 10, 250));\n\t\t\tcChunkDef::SetHeight(a_HeightMap, x, z, hei);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cHeiGenClassic::InitializeHeightGen(cIniFile & a_IniFile)\n{\n\tm_HeightFreq1 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"ClassicHeightFreq1\", 0.1));\n\tm_HeightFreq2 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"ClassicHeightFreq2\", 1.0));\n\tm_HeightFreq3 = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"ClassicHeightFreq3\", 2.0));\n\tm_HeightAmp1  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"ClassicHeightAmp1\",  1.0));\n\tm_HeightAmp2  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"ClassicHeightAmp2\",  0.5));\n\tm_HeightAmp3  = static_cast<float>(a_IniFile.GetValueSetF(\"Generator\", \"ClassicHeightAmp3\",  0.5));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeiGenMountains:\n\ncHeiGenMountains::cHeiGenMountains(int a_Seed) :\n\tm_Seed(a_Seed),\n\tm_MountainNoise(a_Seed + 100),\n\tm_DitchNoise(a_Seed + 200),\n\tm_Perlin(a_Seed + 300)\n{\n}\n\n\n\n\n\nvoid cHeiGenMountains::GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap)\n{\n\tNOISE_DATATYPE StartX = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkX * cChunkDef::Width);\n\tNOISE_DATATYPE EndX   = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkX * cChunkDef::Width + cChunkDef::Width - 1);\n\tNOISE_DATATYPE StartZ = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkZ * cChunkDef::Width);\n\tNOISE_DATATYPE EndZ   = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkZ * cChunkDef::Width + cChunkDef::Width - 1);\n\tNOISE_DATATYPE Workspace[16 * 16];\n\tNOISE_DATATYPE MountainNoise[16 * 16];\n\tNOISE_DATATYPE DitchNoise[16 * 16];\n\tNOISE_DATATYPE PerlinNoise[16 * 16];\n\tm_MountainNoise.Generate2D(MountainNoise, 16, 16, StartX, EndX, StartZ, EndZ, Workspace);\n\tm_DitchNoise.Generate2D(DitchNoise, 16, 16, StartX, EndX, StartZ, EndZ, Workspace);\n\tm_Perlin.Generate2D(PerlinNoise, 16, 16, StartX, EndX, StartZ, EndZ, Workspace);\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tint IdxZ = z * cChunkDef::Width;\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint idx = IdxZ + x;\n\t\t\tHEIGHTTYPE hei = static_cast<HEIGHTTYPE>(Clamp(100 - static_cast<int>((MountainNoise[idx] - DitchNoise[idx] + PerlinNoise[idx]) * 15), 10, 250));\n\t\t\tcChunkDef::SetHeight(a_HeightMap, x, z, hei);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cHeiGenMountains::InitializeHeightGen(cIniFile & a_IniFile)\n{\n\t// TODO: Read the params from an INI file\n\tm_MountainNoise.AddOctave(0.1f,  0.2f);\n\tm_MountainNoise.AddOctave(0.05f, 0.4f);\n\tm_MountainNoise.AddOctave(0.02f, 1.0f);\n\tm_DitchNoise.AddOctave(0.1f,  0.2f);\n\tm_DitchNoise.AddOctave(0.05f, 0.4f);\n\tm_DitchNoise.AddOctave(0.02f, 1.0f);\n\n\tm_Perlin.AddOctave(0.01f, 1.5f);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeiGenBiomal:\n\nconst cHeiGenBiomal::sGenParam cHeiGenBiomal::m_GenParam[256] =\n{\n\t/*                        Fast-changing | Middle-changing | Slow-changing | */\n\t/* Biome               |  Freq1  | Amp1 | Freq2   | Amp2  | Freq3  | Amp3 | BaseHeight */\n\t/* biOcean               */ { 0.1f,   2.0f,  0.05f,    10.0f,  0.01f,    8.0f,  50},\n\t/* biPlains              */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  68},\n\t/* biDesert              */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  68},\n\t/* biExtremeHills        */ { 0.2f,   4.0f,  0.05f,    20.0f,  0.01f,   16.0f, 100},\n\t/* biForest              */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},\n\t/* biTaiga               */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},\n\t/* biSwampland           */ { 0.1f,   1.1f,  0.05f,     1.5f,  0.02f,    2.5f,  61.5},\n\t/* biRiver               */ { 0.2f,   0.1f,  0.05f,     0.1f,  0.01f,    0.1f,  56},\n\t/* biNether              */ { 0.1f,   0.0f,  0.01f,     0.0f,  0.01f,    0.0f,   0},  // Unused, but must be here due to indexing\n\t/* biSky                 */ { 0.1f,   0.0f,  0.01f,     0.0f,  0.01f,    0.0f,   0},  // Unused, but must be here due to indexing\n\t/* biFrozenOcean         */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},\n\t/* biFrozenRiver         */ { 0.2f,   0.1f,  0.05f,     0.1f,  0.01f,    0.1f,  56},\n\t/* biIcePlains           */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  68},\n\t/* biIceMountains        */ { 0.2f,   2.0f,  0.05f,    10.0f,  0.01f,    8.0f,  80},\n\t/* biMushroomIsland      */ { 0.1f,   2.0f,  0.05f,     8.0f,  0.01f,    6.0f,  80},\n\t/* biMushroomShore       */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  64},\n\t/* biBeach               */ { 0.1f,   0.5f,  0.05f,     1.0f,  0.01f,    1.0f,  64},\n\t/* biDesertHills         */ { 0.2f,   2.0f,  0.05f,     5.0f,  0.01f,    4.0f,  75},\n\t/* biForestHills         */ { 0.2f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  80},\n\t/* biTaigaHills          */ { 0.2f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  80},\n\t/* biExtremeHillsEdge    */ { 0.2f,   3.0f,  0.05f,    16.0f,  0.01f,   12.0f,  80},\n\t/* biJungle              */ { 0.1f,   3.0f,  0.05f,     6.0f,  0.01f,    6.0f,  70},\n\t/* biJungleHills         */ { 0.2f,   3.0f,  0.05f,    12.0f,  0.01f,   10.0f,  80},\n\t/* biJungleEdge          */ { 0.1f,   3.0f,  0.05f,     6.0f,  0.01f,    6.0f,  70},\n\t/* biDeepOcean           */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},\n\t/* biStoneBeach          */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},\n\t/* biColdBeach           */ { 0.1f,   0.5f,  0.05f,     1.0f,  0.01f,    1.0f,  64},\n\t/* biBirchForest         */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},\n\t/* biBirchForestHills    */ { 0.2f,   2.0f,  0.05f,    10.0f,  0.01f,    8.0f,  80},\n\t/* biRoofedForest        */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},\n\t/* biColdTaiga           */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},\n\t/* biColdTaigaHills      */ { 0.2f,   2.0f,  0.05f,    10.0f,  0.01f,    8.0f,  80},\n\t/* biMegaTaiga           */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},\n\t/* biMegaTaigaHills      */ { 0.2f,   2.0f,  0.05f,    10.0f,  0.01f,    8.0f,  80},\n\t/* biExtremeHillsPlus    */ { 0.2f,   4.0f,  0.05f,    20.0f,  0.01f,   16.0f, 120},\n\t/* biSavanna             */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  68},\n\t/* biSavannaPlateau      */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  80},\n\t/* biMesa                */ { 0.2f,   2.0f,  0.05f,    10.0f,  0.01f,    8.0f,  70},  // 165\n\t/* biMesaPlateauF        */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  80},\n\t/* biMesaPlateau         */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  80},\n\n\t// biomes 40 .. 128 are unused, 89 empty placeholders here:\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 40 .. 49\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 50 .. 59\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 60 .. 69\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 70 .. 79\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 80 .. 89\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 90 .. 99\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 100 .. 109\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 110 .. 119\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},                                           // 120 .. 128\n\n\t/* biSunflowerPlains      */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},  // 129\n\t/* biDesertM              */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},  // 130\n\t/* biExtremeHillsM        */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},  // 131\n\t/* biFlowerForest         */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},  // 132\n\t/* biTaigaM               */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},  // 133\n\t/* biSwamplandM           */ { 1.0f,   3.0f,  1.10f,     7.0f,  0.01f,   0.01f,  60},  // 134\n\n\t// Biomes 135 .. 139 unused, 5 empty placeholders here:\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 135 .. 139\n\n\t/* biIcePlainsSpikes      */ { 0.1f,   2.0f,  0.05f,    12.0f,  0.01f,   10.0f,  40},  // 140\n\n\t// Biomes 141 .. 148 unused, 8 empty placeholders here:\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 141 .. 148\n\n\t/* biJungleM              */ { 0.1f,   3.0f,  0.05f,     6.0f,  0.01f,    6.0f,  70},  // 149\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},                                               // 150\n\t/* biJungleEdgeM          */ { 0.1f,   3.0f,  0.05f,     6.0f,  0.01f,    6.0f,  70},  // 151\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},  // 152 .. 154\n\t/* biBirchForestM         */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},  // 155\n\t/* biBirchForestHillsM    */ { 0.2f,   2.0f,  0.05f,    10.0f,  0.01f,    8.0f,  80},  // 156\n\t/* biRoofedForestM        */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},  // 157\n\t/* biColdTaigaM           */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},  // 158\n\t{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0},                                               // 159\n\t/* biMegaSpruceTaiga      */ { 0.1f,   1.0f,  0.05f,     2.0f,  0.01f,    4.0f,  70},  // 160\n\t/* biMegaSpruceTaigaHills */ { 0.2f,   2.0f,  0.05f,    10.0f,  0.01f,    8.0f,  80},  // 161\n\t/* biExtremeHillsPlusM    */ { 0.2f,   4.0f,  0.05f,    20.0f,  0.01f,   16.0f, 120},  // 162\n\t/* biSavannaM             */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  68},  // 163\n\t/* biSavannaPlateauM      */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  80},  // 164\n\t/* biMesaBryce            */ { 0.2f,   2.0f,  0.1f,     30.0f,  0.01f,    8.0f,  80},\n\t/* biMesaPlateauFM        */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  80},  // 166\n\t/* biMesaPlateauM         */ { 0.1f,   1.0f,  0.05f,     1.5f,  0.01f,    4.0f,  80},  // 167\n} ;\n\n\n\n\n\nvoid cHeiGenBiomal::GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap)\n{\n\t// Generate a 3x3 chunk area of biomes around this chunk:\n\tBiomeNeighbors Biomes;\n\tfor (int z = -1; z <= 1; z++)\n\t{\n\t\tfor (int x = -1; x <= 1; x++)\n\t\t{\n\t\t\tm_BiomeGen.GenBiomes({a_ChunkCoords.m_ChunkX + x, a_ChunkCoords.m_ChunkZ + z}, Biomes[x + 1][z + 1]);\n\t\t}  // for x\n\t}  // for z\n\n\t// Linearly interpolate 4x4 blocks of heightmap:\n\t// Must be done on a floating point datatype, otherwise the results are ugly!\n\tconst int STEPZ = 4;  // Must be a divisor of 16\n\tconst int STEPX = 4;  // Must be a divisor of 16\n\tNOISE_DATATYPE Height[17 * 17];\n\tfor (int z = 0; z < 17; z += STEPZ)\n\t{\n\t\tfor (int x = 0; x < 17; x += STEPX)\n\t\t{\n\t\t\tHeight[x + 17 * z] = GetHeightAt(x, z, a_ChunkCoords.m_ChunkX, a_ChunkCoords.m_ChunkZ, Biomes);\n\t\t}\n\t}\n\tLinearUpscale2DArrayInPlace<17, 17, STEPX, STEPZ>(Height);\n\n\t// Copy into the heightmap\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tcChunkDef::SetHeight(a_HeightMap, x, z, static_cast<HEIGHTTYPE>(Height[x + 17 * z]));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cHeiGenBiomal::InitializeHeightGen(cIniFile & a_IniFile)\n{\n\t// No user-settable params\n}\n\n\n\n\n\nNOISE_DATATYPE cHeiGenBiomal::GetHeightAt(int a_RelX, int a_RelZ, int a_ChunkX, int a_ChunkZ, const cHeiGenBiomal::BiomeNeighbors & a_BiomeNeighbors)\n{\n\t// Sum up how many biomes of each type there are in the neighborhood:\n\tint BiomeCounts[256];\n\tmemset(BiomeCounts, 0, sizeof(BiomeCounts));\n\tint Sum = 0;\n\tfor (int z = -8; z <= 8; z++)\n\t{\n\t\tint FinalZ = a_RelZ + z + cChunkDef::Width;\n\t\tint IdxZ = FinalZ / cChunkDef::Width;\n\t\tint ModZ = FinalZ % cChunkDef::Width;\n\t\tint WeightZ = 9 - abs(z);\n\t\tfor (int x = -8; x <= 8; x++)\n\t\t{\n\t\t\tint FinalX = a_RelX + x + cChunkDef::Width;\n\t\t\tint IdxX = FinalX / cChunkDef::Width;\n\t\t\tint ModX = FinalX % cChunkDef::Width;\n\t\t\tEMCSBiome Biome = cChunkDef::GetBiome(a_BiomeNeighbors[IdxX][IdxZ], ModX, ModZ);\n\t\t\tint WeightX = 9 - abs(x);\n\t\t\tBiomeCounts[Biome] += WeightX + WeightZ;\n\t\t\tSum += WeightX + WeightZ;\n\t\t}  // for x\n\t}  // for z\n\n\t// For each biome type that has a nonzero count, calc its height and add it:\n\tif (Sum > 0)\n\t{\n\t\tNOISE_DATATYPE Height = 0;\n\t\tint BlockX = a_ChunkX * cChunkDef::Width + a_RelX;\n\t\tint BlockZ = a_ChunkZ * cChunkDef::Width + a_RelZ;\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(BiomeCounts); i++)\n\t\t{\n\t\t\tif (BiomeCounts[i] == 0)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t// Sanity checks for biome parameters, enable them to check the biome param table in runtime (slow):\n\t\t\tASSERT(m_GenParam[i].m_HeightFreq1 >= 0);\n\t\t\tASSERT(m_GenParam[i].m_HeightFreq1 < 1000);\n\t\t\tASSERT(m_GenParam[i].m_HeightFreq2 >= 0);\n\t\t\tASSERT(m_GenParam[i].m_HeightFreq2 < 1000);\n\t\t\tASSERT(m_GenParam[i].m_HeightFreq3 >= 0);\n\t\t\tASSERT(m_GenParam[i].m_HeightFreq3 < 1000);\n\t\t\t*/\n\n\t\t\tNOISE_DATATYPE oct1 = m_Noise.CubicNoise2D(BlockX * m_GenParam[i].m_HeightFreq1, BlockZ * m_GenParam[i].m_HeightFreq1) * m_GenParam[i].m_HeightAmp1;\n\t\t\tNOISE_DATATYPE oct2 = m_Noise.CubicNoise2D(BlockX * m_GenParam[i].m_HeightFreq2, BlockZ * m_GenParam[i].m_HeightFreq2) * m_GenParam[i].m_HeightAmp2;\n\t\t\tNOISE_DATATYPE oct3 = m_Noise.CubicNoise2D(BlockX * m_GenParam[i].m_HeightFreq3, BlockZ * m_GenParam[i].m_HeightFreq3) * m_GenParam[i].m_HeightAmp3;\n\t\t\tHeight += BiomeCounts[i] * (m_GenParam[i].m_BaseHeight + oct1 + oct2 + oct3);\n\t\t}\n\t\tNOISE_DATATYPE res = Height / Sum;\n\t\treturn std::min(static_cast<NOISE_DATATYPE>(250), std::max(res, static_cast<NOISE_DATATYPE>(5)));\n\t}\n\n\t// No known biome around? Weird. Return a bogus value:\n\tASSERT(!\"cHeiGenBiomal: Biome sum failed, no known biome around\");\n\treturn 5;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHeiGenMinMax:\n\nclass cHeiGenMinMax:\n\tpublic cTerrainHeightGen\n{\n\tusing Super = cTerrainHeightGen;\n\n\t/** Size of the averaging process, in columns (for each direction). Must be less than 16. */\n\tstatic const int AVERAGING_SIZE = 4;\n\npublic:\n\n\tcHeiGenMinMax(int a_Seed, cBiomeGen & a_BiomeGen):\n\t\tm_Noise(a_Seed),\n\t\tm_BiomeGen(a_BiomeGen),\n\t\tm_TotalWeight(0)\n\t{\n\t\t// Initialize the weights:\n\t\tfor (int z = 0; z <= AVERAGING_SIZE * 2; z++)\n\t\t{\n\t\t\tfor (int x = 0; x <= AVERAGING_SIZE * 2; x++)\n\t\t\t{\n\t\t\t\tm_Weights[z][x] = 1 + 2 * AVERAGING_SIZE - std::abs(x - AVERAGING_SIZE) - std::abs(z - AVERAGING_SIZE);\n\t\t\t\tm_TotalWeight += m_Weights[z][x];\n\t\t\t}\n\t\t}\n\n\t\t// Initialize the Perlin generator:\n\t\tm_Perlin.AddOctave(0.04f,   0.2f);\n\t\tm_Perlin.AddOctave(0.02f,   0.1f);\n\t\tm_Perlin.AddOctave(0.01f,   0.05f);\n\t}\n\n\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override\n\t{\n\t\t// Generate the biomes for the 3 * 3 neighbors:\n\t\tcChunkDef::BiomeMap neighborBiomes[3][3];\n\t\tfor (int z = 0; z < 3; z++) for (int x = 0; x < 3; x++)\n\t\t{\n\t\t\tm_BiomeGen.GenBiomes({a_ChunkCoords.m_ChunkX + x - 1, a_ChunkCoords.m_ChunkZ + z - 1}, neighborBiomes[z][x]);\n\t\t}\n\n\t\t// Get the min and max heights based on the biomes:\n\t\tdouble minHeight[cChunkDef::Width * cChunkDef::Width];\n\t\tdouble maxHeight[cChunkDef::Width * cChunkDef::Width];\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\t// For each column, sum the min and max values of the neighborhood around it:\n\t\t\t\tdouble min = 0, max = 0;\n\t\t\t\tfor (int relz = 0; relz <= AVERAGING_SIZE * 2; relz++)\n\t\t\t\t{\n\t\t\t\t\tint bz = z + 16 + relz - AVERAGING_SIZE;  // Biome Z coord relative to the neighborBiomes start\n\t\t\t\t\tint cz = bz / 16;                         // Chunk Z coord relative to the neighborBiomes start\n\t\t\t\t\tbz = bz % 16;                             // Biome Z coord relative to cz in neighborBiomes\n\t\t\t\t\tfor (int relx = 0; relx <= AVERAGING_SIZE * 2; relx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tint bx = x + 16 + relx - AVERAGING_SIZE;  // Biome X coord relative to the neighborBiomes start\n\t\t\t\t\t\tint cx = bx / 16;                         // Chunk X coord relative to the neighborBiomes start\n\t\t\t\t\t\tbx = bx % 16;                             // Biome X coord relative to cz in neighborBiomes\n\n\t\t\t\t\t\t// Get the biome's min and max heights:\n\t\t\t\t\t\tdouble bmin, bmax;\n\t\t\t\t\t\tgetBiomeMinMax(cChunkDef::GetBiome(neighborBiomes[cz][cx], bx, bz), bmin, bmax);\n\n\t\t\t\t\t\t// Add them to the total, with the weight depending on their relative position to the column:\n\t\t\t\t\t\tmin += bmin * m_Weights[relz][relx];\n\t\t\t\t\t\tmax += bmax * m_Weights[relz][relx];\n\t\t\t\t\t}  // for relx\n\t\t\t\t}  // for relz\n\t\t\t\tminHeight[x + z * cChunkDef::Width] = min / m_TotalWeight;\n\t\t\t\tmaxHeight[x + z * cChunkDef::Width] = max / m_TotalWeight;\n\t\t\t}  // for x\n\t\t}  // for z\n\n\t\t// Generate the base noise:\n\t\tNOISE_DATATYPE noise[cChunkDef::Width * cChunkDef::Width];\n\t\tNOISE_DATATYPE workspace[cChunkDef::Width * cChunkDef::Width];\n\t\tNOISE_DATATYPE startX = static_cast<float>(a_ChunkCoords.m_ChunkX * cChunkDef::Width);\n\t\tNOISE_DATATYPE endX = startX + cChunkDef::Width - 1;\n\t\tNOISE_DATATYPE startZ = static_cast<float>(a_ChunkCoords.m_ChunkZ * cChunkDef::Width);\n\t\tNOISE_DATATYPE endZ = startZ + cChunkDef::Width - 1;\n\t\tm_Perlin.Generate2D(noise, 16, 16, startX, endX, startZ, endZ, workspace);\n\n\t\t// Make the height by ranging the noise between min and max:\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\tdouble min = minHeight[x + z * cChunkDef::Width];\n\t\t\t\tdouble max = maxHeight[x + z * cChunkDef::Width];\n\t\t\t\tdouble h = (max + min) / 2 + noise[x + z * cChunkDef::Width] * (max - min);\n\t\t\t\tcChunkDef::SetHeight(a_HeightMap, x, z, static_cast<HEIGHTTYPE>(h));\n\t\t\t}\n\t\t}\n\t}\n\n\n\tvirtual void InitializeHeightGen(cIniFile & a_IniFile) override\n\t{\n\t\t// No settings available\n\t}\n\nprotected:\n\tcNoise m_Noise;\n\n\tcPerlinNoise m_Perlin;\n\n\t/** The biome generator to query for the underlying biomes. */\n\tcBiomeGen & m_BiomeGen;\n\n\t/** Weights applied to each of the min / max values in the neighborhood of the currently evaluated column. */\n\tdouble m_Weights[AVERAGING_SIZE * 2 + 1][AVERAGING_SIZE * 2 + 1];\n\n\t/** Sum of all the m_Weights items. */\n\tdouble m_TotalWeight;\n\n\n\t/** Returns the minimum and maximum heights for the given biome. */\n\tvoid getBiomeMinMax(EMCSBiome a_Biome, double & a_Min, double & a_Max)\n\t{\n\t\tswitch (a_Biome)\n\t\t{\n\t\t\tcase biBeach:                a_Min = 61; a_Max = 64; break;\n\t\t\tcase biBirchForest:          a_Min = 63; a_Max = 75; break;\n\t\t\tcase biBirchForestHills:     a_Min = 63; a_Max = 90; break;\n\t\t\tcase biBirchForestHillsM:    a_Min = 63; a_Max = 90; break;\n\t\t\tcase biBirchForestM:         a_Min = 63; a_Max = 75; break;\n\t\t\tcase biColdBeach:            a_Min = 61; a_Max = 64; break;\n\t\t\tcase biColdTaiga:            a_Min = 63; a_Max = 75; break;\n\t\t\tcase biColdTaigaHills:       a_Min = 63; a_Max = 90; break;\n\t\t\tcase biColdTaigaM:           a_Min = 63; a_Max = 75; break;\n\t\t\tcase biDeepOcean:            a_Min = 30; a_Max = 60; break;\n\t\t\tcase biDesert:               a_Min = 63; a_Max = 70; break;\n\t\t\tcase biDesertHills:          a_Min = 63; a_Max = 85; break;\n\t\t\tcase biDesertM:              a_Min = 63; a_Max = 70; break;\n\t\t\tcase biEnd:                  a_Min = 10; a_Max = 100; break;\n\t\t\tcase biExtremeHills:         a_Min = 60; a_Max = 120; break;\n\t\t\tcase biExtremeHillsEdge:     a_Min = 63; a_Max = 100; break;\n\t\t\tcase biExtremeHillsM:        a_Min = 60; a_Max = 120; break;\n\t\t\tcase biExtremeHillsPlus:     a_Min = 60; a_Max = 140; break;\n\t\t\tcase biExtremeHillsPlusM:    a_Min = 60; a_Max = 140; break;\n\t\t\tcase biFlowerForest:         a_Min = 63; a_Max = 75; break;\n\t\t\tcase biForest:               a_Min = 63; a_Max = 75; break;\n\t\t\tcase biForestHills:          a_Min = 63; a_Max = 90; break;\n\t\t\tcase biFrozenOcean:          a_Min = 45; a_Max = 64; break;\n\t\t\tcase biFrozenRiver:          a_Min = 60; a_Max = 62; break;\n\t\t\tcase biIceMountains:         a_Min = 63; a_Max = 90; break;\n\t\t\tcase biIcePlains:            a_Min = 63; a_Max = 70; break;\n\t\t\tcase biIcePlainsSpikes:      a_Min = 60; a_Max = 70; break;\n\t\t\tcase biJungle:               a_Min = 60; a_Max = 80; break;\n\t\t\tcase biJungleEdge:           a_Min = 62; a_Max = 75; break;\n\t\t\tcase biJungleEdgeM:          a_Min = 62; a_Max = 75; break;\n\t\t\tcase biJungleHills:          a_Min = 60; a_Max = 90; break;\n\t\t\tcase biJungleM:              a_Min = 60; a_Max = 75; break;\n\t\t\tcase biMegaSpruceTaiga:      a_Min = 63; a_Max = 75; break;\n\t\t\tcase biMegaSpruceTaigaHills: a_Min = 63; a_Max = 90; break;\n\t\t\tcase biMegaTaiga:            a_Min = 63; a_Max = 75; break;\n\t\t\tcase biMegaTaigaHills:       a_Min = 63; a_Max = 90; break;\n\t\t\tcase biMesa:                 a_Min = 63; a_Max = 90; break;\n\t\t\tcase biMesaBryce:            a_Min = 60; a_Max = 67; break;\n\t\t\tcase biMesaPlateau:          a_Min = 75; a_Max = 85; break;\n\t\t\tcase biMesaPlateauF:         a_Min = 80; a_Max = 90; break;\n\t\t\tcase biMesaPlateauFM:        a_Min = 80; a_Max = 90; break;\n\t\t\tcase biMesaPlateauM:         a_Min = 75; a_Max = 85; break;\n\t\t\tcase biMushroomIsland:       a_Min = 63; a_Max = 90; break;\n\t\t\tcase biMushroomShore:        a_Min = 60; a_Max = 75; break;\n\t\t\tcase biNether:               a_Min = 10; a_Max = 100; break;\n\t\t\tcase biOcean:                a_Min = 45; a_Max = 64; break;\n\t\t\tcase biPlains:               a_Min = 63; a_Max = 70; break;\n\t\t\tcase biRiver:                a_Min = 60; a_Max = 62; break;\n\t\t\tcase biRoofedForest:         a_Min = 63; a_Max = 75; break;\n\t\t\tcase biRoofedForestM:        a_Min = 63; a_Max = 75; break;\n\t\t\tcase biSavanna:              a_Min = 63; a_Max = 75; break;\n\t\t\tcase biSavannaM:             a_Min = 63; a_Max = 80; break;\n\t\t\tcase biSavannaPlateau:       a_Min = 75; a_Max = 100; break;\n\t\t\tcase biSavannaPlateauM:      a_Min = 80; a_Max = 160; break;\n\t\t\tcase biStoneBeach:           a_Min = 60; a_Max = 64; break;\n\t\t\tcase biSunflowerPlains:      a_Min = 63; a_Max = 70; break;\n\t\t\tcase biSwampland:            a_Min = 60; a_Max = 67; break;\n\t\t\tcase biSwamplandM:           a_Min = 61; a_Max = 67; break;\n\t\t\tcase biTaiga:                a_Min = 63; a_Max = 75; break;\n\t\t\tcase biTaigaHills:           a_Min = 63; a_Max = 90; break;\n\t\t\tcase biTaigaM:               a_Min = 63; a_Max = 80; break;\n\t\t\tcase biInvalidBiome:\n\t\t\tcase biNumBiomes:\n\t\t\tcase biVariant:\n\t\t\tcase biNumVariantBiomes:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unknown biome\");\n\t\t\t\ta_Min = 10;\n\t\t\t\ta_Max = 10;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cTerrainHeightGen:\n\nstd::unique_ptr<cTerrainHeightGen> cTerrainHeightGen::CreateHeightGen(cIniFile & a_IniFile, cBiomeGen & a_BiomeGen, int a_Seed, bool & a_CacheOffByDefault)\n{\n\tAString HeightGenName = a_IniFile.GetValueSet(\"Generator\", \"HeightGen\", \"\");\n\tif (HeightGenName.empty())\n\t{\n\t\tLOGWARN(\"[Generator] HeightGen value not set in world.ini, using \\\"Biomal\\\".\");\n\t\tHeightGenName = \"Biomal\";\n\t}\n\n\ta_CacheOffByDefault = false;\n\tstd::unique_ptr<cTerrainHeightGen> res;\n\tif (NoCaseCompare(HeightGenName, \"Flat\") == 0)\n\t{\n\t\tres = std::make_unique<cHeiGenFlat>();\n\t\ta_CacheOffByDefault = true;  // We're generating faster than a cache would retrieve data\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"classic\") == 0)\n\t{\n\t\tres = std::make_unique<cHeiGenClassic>(a_Seed);\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"DistortedHeightmap\") == 0)\n\t{\n\t\t// Not a heightmap-based generator, but it used to be accessible via HeightGen, so we need to skip making the default out of it\n\t\t// Return an empty pointer, the caller will create the proper generator:\n\t\treturn nullptr;\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"End\") == 0)\n\t{\n\t\t// Not a heightmap-based generator, but it used to be accessible via HeightGen, so we need to skip making the default out of it\n\t\t// Return an empty pointer, the caller will create the proper generator:\n\t\treturn nullptr;\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"MinMax\") == 0)\n\t{\n\t\tres = std::make_unique<cHeiGenMinMax>(a_Seed, a_BiomeGen);\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"Mountains\") == 0)\n\t{\n\t\tres = std::make_unique<cHeiGenMountains>(a_Seed);\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"BiomalNoise3D\") == 0)\n\t{\n\t\t// Not a heightmap-based generator, but it used to be accessible via HeightGen, so we need to skip making the default out of it\n\t\t// Return an empty pointer, the caller will create the proper generator:\n\t\treturn nullptr;\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"Steppy\") == 0)\n\t{\n\t\tres = std::make_unique<cHeiGenSteppy>(a_Seed);\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"Noise3D\") == 0)\n\t{\n\t\t// Not a heightmap-based generator, but it used to be accessible via HeightGen, so we need to skip making the default out of it\n\t\t// Return an empty pointer, the caller will create the proper generator:\n\t\treturn nullptr;\n\t}\n\telse if (NoCaseCompare(HeightGenName, \"Biomal\") == 0)\n\t{\n\t\tres = std::make_unique<cHeiGenBiomal>(a_Seed, a_BiomeGen);\n\n\t\t/*\n\t\t// Performance-testing:\n\t\tLOGINFO(\"Measuring performance of cHeiGenBiomal...\");\n\t\tclock_t BeginTick = clock();\n\t\tfor (int x = 0; x < 500; x++)\n\t\t{\n\t\t\tcChunkDef::HeightMap Heights;\n\t\t\tres->GenHeightMap(x * 5, x * 5, Heights);\n\t\t}\n\t\tclock_t Duration = clock() - BeginTick;\n\t\tLOGINFO(\"HeightGen for 500 chunks took %d ticks (%.02f sec)\", Duration, (double)Duration / CLOCKS_PER_SEC);\n\t\t//*/\n\t}\n\telse\n\t{\n\t\t// No match found, force-set the default and retry\n\t\tLOGWARN(\"Unknown HeightGen \\\"%s\\\", using \\\"Biomal\\\" instead.\", HeightGenName.c_str());\n\t\ta_IniFile.SetValue(\"Generator\", \"HeightGen\", \"Biomal\");\n\t\treturn CreateHeightGen(a_IniFile, a_BiomeGen, a_Seed, a_CacheOffByDefault);\n\t}\n\n\t// Read the settings:\n\tres->InitializeHeightGen(a_IniFile);\n\n\treturn res;\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/Generating/HeiGen.h",
    "content": "\n// HeiGen.h\n\n/*\nInterfaces to the various height-based terrain shape generators:\n\t- cHeiGenFlat\n\t- cHeiGenClassic\n\t- cHeiGenBiomal\n\nAlso implements the heightmap cache\n*/\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Noise/Noise.h\"\n\n\n\n\n\n/** A simple cache that stores N most recently generated chunks' heightmaps; N being settable upon creation */\nclass cHeiGenCache :\n\tpublic cTerrainHeightGen\n{\npublic:\n\tcHeiGenCache(cTerrainHeightGen & a_HeiGenToCache, size_t a_CacheSize);\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override;\n\tvirtual HEIGHTTYPE GetHeightAt(int a_BlockX, int a_BlockZ) override;\n\n\t/** Retrieves height at the specified point in the cache, returns true if found, false if not found */\n\tbool GetHeightAt(int a_ChunkX, int a_ChunkZ, int a_RelX, int a_RelZ, HEIGHTTYPE & a_Height);\n\nprotected:\n\tstruct sCacheData\n\t{\n\t\tcChunkCoords m_Coords;\n\t\tcChunkDef::HeightMap m_HeightMap;\n\n\t\t/** Default constructor: Fill in bogus coords, so that the item is not used until properly calculated. */\n\t\tsCacheData():\n\t\t\tm_Coords(0x7fffffff, 0x7fffffff)\n\t\t{}\n\t} ;\n\n\t/** The terrain height generator that is being cached. */\n\tcTerrainHeightGen & m_HeiGenToCache;\n\n\t// To avoid moving large amounts of data for the MRU behavior, we MRU-ize indices to an array of the actual data\n\tsize_t                  m_CacheSize;\n\tstd::vector<size_t>     m_CacheOrder;  // MRU-ized order, indices into m_CacheData array\n\tstd::vector<sCacheData> m_CacheData;   // m_CacheData[m_CacheOrder[0]] is the most recently used\n\n\t// Cache statistics\n\tsize_t m_NumHits;\n\tsize_t m_NumMisses;\n\tsize_t m_TotalChain;  // Number of cache items walked to get to a hit (only added for hits)\n} ;\n\n\n\n\n\n/** Caches heightmaps in multiple underlying caches to improve the distribution and lower the chain length. */\nclass cHeiGenMultiCache:\n\tpublic cTerrainHeightGen\n{\npublic:\n\tcHeiGenMultiCache(std::unique_ptr<cTerrainHeightGen> a_HeightGenToCache, size_t a_SubCacheSize, size_t a_NumSubCaches);\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override;\n\tvirtual HEIGHTTYPE GetHeightAt(int a_BlockX, int a_BlockZ) override;\n\n\t/** Retrieves height at the specified point in the cache, returns true if found, false if not found */\n\tbool GetHeightAt(int a_ChunkX, int a_ChunkZ, int a_RelX, int a_RelZ, HEIGHTTYPE & a_Height);\n\nprotected:\n\n\t/** The coefficient used to turn Z coords into index (x + Coeff * z). */\n\tstatic const size_t m_CoeffZ = 5;\n\n\t/** Number of sub-caches, pulled out of m_SubCaches.size() for performance reasons. */\n\tsize_t m_NumSubCaches;\n\n\t/** The individual sub-caches. */\n\tstd::vector<std::unique_ptr<cHeiGenCache>> m_SubCaches;\n\n\t/** The underlying height generator. */\n\tstd::unique_ptr<cTerrainHeightGen> m_Underlying;\n};\n\n\n\n\n\nclass cHeiGenFlat :\n\tpublic cTerrainHeightGen\n{\npublic:\n\tcHeiGenFlat(void) : m_Height(5) {}\n\nprotected:\n\n\tHEIGHTTYPE m_Height;\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override;\n\tvirtual void InitializeHeightGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\nclass cHeiGenClassic :\n\tpublic cTerrainHeightGen\n{\npublic:\n\tcHeiGenClassic(int a_Seed);\n\nprotected:\n\n\tint m_Seed;\n\tcNoise m_Noise;\n\tfloat m_HeightFreq1, m_HeightAmp1;\n\tfloat m_HeightFreq2, m_HeightAmp2;\n\tfloat m_HeightFreq3, m_HeightAmp3;\n\n\tfloat GetNoise(float x, float y);\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override;\n\tvirtual void InitializeHeightGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\nclass cHeiGenMountains :\n\tpublic cTerrainHeightGen\n{\npublic:\n\tcHeiGenMountains(int a_Seed);\n\nprotected:\n\n\tint m_Seed;\n\tcRidgedMultiNoise m_MountainNoise;\n\tcRidgedMultiNoise m_DitchNoise;\n\tcPerlinNoise m_Perlin;\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override;\n\tvirtual void InitializeHeightGen(cIniFile & a_IniFile) override;\n} ;\n\n\n\n\n\nclass cHeiGenBiomal:\n\tpublic cTerrainHeightGen\n{\n\tusing Super = cTerrainHeightGen;\n\npublic:\n\n\tcHeiGenBiomal(int a_Seed, cBiomeGen & a_BiomeGen):\n\t\tm_Noise(a_Seed),\n\t\tm_BiomeGen(a_BiomeGen)\n\t{\n\t}\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenHeightMap(cChunkCoords a_ChunkCoords, cChunkDef::HeightMap & a_HeightMap) override;\n\tvirtual HEIGHTTYPE GetHeightAt(int a_BlockX, int a_BlockZ) override  // Need to provide this override due to clang's overzealous detection of overloaded virtuals\n\t{\n\t\treturn Super::GetHeightAt(a_BlockX, a_BlockZ);\n\t}\n\tvirtual void InitializeHeightGen(cIniFile & a_IniFile) override;\n\nprotected:\n\n\ttypedef cChunkDef::BiomeMap BiomeNeighbors[3][3];\n\n\tcNoise m_Noise;\n\tcBiomeGen & m_BiomeGen;\n\n\t// Per-biome terrain generator parameters:\n\tstruct sGenParam\n\t{\n\t\tfloat m_HeightFreq1, m_HeightAmp1;\n\t\tfloat m_HeightFreq2, m_HeightAmp2;\n\t\tfloat m_HeightFreq3, m_HeightAmp3;\n\t\tfloat m_BaseHeight;\n\t} ;\n\tstatic const sGenParam m_GenParam[256];\n\n\n\tNOISE_DATATYPE GetHeightAt(int a_RelX, int a_RelZ, int a_ChunkX, int a_ChunkZ, const BiomeNeighbors & a_BiomeNeighbors);\n} ;\n"
  },
  {
    "path": "src/Generating/IntGen.h",
    "content": "// IntGen.h\n\n// Declares the cIntGen class and descendants for generating and filtering various 2D arrays of ints\n\n/*\nThe integers generated may be interpreted in several ways:\n- land / sea designators\n\t- 0 = ocean\n\t- >0 = land\n- biome group\n\t- 0 = ocean\n\t- 1 = desert biomes\n\t- 2 = temperate biomes\n\t- 3 = mountains (hills and forests)\n\t- 4 = ice biomes\n- biome group with \"bgfRare\" flag (for generating rare biomes for the group)\n- biome IDs\nThe interpretation depends on the generator used and on the position in the chain.\n\nThe generators can be chained together - one produces data that another one consumes.\nSome of such chain connections require changing the data dimensions between the two, which is handled automatically\nby using templates.\n*/\n\n\n\n\n\n#pragma once\n\n#include <tuple>\n#include \"../Noise/Noise.h\"\n#include \"BiomeDef.h\"\n\n\n\n\n\n/** Constants representing the biome group designators. */\nconst int bgOcean        = 0;\nconst int bgDesert       = 1;\nconst int bgTemperate    = 2;\nconst int bgMountains    = 3;\nconst int bgIce          = 4;\nconst int bgLandOceanMax = 4;  // Maximum biome group value generated in the landOcean generator\nconst int bgfRare        = 1024;  // Flag added to values to generate rare biomes for the group\n\n\n\n\n\n/** Interface that all the generator classes provide. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGen\n{\npublic:\n\n\tusing IntGenType = cIntGen<SizeX, SizeZ>;\n\n\t/** Force a virtual destructor in all descendants.\n\tDescendants contain virtual functions and are referred to via pointer-to-base, so they need a virtual destructor. */\n\tvirtual ~cIntGen() {}\n\n\t/** Holds the array of values generated by this class (descendant). */\n\tusing Values = int[SizeX * SizeZ];\n\n\t/** Generates the array of templated size into a_Values, based on given min coords. */\n\tvirtual void GetInts(int a_MinX, int a_MinZ, Values & a_Values) = 0;\n\n};\n\n// Code adapted from https://stackoverflow.com/questions/7858817/unpacking-a-tuple-to-call-a-matching-function-pointer\n\ntemplate<int... >\nstruct sSeq\n{\n};\n\ntemplate<int N, int... S>\nstruct sGens : sGens<N - 1, N - 1, S...>\n{\n};\n\ntemplate<int... S>\nstruct sGens<0, S...>\n{\n\tusing type = sSeq<S...>;\n};\n\n\ntemplate<class Gen, class... Args>\nclass cIntGenFactory\n{\n\npublic:\n\n\tusing Generator = Gen;\n\n\tcIntGenFactory(Args&&... a_args) :\n\t\tm_args(std::make_tuple<Args...>(std::forward<Args>(a_args)...))\n\t{\n\t}\n\n\ttemplate <class LhsGen>\n\tstd::shared_ptr<Gen> construct(LhsGen&& a_Lhs)\n\t{\n\t\treturn construct_impl<LhsGen>(std::forward<LhsGen>(a_Lhs), typename sGens<sizeof...(Args)>::type());\n\t}\n\n\nprivate:\n\tstd::tuple<Args...> m_args;\n\n\ttemplate <class LhsGen, int... S>\n\tstd::shared_ptr<Gen> construct_impl(LhsGen&& a_Lhs, sSeq<S...>)\n\t{\n\t\treturn std::make_shared<Gen>(std::get<S>(m_args)..., std::forward<LhsGen>(a_Lhs));\n\t}\n\n};\n\ntemplate<class T, class RhsGen, class... Args>\nstd::shared_ptr<RhsGen> operator| (std::shared_ptr<T> a_Lhs, cIntGenFactory<RhsGen, Args...> a_Rhs)\n{\n\treturn a_Rhs.construct(static_cast<std::shared_ptr<typename T::IntGenType>>(a_Lhs));\n}\n\ntemplate<class Gen, class... Args>\ncIntGenFactory<Gen, Args...> MakeIntGen(Args&&... a_Args)\n{\n\treturn cIntGenFactory<Gen, Args...>(std::forward<Args>(a_Args)...);\n}\n\n\n\n/** Provides additional cNoise member and its helper functions. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenWithNoise:\n\tpublic cIntGen<SizeX, SizeZ>\n{\n\tusing Super = cIntGen<SizeX, SizeZ>;\n\npublic:\n\n\tcIntGenWithNoise(int a_Seed):\n\t\tm_Noise(a_Seed)\n\t{\n\t}\n\nprotected:\n\tcNoise m_Noise;\n\n\t/** Chooses one of a_Val1 or a_Val2, based on m_Noise and the coordinates for querying the noise. */\n\tint ChooseRandomOne(int a_RndX, int a_RndZ, int a_Val1, int a_Val2)\n\t{\n\t\tint rnd = m_Noise.IntNoise2DInt(a_RndX, a_RndZ) / 7;\n\t\treturn ((rnd & 1) == 0) ? a_Val1 : a_Val2;\n\t}\n\n\t/** Chooses one of a_ValN, based on m_Noise and the coordinates for querying the noise. */\n\tint ChooseRandomOne(int a_RndX, int a_RndZ, int a_Val1, int a_Val2, int a_Val3, int a_Val4)\n\t{\n\t\tint rnd = m_Noise.IntNoise2DInt(a_RndX, a_RndZ) / 7;\n\t\tswitch (rnd % 4)\n\t\t{\n\t\t\tcase 0:  return a_Val1;\n\t\t\tcase 1:  return a_Val2;\n\t\t\tcase 2:  return a_Val3;\n\t\t\tdefault: return a_Val4;\n\t\t}\n\t}\n};\n\n\n\n\n\n/** Generates a 2D array of random integers in the specified range [0 .. Range). */\ntemplate <int Range, int SizeX, int SizeZ = SizeX>\nclass cIntGenChoice:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tcIntGenChoice(int a_Seed):\n\t\tSuper(a_Seed)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint BaseZ = a_MinZ + z;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\ta_Values[x + SizeX * z] = (Super::m_Noise.IntNoise2DInt(a_MinX + x, BaseZ) / 7) % Range;\n\t\t\t}\n\t\t}  // for z\n\t}\n};\n\n\n\n\n\n/** Decides between the ocean and landmass biomes.\nHas a threshold (in percent) of how much land, the larger the threshold, the more land.\nGenerates 0 for ocean, biome group ID for landmass. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenLandOcean:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tcIntGenLandOcean(int a_Seed, int a_Threshold):\n\t\tSuper(a_Seed),\n\t\tm_Threshold(a_Threshold)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint BaseZ = a_MinZ + z;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint rnd = (Super::m_Noise.IntNoise2DInt(a_MinX + x, BaseZ) / 7);\n\t\t\t\ta_Values[x + SizeX * z] = ((rnd % 100) < m_Threshold) ? ((rnd / 101) % bgLandOceanMax + 1) : 0;\n\t\t\t}\n\t\t}\n\n\t\t// If the centerpoint of the world is within the area, set it to bgTemperate, always:\n\t\tif ((a_MinX <= 0) && (a_MinZ <= 0) && (a_MinX + SizeX > 0) && (a_MinZ + SizeZ > 0))\n\t\t{\n\t\t\ta_Values[-a_MinX - a_MinZ * SizeX] = bgTemperate;\n\t\t}\n\t}\n\nprotected:\n\tint m_Threshold;\n};\n\n\n\n\n\n/** Zooms the underlying value array to twice the size. Uses random-neighbor for the pixels in-between.\nThis means that the zoome out image is randomly distorted. Applying zoom several times provides all\nthe distortion that the generators need. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenZoom:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\nprotected:\n\n\tstatic const int m_LowerSizeX = (SizeX / 2) + 2;\n\tstatic const int m_LowerSizeZ = (SizeZ / 2) + 2;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<m_LowerSizeX, m_LowerSizeZ>>;\n\n\n\tcIntGenZoom(int a_Seed, Underlying a_UnderlyingGen):\n\t\tSuper(a_Seed),\n\t\tm_UnderlyingGen(a_UnderlyingGen)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying data with half the resolution:\n\t\tint lowerMinX = a_MinX >> 1;\n\t\tint lowerMinZ = a_MinZ >> 1;\n\t\tint lowerData[m_LowerSizeX * m_LowerSizeZ];\n\t\tm_UnderlyingGen->GetInts(lowerMinX, lowerMinZ, lowerData);\n\t\tconst int lowStepX = (m_LowerSizeX - 1) * 2;\n\t\tconst int lowStepZ = (m_LowerSizeZ - 1) * 2;\n\t\tint cache[lowStepX * lowStepZ];\n\n\t\t// Discreet-interpolate the values into twice the size:\n\t\tfor (int z = 0; z < m_LowerSizeZ - 1; ++z)\n\t\t{\n\t\t\tint idx = (z * 2) * lowStepX;\n\t\t\tint PrevZ0 = lowerData[z * m_LowerSizeX];\n\t\t\tint PrevZ1 = lowerData[(z + 1) * m_LowerSizeX];\n\n\t\t\tfor (int x = 0; x < m_LowerSizeX - 1; ++x)\n\t\t\t{\n\t\t\t\tint ValX1Z0 = lowerData[x + 1 + z * m_LowerSizeX];\n\t\t\t\tint ValX1Z1 = lowerData[x + 1 + (z + 1) * m_LowerSizeX];\n\t\t\t\tint RndX = (x + lowerMinX) * 2;\n\t\t\t\tint RndZ = (z + lowerMinZ) * 2;\n\t\t\t\tcache[idx] = PrevZ0;\n\t\t\t\tcache[idx + lowStepX] = Super::ChooseRandomOne(RndX, RndZ + 1, PrevZ0, PrevZ1);\n\t\t\t\tcache[idx + 1]        = Super::ChooseRandomOne(RndX, RndZ - 1, PrevZ0, ValX1Z0);\n\t\t\t\tcache[idx + 1 + lowStepX] = Super::ChooseRandomOne(RndX, RndZ, PrevZ0, ValX1Z0, PrevZ1, ValX1Z1);\n\t\t\t\tidx += 2;\n\t\t\t\tPrevZ0 = ValX1Z0;\n\t\t\t\tPrevZ1 = ValX1Z1;\n\t\t\t}\n\t\t}\n\n\t\t// Copy from Cache into a_Values; take into account the even / odd offsets in a_Min:\n\t\tfor (int z = 0; z < SizeZ; ++z)\n\t\t{\n\t\t\tmemcpy(a_Values + z * SizeX, cache + (z + (a_MinZ & 1)) * lowStepX + (a_MinX & 1), SizeX * sizeof(int));\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_UnderlyingGen;\n};\n\n\n\n\n\n/** Smoothes out some artifacts generated by the zooming - mostly single-pixel values.\nCompares each pixel to its neighbors and if the neighbors are equal, changes the pixel to their value. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenSmooth:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\n\tstatic const int m_LowerSizeX = SizeX + 2;\n\tstatic const int m_LowerSizeZ = SizeZ + 2;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<m_LowerSizeX, m_LowerSizeZ>>;\n\n\n\tcIntGenSmooth(int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tint lowerData[m_LowerSizeX * m_LowerSizeZ];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerData);\n\n\t\t// Smooth - for each square check if the surroundings are the same, if so, expand them diagonally.\n\t\t// Also get rid of single-pixel irregularities (A-B-A):\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint NoiseZ = a_MinZ + z;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint val   = lowerData[x + 1 + (z + 1) * m_LowerSizeX];\n\t\t\t\tint above = lowerData[x + 1 +  z      * m_LowerSizeX];\n\t\t\t\tint below = lowerData[x + 1 + (z + 2) * m_LowerSizeX];\n\t\t\t\tint left  = lowerData[x     + (z + 1) * m_LowerSizeX];\n\t\t\t\tint right = lowerData[x + 2 + (z + 1) * m_LowerSizeX];\n\n\t\t\t\tif ((left == right) && (above == below))\n\t\t\t\t{\n\t\t\t\t\tif (((Super::m_Noise.IntNoise2DInt(a_MinX + x, NoiseZ) / 7) % 2) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = left;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tval = above;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (left == right)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = left;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (above == below)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = above;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ta_Values[x + z * SizeX] = val;\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Converts land biomes at the edge of an ocean into the respective beach biome. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenBeaches:\n\tpublic cIntGen<SizeX, SizeZ>\n{\n\tusing Super = cIntGen<SizeX, SizeZ>;\n\n\tstatic const int m_UnderlyingSizeX = SizeX + 2;\n\tstatic const int m_UnderlyingSizeZ = SizeZ + 2;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<m_UnderlyingSizeX, m_UnderlyingSizeZ>>;\n\n\n\tcIntGenBeaches(Underlying a_Underlying):\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Map for biome -> its beach:\n\t\tstatic const int ToBeach[] =\n\t\t{\n\t\t\t/* biOcean            */ biOcean,\n\t\t\t/* biPlains           */ biBeach,\n\t\t\t/* biDesert           */ biBeach,\n\t\t\t/* biExtremeHills     */ biStoneBeach,\n\t\t\t/* biForest           */ biBeach,\n\t\t\t/* biTaiga            */ biColdBeach,\n\t\t\t/* biSwampland        */ biSwampland,\n\t\t\t/* biRiver            */ biRiver,\n\t\t\t/* biNether           */ biNether,\n\t\t\t/* biEnd              */ biEnd,\n\t\t\t/* biFrozenOcean      */ biColdBeach,\n\t\t\t/* biFrozenRiver      */ biColdBeach,\n\t\t\t/* biIcePlains        */ biColdBeach,\n\t\t\t/* biIceMountains     */ biColdBeach,\n\t\t\t/* biMushroomIsland   */ biMushroomShore,\n\t\t\t/* biMushroomShore    */ biMushroomShore,\n\t\t\t/* biBeach            */ biBeach,\n\t\t\t/* biDesertHills      */ biBeach,\n\t\t\t/* biForestHills      */ biBeach,\n\t\t\t/* biTaigaHills       */ biColdBeach,\n\t\t\t/* biExtremeHillsEdge */ biStoneBeach,\n\t\t\t/* biJungle           */ biBeach,\n\t\t\t/* biJungleHills      */ biBeach,\n\t\t\t/* biJungleEdge       */ biBeach,\n\t\t\t/* biDeepOcean        */ biOcean,\n\t\t\t/* biStoneBeach       */ biStoneBeach,\n\t\t\t/* biColdBeach        */ biColdBeach,\n\t\t\t/* biBirchForest      */ biBeach,\n\t\t\t/* biBirchForestHills */ biBeach,\n\t\t\t/* biRoofedForest     */ biBeach,\n\t\t\t/* biColdTaiga        */ biColdBeach,\n\t\t\t/* biColdTaigaHills   */ biColdBeach,\n\t\t\t/* biMegaTaiga        */ biStoneBeach,\n\t\t\t/* biMegaTaigaHills   */ biStoneBeach,\n\t\t\t/* biExtremeHillsPlus */ biStoneBeach,\n\t\t\t/* biSavanna          */ biBeach,\n\t\t\t/* biSavannaPlateau   */ biBeach,\n\t\t\t/* biMesa             */ biMesa,\n\t\t\t/* biMesaPlateauF     */ biMesa,\n\t\t\t/* biMesaPlateau      */ biMesa,\n\t\t};\n\n\t\t// Generate the underlying values:\n\t\tint lowerValues[m_UnderlyingSizeX * m_UnderlyingSizeZ];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerValues);\n\n\t\t// Add beaches between ocean and biomes:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint val   = lowerValues[x + 1 + (z + 1) * m_UnderlyingSizeX];\n\t\t\t\tint above = lowerValues[x + 1 + z       * m_UnderlyingSizeX];\n\t\t\t\tint below = lowerValues[x + 1 + (z + 2) * m_UnderlyingSizeX];\n\t\t\t\tint left  = lowerValues[x     + (z + 1) * m_UnderlyingSizeX];\n\t\t\t\tint right = lowerValues[x + 2 + (z + 1) * m_UnderlyingSizeX];\n\t\t\t\tif (!IsBiomeOcean(val))\n\t\t\t\t{\n\t\t\t\t\tif (IsBiomeOcean(above) || IsBiomeOcean(below) || IsBiomeOcean(left) || IsBiomeOcean(right))\n\t\t\t\t\t{\n\t\t\t\t\t\t// First convert the value to a regular biome (drop the M flag), then modulo by our biome count:\n\t\t\t\t\t\tval = ToBeach[static_cast<size_t>((val % 128)) % ARRAYCOUNT(ToBeach)];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ta_Values[x + z * SizeX] = val;\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Generates the underlying numbers and then randomly changes some ocean group pixels into random land\nbiome group pixels, based on the predefined chance. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenAddIslands:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<SizeX, SizeZ>>;\n\n\n\tcIntGenAddIslands(int a_Seed, int a_Chance, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Chance(a_Chance),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_Values);\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tif (a_Values[x + z * SizeX] == bgOcean)\n\t\t\t\t{\n\t\t\t\t\tint rnd = Super::m_Noise.IntNoise2DInt(a_MinX + x, a_MinZ + z) / 7;\n\t\t\t\t\tif (rnd % 1000 < m_Chance)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Values[x + z * SizeX] = (rnd / 1003) % bgLandOceanMax;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\t/** Chance, in permille, of an island being generated in ocean. */\n\tint m_Chance;\n\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** A filter that adds an edge biome group between two biome groups that need an edge between them. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenBiomeGroupEdges:\n\tpublic cIntGen<SizeX, SizeZ>\n{\n\tusing Super = cIntGen<SizeX, SizeZ>;\n\n\tstatic const int m_UnderlyingSizeX = SizeX + 2;\n\tstatic const int m_UnderlyingSizeZ = SizeZ + 2;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<m_UnderlyingSizeX, m_UnderlyingSizeZ>>;\n\n\n\tcIntGenBiomeGroupEdges(Underlying a_Underlying):\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying biome groups:\n\t\tint lowerValues[m_UnderlyingSizeX * m_UnderlyingSizeZ];\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, lowerValues);\n\n\t\t// Change the biomes on incompatible edges into an edge biome:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint val   = lowerValues[x + 1 + (z + 1) * m_UnderlyingSizeX];\n\t\t\t\tint above = lowerValues[x + 1 + z       * m_UnderlyingSizeX];\n\t\t\t\tint below = lowerValues[x + 1 + (z + 2) * m_UnderlyingSizeX];\n\t\t\t\tint left  = lowerValues[x     + (z + 1) * m_UnderlyingSizeX];\n\t\t\t\tint right = lowerValues[x + 2 + (z + 1) * m_UnderlyingSizeX];\n\t\t\t\tswitch (val)\n\t\t\t\t{\n\t\t\t\t\t// Desert should neighbor only oceans, desert and temperates; change to temperate when another:\n\t\t\t\t\tcase bgDesert:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isDesertCompatible(above) ||\n\t\t\t\t\t\t\t!isDesertCompatible(below) ||\n\t\t\t\t\t\t\t!isDesertCompatible(left) ||\n\t\t\t\t\t\t\t!isDesertCompatible(right)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = bgTemperate;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // case bgDesert\n\n\t\t\t\t\t// Ice should not neighbor deserts; change to temperate:\n\t\t\t\t\tcase bgIce:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(above == bgDesert) ||\n\t\t\t\t\t\t\t(below == bgDesert) ||\n\t\t\t\t\t\t\t(left  == bgDesert) ||\n\t\t\t\t\t\t\t(right == bgDesert)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = bgTemperate;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // case bgIce\n\t\t\t\t}\n\t\t\t\ta_Values[x + z * SizeX] = val;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n\n\n\tinline bool isDesertCompatible(int a_BiomeGroup)\n\t{\n\t\tswitch (a_BiomeGroup)\n\t\t{\n\t\t\tcase bgOcean:\n\t\t\tcase bgDesert:\n\t\t\tcase bgTemperate:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\n\n/** Turns biome group indices into real biomes.\nFor each pixel, takes its biome group and chooses a random biome from that group; replaces the value with\nthat biome. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenBiomes:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<SizeX, SizeZ>>;\n\n\n\tcIntGenBiomes(int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Define the per-biome-group biomes:\n\t\tstatic const int oceanBiomes[] =\n\t\t{\n\t\t\tbiOcean,  // biDeepOcean,\n\t\t};\n\n\t\t// Same as oceanBiomes, there are no rare oceanic biomes (mushroom islands are handled separately)\n\t\tstatic const int rareOceanBiomes[] =\n\t\t{\n\t\t\tbiOcean,\n\t\t};\n\n\t\tstatic const int desertBiomes[] =\n\t\t{\n\t\t\tbiDesert, biDesert, biDesert, biDesert, biDesert, biDesert, biSavanna, biSavanna, biPlains,\n\t\t};\n\n\t\tstatic const int rareDesertBiomes[] =\n\t\t{\n\t\t\tbiMesaPlateau, biMesaPlateauF,\n\t\t};\n\n\t\tstatic const int temperateBiomes[] =\n\t\t{\n\t\t\tbiForest, biForest, biRoofedForest, biExtremeHills, biPlains, biBirchForest, biSwampland,\n\t\t};\n\n\t\tstatic const int rareTemperateBiomes[] =\n\t\t{\n\t\t\tbiJungle,  // Jungle is not strictly temperate, but let's piggyback it here\n\t\t};\n\n\t\tstatic const int mountainBiomes[] =\n\t\t{\n\t\t\tbiExtremeHills, biForest, biTaiga, biPlains,\n\t\t};\n\n\t\tstatic const int rareMountainBiomes[] =\n\t\t{\n\t\t\tbiMegaTaiga,\n\t\t};\n\n\t\tstatic const int iceBiomes[] =\n\t\t{\n\t\t\tbiIcePlains, biIcePlains, biIcePlains, biIcePlains, biColdTaiga,\n\t\t};\n\n\t\t// Same as iceBiomes, there's no rare ice biome\n\t\tstatic const int rareIceBiomes[] =\n\t\t{\n\t\t\tbiIcePlains, biIcePlains, biIcePlains, biIcePlains, biColdTaiga,\n\t\t};\n\n\t\tstatic const cBiomesInGroups biomesInGroups[] =\n\t\t{\n\t\t\t/* bgOcean */     { static_cast<int>(ARRAYCOUNT(oceanBiomes)),     oceanBiomes},\n\t\t\t/* bgDesert */    { static_cast<int>(ARRAYCOUNT(desertBiomes)),    desertBiomes},\n\t\t\t/* bgTemperate */ { static_cast<int>(ARRAYCOUNT(temperateBiomes)), temperateBiomes},\n\t\t\t/* bgMountains */ { static_cast<int>(ARRAYCOUNT(mountainBiomes)),  mountainBiomes},\n\t\t\t/* bgIce */       { static_cast<int>(ARRAYCOUNT(iceBiomes)),       iceBiomes},\n\t\t};\n\n\t\tstatic const cBiomesInGroups rareBiomesInGroups[] =\n\t\t{\n\t\t\t/* bgOcean */     { static_cast<int>(ARRAYCOUNT(rareOceanBiomes)),     rareOceanBiomes},\n\t\t\t/* bgDesert */    { static_cast<int>(ARRAYCOUNT(rareDesertBiomes)),    rareDesertBiomes},\n\t\t\t/* bgTemperate */ { static_cast<int>(ARRAYCOUNT(rareTemperateBiomes)), rareTemperateBiomes},\n\t\t\t/* bgMountains */ { static_cast<int>(ARRAYCOUNT(rareMountainBiomes)),  rareMountainBiomes},\n\t\t\t/* bgIce */       { static_cast<int>(ARRAYCOUNT(rareIceBiomes)),       rareIceBiomes},\n\t\t};\n\n\t\t// Generate the underlying values, representing biome groups:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_Values);\n\n\t\t// Overwrite each biome group with a random biome from that group:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint IdxZ = z * SizeX;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tsize_t val = static_cast<size_t>(a_Values[x + IdxZ]);\n\t\t\t\tconst cBiomesInGroups & Biomes = (val > bgfRare) ?\n\t\t\t\t\trareBiomesInGroups[(val & (bgfRare - 1)) % ARRAYCOUNT(rareBiomesInGroups)] :\n\t\t\t\t\tbiomesInGroups[val % ARRAYCOUNT(biomesInGroups)];\n\t\t\t\tint rnd = (Super::m_Noise.IntNoise2DInt(x + a_MinX, z + a_MinZ) / 7);\n\t\t\t\ta_Values[x + IdxZ] = Biomes.Biomes[rnd % Biomes.Count];\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\n\tstruct cBiomesInGroups\n\t{\n\t\tconst int Count;\n\t\tconst int * Biomes;\n\t};\n\n\n\t/** The underlying int generator */\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Randomly replaces pixels of one value to another value, using the given chance. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenReplaceRandomly:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<SizeX, SizeZ>>;\n\n\n\tcIntGenReplaceRandomly(int a_From, int a_To, int a_Chance, int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_From(a_From),\n\t\tm_To(a_To),\n\t\tm_Chance(a_Chance),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_Values);\n\n\t\t// Replace some of the values:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint idxZ = z * SizeX;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint idx = x + idxZ;\n\t\t\t\tif (a_Values[idx] == m_From)\n\t\t\t\t{\n\t\t\t\t\tint rnd = Super::m_Noise.IntNoise2DInt(x + a_MinX, z + a_MinZ) / 7;\n\t\t\t\t\tif (rnd % 1000 < m_Chance)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Values[idx] = m_To;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for z\n\t}\n\n\nprotected:\n\t/** The original value to be replaced. */\n\tint m_From;\n\n\t/** The destination value to which to replace. */\n\tint m_To;\n\n\t/** Chance, in permille, of replacing the value. */\n\tint m_Chance;\n\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Mixer that joins together finalized biomes and rivers.\nIt first checks for oceans, if there is an ocean in the Biomes, it keeps the ocean.\nIf there's no ocean, it checks Rivers for a river, if there is a river, it uses the Biomes to select either\nregular river or frozen river, based on the biome. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenMixRivers:\n\tpublic cIntGen<SizeX, SizeZ>\n{\n\tusing Super = cIntGen<SizeX, SizeZ>;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<SizeX, SizeZ>>;\n\n\n\tcIntGenMixRivers(Underlying a_Biomes, Underlying a_Rivers):\n\t\tm_Biomes(a_Biomes),\n\t\tm_Rivers(a_Rivers)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tm_Biomes->GetInts(a_MinX, a_MinZ, a_Values);\n\t\ttypename Super::Values riverData;\n\t\tm_Rivers->GetInts(a_MinX, a_MinZ, riverData);\n\n\t\t// Mix the values:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tint idxZ = z * SizeX;\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint idx = x + idxZ;\n\t\t\t\tif (IsBiomeOcean(a_Values[idx]))\n\t\t\t\t{\n\t\t\t\t\t// Oceans are kept without any changes\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (riverData[idx] != biRiver)\n\t\t\t\t{\n\t\t\t\t\t// There's no river, keep the current value\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// There's a river, change the output to a river or a frozen river, based on the original biome:\n\t\t\t\tif (IsBiomeVeryCold(static_cast<EMCSBiome>(a_Values[idx])))\n\t\t\t\t{\n\t\t\t\t\ta_Values[idx] = biFrozenRiver;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta_Values[idx] = biRiver;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\tUnderlying m_Biomes;\n\tUnderlying m_Rivers;\n};\n\n\n\n\n\n/** Generates a river based on the underlying data.\nThis is basically an edge detector over the underlying data. The rivers are the edges where the underlying data\nchanges from one pixel to its neighbor. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenRiver:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\n\tstatic const int UnderlyingSizeX = SizeX + 2;\n\tstatic const int UnderlyingSizeZ = SizeZ + 2;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<UnderlyingSizeX, UnderlyingSizeZ>>;\n\n\n\tcIntGenRiver(int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tint Cache[UnderlyingSizeX * UnderlyingSizeZ];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, Cache);\n\n\t\t// Detect the edges:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint Above = Cache[x + 1 + z * UnderlyingSizeX];\n\t\t\t\tint Below = Cache[x + 1 + (z + 2) * UnderlyingSizeX];\n\t\t\t\tint Left  = Cache[x +     (z + 1) * UnderlyingSizeX];\n\t\t\t\tint Right = Cache[x + 2 + (z + 1) * UnderlyingSizeX];\n\t\t\t\tint val   = Cache[x + 1 + (z + 1) * UnderlyingSizeX];\n\n\t\t\t\tif ((val == Above) && (val == Below) && (val == Left) && (val == Right))\n\t\t\t\t{\n\t\t\t\t\tval = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tval = biRiver;\n\t\t\t\t}\n\t\t\t\ta_Values[x + z * SizeX] = val;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Turns some of the oceans into the specified biome. Used for mushroom and deep ocean.\nThe biome is only placed if at least 3 of its neighbors are ocean and only with the specified chance. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenAddToOcean:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\n\tstatic const int UnderlyingSizeX = SizeX + 2;\n\tstatic const int UnderlyingSizeZ = SizeZ + 2;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<UnderlyingSizeX, UnderlyingSizeZ>>;\n\n\n\tcIntGenAddToOcean(int a_Seed, int a_Chance, int a_ToValue, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Chance(a_Chance),\n\t\tm_ToValue(a_ToValue),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tint Cache[UnderlyingSizeX * UnderlyingSizeZ];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, Cache);\n\n\t\t// Add the mushroom islands:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint val = Cache[x + 1 + (z + 1) * UnderlyingSizeX];\n\t\t\t\tif (!IsBiomeOcean(val))\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + z * SizeX] = val;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Count the ocean neighbors:\n\t\t\t\tint Above = Cache[x + 1 + z * UnderlyingSizeX];\n\t\t\t\tint Below = Cache[x + 1 + (z + 2) * UnderlyingSizeX];\n\t\t\t\tint Left  = Cache[x +     (z + 1) * UnderlyingSizeX];\n\t\t\t\tint Right = Cache[x + 2 + (z + 1) * UnderlyingSizeX];\n\t\t\t\tint NumOceanNeighbors = 0;\n\t\t\t\tif (IsBiomeOcean(Above))\n\t\t\t\t{\n\t\t\t\t\tNumOceanNeighbors += 1;\n\t\t\t\t}\n\t\t\t\tif (IsBiomeOcean(Below))\n\t\t\t\t{\n\t\t\t\t\tNumOceanNeighbors += 1;\n\t\t\t\t}\n\t\t\t\tif (IsBiomeOcean(Left))\n\t\t\t\t{\n\t\t\t\t\tNumOceanNeighbors += 1;\n\t\t\t\t}\n\t\t\t\tif (IsBiomeOcean(Right))\n\t\t\t\t{\n\t\t\t\t\tNumOceanNeighbors += 1;\n\t\t\t\t}\n\n\t\t\t\t// If at least 3 ocean neighbors and the chance is right, change:\n\t\t\t\tif (\n\t\t\t\t\t(NumOceanNeighbors >= 3) &&\n\t\t\t\t\t((Super::m_Noise.IntNoise2DInt(x + a_MinX, z + a_MinZ) / 7) % 1000 < m_Chance)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + z * SizeX] = m_ToValue;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + z * SizeX] = val;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\t/** Chance, in permille, of changing the biome. */\n\tint m_Chance;\n\n\t/** The value to change the ocean into. */\n\tint m_ToValue;\n\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Changes random pixels of the underlying data to the specified value. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenSetRandomly:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<SizeX, SizeZ>>;\n\n\n\tcIntGenSetRandomly(int a_Seed, int a_Chance, int a_ToValue, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Chance(a_Chance),\n\t\tm_ToValue(a_ToValue),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_Values);\n\n\t\t// Change random pixels to bgOcean:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint rnd = Super::m_Noise.IntNoise2DInt(x + a_MinX, z + a_MinZ) / 7;\n\t\t\t\tif (rnd % 1000 < m_Chance)\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + z * SizeX] = m_ToValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\t/** Chance, in permille, of changing each pixel. */\n\tint m_Chance;\n\n\t/** The value to which to set the pixel. */\n\tint m_ToValue;\n\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Adds a \"rare\" flag to random biome groups, based on the given chance. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenRareBiomeGroups:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<SizeX, SizeZ>>;\n\n\n\tcIntGenRareBiomeGroups(int a_Seed, int a_Chance, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Chance(a_Chance),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_Values);\n\n\t\t// Change some of the biome groups into rare biome groups:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint rnd = Super::m_Noise.IntNoise2DInt(x + a_MinX, z + a_MinZ) / 7;\n\t\t\t\tif (rnd % 1000 < m_Chance)\n\t\t\t\t{\n\t\t\t\t\tint idx = x + SizeX * z;\n\t\t\t\t\ta_Values[idx] = a_Values[idx] | bgfRare;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\t/** Chance, in permille, of changing each pixel into the rare biome group. */\n\tint m_Chance;\n\n\t/** The underlying generator. */\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Changes biomes in the parent data into an alternate versions (usually \"hill\" variants), in such places\nthat have their alterations set. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenAlternateBiomes:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<SizeX, SizeZ>>;\n\n\n\tcIntGenAlternateBiomes(int a_Seed, Underlying a_Alterations, Underlying a_BaseBiomes):\n\t\tSuper(a_Seed),\n\t\tm_Alterations(a_Alterations),\n\t\tm_BaseBiomes(a_BaseBiomes)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the base biomes and the alterations:\n\t\tm_BaseBiomes->GetInts(a_MinX, a_MinZ, a_Values);\n\t\ttypename Super::Values alterations;\n\t\tm_Alterations->GetInts(a_MinX, a_MinZ, alterations);\n\n\t\t// Change the biomes into their alternate versions:\n\t\tfor (int idx = 0; idx < SizeX * SizeZ; ++idx)\n\t\t{\n\t\t\tif (alterations[idx] == 0)\n\t\t\t{\n\t\t\t\t// No change\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Change to alternate biomes:\n\t\t\tint val = a_Values[idx];\n\t\t\tswitch (val)\n\t\t\t{\n\t\t\t\tcase biBirchForest:   val = biBirchForestHills; break;\n\t\t\t\tcase biDesert:        val = biDesertHills;      break;\n\t\t\t\tcase biExtremeHills:  val = biExtremeHillsPlus; break;\n\t\t\t\tcase biForest:        val = biForestHills;      break;\n\t\t\t\tcase biIcePlains:     val = biIceMountains;     break;\n\t\t\t\tcase biJungle:        val = biJungleHills;      break;\n\t\t\t\tcase biMegaTaiga:     val = biMegaTaigaHills;   break;\n\t\t\t\tcase biMesaPlateau:   val = biMesa;             break;\n\t\t\t\tcase biMesaPlateauF:  val = biMesa;             break;\n\t\t\t\tcase biMesaPlateauM:  val = biMesa;             break;\n\t\t\t\tcase biMesaPlateauFM: val = biMesa;             break;\n\t\t\t\tcase biPlains:        val = biForest;           break;\n\t\t\t\tcase biRoofedForest:  val = biPlains;           break;\n\t\t\t\tcase biSavanna:       val = biSavannaPlateau;   break;\n\t\t\t\tcase biTaiga:         val = biTaigaHills;       break;\n\t\t\t}\n\t\t\ta_Values[idx] = val;\n\t\t}  // for idx - a_Values[]\n\t}\n\nprotected:\n\tUnderlying m_Alterations;\n\tUnderlying m_BaseBiomes;\n};\n\n\n\n\n\n/** Adds an edge between two specifically incompatible biomes, such as mesa and forest. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenBiomeEdges:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\n\tstatic const int m_LowerSizeX = SizeX + 2;\n\tstatic const int m_LowerSizeZ = SizeZ + 2;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<m_LowerSizeX, m_LowerSizeZ>>;\n\n\n\tcIntGenBiomeEdges(int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(a_Underlying)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying biomes:\n\t\ttypename Underlying::element_type::Values lowerValues;\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerValues);\n\n\t\t// Convert incompatible edges into neutral biomes:\n\t\tfor (int z = 0; z < SizeZ; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < SizeX; x++)\n\t\t\t{\n\t\t\t\tint biome = lowerValues[x + 1 + (z + 1) * m_LowerSizeX];\n\t\t\t\tint above = lowerValues[x + 1 + z *       m_LowerSizeX];\n\t\t\t\tint below = lowerValues[x + 1 + (z + 2) * m_LowerSizeX];\n\t\t\t\tint left  = lowerValues[x +     (z + 1) * m_LowerSizeX];\n\t\t\t\tint right = lowerValues[x + 2 + (z + 1) * m_LowerSizeX];\n\n\t\t\t\tswitch (biome)\n\t\t\t\t{\n\t\t\t\t\tcase biDesert:\n\t\t\t\t\tcase biDesertM:\n\t\t\t\t\tcase biDesertHills:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tIsBiomeVeryCold(static_cast<EMCSBiome>(above)) ||\n\t\t\t\t\t\t\tIsBiomeVeryCold(static_cast<EMCSBiome>(below)) ||\n\t\t\t\t\t\t\tIsBiomeVeryCold(static_cast<EMCSBiome>(left))  ||\n\t\t\t\t\t\t\tIsBiomeVeryCold(static_cast<EMCSBiome>(right))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbiome = biPlains;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // case biDesert\n\n\t\t\t\t\tcase biMesaPlateau:\n\t\t\t\t\tcase biMesaPlateauF:\n\t\t\t\t\tcase biMesaPlateauFM:\n\t\t\t\t\tcase biMesaPlateauM:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isMesaCompatible(above) ||\n\t\t\t\t\t\t\t!isMesaCompatible(below) ||\n\t\t\t\t\t\t\t!isMesaCompatible(left)  ||\n\t\t\t\t\t\t\t!isMesaCompatible(right)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbiome = biDesert;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // Mesa biomes\n\n\t\t\t\t\tcase biJungle:\n\t\t\t\t\tcase biJungleM:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isJungleCompatible(above) ||\n\t\t\t\t\t\t\t!isJungleCompatible(below) ||\n\t\t\t\t\t\t\t!isJungleCompatible(left)  ||\n\t\t\t\t\t\t\t!isJungleCompatible(right)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbiome = (biome == biJungle) ? biJungleEdge : biJungleEdgeM;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // Jungle biomes\n\n\t\t\t\t\tcase biSwampland:\n\t\t\t\t\tcase biSwamplandM:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tIsBiomeNoDownfall(static_cast<EMCSBiome>(above)) ||\n\t\t\t\t\t\t\tIsBiomeNoDownfall(static_cast<EMCSBiome>(below)) ||\n\t\t\t\t\t\t\tIsBiomeNoDownfall(static_cast<EMCSBiome>(left))  ||\n\t\t\t\t\t\t\tIsBiomeNoDownfall(static_cast<EMCSBiome>(right))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbiome = biPlains;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // Swampland biomes\n\t\t\t\t}  // switch (biome)\n\n\t\t\t\ta_Values[x + z * SizeX] = biome;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\n\nprotected:\n\tUnderlying m_Underlying;\n\n\n\tbool isMesaCompatible(int a_Biome)\n\t{\n\t\tswitch (a_Biome)\n\t\t{\n\t\t\tcase biDesert:\n\t\t\tcase biMesa:\n\t\t\tcase biMesaBryce:\n\t\t\tcase biMesaPlateau:\n\t\t\tcase biMesaPlateauF:\n\t\t\tcase biMesaPlateauFM:\n\t\t\tcase biMesaPlateauM:\n\t\t\tcase biOcean:\n\t\t\tcase biDeepOcean:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tbool isJungleCompatible(int a_Biome)\n\t{\n\t\tswitch (a_Biome)\n\t\t{\n\t\t\tcase biJungle:\n\t\t\tcase biJungleM:\n\t\t\tcase biJungleEdge:\n\t\t\tcase biJungleEdgeM:\n\t\t\tcase biJungleHills:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\n\n/** Changes biomes in the parent data into their alternate versions (\"M\" variants), in such places that\nhave their alterations set. */\ntemplate <int SizeX, int SizeZ = SizeX>\nclass cIntGenMBiomes:\n\tpublic cIntGenWithNoise<SizeX, SizeZ>\n{\n\tusing Super = cIntGenWithNoise<SizeX, SizeZ>;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cIntGen<SizeX, SizeZ>>;\n\n\n\tcIntGenMBiomes(int a_Seed, Underlying a_Alteration, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(a_Underlying),\n\t\tm_Alteration(a_Alteration)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, typename Super::Values & a_Values) override\n\t{\n\t\t// Generate the underlying biomes and the alterations:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_Values);\n\t\ttypename Super::Values alterations;\n\t\tm_Alteration->GetInts(a_MinX, a_MinZ, alterations);\n\n\t\t// Wherever alterations are nonzero, change into alternate biome, if available:\n\t\tfor (int idx = 0; idx < SizeX * SizeZ; ++idx)\n\t\t{\n\t\t\tif (alterations[idx] == 0)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Ice spikes biome was removed from here, because it was generated way too often\n\t\t\tswitch (a_Values[idx])\n\t\t\t{\n\t\t\t\tcase biPlains:               a_Values[idx] = biSunflowerPlains;      break;\n\t\t\t\tcase biDesert:               a_Values[idx] = biDesertM;              break;\n\t\t\t\tcase biExtremeHills:         a_Values[idx] = biExtremeHillsM;        break;\n\t\t\t\tcase biForest:               a_Values[idx] = biFlowerForest;         break;\n\t\t\t\tcase biTaiga:                a_Values[idx] = biTaigaM;               break;\n\t\t\t\tcase biSwampland:            a_Values[idx] = biSwamplandM;           break;\n\t\t\t\tcase biJungle:               a_Values[idx] = biJungleM;              break;\n\t\t\t\tcase biJungleEdge:           a_Values[idx] = biJungleEdgeM;          break;\n\t\t\t\tcase biBirchForest:          a_Values[idx] = biBirchForestM;         break;\n\t\t\t\tcase biBirchForestHills:     a_Values[idx] = biBirchForestHillsM;    break;\n\t\t\t\tcase biRoofedForest:         a_Values[idx] = biRoofedForestM;        break;\n\t\t\t\tcase biColdTaiga:            a_Values[idx] = biColdTaigaM;           break;\n\t\t\t\tcase biMegaSpruceTaiga:      a_Values[idx] = biMegaSpruceTaiga;      break;\n\t\t\t\tcase biMegaSpruceTaigaHills: a_Values[idx] = biMegaSpruceTaigaHills; break;\n\t\t\t\tcase biExtremeHillsPlus:     a_Values[idx] = biExtremeHillsPlusM;    break;\n\t\t\t\tcase biSavanna:              a_Values[idx] = biSavannaM;             break;\n\t\t\t\tcase biSavannaPlateau:       a_Values[idx] = biSavannaPlateauM;      break;\n\t\t\t\tcase biMesa:                 a_Values[idx] = biMesaBryce;            break;\n\t\t\t\tcase biMesaPlateauF:         a_Values[idx] = biMesaPlateauFM;        break;\n\t\t\t\tcase biMesaPlateau:          a_Values[idx] = biMesaBryce;            break;\n\t\t\t}\n\t\t}  // for idx - a_Values[] / alterations[]\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n\tUnderlying m_Alteration;\n};\n"
  },
  {
    "path": "src/Generating/MineShafts.cpp",
    "content": "\n// MineShafts.cpp\n\n// Implements the cStructGenMineShafts class representing the structure generator for abandoned mineshafts\n\n/*\nAlgorithm:\nThe cStructGenMineShafts::cMineShaftSystem class is the main controller, which knows what mineshaft\nclasses there are and their random weights. It gets asked to produce a new class everytime a connection is to be made.\nThe cMineShaft class is a base class for each mineshaft structure.\nEach cMineShaft descendant knows how large it is, how to imprint itself into the chunk data and where to connect to\nother descendants. Its PivotPoint is always a walkable column. Its Direction determines in which direction the structure\nis facing.\n\nThe generation starts with the central dirt room, from there corridors, crossings and staircases are added\nin a depth-first processing. Each of the descendants will branch randomly, if not beyond the allowed recursion level\n*/\n\n#include \"Globals.h\"\n#include \"MineShafts.h\"\n#include \"../Cuboid.h\"\n#include \"../BlockEntities/ChestEntity.h\"\n#include \"../BlockEntities/MobSpawnerEntity.h\"\n\n\n\n\n\nclass cMineShaft\n{\npublic:\n\tenum eKind\n\t{\n\t\tmskDirtRoom,\n\t\tmskCorridor,\n\t\tmskCrossing,\n\t\tmskStaircase,\n\t} ;\n\n\n\tenum eDirection\n\t{\n\t\tdirXP,\n\t\tdirZP,\n\t\tdirXM,\n\t\tdirZM,\n\t} ;\n\n\n\tcStructGenMineShafts::cMineShaftSystem & m_ParentSystem;\n\teKind   m_Kind;\n\tcCuboid m_BoundingBox;\n\n\n\tcMineShaft(cStructGenMineShafts::cMineShaftSystem & a_ParentSystem, eKind a_Kind) :\n\t\tm_ParentSystem(a_ParentSystem),\n\t\tm_Kind(a_Kind)\n\t{\n\t}\n\n\tcMineShaft(cStructGenMineShafts::cMineShaftSystem & a_ParentSystem, eKind a_Kind, const cCuboid & a_BoundingBox) :\n\t\tm_ParentSystem(a_ParentSystem),\n\t\tm_Kind(a_Kind),\n\t\tm_BoundingBox(a_BoundingBox)\n\t{\n\t}\n\n\tvirtual ~cMineShaft() {}\n\n\t/** Returns true if this mineshaft intersects the specified cuboid */\n\tbool DoesIntersect(const cCuboid & a_Other)\n\t{\n\t\treturn m_BoundingBox.DoesIntersect(a_Other);\n\t}\n\n\t/** If recursion level is not too large, appends more branches to the parent system,\n\tusing exit points specific to this class. */\n\tvirtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) = 0;\n\n\t/** Imprints this shape into the specified chunk's data */\n\tvirtual void ProcessChunk(cChunkDesc & a_ChunkDesc) = 0;\n} ;\n\nusing cMineShafts = std::vector<cMineShaft *>;\n\n\n\n\n\nclass cMineShaftDirtRoom:\n\tpublic cMineShaft\n{\n\tusing Super = cMineShaft;\n\npublic:\n\n\tcMineShaftDirtRoom(cStructGenMineShafts::cMineShaftSystem & a_Parent, cNoise & a_Noise);\n\n\t// cMineShaft overrides:\n\tvirtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) override;\n\tvirtual void ProcessChunk(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cMineShaftCorridor:\n\tpublic cMineShaft\n{\n\tusing Super = cMineShaft;\n\npublic:\n\n\t/** Creates a new Corridor attached to the specified pivot point and direction.\n\tChecks all ParentSystem's objects and disallows intersecting. Initializes the new object to fit.\n\tMay return nullptr if cannot fit. */\n\tstatic cMineShaft * CreateAndFit(\n\t\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\t\tint a_PivotX, int a_PivotY, int a_PivotZ, eDirection a_Direction,\n\t\tcNoise & a_Noise\n\t);\n\nprotected:\n\tstatic const int MAX_SEGMENTS = 5;\n\n\tint        m_NumSegments;\n\teDirection m_Direction;\n\tbool       m_HasFullBeam[MAX_SEGMENTS];  ///< If true, segment at that index has a full beam support (planks in the top center block)\n\tint        m_ChestPosition;              ///< If <0, no chest; otherwise an offset from m_BoundingBox's p1.x or p1.z, depenging on m_Direction\n\tint        m_SpawnerPosition;            ///< If <0, no spawner; otherwise an offset from m_BoundingBox's p1.x or p1.z, depenging on m_Direction\n\tbool       m_HasTracks;                  ///< If true, random tracks will be placed on the floor\n\n\tcMineShaftCorridor(\n\t\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\t\tconst cCuboid & a_BoundingBox, int a_NumSegments, eDirection a_Direction,\n\t\tcNoise & a_Noise\n\t);\n\n\t// cMineShaft overrides:\n\tvirtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) override;\n\tvirtual void ProcessChunk(cChunkDesc & a_ChunkDesc) override;\n\n\t/** Places a chest, if the corridor has one */\n\tvoid PlaceChest(cChunkDesc & a_ChunkDesc);\n\n\t/** If this corridor has tracks, places them randomly */\n\tvoid PlaceTracks(cChunkDesc & a_ChunkDesc);\n\n\t/** If this corridor has a spawner, places the spawner */\n\tvoid PlaceSpawner(cChunkDesc & a_ChunkDesc);\n\n\t/** Randomly places torches around the central beam block */\n\tvoid PlaceTorches(cChunkDesc & a_ChunkDesc);\n} ;\n\n\n\n\n\nclass cMineShaftCrossing:\n\tpublic cMineShaft\n{\n\tusing Super = cMineShaft;\n\npublic:\n\n\t/** Creates a new Crossing attached to the specified pivot point and direction.\n\tChecks all ParentSystem's objects and disallows intersecting. Initializes the new object to fit.\n\tMay return nullptr if cannot fit. */\n\tstatic cMineShaft * CreateAndFit(\n\t\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\t\tint a_PivotX, int a_PivotY, int a_PivotZ, eDirection a_Direction,\n\t\tcNoise & a_Noise\n\t);\n\nprotected:\n\tcMineShaftCrossing(cStructGenMineShafts::cMineShaftSystem & a_ParentSystem, const cCuboid & a_BoundingBox);\n\n\t// cMineShaft overrides:\n\tvirtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) override;\n\tvirtual void ProcessChunk(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cMineShaftStaircase:\n\tpublic cMineShaft\n{\n\tusing Super = cMineShaft;\n\npublic:\n\n\tenum eSlope\n\t{\n\t\tsUp,\n\t\tsDown,\n\t} ;\n\n\t/** Creates a new Staircase attached to the specified pivot point and direction.\n\tChecks all ParentSystem's objects and disallows intersecting. Initializes the new object to fit.\n\tMay return nullptr if cannot fit.\n\t*/\n\tstatic cMineShaft * CreateAndFit(\n\t\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\t\tint a_PivotX, int a_PivotY, int a_PivotZ, eDirection a_Direction,\n\t\tcNoise & a_Noise\n\t);\n\nprotected:\n\teDirection m_Direction;\n\teSlope     m_Slope;\n\n\n\tcMineShaftStaircase(\n\t\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\t\tconst cCuboid & a_BoundingBox,\n\t\teDirection a_Direction,\n\t\teSlope a_Slope\n\t);\n\n\t// cMineShaft overrides:\n\tvirtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) override;\n\tvirtual void ProcessChunk(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cStructGenMineShafts::cMineShaftSystem:\n\tpublic cGridStructGen::cStructure\n{\n\tusing Super = cGridStructGen::cStructure;\n\npublic:\n\n\tint         m_GridSize;            ///< Maximum offset of the dirtroom from grid center, * 2, in each direction\n\tint         m_MaxRecursion;        ///< Maximum recursion level (initialized from cStructGenMineShafts::m_MaxRecursion)\n\tint         m_ProbLevelCorridor;   ///< Probability level of a branch object being the corridor\n\tint         m_ProbLevelCrossing;   ///< Probability level of a branch object being the crossing, minus Corridor\n\tint         m_ProbLevelStaircase;  ///< Probability level of a branch object being the staircase, minus Crossing\n\tint         m_ChanceChest;         ///< Chance [0 .. 250] that a corridor has a chest in it\n\tint         m_ChanceSpawner;       ///< Chance [0 .. 250] that a corridor has a spawner in it\n\tint         m_ChanceTorch;         ///< Chance [0 .. 10k] for a torch appearing attached to a corridor's beam\n\tcMineShafts m_MineShafts;          ///< List of cMineShaft descendants that comprise this system\n\tcCuboid     m_BoundingBox;         ///< Bounding box into which all of the components need to fit\n\n\n\t/** Creates and generates the entire system */\n\tcMineShaftSystem(\n\t\tint a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ,\n\t\tint a_GridSize, int a_MaxSystemSize, cNoise & a_Noise,\n\t\tint a_ProbLevelCorridor, int a_ProbLevelCrossing, int a_ProbLevelStaircase\n\t);\n\n\tvirtual ~cMineShaftSystem() override;\n\n\t/** Creates new cMineShaft descendant connected at the specified point, heading the specified direction,\n\tif it fits, appends it to the list and calls its AppendBranches()\n\t*/\n\tvoid AppendBranch(\n\t\tint a_BlockX, int a_BlockY, int a_BlockZ,\n\t\tcMineShaft::eDirection a_Direction, cNoise & a_Noise,\n\t\tint a_RecursionLevel\n\t);\n\n\t/** Returns true if none of the objects in m_MineShafts intersect with the specified bounding box and the bounding box is valid */\n\tbool CanAppend(const cCuboid & a_BoundingBox);\n\n\t// cGridStructGen::cStructure overrides:\n\tvirtual void DrawIntoChunk(cChunkDesc & a_Chunk) override;\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenMineShafts::cMineShaftSystem:\n\ncStructGenMineShafts::cMineShaftSystem::cMineShaftSystem(\n\tint a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ,\n\tint a_GridSize, int a_MaxSystemSize, cNoise & a_Noise,\n\tint a_ProbLevelCorridor, int a_ProbLevelCrossing, int a_ProbLevelStaircase\n) :\n\tSuper(a_GridX, a_GridZ, a_OriginX, a_OriginZ),\n\tm_GridSize(a_GridSize),\n\tm_MaxRecursion(8),  // TODO: settable\n\tm_ProbLevelCorridor(a_ProbLevelCorridor),\n\tm_ProbLevelCrossing(a_ProbLevelCrossing),\n\tm_ProbLevelStaircase(a_ProbLevelStaircase + 1),\n\tm_ChanceChest(12),  // TODO: settable\n\tm_ChanceSpawner(12),  // TODO: settable\n\tm_ChanceTorch(1000)  // TODO: settable\n{\n\tm_MineShafts.reserve(100);\n\n\tcMineShaft * Start = new cMineShaftDirtRoom(*this, a_Noise);\n\tm_MineShafts.push_back(Start);\n\n\tm_BoundingBox.Assign(\n\t\t{Start->m_BoundingBox.p1.x - a_MaxSystemSize / 2, 2,  Start->m_BoundingBox.p1.z - a_MaxSystemSize / 2},\n\t\t{Start->m_BoundingBox.p2.x + a_MaxSystemSize / 2, 50, Start->m_BoundingBox.p2.z + a_MaxSystemSize / 2}\n\t);\n\n\tStart->AppendBranches(0, a_Noise);\n\n\tfor (cMineShafts::const_iterator itr = m_MineShafts.begin(), end = m_MineShafts.end(); itr != end; ++itr)\n\t{\n\t\tASSERT((*itr)->m_BoundingBox.IsSorted());\n\t}  // for itr - m_MineShafts[]\n}\n\n\n\n\n\ncStructGenMineShafts::cMineShaftSystem::~cMineShaftSystem()\n{\n\tfor (cMineShafts::iterator itr = m_MineShafts.begin(), end = m_MineShafts.end(); itr != end; ++itr)\n\t{\n\t\tdelete *itr;\n\t}  // for itr - m_MineShafts[]\n\tm_MineShafts.clear();\n}\n\n\n\n\n\nvoid cStructGenMineShafts::cMineShaftSystem::DrawIntoChunk(cChunkDesc & a_Chunk)\n{\n\tfor (cMineShafts::const_iterator itr = m_MineShafts.begin(), end = m_MineShafts.end(); itr != end; ++itr)\n\t{\n\t\t(*itr)->ProcessChunk(a_Chunk);\n\t}  // for itr - m_MineShafts[]\n}\n\n\n\n\n\nvoid cStructGenMineShafts::cMineShaftSystem::AppendBranch(\n\tint a_PivotX, int a_PivotY, int a_PivotZ,\n\tcMineShaft::eDirection a_Direction, cNoise & a_Noise,\n\tint a_RecursionLevel\n)\n{\n\tif (a_RecursionLevel > m_MaxRecursion)\n\t{\n\t\treturn;\n\t}\n\n\tcMineShaft * Next = nullptr;\n\tint rnd = (a_Noise.IntNoise3DInt(a_PivotX, a_PivotY + a_RecursionLevel * 16, a_PivotZ) / 13) % m_ProbLevelStaircase;\n\tif (rnd < m_ProbLevelCorridor)\n\t{\n\t\tNext = cMineShaftCorridor::CreateAndFit(*this, a_PivotX, a_PivotY, a_PivotZ, a_Direction, a_Noise);\n\t}\n\telse if (rnd < m_ProbLevelCrossing)\n\t{\n\t\tNext = cMineShaftCrossing::CreateAndFit(*this, a_PivotX, a_PivotY, a_PivotZ, a_Direction, a_Noise);\n\t}\n\telse\n\t{\n\t\tNext = cMineShaftStaircase::CreateAndFit(*this, a_PivotX, a_PivotY, a_PivotZ, a_Direction, a_Noise);\n\t}\n\tif (Next == nullptr)\n\t{\n\t\treturn;\n\t}\n\tm_MineShafts.push_back(Next);\n\tNext->AppendBranches(a_RecursionLevel + 1, a_Noise);\n}\n\n\n\n\n\nbool cStructGenMineShafts::cMineShaftSystem::CanAppend(const cCuboid & a_BoundingBox)\n{\n\tif (!a_BoundingBox.IsCompletelyInside(m_BoundingBox))\n\t{\n\t\t// Too far away, or too low / too high\n\t\treturn false;\n\t}\n\n\t// Check intersections:\n\tfor (cMineShafts::const_iterator itr = m_MineShafts.begin(), end = m_MineShafts.end(); itr != end; ++itr)\n\t{\n\t\tif ((*itr)->DoesIntersect(a_BoundingBox))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - m_MineShafts[]\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMineShaftDirtRoom:\n\ncMineShaftDirtRoom::cMineShaftDirtRoom(cStructGenMineShafts::cMineShaftSystem & a_Parent, cNoise & a_Noise) :\n\tSuper(a_Parent, mskDirtRoom)\n{\n\t// Make the room of random size, min 10 x 4 x 10; max 18 x 12 x 18:\n\tint rnd = a_Noise.IntNoise3DInt(a_Parent.m_OriginX, 0, a_Parent.m_OriginZ) / 7;\n\tint OfsX = (rnd % a_Parent.m_GridSize) - a_Parent.m_GridSize / 2;\n\trnd >>= 12;\n\tint OfsZ = (rnd % a_Parent.m_GridSize) - a_Parent.m_GridSize / 2;\n\trnd = a_Noise.IntNoise3DInt(a_Parent.m_OriginX, 1000, a_Parent.m_OriginZ) / 11;\n\tm_BoundingBox.p1.x = a_Parent.m_OriginX + OfsX;\n\tm_BoundingBox.p2.x = m_BoundingBox.p1.x + 10 + (rnd % 8);\n\trnd >>= 4;\n\tm_BoundingBox.p1.z = a_Parent.m_OriginZ + OfsZ;\n\tm_BoundingBox.p2.z = m_BoundingBox.p1.z + 10 + (rnd % 8);\n\trnd >>= 4;\n\tm_BoundingBox.p1.y = 20;\n\tm_BoundingBox.p2.y = 24 + rnd % 8;\n}\n\n\n\n\n\nvoid cMineShaftDirtRoom::AppendBranches(int a_RecursionLevel, cNoise & a_Noise)\n{\n\tint Height = m_BoundingBox.DifY() - 3;\n\tfor (int x = m_BoundingBox.p1.x + 1; x < m_BoundingBox.p2.x; x += 4)\n\t{\n\t\tint rnd = a_Noise.IntNoise3DInt(x, a_RecursionLevel, m_BoundingBox.p1.z) / 7;\n\t\tm_ParentSystem.AppendBranch(x, m_BoundingBox.p1.y + (rnd % Height), m_BoundingBox.p1.z - 1, dirZM, a_Noise, a_RecursionLevel);\n\t\trnd >>= 4;\n\t\tm_ParentSystem.AppendBranch(x, m_BoundingBox.p1.y + (rnd % Height), m_BoundingBox.p2.z + 1, dirZP, a_Noise, a_RecursionLevel);\n\t}\n\n\tfor (int z = m_BoundingBox.p1.z + 1; z < m_BoundingBox.p2.z; z += 4)\n\t{\n\t\tint rnd = a_Noise.IntNoise3DInt(m_BoundingBox.p1.x, a_RecursionLevel, z) / 13;\n\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x - 1, m_BoundingBox.p1.y + (rnd % Height), z, dirXM, a_Noise, a_RecursionLevel);\n\t\trnd >>= 4;\n\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p2.x + 1, m_BoundingBox.p1.y + (rnd % Height), z, dirXP, a_Noise, a_RecursionLevel);\n\t}\n}\n\n\n\n\n\nvoid cMineShaftDirtRoom::ProcessChunk(cChunkDesc & a_ChunkDesc)\n{\n\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tif (\n\t\t(m_BoundingBox.p1.x > BlockX + cChunkDef::Width) ||\n\t\t(m_BoundingBox.p1.z > BlockZ + cChunkDef::Width) ||\n\t\t(m_BoundingBox.p2.x < BlockX) ||\n\t\t(m_BoundingBox.p2.z < BlockZ)\n\t)\n\t{\n\t\t// Early bailout - cannot intersect this chunk\n\t\treturn;\n\t}\n\n\t// Chunk-relative coords of the boundaries:\n\tint MinX = std::max(BlockX, m_BoundingBox.p1.x) - BlockX;\n\tint MaxX = std::min(BlockX + cChunkDef::Width, m_BoundingBox.p2.x + 1) - BlockX;\n\tint MinZ = std::max(BlockZ, m_BoundingBox.p1.z) - BlockZ;\n\tint MaxZ = std::min(BlockZ + cChunkDef::Width, m_BoundingBox.p2.z + 1) - BlockZ;\n\n\t// Carve the room out:\n\tfor (int z = MinZ; z < MaxZ; z++)\n\t{\n\t\tfor (int x = MinX; x < MaxX; x++)\n\t\t{\n\t\t\tfor (int y = m_BoundingBox.p1.y + 1; y < m_BoundingBox.p2.y; y++)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_AIR);\n\t\t\t}\n\t\t\tif (a_ChunkDesc.GetBlockType(x, m_BoundingBox.p1.y, z) != E_BLOCK_AIR)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(x, m_BoundingBox.p1.y, z, E_BLOCK_DIRT);\n\t\t\t}\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMineShaftCorridor:\n\ncMineShaftCorridor::cMineShaftCorridor(\n\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\tconst cCuboid & a_BoundingBox, int a_NumSegments, eDirection a_Direction,\n\tcNoise & a_Noise\n) :\n\tSuper(a_ParentSystem, mskCorridor, a_BoundingBox),\n\tm_NumSegments(a_NumSegments),\n\tm_Direction(a_Direction),\n\tm_ChestPosition(-1),\n\tm_SpawnerPosition(-1)\n{\n\tint rnd = a_Noise.IntNoise3DInt(a_BoundingBox.p1.x, a_BoundingBox.p1.y, a_BoundingBox.p1.z) / 7;\n\tfor (int i = 0; i < a_NumSegments; i++)\n\t{\n\t\tm_HasFullBeam[i] = (rnd % 4) < 3;  // 75 % chance of full beam\n\t\trnd >>= 2;\n\t}\n\tm_HasTracks = ((rnd % 4) < 2);  // 50 % chance of tracks\n\n\trnd = a_Noise.IntNoise3DInt(a_BoundingBox.p1.z, a_BoundingBox.p1.x, a_BoundingBox.p1.y) / 7;\n\tint ChestCheck = rnd % 250;\n\trnd >>= 8;\n\tint SpawnerCheck = rnd % 250;\n\trnd >>= 8;\n\tif (ChestCheck < a_ParentSystem.m_ChanceChest)\n\t{\n\t\tm_ChestPosition = rnd % (a_NumSegments * 5);\n\t}\n\tif ((a_NumSegments < 4) && (SpawnerCheck < a_ParentSystem.m_ChanceSpawner))\n\t{\n\t\tm_SpawnerPosition = rnd % (a_NumSegments * 5);\n\t}\n}\n\n\n\n\n\ncMineShaft * cMineShaftCorridor::CreateAndFit(\n\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\tint a_PivotX, int a_PivotY, int a_PivotZ, eDirection a_Direction,\n\tcNoise & a_Noise\n)\n{\n\tcCuboid BoundingBox(a_PivotX, a_PivotY - 1, a_PivotZ);\n\tBoundingBox.p2.y += 3;\n\tint rnd = a_Noise.IntNoise3DInt(a_PivotX, a_PivotY + static_cast<int>(a_ParentSystem.m_MineShafts.size()), a_PivotZ) / 7;\n\tint NumSegments = 2 + (rnd) % (MAX_SEGMENTS - 1);  // 2 .. MAX_SEGMENTS\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXP: BoundingBox.p2.x += NumSegments * 5 - 1; BoundingBox.p1.z -= 1; BoundingBox.p2.z += 1; break;\n\t\tcase dirXM: BoundingBox.p1.x -= NumSegments * 5 - 1; BoundingBox.p1.z -= 1; BoundingBox.p2.z += 1; break;\n\t\tcase dirZP: BoundingBox.p2.z += NumSegments * 5 - 1; BoundingBox.p1.x -= 1; BoundingBox.p2.x += 1; break;\n\t\tcase dirZM: BoundingBox.p1.z -= NumSegments * 5 - 1; BoundingBox.p1.x -= 1; BoundingBox.p2.x += 1; break;\n\t}\n\tif (!a_ParentSystem.CanAppend(BoundingBox))\n\t{\n\t\treturn nullptr;\n\t}\n\treturn new cMineShaftCorridor(a_ParentSystem, BoundingBox, NumSegments, a_Direction, a_Noise);\n}\n\n\n\n\n\nvoid cMineShaftCorridor::AppendBranches(int a_RecursionLevel, cNoise & a_Noise)\n{\n\tint Outerrnd = a_Noise.IntNoise3DInt(m_BoundingBox.p1.x, m_BoundingBox.p1.y + a_RecursionLevel, m_BoundingBox.p1.z) / 7;\n\t// Prefer the same height, but allow for up to one block height displacement:\n\tint OuterHeight = m_BoundingBox.p1.y + ((Outerrnd % 4) + ((Outerrnd >> 3) % 3)) / 2;\n\tswitch (m_Direction)\n\t{\n\t\tcase dirXM:\n\t\t{\n\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x - 1, OuterHeight, m_BoundingBox.p1.z + 1, dirXM, a_Noise, a_RecursionLevel);\n\t\t\tfor (int i = m_NumSegments; i >= 0; i--)\n\t\t\t{\n\t\t\t\tint rnd = a_Noise.IntNoise3DInt(m_BoundingBox.p1.x + i + 10, m_BoundingBox.p1.y + a_RecursionLevel, m_BoundingBox.p1.z) / 11;\n\t\t\t\tint Height = m_BoundingBox.p1.y + ((rnd % 4) + ((rnd >> 3) % 3)) / 2;\n\t\t\t\trnd >>= 6;\n\t\t\t\tint Ofs = 1 + rnd % (m_NumSegments * 5 - 2);\n\t\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x + Ofs, Height, m_BoundingBox.p1.z - 1, dirZM, a_Noise, a_RecursionLevel);\n\t\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x + Ofs, Height, m_BoundingBox.p2.z + 1, dirZP, a_Noise, a_RecursionLevel);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirXP:\n\t\t{\n\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p2.x + 1, OuterHeight, m_BoundingBox.p1.z + 1, dirXP, a_Noise, a_RecursionLevel);\n\t\t\tfor (int i = m_NumSegments; i >= 0; i--)\n\t\t\t{\n\t\t\t\tint rnd = a_Noise.IntNoise3DInt(m_BoundingBox.p1.x + i + 10, m_BoundingBox.p1.y + a_RecursionLevel, m_BoundingBox.p1.z) / 11;\n\t\t\t\tint Height = m_BoundingBox.p1.y + ((rnd % 4) + ((rnd >> 3) % 3)) / 2;\n\t\t\t\trnd >>= 6;\n\t\t\t\tint Ofs = 1 + rnd % (m_NumSegments * 5 - 2);\n\t\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x + Ofs, Height, m_BoundingBox.p1.z - 1, dirZM, a_Noise, a_RecursionLevel);\n\t\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x + Ofs, Height, m_BoundingBox.p2.z + 1, dirZP, a_Noise, a_RecursionLevel);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirZM:\n\t\t{\n\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x + 1, OuterHeight, m_BoundingBox.p1.z - 1, dirZM, a_Noise, a_RecursionLevel);\n\t\t\tfor (int i = m_NumSegments; i >= 0; i--)\n\t\t\t{\n\t\t\t\tint rnd = a_Noise.IntNoise3DInt(m_BoundingBox.p1.x + i + 10, m_BoundingBox.p1.y + a_RecursionLevel, m_BoundingBox.p1.z) / 11;\n\t\t\t\tint Height = m_BoundingBox.p1.y + ((rnd % 4) + ((rnd >> 3) % 3)) / 2;\n\t\t\t\trnd >>= 6;\n\t\t\t\tint Ofs = 1 + rnd % (m_NumSegments * 5 - 2);\n\t\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x - 1, Height, m_BoundingBox.p1.z + Ofs, dirXM, a_Noise, a_RecursionLevel);\n\t\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p2.x + 1, Height, m_BoundingBox.p1.z + Ofs, dirXP, a_Noise, a_RecursionLevel);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirZP:\n\t\t{\n\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x + 1, OuterHeight, m_BoundingBox.p2.z + 1, dirZP, a_Noise, a_RecursionLevel);\n\t\t\tfor (int i = m_NumSegments; i >= 0; i--)\n\t\t\t{\n\t\t\t\tint rnd = a_Noise.IntNoise3DInt(m_BoundingBox.p1.x + i + 10, m_BoundingBox.p1.y + a_RecursionLevel, m_BoundingBox.p1.z) / 11;\n\t\t\t\tint Height = m_BoundingBox.p1.y + ((rnd % 4) + ((rnd >> 3) % 3)) / 2;\n\t\t\t\trnd >>= 6;\n\t\t\t\tint Ofs = 1 + rnd % (m_NumSegments * 5 - 2);\n\t\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x - 1, Height, m_BoundingBox.p1.z + Ofs, dirXM, a_Noise, a_RecursionLevel);\n\t\t\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p2.x + 1, Height, m_BoundingBox.p1.z + Ofs, dirXP, a_Noise, a_RecursionLevel);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}  // switch (m_Direction)\n}\n\n\n\n\n\nvoid cMineShaftCorridor::ProcessChunk(cChunkDesc & a_ChunkDesc)\n{\n\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tcCuboid RelBoundingBox(m_BoundingBox);\n\tRelBoundingBox.Move({-BlockX, 0, -BlockZ});\n\tRelBoundingBox.p1.y += 1;\n\tRelBoundingBox.p2.y -= 1;\n\tcCuboid Top(RelBoundingBox);\n\tTop.p2.y += 1;\n\tTop.p1.y = Top.p2.y;\n\ta_ChunkDesc.FillRelCuboid(RelBoundingBox, E_BLOCK_AIR, 0);\n\ta_ChunkDesc.RandomFillRelCuboid(Top, E_BLOCK_AIR, 0, (BlockX ^ (BlockZ + BlockX)), 8000);\n\tif (m_SpawnerPosition >= 0)\n\t{\n\t\t// Cobwebs around the spider spawner\n\t\ta_ChunkDesc.RandomFillRelCuboid(RelBoundingBox, E_BLOCK_COBWEB, 0, (BlockX ^ (BlockZ + BlockZ)), 8000);\n\t\ta_ChunkDesc.RandomFillRelCuboid(Top,            E_BLOCK_COBWEB, 0, (BlockX ^ (BlockZ + BlockX)), 5000);\n\t}\n\ta_ChunkDesc.RandomFillRelCuboid(Top, E_BLOCK_COBWEB, 0, (BlockX ^ (BlockZ + BlockX + 10)), 500);\n\tRelBoundingBox.p1.y = m_BoundingBox.p1.y;\n\tRelBoundingBox.p2.y = m_BoundingBox.p1.y;\n\ta_ChunkDesc.FloorRelCuboid(RelBoundingBox, E_BLOCK_PLANKS, 0);\n\tswitch (m_Direction)\n\t{\n\t\tcase dirXM:\n\t\tcase dirXP:\n\t\t{\n\t\t\tint y1 = m_BoundingBox.p1.y + 1;\n\t\t\tint y2 = m_BoundingBox.p1.y + 2;\n\t\t\tint y3 = m_BoundingBox.p1.y + 3;\n\t\t\tint z1 = m_BoundingBox.p1.z - BlockZ;\n\t\t\tint z2 = m_BoundingBox.p2.z - BlockZ;\n\t\t\tfor (int i = 0; i < m_NumSegments; i++)\n\t\t\t{\n\t\t\t\tint x = m_BoundingBox.p1.x + i * 5 + 2 - BlockX;\n\t\t\t\tif ((x < 0) || (x >= cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ((z1 >= 0) && (z1 < cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y1, z1, E_BLOCK_FENCE, 0);\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y2, z1, E_BLOCK_FENCE, 0);\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y3, z1, E_BLOCK_PLANKS, 0);\n\t\t\t\t}\n\t\t\t\tif ((z2 >= 0) && (z2 < cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y1, z2, E_BLOCK_FENCE, 0);\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y2, z2, E_BLOCK_FENCE, 0);\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y3, z2, E_BLOCK_PLANKS, 0);\n\t\t\t\t}\n\t\t\t\tif ((z1 >= -1) && (z1 < cChunkDef::Width - 1) && m_HasFullBeam[i])\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, y3, z1 + 1, E_BLOCK_PLANKS, 0);\n\t\t\t\t}\n\t\t\t}  // for i - NumSegments\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirZM:\n\t\tcase dirZP:\n\t\t{\n\t\t\tint y1 = m_BoundingBox.p1.y + 1;\n\t\t\tint y2 = m_BoundingBox.p1.y + 2;\n\t\t\tint y3 = m_BoundingBox.p1.y + 3;\n\t\t\tint x1 = m_BoundingBox.p1.x - BlockX;\n\t\t\tint x2 = m_BoundingBox.p2.x - BlockX;\n\t\t\tfor (int i = 0; i < m_NumSegments; i++)\n\t\t\t{\n\t\t\t\tint z = m_BoundingBox.p1.z + i * 5 + 2 - BlockZ;\n\t\t\t\tif ((z < 0) || (z >= cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ((x1 >= 0) && (x1 < cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x1, y1, z, E_BLOCK_FENCE, 0);\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x1, y2, z, E_BLOCK_FENCE, 0);\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x1, y3, z, E_BLOCK_PLANKS, 0);\n\t\t\t\t}\n\t\t\t\tif ((x2 >= 0) && (x2 < cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x2, y1, z, E_BLOCK_FENCE, 0);\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x2, y2, z, E_BLOCK_FENCE, 0);\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x2, y3, z, E_BLOCK_PLANKS, 0);\n\t\t\t\t}\n\t\t\t\tif ((x1 >= -1) && (x1 < cChunkDef::Width - 1) && m_HasFullBeam[i])\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x1 + 1, y3, z, E_BLOCK_PLANKS, 0);\n\t\t\t\t}\n\t\t\t}  // for i - NumSegments\n\t\t\tbreak;\n\t\t}  // case dirZ?\n\t}  // for i\n\n\tPlaceChest(a_ChunkDesc);\n\tPlaceTracks(a_ChunkDesc);\n\tPlaceSpawner(a_ChunkDesc);  // (must be after Tracks!)\n\tPlaceTorches(a_ChunkDesc);\n}\n\n\n\n\n\nvoid cMineShaftCorridor::PlaceChest(cChunkDesc & a_ChunkDesc)\n{\n\tstatic const cLootProbab LootProbab[] =\n\t{\n\t\t// Item,                          MinAmount, MaxAmount, Weight\n\t\t{ cItem(E_ITEM_IRON),             1,         5,         10 },\n\t\t{ cItem(E_ITEM_GOLD),             1,         3,          5 },\n\t\t{ cItem(E_ITEM_REDSTONE_DUST),    4,         9,          5 },\n\t\t{ cItem(E_ITEM_DIAMOND),          1,         2,          3 },\n\t\t{ cItem(E_ITEM_DYE, 1, 4),        4,         9,          5 },  // lapis lazuli dye\n\t\t{ cItem(E_ITEM_COAL),             3,         8,         10 },\n\t\t{ cItem(E_ITEM_BREAD),            1,         3,         15 },\n\t\t{ cItem(E_ITEM_IRON_PICKAXE),     1,         1,          1 },\n\t\t{ cItem(E_BLOCK_MINECART_TRACKS), 4,         8,          1 },\n\t\t{ cItem(E_ITEM_MELON_SEEDS),      2,         4,         10 },\n\t\t{ cItem(E_ITEM_PUMPKIN_SEEDS),    2,         4,         10 },\n\t} ;\n\n\tif (m_ChestPosition < 0)\n\t{\n\t\treturn;\n\t}\n\n\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tint x, z;\n\tNIBBLETYPE Meta = 0;\n\t[&]\n\t{\n\t\tswitch (m_Direction)\n\t\t{\n\t\t\tcase dirXM:\n\t\t\tcase dirXP:\n\t\t\t{\n\t\t\t\tx = m_BoundingBox.p1.x + m_ChestPosition - BlockX;\n\t\t\t\tz = m_BoundingBox.p1.z - BlockZ;\n\t\t\t\tMeta = E_META_CHEST_FACING_ZP;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase dirZM:\n\t\t\tcase dirZP:\n\t\t\t{\n\t\t\t\tx = m_BoundingBox.p1.x - BlockX;\n\t\t\t\tz = m_BoundingBox.p1.z + m_ChestPosition - BlockZ;\n\t\t\t\tMeta = E_META_CHEST_FACING_XP;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}  // switch (Dir)\n\t\tUNREACHABLE(\"Unsupported corridor direction\");\n\t}();\n\n\tif (\n\t\t(x >= 0) && (x < cChunkDef::Width) &&\n\t\t(z >= 0) && (z < cChunkDef::Width)\n\t)\n\t{\n\t\ta_ChunkDesc.SetBlockTypeMeta(x, m_BoundingBox.p1.y + 1, z, E_BLOCK_CHEST, Meta);\n\t\tcChestEntity * ChestEntity = static_cast<cChestEntity *>(a_ChunkDesc.GetBlockEntity(x, m_BoundingBox.p1.y + 1, z));\n\t\tASSERT((ChestEntity != nullptr) && (ChestEntity->GetBlockType() == E_BLOCK_CHEST));\n\t\tcNoise Noise(a_ChunkDesc.GetChunkX() ^ a_ChunkDesc.GetChunkZ());\n\t\tint NumSlots = 3 + ((Noise.IntNoise3DInt(x, m_BoundingBox.p1.y, z) / 11) % 4);\n\t\tint Seed = Noise.IntNoise2DInt(x, z);\n\t\tChestEntity->GetContents().GenerateRandomLootWithBooks(LootProbab, ARRAYCOUNT(LootProbab), NumSlots, Seed);\n\t}\n}\n\n\n\n\n\nvoid cMineShaftCorridor::PlaceTracks(cChunkDesc & a_ChunkDesc)\n{\n\tif (!m_HasTracks)\n\t{\n\t\treturn;\n\t}\n\tcCuboid Box(m_BoundingBox);\n\tBox.Move({-a_ChunkDesc.GetChunkX() * cChunkDef::Width, 1, -a_ChunkDesc.GetChunkZ() * cChunkDef::Width});\n\tBox.p2.y = Box.p1.y;\n\tBox.p1.x += 1;\n\tBox.p2.x -= 1;\n\tBox.p1.z += 1;\n\tBox.p2.z -= 1;\n\tNIBBLETYPE Meta = 0;\n\tswitch (m_Direction)\n\t{\n\t\tcase dirXM:\n\t\tcase dirXP:\n\t\t{\n\t\t\tMeta = E_META_TRACKS_X;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirZM:\n\t\tcase dirZP:\n\t\t{\n\t\t\tMeta = E_META_TRACKS_Z;\n\t\t\tbreak;\n\t\t}\n\t}  // switch (direction)\n\ta_ChunkDesc.RandomFillRelCuboid(Box, E_BLOCK_MINECART_TRACKS, Meta, a_ChunkDesc.GetChunkX() + a_ChunkDesc.GetChunkZ(), 6000);\n}\n\n\n\n\n\nvoid cMineShaftCorridor::PlaceSpawner(cChunkDesc & a_ChunkDesc)\n{\n\tif (m_SpawnerPosition < 0)\n\t{\n\t\t// No spawner in this corridor\n\t\treturn;\n\t}\n\tint SpawnerRelX = m_BoundingBox.p1.x + 1 - a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint SpawnerRelZ = m_BoundingBox.p1.z + 1 - a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tswitch (m_Direction)\n\t{\n\t\tcase dirXM:\n\t\tcase dirXP:\n\t\t{\n\t\t\tSpawnerRelX += m_SpawnerPosition - 1;\n\t\t\tbreak;\n\t\t}\n\t\tcase dirZM:\n\t\tcase dirZP:\n\t\t{\n\t\t\tSpawnerRelZ += m_SpawnerPosition - 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (\n\t\t(SpawnerRelX >= 0) && (SpawnerRelX < cChunkDef::Width) &&\n\t\t(SpawnerRelZ >= 0) && (SpawnerRelZ < cChunkDef::Width)\n\t)\n\t{\n\t\ta_ChunkDesc.SetBlockTypeMeta(SpawnerRelX, m_BoundingBox.p1.y + 1, SpawnerRelZ, E_BLOCK_MOB_SPAWNER, 0);\n\t\tcMobSpawnerEntity * MobSpawner = static_cast<cMobSpawnerEntity *>(a_ChunkDesc.GetBlockEntity(SpawnerRelX, m_BoundingBox.p1.y + 1, SpawnerRelZ));\n\t\tASSERT((MobSpawner != nullptr) && (MobSpawner->GetBlockType() == E_BLOCK_MOB_SPAWNER));\n\t\tMobSpawner->SetEntity(mtCaveSpider);\n\t}\n}\n\n\n\n\n\nvoid cMineShaftCorridor::PlaceTorches(cChunkDesc & a_ChunkDesc)\n{\n\tcNoise Noise(m_BoundingBox.p1.x);\n\tswitch (m_Direction)\n\t{\n\t\tcase dirXM:\n\t\tcase dirXP:\n\t\t{\n\t\t\tint z = m_BoundingBox.p1.z + 1 - a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\t\tif ((z < 0) || (z >= cChunkDef::Width))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\t\tfor (int i = 0; i < m_NumSegments; i++)\n\t\t\t{\n\t\t\t\tif (!m_HasFullBeam[i])\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint x = m_BoundingBox.p1.x + i * 5 + 1 - BlockX;\n\t\t\t\tif ((x >= 0) && (x < cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\tif (((Noise.IntNoise2DInt(x, z) / 7) % 10000) < m_ParentSystem.m_ChanceTorch)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, m_BoundingBox.p2.y, z, E_BLOCK_TORCH, E_META_TORCH_XP);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tx += 2;\n\t\t\t\tif ((x >= 0) && (x < cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\tif (((Noise.IntNoise2DInt(x, z) / 7) % 10000) < m_ParentSystem.m_ChanceTorch)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, m_BoundingBox.p2.y, z, E_BLOCK_TORCH, E_META_TORCH_XM);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}  // for i\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirZM:\n\t\tcase dirZP:\n\t\t{\n\t\t\tint x = m_BoundingBox.p1.x + 1 - a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\t\tif ((x < 0) || (x >= cChunkDef::Width))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\t\tfor (int i = 0; i < m_NumSegments; i++)\n\t\t\t{\n\t\t\t\tif (!m_HasFullBeam[i])\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint z = m_BoundingBox.p1.z + i * 5 + 1 - BlockZ;\n\t\t\t\tif ((z >= 0) && (z < cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\tif (((Noise.IntNoise2DInt(x, z) / 7) % 10000) < m_ParentSystem.m_ChanceTorch)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, m_BoundingBox.p2.y, z, E_BLOCK_TORCH, E_META_TORCH_ZP);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tz += 2;\n\t\t\t\tif ((z >= 0) && (z < cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\tif (((Noise.IntNoise2DInt(x, z) / 7) % 10000) < m_ParentSystem.m_ChanceTorch)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(x, m_BoundingBox.p2.y, z, E_BLOCK_TORCH, E_META_TORCH_ZM);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}  // for i\n\t\t\tbreak;\n\t\t}\n\t}  // switch (direction)\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMineShaftCrossing:\n\ncMineShaftCrossing::cMineShaftCrossing(cStructGenMineShafts::cMineShaftSystem & a_ParentSystem, const cCuboid & a_BoundingBox) :\n\tSuper(a_ParentSystem, mskCrossing, a_BoundingBox)\n{\n}\n\n\n\n\n\ncMineShaft * cMineShaftCrossing::CreateAndFit(\n\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\tint a_PivotX, int a_PivotY, int a_PivotZ, eDirection a_Direction,\n\tcNoise & a_Noise\n)\n{\n\tcCuboid BoundingBox(a_PivotX, a_PivotY - 1, a_PivotZ);\n\tint rnd = a_Noise.IntNoise3DInt(a_PivotX, a_PivotY + static_cast<int>(a_ParentSystem.m_MineShafts.size()), a_PivotZ) / 7;\n\tBoundingBox.p2.y += 3;\n\tif ((rnd % 4) < 2)\n\t{\n\t\t// 2-level crossing:\n\t\tBoundingBox.p2.y += 4;\n\t\trnd >>= 2;\n\t\tif ((rnd % 4) < 2)\n\t\t{\n\t\t\t// This is the higher level:\n\t\t\tBoundingBox.p1.y -= 4;\n\t\t\tBoundingBox.p2.y -= 4;\n\t\t}\n\t}\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXP: BoundingBox.p2.x += 4; BoundingBox.p1.z -= 2; BoundingBox.p2.z += 2; break;\n\t\tcase dirXM: BoundingBox.p1.x -= 4; BoundingBox.p1.z -= 2; BoundingBox.p2.z += 2; break;\n\t\tcase dirZP: BoundingBox.p2.z += 4; BoundingBox.p1.x -= 2; BoundingBox.p2.x += 2; break;\n\t\tcase dirZM: BoundingBox.p1.z -= 4; BoundingBox.p1.x -= 2; BoundingBox.p2.x += 2; break;\n\t}\n\tif (!a_ParentSystem.CanAppend(BoundingBox))\n\t{\n\t\treturn nullptr;\n\t}\n\treturn new cMineShaftCrossing(a_ParentSystem, BoundingBox);\n}\n\n\n\n\n\nvoid cMineShaftCrossing::AppendBranches(int a_RecursionLevel, cNoise & a_Noise)\n{\n\tstruct\n\t{\n\t\tint x, y, z;\n\t\teDirection dir;\n\t} Exits[] =\n\t{\n\t\t// Bottom level:\n\t\t{-1, 1,  2, dirXM},\n\t\t{ 2, 1, -1, dirZM},\n\t\t{ 5, 1,  2, dirXP},\n\t\t{ 2, 1,  5, dirZP},\n\t\t// Top level:\n\t\t{-1, 5,  2, dirXM},\n\t\t{ 2, 5, -1, dirZM},\n\t\t{ 5, 5,  2, dirXP},\n\t\t{ 2, 5,  5, dirZP},\n\t} ;\n\tfor (size_t i = 0; i < ARRAYCOUNT(Exits); i++)\n\t{\n\t\tif (m_BoundingBox.p1.y + Exits[i].y >= m_BoundingBox.p2.y)\n\t\t{\n\t\t\t// This exit is not available (two-level exit on a one-level crossing)\n\t\t\tcontinue;\n\t\t}\n\n\t\tint Height = m_BoundingBox.p1.y + Exits[i].y;\n\t\tm_ParentSystem.AppendBranch(m_BoundingBox.p1.x + Exits[i].x, Height, m_BoundingBox.p1.z + Exits[i].z, Exits[i].dir, a_Noise, a_RecursionLevel);\n\t}  // for i\n}\n\n\n\n\n\nvoid cMineShaftCrossing::ProcessChunk(cChunkDesc & a_ChunkDesc)\n{\n\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tcCuboid box(m_BoundingBox);\n\tbox.Move({-BlockX, 0, -BlockZ});\n\tif ((box.p2.x < 0) || (box.p2.z < 0) || (box.p1.x >= cChunkDef::Width) || (box.p1.z > cChunkDef::Width))\n\t{\n\t\t// Does not intersect this chunk\n\t\treturn;\n\t}\n\tint Floor = box.p1.y + 1;\n\tint Ceil = box.p2.y;\n\n\t// The supports:\n\ta_ChunkDesc.FillRelCuboid(box.p1.x + 1, box.p1.x + 1, Floor, Ceil, box.p1.z + 1, box.p1.z + 1, E_BLOCK_PLANKS, 0);\n\ta_ChunkDesc.FillRelCuboid(box.p2.x - 1, box.p2.x - 1, Floor, Ceil, box.p1.z + 1, box.p1.z + 1, E_BLOCK_PLANKS, 0);\n\ta_ChunkDesc.FillRelCuboid(box.p1.x + 1, box.p1.x + 1, Floor, Ceil, box.p2.z - 1, box.p2.z - 1, E_BLOCK_PLANKS, 0);\n\ta_ChunkDesc.FillRelCuboid(box.p2.x - 1, box.p2.x - 1, Floor, Ceil, box.p2.z - 1, box.p2.z - 1, E_BLOCK_PLANKS, 0);\n\n\t// The air in between:\n\ta_ChunkDesc.FillRelCuboid(box.p1.x + 2, box.p1.x + 2, Floor, Ceil, box.p1.z + 1, box.p2.z - 1, E_BLOCK_AIR, 0);\n\ta_ChunkDesc.FillRelCuboid(box.p1.x + 1, box.p2.x - 1, Floor, Ceil, box.p1.z + 2, box.p1.z + 2, E_BLOCK_AIR, 0);\n\n\t// The air on the edges:\n\tint Mid = Floor + 2;\n\ta_ChunkDesc.FillRelCuboid(box.p1.x,     box.p1.x,     Floor, Mid, box.p1.z + 1, box.p2.z - 1, E_BLOCK_AIR, 0);\n\ta_ChunkDesc.FillRelCuboid(box.p2.x,     box.p2.x,     Floor, Mid, box.p1.z + 1, box.p2.z - 1, E_BLOCK_AIR, 0);\n\ta_ChunkDesc.FillRelCuboid(box.p1.x + 1, box.p2.x - 1, Floor, Mid, box.p1.z,     box.p1.z,     E_BLOCK_AIR, 0);\n\ta_ChunkDesc.FillRelCuboid(box.p1.x + 1, box.p2.x - 1, Floor, Mid, box.p2.z,     box.p2.z,     E_BLOCK_AIR, 0);\n\tMid += 2;\n\tif (Mid < Ceil)\n\t{\n\t\ta_ChunkDesc.FillRelCuboid(box.p1.x,     box.p1.x,     Mid, Ceil, box.p1.z + 1, box.p2.z - 1, E_BLOCK_AIR, 0);\n\t\ta_ChunkDesc.FillRelCuboid(box.p2.x,     box.p2.x,     Mid, Ceil, box.p1.z + 1, box.p2.z - 1, E_BLOCK_AIR, 0);\n\t\ta_ChunkDesc.FillRelCuboid(box.p1.x + 1, box.p2.x - 1, Mid, Ceil, box.p1.z,     box.p1.z,     E_BLOCK_AIR, 0);\n\t\ta_ChunkDesc.FillRelCuboid(box.p1.x + 1, box.p2.x - 1, Mid, Ceil, box.p2.z,     box.p2.z,     E_BLOCK_AIR, 0);\n\t}\n\n\t// The floor, if needed:\n\tbox.p2.y = box.p1.y;\n\ta_ChunkDesc.FloorRelCuboid(box, E_BLOCK_PLANKS, 0);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMineShaftStaircase:\n\ncMineShaftStaircase::cMineShaftStaircase(\n\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\tconst cCuboid & a_BoundingBox,\n\teDirection a_Direction,\n\teSlope a_Slope\n) :\n\tSuper(a_ParentSystem, mskStaircase, a_BoundingBox),\n\tm_Direction(a_Direction),\n\tm_Slope(a_Slope)\n{\n}\n\n\n\n\n\ncMineShaft * cMineShaftStaircase::CreateAndFit(\n\tcStructGenMineShafts::cMineShaftSystem & a_ParentSystem,\n\tint a_PivotX, int a_PivotY, int a_PivotZ, eDirection a_Direction,\n\tcNoise & a_Noise\n)\n{\n\tint rnd = a_Noise.IntNoise3DInt(a_PivotX, a_PivotY + static_cast<int>(a_ParentSystem.m_MineShafts.size()), a_PivotZ) / 7;\n\tcCuboid Box;\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXM:\n\t\t{\n\t\t\tBox.Assign({a_PivotX - 7, a_PivotY - 1, a_PivotZ - 1}, {a_PivotX, a_PivotY + 6, a_PivotZ + 1});\n\t\t\tbreak;\n\t\t}\n\t\tcase dirXP:\n\t\t{\n\t\t\tBox.Assign({a_PivotX, a_PivotY - 1, a_PivotZ - 1}, {a_PivotX + 7, a_PivotY + 6, a_PivotZ + 1});\n\t\t\tbreak;\n\t\t}\n\t\tcase dirZM:\n\t\t{\n\t\t\tBox.Assign({a_PivotX - 1, a_PivotY - 1, a_PivotZ - 7}, {a_PivotX + 1, a_PivotY + 6, a_PivotZ});\n\t\t\tbreak;\n\t\t}\n\t\tcase dirZP:\n\t\t{\n\t\t\tBox.Assign({a_PivotX - 1, a_PivotY - 1, a_PivotZ}, {a_PivotX + 1, a_PivotY + 6, a_PivotZ + 7});\n\t\t\tbreak;\n\t\t}\n\t}\n\teSlope Slope = sUp;\n\tif ((rnd % 4) < 2)  // 50 %\n\t{\n\t\tSlope = sDown;\n\t\tBox.Move({0, -4, 0});\n\t}\n\tif (!a_ParentSystem.CanAppend(Box))\n\t{\n\t\treturn nullptr;\n\t}\n\treturn new cMineShaftStaircase(a_ParentSystem, Box, a_Direction, Slope);\n}\n\n\n\n\n\nvoid cMineShaftStaircase::AppendBranches(int a_RecursionLevel, cNoise & a_Noise)\n{\n\tint Height = m_BoundingBox.p1.y + ((m_Slope == sDown) ? 1 : 5);\n\tswitch (m_Direction)\n\t{\n\t\tcase dirXM: m_ParentSystem.AppendBranch(m_BoundingBox.p1.x - 1, Height, m_BoundingBox.p1.z + 1, dirXM, a_Noise, a_RecursionLevel); break;\n\t\tcase dirXP: m_ParentSystem.AppendBranch(m_BoundingBox.p2.x + 1, Height, m_BoundingBox.p1.z + 1, dirXP, a_Noise, a_RecursionLevel); break;\n\t\tcase dirZM: m_ParentSystem.AppendBranch(m_BoundingBox.p1.x + 1, Height, m_BoundingBox.p1.z - 1, dirZM, a_Noise, a_RecursionLevel); break;\n\t\tcase dirZP: m_ParentSystem.AppendBranch(m_BoundingBox.p1.x + 1, Height, m_BoundingBox.p2.z + 1, dirZP, a_Noise, a_RecursionLevel); break;\n\t}\n}\n\n\n\n\n\nvoid cMineShaftStaircase::ProcessChunk(cChunkDesc & a_ChunkDesc)\n{\n\tint BlockX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint BlockZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tcCuboid RelB(m_BoundingBox);\n\tRelB.Move({-BlockX, 0, -BlockZ});\n\tif (\n\t\t(RelB.p1.x >= cChunkDef::Width) ||\n\t\t(RelB.p1.z >= cChunkDef::Width) ||\n\t\t(RelB.p2.x < 0) ||\n\t\t(RelB.p2.z < 0)\n\t)\n\t{\n\t\t// No intersection between this staircase and this chunk\n\t\treturn;\n\t}\n\n\tint SFloor = RelB.p1.y + ((m_Slope == sDown) ? 5 : 1);\n\tint DFloor = RelB.p1.y + ((m_Slope == sDown) ? 1 : 5);\n\tint Add = (m_Slope == sDown) ? -1 : 1;\n\tint InitAdd = (m_Slope == sDown) ? -1 : 0;\n\tcCuboid Box;\n\tswitch (m_Direction)\n\t{\n\t\tcase dirXM:\n\t\t{\n\t\t\ta_ChunkDesc.FillRelCuboid (RelB.p2.x - 1, RelB.p2.x,     SFloor,     SFloor + 2, RelB.p1.z, RelB.p2.z, E_BLOCK_AIR, 0);\n\t\t\ta_ChunkDesc.FillRelCuboid (RelB.p1.x,     RelB.p1.x + 1, DFloor,     DFloor + 2, RelB.p1.z, RelB.p2.z, E_BLOCK_AIR, 0);\n\t\t\ta_ChunkDesc.FloorRelCuboid(RelB.p2.x - 1, RelB.p2.x,     SFloor - 1, SFloor - 1, RelB.p1.z, RelB.p2.z, E_BLOCK_PLANKS, 0);\n\t\t\ta_ChunkDesc.FloorRelCuboid(RelB.p1.x,     RelB.p1.x + 1, DFloor - 1, DFloor - 1, RelB.p1.z, RelB.p2.z, E_BLOCK_PLANKS, 0);\n\t\t\tBox.Assign({RelB.p2.x - 2, SFloor + InitAdd, RelB.p1.z}, {RelB.p2.x - 2, SFloor + 3 + InitAdd, RelB.p2.z});\n\t\t\tfor (int i = 0; i < 4; i++)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.FillRelCuboid(Box, E_BLOCK_AIR, 0);\n\t\t\t\ta_ChunkDesc.FloorRelCuboid(Box.p1.x, Box.p2.x, Box.p1.y - 1, Box.p1.y - 1, Box.p1.z, Box.p2.z, E_BLOCK_PLANKS, 0);\n\t\t\t\tBox.Move({-1, Add, 0});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirXP:\n\t\t{\n\t\t\ta_ChunkDesc.FillRelCuboid (RelB.p1.x,     RelB.p1.x + 1, SFloor,     SFloor + 2, RelB.p1.z, RelB.p2.z, E_BLOCK_AIR, 0);\n\t\t\ta_ChunkDesc.FillRelCuboid (RelB.p2.x - 1, RelB.p2.x,     DFloor,     DFloor + 2, RelB.p1.z, RelB.p2.z, E_BLOCK_AIR, 0);\n\t\t\ta_ChunkDesc.FloorRelCuboid(RelB.p1.x,     RelB.p1.x + 1, SFloor - 1, SFloor - 1, RelB.p1.z, RelB.p2.z, E_BLOCK_PLANKS, 0);\n\t\t\ta_ChunkDesc.FloorRelCuboid(RelB.p2.x - 1, RelB.p2.x,     DFloor - 1, DFloor - 1, RelB.p1.z, RelB.p2.z, E_BLOCK_PLANKS, 0);\n\t\t\tBox.Assign({RelB.p1.x + 2, SFloor + InitAdd, RelB.p1.z}, {RelB.p1.x + 2, SFloor + 3 + InitAdd, RelB.p2.z});\n\t\t\tfor (int i = 0; i < 4; i++)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.FillRelCuboid(Box, E_BLOCK_AIR, 0);\n\t\t\t\ta_ChunkDesc.FloorRelCuboid(Box.p1.x, Box.p2.x, Box.p1.y - 1, Box.p1.y - 1, Box.p1.z, Box.p2.z, E_BLOCK_PLANKS, 0);\n\t\t\t\tBox.Move({1, Add, 0});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirZM:\n\t\t{\n\t\t\ta_ChunkDesc.FillRelCuboid (RelB.p1.x, RelB.p2.x, SFloor,     SFloor + 2, RelB.p2.z - 1, RelB.p2.z,      E_BLOCK_AIR, 0);\n\t\t\ta_ChunkDesc.FillRelCuboid (RelB.p1.x, RelB.p2.x, DFloor,     DFloor + 2, RelB.p1.z,     RelB.p1.z + 1,  E_BLOCK_AIR, 0);\n\t\t\ta_ChunkDesc.FloorRelCuboid(RelB.p1.x, RelB.p2.x, SFloor - 1, SFloor - 1, RelB.p2.z - 1, RelB.p2.z,      E_BLOCK_PLANKS, 0);\n\t\t\ta_ChunkDesc.FloorRelCuboid(RelB.p1.x, RelB.p2.x, DFloor - 1, DFloor - 1, RelB.p1.z,     RelB.p1.z + 1,  E_BLOCK_PLANKS, 0);\n\t\t\tBox.Assign({RelB.p1.x, SFloor + InitAdd, RelB.p2.z - 2}, {RelB.p2.x, SFloor + 3 + InitAdd, RelB.p2.z - 2});\n\t\t\tfor (int i = 0; i < 4; i++)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.FillRelCuboid(Box, E_BLOCK_AIR, 0);\n\t\t\t\ta_ChunkDesc.FloorRelCuboid(Box.p1.x, Box.p2.x, Box.p1.y - 1, Box.p1.y - 1, Box.p1.z, Box.p2.z, E_BLOCK_PLANKS, 0);\n\t\t\t\tBox.Move({0, Add, -1});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase dirZP:\n\t\t{\n\t\t\ta_ChunkDesc.FillRelCuboid (RelB.p1.x, RelB.p2.x, SFloor,     SFloor + 2, RelB.p1.z,     RelB.p1.z + 1,  E_BLOCK_AIR, 0);\n\t\t\ta_ChunkDesc.FillRelCuboid (RelB.p1.x, RelB.p2.x, DFloor,     DFloor + 2, RelB.p2.z - 1, RelB.p2.z,      E_BLOCK_AIR, 0);\n\t\t\ta_ChunkDesc.FloorRelCuboid(RelB.p1.x, RelB.p2.x, SFloor - 1, SFloor - 1, RelB.p1.z,     RelB.p1.z + 1,  E_BLOCK_PLANKS, 0);\n\t\t\ta_ChunkDesc.FloorRelCuboid(RelB.p1.x, RelB.p2.x, DFloor - 1, DFloor - 1, RelB.p2.z - 1, RelB.p2.z,      E_BLOCK_PLANKS, 0);\n\t\t\tBox.Assign({RelB.p1.x, SFloor + InitAdd, RelB.p1.z + 2}, {RelB.p2.x, SFloor + 3 + InitAdd, RelB.p1.z + 2});\n\t\t\tfor (int i = 0; i < 4; i++)\n\t\t\t{\n\t\t\t\ta_ChunkDesc.FillRelCuboid(Box, E_BLOCK_AIR, 0);\n\t\t\t\ta_ChunkDesc.FloorRelCuboid(Box.p1.x, Box.p2.x, Box.p1.y - 1, Box.p1.y - 1, Box.p1.z, Box.p2.z, E_BLOCK_PLANKS, 0);\n\t\t\t\tBox.Move({0, Add, 1});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t}  // switch (m_Direction)\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenMineShafts:\n\ncStructGenMineShafts::cStructGenMineShafts(\n\tint a_Seed, int a_GridSize, int a_MaxOffset, int a_MaxSystemSize,\n\tint a_ChanceCorridor, int a_ChanceCrossing, int a_ChanceStaircase\n) :\n\tSuper(a_Seed, a_GridSize, a_GridSize, a_MaxOffset, a_MaxOffset, a_MaxSystemSize, a_MaxSystemSize, 100),\n\tm_GridSize(a_GridSize),\n\tm_MaxSystemSize(a_MaxSystemSize),\n\tm_ProbLevelCorridor(std::max(0, a_ChanceCorridor)),\n\tm_ProbLevelCrossing(std::max(0, a_ChanceCorridor + a_ChanceCrossing)),\n\tm_ProbLevelStaircase(std::max(0, a_ChanceCorridor + a_ChanceCrossing + a_ChanceStaircase))\n{\n}\n\n\n\n\n\ncGridStructGen::cStructurePtr cStructGenMineShafts::CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ)\n{\n\treturn cStructurePtr(new cMineShaftSystem(a_GridX, a_GridZ, a_OriginX, a_OriginZ, m_GridSize, m_MaxSystemSize, m_Noise, m_ProbLevelCorridor, m_ProbLevelCrossing, m_ProbLevelStaircase));\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/MineShafts.h",
    "content": "\n// MineShafts.h\n\n// Declares the cStructGenMineShafts class representing the structure generator for abandoned mineshafts\n\n\n\n\n\n#pragma once\n\n#include \"GridStructGen.h\"\n\n\n\n\n\nclass cStructGenMineShafts :\n\tpublic cGridStructGen\n{\n\ttypedef cGridStructGen Super;\n\npublic:\n\tcStructGenMineShafts(\n\t\tint a_Seed, int a_GridSize, int a_MaxOffset, int a_MaxSystemSize,\n\t\tint a_ChanceCorridor, int a_ChanceCrossing, int a_ChanceStaircase\n\t);\n\nprotected:\n\tfriend class cMineShaft;\n\tfriend class cMineShaftDirtRoom;\n\tfriend class cMineShaftCorridor;\n\tfriend class cMineShaftCrossing;\n\tfriend class cMineShaftStaircase;\n\tclass cMineShaftSystem;  // fwd: MineShafts.cpp\n\n\tint    m_GridSize;            ///< Average spacing of the systems\n\tint    m_MaxSystemSize;       ///< Maximum block size of a mineshaft system\n\tint    m_ProbLevelCorridor;   ///< Probability level of a branch object being the corridor\n\tint    m_ProbLevelCrossing;   ///< Probability level of a branch object being the crossing, minus Corridor\n\tint    m_ProbLevelStaircase;  ///< Probability level of a branch object being the staircase, minus Crossing\n\n\t// cGridStructGen overrides:\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Generating/Noise3DGenerator.cpp",
    "content": "\n// Nosie3DGenerator.cpp\n\n// Generates terrain using 3D noise, rather than composing. Is a test.\n\n#include \"Globals.h\"\n#include \"Noise3DGenerator.h\"\n#include \"../IniFile.h\"\n#include \"../LinearInterpolation.h\"\n#include \"../LinearUpscale.h\"\n\n\n\n\n\n/*\n// Perform an automatic test of upscaling upon program start (use breakpoints to debug):\n\nclass Test\n{\npublic:\n\tTest(void)\n\t{\n\t\tDoTest1();\n\t\tDoTest2();\n\t}\n\n\n\tvoid DoTest1(void)\n\t{\n\t\tfloat In[3 * 3 * 3];\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(In); i++)\n\t\t{\n\t\t\tIn[i] = (float)(i % 5);\n\t\t}\n\t\tDebug3DNoise(In, 3, 3, 3, \"Upscale3D in\");\n\t\tfloat Out[17 * 33 * 35];\n\t\tLinearUpscale3DArray(In, 3, 3, 3, Out, 8, 16, 17);\n\t\tDebug3DNoise(Out, 17, 33, 35, \"Upscale3D test\");\n\t}\n\n\n\tvoid DoTest2(void)\n\t{\n\t\tfloat In[3 * 3];\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(In); i++)\n\t\t{\n\t\t\tIn[i] = (float)(i % 5);\n\t\t}\n\t\tDebug2DNoise(In, 3, 3, \"Upscale2D in\");\n\t\tfloat Out[17 * 33];\n\t\tLinearUpscale2DArray(In, 3, 3, Out, 8, 16);\n\t\tDebug2DNoise(Out, 17, 33, \"Upscale2D test\");\n\t}\n\n} gTest;\n//*/\n\n\n\n\n\n#if 0\n// Perform speed test of the cInterpolNoise class\nstatic class cInterpolNoiseSpeedTest\n{\npublic:\n\tcInterpolNoiseSpeedTest(void)\n\t{\n\t\tTestSpeed2D();\n\t\tTestSpeed3D();\n\t\tprintf(\"InterpolNoise speed comparison finished.\\n\");\n\t}\n\n\n\t/** Compare the speed of the 3D InterpolNoise vs 3D CubicNoise. */\n\tvoid TestSpeed3D(void)\n\t{\n\t\tprintf(\"Evaluating 3D noise performance...\\n\");\n\t\tstatic const int SIZE_X = 128;\n\t\tstatic const int SIZE_Y = 128;\n\t\tstatic const int SIZE_Z = 128;\n\t\tstatic const NOISE_DATATYPE MUL = 80;\n\t\tstd::unique_ptr<NOISE_DATATYPE[]> arr(new NOISE_DATATYPE[SIZE_X * SIZE_Y * SIZE_Z]);\n\t\tcTimer timer;\n\n\t\t// Test the cInterpolNoise:\n\t\tcInterpolNoise<Interp5Deg> interpNoise(1);\n\t\tlong long start = timer.GetNowTime();\n\t\tfor (int i = 0; i < 30; i++)\n\t\t{\n\t\t\tinterpNoise.Generate3D(arr.get(), SIZE_X, SIZE_Y, SIZE_Z, MUL * i, MUL * i + MUL, 0, MUL, 0, MUL);\n\t\t}\n\t\tlong long end = timer.GetNowTime();\n\t\tprintf(\"InterpolNoise took %.02f sec\\n\", static_cast<float>(end - start) / 1000);\n\n\t\t// Test the cCubicNoise:\n\t\tcCubicNoise cubicNoise(1);\n\t\tstart = timer.GetNowTime();\n\t\tfor (int i = 0; i < 30; i++)\n\t\t{\n\t\t\tcubicNoise.Generate3D(arr.get(), SIZE_X, SIZE_Y, SIZE_Z, MUL * i, MUL * i + MUL, 0, MUL, 0, MUL);\n\t\t}\n\t\tend = timer.GetNowTime();\n\t\tprintf(\"CubicNoise took %.02f sec\\n\", static_cast<float>(end - start) / 1000);\n\t\tprintf(\"3D noise performance comparison finished.\\n\");\n\t}\n\n\n\t/** Compare the speed of the 2D InterpolNoise vs 2D CubicNoise. */\n\tvoid TestSpeed2D(void)\n\t{\n\t\tprintf(\"Evaluating 2D noise performance...\\n\");\n\t\tstatic const int SIZE_X = 128;\n\t\tstatic const int SIZE_Y = 128;\n\t\tstatic const NOISE_DATATYPE MUL = 80;\n\t\tstd::unique_ptr<NOISE_DATATYPE[]> arr(new NOISE_DATATYPE[SIZE_X * SIZE_Y]);\n\t\tcTimer timer;\n\n\t\t// Test the cInterpolNoise:\n\t\tcInterpolNoise<Interp5Deg> interpNoise(1);\n\t\tlong long start = timer.GetNowTime();\n\t\tfor (int i = 0; i < 500; i++)\n\t\t{\n\t\t\tinterpNoise.Generate2D(arr.get(), SIZE_X, SIZE_Y, MUL * i, MUL * i + MUL, 0, MUL);\n\t\t}\n\t\tlong long end = timer.GetNowTime();\n\t\tprintf(\"InterpolNoise took %.02f sec\\n\", static_cast<float>(end - start) / 1000);\n\n\t\t// Test the cCubicNoise:\n\t\tcCubicNoise cubicNoise(1);\n\t\tstart = timer.GetNowTime();\n\t\tfor (int i = 0; i < 500; i++)\n\t\t{\n\t\t\tcubicNoise.Generate2D(arr.get(), SIZE_X, SIZE_Y, MUL * i, MUL * i + MUL, 0, MUL);\n\t\t}\n\t\tend = timer.GetNowTime();\n\t\tprintf(\"CubicNoise took %.02f sec\\n\", static_cast<float>(end - start) / 1000);\n\t\tprintf(\"2D noise performance comparison finished.\\n\");\n\t}\n} g_InterpolNoiseSpeedTest;\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNoise3DGenerator:\n\ncNoise3DGenerator::cNoise3DGenerator():\n\tSuper(),\n\tm_Perlin(1000),\n\tm_Cubic(1000)\n{\n\tm_Perlin.AddOctave(1,  1);\n\tm_Perlin.AddOctave(2,  0.5);\n\tm_Perlin.AddOctave(4,  0.25);\n\tm_Perlin.AddOctave(8,  0.125);\n\tm_Perlin.AddOctave(16, 0.0625);\n\n\tm_Cubic.AddOctave(1,  1);\n\tm_Cubic.AddOctave(2,  0.5);\n\tm_Cubic.AddOctave(4,  0.25);\n\tm_Cubic.AddOctave(8,  0.125);\n\tm_Cubic.AddOctave(16, 0.0625);\n}\n\n\n\n\n\ncNoise3DGenerator::~cNoise3DGenerator()\n{\n\t// Nothing needed yet\n}\n\n\n\n\n\nvoid cNoise3DGenerator::Initialize(cIniFile & a_IniFile)\n{\n\t// Params:\n\tm_SeaLevel            =                 a_IniFile.GetValueSetI(\"Generator\", \"SeaLevel\", 62);\n\tm_HeightAmplification = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DHeightAmplification\", 0.1));\n\tm_MidPoint            = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DMidPoint\", 68));\n\tm_FrequencyX          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DFrequencyX\", 8));\n\tm_FrequencyY          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DFrequencyY\", 8));\n\tm_FrequencyZ          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DFrequencyZ\", 8));\n\tm_AirThreshold        = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DAirThreshold\", 0.5));\n}\n\n\n\n\n\nvoid cNoise3DGenerator::GenerateBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap)\n{\n\tUNUSED(a_ChunkCoords);\n\tfor (size_t i = 0; i < ARRAYCOUNT(a_BiomeMap); i++)\n\t{\n\t\ta_BiomeMap[i] = biExtremeHills;\n\t}\n}\n\n\n\n\n\nvoid cNoise3DGenerator::Generate(cChunkDesc & a_ChunkDesc)\n{\n\tNOISE_DATATYPE Noise[17 * 257 * 17];\n\tGenerateNoiseArray(a_ChunkDesc.GetChunkCoords(), Noise);\n\n\t// Output noise into chunk:\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t\t{\n\t\t\tint idx = z * 17 * 257 + y * 17;\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\tNOISE_DATATYPE n = Noise[idx++];\n\t\t\t\tBLOCKTYPE BlockType;\n\t\t\t\tif (n > m_AirThreshold)\n\t\t\t\t{\n\t\t\t\t\tBlockType = (y > m_SeaLevel) ? E_BLOCK_AIR : E_BLOCK_STATIONARY_WATER;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tBlockType = E_BLOCK_STONE;\n\t\t\t\t}\n\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, BlockType);\n\t\t\t}\n\t\t}\n\t}\n\n\ta_ChunkDesc.UpdateHeightmap();\n\tComposeTerrain (a_ChunkDesc);\n}\n\n\n\n\n\nvoid cNoise3DGenerator::GenerateNoiseArray(cChunkCoords a_ChunkCoords, NOISE_DATATYPE * a_OutNoise)\n{\n\tNOISE_DATATYPE NoiseO[DIM_X * DIM_Y * DIM_Z];  // Output for the Perlin noise\n\tNOISE_DATATYPE NoiseW[DIM_X * DIM_Y * DIM_Z];  // Workspace that the noise calculation can use and trash\n\n\t// Our noise array has different layout, XZY, instead of regular chunk's XYZ, that's why the coords are \"renamed\"\n\tNOISE_DATATYPE StartX = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkX       * cChunkDef::Width) / m_FrequencyX;\n\tNOISE_DATATYPE EndX   = static_cast<NOISE_DATATYPE>((a_ChunkCoords.m_ChunkX + 1) * cChunkDef::Width) / m_FrequencyX;\n\tNOISE_DATATYPE StartZ = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkZ       * cChunkDef::Width) / m_FrequencyZ;\n\tNOISE_DATATYPE EndZ   = static_cast<NOISE_DATATYPE>((a_ChunkCoords.m_ChunkZ + 1) * cChunkDef::Width) / m_FrequencyZ;\n\tNOISE_DATATYPE StartY = 0;\n\tNOISE_DATATYPE EndY   = static_cast<NOISE_DATATYPE>(256) / m_FrequencyY;\n\n\tm_Perlin.Generate3D(NoiseO, DIM_X, DIM_Y, DIM_Z, StartX, EndX, StartY, EndY, StartZ, EndZ, NoiseW);\n\n\t// Precalculate a \"height\" array:\n\tNOISE_DATATYPE Height[DIM_X * DIM_Z];  // Output for the cubic noise heightmap (\"source\")\n\tm_Cubic.Generate2D(Height, DIM_X, DIM_Z, StartX / 5, EndX / 5, StartZ / 5, EndZ / 5);\n\tfor (size_t i = 0; i < ARRAYCOUNT(Height); i++)\n\t{\n\t\tHeight[i] = Height[i] * m_HeightAmplification;\n\t}\n\n\t// Modify the noise by height data:\n\tfor (int y = 0; y < DIM_Y; y++)\n\t{\n\t\tNOISE_DATATYPE AddHeight = (y * UPSCALE_Y - m_MidPoint) / 30;\n\t\t// AddHeight *= AddHeight * AddHeight;\n\t\tfor (int z = 0; z < DIM_Z; z++)\n\t\t{\n\t\t\tNOISE_DATATYPE * CurRow = &(NoiseO[y * DIM_X + z * DIM_X * DIM_Y]);\n\t\t\tfor (int x = 0; x < DIM_X; x++)\n\t\t\t{\n\t\t\t\tCurRow[x] += AddHeight + Height[x + DIM_X * z];\n\t\t\t}\n\t\t}\n\t}\n\n\t// Upscale the Perlin noise into full-blown chunk dimensions:\n\tLinearUpscale3DArray(\n\t\tNoiseO, DIM_X, DIM_Y, DIM_Z,\n\t\ta_OutNoise, UPSCALE_X, UPSCALE_Y, UPSCALE_Z\n\t);\n}\n\n\n\n\n\nvoid cNoise3DGenerator::ComposeTerrain(cChunkDesc & a_ChunkDesc)\n{\n\t// Make basic terrain composition:\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tint LastAir = a_ChunkDesc.GetHeight(x, z) + 1;\n\t\t\tbool HasHadWater = false;\n\t\t\tfor (int y = LastAir - 1; y > 0; y--)\n\t\t\t{\n\t\t\t\tswitch (a_ChunkDesc.GetBlockType(x, y, z))\n\t\t\t\t{\n\t\t\t\t\tcase E_BLOCK_AIR:\n\t\t\t\t\t{\n\t\t\t\t\t\tLastAir = y;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase E_BLOCK_STONE:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (LastAir - y > 3)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (HasHadWater)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_SAND);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, (LastAir == y + 1) ? E_BLOCK_GRASS : E_BLOCK_DIRT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\t\t\t\t{\n\t\t\t\t\t\tLastAir = y;\n\t\t\t\t\t\tHasHadWater = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}  // switch (GetBlockType())\n\t\t\t}  // for y\n\t\t\ta_ChunkDesc.SetBlockType(x, 0, z, E_BLOCK_BEDROCK);\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNoise3DComposable:\n\ncNoise3DComposable::cNoise3DComposable(int a_Seed) :\n\tm_ChoiceNoise(a_Seed),\n\tm_DensityNoiseA(a_Seed + 1),\n\tm_DensityNoiseB(a_Seed + 2),\n\tm_BaseNoise(a_Seed + 3),\n\tm_HeightAmplification(0.0),\n\tm_MidPoint(0.0),\n\tm_FrequencyX(0.0),\n\tm_FrequencyY(0.0),\n\tm_FrequencyZ(0.0),\n\tm_BaseFrequencyX(0.0),\n\tm_BaseFrequencyZ(0.0),\n\tm_ChoiceFrequencyX(0.0),\n\tm_ChoiceFrequencyY(0.0),\n\tm_ChoiceFrequencyZ(0.0),\n\tm_AirThreshold(0.0),\n\tm_LastChunkCoords(0x7fffffff, 0x7fffffff)  // Use dummy coords that won't ever be used by real chunks\n{\n}\n\n\n\n\n\nvoid cNoise3DComposable::Initialize(cIniFile & a_IniFile)\n{\n\t// Params:\n\t// The defaults generate extreme hills terrain\n\tm_HeightAmplification = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DHeightAmplification\", 0.045));\n\tm_MidPoint            = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DMidPoint\", 75));\n\tm_FrequencyX          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DFrequencyX\", 40));\n\tm_FrequencyY          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DFrequencyY\", 40));\n\tm_FrequencyZ          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DFrequencyZ\", 40));\n\tm_BaseFrequencyX      = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DBaseFrequencyX\", 40));\n\tm_BaseFrequencyZ      = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DBaseFrequencyZ\", 40));\n\tm_ChoiceFrequencyX    = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DChoiceFrequencyX\", 40));\n\tm_ChoiceFrequencyY    = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DChoiceFrequencyY\", 80));\n\tm_ChoiceFrequencyZ    = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DChoiceFrequencyZ\", 40));\n\tm_AirThreshold        = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DAirThreshold\", 0));\n\tint NumChoiceOctaves  = a_IniFile.GetValueSetI(\"Generator\", \"Noise3DNumChoiceOctaves\",  4);\n\tint NumDensityOctaves = a_IniFile.GetValueSetI(\"Generator\", \"Noise3DNumDensityOctaves\", 6);\n\tint NumBaseOctaves    = a_IniFile.GetValueSetI(\"Generator\", \"Noise3DNumBaseOctaves\",    6);\n\tNOISE_DATATYPE BaseNoiseAmplitude = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"Noise3DBaseAmplitude\", 1));\n\n\t// Add octaves for the choice noise:\n\tNOISE_DATATYPE wavlen = 1, ampl = 0.5;\n\tfor (int i = 0; i < NumChoiceOctaves; i++)\n\t{\n\t\tm_ChoiceNoise.AddOctave(wavlen, ampl);\n\t\twavlen = wavlen * 2;\n\t\tampl = ampl / 2;\n\t}\n\n\t// Add octaves for the density noises:\n\twavlen = 1; ampl = 1;\n\tfor (int i = 0; i < NumDensityOctaves; i++)\n\t{\n\t\tm_DensityNoiseA.AddOctave(wavlen, ampl);\n\t\tm_DensityNoiseB.AddOctave(wavlen, ampl);\n\t\twavlen = wavlen * 2;\n\t\tampl = ampl / 2;\n\t}\n\n\t// Add octaves for the base noise:\n\twavlen = 1; ampl = BaseNoiseAmplitude;\n\tfor (int i = 0; i < NumBaseOctaves; i++)\n\t{\n\t\tm_BaseNoise.AddOctave(wavlen, ampl);\n\t\twavlen = wavlen * 2;\n\t\tampl = ampl / 2;\n\t}\n}\n\n\n\n\n\nvoid cNoise3DComposable::GenerateNoiseArrayIfNeeded(cChunkCoords a_ChunkCoords)\n{\n\tif (a_ChunkCoords == m_LastChunkCoords)\n\t{\n\t\t// The noise for this chunk is already generated in m_NoiseArray\n\t\treturn;\n\t}\n\tm_LastChunkCoords = a_ChunkCoords;\n\n\t// Generate all the noises:\n\tNOISE_DATATYPE ChoiceNoise[5 * 5 * 33];\n\tNOISE_DATATYPE Workspace[5 * 5 * 33];\n\tNOISE_DATATYPE DensityNoiseA[5 * 5 * 33];\n\tNOISE_DATATYPE DensityNoiseB[5 * 5 * 33];\n\tNOISE_DATATYPE BaseNoise[5 * 5];\n\tNOISE_DATATYPE BlockX = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkX * cChunkDef::Width);\n\tNOISE_DATATYPE BlockZ = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkZ * cChunkDef::Width);\n\t// Note that we have to swap the X and Y coords, because noise generator uses [x + SizeX * y + SizeX * SizeY * z] ordering and we want \"BlockY\" to be \"x\":\n\tm_ChoiceNoise.Generate3D  (ChoiceNoise,   33, 5, 5, 0, 257 / m_ChoiceFrequencyY, BlockX / m_ChoiceFrequencyX, (BlockX + 17) / m_ChoiceFrequencyX, BlockZ / m_ChoiceFrequencyZ, (BlockZ + 17) / m_ChoiceFrequencyZ, Workspace);\n\tm_DensityNoiseA.Generate3D(DensityNoiseA, 33, 5, 5, 0, 257 / m_FrequencyY,       BlockX / m_FrequencyX,       (BlockX + 17) / m_FrequencyX,       BlockZ / m_FrequencyZ,       (BlockZ + 17) / m_FrequencyZ,       Workspace);\n\tm_DensityNoiseB.Generate3D(DensityNoiseB, 33, 5, 5, 0, 257 / m_FrequencyY,       BlockX / m_FrequencyX,       (BlockX + 17) / m_FrequencyX,       BlockZ / m_FrequencyZ,       (BlockZ + 17) / m_FrequencyZ,       Workspace);\n\tm_BaseNoise.Generate2D    (BaseNoise,     5, 5,     BlockX / m_BaseFrequencyX,   (BlockX + 17) / m_BaseFrequencyX,   BlockZ / m_FrequencyZ,       (BlockZ + 17) / m_FrequencyZ, Workspace);\n\n\t// Calculate the final noise based on the partial noises:\n\tfor (int z = 0; z < 5; z++)\n\t{\n\t\tfor (int x = 0; x < 5; x++)\n\t\t{\n\t\t\tNOISE_DATATYPE curBaseNoise = BaseNoise[x + 5 * z];\n\t\t\tfor (int y = 0; y < 33; y++)\n\t\t\t{\n\t\t\t\tNOISE_DATATYPE AddHeight = (static_cast<NOISE_DATATYPE>(y * 8) - m_MidPoint) * m_HeightAmplification;\n\n\t\t\t\t// If \"underground\", make the terrain smoother by forcing the vertical linear gradient into steeper slope:\n\t\t\t\tif (AddHeight < 0)\n\t\t\t\t{\n\t\t\t\t\tAddHeight *= 4;\n\t\t\t\t}\n\n\t\t\t\t// If too high, cut off any terrain:\n\t\t\t\tif (y > 28)\n\t\t\t\t{\n\t\t\t\t\tAddHeight = AddHeight + static_cast<NOISE_DATATYPE>(y - 28) / 4;\n\t\t\t\t}\n\n\t\t\t\t// Decide between the two density noises:\n\t\t\t\tint idx = 33 * x + 33 * 5 * z + y;\n\t\t\t\tWorkspace[idx] = ClampedLerp(DensityNoiseA[idx], DensityNoiseB[idx], 8 * (ChoiceNoise[idx] + 0.5f)) + AddHeight + curBaseNoise;\n\t\t\t}\n\t\t}\n\t}\n\tLinearUpscale3DArray<NOISE_DATATYPE>(Workspace, 33, 5, 5, m_NoiseArray, 8, 4, 4);\n}\n\n\n\n\n\nvoid cNoise3DComposable::GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape)\n{\n\tGenerateNoiseArrayIfNeeded(a_ChunkCoords);\n\n\t// Translate the noise array into Shape:\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t\t\t{\n\t\t\t\ta_Shape[y + x * 256 + z * 256 * 16] = (m_NoiseArray[y + 257 * x + 257 * 17 * z] > m_AirThreshold) ? 0 : 1;\n\t\t\t}\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBiomalNoise3DComposable:\n\ncBiomalNoise3DComposable::cBiomalNoise3DComposable(int a_Seed, cBiomeGen & a_BiomeGen) :\n\tm_ChoiceNoise(a_Seed),\n\tm_DensityNoiseA(a_Seed + 1),\n\tm_DensityNoiseB(a_Seed + 2),\n\tm_BaseNoise(a_Seed + 3),\n\tm_BiomeGen(a_BiomeGen),\n\tm_LastChunkCoords(0x7fffffff, 0x7fffffff)  // Set impossible coords for the chunk so that it's always considered stale\n{\n\t// Generate the weight distribution for summing up neighboring biomes:\n\tm_WeightSum = 0;\n\tfor (int z = 0; z <= AVERAGING_SIZE * 2; z++)\n\t{\n\t\tfor (int x = 0; x <= AVERAGING_SIZE * 2; x++)\n\t\t{\n\t\t\tm_Weight[z][x] = static_cast<NOISE_DATATYPE>((AVERAGING_SIZE - std::abs(AVERAGING_SIZE - x)) + (AVERAGING_SIZE - std::abs(AVERAGING_SIZE - z)));\n\t\t\tm_WeightSum += m_Weight[z][x];\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBiomalNoise3DComposable::Initialize(cIniFile & a_IniFile)\n{\n\t// Params:\n\t// The defaults generate extreme hills terrain\n\tm_SeaLevel            =                 a_IniFile.GetValueSetI(\"Generator\", \"SeaLevel\", 62);\n\tm_FrequencyX          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DFrequencyX\", 40));\n\tm_FrequencyY          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DFrequencyY\", 40));\n\tm_FrequencyZ          = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DFrequencyZ\", 40));\n\tm_BaseFrequencyX      = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DBaseFrequencyX\", 40));\n\tm_BaseFrequencyZ      = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DBaseFrequencyZ\", 40));\n\tm_ChoiceFrequencyX    = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DChoiceFrequencyX\", 40));\n\tm_ChoiceFrequencyY    = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DChoiceFrequencyY\", 80));\n\tm_ChoiceFrequencyZ    = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DChoiceFrequencyZ\", 40));\n\tm_AirThreshold        = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DAirThreshold\", 0));\n\tint NumChoiceOctaves  = a_IniFile.GetValueSetI(\"Generator\", \"BiomalNoise3DNumChoiceOctaves\",  4);\n\tint NumDensityOctaves = a_IniFile.GetValueSetI(\"Generator\", \"BiomalNoise3DNumDensityOctaves\", 6);\n\tint NumBaseOctaves    = a_IniFile.GetValueSetI(\"Generator\", \"BiomalNoise3DNumBaseOctaves\",    6);\n\tNOISE_DATATYPE BaseNoiseAmplitude = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"BiomalNoise3DBaseAmplitude\", 1));\n\n\t// Add octaves for the choice noise:\n\tNOISE_DATATYPE wavlen = 1, ampl = 0.5;\n\tfor (int i = 0; i < NumChoiceOctaves; i++)\n\t{\n\t\tm_ChoiceNoise.AddOctave(wavlen, ampl);\n\t\twavlen = wavlen * 2;\n\t\tampl = ampl / 2;\n\t}\n\n\t// Add octaves for the density noises:\n\twavlen = 1; ampl = 1;\n\tfor (int i = 0; i < NumDensityOctaves; i++)\n\t{\n\t\tm_DensityNoiseA.AddOctave(wavlen, ampl);\n\t\tm_DensityNoiseB.AddOctave(wavlen, ampl);\n\t\twavlen = wavlen * 2;\n\t\tampl = ampl / 2;\n\t}\n\n\t// Add octaves for the base noise:\n\twavlen = 1; ampl = BaseNoiseAmplitude;\n\tfor (int i = 0; i < NumBaseOctaves; i++)\n\t{\n\t\tm_BaseNoise.AddOctave(wavlen, ampl);\n\t\twavlen = wavlen * 2;\n\t\tampl = ampl / 2;\n\t}\n}\n\n\n\n\n\nvoid cBiomalNoise3DComposable::GenerateNoiseArrayIfNeeded(cChunkCoords a_ChunkCoords)\n{\n\tif (a_ChunkCoords == m_LastChunkCoords)\n\t{\n\t\t// The noise for this chunk is already generated in m_NoiseArray\n\t\treturn;\n\t}\n\tm_LastChunkCoords = a_ChunkCoords;\n\n\t// Calculate the parameters for the biomes:\n\tChunkParam MidPoint;\n\tChunkParam HeightAmp;\n\tCalcBiomeParamArrays(a_ChunkCoords, HeightAmp, MidPoint);\n\n\t// Generate all the noises:\n\tNOISE_DATATYPE ChoiceNoise[5 * 5 * 33];\n\tNOISE_DATATYPE Workspace[5 * 5 * 33];\n\tNOISE_DATATYPE DensityNoiseA[5 * 5 * 33];\n\tNOISE_DATATYPE DensityNoiseB[5 * 5 * 33];\n\tNOISE_DATATYPE BaseNoise[5 * 5];\n\tNOISE_DATATYPE BlockX = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkX * cChunkDef::Width);\n\tNOISE_DATATYPE BlockZ = static_cast<NOISE_DATATYPE>(a_ChunkCoords.m_ChunkZ * cChunkDef::Width);\n\t// Note that we have to swap the X and Y coords, because noise generator uses [x + SizeX * y + SizeX * SizeY * z] ordering and we want \"BlockY\" to be \"x\":\n\tm_ChoiceNoise.Generate3D  (ChoiceNoise,   33, 5, 5, 0, 257 / m_ChoiceFrequencyY, BlockX / m_ChoiceFrequencyX, (BlockX + 17) / m_ChoiceFrequencyX, BlockZ / m_ChoiceFrequencyZ, (BlockZ + 17) / m_ChoiceFrequencyZ, Workspace);\n\tm_DensityNoiseA.Generate3D(DensityNoiseA, 33, 5, 5, 0, 257 / m_FrequencyY,       BlockX / m_FrequencyX,       (BlockX + 17) / m_FrequencyX,       BlockZ / m_FrequencyZ,       (BlockZ + 17) / m_FrequencyZ,       Workspace);\n\tm_DensityNoiseB.Generate3D(DensityNoiseB, 33, 5, 5, 0, 257 / m_FrequencyY,       BlockX / m_FrequencyX,       (BlockX + 17) / m_FrequencyX,       BlockZ / m_FrequencyZ,       (BlockZ + 17) / m_FrequencyZ,       Workspace);\n\tm_BaseNoise.Generate2D    (BaseNoise,     5, 5,     BlockX / m_BaseFrequencyX,   (BlockX + 17) / m_BaseFrequencyX,   BlockZ / m_FrequencyZ,       (BlockZ + 17) / m_FrequencyZ, Workspace);\n\n\t// Calculate the final noise based on the partial noises:\n\tfor (int z = 0; z < 5; z++)\n\t{\n\t\tfor (int x = 0; x < 5; x++)\n\t\t{\n\t\t\tNOISE_DATATYPE curMidPoint = MidPoint[x + 5 * z];\n\t\t\tNOISE_DATATYPE curHeightAmp = HeightAmp[x + 5 * z];\n\t\t\tNOISE_DATATYPE curBaseNoise = BaseNoise[x + 5 * z];\n\t\t\tfor (int y = 0; y < 33; y++)\n\t\t\t{\n\t\t\t\tNOISE_DATATYPE AddHeight = (static_cast<NOISE_DATATYPE>(y * 8) - curMidPoint) * curHeightAmp;\n\n\t\t\t\t// If \"underground\", make the terrain smoother by forcing the vertical linear gradient into steeper slope:\n\t\t\t\tif (AddHeight < 0)\n\t\t\t\t{\n\t\t\t\t\tAddHeight *= 4;\n\t\t\t\t}\n\t\t\t\t// If too high, cut off any terrain:\n\t\t\t\tif (y > 28)\n\t\t\t\t{\n\t\t\t\t\tAddHeight = AddHeight + static_cast<NOISE_DATATYPE>(y - 28) / 4;\n\t\t\t\t}\n\n\t\t\t\t// Decide between the two density noises:\n\t\t\t\tint idx = 33 * x + y + 33 * 5 * z;\n\t\t\t\tWorkspace[idx] = ClampedLerp(DensityNoiseA[idx], DensityNoiseB[idx], 8 * (ChoiceNoise[idx] + 0.5f)) + AddHeight + curBaseNoise;\n\t\t\t}\n\t\t}\n\t}\n\tLinearUpscale3DArray<NOISE_DATATYPE>(Workspace, 33, 5, 5, m_NoiseArray, 8, 4, 4);\n}\n\n\n\n\n\nvoid cBiomalNoise3DComposable::CalcBiomeParamArrays(cChunkCoords a_ChunkCoords, ChunkParam & a_HeightAmp, ChunkParam & a_MidPoint)\n{\n\t// Generate the 3 * 3 chunks of biomes around this chunk:\n\tcChunkDef::BiomeMap neighborBiomes[3 * 3];\n\tfor (int z = 0; z < 3; z++)\n\t{\n\t\tfor (int x = 0; x < 3; x++)\n\t\t{\n\t\t\tm_BiomeGen.GenBiomes({a_ChunkCoords.m_ChunkX + x - 1, a_ChunkCoords.m_ChunkZ + z - 1}, neighborBiomes[x + 3 * z]);\n\t\t}\n\t}\n\n\t// Sum up the biome values:\n\tfor (int z = 0; z < 5; z++)\n\t{\n\t\tfor (int x = 0; x < 5; x++)\n\t\t{\n\t\t\tNOISE_DATATYPE totalHeightAmp = 0;\n\t\t\tNOISE_DATATYPE totalMidPoint = 0;\n\t\t\t// Add up the biomes around this point:\n\t\t\tfor (int relz = 0; relz <= AVERAGING_SIZE * 2; ++relz)\n\t\t\t{\n\t\t\t\tint colz = 16 + z * 4 + relz - AVERAGING_SIZE;   // Biome Z coord relative to the neighborBiomes start\n\t\t\t\tint neicellz = colz / 16;\t                       // Chunk Z coord relative to the neighborBiomes start\n\t\t\t\tint neirelz  = colz % 16;\t                       // Biome Z coord relative to cz in neighborBiomes\n\t\t\t\tfor (int relx = 0; relx <= AVERAGING_SIZE * 2; ++relx)\n\t\t\t\t{\n\t\t\t\t\tint colx = 16 + x * 4 + relx - AVERAGING_SIZE;   // Biome X coord relative to the neighborBiomes start\n\t\t\t\t\tint neicellx = colx / 16;\t                       // Chunk X coord relative to the neighborBiomes start\n\t\t\t\t\tint neirelx  = colx % 16;\t                       // Biome X coord relative to cz in neighborBiomes\n\t\t\t\t\tEMCSBiome biome = cChunkDef::GetBiome(neighborBiomes[neicellx + neicellz * 3], neirelx, neirelz);\n\t\t\t\t\tNOISE_DATATYPE heightAmp, midPoint;\n\t\t\t\t\tGetBiomeParams(biome, heightAmp, midPoint);\n\t\t\t\t\ttotalHeightAmp += heightAmp * m_Weight[relz][relx];\n\t\t\t\t\ttotalMidPoint += midPoint * m_Weight[relz][relx];\n\t\t\t\t}  // for relx\n\t\t\t}  // for relz\n\t\t\ta_HeightAmp[x + 5 * z] = totalHeightAmp / m_WeightSum;\n\t\t\ta_MidPoint[x + 5 * z] = totalMidPoint / m_WeightSum;\n\t\t}  // for x\n\t}  // for z\n}\n\n\n\n\n\nvoid cBiomalNoise3DComposable::GetBiomeParams(EMCSBiome a_Biome, NOISE_DATATYPE & a_HeightAmp, NOISE_DATATYPE & a_MidPoint)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biBeach:                a_HeightAmp = 0.2f;   a_MidPoint =  60; break;\n\t\tcase biBirchForest:          a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biBirchForestHills:     a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biBirchForestHillsM:    a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biBirchForestM:         a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biColdBeach:            a_HeightAmp = 0.3f;   a_MidPoint =  62; break;\n\t\tcase biColdTaiga:            a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biColdTaigaM:           a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biColdTaigaHills:       a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biDesertHills:          a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biDeepOcean:            a_HeightAmp = 0.17f;  a_MidPoint =  35; break;\n\t\tcase biDesert:               a_HeightAmp = 0.29f;  a_MidPoint =  62; break;\n\t\tcase biDesertM:              a_HeightAmp = 0.29f;  a_MidPoint =  62; break;\n\t\tcase biEnd:                  a_HeightAmp = 0.15f;  a_MidPoint =  64; break;\n\t\tcase biExtremeHills:         a_HeightAmp = 0.045f; a_MidPoint =  75; break;\n\t\tcase biExtremeHillsEdge:     a_HeightAmp = 0.1f;   a_MidPoint =  70; break;\n\t\tcase biExtremeHillsM:        a_HeightAmp = 0.045f; a_MidPoint =  75; break;\n\t\tcase biExtremeHillsPlus:     a_HeightAmp = 0.04f;  a_MidPoint =  80; break;\n\t\tcase biExtremeHillsPlusM:    a_HeightAmp = 0.04f;  a_MidPoint =  80; break;\n\t\tcase biFlowerForest:         a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biForest:               a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biForestHills:          a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biFrozenRiver:          a_HeightAmp = 0.4f;   a_MidPoint =  54; break;\n\t\tcase biFrozenOcean:          a_HeightAmp = 0.12f;  a_MidPoint =  45; break;\n\t\tcase biIceMountains:         a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biIcePlains:            a_HeightAmp = 0.3f;   a_MidPoint =  62; break;\n\t\tcase biIcePlainsSpikes:      a_HeightAmp = 0.3f;   a_MidPoint =  62; break;\n\t\tcase biJungle:               a_HeightAmp = 0.1f;   a_MidPoint =  63; break;\n\t\tcase biJungleEdge:           a_HeightAmp = 0.15f;  a_MidPoint =  62; break;\n\t\tcase biJungleEdgeM:          a_HeightAmp = 0.15f;  a_MidPoint =  62; break;\n\t\tcase biJungleHills:          a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biJungleM:              a_HeightAmp = 0.1f;   a_MidPoint =  63; break;\n\t\tcase biMegaSpruceTaiga:      a_HeightAmp = 0.09f;  a_MidPoint =  64; break;\n\t\tcase biMegaSpruceTaigaHills: a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biMegaTaiga:            a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biMegaTaigaHills:       a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biMesa:                 a_HeightAmp = 0.09f;  a_MidPoint =  61; break;\n\t\tcase biMesaBryce:            a_HeightAmp = 0.15f;  a_MidPoint =  61; break;\n\t\tcase biMesaPlateau:          a_HeightAmp = 0.25f;  a_MidPoint =  86; break;\n\t\tcase biMesaPlateauF:         a_HeightAmp = 0.25f;  a_MidPoint =  96; break;\n\t\tcase biMesaPlateauFM:        a_HeightAmp = 0.25f;  a_MidPoint =  96; break;\n\t\tcase biMesaPlateauM:         a_HeightAmp = 0.25f;  a_MidPoint =  86; break;\n\t\tcase biMushroomShore:        a_HeightAmp = 0.075f; a_MidPoint =  60; break;\n\t\tcase biMushroomIsland:       a_HeightAmp = 0.06f;  a_MidPoint =  80; break;\n\t\tcase biNether:               a_HeightAmp = 0.01f;  a_MidPoint =  64; break;\n\t\tcase biOcean:                a_HeightAmp = 0.12f;  a_MidPoint =  45; break;\n\t\tcase biPlains:               a_HeightAmp = 0.3f;   a_MidPoint =  62; break;\n\t\tcase biRiver:                a_HeightAmp = 0.4f;   a_MidPoint =  54; break;\n\t\tcase biRoofedForest:         a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biRoofedForestM:        a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biSavanna:              a_HeightAmp = 0.3f;   a_MidPoint =  62; break;\n\t\tcase biSavannaM:             a_HeightAmp = 0.3f;   a_MidPoint =  62; break;\n\t\tcase biSavannaPlateau:       a_HeightAmp = 0.3f;   a_MidPoint =  85; break;\n\t\tcase biSavannaPlateauM:      a_HeightAmp = 0.012f; a_MidPoint = 105; break;\n\t\tcase biStoneBeach:           a_HeightAmp = 0.075f; a_MidPoint =  60; break;\n\t\tcase biSunflowerPlains:      a_HeightAmp = 0.3f;   a_MidPoint =  62; break;\n\t\tcase biSwampland:            a_HeightAmp = 0.25f;  a_MidPoint =  59; break;\n\t\tcase biSwamplandM:           a_HeightAmp = 0.11f;  a_MidPoint =  59; break;\n\t\tcase biTaiga:                a_HeightAmp = 0.1f;   a_MidPoint =  64; break;\n\t\tcase biTaigaM:               a_HeightAmp = 0.1f;   a_MidPoint =  70; break;\n\t\tcase biTaigaHills:           a_HeightAmp = 0.075f; a_MidPoint =  68; break;\n\t\tcase biInvalidBiome:\n\t\tcase biNumBiomes:\n\t\tcase biVariant:\n\t\tcase biNumVariantBiomes:\n\t\t{\n\t\t\t// Make a crazy terrain so that it stands out\n\t\t\ta_HeightAmp = 0.001f;\n\t\t\ta_MidPoint = 90;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cBiomalNoise3DComposable::GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape)\n{\n\tGenerateNoiseArrayIfNeeded(a_ChunkCoords);\n\n\t// Translate the noise array into Shape:\n\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t{\n\t\t\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t\t\t{\n\t\t\t\ta_Shape[y + x * 256 + z * 256 * 16] = (m_NoiseArray[y + 257 * x + 257 * 17 * z] > m_AirThreshold) ? 0 : 1;\n\t\t\t}\n\t\t}  // for x\n\t}  // for z\n}\n"
  },
  {
    "path": "src/Generating/Noise3DGenerator.h",
    "content": "\n// Noise3DGenerator.h\n\n// Declares cNoise3DGenerator and cNoise3DComposable classes, representing 3D-noise-based generators.\n// They generate terrain shape by combining a lerp of two 3D noises with a vertical linear gradient\n// cNoise3DGenerator is obsolete and unmaintained.\n// cNoise3DComposable is used to test parameter combinations for single-biome worlds.\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Noise/Noise.h\"\n#include \"../Noise/InterpolNoise.h\"\n\n\n\n\n\nclass cNoise3DGenerator:\n\tpublic cChunkGenerator\n{\n\tusing Super = cChunkGenerator;\n\npublic:\n\n\tcNoise3DGenerator();\n\tvirtual ~cNoise3DGenerator() override;\n\n\tvirtual void Initialize(cIniFile & a_IniFile) override;\n\tvirtual void GenerateBiomes(cChunkCoords a_ChunkCoords, cChunkDef::BiomeMap & a_BiomeMap) override;\n\tvirtual void Generate(cChunkDesc & a_ChunkDesc) override;\n\nprotected:\n\t// Linear interpolation step sizes, must be divisors of cChunkDef::Width and cChunkDef::Height, respectively:\n\tstatic const int UPSCALE_X = 4;\n\tstatic const int UPSCALE_Y = 8;\n\tstatic const int UPSCALE_Z = 4;\n\n\t// Linear interpolation buffer dimensions, calculated from the step sizes:\n\tstatic const int DIM_X = 1 + cChunkDef::Width  / UPSCALE_X;\n\tstatic const int DIM_Y = 1 + cChunkDef::Height / UPSCALE_Y;\n\tstatic const int DIM_Z = 1 + cChunkDef::Width  / UPSCALE_Z;\n\n\t/** The base 3D noise source for the actual composition */\n\tcOctavedNoise<cInterp5DegNoise> m_Perlin;\n\n\t/** The noise used for heightmap directing. */\n\tcOctavedNoise<cInterp5DegNoise> m_Cubic;\n\n\tint            m_SeaLevel;\n\tNOISE_DATATYPE m_HeightAmplification;\n\tNOISE_DATATYPE m_MidPoint;  // Where the vertical \"center\" of the noise should be\n\tNOISE_DATATYPE m_FrequencyX;\n\tNOISE_DATATYPE m_FrequencyY;\n\tNOISE_DATATYPE m_FrequencyZ;\n\tNOISE_DATATYPE m_AirThreshold;\n\n\t/** Generates the 3D noise array used for terrain generation into a_Noise; a_Noise is of ChunkData-size */\n\tvoid GenerateNoiseArray(cChunkCoords a_ChunkCoords, NOISE_DATATYPE * a_Noise);\n\n\t/** Composes terrain - adds dirt, grass and sand */\n\tvoid ComposeTerrain(cChunkDesc & a_ChunkDesc);\n} ;\n\n\n\n\n\nclass cNoise3DComposable :\n\tpublic cTerrainShapeGen\n{\npublic:\n\tcNoise3DComposable(int a_Seed);\n\n\tvoid Initialize(cIniFile & a_IniFile);\n\nprotected:\n\t/** The 3D noise that is used to choose between density noise A and B. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_ChoiceNoise;\n\n\t/** Density 3D noise, variant A. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_DensityNoiseA;\n\n\t/** Density 3D noise, variant B. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_DensityNoiseB;\n\n\t/** Heightmap-like noise used to provide variance for low-amplitude biomes. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_BaseNoise;\n\n\t/** The main parameter of the generator, specifies the slope of the vertical linear gradient.\n\tA higher value means a steeper slope and a smaller total amplitude of the generated terrain. */\n\tNOISE_DATATYPE m_HeightAmplification;\n\n\t/** Where the vertical \"center\" of the noise should be, as block height. */\n\tNOISE_DATATYPE m_MidPoint;\n\n\t// Frequency of the 3D noise's first octave:\n\tNOISE_DATATYPE m_FrequencyX;\n\tNOISE_DATATYPE m_FrequencyY;\n\tNOISE_DATATYPE m_FrequencyZ;\n\n\t// Frequency of the base terrain noise:\n\tNOISE_DATATYPE m_BaseFrequencyX;\n\tNOISE_DATATYPE m_BaseFrequencyZ;\n\n\t// Frequency of the choice noise:\n\tNOISE_DATATYPE m_ChoiceFrequencyX;\n\tNOISE_DATATYPE m_ChoiceFrequencyY;\n\tNOISE_DATATYPE m_ChoiceFrequencyZ;\n\n\t// Threshold for when the values are considered air:\n\tNOISE_DATATYPE m_AirThreshold;\n\n\t// Cache for the last calculated chunk (reused between heightmap and composition queries):\n\tcChunkCoords m_LastChunkCoords;\n\tNOISE_DATATYPE m_NoiseArray[17 * 17 * 257];  // x + 17 * z + 17 * 17 * y\n\n\n\t/** Generates the 3D noise array used for terrain generation (m_NoiseArray), unless the LastChunk coords are equal to coords given */\n\tvoid GenerateNoiseArrayIfNeeded(cChunkCoords a_ChunkCoords);\n\n\t// cTerrainHeightGen overrides:\n\tvirtual void GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape) override;\n\tvirtual void InitializeShapeGen(cIniFile & a_IniFile) override { Initialize(a_IniFile); }\n} ;\n\n\n\n\n\nclass cBiomalNoise3DComposable :\n\tpublic cTerrainShapeGen\n{\npublic:\n\tcBiomalNoise3DComposable(int a_Seed, cBiomeGen & a_BiomeGen);\n\n\tvoid Initialize(cIniFile & a_IniFile);\n\nprotected:\n\t/** Number of columns around the pixel to query for biomes for averaging. Must be less than or equal to 16. */\n\tstatic const int AVERAGING_SIZE = 9;\n\n\t/** Type used for a single parameter across the entire (downscaled) chunk. */\n\ttypedef NOISE_DATATYPE ChunkParam[5 * 5];\n\n\n\t/** The noise that is used to choose between density noise A and B. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_ChoiceNoise;\n\n\t/** Density 3D noise, variant A. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_DensityNoiseA;\n\n\t/** Density 3D noise, variant B. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_DensityNoiseB;\n\n\t/** Heightmap-like noise used to provide variance for low-amplitude biomes. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_BaseNoise;\n\n\t/** The underlying biome generator. */\n\tcBiomeGen & m_BiomeGen;\n\n\t/** Block height of the sealevel, used for composing the terrain. */\n\tint m_SeaLevel;\n\n\t// Frequency of the 3D noise's first octave:\n\tNOISE_DATATYPE m_FrequencyX;\n\tNOISE_DATATYPE m_FrequencyY;\n\tNOISE_DATATYPE m_FrequencyZ;\n\n\t// Frequency of the base terrain noise:\n\tNOISE_DATATYPE m_BaseFrequencyX;\n\tNOISE_DATATYPE m_BaseFrequencyZ;\n\n\t// Frequency of the choice noise:\n\tNOISE_DATATYPE m_ChoiceFrequencyX;\n\tNOISE_DATATYPE m_ChoiceFrequencyY;\n\tNOISE_DATATYPE m_ChoiceFrequencyZ;\n\n\t// Threshold for when the values are considered air:\n\tNOISE_DATATYPE m_AirThreshold;\n\n\t// Cache for the last calculated chunk (reused between heightmap and composition queries):\n\tcChunkCoords m_LastChunkCoords;\n\tNOISE_DATATYPE m_NoiseArray[17 * 17 * 257];  // 257 * x + y + 257 * 17 * z\n\n\t/** Weights for summing up neighboring biomes. */\n\tNOISE_DATATYPE m_Weight[AVERAGING_SIZE * 2 + 1][AVERAGING_SIZE * 2 + 1];\n\n\t/** The sum of m_Weight[]. */\n\tNOISE_DATATYPE m_WeightSum;\n\n\n\t/** Generates the 3D noise array used for terrain generation (m_NoiseArray), unless the LastChunk coords are equal to coords given */\n\tvoid GenerateNoiseArrayIfNeeded(cChunkCoords a_ChunkCoords);\n\n\t/** Calculates the biome-related parameters for the chunk. */\n\tvoid CalcBiomeParamArrays(cChunkCoords a_ChunkCoords, ChunkParam & a_HeightAmp, ChunkParam & a_MidPoint);\n\n\t/** Returns the parameters for the specified biome. */\n\tvoid GetBiomeParams(EMCSBiome a_Biome, NOISE_DATATYPE & a_HeightAmp, NOISE_DATATYPE & a_MidPoint);\n\n\t// cTerrainShapeGen overrides:\n\tvirtual void GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape) override;\n\tvirtual void InitializeShapeGen(cIniFile & a_IniFile) override { Initialize(a_IniFile); }\n} ;\n"
  },
  {
    "path": "src/Generating/PieceGeneratorBFSTree.cpp",
    "content": "\n// PieceGeneratorBFSTree.cpp\n\n// Implements the cPieceGeneratorBFSTree class for generating structures composed of individual \"pieces\" in a simple tree\n/*\nThe generator keeps a pool of currently-open connectors, chooses one at random and tries to place a piece on it,\nthus possibly extending the pool of open connectors with the new piece's ones (like breadth-first search).\n*/\n\n#include \"Globals.h\"\n#include \"PieceGeneratorBFSTree.h\"\n#include \"VerticalStrategy.h\"\n#include \"VerticalLimit.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPieceGeneratorBFSTree:\n\ncPieceGeneratorBFSTree::cPieceGeneratorBFSTree(cPiecePool & a_PiecePool, int a_Seed):\n\tm_PiecePool(a_PiecePool),\n\tm_Noise(a_Seed),\n\tm_Seed(a_Seed)\n{\n}\n\n\n\n\n\ncPlacedPiecePtr cPieceGeneratorBFSTree::PlaceStartingPiece(int a_BlockX, int a_BlockZ, cFreeConnectors & a_OutConnectors)\n{\n\tm_PiecePool.Reset();\n\tint rnd = m_Noise.IntNoise2DInt(a_BlockX, a_BlockZ) / 7;\n\n\t// Choose a random one of the starting pieces:\n\tcPieces StartingPieces = m_PiecePool.GetStartingPieces();\n\tint Total = 0;\n\tfor (cPieces::const_iterator itr = StartingPieces.begin(), end = StartingPieces.end(); itr != end; ++itr)\n\t{\n\t\tTotal += m_PiecePool.GetStartingPieceWeight(**itr);\n\t}\n\tcPiece * StartingPiece;\n\tif (Total > 0)\n\t{\n\t\tint Chosen = rnd % Total;\n\t\tStartingPiece = StartingPieces.front();\n\t\tfor (cPieces::const_iterator itr = StartingPieces.begin(), end = StartingPieces.end(); itr != end; ++itr)\n\t\t{\n\t\t\tChosen -= m_PiecePool.GetStartingPieceWeight(**itr);\n\t\t\tif (Chosen <= 0)\n\t\t\t{\n\t\t\t\tStartingPiece = *itr;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// All pieces returned zero weight, but we need one to start. Choose with equal chance:\n\t\tStartingPiece = StartingPieces[static_cast<size_t>(rnd) % StartingPieces.size()];\n\t}\n\trnd = rnd >> 16;\n\n\t// Choose a random supported rotation:\n\tint Rotations[4] = {0};\n\tint NumRotations = 1;\n\tfor (size_t i = 1; i < ARRAYCOUNT(Rotations); i++)\n\t{\n\t\tif (StartingPiece->CanRotateCCW(static_cast<int>(i)))\n\t\t{\n\t\t\tRotations[NumRotations] = static_cast<int>(i);\n\t\t\tNumRotations += 1;\n\t\t}\n\t}\n\tint Rotation = Rotations[rnd % NumRotations];\n\tint BlockY = StartingPiece->GetStartingPieceHeight(a_BlockX, a_BlockZ);\n\tASSERT(BlockY >= 0);  // The vertical strategy should have been provided and should give valid coords\n\n\tcPlacedPiece * res = new cPlacedPiece(nullptr, *StartingPiece, Vector3i(a_BlockX, BlockY, a_BlockZ), Rotation);\n\n\t// Place the piece's connectors into a_OutConnectors:\n\tconst cPiece::cConnectors & Conn = StartingPiece->GetConnectors();\n\tfor (cPiece::cConnectors::const_iterator itr = Conn.begin(), end = Conn.end(); itr != end; ++itr)\n\t{\n\t\ta_OutConnectors.push_back(\n\t\t\tcFreeConnector(res, StartingPiece->RotateMoveConnector(*itr, Rotation, a_BlockX, BlockY, a_BlockZ))\n\t\t);\n\t}\n\n\treturn cPlacedPiecePtr(res);\n}\n\n\n\n\n\nbool cPieceGeneratorBFSTree::TryPlacePieceAtConnector(\n\tconst cPlacedPiece & a_ParentPiece,\n\tconst cPiece::cConnector & a_Connector,\n\tcPlacedPieces & a_OutPieces,\n\tcPieceGeneratorBFSTree::cFreeConnectors & a_OutConnectors\n)\n{\n\t// Get a list of available connections:\n\tcConnections Connections;\n\tint WantedConnectorType = -a_Connector.m_Type;\n\tcPieces AvailablePieces = m_PiecePool.GetPiecesWithConnector(WantedConnectorType);\n\tConnections.reserve(AvailablePieces.size());\n\tVector3i ConnPos = cPiece::cConnector::AddDirection(a_Connector.m_Pos, a_Connector.m_Direction);  // The position at which the new connector should be placed - 1 block away from the current connector\n\tint WeightTotal = 0;\n\tfor (cPieces::iterator itrP = AvailablePieces.begin(), endP = AvailablePieces.end(); itrP != endP; ++itrP)\n\t{\n\t\t// Get the relative chance of this piece being generated in this path:\n\t\tint Weight = m_PiecePool.GetPieceWeight(a_ParentPiece, a_Connector, **itrP);\n\t\tif (Weight <= 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Try fitting each of the piece's connector:\n\t\tcPiece::cConnectors Connectors = (*itrP)->GetConnectors();\n\t\tauto verticalLimit = (*itrP)->GetVerticalLimit();\n\t\tfor (cPiece::cConnectors::iterator itrC = Connectors.begin(), endC = Connectors.end(); itrC != endC; ++itrC)\n\t\t{\n\t\t\tif (itrC->m_Type != WantedConnectorType)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// This is a same-type connector, find out how to rotate to it:\n\t\t\tint NumCCWRotations = cPiece::cConnector::GetNumCCWRotationsToFit(a_Connector.m_Direction, itrC->m_Direction);\n\t\t\tif ((NumCCWRotations < 0) || !(*itrP)->CanRotateCCW(NumCCWRotations))\n\t\t\t{\n\t\t\t\t// Doesn't support this rotation\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check if the piece's VerticalLimit allows this connection:\n\t\t\tif ((verticalLimit != nullptr) && (!verticalLimit->CanBeAtHeight(ConnPos.x, ConnPos.z, ConnPos.y - itrC->m_Pos.y)))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!CheckConnection(a_Connector, ConnPos, **itrP, *itrC, NumCCWRotations, a_OutPieces))\n\t\t\t{\n\t\t\t\t// Doesn't fit in this rotation\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Fits, add it to list of possibile connections:\n\t\t\tConnections.emplace_back(**itrP, *itrC, NumCCWRotations, Weight);\n\t\t\tWeightTotal += Weight;\n\t\t}  // for itrC - Connectors[]\n\t}  // for itrP - AvailablePieces[]\n\tif (Connections.empty())\n\t{\n\t\t// No available connections, bail out\n\t\treturn false;\n\t}\n\tASSERT(WeightTotal > 0);\n\n\t// Choose a random connection from the list, based on the weights:\n\tint rnd = (m_Noise.IntNoise3DInt(a_Connector.m_Pos.x, a_Connector.m_Pos.y, a_Connector.m_Pos.z) / 7) % WeightTotal;\n\tsize_t ChosenIndex = 0;\n\tfor (cConnections::const_iterator itr = Connections.begin(), end = Connections.end(); itr != end; ++itr, ++ChosenIndex)\n\t{\n\t\trnd -= itr->m_Weight;\n\t\tif (rnd <= 0)\n\t\t{\n\t\t\t// This is the piece to choose\n\t\t\tbreak;\n\t\t}\n\t}\n\tcConnection & Conn = Connections[ChosenIndex];\n\n\t// Place the piece:\n\tVector3i NewPos = Conn.m_Piece->RotatePos(Conn.m_Connector.m_Pos, Conn.m_NumCCWRotations);\n\tConnPos -= NewPos;\n\tauto PlacedPiece = std::make_unique<cPlacedPiece>(&a_ParentPiece, *(Conn.m_Piece), ConnPos, Conn.m_NumCCWRotations);\n\n\t// Add the new piece's connectors to the list of free connectors:\n\tcPiece::cConnectors Connectors = Conn.m_Piece->GetConnectors();\n\tfor (cPiece::cConnectors::const_iterator itr = Connectors.begin(), end = Connectors.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->m_Pos.Equals(Conn.m_Connector.m_Pos))\n\t\t{\n\t\t\t// This is the connector through which we have been connected to the parent, don't add\n\t\t\tcontinue;\n\t\t}\n\t\ta_OutConnectors.emplace_back(PlacedPiece.get(), Conn.m_Piece->RotateMoveConnector(*itr, Conn.m_NumCCWRotations, ConnPos.x, ConnPos.y, ConnPos.z));\n\t}\n\ta_OutPieces.push_back(std::move(PlacedPiece));\n\n\treturn true;\n}\n\n\n\n\n\nbool cPieceGeneratorBFSTree::CheckConnection(\n\tconst cPiece::cConnector & a_ExistingConnector,\n\tconst Vector3i & a_ToPos,\n\tconst cPiece & a_Piece,\n\tconst cPiece::cConnector & a_NewConnector,\n\tint a_NumCCWRotations,\n\tconst cPlacedPieces & a_OutPieces\n)\n{\n\t// For each placed piece, test the hitbox against the new piece:\n\tcCuboid RotatedHitBox = a_Piece.RotateHitBoxToConnector(a_NewConnector, a_ToPos, a_NumCCWRotations);\n\tRotatedHitBox.Sort();\n\tfor (cPlacedPieces::const_iterator itr = a_OutPieces.begin(), end = a_OutPieces.end(); itr != end; ++itr)\n\t{\n\t\tif ((*itr)->GetHitBox().DoesIntersect(RotatedHitBox))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cPieceGeneratorBFSTree::PlacePieces(int a_BlockX, int a_BlockZ, int a_MaxDepth, cPlacedPieces & a_OutPieces)\n{\n\ta_OutPieces.clear();\n\tcFreeConnectors ConnectorPool;\n\n\t// Place the starting piece:\n\ta_OutPieces.push_back(PlaceStartingPiece(a_BlockX, a_BlockZ, ConnectorPool));\n\n\t/*\n\t// DEBUG:\n\tFLOGD(\"Placed the starting piece at {0}\", Vector3i{a_BlockX, a_BlockY, a_BlockZ});\n\tcCuboid Hitbox = a_OutPieces[0]->GetHitBox();\n\tHitbox.Sort();\n\tFLOGD(\"  Hitbox: {0} - {1} ({2} * {3} * {4})\\n\",\n\t\tHitbox.p1, Hitbox.p2,\n\t\tHitbox.DifX() + 1, Hitbox.DifY() + 1, Hitbox.DifZ() + 1\n\t);\n\tDebugConnectorPool(ConnectorPool, 0);\n\t//*/\n\n\t// Place pieces at the available connectors:\n\t/*\n\tInstead of removing them one by one from the pool, we process them sequentially and take note of the last\n\tprocessed one. To save on memory, once the number of processed connectors reaches a big number, a chunk\n\tof the connectors is removed.\n\t*/\n\tsize_t NumProcessed = 0;\n\twhile (ConnectorPool.size() > NumProcessed)\n\t{\n\t\tcFreeConnector & Conn = ConnectorPool[NumProcessed];\n\t\tif (Conn.m_Piece->GetDepth() < a_MaxDepth)\n\t\t{\n\t\t\tif (TryPlacePieceAtConnector(*Conn.m_Piece, Conn.m_Connector, a_OutPieces, ConnectorPool))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t// DEBUG:\n\t\t\t\tconst cPlacedPiece * NewPiece = a_OutPieces.back();\n\t\t\t\tconst Vector3i & Coords = NewPiece->GetCoords();\n\t\t\t\tFLOGD(\"Placed a new piece at {0}, rotation {1}\\n\", Coords, NewPiece->GetNumCCWRotations());\n\t\t\t\tcCuboid Hitbox = NewPiece->GetHitBox();\n\t\t\t\tHitbox.Sort();\n\t\t\t\tFLOGD(\"  Hitbox: {0} - {1} ({2} * {3} * {4})\\n\",\n\t\t\t\t\tHitbox.p1, Hitbox.p2,\n\t\t\t\t\tHitbox.DifX() + 1, Hitbox.DifY() + 1, Hitbox.DifZ() + 1\n\t\t\t\t);\n\t\t\t\tDebugConnectorPool(ConnectorPool, NumProcessed + 1);\n\t\t\t\t//*/\n\t\t\t}\n\t\t}\n\t\tNumProcessed++;\n\t\tif (NumProcessed > 1000)\n\t\t{\n\t\t\ttypedef cPieceGeneratorBFSTree::cFreeConnectors::difference_type difType;\n\t\t\tConnectorPool.erase(ConnectorPool.begin(), ConnectorPool.begin() + static_cast<difType>(NumProcessed));\n\t\t\tNumProcessed = 0;\n\t\t}\n\t}\n}\n\n\n\n\n\n//*\n// DEBUG:\nvoid cPieceGeneratorBFSTree::DebugConnectorPool(const cPieceGeneratorBFSTree::cFreeConnectors & a_ConnectorPool, size_t a_NumProcessed)\n{\n\tfmt::print(\"  Connector pool: {0} items\\n\", a_ConnectorPool.size() - a_NumProcessed);\n\tsize_t idx = 0;\n\n\ttypedef cPieceGeneratorBFSTree::cFreeConnectors::difference_type difType;\n\n\tfor (auto itr = a_ConnectorPool.cbegin() + static_cast<difType>(a_NumProcessed), end = a_ConnectorPool.cend(); itr != end; ++itr, ++idx)\n\t{\n\t\tfmt::print(\"    {0}: {{{1}, {2}, {3}}}, type {4}, direction {5}, depth {6}\\n\",\n\t\t\tidx,\n\t\t\titr->m_Connector.m_Pos.x, itr->m_Connector.m_Pos.y, itr->m_Connector.m_Pos.z,\n\t\t\titr->m_Connector.m_Type,\n\t\t\tcPiece::cConnector::DirectionToString(itr->m_Connector.m_Direction),\n\t\t\titr->m_Piece->GetDepth()\n\t\t);\n\t}  // for itr - a_ConnectorPool[]\n}\n//*/\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPieceGeneratorBFSTree::cConnection:\n\ncPieceGeneratorBFSTree::cConnection::cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations, int a_Weight) :\n\tm_Piece(&a_Piece),\n\tm_Connector(a_Connector),\n\tm_NumCCWRotations(a_NumCCWRotations),\n\tm_Weight(a_Weight)\n{\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPieceGeneratorBFSTree::cFreeConnector:\n\ncPieceGeneratorBFSTree::cFreeConnector::cFreeConnector(cPlacedPiece * a_Piece, const cPiece::cConnector & a_Connector) :\n\tm_Piece(a_Piece),\n\tm_Connector(a_Connector)\n{\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/PieceGeneratorBFSTree.h",
    "content": "\n// PieceGeneratorBFSTree.h\n\n// Declares the cPieceGeneratorBFSTree class for generating structures composed of individual \"pieces\" in a simple tree\n\n\n\n\n\n#pragma once\n\n#include \"PiecePool.h\"\n#include \"../Noise/Noise.h\"\n\n\n\n\n\nclass cPieceGeneratorBFSTree\n{\npublic:\n\t/** Creates a new object tied to the specified PiecePool, using the specified seed. */\n\tcPieceGeneratorBFSTree(cPiecePool & a_PiecePool, int a_Seed);\n\n\n\t/** Generates a placement for pieces at the specified coords.\n\tThe Y coord is generated automatically based on the starting piece that is chosen. */\n\tvoid PlacePieces(int a_BlockX, int a_BlockZ, int a_MaxDepth, cPlacedPieces & a_OutPieces);\n\n\nprotected:\n\n\t/** The type used for storing a connection from one piece to another, while building the piece tree. */\n\tstruct cConnection\n\t{\n\t\tcPiece * m_Piece;                  // The piece being connected\n\t\tcPiece::cConnector m_Connector;    // The piece's connector being used (relative non-rotated coords)\n\t\tint m_NumCCWRotations;             // Number of rotations necessary to match the two connectors\n\t\tint m_Weight;                      // Relative chance that this connection will be chosen\n\n\t\tcConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations, int a_Weight);\n\t};\n\ttypedef std::vector<cConnection> cConnections;\n\n\n\t/** The type used for storing a pool of connectors that will be attempted to expand by another piece. */\n\tstruct cFreeConnector\n\t{\n\t\tcPlacedPiece * m_Piece;\n\t\tcPiece::cConnector m_Connector;\n\n\t\tcFreeConnector(cPlacedPiece * a_Piece, const cPiece::cConnector & a_Connector);\n\t};\n\ttypedef std::vector<cFreeConnector> cFreeConnectors;\n\n\n\t/** The pool from which pieces are taken. */\n\tcPiecePool & m_PiecePool;\n\n\t/** The noise used for random number generation. */\n\tcNoise m_Noise;\n\n\t/** The seed used by this generator. */\n\tint m_Seed;\n\n\n\t/** Selects a starting piece and places it, including its height and rotation.\n\tAlso puts the piece's connectors in a_OutConnectors. */\n\tcPlacedPiecePtr PlaceStartingPiece(int a_BlockX, int a_BlockZ, cFreeConnectors & a_OutConnectors);\n\n\t/** Tries to place a new piece at the specified (placed) connector. Returns true if successful. */\n\tbool TryPlacePieceAtConnector(\n\t\tconst cPlacedPiece & a_ParentPiece,      // The existing piece to a new piece should be placed\n\t\tconst cPiece::cConnector & a_Connector,  // The existing connector (world-coords) to which a new piece should be placed\n\t\tcPlacedPieces & a_OutPieces,             // Already placed pieces, to be checked for intersections\n\t\tcFreeConnectors & a_OutConnectors        // List of free connectors to which the new connectors will be placed\n\t);\n\n\t/** Checks if the specified piece would fit with the already-placed pieces, using the specified connector\n\tand number of CCW rotations.\n\ta_ExistingConnector is in world-coords and is already rotated properly\n\ta_ToPos is the world-coords position on which the new connector should be placed (1 block away from a_ExistingConnector, in its Direction)\n\ta_NewConnector is in the original (non-rotated) coords.\n\tReturns true if the piece fits, false if not. */\n\tbool CheckConnection(\n\t\tconst cPiece::cConnector & a_ExistingConnector,  // The existing connector\n\t\tconst Vector3i & a_ToPos,                        // The position on which the new connector should be placed\n\t\tconst cPiece & a_Piece,                          // The new piece\n\t\tconst cPiece::cConnector & a_NewConnector,       // The connector of the new piece\n\t\tint a_NumCCWRotations,                           // Number of rotations for the new piece to align the connector\n\t\tconst cPlacedPieces & a_OutPieces                // All the already-placed pieces to check\n\t);\n\n\t/** DEBUG: Outputs all the connectors in the pool into stdout.\n\ta_NumProcessed signals the number of connectors from the pool that should be considered processed (not listed). */\n\tvoid DebugConnectorPool(const cFreeConnectors & a_ConnectorPool, size_t a_NumProcessed);\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Generating/PieceModifier.cpp",
    "content": "\n// PieceModifier.cpp\n\n// Implements the various classes descending from cPiece::cPieceModifier\n\n#include \"Globals.h\"\n#include \"PieceModifier.h\"\n#include \"../Noise/Noise.h\"\n\n\n\n\n\n// Constant that is added to seed\nstatic const int SEED_OFFSET = 135 * 13;\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** A modifier which is pseudo-randomly replacing blocks to other types and metas. */\nclass cPieceModifierRandomizeBlocks:\n\tpublic cPiece::cPieceModifier\n{\npublic:\n\tcPieceModifierRandomizeBlocks(void) :\n\t\tm_Seed()\n\t{\n\t}\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\tm_AllWeights = 0;\n\t\tAString Params = a_Params;\n\n\n\t\t/** BlocksToReplace parsing */\n\t\tauto idxPipe = Params.find('|');\n\t\tif (idxPipe != AString::npos)\n\t\t{\n\t\t\tAString blocksToReplaceStr = Params.substr(0, idxPipe);\n\t\t\tauto blocksToReplace = StringSplitAndTrim(blocksToReplaceStr, \",\");\n\t\t\tfor (size_t i = 0; i < blocksToReplace.size(); i++)\n\t\t\t{\n\t\t\t\tBLOCKTYPE blockType = static_cast<BLOCKTYPE>(BlockStringToType(blocksToReplace[i]));\n\t\t\t\tif ((blockType == E_BLOCK_AIR) && !NoCaseCompare(blocksToReplace[i], \"Air\"))\n\t\t\t\t{\n\t\t\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse block type from string \\\"%s\\\"!\", blocksToReplace[i].c_str());\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tm_BlocksToReplace[blockType] = 1;\n\t\t\t}\n\n\t\t\tParams = Params.substr(idxPipe + 1, Params.length() - 1);\n\t\t}\n\t\tif (m_BlocksToReplace.size() == 0)\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"You must specify at least one block to replace%s!\", \"\");\n\t\t\treturn false;\n\t\t}\n\n\n\t\t/** Meta params parsing */\n\t\tauto idxSqBracketStart = Params.find('[');\n\t\tauto idxSqBracketStartLast = Params.find_last_of('[');\n\n\t\tbool isMultiMeta = false;\n\t\tif ((idxSqBracketStart != idxSqBracketStartLast) && (idxSqBracketStartLast != Params.length() - 1))\n\t\t{\n\t\t\t// Meta per block type\n\t\t\tisMultiMeta = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto idxSqBracketEnd = Params.find(']');\n\t\t\tif ((idxSqBracketEnd == Params.length() - 1) && (idxSqBracketStart != AString::npos))\n\t\t\t{\n\t\t\t\tAString metaParamsStr = Params.substr(idxSqBracketStart + 1, Params.length() - idxSqBracketStart - 2);\n\t\t\t\tstd::array<int, 4> metaParamsInt;\n\t\t\t\tif (!ParseMeta(metaParamsStr, metaParamsInt, a_LogWarnings))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tm_MinMeta = metaParamsInt[0];\n\t\t\t\tm_MaxMeta = metaParamsInt[1];\n\t\t\t\tm_MinNoiseMeta = metaParamsInt[2];\n\t\t\t\tm_MaxNoiseMeta = metaParamsInt[3];\n\n\t\t\t\tParams = Params.substr(0, idxSqBracketStart);\n\t\t\t}\n\t\t}\n\n\n\t\t// BlocksToRandomize parsing\n\t\tauto BlocksToRandomize = StringSplitAndTrim(Params, \";\");\n\t\tfor (size_t i = 0; i < BlocksToRandomize.size(); i++)\n\t\t{\n\t\t\tAString block = BlocksToRandomize[i];\n\n\t\t\tcRandomizedBlock Block{};\n\n\t\t\tif (isMultiMeta)\n\t\t\t{\n\t\t\t\tauto sqBrStart = block.find('[');\n\t\t\t\tif (sqBrStart != AString::npos)\n\t\t\t\t{\n\t\t\t\t\tauto sqBrEnd = block.find(']');\n\t\t\t\t\tif (sqBrEnd != block.size() - 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tCONDWARNING(a_LogWarnings, \"If present, block meta params must be at the end of block to randomize definition \\\"%s\\\"!\", block.c_str());\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\t\t\t\t\tAString metaParamsStr = block.substr(sqBrStart + 1, block.size() - sqBrStart - 2);\n\n\t\t\t\t\tstd::array<int, 4> metaParamsInt;\n\t\t\t\t\tif (!ParseMeta(metaParamsStr, metaParamsInt, a_LogWarnings))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tBlock.m_MinMeta = metaParamsInt[0];\n\t\t\t\t\tBlock.m_MaxMeta = metaParamsInt[1];\n\t\t\t\t\tBlock.m_MinNoiseMeta = metaParamsInt[2];\n\t\t\t\t\tBlock.m_MaxNoiseMeta = metaParamsInt[3];\n\n\t\t\t\t\tblock = block.substr(0, sqBrStart);\n\n\t\t\t\t}\n\t\t\t\t// No meta randomization for this block\n\t\t\t}\n\n\t\t\tauto BlockParams = StringSplitAndTrim(block, \",\");\n\t\t\tif (BlockParams.size() < 2)\n\t\t\t{\n\t\t\t\tCONDWARNING(a_LogWarnings, \"Block weight is required param \\\"%s\\\"!\", BlockParams[0].c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tBLOCKTYPE BlockType = static_cast<BLOCKTYPE>(BlockStringToType(BlockParams[0]));\n\t\t\tint BlockWeight = 0;\n\t\t\tif ((BlockType != E_BLOCK_AIR) && !NoCaseCompare(BlockParams[0], \"Air\"))\n\t\t\t{\n\t\t\t\t// Failed to parse block type\n\t\t\t\tCONDWARNING(\n\t\t\t\t\ta_LogWarnings, \"Cannot parse block type from string \\\"%s\\\"!\",\n\t\t\t\t\tBlockParams[0].c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!StringToInteger(BlockParams[1], BlockWeight))\n\t\t\t{\n\t\t\t\t// Failed to parse the crop weight:\n\t\t\t\tCONDWARNING(\n\t\t\t\t\ta_LogWarnings,\n\t\t\t\t\t\"Cannot parse block weight from string \\\"%s\\\"!\",\n\t\t\t\t\tBlockParams[1].c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\n\n\t\t\tBlock.m_Type = BlockType;\n\t\t\tBlock.m_Weight = BlockWeight;\n\t\t\tm_AllWeights += BlockWeight;\n\n\t\t\tm_BlocksToRandomize.push_back(Block);\n\t\t}\n\t\tif (m_BlocksToRandomize.size() == 0)\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"You must specify at least one block to randomize%s!\", \"\");\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tbool ParseMeta(const AString & a_Meta, std::array<int, 4> & a_ParsedMeta, bool a_LogWarnings)\n\t{\n\t\tauto MetaParams = StringSplitAndTrim(a_Meta, \",\");\n\n\t\tfor (size_t i = 0; i < MetaParams.size(); i++)\n\t\t{\n\t\t\tint Value;\n\t\t\tif (!StringToInteger(MetaParams[i], Value))\n\t\t\t{\n\t\t\t\t// Failed to parse meta parameter from string:\n\t\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse meta param from string \\\"%s\\\", meta: %s!\", MetaParams[i].c_str(), a_Meta.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (i > 3)\n\t\t\t{\n\t\t\t\tCONDWARNING(a_LogWarnings, \"Unsupported meta param \\\"%d\\\"!\", Value);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ta_ParsedMeta[i] = Value;\n\t\t}\n\n\t\tif (MetaParams.size() == 1)\n\t\t{\n\t\t\t// Noise is not used for meta\n\t\t\ta_ParsedMeta[1] = a_ParsedMeta[0];\n\t\t}\n\t\telse if (MetaParams.size() == 2)\n\t\t{\n\t\t\t// Noise range is same as meta range\n\t\t\ta_ParsedMeta[2] = a_ParsedMeta[0];\n\t\t\ta_ParsedMeta[3] = a_ParsedMeta[1];\n\t\t}\n\t\telse if (MetaParams.size() == 3)\n\t\t{\n\t\t\ta_ParsedMeta[3] = a_ParsedMeta[1];\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual void Modify(cBlockArea & a_Image, const Vector3i a_PiecePos, const int a_PieceRot) override\n\t{\n\t\tcNoise Noise(m_Seed);\n\t\tcNoise PieceNoise(Noise.IntNoise3DInt(a_PiecePos));\n\n\t\tsize_t NumBlocks = a_Image.GetBlockCount();\n\t\tBLOCKTYPE * BlockTypes = a_Image.GetBlockTypes();\n\t\tBLOCKTYPE * BlockMetas = a_Image.GetBlockMetas();\n\n\t\tfor (size_t i = 0; i < NumBlocks; i++)\n\t\t{\n\t\t\tif (m_BlocksToReplace.count(BlockTypes[i]))\n\t\t\t{\n\t\t\t\tfloat BlockRnd = PieceNoise.IntNoise2DInRange(a_PieceRot, static_cast<int>(i), 0.0F, static_cast<float>(m_AllWeights));\n\n\t\t\t\tint weightDelta = 0;\n\t\t\t\tfor (auto & blockToRnd : m_BlocksToRandomize)\n\t\t\t\t{\n\t\t\t\t\tweightDelta += blockToRnd.m_Weight;\n\t\t\t\t\tif (BlockRnd <= weightDelta)\n\t\t\t\t\t{\n\t\t\t\t\t\tBlockTypes[i] = blockToRnd.m_Type;\n\n\t\t\t\t\t\t// Per block meta params\n\t\t\t\t\t\tif (blockToRnd.m_MinMeta < blockToRnd.m_MaxMeta)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint BlockMetaRnd = std::clamp(static_cast<int>(PieceNoise.IntNoise2DInRange(a_PieceRot*2, static_cast<int>(i), static_cast<float>(blockToRnd.m_MinNoiseMeta), static_cast<float>(blockToRnd.m_MaxNoiseMeta))), blockToRnd.m_MinMeta, blockToRnd.m_MaxMeta);\n\t\t\t\t\t\t\tBlockMetas[i] = static_cast<NIBBLETYPE>(BlockMetaRnd);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((blockToRnd.m_MaxMeta > -1) && (blockToRnd.m_MaxMeta == blockToRnd.m_MinMeta))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Change meta if at least minimum meta was specified\n\t\t\t\t\t\t\tBlockMetas[i] = static_cast<NIBBLETYPE>(blockToRnd.m_MaxMeta);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// All blocks meta params\n\t\t\t\tif (m_MaxMeta > m_MinMeta)\n\t\t\t\t{\n\t\t\t\t\tint BlockMetaRnd = std::clamp(static_cast<int>(PieceNoise.IntNoise2DInRange(a_PieceRot * 2, static_cast<int>(i), static_cast<float>(m_MinNoiseMeta), static_cast<float>(m_MaxNoiseMeta))), m_MinMeta, m_MaxMeta);\n\t\t\t\t\tBlockMetas[i] = static_cast<NIBBLETYPE>(BlockMetaRnd);\n\t\t\t\t}\n\t\t\t\telse if ((m_MaxMeta > -1) && (m_MaxMeta == m_MinMeta))\n\t\t\t\t{\n\t\t\t\t\t// Change meta if at least minimum meta was specified\n\t\t\t\t\tBlockMetas[i] = static_cast<NIBBLETYPE>(m_MaxMeta);\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for i - BlockTypes[]\n\t}\n\n\tvirtual void AssignSeed(int a_Seed) override\n\t{\n\t\tm_Seed = a_Seed + SEED_OFFSET;\n\t}\nprotected:\n\tint m_Seed;\n\tint m_AllWeights = 0;\n\n\n\t/** Block types of a blocks which are being replaced by this strategy */\n\tstd::map<BLOCKTYPE, int> m_BlocksToReplace;\n\n\t/** Randomized blocks with their weights and meta params */\n\tcRandomizedBlocks m_BlocksToRandomize;\n\n\t/** Minimum meta to randomize */\n\tint m_MinMeta = 0;\n\n\t/** Maximum meta to randomize */\n\tint m_MaxMeta = -1;\n\n\t/** Maximum meta in noise range */\n\tint m_MaxNoiseMeta = 0;\n\n\t/** Minimum meta in noise range */\n\tint m_MinNoiseMeta = 0;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// CreatePieceModifierFromString:\n\nbool CreatePieceModifierFromString(const AString & a_Definition, std::shared_ptr<cPiece::cPieceModifiers> & a_Modifiers, bool a_LogWarnings)\n{\n\n\tauto idxCurlyStart = a_Definition.find('{');\n\tauto idxCurlyFirstEnd = a_Definition.find('}');\n\tif ((idxCurlyStart == AString::npos) && (idxCurlyFirstEnd == AString::npos))\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Piece metadata \\\"Modifiers\\\" needs at least one valid modifier definition \\\"%s\\\"!\", a_Definition.c_str());\n\t\treturn false;\n\t}\n\n\tauto modifiersStr = StringSplitAndTrim(a_Definition, \"{\");\n\n\tfor (size_t i = 0; i < modifiersStr.size(); i++)\n\t{\n\t\tAString modifierStr = TrimString(modifiersStr[i]);\n\n\t\tif (modifierStr.size() == 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tauto idxCurlyEnd = modifierStr.find('}');\n\t\tif (idxCurlyEnd == AString::npos)\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Modifier definition must end with curly bracket \\\"%s\\\"!!\", modifierStr.c_str());\n\t\t\treturn false;\n\t\t}\n\n\t\tmodifierStr = modifierStr.substr(0, idxCurlyEnd);\n\n\t\t// Break apart the modifier class, the first parameter before the first pipe char:\n\t\tauto idxPipe = modifierStr.find('|');\n\t\tif (idxPipe == AString::npos)\n\t\t{\n\t\t\tidxPipe = modifierStr.length();\n\t\t}\n\t\tAString ModifierClass = modifierStr.substr(0, idxPipe);\n\n\t\t// Create a modifier class based on the class string:\n\t\tcPiece::cPieceModifierPtr Modifier;\n\t\tif (NoCaseCompare(ModifierClass, \"RandomizeBlocks\") == 0)\n\t\t{\n\t\t\tModifier = std::make_shared<cPieceModifierRandomizeBlocks>();\n\t\t}\n\n\t\tif (Modifier == nullptr)\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Unknown modifier class \\\"%s\\\" %s!\", ModifierClass.c_str(), modifierStr.c_str());\n\t\t\treturn false;\n\t\t}\n\n\t\t// Initialize the modifier's parameters:\n\t\tAString Params;\n\t\tif (idxPipe < modifierStr.length())\n\t\t{\n\t\t\tParams = modifierStr.substr(idxPipe + 1);\n\t\t}\n\n\t\tif (!Modifier->InitializeFromString(Params, a_LogWarnings))\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"InitializeFromString error \\\"%s\\\" -- %!\", Params.c_str(), modifierStr.c_str());\n\t\t\treturn false;\n\t\t}\n\n\t\ta_Modifiers->push_back(Modifier);\n\t}\n\n\treturn true;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/PieceModifier.h",
    "content": "\n// PieceModifier.h\n\n// Declares the public interface for cPiece's cPieceModifier implementations\n\n\n\n\n\n#pragma once\n\n#include \"PiecePool.h\"\n\n\n\n\n\nbool CreatePieceModifierFromString(const AString & a_Definition, std::shared_ptr<cPiece::cPieceModifiers> & a_Modifiers, bool a_LogWarnings);\n\n\n\n\n\n/** Used to store block type, meta, weight and some more params */\nclass cRandomizedBlock\n{\npublic:\n\tBLOCKTYPE m_Type;\n\n\tint m_Weight;\n\n\t/** Minimum meta to randomize */\n\tint m_MinMeta = 0;\n\n\t/** Maximum meta to randomize */\n\tint m_MaxMeta = -1;\n\n\t/** Maximum meta in noise range */\n\tint m_MaxNoiseMeta = 0;\n\n\t/** Minimum meta in noise range */\n\tint m_MinNoiseMeta = 0;\n};\n\ntypedef std::vector<cRandomizedBlock> cRandomizedBlocks;\n"
  },
  {
    "path": "src/Generating/PiecePool.cpp",
    "content": "// PiecePool.cpp\n\n// Implements the cPiecePool class representing a pool of cPieces - \"parts\" of a structure, used in piece-generators\n// A cPiece is a single static part of a structure that can rotate around the Y axis, has connectors to other pieces and knows how to draw itself into the world.\n// The pool manages the pieces and provides lists of its pieces matching criteria, and provides relative weights for the random distribution of pieces.\n\n#include \"Globals.h\"\n#include \"PiecePool.h\"\n#include \"VerticalStrategy.h\"\n#include \"VerticalLimit.h\"\n#include \"PieceModifier.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPiece:\n\nbool cPiece::SetVerticalStrategyFromString(const AString & a_StrategyDesc, bool a_LogWarnings)\n{\n\tauto strategy = CreateVerticalStrategyFromString(a_StrategyDesc, a_LogWarnings);\n\tif (strategy == nullptr)\n\t{\n\t\treturn false;\n\t}\n\tm_VerticalStrategy = strategy;\n\treturn true;\n}\n\n\n\n\n\nbool cPiece::SetVerticalLimitFromString(const AString & a_LimitDesc, bool a_LogWarnings)\n{\n\tauto limit = CreateVerticalLimitFromString(a_LimitDesc, a_LogWarnings);\n\tif (limit == nullptr)\n\t{\n\t\treturn false;\n\t}\n\tm_VerticalLimit = limit;\n\treturn true;\n}\n\n\n\n\n\nbool cPiece::SetPieceModifiersFromString(const AString & a_Definition, bool a_LogWarnings)\n{\n\tauto modifiers = std::make_shared<cPieceModifiers>();\n\tif (!CreatePieceModifierFromString(a_Definition, modifiers, a_LogWarnings))\n\t{\n\t\treturn false;\n\t}\n\n\tcPieceModifiers Modifiers;\n\tfor (size_t i = 0; i < modifiers->size(); i++)\n\t{\n\t\tModifiers.push_back(std::move(modifiers->at(i)));\n\t}\n\n\tm_Modifiers = Modifiers;\n\n\treturn true;\n}\n\n\n\n\n\nVector3i cPiece::RotatePos(const Vector3i & a_Pos, int a_NumCCWRotations) const\n{\n\tVector3i Size = GetSize();\n\tswitch (a_NumCCWRotations)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\t// No rotation needed\n\t\t\treturn a_Pos;\n\t\t}\n\t\tcase 1:\n\t\t{\n\t\t\t// 1 CCW rotation:\n\t\t\treturn Vector3i(a_Pos.z, a_Pos.y, Size.x - a_Pos.x - 1);\n\t\t}\n\t\tcase 2:\n\t\t{\n\t\t\t// 2 rotations ( = axis flip):\n\t\t\treturn Vector3i(Size.x - a_Pos.x - 1, a_Pos.y, Size.z - a_Pos.z - 1);\n\t\t}\n\t\tcase 3:\n\t\t{\n\t\t\t// 1 CW rotation:\n\t\t\treturn Vector3i(Size.z - a_Pos.z - 1, a_Pos.y, a_Pos.x);\n\t\t}\n\t}\n\tASSERT(!\"Unhandled rotation\");\n\treturn a_Pos;\n}\n\n\n\n\n\ncPiece::cConnector cPiece::RotateMoveConnector(const cConnector & a_Connector, int a_NumCCWRotations, int a_MoveX, int a_MoveY, int a_MoveZ) const\n{\n\tcPiece::cConnector res(a_Connector);\n\n\t// Rotate the res connector:\n\tswitch (a_NumCCWRotations)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\t// No rotation needed\n\t\t\tbreak;\n\t\t}\n\t\tcase 1:\n\t\t{\n\t\t\t// 1 CCW rotation:\n\t\t\tres.m_Direction = cConnector::RotateDirectionCCW(res.m_Direction);\n\t\t\tbreak;\n\t\t}\n\t\tcase 2:\n\t\t{\n\t\t\t// 2 rotations ( = axis flip):\n\t\t\tres.m_Direction = cConnector::RotateDirection(res.m_Direction);\n\t\t\tbreak;\n\t\t}\n\t\tcase 3:\n\t\t{\n\t\t\t// 1 CW rotation:\n\t\t\tres.m_Direction = cConnector::RotateDirectionCW(res.m_Direction);\n\t\t\tbreak;\n\t\t}\n\t}\n\tres.m_Pos = RotatePos(a_Connector.m_Pos, a_NumCCWRotations);\n\n\t// Move the res connector:\n\tres.m_Pos.x += a_MoveX;\n\tres.m_Pos.y += a_MoveY;\n\tres.m_Pos.z += a_MoveZ;\n\n\treturn res;\n}\n\n\n\n\n\ncCuboid cPiece::RotateHitBoxToConnector(\n\tconst cPiece::cConnector & a_MyConnector,\n\tconst Vector3i & a_ToConnectorPos,\n\tint a_NumCCWRotations\n) const\n{\n\tASSERT(a_NumCCWRotations == (a_NumCCWRotations % 4));\n\tVector3i ConnPos = RotatePos(a_MyConnector.m_Pos, a_NumCCWRotations);\n\tConnPos = a_ToConnectorPos - ConnPos;\n\treturn RotateMoveHitBox(a_NumCCWRotations, ConnPos.x, ConnPos.y, ConnPos.z);\n}\n\n\n\n\n\ncCuboid cPiece::RotateMoveHitBox(int a_NumCCWRotations, int a_MoveX, int a_MoveY, int a_MoveZ) const\n{\n\tASSERT(a_NumCCWRotations == (a_NumCCWRotations % 4));\n\tcCuboid res = GetHitBox();\n\tres.p1 = RotatePos(res.p1, a_NumCCWRotations);\n\tres.p2 = RotatePos(res.p2, a_NumCCWRotations);\n\tres.p1.Move(a_MoveX, a_MoveY, a_MoveZ);\n\tres.p2.Move(a_MoveX, a_MoveY, a_MoveZ);\n\treturn res;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPiece::cConnector:\n\ncPiece::cConnector::cConnector(int a_X, int a_Y, int a_Z, int a_Type, eDirection a_Direction) :\n\tm_Pos(a_X, a_Y, a_Z),\n\tm_Type(a_Type),\n\tm_Direction(a_Direction)\n{\n}\n\n\n\n\n\ncPiece::cConnector::cConnector(const Vector3i & a_Pos, int a_Type, eDirection a_Direction) :\n\tm_Pos(a_Pos),\n\tm_Type(a_Type),\n\tm_Direction(a_Direction)\n{\n}\n\n\n\n\n\nVector3i cPiece::cConnector::AddDirection(const Vector3i & a_Pos, eDirection a_Direction)\n{\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXM:       return Vector3i(a_Pos.x - 1, a_Pos.y,     a_Pos.z);\n\t\tcase dirXP:       return Vector3i(a_Pos.x + 1, a_Pos.y,     a_Pos.z);\n\t\tcase dirYM:       return Vector3i(a_Pos.x,     a_Pos.y - 1, a_Pos.z);\n\t\tcase dirYP:       return Vector3i(a_Pos.x,     a_Pos.y + 1, a_Pos.z);\n\t\tcase dirZM:       return Vector3i(a_Pos.x,     a_Pos.y,     a_Pos.z - 1);\n\t\tcase dirZP:       return Vector3i(a_Pos.x,     a_Pos.y,     a_Pos.z + 1);\n\t\tcase dirYM_XM_ZM: return Vector3i(a_Pos.x,     a_Pos.y - 1, a_Pos.z);\n\t\tcase dirYM_XM_ZP: return Vector3i(a_Pos.x,     a_Pos.y - 1, a_Pos.z);\n\t\tcase dirYM_XP_ZM: return Vector3i(a_Pos.x,     a_Pos.y - 1, a_Pos.z);\n\t\tcase dirYM_XP_ZP: return Vector3i(a_Pos.x,     a_Pos.y - 1, a_Pos.z);\n\t\tcase dirYP_XM_ZM: return Vector3i(a_Pos.x,     a_Pos.y + 1, a_Pos.z);\n\t\tcase dirYP_XM_ZP: return Vector3i(a_Pos.x,     a_Pos.y + 1, a_Pos.z);\n\t\tcase dirYP_XP_ZM: return Vector3i(a_Pos.x,     a_Pos.y + 1, a_Pos.z);\n\t\tcase dirYP_XP_ZP: return Vector3i(a_Pos.x,     a_Pos.y + 1, a_Pos.z);\n\t}\n\tUNREACHABLE(\"Unsupported connector direction\");\n}\n\n\n\n\n\nconst char * cPiece::cConnector::DirectionToString(eDirection a_Direction)\n{\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXM:       return \"x-\";\n\t\tcase dirXP:       return \"x+\";\n\t\tcase dirYM:       return \"y-\";\n\t\tcase dirYP:       return \"y+\";\n\t\tcase dirZM:       return \"z-\";\n\t\tcase dirZP:       return \"z+\";\n\t\tcase dirYM_XM_ZM: return \"y-x-z-\";\n\t\tcase dirYM_XM_ZP: return \"y-x-z+\";\n\t\tcase dirYM_XP_ZM: return \"y-x+z-\";\n\t\tcase dirYM_XP_ZP: return \"y-x+z+\";\n\t\tcase dirYP_XM_ZM: return \"y+x-z-\";\n\t\tcase dirYP_XM_ZP: return \"y+x-z+\";\n\t\tcase dirYP_XP_ZM: return \"y+x+z-\";\n\t\tcase dirYP_XP_ZP: return \"y+x+z+\";\n\t}\n\tUNREACHABLE(\"Unsupported connector direction\");\n}\n\n\n\n\n\nbool cPiece::cConnector::IsValidDirection(int a_Direction)\n{\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXM:\n\t\tcase dirXP:\n\t\tcase dirYM:\n\t\tcase dirYP:\n\t\tcase dirZM:\n\t\tcase dirZP:\n\t\tcase dirYM_XM_ZM:\n\t\tcase dirYM_XM_ZP:\n\t\tcase dirYM_XP_ZM:\n\t\tcase dirYM_XP_ZP:\n\t\tcase dirYP_XM_ZM:\n\t\tcase dirYP_XM_ZP:\n\t\tcase dirYP_XP_ZM:\n\t\tcase dirYP_XP_ZP:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\ncPiece::cConnector::eDirection cPiece::cConnector::RotateDirection(eDirection a_Direction)\n{\n\t// 180-degree rotation:\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXM:       return dirXP;\n\t\tcase dirXP:       return dirXM;\n\t\tcase dirYM:       return dirYM;\n\t\tcase dirYP:       return dirYP;\n\t\tcase dirZM:       return dirZM;\n\t\tcase dirZP:       return dirZP;\n\t\tcase dirYM_XM_ZM: return dirYM_XP_ZP;\n\t\tcase dirYM_XM_ZP: return dirYM_XP_ZM;\n\t\tcase dirYM_XP_ZM: return dirYM_XM_ZP;\n\t\tcase dirYM_XP_ZP: return dirYM_XM_ZM;\n\t\tcase dirYP_XM_ZM: return dirYP_XP_ZP;\n\t\tcase dirYP_XM_ZP: return dirYP_XP_ZM;\n\t\tcase dirYP_XP_ZM: return dirYP_XM_ZP;\n\t\tcase dirYP_XP_ZP: return dirYP_XM_ZM;\n\t}\n\tUNREACHABLE(\"Unsupported connector direction\");\n}\n\n\n\n\n\ncPiece::cConnector::eDirection cPiece::cConnector::RotateDirectionCCW(eDirection a_Direction)\n{\n\t// 90 degrees CCW rotation:\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXM:       return dirZP;\n\t\tcase dirXP:       return dirZM;\n\t\tcase dirYM:       return dirYM;\n\t\tcase dirYP:       return dirYP;\n\t\tcase dirZM:       return dirXM;\n\t\tcase dirZP:       return dirXP;\n\t\tcase dirYM_XM_ZM: return dirYM_XM_ZP;\n\t\tcase dirYM_XM_ZP: return dirYM_XP_ZP;\n\t\tcase dirYM_XP_ZM: return dirYM_XM_ZM;\n\t\tcase dirYM_XP_ZP: return dirYM_XP_ZM;\n\t\tcase dirYP_XM_ZM: return dirYP_XM_ZP;\n\t\tcase dirYP_XM_ZP: return dirYP_XP_ZP;\n\t\tcase dirYP_XP_ZM: return dirYP_XM_ZM;\n\t\tcase dirYP_XP_ZP: return dirYP_XP_ZM;\n\t}\n\tUNREACHABLE(\"Unsupported connector direction\");\n}\n\n\n\n\n\ncPiece::cConnector::eDirection cPiece::cConnector::RotateDirectionCW(eDirection a_Direction)\n{\n\t// 90 degrees CW rotation:\n\tswitch (a_Direction)\n\t{\n\t\tcase dirXM:       return dirZM;\n\t\tcase dirXP:       return dirZP;\n\t\tcase dirYM:       return dirYM;\n\t\tcase dirYP:       return dirYP;\n\t\tcase dirZM:       return dirXP;\n\t\tcase dirZP:       return dirXM;\n\t\tcase dirYM_XM_ZM: return dirYM_XP_ZM;\n\t\tcase dirYM_XM_ZP: return dirYM_XM_ZM;\n\t\tcase dirYM_XP_ZM: return dirYM_XP_ZP;\n\t\tcase dirYM_XP_ZP: return dirYM_XM_ZP;\n\t\tcase dirYP_XM_ZM: return dirYP_XP_ZM;\n\t\tcase dirYP_XM_ZP: return dirYP_XM_ZM;\n\t\tcase dirYP_XP_ZM: return dirYP_XP_ZP;\n\t\tcase dirYP_XP_ZP: return dirYP_XM_ZP;\n\t}\n\tUNREACHABLE(\"Unsupported connector direction\");\n}\n\n\n\n\n\nint cPiece::cConnector::GetNumCCWRotationsToFit(eDirection a_FixedDir, eDirection a_RotatingDir)\n{\n\t// Translation of direction - direction -> number of CCW rotations needed:\n\t// You need DirectionRotationTable[fixed][rot] CCW turns to connect rot to fixed (they are opposite)\n\t// -1 if not possible\n\tstatic const int DirectionRotationTable[14][14] =\n\t{\n\t\t/*              YM, YP, ZM, ZP, XM, XP, YM-XM-ZM, YM-XM-ZP, YM-XP-ZM, YM-XP-ZP, YP-XM-ZM, YP-XM-ZP, YP-XP-ZM, YP-XP-ZP */\n\t\t/* YM */       { 0, -1, -1, -1, -1, -1,       -1,       -1,       -1,       -1,       -1,       -1,       -1,       -1},\n\t\t/* YP */       {-1, -1, -1, -1, -1, -1,       -1,       -1,       -1,       -1,       -1,       -1,       -1,       -1},\n\t\t/* ZM */       {-1, -1,  2,  0,  1,  3,       -1,       -1,       -1,       -1,       -1,       -1,       -1,       -1},\n\t\t/* ZP */       {-1, -1,  0,  2,  3,  1,       -1,       -1,       -1,       -1,       -1,       -1,       -1,       -1},\n\t\t/* XM */       {-1, -1,  3,  1,  2,  0,       -1,       -1,       -1,       -1,       -1,       -1,       -1,       -1},\n\t\t/* XP */       {-1, -1,  1,  3,  0,  2,       -1,       -1,       -1,       -1,       -1,       -1,       -1,       -1},\n\t\t/* YM-XM-ZM */ {-1, -1, -1, -1, -1, -1,       -1,       -1,       -1,       -1,        0,        3,        1,        2},\n\t\t/* YM-XM-ZP */ {-1, -1, -1, -1, -1, -1,       -1,       -1,       -1,       -1,        1,        0,        2,        3},\n\t\t/* YM-XP-ZM */ {-1, -1, -1, -1, -1, -1,       -1,       -1,       -1,       -1,        3,        2,        0,        1},\n\t\t/* YM-XP-ZP */ {-1, -1, -1, -1, -1, -1,       -1,       -1,       -1,       -1,        2,        1,        3,        0},\n\t\t/* YP-XM-ZM */ {-1, -1, -1, -1, -1, -1,        0,        3,        1,        2,       -1,       -1,       -1,       -1},\n\t\t/* YP-XM-ZP */ {-1, -1, -1, -1, -1, -1,        1,        0,        2,        3,       -1,       -1,       -1,       -1},\n\t\t/* YP-XP-ZM */ {-1, -1, -1, -1, -1, -1,        3,        2,        0,        1,       -1,       -1,       -1,       -1},\n\t\t/* YP-XP-ZP */ {-1, -1, -1, -1, -1, -1,        2,        1,        3,        0,       -1,       -1,       -1,       -1},\n\t};\n\n\treturn DirectionRotationTable[a_FixedDir][a_RotatingDir];\n}\n\n\n\n\n\nbool cPiece::cConnector::StringToDirection(const AString & a_Value, eDirection & a_Out)\n{\n\t// First try converting as a number:\n\tint dirInt;\n\tif (StringToInteger(a_Value, dirInt))\n\t{\n\t\tif (!IsValidDirection(dirInt))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\ta_Out = static_cast<eDirection>(dirInt);\n\t\treturn true;\n\t}\n\n\t// Compare to string representation:\n\tstatic const struct\n\t{\n\t\tconst char * m_String;\n\t\teDirection m_Value;\n\t} StringDirections[] =\n\t{\n\t\t{\"x-\", dirXM},\n\t\t{\"x+\", dirXP},\n\t\t{\"y-\", dirYM},\n\t\t{\"y+\", dirYP},\n\t\t{\"z-\", dirZM},\n\t\t{\"z+\", dirZP},\n\t\t{\"y-x-z-\", dirYM_XM_ZM},\n\t\t{\"y-x-z+\", dirYM_XM_ZP},\n\t\t{\"y-x+z-\", dirYM_XP_ZM},\n\t\t{\"y-x+z+\", dirYM_XP_ZP},\n\t\t{\"y+x-z-\", dirYP_XM_ZM},\n\t\t{\"y+x-z+\", dirYP_XM_ZP},\n\t\t{\"y+x+z-\", dirYP_XP_ZM},\n\t\t{\"y+x+z+\", dirYP_XP_ZP},\n\n\t\t// Alternate names, with slashes:\n\t\t{\"y-/x-/z-\", dirYM_XM_ZM},\n\t\t{\"y-/x-/z+\", dirYM_XM_ZP},\n\t\t{\"y-/x+/z-\", dirYM_XP_ZM},\n\t\t{\"y-/x+/z+\", dirYM_XP_ZP},\n\t\t{\"y+/x-/z-\", dirYP_XM_ZM},\n\t\t{\"y+/x-/z+\", dirYP_XM_ZP},\n\t\t{\"y+/x+/z-\", dirYP_XP_ZM},\n\t\t{\"y+/x+/z+\", dirYP_XP_ZP},\n\t};\n\tauto lcValue = StrToLower(a_Value);\n\tfor (size_t i = 0; i < ARRAYCOUNT(StringDirections); i++)\n\t{\n\t\tif (strcmp(lcValue.c_str(), StringDirections[i].m_String) == 0)\n\t\t{\n\t\t\ta_Out = StringDirections[i].m_Value;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Not understood, failure:\n\treturn false;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPlacedPiece:\n\ncPlacedPiece::cPlacedPiece(const cPlacedPiece * a_Parent, const cPiece & a_Piece, const Vector3i & a_Coords, int a_NumCCWRotations) :\n\tm_Parent(a_Parent),\n\tm_Piece(&a_Piece),\n\tm_Coords(a_Coords),\n\tm_NumCCWRotations(a_NumCCWRotations),\n\tm_HasBeenMovedToGround(false)\n{\n\tm_Depth = (m_Parent == nullptr) ? 0 : (m_Parent->GetDepth() + 1);\n\tm_HitBox = a_Piece.RotateMoveHitBox(a_NumCCWRotations, a_Coords.x, a_Coords.y, a_Coords.z);\n\tm_HitBox.Sort();\n}\n\n\n\n\n\ncPiece::cConnector cPlacedPiece::GetRotatedConnector(size_t a_Index) const\n{\n\tcPiece::cConnectors Connectors = m_Piece->GetConnectors();\n\tASSERT(Connectors.size() >= a_Index);\n\treturn m_Piece->RotateMoveConnector(Connectors[a_Index], m_NumCCWRotations, m_Coords.x, m_Coords.y, m_Coords.z);\n}\n\n\n\n\n\ncPiece::cConnector cPlacedPiece::GetRotatedConnector(const cPiece::cConnector & a_Connector) const\n{\n\treturn m_Piece->RotateMoveConnector(a_Connector, m_NumCCWRotations, m_Coords.x, m_Coords.y, m_Coords.z);\n}\n\n\n\n\n\nvoid cPlacedPiece::MoveToGroundBy(int a_OffsetY)\n{\n\tm_Coords.y += a_OffsetY;\n\tm_HasBeenMovedToGround = true;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/PiecePool.h",
    "content": "// PiecePool.h\n\n// Declares the cPiecePool class representing a pool of cPieces - \"parts\" of a structure, used in piece-generators\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Defines.h\"\n#include \"../Cuboid.h\"\n\n\n\n\n\n/** Represents a single piece. Can have multiple connectors of different types where other pieces can connect. */\nclass cPiece\n{\npublic:\n\t// Force a virtual destructor in all descendants\n\tvirtual ~cPiece() {}\n\n\tstruct cConnector\n\t{\n\t\tenum eDirection\n\t\t{\n\t\t\t// The following values correspond to equivalent eBlockFace values:\n\t\t\tdirXM   =  BLOCK_FACE_XM,  // Pointing towards the X- side of the prefab\n\t\t\tdirXP   =  BLOCK_FACE_XP,  // Pointing towards the X+ side of the prefab\n\t\t\tdirYM   =  BLOCK_FACE_YM,  // Pointing towards the Y- side of the prefab, doesn't change with rotation around the Y axis\n\t\t\tdirYP   =  BLOCK_FACE_YP,  // Pointing towards the Y+ side of the prefab, doesn't change with rotation around the Y axis\n\t\t\tdirZM   =  BLOCK_FACE_ZM,  // Pointing towards the Z- side of the prefab\n\t\t\tdirZP   =  BLOCK_FACE_ZP,  // Pointing towards the Z+ side of the prefab\n\n\t\t\t// Special kind of the vertical connectors (changes with rotation around the Y axis)\n\t\t\tdirYM_XM_ZM = BLOCK_FACE_MAX + 1,  // Pointing towards the Y- side of the prefab, conceptually at the X- Z- corner of the block\n\t\t\tdirYM_XM_ZP,                       // Pointing towards the Y- side of the prefab, conceptually at the X- Z+ corner of the block\n\t\t\tdirYM_XP_ZM,                       // Pointing towards the Y- side of the prefab, conceptually at the X+ Z- corner of the block\n\t\t\tdirYM_XP_ZP,                       // Pointing towards the Y- side of the prefab, conceptually at the X+ Z+ corner of the block\n\t\t\tdirYP_XM_ZM,                       // Pointing towards the Y+ side of the prefab, conceptually at the X- Z- corner of the block\n\t\t\tdirYP_XM_ZP,                       // Pointing towards the Y+ side of the prefab, conceptually at the X- Z+ corner of the block\n\t\t\tdirYP_XP_ZM,                       // Pointing towards the Y+ side of the prefab, conceptually at the X+ Z- corner of the block\n\t\t\tdirYP_XP_ZP,                       // Pointing towards the Y+ side of the prefab, conceptually at the X+ Z+ corner of the block\n\t\t};\n\n\t\t/** Position relative to the piece */\n\t\tVector3i m_Pos;\n\n\t\t/** Type of the connector. Any arbitrary number; the generator connects only connectors of opposite\n\t\t(negative) types. */\n\t\tint m_Type;\n\n\t\t/** Direction in which the connector is facing.\n\t\tWill be matched by the opposite direction for the connecting connector. */\n\t\teDirection m_Direction;\n\n\t\tcConnector(int a_X, int a_Y, int a_Z, int a_Type, eDirection a_Direction);\n\t\tcConnector(const Vector3i & a_Pos, int a_Type, eDirection a_Direction);\n\n\t\t/** Returns the position of the block that has the specified direction from the specified position.\n\t\tSimilar to ::AddFaceDirection() */\n\t\tstatic Vector3i AddDirection(const Vector3i & a_Pos, eDirection a_Direction);\n\n\t\t/** Returns the string representation of the direction.\n\t\tFor debugging purposes. */\n\t\tstatic const char * DirectionToString(eDirection a_Direction);\n\n\t\t/** Returns true if the specified number corresponds to a valid eDirection. */\n\t\tstatic bool IsValidDirection(int a_Direction);\n\n\t\t/** Returns the direction corresponding to the given direction rotated 180 degrees around the Y axis. */\n\t\tstatic eDirection RotateDirection(eDirection a_Direction);\n\n\t\t/** Returns the direction corresponding to the given direction rotated 90 degrees CCW around the Y axis. */\n\t\tstatic eDirection RotateDirectionCCW(eDirection a_Direction);\n\n\t\t/** Returns the direction corresponding to the given direction rotated 90 degrees CW around the Y axis. */\n\t\tstatic eDirection RotateDirectionCW(eDirection a_Direction);\n\n\t\t/** Returns the number of CCW rotations that a_RotatingDir requires in order to be the counter-direction of a_FixedDir.\n\t\tIe. if you have a connector with a_FixedDir and you're rotating a piece that has a connector with a_RotatingDir,\n\t\thow many CCW rotations it needs to make the connectors compatible.\n\t\tReturns -1 if it is impossible to fit the two directions. */\n\t\tstatic int GetNumCCWRotationsToFit(eDirection a_FixedDir, eDirection a_RotatingDir);\n\n\t\t/** Converts the string representation of a direction into the eDirection enum value.\n\t\tReturns true if successful, false on failure.\n\t\tAccepts both numbers and string representations such as \"x+\" or \"Y+X-Z+\". */\n\t\tstatic bool StringToDirection(const AString & a_Value, eDirection & a_Out);\n\t};\n\n\ttypedef std::vector<cConnector> cConnectors;\n\n\n\t/** Base class (interface) for strategies for placing the starting pieces vertically.\n\tDescendants can override the GetVerticalPlacement() method to provide custom placement decisions. */\n\tclass cVerticalStrategy\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants\n\t\tvirtual ~cVerticalStrategy() {}\n\n\t\t/** Returns the Y coord of the piece */\n\t\tvirtual int GetVerticalPlacement(int a_BlockX, int a_BlockZ) = 0;\n\n\t\t/** Initializes the strategy's parameters from the string representation.\n\t\ta_Params is the string containing only the parameters (substring after the first pipe character in the strategy description string).\n\t\tIf a_LogWarnings is true, logs any problems to the console.\n\t\tReturns true if successful, false if the string parsing failed.\n\t\tUsed when loading the strategy from a file. */\n\t\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) = 0;\n\n\t\t/** Called when the piece pool is assigned to a generator,\n\t\tso that the strategies may bind to the underlying subgenerators. */\n\t\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_TerrainHeightGen, int a_SeaLevel) {}\n\t};\n\n\ttypedef std::shared_ptr<cVerticalStrategy> cVerticalStrategyPtr;\n\n\n\t/** Base class (interface) for the vertical limit of piece placement.\n\tEach placed piece can have a limit, represented by this class, that gets queried for validity of the placement. */\n\tclass cVerticalLimit\n\t{\n\tpublic:\n\t\tvirtual ~cVerticalLimit() {}\n\n\t\t/** Called to inquire whether the specified piece can be placed at the specified height.\n\t\ta_BlockX, a_BlockZ is the column of the connector that is being queried.\n\t\ta_Height is the requested height of the piece's lowest block. */\n\t\tvirtual bool CanBeAtHeight(int a_BlockX, int a_BlockZ, int a_Height) = 0;\n\n\t\t/** Initializes the limit's parameters from the string representation.\n\t\ta_Params is the string containing only the parameters (substring after the first pipe character in the limit description string).\n\t\tReturns true if successful, false if the string parsing failed.\n\t\tIf a_LogWarnings is true, any error while parsing the string is output to the server console.\n\t\tUsed when loading the limit from a file. */\n\t\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) = 0;\n\n\t\t/** Called when the piece pool is assigned to a generator,\n\t\tso that the limits may bind to the underlying subgenerators. */\n\t\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_TerrainHeightGen, int a_SeaLevel) {}\n\t};\n\n\ttypedef std::shared_ptr<cVerticalLimit> cVerticalLimitPtr;\n\n\n\t/** Base class (interface) for piece modifiers. */\n\tclass cPieceModifier\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants\n\t\tvirtual ~cPieceModifier() {}\n\n\t\t/** Initializes the modifier's parameters from the string\n\t\trepresentation. a_Params is the string containing only the parameters\n\t\tIf a_LogWarnings is true, logs any problems to the console.\n\t\tReturns true if successful, false if the string parsing failed.\n\t\tUsed when loading the modifier from a file. */\n\t\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) = 0;\n\n\t\t/** Called prior to writing piece to a chunk, so that modifiers can modify blocks in the blockarea */\n\t\tvirtual void Modify(cBlockArea & a_Image, const Vector3i a_PiecePos, const int a_PieceNumRotations) = 0;\n\n\t\t/** Called when the piece pool is assigned to a generator,\n\t\tso that the modifiers can access world seed. */\n\t\tvirtual void AssignSeed(int a_Seed) {}\n\t};\n\n\n\ttypedef std::shared_ptr<cPieceModifier> cPieceModifierPtr;\n\n\ttypedef std::vector<cPieceModifierPtr> cPieceModifiers;\n\n\t/** The strategy used for vertical placement of this piece when it is used as a starting piece. */\n\tcVerticalStrategyPtr m_VerticalStrategy;\n\n\t/** The checker that verifies each placement's vertical position. */\n\tcVerticalLimitPtr m_VerticalLimit;\n\n\t/** The modifiers which are modifying piece's blocks. */\n\tcPieceModifiers m_Modifiers;\n\n\t/** Returns all of the available connectors that the piece has.\n\tEach connector has a (relative) position in the piece, and a type associated with it. */\n\tvirtual cConnectors GetConnectors(void) const = 0;\n\n\t/** Returns the dimensions of this piece.\n\tThe dimensions cover the entire piece, there is no block that the piece generates outside of this size. */\n\tvirtual Vector3i GetSize(void) const = 0;\n\n\t/** Returns the \"hitbox\" of this piece.\n\tA hitbox is what is compared and must not intersect other pieces' hitboxes when generating. */\n\tvirtual cCuboid GetHitBox(void) const = 0;\n\n\t/** Returns true if the piece can be rotated CCW the specific number of 90-degree turns. */\n\tvirtual bool CanRotateCCW(int a_NumRotations) const = 0;\n\n\t/** Returns the height, based on m_VerticalStrategy, for this piece when used as the starting piece.\n\tIf there's no strategy assigned to this piece, returns -1. */\n\tint GetStartingPieceHeight(int a_BlockX, int a_BlockZ)\n\t{\n\t\tif (m_VerticalStrategy != nullptr)\n\t\t{\n\t\t\treturn m_VerticalStrategy->GetVerticalPlacement(a_BlockX, a_BlockZ);\n\t\t}\n\t\treturn -1;\n\t}\n\n\tvoid SetVerticalStrategy(cVerticalStrategyPtr a_VerticalStrategy)\n\t{\n\t\tm_VerticalStrategy = std::move(a_VerticalStrategy);\n\t}\n\n\tcVerticalStrategyPtr GetVerticalStrategy(void) const\n\t{\n\t\treturn m_VerticalStrategy;\n\t}\n\n\tcVerticalLimitPtr GetVerticalLimit(void) const\n\t{\n\t\treturn m_VerticalLimit;\n\t}\n\n\tcPieceModifiers GetModifiers(void) const\n\t{\n\t\treturn m_Modifiers;\n\t}\n\n\t/** Sets the vertical strategy based on the description in the string.\n\tIf a_LogWarnings is true, logs the parsing problems into the server console.\n\tReturns true if successful, false if strategy parsing failed (no strategy assigned). */\n\tbool SetVerticalStrategyFromString(const AString & a_StrategyDesc, bool a_LogWarnings);\n\n\t/** Sets the vertical limit based on the description string.\n\tReturns true if successful, false if limit parsing failed (no limit assigned).\n\tIf a_LogWarnings is true, any problem is reported into the server console. */\n\tbool SetVerticalLimitFromString(const AString & a_LimitDesc, bool a_LogWarnings);\n\n\t/** Sets the modifiers with their params in the string.\n\tIf a_LogWarnings is true, logs the parsing problems into the server console.\n\tReturns true if successful, false if strategy parsing failed (no strategy\n\tassigned). */\n\tbool SetPieceModifiersFromString(const AString & a_Definition, bool a_LogWarnings);\n\n\t/** Returns a copy of the a_Pos after rotating the piece the specified number of CCW rotations. */\n\tVector3i RotatePos(const Vector3i & a_Pos, int a_NumCCWRotations) const;\n\n\t/** Returns a copy of the connector that is rotated and then moved by the specified amounts. */\n\tcConnector RotateMoveConnector(const cConnector & a_Connector, int a_NumCCWRotations, int a_MoveX, int a_MoveY, int a_MoveZ) const;\n\n\t/** Returns the hitbox after the specified number of rotations and moved so that a_MyConnector is placed at a_ToConnectorPos. */\n\tcCuboid RotateHitBoxToConnector(const cConnector & a_MyConnector, const Vector3i & a_ToConnectorPos, int a_NumCCWRotations) const;\n\n\t/** Returns the hitbox after the specified number of CCW rotations and moved by the specified amounts. */\n\tcCuboid RotateMoveHitBox(int a_NumCCWRotations, int a_MoveX, int a_MoveY, int a_MoveZ) const;\n};\n\ntypedef std::vector<cPiece *> cPieces;\n\n\n\n\n// fwd:\nclass cPlacedPiece;\n\n\n\n\n\n/** This class is an interface that stores pieces for a generator.\nProvides lists of pieces based on criteria (IsStarting, HasConnector).\nProvides per-piece weights for random distribution of individual pieces. */\nclass cPiecePool\n{\npublic:\n\t// Force a virtual destructor in all descendants:\n\tvirtual ~cPiecePool() {}\n\n\t/** Returns a list of pieces that contain the specified connector type.\n\tThe cPiece pointers returned are managed by the pool and the caller doesn't free them. */\n\tvirtual cPieces GetPiecesWithConnector(int a_ConnectorType) = 0;\n\n\t/** Returns the pieces that should be used as the starting point.\n\tMultiple starting points are supported, one of the returned piece will be chosen. */\n\tvirtual cPieces GetStartingPieces(void) = 0;\n\n\t/** Returns the relative weight with which the a_NewPiece is to be selected for placing under a_PlacedPiece through a_ExistingConnector.\n\ta_ExistingConnector is the original connector, before any movement or rotation is applied to it.\n\tThis allows the pool to tweak the piece's chances, based on the previous pieces in the tree and the connector used.\n\tThe higher the number returned, the higher the chance the piece will be chosen. 0 means the piece will never be chosen. */\n\tvirtual int GetPieceWeight(\n\t\tconst cPlacedPiece & a_PlacedPiece,\n\t\tconst cPiece::cConnector & a_ExistingConnector,\n\t\tconst cPiece & a_NewPiece\n\t)\n\t{\n\t\treturn 1;\n\t}\n\n\t/** Returns the relative weight with which the a_NewPiece is to be selected for placing as the first piece.\n\tThis allows the pool to tweak the piece's chances.\n\tThe higher the number returned, the higher the chance the piece will be chosen. 0 means the piece will not be chosen.\n\tIf all pieces return 0, a random piece is chosen, with all equal chances. */\n\tvirtual int GetStartingPieceWeight(const cPiece & a_NewPiece)\n\t{\n\t\treturn 1;\n\t}\n\n\t/** Called after a piece is placed, to notify the pool that it has been used.\n\tThe pool may adjust the pieces it will return the next time. */\n\tvirtual void PiecePlaced(const cPiece & a_Piece) = 0;\n\n\t/** Called when the pool has finished the current structure and should reset any piece-counters it has\n\tfor a new structure. */\n\tvirtual void Reset(void) = 0;\n};\n\n\n\n\n\n/** Represents a single piece that has been placed to specific coords in the world. */\nclass cPlacedPiece\n{\npublic:\n\tcPlacedPiece(const cPlacedPiece * a_Parent, const cPiece & a_Piece, const Vector3i & a_Coords, int a_NumCCWRotations);\n\n\tconst cPlacedPiece * GetParent           (void) const { return m_Parent; }\n\tconst cPiece &       GetPiece            (void) const { return *m_Piece; }\n\tconst Vector3i &     GetCoords           (void) const { return m_Coords; }\n\tint                  GetNumCCWRotations  (void) const { return m_NumCCWRotations; }\n\tconst cCuboid &      GetHitBox           (void) const { return m_HitBox; }\n\tint                  GetDepth            (void) const { return m_Depth; }\n\tbool                 HasBeenMovedToGround(void) const { return m_HasBeenMovedToGround; }\n\n\t/** Returns the coords as a modifiable object. */\n\tVector3i & GetCoords(void) { return m_Coords; }\n\n\t/** Returns the connector at the specified index, rotated in the actual placement.\n\tUndefined behavior if a_Index is out of range. */\n\tcPiece::cConnector GetRotatedConnector(size_t a_Index) const;\n\n\t/** Returns a copy of the specified connector, modified to account for the translation and rotation for\n\tthis placement. */\n\tcPiece::cConnector GetRotatedConnector(const cPiece::cConnector & a_Connector) const;\n\n\t/** Moves the placed piece Y-wise by the specified offset.\n\tSets m_HasBeenMovedToGround to true, too.\n\tUsed eg. by village houses. */\n\tvoid MoveToGroundBy(int a_OffsetY);\n\nprotected:\n\tconst cPlacedPiece * m_Parent;\n\tconst cPiece * m_Piece;\n\tVector3i m_Coords;\n\tint m_NumCCWRotations;\n\tcCuboid m_HitBox;  // Hitbox of the placed piece, in world coords\n\tint m_Depth;       // Depth in the generated piece tree\n\n\t/** Set to true once the piece has been moved Y-wise.\n\tUsed eg. by village houses. */\n\tbool m_HasBeenMovedToGround;\n};\n\ntypedef std::unique_ptr<cPlacedPiece> cPlacedPiecePtr;\ntypedef std::vector<cPlacedPiecePtr> cPlacedPieces;\n"
  },
  {
    "path": "src/Generating/PieceStructuresGen.cpp",
    "content": "\n// PieceStructuresGen.cpp\n\n// Declares the cPieceStructuresGen class representing the PieceStructures finisher generator\n\n#include \"Globals.h\"\n#include \"PieceStructuresGen.h\"\n#include \"PrefabStructure.h\"\n#include \"PieceGeneratorBFSTree.h\"\n#include \"../IniFile.h\"\n\n\n\n\n\nclass cPieceStructuresGen::cGen:\n\tpublic cGridStructGen\n{\n\tusing Super = cGridStructGen;\n\npublic:\n\n\tcGen(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen, int a_SeaLevel, const AString & a_Name):\n\t\tSuper(a_Seed),\n\t\tm_BiomeGen(a_BiomeGen),\n\t\tm_HeightGen(a_HeightGen),\n\t\tm_SeaLevel(a_SeaLevel),\n\t\tm_Name(a_Name),\n\t\tm_MaxDepth(5)\n\t{\n\t}\n\n\n\n\t/** Loads the piecepool from a file.\n\tReturns true on success, logs warning and returns false on failure. */\n\tbool LoadFromFile(const AString & a_FileName)\n\t{\n\t\t// Load the piecepool from the file, log any warnings:\n\t\tif (!m_PiecePool.LoadFromFile(a_FileName, true))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (NoCaseCompare(m_PiecePool.GetIntendedUse(), \"PieceStructures\") != 0)\n\t\t{\n\t\t\tLOGWARNING(\"PieceStructures generator: File %s is intended for use in \\\"%s\\\", rather than piece structures. Loading the file, but the generator may behave unexpectedly.\",\n\t\t\t\ta_FileName.c_str(), m_PiecePool.GetIntendedUse().c_str()\n\t\t\t);\n\t\t}\n\t\tm_PiecePool.AssignGens(m_Seed, m_BiomeGen, m_HeightGen, m_SeaLevel);\n\n\t\t// Apply generator params from the piecepool (in the metadata) into the generator:\n\t\tauto & GeneratorParams = m_PiecePool.GetAllMetadata();\n\t\tSetGeneratorParams(GeneratorParams);\n\t\tm_MaxDepth = GetStringMapInteger<int>(GeneratorParams, \"MaxDepth\", m_MaxDepth);\n\n\t\treturn true;\n\t}\n\n\n\n\t// cGridStructGen overrides:\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override\n\t{\n\t\tcPlacedPieces OutPieces;\n\t\tcPieceGeneratorBFSTree PieceTree(m_PiecePool, m_Seed);\n\t\tPieceTree.PlacePieces(a_OriginX, a_OriginZ, m_MaxDepth, OutPieces);\n\t\treturn std::make_shared<cPrefabStructure>(a_GridX, a_GridZ, a_OriginX, a_OriginZ, std::move(OutPieces), m_HeightGen);\n\t}\n\n\nprotected:\n\n\t/** The type used for storing a connection from one piece to another, while building the piece tree. */\n\tstruct cConnection\n\t{\n\t\tcPiece * m_Piece;                  // The piece being connected\n\t\tcPiece::cConnector m_Connector;    // The piece's connector being used (relative non-rotated coords)\n\t\tint m_NumCCWRotations;             // Number of rotations necessary to match the two connectors\n\t\tint m_Weight;                      // Relative chance that this connection will be chosen\n\n\t\tcConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations, int a_Weight);\n\t};\n\ttypedef std::vector<cConnection> cConnections;\n\n\n\t/** The type used for storing a pool of connectors that will be attempted to expand by another piece. */\n\tstruct cFreeConnector\n\t{\n\t\tcPlacedPiece * m_Piece;\n\t\tcPiece::cConnector m_Connector;\n\n\t\tcFreeConnector(cPlacedPiece * a_Piece, const cPiece::cConnector & a_Connector);\n\t};\n\ttypedef std::vector<cFreeConnector> cFreeConnectors;\n\n\t/** The underlying biome generator that defines whether the structure is created or not */\n\tcBiomeGen & m_BiomeGen;\n\n\t/** The underlying height generator, used to position the prefabs crossing chunk borders if they are set to FitGround. */\n\tcTerrainHeightGen & m_HeightGen;\n\n\t/** The world's sea level, if available. Used for some cVerticalStrategy descendants. */\n\tint m_SeaLevel;\n\n\t/** The name that is used for reporting. */\n\tAString m_Name;\n\n\t/** All available prefabs. */\n\tcPrefabPiecePool m_PiecePool;\n\n\t/** Maximum depth of the generated piece tree. */\n\tint m_MaxDepth;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPieceStructuresGen:\n\ncPieceStructuresGen::cPieceStructuresGen(int a_Seed):\n\tm_Seed(a_Seed)\n{\n}\n\n\n\n\n\nbool cPieceStructuresGen::Initialize(const AString & a_Prefabs, int a_SeaLevel, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen)\n{\n\t// Load each piecepool:\n\tauto Structures = StringSplitAndTrim(a_Prefabs, \"|\");\n\tfor (const auto & Structure : Structures)\n\t{\n\t\tauto FileName = fmt::format(FMT_STRING(\"Prefabs{0}PieceStructures{0}{1}.cubeset\"), cFile::PathSeparator(), Structure);\n\t\tif (!cFile::IsFile(FileName))\n\t\t{\n\t\t\tFileName.append(\".gz\");\n\t\t\tif (!cFile::IsFile(FileName))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"Cannot load PieceStructures cubeset file %s\", FileName);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tauto Gen = std::make_shared<cGen>(m_Seed, a_BiomeGen, a_HeightGen, a_SeaLevel, Structure);\n\t\tif (Gen->LoadFromFile(FileName))\n\t\t{\n\t\t\tm_Gens.push_back(Gen);\n\t\t}\n\t}\n\n\t// Report a warning if no generators available:\n\tif (m_Gens.empty())\n\t{\n\t\tLOGWARNING(\"The PieceStructures generator was asked to generate \\\"%s\\\", but none of the prefabs are valid.\", a_Prefabs);\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cPieceStructuresGen::GenFinish(cChunkDesc & a_Chunk)\n{\n\tfor (auto & Gen : m_Gens)\n\t{\n\t\tGen->GenFinish(a_Chunk);\n\t}\n}\n"
  },
  {
    "path": "src/Generating/PieceStructuresGen.h",
    "content": "\n// PieceStructuresGen.h\n\n// Declares the cPieceStructuresGen class representing the PieceStructures finisher generator\n\n/*\nThis generator loads various pieces from \"piecepool\" files, and each such piecepool is then used in a separate\ncPieceGenerator instance.\n*/\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"PrefabPiecePool.h\"\n\n\n\n\n\nclass cPieceStructuresGen:\n\tpublic cFinishGen\n{\n\tusing Super = cFinishGen;\n\npublic:\n\n\tcPieceStructuresGen(int a_Seed);\n\n\t/** Initializes the generator based on the specified prefab sets.\n\ta_Prefabs contains the list of prefab sets that should be activated, \"|\"-separated.\n\tAll problems are logged to the console and the generator skips over them.\n\tReturns true if at least one prefab set is valid (the generator should be kept). */\n\tbool Initialize(const AString & a_Prefabs, int a_SeaLevel, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen);\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\nprotected:\n\t/** The generator doing the work for a single prefab set.\n\tForward-declared so that its implementation changes don't affect the header. */\n\tclass cGen;\n\n\ttypedef std::shared_ptr<cGen> cGenPtr;\n\ttypedef std::vector<cGenPtr> cGenPtrs;\n\n\n\t/** The individual structure generators, one per piecepool. */\n\tcGenPtrs m_Gens;\n\n\t/** The seed for the random number generator */\n\tint m_Seed;\n};\n"
  },
  {
    "path": "src/Generating/Prefab.cpp",
    "content": "\n// Prefab.cpp\n\n/*\nImplements the cPrefab class, representing a cPiece descendant for the cPieceGenerator that\nuses a prefabricate in a cBlockArea for drawing itself.\n*/\n\n#include \"Globals.h\"\n#include \"Prefab.h\"\n#include \"../WorldStorage/SchematicFileSerializer.h\"\n#include \"ChunkDesc.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\ncPrefab::cPrefab(const cPrefab::sDef & a_Def) :\n\tm_Size(a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ),\n\tm_HitBox(\n\t\t{a_Def.m_HitboxMinX, a_Def.m_HitboxMinY, a_Def.m_HitboxMinZ},\n\t\t{a_Def.m_HitboxMaxX, a_Def.m_HitboxMaxY, a_Def.m_HitboxMaxZ}\n\t),\n\tm_AllowedRotations(a_Def.m_AllowedRotations),\n\tm_MergeStrategy(a_Def.m_MergeStrategy),\n\tm_ExtendFloorStrategy(a_Def.m_ExtendFloorStrategy),\n\tm_DefaultWeight(a_Def.m_DefaultWeight),\n\tm_AddWeightIfSame(a_Def.m_AddWeightIfSame),\n\tm_MoveToGround(a_Def.m_MoveToGround)\n{\n\tm_BlockArea[0].Create(m_Size);\n\tCharMap cm;\n\tParseCharMap(cm, a_Def.m_CharMap);\n\tParseBlockImage(cm, a_Def.m_Image);\n\tParseConnectors(a_Def.m_Connectors);\n\tParseDepthWeight(a_Def.m_DepthWeight);\n\n\tAddRotatedBlockAreas();\n}\n\n\n\n\n\ncPrefab::cPrefab(const cBlockArea & a_Image, int a_AllowedRotations) :\n\tm_Size(a_Image.GetSize()),\n\tm_AllowedRotations(a_AllowedRotations),\n\tm_MergeStrategy(cBlockArea::msOverwrite),\n\tm_ExtendFloorStrategy(efsNone),\n\tm_DefaultWeight(1),\n\tm_AddWeightIfSame(0),\n\tm_MoveToGround(false)\n{\n\tm_HitBox.p1.Set(0, 0, 0);\n\tm_HitBox.p2.Set(m_Size.x - 1, m_Size.y - 1, m_Size.z - 1);\n\tm_BlockArea[0].CopyFrom(a_Image);\n\tAddRotatedBlockAreas();\n}\n\n\n\n\n\ncPrefab::cPrefab(const cBlockArea & a_Image) :\n\tm_Size(a_Image.GetSize()),\n\tm_AllowedRotations(0),\n\tm_MergeStrategy(cBlockArea::msOverwrite),\n\tm_ExtendFloorStrategy(efsNone),\n\tm_DefaultWeight(1),\n\tm_AddWeightIfSame(0),\n\tm_MoveToGround(false)\n{\n\tm_HitBox.p1.Set(0, 0, 0);\n\tm_HitBox.p2.Set(m_Size.x - 1, m_Size.y - 1, m_Size.z - 1);\n\tm_BlockArea[0].CopyFrom(a_Image);\n}\n\n\n\n\n\ncPrefab::cPrefab(const AString & a_BlockDefinitions, const AString & a_BlockData, int a_SizeX, int a_SizeY, int a_SizeZ) :\n\tm_Size(a_SizeX, a_SizeY, a_SizeZ),\n\tm_AllowedRotations(0),\n\tm_MergeStrategy(cBlockArea::msOverwrite),\n\tm_ExtendFloorStrategy(efsNone),\n\tm_DefaultWeight(1),\n\tm_AddWeightIfSame(0),\n\tm_MoveToGround(false)\n{\n\tm_HitBox.p1.Set(0, 0, 0);\n\tm_HitBox.p2.Set(m_Size.x - 1, m_Size.y - 1, m_Size.z - 1);\n\tm_BlockArea[0].Create(m_Size);\n\tCharMap cm;\n\tParseCharMap(cm, a_BlockDefinitions.c_str());\n\tParseBlockImage(cm, a_BlockData.c_str());\n}\n\n\n\n\n\nvoid cPrefab::AddRotatedBlockAreas(void)\n{\n\t// 1 CCW rotation:\n\tif ((m_AllowedRotations & 0x01) != 0)\n\t{\n\t\tm_BlockArea[1].CopyFrom(m_BlockArea[0]);\n\t\tm_BlockArea[1].RotateCCW();\n\t}\n\n\t// 2 rotations are the same as mirroring twice; mirroring is faster because it has no reallocations\n\tif ((m_AllowedRotations & 0x02) != 0)\n\t{\n\t\tm_BlockArea[2].CopyFrom(m_BlockArea[0]);\n\t\tm_BlockArea[2].MirrorXY();\n\t\tm_BlockArea[2].MirrorYZ();\n\t}\n\n\t// 3 CCW rotations = 1 CW rotation:\n\tif ((m_AllowedRotations & 0x04) != 0)\n\t{\n\t\tm_BlockArea[3].CopyFrom(m_BlockArea[0]);\n\t\tm_BlockArea[3].RotateCW();\n\t}\n}\n\n\n\n\n\nvoid cPrefab::Draw(cChunkDesc & a_Dest, const cPlacedPiece * a_Placement) const\n{\n\tDraw(a_Dest, a_Placement->GetCoords(), a_Placement->GetNumCCWRotations());\n}\n\n\n\n\n\nvoid cPrefab::Draw(cChunkDesc & a_Dest, const Vector3i & a_Placement, int a_NumRotations) const\n{\n\t// Draw the basic image:\n\tVector3i Placement(a_Placement);\n\tint ChunkStartX = a_Dest.GetChunkX() * cChunkDef::Width;\n\tint ChunkStartZ = a_Dest.GetChunkZ() * cChunkDef::Width;\n\tPlacement.Move(-ChunkStartX, 0, -ChunkStartZ);\n\tconst cBlockArea & Image = m_BlockArea[a_NumRotations];\n\n\t// If the placement is outside this chunk, bail out:\n\tif (\n\t\t(Placement.x > cChunkDef::Width) || (Placement.x + Image.GetSizeX() < 0) ||\n\t\t(Placement.z > cChunkDef::Width) || (Placement.z + Image.GetSizeZ() < 0)\n\t)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_Modifiers.size() == 0)\n\t{\n\t\t// Write the image:\n\t\ta_Dest.WriteBlockArea(Image, Placement.x, Placement.y, Placement.z, m_MergeStrategy);\n\t}\n\telse\n\t{\n\t\tcBlockArea RandomizedImage;\n\t\tImage.CopyTo(RandomizedImage);\n\n\t\tfor (size_t i = 0; i < m_Modifiers.size(); i++)\n\t\t{\n\t\t\tm_Modifiers[i]->Modify(RandomizedImage, a_Placement, a_NumRotations);\n\t\t}\n\n\t\t// Write the modified image:\n\t\ta_Dest.WriteBlockArea(RandomizedImage, Placement.x, Placement.y, Placement.z, m_MergeStrategy);\n\t}\n\n\t// If requested, draw the floor (from the bottom of the prefab down to the nearest non-air)\n\tswitch (m_ExtendFloorStrategy)\n\t{\n\t\tcase efsNone: break;  // Nothing needed\n\t\tcase efsRepeatBottomTillNonAir:\n\t\t{\n\t\t\tint MaxX = Image.GetSizeX();\n\t\t\tint MaxZ = Image.GetSizeZ();\n\t\t\tfor (int z = 0; z < MaxZ; z++)\n\t\t\t{\n\t\t\t\tint RelZ = Placement.z + z;\n\t\t\t\tif ((RelZ < 0) || (RelZ >= cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\t// Z coord outside the chunk\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfor (int x = 0; x < MaxX; x++)\n\t\t\t\t{\n\t\t\t\t\tint RelX = Placement.x + x;\n\t\t\t\t\tif ((RelX < 0) || (RelX >= cChunkDef::Width))\n\t\t\t\t\t{\n\t\t\t\t\t\t// X coord outside the chunk\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tBLOCKTYPE BlockType;\n\t\t\t\t\tNIBBLETYPE BlockMeta;\n\t\t\t\t\tImage.GetRelBlockTypeMeta(x, 0, z, BlockType, BlockMeta);\n\t\t\t\t\tif ((BlockType == E_BLOCK_AIR) || (BlockType == E_BLOCK_SPONGE))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Do not expand air nor sponge blocks\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tfor (int y = Placement.y - 1; y >= 0; y--)\n\t\t\t\t\t{\n\t\t\t\t\t\tBLOCKTYPE ExistingBlock = a_Dest.GetBlockType(RelX, y, RelZ);\n\t\t\t\t\t\tif (ExistingBlock != E_BLOCK_AIR)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// End the expansion for this column, reached the end\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta_Dest.SetBlockTypeMeta(RelX, y, RelZ, BlockType, BlockMeta);\n\t\t\t\t\t}  // for y\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t\tbreak;\n\t\t}  // efsRepeatBottomTillNonAir\n\n\t\tcase efsRepeatBottomTillSolid:\n\t\t{\n\t\t\tint MaxX = Image.GetSizeX();\n\t\t\tint MaxZ = Image.GetSizeZ();\n\t\t\tfor (int z = 0; z < MaxZ; z++)\n\t\t\t{\n\t\t\t\tint RelZ = Placement.z + z;\n\t\t\t\tif ((RelZ < 0) || (RelZ >= cChunkDef::Width))\n\t\t\t\t{\n\t\t\t\t\t// Z coord outside the chunk\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfor (int x = 0; x < MaxX; x++)\n\t\t\t\t{\n\t\t\t\t\tint RelX = Placement.x + x;\n\t\t\t\t\tif ((RelX < 0) || (RelX >= cChunkDef::Width))\n\t\t\t\t\t{\n\t\t\t\t\t\t// X coord outside the chunk\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tBLOCKTYPE BlockType;\n\t\t\t\t\tNIBBLETYPE BlockMeta;\n\t\t\t\t\tImage.GetRelBlockTypeMeta(x, 0, z, BlockType, BlockMeta);\n\t\t\t\t\tif ((BlockType == E_BLOCK_AIR) || (BlockType == E_BLOCK_SPONGE))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Do not expand air nor sponge blocks\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tfor (int y = Placement.y - 1; y >= 0; y--)\n\t\t\t\t\t{\n\t\t\t\t\t\tBLOCKTYPE ExistingBlock = a_Dest.GetBlockType(RelX, y, RelZ);\n\t\t\t\t\t\tif (cBlockInfo::IsSolid(ExistingBlock))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// End the expansion for this column, reached the end\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta_Dest.SetBlockTypeMeta(RelX, y, RelZ, BlockType, BlockMeta);\n\t\t\t\t\t}  // for y\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t\tbreak;\n\t\t}  // efsRepeatBottomTillSolid\n\t}\n}\n\n\n\n\n\nbool cPrefab::HasConnectorType(int a_ConnectorType) const\n{\n\tfor (cConnectors::const_iterator itr = m_Connectors.begin(), end = m_Connectors.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->m_Type == a_ConnectorType)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}  // for itr - m_Connectors[]\n\treturn false;\n}\n\n\n\n\n\nint cPrefab::GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector) const\n{\n\t// Use the default or per-depth weight:\n\tcDepthWeight::const_iterator itr = m_DepthWeight.find(a_PlacedPiece.GetDepth() + 1);\n\tint res = (itr == m_DepthWeight.end()) ? m_DefaultWeight : itr->second;\n\n\t// If the piece is the same as the parent, apply the m_AddWeightIfSame modifier:\n\tconst cPiece * ParentPiece = &a_PlacedPiece.GetPiece();\n\tconst cPiece * ThisPiece = this;\n\tif (ThisPiece == ParentPiece)\n\t{\n\t\tres += m_AddWeightIfSame;\n\t}\n\treturn res;\n}\n\n\n\n\n\nvoid cPrefab::SetDefaultWeight(int a_DefaultWeight)\n{\n\tm_DefaultWeight = a_DefaultWeight;\n}\n\n\n\n\n\nvoid cPrefab::AddConnector(int a_RelX, int a_RelY, int a_RelZ, cPiece::cConnector::eDirection a_Direction, int a_Type)\n{\n\tm_Connectors.emplace_back(a_RelX, a_RelY, a_RelZ, a_Type, a_Direction);\n}\n\n\n\n\n\nvoid cPrefab::SetAllowedRotations(int a_AllowedRotations)\n{\n\tm_AllowedRotations = a_AllowedRotations;\n\tAddRotatedBlockAreas();\n}\n\n\n\n\n\nvoid cPrefab::ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef)\n{\n\tASSERT(a_CharMapDef != nullptr);\n\n\t// Initialize the charmap to all-invalid values:\n\tfor (size_t i = 0; i < ARRAYCOUNT(a_CharMapOut); i++)\n\t{\n\t\ta_CharMapOut[i].m_BlockType = 0;\n\t\ta_CharMapOut[i].m_BlockMeta = 16;  // Mark unassigned entries with a meta that is impossible otherwise\n\t}\n\n\t// Process the lines in the definition:\n\tAStringVector Lines = StringSplitAndTrim(a_CharMapDef, \"\\n\");\n\tfor (AStringVector::const_iterator itr = Lines.begin(), end = Lines.end(); itr != end; ++itr)\n\t{\n\t\tAStringVector CharDef = StringSplitAndTrim(*itr, \":\");\n\t\tsize_t NumElements = CharDef.size();\n\t\tif ((NumElements < 2) || CharDef[0].empty() || CharDef[1].empty())\n\t\t{\n\t\t\tLOGWARNING(\"Bad prefab CharMap definition line: \\\"%s\\\", skipping.\", itr->c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tunsigned char Src = static_cast<unsigned char>(CharDef[0][0]);\n\t\tASSERT(a_CharMapOut[Src].m_BlockMeta == 16);  // This letter has not been assigned yet?\n\t\ta_CharMapOut[Src].m_BlockType = static_cast<BLOCKTYPE>(atoi(CharDef[1].c_str()));\n\t\tNIBBLETYPE BlockMeta = 0;\n\t\tif ((NumElements >= 3) && !CharDef[2].empty())\n\t\t{\n\t\t\tBlockMeta = static_cast<NIBBLETYPE>(atoi(CharDef[2].c_str()));\n\t\t\tASSERT((BlockMeta <= 15));\n\t\t}\n\t\ta_CharMapOut[Src].m_BlockMeta = BlockMeta;\n\t}  // for itr - Lines[]\n}\n\n\n\n\n\nvoid cPrefab::ParseBlockImage(const CharMap & a_CharMap, const char * a_BlockImage)\n{\n\t// Map each letter in the a_BlockImage (from the in-source definition) to real blocktype / blockmeta:\n\tfor (int y = 0; y < m_Size.y; y++)\n\t{\n\t\tfor (int z = 0; z < m_Size.z; z++)\n\t\t{\n\t\t\tconst unsigned char * BlockImage = reinterpret_cast<const unsigned char *>(a_BlockImage + y * m_Size.x * m_Size.z + z * m_Size.x);\n\t\t\tfor (int x = 0; x < m_Size.x; x++)\n\t\t\t{\n\t\t\t\tconst sBlockTypeDef & MappedValue = a_CharMap[BlockImage[x]];\n\t\t\t\tASSERT(MappedValue.m_BlockMeta != 16);  // Using a letter not defined in the CharMap?\n\t\t\t\tm_BlockArea[0].SetRelBlockTypeMeta(x, y, z, MappedValue.m_BlockType, MappedValue.m_BlockMeta);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cPrefab::ParseConnectors(const char * a_ConnectorsDef)\n{\n\tASSERT(a_ConnectorsDef != nullptr);\n\n\tAStringVector Lines = StringSplitAndTrim(a_ConnectorsDef, \"\\n\");\n\tfor (AStringVector::const_iterator itr = Lines.begin(), end = Lines.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->empty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// Split into components: \"Type: X, Y, Z: Direction\":\n\t\tAStringVector Defs = StringSplitAndTrim(*itr, \":\");\n\t\tif (Defs.size() != 3)\n\t\t{\n\t\t\tLOGWARNING(\"Bad prefab Connector definition line: \\\"%s\\\", skipping.\", itr->c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tAStringVector Coords = StringSplitAndTrim(Defs[1], \",\");\n\t\tif (Coords.size() != 3)\n\t\t{\n\t\t\tLOGWARNING(\"Bad prefab Connector coords definition: \\\"%s\\\", skipping.\", Defs[1].c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check that the Direction is valid:\n\t\tcPiece::cConnector::eDirection Direction;\n\t\tif (!cPiece::cConnector::StringToDirection(Defs[2], Direction))\n\t\t{\n\t\t\tLOGWARNING(\"Bad prefab Connector direction: \\\"%s\\\", skipping.\", Defs[2].c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Add the connector:\n\t\tm_Connectors.push_back(cPiece::cConnector(\n\t\t\tatoi(Coords[0].c_str()), atoi(Coords[1].c_str()), atoi(Coords[2].c_str()),  // Connector pos\n\t\t\tatoi(Defs[0].c_str()),  // Connector type\n\t\t\tDirection\n\t\t));\n\t}  // for itr - Lines[]\n}\n\n\n\n\n\nvoid cPrefab::ParseDepthWeight(const char * a_DepthWeightDef)\n{\n\t// The member needn't be defined at all, if so, skip:\n\tif (a_DepthWeightDef == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// Split into individual records: \"Record | Record | Record\"\n\tAStringVector Defs = StringSplitAndTrim(a_DepthWeightDef, \"|\");\n\n\t// Add each record's contents:\n\tfor (AStringVector::const_iterator itr = Defs.begin(), end = Defs.end(); itr != end; ++itr)\n\t{\n\t\t// Split into components: \"Depth : Weight\"\n\t\tAStringVector Components = StringSplitAndTrim(*itr, \":\");\n\t\tif (Components.size() != 2)\n\t\t{\n\t\t\tLOGWARNING(\"Bad prefab DepthWeight record: \\\"%s\\\", skipping.\", itr->c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Parse depth:\n\t\tint Depth = atoi(Components[0].c_str());\n\t\tif ((Depth == 0) && (Components[0] != \"0\"))\n\t\t{\n\t\t\tLOGWARNING(\"Bad prefab DepthWeight record, cannot parse depth \\\"%s\\\", skipping.\", Components[0].c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Parse weight:\n\t\tint Weight = atoi(Components[1].c_str());\n\t\tif ((Weight == 0) && (Components[1] != \"0\"))\n\t\t{\n\t\t\tLOGWARNING(\"Bad prefab DepthWeight record, cannot parse weight \\\"%s\\\", skipping.\", Components[1].c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Save to map:\n\t\tASSERT(m_DepthWeight.find(Depth) == m_DepthWeight.end());  // Not a duplicate\n\t\tm_DepthWeight[Depth] = Weight;\n\t}  // for itr - Defs[]\n}\n\n\n\n\n\ncPiece::cConnectors cPrefab::GetConnectors(void) const\n{\n\treturn m_Connectors;\n}\n\n\n\n\n\nVector3i cPrefab::GetSize(void) const\n{\n\treturn m_Size;\n}\n\n\n\n\n\ncCuboid cPrefab::GetHitBox(void) const\n{\n\treturn m_HitBox;\n}\n\n\n\n\n\nbool cPrefab::CanRotateCCW(int a_NumRotations) const\n{\n\t// Either zero rotations\n\t// Or the proper bit in m_AllowedRotations is set\n\treturn (a_NumRotations == 0) || ((m_AllowedRotations & (1 << ((a_NumRotations + 3) % 4))) != 0);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/Prefab.h",
    "content": "\n// Prefab.h\n\n/*\nDeclares the cPrefab class, representing a cPiece descendant for the cPieceGenerator that\nuses a prefabricate in a cBlockArea for drawing itself.\nThe class can be constructed from data that is stored directly in the executable, in a sPrefabDef structure\ndeclared in this file as well; the Gallery server exports areas in this format.\n*/\n\n\n\n\n\n#pragma once\n\n#include \"PiecePool.h\"\n#include \"../BlockArea.h\"\n\n\n\n\n\n// fwd:\nclass cChunkDesc;\n\n\n\n\n\nclass cPrefab :\n\tpublic cPiece\n{\npublic:\n\t/** How to handle the space between the prefab bottom and the terrain top. */\n\tenum eExtendFloorStrategy\n\t{\n\t\tefsNone,                    ///< No processing, the prefab is left \"floating in the air\"\n\t\tefsRepeatBottomTillNonAir,  ///< Repeat the bottom-most block down until the first non-air block\n\t\tefsRepeatBottomTillSolid,   ///< Repeat the bottom-most block down until the first solid block; non-solids are overwritten\n\t};\n\n\tstruct sDef\n\t{\n\t\tint m_SizeX;\n\t\tint m_SizeY;\n\t\tint m_SizeZ;\n\n\t\t/** The hitbox used for collision-checking between prefabs. Relative to the bounds. */\n\t\tint m_HitboxMinX, m_HitboxMinY, m_HitboxMinZ;\n\t\tint m_HitboxMaxX, m_HitboxMaxY, m_HitboxMaxZ;\n\n\t\t/** The mapping between characters in m_Image and the blocktype / blockmeta.\n\t\tFormat: \"Char: BlockType: BlockMeta \\n Char: BlockType : BlockMeta \\n ...\" */\n\t\tconst char * m_CharMap;\n\n\t\t/** The actual image to be used for the prefab. Organized YZX (Y changes the least often).\n\t\tEach character represents a single block, the type is mapped through m_CharMap. */\n\t\tconst char * m_Image;\n\n\t\t/** List of connectors.\n\t\tFormat: \"Type: X, Y, Z : Direction \\n Type : X, Y, Z : Direction \\n ...\".\n\t\tType is an arbitrary number, Direction is the BlockFace constant value (0 .. 5). */\n\t\tconst char * m_Connectors;\n\n\t\t/** Bitmask specifying the allowed rotations.\n\t\tN rotations CCW are allowed if bit N is set. */\n\t\tint m_AllowedRotations;\n\n\t\t/** The merge strategy to use while drawing the prefab. */\n\t\tcBlockArea::eMergeStrategy m_MergeStrategy;\n\n\t\t/** How the prefab should handle not being on top of the ground.\n\t\tThis is used for houses to be \"on the ground\", as well as nether fortresses not to float. */\n\t\teExtendFloorStrategy m_ExtendFloorStrategy;\n\n\t\t/** Chance of this piece being used, if no other modifier is active. */\n\t\tint m_DefaultWeight;\n\n\t\t/** Chances of this piece being used, per depth of the generated piece tree.\n\t\tThe starting piece has a depth of 0, the pieces connected to it are depth 1, etc.\n\t\tThe specified depth stands for the depth of the new piece (not the existing already-placed piece),\n\t\tso valid depths start at 1.\n\t\tFormat: \"Depth : Weight | Depth : Weight | Depth : Weight ...\"\n\t\tDepths that are not specified will use the m_DefaultWeight value. */\n\t\tconst char * m_DepthWeight;\n\n\t\t/** The weight to add to this piece's base per-depth chance if the previous piece is the same.\n\t\tCan be positive or negative.\n\t\tThis is used e. g. to make nether bridges prefer spanning multiple segments or to penalize turrets next to each other. */\n\t\tint m_AddWeightIfSame;\n\n\t\t/** If true, the piece will be moved Y-wise so that its first connector is sitting on the terrain.\n\t\tThis is used e. g. for village houses. */\n\t\tbool m_MoveToGround;\n\t};\n\n\n\t/** Creates a prefab from the provided definition. */\n\tcPrefab(const sDef & a_Def);\n\n\t/** Creates a prefab based on the given BlockArea and allowed rotations. */\n\tcPrefab(const cBlockArea & a_Image, int a_AllowedRotations);\n\n\t/** Creates a prefab based on the given BlockArea. Allowed rotations can be added later on using SetAllowedRotations(). */\n\tcPrefab(const cBlockArea & a_Image);\n\n\t/** Creates a prefab based on the specified block data, using the char-to-block map in a_BlockDefinitions.\n\tAllowed rotations can be added later on using SetAllowedRotations(). */\n\tcPrefab(const AString & a_BlockDefinitions, const AString & a_BlockData, int a_SizeX, int a_SizeY, int a_SizeZ);\n\n\t/** Draws the prefab into the specified chunk, according to the placement stored in the PlacedPiece. */\n\tvoid Draw(cChunkDesc & a_Dest, const cPlacedPiece * a_Placement) const;\n\n\t/** Draws the prefab into the specified chunks, according to the specified placement and rotations. */\n\tvoid Draw(cChunkDesc & a_Dest, const Vector3i & a_Placement, int a_NumRotations) const;\n\n\t/** Returns true if the prefab has any connector of the specified type. */\n\tbool HasConnectorType(int a_ConnectorType) const;\n\n\t/** Returns the weight (chance) of this prefab generating as the next piece after the specified placed piece.\n\tPiecePool implementations can use this for their GetPieceWeight() implementations. */\n\tint GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector) const;\n\n\t/** Sets the (unmodified) DefaultWeight property for this piece. */\n\tvoid SetDefaultWeight(int a_DefaultWeight);\n\n\t/** Returns the unmodified DefaultWeight property for the piece. */\n\tint GetDefaultWeight(void) const { return m_DefaultWeight; }\n\n\t/** Sets the AddWeightIfSame member, that is used to modify the weight when the previous piece is the same prefab */\n\tvoid SetAddWeightIfSame(int a_AddWeightIfSame) { m_AddWeightIfSame = a_AddWeightIfSame; }\n\n\t/** Adds the specified connector to the list of connectors this piece supports. */\n\tvoid AddConnector(int a_RelX, int a_RelY, int a_RelZ, cPiece::cConnector::eDirection a_Direction, int a_Type);\n\n\t/** Returns whether the prefab should be moved Y-wise to ground before drawing, rather than staying\n\tat the coords governed by the connectors. */\n\tbool ShouldMoveToGround(void) const { return m_MoveToGround; }\n\n\t/** Sets the m_AllowedRotations bitmask and fills the m_BlockArea[] with rotated versions of m_BlockArea[0]. */\n\tvoid SetAllowedRotations(int a_AllowedRotations);\n\n\t/** Parses the per-depth weight into m_DepthWeight member. */\n\tvoid ParseDepthWeight(const char * a_DepthWeightDef);\n\n\t/** Sets the merge strategy to be used when drawing the piece. */\n\tvoid SetMergeStrategy(cBlockArea::eMergeStrategy a_MergeStrategy) { m_MergeStrategy = a_MergeStrategy; }\n\n\t/** Sets the flag whether the prefab should be moved to ground level before being drawn. */\n\tvoid SetMoveToGround(bool a_MoveToGround) { m_MoveToGround = a_MoveToGround; }\n\n\t/** Sets the strategy to use between the bottom of the prefab and the terrain top. */\n\tvoid SetExtendFloorStrategy(eExtendFloorStrategy a_Strategy) { m_ExtendFloorStrategy = a_Strategy; }\n\n\t/** Sets the internal hitbox to the specified value. */\n\tvoid SetHitBox(const cCuboid & a_HitBox) { m_HitBox = a_HitBox; }\n\nprotected:\n\t/** Packs complete definition of a single block, for per-letter assignment. */\n\tstruct sBlockTypeDef\n\t{\n\t\tBLOCKTYPE  m_BlockType;\n\t\tNIBBLETYPE m_BlockMeta;\n\t};\n\n\t/** Maps letters in the sDef::m_Image onto a sBlockTypeDef block type definition. */\n\ttypedef sBlockTypeDef CharMap[256];\n\n\t/** Maps generator tree depth to weight. */\n\ttypedef std::map<int, int> cDepthWeight;\n\n\n\t/** The cBlockArea that contains the block definitions for the prefab.\n\tThe index identifies the number of CCW rotations applied (0 = no rotation, 1 = 1 CCW rotation, ...). */\n\tcBlockArea m_BlockArea[4];\n\n\t/** The size of the prefab */\n\tVector3i m_Size;\n\n\t/** The hitbox used for collision-checking between prefabs. */\n\tcCuboid m_HitBox;\n\n\t/** The connectors through which the piece connects to other pieces */\n\tcConnectors m_Connectors;\n\n\t/** Bitmask, bit N set -> N rotations CCW supported */\n\tint m_AllowedRotations;\n\n\t/** The merge strategy to use when drawing the prefab into a block area */\n\tcBlockArea::eMergeStrategy m_MergeStrategy;\n\n\t/** How the prefab should handle not being on top of the ground.\n\tThis is used for houses to be \"on the ground\", as well as nether fortresses not to float. */\n\teExtendFloorStrategy m_ExtendFloorStrategy;\n\n\t/** Chance of this piece being used, if no other modifier is active. */\n\tint m_DefaultWeight;\n\n\t/** Chances of this piece being used, per depth of the generated piece tree.\n\tThe starting piece has a depth of 0, the pieces connected to it are depth 1, etc.\n\tThe specified depth stands for the depth of the new piece (not the existing already-placed piece),\n\tso valid depths start at 1.\n\tDepths that are not specified will use the m_DefaultWeight value. */\n\tcDepthWeight m_DepthWeight;\n\n\t/** The weight to add to this piece's base per-depth chance if the previous piece is the same.\n\tCan be positive or negative.\n\tThis is used e. g. to make nether bridges prefer spanning multiple segments or to penalize turrets next to each other. */\n\tint m_AddWeightIfSame;\n\n\t/** If true, the piece will be moved Y-wise so that its first connector is sitting on the terrain.\n\tThis is used e. g. for village houses. */\n\tbool m_MoveToGround;\n\n\n\t// cPiece overrides:\n\tvirtual cConnectors GetConnectors(void) const override;\n\tvirtual Vector3i GetSize(void) const override;\n\tvirtual cCuboid GetHitBox(void) const override;\n\tvirtual bool CanRotateCCW(int a_NumRotations) const override;\n\n\t/** Based on the m_AllowedRotations, adds rotated cBlockAreas to the m_BlockArea array.\n\tTo be called only from this class's constructor! */\n\tvoid AddRotatedBlockAreas(void);\n\n\t/** Parses the CharMap in the definition into a CharMap binary data used for translating the definition into BlockArea. */\n\tvoid ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef);\n\n\t/** Parses the Image in the definition into m_BlockArea[0]'s block types and metas, using the specified CharMap. */\n\tvoid ParseBlockImage(const CharMap & a_CharMap, const char * a_BlockImage);\n\n\t/** Parses the connectors definition text into m_Connectors member. */\n\tvoid ParseConnectors(const char * a_ConnectorsDef);\n};\n\n\n\n\n"
  },
  {
    "path": "src/Generating/PrefabPiecePool.cpp",
    "content": "\n// PrefabPiecePool.cpp\n\n// Implements the cPrefabPiecePool class that represents a cPiecePool descendant that uses cPrefab instances as the pieces\n\n#include \"Globals.h\"\n#include \"PrefabPiecePool.h\"\n#include \"VerticalStrategy.h\"\n#include \"../Bindings/LuaState.h\"\n#include \"../WorldStorage/SchematicFileSerializer.h\"\n#include \"../StringCompression.h\"\n\n\n/** Returns the map of string => eMergeStrategy used when translating cubeset file merge strategies. */\nstatic std::map<AString, cBlockArea::eMergeStrategy> & GetMergeStrategyMap(void)\n{\n\tstatic std::map<AString, cBlockArea::eMergeStrategy> msmap;\n\tif (msmap.empty())\n\t{\n\t\t// This is the first use, initialize the map:\n\t\tmsmap[\"msOverwrite\"]     = cBlockArea::msOverwrite;\n\t\tmsmap[\"msFillAir\"]       = cBlockArea::msFillAir;\n\t\tmsmap[\"msImprint\"]       = cBlockArea::msImprint;\n\t\tmsmap[\"msLake\"]          = cBlockArea::msLake;\n\t\tmsmap[\"msSpongePrint\"]   = cBlockArea::msSpongePrint;\n\t\tmsmap[\"msDifference\"]    = cBlockArea::msDifference;\n\t\tmsmap[\"msSimpleCompare\"] = cBlockArea::msSimpleCompare;\n\t\tmsmap[\"msMask\"]          = cBlockArea::msMask;\n\t}\n\treturn msmap;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPrefabPiecePool:\n\ncPrefabPiecePool::cPrefabPiecePool(void)\n{\n}\n\n\n\n\n\ncPrefabPiecePool::cPrefabPiecePool(\n\tconst cPrefab::sDef * a_PieceDefs,         size_t a_NumPieceDefs,\n\tconst cPrefab::sDef * a_StartingPieceDefs, size_t a_NumStartingPieceDefs,\n\tint a_DefaultStartingPieceHeight\n)\n{\n\tAddPieceDefs(a_PieceDefs, a_NumPieceDefs);\n\tif (a_StartingPieceDefs != nullptr)\n\t{\n\t\tAddStartingPieceDefs(a_StartingPieceDefs, a_NumStartingPieceDefs, a_DefaultStartingPieceHeight);\n\t}\n}\n\n\n\n\n\ncPrefabPiecePool::~cPrefabPiecePool()\n{\n\tClear();\n}\n\n\n\n\n\nvoid cPrefabPiecePool::Clear(void)\n{\n\tm_PiecesByConnector.clear();\n\tfor (cPieces::iterator itr = m_AllPieces.begin(), end = m_AllPieces.end(); itr != end; ++itr)\n\t{\n\t\tdelete *itr;\n\t}\n\tm_AllPieces.clear();\n\tfor (cPieces::iterator itr = m_StartingPieces.begin(), end = m_StartingPieces.end(); itr != end; ++itr)\n\t{\n\t\tdelete *itr;\n\t}\n\tm_StartingPieces.clear();\n}\n\n\n\n\n\nvoid cPrefabPiecePool::AddPieceDefs(const cPrefab::sDef * a_PieceDefs, size_t a_NumPieceDefs)\n{\n\tASSERT(a_PieceDefs != nullptr);\n\tfor (size_t i = 0; i < a_NumPieceDefs; i++)\n\t{\n\t\tcPrefab * Prefab = new cPrefab(a_PieceDefs[i]);\n\t\tm_AllPieces.push_back(Prefab);\n\t\tAddToPerConnectorMap(Prefab);\n\t}\n}\n\n\n\n\n\nvoid cPrefabPiecePool::AddStartingPieceDefs(\n\tconst cPrefab::sDef * a_StartingPieceDefs,\n\tsize_t a_NumStartingPieceDefs,\n\tint a_DefaultPieceHeight\n)\n{\n\tASSERT(a_StartingPieceDefs != nullptr);\n\tauto verticalStrategy = CreateVerticalStrategyFromString(fmt::format(FMT_STRING(\"Fixed|{}\"), a_DefaultPieceHeight), false);\n\tfor (size_t i = 0; i < a_NumStartingPieceDefs; i++)\n\t{\n\t\tcPrefab * Prefab = new cPrefab(a_StartingPieceDefs[i]);\n\t\tif (a_DefaultPieceHeight >= 0)\n\t\t{\n\t\t\tPrefab->SetVerticalStrategy(verticalStrategy);\n\t\t}\n\t\tm_StartingPieces.push_back(Prefab);\n\t}\n}\n\n\n\n\n\nbool cPrefabPiecePool::LoadFromFile(const AString & a_FileName, bool a_LogWarnings)\n{\n\t// Read the file into a string buffer, load from string:\n\tauto contents = cFile::ReadWholeFile(a_FileName);\n\tif (contents.empty())\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot read data from file %s\", a_FileName.c_str());\n\t\treturn false;\n\t}\n\treturn LoadFromString(contents, a_FileName, a_LogWarnings);\n}\n\n\n\n\n\nbool cPrefabPiecePool::LoadFromString(const AString & a_Contents, const AString & a_FileName, bool a_LogWarnings)\n{\n\t// If the contents start with GZip signature, ungzip and retry:\n\tif (a_Contents.substr(0, 3) == \"\\x1f\\x8b\\x08\")\n\t{\n\t\ttry\n\t\t{\n\t\t\tconst auto Extracted = Compression::Extractor().ExtractGZip(\n\t\t\t{\n\t\t\t\treinterpret_cast<const std::byte *>(a_Contents.data()), a_Contents.size()\n\t\t\t});\n\n\t\t\t// Here we do an extra std::string conversion, hardly efficient, but...\n\t\t\t// Better would be refactor into LoadFromByteView for the GZip decompression path, and getting cFile to support std::byte.\n\t\t\t// ...so it'll do for now.\n\n\t\t\treturn LoadFromString(std::string(Extracted.GetStringView()), a_FileName, a_LogWarnings);\n\t\t}\n\t\tcatch (const std::exception & Oops)\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Failed to decompress Gzip data in file %s. %s\", a_FileName.c_str(), Oops.what());\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Search the first 8 KiB of the file for the format auto-detection string:\n\tconst auto Header = a_Contents.substr(0, 8 KiB);\n\tif (Header.find(\"CubesetFormatVersion =\") != AString::npos)\n\t{\n\t\treturn LoadFromCubeset(a_Contents, a_FileName, a_LogWarnings);\n\t}\n\tCONDWARNING(a_LogWarnings, \"Cannot load prefabs from file %s, unknown file format\", a_FileName.c_str());\n\treturn false;\n}\n\n\n\n\n\nbool cPrefabPiecePool::LoadFromCubeset(const AString & a_Contents, const AString & a_FileName, bool a_LogWarnings)\n{\n\t// Load the file in the Lua interpreter:\n\tcLuaState Lua(fmt::format(FMT_STRING(\"LoadablePiecePool {}\"), a_FileName));\n\tLua.Create();\n\tcLuaState::cLock lock(Lua);\n\tif (!Lua.LoadString(a_Contents, a_FileName, a_LogWarnings))\n\t{\n\t\t// Reason for failure has already been logged in LoadFile()\n\t\treturn false;\n\t}\n\n\t// Check the version:\n\tint Version = 0;\n\tif (!Lua.GetNamedGlobal(\"Cubeset.Metadata.CubesetFormatVersion\", Version))\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot load cubeset %s, it doesn't contain version information.\", a_FileName);\n\t\treturn false;\n\t}\n\n\t// Load the data, using the correct version loader:\n\tif (Version == 1)\n\t{\n\t\treturn LoadFromCubesetVer1(a_FileName, Lua, a_LogWarnings);\n\t}\n\n\t// Unknown version:\n\tCONDWARNING(a_LogWarnings, \"Cannot load cubeset %s, version (%d) not supported.\", a_FileName, Version);\n\treturn false;\n}\n\n\n\n\n\nvoid cPrefabPiecePool::AddToPerConnectorMap(cPrefab * a_Prefab)\n{\n\tcPiece::cConnectors Connectors = (static_cast<const cPiece *>(a_Prefab))->GetConnectors();\n\tfor (cPiece::cConnectors::const_iterator itr = Connectors.begin(), end = Connectors.end(); itr != end; ++itr)\n\t{\n\t\tm_PiecesByConnector[itr->m_Type].push_back(a_Prefab);\n\t}\n}\n\n\n\n\n\nbool cPrefabPiecePool::LoadFromCubesetVer1(const AString & a_FileName, cLuaState & a_LuaState, bool a_LogWarnings)\n{\n\t// Load the metadata and apply the known ones:\n\tReadPoolMetadataCubesetVer1(a_FileName, a_LuaState, a_LogWarnings);\n\tApplyBaseMetadataCubesetVer1(a_FileName, a_LogWarnings);\n\n\t// Push the Cubeset.Pieces global value on the stack:\n\tauto pieces = a_LuaState.WalkToNamedGlobal(\"Cubeset.Pieces\");\n\tif (!pieces.IsValid() || !lua_istable(a_LuaState, -1))\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"The cubeset file %s doesn't contain any pieces\", a_FileName.c_str());\n\t\treturn false;\n\t}\n\n\t// Iterate over all items in the Cubeset.Pieces value:\n\tint idx = 1;\n\tbool res = true;\n\twhile (true)\n\t{\n\t\tlua_pushinteger(a_LuaState, idx);  // stk: [Pieces] [idx]\n\t\tlua_gettable(a_LuaState, -2);      // stk: [Pieces] [PieceItem]\n\t\tif (!lua_istable(a_LuaState, -1))\n\t\t{\n\t\t\t// The PieceItem is not present, we've iterated over all items\n\t\t\tlua_pop(a_LuaState, 1);  // stk: [Pieces]\n\t\t\tbreak;\n\t\t}\n\t\tif (!LoadCubesetPieceVer1(a_FileName, a_LuaState, idx, a_LogWarnings))\n\t\t{\n\t\t\tres = false;\n\t\t}\n\t\tlua_pop(a_LuaState, 1);  // stk: [Pieces]\n\t\tidx += 1;\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool cPrefabPiecePool::LoadCubesetPieceVer1(const AString & a_FileName, cLuaState & a_LuaState, int a_PieceIndex, bool a_LogWarnings)\n{\n\tASSERT(lua_istable(a_LuaState, -1));\n\n\t// The piece name is optional, but useful for debugging messages:\n\tAString PieceName;\n\tif (!a_LuaState.GetNamedValue(\"OriginData.ExportName\", PieceName))\n\t{\n\t\tPieceName = fmt::format(FMT_STRING(\"Piece #{}\"), a_PieceIndex);\n\t}\n\n\t// Read the hitbox dimensions:\n\tcCuboid Hitbox;\n\tif (\n\t\t!a_LuaState.GetNamedValue(\"Hitbox.MinX\", Hitbox.p1.x) ||\n\t\t!a_LuaState.GetNamedValue(\"Hitbox.MinY\", Hitbox.p1.y) ||\n\t\t!a_LuaState.GetNamedValue(\"Hitbox.MinZ\", Hitbox.p1.z) ||\n\t\t!a_LuaState.GetNamedValue(\"Hitbox.MaxX\", Hitbox.p2.x) ||\n\t\t!a_LuaState.GetNamedValue(\"Hitbox.MaxY\", Hitbox.p2.y) ||\n\t\t!a_LuaState.GetNamedValue(\"Hitbox.MaxZ\", Hitbox.p2.z)\n\t)\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot load piece %s from file %s, it's missing hitbox information\", PieceName, a_FileName);\n\t\treturn false;\n\t}\n\n\t// Load the prefab data:\n\tauto prefab = LoadPrefabFromCubesetVer1(a_FileName, a_LuaState, PieceName, a_LogWarnings);\n\tif (prefab == nullptr)\n\t{\n\t\treturn false;\n\t}\n\tprefab->SetHitBox(Hitbox);\n\n\t// Read the connectors\n\tif (!ReadConnectorsCubesetVer1(a_FileName, a_LuaState, PieceName, prefab.get(), a_LogWarnings))\n\t{\n\t\treturn false;\n\t}\n\n\t// Read the allowed rotations. It is an optional metadata value, default to 0:\n\tint AllowedRotations = 0;\n\ta_LuaState.GetNamedValue(\"Metadata.AllowedRotations\", AllowedRotations);\n\tprefab->SetAllowedRotations(AllowedRotations);\n\n\t// Read the relevant metadata for the piece:\n\tif (!ReadPieceMetadataCubesetVer1(a_FileName, a_LuaState, PieceName, prefab.get(), a_LogWarnings))\n\t{\n\t\treturn false;\n\t}\n\n\t// If the piece is a starting piece, check that it has a vertical strategy:\n\tint IsStartingPiece = 0;\n\ta_LuaState.GetNamedValue(\"Metadata.IsStarting\", IsStartingPiece);\n\tif (IsStartingPiece != 0)\n\t{\n\t\tif (prefab->GetVerticalStrategy() == nullptr)\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Starting prefab %s in file %s doesn't have its VerticalStrategy set. Setting to Fixed|150.\",\n\t\t\t\tPieceName, a_FileName\n\t\t\t);\n\t\t\tVERIFY(prefab->SetVerticalStrategyFromString(\"Fixed|150\", false));\n\t\t}\n\t}\n\n\t// Add the prefab into the list of pieces:\n\tif (IsStartingPiece != 0)\n\t{\n\t\tm_StartingPieces.push_back(prefab.release());\n\t}\n\telse\n\t{\n\t\tauto p = prefab.release();\n\t\tm_AllPieces.push_back(p);\n\t\tAddToPerConnectorMap(p);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nstd::unique_ptr<cPrefab> cPrefabPiecePool::LoadPrefabFromCubesetVer1(\n\tconst AString & a_FileName,\n\tcLuaState & a_LuaState,\n\tconst AString & a_PieceName,\n\tbool a_LogWarnings\n)\n{\n\t// First try loading a referenced schematic file, if any:\n\tAString SchematicFileName;\n\tif (a_LuaState.GetNamedValue(\"SchematicFileName\", SchematicFileName))\n\t{\n\t\tauto PathEnd = a_FileName.find_last_of(\"/\\\\\");  // Find the last path separator\n\t\tif (PathEnd != AString::npos)\n\t\t{\n\t\t\tSchematicFileName = a_FileName.substr(0, PathEnd) + SchematicFileName;\n\t\t}\n\t\tcBlockArea area;\n\t\ttry\n\t\t{\n\t\t\tcSchematicFileSerializer::LoadFromSchematicFile(area, SchematicFileName);\n\t\t}\n\t\tcatch (const std::exception & Oops)\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot load schematic file \\\"%s\\\" for piece %s in cubeset %s. %s\",\n\t\t\t\tSchematicFileName.c_str(), a_PieceName.c_str(), a_FileName.c_str(), Oops.what()\n\t\t\t);\n\t\t\treturn nullptr;\n\t\t}\n\t\treturn std::make_unique<cPrefab>(area);\n\t}  // if (SchematicFileName)\n\n\t// There's no referenced schematic file, load from BlockDefinitions / BlockData.\n\t// Get references to the data and the table.concat function:\n\tcLuaState::cRef TableConcat, BlockDefinitions, BlockData;\n\tif (\n\t\t!a_LuaState.GetNamedGlobal(\"table.concat\", TableConcat) ||\n\t\t!a_LuaState.GetNamedValue(\"BlockDefinitions\", BlockDefinitions) ||\n\t\t!a_LuaState.GetNamedValue(\"BlockData\", BlockData)\n\t)\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot parse block data for piece %s in cubeset %s\", a_PieceName.c_str(), a_FileName.c_str());\n\t\treturn nullptr;\n\t}\n\n\t// Call table.concat() on the BlockDefinitions:\n\tAString BlockDefStr;\n\tif (!a_LuaState.Call(TableConcat, BlockDefinitions, \"\\n\", cLuaState::Return, BlockDefStr))\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot concat block definitions for piece %s in cubeset %s\", a_PieceName.c_str(), a_FileName.c_str());\n\t\treturn nullptr;\n\t}\n\n\t// Call table.concat() on the BlockData:\n\tAString BlockDataStr;\n\tif (!a_LuaState.Call(TableConcat, BlockData, \"\", cLuaState::Return, BlockDataStr))\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot concat block data for piece %s in cubeset %s\", a_PieceName.c_str(), a_FileName.c_str());\n\t\treturn nullptr;\n\t}\n\n\t// Read the size:\n\tint SizeX = 0, SizeY = 0, SizeZ = 0;\n\tif (\n\t\t!a_LuaState.GetNamedValue(\"Size.x\", SizeX) ||\n\t\t!a_LuaState.GetNamedValue(\"Size.y\", SizeY) ||\n\t\t!a_LuaState.GetNamedValue(\"Size.z\", SizeZ)\n\t)\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot load piece %s from file %s, its size information is missing\", a_PieceName.c_str(), a_FileName.c_str());\n\t\treturn nullptr;\n\t}\n\n\t// Check that the size matches the data length:\n\tif (static_cast<size_t>(SizeX * SizeY * SizeZ) != BlockDataStr.size())\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot create piece %s from file %s, its size (%d) doesn't match the blockdata length (%u)\",\n\t\t\ta_PieceName.c_str(), a_FileName.c_str(),\n\t\t\tSizeX * SizeY * SizeZ, static_cast<unsigned>(BlockDataStr.size())\n\t\t);\n\t\treturn nullptr;\n\t}\n\n\treturn std::make_unique<cPrefab>(BlockDefStr, BlockDataStr, SizeX, SizeY, SizeZ);\n}\n\n\n\n\n\nbool cPrefabPiecePool::ReadConnectorsCubesetVer1(\n\tconst AString & a_FileName,\n\tcLuaState & a_LuaState,\n\tconst AString & a_PieceName,\n\tcPrefab * a_Prefab,\n\tbool a_LogWarnings\n)\n{\n\t// Get the Connectors subtable:\n\tauto conns = a_LuaState.WalkToValue(\"Connectors\");\n\tif (!conns.IsValid())\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Cannot load piece %s from file %s, it has no connectors definition.\", a_PieceName.c_str(), a_FileName.c_str());\n\t\treturn false;\n\t}\n\n\t// Iterate over all items in the Connectors table:\n\tint idx = 1;\n\tbool res = true;\n\twhile (true)\n\t{\n\t\tlua_pushinteger(a_LuaState, idx);  // stk: [Connectors] [idx]\n\t\tlua_gettable(a_LuaState, -2);      // stk: [Connectors] [conn]\n\t\tif (!lua_istable(a_LuaState, -1))\n\t\t{\n\t\t\t// The connector is not present, we've iterated over all items\n\t\t\tlua_pop(a_LuaState, 1);  // stk: [Connectors]\n\t\t\tbreak;\n\t\t}\n\t\tint Type = 0, RelX = 0, RelY = 0, RelZ = 0;\n\t\tAString DirectionStr;\n\t\tcPiece::cConnector::eDirection Direction = cPiece::cConnector::dirYM;\n\t\tif (\n\t\t\t!a_LuaState.GetNamedValue(\"Type\",      Type) ||\n\t\t\t!a_LuaState.GetNamedValue(\"RelX\",      RelX) ||\n\t\t\t!a_LuaState.GetNamedValue(\"RelY\",      RelY) ||\n\t\t\t!a_LuaState.GetNamedValue(\"RelZ\",      RelZ) ||\n\t\t\t!a_LuaState.GetNamedValue(\"Direction\", DirectionStr) ||\n\t\t\t!cPiece::cConnector::StringToDirection(DirectionStr, Direction)\n\t\t)\n\t\t{\n\t\t\tif (a_LogWarnings)\n\t\t\t{\n\t\t\t\tFLOGWARNING(\"Piece {0} in file {1} has a malformed Connector at index {2} ({3}, type {4}, direction {5}). Skipping the connector.\",\n\t\t\t\t\ta_PieceName, a_FileName, idx, Vector3i{RelX, RelY, RelZ}, Type, DirectionStr\n\t\t\t\t);\n\t\t\t}\n\t\t\tres = false;\n\t\t\tlua_pop(a_LuaState, 1);  // stk: [Connectors]\n\t\t\tidx += 1;\n\t\t\tcontinue;\n\t\t}\n\t\ta_Prefab->AddConnector(RelX, RelY, RelZ, Direction, Type);\n\t\tlua_pop(a_LuaState, 1);  // stk: [Connectors]\n\t\tidx += 1;\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool cPrefabPiecePool::ReadPieceMetadataCubesetVer1(\n\tconst AString & a_FileName,\n\tcLuaState & a_LuaState,\n\tconst AString & a_PieceName,\n\tcPrefab * a_Prefab,\n\tbool a_LogWarnings\n)\n{\n\t// Push the Metadata table on top of the Lua stack:\n\tauto md = a_LuaState.WalkToValue(\"Metadata\");\n\tif (!md.IsValid())\n\t{\n\t\treturn false;\n\t}\n\n\t// Get the values:\n\tint AddWeightIfSame = 0, DefaultWeight = 100, MoveToGround = 0;\n\tAString DepthWeight, MergeStrategy, VerticalLimit, VerticalStrategy;\n\ta_LuaState.GetNamedValue(\"AddWeightIfSame\",  AddWeightIfSame);\n\ta_LuaState.GetNamedValue(\"DefaultWeight\",    DefaultWeight);\n\ta_LuaState.GetNamedValue(\"DepthWeight\",      DepthWeight);\n\ta_LuaState.GetNamedValue(\"MergeStrategy\",    MergeStrategy);\n\ta_LuaState.GetNamedValue(\"MoveToGround\",     MoveToGround);\n\ta_LuaState.GetNamedValue(\"VerticalLimit\",    VerticalLimit);\n\ta_LuaState.GetNamedValue(\"VerticalStrategy\", VerticalStrategy);\n\n\t// Apply the values:\n\ta_Prefab->SetAddWeightIfSame(AddWeightIfSame);\n\ta_Prefab->SetDefaultWeight(DefaultWeight);\n\ta_Prefab->ParseDepthWeight(DepthWeight.c_str());\n\tauto msmap = GetMergeStrategyMap();\n\tauto strategy = msmap.find(MergeStrategy);\n\tif (strategy == msmap.end())\n\t{\n\t\tCONDWARNING(a_LogWarnings, \"Unknown merge strategy (\\\"%s\\\") specified for piece %s in file %s. Using msSpongePrint instead.\",\n\t\t\tMergeStrategy.c_str(), a_PieceName.c_str(), a_FileName.c_str()\n\t\t);\n\t\ta_Prefab->SetMergeStrategy(cBlockArea::msSpongePrint);\n\t}\n\telse\n\t{\n\t\ta_Prefab->SetMergeStrategy(strategy->second);\n\t}\n\ta_Prefab->SetMoveToGround(MoveToGround != 0);\n\n\tAString ExpandFloorStrategyStr;\n\tif (!a_LuaState.GetNamedValue(\"ExpandFloorStrategy\", ExpandFloorStrategyStr))\n\t{\n\t\t// Check the older variant for ExpandFloorStrategy, ShouldExpandFloor:\n\t\tint ShouldExpandFloor;\n\t\tif (a_LuaState.GetNamedValue(\"ShouldExpandFloor\", ShouldExpandFloor))\n\t\t{\n\t\t\tLOG(\"Piece \\\"%s\\\" in file \\\"%s\\\" is using the old \\\"ShouldExpandFloor\\\" attribute. Use the new \\\"ExpandFloorStrategy\\\" attribute instead for more options.\",\n\t\t\t\ta_PieceName.c_str(), a_FileName.c_str()\n\t\t\t);\n\t\t\ta_Prefab->SetExtendFloorStrategy((ShouldExpandFloor != 0) ? cPrefab::efsRepeatBottomTillNonAir : cPrefab::efsNone);\n\t\t}\n\t}\n\telse\n\t{\n\t\tauto lcExpandFloorStrategyStr = StrToLower(ExpandFloorStrategyStr);\n\t\tif (lcExpandFloorStrategyStr == \"repeatbottomtillnonair\")\n\t\t{\n\t\t\ta_Prefab->SetExtendFloorStrategy(cPrefab::efsRepeatBottomTillNonAir);\n\t\t}\n\t\telse if (lcExpandFloorStrategyStr == \"repeatbottomtillsolid\")\n\t\t{\n\t\t\ta_Prefab->SetExtendFloorStrategy(cPrefab::efsRepeatBottomTillSolid);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (lcExpandFloorStrategyStr != \"none\")\n\t\t\t{\n\t\t\t\tLOGWARNING(\"Piece \\\"%s\\\" in file \\\"%s\\\" is using an unknown \\\"ExpandFloorStrategy\\\" attribute value: \\\"%s\\\"\",\n\t\t\t\t\ta_PieceName.c_str(), a_FileName.c_str(), ExpandFloorStrategyStr.c_str()\n\t\t\t\t);\n\t\t\t}\n\t\t\ta_Prefab->SetExtendFloorStrategy(cPrefab::efsNone);\n\t\t}\n\t}\n\tif (!VerticalLimit.empty())\n\t{\n\t\tif (!a_Prefab->SetVerticalLimitFromString(VerticalLimit, a_LogWarnings))\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Unknown VerticalLimit (\\\"%s\\\") specified for piece %s in file %s. Using no limit instead.\",\n\t\t\t\tVerticalLimit.c_str(), a_PieceName.c_str(), a_FileName.c_str()\n\t\t\t);\n\t\t}\n\t}\n\ta_Prefab->SetVerticalStrategyFromString(VerticalStrategy, a_LogWarnings);\n\n\tAString ModifiersStr;\n\tif (a_LuaState.GetNamedValue(\"Modifiers\", ModifiersStr))\n\t{\n\t\ta_Prefab->SetPieceModifiersFromString(ModifiersStr, a_LogWarnings);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cPrefabPiecePool::ApplyBaseMetadataCubesetVer1(\n\tconst AString & a_FileName,\n\tbool a_LogWarnings\n)\n{\n\t// Set the metadata values to defaults:\n\tm_MinDensity = 100;\n\tm_MaxDensity = 100;\n\tm_VillageRoadBlockType = E_BLOCK_GRAVEL;\n\tm_VillageRoadBlockMeta = 0;\n\tm_VillageWaterRoadBlockType = E_BLOCK_PLANKS;\n\tm_VillageWaterRoadBlockMeta = 0;\n\n\t// Read the metadata values:\n\tm_IntendedUse = GetMetadata(\"IntendedUse\");\n\tGetStringMapInteger(m_Metadata, \"MaxDensity\",                m_MaxDensity);\n\tGetStringMapInteger(m_Metadata, \"MinDensity\",                m_MinDensity);\n\tGetStringMapInteger(m_Metadata, \"VillageRoadBlockType\",      m_VillageRoadBlockType);\n\tGetStringMapInteger(m_Metadata, \"VillageRoadBlockMeta\",      m_VillageRoadBlockMeta);\n\tGetStringMapInteger(m_Metadata, \"VillageWaterRoadBlockType\", m_VillageWaterRoadBlockType);\n\tGetStringMapInteger(m_Metadata, \"VillageWaterRoadBlockMeta\", m_VillageWaterRoadBlockMeta);\n\n\t// Read the allowed biomes:\n\tAString allowedBiomes = GetMetadata(\"AllowedBiomes\");\n\tif (allowedBiomes.empty())\n\t{\n\t\t// All biomes are allowed:\n\t\tfor (int b = biFirstBiome; b <= biMaxBiome; b++)\n\t\t{\n\t\t\tm_AllowedBiomes.insert(static_cast<EMCSBiome>(b));\n\t\t}\n\t\tfor (int b = biFirstVariantBiome; b <= biMaxVariantBiome; b++)\n\t\t{\n\t\t\tm_AllowedBiomes.insert(static_cast<EMCSBiome>(b));\n\t\t}\n\t}\n\telse\n\t{\n\t\tauto biomes = StringSplitAndTrim(allowedBiomes, \",\");\n\t\tfor (const auto & biome: biomes)\n\t\t{\n\t\t\tEMCSBiome b = StringToBiome(biome);\n\t\t\tif (b == biInvalidBiome)\n\t\t\t{\n\t\t\t\tCONDWARNING(a_LogWarnings, \"Invalid biome (\\\"%s\\\") specified in AllowedBiomes in cubeset file %s. Skipping the biome.\",\n\t\t\t\t\tbiome.c_str(), a_FileName.c_str()\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tm_AllowedBiomes.insert(b);\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cPrefabPiecePool::ReadPoolMetadataCubesetVer1(\n\tconst AString & a_FileName,\n\tcLuaState & a_LuaState,\n\tbool a_LogWarnings\n)\n{\n\t// Push the Cubeset.Metadata table on top of the Lua stack:\n\tauto gp = a_LuaState.WalkToNamedGlobal(\"Cubeset.Metadata\");\n\tif (!gp.IsValid())\n\t{\n\t\treturn true;\n\t}\n\n\t// Iterate over elements in the table, put them into the m_GeneratorParams map:\n\tlua_pushnil(a_LuaState);  // Table is at index -2, starting key (nil) at index -1\n\twhile (lua_next(a_LuaState, -2) != 0)\n\t{\n\t\t// Table at index -3, key at index -2, value at index -1\n\t\tAString key, val;\n\t\ta_LuaState.GetStackValues(-2, key, val);\n\t\tm_Metadata[key] = val;\n\t\tlua_pop(a_LuaState, 1);  // Table at index -2, key at index -1\n\t}\n\treturn true;\n}\n\n\n\n\n\nAString cPrefabPiecePool::GetMetadata(const AString & a_ParamName) const\n{\n\tauto itr = m_Metadata.find(a_ParamName);\n\tif (itr == m_Metadata.end())\n\t{\n\t\treturn AString();\n\t}\n\treturn itr->second;\n}\n\n\n\n\n\nvoid cPrefabPiecePool::AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen, int a_SeaLevel)\n{\n\t// Assign the generator linkage to all starting pieces' VerticalStrategies:\n\tfor (auto & piece: m_StartingPieces)\n\t{\n\t\tauto verticalStrategy = piece->GetVerticalStrategy();\n\t\tif (verticalStrategy != nullptr)\n\t\t{\n\t\t\tverticalStrategy->AssignGens(a_Seed, a_BiomeGen, a_HeightGen, a_SeaLevel);\n\t\t}\n\t}  // for piece - m_StartingPieces[]\n\n\t// Assign the generator linkage to all pieces' VerticalLimits:\n\tfor (auto & piece: m_AllPieces)\n\t{\n\t\tauto verticalLimit = piece->GetVerticalLimit();\n\t\tif (verticalLimit != nullptr)\n\t\t{\n\t\t\tverticalLimit->AssignGens(a_Seed, a_BiomeGen, a_HeightGen, a_SeaLevel);\n\t\t}\n\t\tauto modifiers = piece->GetModifiers();\n\t\tif (modifiers.size() > 0)\n\t\t{\n\t\t\tfor (size_t i = 0; i < modifiers.size(); i++)\n\t\t\t{\n\t\t\t\tmodifiers[i]->AssignSeed(a_Seed);\n\t\t\t}\n\t\t}\n\t}  // for piece - m_AllPieces[]\n}\n\n\n\n\n\ncPieces cPrefabPiecePool::GetPiecesWithConnector(int a_ConnectorType)\n{\n\treturn m_PiecesByConnector[a_ConnectorType];\n}\n\n\n\n\n\ncPieces cPrefabPiecePool::GetStartingPieces(void)\n{\n\tif (m_StartingPieces.empty())\n\t{\n\t\treturn m_AllPieces;\n\t}\n\telse\n\t{\n\t\treturn m_StartingPieces;\n\t}\n}\n\n\n\n\n\nint cPrefabPiecePool::GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece)\n{\n\treturn (static_cast<const cPrefab &>(a_NewPiece)).GetPieceWeight(a_PlacedPiece, a_ExistingConnector);\n}\n\n\n\n\n\nint cPrefabPiecePool::GetStartingPieceWeight(const cPiece & a_NewPiece)\n{\n\treturn (static_cast<const cPrefab &>(a_NewPiece)).GetDefaultWeight();\n}\n\n\n\n\n\nvoid cPrefabPiecePool::PiecePlaced(const cPiece & a_Piece)\n{\n\t// Do nothing\n\tUNUSED(a_Piece);\n}\n\n\n\n\n\nvoid cPrefabPiecePool::Reset(void)\n{\n\t// Do nothing\n}\n"
  },
  {
    "path": "src/Generating/PrefabPiecePool.h",
    "content": "\n// PrefabPiecePool.h\n\n// Declares the cPrefabPiecePool class that represents a cPiecePool descendant that uses cPrefab instances as the pieces\n\n\n\n\n\n#pragma once\n\n#include \"PiecePool.h\"\n#include \"Prefab.h\"\n\n\n\n\n\n// fwd:\nclass cLuaState;\n\n\n\n\n\nclass cPrefabPiecePool :\n\tpublic cPiecePool\n{\npublic:\n\t/** Creates an empty instance. Prefabs can be added by calling AddPieceDefs() and AddStartingPieceDefs(). */\n\tcPrefabPiecePool(void);\n\n\t/** Creates a piece pool with prefabs from the specified definitions.\n\tIf both a_PieceDefs and a_StartingPieceDefs are given, only the a_StartingPieceDefs are used as starting\n\tpieces for the pool, and they do not participate in the generation any further.\n\tIf only a_PieceDefs is given, any such piece can be chosen as a starting piece, and all the pieces are used\n\tfor generating.\n\tMore pieces can be added to the instance afterwards by calling AddPieceDefs() and AddStartingPieceDefs().\n\tIf a_DefaultStartingPieceHeight is non-negative, it is applied to each starting piece as its fixed\n\theight (for the GetStartingPieceHeight() call). */\n\tcPrefabPiecePool(\n\t\tconst cPrefab::sDef * a_PieceDefs,         size_t a_NumPieceDefs,\n\t\tconst cPrefab::sDef * a_StartingPieceDefs, size_t a_NumStartingPieceDefs,\n\t\tint a_DefaultStartingPieceHeight = -1\n\t);\n\n\t/** Destroys the pool, freeing all pieces. */\n\tvirtual ~cPrefabPiecePool() override;\n\n\t/** Removes and frees all pieces from this pool. */\n\tvoid Clear(void);\n\n\t/** Adds pieces from the specified definitions into m_AllPieces. Also adds the pieces into\n\tthe m_PiecesByConnector map.\n\tMay be called multiple times with different PieceDefs, will add all such pieces. */\n\tvoid AddPieceDefs(const cPrefab::sDef * a_PieceDefs, size_t a_NumPieceDefs);\n\n\t/** Adds pieces from the specified definitions into m_StartingPieces. Doesn't add them to\n\tthe m_PiecesByConnector map.\n\tMay be called multiple times with different PieceDefs, will add all such pieces.\n\tIf a_DefaultPieceHeight is non-negative, it is applied to each piece as its fixed\n\theight (for the GetStartingPieceHeight() call). */\n\tvoid AddStartingPieceDefs(\n\t\tconst cPrefab::sDef * a_StartingPieceDefs,\n\t\tsize_t a_NumStartingPieceDefs,\n\t\tint a_DefaultPieceHeight = -1\n\t);\n\n\t/** Loads the pieces from the specified file. Returns true if successful, false on error.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tbool LoadFromFile(const AString & a_FileName, bool a_LogWarnings);\n\n\t/** Loads the pieces from the specified string.\n\tReturns true if successful, false on error.\n\ta_FileName is used only logging.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tbool LoadFromString(const AString & a_Contents, const AString & a_FileName, bool a_LogWarnings);\n\n\t/** Loads the pieces from the specified string containing Cubeset file data.\n\tReturns true if successful, false on error.\n\ta_FileName is used only logging.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tbool LoadFromCubeset(const AString & a_Contents, const AString & a_FileName, bool a_LogWarnings);\n\n\t/** Returns the number of regular (non-starting) pieces. */\n\tsize_t GetAllPiecesCount(void) const { return m_AllPieces.size(); }\n\n\t/** Returns the number of starting pieces. */\n\tsize_t GetStartingPiecesCount(void) const { return m_StartingPieces.size(); }\n\n\t// Metadata accessors:\n\tconst AString & GetIntendedUse(void) const { return m_IntendedUse; }\n\tint GetMinDensity(void) const { return m_MinDensity; }\n\tint GetMaxDensity(void) const { return m_MaxDensity; }\n\tBLOCKTYPE  GetVillageRoadBlockType     (void) const { return m_VillageRoadBlockType; }\n\tNIBBLETYPE GetVillageRoadBlockMeta     (void) const { return m_VillageRoadBlockMeta; }\n\tBLOCKTYPE  GetVillageWaterRoadBlockType(void) const { return m_VillageWaterRoadBlockType; }\n\tNIBBLETYPE GetVillageWaterRoadBlockMeta(void) const { return m_VillageWaterRoadBlockMeta; }\n\n\t/** Returns true if a_Biome is among the accepted biomes in the m_AcceptedBiomes metadata member. */\n\tbool IsBiomeAllowed(EMCSBiome a_Biome) const { return (m_AllowedBiomes.find(a_Biome) != m_AllowedBiomes.end()); }\n\n\t/** Returns the specified value from the metadata map.\n\tReturns an empty string if no such value had been read. */\n\tAString GetMetadata(const AString & a_ParamName) const;\n\n\tconst AStringMap & GetAllMetadata(void) const { return m_Metadata; }\n\n\t/** Called when the piece pool is assigned to a generator,\n\tso that the individual starting pieces' vertical strategies may bind to the underlying subgenerators. */\n\tvoid AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen, int a_SeaLevel);\n\n\t// cPiecePool overrides:\n\tvirtual cPieces GetPiecesWithConnector(int a_ConnectorType) override;\n\tvirtual cPieces GetStartingPieces(void) override;\n\tvirtual int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece) override;\n\tvirtual int GetStartingPieceWeight(const cPiece & a_NewPiece) override;\n\tvirtual void PiecePlaced(const cPiece & a_Piece) override;\n\tvirtual void Reset(void) override;\n\nprotected:\n\n\t/** The type used to map a connector type to the list of pieces with that connector */\n\ttypedef std::map<int, cPieces> cPiecesMap;\n\n\n\t/** All the pieces that are allowed for building.\n\tThis is the list that's used for memory allocation and deallocation for the pieces. */\n\tcPieces m_AllPieces;\n\n\t/** The pieces that are used as starting pieces.\n\tThis list is not shared and the pieces need deallocation. */\n\tcPieces m_StartingPieces;\n\n\t/** The map that has all pieces by their connector types\n\tThe pieces are copies out of m_AllPieces and shouldn't be ever delete-d. */\n\tcPiecesMap m_PiecesByConnector;\n\n\t/** The intended use of this piece pool, as specified by the pool's metadata. */\n\tAString m_IntendedUse;\n\n\t/** The minimum density, as read from the metadata. */\n\tint m_MinDensity;\n\n\t/** The maximum density, as read from the metadata. */\n\tint m_MaxDensity;\n\n\t/** The block type to use for the village roads. */\n\tBLOCKTYPE m_VillageRoadBlockType;\n\n\t/** The block meta to use for the village roads. */\n\tNIBBLETYPE m_VillageRoadBlockMeta;\n\n\t/** The block type used for the village roads if the road is on water. */\n\tBLOCKTYPE m_VillageWaterRoadBlockType;\n\n\t/** The block meta used for the village roads if the road is on water. */\n\tNIBBLETYPE m_VillageWaterRoadBlockMeta;\n\n\t/** A set of allowed  biomes for the pool. The pool will only be used within the specified biomes. */\n\tstd::unordered_set<EMCSBiome, BiomeHasher> m_AllowedBiomes;\n\n\t/** A dictionary of pool-wide metadata, as read from the cubeset file. */\n\tAStringMap m_Metadata;\n\n\n\t/** Adds the prefab to the m_PiecesByConnector map for all its connectors. */\n\tvoid AddToPerConnectorMap(cPrefab * a_Prefab);\n\n\t/** Loads the pieces from the cubeset file parsed into the specified Lua state.\n\tReturns true on success, false on error.\n\ta_FileName is used only logging.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tbool LoadFromCubesetVer1(const AString & a_FileName, cLuaState & a_LuaState, bool a_LogWarnings);\n\n\t/** Loads a single piece from the cubeset file parsed into the specified Lua state.\n\tThe piece's definition table is expected to be at the top of the Lua stack.\n\tReturns true on success, false on error.\n\ta_PieceIndex is the index of the piece, in the Pieces table. It is used for logging only.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tbool LoadCubesetPieceVer1(const AString & a_FileName, cLuaState & a_LuaState, int a_PieceIndex, bool a_LogWarnings);\n\n\t/** Loads a single piece's prefab from the cubeset file parsed into the specified Lua state.\n\tThe piece's definition table is expected to be at the top of the Lua stack.\n\tReturns the prefab on success, nullptr on failure.\n\ta_PieceName is the identification of the piece, used for logging only.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tstd::unique_ptr<cPrefab> LoadPrefabFromCubesetVer1(\n\t\tconst AString & a_FileName,\n\t\tcLuaState & a_LuaState,\n\t\tconst AString & a_PieceName,\n\t\tbool a_LogWarnings\n\t);\n\n\t/** Reads a single piece's connectors from the cubeset file parsed into the specified Lua state.\n\tThe piece's definition table is expected to be at the top of the Lua stack.\n\tReturns true on success, false on failure.\n\tThe connectors are added into the a_Prefab object.\n\tNo Connectors table is considered a failure, empty Connectors table is considered a success.\n\tIf any of the connectors are malformed, it is considered a failure, although the rest of the connectors will still load.\n\ta_PieceName is the identification of the piece, used for logging only.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tbool ReadConnectorsCubesetVer1(\n\t\tconst AString & a_FileName,\n\t\tcLuaState & a_LuaState,\n\t\tconst AString & a_PieceName,\n\t\tcPrefab * a_Prefab,\n\t\tbool a_LogWarnings\n\t);\n\n\t/** Reads a single piece's metadata from the cubeset file parsed into the specified Lua state.\n\tThe piece's definition table is expected to be at the top of the Lua stack.\n\tReturns true on success, false on failure.\n\tThe metadata is applied into the a_Prefab object.\n\ta_PieceName is the identification of the piece, used for logging only.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tbool ReadPieceMetadataCubesetVer1(\n\t\tconst AString & a_FileName,\n\t\tcLuaState & a_LuaState,\n\t\tconst AString & a_PieceName,\n\t\tcPrefab * a_Prefab,\n\t\tbool a_LogWarnings\n\t);\n\n\t/** Reads the metadata for the entire pool from the cubeset file, stores it in the m_Metadata map.\n\tReturns true on success, false on failure.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tbool ReadPoolMetadataCubesetVer1(\n\t\tconst AString & a_FileName,\n\t\tcLuaState & a_LuaState,\n\t\tbool a_LogWarnings\n\t);\n\n\t/** Applies the base known metadata from the m_Metadata map into this pool.\n\tIf a_LogWarnings is true, logs a warning to console when loading fails. */\n\tvoid ApplyBaseMetadataCubesetVer1(\n\t\tconst AString & a_FileName,\n\t\tbool a_LogWarnings\n\t);\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Generating/PrefabStructure.cpp",
    "content": "\n// PrefabStructure.cpp\n\n// Implements the cPrefabStructure class representing a cGridStructGen::cStructure descendant based on placed cPrefab instances\n\n#include \"Globals.h\"\n#include \"PrefabStructure.h\"\n#include \"Prefab.h\"\n\n\n\n\n\ncPrefabStructure::cPrefabStructure(\n\tint a_GridX, int a_GridZ,\n\tint a_OriginX, int a_OriginZ,\n\tcPlacedPieces && a_Pieces,\n\tcTerrainHeightGen & a_HeightGen\n):\n\tSuper(a_GridX, a_GridZ, a_OriginX, a_OriginZ),\n\tm_Pieces(std::move(a_Pieces)),\n\tm_HeightGen(a_HeightGen)\n{\n}\n\n\n\n\n\nvoid cPrefabStructure::DrawIntoChunk(cChunkDesc & a_Chunk)\n{\n\t// Iterate over all items\n\t// Each intersecting prefab is placed on ground, if requested, then drawn\n\tfor (cPlacedPieces::iterator itr = m_Pieces.begin(), end = m_Pieces.end(); itr != end; ++itr)\n\t{\n\t\tconst cPrefab & Prefab = static_cast<const cPrefab &>((*itr)->GetPiece());\n\t\tif (Prefab.ShouldMoveToGround() && !(*itr)->HasBeenMovedToGround())\n\t\t{\n\t\t\tPlacePieceOnGround(**itr);\n\t\t}\n\t\tPrefab.Draw(a_Chunk, itr->get());\n\t}  // for itr - m_PlacedPieces[]\n}\n\n\n\n\n\nvoid cPrefabStructure::PlacePieceOnGround(cPlacedPiece & a_Piece)\n{\n\tcPiece::cConnector FirstConnector = a_Piece.GetRotatedConnector(0);\n\tint ChunkX, ChunkZ;\n\tint BlockX = FirstConnector.m_Pos.x;\n\tint BlockZ = FirstConnector.m_Pos.z;\n\tint BlockY;\n\tcChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);\n\tcChunkDef::HeightMap HeightMap;\n\tm_HeightGen.GenHeightMap({ChunkX, ChunkZ}, HeightMap);\n\tint TerrainHeight = cChunkDef::GetHeight(HeightMap, BlockX, BlockZ);\n\ta_Piece.MoveToGroundBy(TerrainHeight - FirstConnector.m_Pos.y + 1);\n}\n"
  },
  {
    "path": "src/Generating/PrefabStructure.h",
    "content": "\n// PrefabStructure.h\n\n// Declares the cPrefabStructure class representing a cGridStructGen::cStructure descendant based on placed cPrefab instances\n\n\n\n\n\n#pragma once\n\n#include \"GridStructGen.h\"\n#include \"PiecePool.h\"\n\n\n\n\n\nclass cPrefabStructure:\n\tpublic cGridStructGen::cStructure\n{\n\tusing Super = cGridStructGen::cStructure;\n\npublic:\n\n\tcPrefabStructure(\n\t\tint a_GridX, int a_GridZ,\n\t\tint a_OriginX, int a_OriginZ,\n\t\tcPlacedPieces && a_Pieces,\n\t\tcTerrainHeightGen & a_HeightGen\n\t);\n\nprotected:\n\t/** The pieces placed by the generator. */\n\tcPlacedPieces m_Pieces;\n\n\t/** The height generator used when adjusting pieces onto the ground. */\n\tcTerrainHeightGen & m_HeightGen;\n\n\n\t// cGridStructGen::cStructure overrides:\n\tvirtual void DrawIntoChunk(cChunkDesc & a_Chunk) override;\n\n\t/**  Adjusts the Y coord of the given piece so that the piece is on the ground.\n\tGround level is assumed to be represented by the first connector in the piece. */\n\tvoid PlacePieceOnGround(cPlacedPiece & a_Piece);\n};\n"
  },
  {
    "path": "src/Generating/ProtIntGen.h",
    "content": "\n// ProtIntGen.h\n\n// Declares the prototyping integer generators - cProtIntGen class and its descendants\n\n/*\nThese classes generate 2D arrays of integers that have various interpretations. The main purpose of these\nclasses is to provide fast prototyping for cIntGen classes - unlike cIntGen classes, these are not\ntemplate-based and so they take care of the underlying sizes automatically. This makes them easier to chain\nand re-chain, since the size parameters don't need to be adjusted after each such case. Their performance is,\nhowever, slightly worse, which is why we use cIntGen classes in the final generator.\n\nBecause there is no SizeX / SizeZ template param, the generators would have to either alloc memory for each\nunderlying generator's values, or use a maximum-size buffer. We chose the latter, to avoid memory allocation\noverhead; this however means that there's (an arbitrary) limit to the size of the generated data.\n*/\n\n\n\n\n\n#pragma once\n\n// We need the biome group constants defined there:\n#include \"IntGen.h\"\n\n\n\n\n\n/** Maximum size of the generated area.\nThis value is used only if there isn't an override in place.\nTo adjust the actual buffer size, just do a \"#define PROT_INT_BUFFER_SIZE 9000\" before including this header.\nNote, however, that you should use a consistent value throughout a single project. */\n#ifndef PROT_INT_BUFFER_SIZE\n\t#define PROT_INT_BUFFER_SIZE 900\n#endif\n\n\n\n\n\n/** Interface that all the generator classes provide. */\nclass cProtIntGen\n{\nprotected:\n\t/** Maximum size of the generated area.\n\tAdjust the constant if you need larger areas, these are just so that we can use fixed-size buffers. */\n\tstatic const int m_BufferSize = PROT_INT_BUFFER_SIZE;\n\npublic:\n\n\t/** Type of the generic interface used for storing links to the underlying generators. */\n\tusing Underlying = std::shared_ptr<cProtIntGen>;\n\n\n\t/** Force a virtual destructor in all descendants.\n\tDescendants contain virtual functions and are referred to via pointer-to-base, so they need a virtual destructor. */\n\tvirtual ~cProtIntGen() {}\n\n\t/** Generates the array of specified size into a_Values, based on given min coords. */\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) = 0;\n};\n\n\n\n\n\n/** Provides additional cNoise member and its helper functions. */\nclass cProtIntGenWithNoise:\n\tpublic cProtIntGen\n{\n\tusing Super = cProtIntGen;\n\npublic:\n\n\tcProtIntGenWithNoise(int a_Seed):\n\t\tm_Noise(a_Seed)\n\t{\n\t}\n\nprotected:\n\tcNoise m_Noise;\n\n\t/** Chooses one of a_Val1 or a_Val2, based on m_Noise and the coordinates for querying the noise. */\n\tint chooseRandomOne(int a_RndX, int a_RndZ, int a_Val1, int a_Val2)\n\t{\n\t\tint rnd = m_Noise.IntNoise2DInt(a_RndX, a_RndZ) / 7;\n\t\treturn ((rnd & 1) == 0) ? a_Val1 : a_Val2;\n\t}\n\n\t/** Chooses one of a_ValN, based on m_Noise and the coordinates for querying the noise. */\n\tint chooseRandomOne(int a_RndX, int a_RndZ, int a_Val1, int a_Val2, int a_Val3, int a_Val4)\n\t{\n\t\tint rnd = m_Noise.IntNoise2DInt(a_RndX, a_RndZ) / 7;\n\t\tswitch (rnd % 4)\n\t\t{\n\t\t\tcase 0:  return a_Val1;\n\t\t\tcase 1:  return a_Val2;\n\t\t\tcase 2:  return a_Val3;\n\t\t\tdefault: return a_Val4;\n\t\t}\n\t}\n};\n\n\n\n\n\n/** Generates a 2D array of random integers in the specified range [0 .. Range). */\nclass cProtIntGenChoice:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenChoice(int a_Seed, int a_Range):\n\t\tSuper(a_Seed),\n\t\tm_Range(a_Range)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tint BaseZ = a_MinZ + static_cast<int>(z);\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\ta_Values[x + a_SizeX * z] = (Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), BaseZ) / 7) % m_Range;\n\t\t\t}\n\t\t}  // for z\n\t}\n\nprotected:\n\tint m_Range;\n};\n\n\n\n\n\n/** Decides between the ocean and landmass biomes.\nHas a threshold (in percent) of how much land, the larger the threshold, the more land.\nGenerates 0 for ocean, biome group ID for landmass. */\nclass cProtIntGenLandOcean:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenLandOcean(int a_Seed, int a_Threshold):\n\t\tSuper(a_Seed),\n\t\tm_Threshold(a_Threshold)\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tint BaseZ = a_MinZ + static_cast<int>(z);\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint rnd = (Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), BaseZ) / 7);\n\t\t\t\ta_Values[x + a_SizeX * z] = ((rnd % 100) < m_Threshold) ? ((rnd / 101) % bgLandOceanMax + 1) : 0;\n\t\t\t}\n\t\t}\n\n\t\t// If the centerpoint of the world is within the area, set it to bgTemperate, always:\n\t\tif ((a_MinX <= 0) && (a_MinZ <= 0) && (a_MinX + static_cast<int>(a_SizeX) > 0) && (a_MinZ + static_cast<int>(a_SizeZ) > 0))\n\t\t{\n\t\t\ta_Values[static_cast<size_t>(-a_MinX) - static_cast<size_t>(a_MinZ) * a_SizeX] = bgTemperate;\n\t\t}\n\t}\n\nprotected:\n\tint m_Threshold;\n};\n\n\n\n\n\n/** Zooms the underlying value array to twice the size. Uses random-neighbor for the pixels in-between.\nThis means that the zoome out image is randomly distorted. Applying zoom several times provides all\nthe distortion that the generators need. */\nclass cProtIntGenZoom:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenZoom(int a_Seed, Underlying a_UnderlyingGen):\n\t\tSuper(a_Seed),\n\t\tm_UnderlyingGen(std::move(a_UnderlyingGen))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Get the coords for the lower generator:\n\t\tint lowerMinX = a_MinX >> 1;\n\t\tint lowerMinZ = a_MinZ >> 1;\n\t\tsize_t lowerSizeX = a_SizeX / 2 + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ / 2 + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tASSERT(lowerSizeX > 0);\n\t\tASSERT(lowerSizeZ > 0);\n\n\t\t// Generate the underlying data with half the resolution:\n\t\tint lowerData[m_BufferSize];\n\t\tm_UnderlyingGen->GetInts(lowerMinX, lowerMinZ, lowerSizeX, lowerSizeZ, lowerData);\n\t\tconst size_t lowStepX = (lowerSizeX - 1) * 2;\n\t\tint cache[m_BufferSize];\n\n\t\t// Discreet-interpolate the values into twice the size:\n\t\tfor (size_t z = 0; z < lowerSizeZ - 1; ++z)\n\t\t{\n\t\t\tsize_t idx = (z * 2) * lowStepX;\n\t\t\tint PrevZ0 = lowerData[z * lowerSizeX];\n\t\t\tint PrevZ1 = lowerData[(z + 1) * lowerSizeX];\n\n\t\t\tfor (size_t x = 0; x < lowerSizeX - 1; ++x)\n\t\t\t{\n\t\t\t\tint ValX1Z0 = lowerData[x + 1 + z * lowerSizeX];\n\t\t\t\tint ValX1Z1 = lowerData[x + 1 + (z + 1) * lowerSizeX];\n\t\t\t\tint RndX = (static_cast<int>(x) + lowerMinX) * 2;\n\t\t\t\tint RndZ = (static_cast<int>(z) + lowerMinZ) * 2;\n\t\t\t\tcache[idx] = PrevZ0;\n\t\t\t\tcache[idx + lowStepX] = Super::chooseRandomOne(RndX, RndZ + 1, PrevZ0, PrevZ1);\n\t\t\t\tcache[idx + 1]        = Super::chooseRandomOne(RndX, RndZ - 1, PrevZ0, ValX1Z0);\n\t\t\t\tcache[idx + 1 + lowStepX] = Super::chooseRandomOne(RndX, RndZ, PrevZ0, ValX1Z0, PrevZ1, ValX1Z1);\n\t\t\t\tidx += 2;\n\t\t\t\tPrevZ0 = ValX1Z0;\n\t\t\t\tPrevZ1 = ValX1Z1;\n\t\t\t}\n\t\t}\n\n\t\t// Copy from Cache into a_Values; take into account the even / odd offsets in a_Min:\n\t\tfor (size_t z = 0; z < a_SizeZ; ++z)\n\t\t{\n\t\t\tmemcpy(a_Values + z * a_SizeX, cache + (z + (a_MinZ & 1)) * lowStepX + (a_MinX & 1), a_SizeX * sizeof(int));\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_UnderlyingGen;\n};\n\n\n\n\n\n/** Smoothes out some artifacts generated by the zooming - mostly single-pixel values.\nCompares each pixel to its neighbors and if the neighbors are equal, changes the pixel to their value. */\nclass cProtIntGenSmooth:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenSmooth(int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tsize_t lowerSizeX = a_SizeX + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerData[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerData);\n\n\t\t// Smooth - for each square check if the surroundings are the same, if so, expand them diagonally.\n\t\t// Also get rid of single-pixel irregularities (A-B-A):\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tint NoiseZ = a_MinZ + static_cast<int>(z);\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint val   = lowerData[x + 1 + (z + 1) * lowerSizeX];\n\t\t\t\tint above = lowerData[x + 1 +  z      * lowerSizeX];\n\t\t\t\tint below = lowerData[x + 1 + (z + 2) * lowerSizeX];\n\t\t\t\tint left  = lowerData[x     + (z + 1) * lowerSizeX];\n\t\t\t\tint right = lowerData[x + 2 + (z + 1) * lowerSizeX];\n\n\t\t\t\tif ((left == right) && (above == below))\n\t\t\t\t{\n\t\t\t\t\tif (((Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ) / 7) % 2) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = left;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tval = above;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (left == right)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = left;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (above == below)\n\t\t\t\t\t{\n\t\t\t\t\t\tval = above;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ta_Values[x + z * a_SizeX] = val;\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Averages the values of the underlying 2 * 2 neighbors. */\nclass cProtIntGenAvgValues:\n\tpublic cProtIntGen\n{\n\tusing Super = cProtIntGen;\n\npublic:\n\n\tcProtIntGenAvgValues(Underlying a_Underlying):\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tsize_t lowerSizeX = a_SizeX + 1;\n\t\tsize_t lowerSizeZ = a_SizeZ + 1;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerData[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, lowerSizeX, lowerSizeZ, lowerData);\n\n\t\t// Average - add all 4 \"neighbors\" and divide by 4:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tsize_t idxLower = x + lowerSizeX * z;\n\t\t\t\ta_Values[x + a_SizeX * z] = (\n\t\t\t\t\tlowerData[idxLower] + lowerData[idxLower + 1] +\n\t\t\t\t\tlowerData[idxLower + lowerSizeX] + lowerData[idxLower + lowerSizeX + 1]\n\t\t\t\t) / 4;\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Averages the values of the underlying 4 * 4 neighbors. */\nclass cProtIntGenAvg4Values:\n\tpublic cProtIntGen\n{\n\tusing Super = cProtIntGen;\n\npublic:\n\n\tcProtIntGenAvg4Values(Underlying a_Underlying):\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tsize_t lowerSizeX = a_SizeX + 4;\n\t\tsize_t lowerSizeZ = a_SizeZ + 4;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerData[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerData);\n\n\t\t// Calculate the weighted average of all 16 \"neighbors\":\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tsize_t idxLower1 = x + lowerSizeX * z;\n\t\t\t\tsize_t idxLower2 = idxLower1 + lowerSizeX;\n\t\t\t\tsize_t idxLower3 = idxLower1 + 2 * lowerSizeX;\n\t\t\t\tsize_t idxLower4 = idxLower1 + 3 * lowerSizeX;\n\t\t\t\ta_Values[x + a_SizeX * z] = (\n\t\t\t\t\t1 * lowerData[idxLower1] + 2 * lowerData[idxLower1 + 1] + 2 * lowerData[idxLower1 + 2] + 1 * lowerData[idxLower1 + 3] +\n\t\t\t\t\t2 * lowerData[idxLower2] + 32 * lowerData[idxLower2 + 1] + 32 * lowerData[idxLower2 + 2] + 2 * lowerData[idxLower2 + 3] +\n\t\t\t\t\t2 * lowerData[idxLower3] + 32 * lowerData[idxLower3 + 1] + 32 * lowerData[idxLower3 + 2] + 2 * lowerData[idxLower3 + 3] +\n\t\t\t\t\t1 * lowerData[idxLower4] + 2 * lowerData[idxLower4 + 1] + 2 * lowerData[idxLower4 + 2] + 1 * lowerData[idxLower4 + 3]\n\t\t\t\t) / 148;\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Averages the values of the underlying 3 * 3 neighbors with custom weight. */\ntemplate <int WeightCenter, int WeightCardinal, int WeightDiagonal>\nclass cProtIntGenWeightAvg:\n\tpublic cProtIntGen\n{\n\tusing Super = cProtIntGen;\n\npublic:\n\n\tcProtIntGenWeightAvg(Underlying a_Underlying):\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tsize_t lowerSizeX = a_SizeX + 3;\n\t\tsize_t lowerSizeZ = a_SizeZ + 3;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerData[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, lowerSizeX, lowerSizeZ, lowerData);\n\n\t\t// Calculate the weighted average the neighbors:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tsize_t idxLower1 = x + lowerSizeX * z;\n\t\t\t\tsize_t idxLower2 = idxLower1 + lowerSizeX;\n\t\t\t\tsize_t idxLower3 = idxLower1 + 2 * lowerSizeX;\n\t\t\t\ta_Values[x + a_SizeX * z] = (\n\t\t\t\t\tWeightDiagonal * lowerData[idxLower1] + WeightCardinal * lowerData[idxLower1 + 1] + WeightDiagonal * lowerData[idxLower1 + 2] +\n\t\t\t\t\tWeightCardinal * lowerData[idxLower2] + WeightCenter   * lowerData[idxLower2 + 1] + WeightCardinal * lowerData[idxLower2 + 2] +\n\t\t\t\t\tWeightDiagonal * lowerData[idxLower3] + WeightCardinal * lowerData[idxLower3 + 1] + WeightDiagonal * lowerData[idxLower3 + 2]\n\t\t\t\t) / (4 * WeightDiagonal + 4 * WeightCardinal + WeightCenter);\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Replaces random values of the underlying data with random integers in the specified range [Min .. Min + Range). */\nclass cProtIntGenRndChoice:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenRndChoice(int a_Seed, int a_ChancePct, int a_Min, int a_Range, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_ChancePct(a_ChancePct),\n\t\tm_Min(a_Min),\n\t\tm_Range(a_Range),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\n\t\t// Replace random values:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tint BaseZ = a_MinZ + static_cast<int>(z);\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tif (((Super::m_Noise.IntNoise2DInt(BaseZ, a_MinX + static_cast<int>(x)) / 13) % 101) < m_ChancePct)\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + a_SizeX * z] = m_Min + (Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), BaseZ) / 7) % m_Range;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\tint m_ChancePct;\n\tint m_Min;\n\tint m_Range;\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Adds a random value in range [-a_HalfRange, +a_HalfRange] to each of the underlying values. */\nclass cProtIntGenAddRnd:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenAddRnd(int a_Seed, int a_HalfRange, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Range(a_HalfRange * 2 + 1),\n\t\tm_HalfRange(a_HalfRange),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\n\t\t// Add the random values:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tint NoiseZ = a_MinZ + static_cast<int>(z);\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint noiseVal = ((Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ) / 7) % m_Range) - m_HalfRange;\n\t\t\t\ta_Values[x + z * a_SizeX] += noiseVal;\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tint m_Range;\n\tint m_HalfRange;\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Replaces random underlying values with the average of the neighbors. */\nclass cProtIntGenRndAvg:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenRndAvg(int a_Seed, int a_AvgChancePct, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_AvgChancePct(a_AvgChancePct),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tsize_t lowerSizeX = a_SizeX + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerData[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerData);\n\n\t\t// Average random values:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tint NoiseZ = a_MinZ + static_cast<int>(z);\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tsize_t idxLower = x + 1 + lowerSizeX * (z + 1);\n\t\t\t\tif (((Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ) / 7) % 100) > m_AvgChancePct)\n\t\t\t\t{\n\t\t\t\t\t// Average the 4 neighbors:\n\t\t\t\t\ta_Values[x + z * a_SizeX] = (\n\t\t\t\t\t\tlowerData[idxLower - 1] + lowerData[idxLower + 1] +\n\t\t\t\t\t\tlowerData[idxLower - lowerSizeX] + lowerData[idxLower + lowerSizeX]\n\t\t\t\t\t) / 4;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Keep the underlying value:\n\t\t\t\t\ta_Values[x + z * a_SizeX] = lowerData[idxLower];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tint m_AvgChancePct;\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Replaces random underlying values with a random value in between the max and min of the neighbors. */\nclass cProtIntGenRndBetween:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenRndBetween(int a_Seed, int a_AvgChancePct, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_AvgChancePct(a_AvgChancePct),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tsize_t lowerSizeX = a_SizeX + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerData[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerData);\n\n\t\t// Average random values:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tint NoiseZ = a_MinZ + static_cast<int>(z);\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tsize_t idxLower = x + 1 + lowerSizeX * (z + 1);\n\t\t\t\tif (((Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ) / 7) % 100) > m_AvgChancePct)\n\t\t\t\t{\n\t\t\t\t\t// Chose a value in between the min and max neighbor:\n\t\t\t\t\tint min = std::min(std::min(lowerData[idxLower - 1], lowerData[idxLower + 1]), std::min(lowerData[idxLower - lowerSizeX], lowerData[idxLower + lowerSizeX]));\n\t\t\t\t\tint max = std::max(std::max(lowerData[idxLower - 1], lowerData[idxLower + 1]), std::max(lowerData[idxLower - lowerSizeX], lowerData[idxLower + lowerSizeX]));\n\t\t\t\t\ta_Values[x + z * a_SizeX] = min + ((Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ + 10) / 7) % (max - min + 1));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Keep the underlying value:\n\t\t\t\t\ta_Values[x + z * a_SizeX] = lowerData[idxLower];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tint m_AvgChancePct;\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Converts land biomes at the edge of an ocean into the respective beach biome. */\nclass cProtIntGenBeaches:\n\tpublic cProtIntGen\n{\n\tusing Super = cProtIntGen;\n\npublic:\n\n\tcProtIntGenBeaches(Underlying a_Underlying):\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Map for biome -> its beach:\n\t\tstatic const int ToBeach[] =\n\t\t{\n\t\t\t/* biOcean            */ biOcean,\n\t\t\t/* biPlains           */ biBeach,\n\t\t\t/* biDesert           */ biBeach,\n\t\t\t/* biExtremeHills     */ biStoneBeach,\n\t\t\t/* biForest           */ biBeach,\n\t\t\t/* biTaiga            */ biColdBeach,\n\t\t\t/* biSwampland        */ biSwampland,\n\t\t\t/* biRiver            */ biRiver,\n\t\t\t/* biNether           */ biNether,\n\t\t\t/* biEnd              */ biEnd,\n\t\t\t/* biFrozenOcean      */ biColdBeach,\n\t\t\t/* biFrozenRiver      */ biColdBeach,\n\t\t\t/* biIcePlains        */ biColdBeach,\n\t\t\t/* biIceMountains     */ biColdBeach,\n\t\t\t/* biMushroomIsland   */ biMushroomShore,\n\t\t\t/* biMushroomShore    */ biMushroomShore,\n\t\t\t/* biBeach            */ biBeach,\n\t\t\t/* biDesertHills      */ biBeach,\n\t\t\t/* biForestHills      */ biBeach,\n\t\t\t/* biTaigaHills       */ biColdBeach,\n\t\t\t/* biExtremeHillsEdge */ biStoneBeach,\n\t\t\t/* biJungle           */ biBeach,\n\t\t\t/* biJungleHills      */ biBeach,\n\t\t\t/* biJungleEdge       */ biBeach,\n\t\t\t/* biDeepOcean        */ biOcean,\n\t\t\t/* biStoneBeach       */ biStoneBeach,\n\t\t\t/* biColdBeach        */ biColdBeach,\n\t\t\t/* biBirchForest      */ biBeach,\n\t\t\t/* biBirchForestHills */ biBeach,\n\t\t\t/* biRoofedForest     */ biBeach,\n\t\t\t/* biColdTaiga        */ biColdBeach,\n\t\t\t/* biColdTaigaHills   */ biColdBeach,\n\t\t\t/* biMegaTaiga        */ biStoneBeach,\n\t\t\t/* biMegaTaigaHills   */ biStoneBeach,\n\t\t\t/* biExtremeHillsPlus */ biStoneBeach,\n\t\t\t/* biSavanna          */ biBeach,\n\t\t\t/* biSavannaPlateau   */ biBeach,\n\t\t\t/* biMesa             */ biMesa,\n\t\t\t/* biMesaPlateauF     */ biMesa,\n\t\t\t/* biMesaPlateau      */ biMesa,\n\t\t};\n\n\t\t// Generate the underlying values:\n\t\tsize_t lowerSizeX = a_SizeX + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerValues[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerValues);\n\n\t\t// Add beaches between ocean and biomes:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint val   = lowerValues[x + 1 + (z + 1) * lowerSizeX];\n\t\t\t\tint above = lowerValues[x + 1 + z       * lowerSizeX];\n\t\t\t\tint below = lowerValues[x + 1 + (z + 2) * lowerSizeX];\n\t\t\t\tint left  = lowerValues[x     + (z + 1) * lowerSizeX];\n\t\t\t\tint right = lowerValues[x + 2 + (z + 1) * lowerSizeX];\n\t\t\t\tif (!IsBiomeOcean(val))\n\t\t\t\t{\n\t\t\t\t\tif (IsBiomeOcean(above) || IsBiomeOcean(below) || IsBiomeOcean(left) || IsBiomeOcean(right))\n\t\t\t\t\t{\n\t\t\t\t\t\t// First convert the value to a regular biome (drop the M flag), then modulo by our biome count:\n\t\t\t\t\t\tval = ToBeach[static_cast<size_t>(val % 128) % ARRAYCOUNT(ToBeach)];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ta_Values[x + z * a_SizeX] = val;\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Generates the underlying numbers and then randomly changes some ocean group pixels into random land\nbiome group pixels, based on the predefined chance. */\nclass cProtIntGenAddIslands:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cProtIntGen>;\n\n\n\tcProtIntGenAddIslands(int a_Seed, int a_Chance, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Chance(a_Chance),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tif (a_Values[x + z * a_SizeX] == bgOcean)\n\t\t\t\t{\n\t\t\t\t\tint rnd = Super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), a_MinZ + static_cast<int>(z)) / 7;\n\t\t\t\t\tif (rnd % 1000 < m_Chance)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Values[x + z * a_SizeX] = (rnd / 1003) % bgLandOceanMax;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\t/** Chance of each ocean pixel being converted, in permille. */\n\tint m_Chance;\n\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** A filter that adds an edge biome group between two biome groups that need an edge between them. */\nclass cProtIntGenBiomeGroupEdges:\n\tpublic cProtIntGen\n{\n\tusing Super = cProtIntGen;\n\npublic:\n\n\tcProtIntGenBiomeGroupEdges(Underlying a_Underlying):\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int * a_Values) override\n\t{\n\t\t// Generate the underlying biome groups:\n\t\tsize_t lowerSizeX = a_SizeX + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerValues[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, lowerSizeX, lowerSizeZ, lowerValues);\n\n\t\t// Change the biomes on incompatible edges into an edge biome:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint val   = lowerValues[x + 1 + (z + 1) * lowerSizeX];\n\t\t\t\tint Above = lowerValues[x + 1 + z       * lowerSizeX];\n\t\t\t\tint Below = lowerValues[x + 1 + (z + 2) * lowerSizeX];\n\t\t\t\tint Left  = lowerValues[x     + (z + 1) * lowerSizeX];\n\t\t\t\tint Right = lowerValues[x + 2 + (z + 1) * lowerSizeX];\n\t\t\t\tswitch (val)\n\t\t\t\t{\n\t\t\t\t\t// Desert should neighbor only oceans, desert and temperates; change to temperate when another:\n\t\t\t\t\tcase bgDesert:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isDesertCompatible(Above) ||\n\t\t\t\t\t\t\t!isDesertCompatible(Below) ||\n\t\t\t\t\t\t\t!isDesertCompatible(Left) ||\n\t\t\t\t\t\t\t!isDesertCompatible(Right)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = bgTemperate;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // case bgDesert\n\n\t\t\t\t\t// Ice should not neighbor deserts; change to temperate:\n\t\t\t\t\tcase bgIce:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(Above == bgDesert) ||\n\t\t\t\t\t\t\t(Below == bgDesert) ||\n\t\t\t\t\t\t\t(Left  == bgDesert) ||\n\t\t\t\t\t\t\t(Right == bgDesert)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = bgTemperate;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // case bgIce\n\t\t\t\t}\n\t\t\t\ta_Values[x + z * a_SizeX] = val;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n\n\n\tinline bool isDesertCompatible(int a_BiomeGroup)\n\t{\n\t\tswitch (a_BiomeGroup)\n\t\t{\n\t\t\tcase bgOcean:\n\t\t\tcase bgDesert:\n\t\t\tcase bgTemperate:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\n\n/** Turns biome group indices into real biomes.\nFor each pixel, takes its biome group and chooses a random biome from that group; replaces the value with\nthat biome. */\nclass cProtIntGenBiomes:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenBiomes(int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Define the per-biome-group biomes:\n\t\tstatic const int oceanBiomes[] =\n\t\t{\n\t\t\tbiOcean,  // biDeepOcean,\n\t\t};\n\n\t\t// Same as oceanBiomes, there are no rare oceanic biomes (mushroom islands are handled separately)\n\t\tstatic const int rareOceanBiomes[] =\n\t\t{\n\t\t\tbiOcean,\n\t\t};\n\n\t\tstatic const int desertBiomes[] =\n\t\t{\n\t\t\tbiDesert, biDesert, biDesert, biDesert, biDesert, biDesert, biSavanna, biSavanna, biPlains,\n\t\t};\n\n\t\tstatic const int rareDesertBiomes[] =\n\t\t{\n\t\t\tbiMesaPlateau, biMesaPlateauF,\n\t\t};\n\n\t\tstatic const int temperateBiomes[] =\n\t\t{\n\t\t\tbiForest, biForest, biRoofedForest, biExtremeHills, biPlains, biBirchForest, biSwampland,\n\t\t};\n\n\t\tstatic const int rareTemperateBiomes[] =\n\t\t{\n\t\t\tbiJungle,  // Jungle is not strictly temperate, but let's piggyback it here\n\t\t};\n\n\t\tstatic const int mountainBiomes[] =\n\t\t{\n\t\t\tbiExtremeHills, biForest, biTaiga, biPlains,\n\t\t};\n\n\t\tstatic const int rareMountainBiomes[] =\n\t\t{\n\t\t\tbiMegaTaiga,\n\t\t};\n\n\t\tstatic const int iceBiomes[] =\n\t\t{\n\t\t\tbiIcePlains, biIcePlains, biIcePlains, biIcePlains, biColdTaiga,\n\t\t};\n\n\t\t// Same as iceBiomes, there's no rare ice biome\n\t\tstatic const int rareIceBiomes[] =\n\t\t{\n\t\t\tbiIcePlains, biIcePlains, biIcePlains, biIcePlains, biColdTaiga,\n\t\t};\n\n\t\tstatic const cBiomesInGroups biomesInGroups[] =\n\t\t{\n\t\t\t/* bgOcean */     { static_cast<int>(ARRAYCOUNT(oceanBiomes)),     oceanBiomes},\n\t\t\t/* bgDesert */    { static_cast<int>(ARRAYCOUNT(desertBiomes)),    desertBiomes},\n\t\t\t/* bgTemperate */ { static_cast<int>(ARRAYCOUNT(temperateBiomes)), temperateBiomes},\n\t\t\t/* bgMountains */ { static_cast<int>(ARRAYCOUNT(mountainBiomes)),  mountainBiomes},\n\t\t\t/* bgIce */       { static_cast<int>(ARRAYCOUNT(iceBiomes)),       iceBiomes},\n\t\t};\n\n\t\tstatic const cBiomesInGroups rareBiomesInGroups[] =\n\t\t{\n\t\t\t/* bgOcean */     { static_cast<int>(ARRAYCOUNT(rareOceanBiomes)),     rareOceanBiomes},\n\t\t\t/* bgDesert */    { static_cast<int>(ARRAYCOUNT(rareDesertBiomes)),    rareDesertBiomes},\n\t\t\t/* bgTemperate */ { static_cast<int>(ARRAYCOUNT(rareTemperateBiomes)), rareTemperateBiomes},\n\t\t\t/* bgMountains */ { static_cast<int>(ARRAYCOUNT(rareMountainBiomes)),  rareMountainBiomes},\n\t\t\t/* bgIce */       { static_cast<int>(ARRAYCOUNT(rareIceBiomes)),       rareIceBiomes},\n\t\t};\n\n\t\t// Generate the underlying values, representing biome groups:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\n\t\t// Overwrite each biome group with a random biome from that group:\n\t\t// Take care of the bgfRare flag\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tsize_t IdxZ = z * a_SizeX;\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint val = a_Values[x + IdxZ];\n\t\t\t\tconst cBiomesInGroups & Biomes = (val > bgfRare) ?\n\t\t\t\t\trareBiomesInGroups[(val & (bgfRare - 1)) % ARRAYCOUNT(rareBiomesInGroups)] :\n\t\t\t\t\tbiomesInGroups[static_cast<size_t>(val) % ARRAYCOUNT(biomesInGroups)];\n\t\t\t\tint rnd = (Super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7);\n\t\t\t\ta_Values[x + IdxZ] = Biomes.Biomes[rnd % Biomes.Count];\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\n\tstruct cBiomesInGroups\n\t{\n\t\tconst int Count;\n\t\tconst int * Biomes;\n\t};\n\n\n\t/** The underlying int generator */\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Randomly replaces pixels of one value to another value, using the given chance. */\nclass cProtIntGenReplaceRandomly:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tusing Underlying = std::shared_ptr<cProtIntGen>;\n\n\n\tcProtIntGenReplaceRandomly(int a_Seed, int a_From, int a_To, int a_Chance, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_From(a_From),\n\t\tm_To(a_To),\n\t\tm_Chance(a_Chance),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying values:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\n\t\t// Replace some of the values:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tsize_t idxZ = z * a_SizeX;\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tsize_t idx = x + idxZ;\n\t\t\t\tif (a_Values[idx] == m_From)\n\t\t\t\t{\n\t\t\t\t\tint rnd = Super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7;\n\t\t\t\t\tif (rnd % 1000 < m_Chance)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Values[idx] = m_To;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for z\n\t}\n\n\nprotected:\n\t/** The original value to be replaced. */\n\tint m_From;\n\n\t/** The destination value to which to replace. */\n\tint m_To;\n\n\t/** Chance, in permille, of replacing the value. */\n\tint m_Chance;\n\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Mixer that joins together finalized biomes and rivers.\nIt first checks for oceans, if there is an ocean in the Biomes, it keeps the ocean.\nIf there's no ocean, it checks Rivers for a river, if there is a river, it uses the Biomes to select either\nregular river or frozen river, based on the biome. */\nclass cProtIntGenMixRivers:\n\tpublic cProtIntGen\n{\n\tusing Super = cProtIntGen;\n\npublic:\n\n\tcProtIntGenMixRivers(Underlying a_Biomes, Underlying a_Rivers):\n\t\tm_Biomes(std::move(a_Biomes)),\n\t\tm_Rivers(std::move(a_Rivers))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tASSERT(a_SizeX * a_SizeZ <= m_BufferSize);\n\t\tm_Biomes->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\t\tint riverData[m_BufferSize];\n\t\tm_Rivers->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, riverData);\n\n\t\t// Mix the values:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tsize_t idxZ = z * a_SizeX;\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tsize_t idx = x + idxZ;\n\t\t\t\tif (IsBiomeOcean(a_Values[idx]))\n\t\t\t\t{\n\t\t\t\t\t// Oceans are kept without any changes\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (riverData[idx] != biRiver)\n\t\t\t\t{\n\t\t\t\t\t// There's no river, keep the current value\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// There's a river, change the output to a river or a frozen river, based on the original biome:\n\t\t\t\tif (IsBiomeVeryCold(static_cast<EMCSBiome>(a_Values[idx])))\n\t\t\t\t{\n\t\t\t\t\ta_Values[idx] = biFrozenRiver;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta_Values[idx] = biRiver;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\tUnderlying m_Biomes;\n\tUnderlying m_Rivers;\n};\n\n\n\n\n\n/** Generates a river based on the underlying data.\nThis is basically an edge detector over the underlying data. The rivers are the edges where the underlying\ndata changes from one pixel to its neighbor. */\nclass cProtIntGenRiver:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenRiver(int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tsize_t lowerSizeX = a_SizeX + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerValues[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerValues);\n\n\t\t// Detect the edges:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint Above = lowerValues[x + 1 + z       * lowerSizeX];\n\t\t\t\tint Below = lowerValues[x + 1 + (z + 2) * lowerSizeX];\n\t\t\t\tint Left  = lowerValues[x +     (z + 1) * lowerSizeX];\n\t\t\t\tint Right = lowerValues[x + 2 + (z + 1) * lowerSizeX];\n\t\t\t\tint val   = lowerValues[x + 1 + (z + 1) * lowerSizeX];\n\n\t\t\t\tif ((val == Above) && (val == Below) && (val == Left) && (val == Right))\n\t\t\t\t{\n\t\t\t\t\tval = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tval = biRiver;\n\t\t\t\t}\n\t\t\t\ta_Values[x + z * a_SizeX] = val;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Turns some of the oceans into the specified biome. Used for mushroom and deep ocean.\nThe biome is only placed if at least 3 of its neighbors are ocean and only with the specified chance. */\nclass cProtIntGenAddToOcean:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenAddToOcean(int a_Seed, int a_Chance, int a_ToValue, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Chance(a_Chance),\n\t\tm_ToValue(a_ToValue),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tsize_t lowerSizeX = a_SizeX + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerValues[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerValues);\n\n\t\t// Add the mushroom islands:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint val = lowerValues[x + 1 + (z + 1) * lowerSizeX];\n\t\t\t\tif (!IsBiomeOcean(val))\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + z * a_SizeX] = val;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Count the ocean neighbors:\n\t\t\t\tint Above = lowerValues[x + 1 + z       * lowerSizeX];\n\t\t\t\tint Below = lowerValues[x + 1 + (z + 2) * lowerSizeX];\n\t\t\t\tint Left  = lowerValues[x +     (z + 1) * lowerSizeX];\n\t\t\t\tint Right = lowerValues[x + 2 + (z + 1) * lowerSizeX];\n\t\t\t\tint NumOceanNeighbors = 0;\n\t\t\t\tif (IsBiomeOcean(Above))\n\t\t\t\t{\n\t\t\t\t\tNumOceanNeighbors += 1;\n\t\t\t\t}\n\t\t\t\tif (IsBiomeOcean(Below))\n\t\t\t\t{\n\t\t\t\t\tNumOceanNeighbors += 1;\n\t\t\t\t}\n\t\t\t\tif (IsBiomeOcean(Left))\n\t\t\t\t{\n\t\t\t\t\tNumOceanNeighbors += 1;\n\t\t\t\t}\n\t\t\t\tif (IsBiomeOcean(Right))\n\t\t\t\t{\n\t\t\t\t\tNumOceanNeighbors += 1;\n\t\t\t\t}\n\n\t\t\t\t// If at least 3 ocean neighbors and the chance is right, change:\n\t\t\t\tif (\n\t\t\t\t\t(NumOceanNeighbors >= 3) &&\n\t\t\t\t\t((Super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7) % 1000 < m_Chance)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + z * a_SizeX] = m_ToValue;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + z * a_SizeX] = val;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\nprotected:\n\t/** Chance, in permille, of changing the biome. */\n\tint m_Chance;\n\n\t/** The value to change the ocean into. */\n\tint m_ToValue;\n\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Changes random pixels of the underlying data to the specified value. */\nclass cProtIntGenSetRandomly:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenSetRandomly(int a_Seed, int a_Chance, int a_ToValue, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Chance(a_Chance),\n\t\tm_ToValue(a_ToValue),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\n\t\t// Change random pixels to bgOcean:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint rnd = Super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7;\n\t\t\t\tif (rnd % 1000 < m_Chance)\n\t\t\t\t{\n\t\t\t\t\ta_Values[x + z * a_SizeX] = m_ToValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\t/** Chance, in permille, of changing each pixel. */\n\tint m_Chance;\n\n\t/** The value to which to set the pixel. */\n\tint m_ToValue;\n\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Adds a \"rare\" flag to random biome groups, based on the given chance. */\nclass cProtIntGenRareBiomeGroups:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenRareBiomeGroups(int a_Seed, int a_Chance, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Chance(a_Chance),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying data:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\n\t\t// Change some of the biome groups into rare biome groups:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint rnd = Super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7;\n\t\t\t\tif (rnd % 1000 < m_Chance)\n\t\t\t\t{\n\t\t\t\t\tsize_t idx = x + a_SizeX * z;\n\t\t\t\t\ta_Values[idx] = a_Values[idx] | bgfRare;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprotected:\n\t/** Chance, in permille, of changing each pixel into the rare biome group. */\n\tint m_Chance;\n\n\t/** The underlying generator. */\n\tUnderlying m_Underlying;\n};\n\n\n\n\n\n/** Changes biomes in the parent data into an alternate versions (usually \"hill\" variants), in such places\nthat have their alterations set. */\nclass cProtIntGenAlternateBiomes:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenAlternateBiomes(int a_Seed, Underlying a_Alterations, Underlying a_BaseBiomes):\n\t\tSuper(a_Seed),\n\t\tm_Alterations(std::move(a_Alterations)),\n\t\tm_BaseBiomes(std::move(a_BaseBiomes))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the base biomes and the alterations:\n\t\tm_BaseBiomes->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\t\tint alterations[m_BufferSize];\n\t\tm_Alterations->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, alterations);\n\n\t\t// Change the biomes into their alternate versions:\n\t\tsize_t len = a_SizeX * a_SizeZ;\n\t\tfor (size_t idx = 0; idx < len; ++idx)\n\t\t{\n\t\t\tif (alterations[idx] == 0)\n\t\t\t{\n\t\t\t\t// No change\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Change to alternate biomes:\n\t\t\tint val = a_Values[idx];\n\t\t\tswitch (val)\n\t\t\t{\n\t\t\t\tcase biBirchForest:   val = biBirchForestHills; break;\n\t\t\t\tcase biDesert:        val = biDesertHills;      break;\n\t\t\t\tcase biExtremeHills:  val = biExtremeHillsPlus; break;\n\t\t\t\tcase biForest:        val = biForestHills;      break;\n\t\t\t\tcase biIcePlains:     val = biIceMountains;     break;\n\t\t\t\tcase biJungle:        val = biJungleHills;      break;\n\t\t\t\tcase biMegaTaiga:     val = biMegaTaigaHills;   break;\n\t\t\t\tcase biMesaPlateau:   val = biMesa;             break;\n\t\t\t\tcase biMesaPlateauF:  val = biMesa;             break;\n\t\t\t\tcase biMesaPlateauM:  val = biMesa;             break;\n\t\t\t\tcase biMesaPlateauFM: val = biMesa;             break;\n\t\t\t\tcase biPlains:        val = biForest;           break;\n\t\t\t\tcase biRoofedForest:  val = biPlains;           break;\n\t\t\t\tcase biSavanna:       val = biSavannaPlateau;   break;\n\t\t\t\tcase biTaiga:         val = biTaigaHills;       break;\n\t\t\t}\n\t\t\ta_Values[idx] = val;\n\t\t}  // for idx - a_Values[]\n\t}\n\nprotected:\n\tUnderlying m_Alterations;\n\tUnderlying m_BaseBiomes;\n};\n\n\n\n\n\n/** Adds an edge between two specifically incompatible biomes, such as mesa and forest. */\nclass cProtIntGenBiomeEdges:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenBiomeEdges(int a_Seed, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(std::move(a_Underlying))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying biomes:\n\t\tsize_t lowerSizeX = a_SizeX + 2;\n\t\tsize_t lowerSizeZ = a_SizeZ + 2;\n\t\tASSERT(lowerSizeX * lowerSizeZ <= m_BufferSize);\n\t\tint lowerValues[m_BufferSize];\n\t\tm_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerValues);\n\n\t\t// Convert incompatible edges into neutral biomes:\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tint biome = lowerValues[x + 1 + (z + 1) * lowerSizeX];\n\t\t\t\tint above = lowerValues[x + 1 + z *       lowerSizeX];\n\t\t\t\tint below = lowerValues[x + 1 + (z + 2) * lowerSizeX];\n\t\t\t\tint left  = lowerValues[x +     (z + 1) * lowerSizeX];\n\t\t\t\tint right = lowerValues[x + 2 + (z + 1) * lowerSizeX];\n\n\t\t\t\tswitch (biome)\n\t\t\t\t{\n\t\t\t\t\tcase biDesert:\n\t\t\t\t\tcase biDesertM:\n\t\t\t\t\tcase biDesertHills:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tIsBiomeVeryCold(static_cast<EMCSBiome>(above)) ||\n\t\t\t\t\t\t\tIsBiomeVeryCold(static_cast<EMCSBiome>(below)) ||\n\t\t\t\t\t\t\tIsBiomeVeryCold(static_cast<EMCSBiome>(left))  ||\n\t\t\t\t\t\t\tIsBiomeVeryCold(static_cast<EMCSBiome>(right))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbiome = biPlains;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // case biDesert\n\n\t\t\t\t\tcase biMesaPlateau:\n\t\t\t\t\tcase biMesaPlateauF:\n\t\t\t\t\tcase biMesaPlateauFM:\n\t\t\t\t\tcase biMesaPlateauM:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isMesaCompatible(above) ||\n\t\t\t\t\t\t\t!isMesaCompatible(below) ||\n\t\t\t\t\t\t\t!isMesaCompatible(left)  ||\n\t\t\t\t\t\t\t!isMesaCompatible(right)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbiome = biDesert;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // Mesa biomes\n\n\t\t\t\t\tcase biJungle:\n\t\t\t\t\tcase biJungleM:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isJungleCompatible(above) ||\n\t\t\t\t\t\t\t!isJungleCompatible(below) ||\n\t\t\t\t\t\t\t!isJungleCompatible(left)  ||\n\t\t\t\t\t\t\t!isJungleCompatible(right)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbiome = (biome == biJungle) ? biJungleEdge : biJungleEdgeM;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // Jungle biomes\n\n\t\t\t\t\tcase biSwampland:\n\t\t\t\t\tcase biSwamplandM:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tIsBiomeNoDownfall(static_cast<EMCSBiome>(above)) ||\n\t\t\t\t\t\t\tIsBiomeNoDownfall(static_cast<EMCSBiome>(below)) ||\n\t\t\t\t\t\t\tIsBiomeNoDownfall(static_cast<EMCSBiome>(left))  ||\n\t\t\t\t\t\t\tIsBiomeNoDownfall(static_cast<EMCSBiome>(right))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbiome = biPlains;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}  // Swampland biomes\n\t\t\t\t}  // switch (biome)\n\n\t\t\t\ta_Values[x + z * a_SizeX] = biome;\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\n\nprotected:\n\tUnderlying m_Underlying;\n\n\n\tbool isMesaCompatible(int a_Biome)\n\t{\n\t\tswitch (a_Biome)\n\t\t{\n\t\t\tcase biDesert:\n\t\t\tcase biMesa:\n\t\t\tcase biMesaBryce:\n\t\t\tcase biMesaPlateau:\n\t\t\tcase biMesaPlateauF:\n\t\t\tcase biMesaPlateauFM:\n\t\t\tcase biMesaPlateauM:\n\t\t\tcase biOcean:\n\t\t\tcase biDeepOcean:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tbool isJungleCompatible(int a_Biome)\n\t{\n\t\tswitch (a_Biome)\n\t\t{\n\t\t\tcase biJungle:\n\t\t\tcase biJungleM:\n\t\t\tcase biJungleEdge:\n\t\t\tcase biJungleEdgeM:\n\t\t\tcase biJungleHills:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\n\n/** Changes biomes in the parent data into their alternate versions (\"M\" variants), in such places that\nhave their alterations set. */\nclass cProtIntGenMBiomes:\n\tpublic cProtIntGenWithNoise\n{\n\tusing Super = cProtIntGenWithNoise;\n\npublic:\n\n\tcProtIntGenMBiomes(int a_Seed, Underlying a_Alteration, Underlying a_Underlying):\n\t\tSuper(a_Seed),\n\t\tm_Underlying(std::move(a_Underlying)),\n\t\tm_Alteration(std::move(a_Alteration))\n\t{\n\t}\n\n\n\tvirtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override\n\t{\n\t\t// Generate the underlying biomes and the alterations:\n\t\tm_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);\n\t\tint alterations[m_BufferSize];\n\t\tm_Alteration->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, alterations);\n\n\t\t// Wherever alterations are nonzero, change into alternate biome, if available:\n\t\tsize_t len = a_SizeX * a_SizeZ;\n\t\tfor (size_t idx = 0; idx < len; ++idx)\n\t\t{\n\t\t\tif (alterations[idx] == 0)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Ice spikes biome was removed from here, because it was generated way too often\n\t\t\tswitch (a_Values[idx])\n\t\t\t{\n\t\t\t\tcase biPlains:               a_Values[idx] = biSunflowerPlains;      break;\n\t\t\t\tcase biDesert:               a_Values[idx] = biDesertM;              break;\n\t\t\t\tcase biExtremeHills:         a_Values[idx] = biExtremeHillsM;        break;\n\t\t\t\tcase biForest:               a_Values[idx] = biFlowerForest;         break;\n\t\t\t\tcase biTaiga:                a_Values[idx] = biTaigaM;               break;\n\t\t\t\tcase biSwampland:            a_Values[idx] = biSwamplandM;           break;\n\t\t\t\tcase biJungle:               a_Values[idx] = biJungleM;              break;\n\t\t\t\tcase biJungleEdge:           a_Values[idx] = biJungleEdgeM;          break;\n\t\t\t\tcase biBirchForest:          a_Values[idx] = biBirchForestM;         break;\n\t\t\t\tcase biBirchForestHills:     a_Values[idx] = biBirchForestHillsM;    break;\n\t\t\t\tcase biRoofedForest:         a_Values[idx] = biRoofedForestM;        break;\n\t\t\t\tcase biColdTaiga:            a_Values[idx] = biColdTaigaM;           break;\n\t\t\t\tcase biMegaSpruceTaiga:      a_Values[idx] = biMegaSpruceTaiga;      break;\n\t\t\t\tcase biMegaSpruceTaigaHills: a_Values[idx] = biMegaSpruceTaigaHills; break;\n\t\t\t\tcase biExtremeHillsPlus:     a_Values[idx] = biExtremeHillsPlusM;    break;\n\t\t\t\tcase biSavanna:              a_Values[idx] = biSavannaM;             break;\n\t\t\t\tcase biSavannaPlateau:       a_Values[idx] = biSavannaPlateauM;      break;\n\t\t\t\tcase biMesa:                 a_Values[idx] = biMesaBryce;            break;\n\t\t\t\tcase biMesaPlateauF:         a_Values[idx] = biMesaPlateauFM;        break;\n\t\t\t\tcase biMesaPlateau:          a_Values[idx] = biMesaBryce;            break;\n\t\t\t}\n\t\t}  // for idx - a_Values[] / alterations[]\n\t}\n\nprotected:\n\tUnderlying m_Underlying;\n\tUnderlying m_Alteration;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Generating/Ravines.cpp",
    "content": "\n// Ravines.cpp\n\n// Implements the cStructGenRavines class representing the ravine structure generator\n\n#include \"Globals.h\"\n#include \"Ravines.h\"\n\n\n\n\nstatic const int NUM_RAVINE_POINTS = 4;\n\n\n\n\n\nstruct cRavDefPoint\n{\n\tint m_BlockX;\n\tint m_BlockZ;\n\tint m_Radius;\n\tint m_Top;\n\tint m_Bottom;\n\n\tcRavDefPoint(int a_BlockX, int a_BlockZ, int a_Radius, int a_Top, int a_Bottom) :\n\t\tm_BlockX(a_BlockX),\n\t\tm_BlockZ(a_BlockZ),\n\t\tm_Radius(a_Radius),\n\t\tm_Top   (a_Top),\n\t\tm_Bottom(a_Bottom)\n\t{\n\t}\n} ;\n\nusing cRavDefPoints = std::vector<cRavDefPoint>;\n\n\n\n\n\nclass cStructGenRavines::cRavine:\n\tpublic cGridStructGen::cStructure\n{\n\tusing Super = cGridStructGen::cStructure;\n\n\tcRavDefPoints m_Points;\n\n\n\t/** Generates the shaping defpoints for the ravine, based on the ravine block coords and noise */\n\tvoid GenerateBaseDefPoints(int a_BlockX, int a_BlockZ, int a_Size, cNoise & a_Noise);\n\n\t/** Refines (adds and smooths) defpoints from a_Src into a_Dst */\n\tvoid RefineDefPoints(const cRavDefPoints & a_Src, cRavDefPoints & a_Dst);\n\n\t/** Does one round of smoothing, two passes of RefineDefPoints() */\n\tvoid Smooth(void);\n\n\t/** Linearly interpolates the points so that the maximum distance between two neighbors is max 1 block */\n\tvoid FinishLinear(void);\n\npublic:\n\n\tcRavine(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ, int a_Size, cNoise & a_Noise);\n\n\t#ifndef NDEBUG\n\t/** Exports itself as a SVG line definition */\n\tAString ExportAsSVG(int a_Color, int a_OffsetX = 0, int a_OffsetZ = 0) const;\n\t#endif  // !NDEBUG\n\nprotected:\n\t// cGridStructGen::cStructure overrides:\n\tvirtual void DrawIntoChunk(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenRavines:\n\ncStructGenRavines::cStructGenRavines(int a_Seed, int a_Size) :\n\tSuper(a_Seed, a_Size, a_Size, a_Size, a_Size, a_Size * 2, a_Size * 2, 100),\n\tm_Size(a_Size)\n{\n}\n\n\n\n\n\ncGridStructGen::cStructurePtr cStructGenRavines::CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ)\n{\n\treturn cStructurePtr(new cRavine(a_GridX, a_GridZ, a_OriginX, a_OriginZ, m_Size, m_Noise));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenRavines::cRavine\n\ncStructGenRavines::cRavine::cRavine(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ, int a_Size, cNoise & a_Noise) :\n\tSuper(a_GridX, a_GridZ, a_OriginX, a_OriginZ)\n{\n\t// Calculate the ravine shape-defining points:\n\tGenerateBaseDefPoints(a_OriginX, a_OriginZ, a_Size, a_Noise);\n\n\t// Smooth the ravine. Two passes are needed:\n\tSmooth();\n\tSmooth();\n\n\t// Linearly interpolate the neighbors so that they're close enough together:\n\tFinishLinear();\n}\n\n\n\n\n\nvoid cStructGenRavines::cRavine::GenerateBaseDefPoints(int a_BlockX, int a_BlockZ, int a_Size, cNoise & a_Noise)\n{\n\t// Modify the size slightly to have different-sized ravines (1 / 2 to 1 / 1 of a_Size):\n\ta_Size = (512 + ((a_Noise.IntNoise3DInt(19 * a_BlockX, 11 * a_BlockZ, a_BlockX + a_BlockZ) / 17) % 512)) * a_Size / 1024;\n\n\t// The complete offset of the ravine from its cellpoint, up to 2 * a_Size in each direction\n\tint OffsetX = (((a_Noise.IntNoise3DInt(50 * a_BlockX, 30 * a_BlockZ, 0)    / 9) % (2 * a_Size)) + ((a_Noise.IntNoise3DInt(30 * a_BlockX, 50 * a_BlockZ, 1000) / 7) % (2 * a_Size)) - 2 * a_Size) / 2;\n\tint OffsetZ = (((a_Noise.IntNoise3DInt(50 * a_BlockX, 30 * a_BlockZ, 2000) / 7) % (2 * a_Size)) + ((a_Noise.IntNoise3DInt(30 * a_BlockX, 50 * a_BlockZ, 3000) / 9) % (2 * a_Size)) - 2 * a_Size) / 2;\n\tint CenterX = a_BlockX + OffsetX;\n\tint CenterZ = a_BlockZ + OffsetZ;\n\n\t// Get the base angle in which the ravine \"axis\" goes:\n\tfloat Angle = static_cast<float>((static_cast<float>((a_Noise.IntNoise3DInt(20 * a_BlockX, 70 * a_BlockZ, 6000) / 9) % 16384)) / 16384.0 * M_PI);\n\tfloat xc = sinf(Angle);\n\tfloat zc = cosf(Angle);\n\n\t// Calculate the definition points and radii:\n\tint MaxRadius = static_cast<int>(sqrt(12.0 + ((a_Noise.IntNoise2DInt(61 * a_BlockX, 97 * a_BlockZ) / 13) % a_Size) / 16));\n\tint Top       = 32 + ((a_Noise.IntNoise2DInt(13 * a_BlockX, 17 * a_BlockZ) / 23) % 32);\n\tint Bottom    = 5 + ((a_Noise.IntNoise2DInt(17 * a_BlockX, 29 * a_BlockZ) / 13) % 32);\n\tint Mid = (Top + Bottom) / 2;\n\tint DefinitionPointX = CenterX - static_cast<int>(xc * a_Size / 2);\n\tint DefinitionPointZ = CenterZ - static_cast<int>(zc * a_Size / 2);\n\tm_Points.emplace_back(DefinitionPointX, DefinitionPointZ, 0, (Mid + Top) / 2, (Mid + Bottom) / 2);\n\tfor (int i = 1; i < NUM_RAVINE_POINTS - 1; i++)\n\t{\n\t\tint LineX = CenterX + static_cast<int>(xc * a_Size * (i - NUM_RAVINE_POINTS / 2) / NUM_RAVINE_POINTS);\n\t\tint LineZ = CenterZ + static_cast<int>(zc * a_Size * (i - NUM_RAVINE_POINTS / 2) / NUM_RAVINE_POINTS);\n\t\t// Amplitude is the amount of blocks that this point is away from the ravine \"axis\"\n\t\tint Amplitude = (a_Noise.IntNoise3DInt(70 * a_BlockX, 20 * a_BlockZ + 31 * i, 10000 * i) / 9) % a_Size;\n\t\tAmplitude = Amplitude / 4 - a_Size / 8;  // Amplitude is in interval [-a_Size / 4, a_Size / 4]\n\t\tint PointX = LineX + static_cast<int>(zc * Amplitude);\n\t\tint PointZ = LineZ - static_cast<int>(xc * Amplitude);\n\t\tint Radius = MaxRadius - abs(i - NUM_RAVINE_POINTS / 2);  // TODO: better radius function\n\t\tint ThisTop    = Top    + ((a_Noise.IntNoise3DInt(7 *  a_BlockX, 19 * a_BlockZ, i * 31) / 13) % 8) - 4;\n\t\tint ThisBottom = Bottom + ((a_Noise.IntNoise3DInt(19 * a_BlockX, 7 *  a_BlockZ, i * 31) / 13) % 8) - 4;\n\t\tm_Points.emplace_back(PointX, PointZ, Radius, ThisTop, ThisBottom);\n\t}  // for i - m_Points[]\n\tDefinitionPointX = CenterX + static_cast<int>(xc * a_Size / 2);\n\tDefinitionPointZ = CenterZ + static_cast<int>(zc * a_Size / 2);\n\tm_Points.emplace_back(DefinitionPointX, DefinitionPointZ, 0, Mid, Mid);\n}\n\n\n\n\n\nvoid cStructGenRavines::cRavine::RefineDefPoints(const cRavDefPoints & a_Src, cRavDefPoints & a_Dst)\n{\n\tif (a_Src.size() < 2)\n\t{\n\t\t// No midpoints, nothing to refine\n\t\treturn;\n\t}\n\n\t// Smoothing: for each line segment, add points on its 1 / 4 lengths\n\tsize_t Num = a_Src.size() - 2;  // this many intermediary points\n\ta_Dst.clear();\n\ta_Dst.reserve(Num * 2 + 2);\n\tcRavDefPoints::const_iterator itr = a_Src.begin() + 1;\n\tconst cRavDefPoint & Source = a_Src.front();\n\ta_Dst.push_back(Source);\n\tint PrevX = Source.m_BlockX;\n\tint PrevZ = Source.m_BlockZ;\n\tint PrevR = Source.m_Radius;\n\tint PrevT = Source.m_Top;\n\tint PrevB = Source.m_Bottom;\n\tfor (size_t i = 0; i <= Num; ++i, ++itr)\n\t{\n\t\tint dx = itr->m_BlockX - PrevX;\n\t\tint dz = itr->m_BlockZ - PrevZ;\n\t\tif (abs(dx) + abs(dz) < 4)\n\t\t{\n\t\t\t// Too short a segment to smooth-subdivide into quarters\n\t\t\tcontinue;\n\t\t}\n\t\tint dr = itr->m_Radius - PrevR;\n\t\tint dt = itr->m_Top    - PrevT;\n\t\tint db = itr->m_Bottom - PrevB;\n\t\tint Rad1 = std::max(PrevR + 1 * dr / 4, 1);\n\t\tint Rad2 = std::max(PrevR + 3 * dr / 4, 1);\n\t\ta_Dst.emplace_back(PrevX + 1 * dx / 4, PrevZ + 1 * dz / 4, Rad1, PrevT + 1 * dt / 4, PrevB + 1 * db / 4);\n\t\ta_Dst.emplace_back(PrevX + 3 * dx / 4, PrevZ + 3 * dz / 4, Rad2, PrevT + 3 * dt / 4, PrevB + 3 * db / 4);\n\t\tPrevX = itr->m_BlockX;\n\t\tPrevZ = itr->m_BlockZ;\n\t\tPrevR = itr->m_Radius;\n\t\tPrevT = itr->m_Top;\n\t\tPrevB = itr->m_Bottom;\n\t}\n\ta_Dst.push_back(a_Src.back());\n}\n\n\n\n\n\nvoid cStructGenRavines::cRavine::Smooth(void)\n{\n\tcRavDefPoints Pts;\n\tRefineDefPoints(m_Points, Pts);  // Refine m_Points -> Pts\n\tRefineDefPoints(Pts, m_Points);  // Refine Pts -> m_Points\n}\n\n\n\n\n\nvoid cStructGenRavines::cRavine::FinishLinear(void)\n{\n\t// For each segment, use Bresenham's line algorithm to draw a \"line\" of defpoints\n\t// _X 2012_07_20: I tried modifying this algorithm to produce \"thick\" lines (only one coord change per point)\n\t//   But the results were about the same as the original, so I disposed of it again - no need to use twice the count of points\n\n\tcRavDefPoints Pts;\n\tstd::swap(Pts, m_Points);\n\n\tm_Points.reserve(Pts.size() * 3);\n\tint PrevX = Pts.front().m_BlockX;\n\tint PrevZ = Pts.front().m_BlockZ;\n\tfor (cRavDefPoints::const_iterator itr = Pts.begin() + 1, end = Pts.end(); itr != end; ++itr)\n\t{\n\t\tint x1 = itr->m_BlockX;\n\t\tint z1 = itr->m_BlockZ;\n\t\tint dx = abs(x1 - PrevX);\n\t\tint dz = abs(z1 - PrevZ);\n\t\tint sx = (PrevX < x1) ? 1 : -1;\n\t\tint sz = (PrevZ < z1) ? 1 : -1;\n\t\tint err = dx - dz;\n\t\tint R = itr->m_Radius;\n\t\tint T = itr->m_Top;\n\t\tint B = itr->m_Bottom;\n\t\tfor (;;)\n\t\t{\n\t\t\tm_Points.emplace_back(PrevX, PrevZ, R, T, B);\n\t\t\tif ((PrevX == x1) && (PrevZ == z1))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tint e2 = 2 * err;\n\t\t\tif (e2 > -dz)\n\t\t\t{\n\t\t\t\terr -= dz;\n\t\t\t\tPrevX += sx;\n\t\t\t}\n\t\t\tif (e2 < dx)\n\t\t\t{\n\t\t\t\terr += dx;\n\t\t\t\tPrevZ += sz;\n\t\t\t}\n\t\t}  // while (true)\n\t}  // for itr\n}\n\n\n\n\n\n#ifndef NDEBUG\nAString cStructGenRavines::cRavine::ExportAsSVG(int a_Color, int a_OffsetX, int a_OffsetZ) const\n{\n\tauto SVG = fmt::format(FMT_STRING(\"<path style=\\\"fill:none;stroke:#{:06x};stroke-width:1px;\\\"\\nd=\\\"\"), a_Color);\n\tchar Prefix = 'M';  // The first point needs \"M\" prefix, all the others need \"L\"\n\tfor (cRavDefPoints::const_iterator itr = m_Points.begin(); itr != m_Points.end(); ++itr)\n\t{\n\t\tSVG.append(fmt::format(FMT_STRING(\"{} {}, {} \"), Prefix, a_OffsetX + itr->m_BlockX, a_OffsetZ + itr->m_BlockZ));\n\t\tPrefix = 'L';\n\t}\n\tSVG.append(\"\\\"/>\\n\");\n\n\t// Base point highlight:\n\tSVG.append(fmt::format(FMT_STRING(\"<path style=\\\"fill:none;stroke:#ff0000;stroke-width:1px;\\\"\\nd=\\\"M {}, {} L {}, {}\\\"/>\\n\"),\n\t\ta_OffsetX + m_OriginX - 5, a_OffsetZ + m_OriginZ, a_OffsetX + m_OriginX + 5, a_OffsetZ + m_OriginZ\n\t));\n\tSVG.append(fmt::format(FMT_STRING(\"<path style=\\\"fill:none;stroke:#ff0000;stroke-width:1px;\\\"\\nd=\\\"M {}, {} L {}, {}\\\"/>\\n\"),\n\t\ta_OffsetX + m_OriginX, a_OffsetZ + m_OriginZ - 5, a_OffsetX + m_OriginX, a_OffsetZ + m_OriginZ + 5\n\t));\n\n\t// A gray line from the base point to the first point of the ravine, for identification:\n\tSVG.append(fmt::format(FMT_STRING(\"<path style=\\\"fill:none;stroke:#cfcfcf;stroke-width:1px;\\\"\\nd=\\\"M {}, {} L {}, {}\\\"/>\\n\"),\n\t\ta_OffsetX + m_OriginX, a_OffsetZ + m_OriginZ, a_OffsetX + m_Points.front().m_BlockX, a_OffsetZ + m_Points.front().m_BlockZ\n\t));\n\n\t// Offset guides:\n\tif (a_OffsetX > 0)\n\t{\n\t\tSVG.append(fmt::format(FMT_STRING(\"<path style=\\\"fill:none;stroke:#0000ff;stroke-width:1px;\\\"\\nd=\\\"M {}, 0 L {}, 1024\\\"/>\\n\"),\n\t\t\ta_OffsetX, a_OffsetX\n\t\t));\n\t}\n\tif (a_OffsetZ > 0)\n\t{\n\t\tSVG.append(fmt::format(FMT_STRING(\"<path style=\\\"fill:none;stroke:#0000ff;stroke-width:1px;\\\"\\nd=\\\"M 0, {} L 1024, {}\\\"/>\\n\"),\n\t\t\ta_OffsetZ, a_OffsetZ\n\t\t));\n\t}\n\treturn SVG;\n}\n#endif  // !NDEBUG\n\n\n\n\n\nvoid cStructGenRavines::cRavine::DrawIntoChunk(cChunkDesc & a_ChunkDesc)\n{\n\tint BlockStartX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint BlockStartZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tint BlockEndX = BlockStartX + cChunkDef::Width;\n\tint BlockEndZ = BlockStartZ + cChunkDef::Width;\n\tfor (cRavDefPoints::const_iterator itr = m_Points.begin(), end = m_Points.end(); itr != end; ++itr)\n\t{\n\t\tif (\n\t\t\t(itr->m_BlockX + itr->m_Radius < BlockStartX) ||\n\t\t\t(itr->m_BlockX - itr->m_Radius > BlockEndX) ||\n\t\t\t(itr->m_BlockZ + itr->m_Radius < BlockStartZ) ||\n\t\t\t(itr->m_BlockZ - itr->m_Radius > BlockEndZ)\n\t\t)\n\t\t{\n\t\t\t// Cannot intersect, bail out early\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Carve out a cylinder around the xz point, m_Radius in diameter, from Bottom to Top:\n\t\tint RadiusSq = itr->m_Radius * itr->m_Radius;  // instead of doing sqrt for each distance, we do sqr of the radius\n\t\tint DifX = BlockStartX - itr->m_BlockX;  // substitution for faster calc\n\t\tint DifZ = BlockStartZ - itr->m_BlockZ;  // substitution for faster calc\n\t\tfor (int x = 0; x < cChunkDef::Width; x++) for (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\t#ifndef NDEBUG\n\t\t\t// DEBUG: Make the ravine shapepoints visible on a single layer (so that we can see with Minutor what's going on)\n\t\t\tif ((DifX + x == 0) && (DifZ + z == 0))\n\t\t\t{\n\t\t\t\ta_ChunkDesc.SetBlockType(x, 4, z, E_BLOCK_LAPIS_ORE);\n\t\t\t}\n\t\t\t#endif  // !NDEBUG\n\n\t\t\tint DistSq = (DifX + x) * (DifX + x) + (DifZ + z) * (DifZ + z);\n\t\t\tif (DistSq <= RadiusSq)\n\t\t\t{\n\t\t\t\tint Top = std::min(itr->m_Top, static_cast<int>(cChunkDef::Height));  // Stupid gcc needs int cast\n\t\t\t\tfor (int y = std::max(itr->m_Bottom, 1); y <= Top; y++)\n\t\t\t\t{\n\t\t\t\t\tswitch (a_ChunkDesc.GetBlockType(x, y, z))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Only carve out these specific block types\n\t\t\t\t\t\tcase E_BLOCK_DIRT:\n\t\t\t\t\t\tcase E_BLOCK_GRASS:\n\t\t\t\t\t\tcase E_BLOCK_STONE:\n\t\t\t\t\t\tcase E_BLOCK_COBBLESTONE:\n\t\t\t\t\t\tcase E_BLOCK_GRAVEL:\n\t\t\t\t\t\tcase E_BLOCK_SAND:\n\t\t\t\t\t\tcase E_BLOCK_SANDSTONE:\n\t\t\t\t\t\tcase E_BLOCK_NETHERRACK:\n\t\t\t\t\t\tcase E_BLOCK_COAL_ORE:\n\t\t\t\t\t\tcase E_BLOCK_IRON_ORE:\n\t\t\t\t\t\tcase E_BLOCK_GOLD_ORE:\n\t\t\t\t\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\t\t\t\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\t\t\t\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_AIR);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdefault: break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for x, z - a_BlockTypes\n\t}  // for itr - m_Points[]\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/Ravines.h",
    "content": "\n// Ravines.h\n\n// Interfaces to the cStructGenRavines class representing the ravine structure generator\n\n\n\n\n\n#pragma once\n\n#include \"GridStructGen.h\"\n\n\n\n\n\nclass cStructGenRavines:\n\tpublic cGridStructGen\n{\n\tusing Super = cGridStructGen;\n\npublic:\n\n\tcStructGenRavines(int a_Seed, int a_Size);\n\nprotected:\n\tclass cRavine;  // fwd: Ravines.cpp\n\n\tint m_Size;  // Max size, in blocks, of the ravines generated\n\n\n\t// cGridStructGen overrides:\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override;\n} ;\n\n\n\n"
  },
  {
    "path": "src/Generating/RoughRavines.cpp",
    "content": "\n// RoughRavines.cpp\n\n// Implements the cRoughRavines class representing the rough ravine generator\n\n#include \"Globals.h\"\n\n#include \"RoughRavines.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRoughRavine:\n\nclass cRoughRavine:\n\tpublic cGridStructGen::cStructure\n{\n\tusing Super = cGridStructGen::cStructure;\n\npublic:\n\n\tcRoughRavine(\n\t\tint a_Seed, size_t a_Size,\n\t\tfloat a_CenterWidth, float a_Roughness,\n\t\tfloat a_FloorHeightEdge1,   float a_FloorHeightEdge2,   float a_FloorHeightCenter,\n\t\tfloat a_CeilingHeightEdge1, float a_CeilingHeightEdge2, float a_CeilingHeightCenter,\n\t\tint a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ\n\t):\n\t\tSuper(a_GridX, a_GridZ, a_OriginX, a_OriginZ),\n\t\tm_Seed(a_Seed + 100),\n\t\tm_Noise(a_Seed + 100),\n\t\tm_Roughness(a_Roughness)\n\t{\n\t\t// Create the basic structure - 2 lines meeting at the centerpoint:\n\t\tsize_t Max = 2 * a_Size;\n\t\tsize_t Half = a_Size;  // m_DefPoints[Half] will be the centerpoint\n\t\tm_DefPoints.resize(Max + 1);\n\t\tint rnd = m_Noise.IntNoise2DInt(a_OriginX, a_OriginZ) / 7;\n\t\tfloat Len = static_cast<float>(a_Size);\n\t\tfloat Angle = static_cast<float>(rnd);  // Angle is in radians, will be wrapped in the \"sin\" and \"cos\" operations\n\t\tfloat OfsX = sinf(Angle) * Len;\n\t\tfloat OfsZ = cosf(Angle) * Len;\n\t\tm_DefPoints[0].Set   (a_OriginX - OfsX, a_OriginZ - OfsZ, 1,             a_CeilingHeightEdge1,  a_FloorHeightEdge1);\n\t\tm_DefPoints[Half].Set(static_cast<float>(a_OriginX), static_cast<float>(a_OriginZ), a_CenterWidth, a_CeilingHeightCenter, a_FloorHeightCenter);\n\t\tm_DefPoints[Max].Set (a_OriginX + OfsX, a_OriginZ + OfsZ, 1,             a_CeilingHeightEdge2,  a_FloorHeightEdge2);\n\n\t\t// Calculate the points in between, recursively:\n\t\tSubdivideLine(0, Half);\n\t\tSubdivideLine(Half, Max);\n\n\t\t// Initialize the per-height radius modifiers:\n\t\tInitPerHeightRadius(a_GridX, a_GridZ);\n\t}\n\nprotected:\n\tstruct sRavineDefPoint\n\t{\n\t\tfloat m_X;\n\t\tfloat m_Z;\n\t\tfloat m_Radius;\n\t\tfloat m_Top;\n\t\tfloat m_Bottom;\n\n\t\tvoid Set(float a_X, float a_Z, float a_Radius, float a_Top, float a_Bottom)\n\t\t{\n\t\t\tm_X = a_X;\n\t\t\tm_Z = a_Z;\n\t\t\tm_Radius = a_Radius;\n\t\t\tm_Top = a_Top;\n\t\t\tm_Bottom = a_Bottom;\n\t\t}\n\t};\n\tusing sRavineDefPoints = std::vector<sRavineDefPoint>;\n\n\tint m_Seed;\n\n\tcNoise m_Noise;\n\n\tint m_MaxSize;\n\n\tsRavineDefPoints m_DefPoints;\n\n\tfloat m_Roughness;\n\n\t/** Number to add to the radius based on the height. This creates the \"ledges\" in the ravine walls. */\n\tfloat m_PerHeightRadius[cChunkDef::Height];\n\n\n\t/** Recursively subdivides the line between the points of the specified index.\n\tSets the midpoint to the center of the line plus or minus a random offset, then calls itself for each half\n\tof the new line. */\n\tvoid SubdivideLine(size_t a_Idx1, size_t a_Idx2)\n\t{\n\t\t// Calculate the midpoint:\n\t\tconst sRavineDefPoint & p1 = m_DefPoints[a_Idx1];\n\t\tconst sRavineDefPoint & p2 = m_DefPoints[a_Idx2];\n\t\tfloat MidX = (p1.m_X + p2.m_X) / 2;\n\t\tfloat MidZ = (p1.m_Z + p2.m_Z) / 2;\n\t\tfloat MidR = (p1.m_Radius + p2.m_Radius) / 2 + 0.1f;\n\t\tfloat MidT = (p1.m_Top    + p2.m_Top)    / 2;\n\t\tfloat MidB = (p1.m_Bottom + p2.m_Bottom) / 2;\n\n\t\t// Adjust the midpoint by a small amount of perpendicular vector in a random one of its two directions:\n\t\tfloat dx = p2.m_X - p1.m_X;\n\t\tfloat dz = p2.m_Z - p1.m_Z;\n\t\tif ((m_Noise.IntNoise2DInt(static_cast<int>(MidX), static_cast<int>(MidZ)) / 11) % 2 == 0)\n\t\t{\n\t\t\tMidX += dz * m_Roughness;\n\t\t\tMidZ -= dx * m_Roughness;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMidX -= dz * m_Roughness;\n\t\t\tMidZ += dx * m_Roughness;\n\t\t}\n\t\tsize_t MidIdx = (a_Idx1 + a_Idx2) / 2;\n\t\tm_DefPoints[MidIdx].Set(MidX, MidZ, MidR, MidT, MidB);\n\n\t\t// Recurse the two halves, if they are worth recursing:\n\t\tif (MidIdx - a_Idx1 > 1)\n\t\t{\n\t\t\tSubdivideLine(a_Idx1, MidIdx);\n\t\t}\n\t\tif (a_Idx2 - MidIdx > 1)\n\t\t{\n\t\t\tSubdivideLine(MidIdx, a_Idx2);\n\t\t}\n\t}\n\n\n\tvoid InitPerHeightRadius(int a_GridX, int a_GridZ)\n\t{\n\t\tint h = 0;\n\t\twhile (h < cChunkDef::Height)\n\t\t{\n\t\t\tm_Noise.SetSeed(m_Seed + h);\n\t\t\tint rnd = m_Noise.IntNoise2DInt(a_GridX, a_GridZ) / 13;\n\t\t\tint NumBlocks = (rnd % 3) + 2;\n\t\t\trnd = rnd / 4;\n\t\t\tfloat Val = static_cast<float>(rnd % 256) / 128.0f - 1.0f;  // Random float in range [-1, +1]\n\t\t\tif (h + NumBlocks > cChunkDef::Height)\n\t\t\t{\n\t\t\t\tNumBlocks = cChunkDef::Height - h;\n\t\t\t}\n\t\t\tfor (int i = 0; i < NumBlocks; i++)\n\t\t\t{\n\t\t\t\tm_PerHeightRadius[h + i] = Val;\n\t\t\t}\n\t\t\th += NumBlocks;\n\t\t}\n\t}\n\n\n\tvirtual void DrawIntoChunk(cChunkDesc & a_ChunkDesc) override\n\t{\n\t\tint BlockStartX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\t\tint BlockStartZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\t\tint BlockEndX = BlockStartX + cChunkDef::Width;\n\t\tint BlockEndZ = BlockStartZ + cChunkDef::Width;\n\t\tfor (sRavineDefPoints::const_iterator itr = m_DefPoints.begin(), end = m_DefPoints.end(); itr != end; ++itr)\n\t\t{\n\t\t\tif (\n\t\t\t\t(ceilf (itr->m_X + itr->m_Radius + 2) < BlockStartX) ||\n\t\t\t\t(floorf(itr->m_X - itr->m_Radius - 2) > BlockEndX) ||\n\t\t\t\t(ceilf (itr->m_Z + itr->m_Radius + 2) < BlockStartZ) ||\n\t\t\t\t(floorf(itr->m_Z - itr->m_Radius - 2) > BlockEndZ)\n\t\t\t)\n\t\t\t{\n\t\t\t\t// Cannot intersect, bail out early\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Carve out a cylinder around the xz point, up to (m_Radius + 2) in diameter, from Bottom to Top:\n\t\t\t// On each height level, use m_PerHeightRadius[] to modify the actual radius used\n\t\t\t// EnlargedRadiusSq is the square of the radius enlarged by the maximum m_PerHeightRadius offset - anything outside it will never be touched.\n\t\t\tfloat RadiusSq = (itr->m_Radius + 2) * (itr->m_Radius + 2);\n\t\t\tfloat DifX = BlockStartX - itr->m_X;  // substitution for faster calc\n\t\t\tfloat DifZ = BlockStartZ - itr->m_Z;  // substitution for faster calc\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++) for (int z = 0; z < cChunkDef::Width; z++)\n\t\t\t{\n\t\t\t\t#ifndef NDEBUG\n\t\t\t\t// DEBUG: Make the roughravine shapepoints visible on a single layer (so that we can see with Minutor what's going on)\n\t\t\t\tif ((FloorC(DifX + x) == 0) && (FloorC(DifZ + z) == 0))\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(x, 4, z, E_BLOCK_LAPIS_ORE);\n\t\t\t\t}\n\t\t\t\t#endif  // !NDEBUG\n\n\t\t\t\t// If the column is outside the enlarged radius, bail out completely\n\t\t\t\tfloat DistSq = (DifX + x) * (DifX + x) + (DifZ + z) * (DifZ + z);\n\t\t\t\tif (DistSq > RadiusSq)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tint Top = std::min(CeilC(itr->m_Top), +cChunkDef::Height);\n\t\t\t\tfor (int y = std::max(FloorC(itr->m_Bottom), 1); y <= Top; y++)\n\t\t\t\t{\n\t\t\t\t\tif ((itr->m_Radius + m_PerHeightRadius[y]) * (itr->m_Radius + m_PerHeightRadius[y]) < DistSq)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (cBlockInfo::CanBeTerraformed(a_ChunkDesc.GetBlockType(x, y, z)))\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_AIR);\n\t\t\t\t\t}\n\t\t\t\t}  // for y\n\t\t\t}  // for x, z - a_BlockTypes\n\t\t}  // for itr - m_Points[]\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRoughRavines:\n\ncRoughRavines::cRoughRavines(\n\tint a_Seed,\n\tint a_MaxSize, int a_MinSize,\n\tfloat a_MaxCenterWidth, float a_MinCenterWidth,\n\tfloat a_MaxRoughness,   float a_MinRoughness,\n\tfloat a_MaxFloorHeightEdge,     float a_MinFloorHeightEdge,\n\tfloat a_MaxFloorHeightCenter,   float a_MinFloorHeightCenter,\n\tfloat a_MaxCeilingHeightEdge,   float a_MinCeilingHeightEdge,\n\tfloat a_MaxCeilingHeightCenter, float a_MinCeilingHeightCenter,\n\tint a_GridSize, int a_MaxOffset\n) :\n\tSuper(a_Seed, a_GridSize, a_GridSize, a_MaxOffset, a_MaxOffset, a_MaxSize, a_MaxSize, 64),\n\tm_MaxSize(a_MaxSize),\n\tm_MinSize(a_MinSize),\n\tm_MaxCenterWidth(a_MaxCenterWidth),\n\tm_MinCenterWidth(a_MinCenterWidth),\n\tm_MaxRoughness(a_MaxRoughness),\n\tm_MinRoughness(a_MinRoughness),\n\tm_MaxFloorHeightEdge(a_MaxFloorHeightEdge),\n\tm_MinFloorHeightEdge(a_MinFloorHeightEdge),\n\tm_MaxFloorHeightCenter(a_MaxFloorHeightCenter),\n\tm_MinFloorHeightCenter(a_MinFloorHeightCenter),\n\tm_MaxCeilingHeightEdge(a_MaxCeilingHeightEdge),\n\tm_MinCeilingHeightEdge(a_MinCeilingHeightEdge),\n\tm_MaxCeilingHeightCenter(a_MaxCeilingHeightCenter),\n\tm_MinCeilingHeightCenter(a_MinCeilingHeightCenter)\n{\n\tif (m_MinSize > m_MaxSize)\n\t{\n\t\tstd::swap(m_MinSize, m_MaxSize);\n\t\tstd::swap(a_MinSize, a_MaxSize);\n\t}\n\tif (m_MaxSize < 16)\n\t{\n\t\tm_MaxSize = 16;\n\t\tLOGWARNING(\"RoughRavines: MaxSize too small, adjusting request from %d to %d\", a_MaxSize, m_MaxSize);\n\t}\n\tif (m_MinSize < 16)\n\t{\n\t\tm_MinSize = 16;\n\t\tLOGWARNING(\"RoughRavines: MinSize too small, adjusting request from %d to %d\", a_MinSize, m_MinSize);\n\t}\n\tif (m_MinSize == m_MaxSize)\n\t{\n\t\tm_MaxSize = m_MinSize + 1;\n\t}\n}\n\n\n\n\n\ncGridStructGen::cStructurePtr cRoughRavines::CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ)\n{\n\t// Pick a random value for each of the ravine's parameters:\n\tsize_t Size = static_cast<size_t>(m_MinSize + (m_Noise.IntNoise2DInt(a_GridX, a_GridZ) / 7) % (m_MaxSize - m_MinSize));  // Random int from m_MinSize to m_MaxSize\n\tfloat CenterWidth         = m_Noise.IntNoise2DInRange(a_GridX + 10, a_GridZ, m_MinCenterWidth,         m_MaxCenterWidth);\n\tfloat Roughness           = m_Noise.IntNoise2DInRange(a_GridX + 20, a_GridZ, m_MinRoughness,           m_MaxRoughness);\n\tfloat FloorHeightEdge1    = m_Noise.IntNoise2DInRange(a_GridX + 30, a_GridZ, m_MinFloorHeightEdge,     m_MaxFloorHeightEdge);\n\tfloat FloorHeightEdge2    = m_Noise.IntNoise2DInRange(a_GridX + 40, a_GridZ, m_MinFloorHeightEdge,     m_MaxFloorHeightEdge);\n\tfloat FloorHeightCenter   = m_Noise.IntNoise2DInRange(a_GridX + 50, a_GridZ, m_MinFloorHeightCenter,   m_MaxFloorHeightCenter);\n\tfloat CeilingHeightEdge1  = m_Noise.IntNoise2DInRange(a_GridX + 60, a_GridZ, m_MinCeilingHeightEdge,   m_MaxCeilingHeightEdge);\n\tfloat CeilingHeightEdge2  = m_Noise.IntNoise2DInRange(a_GridX + 70, a_GridZ, m_MinCeilingHeightEdge,   m_MaxCeilingHeightEdge);\n\tfloat CeilingHeightCenter = m_Noise.IntNoise2DInRange(a_GridX + 80, a_GridZ, m_MinCeilingHeightCenter, m_MaxCeilingHeightCenter);\n\n\t// Create a ravine:\n\treturn cStructurePtr(new cRoughRavine(\n\t\tm_Seed,\n\t\tSize, CenterWidth, Roughness,\n\t\tFloorHeightEdge1,   FloorHeightEdge2,   FloorHeightCenter,\n\t\tCeilingHeightEdge1, CeilingHeightEdge2, CeilingHeightCenter,\n\t\ta_GridX, a_GridZ, a_OriginX, a_OriginZ\n\t));\n}\n\n\n\n\n"
  },
  {
    "path": "src/Generating/RoughRavines.h",
    "content": "\n// RoughRavines.h\n\n// Declares the cRoughRavines class representing the rough ravine generator\n\n\n\n\n#pragma once\n\n#include \"GridStructGen.h\"\n\n\n\n\n\nclass cRoughRavines:\n\tpublic cGridStructGen\n{\n\tusing Super = cGridStructGen;\n\npublic:\n\n\tcRoughRavines(\n\t\tint a_Seed,\n\t\tint a_MaxSize, int a_MinSize,\n\t\tfloat a_MaxCenterWidth, float a_MinCenterWidth,\n\t\tfloat a_MaxRoughness,   float a_MinRoughness,\n\t\tfloat a_MaxFloorHeightEdge,     float a_MinFloorHeightEdge,\n\t\tfloat a_MaxFloorHeightCenter,   float a_MinFloorHeightCenter,\n\t\tfloat a_MaxCeilingHeightEdge,   float a_MinCeilingHeightEdge,\n\t\tfloat a_MaxCeilingHeightCenter, float a_MinCeilingHeightCenter,\n\t\tint a_GridSize, int a_MaxOffset\n\t);\n\nprotected:\n\t/** Maximum size of the ravine, in each of the X / Z axis */\n\tint m_MaxSize;\n\n\t/** Minimum size of the ravine */\n\tint m_MinSize;\n\n\t/** Maximum width of the ravine's center, in blocks */\n\tfloat m_MaxCenterWidth;\n\n\t/** Minimum width of the ravine's center, in blocks */\n\tfloat m_MinCenterWidth;\n\n\t/** Maximum roughness of the ravine */\n\tfloat m_MaxRoughness;\n\n\t/** Minimum roughness of the ravine */\n\tfloat m_MinRoughness;\n\n\t/** Maximum floor height at the ravine's edge */\n\tfloat m_MaxFloorHeightEdge;\n\n\t/** Minimum floor height at the ravine's edge */\n\tfloat m_MinFloorHeightEdge;\n\n\t/** Maximum floor height at the ravine's center */\n\tfloat m_MaxFloorHeightCenter;\n\n\t/** Minimum floor height at the ravine's center */\n\tfloat m_MinFloorHeightCenter;\n\n\t/** Maximum ceiling height at the ravine's edge */\n\tfloat m_MaxCeilingHeightEdge;\n\n\t/** Minimum ceiling height at the ravine's edge */\n\tfloat m_MinCeilingHeightEdge;\n\n\t/** Maximum ceiling height at the ravine's center */\n\tfloat m_MaxCeilingHeightCenter;\n\n\t/** Minimum ceiling height at the ravine's center */\n\tfloat m_MinCeilingHeightCenter;\n\n\t// cGridStructGen overrides:\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Generating/ShapeGen.cpp",
    "content": "\n// ShapeGen.cpp\n\n// Implements the function to create a cTerrainShapeGen descendant based on INI file settings\n\n#include \"Globals.h\"\n#include \"HeiGen.h\"\n#include \"../IniFile.h\"\n#include \"DistortedHeightmap.h\"\n#include \"EndGen.h\"\n#include \"Noise3DGenerator.h\"\n#include \"TwoHeights.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cTerrainHeightToShapeGen:\n\n/** Converts old-style height-generators into new-style shape-generators. */\nclass cTerrainHeightToShapeGen:\n\tpublic cTerrainShapeGen\n{\npublic:\n\tcTerrainHeightToShapeGen(std::unique_ptr<cTerrainHeightGen> a_HeightGen):\n\t\tm_HeightGen(std::move(a_HeightGen))\n\t{\n\t}\n\n\n\t// cTerrainShapeGen overrides:\n\tvirtual void GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape) override\n\t{\n\t\t// Generate the heightmap:\n\t\tcChunkDef::HeightMap heightMap;\n\t\tm_HeightGen->GenHeightMap(a_ChunkCoords, heightMap);\n\n\t\t// Convert from heightmap to shape:\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\tint height = cChunkDef::GetHeight(heightMap, x, z) + 1;\n\t\t\t\tByte * shapeColumn = &(a_Shape[(x + 16 * z) * 256]);\n\t\t\t\tfor (int y = 0; y < height; y++)\n\t\t\t\t{\n\t\t\t\t\tshapeColumn[y] = 1;\n\t\t\t\t}\n\t\t\t\tfor (int y = height; y < cChunkDef::Height; y++)\n\t\t\t\t{\n\t\t\t\t\tshapeColumn[y] = 0;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\n\n\tvirtual void InitializeShapeGen(cIniFile & a_IniFile) override\n\t{\n\t\tm_HeightGen->InitializeHeightGen(a_IniFile);\n\t}\n\nprotected:\n\t/** The height generator being converted. */\n\tstd::unique_ptr<cTerrainHeightGen> m_HeightGen;\n};\n\ntypedef std::shared_ptr<cTerrainHeightToShapeGen> cTerrainHeightToShapeGenPtr;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cTerrainShapeGen:\n\nstd::unique_ptr<cTerrainShapeGen> cTerrainShapeGen::CreateShapeGen(\n\tcIniFile & a_IniFile,\n\tcBiomeGen & a_BiomeGen,\n\tint a_Seed,\n\tbool & a_CacheOffByDefault\n)\n{\n\tAString shapeGenName = a_IniFile.GetValue(\"Generator\", \"ShapeGen\");\n\tif (shapeGenName.empty())\n\t{\n\t\tLOGWARN(\"[Generator] ShapeGen value not set in world.ini, using \\\"BiomalNoise3D\\\".\");\n\t\tshapeGenName = \"BiomalNoise3D\";\n\t}\n\n\t// If the shapegen is HeightMap, redirect to older HeightMap-based generators:\n\tif (NoCaseCompare(shapeGenName, \"HeightMap\") == 0)\n\t{\n\t\tauto heightGen = cTerrainHeightGen::CreateHeightGen(a_IniFile, a_BiomeGen, a_Seed, a_CacheOffByDefault);\n\t\tif (heightGen != nullptr)\n\t\t{\n\t\t\treturn std::make_unique<cTerrainHeightToShapeGen>(std::move(heightGen));\n\t\t}\n\n\t\t// The height gen was not recognized; several heightgens were promoted to shape gens, so let's try them instead:\n\t\tshapeGenName = a_IniFile.GetValue(\"Generator\", \"HeightGen\", \"\");\n\t\tif (shapeGenName.empty())\n\t\t{\n\t\t\tLOGWARNING(\"[Generator] ShapeGen set to HeightMap, but HeightGen not set. Reverting to \\\"BiomalNoise3D\\\".\");\n\t\t\tshapeGenName = \"BiomalNoise3D\";\n\t\t\ta_IniFile.SetValue(\"Generator\", \"ShapeGen\", shapeGenName);\n\t\t}\n\t}\n\n\t// Choose the shape generator based on the name:\n\ta_CacheOffByDefault = false;\n\tstd::unique_ptr<cTerrainShapeGen> res;\n\tif (NoCaseCompare(shapeGenName, \"DistortedHeightmap\") == 0)\n\t{\n\t\tres = std::make_unique<cDistortedHeightmap>(a_Seed, a_BiomeGen);\n\t}\n\telse if (NoCaseCompare(shapeGenName, \"End\") == 0)\n\t{\n\t\tres = std::make_unique<cEndGen>(a_Seed);\n\t}\n\telse if (NoCaseCompare(shapeGenName, \"BiomalNoise3D\") == 0)\n\t{\n\t\tres = std::make_unique<cBiomalNoise3DComposable>(a_Seed, a_BiomeGen);\n\t}\n\telse if (NoCaseCompare(shapeGenName, \"Noise3D\") == 0)\n\t{\n\t\tres = std::make_unique<cNoise3DComposable>(a_Seed);\n\t}\n\telse if (NoCaseCompare(shapeGenName, \"TwoHeights\") == 0)\n\t{\n\t\tres = CreateShapeGenTwoHeights(a_Seed, a_BiomeGen);\n\t}\n\telse\n\t{\n\t\t// No match found, force-set the default and retry\n\t\tLOGWARN(\"Unknown ShapeGen \\\"%s\\\", using \\\"BiomalNoise3D\\\" instead.\", shapeGenName.c_str());\n\t\ta_IniFile.SetValue(\"Generator\", \"ShapeGen\", \"BiomalNoise3D\");\n\t\treturn CreateShapeGen(a_IniFile, a_BiomeGen, a_Seed, a_CacheOffByDefault);\n\t}\n\n\t// Read the settings:\n\tres->InitializeShapeGen(a_IniFile);\n\n\treturn res;\n}\n"
  },
  {
    "path": "src/Generating/SinglePieceStructuresGen.cpp",
    "content": "\n#include \"SinglePieceStructuresGen.h\"\n\n#include \"PrefabStructure.h\"\n#include \"../IniFile.h\"\n#include \"../Item.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSinglePieceStructuresGen::cGen\n\nclass cSinglePieceStructuresGen::cGen :\n\tpublic cGridStructGen\n{\n\tusing Super = cGridStructGen;\npublic:\n\tcGen(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen, int a_SeaLevel, const AString & a_Name):\n\t\tSuper(a_Seed),\n\t\tm_BiomeGen(a_BiomeGen),\n\t\tm_HeightGen(a_HeightGen),\n\t\tm_SeaLevel(a_SeaLevel),\n\t\tm_Name(a_Name)\n\t{\n\t}\n\n\n\n\t/** Loads the piecepool from a file.\n\tReturns true on success, logs warning and returns false on failure. */\n\tbool LoadFromFile(const AString & a_FileName)\n\t{\n\t\tm_PiecePool.Clear();\n\n\t\t// Load the piecepool from the file, log any warnings:\n\t\tif (!m_PiecePool.LoadFromFile(a_FileName, true))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (NoCaseCompare(m_PiecePool.GetIntendedUse(), \"SinglePieceStructures\") != 0)\n\t\t{\n\t\t\tLOGWARNING(\"SinglePieceStructures generator: File %s is intended for use in \\\"%s\\\", rather than single piece structures. Loading the file, but the generator may behave unexpectedly.\",\n\t\t\t\ta_FileName.c_str(), m_PiecePool.GetIntendedUse().c_str()\n\t\t\t);\n\t\t}\n\t\tm_PiecePool.AssignGens(m_Seed, m_BiomeGen, m_HeightGen, m_SeaLevel);\n\n\t\t// Apply generator params from the piecepool (in the metadata) into the generator:\n\t\tauto & generatorParams = m_PiecePool.GetAllMetadata();\n\t\tSetGeneratorParams(generatorParams);\n\n\t\treturn true;\n\t}\n\n\n\n\n\t// cGridStructGen override\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override\n\t{\n\t\t// Generate the biomes for the chunk surrounding the origin:\n\t\tint ChunkX, ChunkZ;\n\t\tcChunkDef::BlockToChunk(a_OriginX, a_OriginZ, ChunkX, ChunkZ);\n\t\tcChunkDef::BiomeMap Biomes;\n\t\tm_BiomeGen.GenBiomes({ChunkX, ChunkZ}, Biomes);\n\n\t\t// Checks if the biome at the origin position is allowed\n\t\tauto Relative = cChunkDef::AbsoluteToRelative(Vector3i(a_OriginX, 1, a_OriginZ), {ChunkX, ChunkZ});\n\t\tif (!m_PiecePool.IsBiomeAllowed(Biomes[Relative.x + cChunkDef::Width * Relative.z]))\n\t\t{\n\t\t\treturn cStructurePtr();\n\t\t}\n\t\tcPlacedPieces OutPiece;\n\t\tOutPiece.push_back(GetPiece(a_OriginX, a_OriginZ));\n\t\treturn std::make_shared<cPrefabStructure>(a_GridX, a_GridZ, a_OriginX, a_OriginZ, std::move(OutPiece), m_HeightGen);\n\t}\n\n\n\n\n\t/** Determines which piece to place from the piece pool */\n\tcPlacedPiecePtr GetPiece(int a_BlockX, int a_BlockZ)\n\t{\n\t\tint rnd = m_Noise.IntNoise2DInt(a_BlockX, a_BlockZ) / 7;\n\n\t\t// Choose a random one of the starting pieces:\n\t\tcPieces StartingPieces = m_PiecePool.GetStartingPieces();\n\t\tint Total = 0;\n\t\tfor (cPieces::const_iterator itr = StartingPieces.begin(), end = StartingPieces.end(); itr != end; ++itr)\n\t\t{\n\t\t\tTotal += m_PiecePool.GetStartingPieceWeight(**itr);\n\t\t}\n\t\tcPiece * StartingPiece;\n\t\tif (Total > 0)\n\t\t{\n\t\t\tint Chosen = rnd % Total;\n\t\t\tStartingPiece = StartingPieces.front();\n\t\t\tfor (cPieces::const_iterator itr = StartingPieces.begin(), end = StartingPieces.end(); itr != end; ++itr)\n\t\t\t{\n\t\t\t\tChosen -= m_PiecePool.GetStartingPieceWeight(**itr);\n\t\t\t\tif (Chosen <= 0)\n\t\t\t\t{\n\t\t\t\t\tStartingPiece = *itr;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// All pieces returned zero weight, but we need one to start. Choose with equal chance:\n\t\t\tStartingPiece = StartingPieces[static_cast<size_t>(rnd) % StartingPieces.size()];\n\t\t}\n\t\trnd = rnd >> 16;\n\n\t\t// Choose a random supported rotation:\n\t\tint Rotations[4] = {0};\n\t\tint NumRotations = 1;\n\t\tfor (size_t i = 1; i < ARRAYCOUNT(Rotations); i++)\n\t\t{\n\t\t\tif (StartingPiece->CanRotateCCW(static_cast<int>(i)))\n\t\t\t{\n\t\t\t\tRotations[NumRotations] = static_cast<int>(i);\n\t\t\t\tNumRotations += 1;\n\t\t\t}\n\t\t}\n\t\tint Rotation = Rotations[rnd % NumRotations];\n\t\tint BlockY = StartingPiece->GetStartingPieceHeight(a_BlockX, a_BlockZ);\n\t\tASSERT(BlockY >= 0);  // The vertical strategy should have been provided and should give valid coords\n\n\t\tcPlacedPiece * Piece = new cPlacedPiece(nullptr, *StartingPiece, Vector3i(a_BlockX, BlockY, a_BlockZ), Rotation);\n\t\treturn cPlacedPiecePtr(Piece);\n\t}\n\nprotected:\n\t/** The underlying biome generator that defines whether the structure is created or not */\n\tcBiomeGen & m_BiomeGen;\n\n\t/** The underlying height generator, used to position the prefabs crossing chunk borders if they are set to FitGround. */\n\tcTerrainHeightGen & m_HeightGen;\n\n\t/** The world's sea level, if available. Used for some cVerticalStrategy descendants. */\n\tint m_SeaLevel;\n\n\t/** The name that is used for reporting. */\n\tAString m_Name;\n\n\t/** All available prefabs. */\n\tcPrefabPiecePool m_PiecePool;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSinglePieceStructuresGen\n\ncSinglePieceStructuresGen::cSinglePieceStructuresGen(int a_Seed) :\n\tm_Seed(a_Seed)\n{\n}\n\n\n\n\n\nbool cSinglePieceStructuresGen::Initialize(const AString & a_Prefabs, int a_SeaLevel, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen)\n{\n\t// Load each piecepool:\n\tauto Structures = StringSplitAndTrim(a_Prefabs, \"|\");\n\tfor (const auto & S: Structures)\n\t{\n\t\tauto FileName = fmt::format(FMT_STRING(\"Prefabs{0}SinglePieceStructures{0}{1}.cubeset\"), cFile::PathSeparator(), S);\n\t\tif (!cFile::IsFile(FileName))\n\t\t{\n\t\t\tFileName.append(\".gz\");\n\t\t\tif (!cFile::IsFile(FileName))\n\t\t\t{\n\t\t\t\tLOGWARNING(\"Cannot load SinglePieceStructure cubeset file %s\", FileName);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tauto Gen = std::make_shared<cGen>(m_Seed, a_BiomeGen, a_HeightGen, a_SeaLevel, S);\n\t\tif (Gen->LoadFromFile(FileName))\n\t\t{\n\t\t\tm_Gens.push_back(Gen);\n\t\t}\n\t}\n\n\t// Report a warning if no generators available:\n\tif (m_Gens.empty())\n\t{\n\t\tLOGWARNING(\"The PieceStructures generator was asked to generate \\\"%s\\\", but none of the prefabs are valid.\", a_Prefabs);\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cSinglePieceStructuresGen::GenFinish(cChunkDesc & a_Chunk)\n{\n\tfor (auto & Gen: m_Gens)\n\t{\n\t\tGen->GenFinish(a_Chunk);\n\t}\n}\n"
  },
  {
    "path": "src/Generating/SinglePieceStructuresGen.h",
    "content": "\n// PrefabSingleStructureGen.h\n\n\n/*\nClasses to support the generation of single piece prefab structures\n*/\n\n#pragma once\n\n#include \"Globals.h\"\n\n#include \"ComposableGenerator.h\"\n#include \"PrefabPiecePool.h\"\n\n/** The Single Prefab Structure Generator:\nThis uses the cGridStructGen to generate the structures on the map\nThis is similar to the Piece Structure Generator but only placing one possible structure\nThe Exported cubeset MUST have all possible structures as start structures or the server crashes on generation\nelse it isn't accessible from the m_Piecepool. */\nclass cSinglePieceStructuresGen :\n\tpublic cFinishGen\n{\nusing Super = cFinishGen;\n\npublic:\n\tcSinglePieceStructuresGen(int a_Seed);\n\n\t/** Initializes the generator based on the specified prefab sets.\n\ta_Prefabs contains the list of prefab sets that should be activated, \"|\"-separated.\n\tAll problems are logged to the console and the generator skips over them.\n\tReturns true if at least one prefab set is valid (the generator should be kept). */\n\tbool Initialize(const AString & a_Prefabs, int a_SeaLevel, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen);\n\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\nprotected:\n\t/** The generator doing the work for a single prefab set.\n\tForward-declared so that its implementation changes don't affect the header. */\n\tclass cGen;\n\n\ttypedef std::shared_ptr<cGen> cGenPtr;\n\ttypedef std::vector<cGenPtr> cGenPtrs;\n\n\t/** The individual structure generators, one per piecepool. */\n\tcGenPtrs m_Gens;\n\n\t/** The seed for the random number generator */\n\tint m_Seed;\n};\n"
  },
  {
    "path": "src/Generating/StructGen.cpp",
    "content": "\n// StructGen.h\n\n#include \"Globals.h\"\n#include \"StructGen.h\"\n#include \"Trees.h\"\n#include \"../BlockArea.h\"\n#include \"../LinearUpscale.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenTrees:\n\nvoid cStructGenTrees::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\n\tcChunkDesc WorkerDesc({ChunkX, ChunkZ});\n\n\t// Generate trees:\n\tfor (int x = 0; x <= 2; x++)\n\t{\n\t\tint BaseX = ChunkX + x - 1;\n\t\tfor (int z = 0; z <= 2; z++)\n\t\t{\n\t\t\tint BaseZ = ChunkZ + z - 1;\n\n\t\t\tcChunkDesc * Dest;\n\n\t\t\tif ((x != 1) || (z != 1))\n\t\t\t{\n\t\t\t\tDest = &WorkerDesc;\n\t\t\t\tWorkerDesc.SetChunkCoords({BaseX, BaseZ});\n\n\t\t\t\t// TODO: This may cause a lot of wasted calculations, instead of pulling data out of a single (cChunkDesc) cache\n\n\t\t\t\tcChunkDesc::Shape workerShape;\n\t\t\t\tm_BiomeGen.GenBiomes           ({BaseX, BaseZ}, WorkerDesc.GetBiomeMap());\n\t\t\t\tm_ShapeGen.GenShape            ({BaseX, BaseZ}, workerShape);\n\t\t\t\tWorkerDesc.SetHeightFromShape  (workerShape);\n\t\t\t\tm_CompositionGen.ComposeTerrain(WorkerDesc, workerShape);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDest = &a_ChunkDesc;\n\t\t\t}\n\n\t\t\tdouble NumTrees = GetNumTrees(BaseX, BaseZ, Dest->GetBiomeMap());\n\n\t\t\tsSetBlockVector OutsideLogs, OutsideOther;\n\t\t\tif (NumTrees < 1)\n\t\t\t{\n\t\t\t\tVector3i Pos;\n\t\t\t\tPos.x = (m_Noise.IntNoise3DInt(BaseX + BaseZ, BaseZ, 0) / 19) % cChunkDef::Width;\n\t\t\t\tPos.z = (m_Noise.IntNoise3DInt(BaseX - BaseZ, 0, BaseZ) / 19) % cChunkDef::Width;\n\t\t\t\tPos.y = Dest->GetHeight(Pos.x, Pos.z);\n\n\t\t\t\tif (std::abs(m_Noise.IntNoise3D(BaseX * cChunkDef::Width + Pos.x, Pos.y, BaseZ * cChunkDef::Width + Pos.z)) <= NumTrees)\n\t\t\t\t{\n\t\t\t\t\tGenerateSingleTree(BaseX, BaseZ, 0, Pos, *Dest, OutsideLogs, OutsideOther);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < NumTrees; i++)\n\t\t\t\t{\n\t\t\t\t\tVector3i Pos;\n\t\t\t\t\tPos.x = (m_Noise.IntNoise3DInt(BaseX + BaseZ, BaseZ, i) / 19) % cChunkDef::Width;\n\t\t\t\t\tPos.z = (m_Noise.IntNoise3DInt(BaseX - BaseZ, i, BaseZ) / 19) % cChunkDef::Width;\n\t\t\t\t\tPos.y = Dest->GetHeight(Pos.x, Pos.z);\n\n\t\t\t\t\tGenerateSingleTree(BaseX, BaseZ, i, Pos, *Dest, OutsideLogs, OutsideOther);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsSetBlockVector IgnoredOverflow;\n\t\t\tIgnoredOverflow.reserve(OutsideOther.size());\n\t\t\tApplyTreeImage(ChunkX, ChunkZ, a_ChunkDesc, OutsideOther, IgnoredOverflow);\n\t\t\tIgnoredOverflow.clear();\n\t\t\tIgnoredOverflow.reserve(OutsideLogs.size());\n\t\t\tApplyTreeImage(ChunkX, ChunkZ, a_ChunkDesc, OutsideLogs, IgnoredOverflow);\n\t\t}  // for z\n\t}  // for x\n\n\ta_ChunkDesc.UpdateHeightmap();\n}\n\n\n\n\n\nvoid cStructGenTrees::GenerateSingleTree(\n\tint a_ChunkX, int a_ChunkZ, int a_Seq,\n\tVector3i a_Pos,\n\tcChunkDesc & a_ChunkDesc,\n\tsSetBlockVector & a_OutsideLogs,\n\tsSetBlockVector & a_OutsideOther\n)\n{\n\tif ((a_Pos.y <= 0) || (a_Pos.y >= 230))\n\t{\n\t\treturn;\n\t}\n\n\t// Check the block underneath the tree:\n\tBLOCKTYPE TopBlock = a_ChunkDesc.GetBlockType(a_Pos.x, a_Pos.y, a_Pos.z);\n\tif ((TopBlock != E_BLOCK_DIRT) && (TopBlock != E_BLOCK_GRASS) && (TopBlock != E_BLOCK_FARMLAND) && (TopBlock != E_BLOCK_MYCELIUM))\n\t{\n\t\treturn;\n\t}\n\n\tsSetBlockVector TreeLogs, TreeOther;\n\tGetTreeImageByBiome(\n\t\t{ a_ChunkX * cChunkDef::Width + a_Pos.x, a_Pos.y + 1, a_ChunkZ * cChunkDef::Width + a_Pos.z },\n\t\tm_Noise, a_Seq,\n\t\ta_ChunkDesc.GetBiome(a_Pos.x, a_Pos.z),\n\t\tTreeLogs, TreeOther\n\t);\n\n\t// Check if the generated image fits the terrain. Only the logs are checked:\n\tfor (sSetBlockVector::const_iterator itr = TreeLogs.begin(); itr != TreeLogs.end(); ++itr)\n\t{\n\t\tif ((itr->m_ChunkX != a_ChunkX) || (itr->m_ChunkZ != a_ChunkZ))\n\t\t{\n\t\t\t// Outside the chunk\n\t\t\tcontinue;\n\t\t}\n\t\tif (itr->m_RelY >= cChunkDef::Height)\n\t\t{\n\t\t\t// Above the chunk, cut off (this shouldn't happen too often, we're limiting trees to y < 230)\n\t\t\tcontinue;\n\t\t}\n\n\t\tBLOCKTYPE Block = a_ChunkDesc.GetBlockType(itr->m_RelX, itr->m_RelY, itr->m_RelZ);\n\t\tswitch (Block)\n\t\t{\n\t\t\tCASE_TREE_ALLOWED_BLOCKS:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\t// There's something in the way, abort this tree altogether\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tApplyTreeImage(a_ChunkX, a_ChunkZ, a_ChunkDesc, TreeOther, a_OutsideOther);\n\tApplyTreeImage(a_ChunkX, a_ChunkZ, a_ChunkDesc, TreeLogs,  a_OutsideLogs);\n}\n\n\n\n\n\nvoid cStructGenTrees::ApplyTreeImage(\n\tint a_ChunkX, int a_ChunkZ,\n\tcChunkDesc & a_ChunkDesc,\n\tconst sSetBlockVector & a_Image,\n\tsSetBlockVector & a_Overflow\n)\n{\n\t// Put the generated image into a_BlockTypes, push things outside this chunk into a_Blocks\n\tfor (sSetBlockVector::const_iterator itr = a_Image.begin(), end = a_Image.end(); itr != end; ++itr)\n\t{\n\t\tif ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ) && (itr->m_RelY < cChunkDef::Height))\n\t\t{\n\t\t\t// Inside this chunk, integrate into a_ChunkDesc:\n\t\t\tswitch (a_ChunkDesc.GetBlockType(itr->m_RelX, itr->m_RelY, itr->m_RelZ))\n\t\t\t{\n\t\t\t\tcase E_BLOCK_NEW_LEAVES:\n\t\t\t\tcase E_BLOCK_LEAVES:\n\t\t\t\tcase E_BLOCK_HUGE_BROWN_MUSHROOM:\n\t\t\t\tcase E_BLOCK_HUGE_RED_MUSHROOM:\n\t\t\t\t{\n\t\t\t\t\tif ((itr->m_BlockType != E_BLOCK_LOG) && (itr->m_BlockType != E_BLOCK_NEW_LOG))\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// fallthrough:\n\t\t\t\t}\n\t\t\t\tCASE_TREE_OVERWRITTEN_BLOCKS:\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockTypeMeta(itr->m_RelX, itr->m_RelY, itr->m_RelZ, itr->m_BlockType, itr->m_BlockMeta);\n\t\t\t\t\t// If grass is below our tree, turn it to dirt\n\t\t\t\t\tif (\n\t\t\t\t\t\t(cBlockInfo::IsSolid(itr->m_BlockType)) &&\n\t\t\t\t\t\t(a_ChunkDesc.GetBlockType(itr->m_RelX, itr->m_RelY - 1, itr->m_RelZ) == E_BLOCK_GRASS)\n\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockType(itr->m_RelX, itr->m_RelY - 1, itr->m_RelZ, E_BLOCK_DIRT);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}  // switch (GetBlock())\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Outside the chunk, push into a_Overflow.\n\t\t// Don't check if already present there, by separating logs and others we don't need the checks anymore:\n\t\ta_Overflow.push_back(*itr);\n\t}\n}\n\n\n\n\n\ndouble cStructGenTrees::GetNumTrees(\n\tint a_ChunkX, int a_ChunkZ,\n\tconst cChunkDef::BiomeMap & a_Biomes\n)\n{\n\tauto BiomeTrees = [](EMCSBiome a_Biome)\n\t{\n\t\tswitch (a_Biome)\n\t\t{\n\t\t\tcase biOcean:                return 2.0;\n\t\t\tcase biPlains:               return 0.03125;\n\t\t\tcase biDesert:               return 0.0;\n\t\t\tcase biExtremeHills:         return 3.0;\n\t\t\tcase biForest:               return 30.0;\n\t\t\tcase biTaiga:                return 30.0;\n\t\t\tcase biSwampland:            return 8.0;\n\t\t\tcase biRiver:                return 0.0;\n\t\t\tcase biNether:               return 0.0;\n\t\t\tcase biEnd:                  return 0.0;\n\t\t\tcase biFrozenOcean:          return 0.0;\n\t\t\tcase biFrozenRiver:          return 0.0;\n\t\t\tcase biIcePlains:            return 0.03125;\n\t\t\tcase biIceMountains:         return 0.125;\n\t\t\tcase biMushroomIsland:       return 3.0;\n\t\t\tcase biMushroomShore:        return 3.0;\n\t\t\tcase biBeach:                return 0.0;\n\t\t\tcase biDesertHills:          return 0.0;\n\t\t\tcase biForestHills:          return 20.0;\n\t\t\tcase biTaigaHills:           return 20.0;\n\t\t\tcase biExtremeHillsEdge:     return 5.0;\n\t\t\tcase biJungle:               return 120.0;\n\t\t\tcase biJungleHills:          return 90.0;\n\t\t\tcase biJungleEdge:           return 90.0;\n\t\t\tcase biDeepOcean:            return 0.0;\n\t\t\tcase biStoneBeach:           return 0.0;\n\t\t\tcase biColdBeach:            return 0.0;\n\t\t\tcase biBirchForest:          return 30.0;\n\t\t\tcase biBirchForestHills:     return 20.0;\n\t\t\tcase biRoofedForest:         return 50.0;\n\t\t\tcase biColdTaiga:            return 20.0;\n\t\t\tcase biColdTaigaHills:       return 15.0;\n\t\t\tcase biMegaTaiga:            return 15.0;\n\t\t\tcase biMegaTaigaHills:       return 15.0;\n\t\t\tcase biExtremeHillsPlus:     return 3.0;\n\t\t\tcase biSavanna:              return 8.0;\n\t\t\tcase biSavannaPlateau:       return 12.0;\n\t\t\tcase biMesa:                 return 2.0;\n\t\t\tcase biMesaPlateauF:         return 8.0;\n\t\t\tcase biMesaPlateau:          return 8.0;\n\t\t\t// Biome variants\n\t\t\tcase biSunflowerPlains:      return 0.03125;\n\t\t\tcase biDesertM:              return 0.0;\n\t\t\tcase biExtremeHillsM:        return 4.0;\n\t\t\tcase biFlowerForest:         return 2.0;\n\t\t\tcase biTaigaM:               return 30.0;\n\t\t\tcase biSwamplandM:           return 8.0;\n\t\t\tcase biIcePlainsSpikes:      return 0.0078125;\n\t\t\tcase biJungleM:              return 120.0;\n\t\t\tcase biJungleEdgeM:          return 90.0;\n\t\t\tcase biBirchForestM:         return 30.0;\n\t\t\tcase biBirchForestHillsM:    return 20.0;\n\t\t\tcase biRoofedForestM:        return 40.0;\n\t\t\tcase biColdTaigaM:           return 30.0;\n\t\t\tcase biMegaSpruceTaiga:      return 15.0;\n\t\t\tcase biMegaSpruceTaigaHills: return 15.0;\n\t\t\tcase biExtremeHillsPlusM:    return 4.0;\n\t\t\tcase biSavannaM:             return 8.0;\n\t\t\tcase biSavannaPlateauM:      return 12.0;\n\t\t\tcase biMesaBryce:            return 4.0;\n\t\t\tcase biMesaPlateauFM:        return 12.0;\n\t\t\tcase biMesaPlateauM:         return 12.0;\n\t\t\t// Non-biomes\n\t\t\tcase biInvalidBiome:\n\t\t\tcase biNumBiomes:\n\t\t\tcase biVariant:\n\t\t\tcase biNumVariantBiomes:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tUNREACHABLE(\"Unsupported biome\");\n\t};\n\n\tdouble NumTrees = 0.0;\n\tfor (auto Biome : a_Biomes)\n\t{\n\t\tNumTrees += BiomeTrees(Biome);\n\t}\n\n\treturn NumTrees / (cChunkDef::Width * cChunkDef::Width * 4);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenLakes:\n\nvoid cStructGenLakes::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tint ChunkX = a_ChunkDesc.GetChunkX();\n\tint ChunkZ = a_ChunkDesc.GetChunkZ();\n\n\tfor (int z = -1; z < 2; z++) for (int x = -1; x < 2; x++)\n\t{\n\t\tif (((m_Noise.IntNoise2DInt(ChunkX + x, ChunkZ + z) / 17) % 100) > m_Probability)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tcBlockArea Lake;\n\t\tCreateLakeImage(ChunkX + x, ChunkZ + z, a_ChunkDesc.GetMinHeight(), Lake);\n\n\t\tint OfsX = Lake.GetOriginX() + x * cChunkDef::Width;\n\t\tint OfsZ = Lake.GetOriginZ() + z * cChunkDef::Width;\n\n\t\t// Merge the lake into the current data\n\t\ta_ChunkDesc.WriteBlockArea(Lake, OfsX, Lake.GetOriginY(), OfsZ, cBlockArea::msLake);\n\t}  // for x, z - neighbor chunks\n}\n\n\n\n\n\nvoid cStructGenLakes::CreateLakeImage(int a_ChunkX, int a_ChunkZ, int a_MaxLakeHeight, cBlockArea & a_Lake)\n{\n\ta_Lake.Create(16, 8, 16);\n\ta_Lake.Fill(cBlockArea::baTypes, E_BLOCK_SPONGE);  // Sponge is the NOP blocktype for lake merging strategy\n\n\t// Make a random position in the chunk by using a random 16 block XZ offset and random height up to chunk's max height minus 6\n\tint MinHeight = std::max(a_MaxLakeHeight - 6, 2);\n\tint Rnd = m_Noise.IntNoise3DInt(a_ChunkX, 128, a_ChunkZ) / 11;\n\t// Random offset [-8 .. 8], with higher probability around 0; add up four three-bit-wide randoms [0 .. 28], divide and subtract to get range\n\tint OffsetX = 4 * ((Rnd & 0x07) + ((Rnd & 0x38) >> 3) + ((Rnd & 0x1c0) >> 6) + ((Rnd & 0xe00) >> 9)) / 7 - 8;\n\tRnd >>= 12;\n\t// Random offset [-8 .. 8], with higher probability around 0; add up four three-bit-wide randoms [0 .. 28], divide and subtract to get range\n\tint OffsetZ = 4 * ((Rnd & 0x07) + ((Rnd & 0x38) >> 3) + ((Rnd & 0x1c0) >> 6) + ((Rnd & 0xe00) >> 9)) / 7 - 8;\n\tRnd = m_Noise.IntNoise3DInt(a_ChunkX, 512, a_ChunkZ) / 13;\n\t// Random height [1 .. MinHeight] with preference to center heights\n\tint HeightY = 1 + (((Rnd & 0x1ff) % MinHeight) + (((Rnd >> 9) & 0x1ff) % MinHeight)) / 2;\n\n\ta_Lake.SetOrigin(OffsetX, HeightY, OffsetZ);\n\n\t// Hollow out a few bubbles inside the blockarea:\n\tint NumBubbles = 4 + ((Rnd >> 18) & 0x03);  // 4 .. 7 bubbles\n\tBLOCKTYPE * BlockTypes = a_Lake.GetBlockTypes();\n\tfor (int i = 0; i < NumBubbles; i++)\n\t{\n\t\tint BubbleRnd = m_Noise.IntNoise3DInt(a_ChunkX, i, a_ChunkZ) / 13;\n\t\tconst int BubbleR = 2 + (BubbleRnd & 0x03);  // 2 .. 5\n\t\tconst int Range = 16 - 2 * BubbleR;\n\t\tconst int BubbleX = BubbleR + (BubbleRnd % Range);\n\t\tBubbleRnd >>= 4;\n\t\tconst int BubbleY = 4 + (BubbleRnd & 0x01);  // 4 .. 5\n\t\tBubbleRnd >>= 1;\n\t\tconst int BubbleZ = BubbleR + (BubbleRnd % Range);\n\t\tconst int HalfR = BubbleR / 2;  // 1 .. 2\n\t\tconst int RSquared = BubbleR * BubbleR;\n\t\tfor (int y = -HalfR; y <= HalfR; y++)\n\t\t{\n\t\t\t// BubbleY + y is in the [0, 7] bounds\n\t\t\tint DistY = 4 * y * y / 3;\n\t\t\tint IdxY = (BubbleY + y) * 16 * 16;\n\t\t\tfor (int z = -BubbleR; z <= BubbleR; z++)\n\t\t\t{\n\t\t\t\tint DistYZ = DistY + z * z;\n\t\t\t\tif (DistYZ >= RSquared)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint IdxYZ = BubbleX + IdxY + (BubbleZ + z) * 16;\n\t\t\t\tfor (int x = -BubbleR; x <= BubbleR; x++)\n\t\t\t\t{\n\t\t\t\t\tif (x * x + DistYZ < RSquared)\n\t\t\t\t\t{\n\t\t\t\t\t\tBlockTypes[x + IdxYZ] = E_BLOCK_AIR;\n\t\t\t\t\t}\n\t\t\t\t}  // for x\n\t\t\t}  // for z\n\t\t}  // for y\n\t}  // for i - bubbles\n\n\t// Turn air in the bottom half into liquid:\n\tfor (int y = 0; y < 4; y++)\n\t{\n\t\tfor (int z = 0; z < 16; z++) for (int x = 0; x < 16; x++)\n\t\t{\n\t\t\tif (BlockTypes[x + z * 16 + y * 16 * 16] == E_BLOCK_AIR)\n\t\t\t{\n\t\t\t\tBlockTypes[x + z * 16 + y * 16 * 16] = m_Fluid;\n\t\t\t}\n\t\t}  // for z, x\n\t}  // for y\n\n\t// TODO: Turn sponge next to lava into stone\n\n\t// a_Lake.SaveToSchematicFile(fmt::format(FMT_STRING(\"Lake_{}_{}.schematic\"), a_ChunkX, a_ChunkZ));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenDirectOverhangs:\n\ncStructGenDirectOverhangs::cStructGenDirectOverhangs(int a_Seed) :\n\tm_Noise1(a_Seed),\n\tm_Noise2(a_Seed + 1000)\n{\n}\n\n\n\n\n\nvoid cStructGenDirectOverhangs::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\t// If there is no column of the wanted biome, bail out:\n\tif (!HasWantedBiome(a_ChunkDesc))\n\t{\n\t\treturn;\n\t}\n\n\tHEIGHTTYPE MaxHeight = a_ChunkDesc.GetMaxHeight();\n\n\tconst int SEGMENT_HEIGHT = 8;\n\tconst int INTERPOL_X = 16;  // Must be a divisor of 16\n\tconst int INTERPOL_Z = 16;  // Must be a divisor of 16\n\t// Interpolate the chunk in 16 * SEGMENT_HEIGHT * 16 \"segments\", each SEGMENT_HEIGHT blocks high and each linearly interpolated separately.\n\t// Have two buffers, one for the lowest floor and one for the highest floor, so that Y-interpolation can be done between them\n\t// Then swap the buffers and use the previously-top one as the current-bottom, without recalculating it.\n\n\tint FloorBuf1[17 * 17];\n\tint FloorBuf2[17 * 17];\n\tint * FloorHi = FloorBuf1;\n\tint * FloorLo = FloorBuf2;\n\tint BaseX = a_ChunkDesc.GetChunkX() * cChunkDef::Width;\n\tint BaseZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width;\n\tint BaseY = 63;\n\n\t// Interpolate the lowest floor:\n\tfor (int z = 0; z <= 16 / INTERPOL_Z; z++) for (int x = 0; x <= 16 / INTERPOL_X; x++)\n\t{\n\t\tFloorLo[INTERPOL_X * x + 17 * INTERPOL_Z * z] =\n\t\t\tm_Noise1.IntNoise3DInt(BaseX + INTERPOL_X * x, BaseY, BaseZ + INTERPOL_Z * z) *\n\t\t\tm_Noise2.IntNoise3DInt(BaseX + INTERPOL_X * x, BaseY, BaseZ + INTERPOL_Z * z) /\n\t\t\t256;\n\t}  // for x, z - FloorLo[]\n\tLinearUpscale2DArrayInPlace<17, 17, INTERPOL_X, INTERPOL_Z>(FloorLo);\n\n\t// Interpolate segments:\n\tfor (int Segment = BaseY; Segment < MaxHeight; Segment += SEGMENT_HEIGHT)\n\t{\n\t\t// First update the high floor:\n\t\tfor (int z = 0; z <= 16 / INTERPOL_Z; z++) for (int x = 0; x <= 16 / INTERPOL_X; x++)\n\t\t{\n\t\t\tFloorHi[INTERPOL_X * x + 17 * INTERPOL_Z * z] = (\n\t\t\t\tm_Noise1.IntNoise3DInt(BaseX + INTERPOL_X * x, Segment + SEGMENT_HEIGHT, BaseZ + INTERPOL_Z * z) *\n\t\t\t\tm_Noise2.IntNoise3DInt(BaseX + INTERPOL_Z * x, Segment + SEGMENT_HEIGHT, BaseZ + INTERPOL_Z * z) / 256\n\t\t\t);\n\t\t}  // for x, z - FloorLo[]\n\t\tLinearUpscale2DArrayInPlace<17, 17, INTERPOL_X, INTERPOL_Z>(FloorHi);\n\n\t\t// Interpolate between FloorLo and FloorHi:\n\t\tfor (int z = 0; z < 16; z++) for (int x = 0; x < 16; x++)\n\t\t{\n\t\t\tEMCSBiome biome = a_ChunkDesc.GetBiome(x, z);\n\n\t\t\tif ((biome == biExtremeHills) || (biome == biExtremeHillsEdge))\n\t\t\t{\n\t\t\t\tint Lo = FloorLo[x + 17 * z] / 256;\n\t\t\t\tint Hi = FloorHi[x + 17 * z] / 256;\n\t\t\t\tfor (int y = 0; y < SEGMENT_HEIGHT; y++)\n\t\t\t\t{\n\t\t\t\t\tint Val = Lo + (Hi - Lo) * y / SEGMENT_HEIGHT;\n\t\t\t\t\tif (Val < 0)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y + Segment, z, E_BLOCK_AIR);\n\t\t\t\t\t}\n\t\t\t\t}  // for y\n\t\t\t\tbreak;\n\t\t\t}  // if (biome)\n\t\t}  // for z, x\n\n\t\t// Swap the floors:\n\t\tstd::swap(FloorLo, FloorHi);\n\t}\n}\n\n\n\n\n\nbool cStructGenDirectOverhangs::HasWantedBiome(cChunkDesc & a_ChunkDesc) const\n{\n\tcChunkDef::BiomeMap & Biomes = a_ChunkDesc.GetBiomeMap();\n\tfor (size_t i = 0; i < ARRAYCOUNT(Biomes); i++)\n\t{\n\t\tswitch (Biomes[i])\n\t\t{\n\t\t\tcase biExtremeHills:\n\t\t\tcase biExtremeHillsEdge:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}  // for i\n\treturn false;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cStructGenDistortedMembraneOverhangs:\n\ncStructGenDistortedMembraneOverhangs::cStructGenDistortedMembraneOverhangs(int a_Seed) :\n\tm_NoiseX(a_Seed + 1000),\n\tm_NoiseY(a_Seed + 2000),\n\tm_NoiseZ(a_Seed + 3000),\n\tm_NoiseH(a_Seed + 4000)\n{\n}\n\n\n\n\n\nvoid cStructGenDistortedMembraneOverhangs::GenFinish(cChunkDesc & a_ChunkDesc)\n{\n\tconst NOISE_DATATYPE Frequency = static_cast<NOISE_DATATYPE>(16);\n\tconst NOISE_DATATYPE Amount = static_cast<NOISE_DATATYPE>(1);\n\tfor (int y = 50; y < 128; y++)\n\t{\n\t\tNOISE_DATATYPE NoiseY = static_cast<NOISE_DATATYPE>(y) / 32;\n\t\t// TODO: proper water level - where to get?\n\t\tBLOCKTYPE ReplacementBlock = (y > 62) ? E_BLOCK_AIR : E_BLOCK_STATIONARY_WATER;\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tNOISE_DATATYPE NoiseZ = static_cast<NOISE_DATATYPE>(a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z) / Frequency;\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\tNOISE_DATATYPE NoiseX = static_cast<NOISE_DATATYPE>(a_ChunkDesc.GetChunkX() * cChunkDef::Width + x) / Frequency;\n\t\t\t\tNOISE_DATATYPE DistortX = m_NoiseX.CubicNoise3D(NoiseX, NoiseY, NoiseZ) * Amount;\n\t\t\t\tNOISE_DATATYPE DistortY = m_NoiseY.CubicNoise3D(NoiseX, NoiseY, NoiseZ) * Amount;\n\t\t\t\tNOISE_DATATYPE DistortZ = m_NoiseZ.CubicNoise3D(NoiseX, NoiseY, NoiseZ) * Amount;\n\t\t\t\tint MembraneHeight = 96 - static_cast<int>((DistortY + m_NoiseH.CubicNoise2D(NoiseX + DistortX, NoiseZ + DistortZ)) * 30);\n\t\t\t\tif (MembraneHeight < y)\n\t\t\t\t{\n\t\t\t\t\ta_ChunkDesc.SetBlockType(x, y, z, ReplacementBlock);\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for x\n\t}  // for z\n}\n"
  },
  {
    "path": "src/Generating/StructGen.h",
    "content": "\n// StructGen.h\n\n/* Interfaces to the various structure generators:\n\t- cStructGenTrees\n\t- cStructGenMarbleCaves\n\t- cStructGenOres\n*/\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n#include \"../Noise/Noise.h\"\n\n\n\nclass cStructGenTrees :\n\tpublic cFinishGen\n{\npublic:\n\tcStructGenTrees(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainShapeGen & a_ShapeGen, cTerrainCompositionGen & a_CompositionGen) :\n\t\tm_Seed(a_Seed),\n\t\tm_Noise(a_Seed),\n\t\tm_BiomeGen(a_BiomeGen),\n\t\tm_ShapeGen(a_ShapeGen),\n\t\tm_CompositionGen(a_CompositionGen)\n\t{}\n\nprotected:\n\n\tint m_Seed;\n\tcNoise m_Noise;\n\tcBiomeGen &              m_BiomeGen;\n\tcTerrainShapeGen &       m_ShapeGen;\n\tcTerrainCompositionGen & m_CompositionGen;\n\n\t/** Generates and applies an image of a single tree.\n\tParts of the tree inside the chunk are applied to a_ChunkDesc.\n\tParts of the tree outside the chunk are stored in a_OutsideXYZ\n\t*/\n\tvoid GenerateSingleTree(\n\t\tint a_ChunkX, int a_ChunkZ, int a_Seq,\n\t\tVector3i a_Pos,\n\t\tcChunkDesc & a_ChunkDesc,\n\t\tsSetBlockVector & a_OutsideLogs,\n\t\tsSetBlockVector & a_OutsideOther\n\t) ;\n\n\t/** Applies an image into chunk blockdata; all blocks outside the chunk will be appended to a_Overflow. */\n\tvoid ApplyTreeImage(\n\t\tint a_ChunkX, int a_ChunkZ,\n\t\tcChunkDesc & a_ChunkDesc,\n\t\tconst sSetBlockVector & a_Image,\n\t\tsSetBlockVector & a_Overflow\n\t);\n\n\t/** Get the the number of trees to generate in a_Chunk\n\tIf the value is between 0 and 1, it should be interpreted as the probability that a tree should be generated.\n\t*/\n\tdouble GetNumTrees(\n\t\tint a_ChunkX, int a_ChunkZ,\n\t\tconst cChunkDef::BiomeMap & a_Biomes\n\t);\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n\n\n\n\n\nclass cStructGenLakes :\n\tpublic cFinishGen\n{\npublic:\n\tcStructGenLakes(int a_Seed, BLOCKTYPE a_Fluid, cTerrainShapeGen & a_ShapeGen, int a_Probability) :\n\t\tm_Noise(a_Seed),\n\t\tm_Seed(a_Seed),\n\t\tm_Fluid(a_Fluid),\n\t\tm_ShapeGen(a_ShapeGen),\n\t\tm_Probability(a_Probability)\n\t{\n\t}\n\nprotected:\n\tcNoise             m_Noise;\n\tint                m_Seed;\n\tBLOCKTYPE          m_Fluid;\n\tcTerrainShapeGen & m_ShapeGen;\n\n\t/** Chance, [0 .. 100], of a chunk having the lake. */\n\tint m_Probability;\n\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\n\t/** Creates a lake image for the specified chunk into a_Lake. */\n\tvoid CreateLakeImage(int a_ChunkX, int a_ChunkZ, int a_MaxLakeHeight, cBlockArea & a_Lake);\n} ;\n\n\n\n\n\nclass cStructGenDirectOverhangs :\n\tpublic cFinishGen\n{\npublic:\n\tcStructGenDirectOverhangs(int a_Seed);\n\nprotected:\n\tcNoise    m_Noise1;\n\tcNoise    m_Noise2;\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n\n\tbool HasWantedBiome(cChunkDesc & a_ChunkDesc) const;\n} ;\n\n\n\n\n\nclass cStructGenDistortedMembraneOverhangs :\n\tpublic cFinishGen\n{\npublic:\n\tcStructGenDistortedMembraneOverhangs(int a_Seed);\n\nprotected:\n\tcNoise m_NoiseX;\n\tcNoise m_NoiseY;\n\tcNoise m_NoiseZ;\n\tcNoise m_NoiseH;\n\n\t// cFinishGen override:\n\tvirtual void GenFinish(cChunkDesc & a_ChunkDesc) override;\n} ;\n"
  },
  {
    "path": "src/Generating/Trees.cpp",
    "content": "\n// Trees.cpp\n\n// Implements helper functions used for generating trees\n\n#include \"Globals.h\"\n#include \"Trees.h\"\n#include \"../BlockType.h\"\n#include \"../World.h\"\n\n\n\n\n\ntypedef struct\n{\n\tint x, z;\n} sCoords;\n\ntypedef struct\n{\n\tint x, z;\n\tNIBBLETYPE Meta;\n} sMetaCoords;\n\nstatic const sCoords Corners[] =\n{\n\t{-1, -1},\n\t{-1, 1},\n\t{1, -1},\n\t{1, 1},\n} ;\n\n/** Chooses a direction for a branch to go to based on the start position (a_BlockPos) and a_Seq. */\nstatic const Vector3d & pickBranchDirection(const cNoise a_Noise, Vector3i a_BlockPos, int a_Seq)\n{\n\tstatic const std::array<Vector3d, 32> directions =\n\t{\n\t\t{\n\t\t\t{ -1, 0, 0 }, { 0, 0, -1  },\n\t\t\t{ -1, 0, 1 }, { -1, 0, -1 },\n\t\t\t{ 1, 0, 1  }, { 1, 0, -1  },\n\t\t\t{ 1, 0, 0  }, { 0, 0, 1   },\n\n\t\t\t{ -0.5, 0, 0   }, { 0, 0, -0.5    },\n\t\t\t{ -0.5, 0, 0.5 }, { -0.5, 0, -0.5 },\n\t\t\t{ 0.5, 0, 0.5  }, { 0.5, 0, -0.5  },\n\t\t\t{ 0.5, 0, 0    }, { 0, 0, 0.5     },\n\n\t\t\t{ -1, 0.5, 0 }, { 0, 0.5, -1  },\n\t\t\t{ -1, 0.5, 1 }, { -1, 0.5, -1 },\n\t\t\t{ 1, 0.5, 1  }, { 1, 0.5, -1  },\n\t\t\t{ 1, 0.5, 0  }, { 0, 0.5, 1   },\n\n\t\t\t{ -0.5, 0.5, 0   },  { 0, 0.5, -0.5    },\n\t\t\t{ -0.5, 0.5, 0.5 },  { -0.5, 0.5, -0.5 },\n\t\t\t{ 0.5, 0.5, 0.5  },  { 0.5, 0.5, -0.5  },\n\t\t\t{ 0.5, 0.5, 0    },  { 0, 0.5, 0.5     },\n\t\t}\n\t};\n\n\tsize_t index = static_cast<size_t>(a_Noise.IntNoise3DInt(a_BlockPos * a_Seq)) % directions.size();\n\treturn directions[index];\n}\n\n// BigO = a big ring of blocks, used for generating horz slices of treetops, the number indicates the radius\n\nstatic const sCoords BigO1[] =\n{\n\t/* -1 */           {0, -1},\n\t/*  0 */ {-1,  0},          {1,  0},\n\t/*  1 */           {0,  1},\n} ;\n\nstatic const sCoords BigO2[] =\n{\n\t/* -2 */           {-1, -2}, {0, -2}, {1, -2},\n\t/* -1 */ {-2, -1}, {-1, -1}, {0, -1}, {1, -1}, {2, -1},\n\t/*  0 */ {-2,  0}, {-1,  0},          {1,  0}, {2,  0},\n\t/*  1 */ {-2,  1}, {-1,  1}, {0,  1}, {1,  1}, {2,  1},\n\t/*  2 */           {-1,  2}, {0,  2}, {1,  2},\n} ;\n\nstatic const sCoords BigO3[] =\n{\n\t/* -3 */           {-2, -3}, {-1, -3}, {0, -3}, {1, -3}, {2, -3},\n\t/* -2 */ {-3, -2}, {-2, -2}, {-1, -2}, {0, -2}, {1, -2}, {2, -2}, {3, -2},\n\t/* -1 */ {-3, -1}, {-2, -1}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {3, -1},\n\t/*  0 */ {-3,  0}, {-2,  0}, {-1,  0},          {1,  0}, {2,  0}, {3,  0},\n\t/*  1 */ {-3,  1}, {-2,  1}, {-1,  1}, {0,  1}, {1,  1}, {2,  1}, {3,  1},\n\t/*  2 */ {-3,  2}, {-2,  2}, {-1,  2}, {0,  2}, {1,  2}, {2,  2}, {3,  2},\n\t/*  3 */           {-2,  3}, {-1,  3}, {0,  3}, {1,  3}, {2,  3},\n} ;\n\n\nstatic const sCoords BigO4[] =  // Part of dark oak tree\n{\n\t/* -4 */                     {-2, -4}, {-1, -4}, {0, -4}, {1, -4}, {2, -4},\n\t/* -3 */           {-3, -3}, {-2, -3}, {-1, -3}, {0, -3}, {1, -3}, {2, -3}, {3, -3},\n\t/* -2 */ {-4, -2}, {-3, -2}, {-2, -2}, {-1, -2}, {0, -2}, {1, -2}, {2, -2}, {3, -2}, {4, -2},\n\t/* -1 */ {-4, -1}, {-3, -1}, {-2, -1}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {3, -1}, {4, -1},\n\t/*  0 */ {-4,  0}, {-3,  0}, {-2,  0}, {-1,  0},          {1,  0}, {2,  0}, {3,  0}, {4,  0},\n\t/*  1 */ {-4,  1}, {-3,  1}, {-2,  1}, {-1,  1}, {0,  1}, {1,  1}, {2,  1}, {3,  1}, {4,  1},\n\t/*  2 */ {-4,  2}, {-3,  2}, {-2,  2}, {-1,  2}, {0,  2}, {1,  2}, {2,  2}, {3,  2}, {4,  2},\n\t/*  3 */           {-3,  3}, {-2,  3}, {-1,  3}, {0,  3}, {1,  3}, {2,  3}, {3,  3},\n\t/*  4 */                     {-2,  4}, {-1,  4}, {0,  4}, {1,  4}, {2,  4},\n};\n\nstatic const sCoords BigO3Jungle[] =\n{\n\t/* -3 */                               {0, -3}, {1, -3},\n\t/* -2 */                     {-1, -2}, {0, -2}, {1, -2}, {2, -2},\n\t/* -1 */           {-2, -1}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {3, -1},\n\t/*  0 */ {-3,  0}, {-2,  0}, {-1,  0}, {0,  0}, {1,  0}, {2,  0}, {3,  0}, {4,  0},\n\t/*  1 */ {-3,  1}, {-2,  1}, {-1,  1}, {0,  1}, {1,  1}, {2,  1}, {3,  1}, {4,  1},\n\t/*  2 */           {-2,  2}, {-1,  2}, {0,  2}, {1,  2}, {2,  2}, {3,  2},\n\t/*  3 */                     {-1,  3}, {0,  3}, {1,  3}, {2,  3},\n\t/*  4 */                               {0,  4}, {1,  4},\n};\n\nstatic const sCoords BigO4Jungle[] =\n{\n\t/* -4 */                                         {0, -4}, {1, -4},\n\t/* -3 */                     {-2, -3}, {-1, -3}, {0, -3}, {1, -3}, {2, -3}, {3, -3},\n\t/* -2 */           {-3, -2}, {-2, -2}, {-1, -2}, {0, -2}, {1, -2}, {2, -2}, {3, -2}, {4, -2},\n\t/* -1 */           {-3, -1}, {-2, -1}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {3, -1}, {4, -1},\n\t/*  0 */ {-4,  0}, {-3,  0}, {-2,  0}, {-1,  0},                   {2,  0}, {3,  0}, {4,  0}, {5,  0},\n\t/*  1 */ {-4,  1}, {-3,  1}, {-2,  1}, {-1,  1},                   {2,  1}, {3,  1}, {4,  1}, {5,  1},\n\t/*  2 */           {-3,  2}, {-2,  2}, {-1,  2}, {0,  2}, {1,  2}, {2,  2}, {3,  2}, {4,  2},\n\t/*  3 */           {-3,  3}, {-2,  3}, {-1,  3}, {0,  3}, {1,  3}, {2,  3}, {3,  3}, {4,  3},\n\t/*  4 */                     {-2,  4}, {-1,  4}, {0,  4}, {1,  4}, {2,  4}, {3,  4},\n\t/*  5 */                                         {0,  5}, {1,  5},\n};\n\nstatic const sCoords BigO5Jungle[] =\n{\n\t/* -5 */                                                   {0, -5}, {1, -5},\n\t/* -4 */                               {-2, -4}, {-1, -4}, {0, -4}, {1, -4}, {2, -4}, {3, -4},\n\t/* -3 */                     {-3, -3}, {-2, -3}, {-1, -3}, {0, -3}, {1, -3}, {2, -3}, {3, -3}, {4, -3},\n\t/* -2 */           {-4, -2}, {-3, -2}, {-2, -2}, {-1, -2}, {0, -2}, {1, -2}, {2, -2}, {3, -2}, {4, -2}, {5, -2},\n\t/* -1 */           {-4, -1}, {-3, -1}, {-2, -1}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {3, -1}, {4, -1}, {5, -1},\n\t/*  0 */ {-5,  0}, {-4,  0}, {-3,  0}, {-2,  0}, {-1,  0},                   {2,  0}, {3,  0}, {4,  0}, {5,  0}, {6,  0},\n\t/*  1 */ {-5,  1}, {-4,  1}, {-3,  1}, {-2,  1}, {-1,  1},                   {2,  1}, {3,  1}, {4,  1}, {5,  1}, {6,  1},\n\t/*  2 */           {-4,  2}, {-3,  2}, {-2,  2}, {-1,  2}, {0,  2}, {1,  2}, {2,  2}, {3,  2}, {4,  2}, {5,  2},\n\t/*  3 */           {-4,  3}, {-3,  3}, {-2,  3}, {-1,  3}, {0,  3}, {1,  3}, {2,  3}, {3,  3}, {4,  3}, {5,  3},\n\t/*  4 */                     {-3,  4}, {-2,  4}, {-1,  4}, {0,  4}, {1,  4}, {2,  4}, {3,  4}, {4,  4},\n\t/*  5 */                               {-2,  5}, {-1,  5}, {0,  5}, {1,  5}, {2,  5}, {3,  5},\n\t/*  6 */                                                   {0,  6}, {1,  6},\n} ;\n\nstatic const sCoords TopLargePine[] =\n{\n\t/*  0 */ {0,  0}, {1,  0},\n\t/*  1 */ {0,  1}, {1,  1},\n} ;\n\nstatic const sCoords BigOF2Pine[] =\n{\n\t/* -1 */           {0, -1}, {1, -1},\n\t/*  0 */ {-1,  0}, {0,  0}, {1,  0}, {2,  0},\n\t/*  1 */ {-1,  1}, {0,  1}, {1,  1}, {2,  1},\n\t/*  2 */           {0,  2}, {1,  2},\n} ;\n\nstatic const sCoords BigO2Pine[] =\n{\n\t/* -2 */                     {0, -2}, {1, -2},\n\t/* -1 */           {-1, -1}, {0, -1}, {1, -1}, {2, -1},\n\t/*  0 */ {-2,  0}, {-1,  0},                   {2,  0}, {3,  0},\n\t/*  1 */ {-2,  1}, {-1,  1},                   {2,  1}, {3,  1},\n\t/*  2 */           {-1,  2}, {0,  2}, {1,  2}, {2,  2},\n\t/*  3 */                     {0,  3}, {1,  3},\n} ;\n\nstatic const sCoords BigO3Pine[] =\n{\n\t/* -3 */                               {0, -3}, {1, -3},\n\t/* -2 */                     {-1, -2}, {0, -2}, {1, -2}, {2, -2},\n\t/* -1 */           {-2, -1}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {3, -1},\n\t/*  0 */ {-3,  0}, {-2,  0}, {-1,  0},                   {2,  0}, {3,  0}, {4,  0},\n\t/*  1 */ {-3,  1}, {-2,  1}, {-1,  1},                   {2,  1}, {3,  1}, {4,  1},\n\t/*  2 */           {-2,  2}, {-1,  2}, {0,  2}, {1,  2}, {2,  2}, {3,  2},\n\t/*  3 */                     {-1,  3}, {0,  3}, {1,  3}, {2,  3},\n\t/*  4 */                               {0,  4}, {1,  4},\n};\n\nstatic const sCoords BigO1Spruce[] =\n{\n\t/* -1 */           {0, -1}, {1, -1},\n\t/*  0 */ {-1,  0},                   {2,  0},\n\t/*  1 */ {-1,  1},                   {2,  1},\n\t/*  2 */           {0,  2}, {1,  2},\n} ;\n\n\n\ntypedef struct\n{\n\tconst sCoords * Coords;\n\tsize_t          Count;\n} sCoordsArr;\n\nstatic const sCoordsArr BigOLayers[] =\n{\n\t{BigO1, ARRAYCOUNT(BigO1)},\n\t{BigO2, ARRAYCOUNT(BigO2)},\n\t{BigO3, ARRAYCOUNT(BigO3)},\n\t{BigO4, ARRAYCOUNT(BigO4)},\n} ;\n\nstatic const sCoordsArr BigOJungleLayers[] =\n{\n\t{BigO5Jungle, ARRAYCOUNT(BigO5Jungle)},\n\t{BigO4Jungle, ARRAYCOUNT(BigO4Jungle)},\n\t{BigO3Jungle, ARRAYCOUNT(BigO3Jungle)},\n};\n\nstatic const sCoordsArr BigOPineLayers[] =\n{\n\t{BigO3Pine, ARRAYCOUNT(BigO3Pine)},\n\t{BigO2Pine, ARRAYCOUNT(BigO2Pine)},\n\t{BigOF2Pine, ARRAYCOUNT(BigOF2Pine)},\n\t{TopLargePine, ARRAYCOUNT(TopLargePine)},\n};\n\nstatic const sCoordsArr BigOSpruceLayersV1[] =\n{\n\t{BigO1Spruce, ARRAYCOUNT(BigO1Spruce)},\n\t{nullptr, 0},\n};\n\nstatic const sCoordsArr BigOSpruceLayersV2[] =\n{\n\t{BigO2Pine, ARRAYCOUNT(BigO2Pine)},\n\t{BigO1Spruce, ARRAYCOUNT(BigO1Spruce)},\n};\n\nstatic const sCoordsArr BigOSpruceLayersV3[] =\n{\n\t{BigO3Pine, ARRAYCOUNT(BigO3Pine)},\n\t{BigO2Pine, ARRAYCOUNT(BigO2Pine)},\n};\n\nstatic const sCoordsArr BigOSpruceLayersV4[] =\n{\n\t{BigO4Jungle, ARRAYCOUNT(BigO4Jungle)},\n\t{BigO3Pine, ARRAYCOUNT(BigO3Pine)},\n};\n\nstatic const sCoordsArr BigOSpruceTop[] =\n{\n\t{BigO1Spruce, ARRAYCOUNT(BigO1Spruce)},\n\t{TopLargePine, ARRAYCOUNT(TopLargePine)},\n};\n\n\n\n\n\n/** Pushes a specified layer of blocks of the same type around (x, h, z) into a_Blocks */\ninline void PushCoordBlocks(int a_BlockX, int a_Height, int a_BlockZ, sSetBlockVector & a_Blocks, const sCoords * a_Coords, size_t a_NumCoords, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta)\n{\n\tfor (size_t i = 0; i < a_NumCoords; i++)\n\t{\n\t\ta_Blocks.emplace_back(a_BlockX + a_Coords[i].x, a_Height, a_BlockZ + a_Coords[i].z, a_BlockType, a_Meta);\n\t}\n}\n\n\n\n\n\ninline void PushCornerBlocks(int a_BlockX, int a_Height, int a_BlockZ, int a_Seq, cNoise & a_Noise, int a_Chance, sSetBlockVector & a_Blocks, int a_CornersDist, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta)\n{\n\tfor (size_t i = 0; i < ARRAYCOUNT(Corners); i++)\n\t{\n\t\tint x = a_BlockX + Corners[i].x;\n\t\tint z = a_BlockZ + Corners[i].z;\n\t\tif (a_Noise.IntNoise3DInt(x + 64 * a_Seq, a_Height, z + 64 * a_Seq) <= a_Chance)\n\t\t{\n\t\t\ta_Blocks.emplace_back(x, a_Height, z, a_BlockType, a_Meta);\n\t\t}\n\t}  // for i - Corners[]\n}\n\n\n\n\n\ninline void PushSomeColumns(int a_BlockX, int a_Height, int a_BlockZ, int a_ColumnHeight, int a_Seq, cNoise & a_Noise, int a_Chance, sSetBlockVector & a_Blocks, const sMetaCoords * a_Coords, size_t a_NumCoords, BLOCKTYPE a_BlockType)\n{\n\tfor (size_t i = 0; i < a_NumCoords; i++)\n\t{\n\t\tint x = a_BlockX + a_Coords[i].x;\n\t\tint z = a_BlockZ + a_Coords[i].z;\n\t\tif (a_Noise.IntNoise3DInt(x + 64 * a_Seq, a_Height + static_cast<int>(i), z + 64 * a_Seq) <= a_Chance)\n\t\t{\n\t\t\tfor (int j = 0; j < a_ColumnHeight; j++)\n\t\t\t{\n\t\t\t\ta_Blocks.emplace_back(x, a_Height - j, z, a_BlockType, a_Coords[i].Meta);\n\t\t\t}\n\t\t}\n\t}  // for i - a_Coords[]\n}\n\n\n\n\n\nvoid GetTreeImageByBiome(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, EMCSBiome a_Biome, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tswitch (a_Biome)\n\t{\n\t\tcase biPlains:\n\t\tcase biForest:\n\t\tcase biForestHills:\n\t\tcase biSunflowerPlains:\n\t\tcase biFlowerForest:\n\t\tcase biDeepOcean:\n\t\tcase biStoneBeach:\n\t\tcase biColdBeach:\n\t\t{\n\t\t\t// Apple or birch trees:\n\t\t\tif (a_Noise.IntNoise3DInt(a_BlockPos.addedY(16 * a_Seq).addedZ(16 * a_Seq)) < 0x5fffffff)\n\t\t\t{\n\t\t\t\tGetAppleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tGetBirchTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase biColdTaiga:\n\t\tcase biColdTaigaM:\n\t\tcase biColdTaigaHills:\n\t\tcase biIcePlains:\n\t\tcase biIceMountains:\n\t\tcase biTaiga:\n\t\tcase biTaigaHills:\n\t\tcase biTaigaM:\n\t\t{\n\t\t\t// Conifers\n\t\t\tGetConiferTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks, false);\n\t\t\treturn;\n\t\t}\n\n\t\tcase biSwamplandM:\n\t\tcase biSwampland:\n\t\t{\n\t\t\t// Swamp trees:\n\t\t\tGetSwampTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\treturn;\n\t\t}\n\n\t\tcase biJungle:\n\t\tcase biJungleHills:\n\t\tcase biJungleEdge:\n\t\tcase biJungleM:\n\t\tcase biJungleEdgeM:\n\t\t{\n\t\t\t// Apple bushes, large jungle trees, small jungle trees\n\t\t\tif (a_Noise.IntNoise3DInt(a_BlockPos.addedY(16 * a_Seq).addedZ(16 * a_Seq)) < 0x6fffffff)\n\t\t\t{\n\t\t\t\tGetAppleBushImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbool IsLarge = a_Noise.IntNoise3DInt(a_BlockPos.addedX(32 * a_Seq).addedY(32 * a_Seq)) < 0x60000000;\n\t\t\t\tGetJungleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks, IsLarge);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase biBirchForest:\n\t\tcase biBirchForestHills:\n\t\t{\n\t\t\tGetBirchTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\treturn;\n\t\t}\n\n\t\tcase biBirchForestM:\n\t\tcase biBirchForestHillsM:\n\t\t{\n\t\t\tGetTallBirchTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\treturn;\n\t\t}\n\n\t\tcase biMegaTaiga:\n\t\tcase biMegaTaigaHills:\n\t\t{\n\t\t\tbool IsLarge = a_Noise.IntNoise3DInt(a_BlockPos.addedX(32 * a_Seq).addedY(32 * a_Seq)) < 0x30000000;\n\t\t\tGetConiferTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks, IsLarge);\n\t\t\treturn;\n\t\t}\n\n\t\tcase biMegaSpruceTaiga:\n\t\tcase biMegaSpruceTaigaHills:\n\t\t{\n\t\t\tbool IsLarge = a_Noise.IntNoise3DInt(a_BlockPos.addedX(32 * a_Seq).addedY(32 * a_Seq)) < 0x30000000;\n\t\t\tGetSpruceTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks, IsLarge);\n\t\t\treturn;\n\t\t}\n\n\t\tcase biExtremeHills:\n\t\tcase biExtremeHillsM:\n\t\tcase biExtremeHillsEdge:\n\t\tcase biExtremeHillsPlus:\n\t\tcase biExtremeHillsPlusM:\n\t\t{\n\t\t\tif (a_Noise.IntNoise3DInt(a_BlockPos.addedY(16 * a_Seq).addedZ(16 * a_Seq)) < 0x6fffffff)\n\t\t\t{\n\t\t\t\tGetConiferTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tGetAppleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase biSavanna:\n\t\tcase biSavannaPlateau:\n\t\tcase biSavannaM:\n\t\tcase biSavannaPlateauM:\n\t\t{\n\t\t\tGetAcaciaTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\treturn;\n\t\t}\n\n\t\tcase biRoofedForest:\n\t\tcase biRoofedForestM:\n\t\t{\n\t\t\t// 53 % DarkOak\n\t\t\t// 23 % SmallAppleTree\n\t\t\t// 16 % RedMushroom\n\t\t\t// 4 % BrownMushroom\n\t\t\t// 4 % Birch\n\t\t\tconst int DarkOakProb = 53;\n\t\t\tconst int SmallAppleTreeProb = DarkOakProb + 23;\n\t\t\tconst int RedMushroomProb = SmallAppleTreeProb + 16;\n\t\t\tconst int BrownMushroomProb = RedMushroomProb + 4;\n\n\t\t\tstatic_assert(BrownMushroomProb + 4 == 100);\n\n\t\t\tauto RandomValue = a_Noise.IntNoise3DInt(a_BlockPos.addedY(16 * a_Seq).addedZ(16 * a_Seq)) % 100;\n\t\t\tif (RandomValue < DarkOakProb)\n\t\t\t{\n\t\t\t\tGetDarkoakTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\telse if ((RandomValue >= DarkOakProb) && (RandomValue < SmallAppleTreeProb))\n\t\t\t{\n\t\t\t\tGetSmallAppleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\telse if ((RandomValue >= SmallAppleTreeProb) && (RandomValue < RedMushroomProb))\n\t\t\t{\n\t\t\t\tGetRedMushroomTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\telse if ((RandomValue >= RedMushroomProb) && (RandomValue < BrownMushroomProb))\n\t\t\t{\n\t\t\t\tGetBrownMushroomTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tGetBirchTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase biMesa:\n\t\tcase biMesaPlateauF:\n\t\tcase biMesaPlateau:\n\t\tcase biMesaBryce:\n\t\tcase biMesaPlateauFM:\n\t\tcase biMesaPlateauM:\n\t\t{\n\t\t\tGetSmallAppleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\treturn;\n\t\t}\n\t\tcase biMushroomIsland:\n\t\tcase biMushroomShore:\n\t\t{\n\t\t\tif (a_Noise.IntNoise3DInt(a_BlockPos.addedY(16 * a_Seq).addedZ(16 * a_Seq)) < 0x6fffffff)\n\t\t\t{\n\t\t\t\tGetBrownMushroomTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tGetRedMushroomTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase biDesert:\n\t\tcase biDesertHills:\n\t\tcase biDesertM:\n\t\tcase biRiver:\n\t\tcase biBeach:\n\t\tcase biHell:\n\t\tcase biSky:\n\t\tcase biOcean:\n\t\tcase biFrozenOcean:\n\t\tcase biFrozenRiver:\n\t\tcase biIcePlainsSpikes:\n\t\tcase biVariant:\n\t\tcase biNumBiomes:\n\t\tcase biNumVariantBiomes:\n\t\tcase biInvalidBiome:\n\t\t{\n\t\t\t// These biomes have no trees, or are non-biome members of the enum.\n\t\t\treturn;\n\t\t}\n\t}\n\n\tASSERT(!\"Invalid biome type!\");\n}\n\n\n\n\n\nvoid GetAppleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tif (a_Noise.IntNoise3DInt(a_BlockPos.addedX(32 * a_Seq).addedY(32 * a_Seq)) < 0x73333333)\n\t{\n\t\tGetSmallAppleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t}\n\telse\n\t{\n\t\tGetLargeAppleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t}\n}\n\n\n\n\n\nvoid GetSmallAppleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\t/* Small apple tree has:\n\t- a top plus (no log)\n\t- optional BigO1 + random corners (log)\n\t- 2 layers of BigO2 + random corners (log)\n\t- 1 to 3 blocks of trunk\n\t*/\n\n\tint Random = a_Noise.IntNoise3DInt(a_BlockPos.addedX(64 * a_Seq)) >> 3;\n\tHEIGHTTYPE Heights[] = {1, 2, 2, 3} ;\n\tHEIGHTTYPE Height = 1 + Heights[Random & 3];\n\tRandom >>= 2;\n\n\t// Pre-alloc so that we don't realloc too often later:\n\ta_LogBlocks.reserve(static_cast<size_t>(Height + 5));\n\ta_OtherBlocks.reserve(ARRAYCOUNT(BigO2) * 2 + ARRAYCOUNT(BigO1) + ARRAYCOUNT(Corners) * 3 + 3 + 5);\n\n\t// Trunk:\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_LOG, E_META_LOG_APPLE);\n\t}\n\tint Hei = a_BlockPos.y + Height;\n\n\t// 2 BigO2 + corners layers:\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tPushCoordBlocks (a_BlockPos.x, Hei, a_BlockPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\tPushCornerBlocks(a_BlockPos.x, Hei, a_BlockPos.z, a_Seq, a_Noise, 0x5000000 - i * 0x10000000, a_OtherBlocks, 2, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Hei, a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_APPLE);\n\t\tHei++;\n\t}  // for i - 2*\n\n\t// Optional BigO1 + corners layer:\n\tif ((Random & 1) == 0)\n\t{\n\t\tPushCoordBlocks (a_BlockPos.x, Hei, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\tPushCornerBlocks(a_BlockPos.x, Hei, a_BlockPos.z, a_Seq, a_Noise, 0x6000000, a_OtherBlocks, 1, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Hei, a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_APPLE);\n\t\tHei++;\n\t}\n\n\t// Top plus:\n\tPushCoordBlocks(a_BlockPos.x, Hei, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, Hei, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n}\n\n\n\n\n\nvoid GetLargeAppleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tint Height = 7 + a_Noise.IntNoise3DInt(a_BlockPos) % 4;\n\n\t// Create branches\n\tfor (int i = 4; i < Height; i++)\n\t{\n\t\t// Get a direction for the trunk to go to.\n\t\tVector3d BranchStartDirection = pickBranchDirection(a_Noise, a_BlockPos.addedY(i), a_Seq);\n\t\tVector3d BranchDirection = pickBranchDirection(a_Noise, a_BlockPos.addedY(i * a_Seq), a_Seq) / 3;\n\n\t\tint BranchLength = 2 + a_Noise.IntNoise3DInt(a_BlockPos * a_Seq) % 3;\n\t\tGetTreeBranch(E_BLOCK_LOG, E_META_LOG_APPLE, a_BlockPos.addedY(i), BranchLength, BranchStartDirection, BranchDirection, a_LogBlocks);\n\t}\n\n\t// Place leaves around each log block\n\tfor (auto itr : a_LogBlocks)\n\t{\n\t\t// Get the log's X and Z coordinates\n\t\tint X = itr.GetX();\n\t\tint Z = itr.GetZ();\n\n\t\ta_OtherBlocks.emplace_back(X, itr.m_RelY - 2, Z, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\tPushCoordBlocks(X, itr.m_RelY - 2, Z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\tfor (int y = -1; y <= 1; y++)\n\t\t{\n\t\t\tPushCoordBlocks (X, itr.m_RelY + y, Z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\t}\n\t\tPushCoordBlocks(X, itr.m_RelY + 2, Z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\ta_OtherBlocks.emplace_back(X, itr.m_RelY + 2, Z, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t}\n\n\t// Trunk:\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_LOG, E_META_LOG_APPLE);\n\t}\n}\n\n\n\n\n\nVector3d GetTreeBranch(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_BlockPos, int a_BranchLength, Vector3d a_StartDirection, Vector3d a_Direction, sSetBlockVector & a_LogBlocks)\n{\n\tVector3d CurrentPos = Vector3d(a_BlockPos);\n\tVector3d Direction  = a_StartDirection;\n\tfor (int i = 0; i < a_BranchLength; i++)\n\t{\n\t\tCurrentPos += Direction;\n\t\tDirection += a_Direction;\n\t\tDirection.Clamp(-1.0, 1.0);\n\t\ta_LogBlocks.emplace_back(CurrentPos.Floor(), a_BlockType, GetLogMetaFromDirection(a_BlockMeta, Direction));\n\t}\n\treturn CurrentPos;\n}\n\n\n\n\n\nNIBBLETYPE GetLogMetaFromDirection(NIBBLETYPE a_BlockMeta, Vector3d a_Direction)\n{\n\ta_Direction.Abs();\n\n\tif ((a_Direction.y > a_Direction.x) && (a_Direction.y > a_Direction.z))\n\t{\n\t\treturn a_BlockMeta;\n\t}\n\telse if (a_Direction.x > a_Direction.z)\n\t{\n\t\treturn a_BlockMeta + 4;\n\t}\n\telse\n\t{\n\t\treturn a_BlockMeta + 8;\n\t}\n}\n\n\n\n\n\nvoid GetBirchTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tHEIGHTTYPE Height = 5 + static_cast<HEIGHTTYPE>(a_Noise.IntNoise3DInt(a_BlockPos.addedX(64 * a_Seq)) % 3);\n\n\t// Prealloc, so that we don't realloc too often later:\n\ta_LogBlocks.reserve(static_cast<size_t>(Height));\n\ta_OtherBlocks.reserve(80);\n\n\t// The entire trunk, out of logs:\n\tfor (int i = Height - 1; i >= 0; --i)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_LOG, E_META_LOG_BIRCH);\n\t}\n\tint h = a_BlockPos.y + Height;\n\n\t// Top layer - just the Plus:\n\tPushCoordBlocks(a_BlockPos.x, h, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, h, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);  // There's no log at this layer\n\th--;\n\n\t// Second layer - log, Plus and maybe Corners:\n\tPushCoordBlocks (a_BlockPos.x, h, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\tPushCornerBlocks(a_BlockPos.x, h, a_BlockPos.z, a_Seq, a_Noise, 0x5fffffff, a_OtherBlocks, 1, E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\th--;\n\n\t// Third and fourth layers - BigO2 and maybe 2 * Corners:\n\tfor (int Row = 0; Row < 2; Row++)\n\t{\n\t\tPushCoordBlocks (a_BlockPos.x, h, a_BlockPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\t\tPushCornerBlocks(a_BlockPos.x, h, a_BlockPos.z, a_Seq, a_Noise, 0x3fffffff + Row * 0x10000000, a_OtherBlocks, 2, E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\t\th--;\n\t}  // for Row - 2*\n}\n\n\n\n\n\nvoid GetAcaciaTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\t// Calculate a base height\n\tint Height = 2 + (a_Noise.IntNoise3DInt(a_BlockPos) / 11 % 3);\n\n\t// Create the trunk\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_NEW_LOG, E_META_NEW_LOG_ACACIA_WOOD);\n\t}\n\n\t// Array with possible directions for a branch to go to.\n\tconst Vector3i AvailableDirections[] =\n\t{\n\t\t{ -1, 1, 0 }, { 0, 1, -1 },\n\t\t{ -1, 1, 1 }, { -1, 1, -1 },\n\t\t{ 1, 1, 1 }, { 1, 1, -1 },\n\t\t{ 1, 1, 0 }, { 0, 1, 1 },\n\t};\n\n\t// Get a direction for the trunk to go to.\n\tVector3i BranchDirection = AvailableDirections[a_Noise.IntNoise3DInt(a_BlockPos) % 8];\n\n\t// Calculate a height for the branch between 1 and 3\n\tint BranchHeight = a_Noise.IntNoise3DInt(a_BlockPos) % 3 + 1;\n\n\tVector3i BranchPos = GetTreeBranch(E_BLOCK_NEW_LOG, E_META_NEW_LOG_ACACIA_WOOD, a_BlockPos.addedY(Height - 1), BranchHeight, Vector3i(BranchDirection), Vector3i(BranchDirection), a_LogBlocks).Floor();\n\n\t// Add the leaves to the top of the branch\n\tPushCoordBlocks(BranchPos.x, BranchPos.y, BranchPos.z, a_OtherBlocks, BigO3, ARRAYCOUNT(BigO3), E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_ACACIA);\n\tPushCoordBlocks(BranchPos.x, BranchPos.y + 1, BranchPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_ACACIA);\n\ta_OtherBlocks.emplace_back(BranchPos.x, BranchPos.y + 1, BranchPos.z, E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_ACACIA);\n\n\t// Choose if we have to add another branch\n\tbool TwoTop = (a_Noise.IntNoise3D(a_BlockPos) < 0);\n\tif (!TwoTop)\n\t{\n\t\treturn;\n\t}\n\n\t// Invert the direction of the previous branch.\n\tBranchDirection = Vector3d(-BranchDirection.x, 1, -BranchDirection.z);\n\n\t// Calculate a new height for the second branch\n\tBranchHeight = a_Noise.IntNoise3DInt(a_BlockPos * a_Seq) % 3 + 1;\n\n\tBranchPos = GetTreeBranch(E_BLOCK_NEW_LOG, E_META_NEW_LOG_ACACIA_WOOD, a_BlockPos.addedY(Height - 1), BranchHeight, BranchDirection, BranchDirection, a_LogBlocks).Floor();\n\n\t// And add the leaves ontop of the second branch\n\tPushCoordBlocks(BranchPos.x, BranchPos.y, BranchPos.z, a_OtherBlocks, BigO3, ARRAYCOUNT(BigO3), E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_ACACIA);\n\tPushCoordBlocks(BranchPos.x, BranchPos.y + 1, BranchPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_ACACIA);\n\ta_OtherBlocks.emplace_back(BranchPos.x, BranchPos.y + 1, BranchPos.z, E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_ACACIA);\n}\n\n\n\n\n\nvoid GetDarkoakTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\t// Pick a height\n\tint Height = 5 + (a_Noise.IntNoise3DInt(a_BlockPos.addedX(32 * a_Seq).addedZ(32 * a_Seq)) / 11) % 4;\n\n\t// Create the trunk\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_NEW_LOG, E_META_NEW_LOG_DARK_OAK_WOOD);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedX(1).addedY(i), E_BLOCK_NEW_LOG, E_META_NEW_LOG_DARK_OAK_WOOD);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedZ(1), E_BLOCK_NEW_LOG, E_META_NEW_LOG_DARK_OAK_WOOD);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedX(1).addedY(i).addedZ(1), E_BLOCK_NEW_LOG, E_META_NEW_LOG_DARK_OAK_WOOD);\n\t}\n\n\t// Prevent floating trees by placing dirt under them\n\tfor (int i = 1; i < 5; i++)\n\t{\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i), E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedX(1).addedY(-i), E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedZ(1), E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedX(1).addedY(-i).addedZ(1), E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t}\n\n\t// Create branches\n\tfor (int i = 0; i < 3; i++)\n\t{\n\t\tint x = (a_Noise.IntNoise3DInt(a_BlockPos.addedX(32 * a_Seq).addedZ(32 * a_Seq).addedY(i * a_Seq)) % 3) - 1;\n\t\tint z = (a_Noise.IntNoise3DInt(a_BlockPos.addedX(-32 * a_Seq).addedZ(-32 * a_Seq).addedY(i * a_Seq)) % 3) - 1;\n\n\t\t// The branches would end up in the trunk.\n\t\tif ((x >= a_BlockPos.x) && (x <= a_BlockPos.x + 1) && (z >= a_BlockPos.z) && (z <= a_BlockPos.z + 1))\n\t\t{\n\t\t\tNOISE_DATATYPE Val1 = a_Noise.IntNoise2D(x, z);\n\t\t\tif (Val1 < 0)\n\t\t\t{\n\t\t\t\tx = a_BlockPos.x + ((Val1 < -0.5) ? -1 : 3);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tz = a_BlockPos.z + ((Val1 < 0.5) ? -1 : 3);\n\t\t\t}\n\t\t}\n\n\t\tint y = Height - (a_Noise.IntNoise3DInt(a_BlockPos.addedX(x).addedZ(z).addedY(i * a_Seq)) % (Height - (Height / 4)));\n\n\t\tfor (int Y = y; Y < Height; Y++)\n\t\t{\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedX(x).addedY(Y).addedZ(z), E_BLOCK_NEW_LOG, E_META_NEW_LOG_DARK_OAK_WOOD);\n\t\t}\n\t}\n\n\tint hei = a_BlockPos.y + Height - 2;\n\n\t// The lower two leaves layers are BigO4 with log in the middle and possibly corners:\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO4, ARRAYCOUNT(BigO4), E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_DARK_OAK);\n\t\tPushCornerBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_Seq, a_Noise, 0x5fffffff, a_OtherBlocks, 3, E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_DARK_OAK);\n\t\thei++;\n\t}  // for i < 2\n\n\t// The top leaves layer is a BigO3 with leaves in the middle and possibly corners:\n\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO3, ARRAYCOUNT(BigO3), E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_DARK_OAK);\n\tPushCornerBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_Seq, a_Noise, 0x5fffffff, a_OtherBlocks, 3, E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_DARK_OAK);\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, hei, a_BlockPos.z, E_BLOCK_NEW_LEAVES, E_META_NEWLEAVES_DARK_OAK);\n}\n\n\n\n\n\nvoid GetTallBirchTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tHEIGHTTYPE Height = 9 + static_cast<HEIGHTTYPE>(a_Noise.IntNoise3DInt(a_BlockPos.addedX(64 * a_Seq)) % 3);\n\n\t// Prealloc, so that we don't realloc too often later:\n\ta_LogBlocks.reserve(static_cast<size_t>(Height));\n\ta_OtherBlocks.reserve(80);\n\n\t// The entire trunk, out of logs:\n\tfor (int i = Height - 1; i >= 0; --i)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_LOG, E_META_LOG_BIRCH);\n\t}\n\tint h = a_BlockPos.y + Height;\n\n\t// Top layer - just the Plus:\n\tPushCoordBlocks(a_BlockPos.x, h, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, h, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);  // There's no log at this layer\n\th--;\n\n\t// Second layer - log, Plus and maybe Corners:\n\tPushCoordBlocks (a_BlockPos.x, h, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\tPushCornerBlocks(a_BlockPos.x, h, a_BlockPos.z, a_Seq, a_Noise, 0x5fffffff, a_OtherBlocks, 1, E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\th--;\n\n\t// Third and fourth layers - BigO2 and maybe 2 * Corners:\n\tfor (int Row = 0; Row < 2; Row++)\n\t{\n\t\tPushCoordBlocks (a_BlockPos.x, h, a_BlockPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\t\tPushCornerBlocks(a_BlockPos.x, h, a_BlockPos.z, a_Seq, a_Noise, 0x3fffffff + Row * 0x10000000, a_OtherBlocks, 2, E_BLOCK_LEAVES, E_META_LEAVES_BIRCH);\n\t\th--;\n\t}  // for Row - 2*\n}\n\n\n\n\n\nvoid GetConiferTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large)\n{\n\t// Half chance for a spruce, half for a pine and for the large ones 3 chances for a pine and one for spruce:\n\tif (a_Noise.IntNoise3DInt(a_BlockPos.addedX(64 * a_Seq).addedZ(32 * a_Seq)) < (a_Large ? 0x20000000 : 0x40000000))\n\t{\n\t\tGetSpruceTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks, a_Large);\n\t}\n\telse\n\t{\n\t\tGetPineTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks, a_Large);\n\t}\n}\n\n\n\n\n\nvoid GetSpruceTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large)\n{\n\tif (a_Large)\n\t{\n\t\tGetLargeSpruceTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t}\n\telse\n\t{\n\t\tGetSmallSpruceTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t}\n\n}\n\n\n\n\n\nvoid GetPineTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large)\n{\n\tif (a_Large)\n\t{\n\t\tGetLargePineTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t}\n\telse\n\t{\n\t\tGetSmallPineTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t}\n\n}\n\n\n\n\n\nvoid GetSmallSpruceTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\t// Spruces have a top section with layer sizes of (0, 1, 0) or only (1, 0),\n\t// then 1 - 3 sections of ascending sizes (1, 2) [most often], (1, 3) or (1, 2, 3)\n\t// and an optional bottom section of size 1, followed by 1 - 3 clear trunk blocks\n\n\t// We'll use bits from this number as partial random numbers; but the noise function has mod8 irregularities\n\t// (each of the mod8 remainders has a very different chance of occurrence) - that's why we divide by 8\n\tint MyRandom = a_Noise.IntNoise3DInt(a_BlockPos.addedX(32 * a_Seq).addedY(32 * a_Seq)) / 8;\n\n\tstatic const HEIGHTTYPE  sHeights[] = {1, 2, 2, 3};\n\tHEIGHTTYPE Height = sHeights[MyRandom & 3];\n\tMyRandom >>= 2;\n\n\t// Prealloc, so that we don't realloc too often later:\n\ta_LogBlocks.reserve(static_cast<size_t>(Height));\n\ta_OtherBlocks.reserve(180);\n\n\t// Clear trunk blocks:\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t}\n\tHeight += static_cast<HEIGHTTYPE>(a_BlockPos.y);\n\n\t// Optional size-1 bottom leaves layer:\n\tif ((MyRandom & 1) == 0)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, Height, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.x, Height, a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\tHeight++;\n\t}\n\tMyRandom >>= 1;\n\n\t// 1 to 3 sections of leaves layers:\n\tstatic const int sNumSections[] = {1, 2, 2, 3};\n\tint NumSections = sNumSections[MyRandom & 3];\n\tMyRandom >>= 2;\n\tfor (int i = 0; i < NumSections; i++)\n\t{\n\t\tswitch (MyRandom & 3)  // SectionType; (1, 2) twice as often as the other two\n\t\t{\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\t{\n\t\t\t\tPushCoordBlocks(a_BlockPos.x, Height,     a_BlockPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\t\t\tPushCoordBlocks(a_BlockPos.x, Height + 1, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\t\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Height,     a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\t\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Height + 1, a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\t\t\tHeight += 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 2:\n\t\t\t{\n\t\t\t\tPushCoordBlocks(a_BlockPos.x, Height,     a_BlockPos.z, a_OtherBlocks, BigO3, ARRAYCOUNT(BigO3), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\t\t\tPushCoordBlocks(a_BlockPos.x, Height + 1, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\t\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Height,     a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\t\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Height + 1, a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\t\t\tHeight += 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 3:\n\t\t\t{\n\t\t\t\tPushCoordBlocks(a_BlockPos.x, Height,     a_BlockPos.z, a_OtherBlocks, BigO3, ARRAYCOUNT(BigO3), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\t\t\tPushCoordBlocks(a_BlockPos.x, Height + 1, a_BlockPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\t\t\tPushCoordBlocks(a_BlockPos.x, Height + 2, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\t\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Height,     a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\t\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Height + 1, a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\t\t\ta_LogBlocks.emplace_back(a_BlockPos.x, Height + 2, a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\t\t\tHeight += 3;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (SectionType)\n\t\tMyRandom >>= 2;\n\t}  // for i - Sections\n\n\tif ((MyRandom & 1) == 0)\n\t{\n\t\t// (0, 1, 0) top:\n\t\ta_LogBlocks.emplace_back  (a_BlockPos.x, Height,     a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\tPushCoordBlocks                  (a_BlockPos.x, Height + 1, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.x, Height + 1, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.x, Height + 2, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t}\n\telse\n\t{\n\t\t// (1, 0) top:\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.x, Height,     a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\tPushCoordBlocks                  (a_BlockPos.x, Height + 1, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.x, Height + 1, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t}\n}\n\n\n\n\n\nstatic void LargeSpruceAddRing(Vector3i a_BlockPos, int & a_Height, const sCoordsArr* const a_Ring, size_t a_RingCount, sSetBlockVector & a_OtherBlocks)\n{\n\tfor (size_t i = 0; i < a_RingCount ; i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, a_Height--, a_BlockPos.z, a_OtherBlocks, a_Ring[a_RingCount - 1 - i].Coords, a_Ring[a_RingCount - 1 - i].Count, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t}\n}\n\n\n\n\n\nconst int MIN_LARGE_SPRUCE_TREE_RINGS = 3;\nconst int MAX_LARGE_SPRUCE_TREE_RINGS = 11;\nvoid GetLargeSpruceTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tint Height = 20 + (a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(32 * a_Seq, 32 * a_Seq)) / 11) % 12;\n\tint LeavesRingCount =\n\t\tMIN_LARGE_SPRUCE_TREE_RINGS +\n\t\t(a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(32 * a_Seq, 32 * a_Seq)) / 13) % (1 + MAX_LARGE_SPRUCE_TREE_RINGS - MIN_LARGE_SPRUCE_TREE_RINGS);\n\n\tint RingRadius = 0;\n\n\ta_LogBlocks.reserve(static_cast<size_t>(Height) * 4);\n\ta_OtherBlocks.reserve(ARRAYCOUNT(BigO1Spruce) + ARRAYCOUNT(TopLargePine) +\n\t\tMAX_LARGE_SPRUCE_TREE_RINGS * (ARRAYCOUNT(BigO4Jungle) + ARRAYCOUNT(BigO3Pine) + ARRAYCOUNT(BigO2Pine)));\n\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i),               E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedX(1),     E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedZ(1),     E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(1, 1), E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t}\n\tint hei = a_BlockPos.y + Height - 1;\n\n\t// Prevent floating trees by placing dirt under them\n\tfor (int i = 1; i < 5; i++)\n\t{\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i),               E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedX(1),     E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedZ(1),     E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedXZ(1, 1), E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t}\n\n\t// Place the top.\n\tfor (size_t i = 0; i < ARRAYCOUNT(BigOSpruceTop); i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, hei++, a_BlockPos.z, a_OtherBlocks, BigOSpruceTop[i].Coords, BigOSpruceTop[i].Count, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t}\n\n\thei = a_BlockPos.y + Height - 2;\n\n\tfor (int i = 0; i < LeavesRingCount; i++)\n\t{\n\t\tunsigned int Val = static_cast<unsigned int>(a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(32 * a_Seq, 32 * i)) / 23) % 8;\n\t\tif ((Val < 4) && RingRadius < 3)\n\t\t{\n\t\t\tRingRadius++;\n\t\t}\n\t\telse if ((Val == 7) && (RingRadius > 0))\n\t\t{\n\t\t\tRingRadius--;\n\t\t}\n\n\t\tswitch (RingRadius)\n\t\t{\n\t\t\tcase 0:\n\t\t\t{\n\t\t\t\tLargeSpruceAddRing(a_BlockPos, hei, BigOSpruceLayersV1, ARRAYCOUNT(BigOSpruceLayersV1), a_OtherBlocks);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 1:\n\t\t\t{\n\t\t\t\tLargeSpruceAddRing(a_BlockPos, hei, BigOSpruceLayersV2, ARRAYCOUNT(BigOSpruceLayersV2), a_OtherBlocks);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 2:\n\t\t\t{\n\t\t\t\tLargeSpruceAddRing(a_BlockPos, hei, BigOSpruceLayersV3, ARRAYCOUNT(BigOSpruceLayersV3), a_OtherBlocks);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 3:\n\t\t\t{\n\t\t\t\tLargeSpruceAddRing(a_BlockPos, hei, BigOSpruceLayersV4, ARRAYCOUNT(BigOSpruceLayersV4), a_OtherBlocks);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (hei - a_BlockPos.y <= 2)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t}\n}\n\n\n\n\n\nvoid GetSmallPineTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\t// Tall, little leaves on top. The top leaves are arranged in a shape of two cones joined by their bases.\n\t// There can be one or two layers representing the cone bases (SameSizeMax)\n\n\tint MyRandom = a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(32 * a_Seq, 32 * a_Seq)) / 8;\n\tint TrunkHeight = 8 + (MyRandom % 3);\n\tint SameSizeMax = ((MyRandom & 8) == 0) ? 1 : 0;\n\tMyRandom >>= 3;\n\tint NumLeavesLayers = 2 + (MyRandom % 3);  // Number of layers that have leaves in them\n\tif (NumLeavesLayers == 2)\n\t{\n\t\tSameSizeMax = 0;\n\t}\n\n\t// Pre-allocate the vector:\n\ta_LogBlocks.reserve(static_cast<size_t>(TrunkHeight));\n\ta_OtherBlocks.reserve(static_cast<size_t>(NumLeavesLayers * 25));\n\n\t// The entire trunk, out of logs:\n\tfor (int i = TrunkHeight; i >= 0; --i)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t}\n\tint h = a_BlockPos.y + TrunkHeight + 2;\n\n\t// Top layer - just a single leaves block:\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, h, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\th--;\n\n\t// One more layer is above the trunk, push the central leaves:\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, h, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\n\t// Layers expanding in size, then collapsing again:\n\t// LOGD(\"Generating %d layers of pine leaves, SameSizeMax = %d\", NumLeavesLayers, SameSizeMax);\n\tfor (int i = 0; i < NumLeavesLayers; ++i)\n\t{\n\t\tint LayerSize = std::min(i, NumLeavesLayers - i + SameSizeMax - 1);\n\t\t// LOGD(\"LayerSize %d: %d\", i, LayerSize);\n\t\tif (LayerSize < 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tASSERT(static_cast<size_t>(LayerSize) < ARRAYCOUNT(BigOLayers));\n\t\tPushCoordBlocks(a_BlockPos.x, h, a_BlockPos.z, a_OtherBlocks, BigOLayers[LayerSize].Coords, BigOLayers[LayerSize].Count, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t\th--;\n\t}\n}\n\n\n\n\n\nvoid GetLargePineTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tint Height = 20 + (a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(32 * a_Seq, 32 * a_Seq)) / 11) % 12;\n\n\ta_LogBlocks.reserve(static_cast<size_t>(Height) * 4);\n\ta_OtherBlocks.reserve(ARRAYCOUNT(BigO3Pine) + ARRAYCOUNT(BigO2Pine) + ARRAYCOUNT(BigOF2Pine) + ARRAYCOUNT(TopLargePine));\n\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i),               E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedX(1),     E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedZ(1),     E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(1, 1), E_BLOCK_LOG, E_META_LOG_CONIFER);\n\t}\n\tint hei = a_BlockPos.y + Height - 2;\n\n\t// Prevent floating trees by placing dirt under them\n\tfor (int i = 1; i < 5; i++)\n\t{\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i),               E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedX(1),     E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedZ(1),     E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedXZ(1, 1), E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t}\n\n\t// Place the canopy.\n\tfor (size_t i = 0; i < ARRAYCOUNT(BigOPineLayers); i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, hei++, a_BlockPos.z, a_OtherBlocks, BigOPineLayers[i].Coords, BigOPineLayers[i].Count, E_BLOCK_LEAVES, E_META_LEAVES_CONIFER);\n\t}\n}\n\n\n\n\n\nvoid GetSwampTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\t// Vines are around the BigO3, but not in the corners; need proper meta for direction\n\tstatic const sMetaCoords Vines[] =\n\t{\n\t\t{-2, -4, 1}, {-1, -4, 1}, {0, -4, 1}, {1, -4, 1}, {2, -4, 1},  // North face\n\t\t{-2,  4, 4}, {-1,  4, 4}, {0,  4, 4}, {1,  4, 4}, {2,  4, 4},  // South face\n\t\t{4,  -2, 2}, {4,  -1, 2}, {4,  0, 2}, {4,  1, 2}, {4,  2, 2},  // East face\n\t\t{-4, -2, 8}, {-4, -1, 8}, {-4, 0, 8}, {-4, 1, 8}, {-4, 2, 8},  // West face\n\t} ;\n\n\tint Height = 3 + (a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(32 * a_Seq, 32 * a_Seq)) / 8) % 3;\n\n\ta_LogBlocks.reserve(static_cast<size_t>(Height));\n\ta_OtherBlocks.reserve(2 * ARRAYCOUNT(BigO2) + 2 * ARRAYCOUNT(BigO3) + static_cast<size_t>(Height) * ARRAYCOUNT(Vines) + 20);\n\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_LOG, E_META_LOG_APPLE);\n\t}\n\tint hei = a_BlockPos.y + Height - 2;\n\n\t// Put vines around the lowermost leaves layer:\n\tPushSomeColumns(a_BlockPos.x, hei, a_BlockPos.z, Height, a_Seq, a_Noise, 0x3fffffff, a_OtherBlocks, Vines, ARRAYCOUNT(Vines), E_BLOCK_VINES);\n\n\t// The lower two leaves layers are BigO3 with log in the middle and possibly corners:\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO3, ARRAYCOUNT(BigO3), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\tPushCornerBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_Seq, a_Noise, 0x5fffffff, a_OtherBlocks, 3, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\thei++;\n\t}  // for i - 2*\n\n\t// The upper two leaves layers are BigO2 with leaves in the middle and possibly corners:\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\tPushCornerBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_Seq, a_Noise, 0x5fffffff, a_OtherBlocks, 3, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.x, hei, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\t\thei++;\n\t}  // for i - 2*\n}\n\n\n\n\n\nvoid GetAppleBushImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\ta_OtherBlocks.reserve(3 + ARRAYCOUNT(BigO2) + ARRAYCOUNT(BigO1));\n\n\tint hei = a_BlockPos.y;\n\ta_LogBlocks.emplace_back(a_BlockPos.x, hei, a_BlockPos.z, E_BLOCK_LOG, E_META_LOG_JUNGLE);\n\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\thei++;\n\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, hei, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n\thei++;\n\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, hei, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_APPLE);\n}\n\n\n\n\n\nvoid GetJungleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large)\n{\n\tif (!a_Large)\n\t{\n\t\tGetSmallJungleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t}\n\telse\n\t{\n\t\tGetLargeJungleTreeImage(a_BlockPos, a_Noise, a_Seq, a_LogBlocks, a_OtherBlocks);\n\t}\n}\n\n\n\n\n\nvoid GetLargeJungleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tstatic const sMetaCoords VinesTrunk[] =\n\t{\n\t\t{0, -1, 1}, {1, -1, 1},  // North face\n\t\t{0,  2, 4}, {1,  2, 4},  // South face\n\t\t{-1, 1, 8}, {-1, 0, 8},  // West face\n\t\t{2,  1, 2}, {2,  0, 2},  // East face\n\t};\n\n\tint Height = 10 + ((a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(32 * a_Seq, 32 * a_Seq)) / 11) % 20);  // 10 < Height < 29\n\n\ta_LogBlocks.reserve(static_cast<size_t>(Height) * 4);\n\ta_OtherBlocks.reserve(2 * ARRAYCOUNT(BigO5Jungle) + ARRAYCOUNT(BigO4Jungle) + ARRAYCOUNT(BigO3Jungle) + static_cast<size_t>(Height) * 4 + 50);\n\n\t// Generates the main trunk\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i),               E_BLOCK_LOG, E_META_LOG_JUNGLE);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedX(1),     E_BLOCK_LOG, E_META_LOG_JUNGLE);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedZ(1),     E_BLOCK_LOG, E_META_LOG_JUNGLE);\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(1, 1), E_BLOCK_LOG, E_META_LOG_JUNGLE);\n\n\t\t// Randomly place vines around the trunk\n\t\tfor (size_t j = 0; j < ARRAYCOUNT(VinesTrunk); j++)\n\t\t{\n\t\t\tif (a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(VinesTrunk[j].x, VinesTrunk[j].z).addedY(i)) % 3 != 0)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedXZ(VinesTrunk[j].x, VinesTrunk[j].z).addedY(i), E_BLOCK_VINES, VinesTrunk[j].Meta);\n\t\t}\n\t}\n\n\t// Prevent floating trees by placing dirt under them\n\tfor (int i = 1; i < 5; i++)\n\t{\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i),               E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedX(1),     E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedZ(1),     E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t\ta_OtherBlocks.emplace_back(a_BlockPos.addedY(-i).addedXZ(1, 1), E_BLOCK_DIRT, E_META_DIRT_NORMAL);\n\t}\n\n\tint NumBranches = std::max(\n\t\t(a_Noise.IntNoise2DInt(a_BlockPos.x * a_Seq, a_BlockPos.z * a_Seq) / 10) % 4,  // The Original Calculation\n\t\tFloorC(Height / 10.0f)                                                         // Just to assure that no massive trees spawn with just one branch\n\t\t);\n\tint BranchStartHeight = 6 + Height % 5;                                            // 6 < BranchStartHeight < 10\n\tint BranchInterval = (Height - 6 - BranchStartHeight) / NumBranches;\n\tfor (int i = BranchStartHeight; i < (Height - 6); i += BranchInterval)             // Stop 6 blocks before reaching the top\n\t{\n\t\t// Get a direction for the trunk to go to.\n\t\tVector3d BranchStartDirection = pickBranchDirection(a_Noise, a_BlockPos.addedY(i), a_Seq);\n\t\tVector3d BranchDirection = pickBranchDirection(a_Noise, a_BlockPos.addedY(i * a_Seq), a_Seq) / 3;\n\t\tint BranchLength = 2 + a_Noise.IntNoise3DInt(a_BlockPos * a_Seq) % 2;\n\t\tVector3i BranchEndPosition = GetTreeBranch(E_BLOCK_LOG, E_META_LOG_JUNGLE, a_BlockPos.addedY(i), BranchLength, BranchStartDirection, BranchDirection, a_LogBlocks).Floor();\n\n\t\t// There's a chance that there is a third leaf level on a branch\n\t\tif ((a_Noise.IntNoise3DInt(a_BlockPos.x * a_Seq, a_BlockPos.y * a_Seq, a_BlockPos.z * a_Seq) % 4) == 0)  // A quarter chance\n\t\t{\n\t\t\tPushCoordBlocks(BranchEndPosition.x, BranchEndPosition.y, BranchEndPosition.z, a_OtherBlocks, BigO3, ARRAYCOUNT(BigO3), E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\t\tPushCoordBlocks(BranchEndPosition.x, BranchEndPosition.y + 1, BranchEndPosition.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\t\tPushCoordBlocks(BranchEndPosition.x, BranchEndPosition.y + 2, BranchEndPosition.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\t\ta_OtherBlocks.emplace_back(BranchEndPosition.x, BranchEndPosition.y + 2, BranchEndPosition.z, E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPushCoordBlocks(BranchEndPosition.x, BranchEndPosition.y, BranchEndPosition.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\t\tPushCoordBlocks(BranchEndPosition.x, BranchEndPosition.y + 1, BranchEndPosition.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\t\ta_OtherBlocks.emplace_back(BranchEndPosition.x, BranchEndPosition.y + 1, BranchEndPosition.z, E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\t}\n\t}\n\n\t// Place the canopy.\n\tint CanopyHeight = a_BlockPos.y + Height - 2;\n\tfor (size_t i = 0; i < ARRAYCOUNT(BigOJungleLayers); i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, CanopyHeight++, a_BlockPos.z, a_OtherBlocks, BigOJungleLayers[i].Coords, BigOJungleLayers[i].Count, E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t}\n}\n\n\n\n\n\nvoid GetSmallJungleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\t// Vines are around the BigO3, but not in the corners; need proper meta for direction\n\tstatic const sMetaCoords Vines[] =\n\t{\n\t\t{-2, -4, 1}, {-1, -4, 1}, {0, -4, 1}, {1, -4, 1}, {2, -4, 1},  // North face\n\t\t{-2,  4, 4}, {-1,  4, 4}, {0,  4, 4}, {1,  4, 4}, {2,  4, 4},  // South face\n\t\t{4,  -2, 2}, {4,  -1, 2}, {4,  0, 2}, {4,  1, 2}, {4,  2, 2},  // East face\n\t\t{-4, -2, 8}, {-4, -1, 8}, {-4, 0, 8}, {-4, 1, 8},              // West face\n\t\t// TODO: proper metas and height: {0,  1, 1},  {0, -1, 4},  {-1, 0, 2}, {1,  1, 8},  // Around the tunk\n\t} ;\n\n\tint Height = 7 + (a_Noise.IntNoise3DInt(a_BlockPos.addedXZ(5 * a_Seq, 5 * a_Seq)) / 5) % 3;\n\n\ta_LogBlocks.reserve(static_cast<size_t>(Height));\n\ta_OtherBlocks.reserve(\n\t\t2 * ARRAYCOUNT(BigO3) +       // O3 layer, 2x\n\t\t2 * ARRAYCOUNT(BigO2) +       // O2 layer, 2x\n\t\tARRAYCOUNT(BigO1) + 1 +       // Plus on the top\n\t\tstatic_cast<size_t>(Height) * ARRAYCOUNT(Vines) +  // Vines\n\t\t50  // some safety\n\t);\n\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_LOG, E_META_LOG_JUNGLE);\n\t}\n\tint hei = a_BlockPos.y + Height - 3;\n\n\t// Put vines around the lowermost leaves layer:\n\tPushSomeColumns(a_BlockPos.x, hei, a_BlockPos.z, Height, a_Seq, a_Noise, 0x3fffffff, a_OtherBlocks, Vines, ARRAYCOUNT(Vines), E_BLOCK_VINES);\n\n\t// The lower two leaves layers are BigO3 with log in the middle and possibly corners:\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO3, ARRAYCOUNT(BigO3), E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\tPushCornerBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_Seq, a_Noise, 0x5fffffff, a_OtherBlocks, 3, E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\thei++;\n\t}  // for i - 2*\n\n\t// Two layers of BigO2 leaves, possibly with corners:\n\tfor (int i = 0; i < 1; i++)\n\t{\n\t\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO2, ARRAYCOUNT(BigO2), E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\tPushCornerBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_Seq, a_Noise, 0x5fffffff, a_OtherBlocks, 2, E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\t\thei++;\n\t}  // for i - 2*\n\n\t// Top plus, all leaves:\n\tPushCoordBlocks(a_BlockPos.x, hei, a_BlockPos.z, a_OtherBlocks, BigO1, ARRAYCOUNT(BigO1), E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n\ta_OtherBlocks.emplace_back(a_BlockPos.x, hei, a_BlockPos.z, E_BLOCK_LEAVES, E_META_LEAVES_JUNGLE);\n}\n\n\n\n\n\nvoid GetRedMushroomTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tstatic constexpr int Height = 4;\n\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_STEM);\n\n\t\tif (i != 0)\n\t\t{\n\t\t\t// NORTH SIDE\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(-1, -2), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_NORTH_WEST);\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(0, -2), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_NORTH);\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(1, -2), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_NORTH_EAST);\n\t\t\t// WEST SIDE\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(-2, -1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_NORTH_WEST);\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(-2, 0), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_WEST);\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(-2, 1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_SOUTH_WEST);\n\t\t\t// SOUTH SIDE\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(-1, 2), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_SOUTH_WEST);\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(0, 2), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_SOUTH);\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(1, 2), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_SOUTH_EAST);\n\t\t\t// EAST SIDE\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(2, -1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_NORTH_EAST);\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(2, 0), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_EAST);\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i).addedXZ(2, 1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_SOUTH_EAST);\n\t\t}\n\t}\n\n\t// Top Layer\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-1, -1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_NORTH_WEST);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedX(-1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_WEST);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-1, 1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_SOUTH_WEST);\n\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedZ(-1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_NORTH);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_CENTER);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedZ(1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_SOUTH);\n\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(1, -1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_NORTH_EAST);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedX(1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_EAST);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(1, 1), E_BLOCK_HUGE_RED_MUSHROOM, E_META_MUSHROOM_SOUTH_EAST);\n}\n\n\n\n\n\nvoid GetBrownMushroomTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks)\n{\n\tstatic constexpr int Height = 4;\n\tstatic constexpr int Radius = 2;\n\tstatic constexpr int Border = 3;\n\n\tfor (int i = 0; i < Height; i++)\n\t{\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(i), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_STEM);\n\t}\n\n\tfor (int x = -Radius; x <= Radius; x++)\n\t{\n\t\tfor (int z = -Radius; z <= Radius; z++)\n\t\t{\n\t\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(x, z), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_CENTER);\n\t\t}\n\t}\n\n\tfor (int i = 0; i < Border; i++)\n\t{\n\t\t// NORTH SIDE\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-1, -3).addedX(i), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_NORTH);\n\t\t// WEST SIDE\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-3, -1).addedZ(i), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_WEST);\n\t\t// SOUTH SIDE\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-1, 3).addedX(i), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_SOUTH);\n\t\t// EAST SIDE\n\t\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(3, -1).addedZ(i), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_EAST);\n\t}\n\n\t// Corners\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(3, 2), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_SOUTH_EAST);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(2, 3), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_SOUTH_EAST);\n\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-2, 3), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_SOUTH_WEST);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-3, 2), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_SOUTH_WEST);\n\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-2, -3), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_NORTH_WEST);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(-3, -2), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_NORTH_WEST);\n\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(2, -3), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_NORTH_EAST);\n\ta_LogBlocks.emplace_back(a_BlockPos.addedY(Height).addedXZ(3, -2), E_BLOCK_HUGE_BROWN_MUSHROOM, E_META_MUSHROOM_NORTH_EAST);\n}\n"
  },
  {
    "path": "src/Generating/Trees.h",
    "content": "\n// Trees.h\n\n// Interfaces to helper functions used for generating trees\n\n/*\nNote that all of these functions must generate the same tree image for the same input (x, y, z, seq)\n\t- cStructGenTrees depends on this\nTo generate a random image for the (x, y, z) coords, pass an arbitrary value as (seq).\nEach function returns two arrays of blocks, \"logs\" and \"other\". The point is that logs are of higher priority,\nlogs can overwrite others(leaves), but others shouldn't overwrite logs. This is an optimization for the generator.\n*/\n\n\n\n\n\n#pragma once\n\n#include \"../Noise/Noise.h\"\n#include \"../ChunkDef.h\"  // For sSetBlockVector\n\n\n\n\n// Blocks that don't block tree growth:\n#define CASE_TREE_ALLOWED_BLOCKS \\\n\tcase E_BLOCK_AIR: \\\n\tcase E_BLOCK_LEAVES: \\\n\tcase E_BLOCK_NEW_LEAVES: \\\n\tcase E_BLOCK_SNOW: \\\n\tcase E_BLOCK_TALL_GRASS: \\\n\tcase E_BLOCK_DEAD_BUSH: \\\n\tcase E_BLOCK_SAPLING: \\\n\tcase E_BLOCK_VINES\n\n// Blocks that a tree may overwrite when growing:\n#define CASE_TREE_OVERWRITTEN_BLOCKS \\\n\tcase E_BLOCK_AIR: \\\n\t/* case E_BLOCK_LEAVES: LEAVES are a special case, they can be overwritten only by log. Handled in cChunkMap::ReplaceTreeBlocks(). */ \\\n\tcase E_BLOCK_SNOW: \\\n\tcase E_BLOCK_TALL_GRASS: \\\n\tcase E_BLOCK_BIG_FLOWER: \\\n\tcase E_BLOCK_DEAD_BUSH: \\\n\tcase E_BLOCK_SAPLING: \\\n\tcase E_BLOCK_VINES\n\n\n\n\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a tree at the specified coords (lowest trunk block) in the specified biome */\nvoid GetTreeImageByBiome(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, EMCSBiome a_Biome, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random apple tree */\nvoid GetAppleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a small (nonbranching) apple tree */\nvoid GetSmallAppleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a large (branching) apple tree */\nvoid GetLargeAppleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks with the logs of a tree branch of the provided log type.\nThe length of the branch can be changed with the a_BranchLength.\nThe initial direction is a_StartDirection. The direction can be manipulated with a_Direction to create a curve.\nReturns the position of the last log block placed. */\nVector3d GetTreeBranch(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_BlockPos, int a_BranchLength, Vector3d a_StartDirection, Vector3d a_Direction, sSetBlockVector & a_LogBlocks);\n\n/** Returns the meta for a log from the given direction */\nNIBBLETYPE GetLogMetaFromDirection(NIBBLETYPE a_BlockMeta, Vector3d a_Direction);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random birch tree */\nvoid GetBirchTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random acacia tree */\nvoid GetAcaciaTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random darkoak tree */\nvoid GetDarkoakTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random large birch tree */\nvoid GetTallBirchTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random conifer tree. The probability to get a large pine is higher than a spruce tree */\nvoid GetConiferTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large = false);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random spruce */\nvoid GetSpruceTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large = false);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random pine */\nvoid GetPineTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large = false);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random small spruce (short conifer, two layers of leaves) */\nvoid GetSmallSpruceTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random small pine (tall conifer, little leaves at top) */\nvoid GetSmallPineTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random large spruce (short conifer, multiple layers of leaves) */\nvoid GetLargeSpruceTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random large pine (tall conifer, little leaves at top) */\nvoid GetLargePineTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random swampland tree */\nvoid GetSwampTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random apple bush (for jungles) */\nvoid GetAppleBushImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a random jungle tree */\nvoid GetJungleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a large jungle tree (2x2 trunk) */\nvoid GetLargeJungleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks (dirt & leaves) with the blocks required to form a small jungle tree (1x1 trunk) */\nvoid GetSmallJungleTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks with the blocks required to form the red mushroom */\nvoid GetRedMushroomTreeImage(Vector3i vector3, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n\n/** Fills a_LogBlocks and a_OtherBlocks with the blocks required to form the brown mushroom */\nvoid GetBrownMushroomTreeImage(Vector3i a_BlockPos, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);\n"
  },
  {
    "path": "src/Generating/TwoHeights.cpp",
    "content": "\n// TwoHeights.cpp\n\n// Implements the cTwoHeights class representing the terrain shape generator using two switched heightmaps\n\n#include \"Globals.h\"\n#include \"TwoHeights.h\"\n#include \"../Noise/InterpolNoise.h\"\n#include \"HeiGen.h\"\n#include \"../LinearUpscale.h\"\n#include \"../IniFile.h\"\n\n\n\n\n\nclass cTwoHeights:\n\tpublic cTerrainShapeGen\n{\n\tusing Super = cTerrainShapeGen;\n\npublic:\n\n\tcTwoHeights(int a_Seed, cBiomeGen & a_BiomeGen):\n\t\tm_Seed(a_Seed),\n\t\tm_Choice(a_Seed),\n\t\tm_HeightA(a_Seed + 1, a_BiomeGen),\n\t\tm_HeightB(a_Seed + 2, a_BiomeGen)\n\t{\n\t}\n\n\n\t// cTerrainShapeGen override:\n\tvirtual void GenShape(cChunkCoords a_ChunkCoords, cChunkDesc::Shape & a_Shape) override\n\t{\n\t\t// Generate the two heightmaps:\n\t\tcChunkDef::HeightMap heightsA;\n\t\tcChunkDef::HeightMap heightsB;\n\t\tm_HeightA.GenHeightMap(a_ChunkCoords, heightsA);\n\t\tm_HeightB.GenHeightMap(a_ChunkCoords, heightsB);\n\n\t\t// Generate the choice noise:\n\t\tNOISE_DATATYPE smallChoice[33 * 5 * 5];\n\t\tNOISE_DATATYPE workspace[33 * 5 * 5];\n\t\tNOISE_DATATYPE startX = 0;\n\t\tNOISE_DATATYPE endX = 256 * m_FrequencyY;\n\t\tNOISE_DATATYPE startY =  a_ChunkCoords.m_ChunkX * cChunkDef::Width * m_FrequencyX;\n\t\tNOISE_DATATYPE endY   = (a_ChunkCoords.m_ChunkX * cChunkDef::Width + cChunkDef::Width + 1) * m_FrequencyX;\n\t\tNOISE_DATATYPE startZ =  a_ChunkCoords.m_ChunkZ * cChunkDef::Width * m_FrequencyZ;\n\t\tNOISE_DATATYPE endZ   = (a_ChunkCoords.m_ChunkZ * cChunkDef::Width + cChunkDef::Width + 1) * m_FrequencyZ;\n\t\tm_Choice.Generate3D(smallChoice, 33, 5, 5, startX, endX, startY, endY, startZ, endZ, workspace);\n\t\tNOISE_DATATYPE choice[257 * 17 * 17];\n\t\tLinearUpscale3DArray(smallChoice, 33, 5, 5, choice, 8, 4, 4);\n\n\t\t// Generate the shape:\n\t\tint idxShape = 0;\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t\t\t{\n\t\t\t\tint idxChoice = 257 * 17 * z + 257 * x;\n\t\t\t\tNOISE_DATATYPE heightA = static_cast<NOISE_DATATYPE>(cChunkDef::GetHeight(heightsA, x, z));\n\t\t\t\tNOISE_DATATYPE heightB = static_cast<NOISE_DATATYPE>(cChunkDef::GetHeight(heightsB, x, z));\n\t\t\t\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t\t\t\t{\n\t\t\t\t\tint height = static_cast<int>(ClampedLerp(heightA, heightB, choice[idxChoice++]));\n\t\t\t\t\ta_Shape[idxShape++] = (y < height) ? 1 : 0;\n\t\t\t\t}\n\t\t\t}  // for x\n\t\t}  // for z\n\t}\n\n\n\tvirtual void InitializeShapeGen(cIniFile & a_IniFile) override\n\t{\n\t\tm_FrequencyX = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"TwoHeightsFrequencyX\", 40));\n\t\tm_FrequencyY = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"TwoHeightsFrequencyY\", 40));\n\t\tm_FrequencyZ = static_cast<NOISE_DATATYPE>(a_IniFile.GetValueSetF(\"Generator\", \"TwoHeightsFrequencyZ\", 40));\n\n\t\t// Initialize the two underlying height generators from an empty INI file:\n\t\tcIniFile empty;\n\t\tm_HeightA.InitializeHeightGen(empty);\n\t\tm_HeightB.InitializeHeightGen(empty);\n\n\t\t// Add the choice octaves:\n\t\tNOISE_DATATYPE freq = 0.001f;\n\t\tNOISE_DATATYPE ampl = 1;\n\t\tfor (int i = 0; i < 4; i++)\n\t\t{\n\t\t\tm_Choice.AddOctave(freq, ampl);\n\t\t\tfreq = freq * 2;\n\t\t\tampl = ampl / 2;\n\t\t}\n\t}\n\nprotected:\n\tint m_Seed;\n\n\t/** The noise used to decide between the two heightmaps. */\n\tcOctavedNoise<cInterpolNoise<Interp5Deg>> m_Choice;\n\n\t/** The first height generator. */\n\tcHeiGenBiomal m_HeightA;\n\n\t/** The second height generator. */\n\tcHeiGenBiomal m_HeightB;\n\n\t/** The base frequencies for m_Choice in each of the world axis directions. */\n\tNOISE_DATATYPE m_FrequencyX, m_FrequencyY, m_FrequencyZ;\n};\n\n\n\n\n\nstd::unique_ptr<cTerrainShapeGen> CreateShapeGenTwoHeights(int a_Seed, cBiomeGen & a_BiomeGen)\n{\n\treturn std::make_unique<cTwoHeights>(a_Seed, a_BiomeGen);\n}\n"
  },
  {
    "path": "src/Generating/TwoHeights.h",
    "content": "\n// TwoHeights.h\n\n// Declares the function to create a new instance of the cTwoHeights terrain shape generator\n\n\n\n\n\n#pragma once\n\n#include \"ComposableGenerator.h\"\n\n\n\n\n/** Creates and returns a new instance of the cTwoHeights terrain shape generator.\nThe instance must be Initialize()-d before it is used. */\nextern std::unique_ptr<cTerrainShapeGen> CreateShapeGenTwoHeights(int a_Seed, cBiomeGen & a_BiomeGen);\n"
  },
  {
    "path": "src/Generating/VerticalLimit.cpp",
    "content": "\n// VerticalLimit.cpp\n\n#include \"Globals.h\"\n#include \"VerticalLimit.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Globals:\n\n/** Parses a string containing a range in which both values are optional (\"<MinHeight>|<MaxHeight>\") into Min, Max.\nReturns true if successful, false on failure.\nIf a_LogWarnings is true, outputs failure reasons to console.\nThe range is returned in a_Min and a_Max.\nIf no value is in the string, both values are left unchanged.\nIf only the minimum is in the string, it is assigned to both a_Min and a_Max. */\nnamespace VerticalLimit\n{\n\tstatic bool ParseRange(const AString & a_Params, int & a_Min, int & a_Max, bool a_LogWarnings)\n\t{\n\t\tauto params = StringSplitAndTrim(a_Params, \"|\");\n\t\tif (params.size() == 0)\n\t\t{\n\t\t\t// No params, generate directly on top:\n\t\t\treturn true;\n\t\t}\n\t\tif (!StringToInteger(params[0], a_Min))\n\t\t{\n\t\t\t// Failed to parse the min rel height:\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse minimum height from string \\\"%s\\\"!\", params[0].c_str());\n\t\t\treturn false;\n\t\t}\n\t\tif (params.size() == 1)\n\t\t{\n\t\t\t// Only one param was given, there's no range\n\t\t\ta_Max = a_Min;\n\t\t\treturn true;\n\t\t}\n\t\tif (!StringToInteger(params[1], a_Max))\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse maximum height from string \\\"%s\\\"!\", params[1].c_str());\n\t\t\treturn false;\n\t\t}\n\t\tif (a_Max < a_Min)\n\t\t{\n\t\t\tstd::swap(a_Max, a_Min);\n\t\t}\n\t\treturn true;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** Limit that accepts any height. The default for all pieces. */\nclass cVerticalLimitNone:\n\tpublic cPiece::cVerticalLimit\n{\npublic:\n\t\tvirtual bool CanBeAtHeight(int a_BlockX, int a_BlockZ, int a_Height) override\n\t\t{\n\t\t\t// Any height is okay\n\t\t\treturn true;\n\t\t}\n\n\n\t\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t\t{\n\t\t\t// No parameters to read, no checks being done\n\t\t\treturn true;\n\t\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** Limit that accepts heights above the specified minimum fixed height. */\nclass cVerticalLimitAbove:\n\tpublic cPiece::cVerticalLimit\n{\npublic:\n\tvirtual bool CanBeAtHeight(int a_BlockX, int a_BlockZ, int a_Height) override\n\t{\n\t\treturn (a_Height >= m_MinHeight);\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Parameters: \"<MinHeight>\", compulsory\n\t\tif (!StringToInteger(a_Params, m_MinHeight))\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse the minimum height from string \\\"%s\\\"!\", a_Params.c_str());\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\nprotected:\n\t/** The minimum accepted height. */\n\tint m_MinHeight;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** Limit that accepts heights that are a specified number of blocks above terrain. */\nclass cVerticalLimitAboveTerrain:\n\tpublic cPiece::cVerticalLimit\n{\npublic:\n\tvirtual bool CanBeAtHeight(int a_BlockX, int a_BlockZ, int a_Height) override\n\t{\n\t\tASSERT(m_TerrainHeightGen != nullptr);\n\t\tauto terrainHeight = m_TerrainHeightGen->GetHeightAt(a_BlockX, a_BlockZ);\n\t\tint compareHeight = a_Height - terrainHeight;\n\t\treturn (\n\t\t\t(compareHeight >= m_MinBlocksAbove) &&  // Above the minimum\n\t\t\t(compareHeight <= m_MaxBlocksAbove)     // and below the maximum\n\t\t);\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Parameters: \"<MinBlocksAbove>|<MaxBlocksAbove>\", both optional\n\t\tm_MinBlocksAbove = 0;\n\t\tm_MaxBlocksAbove = 0;\n\t\treturn VerticalLimit::ParseRange(a_Params, m_MinBlocksAbove, m_MaxBlocksAbove, a_LogWarnings);\n\t}\n\n\n\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_TerrainHeightGen, int a_SeaLevel) override\n\t{\n\t\tm_TerrainHeightGen = &a_TerrainHeightGen;\n\t}\n\nprotected:\n\t/** The underlying height generator. */\n\tcTerrainHeightGen * m_TerrainHeightGen;\n\n\t/** How many blocks above the terrain level do we accept on minimum. */\n\tint m_MinBlocksAbove;\n\n\t/** How many blocks above the terrain level do we accept on maximum. */\n\tint m_MaxBlocksAbove;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** Limit that accepts heights that are a specified number of blocks above terrain and sealevel, whichever is higher. */\nclass cVerticalLimitAboveTerrainAndOcean:\n\tpublic cPiece::cVerticalLimit\n{\npublic:\n\tvirtual bool CanBeAtHeight(int a_BlockX, int a_BlockZ, int a_Height) override\n\t{\n\t\tASSERT(m_TerrainHeightGen != nullptr);\n\t\tint terrainHeight = m_TerrainHeightGen->GetHeightAt(a_BlockX, a_BlockZ);\n\t\tint compareHeight = a_Height - std::max(terrainHeight, m_SeaLevel);\n\t\treturn (\n\t\t\t(compareHeight >= m_MinBlocksAbove) &&  // Above the minimum\n\t\t\t(compareHeight <= m_MaxBlocksAbove)     // and below the maximum\n\t\t);\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Parameters: \"<MinBlocksAbove>|<MaxBlocksAbove>\", both optional\n\t\tm_MinBlocksAbove = 0;\n\t\tm_MaxBlocksAbove = 0;\n\t\treturn VerticalLimit::ParseRange(a_Params, m_MinBlocksAbove, m_MaxBlocksAbove, a_LogWarnings);\n\t}\n\n\n\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_TerrainHeightGen, int a_SeaLevel) override\n\t{\n\t\tm_TerrainHeightGen = &a_TerrainHeightGen;\n\t\tm_SeaLevel = a_SeaLevel;\n\t}\n\nprotected:\n\t/** The underlying height generator. */\n\tcTerrainHeightGen * m_TerrainHeightGen;\n\n\t/** The sealevel for the current world. */\n\tint m_SeaLevel;\n\n\t/** How many blocks above the terrain level / ocean do we accept on minimum. */\n\tint m_MinBlocksAbove;\n\n\t/** How many blocks above the terrain level / ocean do we accept on maximum. */\n\tint m_MaxBlocksAbove;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** Limit that accepts heights below the specified fixed height.\nNOTE that the query height is the BOTTOM of the piece. */\nclass cVerticalLimitBelow:\n\tpublic cPiece::cVerticalLimit\n{\npublic:\n\tvirtual bool CanBeAtHeight(int a_BlockX, int a_BlockZ, int a_Height) override\n\t{\n\t\treturn (a_Height <= m_MaxHeight);\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Parameters: \"<MaxHeight>\"\n\t\tif (!StringToInteger(a_Params, m_MaxHeight))\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse the maximum height from string \\\"%s\\\"!\", a_Params.c_str());\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\nprotected:\n\t/** The maximum accepted height. */\n\tint m_MaxHeight;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** Limit that accepts heights that are within a specified range below terrain.\nNOTE that the query height is the BOTTOM of the piece. */\nclass cVerticalLimitBelowTerrain:\n\tpublic cPiece::cVerticalLimit\n{\npublic:\n\tvirtual bool CanBeAtHeight(int a_BlockX, int a_BlockZ, int a_Height) override\n\t{\n\t\tauto terrainHeight = m_TerrainHeightGen->GetHeightAt(a_BlockX, a_BlockZ);\n\t\tauto compareHeight = terrainHeight - a_Height;\n\t\treturn (\n\t\t\t(compareHeight >= m_MinBlocksBelow) &&\n\t\t\t(compareHeight <= m_MaxBlocksBelow)\n\t\t);\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Parameters: \"<MinBlocksBelow>|<MaxBlocksBelow>\", both optional\n\t\tm_MinBlocksBelow = 0;\n\t\tm_MaxBlocksBelow = 0;\n\t\treturn VerticalLimit::ParseRange(a_Params, m_MinBlocksBelow, m_MaxBlocksBelow, a_LogWarnings);\n\t}\n\n\n\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_TerrainHeightGen, int a_SeaLevel) override\n\t{\n\t\tm_TerrainHeightGen = &a_TerrainHeightGen;\n\t}\n\nprotected:\n\t/** The underlying height generator. */\n\tcTerrainHeightGen * m_TerrainHeightGen;\n\n\t/** How many blocks below the terrain level do we accept on minimum. */\n\tint m_MinBlocksBelow;\n\n\t/** How many blocks below the terrain level do we accept on maximum. */\n\tint m_MaxBlocksBelow;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** Limit that accepts heights that are a specified number of blocks below terrain or sealevel, whichever is higher. */\nclass cVerticalLimitBelowTerrainOrOcean:\n\tpublic cPiece::cVerticalLimit\n{\npublic:\n\tvirtual bool CanBeAtHeight(int a_BlockX, int a_BlockZ, int a_Height) override\n\t{\n\t\tint terrainHeight = m_TerrainHeightGen->GetHeightAt(a_BlockX, a_BlockZ);\n\t\tauto compareHeight = std::max(terrainHeight, m_SeaLevel) - a_Height;\n\t\treturn (\n\t\t\t(compareHeight >= m_MinBlocksBelow) &&\n\t\t\t(compareHeight <= m_MaxBlocksBelow)\n\t\t);\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Parameters: \"<MinBlocksBelow>|<MaxBlocksBelow>\", both optional\n\t\tm_MinBlocksBelow = 0;\n\t\tm_MaxBlocksBelow = 0;\n\t\treturn VerticalLimit::ParseRange(a_Params, m_MinBlocksBelow, m_MaxBlocksBelow, a_LogWarnings);\n\t}\n\n\n\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_TerrainHeightGen, int a_SeaLevel) override\n\t{\n\t\tm_TerrainHeightGen = &a_TerrainHeightGen;\n\t\tm_SeaLevel = a_SeaLevel;\n\t}\n\nprotected:\n\t/** The underlying height generator. */\n\tcTerrainHeightGen * m_TerrainHeightGen;\n\n\t/** The sealevel for the current world. */\n\tint m_SeaLevel;\n\n\t/** How many blocks below the terrain level do we accept on minimum. */\n\tint m_MinBlocksBelow;\n\n\t/** How many blocks below the terrain level do we accept on maximum. */\n\tint m_MaxBlocksBelow;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// CreateVerticalLimitFromString:\n\ncPiece::cVerticalLimitPtr CreateVerticalLimitFromString(const AString & a_LimitDesc, bool a_LogWarnings)\n{\n\t// Break apart the limit class, the first parameter before the first pipe char:\n\tauto idxPipe = a_LimitDesc.find('|');\n\tif (idxPipe == AString::npos)\n\t{\n\t\tidxPipe = a_LimitDesc.length();\n\t}\n\tAString LimitClass = a_LimitDesc.substr(0, idxPipe);\n\n\t// Create a strategy class based on the class string:\n\tcPiece::cVerticalLimitPtr Limit;\n\tif ((LimitClass == \"\") || (NoCaseCompare(LimitClass, \"None\") == 0))\n\t{\n\t\tLimit = std::make_shared<cVerticalLimitNone>();\n\t}\n\telse if (NoCaseCompare(LimitClass, \"Above\") == 0)\n\t{\n\t\tLimit = std::make_shared<cVerticalLimitAbove>();\n\t}\n\telse if (NoCaseCompare(LimitClass, \"AboveTerrain\") == 0)\n\t{\n\t\tLimit = std::make_shared<cVerticalLimitAboveTerrain>();\n\t}\n\telse if (NoCaseCompare(LimitClass, \"AboveTerrainAndOcean\") == 0)\n\t{\n\t\tLimit = std::make_shared<cVerticalLimitAboveTerrainAndOcean>();\n\t}\n\telse if (NoCaseCompare(LimitClass, \"Below\") == 0)\n\t{\n\t\tLimit = std::make_shared<cVerticalLimitBelow>();\n\t}\n\telse if (NoCaseCompare(LimitClass, \"BelowTerrain\") == 0)\n\t{\n\t\tLimit = std::make_shared<cVerticalLimitBelowTerrain>();\n\t}\n\telse if (NoCaseCompare(LimitClass, \"BelowTerrainOrOcean\") == 0)\n\t{\n\t\tLimit = std::make_shared<cVerticalLimitBelowTerrainOrOcean>();\n\t}\n\telse\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Initialize the limit's parameters:\n\tAString Params;\n\tif (idxPipe < a_LimitDesc.length())\n\t{\n\t\tParams = a_LimitDesc.substr(idxPipe + 1);\n\t}\n\tif (!Limit->InitializeFromString(Params, a_LogWarnings))\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn Limit;\n}\n"
  },
  {
    "path": "src/Generating/VerticalLimit.h",
    "content": "\n// VerticalLimit.h\n\n// Declares the public interface for cPiece's cVerticalLimit implementations\n\n\n\n\n\n#pragma once\n\n#include \"PiecePool.h\"\n\n\n\n\n\n/** Returns a new cPiece::cVerticalLimit descendant based on the specified description.\na_LimitDesc is in the format \"<LimitClass>|<Params>\". The params and the pipe may be omitted.\nIf an unknown class is requested or the param parsing fails, nullptr is returned.\nIf a_LogWarnings is true, any problem is reported into the server console. */\ncPiece::cVerticalLimitPtr CreateVerticalLimitFromString(const AString & a_LimitDesc, bool a_LogWarnings);\n\n\n\n\n"
  },
  {
    "path": "src/Generating/VerticalStrategy.cpp",
    "content": "\n// VerticalStrategy.cpp\n\n// Implements the various classes descending from cPiece::cVerticalStrategy\n\n#include \"Globals.h\"\n#include \"VerticalStrategy.h\"\n#include \"../Noise/Noise.h\"\n\n\n\n\n\n// Constant that is added to random seed\nstatic const int SEED_OFFSET = 135;\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Globals:\n\n/** Parses a string containing a range in which both values are optional (\"<MinHeight>|<MaxHeight>\") into Min, Range.\nReturns true if successful, false on failure.\nIf a_LogWarnings is true, outputs failure reasons to console.\nThe range is returned in a_Min and a_Range, they are left unchanged if the range value is not present in the string. */\nnamespace VerticalStrategy\n{\n\tstatic bool ParseRange(const AString & a_Params, int & a_Min, int & a_Range, bool a_LogWarnings)\n\t{\n\t\tauto params = StringSplitAndTrim(a_Params, \"|\");\n\t\tif (params.size() == 0)\n\t\t{\n\t\t\t// No params, generate directly on top:\n\t\t\treturn true;\n\t\t}\n\t\tif (!StringToInteger(params[0], a_Min))\n\t\t{\n\t\t\t// Failed to parse the min rel height:\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse minimum height from string \\\"%s\\\"!\", params[0].c_str());\n\t\t\treturn false;\n\t\t}\n\t\tif (params.size() == 1)\n\t\t{\n\t\t\t// Only one param was given, there's no range\n\t\t\treturn true;\n\t\t}\n\t\tint maxHeight = a_Min;\n\t\tif (!StringToInteger(params[1], maxHeight))\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse maximum height from string \\\"%s\\\"!\", params[1].c_str());\n\t\t\treturn false;\n\t\t}\n\t\tif (maxHeight < a_Min)\n\t\t{\n\t\t\tstd::swap(maxHeight, a_Min);\n\t\t}\n\t\ta_Range = maxHeight - a_Min + 1;\n\t\treturn true;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** A vertical strategy that places the piece at a predefined height. */\nclass cVerticalStrategyFixed:\n\tpublic cPiece::cVerticalStrategy\n{\npublic:\n\tcVerticalStrategyFixed(void):\n\t\tm_Height(-1000)  // Default to \"unassigned\" height\n\t{\n\t}\n\n\n\tvirtual int GetVerticalPlacement(int a_BlockX, int a_BlockZ) override\n\t{\n\t\treturn m_Height;\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Params: \"<Height>\", compulsory\n\t\tif (!StringToInteger(a_Params, m_Height))\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse the fixed height from string \\\"%s\\\"!\", a_Params.c_str());\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\nprotected:\n\t/** Height at which the pieces are placed.\n\tNote that this height may be outside the world, so that only a part of the piece is generated. */\n\tint m_Height;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** A vertical strategy that places the piece in a random height between two heights. */\nclass cVerticalStrategyRange:\n\tpublic cPiece::cVerticalStrategy\n{\npublic:\n\tcVerticalStrategyRange(void):\n\t\tm_Seed(0),\n\t\tm_Min(-1),  // Default to \"unassigned\" height\n\t\tm_Range(1)\n\t{\n\t}\n\n\n\tvirtual int GetVerticalPlacement(int a_BlockX, int a_BlockZ) override\n\t{\n\t\tcNoise Noise(m_Seed);\n\t\treturn m_Min + (Noise.IntNoise2DInt(a_BlockX, a_BlockZ) / 7) % m_Range;\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Params: \"<MinHeight>|<MaxHeight>\", all compulsory\n\t\tauto params = StringSplitAndTrim(a_Params, \"|\");\n\t\tif (params.size() != 2)\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse the range parameters from string \\\"%s\\\"!\", a_Params.c_str());\n\t\t\treturn false;\n\t\t}\n\t\tint Max = 0;\n\t\tif (!StringToInteger(params[0], m_Min) || !StringToInteger(params[1], Max))\n\t\t{\n\t\t\tCONDWARNING(a_LogWarnings, \"Cannot parse the minimum or maximum height from string \\\"%s\\\"!\", a_Params.c_str());\n\t\t\treturn false;\n\t\t}\n\t\tif (m_Min > Max)\n\t\t{\n\t\t\tstd::swap(m_Min, Max);\n\t\t}\n\t\tm_Range = Max - m_Min + 1;\n\t\treturn true;\n\t}\n\n\n\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_TerrainHeightGen, int a_SeaLevel) override\n\t{\n\t\tm_Seed = a_Seed + SEED_OFFSET;\n\t}\n\nprotected:\n\t/** Seed for the random generator. Received in AssignGens(). */\n\tint m_Seed;\n\n\t/** Range for the random generator. Received in InitializeFromString(). */\n\tint m_Min, m_Range;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** A vertical strategy that places the piece in a specified range relative to the top of the terrain. */\nclass cVerticalStrategyTerrainTop:\n\tpublic cPiece::cVerticalStrategy\n{\npublic:\n\n\tvirtual int GetVerticalPlacement(int a_BlockX, int a_BlockZ) override\n\t{\n\t\tASSERT(m_HeightGen != nullptr);\n\n\t\tint ChunkX, ChunkZ;\n\t\tcChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ);\n\t\tcChunkDef::HeightMap HeightMap;\n\t\tm_HeightGen->GenHeightMap({ChunkX, ChunkZ}, HeightMap);\n\t\tcNoise noise(m_Seed);\n\t\tint rel = m_MinRelHeight + (noise.IntNoise2DInt(a_BlockX, a_BlockZ) / 7) % m_RelHeightRange + 1;\n\t\treturn cChunkDef::GetHeight(HeightMap, a_BlockX - ChunkX * cChunkDef::Width, a_BlockZ - ChunkZ * cChunkDef::Width) + rel;\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Params: \"<MinRelativeHeight>|<MaxRelativeHeight>\", all optional\n\t\tm_MinRelHeight = 0;\n\t\tm_RelHeightRange = 1;\n\t\treturn VerticalStrategy::ParseRange(a_Params, m_MinRelHeight, m_RelHeightRange, a_LogWarnings);\n\t}\n\n\n\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen, int a_SeaLevel) override\n\t{\n\t\tm_Seed = a_Seed + SEED_OFFSET;\n\t\tm_HeightGen = &a_HeightGen;\n\t}\n\nprotected:\n\t/** Seed for the random generator. */\n\tint m_Seed;\n\n\t/** Height generator from which the top of the terrain is read. */\n\tcTerrainHeightGen * m_HeightGen;\n\n\t/** Minimum relative height at which the prefab is placed. */\n\tint m_MinRelHeight;\n\n\t/** Range of the relative heights at which the prefab can be placed above the minimum. */\n\tint m_RelHeightRange;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n/** A vertical strategy that places the piece within a range on top of the terrain or ocean, whichever's higher. */\nclass cVerticalStrategyTerrainOrOceanTop:\n\tpublic cPiece::cVerticalStrategy\n{\npublic:\n\n\tvirtual int GetVerticalPlacement(int a_BlockX, int a_BlockZ) override\n\t{\n\t\tASSERT(m_HeightGen != nullptr);\n\n\t\tint ChunkX, ChunkZ;\n\t\tcChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ);\n\t\tcChunkDef::HeightMap HeightMap;\n\t\tm_HeightGen->GenHeightMap({ChunkX, ChunkZ}, HeightMap);\n\t\tint terrainHeight = static_cast<int>(cChunkDef::GetHeight(HeightMap, a_BlockX - ChunkX * cChunkDef::Width, a_BlockZ - ChunkZ * cChunkDef::Width));\n\t\tterrainHeight = std::max(1 + terrainHeight, m_SeaLevel);\n\t\tcNoise noise(m_Seed);\n\t\tint rel = m_MinRelHeight + (noise.IntNoise2DInt(a_BlockX, a_BlockZ) / 7) % m_RelHeightRange + 1;\n\t\treturn terrainHeight + rel;\n\t}\n\n\n\tvirtual bool InitializeFromString(const AString & a_Params, bool a_LogWarnings) override\n\t{\n\t\t// Params: \"<MinRelativeHeight>|<MaxRelativeHeight>\", all optional\n\t\tm_MinRelHeight = 0;\n\t\tm_RelHeightRange = 1;\n\t\treturn VerticalStrategy::ParseRange(a_Params, m_MinRelHeight, m_RelHeightRange, a_LogWarnings);\n\t}\n\n\n\tvirtual void AssignGens(int a_Seed, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen, int a_SeaLevel) override\n\t{\n\t\tm_Seed = a_Seed + SEED_OFFSET;\n\t\tm_HeightGen = &a_HeightGen;\n\t\tm_SeaLevel = a_SeaLevel;\n\t}\n\nprotected:\n\t/** Seed for the random generator. */\n\tint m_Seed;\n\n\t/** Height generator from which the top of the terrain is read. */\n\tcTerrainHeightGen * m_HeightGen;\n\n\t/** The sea level used by the world. */\n\tint m_SeaLevel;\n\n\t/** Minimum relative height at which the prefab is placed. */\n\tint m_MinRelHeight;\n\n\t/** Range of the relative heights at which the prefab can be placed above the minimum. */\n\tint m_RelHeightRange;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// CreateVerticalStrategyFromString:\n\ncPiece::cVerticalStrategyPtr CreateVerticalStrategyFromString(const AString & a_StrategyDesc, bool a_LogWarnings)\n{\n\t// Break apart the strategy class, the first parameter before the first pipe char:\n\tauto idxPipe = a_StrategyDesc.find('|');\n\tif (idxPipe == AString::npos)\n\t{\n\t\tidxPipe = a_StrategyDesc.length();\n\t}\n\tAString StrategyClass = a_StrategyDesc.substr(0, idxPipe);\n\n\t// Create a strategy class based on the class string:\n\tcPiece::cVerticalStrategyPtr Strategy;\n\tif (NoCaseCompare(StrategyClass, \"Fixed\") == 0)\n\t{\n\t\tStrategy = std::make_shared<cVerticalStrategyFixed>();\n\t}\n\telse if (NoCaseCompare(StrategyClass, \"Range\") == 0)\n\t{\n\t\tStrategy = std::make_shared<cVerticalStrategyRange>();\n\t}\n\telse if (NoCaseCompare(StrategyClass, \"TerrainTop\") == 0)\n\t{\n\t\tStrategy = std::make_shared<cVerticalStrategyTerrainTop>();\n\t}\n\telse if (NoCaseCompare(StrategyClass, \"TerrainOrOceanTop\") == 0)\n\t{\n\t\tStrategy = std::make_shared<cVerticalStrategyTerrainOrOceanTop>();\n\t}\n\telse\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Initialize the strategy's parameters:\n\tAString Params;\n\tif (idxPipe < a_StrategyDesc.length())\n\t{\n\t\tParams = a_StrategyDesc.substr(idxPipe + 1);\n\t}\n\tif (!Strategy->InitializeFromString(Params, a_LogWarnings))\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn Strategy;\n}\n"
  },
  {
    "path": "src/Generating/VerticalStrategy.h",
    "content": "\n// VerticalStrategy.h\n\n// Declares the public interface for cPiece's cVerticalStrategy implementations\n\n\n\n\n\n#pragma once\n\n#include \"PiecePool.h\"\n\n\n\n\n\n/** Returns a new cPiece::cVerticalStrategy descendant based on the specified description.\na_StrategyDesc is in the format \"<StrategyClass>|<Params>\". The params and the pipe may be omitted.\nIf an unknown class is requested or the param parsing fails, nullptr is returned. */\ncPiece::cVerticalStrategyPtr CreateVerticalStrategyFromString(const AString & a_StrategyDesc, bool a_LogWarnings);\n\n\n\n\n"
  },
  {
    "path": "src/Generating/VillageGen.cpp",
    "content": "\n// VillageGen.cpp\n\n// Implements the cVillageGen class representing the village generator\n\n#include \"Globals.h\"\n#include \"VillageGen.h\"\n#include \"PieceGeneratorBFSTree.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\n/*\nHow village generating works:\nBy descending from a cGridStructGen, a semi-random (jitter) grid is generated. A village may be generated for each\nof the grid's cells. Each cell checks the biomes in an entire chunk around its center, only generating a village if\nall biomes are village-friendly. If yes, the entire village structure is built for that cell. If not, the cell\nis left village-less.\n\nA village is generated using the regular BFS piece generator. The well piece is used as the starting piece,\nthe roads and houses are then used as the following pieces. Only the houses are read from the prefabs,\nthough, the roads are generated by code and their content is ignored. A special subclass of the cPiecePool\nclass is used, so that the roads connect to each other and to the well only in predefined manners.\n\nThe well has connectors of type \"2\". The houses have connectors of type \"-1\". The roads have connectors of\nboth types' opposites, type \"-2\" at the far ends and type \"1\" on the long edges. Additionally, there are\ntype \"2\" connectors along the long edges of the roads as well, so that the roads create T junctions.\n\nWhen the village is about to be drawn into a chunk, it queries the heights for each piece intersecting the\nchunk. The pieces are shifted so that their first connector lies on the surface, and the roads are drawn\ndirectly by turning the surface blocks into gravel / sandstone.\n\nThe village prefabs are stored in global piecepools (one pool per village type). In order to support\nper-village density setting, the cVillage class itself implements the cPiecePool interface, relaying the\ncalls to the underlying cVillagePiecePool, after processing the density check.\n*/\n\nclass cVillagePiecePool:\n\tpublic cPrefabPiecePool\n{\n\tusing Super = cPrefabPiecePool;\n\npublic:\n\n\tcVillagePiecePool(\n\t\tconst cPrefab::sDef * a_PieceDefs,         size_t a_NumPieceDefs,\n\t\tconst cPrefab::sDef * a_StartingPieceDefs, size_t a_NumStartingPieceDefs\n\t):\n\t\tSuper(a_PieceDefs, a_NumPieceDefs, a_StartingPieceDefs, a_NumStartingPieceDefs)\n\t{\n\t\tAddRoadPieces();\n\t}\n\n\tcVillagePiecePool(void)\n\t{\n\t\tAddRoadPieces();\n\t}\n\n\tvoid AddRoadPieces(void)\n\t{\n\t\t// Add the road pieces:\n\t\tfor (int len = 27; len < 60; len += 12)\n\t\t{\n\t\t\tcBlockArea BA;\n\t\t\tBA.Create(len, 1, 3, cBlockArea::baTypes | cBlockArea::baMetas);\n\t\t\tBA.Fill(cBlockArea::baTypes | cBlockArea::baMetas, E_BLOCK_GRAVEL, 0);\n\t\t\tcPrefab * RoadPiece = new cPrefab(BA, 1);\n\t\t\tRoadPiece->AddConnector(0,       0, 1, cPiece::cConnector::dirXM, -2);\n\t\t\tRoadPiece->AddConnector(len - 1, 0, 1, cPiece::cConnector::dirXP, -2);\n\t\t\tRoadPiece->SetDefaultWeight(100);\n\n\t\t\t// Add the road connectors:\n\t\t\tfor (int x = 1; x < len; x += 12)\n\t\t\t{\n\t\t\t\tRoadPiece->AddConnector(x, 0, 0, cPiece::cConnector::dirZM, 2);\n\t\t\t\tRoadPiece->AddConnector(x, 0, 2, cPiece::cConnector::dirZP, 2);\n\t\t\t}\n\n\t\t\t// Add the buildings connectors:\n\t\t\tfor (int x = 7; x < len; x += 12)\n\t\t\t{\n\t\t\t\tRoadPiece->AddConnector(x, 0, 0, cPiece::cConnector::dirZM, 1);\n\t\t\t\tRoadPiece->AddConnector(x, 0, 2, cPiece::cConnector::dirZP, 1);\n\t\t\t}\n\t\t\tm_AllPieces.push_back(RoadPiece);\n\t\t\tm_PiecesByConnector[-2].push_back(RoadPiece);\n\t\t\tm_PiecesByConnector[1].push_back(RoadPiece);\n\t\t\tm_PiecesByConnector[2].push_back(RoadPiece);\n\t\t}  // for len - roads of varying length\n\t}\n\n\n\t// cPrefabPiecePool overrides:\n\tvirtual int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece) override\n\t{\n\t\t// Roads cannot branch T-wise (appending -2 connector to a +2 connector on a 1-high piece):\n\t\tif ((a_ExistingConnector.m_Type == 2) && (a_PlacedPiece.GetDepth() > 0) && (a_PlacedPiece.GetPiece().GetSize().y == 1))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn static_cast<const cPrefab &>(a_NewPiece).GetPieceWeight(a_PlacedPiece, a_ExistingConnector);\n\t}\n};\n\n\n\n\n\nclass cVillageGen::cVillage:\n\tpublic cGridStructGen::cStructure,\n\tprotected cPiecePool\n{\n\tusing Super = cGridStructGen::cStructure;\n\npublic:\n\n\tcVillage(\n\t\tint a_Seed,\n\t\tint a_GridX, int a_GridZ,\n\t\tint a_OriginX, int a_OriginZ,\n\t\tint a_MaxRoadDepth,\n\t\tint a_MaxSize,\n\t\tint a_Density,\n\t\tcVillagePiecePool & a_Prefabs,\n\t\tcTerrainHeightGen & a_HeightGen\n\t):\n\t\tSuper(a_GridX, a_GridZ, a_OriginX, a_OriginZ),\n\t\tm_Seed(a_Seed),\n\t\tm_Noise(a_Seed),\n\t\tm_MaxSize(a_MaxSize),\n\t\tm_Density(a_Density),\n\t\tm_Borders(\n\t\t\t{a_OriginX - a_MaxSize, 0, a_OriginZ - a_MaxSize},\n\t\t\t{a_OriginX + a_MaxSize, cChunkDef::Height - 1, a_OriginZ + a_MaxSize}\n\t\t),\n\t\tm_Prefabs(a_Prefabs),\n\t\tm_HeightGen(a_HeightGen)\n\t{\n\t\t// Generate the pieces for this village; don't care about the Y coord:\n\t\tcPieceGeneratorBFSTree pg(*this, a_Seed);\n\t\tpg.PlacePieces(a_OriginX, a_OriginZ, a_MaxRoadDepth + 1, m_Pieces);\n\t\tif (m_Pieces.empty())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\nprotected:\n\t/** Seed for the random functions */\n\tint m_Seed;\n\n\t/** The noise used as a pseudo-random generator */\n\tcNoise m_Noise;\n\n\t/** Maximum size, in X / Z blocks, of the village (radius from the origin) */\n\tint m_MaxSize;\n\n\t/** The density for this village. Used to refrain from populating all house connectors. Range [0, 100] */\n\tint m_Density;\n\n\t/** Borders of the village - no item may reach out of this cuboid. */\n\tcCuboid m_Borders;\n\n\t/** Prefabs to use for buildings */\n\tcVillagePiecePool & m_Prefabs;\n\n\t/** The underlying height generator, used for placing the structures on top of the terrain. */\n\tcTerrainHeightGen & m_HeightGen;\n\n\t/** The village pieces, placed by the generator. */\n\tcPlacedPieces m_Pieces;\n\n\n\t// cGridStructGen::cStructure overrides:\n\tvirtual void DrawIntoChunk(cChunkDesc & a_Chunk) override\n\t{\n\t\t// Iterate over all items\n\t\t// Each intersecting prefab is placed on ground, then drawn\n\t\t// Each intersecting road is drawn by replacing top soil blocks with gravel / sandstone blocks\n\t\tcChunkDef::HeightMap HeightMap;  // Heightmap for this chunk, used by roads\n\t\tm_HeightGen.GenHeightMap(a_Chunk.GetChunkCoords(), HeightMap);\n\t\tfor (cPlacedPieces::iterator itr = m_Pieces.begin(), end = m_Pieces.end(); itr != end; ++itr)\n\t\t{\n\t\t\tconst cPrefab & Prefab = static_cast<const cPrefab &>((*itr)->GetPiece());\n\t\t\tif ((*itr)->GetPiece().GetSize().y == 1)\n\t\t\t{\n\t\t\t\t// It's a road, special handling (change top terrain blocks to m_RoadBlock)\n\t\t\t\tDrawRoad(a_Chunk, **itr, HeightMap);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Prefab.ShouldMoveToGround() && !(*itr)->HasBeenMovedToGround())\n\t\t\t{\n\t\t\t\tPlacePieceOnGround(**itr);\n\t\t\t}\n\t\t\tPrefab.Draw(a_Chunk, itr->get());\n\t\t}  // for itr - m_PlacedPieces[]\n\t}\n\n\n\t/**  Adjusts the Y coord of the given piece so that the piece is on the ground.\n\tGround level is assumed to be represented by the first connector in the piece. */\n\tvoid PlacePieceOnGround(cPlacedPiece & a_Piece)\n\t{\n\t\tcPiece::cConnector FirstConnector = a_Piece.GetRotatedConnector(0);\n\t\tint ChunkX, ChunkZ;\n\t\tint BlockX = FirstConnector.m_Pos.x;\n\t\tint BlockZ = FirstConnector.m_Pos.z;\n\t\tint BlockY;\n\t\tcChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);\n\t\tcChunkDef::HeightMap HeightMap;\n\t\tm_HeightGen.GenHeightMap({ChunkX, ChunkZ}, HeightMap);\n\t\tint TerrainHeight = cChunkDef::GetHeight(HeightMap, BlockX, BlockZ);\n\t\ta_Piece.MoveToGroundBy(TerrainHeight - FirstConnector.m_Pos.y + 1);\n\t}\n\n\n\t/** Draws the road into the chunk.\n\tThe heightmap is not queried from the heightgen, but is given via parameter, so that it may be queried just\n\tonce for all roads in a chunk. */\n\tvoid DrawRoad(cChunkDesc & a_Chunk, cPlacedPiece & a_Road, cChunkDef::HeightMap & a_HeightMap)\n\t{\n\t\tcCuboid RoadCoords = a_Road.GetHitBox();\n\t\tRoadCoords.Sort();\n\t\tint MinX = std::max(RoadCoords.p1.x - a_Chunk.GetChunkX() * cChunkDef::Width, 0);\n\t\tint MaxX = std::min(RoadCoords.p2.x - a_Chunk.GetChunkX() * cChunkDef::Width, cChunkDef::Width - 1);\n\t\tint MinZ = std::max(RoadCoords.p1.z - a_Chunk.GetChunkZ() * cChunkDef::Width, 0);\n\t\tint MaxZ = std::min(RoadCoords.p2.z - a_Chunk.GetChunkZ() * cChunkDef::Width, cChunkDef::Width - 1);\n\t\tauto WaterRoadBlockType = m_Prefabs.GetVillageWaterRoadBlockType();\n\t\tauto WaterRoadBlockMeta = m_Prefabs.GetVillageWaterRoadBlockMeta();\n\t\tauto RoadBlockType = m_Prefabs.GetVillageRoadBlockType();\n\t\tauto RoadBlockMeta = m_Prefabs.GetVillageRoadBlockMeta();\n\t\tfor (int z = MinZ; z <= MaxZ; z++)\n\t\t{\n\t\t\tfor (int x = MinX; x <= MaxX; x++)\n\t\t\t{\n\t\t\t\tauto height = cChunkDef::GetHeight(a_HeightMap, x, z);\n\t\t\t\tif (IsBlockWater(a_Chunk.GetBlockType(x, height, z)))\n\t\t\t\t{\n\t\t\t\t\ta_Chunk.SetBlockTypeMeta(x, height, z, WaterRoadBlockType, WaterRoadBlockMeta);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta_Chunk.SetBlockTypeMeta(x, height, z, RoadBlockType, RoadBlockMeta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// cPiecePool overrides:\n\tvirtual cPieces GetPiecesWithConnector(int a_ConnectorType) override\n\t{\n\t\treturn m_Prefabs.GetPiecesWithConnector(a_ConnectorType);\n\t}\n\n\n\tvirtual cPieces GetStartingPieces(void) override\n\t{\n\t\treturn m_Prefabs.GetStartingPieces();\n\t}\n\n\n\tvirtual int GetPieceWeight(\n\t\tconst cPlacedPiece & a_PlacedPiece,\n\t\tconst cPiece::cConnector & a_ExistingConnector,\n\t\tconst cPiece & a_NewPiece\n\t) override\n\t{\n\t\t// Check against the density:\n\t\tif (a_ExistingConnector.m_Type == 1)\n\t\t{\n\t\t\tconst Vector3i & Coords = a_PlacedPiece.GetRotatedConnector(a_ExistingConnector).m_Pos;\n\t\t\tint rnd = (m_Noise.IntNoise3DInt(Coords.x, Coords.y, Coords.z) / 7) % 100;\n\t\t\tif (rnd > m_Density)\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\t// Density check passed, relay to m_Prefabs:\n\t\treturn m_Prefabs.GetPieceWeight(a_PlacedPiece, a_ExistingConnector, a_NewPiece);\n\t}\n\n\n\tvirtual int GetStartingPieceWeight(const cPiece & a_NewPiece) override\n\t{\n\t\treturn m_Prefabs.GetStartingPieceWeight(a_NewPiece);\n\t}\n\n\n\tvirtual void PiecePlaced(const cPiece & a_Piece) override\n\t{\n\t\tm_Prefabs.PiecePlaced(a_Piece);\n\t}\n\n\n\tvirtual void Reset(void) override\n\t{\n\t\tm_Prefabs.Reset();\n\t}\n\n\n\tvoid MoveAllDescendants(cPlacedPieces & a_PlacedPieces, size_t a_Pivot, int a_HeightDifference)\n\t{\n\t\tsize_t num = a_PlacedPieces.size();\n\t\tauto & Pivot = a_PlacedPieces[a_Pivot];\n\t\tfor (size_t i = a_Pivot + 1; i < num; i++)\n\t\t{\n\t\t\tif (\n\t\t\t\t(a_PlacedPieces[i]->GetParent() == Pivot.get()) &&  // It is a direct dependant of the pivot\n\t\t\t\t!(static_cast<const cPrefab &>(a_PlacedPieces[i]->GetPiece())).ShouldMoveToGround()  // It attaches strictly by connectors\n\t\t\t)\n\t\t\t{\n\t\t\t\ta_PlacedPieces[i]->MoveToGroundBy(a_HeightDifference);\n\t\t\t\tMoveAllDescendants(a_PlacedPieces, i, a_HeightDifference);\n\t\t\t}\n\t\t}  // for i - a_PlacedPieces[]\n\t}\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cVillageGen:\n\ncVillageGen::cVillageGen(\n\tint a_Seed,\n\tint a_GridSize,\n\tint a_MaxOffset,\n\tint a_MaxDepth,\n\tint a_MaxSize,\n\tint a_MinDensity,\n\tint a_MaxDensity,\n\tcBiomeGen & a_BiomeGen,\n\tcTerrainHeightGen & a_HeightGen,\n\tint a_SeaLevel,\n\tconst AStringVector & a_PrefabsToLoad\n) :\n\tSuper(a_Seed, a_GridSize, a_GridSize, a_MaxOffset, a_MaxOffset, a_MaxSize, a_MaxSize, 100),\n\tm_RandNoise(a_Seed + 1000),\n\tm_MaxDepth(a_MaxDepth),\n\tm_MaxSize(a_MaxSize),\n\tm_MinDensity(a_MinDensity),\n\tm_MaxDensity(a_MaxDensity),\n\tm_BiomeGen(a_BiomeGen),\n\tm_HeightGen(a_HeightGen)\n{\n\tfor (const auto & toLoad: a_PrefabsToLoad)\n\t{\n\t\tauto prefabs = std::make_shared<cVillagePiecePool>();\n\t\tauto fileName = fmt::format(FMT_STRING(\"Prefabs{0}Villages{0}{1}.cubeset\"), cFile::GetPathSeparator(), toLoad);\n\t\tif (prefabs->LoadFromFile(fileName, true))\n\t\t{\n\t\t\tif (NoCaseCompare(prefabs->GetIntendedUse(), \"village\") != 0)\n\t\t\t{\n\t\t\t\tLOGWARNING(\"Village generator: File %s is intended for use in \\\"%s\\\", rather than villages. Loading the file, but the generator may behave unexpectedly.\",\n\t\t\t\t\tfileName, prefabs->GetIntendedUse()\n\t\t\t\t);\n\t\t\t}\n\t\t\tprefabs->AssignGens(a_Seed, m_BiomeGen, m_HeightGen, a_SeaLevel);\n\t\t\tm_Pools.push_back(std::move(prefabs));\n\t\t}\n\t}\n}\n\n\n\n\n\ncGridStructGen::cStructurePtr cVillageGen::CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ)\n{\n\t// Generate the biomes for the chunk surrounding the origin:\n\tint ChunkX, ChunkZ;\n\tcChunkDef::BlockToChunk(a_OriginX, a_OriginZ, ChunkX, ChunkZ);\n\tcChunkDef::BiomeMap Biomes;\n\tm_BiomeGen.GenBiomes({ChunkX, ChunkZ}, Biomes);\n\n\t// Get a list of pools that support each biome within the chunk:\n\t// If just one column's biome is not allowed, the pool is not used because it's likely that an unfriendly biome is too close\n\tauto availablePools = m_Pools;\n\tfor (size_t i = 0; i < ARRAYCOUNT(Biomes); i++)\n\t{\n\t\tauto biome = Biomes[i];\n\t\tavailablePools.erase(std::remove_if(availablePools.begin(), availablePools.end(),\n\t\t\t[biome](std::shared_ptr<cVillagePiecePool> & a_Pool)\n\t\t\t{\n\t\t\t\treturn !a_Pool->IsBiomeAllowed(biome);\n\t\t\t}),\n\t\t\tavailablePools.end()\n\t\t);\n\t\t// Bail out if no compatible pools left:\n\t\tif (availablePools.empty())\n\t\t{\n\t\t\treturn cStructurePtr();\n\t\t}\n\t}\n\n\t// Pick one pool from the available pools:\n\tif (availablePools.empty())\n\t{\n\t\treturn cStructurePtr();\n\t}\n\tauto rnd = m_RandNoise.IntNoise2DInt(a_OriginX, a_OriginZ) / 11;\n\tauto pool = availablePools[static_cast<size_t>(rnd) % availablePools.size()];\n\trnd /= 137;\n\n\t// Choose density for the village, random between m_MinDensity and m_MaxDensity:\n\tint Density;\n\tif (pool->GetMaxDensity() > pool->GetMinDensity())\n\t{\n\t\tDensity = pool->GetMinDensity() + rnd % (pool->GetMaxDensity() - pool->GetMinDensity());\n\t}\n\telse\n\t{\n\t\tDensity = pool->GetMinDensity();\n\t}\n\n\t// Create a village based on the chosen prefabs:\n\treturn cStructurePtr(new cVillage(m_Seed, a_GridX, a_GridZ, a_OriginX, a_OriginZ, m_MaxDepth, m_MaxSize, Density, *pool.get(), m_HeightGen));\n}\n"
  },
  {
    "path": "src/Generating/VillageGen.h",
    "content": "\n// VillageGen.h\n\n// Declares the cVillageGen class representing the village generator\n\n\n\n\n\n#pragma once\n\n#include \"GridStructGen.h\"\n#include \"PrefabPiecePool.h\"\n\n\n\n\n\n// fwd:\nclass cVillagePiecePool;\n\n\n\n\n\nclass cVillageGen:\n\tpublic cGridStructGen\n{\n\tusing Super = cGridStructGen;\n\npublic:\n\n\t/** Creates a new instance of the generator with the specified parameters. */\n\tcVillageGen(\n\t\tint a_Seed,\n\t\tint a_GridSize,\n\t\tint a_MaxOffset,\n\t\tint a_MaxDepth,\n\t\tint a_MaxSize,\n\t\tint a_MinDensity, int a_MaxDensity,\n\t\tcBiomeGen & a_BiomeGen,\n\t\tcTerrainHeightGen & a_HeightGen,\n\t\tint a_SeaLevel,\n\t\tconst AStringVector & a_PrefabsToLoad\n\t);\n\nprotected:\n\tclass cVillage;  // fwd: VillageGen.cpp\n\ttypedef std::vector<std::shared_ptr<cVillagePiecePool>> cVillagePiecePools;\n\n\t/** The noise used for generating random numbers */\n\tcNoise m_RandNoise;\n\n\t/** Maximum depth of the generator tree */\n\tint m_MaxDepth;\n\n\t/** Maximum size, in X / Z blocks, of the village (radius from the origin) */\n\tint m_MaxSize;\n\n\t/** Minimum density - percentage of allowed house connections. Range [0, 100] */\n\tint m_MinDensity;\n\n\t/** Maximum density - percentage of allowed house connections. Range [0, 100] */\n\tint m_MaxDensity;\n\n\t/** The underlying biome generator that defines whether the village is created or not */\n\tcBiomeGen & m_BiomeGen;\n\n\t/** The underlying height generator, used to position the prefabs crossing chunk borders */\n\tcTerrainHeightGen & m_HeightGen;\n\n\t/** All available prefab sets. Each village gets one of these chosen randomly. */\n\tcVillagePiecePools m_Pools;\n\n\n\t// cGridStructGen overrides:\n\tvirtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override;\n} ;\n"
  },
  {
    "path": "src/Globals.cpp",
    "content": "\n// Globals.cpp\n\n// This file is used for precompiled header generation in MSVC environments\n\n#include \"Globals.h\"\n\n\n\n\n"
  },
  {
    "path": "src/Globals.h",
    "content": "\n// Globals.h\n\n// This file gets included from every module in the project, so that global symbols may be introduced easily\n// Also used for precompiled header generation in MSVC environments\n\n\n\n\n\n#pragma once\n\n\n\n\n\n// Compiler-dependent stuff:\n#if defined(_MSC_VER)\n\t// Use non-standard defines in <cmath>\n\t#define _USE_MATH_DEFINES\n\n\t#ifndef NDEBUG\n\t\t// Override the \"new\" operator to include file and line specification for debugging memory leaks\n\t\t// Ref.: https://social.msdn.microsoft.com/Forums/en-US/ebc7dd7a-f3c6-49f1-8a60-e381052f21b6/debugging-memory-leaks?forum=vcgeneral#53f0cc89-62fe-45e8-bbf0-56b89f2a1901\n\t\t// This causes MSVC Debug runs to produce a report upon program exit, that contains memory-leaks\n\t\t// together with the file:line information about where the memory was allocated.\n\t\t// Note that this doesn't work with placement-new, which needs to temporarily #undef the macro\n\t\t// (See AllocationPool.h for an example).\n\t\t#define _CRTDBG_MAP_ALLOC\n\t\t#include <stdlib.h>\n\t\t#include <crtdbg.h>\n\t\t#define DEBUG_CLIENTBLOCK   new(_CLIENT_BLOCK, __FILE__, __LINE__)\n\t\t#define new DEBUG_CLIENTBLOCK\n\t\t// For some reason this works magically - each \"new X\" gets replaced as \"new(_CLIENT_BLOCK, \"file\", line) X\"\n\t\t// The CRT has a definition for this operator new that stores the debugging info for leak-finding later.\n\t#endif\n\n\t#define UNREACHABLE_INTRINSIC __assume(false)\n\n#elif defined(__GNUC__)\n\n\t// TODO: Can GCC explicitly mark classes as abstract (no instances can be created)?\n\t#define abstract\n\n\t#define UNREACHABLE_INTRINSIC __builtin_unreachable()\n\n#else\n\n\t#error \"You are using an unsupported compiler, you might need to #define some stuff here for your compiler\"\n\n#endif\n\n\n\n\n\n// A macro to disallow the copy constructor and operator = functions\n// This should be used in the declarations for any class that shouldn't allow copying itself\n#define DISALLOW_COPY_AND_ASSIGN(TypeName) \\\n\tTypeName(const TypeName &) = delete; \\\n\tTypeName & operator =(const TypeName &) = delete\n\n// A macro that is used to mark unused local variables, to avoid pedantic warnings in gcc / clang / MSVC\n// Note that in MSVC it requires the full type of X to be known\n#define UNUSED_VAR(X) (void)(X)\n\n// A macro that is used to mark unused function parameters, to avoid pedantic warnings in gcc\n// Written so that the full type of param needn't be known\n#ifdef _MSC_VER\n\t#define UNUSED(X)\n#else\n\t#define UNUSED UNUSED_VAR\n#endif\n\n\n\n\n\n// OS-dependent stuff:\n#ifdef _WIN32\n\t#define NOMINMAX  // Windows SDK defines min and max macros, messing up with our std::min and std::max usage.\n\t#define WIN32_LEAN_AND_MEAN\n\t#define _WIN32_WINNT 0x0501  // We want to target Windows XP with Service Pack 2 & Windows Server 2003 with Service Pack 1 and higher.\n\n\t// Use CryptoAPI primitives when targeting a version that supports encrypting with AES-CFB8 smaller than a full block at a time.\n\t#define PLATFORM_CRYPTOGRAPHY (_WIN32_WINNT >= 0x0602)\n\n\t#include <Windows.h>\n\t#include <winsock2.h>\n\t#include <Ws2tcpip.h>  // IPv6 stuff\n\n\t// Windows SDK defines GetFreeSpace as a constant, probably a Win16 API remnant:\n\t#ifdef GetFreeSpace\n\t\t#undef GetFreeSpace\n\t#endif  // GetFreeSpace\n#else\n\t#define PLATFORM_CRYPTOGRAPHY 0\n\n\t#include <arpa/inet.h>\n\t#include <netinet/in.h>\n\t#include <netinet/tcp.h>\n\t#include <sys/socket.h>\n\t#include <unistd.h>\n#endif\n\n\n\n\n\n// CRT stuff:\n#include <cassert>\n#include <cstdio>\n#include <cmath>\n#include <cstdarg>\n#include <cstddef>\n\n\n\n\n\n// STL stuff:\n#include <algorithm>\n#include <array>\n#include <atomic>\n#include <chrono>\n#include <condition_variable>\n#include <deque>\n#include <fstream>\n#include <limits>\n#include <list>\n#include <map>\n#include <memory>\n#include <mutex>\n#include <queue>\n#include <random>\n#include <set>\n#include <string>\n#include <thread>\n#include <type_traits>\n#include <unordered_map>\n#include <unordered_set>\n#include <utility>\n#include <vector>\n#include <variant>\n\n\n\n\n\n// Integral types with predefined sizes:\ntypedef signed long long Int64;\ntypedef signed int       Int32;\ntypedef signed short     Int16;\ntypedef signed char      Int8;\n\ntypedef unsigned long long UInt64;\ntypedef unsigned int       UInt32;\ntypedef unsigned short     UInt16;\ntypedef unsigned char      UInt8;\n\ntypedef unsigned char Byte;\ntypedef Byte ColourID;\n\n\ntemplate <typename T, size_t Size>\nclass SizeChecker\n{\n\tstatic_assert(sizeof(T) == Size, \"Check the size of integral types\");\n};\n\ntemplate class SizeChecker<Int64, 8>;\ntemplate class SizeChecker<Int32, 4>;\ntemplate class SizeChecker<Int16, 2>;\ntemplate class SizeChecker<Int8, 1>;\n\ntemplate class SizeChecker<UInt64, 8>;\ntemplate class SizeChecker<UInt32, 4>;\ntemplate class SizeChecker<UInt16, 2>;\ntemplate class SizeChecker<UInt8, 1>;\n\n// Common headers (part 1, without macros):\n#include \"fmt.h\"\n#include \"StringUtils.h\"\n#include \"LoggerSimple.h\"\n#include \"OSSupport/CriticalSection.h\"\n#include \"OSSupport/Event.h\"\n#include \"OSSupport/File.h\"\n#include \"OSSupport/StackTrace.h\"\n\n#ifdef TEST_GLOBALS\n\n\t// Basic logging function implementations\n\tnamespace Logger\n\t{\n\n\tinline void LogFormat(\n\t\tstd::string_view a_Format, eLogLevel, fmt::format_args a_ArgList\n\t)\n\t{\n\t\tfmt::vprint(a_Format, a_ArgList);\n\t\tputchar('\\n');\n\t\tfflush(stdout);\n\t}\n\n\tinline void LogPrintf(\n\t\tstd::string_view a_Format, eLogLevel, fmt::printf_args a_ArgList\n\t)\n\t{\n\t\tfmt::vprintf(a_Format, a_ArgList);\n\t\tputchar('\\n');\n\t\tfflush(stdout);\n\t}\n\n\tinline void LogSimple(std::string_view a_Message, eLogLevel)\n\t{\n\t\tfmt::print(\"{}\\n\", a_Message);\n\t\tfflush(stdout);\n\t}\n\n\t}  // namespace Logger\n\n#endif\n\n\n\n\n\n// Common definitions:\n\n/** Evaluates to the number of elements in an array (compile-time!) */\n#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))\n\n/** Allows arithmetic expressions like \"32 KiB\" (but consider using parenthesis around it, \"(32 KiB)\") */\n#define KiB * 1024\n#define MiB * 1024 * 1024\n\n/** Faster than (int)floorf((float)x / (float)div) */\n#define FAST_FLOOR_DIV(x, div) (((x) - (((x) < 0) ? ((div) - 1) : 0)) / (div))\n\n// Own version of ASSERT() that plays nicely with the testing framework\n#ifdef TEST_GLOBALS\n\n\tclass cAssertFailure\n\t{\n\t\tAString mExpression;\n\t\tAString mFileName;\n\t\tint mLineNumber;\n\n\tpublic:\n\t\tcAssertFailure(const AString & aExpression, const AString & aFileName, int aLineNumber):\n\t\t\tmExpression(aExpression),\n\t\t\tmFileName(aFileName),\n\t\t\tmLineNumber(aLineNumber)\n\t\t{\n\t\t}\n\n\t\tconst AString & expression() const { return mExpression; }\n\t\tconst AString & fileName() const { return mFileName; }\n\t\tint lineNumber() const { return mLineNumber; }\n\t};\n\n\t#ifdef NDEBUG\n\t\t#define ASSERT(x)\n\t#else\n\t\t#define ASSERT(x) do { if (!(x)) { throw cAssertFailure(#x, __FILE__, __LINE__);} } while (0)\n\t#endif\n\n\t// Pretty much the same as ASSERT() but stays in Release builds\n\t#define VERIFY(x) (!!(x) || ( LOGERROR(\"Verification failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), std::abort(), 0))\n\n#else  // TEST_GLOBALS\n\n\t#ifdef NDEBUG\n\t\t#define ASSERT(x)\n\t#else\n\t\t#define ASSERT(x) ( !!(x) || ( LOGERROR(\"Assertion failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), std::abort(), 0))\n\t#endif\n\n\t// Pretty much the same as ASSERT() but stays in Release builds\n\t#define VERIFY(x) (!!(x) || ( LOGERROR(\"Verification failed: %s, file %s, line %i\", #x, __FILE__, __LINE__), std::abort(), 0))\n\n#endif  // else TEST_GLOBALS\n\n// Use to mark code that should be impossible to reach.\n#ifdef NDEBUG\n\t#define UNREACHABLE(x) UNREACHABLE_INTRINSIC\n#else\n\t#define UNREACHABLE(x) ( FLOGERROR(\"Hit unreachable code: {0}, file {1}, line {2}\", #x, __FILE__, __LINE__), std::abort(), 0)\n#endif\n\n\n\n\n\nnamespace cpp20\n{\n\ttemplate <class T>\n\tstd::enable_if_t<std::is_array_v<T> && (std::extent_v<T> == 0), std::unique_ptr<T>> make_unique_for_overwrite(std::size_t a_Size)\n\t{\n\t\treturn std::unique_ptr<T>(new std::remove_extent_t<T>[a_Size]);\n\t}\n\n\ttemplate <class T>\n\tstd::enable_if_t<!std::is_array_v<T>, std::unique_ptr<T>> make_unique_for_overwrite()\n\t{\n\t\treturn std::unique_ptr<T>(new T);\n\t}\n}\n\n\n\n\n\n/**\nYou can use this struct to use in std::visit\nexample:\nstd::visit(\n\tOverloadedVariantAccess\n\t{\n\t\t[&] (cFirstType  & a_FirstTypeObject)  {  // Your code to handle cFirstType },\n\t\t[&] (cSecondType & a_SecondTypeObject) {  // YourCode to handle cSecondType },\n\t\t...\n\t}\n, YourVariant);\nYou can use constant references if you want to.\n*/\ntemplate<class... Ts> struct OverloadedVariantAccess : Ts... { using Ts::operator()...; };\ntemplate<class... Ts> OverloadedVariantAccess(Ts...)->OverloadedVariantAccess<Ts...>;\n\n\n\n\n\n/** Clamp X to the specified range. */\ntemplate <typename T>\nT Clamp(T a_Value, T a_Min, T a_Max)\n{\n\treturn (a_Value < a_Min) ? a_Min : ((a_Value > a_Max) ? a_Max : a_Value);\n}\n\n\n\n\n\n/** Floors a value, then casts it to C (an int by default). */\ntemplate <typename C = int, typename T>\ntypename std::enable_if<std::is_arithmetic<T>::value, C>::type FloorC(T a_Value)\n{\n\treturn static_cast<C>(std::floor(a_Value));\n}\n\n/** Ceils a value, then casts it to C (an int by default). */\ntemplate <typename C = int, typename T>\ntypename std::enable_if<std::is_arithmetic<T>::value, C>::type CeilC(T a_Value)\n{\n\treturn static_cast<C>(std::ceil(a_Value));\n}\n\n\n\n\n\n// A time duration representing a Minecraft tick (50 ms), capable of storing at least 32'767 ticks.\nusing cTickTime = std::chrono::duration<signed int, std::ratio_multiply<std::chrono::milliseconds::period, std::ratio<50>>>;\n\n// A time duration representing a Minecraft tick (50 ms), capable of storing at least a 64 bit signed duration.\nusing cTickTimeLong = std::chrono::duration<signed long long int, cTickTime::period>;\n\n/** Converts a literal to a tick time. */\nconstexpr cTickTimeLong operator \"\"_tick(const unsigned long long a_Ticks)\n{\n\treturn cTickTimeLong(a_Ticks);\n}\n\nusing ContiguousByteBuffer = std::basic_string<std::byte>;\nusing ContiguousByteBufferView = std::basic_string_view<std::byte>;\n\n#ifndef TOLUA_TEMPLATE_BIND\n\t#define TOLUA_TEMPLATE_BIND(x)\n#endif\n\n#ifdef TOLUA_EXPOSITION\n\t#error TOLUA_EXPOSITION should never actually be defined\n#endif\n\ntemplate <typename T>\nauto ToUnsigned(T a_Val)\n{\n\tASSERT(a_Val >= 0);\n\treturn static_cast<std::make_unsigned_t<T>>(a_Val);\n}\n\n// https://stackoverflow.com/questions/1666802/is-there-a-class-macro-in-c\nconstexpr std::string_view methodName(std::string_view a_PrettyFunction)\n{\n\tsize_t Bracket = a_PrettyFunction.rfind(\"(\");\n\tsize_t Space = a_PrettyFunction.rfind(\" \", Bracket) + 1;\n\n\treturn a_PrettyFunction.substr(Space, Bracket - Space);\n}\n\n// https://stackoverflow.com/questions/48857887/pretty-function-in-visual-c\n#if !defined(__PRETTY_FUNCTION__) && !defined(__GNUC__)\n#define __PRETTY_FUNCTION__ __FUNCSIG__\n#endif\n\n#define __METHOD_NAME__ methodName(__PRETTY_FUNCTION__)\n\n// Common headers (part 2, with macros):\n#include \"Vector3.h\"\n"
  },
  {
    "path": "src/HTTP/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tEnvelopeParser.cpp\n\tHTTPFormParser.cpp\n\tHTTPMessage.cpp\n\tHTTPMessageParser.cpp\n\tHTTPServer.cpp\n\tHTTPServerConnection.cpp\n\tMultipartParser.cpp\n\tNameValueParser.cpp\n\tSslHTTPServerConnection.cpp\n\tTransferEncodingParser.cpp\n\tUrlClient.cpp\n\tUrlParser.cpp\n\n\tEnvelopeParser.h\n\tHTTPFormParser.h\n\tHTTPMessage.h\n\tHTTPMessageParser.h\n\tHTTPServer.h\n\tHTTPServerConnection.h\n\tMultipartParser.h\n\tNameValueParser.h\n\tSslHTTPServerConnection.h\n\tTransferEncodingParser.h\n\tUrlClient.h\n\tUrlParser.h\n)\n"
  },
  {
    "path": "src/HTTP/EnvelopeParser.cpp",
    "content": "\n// EnvelopeParser.cpp\n\n// Implements the cEnvelopeParser class representing a parser for RFC-822 envelope headers, used both in HTTP and in MIME\n\n#include \"Globals.h\"\n#include \"EnvelopeParser.h\"\n\n\n\n\n\ncEnvelopeParser::cEnvelopeParser(cCallbacks & a_Callbacks) :\n\tm_Callbacks(a_Callbacks),\n\tm_IsInHeaders(true)\n{\n}\n\n\n\n\n\nsize_t cEnvelopeParser::Parse(const char * a_Data, size_t a_Size)\n{\n\tif (!m_IsInHeaders)\n\t{\n\t\treturn 0;\n\t}\n\n\t// Start searching 1 char from the end of the already received data, if available:\n\tauto searchStart = m_IncomingData.size();\n\tsearchStart = (searchStart > 1) ? searchStart - 1 : 0;\n\n\tm_IncomingData.append(a_Data, a_Size);\n\n\tsize_t idxCRLF = m_IncomingData.find(\"\\r\\n\", searchStart);\n\tif (idxCRLF == AString::npos)\n\t{\n\t\t// Not a complete line yet, all input consumed:\n\t\treturn a_Size;\n\t}\n\n\t// Parse as many lines as found:\n\tsize_t Last = 0;\n\tdo\n\t{\n\t\tif (idxCRLF == Last)\n\t\t{\n\t\t\t// This was the last line of the data. Finish whatever value has been cached and return:\n\t\t\tNotifyLast();\n\t\t\tm_IsInHeaders = false;\n\t\t\treturn a_Size - (m_IncomingData.size() - idxCRLF) + 2;\n\t\t}\n\t\tif (!ParseLine(m_IncomingData.c_str() + Last, idxCRLF - Last))\n\t\t{\n\t\t\t// An error has occurred\n\t\t\tm_IsInHeaders = false;\n\t\t\treturn AString::npos;\n\t\t}\n\t\tLast = idxCRLF + 2;\n\t\tidxCRLF = m_IncomingData.find(\"\\r\\n\", idxCRLF + 2);\n\t} while (idxCRLF != AString::npos);\n\tm_IncomingData.erase(0, Last);\n\n\t// Parsed all lines and still expecting more\n\treturn a_Size;\n}\n\n\n\n\n\nvoid cEnvelopeParser::Reset(void)\n{\n\tm_IsInHeaders = true;\n\tm_IncomingData.clear();\n\tm_LastKey.clear();\n\tm_LastValue.clear();\n}\n\n\n\n\n\nvoid cEnvelopeParser::NotifyLast(void)\n{\n\tif (!m_LastKey.empty())\n\t{\n\t\tm_Callbacks.OnHeaderLine(m_LastKey, m_LastValue);\n\t\tm_LastKey.clear();\n\t}\n\tm_LastValue.clear();\n}\n\n\n\n\n\nbool cEnvelopeParser::ParseLine(const char * a_Data, size_t a_Size)\n{\n\tASSERT(a_Size > 0);\n\tif (a_Data[0] <= ' ')\n\t{\n\t\t// This line is a continuation for the previous line\n\t\tif (m_LastKey.empty())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\t// Append, including the whitespace in a_Data[0]\n\t\tm_LastValue.append(a_Data, a_Size);\n\t\treturn true;\n\t}\n\n\t// This is a line with a new key:\n\tNotifyLast();\n\tfor (size_t i = 0; i < a_Size; i++)\n\t{\n\t\tif (a_Data[i] == ':')\n\t\t{\n\t\t\tm_LastKey.assign(a_Data, i);\n\t\t\tif (a_Size > i + 1)\n\t\t\t{\n\t\t\t\tm_LastValue.assign(a_Data + i + 2, a_Size - i - 2);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_LastValue.clear();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}  // for i - a_Data[]\n\n\t// No colon was found, key-less header??\n\treturn false;\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/EnvelopeParser.h",
    "content": "\n// EnvelopeParser.h\n\n// Declares the cEnvelopeParser class representing a parser for RFC-822 envelope headers, used both in HTTP and in MIME\n\n\n\n\n\n#pragma once\n\n\n\n\n\nclass cEnvelopeParser\n{\npublic:\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when a full header line is parsed */\n\t\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) = 0;\n\t} ;\n\n\n\tcEnvelopeParser(cCallbacks & a_Callbacks);\n\n\t/** Parses the incoming data.\n\tReturns the number of bytes consumed from the input. The bytes not consumed are not part of the envelope header.\n\tReturns AString::npos on error\n\t*/\n\tsize_t Parse(const char * a_Data, size_t a_Size);\n\n\t/** Makes the parser forget everything parsed so far, so that it can be reused for parsing another datastream */\n\tvoid Reset(void);\n\n\t/** Returns true if more input is expected for the envelope header */\n\tbool IsInHeaders(void) const { return m_IsInHeaders; }\n\n\t/** Sets the IsInHeaders flag; used by cMultipartParser to simplify the parser initial conditions */\n\tvoid SetIsInHeaders(bool a_IsInHeaders) { m_IsInHeaders = a_IsInHeaders; }\n\npublic:\n\t/** Callbacks to call for the various events */\n\tcCallbacks & m_Callbacks;\n\n\t/** Set to true while the parser is still parsing the envelope headers. Once set to true, the parser will not consume any more data. */\n\tbool m_IsInHeaders;\n\n\t/** Buffer for the incoming data until it is parsed */\n\tAString m_IncomingData;\n\n\t/** Holds the last parsed key; used for line-wrapped values */\n\tAString m_LastKey;\n\n\t/** Holds the last parsed value; used for line-wrapped values */\n\tAString m_LastValue;\n\n\n\t/** Notifies the callback of the key / value stored in m_LastKey / m_LastValue, then erases them */\n\tvoid NotifyLast(void);\n\n\t/** Parses one line of header data. Returns true if successful */\n\tbool ParseLine(const char * a_Data, size_t a_Size);\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/HTTPFormParser.cpp",
    "content": "\n// HTTPFormParser.cpp\n\n// Implements the cHTTPFormParser class representing a parser for forms sent over HTTP\n\n#include \"Globals.h\"\n#include \"HTTPFormParser.h\"\n#include \"HTTPMessage.h\"\n#include \"NameValueParser.h\"\n\n\n\n\n\ncHTTPFormParser::cHTTPFormParser(const cHTTPIncomingRequest & a_Request, cCallbacks & a_Callbacks) :\n\tm_Callbacks(a_Callbacks),\n\tm_IsValid(true),\n\tm_IsCurrentPartFile(false),\n\tm_FileHasBeenAnnounced(false)\n{\n\tif (a_Request.GetMethod() == \"GET\")\n\t{\n\t\tm_Kind = fpkURL;\n\n\t\t// Directly parse the URL in the request:\n\t\tconst AString & URL = a_Request.GetURL();\n\t\tsize_t idxQM = URL.find('?');\n\t\tif (idxQM != AString::npos)\n\t\t{\n\t\t\tParse(URL.c_str() + idxQM + 1, URL.size() - idxQM - 1);\n\t\t}\n\t\treturn;\n\t}\n\tif ((a_Request.GetMethod() == \"POST\") || (a_Request.GetMethod() == \"PUT\"))\n\t{\n\t\tif (strncmp(a_Request.GetContentType().c_str(), \"application/x-www-form-urlencoded\", 33) == 0)\n\t\t{\n\t\t\tm_Kind = fpkFormUrlEncoded;\n\t\t\treturn;\n\t\t}\n\t\tif (strncmp(a_Request.GetContentType().c_str(), \"multipart/form-data\", 19) == 0)\n\t\t{\n\t\t\tm_Kind = fpkMultipart;\n\t\t\tBeginMultipart(a_Request);\n\t\t\treturn;\n\t\t}\n\t}\n\t// Invalid method / content type combination, this is not a HTTP form\n\tm_IsValid = false;\n}\n\n\n\n\n\ncHTTPFormParser::cHTTPFormParser(eKind a_Kind, const char * a_Data, size_t a_Size, cCallbacks & a_Callbacks) :\n\tm_Callbacks(a_Callbacks),\n\tm_Kind(a_Kind),\n\tm_IsValid(true),\n\tm_IsCurrentPartFile(false),\n\tm_FileHasBeenAnnounced(false)\n{\n\tParse(a_Data, a_Size);\n}\n\n\n\n\n\nvoid cHTTPFormParser::Parse(const char * a_Data, size_t a_Size)\n{\n\tif (!m_IsValid)\n\t{\n\t\treturn;\n\t}\n\n\tswitch (m_Kind)\n\t{\n\t\tcase fpkURL:\n\t\tcase fpkFormUrlEncoded:\n\t\t{\n\t\t\t// This format is used for smaller forms (not file uploads), so we can delay parsing it until Finish()\n\t\t\tm_IncomingData.append(a_Data, a_Size);\n\t\t\tbreak;\n\t\t}\n\t\tcase fpkMultipart:\n\t\t{\n\t\t\tASSERT(m_MultipartParser.get() != nullptr);\n\t\t\tm_MultipartParser->Parse(a_Data, a_Size);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cHTTPFormParser::Finish(void)\n{\n\tswitch (m_Kind)\n\t{\n\t\tcase fpkURL:\n\t\tcase fpkFormUrlEncoded:\n\t\t{\n\t\t\t// m_IncomingData has all the form data, parse it now:\n\t\t\tParseFormUrlEncoded();\n\t\t\tbreak;\n\t\t}\n\t\tcase fpkMultipart:\n\t\t{\n\t\t\t// Nothing needed for other formats\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn (m_IsValid && m_IncomingData.empty());\n}\n\n\n\n\n\nbool cHTTPFormParser::HasFormData(const cHTTPIncomingRequest & a_Request)\n{\n\tconst AString & ContentType = a_Request.GetContentType();\n\treturn (\n\t\t(ContentType == \"application/x-www-form-urlencoded\") ||\n\t\t(strncmp(ContentType.c_str(), \"multipart/form-data\", 19) == 0) ||\n\t\t(\n\t\t\t(a_Request.GetMethod() == \"GET\") &&\n\t\t\t(a_Request.GetURL().find('?') != AString::npos)\n\t\t)\n\t);\n}\n\n\n\n\n\nvoid cHTTPFormParser::BeginMultipart(const cHTTPIncomingRequest & a_Request)\n{\n\tASSERT(m_MultipartParser.get() == nullptr);\n\tm_MultipartParser.reset(new cMultipartParser(a_Request.GetContentType(), *this));\n}\n\n\n\n\n\nvoid cHTTPFormParser::ParseFormUrlEncoded(void)\n{\n\t// Parse m_IncomingData for all the variables; no more data is incoming, since this is called from Finish()\n\t// This may not be the most performant version, but we don't care, the form data is small enough and we're not a full-fledged web server anyway\n\tAStringVector Lines = StringSplit(m_IncomingData, \"&\");\n\tfor (AStringVector::iterator itr = Lines.begin(), end = Lines.end(); itr != end; ++itr)\n\t{\n\t\tAStringVector Components = StringSplit(*itr, \"=\");\n\t\tswitch (Components.size())\n\t\t{\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\t// Neither name nor value, or too many \"=\"s, mark this as invalid form:\n\t\t\t\tm_IsValid = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 1:\n\t\t\t{\n\t\t\t\t// Only name present\n\t\t\t\tauto name = URLDecode(ReplaceAllCharOccurrences(Components[0], '+', ' '));\n\t\t\t\tif (name.first)\n\t\t\t\t{\n\t\t\t\t\t(*this)[name.second] = \"\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 2:\n\t\t\t{\n\t\t\t\t// name=value format:\n\t\t\t\tauto name = URLDecode(Components[0]);\n\t\t\t\tauto value = URLDecode(Components[1]);\n\t\t\t\tif (name.first && value.first)\n\t\t\t\t{\n\t\t\t\t\t(*this)[name.second] = value.second;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}  // for itr - Lines[]\n\tm_IncomingData.clear();\n}\n\n\n\n\n\nvoid cHTTPFormParser::OnPartStart(void)\n{\n\tm_CurrentPartFileName.clear();\n\tm_CurrentPartName.clear();\n\tm_IsCurrentPartFile = false;\n\tm_FileHasBeenAnnounced = false;\n}\n\n\n\n\n\nvoid cHTTPFormParser::OnPartHeader(const AString & a_Key, const AString & a_Value)\n{\n\tif (NoCaseCompare(a_Key, \"Content-Disposition\") == 0)\n\t{\n\t\tsize_t len = a_Value.size();\n\t\tsize_t ParamsStart = AString::npos;\n\t\tfor (size_t i = 0; i < len; ++i)\n\t\t{\n\t\t\tif (a_Value[i] > ' ')\n\t\t\t{\n\t\t\t\tif (strncmp(a_Value.c_str() + i, \"form-data\", 9) != 0)\n\t\t\t\t{\n\t\t\t\t\t// Content disposition is not \"form-data\", mark the whole form invalid\n\t\t\t\t\tm_IsValid = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tParamsStart = a_Value.find(';', i + 9);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (ParamsStart == AString::npos)\n\t\t{\n\t\t\t// There is data missing in the Content-Disposition field, mark the whole form invalid:\n\t\t\tm_IsValid = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse the field name and optional filename from this header:\n\t\tcNameValueParser Parser(a_Value.data() + ParamsStart, a_Value.size() - ParamsStart);\n\t\tParser.Finish();\n\t\tm_CurrentPartName = Parser[\"name\"];\n\t\tif (!Parser.IsValid() || m_CurrentPartName.empty())\n\t\t{\n\t\t\t// The required parameter \"name\" is missing, mark the whole form invalid:\n\t\t\tm_IsValid = false;\n\t\t\treturn;\n\t\t}\n\t\tm_CurrentPartFileName = Parser[\"filename\"];\n\t}\n}\n\n\n\n\n\nvoid cHTTPFormParser::OnPartData(const char * a_Data, size_t a_Size)\n{\n\tif (m_CurrentPartName.empty())\n\t{\n\t\t// Prologue, epilogue or invalid part\n\t\treturn;\n\t}\n\tif (m_CurrentPartFileName.empty())\n\t{\n\t\t// This is a variable, store it in the map\n\t\titerator itr = find(m_CurrentPartName);\n\t\tif (itr == end())\n\t\t{\n\t\t\t(*this)[m_CurrentPartName] = AString(a_Data, a_Size);\n\t\t}\n\t\telse\n\t\t{\n\t\t\titr->second.append(a_Data, a_Size);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// This is a file, pass it on through the callbacks\n\t\tif (!m_FileHasBeenAnnounced)\n\t\t{\n\t\t\tm_Callbacks.OnFileStart(*this, m_CurrentPartFileName);\n\t\t\tm_FileHasBeenAnnounced = true;\n\t\t}\n\t\tm_Callbacks.OnFileData(*this, a_Data, a_Size);\n\t}\n}\n\n\n\n\n\nvoid cHTTPFormParser::OnPartEnd(void)\n{\n\tif (m_FileHasBeenAnnounced)\n\t{\n\t\tm_Callbacks.OnFileEnd(*this);\n\t}\n\tm_CurrentPartName.clear();\n\tm_CurrentPartFileName.clear();\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/HTTPFormParser.h",
    "content": "\n// HTTPFormParser.h\n\n// Declares the cHTTPFormParser class representing a parser for forms sent over HTTP\n\n\n\n\n#pragma once\n\n#include \"MultipartParser.h\"\n\n\n\n\n\n// fwd:\nclass cHTTPIncomingRequest;\n\n\n\n\n\nclass cHTTPFormParser :\n\tpublic std::map<AString, AString>,\n\tpublic cMultipartParser::cCallbacks\n{\npublic:\n\tenum eKind\n\t{\n\t\tfpkURL,             ///< The form has been transmitted as parameters to a GET request\n\t\tfpkFormUrlEncoded,  ///< The form has been POSTed or PUT, with Content-Type of \"application/x-www-form-urlencoded\"\n\t\tfpkMultipart,       ///< The form has been POSTed or PUT, with Content-Type of \"multipart/form-data\"\n\t} ;\n\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when a new file part is encountered in the form data */\n\t\tvirtual void OnFileStart(cHTTPFormParser & a_Parser, const AString & a_FileName) = 0;\n\n\t\t/** Called when more file data has come for the current file in the form data */\n\t\tvirtual void OnFileData(cHTTPFormParser & a_Parser, const char * a_Data, size_t a_Size) = 0;\n\n\t\t/** Called when the current file part has ended in the form data */\n\t\tvirtual void OnFileEnd(cHTTPFormParser & a_Parser) = 0;\n\t} ;\n\n\n\t/** Creates a parser that is tied to a request and notifies of various events using a callback mechanism */\n\tcHTTPFormParser(const cHTTPIncomingRequest & a_Request, cCallbacks & a_Callbacks);\n\n\t/** Creates a parser with the specified content type that reads data from a string */\n\tcHTTPFormParser(eKind a_Kind, const char * a_Data, size_t a_Size, cCallbacks & a_Callbacks);\n\n\t/** Adds more data into the parser, as the request body is received */\n\tvoid Parse(const char * a_Data, size_t a_Size);\n\n\t/** Notifies that there's no more data incoming and the parser should finish its parsing.\n\tReturns true if parsing successful. */\n\tbool Finish(void);\n\n\t/** Returns true if the headers suggest the request has form data parseable by this class */\n\tstatic bool HasFormData(const cHTTPIncomingRequest & a_Request);\n\nprotected:\n\n\t/** The callbacks to call for incoming file data */\n\tcCallbacks & m_Callbacks;\n\n\t/** The kind of the parser (decided in the constructor, used in Parse() */\n\teKind m_Kind;\n\n\t/** Buffer for the incoming data until it's parsed */\n\tAString m_IncomingData;\n\n\t/** True if the information received so far is a valid form; set to false on first problem. Further parsing is skipped when false. */\n\tbool m_IsValid;\n\n\t/** The parser for the multipart data, if used */\n\tstd::unique_ptr<cMultipartParser> m_MultipartParser;\n\n\t/** Name of the currently parsed part in multipart data */\n\tAString m_CurrentPartName;\n\n\t/** True if the currently parsed part in multipart data is a file */\n\tbool m_IsCurrentPartFile;\n\n\t/** Filename of the current parsed part in multipart data (for file uploads) */\n\tAString m_CurrentPartFileName;\n\n\t/** Set to true after m_Callbacks.OnFileStart() has been called, reset to false on PartEnd */\n\tbool m_FileHasBeenAnnounced;\n\n\n\t/** Sets up the object for parsing a fpkMultipart request */\n\tvoid BeginMultipart(const cHTTPIncomingRequest & a_Request);\n\n\t/** Parses m_IncomingData as form-urlencoded data (fpkURL or fpkFormUrlEncoded kinds) */\n\tvoid ParseFormUrlEncoded(void);\n\n\t// cMultipartParser::cCallbacks overrides:\n\tvirtual void OnPartStart (void) override;\n\tvirtual void OnPartHeader(const AString & a_Key, const AString & a_Value) override;\n\tvirtual void OnPartData  (const char * a_Data, size_t a_Size) override;\n\tvirtual void OnPartEnd   (void) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/HTTPMessage.cpp",
    "content": "\n// HTTPMessage.cpp\n\n// Declares the cHTTPMessage class representing the common ancestor for HTTP request and response classes\n\n#include \"Globals.h\"\n#include \"HTTPMessage.h\"\n\n\n\n\n\n// Disable MSVC warnings:\n#if defined(_MSC_VER)\n\t#pragma warning(push)\n\t#pragma warning(disable:4355)  // 'this' : used in base member initializer list\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHTTPMessage:\n\ncHTTPMessage::cHTTPMessage(eKind a_Kind) :\n\tm_Kind(a_Kind),\n\tm_ContentLength(AString::npos)\n{\n}\n\n\n\n\n\nvoid cHTTPMessage::AddHeader(const AString & a_Key, const AString & a_Value)\n{\n\tauto Key = StrToLower(a_Key);\n\tauto itr = m_Headers.find(Key);\n\tif (itr == m_Headers.end())\n\t{\n\t\tm_Headers[Key] = a_Value;\n\t}\n\telse\n\t{\n\t\t// The header-field key is specified multiple times, combine into comma-separated list (RFC 2616 @ 4.2)\n\t\titr->second.append(\", \");\n\t\titr->second.append(a_Value);\n\t}\n\n\t// Special processing for well-known headers:\n\tif (Key == \"content-type\")\n\t{\n\t\tm_ContentType = m_Headers[Key];\n\t}\n\telse if (Key == \"content-length\")\n\t{\n\t\tif (!StringToInteger(m_Headers[Key], m_ContentLength))\n\t\t{\n\t\t\tm_ContentLength = 0;\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHTTPOutgoingResponse:\n\ncHTTPOutgoingResponse::cHTTPOutgoingResponse(void) :\n\tSuper(mkResponse)\n{\n}\n\n\n\n\n\nvoid cHTTPOutgoingResponse::AppendToData(AString & a_DataStream) const\n{\n\ta_DataStream.append(\"HTTP/1.1 200 OK\\r\\nTransfer-Encoding: chunked\\r\\nContent-Type: \");\n\ta_DataStream.append(m_ContentType);\n\ta_DataStream.append(\"\\r\\n\");\n\tfor (auto itr = m_Headers.cbegin(), end = m_Headers.cend(); itr != end; ++itr)\n\t{\n\t\tif ((itr->first == \"Content-Type\") || (itr->first == \"Content-Length\"))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\ta_DataStream.append(itr->first);\n\t\ta_DataStream.append(\": \");\n\t\ta_DataStream.append(itr->second);\n\t\ta_DataStream.append(\"\\r\\n\");\n\t}  // for itr - m_Headers[]\n\ta_DataStream.append(\"\\r\\n\");\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHTTPIncomingRequest:\n\ncHTTPIncomingRequest::cHTTPIncomingRequest(const AString & a_Method, const AString & a_URL):\n\tSuper(mkRequest),\n\tm_Method(a_Method),\n\tm_URL(a_URL),\n\tm_HasAuth(false)\n{\n}\n\n\n\n\n\nAString cHTTPIncomingRequest::GetURLPath(void) const\n{\n\tauto idxQuestionMark = m_URL.find('?');\n\tif (idxQuestionMark == AString::npos)\n\t{\n\t\treturn m_URL;\n\t}\n\telse\n\t{\n\t\treturn m_URL.substr(0, idxQuestionMark);\n\t}\n}\n\n\n\n\n\nvoid cHTTPIncomingRequest::AddHeader(const AString & a_Key, const AString & a_Value)\n{\n\tif (\n\t\t(NoCaseCompare(a_Key, \"Authorization\") == 0) &&\n\t\t(strncmp(a_Value.c_str(), \"Basic \", 6) == 0)\n\t)\n\t{\n\t\tAString UserPass = Base64Decode(a_Value.substr(6));\n\t\tsize_t idxCol = UserPass.find(':');\n\t\tif (idxCol != AString::npos)\n\t\t{\n\t\t\tm_AuthUsername = UserPass.substr(0, idxCol);\n\t\t\tm_AuthPassword = UserPass.substr(idxCol + 1);\n\t\t\tm_HasAuth = true;\n\t\t}\n\t}\n\tif ((a_Key == \"Connection\") && (NoCaseCompare(a_Value, \"keep-alive\") == 0))\n\t{\n\t\tm_AllowKeepAlive = true;\n\t}\n\tSuper::AddHeader(a_Key, a_Value);\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/HTTPMessage.h",
    "content": "\n// HTTPMessage.h\n\n// Declares the cHTTPMessage class representing the common ancestor for HTTP request and response classes\n\n\n\n\n\n#pragma once\n\n\n\n\n\nclass cHTTPMessage\n{\npublic:\n\tenum eStatus\n\t{\n\t\tHTTP_OK = 200,\n\t\tHTTP_BAD_REQUEST = 400,\n\t} ;\n\n\tenum eKind\n\t{\n\t\tmkRequest,\n\t\tmkResponse,\n\t} ;\n\n\tcHTTPMessage(eKind a_Kind);\n\n\t// Force a virtual destructor in all descendants\n\tvirtual ~cHTTPMessage() {}\n\n\t/** Adds a header into the internal map of headers. Recognizes special headers: Content-Type and Content-Length */\n\tvirtual void AddHeader(const AString & a_Key, const AString & a_Value);\n\n\tvoid SetContentType  (const AString & a_ContentType) { m_ContentType   = a_ContentType; }\n\tvoid SetContentLength(size_t a_ContentLength)        { m_ContentLength = a_ContentLength; }\n\n\tconst AString & GetContentType  (void) const { return m_ContentType; }\n\tsize_t          GetContentLength(void) const { return m_ContentLength; }\n\nprotected:\n\n\tusing cNameValueMap = std::map<AString, AString>;\n\n\n\teKind m_Kind;\n\n\t/** Map of headers, with their keys lowercased. */\n\tAStringMap m_Headers;\n\n\t/** Type of the content; parsed by AddHeader(), set directly by SetContentLength() */\n\tAString m_ContentType;\n\n\t/** Length of the content that is to be received.\n\tAString::npos when the object is created.\n\tParsed by AddHeader() or set directly by SetContentLength() */\n\tsize_t m_ContentLength;\n} ;\n\n\n\n\n\n/** Stores outgoing response headers and serializes them to an HTTP data stream. */\nclass cHTTPOutgoingResponse:\n\tpublic cHTTPMessage\n{\n\tusing Super = cHTTPMessage;\n\npublic:\n\n\tcHTTPOutgoingResponse(void);\n\n\t/** Appends the response to the specified datastream - response line and headers.\n\tThe body will be sent later directly through cConnection::Send() */\n\tvoid AppendToData(AString & a_DataStream) const;\n} ;\n\n\n\n\n\n/** Provides storage for an incoming HTTP request. */\nclass cHTTPIncomingRequest:\n\tpublic cHTTPMessage\n{\n\tusing Super = cHTTPMessage;\n\npublic:\n\n\t/** Base class for anything that can be used as the UserData for the request. */\n\tclass cUserData\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cUserData() {}\n\t};\n\tusing cUserDataPtr = std::shared_ptr<cUserData>;\n\n\n\t/** Creates a new instance of the class, containing the method and URL provided by the client. */\n\tcHTTPIncomingRequest(const AString & a_Method, const AString & a_URL);\n\n\t/** Returns the method used in the request */\n\tconst AString & GetMethod(void) const { return m_Method; }\n\n\t/** Returns the URL used in the request */\n\tconst AString & GetURL(void) const { return m_URL; }\n\n\t/** Returns the path part of the URL. */\n\tAString GetURLPath(void) const;\n\n\t/** Returns true if the request has had the Auth header present. */\n\tbool HasAuth(void) const { return m_HasAuth; }\n\n\t/** Returns the username that the request presented. Only valid if HasAuth() is true */\n\tconst AString & GetAuthUsername(void) const { return m_AuthUsername; }\n\n\t/** Returns the password that the request presented. Only valid if HasAuth() is true */\n\tconst AString & GetAuthPassword(void) const { return m_AuthPassword; }\n\n\tbool DoesAllowKeepAlive(void) const { return m_AllowKeepAlive; }\n\n\t/** Attaches any kind of data to this request, to be later retrieved by GetUserData(). */\n\tvoid SetUserData(cUserDataPtr a_UserData) { m_UserData = std::move(a_UserData); }\n\n\t/** Returns the data attached to this request by the class client. */\n\tcUserDataPtr GetUserData(void) { return m_UserData; }\n\n\t/** Adds the specified header into the internal list of headers.\n\tOverrides the parent to add recognizing additional headers: auth and keepalive. */\n\tvirtual void AddHeader(const AString & a_Key, const AString & a_Value) override;\n\nprotected:\n\n\t/** Method of the request (GET / PUT / POST / ...) */\n\tAString m_Method;\n\n\t/** Full URL of the request */\n\tAString m_URL;\n\n\t/** Set to true if the request contains auth data that was understood by the parser */\n\tbool m_HasAuth;\n\n\t/** The username used for auth */\n\tAString m_AuthUsername;\n\n\t/** The password used for auth */\n\tAString m_AuthPassword;\n\n\t/** Set to true if the request indicated that it supports keepalives.\n\tIf false, the server will close the connection once the request is finished */\n\tbool m_AllowKeepAlive;\n\n\t/** Any data attached to the request by the class client. */\n\tcUserDataPtr m_UserData;\n};\n"
  },
  {
    "path": "src/HTTP/HTTPMessageParser.cpp",
    "content": "\n// HTTPMessageParser.cpp\n\n// Implements the cHTTPMessageParser class that parses HTTP messages (request or response) being pushed into the parser,\n// and reports the individual parts via callbacks\n\n#include \"Globals.h\"\n#include \"HTTPMessageParser.h\"\n\n\n\n\n\ncHTTPMessageParser::cHTTPMessageParser(cHTTPMessageParser::cCallbacks & a_Callbacks):\n\tm_Callbacks(a_Callbacks),\n\tm_EnvelopeParser(*this)\n{\n\tReset();\n}\n\n\n\n\n\nsize_t cHTTPMessageParser::Parse(const char * a_Data, size_t a_Size)\n{\n\t// If parsing already finished or errorred, let the caller keep all the data:\n\tif (m_IsFinished || m_HasHadError)\n\t{\n\t\treturn 0;\n\t}\n\n\t// If still waiting for the status line, add to buffer and try parsing it:\n\tauto inBufferSoFar = m_Buffer.size();\n\tif (m_FirstLine.empty())\n\t{\n\t\tm_Buffer.append(a_Data, a_Size);\n\t\tauto bytesConsumedFirstLine = ParseFirstLine();\n\t\tASSERT(bytesConsumedFirstLine <= inBufferSoFar + a_Size);  // Haven't consumed more data than there is in the buffer\n\t\tASSERT(bytesConsumedFirstLine > inBufferSoFar);  // Have consumed at least the previous buffer contents\n\t\tif (m_FirstLine.empty())\n\t\t{\n\t\t\t// All data used, but not a complete status line yet.\n\t\t\treturn a_Size;\n\t\t}\n\t\tif (m_HasHadError)\n\t\t{\n\t\t\treturn AString::npos;\n\t\t}\n\t\t// Status line completed, feed the rest of the buffer into the envelope parser:\n\t\tauto bytesConsumedEnvelope = m_EnvelopeParser.Parse(m_Buffer.data(), m_Buffer.size());\n\t\tif (bytesConsumedEnvelope == AString::npos)\n\t\t{\n\t\t\tm_HasHadError = true;\n\t\t\tm_Callbacks.OnError(\"Failed to parse the envelope\");\n\t\t\treturn AString::npos;\n\t\t}\n\t\tASSERT(bytesConsumedEnvelope <= bytesConsumedFirstLine + a_Size);  // Haven't consumed more data than there was in the buffer\n\t\tm_Buffer.erase(0, bytesConsumedEnvelope);\n\t\tif (!m_EnvelopeParser.IsInHeaders())\n\t\t{\n\t\t\tHeadersFinished();\n\t\t\t// Process any data still left in the buffer as message body:\n\t\t\tauto bytesConsumedBody = ParseBody(m_Buffer.data(), m_Buffer.size());\n\t\t\tif (bytesConsumedBody == AString::npos)\n\t\t\t{\n\t\t\t\t// Error has already been reported by ParseBody, just bail out:\n\t\t\t\treturn AString::npos;\n\t\t\t}\n\t\t\treturn bytesConsumedBody + bytesConsumedEnvelope + bytesConsumedFirstLine - inBufferSoFar;\n\t\t}\n\t\treturn a_Size;\n\t}  // if (m_FirstLine.empty())\n\n\t// If still parsing headers, send them to the envelope parser:\n\tif (m_EnvelopeParser.IsInHeaders())\n\t{\n\t\tauto bytesConsumed = m_EnvelopeParser.Parse(a_Data, a_Size);\n\t\tif (bytesConsumed == AString::npos)\n\t\t{\n\t\t\tm_HasHadError = true;\n\t\t\tm_Callbacks.OnError(\"Failed to parse the envelope\");\n\t\t\treturn AString::npos;\n\t\t}\n\t\tif (!m_EnvelopeParser.IsInHeaders())\n\t\t{\n\t\t\tHeadersFinished();\n\t\t\t// Process any data still left as message body:\n\t\t\tauto bytesConsumedBody = ParseBody(a_Data + bytesConsumed, a_Size - bytesConsumed);\n\t\t\tif (bytesConsumedBody == AString::npos)\n\t\t\t{\n\t\t\t\t// Error has already been reported by ParseBody, just bail out:\n\t\t\t\treturn AString::npos;\n\t\t\t}\n\t\t}\n\t\treturn a_Size;\n\t}\n\n\t// Already parsing the body\n\treturn ParseBody(a_Data, a_Size);\n}\n\n\n\n\n\nvoid cHTTPMessageParser::Reset(void)\n{\n\tm_HasHadError = false;\n\tm_IsFinished = false;\n\tm_FirstLine.clear();\n\tm_Buffer.clear();\n\tm_EnvelopeParser.Reset();\n\tm_TransferEncodingParser.reset();\n\tm_TransferEncoding.clear();\n\tm_ContentLength = 0;\n}\n\n\n\n\n\nsize_t cHTTPMessageParser::ParseFirstLine(void)\n{\n\tauto idxLineEnd = m_Buffer.find(\"\\r\\n\");\n\tif (idxLineEnd == AString::npos)\n\t{\n\t\t// Not a complete line yet\n\t\treturn m_Buffer.size();\n\t}\n\tm_FirstLine = m_Buffer.substr(0, idxLineEnd);\n\tm_Buffer.erase(0, idxLineEnd + 2);\n\tm_Callbacks.OnFirstLine(m_FirstLine);\n\treturn idxLineEnd + 2;\n}\n\n\n\n\n\nsize_t cHTTPMessageParser::ParseBody(const char * a_Data, size_t a_Size)\n{\n\tif (m_TransferEncodingParser == nullptr)\n\t{\n\t\t// We have no Transfer-encoding parser assigned. This should have happened when finishing the envelope\n\t\tOnError(\"No transfer encoding parser\");\n\t\treturn AString::npos;\n\t}\n\n\t// Parse the body using the transfer encoding parser:\n\t// (Note that TE parser returns the number of bytes left, while we return the number of bytes consumed)\n\treturn a_Size - m_TransferEncodingParser->Parse(a_Data, a_Size);\n}\n\n\n\n\n\nvoid cHTTPMessageParser::HeadersFinished(void)\n{\n\tm_Callbacks.OnHeadersFinished();\n\tm_TransferEncodingParser = cTransferEncodingParser::Create(*this, m_TransferEncoding, m_ContentLength);\n\tif (m_TransferEncodingParser == nullptr)\n\t{\n\t\tOnError(fmt::format(FMT_STRING(\"Unknown transfer encoding: {}\"), m_TransferEncoding));\n\t\treturn;\n\t}\n}\n\n\n\n\n\nvoid cHTTPMessageParser::OnHeaderLine(const AString & a_Key, const AString & a_Value)\n{\n\tm_Callbacks.OnHeaderLine(a_Key, a_Value);\n\tauto Key = StrToLower(a_Key);\n\tif (Key == \"content-length\")\n\t{\n\t\tif (!StringToInteger(a_Value, m_ContentLength))\n\t\t{\n\t\t\tOnError(fmt::format(FMT_STRING(\"Invalid content length header value: \\\"{}\\\"\"), a_Value));\n\t\t}\n\t\treturn;\n\t}\n\tif (Key == \"transfer-encoding\")\n\t{\n\t\tm_TransferEncoding = a_Value;\n\t\treturn;\n\t}\n}\n\n\n\n\n\nvoid cHTTPMessageParser::OnError(const AString & a_ErrorDescription)\n{\n\tm_HasHadError = true;\n\tm_Callbacks.OnError(a_ErrorDescription);\n}\n\n\n\n\n\nvoid cHTTPMessageParser::OnBodyData(const void * a_Data, size_t a_Size)\n{\n\tm_Callbacks.OnBodyData(a_Data, a_Size);\n}\n\n\n\n\n\nvoid cHTTPMessageParser::OnBodyFinished(void)\n{\n\tm_IsFinished = true;\n\tm_Callbacks.OnBodyFinished();\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/HTTPMessageParser.h",
    "content": "\n// HTTPMessageParser.h\n\n// Declares the cHTTPMessageParser class that parses HTTP messages (request or response) being pushed into the parser,\n// and reports the individual parts via callbacks\n\n\n\n\n\n#pragma once\n\n#include \"EnvelopeParser.h\"\n#include \"TransferEncodingParser.h\"\n\n\n\n\n\nclass cHTTPMessageParser:\n\tprotected cEnvelopeParser::cCallbacks,\n\tprotected cTransferEncodingParser::cCallbacks\n{\npublic:\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when an error has occured while parsing. */\n\t\tvirtual void OnError(const AString & a_ErrorDescription) = 0;\n\n\t\t/** Called when the first line of the request or response is fully parsed.\n\t\tDoesn't check the validity of the line, only extracts the first complete line. */\n\t\tvirtual void OnFirstLine(const AString & a_FirstLine) = 0;\n\n\t\t/** Called when a single header line is parsed. */\n\t\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) = 0;\n\n\t\t/** Called when all the headers have been parsed. */\n\t\tvirtual void OnHeadersFinished(void) = 0;\n\n\t\t/** Called for each chunk of the incoming body data. */\n\t\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) = 0;\n\n\t\t/** Called when the entire body has been reported by OnBodyData(). */\n\t\tvirtual void OnBodyFinished(void) = 0;\n\t};\n\n\t/** Creates a new parser instance that will use the specified callbacks for reporting. */\n\tcHTTPMessageParser(cCallbacks & a_Callbacks);\n\n\t/** Parses the incoming data and calls the appropriate callbacks.\n\tReturns the number of bytes consumed or AString::npos number for error. */\n\tsize_t Parse(const char * a_Data, size_t a_Size);\n\n\t/** Called when the server indicates no more data will be sent (HTTP 1.0 socket closed).\n\tFinishes all parsing and calls apropriate callbacks (error if incomplete response). */\n\tvoid Finish(void);\n\n\t/** Returns true if the entire response has been already parsed. */\n\tbool IsFinished(void) const { return m_IsFinished; }\n\n\t/** Resets the parser to the initial state, so that a new request can be parsed. */\n\tvoid Reset(void);\n\n\nprotected:\n\n\t/** The callbacks used for reporting. */\n\tcCallbacks & m_Callbacks;\n\n\t/** Set to true if an error has been encountered by the parser. */\n\tbool m_HasHadError;\n\n\t/** True if the response has been fully parsed. */\n\tbool m_IsFinished;\n\n\t/** The complete first line of the response. Empty if not parsed yet. */\n\tAString m_FirstLine;\n\n\t/** Buffer for the incoming data until the status line is parsed. */\n\tAString m_Buffer;\n\n\t/** Parser for the envelope data (headers) */\n\tcEnvelopeParser m_EnvelopeParser;\n\n\t/** The specific parser for the transfer encoding used by this response. */\n\tcTransferEncodingParserPtr m_TransferEncodingParser;\n\n\t/** The transfer encoding to be used by the parser.\n\tFilled while parsing headers, used when headers are finished. */\n\tAString m_TransferEncoding;\n\n\t/** The content length, parsed from the headers, if available.\n\tUnused for chunked encoding.\n\tFilled while parsing headers, used when headers are finished. */\n\tsize_t m_ContentLength;\n\n\n\t/** Parses the first line out of m_Buffer.\n\tRemoves the first line from m_Buffer, if appropriate.\n\tReturns the number of bytes consumed out of m_Buffer, or AString::npos number for error. */\n\tsize_t ParseFirstLine(void);\n\n\t/** Parses the message body.\n\tProcesses transfer encoding and calls the callbacks for body data.\n\tReturns the number of bytes consumed or AString::npos number for error. */\n\tsize_t ParseBody(const char * a_Data, size_t a_Size);\n\n\t/** Called internally when the headers-parsing has just finished. */\n\tvoid HeadersFinished(void);\n\n\t// cEnvelopeParser::cCallbacks overrides:\n\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override;\n\n\t// cTransferEncodingParser::cCallbacks overrides:\n\tvirtual void OnError(const AString & a_ErrorDescription) override;\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override;\n\tvirtual void OnBodyFinished(void) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/HTTPServer.cpp",
    "content": "\n// HTTPServer.cpp\n\n// Implements the cHTTPServer class representing a HTTP webserver that uses cListenThread and cSocketThreads for processing\n\n#include \"Globals.h\"\n#include \"HTTPServer.h\"\n#include \"HTTPMessageParser.h\"\n#include \"HTTPServerConnection.h\"\n#include \"HTTPFormParser.h\"\n#include \"SslHTTPServerConnection.h\"\n#include \"../mbedTLS++/SslConfig.h\"\n\n\n\n\n\n// Disable MSVC warnings:\n#if defined(_MSC_VER)\n\t#pragma warning(push)\n\t#pragma warning(disable:4355)  // 'this' : used in base member initializer list\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHTTPServerListenCallbacks:\n\nclass cHTTPServerListenCallbacks:\n\tpublic cNetwork::cListenCallbacks\n{\npublic:\n\tcHTTPServerListenCallbacks(cHTTPServer & a_HTTPServer, UInt16 a_Port):\n\t\tm_HTTPServer(a_HTTPServer),\n\t\tm_Port(a_Port)\n\t{\n\t}\n\nprotected:\n\t/** The HTTP server instance that we're attached to. */\n\tcHTTPServer & m_HTTPServer;\n\n\t/** The port for which this instance is responsible. */\n\tUInt16 m_Port;\n\n\t// cNetwork::cListenCallbacks overrides:\n\tvirtual cTCPLink::cCallbacksPtr OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort) override\n\t{\n\t\treturn m_HTTPServer.OnIncomingConnection(a_RemoteIPAddress, a_RemotePort);\n\t}\n\tvirtual void OnAccepted(cTCPLink & a_Link) override {}\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tLOGWARNING(\"HTTP server error on port %d: %d (%s)\", m_Port, a_ErrorCode, a_ErrorMsg.c_str());\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHTTPServer:\n\ncHTTPServer::cHTTPServer(void) :\n\tm_Callbacks(nullptr)\n{\n}\n\n\n\n\n\ncHTTPServer::~cHTTPServer()\n{\n\tStop();\n}\n\n\n\n\n\nbool cHTTPServer::Initialize(void)\n{\n\t// Read the HTTPS cert + key:\n\tAString CertFile = cFile::ReadWholeFile(\"webadmin/httpscert.crt\");\n\tAString KeyFile  = cFile::ReadWholeFile(\"webadmin/httpskey.pem\");\n\tif (!CertFile.empty() && !KeyFile.empty())\n\t{\n\t\tauto Cert = std::make_shared<cX509Cert>();\n\t\tint res = Cert->Parse(CertFile.data(), CertFile.size());\n\t\tif (res == 0)\n\t\t{\n\t\t\tauto CertPrivKey = std::make_shared<cCryptoKey>();\n\t\t\tres = CertPrivKey->ParsePrivate(KeyFile.data(), KeyFile.size(), \"\");\n\t\t\tif (res == 0)\n\t\t\t{\n\t\t\t\t// Modifyable locally but otherwise must be const\n\t\t\t\tauto Config = cSslConfig::MakeDefaultConfig(false);\n\t\t\t\tConfig->SetOwnCert(Cert, CertPrivKey);\n\t\t\t\tm_SslConfig = std::move(Config);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Reading the private key failed, reset the cert:\n\t\t\t\tLOGWARNING(\"WebServer: Cannot read HTTPS certificate private key: -0x%x\", -res);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLOGWARNING(\"WebServer: Cannot read HTTPS certificate: -0x%x\", -res);\n\t\t}\n\t}\n\n\t// Notify the admin about the HTTPS / HTTP status\n\tif (m_SslConfig == nullptr)\n\t{\n\t\tLOGWARNING(\"WebServer: The server will run in unsecured HTTP mode.\");\n\t\tLOGINFO(\"Put a valid HTTPS certificate in file 'webadmin/httpscert.crt' and its corresponding private key to 'webadmin/httpskey.pem' (without any password) to enable HTTPS support\");\n\t}\n\telse\n\t{\n\t\tLOGINFO(\"WebServer: The server will run in secure HTTPS mode.\");\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cHTTPServer::Start(cCallbacks & a_Callbacks, const AStringVector & a_Ports)\n{\n\tm_Callbacks = &a_Callbacks;\n\n\t// Open up requested ports:\n\tAStringVector ports;\n\tfor (const auto & port : a_Ports)\n\t{\n\t\tUInt16 PortNum;\n\t\tif (!StringToInteger(port, PortNum))\n\t\t{\n\t\t\tLOGWARNING(\"WebServer: Invalid port value: \\\"%s\\\". Ignoring.\", port.c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tauto Handle = cNetwork::Listen(PortNum, std::make_shared<cHTTPServerListenCallbacks>(*this, PortNum));\n\t\tif (Handle->IsListening())\n\t\t{\n\t\t\tm_ServerHandles.push_back(Handle);\n\t\t\tports.push_back(port);\n\t\t}\n\t}  // for port - a_Ports[]\n\n\t// Inform the admin about the ports opened:\n\tAString reportPorts;\n\tfor (const auto & port: ports)\n\t{\n\t\tif (!reportPorts.empty())\n\t\t{\n\t\t\treportPorts.append(\", \");\n\t\t}\n\t\treportPorts.append(port);\n\t}\n\tLOGINFO(\"WebAdmin is running on port(s) %s\", reportPorts.c_str());\n\n\t// Report success if at least one port opened successfully:\n\treturn !m_ServerHandles.empty();\n}\n\n\n\n\n\nvoid cHTTPServer::Stop(void)\n{\n\tfor (const auto & handle : m_ServerHandles)\n\t{\n\t\thandle->Close();\n\t}\n\tm_ServerHandles.clear();\n}\n\n\n\n\n\ncTCPLink::cCallbacksPtr cHTTPServer::OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort)\n{\n\tUNUSED(a_RemoteIPAddress);\n\tUNUSED(a_RemotePort);\n\n\tif (m_SslConfig != nullptr)\n\t{\n\t\treturn std::make_shared<cSslHTTPServerConnection>(*this, m_SslConfig);\n\t}\n\telse\n\t{\n\t\treturn std::make_shared<cHTTPServerConnection>(*this);\n\t}\n}\n\n\n\n\n\nvoid cHTTPServer::NewRequest(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request)\n{\n\tm_Callbacks->OnRequestBegun(a_Connection, a_Request);\n}\n\n\n\n\n\nvoid cHTTPServer::RequestBody(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request, const void * a_Data, size_t a_Size)\n{\n\tm_Callbacks->OnRequestBody(a_Connection, a_Request, static_cast<const char *>(a_Data), a_Size);\n}\n\n\n\n\n\nvoid cHTTPServer::RequestFinished(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request)\n{\n\tm_Callbacks->OnRequestFinished(a_Connection, a_Request);\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/HTTPServer.h",
    "content": "\n// HTTPServer.h\n\n// Declares the cHTTPServer class representing a HTTP webserver that uses cListenThread and cSocketThreads for processing\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/Network.h\"\n#include \"../IniFile.h\"\n#include \"../mbedTLS++/CryptoKey.h\"\n#include \"../mbedTLS++/X509Cert.h\"\n\n\n\n\n\n// fwd:\nclass cHTTPIncomingRequest;\nclass cHTTPServerConnection;\nclass cSslConfig;\n\n\n\n\n\nclass cHTTPServer\n{\npublic:\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when a new request arrives over a connection and all its headers have been parsed.\n\t\tThe request body needn't have arrived yet. */\n\t\tvirtual void OnRequestBegun(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request) = 0;\n\n\t\t/** Called when another part of request body has arrived.\n\t\tMay be called multiple times for a single request. */\n\t\tvirtual void OnRequestBody(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request, const char * a_Data, size_t a_Size) = 0;\n\n\t\t/** Called when the request body has been fully received in previous calls to OnRequestBody() */\n\t\tvirtual void OnRequestFinished(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request) = 0;\n\t} ;\n\n\tcHTTPServer(void);\n\tvirtual ~cHTTPServer();\n\n\t/** Initializes the server - reads the cert files etc. */\n\tbool Initialize(void);\n\n\t/** Starts the server and assigns the callbacks to use for incoming requests */\n\tbool Start(cCallbacks & a_Callbacks, const AStringVector & a_Ports);\n\n\t/** Stops the server, drops all current connections */\n\tvoid Stop(void);\n\nprotected:\n\tfriend class cHTTPServerConnection;\n\tfriend class cSslHTTPServerConnection;\n\tfriend class cHTTPServerListenCallbacks;\n\n\t/** The cNetwork API handle for the listening socket. */\n\tcServerHandlePtrs m_ServerHandles;\n\n\t/** The callbacks to call for various events */\n\tcCallbacks * m_Callbacks;\n\n\t/** Configuration for server ssl connections. */\n\tstd::shared_ptr<const cSslConfig> m_SslConfig;\n\n\n\t/** Called by cHTTPServerListenCallbacks when there's a new incoming connection.\n\tReturns the connection instance to be used as the cTCPLink callbacks. */\n\tcTCPLink::cCallbacksPtr OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort);\n\n\t/** Called by cHTTPServerConnection when it finishes parsing the request header */\n\tvoid NewRequest(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request);\n\n\t/** Called by cHTTPConenction when it receives more data for the request body.\n\tMay be called multiple times for a single request. */\n\tvoid RequestBody(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request, const void * a_Data, size_t a_Size);\n\n\t/** Called by cHTTPServerConnection when it detects that the request has finished (all of its body has been received) */\n\tvoid RequestFinished(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request);\n} ;\n\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/HTTPServerConnection.cpp",
    "content": "\n// HTTPConnection.cpp\n\n// Implements the cHTTPServerConnection class representing a single persistent connection in the HTTP server.\n\n#include \"Globals.h\"\n#include \"HTTPServerConnection.h\"\n#include \"HTTPMessage.h\"\n#include \"HTTPServer.h\"\n\n\n\n\n\ncHTTPServerConnection::cHTTPServerConnection(cHTTPServer & a_HTTPServer) :\n\tm_HTTPServer(a_HTTPServer),\n\tm_Parser(*this)\n{\n}\n\n\n\n\n\ncHTTPServerConnection::~cHTTPServerConnection() = default;\n\n\n\n\n\nvoid cHTTPServerConnection::SendStatusAndReason(int a_StatusCode, const AString & a_Response)\n{\n\tSendData(fmt::format(FMT_STRING(\"HTTP/1.1 {} {}\\r\\n\"), a_StatusCode, a_Response));\n\tSendData(fmt::format(FMT_STRING(\"Content-Length: {}\\r\\n\\r\\n\"), a_Response));\n\tSendData(a_Response.data(), a_Response.size());\n\tm_CurrentRequest.reset();\n\tm_Parser.Reset();\n}\n\n\n\n\n\nvoid cHTTPServerConnection::SendNeedAuth(const AString & a_Realm)\n{\n\tSendData(fmt::format(FMT_STRING(\"HTTP/1.1 401 Unauthorized\\r\\nWWW-Authenticate: Basic realm=\\\"{}\\\"\\r\\nContent-Length: 0\\r\\n\\r\\n\"), a_Realm));\n\tm_CurrentRequest.reset();\n\tm_Parser.Reset();\n}\n\n\n\n\n\nvoid cHTTPServerConnection::Send(const cHTTPOutgoingResponse & a_Response)\n{\n\tASSERT(m_CurrentRequest != nullptr);\n\tAString toSend;\n\ta_Response.AppendToData(toSend);\n\tSendData(toSend);\n}\n\n\n\n\n\nvoid cHTTPServerConnection::Send(const void * a_Data, size_t a_Size)\n{\n\tASSERT(m_CurrentRequest != nullptr);\n\t// We're sending in Chunked transfer encoding\n\tSendData(fmt::format(\"{0:x}\\r\\n\", a_Size));\n\tSendData(a_Data, a_Size);\n\tSendData(\"\\r\\n\");\n}\n\n\n\n\n\nvoid cHTTPServerConnection::FinishResponse(void)\n{\n\tASSERT(m_CurrentRequest != nullptr);\n\tSendData(\"0\\r\\n\\r\\n\");\n\tm_CurrentRequest.reset();\n\tm_Parser.Reset();\n}\n\n\n\n\n\nvoid cHTTPServerConnection::Terminate(void)\n{\n\tif (m_CurrentRequest != nullptr)\n\t{\n\t\tm_HTTPServer.RequestFinished(*this, *m_CurrentRequest);\n\t}\n\tm_Link->Close();  // Terminate the connection\n\tm_Link.reset();\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnLinkCreated(cTCPLinkPtr a_Link)\n{\n\tASSERT(m_Link == nullptr);\n\tm_Link = a_Link;\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnReceivedData(const char * a_Data, size_t a_Size)\n{\n\tASSERT(m_Link != nullptr);\n\n\tm_Parser.Parse(a_Data, a_Size);\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnRemoteClosed(void)\n{\n\tif (m_CurrentRequest != nullptr)\n\t{\n\t\tm_HTTPServer.RequestFinished(*this, *m_CurrentRequest);\n\t}\n\tm_Link.reset();\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnError(int a_ErrorCode, const AString & a_ErrorMsg)\n{\n\tOnRemoteClosed();\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnError(const AString & a_ErrorDescription)\n{\n\tTerminate();  // HTTP data malformed, disconnect\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnFirstLine(const AString & a_FirstLine)\n{\n\tconst auto Split = StringSplit(a_FirstLine, \" \");\n\tif (Split.size() < 2)\n\t{\n\t\t// Invalid request line. We need at least the Method and URL:\n\t\tTerminate();\n\t\treturn;\n\t}\n\n\t// Create a new request object for this request:\n\tm_CurrentRequest = std::make_unique<cHTTPIncomingRequest>(Split[0], Split[1]);\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnHeaderLine(const AString & a_Key, const AString & a_Value)\n{\n\tif (m_CurrentRequest == nullptr)\n\t{\n\t\treturn;\n\t}\n\tm_CurrentRequest->AddHeader(a_Key, a_Value);\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnHeadersFinished(void)\n{\n\tif (m_CurrentRequest == nullptr)\n\t{\n\t\treturn;\n\t}\n\tm_HTTPServer.NewRequest(*this, *m_CurrentRequest);\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnBodyData(const void * a_Data, size_t a_Size)\n{\n\tif (m_CurrentRequest == nullptr)\n\t{\n\t\treturn;\n\t}\n\tm_HTTPServer.RequestBody(*this, *m_CurrentRequest, a_Data, a_Size);\n}\n\n\n\n\n\nvoid cHTTPServerConnection::OnBodyFinished(void)\n{\n\t// Process the request:\n\tif (m_CurrentRequest != nullptr)\n\t{\n\t\tm_HTTPServer.RequestFinished(*this, *m_CurrentRequest);\n\t}\n\n\t// ...and reset:\n\tm_CurrentRequest.reset();\n\tm_Parser.Reset();\n}\n\n\n\n\n\nvoid cHTTPServerConnection::SendData(const void * a_Data, size_t a_Size)\n{\n\tm_Link->Send(a_Data, a_Size);\n}\n"
  },
  {
    "path": "src/HTTP/HTTPServerConnection.h",
    "content": "\n// HTTPConnection.h\n\n// Declares the cHTTPConnection class representing a single persistent connection in the HTTP server.\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/Network.h\"\n#include \"HTTPMessageParser.h\"\n\n\n\n\n\n// fwd:\nclass cHTTPServer;\nclass cHTTPOutgoingResponse;\nclass cHTTPIncomingRequest;\n\n\n\n\nclass cHTTPServerConnection :\n\tpublic cTCPLink::cCallbacks,\n\tpublic cHTTPMessageParser::cCallbacks\n{\npublic:\n\t/** Creates a new instance, connected to the specified HTTP server instance */\n\tcHTTPServerConnection(cHTTPServer & a_HTTPServer);\n\n\t// Force a virtual destructor in all descendants\n\tvirtual ~cHTTPServerConnection() override;\n\n\t/** Sends HTTP status code together with a_Reason (used for HTTP errors).\n\tSends the a_Reason as the body as well, so that browsers display it.\n\tClears the current request (since it's finished by this call). */\n\tvoid SendStatusAndReason(int a_StatusCode, const AString & a_Reason);\n\n\t/** Sends the \"401 unauthorized\" reply together with instructions on authorizing, using the specified realm.\n\tClears the current request (since it's finished by this call). */\n\tvoid SendNeedAuth(const AString & a_Realm);\n\n\t/** Sends the headers contained in a_Response */\n\tvoid Send(const cHTTPOutgoingResponse & a_Response);\n\n\t/** Sends the data as the response (may be called multiple times) */\n\tvoid Send(const void * a_Data, size_t a_Size);\n\n\t/** Sends the data as the response (may be called multiple times) */\n\tvoid Send(const AString & a_Data) { Send(a_Data.data(), a_Data.size()); }\n\n\t/** Indicates that the current response is finished, gets ready for receiving another request (HTTP 1.1 keepalive).\n\tClears the current request (since it's finished by this call). */\n\tvoid FinishResponse(void);\n\n\t/** Terminates the connection; finishes any request being currently processed */\n\tvoid Terminate(void);\n\nprotected:\n\ttypedef std::map<AString, AString> cNameValueMap;\n\n\t/** The parent webserver that is to be notified of events on this connection */\n\tcHTTPServer & m_HTTPServer;\n\n\t/** The parser responsible for reading the requests. */\n\tcHTTPMessageParser m_Parser;\n\n\t/** The request being currently received\n\tValid only between having parsed the headers and finishing receiving the body. */\n\tstd::unique_ptr<cHTTPIncomingRequest> m_CurrentRequest;\n\n\t/** The network link attached to this connection. */\n\tcTCPLinkPtr m_Link;\n\n\n\t// cTCPLink::cCallbacks overrides:\n\t/** The link instance has been created, remember it. */\n\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) override;\n\n\t/** Data is received from the client. */\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Size) override;\n\n\t/** The socket has been closed for any reason. */\n\tvirtual void OnRemoteClosed(void) override;\n\n\t/** An error has occurred on the socket. */\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;\n\n\t// cHTTPMessageParser::cCallbacks overrides:\n\tvirtual void OnError(const AString & a_ErrorDescription) override;\n\tvirtual void OnFirstLine(const AString & a_FirstLine) override;\n\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override;\n\tvirtual void OnHeadersFinished(void) override;\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override;\n\tvirtual void OnBodyFinished(void) override;\n\n\t// Overridable:\n\t/** Called to send raw data over the link. Descendants may provide data transformations (SSL etc.) */\n\tvirtual void SendData(const void * a_Data, size_t a_Size);\n\n\t/** Sends the raw data over the link.\n\tDescendants may provide data transformations (SSL etc.) via the overridable SendData() function. */\n\tvoid SendData(const AString & a_Data)\n\t{\n\t\tSendData(a_Data.data(), a_Data.size());\n\t}\n} ;\n\ntypedef std::vector<cHTTPServerConnection *> cHTTPServerConnections;\n\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/MultipartParser.cpp",
    "content": "\n// MultipartParser.cpp\n\n// Implements the cMultipartParser class that parses messages in \"multipart/*\" encoding into the separate parts\n\n#include \"Globals.h\"\n#include \"MultipartParser.h\"\n#include \"NameValueParser.h\"\n\n\n\n\n\n// Disable MSVC warnings:\n#if defined(_MSC_VER)\n\t#pragma warning(push)\n\t#pragma warning(disable:4355)  // 'this' : used in base member initializer list\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// self-test:\n\n#if 0\n\nclass cMultipartParserTest :\n\tpublic cMultipartParser::cCallbacks\n{\npublic:\n\tcMultipartParserTest(void)\n\t{\n\t\tcMultipartParser Parser(\"multipart/mixed; boundary=\\\"MyBoundaryString\\\"; foo=bar\", *this);\n\t\tconst char Data[] =\n\"ThisIsIgnoredPrologue\\r\\n\\\n--MyBoundaryString\\r\\n\\\n\\r\\n\\\nBody with confusing strings\\r\\n\\\n--NotABoundary\\r\\n\\\n--MyBoundaryStringWithPostfix\\r\\n\\\n--\\r\\n\\\n--MyBoundaryString\\r\\n\\\ncontent-disposition: inline\\r\\n\\\n\\r\\n\\\nThis is body\\r\\n\\\n--MyBoundaryString\\r\\n\\\n\\r\\n\\\nHeaderless body with trailing CRLF\\r\\n\\\n\\r\\n\\\n--MyBoundaryString--\\r\\n\\\nThisIsIgnoredEpilogue\";\n\t\tprintf(\"Multipart parsing test commencing.\\n\");\n\t\tParser.Parse(Data, sizeof(Data) - 1);\n\t\t// DEBUG: Check if the onscreen output corresponds with the data above\n\t\tprintf(\"Multipart parsing test finished\\n\");\n\t}\n\n\tvirtual void OnPartStart(void) override\n\t{\n\t\tprintf(\"Starting a new part\\n\");\n\t}\n\n\n\tvirtual void OnPartHeader(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\tprintf(\"  Hdr: \\\"%s\\\"=\\\"%s\\\"\\n\", a_Key.c_str(), a_Value.c_str());\n\t}\n\n\n\tvirtual void OnPartData(const char * a_Data, int a_Size) override\n\t{\n\t\tprintf(\"  Data: %d bytes, \\\"%.*s\\\"\\n\", a_Size, a_Size, a_Data);\n\t}\n\n\n\tvirtual void OnPartEnd(void) override\n\t{\n\t\tprintf(\"Part end\\n\");\n\t}\n} g_Test;\n\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMultipartParser:\n\n\ncMultipartParser::cMultipartParser(const AString & a_ContentType, cCallbacks & a_Callbacks) :\n\tm_Callbacks(a_Callbacks),\n\tm_IsValid(true),\n\tm_EnvelopeParser(*this),\n\tm_HasHadData(false)\n{\n\t// Check that the content type is multipart:\n\tAString ContentType(a_ContentType);\n\tif (strncmp(ContentType.c_str(), \"multipart/\", 10) != 0)\n\t{\n\t\tm_IsValid = false;\n\t\treturn;\n\t}\n\tsize_t idxSC = ContentType.find(';', 10);\n\tif (idxSC == AString::npos)\n\t{\n\t\tm_IsValid = false;\n\t\treturn;\n\t}\n\n\t// Find the multipart boundary:\n\tContentType.erase(0, idxSC + 1);\n\tcNameValueParser CTParser(ContentType.c_str(), ContentType.size());\n\tCTParser.Finish();\n\tif (!CTParser.IsValid())\n\t{\n\t\tm_IsValid = false;\n\t\treturn;\n\t}\n\tm_Boundary = CTParser[\"boundary\"];\n\tm_IsValid = !m_Boundary.empty();\n\tif (!m_IsValid)\n\t{\n\t\treturn;\n\t}\n\n\t// Set the envelope parser for parsing the body, so that our Parse() function parses the ignored prefix data as a body\n\tm_EnvelopeParser.SetIsInHeaders(false);\n\n\t// Append an initial CRLF to the incoming data, so that a body starting with the boundary line will get caught\n\tm_IncomingData.assign(\"\\r\\n\");\n\n\t/*\n\tm_Boundary = AString(\"\\r\\n--\") + m_Boundary\n\tm_BoundaryEnd = m_Boundary + \"--\\r\\n\";\n\tm_Boundary = m_Boundary + \"\\r\\n\";\n\t*/\n}\n\n\n\n\n\nvoid cMultipartParser::Parse(const char * a_Data, size_t a_Size)\n{\n\t// Skip parsing if invalid\n\tif (!m_IsValid)\n\t{\n\t\treturn;\n\t}\n\n\t// Append to buffer, then parse it:\n\tm_IncomingData.append(a_Data, a_Size);\n\tfor (;;)\n\t{\n\t\tif (m_EnvelopeParser.IsInHeaders())\n\t\t{\n\t\t\tsize_t BytesConsumed = m_EnvelopeParser.Parse(m_IncomingData.data(), m_IncomingData.size());\n\t\t\tif (BytesConsumed == AString::npos)\n\t\t\t{\n\t\t\t\tm_IsValid = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ((BytesConsumed == a_Size) && m_EnvelopeParser.IsInHeaders())\n\t\t\t{\n\t\t\t\t// All the incoming data has been consumed and still waiting for more\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tm_IncomingData.erase(0, BytesConsumed);\n\t\t}\n\n\t\t// Search for boundary / boundary end:\n\t\tsize_t idxBoundary = m_IncomingData.find(\"\\r\\n--\");\n\t\tif (idxBoundary == AString::npos)\n\t\t{\n\t\t\t// Boundary string start not present, present as much data to the part callback as possible\n\t\t\tif (m_IncomingData.size() > m_Boundary.size() + 8)\n\t\t\t{\n\t\t\t\tsize_t BytesToReport = m_IncomingData.size() - m_Boundary.size() - 8;\n\t\t\t\tm_Callbacks.OnPartData(m_IncomingData.data(), BytesToReport);\n\t\t\t\tm_IncomingData.erase(0, BytesToReport);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (idxBoundary > 0)\n\t\t{\n\t\t\tm_Callbacks.OnPartData(m_IncomingData.data(), idxBoundary);\n\t\t\tm_IncomingData.erase(0, idxBoundary);\n\t\t}\n\t\tidxBoundary = 4;\n\t\tsize_t LineEnd = m_IncomingData.find(\"\\r\\n\", idxBoundary);\n\t\tif (LineEnd == AString::npos)\n\t\t{\n\t\t\t// Not a complete line yet, present as much data to the part callback as possible\n\t\t\tif (m_IncomingData.size() > m_Boundary.size() + 8)\n\t\t\t{\n\t\t\t\tsize_t BytesToReport = m_IncomingData.size() - m_Boundary.size() - 8;\n\t\t\t\tm_Callbacks.OnPartData(m_IncomingData.data(), BytesToReport);\n\t\t\t\tm_IncomingData.erase(0, BytesToReport);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\t(LineEnd - idxBoundary != m_Boundary.size()) &&  // Line length not equal to boundary\n\t\t\t(LineEnd - idxBoundary != m_Boundary.size() + 2)  // Line length not equal to boundary end\n\t\t)\n\t\t{\n\t\t\t// Got a line, but it's not a boundary, report it as data:\n\t\t\tm_Callbacks.OnPartData(m_IncomingData.data(), LineEnd);\n\t\t\tm_IncomingData.erase(0, LineEnd);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (strncmp(m_IncomingData.c_str() + idxBoundary, m_Boundary.c_str(), m_Boundary.size()) == 0)\n\t\t{\n\t\t\t// Boundary or BoundaryEnd found:\n\t\t\tm_Callbacks.OnPartEnd();\n\t\t\tsize_t idxSlash = idxBoundary + m_Boundary.size();\n\t\t\tif ((m_IncomingData[idxSlash] == '-') && (m_IncomingData[idxSlash + 1] == '-'))\n\t\t\t{\n\t\t\t\t// This was the last part\n\t\t\t\tm_Callbacks.OnPartData(m_IncomingData.data() + idxSlash + 4, m_IncomingData.size() - idxSlash - 4);\n\t\t\t\tm_IncomingData.clear();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tm_Callbacks.OnPartStart();\n\t\t\tm_IncomingData.erase(0, LineEnd + 2);\n\n\t\t\t// Keep parsing for the headers that may have come with this data:\n\t\t\tm_EnvelopeParser.Reset();\n\t\t\tcontinue;\n\t\t}\n\n\t\t// It's a line, but not a boundary. It can be fully sent to the data receiver, since a boundary cannot cross lines\n\t\tm_Callbacks.OnPartData(m_IncomingData.c_str(), LineEnd);\n\t\tm_IncomingData.erase(0, LineEnd);\n\t}  // while (true)\n}\n\n\n\n\n\nvoid cMultipartParser::OnHeaderLine(const AString & a_Key, const AString & a_Value)\n{\n\tm_Callbacks.OnPartHeader(a_Key, a_Value);\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/MultipartParser.h",
    "content": "\n// MultipartParser.h\n\n// Declares the cMultipartParser class that parses messages in \"multipart/*\" encoding into the separate parts\n\n\n\n\n\n#pragma once\n\n#include \"EnvelopeParser.h\"\n\n\n\n\n\nclass cMultipartParser :\n\tprotected cEnvelopeParser::cCallbacks\n{\npublic:\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when a new part starts */\n\t\tvirtual void OnPartStart(void) = 0;\n\n\t\t/** Called when a complete header line is received for a part */\n\t\tvirtual void OnPartHeader(const AString & a_Key, const AString & a_Value) = 0;\n\n\t\t/** Called when body for a part is received */\n\t\tvirtual void OnPartData(const char * a_Data, size_t a_Size) = 0;\n\n\t\t/** Called when the current part ends */\n\t\tvirtual void OnPartEnd(void) = 0;\n\t} ;\n\n\t/** Creates the parser, expects to find the boundary in a_ContentType */\n\tcMultipartParser(const AString & a_ContentType, cCallbacks & a_Callbacks);\n\n\t/** Parses more incoming data */\n\tvoid Parse(const char * a_Data, size_t a_Size);\n\nprotected:\n\t/** The callbacks to call for various parsing events */\n\tcCallbacks & m_Callbacks;\n\n\t/** True if the data parsed so far is valid; if false, further parsing is skipped */\n\tbool m_IsValid;\n\n\t/** Parser for each part's envelope */\n\tcEnvelopeParser m_EnvelopeParser;\n\n\t/** Buffer for the incoming data until it is parsed */\n\tAString m_IncomingData;\n\n\t/** The boundary, excluding both the initial \"--\" and the terminating CRLF */\n\tAString m_Boundary;\n\n\t/** Set to true if some data for the current part has already been signalized to m_Callbacks. Used for proper CRLF inserting. */\n\tbool m_HasHadData;\n\n\n\t/** Parse one line of incoming data. The CRLF has already been stripped from a_Data / a_Size */\n\tvoid ParseLine(const char * a_Data, size_t a_Size);\n\n\t/** Parse one line of incoming data in the headers section of a part. The CRLF has already been stripped from a_Data / a_Size */\n\tvoid ParseHeaderLine(const char * a_Data, size_t a_Size);\n\n\t// cEnvelopeParser overrides:\n\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/NameValueParser.cpp",
    "content": "\n// NameValueParser.cpp\n\n// Implements the cNameValueParser class that parses strings in the \"name=value;name2=value2\" format into a stringmap\n\n#include \"Globals.h\"\n#include \"NameValueParser.h\"\n\n\n\n\n\n// DEBUG: Self-test\n\n#if 0\n\nclass cNameValueParserTest\n{\npublic:\n\tcNameValueParserTest(void)\n\t{\n\t\tconst char Data[] = \"   Name1=Value1;Name2 = Value 2; Name3 =\\\"Value 3\\\"; Name4 =\\'Value 4\\'; Name5=\\\"Confusing; isn\\'t it?\\\"\";\n\n\t\t// Now try parsing char-by-char, to debug transitions across datachunk boundaries:\n\t\tcNameValueParser Parser2;\n\t\tfor (size_t i = 0; i < sizeof(Data) - 1; i++)\n\t\t{\n\t\t\tParser2.Parse(Data + i, 1);\n\t\t}\n\t\tParser2.Finish();\n\n\t\t// Parse as a single chunk of data:\n\t\tcNameValueParser Parser(Data, sizeof(Data) - 1);\n\n\t\t// Use the debugger to inspect the Parser variable\n\n\t\t// Check that the two parsers have the same content:\n\t\tfor (cNameValueParser::const_iterator itr = Parser.begin(), end = Parser.end(); itr != end; ++itr)\n\t\t{\n\t\t\tASSERT(Parser2[itr->first] == itr->second);\n\t\t}  // for itr - Parser[]\n\n\t\t// Try parsing in 2-char chunks:\n\t\tcNameValueParser Parser3;\n\t\tfor (int i = 0; i < sizeof(Data) - 2; i += 2)\n\t\t{\n\t\t\tParser3.Parse(Data + i, 2);\n\t\t}\n\t\tif ((sizeof(Data) % 2) == 0)  // There are even number of chars, including the NUL, so the data has an odd length. Parse one more char\n\t\t{\n\t\t\tParser3.Parse(Data + sizeof(Data) - 2, 1);\n\t\t}\n\t\tParser3.Finish();\n\n\t\t// Check that the third parser has the same content:\n\t\tfor (cNameValueParser::const_iterator itr = Parser.begin(), end = Parser.end(); itr != end; ++itr)\n\t\t{\n\t\t\tASSERT(Parser3[itr->first] == itr->second);\n\t\t}  // for itr - Parser[]\n\n\t\tprintf(\"cNameValueParserTest done\");\n\t}\n} g_Test;\n\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNameValueParser:\n\ncNameValueParser::cNameValueParser(bool a_AllowsKeyOnly) :\n\tm_State(psKeySpace),\n\tm_AllowsKeyOnly(a_AllowsKeyOnly)\n{\n}\n\n\n\n\n\ncNameValueParser::cNameValueParser(const char * a_Data, size_t a_Size, bool a_AllowsKeyOnly) :\n\tm_State(psKeySpace),\n\tm_AllowsKeyOnly(a_AllowsKeyOnly)\n{\n\tParse(a_Data, a_Size);\n}\n\n\n\n\n\nvoid cNameValueParser::Parse(const char * a_Data, size_t a_Size)\n{\n\tASSERT(m_State != psFinished);  // Calling Parse() after Finish() is wrong!\n\n\tsize_t Last = 0;\n\tfor (size_t i = 0; i < a_Size;)\n\t{\n\t\tswitch (m_State)\n\t\t{\n\t\t\tcase psInvalid:\n\t\t\tcase psFinished:\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase psKeySpace:\n\t\t\t{\n\t\t\t\t// Skip whitespace until a non-whitespace is found, then start the key:\n\t\t\t\twhile ((i < a_Size) && (a_Data[i] <= ' '))\n\t\t\t\t{\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tif ((i < a_Size) && (a_Data[i] > ' '))\n\t\t\t\t{\n\t\t\t\t\tm_State = psKey;\n\t\t\t\t\tLast = i;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase psKey:\n\t\t\t{\n\t\t\t\t// Read the key until whitespace or an equal sign:\n\t\t\t\twhile (i < a_Size)\n\t\t\t\t{\n\t\t\t\t\tif (a_Data[i] == '=')\n\t\t\t\t\t{\n\t\t\t\t\t\tm_CurrentKey.append(a_Data + Last, i - Last);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tm_State = psEqual;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (a_Data[i] <= ' ')\n\t\t\t\t\t{\n\t\t\t\t\t\tm_CurrentKey.append(a_Data + Last, i - Last);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tm_State = psEqualSpace;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (a_Data[i] == ';')\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!m_AllowsKeyOnly)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_State = psInvalid;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tm_CurrentKey.append(a_Data + Last, i - Last);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\t(*this)[m_CurrentKey] = \"\";\n\t\t\t\t\t\tm_CurrentKey.clear();\n\t\t\t\t\t\tm_State = psKeySpace;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if ((a_Data[i] == '\\\"') || (a_Data[i] == '\\''))\n\t\t\t\t\t{\n\t\t\t\t\t\tm_State = psInvalid;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}  // while (i < a_Size)\n\t\t\t\tif (i == a_Size)\n\t\t\t\t{\n\t\t\t\t\t// Still the key, ran out of data to parse, store the part of the key parsed so far:\n\t\t\t\t\tm_CurrentKey.append(a_Data + Last, a_Size - Last);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase psEqualSpace:\n\t\t\t{\n\t\t\t\t// The space before the expected equal sign; the current key is already assigned\n\t\t\t\twhile (i < a_Size)\n\t\t\t\t{\n\t\t\t\t\tif (a_Data[i] == '=')\n\t\t\t\t\t{\n\t\t\t\t\t\tm_State = psEqual;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (a_Data[i] == ';')\n\t\t\t\t\t{\n\t\t\t\t\t\t// Key-only\n\t\t\t\t\t\tif (!m_AllowsKeyOnly)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_State = psInvalid;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\t(*this)[m_CurrentKey] = \"\";\n\t\t\t\t\t\tm_CurrentKey.clear();\n\t\t\t\t\t\tm_State = psKeySpace;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (a_Data[i] > ' ')\n\t\t\t\t\t{\n\t\t\t\t\t\tm_State = psInvalid;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}  // while (i < a_Size)\n\t\t\t\tbreak;\n\t\t\t}  // case psEqualSpace\n\n\t\t\tcase psEqual:\n\t\t\t{\n\t\t\t\t// just parsed the equal-sign\n\t\t\t\twhile (i < a_Size)\n\t\t\t\t{\n\t\t\t\t\tif (a_Data[i] == ';')\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!m_AllowsKeyOnly)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_State = psInvalid;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\t(*this)[m_CurrentKey] = \"\";\n\t\t\t\t\t\tm_CurrentKey.clear();\n\t\t\t\t\t\tm_State = psKeySpace;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (a_Data[i] == '\\\"')\n\t\t\t\t\t{\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tm_State = psValueInDQuotes;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (a_Data[i] == '\\'')\n\t\t\t\t\t{\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tm_State = psValueInSQuotes;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tm_CurrentValue.push_back(a_Data[i]);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tm_State = psValueRaw;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}  // while (i < a_Size)\n\t\t\t\tbreak;\n\t\t\t}  // case psEqual\n\n\t\t\tcase psValueInDQuotes:\n\t\t\t{\n\t\t\t\twhile (i < a_Size)\n\t\t\t\t{\n\t\t\t\t\tif (a_Data[i] == '\\\"')\n\t\t\t\t\t{\n\t\t\t\t\t\tm_CurrentValue.append(a_Data + Last, i - Last);\n\t\t\t\t\t\t(*this)[m_CurrentKey] = m_CurrentValue;\n\t\t\t\t\t\tm_CurrentKey.clear();\n\t\t\t\t\t\tm_CurrentValue.clear();\n\t\t\t\t\t\tm_State = psAfterValue;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}  // while (i < a_Size)\n\t\t\t\tif (i == a_Size)\n\t\t\t\t{\n\t\t\t\t\tm_CurrentValue.append(a_Data + Last, a_Size - Last);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}  // case psValueInDQuotes\n\n\t\t\tcase psValueInSQuotes:\n\t\t\t{\n\t\t\t\twhile (i < a_Size)\n\t\t\t\t{\n\t\t\t\t\tif (a_Data[i] == '\\'')\n\t\t\t\t\t{\n\t\t\t\t\t\tm_CurrentValue.append(a_Data + Last, i - Last);\n\t\t\t\t\t\t(*this)[m_CurrentKey] = m_CurrentValue;\n\t\t\t\t\t\tm_CurrentKey.clear();\n\t\t\t\t\t\tm_CurrentValue.clear();\n\t\t\t\t\t\tm_State = psAfterValue;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}  // while (i < a_Size)\n\t\t\t\tif (i == a_Size)\n\t\t\t\t{\n\t\t\t\t\tm_CurrentValue.append(a_Data + Last, a_Size - Last);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}  // case psValueInSQuotes\n\n\t\t\tcase psValueRaw:\n\t\t\t{\n\t\t\t\twhile (i < a_Size)\n\t\t\t\t{\n\t\t\t\t\tif (a_Data[i] == ';')\n\t\t\t\t\t{\n\t\t\t\t\t\tm_CurrentValue.append(a_Data + Last, i - Last);\n\t\t\t\t\t\t(*this)[m_CurrentKey] = m_CurrentValue;\n\t\t\t\t\t\tm_CurrentKey.clear();\n\t\t\t\t\t\tm_CurrentValue.clear();\n\t\t\t\t\t\tm_State = psKeySpace;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tif (i == a_Size)\n\t\t\t\t{\n\t\t\t\t\tm_CurrentValue.append(a_Data + Last, a_Size - Last);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}  // case psValueRaw\n\n\t\t\tcase psAfterValue:\n\t\t\t{\n\t\t\t\t// Between the closing DQuote or SQuote and the terminating semicolon\n\t\t\t\twhile (i < a_Size)\n\t\t\t\t{\n\t\t\t\t\tif (a_Data[i] == ';')\n\t\t\t\t\t{\n\t\t\t\t\t\tm_State = psKeySpace;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tLast = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (a_Data[i] < ' ')\n\t\t\t\t\t{\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tm_State = psInvalid;\n\t\t\t\t\treturn;\n\t\t\t\t}  // while (i < a_Size)\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (m_State)\n\t}  // for i - a_Data[]\n}\n\n\n\n\n\nbool cNameValueParser::Finish(void)\n{\n\tswitch (m_State)\n\t{\n\t\tcase psInvalid:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tcase psFinished:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tcase psKey:\n\t\tcase psEqualSpace:\n\t\tcase psEqual:\n\t\t{\n\t\t\tif ((m_AllowsKeyOnly) && !m_CurrentKey.empty())\n\t\t\t{\n\t\t\t\t(*this)[m_CurrentKey] = \"\";\n\t\t\t\tm_State = psFinished;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tm_State = psInvalid;\n\t\t\treturn false;\n\t\t}\n\t\tcase psValueRaw:\n\t\t{\n\t\t\t(*this)[m_CurrentKey] = m_CurrentValue;\n\t\t\tm_State = psFinished;\n\t\t\treturn true;\n\t\t}\n\t\tcase psValueInDQuotes:\n\t\tcase psValueInSQuotes:\n\t\t{\n\t\t\t// Missing the terminating quotes, this is an error\n\t\t\tm_State = psInvalid;\n\t\t\treturn false;\n\t\t}\n\t\tcase psKeySpace:\n\t\tcase psAfterValue:\n\t\t{\n\t\t\tm_State = psFinished;\n\t\t\treturn true;\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported name value parser state\");\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/NameValueParser.h",
    "content": "\n// NameValueParser.h\n\n// Declares the cNameValueParser class that parses strings in the \"name=value;name2=value2\" format into a stringmap\n\n\n\n\n\n#pragma once\n\n\n\n\n\nclass cNameValueParser :\n\tpublic std::map<AString, AString>\n{\npublic:\n\t/** Creates an empty parser */\n\tcNameValueParser(bool a_AllowsKeyOnly = true);\n\n\t/** Creates an empty parser, then parses the data given. Doesn't call Finish(), so more data can be parsed later */\n\tcNameValueParser(const char * a_Data, size_t a_Size, bool a_AllowsKeyOnly = true);\n\n\t/** Parses the data given */\n\tvoid Parse(const char * a_Data, size_t a_Size);\n\n\t/** Notifies the parser that no more data will be coming. Returns true if the parser state is valid */\n\tbool Finish(void);\n\n\t/** Returns true if the data parsed so far was valid */\n\tbool IsValid(void) const { return (m_State != psInvalid); }\n\n\t/** Returns true if the parser expects no more data */\n\tbool IsFinished(void) const { return ((m_State == psInvalid) || (m_State == psFinished)); }\n\nprotected:\n\tenum eState\n\t{\n\t\tpsKeySpace,        ///< Parsing the space in front of the next key\n\t\tpsKey,             ///< Currently adding more chars to the key in m_CurrentKey\n\t\tpsEqualSpace,      ///< Space after m_CurrentKey\n\t\tpsEqual,           ///< Just parsed the = sign after a name\n\t\tpsValueInSQuotes,  ///< Just parsed a Single-quote sign after the Equal sign\n\t\tpsValueInDQuotes,  ///< Just parsed a Double-quote sign after the Equal sign\n\t\tpsValueRaw,        ///< Just parsed a raw value without a quote\n\t\tpsAfterValue,      ///< Just finished parsing the value, waiting for semicolon or data end\n\t\tpsInvalid,         ///< The parser has encountered an invalid input; further parsing is skipped\n\t\tpsFinished,        ///< The parser has already been instructed to finish and doesn't expect any more data\n\t} ;\n\n\t/** The current state of the parser */\n\teState m_State;\n\n\t/** If true, the parser will accept keys without an equal sign and the value */\n\tbool m_AllowsKeyOnly;\n\n\t/** Buffer for the current Key */\n\tAString m_CurrentKey;\n\n\t/** Buffer for the current Value; */\n\tAString m_CurrentValue;\n\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/SslHTTPServerConnection.cpp",
    "content": "\n// SslHTTPConnection.cpp\n\n// Implements the cSslHTTPServerConnection class representing a HTTP connection made over a SSL link\n\n#include \"Globals.h\"\n#include \"SslHTTPServerConnection.h\"\n#include \"HTTPServer.h\"\n\n\n\n\n\ncSslHTTPServerConnection::cSslHTTPServerConnection(\n\tcHTTPServer & a_HTTPServer, const std::shared_ptr<const cSslConfig> & a_Config\n):\n\tSuper(a_HTTPServer),\n\tm_Ssl(64000)\n{\n\tif (a_Config != nullptr)\n\t{\n\t\tm_Ssl.Initialize(a_Config);\n\t}\n\telse\n\t{\n\t\tm_Ssl.Initialize(false);\n\t}\n}\n\n\n\n\n\ncSslHTTPServerConnection::~cSslHTTPServerConnection()\n{\n\tm_Ssl.NotifyClose();\n}\n\n\n\n\n\nvoid cSslHTTPServerConnection::OnReceivedData(const char * a_Data, size_t a_Size)\n{\n\t// Process the received data:\n\tconst char * Data = a_Data;\n\tsize_t Size = a_Size;\n\tfor (;;)\n\t{\n\t\t// Try to write as many bytes into Ssl's \"incoming\" buffer as possible:\n\t\tsize_t BytesWritten = 0;\n\t\tif (Size > 0)\n\t\t{\n\t\t\tBytesWritten = m_Ssl.WriteIncoming(Data, Size);\n\t\t\tData += BytesWritten;\n\t\t\tSize -= BytesWritten;\n\t\t}\n\n\t\t// Try to read as many bytes from SSL's decryption as possible:\n\t\tchar Buffer[32000];\n\t\tint NumRead = m_Ssl.ReadPlain(Buffer, sizeof(Buffer));\n\t\tif (NumRead > 0)\n\t\t{\n\t\t\tSuper::OnReceivedData(Buffer, static_cast<size_t>(NumRead));\n\t\t\t// The link may have closed while processing the data, bail out:\n\t\t\treturn;\n\t\t}\n\t\telse if (NumRead == MBEDTLS_ERR_SSL_WANT_READ)\n\t\t{\n\t\t\t// SSL requires us to send data to peer first, do so by \"sending\" empty data:\n\t\t\tSendData(nullptr, 0);\n\t\t}\n\n\t\t// If both failed, bail out:\n\t\tif ((BytesWritten == 0) && (NumRead <= 0))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSslHTTPServerConnection::SendData(const void * a_Data, size_t a_Size)\n{\n\tconst char * OutgoingData = static_cast<const char *>(a_Data);\n\tsize_t pos = 0;\n\tfor (;;)\n\t{\n\t\t// Write as many bytes from our buffer to SSL's encryption as possible:\n\t\tint NumWritten = 0;\n\t\tif (pos < a_Size)\n\t\t{\n\t\t\tNumWritten = m_Ssl.WritePlain(OutgoingData + pos, a_Size - pos);\n\t\t\tif (NumWritten > 0)\n\t\t\t{\n\t\t\t\tpos += static_cast<size_t>(NumWritten);\n\t\t\t}\n\t\t}\n\n\t\t// Read as many bytes from SSL's \"outgoing\" buffer as possible:\n\t\tchar Buffer[32000];\n\t\tsize_t NumBytes = m_Ssl.ReadOutgoing(Buffer, sizeof(Buffer));\n\t\tif (NumBytes > 0)\n\t\t{\n\t\t\tm_Link->Send(Buffer, NumBytes);\n\t\t}\n\n\t\t// If both failed, bail out:\n\t\tif ((NumWritten <= 0) && (NumBytes == 0))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/SslHTTPServerConnection.h",
    "content": "\n// SslHTTPServerConnection.h\n\n// Declares the cSslHTTPServerConnection class representing a HTTP connection made over an SSL link\n\n\n\n\n\n#pragma once\n\n#include \"HTTPServerConnection.h\"\n#include \"../mbedTLS++/BufferedSslContext.h\"\n\n\n\n\n\nclass cSslHTTPServerConnection:\n\tpublic cHTTPServerConnection\n{\n\tusing Super = cHTTPServerConnection;\n\npublic:\n\n\t/** Creates a new connection on the specified server.\n\tSends the specified cert as the server certificate, uses the private key for decryption. */\n\tcSslHTTPServerConnection(cHTTPServer & a_HTTPServer, const std::shared_ptr<const cSslConfig> & a_Config);\n\n\tvirtual ~cSslHTTPServerConnection() override;\n\nprotected:\n\tcBufferedSslContext m_Ssl;\n\n\t// cHTTPConnection overrides:\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Size) override;  // Data is received from the client\n\tvirtual void SendData(const void * a_Data, size_t a_Size) override;  // Data is to be sent to client\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/TransferEncodingParser.cpp",
    "content": "\n// TransferEncodingParser.cpp\n\n// Implements the cTransferEncodingParser class and its descendants representing the parsers for the various transfer encodings (chunked etc.)\n\n#include \"Globals.h\"\n#include \"TransferEncodingParser.h\"\n#include \"EnvelopeParser.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cChunkedTEParser:\n\nclass cChunkedTEParser:\n\tpublic cTransferEncodingParser,\n\tpublic cEnvelopeParser::cCallbacks\n{\n\tusing Super = cTransferEncodingParser;\n\npublic:\n\n\tcChunkedTEParser(Super::cCallbacks & a_Callbacks):\n\t\tSuper(a_Callbacks),\n\t\tm_State(psChunkLength),\n\t\tm_ChunkDataLengthLeft(0),\n\t\tm_TrailerParser(*this)\n\t{\n\t}\n\n\nprotected:\n\tenum eState\n\t{\n\t\tpsChunkLength,         ///< Parsing the chunk length hex number\n\t\tpsChunkLengthTrailer,  ///< Any trailer (chunk extension) specified after the chunk length\n\t\tpsChunkLengthLF,       ///< The LF character after the CR character terminating the chunk length\n\t\tpsChunkData,           ///< Relaying chunk data\n\t\tpsChunkDataCR,         ///< Skipping the extra CR character after chunk data\n\t\tpsChunkDataLF,         ///< Skipping the extra LF character after chunk data\n\t\tpsTrailer,             ///< Received an empty chunk, parsing the trailer (through the envelope parser)\n\t\tpsFinished,            ///< The parser has finished parsing, either successfully or with an error\n\t};\n\n\t/** The current state of the parser (parsing chunk length / chunk data). */\n\teState m_State;\n\n\t/** Number of bytes that still belong to the chunk currently being parsed.\n\tWhen in psChunkLength, the value is the currently parsed length digits. */\n\tsize_t m_ChunkDataLengthLeft;\n\n\t/** The parser used for the last (empty) chunk's trailer data */\n\tcEnvelopeParser m_TrailerParser;\n\n\n\t/** Calls the OnError callback and sets parser state to finished. */\n\tvoid Error(const AString & a_ErrorMsg)\n\t{\n\t\tm_State = psFinished;\n\t\tm_Callbacks.OnError(a_ErrorMsg);\n\t}\n\n\n\t/** Parses the incoming data, the current state is psChunkLength.\n\tStops parsing when either the chunk length has been read, or there is no more data in the input.\n\tReturns the number of bytes consumed from the input, or AString::npos on error (calls the Error handler). */\n\tsize_t ParseChunkLength(const char * a_Data, size_t a_Size)\n\t{\n\t\t// Expected input: <hexnumber>[;<trailer>]<CR><LF>\n\t\t// Only the hexnumber is parsed into m_ChunkDataLengthLeft, the rest is postponed into psChunkLengthTrailer or psChunkLengthLF\n\t\tfor (size_t i = 0; i < a_Size; i++)\n\t\t{\n\t\t\tswitch (a_Data[i])\n\t\t\t{\n\t\t\t\tcase '0':\n\t\t\t\tcase '1':\n\t\t\t\tcase '2':\n\t\t\t\tcase '3':\n\t\t\t\tcase '4':\n\t\t\t\tcase '5':\n\t\t\t\tcase '6':\n\t\t\t\tcase '7':\n\t\t\t\tcase '8':\n\t\t\t\tcase '9':\n\t\t\t\t{\n\t\t\t\t\tm_ChunkDataLengthLeft = m_ChunkDataLengthLeft * 16 + static_cast<decltype(m_ChunkDataLengthLeft)>(a_Data[i] - '0');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'a':\n\t\t\t\tcase 'b':\n\t\t\t\tcase 'c':\n\t\t\t\tcase 'd':\n\t\t\t\tcase 'e':\n\t\t\t\tcase 'f':\n\t\t\t\t{\n\t\t\t\t\tm_ChunkDataLengthLeft = m_ChunkDataLengthLeft * 16 + static_cast<decltype(m_ChunkDataLengthLeft)>(a_Data[i] - 'a' + 10);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'A':\n\t\t\t\tcase 'B':\n\t\t\t\tcase 'C':\n\t\t\t\tcase 'D':\n\t\t\t\tcase 'E':\n\t\t\t\tcase 'F':\n\t\t\t\t{\n\t\t\t\t\tm_ChunkDataLengthLeft = m_ChunkDataLengthLeft * 16 + static_cast<decltype(m_ChunkDataLengthLeft)>(a_Data[i] - 'A' + 10);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase '\\r':\n\t\t\t\t{\n\t\t\t\t\tm_State = psChunkLengthLF;\n\t\t\t\t\treturn i + 1;\n\t\t\t\t}\n\t\t\t\tcase ';':\n\t\t\t\t{\n\t\t\t\t\tm_State = psChunkLengthTrailer;\n\t\t\t\t\treturn i + 1;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tError(fmt::format(FMT_STRING(\"Invalid character in chunk length line: 0x{:02x}\"), a_Data[i]));\n\t\t\t\t\treturn AString::npos;\n\t\t\t\t}\n\t\t\t}  // switch (a_Data[i])\n\t\t}  // for i - a_Data[]\n\t\treturn a_Size;\n\t}\n\n\n\t/** Parses the incoming data, the current state is psChunkLengthTrailer.\n\tStops parsing when either the chunk length trailer has been read, or there is no more data in the input.\n\tReturns the number of bytes consumed from the input, or AString::npos on error (calls the Error handler). */\n\tsize_t ParseChunkLengthTrailer(const char * a_Data, size_t a_Size)\n\t{\n\t\t// Expected input: <trailer><CR><LF>\n\t\t// The LF itself is not parsed, it is instead postponed into psChunkLengthLF\n\t\tfor (size_t i = 0; i < a_Size; i++)\n\t\t{\n\t\t\tswitch (a_Data[i])\n\t\t\t{\n\t\t\t\tcase '\\r':\n\t\t\t\t{\n\t\t\t\t\tm_State = psChunkLengthLF;\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tif (a_Data[i] < 32)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Only printable characters are allowed in the trailer\n\t\t\t\t\t\tError(fmt::format(FMT_STRING(\"Invalid character in chunk length line: 0x{:02x}\"), a_Data[i]));\n\t\t\t\t\t\treturn AString::npos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}  // switch (a_Data[i])\n\t\t}  // for i - a_Data[]\n\t\treturn a_Size;\n\t}\n\n\n\t/** Parses the incoming data, the current state is psChunkLengthLF.\n\tOnly the LF character is expected, if found, moves to psChunkData, otherwise issues an error.\n\tIf the chunk length that just finished reading is equal to 0, signals the end of stream (via psTrailer).\n\tReturns the number of bytes consumed from the input, or AString::npos on error (calls the Error handler). */\n\tsize_t ParseChunkLengthLF(const char * a_Data, size_t a_Size)\n\t{\n\t\t// Expected input: <LF>\n\t\tif (a_Size == 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tif (a_Data[0] == '\\n')\n\t\t{\n\t\t\tif (m_ChunkDataLengthLeft == 0)\n\t\t\t{\n\t\t\t\tm_State = psTrailer;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_State = psChunkData;\n\t\t\t}\n\t\t\treturn 1;\n\t\t}\n\t\tError(fmt::format(FMT_STRING(\"Invalid character past chunk length's CR: 0x{:02x}\"), a_Data[0]));\n\t\treturn AString::npos;\n\t}\n\n\n\t/** Consumes as much chunk data from the input as possible.\n\tReturns the number of bytes consumed from the input, or AString::npos on error (calls the Error() handler). */\n\tsize_t ParseChunkData(const char * a_Data, size_t a_Size)\n\t{\n\t\tASSERT(m_ChunkDataLengthLeft > 0);\n\t\tauto bytes = std::min(a_Size, m_ChunkDataLengthLeft);\n\t\tm_ChunkDataLengthLeft -= bytes;\n\t\tm_Callbacks.OnBodyData(a_Data, bytes);\n\t\tif (m_ChunkDataLengthLeft == 0)\n\t\t{\n\t\t\tm_State = psChunkDataCR;\n\t\t}\n\t\treturn bytes;\n\t}\n\n\n\t/** Parses the incoming data, the current state is psChunkDataCR.\n\tOnly the CR character is expected, if found, moves to psChunkDataLF, otherwise issues an error.\n\tReturns the number of bytes consumed from the input, or AString::npos on error (calls the Error handler). */\n\tsize_t ParseChunkDataCR(const char * a_Data, size_t a_Size)\n\t{\n\t\t// Expected input: <CR>\n\t\tif (a_Size == 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tif (a_Data[0] == '\\r')\n\t\t{\n\t\t\tm_State = psChunkDataLF;\n\t\t\treturn 1;\n\t\t}\n\t\tError(fmt::format(FMT_STRING(\"Invalid character past chunk data: 0x{:02x}\"), a_Data[0]));\n\t\treturn AString::npos;\n\t}\n\n\n\n\n\t/** Parses the incoming data, the current state is psChunkDataCR.\n\tOnly the CR character is expected, if found, moves to psChunkDataLF, otherwise issues an error.\n\tReturns the number of bytes consumed from the input, or AString::npos on error (calls the Error handler). */\n\tsize_t ParseChunkDataLF(const char * a_Data, size_t a_Size)\n\t{\n\t\t// Expected input: <LF>\n\t\tif (a_Size == 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tif (a_Data[0] == '\\n')\n\t\t{\n\t\t\tm_State = psChunkLength;\n\t\t\treturn 1;\n\t\t}\n\t\tError(fmt::format(FMT_STRING(\"Invalid character past chunk data's CR: 0x{:02x}\"), a_Data[0]));\n\t\treturn AString::npos;\n\t}\n\n\n\t/** Parses the incoming data, the current state is psChunkDataCR.\n\tThe trailer is normally a set of \"Header: Value\" lines, terminated by an empty line. Use the m_TrailerParser for that.\n\tReturns the number of bytes consumed from the input, or AString::npos on error (calls the Error handler). */\n\tsize_t ParseTrailer(const char * a_Data, size_t a_Size)\n\t{\n\t\tauto res = m_TrailerParser.Parse(a_Data, a_Size);\n\t\tif (res == AString::npos)\n\t\t{\n\t\t\tError(\"Error while parsing the trailer\");\n\t\t}\n\t\tif ((res < a_Size) || !m_TrailerParser.IsInHeaders())\n\t\t{\n\t\t\tm_Callbacks.OnBodyFinished();\n\t\t\tm_State = psFinished;\n\t\t}\n\t\treturn res;\n\t}\n\n\n\t// cTransferEncodingParser overrides:\n\tvirtual size_t Parse(const char * a_Data, size_t a_Size) override\n\t{\n\t\twhile ((a_Size > 0) && (m_State != psFinished))\n\t\t{\n\t\t\tsize_t consumed = 0;\n\t\t\tswitch (m_State)\n\t\t\t{\n\t\t\t\tcase psChunkLength:        consumed = ParseChunkLength       (a_Data, a_Size); break;\n\t\t\t\tcase psChunkLengthTrailer: consumed = ParseChunkLengthTrailer(a_Data, a_Size); break;\n\t\t\t\tcase psChunkLengthLF:      consumed = ParseChunkLengthLF     (a_Data, a_Size); break;\n\t\t\t\tcase psChunkData:          consumed = ParseChunkData         (a_Data, a_Size); break;\n\t\t\t\tcase psChunkDataCR:        consumed = ParseChunkDataCR       (a_Data, a_Size); break;\n\t\t\t\tcase psChunkDataLF:        consumed = ParseChunkDataLF       (a_Data, a_Size); break;\n\t\t\t\tcase psTrailer:            consumed = ParseTrailer           (a_Data, a_Size); break;\n\t\t\t\tcase psFinished:           consumed = 0;                                       break;  // Not supposed to happen, but Clang complains without it\n\t\t\t}\n\t\t\tif (consumed == AString::npos)\n\t\t\t{\n\t\t\t\treturn AString::npos;\n\t\t\t}\n\t\t\ta_Data += consumed;\n\t\t\ta_Size -= consumed;\n\t\t}\n\t\treturn a_Size;\n\t}\n\n\tvirtual void Finish() override\n\t{\n\t\tif (m_State != psFinished)\n\t\t{\n\t\t\tError(fmt::format(FMT_STRING(\"ChunkedTransferEncoding: Finish signal received before the data stream ended (state: {})\"), m_State));\n\t\t}\n\t\tm_State = psFinished;\n\t}\n\n\n\t// cEnvelopeParser::cCallbacks overrides:\n\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\t// Ignored\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cIdentityTEParser:\n\nclass cIdentityTEParser:\n\tpublic cTransferEncodingParser\n{\n\tusing Super = cTransferEncodingParser;\n\npublic:\n\n\tcIdentityTEParser(cCallbacks & a_Callbacks, size_t a_ContentLength):\n\t\tSuper(a_Callbacks),\n\t\tm_BytesLeft(a_ContentLength)\n\t{\n\t}\n\n\nprotected:\n\t/** How many bytes of content are left before the message ends. */\n\tsize_t m_BytesLeft;\n\n\t// cTransferEncodingParser overrides:\n\tvirtual size_t Parse(const char * a_Data, size_t a_Size) override\n\t{\n\t\tauto size = std::min(a_Size, m_BytesLeft);\n\t\tif (size > 0)\n\t\t{\n\t\t\tm_Callbacks.OnBodyData(a_Data, size);\n\t\t}\n\t\tm_BytesLeft -= size;\n\t\tif (m_BytesLeft == 0)\n\t\t{\n\t\t\tm_Callbacks.OnBodyFinished();\n\t\t}\n\t\treturn a_Size - size;\n\t}\n\n\tvirtual void Finish(void) override\n\t{\n\t\tif (m_BytesLeft > 0)\n\t\t{\n\t\t\tm_Callbacks.OnError(\"IdentityTransferEncoding: body was truncated\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BodyFinished has already been called, just bail out\n\t\t}\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cTransferEncodingParser:\n\ncTransferEncodingParserPtr cTransferEncodingParser::Create(\n\tcCallbacks & a_Callbacks,\n\tconst AString & a_TransferEncoding,\n\tsize_t a_ContentLength\n)\n{\n\tif (a_TransferEncoding == \"chunked\")\n\t{\n\t\treturn std::make_shared<cChunkedTEParser>(a_Callbacks);\n\t}\n\tif (a_TransferEncoding == \"identity\")\n\t{\n\t\treturn std::make_shared<cIdentityTEParser>(a_Callbacks, a_ContentLength);\n\t}\n\tif (a_TransferEncoding.empty())\n\t{\n\t\treturn std::make_shared<cIdentityTEParser>(a_Callbacks, a_ContentLength);\n\t}\n\treturn nullptr;\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/TransferEncodingParser.h",
    "content": "\n// TransferEncodingParser.h\n\n// Declares the cTransferEncodingParser class representing the parser for the various transfer encodings (chunked etc.)\n\n#pragma once\n\n\n\n\n\n// fwd:\nclass cTransferEncodingParser;\ntypedef std::shared_ptr<cTransferEncodingParser> cTransferEncodingParserPtr;\n\n\n\n\n\n/** Used as both the interface that all the parsers share and the (static) factory creating such parsers. */\nclass cTransferEncodingParser\n{\npublic:\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when an error has occured while parsing. */\n\t\tvirtual void OnError(const AString & a_ErrorDescription) = 0;\n\n\t\t/** Called for each chunk of the incoming body data. */\n\t\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) = 0;\n\n\t\t/** Called when the entire body has been reported by OnBodyData(). */\n\t\tvirtual void OnBodyFinished(void) = 0;\n\t};\n\n\n\t// Force a virtual destructor in all descendants\n\tvirtual ~cTransferEncodingParser() {}\n\n\t/** Parses the incoming data and calls the appropriate callbacks.\n\tReturns the number of bytes from the end of a_Data that is already not part of this message (if the parser can detect it).\n\tReturns AString::npos on an error. */\n\tvirtual size_t Parse(const char * a_Data, size_t a_Size) = 0;\n\n\t/** To be called when the stream is terminated from the source (connection closed).\n\tFlushes any buffers and calls appropriate callbacks. */\n\tvirtual void Finish(void) = 0;\n\n\t/** Creates a new parser for the specified encoding.\n\tIf the encoding is not known, returns a nullptr.\n\ta_ContentLength is the length of the content, received in a Content-Length header.\n\tIt is used for the Identity encoding, it is ignored for the Chunked encoding. */\n\tstatic cTransferEncodingParserPtr Create(\n\t\tcCallbacks & a_Callbacks,\n\t\tconst AString & a_TransferEncoding,\n\t\tsize_t a_ContentLength\n\t);\n\nprotected:\n\t/** The callbacks used to report progress. */\n\tcCallbacks & m_Callbacks;\n\n\n\tcTransferEncodingParser(cCallbacks & a_Callbacks):\n\t\tm_Callbacks(a_Callbacks)\n\t{\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/UrlClient.cpp",
    "content": "\n// UrlClient.cpp\n\n// Implements the cUrlClient class for high-level URL interaction\n\n#include \"Globals.h\"\n\n#include \"HTTP/UrlClient.h\"\n#include \"HTTP/UrlParser.h\"\n#include \"HTTP/HTTPMessageParser.h\"\n#include \"mbedTLS++/X509Cert.h\"\n#include \"mbedTLS++/CryptoKey.h\"\n\n\n\n\n\n// fwd:\nclass cSchemeHandler;\nusing cSchemeHandlerPtr = std::shared_ptr<cSchemeHandler>;\n\n\n\n\n\nnamespace\n{\n\t/** Callbacks implementing the blocking UrlClient behavior. */\n\tclass cBlockingHTTPCallbacks :\n\t\tpublic cUrlClient::cCallbacks\n\t{\n\tpublic:\n\n\t\texplicit cBlockingHTTPCallbacks(std::shared_ptr<cEvent> a_Event, AString & a_ResponseBody) :\n\t\t\tm_Event(std::move(a_Event)), m_ResponseBody(a_ResponseBody),\n\t\t\tm_IsError(false)\n\t\t{\n\t\t}\n\n\t\tvoid OnBodyFinished() override\n\t\t{\n\t\t\tm_Event->Set();\n\t\t}\n\n\t\tvoid OnError(const AString & a_ErrorMsg) override\n\t\t{\n\t\t\tLOGERROR(\"%s %d: HTTP Error: %s\", __FILE__, __LINE__, a_ErrorMsg.c_str());\n\t\t\tm_IsError = true;\n\t\t\tm_Event->Set();\n\t\t}\n\n\t\tvoid OnBodyData(const void * a_Data, size_t a_Size) override\n\t\t{\n\t\t\tm_ResponseBody.append(static_cast<const char *>(a_Data), a_Size);\n\t\t}\n\n\t\tstd::shared_ptr<cEvent> m_Event;\n\n\t\t/** The accumulator for the partial body data, so that OnBodyFinished() can send the entire thing at once. */\n\t\tAString & m_ResponseBody;\n\n\t\t/** Indicates whether an error was encountered while processing the request. */\n\t\tbool m_IsError;\n\t};\n}\n\n\n\n\n\nclass cUrlClientRequest:\n\tpublic cNetwork::cConnectCallbacks,\n\tpublic cTCPLink::cCallbacks\n{\n\tfriend class cHttpSchemeHandler;\n\npublic:\n\tstatic std::pair<bool, AString> Request(\n\t\tconst AString & a_Method,\n\t\tconst AString & a_URL,\n\t\tcUrlClient::cCallbacksPtr && a_Callbacks,\n\t\tAStringMap && a_Headers,\n\t\tconst AString & a_Body,\n\t\tconst AStringMap & a_Options\n\t)\n\t{\n\t\t// Create a new instance of cUrlClientRequest, wrapped in a SharedPtr, so that it has a controlled lifetime.\n\t\t// Cannot use std::make_shared, because the constructor is not public\n\t\tstd::shared_ptr<cUrlClientRequest> ptr (new cUrlClientRequest(\n\t\t\ta_Method, a_URL, std::move(a_Callbacks), std::move(a_Headers), a_Body, a_Options\n\t\t));\n\t\treturn ptr->DoRequest(ptr);\n\t}\n\n\n\t/** Calls the error callback with the specified message, if it exists, and terminates the request. */\n\tvoid CallErrorCallback(const AString & a_ErrorMessage)\n\t{\n\t\t// Call the error callback:\n\t\tm_Callbacks->OnError(a_ErrorMessage);\n\n\t\t// Terminate the request's TCP link:\n\t\tif (auto link = m_Link.lock())\n\t\t{\n\t\t\tlink->Close();\n\t\t}\n\t}\n\n\n\tcUrlClient::cCallbacks & GetCallbacks() { return *m_Callbacks; }\n\n\tvoid RedirectTo(const AString & a_RedirectUrl);\n\n\tbool ShouldAllowRedirects() const;\n\n\tcX509CertPtr GetOwnCert() const\n\t{\n\t\tauto itr = m_Options.find(\"OwnCert\");\n\t\tif (itr == m_Options.end())\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\t\tcX509CertPtr cert = std::make_shared<cX509Cert>();\n\t\tif (!cert->Parse(itr->second.data(), itr->second.size()))\n\t\t{\n\t\t\tLOGD(\"OwnCert failed to parse\");\n\t\t\treturn nullptr;\n\t\t}\n\t\treturn cert;\n\t}\n\n\tcCryptoKeyPtr GetOwnPrivKey() const\n\t{\n\t\tauto itr = m_Options.find(\"OwnPrivKey\");\n\t\tif (itr == m_Options.end())\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\t\tcCryptoKeyPtr key = std::make_shared<cCryptoKey>();\n\t\tauto passItr = m_Options.find(\"OwnPrivKeyPassword\");\n\t\tauto pass = (passItr == m_Options.end()) ? AString() : passItr->second;\n\t\tif (!key->ParsePrivate(itr->second.data(), itr->second.size(), pass))\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\t\treturn key;\n\t}\n\n\t/** Returns the parsed TrustedRootCAs from the options, or an empty pointer if the option is not set.\n\tThrows a std::runtime_error if CAs are provided, but parsing them fails. */\n\tcX509CertPtr GetTrustedRootCAs() const\n\t{\n\t\tauto itr = m_Options.find(\"TrustedRootCAs\");\n\t\tif (itr == m_Options.end())\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\t\tauto Cert = std::make_shared<cX509Cert>();\n\t\tauto Res = Cert->Parse(itr->second.data(), itr->second.size());\n\t\tif (Res != 0)\n\t\t{\n\t\t\tthrow std::runtime_error(fmt::format(\"Failed to parse the TrustedRootCAs certificate: {}\", Res));\n\t\t}\n\t\treturn Cert;\n\t}\n\nprotected:\n\n\t/** Method to be used for the request */\n\tAString m_Method;\n\n\t/** URL that will be requested. */\n\tAString m_Url;\n\n\t/** Individual components of the URL that will be requested. */\n\tAString m_UrlScheme, m_UrlUsername, m_UrlPassword, m_UrlHost, m_UrlPath, m_UrlQuery, m_UrlFragment;\n\tUInt16 m_UrlPort;\n\n\t/** Callbacks that report progress and results of the request. */\n\tcUrlClient::cCallbacksPtr m_Callbacks;\n\n\t/** Extra headers to be sent with the request (besides the normal ones). */\n\tAStringMap m_Headers;\n\n\t/** Body to be sent with the request, if any. */\n\tAString m_Body;\n\n\t/** Extra options to be used for the request. */\n\tAStringMap m_Options;\n\n\t/** weak_ptr to self, so that this object can keep itself alive as needed by calling lock(),\n\tand pass self as callbacks to cNetwork functions. */\n\tstd::weak_ptr<cUrlClientRequest> m_Self;\n\n\t/** The handler that \"talks\" the protocol specified in m_UrlScheme, handles all the sending and receiving. */\n\tstd::shared_ptr<cSchemeHandler> m_SchemeHandler;\n\n\t/** The link handling the request. */\n\tstd::weak_ptr<cTCPLink> m_Link;\n\n\t/** The number of redirect attempts that will still be followed.\n\tIf the response specifies a redirect and this is nonzero, the redirect is followed.\n\tIf the response specifies a redirect and this is zero, a redirect loop is reported as an error. */\n\tint m_NumRemainingRedirects;\n\n\n\tcUrlClientRequest(\n\t\tconst AString & a_Method,\n\t\tconst AString & a_Url,\n\t\tcUrlClient::cCallbacksPtr && a_Callbacks,\n\t\tAStringMap && a_Headers,\n\t\tconst AString & a_Body,\n\t\tconst AStringMap & a_Options\n\t):\n\t\tm_Method(a_Method),\n\t\tm_Url(a_Url),\n\t\tm_Callbacks(std::move(a_Callbacks)),\n\t\tm_Headers(std::move(a_Headers)),\n\t\tm_Body(a_Body),\n\t\tm_Options(a_Options)\n\t{\n\t\tm_NumRemainingRedirects = GetStringMapInteger(m_Options, \"MaxRedirects\", 30);\n\t}\n\n\n\tstd::pair<bool, AString> DoRequest(const std::shared_ptr<cUrlClientRequest> & a_Self);\n\n\n\t// cNetwork::cConnectCallbacks override: TCP link connected:\n\tvirtual void OnConnected(cTCPLink & a_Link) override;\n\n\t// cNetwork::cConnectCallbacks override: An error has occurred:\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tm_Callbacks->OnError(fmt::format(FMT_STRING(\"Network error {} ({})\"), a_ErrorCode, a_ErrorMsg));\n\t}\n\n\n\t// cTCPLink::cCallbacks override: TCP link created\n\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) override\n\t{\n\t\tm_Link = a_Link;\n\t}\n\n\n\t// cTCPLink::cCallbacks override: TLS handshake completed on the link:\n\tvirtual void OnTlsHandshakeCompleted(void) override;\n\n\t/** Called when there's data incoming from the remote peer. */\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Length) override;\n\n\n\t/** Called when the remote end closes the connection.\n\tThe link is still available for connection information query (IP / port).\n\tSending data on the link is not an error, but the data won't be delivered. */\n\tvirtual void OnRemoteClosed(void) override;\n};\n\n\n\n\n\n/** Represents a base class for an object that \"talks\" a specified URL protocol, such as HTTP or FTP.\nAlso provides a static factory method for creating an instance based on the scheme.\nA descendant of this class is created for each request and handles all of the request's aspects,\nfrom right after connecting to the TCP link till the link is closed.\nFor an example of a specific handler, see the cHttpSchemeHandler class. */\nclass cSchemeHandler abstract\n{\npublic:\n\tcSchemeHandler(cUrlClientRequest & a_ParentRequest):\n\t\tm_ParentRequest(a_ParentRequest)\n\t{\n\t}\n\n\t// Force a virtual destructor in all descendants\n\tvirtual ~cSchemeHandler() {}\n\n\t/** Creates and returns a new handler for the specified scheme.\n\ta_ParentRequest is the request which is to be handled by the handler. */\n\tstatic cSchemeHandlerPtr Create(const AString & a_Scheme, cUrlClientRequest & a_ParentRequest);\n\n\t/** Called when the link gets established. */\n\tvirtual void OnConnected(cTCPLink & a_Link) = 0;\n\n\t/** Called when there's data incoming from the remote peer. */\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Length) = 0;\n\n\t/** Called when the TLS handshake has completed on the underlying link. */\n\tvirtual void OnTlsHandshakeCompleted(void) = 0;\n\n\t/** Called when the remote end closes the connection.\n\tThe link is still available for connection information query (IP / port).\n\tSending data on the link is not an error, but the data won't be delivered. */\n\tvirtual void OnRemoteClosed(void) = 0;\n\nprotected:\n\tcUrlClientRequest & m_ParentRequest;\n};\n\n\n\n\n\n/** cSchemeHandler descendant that handles HTTP (and HTTPS) requests. */\nclass cHttpSchemeHandler:\n\tpublic cSchemeHandler,\n\tprotected cHTTPMessageParser::cCallbacks\n{\n\tusing Super = cSchemeHandler;\n\npublic:\n\n\tcHttpSchemeHandler(cUrlClientRequest & a_ParentRequest, bool a_IsTls):\n\t\tSuper(a_ParentRequest),\n\t\tm_Parser(*this),\n\t\tm_IsTls(a_IsTls),\n\t\tm_IsRedirect(false)\n\t{\n\t}\n\n\n\tvirtual void OnConnected(cTCPLink & a_Link) override\n\t{\n\t\tm_Link = &a_Link;\n\t\tif (m_IsTls)\n\t\t{\n\t\t\tm_Link->StartTLSClient(m_ParentRequest.GetOwnCert(), m_ParentRequest.GetOwnPrivKey(), m_ParentRequest.GetTrustedRootCAs());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSendRequest();\n\t\t}\n\t}\n\n\n\t/** Sends the HTTP request over the link.\n\tCommon code for both HTTP and HTTPS. */\n\tvoid SendRequest()\n\t{\n\t\t// Compose the request line:\n\t\tauto requestLine = m_ParentRequest.m_UrlPath;\n\t\tif (requestLine.empty())\n\t\t{\n\t\t\trequestLine = \"/\";\n\t\t}\n\t\tif (!m_ParentRequest.m_UrlQuery.empty())\n\t\t{\n\t\t\trequestLine.push_back('?');\n\t\t\trequestLine.append(m_ParentRequest.m_UrlQuery);\n\t\t}\n\t\tm_Link->Send(fmt::format(FMT_STRING(\"{} {} HTTP/1.1\\r\\n\"), m_ParentRequest.m_Method, requestLine));\n\n\t\t// Send the headers:\n\t\tm_Link->Send(fmt::format(FMT_STRING(\"Host: {}\\r\\n\"), m_ParentRequest.m_UrlHost));\n\t\tm_Link->Send(fmt::format(FMT_STRING(\"Content-Length: {}\\r\\n\"), m_ParentRequest.m_Body.size()));\n\t\tfor (const auto & hdr: m_ParentRequest.m_Headers)\n\t\t{\n\t\t\tm_Link->Send(fmt::format(FMT_STRING(\"{}: {}\\r\\n\"), hdr.first, hdr.second));\n\t\t}  // for itr - m_Headers[]\n\t\tm_Link->Send(\"\\r\\n\", 2);\n\n\t\t// Send the body:\n\t\tm_Link->Send(m_ParentRequest.m_Body);\n\n\t\t// Notify the callbacks that the request has been sent:\n\t\tm_ParentRequest.GetCallbacks().OnRequestSent();\n\t}\n\n\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Length) override\n\t{\n\t\tauto res = m_Parser.Parse(a_Data, a_Length);\n\t\tif (res == AString::npos)\n\t\t{\n\t\t\tm_ParentRequest.CallErrorCallback(\"Failed to parse HTTP response\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\n\tvirtual void OnTlsHandshakeCompleted(void) override\n\t{\n\t\tSendRequest();\n\t}\n\n\n\tvirtual void OnRemoteClosed(void) override\n\t{\n\t\tm_Link = nullptr;\n\t}\n\n\n\t// cHTTPResponseParser::cCallbacks overrides:\n\tvirtual void OnError(const AString & a_ErrorDescription) override\n\t{\n\t\tm_Link = nullptr;\n\t\tm_ParentRequest.CallErrorCallback(a_ErrorDescription);\n\t}\n\n\n\tvirtual void OnFirstLine(const AString & a_FirstLine) override\n\t{\n\t\t// Find the first space, parse the result code between it and the second space:\n\t\tauto idxFirstSpace = a_FirstLine.find(' ');\n\t\tif (idxFirstSpace == AString::npos)\n\t\t{\n\t\t\tm_ParentRequest.CallErrorCallback(fmt::format(FMT_STRING(\"Failed to parse HTTP status line \\\"{}\\\", no space delimiter.\"), a_FirstLine));\n\t\t\treturn;\n\t\t}\n\t\tauto idxSecondSpace = a_FirstLine.find(' ', idxFirstSpace + 1);\n\t\tif (idxSecondSpace == AString::npos)\n\t\t{\n\t\t\tm_ParentRequest.CallErrorCallback(fmt::format(FMT_STRING(\"Failed to parse HTTP status line \\\"{}\\\", missing second space delimiter.\"), a_FirstLine));\n\t\t\treturn;\n\t\t}\n\t\tint resultCode;\n\t\tauto resultCodeStr = a_FirstLine.substr(idxFirstSpace + 1, idxSecondSpace - idxFirstSpace - 1);\n\t\tif (!StringToInteger(resultCodeStr, resultCode))\n\t\t{\n\t\t\tm_ParentRequest.CallErrorCallback(fmt::format(FMT_STRING(\"Failed to parse HTTP result code from response \\\"{}\\\"\"), resultCodeStr));\n\t\t\treturn;\n\t\t}\n\n\t\t// Check for redirects, follow if allowed by the options:\n\t\tswitch (resultCode)\n\t\t{\n\t\t\tcase cUrlClient::HTTP_STATUS_MULTIPLE_CHOICES:\n\t\t\tcase cUrlClient::HTTP_STATUS_MOVED_PERMANENTLY:\n\t\t\tcase cUrlClient::HTTP_STATUS_FOUND:\n\t\t\tcase cUrlClient::HTTP_STATUS_SEE_OTHER:\n\t\t\tcase cUrlClient::HTTP_STATUS_TEMPORARY_REDIRECT:\n\t\t\t{\n\t\t\t\tm_IsRedirect = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tm_ParentRequest.GetCallbacks().OnStatusLine(a_FirstLine.substr(0, idxFirstSpace), resultCode, a_FirstLine.substr(idxSecondSpace + 1));\n\t}\n\n\n\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\tif (m_IsRedirect)\n\t\t{\n\t\t\tif (a_Key == \"Location\")\n\t\t\t{\n\t\t\t\tm_RedirectLocation = a_Value;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_ParentRequest.GetCallbacks().OnHeader(a_Key, a_Value);\n\t\t}\n\t}\n\n\n\t/** Called when all the headers have been parsed. */\n\tvirtual void OnHeadersFinished(void) override\n\t{\n\t\tif (!m_IsRedirect)\n\t\t{\n\t\t\tm_ParentRequest.GetCallbacks().OnHeadersFinished();\n\t\t}\n\t}\n\n\n\t/** Called for each chunk of the incoming body data. */\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override\n\t{\n\t\tif (!m_IsRedirect)\n\t\t{\n\t\t\tm_ParentRequest.GetCallbacks().OnBodyData(a_Data, a_Size);\n\t\t}\n\t}\n\n\n\t/** Called when the entire body has been reported by OnBodyData(). */\n\tvirtual void OnBodyFinished(void) override\n\t{\n\t\tif (m_IsRedirect)\n\t\t{\n\t\t\tif (m_RedirectLocation.empty())\n\t\t\t{\n\t\t\t\tm_ParentRequest.CallErrorCallback(\"Invalid redirect, there's no location to redirect to\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_ParentRequest.RedirectTo(m_RedirectLocation);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_ParentRequest.GetCallbacks().OnBodyFinished();\n\t\t\t// Finished recieving data, shutdown the link\n\t\t\tm_Link->Shutdown();\n\t\t}\n\t}\n\nprotected:\n\n\t/** The network link. */\n\tcTCPLink * m_Link;\n\n\t/** Parser of the HTTP response message. */\n\tcHTTPMessageParser m_Parser;\n\n\t/** If true, the TLS should be started on the link before sending the request (used for https). */\n\tbool m_IsTls;\n\n\t/** Set to true if the first line contains a redirecting HTTP status code and the options specify to follow redirects.\n\tIf true, and the parent request allows redirects, neither headers not the body contents are reported through the callbacks,\n\tand after the entire request is parsed, the redirect is attempted. */\n\tbool m_IsRedirect;\n\n\t/** The Location where the request should be redirected.\n\tOnly used when m_IsRedirect is true. */\n\tAString m_RedirectLocation;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSchemeHandler:\n\ncSchemeHandlerPtr cSchemeHandler::Create(const AString & a_Scheme, cUrlClientRequest & a_ParentRequest)\n{\n\tauto lowerScheme = StrToLower(a_Scheme);\n\tif (lowerScheme == \"http\")\n\t{\n\t\treturn std::make_shared<cHttpSchemeHandler>(a_ParentRequest, false);\n\t}\n\telse if (lowerScheme == \"https\")\n\t{\n\t\treturn std::make_shared<cHttpSchemeHandler>(a_ParentRequest, true);\n\t}\n\n\treturn nullptr;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cUrlClientRequest:\n\nvoid cUrlClientRequest::RedirectTo(const AString & a_RedirectUrl)\n{\n\t// Check that redirection is allowed:\n\tm_Callbacks->OnRedirecting(a_RedirectUrl);\n\tif (!ShouldAllowRedirects())\n\t{\n\t\tCallErrorCallback(fmt::format(FMT_STRING(\"Redirect to \\\"{}\\\" not allowed\"), a_RedirectUrl));\n\t\treturn;\n\t}\n\n\t// Keep ourself alive while the link drops ownership\n\tauto Self = m_Self.lock();\n\n\t// Do the actual redirect:\n\tif (auto Link = m_Link.lock())\n\t{\n\t\tLink->Close();\n\t}\n\n\tm_Url = a_RedirectUrl;\n\tm_NumRemainingRedirects = m_NumRemainingRedirects - 1;\n\tauto res = DoRequest(Self);\n\tif (!res.first)\n\t{\n\t\tm_Callbacks->OnError(fmt::format(FMT_STRING(\"Redirection failed: {}\"), res.second));\n\t}\n}\n\n\n\n\n\nbool cUrlClientRequest::ShouldAllowRedirects() const\n{\n\treturn (m_NumRemainingRedirects > 0);\n}\n\n\n\n\n\nvoid cUrlClientRequest::OnConnected(cTCPLink & a_Link)\n{\n\tm_Callbacks->OnConnected(a_Link);\n\tm_SchemeHandler->OnConnected(a_Link);\n}\n\n\n\n\n\nvoid cUrlClientRequest::OnTlsHandshakeCompleted(void)\n{\n\t// Notify the scheme handler and the callbacks:\n\tm_SchemeHandler->OnTlsHandshakeCompleted();\n\tm_Callbacks->OnTlsHandshakeCompleted();\n}\n\n\n\n\n\nvoid cUrlClientRequest::OnReceivedData(const char * a_Data, size_t a_Length)\n{\n\tauto handler = m_SchemeHandler;\n\tif (handler != nullptr)\n\t{\n\t\thandler->OnReceivedData(a_Data, a_Length);\n\t}\n}\n\n\n\n\n\nvoid cUrlClientRequest::OnRemoteClosed()\n{\n\t// Notify the callback:\n\tauto handler = m_SchemeHandler;\n\tif (handler != nullptr)\n\t{\n\t\thandler->OnRemoteClosed();\n\t}\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlClientRequest::DoRequest(const std::shared_ptr<cUrlClientRequest> & a_Self)\n{\n\t// We need a shared pointer to self, care must be taken not to pass any other ptr:\n\tASSERT(a_Self.get() == this);\n\n\tm_Self = a_Self;\n\n\t// Parse the URL:\n\tauto res = cUrlParser::Parse(m_Url, m_UrlScheme, m_UrlUsername, m_UrlPassword, m_UrlHost, m_UrlPort, m_UrlPath, m_UrlQuery, m_UrlFragment);\n\tif (!res.first)\n\t{\n\t\treturn res;\n\t}\n\n\t// Get a handler that will work with the specified scheme:\n\tm_SchemeHandler = cSchemeHandler::Create(m_UrlScheme, *this);\n\tif (m_SchemeHandler == nullptr)\n\t{\n\t\treturn std::make_pair(false, fmt::format(FMT_STRING(\"Unknown URL scheme: {}\"), m_UrlScheme));\n\t}\n\n\t// Connect and transfer ownership to the link\n\tif (!cNetwork::Connect(m_UrlHost, m_UrlPort, a_Self, a_Self))\n\t{\n\t\treturn std::make_pair(false, \"Network connection failed\");\n\t}\n\treturn std::make_pair(true, AString());\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cUrlClient:\n\nstd::pair<bool, AString> cUrlClient::Request(\n\tconst AString & a_Method,\n\tconst AString & a_URL,\n\tcCallbacksPtr && a_Callbacks,\n\tAStringMap && a_Headers,\n\tconst AString & a_Body,\n\tconst AStringMap & a_Options\n)\n{\n\treturn cUrlClientRequest::Request(\n\t\ta_Method, a_URL, std::move(a_Callbacks), std::move(a_Headers), a_Body, a_Options\n\t);\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlClient::Get(\n\tconst AString & a_URL,\n\tcCallbacksPtr && a_Callbacks,\n\tAStringMap && a_Headers,\n\tconst AString & a_Body,\n\tconst AStringMap & a_Options\n)\n{\n\treturn cUrlClientRequest::Request(\n\t\t\"GET\", a_URL, std::move(a_Callbacks), std::move(a_Headers), a_Body, a_Options\n\t);\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlClient::Post(\n\tconst AString & a_URL,\n\tcCallbacksPtr && a_Callbacks,\n\tAStringMap && a_Headers,\n\tconst AString & a_Body,\n\tconst AStringMap & a_Options\n)\n{\n\treturn cUrlClientRequest::Request(\n\t\t\"POST\", a_URL, std::move(a_Callbacks), std::move(a_Headers), a_Body, a_Options\n\t);\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlClient::Put(\n\tconst AString & a_URL,\n\tcCallbacksPtr && a_Callbacks,\n\tAStringMap && a_Headers,\n\tconst AString & a_Body,\n\tconst AStringMap & a_Options\n)\n{\n\treturn cUrlClientRequest::Request(\n\t\t\"PUT\", a_URL, std::move(a_Callbacks), std::move(a_Headers), a_Body, a_Options\n\t);\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlClient::BlockingRequest(\n\tconst AString & a_Method,\n\tconst AString & a_URL,\n\tAStringMap && a_Headers,\n\tconst AString & a_Body,\n\tconst AStringMap & a_Options\n)\n{\n\tauto EvtFinished = std::make_shared<cEvent>();\n\tAString Response;\n\tauto Callbacks = std::make_shared<cBlockingHTTPCallbacks>(EvtFinished, Response);\n\tauto [Success, ErrorMessage] = cUrlClient::Request(a_Method, a_URL, Callbacks, std::move(a_Headers), a_Body, a_Options);\n\tif (Success)\n\t{\n\t\tif (!EvtFinished->Wait(10000))\n\t\t{\n\t\t\treturn std::make_pair(false, \"Timeout\");\n\t\t}\n\t\tif (Callbacks->m_IsError)\n\t\t{\n\t\t\treturn std::make_pair(false, AString());\n\t\t}\n\t}\n\telse\n\t{\n\t\tLOGWARNING(\"%s: HTTP error: %s\", __FUNCTION__, ErrorMessage.c_str());\n\t\treturn std::make_pair(false, AString());\n\t}\n\treturn std::make_pair(true, Response);\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlClient::BlockingGet(\n\tconst AString & a_URL,\n\tAStringMap a_Headers,\n\tconst AString & a_Body,\n\tconst AStringMap & a_Options\n)\n{\n\treturn BlockingRequest(\"GET\", a_URL, std::move(a_Headers), a_Body, a_Options);\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlClient::BlockingPost(\n\tconst AString & a_URL,\n\tAStringMap && a_Headers,\n\tconst AString & a_Body,\n\tconst AStringMap & a_Options\n)\n{\n\treturn BlockingRequest(\"POST\", a_URL, std::move(a_Headers), a_Body, a_Options);\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlClient::BlockingPut(\n\tconst AString & a_URL,\n\tAStringMap && a_Headers,\n\tconst AString & a_Body,\n\tconst AStringMap & a_Options\n)\n{\n\treturn BlockingRequest(\"PUT\", a_URL, std::move(a_Headers), a_Body, a_Options);\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/UrlClient.h",
    "content": "\n// UrlClient.h\n\n// Declares the cUrlClient class for high-level URL interaction\n\n/*\nOptions that can be set via the Options parameter to the cUrlClient calls:\n\"MaxRedirects\":       The maximum number of allowed redirects before the client refuses a redirect with an error\n\"OwnCert\":            The client certificate to use, if requested by the server. Any string that can be parsed by cX509Cert.\n\"OwnPrivKey\":         The private key appropriate for OwnCert. Any string that can be parsed by cCryptoKey.\n\"OwnPrivKeyPassword\": The password for OwnPrivKey. If not present or empty, no password is assumed.\n\"TrustedRootCAs\":     The trusted root CA certificates (\\n-delimited concatenated PEM format) to be used for peer cert verification. If not present, peer cert is not verified.\n\nBehavior:\n- If a redirect is received, and redirection is allowed, the redirection is reported via OnRedirecting() callback\nand the request is restarted at the redirect URL, without reporting any of the redirect's headers nor body\n- If a redirect is received and redirection is not allowed (maximum redirection attempts have been reached),\nthe OnRedirecting() callback is called with the redirect URL and then the request terminates with an OnError() callback,\nwithout reporting the redirect's headers nor body.\n*/\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/Network.h\"\n\n\n\n\n\nclass cUrlClient\n{\npublic:\n\t/** Callbacks that are used for progress and result reporting. */\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when the TCP connection is established. */\n\t\tvirtual void OnConnected(cTCPLink & a_Link) {}\n\n\t\t/** Called for TLS connections, when the server certificate is received.\n\t\tReturn true to continue with the request, false to abort.\n\t\tThe default implementation does nothing and continues with the request.\n\t\tTODO: The certificate parameter needs a representation! */\n\t\tvirtual bool OnCertificateReceived() { return true; }\n\n\t\t/** Called for TLS connections, when the TLS handshake has been completed.\n\t\tAn empty default implementation is provided so that clients don't need to reimplement it unless they are interested in the event. */\n\t\tvirtual void OnTlsHandshakeCompleted() { }\n\n\t\t/** Called after the entire request has been sent to the remote peer. */\n\t\tvirtual void OnRequestSent() {}\n\n\t\t/** Called after the first line of the response is parsed, unless the response is an allowed redirect. */\n\t\tvirtual void OnStatusLine(const AString & a_HttpVersion, int a_StatusCode, const AString & a_Rest) {}\n\n\t\t/** Called when a single HTTP header is received and parsed, unless the response is an allowed redirect\n\t\tCalled once for each incoming header. */\n\t\tvirtual void OnHeader(const AString & a_Key, const AString & a_Value) {}\n\n\t\t/** Called when the HTTP headers have been fully parsed, unless the response is an allowed redirect.\n\t\tThere will be no more OnHeader() calls. */\n\t\tvirtual void OnHeadersFinished() {}\n\n\t\t/** Called when the next fragment of the response body is received, unless the response is an allowed redirect.\n\t\tThis can be called multiple times, as data arrives over the network. */\n\t\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) {}\n\n\t\t/** Called after the response body has been fully reported by OnBody() calls, unless the response is an allowed redirect.\n\t\tThere will be no more OnBody() calls. */\n\t\tvirtual void OnBodyFinished() {}\n\n\t\t/** Called when an asynchronous error is encountered. */\n\t\tvirtual void OnError(const AString & a_ErrorMsg) {}\n\n\t\t/** Called when a redirect is to be followed.\n\t\tThis is called even if the redirecting is prohibited by the options; in such an event, this call will be\n\t\tfollowed by OnError().\n\t\tIf a response indicates a redirect (and the request allows redirecting), the regular callbacks\n\t\tOnStatusLine(), OnHeader(), OnHeadersFinished(), OnBodyData() and OnBodyFinished() are not called\n\t\tfor such a response; instead, the redirect is silently attempted. */\n\t\tvirtual void OnRedirecting(const AString & a_NewLocation) {}\n\t};\n\tusing cCallbacksPtr = std::shared_ptr<cCallbacks>;\n\n\n\t/** Used for HTTP status codes. */\n\tenum eHTTPStatus\n\t{\n\t\tHTTP_STATUS_OK                 = 200,\n\t\tHTTP_STATUS_MULTIPLE_CHOICES   = 300,  // MAY have a redirect using the \"Location\" header\n\t\tHTTP_STATUS_MOVED_PERMANENTLY  = 301,  // redirect using the \"Location\" header\n\t\tHTTP_STATUS_FOUND              = 302,  // redirect using the \"Location\" header\n\t\tHTTP_STATUS_SEE_OTHER          = 303,  // redirect using the \"Location\" header\n\t\tHTTP_STATUS_TEMPORARY_REDIRECT = 307,  // redirect using the \"Location\" header\n\t};\n\n\n\t/** Makes a network request to the specified URL, using the specified method (if applicable).\n\tThe response is reported via the a_ResponseCallback callback, in a single call.\n\tThe metadata about the response (HTTP headers) are reported via a_InfoCallback before the a_ResponseCallback call.\n\tIf there is an asynchronous error, it is reported in via the a_ErrorCallback.\n\tIf there is an immediate error (misformatted URL etc.), the function returns false and an error message.\n\ta_Headers contains additional headers to use for the request.\n\ta_Body specifies optional body to include with the request, if applicable.\n\ta_Options contains various options for the request that govern the request behavior, but aren't sent to the server,\n\tsuch as the proxy server, whether to follow redirects, and client certificate for TLS. */\n\tstatic std::pair<bool, AString> Request(\n\t\tconst AString & a_Method,\n\t\tconst AString & a_URL,\n\t\tcCallbacksPtr && a_Callbacks,\n\t\tAStringMap && a_Headers,\n\t\tconst AString & a_Body,\n\t\tconst AStringMap & a_Options\n\t);\n\n\t/** Alias for Request(\"GET\", ...) */\n\tstatic std::pair<bool, AString> Get(\n\t\tconst AString & a_URL,\n\t\tcCallbacksPtr && a_Callbacks,\n\t\tAStringMap && a_Headers = {},\n\t\tconst AString & a_Body = {},\n\t\tconst AStringMap & a_Options = {}\n\t);\n\n\t/** Alias for Request(\"POST\", ...) */\n\tstatic std::pair<bool, AString> Post(\n\t\tconst AString & a_URL,\n\t\tcCallbacksPtr && a_Callbacks,\n\t\tAStringMap && a_Headers,\n\t\tconst AString & a_Body,\n\t\tconst AStringMap & a_Options = {}\n\t);\n\n\t/** Alias for Request(\"PUT\", ...) */\n\tstatic std::pair<bool, AString> Put(\n\t\tconst AString & a_URL,\n\t\tcCallbacksPtr && a_Callbacks,\n\t\tAStringMap && a_Headers,\n\t\tconst AString & a_Body,\n\t\tconst AStringMap & a_Options = {}\n\t);\n\n\t/** Sends a generic request and block until a response is received or an error occurs.\n\tThe first returned value specifies whether the response was received successfully.\n\tIf successful, the second value provides the actual response data. */\n\tstatic std::pair<bool, AString> BlockingRequest(\n\t\tconst AString & a_Method,\n\t\tconst AString & a_URL,\n\t\tAStringMap && a_Headers = {},\n\t\tconst AString & a_Body = {},\n\t\tconst AStringMap & a_Options = {}\n\t);\n\n\t/** Alias for BlockingRequest(\"GET\", ...) */\n\tstatic std::pair<bool, AString> BlockingGet(\n\t\tconst AString & a_URL,\n\t\tAStringMap a_Headers = {},\n\t\tconst AString & a_Body = {},\n\t\tconst AStringMap & a_Options = {}\n\t);\n\n\t/** Alias for BlockingRequest(\"POST\", ...) */\n\tstatic std::pair<bool, AString> BlockingPost(\n\t\tconst AString & a_URL,\n\t\tAStringMap && a_Headers,\n\t\tconst AString & a_Body,\n\t\tconst AStringMap & a_Options = {}\n\t);\n\n\t/** Alias for BlockingRequest(\"PUT\", ...) */\n\tstatic std::pair<bool, AString> BlockingPut(\n\t\tconst AString & a_URL,\n\t\tAStringMap && a_Headers,\n\t\tconst AString & a_Body,\n\t\tconst AStringMap & a_Options = {}\n\t);\n};\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/UrlParser.cpp",
    "content": "\n// UrlParser.cpp\n\n// Implements the cUrlParser class that parses string URL into individual parts\n\n#include \"Globals.h\"\n\n#include \"UrlParser.h\"\n\n\n\n\n\nUInt16 cUrlParser::GetDefaultPort(const AString & a_Scheme)\n{\n\tif (a_Scheme == \"http\")\n\t{\n\t\treturn 80;\n\t}\n\telse if (a_Scheme == \"https\")\n\t{\n\t\treturn 443;\n\t}\n\telse if (a_Scheme == \"ftp\")\n\t{\n\t\treturn 21;\n\t}\n\telse if (a_Scheme == \"mailto\")\n\t{\n\t\treturn 25;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlParser::ParseAuthorityPart(\n\tconst AString & a_AuthorityPart,\n\tAString & a_Username,\n\tAString & a_Password,\n\tAString & a_Host,\n\tUInt16 & a_Port\n)\n{\n\t/*\n\ta_AuthorityPart format:\n\t[user:password@]host[:port]\n\thost can be an IPv4, hostname, or an IPv6 enclosed in brackets\n\tAssume only the password can contain an additional at-sign\n\t*/\n\n\t// Split the authority on the last at-sign, if present:\n\tauto idxLastAtSign = a_AuthorityPart.find_last_of('@');\n\tauto credPart = (idxLastAtSign == AString::npos) ? AString() : a_AuthorityPart.substr(0, idxLastAtSign);\n\tauto srvrPart = (idxLastAtSign == AString::npos) ? a_AuthorityPart : a_AuthorityPart.substr(idxLastAtSign + 1);\n\n\t// User credentials are completely optional:\n\tauto idxCredColon = credPart.find(':');\n\ta_Username = credPart.substr(0, idxCredColon);\n\ta_Password = (idxCredColon == AString::npos) ? AString() : credPart.substr(idxCredColon + 1);\n\n\t// Host can be a hostname, IPv4 or [IPv6]. If in brackets, search for the closing bracket first\n\tif (srvrPart.empty())\n\t{\n\t\t// No host information at all. Bail out with success\n\t\ta_Host.clear();\n\t\treturn std::make_pair(true, AString());\n\t}\n\tif (srvrPart[0] == '[')\n\t{\n\t\t// [IPv6] host, search for the closing bracket\n\t\tauto idxClosingBracket = srvrPart.find(']');\n\t\tif (idxClosingBracket == AString::npos)\n\t\t{\n\t\t\treturn std::make_pair(false, \"Invalid IPv6-like address, missing closing bracket\");\n\t\t}\n\t\ta_Host = srvrPart.substr(0, idxClosingBracket);\n\t\tauto portPart = srvrPart.substr(idxClosingBracket + 1);\n\t\tif (portPart.empty())\n\t\t{\n\t\t\t// No port was specified, return success\n\t\t\treturn std::make_pair(true, AString());\n\t\t}\n\t\tif (portPart[0] != ':')\n\t\t{\n\t\t\treturn std::make_pair(false, \"Invalid port format after IPv6 address, mising colon\");\n\t\t}\n\t\tif (!StringToInteger(portPart.substr(2), a_Port))\n\t\t{\n\t\t\treturn std::make_pair(false, \"Failed to parse port number after IPv6 address\");\n\t\t}\n\t\treturn std::make_pair(true, AString());\n\t}\n\n\t// Not an [IPv6] address, split on the last colon:\n\tauto idxLastColon = srvrPart.find_last_of(':');\n\ta_Host = srvrPart.substr(0, idxLastColon);\n\tif (idxLastColon == AString::npos)\n\t{\n\t\t// No port was specified, return success\n\t\treturn std::make_pair(true, AString());\n\t}\n\tauto portPart = srvrPart.substr(idxLastColon + 1);\n\tif (!StringToInteger(portPart, a_Port))\n\t{\n\t\treturn std::make_pair(false, \"Failed to parse port number after hostname\");\n\t}\n\treturn std::make_pair(true, AString());\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlParser::Parse(\n\tconst AString & a_Url,\n\tAString & a_Scheme,\n\tAString & a_Username,\n\tAString & a_Password,\n\tAString & a_Host,\n\tUInt16 & a_Port,\n\tAString & a_Path,\n\tAString & a_Query,\n\tAString & a_Fragment\n)\n{\n\t// Find the scheme - the text before the first colon:\n\tauto idxColon = a_Url.find(':');\n\tif (idxColon == AString::npos)\n\t{\n\t\treturn std::make_pair(false, \"Cannot parse the Scheme part of the URL\");\n\t}\n\ta_Scheme = StrToLower(a_Url.substr(0, idxColon));\n\ta_Port = GetDefaultPort(a_Scheme);\n\tif (a_Port == 0)\n\t{\n\t\treturn std::make_pair(false, fmt::format(FMT_STRING(\"Unknown URL scheme: \\\"{}\\\"\"), a_Scheme));\n\t}\n\n\t// If the next two chars are a double-slash, skip them:\n\tauto authStart = idxColon + 1;\n\tif (a_Url.substr(authStart, 2) == \"//\")\n\t{\n\t\tauthStart += 2;\n\t}\n\n\t// The Authority part follows the Scheme, until the first slash:\n\tauto idxFirstSlash = a_Url.find('/', authStart + 1);\n\tif (idxFirstSlash == AString::npos)\n\t{\n\t\t// No slash, the whole end of the Url is the authority part\n\t\tidxFirstSlash = a_Url.size();\n\t}\n\n\t// Parse the Authority part into individual components:\n\tauto res = ParseAuthorityPart(\n\t\ta_Url.substr(authStart, idxFirstSlash - authStart),\n\t\ta_Username, a_Password,\n\t\ta_Host, a_Port\n\t);\n\tif (!res.first)\n\t{\n\t\treturn res;\n\t}\n\n\t// Parse the rest into a path, query and fragment:\n\ta_Path.clear();\n\ta_Query.clear();\n\ta_Fragment.clear();\n\tif (idxFirstSlash == a_Url.size())\n\t{\n\t\t// No additional data, bail out with success\n\t\treturn std::make_pair(true, AString());\n\t}\n\tauto idxPathEnd = a_Url.find_first_of(\"?#\", idxFirstSlash + 1);\n\tif (idxPathEnd == AString::npos)\n\t{\n\t\ta_Path = a_Url.substr(idxFirstSlash);\n\t\treturn std::make_pair(true, AString());\n\t}\n\ta_Path = a_Url.substr(idxFirstSlash, idxPathEnd - idxFirstSlash);\n\tauto idxHash = a_Url.find('#', idxPathEnd);\n\tif (idxHash == AString::npos)\n\t{\n\t\ta_Query = a_Url.substr(idxPathEnd + 1);\n\t\treturn std::make_pair(true, AString());\n\t}\n\tif (idxHash > idxPathEnd)\n\t{\n\t\ta_Query = a_Url.substr(idxPathEnd + 1, idxHash - idxPathEnd - 1);\n\t}\n\ta_Fragment = a_Url.substr(idxHash + 1);\n\treturn std::make_pair(true, AString());\n}\n\n\n\n\n\nstd::pair<bool, AString> cUrlParser::Validate(const AString & a_Url)\n{\n\tAString UrlScheme, UrlUsername, UrlPassword, UrlHost, UrlPath, UrlQuery, UrlFragment;\n\tUInt16 Port;\n\treturn Parse(a_Url, UrlScheme, UrlUsername, UrlPassword, UrlHost, Port, UrlPath, UrlQuery, UrlFragment);\n}\n\n\n\n\n"
  },
  {
    "path": "src/HTTP/UrlParser.h",
    "content": "\n// UrlParser.h\n\n// Declares the cUrlParser class that parses string URL into individual parts\n\n\n\n\n\n#pragma once\n\n\n\n\n\nclass cUrlParser\n{\npublic:\n\t/** Returns true if the specified scheme (http, ftp, mailto, ...) is recognized by the URL parser.\n\tIs case sensitive, known schemes are always lowercase. */\n\tstatic bool IsKnownScheme(const AString & a_Scheme) { return (GetDefaultPort(a_Scheme) > 0); }\n\n\t/** Returns the default port used by the specified scheme / protocol.\n\tIf the scheme is not known, 0 is returned. */\n\tstatic UInt16 GetDefaultPort(const AString & a_Scheme);\n\n\t/** Parses the given Authority part of an URL into individual components.\n\tReturns true on success,\n\treturns false and error message on failure. */\n\tstatic std::pair<bool, AString> ParseAuthorityPart(\n\t\tconst AString & a_AuthorityPart,\n\t\tAString & a_Username,\n\t\tAString & a_Password,\n\t\tAString & a_Host,\n\t\tUInt16 & a_Port\n\t);\n\n\t/** Parses the given URL into individual components.\n\tReturns true on success,\n\treturns false and error message on failure.\n\tFails if the scheme (protocol) is not known.\n\tIf port is missing, the default port for the specific scheme is applied. */\n\tstatic std::pair<bool, AString> Parse(\n\t\tconst AString & a_Url,\n\t\tAString & a_Scheme,\n\t\tAString & a_Username,\n\t\tAString & a_Password,\n\t\tAString & a_Host,\n\t\tUInt16 & a_Port,\n\t\tAString & a_Path,\n\t\tAString & a_Query,\n\t\tAString & a_Fragment\n\t);\n\n\t/** Checks if the supplied URL is valid */\n\tstatic std::pair<bool, AString> Validate(const AString & a_Url);\n};\n\n\n\n\n"
  },
  {
    "path": "src/IniFile.cpp",
    "content": "// IniFile.cpp:  Implementation of the CIniFile class.\n// Written by:   Adam Clauss\n// Email: cabadam@houston.rr.com\n// You may use this class / code as you wish in your programs.  Feel free to distribute it, and\n// email suggested changes to me.\n//\n// Rewritten by: Shane Hill\n// Date:         2001-08-21\n// Email:        Shane.Hill@dsto.defence.gov.au\n// Reason:       Remove dependancy on MFC. Code should compile on any\n//               platform.\n////////////////////////////////////////////////////////////////////////////////\n\n/*\n!! MODIFIED BY FAKETRUTH and xoft !!\n*/\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n// C++ Includes\n#include <fstream>\n\n// C Includes\n#include <ctype.h>\n\n// Local Includes\n#include \"IniFile.h\"\n\n#if defined(WIN32)\n\t#define iniEOL endl\n#else\n\t#define iniEOL '\\r' << endl\n#endif\n\nusing namespace std;\n\n\n\n\n\ncIniFile::cIniFile(void) :\n\tm_IsCaseInsensitive(true)\n{\n}\n\n\n\n\n\nbool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)\n{\n\n\tm_Filename = a_FileName;\n\n\t// Normally you would use ifstream, but the SGI CC compiler has\n\t// a few bugs with ifstream. So ... fstream used.\n\tfstream f;\n\tAString   line;\n\tAString   keyname, valuename, value;\n\tAString::size_type pLeft, pRight;\n\tbool IsFromExampleRedirect = false;\n\n\n\tf.open((a_FileName).c_str(), ios::in);\n\tif (f.fail())\n\t{\n\t\tf.clear();\n\t\tif (a_AllowExampleRedirect)\n\t\t{\n\t\t\t// Retry with the .example.ini file instead of .ini:\n\t\t\tAString ExPath(a_FileName.substr(0, a_FileName.length() - 4));\n\t\t\tExPath.append(\".example.ini\");\n\t\t\tf.open((ExPath).c_str(), ios::in);\n\t\t\tif (f.fail())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tIsFromExampleRedirect = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool IsFirstLine = true;\n\n\twhile (getline(f, line))\n\t{\n\t\t// To be compatible with Win32, check for existence of '\\r'.\n\t\t// Win32 files have the '\\r' and Unix files don't at the end of a line.\n\t\t// Note that the '\\r' will be written to INI files from\n\t\t// Unix so that the created INI file can be read under Win32\n\t\t// without change.\n\n\t\t// Removes UTF-8 Byte Order Markers (BOM) if, present.\n\t\tif (IsFirstLine)\n\t\t{\n\t\t\tRemoveBom(line);\n\t\t\tIsFirstLine = false;\n\t\t}\n\n\t\tsize_t lineLength = line.length();\n\t\tif (lineLength == 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (line[lineLength - 1] == '\\r')\n\t\t{\n\t\t\tline = line.substr(0, lineLength - 1);\n\t\t}\n\n\t\tif (line.length() == 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check that the user hasn't opened a binary file by checking the first\n\t\t// character of each line!\n\t\tif (!isprint(line[0]))\n\t\t{\n\t\t\tprintf(\"%s: Binary-check failed on char %d\\n\", __FUNCTION__, line[0]);\n\t\t\tf.close();\n\t\t\treturn false;\n\t\t}\n\t\tif ((pLeft = line.find_first_of(\";#[=\")) == AString::npos)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tswitch (line[pLeft])\n\t\t{\n\t\t\tcase '[':\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t((pRight = line.find_last_of(\"]\")) != AString::npos) &&\n\t\t\t\t\t(pRight > pLeft)\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tkeyname = line.substr(pLeft + 1, pRight - pLeft - 1);\n\t\t\t\t\tAddKeyName(keyname);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase '=':\n\t\t\t{\n\t\t\t\tvaluename = line.substr(0, pLeft);\n\t\t\t\tvalue = TrimString(line.substr(pLeft + 1));\n\t\t\t\tReplaceString(value, \"\\\\n\", \"\\n\");\n\t\t\t\tAddValue(keyname, valuename, value);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ';':\n\t\t\tcase '#':\n\t\t\t{\n\t\t\t\tif (m_Names.empty())\n\t\t\t\t{\n\t\t\t\t\tAddHeaderComment(line.substr(pLeft + 1));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tAddKeyComment(keyname, line.substr(pLeft + 1));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (line[pLeft])\n\t}  // while (getline())\n\n\tf.close();\n\tif (m_Keys.empty() && m_Names.empty() && m_Comments.empty())\n\t{\n\t\t// File be empty or unreadable, equivalent to nonexistant\n\t\treturn false;\n\t}\n\n\tif (IsFromExampleRedirect)\n\t{\n\t\tWriteFile(a_FileName);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cIniFile::WriteFile(const AString & a_FileName) const\n{\n\t// Normally you would use ofstream, but the SGI CC compiler has\n\t// a few bugs with ofstream. So ... fstream used.\n\tfstream f;\n\tAString writevalue;\n\n\tf.open((a_FileName).c_str(), ios::out);\n\tif (f.fail())\n\t{\n\t\treturn false;\n\t}\n\n\t// Write header comments.\n\tsize_t NumComments = m_Comments.size();\n\tfor (size_t commentID = 0; commentID < NumComments; ++commentID)\n\t{\n\t\tf << ';' << m_Comments[commentID] << iniEOL;\n\t}\n\tif (NumComments > 0)\n\t{\n\t\tf << iniEOL;\n\t}\n\n\t// Write keys and values.\n\tfor (size_t keyID = 0; keyID < m_Keys.size(); ++keyID)\n\t{\n\t\tf << '[' << m_Names[keyID] << ']' << iniEOL;\n\n\t\t// Comments.\n\t\tfor (size_t commentID = 0; commentID < m_Keys[keyID].m_Comments.size(); ++commentID)\n\t\t{\n\t\t\tf << ';' << m_Keys[keyID].m_Comments[commentID] << iniEOL;\n\t\t}\n\n\t\t// Values.\n\t\tfor (size_t valueID = 0; valueID < m_Keys[keyID].m_Names.size(); ++valueID)\n\t\t{\n\t\t\twritevalue = m_Keys[keyID].m_Values[valueID];\n\t\t\tReplaceString(writevalue, \"\\n\", \"\\\\n\");\n\t\t\tf << m_Keys[keyID].m_Names[valueID] << '=' << writevalue << iniEOL;\n\t\t}\n\t\tf << iniEOL;\n\t}\n\tf.close();\n\n\treturn true;\n}\n\n\n\n\n\nint cIniFile::FindKey(const AString & a_KeyName) const\n{\n\tAString CaseKeyName = CheckCase(a_KeyName);\n\tfor (size_t keyID = 0; keyID < m_Names.size(); ++keyID)\n\t{\n\t\tif (CheckCase(m_Names[keyID]) == CaseKeyName)\n\t\t{\n\t\t\treturn static_cast<int>(keyID);\n\t\t}\n\t}\n\treturn noID;\n}\n\n\n\n\n\nint cIniFile::FindValue(const int keyID, const AString & a_ValueName) const\n{\n\tif (!m_Keys.size() || (keyID >= static_cast<int>(m_Keys.size())))\n\t{\n\t\treturn noID;\n\t}\n\n\tAString CaseValueName = CheckCase(a_ValueName);\n\tfor (size_t valueID = 0; valueID < m_Keys[static_cast<size_t>(keyID)].m_Names.size(); ++valueID)\n\t{\n\t\tif (CheckCase(m_Keys[static_cast<size_t>(keyID)].m_Names[valueID]) == CaseValueName)\n\t\t{\n\t\t\treturn int(valueID);\n\t\t}\n\t}\n\treturn noID;\n}\n\n\n\n\n\nint cIniFile::AddKeyName(const AString & keyname)\n{\n\tm_Names.resize(m_Names.size() + 1, keyname);\n\tm_Keys.resize(m_Keys.size() + 1);\n\treturn static_cast<int>(m_Names.size()) - 1;\n}\n\n\n\n\n\nAString cIniFile::GetKeyName(const int keyID) const\n{\n\tif (keyID < static_cast<int>(m_Names.size()))\n\t{\n\t\treturn m_Names[static_cast<size_t>(keyID)];\n\t}\n\telse\n\t{\n\t\treturn \"\";\n\t}\n}\n\n\n\n\n\nint cIniFile::GetNumValues(const int keyID) const\n{\n\tif (keyID < static_cast<int>(m_Keys.size()))\n\t{\n\t\treturn static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size());\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint cIniFile::GetNumValues(const AString & keyname) const\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn 0;\n\t}\n\treturn static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size());\n}\n\n\n\n\n\nAString cIniFile::GetValueName(const int keyID, const int valueID) const\n{\n\tif ((keyID < static_cast<int>(m_Keys.size())) && (valueID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size())))\n\t{\n\t\treturn m_Keys[static_cast<size_t>(keyID)].m_Names[static_cast<size_t>(valueID)];\n\t}\n\treturn \"\";\n}\n\n\n\n\n\nAString cIniFile::GetValueName(const AString & keyname, const int valueID) const\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn \"\";\n\t}\n\treturn GetValueName(keyID, valueID);\n}\n\n\n\n\n\nvoid cIniFile::AddValue(const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value)\n{\n\tint keyID = FindKey(a_KeyName);\n\tif (keyID == noID)\n\t{\n\t\tkeyID = int(AddKeyName(a_KeyName));\n\t}\n\n\tm_Keys[static_cast<size_t>(keyID)].m_Names.push_back(a_ValueName);\n\tm_Keys[static_cast<size_t>(keyID)].m_Values.push_back(a_Value);\n}\n\n\n\n\n\nvoid cIniFile::AddValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value)\n{\n\tAddValue(a_KeyName, a_ValueName, fmt::format(FMT_STRING(\"{}\"), a_Value));\n}\n\n\n\n\n\nvoid cIniFile::AddValueF(const AString & a_KeyName, const AString & a_ValueName, const double a_Value)\n{\n\tAddValue(a_KeyName, a_ValueName, fmt::format(FMT_STRING(\"{}\"), a_Value));\n}\n\n\n\n\n\nbool cIniFile::SetValue(const int keyID, const int valueID, const AString & value)\n{\n\tif ((static_cast<size_t>(keyID) >= m_Keys.size()) || (static_cast<size_t>(valueID) >= m_Keys[static_cast<size_t>(keyID)].m_Names.size()))\n\t{\n\t\treturn false;\n\t}\n\tm_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)] = value;\n\treturn true;\n}\n\n\n\n\n\nbool cIniFile::SetValue(const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists)\n{\n\tint keyID = FindKey(a_KeyName);\n\tif (keyID == noID)\n\t{\n\t\tif (!a_CreateIfNotExists)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tkeyID = AddKeyName(a_KeyName);\n\t}\n\n\tint valueID = FindValue(keyID, a_ValueName);\n\tif (valueID == noID)\n\t{\n\t\tif (!a_CreateIfNotExists)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tm_Keys[static_cast<size_t>(keyID)].m_Names.push_back(a_ValueName);\n\t\tm_Keys[static_cast<size_t>(keyID)].m_Values.push_back(a_Value);\n\t}\n\telse\n\t{\n\t\tm_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)] = a_Value;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cIniFile::SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists)\n{\n\treturn SetValue(a_KeyName, a_ValueName, fmt::format(FMT_STRING(\"{}\"), a_Value), a_CreateIfNotExists);\n}\n\n\n\n\n\nbool cIniFile::SetValueI(const AString & a_Keyname, const AString & a_ValueName, const Int64 a_Value, const bool a_CreateIfNotExists)\n{\n\treturn SetValue(a_Keyname, a_ValueName, fmt::format(FMT_STRING(\"{}\"), a_Value), a_CreateIfNotExists);\n}\n\n\n\n\n\nbool cIniFile::SetValueF(const AString & a_KeyName, const AString & a_ValueName, double const a_Value, const bool a_CreateIfNotExists)\n{\n\treturn SetValue(a_KeyName, a_ValueName, fmt::format(FMT_STRING(\"{}\"), a_Value), a_CreateIfNotExists);\n}\n\n\n\n\n\nAString cIniFile::GetValue(const int keyID, const int valueID, const AString & defValue) const\n{\n\tif ((keyID < static_cast<int>(m_Keys.size())) && (valueID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size())))\n\t{\n\t\treturn m_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)];\n\t}\n\treturn defValue;\n}\n\n\n\n\n\nAString cIniFile::GetValue(const AString & keyname, const AString & valuename, const AString & defValue) const\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn defValue;\n\t}\n\n\tint valueID = FindValue(int(keyID), valuename);\n\tif (valueID == noID)\n\t{\n\t\treturn defValue;\n\t}\n\n\treturn m_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)];\n}\n\n\n\n\n\nint cIniFile::GetValueI(const AString & keyname, const AString & valuename, const int defValue) const\n{\n\tauto Data = fmt::format(FMT_STRING(\"{}\"), defValue);\n\treturn atoi(GetValue(keyname, valuename, Data).c_str());\n}\n\n\n\n\n\ndouble cIniFile::GetValueF(const AString & keyname, const AString & valuename, double const defValue) const\n{\n\tauto Data = fmt::format(FMT_STRING(\"{}\"), defValue);\n\treturn atof(GetValue(keyname, valuename, Data).c_str());\n}\n\n\n\n\n\nAString cIniFile::GetValueSet(const AString & keyname, const AString & valuename, const AString & defValue)\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\tSetValue(keyname, valuename, defValue);\n\t\treturn defValue;\n\t}\n\n\tint valueID = FindValue(int(keyID), valuename);\n\tif (valueID == noID)\n\t{\n\t\tSetValue(keyname, valuename, defValue);\n\t\treturn defValue;\n\t}\n\n\treturn m_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)];\n}\n\n\n\n\n\ndouble cIniFile::GetValueSetF(const AString & keyname, const AString & valuename, const double defValue)\n{\n\tauto Data = fmt::format(FMT_STRING(\"{}\"), defValue);\n\treturn atof(GetValueSet(keyname, valuename, Data).c_str());\n}\n\n\n\n\n\nint cIniFile::GetValueSetI(const AString & keyname, const AString & valuename, const int defValue)\n{\n\tauto Data = fmt::format(FMT_STRING(\"{}\"), defValue);\n\treturn atoi(GetValueSet(keyname, valuename, Data).c_str());\n}\n\n\n\n\n\nInt64 cIniFile::GetValueSetI(const AString & keyname, const AString & valuename, const Int64 defValue)\n{\n\tauto Data = fmt::format(FMT_STRING(\"{}\"), defValue);\n\tAString resultstring = GetValueSet(keyname, valuename, Data);\n\tInt64 result = defValue;\n#ifdef _WIN32\n\tsscanf_s(resultstring.c_str(), \"%lld\", &result);\n#else\n\tsscanf(resultstring.c_str(), \"%lld\", &result);\n#endif\n\treturn result;\n}\n\n\n\n\n\nbool cIniFile::DeleteValueByID(const int keyID, const int valueID)\n{\n\tif ((keyID < static_cast<int>(m_Keys.size())) && (valueID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size())))\n\t{\n\t\t// This looks strange, but is neccessary.\n\t\tvector<AString>::iterator npos = m_Keys[static_cast<size_t>(keyID)].m_Names.begin() + valueID;\n\t\tvector<AString>::iterator vpos = m_Keys[static_cast<size_t>(keyID)].m_Values.begin() + valueID;\n\t\tm_Keys[static_cast<size_t>(keyID)].m_Names.erase(npos, npos + 1);\n\t\tm_Keys[static_cast<size_t>(keyID)].m_Values.erase(vpos, vpos + 1);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cIniFile::DeleteValue(const AString & keyname, const AString & valuename)\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn false;\n\t}\n\n\tint valueID = FindValue(int(keyID), valuename);\n\tif (valueID == noID)\n\t{\n\t\treturn false;\n\t}\n\n\treturn DeleteValueByID(keyID, valueID);\n}\n\n\n\n\n\nbool cIniFile::DeleteKey(const AString & keyname)\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn false;\n\t}\n\n\tvector<AString>::iterator npos = m_Names.begin() + keyID;\n\tvector<key>::iterator    kpos = m_Keys.begin() + keyID;\n\tm_Names.erase(npos, npos + 1);\n\tm_Keys.erase(kpos, kpos + 1);\n\n\treturn true;\n}\n\n\n\n\n\nvoid cIniFile::Clear(void)\n{\n\tm_Names.clear();\n\tm_Keys.clear();\n\tm_Comments.clear();\n}\n\n\n\n\n\nbool cIniFile::HasValue(const AString & a_KeyName, const AString & a_ValueName) const\n{\n\t// Find the key:\n\tint keyID = FindKey(a_KeyName);\n\tif (keyID == noID)\n\t{\n\t\treturn false;\n\t}\n\n\t// Find the value:\n\tint valueID = FindValue(keyID, a_ValueName);\n\treturn (valueID != noID);\n}\n\n\n\n\n\nvoid cIniFile::AddHeaderComment(const AString & comment)\n{\n\tm_Comments.push_back(comment);\n\t// comments.resize(comments.size() + 1, comment);\n}\n\n\n\n\n\nAString cIniFile::GetHeaderComment(const int commentID) const\n{\n\tif (commentID < static_cast<int>(m_Comments.size()))\n\t{\n\t\treturn m_Comments[static_cast<size_t>(commentID)];\n\t}\n\treturn \"\";\n}\n\n\n\n\n\nbool cIniFile::DeleteHeaderComment(int commentID)\n{\n\tif (commentID < static_cast<int>(m_Comments.size()))\n\t{\n\t\tvector<AString>::iterator cpos = m_Comments.begin() + commentID;\n\t\tm_Comments.erase(cpos, cpos + 1);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nint cIniFile::GetNumKeyComments(const int keyID) const\n{\n\tif (keyID < static_cast<int>(m_Keys.size()))\n\t{\n\t\treturn static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Comments.size());\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint cIniFile::GetNumKeyComments(const AString & keyname) const\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn 0;\n\t}\n\treturn static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Comments.size());\n}\n\n\n\n\n\nbool cIniFile::AddKeyComment(const int keyID, const AString & comment)\n{\n\tif (keyID < static_cast<int>(m_Keys.size()))\n\t{\n\t\tm_Keys[static_cast<size_t>(keyID)].m_Comments.resize(m_Keys[static_cast<size_t>(keyID)].m_Comments.size() + 1, comment);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cIniFile::AddKeyComment(const AString & keyname, const AString & comment)\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn false;\n\t}\n\treturn AddKeyComment(keyID, comment);\n}\n\n\n\n\n\nAString cIniFile::GetKeyComment(const int keyID, const int commentID) const\n{\n\tif ((keyID < static_cast<int>(m_Keys.size())) && (commentID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Comments.size())))\n\t{\n\t\treturn m_Keys[static_cast<size_t>(keyID)].m_Comments[static_cast<size_t>(commentID)];\n\t}\n\treturn \"\";\n}\n\n\n\n\n\nAString cIniFile::GetKeyComment(const AString & keyname, const int commentID) const\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn \"\";\n\t}\n\treturn GetKeyComment(int(keyID), commentID);\n}\n\n\n\n\n\nbool cIniFile::DeleteKeyComment(const int keyID, const int commentID)\n{\n\tif ((keyID < static_cast<int>(m_Keys.size())) && (commentID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Comments.size())))\n\t{\n\t\tvector<AString>::iterator cpos = m_Keys[static_cast<size_t>(keyID)].m_Comments.begin() + commentID;\n\t\tm_Keys[static_cast<size_t>(keyID)].m_Comments.erase(cpos, cpos + 1);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cIniFile::DeleteKeyComment(const AString & keyname, const int commentID)\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn false;\n\t}\n\treturn DeleteKeyComment(int(keyID), commentID);\n}\n\n\n\n\n\nbool cIniFile::DeleteKeyComments(const int keyID)\n{\n\tif (keyID < static_cast<int>(m_Keys.size()))\n\t{\n\t\tm_Keys[static_cast<size_t>(keyID)].m_Comments.clear();\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cIniFile::DeleteKeyComments(const AString & keyname)\n{\n\tint keyID = FindKey(keyname);\n\tif (keyID == noID)\n\t{\n\t\treturn false;\n\t}\n\treturn DeleteKeyComments(static_cast<int>(keyID));\n}\n\n\n\n\n\nAString cIniFile::CheckCase(const AString & s) const\n{\n\tif (!m_IsCaseInsensitive)\n\t{\n\t\treturn s;\n\t}\n\tAString res(s);\n\tsize_t len = res.length();\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tres[i] = static_cast<char>(tolower(res[i]));\n\t}\n\treturn res;\n}\n\n\n\n\n\nvoid cIniFile::RemoveBom(AString & a_line) const\n{\n\t// The BOM sequence for UTF-8 is 0xEF, 0xBB, 0xBF\n\tstatic unsigned const char BOM[] = { 0xEF, 0xBB, 0xBF };\n\n\t// The BOM sequence, if present, is always th e first three characters of the input.\n\tconst AString ref = a_line.substr(0, 3);\n\n\t// If any of the first three chars do not match, return and do nothing.\n\tfor (size_t i = 0; i < 3; ++i)\n\t{\n\t\tif (static_cast<unsigned char>(ref[i]) != BOM[i])\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// First three characters match; erase them.\n\ta_line.erase(0, 3);\n}\n\n\n\n\n\nbool cIniFile::KeyExists(AString a_keyname) const\n{\n\treturn FindKey(a_keyname) != noID;\n}\n\n\n\n\n\nstd::vector<std::pair<AString, AString>> cIniFile::GetValues(AString a_keyName)\n{\n\tstd::vector<std::pair<AString, AString>> ret;\n\tint keyID = FindKey(a_keyName);\n\tif (keyID == noID)\n\t{\n\t\treturn ret;\n\t}\n\tfor (size_t valueID = 0; valueID < m_Keys[static_cast<size_t>(keyID)].m_Names.size(); ++valueID)\n\t{\n\t\tret.emplace_back(m_Keys[static_cast<size_t>(keyID)].m_Names[valueID], m_Keys[static_cast<size_t>(keyID)].m_Values[valueID]);\n\t}\n\treturn ret;\n}\n\n\n\n\n\nAStringVector ReadUpgradeIniPorts(\n\tcSettingsRepositoryInterface & a_Settings,\n\tconst AString & a_KeyName,\n\tconst AString & a_PortsValueName,\n\tconst AString & a_OldIPv4ValueName,\n\tconst AString & a_OldIPv6ValueName,\n\tconst AString & a_DefaultValue\n)\n{\n\t// Read the regular value, but don't use the default (in order to detect missing value for upgrade):\n\n\tAStringVector Ports;\n\n\tfor (const auto & pair : a_Settings.GetValues(a_KeyName))\n\t{\n\t\tif (pair.first != a_PortsValueName)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tAStringVector temp = StringSplitAndTrim(pair.second, \";,\");\n\t\tPorts.insert(Ports.end(), temp.begin(), temp.end());\n\t}\n\n\tif (Ports.empty())\n\t{\n\t\t// Historically there were two separate entries for IPv4 and IPv6, merge them and migrate:\n\t\tAString Ports4 = a_Settings.GetValue(a_KeyName, a_OldIPv4ValueName, a_DefaultValue);\n\t\tAString Ports6 = a_Settings.GetValue(a_KeyName, a_OldIPv6ValueName);\n\t\tPorts = MergeStringVectors(StringSplitAndTrim(Ports4, \";,\"), StringSplitAndTrim(Ports6, \";,\"));\n\t\ta_Settings.DeleteValue(a_KeyName, a_OldIPv4ValueName);\n\t\ta_Settings.DeleteValue(a_KeyName, a_OldIPv6ValueName);\n\n\t\t// If those weren't present or were empty, use the default:\"\n\t\tif (Ports.empty())\n\t\t{\n\t\t\tPorts = StringSplitAndTrim(a_DefaultValue, \";,\");\n\t\t}\n\t\ta_Settings.SetValue(a_KeyName, a_PortsValueName, StringsConcat(Ports, ','));\n\t}\n\n\treturn Ports;\n}\n\n\n\n"
  },
  {
    "path": "src/IniFile.h",
    "content": "// IniFile.cpp:  Implementation of the CIniFile class.\n// Written by:   Adam Clauss\n// Email: cabadam@tamu.edu\n// You may use this class / code as you wish in your programs.  Feel free to distribute it, and\n// email suggested changes to me.\n//\n// Rewritten by: Shane Hill\n// Date:         2001-08-21\n// Email:        Shane.Hill@dsto.defence.gov.au\n// Reason:       Remove dependancy on MFC. Code should compile on any\n//               platform. Tested on Windows / Linux / Irix\n////////////////////////////////////////////////////////////////////////////////\n\n/*\n!! MODIFIED BY FAKETRUTH and madmaxoft!!\n*/\n\n#pragma once\n\n\n#include \"SettingsRepositoryInterface.h\"\n\n#define MAX_KEYNAME    128\n#define MAX_VALUENAME  128\n#define MAX_VALUEDATA 2048\n\n\n\n\n\n// tolua_begin\n\nclass cIniFile:\n\tpublic cSettingsRepositoryInterface\n{\nprivate:\n\n\t// tolua_end\n\n\tusing Super = cSettingsRepositoryInterface;\n\n\n\tbool m_IsCaseInsensitive;\n\n\tAString m_Filename;\n\n\tstruct key\n\t{\n\t\tstd::vector<AString> m_Names;\n\t\tstd::vector<AString> m_Values;\n\t\tstd::vector<AString> m_Comments;\n\t} ;\n\n\tstd::vector<key>     m_Keys;\n\tstd::vector<AString> m_Names;\n\tstd::vector<AString> m_Comments;\n\n\t/** If the object is case-insensitive, returns s as lowercase; otherwise returns s as-is */\n\tAString CheckCase(const AString & s) const;\n\n\t/** Removes the UTF-8 BOMs (Byte order makers), if present. */\n\tvoid RemoveBom(AString & a_line) const;\n\n\t// tolua_begin\n\npublic:\n\n\t// NOTE: This has to be present for ToLua++'s parser to output the noID constant into the API\n\t// We don't want to export the entire base class, so the constant needs to get pulled into this descendant\n\tenum\n\t{\n\t\tnoID = Super::noID,\n\t};\n\n\n\t/** Creates a new instance with no data */\n\tcIniFile(void);\n\n\t// tolua_end\n\n\tvirtual std::vector<std::pair<AString, AString>> GetValues(AString a_keyName) override;\n\n\tvirtual bool KeyExists(const AString a_keyName) const override;\n\n\t// tolua_begin\n\n\t// Sets whether or not keynames and valuenames should be case sensitive.\n\t// The default is case insensitive.\n\tvoid CaseSensitive  (void) { m_IsCaseInsensitive = false; }\n\tvoid CaseInsensitive(void) { m_IsCaseInsensitive = true; }\n\n\t/** Reads the contents of the specified ini file\n\tIf the file doesn't exist and a_AllowExampleRedirect is true, tries to read <basename>.example.ini, and\n\twrites its contents as <basename>.ini, if successful.\n\tReturns true if successful, false otherwise. */\n\tbool ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect = true);\n\n\t/** Writes data stored in class to the specified ini file.\n\tReturns true on success, false on failure. */\n\tbool WriteFile(const AString & a_FileName) const;\n\n\tvirtual bool Flush() override { return WriteFile(m_Filename); }\n\n\t/** Deletes all stored ini data (but doesn't touch the file) */\n\tvoid Clear(void);\n\n\t/** Returns true iff the specified value exists. */\n\tbool HasValue(const AString & a_KeyName, const AString & a_ValueName) const override;\n\n\t/** Returns index of specified key, or noID if not found */\n\tint FindKey(const AString & keyname) const;\n\n\t/** Returns index of specified value, in the specified key, or noID if not found */\n\tint FindValue(const int keyID, const AString & valuename) const;\n\n\t/** Returns number of keys currently in the ini */\n\tint GetNumKeys(void) const { return static_cast<int>(m_Keys.size()); }\n\n\t/** Add a key name */\n\tint AddKeyName(const AString & keyname) override;\n\n\t// Returns key names by index.\n\tAString GetKeyName(const int keyID) const;\n\n\t// Returns number of values stored for specified key.\n\tint GetNumValues(const AString & keyname) const;\n\tint GetNumValues(const int keyID) const;\n\n\t// Returns value name by index for a given keyname or keyID.\n\tAString GetValueName(const AString & keyname, const int valueID) const;\n\tAString GetValueName(const int keyID, const int valueID) const;\n\n\t// Gets value of [keyname] valuename =.\n\t// Overloaded to return string, int, and double.\n\t// Returns defValue if key / value not found.\n\tAString GetValue (const AString & keyname, const AString & valuename, const AString & defValue = \"\")    const override;\n\tAString GetValue (const int keyID,    const int valueID,    const AString & defValue = \"\")    const;\n\tdouble  GetValueF(const AString & keyname, const AString & valuename, const double    defValue = 0)     const;\n\tint     GetValueI(const AString & keyname, const AString & valuename, const int       defValue = 0)     const;\n\tbool    GetValueB(const AString & keyname, const AString & valuename, const bool      defValue = false) const\n\t{\n\t\treturn (GetValueI(keyname, valuename, defValue ? 1 : 0) != 0);\n\t}\n\n\t// Gets the value; if not found, write the default to the INI file\n\tAString GetValueSet (const AString & keyname, const AString & valuename, const AString & defValue = \"\") override;\n\tdouble  GetValueSetF(const AString & keyname, const AString & valuename, const double    defValue = 0.0);\n\tint     GetValueSetI(const AString & keyname, const AString & valuename, const int       defValue = 0) override;\n\tInt64   GetValueSetI(const AString & keyname, const AString & valuename, const Int64     defValue = 0) override;\n\tbool    GetValueSetB(const AString & keyname, const AString & valuename, const bool      defValue = false) override\n\t{\n\t\treturn (GetValueSetI(keyname, valuename, defValue ? 1 : 0) != 0);\n\t}\n\n\t// Adds a new value to the specified key.\n\t// If a value of the same name already exists, creates another one (non-standard INI file)\n\tvoid AddValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value) override;\n\tvoid AddValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value);\n\tvoid AddValueB(const AString & a_KeyName, const AString & a_ValueName, const bool a_Value)\n\t{\n\t\treturn AddValueI(a_KeyName, a_ValueName, a_Value ? 1 : 0);\n\t}\n\tvoid AddValueF(const AString & a_KeyName, const AString & a_ValueName, const double a_Value);\n\n\t// Overwrites the value of [keyname].valuename\n\t// Specify the optional parameter as false (0) if you do not want the value created if it doesn't exist.\n\t// Returns true if value set, false otherwise.\n\t// Overloaded to accept string, int, and double.\n\tbool SetValue (const int keyID, const int valueID, const AString & value);\n\tbool SetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists = true) override;\n\tbool SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists = true) override;\n\tbool SetValueI(const AString & a_Keyname, const AString & a_ValueName, const Int64 a_Value, const bool a_CreateIfNotExists = true);\n\tbool SetValueB(const AString & a_KeyName, const AString & a_ValueName, const bool a_Value, const bool a_CreateIfNotExists = true)\n\t{\n\t\treturn SetValueI(a_KeyName, a_ValueName, int(a_Value), a_CreateIfNotExists);\n\t}\n\tbool SetValueF(const AString & a_KeyName, const AString & a_ValueName, const double a_Value, const bool a_CreateIfNotExists = true);\n\n\t// Deletes specified value.\n\t// Returns true if value existed and deleted, false otherwise.\n\tbool DeleteValueByID(const int keyID, const int valueID);\n\tbool DeleteValue(const AString & keyname, const AString & valuename) override;\n\n\t// Deletes specified key and all values contained within.\n\t// Returns true if key existed and deleted, false otherwise.\n\tbool DeleteKey(const AString & keyname);\n\n\t// Header comment functions.\n\t// Header comments are those comments before the first key.\n\n\t/** Returns the number of header comments */\n\tint GetNumHeaderComments(void) {return static_cast<int>(m_Comments.size());}\n\n\t/** Adds a header comment */\n\tvoid AddHeaderComment(const AString & comment);\n\n\t/** Returns a header comment, or empty string if out of range */\n\tAString GetHeaderComment(const int commentID) const;\n\n\t/** Deletes a header comment. Returns true if successful */\n\tbool DeleteHeaderComment(int commentID);\n\n\t/** Deletes all header comments */\n\tvoid DeleteHeaderComments(void) {m_Comments.clear();}\n\n\n\t// Key comment functions.\n\t// Key comments are those comments within a key. Any comments\n\t// defined within value names will be added to this list. Therefore,\n\t// these comments will be moved to the top of the key definition when\n\t// the CIniFile::WriteFile() is called.\n\n\t/** Get number of key comments */\n\tint GetNumKeyComments(const int keyID) const;\n\n\t/** Get number of key comments */\n\tint GetNumKeyComments(const AString & keyname) const;\n\n\t/** Add a key comment */\n\tbool AddKeyComment(const int keyID, const AString & comment);\n\n\t/** Add a key comment */\n\tbool AddKeyComment(const AString & keyname, const AString & comment) override;\n\n\t/** Return a key comment */\n\tAString GetKeyComment(const int keyID, const int commentID) const;\n\tAString GetKeyComment(const AString & keyname, const int commentID) const override;\n\n\t// Delete a key comment.\n\tbool DeleteKeyComment(const int keyID, const int commentID);\n\tbool DeleteKeyComment(const AString & keyname, const int commentID) override;\n\n\t// Delete all comments for a key.\n\tbool DeleteKeyComments(const int keyID);\n\tbool DeleteKeyComments(const AString & keyname);\n};\n\n// tolua_end\n\n\n\n\n\n/** Reads the list of ports from the INI file, possibly upgrading from IPv4 / IPv6-specific values into new version-agnostic value.\nReads the list of ports from a_PortsValueName. If that value doesn't exist or is empty, the list is combined from values\nin a_OldIPv4ValueName and a_OldIPv6ValueName; in this case the old values are removed from the INI file.\nIf there is none of the three values or they are all empty, the default is used and stored in the Ports value. */\nAStringVector ReadUpgradeIniPorts(\n\tcSettingsRepositoryInterface & a_Settings,\n\tconst AString & a_KeyName,\n\tconst AString & a_PortsValueName,\n\tconst AString & a_OldIPv4ValueName,\n\tconst AString & a_OldIPv6ValueName,\n\tconst AString & a_DefaultValue\n);\n\n\n\n"
  },
  {
    "path": "src/Inventory.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Inventory.h\"\n#include \"Entities/Player.h\"\n#include \"ClientHandle.h\"\n#include \"UI/Window.h\"\n#include \"Item.h\"\n#include \"Root.h\"\n#include \"World.h\"\n\n#include \"json/json.h\"\n\n#include \"Items/ItemHandler.h\"\n\n\n\n\n\ncInventory::cInventory(cPlayer & a_Owner) :\n\tm_ArmorSlots    (1, 4),  // 1 x 4 slots\n\tm_InventorySlots(9, 3),  // 9 x 3 slots\n\tm_HotbarSlots   (9, 1),  // 9 x 1 slots\n\tm_ShieldSlots   (1, 1),  // 1 x 1 slots\n\tm_Owner(a_Owner)\n{\n\t// Ask each ItemGrid to report changes to us:\n\tm_ArmorSlots.AddListener(*this);\n\tm_InventorySlots.AddListener(*this);\n\tm_HotbarSlots.AddListener(*this);\n\tm_ShieldSlots.AddListener(*this);\n\n\tSetEquippedSlotNum(0);\n}\n\n\n\n\n\nvoid cInventory::Clear(void)\n{\n\tm_ArmorSlots.Clear();\n\tm_InventorySlots.Clear();\n\tm_HotbarSlots.Clear();\n\tm_ShieldSlots.Clear();\n}\n\n\n\n\n\nint cInventory::HowManyCanFit(const cItem & a_ItemStack, bool a_ConsiderEmptySlots)\n{\n\treturn HowManyCanFit(a_ItemStack, 0, invNumSlots - 1, a_ConsiderEmptySlots);\n}\n\n\n\n\n\nint cInventory::HowManyCanFit(const cItem & a_ItemStack, int a_BeginSlotNum, int a_EndSlotNum, bool a_ConsiderEmptySlots)\n{\n\n\tUNUSED(a_ConsiderEmptySlots);\n\tif ((a_BeginSlotNum < 0) || (a_BeginSlotNum >= invNumSlots))\n\t{\n\t\tLOGWARNING(\"%s: Bad BeginSlotNum, got %d, there are %d slots; correcting to 0.\", __FUNCTION__, a_BeginSlotNum, invNumSlots - 1);\n\t\ta_BeginSlotNum = 0;\n\t}\n\tif ((a_EndSlotNum < 0) || (a_EndSlotNum >= invNumSlots))\n\t{\n\t\tLOGWARNING(\"%s: Bad EndSlotNum, got %d, there are %d slots; correcting to %d.\", __FUNCTION__, a_BeginSlotNum, invNumSlots, invNumSlots - 1);\n\t\ta_EndSlotNum = invNumSlots - 1;\n\t}\n\tif (a_BeginSlotNum > a_EndSlotNum)\n\t{\n\t\tstd::swap(a_BeginSlotNum, a_EndSlotNum);\n\t}\n\n\tchar NumLeft = a_ItemStack.m_ItemCount;\n\tchar MaxStack = a_ItemStack.GetMaxStackSize();\n\tfor (int i = a_BeginSlotNum; i <= a_EndSlotNum; i++)\n\t{\n\t\tconst cItem & Slot = GetSlot(i);\n\t\tif (Slot.IsEmpty())\n\t\t{\n\t\t\tNumLeft -= MaxStack;\n\t\t}\n\t\telse if (Slot.IsEqual(a_ItemStack))\n\t\t{\n\t\t\tNumLeft -= MaxStack - Slot.m_ItemCount;\n\t\t}\n\t\tif (NumLeft <= 0)\n\t\t{\n\t\t\t// All items fit\n\t\t\treturn a_ItemStack.m_ItemCount;\n\t\t}\n\t}  // for i - m_Slots[]\n\treturn a_ItemStack.m_ItemCount - NumLeft;\n}\n\n\n\n\n\nchar cInventory::AddItem(const cItem & a_Item, bool a_AllowNewStacks)\n{\n\tm_Owner.AddKnownItem(a_Item);\n\n\tcItem ToAdd(a_Item);\n\tchar res = 0;\n\n\t// When the item is a armor, try to set it directly to the armor slot.\n\tif (ItemCategory::IsArmor(a_Item.m_ItemType))\n\t{\n\t\tfor (int i = 0; i < m_ArmorSlots.GetNumSlots(); i++)\n\t\t{\n\t\t\tif (m_ArmorSlots.GetSlot(i).IsEmpty() && cSlotAreaArmor::CanPlaceArmorInSlot(i, a_Item))\n\t\t\t{\n\t\t\t\tm_ArmorSlots.SetSlot(i, a_Item);\n\t\t\t\treturn a_Item.m_ItemCount;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add to existing stacks in the hotbar.\n\tres += m_HotbarSlots.AddItem(ToAdd, false);\n\tToAdd.m_ItemCount = static_cast<char>(a_Item.m_ItemCount - res);\n\tif (ToAdd.m_ItemCount == 0)\n\t{\n\t\treturn res;\n\t}\n\n\t// Add to existing stacks in main inventory.\n\tres += m_InventorySlots.AddItem(ToAdd, false);\n\tToAdd.m_ItemCount = static_cast<char>(a_Item.m_ItemCount - res);\n\tif (ToAdd.m_ItemCount == 0)\n\t{\n\t\treturn res;\n\t}\n\n\t// All existing stacks are now filled.\n\tif (!a_AllowNewStacks)\n\t{\n\t\treturn res;\n\t}\n\n\t// Try adding new stacks to the hotbar.\n\tres += m_HotbarSlots.AddItem(ToAdd, true);\n\tToAdd.m_ItemCount = static_cast<char>(a_Item.m_ItemCount - res);\n\tif (ToAdd.m_ItemCount == 0)\n\t{\n\t\treturn res;\n\t}\n\n\t// Try adding new stacks to the main inventory.\n\tres += m_InventorySlots.AddItem(ToAdd, true);\n\treturn res;\n}\n\n\n\n\n\nchar cInventory::AddItems(cItems & a_ItemStackList, bool a_AllowNewStacks)\n{\n\tchar TotalAdded = 0;\n\tfor (cItems::iterator itr = a_ItemStackList.begin(); itr != a_ItemStackList.end();)\n\t{\n\t\tchar NumAdded = AddItem(*itr, a_AllowNewStacks);\n\t\tif (itr->m_ItemCount == NumAdded)\n\t\t{\n\t\t\titr = a_ItemStackList.erase(itr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\titr->m_ItemCount -= NumAdded;\n\t\t\t++itr;\n\t\t}\n\t\tTotalAdded += NumAdded;\n\t}\n\treturn TotalAdded;\n}\n\n\n\n\n\nint cInventory::RemoveItem(const cItem & a_ItemStack)\n{\n\tchar RemovedItems = m_ShieldSlots.RemoveItem(a_ItemStack);\n\n\tif (RemovedItems < a_ItemStack.m_ItemCount)\n\t{\n\t\tRemovedItems += m_HotbarSlots.RemoveItem(a_ItemStack);\n\t}\n\n\tif (RemovedItems < a_ItemStack.m_ItemCount)\n\t{\n\t\tcItem Temp(a_ItemStack);\n\t\tTemp.m_ItemCount -= RemovedItems;\n\t\tRemovedItems += m_InventorySlots.RemoveItem(Temp);\n\t}\n\n\treturn RemovedItems;\n}\n\n\n\n\n\ncItem * cInventory::FindItem(const cItem & a_RecipeItem)\n{\n\tcItem * Item = m_ShieldSlots.FindItem(a_RecipeItem);\n\tif (Item != nullptr)\n\t{\n\t\treturn Item;\n\t}\n\tItem = m_HotbarSlots.FindItem(a_RecipeItem);\n\tif (Item != nullptr)\n\t{\n\t\treturn Item;\n\t}\n\n\treturn \tm_InventorySlots.FindItem(a_RecipeItem);\n}\n\n\n\n\n\nbool cInventory::RemoveOneEquippedItem(void)\n{\n\tif (m_HotbarSlots.GetSlot(m_EquippedSlotNum).IsEmpty())\n\t{\n\t\treturn false;\n\t}\n\n\tm_HotbarSlots.ChangeSlotCount(m_EquippedSlotNum, -1);\n\treturn true;\n}\n\n\n\n\n\nint cInventory::ReplaceOneEquippedItem(const cItem & a_Item, bool a_TryOtherSlots)\n{\n\t// Ignore whether there was an item in the slot to remove.\n\tRemoveOneEquippedItem();\n\n\tauto EquippedItem = GetEquippedItem();\n\tif (EquippedItem.IsEmpty())\n\t{\n\t\tSetEquippedItem(a_Item);\n\t\treturn a_Item.m_ItemCount;\n\t}\n\n\t// Handle case when equipped item is the same as the replacement item.\n\tcItem ItemsToAdd = a_Item;\n\tif (EquippedItem.IsEqual(ItemsToAdd))\n\t{\n\t\tauto AmountToAdd = std::min(static_cast<char>(ItemsToAdd.GetMaxStackSize() - EquippedItem.m_ItemCount), ItemsToAdd.m_ItemCount);\n\n\t\tEquippedItem.m_ItemCount += AmountToAdd;\n\t\tSetEquippedItem(EquippedItem);\n\t\tItemsToAdd.m_ItemCount -= AmountToAdd;\n\t}\n\n\tauto ItemsAdded = a_Item.m_ItemCount - ItemsToAdd.m_ItemCount;\n\n\tif (ItemsToAdd.m_ItemCount == 0)\n\t{\n\t\treturn ItemsAdded;\n\t}\n\n\tif (!a_TryOtherSlots)\n\t{\n\t\treturn ItemsAdded;\n\t}\n\n\t// Try the rest of the inventory.\n\treturn AddItem(ItemsToAdd) + ItemsAdded;\n}\n\n\n\n\n\nint cInventory::HowManyItems(const cItem & a_Item)\n{\n\treturn\n\t\tm_ArmorSlots.HowManyItems(a_Item) +\n\t\tm_InventorySlots.HowManyItems(a_Item) +\n\t\tm_HotbarSlots.HowManyItems(a_Item) +\n\t\tm_ShieldSlots.HowManyItems(a_Item);\n}\n\n\n\n\n\nbool cInventory::HasItems(const cItem & a_ItemStack)\n{\n\tint CurrentlyHave = HowManyItems(a_ItemStack);\n\treturn (CurrentlyHave >= a_ItemStack.m_ItemCount);\n}\n\n\n\n\n\nvoid cInventory::SetSlot(int a_SlotNum, const cItem & a_Item)\n{\n\tif ((a_SlotNum < 0) || (a_SlotNum >= invNumSlots))\n\t{\n\t\tLOGWARNING(\"%s: requesting an invalid slot index: %d out of %d. Ignoring.\", __FUNCTION__, a_SlotNum, invNumSlots - 1);\n\t\treturn;\n\t}\n\n\tint GridSlotNum = 0;\n\tcItemGrid * Grid = GetGridForSlotNum(a_SlotNum, GridSlotNum);\n\tif (Grid == nullptr)\n\t{\n\t\tLOGWARNING(\"%s(%d): requesting an invalid itemgrid. Ignoring.\", __FUNCTION__, a_SlotNum);\n\t\treturn;\n\t}\n\tGrid->SetSlot(GridSlotNum, a_Item);\n}\n\n\n\n\n\nvoid cInventory::SetArmorSlot(int a_ArmorSlotNum, const cItem & a_Item)\n{\n\tm_ArmorSlots.SetSlot(a_ArmorSlotNum, a_Item);\n}\n\n\n\n\n\nvoid cInventory::SetInventorySlot(int a_InventorySlotNum, const cItem & a_Item)\n{\n\tm_InventorySlots.SetSlot(a_InventorySlotNum, a_Item);\n}\n\n\n\n\n\nvoid cInventory::SetHotbarSlot(int a_HotBarSlotNum, const cItem & a_Item)\n{\n\tm_HotbarSlots.SetSlot(a_HotBarSlotNum, a_Item);\n}\n\n\n\n\n\nvoid cInventory::SetShieldSlot(const cItem & a_Item)\n{\n\tm_ShieldSlots.SetSlot(0, a_Item);\n}\n\n\n\n\n\nvoid cInventory::SetEquippedItem(const cItem & a_Item)\n{\n\tSetHotbarSlot(GetEquippedSlotNum(), a_Item);\n}\n\n\n\n\n\nvoid cInventory::SendEquippedSlot()\n{\n\tint EquippedSlotNum = cInventory::invArmorCount + cInventory::invInventoryCount + GetEquippedSlotNum();\n\tSendSlot(EquippedSlotNum);\n}\n\n\n\n\n\nconst cItem & cInventory::GetSlot(int a_SlotNum) const\n{\n\tif ((a_SlotNum < 0) || (a_SlotNum >= invNumSlots))\n\t{\n\t\tLOGWARNING(\"%s: requesting an invalid slot index: %d out of %d. Returning the first inventory slot instead.\", __FUNCTION__, a_SlotNum, invNumSlots - 1);\n\t\treturn m_InventorySlots.GetSlot(0);\n\t}\n\tint GridSlotNum = 0;\n\tconst cItemGrid * Grid = GetGridForSlotNum(a_SlotNum, GridSlotNum);\n\tif (Grid == nullptr)\n\t{\n\t\t// Something went wrong, but we don't know what. We must return a value, so return the first inventory slot\n\t\tLOGWARNING(\"%s(%d): requesting an invalid ItemGrid, returning the first inventory slot instead.\", __FUNCTION__, a_SlotNum);\n\t\treturn m_InventorySlots.GetSlot(0);\n\t}\n\treturn Grid->GetSlot(GridSlotNum);\n}\n\n\n\n\n\nconst cItem & cInventory::GetArmorSlot(int a_ArmorSlotNum) const\n{\n\tif ((a_ArmorSlotNum < 0) || (a_ArmorSlotNum >= invArmorCount))\n\t{\n\t\tLOGWARNING(\"%s: requesting an invalid slot index: %d out of %d. Returning the first one instead\", __FUNCTION__, a_ArmorSlotNum, invArmorCount - 1);\n\t\treturn m_ArmorSlots.GetSlot(0);\n\t}\n\treturn m_ArmorSlots.GetSlot(a_ArmorSlotNum);\n}\n\n\n\n\n\nconst cItem & cInventory::GetInventorySlot(int a_InventorySlotNum) const\n{\n\tif ((a_InventorySlotNum < 0) || (a_InventorySlotNum >= invInventoryCount))\n\t{\n\t\tLOGWARNING(\"%s: requesting an invalid slot index: %d out of %d. Returning the first one instead\", __FUNCTION__, a_InventorySlotNum, invInventoryCount - 1);\n\t\treturn m_InventorySlots.GetSlot(0);\n\t}\n\treturn m_InventorySlots.GetSlot(a_InventorySlotNum);\n}\n\n\n\n\n\nconst cItem & cInventory::GetHotbarSlot(int a_SlotNum) const\n{\n\tif ((a_SlotNum < 0) || (a_SlotNum >= invHotbarCount))\n\t{\n\t\tLOGWARNING(\"%s: requesting an invalid slot index: %d out of %d. Returning the first one instead\", __FUNCTION__, a_SlotNum, invHotbarCount - 1);\n\t\treturn m_HotbarSlots.GetSlot(0);\n\t}\n\treturn m_HotbarSlots.GetSlot(a_SlotNum);\n}\n\n\n\n\n\nconst cItem & cInventory::GetShieldSlot() const\n{\n\treturn m_ShieldSlots.GetSlot(0);\n}\n\n\n\n\n\nconst cItem & cInventory::GetEquippedItem(void) const\n{\n\treturn GetHotbarSlot(m_EquippedSlotNum);\n}\n\n\n\n\n\nvoid cInventory::SetEquippedSlotNum(int a_SlotNum)\n{\n\tif ((a_SlotNum < 0) || (a_SlotNum >= invHotbarCount))\n\t{\n\t\tLOGWARNING(\"%s: requesting invalid slot index: %d out of %d. Setting 0 instead.\", __FUNCTION__, a_SlotNum, invHotbarCount - 1);\n\t\tm_EquippedSlotNum = 0;\n\t}\n\telse\n\t{\n\t\tm_EquippedSlotNum = a_SlotNum;\n\t}\n}\n\n\n\n\n\nbool cInventory::DamageEquippedItem(short a_Amount)\n{\n\treturn DamageItem(invHotbarOffset + m_EquippedSlotNum, a_Amount);\n}\n\n\n\n\n\nchar cInventory::ChangeSlotCount(int a_SlotNum, char a_AddToCount)\n{\n\tint GridSlotNum = 0;\n\tcItemGrid * Grid = GetGridForSlotNum(a_SlotNum, GridSlotNum);\n\tif (Grid == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: invalid slot number, expected 0 .. %d, got %d; ignoring\", __FUNCTION__, invNumSlots, a_SlotNum);\n\t\treturn -1;\n\t}\n\treturn Grid->ChangeSlotCount(GridSlotNum, a_AddToCount);\n}\n\n\n\n\n\nbool cInventory::DamageItem(int a_SlotNum, short a_Amount)\n{\n\tif ((a_SlotNum < 0) || (a_SlotNum >= invNumSlots))\n\t{\n\t\tLOGWARNING(\"%s: requesting an invalid slot index: %d out of %d\", __FUNCTION__, a_SlotNum, invNumSlots - 1);\n\t\treturn false;\n\t}\n\tif (a_Amount <= 0)\n\t{\n\t\treturn false;\n\t}\n\n\tint GridSlotNum = 0;\n\tcItemGrid * Grid = GetGridForSlotNum(a_SlotNum, GridSlotNum);\n\tif (Grid == nullptr)\n\t{\n\t\tLOGWARNING(\"%s(%d, %d): requesting an invalid grid, ignoring.\", __FUNCTION__, a_SlotNum, a_Amount);\n\t\treturn false;\n\t}\n\tif (!Grid->DamageItem(GridSlotNum, a_Amount))\n\t{\n\t\t// The item has been damaged, but did not break yet\n\t\tSendSlot(a_SlotNum);\n\t\treturn false;\n\t}\n\n\t// The item has broken, remove it:\n\tGrid->EmptySlot(GridSlotNum);\n\treturn true;\n}\n\n\n\n\n\nvoid cInventory::CopyToItems(cItems & a_Items)\n{\n\tm_ArmorSlots.CopyToItems(a_Items);\n\tm_InventorySlots.CopyToItems(a_Items);\n\tm_HotbarSlots.CopyToItems(a_Items);\n}\n\n\n\n\n\nvoid cInventory::SendSlot(int a_SlotNum)\n{\n\tcItem Item(GetSlot(a_SlotNum));\n\tif (Item.IsEmpty())\n\t{\n\t\t// Sanitize items that are not completely empty (ie. count == 0, but type != empty)\n\t\tItem.Empty();\n\t}\n\tm_Owner.GetClientHandle()->SendInventorySlot(0, static_cast<short>(a_SlotNum + 5), Item);  // Slots in the client are numbered \"+ 5\" because of crafting grid and result\n}\n\n\n\n\n\n/*\nint cInventory::MoveItem(short a_ItemType, short a_ItemDamage, int a_Count, int a_BeginSlot, int a_EndSlot)\n{\n\tint res = 0;\n\tfor (int i = a_BeginSlot; i <= a_EndSlot; i++)\n\t{\n\t\tif (\n\t\t\tm_Slots[i].IsEmpty() ||\n\t\t\t((m_Slots[i].m_ItemType == a_ItemType) && (m_Slots[i].m_ItemDamage == a_ItemDamage))\n\t\t)\n\t\t{\n\t\t\tint MaxCount = ItemHandler(a_ItemType)->GetMaxStackSize();\n\t\t\tASSERT(m_Slots[i].m_ItemCount <= MaxCount);\n\t\t\tint NumToMove = std::min(a_Count, MaxCount - m_Slots[i].m_ItemCount);\n\t\t\tm_Slots[i].m_ItemCount += NumToMove;\n\t\t\tm_Slots[i].m_ItemDamage = a_ItemDamage;\n\t\t\tm_Slots[i].m_ItemType = a_ItemType;\n\t\t\tSendSlot(i);\n\t\t\tres += NumToMove;\n\t\t\ta_Count -= NumToMove;\n\t\t\tif (a_Count <= 0)\n\t\t\t{\n\t\t\t\t// No more items to distribute\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\t}  // for i - m_Slots[]\n\t// No more space to distribute to\n\treturn res;\n}\n*/\n\n\n\n\n\nint cInventory::ArmorSlotNumToEntityEquipmentID(short a_ArmorSlotNum)\n{\n\tswitch (a_ArmorSlotNum)\n\t{\n\t\tcase 0: return 4;  // Helmet\n\t\tcase 1: return 3;  // Chestplate\n\t\tcase 2: return 2;  // Leggings\n\t\tcase 3: return 1;  // Boots\n\t}\n\tLOGWARN(\"%s: invalid armor slot number: %d\", __FUNCTION__, a_ArmorSlotNum);\n\treturn 0;\n}\n\n\n\n\n\n#if 0\nbool cInventory::AddToBar(cItem & a_Item, const int a_Offset, const int a_Size, bool * a_bChangedSlots, int a_Mode /* = 0 */)\n{\n\t// Fill already present stacks\n\tif (a_Mode < 2)\n\t{\n\t\tint MaxStackSize = cItemHandler::GetItemHandler(a_Item.m_ItemType)->GetMaxStackSize();\n\t\tfor (int i = 0; i < a_Size; i++)\n\t\t{\n\t\t\tif (\n\t\t\t\t(m_Slots[i + a_Offset].m_ItemType == a_Item.m_ItemType) &&\n\t\t\t\t(m_Slots[i + a_Offset].m_ItemCount < MaxStackSize) &&\n\t\t\t\t(m_Slots[i + a_Offset].m_ItemDamage == a_Item.m_ItemDamage)\n\t\t\t)\n\t\t\t{\n\t\t\t\tint NumFree = MaxStackSize - m_Slots[i + a_Offset].m_ItemCount;\n\t\t\t\tif (NumFree >= a_Item.m_ItemCount)\n\t\t\t\t{\n\n\t\t\t\t\t// printf(\"1. Adding %i items ( free: %i)\\n\", a_Item.m_ItemCount, NumFree);\n\t\t\t\t\tm_Slots[i + a_Offset].m_ItemCount += a_Item.m_ItemCount;\n\t\t\t\t\ta_Item.m_ItemCount = 0;\n\t\t\t\t\ta_bChangedSlots[i + a_Offset] = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// printf(\"2. Adding %i items\\n\", NumFree);\n\t\t\t\t\tm_Slots[i + a_Offset].m_ItemCount += (char)NumFree;\n\t\t\t\t\ta_Item.m_ItemCount -= (char)NumFree;\n\t\t\t\t\ta_bChangedSlots[i + a_Offset] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (a_Mode > 0)\n\t{\n\t\t// If we got more left, find first empty slot\n\t\tfor (int i = 0; (i < a_Size) && (a_Item.m_ItemCount > 0); i++)\n\t\t{\n\t\t\tif (m_Slots[i + a_Offset].m_ItemType == -1)\n\t\t\t{\n\t\t\t\tm_Slots[i + a_Offset] = a_Item;\n\t\t\t\ta_Item.m_ItemCount = 0;\n\t\t\t\ta_bChangedSlots[i + a_Offset] = true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n#endif\n\n\n\n\n\nvoid cInventory::UpdateItems(void)\n{\n\tconst cItem & Slot = GetEquippedItem();\n\tif (!Slot.IsEmpty())\n\t{\n\t\tSlot.GetHandler().OnUpdate(m_Owner.GetWorld(), &m_Owner, Slot);\n\t}\n}\n\n\n\n\n\nvoid cInventory::SaveToJson(Json::Value & a_Value)\n{\n\t// The JSON originally included the 4 crafting slots and the result, so we have to put empty items there, too:\n\tcItem EmptyItem;\n\tJson::Value EmptyItemJson;\n\tEmptyItem.GetJson(EmptyItemJson);\n\tfor (int i = 0; i < 5; i++)\n\t{\n\t\ta_Value.append(EmptyItemJson);\n\t}\n\n\t// The 4 armor slots follow:\n\tfor (int i = 0; i < invArmorCount; i++)\n\t{\n\t\tJson::Value JSON_Item;\n\t\tm_ArmorSlots.GetSlot(i).GetJson(JSON_Item);\n\t\ta_Value.append(JSON_Item);\n\t}\n\n\t// Next comes the main inventory:\n\tfor (int i = 0; i < invInventoryCount; i++)\n\t{\n\t\tJson::Value JSON_Item;\n\t\tm_InventorySlots.GetSlot(i).GetJson(JSON_Item);\n\t\ta_Value.append(JSON_Item);\n\t}\n\n\t// The hotbar:\n\tfor (int i = 0; i < invHotbarCount; i++)\n\t{\n\t\tJson::Value JSON_Item;\n\t\tm_HotbarSlots.GetSlot(i).GetJson(JSON_Item);\n\t\ta_Value.append(JSON_Item);\n\t}\n\n\t// Shield slot is the last\n\tJson::Value JSON_Item;\n\tm_ShieldSlots.GetSlot(0).GetJson(JSON_Item);\n\ta_Value.append(JSON_Item);\n}\n\n\n\n\n\nbool cInventory::LoadFromJson(Json::Value & a_Value)\n{\n\tint SlotIdx = 0;\n\n\tfor (Json::Value::iterator itr = a_Value.begin(); itr != a_Value.end(); ++itr, SlotIdx++)\n\t{\n\t\tcItem Item;\n\t\tItem.FromJson(*itr);\n\n\t\t// The JSON originally included the 4 crafting slots and the result slot, so we need to skip the first 5 items:\n\t\tif (SlotIdx < 5)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If we loaded all the slots, stop now, even if the JSON has more:\n\t\tif (SlotIdx - 5 >= invNumSlots)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tint GridSlotNum = 0;\n\t\tcItemGrid * Grid = GetGridForSlotNum(SlotIdx - 5, GridSlotNum);\n\t\tASSERT(Grid != nullptr);\n\t\tGrid->SetSlot(GridSlotNum, Item);\n\t}  // for itr - a_Value[]\n\treturn true;\n}\n\n\n\n\n\nconst cItemGrid * cInventory::GetGridForSlotNum(int a_SlotNum, int & a_GridSlotNum) const\n{\n\tASSERT(a_SlotNum >= 0);\n\n\tif (a_SlotNum < invArmorCount)\n\t{\n\t\ta_GridSlotNum = a_SlotNum;\n\t\treturn &m_ArmorSlots;\n\t}\n\ta_SlotNum -= invArmorCount;\n\tif (a_SlotNum < invInventoryCount)\n\t{\n\t\ta_GridSlotNum = a_SlotNum;\n\t\treturn &m_InventorySlots;\n\t}\n\ta_SlotNum -= invInventoryCount;\n\tif (a_SlotNum < invHotbarCount)\n\t{\n\t\ta_GridSlotNum = a_SlotNum;\n\t\treturn &m_HotbarSlots;\n\t}\n\ta_GridSlotNum = a_SlotNum - invHotbarCount;\n\treturn &m_ShieldSlots;\n}\n\n\n\n\n\ncItemGrid * cInventory::GetGridForSlotNum(int a_SlotNum, int & a_GridSlotNum)\n{\n\tASSERT(a_SlotNum >= 0);\n\n\tif (a_SlotNum < invArmorCount)\n\t{\n\t\ta_GridSlotNum = a_SlotNum;\n\t\treturn &m_ArmorSlots;\n\t}\n\ta_SlotNum -= invArmorCount;\n\tif (a_SlotNum < invInventoryCount)\n\t{\n\t\ta_GridSlotNum = a_SlotNum;\n\t\treturn &m_InventorySlots;\n\t}\n\ta_SlotNum -= invInventoryCount;\n\tif (a_SlotNum < invHotbarCount)\n\t{\n\t\ta_GridSlotNum = a_SlotNum;\n\t\treturn &m_HotbarSlots;\n\t}\n\ta_GridSlotNum = a_SlotNum - invHotbarCount;\n\treturn &m_ShieldSlots;\n}\n\n\n\n\n\nvoid cInventory::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)\n{\n\t// Send the neccessary updates to whoever needs them\n\n\tif (!m_Owner.IsTicking())\n\t{\n\t\t// Owner is not (yet) valid, skip for now\n\t\treturn;\n\t}\n\n\t// Armor update needs broadcast to other players:\n\tcWorld * World = m_Owner.GetWorld();\n\tif ((a_ItemGrid == &m_ArmorSlots) && (World != nullptr))\n\t{\n\t\tWorld->BroadcastEntityEquipment(\n\t\t\tm_Owner, static_cast<short>(ArmorSlotNumToEntityEquipmentID(static_cast<short>(a_SlotNum))),\n\t\t\tm_ArmorSlots.GetSlot(a_SlotNum), m_Owner.GetClientHandle()\n\t\t);\n\t}\n\n\t// Broadcast the Equipped Item, if the Slot is changed.\n\tif ((a_ItemGrid == &m_HotbarSlots) && (m_EquippedSlotNum == a_SlotNum))\n\t{\n\t\tm_Owner.GetWorld()->BroadcastEntityEquipment(m_Owner, 0, GetEquippedItem(), m_Owner.GetClientHandle());\n\t}\n\n\t// Convert the grid-local a_SlotNum to our global SlotNum:\n\tint Base = 0;\n\tif (a_ItemGrid == &m_ArmorSlots)\n\t{\n\t\tBase = invArmorOffset;\n\t}\n\telse if (a_ItemGrid == &m_InventorySlots)\n\t{\n\t\tBase = invInventoryOffset;\n\t}\n\telse if (a_ItemGrid == &m_HotbarSlots)\n\t{\n\t\tBase = invHotbarOffset;\n\t}\n\telse if (a_ItemGrid == &m_ShieldSlots)\n\t{\n\t\tBase = invShieldOffset;\n\t}\n\telse\n\t{\n\t\tASSERT(!\"Unknown ItemGrid calling OnSlotChanged()\");\n\t\treturn;\n\t}\n\n\tSendSlot(Base + a_SlotNum);\n}\n"
  },
  {
    "path": "src/Inventory.h",
    "content": "\n#pragma once\n\n#include \"ItemGrid.h\"\n\n\n\n\n\nnamespace Json\n{\n\tclass Value;\n};\n\nclass cPlayer;\n\n\n\n\n// tolua_begin\n\n/** This class represents the player's inventory\nThe slots are divided into three areas:\n- armor slots     (1 x 4)\n- inventory slots (9 x 3)\n- hotbar slots    (9 x 1)\nThe generic GetSlot(), SetSlot() and HowManyCanFit() functions take the index of the slots,\nas if armor slots, inventory slots and then hotbar slots were put one after another.\nYou can use the invArmorOffset, invInventoryOffset and invHotbarOffset constants.\n*/\n\nclass cInventory :\n\t// tolua_end\n\tpublic cItemGrid::cListener\n\t// tolua_begin\n{\npublic:\n\n\t// Counts and offsets to individual parts of the inventory, as used by GetSlot() / SetSlot() / HowManyCanFit():\n\tenum\n\t{\n\t\tinvArmorCount      = 4,\n\t\tinvInventoryCount  = 9 * 3,\n\t\tinvHotbarCount     = 9,\n\t\tinvShieldCount     = 1,      // Number of slots in shield slots grid\n\n\t\tinvArmorOffset     = 0,\n\t\tinvInventoryOffset = invArmorOffset     + invArmorCount,\n\t\tinvHotbarOffset    = invInventoryOffset + invInventoryCount,\n\t\tinvShieldOffset    = invHotbarOffset    + invHotbarCount,     // Offset where shield slots start\n\t\tinvNumSlots        = invShieldOffset    + invShieldCount\n\t} ;\n\n\t// tolua_end\n\n\tcInventory(cPlayer & a_Owner);\n\n\tvirtual ~cInventory() override {}\n\n\t// tolua_begin\n\n\t/** Removes all items from the entire inventory */\n\tvoid Clear(void);\n\n\t/** Returns number of items out of a_ItemStack that can fit in the storage */\n\tint HowManyCanFit(const cItem & a_ItemStack, bool a_ConsiderEmptySlots = true);\n\n\t/** Returns how many items of the specified type would fit into the slot range specified */\n\tint HowManyCanFit(const cItem & a_ItemStack, int a_BeginSlotNum, int a_EndSlotNum, bool a_ConsiderEmptySlots = true);\n\n\t/** Adds as many items out of a_ItemStack as can fit.\n\tIf a_AllowNewStacks is set to false, only existing stacks can be topped up;\n\tif a_AllowNewStacks is set to true, empty slots can be used for the rest.\n\tFills existing stacks first and fills the hotbar before the main inventory.\n\tReturns the number of items that fit.\n\t*/\n\tchar AddItem(const cItem & a_ItemStack, bool a_AllowNewStacks = true);\n\n\t/** Same as AddItem, but works on an entire list of item stacks.\n\tThe a_ItemStackList is modified to reflect the leftover items.\n\tIf a_AllowNewStacks is set to false, only existing stacks can be topped up;\n\tif a_AllowNewStacks is set to true, empty slots can be used for the rest.\n\tReturns the total number of items that fit.\n\t*/\n\tchar AddItems(cItems & a_ItemStackList, bool a_AllowNewStacks);\n\n\t/** Removes the specified item from the inventory, as many as possible, up to a_ItemStack.m_ItemCount.\n\tReturns the number of items that were removed. */\n\tint RemoveItem(const cItem & a_ItemStack);\n\n\t/** Finds an item based on ItemType and ItemDamage (<- defines the itemType, too) */\n\tcItem * FindItem(const cItem & a_RecipeItem);\n\n\t/** Removes one item out of the currently equipped item stack, returns true if successful, false if empty-handed */\n\tbool RemoveOneEquippedItem(void);\n\n\t/** Removes one item from the the current equipped item stack, and attempts to add the specified item stack\n\tback to the same slot. If it is not possible to place the item in the same slot, optionally (default true) tries to\n\tplace the specified item elsewhere in the inventory. Returns the number of items successfully added. If the\n\tcurrently equipped slot is empty, its contents are simply set to the given Item.\n\t*/\n\tint ReplaceOneEquippedItem(const cItem & a_Item, bool a_TryOtherSlots = true);\n\n\t/** Returns the number of items of type a_Item that are stored */\n\tint HowManyItems(const cItem & a_Item);\n\n\t/** Returns true if there are at least as many items of type a_ItemStack as in a_ItemStack */\n\tbool HasItems(const cItem & a_ItemStack);\n\n\t/** Sends the equipped item slot to the client */\n\tvoid SendEquippedSlot();\n\n\t/** Returns the cItemGrid object representing the armor slots */\n\tcItemGrid & GetArmorGrid(void) { return m_ArmorSlots; }\n\n\t/** Returns the cItemGrid object representing the main inventory slots */\n\tcItemGrid & GetInventoryGrid(void) { return m_InventorySlots; }\n\n\t/** Returns the cItemGrid object representing the hotbar slots */\n\tcItemGrid & GetHotbarGrid(void) { return m_HotbarSlots; }\n\n\t/** Returns the player associated with this inventory */\n\tcPlayer & GetOwner(void) { return m_Owner; }\n\n\t/** Copies the non-empty slots into a_ItemStacks; preserves the original a_Items contents */\n\tvoid CopyToItems(cItems & a_Items);\n\n\t// tolua_end\n\n\t/** Returns the player associated with this inventory (const version) */\n\tconst cPlayer & GetOwner(void) const { return m_Owner; }\n\n\t// tolua_begin\n\n\t/** Returns current item in a_SlotNum slot */\n\tconst cItem & GetSlot(int a_SlotNum) const;\n\t/** Returns current item in a_ArmorSlotNum in armor slots */\n\tconst cItem & GetArmorSlot(int a_ArmorSlotNum) const;\n\t/** Returns current item in a_ArmorSlotNum in inventory slots */\n\tconst cItem & GetInventorySlot(int a_InventorySlotNum) const;\n\t/** Returns current item in a_ArmorSlotNum in hotbar slots */\n\tconst cItem & GetHotbarSlot(int a_HotBarSlotNum) const;\n\t/** Returns current item in shield slot */\n\tconst cItem & GetShieldSlot() const;\n\t/** Returns current equiped item */\n\tconst cItem & GetEquippedItem(void) const;\n\t/** Puts a_Item item in a_SlotNum slot number */\n\tvoid          SetSlot(int a_SlotNum, const cItem & a_Item);\n\t/** Puts a_Item item in a_ArmorSlotNum slot number in armor slots */\n\tvoid          SetArmorSlot(int a_ArmorSlotNum, const cItem & a_Item);\n\t/** Puts a_Item item in a_InventorySlotNum slot number in inventory slots */\n\tvoid          SetInventorySlot(int a_InventorySlotNum, const cItem & a_Item);\n\t/** Puts a_Item item in a_HotBarSlotNum slot number in hotbar slots */\n\tvoid          SetHotbarSlot(int a_HotBarSlotNum, const cItem & a_Item);\n\t/** Sets current item in shield slot */\n\tvoid          SetShieldSlot(const cItem & a_Item);\n\t/** Sets current item in the equipped hotbar slot */\n\tvoid          SetEquippedItem(const cItem & a_Item);\n\t/** Sets equiped item to the a_SlotNum slot number */\n\tvoid          SetEquippedSlotNum(int a_SlotNum);\n\t/** Returns slot number of equiped item */\n\tint           GetEquippedSlotNum(void) { return m_EquippedSlotNum; }\n\n\t/** Adds (or subtracts, if a_AddToCount is negative) to the count of items in the specified slot.\n\tIf the slot is empty, ignores the call.\n\tReturns the new count, or -1 if the slot number is invalid.\n\t*/\n\tchar ChangeSlotCount(int a_SlotNum, char a_AddToCount);\n\n\t/** Adds the specified damage to the specified item; deletes the item and returns true if the item broke. */\n\tbool DamageItem(int a_SlotNum, short a_Amount);\n\n\t/** Adds the specified damage to the currently held item; deletes the item and returns true if the item broke. */\n\tbool DamageEquippedItem(short a_Amount = 1);\n\n\tconst cItem & GetEquippedHelmet    (void) const { return m_ArmorSlots.GetSlot(0); }\n\tconst cItem & GetEquippedChestplate(void) const { return m_ArmorSlots.GetSlot(1); }\n\tconst cItem & GetEquippedLeggings  (void) const { return m_ArmorSlots.GetSlot(2); }\n\tconst cItem & GetEquippedBoots     (void) const { return m_ArmorSlots.GetSlot(3); }\n\n\t// tolua_end\n\n\t/** Sends the slot contents to the owner */\n\tvoid SendSlot(int a_SlotNum);\n\n\t/** Update items (e.g. Maps) */\n\tvoid UpdateItems(void);\n\n\t/** Converts an armor slot number into the ID for the EntityEquipment packet */\n\tstatic int ArmorSlotNumToEntityEquipmentID(short a_ArmorSlotNum);\n\n\tvoid SaveToJson(Json::Value & a_Value);\n\tbool LoadFromJson(Json::Value & a_Value);\n\nprotected:\n\tbool AddToBar(cItem & a_Item, const int a_Offset, const int a_Size, bool * a_bChangedSlots, int a_Mode = 0);\n\n\tcItemGrid m_ArmorSlots;\n\tcItemGrid m_InventorySlots;\n\tcItemGrid m_HotbarSlots;\n\tcItemGrid m_ShieldSlots;\n\n\tint m_EquippedSlotNum;\n\n\tcPlayer & m_Owner;\n\n\t/** Returns the ItemGrid and the (grid-local) slot number for a (global) slot number; return nullptr for invalid SlotNum */\n\tconst cItemGrid * GetGridForSlotNum(int a_SlotNum, int & a_GridSlotNum) const;\n\n\t/** Returns the ItemGrid and the (grid-local) slot number for a (global) slot number; return nullptr for invalid SlotNum */\n\tcItemGrid * GetGridForSlotNum(int a_SlotNum, int & a_GridSlotNum);\n\n\t// cItemGrid::cListener override:\n\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;\n};  // tolua_export\n"
  },
  {
    "path": "src/Item.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Item.h\"\n#include \"BlockType.h\"\n#include \"ItemGrid.h\"\n#include \"json/json.h\"\n#include \"Items/ItemHandler.h\"\n\n#include \"FastRandom.h\"\n\n\n\n\n\ncItem::cItem():\n\tm_ItemType(E_ITEM_EMPTY),\n\tm_ItemCount(0),\n\tm_ItemDamage(0),\n\tm_CustomName(),\n\tm_RepairCost(0),\n\tm_FireworkItem(),\n\tm_ItemColor()\n{\n}\n\n\n\n\n\ncItem::cItem(\n\tshort a_ItemType,\n\tchar a_ItemCount,\n\tshort a_ItemDamage,\n\tconst AString & a_Enchantments,\n\tconst AString & a_CustomName,\n\tconst AStringVector & a_LoreTable\n):\n\tm_ItemType    (a_ItemType),\n\tm_ItemCount   (a_ItemCount),\n\tm_ItemDamage  (a_ItemDamage),\n\tm_Enchantments(a_Enchantments),\n\tm_CustomName  (a_CustomName),\n\tm_LoreTable   (a_LoreTable),\n\tm_RepairCost  (0),\n\tm_FireworkItem(),\n\tm_ItemColor()\n{\n\tif (!IsValidItem(m_ItemType))\n\t{\n\t\tif ((m_ItemType != E_BLOCK_AIR) && (m_ItemType != E_ITEM_EMPTY))\n\t\t{\n\t\t\tLOGWARNING(\"%s: creating an invalid item type (%d), resetting to empty.\", __FUNCTION__, a_ItemType);\n\t\t}\n\t\tEmpty();\n\t}\n}\n\n\n\n\n\nvoid cItem::Empty()\n{\n\tm_ItemType = E_ITEM_EMPTY;\n\tm_ItemCount = 0;\n\tm_ItemDamage = 0;\n\tm_Enchantments.Clear();\n\tm_CustomName = \"\";\n\tm_LoreTable.clear();\n\tm_RepairCost = 0;\n\tm_FireworkItem.EmptyData();\n\tm_ItemColor.Clear();\n}\n\n\n\n\n\nvoid cItem::Clear()\n{\n\tm_ItemType = E_ITEM_EMPTY;\n\tm_ItemCount = 0;\n\tm_ItemDamage = 0;\n\tm_RepairCost = 0;\n\tm_ItemColor.Clear();\n}\n\n\n\n\n\ncItem cItem::CopyOne(void) const\n{\n\tcItem res(*this);\n\tres.m_ItemCount = 1;\n\treturn res;\n}\n\n\n\n\n\ncItem & cItem::AddCount(char a_AmountToAdd)\n{\n\tm_ItemCount += a_AmountToAdd;\n\tif (m_ItemCount <= 0)\n\t{\n\t\tEmpty();\n\t}\n\treturn *this;\n}\n\n\n\n\n\nshort cItem::GetMaxDamage(void) const\n{\n\tswitch (m_ItemType)\n\t{\n\t\tcase E_ITEM_BOW:             return 384;\n\t\tcase E_ITEM_CHAIN_BOOTS:     return 196;\n\t\tcase E_ITEM_CHAIN_CHESTPLATE:return 241;\n\t\tcase E_ITEM_CHAIN_HELMET:    return 166;\n\t\tcase E_ITEM_CHAIN_LEGGINGS:  return 226;\n\t\tcase E_ITEM_DIAMOND_AXE:     return 1561;\n\t\tcase E_ITEM_DIAMOND_BOOTS:   return 430;\n\t\tcase E_ITEM_DIAMOND_CHESTPLATE: return 529;\n\t\tcase E_ITEM_DIAMOND_HELMET:  return 364;\n\t\tcase E_ITEM_DIAMOND_HOE:     return 1561;\n\t\tcase E_ITEM_DIAMOND_LEGGINGS:return 496;\n\t\tcase E_ITEM_DIAMOND_PICKAXE: return 1561;\n\t\tcase E_ITEM_DIAMOND_SHOVEL:  return 1561;\n\t\tcase E_ITEM_DIAMOND_SWORD:   return 1561;\n\t\tcase E_ITEM_ELYTRA:          return 432;\n\t\tcase E_ITEM_FLINT_AND_STEEL: return 64;\n\t\tcase E_ITEM_FISHING_ROD:     return 65;\n\t\tcase E_ITEM_GOLD_AXE:        return 32;\n\t\tcase E_ITEM_GOLD_BOOTS:      return 92;\n\t\tcase E_ITEM_GOLD_CHESTPLATE: return 113;\n\t\tcase E_ITEM_GOLD_HELMET:     return 78;\n\t\tcase E_ITEM_GOLD_HOE:        return 32;\n\t\tcase E_ITEM_GOLD_LEGGINGS:   return 106;\n\t\tcase E_ITEM_GOLD_PICKAXE:    return 32;\n\t\tcase E_ITEM_GOLD_SHOVEL:     return 32;\n\t\tcase E_ITEM_GOLD_SWORD:      return 32;\n\t\tcase E_ITEM_IRON_AXE:        return 250;\n\t\tcase E_ITEM_IRON_BOOTS:      return 196;\n\t\tcase E_ITEM_IRON_CHESTPLATE: return 241;\n\t\tcase E_ITEM_IRON_HELMET:     return 166;\n\t\tcase E_ITEM_IRON_HOE:        return 250;\n\t\tcase E_ITEM_IRON_LEGGINGS:   return 226;\n\t\tcase E_ITEM_IRON_PICKAXE:    return 250;\n\t\tcase E_ITEM_IRON_SHOVEL:     return 250;\n\t\tcase E_ITEM_IRON_SWORD:      return 250;\n\t\tcase E_ITEM_LEATHER_BOOTS:   return 66;\n\t\tcase E_ITEM_LEATHER_CAP:     return 55;\n\t\tcase E_ITEM_LEATHER_PANTS:   return 76;\n\t\tcase E_ITEM_LEATHER_TUNIC:   return 81;\n\t\tcase E_ITEM_SHEARS:          return 250;\n\t\tcase E_ITEM_STONE_AXE:       return 131;\n\t\tcase E_ITEM_STONE_HOE:       return 131;\n\t\tcase E_ITEM_STONE_PICKAXE:   return 131;\n\t\tcase E_ITEM_STONE_SHOVEL:    return 131;\n\t\tcase E_ITEM_STONE_SWORD:     return 131;\n\t\tcase E_ITEM_WOODEN_AXE:      return 59;\n\t\tcase E_ITEM_WOODEN_HOE:      return 59;\n\t\tcase E_ITEM_WOODEN_PICKAXE:  return 59;\n\t\tcase E_ITEM_WOODEN_SHOVEL:   return 59;\n\t\tcase E_ITEM_WOODEN_SWORD:    return 59;\n\n\t\tdefault: return 0;\n\t}\n}\n\n\n\n\n\nbool cItem::DamageItem(short a_Amount)\n{\n\tshort MaxDamage = GetMaxDamage();\n\tif (MaxDamage == 0)\n\t{\n\t\t// Item doesn't have damage\n\t\treturn false;\n\t}\n\n\tm_ItemDamage += a_Amount;\n\treturn (m_ItemDamage > MaxDamage);\n}\n\n\n\n\n\nbool cItem::IsFullStack(void) const\n{\n\treturn (m_ItemCount >= GetMaxStackSize());\n}\n\n\n\n\n\nchar cItem::GetMaxStackSize(void) const\n{\n\treturn cItemHandler::For(m_ItemType).GetMaxStackSize();\n}\n\n\n\n\n\nconst cItemHandler & cItem::GetHandler(void) const\n{\n\treturn cItemHandler::For(m_ItemType);\n}\n\n\n\n\n\nvoid cItem::GetJson(Json::Value & a_OutValue) const\n{\n\ta_OutValue[\"ID\"] = m_ItemType;\n\tif (m_ItemType > 0)\n\t{\n\t\ta_OutValue[\"Count\"] = m_ItemCount;\n\t\ta_OutValue[\"Health\"] = m_ItemDamage;\n\t\tAString Enchantments(m_Enchantments.ToString());\n\t\tif (!Enchantments.empty())\n\t\t{\n\t\t\ta_OutValue[\"ench\"] = Enchantments;\n\t\t}\n\t\tif (!IsCustomNameEmpty())\n\t\t{\n\t\t\ta_OutValue[\"Name\"] = m_CustomName;\n\t\t}\n\t\tif (!IsLoreEmpty())\n\t\t{\n\t\t\tauto & LoreArray = (a_OutValue[\"Lore\"] = Json::Value(Json::arrayValue));\n\n\t\t\tfor (const auto & Line : m_LoreTable)\n\t\t\t{\n\t\t\t\tLoreArray.append(Line);\n\t\t\t}\n\t\t}\n\n\t\tif (m_ItemColor.IsValid())\n\t\t{\n\t\t\ta_OutValue[\"Color_Red\"] = m_ItemColor.GetRed();\n\t\t\ta_OutValue[\"Color_Green\"] = m_ItemColor.GetGreen();\n\t\t\ta_OutValue[\"Color_Blue\"] = m_ItemColor.GetBlue();\n\t\t}\n\n\t\tif ((m_ItemType == E_ITEM_FIREWORK_ROCKET) || (m_ItemType == E_ITEM_FIREWORK_STAR))\n\t\t{\n\t\t\ta_OutValue[\"Flicker\"] = m_FireworkItem.m_HasFlicker;\n\t\t\ta_OutValue[\"Trail\"] = m_FireworkItem.m_HasTrail;\n\t\t\ta_OutValue[\"Type\"] = m_FireworkItem.m_Type;\n\t\t\ta_OutValue[\"FlightTimeInTicks\"] = m_FireworkItem.m_FlightTimeInTicks;\n\t\t\ta_OutValue[\"Colours\"] = m_FireworkItem.ColoursToString(m_FireworkItem);\n\t\t\ta_OutValue[\"FadeColours\"] = m_FireworkItem.FadeColoursToString(m_FireworkItem);\n\t\t}\n\n\t\ta_OutValue[\"RepairCost\"] = m_RepairCost;\n\t}\n}\n\n\n\n\n\nvoid cItem::FromJson(const Json::Value & a_Value)\n{\n\tm_ItemType = static_cast<ENUM_ITEM_TYPE>(a_Value.get(\"ID\", -1).asInt());\n\tif (m_ItemType > 0)\n\t{\n\t\tm_ItemCount = static_cast<char>(a_Value.get(\"Count\", -1).asInt());\n\t\tm_ItemDamage = static_cast<short>(a_Value.get(\"Health\", -1).asInt());\n\t\tm_Enchantments.Clear();\n\t\tm_Enchantments.AddFromString(a_Value.get(\"ench\", \"\").asString());\n\t\tm_CustomName = a_Value.get(\"Name\", \"\").asString();\n\t\tauto Lore = a_Value.get(\"Lore\", Json::arrayValue);\n\t\tfor (auto & Line : Lore)\n\t\t{\n\t\t\tm_LoreTable.push_back(Line.asString());\n\t\t}\n\n\t\tint red = a_Value.get(\"Color_Red\", -1).asInt();\n\t\tint green = a_Value.get(\"Color_Green\", -1).asInt();\n\t\tint blue = a_Value.get(\"Color_Blue\", -1).asInt();\n\t\tif ((red > -1) && (red < static_cast<int>(cColor::COLOR_LIMIT)) && (green > -1) && (green < static_cast<int>(cColor::COLOR_LIMIT)) && (blue > -1) && (blue < static_cast<int>(cColor::COLOR_LIMIT)))\n\t\t{\n\t\t\tm_ItemColor.SetColor(static_cast<unsigned char>(red), static_cast<unsigned char>(green), static_cast<unsigned char>(blue));\n\t\t}\n\t\telse if ((red != -1) || (blue != -1) || (green != -1))\n\t\t{\n\t\t\tLOGWARNING(\"Item with invalid red, green, and blue values read in from json file.\");\n\t\t}\n\n\t\tif ((m_ItemType == E_ITEM_FIREWORK_ROCKET) || (m_ItemType == E_ITEM_FIREWORK_STAR))\n\t\t{\n\t\t\tm_FireworkItem.m_HasFlicker = a_Value.get(\"Flicker\", false).asBool();\n\t\t\tm_FireworkItem.m_HasTrail = a_Value.get(\"Trail\", false).asBool();\n\t\t\tm_FireworkItem.m_Type = static_cast<NIBBLETYPE>(a_Value.get(\"Type\", 0).asInt());\n\t\t\tm_FireworkItem.m_FlightTimeInTicks = static_cast<short>(a_Value.get(\"FlightTimeInTicks\", 0).asInt());\n\t\t\tm_FireworkItem.ColoursFromString(a_Value.get(\"Colours\", \"\").asString(), m_FireworkItem);\n\t\t\tm_FireworkItem.FadeColoursFromString(a_Value.get(\"FadeColours\", \"\").asString(), m_FireworkItem);\n\t\t}\n\n\t\tm_RepairCost = a_Value.get(\"RepairCost\", 0).asInt();\n\t}\n}\n\n\n\n\n\nbool cItem::IsEnchantable(short a_ItemType, bool a_FromBook)\n{\n\tif (\n\t\tItemCategory::IsAxe(a_ItemType) ||\n\t\tItemCategory::IsSword(a_ItemType) ||\n\t\tItemCategory::IsShovel(a_ItemType) ||\n\t\tItemCategory::IsPickaxe(a_ItemType) ||\n\t\t(a_FromBook && ItemCategory::IsHoe(a_ItemType)) ||\n\t\tItemCategory::IsArmor(a_ItemType)\n\t)\n\t{\n\t\treturn true;\n\t}\n\n\tswitch (a_ItemType)\n\t{\n\t\tcase E_ITEM_BOOK:\n\t\tcase E_ITEM_BOW:\n\t\tcase E_ITEM_FISHING_ROD:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tcase E_ITEM_CARROT_ON_STICK:\n\t\tcase E_ITEM_SHEARS:\n\t\tcase E_ITEM_FLINT_AND_STEEL:\n\t\t{\n\t\t\treturn a_FromBook;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nunsigned cItem::GetEnchantability()\n{\n\tswitch (m_ItemType)\n\t{\n\t\tcase E_ITEM_WOODEN_SWORD:\n\t\tcase E_ITEM_WOODEN_PICKAXE:\n\t\tcase E_ITEM_WOODEN_SHOVEL:\n\t\tcase E_ITEM_WOODEN_AXE:\n\t\tcase E_ITEM_WOODEN_HOE: return 15;\n\n\t\tcase E_ITEM_LEATHER_CAP:\n\t\tcase E_ITEM_LEATHER_TUNIC:\n\t\tcase E_ITEM_LEATHER_PANTS:\n\t\tcase E_ITEM_LEATHER_BOOTS: return 15;\n\n\t\tcase E_ITEM_STONE_SWORD:\n\t\tcase E_ITEM_STONE_PICKAXE:\n\t\tcase E_ITEM_STONE_SHOVEL:\n\t\tcase E_ITEM_STONE_AXE:\n\t\tcase E_ITEM_STONE_HOE: return 5;\n\n\t\tcase E_ITEM_IRON_HELMET:\n\t\tcase E_ITEM_IRON_CHESTPLATE:\n\t\tcase E_ITEM_IRON_LEGGINGS:\n\t\tcase E_ITEM_IRON_BOOTS: return 9;\n\n\t\tcase E_ITEM_IRON_SWORD:\n\t\tcase E_ITEM_IRON_PICKAXE:\n\t\tcase E_ITEM_IRON_SHOVEL:\n\t\tcase E_ITEM_IRON_AXE:\n\t\tcase E_ITEM_IRON_HOE: return 14;\n\n\t\tcase E_ITEM_CHAIN_HELMET:\n\t\tcase E_ITEM_CHAIN_CHESTPLATE:\n\t\tcase E_ITEM_CHAIN_LEGGINGS:\n\t\tcase E_ITEM_CHAIN_BOOTS: return 12;\n\n\t\tcase E_ITEM_DIAMOND_HELMET:\n\t\tcase E_ITEM_DIAMOND_CHESTPLATE:\n\t\tcase E_ITEM_DIAMOND_LEGGINGS:\n\t\tcase E_ITEM_DIAMOND_BOOTS: return 10;\n\n\t\tcase E_ITEM_DIAMOND_SWORD:\n\t\tcase E_ITEM_DIAMOND_PICKAXE:\n\t\tcase E_ITEM_DIAMOND_SHOVEL:\n\t\tcase E_ITEM_DIAMOND_AXE:\n\t\tcase E_ITEM_DIAMOND_HOE: return 10;\n\n\t\tcase E_ITEM_GOLD_HELMET:\n\t\tcase E_ITEM_GOLD_CHESTPLATE:\n\t\tcase E_ITEM_GOLD_LEGGINGS:\n\t\tcase E_ITEM_GOLD_BOOTS: return 25;\n\n\t\tcase E_ITEM_GOLD_SWORD:\n\t\tcase E_ITEM_GOLD_PICKAXE:\n\t\tcase E_ITEM_GOLD_SHOVEL:\n\t\tcase E_ITEM_GOLD_AXE:\n\t\tcase E_ITEM_GOLD_HOE: return 22;\n\n\t\tcase E_ITEM_FISHING_ROD:\n\t\tcase E_ITEM_BOW:\n\t\tcase E_ITEM_BOOK: return 1;\n\t}\n\n\treturn 0;\n}\n\n\n\n\n\nbool cItem::EnchantByXPLevels(unsigned a_NumXPLevels, MTRand & a_Random)\n{\n\tif (!cItem::IsEnchantable(m_ItemType))\n\t{\n\t\treturn false;\n\t}\n\n\tconst auto Enchantability = GetEnchantability();\n\tif (Enchantability == 0)\n\t{\n\t\treturn false;\n\t}\n\n\tconst auto ModifiedEnchantmentLevel = a_NumXPLevels + a_Random.RandInt(Enchantability / 4) + a_Random.RandInt(Enchantability / 4) + 1;\n\tconst auto RandomBonus = 1.0F + (a_Random.RandReal() + a_Random.RandReal() - 1.0F) * 0.15F;\n\tconst auto FinalEnchantmentLevel = static_cast<unsigned>(ModifiedEnchantmentLevel * RandomBonus + 0.5F);\n\n\tcWeightedEnchantments Enchantments;\n\tcEnchantments::AddItemEnchantmentWeights(Enchantments, m_ItemType, FinalEnchantmentLevel);\n\n\tif (m_ItemType == E_ITEM_BOOK)\n\t{\n\t\tm_ItemType = E_ITEM_ENCHANTED_BOOK;\n\t}\n\n\tcEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments, a_Random);\n\tm_Enchantments.AddFromString(Enchantment1.ToString());\n\tcEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment1);\n\n\t// Checking for conflicting enchantments\n\tcEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment1);\n\n\t// Next Enchantment (Second)\n\tfloat NewEnchantmentLevel = a_NumXPLevels / 2.0f;\n\tfloat SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50.0f;\n\tif (Enchantments.empty() || !a_Random.RandBool(SecondEnchantmentChance))\n\t{\n\t\treturn true;\n\t}\n\n\tcEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments, a_Random);\n\tm_Enchantments.AddFromString(Enchantment2.ToString());\n\tcEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment2);\n\n\t// Checking for conflicting enchantments\n\tcEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment2);\n\n\t// Next Enchantment (Third)\n\tNewEnchantmentLevel = NewEnchantmentLevel / 2.0f;\n\tfloat ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50.0f;\n\tif (Enchantments.empty() || !a_Random.RandBool(ThirdEnchantmentChance))\n\t{\n\t\treturn true;\n\t}\n\n\tcEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments, a_Random);\n\tm_Enchantments.AddFromString(Enchantment3.ToString());\n\tcEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment3);\n\n\t// Checking for conflicting enchantments\n\tcEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment3);\n\n\t// Next Enchantment (Fourth)\n\tNewEnchantmentLevel = NewEnchantmentLevel / 2.0f;\n\tfloat FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50.0f;\n\tif (Enchantments.empty() || !a_Random.RandBool(FourthEnchantmentChance))\n\t{\n\t\treturn true;\n\t}\n\tcEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments, a_Random);\n\tm_Enchantments.AddFromString(Enchantment4.ToString());\n\n\treturn true;\n}\n\n\n\n\n\nint cItem::AddEnchantment(int a_EnchantmentID, unsigned int a_Level, bool a_FromBook)\n{\n\tunsigned int OurLevel = m_Enchantments.GetLevel(a_EnchantmentID);\n\tint Multiplier = cEnchantments::GetXPCostMultiplier(a_EnchantmentID, a_FromBook);\n\tunsigned int NewLevel = 0;\n\tif (OurLevel > a_Level)\n\t{\n\t\t// They don't add anything to us\n\t\tNewLevel = OurLevel;\n\t}\n\telse if (OurLevel == a_Level)\n\t{\n\t\t// Bump it by 1\n\t\tNewLevel = OurLevel + 1;\n\t}\n\telse\n\t{\n\t\t// Take the sacrifice's level\n\t\tNewLevel = a_Level;\n\t}\n\tunsigned int LevelCap = cEnchantments::GetLevelCap(a_EnchantmentID);\n\tif (NewLevel > LevelCap)\n\t{\n\t\tNewLevel = LevelCap;\n\t}\n\n\tm_Enchantments.SetLevel(a_EnchantmentID, NewLevel);\n\treturn static_cast<int>(NewLevel) * Multiplier;\n}\n\n\n\n\n\nbool cItem::CanHaveEnchantment(int a_EnchantmentID)\n{\n\tif (m_ItemType == E_ITEM_ENCHANTED_BOOK)\n\t{\n\t\t// Enchanted books can take anything\n\t\treturn true;\n\t}\n\n\t// The organization here is based on the summary at:\n\t// https://minecraft.wiki/w/Enchanting\n\t// as of July 2017 (Minecraft 1.12).\n\n\t// Hand tool enchantments\n\tstatic const std::set<int> SwordEnchantments =\n\t{\n\t\tcEnchantments::enchBaneOfArthropods,\n\t\tcEnchantments::enchFireAspect,\n\t\tcEnchantments::enchKnockback,\n\t\tcEnchantments::enchLooting,\n\t\tcEnchantments::enchSharpness,\n\t\tcEnchantments::enchSmite,\n\t\tcEnchantments::enchUnbreaking\n\t};\n\tstatic const std::set<int> AxeEnchantments =\n\t{\n\t\tcEnchantments::enchBaneOfArthropods,\n\t\tcEnchantments::enchEfficiency,\n\t\tcEnchantments::enchFortune,\n\t\tcEnchantments::enchSharpness,\n\t\tcEnchantments::enchSilkTouch,\n\t\tcEnchantments::enchSmite,\n\t\tcEnchantments::enchUnbreaking\n\t};\n\tstatic const std::set<int> ToolEnchantments =\n\t{\n\t\tcEnchantments::enchEfficiency,\n\t\tcEnchantments::enchFortune,\n\t\tcEnchantments::enchSilkTouch,\n\t\tcEnchantments::enchUnbreaking\n\t};\n\tstatic const std::set<int> ShearEnchantments =\n\t{\n\t\tcEnchantments::enchEfficiency,\n\t\tcEnchantments::enchUnbreaking\n\t};\n\tstatic const std::set<int> BowEnchantments =\n\t{\n\t\tcEnchantments::enchFlame,\n\t\tcEnchantments::enchInfinity,\n\t\tcEnchantments::enchPower,\n\t\tcEnchantments::enchPunch\n\t};\n\tstatic const std::set<int> FishingEnchantments =\n\t{\n\t\tcEnchantments::enchLuckOfTheSea,\n\t\tcEnchantments::enchLure\n\t};\n\tstatic const std::set<int> MiscEnchantments =\n\t{\n\t\tcEnchantments::enchUnbreaking\n\t};\n\n\tif (ItemCategory::IsSword(m_ItemType))\n\t{\n\t\treturn SwordEnchantments.count(a_EnchantmentID) > 0;\n\t}\n\tif (ItemCategory::IsAxe(m_ItemType))\n\t{\n\t\treturn AxeEnchantments.count(a_EnchantmentID) > 0;\n\t}\n\tif (ItemCategory::IsPickaxe(m_ItemType) || ItemCategory::IsShovel(m_ItemType))\n\t{\n\t\treturn ToolEnchantments.count(a_EnchantmentID) > 0;\n\t}\n\tif (m_ItemType == E_ITEM_SHEARS)\n\t{\n\t\treturn ShearEnchantments.count(a_EnchantmentID) > 0;\n\t}\n\tif (m_ItemType == E_ITEM_BOW)\n\t{\n\t\treturn BowEnchantments.count(a_EnchantmentID) > 0;\n\t}\n\tif (m_ItemType == E_ITEM_FISHING_ROD)\n\t{\n\t\treturn FishingEnchantments.count(a_EnchantmentID) > 0;\n\t}\n\tif (ItemCategory::IsHoe(m_ItemType) || (m_ItemType == E_ITEM_FLINT_AND_STEEL) || (m_ItemType == E_ITEM_CARROT_ON_STICK) || (m_ItemType == E_ITEM_SHIELD))\n\t{\n\t\treturn MiscEnchantments.count(a_EnchantmentID) > 0;\n\t}\n\n\t// Armor enchantments\n\tstatic const std::set<int> ArmorEnchantments =\n\t{\n\t\tcEnchantments::enchBlastProtection,\n\t\tcEnchantments::enchFireProtection,\n\t\tcEnchantments::enchProjectileProtection,\n\t\tcEnchantments::enchProtection,\n\t\tcEnchantments::enchThorns,\n\t\tcEnchantments::enchUnbreaking\n\t};\n\tstatic const std::set<int> HatOnlyEnchantments =\n\t{\n\t\tcEnchantments::enchAquaAffinity,\n\t\tcEnchantments::enchRespiration\n\t};\n\tstatic const std::set<int> BootOnlyEnchantments =\n\t{\n\t\tcEnchantments::enchDepthStrider,\n\t\tcEnchantments::enchFeatherFalling\n\t};\n\n\tif (ItemCategory::IsBoots(m_ItemType))\n\t{\n\t\treturn (BootOnlyEnchantments.count(a_EnchantmentID) > 0) || (ArmorEnchantments.count(a_EnchantmentID) > 0);\n\t}\n\tif (ItemCategory::IsHelmet(m_ItemType))\n\t{\n\t\treturn (HatOnlyEnchantments.count(a_EnchantmentID) > 0) || (ArmorEnchantments.count(a_EnchantmentID) > 0);\n\t}\n\tif (ItemCategory::IsArmor(m_ItemType))\n\t{\n\t\treturn ArmorEnchantments.count(a_EnchantmentID) > 0;\n\t}\n\treturn false;\n}\n\n\n\n\n\nint cItem::AddEnchantmentsFromItem(const cItem & a_Other)\n{\n\tbool FromBook = (a_Other.m_ItemType == E_ITEM_ENCHANTED_BOOK);\n\n\t// Consider each enchantment seperately\n\tint EnchantingCost = 0;\n\tfor (auto & Enchantment : a_Other.m_Enchantments)\n\t{\n\t\tif (CanHaveEnchantment(Enchantment.first))\n\t\t{\n\t\t\tif (!m_Enchantments.CanAddEnchantment(Enchantment.first))\n\t\t\t{\n\t\t\t\t// Cost of incompatible enchantments\n\t\t\t\tEnchantingCost += 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEnchantingCost += AddEnchantment(Enchantment.first, Enchantment.second, FromBook);\n\t\t\t}\n\t\t}\n\t}\n\treturn EnchantingCost;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cItems:\n\ncItems::cItems(cItem && a_InitialItem)\n{\n\tpush_back(std::move(a_InitialItem));\n}\n\n\n\n\n\ncItem * cItems::Get(int a_Idx)\n{\n\tif ((a_Idx < 0) || (a_Idx >= static_cast<int>(size())))\n\t{\n\t\tLOGWARNING(\"cItems: Attempt to get an out-of-bounds item at index %d; there are currently %zu items. Returning a nil.\", a_Idx, size());\n\t\treturn nullptr;\n\t}\n\treturn &at(static_cast<size_t>(a_Idx));\n}\n\n\n\n\n\nvoid cItems::Set(int a_Idx, const cItem & a_Item)\n{\n\tif ((a_Idx < 0) || (a_Idx >= static_cast<int>(size())))\n\t{\n\t\tLOGWARNING(\"cItems: Attempt to set an item at an out-of-bounds index %d; there are currently %zu items. Not setting.\", a_Idx, size());\n\t\treturn;\n\t}\n\tat(static_cast<size_t>(a_Idx)) = a_Item;\n}\n\n\n\n\n\nvoid cItems::Delete(int a_Idx)\n{\n\tif ((a_Idx < 0) || (a_Idx >= static_cast<int>(size())))\n\t{\n\t\tLOGWARNING(\"cItems: Attempt to delete an item at an out-of-bounds index %d; there are currently %zu items. Ignoring.\", a_Idx, size());\n\t\treturn;\n\t}\n\terase(begin() + a_Idx);\n}\n\n\n\n\n\nvoid cItems::Set(int a_Idx, short a_ItemType, char a_ItemCount, short a_ItemDamage)\n{\n\tif ((a_Idx < 0) || (a_Idx >= static_cast<int>(size())))\n\t{\n\t\tLOGWARNING(\"cItems: Attempt to set an item at an out-of-bounds index %d; there are currently %zu items. Not setting.\", a_Idx, size());\n\t\treturn;\n\t}\n\tat(static_cast<size_t>(a_Idx)) = cItem(a_ItemType, a_ItemCount, a_ItemDamage);\n}\n\n\n\n\n\nbool cItems::Contains(const cItem & a_Item)\n{\n\tfor (const auto & itr : *this)\n\t{\n\t\tif (a_Item.IsEqual(itr))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cItems::ContainsType(const cItem & a_Item)\n{\n\tfor (const auto & itr : *this)\n\t{\n\t\tif (a_Item.IsSameType(itr))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cItems::AddItemGrid(const cItemGrid & a_ItemGrid)\n{\n\tfor (int i = 0; i < a_ItemGrid.GetNumSlots(); ++i)\n\t{\n\t\tconst auto & Slot = a_ItemGrid.GetSlot(i);\n\t\tif (!Slot.IsEmpty())\n\t\t{\n\t\t\tAdd(Slot);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Item.h",
    "content": "\n// Item.h\n\n// Declares the cItem class representing an item (in the inventory sense)\n\n\n\n\n\n#pragma once\n\n#include \"Defines.h\"\n#include \"Enchantments.h\"\n#include \"WorldStorage/FireworksSerializer.h\"\n#include \"Color.h\"\n\n\n\n\n\n// fwd:\nclass cItemHandler;\nclass cItemGrid;\nclass cColor;\n\nnamespace Json\n{\n\tclass Value;\n}\n\n\n\n\n\n// tolua_begin\nclass cItem\n{\npublic:\n\t/** Creates an empty item */\n\tcItem(void);\n\n\t/** Creates an item of the specified type, by default 1 piece with no damage and no enchantments */\n\tcItem(\n\t\tshort a_ItemType,\n\t\tchar a_ItemCount = 1,\n\t\tshort a_ItemDamage = 0,\n\t\tconst AString & a_Enchantments = \"\",\n\t\tconst AString & a_CustomName = \"\",\n\t\tconst AStringVector & a_LoreTable = {}\n\t);\n\n\t// The constructor is disabled in code, because the compiler generates it anyway,\n\t// but it needs to stay because ToLua needs to generate the binding for it\n\t#ifdef TOLUA_EXPOSITION\n\n\t/** Creates an exact copy of the item */\n\tcItem(const cItem & a_CopyFrom);\n\n\t#endif\n\n\t/** Empties the item and frees up any dynamic storage used by the internals. */\n\tvoid Empty(void);\n\n\t/** Empties the item and frees up any dynamic storage used by the internals.\n\tTODO: What is the usage difference? Merge with Empty()? */\n\tvoid Clear(void);\n\n\t/** Returns true if the item represents an empty stack - either the type is invalid, or count is zero. */\n\tbool IsEmpty(void) const\n\t{\n\t\treturn ((m_ItemType <= 0) || (m_ItemCount <= 0));\n\t}\n\n\t/* Returns true if this itemstack can stack with the specified stack (types match, enchantments etc.)\n\tItemCounts are ignored. */\n\tbool IsEqual(const cItem & a_Item) const\n\t{\n\t\treturn (\n\t\t\tIsSameType(a_Item) &&\n\t\t\t(m_ItemDamage == a_Item.m_ItemDamage) &&\n\t\t\t(m_Enchantments == a_Item.m_Enchantments) &&\n\t\t\t(m_CustomName == a_Item.m_CustomName) &&\n\t\t\t(m_LoreTable == a_Item.m_LoreTable) &&\n\t\t\tm_FireworkItem.IsEqualTo(a_Item.m_FireworkItem)\n\t\t);\n\t}\n\n\n\tbool IsSameType(const cItem & a_Item) const\n\t{\n\t\treturn (m_ItemType == a_Item.m_ItemType) || (IsEmpty() && a_Item.IsEmpty());\n\t}\n\n\n\tbool IsBothNameAndLoreEmpty(void) const\n\t{\n\t\treturn (m_CustomName.empty() && m_LoreTable.empty());\n\t}\n\n\n\tbool IsCustomNameEmpty(void) const { return (m_CustomName.empty()); }\n\tbool IsLoreEmpty(void) const { return (m_LoreTable.empty()); }\n\n\t/** Returns a copy of this item with m_ItemCount set to 1. Useful to preserve enchantments etc. on stacked items */\n\tcItem CopyOne(void) const;\n\n\t/** Adds the specified count to this object and returns the reference to self (useful for chaining) */\n\tcItem & AddCount(char a_AmountToAdd);\n\n\t/** Returns the maximum damage value that this item can have; zero if damage is not applied */\n\tshort GetMaxDamage(void) const;\n\n\t/** Damages a weapon / tool. Returns true when damage reaches max value and the item should be destroyed */\n\tbool DamageItem(short a_Amount = 1);\n\n\tinline bool IsDamageable(void) const { return (GetMaxDamage() > 0); }\n\n\t/** Returns true if the item is stacked up to its maximum stacking. */\n\tbool IsFullStack(void) const;\n\n\t/** Returns the maximum amount of stacked items of this type. */\n\tchar GetMaxStackSize(void) const;\n\n\t// tolua_end\n\n\t/** Returns the cItemHandler responsible for this item type */\n\tconst cItemHandler & GetHandler(void) const;\n\n\t/** Saves the item data into JSON representation */\n\tvoid GetJson(Json::Value & a_OutValue) const;\n\n\t/** Loads the item data from JSON representation */\n\tvoid FromJson(const Json::Value & a_Value);\n\n\t/** Returns true if the specified item type is enchantable.\n\tIf FromBook is true, the function is used in the anvil inventory with book enchantments.\n\tSo it checks the \"only book enchantments\" too. Example: You can only enchant a hoe with a book. */\n\tstatic bool IsEnchantable(short a_ItemType, bool a_FromBook = false);  // tolua_export\n\n\t/** Returns the enchantability of the item. When the item hasn't a enchantability, it will returns 0 */\n\tunsigned GetEnchantability();  // tolua_export\n\n\t/** Randomly enchants the item using the specified number of XP levels.\n\tReturns true if the item was enchanted, false if not (not enchantable / too many enchantments already).\n\tRandomness is derived from the provided PRNG. */\n\tbool EnchantByXPLevels(unsigned a_NumXPLevels, MTRand & a_Random);  // Exported in ManualBindings.cpp\n\n\t/** Adds this specific enchantment to this item, returning the cost.\n\tFromBook specifies whether the enchantment should be treated as coming\n\tfrom a book. If true, then the cost returned uses the book values, if\n\tfalse it uses the normal item multipliers. */\n\tint AddEnchantment(int a_EnchantmentID, unsigned int a_Level, bool a_FromBook);  // tolua_export\n\n\t/** Adds the enchantments on a_Other to this item, returning the\n\tXP cost of the transfer. */\n\tint AddEnchantmentsFromItem(const cItem & a_Other);  // tolua_export\n\n\t/** Returns whether or not this item is allowed to have the given enchantment. Note: Does not check whether the enchantment is exclusive with the current enchantments on the item. */\n\tbool CanHaveEnchantment(int a_EnchantmentID);\n\n\t// tolua_begin\n\n\tshort          m_ItemType;\n\tchar           m_ItemCount;\n\tshort          m_ItemDamage;\n\tcEnchantments  m_Enchantments;\n\tAString        m_CustomName;\n\n\t// tolua_end\n\n\tAStringVector  m_LoreTable;  // Exported in ManualBindings.cpp\n\n\t/**\n\tCompares two items for the same type or category. Type of item is defined\n\tvia `m_ItemType` and `m_ItemDamage`. Some items (e.g. planks) have the same\n\t`m_ItemType` and the wood kind is defined via `m_ItemDamage`. `-1` is used\n\tas placeholder for all kinds (e.g. all kind of planks).\n\n\tItems are different when the `ItemType` is different or the `ItemDamage`\n\tis different and unequal -1.\n\t*/\n\tstruct sItemCompare\n\t{\n\t\tbool operator() (const cItem & a_Lhs, const cItem & a_Rhs) const\n\t\t{\n\t\t\tif (a_Lhs.m_ItemType != a_Rhs.m_ItemType)\n\t\t\t{\n\t\t\t\treturn (a_Lhs.m_ItemType < a_Rhs.m_ItemType);\n\t\t\t}\n\t\t\tif ((a_Lhs.m_ItemDamage == -1) || (a_Rhs.m_ItemDamage == -1))\n\t\t\t{\n\t\t\t\treturn false;  // -1 is a wildcard, damage of -1 alway compares equal\n\t\t\t}\n\t\t\treturn (a_Lhs.m_ItemDamage < a_Rhs.m_ItemDamage);\n\t\t}\n\t};\n\n\t// tolua_begin\n\n\tint            m_RepairCost;\n\tcFireworkItem  m_FireworkItem;\n\tcColor         m_ItemColor;\n};\n// tolua_end\n\n\n\n\n\n/** This class bridges a vector of cItem for safe access via Lua. It checks boundaries for all accesses\nNote that this class is zero-indexed!\n*/\nclass cItems  // tolua_export\n\t: public std::vector<cItem>\n{  // tolua_export\npublic:\n\n\tcItems(const cItems &) = default;\n\tcItems(cItems &&) = default;\n\tcItems & operator = (const cItems &) = default;\n\tcItems & operator = (cItems &&) = default;\n\n\t/** Constructs a new instance containing the specified item. */\n\tcItems(cItem && a_InitialItem);\n\n\t// tolua_begin\n\n\t/** Need a Lua-accessible constructor */\n\tcItems(void) {}\n\n\tcItem * Get   (int a_Idx);\n\tvoid    Set   (int a_Idx, const cItem & a_Item);\n\tvoid    Add   (const cItem & a_Item) {push_back(a_Item); }\n\tvoid    Add   (short a_ItemType) { emplace_back(a_ItemType); }\n\tvoid    Add   (short a_ItemType, char a_ItemCount) { emplace_back(a_ItemType, a_ItemCount); }\n\tvoid    Delete(int a_Idx);\n\tvoid    Clear (void) {clear(); }\n\tsize_t  Size  (void) const { return size(); }\n\tvoid    Set   (int a_Idx, short a_ItemType, char a_ItemCount, short a_ItemDamage);\n\tbool    Contains(const cItem & a_Item);\n\tbool    ContainsType(const cItem & a_Item);\n\n\tvoid    Add   (short a_ItemType, char a_ItemCount, short a_ItemDamage)\n\t{\n\t\templace_back(a_ItemType, a_ItemCount, a_ItemDamage);\n\t}\n\n\t/** Adds a copy of all items in a_ItemGrid. */\n\tvoid AddItemGrid(const cItemGrid & a_ItemGrid);\n\n\t// tolua_end\n} ;  // tolua_export\n\n\n\n\n\n/** Used to store loot probability tables */\nclass cLootProbab\n{\npublic:\n\tcItem m_Item;\n\tint   m_MinAmount;\n\tint   m_MaxAmount;\n\tint   m_Weight;\n} ;\n"
  },
  {
    "path": "src/ItemGrid.cpp",
    "content": "\n// ItemGrid.cpp\n\n// Implements the cItemGrid class representing a storage for items in a XY grid (chests, dispensers, inventory etc.)\n\n#include \"Globals.h\"\n#include \"ItemGrid.h\"\n#include \"Items/ItemHandler.h\"\n#include \"Noise/Noise.h\"\n\n\n\n\n\ncItemGrid::cItemGrid(int a_Width, int a_Height):\n\tm_Width(a_Width),\n\tm_Height(a_Height),\n\tm_Slots(a_Width * a_Height),\n\tm_IsInTriggerListeners(false)\n{\n}\n\n\n\n\n\nbool cItemGrid::IsValidSlotNum(int a_SlotNum) const\n{\n\treturn ((a_SlotNum >= 0) && (a_SlotNum < m_Slots.size()));\n}\n\n\n\n\n\nbool cItemGrid::IsValidSlotCoords(int a_X, int a_Y) const\n{\n\treturn (\n\t\t(a_X >= 0) && (a_X < m_Width) &&\n\t\t(a_Y >= 0) && (a_Y < m_Height)\n\t);\n}\n\n\n\n\n\nint cItemGrid::GetSlotNum(int a_X, int a_Y) const\n{\n\tif (!IsValidSlotCoords(a_X, a_Y))\n\t{\n\t\tLOGWARNING(\"%s: coords out of range: (%d, %d) in grid of size (%d, %d)\",\n\t\t\t__FUNCTION__, a_X, a_Y, m_Width, m_Height\n\t\t);\n\t\treturn -1;\n\t}\n\treturn a_X + m_Width * a_Y;\n}\n\n\n\n\n\nvoid cItemGrid::GetSlotCoords(int a_SlotNum, int & a_X, int & a_Y) const\n{\n\tif (!IsValidSlotNum(a_SlotNum))\n\t{\n\t\tLOGWARNING(\"%s: SlotNum out of range: %d in grid of range %d\",\n\t\t\t__FUNCTION__, a_SlotNum, m_Slots.size()\n\t\t);\n\t\ta_X = -1;\n\t\ta_Y = -1;\n\t\treturn;\n\t}\n\ta_X = a_SlotNum % m_Width;\n\ta_Y = a_SlotNum / m_Width;\n}\n\n\n\n\n\nvoid cItemGrid::CopyFrom(const cItemGrid & a_Src)\n{\n\tm_Width = a_Src.m_Width;\n\tm_Height = a_Src.m_Height;\n\tm_Slots = a_Src.m_Slots;\n\n\t// The listeners are not copied\n}\n\n\n\n\n\nconst cItem & cItemGrid::GetSlot(int a_X, int a_Y) const\n{\n\treturn GetSlot(GetSlotNum(a_X, a_Y));\n}\n\n\n\n\n\nconst cItem & cItemGrid::GetSlot(int a_SlotNum) const\n{\n\tif (!IsValidSlotNum(a_SlotNum))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number, %d out of %d slots\",\n\t\t\t__FUNCTION__, a_SlotNum, m_Slots.size()\n\t\t);\n\t\ta_SlotNum = 0;\n\t}\n\treturn m_Slots.GetAt(a_SlotNum);\n}\n\n\n\n\n\nvoid cItemGrid::SetSlot(int a_X, int a_Y, const cItem & a_Item)\n{\n\tSetSlot(GetSlotNum(a_X, a_Y), a_Item);\n}\n\n\n\n\n\nvoid cItemGrid::SetSlot(int a_X, int a_Y, short a_ItemType, char a_ItemCount, short a_ItemDamage)\n{\n\tSetSlot(GetSlotNum(a_X, a_Y), cItem(a_ItemType, a_ItemCount, a_ItemDamage));\n}\n\n\n\n\n\nvoid cItemGrid::SetSlot(int a_SlotNum, const cItem & a_Item)\n{\n\tif (!IsValidSlotNum(a_SlotNum))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots\",\n\t\t\t__FUNCTION__, a_SlotNum, m_Slots.size()\n\t\t);\n\t\treturn;\n\t}\n\n\tif (!a_Item.IsEmpty() || m_Slots.IsStorageAllocated())\n\t{\n\t\tm_Slots[a_SlotNum] = a_Item;\n\t}\n\tTriggerListeners(a_SlotNum);\n}\n\n\n\n\n\nvoid cItemGrid::SetSlot(int a_SlotNum, short a_ItemType, char a_ItemCount, short a_ItemDamage)\n{\n\tSetSlot(a_SlotNum, cItem(a_ItemType, a_ItemCount, a_ItemDamage));\n}\n\n\n\n\n\nvoid cItemGrid::EmptySlot(int a_X, int a_Y)\n{\n\tEmptySlot(GetSlotNum(a_X, a_Y));\n}\n\n\n\n\n\nvoid cItemGrid::EmptySlot(int a_SlotNum)\n{\n\tif (!IsValidSlotNum(a_SlotNum))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots\",\n\t\t\t__FUNCTION__, a_SlotNum, m_Slots.size()\n\t\t);\n\t\treturn;\n\t}\n\n\t// Check if already empty:\n\tif (m_Slots.GetAt(a_SlotNum).IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\t// Empty and notify\n\tm_Slots[a_SlotNum].Empty();\n\tTriggerListeners(a_SlotNum);\n}\n\n\n\n\n\nbool cItemGrid::IsSlotEmpty(int a_SlotNum) const\n{\n\tif (!IsValidSlotNum(a_SlotNum))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots\",\n\t\t\t__FUNCTION__, a_SlotNum, m_Slots.size()\n\t\t);\n\t\treturn true;\n\t}\n\treturn m_Slots.GetAt(a_SlotNum).IsEmpty();\n}\n\n\n\n\n\nbool cItemGrid::IsSlotEmpty(int a_X, int a_Y) const\n{\n\treturn IsSlotEmpty(GetSlotNum(a_X, a_Y));\n}\n\n\n\n\n\nvoid cItemGrid::Clear(void)\n{\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\treturn;  // Already clear\n\t}\n\n\tfor (int i = 0; i < m_Slots.size(); i++)\n\t{\n\t\tm_Slots[i].Empty();\n\t\tTriggerListeners(i);\n\t}\n}\n\n\n\n\n\nint cItemGrid::HowManyCanFit(const cItem & a_ItemStack, bool a_AllowNewStacks)\n{\n\tint NumLeft = a_ItemStack.m_ItemCount;\n\tint MaxStack = a_ItemStack.GetMaxStackSize();\n\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\t// Grid is empty, all slots are available\n\t\treturn a_AllowNewStacks ? std::min(NumLeft, m_Slots.size() * MaxStack) : 0;\n\t}\n\n\tfor (const auto & Slot : m_Slots)\n\t{\n\t\tif (Slot.IsEmpty())\n\t\t{\n\t\t\tif (a_AllowNewStacks)\n\t\t\t{\n\t\t\t\tNumLeft -= MaxStack;\n\t\t\t}\n\t\t}\n\t\telse if (Slot.IsEqual(a_ItemStack))\n\t\t{\n\t\t\tNumLeft -= MaxStack - Slot.m_ItemCount;\n\t\t}\n\t\tif (NumLeft <= 0)\n\t\t{\n\t\t\t// All items fit\n\t\t\treturn a_ItemStack.m_ItemCount;\n\t\t}\n\t}  // for Slot - m_Slots[]\n\treturn a_ItemStack.m_ItemCount - NumLeft;\n}\n\n\n\n\n\nchar cItemGrid::AddItemToSlot(const cItem & a_ItemStack, int a_Slot, int a_Num, int a_MaxStack)\n{\n\tif (!IsValidSlotNum(a_Slot))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots\",\n\t\t\t__FUNCTION__, a_Slot, m_Slots.size()\n\t\t);\n\t\treturn 0;\n\t}\n\n\tchar PrevCount = 0;\n\tif (m_Slots[a_Slot].IsEmpty())\n\t{\n\t\tm_Slots[a_Slot] = a_ItemStack;\n\t\tPrevCount = 0;\n\t}\n\telse\n\t{\n\t\tPrevCount = m_Slots[a_Slot].m_ItemCount;\n\t}\n\tm_Slots[a_Slot].m_ItemCount = static_cast<char>(std::min(a_MaxStack, PrevCount + a_Num));\n\tchar toReturn = m_Slots[a_Slot].m_ItemCount - PrevCount;\n\tTriggerListeners(a_Slot);\n\treturn toReturn;\n}\n\n\n\n\n\nchar cItemGrid::AddItem(cItem & a_ItemStack, bool a_AllowNewStacks, int a_PrioritySlot)\n{\n\tchar NumLeft = a_ItemStack.m_ItemCount;\n\tchar MaxStack = a_ItemStack.GetMaxStackSize();\n\n\tif ((a_PrioritySlot != -1) && !IsValidSlotNum(a_PrioritySlot))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots\",\n\t\t\t__FUNCTION__, a_PrioritySlot, m_Slots.size()\n\t\t);\n\t\ta_PrioritySlot = -1;\n\t}\n\n\tif (!a_AllowNewStacks && !m_Slots.IsStorageAllocated())\n\t{\n\t\treturn 0;  // No existing stacks to add to\n\t}\n\n\t// Try prioritySlot first:\n\tif (\n\t\t(a_PrioritySlot != -1) &&\n\t\t(\n\t\t\tm_Slots[a_PrioritySlot].IsEmpty() ||\n\t\t\tm_Slots[a_PrioritySlot].IsEqual(a_ItemStack)\n\t\t)\n\t)\n\t{\n\t\tNumLeft -= AddItemToSlot(a_ItemStack, a_PrioritySlot, NumLeft, MaxStack);\n\t}\n\n\t// Scan existing stacks:\n\tfor (int i = 0; i < m_Slots.size(); i++)\n\t{\n\t\tif (m_Slots[i].IsEqual(a_ItemStack))\n\t\t{\n\t\t\tNumLeft -= AddItemToSlot(a_ItemStack, i, NumLeft, MaxStack);\n\t\t}\n\t\tif (NumLeft <= 0)\n\t\t{\n\t\t\t// All items fit\n\t\t\treturn a_ItemStack.m_ItemCount;\n\t\t}\n\t}  // for i - m_Slots[]\n\n\tif (!a_AllowNewStacks)\n\t{\n\t\treturn (a_ItemStack.m_ItemCount - NumLeft);\n\t}\n\n\tfor (int i = 0; i < m_Slots.size(); i++)\n\t{\n\t\tif (m_Slots[i].IsEmpty())\n\t\t{\n\t\t\tNumLeft -= AddItemToSlot(a_ItemStack, i, NumLeft, MaxStack);\n\t\t}\n\t\tif (NumLeft <= 0)\n\t\t{\n\t\t\t// All items fit\n\t\t\treturn a_ItemStack.m_ItemCount;\n\t\t}\n\t}  // for i - m_Slots[]\n\treturn (a_ItemStack.m_ItemCount - NumLeft);\n}\n\n\n\n\n\nchar cItemGrid::AddItems(cItems & a_ItemStackList, bool a_AllowNewStacks, int a_PrioritySlot)\n{\n\tchar TotalAdded = 0;\n\tfor (cItems::iterator itr = a_ItemStackList.begin(); itr != a_ItemStackList.end();)\n\t{\n\t\tchar NumAdded = AddItem(*itr, a_AllowNewStacks, a_PrioritySlot);\n\t\tif (itr->m_ItemCount == NumAdded)\n\t\t{\n\t\t\titr = a_ItemStackList.erase(itr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\titr->m_ItemCount -= NumAdded;\n\t\t\t++itr;\n\t\t}\n\t\tTotalAdded += NumAdded;\n\t}\n\treturn TotalAdded;\n}\n\n\n\n\n\nchar cItemGrid::RemoveItem(const cItem & a_ItemStack)\n{\n\tchar NumLeft = a_ItemStack.m_ItemCount;\n\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\treturn 0;  // No items to remove\n\t}\n\n\tfor (int i = 0; i < m_Slots.size(); i++)\n\t{\n\t\tif (NumLeft <= 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tif (m_Slots[i].IsEqual(a_ItemStack))\n\t\t{\n\t\t\tchar NumToRemove = std::min<char>(NumLeft, m_Slots[i].m_ItemCount);\n\t\t\tNumLeft -= NumToRemove;\n\t\t\tm_Slots[i].m_ItemCount -= NumToRemove;\n\n\t\t\tif (m_Slots[i].m_ItemCount <= 0)\n\t\t\t{\n\t\t\t\tm_Slots[i].Empty();\n\t\t\t}\n\n\t\t\tTriggerListeners(i);\n\t\t}\n\t}\n\n\treturn (a_ItemStack.m_ItemCount - NumLeft);\n}\n\n\n\n\n\ncItem * cItemGrid::FindItem(const cItem & a_RecipeItem)\n{\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\treturn nullptr;\n\t}\n\n\tfor (int i = 0; i < m_Slots.size(); i++)\n\t{\n\t\t// Items are equal if none is greater the other\n\t\tauto compare = cItem::sItemCompare{};\n\t\tif (!compare(a_RecipeItem, m_Slots[i]) &&\n\t\t\t!compare(m_Slots[i], a_RecipeItem))\n\t\t{\n\t\t\treturn &m_Slots[i];\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\n\n\n\n\nchar cItemGrid::ChangeSlotCount(int a_SlotNum, char a_AddToCount)\n{\n\tif (!IsValidSlotNum(a_SlotNum))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots, ignoring the call, returning -1\",\n\t\t\t__FUNCTION__, a_SlotNum, m_Slots.size()\n\t\t);\n\t\treturn -1;\n\t}\n\n\tif (m_Slots.GetAt(a_SlotNum).IsEmpty())\n\t{\n\t\t// The item is empty, it's not gonna change\n\t\treturn 0;\n\t}\n\n\tif (m_Slots[a_SlotNum].m_ItemCount <= -a_AddToCount)\n\t{\n\t\t// Trying to remove more items than there already are, make the item empty\n\t\tm_Slots[a_SlotNum].Empty();\n\t\tTriggerListeners(a_SlotNum);\n\t\treturn 0;\n\t}\n\n\tm_Slots[a_SlotNum].m_ItemCount += a_AddToCount;\n\n\tif (m_Slots[a_SlotNum].m_ItemCount > m_Slots[a_SlotNum].GetMaxStackSize())\n\t{\n\t\tm_Slots[a_SlotNum].m_ItemCount = m_Slots[a_SlotNum].GetMaxStackSize();\n\t}\n\n\tTriggerListeners(a_SlotNum);\n\treturn m_Slots[a_SlotNum].m_ItemCount;\n}\n\n\n\n\n\nchar cItemGrid::ChangeSlotCount(int a_X, int a_Y, char a_AddToCount)\n{\n\treturn ChangeSlotCount(GetSlotNum(a_X, a_Y), a_AddToCount);\n}\n\n\n\n\n\ncItem cItemGrid::RemoveOneItem(int a_SlotNum)\n{\n\tif (!IsValidSlotNum(a_SlotNum))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots, ignoring the call, returning empty item\",\n\t\t\t__FUNCTION__, a_SlotNum, m_Slots.size()\n\t\t);\n\t\treturn cItem();\n\t}\n\n\t// If the slot is empty, return an empty item\n\tif (m_Slots.GetAt(a_SlotNum).IsEmpty())\n\t{\n\t\treturn cItem();\n\t}\n\n\t// Make a copy of the item in slot, set count to 1 and remove one from the slot\n\tcItem res = m_Slots[a_SlotNum];\n\tres.m_ItemCount = 1;\n\tm_Slots[a_SlotNum].m_ItemCount -= 1;\n\n\t// Emptying the slot correctly if appropriate\n\tif (m_Slots[a_SlotNum].m_ItemCount == 0)\n\t{\n\t\tm_Slots[a_SlotNum].Empty();\n\t}\n\n\t// Notify everyone of the change\n\tTriggerListeners(a_SlotNum);\n\n\t// Return the stored one item\n\treturn res;\n}\n\n\n\n\n\ncItem cItemGrid::RemoveOneItem(int a_X, int a_Y)\n{\n\treturn RemoveOneItem(GetSlotNum(a_X, a_Y));\n}\n\n\n\n\n\nint cItemGrid::HowManyItems(const cItem & a_Item)\n{\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\treturn 0;\n\t}\n\n\tint res = 0;\n\tfor (auto & Slot : m_Slots)\n\t{\n\t\tif (Slot.IsEqual(a_Item))\n\t\t{\n\t\t\tres += Slot.m_ItemCount;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool cItemGrid::HasItems(const cItem & a_ItemStack)\n{\n\tint CurrentlyHave = HowManyItems(a_ItemStack);\n\treturn (CurrentlyHave >= a_ItemStack.m_ItemCount);\n}\n\n\n\n\n\nint cItemGrid::GetFirstEmptySlot(void) const\n{\n\treturn GetNextEmptySlot(-1);\n}\n\n\n\n\n\nint cItemGrid::GetFirstUsedSlot(void) const\n{\n\treturn GetNextUsedSlot(-1);\n}\n\n\n\n\n\nint cItemGrid::GetLastEmptySlot(void) const\n{\n\tfor (int i = m_Slots.size() - 1; i >= 0; i--)\n\t{\n\t\tif (m_Slots.GetAt(i).IsEmpty())\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n\n\n\n\nint cItemGrid::GetLastUsedSlot(void) const\n{\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\treturn -1;  // No slots are used\n\t}\n\n\tfor (int i = m_Slots.size() - 1; i >= 0; i--)\n\t{\n\t\tif (!m_Slots.GetAt(i).IsEmpty())\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n\n\n\n\nint cItemGrid::GetNextEmptySlot(int a_StartFrom) const\n{\n\tif ((a_StartFrom != -1) && !IsValidSlotNum(a_StartFrom))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots\",\n\t\t\t__FUNCTION__, a_StartFrom, m_Slots.size()\n\t\t);\n\t\ta_StartFrom = -1;\n\t}\n\n\tfor (int i = a_StartFrom + 1; i < m_Slots.size(); i++)\n\t{\n\t\tif (m_Slots.GetAt(i).IsEmpty())\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n\n\n\n\nint cItemGrid::GetNextUsedSlot(int a_StartFrom) const\n{\n\tif ((a_StartFrom != -1) && !IsValidSlotNum(a_StartFrom))\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot number %d out of %d slots\",\n\t\t\t__FUNCTION__, a_StartFrom, m_Slots.size()\n\t\t);\n\t\ta_StartFrom = -1;\n\t}\n\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\treturn -1;  // No slots are used\n\t}\n\n\tfor (int i = a_StartFrom + 1; i < m_Slots.size(); i++)\n\t{\n\t\tif (!m_Slots.GetAt(i).IsEmpty())\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n\n\n\n\nvoid cItemGrid::CopyToItems(cItems & a_Items) const\n{\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\treturn;  // Nothing to copy\n\t}\n\n\tfor (const auto & Slot : m_Slots)\n\t{\n\t\tif (!Slot.IsEmpty())\n\t\t{\n\t\t\ta_Items.push_back(Slot);\n\t\t}\n\t}  // for Slot - m_Slots[]\n}\n\n\n\n\n\nbool cItemGrid::DamageItem(int a_SlotNum, short a_Amount)\n{\n\tif (!IsValidSlotNum(a_SlotNum))\n\t{\n\t\tLOGWARNING(\"%s: invalid slot number %d out of %d slots, ignoring.\", __FUNCTION__, a_SlotNum, m_Slots.size());\n\t\treturn false;\n\t}\n\n\tif (!m_Slots.IsStorageAllocated())\n\t{\n\t\treturn false;  // Nothing to damage\n\t}\n\n\treturn m_Slots[a_SlotNum].DamageItem(a_Amount);\n}\n\n\n\n\n\nbool cItemGrid::DamageItem(int a_X, int a_Y, short a_Amount)\n{\n\treturn DamageItem(GetSlotNum(a_X, a_Y), a_Amount);\n}\n\n\n\n\n\nvoid cItemGrid::GenerateRandomLootWithBooks(const cLootProbab * a_LootProbabs, size_t a_CountLootProbabs, int a_NumSlots, int a_Seed)\n{\n\t// Calculate the total weight:\n\tint TotalProbab = 1;\n\tfor (size_t i = 0; i < a_CountLootProbabs; i++)\n\t{\n\t\tTotalProbab += a_LootProbabs[i].m_Weight;\n\t}\n\n\t// Pick the loot items:\n\tcNoise Noise(a_Seed);\n\tfor (int i = 0; i < a_NumSlots; i++)\n\t{\n\t\tint Rnd = (Noise.IntNoise1DInt(i) / 7);\n\t\tint LootRnd = Rnd % TotalProbab;\n\t\tRnd >>= 8;\n\t\tcItem CurrentLoot = cItem(E_ITEM_ENCHANTED_BOOK, 1, 0);\n\n\t\t// Choose the enchantments\n\t\tcWeightedEnchantments Enchantments;\n\t\tcEnchantments::AddItemEnchantmentWeights(Enchantments, E_ITEM_BOOK, static_cast<unsigned>(24 + Noise.IntNoise2DInt(a_Seed, TotalProbab) % 7));\n\t\tint NumEnchantments = Noise.IntNoise3DInt(TotalProbab, Rnd, a_Seed) % 5;  // The number of enchantments this book wil get.\n\n\t\tfor (int j = 0; j <= NumEnchantments; j++)\n\t\t{\n\t\t\tcEnchantments Enchantment = cEnchantments::SelectEnchantmentFromVector(Enchantments, Noise.IntNoise2DInt(NumEnchantments, i));\n\t\t\tCurrentLoot.m_Enchantments.Add(Enchantment);\n\t\t\tcEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment);\n\t\t\tcEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment);\n\t\t}\n\n\t\tfor (size_t j = 0; j < a_CountLootProbabs; j++)\n\t\t{\n\t\t\tLootRnd -= a_LootProbabs[j].m_Weight;\n\t\t\tif (LootRnd < 0)\n\t\t\t{\n\t\t\t\tCurrentLoot = a_LootProbabs[j].m_Item;\n\t\t\t\tif ((a_LootProbabs[j].m_MaxAmount - a_LootProbabs[j].m_MinAmount) > 0)\n\t\t\t\t{\n\t\t\t\t\tCurrentLoot.m_ItemCount = static_cast<char>(a_LootProbabs[j].m_MinAmount + (Rnd % (a_LootProbabs[j].m_MaxAmount - a_LootProbabs[j].m_MinAmount)));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCurrentLoot.m_ItemCount = static_cast<char>(a_LootProbabs[j].m_MinAmount);\n\t\t\t\t}\n\t\t\t\tRnd >>= 8;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // for j - a_LootProbabs[]\n\t\tSetSlot(Rnd % m_Slots.size(), CurrentLoot);\n\t}  // for i - NumSlots\n}\n\n\n\n\n\nvoid cItemGrid::AddListener(cListener & a_Listener)\n{\n\tcCSLock Lock(m_CSListeners);\n\tASSERT(!m_IsInTriggerListeners);  // Must not call this while in TriggerListeners()\n\tm_Listeners.push_back(&a_Listener);\n}\n\n\n\n\n\nvoid cItemGrid::RemoveListener(cListener & a_Listener)\n{\n\tcCSLock Lock(m_CSListeners);\n\tASSERT(!m_IsInTriggerListeners);  // Must not call this while in TriggerListeners()\n\tfor (cListeners::iterator itr = m_Listeners.begin(), end = m_Listeners.end(); itr != end; ++itr)\n\t{\n\t\tif (*itr == &a_Listener)\n\t\t{\n\t\t\tm_Listeners.erase(itr);\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_Listeners[]\n}\n\n\n\n\n\nvoid cItemGrid::TriggerListeners(int a_SlotNum)\n{\n\tcListeners Listeners;\n\t{\n\t\tcCSLock Lock(m_CSListeners);\n\t\tm_IsInTriggerListeners = true;\n\t\tListeners = m_Listeners;\n\t}\n\tfor (cListeners::iterator itr = Listeners.begin(), end = Listeners.end(); itr != end; ++itr)\n\t{\n\t\t(*itr)->OnSlotChanged(this, a_SlotNum);\n\t}  // for itr - m_Listeners[]\n\tm_IsInTriggerListeners = false;\n}\n"
  },
  {
    "path": "src/ItemGrid.h",
    "content": "\n// ItemGrid.h\n\n// Declares the cItemGrid class representing a storage for items in a XY grid (chests, dispensers, inventory etc.)\n\n\n\n\n#pragma once\n\n#include \"Item.h\"\n#include \"LazyArray.h\"\n\n\n\n\n\n// tolua_begin\nclass cItemGrid\n{\npublic:\n\t// tolua_end\n\n\t/** This class is used as a callback for when a slot changes */\n\tclass cListener\n\t{\n\tpublic:\n\t\tvirtual ~cListener() {}\n\n\t\t/** Called whenever a slot changes */\n\t\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) = 0;\n\t} ;\n\ttypedef std::vector<cListener *> cListeners;\n\n\tcItemGrid(int a_Width, int a_Height);\n\n\t// tolua_begin\n\tint GetWidth   (void) const { return m_Width; }\n\tint GetHeight  (void) const { return m_Height; }\n\tint GetNumSlots(void) const { return m_Slots.size(); }\n\n\t/** Converts XY coords into slot number; returns -1 on invalid coords */\n\tint GetSlotNum(int a_X, int a_Y) const;\n\n\t// tolua_end\n\n\t/** Converts slot number into XY coords; sets coords to -1 on invalid slot number. Exported in ManualBindings.cpp */\n\tvoid GetSlotCoords(int a_SlotNum, int & a_X, int & a_Y) const;\n\n\t/** Copies all items from a_Src to this grid.\n\tDoesn't copy the listeners. */\n\tvoid CopyFrom(const cItemGrid & a_Src);\n\n\t// tolua_begin\n\n\t// Retrieve slots by coords or slot number; Logs warning and returns the first slot on invalid coords / slotnum\n\tconst cItem & GetSlot(int a_X, int a_Y) const;\n\tconst cItem & GetSlot(int a_SlotNum) const;\n\n\t// Set slot by coords or slot number; Logs warning and doesn't set on invalid coords / slotnum\n\tvoid SetSlot(int a_X, int a_Y, const cItem & a_Item);\n\tvoid SetSlot(int a_X, int a_Y, short a_ItemType, char a_ItemCount, short a_ItemDamage);\n\tvoid SetSlot(int a_SlotNum, const cItem & a_Item);\n\tvoid SetSlot(int a_SlotNum, short a_ItemType, char a_ItemCount, short a_ItemDamage);\n\n\t// Empty the specified slot; Logs warning and doesn't set on invalid coords / slotnum\n\tvoid EmptySlot(int a_X, int a_Y);\n\tvoid EmptySlot(int a_SlotNum);\n\n\t/** Returns true if the specified slot is empty or the slot doesn't exist */\n\tbool IsSlotEmpty(int a_SlotNum) const;\n\n\t/** Returns true if the specified slot is empty or the slot doesn't exist */\n\tbool IsSlotEmpty(int a_X, int a_Y) const;\n\n\t/** Sets all items as empty */\n\tvoid Clear(void);\n\n\t/** Returns number of items out of a_ItemStack that can fit in the storage */\n\tint HowManyCanFit(const cItem & a_ItemStack, bool a_AllowNewStacks = true);\n\n\t/** Adds as many items out of a_ItemStack as can fit.\n\tIf a_AllowNewStacks is set to false, only existing stacks can be topped up;\n\tIf a_AllowNewStacks is set to true, empty slots can be used for the rest.\n\tIf a_PrioritySlot is set to a positive value, then the corresponding slot will be used  first (if empty or compatible with added items).\n\tIf a_PrioritySlot is set to -1, regular order applies.\n\tReturns the number of items that fit.\n\t*/\n\tchar AddItem(cItem & a_ItemStack, bool a_AllowNewStacks = true, int a_PrioritySlot = -1);\n\n\t/** Same as AddItem, but works on an entire list of item stacks.\n\tThe a_ItemStackList is modified to reflect the leftover items.\n\tIf a_AllowNewStacks is set to false, only existing stacks can be topped up;\n\tIf a_AllowNewStacks is set to true, empty slots can be used for the rest.\n\tIf a_PrioritySlot is set to a positive value, then the corresponding slot will be used first (if empty or compatible with added items).\n\tIf a_PrioritySlot is set to -1, regular order applies.\n\tReturns the total number of items that fit.\n\t*/\n\tchar AddItems(cItems & a_ItemStackList, bool a_AllowNewStacks = true, int a_PrioritySlot = -1);\n\n\t/** Removes the specified item from the grid, as many as possible, up to a_ItemStack.m_ItemCount.\n\tReturns the number of items that were removed. */\n\tchar RemoveItem(const cItem & a_ItemStack);\n\n\t/** Finds an item based on ItemType and ItemDamage (<- defines the itemType, too) */\n\tcItem * FindItem(const cItem & a_RecipeItem);\n\n\t/** Adds (or subtracts, if a_AddToCount is negative) to the count of items in the specified slot.\n\tIf the slot is empty, ignores the call.\n\tReturns the new count.\n\t*/\n\tchar ChangeSlotCount(int a_SlotNum, char a_AddToCount);\n\n\t/** Adds (or subtracts, if a_AddToCount is negative) to the count of items in the specified slot.\n\tIf the slot is empty, ignores the call.\n\tReturns the new count.\n\t*/\n\tchar ChangeSlotCount(int a_X, int a_Y, char a_AddToCount);\n\n\t/** Removes one item from the stack in the specified slot, and returns it.\n\tIf the slot was empty, returns an empty item\n\t*/\n\tcItem RemoveOneItem(int a_SlotNum);\n\n\t/** Removes one item from the stack in the specified slot, and returns it.\n\tIf the slot was empty, returns an empty item\n\t*/\n\tcItem RemoveOneItem(int a_X, int a_Y);\n\n\t/** Returns the number of items of type a_Item that are stored */\n\tint HowManyItems(const cItem & a_Item);\n\n\t/** Returns true if there are at least as many items of type a_ItemStack as in a_ItemStack */\n\tbool HasItems(const cItem & a_ItemStack);\n\n\t/** Returns the index of the first empty slot; -1 if all full */\n\tint GetFirstEmptySlot(void) const;\n\n\t/** Returns the index of the first non-empty slot; -1 if all empty */\n\tint GetFirstUsedSlot(void) const;\n\n\t/** Returns the index of the last empty slot; -1 if all full */\n\tint GetLastEmptySlot(void) const;\n\n\t/** Returns the index of the last used slot; -1 if all empty */\n\tint GetLastUsedSlot(void) const;\n\n\t/** Returns the index of the first empty slot following a_StartFrom (a_StartFrom is not checked) */\n\tint GetNextEmptySlot(int a_StartFrom) const;\n\n\t/** Returns the index of the first used slot following a_StartFrom (a_StartFrom is not checked) */\n\tint GetNextUsedSlot(int a_StartFrom) const;\n\n\t/** Copies the contents into a cItems object; preserves the original a_Items contents */\n\tvoid CopyToItems(cItems & a_Items) const;\n\n\t/** Adds the specified damage to the specified item; returns true if the item broke (but the item is left intact) */\n\tbool DamageItem(int a_SlotNum, short a_Amount);\n\n\t/** Adds the specified damage to the specified item; returns true if the item broke (but the item is left intact) */\n\tbool DamageItem(int a_X, int a_Y, short a_Amount);\n\n\t// tolua_end\n\n\n\t/** Returns true if slot coordinates lie within the grid. */\n\tbool IsValidSlotCoords(int a_X, int a_Y) const;\n\n\t/** Returns true if slot number is within the grid. */\n\tbool IsValidSlotNum(int a_SlotNum) const;\n\n\t/** Generates random loot from the specified loot probability table, with a chance of enchanted books added.\n\tA total of a_NumSlots are taken by the loot.\n\tCannot export to Lua due to raw array a_LootProbabs. TODO: Make this exportable / export through ManualBindings.cpp with a Lua table as LootProbabs\n\t*/\n\tvoid GenerateRandomLootWithBooks(const cLootProbab * a_LootProbabs, size_t a_CountLootProbabs, int a_NumSlots, int a_Seed);\n\n\t/** Adds a callback that gets called whenever a slot changes. Must not be called from within the listener callback! */\n\tvoid AddListener(cListener & a_Listener);\n\n\t/** Removes a slot-change-callback. Must not be called from within the listener callback! */\n\tvoid RemoveListener(cListener & a_Listener);\n\n\t// tolua_begin\n\nprotected:\n\tint     m_Width;\n\tint     m_Height;\n\tcLazyArray<cItem> m_Slots;\n\n\tcListeners       m_Listeners;    ///< Listeners which should be notified on slot changes; the pointers are not owned by this object\n\tcCriticalSection m_CSListeners;  ///< CS that guards the m_Listeners against multi-thread access\n\tbool             m_IsInTriggerListeners;  ///< Set to true while TriggerListeners is running, to detect attempts to manipulate listener list while triggerring\n\n\t/** Calls all m_Listeners for the specified slot number */\n\tvoid TriggerListeners(int a_SlotNum);\n\n\t/** Adds up to a_Num items out of a_ItemStack, as many as can fit, in specified slot\n\tReturns the number of items that did fit.\n\t*/\n\tchar AddItemToSlot(const cItem & a_ItemStack, int a_Slot, int a_Num, int a_MaxStack);\n} ;\n// tolua_end\n"
  },
  {
    "path": "src/Items/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tItemHandler.cpp\n\n\tItemAnvil.h\n\tItemArmor.h\n\tItemAxe.h\n\tItemBanner.h\n\tItemBed.h\n\tItemBigFlower.h\n\tItemBoat.h\n\tItemBottle.h\n\tItemBow.h\n\tItemBucket.h\n\tItemButton.h\n\tItemChest.h\n\tItemChorusFruit.h\n\tItemCloth.h\n\tItemComparator.h\n\tItemCookedFish.h\n\tItemDefaultItem.h\n\tItemDoor.h\n\tItemDropSpenser.h\n\tItemDye.h\n\tItemEmptyMap.h\n\tItemEnchantingTable.h\n\tItemEndCrystal.h\n\tItemEndPortalFrame.h\n\tItemEnderChest.h\n\tItemEyeOfEnder.h\n\tItemFenceGate.h\n\tItemFishingRod.h\n\tItemFood.h\n\tItemFoodSeeds.h\n\tItemFurnace.h\n\tItemGlazedTerracotta.h\n\tItemGoldenApple.h\n\tItemHandler.h\n\tItemHoe.h\n\tItemHopper.h\n\tItemItemFrame.h\n\tItemJackOLantern.h\n\tItemLadder.h\n\tItemLeaves.h\n\tItemLever.h\n\tItemLighter.h\n\tItemLilypad.h\n\tItemMap.h\n\tItemMilk.h\n\tItemMinecart.h\n\tItemMobHead.h\n\tItemNetherWart.h\n\tItemObserver.h\n\tItemPainting.h\n\tItemPickaxe.h\n\tItemPiston.h\n\tItemPlanks.h\n\tItemPoisonousPotato.h\n\tItemPotion.h\n\tItemPumpkin.h\n\tItemQuartz.h\n\tItemRail.h\n\tItemRawChicken.h\n\tItemRawFish.h\n\tItemRedstoneDust.h\n\tItemRedstoneRepeater.h\n\tItemRottenFlesh.h\n\tItemSapling.h\n\tItemSeeds.h\n\tItemShears.h\n\tItemShovel.h\n\tItemSideways.h\n\tItemSign.h\n\tItemSlab.h\n\tItemSnow.h\n\tItemSoup.h\n\tItemSpawnEgg.h\n\tItemSpiderEye.h\n\tItemStairs.h\n\tItemSword.h\n\tItemThrowable.h\n\tItemTorch.h\n\tItemTrapdoor.h\n\tItemTripwireHook.h\n\tItemVines.h\n\tSimplePlaceableItemHandler.h\n)\n"
  },
  {
    "path": "src/Items/ItemAnvil.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockAnvil.h\"\n\n\n\n\n\nclass cItemAnvilHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(\n\t\t\ta_PlacePosition,\n\t\t\tstatic_cast<BLOCKTYPE>(a_HeldItem.m_ItemType),\n\t\t\tcBlockAnvilHandler::YawToMetaData(a_Player.GetYaw()) | static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage << 2)\n\t\t);\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemArmor.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n\n\n\n\n\nclass cItemArmorHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\t/** Move the armor to the armor slot of the player's inventory */\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tint SlotNum;\n\t\tif (ItemCategory::IsHelmet(a_HeldItem.m_ItemType))\n\t\t{\n\t\t\tSlotNum = 0;\n\t\t}\n\t\telse if (ItemCategory::IsChestPlate(a_HeldItem.m_ItemType))\n\t\t{\n\t\t\tSlotNum = 1;\n\t\t}\n\t\telse if (ItemCategory::IsLeggings(a_HeldItem.m_ItemType))\n\t\t{\n\t\t\tSlotNum = 2;\n\t\t}\n\t\telse if (ItemCategory::IsBoots(a_HeldItem.m_ItemType))\n\t\t{\n\t\t\tSlotNum = 3;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLOGWARNING(\"Used unknown armor: %i\", a_HeldItem.m_ItemType);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->GetInventory().GetArmorSlot(SlotNum).IsEmpty())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\ta_Player->GetInventory().SetArmorSlot(SlotNum, a_HeldItem.CopyOne());\n\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool CanRepairWithRawMaterial(short a_ItemType) const override\n\t{\n\t\tswitch (m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_CHAIN_BOOTS:\n\t\t\tcase E_ITEM_CHAIN_CHESTPLATE:\n\t\t\tcase E_ITEM_CHAIN_HELMET:\n\t\t\tcase E_ITEM_CHAIN_LEGGINGS:\n\t\t\t{\n\t\t\t\treturn (a_ItemType == E_ITEM_IRON);\n\t\t\t}\n\t\t\tcase E_ITEM_DIAMOND_BOOTS:\n\t\t\tcase E_ITEM_DIAMOND_CHESTPLATE:\n\t\t\tcase E_ITEM_DIAMOND_HELMET:\n\t\t\tcase E_ITEM_DIAMOND_LEGGINGS:\n\t\t\t{\n\t\t\t\treturn (a_ItemType == E_ITEM_DIAMOND);\n\t\t\t}\n\t\t\tcase E_ITEM_IRON_BOOTS:\n\t\t\tcase E_ITEM_IRON_CHESTPLATE:\n\t\t\tcase E_ITEM_IRON_HELMET:\n\t\t\tcase E_ITEM_IRON_LEGGINGS:\n\t\t\t{\n\t\t\t\treturn (a_ItemType == E_ITEM_IRON);\n\t\t\t}\n\t\t\tcase E_ITEM_GOLD_BOOTS:\n\t\t\tcase E_ITEM_GOLD_CHESTPLATE:\n\t\t\tcase E_ITEM_GOLD_HELMET:\n\t\t\tcase E_ITEM_GOLD_LEGGINGS:\n\t\t\t{\n\t\t\t\treturn (a_ItemType == E_ITEM_GOLD);\n\t\t\t}\n\t\t\tcase E_ITEM_ELYTRA:  // TODO: require Phantom Membrane instead of leather starting from protocol version 369 or 1.13 release\n\t\t\tcase E_ITEM_LEATHER_BOOTS:\n\t\t\tcase E_ITEM_LEATHER_CAP:\n\t\t\tcase E_ITEM_LEATHER_PANTS:\n\t\t\tcase E_ITEM_LEATHER_TUNIC:\n\t\t\t{\n\t\t\t\treturn (a_ItemType == E_ITEM_LEATHER);\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemAxe.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\nclass cItemAxeHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\tvirtual short GetDurabilityLossByAction(eDurabilityLostAction a_Action) const override\n\t{\n\t\tswitch (a_Action)\n\t\t{\n\t\t\tcase dlaAttackEntity:       return 2;\n\t\t\tcase dlaBreakBlock:         return 1;\n\t\t\tcase dlaBreakBlockInstant:  return 0;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported durability loss action\");\n\t}\n\n\n\n\tvirtual float GetBlockBreakingStrength(BLOCKTYPE a_Block) const override\n\t{\n\t\tif (!IsBlockMaterialWood(a_Block) && !IsBlockMaterialPlants(a_Block) && !IsBlockMaterialVine(a_Block))\n\t\t{\n\t\t\treturn Super::GetBlockBreakingStrength(a_Block);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (m_ItemType)\n\t\t\t{\n\t\t\t\tcase E_ITEM_WOODEN_AXE: return 2.0f;\n\t\t\t\tcase E_ITEM_STONE_AXE:  return 4.0f;\n\t\t\t\tcase E_ITEM_IRON_AXE:   return 6.0f;\n\t\t\t\tcase E_ITEM_GOLD_AXE:   return 12.0f;\n\t\t\t\tcase E_ITEM_DIAMOND_AXE: return 8.0f;\n\t\t\t}\n\t\t}\n\t\tASSERT(!\"Something is wrong here... Maybe they are axes out of a new material?\");\n\t\treturn 1.0f;\n\t}\n\n} ;\n"
  },
  {
    "path": "src/Items/ItemBanner.h",
    "content": "\n\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Blocks/BlockHandler.h\"\n#include \"../BlockEntities/BannerEntity.h\"\n#include \"../Blocks/ChunkInterface.h\"\n\n\n\n\n\nclass cItemBannerHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Cannot place a banner at \"no face\" and from the bottom:\n\t\tif ((a_ClickedBlockFace == BLOCK_FACE_NONE) || (a_ClickedBlockFace == BLOCK_FACE_BOTTOM))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!TryPlaceBanner(a_Player, a_PlacePosition, a_ClickedBlockFace))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\ta_Player.GetWorld()->DoWithBlockEntityAt(a_PlacePosition, [&a_HeldItem](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT((a_BlockEntity.GetBlockType() == E_BLOCK_STANDING_BANNER) || (a_BlockEntity.GetBlockType() == E_BLOCK_WALL_BANNER));\n\n\t\t\tcBannerEntity & BannerEntity = static_cast<cBannerEntity &>(a_BlockEntity);\n\t\t\tBannerEntity.SetBaseColor(static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage));\n\t\t\tBannerEntity.SetCustomName(a_HeldItem.m_CustomName);\n\t\t\treturn false;\n\t\t});\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\n\n\tstatic bool TryPlaceBanner(cPlayer & a_Player, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace)\n\t{\n\t\tconst auto Rotation = a_Player.GetYaw();\n\n\t\t// Placing on the floor:\n\t\tif (a_ClickedBlockFace == BLOCK_FACE_TOP)\n\t\t{\n\t\t\tNIBBLETYPE Meta;\n\n\t\t\tif ((Rotation >= -11.25f) && (Rotation < 11.25f))\n\t\t\t{\n\t\t\t\t// South\n\t\t\t\tMeta = 0x08;\n\t\t\t}\n\t\t\telse if ((Rotation >= 11.25f) && (Rotation < 33.75f))\n\t\t\t{\n\t\t\t\t// SouthSouthWest\n\t\t\t\tMeta = 0x09;\n\t\t\t}\n\t\t\telse if ((Rotation >= 23.75f) && (Rotation < 56.25f))\n\t\t\t{\n\t\t\t\t// SouthWest\n\t\t\t\tMeta = 0x0a;\n\t\t\t}\n\t\t\telse if ((Rotation >= 56.25f) && (Rotation < 78.75f))\n\t\t\t{\n\t\t\t\t// WestSouthWest\n\t\t\t\tMeta = 0x0b;\n\t\t\t}\n\t\t\telse if ((Rotation >= 78.75f) && (Rotation < 101.25f))\n\t\t\t{\n\t\t\t\t// West\n\t\t\t\tMeta = 0x0c;\n\t\t\t}\n\t\t\telse if ((Rotation >= 101.25f) && (Rotation < 123.75f))\n\t\t\t{\n\t\t\t\t// WestNorthWest\n\t\t\t\tMeta = 0x0d;\n\t\t\t}\n\t\t\telse if ((Rotation >= 123.75f) && (Rotation < 146.25f))\n\t\t\t{\n\t\t\t\t// NorthWest\n\t\t\t\tMeta = 0x0e;\n\t\t\t}\n\t\t\telse if ((Rotation >= 146.25f) && (Rotation < 168.75f))\n\t\t\t{\n\t\t\t\t// NorthNorthWest\n\t\t\t\tMeta = 0x0f;\n\t\t\t}\n\t\t\telse if ((Rotation >= -168.75f) && (Rotation < -146.25f))\n\t\t\t{\n\t\t\t\t// NorthNorthEast\n\t\t\t\tMeta = 0x01;\n\t\t\t}\n\t\t\telse if ((Rotation >= -146.25f) && (Rotation < -123.75f))\n\t\t\t{\n\t\t\t\t// NorthEast\n\t\t\t\tMeta = 0x02;\n\t\t\t}\n\t\t\telse if ((Rotation >= -123.75f) && (Rotation < -101.25f))\n\t\t\t{\n\t\t\t\t// EastNorthEast\n\t\t\t\tMeta = 0x03;\n\t\t\t}\n\t\t\telse if ((Rotation >= -101.25) && (Rotation < -78.75f))\n\t\t\t{\n\t\t\t\t// East\n\t\t\t\tMeta = 0x04;\n\t\t\t}\n\t\t\telse if ((Rotation >= -78.75) && (Rotation < -56.25f))\n\t\t\t{\n\t\t\t\t// EastSouthEast\n\t\t\t\tMeta = 0x05;\n\t\t\t}\n\t\t\telse if ((Rotation >= -56.25f) && (Rotation < -33.75f))\n\t\t\t{\n\t\t\t\t// SouthEast\n\t\t\t\tMeta = 0x06;\n\t\t\t}\n\t\t\telse if ((Rotation >= -33.75f) && (Rotation < -11.25f))\n\t\t\t{\n\t\t\t\t// SouthSouthEast\n\t\t\t\tMeta = 0x07;\n\t\t\t}\n\t\t\telse  // degrees jumping from 180 to -180\n\t\t\t{\n\t\t\t\t// North\n\t\t\t\tMeta = 0x00;\n\t\t\t}\n\n\t\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_STANDING_BANNER, Meta);\n\t\t}\n\n\t\t// We must be placing on the side of a block.\n\n\t\tNIBBLETYPE Meta;\n\n\t\tif (a_ClickedBlockFace == BLOCK_FACE_EAST)\n\t\t{\n\t\t\tMeta = 0x05;\n\t\t}\n\t\telse if (a_ClickedBlockFace == BLOCK_FACE_WEST)\n\t\t{\n\t\t\tMeta = 0x04;\n\t\t}\n\t\telse if (a_ClickedBlockFace == BLOCK_FACE_NORTH)\n\t\t{\n\t\t\tMeta = 0x02;\n\t\t}\n\t\telse  // degrees jumping from 180 to -180\n\t\t{\n\t\t\tMeta = 0x03;\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_WALL_BANNER, Meta);\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemBed.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockBed.h\"\n#include \"BlockEntities/BedEntity.h\"\n\n\n\n\n\nclass cItemBedHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tconst auto BlockMeta = cBlockBedHandler::YawToMetaData(a_Player.GetYaw());\n\t\tconst auto HeadPosition = a_PlacePosition + cBlockBedHandler::MetaDataToDirection(BlockMeta);\n\n\t\tauto & World = *a_Player.GetWorld();\n\t\tBLOCKTYPE HeadType;\n\t\tNIBBLETYPE HeadMeta;\n\t\tif (!World.GetBlockTypeMeta(HeadPosition, HeadType, HeadMeta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Vanilla only allows beds to be placed into air.\n\t\t// Check if there is empty space for the \"head\" block:\n\t\tif (!cBlockHandler::For(HeadType).DoesIgnoreBuildCollision(World, a_HeldItem, HeadPosition, HeadMeta, a_ClickedBlockFace, false))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// The \"foot\", and the \"head\" block:\n\t\tif (\n\t\t\t!a_Player.PlaceBlocks(\n\t\t\t{\n\t\t\t\t{ a_PlacePosition, E_BLOCK_BED, BlockMeta },\n\t\t\t\t{ HeadPosition, E_BLOCK_BED, static_cast<NIBBLETYPE>(BlockMeta | 0x08) }\n\t\t\t})\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tauto SetColor = [&a_HeldItem](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_BED);\n\n\t\t\tstatic_cast<cBedEntity &>(a_BlockEntity).SetColor(a_HeldItem.m_ItemDamage);\n\t\t\treturn false;\n\t\t};\n\t\tWorld.DoWithBlockEntityAt(a_PlacePosition, SetColor);\n\t\tWorld.DoWithBlockEntityAt(HeadPosition, SetColor);\n\n\t\treturn true;\n\t}\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemBigFlower.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\nclass cItemBigFlowerHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Needs at least two free blocks to build in:\n\t\tif (a_PlacePosition.y >= (cChunkDef::Height - 1))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto & World = *a_Player.GetWorld();\n\t\tconst auto TopPos = a_PlacePosition.addedY(1);\n\t\tBLOCKTYPE TopType;\n\t\tNIBBLETYPE TopMeta;\n\t\tif (!World.GetBlockTypeMeta(TopPos, TopType, TopMeta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!cBlockHandler::For(TopType).DoesIgnoreBuildCollision(World, a_HeldItem, TopPos, TopMeta, a_ClickedBlockFace, false))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn a_Player.PlaceBlocks(\n\t\t{\n\t\t\t{ a_PlacePosition, E_BLOCK_BIG_FLOWER, static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage & 0x07) },\n\t\t\t{ TopPos,          E_BLOCK_BIG_FLOWER, E_META_BIG_FLOWER_TOP }\n\t\t});\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemBoat.h",
    "content": "\n#pragma once\n\n#include \"../Entities/Boat.h\"\n#include \"../LineBlockTracer.h\"\n\n\n\n\n\nclass cItemBoatHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\t// Only allow placing blocks on top of blocks, or when not in range of dest block:\n\t\tif ((a_ClickedBlockFace != BLOCK_FACE_YM) && (a_ClickedBlockFace != BLOCK_FACE_NONE))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Find the actual placement position by tracing line of sight until non-air block:\n\t\tclass cCallbacks:\n\t\t\tpublic cBlockTracer::cCallbacks\n\t\t{\n\t\tpublic:\n\t\t\tVector3d m_Pos;\n\t\t\tbool m_HasFound;\n\n\t\t\tcCallbacks():\n\t\t\t\tm_HasFound(false)\n\t\t\t{\n\t\t\t}\n\n\t\t\tvirtual bool OnNextBlock(Vector3i a_CBBlockPos, BLOCKTYPE a_CBBlockType, NIBBLETYPE a_CBBlockMeta, eBlockFace a_CBEntryFace) override\n\t\t\t{\n\t\t\t\tif (a_CBBlockType != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\tm_Pos = a_CBBlockPos;\n\t\t\t\t\tm_HasFound = true;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} Callbacks;\n\t\tauto Start = a_Player->GetEyePosition() + a_Player->GetLookVector();\n\t\tauto End = a_Player->GetEyePosition() + a_Player->GetLookVector() * 5;\n\t\tcLineBlockTracer::Trace(*a_World, Callbacks, Start, End);\n\t\tif (!Callbacks.m_HasFound)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Block above must be air to spawn a boat (prevents spawning a boat underwater)\n\t\tauto PosAbove = Callbacks.m_Pos.Floor().addedY(1);\n\t\tif (!cChunkDef::IsValidHeight(PosAbove))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tBLOCKTYPE BlockAbove = a_World->GetBlock(PosAbove);\n\t\tif (BlockAbove != E_BLOCK_AIR)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Spawn block at water level\n\t\tif (a_World->SpawnBoat(Callbacks.m_Pos + Vector3d(0.5, 1, 0.5), cBoat::ItemToMaterial(a_Player->GetEquippedItem())) == cEntity::INVALID_ID)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Remove boat from players hand\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemBottle.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n\n\n\n\n\nclass cItemBottleHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\t/** Searches for a water source block in the line of sight.\n\tReturns true and sets a_BlockPos if a water source block is found within line-of-sight.\n\tReturns false if not. */\n\tbool GetBlockFromTrace(cWorld * a_World, cPlayer * a_Player, Vector3i & a_BlockPos) const\n\t{\n\t\tclass cCallbacks:\n\t\t\tpublic cBlockTracer::cCallbacks\n\t\t{\n\t\tpublic:\n\t\t\tVector3i m_Pos;\n\t\t\tbool     m_HasHitFluid;\n\n\n\t\t\tcCallbacks():\n\t\t\t\tm_HasHitFluid(false)\n\t\t\t{\n\t\t\t}\n\n\t\t\tvirtual bool OnNextBlock(Vector3i a_BlockPosition, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t\t\t{\n\t\t\t\tif (IsBlockWater(a_BlockType))\n\t\t\t\t{\n\t\t\t\t\tif (a_BlockMeta != 0)  // we're only looking for source blocks\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tm_HasHitFluid = true;\n\t\t\t\t\tm_Pos = a_BlockPosition;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} Callbacks;\n\t\tauto Start = a_Player->GetEyePosition() + a_Player->GetLookVector();\n\t\tauto End = a_Player->GetEyePosition() + a_Player->GetLookVector() * 5;\n\t\tcLineBlockTracer::Trace(*a_World, Callbacks, Start, End);\n\t\tif (!Callbacks.m_HasHitFluid)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\ta_BlockPos = Callbacks.m_Pos;\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tif (a_ClickedBlockFace != BLOCK_FACE_NONE)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tVector3i BlockPos;\n\t\tif (!GetBlockFromTrace(a_World, a_Player, BlockPos))\n\t\t{\n\t\t\treturn false;  // Nothing in range.\n\t\t}\n\n\t\t// Give back a filled water bottle if gamemode is not creative:\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->ReplaceOneEquippedItemTossRest(cItem(E_ITEM_POTION));\n\t\t}\n\t\treturn true;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemBow.h",
    "content": "\n#pragma once\n\n#include \"../Entities/ArrowEntity.h\"\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemBowHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tASSERT(a_Player != nullptr);\n\n\t\t// Check if the player has an arrow in the inventory, or is in Creative:\n\t\tif (!(a_Player->IsGameModeCreative() || a_Player->GetInventory().HasItems(cItem(E_ITEM_ARROW))))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\ta_Player->StartChargingBow();\n\t\treturn true;\n\t}\n\n\n\n\tvirtual void OnItemShoot(cPlayer * a_Player, const Vector3i a_BlockPos, eBlockFace a_BlockFace) const override\n\t{\n\t\t// Actual shot - produce the arrow with speed based on the number of ticks that the bow was charged\n\t\tUNUSED(a_BlockPos);\n\t\tASSERT(a_Player != nullptr);\n\n\t\tint BowCharge = a_Player->FinishChargingBow();\n\t\tdouble Force = static_cast<double>(BowCharge) / 20.0;\n\t\tForce = (Force * Force + 2.0 * Force) / 3.0;  // This formula is used by the 1.6.2 client\n\t\tif (Force < 0.1)\n\t\t{\n\t\t\t// Too little force, ignore the shot\n\t\t\treturn;\n\t\t}\n\t\tForce = std::min(Force, 1.0);\n\n\t\t// Does the player have an arrow?\n\t\tif (!a_Player->IsGameModeCreative() && !a_Player->GetInventory().HasItems(cItem(E_ITEM_ARROW)))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Create the arrow entity:\n\t\tauto Arrow = std::make_unique<cArrowEntity>(*a_Player, Force * 2);\n\t\tauto ArrowPtr = Arrow.get();\n\t\tif (!ArrowPtr->Initialize(std::move(Arrow), *a_Player->GetWorld()))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\ta_Player->GetWorld()->BroadcastSoundEffect(\n\t\t\t\"entity.arrow.shoot\",\n\t\t\ta_Player->GetPosition(),\n\t\t\t0.5,\n\t\t\tstatic_cast<float>(Force)\n\t\t);\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\tif (a_Player->GetEquippedItem().m_Enchantments.GetLevel(cEnchantments::enchInfinity) == 0)\n\t\t\t{\n\t\t\t\ta_Player->GetInventory().RemoveItem(cItem(E_ITEM_ARROW));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tArrowPtr->SetPickupState(cArrowEntity::psNoPickup);\n\t\t\t}\n\n\t\t\ta_Player->UseEquippedItem();\n\t\t}\n\t\tif (a_Player->GetEquippedItem().m_Enchantments.GetLevel(cEnchantments::enchFlame) > 0)\n\t\t{\n\t\t\tArrowPtr->StartBurning(100);\n\t\t}\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemBucket.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../Simulator/FluidSimulator.h\"\n#include \"../Blocks/BlockHandler.h\"\n#include \"../LineBlockTracer.h\"\n#include \"../Blocks/ChunkInterface.h\"\n\n\n\n\n\nclass cItemBucketHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cItemBucketHandler(int a_ItemType):\n\t\tSuper(a_ItemType)\n\t{\n\n\t}\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tswitch (m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_BUCKET:       return ScoopUpFluid(a_World, a_Player, a_HeldItem, a_ClickedBlockPos, a_ClickedBlockFace);\n\t\t\tcase E_ITEM_LAVA_BUCKET:  return PlaceFluid  (a_World, a_Player, a_PluginInterface, a_HeldItem, a_ClickedBlockPos, a_ClickedBlockFace, E_BLOCK_LAVA);\n\t\t\tcase E_ITEM_WATER_BUCKET: return PlaceFluid  (a_World, a_Player, a_PluginInterface, a_HeldItem, a_ClickedBlockPos, a_ClickedBlockFace, E_BLOCK_WATER);\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled ItemType\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tbool ScoopUpFluid(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, const Vector3i a_ClickedBlockPos, eBlockFace a_ClickedBlockFace) const\n\t{\n\t\t// Players can't pick up fluid while in adventure mode.\n\t\tif (a_Player->IsGameModeAdventure())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Needs a valid clicked block:\n\t\tif (a_ClickedBlockFace != BLOCK_FACE_NONE)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tVector3i BlockPos;\n\t\tif (!GetBlockFromTrace(a_World, a_Player, BlockPos))\n\t\t{\n\t\t\treturn false;  // Nothing in range.\n\t\t}\n\n\t\tif (a_World->GetBlockMeta(BlockPos) != 0)\n\t\t{\n\t\t\t// Not a source block\n\t\t\treturn false;\n\t\t}\n\n\t\tBLOCKTYPE Block = a_World->GetBlock(BlockPos);\n\t\tENUM_ITEM_TYPE NewItemType;\n\n\t\tif (IsBlockWater(Block))\n\t\t{\n\t\t\tNewItemType = E_ITEM_WATER_BUCKET;\n\t\t}\n\t\telse if (IsBlockLava(Block))\n\t\t{\n\t\t\tNewItemType = E_ITEM_LAVA_BUCKET;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check to see if destination block is too far away\n\t\t// Reach Distance Multiplayer = 5 Blocks\n\t\tif ((BlockPos.x - a_Player->GetPosX() > 5) || (BlockPos.z - a_Player->GetPosZ() > 5))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Remove water / lava block (unless plugins disagree):\n\t\tif (!a_Player->PlaceBlock(BlockPos, E_BLOCK_AIR, 0))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Give new bucket, filled with fluid when the gamemode is not creative:\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->ReplaceOneEquippedItemTossRest(cItem(NewItemType));\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tbool PlaceFluid(\n\t\tcWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,\n\t\tconst Vector3i a_BlockPos, eBlockFace a_BlockFace, BLOCKTYPE a_FluidBlock\n\t) const\n\t{\n\t\t// Players can't place fluid while in adventure mode.\n\t\tif (a_Player->IsGameModeAdventure())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (a_BlockFace != BLOCK_FACE_NONE)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tBLOCKTYPE CurrentBlockType;\n\t\tNIBBLETYPE CurrentBlockMeta;\n\t\teBlockFace EntryFace;\n\t\tVector3i BlockPos;\n\t\tif (!GetPlacementCoordsFromTrace(a_World, a_Player, BlockPos, CurrentBlockType, CurrentBlockMeta, EntryFace))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check to see if destination block is too far away\n\t\t// Reach Distance Multiplayer = 5 Blocks\n\t\tif ((BlockPos.x - a_Player->GetPosX() > 5) || (BlockPos.z - a_Player->GetPosZ() > 5))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Give back an empty bucket if the gamemode is not creative:\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->ReplaceOneEquippedItemTossRest(cItem(E_ITEM_BUCKET));\n\t\t}\n\n\t\t// Wash away anything that was there prior to placing:\n\t\tif (cFluidSimulator::CanWashAway(CurrentBlockType))\n\t\t{\n\t\t\tif (a_PluginInterface.CallHookPlayerBreakingBlock(*a_Player, BlockPos, EntryFace, CurrentBlockType, CurrentBlockMeta))\n\t\t\t{\n\t\t\t\t// Plugin disagrees with the washing-away\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ta_World->DropBlockAsPickups(BlockPos, a_Player, nullptr);\n\t\t\ta_PluginInterface.CallHookPlayerBrokenBlock(*a_Player, BlockPos, EntryFace, CurrentBlockType, CurrentBlockMeta);\n\t\t}\n\n\t\t// Place the actual fluid block:\n\t\treturn a_Player->PlaceBlock(BlockPos, a_FluidBlock, 0);\n\t}\n\n\n\n\n\n\tbool GetBlockFromTrace(cWorld * a_World, cPlayer * a_Player, Vector3i & a_BlockPos) const\n\t{\n\t\tclass cCallbacks :\n\t\t\tpublic cBlockTracer::cCallbacks\n\t\t{\n\t\tpublic:\n\t\t\tVector3i m_Pos;\n\t\t\tbool     m_HasHitFluid;\n\n\n\t\t\tcCallbacks(void) :\n\t\t\t\tm_HasHitFluid(false)\n\t\t\t{\n\t\t\t}\n\n\t\t\tvirtual bool OnNextBlock(Vector3i a_BlockPosition, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t\t\t{\n\t\t\t\tif (IsBlockWater(a_BlockType) || IsBlockLava(a_BlockType))\n\t\t\t\t{\n\t\t\t\t\tif (a_BlockMeta != 0)  // GetBlockFromTrace is called for scooping up fluids; the hit block should be a source\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tm_HasHitFluid = true;\n\t\t\t\t\tm_Pos = a_BlockPosition;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} Callbacks;\n\n\t\tcLineBlockTracer Tracer(*a_World, Callbacks);\n\t\tVector3d Start(a_Player->GetEyePosition() + a_Player->GetLookVector());\n\t\tVector3d End(a_Player->GetEyePosition() + a_Player->GetLookVector() * 5);\n\n\t\tTracer.Trace(Start, End);\n\n\t\tif (!Callbacks.m_HasHitFluid)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\n\t\ta_BlockPos = Callbacks.m_Pos;\n\t\treturn true;\n\t}\n\n\n\n\n\n\tbool GetPlacementCoordsFromTrace(cWorld * a_World, cPlayer * a_Player, Vector3i & a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta, eBlockFace & a_BlockFace) const\n\t{\n\t\tclass cCallbacks :\n\t\t\tpublic cBlockTracer::cCallbacks\n\t\t{\n\t\tpublic:\n\t\t\tVector3i   m_Pos;\n\t\t\tBLOCKTYPE  m_ReplacedBlockType;\n\t\t\tNIBBLETYPE m_ReplacedBlockMeta;\n\t\t\teBlockFace m_EntryFace;\n\n\t\t\tvirtual bool OnNextBlock(Vector3i a_CBBlockPos, BLOCKTYPE a_CBBlockType, NIBBLETYPE a_CBBlockMeta, eBlockFace a_CBEntryFace) override\n\t\t\t{\n\t\t\t\tif ((a_CBBlockType != E_BLOCK_AIR) && !IsBlockLiquid(a_CBBlockType))\n\t\t\t\t{\n\t\t\t\t\tm_ReplacedBlockType = a_CBBlockType;\n\t\t\t\t\tm_ReplacedBlockMeta = a_CBBlockMeta;\n\t\t\t\t\tm_EntryFace = static_cast<eBlockFace>(a_CBEntryFace);\n\t\t\t\t\tif (!cFluidSimulator::CanWashAway(a_CBBlockType))\n\t\t\t\t\t{\n\t\t\t\t\t\ta_CBBlockPos = AddFaceDirection(a_CBBlockPos, a_CBEntryFace);  // Was an unwashawayable block, can't overwrite it!\n\t\t\t\t\t}\n\t\t\t\t\tm_Pos = a_CBBlockPos;  // (Block could be washed away, replace it)\n\t\t\t\t\treturn true;  // Abort tracing\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} Callbacks;\n\n\t\tcLineBlockTracer Tracer(*a_World, Callbacks);\n\t\tVector3d Start(a_Player->GetEyePosition());\n\t\tVector3d End(a_Player->GetEyePosition() + a_Player->GetLookVector() * 5);\n\n\t\t// cLineBlockTracer::Trace() returns true when whole line was traversed. By returning true from the callback when we hit something,\n\t\t// we ensure that this never happens if liquid could be placed\n\t\t// Use this to judge whether the position is valid\n\t\tif (!Tracer.Trace(Start, End))\n\t\t{\n\t\t\ta_BlockPos = Callbacks.m_Pos;\n\t\t\ta_BlockType = Callbacks.m_ReplacedBlockType;\n\t\t\ta_BlockMeta = Callbacks.m_ReplacedBlockMeta;\n\t\t\ta_BlockFace = Callbacks.m_EntryFace;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemButton.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemButtonHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t/** Converts the block face of the neighbor to which the button is attached, to the block meta for this button. */\n\tstatic NIBBLETYPE BlockFaceToMetaData(eBlockFace a_BlockFace)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_YP: return 0x5;\n\t\t\tcase BLOCK_FACE_ZM: return 0x4;\n\t\t\tcase BLOCK_FACE_ZP: return 0x3;\n\t\t\tcase BLOCK_FACE_XM: return 0x2;\n\t\t\tcase BLOCK_FACE_XP: return 0x1;\n\t\t\tcase BLOCK_FACE_YM: return 0x0;\n\t\t\tcase BLOCK_FACE_NONE:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tUNREACHABLE(\"Unsupported block face\");\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), BlockFaceToMetaData(a_ClickedBlockFace));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemChest.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockChest.h\"\n\n\n\n\n\nclass cItemChestHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\tcItemChestHandler(const cItemChestHandler &) = delete;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Check that there is at most one single neighbor of the same chest type:\n\t\tstatic const Vector3i CrossCoords[] =\n\t\t{\n\t\t\t{-1, 0,  0},\n\t\t\t{ 0, 0, -1},\n\t\t\t{ 1, 0,  0},\n\t\t\t{ 0, 0,  1},\n\t\t};\n\n\t\tauto & World = *a_Player.GetWorld();\n\t\tint NeighborIdx = -1;\n\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(CrossCoords); i++)\n\t\t{\n\t\t\tconst auto NeighborPos = a_PlacePosition + CrossCoords[i];\n\t\t\tif (World.GetBlock(NeighborPos) != m_ItemType)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (NeighborIdx >= 0)\n\t\t\t{\n\t\t\t\t// Can't place here, there are already two neighbors, this would form a 3-block chest\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tNeighborIdx = static_cast<int>(i);\n\n\t\t\t// Check that this neighbor is a single chest:\n\t\t\tfor (size_t j = 0; j < ARRAYCOUNT(CrossCoords); j++)\n\t\t\t{\n\t\t\t\tif (World.GetBlock(NeighborPos + CrossCoords[j]) == m_ItemType)\n\t\t\t\t{\n\t\t\t\t\t// Trying to place next to a dblchest\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}  // for j\n\t\t}  // for i\n\n\t\t// Get the meta of the placed chest; take existing neighbors into account:\n\t\tBLOCKTYPE ChestBlockType = static_cast<BLOCKTYPE>(m_ItemType);\n\t\tNIBBLETYPE Meta;\n\t\tconst auto yaw = a_Player.GetYaw();\n\t\tswitch (NeighborIdx)\n\t\t{\n\t\t\tcase 0:\n\t\t\tcase 2:\n\t\t\t{\n\t\t\t\t// The neighbor is in the X axis, form a X-axis-aligned dblchest:\n\t\t\t\tMeta = ((yaw >= -90) && (yaw < 90)) ? E_META_CHEST_FACING_ZM : E_META_CHEST_FACING_ZP;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 1:\n\t\t\tcase 3:\n\t\t\t{\n\t\t\t\t// The neighbor is in the Z axis, form a Z-axis-aligned dblchest:\n\t\t\t\tMeta = (yaw < 0) ? E_META_CHEST_FACING_XM : E_META_CHEST_FACING_XP;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\t// No neighbor, place based on yaw:\n\t\t\t\tMeta = cBlockChestHandler::YawToMetaData(yaw);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (NeighborIdx)\n\n\t\t// Place the new chest:\n\t\tif (!a_Player.PlaceBlock(a_PlacePosition, ChestBlockType, Meta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Adjust the existing chest, if any:\n\t\tif (NeighborIdx != -1)\n\t\t{\n\t\t\tWorld.FastSetBlock(a_PlacePosition + CrossCoords[NeighborIdx], ChestBlockType, Meta);\n\t\t}\n\n\t\treturn true;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemChorusFruit.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n#include \"../Entities/Pawn.h\"\n\n\n\n\n\nclass cItemChorusFruitHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemChorusFruitHandler(int a_ItemType) :\n\t\tSuper(a_ItemType, FoodInfo(4, 2.4))\n\t{\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tcItemHandler::EatItem(a_Player, a_Item);\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\t// Attempt to find a teleport destination\n\t\tVector3d Destination;\n\t\tcWorld * World = a_Player->GetWorld();\n\t\tif (cPawn::FindTeleportDestination(*World, 2, 16, Destination, a_Player->GetPosition(), 8))\n\t\t{\n\t\t\t// Broadcast sound effect to _pre-teleport_ location, then teleport player.\n\t\t\tWorld->BroadcastSoundEffect(\"item.chorus_fruit.teleport\", a_Player->GetPosition(), 1, 1);\n\t\t\ta_Player->TeleportToCoords(Destination.x, Destination.y, Destination.z);\n\t\t}\n\t\treturn true;\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemCloth.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemClothHandler final :\n\tpublic cItemHandler\n{\npublic:\n\tconstexpr cItemClothHandler(int a_ItemType)\n\t\t: cItemHandler(a_ItemType)\n\t{\n\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemComparator.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../Blocks/BlockComparator.h\"\n\n\n\n\n\nclass cItemComparatorHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_INACTIVE_COMPARATOR, cBlockComparatorHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemCookedFish.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n\n\n\n\n\nclass cItemCookedFishHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemCookedFishHandler(int a_ItemType):\n\t\tSuper(a_ItemType, FoodInfo(0, 0))\n\t{\n\t}\n\n\tvirtual FoodInfo GetFoodInfo(const cItem * a_Item) const override\n\t{\n\t\tstatic const FoodInfo CookedFishInfos[] =\n\t\t{\n\t\t\tFoodInfo(5, 6.0),  // Cooked fish\n\t\t\tFoodInfo(6, 9.6),  // Cooked salmon\n\t\t};\n\n\t\tif (a_Item->m_ItemDamage >= static_cast<short>(ARRAYCOUNT(CookedFishInfos)))\n\t\t{\n\t\t\tLOGWARNING(\"Unknown cooked fish type '%d'\", a_Item->m_ItemDamage);\n\t\t\treturn FoodInfo(0, 0);\n\t\t}\n\t\treturn CookedFishInfos[a_Item->m_ItemDamage];\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemDefaultItem.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cDefaultItemHandler final :\n\tpublic cItemHandler\n{\npublic:\n\n\tusing cItemHandler::cItemHandler;\n};\n"
  },
  {
    "path": "src/Items/ItemDoor.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Blocks/BlockDoor.h\"\n\n\n\n\n\nclass cItemDoorHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cItemDoorHandler(int a_ItemType):\n\t\tSuper(a_ItemType)\n\t{\n\n\t}\n\n\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Vanilla only allows door placement while clicking on the top face of the block below the door:\n\t\tif (a_ClickedBlockFace != BLOCK_FACE_TOP)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Get the block type of the door to place:\n\t\tBLOCKTYPE BlockType;\n\t\tswitch (m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_WOODEN_DOOR:   BlockType = E_BLOCK_OAK_DOOR;      break;\n\t\t\tcase E_ITEM_IRON_DOOR:     BlockType = E_BLOCK_IRON_DOOR;     break;\n\t\t\tcase E_ITEM_SPRUCE_DOOR:   BlockType = E_BLOCK_SPRUCE_DOOR;   break;\n\t\t\tcase E_ITEM_BIRCH_DOOR:    BlockType = E_BLOCK_BIRCH_DOOR;    break;\n\t\t\tcase E_ITEM_JUNGLE_DOOR:   BlockType = E_BLOCK_JUNGLE_DOOR;   break;\n\t\t\tcase E_ITEM_DARK_OAK_DOOR: BlockType = E_BLOCK_DARK_OAK_DOOR; break;\n\t\t\tcase E_ITEM_ACACIA_DOOR:   BlockType = E_BLOCK_ACACIA_DOOR;   break;\n\t\t\tdefault: UNREACHABLE(\"Unhandled door type\");\n\t\t}\n\n\t\tconst auto & World = *a_Player.GetWorld();\n\t\tconst auto UpperBlockPosition = a_PlacePosition.addedY(1);\n\n\t\t// Check the block that will get replaced by the door:\n\t\t{\n\t\t\tBLOCKTYPE TopType;\n\t\t\tNIBBLETYPE TopMeta;\n\t\t\tif (!World.GetBlockTypeMeta(UpperBlockPosition, TopType, TopMeta))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!cBlockHandler::For(TopType).DoesIgnoreBuildCollision(World, a_HeldItem, UpperBlockPosition, TopMeta, a_ClickedBlockFace, false))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Get the coords of the neighboring blocks:\n\t\tNIBBLETYPE LowerBlockMeta = cBlockDoorHandler::YawToMetaData(a_Player.GetYaw());\n\t\tVector3i RelDirToOutside = cBlockDoorHandler::GetRelativeDirectionToOutside(LowerBlockMeta);\n\t\tVector3i LeftNeighborPos = RelDirToOutside;\n\t\tLeftNeighborPos.TurnCW();\n\t\tLeftNeighborPos.Move(a_PlacePosition);\n\t\tVector3i RightNeighborPos = RelDirToOutside;\n\t\tRightNeighborPos.TurnCCW();\n\t\tRightNeighborPos.Move(a_PlacePosition);\n\n\t\t// Decide whether the hinge is on the left (default) or on the right:\n\t\tNIBBLETYPE UpperBlockMeta = 0x08;\n\t\tBLOCKTYPE LeftNeighborBlock = World.GetBlock(LeftNeighborPos);\n\t\tBLOCKTYPE RightNeighborBlock = World.GetBlock(RightNeighborPos);\n\n\t\t/*\n\t\t// DEBUG:\n\t\tFLOGD(\"Door being placed at {0}\", a_PlacePosition);\n\t\tFLOGD(\"RelDirToOutside: {0}\", RelDirToOutside);\n\t\tFLOGD(\"Left neighbor at {0}: {1} ({2})\", LeftNeighborPos, LeftNeighborBlock, ItemTypeToString(LeftNeighborBlock));\n\t\tFLOGD(\"Right neighbor at {0}: {1} ({2})\", RightNeighborPos, RightNeighborBlock, ItemTypeToString(RightNeighborBlock));\n\t\t*/\n\n\t\tif (\n\t\t\tcBlockDoorHandler::IsDoorBlockType(LeftNeighborBlock) ||   // The block to the left is a door block\n\t\t\t(\n\t\t\t\t!cBlockInfo::IsSolid(LeftNeighborBlock) &&               // Prioritize hinge on the left side\n\t\t\t\tcBlockInfo::IsSolid(RightNeighborBlock) &&               // The block to the right is solid...\n\t\t\t\t!cBlockDoorHandler::IsDoorBlockType(RightNeighborBlock)  // ... but not a door\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\t// DEBUG: LOGD(\"Setting hinge to right side\");\n\t\t\tUpperBlockMeta = 0x09;  // Upper block | hinge on right\n\t\t}\n\n\t\t// Set the blocks:\n\t\treturn a_Player.PlaceBlocks(\n\t\t{\n\t\t\t{ a_PlacePosition, BlockType, LowerBlockMeta },\n\t\t\t{ UpperBlockPosition, BlockType, UpperBlockMeta }\n\t\t});\n\t}\n\n\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemDropSpenser.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockDropSpenser.h\"\n\n\n\n\n\nclass cItemDropSpenserHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), cBlockDropSpenserHandler::DisplacementYawToMetaData(a_PlacePosition, a_Player.GetEyePosition(), a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemDye.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../Blocks/BlockCocoaPod.h\"\n\n\n\n\n\nclass cItemDyeHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tif ((a_HeldItem.m_ItemDamage == E_META_DYE_WHITE) && (a_ClickedBlockFace != BLOCK_FACE_NONE))\n\t\t{\n\t\t\t// Bonemeal (white dye) is used to fertilize plants:\n\t\t\tif (FertilizePlant(*a_World, a_ClickedBlockPos))\n\t\t\t{\n\t\t\t\tif (a_Player->IsGameModeSurvival())\n\t\t\t\t{\n\t\t\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if ((a_HeldItem.m_ItemDamage == E_META_DYE_BROWN) && (a_ClickedBlockFace >= BLOCK_FACE_ZM) && (a_ClickedBlockFace <= BLOCK_FACE_XP))\n\t\t{\n\t\t\t// Players can't place blocks while in adventure mode.\n\t\t\tif (a_Player->IsGameModeAdventure())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Cocoa (brown dye) can be planted on jungle logs:\n\t\t\tBLOCKTYPE BlockType;\n\t\t\tNIBBLETYPE BlockMeta;\n\n\t\t\t// Check if the block that the player clicked is a jungle log.\n\t\t\tif (\n\t\t\t\t!a_World->GetBlockTypeMeta(a_ClickedBlockPos, BlockType, BlockMeta) ||\n\t\t\t\t((BlockType != E_BLOCK_LOG) || ((BlockMeta & 0x03) != E_META_LOG_JUNGLE))\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Get the location from the new cocoa pod.\n\t\t\tauto CocoaPos = AddFaceDirection(a_ClickedBlockPos, a_ClickedBlockFace, false);\n\t\t\tBlockMeta = cBlockCocoaPodHandler::BlockFaceToMeta(a_ClickedBlockFace);\n\n\t\t\t// Place the cocoa pod:\n\t\t\tif (a_World->GetBlock(CocoaPos) != E_BLOCK_AIR)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (a_Player->PlaceBlock(CocoaPos, E_BLOCK_COCOA_POD, BlockMeta))\n\t\t\t{\n\t\t\t\tif (a_Player->IsGameModeSurvival())\n\t\t\t\t{\n\t\t\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\n\n\n\n\t/** Attempts to use the bonemeal on the plant at the specified (absolute) position.\n\tThe effect of fertilization depends on the plant: https://minecraft.wiki/w/Bone_Meal#Fertilizer\n\t\t- grow a few stages\n\t\t- grow 1 stage with a chance\n\t\t- drop pickups without destroying the plant\n\t\t- grow more plants in the vicinity\n\tIf fertilized succesfully, spawn appropriate particle effects, too.\n\tReturns true if the plant was fertilized successfully, false if not / not a plant.\n\tNote that successful fertilization doesn't mean successful growth - for blocks that have only a chance to grow,\n\tfertilization success is reported even in the case when the chance fails (bonemeal still needs to be consumed). */\n\tstatic bool FertilizePlant(cWorld & a_World, Vector3i a_BlockPos)\n\t{\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\tif (!a_World.GetBlockTypeMeta(a_BlockPos, BlockType, BlockMeta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tswitch (BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_WHEAT:\n\t\t\tcase E_BLOCK_CARROTS:\n\t\t\tcase E_BLOCK_POTATOES:\n\t\t\tcase E_BLOCK_MELON_STEM:\n\t\t\tcase E_BLOCK_PUMPKIN_STEM:\n\t\t\t{\n\t\t\t\t// Grow by 2 - 5 stages:\n\t\t\t\tauto NumStages = GetRandomProvider().RandInt(2, 5);\n\t\t\t\tif (a_World.GrowPlantAt(a_BlockPos, NumStages) <= 0)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ta_World.BroadcastSoundParticleEffect(EffectID::PARTICLE_HAPPY_VILLAGER, a_BlockPos, 0);\n\t\t\t\treturn true;\n\t\t\t}  // case wheat, carrots, potatoes, melon stem, pumpkin stem\n\n\t\t\tcase E_BLOCK_BEETROOTS:\n\t\t\t{\n\t\t\t\t// Fix GH #4805.\n\t\t\t\t// Bonemeal should only advance growth, not spawn produce, and should not be consumed if plant at maturity:\n\t\t\t\tif (a_World.GrowPlantAt(a_BlockPos, 1) <= 0)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ta_World.BroadcastSoundParticleEffect(EffectID::PARTICLE_HAPPY_VILLAGER, a_BlockPos, 0);\n\t\t\t\tif (GetRandomProvider().RandBool(0.25))\n\t\t\t\t{\n\t\t\t\t\t// 75% chance of 1-stage growth, but we hit the 25%, rollback:\n\t\t\t\t\ta_World.GrowPlantAt(a_BlockPos, -1);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}  // case beetroots\n\n\t\t\tcase E_BLOCK_SAPLING:\n\t\t\t{\n\t\t\t\t// 45% chance of growing to the next stage / full tree:\n\t\t\t\tif (GetRandomProvider().RandBool(0.45))\n\t\t\t\t{\n\t\t\t\t\ta_World.GrowPlantAt(a_BlockPos, 1);\n\t\t\t\t}\n\t\t\t\ta_World.BroadcastSoundParticleEffect(EffectID::PARTICLE_HAPPY_VILLAGER, a_BlockPos, 0);\n\t\t\t\treturn true;\n\t\t\t}  // case sapling\n\n\t\t\tcase E_BLOCK_BIG_FLOWER:\n\t\t\t{\n\t\t\t\t// Drop the corresponding flower item without destroying the block:\n\t\t\t\tcItems Pickups;\n\t\t\t\tswitch (BlockMeta)\n\t\t\t\t{\n\t\t\t\t\tcase E_META_BIG_FLOWER_SUNFLOWER: Pickups.Add(E_BLOCK_BIG_FLOWER, 1, E_META_BIG_FLOWER_SUNFLOWER); break;\n\t\t\t\t\tcase E_META_BIG_FLOWER_LILAC:     Pickups.Add(E_BLOCK_BIG_FLOWER, 1, E_META_BIG_FLOWER_LILAC);     break;\n\t\t\t\t\tcase E_META_BIG_FLOWER_ROSE_BUSH: Pickups.Add(E_BLOCK_BIG_FLOWER, 1, E_META_BIG_FLOWER_ROSE_BUSH); break;\n\t\t\t\t\tcase E_META_BIG_FLOWER_PEONY:     Pickups.Add(E_BLOCK_BIG_FLOWER, 1, E_META_BIG_FLOWER_PEONY);     break;\n\t\t\t\t}\n\t\t\t\t// TODO: Should we call any hook for this?\n\t\t\t\ta_World.SpawnItemPickups(Pickups, a_BlockPos);\n\t\t\t\treturn true;\n\t\t\t}  // big flower\n\n\t\t\tcase E_BLOCK_TALL_GRASS:\n\t\t\tcase E_BLOCK_COCOA_POD:\n\t\t\t{\n\t\t\t\t// Always try to grow 1 stage:\n\t\t\t\tif (a_World.GrowPlantAt(a_BlockPos, 1) <= 0)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ta_World.BroadcastSoundParticleEffect(EffectID::PARTICLE_HAPPY_VILLAGER, a_BlockPos, 0);\n\t\t\t\treturn true;\n\t\t\t}  // case tall grass\n\n\t\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\t\t{\n\t\t\t\t// 40% chance of growing into a large mushroom:\n\t\t\t\tif (GetRandomProvider().RandBool(0.6))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (a_World.GrowPlantAt(a_BlockPos, 1) <= 0)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ta_World.BroadcastSoundParticleEffect(EffectID::PARTICLE_HAPPY_VILLAGER, a_BlockPos, 0);\n\t\t\t\treturn true;\n\t\t\t}  // case red or brown mushroom\n\n\t\t\tcase E_BLOCK_GRASS:\n\t\t\t{\n\t\t\t\tGrowPlantsAround(a_World, a_BlockPos);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// TODO: case E_BLOCK_SWEET_BERRY_BUSH:\n\t\t\t// TODO: case E_BLOCK_SEA_PICKLE:\n\t\t\t// TODO: case E_BLOCK_KELP:\n\t\t\t// TODO: case E_BLOCK_BAMBOO:\n\t\t}  // switch (blockType)\n\t\treturn false;\n\t}\n\n\n\n\n\n\t/** Grows new plants around the specified block.\n\tPlaces up to 40 new plants, with the following probability:\n\t\t- 0 up to 8  big grass  (2-block tall grass)\n\t\t- 8 up tp 24 tall grass (1-block tall grass)\n\t\t- 0 up to 8  flowers    (biome dependent variants)\n\tThe new plants are spawned within 7 taxicab distance of a_Position, on a grass block.\n\tBroadcasts a particle for each new spawned plant. */\n\tstatic void GrowPlantsAround(cWorld & a_World, const Vector3i a_Position)\n\t{\n\t\tauto & Random = GetRandomProvider();\n\n\t\tauto DoubleGrassCount = Random.RandInt(8U);\n\t\tauto GrassCount = Random.RandInt(8U, 24U);\n\t\tauto FlowerCount = Random.RandInt(8U);\n\n\t\t// Do a round-robin placement:\n\t\twhile ((DoubleGrassCount > 0) || (GrassCount > 0) || (FlowerCount > 0))\n\t\t{\n\t\t\t// place the big grass:\n\t\t\tif (DoubleGrassCount != 0)\n\t\t\t{\n\t\t\t\tFindAdjacentGrassAnd<&GrowDoubleTallGrass>(a_World, a_Position);\n\t\t\t\tDoubleGrassCount--;\n\t\t\t}\n\n\t\t\t// place the tall grass:\n\t\t\tif (GrassCount != 0)\n\t\t\t{\n\t\t\t\tFindAdjacentGrassAnd<&GrowTallGrass>(a_World, a_Position);\n\t\t\t\tGrassCount--;\n\t\t\t}\n\n\t\t\t// place the flowers\n\t\t\tif (FlowerCount != 0)\n\t\t\t{\n\t\t\t\tFindAdjacentGrassAnd<&GrowFlower>(a_World, a_Position);\n\t\t\t\tFlowerCount--;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void GrowDoubleTallGrass(cWorld & a_World, const Vector3i a_Position)\n\t{\n\t\ta_World.SetBlock(a_Position, E_BLOCK_BIG_FLOWER, E_META_BIG_FLOWER_DOUBLE_TALL_GRASS);\n\t\ta_World.BroadcastSoundParticleEffect(EffectID::PARTICLE_HAPPY_VILLAGER, a_Position, 0);\n\n\t\tconst auto Above = a_Position.addedY(1);\n\t\ta_World.SetBlock(Above, E_BLOCK_BIG_FLOWER, E_META_BIG_FLOWER_DOUBLE_TALL_GRASS | E_META_BIG_FLOWER_TOP);\n\t\ta_World.BroadcastSoundParticleEffect(EffectID::PARTICLE_HAPPY_VILLAGER, Above, 0);\n\t}\n\n\tstatic void GrowTallGrass(cWorld & a_World, const Vector3i a_Position)\n\t{\n\t\ta_World.SetBlock(a_Position, E_BLOCK_TALL_GRASS, E_META_TALL_GRASS_GRASS);\n\t\ta_World.BroadcastSoundParticleEffect(EffectID::PARTICLE_HAPPY_VILLAGER, a_Position, 0);\n\t}\n\n\t/** Grows a biome-dependent flower according to https://minecraft.wiki/w/Flower#Flower_biomes */\n\tstatic void GrowFlower(cWorld & a_World, const Vector3i a_Position)\n\t{\n\t\tauto & Random = GetRandomProvider();\n\t\tswitch (a_World.GetBiomeAt(a_Position.x, a_Position.z))\n\t\t{\n\t\t\tcase biPlains:\n\t\t\tcase biSunflowerPlains:\n\t\t\t{\n\t\t\t\tswitch (Random.RandInt(8))\n\t\t\t\t{\n\t\t\t\t\tcase 0: a_World.SetBlock(a_Position, E_BLOCK_DANDELION, 0); break;\n\t\t\t\t\tcase 1: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_POPPY); break;\n\t\t\t\t\tcase 2: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_ALLIUM); break;\n\t\t\t\t\tcase 3: a_World.SetBlock(a_Position, E_BLOCK_RED_ROSE, 0); break;  // was renamed to Azure Bluet later\n\t\t\t\t\tcase 4: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_RED_TULIP); break;\n\t\t\t\t\tcase 5: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_PINK_TULIP); break;\n\t\t\t\t\tcase 6: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_WHITE_TULIP); break;\n\t\t\t\t\tcase 7: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_ORANGE_TULIP); break;\n\t\t\t\t\tcase 8: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_OXEYE_DAISY); break;\n\t\t\t\t\t// TODO: Add cornflower\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase biSwampland:\n\t\t\tcase biSwamplandM:\n\t\t\t{\n\t\t\t\ta_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_BLUE_ORCHID);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase biFlowerForest:\n\t\t\t{\n\t\t\t\tswitch (Random.RandInt(8))\n\t\t\t\t{\n\t\t\t\t\tcase 0: a_World.SetBlock(a_Position, E_BLOCK_DANDELION, 0); break;\n\t\t\t\t\tcase 1: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_POPPY); break;\n\t\t\t\t\tcase 2: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_ALLIUM); break;\n\t\t\t\t\tcase 3: a_World.SetBlock(a_Position, E_BLOCK_RED_ROSE, 0); break;  // was renamed to Azure Bluet later\n\t\t\t\t\tcase 4: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_RED_TULIP); break;\n\t\t\t\t\tcase 5: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_PINK_TULIP); break;\n\t\t\t\t\tcase 6: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_WHITE_TULIP); break;\n\t\t\t\t\tcase 7: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_ORANGE_TULIP); break;\n\t\t\t\t\tcase 8: a_World.SetBlock(a_Position, E_BLOCK_FLOWER, E_META_FLOWER_OXEYE_DAISY); break;\n\t\t\t\t\t// TODO: Add cornflower, lily of the valley\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase biMesa:\n\t\t\tcase biMesaBryce:\n\t\t\tcase biMesaPlateau:\n\t\t\tcase biMesaPlateauF:\n\t\t\tcase biMesaPlateauM:\n\t\t\tcase biMesaPlateauFM:\n\t\t\tcase biMushroomIsland:\n\t\t\tcase biMushroomShore:\n\t\t\tcase biNether:\n\t\t\tcase biEnd:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tswitch (Random.RandInt(1))\n\t\t\t\t{\n\t\t\t\t\tcase 0: a_World.SetBlock(a_Position, E_BLOCK_DANDELION, 0); break;\n\t\t\t\t\tcase 1: a_World.SetBlock(a_Position, E_BLOCK_RED_ROSE, 0); break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Walks adjacent grass blocks up to 7 taxicab distance away from a_Position and calls the Planter function on the first suitable one found.\n\tDoes nothing if no position suitable for growing was found. */\n\ttemplate <auto Planter>\n\tstatic void FindAdjacentGrassAnd(cWorld & a_World, const Vector3i a_Position)\n\t{\n\t\tauto & Random = GetRandomProvider();\n\t\tauto Position = a_Position;\n\n\t\t// Maximum 7 taxicab distance away from centre:\n\t\tfor (\n\t\t\tint Tries = 0;\n\t\t\tTries != 8;\n\t\t\tTries++,\n\n\t\t\t// Get the adjacent block to visit this iteration:\n\t\t\tPosition += Vector3i(\n\t\t\t\tRandom.RandInt(-1, 1),\n\t\t\t\tRandom.RandInt(-1, 1) * (Random.RandInt(2) / 2),  // Y offset, with discouragement to values that aren't zero\n\t\t\t\tRandom.RandInt(-1, 1)\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tif (\n\t\t\t\t!cChunkDef::IsValidHeight(Position) ||\n\t\t\t\t(a_World.GetBlock(Position) != E_BLOCK_GRASS)  // Are we looking at grass?\n\t\t\t)\n\t\t\t{\n\t\t\t\t// Not grass or invalid height, restart random walk and bail:\n\t\t\t\tPosition = a_Position;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (Planter == GrowDoubleTallGrass)\n\t\t\t{\n\t\t\t\tconst auto TwoAbove = Position.addedY(2);\n\t\t\t\tif ((TwoAbove.y >= cChunkDef::Height) || (a_World.GetBlock(TwoAbove) != E_BLOCK_AIR))\n\t\t\t\t{\n\t\t\t\t\t// Insufficient space for tall grass:\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst auto PlantBase = Position.addedY(1);\n\t\t\tif ((PlantBase.y >= cChunkDef::Height) || (a_World.GetBlock(PlantBase) != E_BLOCK_AIR))\n\t\t\t{\n\t\t\t\t// Insufficient space:\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tPlanter(a_World, PlantBase);\n\t\t\treturn;\n\t\t}\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemEmptyMap.h",
    "content": "\n#pragma once\n\n#include \"../Item.h\"\n\n\n\n\n\nclass cItemEmptyMapHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\n\tstatic const unsigned int DEFAULT_SCALE = 0;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tUNUSED(a_HeldItem);\n\t\tUNUSED(a_ClickedBlockFace);\n\n\t\t// The map center is fixed at the central point of the 8x8 block of chunks you are standing in when you right-click it.\n\n\t\tconst int RegionWidth = cChunkDef::Width * 8;\n\n\t\tint CenterX = FloorC(a_Player->GetPosX() / RegionWidth) * RegionWidth + (RegionWidth / 2);\n\t\tint CenterZ = FloorC(a_Player->GetPosZ() / RegionWidth) * RegionWidth + (RegionWidth / 2);\n\n\t\tauto NewMap = a_World->GetMapManager().CreateMap(CenterX, CenterZ, DEFAULT_SCALE);\n\t\tif (NewMap == nullptr)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// Replace map in the inventory:\n\t\ta_Player->ReplaceOneEquippedItemTossRest(cItem(E_ITEM_MAP, 1, static_cast<short>(NewMap->GetID() & 0x7fff)));\n\t\treturn true;\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemEnchantingTable.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../BlockEntities/EnchantingTableEntity.h\"\n#include \"../World.h\"\n\n\n\n\n\nclass cItemEnchantingTableHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tif (!Super::CommitPlacement(a_Player, a_HeldItem, a_PlacePosition, a_ClickedBlockFace, a_CursorPosition))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (a_HeldItem.IsCustomNameEmpty())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\ta_Player.GetWorld()->DoWithBlockEntityAt(a_PlacePosition, [&a_HeldItem](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_ENCHANTMENT_TABLE);\n\n\t\t\tstatic_cast<cEnchantingTableEntity &>(a_BlockEntity).SetCustomName(a_HeldItem.m_CustomName);\n\t\t\treturn false;\n\t\t});\n\n\t\treturn true;\n\t}\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemEndCrystal.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cItemEndCrystalHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cItemEndCrystalHandler(int a_ItemType) :\n\t\tSuper(a_ItemType)\n\t{\n\t}\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World, cPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface, const cItem & a_HeldItem,\n\t\tconst Vector3i a_BlockPos,\n\t\teBlockFace a_ClickedBlockFace) const override\n\t{\n\t\t// Must click a valid block:\n\t\tif (a_ClickedBlockFace < 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\n\t\t\tconst auto BlockType = a_World->GetBlock(a_BlockPos);\n\n\t\t\t// Don't place if placement block is not obsidian or bedrock:\n\t\t\t(BlockType != E_BLOCK_OBSIDIAN) && (BlockType != E_BLOCK_BEDROCK)\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// The position of the block above the placement block.\n\t\tconst auto Above = a_BlockPos.addedY(1);\n\n\t\tif (\n\t\t\t// Don't place if two blocks above placement block aren't air:\n\t\t\t((Above.y != cChunkDef::Height) && (a_World->GetBlock(Above) != E_BLOCK_AIR)) ||\n\t\t\t((Above.y < (cChunkDef::Height - 1)) && (a_World->GetBlock(Above.addedY(1)) != E_BLOCK_AIR)) ||\n\n\t\t\t// Refuse placement if there are any entities in a (1 by 2 by 1) bounding box with base at the block above:\n\t\t\t!a_World->ForEachEntityInBox(\n\t\t\t\t{ Above, Above + Vector3i(1, 2, 1) },\n\t\t\t\t[](cEntity & a_Entity)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Spawns ender crystal entity, aborts if plugin cancelled:\n\t\tif (a_World->SpawnEnderCrystal(Vector3d(0.5, 0, 0.5) + Above, false) == cEntity::INVALID_ID)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemEndPortalFrame.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockEndPortalFrame.h\"\n\n\n\n\n\nclass cItemEndPortalFrameHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_END_PORTAL_FRAME, cBlockEndPortalFrameHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemEnderChest.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockEnderChest.h\"\n\n\n\n\n\nclass cItemEnderChestHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_ENDER_CHEST, cBlockEnderChestHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemEyeOfEnder.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"ItemThrowable.h\"\n\n\n\n\n\nclass cItemEyeOfEnderHandler final:\n\tpublic cItemThrowableHandler\n{\n\tusing Super = cItemThrowableHandler;\n\npublic:\n\n\tconstexpr cItemEyeOfEnderHandler(int a_ItemType):\n\t\tSuper(a_ItemType, cProjectileEntity::pkSnowball, 30)\n\t{\n\t}\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\t// Try to fill an End Portal Frame block:\n\t\tif (a_ClickedBlockFace != BLOCK_FACE_NONE)\n\t\t{\n\t\t\tBLOCKTYPE FacingBlock;\n\t\t\tNIBBLETYPE FacingMeta;\n\n\t\t\tif (a_World->GetBlockTypeMeta(a_ClickedBlockPos, FacingBlock, FacingMeta) && (FacingBlock == E_BLOCK_END_PORTAL_FRAME))\n\t\t\t{\n\t\t\t\t// Fill the portal frame. E_META_END_PORTAL_EYE is the bit for holding the eye of ender.\n\t\t\t\tif ((FacingMeta & E_META_END_PORTAL_FRAME_EYE) != E_META_END_PORTAL_FRAME_EYE)\n\t\t\t\t{\n\t\t\t\t\ta_World->SetBlock(a_ClickedBlockPos, E_BLOCK_END_PORTAL_FRAME, FacingMeta | E_META_END_PORTAL_FRAME_EYE);\n\t\t\t\t\tif (!a_Player->IsGameModeCreative())\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t\t\t\t}\n\n\t\t\t\t\tcChunkInterface ChunkInterface(a_World->GetChunkMap());\n\n\t\t\t\t\t// Try to spawn portal:\n\t\t\t\t\tFindAndSetPortal(a_ClickedBlockPos, FacingMeta & 3, ChunkInterface, *a_World);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// TODO: Create projectile for Eye Of Ender\n\t\t// return Super::OnItemUse(a_World, a_Player, a_PluginInterface, a_Item, a_ClickedBlockPos, a_ClickedBlockFace);\n\n\t\treturn false;\n\t}\n\n\n\n\n\t/** Returns false if portal cannot be made, true if portal was made. */\n\tstatic bool FindAndSetPortal(Vector3i a_FirstFrame, NIBBLETYPE a_Direction, cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface)\n\t{\n\t\t/*\n\t\tPORTAL FINDING ALGORITH\n\t\t=======================\n\t\t- Get clicked base block\n\t\t- Check diagonally (clockwise) for another portal block\n\t\t\t- if exists, and has eye, Continue. Abort if any are facing the wrong direction.\n\t\t\t- if doesn't exist, check horizontally (the block to the left of this block). Abort if there is no horizontal block.\n\t\t- After a corner has been met, traverse the portal clockwise, ensuring valid portal frames connect the rectangle.\n\t\t- Track the NorthWest Corner, and the dimensions.\n\t\t- If dimensions are valid, create the portal.\n\t\t*/\n\n\t\tstatic_assert((E_META_END_PORTAL_FRAME_ZM - E_META_END_PORTAL_FRAME_XM) == 1, \"Should be going clockwise\");\n\n\t\tconst int MIN_PORTAL_WIDTH = 3;\n\t\tconst int MAX_PORTAL_WIDTH = 4;\n\n\t\t// Directions to use for the clockwise traversal.\n\t\tstatic const Vector3i Left[] =\n\t\t{\n\t\t\t{ 1, 0,  0},  // 0, South, left block is East  / XP\n\t\t\t{ 0, 0,  1},  // 1, West,  left block is South / ZP\n\t\t\t{-1, 0,  0},  // 2, North, left block is West  / XM\n\t\t\t{ 0, 0, -1},  // 3, East,  left block is North / ZM\n\t\t};\n\t\tstatic const Vector3i LeftForward[] =\n\t\t{\n\t\t\t{ 1, 0,  1},  // 0, South, left block is SouthEast / XP ZP\n\t\t\t{-1, 0,  1},  // 1, West,  left block is SouthWest / XM ZP\n\t\t\t{-1, 0, -1},  // 2, North, left block is NorthWest / XM ZM\n\t\t\t{ 1, 0, -1},  // 3, East,  left block is NorthEast / XP ZM\n\t\t};\n\n\n\t\tint EdgesComplete = -1;  // We start search _before_ finding the first edge\n\t\tVector3i NorthWestCorner;\n\t\tint EdgeWidth[4] = { 1, 1, 1, 1 };\n\t\tNIBBLETYPE CurrentDirection = a_Direction;\n\t\tVector3i CurrentPos = a_FirstFrame;\n\n\t\t// Scan clockwise until we have seen all 4 edges\n\t\twhile (EdgesComplete < 4)\n\t\t{\n\t\t\t// Check if we are at a corner\n\t\t\tVector3i NextPos = CurrentPos + LeftForward[CurrentDirection];\n\t\t\tif (IsPortalFrame(a_ChunkInterface.GetBlock(NextPos)))\n\t\t\t{\n\t\t\t\t// We have found the corner, move clockwise to next edge\n\t\t\t\tif (CurrentDirection == E_META_END_PORTAL_FRAME_XP)\n\t\t\t\t{\n\t\t\t\t\t// We are on the NW (XM, ZM) Corner\n\t\t\t\t\t// Relative to the previous frame, the portal should appear to the right of this portal frame.\n\t\t\t\t\tNorthWestCorner = NextPos - Left[CurrentDirection];\n\t\t\t\t}\n\n\t\t\t\tif (EdgesComplete == -1)\n\t\t\t\t{\n\t\t\t\t\t// Reset current width, we will revisit it last\n\t\t\t\t\tEdgeWidth[CurrentDirection] = 1;\n\t\t\t\t}\n\n\t\t\t\t// Rotate 90 degrees clockwise\n\t\t\t\tCurrentDirection = (CurrentDirection + 1) % 4;\n\t\t\t\tEdgesComplete++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// We are not at a corner, keep walking the edge\n\t\t\t\tNextPos = CurrentPos + Left[CurrentDirection];\n\n\t\t\t\tEdgeWidth[CurrentDirection]++;\n\t\t\t\tif (EdgeWidth[CurrentDirection] > MAX_PORTAL_WIDTH)\n\t\t\t\t{\n\t\t\t\t\t// Don't build a portal that is too long.\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!IsValidFrameAtPos(a_ChunkInterface, NextPos, CurrentDirection))\n\t\t\t{\n\t\t\t\t// Neither the edge nor the corner are valid portal blocks.\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tCurrentPos = NextPos;\n\t\t}\n\n\t\tif ((EdgeWidth[0] != EdgeWidth[2]) || (EdgeWidth[1] != EdgeWidth[3]))\n\t\t{\n\t\t\t// Mismatched Portal Dimensions.\n\t\t\treturn false;\n\t\t}\n\t\tif ((EdgeWidth[0] < MIN_PORTAL_WIDTH) || (EdgeWidth[1] < MIN_PORTAL_WIDTH))\n\t\t{\n\t\t\t// Portal too small.\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (int i = 0; i < EdgeWidth[0]; i++)\n\t\t{\n\t\t\tfor (int j = 0; j < EdgeWidth[1]; j++)\n\t\t\t{\n\t\t\t\ta_ChunkInterface.SetBlock(NorthWestCorner.x + i, NorthWestCorner.y, NorthWestCorner.z + j, E_BLOCK_END_PORTAL, 0);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Return true if this block is a portal frame, has an eye, and is facing the correct direction. */\n\tstatic bool IsValidFrameAtPos(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, NIBBLETYPE a_ShouldFace)\n\t{\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\n\t\treturn (\n\t\t\ta_ChunkInterface.GetBlockTypeMeta(a_BlockPos, BlockType, BlockMeta) &&\n\t\t\t(BlockType == E_BLOCK_END_PORTAL_FRAME) &&\n\t\t\t(BlockMeta == (a_ShouldFace | E_META_END_PORTAL_FRAME_EYE))\n\t\t);\n\t}\n\n\n\n\n\t/** Return true if this block is a portal frame. */\n\tstatic bool IsPortalFrame(BLOCKTYPE BlockType)\n\t{\n\t\treturn (BlockType == E_BLOCK_END_PORTAL_FRAME);\n\t}\n} ;\n\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemFenceGate.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockFenceGate.h\"\n\n\n\n\n\nclass cItemFenceGateHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), cBlockFenceGateHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemFishingRod.h",
    "content": "\n#pragma once\n\n#include \"../Entities/Floater.h\"\n#include \"../Entities/Entity.h\"\n#include \"../Item.h\"\n#include \"../Root.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFloaterCallback\nclass cFloaterCallback\n{\npublic:\n\tcFloaterCallback(void) :\n\t\tm_CanPickup(false),\n\t\tm_AttachedMobID(cEntity::INVALID_ID)\n\t{\n\t}\n\n\tbool operator () (cEntity & a_Entity)\n\t{\n\t\tauto & Floater = static_cast<cFloater &>(a_Entity);\n\t\tm_CanPickup = Floater.CanPickup();\n\t\tm_Pos = Floater.GetPosition();\n\t\tm_BitePos = Floater.GetBitePos();\n\t\tm_AttachedMobID = Floater.GetAttachedMobID();\n\t\tFloater.Destroy();\n\t\treturn true;\n\t}\n\n\tbool CanPickup(void)       const { return m_CanPickup; }\n\tbool IsAttached(void)      const { return (m_AttachedMobID != cEntity::INVALID_ID); }\n\tUInt32 GetAttachedMobID(void) const { return m_AttachedMobID; }\n\tVector3d GetPos(void)      const { return m_Pos; }\n\tVector3d GetBitePos(void)  const { return m_BitePos; }\n\nprotected:\n\tbool m_CanPickup;\n\tUInt32 m_AttachedMobID;\n\tVector3d m_Pos;\n\tVector3d m_BitePos;\n} ;\n\n\n\n\n\nclass cItemFishingRodHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tif (a_ClickedBlockFace != BLOCK_FACE_NONE)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (a_Player->IsFishing())\n\t\t{\n\t\t\tReelIn(*a_World, *a_Player);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Cast a hook:\n\t\t\tauto & Random = GetRandomProvider();\n\t\t\tauto CountDownTime = Random.RandInt(100, 900) - static_cast<int>(a_Player->GetEquippedItem().m_Enchantments.GetLevel(cEnchantments::enchLure) * 100);\n\t\t\tauto Floater = std::make_unique<cFloater>(\n\t\t\t\ta_Player->GetEyePosition(), a_Player->GetLookVector() * 15,\n\t\t\t\ta_Player->GetUniqueID(),\n\t\t\t\tCountDownTime\n\t\t\t);\n\t\t\tauto FloaterPtr = Floater.get();\n\t\t\tif (!FloaterPtr->Initialize(std::move(Floater), *a_World))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ta_Player->SetIsFishing(true, FloaterPtr->GetUniqueID());\n\t\t}\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Reels back the fishing line, reeling any attached mob, or creating fished loot, or just breaking the fishing rod. */\n\tvoid ReelIn(cWorld & a_World, cPlayer & a_Player) const\n\t{\n\t\tcFloaterCallback FloaterInfo;\n\t\ta_World.DoWithEntityByID(a_Player.GetFloaterID(), FloaterInfo);\n\t\ta_Player.SetIsFishing(false);\n\n\t\t// If attached to an entity, reel it in:\n\t\tif (FloaterInfo.IsAttached())\n\t\t{\n\t\t\tReelInEntity(a_World, a_Player, FloaterInfo.GetAttachedMobID());\n\t\t\treturn;\n\t\t}\n\n\t\t// If loot can be caught, get it:\n\t\tif (FloaterInfo.CanPickup())\n\t\t{\n\t\t\tReelInLoot(a_World, a_Player, FloaterInfo.GetBitePos());\n\t\t\treturn;\n\t\t}\n\n\t\t// Empty fishing rod, just damage it:\n\t\tauto BlockType = a_World.GetBlock(FloaterInfo.GetPos() - Vector3d(0, 0.1, 0));\n\t\tif ((BlockType != E_BLOCK_AIR) && !IsBlockWater(BlockType))\n\t\t{\n\t\t\ta_Player.UseEquippedItem(2);\n\t\t}\n\t}\n\n\n\n\n\t/** Reels back the entity, specified by the ID, and damages the fishing rod accordingly. */\n\tvoid ReelInEntity(cWorld & a_World, cPlayer & a_Player, UInt32 a_EntityID) const\n\t{\n\t\tauto PlayerPos = a_Player.GetPosition();\n\t\ta_World.DoWithEntityByID(a_EntityID, [=](cEntity & a_Entity)\n\t\t\t{\n\t\t\t\tauto Speed = PlayerPos - a_Entity.GetPosition();\n\t\t\t\ta_Entity.AddSpeed(Speed);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t);\n\t\ta_Player.UseEquippedItem(5);\n\t}\n\n\n\n\n\n\tvoid ReelInLoot(cWorld & a_World, cPlayer & a_Player, const Vector3d a_FloaterBitePos) const\n\t{\n\t\tauto LotSLevel = std::min(a_Player.GetEquippedItem().m_Enchantments.GetLevel(cEnchantments::enchLuckOfTheSea), 3u);\n\n\t\t// Chances for getting an item from the category for each level of Luck of the Sea (0 - 3)\n\t\tconst int TreasureChances[] = {50, 71, 92, 113};  // 5% | 7.1% | 9.2% | 11.3%\n\t\tconst int JunkChances[] = {100, 81, 61, 42};  // 10% | 8.1% | 6.1% | 4.2%\n\n\t\tcItems Drops;\n\t\tauto & Random = GetRandomProvider();\n\t\tint ItemCategory = Random.RandInt(999);\n\t\tif (ItemCategory < TreasureChances[LotSLevel])\n\t\t{\n\t\t\tswitch (Random.RandInt(5))  // Each piece of treasure has an equal chance of 1 / 6\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t{\n\t\t\t\t\tcItem Bow(E_ITEM_BOW, 1, Random.RandInt<short>(50));\n\t\t\t\t\tBow.EnchantByXPLevels(Random.RandInt(22U, 30U), GetRandomProvider());\n\t\t\t\t\tDrops.Add(Bow);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 1:\n\t\t\t\t{\n\t\t\t\t\tcItem Book(E_ITEM_BOOK);\n\t\t\t\t\tBook.EnchantByXPLevels(30, GetRandomProvider());\n\t\t\t\t\tDrops.Add(Book);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 2:\n\t\t\t\t{\n\t\t\t\t\tcItem Rod(E_ITEM_FISHING_ROD, 1, Random.RandInt<short>(50));\n\t\t\t\t\tRod.EnchantByXPLevels(Random.RandInt(22U, 30U), GetRandomProvider());\n\t\t\t\t\tDrops.Add(Rod);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 3:\n\t\t\t\t{\n\t\t\t\t\tDrops.Add(cItem(E_ITEM_NAME_TAG));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 4:\n\t\t\t\t{\n\t\t\t\t\tDrops.Add(cItem(E_ITEM_SADDLE));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 5:\n\t\t\t\t{\n\t\t\t\t\tDrops.Add(cItem(E_BLOCK_LILY_PAD));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ta_Player.GetStatistics().Custom[CustomStatistic::TreasureFished]++;\n\t\t}\n\t\telse if (ItemCategory < JunkChances[LotSLevel])\n\t\t{\n\t\t\tint Junk = Random.RandInt(82);\n\t\t\tif (Junk < 10)  // 10 / 83 chance of spawning a bowl\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_BOWL));\n\t\t\t}\n\t\t\telse if (Junk < 12)  // 2 / 83 chance of spawning a fishing rod\n\t\t\t{\n\t\t\t\t// Fishing Rods caught from the Junk category will be 10% .. 100% damaged, and always unenchanted.\n\t\t\t\tDrops.Add(cItem(E_ITEM_FISHING_ROD, 1, Random.RandInt<short>(7, 65)));\n\t\t\t}\n\t\t\telse if (Junk < 22)  // 10 / 83 chance of spawning leather\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_LEATHER));\n\t\t\t}\n\t\t\telse if (Junk < 32)  // 10 / 83 chance of spawning leather boots\n\t\t\t{\n\t\t\t\t// Leather boots caught from the Junk category will be 10% .. 100% damaged, and always unenchanted.\n\t\t\t\tDrops.Add(cItem(E_ITEM_LEATHER_BOOTS, 1, Random.RandInt<short>(7, 66)));\n\t\t\t}\n\t\t\telse if (Junk < 42)  // 10 / 83 chance of spawning rotten flesh\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_ROTTEN_FLESH));\n\t\t\t}\n\t\t\telse if (Junk < 47)  // 5 / 83 chance of spawning a stick\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_STICK));\n\t\t\t}\n\t\t\telse if (Junk < 52)  // 5 / 83 chance of spawning string\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_STRING));\n\t\t\t}\n\t\t\telse if (Junk < 62)  // 10 / 83 chance of spawning a water bottle\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_POTION));\n\t\t\t}\n\t\t\telse if (Junk < 72)  // 10 / 83 chance of spawning a bone\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_BONE));\n\t\t\t}\n\t\t\telse if (Junk < 73)  // 1 / 83 chance of spawning an ink sac\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_DYE));\n\t\t\t}\n\t\t\telse  // 10 / 83 chance of spawning a tripwire hook\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_BLOCK_TRIPWIRE_HOOK));\n\t\t\t}\n\n\t\t\ta_Player.GetStatistics().Custom[CustomStatistic::JunkFished]++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint FishType = Random.RandInt(99);\n\t\t\tif (FishType <= 1)  // Clownfish has a 2% chance of spawning\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_RAW_FISH, 1, E_META_RAW_FISH_CLOWNFISH));\n\t\t\t}\n\t\t\telse if (FishType <= 12)  // Pufferfish has a 13% chance of spawning\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_RAW_FISH, 1, E_META_RAW_FISH_PUFFERFISH));\n\t\t\t}\n\t\t\telse if (FishType <= 24)  // Raw salmon has a 25% chance of spawning\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_RAW_FISH, 1, E_META_RAW_FISH_SALMON));\n\t\t\t}\n\t\t\telse  // Raw fish has a 60% chance of spawning\n\t\t\t{\n\t\t\t\tDrops.Add(cItem(E_ITEM_RAW_FISH, 1, E_META_RAW_FISH_FISH));\n\t\t\t}\n\n\t\t\ta_Player.GetStatistics().Custom[CustomStatistic::FishCaught]++;\n\t\t}\n\n\t\tauto Experience = Random.RandInt(1, 6);\n\n\t\t// Check with plugins if this loot is acceptable:\n\t\tif (cRoot::Get()->GetPluginManager()->CallHookPlayerFishing(a_Player, Drops, Experience))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Spawn the loot and the experience orb:\n\t\tauto FloaterPos = a_FloaterBitePos.addedY(0.5);\n\t\tconst float FISH_SPEED_MULT = 2.25f;\n\t\tVector3d FlyDirection = (a_Player.GetEyePosition() - FloaterPos).addedY(1.0f) * FISH_SPEED_MULT;\n\t\ta_World.SpawnItemPickups(Drops, FloaterPos, FlyDirection);\n\t\ta_World.SpawnExperienceOrb(a_Player.GetPosition(), Experience);\n\t\ta_Player.UseEquippedItem(1);\n\n\t\t// Notify plugins\n\t\tcRoot::Get()->GetPluginManager()->CallHookPlayerFished(a_Player, Drops, Experience);\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemFood.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemFoodHandler:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cItemFoodHandler(int a_ItemType, FoodInfo a_FoodInfo):\n\t\tSuper(a_ItemType),\n\t\tm_FoodInfo(a_FoodInfo)\n\t{\n\t}\n\n\n\tvirtual bool IsFood(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\tvirtual FoodInfo GetFoodInfo(const cItem * a_Item) const override\n\t{\n\t\tUNUSED(a_Item);\n\t\treturn m_FoodInfo;\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tif (!Super::EatItem(a_Player, a_Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n\nprotected:\n\tFoodInfo m_FoodInfo;\n\n\t~cItemFoodHandler() = default;\n};\n\nclass cItemSimpleFoodHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing cItemFoodHandler::cItemFoodHandler;\n};\n"
  },
  {
    "path": "src/Items/ItemFoodSeeds.h",
    "content": "\n#pragma once\n\n#include \"ItemSeeds.h\"\n#include \"../World.h\"\n\n\n\n\n\nclass cItemFoodSeedsHandler final:\n\tpublic cItemSeedsHandler\n{\n\tusing Super = cItemSeedsHandler;\n\npublic:\n\n\tconstexpr cItemFoodSeedsHandler(int a_ItemType, FoodInfo a_FoodInfo):\n\t\tSuper(a_ItemType),\n\t\tm_FoodInfo(a_FoodInfo)\n\t{\n\n\t}\n\n\n\tvirtual bool IsFood(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\tvirtual FoodInfo GetFoodInfo(const cItem * a_Item) const override\n\t{\n\t\tUNUSED(a_Item);\n\t\treturn m_FoodInfo;\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tif (!Super::EatItem(a_Player, a_Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n\nprotected:\n\tFoodInfo m_FoodInfo;\n\n};\n"
  },
  {
    "path": "src/Items/ItemFurnace.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockFurnace.h\"\n\n\n\n\n\nclass cItemFurnaceHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_FURNACE, cBlockFurnaceHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemGlazedTerracotta.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockGlazedTerracotta.h\"\n\n\n\n\n\nclass cItemGlazedTerracottaHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), cBlockGlazedTerracottaHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemGoldenApple.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n\n\n\n\n\nclass cItemGoldenAppleHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemGoldenAppleHandler(int a_ItemType):\n\t\tSuper(a_ItemType, FoodInfo(4, 9.6))\n\t{\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tcItemHandler::EatItem(a_Player, a_Item);\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\t// Enchanted golden apples have stronger effects:\n\t\tif (a_Item->m_ItemDamage >= E_META_GOLDEN_APPLE_ENCHANTED)\n\t\t{\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effAbsorption, 2400, 3);\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effRegeneration, 400, 1);\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effResistance, 6000, 0);\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effFireResistance, 6000, 0);\n\t\t\treturn true;\n\t\t}\n\n\t\ta_Player->AddEntityEffect(cEntityEffect::effAbsorption, 2400, 0);\n\t\ta_Player->AddEntityEffect(cEntityEffect::effRegeneration, 100, 1);\n\n\t\treturn true;\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemHandler.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../FastRandom.h\"\n#include \"../BlockInServerPluginInterface.h\"\n#include \"../Chunk.h\"\n\n// Handlers:\n#include \"ItemAnvil.h\"\n#include \"ItemArmor.h\"\n#include \"ItemAxe.h\"\n#include \"ItemBanner.h\"\n#include \"ItemBed.h\"\n#include \"ItemBigFlower.h\"\n#include \"ItemBoat.h\"\n#include \"ItemBottle.h\"\n#include \"ItemBow.h\"\n#include \"ItemBucket.h\"\n#include \"ItemButton.h\"\n#include \"ItemChest.h\"\n#include \"ItemChorusFruit.h\"\n#include \"ItemCloth.h\"\n#include \"ItemComparator.h\"\n#include \"ItemCookedFish.h\"\n#include \"ItemDefaultItem.h\"\n#include \"ItemDoor.h\"\n#include \"ItemDropSpenser.h\"\n#include \"ItemDye.h\"\n#include \"ItemEmptyMap.h\"\n#include \"ItemEnchantingTable.h\"\n#include \"ItemEndCrystal.h\"\n#include \"ItemEnderChest.h\"\n#include \"ItemEndPortalFrame.h\"\n#include \"ItemEyeOfEnder.h\"\n#include \"ItemFenceGate.h\"\n#include \"ItemFishingRod.h\"\n#include \"ItemFood.h\"\n#include \"ItemFoodSeeds.h\"\n#include \"ItemFurnace.h\"\n#include \"ItemGlazedTerracotta.h\"\n#include \"ItemGoldenApple.h\"\n#include \"ItemHoe.h\"\n#include \"ItemHopper.h\"\n#include \"ItemItemFrame.h\"\n#include \"ItemJackOLantern.h\"\n#include \"ItemLadder.h\"\n#include \"ItemLeaves.h\"\n#include \"ItemLever.h\"\n#include \"ItemLighter.h\"\n#include \"ItemLilypad.h\"\n#include \"ItemMap.h\"\n#include \"ItemMilk.h\"\n#include \"ItemMinecart.h\"\n#include \"ItemMobHead.h\"\n#include \"ItemNetherWart.h\"\n#include \"ItemObserver.h\"\n#include \"ItemPainting.h\"\n#include \"ItemPickaxe.h\"\n#include \"ItemPiston.h\"\n#include \"ItemPlanks.h\"\n#include \"ItemPoisonousPotato.h\"\n#include \"ItemPotion.h\"\n#include \"ItemPumpkin.h\"\n#include \"ItemQuartz.h\"\n#include \"ItemRail.h\"\n#include \"ItemRawChicken.h\"\n#include \"ItemRawFish.h\"\n#include \"ItemRedstoneDust.h\"\n#include \"ItemRedstoneRepeater.h\"\n#include \"ItemRottenFlesh.h\"\n#include \"ItemSapling.h\"\n#include \"ItemSeeds.h\"\n#include \"ItemShears.h\"\n#include \"ItemShovel.h\"\n#include \"ItemSideways.h\"\n#include \"ItemSign.h\"\n#include \"ItemSlab.h\"\n#include \"ItemSnow.h\"\n#include \"ItemSoup.h\"\n#include \"ItemSpawnEgg.h\"\n#include \"ItemSpiderEye.h\"\n#include \"ItemStairs.h\"\n#include \"ItemSword.h\"\n#include \"ItemThrowable.h\"\n#include \"ItemTorch.h\"\n#include \"ItemTrapdoor.h\"\n#include \"ItemTripwireHook.h\"\n#include \"ItemVines.h\"\n\n#include \"../Blocks/BlockHandler.h\"\n#include \"SimplePlaceableItemHandler.h\"\n\n\n\n\n\nnamespace\n{\n\tconstexpr cDefaultItemHandler           Item11DiscHandler                          (E_ITEM_11_DISC);\n\tconstexpr cDefaultItemHandler           Item13DiscHandler                          (E_ITEM_13_DISC);\n\tconstexpr cItemBoatHandler              ItemAcaciaBoatHandler                      (E_ITEM_ACACIA_BOAT);\n\tconstexpr cDefaultItemHandler           ItemAcaciaDoorBlockHandler                 (E_BLOCK_ACACIA_DOOR);\n\tconstexpr cItemDoorHandler              ItemAcaciaDoorHandler                      (E_ITEM_ACACIA_DOOR);\n\tconstexpr cItemFenceGateHandler         ItemAcaciaFenceGateHandler                 (E_BLOCK_ACACIA_FENCE_GATE);\n\tconstexpr cDefaultItemHandler           ItemAcaciaFenceHandler                     (E_BLOCK_ACACIA_FENCE);\n\tconstexpr cItemStairsHandler            ItemAcaciaStairsHandler                    (E_BLOCK_ACACIA_WOOD_STAIRS);\n\tconstexpr cItemRailHandler              ItemActivatorRailHandler                   (E_BLOCK_ACTIVATOR_RAIL);\n\tconstexpr cDefaultItemHandler           ItemActiveComparatorHandler                (E_BLOCK_ACTIVE_COMPARATOR);\n\tconstexpr cDefaultItemHandler           ItemAirHandler                             (E_BLOCK_AIR);\n\tconstexpr cItemAnvilHandler             ItemAnvilHandler                           (E_BLOCK_ANVIL);\n\tconstexpr cItemSimpleFoodHandler        ItemAppleHandler                           (E_ITEM_RED_APPLE, cItemHandler::FoodInfo(4, 2.4));\n\tconstexpr cDefaultItemHandler           ItemArmorStandHandler                      (E_ITEM_ARMOR_STAND);\n\tconstexpr cDefaultItemHandler           ItemArrowHandler                           (E_ITEM_ARROW);\n\tconstexpr cItemSimpleFoodHandler        ItemBakedPotatoHandler                     (E_ITEM_BAKED_POTATO, cItemHandler::FoodInfo(5, 6));\n\tconstexpr cItemBannerHandler            ItemBannerHandler                          (E_ITEM_BANNER);\n\tconstexpr cDefaultItemHandler           ItemBarrierHandler                         (E_BLOCK_BARRIER);\n\tconstexpr cDefaultItemHandler           ItemBeaconHandler                          (E_BLOCK_BEACON);\n\tconstexpr cDefaultItemHandler           ItemBedBlockHandler                        (E_BLOCK_BED);\n\tconstexpr cItemBedHandler               ItemBedHandler                             (E_ITEM_BED);\n\tconstexpr cDefaultItemHandler           ItemBedrockHandler                         (E_BLOCK_BEDROCK);\n\tconstexpr cItemSimpleFoodHandler        ItemBeetrootHandler                        (E_ITEM_BEETROOT, cItemHandler::FoodInfo(1, 1.2));\n\tconstexpr cDefaultItemHandler           ItemBeetrootsBlockHandler                  (E_BLOCK_BEETROOTS);\n\tconstexpr cItemSimpleSeedsHandler       ItemBeetrootSeedsHandler                   (E_ITEM_BEETROOT_SEEDS);\n\tconstexpr cItemSoupHandler              ItemBeetrootSoupHandler                    (E_ITEM_BEETROOT_SOUP, cItemHandler::FoodInfo(6, 7.2));\n\tconstexpr cItemBigFlowerHandler         ItemBigFlowerHandler                       (E_BLOCK_BIG_FLOWER);\n\tconstexpr cItemBoatHandler              ItemBirchBoatHandler                       (E_ITEM_BIRCH_BOAT);\n\tconstexpr cDefaultItemHandler           ItemBirchDoorBlockHandler                  (E_BLOCK_BIRCH_DOOR);\n\tconstexpr cItemDoorHandler              ItemBirchDoorHandler                       (E_ITEM_BIRCH_DOOR);\n\tconstexpr cItemFenceGateHandler         ItemBirchFenceGateHandler                  (E_BLOCK_BIRCH_FENCE_GATE);\n\tconstexpr cDefaultItemHandler           ItemBirchFenceHandler                      (E_BLOCK_BIRCH_FENCE);\n\tconstexpr cItemStairsHandler            ItemBirchStairsHandler                     (E_BLOCK_BIRCH_WOOD_STAIRS);\n\tconstexpr cItemGlazedTerracottaHandler  ItemBlackGlazedTerracottaHandler           (E_BLOCK_BLACK_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemBlackShulkerBoxHandler                 (E_BLOCK_BLACK_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemBlazePowderHandler                     (E_ITEM_BLAZE_POWDER);\n\tconstexpr cDefaultItemHandler           ItemBlazeRodHandler                        (E_ITEM_BLAZE_ROD);\n\tconstexpr cDefaultItemHandler           ItemBlocksDiscHandler                      (E_ITEM_BLOCKS_DISC);\n\tconstexpr cItemGlazedTerracottaHandler  ItemBlueGlazedTerracottaHandler            (E_BLOCK_BLUE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemBlueShulkerBoxHandler                  (E_BLOCK_BLUE_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemBoneBlockHandler                       (E_BLOCK_BONE_BLOCK);\n\tconstexpr cDefaultItemHandler           ItemBoneHandler                            (E_ITEM_BONE);\n\tconstexpr cDefaultItemHandler           ItemBookAndQuillHandler                    (E_ITEM_BOOK_AND_QUILL);\n\tconstexpr cDefaultItemHandler           ItemBookHandler                            (E_ITEM_BOOK);\n\tconstexpr cDefaultItemHandler           ItemBookshelfHandler                       (E_BLOCK_BOOKCASE);\n\tconstexpr cItemBottleOEnchantingHandler ItemBottleOEnchantingHandler               (E_ITEM_BOTTLE_O_ENCHANTING);\n\tconstexpr cItemBowHandler               ItemBowHandler                             (E_ITEM_BOW);\n\tconstexpr cDefaultItemHandler           ItemBowlHandler                            (E_ITEM_BOWL);\n\tconstexpr cItemSimpleFoodHandler        ItemBreadHandler                           (E_ITEM_BREAD, cItemHandler::FoodInfo(5, 6));\n\tconstexpr cDefaultItemHandler           ItemBrewingStandBlockHandler               (E_BLOCK_BREWING_STAND);\n\tconstexpr cSimplePlaceableItemHandler   ItemBrewingStandHandler                    (E_ITEM_BREWING_STAND, E_BLOCK_BREWING_STAND);\n\tconstexpr cDefaultItemHandler           ItemBrickHandler                           (E_ITEM_CLAY_BRICK);\n\tconstexpr cDefaultItemHandler           ItemBricksHandler                          (E_BLOCK_BRICK);\n\tconstexpr cItemStairsHandler            ItemBricksStairsHandler                    (E_BLOCK_BRICK_STAIRS);\n\tconstexpr cItemGlazedTerracottaHandler  ItemBrownGlazedTerracottaHandler           (E_BLOCK_BROWN_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemBrownMushroomBlockHandler              (E_BLOCK_BROWN_MUSHROOM);\n\tconstexpr cDefaultItemHandler           ItemBrownShulkerBoxHandler                 (E_BLOCK_BROWN_SHULKER_BOX);\n\tconstexpr cItemBucketHandler            ItemBucketHandler                          (E_ITEM_BUCKET);\n\tconstexpr cDefaultItemHandler           ItemCactusHandler                          (E_BLOCK_CACTUS);\n\tconstexpr cDefaultItemHandler           ItemCakeBlockHandler                       (E_BLOCK_CAKE);\n\tconstexpr cSimplePlaceableItemHandler   ItemCakeHandler                            (E_ITEM_CAKE, E_BLOCK_CAKE);\n\tconstexpr cDefaultItemHandler           ItemCarpetHandler                          (E_BLOCK_CARPET);\n\tconstexpr cItemFoodSeedsHandler         ItemCarrotHandler                          (E_ITEM_CARROT, cItemHandler::FoodInfo(3, 6.6));\n\tconstexpr cDefaultItemHandler           ItemCarrotOnStickHandler                   (E_ITEM_CARROT_ON_STICK);\n\tconstexpr cDefaultItemHandler           ItemCarrotsBlockHandler                    (E_BLOCK_CARROTS);\n\tconstexpr cDefaultItemHandler           ItemCatDiscHandler                         (E_ITEM_CAT_DISC);\n\tconstexpr cDefaultItemHandler           ItemCauldronBlockHandler                   (E_BLOCK_CAULDRON);\n\tconstexpr cSimplePlaceableItemHandler   ItemCauldronHandler                        (E_ITEM_CAULDRON, E_BLOCK_CAULDRON);;\n\tconstexpr cItemArmorHandler             ItemChainBootsHandler                      (E_ITEM_CHAIN_BOOTS);\n\tconstexpr cItemArmorHandler             ItemChainChestplateHandler                 (E_ITEM_CHAIN_CHESTPLATE);\n\tconstexpr cDefaultItemHandler           ItemChainCommandBlockHandler               (E_BLOCK_CHAIN_COMMAND_BLOCK);\n\tconstexpr cItemArmorHandler             ItemChainHelmetHandler                     (E_ITEM_CHAIN_HELMET);\n\tconstexpr cItemArmorHandler             ItemChainLeggingsHandler                   (E_ITEM_CHAIN_LEGGINGS);\n\tconstexpr cItemChestHandler             ItemChestHandler                           (E_BLOCK_CHEST);\n\tconstexpr cItemMinecartHandler          ItemChestMinecartHandler                   (E_ITEM_CHEST_MINECART);\n\tconstexpr cDefaultItemHandler           ItemChirpDiscHandler                       (E_ITEM_CHIRP_DISC);\n\tconstexpr cDefaultItemHandler           ItemChorusFlowerHandler                    (E_BLOCK_CHORUS_FLOWER);\n\tconstexpr cItemChorusFruitHandler       ItemChorusFruitHandler                     (E_ITEM_CHORUS_FRUIT);\n\tconstexpr cDefaultItemHandler           ItemChorusPlantHandler                     (E_BLOCK_CHORUS_PLANT);\n\tconstexpr cDefaultItemHandler           ItemClayBlockHandler                       (E_BLOCK_CLAY);\n\tconstexpr cDefaultItemHandler           ItemClayHandler                            (E_ITEM_CLAY);\n\tconstexpr cDefaultItemHandler           ItemClockHandler                           (E_ITEM_CLOCK);\n\tconstexpr cDefaultItemHandler           ItemCoalBlockHandler                       (E_BLOCK_BLOCK_OF_COAL);\n\tconstexpr cDefaultItemHandler           ItemCoalHandler                            (E_ITEM_COAL);\n\tconstexpr cDefaultItemHandler           ItemCoalOreHandler                         (E_BLOCK_COAL_ORE);\n\tconstexpr cDefaultItemHandler           ItemCobblestoneHandler                     (E_BLOCK_COBBLESTONE);\n\tconstexpr cItemStairsHandler            ItemCobblestoneStairsHandler               (E_BLOCK_COBBLESTONE_STAIRS);\n\tconstexpr cDefaultItemHandler           ItemCobblestoneWallHandler                 (E_BLOCK_COBBLESTONE_WALL);\n\tconstexpr cDefaultItemHandler           ItemCobwebHandler                          (E_BLOCK_COBWEB);\n\tconstexpr cDefaultItemHandler           ItemCocoaPodHandler                        (E_BLOCK_COCOA_POD);\n\tconstexpr cDefaultItemHandler           ItemCommandBlockHandler                    (E_BLOCK_COMMAND_BLOCK);\n\tconstexpr cItemComparatorHandler        ItemComparatorHandler                      (E_ITEM_COMPARATOR);\n\tconstexpr cDefaultItemHandler           ItemCompassHandler                         (E_ITEM_COMPASS);\n\tconstexpr cDefaultItemHandler           ItemConcreteBlockHandler                   (E_BLOCK_CONCRETE);\n\tconstexpr cDefaultItemHandler           ItemConcretePowderHandler                  (E_BLOCK_CONCRETE_POWDER);\n\tconstexpr cItemSimpleFoodHandler        ItemCookedBeefHandler                      (E_ITEM_STEAK, cItemHandler::FoodInfo(8, 12.8));\n\tconstexpr cItemSimpleFoodHandler        ItemCookedChickenHandler                   (E_ITEM_COOKED_CHICKEN, cItemHandler::FoodInfo(6, 7.2));\n\tconstexpr cItemCookedFishHandler        ItemCookedFishHandler                      (E_ITEM_COOKED_FISH);\n\tconstexpr cItemSimpleFoodHandler        ItemCookedMuttonHandler                    (E_ITEM_COOKED_MUTTON, cItemHandler::FoodInfo(6, 9.6));\n\tconstexpr cItemSimpleFoodHandler        ItemCookedPorkchopHandler                  (E_ITEM_COOKED_PORKCHOP, cItemHandler::FoodInfo(8, 12.8));\n\tconstexpr cItemSimpleFoodHandler        ItemCookedRabbitHandler                    (E_ITEM_COOKED_RABBIT, cItemHandler::FoodInfo(5, 6));\n\tconstexpr cItemSimpleFoodHandler        ItemCookieHandler                          (E_ITEM_COOKIE, cItemHandler::FoodInfo(2, 0.5));\n\tconstexpr cItemGlazedTerracottaHandler  ItemCyanGlazedTerracottaHandler            (E_BLOCK_CYAN_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemCyanShulkerBoxHandler                  (E_BLOCK_CYAN_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemDandelionHandler                       (E_BLOCK_DANDELION);\n\tconstexpr cItemBoatHandler              ItemDarkOakBoatHandler                     (E_ITEM_DARK_OAK_BOAT);\n\tconstexpr cDefaultItemHandler           ItemDarkOakDoorBlockHandler                (E_BLOCK_DARK_OAK_DOOR);\n\tconstexpr cItemDoorHandler              ItemDarkOakDoorHandler                     (E_ITEM_DARK_OAK_DOOR);\n\tconstexpr cItemFenceGateHandler         ItemDarkOakFenceGateHandler                (E_BLOCK_DARK_OAK_FENCE_GATE);\n\tconstexpr cDefaultItemHandler           ItemDarkOakFenceHandler                    (E_BLOCK_DARK_OAK_FENCE);\n\tconstexpr cItemStairsHandler            ItemDarkOakStairsHandler                   (E_BLOCK_DARK_OAK_WOOD_STAIRS);\n\tconstexpr cDefaultItemHandler           ItemDaylightSensorBlockHandler             (E_BLOCK_DAYLIGHT_SENSOR);\n\tconstexpr cDefaultItemHandler           ItemDeadBushHandler                        (E_BLOCK_DEAD_BUSH);\n\tconstexpr cItemRailHandler              ItemDetectorRailHandler                    (E_BLOCK_DETECTOR_RAIL);\n\tconstexpr cItemAxeHandler               ItemDiamondAxeHandler                      (E_ITEM_DIAMOND_AXE);\n\tconstexpr cDefaultItemHandler           ItemDiamondBlockHandler                    (E_BLOCK_DIAMOND_BLOCK);\n\tconstexpr cItemArmorHandler             ItemDiamondBootsHandler                    (E_ITEM_DIAMOND_BOOTS);\n\tconstexpr cItemArmorHandler             ItemDiamondChestplateHandler               (E_ITEM_DIAMOND_CHESTPLATE);\n\tconstexpr cDefaultItemHandler           ItemDiamondHandler                         (E_ITEM_DIAMOND);\n\tconstexpr cItemArmorHandler             ItemDiamondHelmetHandler                   (E_ITEM_DIAMOND_HELMET);\n\tconstexpr cItemHoeHandler               ItemDiamondHoeHandler                      (E_ITEM_DIAMOND_HOE);\n\tconstexpr cDefaultItemHandler           ItemDiamondHorseArmorHandler               (E_ITEM_DIAMOND_HORSE_ARMOR);\n\tconstexpr cItemArmorHandler             ItemDiamondLeggingsHandler                 (E_ITEM_DIAMOND_LEGGINGS);\n\tconstexpr cDefaultItemHandler           ItemDiamondOreHandler                      (E_BLOCK_DIAMOND_ORE);\n\tconstexpr cItemPickaxeHandler           ItemDiamondPickaxeHandler                  (E_ITEM_DIAMOND_PICKAXE);\n\tconstexpr cItemShovelHandler            ItemDiamondShovelHandler                   (E_ITEM_DIAMOND_SHOVEL);\n\tconstexpr cItemSwordHandler             ItemDiamondSwordHandler                    (E_ITEM_DIAMOND_SWORD);\n\tconstexpr cDefaultItemHandler           ItemDirtHandler                            (E_BLOCK_DIRT);\n\tconstexpr cItemDropSpenserHandler       ItemDispenserHandler                       (E_BLOCK_DISPENSER);\n\tconstexpr cDefaultItemHandler           ItemDoubleOakSlabHandler                   (E_BLOCK_DOUBLE_WOODEN_SLAB);\n\tconstexpr cDefaultItemHandler           ItemDoubleRedSandstoneSlabHandler          (E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB);\n\tconstexpr cDefaultItemHandler           ItemDoubleStoneSlabHandler                 (E_BLOCK_DOUBLE_STONE_SLAB);\n\tconstexpr cDefaultItemHandler           ItemDragonBreathHandler                    (E_ITEM_DRAGON_BREATH);\n\tconstexpr cDefaultItemHandler           ItemDragonEggBlockHandler                  (E_BLOCK_DRAGON_EGG);\n\tconstexpr cItemDropSpenserHandler       ItemDropperHandler                         (E_BLOCK_DROPPER);\n\tconstexpr cItemDyeHandler               ItemDyeHandler                             (E_ITEM_DYE);\n\tconstexpr cItemEggHandler               ItemEggHandler                             (E_ITEM_EGG);\n\tconstexpr cItemArmorHandler             ItemElytraHandler                          (E_ITEM_ELYTRA);\n\tconstexpr cDefaultItemHandler           ItemEmeraldBlockHandler                    (E_BLOCK_EMERALD_BLOCK);\n\tconstexpr cDefaultItemHandler           ItemEmeraldHandler                         (E_ITEM_EMERALD);\n\tconstexpr cDefaultItemHandler           ItemEmeraldOreHandler                      (E_BLOCK_EMERALD_ORE);\n\tconstexpr cItemEmptyMapHandler          ItemEmptyMapHandler                        (E_ITEM_EMPTY_MAP);\n\tconstexpr cDefaultItemHandler           ItemEnchantedBookHandler                   (E_ITEM_ENCHANTED_BOOK);\n\tconstexpr cItemEnchantingTableHandler   ItemEnchantingTableHandler                 (E_BLOCK_ENCHANTMENT_TABLE);\n\tconstexpr cDefaultItemHandler           ItemEndBricksHandler                       (E_BLOCK_END_BRICKS);\n\tconstexpr cItemEndCrystalHandler        ItemEndCrystalHandler                      (E_ITEM_END_CRYSTAL);\n\tconstexpr cItemEnderChestHandler        ItemEnderChestHandler                      (E_BLOCK_ENDER_CHEST);\n\tconstexpr cItemEnderPearlHandler        ItemEnderPearlHandler                      (E_ITEM_ENDER_PEARL);\n\tconstexpr cDefaultItemHandler           ItemEndGatewayHandler                      (E_BLOCK_END_GATEWAY);\n\tconstexpr cDefaultItemHandler           ItemEndPortalBlockHandler                  (E_BLOCK_END_PORTAL);\n\tconstexpr cItemEndPortalFrameHandler    ItemEndPortalFrameHandler                  (E_BLOCK_END_PORTAL_FRAME);\n\tconstexpr cDefaultItemHandler           ItemEndRodHandler                          (E_BLOCK_END_ROD);\n\tconstexpr cDefaultItemHandler           ItemEndStoneBlockHandler                   (E_BLOCK_END_STONE);\n\tconstexpr cItemEyeOfEnderHandler        ItemEyeOfEnderHandler                      (E_ITEM_EYE_OF_ENDER);\n\tconstexpr cDefaultItemHandler           ItemFarDiscHandler                         (E_ITEM_FAR_DISC);\n\tconstexpr cDefaultItemHandler           ItemFarmlandHandler                        (E_BLOCK_FARMLAND);\n\tconstexpr cDefaultItemHandler           ItemFeatherHandler                         (E_ITEM_FEATHER);\n\tconstexpr cDefaultItemHandler           ItemFermentedSpiderEyeHandler              (E_ITEM_FERMENTED_SPIDER_EYE);\n\tconstexpr cDefaultItemHandler           ItemFireBlockHandler                       (E_BLOCK_FIRE);\n\tconstexpr cItemLighterHandler           ItemFireChargeHandler                      (E_ITEM_FIRE_CHARGE);\n\tconstexpr cItemFireworkHandler          ItemFireworkRocketHandler                  (E_ITEM_FIREWORK_ROCKET);\n\tconstexpr cDefaultItemHandler           ItemFireworkStarHandler                    (E_ITEM_FIREWORK_STAR);\n\tconstexpr cItemFishingRodHandler        ItemFishingRodHandler                      (E_ITEM_FISHING_ROD);\n\tconstexpr cItemLighterHandler           ItemFlintAndSteelHandler                   (E_ITEM_FLINT_AND_STEEL);\n\tconstexpr cDefaultItemHandler           ItemFlintHandler                           (E_ITEM_FLINT);\n\tconstexpr cDefaultItemHandler           ItemFlowerPotBlockHandler                  (E_BLOCK_FLOWER_POT);\n\tconstexpr cSimplePlaceableItemHandler   ItemFlowerPotHandler                       (E_ITEM_FLOWER_POT, E_BLOCK_FLOWER_POT);\n\tconstexpr cDefaultItemHandler           ItemFrostedIceHandler                      (E_BLOCK_FROSTED_ICE);\n\tconstexpr cItemFurnaceHandler           ItemFurnaceHandler                         (E_BLOCK_FURNACE);\n\tconstexpr cItemMinecartHandler          ItemFurnaceMinecartHandler                 (E_ITEM_FURNACE_MINECART);\n\tconstexpr cDefaultItemHandler           ItemGhastTearHandler                       (E_ITEM_GHAST_TEAR);\n\tconstexpr cItemBottleHandler            ItemGlassBottleHandler                     (E_ITEM_GLASS_BOTTLE);\n\tconstexpr cDefaultItemHandler           ItemGlassHandler                           (E_BLOCK_GLASS);\n\tconstexpr cDefaultItemHandler           ItemGlassPaneHandler                       (E_BLOCK_GLASS_PANE);\n\tconstexpr cDefaultItemHandler           ItemGlisteringMelonHandler                 (E_ITEM_GLISTERING_MELON);\n\tconstexpr cDefaultItemHandler           ItemGlowstoneBlockHandler                  (E_BLOCK_GLOWSTONE);\n\tconstexpr cDefaultItemHandler           ItemGlowstoneDustHandler                   (E_ITEM_GLOWSTONE_DUST);\n\tconstexpr cDefaultItemHandler           ItemGoldBlockHandler                       (E_BLOCK_GOLD_BLOCK);\n\tconstexpr cItemGoldenAppleHandler       ItemGoldenAppleHandler                     (E_ITEM_GOLDEN_APPLE);\n\tconstexpr cItemAxeHandler               ItemGoldenAxeHandler                       (E_ITEM_GOLD_AXE);\n\tconstexpr cItemArmorHandler             ItemGoldenBootsHandler                     (E_ITEM_GOLD_BOOTS);\n\tconstexpr cItemSimpleFoodHandler        ItemGoldenCarrotHandler                    (E_ITEM_GOLDEN_CARROT, cItemHandler::FoodInfo(6, 14.4));\n\tconstexpr cItemArmorHandler             ItemGoldenChestplateHandler                (E_ITEM_GOLD_CHESTPLATE);\n\tconstexpr cItemArmorHandler             ItemGoldenHelmetHandler                    (E_ITEM_GOLD_HELMET);\n\tconstexpr cItemHoeHandler               ItemGoldenHoeHandler                       (E_ITEM_GOLD_HOE);\n\tconstexpr cDefaultItemHandler           ItemGoldenHorseArmorHandler                (E_ITEM_GOLD_HORSE_ARMOR);\n\tconstexpr cItemArmorHandler             ItemGoldenLeggingsHandler                  (E_ITEM_GOLD_LEGGINGS);\n\tconstexpr cItemPickaxeHandler           ItemGoldenPickaxeHandler                   (E_ITEM_GOLD_PICKAXE);\n\tconstexpr cItemShovelHandler            ItemGoldenShovelHandler                    (E_ITEM_GOLD_SHOVEL);\n\tconstexpr cItemSwordHandler             ItemGoldenSwordHandler                     (E_ITEM_GOLD_SWORD);\n\tconstexpr cDefaultItemHandler           ItemGoldHandler                            (E_ITEM_GOLD);\n\tconstexpr cDefaultItemHandler           ItemGoldNuggetHandler                      (E_ITEM_GOLD_NUGGET);\n\tconstexpr cDefaultItemHandler           ItemGoldOreHandler                         (E_BLOCK_GOLD_ORE);\n\tconstexpr cDefaultItemHandler           ItemGrassBlockHandler                      (E_BLOCK_GRASS);\n\tconstexpr cDefaultItemHandler           ItemGrassPathHandler                       (E_BLOCK_GRASS_PATH);\n\tconstexpr cDefaultItemHandler           ItemGravelHandler                          (E_BLOCK_GRAVEL);\n\tconstexpr cItemGlazedTerracottaHandler  ItemGrayGlazedTerracottaHandler            (E_BLOCK_GRAY_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemGrayShulkerBoxHandler                  (E_BLOCK_GRAY_SHULKER_BOX);\n\tconstexpr cItemGlazedTerracottaHandler  ItemGreenGlazedTerracottaHandler           (E_BLOCK_GREEN_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemGreenShulkerBoxHandler                 (E_BLOCK_GREEN_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemGunpowderHandler                       (E_ITEM_GUNPOWDER);\n\tconstexpr cDefaultItemHandler           ItemHardenedClayHandler                    (E_BLOCK_HARDENED_CLAY);\n\tconstexpr cItemSidewaysHandler          ItemHayBaleHandler                         (E_BLOCK_HAY_BALE);\n\tconstexpr cDefaultItemHandler           ItemHeadBlockHandler                       (E_BLOCK_HEAD);\n\tconstexpr cItemMobHeadHandler           ItemHeadHandler                            (E_ITEM_HEAD);\n\tconstexpr cDefaultItemHandler           ItemHeavyWeightedPressurePlateHandler      (E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE);\n\tconstexpr cItemHopperHandler            ItemHopperHandler                          (E_BLOCK_HOPPER);\n\tconstexpr cDefaultItemHandler           ItemHugeBrownMushroomBlockHandler          (E_BLOCK_HUGE_BROWN_MUSHROOM);\n\tconstexpr cDefaultItemHandler           ItemHugeRedMushroomBlockHandler            (E_BLOCK_HUGE_RED_MUSHROOM);\n\tconstexpr cDefaultItemHandler           ItemIceHandler                             (E_BLOCK_ICE);\n\tconstexpr cDefaultItemHandler           ItemInactiveComparatorHandler              (E_BLOCK_INACTIVE_COMPARATOR);\n\tconstexpr cDefaultItemHandler           ItemInvertedDaylightSensorHandler          (E_BLOCK_INVERTED_DAYLIGHT_SENSOR);\n\tconstexpr cItemAxeHandler               ItemIronAxeHandler                         (E_ITEM_IRON_AXE);\n\tconstexpr cDefaultItemHandler           ItemIronBarsBlockHandler                   (E_BLOCK_IRON_BARS);\n\tconstexpr cDefaultItemHandler           ItemIronBlockHandler                       (E_BLOCK_IRON_BLOCK);\n\tconstexpr cItemArmorHandler             ItemIronBootsHandler                       (E_ITEM_IRON_BOOTS);\n\tconstexpr cItemArmorHandler             ItemIronChestplateHandler                  (E_ITEM_IRON_CHESTPLATE);\n\tconstexpr cDefaultItemHandler           ItemIronDoorBlockHandler                   (E_BLOCK_IRON_DOOR);\n\tconstexpr cItemDoorHandler              ItemIronDoorHandler                        (E_ITEM_IRON_DOOR);\n\tconstexpr cDefaultItemHandler           ItemIronHandler                            (E_ITEM_IRON);\n\tconstexpr cItemArmorHandler             ItemIronHelmetHandler                      (E_ITEM_IRON_HELMET);\n\tconstexpr cItemHoeHandler               ItemIronHoeHandler                         (E_ITEM_IRON_HOE);\n\tconstexpr cDefaultItemHandler           ItemIronHorseArmorHandler                  (E_ITEM_IRON_HORSE_ARMOR);\n\tconstexpr cItemArmorHandler             ItemIronLeggingsHandler                    (E_ITEM_IRON_LEGGINGS);\n\tconstexpr cDefaultItemHandler           ItemIronNuggetHandler                      (E_ITEM_IRON_NUGGET);\n\tconstexpr cDefaultItemHandler           ItemIronOreHandler                         (E_BLOCK_IRON_ORE);\n\tconstexpr cItemPickaxeHandler           ItemIronPickaxeHandler                     (E_ITEM_IRON_PICKAXE);\n\tconstexpr cItemShovelHandler            ItemIronShovelHandler                      (E_ITEM_IRON_SHOVEL);\n\tconstexpr cItemSwordHandler             ItemIronSwordHandler                       (E_ITEM_IRON_SWORD);\n\tconstexpr cItemTrapdoorHandler          ItemIronTrapdoorHandler                    (E_BLOCK_IRON_TRAPDOOR);\n\tconstexpr cItemItemFrameHandler         ItemItemFrameHandler                       (E_ITEM_ITEM_FRAME);\n\tconstexpr cItemJackOLanternHandler      ItemJackOLanternHandler                    (E_BLOCK_JACK_O_LANTERN);\n\tconstexpr cDefaultItemHandler           ItemJukeboxHandler                         (E_BLOCK_JUKEBOX);\n\tconstexpr cItemBoatHandler              ItemJungleBoatHandler                      (E_ITEM_JUNGLE_BOAT);\n\tconstexpr cDefaultItemHandler           ItemJungleDoorBlockHandler                 (E_BLOCK_JUNGLE_DOOR);\n\tconstexpr cItemDoorHandler              ItemJungleDoorHandler                      (E_ITEM_JUNGLE_DOOR);\n\tconstexpr cItemFenceGateHandler         ItemJungleFenceGateHandler                 (E_BLOCK_JUNGLE_FENCE_GATE);\n\tconstexpr cDefaultItemHandler           ItemJungleFenceHandler                     (E_BLOCK_JUNGLE_FENCE);\n\tconstexpr cItemStairsHandler            ItemJungleStairsHandler                    (E_BLOCK_JUNGLE_WOOD_STAIRS);\n\tconstexpr cItemLadderHandler            ItemLadderHandler                          (E_BLOCK_LADDER);\n\tconstexpr cDefaultItemHandler           ItemLapisBlockHandler                      (E_BLOCK_LAPIS_BLOCK);\n\tconstexpr cDefaultItemHandler           ItemLapisOreHandler                        (E_BLOCK_LAPIS_ORE);\n\tconstexpr cItemBucketHandler            ItemLavaBucketHandler                      (E_ITEM_LAVA_BUCKET);\n\tconstexpr cDefaultItemHandler           ItemLavaHandler                            (E_BLOCK_LAVA);\n\tconstexpr cDefaultItemHandler           ItemLeashHandler                           (E_ITEM_LEAD);\n\tconstexpr cItemArmorHandler             ItemLeatherBootsHandler                    (E_ITEM_LEATHER_BOOTS);\n\tconstexpr cItemArmorHandler             ItemLeatherCapHandler                      (E_ITEM_LEATHER_CAP);\n\tconstexpr cDefaultItemHandler           ItemLeatherHandler                         (E_ITEM_LEATHER);\n\tconstexpr cItemArmorHandler             ItemLeatherPantsHandler                    (E_ITEM_LEATHER_PANTS);\n\tconstexpr cItemArmorHandler             ItemLeatherTunicHandler                    (E_ITEM_LEATHER_TUNIC);\n\tconstexpr cItemLeavesHandler            ItemLeavesHandler                          (E_BLOCK_LEAVES);\n\tconstexpr cItemLeverHandler             ItemLeverHandler                           (E_BLOCK_LEVER);\n\tconstexpr cItemGlazedTerracottaHandler  ItemLightBlueGlazedTerracottaHandler       (E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemLightBlueShulkerBoxHandler             (E_BLOCK_LIGHT_BLUE_SHULKER_BOX);\n\tconstexpr cItemGlazedTerracottaHandler  ItemLightGrayGlazedTerracottaHandler       (E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemLightGrayShulkerBoxHandler             (E_BLOCK_LIGHT_GRAY_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemLightWeightedPressurePlateHandler      (E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE);\n\tconstexpr cItemLilypadHandler           ItemLilypadHandler                         (E_BLOCK_LILY_PAD);\n\tconstexpr cItemGlazedTerracottaHandler  ItemLimeGlazedTerracottaHandler            (E_BLOCK_LIME_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemLimeShulkerBoxHandler                  (E_BLOCK_LIME_SHULKER_BOX);\n\tconstexpr cItemPotionHandler            ItemLingeringPotionHandler                 (E_ITEM_LINGERING_POTION);\n\tconstexpr cDefaultItemHandler           ItemLitFurnaceHandler                      (E_BLOCK_LIT_FURNACE);\n\tconstexpr cItemSidewaysHandler          ItemLogHandler                             (E_BLOCK_LOG);\n\tconstexpr cItemGlazedTerracottaHandler  ItemMagentaGlazedTerracottaHandler         (E_BLOCK_MAGENTA_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemMagentaShulkerBoxHandler               (E_BLOCK_MAGENTA_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemMagmaBlockHandler                      (E_BLOCK_MAGMA);\n\tconstexpr cDefaultItemHandler           ItemMagmaCreamHandler                      (E_ITEM_MAGMA_CREAM);\n\tconstexpr cDefaultItemHandler           ItemMallDiscHandler                        (E_ITEM_MALL_DISC);\n\tconstexpr cItemMapHandler               ItemMapHandler                             (E_ITEM_MAP);\n\tconstexpr cDefaultItemHandler           ItemMellohiDiscHandler                     (E_ITEM_MELLOHI_DISC);\n\tconstexpr cDefaultItemHandler           ItemMelonBlockHandler                      (E_BLOCK_MELON);\n\tconstexpr cItemSimpleSeedsHandler       ItemMelonSeedsHandler                      (E_ITEM_MELON_SEEDS);\n\tconstexpr cItemSimpleFoodHandler        ItemMelonSliceHandler                      (E_ITEM_MELON_SLICE, cItemHandler::FoodInfo(2, 1.2));\n\tconstexpr cDefaultItemHandler           ItemMelonStemHandler                       (E_BLOCK_MELON_STEM);\n\tconstexpr cItemMilkHandler              ItemMilkHandler                            (E_ITEM_MILK);\n\tconstexpr cItemMinecartHandler          ItemMinecartHandler                        (E_ITEM_MINECART);\n\tconstexpr cItemMinecartHandler          ItemMinecartWithCommandBlockHandler        (E_ITEM_MINECART_WITH_COMMAND_BLOCK);\n\tconstexpr cItemMinecartHandler          ItemMinecartWithHopperHandler              (E_ITEM_MINECART_WITH_HOPPER);\n\tconstexpr cItemMinecartHandler          ItemMinecartWithTNTHandler                 (E_ITEM_MINECART_WITH_TNT);\n\tconstexpr cDefaultItemHandler           ItemMobSpawnerBlockHandler                 (E_BLOCK_MOB_SPAWNER);\n\tconstexpr cDefaultItemHandler           ItemMossyCobblestoneHandler                (E_BLOCK_MOSSY_COBBLESTONE);\n\tconstexpr cItemSoupHandler              ItemMushroomSoupHandler                    (E_ITEM_MUSHROOM_SOUP, cItemHandler::FoodInfo(6, 7.2));\n\tconstexpr cDefaultItemHandler           ItemMyceliumHandler                        (E_BLOCK_MYCELIUM);\n\tconstexpr cDefaultItemHandler           ItemNameTagHandler                         (E_ITEM_NAME_TAG);\n\tconstexpr cDefaultItemHandler           ItemNetherBrickFenceHandler                (E_BLOCK_NETHER_BRICK_FENCE);\n\tconstexpr cDefaultItemHandler           ItemNetherBrickHandler                     (E_ITEM_NETHER_BRICK);\n\tconstexpr cDefaultItemHandler           ItemNetherBricksHandler                    (E_BLOCK_NETHER_BRICK);\n\tconstexpr cItemStairsHandler            ItemNetherBrickStairsHandler               (E_BLOCK_NETHER_BRICK_STAIRS);\n\tconstexpr cDefaultItemHandler           ItemNetherPortalBlockHandler               (E_BLOCK_NETHER_PORTAL);\n\tconstexpr cDefaultItemHandler           ItemNetherQuartzHandler                    (E_ITEM_NETHER_QUARTZ);\n\tconstexpr cDefaultItemHandler           ItemNetherQuartzOreHandler                 (E_BLOCK_NETHER_QUARTZ_ORE);\n\tconstexpr cDefaultItemHandler           ItemNetherrackHandler                      (E_BLOCK_NETHERRACK);\n\tconstexpr cDefaultItemHandler           ItemNetherStarHandler                      (E_ITEM_NETHER_STAR);\n\tconstexpr cDefaultItemHandler           ItemNetherWartBlockHandler                 (E_BLOCK_NETHER_WART_BLOCK);\n\tconstexpr cItemNetherWartHandler        ItemNetherWartHandler                      (E_ITEM_NETHER_WART);\n\tconstexpr cDefaultItemHandler           ItemNetherWartTechnicalBlockHandler        (E_BLOCK_NETHER_WART);\n\tconstexpr cItemLeavesHandler            ItemNewLeavesHandler                       (E_BLOCK_NEW_LEAVES);\n\tconstexpr cItemSidewaysHandler          ItemNewLogHandler                          (E_BLOCK_NEW_LOG);\n\tconstexpr cDefaultItemHandler           ItemNoteBlockHandler                       (E_BLOCK_NOTE_BLOCK);\n\tconstexpr cItemBoatHandler              ItemOakBoatHandler                         (E_ITEM_BOAT);\n\tconstexpr cItemButtonHandler            ItemOakButtonHandler                       (E_BLOCK_WOODEN_BUTTON);\n\tconstexpr cDefaultItemHandler           ItemOakDoorBlockHandler                    (E_BLOCK_OAK_DOOR);\n\tconstexpr cItemDoorHandler              ItemOakDoorHandler                         (E_ITEM_WOODEN_DOOR);\n\tconstexpr cItemFenceGateHandler         ItemOakFenceGateHandler                    (E_BLOCK_OAK_FENCE_GATE);\n\tconstexpr cDefaultItemHandler           ItemOakFenceHandler                        (E_BLOCK_FENCE);\n\tconstexpr cItemSlabHandler              ItemOakSlabHandler                         (E_BLOCK_WOODEN_SLAB);\n\tconstexpr cItemStairsHandler            ItemOakStairsHandler                       (E_BLOCK_OAK_WOOD_STAIRS);\n\tconstexpr cItemTrapdoorHandler          ItemOakTrapdoorHandler                     (E_BLOCK_TRAPDOOR);\n\tconstexpr cItemObserverHandler          ItemObserverHandler                        (E_BLOCK_OBSERVER);\n\tconstexpr cDefaultItemHandler           ItemObsidianHandler                        (E_BLOCK_OBSIDIAN);\n\tconstexpr cItemGlazedTerracottaHandler  ItemOrangeGlazedTerracottaHandler          (E_BLOCK_ORANGE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemOrangeShulkerBoxHandler                (E_BLOCK_ORANGE_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemPackedIceHandler                       (E_BLOCK_PACKED_ICE);\n\tconstexpr cItemPaintingHandler          ItemPaintingHandler                        (E_ITEM_PAINTING);\n\tconstexpr cDefaultItemHandler           ItemPaperHandler                           (E_ITEM_PAPER);\n\tconstexpr cItemGlazedTerracottaHandler  ItemPinkGlazedTerracottaHandler            (E_BLOCK_PINK_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemPinkShulkerBoxHandler                  (E_BLOCK_PINK_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemPistonExtensionHandler                 (E_BLOCK_PISTON_EXTENSION);\n\tconstexpr cItemPistonHandler            ItemPistonHandler                          (E_BLOCK_PISTON);\n\tconstexpr cDefaultItemHandler           ItemPistonMovedBlockHandler                (E_BLOCK_PISTON_MOVED_BLOCK);\n\tconstexpr cItemPlanksHandler            ItemPlanksHandler                          (E_BLOCK_PLANKS);\n\tconstexpr cItemPoisonousPotatoHandler   ItemPoisonousPotatoHandler                 (E_ITEM_POISONOUS_POTATO);\n\tconstexpr cDefaultItemHandler           ItemPoppedChorusFruitHandler               (E_ITEM_POPPED_CHORUS_FRUIT);\n\tconstexpr cDefaultItemHandler           ItemPoppyHandler                           (E_BLOCK_FLOWER);\n\tconstexpr cDefaultItemHandler           ItemPotatoesBlockHandler                   (E_BLOCK_POTATOES);\n\tconstexpr cItemFoodSeedsHandler         ItemPotatoHandler                          (E_ITEM_POTATO, cItemHandler::FoodInfo(1, 0.6));\n\tconstexpr cItemPotionHandler            ItemPotionHandler                          (E_ITEM_POTION);\n\tconstexpr cItemRailHandler              ItemPoweredRailHandler                     (E_BLOCK_POWERED_RAIL);\n\tconstexpr cDefaultItemHandler           ItemPrismarineBlockHandler                 (E_BLOCK_PRISMARINE_BLOCK);\n\tconstexpr cDefaultItemHandler           ItemPrismarineCrystalsHandler              (E_ITEM_PRISMARINE_CRYSTALS);\n\tconstexpr cDefaultItemHandler           ItemPrismarineShardHandler                 (E_ITEM_PRISMARINE_SHARD);\n\tconstexpr cItemPumpkinHandler           ItemPumpkinHandler                         (E_BLOCK_PUMPKIN);\n\tconstexpr cItemSimpleFoodHandler        ItemPumpkinPieHandler                      (E_ITEM_PUMPKIN_PIE, cItemHandler::FoodInfo(8, 4.8));\n\tconstexpr cItemSimpleSeedsHandler       ItemPumpkinSeedsHandler                    (E_ITEM_PUMPKIN_SEEDS);\n\tconstexpr cDefaultItemHandler           ItemPumpkinStemHandler                     (E_BLOCK_PUMPKIN_STEM);\n\tconstexpr cItemGlazedTerracottaHandler  ItemPurpleGlazedTerracottaHandler          (E_BLOCK_PURPLE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemPurpleShulkerBoxHandler                (E_BLOCK_PURPLE_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemPurpurBlockHandler                     (E_BLOCK_PURPUR_BLOCK);\n\tconstexpr cDefaultItemHandler           ItemPurpurDoubleSlabHandler                (E_BLOCK_PURPUR_DOUBLE_SLAB);\n\tconstexpr cDefaultItemHandler           ItemPurpurPillarHandler                    (E_BLOCK_PURPUR_PILLAR);\n\tconstexpr cItemSlabHandler              ItemPurpurSlabHandler                      (E_BLOCK_PURPUR_SLAB);\n\tconstexpr cItemStairsHandler            ItemPurpurStairsHandler                    (E_BLOCK_PURPUR_STAIRS);\n\tconstexpr cItemQuartzHandler            ItemQuartzBlockHandler                     (E_BLOCK_QUARTZ_BLOCK);\n\tconstexpr cItemStairsHandler            ItemQuartzStairsHandler                    (E_BLOCK_QUARTZ_STAIRS);\n\tconstexpr cDefaultItemHandler           ItemRabbitHideHandler                      (E_ITEM_RABBIT_HIDE);\n\tconstexpr cDefaultItemHandler           ItemRabbitsFootHandler                     (E_ITEM_RABBITS_FOOT);\n\tconstexpr cItemSoupHandler              ItemRabbitStewHandler                      (E_ITEM_RABBIT_STEW, cItemHandler::FoodInfo(10, 12));\n\tconstexpr cItemRailHandler              ItemRailHandler                            (E_BLOCK_RAIL);\n\tconstexpr cItemSimpleFoodHandler        ItemRawBeefHandler                         (E_ITEM_RAW_BEEF, cItemHandler::FoodInfo(3, 1.8));\n\tconstexpr cItemRawChickenHandler        ItemRawChickenHandler                      (E_ITEM_RAW_CHICKEN);\n\tconstexpr cItemRawFishHandler           ItemRawFishHandler                         (E_ITEM_RAW_FISH);\n\tconstexpr cItemSimpleFoodHandler        ItemRawMuttonHandler                       (E_ITEM_RAW_MUTTON, cItemHandler::FoodInfo(2, 1.2));\n\tconstexpr cItemSimpleFoodHandler        ItemRawPorkchopHandler                     (E_ITEM_RAW_PORKCHOP, cItemHandler::FoodInfo(3, 1.8));\n\tconstexpr cItemSimpleFoodHandler        ItemRawRabbitHandler                       (E_ITEM_RAW_RABBIT, cItemHandler::FoodInfo(3, 1.8));\n\tconstexpr cItemGlazedTerracottaHandler  ItemRedGlazedTerracottaHandler             (E_BLOCK_RED_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemRedMushroomBlockHandler                (E_BLOCK_RED_MUSHROOM);\n\tconstexpr cDefaultItemHandler           ItemRedNetherBricksHandler                 (E_BLOCK_RED_NETHER_BRICK);\n\tconstexpr cDefaultItemHandler           ItemRedSandstoneHandler                    (E_BLOCK_RED_SANDSTONE);\n\tconstexpr cItemSlabHandler              ItemRedSandstoneSlabHandler                (E_BLOCK_RED_SANDSTONE_SLAB);\n\tconstexpr cItemStairsHandler            ItemRedSandstoneStairsHandler              (E_BLOCK_RED_SANDSTONE_STAIRS);\n\tconstexpr cDefaultItemHandler           ItemRedShulkerBoxHandler                   (E_BLOCK_RED_SHULKER_BOX);\n\tconstexpr cDefaultItemHandler           ItemRedstoneBlockHandler                   (E_BLOCK_BLOCK_OF_REDSTONE);\n\tconstexpr cItemRedstoneDustHandler      ItemRedstoneDustHandler                    (E_ITEM_REDSTONE_DUST);\n\tconstexpr cDefaultItemHandler           ItemRedstoneLampOffHandler                 (E_BLOCK_REDSTONE_LAMP_OFF);\n\tconstexpr cDefaultItemHandler           ItemRedstoneLampOnHandler                  (E_BLOCK_REDSTONE_LAMP_ON);\n\tconstexpr cDefaultItemHandler           ItemRedstoneOreGlowingHandler              (E_BLOCK_REDSTONE_ORE_GLOWING);\n\tconstexpr cDefaultItemHandler           ItemRedstoneOreHandler                     (E_BLOCK_REDSTONE_ORE);\n\tconstexpr cItemRedstoneRepeaterHandler  ItemRedstoneRepeaterHandler                (E_ITEM_REDSTONE_REPEATER);\n\tconstexpr cDefaultItemHandler           ItemRedstoneRepeaterOffHandler             (E_BLOCK_REDSTONE_REPEATER_OFF);\n\tconstexpr cDefaultItemHandler           ItemRedstoneRepeaterOnHandler              (E_BLOCK_REDSTONE_REPEATER_ON);\n\tconstexpr cItemTorchHandler             ItemRedstoneTorchHandler                   (E_BLOCK_REDSTONE_TORCH_ON);\n\tconstexpr cDefaultItemHandler           ItemRedstoneTorchOffBlockHandler           (E_BLOCK_REDSTONE_TORCH_OFF);\n\tconstexpr cDefaultItemHandler           ItemRedstoneWireHandler                    (E_BLOCK_REDSTONE_WIRE);\n\tconstexpr cDefaultItemHandler           ItemRepeatingCommandBlockHandler           (E_BLOCK_REPEATING_COMMAND_BLOCK);\n\tconstexpr cItemRottenFleshHandler       ItemRottenFleshHandler                     (E_ITEM_ROTTEN_FLESH);\n\tconstexpr cDefaultItemHandler           ItemSaddleHandler                          (E_ITEM_SADDLE);\n\tconstexpr cDefaultItemHandler           ItemSandHandler                            (E_BLOCK_SAND);\n\tconstexpr cDefaultItemHandler           ItemSandstoneHandler                       (E_BLOCK_SANDSTONE);\n\tconstexpr cItemStairsHandler            ItemSandstoneStairsHandler                 (E_BLOCK_SANDSTONE_STAIRS);\n\tconstexpr cItemSaplingHandler           ItemSaplingHandler                         (E_BLOCK_SAPLING);\n\tconstexpr cDefaultItemHandler           ItemSeaLanternHandler                      (E_BLOCK_SEA_LANTERN);\n\tconstexpr cItemSimpleSeedsHandler       ItemSeedsHandler                           (E_ITEM_SEEDS);\n\tconstexpr cItemShearsHandler            ItemShearsHandler                          (E_ITEM_SHEARS);\n\tconstexpr cDefaultItemHandler           ItemShieldHandler                          (E_ITEM_SHIELD);\n\tconstexpr cDefaultItemHandler           ItemShulkerShellHandler                    (E_ITEM_SHULKER_SHELL);\n\tconstexpr cItemSignHandler              ItemSignHandler                            (E_ITEM_SIGN);\n\tconstexpr cDefaultItemHandler           ItemSignPostHandler                        (E_BLOCK_SIGN_POST);\n\tconstexpr cDefaultItemHandler           ItemSilverfishEggBlockHandler              (E_BLOCK_SILVERFISH_EGG);\n\tconstexpr cDefaultItemHandler           ItemSlimeballHandler                       (E_ITEM_SLIMEBALL);\n\tconstexpr cDefaultItemHandler           ItemSlimeBlockHandler                      (E_BLOCK_SLIME_BLOCK);\n\tconstexpr cItemSnowballHandler          ItemSnowballHandler                        (E_ITEM_SNOWBALL);\n\tconstexpr cDefaultItemHandler           ItemSnowBlockHandler                       (E_BLOCK_SNOW_BLOCK);\n\tconstexpr cItemSnowHandler              ItemSnowHandler                            (E_BLOCK_SNOW);\n\tconstexpr cDefaultItemHandler           ItemSoulsandHandler                        (E_BLOCK_SOULSAND);\n\tconstexpr cItemSpawnEggHandler          ItemSpawnEggHandler                        (E_ITEM_SPAWN_EGG);\n\tconstexpr cDefaultItemHandler           ItemSpectralArrowHandler                   (E_ITEM_SPECTRAL_ARROW);\n\tconstexpr cItemSpiderEyeHandler         ItemSpiderEyeHandler                       (E_ITEM_SPIDER_EYE);\n\tconstexpr cItemPotionHandler            ItemSplashPotionHandler                    (E_ITEM_SPLASH_POTION);\n\tconstexpr cDefaultItemHandler           ItemSpongeHandler                          (E_BLOCK_SPONGE);\n\tconstexpr cItemBoatHandler              ItemSpruceBoatHandler                      (E_ITEM_SPRUCE_BOAT);\n\tconstexpr cDefaultItemHandler           ItemSpruceDoorBlockHandler                 (E_BLOCK_SPRUCE_DOOR);\n\tconstexpr cItemDoorHandler              ItemSpruceDoorHandler                      (E_ITEM_SPRUCE_DOOR);\n\tconstexpr cItemFenceGateHandler         ItemSpruceFenceGateHandler                 (E_BLOCK_SPRUCE_FENCE_GATE);\n\tconstexpr cDefaultItemHandler           ItemSpruceFenceHandler                     (E_BLOCK_SPRUCE_FENCE);\n\tconstexpr cItemStairsHandler            ItemSpruceStairsHandler                    (E_BLOCK_SPRUCE_WOOD_STAIRS);\n\tconstexpr cDefaultItemHandler           ItemStainedGlassHandler                    (E_BLOCK_STAINED_GLASS);\n\tconstexpr cDefaultItemHandler           ItemStainedGlassPaneHandler                (E_BLOCK_STAINED_GLASS_PANE);\n\tconstexpr cDefaultItemHandler           ItemStalDiscHandler                        (E_ITEM_STAL_DISC);\n\tconstexpr cDefaultItemHandler           ItemStandingBannerHandler                  (E_BLOCK_STANDING_BANNER);\n\tconstexpr cDefaultItemHandler           ItemStationaryLavaHandler                  (E_BLOCK_STATIONARY_LAVA);\n\tconstexpr cDefaultItemHandler           ItemStationaryWaterHandler                 (E_BLOCK_STATIONARY_WATER);\n\tconstexpr cDefaultItemHandler           ItemStickHandler                           (E_ITEM_STICK);\n\tconstexpr cItemPistonHandler            ItemStickyPistonHandler                    (E_BLOCK_STICKY_PISTON);\n\tconstexpr cItemAxeHandler               ItemStoneAxeHandler                        (E_ITEM_STONE_AXE);\n\tconstexpr cDefaultItemHandler           ItemStoneBricksHandler                     (E_BLOCK_STONE_BRICKS);\n\tconstexpr cItemStairsHandler            ItemStoneBrickStairsHandler                (E_BLOCK_STONE_BRICK_STAIRS);\n\tconstexpr cItemButtonHandler            ItemStoneButtonHandler                     (E_BLOCK_STONE_BUTTON);\n\tconstexpr cDefaultItemHandler           ItemStoneHandler                           (E_BLOCK_STONE);\n\tconstexpr cItemHoeHandler               ItemStoneHoeHandler                        (E_ITEM_STONE_HOE);\n\tconstexpr cItemPickaxeHandler           ItemStonePickaxeHandler                    (E_ITEM_STONE_PICKAXE);\n\tconstexpr cDefaultItemHandler           ItemStonePressurePlateHandler              (E_BLOCK_STONE_PRESSURE_PLATE);\n\tconstexpr cItemShovelHandler            ItemStoneShovelHandler                     (E_ITEM_STONE_SHOVEL);\n\tconstexpr cItemSlabHandler              ItemStoneSlabHandler                       (E_BLOCK_STONE_SLAB);\n\tconstexpr cItemSwordHandler             ItemStoneSwordHandler                      (E_ITEM_STONE_SWORD);\n\tconstexpr cDefaultItemHandler           ItemStradDiscHandler                       (E_ITEM_STRAD_DISC);\n\tconstexpr cSimplePlaceableItemHandler   ItemStringHandler                          (E_ITEM_STRING, E_BLOCK_TRIPWIRE);\n\tconstexpr cDefaultItemHandler           ItemStructureBlockHandler                  (E_BLOCK_STRUCTURE_BLOCK);\n\tconstexpr cDefaultItemHandler           ItemStructureVoidHandler                   (E_BLOCK_STRUCTURE_VOID);\n\tconstexpr cDefaultItemHandler           ItemSugarCaneBlockHandler                  (E_BLOCK_SUGARCANE);\n\tconstexpr cSimplePlaceableItemHandler   ItemSugarCaneHandler                       (E_ITEM_SUGARCANE, E_BLOCK_SUGARCANE);\n\tconstexpr cDefaultItemHandler           ItemSugarHandler                           (E_ITEM_SUGAR);\n\tconstexpr cDefaultItemHandler           ItemTallGrassHandler                       (E_BLOCK_TALL_GRASS);\n\tconstexpr cDefaultItemHandler           ItemTerracottaHandler                      (E_BLOCK_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemTippedArrowHandler                     (E_ITEM_TIPPED_ARROW);\n\tconstexpr cDefaultItemHandler           ItemTNTHandler                             (E_BLOCK_TNT);\n\tconstexpr cItemTorchHandler             ItemTorchHandler                           (E_BLOCK_TORCH);\n\tconstexpr cDefaultItemHandler           ItemTotemOfUndyingHandler                  (E_ITEM_TOTEM_OF_UNDYING);\n\tconstexpr cItemChestHandler             ItemTrappedChestHandler                    (E_BLOCK_TRAPPED_CHEST);\n\tconstexpr cDefaultItemHandler           ItemTripwireHandler                        (E_BLOCK_TRIPWIRE);\n\tconstexpr cItemTripwireHookHandler      ItemTripwireHookHandler                    (E_BLOCK_TRIPWIRE_HOOK);\n\tconstexpr cItemVinesHandler             ItemVinesHandler                           (E_BLOCK_VINES);\n\tconstexpr cDefaultItemHandler           ItemWaitDiscHandler                        (E_ITEM_WAIT_DISC);\n\tconstexpr cDefaultItemHandler           ItemWallBannerHandler                      (E_BLOCK_WALL_BANNER);\n\tconstexpr cDefaultItemHandler           ItemWallsignHandler                        (E_BLOCK_WALLSIGN);\n\tconstexpr cDefaultItemHandler           ItemWardDiscHandler                        (E_ITEM_WARD_DISC);\n\tconstexpr cItemBucketHandler            ItemWaterBucketHandler                     (E_ITEM_WATER_BUCKET);\n\tconstexpr cDefaultItemHandler           ItemWaterHandler                           (E_BLOCK_WATER);\n\tconstexpr cDefaultItemHandler           ItemWheatBlockHandler                      (E_BLOCK_WHEAT);\n\tconstexpr cDefaultItemHandler           ItemWheatHandler                           (E_ITEM_WHEAT);\n\tconstexpr cItemGlazedTerracottaHandler  ItemWhiteGlazedTerracottaHandler           (E_BLOCK_WHITE_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemWhiteShulkerBoxHandler                 (E_BLOCK_WHITE_SHULKER_BOX);\n\tconstexpr cItemAxeHandler               ItemWoodenAxeHandler                       (E_ITEM_WOODEN_AXE);\n\tconstexpr cItemHoeHandler               ItemWoodenHoeHandler                       (E_ITEM_WOODEN_HOE);\n\tconstexpr cItemPickaxeHandler           ItemWoodenPickaxeHandler                   (E_ITEM_WOODEN_PICKAXE);\n\tconstexpr cDefaultItemHandler           ItemWoodenPressurePlateHandler             (E_BLOCK_WOODEN_PRESSURE_PLATE);\n\tconstexpr cItemShovelHandler            ItemWoodenShovelHandler                    (E_ITEM_WOODEN_SHOVEL);\n\tconstexpr cItemSwordHandler             ItemWoodenSwordHandler                     (E_ITEM_WOODEN_SWORD);\n\tconstexpr cItemClothHandler             ItemWoolHandler                            (E_BLOCK_WOOL);\n\tconstexpr cDefaultItemHandler           ItemWorkbenchHandler                       (E_BLOCK_WORKBENCH);\n\tconstexpr cDefaultItemHandler           ItemWrittenBookHandler                     (E_ITEM_WRITTEN_BOOK);\n\tconstexpr cItemGlazedTerracottaHandler  ItemYellowGlazedTerracottaHandler          (E_BLOCK_YELLOW_GLAZED_TERRACOTTA);\n\tconstexpr cDefaultItemHandler           ItemYellowShulkerBoxHandler                (E_BLOCK_YELLOW_SHULKER_BOX);\n}\n\n\n\n\n\nconst cItemHandler & cItemHandler::For(int a_ItemType)\n{\n\tswitch (a_ItemType)\n\t{\n\t\tcase E_BLOCK_ACACIA_DOOR:                    return ItemAcaciaDoorBlockHandler;\n\t\tcase E_BLOCK_ACACIA_FENCE:                   return ItemAcaciaFenceHandler;\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:              return ItemAcaciaFenceGateHandler;\n\t\tcase E_BLOCK_ACACIA_WOOD_STAIRS:             return ItemAcaciaStairsHandler;\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:                 return ItemActivatorRailHandler;\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:              return ItemActiveComparatorHandler;\n\t\tcase E_BLOCK_AIR:                            return ItemAirHandler;\n\t\tcase E_BLOCK_ANVIL:                          return ItemAnvilHandler;\n\t\tcase E_BLOCK_BARRIER:                        return ItemBarrierHandler;\n\t\tcase E_BLOCK_BEACON:                         return ItemBeaconHandler;\n\t\tcase E_BLOCK_BED:                            return ItemBedBlockHandler;\n\t\tcase E_BLOCK_BEDROCK:                        return ItemBedrockHandler;\n\t\tcase E_BLOCK_BEETROOTS:                      return ItemBeetrootsBlockHandler;\n\t\tcase E_BLOCK_BIG_FLOWER:                     return ItemBigFlowerHandler;\n\t\tcase E_BLOCK_BIRCH_DOOR:                     return ItemBirchDoorBlockHandler;\n\t\tcase E_BLOCK_BIRCH_FENCE:                    return ItemBirchFenceHandler;\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:               return ItemBirchFenceGateHandler;\n\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS:              return ItemBirchStairsHandler;\n\t\tcase E_BLOCK_BLACK_GLAZED_TERRACOTTA:        return ItemBlackGlazedTerracottaHandler;\n\t\tcase E_BLOCK_BLACK_SHULKER_BOX:              return ItemBlackShulkerBoxHandler;\n\t\tcase E_BLOCK_BLOCK_OF_COAL:                  return ItemCoalBlockHandler;\n\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:              return ItemRedstoneBlockHandler;\n\t\tcase E_BLOCK_BLUE_GLAZED_TERRACOTTA:         return ItemBlueGlazedTerracottaHandler;\n\t\tcase E_BLOCK_BLUE_SHULKER_BOX:               return ItemBlueShulkerBoxHandler;\n\t\tcase E_BLOCK_BONE_BLOCK:                     return ItemBoneBlockHandler;\n\t\tcase E_BLOCK_BOOKCASE:                       return ItemBookshelfHandler;\n\t\tcase E_BLOCK_BREWING_STAND:                  return ItemBrewingStandBlockHandler;\n\t\tcase E_BLOCK_BRICK:                          return ItemBrickHandler;\n\t\tcase E_BLOCK_BRICK_STAIRS:                   return ItemBricksStairsHandler;\n\t\tcase E_BLOCK_BROWN_GLAZED_TERRACOTTA:        return ItemBrownGlazedTerracottaHandler;\n\t\tcase E_BLOCK_BROWN_MUSHROOM:                 return ItemBrownMushroomBlockHandler;\n\t\tcase E_BLOCK_BROWN_SHULKER_BOX:              return ItemBrownShulkerBoxHandler;\n\t\tcase E_BLOCK_CACTUS:                         return ItemCactusHandler;\n\t\tcase E_BLOCK_CAKE:                           return ItemCakeBlockHandler;\n\t\tcase E_BLOCK_CARPET:                         return ItemCarpetHandler;\n\t\tcase E_BLOCK_CARROTS:                        return ItemCarrotsBlockHandler;\n\t\tcase E_BLOCK_CAULDRON:                       return ItemCauldronBlockHandler;\n\t\tcase E_BLOCK_CHAIN_COMMAND_BLOCK:            return ItemChainCommandBlockHandler;\n\t\tcase E_BLOCK_CHEST:                          return ItemChestHandler;\n\t\tcase E_BLOCK_CHORUS_FLOWER:                  return ItemChorusFlowerHandler;\n\t\tcase E_BLOCK_CHORUS_PLANT:                   return ItemChorusPlantHandler;\n\t\tcase E_BLOCK_CLAY:                           return ItemClayBlockHandler;\n\t\tcase E_BLOCK_COAL_ORE:                       return ItemCoalOreHandler;\n\t\tcase E_BLOCK_COBBLESTONE:                    return ItemCobblestoneHandler;\n\t\tcase E_BLOCK_COBBLESTONE_STAIRS:             return ItemCobblestoneStairsHandler;\n\t\tcase E_BLOCK_COBBLESTONE_WALL:               return ItemCobblestoneWallHandler;\n\t\tcase E_BLOCK_COBWEB:                         return ItemCobwebHandler;\n\t\tcase E_BLOCK_COCOA_POD:                      return ItemCocoaPodHandler;\n\t\tcase E_BLOCK_COMMAND_BLOCK:                  return ItemCommandBlockHandler;\n\t\tcase E_BLOCK_CONCRETE:                       return ItemConcreteBlockHandler;\n\t\tcase E_BLOCK_CONCRETE_POWDER:                return ItemConcretePowderHandler;\n\t\tcase E_BLOCK_CRAFTING_TABLE:                 return ItemWorkbenchHandler;\n\t\tcase E_BLOCK_CYAN_GLAZED_TERRACOTTA:         return ItemCyanGlazedTerracottaHandler;\n\t\tcase E_BLOCK_CYAN_SHULKER_BOX:               return ItemCyanShulkerBoxHandler;\n\t\tcase E_BLOCK_DANDELION:                      return ItemDandelionHandler;\n\t\tcase E_BLOCK_DARK_OAK_DOOR:                  return ItemDarkOakDoorBlockHandler;\n\t\tcase E_BLOCK_DARK_OAK_FENCE:                 return ItemDarkOakFenceHandler;\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:            return ItemDarkOakFenceGateHandler;\n\t\tcase E_BLOCK_DARK_OAK_WOOD_STAIRS:           return ItemDarkOakStairsHandler;\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:                return ItemDaylightSensorBlockHandler;\n\t\tcase E_BLOCK_DEAD_BUSH:                      return ItemDeadBushHandler;\n\t\tcase E_BLOCK_DETECTOR_RAIL:                  return ItemDetectorRailHandler;\n\t\tcase E_BLOCK_DIAMOND_BLOCK:                  return ItemDiamondBlockHandler;\n\t\tcase E_BLOCK_DIAMOND_ORE:                    return ItemDiamondOreHandler;\n\t\tcase E_BLOCK_DIRT:                           return ItemDirtHandler;\n\t\tcase E_BLOCK_DISPENSER:                      return ItemDispenserHandler;\n\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:      return ItemDoubleRedSandstoneSlabHandler;\n\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:              return ItemDoubleStoneSlabHandler;\n\t\tcase E_BLOCK_DOUBLE_WOODEN_SLAB:             return ItemDoubleOakSlabHandler;\n\t\tcase E_BLOCK_DRAGON_EGG:                     return ItemDragonEggBlockHandler;\n\t\tcase E_BLOCK_DROPPER:                        return ItemDropperHandler;\n\t\tcase E_BLOCK_EMERALD_BLOCK:                  return ItemEmeraldBlockHandler;\n\t\tcase E_BLOCK_EMERALD_ORE:                    return ItemEmeraldOreHandler;\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:              return ItemEnchantingTableHandler;\n\t\tcase E_BLOCK_ENDER_CHEST:                    return ItemEnderChestHandler;\n\t\tcase E_BLOCK_END_BRICKS:                     return ItemEndBricksHandler;\n\t\tcase E_BLOCK_END_GATEWAY:                    return ItemEndGatewayHandler;\n\t\tcase E_BLOCK_END_PORTAL:                     return ItemEndPortalBlockHandler;\n\t\tcase E_BLOCK_END_PORTAL_FRAME:               return ItemEndPortalFrameHandler;\n\t\tcase E_BLOCK_END_ROD:                        return ItemEndRodHandler;\n\t\tcase E_BLOCK_END_STONE:                      return ItemEndStoneBlockHandler;\n\t\tcase E_BLOCK_FARMLAND:                       return ItemFarmlandHandler;\n\t\tcase E_BLOCK_FENCE:                          return ItemOakFenceHandler;\n\t\tcase E_BLOCK_FIRE:                           return ItemFireBlockHandler;\n\t\tcase E_BLOCK_FLOWER:                         return ItemPoppyHandler;\n\t\tcase E_BLOCK_FLOWER_POT:                     return ItemFlowerPotBlockHandler;\n\t\tcase E_BLOCK_FROSTED_ICE:                    return ItemFrostedIceHandler;\n\t\tcase E_BLOCK_FURNACE:                        return ItemFurnaceHandler;\n\t\tcase E_BLOCK_GLASS:                          return ItemGlassHandler;\n\t\tcase E_BLOCK_GLASS_PANE:                     return ItemGlassPaneHandler;\n\t\tcase E_BLOCK_GLOWSTONE:                      return ItemGlowstoneBlockHandler;\n\t\tcase E_BLOCK_GOLD_BLOCK:                     return ItemGoldBlockHandler;\n\t\tcase E_BLOCK_GOLD_ORE:                       return ItemGoldOreHandler;\n\t\tcase E_BLOCK_GRASS:                          return ItemGrassBlockHandler;\n\t\tcase E_BLOCK_GRASS_PATH:                     return ItemGrassPathHandler;\n\t\tcase E_BLOCK_GRAVEL:                         return ItemGravelHandler;\n\t\tcase E_BLOCK_GRAY_GLAZED_TERRACOTTA:         return ItemGrayGlazedTerracottaHandler;\n\t\tcase E_BLOCK_GRAY_SHULKER_BOX:               return ItemGrayShulkerBoxHandler;\n\t\tcase E_BLOCK_GREEN_GLAZED_TERRACOTTA:        return ItemGreenGlazedTerracottaHandler;\n\t\tcase E_BLOCK_GREEN_SHULKER_BOX:              return ItemGreenShulkerBoxHandler;\n\t\tcase E_BLOCK_HARDENED_CLAY:                  return ItemHardenedClayHandler;\n\t\tcase E_BLOCK_HAY_BALE:                       return ItemHayBaleHandler;\n\t\tcase E_BLOCK_HEAD:                           return ItemHeadBlockHandler;\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:  return ItemHeavyWeightedPressurePlateHandler;\n\t\tcase E_BLOCK_HOPPER:                         return ItemHopperHandler;\n\t\tcase E_BLOCK_HUGE_BROWN_MUSHROOM:            return ItemHugeBrownMushroomBlockHandler;\n\t\tcase E_BLOCK_HUGE_RED_MUSHROOM:              return ItemHugeRedMushroomBlockHandler;\n\t\tcase E_BLOCK_ICE:                            return ItemIceHandler;\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:            return ItemInactiveComparatorHandler;\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:       return ItemInvertedDaylightSensorHandler;\n\t\tcase E_BLOCK_IRON_BARS:                      return ItemIronBarsBlockHandler;\n\t\tcase E_BLOCK_IRON_BLOCK:                     return ItemIronBlockHandler;\n\t\tcase E_BLOCK_IRON_DOOR:                      return ItemIronDoorBlockHandler;\n\t\tcase E_BLOCK_IRON_ORE:                       return ItemIronOreHandler;\n\t\tcase E_BLOCK_IRON_TRAPDOOR:                  return ItemIronTrapdoorHandler;\n\t\tcase E_BLOCK_JACK_O_LANTERN:                 return ItemJackOLanternHandler;\n\t\tcase E_BLOCK_JUKEBOX:                        return ItemJukeboxHandler;\n\t\tcase E_BLOCK_JUNGLE_DOOR:                    return ItemJungleDoorBlockHandler;\n\t\tcase E_BLOCK_JUNGLE_FENCE:                   return ItemJungleFenceHandler;\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:              return ItemJungleFenceGateHandler;\n\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:             return ItemJungleStairsHandler;\n\t\tcase E_BLOCK_LADDER:                         return ItemLadderHandler;\n\t\tcase E_BLOCK_LAPIS_BLOCK:                    return ItemLapisBlockHandler;\n\t\tcase E_BLOCK_LAPIS_ORE:                      return ItemLapisOreHandler;\n\t\tcase E_BLOCK_LAVA:                           return ItemLavaHandler;\n\t\tcase E_BLOCK_LEAVES:                         return ItemLeavesHandler;\n\t\tcase E_BLOCK_LEVER:                          return ItemLeverHandler;\n\t\tcase E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA:   return ItemLightBlueGlazedTerracottaHandler;\n\t\tcase E_BLOCK_LIGHT_BLUE_SHULKER_BOX:         return ItemLightBlueShulkerBoxHandler;\n\t\tcase E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA:   return ItemLightGrayGlazedTerracottaHandler;\n\t\tcase E_BLOCK_LIGHT_GRAY_SHULKER_BOX:         return ItemLightGrayShulkerBoxHandler;\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:  return ItemLightWeightedPressurePlateHandler;\n\t\tcase E_BLOCK_LILY_PAD:                       return ItemLilypadHandler;\n\t\tcase E_BLOCK_LIME_GLAZED_TERRACOTTA:         return ItemLimeGlazedTerracottaHandler;\n\t\tcase E_BLOCK_LIME_SHULKER_BOX:               return ItemLimeShulkerBoxHandler;\n\t\tcase E_BLOCK_LIT_FURNACE:                    return ItemLitFurnaceHandler;\n\t\tcase E_BLOCK_LOG:                            return ItemLogHandler;\n\t\tcase E_BLOCK_MAGENTA_GLAZED_TERRACOTTA:      return ItemMagentaGlazedTerracottaHandler;\n\t\tcase E_BLOCK_MAGENTA_SHULKER_BOX:            return ItemMagentaShulkerBoxHandler;\n\t\tcase E_BLOCK_MAGMA:                          return ItemMagmaBlockHandler;\n\t\tcase E_BLOCK_MELON:                          return ItemMelonBlockHandler;\n\t\tcase E_BLOCK_MELON_STEM:                     return ItemMelonStemHandler;\n\t\tcase E_BLOCK_MOB_SPAWNER:                    return ItemMobSpawnerBlockHandler;\n\t\tcase E_BLOCK_MOSSY_COBBLESTONE:              return ItemMossyCobblestoneHandler;\n\t\tcase E_BLOCK_MYCELIUM:                       return ItemMyceliumHandler;\n\t\tcase E_BLOCK_NETHERRACK:                     return ItemNetherrackHandler;\n\t\tcase E_BLOCK_NETHER_BRICK:                   return ItemNetherBricksHandler;\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:             return ItemNetherBrickFenceHandler;\n\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:            return ItemNetherBrickStairsHandler;\n\t\tcase E_BLOCK_NETHER_PORTAL:                  return ItemNetherPortalBlockHandler;\n\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:              return ItemNetherQuartzOreHandler;\n\t\tcase E_BLOCK_NETHER_WART:                    return ItemNetherWartTechnicalBlockHandler;\n\t\tcase E_BLOCK_NETHER_WART_BLOCK:              return ItemNetherWartBlockHandler;\n\t\tcase E_BLOCK_NEW_LEAVES:                     return ItemNewLeavesHandler;\n\t\tcase E_BLOCK_NEW_LOG:                        return ItemNewLogHandler;\n\t\tcase E_BLOCK_NOTE_BLOCK:                     return ItemNoteBlockHandler;\n\t\tcase E_BLOCK_OAK_DOOR:                       return ItemOakDoorBlockHandler;\n\t\tcase E_BLOCK_OAK_FENCE_GATE:                 return ItemOakFenceGateHandler;\n\t\tcase E_BLOCK_OAK_WOOD_STAIRS:                return ItemOakStairsHandler;\n\t\tcase E_BLOCK_OBSERVER:                       return ItemObserverHandler;\n\t\tcase E_BLOCK_OBSIDIAN:                       return ItemObsidianHandler;\n\t\tcase E_BLOCK_ORANGE_GLAZED_TERRACOTTA:       return ItemOrangeGlazedTerracottaHandler;\n\t\tcase E_BLOCK_ORANGE_SHULKER_BOX:             return ItemOrangeShulkerBoxHandler;\n\t\tcase E_BLOCK_PACKED_ICE:                     return ItemPackedIceHandler;\n\t\tcase E_BLOCK_PINK_GLAZED_TERRACOTTA:         return ItemPinkGlazedTerracottaHandler;\n\t\tcase E_BLOCK_PINK_SHULKER_BOX:               return ItemPinkShulkerBoxHandler;\n\t\tcase E_BLOCK_PISTON:                         return ItemPistonHandler;\n\t\tcase E_BLOCK_PISTON_EXTENSION:               return ItemPistonExtensionHandler;\n\t\tcase E_BLOCK_PISTON_MOVED_BLOCK:             return ItemPistonMovedBlockHandler;\n\t\tcase E_BLOCK_PLANKS:                         return ItemPlanksHandler;\n\t\tcase E_BLOCK_POTATOES:                       return ItemPotatoesBlockHandler;\n\t\tcase E_BLOCK_POWERED_RAIL:                   return ItemPoweredRailHandler;\n\t\tcase E_BLOCK_PRISMARINE_BLOCK:               return ItemPrismarineBlockHandler;\n\t\tcase E_BLOCK_PUMPKIN:                        return ItemPumpkinHandler;\n\t\tcase E_BLOCK_PUMPKIN_STEM:                   return ItemPumpkinStemHandler;\n\t\tcase E_BLOCK_PURPLE_GLAZED_TERRACOTTA:       return ItemPurpleGlazedTerracottaHandler;\n\t\tcase E_BLOCK_PURPLE_SHULKER_BOX:             return ItemPurpleShulkerBoxHandler;\n\t\tcase E_BLOCK_PURPUR_BLOCK:                   return ItemPurpurBlockHandler;\n\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:             return ItemPurpurDoubleSlabHandler;\n\t\tcase E_BLOCK_PURPUR_PILLAR:                  return ItemPurpurPillarHandler;\n\t\tcase E_BLOCK_PURPUR_SLAB:                    return ItemPurpurSlabHandler;\n\t\tcase E_BLOCK_PURPUR_STAIRS:                  return ItemPurpurStairsHandler;\n\t\tcase E_BLOCK_QUARTZ_BLOCK:                   return ItemQuartzBlockHandler;\n\t\tcase E_BLOCK_QUARTZ_STAIRS:                  return ItemQuartzStairsHandler;\n\t\tcase E_BLOCK_RAIL:                           return ItemRailHandler;\n\t\tcase E_BLOCK_REDSTONE_LAMP_OFF:              return ItemRedstoneLampOffHandler;\n\t\tcase E_BLOCK_REDSTONE_LAMP_ON:               return ItemRedstoneLampOnHandler;\n\t\tcase E_BLOCK_REDSTONE_ORE:                   return ItemRedstoneOreHandler;\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:           return ItemRedstoneOreGlowingHandler;\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:          return ItemRedstoneRepeaterOffHandler;\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:           return ItemRedstoneRepeaterOnHandler;\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:             return ItemRedstoneTorchOffBlockHandler;\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:              return ItemRedstoneTorchHandler;\n\t\tcase E_BLOCK_REDSTONE_WIRE:                  return ItemRedstoneWireHandler;\n\t\tcase E_BLOCK_RED_GLAZED_TERRACOTTA:          return ItemRedGlazedTerracottaHandler;\n\t\tcase E_BLOCK_RED_MUSHROOM:                   return ItemRedMushroomBlockHandler;\n\t\tcase E_BLOCK_RED_NETHER_BRICK:               return ItemRedNetherBricksHandler;\n\t\tcase E_BLOCK_RED_SANDSTONE:                  return ItemRedSandstoneHandler;\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:             return ItemRedSandstoneSlabHandler;\n\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:           return ItemRedSandstoneStairsHandler;\n\t\tcase E_BLOCK_RED_SHULKER_BOX:                return ItemRedShulkerBoxHandler;\n\t\tcase E_BLOCK_REPEATING_COMMAND_BLOCK:        return ItemRepeatingCommandBlockHandler;\n\t\tcase E_BLOCK_SAND:                           return ItemSandHandler;\n\t\tcase E_BLOCK_SANDSTONE:                      return ItemSandstoneHandler;\n\t\tcase E_BLOCK_SANDSTONE_STAIRS:               return ItemSandstoneStairsHandler;\n\t\tcase E_BLOCK_SAPLING:                        return ItemSaplingHandler;\n\t\tcase E_BLOCK_SEA_LANTERN:                    return ItemSeaLanternHandler;\n\t\tcase E_BLOCK_SIGN_POST:                      return ItemSignPostHandler;\n\t\tcase E_BLOCK_SILVERFISH_EGG:                 return ItemSilverfishEggBlockHandler;\n\t\tcase E_BLOCK_SLIME_BLOCK:                    return ItemSlimeBlockHandler;\n\t\tcase E_BLOCK_SNOW:                           return ItemSnowHandler;\n\t\tcase E_BLOCK_SNOW_BLOCK:                     return ItemSnowBlockHandler;\n\t\tcase E_BLOCK_SOULSAND:                       return ItemSoulsandHandler;\n\t\tcase E_BLOCK_SPONGE:                         return ItemSpongeHandler;\n\t\tcase E_BLOCK_SPRUCE_DOOR:                    return ItemSpruceDoorBlockHandler;\n\t\tcase E_BLOCK_SPRUCE_FENCE:                   return ItemSpruceFenceHandler;\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:              return ItemSpruceFenceGateHandler;\n\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS:             return ItemSpruceStairsHandler;\n\t\tcase E_BLOCK_STAINED_GLASS:                  return ItemStainedGlassHandler;\n\t\tcase E_BLOCK_STAINED_GLASS_PANE:             return ItemStainedGlassPaneHandler;\n\t\tcase E_BLOCK_STANDING_BANNER:                return ItemStandingBannerHandler;\n\t\tcase E_BLOCK_STATIONARY_LAVA :               return ItemStationaryLavaHandler;\n\t\tcase E_BLOCK_STATIONARY_WATER:               return ItemStationaryWaterHandler;\n\t\tcase E_BLOCK_STICKY_PISTON:                  return ItemStickyPistonHandler;\n\t\tcase E_BLOCK_STONE:                          return ItemStoneHandler;\n\t\tcase E_BLOCK_STONE_BRICKS:                   return ItemStoneBricksHandler;\n\t\tcase E_BLOCK_STONE_BRICK_STAIRS:             return ItemStoneBrickStairsHandler;\n\t\tcase E_BLOCK_STONE_BUTTON:                   return ItemStoneButtonHandler;\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:           return ItemStonePressurePlateHandler;\n\t\tcase E_BLOCK_STONE_SLAB:                     return ItemStoneSlabHandler;\n\t\tcase E_BLOCK_STRUCTURE_BLOCK:                return ItemStructureBlockHandler;\n\t\tcase E_BLOCK_STRUCTURE_VOID:                 return ItemStructureVoidHandler;\n\t\tcase E_BLOCK_SUGARCANE:                      return ItemSugarCaneBlockHandler;\n\t\tcase E_BLOCK_TALL_GRASS:                     return ItemTallGrassHandler;\n\t\tcase E_BLOCK_TERRACOTTA:                     return ItemTerracottaHandler;\n\t\tcase E_BLOCK_TNT:                            return ItemTNTHandler;\n\t\tcase E_BLOCK_TORCH:                          return ItemTorchHandler;\n\t\tcase E_BLOCK_TRAPDOOR:                       return ItemOakTrapdoorHandler;\n\t\tcase E_BLOCK_TRAPPED_CHEST:                  return ItemTrappedChestHandler;\n\t\tcase E_BLOCK_TRIPWIRE:                       return ItemTripwireHandler;\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:                  return ItemTripwireHookHandler;\n\t\tcase E_BLOCK_VINES:                          return ItemVinesHandler;\n\t\tcase E_BLOCK_WALLSIGN:                       return ItemWallsignHandler;\n\t\tcase E_BLOCK_WALL_BANNER:                    return ItemWallBannerHandler;\n\t\tcase E_BLOCK_WATER:                          return ItemWaterHandler;\n\t\tcase E_BLOCK_WHEAT:                          return ItemWheatBlockHandler;\n\t\tcase E_BLOCK_WHITE_GLAZED_TERRACOTTA:        return ItemWhiteGlazedTerracottaHandler;\n\t\tcase E_BLOCK_WHITE_SHULKER_BOX:              return ItemWhiteShulkerBoxHandler;\n\t\tcase E_BLOCK_WOODEN_BUTTON:                  return ItemOakButtonHandler;\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:          return ItemWoodenPressurePlateHandler;\n\t\tcase E_BLOCK_WOODEN_SLAB:                    return ItemOakSlabHandler;\n\t\tcase E_BLOCK_WOOL:                           return ItemWoolHandler;\n\t\tcase E_BLOCK_YELLOW_GLAZED_TERRACOTTA:       return ItemYellowGlazedTerracottaHandler;\n\t\tcase E_BLOCK_YELLOW_SHULKER_BOX:             return ItemYellowShulkerBoxHandler;\n\t\tcase E_ITEM_11_DISC:                         return Item11DiscHandler;\n\t\tcase E_ITEM_13_DISC:                         return Item13DiscHandler;\n\t\tcase E_ITEM_ACACIA_BOAT:                     return ItemAcaciaBoatHandler;\n\t\tcase E_ITEM_ACACIA_DOOR:                     return ItemAcaciaDoorHandler;\n\t\tcase E_ITEM_ARMOR_STAND:                     return ItemArmorStandHandler;\n\t\tcase E_ITEM_ARROW:                           return ItemArrowHandler;\n\t\tcase E_ITEM_BAKED_POTATO:                    return ItemBakedPotatoHandler;\n\t\tcase E_ITEM_BANNER:                          return ItemBannerHandler;\n\t\tcase E_ITEM_BED:                             return ItemBedHandler;\n\t\tcase E_ITEM_BEETROOT:                        return ItemBeetrootHandler;\n\t\tcase E_ITEM_BEETROOT_SEEDS:                  return ItemBeetrootSeedsHandler;\n\t\tcase E_ITEM_BEETROOT_SOUP:                   return ItemBeetrootSoupHandler;\n\t\tcase E_ITEM_BIRCH_BOAT:                      return ItemBirchBoatHandler;\n\t\tcase E_ITEM_BIRCH_DOOR:                      return ItemBirchDoorHandler;\n\t\tcase E_ITEM_BLAZE_POWDER:                    return ItemBlazePowderHandler;\n\t\tcase E_ITEM_BLAZE_ROD:                       return ItemBlazeRodHandler;\n\t\tcase E_ITEM_BLOCKS_DISC:                     return ItemBlocksDiscHandler;\n\t\tcase E_ITEM_BOAT:                            return ItemOakBoatHandler;\n\t\tcase E_ITEM_BONE:                            return ItemBoneHandler;\n\t\tcase E_ITEM_BOOK:                            return ItemBookHandler;\n\t\tcase E_ITEM_BOOK_AND_QUILL:                  return ItemBookAndQuillHandler;\n\t\tcase E_ITEM_BOTTLE_O_ENCHANTING:             return ItemBottleOEnchantingHandler;\n\t\tcase E_ITEM_BOW:                             return ItemBowHandler;\n\t\tcase E_ITEM_BOWL:                            return ItemBowlHandler;\n\t\tcase E_ITEM_BREAD:                           return ItemBreadHandler;\n\t\tcase E_ITEM_BREWING_STAND:                   return ItemBrewingStandHandler;\n\t\tcase E_ITEM_BUCKET:                          return ItemBucketHandler;\n\t\tcase E_ITEM_CAKE:                            return ItemCakeHandler;\n\t\tcase E_ITEM_CARROT:                          return ItemCarrotHandler;\n\t\tcase E_ITEM_CARROT_ON_STICK:                 return ItemCarrotOnStickHandler;\n\t\tcase E_ITEM_CAT_DISC:                        return ItemCatDiscHandler;\n\t\tcase E_ITEM_CAULDRON:                        return ItemCauldronHandler;\n\t\tcase E_ITEM_CHAIN_BOOTS:                     return ItemChainBootsHandler;\n\t\tcase E_ITEM_CHAIN_CHESTPLATE:                return ItemChainChestplateHandler;\n\t\tcase E_ITEM_CHAIN_HELMET:                    return ItemChainHelmetHandler;\n\t\tcase E_ITEM_CHAIN_LEGGINGS:                  return ItemChainLeggingsHandler;\n\t\tcase E_ITEM_CHEST_MINECART:                  return ItemChestMinecartHandler;\n\t\tcase E_ITEM_CHIRP_DISC:                      return ItemChirpDiscHandler;\n\t\tcase E_ITEM_CHORUS_FRUIT:                    return ItemChorusFruitHandler;\n\t\tcase E_ITEM_CLAY:                            return ItemClayHandler;\n\t\tcase E_ITEM_CLAY_BRICK:                      return ItemBricksHandler;\n\t\tcase E_ITEM_CLOCK:                           return ItemClockHandler;\n\t\tcase E_ITEM_COAL:                            return ItemCoalHandler;\n\t\tcase E_ITEM_COMPARATOR:                      return ItemComparatorHandler;\n\t\tcase E_ITEM_COMPASS:                         return ItemCompassHandler;\n\t\tcase E_ITEM_COOKED_CHICKEN:                  return ItemCookedChickenHandler;\n\t\tcase E_ITEM_COOKED_FISH:                     return ItemCookedFishHandler;\n\t\tcase E_ITEM_COOKED_MUTTON:                   return ItemCookedMuttonHandler;\n\t\tcase E_ITEM_COOKED_PORKCHOP:                 return ItemCookedPorkchopHandler;\n\t\tcase E_ITEM_COOKED_RABBIT:                   return ItemCookedRabbitHandler;\n\t\tcase E_ITEM_COOKIE:                          return ItemCookieHandler;\n\t\tcase E_ITEM_DARK_OAK_BOAT:                   return ItemDarkOakBoatHandler;\n\t\tcase E_ITEM_DARK_OAK_DOOR:                   return ItemDarkOakDoorHandler;\n\t\tcase E_ITEM_DIAMOND:                         return ItemDiamondHandler;\n\t\tcase E_ITEM_DIAMOND_AXE:                     return ItemDiamondAxeHandler;\n\t\tcase E_ITEM_DIAMOND_BOOTS:                   return ItemDiamondBootsHandler;\n\t\tcase E_ITEM_DIAMOND_CHESTPLATE:              return ItemDiamondChestplateHandler;\n\t\tcase E_ITEM_DIAMOND_HELMET:                  return ItemDiamondHelmetHandler;\n\t\tcase E_ITEM_DIAMOND_HOE:                     return ItemDiamondHoeHandler;\n\t\tcase E_ITEM_DIAMOND_HORSE_ARMOR:             return ItemDiamondHorseArmorHandler;\n\t\tcase E_ITEM_DIAMOND_LEGGINGS:                return ItemDiamondLeggingsHandler;\n\t\tcase E_ITEM_DIAMOND_PICKAXE:                 return ItemDiamondPickaxeHandler;\n\t\tcase E_ITEM_DIAMOND_SHOVEL:                  return ItemDiamondShovelHandler;\n\t\tcase E_ITEM_DIAMOND_SWORD:                   return ItemDiamondSwordHandler;\n\t\tcase E_ITEM_DRAGON_BREATH:                   return ItemDragonBreathHandler;\n\t\tcase E_ITEM_DYE:                             return ItemDyeHandler;\n\t\tcase E_ITEM_EGG:                             return ItemEggHandler;\n\t\tcase E_ITEM_ELYTRA:                          return ItemElytraHandler;\n\t\tcase E_ITEM_EMERALD:                         return ItemEmeraldHandler;\n\t\tcase E_ITEM_EMPTY_MAP:                       return ItemEmptyMapHandler;\n\t\tcase E_ITEM_ENCHANTED_BOOK:                  return ItemEnchantedBookHandler;\n\t\tcase E_ITEM_ENDER_PEARL:                     return ItemEnderPearlHandler;\n\t\tcase E_ITEM_END_CRYSTAL:                     return ItemEndCrystalHandler;\n\t\tcase E_ITEM_EYE_OF_ENDER:                    return ItemEyeOfEnderHandler;\n\t\tcase E_ITEM_FAR_DISC:                        return ItemFarDiscHandler;\n\t\tcase E_ITEM_FEATHER:                         return ItemFeatherHandler;\n\t\tcase E_ITEM_FERMENTED_SPIDER_EYE:            return ItemFermentedSpiderEyeHandler;\n\t\tcase E_ITEM_FIREWORK_ROCKET:                 return ItemFireworkRocketHandler;\n\t\tcase E_ITEM_FIREWORK_STAR:                   return ItemFireworkStarHandler;\n\t\tcase E_ITEM_FIRE_CHARGE:                     return ItemFireChargeHandler;\n\t\tcase E_ITEM_FISHING_ROD:                     return ItemFishingRodHandler;\n\t\tcase E_ITEM_FLINT:                           return ItemFlintHandler;\n\t\tcase E_ITEM_FLINT_AND_STEEL:                 return ItemFlintAndSteelHandler;\n\t\tcase E_ITEM_FLOWER_POT:                      return ItemFlowerPotHandler;\n\t\tcase E_ITEM_FURNACE_MINECART:                return ItemFurnaceMinecartHandler;\n\t\tcase E_ITEM_GHAST_TEAR:                      return ItemGhastTearHandler;\n\t\tcase E_ITEM_GLASS_BOTTLE:                    return ItemGlassBottleHandler;\n\t\tcase E_ITEM_GLISTERING_MELON:                return ItemGlisteringMelonHandler;\n\t\tcase E_ITEM_GLOWSTONE_DUST:                  return ItemGlowstoneDustHandler;\n\t\tcase E_ITEM_GOLD:                            return ItemGoldHandler;\n\t\tcase E_ITEM_GOLDEN_APPLE:                    return ItemGoldenAppleHandler;\n\t\tcase E_ITEM_GOLDEN_CARROT:                   return ItemGoldenCarrotHandler;\n\t\tcase E_ITEM_GOLD_AXE:                        return ItemGoldenAxeHandler;\n\t\tcase E_ITEM_GOLD_BOOTS:                      return ItemGoldenBootsHandler;\n\t\tcase E_ITEM_GOLD_CHESTPLATE:                 return ItemGoldenChestplateHandler;\n\t\tcase E_ITEM_GOLD_HELMET:                     return ItemGoldenHelmetHandler;\n\t\tcase E_ITEM_GOLD_HOE:                        return ItemGoldenHoeHandler;\n\t\tcase E_ITEM_GOLD_HORSE_ARMOR:                return ItemGoldenHorseArmorHandler;\n\t\tcase E_ITEM_GOLD_LEGGINGS:                   return ItemGoldenLeggingsHandler;\n\t\tcase E_ITEM_GOLD_NUGGET:                     return ItemGoldNuggetHandler;\n\t\tcase E_ITEM_GOLD_PICKAXE:                    return ItemGoldenPickaxeHandler;\n\t\tcase E_ITEM_GOLD_SHOVEL:                     return ItemGoldenShovelHandler;\n\t\tcase E_ITEM_GOLD_SWORD:                      return ItemGoldenSwordHandler;\n\t\tcase E_ITEM_GUNPOWDER:                       return ItemGunpowderHandler;\n\t\tcase E_ITEM_HEAD:                            return ItemHeadHandler;\n\t\tcase E_ITEM_IRON:                            return ItemIronHandler;\n\t\tcase E_ITEM_IRON_AXE:                        return ItemIronAxeHandler;\n\t\tcase E_ITEM_IRON_BOOTS:                      return ItemIronBootsHandler;\n\t\tcase E_ITEM_IRON_CHESTPLATE:                 return ItemIronChestplateHandler;\n\t\tcase E_ITEM_IRON_DOOR:                       return ItemIronDoorHandler;\n\t\tcase E_ITEM_IRON_HELMET:                     return ItemIronHelmetHandler;\n\t\tcase E_ITEM_IRON_HOE:                        return ItemIronHoeHandler;\n\t\tcase E_ITEM_IRON_HORSE_ARMOR:                return ItemIronHorseArmorHandler;\n\t\tcase E_ITEM_IRON_LEGGINGS:                   return ItemIronLeggingsHandler;\n\t\tcase E_ITEM_IRON_NUGGET:                     return ItemIronNuggetHandler;\n\t\tcase E_ITEM_IRON_PICKAXE:                    return ItemIronPickaxeHandler;\n\t\tcase E_ITEM_IRON_SHOVEL:                     return ItemIronShovelHandler;\n\t\tcase E_ITEM_IRON_SWORD:                      return ItemIronSwordHandler;\n\t\tcase E_ITEM_ITEM_FRAME:                      return ItemItemFrameHandler;\n\t\tcase E_ITEM_JUNGLE_BOAT:                     return ItemJungleBoatHandler;\n\t\tcase E_ITEM_JUNGLE_DOOR:                     return ItemJungleDoorHandler;\n\t\tcase E_ITEM_LAVA_BUCKET:                     return ItemLavaBucketHandler;\n\t\tcase E_ITEM_LEASH:                           return ItemLeashHandler;\n\t\tcase E_ITEM_LEATHER:                         return ItemLeatherHandler;\n\t\tcase E_ITEM_LEATHER_BOOTS:                   return ItemLeatherBootsHandler;\n\t\tcase E_ITEM_LEATHER_CAP:                     return ItemLeatherCapHandler;\n\t\tcase E_ITEM_LEATHER_PANTS:                   return ItemLeatherPantsHandler;\n\t\tcase E_ITEM_LEATHER_TUNIC:                   return ItemLeatherTunicHandler;\n\t\tcase E_ITEM_LINGERING_POTION:                return ItemLingeringPotionHandler;\n\t\tcase E_ITEM_MAGMA_CREAM:                     return ItemMagmaCreamHandler;\n\t\tcase E_ITEM_MALL_DISC:                       return ItemMallDiscHandler;\n\t\tcase E_ITEM_MAP:                             return ItemMapHandler;\n\t\tcase E_ITEM_MELLOHI_DISC:                    return ItemMellohiDiscHandler;\n\t\tcase E_ITEM_MELON_SEEDS:                     return ItemMelonSeedsHandler;\n\t\tcase E_ITEM_MELON_SLICE:                     return ItemMelonSliceHandler;\n\t\tcase E_ITEM_MILK:                            return ItemMilkHandler;\n\t\tcase E_ITEM_MINECART:                        return ItemMinecartHandler;\n\t\tcase E_ITEM_MINECART_WITH_COMMAND_BLOCK:     return ItemMinecartWithCommandBlockHandler;\n\t\tcase E_ITEM_MINECART_WITH_HOPPER:            return ItemMinecartWithHopperHandler;\n\t\tcase E_ITEM_MINECART_WITH_TNT:               return ItemMinecartWithTNTHandler;\n\t\tcase E_ITEM_MUSHROOM_SOUP:                   return ItemMushroomSoupHandler;\n\t\tcase E_ITEM_NAME_TAG:                        return ItemNameTagHandler;\n\t\tcase E_ITEM_NETHER_BRICK:                    return ItemNetherBrickHandler;\n\t\tcase E_ITEM_NETHER_QUARTZ:                   return ItemNetherQuartzHandler;\n\t\tcase E_ITEM_NETHER_STAR:                     return ItemNetherStarHandler;\n\t\tcase E_ITEM_NETHER_WART:                     return ItemNetherWartHandler;\n\t\tcase E_ITEM_PAINTING:                        return ItemPaintingHandler;\n\t\tcase E_ITEM_PAPER:                           return ItemPaperHandler;\n\t\tcase E_ITEM_POISONOUS_POTATO:                return ItemPoisonousPotatoHandler;\n\t\tcase E_ITEM_POPPED_CHORUS_FRUIT:             return ItemPoppedChorusFruitHandler;\n\t\tcase E_ITEM_POTATO:                          return ItemPotatoHandler;\n\t\tcase E_ITEM_POTION:                          return ItemPotionHandler;\n\t\tcase E_ITEM_PRISMARINE_CRYSTALS:             return ItemPrismarineCrystalsHandler;\n\t\tcase E_ITEM_PRISMARINE_SHARD:                return ItemPrismarineShardHandler;\n\t\tcase E_ITEM_PUMPKIN_PIE:                     return ItemPumpkinPieHandler;\n\t\tcase E_ITEM_PUMPKIN_SEEDS:                   return ItemPumpkinSeedsHandler;\n\t\tcase E_ITEM_RABBITS_FOOT:                    return ItemRabbitsFootHandler;\n\t\tcase E_ITEM_RABBIT_HIDE:                     return ItemRabbitHideHandler;\n\t\tcase E_ITEM_RABBIT_STEW:                     return ItemRabbitStewHandler;\n\t\tcase E_ITEM_RAW_BEEF:                        return ItemRawBeefHandler;\n\t\tcase E_ITEM_RAW_CHICKEN:                     return ItemRawChickenHandler;\n\t\tcase E_ITEM_RAW_FISH:                        return ItemRawFishHandler;\n\t\tcase E_ITEM_RAW_MUTTON:                      return ItemRawMuttonHandler;\n\t\tcase E_ITEM_RAW_PORKCHOP:                    return ItemRawPorkchopHandler;\n\t\tcase E_ITEM_RAW_RABBIT:                      return ItemRawRabbitHandler;\n\t\tcase E_ITEM_REDSTONE_DUST:                   return ItemRedstoneDustHandler;\n\t\tcase E_ITEM_REDSTONE_REPEATER:               return ItemRedstoneRepeaterHandler;\n\t\tcase E_ITEM_RED_APPLE:                       return ItemAppleHandler;\n\t\tcase E_ITEM_ROTTEN_FLESH:                    return ItemRottenFleshHandler;\n\t\tcase E_ITEM_SADDLE:                          return ItemSaddleHandler;\n\t\tcase E_ITEM_SEEDS:                           return ItemSeedsHandler;\n\t\tcase E_ITEM_SHEARS:                          return ItemShearsHandler;\n\t\tcase E_ITEM_SHIELD:                          return ItemShieldHandler;\n\t\tcase E_ITEM_SHULKER_SHELL:                   return ItemShulkerShellHandler;\n\t\tcase E_ITEM_SIGN:                            return ItemSignHandler;\n\t\tcase E_ITEM_SLIMEBALL:                       return ItemSlimeballHandler;\n\t\tcase E_ITEM_SNOWBALL:                        return ItemSnowballHandler;\n\t\tcase E_ITEM_SPAWN_EGG:                       return ItemSpawnEggHandler;\n\t\tcase E_ITEM_SPECTRAL_ARROW:                  return ItemSpectralArrowHandler;\n\t\tcase E_ITEM_SPIDER_EYE:                      return ItemSpiderEyeHandler;\n\t\tcase E_ITEM_SPLASH_POTION:                   return ItemSplashPotionHandler;\n\t\tcase E_ITEM_SPRUCE_BOAT:                     return ItemSpruceBoatHandler;\n\t\tcase E_ITEM_SPRUCE_DOOR:                     return ItemSpruceDoorHandler;\n\t\tcase E_ITEM_STAL_DISC:                       return ItemStalDiscHandler;\n\t\tcase E_ITEM_STEAK:                           return ItemCookedBeefHandler;\n\t\tcase E_ITEM_STICK:                           return ItemStickHandler;\n\t\tcase E_ITEM_STONE_AXE:                       return ItemStoneAxeHandler;\n\t\tcase E_ITEM_STONE_HOE:                       return ItemStoneHoeHandler;\n\t\tcase E_ITEM_STONE_PICKAXE:                   return ItemStonePickaxeHandler;\n\t\tcase E_ITEM_STONE_SHOVEL:                    return ItemStoneShovelHandler;\n\t\tcase E_ITEM_STONE_SWORD:                     return ItemStoneSwordHandler;\n\t\tcase E_ITEM_STRAD_DISC:                      return ItemStradDiscHandler;\n\t\tcase E_ITEM_STRING:                          return ItemStringHandler;\n\t\tcase E_ITEM_SUGAR:                           return ItemSugarHandler;\n\t\tcase E_ITEM_SUGAR_CANE:                      return ItemSugarCaneHandler;\n\t\tcase E_ITEM_TIPPED_ARROW:                    return ItemTippedArrowHandler;\n\t\tcase E_ITEM_TOTEM_OF_UNDYING:                return ItemTotemOfUndyingHandler;\n\t\tcase E_ITEM_WAIT_DISC:                       return ItemWaitDiscHandler;\n\t\tcase E_ITEM_WARD_DISC:                       return ItemWardDiscHandler;\n\t\tcase E_ITEM_WATER_BUCKET:                    return ItemWaterBucketHandler;\n\t\tcase E_ITEM_WHEAT:                           return ItemWheatHandler;\n\t\tcase E_ITEM_WOODEN_AXE:                      return ItemWoodenAxeHandler;\n\t\tcase E_ITEM_WOODEN_DOOR:                     return ItemOakDoorHandler;\n\t\tcase E_ITEM_WOODEN_HOE:                      return ItemWoodenHoeHandler;\n\t\tcase E_ITEM_WOODEN_PICKAXE:                  return ItemWoodenPickaxeHandler;\n\t\tcase E_ITEM_WOODEN_SHOVEL:                   return ItemWoodenShovelHandler;\n\t\tcase E_ITEM_WOODEN_SWORD:                    return ItemWoodenSwordHandler;\n\t\tcase E_ITEM_WRITTEN_BOOK:                    return ItemWrittenBookHandler;\n\n\t}\n\tASSERT(\"Unknown item type!\");\n\treturn ItemAirHandler;\n}\n\n\n\n\n\nvoid cItemHandler::OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_ClickedPosition, const BLOCKTYPE a_ClickedBlockType, const NIBBLETYPE a_ClickedBlockMeta, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const\n{\n\tconst auto & World = *a_Player.GetWorld();\n\n\t// Check if the block ignores build collision (water, grass etc.):\n\tif (cBlockHandler::For(a_ClickedBlockType).DoesIgnoreBuildCollision(World, a_HeldItem, a_ClickedPosition, a_ClickedBlockMeta, a_ClickedBlockFace, true))\n\t{\n\t\t// Try to place the block at the clicked position:\n\t\tif (!CommitPlacement(a_Player, a_HeldItem, a_ClickedPosition, a_ClickedBlockFace, a_CursorPosition))\n\t\t{\n\t\t\t// The placement failed, the blocks have already been re-sent, re-send inventory:\n\t\t\ta_Player.GetInventory().SendEquippedSlot();\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\t\tBLOCKTYPE PlaceBlock;\n\t\tNIBBLETYPE PlaceMeta;\n\t\tconst auto PlacePosition = AddFaceDirection(a_ClickedPosition, a_ClickedBlockFace);\n\n\t\tif (!cChunkDef::IsValidHeight(PlacePosition) || !World.GetBlockTypeMeta(PlacePosition, PlaceBlock, PlaceMeta))\n\t\t{\n\t\t\t// The block is being placed outside the world, ignore this packet altogether (GH #128):\n\t\t\treturn;\n\t\t}\n\n\t\t// Clicked on side of block, make sure that placement won't be cancelled if there is a slab able to be double slabbed.\n\t\t// No need to do combinability (dblslab) checks, client will do that here.\n\t\tif (!cBlockHandler::For(PlaceBlock).DoesIgnoreBuildCollision(World, a_HeldItem, PlacePosition, PlaceMeta, a_ClickedBlockFace, false))\n\t\t{\n\t\t\t// Tried to place a block into another?\n\t\t\t// Happens when you place a block aiming at side of block with a torch on it or stem beside it.\n\t\t\ta_Player.SendBlocksAround(PlacePosition, 2);\n\t\t\ta_Player.GetInventory().SendEquippedSlot();\n\t\t\treturn;\n\t\t}\n\n\t\t// Try to place the block:\n\t\tif (!CommitPlacement(a_Player, a_HeldItem, PlacePosition, a_ClickedBlockFace, a_CursorPosition))\n\t\t{\n\t\t\t// The placement failed, the blocks have already been re-sent, re-send inventory:\n\t\t\ta_Player.GetInventory().SendEquippedSlot();\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Remove the \"placed\" item:\n\tif (a_Player.IsGameModeSurvival())\n\t{\n\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t}\n}\n\n\n\n\n\nbool cItemHandler::OnItemUse(\n\tcWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,\n\tconst Vector3i a_ClickedBlockPos, eBlockFace a_ClickedBlockFace\n) const\n{\n\tUNUSED(a_World);\n\tUNUSED(a_Player);\n\tUNUSED(a_PluginInterface);\n\tUNUSED(a_Item);\n\tUNUSED(a_ClickedBlockPos);\n\tUNUSED(a_ClickedBlockFace);\n\n\treturn false;\n}\n\n\n\n\n\nbool cItemHandler::OnDiggingBlock(\n\tcWorld * a_World,\n\tcPlayer * a_Player,\n\tconst cItem & a_HeldItem,\n\tconst Vector3i a_ClickedBlockPos,\n\teBlockFace a_ClickedBlockFace\n) const\n{\n\tUNUSED(a_World);\n\tUNUSED(a_Player);\n\tUNUSED(a_HeldItem);\n\tUNUSED(a_ClickedBlockPos);\n\tUNUSED(a_ClickedBlockFace);\n\n\treturn false;\n}\n\n\n\n\n\nvoid cItemHandler::OnEntityAttack(cPlayer * a_Attacker, cEntity * a_AttackedEntity) const\n{\n\tUNUSED(a_AttackedEntity);\n\ta_Attacker->UseEquippedItem(dlaAttackEntity);\n}\n\n\n\n\n\nvoid cItemHandler::OnFoodEaten(cWorld * a_World, cPlayer * a_Player, cItem * a_Item) const\n{\n\tUNUSED(a_World);\n\tUNUSED(a_Player);\n\tUNUSED(a_Item);\n}\n\n\n\n\n\nshort cItemHandler::GetDurabilityLossByAction(eDurabilityLostAction a_Action) const\n{\n\tUNUSED(a_Action);\n\n\treturn 0;\n}\n\n\n\n\n\nchar cItemHandler::GetMaxStackSize(void) const\n{\n\tif (m_ItemType < 256)\n\t{\n\t\t// All blocks can stack up to 64\n\t\treturn 64;\n\t}\n\n\tswitch (m_ItemType)\n\t{\n\t\tcase E_ITEM_ACACIA_DOOR:          return 64;\n\t\tcase E_ITEM_ARMOR_STAND:          return 16;\n\t\tcase E_ITEM_ARROW:                return 64;\n\t\tcase E_ITEM_BAKED_POTATO:         return 64;\n\t\tcase E_ITEM_BANNER:               return 16;\n\t\tcase E_ITEM_BEETROOT:             return 64;\n\t\tcase E_ITEM_BEETROOT_SEEDS:       return 64;\n\t\tcase E_ITEM_BIRCH_DOOR:           return 64;\n\t\tcase E_ITEM_BLAZE_POWDER:         return 64;\n\t\tcase E_ITEM_BLAZE_ROD:            return 64;\n\t\tcase E_ITEM_BONE:                 return 64;\n\t\tcase E_ITEM_BOOK:                 return 64;\n\t\tcase E_ITEM_BOTTLE_O_ENCHANTING:  return 64;\n\t\tcase E_ITEM_BOWL:                 return 64;\n\t\tcase E_ITEM_BREAD:                return 64;\n\t\tcase E_ITEM_BREWING_STAND:        return 64;\n\t\tcase E_ITEM_BUCKET:               return 16;\n\t\tcase E_ITEM_CARROT:               return 64;\n\t\tcase E_ITEM_CAULDRON:             return 64;\n\t\tcase E_ITEM_CHORUS_FRUIT:         return 64;\n\t\tcase E_ITEM_CLAY:                 return 64;\n\t\tcase E_ITEM_CLAY_BRICK:           return 64;\n\t\tcase E_ITEM_CLOCK:                return 64;\n\t\tcase E_ITEM_COAL:                 return 64;\n\t\tcase E_ITEM_COMPARATOR:           return 64;\n\t\tcase E_ITEM_COMPASS:              return 64;\n\t\tcase E_ITEM_COOKED_CHICKEN:       return 64;\n\t\tcase E_ITEM_COOKED_FISH:          return 64;\n\t\tcase E_ITEM_COOKED_MUTTON:        return 64;\n\t\tcase E_ITEM_COOKED_PORKCHOP:      return 64;\n\t\tcase E_ITEM_COOKED_RABBIT:        return 64;\n\t\tcase E_ITEM_COOKIE:               return 64;\n\t\tcase E_ITEM_DARK_OAK_DOOR:        return 64;\n\t\tcase E_ITEM_DIAMOND:              return 64;\n\t\tcase E_ITEM_DRAGON_BREATH:        return 64;\n\t\tcase E_ITEM_DYE:                  return 64;\n\t\tcase E_ITEM_EGG:                  return 16;\n\t\tcase E_ITEM_EMERALD:              return 64;\n\t\tcase E_ITEM_EMPTY_MAP:            return 64;\n\t\tcase E_ITEM_ENDER_PEARL:          return 16;\n\t\tcase E_ITEM_EYE_OF_ENDER:         return 64;\n\t\tcase E_ITEM_FEATHER:              return 64;\n\t\tcase E_ITEM_FERMENTED_SPIDER_EYE: return 64;\n\t\tcase E_ITEM_FIRE_CHARGE:          return 64;\n\t\tcase E_ITEM_FIREWORK_ROCKET:      return 64;\n\t\tcase E_ITEM_FIREWORK_STAR:        return 64;\n\t\tcase E_ITEM_FLINT:                return 64;\n\t\tcase E_ITEM_FLOWER_POT:           return 64;\n\t\tcase E_ITEM_GHAST_TEAR:           return 64;\n\t\tcase E_ITEM_GLASS_BOTTLE:         return 64;\n\t\tcase E_ITEM_GLISTERING_MELON:     return 64;\n\t\tcase E_ITEM_GLOWSTONE_DUST:       return 64;\n\t\tcase E_ITEM_GOLD:                 return 64;\n\t\tcase E_ITEM_GOLDEN_APPLE:         return 64;\n\t\tcase E_ITEM_GOLDEN_CARROT:        return 64;\n\t\tcase E_ITEM_GOLD_NUGGET:          return 64;\n\t\tcase E_ITEM_GUNPOWDER:            return 64;\n\t\tcase E_ITEM_HEAD:                 return 64;\n\t\tcase E_ITEM_JUNGLE_DOOR:          return 64;\n\t\tcase E_ITEM_IRON:                 return 64;\n\t\tcase E_ITEM_IRON_DOOR:            return 64;\n\t\tcase E_ITEM_IRON_NUGGET:          return 64;\n\t\tcase E_ITEM_ITEM_FRAME:           return 64;\n\t\tcase E_ITEM_LEAD:                 return 64;\n\t\tcase E_ITEM_LEATHER:              return 64;\n\t\tcase E_ITEM_MAGMA_CREAM:          return 64;\n\t\tcase E_ITEM_MAP:                  return 64;\n\t\tcase E_ITEM_MELON_SEEDS:          return 64;\n\t\tcase E_ITEM_MELON_SLICE:          return 64;\n\t\tcase E_ITEM_NETHER_BRICK:         return 64;\n\t\tcase E_ITEM_NETHER_QUARTZ:        return 64;\n\t\tcase E_ITEM_NETHER_WART:          return 64;\n\t\tcase E_ITEM_PAINTING:             return 64;\n\t\tcase E_ITEM_PAPER:                return 64;\n\t\tcase E_ITEM_POISONOUS_POTATO:     return 64;\n\t\tcase E_ITEM_POPPED_CHORUS_FRUIT:  return 64;\n\t\tcase E_ITEM_POTATO:               return 64;\n\t\tcase E_ITEM_PRISMARINE_CRYSTALS:  return 64;\n\t\tcase E_ITEM_PRISMARINE_SHARD:     return 64;\n\t\tcase E_ITEM_PUMPKIN_PIE:          return 64;\n\t\tcase E_ITEM_PUMPKIN_SEEDS:        return 64;\n\t\tcase E_ITEM_RABBITS_FOOT:         return 64;\n\t\tcase E_ITEM_RABBIT_HIDE:          return 64;\n\t\tcase E_ITEM_RAW_BEEF:             return 64;\n\t\tcase E_ITEM_RAW_CHICKEN:          return 64;\n\t\tcase E_ITEM_RAW_FISH:             return 64;\n\t\tcase E_ITEM_RAW_MUTTON:           return 64;\n\t\tcase E_ITEM_RAW_PORKCHOP:         return 64;\n\t\tcase E_ITEM_RAW_RABBIT:           return 64;\n\t\tcase E_ITEM_RED_APPLE:            return 64;\n\t\tcase E_ITEM_REDSTONE_DUST:        return 64;\n\t\tcase E_ITEM_REDSTONE_REPEATER:    return 64;\n\t\tcase E_ITEM_ROTTEN_FLESH:         return 64;\n\t\tcase E_ITEM_SEEDS:                return 64;\n\t\tcase E_ITEM_SIGN:                 return 16;\n\t\tcase E_ITEM_SLIMEBALL:            return 64;\n\t\tcase E_ITEM_SNOWBALL:             return 16;\n\t\tcase E_ITEM_SPAWN_EGG:            return 64;\n\t\tcase E_ITEM_SPECTRAL_ARROW:       return 64;\n\t\tcase E_ITEM_SPIDER_EYE:           return 64;\n\t\tcase E_ITEM_SPRUCE_DOOR:          return 64;\n\t\tcase E_ITEM_STEAK:                return 64;\n\t\tcase E_ITEM_STICK:                return 64;\n\t\tcase E_ITEM_STRING:               return 64;\n\t\tcase E_ITEM_SUGAR:                return 64;\n\t\tcase E_ITEM_SUGAR_CANE:           return 64;\n\t\tcase E_ITEM_TIPPED_ARROW:         return 64;\n\t\tcase E_ITEM_WHEAT:                return 64;\n\t\tcase E_ITEM_WOODEN_DOOR:          return 64;\n\t\t// By default items don't stack:\n\t\tdefault:                          return 1;\n\t}\n}\n\n\n\n\n\nbool cItemHandler::IsFood(void) const\n{\n\treturn false;\n}\n\n\n\n\n\nbool cItemHandler::IsDrinkable(short a_ItemDamage) const\n{\n\tUNUSED(a_ItemDamage);\n\n\treturn false;\n}\n\n\n\n\n\nbool cItemHandler::IsPlaceable(void) const\n{\n\t// We can place any block that has a corresponding E_BLOCK_TYPE:\n\treturn (m_ItemType >= 1) && (m_ItemType <= E_BLOCK_MAX_TYPE_ID);\n}\n\n\n\n\n\nbool cItemHandler::CanRepairWithRawMaterial(short a_ItemType) const\n{\n\tUNUSED(a_ItemType);\n\treturn false;\n}\n\n\n\n\n\nbool cItemHandler::CanHarvestBlock(BLOCKTYPE a_BlockType) const\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_ANVIL:\n\t\tcase E_BLOCK_BLACK_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_BLOCK_OF_COAL:\n\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:\n\t\tcase E_BLOCK_BLUE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_BONE_BLOCK:\n\t\tcase E_BLOCK_BREWING_STAND:\n\t\tcase E_BLOCK_BRICK:\n\t\tcase E_BLOCK_BRICK_STAIRS:\n\t\tcase E_BLOCK_BROWN_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_CAULDRON:\n\t\tcase E_BLOCK_COAL_ORE:\n\t\tcase E_BLOCK_COBBLESTONE:\n\t\tcase E_BLOCK_COBBLESTONE_STAIRS:\n\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_CONCRETE:\n\t\tcase E_BLOCK_CYAN_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_DIAMOND_BLOCK:\n\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_EMERALD_ORE:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_END_BRICKS:\n\t\tcase E_BLOCK_END_STONE:\n\t\tcase E_BLOCK_FURNACE:\n\t\tcase E_BLOCK_GOLD_BLOCK:\n\t\tcase E_BLOCK_GOLD_ORE:\n\t\tcase E_BLOCK_GRAY_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_GREEN_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_HARDENED_CLAY:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_HOPPER:\n\t\tcase E_BLOCK_IRON_BARS:\n\t\tcase E_BLOCK_IRON_BLOCK:\n\t\tcase E_BLOCK_IRON_DOOR:\n\t\tcase E_BLOCK_IRON_ORE:\n\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\tcase E_BLOCK_LAPIS_BLOCK:\n\t\tcase E_BLOCK_LAPIS_ORE:\n\t\tcase E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_LIME_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_LIT_FURNACE:\n\t\tcase E_BLOCK_MAGENTA_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_MAGMA:\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\tcase E_BLOCK_MOSSY_COBBLESTONE:\n\t\tcase E_BLOCK_NETHERRACK:\n\t\tcase E_BLOCK_NETHER_BRICK:\n\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:\n\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:\n\t\tcase E_BLOCK_OBSERVER:\n\t\tcase E_BLOCK_OBSIDIAN:\n\t\tcase E_BLOCK_ORANGE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_PINK_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_PRISMARINE_BLOCK:\n\t\tcase E_BLOCK_PURPLE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_PURPUR_BLOCK:\n\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:\n\t\tcase E_BLOCK_PURPUR_PILLAR:\n\t\tcase E_BLOCK_PURPUR_SLAB:\n\t\tcase E_BLOCK_PURPUR_STAIRS:\n\t\tcase E_BLOCK_QUARTZ_BLOCK:\n\t\tcase E_BLOCK_QUARTZ_STAIRS:\n\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\tcase E_BLOCK_RED_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_RED_NETHER_BRICK:\n\t\tcase E_BLOCK_RED_SANDSTONE:\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:\n\t\tcase E_BLOCK_SANDSTONE:\n\t\tcase E_BLOCK_SANDSTONE_STAIRS:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_STONE:\n\t\tcase E_BLOCK_STONE_BRICKS:\n\t\tcase E_BLOCK_STONE_BRICK_STAIRS:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_STONE_SLAB:\n\t\tcase E_BLOCK_VINES:\n\t\tcase E_BLOCK_WHITE_GLAZED_TERRACOTTA:\n\t\tcase E_BLOCK_YELLOW_GLAZED_TERRACOTTA:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tdefault: return true;\n\t}\n}\n\n\n\n\n\nbool cItemHandler::EatItem(cPlayer * a_Player, cItem * a_Item) const\n{\n\tauto FoodInfo = GetFoodInfo(a_Item);\n\treturn a_Player->Feed(FoodInfo.FoodLevel, FoodInfo.Saturation);\n}\n\n\n\n\n\ncItemHandler::FoodInfo cItemHandler::GetFoodInfo(const cItem * a_Item) const\n{\n\tUNUSED(a_Item);\n\treturn FoodInfo(0, 0);\n}\n\n\n\n\n\nfloat cItemHandler::GetBlockBreakingStrength(BLOCKTYPE a_Block) const\n{\n\treturn 1.0f;\n}\n\n\n\n\n\nbool cItemHandler::CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const\n{\n\tASSERT(m_ItemType < 256);  // Items with IDs above 255 should all be handled by specific handlers.\n\n\t// By default, all blocks can be placed and the meta is copied over from the item's damage value:\n\treturn a_Player.PlaceBlock(\n\t\ta_PlacePosition,\n\t\tstatic_cast<BLOCKTYPE>(m_ItemType),\n\t\tstatic_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage & 0x0f)\n\t);\n}\n"
  },
  {
    "path": "src/Items/ItemHandler.h",
    "content": "\n#pragma once\n\n#include \"../Defines.h\"\n#include \"../Item.h\"\n\n\n\n\n\n// fwd:\nclass cChunk;\nclass cWorld;\nclass cPlayer;\nclass cBlockPluginInterface;\n\n\n\n\n\nclass cItemHandler\n{\npublic:\n\n\tfriend class cItem;\n\n\t/** Actions that may cause durability of an item may be lost, where the\n\tmagnitude of the loss depends on the specific item used to perform the\n\taction */\n\tenum eDurabilityLostAction\n\t{\n\t\tdlaAttackEntity,\n\t\tdlaBreakBlock,\n\t\tdlaBreakBlockInstant,\n\t};\n\n\tconstexpr cItemHandler(int a_ItemType) : m_ItemType(a_ItemType)\n\t{\n\t}\n\n\n\t/** Called when the player tries to place the item (right mouse button, IsPlaceable() == true).\n\ta_ClickedPosition is the block that has been clicked to place this item.\n\ta_ClickedBlockFace is the face has been clicked to place this item.\n\ta_CursorPosition is the position of the player's cursor within a_ClickedBlockFace.\n\tIf the block placement is refused inside this call, it will automatically revert the client-side changes. */\n\tvoid OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, Vector3i a_ClickedPosition, BLOCKTYPE a_ClickedBlockType, NIBBLETYPE a_ClickedBlockMeta, eBlockFace a_ClickedBlockFace, Vector3i a_CursorPosition) const;\n\n\t/** Called when the player tries to use the item (right mouse button).\n\tDescendants can return false to abort the usage (default behavior). */\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const;\n\n\t/** Called when the client sends the SHOOT status in the lclk packet (releasing the bow). */\n\tvirtual void OnItemShoot(cPlayer *, const Vector3i a_BlockPos, eBlockFace a_BlockFace) const\n\t{\n\t\tUNUSED(a_BlockPos);\n\t\tUNUSED(a_BlockFace);\n\t}\n\n\t/** Called every tick while the item is on the player's inventory (used by maps, for example) - For now, called only for equipped items */\n\tvirtual void OnUpdate(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item) const\n\t{\n\t\tUNUSED(a_World);\n\t\tUNUSED(a_Player);\n\t\tUNUSED(a_Item);\n\t}\n\n\t/** Called while the player digs a block using this item */\n\tvirtual bool OnDiggingBlock(\n\t\tcWorld * a_World, cPlayer * a_Player, const cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const;\n\n\t/** Called when a player attacks an entity with this item in hand. */\n\tvirtual void OnEntityAttack(cPlayer * a_Attacker, cEntity * a_AttackedEntity) const;\n\n\t/** Called after the player has eaten this item. */\n\tvirtual void OnFoodEaten(cWorld *a_World, cPlayer *a_Player, cItem *a_Item) const;\n\n\t/** Get the durability lost which the item will get, when a specified action\n\twas performed. This is only relevant for uses where the damage taken may\n\tdepend on the item used. */\n\tvirtual short GetDurabilityLossByAction(eDurabilityLostAction a_Action) const;\n\n\t/** Returns the maximum stack size for a given item */\n\tvirtual char GetMaxStackSize(void) const;\n\n\tstruct FoodInfo\n\t{\n\t\tint    FoodLevel;\n\t\tdouble Saturation;\n\n\t\tconstexpr FoodInfo(int a_FoodLevel, double a_Saturation) :\n\t\t\tFoodLevel(a_FoodLevel),\n\t\t\tSaturation(a_Saturation)\n\t\t{\n\t\t}\n\t} ;\n\n\t/** Returns the FoodInfo for this item. (FoodRecovery and Saturation) */\n\tvirtual FoodInfo GetFoodInfo(const cItem * a_Item) const;\n\n\t/** Lets the player eat a selected item. Returns true if the player ate the item */\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const;\n\n\t/** Indicates if this item is food */\n\tvirtual bool IsFood(void) const;\n\n\t/** Indicates if this item is drinkable */\n\tvirtual bool IsDrinkable(short a_ItemDamage) const;\n\n\t/** Blocks simply get placed */\n\tvirtual bool IsPlaceable(void) const;\n\n\t/** Can the anvil repair this item, when a_Item is the second input? */\n\tvirtual bool CanRepairWithRawMaterial(short a_ItemType) const;\n\n\t/** Returns whether this tool / item can harvest a specific block (e.g. iron pickaxe can harvest diamond ore, but wooden one can't).\n\tDefaults to false unless overridden. */\n\tvirtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) const;\n\n\t/** Returns the strength to break a specific block.\n\tDefaults to 1 unless overriden. */\n\tvirtual float GetBlockBreakingStrength(BLOCKTYPE a_Block) const;\n\n\nprotected:\n\n\tstatic const cItemHandler & For(int a_ItemType);\n\n\t~cItemHandler() = default;\n\n\tconst int m_ItemType;\n\n\t/** Performs the actual placement of this placeable item.\n\tThe descendant handler should call a_Player.PlaceBlock(s) supplying correct values for the newly placed block.\n\tThe default handler uses the stored block type and meta copied from the lowest 4 bits of the player's equipped item's damage value.\n\tHandlers return what a_Player.PlaceBlock(s) returns, indicating whether the placement was successful. */\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, Vector3i a_PlacePosition, eBlockFace a_ClickedBlockFace, Vector3i a_CursorPosition) const;\n};\n\n"
  },
  {
    "path": "src/Items/ItemHoe.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cItemHoeHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tif ((a_ClickedBlockFace == BLOCK_FACE_NONE) || (a_ClickedBlockPos.y >= cChunkDef::Height))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Need air above the hoe-d block to transform it:\n\t\tBLOCKTYPE UpperBlockType = a_World->GetBlock(a_ClickedBlockPos.addedY(1));\n\t\tif (UpperBlockType != E_BLOCK_AIR)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can only transform dirt or grass blocks:\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\tif (!a_World->GetBlockTypeMeta(a_ClickedBlockPos, BlockType, BlockMeta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif ((BlockType != E_BLOCK_DIRT) && (BlockType != E_BLOCK_GRASS))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif ((BlockType == E_BLOCK_DIRT) && (BlockMeta == E_META_DIRT_PODZOL))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Transform:\n\t\tauto NewBlockType = ((BlockType == E_BLOCK_DIRT) && (BlockMeta == E_META_DIRT_COARSE)) ? E_BLOCK_DIRT : E_BLOCK_FARMLAND;\n\t\ta_World->SetBlock(a_ClickedBlockPos, NewBlockType, 0);\n\t\ta_World->BroadcastSoundEffect(\"item.hoe.till\", a_ClickedBlockPos + Vector3d(0.5, 0.5, 0.5), 1.0f, 0.8f);\n\t\ta_Player->UseEquippedItem();\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual short GetDurabilityLossByAction(eDurabilityLostAction a_Action) const override\n\t{\n\t\tswitch (a_Action)\n\t\t{\n\t\t\tcase dlaAttackEntity:       return 1;\n\t\t\tcase dlaBreakBlock:         return 0;\n\t\t\tcase dlaBreakBlockInstant:  return 0;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported durability loss action\");\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemHopper.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemHopperHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tinline static NIBBLETYPE BlockFaceToMetaData(eBlockFace a_BlockFace)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_BOTTOM: return E_META_HOPPER_FACING_YM;\n\t\t\tcase BLOCK_FACE_TOP:    return E_META_HOPPER_FACING_YM;\n\t\t\tcase BLOCK_FACE_EAST:   return E_META_HOPPER_FACING_XM;\n\t\t\tcase BLOCK_FACE_NORTH:  return E_META_HOPPER_FACING_ZP;\n\t\t\tcase BLOCK_FACE_SOUTH:  return E_META_HOPPER_FACING_ZM;\n\t\t\tcase BLOCK_FACE_WEST:   return E_META_HOPPER_FACING_XP;\n\t\t\tdefault: UNREACHABLE(\"Unsupported block face\");\n\t\t}\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_HOPPER, BlockFaceToMetaData(a_ClickedBlockFace));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemItemFrame.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cItemItemFrameHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\t// Can only place on a side face:\n\t\tif ((a_ClickedBlockFace == BLOCK_FACE_NONE) || (a_ClickedBlockFace == BLOCK_FACE_YP) || (a_ClickedBlockFace == BLOCK_FACE_YM))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Make sure the support block is a valid block to place an item frame on:\n\t\tif (!cHangingEntity::IsValidSupportBlock(a_World->GetBlock(a_ClickedBlockPos)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Make sure block that will be occupied by the item frame is free now:\n\t\tconst auto PlacePos = AddFaceDirection(a_ClickedBlockPos, a_ClickedBlockFace);\n\t\tBLOCKTYPE Block = a_World->GetBlock(PlacePos);\n\t\tif (Block != E_BLOCK_AIR)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// An item frame, centred so pickups spawn nicely.\n\t\tauto ItemFrame = std::make_unique<cItemFrame>(a_ClickedBlockFace, Vector3d(0.5, 0.5, 0.5) + PlacePos);\n\t\tauto ItemFramePtr = ItemFrame.get();\n\t\tif (!ItemFramePtr->Initialize(std::move(ItemFrame), *a_World))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemJackOLantern.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockPumpkin.h\"\n\n\n\n\n\nclass cItemJackOLanternHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Re-use the pumpkin converter for lanterns:\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_JACK_O_LANTERN, cBlockPumpkinHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemLadder.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockLadder.h\"\n\n\n\n\n\nclass cItemLadderHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t/** Converts the block face of the neighbor to which the ladder is attached to the ladder block's meta. */\n\tstatic NIBBLETYPE BlockFaceToMetaData(eBlockFace a_NeighborBlockFace)\n\t{\n\t\tswitch (a_NeighborBlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_ZM: return 0x2;\n\t\t\tcase BLOCK_FACE_ZP: return 0x3;\n\t\t\tcase BLOCK_FACE_XM: return 0x4;\n\t\t\tcase BLOCK_FACE_XP: return 0x5;\n\t\t\tcase BLOCK_FACE_YM:\n\t\t\tcase BLOCK_FACE_YP: return 0x2;\n\t\t\tdefault: UNREACHABLE(\"Unsupported neighbor block face\");\n\t\t}\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tconst auto & World = *a_Player.GetWorld();\n\t\tconst auto ClickedBlockType = World.GetBlock(AddFaceDirection(a_PlacePosition, a_ClickedBlockFace, true));\n\n\t\t// Try finding a suitable neighbor block face for the ladder; start with the given one:\n\t\tif (!cBlockLadderHandler::CanBePlacedOn(ClickedBlockType, a_ClickedBlockFace))\n\t\t{\n\t\t\t// Couldn't be placed on whatever face was clicked, last ditch resort - find another face:\n\t\t\ta_ClickedBlockFace = FindSuitableFace(World, a_PlacePosition);\n\t\t\tif (a_ClickedBlockFace == BLOCK_FACE_NONE)\n\t\t\t{\n\t\t\t\t// No attachable face found - don't place the ladder:\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_LADDER, BlockFaceToMetaData(a_ClickedBlockFace));\n\t}\n\n\n\t/** Returns a suitable neighbor's blockface to place the ladder at the specified position.\n\tReturns BLOCK_FACE_NONE on failure. */\n\tstatic eBlockFace FindSuitableFace(const cWorld & a_World, const Vector3i a_Position)\n\t{\n\t\tfor (const auto Face : { BLOCK_FACE_ZM, BLOCK_FACE_XP, BLOCK_FACE_ZP, BLOCK_FACE_XM })  // Loop through all faces in specific order.\n\t\t{\n\t\t\t// The direction of Face is relative to the direction the ladder faces.\n\t\t\t// This is the position, computed inverted, that such a ladder would attach to.\n\t\t\tconst auto NeighborPosition = AddFaceDirection(a_Position, Face, true);\n\n\t\t\tif (cBlockLadderHandler::CanBePlacedOn(a_World.GetBlock(NeighborPosition), Face))\n\t\t\t{\n\t\t\t\treturn Face;\n\t\t\t}\n\t\t}\n\n\t\treturn BLOCK_FACE_NONE;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemLeaves.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemLeavesHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(\n\t\t\ta_PlacePosition,\n\t\t\tstatic_cast<BLOCKTYPE>(m_ItemType),\n\t\t\tstatic_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage | 0x4)  // 0x4 bit set means this is a player-placed leaves block, not to be decayed.\n\t\t);\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemLever.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemLeverHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t/** Converts the block face of the neighbor to which the lever is attached to the lever block's meta. */\n\tstatic NIBBLETYPE BlockFaceToMetaData(eBlockFace a_BlockFace)\n\t{\n\t\t// Determine lever direction:\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_YP:   return 0x6;\n\t\t\tcase BLOCK_FACE_XP:   return 0x1;\n\t\t\tcase BLOCK_FACE_XM:   return 0x2;\n\t\t\tcase BLOCK_FACE_ZP:   return 0x3;\n\t\t\tcase BLOCK_FACE_ZM:   return 0x4;\n\t\t\tcase BLOCK_FACE_YM:   return 0x0;\n\t\t\tcase BLOCK_FACE_NONE: break;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported block face\");\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), BlockFaceToMetaData(a_ClickedBlockFace));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemLighter.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cItemLighterHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tif (a_ClickedBlockFace < 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\tif (m_ItemType == E_ITEM_FLINT_AND_STEEL)\n\t\t\t{\n\t\t\t\ta_Player->UseEquippedItem();\n\t\t\t}\n\t\t\telse  // Fire charge.\n\t\t\t{\n\t\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t\t}\n\t\t}\n\n\t\t// Activate TNT if we clicked on it while not crouched:\n\t\tif ((a_World->GetBlock(a_ClickedBlockPos) == E_BLOCK_TNT) && !a_Player->IsCrouched())\n\t\t{\n\t\t\ta_World->DigBlock(a_ClickedBlockPos, a_Player);\n\t\t\ta_World->SpawnPrimedTNT(Vector3d(a_ClickedBlockPos) + Vector3d(0.5, 0.5, 0.5));  // 80 ticks to boom\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto FirePos = AddFaceDirection(a_ClickedBlockPos, a_ClickedBlockFace);\n\t\tif (!cChunkDef::IsValidHeight(FirePos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Light a fire next to / on top of the block if air:\n\t\tif (a_World->GetBlock(FirePos) == E_BLOCK_AIR)\n\t\t{\n\t\t\ta_World->PlaceBlock(FirePos, E_BLOCK_FIRE, 0);\n\n\t\t\t// The client plays flint and steel sounds, only need to handle fire charges:\n\t\t\tif (m_ItemType == E_ITEM_FIRE_CHARGE)\n\t\t\t{\n\t\t\t\ta_World->BroadcastSoundEffect(\"item.firecharge.use\", FirePos, 1.0f, 1.04f);\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemLilypad.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../Entities/Player.h\"\n#include \"../LineBlockTracer.h\"\n\n\n\n\n\nclass cItemLilypadHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cItemLilypadHandler(int a_ItemType):\n\t\tSuper(a_ItemType)\n\t{\n\n\t}\n\n\n\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn false;  // Set as not placeable so OnItemUse is called\n\t}\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\t// The client sends BLOCK_FACE_NONE when it determines it should do a tracing-based placement.\n\t\t// Otherwise, a normal block face is sent.\n\n\t\tif (a_ClickedBlockFace != BLOCK_FACE_NONE)\n\t\t{\n\t\t\t// The position the client wants the lilypad placed.\n\t\t\tconst auto PlacePos = AddFaceDirection(a_ClickedBlockPos, a_ClickedBlockFace);\n\n\t\t\t// Lilypad should not replace non air and non water blocks:\n\t\t\tif (\n\t\t\t\tconst auto BlockToReplace = a_World->GetBlock(PlacePos);\n\t\t\t\t(BlockToReplace != E_BLOCK_AIR) &&\n\t\t\t\t(BlockToReplace != E_BLOCK_WATER) &&\n\t\t\t\t(BlockToReplace != E_BLOCK_STATIONARY_WATER)\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst auto Below = PlacePos.addedY(-1);\n\t\t\tif (Below.y < 0)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lilypad should be placed only if there is a water block below:\n\t\t\tif (\n\t\t\t\tconst auto BlockBelow = a_World->GetBlock(Below);\n\t\t\t\t(BlockBelow != E_BLOCK_WATER) &&\n\t\t\t\t(BlockBelow != E_BLOCK_STATIONARY_WATER)\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ta_World->SetBlock(PlacePos, E_BLOCK_LILY_PAD, 0);\n\t\t\tif (!a_Player->IsGameModeCreative())\n\t\t\t{\n\t\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tclass cCallbacks:\n\t\t\tpublic cBlockTracer::cCallbacks\n\t\t{\n\t\tpublic:\n\n\t\t\tvirtual bool OnNextBlock(Vector3i a_CBBlockPos, BLOCKTYPE a_CBBlockType, NIBBLETYPE a_CBBlockMeta, eBlockFace a_CBEntryFace) override\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t!IsBlockWater(a_CBBlockType) ||\n\t\t\t\t\t(a_CBBlockMeta != 0)  // The hit block should be a source\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t// TODO: Vanilla stops the trace. However, we need to continue the trace, to work around our lack of block bounding box support\n\t\t\t\t\t// which would otherwise mean we misbehave when clicking through the voxel a (e.g.) button occupies. Now, however, we misbehave\n\t\t\t\t\t// when clicking on a block near water... Nonetheless, the former would cause ghost blocks, so continue for now.\n\n\t\t\t\t\t// Ignore and continue trace:\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tPosition = AddFaceDirection(a_CBBlockPos, BLOCK_FACE_YP);  // Always place pad at top of water block\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tVector3i Position;\n\n\t\t} Callbacks;\n\n\t\tconst auto EyePosition = a_Player->GetEyePosition();\n\t\tconst auto End = EyePosition + a_Player->GetLookVector() * 5;\n\t\tif (cLineBlockTracer::Trace(*a_Player->GetWorld(), Callbacks, EyePosition, End))\n\t\t{\n\t\t\t// The line traced to completion; no suitable water was found:\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto BlockToReplace = a_World->GetBlock(Callbacks.Position);\n\t\tif (BlockToReplace != E_BLOCK_AIR)\n\t\t{\n\t\t\t// Lilypad should not replace non air blocks:\n\t\t\treturn false;\n\t\t}\n\n\t\ta_World->SetBlock(Callbacks.Position, E_BLOCK_LILY_PAD, 0);\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemMap.h",
    "content": "\n#pragma once\n\n#include \"../Item.h\"\n\n\n\n\n\nclass cItemMapHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\n\tstatic const unsigned int DEFAULT_RADIUS = 128;\n\npublic:\n\n\tusing Super::Super;\n\n\tvirtual void OnUpdate(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item) const override\n\t{\n\t\tcMap * Map = a_World->GetMapManager().GetMapData(static_cast<unsigned>(a_Item.m_ItemDamage));\n\n\t\tif (Map == nullptr)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tMap->UpdateRadius(*a_Player, DEFAULT_RADIUS);\n\t\tMap->UpdateClient(a_Player);\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemMilk.h",
    "content": "\n#pragma once\n\n\n\n\n\nclass cItemMilkHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\tvirtual bool IsDrinkable(short a_ItemDamage) const override\n\t{\n\t\tUNUSED(a_ItemDamage);\n\t\treturn true;\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tUNUSED(a_Item);\n\t\ta_Player->ClearEntityEffects();\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->ReplaceOneEquippedItemTossRest(cItem(E_ITEM_BUCKET));\n\t\t}\n\t\treturn true;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemMinecart.h",
    "content": "\n#pragma once\n\n\n\n\n\nclass cItemMinecartHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\t// Must be used on a block\n\t\tif (a_ClickedBlockFace < 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check that there's rail in there:\n\t\tBLOCKTYPE Block = a_World->GetBlock(a_ClickedBlockPos);\n\t\tswitch (Block)\n\t\t{\n\t\t\tcase E_BLOCK_MINECART_TRACKS:\n\t\t\tcase E_BLOCK_POWERED_RAIL:\n\t\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\t\t{\n\t\t\t\t// These are allowed\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLOGD(\"Used minecart on an unsuitable block %d (%s)\", Block, ItemTypeToString(Block).c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Spawn the minecart:\n\t\tauto SpawnPos = Vector3d(a_ClickedBlockPos) + Vector3d(0.5, 0.5, 0.5);\n\t\tif (a_World->SpawnMinecart(SpawnPos, m_ItemType) == cEntity::INVALID_ID)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Remove the item from inventory:\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t\treturn true;\n\t}\n\n} ;\n"
  },
  {
    "path": "src/Items/ItemMobHead.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../BlockEntities/MobHeadEntity.h\"\n\n\n\n\n\nclass cItemMobHeadHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Cannot place a head at \"no face\" and from the bottom:\n\t\tif ((a_ClickedBlockFace == BLOCK_FACE_NONE) || (a_ClickedBlockFace == BLOCK_FACE_BOTTOM))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the placed head is a wither, try to spawn the wither first:\n\t\tif (a_HeldItem.m_ItemDamage == E_META_HEAD_WITHER)\n\t\t{\n\t\t\tif (TrySpawnWitherAround(a_Player, a_PlacePosition))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Wither not created, proceed with regular head placement\n\t\t}\n\n\t\tif (!a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_HEAD, BlockFaceToBlockMeta(a_ClickedBlockFace)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tRegularHeadPlaced(a_Player, a_HeldItem, a_PlacePosition, a_ClickedBlockFace);\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Called after placing a regular head block with no mob spawning.\n\tAdjusts the mob head entity based on the equipped item's data. */\n\tvoid RegularHeadPlaced(const cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace) const\n\t{\n\t\tconst auto HeadType = static_cast<eMobHeadType>(a_HeldItem.m_ItemDamage);\n\t\tconst auto BlockMeta = static_cast<NIBBLETYPE>(a_ClickedBlockFace);\n\n\t\t// Use a callback to set the properties of the mob head block entity:\n\t\ta_Player.GetWorld()->DoWithBlockEntityAt(a_PlacePosition, [&a_Player, HeadType, BlockMeta](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_HEAD);\n\n\t\t\tauto & MobHeadEntity = static_cast<cMobHeadEntity &>(a_BlockEntity);\n\n\t\t\tint Rotation = 0;\n\t\t\tif (BlockMeta == 1)\n\t\t\t{\n\t\t\t\tRotation = FloorC(a_Player.GetYaw() * 16.0f / 360.0f + 0.5f) & 0x0f;\n\t\t\t}\n\n\t\t\tMobHeadEntity.SetType(HeadType);\n\t\t\tMobHeadEntity.SetRotation(static_cast<eMobHeadRotation>(Rotation));\n\t\t\treturn false;\n\t\t});\n\t}\n\n\n\n\n\n\t/** Spawns a wither if the wither skull placed at the specified coords completes wither's spawning formula.\n\tReturns true if the wither was created. */\n\tbool TrySpawnWitherAround(cPlayer & a_Player, const Vector3i a_BlockPos) const\n\t{\n\t\t// No wither can be created at Y < 2 - not enough space for the formula:\n\t\tif (a_BlockPos.y < 2)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check for all relevant wither locations:\n\t\tstatic const Vector3i RelCoords[] =\n\t\t{\n\t\t\t{ 0, 0,  0},\n\t\t\t{ 1, 0,  0},\n\t\t\t{-1, 0,  0},\n\t\t\t{ 0, 0,  1},\n\t\t\t{ 0, 0, -1},\n\t\t};\n\n\t\tfor (auto & RelCoord : RelCoords)\n\t\t{\n\t\t\tif (TrySpawnWitherAt(\n\t\t\t\t*a_Player.GetWorld(), a_Player,\n\t\t\t\ta_BlockPos,\n\t\t\t\tRelCoord.x, RelCoord.z\n\t\t\t))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}  // for i - RelCoords[]\n\n\t\treturn false;\n\t}\n\n\n\t/** Tries to spawn a wither at the specified offset from the placed head block.\n\tPlacedHead coords are used to override the block query - at those coords the block is not queried from the world,\n\tbut assumed to be a head instead.\n\tOffset is used to shift the image around the X and Z axis.\n\tReturns true iff the wither was created successfully. */\n\tbool TrySpawnWitherAt(\n\t\tcWorld & a_World, cPlayer & a_Player,\n\t\tVector3i a_PlacedHeadPos,\n\t\tint a_OffsetX, int a_OffsetZ\n\t) const\n\t{\n\t\t// Image for the wither at the X axis:\n\t\tstatic const sSetBlock ImageWitherX[] =\n\t\t{\n\t\t\t{-1,  0, 0, E_BLOCK_HEAD,     0},\n\t\t\t{ 0,  0, 0, E_BLOCK_HEAD,     0},\n\t\t\t{ 1,  0, 0, E_BLOCK_HEAD,     0},\n\t\t\t{-1, -1, 0, E_BLOCK_SOULSAND, 0},\n\t\t\t{ 0, -1, 0, E_BLOCK_SOULSAND, 0},\n\t\t\t{ 1, -1, 0, E_BLOCK_SOULSAND, 0},\n\t\t\t{-1, -2, 0, E_BLOCK_AIR,      0},\n\t\t\t{ 0, -2, 0, E_BLOCK_SOULSAND, 0},\n\t\t\t{ 1, -2, 0, E_BLOCK_AIR,      0},\n\t\t};\n\n\t\t// Image for the wither at the Z axis:\n\t\tstatic const sSetBlock ImageWitherZ[] =\n\t\t{\n\t\t\t{ 0,  0, -1, E_BLOCK_HEAD,     0},\n\t\t\t{ 0,  0,  0, E_BLOCK_HEAD,     0},\n\t\t\t{ 0,  0,  1, E_BLOCK_HEAD,     0},\n\t\t\t{ 0, -1, -1, E_BLOCK_SOULSAND, 0},\n\t\t\t{ 0, -1,  0, E_BLOCK_SOULSAND, 0},\n\t\t\t{ 0, -1,  1, E_BLOCK_SOULSAND, 0},\n\t\t\t{ 0, -2, -1, E_BLOCK_AIR,      0},\n\t\t\t{ 0, -2,  0, E_BLOCK_SOULSAND, 0},\n\t\t\t{ 0, -2,  1, E_BLOCK_AIR,      0},\n\t\t};\n\n\t\t// Try to spawn the wither from each image:\n\t\treturn (\n\t\t\tTrySpawnWitherFromImage(\n\t\t\t\ta_World, a_Player, ImageWitherX,\n\t\t\t\ta_PlacedHeadPos,\n\t\t\t\ta_OffsetX, a_OffsetZ\n\t\t\t) ||\n\t\t\tTrySpawnWitherFromImage(\n\t\t\t\ta_World, a_Player, ImageWitherZ,\n\t\t\t\ta_PlacedHeadPos,\n\t\t\t\ta_OffsetX, a_OffsetZ\n\t\t\t)\n\t\t);\n\t}\n\n\n\n\n\n\t/** Tries to spawn a wither from the specified image at the specified offset from the placed head block.\n\tPlacedHead coords are used to override the block query - at those coords the block is not queried from the world,\n\tbut assumed to be a head instead.\n\tOffset is used to shift the image around the X and Z axis.\n\tReturns true iff the wither was created successfully. */\n\tbool TrySpawnWitherFromImage(\n\t\tcWorld & a_World, cPlayer & a_Player, const sSetBlock (& a_Image)[9],\n\t\tVector3i a_PlacedHeadPos,\n\t\tint a_OffsetX, int a_OffsetZ\n\t) const\n\t{\n\t\tstd::array<Vector3i, 9> PositionsToClear;\n\n\t\t// Check each block individually:\n\t\tfor (size_t i = 0; i != std::size(a_Image); i++)\n\t\t{\n\t\t\t// The absolute coords of the block in the image to check.\n\t\t\tconst Vector3i Block(\n\t\t\t\ta_PlacedHeadPos.x + a_OffsetX + a_Image[i].GetX(),\n\t\t\t\ta_PlacedHeadPos.y + a_Image[i].GetY(),\n\t\t\t\ta_PlacedHeadPos.z + a_OffsetZ + a_Image[i].GetZ()\n\t\t\t);\n\n\t\t\t// If the query is for the head the player is about to place (remember, it hasn't been set into the world yet), short-circuit-evaluate it:\n\t\t\tif (Block == a_PlacedHeadPos)\n\t\t\t{\n\t\t\t\tif (a_Image[i].m_BlockType != E_BLOCK_HEAD)\n\t\t\t\t{\n\t\t\t\t\treturn false;  // Didn't match.\n\t\t\t\t}\n\n\t\t\t\tPositionsToClear[i] = Block;\n\t\t\t\tcontinue;  // Matched, continue checking the rest of the image.\n\t\t\t}\n\n\t\t\t// Query the world block:\n\t\t\tBLOCKTYPE BlockType;\n\t\t\tNIBBLETYPE BlockMeta;\n\t\t\tif (!a_World.GetBlockTypeMeta(Block, BlockType, BlockMeta))\n\t\t\t{\n\t\t\t\t// Cannot query block, assume unloaded chunk, fail to spawn the wither\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Compare the world block:\n\t\t\tif (BlockType != a_Image[i].m_BlockType)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If it is a mob head, check it's a wither skull using the block entity:\n\t\t\tif (\n\t\t\t\t(BlockType == E_BLOCK_HEAD) &&\n\t\t\t\t!a_World.DoWithBlockEntityAt(Block, [&](cBlockEntity & a_BlockEntity)\n\t\t\t\t{\n\t\t\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_HEAD);\n\n\t\t\t\t\treturn static_cast<cMobHeadEntity &>(a_BlockEntity).GetType() == SKULL_TYPE_WITHER;\n\t\t\t\t})\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Matched, continue checking:\n\t\t\tPositionsToClear[i] = Block;\n\t\t}  // for i - a_Image\n\n\t\t// All image blocks matched, try replace the image with air blocks:\n\t\tif (\n\t\t\t!a_Player.PlaceBlocks(\n\t\t\t{\n\t\t\t\t{ PositionsToClear[0], E_BLOCK_AIR, 0 },\n\t\t\t\t{ PositionsToClear[1], E_BLOCK_AIR, 0 },\n\t\t\t\t{ PositionsToClear[2], E_BLOCK_AIR, 0 },\n\t\t\t\t{ PositionsToClear[3], E_BLOCK_AIR, 0 },\n\t\t\t\t{ PositionsToClear[4], E_BLOCK_AIR, 0 },\n\t\t\t\t{ PositionsToClear[5], E_BLOCK_AIR, 0 },\n\t\t\t\t{ PositionsToClear[6], E_BLOCK_AIR, 0 },\n\t\t\t\t{ PositionsToClear[7], E_BLOCK_AIR, 0 },\n\t\t\t\t{ PositionsToClear[8], E_BLOCK_AIR, 0 },\n\t\t\t})\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Spawn the wither:\n\t\tint BlockX = a_PlacedHeadPos.x + a_OffsetX;\n\t\tint BlockZ = a_PlacedHeadPos.z + a_OffsetZ;\n\t\ta_World.SpawnMob(static_cast<double>(BlockX) + 0.5, a_PlacedHeadPos.y - 2, static_cast<double>(BlockZ) + 0.5, mtWither, false);\n\t\tAwardSpawnWitherAchievement(a_World, {BlockX, a_PlacedHeadPos.y - 2, BlockZ});\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Awards the achievement to all players close to the specified point. */\n\tvoid AwardSpawnWitherAchievement(cWorld & a_World, Vector3i a_BlockPos) const\n\t{\n\t\tVector3f Pos(a_BlockPos);\n\t\ta_World.ForEachPlayer([=](cPlayer & a_Player)\n\t\t\t{\n\t\t\t\t// If player is close, award achievement:\n\t\t\t\tdouble Dist = (a_Player.GetPosition() - Pos).Length();\n\t\t\t\tif (Dist < 50.0)\n\t\t\t\t{\n\t\t\t\t\ta_Player.AwardAchievement(CustomStatistic::AchSpawnWither);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t);\n\t}\n\n\n\n\n\n\t/** Converts the block face of the placement (which face of the block was clicked to place the head)\n\tinto the block's metadata value. */\n\tstatic NIBBLETYPE BlockFaceToBlockMeta(int a_BlockFace)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_TOP: return 0x01;  // On ground (rotation provided in block entity)\n\t\t\tcase BLOCK_FACE_XM:  return 0x04;  // west wall, facing east\n\t\t\tcase BLOCK_FACE_XP:  return 0x05;  // east wall, facing west\n\t\t\tcase BLOCK_FACE_ZM:  return 0x02;  // north wall, facing south\n\t\t\tcase BLOCK_FACE_ZP:  return 0x03;  // south wall, facing north\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled block face\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemNetherWart.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n\n\n\n\n\nclass cItemNetherWartHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Only allow planting nether wart onto the top side of the block:\n\t\tif (a_ClickedBlockFace != BLOCK_FACE_TOP)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_NETHER_WART, 0);\n\t}\n\n\n\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemObserver.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockObserver.h\"\n\n\n\n\n\nclass cItemObserverHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_OBSERVER, cBlockObserverHandler::DisplacementYawToMetaData(a_PlacePosition, a_Player.GetEyePosition(), a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemPainting.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/Painting.h\"\n\n\n\n\n\nclass cItemPaintingHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\t// Paintings can't be flatly placed:\n\t\tif (\n\t\t\t(a_ClickedBlockFace == BLOCK_FACE_NONE) ||\n\t\t\t(a_ClickedBlockFace == BLOCK_FACE_YM) ||\n\t\t\t(a_ClickedBlockFace == BLOCK_FACE_YP)\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Make sure the support block is a valid block to place a painting on:\n\t\tif (!cHangingEntity::IsValidSupportBlock(a_World->GetBlock(a_ClickedBlockPos)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Make sure block that will be occupied is free:\n\t\tauto PlacePos = AddFaceDirection(a_ClickedBlockPos, a_ClickedBlockFace);\n\t\tBLOCKTYPE PlaceBlockType = a_World->GetBlock(PlacePos);\n\t\tif (PlaceBlockType != E_BLOCK_AIR)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Define all the possible painting titles\n\t\tstatic const AString gPaintingTitlesList[] =\n\t\t{\n\t\t\t{ \"Kebab\" },\n\t\t\t{ \"Aztec\" },\n\t\t\t{ \"Alban\" },\n\t\t\t{ \"Aztec2\" },\n\t\t\t{ \"Bomb\" },\n\t\t\t{ \"Plant\" },\n\t\t\t{ \"Wasteland\" },\n\t\t\t{ \"Wanderer\" },\n\t\t\t{ \"Graham\" },\n\t\t\t{ \"Pool\" },\n\t\t\t{ \"Courbet\" },\n\t\t\t{ \"Sunset\" },\n\t\t\t{ \"Sea\" },\n\t\t\t{ \"Creebet\" },\n\t\t\t{ \"Match\" },\n\t\t\t{ \"Bust\" },\n\t\t\t{ \"Stage\" },\n\t\t\t{ \"Void\" },\n\t\t\t{ \"SkullAndRoses\" },\n\t\t\t{ \"Wither\" },\n\t\t\t{ \"Fighters\" },\n\t\t\t{ \"Skeleton\" },\n\t\t\t{ \"DonkeyKong\" },\n\t\t\t{ \"Pointer\" },\n\t\t\t{ \"Pigscene\" },\n\t\t\t{ \"BurningSkull\" }\n\t\t};\n\n\t\tauto PaintingTitle = gPaintingTitlesList[a_World->GetTickRandomNumber(ARRAYCOUNT(gPaintingTitlesList) - 1)];\n\n\t\t// A painting, centred so pickups spawn nicely.\n\t\tauto Painting = std::make_unique<cPainting>(PaintingTitle, a_ClickedBlockFace, Vector3d(0.5, 0.5, 0.5) + PlacePos);\n\t\tauto PaintingPtr = Painting.get();\n\t\tif (!PaintingPtr->Initialize(std::move(Painting), *a_World))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t\treturn true;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemPickaxe.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\nclass cItemPickaxeHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cItemPickaxeHandler(int a_ItemType):\n\t\tSuper(a_ItemType)\n\t{\n\n\t}\n\n\n\n\tvirtual short GetDurabilityLossByAction(eDurabilityLostAction a_Action) const override\n\t{\n\t\tswitch (a_Action)\n\t\t{\n\t\t\tcase dlaAttackEntity:       return 2;\n\t\t\tcase dlaBreakBlock:         return 1;\n\t\t\tcase dlaBreakBlockInstant:  return 0;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported durability loss action\");\n\t}\n\n\n\n\tchar PickaxeLevel() const\n\t{\n\t\tswitch (m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_WOODEN_PICKAXE:  return 1;\n\t\t\tcase E_ITEM_GOLD_PICKAXE:    return 1;\n\t\t\tcase E_ITEM_STONE_PICKAXE:   return 2;\n\t\t\tcase E_ITEM_IRON_PICKAXE:    return 3;\n\t\t\tcase E_ITEM_DIAMOND_PICKAXE: return 4;\n\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tvirtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) const override\n\t{\n\t\t// NOTICE: Make sure to update cItemHandler::CanHarvestBlock() if adding new blocks here!\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_OBSIDIAN:\n\t\t\t{\n\t\t\t\treturn PickaxeLevel() >= 4;\n\t\t\t}\n\n\t\t\tcase E_BLOCK_DIAMOND_BLOCK:\n\t\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\t\tcase E_BLOCK_EMERALD_ORE:\n\t\t\tcase E_BLOCK_GOLD_BLOCK:\n\t\t\tcase E_BLOCK_GOLD_ORE:\n\t\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\t\tcase E_BLOCK_REDSTONE_ORE_GLOWING:\n\t\t\t{\n\t\t\t\treturn PickaxeLevel() >= 3;\n\t\t\t}\n\n\t\t\tcase E_BLOCK_IRON_BLOCK:\n\t\t\tcase E_BLOCK_IRON_ORE:\n\t\t\tcase E_BLOCK_LAPIS_ORE:\n\t\t\tcase E_BLOCK_LAPIS_BLOCK:\n\t\t\t{\n\t\t\t\treturn PickaxeLevel() >= 2;\n\t\t\t}\n\n\t\t\tcase E_BLOCK_ANVIL:\n\t\t\tcase E_BLOCK_BLACK_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_BLOCK_OF_COAL:\n\t\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:\n\t\t\tcase E_BLOCK_BLUE_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_BONE_BLOCK:\n\t\t\tcase E_BLOCK_BREWING_STAND:\n\t\t\tcase E_BLOCK_BRICK:\n\t\t\tcase E_BLOCK_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_BROWN_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_CAULDRON:\n\t\t\tcase E_BLOCK_COAL_ORE:\n\t\t\tcase E_BLOCK_COBBLESTONE:\n\t\t\tcase E_BLOCK_COBBLESTONE_STAIRS:\n\t\t\tcase E_BLOCK_COBBLESTONE_WALL:\n\t\t\tcase E_BLOCK_CONCRETE:\n\t\t\tcase E_BLOCK_CYAN_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_DISPENSER:\n\t\t\tcase E_BLOCK_DROPPER:\n\t\t\tcase E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:\n\t\t\tcase E_BLOCK_DOUBLE_STONE_SLAB:\n\t\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\t\tcase E_BLOCK_END_BRICKS:\n\t\t\tcase E_BLOCK_END_STONE:\n\t\t\tcase E_BLOCK_FURNACE:\n\t\t\tcase E_BLOCK_GRAY_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_GREEN_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_HARDENED_CLAY:\n\t\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\t\tcase E_BLOCK_HOPPER:\n\t\t\tcase E_BLOCK_IRON_BARS:\n\t\t\tcase E_BLOCK_IRON_DOOR:\n\t\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\t\tcase E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\t\tcase E_BLOCK_LIT_FURNACE:\n\t\t\tcase E_BLOCK_LIME_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_MAGENTA_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\t\tcase E_BLOCK_MOSSY_COBBLESTONE:\n\t\t\tcase E_BLOCK_MAGMA:\n\t\t\tcase E_BLOCK_NETHER_BRICK:\n\t\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:\n\t\t\tcase E_BLOCK_NETHERRACK:\n\t\t\tcase E_BLOCK_OBSERVER:\n\t\t\tcase E_BLOCK_ORANGE_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_PRISMARINE_BLOCK:\n\t\t\tcase E_BLOCK_PINK_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_PURPLE_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_PURPUR_BLOCK:\n\t\t\tcase E_BLOCK_PURPUR_DOUBLE_SLAB:\n\t\t\tcase E_BLOCK_PURPUR_PILLAR:\n\t\t\tcase E_BLOCK_PURPUR_SLAB:\n\t\t\tcase E_BLOCK_PURPUR_STAIRS:\n\t\t\tcase E_BLOCK_QUARTZ_BLOCK:\n\t\t\tcase E_BLOCK_QUARTZ_STAIRS:\n\t\t\tcase E_BLOCK_RED_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_RED_NETHER_BRICK:\n\t\t\tcase E_BLOCK_RED_SANDSTONE:\n\t\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:\n\t\t\tcase E_BLOCK_SANDSTONE:\n\t\t\tcase E_BLOCK_SANDSTONE_STAIRS:\n\t\t\tcase E_BLOCK_STONE:\n\t\t\tcase E_BLOCK_STONE_BRICKS:\n\t\t\tcase E_BLOCK_STONE_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\t\tcase E_BLOCK_STONE_SLAB:\n\t\t\tcase E_BLOCK_WHITE_GLAZED_TERRACOTTA:\n\t\t\tcase E_BLOCK_YELLOW_GLAZED_TERRACOTTA:\n\t\t\t{\n\t\t\t\treturn PickaxeLevel() >= 1;\n\t\t\t}\n\t\t}\n\t\treturn Super::CanHarvestBlock(a_BlockType);\n\t}\n\n\tvirtual bool CanRepairWithRawMaterial(short a_ItemType) const override\n\t{\n\t\tswitch (m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_WOODEN_PICKAXE:  return (a_ItemType == E_BLOCK_PLANKS);\n\t\t\tcase E_ITEM_STONE_PICKAXE:   return (a_ItemType == E_BLOCK_COBBLESTONE);\n\t\t\tcase E_ITEM_IRON_PICKAXE:    return (a_ItemType == E_ITEM_IRON);\n\t\t\tcase E_ITEM_GOLD_PICKAXE:    return (a_ItemType == E_ITEM_GOLD);\n\t\t\tcase E_ITEM_DIAMOND_PICKAXE: return (a_ItemType == E_ITEM_DIAMOND);\n\t\t}\n\t\treturn false;\n\t}\n\n\n\tvirtual float GetBlockBreakingStrength(BLOCKTYPE a_Block) const override\n\t{\n\t\tif (!IsBlockMaterialIron(a_Block) && (a_Block != E_BLOCK_ANVIL) && !IsBlockMaterialRock(a_Block))\n\t\t{\n\t\t\treturn Super::GetBlockBreakingStrength(a_Block);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (m_ItemType)\n\t\t\t{\n\t\t\t\tcase E_ITEM_WOODEN_PICKAXE:  return 2.0f;\n\t\t\t\tcase E_ITEM_STONE_PICKAXE:   return 4.0f;\n\t\t\t\tcase E_ITEM_IRON_PICKAXE:    return 6.0f;\n\t\t\t\tcase E_ITEM_GOLD_PICKAXE:    return 12.0f;\n\t\t\t\tcase E_ITEM_DIAMOND_PICKAXE: return 8.0f;\n\t\t\t}\n\t\t}\n\t\tASSERT(!\"Something is wrong here... Maybe they are pickaxes out of a new material?\");\n\t\treturn 1.0f;\n\t}\n\n} ;\n"
  },
  {
    "path": "src/Items/ItemPiston.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockPiston.h\"\n\n\n\n\n\nclass cItemPistonHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), cBlockPistonHandler::DisplacementYawToMetaData(a_PlacePosition, a_Player.GetEyePosition(), a_Player.GetYaw()));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemPlanks.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemPlanksHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemPoisonousPotato.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n\n\n\n\n\nclass cItemPoisonousPotatoHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemPoisonousPotatoHandler(int a_ItemType):\n\t\tSuper(a_ItemType, FoodInfo(2, 1.2))\n\t{\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tif (!Super::EatItem(a_Player, a_Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (GetRandomProvider().RandBool(0.6))\n\t\t{\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effPoison, 100, 0);\n\t\t}\n\n\t\treturn true;\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemPotion.h",
    "content": "\n#pragma once\n\n#include \"../Entities/EntityEffect.h\"\n\n\nclass cItemPotionHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\t// cItemHandler overrides:\n\tvirtual bool IsDrinkable(short a_ItemDamage) const override\n\t{\n\t\t// Drinkable potion if 13th lowest bit is set\n\t\t// Ref.: https://minecraft.wiki/w/Potions#Data_value_table\n\t\treturn cEntityEffect::IsPotionDrinkable(a_ItemDamage);\n\t}\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tshort PotionDamage = a_HeldItem.m_ItemDamage;\n\n\t\t// Do not throw non-splash potions:\n\t\tif (cEntityEffect::IsPotionDrinkable(PotionDamage))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tVector3d Pos = a_Player->GetThrowStartPos();\n\t\tVector3d Speed = a_Player->GetLookVector() * 14;\n\n\t\t// Play sound\n\t\ta_World->BroadcastSoundEffect(\"entity.arrow.shoot\", a_Player->GetPosition() - Vector3d(0, a_Player->GetHeight(), 0), 0.5f, 0.4f / GetRandomProvider().RandReal(0.8f, 1.2f));\n\n\t\tif (a_World->CreateProjectile(Pos.x, Pos.y, Pos.z, cProjectileEntity::pkSplashPotion, a_Player, &a_Player->GetEquippedItem(), &Speed) == cEntity::INVALID_ID)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\n\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tshort PotionDamage = a_Item->m_ItemDamage;\n\n\t\t// Do not drink undrinkable potions:\n\t\tif (!cEntityEffect::IsPotionDrinkable(a_Item->m_ItemDamage))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\ta_Player->AddEntityEffect(\n\t\t\tcEntityEffect::GetPotionEffectType(PotionDamage),\n\t\t\tcEntityEffect::GetPotionEffectDuration(PotionDamage),\n\t\t\tcEntityEffect::GetPotionEffectIntensity(PotionDamage)\n\t\t);\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->ReplaceOneEquippedItemTossRest(cItem(E_ITEM_GLASS_BOTTLE));\n\t\t}\n\t\treturn true;\n\t}\n};\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemPumpkin.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockPumpkin.h\"\n\n\n\n\n\nclass cItemPumpkinHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// First try spawning a snow golem or an iron golem:\n\t\tif (TrySpawnGolem(a_Player, a_PlacePosition))\n\t\t{\n\t\t\t// The client thinks that they placed the pumpkin, let them know it's been replaced:\n\t\t\ta_Player.SendBlocksAround(a_PlacePosition);\n\t\t\treturn true;\n\t\t}\n\n\t\t// No golem at these coords, place the block normally:\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_PUMPKIN, cBlockPumpkinHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n\n\n\n\n\n\t/** Spawns a snow / iron golem if the shape matches the recipe, supposing that the block placed at the specified coords is a pumpkin.\n\tReturns true if the golem blocks are removed (for spawning), false if the recipe is not matched. */\n\tbool TrySpawnGolem(cPlayer & a_Player, const Vector3i a_PumpkinPos) const\n\t{\n\t\t// A golem can't form with a pumpkin below level 2 or above level 255:\n\t\tif ((a_PumpkinPos.y < 2) || (a_PumpkinPos.y >= cChunkDef::Height))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tauto & World = *a_Player.GetWorld();\n\n\t\t// Decide which golem to try spawning based on the block below the placed pumpkin:\n\t\tswitch (World.GetBlock(a_PumpkinPos.addedY(-1)))\n\t\t{\n\t\t\tcase E_BLOCK_SNOW_BLOCK: return TrySpawnSnowGolem(World, a_Player, a_PumpkinPos);\n\t\t\tcase E_BLOCK_IRON_BLOCK: return TrySpawnIronGolem(World, a_Player, a_PumpkinPos);\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\t// No golem here:\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\t/** Spawns a snow golem if the shape matches the recipe, supposing that the block placed at the specified coords is a pumpkin.\n\tReturns true if the golem blocks are removed (for spawning), false if the recipe is not matched.\n\tAssumes that the block below the specified block has already been checked and is a snow block. */\n\tbool TrySpawnSnowGolem(cWorld & a_World, cPlayer & a_Player, const Vector3i a_PumpkinPos) const\n\t{\n\t\tASSERT(a_PumpkinPos.y > 1);\n\t\tASSERT(a_World.GetBlock(a_PumpkinPos.addedY(-1)) == E_BLOCK_SNOW_BLOCK);\n\n\t\t// Need one more snow block 2 blocks below the pumpkin:\n\t\tif (a_World.GetBlock(a_PumpkinPos.addedY(-2)) != E_BLOCK_SNOW_BLOCK)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Try to place air blocks where the original recipe blocks were:\n\t\tif (\n\t\t\t!a_Player.PlaceBlocks(\n\t\t\t{\n\t\t\t\t{ a_PumpkinPos,            E_BLOCK_AIR, 0 },  // Head\n\t\t\t\t{ a_PumpkinPos.addedY(-1), E_BLOCK_AIR, 0 },  // Torso\n\t\t\t\t{ a_PumpkinPos.addedY(-2), E_BLOCK_AIR, 0 }\t  // Legs\n\t\t\t})\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Spawn the golem:\n\t\tauto GolemPos = Vector3d(a_PumpkinPos) + Vector3d(0.5, -2, 0.5);\n\t\ta_World.SpawnMob(GolemPos.x, GolemPos.y, GolemPos.z, mtSnowGolem, false);\n\t\treturn true;\n\t}\n\n\n\n\n\n\t/** Spawns an iron golem if the shape matches the recipe, supposing that the block placed at the specified coords is a pumpkin.\n\tReturns true if the golem blocks are removed (for spawning), false if the recipe is not matched.\n\tAssumes that the block below the specified block has already been checked and is an iron block. */\n\tbool TrySpawnIronGolem(cWorld & a_World, cPlayer & a_Player, const Vector3i a_PumpkinPos) const\n\t{\n\t\tASSERT(a_PumpkinPos.y > 1);\n\t\tASSERT(a_World.GetBlock(a_PumpkinPos.addedY(-1)) == E_BLOCK_IRON_BLOCK);\n\n\t\t// Need one more iron block 2 blocks below the pumpkin:\n\t\tif (a_World.GetBlock(a_PumpkinPos.addedY(-2)) != E_BLOCK_IRON_BLOCK)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check the two arm directions (X, Z) using a loop over two sets of offset vectors:\n\t\tauto BodyPos = a_PumpkinPos.addedY(-1);\n\t\tstatic const Vector3i ArmOffsets[] =\n\t\t{\n\t\t\t{1, 0, 0},\n\t\t\t{0, 0, 1},\n\t\t};\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(ArmOffsets); i++)\n\t\t{\n\t\t\t// If the arm blocks don't match, bail out of this loop repetition:\n\t\t\tif (\n\t\t\t\t(a_World.GetBlock(BodyPos + ArmOffsets[i]) != E_BLOCK_IRON_BLOCK) ||\n\t\t\t\t(a_World.GetBlock(BodyPos - ArmOffsets[i]) != E_BLOCK_IRON_BLOCK)\n\t\t\t)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Try to place air blocks where the original recipe blocks were:\n\t\t\tif (\n\t\t\t\t!a_Player.PlaceBlocks(\n\t\t\t\t{\n\t\t\t\t\t{ a_PumpkinPos,            E_BLOCK_AIR, 0 },  // Head\n\t\t\t\t\t{ BodyPos,                 E_BLOCK_AIR, 0 },  // Torso\n\t\t\t\t\t{ BodyPos.addedY(-1),      E_BLOCK_AIR, 0 },  // Legs\n\t\t\t\t\t{ BodyPos + ArmOffsets[i], E_BLOCK_AIR, 0 },  // Arm\n\t\t\t\t\t{ BodyPos - ArmOffsets[i], E_BLOCK_AIR, 0 }   // Arm\n\t\t\t\t})\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Spawn the golem:\n\t\t\tauto GolemPos = Vector3d(a_PumpkinPos) + Vector3d(0.5, -2, 0.5);\n\t\t\ta_World.SpawnMob(GolemPos.x, GolemPos.y, GolemPos.z, mtIronGolem, false);\n\t\t\treturn true;\n\t\t}  // for i - ArmOffsets[]\n\n\t\t// Neither arm offset matched, this thing is not a complete golem\n\t\treturn false;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemQuartz.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemQuartzHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t/** Converts the block face of the pillar block's \"base\" to the block's metadata. */\n\tstatic NIBBLETYPE BlockFaceToMetaData(eBlockFace a_BlockFace)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_YM:\n\t\t\tcase BLOCK_FACE_YP:\n\t\t\t{\n\t\t\t\treturn E_META_QUARTZ_PILLAR;  // Top or bottom.\n\t\t\t}\n\n\t\t\tcase BLOCK_FACE_ZP:\n\t\t\tcase BLOCK_FACE_ZM:\n\t\t\t{\n\t\t\t\treturn 0x4;  // North or south.\n\t\t\t}\n\n\t\t\tcase BLOCK_FACE_XP:\n\t\t\tcase BLOCK_FACE_XM:\n\t\t\t{\n\t\t\t\treturn 0x3;  // East or west.\n\t\t\t}\n\t\t\tdefault: UNREACHABLE(\"Unsupported block face\");\n\t\t}\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tconst auto Meta = static_cast<NIBBLETYPE>(a_Player.GetEquippedItem().m_ItemDamage);\n\n\t\t// Pillar block needs additional direction in the metadata:\n\t\tif (Meta == E_META_QUARTZ_PILLAR)\n\t\t{\n\t\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_QUARTZ_BLOCK, BlockFaceToMetaData(a_ClickedBlockFace));\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_QUARTZ_BLOCK, Meta);\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemRail.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockRail.h\"\n\n\n\n\n\nclass cItemRailHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tcChunkInterface ChunkInterface(a_Player.GetWorld()->GetChunkMap());\n\t\tconst auto RailType = static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType);\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, RailType, cBlockRailHandler::FindMeta(ChunkInterface, a_PlacePosition, RailType));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemRawChicken.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n\n\n\n\n\nclass cItemRawChickenHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemRawChickenHandler(int a_ItemType):\n\t\tSuper(a_ItemType, FoodInfo(2, 1.2))\n\t{\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tif (!Super::EatItem(a_Player, a_Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (GetRandomProvider().RandBool(0.3))\n\t\t{\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effHunger, 600, 0);\n\t\t}\n\n\t\treturn true;\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemRawFish.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n\n\n\n\n\nclass cItemRawFishHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemRawFishHandler(int a_ItemType):\n\t\tSuper(a_ItemType, FoodInfo(0, 0))\n\t{\n\t}\n\n\tvirtual FoodInfo GetFoodInfo(const cItem * a_Item) const override\n\t{\n\t\tstatic const FoodInfo RawFishInfos[] =\n\t\t{\n\t\t\tFoodInfo(2, 0.4),  // Raw fish\n\t\t\tFoodInfo(2, 0.2),  // Raw salmon\n\t\t\tFoodInfo(1, 0.2),  // Clownfish\n\t\t\tFoodInfo(1, 0.2),  // Pufferfish\n\t\t};\n\n\t\tif (a_Item->m_ItemDamage >= static_cast<short>(ARRAYCOUNT(RawFishInfos)))\n\t\t{\n\t\t\tLOGWARNING(\"Unknown raw fish type '%d'\", a_Item->m_ItemDamage);\n\t\t\treturn FoodInfo(0, 0);\n\t\t}\n\t\treturn RawFishInfos[a_Item->m_ItemDamage];\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tif (!Super::EatItem(a_Player, a_Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (a_Item->m_ItemDamage == E_META_RAW_FISH_PUFFERFISH)\n\t\t{\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effHunger, 20 * 15, 2);\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effNausea, 20 * 15, 1);\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effPoison, 20 * 60, 3);\n\t\t}\n\n\n\t\treturn true;\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemRedstoneDust.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemRedstoneDustHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_REDSTONE_WIRE, 0);\n\t}\n\n\n\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemRedstoneRepeater.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../Blocks/BlockRedstoneRepeater.h\"\n\n\n\n\n\nclass cItemRedstoneRepeaterHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_REDSTONE_REPEATER_OFF, cBlockRedstoneRepeaterHandler::YawToMetaData(a_Player.GetYaw()));\n\t}\n\n\n\n\n\n\tvirtual bool IsPlaceable() const override\n\t{\n\t\treturn true;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemRottenFlesh.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n\n\n\n\n\nclass cItemRottenFleshHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemRottenFleshHandler(int a_ItemType):\n\t\tSuper(a_ItemType, FoodInfo(4, 0.8))\n\t{\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tif (!Super::EatItem(a_Player, a_Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (GetRandomProvider().RandBool(0.8))\n\t\t{\n\t\t\ta_Player->AddEntityEffect(cEntityEffect::effHunger, 600, 0);\n\t\t}\n\n\t\treturn true;\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemSapling.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemSaplingHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(\n\t\t\ta_PlacePosition,\n\t\t\tstatic_cast<BLOCKTYPE>(m_ItemType),\n\t\t\tstatic_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage & 0x07)  // Allow only the lowest 3 bits (top bit is for growth).\n\t\t);\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemSeeds.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n\n\n\n\n\nclass cItemSeedsHandler:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cItemSeedsHandler(int a_ItemType):\n\t\tSuper(a_ItemType)\n\t{\n\n\t}\n\n\n\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Only allow planting seeds from the top side of the block:\n\t\tif (a_ClickedBlockFace != BLOCK_FACE_TOP)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tBLOCKTYPE BlockType;\n\n\t\t// Get the produce block based on the seed item:\n\t\tswitch (m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_BEETROOT_SEEDS: BlockType = E_BLOCK_BEETROOTS;    break;\n\t\t\tcase E_ITEM_CARROT:         BlockType = E_BLOCK_CARROTS;      break;\n\t\t\tcase E_ITEM_MELON_SEEDS:    BlockType = E_BLOCK_MELON_STEM;   break;\n\t\t\tcase E_ITEM_POTATO:         BlockType = E_BLOCK_POTATOES;     break;\n\t\t\tcase E_ITEM_PUMPKIN_SEEDS:  BlockType = E_BLOCK_PUMPKIN_STEM; break;\n\t\t\tcase E_ITEM_SEEDS:          BlockType = E_BLOCK_CROPS;        break;\n\t\t\tdefault:                    UNREACHABLE(\"Unsupported seed type\");\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, BlockType, 0);\n\t}\n\n\n\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n\nprotected:\n\t~cItemSeedsHandler() = default;\n} ;\n\nclass cItemSimpleSeedsHandler final:\n\tpublic cItemSeedsHandler\n{\n\tusing cItemSeedsHandler::cItemSeedsHandler;\n};\n\n\n\n"
  },
  {
    "path": "src/Items/ItemShears.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cItemShearsHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\n\n\tvirtual bool OnDiggingBlock(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tBLOCKTYPE Block;\n\t\tNIBBLETYPE BlockMeta;\n\t\tif (!a_World->GetBlockTypeMeta(a_ClickedBlockPos, Block, BlockMeta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif ((Block == E_BLOCK_LEAVES) || (Block == E_BLOCK_NEW_LEAVES))\n\t\t{\n\t\t\ta_World->DropBlockAsPickups(a_ClickedBlockPos, a_Player, &a_HeldItem);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\n\n\n\tvirtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) const override\n\t{\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_COBWEB:\n\t\t\tcase E_BLOCK_DEAD_BUSH:\n\t\t\tcase E_BLOCK_VINES:\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn Super::CanHarvestBlock(a_BlockType);\n\t}\n\n\n\n\n\n\tvirtual short GetDurabilityLossByAction(eDurabilityLostAction a_Action) const override\n\t{\n\t\tswitch (a_Action)\n\t\t{\n\t\t\tcase dlaAttackEntity:       return 0;\n\t\t\tcase dlaBreakBlock:         return 0;\n\t\t\tcase dlaBreakBlockInstant:  return 1;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported durability loss action\");\n\t}\n\n\n\n\n\n\tvirtual float GetBlockBreakingStrength(BLOCKTYPE a_Block) const override\n\t{\n\t\tif ((a_Block == E_BLOCK_COBWEB) || IsBlockMaterialLeaves(a_Block))\n\t\t{\n\t\t\treturn 15.0f;\n\t\t}\n\t\telse if (a_Block == E_BLOCK_WOOL)\n\t\t{\n\t\t\treturn 5.0f;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Super::GetBlockBreakingStrength(a_Block);\n\t\t}\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemShovel.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n\n\n#include \"../BlockInServerPluginInterface.h\"\n\n\n\n\n\nclass cItemShovelHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\n\n\tvirtual short GetDurabilityLossByAction(eDurabilityLostAction a_Action) const override\n\t{\n\t\tswitch (a_Action)\n\t\t{\n\t\t\tcase dlaAttackEntity:      return 2;\n\t\t\tcase dlaBreakBlock:        return 1;\n\t\t\tcase dlaBreakBlockInstant: return 0;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported durability loss action\");\n\t}\n\n\n\n\n\n\tvirtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) const override\n\t{\n\t\tif (a_BlockType == E_BLOCK_SNOW)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn Super::CanHarvestBlock(a_BlockType);\n\t}\n\n\n\n\n\n\tvirtual bool CanRepairWithRawMaterial(short a_ItemType) const override\n\t{\n\t\tswitch (m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_WOODEN_SHOVEL:  return (a_ItemType == E_BLOCK_PLANKS);\n\t\t\tcase E_ITEM_STONE_SHOVEL:   return (a_ItemType == E_BLOCK_COBBLESTONE);\n\t\t\tcase E_ITEM_IRON_SHOVEL:    return (a_ItemType == E_ITEM_IRON);\n\t\t\tcase E_ITEM_GOLD_SHOVEL:    return (a_ItemType == E_ITEM_GOLD);\n\t\t\tcase E_ITEM_DIAMOND_SHOVEL: return (a_ItemType == E_ITEM_DIAMOND);\n\t\t}\n\t\treturn false;\n\t}\n\n\n\n\n\n\tvirtual float GetBlockBreakingStrength(BLOCKTYPE a_Block) const override\n\t{\n\t\tswitch (a_Block)\n\t\t{\n\t\t\tcase E_BLOCK_CLAY:\n\t\t\tcase E_BLOCK_CONCRETE_POWDER:\n\t\t\tcase E_BLOCK_DIRT:\n\t\t\tcase E_BLOCK_FARMLAND:\n\t\t\tcase E_BLOCK_GRASS:\n\t\t\tcase E_BLOCK_GRASS_PATH:\n\t\t\tcase E_BLOCK_GRAVEL:\n\t\t\tcase E_BLOCK_MYCELIUM:\n\t\t\tcase E_BLOCK_SAND:\n\t\t\tcase E_BLOCK_SNOW:\n\t\t\tcase E_BLOCK_SNOW_BLOCK:\n\t\t\tcase E_BLOCK_SOULSAND:\n\t\t\t{\n\t\t\t\tswitch (m_ItemType)\n\t\t\t\t{\n\t\t\t\t\tcase E_ITEM_WOODEN_SHOVEL:  return 2.0f;\n\t\t\t\t\tcase E_ITEM_STONE_SHOVEL:   return 4.0f;\n\t\t\t\t\tcase E_ITEM_IRON_SHOVEL:    return 6.0f;\n\t\t\t\t\tcase E_ITEM_GOLD_SHOVEL:    return 12.0f;\n\t\t\t\t\tcase E_ITEM_DIAMOND_SHOVEL: return 8.0f;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn Super::GetBlockBreakingStrength(a_Block);\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemSideways.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockSideways.h\"\n\n\n\n\n\n/** Handler for blocks that have 3 orientations (hay bale, log), specified by the upper 2 bits in meta.\nHandles setting the correct orientation on placement.\nAdditionally supports the metadata specifying block sub-type in its lower 2 bits. */\nclass cItemSidewaysHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tstatic NIBBLETYPE BlockFaceToMetaData(eBlockFace a_BlockFace, NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_YM:\n\t\t\tcase BLOCK_FACE_YP:\n\t\t\t{\n\t\t\t\treturn a_Meta;  // Top or bottom, just return original.\n\t\t\t}\n\t\t\tcase BLOCK_FACE_ZP:\n\t\t\tcase BLOCK_FACE_ZM:\n\t\t\t{\n\t\t\t\treturn a_Meta | 0x8;  // North or south.\n\t\t\t}\n\t\t\tcase BLOCK_FACE_XP:\n\t\t\tcase BLOCK_FACE_XM:\n\t\t\t{\n\t\t\t\treturn a_Meta | 0x4;  // East or west.\n\t\t\t}\n\t\t\tdefault: UNREACHABLE(\"Unsupported block face\");\n\t\t}\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), BlockFaceToMetaData(a_ClickedBlockFace, static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage)));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemSign.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\nclass cItemSignHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t/** Converts the block face of the neighbor to which the wallsign is attached to the wallsign block's meta. */\n\tstatic NIBBLETYPE BlockFaceToMetaData(eBlockFace a_NeighborBlockFace)\n\t{\n\t\tswitch (a_NeighborBlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_ZM: return 0x02;\n\t\t\tcase BLOCK_FACE_ZP: return 0x03;\n\t\t\tcase BLOCK_FACE_XM: return 0x04;\n\t\t\tcase BLOCK_FACE_XP: return 0x05;\n\t\t\tcase BLOCK_FACE_NONE:\n\t\t\tcase BLOCK_FACE_YP:\n\t\t\tcase BLOCK_FACE_YM:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn 0x02;\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tif (a_ClickedBlockFace == BLOCK_FACE_TOP)\n\t\t{\n\t\t\tif (!a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_SIGN_POST, RotationToMetaData(a_Player.GetYaw())))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse if (!a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_WALLSIGN, BlockFaceToMetaData(a_ClickedBlockFace)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// After successfully placing the sign, open the sign editor for the player:\n\t\ta_Player.GetClientHandle()->SendEditSign(a_PlacePosition);\n\t\treturn true;\n\t}\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\t/** Converts the (player) rotation to placed-signpost block meta. */\n\tstatic NIBBLETYPE RotationToMetaData(double a_Rotation)\n\t{\n\t\ta_Rotation += 180 + (180.f / 16);  // So it's not aligned with axis.\n\t\tif (a_Rotation > 360)\n\t\t{\n\t\t\ta_Rotation -= 360;\n\t\t}\n\n\t\ta_Rotation = (a_Rotation / 360) * 16;\n\n\t\treturn static_cast<NIBBLETYPE>(a_Rotation) % 16;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Items/ItemSlab.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemSlabHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\t// Confer BlockSlab.h, which we're in cahoots with to make the below logic work.\n\n\t\t// If clicking a slab, combine it into a double-slab:\n\t\tif (cBlockSlabHandler::IsAnySlabType(a_Player.GetWorld()->GetBlock(a_PlacePosition)))\n\t\t{\n\t\t\tif (!a_Player.PlaceBlock(a_PlacePosition, GetDoubleSlabType(static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType)), static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage)))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ta_Player.SendBlocksAround(a_PlacePosition, 2);  // (see below)\n\t\t\treturn true;\n\t\t}\n\n\t\t// Set the correct metadata based on player equipped item:\n\t\tif (!a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), FaceToMetaData(static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage), a_ClickedBlockFace, a_CursorPosition)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t/* This is a workaround for versions < 1.13, where the client combines a slab in the\n\t\tdirection of the clicked block face of a block ignoring build collision, rather than replacing said block.\n\t\tResend blocks to the client to fix the bug.\n\t\tRef.: https://forum.cuberite.org/thread-434-post-17388.html#pid17388 */\n\t\ta_Player.SendBlocksAround(a_PlacePosition, 2);\n\n\t\treturn true;\n\t}\n\n\n\tstatic NIBBLETYPE FaceToMetaData(const NIBBLETYPE a_BaseMeta, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition)\n\t{\n\t\tswitch (a_ClickedBlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_TOP:\n\t\t\t{\n\t\t\t\t// Bottom half slab block:\n\t\t\t\treturn a_BaseMeta & 0x07;\n\t\t\t}\n\t\t\tcase BLOCK_FACE_BOTTOM:\n\t\t\t{\n\t\t\t\t// Top half slab block:\n\t\t\t\treturn a_BaseMeta | 0x08;\n\t\t\t}\n\t\t\tcase BLOCK_FACE_EAST:\n\t\t\tcase BLOCK_FACE_NORTH:\n\t\t\tcase BLOCK_FACE_SOUTH:\n\t\t\tcase BLOCK_FACE_WEST:\n\t\t\t{\n\t\t\t\tif (a_CursorPosition.y > 7)\n\t\t\t\t{\n\t\t\t\t\t// Cursor at top half of block, place top slab:\n\t\t\t\t\treturn a_BaseMeta | 0x08;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Cursor at bottom half of block, place bottom slab:\n\t\t\t\t\treturn a_BaseMeta & 0x07;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdefault: UNREACHABLE(\"Unhandled block face\");\n\t\t}\n\t}\n\n\n\t/** Converts the single-slab blocktype to its equivalent double-slab blocktype. */\n\tstatic BLOCKTYPE GetDoubleSlabType(BLOCKTYPE a_SingleSlabBlockType)\n\t{\n\t\tswitch (a_SingleSlabBlockType)\n\t\t{\n\t\t\tcase E_BLOCK_STONE_SLAB: return E_BLOCK_DOUBLE_STONE_SLAB;\n\t\t\tcase E_BLOCK_WOODEN_SLAB: return E_BLOCK_DOUBLE_WOODEN_SLAB;\n\t\t\tcase E_BLOCK_RED_SANDSTONE_SLAB: return E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB;\n\t\t\tcase E_BLOCK_PURPUR_SLAB: return E_BLOCK_PURPUR_DOUBLE_SLAB;\n\t\t}\n\t\tUNREACHABLE(\"Unhandled slab type\");\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemSnow.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemSnowHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tBLOCKTYPE Block;\n\t\tNIBBLETYPE Meta;\n\t\ta_Player.GetWorld()->GetBlockTypeMeta(a_PlacePosition, Block, Meta);\n\n\t\t// Check if incrementing existing snow height:\n\t\tif (Block == E_BLOCK_SNOW)\n\t\t{\n\t\t\tASSERT(Meta < 7);  // BlockSnow.h ensures that if we replace a snow layer, it won't be at max height.\n\t\t\tMeta++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// First time placement:\n\t\t\tMeta = 0;\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_SNOW, Meta);\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemSoup.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n#include \"../World.h\"\n\n\n\n\n\nclass cItemSoupHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemSoupHandler(int a_ItemType, FoodInfo a_FoodInfo):\n\t\tSuper(a_ItemType, a_FoodInfo)\n\t{\n\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\t// Skip over food handler, which does removal for us.\n\t\tif (!cItemHandler::EatItem(a_Player, a_Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->ReplaceOneEquippedItemTossRest(cItem(E_ITEM_BOWL));\n\t\t}\n\n\t\treturn true;\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemSpawnEgg.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cItemSpawnEggHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\t// Must click a valid block:\n\t\tif (a_ClickedBlockFace < 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tauto PlacementPos = AddFaceDirection(a_ClickedBlockPos, a_ClickedBlockFace);\n\t\tif (a_ClickedBlockFace == BLOCK_FACE_YM)\n\t\t{\n\t\t\tPlacementPos.y--;\n\t\t}\n\n\t\tauto MonsterType = ItemDamageToMonsterType(a_HeldItem.m_ItemDamage);\n\t\tif (\n\t\t\t(MonsterType != mtInvalidType) &&  // Valid monster type\n\t\t\t(a_World->SpawnMob(PlacementPos.x + 0.5, PlacementPos.y, PlacementPos.z + 0.5, MonsterType, false) != cEntity::INVALID_ID))  // Spawning succeeded\n\t\t{\n\t\t\tif (!a_Player->IsGameModeCreative())\n\t\t\t{\n\t\t\t\t// The mob was spawned, \"use\" the item:\n\t\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\n\n\n\t/** Converts the Spawn egg item damage to the monster type to spawn.\n\tReturns mtInvalidType for invalid damage values. */\n\tstatic eMonsterType ItemDamageToMonsterType(short a_ItemDamage)\n\t{\n\t\tswitch (a_ItemDamage)\n\t\t{\n\t\t\tcase E_META_SPAWN_EGG_BAT:             return mtBat;\n\t\t\tcase E_META_SPAWN_EGG_BLAZE:           return mtBlaze;\n\t\t\tcase E_META_SPAWN_EGG_CAVE_SPIDER:     return mtCaveSpider;\n\t\t\tcase E_META_SPAWN_EGG_CHICKEN:         return mtChicken;\n\t\t\tcase E_META_SPAWN_EGG_COW:             return mtCow;\n\t\t\tcase E_META_SPAWN_EGG_CREEPER:         return mtCreeper;\n\t\t\tcase E_META_SPAWN_EGG_ENDERMAN:        return mtEnderman;\n\t\t\tcase E_META_SPAWN_EGG_ENDERMITE:       return mtEndermite;\n\t\t\tcase E_META_SPAWN_EGG_GHAST:           return mtGhast;\n\t\t\tcase E_META_SPAWN_EGG_GUARDIAN:        return mtGuardian;\n\t\t\tcase E_META_SPAWN_EGG_HORSE:           return mtHorse;\n\t\t\tcase E_META_SPAWN_EGG_MAGMA_CUBE:      return mtMagmaCube;\n\t\t\tcase E_META_SPAWN_EGG_MOOSHROOM:       return mtMooshroom;\n\t\t\tcase E_META_SPAWN_EGG_OCELOT:          return mtOcelot;\n\t\t\tcase E_META_SPAWN_EGG_PIG:             return mtPig;\n\t\t\tcase E_META_SPAWN_EGG_RABBIT:          return mtRabbit;\n\t\t\tcase E_META_SPAWN_EGG_SHEEP:           return mtSheep;\n\t\t\tcase E_META_SPAWN_EGG_SILVERFISH:      return mtSilverfish;\n\t\t\tcase E_META_SPAWN_EGG_SKELETON:        return mtSkeleton;\n\t\t\tcase E_META_SPAWN_EGG_SLIME:           return mtSlime;\n\t\t\tcase E_META_SPAWN_EGG_SPIDER:          return mtSpider;\n\t\t\tcase E_META_SPAWN_EGG_SQUID:           return mtSquid;\n\t\t\tcase E_META_SPAWN_EGG_VILLAGER:        return mtVillager;\n\t\t\tcase E_META_SPAWN_EGG_WITCH:           return mtWitch;\n\t\t\tcase E_META_SPAWN_EGG_WITHER_SKELETON: return mtWitherSkeleton;\n\t\t\tcase E_META_SPAWN_EGG_WOLF:            return mtWolf;\n\t\t\tcase E_META_SPAWN_EGG_ZOMBIE:          return mtZombie;\n\t\t\tcase E_META_SPAWN_EGG_ZOMBIE_PIGMAN:   return mtZombiePigman;\n\t\t\tcase E_META_SPAWN_EGG_ZOMBIE_VILLAGER: return mtZombieVillager;\n\t\t\tdefault: return mtInvalidType;\n\t\t}\n\t}\n} ;\n"
  },
  {
    "path": "src/Items/ItemSpiderEye.h",
    "content": "\n#pragma once\n\n#include \"ItemFood.h\"\n\n\n\n\n\nclass cItemSpiderEyeHandler final:\n\tpublic cItemFoodHandler\n{\n\tusing Super = cItemFoodHandler;\n\npublic:\n\n\tconstexpr cItemSpiderEyeHandler(int a_ItemType):\n\t\tSuper(a_ItemType, FoodInfo(2, 3.2))\n\t{\n\t}\n\n\tvirtual bool EatItem(cPlayer * a_Player, cItem * a_Item) const override\n\t{\n\t\tif (!Super::EatItem(a_Player, a_Item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\ta_Player->AddEntityEffect(cEntityEffect::effPoison, 100, 0);\n\n\t\treturn true;\n\t}\n\n};\n"
  },
  {
    "path": "src/Items/ItemStairs.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockStairs.h\"\n\n\n\n\n\nclass cItemStairsHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tNIBBLETYPE Meta = cBlockStairsHandler::YawToMetaData(a_Player.GetYaw());\n\n\t\tswitch (a_ClickedBlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_TOP:    break;\n\t\t\tcase BLOCK_FACE_BOTTOM: Meta |= 0x4; break;  // When placing onto a bottom face, always place an upside-down stairs block.\n\t\t\tcase BLOCK_FACE_EAST:\n\t\t\tcase BLOCK_FACE_NORTH:\n\t\t\tcase BLOCK_FACE_SOUTH:\n\t\t\tcase BLOCK_FACE_WEST:\n\t\t\t{\n\t\t\t\t// When placing onto a sideways face, check cursor, if in top half, make it an upside-down stairs block:\n\t\t\t\tif (a_CursorPosition.y > 8)\n\t\t\t\t{\n\t\t\t\t\tMeta |= 0x4;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: UNREACHABLE(\"Unhandled block face\");\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), Meta);\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemSword.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"../BlockInfo.h\"\n\n\n\n\n\nclass cItemSwordHandler final :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\n\tvirtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) const override\n\t{\n\t\tif (a_BlockType == E_BLOCK_COBWEB)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn Super::CanHarvestBlock(a_BlockType);\n\t}\n\n\n\tvirtual bool CanRepairWithRawMaterial(short a_ItemType) const override\n\t{\n\t\tswitch (m_ItemType)\n\t\t{\n\t\t\tcase E_ITEM_WOODEN_SWORD:  return (a_ItemType == E_BLOCK_PLANKS);\n\t\t\tcase E_ITEM_STONE_SWORD:   return (a_ItemType == E_BLOCK_COBBLESTONE);\n\t\t\tcase E_ITEM_IRON_SWORD:    return (a_ItemType == E_ITEM_IRON);\n\t\t\tcase E_ITEM_GOLD_SWORD:    return (a_ItemType == E_ITEM_GOLD);\n\t\t\tcase E_ITEM_DIAMOND_SWORD: return (a_ItemType == E_ITEM_DIAMOND);\n\t\t}\n\t\treturn false;\n\t}\n\n\n\tvirtual short GetDurabilityLossByAction(eDurabilityLostAction a_Action) const override\n\t{\n\t\tswitch (a_Action)\n\t\t{\n\t\t\tcase dlaAttackEntity:       return 1;\n\t\t\tcase dlaBreakBlock:         return 2;\n\t\t\tcase dlaBreakBlockInstant:  return 0;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported durability loss action\");\n\t}\n\n\n\n\tvirtual float GetBlockBreakingStrength(BLOCKTYPE a_Block) const override\n\t{\n\t\tif (a_Block == E_BLOCK_COBWEB)\n\t\t{\n\t\t\treturn 15.0f;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (\n\t\t\t\tIsBlockMaterialPlants(a_Block) ||\n\t\t\t\tIsBlockMaterialVine(a_Block)   ||\n\t\t\t\tIsBlockMaterialLeaves(a_Block) ||\n\t\t\t\tIsBlockMaterialGourd(a_Block)\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn 1.5f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn 1.0f;\n\t\t\t}\n\t\t}\n\t}\n\n} ;\n"
  },
  {
    "path": "src/Items/ItemThrowable.h",
    "content": "\n// Declares the itemhandlers for throwable items: eggs, snowballs, ender pearls, and eyes of ender.\n\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Entities/ProjectileEntity.h\"\n\n\n\n\n\nclass cItemThrowableHandler:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cItemThrowableHandler(int a_ItemType, cProjectileEntity::eKind a_ProjectileKind, double a_SpeedCoeff):\n\t\tSuper(a_ItemType),\n\t\tm_ProjectileKind(a_ProjectileKind),\n\t\tm_SpeedCoeff(a_SpeedCoeff)\n\t{\n\t}\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tauto Pos = a_Player->GetThrowStartPos();\n\t\tauto Speed = a_Player->GetLookVector() * m_SpeedCoeff;\n\n\t\t// Create the projectile:\n\t\tif (a_World->CreateProjectile(Pos.x, Pos.y, Pos.z, m_ProjectileKind, a_Player, &a_Player->GetEquippedItem(), &Speed) == cEntity::INVALID_ID)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Play sound:\n\t\ta_World->BroadcastSoundEffect(\"entity.arrow.shoot\", a_Player->GetPosition() - Vector3d(0, a_Player->GetHeight(), 0), 0.5f, 0.4f / GetRandomProvider().RandReal(0.8f, 1.2f));\n\n\t\t// Remove from inventory\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n\nprotected:\n\n\t/** The kind of projectile to create when shooting */\n\tcProjectileEntity::eKind m_ProjectileKind;\n\n\t/** The speed multiplier (to the player's normalized look vector) to set for the new projectile. */\n\tdouble m_SpeedCoeff;\n\n\t~cItemThrowableHandler() = default;\n} ;\n\n\n\n\n\nclass cItemEggHandler final:\n\tpublic cItemThrowableHandler\n{\n\tusing Super = cItemThrowableHandler;\n\npublic:\n\n\tconstexpr cItemEggHandler(int a_ItemType):\n\t\tSuper(a_ItemType, cProjectileEntity::pkEgg, 30)\n\t{\n\t}\n} ;\n\n\n\n\nclass cItemSnowballHandler final:\n\tpublic cItemThrowableHandler\n{\n\tusing Super = cItemThrowableHandler;\n\npublic:\n\n\tconstexpr cItemSnowballHandler(int a_ItemType):\n\t\tSuper(a_ItemType, cProjectileEntity::pkSnowball, 30)\n\t{\n\t}\n} ;\n\n\n\n\n\nclass cItemEnderPearlHandler final:\n\tpublic cItemThrowableHandler\n{\n\tusing Super = cItemThrowableHandler;\n\npublic:\n\n\tconstexpr cItemEnderPearlHandler(int a_ItemType):\n\t\tSuper(a_ItemType, cProjectileEntity::pkEnderPearl, 30)\n\t{\n\t}\n} ;\n\n\n\n\n\nclass cItemBottleOEnchantingHandler final :\n\tpublic cItemThrowableHandler\n{\n\tusing Super = cItemThrowableHandler;\n\npublic:\n\n\tconstexpr cItemBottleOEnchantingHandler(int a_ItemType):\n\t\tSuper(a_ItemType, cProjectileEntity::pkExpBottle, 14)\n\t{\n\t}\n};\n\n\n\n\n\nclass cItemFireworkHandler final:\n\tpublic cItemThrowableHandler\n{\n\tusing Super = cItemThrowableHandler;\n\npublic:\n\n\tconstexpr cItemFireworkHandler(int a_ItemType):\n\t\tSuper(a_ItemType, cProjectileEntity::pkFirework, 0)\n\t{\n\t}\n\n\n\n\n\n\tvirtual bool OnItemUse(\n\t\tcWorld * a_World,\n\t\tcPlayer * a_Player,\n\t\tcBlockPluginInterface & a_PluginInterface,\n\t\tconst cItem & a_HeldItem,\n\t\tconst Vector3i a_ClickedBlockPos,\n\t\teBlockFace a_ClickedBlockFace\n\t) const override\n\t{\n\t\tif (a_World->GetBlock(a_ClickedBlockPos) == E_BLOCK_AIR)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (a_World->CreateProjectile(Vector3d(a_ClickedBlockPos) + Vector3d(0.5, 1, 0.5), m_ProjectileKind, a_Player, &a_Player->GetEquippedItem()) == 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!a_Player->IsGameModeCreative())\n\t\t{\n\t\t\ta_Player->GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemTorch.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockTorch.h\"\n\n\n\n\n\nclass cItemTorchHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t/** Converts the block face of the neighbor to which the torch is attached, to the torch block's meta. */\n\tstatic NIBBLETYPE BlockFaceToMetaData(eBlockFace a_BlockFace)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_TOP:    return E_META_TORCH_FLOOR;\n\t\t\tcase BLOCK_FACE_EAST:   return E_META_TORCH_EAST;\n\t\t\tcase BLOCK_FACE_WEST:   return E_META_TORCH_WEST;\n\t\t\tcase BLOCK_FACE_NORTH:  return E_META_TORCH_NORTH;\n\t\t\tcase BLOCK_FACE_SOUTH:  return E_META_TORCH_SOUTH;\n\t\t\tdefault: UNREACHABLE(\"Unsupported block face\");\n\t\t}\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tconst auto & World = *a_Player.GetWorld();\n\t\tBLOCKTYPE ClickedBlockType;\n\t\tNIBBLETYPE ClickedBlockMeta;\n\t\tWorld.GetBlockTypeMeta(AddFaceDirection(a_PlacePosition, a_ClickedBlockFace, true), ClickedBlockType, ClickedBlockMeta);\n\n\t\t// Try finding a suitable neighbor block face for the torch; start with the given one:\n\t\tif (!cBlockTorchHandler::CanBePlacedOn(ClickedBlockType, ClickedBlockMeta, a_ClickedBlockFace))\n\t\t{\n\t\t\t// Couldn't be placed on whatever face was clicked, last ditch resort - find another face:\n\t\t\ta_ClickedBlockFace = FindSuitableFace(World, a_PlacePosition);\n\t\t\tif (a_ClickedBlockFace == BLOCK_FACE_NONE)\n\t\t\t{\n\t\t\t\t// No attachable face found - don't place the torch:\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), BlockFaceToMetaData(a_ClickedBlockFace));\n\t}\n\n\n\t/** Returns a suitable neighbor's blockface to place the torch at the specified position.\n\tReturns BLOCK_FACE_NONE on failure. */\n\tstatic eBlockFace FindSuitableFace(const cWorld & a_World, const Vector3i a_Position)\n\t{\n\t\tfor (const auto Face : { BLOCK_FACE_ZM, BLOCK_FACE_XP, BLOCK_FACE_ZP, BLOCK_FACE_XM, BLOCK_FACE_YP })  // Loop through all faces in specific order.\n\t\t{\n\t\t\t// The direction of Face is relative to the direction the torch faces.\n\t\t\t// This is the position, computed inverted, that such a torch would attach to.\n\t\t\tconst auto NeighborPosition = AddFaceDirection(a_Position, Face, true);\n\n\t\t\tBLOCKTYPE NeighborBlockType;\n\t\t\tNIBBLETYPE NeighborBlockMeta;\n\t\t\ta_World.GetBlockTypeMeta(NeighborPosition, NeighborBlockType, NeighborBlockMeta);\n\n\t\t\tif (cBlockTorchHandler::CanBePlacedOn(NeighborBlockType, NeighborBlockMeta, Face))\n\t\t\t{\n\t\t\t\treturn Face;\n\t\t\t}\n\t\t}\n\n\t\treturn BLOCK_FACE_NONE;\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemTrapdoor.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n#include \"Blocks/BlockTrapdoor.h\"\n\n\n\n\n\nclass cItemTrapdoorHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tinline static NIBBLETYPE BlockFaceToMetaData(eBlockFace a_BlockFace)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_ZP: return 0x1;\n\t\t\tcase BLOCK_FACE_ZM: return 0x0;\n\t\t\tcase BLOCK_FACE_XP: return 0x3;\n\t\t\tcase BLOCK_FACE_XM: return 0x2;\n\t\t\tdefault: UNREACHABLE(\"Unsupported block face\");\n\t\t}\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tNIBBLETYPE Meta;\n\n\t\tif (a_ClickedBlockFace == BLOCK_FACE_YP)\n\t\t{\n\t\t\t// Trapdoor is placed on top of a block.\n\t\t\t// Engage yaw rotation to determine hinge direction:\n\t\t\tMeta = cBlockTrapdoorHandler::YawToMetaData(a_Player.GetYaw());\n\t\t}\n\t\telse if (a_ClickedBlockFace == BLOCK_FACE_YM)\n\t\t{\n\t\t\t// Trapdoor is placed on bottom of a block.\n\t\t\t// Engage yaw rotation to determine hinge direction, and toggle 'Move up half-block' bit on:\n\t\t\tMeta = cBlockTrapdoorHandler::YawToMetaData(a_Player.GetYaw()) | 0x8;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Placement on block sides; hinge direction is determined by which side was clicked:\n\t\t\tMeta = BlockFaceToMetaData(a_ClickedBlockFace);\n\n\t\t\tif (a_CursorPosition.y > 7)\n\t\t\t{\n\t\t\t\t// Trapdoor is placed on a higher half of a vertical block.\n\t\t\t\t// Toggle 'Move up half-block' bit on:\n\t\t\t\tMeta |= 0x8;\n\t\t\t}\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), Meta);\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemTripwireHook.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemTripwireHookHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tstatic NIBBLETYPE BlockFaceToMetaData(eBlockFace a_BlockFace)\n\t{\n\t\tswitch (a_BlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_XM: return 0x1;\n\t\t\tcase BLOCK_FACE_XP: return 0x3;\n\t\t\tcase BLOCK_FACE_ZM: return 0x2;\n\t\t\tcase BLOCK_FACE_ZP: return 0x0;\n\t\t\tdefault: UNREACHABLE(\"Unsupported block face\");\n\t\t}\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tif ((a_ClickedBlockFace == BLOCK_FACE_YP) || (a_ClickedBlockFace == BLOCK_FACE_YM))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_TRIPWIRE_HOOK, BlockFaceToMetaData(a_ClickedBlockFace));\n\t}\n};\n"
  },
  {
    "path": "src/Items/ItemVines.h",
    "content": "\n#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cItemVinesHandler final  :\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\tBLOCKTYPE Block;\n\t\tNIBBLETYPE Meta;\n\t\ta_Player.GetWorld()->GetBlockTypeMeta(a_PlacePosition, Block, Meta);\n\n\t\tNIBBLETYPE PlaceMeta;\n\t\tswitch (a_ClickedBlockFace)\n\t\t{\n\t\t\tcase BLOCK_FACE_NORTH: PlaceMeta = 0x1; break;\n\t\t\tcase BLOCK_FACE_SOUTH: PlaceMeta = 0x4; break;\n\t\t\tcase BLOCK_FACE_WEST:  PlaceMeta = 0x8; break;\n\t\t\tcase BLOCK_FACE_EAST:  PlaceMeta = 0x2; break;\n\t\t\tdefault: return false;\n\t\t}\n\n\t\tif (Block == E_BLOCK_VINES)\n\t\t{\n\t\t\tPlaceMeta |= Meta;\n\t\t}\n\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_VINES, PlaceMeta);\n\t}\n};\n"
  },
  {
    "path": "src/Items/SimplePlaceableItemHandler.h",
    "content": "#pragma once\n\n#include \"ItemHandler.h\"\n\n\n\n\n\nclass cSimplePlaceableItemHandler final:\n\tpublic cItemHandler\n{\n\tusing Super = cItemHandler;\n\npublic:\n\n\tconstexpr cSimplePlaceableItemHandler(int a_ItemType, BLOCKTYPE a_BlockType) :\n\t\tSuper(a_ItemType),\n\t\tm_BlockType(a_BlockType)\n\t{\n\t}\n\n\n\tvirtual bool IsPlaceable(void) const override\n\t{\n\t\treturn true;\n\t}\n\n\n\tvirtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const override\n\t{\n\t\treturn a_Player.PlaceBlock(a_PlacePosition, m_BlockType, 0);\n\t}\n\nprivate:\n\n\tBLOCKTYPE m_BlockType;\n};\n"
  },
  {
    "path": "src/JsonUtils.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"JsonUtils.h\"\n#include \"json/json.h\"\n\n#include <sstream>\n\n\nnamespace JsonUtils\n{\n\nAString WriteFastString(const Json::Value & a_Root)\n{\n\tJson::StreamWriterBuilder Builder;\n\tBuilder[\"commentStyle\"] = \"None\";\n\tBuilder[\"indentation\"] = \"\";\n\treturn Json::writeString(Builder, a_Root);\n}\n\n\n\n\n\nAString WriteStyledString(const Json::Value & a_Root)\n{\n\tJson::StreamWriterBuilder Builder;\n\treturn Json::writeString(Builder, a_Root);\n}\n\n\n\n\n\nbool ParseString(const AString & a_JsonStr, Json::Value & a_Root, AString * a_ErrorMsg)\n{\n\tJson::CharReaderBuilder Builder;\n\tstd::unique_ptr<Json::CharReader> Reader(Builder.newCharReader());\n\n\tconst char * Doc = a_JsonStr.data();\n\treturn Reader->parse(Doc, Doc + a_JsonStr.size(), &a_Root, a_ErrorMsg);\n}\n\n\n\n\n\nAString SerializeSingleValueJsonObject(\n\tconst AString & a_Key, const AString & a_Value)\n{\n\tJson::Value root;\n\troot[a_Key] = a_Value;\n\treturn JsonUtils::WriteFastString(root);\n}\n\n}  // namespace JsonUtils\n"
  },
  {
    "path": "src/JsonUtils.h",
    "content": "#pragma once\n\n// fwd:\nnamespace Json\n{\nclass Value;\n}\n\nnamespace JsonUtils\n{\n\nAString WriteFastString(const Json::Value & a_Root);\nAString WriteStyledString(const Json::Value & a_Root);\n\nbool ParseString(const AString & a_JsonStr, Json::Value & a_Root, AString * a_ErrorMsg = nullptr);\n\n/** Creates a Json string representing an object with the specified single value. */\nextern AString SerializeSingleValueJsonObject(const AString & a_Key, const AString & a_Value);\n\n}\n"
  },
  {
    "path": "src/LazyArray.h",
    "content": "\n#pragma once\n\n/** A dynamic array that defers allocation to the first modifying access.\nConst references from the array before allocation will all be to the same default constructed value.\nIt is therefore important that default constructed values are indistinguishable from each other. */\ntemplate <typename T>\nclass cLazyArray\n{\n\tstatic_assert((!std::is_reference<T>::value && !std::is_array<T>::value),\n\t\t\"cLazyArray<T>: T must be a value type\");\n\tstatic_assert(std::is_default_constructible<T>::value,\n\t\t\"cLazyArray<T>: T must be default constructible\");\npublic:\n\tusing value_type = T;\n\tusing pointer = T *;\n\tusing const_pointer = const T *;\n\tusing reference = T &;\n\tusing const_reference = const T &;\n\tusing size_type = int;\n\tusing iterator = pointer;\n\tusing const_iterator = const_pointer;\n\n\tcLazyArray(size_type a_Size) noexcept:\n\t\tm_Size{ a_Size }\n\t{\n\t\tASSERT(a_Size > 0);\n\t}\n\n\tcLazyArray(const cLazyArray & a_Other):\n\t\tm_Size{ a_Other.m_Size }\n\t{\n\t\tif (a_Other.IsStorageAllocated())\n\t\t{\n\t\t\t// Note that begin() will allocate the array to copy into\n\t\t\tstd::copy(a_Other.begin(), a_Other.end(), begin());\n\t\t}\n\t}\n\n\tcLazyArray(cLazyArray && a_Other) noexcept:\n\t\tm_Array{ std::move(a_Other.m_Array) },\n\t\tm_Size{ a_Other.m_Size }\n\t{\n\t}\n\n\tcLazyArray & operator = (const cLazyArray & a_Other)\n\t{\n\t\tcLazyArray(a_Other).swap(*this);\n\t\treturn *this;\n\t}\n\n\tcLazyArray & operator = (cLazyArray && a_Other) noexcept\n\t{\n\t\tm_Array = std::move(a_Other.m_Array);\n\t\tm_Size = a_Other.m_Size;\n\t\treturn *this;\n\t}\n\n\tT & operator [] (size_type a_Idx)\n\t{\n\t\tASSERT((0 <= a_Idx) && (a_Idx < m_Size));\n\t\treturn data()[a_Idx];\n\t}\n\n\tconst T & operator [] (size_type a_Idx) const\n\t{\n\t\treturn GetAt(a_Idx);\n\t}\n\n\t// STL style interface\n\n\tconst_iterator cbegin() const { return data(); }\n\titerator        begin()       { return data(); }\n\tconst_iterator  begin() const { return cbegin(); }\n\n\tconst_iterator cend() const { return data() + m_Size; }\n\titerator        end()       { return data() + m_Size; }\n\tconst_iterator  end() const { return cend(); }\n\n\tsize_type size() const noexcept { return m_Size; }\n\n\tconst T * data() const\n\t{\n\t\tif (m_Array == nullptr)\n\t\t{\n\t\t\tm_Array.reset(new T[ToUnsigned(m_Size)]);\n\t\t}\n\t\treturn m_Array.get();\n\t}\n\n\tT * data()\n\t{\n\t\tstatic_assert(!std::is_const<typename decltype(m_Array)::element_type>::value, \"\");\n\t\tconst cLazyArray * const_this = this;\n\t\treturn const_cast<T *>(const_this->data());\n\t}\n\n\tvoid swap(cLazyArray & a_Other) noexcept\n\t{\n\t\tstd::swap(m_Array, a_Other.m_Array);\n\t\tstd::swap(m_Size, a_Other.m_Size);\n\t}\n\n\tfriend void swap(cLazyArray & a_Lhs, cLazyArray & a_Rhs) noexcept\n\t{\n\t\ta_Lhs.swap(a_Rhs);\n\t}\n\n\t// Extra functions to help avoid allocation\n\n\t/** A const view of an element of the array. Never causes the array to allocate. */\n\tconst T & GetAt(size_type a_Idx) const\n\t{\n\t\tASSERT((0 <= a_Idx) && (a_Idx < m_Size));\n\t\tif (IsStorageAllocated())\n\t\t{\n\t\t\treturn data()[a_Idx];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatic const T DefaultValue;\n\t\t\treturn DefaultValue;\n\t\t}\n\t}\n\n\t/** Returns true if the array has already been allocated. */\n\tbool IsStorageAllocated() const noexcept { return (m_Array != nullptr); }\n\nprivate:\n\t// Mutable so const data() can allocate the array\n\tmutable std::unique_ptr<T[]> m_Array;\n\tsize_type m_Size;\n};\n\n"
  },
  {
    "path": "src/LightingThread.cpp",
    "content": "\n// LightingThread.cpp\n\n// Implements the cLightingThread class representing the thread that processes requests for lighting\n\n#include \"Globals.h\"\n#include \"LightingThread.h\"\n#include \"ChunkMap.h\"\n#include \"World.h\"\n#include \"BlockInfo.h\"\n\n\n\n\n\n/** Chunk data callback that takes the chunk data and puts them into cLightingThread's m_BlockTypes[] / m_HeightMap[]: */\nclass cReader :\n\tpublic cChunkDataCallback\n{\n\tvirtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData &) override\n\t{\n\t\tBLOCKTYPE * OutputRows = m_BlockTypes;\n\t\tint OutputIdx = m_ReadingChunkX + m_ReadingChunkZ * cChunkDef::Width * 3;\n\t\tfor (size_t i = 0; i != cChunkDef::NumSections; ++i)\n\t\t{\n\t\t\tconst auto Section = a_BlockData.GetSection(i);\n\t\t\tif (Section == nullptr)\n\t\t\t{\n\t\t\t\t// Skip to the next section\n\t\t\t\tOutputIdx += 9 * cChunkDef::SectionHeight * cChunkDef::Width;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (size_t OffsetY = 0; OffsetY != cChunkDef::SectionHeight; ++OffsetY)\n\t\t\t{\n\t\t\t\tfor (size_t Z = 0; Z != cChunkDef::Width; ++Z)\n\t\t\t\t{\n\t\t\t\t\tauto InPtr = Section->data() + Z * cChunkDef::Width + OffsetY * cChunkDef::Width * cChunkDef::Width;\n\t\t\t\t\tstd::copy_n(InPtr, cChunkDef::Width, OutputRows + OutputIdx * cChunkDef::Width);\n\n\t\t\t\t\tOutputIdx += 3;\n\t\t\t\t}\n\t\t\t\t// Skip into the next y-level in the 3x3 chunk blob; each level has cChunkDef::Width * 9 rows\n\t\t\t\t// We've already walked cChunkDef::Width * 3 in the \"for z\" cycle, that makes cChunkDef::Width * 6 rows left to skip\n\t\t\t\tOutputIdx += cChunkDef::Width * 6;\n\t\t\t}\n\t\t}\n\t}  // BlockTypes()\n\n\n\tvirtual void HeightMap(const cChunkDef::HeightMap & a_Heightmap) override\n\t{\n\t\t// Copy the entire heightmap, distribute it into the 3x3 chunk blob:\n\t\ttypedef struct {HEIGHTTYPE m_Row[16]; } ROW;\n\t\tconst ROW * InputRows  = reinterpret_cast<const ROW *>(a_Heightmap);\n\t\tROW * OutputRows = reinterpret_cast<ROW *>(m_HeightMap);\n\t\tint InputIdx = 0;\n\t\tint OutputIdx = m_ReadingChunkX + m_ReadingChunkZ * cChunkDef::Width * 3;\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tOutputRows[OutputIdx] = InputRows[InputIdx++];\n\t\t\tOutputIdx += 3;\n\t\t}  // for z\n\n\t\t// Find the highest block in the entire chunk, use it as a base for m_MaxHeight:\n\t\tHEIGHTTYPE MaxHeight = m_MaxHeight;\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(a_Heightmap); i++)\n\t\t{\n\t\t\tif (a_Heightmap[i] > MaxHeight)\n\t\t\t{\n\t\t\t\tMaxHeight = a_Heightmap[i];\n\t\t\t}\n\t\t}\n\t\tm_MaxHeight = MaxHeight;\n\t}\n\npublic:\n\tint m_ReadingChunkX;  // 0, 1 or 2; x-offset of the chunk we're reading from the BlockTypes start\n\tint m_ReadingChunkZ;  // 0, 1 or 2; z-offset of the chunk we're reading from the BlockTypes start\n\tHEIGHTTYPE m_MaxHeight;  // Maximum value in this chunk's heightmap\n\tBLOCKTYPE * m_BlockTypes;  // 3x3 chunks of block types, organized as a single XZY blob of data (instead of 3x3 XZY blobs)\n\tHEIGHTTYPE * m_HeightMap;  // 3x3 chunks of height map,  organized as a single XZY blob of data (instead of 3x3 XZY blobs)\n\n\tcReader(BLOCKTYPE * a_BlockTypes, HEIGHTTYPE * a_HeightMap) :\n\t\tm_ReadingChunkX(0),\n\t\tm_ReadingChunkZ(0),\n\t\tm_MaxHeight(0),\n\t\tm_BlockTypes(a_BlockTypes),\n\t\tm_HeightMap(a_HeightMap)\n\t{\n\t\tstd::fill_n(m_BlockTypes, cChunkDef::NumBlocks * 9, E_BLOCK_AIR);\n\t}\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLightingThread:\n\ncLightingThread::cLightingThread(cWorld & a_World):\n\tSuper(\"Lighting Executor\"),\n\tm_World(a_World),\n\tm_MaxHeight(0),\n\tm_NumSeeds(0)\n{\n}\n\n\n\n\n\ncLightingThread::~cLightingThread()\n{\n\tStop();\n}\n\n\n\n\n\nvoid cLightingThread::Stop(void)\n{\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tfor (cChunkStays::iterator itr = m_PendingQueue.begin(), end = m_PendingQueue.end(); itr != end; ++itr)\n\t\t{\n\t\t\t(*itr)->Disable();\n\t\t\tdelete *itr;\n\t\t}\n\t\tm_PendingQueue.clear();\n\t\tfor (cChunkStays::iterator itr = m_Queue.begin(), end = m_Queue.end(); itr != end; ++itr)\n\t\t{\n\t\t\t(*itr)->Disable();\n\t\t\tdelete *itr;\n\t\t}\n\t\tm_Queue.clear();\n\t}\n\tm_ShouldTerminate = true;\n\tm_evtItemAdded.Set();\n\n\tSuper::Stop();\n}\n\n\n\n\n\nvoid cLightingThread::QueueChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallbackAfter)\n{\n\tcChunkStay * ChunkStay = new cLightingChunkStay(*this, a_ChunkX, a_ChunkZ, std::move(a_CallbackAfter));\n\t{\n\t\t// The ChunkStay will enqueue itself using the QueueChunkStay() once it is fully loaded\n\t\t// In the meantime, put it into the PendingQueue so that it can be removed when stopping the thread\n\t\tcCSLock Lock(m_CS);\n\t\tm_PendingQueue.push_back(ChunkStay);\n\t}\n\tChunkStay->Enable(*m_World.GetChunkMap());\n}\n\n\n\n\n\nvoid cLightingThread::WaitForQueueEmpty(void)\n{\n\tcCSLock Lock(m_CS);\n\twhile (!m_ShouldTerminate && (!m_Queue.empty() || !m_PendingQueue.empty()))\n\t{\n\t\tcCSUnlock Unlock(Lock);\n\t\tm_evtQueueEmpty.Wait();\n\t}\n}\n\n\n\n\n\nsize_t cLightingThread::GetQueueLength(void)\n{\n\tcCSLock Lock(m_CS);\n\treturn m_Queue.size() + m_PendingQueue.size();\n}\n\n\n\n\n\nvoid cLightingThread::Execute(void)\n{\n\tfor (;;)\n\t{\n\t\t{\n\t\t\tcCSLock Lock(m_CS);\n\t\t\tif (m_Queue.empty())\n\t\t\t{\n\t\t\t\tcCSUnlock Unlock(Lock);\n\t\t\t\tm_evtItemAdded.Wait();\n\t\t\t}\n\t\t}\n\n\t\tif (m_ShouldTerminate)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Process one items from the queue:\n\t\tcLightingChunkStay * Item;\n\t\t{\n\t\t\tcCSLock Lock(m_CS);\n\t\t\tif (m_Queue.empty())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tItem = static_cast<cLightingChunkStay *>(m_Queue.front());\n\t\t\tm_Queue.pop_front();\n\t\t\tif (m_Queue.empty())\n\t\t\t{\n\t\t\t\tm_evtQueueEmpty.Set();\n\t\t\t}\n\t\t}  // CSLock(m_CS)\n\n\t\tLightChunk(*Item);\n\t\tItem->Disable();\n\t\tdelete Item;\n\t}\n}\n\n\n\n\n\nvoid cLightingThread::LightChunk(cLightingChunkStay & a_Item)\n{\n\t// If the chunk is already lit, skip it (report as success):\n\tif (m_World.IsChunkLighted(a_Item.m_ChunkX, a_Item.m_ChunkZ))\n\t{\n\t\tif (a_Item.m_CallbackAfter != nullptr)\n\t\t{\n\t\t\ta_Item.m_CallbackAfter->Call({a_Item.m_ChunkX, a_Item.m_ChunkZ}, true);\n\t\t}\n\t\treturn;\n\t}\n\n\tcChunkDef::BlockNibbles BlockLight, SkyLight;\n\n\tReadChunks(a_Item.m_ChunkX, a_Item.m_ChunkZ);\n\n\tPrepareBlockLight();\n\tCalcLight(m_BlockLight);\n\n\tPrepareSkyLight();\n\n\t/*\n\t// DEBUG: Save chunk data with highlighted seeds for visual inspection:\n\tcFile f4;\n\tif (\n\t\tf4.Open(fmt::format(FMT_STRING(\"Chunk_{}_{}_seeds.grab\"), a_Item.m_ChunkX, a_Item.m_ChunkZ), cFile::fmWrite)\n\t)\n\t{\n\t\tfor (int z = 0; z < cChunkDef::Width * 3; z++)\n\t\t{\n\t\t\tfor (int y = cChunkDef::Height / 2; y >= 0; y--)\n\t\t\t{\n\t\t\t\tunsigned char Seeds     [cChunkDef::Width * 3];\n\t\t\t\tmemcpy(Seeds, m_BlockTypes + y * BlocksPerYLayer + z * cChunkDef::Width * 3, cChunkDef::Width * 3);\n\t\t\t\tfor (int x = 0; x < cChunkDef::Width * 3; x++)\n\t\t\t\t{\n\t\t\t\t\tif (m_IsSeed1[y * BlocksPerYLayer + z * cChunkDef::Width * 3 + x])\n\t\t\t\t\t{\n\t\t\t\t\t\tSeeds[x] = E_BLOCK_DIAMOND_BLOCK;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tf4.Write(Seeds, cChunkDef::Width * 3);\n\t\t\t}\n\t\t}\n\t\tf4.Close();\n\t}\n\t//*/\n\n\tCalcLight(m_SkyLight);\n\n\t/*\n\t// DEBUG: Save XY slices of the chunk data and lighting for visual inspection:\n\tcFile f1, f2, f3;\n\tif (\n\t\tf1.Open(fmt::format(FMT_STRING(\"Chunk_{}_{}_data.grab\"), a_Item.m_ChunkX, a_Item.m_ChunkZ), cFile::fmWrite) &&\n\t\tf2.Open(fmt::format(FMT_STRING(\"Chunk_{}_{}_sky.grab\"),  a_Item.m_ChunkX, a_Item.m_ChunkZ), cFile::fmWrite) &&\n\t\tf3.Open(fmt::format(FMT_STRING(\"Chunk_{}_{}_glow.grab\"), a_Item.m_ChunkX, a_Item.m_ChunkZ), cFile::fmWrite)\n\t)\n\t{\n\t\tfor (int z = 0; z < cChunkDef::Width * 3; z++)\n\t\t{\n\t\t\tfor (int y = cChunkDef::Height / 2; y >= 0; y--)\n\t\t\t{\n\t\t\t\tf1.Write(m_BlockTypes + y * BlocksPerYLayer + z * cChunkDef::Width * 3, cChunkDef::Width * 3);\n\t\t\t\tunsigned char SkyLight  [cChunkDef::Width * 3];\n\t\t\t\tunsigned char BlockLight[cChunkDef::Width * 3];\n\t\t\t\tfor (int x = 0; x < cChunkDef::Width * 3; x++)\n\t\t\t\t{\n\t\t\t\t\tSkyLight[x]   = m_SkyLight  [y * BlocksPerYLayer + z * cChunkDef::Width * 3 + x] << 4;\n\t\t\t\t\tBlockLight[x] = m_BlockLight[y * BlocksPerYLayer + z * cChunkDef::Width * 3 + x] << 4;\n\t\t\t\t}\n\t\t\t\tf2.Write(SkyLight,   cChunkDef::Width * 3);\n\t\t\t\tf3.Write(BlockLight, cChunkDef::Width * 3);\n\t\t\t}\n\t\t}\n\t\tf1.Close();\n\t\tf2.Close();\n\t\tf3.Close();\n\t}\n\t//*/\n\n\tCompressLight(m_BlockLight, BlockLight);\n\tCompressLight(m_SkyLight, SkyLight);\n\n\tm_World.ChunkLighted(a_Item.m_ChunkX, a_Item.m_ChunkZ, BlockLight, SkyLight);\n\n\tif (a_Item.m_CallbackAfter != nullptr)\n\t{\n\t\ta_Item.m_CallbackAfter->Call({a_Item.m_ChunkX, a_Item.m_ChunkZ}, true);\n\t}\n}\n\n\n\n\n\nvoid cLightingThread::ReadChunks(int a_ChunkX, int a_ChunkZ)\n{\n\tcReader Reader(m_BlockTypes, m_HeightMap);\n\n\tfor (int z = 0; z < 3; z++)\n\t{\n\t\tReader.m_ReadingChunkZ = z;\n\t\tfor (int x = 0; x < 3; x++)\n\t\t{\n\t\t\tReader.m_ReadingChunkX = x;\n\t\t\tVERIFY(m_World.GetChunkData({a_ChunkX + x - 1, a_ChunkZ + z - 1}, Reader));\n\t\t}  // for z\n\t}  // for x\n\n\tmemset(m_BlockLight, 0, sizeof(m_BlockLight));\n\tmemset(m_SkyLight,   0, sizeof(m_SkyLight));\n\tm_MaxHeight = Reader.m_MaxHeight;\n}\n\n\n\n\n\nvoid cLightingThread::PrepareSkyLight(void)\n{\n\t// Clear seeds:\n\tmemset(m_IsSeed1, 0, sizeof(m_IsSeed1));\n\tm_NumSeeds = 0;\n\n\t// Fill the top of the chunk with all-light:\n\tif (m_MaxHeight < cChunkDef::Height - 1)\n\t{\n\t\tstd::fill(m_SkyLight + (m_MaxHeight + 1) * BlocksPerYLayer, m_SkyLight + ARRAYCOUNT(m_SkyLight), static_cast<NIBBLETYPE>(15));\n\t}\n\n\t// Walk every column that has all XZ neighbors\n\tfor (int z = 1; z < cChunkDef::Width * 3 - 1; z++)\n\t{\n\t\tint BaseZ = z * cChunkDef::Width * 3;\n\t\tfor (int x = 1; x < cChunkDef::Width * 3 - 1; x++)\n\t\t{\n\t\t\tint idx = BaseZ + x;\n\t\t\t// Find the lowest block in this column that receives full sunlight (go through transparent blocks):\n\t\t\tint Current = m_HeightMap[idx];\n\t\t\tASSERT(Current < cChunkDef::Height);\n\t\t\twhile (\n\t\t\t\t(Current >= 0) &&\n\t\t\t\tcBlockInfo::IsTransparent(m_BlockTypes[idx + Current * BlocksPerYLayer]) &&\n\t\t\t\t!cBlockInfo::IsSkylightDispersant(m_BlockTypes[idx + Current * BlocksPerYLayer])\n\t\t\t)\n\t\t\t{\n\t\t\t\tCurrent -= 1;  // Sunlight goes down unchanged through this block\n\t\t\t}\n\t\t\tCurrent += 1;  // Point to the last sunlit block, rather than the first non-transparent one\n\t\t\t// The other neighbors don't need transparent-block-checking. At worst we'll have a few dud seeds above the ground.\n\t\t\tint Neighbor1 = m_HeightMap[idx + 1] + 1;  // X + 1\n\t\t\tint Neighbor2 = m_HeightMap[idx - 1] + 1;  // X - 1\n\t\t\tint Neighbor3 = m_HeightMap[idx + cChunkDef::Width * 3] + 1;  // Z + 1\n\t\t\tint Neighbor4 = m_HeightMap[idx - cChunkDef::Width * 3] + 1;  // Z - 1\n\t\t\tint MaxNeighbor = std::max(std::max(Neighbor1, Neighbor2), std::max(Neighbor3, Neighbor4));  // Maximum of the four neighbors\n\n\t\t\t// Fill the column from m_MaxHeight to Current with all-light:\n\t\t\tfor (int y = m_MaxHeight, Index = idx + y * BlocksPerYLayer; y >= Current; y--, Index -= BlocksPerYLayer)\n\t\t\t{\n\t\t\t\tm_SkyLight[Index] = 15;\n\t\t\t}\n\n\t\t\t// Add Current as a seed:\n\t\t\tif (Current < cChunkDef::Height)\n\t\t\t{\n\t\t\t\tint CurrentIdx = idx + Current * BlocksPerYLayer;\n\t\t\t\tm_IsSeed1[CurrentIdx] = true;\n\t\t\t\tm_SeedIdx1[m_NumSeeds++] = static_cast<UInt32>(CurrentIdx);\n\t\t\t}\n\n\t\t\t// Add seed from Current up to the highest neighbor:\n\t\t\tfor (int y = Current + 1, Index = idx + y * BlocksPerYLayer; y < MaxNeighbor; y++, Index += BlocksPerYLayer)\n\t\t\t{\n\t\t\t\tm_IsSeed1[Index] = true;\n\t\t\t\tm_SeedIdx1[m_NumSeeds++] = static_cast<UInt32>(Index);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cLightingThread::PrepareBlockLight()\n{\n\t// Clear seeds:\n\tmemset(m_IsSeed1, 0, sizeof(m_IsSeed1));\n\tmemset(m_IsSeed2, 0, sizeof(m_IsSeed2));\n\tm_NumSeeds = 0;\n\n\t// Add each emissive block into the seeds:\n\tfor (int Idx = 0; Idx < (m_MaxHeight * BlocksPerYLayer); ++Idx)\n\t{\n\t\tif (cBlockInfo::GetLightValue(m_BlockTypes[Idx]) == 0)\n\t\t{\n\t\t\t// Not a light-emissive block\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Add current block as a seed:\n\t\tm_IsSeed1[Idx] = true;\n\t\tm_SeedIdx1[m_NumSeeds++] = static_cast<UInt32>(Idx);\n\n\t\t// Light it up:\n\t\tm_BlockLight[Idx] = cBlockInfo::GetLightValue(m_BlockTypes[Idx]);\n\t}\n}\n\n\n\n\n\nvoid cLightingThread::CalcLight(NIBBLETYPE * a_Light)\n{\n\tsize_t NumSeeds2 = 0;\n\twhile (m_NumSeeds > 0)\n\t{\n\t\t// Buffer 1 -> buffer 2\n\t\tmemset(m_IsSeed2, 0, sizeof(m_IsSeed2));\n\t\tNumSeeds2 = 0;\n\t\tCalcLightStep(a_Light, m_NumSeeds, m_IsSeed1, m_SeedIdx1, NumSeeds2, m_IsSeed2, m_SeedIdx2);\n\t\tif (NumSeeds2 == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Buffer 2 -> buffer 1\n\t\tmemset(m_IsSeed1, 0, sizeof(m_IsSeed1));\n\t\tm_NumSeeds = 0;\n\t\tCalcLightStep(a_Light, NumSeeds2, m_IsSeed2, m_SeedIdx2, m_NumSeeds, m_IsSeed1, m_SeedIdx1);\n\t}\n}\n\n\n\n\n\nvoid cLightingThread::CalcLightStep(\n\tNIBBLETYPE * a_Light,\n\tsize_t a_NumSeedsIn,    unsigned char * a_IsSeedIn,  unsigned int * a_SeedIdxIn,\n\tsize_t & a_NumSeedsOut, unsigned char * a_IsSeedOut, unsigned int * a_SeedIdxOut\n)\n{\n\tUNUSED(a_IsSeedIn);\n\tsize_t NumSeedsOut = 0;\n\tfor (size_t i = 0; i < a_NumSeedsIn; i++)\n\t{\n\t\tUInt32 SeedIdx = static_cast<UInt32>(a_SeedIdxIn[i]);\n\t\tint SeedX = SeedIdx % (cChunkDef::Width * 3);\n\t\tint SeedZ = (SeedIdx / (cChunkDef::Width * 3)) % (cChunkDef::Width * 3);\n\n\t\t// Propagate seed:\n\t\tif (SeedX < cChunkDef::Width * 3 - 1)\n\t\t{\n\t\t\tPropagateLight(a_Light, SeedIdx, SeedIdx + 1, NumSeedsOut, a_IsSeedOut, a_SeedIdxOut);\n\t\t}\n\t\tif (SeedX > 0)\n\t\t{\n\t\t\tPropagateLight(a_Light, SeedIdx, SeedIdx - 1, NumSeedsOut, a_IsSeedOut, a_SeedIdxOut);\n\t\t}\n\t\tif (SeedZ < cChunkDef::Width * 3 - 1)\n\t\t{\n\t\t\tPropagateLight(a_Light, SeedIdx, SeedIdx + cChunkDef::Width * 3, NumSeedsOut, a_IsSeedOut, a_SeedIdxOut);\n\t\t}\n\t\tif (SeedZ > 0)\n\t\t{\n\t\t\tPropagateLight(a_Light, SeedIdx, SeedIdx - cChunkDef::Width * 3, NumSeedsOut, a_IsSeedOut, a_SeedIdxOut);\n\t\t}\n\t\tif (SeedIdx < (cChunkDef::Height - 1) * BlocksPerYLayer)\n\t\t{\n\t\t\tPropagateLight(a_Light, SeedIdx, SeedIdx + BlocksPerYLayer, NumSeedsOut, a_IsSeedOut, a_SeedIdxOut);\n\t\t}\n\t\tif (SeedIdx >= BlocksPerYLayer)\n\t\t{\n\t\t\tPropagateLight(a_Light, SeedIdx, SeedIdx - BlocksPerYLayer, NumSeedsOut, a_IsSeedOut, a_SeedIdxOut);\n\t\t}\n\t}  // for i - a_SeedIdxIn[]\n\ta_NumSeedsOut = NumSeedsOut;\n}\n\n\n\n\n\nvoid cLightingThread::CompressLight(NIBBLETYPE * a_LightArray, NIBBLETYPE * a_ChunkLight)\n{\n\tint InIdx = cChunkDef::Width * 49;  // Index to the first nibble of the middle chunk in the a_LightArray\n\tint OutIdx = 0;\n\tfor (int y = 0; y < cChunkDef::Height; y++)\n\t{\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int x = 0; x < cChunkDef::Width; x += 2)\n\t\t\t{\n\t\t\t\ta_ChunkLight[OutIdx++] = static_cast<NIBBLETYPE>(a_LightArray[InIdx + 1] << 4) | a_LightArray[InIdx];\n\t\t\t\tInIdx += 2;\n\t\t\t}\n\t\t\tInIdx += cChunkDef::Width * 2;\n\t\t}\n\t\t// Skip into the next y-level in the 3x3 chunk blob; each level has cChunkDef::Width * 9 rows\n\t\t// We've already walked cChunkDef::Width * 3 in the \"for z\" cycle, that makes cChunkDef::Width * 6 rows left to skip\n\t\tInIdx += cChunkDef::Width * cChunkDef::Width * 6;\n\t}\n}\n\n\n\n\n\nvoid cLightingThread::PropagateLight(\n\tNIBBLETYPE * a_Light,\n\tunsigned int a_SrcIdx, unsigned int a_DstIdx,\n\tsize_t & a_NumSeedsOut, unsigned char * a_IsSeedOut, unsigned int * a_SeedIdxOut\n)\n{\n\tASSERT(a_SrcIdx < ARRAYCOUNT(m_SkyLight));\n\tASSERT(a_DstIdx < ARRAYCOUNT(m_BlockTypes));\n\n\tif (a_Light[a_SrcIdx] <= a_Light[a_DstIdx] + cBlockInfo::GetSpreadLightFalloff(m_BlockTypes[a_DstIdx]))\n\t{\n\t\t// We're not offering more light than the dest block already has\n\t\treturn;\n\t}\n\n\ta_Light[a_DstIdx] = a_Light[a_SrcIdx] - cBlockInfo::GetSpreadLightFalloff(m_BlockTypes[a_DstIdx]);\n\tif (!a_IsSeedOut[a_DstIdx])\n\t{\n\t\ta_IsSeedOut[a_DstIdx] = true;\n\t\ta_SeedIdxOut[a_NumSeedsOut++] = a_DstIdx;\n\t}\n}\n\n\n\n\n\nvoid cLightingThread::QueueChunkStay(cLightingChunkStay & a_ChunkStay)\n{\n\t// Move the ChunkStay from the Pending queue to the lighting queue.\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tm_PendingQueue.remove(&a_ChunkStay);\n\t\tm_Queue.push_back(&a_ChunkStay);\n\t}\n\tm_evtItemAdded.Set();\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cLightingThread::cLightingChunkStay:\n\ncLightingThread::cLightingChunkStay::cLightingChunkStay(cLightingThread & a_LightingThread, int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallbackAfter) :\n\tm_LightingThread(a_LightingThread),\n\tm_ChunkX(a_ChunkX),\n\tm_ChunkZ(a_ChunkZ),\n\tm_CallbackAfter(std::move(a_CallbackAfter))\n{\n\tAdd(a_ChunkX + 1, a_ChunkZ + 1);\n\tAdd(a_ChunkX + 1, a_ChunkZ);\n\tAdd(a_ChunkX + 1, a_ChunkZ - 1);\n\tAdd(a_ChunkX,     a_ChunkZ + 1);\n\tAdd(a_ChunkX,     a_ChunkZ);\n\tAdd(a_ChunkX,     a_ChunkZ - 1);\n\tAdd(a_ChunkX - 1, a_ChunkZ + 1);\n\tAdd(a_ChunkX - 1, a_ChunkZ);\n\tAdd(a_ChunkX - 1, a_ChunkZ - 1);\n}\n\n\n\n\n\nbool cLightingThread::cLightingChunkStay::OnAllChunksAvailable(void)\n{\n\tm_LightingThread.QueueChunkStay(*this);\n\n\t// Keep the ChunkStay alive:\n\treturn false;\n}\n\n\n\n\n\nvoid cLightingThread::cLightingChunkStay::OnDisabled(void)\n{\n\t// Nothing needed in this callback\n}\n\n\n\n\n"
  },
  {
    "path": "src/LightingThread.h",
    "content": "\n// LightingThread.h\n\n// Interfaces to the cLightingThread class representing the thread that processes requests for lighting\n\n/*\nLighting is done on whole chunks. For each chunk to be lighted, the whole 3x3 chunk area around it is read,\nthen it is processed, so that the middle chunk area has valid lighting, and the lighting is copied into the ChunkMap.\nLighting is calculated in full char arrays instead of nibbles, so that accessing the arrays is fast.\nLighting is calculated in a flood-fill fashion:\n1. Generate seeds from where the light spreads (full skylight / light-emitting blocks)\n2. For each seed:\n\t- Spread the light 1 block in each of the 6 cardinal directions, if the blocktype allows\n\t- If the recipient block has had lower lighting value than that being spread, make it a new seed\n3. Repeat step 2, until there are no more seeds\nThe seeds need two fast operations:\n\t- Check if a block at [x, y, z] is already a seed\n\t- Get the next seed in the row\nFor that reason it is stored in two arrays, one stores a bool saying a seed is in that position,\nthe other is an array of seed coords, encoded as a single int.\nStep 2 needs two separate storages for old seeds and new seeds, so there are two actual storages for that purpose,\ntheir content is swapped after each full step-2-cycle.\n\nThe thread has two queues of chunks that are to be lighted.\nThe first queue, m_Queue, is the only one that is publicly visible, chunks get queued there by external requests.\nThe second one, m_PostponedQueue, is for chunks that have been taken out of m_Queue and didn't have neighbors ready.\nChunks from m_PostponedQueue are moved back into m_Queue when their neighbors get valid, using the ChunkReady callback.\n*/\n\n\n\n#pragma once\n\n#include \"OSSupport/IsThread.h\"\n#include \"ChunkStay.h\"\n\n\n\n\n\n// fwd: \"cWorld.h\"\nclass cWorld;\n\n\n\n\n\nclass cLightingThread:\n\tpublic cIsThread\n{\n\tusing Super = cIsThread;\n\npublic:\n\n\tcLightingThread(cWorld & a_World);\n\tvirtual ~cLightingThread() override;\n\n\tvoid Stop(void);\n\n\t/** Queues the entire chunk for lighting.\n\tThe callback, if specified, is called after the lighting has been processed. */\n\tvoid QueueChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallbackAfter);\n\n\t/** Blocks until the queue is empty or the thread is terminated */\n\tvoid WaitForQueueEmpty(void);\n\n\tsize_t GetQueueLength(void);\n\nprotected:\n\n\tclass cLightingChunkStay :\n\t\tpublic cChunkStay\n\t{\n\tpublic:\n\t\tcLightingThread & m_LightingThread;\n\t\tint m_ChunkX;\n\t\tint m_ChunkZ;\n\t\tstd::unique_ptr<cChunkCoordCallback> m_CallbackAfter;\n\n\t\tcLightingChunkStay(cLightingThread & a_LightingThread, int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallbackAfter);\n\n\tprotected:\n\t\tvirtual void OnChunkAvailable(int a_ChunkX, int a_ChunkZ) override\n\t\t{\n\t\t\tUNUSED(a_ChunkX);\n\t\t\tUNUSED(a_ChunkZ);\n\t\t}\n\t\tvirtual bool OnAllChunksAvailable(void) override;\n\t\tvirtual void OnDisabled(void) override;\n\t} ;\n\n\ttypedef std::list<cChunkStay *> cChunkStays;\n\n\n\tcWorld & m_World;\n\n\t/** The mutex to protect m_Queue and m_PendingQueue */\n\tcCriticalSection m_CS;\n\n\t/** The ChunkStays that are loaded and are waiting to be lit. */\n\tcChunkStays m_Queue;\n\n\t/** The ChunkStays that are waiting for load. Used for stopping the thread. */\n\tcChunkStays m_PendingQueue;\n\n\tcEvent m_evtItemAdded;    // Set when queue is appended, or to stop the thread\n\tcEvent m_evtQueueEmpty;   // Set when the queue gets empty\n\n\t/** The highest block in the current 3x3 chunk data */\n\tHEIGHTTYPE m_MaxHeight;\n\n\n\t// Buffers for the 3x3 chunk data\n\t// These buffers alone are 1.7 MiB in size, therefore they cannot be located on the stack safely - some architectures may have only 1 MiB for stack, or even less\n\t// Placing the buffers into the object means that this object can light chunks only in one thread!\n\t// The blobs are XZY organized as a whole, instead of 3x3 XZY-organized subarrays ->\n\t//  -> This means data has to be scatterred when reading and gathered when writing!\n\tstatic const int BlocksPerYLayer = cChunkDef::Width * cChunkDef::Width * 3 * 3;\n\tBLOCKTYPE  m_BlockTypes[BlocksPerYLayer * cChunkDef::Height];\n\tNIBBLETYPE m_BlockLight[BlocksPerYLayer * cChunkDef::Height];\n\tNIBBLETYPE m_SkyLight  [BlocksPerYLayer * cChunkDef::Height];\n\tHEIGHTTYPE m_HeightMap [BlocksPerYLayer];\n\n\t// Seed management (5.7 MiB)\n\t// Two buffers, in each calc step one is set as input and the other as output, then in the next step they're swapped\n\t// Each seed is represented twice in this structure - both as a \"list\" and as a \"position\".\n\t// \"list\" allows fast traversal from seed to seed\n\t// \"position\" allows fast checking if a coord is already a seed\n\tunsigned char m_IsSeed1 [BlocksPerYLayer * cChunkDef::Height];\n\tunsigned int  m_SeedIdx1[BlocksPerYLayer * cChunkDef::Height];\n\tunsigned char m_IsSeed2 [BlocksPerYLayer * cChunkDef::Height];\n\tunsigned int  m_SeedIdx2[BlocksPerYLayer * cChunkDef::Height];\n\tsize_t m_NumSeeds;\n\n\tvirtual void Execute(void) override;\n\n\t/** Lights the entire chunk. If neighbor chunks don't exist, touches them and re-queues the chunk */\n\tvoid LightChunk(cLightingChunkStay & a_Item);\n\n\t/** Prepares m_BlockTypes and m_HeightMap data; zeroes out the light arrays */\n\tvoid ReadChunks(int a_ChunkX, int a_ChunkZ);\n\n\t/** Uses m_HeightMap to initialize the m_SkyLight[] data; fills in seeds for the skylight */\n\tvoid PrepareSkyLight(void);\n\n\t/** Uses m_BlockTypes to initialize the m_BlockLight[] data; fills in seeds for the blocklight */\n\tvoid PrepareBlockLight(void);\n\n\t/** Calculates light in the light array specified, using stored seeds */\n\tvoid CalcLight(NIBBLETYPE * a_Light);\n\n\t/** Does one step in the light calculation - one seed propagation and seed recalculation */\n\tvoid CalcLightStep(\n\t\tNIBBLETYPE * a_Light,\n\t\tsize_t a_NumSeedsIn,    unsigned char * a_IsSeedIn,  unsigned int * a_SeedIdxIn,\n\t\tsize_t & a_NumSeedsOut, unsigned char * a_IsSeedOut, unsigned int * a_SeedIdxOut\n\t);\n\n\t/** Compresses from 1-block-per-byte (faster calc) into 2-blocks-per-byte (MC storage): */\n\tvoid CompressLight(NIBBLETYPE * a_LightArray, NIBBLETYPE * a_ChunkLight);\n\n\tvoid PropagateLight(\n\t\tNIBBLETYPE * a_Light,\n\t\tunsigned int a_SrcIdx, unsigned int a_DstIdx,\n\t\tsize_t & a_NumSeedsOut, unsigned char * a_IsSeedOut, unsigned int * a_SeedIdxOut\n\t);\n\n\t/** Queues a chunkstay that has all of its chunks loaded.\n\tCalled by cLightingChunkStay when all of its chunks are loaded. */\n\tvoid QueueChunkStay(cLightingChunkStay & a_ChunkStay);\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/LineBlockTracer.cpp",
    "content": "\n// LineBlockTracer.cpp\n\n// Implements the cLineBlockTracer class representing a cBlockTracer that traces along a straight line between two points\n\n#include \"Globals.h\"\n#include \"LineBlockTracer.h\"\n#include \"BlockInfo.h\"\n#include \"World.h\"\n#include \"Chunk.h\"\n#include \"BoundingBox.h\"\n\n\n\n\n\ncLineBlockTracer::cLineBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks) :\n\tSuper(a_World, a_Callbacks),\n\tm_Start(),\n\tm_End(),\n\tm_Diff(),\n\tm_Dir(),\n\tm_Current(),\n\tm_CurrentFace(BLOCK_FACE_NONE)\n{\n}\n\n\n\n\n\nbool cLineBlockTracer::Trace(cWorld & a_World, cBlockTracer::cCallbacks & a_Callbacks, const Vector3d a_Start, const Vector3d a_End)\n{\n\tcLineBlockTracer Tracer(a_World, a_Callbacks);\n\treturn Tracer.Trace(a_Start, a_End);\n}\n\n\n\n\n\nbool cLineBlockTracer::LineOfSightTrace(cWorld & a_World, const Vector3d & a_Start, const Vector3d & a_End, int a_Sight)\n{\n\tstatic class LineOfSightCallbacks:\n\t\tpublic cLineBlockTracer::cCallbacks\n\t{\n\t\tbool m_IsAirOpaque;\n\t\tbool m_IsWaterOpaque;\n\t\tbool m_IsLavaOpaque;\n\tpublic:\n\t\tLineOfSightCallbacks(bool a_IsAirOpaque, bool a_IsWaterOpaque, bool a_IsLavaOpaque):\n\t\t\tm_IsAirOpaque(a_IsAirOpaque),\n\t\t\tm_IsWaterOpaque(a_IsWaterOpaque),\n\t\t\tm_IsLavaOpaque(a_IsLavaOpaque)\n\t\t{}\n\n\t\tvirtual bool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t\t{\n\t\t\tswitch (a_BlockType)\n\t\t\t{\n\t\t\t\tcase E_BLOCK_AIR:              return m_IsAirOpaque;\n\t\t\t\tcase E_BLOCK_LAVA:             return m_IsLavaOpaque;\n\t\t\t\tcase E_BLOCK_STATIONARY_LAVA:  return m_IsLavaOpaque;\n\t\t\t\tcase E_BLOCK_STATIONARY_WATER: return m_IsWaterOpaque;\n\t\t\t\tcase E_BLOCK_WATER:            return m_IsWaterOpaque;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t} callbacks(\n\t\t(a_Sight & losAir) == 0,\n\t\t(a_Sight & losWater) == 0,\n\t\t(a_Sight & losLava) == 0\n\t);\n\treturn Trace(a_World, callbacks, a_Start, a_End);\n}\n\n\n\n\n\nbool cLineBlockTracer::FirstSolidHitTrace(\n\tcWorld & a_World,\n\tconst Vector3d & a_Start, const Vector3d & a_End,\n\tVector3d & a_HitCoords,\n\tVector3i & a_HitBlockCoords, eBlockFace & a_HitBlockFace\n)\n{\n\tclass cSolidHitCallbacks:\n\t\tpublic cCallbacks\n\t{\n\tpublic:\n\t\tcSolidHitCallbacks(const Vector3d & a_CBStart, const Vector3d & a_CBEnd, Vector3d & a_CBHitCoords, Vector3i & a_CBHitBlockCoords, eBlockFace & a_CBHitBlockFace):\n\t\t\tm_Start(a_CBStart),\n\t\t\tm_End(a_CBEnd),\n\t\t\tm_HitCoords(a_CBHitCoords),\n\t\t\tm_HitBlockCoords(a_CBHitBlockCoords),\n\t\t\tm_HitBlockFace(a_CBHitBlockFace)\n\t\t{\n\t\t}\n\n\t\tvirtual bool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t\t{\n\t\t\tif (!cBlockInfo::IsSolid(a_BlockType))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// We hit a solid block, calculate the exact hit coords and abort trace:\n\t\t\tm_HitBlockCoords = a_BlockPos;\n\t\t\tm_HitBlockFace = a_EntryFace;\n\t\t\tcBoundingBox bb(a_BlockPos, a_BlockPos + Vector3i(1, 1, 1));  // Bounding box of the block hit\n\t\t\tdouble LineCoeff = 0;  // Used to calculate where along the line an intersection with the bounding box occurs\n\t\t\teBlockFace Face;  // Face hit\n\t\t\tif (!bb.CalcLineIntersection(m_Start, m_End, LineCoeff, Face))\n\t\t\t{\n\t\t\t\t// Math rounding errors have caused the calculation to miss the block completely, assume immediate hit\n\t\t\t\tLineCoeff = 0;\n\t\t\t}\n\t\t\tm_HitCoords = m_Start + (m_End - m_Start) * LineCoeff;  // Point where projectile goes into the hit block\n\t\t\treturn true;\n\t\t}\n\n\tprotected:\n\t\tconst Vector3d & m_Start;\n\t\tconst Vector3d & m_End;\n\t\tVector3d & m_HitCoords;\n\t\tVector3i & m_HitBlockCoords;\n\t\teBlockFace & m_HitBlockFace;\n\t} callbacks(a_Start, a_End, a_HitCoords, a_HitBlockCoords, a_HitBlockFace);\n\treturn !Trace(a_World, callbacks, a_Start, a_End);\n}\n\n\n\n\n\nbool cLineBlockTracer::Trace(const Vector3d a_Start, const Vector3d a_End)\n{\n\t// Initialize the member veriables:\n\tm_Start = a_Start;\n\tm_End = a_End;\n\tm_Dir.x = (m_Start.x < m_End.x) ? 1 : -1;\n\tm_Dir.y = (m_Start.y < m_End.y) ? 1 : -1;\n\tm_Dir.z = (m_Start.z < m_End.z) ? 1 : -1;\n\tm_CurrentFace = BLOCK_FACE_NONE;\n\n\t// Check the start coords, adjust into the world:\n\tif (m_Start.y < 0)\n\t{\n\t\tif (m_End.y < 0)\n\t\t{\n\t\t\t// Nothing to trace\n\t\t\tm_Callbacks->OnNoMoreHits();\n\t\t\treturn true;\n\t\t}\n\t\tFixStartBelowWorld();\n\t\tm_Callbacks->OnIntoWorld(m_Start);\n\t}\n\telse if (m_Start.y >= cChunkDef::Height)\n\t{\n\t\tif (m_End.y >= cChunkDef::Height)\n\t\t{\n\t\t\tm_Callbacks->OnNoMoreHits();\n\t\t\treturn true;\n\t\t}\n\t\tFixStartAboveWorld();\n\t\tm_Callbacks->OnIntoWorld(m_Start);\n\t}\n\n\tm_Current = m_Start.Floor();\n\n\tm_Diff = m_End -  m_Start;\n\n\t// The actual trace is handled with ChunkMapCS locked by calling our ChunkCallback for the specified chunk\n\tint BlockX = FloorC(m_Start.x);\n\tint BlockZ = FloorC(m_Start.z);\n\tint ChunkX, ChunkZ;\n\tcChunkDef::BlockToChunk(BlockX, BlockZ, ChunkX, ChunkZ);\n\treturn m_World->DoWithChunk(ChunkX, ChunkZ, [this](cChunk & a_Chunk) { return ChunkCallback(&a_Chunk); });\n}\n\n\n\n\n\nvoid cLineBlockTracer::FixStartAboveWorld(void)\n{\n\t// We must set the start Y to less than cChunkDef::Height so that it is considered inside the world later on\n\t// Therefore we use an EPS-offset from the height, as small as reasonably possible.\n\tconst double Height = static_cast<double>(cChunkDef::Height) - 0.00001;\n\tCalcXZIntersection(Height, m_Start.x, m_Start.z);\n\tm_Start.y = Height;\n}\n\n\n\n\n\nvoid cLineBlockTracer::FixStartBelowWorld(void)\n{\n\tCalcXZIntersection(0, m_Start.x, m_Start.z);\n\tm_Start.y = 0;\n}\n\n\n\n\n\nvoid cLineBlockTracer::CalcXZIntersection(double a_Y, double & a_IntersectX, double & a_IntersectZ)\n{\n\tdouble Ratio = (m_Start.y - a_Y) / (m_Start.y - m_End.y);\n\ta_IntersectX = m_Start.x + (m_End.x - m_Start.x) * Ratio;\n\ta_IntersectZ = m_Start.z + (m_End.z - m_Start.z) * Ratio;\n}\n\n\n\n\n\nbool cLineBlockTracer::MoveToNextBlock(void)\n{\n\t// Find out which of the current block's walls gets hit by the path:\n\tstatic const double EPS = 0.00001;\n\tenum\n\t{\n\t\tdirNONE,\n\t\tdirX,\n\t\tdirY,\n\t\tdirZ,\n\t} Direction = dirNONE;\n\n\t// Calculate the next YZ wall hit:\n\tdouble Coeff = 1;\n\tif (std::abs(m_Diff.x) > EPS)\n\t{\n\t\tdouble DestX = (m_Dir.x > 0) ? (m_Current.x + 1) : m_Current.x;\n\t\tdouble CoeffX = (DestX - m_Start.x) / m_Diff.x;\n\t\tif (CoeffX <= 1)  // We need to include equality for the last block in the trace\n\t\t{\n\t\t\tCoeff = CoeffX;\n\t\t\tDirection = dirX;\n\t\t}\n\t}\n\n\t// If the next XZ wall hit is closer, use it instead:\n\tif (std::abs(m_Diff.y) > EPS)\n\t{\n\t\tdouble DestY = (m_Dir.y > 0) ? (m_Current.y + 1) : m_Current.y;\n\t\tdouble CoeffY = (DestY - m_Start.y) / m_Diff.y;\n\t\tif (CoeffY <= Coeff)  // We need to include equality for the last block in the trace\n\t\t{\n\t\t\tCoeff = CoeffY;\n\t\t\tDirection = dirY;\n\t\t}\n\t}\n\n\t// If the next XY wall hit is closer, use it instead:\n\tif (std::abs(m_Diff.z) > EPS)\n\t{\n\t\tdouble DestZ = (m_Dir.z > 0) ? (m_Current.z + 1) : m_Current.z;\n\t\tdouble CoeffZ = (DestZ - m_Start.z) / m_Diff.z;\n\t\tif (CoeffZ <= Coeff)  // We need to include equality for the last block in the trace\n\t\t{\n\t\t\tDirection = dirZ;\n\t\t}\n\t}\n\n\t// Based on the wall hit, adjust the current coords\n\tswitch (Direction)\n\t{\n\t\tcase dirX:    m_Current.x += m_Dir.x; m_CurrentFace = (m_Dir.x > 0) ? BLOCK_FACE_XM : BLOCK_FACE_XP; break;\n\t\tcase dirY:    m_Current.y += m_Dir.y; m_CurrentFace = (m_Dir.y > 0) ? BLOCK_FACE_YM : BLOCK_FACE_YP; break;\n\t\tcase dirZ:    m_Current.z += m_Dir.z; m_CurrentFace = (m_Dir.z > 0) ? BLOCK_FACE_ZM : BLOCK_FACE_ZP; break;\n\t\tcase dirNONE: return false;\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cLineBlockTracer::ChunkCallback(cChunk * a_Chunk)\n{\n\tASSERT((m_Current.y >= 0) && (m_Current.y < cChunkDef::Height));  // This should be provided by FixStartAboveWorld() / FixStartBelowWorld()\n\n\t// This is the actual line tracing loop.\n\tfor (;;)\n\t{\n\t\t// Our caller (DoWithChunk callback) should never give nothing:\n\t\tASSERT(a_Chunk != nullptr);\n\n\t\t// Move to next block\n\t\tif (!MoveToNextBlock())\n\t\t{\n\t\t\t// We've reached the end\n\t\t\tm_Callbacks->OnNoMoreHits();\n\t\t\treturn true;\n\t\t}\n\n\t\tif ((m_Current.y < 0) || (m_Current.y >= cChunkDef::Height))\n\t\t{\n\t\t\t// We've gone out of the world, that's the end of this trace\n\t\t\tdouble IntersectX, IntersectZ;\n\t\t\tCalcXZIntersection(m_Current.y, IntersectX, IntersectZ);\n\t\t\tif (m_Callbacks->OnOutOfWorld({IntersectX, double(m_Current.y), IntersectZ}))\n\t\t\t{\n\t\t\t\t// The callback terminated the trace\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tm_Callbacks->OnNoMoreHits();\n\t\t\treturn true;\n\t\t}\n\n\t\t// Update the current chunk\n\t\ta_Chunk = a_Chunk->GetNeighborChunk(m_Current.x, m_Current.z);\n\t\tif (a_Chunk == nullptr)\n\t\t{\n\t\t\tm_Callbacks->OnNoChunk();\n\t\t\treturn false;\n\t\t}\n\n\t\t// Report the current block through the callbacks:\n\t\tif (a_Chunk->IsValid())\n\t\t{\n\t\t\tBLOCKTYPE BlockType;\n\t\t\tNIBBLETYPE BlockMeta;\n\t\t\tint RelX = m_Current.x - a_Chunk->GetPosX() * cChunkDef::Width;\n\t\t\tint RelZ = m_Current.z - a_Chunk->GetPosZ() * cChunkDef::Width;\n\t\t\ta_Chunk->GetBlockTypeMeta(RelX, m_Current.y, RelZ, BlockType, BlockMeta);\n\t\t\tif (m_Callbacks->OnNextBlock(m_Current, BlockType, BlockMeta, m_CurrentFace))\n\t\t\t{\n\t\t\t\t// The callback terminated the trace\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse if (m_Callbacks->OnNextBlockNoData(m_Current, m_CurrentFace))\n\t\t{\n\t\t\t// The callback terminated the trace\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n"
  },
  {
    "path": "src/LineBlockTracer.h",
    "content": "\n// LineBlockTracer.h\n\n// Declares the cLineBlockTracer class representing a cBlockTracer that traces along a straight line between two points\n\n\n\n\n\n#pragma once\n\n#include \"BlockTracer.h\"\n\n\n\n\n\n// fwd: Chunk.h\nclass cChunk;\n\n\n\n\n\nclass cLineBlockTracer:\n\tpublic cBlockTracer\n{\n\tusing Super = cBlockTracer;\n\npublic:\n\n\tenum eLineOfSight\n\t{\n\t\t// Bit flags used for LineOfSightTrace's Sight parameter:\n\t\tlosAir = 1,    // Can see through air\n\t\tlosWater = 2,  // Can see through water\n\t\tlosLava = 4,   // Can see through lava\n\n\t\t// Common combinations:\n\t\tlosAirWaterLava = losAir | losWater | losLava,\n\t\tlosAirWater = losAir | losWater,\n\t};\n\n\n\tcLineBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks);\n\n\t/** Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits()) */\n\tbool Trace(Vector3d a_Start, Vector3d a_End);\n\n\n\t// Utility functions for simple one-line usage:\n\n\t/** Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits()) */\n\tstatic bool Trace(cWorld & a_World, cCallbacks & a_Callbacks, const Vector3d a_Start, const Vector3d a_End);\n\n\t/** Returns true if the two positions are within line of sight (not obscured by blocks).\n\ta_Sight specifies which blocks are considered transparent for the trace, is an OR-combination of eLineOfSight constants. */\n\tstatic bool LineOfSightTrace(cWorld & a_World, const Vector3d & a_Start, const Vector3d & a_End, int a_Sight);\n\n\t/** Traces until the first solid block is hit (or until end, whichever comes first.\n\tIf a solid block was hit, returns true and fills a_HitCoords, a_HitBlockCoords and a_HitBlockFace.\n\tIf a_End is encountered without hitting any solid block, returns false and doesn't touch a_HitCoords, a_HitBlockCoords nor a_HitBlockFace.\n\ta_HitCoords is the exact coords of the hit,\n\ta_HitBlockCoords are the coords of the solid block that was hit,\n\ta_HitBlockFace is the face of the solid block that was hit. */\n\tstatic bool FirstSolidHitTrace(\n\t\tcWorld & a_World,\n\t\tconst Vector3d & a_Start, const Vector3d & a_End,\n\t\tVector3d & a_HitCoords,\n\t\tVector3i & a_HitBlockCoords,\n\t\teBlockFace & a_HitBlockFace\n\t);\n\nprotected:\n\t/** The start point of the trace */\n\tVector3d m_Start;\n\n\t/** The end point of the trace */\n\tVector3d m_End;\n\n\t/** The difference in coords, End - Start */\n\tVector3d m_Diff;\n\n\t/** The increment at which the block coords are going from Start to End; either +1 or -1 */\n\tVector3i m_Dir;\n\n\t/** The current block */\n\tVector3i m_Current;\n\n\t/** The face through which the current block has been entered */\n\teBlockFace m_CurrentFace;\n\n\n\t/** Adjusts the start point above the world to just at the world's top */\n\tvoid FixStartAboveWorld(void);\n\n\t/** Adjusts the start point below the world to just at the world's bottom */\n\tvoid FixStartBelowWorld(void);\n\n\t/** Calculates the XZ coords of an intersection with the specified Yconst plane; assumes that such an intersection exists */\n\tvoid CalcXZIntersection(double a_Y, double & a_IntersectX, double & a_IntersectZ);\n\n\t/** Moves m_Current to the next block on the line; returns false if no move is possible (reached the end) */\n\tbool MoveToNextBlock(void);\n\n\tbool ChunkCallback(cChunk * a_Chunk);\n} ;\n\n\n\n"
  },
  {
    "path": "src/LinearInterpolation.cpp",
    "content": "\n// LinearInterpolation.cpp\n\n// Implements methods for linear interpolation over 1D, 2D and 3D arrays\n\n#include \"Globals.h\"\n#include \"LinearInterpolation.h\"\n\n\n\n\n\n/*\n// Perform an automatic test upon program start (use breakpoints to debug):\n\nextern void Debug3DNoise(float * a_Noise, int a_SizeX, int a_SizeY, int a_SizeZ, const AString & a_FileNameBase);\n\nclass Test\n{\npublic:\n\tTest(void)\n\t{\n\t\t// DoTest1();\n\t\tDoTest2();\n\t}\n\n\n\tvoid DoTest1(void)\n\t{\n\t\tfloat In[8] = {0, 1, 2, 3, 1, 2, 2, 2};\n\t\tfloat Out[3 * 3 * 3];\n\t\tLinearInterpolate1DArray(In, 4, Out, 9);\n\t\tLinearInterpolate2DArray(In, 2, 2, Out, 3, 3);\n\t\tLinearInterpolate3DArray(In, 2, 2, 2, Out, 3, 3, 3);\n\t\tLOGD(\"Out[0]: %f\", Out[0]);\n\t}\n\n\n\tvoid DoTest2(void)\n\t{\n\t\tfloat In[3 * 3 * 3];\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(In); i++)\n\t\t{\n\t\t\tIn[i] = (float)(i % 5);\n\t\t}\n\t\tfloat Out[15 * 16 * 17];\n\t\tLinearInterpolate3DArray(In, 3, 3, 3, Out, 15, 16, 17);\n\t\tDebug3DNoise(Out, 15, 16, 17, \"LERP test\");\n\t}\n} gTest;\n//*/\n\n\n\n\n\n// Puts linearly interpolated values from one array into another array. 1D version\nvoid LinearInterpolate1DArray(\n\tfloat * a_Src,\n\tint a_SrcSizeX,\n\tfloat * a_Dst,\n\tint a_DstSizeX\n)\n{\n\ta_Dst[0] = a_Src[0];\n\tint DstSizeXm1 = a_DstSizeX - 1;\n\tint SrcSizeXm1 = a_SrcSizeX - 1;\n\tfloat fDstSizeXm1 = static_cast<float>(DstSizeXm1);\n\tfloat fSrcSizeXm1 = static_cast<float>(SrcSizeXm1);\n\tfor (int x = 1; x < DstSizeXm1; x++)\n\t{\n\t\tint SrcIdx = x * SrcSizeXm1 / DstSizeXm1;\n\t\tfloat ValLo = a_Src[SrcIdx];\n\t\tfloat ValHi = a_Src[SrcIdx + 1];\n\t\tfloat Ratio = static_cast<float>(x) * fSrcSizeXm1 / fDstSizeXm1 - SrcIdx;\n\t\ta_Dst[x] = ValLo + (ValHi - ValLo) * Ratio;\n\t}\n\ta_Dst[a_DstSizeX - 1] = a_Src[a_SrcSizeX - 1];\n}\n\n\n\n\n\n// Puts linearly interpolated values from one array into another array. 2D version\nvoid LinearInterpolate2DArray(\n\tfloat * a_Src,\n\tint a_SrcSizeX, int a_SrcSizeY,\n\tfloat * a_Dst,\n\tint a_DstSizeX, int a_DstSizeY\n)\n{\n\tASSERT(a_DstSizeX > 0);\n\tASSERT(a_DstSizeX < MAX_INTERPOL_SIZEX);\n\tASSERT(a_DstSizeY > 0);\n\tASSERT(a_DstSizeY < MAX_INTERPOL_SIZEY);\n\n\t// Calculate interpolation ratios and src indices along each axis:\n\tfloat RatioX[MAX_INTERPOL_SIZEX];\n\tfloat RatioY[MAX_INTERPOL_SIZEY];\n\tint   SrcIdxX[MAX_INTERPOL_SIZEX];\n\tint   SrcIdxY[MAX_INTERPOL_SIZEY];\n\tfor (int x = 1; x < a_DstSizeX; x++)\n\t{\n\t\tSrcIdxX[x] = x * (a_SrcSizeX - 1) / (a_DstSizeX - 1);\n\t\tRatioX[x] = (static_cast<float>(x * (a_SrcSizeX - 1)) / (a_DstSizeX - 1)) - SrcIdxX[x];\n\t}\n\tfor (int y = 1; y < a_DstSizeY; y++)\n\t{\n\t\tSrcIdxY[y] = y * (a_SrcSizeY - 1) / (a_DstSizeY - 1);\n\t\tRatioY[y] = (static_cast<float>(y * (a_SrcSizeY - 1)) / (a_DstSizeY - 1)) - SrcIdxY[y];\n\t}\n\n\t// Special values at the ends. Notice especially the last indices being (size - 2) with ratio set to 1, to avoid index overflow:\n\tSrcIdxX[0] = 0;\n\tRatioX[0] = 0;\n\tSrcIdxY[0] = 0;\n\tRatioY[0] = 0;\n\tSrcIdxX[a_DstSizeX - 1] = a_SrcSizeX - 2;\n\tRatioX[a_DstSizeX - 1] = 1;\n\tSrcIdxY[a_DstSizeY - 1] = a_SrcSizeY - 2;\n\tRatioY[a_DstSizeY - 1] = 1;\n\n\t// Output all the dst array values using the indices and ratios:\n\tint idx = 0;\n\tfor (int y = 0; y < a_DstSizeY; y++)\n\t{\n\t\tint idxLoY = a_SrcSizeX * SrcIdxY[y];\n\t\tint idxHiY = a_SrcSizeX * (SrcIdxY[y] + 1);\n\t\tfloat ry = RatioY[y];\n\t\tfor (int x = 0; x < a_DstSizeX; x++)\n\t\t{\n\t\t\t// The four src corners of the current \"cell\":\n\t\t\tfloat LoXLoY = a_Src[SrcIdxX[x] +     idxLoY];\n\t\t\tfloat HiXLoY = a_Src[SrcIdxX[x] + 1 + idxLoY];\n\t\t\tfloat LoXHiY = a_Src[SrcIdxX[x] +     idxHiY];\n\t\t\tfloat HiXHiY = a_Src[SrcIdxX[x] + 1 + idxHiY];\n\n\t\t\t// Linear interpolation along the X axis:\n\t\t\tfloat InterpXLoY = LoXLoY + (HiXLoY - LoXLoY) * RatioX[x];\n\t\t\tfloat InterpXHiY = LoXHiY + (HiXHiY - LoXHiY) * RatioX[x];\n\n\t\t\t// Linear interpolation along the Y axis:\n\t\t\ta_Dst[idx] = InterpXLoY + (InterpXHiY - InterpXLoY) * ry;\n\t\t\tidx += 1;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid LinearInterpolate3DArray(\n\tfloat * a_Src,\n\tint a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ,\n\tfloat * a_Dst,\n\tint a_DstSizeX, int a_DstSizeY, int a_DstSizeZ\n)\n{\n\tASSERT(a_DstSizeX > 0);\n\tASSERT(a_DstSizeX < MAX_INTERPOL_SIZEX);\n\tASSERT(a_DstSizeY > 0);\n\tASSERT(a_DstSizeY < MAX_INTERPOL_SIZEY);\n\tASSERT(a_DstSizeZ > 0);\n\tASSERT(a_DstSizeZ < MAX_INTERPOL_SIZEZ);\n\n\t// Calculate interpolation ratios and src indices along each axis:\n\tfloat RatioX[MAX_INTERPOL_SIZEX];\n\tfloat RatioY[MAX_INTERPOL_SIZEY];\n\tfloat RatioZ[MAX_INTERPOL_SIZEZ];\n\tint   SrcIdxX[MAX_INTERPOL_SIZEX];\n\tint   SrcIdxY[MAX_INTERPOL_SIZEY];\n\tint   SrcIdxZ[MAX_INTERPOL_SIZEZ];\n\tfor (int x = 1; x < a_DstSizeX; x++)\n\t{\n\t\tSrcIdxX[x] = x * (a_SrcSizeX - 1) / (a_DstSizeX - 1);\n\t\tRatioX[x] = (static_cast<float>(x * (a_SrcSizeX - 1)) / (a_DstSizeX - 1)) - SrcIdxX[x];\n\t}\n\tfor (int y = 1; y < a_DstSizeY; y++)\n\t{\n\t\tSrcIdxY[y] = y * (a_SrcSizeY - 1) / (a_DstSizeY - 1);\n\t\tRatioY[y] = (static_cast<float>(y * (a_SrcSizeY - 1)) / (a_DstSizeY - 1)) - SrcIdxY[y];\n\t}\n\tfor (int z = 1; z < a_DstSizeZ; z++)\n\t{\n\t\tSrcIdxZ[z] = z * (a_SrcSizeZ - 1) / (a_DstSizeZ - 1);\n\t\tRatioZ[z] = (static_cast<float>(z * (a_SrcSizeZ - 1)) / (a_DstSizeZ - 1)) - SrcIdxZ[z];\n\t}\n\n\t// Special values at the ends. Notice especially the last indices being (size - 2) with ratio set to 1, to avoid index overflow:\n\tSrcIdxX[0] = 0;\n\tRatioX[0]  = 0;\n\tSrcIdxY[0] = 0;\n\tRatioY[0]  = 0;\n\tSrcIdxZ[0] = 0;\n\tRatioZ[0]  = 0;\n\tSrcIdxX[a_DstSizeX - 1] = a_SrcSizeX - 2;\n\tRatioX[a_DstSizeX - 1]  = 1;\n\tSrcIdxY[a_DstSizeY - 1] = a_SrcSizeY - 2;\n\tRatioY[a_DstSizeY - 1]  = 1;\n\tSrcIdxZ[a_DstSizeZ - 1] = a_SrcSizeZ - 2;\n\tRatioZ[a_DstSizeZ - 1]  = 1;\n\n\t// Output all the dst array values using the indices and ratios:\n\tint idx = 0;\n\tfor (int z = 0; z < a_DstSizeZ; z++)\n\t{\n\t\tint idxLoZ = a_SrcSizeX * a_SrcSizeY * SrcIdxZ[z];\n\t\tint idxHiZ = a_SrcSizeX * a_SrcSizeY * (SrcIdxZ[z] + 1);\n\t\tfloat rz = RatioZ[z];\n\t\tfor (int y = 0; y < a_DstSizeY; y++)\n\t\t{\n\t\t\tint idxLoY = a_SrcSizeX * SrcIdxY[y];\n\t\t\tint idxHiY = a_SrcSizeX * (SrcIdxY[y] + 1);\n\t\t\tfloat ry = RatioY[y];\n\t\t\tfor (int x = 0; x < a_DstSizeX; x++)\n\t\t\t{\n\t\t\t\t// The eight src corners of the current \"cell\":\n\t\t\t\tfloat LoXLoYLoZ = a_Src[SrcIdxX[x] +     idxLoY + idxLoZ];\n\t\t\t\tfloat HiXLoYLoZ = a_Src[SrcIdxX[x] + 1 + idxLoY + idxLoZ];\n\t\t\t\tfloat LoXHiYLoZ = a_Src[SrcIdxX[x] +     idxHiY + idxLoZ];\n\t\t\t\tfloat HiXHiYLoZ = a_Src[SrcIdxX[x] + 1 + idxHiY + idxLoZ];\n\t\t\t\tfloat LoXLoYHiZ = a_Src[SrcIdxX[x] +     idxLoY + idxHiZ];\n\t\t\t\tfloat HiXLoYHiZ = a_Src[SrcIdxX[x] + 1 + idxLoY + idxHiZ];\n\t\t\t\tfloat LoXHiYHiZ = a_Src[SrcIdxX[x] +     idxHiY + idxHiZ];\n\t\t\t\tfloat HiXHiYHiZ = a_Src[SrcIdxX[x] + 1 + idxHiY + idxHiZ];\n\n\t\t\t\t// Linear interpolation along the Z axis:\n\t\t\t\tfloat LoXLoYInZ = LoXLoYLoZ + (LoXLoYHiZ - LoXLoYLoZ) * rz;\n\t\t\t\tfloat HiXLoYInZ = HiXLoYLoZ + (HiXLoYHiZ - HiXLoYLoZ) * rz;\n\t\t\t\tfloat LoXHiYInZ = LoXHiYLoZ + (LoXHiYHiZ - LoXHiYLoZ) * rz;\n\t\t\t\tfloat HiXHiYInZ = HiXHiYLoZ + (HiXHiYHiZ - HiXHiYLoZ) * rz;\n\n\t\t\t\t// Linear interpolation along the Y axis:\n\t\t\t\tfloat LoXInYInZ = LoXLoYInZ + (LoXHiYInZ - LoXLoYInZ) * ry;\n\t\t\t\tfloat HiXInYInZ = HiXLoYInZ + (HiXHiYInZ - HiXLoYInZ) * ry;\n\n\t\t\t\t// Linear interpolation along the X axis:\n\t\t\t\ta_Dst[idx] = LoXInYInZ + (HiXInYInZ - LoXInYInZ) * RatioX[x];\n\t\t\t\tidx += 1;\n\t\t\t}  // for x\n\t\t}  // for y\n\t}  // for z\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/LinearInterpolation.h",
    "content": "\n// LinearInterpolation.h\n\n// Declares methods for linear interpolation over 1D, 2D and 3D arrays\n\n\n\n\n\n#pragma once\n\n\n\n\n\n// 2D and 3D Interpolation is optimized by precalculating the ratios into static-sized arrays\n// These arrays enforce a max size of the dest array, but the limits are settable here:\nconst int MAX_INTERPOL_SIZEX = 256;  ///< Maximum X-size of the interpolated array\nconst int MAX_INTERPOL_SIZEY = 512;  ///< Maximum Y-size of the interpolated array\nconst int MAX_INTERPOL_SIZEZ = 256;  ///< Maximum Z-size of the interpolated array\n\n\n\n\n\n/** Puts linearly interpolated values from one array into another array. 1D version */\nvoid LinearInterpolate1DArray(\n\tfloat * a_Src,   ///< Src array\n\tint a_SrcSizeX,  ///< Count of the src array\n\tfloat * a_Dst,   ///< Src array\n\tint a_DstSizeX   ///< Count of the dst array\n);\n\n\n\n\n\n/** Puts linearly interpolated values from one array into another array. 2D version */\nvoid LinearInterpolate2DArray(\n\tfloat * a_Src,                   ///< Src array, [x + a_SrcSizeX * y]\n\tint a_SrcSizeX, int a_SrcSizeY,  ///< Count of the src array, in each direction\n\tfloat * a_Dst,                   ///< Dst array, [x + a_DstSizeX * y]\n\tint a_DstSizeX, int a_DstSizeY   ///< Count of the dst array, in each direction\n);\n\n\n\n\n\n/** Puts linearly interpolated values from one array into another array. 3D version */\nvoid LinearInterpolate3DArray(\n\tfloat * a_Src,                                   ///< Src array, [x + a_SrcSizeX * y + a_SrcSizeX * a_SrcSizeY * z]\n\tint a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ,  ///< Count of the src array, in each direction\n\tfloat * a_Dst,                                   ///< Dst array, [x + a_DstSizeX * y + a_DstSizeX * a_DstSizeY * z]\n\tint a_DstSizeX, int a_DstSizeY, int a_DstSizeZ   ///< Count of the dst array, in each direction\n);\n\n\n\n\n"
  },
  {
    "path": "src/LinearUpscale.h",
    "content": "\n// LinearUpscale.h\n\n// Declares the functions for linearly upscaling arrays\n\n/*\nUpscaling means that the array is divided into same-size \"cells\", and each cell is\nlinearly interpolated between its corners. The array's dimensions are therefore\n1 + CellSize * NumCells, for each direction.\n\nUpscaling is more efficient than linear interpolation, because the cell sizes are integral\nand therefore the cells' boundaries are on the array points.\n\nHowever, upscaling usually requires generating the \"1 +\" in each direction.\n\nUpscaling is implemented in templates, so that it's compatible with multiple datatypes.\nTherefore, there is no cpp file.\n\nInPlace upscaling works on a single array and assumes that the values to work on have already\nbeen interspersed into the array to the cell boundaries.\nSpecifically, a_Array[x * AnchorStepX + y * AnchorStepY] contains the anchor value.\n\nRegular upscaling takes two arrays and \"moves\" the input from src to dst; src is expected packed.\n*/\n\n\n\n\n\n#pragma once\n\n\n\n\n\n/**\nLinearly interpolates values in the array between the equidistant anchor points (upscales).\nWorks in-place (input is already present at the correct output coords)\nUses templates to make it possible for the compiler to further optimizer the loops\n*/\ntemplate <\n\tint SizeX, int SizeY,  // Dimensions of the array\n\tint AnchorStepX, int AnchorStepY,\n\ttypename TYPE\n>\nvoid LinearUpscale2DArrayInPlace(TYPE * a_Array)\n{\n\t// First interpolate columns where the anchor points are:\n\tint LastYCell = SizeY - AnchorStepY;\n\tfor (int y = 0; y < LastYCell; y += AnchorStepY)\n\t{\n\t\tint Idx = SizeX * y;\n\t\tfor (int x = 0; x < SizeX; x += AnchorStepX)\n\t\t{\n\t\t\tTYPE StartValue = a_Array[Idx];\n\t\t\tTYPE EndValue   = a_Array[Idx + SizeX * AnchorStepY];\n\t\t\tTYPE Diff = EndValue - StartValue;\n\t\t\tfor (int CellY = 1; CellY < AnchorStepY; CellY++)\n\t\t\t{\n\t\t\t\ta_Array[Idx + SizeX * CellY] = StartValue + Diff * CellY / AnchorStepY;\n\t\t\t}  // for CellY\n\t\t\tIdx += AnchorStepX;\n\t\t}  // for x\n\t}  // for y\n\n\t// Now interpolate in rows, each row has values in the anchor columns\n\tint LastXCell = SizeX - AnchorStepX;\n\tfor (int y = 0; y < SizeY; y++)\n\t{\n\t\tint Idx = SizeX * y;\n\t\tfor (int x = 0; x < LastXCell; x += AnchorStepX)\n\t\t{\n\t\t\tTYPE StartValue = a_Array[Idx];\n\t\t\tTYPE EndValue   = a_Array[Idx + AnchorStepX];\n\t\t\tTYPE Diff = EndValue - StartValue;\n\t\t\tfor (int CellX = 1; CellX < AnchorStepX; CellX++)\n\t\t\t{\n\t\t\t\ta_Array[Idx + CellX] = StartValue + CellX * Diff / AnchorStepX;\n\t\t\t}  // for CellY\n\t\t\tIdx += AnchorStepX;\n\t\t}\n\t}\n}\n\n\n\n\n\n/**\nLinearly interpolates values in the array between the equidistant anchor points (upscales).\nWorks on two arrays, input is packed and output is to be completely constructed.\n*/\ntemplate <typename TYPE> void LinearUpscale2DArray(\n\tTYPE * a_Src,                    ///< Source array of size a_SrcSizeX x a_SrcSizeY\n\tint a_SrcSizeX, int a_SrcSizeY,  ///< Dimensions of the src array\n\tTYPE * a_Dst,                    ///< Dest array, of size (a_SrcSizeX * a_UpscaleX + 1) x (a_SrcSizeY * a_UpscaleY + 1)\n\tint a_UpscaleX, int a_UpscaleY   ///< Upscale factor for each direction\n)\n{\n\t// For optimization reasons, we're storing the upscaling ratios in a fixed-size arrays of these sizes\n\t// Feel free to enlarge them if needed, but keep in mind that they're on the stack\n\tconst int MAX_UPSCALE_X = 129;\n\tconst int MAX_UPSCALE_Y = 129;\n\n\tASSERT(a_Src != nullptr);\n\tASSERT(a_Dst != nullptr);\n\tASSERT(a_SrcSizeX > 0);\n\tASSERT(a_SrcSizeY > 0);\n\tASSERT(a_UpscaleX > 0);\n\tASSERT(a_UpscaleY > 0);\n\tASSERT(a_UpscaleX < MAX_UPSCALE_X);\n\tASSERT(a_UpscaleY < MAX_UPSCALE_Y);\n\n\t// Pre-calculate the upscaling ratios:\n\tTYPE RatioX[MAX_UPSCALE_X];\n\tTYPE RatioY[MAX_UPSCALE_Y];\n\tfor (int x = 0; x <= a_UpscaleX; x++)\n\t{\n\t\tRatioX[x] = static_cast<TYPE>(x) / a_UpscaleX;\n\t}\n\tfor (int y = 0; y <= a_UpscaleY; y++)\n\t{\n\t\tRatioY[y] = static_cast<TYPE>(y) / a_UpscaleY;\n\t}\n\n\tconst int DstSizeX = (a_SrcSizeX - 1) * a_UpscaleX + 1;\n\t[[maybe_unused]] const int DstSizeY = (a_SrcSizeY - 1) * a_UpscaleY + 1;\n\n\t// Interpolate each XY cell:\n\tfor (int y = 0; y < (a_SrcSizeY - 1); y++)\n\t{\n\t\tint DstY = y * a_UpscaleY;\n\t\tint idx = y * a_SrcSizeX;\n\t\tfor (int x = 0; x < (a_SrcSizeX - 1); x++, idx++)\n\t\t{\n\t\t\tint DstX = x * a_UpscaleX;\n\t\t\tTYPE LoXLoY = a_Src[idx];\n\t\t\tTYPE LoXHiY = a_Src[idx + a_SrcSizeX];\n\t\t\tTYPE HiXLoY = a_Src[idx + 1];\n\t\t\tTYPE HiXHiY = a_Src[idx + 1 + a_SrcSizeX];\n\t\t\tfor (int CellY = 0; CellY <= a_UpscaleY; CellY++)\n\t\t\t{\n\t\t\t\tint DestIdx = (DstY + CellY) * DstSizeX + DstX;\n\t\t\t\tASSERT(DestIdx + a_UpscaleX < DstSizeX * DstSizeY);\n\t\t\t\tTYPE LoXInY = LoXLoY + (LoXHiY - LoXLoY) * RatioY[CellY];\n\t\t\t\tTYPE HiXInY = HiXLoY + (HiXHiY - HiXLoY) * RatioY[CellY];\n\t\t\t\tfor (int CellX = 0; CellX <= a_UpscaleX; CellX++, DestIdx++)\n\t\t\t\t{\n\t\t\t\t\ta_Dst[DestIdx] = LoXInY + (HiXInY - LoXInY) * RatioX[CellX];\n\t\t\t\t}\n\t\t\t}  // for CellY\n\t\t}  // for x\n\t}  // for y\n}\n\n\n\n\n\n/**\nLinearly interpolates values in the array between the equidistant anchor points (upscales).\nWorks on two arrays, input is packed and output is to be completely constructed.\n*/\ntemplate <typename TYPE> void LinearUpscale3DArray(\n\tTYPE * a_Src,                                    ///< Source array of size a_SrcSizeX x a_SrcSizeY x a_SrcSizeZ\n\tint a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ,  ///< Dimensions of the src array\n\tTYPE * a_Dst,                                    ///< Dest array, of size (a_SrcSizeX * a_UpscaleX + 1) x (a_SrcSizeY * a_UpscaleY + 1) x (a_SrcSizeZ * a_UpscaleZ + 1)\n\tint a_UpscaleX, int a_UpscaleY, int a_UpscaleZ   ///< Upscale factor for each direction\n)\n{\n\t// For optimization reasons, we're storing the upscaling ratios in a fixed-size arrays of these sizes\n\t// Feel free to enlarge them if needed, but keep in mind that they're on the stack\n\tconst int MAX_UPSCALE_X = 128;\n\tconst int MAX_UPSCALE_Y = 128;\n\tconst int MAX_UPSCALE_Z = 128;\n\n\tASSERT(a_Src != nullptr);\n\tASSERT(a_Dst != nullptr);\n\tASSERT(a_SrcSizeX > 0);\n\tASSERT(a_SrcSizeY > 0);\n\tASSERT(a_SrcSizeZ > 0);\n\tASSERT(a_UpscaleX > 0);\n\tASSERT(a_UpscaleY > 0);\n\tASSERT(a_UpscaleZ > 0);\n\tASSERT(a_UpscaleX <= MAX_UPSCALE_X);\n\tASSERT(a_UpscaleY <= MAX_UPSCALE_Y);\n\tASSERT(a_UpscaleZ <= MAX_UPSCALE_Z);\n\n\t// Pre-calculate the upscaling ratios:\n\tTYPE RatioX[MAX_UPSCALE_X];\n\tTYPE RatioY[MAX_UPSCALE_Y];\n\tTYPE RatioZ[MAX_UPSCALE_Z];\n\tfor (int x = 0; x <= a_UpscaleX; x++)\n\t{\n\t\tRatioX[x] = static_cast<TYPE>(x) / a_UpscaleX;\n\t}\n\tfor (int y = 0; y <= a_UpscaleY; y++)\n\t{\n\t\tRatioY[y] = static_cast<TYPE>(y) / a_UpscaleY;\n\t}\n\tfor (int z = 0; z <= a_UpscaleZ; z++)\n\t{\n\t\tRatioZ[z] = static_cast<TYPE>(z) / a_UpscaleZ;\n\t}\n\n\tconst int DstSizeX = (a_SrcSizeX - 1) * a_UpscaleX + 1;\n\tconst int DstSizeY = (a_SrcSizeY - 1) * a_UpscaleY + 1;\n\t[[maybe_unused]] const int DstSizeZ = (a_SrcSizeZ - 1) * a_UpscaleZ + 1;\n\n\t// Interpolate each XYZ cell:\n\tfor (int z = 0; z < (a_SrcSizeZ - 1); z++)\n\t{\n\t\tint DstZ = z * a_UpscaleZ;\n\t\tfor (int y = 0; y < (a_SrcSizeY - 1); y++)\n\t\t{\n\t\t\tint DstY = y * a_UpscaleY;\n\t\t\tint idx = y * a_SrcSizeX + z * a_SrcSizeX * a_SrcSizeY;\n\t\t\tfor (int x = 0; x < (a_SrcSizeX - 1); x++, idx++)\n\t\t\t{\n\t\t\t\tint DstX = x * a_UpscaleX;\n\t\t\t\tTYPE LoXLoYLoZ = a_Src[idx];\n\t\t\t\tTYPE LoXLoYHiZ = a_Src[idx + a_SrcSizeX * a_SrcSizeY];\n\t\t\t\tTYPE LoXHiYLoZ = a_Src[idx + a_SrcSizeX];\n\t\t\t\tTYPE LoXHiYHiZ = a_Src[idx + a_SrcSizeX + a_SrcSizeX * a_SrcSizeY];\n\t\t\t\tTYPE HiXLoYLoZ = a_Src[idx + 1];\n\t\t\t\tTYPE HiXLoYHiZ = a_Src[idx + 1 + a_SrcSizeX * a_SrcSizeY];\n\t\t\t\tTYPE HiXHiYLoZ = a_Src[idx + 1 + a_SrcSizeX];\n\t\t\t\tTYPE HiXHiYHiZ = a_Src[idx + 1 + a_SrcSizeX + a_SrcSizeX * a_SrcSizeY];\n\t\t\t\tfor (int CellZ = 0; CellZ <= a_UpscaleZ; CellZ++)\n\t\t\t\t{\n\t\t\t\t\tTYPE LoXLoYInZ = LoXLoYLoZ + (LoXLoYHiZ - LoXLoYLoZ) * RatioZ[CellZ];\n\t\t\t\t\tTYPE LoXHiYInZ = LoXHiYLoZ + (LoXHiYHiZ - LoXHiYLoZ) * RatioZ[CellZ];\n\t\t\t\t\tTYPE HiXLoYInZ = HiXLoYLoZ + (HiXLoYHiZ - HiXLoYLoZ) * RatioZ[CellZ];\n\t\t\t\t\tTYPE HiXHiYInZ = HiXHiYLoZ + (HiXHiYHiZ - HiXHiYLoZ) * RatioZ[CellZ];\n\t\t\t\t\tfor (int CellY = 0; CellY <= a_UpscaleY; CellY++)\n\t\t\t\t\t{\n\t\t\t\t\t\tint DestIdx = (DstZ + CellZ) * DstSizeX * DstSizeY + (DstY + CellY) * DstSizeX + DstX;\n\t\t\t\t\t\tASSERT(DestIdx + a_UpscaleX < DstSizeX * DstSizeY * DstSizeZ);\n\t\t\t\t\t\tTYPE LoXInY = LoXLoYInZ + (LoXHiYInZ - LoXLoYInZ) * RatioY[CellY];\n\t\t\t\t\t\tTYPE HiXInY = HiXLoYInZ + (HiXHiYInZ - HiXLoYInZ) * RatioY[CellY];\n\t\t\t\t\t\tfor (int CellX = 0; CellX <= a_UpscaleX; CellX++, DestIdx++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_Dst[DestIdx] = LoXInY + (HiXInY - LoXInY) * RatioX[CellX];\n\t\t\t\t\t\t}\n\t\t\t\t\t}  // for CellY\n\t\t\t\t}  // for CellZ\n\t\t\t}  // for x\n\t\t}  // for y\n\t}  // for z\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/Logger.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n#include \"Logger.h\"\n\n#include \"OSSupport/IsThread.h\"\n#ifdef _WIN32\n\t#include <time.h>\n#endif\n\n\n\n\n\nstatic void WriteLogOpener(fmt::memory_buffer & Buffer)\n{\n\tconst time_t rawtime = time(nullptr);\n\n\tstruct tm timeinfo;\n#ifdef _MSC_VER\n\tlocaltime_s(&timeinfo, &rawtime);\n#else\n\tlocaltime_r(&rawtime, &timeinfo);\n#endif\n\n#ifndef NDEBUG\n\tconst auto ThreadID = std::hash<std::thread::id>()(std::this_thread::get_id());\n\tfmt::format_to(\n\t\tBuffer, \"[{0:04x}|{1:02d}:{2:02d}:{3:02d}] \",\n\t\tThreadID, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec\n\t);\n#else\n\tfmt::format_to(\n\t\tBuffer, \"[{0:02d}:{1:02d}:{2:02d}] \",\n\t\ttimeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec\n\t);\n#endif\n}\n\n\n\n\n\ncLogger & cLogger::GetInstance(void)\n{\n\tstatic cLogger Instance;\n\treturn Instance;\n}\n\n\n\n\n\nvoid cLogger::InitiateMultithreading()\n{\n\tGetInstance();\n}\n\n\n\n\n\nvoid cLogger::LogSimple(std::string_view a_Message, eLogLevel a_LogLevel)\n{\n\tfmt::memory_buffer Buffer;\n\tWriteLogOpener(Buffer);\n\tfmt::format_to(Buffer, \"{0}\\n\", a_Message);\n\tLogLine(std::string_view(Buffer.data(), Buffer.size()), a_LogLevel);\n}\n\n\n\n\n\nvoid cLogger::LogLine(std::string_view a_Line, eLogLevel a_LogLevel)\n{\n\tcCSLock Lock(m_CriticalSection);\n\tfor (size_t i = 0; i < m_LogListeners.size(); i++)\n\t{\n\t\tm_LogListeners[i]->Log(a_Line, a_LogLevel);\n\t}\n}\n\n\n\n\n\nvoid cLogger::LogPrintf(std::string_view a_Format, eLogLevel a_LogLevel, fmt::printf_args a_ArgList)\n{\n\tfmt::memory_buffer Buffer;\n\tWriteLogOpener(Buffer);\n\tfmt::vprintf(Buffer, fmt::to_string_view(a_Format), a_ArgList);\n\tfmt::format_to(Buffer, \"\\n\");\n\n\tLogLine(std::string_view(Buffer.data(), Buffer.size()), a_LogLevel);\n}\n\n\n\n\n\nvoid cLogger::LogFormat(std::string_view a_Format, eLogLevel a_LogLevel, fmt::format_args a_ArgList)\n{\n\tfmt::memory_buffer Buffer;\n\tWriteLogOpener(Buffer);\n\tfmt::vformat_to(Buffer, a_Format, a_ArgList);\n\tfmt::format_to(Buffer, \"\\n\");\n\n\tLogLine(std::string_view(Buffer.data(), Buffer.size()), a_LogLevel);\n}\n\n\n\n\n\ncLogger::cAttachment cLogger::AttachListener(std::unique_ptr<cListener> a_Listener)\n{\n\tauto nonOwning = a_Listener.get();\n\t{\n\t\tcCSLock Lock(m_CriticalSection);\n\t\tm_LogListeners.push_back(std::move(a_Listener));\n\t}\n\treturn cAttachment{nonOwning};\n}\n\n\n\n\n\nvoid cLogger::DetachListener(cListener * a_Listener)\n{\n\tcCSLock Lock(m_CriticalSection);\n\tm_LogListeners.erase(\n\t\tstd::remove_if(\n\t\t\tm_LogListeners.begin(),\n\t\t\tm_LogListeners.end(),\n\t\t\t[=](std::unique_ptr<cListener> & a_OtherListener) -> bool\n\t\t\t{\n\t\t\t\treturn a_OtherListener.get() == a_Listener;\n\t\t\t}\n\t\t)\n\t);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Global functions\n\nvoid Logger::LogFormat(std::string_view a_Format, eLogLevel a_LogLevel, fmt::format_args a_ArgList)\n{\n\tcLogger::GetInstance().LogFormat(a_Format, a_LogLevel, a_ArgList);\n}\n\n\n\n\n\nvoid Logger::LogPrintf(std::string_view a_Format, eLogLevel a_LogLevel, fmt::printf_args a_ArgList)\n{\n\tcLogger::GetInstance().LogPrintf(a_Format, a_LogLevel, a_ArgList);\n}\n\n\n\n\n\nvoid Logger::LogSimple(std::string_view a_Message, eLogLevel a_LogLevel)\n{\n\tcLogger::GetInstance().LogSimple(a_Message, a_LogLevel);\n}\n"
  },
  {
    "path": "src/Logger.h",
    "content": "\n#pragma once\n\n\nclass cLogger\n{\npublic:\n\n\tclass cListener\n\t{\n\t\tpublic:\n\t\tvirtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) = 0;\n\n\t\tvirtual ~cListener(){}\n\t};\n\n\tclass cAttachment\n\t{\n\t\tpublic:\n\n\t\tcAttachment() : m_listener(nullptr) {}\n\t\tcAttachment(cAttachment && a_other)\n\t\t\t: m_listener(a_other.m_listener)\n\t\t{\n\t\t\ta_other.m_listener = nullptr;\n\t\t}\n\n\t\t~cAttachment()\n\t\t{\n\t\t\tif (m_listener != nullptr)\n\t\t\t{\n\t\t\t\tcLogger::GetInstance().DetachListener(m_listener);\n\t\t\t}\n\t\t}\n\n\t\tcAttachment & operator=(cAttachment && a_other)\n\t\t{\n\t\t\tm_listener = a_other.m_listener;\n\t\t\ta_other.m_listener = nullptr;\n\t\t\treturn *this;\n\t\t}\n\n\t\tprivate:\n\n\t\tcListener * m_listener;\n\n\t\tfriend class cLogger;\n\n\t\tcAttachment(cListener * a_listener) : m_listener(a_listener) {}\n\t};\n\n\t/** Log a message formatted with a printf style formatting string. */\n\tvoid LogPrintf(std::string_view a_Format, eLogLevel a_LogLevel, fmt::printf_args a_ArgList);\n\n\t/** Log a message formatted with a python style formatting string. */\n\tvoid LogFormat(std::string_view a_Format, eLogLevel a_LogLevel, fmt::format_args a_ArgList);\n\n\t/** Logs the simple text message at the specified log level. */\n\tvoid LogSimple(std::string_view a_Message, eLogLevel a_LogLevel = eLogLevel::Regular);\n\n\tcAttachment AttachListener(std::unique_ptr<cListener> a_Listener);\n\n\tstatic cLogger & GetInstance(void);\n\n\t// Must be called before calling GetInstance in a multithreaded context\n\tstatic void InitiateMultithreading();\n\nprivate:\n\n\tcCriticalSection m_CriticalSection;\n\tstd::vector<std::unique_ptr<cListener>> m_LogListeners;\n\n\tvoid DetachListener(cListener * a_Listener);\n\tvoid LogLine(std::string_view a_Line, eLogLevel a_LogLevel);\n};\n"
  },
  {
    "path": "src/LoggerListeners.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"LoggerListeners.h\"\n\n#if defined(_WIN32)\n\t#include <io.h>  // Needed for _isatty(), not available on Linux\n\t#include <time.h>\n#endif\n\n\n#if defined(_WIN32) || defined (__linux) || defined (__APPLE__)\n\tclass cColouredConsoleListener\n\t\t: public cLogger::cListener\n\t{\n\tprotected:\n\n\t\tvirtual void SetLogColour(eLogLevel a_LogLevel) = 0;\n\t\tvirtual void SetDefaultLogColour() = 0;\n\n\t\tvirtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override\n\t\t{\n\t\t\tSetLogColour(a_LogLevel);\n\t\t\tfwrite(a_Message.data(), sizeof(char), a_Message.size(), stdout);\n\t\t\tSetDefaultLogColour();\n\t\t}\n\t};\n#endif\n\n\n\n\n\n#ifdef _WIN32\n\tclass cWindowsConsoleListener:\n\t\tpublic cColouredConsoleListener\n\t{\n\t\tusing Super = cColouredConsoleListener;\n\n\tpublic:\n\n\t\tcWindowsConsoleListener(HANDLE a_Console, WORD a_DefaultConsoleAttrib):\n\t\t\tm_Console(a_Console),\n\t\t\tm_DefaultConsoleAttrib(a_DefaultConsoleAttrib)\n\t\t{\n\t\t}\n\n\t\t#ifndef NDEBUG\n\t\t\tvirtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override\n\t\t\t{\n\t\t\t\tSuper::Log(a_Message, a_LogLevel);\n\t\t\t\t// In a Windows Debug build, output the log to debug console as well:\n\t\t\t\tOutputDebugStringA(AString(a_Message).c_str());\n\t\t\t}\n\t\t#endif\n\n\n\t\tvirtual void SetLogColour(eLogLevel a_LogLevel) override\n\t\t{\n\t\t\t// by default, gray on black\n\t\t\tWORD Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;\n\t\t\tswitch (a_LogLevel)\n\t\t\t{\n\t\t\t\tcase eLogLevel::Regular:\n\t\t\t\t{\n\t\t\t\t\t// Gray on black\n\t\t\t\t\tAttrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase eLogLevel::Info:\n\t\t\t\t{\n\t\t\t\t\t// Yellow on black\n\t\t\t\t\tAttrib = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase eLogLevel::Warning:\n\t\t\t\t{\n\t\t\t\t\t// Red on black\n\t\t\t\t\tAttrib = FOREGROUND_RED | FOREGROUND_INTENSITY;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase eLogLevel::Error:\n\t\t\t\t{\n\t\t\t\t\t// Black on red\n\t\t\t\t\tAttrib = BACKGROUND_RED | BACKGROUND_INTENSITY;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tSetConsoleTextAttribute(m_Console, Attrib);\n\t\t}\n\n\n\t\tvirtual void SetDefaultLogColour() override\n\t\t{\n\t\t\tSetConsoleTextAttribute(m_Console, m_DefaultConsoleAttrib);\n\t\t}\n\n\tprivate:\n\n\t\tHANDLE m_Console;\n\t\tWORD m_DefaultConsoleAttrib;\n\t};\n\n\n\n#elif defined (__linux) || defined (__APPLE__)\n\n\n\n\tclass cANSIConsoleListener\n\t\t: public cColouredConsoleListener\n\t{\n\tpublic:\n\t\tvirtual void SetLogColour(eLogLevel a_LogLevel) override\n\t\t{\n\t\t\tswitch (a_LogLevel)\n\t\t\t{\n\t\t\t\tcase eLogLevel::Regular:\n\t\t\t\t{\n\t\t\t\t\t// Whatever the console default is\n\t\t\t\t\tprintf(\"\\x1b[0m\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase eLogLevel::Info:\n\t\t\t\t{\n\t\t\t\t\t// Yellow on black\n\t\t\t\t\tprintf(\"\\x1b[33;1m\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase eLogLevel::Warning:\n\t\t\t\t{\n\t\t\t\t\t// Red on black\n\t\t\t\t\tprintf(\"\\x1b[31;1m\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase eLogLevel::Error:\n\t\t\t\t{\n\t\t\t\t\t// Yellow on red\n\t\t\t\t\tprintf(\"\\x1b[1;33;41;1m\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\tvirtual void SetDefaultLogColour() override\n\t\t{\n\t\t\t// Whatever the console default is\n\t\t\tprintf(\"\\x1b[0m\");\n\t\t\tfflush(stdout);\n\t\t}\n\t};\n\n#endif\n\n\n\n\n\nclass cVanillaCPPConsoleListener\n\t: public cLogger::cListener\n{\npublic:\n\tvirtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override\n\t{\n\t\tswitch (a_LogLevel)\n\t\t{\n\t\t\tcase eLogLevel::Regular:\n\t\t\t{\n\t\t\t\tfputs(\"Log: \", stdout);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase eLogLevel::Info:\n\t\t\t{\n\t\t\t\tfputs(\"Info: \", stdout);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase eLogLevel::Warning:\n\t\t\t{\n\t\t\t\tfputs(\"Warning: \", stdout);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase eLogLevel::Error:\n\t\t\t{\n\t\t\t\tfputs(\"Error: \", stdout);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfwrite(a_Message.data(), sizeof(char), a_Message.size(), stdout);\n\t}\n};\n\n\n\n\n\n// Listener for when stdout is closed, i.e. When running as a daemon.\nclass cNullConsoleListener\n\t: public cLogger::cListener\n{\n\tvirtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override\n\t{\n\t}\n};\n\n\n\n\n\nstd::unique_ptr<cLogger::cListener> MakeConsoleListener(bool a_IsService)\n{\n\tif (a_IsService)\n\t{\n\t\treturn std::make_unique<cNullConsoleListener>();\n\t}\n\n\t#ifdef _WIN32\n\t\t// See whether we are writing to a console the default console attrib:\n\t\tbool ShouldColorOutput = (_isatty(_fileno(stdin)) != 0);\n\t\tif (ShouldColorOutput)\n\t\t{\n\t\t\tCONSOLE_SCREEN_BUFFER_INFO sbi;\n\t\t\tHANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE);\n\t\t\tGetConsoleScreenBufferInfo(Console, &sbi);\n\t\t\tWORD DefaultConsoleAttrib = sbi.wAttributes;\n\t\t\treturn std::make_unique<cWindowsConsoleListener>(Console, DefaultConsoleAttrib);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn std::make_unique<cVanillaCPPConsoleListener>();\n\t\t}\n\t#elif defined (__linux) || defined (__APPLE__)\n\t\t// TODO: lookup terminal in terminfo\n\t\tif (isatty(fileno(stdout)))\n\t\t{\n\t\t\treturn std::make_unique<cANSIConsoleListener>();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn std::make_unique<cVanillaCPPConsoleListener>();\n\t\t}\n\t#else\n\t\treturn std::make_unique<cVanillaCPPConsoleListener>();\n\t#endif\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFileListener:\n\nclass cFileListener\n\t: public cLogger::cListener\n{\npublic:\n\n\tcFileListener() {}\n\n\tbool Open()\n\t{\n\t\t// Assume creation succeeds, as the API does not provide a way to tell if the folder exists.\n\t\tcFile::CreateFolder(\"logs\");\n\t\tbool success = m_File.Open(\n\t\t\tfmt::format(\n\t\t\t\tFMT_STRING(\"logs/LOG_{}.txt\"),\n\t\t\t\tstd::chrono::duration_cast<std::chrono::duration<int, std::ratio<1>>>(\n\t\t\t\t\tstd::chrono::system_clock::now().time_since_epoch()\n\t\t\t\t).count()\n\t\t\t),\n\t\t\tcFile::fmAppend\n\t\t);\n\t\treturn success;\n\t}\n\n\tvirtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override\n\t{\n\t\tstd::string_view LogLevelPrefix = \"Unkn \";\n\t\tbool ShouldFlush = false;\n\t\tswitch (a_LogLevel)\n\t\t{\n\t\t\tcase eLogLevel::Regular:\n\t\t\t{\n\t\t\t\tLogLevelPrefix = \"     \";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase eLogLevel::Info:\n\t\t\t{\n\t\t\t\tLogLevelPrefix = \"Info \";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase eLogLevel::Warning:\n\t\t\t{\n\t\t\t\tLogLevelPrefix = \"Warn \";\n\t\t\t\tShouldFlush = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase eLogLevel::Error:\n\t\t\t{\n\t\t\t\tLogLevelPrefix = \"Err  \";\n\t\t\t\tShouldFlush = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tm_File.Write(LogLevelPrefix);\n\t\tm_File.Write(a_Message);\n\n\t\tif (ShouldFlush)\n\t\t{\n\t\t\tm_File.Flush();\n\t\t}\n\t}\n\nprivate:\n\n\tcFile m_File;\n};\n\n\n\n\n\nstd::pair<bool, std::unique_ptr<cLogger::cListener>> MakeFileListener()\n{\n\tauto listener = std::make_unique<cFileListener>();\n\tif (!listener->Open())\n\t{\n\t\treturn {false, nullptr};\n\t}\n\treturn {true, std::move(listener)};\n}\n\n\n"
  },
  {
    "path": "src/LoggerListeners.h",
    "content": "\n#include \"Logger.h\"\n\nstd::unique_ptr<cLogger::cListener> MakeConsoleListener(bool a_IsService);\nstd::pair<bool, std::unique_ptr<cLogger::cListener>> MakeFileListener();\n\n\n\n\n"
  },
  {
    "path": "src/LoggerSimple.h",
    "content": "\n// Logging free functions defined in Logger.cpp\n#pragma once\n\nenum class eLogLevel\n{\n\tRegular,\n\tInfo,\n\tWarning,\n\tError,\n};\n\nnamespace Logger\n{\n\nextern void LogFormat(\n\tstd::string_view a_Format, eLogLevel a_LogLevel, fmt::format_args a_ArgList\n);\nextern void LogPrintf(\n\tstd::string_view a_Format, eLogLevel a_LogLevel, fmt::printf_args a_ArgList\n);\nextern void LogSimple(std::string_view a_Message, eLogLevel a_LogLevel);\n\n}  // namespace Logger\n\n// python style format specified logging\n\ntemplate <typename... Args>\nvoid FLOG(std::string_view a_Format, const Args & ... args)\n{\n\tLogger::LogFormat(a_Format, eLogLevel::Regular, fmt::make_format_args(args...));\n}\n\ntemplate <typename... Args>\nvoid FLOGINFO(std::string_view a_Format, const Args & ... args)\n{\n\tLogger::LogFormat(a_Format, eLogLevel::Info, fmt::make_format_args(args...));\n}\n\ntemplate <typename... Args>\nvoid FLOGWARNING(std::string_view a_Format, const Args & ... args)\n{\n\tLogger::LogFormat(a_Format, eLogLevel::Warning, fmt::make_format_args(args...));\n}\n\ntemplate <typename... Args>\nvoid FLOGERROR(std::string_view a_Format, const Args & ... args)\n{\n\tLogger::LogFormat(a_Format, eLogLevel::Error, fmt::make_format_args(args...));\n}\n\n// printf style format specified logging (DEPRECATED)\n\ntemplate <typename... Args>\nvoid LOG(std::string_view a_Format, const Args & ... args)\n{\n\tLogger::LogPrintf(a_Format, eLogLevel::Regular, fmt::make_printf_args(args...));\n}\n\ntemplate <typename... Args>\nvoid LOGINFO(std::string_view a_Format, const Args & ... args)\n{\n\tLogger::LogPrintf(a_Format, eLogLevel::Info, fmt::make_printf_args(args...));\n}\n\ntemplate <typename... Args>\nvoid LOGWARNING(std::string_view a_Format, const Args & ... args)\n{\n\tLogger::LogPrintf(a_Format, eLogLevel::Warning, fmt::make_printf_args(args...));\n}\n\ntemplate <typename... Args>\nvoid LOGERROR(std::string_view a_Format, const Args & ... args)\n{\n\tLogger::LogPrintf(a_Format, eLogLevel::Error, fmt::make_printf_args(args...));\n}\n\n\n// Macro variants\n\n// In debug builds, translate LOGD to LOG, otherwise leave it out altogether:\n#if !defined(NDEBUG) || defined(TEST_GLOBALS)\n\t#define LOGD LOG\n#else\n\t#define LOGD(...)\n#endif  // !NDEBUG\n\n#define LOGWARN LOGWARNING\n\n#if !defined(NDEBUG) || defined(TEST_GLOBALS)\n\t#define FLOGD FLOG\n#else\n\t#define FLOGD(...)\n#endif  // !NDEBUG\n\n#define FLOGWARN FLOGWARNING\n\n// Conditionally log a warning\n#define CONDWARNING(ShouldLog, ...) \\\n\tdo { \\\n\t\tif (ShouldLog) \\\n\t\t{ \\\n\t\t\tLOGWARNING(__VA_ARGS__); \\\n\t\t} \\\n\t} while (false)\n"
  },
  {
    "path": "src/Map.cpp",
    "content": "\n// Map.cpp\n\n#include \"Globals.h\"\n\n#include \"BlockInfo.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"Chunk.h\"\n#include \"ClientHandle.h\"\n#include \"Entities/Player.h\"\n#include \"FastRandom.h\"\n#include \"Map.h\"\n#include \"World.h\"\n\n\n\n\n\ncMap::cMap(unsigned int a_ID, cWorld * a_World):\n\tm_ID(a_ID),\n\tm_Width(cChunkDef::Width * 8),\n\tm_Height(cChunkDef::Width * 8),\n\tm_Scale(3),\n\tm_CenterX(0),\n\tm_CenterZ(0),\n\tm_Dirty(false),  // This constructor is for an empty map object which will be filled by the caller with the correct values - it does not need saving.\n\tm_World(a_World),\n\tm_Name(fmt::format(FMT_STRING(\"map_{}\"), m_ID))\n{\n\tm_Data.assign(m_Width * m_Height, E_BASE_COLOR_TRANSPARENT);\n}\n\n\n\n\n\ncMap::cMap(unsigned int a_ID, int a_CenterX, int a_CenterZ, cWorld * a_World, unsigned int a_Scale):\n\tm_ID(a_ID),\n\tm_Width(cChunkDef::Width * 8),\n\tm_Height(cChunkDef::Width * 8),\n\tm_Scale(a_Scale),\n\tm_CenterX(a_CenterX),\n\tm_CenterZ(a_CenterZ),\n\tm_Dirty(true),  // This constructor is for creating a brand new map in game, it will always need saving.\n\tm_World(a_World),\n\tm_Name(fmt::format(FMT_STRING(\"map_{}\"), m_ID))\n{\n\tm_Data.assign(m_Width * m_Height, E_BASE_COLOR_TRANSPARENT);\n}\n\n\n\n\n\nvoid cMap::Tick()\n{\n\tfor (const auto & Client : m_ClientsInCurrentTick)\n\t{\n\t\tClient->SendMapData(*this, 0, 0);\n\t}\n\tm_ClientsInCurrentTick.clear();\n\tm_Decorators.clear();\n}\n\n\n\n\n\nvoid cMap::UpdateRadius(int a_PixelX, int a_PixelZ, unsigned int a_Radius)\n{\n\tint PixelRadius = static_cast<int>(a_Radius / GetPixelWidth());\n\n\tunsigned int StartX = static_cast<unsigned int>(Clamp(a_PixelX - PixelRadius, 0, static_cast<int>(m_Width)));\n\tunsigned int StartZ = static_cast<unsigned int>(Clamp(a_PixelZ - PixelRadius, 0, static_cast<int>(m_Height)));\n\n\tunsigned int EndX   = static_cast<unsigned int>(Clamp(a_PixelX + PixelRadius, 0, static_cast<int>(m_Width)));\n\tunsigned int EndZ   = static_cast<unsigned int>(Clamp(a_PixelZ + PixelRadius, 0, static_cast<int>(m_Height)));\n\n\tfor (unsigned int X = StartX; X < EndX; ++X)\n\t{\n\t\tfor (unsigned int Z = StartZ; Z < EndZ; ++Z)\n\t\t{\n\t\t\tint dX = static_cast<int>(X) - a_PixelX;\n\t\t\tint dZ = static_cast<int>(Z) - a_PixelZ;\n\n\t\t\tif ((dX * dX) + (dZ * dZ) < (PixelRadius * PixelRadius))\n\t\t\t{\n\t\t\t\tUpdatePixel(X, Z);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMap::UpdateRadius(cPlayer & a_Player, unsigned int a_Radius)\n{\n\tint PixelWidth = static_cast<int>(GetPixelWidth());\n\n\tint PixelX = static_cast<int>(a_Player.GetPosX() - m_CenterX) / PixelWidth + static_cast<int>(m_Width  / 2);\n\tint PixelZ = static_cast<int>(a_Player.GetPosZ() - m_CenterZ) / PixelWidth + static_cast<int>(m_Height / 2);\n\n\tUpdateRadius(PixelX, PixelZ, a_Radius);\n}\n\n\n\n\n\nbool cMap::UpdatePixel(unsigned int a_X, unsigned int a_Z)\n{\n\tint BlockX = m_CenterX + static_cast<int>((a_X - m_Width  / 2) * GetPixelWidth());\n\tint BlockZ = m_CenterZ + static_cast<int>((a_Z - m_Height / 2) * GetPixelWidth());\n\n\tint ChunkX, ChunkZ;\n\tcChunkDef::BlockToChunk(BlockX, BlockZ, ChunkX, ChunkZ);\n\n\tint RelX = BlockX - (ChunkX * cChunkDef::Width);\n\tint RelZ = BlockZ - (ChunkZ * cChunkDef::Width);\n\n\tASSERT(m_World != nullptr);\n\n\tColorID PixelData;\n\tm_World->DoWithChunk(ChunkX, ChunkZ, [&](cChunk & a_Chunk)\n\t\t{\n\t\t\tif (GetDimension() == dimNether)\n\t\t\t{\n\t\t\t\t// TODO 2014-02-22 xdot: Nether maps\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tstatic const std::array<unsigned char, 4> BrightnessID = { { 3, 0, 1, 2 } };  // Darkest to lightest\n\t\t\tBLOCKTYPE TargetBlock;\n\t\t\tNIBBLETYPE TargetMeta;\n\n\t\t\tauto Height = a_Chunk.GetHeight(RelX, RelZ);\n\t\t\tauto ChunkHeight = cChunkDef::Height;\n\t\t\ta_Chunk.GetBlockTypeMeta(RelX, Height, RelZ, TargetBlock, TargetMeta);\n\t\t\tauto ColourID = cBlockHandler::For(TargetBlock).GetMapBaseColourID(TargetMeta);\n\n\t\t\tif (IsBlockWater(TargetBlock))\n\t\t\t{\n\t\t\t\tChunkHeight /= 4;\n\t\t\t\twhile (((--Height) != -1) && IsBlockWater(a_Chunk.GetBlock(RelX, Height, RelZ)))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ColourID == 0)\n\t\t\t{\n\t\t\t\twhile (((--Height) != -1) && ((ColourID = cBlockHandler::For(a_Chunk.GetBlock(RelX, Height, RelZ)).GetMapBaseColourID(a_Chunk.GetMeta(RelX, Height, RelZ))) == 0))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Multiply base color ID by 4 and add brightness ID\n\t\t\tconst int BrightnessIDSize = static_cast<int>(BrightnessID.size());\n\t\t\tPixelData = ColourID * 4 + BrightnessID[static_cast<size_t>(Clamp<int>((BrightnessIDSize * Height) / ChunkHeight, 0, BrightnessIDSize - 1))];\n\t\t\treturn false;\n\t\t}\n\t);\n\n\tSetPixel(a_X, a_Z, PixelData);\n\n\treturn true;\n}\n\n\n\n\n\nvoid cMap::UpdateClient(cPlayer * a_Player)\n{\n\tASSERT(a_Player != nullptr);\n\tm_Decorators.emplace_back(CreateDecorator(a_Player));\n\tm_ClientsInCurrentTick.push_back(a_Player->GetClientHandle());\n}\n\n\n\n\n\neDimension cMap::GetDimension(void) const\n{\n\tASSERT(m_World != nullptr);\n\treturn m_World->GetDimension();\n}\n\n\n\n\n\nvoid cMap::Resize(unsigned int a_Width, unsigned int a_Height)\n{\n\tif ((m_Width == a_Width) && (m_Height == a_Height))\n\t{\n\t\treturn;\n\t}\n\n\tm_Width = a_Width;\n\tm_Height = a_Height;\n\n\tm_Data.assign(m_Width * m_Height, 0);\n}\n\n\n\n\n\nvoid cMap::SetPosition(int a_CenterX, int a_CenterZ)\n{\n\tm_CenterX = a_CenterX;\n\tm_CenterZ = a_CenterZ;\n}\n\n\n\n\n\nbool cMap::SetPixel(unsigned int a_X, unsigned int a_Z, cMap::ColorID a_Data)\n{\n\tif ((a_X < m_Width) && (a_Z < m_Height))\n\t{\n\t\tauto index = a_Z * m_Width + a_X;\n\n\t\tif (m_Data[index] != a_Data)\n\t\t{\n\t\t\tm_Data[index] = a_Data;\n\t\t\tm_Dirty = true;\n\t\t}\n\n\t\treturn true;\n\t}\n\telse\n\t{\n\t\treturn false;\n\t}\n}\n\n\n\n\n\ncMap::ColorID cMap::GetPixel(unsigned int a_X, unsigned int a_Z)\n{\n\tif ((a_X < m_Width) && (a_Z < m_Height))\n\t{\n\t\treturn m_Data[a_Z * m_Width + a_X];\n\t}\n\telse\n\t{\n\t\treturn E_BASE_COLOR_TRANSPARENT;\n\t}\n}\n\n\n\n\n\nunsigned int cMap::GetNumPixels(void) const\n{\n\treturn m_Width * m_Height;\n}\n\n\n\n\n\nconst cMapDecorator cMap::CreateDecorator(const cEntity * a_TrackedEntity)\n{\n\tint InsideWidth = (GetWidth() / 2) - 1;\n\tint InsideHeight = (GetHeight() / 2) - 1;\n\n\t// Center of pixel\n\tint PixelX = static_cast<int>(a_TrackedEntity->GetPosX() - GetCenterX()) / static_cast<int>(GetPixelWidth());\n\tint PixelZ = static_cast<int>(a_TrackedEntity->GetPosZ() - GetCenterZ()) / static_cast<int>(GetPixelWidth());\n\n\tcMapDecorator::eType Type;\n\tint Rot;\n\n\tif ((PixelX > -InsideWidth) && (PixelX <= InsideWidth) && (PixelZ > -InsideHeight) && (PixelZ <= InsideHeight))\n\t{\n\t\tdouble Yaw = a_TrackedEntity->GetYaw();\n\n\t\tif (GetDimension() == dimNether)\n\t\t{\n\t\t\t// TODO 2014-02-19 xdot: Refine\n\t\t\tRot = GetRandomProvider().RandInt(15);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRot = CeilC(((Yaw - 11.25) * 16) / 360);\n\t\t}\n\n\t\tType = cMapDecorator::eType::E_TYPE_PLAYER;\n\t}\n\telse\n\t{\n\t\tRot = 0;\n\t\tType = cMapDecorator::eType::E_TYPE_PLAYER_OUTSIDE;\n\n\t\t// Move to border\n\t\tif (PixelX <= -InsideWidth)\n\t\t{\n\t\t\tPixelX = -InsideWidth;\n\t\t}\n\t\tif (PixelZ <= -InsideHeight)\n\t\t{\n\t\t\tPixelZ = -InsideHeight;\n\t\t}\n\t\tif (PixelX > InsideWidth)\n\t\t{\n\t\t\tPixelX = InsideWidth;\n\t\t}\n\t\tif (PixelZ > InsideHeight)\n\t\t{\n\t\t\tPixelZ = InsideHeight;\n\t\t}\n\t}\n\n\treturn {Type, static_cast<unsigned>(2 * PixelX + 1), static_cast<unsigned>(2 * PixelZ + 1), Rot};\n}\n\n\n\n\n\nunsigned int cMap::GetPixelWidth(void) const\n{\n\treturn static_cast<unsigned int>(pow(2.0, static_cast<double>(m_Scale)));\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/Map.h",
    "content": "\n// Map.h\n\n// Implementation of in-game coloured maps\n\n\n\n\n\n#pragma once\n\n#include \"Defines.h\"\n#include \"ChunkDef.h\"\n\n\n\n\nclass cClientHandle;\nclass cWorld;\nclass cPlayer;\nclass cMap;\n\n\n\n\n\n/** Encapsulates a map decorator.\nA map decorator represents an object drawn on the map that can move freely.\n(e.g. player trackers and item frame pointers)\n\nExcluding manually placed decorators,\ndecorators are automatically managed (allocated and freed) by their parent cMap instance.\n*/\nstruct cMapDecorator\n{\npublic:\n\n\tenum class eType\n\t{\n\t\tE_TYPE_PLAYER         = 0x00,\n\t\tE_TYPE_ITEM_FRAME     = 0x01,\n\n\t\t/** Player outside of the boundaries of the map. */\n\t\tE_TYPE_PLAYER_OUTSIDE = 0x06\n\t};\n\n\tcMapDecorator(eType a_Type, unsigned int a_X, unsigned int a_Z, int a_Rot) :\n\t\tm_Type(a_Type),\n\t\tm_PixelX(a_X),\n\t\tm_PixelZ(a_Z),\n\t\tm_Rot(a_Rot)\n\t{\n\t}\n\npublic:\n\n\tunsigned int GetPixelX(void) const { return m_PixelX; }\n\tunsigned int GetPixelZ(void) const { return m_PixelZ; }\n\n\tint GetRot(void) const { return m_Rot; }\n\n\teType GetType(void) const { return m_Type; }\n\nprivate:\n\n\teType m_Type;\n\n\tunsigned int m_PixelX;\n\tunsigned int m_PixelZ;\n\n\tint m_Rot;\n\n};\n\n\n\n\n\n// tolua_begin\n\n/** Encapsulates an in-game world map. */\nclass cMap\n{\npublic:\n\n\tenum eBaseColor\n\t{\n\t\tE_BASE_COLOR_TRANSPARENT = 0,  /* Air     */\n\t\tE_BASE_COLOR_LIGHT_GREEN = 4,  /* Grass   */\n\t\tE_BASE_COLOR_LIGHT_BLUE = 5,\n\t\tE_BASE_COLOR_LIGHT_BROWN = 8,  /* Sand    */\n\t\tE_BASE_COLOR_GRAY_1      = 12, /* Cloth   */\n\t\tE_BASE_COLOR_RED         = 16, /* TNT     */\n\t\tE_BASE_COLOR_PALE_BLUE   = 20, /* Ice     */\n\t\tE_BASE_COLOR_GRAY_2      = 24, /* Iron    */\n\t\tE_BASE_COLOR_DARK_GREEN  = 28, /* Foliage */\n\t\tE_BASE_COLOR_WHITE       = 32, /* Snow    */\n\t\tE_BASE_COLOR_LIGHT_GRAY  = 36, /* Clay    */\n\t\tE_BASE_COLOR_BROWN       = 40, /* Dirt    */\n\t\tE_BASE_COLOR_DARK_GRAY   = 44, /* Stone   */\n\t\tE_BASE_COLOR_BLUE        = 48, /* Water   */\n\t\tE_BASE_COLOR_DARK_BROWN  = 52  /* Wood    */\n\t};\n\n\ttypedef Byte ColorID;\n\n\t// tolua_end\n\n\ttypedef std::vector<ColorID> cColorList;\n\ttypedef std::vector<cClientHandle *> cMapClientList;\n\ttypedef std::vector<cMapDecorator> cMapDecoratorList;\n\n\t/** Construct an empty map. */\n\tcMap(unsigned int a_ID, cWorld * a_World);\n\n\t/** Construct an empty map at the specified coordinates. */\n\tcMap(unsigned int a_ID, int a_CenterX, int a_CenterZ, cWorld * a_World, unsigned int a_Scale = 3);\n\n\t/** Sends a map update to all registered clients\n\tClears the list holding registered clients and decorators */\n\tvoid Tick();\n\n\t/** Update a circular region with the specified radius and center (in pixels). */\n\tvoid UpdateRadius(int a_PixelX, int a_PixelZ, unsigned int a_Radius);\n\n\t/** Update a circular region around the specified player. */\n\tvoid UpdateRadius(cPlayer & a_Player, unsigned int a_Radius);\n\n\t/** Send next update packet to the specified player and remove invalid decorators / clients. */\n\tvoid UpdateClient(cPlayer * a_Player);\n\n\t// tolua_begin\n\n\tvoid Resize(unsigned int a_Width, unsigned int a_Height);\n\n\tvoid SetPosition(int a_CenterX, int a_CenterZ);\n\n\tvoid SetScale(unsigned int a_Scale) { m_Scale = a_Scale; }\n\n\tbool SetPixel(unsigned int a_X, unsigned int a_Z, ColorID a_Data);\n\n\tColorID GetPixel(unsigned int a_X, unsigned int a_Z);\n\n\tunsigned int GetWidth (void) const { return m_Width;  }\n\tunsigned int GetHeight(void) const { return m_Height; }\n\n\tunsigned int GetScale(void) const { return m_Scale; }\n\n\tint GetCenterX(void) const { return m_CenterX; }\n\tint GetCenterZ(void) const { return m_CenterZ; }\n\n\tunsigned int GetID(void) const { return m_ID; }\n\n\tcWorld * GetWorld(void) { return m_World; }\n\n\tAString GetName(void) { return m_Name; }\n\n\teDimension GetDimension(void) const;\n\n\tunsigned int GetNumPixels(void) const;\n\n\tunsigned int GetPixelWidth(void) const;\n\n\t// tolua_end\n\n\tconst cMapDecorator CreateDecorator(const cEntity * a_TrackedEntity);\n\n\tconst cMapDecoratorList GetDecorators(void) const { return m_Decorators; }\n\n\tconst cColorList & GetData(void) const { return m_Data; }\n\nprivate:\n\n\t/** Update the specified pixel. */\n\tbool UpdatePixel(unsigned int a_X, unsigned int a_Z);\n\n\tunsigned int m_ID;\n\n\tunsigned int m_Width;\n\tunsigned int m_Height;\n\n\t/** The zoom level, 2^scale square blocks per pixel */\n\tunsigned int m_Scale;\n\n\tint m_CenterX;\n\tint m_CenterZ;\n\n\tbool m_Dirty;\n\n\t/** Column-major array of colours */\n\tcColorList m_Data;\n\n\tcWorld * m_World;\n\n\tcMapClientList m_ClientsInCurrentTick;\n\n\tcMapDecoratorList m_Decorators;\n\n\tAString m_Name;\n\n\tfriend class cMapManager;\n\tfriend class cMapSerializer;\n\n};  // tolua_export\n\n\n\n"
  },
  {
    "path": "src/MapManager.cpp",
    "content": "\n// MapManager.cpp\n\n#include \"Globals.h\"\n\n#include \"MapManager.h\"\n\n#include \"World.h\"\n#include \"WorldStorage/MapSerializer.h\"\n\n\n\n\n\n// 6000 ticks or 5 minutes\n#define MAP_DATA_SAVE_INTERVAL 6000\n\n\n\n\n\ncMapManager::cMapManager(cWorld * a_World) :\n\tm_World(a_World),\n\tm_TicksUntilNextSave(MAP_DATA_SAVE_INTERVAL)\n{\n\tASSERT(m_World != nullptr);\n}\n\n\n\n\n\nbool cMapManager::DoWithMap(UInt32 a_ID, cMapCallback a_Callback)\n{\n\tcCSLock Lock(m_CS);\n\tcMap * Map = GetMapData(a_ID);\n\n\tif (Map == nullptr)\n\t{\n\t\treturn false;\n\t}\n\telse\n\t{\n\t\ta_Callback(*Map);\n\t\treturn true;\n\t}\n}\n\n\n\n\n\nvoid cMapManager::TickMaps()\n{\n\tcCSLock Lock(m_CS);\n\tfor (auto & Map : m_MapData)\n\t{\n\t\tMap.Tick();\n\t}\n\n\tif (m_TicksUntilNextSave == 0)\n\t{\n\t\tm_TicksUntilNextSave = MAP_DATA_SAVE_INTERVAL;\n\t\tSaveMapData();\n\t}\n\telse\n\t{\n\t\tm_TicksUntilNextSave--;\n\t}\n}\n\n\n\n\n\ncMap * cMapManager::GetMapData(unsigned int a_ID)\n{\n\tif (a_ID < m_MapData.size())\n\t{\n\t\treturn &m_MapData[a_ID];\n\t}\n\telse\n\t{\n\t\treturn nullptr;\n\t}\n}\n\n\n\n\n\ncMap * cMapManager::CreateMap(int a_CenterX, int a_CenterY, unsigned int a_Scale)\n{\n\tcCSLock Lock(m_CS);\n\n\tif (m_MapData.size() >= 65536)\n\t{\n\t\tLOGWARN(\"Could not craft map - Too many maps in use\");\n\t\treturn nullptr;\n\t}\n\n\tcMap Map(static_cast<unsigned>(m_MapData.size()), a_CenterX, a_CenterY, m_World, a_Scale);\n\n\tm_MapData.push_back(Map);\n\n\treturn &m_MapData[Map.GetID()];\n}\n\n\n\n\n\nvoid cMapManager::LoadMapData(void)\n{\n\tcCSLock Lock(m_CS);\n\n\tcIDCountSerializer IDSerializer(m_World->GetDataPath());\n\n\tif (!IDSerializer.Load())\n\t{\n\t\treturn;\n\t}\n\n\tunsigned int MapCount = IDSerializer.GetMapCount();\n\n\tm_MapData.clear();\n\n\tfor (unsigned int i = 0; i < MapCount; ++i)\n\t{\n\t\tcMap Map(i, m_World);\n\n\t\tcMapSerializer Serializer(m_World->GetDataPath(), &Map);\n\n\t\tif (!Serializer.Load())\n\t\t{\n\t\t\tLOGWARN(\"Could not load map #%i\", Map.GetID());\n\t\t}\n\n\t\tm_MapData.push_back(Map);\n\t}\n}\n\n\n\n\n\nvoid cMapManager::SaveMapData(void)\n{\n\tcCSLock Lock(m_CS);\n\n\tif (m_MapData.empty())\n\t{\n\t\treturn;\n\t}\n\n\tcIDCountSerializer IDSerializer(m_World->GetDataPath());\n\n\tIDSerializer.SetMapCount(static_cast<unsigned>(m_MapData.size()));\n\n\tif (!IDSerializer.Save())\n\t{\n\t\tLOGERROR(\"Could not save idcounts.dat\");\n\t\treturn;\n\t}\n\n\tfor (cMapList::iterator it = m_MapData.begin(); it != m_MapData.end(); ++it)\n\t{\n\t\tcMap & Map = *it;\n\n\t\tif (Map.m_Dirty)\n\t\t{\n\t\t\tcMapSerializer Serializer(m_World->GetDataPath(), &Map);\n\n\t\t\tif (Serializer.Save())\n\t\t\t{\n\t\t\t\tMap.m_Dirty = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLOGWARN(\"Could not save map #%i\", Map.GetID());\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/MapManager.h",
    "content": "\n// MapManager.h\n\n\n\n\n\n#pragma once\n\n\n\n\n\n#include \"FunctionRef.h\"\n#include \"Map.h\"\n\n\n\n\nusing cMapCallback = cFunctionRef<bool(cMap &)>;\n\n\n\n\n// tolua_begin\n\n/** Manages the in-game maps of a single world - Thread safe. */\nclass cMapManager\n{\npublic:\n\t// tolua_end\n\n\tcMapManager(cWorld * a_World);\n\n\t/** Returns the map with the specified ID, nullptr if out of range.\n\tWARNING: The returned map object is not thread safe. */\n\tcMap * GetMapData(unsigned int a_ID);\n\n\t/** Creates a new map. Returns nullptr on error */\n\tcMap * CreateMap(int a_CenterX, int a_CenterY, unsigned int a_Scale = 3);\n\n\t/** Calls the callback for the map with the specified ID.\n\tReturns true if the map was found and the callback called, false if map not found.\n\tCallback return value is ignored. */\n\tbool DoWithMap(UInt32 a_ID, cMapCallback a_Callback);  // Exported in ManualBindings.cpp\n\n\t/** Ticks each registered map */\n\tvoid TickMaps(void);\n\n\t/** Loads the map data from the disk */\n\tvoid LoadMapData(void);\n\n\t/** Saves the map data to the disk */\n\tvoid SaveMapData(void);\n\n\nprivate:\n\n\ttypedef std::vector<cMap> cMapList;\n\n\tcCriticalSection m_CS;\n\n\tcMapList m_MapData;\n\n\tcWorld * m_World;\n\n\t/** How long till the map data will be saved\n\tDefault save interval is #defined in MAP_DATA_SAVE_INTERVAL */\n\tunsigned int m_TicksUntilNextSave;\n\n};  // tolua_export\n\n\n\n"
  },
  {
    "path": "src/Matrix4.h",
    "content": "\n#pragma once\n\n\n\n#define _USE_MATH_DEFINES  // Enable non-standard math defines (MSVC)\n#include <math.h>\n\n\n\n\n\ntemplate <typename T>\n// tolua_begin\nclass Matrix4\n{\n\n\tTOLUA_TEMPLATE_BIND((T, float, double))\n\n\t// tolua_end\n\npublic:\n\n\tT cell[16];\n\n\t// tolua_begin\n\n\tinline Matrix4(void)\n\t{\n\t\tIdentity();\n\t}\n\n\tinline Matrix4(const Matrix4 & a_Rhs)\n\t{\n\t\t*this = a_Rhs;\n\t}\n\n\t// tolua_end\n\n\tinline Matrix4 & operator = (const Matrix4 & a_Rhs)\n\t{\n\t\tfor (unsigned int i = 0; i < 16; ++i)\n\t\t{\n\t\t\tcell[i] = a_Rhs.cell[i];\n\t\t}\n\t\treturn *this;\n\t}\n\n\t// tolua_begin\n\n\tinline T & operator [] (int a_N)\n\t{\n\t\tASSERT(a_N < 16);\n\t\treturn cell[a_N];\n\t}\n\n\tinline void Identity()\n\t{\n\t\tcell[1]  = cell[2]  = cell[3]  = cell[4]  = 0;\n\t\tcell[6]  = cell[7]  = cell[8]  = cell[9]  = 0;\n\t\tcell[11] = cell[12] = cell[13] = cell[14] = 0;\n\n\t\tcell[0] = cell[5] = cell[10] = cell[15] = 1;\n\t}\n\n\tinline void Init(const Vector3<T> & a_Pos, T a_RX, T a_RY, T a_RZ)\n\t{\n\t\tMatrix4<T> t;\n\t\tt.RotateX(a_RZ);\n\t\tRotateY(a_RY);\n\t\tConcatenate(t);\n\t\tt.RotateZ(a_RX);\n\t\tConcatenate(t);\n\t\tTranslate(a_Pos);\n\t}\n\n\tinline void RotateX(T a_RX)\n\t{\n\t\tT sx = static_cast<T>(sin(a_RX * M_PI / 180));\n\t\tT cx = static_cast<T>(cos(a_RX * M_PI / 180));\n\n\t\tIdentity();\n\n\t\tcell[5] = cx;  cell[6]  = sx;\n\t\tcell[9] = -sx; cell[10] = cx;\n\t}\n\n\tinline void RotateY(T a_RY)\n\t{\n\t\tT sy = static_cast<T>(sin(a_RY * M_PI / 180));\n\t\tT cy = static_cast<T>(cos(a_RY * M_PI / 180));\n\n\t\tIdentity();\n\n\t\tcell[0] = cy; cell[2] = -sy;\n\t\tcell[8] = sy; cell[10] = cy;\n\t}\n\n\tinline void RotateZ(T a_RZ)\n\t{\n\t\tT sz = static_cast<T>(sin(a_RZ * M_PI / 180));\n\t\tT cz = static_cast<T>(cos(a_RZ * M_PI / 180));\n\n\t\tIdentity();\n\n\t\tcell[0] = cz;  cell[1] = sz;\n\t\tcell[4] = -sz; cell[5] = cz;\n\t}\n\n\tinline void Translate(const Vector3<T> & a_Pos)\n\t{\n\t\tcell[3]  += a_Pos.x;\n\t\tcell[7]  += a_Pos.y;\n\t\tcell[11] += a_Pos.z;\n\t}\n\n\tinline void SetTranslation(const Vector3<T> & a_Pos)\n\t{\n\t\tcell[3]  = a_Pos.x;\n\t\tcell[7]  = a_Pos.y;\n\t\tcell[11] = a_Pos.z;\n\t}\n\n\tinline void Concatenate(const Matrix4 & m2)\n\t{\n\t\tMatrix4 res;\n\n\t\tfor (unsigned int c = 0; c < 4; ++c)\n\t\t{\n\t\t\tfor (unsigned int r = 0; r < 4; ++r)\n\t\t\t{\n\t\t\t\tres.cell[r * 4 + c] = (\n\t\t\t\t\tcell[r * 4 + 0] * m2.cell[c + 0] +\n\t\t\t\t\tcell[r * 4 + 1] * m2.cell[c + 4] +\n\t\t\t\t\tcell[r * 4 + 2] * m2.cell[c + 8] +\n\t\t\t\t\tcell[r * 4 + 3] * m2.cell[c + 12]\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t*this = res;\n\t}\n\n\tinline Vector3<T> Transform(const Vector3<T> & v) const\n\t{\n\t\tT x  = cell[0] * v.x + cell[1] * v.y + cell[2]  * v.z + cell[3];\n\t\tT y  = cell[4] * v.x + cell[5] * v.y + cell[6]  * v.z + cell[7];\n\t\tT z  = cell[8] * v.x + cell[9] * v.y + cell[10] * v.z + cell[11];\n\n\t\treturn Vector3<T>(x, y, z);\n\t}\n\n\tinline void Invert(void)\n\t{\n\t\tMatrix4 t;\n\n\t\tT tx = -cell[3];\n\t\tT ty = -cell[7];\n\t\tT tz = -cell[11];\n\n\t\tfor (unsigned int h = 0; h < 3; ++h)\n\t\t{\n\t\t\tfor (unsigned int v = 0; v < 3; ++v)\n\t\t\t{\n\t\t\t\tt.cell[h + v * 4] = cell[v + h * 4];\n\t\t\t}\n\t\t}\n\n\t\tfor (unsigned int i = 0; i < 11; ++i)\n\t\t{\n\t\t\tcell[i] = t.cell[i];\n\t\t}\n\n\t\tcell[3]  = tx * cell[0] + ty * cell[1] + tz * cell[2];\n\t\tcell[7]  = tx * cell[4] + ty * cell[5] + tz * cell[6];\n\t\tcell[11] = tx * cell[8] + ty * cell[9] + tz * cell[10];\n\t}\n\n\tinline Vector3<T> GetXColumn(void) const\n\t{\n\t\treturn Vector3<T>(cell[0], cell[1], cell[2]);\n\t}\n\n\tinline Vector3<T> GetYColumn(void) const\n\t{\n\t\treturn Vector3<T>(cell[4], cell[5], cell[6]);\n\t}\n\n\tinline Vector3<T> GetZColumn(void) const\n\t{\n\t\treturn Vector3<T>(cell[8], cell[9], cell[10]);\n\t}\n\n\tinline void SetXColumn(const Vector3<T> & a_X)\n\t{\n\t\tcell[0] = a_X.x;\n\t\tcell[1] = a_X.y;\n\t\tcell[2] = a_X.z;\n\t}\n\n\tinline void SetYColumn(const Vector3<T> & a_Y)\n\t{\n\t\tcell[4] = a_Y.x;\n\t\tcell[5] = a_Y.y;\n\t\tcell[6] = a_Y.z;\n\t}\n\n\tinline void SetZColumn(const Vector3<T> & a_Z)\n\t{\n\t\tcell[8]  = a_Z.x;\n\t\tcell[9]  = a_Z.y;\n\t\tcell[10] = a_Z.z;\n\t}\n};\n// tolua_end\n\n\n\n\n// tolua_begin\ntypedef Matrix4<double> Matrix4d;\ntypedef Matrix4<float>  Matrix4f;\n// tolua_end\n\n\n\n\n\n"
  },
  {
    "path": "src/MemorySettingsRepository.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"MemorySettingsRepository.h\"\n\n\n\n\nbool cMemorySettingsRepository::KeyExists(const AString keyname) const\n{\n\treturn m_Map.count(keyname) != 0;\n}\n\n\n\n\n\nbool cMemorySettingsRepository::HasValue(const AString & a_KeyName, const AString & a_ValueName) const\n{\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\treturn false;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\treturn (iter != outerIter->second.end());\n}\n\n\n\n\n\nint cMemorySettingsRepository::AddKeyName(const AString & a_keyname)\n{\n\tm_Map.emplace(a_keyname, std::unordered_multimap<AString, sValue>{});\n\treturn 0;\n}\n\n\n\n\n\nbool cMemorySettingsRepository::AddKeyComment(const AString & keyname, const AString & comment)\n{\n\treturn false;\n}\n\n\n\n\n\nAString cMemorySettingsRepository::GetKeyComment(const AString & keyname, const int commentID) const\n{\n\treturn \"\";\n}\n\n\n\n\n\nbool cMemorySettingsRepository::DeleteKeyComment(const AString & keyname, const int commentID)\n{\n\treturn false;\n}\n\n\n\n\n\nvoid cMemorySettingsRepository::AddValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value)\n{\n\tif (m_Writable)\n\t{\n\t\tm_Map[a_KeyName].emplace(a_ValueName, sValue(a_Value));\n\t}\n}\n\n\n\n\n\nvoid cMemorySettingsRepository::AddValue (const AString & a_KeyName, const AString & a_ValueName, Int64 a_Value)\n{\n\tif (m_Writable)\n\t{\n\t\tm_Map[a_KeyName].emplace(a_ValueName, sValue(a_Value));\n\t}\n}\n\n\n\n\n\nvoid cMemorySettingsRepository::AddValue (const AString & a_KeyName, const AString & a_ValueName, bool a_Value)\n{\n\tif (m_Writable)\n\t{\n\t\tm_Map[a_KeyName].emplace(a_ValueName, sValue(a_Value));\n\t}\n}\n\n\n\n\n\nstd::vector<std::pair<AString, AString>> cMemorySettingsRepository::GetValues(AString a_keyName)\n{\n\tstd::vector<std::pair<AString, AString>> ret;\n\tfor (const auto & pair : m_Map[a_keyName])\n\t{\n\t\tret.emplace_back(pair.first, pair.second.getStringValue());\n\t}\n\treturn ret;\n}\n\n\n\n\n\nAString cMemorySettingsRepository::GetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & defValue)    const\n{\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\treturn defValue;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\tif (iter == outerIter->second.end())\n\t{\n\t\treturn defValue;\n\t}\n\treturn iter->second.getStringValue();\n}\n\n\n\n\n\nAString cMemorySettingsRepository::GetValueSet (const AString & a_KeyName, const AString & a_ValueName, const AString & defValue)\n{\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\tAddValue(a_KeyName, a_ValueName, defValue);\n\t\treturn defValue;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\tif (iter == outerIter->second.end())\n\t{\n\t\tAddValue(a_KeyName, a_ValueName, defValue);\n\t\treturn defValue;\n\t}\n\treturn iter->second.getStringValue();\n}\n\n\n\n\n\nint cMemorySettingsRepository::GetValueSetI(const AString & a_KeyName, const AString & a_ValueName, const int defValue)\n{\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\tAddValue(a_KeyName, a_ValueName, static_cast<Int64>(defValue));\n\t\treturn defValue;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\tif (iter == outerIter->second.end())\n\t{\n\t\tAddValue(a_KeyName, a_ValueName, static_cast<Int64>(defValue));\n\t\treturn defValue;\n\t}\n\treturn static_cast<int>(iter->second.getIntValue());\n}\n\n\n\n\n\nInt64 cMemorySettingsRepository::GetValueSetI(const AString & a_KeyName, const AString & a_ValueName, const Int64 defValue)\n{\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\tAddValue(a_KeyName, a_ValueName, defValue);\n\t\treturn defValue;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\tif (iter == outerIter->second.end())\n\t{\n\t\tAddValue(a_KeyName, a_ValueName, defValue);\n\t\treturn defValue;\n\t}\n\treturn iter->second.getIntValue();\n}\n\n\n\n\n\nbool cMemorySettingsRepository::GetValueSetB(const AString & a_KeyName, const AString & a_ValueName, const bool defValue)\n{\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\tAddValue(a_KeyName, a_ValueName, defValue);\n\t\treturn defValue;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\tif (iter == outerIter->second.end())\n\t{\n\t\tAddValue(a_KeyName, a_ValueName, defValue);\n\t\treturn defValue;\n\t}\n\treturn iter->second.getBoolValue();\n}\n\n\n\n\n\nbool cMemorySettingsRepository::SetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists)\n{\n\tif (!m_Writable)\n\t{\n\t\treturn false;\n\t}\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\tif (a_CreateIfNotExists)\n\t\t{\n\t\t\tAddValue(a_KeyName, a_ValueName, a_Value);\n\t\t}\n\t\treturn a_CreateIfNotExists;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\tif (iter == outerIter->second.end())\n\t{\n\t\tif (a_CreateIfNotExists)\n\t\t{\n\t\t\tAddValue(a_KeyName, a_ValueName, a_Value);\n\t\t}\n\t\treturn a_CreateIfNotExists;\n\t}\n\titer->second = sValue(a_Value);\n\treturn true;\n}\n\n\n\n\n\nbool cMemorySettingsRepository::SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists)\n{\n\tif (!m_Writable)\n\t{\n\t\treturn false;\n\t}\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\tif (a_CreateIfNotExists)\n\t\t{\n\t\t\tAddValue(a_KeyName, a_ValueName, static_cast<Int64>(a_Value));\n\t\t}\n\t\treturn a_CreateIfNotExists;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\tif (iter == outerIter->second.end())\n\t{\n\t\tif (a_CreateIfNotExists)\n\t\t{\n\t\t\tAddValue(a_KeyName, a_ValueName, static_cast<Int64>(a_Value));\n\t\t}\n\t\treturn a_CreateIfNotExists;\n\t}\n\titer->second = sValue(static_cast<Int64>(a_Value));\n\treturn true;\n}\n\n\n\n\n\nbool cMemorySettingsRepository::DeleteValue(const AString & a_KeyName, const AString & a_ValueName)\n{\n\tif (!m_Writable)\n\t{\n\t\treturn false;\n\t}\n\tauto outerIter = m_Map.find(a_KeyName);\n\tif (outerIter == m_Map.end())\n\t{\n\t\treturn false;\n\t}\n\tauto iter = outerIter->second.find(a_ValueName);\n\tif (iter == outerIter->second.end())\n\t{\n\t\treturn false;\n\t}\n\touterIter->second.erase(iter);\n\treturn true;\n}\n\n\n\n\n\nbool cMemorySettingsRepository::Flush()\n{\n\treturn true;\n}\n\n"
  },
  {
    "path": "src/MemorySettingsRepository.h",
    "content": "\n#pragma once\n\n#include \"SettingsRepositoryInterface.h\"\n\nclass cMemorySettingsRepository : public cSettingsRepositoryInterface\n{\npublic:\n\n\tvirtual bool KeyExists(const AString keyname) const override;\n\n\tvirtual bool HasValue(const AString & a_KeyName, const AString & a_ValueName) const override;\n\n\tvirtual int AddKeyName(const AString & keyname) override;\n\n\tvirtual bool AddKeyComment(const AString & keyname, const AString & comment) override;\n\n\tvirtual AString GetKeyComment(const AString & keyname, const int commentID) const override;\n\n\tvirtual bool DeleteKeyComment(const AString & keyname, const int commentID) override;\n\n\tvirtual void AddValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value) override;\n\tvoid AddValue (const AString & a_KeyName, const AString & a_ValueName, const Int64 a_Value);\n\tvoid AddValue (const AString & a_KeyName, const AString & a_ValueName, const bool a_Value);\n\n\tvirtual std::vector<std::pair<AString, AString>> GetValues(AString a_keyName) override;\n\n\tvirtual AString GetValue (const AString & keyname, const AString & valuename, const AString & defValue = \"\")    const override;\n\n\n\tvirtual AString GetValueSet (const AString & keyname, const AString & valuename, const AString & defValue = \"\") override;\n\tvirtual int     GetValueSetI(const AString & keyname, const AString & valuename, const int       defValue = 0) override;\n\tvirtual Int64   GetValueSetI(const AString & keyname, const AString & valuename, const Int64     defValue = 0) override;\n\tvirtual bool    GetValueSetB(const AString & keyname, const AString & valuename, const bool      defValue = false) override;\n\n\tvirtual bool SetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists = true) override;\n\tvirtual bool SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists = true) override;\n\n\tvirtual bool DeleteValue(const AString & keyname, const AString & valuename) override;\n\n\tvirtual bool Flush() override;\n\n\tvoid SetReadOnly()\n\t{\n\t\tm_Writable = false;\n\t}\n\nprivate:\n\n\tbool m_Writable = true;\n\n\tstruct sValue\n\t{\n\t\tsValue(AString value):\n\t\t\t#ifndef NDEBUG\n\t\t\t\tm_Type(eType::String),\n\t\t\t#endif\n\t\t\tm_stringValue (std::move(value))\n\t\t{\n\t\t}\n\n\t\tsValue(Int64 value):\n\t\t\t#ifndef NDEBUG\n\t\t\t\tm_Type(eType::Int64),\n\t\t\t#endif\n\t\t\tm_intValue(value)\n\t\t{\n\t\t}\n\n\t\tsValue(bool value):\n\t\t\t#ifndef NDEBUG\n\t\t\t\tm_Type(eType::Bool),\n\t\t\t#endif\n\t\t\tm_boolValue(value)\n\t\t{\n\t\t}\n\n\t\tAString getStringValue() const { ASSERT(m_Type == eType::String); return m_stringValue; }\n\t\tInt64   getIntValue()    const { ASSERT(m_Type == eType::Int64);  return m_intValue;    }\n\t\tbool    getBoolValue()   const { ASSERT(m_Type == eType::Bool);   return m_boolValue;   }\n\n\tprivate:\n\n\t\t#ifndef NDEBUG\n\t\t\tenum class eType\n\t\t\t{\n\t\t\t\tString,\n\t\t\t\tInt64,\n\t\t\t\tBool\n\t\t\t} m_Type;\n\t\t#endif\n\n\t\tAString m_stringValue;\n\t\tunion\n\t\t{\n\t\t\tInt64 m_intValue;\n\t\t\tbool m_boolValue;\n\t\t};\n\t};\n\n\tstd::unordered_map<AString, std::unordered_multimap<AString, sValue>> m_Map{};\n};\n\n"
  },
  {
    "path": "src/MobCensus.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"MobCensus.h\"\n\n\n\n\n\nvoid cMobCensus::CollectMob(cMonster & a_Monster, cChunk & a_Chunk, double a_Distance)\n{\n\tm_ProximityCounter.CollectMob(a_Monster, a_Chunk, a_Distance);\n\tm_MobFamilyCollecter.CollectMob(a_Monster);\n}\n\n\n\n\n\nbool cMobCensus::IsCapped(cMonster::eFamily a_MobFamily)\n{\n\tconst int ratio = 319;  // This should be 256 as we are only supposed to take account from chunks that are in 17 x 17 from a player\n\t// but for now, we use all chunks loaded by players. that means 19 x 19 chunks. That's why we use 256 * (19 * 19) / (17 * 17) = 319\n\t// MG TODO : code the correct count\n\tconst auto MobCap = ((GetCapMultiplier(a_MobFamily) * GetNumChunks()) / ratio);\n\treturn (MobCap < m_MobFamilyCollecter.GetNumberOfCollectedMobs(a_MobFamily));\n}\n\n\n\n\n\nint cMobCensus::GetCapMultiplier(cMonster::eFamily a_MobFamily)\n{\n\tswitch (a_MobFamily)\n\t{\n\t\tcase cMonster::mfHostile: return 79;\n\t\tcase cMonster::mfPassive: return 11;\n\t\tcase cMonster::mfAmbient: return 16;\n\t\tcase cMonster::mfWater:   return 5;\n\t\tcase cMonster::mfNoSpawn:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported mob family\");\n}\n\n\n\n\n\nvoid cMobCensus::CollectSpawnableChunk(cChunk & a_Chunk)\n{\n\tm_EligibleForSpawnChunks.insert(&a_Chunk);\n}\n\n\n\n\n\nint cMobCensus::GetNumChunks(void)\n{\n\treturn static_cast<int>(m_EligibleForSpawnChunks.size());\n}\n\n\n\n\n\ncMobProximityCounter & cMobCensus::GetProximityCounter(void)\n{\n\treturn m_ProximityCounter;\n}\n\n\n\n\n\nvoid cMobCensus::Logd()\n{\n\tLOGD(\"Hostile mobs : %d %s\", m_MobFamilyCollecter.GetNumberOfCollectedMobs(cMonster::mfHostile), IsCapped(cMonster::mfHostile) ? \"(capped)\" : \"\");\n\tLOGD(\"Ambient mobs : %d %s\", m_MobFamilyCollecter.GetNumberOfCollectedMobs(cMonster::mfAmbient), IsCapped(cMonster::mfAmbient) ? \"(capped)\" : \"\");\n\tLOGD(\"Water mobs   : %d %s\", m_MobFamilyCollecter.GetNumberOfCollectedMobs(cMonster::mfWater),   IsCapped(cMonster::mfWater)   ? \"(capped)\" : \"\");\n\tLOGD(\"Passive mobs : %d %s\", m_MobFamilyCollecter.GetNumberOfCollectedMobs(cMonster::mfPassive), IsCapped(cMonster::mfPassive) ? \"(capped)\" : \"\");\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/MobCensus.h",
    "content": "\n#pragma once\n\n#include \"MobProximityCounter.h\"\n#include \"MobFamilyCollecter.h\"\n\n\n\n\n// fwd:\nclass cChunk;\nclass cMonster;\n\n\n\n\n\n/** This class is used to collect information, for each Mob, what is the distance of the closest player\nit was first being designed in order to make mobs spawn / despawn / act\nas the behaviour and even life of mobs depends on the distance to closest player\n\nas side effect : it also collect the chunks that are elligible for spawning\nas side effect 2 : it also know the caps for mobs number and can compare census to this numbers\n*/\nclass cMobCensus\n{\npublic:\n\t/** Returns the nested proximity counter */\n\tcMobProximityCounter & GetProximityCounter(void);\n\n\t// collect an elligible Chunk for Mob Spawning\n\t// MG TODO : code the correct rule (not loaded chunk but short distant from players)\n\tvoid CollectSpawnableChunk(cChunk & a_Chunk);\n\n\t/** Collect a mob - its distance to player, its family ... */\n\tvoid CollectMob(cMonster & a_Monster, cChunk & a_Chunk, double a_Distance);\n\n\t/** Returns true if the family is capped (i.e. there are more mobs of this family than max) */\n\tbool IsCapped(cMonster::eFamily a_MobFamily);\n\n\t/** log the results of census to server console */\n\tvoid Logd(void);\n\nprotected :\n\tcMobProximityCounter m_ProximityCounter;\n\tcMobFamilyCollecter m_MobFamilyCollecter;\n\n\tstd::set<cChunk *> m_EligibleForSpawnChunks;\n\n\t/** Returns the number of chunks that are elligible for spawning (for now, the loaded, valid chunks) */\n\tint GetNumChunks();\n\n\t/** Returns the cap multiplier value of the given monster family */\n\tstatic int GetCapMultiplier(cMonster::eFamily a_MobFamily);\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/MobFamilyCollecter.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"MobFamilyCollecter.h\"\n\n\n\n\n\nvoid cMobFamilyCollecter::CollectMob(cMonster & a_Monster)\n{\n\tcMonster::eFamily MobFamily = a_Monster.GetMobFamily();\n\tm_Mobs[MobFamily].insert(&a_Monster);\n}\n\n\n\n\n\nint cMobFamilyCollecter::GetNumberOfCollectedMobs(cMonster::eFamily a_Family)\n{\n\treturn static_cast<int>(m_Mobs[a_Family].size());\n}\n\n\n\n\n"
  },
  {
    "path": "src/MobFamilyCollecter.h",
    "content": "\n#pragma once\n\n#include \"Mobs/Monster.h\"  // This is a side-effect of keeping Mobfamily inside Monster class. I'd prefer to keep both (Mobfamily and Monster) inside a \"Monster\" namespace MG TODO : do it\n\n\n\n\n\n/** This class is used to collect the list of mobs for each family\n*/\nclass cMobFamilyCollecter\n{\npublic :\n\ttypedef const std::set<cMonster::eFamily> tMobFamilyList;\n\n\t// collect a mob\n\tvoid CollectMob(cMonster & a_Monster);\n\n\t// return the number of mobs for this family\n\tint GetNumberOfCollectedMobs(cMonster::eFamily a_Family);\n\nprotected :\n\tstd::map<cMonster::eFamily, std::set<cMonster *> > m_Mobs;\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/MobProximityCounter.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"MobProximityCounter.h\"\n\n#include \"Entities/Entity.h\"\n#include \"Chunk.h\"\n\n\n\n\n\nvoid cMobProximityCounter::CollectMob(cEntity & a_Monster, cChunk & a_Chunk, double a_Distance)\n{\n\t// LOGD(\"Collecting monster %s, with distance %f\", a_Monster->GetClass(), a_Distance);\n\ttMonsterToDistance::iterator it = m_MonsterToDistance.find(&a_Monster);\n\tif (it == m_MonsterToDistance.end())\n\t{\n\t\tsDistanceAndChunk newDistanceAndChunk(a_Distance, a_Chunk);\n\t\tstd::pair<tMonsterToDistance::iterator, bool> result = m_MonsterToDistance.insert(tMonsterToDistance::value_type(&a_Monster, newDistanceAndChunk));\n\t\tif (!result.second)\n\t\t{\n\t\t\tASSERT(!\"A collected Monster was not found inside distance map using find(), but insert() said there already is a key for it\");\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (a_Distance < it->second.m_Distance)\n\t\t{\n\t\t\tit->second.m_Distance = a_Distance;\n\t\t\tit->second.m_Chunk = &a_Chunk;\n\t\t}\n\t}\n\n\tm_EligibleForSpawnChunks.insert(&a_Chunk);\n\n}\n\n\n\n\n\nvoid cMobProximityCounter::convertMaps()\n{\n\tfor (tMonsterToDistance::const_iterator itr = m_MonsterToDistance.begin(); itr != m_MonsterToDistance.end(); ++itr)\n\t{\n\t\tm_DistanceToMonster.insert(tDistanceToMonster::value_type(itr->second.m_Distance, sMonsterAndChunk(*itr->first, *itr->second.m_Chunk)));\n\t}\n}\n\n\n\n\n\ncMobProximityCounter::sIterablePair cMobProximityCounter::getMobWithinThosesDistances(double a_DistanceMin, double a_DistanceMax)\n{\n\tsIterablePair toReturn;\n\ttoReturn.m_Count = 0;\n\ttoReturn.m_Begin = m_DistanceToMonster.end();\n\ttoReturn.m_End = m_DistanceToMonster.end();\n\n\ta_DistanceMin *= a_DistanceMin;// this is because is use square distance\n\ta_DistanceMax *= a_DistanceMax;\n\n\tif (m_DistanceToMonster.empty())\n\t{\n\t\tconvertMaps();\n\t}\n\n\tfor (tDistanceToMonster::const_iterator itr = m_DistanceToMonster.begin(); itr != m_DistanceToMonster.end(); ++itr)\n\t{\n\t\tif (toReturn.m_Begin == m_DistanceToMonster.end())\n\t\t{\n\t\t\tif ((a_DistanceMin == 1.0) || (itr->first > a_DistanceMin))\n\t\t\t{\n\t\t\t\ttoReturn.m_Begin = itr;  // This is the first one with distance > a_DistanceMin;\n\t\t\t}\n\t\t}\n\n\t\tif (toReturn.m_Begin != m_DistanceToMonster.end())\n\t\t{\n\t\t\tif ((a_DistanceMax != 1.0) && (itr->first > a_DistanceMax))\n\t\t\t{\n\t\t\t\ttoReturn.m_End = itr;  // This is just after the last one with distance < a_DistanceMax\n\t\t\t\t// Note : if we are not going through this, it's ok, toReturn.m_End will be end();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttoReturn.m_Count ++;\n\t\t\t}\n\t\t}\n\t}\n\treturn toReturn;\n}\n"
  },
  {
    "path": "src/MobProximityCounter.h",
    "content": "\n#pragma once\n\nclass cChunk;\nclass cEntity;\n\n\n// This class is used to collect, for each Mob, what is the distance of the closest player\n// it was first being designed in order to make mobs spawn / despawn / act\n// as the behaviour and even life of mobs depends on the distance to closest player\nclass cMobProximityCounter\n{\nprotected :\n\t// structs used for later maps (see m_MonsterToDistance and m_DistanceToMonster)\n\tstruct sDistanceAndChunk\n\t{\n\t\tsDistanceAndChunk(double a_Distance, cChunk & a_Chunk) : m_Distance(a_Distance), m_Chunk(&a_Chunk) {}\n\t\tdouble m_Distance;\n\t\tcChunk * m_Chunk;\n\t};\n\tstruct sMonsterAndChunk\n\t{\n\t\tsMonsterAndChunk(cEntity & a_Monster, cChunk & a_Chunk) : m_Monster(a_Monster), m_Chunk(a_Chunk) {}\n\t\tcEntity & m_Monster;\n\t\tcChunk & m_Chunk;\n\t};\n\npublic :\n\ttypedef std::map<cEntity *, sDistanceAndChunk> tMonsterToDistance;\n\ttypedef std::multimap<double, sMonsterAndChunk> tDistanceToMonster;\n\nprotected :\n\t// this map is filled during collection phase, it will be later transformed into DistanceToMonster\n\ttMonsterToDistance m_MonsterToDistance;\n\n\t// this map is generated after collection phase, in order to access monster by distance to player\n\ttDistanceToMonster m_DistanceToMonster;\n\n\t// this are the collected chunks. Used to determinate the number of elligible chunk for spawning.\n\tstd::set<cChunk*> m_EligibleForSpawnChunks;\n\nprotected :\n\t// transform monsterToDistance map (that was usefull for collecting) into distanceToMonster\n\t// that will be usefull for picking up.\n\tvoid convertMaps();\n\npublic :\n\t// count a mob on a specified chunk with specified distance to an unkown player\n\t// if the distance is shortest than the one collected, this become the new closest\n\t// distance and the chunk become the \"hosting\" chunk (that is the one that will perform the action)\n\tvoid CollectMob(cEntity & a_Monster, cChunk & a_Chunk, double a_Distance);\n\n\t// return the mobs that are within the range of distance of the closest player they are\n\t// that means that if a mob is 30 m from a player and 150 m from another one. It will be\n\t// in the range [0..50] but not in [100..200]\n\tstruct sIterablePair\n\t{\n\t\ttDistanceToMonster::const_iterator m_Begin;\n\t\ttDistanceToMonster::const_iterator m_End;\n\t\tint m_Count;\n\t};\n\tsIterablePair getMobWithinThosesDistances(double a_DistanceMin, double a_DistanceMax);\n\n};\n"
  },
  {
    "path": "src/MobSpawner.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"MobSpawner.h\"\n#include \"BlockInfo.h\"\n#include \"Mobs/IncludeAllMonsters.h\"\n#include \"World.h\"\n\n\n\n\n\ncMobSpawner::cMobSpawner(cMonster::eFamily a_MonsterFamily, const std::set<eMonsterType>& a_AllowedTypes) :\n\tm_MonsterFamily(a_MonsterFamily),\n\tm_NewPack(true),\n\tm_MobType(mtInvalidType)\n{\n\tfor (std::set<eMonsterType>::const_iterator itr = a_AllowedTypes.begin(); itr != a_AllowedTypes.end(); ++itr)\n\t{\n\t\tif (cMonster::FamilyFromType(*itr) == a_MonsterFamily)\n\t\t{\n\t\t\tm_AllowedTypes.insert(*itr);\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cMobSpawner::CheckPackCenter(BLOCKTYPE a_BlockType)\n{\n\t// Packs of non-water mobs can only be centered on an air block\n\t// Packs of water mobs can only be centered on a water block\n\tif (m_MonsterFamily == cMonster::mfWater)\n\t{\n\t\treturn IsBlockWater(a_BlockType);\n\t}\n\telse\n\t{\n\t\treturn a_BlockType == E_BLOCK_AIR;\n\t}\n}\n\n\n\n\n\neMonsterType cMobSpawner::ChooseMobType(EMCSBiome a_Biome)\n{\n\tstd::vector<eMonsterType> AllowedMobs;\n\n\tfor (eMonsterType MobType : GetAllowedMobTypes(a_Biome))\n\t{\n\t\tauto itr = m_AllowedTypes.find(MobType);\n\t\tif (itr != m_AllowedTypes.end())\n\t\t{\n\t\t\tAllowedMobs.push_back(MobType);\n\t\t}\n\t}\n\n\t// Pick a random mob from the options:\n\tif (AllowedMobs.empty())\n\t{\n\t\treturn mtInvalidType;\n\t}\n\n\treturn AllowedMobs[GetRandomProvider().RandInt(AllowedMobs.size() - 1)];\n}\n\n\n\n\n\nbool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, Vector3i a_RelPos, eMonsterType a_MobType, EMCSBiome a_Biome, bool a_DisableSolidBelowCheck)\n{\n\tif ((a_RelPos.y >= cChunkDef::Height - 1) || (a_RelPos.y <= 0))\n\t{\n\t\treturn false;\n\t}\n\n\tif (cChunkDef::IsValidHeight(a_RelPos.addedY(-1)) && (a_Chunk->GetBlock(a_RelPos.addedY(-1)) == E_BLOCK_BEDROCK))\n\t{\n\t\treturn false;   // Make sure mobs do not spawn on bedrock.\n\t}\n\n\tauto & Random = GetRandomProvider();\n\tauto TargetBlock = a_Chunk->GetBlock(a_RelPos);\n\n\tauto BlockLight = a_Chunk->GetBlockLight(a_RelPos);\n\tauto SkyLight = a_Chunk->GetSkyLight(a_RelPos);\n\tauto BlockAbove = a_Chunk->GetBlock(a_RelPos.addedY(1));\n\tauto BlockBelow = a_Chunk->GetBlock(a_RelPos.addedY(-1));\n\n\tSkyLight = a_Chunk->GetTimeAlteredLight(SkyLight);\n\n\tswitch (a_MobType)\n\t{\n\t\tcase mtBat:\n\t\t{\n\t\t\treturn\n\t\t\t(\n\t\t\t\t(a_RelPos.y <= 63) &&\n\t\t\t\t(BlockLight <= 4) &&\n\t\t\t\t(SkyLight <= 4) &&\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(!cBlockInfo::IsTransparent(BlockAbove))\n\t\t\t);\n\t\t}\n\n\t\tcase mtBlaze:\n\t\t{\n\t\t\treturn\n\t\t\t(\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t((!cBlockInfo::IsTransparent(BlockBelow)) || (a_DisableSolidBelowCheck)) &&\n\t\t\t\t(Random.RandBool())\n\t\t\t);\n\t\t}\n\n\t\tcase mtCaveSpider:\n\t\t{\n\t\t\treturn\n\t\t\t(\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t((!cBlockInfo::IsTransparent(BlockBelow)) || (a_DisableSolidBelowCheck)) &&\n\t\t\t\t(SkyLight <= 7) &&\n\t\t\t\t(BlockLight <= 7) &&\n\t\t\t\t(Random.RandBool())\n\t\t\t);\n\t\t}\n\n\t\tcase mtChicken:\n\t\tcase mtCow:\n\t\tcase mtPig:\n\t\tcase mtHorse:\n\t\tcase mtRabbit:\n\t\tcase mtSheep:\n\t\t{\n\t\t\treturn\n\t\t\t(\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t(BlockBelow == E_BLOCK_GRASS) &&\n\t\t\t\t(SkyLight >= 9)\n\t\t\t);\n\t\t}\n\n\t\tcase mtCreeper:\n\t\tcase mtSkeleton:\n\t\tcase mtZombie:\n\t\t{\n\t\t\treturn\n\t\t\t(\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t((!cBlockInfo::IsTransparent(BlockBelow)) || (a_DisableSolidBelowCheck)) &&\n\t\t\t\t(SkyLight <= 7) &&\n\t\t\t\t(BlockLight <= 7) &&\n\t\t\t\t(Random.RandBool())\n\t\t\t);\n\t\t}\n\n\t\tcase mtEnderman:\n\t\t{\n\t\t\tif (a_RelPos.y < 250)\n\t\t\t{\n\t\t\t\tauto blockTop = a_Chunk->GetBlock(a_RelPos.addedY(2));\n\t\t\t\tif (blockTop == E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\tblockTop = a_Chunk->GetBlock(a_RelPos.addedY(3));\n\t\t\t\t\treturn\n\t\t\t\t\t(\n\t\t\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t\t\t(blockTop == E_BLOCK_AIR) &&\n\t\t\t\t\t\t((!cBlockInfo::IsTransparent(BlockBelow)) || (a_DisableSolidBelowCheck)) &&\n\t\t\t\t\t\t(SkyLight <= 7) &&\n\t\t\t\t\t\t(BlockLight <= 7)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtGhast:\n\t\t{\n\t\t\treturn\n\t\t\t(\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t(Random.RandBool(0.01))\n\t\t\t);\n\t\t}\n\n\t\tcase mtGuardian:\n\t\t{\n\t\t\treturn\n\t\t\t(\n\t\t\t\tIsBlockWater(TargetBlock) &&\n\t\t\t\tIsBlockWater(BlockBelow) &&\n\t\t\t\t(a_RelPos.y >= 45) &&\n\t\t\t\t(a_RelPos.y <= 62)\n\t\t\t);\n\t\t}\n\n\t\tcase mtMagmaCube:\n\t\tcase mtSlime:\n\t\t{\n\t\t\tconst int AMOUNT_MOON_PHASES = 8;\n\t\t\tauto maxLight = Random.RandInt(0, 7);\n\t\t\tauto moonPhaseNumber = static_cast<int>(std::floor(a_Chunk->GetWorld()->GetWorldAge().count() / 24000)) % AMOUNT_MOON_PHASES;\n\t\t\tauto moonThreshold = static_cast<float>(std::abs(moonPhaseNumber - (AMOUNT_MOON_PHASES / 2)) / (AMOUNT_MOON_PHASES / 2));\n\t\t\treturn\n\t\t\t(\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t(\n\t\t\t\t\t(!cBlockInfo::IsTransparent(BlockBelow)) ||\n\t\t\t\t\t(a_DisableSolidBelowCheck)) &&\n\t\t\t\t(\n\t\t\t\t\t(\n\t\t\t\t\t\t(a_RelPos.y <= 40) &&\n\t\t\t\t\t\ta_Chunk->IsSlimeChunk()\n\t\t\t\t\t) ||\n\t\t\t\t\t(\n\t\t\t\t\t\t(a_Biome == biSwampland) &&\n\t\t\t\t\t\t(a_RelPos.y >= 50) &&\n\t\t\t\t\t\t(a_RelPos.y <= 70) &&\n\t\t\t\t\t\t(SkyLight <= maxLight) &&\n\t\t\t\t\t\t(BlockLight <= maxLight) &&\n\t\t\t\t\t\t(Random.RandBool(moonThreshold)) &&\n\t\t\t\t\t\t(Random.RandBool(0.5))\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase mtMooshroom:\n\t\t{\n\t\t\treturn\n\t\t\t\t(\n\t\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t\t(BlockBelow == E_BLOCK_MYCELIUM) &&\n\t\t\t\t(\n\t\t\t\t\t(a_Biome == biMushroomShore) ||\n\t\t\t\t\t(a_Biome == biMushroomIsland)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase mtOcelot:\n\t\t{\n\t\t\treturn (\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t(\n\t\t\t\t\t(BlockBelow == E_BLOCK_GRASS) || (BlockBelow == E_BLOCK_LEAVES) || (BlockBelow == E_BLOCK_NEW_LEAVES)\n\t\t\t\t) &&\n\t\t\t\t(a_RelPos.y >= 62) &&\n\t\t\t\t(Random.RandBool(2.0 / 3.0))\n\t\t\t);\n\t\t}\n\n\t\tcase mtSpider:\n\t\t{\n\t\t\tbool CanSpawn = true;\n\t\t\tbool HasFloor = false;\n\t\t\tfor (int x = 0; x < 2; ++x)\n\t\t\t{\n\t\t\t\tfor (int z = 0; z < 2; ++z)\n\t\t\t\t{\n\t\t\t\t\tCanSpawn = a_Chunk->UnboundedRelGetBlockType(a_RelPos.addedXZ(x, z), TargetBlock);\n\t\t\t\t\tCanSpawn = CanSpawn && (TargetBlock == E_BLOCK_AIR);\n\t\t\t\t\tif (!CanSpawn)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tHasFloor = (\n\t\t\t\t\t\tHasFloor ||\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\ta_Chunk->UnboundedRelGetBlockType(a_RelPos + Vector3i(x, -1, z), TargetBlock) &&\n\t\t\t\t\t\t\t!cBlockInfo::IsTransparent(TargetBlock)\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn CanSpawn && HasFloor && (SkyLight <= 7) && (BlockLight <= 7);\n\t\t}\n\n\t\tcase mtSquid:\n\t\t{\n\t\t\treturn (\n\t\t\t\tIsBlockWater(TargetBlock) &&\n\t\t\t\t(a_RelPos.y >= 45) &&\n\t\t\t\t(a_RelPos.y <= 62)\n\t\t\t);\n\t\t}\n\n\t\tcase mtWitherSkeleton:\n\t\t{\n\t\t\treturn (\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t((!cBlockInfo::IsTransparent(BlockBelow)) || (a_DisableSolidBelowCheck)) &&\n\t\t\t\t(SkyLight <= 7) &&\n\t\t\t\t(BlockLight <= 7) &&\n\t\t\t\t(Random.RandBool(0.6))\n\t\t\t);\n\t\t}\n\n\t\tcase mtWolf:\n\t\t{\n\t\t\treturn (\n\t\t\t\t(TargetBlock == E_BLOCK_GRASS) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t(\n\t\t\t\t\t(a_Biome == biColdTaiga) ||\n\t\t\t\t\t(a_Biome == biColdTaigaHills) ||\n\t\t\t\t\t(a_Biome == biColdTaigaM) ||\n\t\t\t\t\t(a_Biome == biForest) ||\n\t\t\t\t\t(a_Biome == biTaiga) ||\n\t\t\t\t\t(a_Biome == biTaigaHills) ||\n\t\t\t\t\t(a_Biome == biTaigaM) ||\n\t\t\t\t\t(a_Biome == biMegaTaiga) ||\n\t\t\t\t\t(a_Biome == biMegaTaigaHills)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase mtZombiePigman:\n\t\t{\n\t\t\treturn (\n\t\t\t\t(TargetBlock == E_BLOCK_AIR) &&\n\t\t\t\t(BlockAbove == E_BLOCK_AIR) &&\n\t\t\t\t((!cBlockInfo::IsTransparent(BlockBelow)) || (a_DisableSolidBelowCheck))\n\t\t\t);\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tLOGD(\"MG TODO: Write spawning rule for mob type %d\", a_MobType);\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nstd::set<eMonsterType> cMobSpawner::GetAllowedMobTypes(EMCSBiome a_Biome)\n{\n\tstd::set<eMonsterType> ListOfSpawnables;\n\t// Check biomes first to get a list of animals\n\tswitch (a_Biome)\n\t{\n\t\t// Mooshroom only - no other mobs on mushroom islands\n\t\tcase biMushroomIsland:\n\t\tcase biMushroomShore:\n\t\t{\n\t\t\tListOfSpawnables.insert(mtMooshroom);\n\t\t\treturn ListOfSpawnables;\n\t\t}\n\n\t\t// Add Squid in ocean and river biomes\n\t\tcase biOcean:\n\t\tcase biFrozenOcean:\n\t\tcase biFrozenRiver:\n\t\tcase biRiver:\n\t\tcase biDeepOcean:\n\t\t{\n\t\t\tListOfSpawnables.insert(mtGuardian);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Add ocelots in jungle biomes\n\t\tcase biJungle:\n\t\tcase biJungleHills:\n\t\tcase biJungleEdge:\n\t\tcase biJungleM:\n\t\tcase biJungleEdgeM:\n\t\t{\n\t\t\tListOfSpawnables.insert(mtOcelot);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Add horses in plains-like biomes\n\t\tcase biPlains:\n\t\tcase biSunflowerPlains:\n\t\tcase biSavanna:\n\t\tcase biSavannaPlateau:\n\t\tcase biSavannaM:\n\t\tcase biSavannaPlateauM:\n\t\t{\n\t\t\tListOfSpawnables.insert(mtHorse);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Add wolves in forest biomes\n\t\tcase biForest:\n\t\t{\n\t\t\tListOfSpawnables.insert(mtWolf);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Add wolves and rabbits in all taiga biomes\n\t\tcase biColdTaiga:\n\t\tcase biColdTaigaM:\n\t\tcase biColdTaigaHills:\n\t\tcase biTaiga:\n\t\tcase biTaigaHills:\n\t\tcase biTaigaM:\n\t\tcase biMegaTaiga:\n\t\tcase biMegaTaigaHills:\n\t\t{\n\t\t\tListOfSpawnables.insert(mtWolf);\n\t\t\tListOfSpawnables.insert(mtRabbit);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Add rabbits in desert and flower forest biomes\n\t\tcase biDesert:\n\t\tcase biDesertHills:\n\t\tcase biDesertM:\n\t\tcase biFlowerForest:\n\t\t{\n\t\t\tListOfSpawnables.insert(mtRabbit);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Nothing special about this biome\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Overworld\n\tif (\n\t\t(a_Biome != biDesertHills) &&\n\t\t(a_Biome != biDesert) &&\n\t\t(a_Biome != biDesertM) &&\n\t\t(a_Biome != biBeach) &&\n\t\t(a_Biome != biOcean) &&\n\t\t(a_Biome != biDeepOcean))\n\t{\n\t\tListOfSpawnables.insert(mtSheep);\n\t\tListOfSpawnables.insert(mtPig);\n\t\tListOfSpawnables.insert(mtCow);\n\t\tListOfSpawnables.insert(mtChicken);\n\t\tListOfSpawnables.insert(mtEnderman);\n\t\tListOfSpawnables.insert(mtSlime);\n\t}\n\n\tListOfSpawnables.insert(mtBat);\n\tListOfSpawnables.insert(mtSpider);\n\tListOfSpawnables.insert(mtZombie);\n\tListOfSpawnables.insert(mtSkeleton);\n\tListOfSpawnables.insert(mtCreeper);\n\tListOfSpawnables.insert(mtSquid);\n\n\t// Nether\n\tListOfSpawnables.insert(mtBlaze);\n\tListOfSpawnables.insert(mtGhast);\n\tListOfSpawnables.insert(mtMagmaCube);\n\tListOfSpawnables.insert(mtWitherSkeleton);\n\tListOfSpawnables.insert(mtZombiePigman);\n\n\treturn ListOfSpawnables;\n}\n\n\n\n\n\ncMonster * cMobSpawner::TryToSpawnHere(cChunk * a_Chunk, Vector3i a_RelPos, EMCSBiome a_Biome, int & a_MaxPackSize)\n{\n\t// If too close to any player, don't spawn anything\n\tauto AbsPos = a_Chunk->RelativeToAbsolute(a_RelPos);\n\tstatic const double RangeLimit = 24;\n\tif (\n\t\ta_Chunk->GetWorld()->DoWithNearestPlayer(\n\t\t\tAbsPos,\n\t\t\tRangeLimit,\n\t\t\t[](cPlayer & a_Player)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t)\n\t)\n\t{\n\t\treturn nullptr;\n\t}\n\n\tif (m_NewPack)\n\t{\n\t\tm_MobType = ChooseMobType(a_Biome);\n\t\tif (m_MobType == mtInvalidType)\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\t\tif (m_MobType == mtWitherSkeleton)\n\t\t{\n\t\t\ta_MaxPackSize = 5;\n\t\t}\n\t\telse if (m_MobType == mtWolf)\n\t\t{\n\t\t\ta_MaxPackSize = 8;\n\t\t}\n\t\telse if (m_MobType == mtGhast)\n\t\t{\n\t\t\ta_MaxPackSize = 1;\n\t\t}\n\t\tm_NewPack = false;\n\t}\n\n\tif ((m_AllowedTypes.find(m_MobType) != m_AllowedTypes.end()) && CanSpawnHere(a_Chunk, a_RelPos, m_MobType, a_Biome))\n\t{\n\t\tauto NewMob = cMonster::NewMonsterFromType(m_MobType);\n\t\tauto NewMobPtr = NewMob.get();\n\t\tif (NewMob)\n\t\t{\n\t\t\tm_Spawned.push_back(std::move(NewMob));\n\t\t}\n\t\treturn NewMobPtr;\n\t}\n\n\treturn nullptr;\n}\n\n\n\n\n\nvoid cMobSpawner::NewPack()\n{\n\tm_NewPack = true;\n}\n\n\n\n\n\nbool cMobSpawner::CanSpawnAnything(void)\n{\n\treturn !m_AllowedTypes.empty();\n}\n\n\n\n\n"
  },
  {
    "path": "src/MobSpawner.h",
    "content": "\n#pragma once\n\n#include \"Chunk.h\"\n#include \"Mobs/Monster.h\"  // This is a side-effect of keeping Mobfamily inside Monster class. I'd prefer to keep both (Mobfamily and Monster) inside a \"Monster\" namespace MG TODO : do it\n\n\n\n\n\n/** This class is used to determine which monster can be spawned in which place\nit is essentially static (eg. Squids spawn in water, Zombies spawn in dark places)\nbut it also has dynamic part depending on the world.ini settings.\n*/\nclass cMobSpawner\n{\npublic :\n\t/** Constructor\n\ta_MobFamily is the Family of mobs that this spawner will spawn\n\ta_AllowedTypes is the set of types allowed for mobs it will spawn. Empty set would result in no spawn at all\n\tAllowed mobs thah are not of the right Family will not be include (no warning). */\n\tcMobSpawner(cMonster::eFamily MobFamily, const std::set<eMonsterType> & a_AllowedTypes);\n\n\t/** Check if specified block can be a Pack center for this spawner */\n\tbool CheckPackCenter(BLOCKTYPE a_BlockType);\n\n\t/** Try to create a monster here\n\tIf this is the first of a Pack, determine the type of monster\n\ta_Biome, BlockType & BlockMeta are used to decide what kind of Mob can Spawn here\n\ta_MaxPackSize is set to the maximum size for a pack this type of mob */\n\tcMonster * TryToSpawnHere(cChunk * a_Chunk, Vector3i a_RelPos, EMCSBiome a_Biome, int & a_MaxPackSize);\n\n\t/** Mark the beginning of a new Pack.\n\tAll mobs of the same Pack are the same type */\n\tvoid NewPack(void);\n\n\t// return true if there is at least one allowed type\n\tbool CanSpawnAnything(void);\n\n\tstd::vector<std::unique_ptr<cMonster>> & getSpawned(void)\n\t{\n\t\treturn m_Spawned;\n\t}\n\n\t/** Returns true if specified type of mob can spawn on specified block */\n\tstatic bool CanSpawnHere(cChunk * a_Chunk, Vector3i a_RelPos, eMonsterType a_MobType, EMCSBiome a_Biome, bool a_DisableSolidBelowCheck = false);\n\n\t/** Returns all mob types that can spawn that biome */\n\tstatic std::set<eMonsterType> GetAllowedMobTypes(EMCSBiome a_Biome);\n\n\nprotected :\n\n\t/** Returns a random type that can spawn in the specified biome.\n\tReturns mtInvalidType if none is possible. */\n\teMonsterType ChooseMobType(EMCSBiome a_Biome);\n\n\tcMonster::eFamily m_MonsterFamily;\n\tstd::set<eMonsterType> m_AllowedTypes;\n\tbool m_NewPack;\n\teMonsterType m_MobType;\n\tstd::vector<std::unique_ptr<cMonster>> m_Spawned;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/AggressiveMonster.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"AggressiveMonster.h\"\n\n#include \"LineBlockTracer.h\"\n#include \"World.h\"\n#include \"Entities/Player.h\"\n\n\n\n\n\ncAggressiveMonster::cAggressiveMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, const AString & a_SoundAmbient, float a_Width, float a_Height) :\n\tSuper(a_ConfigName, a_MobType, a_SoundHurt, a_SoundDeath, a_SoundAmbient, a_Width, a_Height)\n{\n\tm_EMPersonality = AGGRESSIVE;\n}\n\n\n\n\n\n// What to do if in Chasing State\nvoid cAggressiveMonster::InStateChasing(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::InStateChasing(a_Dt, a_Chunk);\n\n\tif (GetTarget() != nullptr)\n\t{\n\t\tMoveToPosition(GetTarget()->GetPosition());\n\t}\n}\n\n\n\n\n\nvoid cAggressiveMonster::EventSeePlayer(cPlayer * a_Player, cChunk & a_Chunk)\n{\n\tSuper::EventSeePlayer(a_Player, a_Chunk);\n\tm_EMState = CHASING;\n}\n\n\n\n\n\ncMonster * cAggressiveMonster::GetMonsterOfTypeInSight(eMonsterType a_MobType, unsigned int a_SightDistance)\n{\n\n\tcMonster * FoundTarget = nullptr;\n\tauto MinimumDistance = static_cast<double>(a_SightDistance * a_SightDistance);\n\n\tclass cCallback : public cBlockTracer::cCallbacks\n\t{\n\t\tpublic:\n\t\tbool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t\t{\n\t\t\treturn a_BlockType != E_BLOCK_AIR;\n\t\t}\n\t};\n\n\tauto Callbacks = cCallback();\n\tauto Tracer = cLineBlockTracer(*GetWorld(), Callbacks);\n\n\tcEntityCallback Callback = [&](cEntity & a_Entity)\n\t{\n\t\tif (!a_Entity.IsMob())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tauto & Other = dynamic_cast<cMonster &>(a_Entity);\n\t\tif (Other.GetMobType() != a_MobType)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tVector3d MyHeadPosition = GetPosition().addedY(GetHeight());\n\t\tVector3d TargetPosition = Other.GetPosition().addedY(Other.GetHeight());\n\t\tdouble TargetDistance = (MyHeadPosition - TargetPosition).SqrLength();\n\n\t\tif (\n\t\t\t(MinimumDistance > TargetDistance) &&\n\t\t\t(TargetDistance < (a_SightDistance * a_SightDistance))\n\t\t)\n\t\t{\n\t\t\tFoundTarget = & Other;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\tcBoundingBox CheckZone(GetPosition().addedXZ(-a_SightDistance, -a_SightDistance), GetPosition().addedXZ(a_SightDistance, a_SightDistance));\n\tm_World->ForEachEntityInBox(CheckZone, Callback);\n\treturn FoundTarget;\n}\n\n\n\n\n\nvoid cAggressiveMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\t// Set or clear m_Target depending on rules for this Monster:\n\tif (m_EMState == CHASING)\n\t{\n\t\tCheckEventLostPlayer(a_Dt);\n\t}\n\telse\n\t{\n\t\tCheckEventSeePlayer(a_Chunk);\n\t}\n\n\tif (\n\t\t(GetTarget() != nullptr) &&\n\t\tTargetIsInRange() &&\n\t\tcLineBlockTracer::LineOfSightTrace(\n\t\t\t*GetWorld(),\n\t\t\tGetPosition().addedY(GetHeight()),\n\t\t\tGetTarget()->GetPosition().addedY(GetTarget()->GetHeight()),\n\t\t\t(IsNetherNative() ? cLineBlockTracer::losAirWaterLava : cLineBlockTracer::losAirWater)\n\t\t) &&\n\t\t(GetHealth() > 0.0)\n\t)\n\t{\n\t\t// Attack if reached destination, target isn't null, and have a clear line of sight to target (so won't attack through walls)\n\t\tAttack(a_Dt);\n\t}\n}\n\n\n\n\n\nbool cAggressiveMonster::Attack(std::chrono::milliseconds a_Dt)\n{\n\tif ((GetTarget() == nullptr) || (m_AttackCoolDownTicksLeft != 0))\n\t{\n\t\treturn false;\n\t}\n\n\t// Setting this higher gives us more wiggle room for attackrate\n\tResetAttackCooldown();\n\n\tdouble KnockbackAmount = 9;\n\tGetTarget()->TakeDamage(dtMobAttack, this, m_AttackDamage, KnockbackAmount);\n\n\treturn true;\n}\n"
  },
  {
    "path": "src/Mobs/AggressiveMonster.h",
    "content": "\n#pragma once\n\n#include \"Monster.h\"\n\n\n\n\n\nclass cAggressiveMonster:\n\tpublic cMonster\n{\n\tusing Super = cMonster;\n\npublic:\n\n\tcAggressiveMonster(\n\t\tconst AString & a_ConfigName,\n\t\teMonsterType a_MobType,\n\t\tconst AString & a_SoundHurt,\n\t\tconst AString & a_SoundDeath,\n\t\tconst AString & a_SoundAmbient,\n\t\tfloat a_Width,\n\t\tfloat a_Height\n\t);\n\n\tvirtual void Tick          (std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void InStateChasing(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\n\tvirtual void EventSeePlayer(cPlayer * a_Player, cChunk & a_Chunk) override;\n\n\t/**\n\t* Check if a monster of certain type is in sight\n\t*\n\t* @param a_mobtype the mob type to find\n\t* @param SightDistance max distance to check\n\t*\n\t* @return pointer to the mob found\n\t*/\n\tcMonster * GetMonsterOfTypeInSight(eMonsterType a_mobtype, unsigned int SightDistance=16);\n\n\t/** Try to perform attack\n\treturns true if attack was deemed successful (hit player, fired projectile, creeper exploded, etc.) even if it didn't actually do damage\n\treturn false if e.g. the mob is still in cooldown from a previous attack */\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt);\n} ;\n"
  },
  {
    "path": "src/Mobs/Bat.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Bat.h\"\n#include \"../Chunk.h\"\n\n\ncBat::cBat(void) :\n\tSuper(\"Bat\", mtBat, \"entity.bat.hurt\", \"entity.bat.death\", \"entity.bat.ambient\", 0.5f, 0.9f)\n{\n\tSetGravity(-2.0f);\n\tSetAirDrag(0.05f);\n}\n\n\n"
  },
  {
    "path": "src/Mobs/Bat.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n\n\n\n\n\nclass cBat:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tcBat();\n\n\tCLASS_PROTODEF(cBat)\n\n\tbool IsHanging(void) const {return false; }\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Blaze.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Blaze.h\"\n#include \"../World.h\"\n#include \"../Entities/FireChargeEntity.h\"\n\n\n\n\ncBlaze::cBlaze(void) :\n\tSuper(\"Blaze\", mtBlaze, \"entity.blaze.hurt\", \"entity.blaze.death\", \"entity.blaze.ambient\", 0.6f, 1.8f),\n\tm_IsCharging(false),\n\tm_ChargeTimer(0)\n{\n\tSetGravity(-8.0f);\n\tSetAirDrag(0.05f);\n}\n\n\n\n\n\nbool cBlaze::Attack(std::chrono::milliseconds a_Dt)\n{\n\tif ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0) && (!m_IsCharging))\n\t{\n\t\tm_IsCharging = true;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cBlaze::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif ((a_Killer != nullptr) && (a_Killer->IsPlayer() || a_Killer->IsA(\"cWolf\")))\n\t{\n\t\tunsigned int LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_BLAZE_ROD);\n\t}\n}\n\n\n\n\n\nvoid cBlaze::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (m_IsCharging)\n\t{\n\t\tm_ChargeTimer++;\n\t\tif (\n\t\t\t(m_ChargeTimer == 5) ||\n\t\t\t(m_ChargeTimer == 10) ||\n\t\t\t(m_ChargeTimer == 15)\n\t\t)\n\t\t{\n\t\t\tVector3d Speed = GetLookVector() * 20;\n\t\t\tSpeed.y = Speed.y + 1;\n\n\t\t\tauto FireCharge = std::make_unique<cFireChargeEntity>(this, GetPosition().addedY(1), Speed);\n\t\t\tauto FireChargePtr = FireCharge.get();\n\t\t\tFireChargePtr->Initialize(std::move(FireCharge), *m_World);\n\n\t\t\tm_World->BroadcastSoundEffect(\"entity.blaze.shoot\", GetPosition(), 4.0f, 1.0f);\n\t\t}\n\t}\n\n\tif ((m_IsCharging) && (m_ChargeTimer > 15))\n\t{\n\t\tm_ChargeTimer = 0;\n\t\tm_IsCharging = false;\n\t\tResetAttackCooldown();\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Blaze.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cBlaze:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcBlaze();\n\n\tCLASS_PROTODEF(cBlaze)\n\nprivate:\n\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool IsNetherNative(void) override { return true; }\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\t/** Specifies whether or not the blaze has started shooting fireballs. */\n\tbool m_IsCharging;\n\n\t/** Number of ticks since the blaze started charging.\n\tUsed to create 3 successive projectiles. */\n\tint m_ChargeTimer;\n} ;\n"
  },
  {
    "path": "src/Mobs/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tAggressiveMonster.cpp\n\tBat.cpp\n\tBlaze.cpp\n\tCaveSpider.cpp\n\tChicken.cpp\n\tCow.cpp\n\tCreeper.cpp\n\tEnderDragon.cpp\n\tEndermite.cpp\n\tEnderman.cpp\n\tGhast.cpp\n\tGiant.cpp\n\tGuardian.cpp\n\tHorse.cpp\n\tIronGolem.cpp\n\tMagmaCube.cpp\n\tMonster.cpp\n\tMooshroom.cpp\n\tOcelot.cpp\n\tPassiveAggressiveMonster.cpp\n\tPassiveMonster.cpp\n\tPath.cpp\n\tPathFinder.cpp\n\tPig.cpp\n\tRabbit.cpp\n\tSheep.cpp\n\tSilverfish.cpp\n\tSkeleton.cpp\n\tSlime.cpp\n\tSnowGolem.cpp\n\tSpider.cpp\n\tSquid.cpp\n\tVillager.cpp\n\tWitch.cpp\n\tWither.cpp\n\tWitherSkeleton.cpp\n\tWolf.cpp\n\tZombie.cpp\n\tZombiePigman.cpp\n\tZombieVillager.cpp\n\n\tAggressiveMonster.h\n\tBat.h\n\tBlaze.h\n\tCaveSpider.h\n\tChicken.h\n\tCow.h\n\tCreeper.h\n\tEnderDragon.h\n\tEndermite.h\n\tEnderman.h\n\tGhast.h\n\tGiant.h\n\tGuardian.h\n\tHorse.h\n\tIncludeAllMonsters.h\n\tIronGolem.h\n\tMagmaCube.h\n\tMonster.h\n\tMonsterTypes.h\n\tMooshroom.h\n\tOcelot.h\n\tPassiveAggressiveMonster.h\n\tPassiveMonster.h\n\tPath.h\n\tPathFinder.h\n\tPig.h\n\tRabbit.h\n\tSheep.h\n\tSilverfish.h\n\tSkeleton.h\n\tSlime.h\n\tSnowGolem.h\n\tSpider.h\n\tSquid.h\n\tVillager.h\n\tWitch.h\n\tWither.h\n\tWitherSkeleton.h\n\tWolf.h\n\tZombie.h\n\tZombiePigman.h\n\tZombieVillager.h\n)\n"
  },
  {
    "path": "src/Mobs/CaveSpider.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"CaveSpider.h\"\n#include \"../World.h\"\n\n\n\n\n\ncCaveSpider::cCaveSpider(void) :\n\tSuper(\"CaveSpider\", mtCaveSpider, \"entity.spider.hurt\", \"entity.spider.death\", \"entity.spider.ambient\", 0.7f, 0.5f)\n{\n}\n\n\n\n\n\nvoid cCaveSpider::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tm_EMPersonality = (GetWorld()->GetTimeOfDay() < 13000_tick) ? PASSIVE : AGGRESSIVE;\n}\n\n\n\n\n\nbool cCaveSpider::Attack(std::chrono::milliseconds a_Dt)\n{\n\tif (!Super::Attack(a_Dt))\n\t{\n\t\treturn false;\n\t}\n\n\tif (GetTarget()->IsPawn())\n\t{\n\t\t// TODO: Easy = no poison, Medium = 7 seconds, Hard = 15 seconds\n\t\tstatic_cast<cPawn *>(GetTarget())->AddEntityEffect(cEntityEffect::effPoison, 7 * 20, 0);\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cCaveSpider::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_STRING);\n\tif ((a_Killer != nullptr) && (a_Killer->IsPlayer() || a_Killer->IsA(\"cWolf\")))\n\t{\n\t\tAddRandomUncommonDropItem(a_Drops, 33.0f, E_ITEM_SPIDER_EYE);\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/CaveSpider.h",
    "content": "#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cCaveSpider:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcCaveSpider();\n\n\tCLASS_PROTODEF(cCaveSpider)\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Chicken.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Chicken.h\"\n#include \"../World.h\"\n\n\n\n\n\ncChicken::cChicken(void) :\n\tSuper(\"Chicken\", mtChicken, \"entity.chicken.hurt\", \"entity.chicken.death\", \"entity.chicken.ambient\", 0.4f, 0.7f),\n\tm_EggDropTimer(0)\n{\n\tSetGravity(-2.0f);\n\tSetAirDrag(0.0f);\n}\n\n\n\n\n\nvoid cChicken::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (IsBaby())\n\t{\n\t\treturn;  // Babies don't lay eggs\n\t}\n\n\tif (\n\t\t((m_EggDropTimer == 6000) && GetRandomProvider().RandBool()) ||\n\t\tm_EggDropTimer == 12000\n\t)\n\t{\n\t\tcItems Drops;\n\t\tm_EggDropTimer = 0;\n\t\tDrops.emplace_back(E_ITEM_EGG, static_cast<char>(1));\n\t\tm_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ(), 10);\n\t}\n\telse\n\t{\n\t\tm_EggDropTimer++;\n\t}\n}\n\n\n\n\n\nvoid cChicken::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif (IsBaby())\n\t{\n\t\treturn;  // Babies don't drop items\n\t}\n\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_FEATHER);\n\tAddRandomDropItem(a_Drops, 1, 1, IsOnFire() ? E_ITEM_COOKED_CHICKEN : E_ITEM_RAW_CHICKEN);\n}\n\n\n\n\n\nbool cChicken::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (a_TDI.DamageType == dtFalling)\n\t{\n\t\treturn false;\n\t}\n\n\treturn Super::DoTakeDamage(a_TDI);\n}\n"
  },
  {
    "path": "src/Mobs/Chicken.h",
    "content": "#pragma once\n\n#include \"PassiveMonster.h\"\n\n\n\n\n\nclass cChicken:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tcChicken();\n\n\tCLASS_PROTODEF(cChicken)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tvirtual void GetFollowedItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_BEETROOT_SEEDS);\n\t\ta_Items.Add(E_ITEM_MELON_SEEDS);\n\t\ta_Items.Add(E_ITEM_PUMPKIN_SEEDS);\n\t\ta_Items.Add(E_ITEM_SEEDS);\n\t}\n\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\nprivate:\n\n\tint m_EggDropTimer;\n} ;\n\n\n\n"
  },
  {
    "path": "src/Mobs/Cow.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Cow.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\ncCow::cCow(void) :\n\tSuper(\"Cow\", mtCow, \"entity.cow.hurt\", \"entity.cow.death\", \"entity.cow.ambient\", 0.9f, 1.4f)\n{\n}\n\n\n\n\n\nvoid cCow::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif (IsBaby())\n\t{\n\t\treturn;  // Babies don't drop items\n\t}\n\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_LEATHER);\n\tAddRandomDropItem(a_Drops, 1, 3 + LootingLevel, IsOnFire() ? E_ITEM_STEAK : E_ITEM_RAW_BEEF);\n}\n\n\n\n\n\nvoid cCow::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tshort HeldItem = a_Player.GetEquippedItem().m_ItemType;\n\tif (HeldItem == E_ITEM_BUCKET)\n\t{\n\t\t// Milk the cow.\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_MILK));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Cow.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n\n\n\n\n\nclass cCow:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tcCow();\n\n\tCLASS_PROTODEF(cCow)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\n\tvirtual void GetFollowedItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_WHEAT);\n\t}\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Creeper.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Creeper.h\"\n#include \"../World.h\"\n#include \"../Entities/ProjectileEntity.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\ncCreeper::cCreeper(void) :\n\tSuper(\"Creeper\", mtCreeper, \"entity.creeper.hurt\", \"entity.creeper.death\", \"entity.creeper.ambient\", 0.6f, 1.7f),\n\tm_bIsBlowing(false),\n\tm_bIsCharged(false),\n\tm_BurnedWithFlintAndSteel(false),\n\tm_ExplodingTimer(0)\n{\n}\n\n\n\n\n\nvoid cCreeper::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (((GetTarget() == nullptr) || !TargetIsInRange()) && !m_BurnedWithFlintAndSteel)\n\t{\n\t\tif (m_bIsBlowing)\n\t\t{\n\t\t\tm_ExplodingTimer = 0;\n\t\t\tm_bIsBlowing = false;\n\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (m_bIsBlowing)\n\t\t{\n\t\t\tm_ExplodingTimer += 1;\n\t\t}\n\n\t\tif ((m_ExplodingTimer == 30) && (GetHealth() > 0.0))  // only explode when not already dead\n\t\t{\n\t\t\tm_World->DoExplosionAt((m_bIsCharged ? 5 : 3), GetPosX(), GetPosY(), GetPosZ(), false, esMonster, this);\n\t\t\tDestroy();  // Just in case we aren't killed by the explosion\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cCreeper::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif (m_ExplodingTimer == 30)\n\t{\n\t\t// Exploded creepers drop naught but charred flesh, which Minecraft doesn't have\n\t\treturn;\n\t}\n\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GUNPOWDER);\n\n\t// If the creeper was killed by a skeleton, add a random music disc drop:\n\tif (\n\t\t(a_Killer != nullptr) &&\n\t\ta_Killer->IsProjectile() &&\n\t\t((static_cast<cProjectileEntity *>(a_Killer))->GetCreatorUniqueID() != cEntity::INVALID_ID))\n\t{\n\t\tauto ProjectileCreatorCallback = [](cEntity & a_Entity)\n\t\t\t{\n\t\t\t\treturn (\n\t\t\t\t\ta_Entity.IsMob() &&\n\t\t\t\t\t((static_cast<cMonster &>(a_Entity)).GetMobType() == mtSkeleton)\n\t\t\t\t);\n\t\t\t};\n\n\t\tif (GetWorld()->DoWithEntityByID(static_cast<cProjectileEntity *>(a_Killer)->GetCreatorUniqueID(), ProjectileCreatorCallback))\n\t\t{\n\t\t\tAddRandomDropItem(a_Drops, 1, 1, static_cast<short>(m_World->GetTickRandomNumber(11) + E_ITEM_FIRST_DISC));\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cCreeper::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tif (a_TDI.DamageType == dtLightning)\n\t{\n\t\tm_bIsCharged = true;\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n\treturn true;\n}\n\n\n\n\n\nbool cCreeper::Attack(std::chrono::milliseconds a_Dt)\n{\n\tUNUSED(a_Dt);\n\n\tif (!m_bIsBlowing)\n\t{\n\t\tm_World->BroadcastSoundEffect(\"entity.creeper.primed\", GetPosition(), 1.f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));\n\t\tm_bIsBlowing = true;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cCreeper::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tif ((a_Player.GetEquippedItem().m_ItemType == E_ITEM_FLINT_AND_STEEL))\n\t{\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.UseEquippedItem();\n\t\t}\n\t\tm_World->BroadcastSoundEffect(\"entity.creeper.primed\", GetPosition(), 1.f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));\n\t\tm_bIsBlowing = true;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t\tm_BurnedWithFlintAndSteel = true;\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Creeper.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cCreeper:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcCreeper();\n\n\tCLASS_PROTODEF(cCreeper)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\n\tbool IsBlowing(void) const {return m_bIsBlowing; }\n\tbool IsCharged(void) const {return m_bIsCharged; }\n\tbool IsBurnedWithFlintAndSteel(void) const {return m_BurnedWithFlintAndSteel; }\n\nprivate:\n\n\tbool m_bIsBlowing, m_bIsCharged, m_BurnedWithFlintAndSteel;\n\tint m_ExplodingTimer;\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/EnderDragon.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"EnderDragon.h\"\n#include \"../ClientHandle.h\"\n#include \"../CompositeChat.h\"\n\n\n\n\n\ncEnderDragon::cEnderDragon(void) :\n\tSuper(\"EnderDragon\", mtEnderDragon, \"entity.enderdragon.hurt\", \"entity.enderdragon.death\", \"entity.enderdragon.ambient\", 16, 8)\n{\n}\n\n\n\n\n\nbool cEnderDragon::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tm_World->BroadcastBossBarUpdateHealth(*this, GetUniqueID(), GetHealth() / GetMaxHealth());\n\treturn true;\n}\n\n\n\n\n\nvoid cEnderDragon::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\t// No drops\n}\n\n\n\n\n\nvoid cEnderDragon::SpawnOn(cClientHandle & a_Client)\n{\n\tSuper::SpawnOn(a_Client);\n\n\t// Red boss bar with no divisions that plays boss music and creates fog:\n\ta_Client.SendBossBarAdd(GetUniqueID(), cCompositeChat(\"Ender Dragon\"), GetHealth() / GetMaxHealth(), BossBarColor::Red, BossBarDivisionType::None, false, true, true);\n}\n"
  },
  {
    "path": "src/Mobs/EnderDragon.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cEnderDragon:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcEnderDragon();\n\n\tCLASS_PROTODEF(cEnderDragon)\n\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void SpawnOn(cClientHandle & a_Client) override;\n} ;\n"
  },
  {
    "path": "src/Mobs/Enderman.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Chunk.h\"\n#include \"Enderman.h\"\n#include \"../Entities/Player.h\"\n#include \"../LineBlockTracer.h\"\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPlayerLookCheck\nclass cPlayerLookCheck\n{\npublic:\n\n\tcPlayerLookCheck(Vector3d a_EndermanHeadPosition, int a_SightDistance) :\n\t\tm_Player(nullptr),\n\t\tm_EndermanHeadPosition(a_EndermanHeadPosition),\n\t\tm_SightDistance(a_SightDistance)\n\t{\n\t}\n\n\tbool operator () (cPlayer & a_Player)\n\t{\n\t\t// Don't check players who cannot be targeted\n\t\tif (!a_Player.CanMobsTarget())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto PlayerHeadPosition = a_Player.GetPosition().addedY(a_Player.GetHeight());\n\t\tconst auto Direction = m_EndermanHeadPosition - PlayerHeadPosition;\n\n\t\t// Don't check players who are more than SightDistance (64) blocks away:\n\t\tif (Direction.Length() > m_SightDistance)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Don't check if the player has a pumpkin on his head:\n\t\tif (a_Player.GetEquippedHelmet().m_ItemType == E_BLOCK_PUMPKIN)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto LookVector = a_Player.GetLookVector();  // Note: ||LookVector|| is always 1.\n\t\tconst auto Cosine = Direction.Dot(LookVector) / Direction.Length();  // a.b / (||a|| * ||b||)\n\n\t\t// If the player's crosshair is within 5 degrees of the enderman, it counts as looking:\n\t\tif ((Cosine < std::cos(0.09)) || (Cosine > std::cos(0)))  // 0.09 rad ~ 5 degrees\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// TODO: Check if endermen are angered through water in Vanilla\n\t\tif (!cLineBlockTracer::LineOfSightTrace(*a_Player.GetWorld(), m_EndermanHeadPosition, PlayerHeadPosition, cLineBlockTracer::losAirWater))\n\t\t{\n\t\t\t// No direct line of sight\n\t\t\treturn false;\n\t\t}\n\n\t\tm_Player = &a_Player;\n\t\treturn true;\n\t}\n\n\tcPlayer * GetPlayer(void) const { return m_Player; }\n\nprotected:\n\n\tcPlayer * m_Player;\n\tVector3d m_EndermanHeadPosition;\n\tint m_SightDistance;\n} ;\n\n\n\n\n\ncEnderman::cEnderman(void) :\n\tSuper(\"Enderman\", mtEnderman, \"entity.endermen.hurt\", \"entity.endermen.death\", \"entity.endermen.ambient\", 0.6f, 2.9f),\n\tm_bIsScreaming(false),\n\tm_CarriedBlock(E_BLOCK_AIR),\n\tm_CarriedMeta(0)\n{\n}\n\n\n\n\n\nvoid cEnderman::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_ENDER_PEARL);\n}\n\n\n\n\n\nvoid cEnderman::CheckEventSeePlayer(cChunk & a_Chunk)\n{\n\tif (GetTarget() != nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tcPlayerLookCheck Callback(GetPosition().addedY(GetHeight()), m_SightDistance);\n\tif (m_World->ForEachPlayer(Callback))\n\t{\n\t\treturn;\n\t}\n\n\tASSERT(Callback.GetPlayer() != nullptr);\n\n\t// Target the player:\n\tcAggressiveMonster::EventSeePlayer(Callback.GetPlayer(), a_Chunk);\n\tm_bIsScreaming = true;\n\tGetWorld()->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cEnderman::EventLosePlayer()\n{\n\tSuper::EventLosePlayer();\n\tm_bIsScreaming = false;\n\tGetWorld()->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cEnderman::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (m_EMState != CHASING)\n\t{\n\t\tcMonster * EndermiteFound = GetMonsterOfTypeInSight(mtEndermite, 64);\n\t\tif (EndermiteFound != nullptr)\n\t\t{\n\t\t\tSetTarget(EndermiteFound);\n\t\t\tm_EMState = CHASING;\n\t\t\tm_bIsScreaming = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tconst auto Target = GetTarget();\n\t\tif (Target != nullptr)\n\t\t{\n\t\t\tif (!Target->IsTicking())\n\t\t\t{\n\t\t\t\tm_EMState = IDLE;\n\t\t\t\tm_bIsScreaming = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tPREPARE_REL_AND_CHUNK(GetPosition().Floor(), a_Chunk);\n\tif (!RelSuccess)\n\t{\n\t\treturn;\n\t}\n\n\t// Take damage when wet:\n\tif (IsInWater() || Chunk->IsWeatherWetAt(Rel))\n\t{\n\t\tEventLosePlayer();\n\t\tTakeDamage(dtEnvironment, nullptr, 1, 0);\n\t\t// TODO teleport to a safe location\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Enderman.h",
    "content": "\n#pragma once\n\n#include \"PassiveAggressiveMonster.h\"\n\n\n\n\n\nclass cEnderman:\n\tpublic cPassiveAggressiveMonster\n{\n\tusing Super = cPassiveAggressiveMonster;\n\npublic:\n\n\tcEnderman();\n\n\tCLASS_PROTODEF(cEnderman)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void CheckEventSeePlayer(cChunk & a_Chunk) override;\n\tvirtual void EventLosePlayer(void) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tbool IsScreaming(void) const {return m_bIsScreaming; }\n\tBLOCKTYPE GetCarriedBlock(void) const {return m_CarriedBlock; }\n\tNIBBLETYPE GetCarriedMeta(void) const {return m_CarriedMeta; }\n\nprivate:\n\n\tbool m_bIsScreaming;\n\tBLOCKTYPE m_CarriedBlock;\n\tNIBBLETYPE m_CarriedMeta;\n\n} ;\n"
  },
  {
    "path": "src/Mobs/Endermite.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"Endermite.h\"\n\n#include \"../World.h\"\n#include \"../Chunk.h\"\n#include \"../Blocks/BlockHandler.h\"\n#include \"../Blocks/BlockInfested.h\"\n\n\n\n\n\ncEndermite::cEndermite() :\n\tSuper(\"Endermite\", mtEndermite, \"entity.endermite.hurt\", \"entity.endermite.death\", \"entity.endermite.ambient\", 0.4f, 0.3f),\n\tm_Timer(0),\n\tm_Lifetime(2 * 1000 * 60)  // 2 minutes (2 * 1000 (mili to sec) * 60 (sec to min) * 2 because tick = 0.5 sec)\n{\n}\n\n\n\n\n\nvoid cEndermite::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\n\t// Not destroying the endermite if a name is set\n\tif (m_CustomName.empty())\n\t{\n\t\tm_Timer += a_Dt;\n\t\t// Destroy the endermite after 2 minutes\n\t\tif (m_Timer > m_Lifetime)\n\t\t{\n\t\t\tDestroy();\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Endermite.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\nclass cEndermite:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\n\t// Endermite should despawn in two minutes\n\tstd::chrono::milliseconds m_Timer;\n\tstd::chrono::milliseconds m_Lifetime;\n\npublic:\n\n\tcEndermite();\n\n\tCLASS_PROTODEF(cEndermite)\n\n\tvoid Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n} ;\n"
  },
  {
    "path": "src/Mobs/Ghast.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Ghast.h\"\n#include \"../World.h\"\n#include \"../Entities/GhastFireballEntity.h\"\n\n\n\n\ncGhast::cGhast(void) :\n\tSuper(\"Ghast\", mtGhast, \"entity.ghast.hurt\", \"entity.ghast.death\", \"entity.ghast.ambient\", 4, 4),\n\tm_IsCharging(false),\n\tm_FlightCooldown(5),\n\tm_TicksUntilShot(10)\n{\n\tSetGravity(0);\n\tSetAirDrag(0);\n}\n\n\n\n\n\nbool cGhast::Attack(std::chrono::milliseconds a_Dt)\n{\n\tif ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0) && (!m_IsCharging))\n\t{\n\t\tauto & Random = GetRandomProvider();\n\t\tauto SoundPitchMultiplier = 1.0f + (Random.RandReal(1.0f) - Random.RandReal(1.0f)) * 0.2f;\n\n\t\tm_World->BroadcastSoundEffect(\"entity.ghast.warn\", GetPosition(), 4.0f, SoundPitchMultiplier * 0.9f);\n\t\tm_IsCharging = true;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cGhast::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\t// No fall damage\n\tif (a_TDI.DamageType == dtFalling)\n\t{\n\t\treturn false;\n\t}\n\n\treturn Super::DoTakeDamage(a_TDI);\n}\n\n\n\n\n\nvoid cGhast::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GUNPOWDER);\n\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_GHAST_TEAR);\n}\n\n\n\n\n\nvoid cGhast::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif ((m_IsCharging) && (m_TicksUntilShot-- == 0))\n\t{\n\t\tm_TicksUntilShot = 10;\n\t\tm_IsCharging = false;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\n\t\tVector3d Speed = GetLookVector() * 20;\n\t\tSpeed.y = Speed.y + 1;\n\n\t\tauto GhastBall = std::make_unique<cGhastFireballEntity>(this, GetPosition(), Speed);\n\t\tauto GhastBallPtr = GhastBall.get();\n\t\tGhastBallPtr->Initialize(std::move(GhastBall), *m_World);\n\n\t\tm_World->BroadcastSoundEffect(\"entity.ghast.shoot\", GetPosition(), 4.0f, 1.0f);\n\n\t\tResetAttackCooldown();\n\t}\n\n\t// TODO: Better flying\n\tif (m_FlightCooldown-- == 0)\n\t{\n\t\tm_FlightCooldown = 5;\n\t\tauto & Random = GetRandomProvider();\n\t\tauto SpeedVector = Vector3d(Random.RandReal(-0.3, 0.3), Random.RandReal(-0.4, 0.4), Random.RandReal(-0.3, 0.3));\n\n\t\tif (GetPosY() > 120)\n\t\t{\n\t\t\tSpeedVector = Vector3d(Random.RandReal(-0.4, 0.4), Random.RandReal(-0.45, 0.4), Random.RandReal(-0.4, 0.4));\n\t\t}\n\n\t\tAddSpeed(SpeedVector);\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Ghast.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cGhast:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcGhast();\n\n\tCLASS_PROTODEF(cGhast)\n\n\tbool IsCharging(void) const { return m_IsCharging; }\n\nprivate:\n\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool IsNetherNative(void) override { return true; }\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\t/** Specifies whether or not the ghast has started shooting a fireball. */\n\tbool m_IsCharging;\n\n\t/** Number of ticks until the ghast tries to fly to another position. */\n\tint m_FlightCooldown;\n\n\t/** Number of ticks until a projectile is created.\n\tOnly used while m_IsCharging is true. */\n\tint m_TicksUntilShot;\n} ;\n"
  },
  {
    "path": "src/Mobs/Giant.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Giant.h\"\n\n\n\n\n\ncGiant::cGiant(void) :\n\tSuper(\"Giant\", mtGiant, \"entity.zombie.hurt\", \"entity.zombie.death\", \"entity.zombie.ambient\", 3.6f, 12)\n{\n\n}\n\n\n\n\n\nvoid cGiant::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tAddRandomDropItem(a_Drops, 10, 50, E_ITEM_ROTTEN_FLESH);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Giant.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cGiant:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcGiant(void);\n\n\tCLASS_PROTODEF(cGiant)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Guardian.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Guardian.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\ncGuardian::cGuardian(void) :\n\tSuper(\"Guardian\", mtGuardian, \"entity.guardian.hurt\", \"entity.guardian.death\", \"entity.guardian.ambient\", 0.85f, 0.85f)\n{\n}\n\n\n\n\n\nvoid cGuardian::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\t// Drops 0-3 Ink Sacs\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_PRISMARINE_SHARD);\n\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_RAW_FISH);\n\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_PRISMARINE_CRYSTALS);  // TODO: Prismarine Crystals only drop if the raw fish drop is 0\n}\n\n\n\n\n\nvoid cGuardian::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tm_PathfinderActivated = false;  // Disable Pathfinding until it's fixed. TODO\n\n\t// We must first process current location, and only then tick, otherwise we risk processing a location in a chunk\n\t// that is not where the entity currently resides (FS #411)\n\tVector3d Pos = GetPosition();\n\n\tint RelY = FloorC(Pos.y);\n\tif ((RelY < 0) || (RelY >= cChunkDef::Height))\n\t{\n\t\treturn;\n\t}\n\n\tSuper::Tick(a_Dt, a_Chunk);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Guardian.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cGuardian:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcGuardian();\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tCLASS_PROTODEF(cGuardian)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\n\t// Guardians do not drown (or float)\n\tvirtual void HandleAir(void) override {}\n\tvirtual void SetSwimState(cChunk & a_Chunk) override {}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Horse.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Horse.h\"\n#include \"../World.h\"\n#include \"../EffectID.h\"\n#include \"../Entities/Player.h\"\n#include \"../UI/HorseWindow.h\"\n\n\n\n\n\ncHorse::cHorse(int Type, int Color, int Style, int TameTimes) :\n\tSuper(\"Horse\", mtHorse, \"entity.horse.hurt\", \"entity.horse.death\", \"entity.horse.ambient\", 1.4f, 1.6f),\n\tcEntityWindowOwner(this),\n\tm_bHasChest(false),\n\tm_bIsEating(false),\n\tm_bIsRearing(false),\n\tm_bIsMouthOpen(false),\n\tm_bIsTame(false),\n\tm_Type(Type),\n\tm_Color(Color),\n\tm_Style(Style),\n\tm_TimesToTame(TameTimes),\n\tm_TameAttemptTimes(0),\n\tm_RearTickCount(0),\n\tm_MaxSpeed(14.0)\n{\n}\n\n\n\n\n\nvoid cHorse::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tbool MetadataDirty = false;\n\tauto & Random = GetRandomProvider();\n\n\tif (!m_bIsMouthOpen)\n\t{\n\t\tif (Random.RandBool(0.02))\n\t\t{\n\t\t\tMetadataDirty = true;\n\t\t\tm_bIsMouthOpen = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (Random.RandBool(0.10))\n\t\t{\n\t\t\tMetadataDirty = true;\n\t\t\tm_bIsMouthOpen = false;\n\t\t}\n\t}\n\n\tif ((m_Attachee != nullptr) && (!m_bIsTame))\n\t{\n\t\tif (m_TameAttemptTimes < m_TimesToTame)\n\t\t{\n\t\t\tif (Random.RandBool(0.02))\n\t\t\t{\n\t\t\t\tm_World->BroadcastSoundParticleEffect(EffectID::PARTICLE_SMOKE, GetPosition().Floor(), int(SmokeDirection::SOUTH_EAST));\n\t\t\t\tm_World->BroadcastSoundParticleEffect(EffectID::PARTICLE_SMOKE, GetPosition().Floor(), int(SmokeDirection::SOUTH_WEST));\n\t\t\t\tm_World->BroadcastSoundParticleEffect(EffectID::PARTICLE_SMOKE, GetPosition().Floor(), int(SmokeDirection::NORTH_EAST));\n\t\t\t\tm_World->BroadcastSoundParticleEffect(EffectID::PARTICLE_SMOKE, GetPosition().Floor(), int(SmokeDirection::NORTH_WEST));\n\n\t\t\t\tm_World->BroadcastSoundEffect(\"entity.horse.angry\", GetPosition(), 1.0f, 1.0f);\n\t\t\t\tm_Attachee->Detach();\n\t\t\t\tMetadataDirty = true;\n\t\t\t\tm_bIsRearing = true;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_World->BroadcastParticleEffect(\"heart\", static_cast<Vector3f>(GetPosition()), Vector3f{}, 0, 5);\n\t\t\tMetadataDirty = true;\n\t\t\tm_bIsTame = true;\n\t\t}\n\t}\n\n\tif (m_bIsRearing)\n\t{\n\t\tif (m_RearTickCount == 20)\n\t\t{\n\t\t\tMetadataDirty = true;\n\t\t\tm_bIsRearing = false;\n\t\t\tm_RearTickCount = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_RearTickCount++;\n\t\t}\n\t}\n\n\tif (MetadataDirty)\n\t{\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n}\n\n\n\n\n\nvoid cHorse::OnRemoveFromWorld(cWorld & a_World)\n{\n\tconst auto Window = GetWindow();\n\tif (Window != nullptr)\n\t{\n\t\tWindow->OwnerDestroyed();\n\t}\n\n\tSuper::OnRemoveFromWorld(a_World);\n}\n\n\n\n\n\nvoid cHorse::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tif (m_bIsTame)\n\t{\n\t\tif (a_Player.IsCrouched())\n\t\t{\n\t\t\tPlayerOpenWindow(a_Player);\n\t\t\treturn;\n\t\t}\n\n\t\tauto EquipedItemType = a_Player.GetEquippedItem().m_ItemType;\n\n\t\tif (\n\t\t\t!IsSaddled() &&\n\t\t\t(\n\t\t\t\t(EquipedItemType == E_ITEM_SADDLE) ||\n\t\t\t\tItemCategory::IsHorseArmor(EquipedItemType)\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\t// Player is holding a horse inventory item, open the window:\n\t\t\tPlayerOpenWindow(a_Player);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Player.AttachTo(*this);\n\t\t}\n\t}\n\telse if (a_Player.GetEquippedItem().IsEmpty())\n\t{\n\t\t// Check if leashed / unleashed to player before try to ride\n\t\tif (!m_IsLeashActionJustDone)\n\t\t{\n\t\t\tif (m_Attachee != nullptr)\n\t\t\t{\n\t\t\t\tif (m_Attachee->GetUniqueID() == a_Player.GetUniqueID())\n\t\t\t\t{\n\t\t\t\t\ta_Player.Detach();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (m_Attachee->IsPlayer())\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tm_Attachee->Detach();\n\t\t\t}\n\n\t\t\tm_TameAttemptTimes++;\n\t\t\ta_Player.AttachTo(*this);\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_bIsRearing = true;\n\t\tm_RearTickCount = 0;\n\t\tm_World->BroadcastSoundEffect(\"entity.horse.angry\", GetPosition(), 1.0f, 0.8f);\n\t}\n}\n\n\n\n\n\nvoid cHorse::SetHorseSaddle(cItem a_Saddle)\n{\n\tif (a_Saddle.m_ItemType == E_ITEM_SADDLE)\n\t{\n\t\tm_World->BroadcastSoundEffect(\"entity.horse.saddle\", GetPosition(), 1.0f, 0.8f);\n\t}\n\telse if (!a_Saddle.IsEmpty())\n\t{\n\t\treturn;  // Invalid item\n\t}\n\n\tm_Saddle = std::move(a_Saddle);\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cHorse::SetHorseArmor(cItem a_Armor)\n{\n\tif (ItemCategory::IsHorseArmor(a_Armor.m_ItemType))\n\t{\n\t\tm_World->BroadcastSoundEffect(\"entity.horse.armor\", GetPosition(), 1.0f, 0.8f);\n\t}\n\telse if (!a_Armor.IsEmpty())\n\t{\n\t\treturn;  // Invalid item\n\t}\n\n\tm_Armor = std::move(a_Armor);\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nint cHorse::GetHorseArmour(void) const\n{\n\tswitch (m_Armor.m_ItemType)\n\t{\n\t\tcase E_ITEM_EMPTY:               return 0;\n\t\tcase E_ITEM_IRON_HORSE_ARMOR:    return 1;\n\t\tcase E_ITEM_GOLD_HORSE_ARMOR:    return 2;\n\t\tcase E_ITEM_DIAMOND_HORSE_ARMOR: return 3;\n\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARN(\"cHorse::GetHorseArmour: Invalid armour item (%d)\", m_Armor.m_ItemType);\n\t\t\treturn 0;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cHorse::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif (IsBaby())\n\t{\n\t\treturn;  // Babies don't drop items\n\t}\n\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_LEATHER);\n\tif (IsSaddled())\n\t{\n\t\ta_Drops.push_back(m_Saddle);\n\t}\n\tif (!m_Armor.IsEmpty())\n\t{\n\t\ta_Drops.push_back(m_Armor);\n\t}\n}\n\n\n\n\n\nvoid cHorse::InStateIdle(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\t// If horse is tame and someone is sitting on it, don't walk around\n\tif ((!m_bIsTame) || (m_Attachee == nullptr))\n\t{\n\t\tSuper::InStateIdle(a_Dt, a_Chunk);\n\t}\n}\n\n\n\n\n\nvoid cHorse::HandleSpeedFromAttachee(float a_Forward, float a_Sideways)\n{\n\tif ((m_bIsTame) && IsSaddled())\n\t{\n\t\tSuper::HandleSpeedFromAttachee(a_Forward * m_MaxSpeed, a_Sideways * m_MaxSpeed);\n\t}\n}\n\n\n\n\n\nvoid cHorse::PlayerOpenWindow(cPlayer & a_Player)\n{\n\tauto Window = GetWindow();\n\tif (Window == nullptr)\n\t{\n\t\tWindow = new cHorseWindow(*this);\n\t\tOpenWindow(Window);\n\t}\n\n\ta_Player.OpenWindow(*Window);\n}\n"
  },
  {
    "path": "src/Mobs/Horse.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n#include \"../UI/WindowOwner.h\"\n\n\n\n\n\nclass cHorse:\n\tpublic cPassiveMonster,\n\tpublic cEntityWindowOwner\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tcHorse(int Type, int Color, int Style, int TameTimes);\n\n\tCLASS_PROTODEF(cHorse)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void InStateIdle(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void HandleSpeedFromAttachee(float a_Forward, float a_Sideways) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void OnRemoveFromWorld(cWorld & a_World) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\n\tbool IsSaddled      (void) const  {return !m_Saddle.IsEmpty(); }\n\tbool IsChested      (void) const  {return m_bHasChest; }\n\tbool IsEating       (void) const  {return m_bIsEating; }\n\tbool IsRearing      (void) const  {return m_bIsRearing; }\n\tbool IsMthOpen      (void) const  {return m_bIsMouthOpen; }\n\tbool IsTame         (void) const override {return m_bIsTame; }\n\tint  GetHorseType   (void) const  {return m_Type; }\n\tint  GetHorseColor  (void) const  {return m_Color; }\n\tint  GetHorseStyle  (void) const  {return m_Style; }\n\tint  GetHorseArmour (void) const;\n\n\t/** Set the horse's saddle to the given item.\n\t@param a_SaddleItem should be either a saddle or empty. */\n\tvoid SetHorseSaddle(cItem a_SaddleItem);\n\n\t/** Set the horse's armor slot to the given item.\n\t@param a_SaddleItem should be either a type of horse armor or empty. */\n\tvoid SetHorseArmor(cItem a_ArmorItem);\n\n\tconst cItem & GetHorseSaddle()    const { return m_Saddle; }\n\tconst cItem & GetHorseArmorItem() const { return m_Armor;  }\n\n\tvirtual void GetBreedingItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_GOLDEN_CARROT);\n\t\ta_Items.Add(E_ITEM_GOLDEN_APPLE);\n\t}\n\n\tvoid PlayerOpenWindow(cPlayer & a_Player);\n\nprivate:\n\n\tbool m_bHasChest, m_bIsEating, m_bIsRearing, m_bIsMouthOpen, m_bIsTame;\n\tint m_Type, m_Color, m_Style, m_TimesToTame, m_TameAttemptTimes, m_RearTickCount;\n\tfloat m_MaxSpeed;\n\tcItem m_Saddle;\n\tcItem m_Armor;\n\n} ;\n"
  },
  {
    "path": "src/Mobs/IncludeAllMonsters.h",
    "content": "#include \"Bat.h\"\n#include \"Blaze.h\"\n#include \"CaveSpider.h\"\n#include \"Chicken.h\"\n#include \"Cow.h\"\n#include \"Creeper.h\"\n#include \"Enderman.h\"\n#include \"Endermite.h\"\n#include \"EnderDragon.h\"\n#include \"Ghast.h\"\n#include \"Giant.h\"\n#include \"Guardian.h\"\n#include \"Horse.h\"\n#include \"IronGolem.h\"\n#include \"MagmaCube.h\"\n#include \"Mooshroom.h\"\n#include \"Ocelot.h\"\n#include \"Pig.h\"\n#include \"Rabbit.h\"\n#include \"Sheep.h\"\n#include \"Silverfish.h\"\n#include \"Skeleton.h\"\n#include \"Slime.h\"\n#include \"SnowGolem.h\"\n#include \"Spider.h\"\n#include \"Squid.h\"\n#include \"Villager.h\"\n#include \"Witch.h\"\n#include \"Wither.h\"\n#include \"WitherSkeleton.h\"\n#include \"Wolf.h\"\n#include \"Zombie.h\"\n#include \"ZombiePigman.h\"\n#include \"ZombieVillager.h\"\n"
  },
  {
    "path": "src/Mobs/IronGolem.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"IronGolem.h\"\n\n\n\n\n\ncIronGolem::cIronGolem(void) :\n\tSuper(\"IronGolem\", mtIronGolem, \"entity.irongolem.hurt\", \"entity.irongolem.death\", \"entity.irongolem.ambient\", 1.4f, 2.7f)\n{\n}\n\n\n\n\n\nvoid cIronGolem::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tUNUSED(a_Killer);\n\tAddRandomDropItem(a_Drops, 0, 5, E_ITEM_IRON);\n\tAddRandomDropItem(a_Drops, 0, 2, E_BLOCK_FLOWER);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/IronGolem.h",
    "content": "\n#pragma once\n\n#include \"PassiveAggressiveMonster.h\"\n\n\n\n\n\nclass cIronGolem:\n\tpublic cPassiveAggressiveMonster\n{\n\tusing Super = cPassiveAggressiveMonster;\n\npublic:\n\n\tcIronGolem();\n\n\tCLASS_PROTODEF(cIronGolem)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\n\t// Iron golems do not drown nor float\n\tvirtual void HandleAir(void) override {}\n\tvirtual void SetSwimState(cChunk & a_Chunk) override {}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/MagmaCube.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"MagmaCube.h\"\n\n\n\n\n\ncMagmaCube::cMagmaCube(int a_Size) :\n\tSuper(\n\t\t\"MagmaCube\",\n\t\tmtMagmaCube,\n\t\tfmt::format(FMT_STRING(\"entity.{}magmacube.hurt\"),  GetSizeName(a_Size)),\n\t\tfmt::format(FMT_STRING(\"entity.{}magmacube.death\"), GetSizeName(a_Size)),\n\t\t\"\",\n\t\t0.51f * a_Size,\n\t\t0.51f * a_Size\n\t),\n\tm_Size(a_Size)\n{\n}\n\n\n\n\n\nAString cMagmaCube::GetSizeName(int a_Size)\n{\n\tif (a_Size == 1)\n\t{\n\t\treturn \"small_\";\n\t}\n\treturn \"\";\n}\n\n\n\n\n\nvoid cMagmaCube::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tUNUSED(a_Killer);\n\tif (GetSize() > 1)\n\t{\n\t\tAddRandomUncommonDropItem(a_Drops, 25.0f, E_ITEM_MAGMA_CREAM);\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/MagmaCube.h",
    "content": "#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cMagmaCube:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\t/** Creates a MagmaCube of the specified size; with 1 being the smallest */\n\tcMagmaCube(int a_Size);\n\n\tCLASS_PROTODEF(cMagmaCube)\n\n\tint GetSize(void) const { return m_Size; }\n\n\t/** Returns the text describing the slime's size, as used by the client's resource subsystem for sounds.\n\tReturns either \"big\" or \"small\". */\n\tstatic AString GetSizeName(int a_Size);\n\nprivate:\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool IsNetherNative(void) override { return true; }\n\n\t/** Size of the MagmaCube, with 1 being the smallest */\n\tint m_Size;\n} ;\n"
  },
  {
    "path": "src/Mobs/Monster.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"IncludeAllMonsters.h\"\n#include \"LineBlockTracer.h\"\n#include \"../BlockInfo.h\"\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../ClientHandle.h\"\n#include \"../Items/ItemHandler.h\"\n#include \"../World.h\"\n#include \"../EffectID.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/ExpOrb.h\"\n#include \"../MonsterConfig.h\"\n#include \"../BoundingBox.h\"\n\n#include \"Items/ItemSpawnEgg.h\"\n\n#include \"../Chunk.h\"\n#include \"../FastRandom.h\"\n\n#include \"PathFinder.h\"\n#include \"../Entities/LeashKnot.h\"\n\n\n\n/** Map for eType <-> string\nNeeds to be alpha-sorted by the strings, because binary search is used in StringToMobType()\nThe strings need to be lowercase (for more efficient comparisons in StringToMobType())\nm_VanillaName is the name that vanilla use for this mob.\n*/\nstatic const struct\n{\n\teMonsterType m_Type;\n\tconst char * m_lcName;\n\tconst char * m_VanillaName;\n\tconst char * m_VanillaNameNBT;\n} g_MobTypeNames[] =\n{\n\t{mtBat,            \"bat\",            \"Bat\",            \"bat\"},\n\t{mtBlaze,          \"blaze\",          \"Blaze\",          \"blaze\"},\n\t{mtCaveSpider,     \"cavespider\",     \"CaveSpider\",     \"cave_spider\"},\n\t{mtChicken,        \"chicken\",        \"Chicken\",        \"chicken\"},\n\t{mtCow,            \"cow\",            \"Cow\",            \"cow\"},\n\t{mtCreeper,        \"creeper\",        \"Creeper\",        \"creeper\"},\n\t{mtEnderman,       \"enderman\",       \"Enderman\",       \"enderman\"},\n\t{mtEndermite,      \"endermite\",      \"Endermite\",      \"endermite\"},\n\t{mtEnderDragon,    \"enderdragon\",    \"EnderDragon\",    \"ender_dragon\"},\n\t{mtGhast,          \"ghast\",          \"Ghast\",          \"ghast\"},\n\t{mtGiant,          \"giant\",          \"Giant\",          \"giant\"},\n\t{mtGuardian,       \"guardian\",       \"Guardian\",       \"guardian\"},\n\t{mtHorse,          \"horse\",          \"EntityHorse\",    \"horse\"},\n\t{mtIronGolem,      \"irongolem\",      \"VillagerGolem\",  \"iron_golem\"},\n\t{mtMagmaCube,      \"magmacube\",      \"LavaSlime\",      \"magma_cube\"},\n\t{mtMooshroom,      \"mooshroom\",      \"MushroomCow\",    \"mooshroom\"},\n\t{mtOcelot,         \"ocelot\",         \"Ozelot\",         \"ocelot\"},\n\t{mtPig,            \"pig\",            \"Pig\",            \"pig\"},\n\t{mtRabbit,         \"rabbit\",         \"Rabbit\",         \"rabbit\"},\n\t{mtSheep,          \"sheep\",          \"Sheep\",          \"sheep\"},\n\t{mtSilverfish,     \"silverfish\",     \"Silverfish\",     \"silverfish\"},\n\t{mtSkeleton,       \"skeleton\",       \"Skeleton\",       \"skeleton\"},\n\t{mtSlime,          \"slime\",          \"Slime\",          \"slime\"},\n\t{mtSnowGolem,      \"snowgolem\",      \"SnowMan\",        \"snow_golem\"},\n\t{mtSpider,         \"spider\",         \"Spider\",         \"spider\"},\n\t{mtSquid,          \"squid\",          \"Squid\",          \"squid\"},\n\t{mtVillager,       \"villager\",       \"Villager\",       \"villager\"},\n\t{mtWitch,          \"witch\",          \"Witch\",          \"witch\"},\n\t{mtWither,         \"wither\",         \"WitherBoss\",     \"wither\"},\n\t{mtWitherSkeleton, \"witherskeleton\", \"WitherSkeleton\", \"wither_skeleton\"},\n\t{mtWolf,           \"wolf\",           \"Wolf\",           \"wolf\"},\n\t{mtZombie,         \"zombie\",         \"Zombie\",         \"zombie\"},\n\t{mtZombiePigman,   \"zombiepigman\",   \"PigZombie\",      \"zombie_pigman\"},\n\t{mtZombieVillager, \"zombievillager\", \"ZombieVillager\", \"zombie_villager\"},\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMonster:\n\ncMonster::cMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, const AString & a_SoundAmbient, float a_Width, float a_Height)\n\t: Super(etMonster, a_Width, a_Height)\n\t, m_EMState(IDLE)\n\t, m_EMPersonality(AGGRESSIVE)\n\t, m_PathFinder(a_Width, a_Height)\n\t, m_PathfinderActivated(false)\n\t, m_JumpCoolDown(0)\n\t, m_IdleInterval(0)\n\t, m_DestroyTimer(0)\n\t, m_MobType(a_MobType)\n\t, m_CustomName()\n\t, m_CustomNameAlwaysVisible(false)\n\t, m_SoundHurt(a_SoundHurt)\n\t, m_SoundDeath(a_SoundDeath)\n\t, m_SoundAmbient(a_SoundAmbient)\n\t, m_AttackRate(3)\n\t, m_AttackDamage(1)\n\t, m_AttackRange(1)\n\t, m_AttackCoolDownTicksLeft(0)\n\t, m_SightDistance(25)\n\t, m_DropChanceWeapon(0.085f)\n\t, m_DropChanceHelmet(0.085f)\n\t, m_DropChanceChestplate(0.085f)\n\t, m_DropChanceLeggings(0.085f)\n\t, m_DropChanceBoots(0.085f)\n\t, m_CanPickUpLoot(true)\n\t, m_TicksSinceLastDamaged(100)\n\t, m_BurnsInDaylight(false)\n\t, m_RelativeWalkSpeed(1)\n\t, m_Age(1)\n\t, m_AgingTimer(TPS * 60 * 20)  // about 20 minutes\n\t, m_WasLastTargetAPlayer(false)\n\t, m_LeashedTo(nullptr)\n\t, m_LeashToPos(nullptr)\n\t, m_IsLeashActionJustDone(false)\n\t, m_CanBeLeashed(GetMobFamily() == eFamily::mfPassive)\n\t, m_LovePartner(nullptr)\n\t, m_LoveTimer(0)\n\t, m_LoveCooldown(0)\n\t, m_MatingTimer(0)\n\t, m_Target(nullptr)\n{\n\tif (!a_ConfigName.empty())\n\t{\n\t\tGetMonsterConfig(a_ConfigName);\n\t}\n\n\t// Prevent mobs spawning at the same time from making sounds simultaneously\n\tm_AmbientSoundTimer = GetRandomProvider().RandInt(0, 100);\n}\n\n\n\n\n\nvoid cMonster::OnRemoveFromWorld(cWorld & a_World)\n{\n\tSetTarget(nullptr);  // Tell them we're no longer targeting them.\n\n\tif (m_LovePartner != nullptr)\n\t{\n\t\tm_LovePartner->ResetLoveMode();\n\t}\n\n\tif (IsLeashed())\n\t{\n\t\tcEntity * LeashedTo = GetLeashedTo();\n\t\tUnleash(false, true);\n\n\t\t// Remove leash knot if there are no more mobs leashed to\n\t\tif (!LeashedTo->HasAnyMobLeashed() && LeashedTo->IsLeashKnot())\n\t\t{\n\t\t\tLeashedTo->Destroy();\n\t\t}\n\t}\n\n\tSuper::OnRemoveFromWorld(a_World);\n}\n\n\n\n\n\nvoid cMonster::SpawnOn(cClientHandle & a_Client)\n{\n\ta_Client.SendSpawnMob(*this);\n\n\tif (IsLeashed())\n\t{\n\t\ta_Client.SendLeashEntity(*this, *this->GetLeashedTo());\n\t}\n}\n\n\n\n\n\nvoid cMonster::MoveToWayPoint(cChunk & a_Chunk)\n{\n\tif ((m_NextWayPointPosition - GetPosition()).SqrLength() < WAYPOINT_RADIUS * WAYPOINT_RADIUS)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_JumpCoolDown <= 0)\n\t{\n\t\tif (DoesPosYRequireJump(FloorC(m_NextWayPointPosition.y)))\n\t\t{\n\t\t\tif (\n\t\t\t\t(IsOnGround() && (GetSpeed().SqrLength() <= 0.5)) ||  // If walking on the ground, we need to slow down first, otherwise we miss the jump\n\t\t\t\tIsInWater()\n\t\t\t)\n\t\t\t{\n\t\t\t\tm_bOnGround = false;\n\t\t\t\tm_JumpCoolDown = 20;\n\t\t\t\tAddPosY(1.6);  // Jump!!\n\t\t\t\tSetSpeedY(1);\n\t\t\t\tSetSpeedX(3.2 * (m_NextWayPointPosition.x - GetPosition().x));  // Move forward in a preset speed.\n\t\t\t\tSetSpeedZ(3.2 * (m_NextWayPointPosition.z - GetPosition().z));  // The numbers were picked based on trial and error\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t--m_JumpCoolDown;\n\t}\n\n\tVector3d Distance = m_NextWayPointPosition - GetPosition();\n\tif ((std::abs(Distance.x) > 0.05) || (std::abs(Distance.z) > 0.05))\n\t{\n\t\tDistance.y = 0;\n\t\tDistance.Normalize();\n\n\t\tif (m_bOnGround)\n\t\t{\n\t\t\tDistance *= 2.5f;\n\t\t}\n\t\telse if (IsInWater())\n\t\t{\n\t\t\tDistance *= 1.3f;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Don't let the mob move too much if he's falling.\n\t\t\tDistance *= 0.25f;\n\t\t}\n\n\t\tif ((m_EMState == CHASING) || (m_EMState == ESCAPING))\n\t\t{\n\t\t\t// Apply run speed:\n\t\t\tDistance *= m_BaseRunSpeed * m_RelativeWalkSpeed;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Apply walk speed:\n\t\t\tDistance *= m_BaseWalkSpeed * m_RelativeWalkSpeed;\n\t\t}\n\n\t\t/* Reduced default speed.\n\t\tClose to Vanilla, easier for mobs to follow m_NextWayPointPositions, hence\n\t\tbetter pathfinding. */\n\t\tDistance *= 0.5;\n\t\tAddSpeedX(Distance.x);\n\t\tAddSpeedZ(Distance.z);\n\t}\n}\n\n\n\n\n\nvoid cMonster::MoveToPosition(const Vector3d & a_Position)\n{\n\tm_FinalDestination = a_Position;\n\tm_PathfinderActivated = true;\n}\n\n\n\n\n\nvoid cMonster::StopMovingToPosition()\n{\n\tm_PathfinderActivated = false;\n}\n\n\n\n\n\nvoid cMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\tGET_AND_VERIFY_CURRENT_CHUNK(Chunk, POSX_TOINT, POSZ_TOINT);\n\n\tASSERT((GetTarget() == nullptr) || (GetTarget()->IsPawn() && (GetTarget()->GetWorld() == GetWorld())));\n\tif (m_AttackCoolDownTicksLeft > 0)\n\t{\n\t\tm_AttackCoolDownTicksLeft -= 1;\n\t}\n\n\tif (m_Health <= 0)\n\t{\n\t\t// The mob is dead, but we're still animating the \"puff\" they leave when they die\n\t\tm_DestroyTimer += a_Dt;\n\t\tif (m_DestroyTimer > std::chrono::seconds(1))\n\t\t{\n\t\t\tDestroy();\n\t\t}\n\t\treturn;\n\t}\n\n\tif (m_TicksSinceLastDamaged < 100)\n\t{\n\t\t++m_TicksSinceLastDamaged;\n\t}\n\n\t// Process the undead burning in daylight.\n\tHandleDaylightBurning(*Chunk, WouldBurnAt(GetPosition(), *Chunk));\n\n\tbool a_IsFollowingPath = false;\n\tif (m_PathfinderActivated && (GetMobType() != mtGhast))  // Pathfinder is currently disabled for ghasts, which have their own flying mechanism\n\t{\n\t\tif (ReachedFinalDestination() || (m_LeashToPos != nullptr))\n\t\t{\n\t\t\tStopMovingToPosition();  // Simply sets m_PathfinderActivated to false.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Note that m_NextWayPointPosition is actually returned by GetNextWayPoint)\n\t\t\tswitch (m_PathFinder.GetNextWayPoint(*Chunk, GetPosition(), &m_FinalDestination, &m_NextWayPointPosition, m_EMState == IDLE))\n\t\t\t{\n\t\t\t\tcase ePathFinderStatus::PATH_FOUND:\n\t\t\t\t{\n\t\t\t\t\t/* If I burn in daylight, and I won't burn where I'm standing, and I'll burn in my next position, and at least one of those is true:\n\t\t\t\t\t1. I am idle\n\t\t\t\t\t2. I was not hurt by a player recently.\n\t\t\t\t\tThen STOP. */\n\t\t\t\t\tif (\n\t\t\t\t\t\tm_BurnsInDaylight && ((m_TicksSinceLastDamaged >= 100) || (m_EMState == IDLE)) &&\n\t\t\t\t\t\tWouldBurnAt(m_NextWayPointPosition, *Chunk) &&\n\t\t\t\t\t\t!WouldBurnAt(GetPosition(), *Chunk)\n\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\t// If we burn in daylight, and we would burn at the next step, and we won't burn where we are right now, and we weren't provoked recently:\n\t\t\t\t\t\tStopMovingToPosition();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ta_IsFollowingPath = true;  // Used for proper body / head orientation only.\n\t\t\t\t\t\tMoveToWayPoint(*Chunk);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ePathFinderStatus::PATH_NOT_FOUND:\n\t\t\t\t{\n\t\t\t\t\tStopMovingToPosition();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tSetPitchAndYawFromDestination(a_IsFollowingPath);\n\n\tswitch (m_EMState)\n\t{\n\t\tcase IDLE:\n\t\t{\n\t\t\t// If enemy passive we ignore checks for player visibility.\n\t\t\tInStateIdle(a_Dt, a_Chunk);\n\t\t\tbreak;\n\t\t}\n\t\tcase CHASING:\n\t\t{\n\t\t\t// If we do not see a player anymore skip chasing action.\n\t\t\tInStateChasing(a_Dt, a_Chunk);\n\t\t\tbreak;\n\t\t}\n\t\tcase ESCAPING:\n\t\t{\n\t\t\tInStateEscaping(a_Dt, a_Chunk);\n\t\t\tbreak;\n\t\t}\n\t\tcase ATTACKING: break;\n\t}  // switch (m_EMState)\n\n\t// Leash calculations\n\tCalcLeashActions(a_Dt);\n\n\tBroadcastMovementUpdate();\n\n\t// Ambient mob sounds\n\tif (!m_SoundAmbient.empty() && (--m_AmbientSoundTimer <= 0))\n\t{\n\t\tauto & Random = GetRandomProvider();\n\t\tauto ShouldPlaySound = Random.RandBool();\n\t\tif (ShouldPlaySound)\n\t\t{\n\t\t\tauto SoundPitchMultiplier = 1.0f + (Random.RandReal(1.0f) - Random.RandReal(1.0f)) * 0.2f;\n\t\t\tm_World->BroadcastSoundEffect(m_SoundAmbient, GetPosition(), 1.0f, SoundPitchMultiplier * 1.0f);\n\t\t}\n\t\tm_AmbientSoundTimer = 100;\n\t}\n\n\tif (m_AgingTimer > 0)\n\t{\n\t\tm_AgingTimer--;\n\t\tif ((m_AgingTimer <= 0) && IsBaby())\n\t\t{\n\t\t\tSetAge(1);\n\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMonster::CalcLeashActions(std::chrono::milliseconds a_Dt)\n{\n\t// This mob just spotted in the world and [m_LeashToPos not null] shows that should be leashed to a leash knot at m_LeashToPos.\n\t// This keeps trying until knot is found. Leash knot may be in a different chunk that needn't or can't be loaded yet.\n\tif (!IsLeashed() && (m_LeashToPos != nullptr))\n\t{\n\t\tauto LeashKnot = cLeashKnot::FindKnotAtPos(*m_World, { FloorC(m_LeashToPos->x), FloorC(m_LeashToPos->y), FloorC(m_LeashToPos->z) });\n\t\tif (LeashKnot != nullptr)\n\t\t{\n\t\t\tLeashTo(*LeashKnot);\n\t\t\tSetLeashToPos(nullptr);\n\t\t}\n\t}\n\n\tif (!IsLeashed())\n\t{\n\t\treturn;\n\t}\n\n\tstatic const double CloseFollowDistance = 1.8;   // The closest the mob will path towards the leashed to entity\n\tstatic const double LeashNaturalLength  = 5.0;   // The closest the mob is actively pulled towards the entity\n\tstatic const double LeashMaximumLength  = 10.0;  // Length where the leash breaks\n\tstatic const double LeashSpringConstant = 20.0;  // How stiff the leash is\n\n\tconst auto LeashedToPos = m_LeashedTo->GetPosition();\n\tconst auto Displacement = LeashedToPos - GetPosition();\n\tconst auto Distance = Displacement.Length();\n\tconst auto Direction = Displacement.NormalizeCopy();\n\n\t// If the leash is over-extended, break the leash:\n\tif (Distance > LeashMaximumLength)\n\t{\n\t\tLOGD(\"Leash broken (distance)\");\n\t\tUnleash(false);\n\t\treturn;\n\t}\n\n\t// If the mob isn't following close enough, pull the mob towards the leashed to entity:\n\tif (Distance > LeashNaturalLength)\n\t{\n\t\t// Accelerate monster towards the leashed to entity:\n\t\tconst auto Extension = Distance - LeashNaturalLength;\n\t\tauto Acceleration = Direction * (Extension * LeashSpringConstant);\n\n\t\t// Stop mobs from floating up when on the ground\n\t\tif (IsOnGround() && (Acceleration.y < std::abs(GetGravity())))\n\t\t{\n\t\t\tAcceleration.y = 0.0;\n\t\t}\n\n\t\t// Apply the acceleration\n\t\tusing namespace std::chrono;\n\t\tAddSpeed(Acceleration * duration_cast<duration<double>>(a_Dt).count());\n\t}\n\n\t// Passively follow the leashed to entity:\n\tif (Distance > CloseFollowDistance)\n\t{\n\t\tconst Vector3d TargetBlock((LeashedToPos - Direction * CloseFollowDistance).Floor());\n\t\t// Move to centre of target block face\n\t\tMoveToPosition(TargetBlock + Vector3d{ 0.5, 0.0, 0.5 });\n\t}\n}\n\n\n\n\n\nvoid cMonster::SetPitchAndYawFromDestination(bool a_IsFollowingPath)\n{\n\tVector3d BodyDistance;\n\tif (!a_IsFollowingPath)\n\t{\n\t\tif (GetTarget() == nullptr)\n\t\t{\n\t\t\t// Avoid dirtying head position when nothing will change\n\t\t\t// Thus avoids creating unnecessary network traffic\n\t\t\treturn;\n\t\t}\n\n\t\tBodyDistance = GetTarget()->GetPosition() - GetPosition();\n\t}\n\telse\n\t{\n\t\tBodyDistance = m_NextWayPointPosition - GetPosition();\n\t}\n\n\tdouble BodyRotation, BodyPitch;\n\tBodyDistance.Normalize();\n\tVectorToEuler(BodyDistance.x, BodyDistance.y, BodyDistance.z, BodyRotation, BodyPitch);\n\tSetYaw(BodyRotation);\n\n\tVector3d HeadDistance;\n\tif (GetTarget() != nullptr)\n\t{\n\t\tif (GetTarget()->IsPlayer())  // Look at a player\n\t\t{\n\t\t\tHeadDistance = GetTarget()->GetPosition() - GetPosition();\n\t\t}\n\t\telse  // Look at some other entity\n\t\t{\n\t\t\tHeadDistance = GetTarget()->GetPosition() - GetPosition();\n\t\t\t// HeadDistance.y = GetTarget()->GetPosY() + GetHeight();\n\t\t}\n\t}\n\telse  // Look straight\n\t{\n\t\tHeadDistance = BodyDistance;\n\t\tHeadDistance.y = 0;\n\t}\n\n\tdouble HeadRotation, HeadPitch;\n\tHeadDistance.Normalize();\n\tVectorToEuler(HeadDistance.x, HeadDistance.y, HeadDistance.z, HeadRotation, HeadPitch);\n\tif ((std::abs(BodyRotation - HeadRotation) < 70) && (std::abs(HeadPitch) < 60))\n\t{\n\t\tSetHeadYaw(HeadRotation);\n\t\tSetPitch(-HeadPitch);\n\t}\n\telse\n\t{\n\t\tSetHeadYaw(BodyRotation);\n\t\tSetPitch(0);\n\t}\n}\n\n\n\n\n\nvoid cMonster::HandleFalling()\n{\n\tm_bTouchGround = IsOnGround();\n\tSuper::HandleFalling();\n}\n\n\n\n\n\nint cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)\n{\n\tauto Position = GetPosition().Floor();\n\tPosition.y = Clamp(Position.y, 0, cChunkDef::Height);\n\n\tif (!cBlockInfo::IsSolid(m_World->GetBlock(Position)))\n\t{\n\t\twhile (!cBlockInfo::IsSolid(m_World->GetBlock(Position)) && (Position.y > 0))\n\t\t{\n\t\t\tPosition.y--;\n\t\t}\n\n\t\treturn Position.y + 1;\n\t}\n\telse\n\t{\n\t\twhile ((Position.y < cChunkDef::Height) && cBlockInfo::IsSolid(m_World->GetBlock(Position)))\n\t\t{\n\t\t\tPosition.y++;\n\t\t}\n\n\t\treturn Position.y;\n\t}\n}\n\n\n\n\n\nbool cMonster::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tif (!m_SoundHurt.empty() && (m_Health > 0))\n\t{\n\t\tm_World->BroadcastSoundEffect(m_SoundHurt, GetPosition(), 1.0f, 0.8f);\n\t}\n\n\tif ((a_TDI.Attacker != nullptr) && a_TDI.Attacker->IsPawn())\n\t{\n\t\tif (\n\t\t\t(!a_TDI.Attacker->IsPlayer()) ||\n\t\t\t(static_cast<cPlayer *>(a_TDI.Attacker)->CanMobsTarget())\n\t\t)\n\t\t{\n\t\t\tSetTarget(static_cast<cPawn*>(a_TDI.Attacker));\n\t\t}\n\t\tm_TicksSinceLastDamaged = 0;\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cMonster::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\tif (m_SoundHurt != \"\")\n\t{\n\t\tm_World->BroadcastSoundEffect(m_SoundDeath, GetPosition(), 1.0f, 0.8f);\n\t}\n\n\tif (IsTame())\n\t{\n\t\tif ((m_MobType == mtWolf) || (m_MobType == mtOcelot) || (m_MobType == mtCat) || (m_MobType == mtParrot))\n\t\t{\n\t\t\tBroadcastDeathMessage(a_TDI);\n\t\t}\n\t}\n\n\tint Reward;\n\tswitch (m_MobType)\n\t{\n\t\t// Animals\n\t\tcase mtChicken:\n\t\tcase mtCow:\n\t\tcase mtHorse:\n\t\tcase mtPig:\n\t\tcase mtRabbit:\n\t\tcase mtSheep:\n\t\tcase mtSquid:\n\t\tcase mtMooshroom:\n\t\tcase mtOcelot:\n\t\tcase mtWolf:\n\t\t{\n\t\t\tReward = GetRandomProvider().RandInt(1, 3);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Monsters\n\t\tcase mtCaveSpider:\n\t\tcase mtCreeper:\n\t\tcase mtEnderman:\n\t\tcase mtGhast:\n\t\tcase mtGuardian:\n\t\tcase mtSilverfish:\n\t\tcase mtSkeleton:\n\t\tcase mtSpider:\n\t\tcase mtWitch:\n\t\tcase mtWitherSkeleton:\n\t\tcase mtZombie:\n\t\tcase mtZombiePigman:\n\t\tcase mtZombieVillager:\n\t\tcase mtSlime:\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\tReward = GetRandomProvider().RandInt(6, 8);\n\t\t\tbreak;\n\t\t}\n\t\tcase mtEndermite:\n\t\t{\n\t\t\tReward = 3;\n\t\t\tbreak;\n\t\t}\n\t\tcase mtBlaze:\n\t\t{\n\t\t\tReward = 10;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Bosses\n\t\tcase mtEnderDragon:\n\t\t{\n\t\t\tReward = 12000;\n\t\t\tbreak;\n\t\t}\n\t\tcase mtWither:\n\t\t{\n\t\t\tReward = 50;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tReward = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif ((a_TDI.Attacker != nullptr) && (!IsBaby()))\n\t{\n\t\tm_World->SpawnSplitExperienceOrbs(GetPosX(), GetPosY(), GetPosZ(), Reward);\n\t}\n\tm_DestroyTimer = std::chrono::milliseconds(0);\n}\n\n\n\n\n\nvoid cMonster::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tconst cItem & EquippedItem = a_Player.GetEquippedItem();\n\tif ((EquippedItem.m_ItemType == E_ITEM_NAME_TAG) && !EquippedItem.m_CustomName.empty())\n\t{\n\t\tSetCustomName(EquippedItem.m_CustomName);\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t}\n\n\t// Using leashes\n\tm_IsLeashActionJustDone = false;\n\tif (IsLeashed() && (GetLeashedTo() == &a_Player))  // a player can only unleash a mob leashed to him\n\t{\n\t\tUnleash(!a_Player.IsGameModeCreative());\n\t}\n\telse if (IsLeashed())\n\t{\n\t\t// Mob is already leashed but client anticipates the server action and draws a leash link, so we need to send current leash to cancel it\n\t\tm_World->BroadcastLeashEntity(*this, *this->GetLeashedTo());\n\t}\n\telse if (CanBeLeashed() && (EquippedItem.m_ItemType == E_ITEM_LEASH))\n\t{\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t\tLeashTo(a_Player);\n\t}\n}\n\n\n\n\n\n// Checks to see if EventSeePlayer should be fired\n// monster sez: Do I see the player\nvoid cMonster::CheckEventSeePlayer(cChunk & a_Chunk)\n{\n\tif (GetTarget() != nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tcPlayer * TargetPlayer = nullptr;\n\tdouble ClosestDistance = m_SightDistance * m_SightDistance;\n\tconst auto MyHeadPosition = GetPosition().addedY(GetHeight());\n\n\t// Enumerate all players within sight:\n\tm_World->ForEachPlayer([this, &TargetPlayer, &ClosestDistance, MyHeadPosition](cPlayer & a_Player)\n\t{\n\t\tif (!a_Player.CanMobsTarget())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto TargetHeadPosition = a_Player.GetPosition().addedY(a_Player.GetHeight());\n\t\tconst auto TargetDistance = (TargetHeadPosition - MyHeadPosition).SqrLength();\n\n\t\t// TODO: Currently all mobs see through lava, but only Nether-native mobs should be able to.\n\t\tif (\n\t\t\t(TargetDistance < ClosestDistance) &&\n\t\t\tcLineBlockTracer::LineOfSightTrace(*GetWorld(), MyHeadPosition, TargetHeadPosition, cLineBlockTracer::losAirWaterLava)\n\t\t)\n\t\t{\n\t\t\tTargetPlayer = &a_Player;\n\t\t\tClosestDistance = TargetDistance;\n\t\t}\n\n\t\treturn false;\n\t});\n\n\t// Target him if suitable player found:\n\tif (TargetPlayer != nullptr)\n\t{\n\t\tEventSeePlayer(TargetPlayer, a_Chunk);\n\t}\n}\n\n\n\n\n\nvoid cMonster::CheckEventLostPlayer(const std::chrono::milliseconds a_Dt)\n{\n\tconst auto Target = GetTarget();\n\n\tif (Target == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// Check if the player died, is in creative mode, etc:\n\tif (Target->IsPlayer() && !static_cast<cPlayer *>(Target)->CanMobsTarget())\n\t{\n\t\tEventLosePlayer();\n\t\treturn;\n\t}\n\n\t// Check if the target is too far away:\n\tif (!Target->GetBoundingBox().DoesIntersect({ GetPosition(), m_SightDistance * 2.0 }))\n\t{\n\t\tEventLosePlayer();\n\t\treturn;\n\t}\n\n\tconst auto MyHeadPosition = GetPosition().addedY(GetHeight());\n\tconst auto TargetHeadPosition = Target->GetPosition().addedY(Target->GetHeight());\n\tif (!cLineBlockTracer::LineOfSightTrace(*GetWorld(), MyHeadPosition, TargetHeadPosition, cLineBlockTracer::losAirWaterLava))\n\t{\n\t\tif ((m_LoseSightAbandonTargetTimer += a_Dt) > std::chrono::seconds(4))\n\t\t{\n\t\t\tEventLosePlayer();\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Subtract the amount of time we \"handled\" instead of setting to zero, so we don't ignore a large a_Dt of say, 8s:\n\t\tm_LoseSightAbandonTargetTimer -= std::min(std::chrono::milliseconds(4000), m_LoseSightAbandonTargetTimer);\n\t}\n}\n\n\n\n\n\n// What to do if player is seen\n// default to change state to chasing\nvoid cMonster::EventSeePlayer(cPlayer * a_SeenPlayer, cChunk & a_Chunk)\n{\n\tUNUSED(a_Chunk);\n\tSetTarget(a_SeenPlayer);\n}\n\n\n\n\n\nvoid cMonster::EventLosePlayer(void)\n{\n\tSetTarget(nullptr);\n\n\tm_EMState = IDLE;\n\tm_LoseSightAbandonTargetTimer = std::chrono::seconds::zero();\n}\n\n\n\n\n\nvoid cMonster::InStateIdle(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tif (m_PathfinderActivated)\n\t{\n\t\treturn;  // Still getting there\n\t}\n\n\tm_IdleInterval += a_Dt;\n\n\tif (m_IdleInterval > std::chrono::seconds(1))\n\t{\n\t\tauto & Random = GetRandomProvider();\n\n\t\t// At this interval the results are predictable\n\t\tint rem = Random.RandInt(1, 7);\n\t\tm_IdleInterval -= std::chrono::seconds(1);  // So nothing gets dropped when the server hangs for a few seconds\n\n\t\tVector3d Dist;\n\t\tDist.x = static_cast<double>(Random.RandInt(-5, 5));\n\t\tDist.z = static_cast<double>(Random.RandInt(-5, 5));\n\n\t\tif ((Dist.SqrLength() > 2)  && (rem >= 3))\n\t\t{\n\n\t\t\tVector3d Destination(GetPosX() + Dist.x, GetPosition().y, GetPosZ() + Dist.z);\n\n\t\t\tcChunk * Chunk = a_Chunk.GetNeighborChunk(static_cast<int>(Destination.x), static_cast<int>(Destination.z));\n\t\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tBLOCKTYPE BlockType;\n\t\t\tNIBBLETYPE BlockMeta;\n\t\t\tint RelX = static_cast<int>(Destination.x) - Chunk->GetPosX() * cChunkDef::Width;\n\t\t\tint RelZ = static_cast<int>(Destination.z) - Chunk->GetPosZ() * cChunkDef::Width;\n\t\t\tint YBelowUs = static_cast<int>(Destination.y) - 1;\n\t\t\tif (YBelowUs >= 0)\n\t\t\t{\n\t\t\t\tChunk->GetBlockTypeMeta(RelX, YBelowUs, RelZ, BlockType, BlockMeta);\n\t\t\t\tif (BlockType != E_BLOCK_STATIONARY_WATER)  // Idle mobs shouldn't enter water on purpose\n\t\t\t\t{\n\t\t\t\t\tMoveToPosition(Destination);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n// What to do if in Chasing State\n// This state should always be defined in each child class\nvoid cMonster::InStateChasing(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n}\n\n\n\n\n\n// What to do if in Escaping State\nvoid cMonster::InStateEscaping(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tUNUSED(a_Dt);\n\n\tif (GetTarget() != nullptr)\n\t{\n\t\tVector3d newloc = GetPosition();\n\t\tnewloc.x = (GetTarget()->GetPosition().x < newloc.x)? (newloc.x + m_SightDistance): (newloc.x - m_SightDistance);\n\t\tnewloc.z = (GetTarget()->GetPosition().z < newloc.z)? (newloc.z + m_SightDistance): (newloc.z - m_SightDistance);\n\t\tMoveToPosition(newloc);\n\t}\n\telse\n\t{\n\t\tm_EMState = IDLE;  // This shouldnt be required but just to be safe\n\t}\n}\n\n\n\n\n\nvoid cMonster::ResetAttackCooldown()\n{\n\tm_AttackCoolDownTicksLeft = static_cast<int>(TPS * m_AttackRate);  // A second has 20 ticks, an attack rate of 1 means 1 hit every second\n}\n\n\n\n\n\nvoid cMonster::SetCustomName(const AString & a_CustomName)\n{\n\tm_CustomName = a_CustomName;\n\n\t// The maximal length is 64\n\tif (a_CustomName.length() > 64)\n\t{\n\t\tm_CustomName = a_CustomName.substr(0, 64);\n\t}\n\n\tif (m_World != nullptr)\n\t{\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n}\n\n\n\n\n\nvoid cMonster::SetCustomNameAlwaysVisible(bool a_CustomNameAlwaysVisible)\n{\n\tm_CustomNameAlwaysVisible = a_CustomNameAlwaysVisible;\n\tif (m_World != nullptr)\n\t{\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n}\n\n\n\n\n\nvoid cMonster::GetMonsterConfig(const AString & a_Name)\n{\n\tcRoot::Get()->GetMonsterConfig()->AssignAttributes(this, a_Name);\n}\n\n\n\n\n\nbool cMonster::IsNetherNative(void)\n{\n\treturn false;\n}\n\n\n\n\n\nbool cMonster::IsUndead(void)\n{\n\treturn false;\n}\n\n\n\n\n\nAString cMonster::MobTypeToString(eMonsterType a_MobType)\n{\n\t// Mob types aren't sorted, so we need to search linearly:\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_MobTypeNames); i++)\n\t{\n\t\tif (g_MobTypeNames[i].m_Type == a_MobType)\n\t\t{\n\t\t\treturn g_MobTypeNames[i].m_lcName;\n\t\t}\n\t}\n\n\t// Not found:\n\treturn \"\";\n}\n\n\n\n\n\nAString cMonster::MobTypeToVanillaName(eMonsterType a_MobType)\n{\n\t// Mob types aren't sorted, so we need to search linearly:\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_MobTypeNames); i++)\n\t{\n\t\tif (g_MobTypeNames[i].m_Type == a_MobType)\n\t\t{\n\t\t\treturn g_MobTypeNames[i].m_VanillaName;\n\t\t}\n\t}\n\n\t// Not found:\n\treturn \"\";\n}\n\n\n\n\n\nAString cMonster::MobTypeToVanillaNBT(eMonsterType a_MobType)\n{\n\t// Mob types aren't sorted, so we need to search linearly:\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_MobTypeNames); i++)\n\t{\n\t\tif (g_MobTypeNames[i].m_Type == a_MobType)\n\t\t{\n\t\t\treturn g_MobTypeNames[i].m_VanillaNameNBT;\n\t\t}\n\t}\n\n\t// Not found:\n\treturn \"\";\n}\n\n\n\n\n\neMonsterType cMonster::StringToMobType(const AString & a_Name)\n{\n\tAString lcName = StrToLower(a_Name);\n\n\t// Search Cuberite name:\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_MobTypeNames); i++)\n\t{\n\t\tif (strcmp(g_MobTypeNames[i].m_lcName, lcName.c_str()) == 0)\n\t\t{\n\t\t\treturn g_MobTypeNames[i].m_Type;\n\t\t}\n\t}\n\n\t// Not found. Search Vanilla name:\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_MobTypeNames); i++)\n\t{\n\t\tif (strcmp(StrToLower(g_MobTypeNames[i].m_VanillaName).c_str(), lcName.c_str()) == 0)\n\t\t{\n\t\t\treturn g_MobTypeNames[i].m_Type;\n\t\t}\n\t}\n\n\t// Search in NBT name\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_MobTypeNames); i++)\n\t{\n\t\tif (strcmp(StrToLower(g_MobTypeNames[i].m_VanillaNameNBT).c_str(), lcName.c_str()) == 0)\n\t\t{\n\t\t\treturn g_MobTypeNames[i].m_Type;\n\t\t}\n\t}\n\n\t// Not found:\n\treturn mtInvalidType;\n}\n\n\n\n\n\ncMonster::eFamily cMonster::FamilyFromType(eMonsterType a_Type)\n{\n\t// Passive-agressive mobs are counted in mob spawning code as passive\n\n\tswitch (a_Type)\n\t{\n\t\tcase mtBat:             return mfAmbient;\n\t\tcase mtBlaze:           return mfHostile;\n\t\tcase mtCat:             return mfPassive;\n\t\tcase mtCaveSpider:      return mfHostile;\n\t\tcase mtChicken:         return mfPassive;\n\t\tcase mtCod:             return mfWater;\n\t\tcase mtCow:             return mfPassive;\n\t\tcase mtCreeper:         return mfHostile;\n\t\tcase mtDolphin:         return mfWater;\n\t\tcase mtDonkey:          return mfPassive;\n\t\tcase mtDrowned:         return mfHostile;\n\t\tcase mtElderGuardian:   return mfHostile;\n\t\tcase mtEnderDragon:     return mfNoSpawn;\n\t\tcase mtEnderman:        return mfHostile;\n\t\tcase mtEndermite:       return mfHostile;\n\t\tcase mtEvoker:          return mfHostile;\n\t\tcase mtFox:             return mfPassive;\n\t\tcase mtGhast:           return mfHostile;\n\t\tcase mtGiant:           return mfNoSpawn;\n\t\tcase mtGuardian:        return mfWater;  // Just because they have special spawning conditions. TODO: If Watertemples have been added, this needs to be edited!\n\t\tcase mtHoglin:          return mfHostile;\n\t\tcase mtHorse:           return mfPassive;\n\t\tcase mtHusk:            return mfHostile;\n\t\tcase mtIllusioner:      return mfHostile;\n\t\tcase mtIronGolem:       return mfPassive;\n\t\tcase mtLlama:           return mfPassive;\n\t\tcase mtMagmaCube:       return mfHostile;\n\t\tcase mtMooshroom:       return mfPassive;\n\t\tcase mtMule:            return mfPassive;\n\t\tcase mtOcelot:          return mfPassive;\n\t\tcase mtPanda:           return mfPassive;\n\t\tcase mtParrot:          return mfPassive;\n\t\tcase mtPhantom:         return mfHostile;\n\t\tcase mtPig:             return mfPassive;\n\t\tcase mtPiglin:          return mfHostile;\n\t\tcase mtPiglinBrute:     return mfHostile;\n\t\tcase mtPillager:        return mfHostile;\n\t\tcase mtPolarBear:       return mfPassive;\n\t\tcase mtPufferfish:      return mfWater;\n\t\tcase mtRabbit:          return mfPassive;\n\t\tcase mtRavager:         return mfHostile;\n\t\tcase mtSalmon:          return mfWater;\n\t\tcase mtSheep:           return mfPassive;\n\t\tcase mtShulker:         return mfHostile;\n\t\tcase mtSilverfish:      return mfHostile;\n\t\tcase mtSkeleton:        return mfHostile;\n\t\tcase mtSkeletonHorse:   return mfPassive;\n\t\tcase mtSlime:           return mfHostile;\n\t\tcase mtSnowGolem:       return mfNoSpawn;\n\t\tcase mtSpider:          return mfHostile;\n\t\tcase mtSquid:           return mfWater;\n\t\tcase mtStray:           return mfHostile;\n\t\tcase mtStrider:         return mfHostile;\n\t\tcase mtTraderLlama:     return mfPassive;\n\t\tcase mtTropicalFish:    return mfWater;\n\t\tcase mtTurtle:          return mfWater;  // I'm not quite sure\n\t\tcase mtVex:             return mfHostile;\n\t\tcase mtVindicator:      return mfHostile;\n\t\tcase mtVillager:        return mfPassive;\n\t\tcase mtWanderingTrader: return mfPassive;\n\t\tcase mtWitch:           return mfHostile;\n\t\tcase mtWither:          return mfNoSpawn;\n\t\tcase mtWitherSkeleton:  return mfHostile;\n\t\tcase mtWolf:            return mfPassive;\n\t\tcase mtZoglin:          return mfHostile;\n\t\tcase mtZombie:          return mfHostile;\n\t\tcase mtZombieHorse:     return mfPassive;\n\t\tcase mtZombiePigman:    return mfHostile;\n\t\tcase mtZombieVillager:  return mfHostile;\n\t\tcase mtInvalidType:     break;\n\t}\n\tUNREACHABLE(\"Unhandled mob type\");\n}\n\n\n\n\n\ncTickTime cMonster::GetSpawnDelay(cMonster::eFamily a_MobFamily)\n{\n\tswitch (a_MobFamily)\n\t{\n\t\tcase mfHostile:   return 40_tick;\n\t\tcase mfPassive:   return 40_tick;\n\t\tcase mfAmbient:   return 40_tick;\n\t\tcase mfWater:     return 400_tick;\n\t\tcase mfNoSpawn:   return -1_tick;\n\t}\n\tUNREACHABLE(\"Unhandled mob family\");\n}\n\n\n\n\n\n/** Sets the target. */\nvoid cMonster::SetTarget (cPawn * a_NewTarget)\n{\n\tASSERT((a_NewTarget == nullptr) || (IsTicking()));\n\tif (m_Target == a_NewTarget)\n\t{\n\t\treturn;\n\t}\n\tcPawn * OldTarget = m_Target;\n\tm_Target = a_NewTarget;\n\n\tif (OldTarget != nullptr)\n\t{\n\t\t// Notify the old target that we are no longer targeting it.\n\t\tOldTarget->NoLongerTargetingMe(this);\n\t}\n\n\tif (a_NewTarget != nullptr)\n\t{\n\t\tASSERT(a_NewTarget->IsTicking());\n\t\t// Notify the new target that we are now targeting it.\n\t\tm_Target->TargetingMe(this);\n\t\tm_WasLastTargetAPlayer = m_Target->IsPlayer();\n\t}\n\n}\n\n\n\n\n\nvoid cMonster::UnsafeUnsetTarget()\n{\n\tm_Target = nullptr;\n}\n\n\n\n\n\ncPawn * cMonster::GetTarget()\n{\n\treturn m_Target;\n}\n\n\n\n\n\nstd::unique_ptr<cMonster> cMonster::NewMonsterFromType(eMonsterType a_MobType)\n{\n\tauto & Random = GetRandomProvider();\n\n\t// Create the mob entity\n\tswitch (a_MobType)\n\t{\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\treturn std::make_unique<cMagmaCube>(1 << Random.RandInt(2));  // Size 1, 2 or 4\n\t\t}\n\t\tcase mtSlime:\n\t\t{\n\t\t\treturn std::make_unique<cSlime>(1 << Random.RandInt(2));  // Size 1, 2 or 4\n\t\t}\n\t\tcase mtVillager: return std::make_unique<cVillager>(cVillager::GetRandomProfession());\n\t\tcase mtHorse:\n\t\t{\n\t\t\t// Horses take a type (species), a colour, and a style (dots, stripes, etc.)\n\t\t\tint HorseType = Random.RandInt(7);\n\t\t\tint HorseColor = Random.RandInt(6);\n\t\t\tint HorseStyle = Random.RandInt(4);\n\t\t\tint HorseTameTimes = Random.RandInt(1, 6);\n\n\t\t\tif ((HorseType == 5) || (HorseType == 6) || (HorseType == 7))\n\t\t\t{\n\t\t\t\t// Increase chances of normal horse (zero)\n\t\t\t\tHorseType = 0;\n\t\t\t}\n\n\t\t\treturn std::make_unique<cHorse>(HorseType, HorseColor, HorseStyle, HorseTameTimes);\n\t\t}\n\t\tcase mtZombieVillager:\n\t\t{\n\t\t\treturn std::make_unique<cZombieVillager>(cVillager::GetRandomProfession());\n\t\t}\n\t\tcase mtBat:            return std::make_unique<cBat>();\n\t\tcase mtBlaze:          return std::make_unique<cBlaze>();\n\t\tcase mtCaveSpider:     return std::make_unique<cCaveSpider>();\n\t\tcase mtChicken:        return std::make_unique<cChicken>();\n\t\tcase mtCow:            return std::make_unique<cCow>();\n\t\tcase mtCreeper:        return std::make_unique<cCreeper>();\n\t\tcase mtEnderDragon:    return std::make_unique<cEnderDragon>();\n\t\tcase mtEndermite:      return std::make_unique<cEndermite>();\n\t\tcase mtEnderman:       return std::make_unique<cEnderman>();\n\t\tcase mtGhast:          return std::make_unique<cGhast>();\n\t\tcase mtGiant:          return std::make_unique<cGiant>();\n\t\tcase mtGuardian:       return std::make_unique<cGuardian>();\n\t\tcase mtIronGolem:      return std::make_unique<cIronGolem>();\n\t\tcase mtMooshroom:      return std::make_unique<cMooshroom>();\n\t\tcase mtOcelot:         return std::make_unique<cOcelot>();\n\t\tcase mtPig:            return std::make_unique<cPig>();\n\t\tcase mtRabbit:         return std::make_unique<cRabbit>();\n\t\tcase mtSheep:          return std::make_unique<cSheep>();\n\t\tcase mtSilverfish:     return std::make_unique<cSilverfish>();\n\t\tcase mtSkeleton:       return std::make_unique<cSkeleton>();\n\t\tcase mtSnowGolem:      return std::make_unique<cSnowGolem>();\n\t\tcase mtSpider:         return std::make_unique<cSpider>();\n\t\tcase mtSquid:          return std::make_unique<cSquid>();\n\t\tcase mtWitch:          return std::make_unique<cWitch>();\n\t\tcase mtWither:         return std::make_unique<cWither>();\n\t\tcase mtWitherSkeleton: return std::make_unique<cWitherSkeleton>();\n\t\tcase mtWolf:           return std::make_unique<cWolf>();\n\t\tcase mtZombie:         return std::make_unique<cZombie>();\n\t\tcase mtZombiePigman:   return std::make_unique<cZombiePigman>();\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unhandled mob type whilst trying to spawn mob!\");\n\t\t\treturn nullptr;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMonster::EngageLoveMode(cMonster *a_Partner)\n{\n\tm_LovePartner = a_Partner;\n\tm_MatingTimer = 50;  // about 3 seconds of mating\n}\n\n\n\n\n\nvoid cMonster::ResetLoveMode()\n{\n\tm_LovePartner = nullptr;\n\tm_LoveTimer = 0;\n\tm_MatingTimer = 0;\n\tm_LoveCooldown = TPS * 60 * 5;  // 5 minutes\n\n\t// when an animal is in love mode, the client only stops sending the hearts if we let them know it's in cooldown, which is done with the \"age\" metadata\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cMonster::LoveTick(void)\n{\n\t// if we have a partner, mate\n\tif (m_LovePartner != nullptr)\n\t{\n\n\t\tif (m_MatingTimer > 0)\n\t\t{\n\t\t\t// If we should still mate, keep bumping into them until baby is made\n\t\t\tVector3d Pos = m_LovePartner->GetPosition();\n\t\t\tMoveToPosition(Pos);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Mating finished. Spawn baby\n\t\t\tVector3f Pos = (GetPosition() + m_LovePartner->GetPosition()) * 0.5;\n\t\t\tUInt32 BabyID = m_World->SpawnMob(Pos.x, Pos.y, Pos.z, GetMobType(), true);\n\n\t\t\tcMonster * Baby = nullptr;\n\n\t\t\tm_World->DoWithEntityByID(BabyID, [&](cEntity & a_Entity)\n\t\t\t{\n\t\t\t\tBaby = static_cast<cMonster *>(&a_Entity);\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\t\tif (Baby != nullptr)\n\t\t\t{\n\t\t\t\tBaby->InheritFromParents(this, m_LovePartner);\n\t\t\t}\n\n\t\t\tm_World->SpawnExperienceOrb(Pos.x, Pos.y, Pos.z, GetRandomProvider().RandInt(1, 6));\n\n\t\t\tm_World->DoWithPlayerByUUID(m_Feeder, [&] (cPlayer & a_Player)\n\t\t\t{\n\t\t\t\ta_Player.GetStatistics().Custom[CustomStatistic::AnimalsBred]++;\n\t\t\t\tif (GetMobType() == eMonsterType::mtCow)\n\t\t\t\t{\n\t\t\t\t\ta_Player.AwardAchievement(CustomStatistic::AchBreedCow);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\tm_LovePartner->ResetLoveMode();\n\t\t\tResetLoveMode();\n\t\t}\n\t}\n\telse\n\t{\n\t\t// We have no partner, so we just chase the player if they have our breeding item\n\t\tcItems FollowedItems;\n\t\tGetFollowedItems(FollowedItems);\n\t\tif (FollowedItems.Size() > 0)\n\t\t{\n\t\t\tm_World->DoWithNearestPlayer(GetPosition(), static_cast<float>(m_SightDistance), [&](cPlayer & a_Player) -> bool\n\t\t\t{\n\t\t\t\tconst cItem & EquippedItem = a_Player.GetEquippedItem();\n\t\t\t\tif (FollowedItems.ContainsType(EquippedItem))\n\t\t\t\t{\n\t\t\t\t\tVector3d PlayerPos = a_Player.GetPosition();\n\t\t\t\t\tMoveToPosition(PlayerPos);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t}\n\n\t// If we are in love mode but we have no partner, search for a partner neabry\n\tif (m_LoveTimer > 0)\n\t{\n\t\tif (m_LovePartner == nullptr)\n\t\t{\n\t\t\tm_World->ForEachEntityInBox(cBoundingBox(GetPosition(), 8, 8), [=](cEntity & a_Entity)\n\t\t\t{\n\t\t\t\t// If the entity is not a monster, don't breed with it\n\t\t\t\t// Also, do not self-breed\n\t\t\t\tif ((a_Entity.GetEntityType() != etMonster) || (&a_Entity == this))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tauto & Me = static_cast<cMonster &>(*this);\n\t\t\t\tauto & PotentialPartner = static_cast<cMonster &>(a_Entity);\n\n\t\t\t\t// If the potential partner is not of the same species, don't breed with it\n\t\t\t\tif (PotentialPartner.GetMobType() != Me.GetMobType())\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// If the potential partner is not in love\n\t\t\t\t// Or they already have a mate, do not breed with them\n\t\t\t\tif ((!PotentialPartner.IsInLove()) || (PotentialPartner.GetPartner() != nullptr))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// All conditions met, let's breed!\n\t\t\t\tPotentialPartner.EngageLoveMode(&Me);\n\t\t\t\tMe.EngageLoveMode(&PotentialPartner);\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\n\t\tm_LoveTimer--;\n\t}\n\tif (m_MatingTimer > 0)\n\t{\n\t\tm_MatingTimer--;\n\t}\n\tif (m_LoveCooldown > 0)\n\t{\n\t\tm_LoveCooldown--;\n\t}\n}\n\n\n\n\n\nvoid cMonster::RightClickFeed(cPlayer & a_Player)\n{\n\n\tconst cItem & EquippedItem = a_Player.GetEquippedItem();\n\n\t// If a player holding breeding items right-clicked me, go into love mode\n\tif ((m_LoveCooldown == 0) && !IsInLove() && !IsBaby())\n\t{\n\t\tcItems Items;\n\t\tGetBreedingItems(Items);\n\t\tif (Items.ContainsType(EquippedItem.m_ItemType))\n\t\t{\n\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t{\n\t\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t\t}\n\t\t\tm_LoveTimer = TPS * 30;  // half a minute\n\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::AnimalFallsInLove);\n\t\t}\n\t}\n\t// If a player holding my spawn egg right-clicked me, spawn a new baby\n\tif (EquippedItem.m_ItemType == E_ITEM_SPAWN_EGG)\n\t{\n\t\teMonsterType MonsterType = cItemSpawnEggHandler::ItemDamageToMonsterType(EquippedItem.m_ItemDamage);\n\t\tif (\n\t\t\t(MonsterType == m_MobType) &&\n\t\t\t(m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), m_MobType, true) != cEntity::INVALID_ID)  // Spawning succeeded\n\t\t\t)\n\t\t{\n\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t{\n\t\t\t\t// The mob was spawned, \"use\" the item:\n\t\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t\t}\n\t\t}\n\t}\n\t// Stores feeder UUID for statistic tracking\n\tm_Feeder = a_Player.GetUUID();\n}\n\n\n\n\n\nvoid cMonster::AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth)\n{\n\tauto Count = GetRandomProvider().RandInt(a_Min, a_Max);\n\tauto MaxStackSize = static_cast<unsigned int>(cItem(a_Item).GetMaxStackSize());\n\twhile (Count > MaxStackSize)\n\t{\n\t\ta_Drops.emplace_back(a_Item, MaxStackSize, a_ItemHealth);\n\t\tCount -= MaxStackSize;\n\t}\n\tif (Count > 0)\n\t{\n\t\ta_Drops.emplace_back(a_Item, Count, a_ItemHealth);\n\t}\n}\n\n\n\n\n\nvoid cMonster::AddRandomUncommonDropItem(cItems & a_Drops, float a_Chance, short a_Item, short a_ItemHealth)\n{\n\tif (GetRandomProvider().RandBool(a_Chance / 100.0))\n\t{\n\t\ta_Drops.emplace_back(a_Item, static_cast<char>(1), a_ItemHealth);\n\t}\n}\n\n\n\n\n\nvoid cMonster::AddRandomRareDropItem(cItems & a_Drops, cItems & a_Items, unsigned int a_LootingLevel)\n{\n\tauto & r1 = GetRandomProvider();\n\tif (r1.RandBool((5 + a_LootingLevel) / 200.0))\n\t{\n\t\tsize_t Rare = r1.RandInt<size_t>(a_Items.Size() - 1);\n\t\ta_Drops.push_back(a_Items.at(Rare));\n\t}\n}\n\n\n\n\n\nvoid cMonster::AddRandomArmorDropItem(cItems & a_Drops, unsigned int a_LootingLevel)\n{\n\tauto & r1 = GetRandomProvider();\n\n\tdouble LootingBonus = a_LootingLevel / 100.0;\n\n\tif (r1.RandBool(m_DropChanceHelmet + LootingBonus))\n\t{\n\t\tif (!GetEquippedHelmet().IsEmpty())\n\t\t{\n\t\t\ta_Drops.push_back(GetEquippedHelmet());\n\t\t}\n\t}\n\n\tif (r1.RandBool(m_DropChanceChestplate + LootingBonus))\n\t{\n\t\tif (!GetEquippedChestplate().IsEmpty())\n\t\t{\n\t\t\ta_Drops.push_back(GetEquippedChestplate());\n\t\t}\n\t}\n\n\tif (r1.RandBool(m_DropChanceLeggings + LootingBonus))\n\t{\n\t\tif (!GetEquippedLeggings().IsEmpty())\n\t\t{\n\t\t\ta_Drops.push_back(GetEquippedLeggings());\n\t\t}\n\t}\n\n\tif (r1.RandBool(m_DropChanceBoots + LootingBonus))\n\t{\n\t\tif (!GetEquippedBoots().IsEmpty())\n\t\t{\n\t\t\ta_Drops.push_back(GetEquippedBoots());\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMonster::AddRandomWeaponDropItem(cItems & a_Drops, unsigned int a_LootingLevel)\n{\n\tif (GetRandomProvider().RandBool(m_DropChanceWeapon + (a_LootingLevel / 100.0)))\n\t{\n\t\tif (!GetEquippedWeapon().IsEmpty())\n\t\t{\n\t\t\ta_Drops.push_back(GetEquippedWeapon());\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMonster::HandleDaylightBurning(cChunk & a_Chunk, bool WouldBurn)\n{\n\tif (!m_BurnsInDaylight)\n\t{\n\t\treturn;\n\t}\n\n\tint RelY = POSY_TOINT;\n\tif ((RelY < 0) || (RelY >= cChunkDef::Height))\n\t{\n\t\t// Outside the world\n\t\treturn;\n\t}\n\tif (!a_Chunk.IsLightValid())\n\t{\n\t\tm_World->QueueLightChunk(GetChunkX(), GetChunkZ());\n\t\treturn;\n\t}\n\n\tif (!IsOnFire() && WouldBurn)\n\t{\n\t\t// Burn for 100 ticks, then decide again\n\t\tStartBurning(100);\n\t}\n}\n\n\n\n\n\nbool cMonster::WouldBurnAt(Vector3d a_Location, cChunk & a_Chunk)\n{\n\t// If the Y coord is out of range, return the most logical result without considering anything else:\n\tint RelY = FloorC(a_Location.y);\n\tif (RelY >= cChunkDef::Height)\n\t{\n\t\t// Always burn above the world\n\t\treturn true;\n\t}\n\tif (RelY <= 0)\n\t{\n\t\t// The mob is about to die, no point in burning\n\t\treturn false;\n\t}\n\n\tPREPARE_REL_AND_CHUNK(a_Location, a_Chunk);\n\tif (!RelSuccess)\n\t{\n\t\treturn false;\n\t}\n\n\tif (\n\t\t(Chunk->GetBlock(Rel) != E_BLOCK_SOULSAND) &&   // Not on soulsand\n\t\t(GetWorld()->GetTimeOfDay() < 13000_tick) &&    // Daytime\n\t\tChunk->IsWeatherSunnyAt(Rel.x, Rel.z) &&        // Not raining\n\t\t!IsInWater()                                    // Isn't swimming\n\t)\n\t{\n\t\tint MobHeight = CeilC(a_Location.y + GetHeight()) - 1;  // The block Y coord of the mob's head\n\t\tif (MobHeight >= cChunkDef::Height)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\t// Start with the highest block and scan down to just above the mob's head.\n\t\t// If a non transparent is found, return false (do not burn). Otherwise return true.\n\t\t// Note that this loop is not a performance concern as transparent blocks are rare and the loop almost always bailes out\n\t\t// instantly.(An exception is e.g. standing under a long column of glass).\n\t\tint CurrentBlock = Chunk->GetHeight(Rel.x, Rel.z);\n\t\twhile (CurrentBlock > MobHeight)\n\t\t{\n\t\t\tBLOCKTYPE Block = Chunk->GetBlock(Rel.x, CurrentBlock, Rel.z);\n\t\t\tif (\n\t\t\t\t// Do not burn if a block above us meets one of the following conditions:\n\t\t\t\t(!cBlockInfo::IsTransparent(Block)) ||\n\t\t\t\t(Block == E_BLOCK_LEAVES) ||\n\t\t\t\t(Block == E_BLOCK_NEW_LEAVES) ||\n\t\t\t\t(IsBlockWater(Block))\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t--CurrentBlock;\n\t\t}\n\t\treturn true;\n\n\t}\n\treturn false;\n}\n\n\n\n\n\ncMonster::eFamily cMonster::GetMobFamily(void) const\n{\n\treturn FamilyFromType(m_MobType);\n}\n\n\n\n\n\nvoid cMonster::LeashTo(cEntity & a_Entity, bool a_ShouldBroadcast)\n{\n\t// Do nothing if already leashed\n\tif (m_LeashedTo != nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tm_LeashedTo = &a_Entity;\n\n\ta_Entity.AddLeashedMob(this);\n\n\tif (a_ShouldBroadcast)\n\t{\n\t\tm_World->BroadcastLeashEntity(*this, a_Entity);\n\t}\n\n\tm_IsLeashActionJustDone = true;\n}\n\n\n\n\n\nvoid cMonster::Unleash(bool a_ShouldDropLeashPickup, bool a_ShouldBroadcast)\n{\n\t// Do nothing if not leashed\n\tif (m_LeashedTo == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tm_LeashedTo->RemoveLeashedMob(this);\n\n\tm_LeashedTo = nullptr;\n\n\tif (a_ShouldDropLeashPickup)\n\t{\n\t\tcItems Pickups;\n\t\tPickups.Add(cItem(E_ITEM_LEASH, 1, 0));\n\t\tGetWorld()->SpawnItemPickups(Pickups, GetPosX() + 0.5, GetPosY() + 0.5, GetPosZ() + 0.5);\n\t}\n\n\tif (a_ShouldBroadcast)\n\t{\n\t\tm_World->BroadcastUnleashEntity(*this);\n\t}\n\n\tm_IsLeashActionJustDone = true;\n}\n\n\n\n\n\nvoid cMonster::Unleash(bool a_ShouldDropLeashPickup)\n{\n\tUnleash(a_ShouldDropLeashPickup, true);\n}\n"
  },
  {
    "path": "src/Mobs/Monster.h",
    "content": "\n#pragma once\n\n#include \"../Entities/Pawn.h\"\n#include \"../UUID.h\"\n#include \"MonsterTypes.h\"\n#include \"PathFinder.h\"\n\n\nclass cItem;\nclass cClientHandle;\n\n\n\n// tolua_begin\nclass cMonster:\n\tpublic cPawn\n{\n\n\t// tolua_end\n\n\tusing Super = cPawn;\n\n\t// tolua_begin\n\npublic:\n\n\tenum eFamily\n\t{\n\t\tmfHostile  = 0,  // Spider, Zombies ...\n\t\tmfPassive  = 1,  // Cows, Pigs\n\t\tmfAmbient  = 2,  // Bats\n\t\tmfWater    = 3,  // Squid, Guardian\n\n\t\tmfNoSpawn\n\t} ;\n\n\t// tolua_end\n\n\tenum MState{ATTACKING, IDLE, CHASING, ESCAPING} m_EMState;\n\tenum MPersonality{PASSIVE, AGGRESSIVE, COWARDLY} m_EMPersonality;\n\n\t/** Creates the mob object.\n\tIf a_ConfigName is not empty, the configuration is loaded using GetMonsterConfig()\n\ta_MobType is the type of the mob (also used in the protocol ( http://wiki.vg/Entities#Mobs 2012_12_22))\n\ta_SoundHurt and a_SoundDeath are assigned into m_SoundHurt and m_SoundDeath, respectively\n\t*/\n\tcMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, const AString & a_SoundAmbient, float a_Width, float a_Height);\n\n\tCLASS_PROTODEF(cMonster)\n\n\tvirtual void OnRemoveFromWorld(cWorld & a_World) override;\n\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\n\tvirtual void HandleFalling(void) override;\n\n\t/** Engage pathfinder and tell it to calculate a path to a given position, and move the mob accordingly. */\n\tvirtual void MoveToPosition(const Vector3d & a_Position);  // tolua_export\n\n\t// tolua_begin\n\teMonsterType GetMobType(void) const { return m_MobType; }\n\teFamily GetMobFamily(void) const;\n\t// tolua_end\n\n\tvirtual void CheckEventSeePlayer(cChunk & a_Chunk);\n\tvirtual void EventSeePlayer(cPlayer * a_Player, cChunk & a_Chunk);\n\n\t// tolua_begin\n\n\t/** Returns whether the mob can be leashed. */\n\tbool CanBeLeashed() const { return m_CanBeLeashed; }\n\n\t/** Sets whether the mob can be leashed, for extensibility in plugins */\n\tvoid SetCanBeLeashed(bool a_CanBeLeashed) { m_CanBeLeashed = a_CanBeLeashed; }\n\n\t/** Returns whether the monster is leashed to an entity. */\n\tbool IsLeashed() const { return (m_LeashedTo != nullptr); }\n\n\t/** Leash the monster to an entity. */\n\tvoid LeashTo(cEntity & a_Entity, bool a_ShouldBroadcast = true);\n\n\t/** Unleash the monster. Overload for the Unleash(bool, bool) function for plugins */\n\tvoid Unleash(bool a_ShouldDropLeashPickup);\n\n\t/** Returns the entity to where this mob is leashed, returns nullptr if it's not leashed */\n\tcEntity * GetLeashedTo() const { return m_LeashedTo; }\n\n\t// tolua_end\n\n\t/** Unleash the monster. */\n\tvoid Unleash(bool a_ShouldDropLeashPickup, bool a_ShouldBroadcast);\n\n\t/** Sets entity position to where is leashed this mob */\n\tvoid SetLeashToPos(Vector3d * pos) { m_LeashToPos = std::unique_ptr<Vector3d>(pos); }\n\n\t/** Gets entity position to where mob should be leashed */\n\tVector3d * GetLeashToPos() const { return m_LeashToPos.get(); }\n\n\t/** Reads the monster configuration for the specified monster name and assigns it to this object. */\n\tvoid GetMonsterConfig(const AString & a_Name);\n\n\t/** Returns whether this mob spawns in the Nether in Vanilla.\n\tThis is a fixed value and is not affected by custom mob spawning settings. */\n\tvirtual bool IsNetherNative(void);\n\n\t/** Returns whether this mob is undead (skeleton, zombie, etc.) */\n\tvirtual bool IsUndead(void);\n\n\tvirtual void EventLosePlayer(void);\n\tvirtual void CheckEventLostPlayer(std::chrono::milliseconds a_Dt);\n\n\tvirtual void InStateIdle    (std::chrono::milliseconds a_Dt, cChunk & a_Chunk);\n\tvirtual void InStateChasing (std::chrono::milliseconds a_Dt, cChunk & a_Chunk);\n\tvirtual void InStateEscaping(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);\n\n\tdouble GetAttackRate() { return m_AttackRate; }\n\tvoid SetAttackRate(double a_AttackRate) { m_AttackRate = a_AttackRate; }\n\tvoid SetAttackRange(double a_AttackRange) { m_AttackRange = a_AttackRange; }\n\tvoid SetAttackDamage(int a_AttackDamage) { m_AttackDamage = a_AttackDamage; }\n\tvoid SetSightDistance(int a_SightDistance) { m_SightDistance = a_SightDistance; }\n\n\tfloat GetDropChanceWeapon() { return m_DropChanceWeapon; }\n\tfloat GetDropChanceHelmet() { return m_DropChanceHelmet; }\n\tfloat GetDropChanceChestplate() { return m_DropChanceChestplate; }\n\tfloat GetDropChanceLeggings() { return m_DropChanceLeggings; }\n\tfloat GetDropChanceBoots() { return m_DropChanceBoots; }\n\tbool CanPickUpLoot() { return m_CanPickUpLoot; }\n\tvoid SetDropChanceWeapon(float a_DropChanceWeapon) { m_DropChanceWeapon = a_DropChanceWeapon; }\n\tvoid SetDropChanceHelmet(float a_DropChanceHelmet) { m_DropChanceHelmet = a_DropChanceHelmet; }\n\tvoid SetDropChanceChestplate(float a_DropChanceChestplate) { m_DropChanceChestplate = a_DropChanceChestplate; }\n\tvoid SetDropChanceLeggings(float a_DropChanceLeggings) { m_DropChanceLeggings = a_DropChanceLeggings; }\n\tvoid SetDropChanceBoots(float a_DropChanceBoots) { m_DropChanceBoots = a_DropChanceBoots; }\n\tvoid SetCanPickUpLoot(bool a_CanPickUpLoot) { m_CanPickUpLoot = a_CanPickUpLoot; }\n\tvoid ResetAttackCooldown();\n\n\tvoid SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; }  // tolua_export\n\tbool BurnsInDaylight() const { return m_BurnsInDaylight; }  // tolua_export\n\n\tdouble GetRelativeWalkSpeed(void) const { return m_RelativeWalkSpeed; }  // tolua_export\n\tvoid SetRelativeWalkSpeed(double a_Speed) { m_RelativeWalkSpeed = a_Speed; }  // tolua_export\n\n\tvoid SetBaseWalkSpeed(double a_Speed) { m_BaseWalkSpeed = a_Speed; }\n\tvoid SetBaseRunSpeed(double a_Speed) { m_BaseRunSpeed = a_Speed; }\n\n\t// Overridables to handle ageable mobs\n\tvirtual bool IsTame    (void) const { return false; }\n\tvirtual bool IsSitting (void) const { return false; }\n\n\t// tolua_begin\n\tbool IsBaby (void) const { return m_Age < 0; }\n\tint GetAge (void) const { return m_Age; }\n\tvoid SetAge(int a_Age)  { m_Age = a_Age; }\n\t// tolua_end\n\n\n\t// tolua_begin\n\n\t/** Returns true if the monster has a custom name. */\n\tbool HasCustomName(void) const { return !m_CustomName.empty(); }\n\n\t/** Gets the custom name of the monster. If no custom name is set, the function returns an empty string. */\n\tconst AString & GetCustomName(void) const { return m_CustomName; }\n\n\t/** Sets the custom name of the monster. You see the name over the monster.\n\tIf you want to disable the custom name, simply set an empty string. */\n\tvoid SetCustomName(const AString & a_CustomName);\n\n\t/** Is the custom name of this monster always visible? If not, you only see the name when you sight the mob. */\n\tbool IsCustomNameAlwaysVisible(void) const { return m_CustomNameAlwaysVisible; }\n\n\t/** Sets the custom name visiblity of this monster.\n\tIf it's false, you only see the name when you sight the mob. If it's true, you always see the custom name. */\n\tvoid SetCustomNameAlwaysVisible(bool a_CustomNameAlwaysVisible);\n\n\t/** Translates MobType enum to a string, empty string if unknown */\n\tstatic AString MobTypeToString(eMonsterType a_MobType);\n\n\t/** Translates MobType enum to the vanilla name of the mob, empty string if unknown. */\n\tstatic AString MobTypeToVanillaName(eMonsterType a_MobType);\n\n\t/** Translates MobType string to the enum, mtInvalidType if not recognized */\n\tstatic eMonsterType StringToMobType(const AString & a_MobTypeName);\n\n\t/** Returns the mob family based on the type */\n\tstatic eFamily FamilyFromType(eMonsterType a_MobType);\n\n\t// tolua_end\n\n\t/** Returns the spawn delay (number of game ticks between spawn attempts) for the given mob family */\n\tstatic cTickTime GetSpawnDelay(cMonster::eFamily a_MobFamily);\n\n\t/**  Translates the MobType enum to the vanilla nbt name */\n\tstatic AString MobTypeToVanillaNBT(eMonsterType a_MobType);\n\n\t/** Sets the target that this mob will chase. Pass a nullptr to unset. */\n\tvoid SetTarget (cPawn * a_NewTarget);\n\n\t/** Unset the target without notifying the target entity. Do not use this, use SetTarget(nullptr) instead.\n\tThis is only used by cPawn internally. */\n\tvoid UnsafeUnsetTarget();\n\n\t/** Returns the current target. */\n\tcPawn * GetTarget();\n\n\t/** Creates a new object of the specified mob.\n\ta_MobType is the type of the mob to be created\n\tAsserts and returns null if mob type is not specified\n\t*/\n\tstatic std::unique_ptr<cMonster> NewMonsterFromType(eMonsterType a_MobType);\n\n\t/** Returns if this mob last target was a player to avoid destruction on player quit */\n\tbool WasLastTargetAPlayer() const { return m_WasLastTargetAPlayer; }\n\n\t/* the breeding processing */\n\n\t/** Returns the items that the animal of this class follows when a player holds it in hand. */\n\tvirtual void GetFollowedItems(cItems & a_Items) { }\n\n\t/** Returns the items that make the animal breed - this is usually the same as the ones that make the animal follow, but not necessarily. */\n\tvirtual void GetBreedingItems(cItems & a_Items) { GetFollowedItems(a_Items); }\n\n\t/** Called after the baby is born, allows the baby to inherit the parents' properties (color, etc.) */\n\tvirtual void InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2) { }\n\n\t/** Returns the partner which the monster is currently mating with. */\n\tcMonster * GetPartner(void) const { return m_LovePartner; }\n\n\t/** Start the mating process. Causes the monster to keep bumping into the partner until m_MatingTimer reaches zero. */\n\tvoid EngageLoveMode(cMonster * a_Partner);\n\n\t/** Finish the mating process. Called after a baby is born. Resets all breeding related timers and sets m_LoveCooldown to 20 minutes. */\n\tvoid ResetLoveMode();\n\n\t/** Returns whether the monster has just been fed and is ready to mate. If this is \"true\" and GetPartner isn't \"nullptr\", then the monster is mating. */\n\tbool IsInLove() const { return (m_LoveTimer > 0); }\n\n\t/** Returns whether the monster is tired of breeding and is in the cooldown state. */\n\tbool IsInLoveCooldown() const { return (m_LoveCooldown > 0); }\n\n\t/** Does the whole love and breeding processing */\n\tvoid LoveTick(void);\n\n\t/** Right click call to process feeding */\n\tvoid RightClickFeed(cPlayer & a_Player);\n\nprotected:\n\n\t/** The pathfinder instance handles pathfinding for this monster. */\n\tcPathFinder m_PathFinder;\n\n\t/** Stores if pathfinder is being used - set when final destination is set, and unset when stopped moving to final destination */\n\tbool m_PathfinderActivated;\n\n\t/** Coordinates of the next position that should be reached */\n\tVector3d m_NextWayPointPosition;\n\n\t/** Coordinates for the ultimate, final destination. */\n\tVector3d m_FinalDestination;\n\n\t/** Finds the lowest non-air block position (not the highest, as cWorld::GetHeight does)\n\tIf current Y is nonsolid, goes down to try to find a solid block, then returns that + 1\n\tIf current Y is solid, goes up to find first nonsolid block, and returns that.\n\tIf no suitable position is found, returns cChunkDef::Height. */\n\tint FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ);\n\n\t/** Returns if the ultimate, final destination has been reached. */\n\tbool ReachedFinalDestination(void) { return ((m_FinalDestination - GetPosition()).SqrLength() < WAYPOINT_RADIUS * WAYPOINT_RADIUS); }\n\n\t/** Returns whether or not the target is close enough for attack. */\n\tbool TargetIsInRange(void)\n\t{\n\t\tASSERT(GetTarget() != nullptr);\n\t\treturn ((GetTarget()->GetPosition() - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange));\n\t}\n\n\t/** Returns whether the monster needs to jump to reach a given height. */\n\tinline bool DoesPosYRequireJump(double a_PosY)\n\t{\n\t\treturn (a_PosY > GetPosY() + 0.8);  // Assume that differences up to 0.8 blocks can be walked instead of jumped\n\t}\n\n\t/** Move in a straight line to the next waypoint in the path, will jump if needed. */\n\tvoid MoveToWayPoint(cChunk & a_Chunk);\n\n\t/** Stops pathfinding. Calls ResetPathFinding and sets m_IsFollowingPath to false */\n\tvoid StopMovingToPosition();\n\n\t/** Sets the body yaw and head yaw */\n\tvoid SetPitchAndYawFromDestination(bool a_IsFollowingPath);\n\n\tint m_JumpCoolDown;\n\n\tstd::chrono::milliseconds m_IdleInterval;\n\tstd::chrono::milliseconds m_DestroyTimer;\n\n\teMonsterType m_MobType;\n\tAString m_CustomName;\n\tbool m_CustomNameAlwaysVisible;\n\n\tAString m_SoundHurt;\n\tAString m_SoundDeath;\n\tAString m_SoundAmbient;\n\n\tdouble m_AttackRate;\n\tint m_AttackDamage;\n\tdouble m_AttackRange;\n\tint m_AttackCoolDownTicksLeft;\n\tint m_SightDistance;\n\tstd::chrono::milliseconds m_LoseSightAbandonTargetTimer;\n\n\tfloat m_DropChanceWeapon;\n\tfloat m_DropChanceHelmet;\n\tfloat m_DropChanceChestplate;\n\tfloat m_DropChanceLeggings;\n\tfloat m_DropChanceBoots;\n\tbool m_CanPickUpLoot;\n\tint m_TicksSinceLastDamaged;  // How many ticks ago we were last damaged by a player?\n\n\tvoid HandleDaylightBurning(cChunk & a_Chunk, bool WouldBurn);\n\tbool WouldBurnAt(Vector3d a_Location, cChunk & a_Chunk);\n\tbool m_BurnsInDaylight;\n\tdouble m_RelativeWalkSpeed;\n\tdouble m_BaseWalkSpeed;\n\tdouble m_BaseRunSpeed;\n\n\tint m_AmbientSoundTimer;\n\n\tint m_Age;\n\tint m_AgingTimer;\n\n\tbool m_WasLastTargetAPlayer;\n\n\t/** Entity leashed to */\n\tcEntity * m_LeashedTo;\n\n\t/** Entity pos where this mob was leashed to. Used when deserializing the chunk in order to make the mob find the leash knot. */\n\tstd::unique_ptr<Vector3d> m_LeashToPos;\n\n\t/** Mob has ben leashed or unleashed in current player action. Avoids double actions on horses. */\n\tbool m_IsLeashActionJustDone;\n\n\t/** Determines whether a monster can be leashed */\n\tbool m_CanBeLeashed;\n\n\t/** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops */\n\tvoid AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0);\n\n\t/** Adds a item a_Item with the chance of a_Chance (in percent) to itemdrops a_Drops */\n\tvoid AddRandomUncommonDropItem(cItems & a_Drops, float a_Chance, short a_Item, short a_ItemHealth = 0);\n\n\t/** Adds one rare item out of the list of rare items a_Items modified by the looting level a_LootingLevel(I-III or custom) to the itemdrop a_Drops */\n\tvoid AddRandomRareDropItem(cItems & a_Drops, cItems & a_Items, unsigned int a_LootingLevel);\n\n\t/** Adds armor that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */\n\tvoid AddRandomArmorDropItem(cItems & a_Drops, unsigned int a_LootingLevel);\n\n\t/** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */\n\tvoid AddRandomWeaponDropItem(cItems & a_Drops, unsigned int a_LootingLevel);\n\n\t/* The breeding processing */\n\n\t/** The monster's breeding partner. */\n\tcMonster * m_LovePartner;\n\n\t/** Remembers the player is was last fed by for statistics tracking */\n\tcUUID m_Feeder;\n\n\t/** If above 0, the monster is in love mode, and will breed if a nearby monster is also in love mode. Decrements by 1 per tick till reaching zero. */\n\tint m_LoveTimer;\n\n\t/** If above 0, the monster is in cooldown mode and will refuse to breed. Decrements by 1 per tick till reaching zero. */\n\tint m_LoveCooldown;\n\n\t/** The monster is engaged in mating, once this reaches zero, a baby will be born. Decrements by 1 per tick till reaching zero, then a baby is made and ResetLoveMode() is called. */\n\tint m_MatingTimer;\n\nprivate:\n\t/** A pointer to the entity this mobile is aiming to reach.\n\tThe validity of this pointer SHALL be guaranteed by the pointee;\n\tit MUST be reset when the pointee changes worlds or is destroyed. */\n\tcPawn * m_Target;\n\n\t/** Leash calculations inside Tick function */\n\tvoid CalcLeashActions(std::chrono::milliseconds a_Dt);\n\n} ;  // tolua_export\n"
  },
  {
    "path": "src/Mobs/MonsterTypes.h",
    "content": "\n#pragma once\n\n\n\n\n\n// tolua_begin\n/** Identifies individual monster type. */\nenum eMonsterType\n{\n\tmtInvalidType = -1,\n\n\tmtBat,\n\tmtBlaze,\n\tmtCat,                          // Added in 1.14\n\tmtCaveSpider,\n\tmtChicken,\n\tmtCod,                          // Added in 1.13\n\tmtCow,\n\tmtCreeper,\n\tmtDolphin,                      // Added in 1.13\n\tmtDonkey,                       // Added in 1.6\n\tmtDrowned,                      // Added in 1.13\n\tmtElderGuardian,                // Added in 1.13\n\tmtEnderDragon,\n\tmtEnderman,\n\tmtEndermite,                    // Added in 1.8\n\tmtEvoker,                       // Added in 1.11\n\tmtFox,                          // Added in 1.14\n\tmtGhast,\n\tmtGiant,\n\tmtGuardian,\n\tmtHorse,\n\tmtHoglin,                       // Added in 1.16\n\tmtHusk,                         // Added in 1.10\n\tmtIllusioner,                   // Added in 1.12\n\tmtIronGolem,\n\tmtLlama,                        // Added in 1.11\n\tmtMagmaCube,\n\tmtMooshroom,\n\tmtMule,                         // Added in 1.6\n\tmtOcelot,\n\tmtPanda,                        // Added in 1.14\n\tmtParrot,                       // Added in 1.12\n\tmtPhantom,                      // Added in 1.13\n\tmtPig,\n\tmtPiglin,                       // Added in 1.16\n\tmtPiglinBrute,                  // Added in 1.16\n\tmtPillager,                     // Added in 1.14\n\tmtPolarBear,                    // Added in 1.10\n\tmtPufferfish,                   // Added in 1.13\n\tmtRabbit,\n\tmtRavager,                      // Added in 1.14\n\tmtSalmon,                       // Added in 1.13\n\tmtSheep,\n\tmtShulker,                      // Added in 1.9\n\tmtSilverfish,\n\tmtSkeleton,\n\tmtSkeletonHorse,\n\tmtSlime,\n\tmtSnowGolem,\n\tmtSpider,\n\tmtSquid,\n\tmtStray,                        // Added in 1.10\n\tmtStrider,                      // Added in 1.16\n\tmtTraderLlama,                  // Added in 1.11\n\tmtTropicalFish,                 // Added in 1.13\n\tmtTurtle,                       // Added in 1.13\n\tmtVex,                          // Added in 1.11\n\tmtVillager,\n\tmtVindicator,                   // Added in 1.11\n\tmtWanderingTrader,              // Added in 1.14\n\tmtWitch,\n\tmtWither,\n\tmtWitherSkeleton,\n\tmtWolf,\n\tmtZoglin,                       // Added in 1.16\n\tmtZombie,\n\tmtZombieHorse,                  // Added in 1.6\n\tmtZombifiedPiglin,\n\tmtZombieVillager,\n\n\t// Synonyms:\n\tmtZombiePigman = mtZombifiedPiglin,\n} ;\n\n// tolua_end\n"
  },
  {
    "path": "src/Mobs/Mooshroom.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Mooshroom.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\ncMooshroom::cMooshroom(void) :\n\tSuper(\"Mooshroom\", mtMooshroom, \"entity.cow.hurt\", \"entity.cow.death\", \"entity.cow.ambient\", 0.9f, 1.4f)\n{\n}\n\n\n\n\n\nvoid cMooshroom::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif (IsBaby())\n\t{\n\t\treturn;  // Babies don't drop items\n\t}\n\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_LEATHER);\n\tAddRandomDropItem(a_Drops, 1, 3 + LootingLevel, IsOnFire() ? E_ITEM_STEAK : E_ITEM_RAW_BEEF);\n}\n\n\n\n\n\nvoid cMooshroom::OnRightClicked(cPlayer & a_Player)\n{\n\tswitch (a_Player.GetEquippedItem().m_ItemType)\n\t{\n\t\tcase E_ITEM_BUCKET:\n\t\t{\n\t\t\t// Milk the cow.\n\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t{\n\t\t\t\ta_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_MILK));\n\t\t\t}\n\t\t} break;\n\t\tcase E_ITEM_BOWL:\n\t\t{\n\t\t\t// Soup the cow.\n\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t{\n\t\t\t\ta_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_MUSHROOM_SOUP));\n\t\t\t}\n\t\t} break;\n\t\tcase E_ITEM_SHEARS:\n\t\t{\n\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t{\n\t\t\t\ta_Player.UseEquippedItem();\n\t\t\t}\n\n\t\t\tcItems Drops;\n\t\t\tDrops.emplace_back(E_BLOCK_RED_MUSHROOM, static_cast<char>(5), static_cast<char>(0));\n\t\t\tm_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ(), 10);\n\t\t\tm_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtCow, false);\n\t\t\tDestroy();\n\t\t} break;\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Mooshroom.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n\n\n\n\n\nclass cMooshroom:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tcMooshroom();\n\n\tCLASS_PROTODEF(cMooshroom)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\n\tvirtual void GetFollowedItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_WHEAT);\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Ocelot.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Ocelot.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../Items/ItemHandler.h\"\n#include \"../BoundingBox.h\"\n\n\n\n\n\n// TODO: Ocelots should have a chance of spawning with two kittens\n/*\n\tif (!IsBaby() && GetRandomProvider().RandBool(1.0 / 7.0))\n\t{\n\t\tm_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), m_MobType, true);\n\t\tm_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), m_MobType, true);\n\t}\n*/\n\ncOcelot::cOcelot(void) :\n\tSuper(\"Ocelot\", mtOcelot, \"entity.cat.hurt\", \"entity.cat.death\", \"entity.cat.ambient\", 0.6f, 0.7f),\n\tm_IsSitting(false),\n\tm_IsTame(false),\n\tm_IsBegging(false),\n\tm_CatType(ctWildOcelot),\n\tm_CheckPlayerTickCount(),\n\tm_OwnerName()\n{\n}\n\n\n\n\n\nvoid cOcelot::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (!IsTame() && !IsBaby())\n\t{\n\t\tif (m_CheckPlayerTickCount == 23)\n\t\t{\n\t\t\tm_World->DoWithNearestPlayer(GetPosition(), 10, [&](cPlayer & a_Player) -> bool\n\t\t\t{\n\t\t\t\tcItems Items;\n\t\t\t\tGetBreedingItems(Items);\n\t\t\t\tif (Items.ContainsType(a_Player.GetEquippedItem().m_ItemType))\n\t\t\t\t{\n\t\t\t\t\tif (!IsBegging())\n\t\t\t\t\t{\n\t\t\t\t\t\tSetIsBegging(true);\n\t\t\t\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t\t\t\t}\n\n\t\t\t\t\tMoveToPosition(a_Player.GetPosition());\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (IsBegging())\n\t\t\t\t\t{\n\t\t\t\t\t\tSetIsBegging(false);\n\t\t\t\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}, true);\n\t\t\tm_CheckPlayerTickCount = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_CheckPlayerTickCount++;\n\t\t}\n\t}\n\n\tif (IsTame() && !IsSitting())\n\t{\n\t\tTickFollowPlayer();\n\t}\n\telse if (IsSitting())\n\t{\n\t\tStopMovingToPosition();\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cOcelot::TickFollowPlayer()\n{\n\tVector3d OwnerPos;\n\tbool OwnerFlying = false;\n\tauto Callback = [&](cPlayer & a_Player)\n\t{\n\t\tOwnerPos = a_Player.GetPosition();\n\t\tOwnerFlying = a_Player.IsFlying();\n\t\treturn true;\n\t};\n\n\tif (m_World->DoWithPlayerByUUID(m_OwnerUUID, Callback))\n\t{\n\t\t// The player is present in the world, follow him:\n\t\tdouble Distance = (OwnerPos - GetPosition()).Length();\n\t\tif (Distance > 12)\n\t\t{\n\t\t\tif (!OwnerFlying)\n\t\t\t{\n\t\t\t\tOwnerPos.y = FindFirstNonAirBlockPosition(OwnerPos.x, OwnerPos.z);\n\t\t\t\tTeleportToCoords(OwnerPos.x, OwnerPos.y, OwnerPos.z);\n\t\t\t}\n\t\t}\n\t\tif (Distance < 2)\n\t\t{\n\t\t\tStopMovingToPosition();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!OwnerFlying)\n\t\t\t{\n\t\t\t\tMoveToPosition(OwnerPos);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cOcelot::OnRightClicked(cPlayer & a_Player)\n{\n\tif (!IsTame())\n\t{\n\t\tif (\n\t\t\tIsBegging() &&\n\t\t\t((a_Player.GetPosition() - GetPosition()).Length() <= 3)\n\t\t)\n\t\t{\n\t\t\tcItems Items;\n\t\t\tGetBreedingItems(Items);\n\t\t\tif (Items.ContainsType(a_Player.GetEquippedItem().m_ItemType))\n\t\t\t{\n\t\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t\t{\n\t\t\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t\t\t}\n\n\t\t\t\tauto & Random = GetRandomProvider();\n\n\t\t\t\tif (Random.RandBool(1.0 / 3.0))\n\t\t\t\t{\n\t\t\t\t\t// Taming succeeded\n\t\t\t\t\tSetIsBegging(false);\n\n\t\t\t\t\tSetMaxHealth(20);\n\t\t\t\t\tSetIsTame(true);\n\t\t\t\t\tSetOwner(a_Player.GetName(), a_Player.GetUUID());\n\t\t\t\t\tSetCatType(static_cast<eCatType>(Random.RandInt<int>(1, 3)));\n\t\t\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::OcelotTrusts);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Taming failed\n\t\t\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::OcelotDistrusts);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSuper::OnRightClicked(a_Player);\n\t\t}\n\t}\n\telse if (a_Player.GetUUID() == m_OwnerUUID)\n\t{\n\t\tSuper::OnRightClicked(a_Player);\n\t\tSetIsSitting(!IsSitting());\n\t}\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nbool cOcelot::IsCatSittingOnBlock(cWorld * a_World, Vector3d a_BlockPosition)\n{\n\treturn a_World->ForEachEntityInBox(\n\t\tcBoundingBox(Vector3d(a_BlockPosition.x, a_BlockPosition.y + 1, a_BlockPosition.z), 1),\n\t\t[=](cEntity & a_Entity)\n\t\t{\n\t\t\treturn (\n\t\t\t\t(a_Entity.GetEntityType() == cEntity::etMonster) &&\n\t\t\t\t(static_cast<cMonster &>(a_Entity).GetMobType() == eMonsterType::mtOcelot) &&\n\t\t\t\t(static_cast<cOcelot &>(a_Entity).IsSitting())\n\t\t\t);\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cOcelot::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (a_TDI.DamageType == dtFalling)\n\t{\n\t\treturn false;\n\t}\n\n\treturn Super::DoTakeDamage(a_TDI);\n}\n"
  },
  {
    "path": "src/Mobs/Ocelot.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n#include \"../UUID.h\"\n\n\n\n\n\nclass cOcelot:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tenum eCatType\n\t{\n\t\tctWildOcelot,\n\t\tctTuxedo,\n\t\tctTabby,\n\t\tctSiamese,\n\t} ;\n\n\tcOcelot(void);\n\n\tCLASS_PROTODEF(cOcelot)\n\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void TickFollowPlayer();\n\tvirtual void GetBreedingItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_RAW_FISH);\n\t}\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\n\t// Get functions\n\tbool     IsSitting     (void) const override { return m_IsSitting; }\n\tbool     IsTame        (void) const override { return m_IsTame; }\n\tbool     IsBegging     (void) const { return m_IsBegging; }\n\tAString  GetOwnerName  (void) const { return m_OwnerName; }\n\tcUUID    GetOwnerUUID  (void) const { return m_OwnerUUID; }\n\teCatType GetOcelotType (void) const { return m_CatType; }\n\n\t// Set functions\n\tvoid SetIsSitting  (bool a_IsSitting)   { m_IsSitting = a_IsSitting; }\n\tvoid SetIsTame     (bool a_IsTame)      { m_IsTame = a_IsTame; }\n\tvoid SetIsBegging  (bool a_IsBegging)   { m_IsBegging = a_IsBegging; }\n\tvoid SetOwner      (const AString & a_NewOwnerName, const cUUID & a_NewOwnerUUID)\n\t{\n\t\tm_OwnerName = a_NewOwnerName;\n\t\tm_OwnerUUID = a_NewOwnerUUID;\n\t}\n\tvoid SetCatType (eCatType a_CatType)    { m_CatType = a_CatType; }\n\n\t/** Returns true if there's a cat sitting above the given position */\n\tstatic bool IsCatSittingOnBlock(cWorld * a_World, Vector3d a_BlockPosition);\n\nprotected:\n\n\tbool      m_IsSitting;\n\tbool      m_IsTame;\n\tbool      m_IsBegging;\n\teCatType  m_CatType;\n\t/** Only check for a nearby player holding the breeding items every 23 ticks. */\n\tint       m_CheckPlayerTickCount;\n\tAString   m_OwnerName;\n\tcUUID     m_OwnerUUID;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/PassiveAggressiveMonster.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"PassiveAggressiveMonster.h\"\n\n#include \"../Entities/Player.h\"\n\n\n\n\n\ncPassiveAggressiveMonster::cPassiveAggressiveMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, const AString & a_SoundAmbient, float a_Width, float a_Height) :\n\tSuper(a_ConfigName, a_MobType, a_SoundHurt, a_SoundDeath, a_SoundAmbient, a_Width, a_Height)\n{\n\tm_EMPersonality = PASSIVE;\n}\n\n\n\n\n\nbool cPassiveAggressiveMonster::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tif ((GetTarget() != nullptr) && GetTarget()->IsPlayer())\n\t{\n\t\tif (static_cast<cPlayer *>(GetTarget())->CanMobsTarget())\n\t\t{\n\t\t\tm_EMState = CHASING;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cPassiveAggressiveMonster::EventSeePlayer(cPlayer *, cChunk & a_Chunk)\n{\n\t// don't do anything, neutral mobs don't react to just seeing the player\n}\n\n\n"
  },
  {
    "path": "src/Mobs/PassiveAggressiveMonster.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cPassiveAggressiveMonster:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcPassiveAggressiveMonster(\n\t\tconst AString & a_ConfigName,\n\t\teMonsterType a_MobType,\n\t\tconst AString & a_SoundHurt,\n\t\tconst AString & a_SoundDeath,\n\t\tconst AString & a_SoundAmbient,\n\t\tfloat a_Width,\n\t\tfloat a_Height\n\t);\n\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\tvirtual void EventSeePlayer(cPlayer *, cChunk & a_Chunk) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/PassiveMonster.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"PassiveMonster.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../BoundingBox.h\"\n#include \"../Items/ItemSpawnEgg.h\"\n\n\n\n\ncPassiveMonster::cPassiveMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, const AString & a_SoundAmbient, float a_Width, float a_Height) :\n\tSuper(a_ConfigName, a_MobType, a_SoundHurt, a_SoundDeath, a_SoundAmbient, a_Width, a_Height)\n{\n\tm_EMPersonality = PASSIVE;\n}\n\n\n\n\n\nbool cPassiveMonster::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\tif ((a_TDI.Attacker != this) && (a_TDI.Attacker != nullptr))\n\t{\n\t\tm_EMState = ESCAPING;\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cPassiveMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (m_EMState == ESCAPING)\n\t{\n\t\tCheckEventLostPlayer(a_Dt);\n\t}\n\n\tcMonster::LoveTick();\n}\n\n\n\n\n\nvoid cPassiveMonster::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\tSuper::RightClickFeed(a_Player);\n}\n\n\n\n"
  },
  {
    "path": "src/Mobs/PassiveMonster.h",
    "content": "\n#pragma once\n\n#include \"Monster.h\"\n#include \"../UUID.h\"\n\n\n\n\n\nclass cPassiveMonster:\n\tpublic cMonster\n{\n\tusing Super = cMonster;\n\npublic:\n\n\tcPassiveMonster(\n\t\tconst AString & a_ConfigName,\n\t\teMonsterType a_MobType,\n\t\tconst AString & a_SoundHurt,\n\t\tconst AString & a_SoundDeath,\n\t\tconst AString & a_SoundAmbient,\n\t\tfloat a_Width,\n\t\tfloat a_Height\n\t);\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\n\t/** When hit by someone, run away */\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n};\n"
  },
  {
    "path": "src/Mobs/Path.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"Path.h\"\n#include \"BlockType.h\"\n#include \"../BlockInfo.h\"\n#include \"../Chunk.h\"\n\n#define JUMP_G_COST 20\n#define NORMAL_G_COST 10\n#define DIAGONAL_G_COST 14\n\n#define DISTANCE_MANHATTAN 0  // 1: More speed, a bit less accuracy 0: Max accuracy, less speed.\n#define HEURISTICS_ONLY 0  // 1: Much more speed, much less accurate.\n#define CALCULATIONS_PER_STEP 10  // Higher means more CPU load but faster path calculations.\n// The only version which guarantees the shortest path is 0, 0.\n\n\n\n\n\nbool compareHeuristics::operator()(cPathCell * & a_Cell1, cPathCell * & a_Cell2)\n{\n\treturn a_Cell1->m_F > a_Cell2->m_F;\n}\n\n\n\n\n\n/* cPath implementation */\ncPath::cPath(\n\tcChunk & a_Chunk,\n\tconst Vector3d & a_StartingPoint, const Vector3d & a_EndingPoint, int a_MaxSteps,\n\tdouble a_BoundingBoxWidth, double a_BoundingBoxHeight\n) :\n\tm_StepsLeft(a_MaxSteps),\n\tm_IsValid(true),\n\tm_CurrentPoint(0),  // GetNextPoint increments this to 1, but that's fine, since the first cell is always a_StartingPoint\n\tm_Chunk(&a_Chunk),\n\tm_BadChunkFound(false)\n{\n\n\ta_BoundingBoxWidth = 1;  // Treat all mobs width as 1 until physics is improved.\n\n\tm_BoundingBoxWidth = CeilC(a_BoundingBoxWidth);\n\tm_BoundingBoxHeight = CeilC(a_BoundingBoxHeight);\n\tm_HalfWidth = a_BoundingBoxWidth / 2;\n\n\tint HalfWidthInt = FloorC(a_BoundingBoxWidth / 2);\n\tm_Source.x = FloorC(a_StartingPoint.x - HalfWidthInt);\n\tm_Source.y = FloorC(a_StartingPoint.y);\n\tm_Source.z = FloorC(a_StartingPoint.z - HalfWidthInt);\n\n\tm_Destination.x = FloorC(a_EndingPoint.x - HalfWidthInt);\n\tm_Destination.y = FloorC(a_EndingPoint.y);\n\tm_Destination.z = FloorC(a_EndingPoint.z - HalfWidthInt);\n\n\tif (!IsWalkable(m_Source, m_Source))\n\t{\n\t\tm_Status = ePathFinderStatus::PATH_NOT_FOUND;\n\t\treturn;\n\t}\n\n\tm_NearestPointToTarget = GetCell(m_Source);\n\tm_Status = ePathFinderStatus::CALCULATING;\n\n\tProcessCell(GetCell(m_Source), nullptr, 0);\n}\n\n\n\n\n\ncPath::cPath() : m_IsValid(false)\n{\n\n}\n\n\n\n\n\nePathFinderStatus cPath::CalculationStep(cChunk & a_Chunk)\n{\n\tm_Chunk = &a_Chunk;\n\tif (m_Status != ePathFinderStatus::CALCULATING)\n\t{\n\t\treturn m_Status;\n\t}\n\n\tif (m_BadChunkFound)\n\t{\n\t\tFinishCalculation(ePathFinderStatus::PATH_NOT_FOUND);\n\t\treturn m_Status;\n\t}\n\n\tif (m_StepsLeft == 0)\n\t{\n\t\tAttemptToFindAlternative();\n\t}\n\telse\n\t{\n\t\t--m_StepsLeft;\n\t\tint i;\n\t\tfor (i = 0; i < CALCULATIONS_PER_STEP; ++i)\n\t\t{\n\t\t\tif (StepOnce())  // StepOnce returns true when no more calculation is needed.\n\t\t\t{\n\t\t\t\tbreak;  // if we're here, m_Status must have changed either to PATH_FOUND or PATH_NOT_FOUND.\n\t\t\t}\n\t\t}\n\n\t\tm_Chunk = nullptr;\n\t}\n\treturn m_Status;\n}\n\n\n\n\n\nVector3i cPath::AcceptNearbyPath()\n{\n\tASSERT(m_Status == ePathFinderStatus::NEARBY_FOUND);\n\tm_Status = ePathFinderStatus::PATH_FOUND;\n\treturn m_Destination;\n}\n\n\n\n\n\nbool cPath::StepOnce()\n{\n\tcPathCell * CurrentCell = OpenListPop();\n\n\t// Path not reachable.\n\tif (CurrentCell == nullptr)\n\t{\n\t\tAttemptToFindAlternative();\n\t\treturn true;\n\t}\n\n\t// Path found.\n\tif (CurrentCell->m_Location == m_Destination)\n\t{\n\t\tBuildPath();\n\t\tFinishCalculation(ePathFinderStatus::PATH_FOUND);\n\t\treturn true;\n\t}\n\n\t// Calculation not finished yet\n\t// Check if we have a new NearestPoint.\n\tif ((m_Destination - CurrentCell->m_Location).Length() < 5)\n\t{\n\t\tif (GetRandomProvider().RandBool(0.25))\n\t\t{\n\t\t\tm_NearestPointToTarget = CurrentCell;\n\t\t}\n\t}\n\telse if (CurrentCell->m_H < m_NearestPointToTarget->m_H)\n\t{\n\t\tm_NearestPointToTarget = CurrentCell;\n\t}\n\t// process a currentCell by inspecting all neighbors.\n\n\n\t// Now we start checking adjacent cells.\n\n\n\t// If true, no need to do more checks in that direction\n\tbool DoneEast = false,\n\tDoneWest = false,\n\tDoneNorth = false,\n\tDoneSouth = false;\n\n\t// If true, we can walk in that direction without changing height\n\t// This is used for deciding if to calculate diagonals\n\tbool WalkableEast = false,\n\tWalkableWest = false,\n\tWalkableNorth = false,\n\tWalkableSouth = false;\n\n\t// If we can jump without hitting the ceiling\n\tif (BodyFitsIn(CurrentCell->m_Location + Vector3i(0, 1, 0), CurrentCell->m_Location))\n\t{\n\t\t// For ladder climbing\n\t\tProcessIfWalkable(CurrentCell->m_Location + Vector3i(0, 1, 0), CurrentCell, JUMP_G_COST);\n\n\t\t// Check east-up\n\t\tif (ProcessIfWalkable(CurrentCell->m_Location + Vector3i(1, 1, 0), CurrentCell, JUMP_G_COST))\n\t\t{\n\t\t\tDoneEast = true;\n\t\t}\n\n\t\t// Check west-up\n\t\tif (ProcessIfWalkable(CurrentCell->m_Location + Vector3i(-1, 1, 0), CurrentCell, JUMP_G_COST))\n\t\t{\n\t\t\tDoneWest = true;\n\t\t}\n\n\t\t// Check north-up\n\t\tif (ProcessIfWalkable(CurrentCell->m_Location + Vector3i(0, 1, -1), CurrentCell, JUMP_G_COST))\n\t\t{\n\t\t\tDoneNorth = true;\n\t\t}\n\n\t\t// Check south-up\n\t\tif (ProcessIfWalkable(CurrentCell->m_Location + Vector3i(0, 1, 1), CurrentCell, JUMP_G_COST))\n\t\t{\n\t\t\tDoneSouth = true;\n\t\t}\n\n\t}\n\n\n\t// Check North, South, East, West at our own height or below. We are willing to jump up to 3 blocks down.\n\n\n\tif (!DoneEast)\n\t{\n\t\tfor (int y = 0; y >= -3; --y)\n\t\t{\n\t\t\tif (ProcessIfWalkable(CurrentCell->m_Location + Vector3i(1, y, 0),  CurrentCell, NORMAL_G_COST))\n\t\t\t{\n\t\t\t\tDoneEast = true;\n\t\t\t\tif (y == 0)\n\t\t\t\t{\n\t\t\t\t\tWalkableEast = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!DoneWest)\n\t{\n\t\tfor (int y = 0; y >= -3; --y)\n\t\t{\n\t\t\tif (ProcessIfWalkable(CurrentCell->m_Location + Vector3i(-1, y, 0),  CurrentCell, NORMAL_G_COST))\n\t\t\t{\n\t\t\t\tDoneWest = true;\n\t\t\t\tif (y == 0)\n\t\t\t\t{\n\t\t\t\t\tWalkableWest = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!DoneSouth)\n\t{\n\t\tfor (int y = 0; y >= -3; --y)\n\t\t{\n\t\t\tif (ProcessIfWalkable(CurrentCell->m_Location + Vector3i(0, y, 1),  CurrentCell, NORMAL_G_COST))\n\t\t\t{\n\t\t\t\tDoneSouth = true;\n\t\t\t\tif (y == 0)\n\t\t\t\t{\n\t\t\t\t\tWalkableSouth = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!DoneNorth)\n\t{\n\t\tfor (int y = 0; y >= -3; --y)\n\t\t{\n\t\t\tif (ProcessIfWalkable(CurrentCell->m_Location + Vector3i(0, y, -1), CurrentCell, NORMAL_G_COST))\n\t\t\t{\n\t\t\t\tDoneNorth = true;\n\t\t\t\tif (y == 0)\n\t\t\t\t{\n\t\t\t\t\tWalkableNorth = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check diagonals\n\n\tif (WalkableNorth && WalkableEast)\n\t{\n\t\tProcessIfWalkable(CurrentCell->m_Location + Vector3i(1, 0, -1), CurrentCell, DIAGONAL_G_COST);\n\t}\n\tif (WalkableNorth && WalkableWest)\n\t{\n\t\tProcessIfWalkable(CurrentCell->m_Location + Vector3i(-1, 0, -1), CurrentCell, DIAGONAL_G_COST);\n\t}\n\tif (WalkableSouth && WalkableEast)\n\t{\n\t\tProcessIfWalkable(CurrentCell->m_Location + Vector3i(1, 0, 1), CurrentCell, DIAGONAL_G_COST);\n\t}\n\tif (WalkableSouth && WalkableWest)\n\t{\n\t\tProcessIfWalkable(CurrentCell->m_Location + Vector3i(-1, 0, 1), CurrentCell, DIAGONAL_G_COST);\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nvoid cPath::AttemptToFindAlternative()\n{\n\tif (m_NearestPointToTarget == GetCell(m_Source))\n\t{\n\t\tFinishCalculation(ePathFinderStatus::PATH_NOT_FOUND);\n\t}\n\telse\n\t{\n\t\tm_Destination = m_NearestPointToTarget->m_Location;\n\t\tBuildPath();\n\t\tFinishCalculation(ePathFinderStatus::NEARBY_FOUND);\n\t}\n}\n\n\n\n\n\nvoid cPath::BuildPath()\n{\n\tcPathCell * CurrentCell = GetCell(m_Destination);\n\twhile (CurrentCell->m_Parent != nullptr)\n\t{\n\t\t// Waypoints are cylinders that start at some particular x, y, z and have infinite height.\n\t\t// Submerging water waypoints allows swimming mobs to be able to touch them.\n\t\tif (IsBlockWater(GetCell(CurrentCell->m_Location + Vector3i(0, -1, 0))->m_BlockType))\n\t\t{\n\t\t\tCurrentCell->m_Location.y -= 30;\n\t\t}\n\t\tm_PathPoints.push_back(CurrentCell->m_Location);  // Populate the cPath with points. All midpoints are added. Destination is added. Source is excluded.\n\t\tCurrentCell = CurrentCell->m_Parent;\n\t}\n\n}\n\n\n\n\n\nvoid cPath::FinishCalculation()\n{\n\tm_Map.clear();\n\tm_OpenList = std::priority_queue<cPathCell *, std::vector<cPathCell *>, compareHeuristics>{};\n}\n\n\n\n\n\nvoid cPath::FinishCalculation(ePathFinderStatus a_NewStatus)\n{\n\tif (m_BadChunkFound)\n\t{\n\t\ta_NewStatus = ePathFinderStatus::PATH_NOT_FOUND;\n\t}\n\tm_Status = a_NewStatus;\n\tFinishCalculation();\n}\n\n\n\n\n\nvoid cPath::OpenListAdd(cPathCell * a_Cell)\n{\n\ta_Cell->m_Status = eCellStatus::OPENLIST;\n\tm_OpenList.push(a_Cell);\n\t#ifdef COMPILING_PATHFIND_DEBUGGER\n\tsi::setBlock(a_Cell->m_Location.x, a_Cell->m_Location.y, a_Cell->m_Location.z, debug_open, SetMini(a_Cell));\n\t#endif\n}\n\n\n\n\n\ncPathCell * cPath::OpenListPop()  // Popping from the open list also means adding to the closed list.\n{\n\tif (m_OpenList.size() == 0)\n\t{\n\t\treturn nullptr;  // We've exhausted the search space and nothing was found, this will trigger a PATH_NOT_FOUND or NEARBY_FOUND status.\n\t}\n\n\tcPathCell * Ret = m_OpenList.top();\n\tm_OpenList.pop();\n\tRet->m_Status = eCellStatus::CLOSEDLIST;\n\t#ifdef COMPILING_PATHFIND_DEBUGGER\n\tsi::setBlock((Ret)->m_Location.x, (Ret)->m_Location.y, (Ret)->m_Location.z, debug_closed, SetMini(Ret));\n\t#endif\n\treturn Ret;\n}\n\n\n\n\n\nbool cPath::ProcessIfWalkable(const Vector3i & a_Location, cPathCell * a_Parent, int a_Cost)\n{\n\tif (IsWalkable(a_Location, a_Parent->m_Location))\n\t{\n\t\tProcessCell(GetCell(a_Location), a_Parent, a_Cost);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cPath::ProcessCell(cPathCell * a_Cell, cPathCell * a_Caller, int a_GDelta)\n{\n\t// Case 1: Cell is in the closed list, ignore it.\n\tif (a_Cell->m_Status == eCellStatus::CLOSEDLIST)\n\t{\n\t\treturn;\n\t}\n\tif (a_Cell->m_Status == eCellStatus::NOLIST)  // Case 2: The cell is not in any list.\n\t{\n\t\t// Cell is walkable, add it to the open list.\n\t\t// Note that non-walkable cells are filtered out in Step_internal();\n\t\t// Special case: Start cell goes here, gDelta is 0, caller is NULL.\n\t\ta_Cell->m_Parent = a_Caller;\n\t\tif (a_Caller != nullptr)\n\t\t{\n\t\t\ta_Cell->m_G = a_Caller->m_G + a_GDelta;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Cell->m_G = 0;\n\t\t}\n\n\t\t// Calculate H. This is A*'s Heuristics value.\n\t\t#if DISTANCE_MANHATTAN == 1\n\t\t\t// Manhattan distance. DeltaX + DeltaY + DeltaZ.\n\t\t\ta_Cell->m_H = 10 * (abs(a_Cell->m_Location.x-m_Destination.x) + abs(a_Cell->m_Location.y-m_Destination.y) + abs(a_Cell->m_Location.z-m_Destination.z));\n\t\t#else\n\t\t\t// Euclidian distance. sqrt(DeltaX^2 + DeltaY^2 + DeltaZ^2), more precise.\n\t\t\ta_Cell->m_H = static_cast<decltype(a_Cell->m_H)>((a_Cell->m_Location - m_Destination).Length() * 10);\n\t\t#endif\n\n\t\t#if HEURISTICS_ONLY == 1\n\t\t\ta_Cell->m_F = a_Cell->m_H;  // Greedy search. https://en.wikipedia.org/wiki/Greedy_search\n\t\t#else\n\t\t\ta_Cell->m_F = a_Cell->m_H + a_Cell->m_G;  // Regular A*.\n\t\t#endif\n\n\t\tOpenListAdd(a_Cell);\n\t\treturn;\n\t}\n\n\t// Case 3: Cell is in the open list, check if G and H need an update.\n\tint NewG = a_Caller->m_G + a_GDelta;\n\tif (NewG < a_Cell->m_G)\n\t{\n\t\ta_Cell->m_G = NewG;\n\t\ta_Cell->m_H = a_Cell->m_F + a_Cell->m_G;\n\t\ta_Cell->m_Parent = a_Caller;\n\t}\n\n}\n\n\n\n\n\nvoid cPath::FillCellAttributes(cPathCell & a_Cell)\n{\n\tconst Vector3i & Location = a_Cell.m_Location;\n\n\tASSERT(m_Chunk != nullptr);\n\n\tif (!cChunkDef::IsValidHeight(Location))\n\t{\n\t\t// Players can't build outside the game height, so it must be air\n\t\ta_Cell.m_IsSolid = false;\n\t\ta_Cell.m_IsSpecial = false;\n\t\ta_Cell.m_BlockType = E_BLOCK_AIR;\n\t\treturn;\n\t}\n\tauto Chunk = m_Chunk->GetNeighborChunk(Location.x, Location.z);\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\tm_BadChunkFound = true;\n\t\ta_Cell.m_IsSolid = true;\n\t\ta_Cell.m_IsSpecial = false;\n\t\ta_Cell.m_BlockType = E_BLOCK_AIR;  // m_BlockType is never used when m_IsSpecial is false, but it may be used if we implement dijkstra\n\t\treturn;\n\t}\n\tm_Chunk = Chunk;\n\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\tint RelX = Location.x - m_Chunk->GetPosX() * cChunkDef::Width;\n\tint RelZ = Location.z - m_Chunk->GetPosZ() * cChunkDef::Width;\n\n\tm_Chunk->GetBlockTypeMeta(RelX, Location.y, RelZ, BlockType, BlockMeta);\n\ta_Cell.m_BlockType = BlockType;\n\ta_Cell.m_BlockMeta = BlockMeta;\n\n\n\tif (BlockTypeIsSpecial(BlockType))\n\t{\n\t\ta_Cell.m_IsSpecial = true;\n\t\ta_Cell.m_IsSolid = true;  // Specials are solids only from a certain direction. But their m_IsSolid is always true\n\t}\n\telse if ((!cBlockInfo::IsSolid(a_Cell.m_BlockType)) && IsBlockFence(GetCell(Location + Vector3i(0, -1, 0))->m_BlockType))\n\t{\n\t\t// Nonsolid blocks with fences below them are consider Special Solids. That is, they sometimes behave as solids.\n\t\ta_Cell.m_IsSpecial = true;\n\t\ta_Cell.m_IsSolid = true;\n\t}\n\telse\n\t{\n\n\t\ta_Cell.m_IsSpecial = false;\n\t\ta_Cell.m_IsSolid = cBlockInfo::IsSolid(BlockType);\n\t}\n\n}\n\n\n\n\n\ncPathCell * cPath::GetCell(const Vector3i & a_Location)\n{\n\t// Create the cell in the hash table if it's not already there.\n\tif (m_Map.count(a_Location) == 0)  // Case 1: Cell is not on any list. We've never checked this cell before.\n\t{\n\t\tm_Map[a_Location].m_Location = a_Location;\n\t\tFillCellAttributes(m_Map[a_Location]);\n\t\tm_Map[a_Location].m_Status = eCellStatus::NOLIST;\n\t\t#ifdef COMPILING_PATHFIND_DEBUGGER\n\t\t\t#ifdef COMPILING_PATHFIND_DEBUGGER_MARK_UNCHECKED\n\t\t\t\tsi::setBlock(a_Location.x, a_Location.y, a_Location.z, debug_unchecked, Cell->m_IsSolid ? NORMAL : MINI);\n\t\t\t#endif\n\t\t#endif\n\t\treturn &m_Map[a_Location];\n\t}\n\telse\n\t{\n\t\treturn &m_Map[a_Location];\n\t}\n}\n\n\n\n\n\nbool cPath::IsWalkable(const Vector3i & a_Location, const Vector3i & a_Source)\n{\n\treturn (HasSolidBelow(a_Location) && BodyFitsIn(a_Location, a_Source));\n}\n\n\n\n\n// We need the source because some special blocks are solid only from a certain direction e.g. doors\nbool cPath::BodyFitsIn(const Vector3i & a_Location, const Vector3i & a_Source)\n{\n\tint x, y, z;\n\tfor (y = 0; y < m_BoundingBoxHeight; ++y)\n\t{\n\t\tfor (x = 0; x < m_BoundingBoxWidth; ++x)\n\t\t{\n\t\t\tfor (z = 0; z < m_BoundingBoxWidth; ++z)\n\t\t\t{\n\t\t\t\tcPathCell * CurrentCell = GetCell(a_Location + Vector3i(x, y, z));\n\t\t\t\tif (CurrentCell->m_IsSolid)\n\t\t\t\t{\n\t\t\t\t\tif (CurrentCell->m_IsSpecial)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (SpecialIsSolidFromThisDirection(CurrentCell->m_BlockType, CurrentCell->m_BlockMeta, a_Location - a_Source))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cPath::BlockTypeIsSpecial(BLOCKTYPE a_Type)\n{\n\tif (IsBlockFence(a_Type))\n\t{\n\t\treturn true;\n\t}\n\n\tswitch (a_Type)\n\t{\n\t\tcase E_BLOCK_OAK_DOOR:\n\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\tcase E_BLOCK_TRAPDOOR:\n\t\tcase E_BLOCK_WATER:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cPath::SpecialIsSolidFromThisDirection(BLOCKTYPE a_Type, NIBBLETYPE a_Meta,  const Vector3i & a_Direction)\n{\n\tif (a_Direction == Vector3i(0, 0, 0))\n\t{\n\t\treturn false;\n\t}\n\n\n\t// If there is a nonsolid above a fence\n\tif (!cBlockInfo::IsSolid(a_Type))\n\t{\n\t\t// Only treat as solid when we're coming from below\n\t\treturn (a_Direction.y > 0);\n\t}\n\n\t/* switch (a_Type)\n\t{\n\t\tcase E_BLOCK_ETC:\n\t\t{\n\t\t\tDecide if solid from this direction and return either true or false.\n\t\t}\n\n\t\t// TODO Fill this with the other specials after physics is fixed\n\t} */\n\n\n\n\treturn true;\n}\n\n\n\n\n\nbool cPath::HasSolidBelow(const Vector3i & a_Location)\n{\n\tint x, z;\n\tfor (x = 0; x < m_BoundingBoxWidth; ++x)\n\t{\n\t\tfor (z = 0; z < m_BoundingBoxWidth; ++z)\n\t\t{\n\t\t\tif (GetCell(a_Location + Vector3i(x, -1, z))->m_IsSolid)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n"
  },
  {
    "path": "src/Mobs/Path.h",
    "content": "\n#pragma once\n\n#include \"ChunkDef.h\"\n\n/*\n// Needed Fwds: cPath\nenum class ePathFinderStatus;\nclass cPath;\n*/\n\n\n#include \"../FastRandom.h\"\n#ifdef COMPILING_PATHFIND_DEBUGGER\n\t/* Note: the COMPILING_PATHFIND_DEBUGGER flag is used by Native / WiseOldMan95 to debug\n\tthis class outside of Cuberite. This preprocessor flag is never set when compiling Cuberite. */\n\t#include \"PathFinderIrrlicht_Head.h\"\n#endif\n\n\n//fwd: ../Chunk.h\nclass cChunk;\n\n\n/* Various little structs and classes */\nenum class ePathFinderStatus {CALCULATING,  PATH_FOUND,  PATH_NOT_FOUND, NEARBY_FOUND};\nenum class eCellStatus {OPENLIST,  CLOSEDLIST,  NOLIST};\n/** The pathfinder has 3 types of cells (cPathCell).\n1 - empty. m_IsSolid is false, m_IsSpecial is false.  Air cells are always traversable by A*.\n2 - occupied / solid. m_IsSolid is true, m_IsSpecial is false.  Air cells are never traversable by A*.\n3 - Special. m_IsSolid is true, m_IsSpecial is true. These cells are special: They may either behave as empty\nor as occupied / solid, depending on the mob's direction of movement. For instance, an airblock above a fence is a special cell,\nbecause when mobs attempt to travel to it by jumping, it acts as a solid. But when mobs fall and land on top of a fence,\nit acts as air. Special cells include: Doors, ladders, trapdoors, water, gates.\n\nThe main function which handles special blocks is SpecialIsSolidFromThisDirection.\nThis function receives a BlockType, a meta, and a direction of travel,\nthen it uses those 3 parameters to decide whether the special block should behave as a solid or as air in this\nparticular direction of travel.\n\nCurrently, only fences and water are handled properly. The function always returns \"true\" (meaning: treat as occuiped/solid) for\nthe rest of the blocks. This will be fixed once the physics engine issues are fixed. */\nstruct cPathCell\n{\n\tVector3i m_Location;   // Location of the cell in the world.\n\tint m_F, m_G, m_H;  // F, G, H as defined in regular A*.\n\teCellStatus m_Status;  // Which list is the cell in? Either non, open, or closed.\n\tcPathCell * m_Parent;  // Cell's parent, as defined in regular A*.\n\tbool m_IsSolid;\t   // Is the cell an air or a solid? Partial solids are considered solids. If m_IsSpecial is true, this is always true.\n\tbool m_IsSpecial;  // The cell is special - it acts as \"solid\" or \"air\" depending on direction, e.g. door or top of fence.\n\tBLOCKTYPE m_BlockType;\n\tNIBBLETYPE m_BlockMeta;\n};\n\n\n\n\nclass compareHeuristics\n{\npublic:\n\tbool operator()(cPathCell * & a_V1,  cPathCell * &  a_V2);\n};\n\n\n\n\n\nclass cPath\n{\npublic:\n\t/** Creates a pathfinder instance.\n\tAfter calling this, you are expected to call CalculationStep() once per tick or once per several ticks\n\tuntil it returns something other than CALCULATING.\n\n\t@param a_StartingPoint The function expects this position to be the lowest block the mob is in, a rule of thumb: \"The block where the Zombie's knees are at\".\n\t@param a_EndingPoint \"The block where the Zombie's knees want to be\".\n\t@param a_MaxSteps The maximum steps before giving up.\n\t@param a_BoundingBoxWidth the character's boundingbox width in blocks. Currently the parameter is ignored and 1 is assumed.\n\t@param a_BoundingBoxHeight the character's boundingbox width in blocks. Currently the parameter is ignored and 2 is assumed. */\n\tcPath(\n\t\tcChunk & a_Chunk,\n\t\tconst Vector3d & a_StartingPoint, const Vector3d & a_EndingPoint, int a_MaxSteps,\n\t\tdouble a_BoundingBoxWidth, double a_BoundingBoxHeight\n\t);\n\n\t/** Creates an invalid path which is not usable. You shouldn't call any method other than isValid on such a path. */\n\tcPath();\n\n\t/** delete default constructors */\n\tcPath(const cPath & a_other) = delete;\n\tcPath(cPath && a_other) = delete;\n\n\tcPath & operator=(const cPath & a_other) = delete;\n\tcPath & operator=(cPath && a_other) = delete;\n\n\t/** Performs part of the path calculation and returns the appropriate status.\n\tIf PATH_FOUND is returned, the path was found, and you can call query the instance for waypoints via GetNextWayPoint, etc.\n\tIf NEARBY_FOUND is returned, it means that the destination is not reachable, but a nearby destination\n\tis reachable. If the user likes the alternative destination, they can call AcceptNearbyPath to treat the path as found,\n\tand to make consequent calls to step return PATH_FOUND\n\tIf PATH_NOT_FOUND is returned, then no path was found. */\n\tePathFinderStatus CalculationStep(cChunk & a_Chunk);\n\n\t/** Called after the PathFinder's step returns NEARBY_FOUND.\n\tChanges the PathFinder status from NEARBY_FOUND to PATH_FOUND, returns the nearby destination that\n\tthe PathFinder found a path to. */\n\tVector3i AcceptNearbyPath();\n\n\t// Point retrieval functions, inlined for performance:\n\n\t/** Returns the next point in the path. */\n\tinline Vector3d GetNextPoint()\n\t{\n\t\tASSERT(m_Status == ePathFinderStatus::PATH_FOUND);\n\t\tASSERT(m_CurrentPoint < m_PathPoints.size());\n\t\tVector3i Point = m_PathPoints[m_PathPoints.size() - 1 - m_CurrentPoint];\n\t\t++m_CurrentPoint;\n\t\treturn Vector3d(Point.x + m_HalfWidth, Point.y, Point.z + m_HalfWidth);\n\t}\n\n\n\t/** Checks if we have no more waypoints to return. Never call getnextPoint when this is true. */\n\tinline bool NoMoreWayPoints() const\n\t{\n\t\tASSERT(m_Status == ePathFinderStatus::PATH_FOUND);\n\t\treturn (m_CurrentPoint == m_PathPoints.size());\n\t}\n\n\t/** Returns true if GetNextPoint() was never called for this Path. */\n\tinline bool IsFirstPoint() const\n\t{\n\t\tASSERT(m_Status == ePathFinderStatus::PATH_FOUND);\n\t\treturn (m_CurrentPoint == 0);\n\t}\n\n\t/** Returns true if this path is properly initialized.\n\tReturns false if this path was initialized with an empty constructor.\n\tIf false, the path is unusable and you should not call any methods. */\n\tinline bool IsValid() const\n\t{\n\t\treturn m_IsValid;\n\t}\n\n\t/** The amount of waypoints left to return. */\n\tinline size_t WayPointsLeft() const\n\t{\n\t\tASSERT(m_Status == ePathFinderStatus::PATH_FOUND);\n\t\treturn m_PathPoints.size() - m_CurrentPoint;\n\t}\n\n\n\n\nprivate:\n\n\t/* General */\n\tbool StepOnce();  // The public version just calls this version * CALCULATIONS_PER_CALL times.\n\tvoid FinishCalculation();  // Clears the memory used for calculating the path.\n\tvoid FinishCalculation(ePathFinderStatus a_NewStatus);  // Clears the memory used for calculating the path and changes the status.\n\tvoid AttemptToFindAlternative();\n\tvoid BuildPath();\n\n\t/* Openlist and closedlist management */\n\tvoid OpenListAdd(cPathCell * a_Cell);\n\tcPathCell * OpenListPop();\n\tbool ProcessIfWalkable(const Vector3i & a_Location, cPathCell * a_Source, int a_Cost);\n\n\t/* Map management */\n\tvoid ProcessCell(cPathCell * a_Cell,  cPathCell * a_Caller,  int a_GDelta);\n\tcPathCell * GetCell(const Vector3i & a_location);\n\n\t/* Pathfinding fields */\n\tstd::priority_queue<cPathCell *,  std::vector<cPathCell *>,  compareHeuristics> m_OpenList;\n\tstd::unordered_map<Vector3i, cPathCell, VectorHasher<int>> m_Map;\n\tVector3i m_Destination;\n\tVector3i m_Source;\n\tint m_BoundingBoxWidth;\n\tint m_BoundingBoxHeight;\n\tdouble m_HalfWidth;\n\tint m_StepsLeft;\n\tcPathCell * m_NearestPointToTarget;\n\n\t/* Control fields */\n\tePathFinderStatus m_Status;\n\tbool m_IsValid;\n\n\t/* Final path fields */\n\tsize_t m_CurrentPoint;\n\tstd::vector<Vector3i> m_PathPoints;\n\n\t/* Interfacing with the world */\n\tvoid FillCellAttributes(cPathCell & a_Cell);  // Query our hosting world and fill the cell with info\n\tcChunk * m_Chunk;  // Only valid inside Step()!\n\tbool m_BadChunkFound;\n\n\t/* High level world queries */\n\tbool IsWalkable(const Vector3i & a_Location, const Vector3i & a_Source);\n\tbool BodyFitsIn(const Vector3i & a_Location, const Vector3i & a_Source);\n\tbool BlockTypeIsSpecial(BLOCKTYPE a_Type);\n\tbool SpecialIsSolidFromThisDirection(BLOCKTYPE a_Type, NIBBLETYPE a_Meta,  const Vector3i & a_Direction);\n\tbool HasSolidBelow(const Vector3i & a_Location);\n\t#ifdef COMPILING_PATHFIND_DEBUGGER\n\t#include \"../path_irrlicht.cpp\"\n\t#endif\n};\n"
  },
  {
    "path": "src/Mobs/PathFinder.cpp",
    "content": "#include \"Globals.h\"\n#include \"PathFinder.h\"\n#include \"BlockType.h\"\n#include \"../BlockInfo.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\ncPathFinder::cPathFinder(float a_MobWidth, float a_MobHeight) :\n\tm_Width(a_MobWidth),\n\tm_Height(a_MobHeight),\n\tm_GiveUpCounter(0),\n\tm_NotFoundCooldown(0)\n{\n}\n\n\n\n\n\nePathFinderStatus cPathFinder::GetNextWayPoint(cChunk & a_Chunk, const Vector3d & a_Source, Vector3d * a_Destination, Vector3d * a_OutputWaypoint, bool a_DontCare)\n{\n\tm_FinalDestination = *a_Destination;\n\tm_Source = a_Source;\n\n\t// If a recent PATH_NOT_FOUND was returned, we rest for a few ticks.\n\tif (m_NotFoundCooldown > 0)\n\t{\n\t\tm_NotFoundCooldown -= 1;\n\t\treturn ePathFinderStatus::CALCULATING;\n\t}\n\n\t// Tweak the destination. If something is wrong with the destination or the chunk, rest for a while.\n\tif (!(EnsureProperPoint(m_FinalDestination, a_Chunk) && EnsureProperPoint(m_Source, a_Chunk)))\n\t{\n\t\tm_NotFoundCooldown = 20;\n\t\treturn ePathFinderStatus::PATH_NOT_FOUND;\n\t}\n\n\t/* printf(\"%d %d %d -> %d %d %d\\n\",\n\tstatic_cast<int>(m_Source.x),\n\tstatic_cast<int>(m_Source.y),\n\tstatic_cast<int>(m_Source.z),\n\tstatic_cast<int>(m_FinalDestination.x),\n\tstatic_cast<int>(m_FinalDestination.y),\n\tstatic_cast<int>(m_FinalDestination.z)); */\n\n\t// Rest is over. Prepare m_Path by calling ResetPathFinding.\n\tif (m_NotFoundCooldown == 0)\n\t{\n\t\tm_NotFoundCooldown = -1;\n\t\tResetPathFinding(a_Chunk);\n\t}\n\n\t// If m_Path has not been initialized yet, initialize it.\n\tif (!m_Path->IsValid())\n\t{\n\t\tResetPathFinding(a_Chunk);\n\t}\n\n\tswitch (m_Path->CalculationStep(a_Chunk))\n\t{\n\t\tcase ePathFinderStatus::NEARBY_FOUND:\n\t\t{\n\t\t\tm_NoPathToTarget = true;\n\t\t\tm_PathDestination = m_Path->AcceptNearbyPath();\n\t\t\tif (a_DontCare)\n\t\t\t{\n\t\t\t\tm_FinalDestination = m_PathDestination;\n\t\t\t\t*a_Destination = m_FinalDestination;  // Modify the mob's final destination because it doesn't care about reaching an exact spot\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_DeviationOrigin = m_FinalDestination;  // This is the only case in which m_DeviationOrigin != m_PathDestination\n\t\t\t}\n\t\t\treturn ePathFinderStatus::CALCULATING;\n\t\t\t// The next call will trigger the PATH_FOUND case\n\t\t}\n\n\t\tcase ePathFinderStatus::PATH_NOT_FOUND:\n\t\t{\n\t\t\tm_NotFoundCooldown = 20;\n\t\t\treturn ePathFinderStatus::PATH_NOT_FOUND;\n\t\t}\n\t\tcase ePathFinderStatus::CALCULATING:\n\t\t{\n\t\t\treturn ePathFinderStatus::CALCULATING;\n\t\t}\n\t\tcase ePathFinderStatus::PATH_FOUND:\n\t\t{\n\t\t\tm_GiveUpCounter -= 1;\n\n\t\t\tif (m_GiveUpCounter == 0)\n\t\t\t{\n\t\t\t\tif (a_DontCare)\n\t\t\t\t{\n\t\t\t\t\t// We're having trouble reaching the next waypoint but the mob\n\t\t\t\t\t// Doesn't care where to go, just tell him we got there ;)\n\t\t\t\t\tm_FinalDestination = m_Source;\n\t\t\t\t\t*a_Destination = m_FinalDestination;\n\t\t\t\t\tResetPathFinding(a_Chunk);\n\t\t\t\t\treturn ePathFinderStatus::CALCULATING;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tResetPathFinding(a_Chunk);\n\t\t\t\t\treturn ePathFinderStatus::CALCULATING;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (PathIsTooOld())\n\t\t\t{\n\t\t\t\tResetPathFinding(a_Chunk);\n\t\t\t\treturn ePathFinderStatus::CALCULATING;\n\t\t\t}\n\n\t\t\tif (m_Path->NoMoreWayPoints())\n\t\t\t{\n\t\t\t\t// We're always heading towards m_PathDestination.\n\t\t\t\t// If m_PathDestination is exactly m_FinalDestination, then we're about to reach the destination.\n\t\t\t\tif (m_PathDestination == m_FinalDestination)\n\t\t\t\t{\n\t\t\t\t\t*a_OutputWaypoint = m_FinalDestination;\n\t\t\t\t\treturn ePathFinderStatus::PATH_FOUND;\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Otherwise, we've finished our approximate path and time to recalc.\n\t\t\t\t\tResetPathFinding(a_Chunk);\n\t\t\t\t\treturn ePathFinderStatus::CALCULATING;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tVector3d Waypoint(m_WayPoint);\n\t\t\tVector3d Source(m_Source);\n\t\t\tWaypoint.y = 0;\n\t\t\tSource.y = 0;\n\n\t\t\tif (m_Path->IsFirstPoint() || (((Waypoint - Source).SqrLength() < WAYPOINT_RADIUS) && (m_Source.y >= m_WayPoint.y)))\n\t\t\t{\n\t\t\t\t// if the mob has just started or if the mob reached a waypoint, give them a new waypoint.\n\t\t\t\tm_WayPoint = m_Path->GetNextPoint();\n\t\t\t\tm_GiveUpCounter = 40;\n\t\t\t\treturn ePathFinderStatus::PATH_FOUND;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Otherwise, the mob is still walking towards its waypoint, we'll patiently wait. We won't update m_WayPoint.\n\t\t\t\t*a_OutputWaypoint = m_WayPoint;\n\t\t\t\treturn ePathFinderStatus::PATH_FOUND;\n\t\t\t}\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported path finder status\");\n}\n\n\n\n\n\nvoid cPathFinder::ResetPathFinding(cChunk &a_Chunk)\n{\n\tm_GiveUpCounter = 40;\n\tm_NoPathToTarget = false;\n\tm_PathDestination = m_FinalDestination;\n\tm_DeviationOrigin = m_PathDestination;\n\tm_Path.reset(new cPath(a_Chunk, m_Source, m_PathDestination, 20, m_Width, m_Height));\n}\n\n\n\n\n\nbool cPathFinder::EnsureProperPoint(Vector3d & a_Vector, cChunk & a_Chunk)\n{\n\tcChunk * Chunk = a_Chunk.GetNeighborChunk(FloorC(a_Vector.x), FloorC(a_Vector.z));\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\n\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t{\n\t\treturn false;\n\t}\n\n\t// If destination in the air, first try to go 1 block north, or east, or west.\n\t// This fixes the player leaning issue.\n\t// If that failed, we instead go down to the lowest air block.\n\tauto Below = a_Vector.Floor().addedY(-1);\n\tif (!cChunkDef::IsValidHeight(Below))\n\t{\n\t\treturn false;\n\n\t}\n\tauto BelowRel = cChunkDef::AbsoluteToRelative(Below);\n\n\tChunk->GetBlockTypeMeta(BelowRel, BlockType, BlockMeta);\n\tif (!(IsWaterOrSolid(BlockType)))\n\t{\n\t\tconstexpr std::array<Vector3i, 8> Offsets =\n\t\t{\n\t\t\t{\n\t\t\t\t{-1, 0, 0},\n\t\t\t\t{1, 0, 0},\n\t\t\t\t{0, 0, -1},\n\t\t\t\t{0, 0, 1},\n\t\t\t\t{-1, 0, -1},\n\t\t\t\t{-1, 0, 1},\n\t\t\t\t{1, 0, -1},\n\t\t\t\t{1, 0, 1},\n\t\t\t}\n\t\t};\n\n\t\t// Looks for a neighbouring block one block in x or z direction that is water or solid.\n\t\tbool InTheAir = true;\n\t\tfor (const auto & Offset : Offsets)\n\t\t{\n\t\t\tauto InspectPos = Below + Offset;\n\t\t\tChunk = a_Chunk.GetNeighborChunk(InspectPos.x, InspectPos.z);\n\t\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tauto InspectRel = cChunkDef::AbsoluteToRelative(InspectPos);\n\t\t\tChunk->GetBlockTypeMeta(InspectRel, BlockType, BlockMeta);\n\t\t\tif (IsWaterOrSolid((BlockType)))\n\t\t\t{\n\t\t\t\tBelowRel = InspectRel;\n\t\t\t\tInTheAir = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Go down to the lowest air block.\n\t\tif (InTheAir)\n\t\t{\n\t\t\twhile (cChunkDef::IsValidHeight(BelowRel.addedY(-1)))\n\t\t\t{\n\t\t\t\tChunk->GetBlockTypeMeta(BelowRel.addedY(-1), BlockType, BlockMeta);\n\t\t\t\tif (IsWaterOrSolid(BlockType))\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tBelowRel.y -= 1;\n\t\t\t}\n\t\t}\n\t}\n\n\t// If destination in water or solid, go up to the first air block.\n\twhile (BelowRel.y < cChunkDef::Height)\n\t{\n\t\tChunk->GetBlockTypeMeta(BelowRel, BlockType, BlockMeta);\n\t\tif (!IsWaterOrSolid(BlockType))\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tBelowRel.y += 1;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cPathFinder::IsWaterOrSolid(BLOCKTYPE a_BlockType)\n{\n\treturn ((a_BlockType == E_BLOCK_STATIONARY_WATER) || cBlockInfo::IsSolid(a_BlockType));\n}\n\n\n\n\n\nbool cPathFinder::PathIsTooOld() const\n{\n\tsize_t acceptableDeviation = m_Path->WayPointsLeft() / 2;\n\tif (acceptableDeviation == 0)\n\t{\n\t\tacceptableDeviation = 1;\n\t}\n\tconst auto DeviationSqr = (m_FinalDestination - m_DeviationOrigin).SqrLength();\n\treturn (DeviationSqr > (acceptableDeviation * acceptableDeviation));\n}\n"
  },
  {
    "path": "src/Mobs/PathFinder.h",
    "content": "\n#pragma once\n#include \"Path.h\"\n\n#define WAYPOINT_RADIUS 0.5\n\n/** This class wraps cPath.\ncPath is a \"dumb device\" - You give it point A and point B, and it returns a full path path.\ncPathFinder - You give it a constant stream of point A (where you are) and point B (where you want to go),\nand it tells you where to go next. It manages path recalculation internally, and is much more efficient that calling cPath every step. */\nclass cPathFinder\n{\n\npublic:\n\t/** Creates a cPathFinder instance. Each mob should have one cPathFinder throughout its lifetime.\n\t@param a_MobWidth The mob width.\n\t@param a_MobHeight The mob height.\n\t*/\n\tcPathFinder(float a_MobWidth, float a_MobHeight);\n\n\t/** Updates the PathFinder's internal state and returns a waypoint.\n\tA waypoint is a coordinate which the mob can safely move to from its current position in a straight line.\n\tThe mob is expected to call this function tick as long as it is following a path.\n\t@param a_Chunk The chunk in which the mob is currently at.\n\t@param a_Source The mob's position. a_Source's coordinates are expected to be within the chunk given in a_Chunk.\n\t@param a_Destination The position the mob would like to reach. If a_ExactPath is true, the PathFinder may modify this.\n\t@param a_OutputWaypoint An output parameter: The next waypoint to go to.\n\t@param a_DontCare If true, the mob doesn't care where to go, and the Pathfinder may modify a_Destination.\n\tThis should usually be false. An exception is a wandering idle mob which doesn't care about its final destination.\n\tIn the future, idle mobs shouldn't use A* at all.\n\n\tReturns an ePathFinderStatus.\n\tePathFinderStatus:CALCULATING - The PathFinder is still processing a path. Nothing was written to a_OutputWaypoint. The mob should probably not move.\n\tePathFinderStatus:PATH_FOUND - The PathFinder has found a path to the target. The next waypoint was written a_OutputWaypoint. The mob should probably move to a_OutputWaypoint.\n\tePathFinderStatus:NEARBY_FOUND - The PathFinder did not find a destination to the target but did find a nearby spot. The next waypoint was written a_OutputWaypoint. The mob should probably move to a_OutputWaypoint.\n\tePathFinderStatus:PATH_NOT_FOUND - The PathFinder did not find a destination to the target. Nothing was written to a_OutputWaypoint. The mob should probably not move.\n\n\tNote: Once NEARBY_FOUND is returned once, subsequent calls return PATH_FOUND. */\n\tePathFinderStatus GetNextWayPoint(cChunk & a_Chunk, const Vector3d & a_Source, Vector3d * a_Destination, Vector3d * a_OutputWaypoint, bool a_DontCare = false);\n\nprivate:\n\n\t/** The width of the Mob which owns this PathFinder. */\n\tfloat m_Width;\n\n\t/** The height of the Mob which owns this PathFinder. */\n\tfloat m_Height;\n\n\t/** The current cPath instance we have. This is discarded and recreated when a path recalculation is needed. */\n\tstd::unique_ptr<cPath> m_Path;\n\n\t/** If 0, will give up reaching the next m_WayPoint and will recalculate path. */\n\tint m_GiveUpCounter;\n\n\t/** Coordinates of the next position that should be reached. */\n\tVector3d m_WayPoint;\n\n\t/** Coordinates for where we should go. This is out ultimate, final destination. */\n\tVector3d m_FinalDestination;\n\n\t/** Coordinates for where we are practically going. */\n\tVector3d m_PathDestination;\n\n\t/** When FinalDestination is too far from this, we recalculate.\n\tThis usually equals PathDestination. Except when m_NoPathToTarget is true. */\n\tVector3d m_DeviationOrigin;\n\n\n\t/** Coordinates for where the mob is currently at. */\n\tVector3d m_Source;\n\n\t/** True if there's no path to target and we're walking to a nearby location instead. */\n\tbool m_NoPathToTarget;\n\n\t/** When a path is not found, this cooldown prevents any recalculations for several ticks. */\n\tint m_NotFoundCooldown;\n\n\t/** Ensures the location is not in the air or under water.\n\tMay change the Y coordinate of the given vector.\n\t1. If a_Vector is the position of water, a_Vector's Y will be modified to point to the first air block above it.\n\t2. If a_Vector is the position of air, a_Vector's Y will be modified to point to the first airblock below it which has solid or water beneath. */\n\tbool EnsureProperPoint(Vector3d & a_Vector, cChunk & a_Chunk);\n\n\t/** Resets a pathfinding task, typically because m_FinalDestination has deviated too much from m_DeviationOrigin. */\n\tvoid ResetPathFinding(cChunk &a_Chunk);\n\n\t/** Return true the the blocktype is either water or solid */\n\tbool IsWaterOrSolid(BLOCKTYPE a_BlockType);\n\n\t/** Is the path too old and should be recalculated? When this is true ResetPathFinding() is called. */\n\tbool PathIsTooOld() const;\n};\n"
  },
  {
    "path": "src/Mobs/Pig.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Pig.h\"\n#include \"../Entities/Player.h\"\n#include \"../World.h\"\n\n\n\n\n\ncPig::cPig(void) :\n\tSuper(\"Pig\", mtPig, \"entity.pig.hurt\", \"entity.pig.death\", \"entity.pig.ambient\", 0.9f, 0.9f),\n\tm_bIsSaddled(false)\n{\n}\n\n\n\n\n\nvoid cPig::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif (IsBaby())\n\t{\n\t\treturn;  // Babies don't drop items\n\t}\n\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 1, 3 + LootingLevel, IsOnFire() ? E_ITEM_COOKED_PORKCHOP : E_ITEM_RAW_PORKCHOP);\n\tif (m_bIsSaddled)\n\t{\n\t\ta_Drops.emplace_back(E_ITEM_SADDLE, static_cast<char>(1));\n\t}\n}\n\n\n\n\n\nvoid cPig::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tif (m_bIsSaddled)\n\t{\n\t\tif (m_Attachee != nullptr)\n\t\t{\n\t\t\tif (m_Attachee->GetUniqueID() == a_Player.GetUniqueID())\n\t\t\t{\n\t\t\t\t// This player is already sitting in, they want out.\n\t\t\t\ta_Player.Detach();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (m_Attachee->IsPlayer())\n\t\t\t{\n\t\t\t\t// Another player is already sitting in here, cannot attach\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Detach whatever is sitting in this pig now:\n\t\t\tm_Attachee->Detach();\n\t\t}\n\n\t\t// Attach the player to this pig:\n\t\ta_Player.AttachTo(*this);\n\t}\n\telse if (a_Player.GetEquippedItem().m_ItemType == E_ITEM_SADDLE)\n\t{\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\t// Set saddle state & broadcast metadata\n\t\tm_bIsSaddled = true;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n}\n\n\n\n\n\nvoid cPig::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\t// If the attachee player is holding a carrot-on-stick, let them drive this pig:\n\tif (m_bIsSaddled && (m_Attachee != nullptr))\n\t{\n\t\tif (m_Attachee->IsPlayer() && (m_Attachee->GetEquippedWeapon().m_ItemType == E_ITEM_CARROT_ON_STICK))\n\t\t{\n\t\t\tMoveToPosition((m_Attachee->GetPosition()) + (m_Attachee->GetLookVector()*10));\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cPig::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tif (a_TDI.DamageType == dtLightning)\n\t{\n\t\tDestroy();\n\t\tm_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtZombiePigman, false);\n\t\treturn true;\n\t}\n\treturn true;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Pig.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n\n\n\n\n\nclass cPig:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tcPig();\n\n\tCLASS_PROTODEF(cPig)\n\n\t// cEntity overrides\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tvirtual void GetFollowedItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_CARROT);\n\t}\n\n\tbool IsSaddled(void) const { return m_bIsSaddled; }\n\nprivate:\n\n\tbool m_bIsSaddled;\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Rabbit.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Rabbit.h\"\n#include \"../Entities/Player.h\"\n#include \"../World.h\"\n\n\n\n\n\ncRabbit::cRabbit(void) :\n\tcRabbit(static_cast<eRabbitType>(GetRandomProvider().RandInt<UInt8>(\n\t\tstatic_cast<UInt8>(eRabbitType::SaltAndPepper)  // Max possible Rabbit-Type\n\t)), 0)\n{\n}\n\n\n\n\n\ncRabbit::cRabbit(eRabbitType Type, int MoreCarrotTicks) :\n\tSuper(\"Rabbit\", mtRabbit, \"entity.rabbit.hurt\", \"entity.rabbit.death\", \"entity.rabbit.ambient\", 0.4f, 0.5f),\n\tm_Type(Type),\n\tm_MoreCarrotTicks(MoreCarrotTicks)\n{\n}\n\n\n\n\n\nvoid cRabbit::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif (IsBaby())\n\t{\n\t\treturn;  // Babies don't drop items\n\t}\n\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, IsOnFire() ? E_ITEM_COOKED_RABBIT : E_ITEM_RAW_RABBIT);\n\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_RABBIT_HIDE);\n\tcItems RareDrops;\n\tRareDrops.Add(cItem(E_ITEM_RABBITS_FOOT));\n\tAddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);\n}\n\n"
  },
  {
    "path": "src/Mobs/Rabbit.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n\n\n\n\n\nenum class eRabbitType : UInt8\n{\n\tBrown          = 0,\n\tWhite          = 1,\n\tBlack          = 2,\n\tBlackAndWhite  = 3,\n\tGold           = 4,\n\tSaltAndPepper  = 5,\n\tTheKillerBunny = 99\n};\n\n\n\n\n\nclass cRabbit:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tcRabbit();\n\tcRabbit(eRabbitType Type, int MoreCarrotTicks = 0);\n\n\tCLASS_PROTODEF(cRabbit)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void GetFollowedItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_CARROT);\n\t\ta_Items.Add(E_ITEM_GOLDEN_CARROT);\n\t\ta_Items.Add(E_BLOCK_DANDELION);\n\t}\n\n\teRabbitType GetRabbitType()         const { return m_Type; }\n\tint         GetMoreCarrotTicks()    const { return m_MoreCarrotTicks; }\n\nprivate:\n\n\teRabbitType m_Type;\n\tint m_MoreCarrotTicks;  // Ticks until the Rabbit eat planted Carrots\n} ;\n"
  },
  {
    "path": "src/Mobs/Sheep.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Sheep.h\"\n#include \"../Entities/Player.h\"\n#include \"../World.h\"\n#include \"../EffectID.h\"\n#include \"../FastRandom.h\"\n\n\n\n\n\ncSheep::cSheep(int a_Color) :\n\tSuper(\"Sheep\", mtSheep, \"entity.sheep.hurt\", \"entity.sheep.death\", \"entity.sheep.ambient\", 0.9f, 1.3f),\n\tm_IsSheared(false),\n\tm_WoolColor(a_Color),\n\tm_TimeToStopEating(-1)\n{\n\t// Generate random wool color.\n\tif (m_WoolColor == -1)\n\t{\n\t\tm_WoolColor = GenerateNaturalRandomColor();\n\t}\n\n\tif ((m_WoolColor < 0) || (m_WoolColor > 15))\n\t{\n\t\tm_WoolColor = 0;\n\t}\n}\n\n\n\n\n\nvoid cSheep::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tif (IsBaby())\n\t{\n\t\treturn;  // Babies don't drop items\n\t}\n\n\tif (!m_IsSheared)\n\t{\n\t\ta_Drops.emplace_back(E_BLOCK_WOOL, static_cast<char>(1), static_cast<short>(m_WoolColor));\n\t}\n\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 1, 3 + LootingLevel, IsOnFire() ? E_ITEM_COOKED_MUTTON : E_ITEM_RAW_MUTTON);\n}\n\n\n\n\n\nvoid cSheep::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tconst cItem & EquippedItem = a_Player.GetEquippedItem();\n\tif ((EquippedItem.m_ItemType == E_ITEM_SHEARS) && !IsSheared() && !IsBaby())\n\t{\n\t\tm_IsSheared = true;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t\ta_Player.UseEquippedItem();\n\n\t\tcItems Drops;\n\t\tchar NumDrops = GetRandomProvider().RandInt<char>(1, 3);\n\t\tDrops.emplace_back(E_BLOCK_WOOL, NumDrops, static_cast<short>(m_WoolColor));\n\t\tm_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ(), 10);\n\t\tm_World->BroadcastSoundEffect(\"entity.sheep.shear\", GetPosition(), 1.0f, 1.0f);\n\t}\n\telse if ((EquippedItem.m_ItemType == E_ITEM_DYE) && (m_WoolColor != 15 - EquippedItem.m_ItemDamage))\n\t{\n\t\tm_WoolColor = 15 - EquippedItem.m_ItemDamage;\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t}\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n}\n\n\n\n\n\nvoid cSheep::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\tint PosX = POSX_TOINT;\n\tint PosY = POSY_TOINT - 1;\n\tint PosZ = POSZ_TOINT;\n\n\tif ((PosY <= 0) || (PosY >= cChunkDef::Height))\n\t{\n\t\treturn;\n\t}\n\n\tif (m_TimeToStopEating > 0)\n\t{\n\t\tStopMovingToPosition();\n\t\tm_TimeToStopEating--;\n\n\t\tif (m_TimeToStopEating == 0)\n\t\t{\n\t\t\tif (m_World->GetBlock({ PosX, PosY, PosZ }) == E_BLOCK_GRASS)  // Make sure grass hasn't been destroyed in the meantime\n\t\t\t{\n\t\t\t\t// The sheep ate the grass so we change it to dirt\n\t\t\t\tm_World->SetBlock({ PosX, PosY, PosZ }, E_BLOCK_DIRT, 0);\n\t\t\t\tGetWorld()->BroadcastSoundParticleEffect(EffectID::PARTICLE_BLOCK_BREAK, { PosX, PosY, PosZ }, E_BLOCK_GRASS);\n\t\t\t\tm_IsSheared = false;\n\t\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (GetRandomProvider().RandBool(1.0 / 600.0))\n\t\t{\n\t\t\tif (m_World->GetBlock({ PosX, PosY, PosZ }) == E_BLOCK_GRASS)\n\t\t\t{\n\t\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::SheepEatsGrass);\n\t\t\t\tm_TimeToStopEating = 40;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSheep::InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2)\n{\n\tstatic const struct\n\t{\n\t\tshort Parent1, Parent2, Child;\n\t} ColorInheritance[] =\n\t{\n\t\t{ E_META_WOOL_BLUE,   E_META_WOOL_RED,   E_META_WOOL_PURPLE     },\n\t\t{ E_META_WOOL_BLUE,   E_META_WOOL_GREEN, E_META_WOOL_CYAN       },\n\t\t{ E_META_WOOL_YELLOW, E_META_WOOL_RED,   E_META_WOOL_ORANGE     },\n\t\t{ E_META_WOOL_GREEN,  E_META_WOOL_WHITE, E_META_WOOL_LIGHTGREEN },\n\t\t{ E_META_WOOL_RED,    E_META_WOOL_WHITE, E_META_WOOL_PINK       },\n\t\t{ E_META_WOOL_WHITE,  E_META_WOOL_BLACK, E_META_WOOL_GRAY       },\n\t\t{ E_META_WOOL_PURPLE, E_META_WOOL_PINK,  E_META_WOOL_MAGENTA    },\n\t\t{ E_META_WOOL_WHITE,  E_META_WOOL_GRAY,  E_META_WOOL_LIGHTGRAY  },\n\t\t{ E_META_WOOL_BLUE,   E_META_WOOL_WHITE, E_META_WOOL_LIGHTBLUE  },\n\t};\n\tcSheep * Parent1 = static_cast<cSheep *>(a_Parent1);\n\tcSheep * Parent2 = static_cast<cSheep *>(a_Parent2);\n\tfor (size_t i = 0; i < ARRAYCOUNT(ColorInheritance); i++)\n\t{\n\t\tif (\n\t\t\t((Parent1->GetFurColor() == ColorInheritance[i].Parent1) && (Parent2->GetFurColor() == ColorInheritance[i].Parent2)) ||\n\t\t\t((Parent1->GetFurColor() == ColorInheritance[i].Parent2) && (Parent2->GetFurColor() == ColorInheritance[i].Parent1))\n\t\t)\n\t\t{\n\t\t\tSetFurColor(ColorInheritance[i].Child);\n\t\t\treturn;\n\t\t}\n\t}\n\tSetFurColor(GetRandomProvider().RandBool() ? Parent1->GetFurColor() : Parent2->GetFurColor());\n}\n\n\n\n\n\nNIBBLETYPE cSheep::GenerateNaturalRandomColor(void)\n{\n\tint Chance = GetRandomProvider().RandInt(100);\n\n\tif (Chance <= 81)\n\t{\n\t\treturn E_META_WOOL_WHITE;\n\t}\n\telse if (Chance <= 86)\n\t{\n\t\treturn E_META_WOOL_BLACK;\n\t}\n\telse if (Chance <= 91)\n\t{\n\t\treturn E_META_WOOL_GRAY;\n\t}\n\telse if (Chance <= 96)\n\t{\n\t\treturn E_META_WOOL_LIGHTGRAY;\n\t}\n\telse if (Chance <= 99)\n\t{\n\t\treturn E_META_WOOL_BROWN;\n\t}\n\telse\n\t{\n\t\treturn E_META_WOOL_PINK;\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Sheep.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n\n\n\n\n\nclass cSheep:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\t/** The number is the color of the sheep.\n\tUse E_META_WOOL_* constants for the wool color.\n\tIf you type -1, the server will generate a random color\n\twith the GenerateNaturalRandomColor() function. */\n\tcSheep(int a_Color = -1);\n\n\tCLASS_PROTODEF(cSheep)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2) override;\n\n\tvirtual void GetFollowedItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_WHEAT);\n\t}\n\n\t/** Generates a random color for the sheep like the vanilla server.\n\tThe percent's where used are from the wiki: https://minecraft.wiki/w/Sheep#Breeding */\n\tstatic NIBBLETYPE GenerateNaturalRandomColor(void);\n\n\tbool IsSheared(void) const { return m_IsSheared; }\n\tvoid SetSheared(bool a_IsSheared) { m_IsSheared = a_IsSheared; }\n\n\tint GetFurColor(void) const { return m_WoolColor; }\n\tvoid SetFurColor(int a_WoolColor) { m_WoolColor = a_WoolColor; }\n\nprivate:\n\tbool m_IsSheared;\n\tint m_WoolColor;\n\tint m_TimeToStopEating;\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Silverfish.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"Silverfish.h\"\n\n#include \"../World.h\"\n#include \"../Chunk.h\"\n#include \"../Blocks/BlockHandler.h\"\n#include \"../Blocks/BlockInfested.h\"\n\n\n\n\n\ncSilverfish::cSilverfish() :\n\tSuper(\"Silverfish\", mtSilverfish, \"entity.silverfish.hurt\", \"entity.silverfish.death\", \"entity.silverfish.ambient\", 0.4f, 0.3f)\n{\n}\n\n\n\n\n\nbool cSilverfish::DoTakeDamage(TakeDamageInfo &a_TDI)\n{\n\t// Call on our brethren to attack!\n\t// TODO: stop this if /gamerule mobGriefing is set to false\n\n\t// If the entity didn't take any damage, bail:\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\t// Or, conversely took lethal damage, bail:\n\tif (m_Health <= 0)\n\t{\n\t\treturn true;\n\t}\n\n\tif (a_TDI.Attacker == nullptr)\n\t{\n\t\tif ((a_TDI.DamageType != dtPoison) && (a_TDI.DamageType != dtPotionOfHarming))\n\t\t{\n\t\t\t// Bail if attacker doesn't exist and it wasn't a splash potion:\n\t\t\treturn true;\n\t\t}\n\t}\n\telse if (!a_TDI.Attacker->IsPlayer())\n\t{\n\t\t// Bail if it wasn't a player attack:\n\t\treturn true;\n\t}\n\n\tauto & Random = GetRandomProvider();\n\n\t// Tries to spawn another Silverfish, returning if the search should continue.\n\tauto CheckInfested = [this, &Random, Position = GetPosition().Floor()](const Vector3i Offset) mutable\n\t{\n\t\tconst auto Block = Position + Offset;\n\t\tif (m_World->GetBlock(Block) == E_BLOCK_SILVERFISH_EGG)\n\t\t{\n\t\t\tm_World->DigBlock(Block);\n\t\t\treturn Random.RandBool();\n\t\t}\n\t\treturn false;\n\t};\n\n\t// Search the faces of an increasingly large cube (so the positions closest get looked at first)\n\t// of min 3, max 10, for infested blocks and spawn additional reinforcements:\n\tfor (int CubeSideLength = 3; CubeSideLength <= 10; CubeSideLength += 2)\n\t{\n\t\tconst int HalfSide = CubeSideLength / 2;\n\n\t\tfor (int OffsetX = -HalfSide; OffsetX <= HalfSide; OffsetX++)\n\t\t{\n\t\t\tfor (int OffsetZ = -HalfSide; OffsetZ <= HalfSide; OffsetZ++)\n\t\t\t{\n\t\t\t\tif (CheckInfested({ OffsetX, +HalfSide, OffsetZ }) || CheckInfested({ OffsetX, -HalfSide, OffsetZ }))\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (int OffsetX = -HalfSide; OffsetX <= HalfSide; OffsetX++)\n\t\t{\n\t\t\tfor (int OffsetY = -HalfSide + 1; OffsetY <= HalfSide - 1; OffsetY++)\n\t\t\t{\n\t\t\t\tif (CheckInfested({ OffsetX, OffsetY, +HalfSide }) || CheckInfested({ OffsetX, OffsetY, -HalfSide }))\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (int OffsetZ = -HalfSide + 1; OffsetZ <= HalfSide - 1; OffsetZ++)\n\t\t{\n\t\t\tfor (int OffsetY = -HalfSide + 1; OffsetY <= HalfSide - 1; OffsetY++)\n\t\t\t{\n\t\t\t\tif (CheckInfested({ +HalfSide, OffsetY, OffsetZ }) || CheckInfested({ -HalfSide, OffsetY, OffsetZ }))\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "src/Mobs/Silverfish.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cSilverfish:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcSilverfish();\n\n\tCLASS_PROTODEF(cSilverfish)\n\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n} ;\n"
  },
  {
    "path": "src/Mobs/Skeleton.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Skeleton.h\"\n#include \"../World.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\ncSkeleton::cSkeleton(void) :\n\tSuper(\"Skeleton\", mtSkeleton, \"entity.skeleton.hurt\", \"entity.skeleton.death\", \"entity.skeleton.ambient\", 0.6f, 1.99f),\n\tm_ChargingBow(false)\n{\n}\n\n\n\n\n\nvoid cSkeleton::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_ARROW);\n\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_BONE);\n\tAddRandomArmorDropItem(a_Drops, LootingLevel);\n\tAddRandomWeaponDropItem(a_Drops, LootingLevel);\n}\n\n\n\n\n\nvoid cSkeleton::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (m_ChargingBow && (m_EMState == IDLE))\n\t{\n\t\t// releasing bow if no more target is found\n\t\tm_ChargingBow = false;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n}\n\n\n\n\n\nbool cSkeleton::Attack(std::chrono::milliseconds a_Dt)\n{\n\tStopMovingToPosition();  // Todo handle this in a better way, the skeleton does some uneeded recalcs due to inStateChasing\n\tauto & Random = GetRandomProvider();\n\n\tif (!m_ChargingBow)\n\t{\n\t\t// updating pulling animation\n\t\tm_ChargingBow = true;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\t}\n\n\tif ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))\n\t{\n\t\tVector3d Inaccuracy = Vector3d(Random.RandReal<double>(-0.25, 0.25), Random.RandReal<double>(-0.25, 0.25), Random.RandReal<double>(-0.25, 0.25));\n\t\tVector3d Speed = (GetTarget()->GetPosition() + Inaccuracy - GetPosition()) * 5;\n\t\tSpeed.y += Random.RandInt(-1, 1);\n\n\t\tauto Arrow = std::make_unique<cArrowEntity>(this, GetPosition().addedY(1), Speed);\n\t\tauto ArrowPtr = Arrow.get();\n\t\tif (!ArrowPtr->Initialize(std::move(Arrow), *m_World))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// releasing bow after arrow was shot\n\t\tm_ChargingBow = false;\n\t\tm_World->BroadcastEntityMetadata(*this);\n\n\t\tResetAttackCooldown();\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cSkeleton::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\tSuper::SpawnOn(a_ClientHandle);\n\ta_ClientHandle.SendEntityEquipment(*this, 0, cItem(E_ITEM_BOW));\n}\n"
  },
  {
    "path": "src/Mobs/Skeleton.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cSkeleton:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcSkeleton();\n\n\tCLASS_PROTODEF(cSkeleton)\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n\n\tvirtual bool IsUndead(void) override { return true; }\n\n\tbool IsChargingBow() const { return m_ChargingBow; }\n\nprivate:\n\n\tbool m_ChargingBow;\n\n} ;\n"
  },
  {
    "path": "src/Mobs/Slime.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Slime.h\"\n#include \"../FastRandom.h\"\n#include \"../World.h\"\n\n\n\n\n\ncSlime::cSlime(int a_Size) :\n\tSuper(\"Slime\",\n\t\tmtSlime,\n\t\tfmt::format(FMT_STRING(\"entity.{}slime.hurt\"),  GetSizeName(a_Size)),\n\t\tfmt::format(FMT_STRING(\"entity.{}slime.death\"), GetSizeName(a_Size)),\n\t\t\"\",\n\t\t0.51f * a_Size,\n\t\t0.51f * a_Size\n\t),\n\tm_Size(a_Size)\n{\n\tSetMaxHealth(static_cast<float>(a_Size * a_Size));\n\tSetAttackDamage(a_Size);\n}\n\n\n\n\n\nvoid cSlime::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\n\t// Only slimes with the size 1 can drop slimeballs.\n\tif (m_Size == 1)\n\t{\n\t\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_SLIMEBALL);\n\t}\n}\n\n\n\n\n\nbool cSlime::Attack(std::chrono::milliseconds a_Dt)\n{\n\tif (m_Size > 1)\n\t{\n\t\t// Only slimes larger than size 1 attack a player.\n\t\treturn Super::Attack(a_Dt);\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nvoid cSlime::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tif (GetHealth() > 0)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_Size != 1)\n\t{\n\t\tauto & Random = GetRandomProvider();\n\t\tint SpawnAmount = Random.RandInt(2, 4);\n\n\t\tfor (int i = 0; i < SpawnAmount; ++i)\n\t\t{\n\t\t\tdouble AddX = (i % 2 - 0.5) * m_Size / 4.0;\n\t\t\tdouble AddZ = (i / 2 - 0.5) * m_Size / 4.0;\n\n\t\t\t// Queue slimes to be spawned after the 1 second death animation has finished playing:\n\t\t\tm_World->ScheduleTask(cTickTime(20), [\n\t\t\t\tPosition = GetPosition() + Vector3d(AddX, 0.5, AddZ),\n\t\t\t\tYaw = Random.RandReal(360.0f),\n\t\t\t\tSize = m_Size / 2\n\t\t\t](cWorld & a_World)\n\t\t\t{\n\t\t\t\tauto NewSlime = std::make_unique<cSlime>(Size);\n\t\t\t\tNewSlime->SetPosition(Position);\n\t\t\t\tNewSlime->SetYaw(Yaw);\n\t\t\t\ta_World.SpawnMobFinalize(std::move(NewSlime));\n\t\t\t});\n\t\t}\n\t}\n\tSuper::KilledBy(a_TDI);\n}\n\n\n\n\n\nAString cSlime::GetSizeName(int a_Size)\n{\n\tif (a_Size == 1)\n\t{\n\t\treturn \"small_\";\n\t}\n\treturn \"\";\n}\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Slime.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cSlime:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\t/** Creates a slime of the specified size; size can be 1, 2 or 4, with 1 is the smallest and 4 is the tallest. */\n\tcSlime(int a_Size);\n\n\tCLASS_PROTODEF(cSlime)\n\n\t// cAggressiveMonster overrides:\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\n\tint GetSize(void) const { return m_Size; }\n\n\t/** Returns the text describing the slime's size, as used by the client's resource subsystem for sounds.\n\tReturns either \"big\" or \"small\". */\n\tstatic AString GetSizeName(int a_Size);\n\nprotected:\n\n\t/** Size of the slime, with 1 being the smallest.\n\tVanilla uses sizes 1, 2 and 4 only. */\n\tint m_Size;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/SnowGolem.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Chunk.h\"\n#include \"SnowGolem.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../Entities/ThrownSnowballEntity.h\"\n\n\n\n\n\ncSnowGolem::cSnowGolem(void) :\n\tSuper(\"SnowGolem\", mtSnowGolem, \"entity.snowman.hurt\", \"entity.snowman.death\", \"entity.snowman.ambient\", 0.7f, 1.9f)\n{\n}\n\n\n\n\n\nvoid cSnowGolem::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tUNUSED(a_Killer);\n\tAddRandomDropItem(a_Drops, 0, 15, E_ITEM_SNOWBALL);\n}\n\n\n\n\n\nvoid cSnowGolem::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tPREPARE_REL_AND_CHUNK(GetPosition().Floor(), a_Chunk);\n\tif (!RelSuccess)\n\t{\n\t\treturn;\n\t}\n\n\tif (IsBiomeNoDownfall(Chunk->GetBiomeAt(Rel.x, Rel.z)))\n\t{\n\t\tTakeDamage(dtEnvironment, nullptr, GetRawDamageAgainst(*this), GetKnockbackAmountAgainst(*this));\n\t}\n\telse if (const auto Below = Rel.addedY(-1); Below.y >= 0)\n\t{\n\t\tif ((Chunk->GetBlock(Rel) == E_BLOCK_AIR) && cBlockInfo::IsSolid(Chunk->GetBlock(Below)))\n\t\t{\n\t\t\tChunk->SetBlock(Rel, E_BLOCK_SNOW, 0);\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cSnowGolem::Attack(std::chrono::milliseconds a_Dt)\n{\n\tUNUSED(a_Dt);\n\n\t// Comment inherited from skeletons\n\tStopMovingToPosition();  // Todo handle this in a better way, the snowman does some uneeded recalcs due to inStateChasing\n\n\tif ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))\n\t{\n\t\tauto & Random = GetRandomProvider();\n\t\tVector3d Inaccuracy = Vector3d(Random.RandReal<double>(-0.75, 0.75), Random.RandReal<double>(-0.75, 0.75), Random.RandReal<double>(-0.75, 0.75));\n\n\t\t// The projectile is launched from the head\n\t\tconst auto HeadPos = GetPosition().addedY(1.5);\n\t\t// It aims around the head / chest\n\t\tconst auto TargetPos = GetTarget()->GetPosition().addedY(GetTarget()->GetHeight() * 0.75);\n\t\t// With this data, we can calculate the speed\n\t\tconst auto Speed = (TargetPos + Inaccuracy - HeadPos) * 5;\n\n\t\tauto Snowball = std::make_unique<cThrownSnowballEntity>(this, HeadPos, Speed);\n\t\tauto SnowballPtr = Snowball.get();\n\t\tif (!SnowballPtr->Initialize(std::move(Snowball), *GetWorld()))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tResetAttackCooldown();\n\t\treturn true;\n\t}\n\treturn false;\n}\n"
  },
  {
    "path": "src/Mobs/SnowGolem.h",
    "content": "\n#pragma once\n\n#include \"PassiveAggressiveMonster.h\"\n\n\n\n\n\nclass cSnowGolem:\n\tpublic cPassiveAggressiveMonster\n{\n\tusing Super = cPassiveAggressiveMonster;\n\npublic:\n\n\tcSnowGolem();\n\n\tCLASS_PROTODEF(cSnowGolem)\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Spider.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Spider.h\"\n\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../Chunk.h\"\n\n\ncSpider::cSpider(void) :\n\tSuper(\"Spider\", mtSpider, \"entity.spider.hurt\", \"entity.spider.death\", \"entity.spider.ambient\", 1.4f, 0.9f)\n{\n}\n\n\n\n\n\nvoid cSpider::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_STRING);\n\tif ((a_Killer != nullptr) && (a_Killer->IsPlayer() || a_Killer->IsA(\"cWolf\")))\n\t{\n\t\tAddRandomUncommonDropItem(a_Drops, 33.0f, E_ITEM_SPIDER_EYE);\n\t}\n}\n\n\n\n\n\nvoid cSpider::EventSeePlayer(cPlayer * a_Player, cChunk & a_Chunk)\n{\n\tif (!GetWorld()->IsChunkLighted(GetChunkX(), GetChunkZ()))\n\t{\n\t\treturn;\n\t}\n\n\tPREPARE_REL_AND_CHUNK(GetPosition(), a_Chunk);\n\tif (!RelSuccess)\n\t{\n\t\treturn;\n\t}\n\n\tif ((Chunk->GetSkyLightAltered(Rel.x, Rel.y, Rel.z) <= 11) && (Chunk->GetBlockLight(Rel.x, Rel.y, Rel.z) <= 11))\n\t{\n\t\tSuper::EventSeePlayer(a_Player, a_Chunk);\n\t}\n}\n\n\n\n\n\nbool cSpider::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\t// If the source of the damage is not from an pawn entity, switch to idle\n\tif ((a_TDI.Attacker == nullptr) || !a_TDI.Attacker->IsPawn())\n\t{\n\t\tm_EMState = IDLE;\n\t}\n\telse\n\t{\n\t\t// If the source of the damage is from a pawn entity, chase that entity\n\t\tm_EMState = CHASING;\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "src/Mobs/Spider.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cSpider:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcSpider();\n\n\tCLASS_PROTODEF(cSpider)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void EventSeePlayer(cPlayer *, cChunk & a_Chunk) override;\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Squid.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Squid.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\ncSquid::cSquid(void) :\n\tSuper(\"Squid\", mtSquid, \"entity.squid.hurt\", \"entity.squid.death\", \"entity.squid.ambient\", 0.8f, 0.8f)\n{\n}\n\n\n\n\n\nvoid cSquid::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\t// Drops 0-3 Ink Sacs\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 3 + LootingLevel, E_ITEM_DYE, E_META_DYE_BLACK);\n}\n\n\n\n\n\nvoid cSquid::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tm_PathfinderActivated = false;  // Disable Pathfinding until it's fixed. TODO\n\n\t// We must first process current location, and only then tick, otherwise we risk processing a location in a chunk\n\t// that is not where the entity currently resides (FS #411)\n\tVector3d Pos = GetPosition();\n\n\t// TODO: Not a real behavior, but cool :D\n\tint RelY = FloorC(Pos.y);\n\tif ((RelY < 0) || (RelY >= cChunkDef::Height))\n\t{\n\t\treturn;\n\t}\n\n\tif (!IsHeadInWater())\n\t{\n\t\tif (m_AirLevel <= 0)\n\t\t{\n\t\t\t// Runs the air tick timer to check whether the squid should be damaged\n\t\t\tif (m_AirTickTimer <= 0)\n\t\t\t{\n\t\t\t\t// Damage squid\n\t\t\t\tTakeDamage(dtSuffocating, nullptr, 1, 1, 0);\n\t\t\t\t// Reset timer\n\t\t\t\tm_AirTickTimer = DROWNING_TICKS;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_AirTickTimer--;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Reduce air supply\n\t\t\tm_AirLevel--;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Set the air back to maximum\n\t\tm_AirLevel = MAX_AIR_LEVEL;\n\t\tm_AirTickTimer = DROWNING_TICKS;\n\t}\n\n\tSuper::Tick(a_Dt, a_Chunk);\n}\n"
  },
  {
    "path": "src/Mobs/Squid.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n\n\n\n\n\nclass cSquid:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tcSquid();\n\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tCLASS_PROTODEF(cSquid)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\n\t// Squids do not drown (or float)\n\tvirtual void HandleAir(void) override {}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Villager.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Villager.h\"\n#include \"../World.h\"\n#include \"../BlockArea.h\"\n#include \"../Blocks/BlockHandler.h\"\n#include \"../BlockInServerPluginInterface.h\"\n\n\n\n\n\ncVillager::cVillager(eVillagerType VillagerType) :\n\tSuper(\"Villager\", mtVillager, \"entity.villager.hurt\", \"entity.villager.death\", \"entity.villager.ambient\", 0.6f, 1.95f),\n\tm_ActionCountDown(-1),\n\tm_Type(VillagerType),\n\tm_FarmerAction(faIdling),\n\tm_Inventory(8, 1)\n{\n}\n\n\n\n\n\nbool cVillager::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tif ((a_TDI.Attacker != nullptr) && a_TDI.Attacker->IsPlayer())\n\t{\n\t\tif (GetRandomProvider().RandBool(1.0 / 6.0))\n\t\t{\n\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::VillagerShowsAnger);\n\t\t}\n\t}\n\n\tif (a_TDI.DamageType == dtLightning)\n\t{\n\t\tDestroy();\n\t\tm_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtWitch, false);\n\t\treturn true;\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cVillager::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tswitch (m_Type)\n\t{\n\t\tcase vtFarmer:\n\t\t{\n\t\t\tTickFarmer();\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cVillager::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\n\t// TODO: 0% chance on Easy, 50% chance on Normal and 100% chance on Hard\n\tif (GetRandomProvider().RandBool(0.5) && (a_TDI.Attacker != nullptr) && (a_TDI.Attacker->IsMob()))\n\t{\n\t\teMonsterType MonsterType = (static_cast<cMonster *>(a_TDI.Attacker)->GetMobType());\n\t\tif ((MonsterType == mtZombie) || (MonsterType == mtZombieVillager))\n\t\t{\n\t\t\tm_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtZombieVillager, false);\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Farmer functions:\n\nvoid cVillager::TickFarmer()\n{\n\n\t// Don't harvest crops if you must not\n\tif (!m_World->VillagersShouldHarvestCrops())\n\t{\n\t\treturn;\n\t}\n\n\t// This is to prevent undefined behaviors\n\tif (m_FinalDestination.y <= 0)\n\t{\n\t\treturn;\n\t}\n\n\tif (!IsIdling())\n\t{\n\t\t// Forcing the farmer to go to work spots.\n\t\tMoveToPosition(static_cast<Vector3d>(m_CropsPos) + Vector3d(0.5, 0, 0.5));\n\n\t\t// Forcing the farmer to look at the work spots.\n\t\tVector3d Direction = (m_FinalDestination - (GetPosition() + Vector3d(0, 1.6, 0)));  // We get the direction from the eyes of the farmer to the work spot.\n\t\tDirection.Normalize();\n\t\tSetPitch(std::asin(-Direction.y) / M_PI * 180);\n\t}\n\n\t// Updating the timer\n\tif (m_ActionCountDown > -1)\n\t{\n\t\tm_ActionCountDown--;\n\t}\n\n\t// Searching for work in blocks where the farmer goes.\n\tif (IsHarvestable(m_FinalDestination.Floor()))\n\t{\n\t\tm_CropsPos = m_FinalDestination.Floor();\n\t\tm_FarmerAction = faHarvesting;\n\t\tHandleFarmerTryHarvestCrops();\n\t\treturn;\n\t}\n\telse if (IsPlantable(m_FinalDestination.Floor()) && CanPlantCrops())\n\t{\n\t\tm_CropsPos = m_FinalDestination.Floor();\n\t\tm_FarmerAction = faPlanting;\n\t\tHandleFarmerTryPlaceCrops();\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tm_FarmerAction = faIdling;  // Returning to idling.\n\t}\n\n\n\t// Don't always try to do a special action. Each tick has 10% to do a special action.\n\tif (GetRandomProvider().RandBool(FARMER_SPECIAL_ACTION_CHANCE))\n\t{\n\t\tScanAreaForWork();\n\t}\n\n}\n\n\n\n\n\nvoid cVillager::ScanAreaForWork()\n{\n\n\tauto Pos = GetPosition().Floor();\n\tauto MinPos = Pos - FARMER_SCAN_CROPS_DIST;\n\tauto MaxPos = Pos + FARMER_SCAN_CROPS_DIST;\n\n\t// Read area to be checked for crops.\n\tcBlockArea Surrounding;\n\tSurrounding.Read(\n\t\t*m_World,\n\t\tMinPos, MaxPos\n\t);\n\n\tfor (int I = 0; I < FARMER_RANDOM_TICK_SPEED; I++)\n\t{\n\t\tfor (int Y = MinPos.y; Y <= MaxPos.y; Y++)\n\t\t{\n\t\t\t// Pick random coordinates and check for crops.\n\t\t\tVector3i CandidatePos(MinPos.x + m_World->GetTickRandomNumber(MaxPos.x - MinPos.x - 1), Y, MinPos.z + m_World->GetTickRandomNumber(MaxPos.z - MinPos.z - 1));\n\n\t\t\t// A villager can harvest this.\n\t\t\tif (IsHarvestable(CandidatePos))\n\t\t\t{\n\t\t\t\tm_CropsPos = CandidatePos;\n\t\t\t\tm_FarmerAction = faHarvesting;\n\t\t\t\tMoveToPosition(static_cast<Vector3d>(m_CropsPos) + Vector3d(0.5, 0, 0.5));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// A villager can plant this.\n\t\t\telse if (IsPlantable(CandidatePos) && CanPlantCrops())\n\t\t\t{\n\t\t\t\tm_CropsPos = CandidatePos;\n\t\t\t\tm_FarmerAction = faHarvesting;\n\t\t\t\tMoveToPosition(static_cast<Vector3d>(m_CropsPos) + Vector3d(0.5, 0, 0.5));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t}  // for Y\n\t}  // Repeat the proccess according to the random tick speed.\n}\n\n\n\n\n\nvoid cVillager::HandleFarmerTryHarvestCrops()\n{\n\tif (m_ActionCountDown > 0)\n\t{\n\t\t// The farmer is still on cooldown\n\t\treturn;\n\t}\n\n\t// Harvest the crops if it is closer than 1 block.\n\tif ((GetPosition() - m_CropsPos).Length() < 1)\n\t{\n\t\t// Check if the blocks didn't change while the villager was walking to the coordinates.\n\t\tif (IsHarvestable(m_CropsPos))\n\t\t{\n\t\t\tm_World->BroadcastSoundParticleEffect(EffectID::PARTICLE_BLOCK_BREAK, m_CropsPos, m_World->GetBlock(m_CropsPos));\n\t\t\tm_World->DropBlockAsPickups(m_CropsPos, this, nullptr);\n\t\t\t// Applying 0.5 second cooldown.\n\t\t\tm_ActionCountDown = 10;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cVillager::CheckForNearbyCrops()\n{\n\n\t// Search for adjacent crops\n\n\tconstexpr std::array<Vector3i, 4> Directions = { Vector3i{0, 0, -1}, {0, 0, 1}, {1, 0, 0}, {-1, 0, 0} };\n\n\tfor (Vector3i Direction : Directions)\n\t{\n\t\tif (IsHarvestable(m_CropsPos + Direction))\n\t\t{\n\t\t\tm_CropsPos += Direction;\n\t\t\tm_FarmerAction = faHarvesting;\n\t\t\tMoveToPosition(static_cast<Vector3d>(m_CropsPos) + Vector3d(0.5, 0, 0.5));\n\t\t\treturn;\n\t\t}\n\t\telse if (IsPlantable(m_CropsPos + Direction) && CanPlantCrops())\n\t\t{\n\t\t\tm_CropsPos += Direction;\n\t\t\tm_FarmerAction = faPlanting;\n\t\t\tMoveToPosition(static_cast<Vector3d>(m_CropsPos) + Vector3d(0.5, 0, 0.5));\n\t\t\treturn;\n\t\t}\n\n\t}\n\n\t// There is no more work to do around the previous crops.\n\tm_FarmerAction = faIdling;\n}\n\n\n\n\n\nvoid cVillager::HandleFarmerTryPlaceCrops()\n{\n\n\tif ((GetPosition() - m_CropsPos).Length() > 1)\n\t{\n\t\t// The farmer is still to far from the final destination\n\t\treturn;\n\t}\n\n\tif (m_ActionCountDown > 0)\n\t{\n\t\t// The farmer is still on cooldown\n\t\treturn;\n\t}\n\n\t// Check if there is still farmland at the spot where the crops were.\n\tif (IsPlantable(m_CropsPos))\n\t{\n\t\t// Finding the item to use to plant a crop\n\t\tint TargetSlot = -1;\n\t\tBLOCKTYPE CropBlockType = E_BLOCK_AIR;\n\n\t\tfor (int I = 0; I < m_Inventory.GetWidth() && TargetSlot < 0; I++)\n\t\t{\n\t\t\tconst cItem & Slot = m_Inventory.GetSlot(I);\n\t\t\tswitch (Slot.m_ItemType)\n\t\t\t{\n\t\t\t\tcase E_ITEM_SEEDS:\n\t\t\t\t{\n\t\t\t\t\tTargetSlot = I;\n\t\t\t\t\tCropBlockType = E_BLOCK_CROPS;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase E_ITEM_BEETROOT_SEEDS:\n\t\t\t\t{\n\t\t\t\t\tTargetSlot = I;\n\t\t\t\t\tCropBlockType = E_BLOCK_BEETROOTS;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase E_ITEM_POTATO:\n\t\t\t\t{\n\t\t\t\t\tTargetSlot = I;\n\t\t\t\t\tCropBlockType = E_BLOCK_POTATOES;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase E_ITEM_CARROT:\n\t\t\t\t{\n\t\t\t\t\tTargetSlot = I;\n\t\t\t\t\tCropBlockType = E_BLOCK_CARROTS;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Removing item from villager inventory\n\t\tm_Inventory.RemoveOneItem(TargetSlot);\n\n\t\t// Placing crop block\n\t\tm_World->SetBlock(m_CropsPos, CropBlockType, 0);\n\n\t\t// Applying 1 second cooldown\n\t\tm_ActionCountDown = 20;\n\n\t\t// Try to do the same with adjacent crops.\n\t\tCheckForNearbyCrops();\n\t}\n}\n\n\n\n\n\nbool cVillager::CanPlantCrops()\n{\n\treturn m_Inventory.HasItems(cItem(E_ITEM_SEEDS)) ||\n\t\tm_Inventory.HasItems(cItem(E_ITEM_BEETROOT_SEEDS)) ||\n\t\tm_Inventory.HasItems(cItem(E_ITEM_POTATO)) ||\n\t\tm_Inventory.HasItems(cItem(E_ITEM_CARROT));\n}\n\n\n\n\n\nbool cVillager::IsBlockFarmable(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_BEETROOTS:\n\t\t{\n\t\t\t// The crop must have fully grown up.\n\t\t\treturn a_BlockMeta == 0x03;\n\t\t}\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_POTATOES:\n\t\tcase E_BLOCK_CARROTS:\n\t\t{\n\t\t\t// The crop must have fully grown up.\n\t\t\treturn a_BlockMeta == 0x07;\n\t\t}\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nbool cVillager::IsHarvestable(Vector3i a_CropsPos)\n{\n\treturn IsBlockFarmable(m_World->GetBlock(a_CropsPos), m_World->GetBlockMeta(a_CropsPos));\n}\n\n\n\n\n\nbool cVillager::IsPlantable(Vector3i a_CropsPos)\n{\n\treturn (m_World->GetBlock(a_CropsPos.addedY(-1)) == E_BLOCK_FARMLAND) && (m_World->GetBlock(a_CropsPos) == E_BLOCK_AIR);\n}\n\n\n\n\n\ncVillager::eVillagerType cVillager::GetRandomProfession()\n{\n\tint Profession = GetRandomProvider().RandInt(cVillager::eVillagerType::vtMax - 1);\n\n\treturn static_cast<cVillager::eVillagerType>(Profession);\n}\n"
  },
  {
    "path": "src/Mobs/Villager.h",
    "content": "\n#pragma once\n\n#include \"PassiveMonster.h\"\n#include \"../Blocks/ChunkInterface.h\"\n#include \"../Inventory.h\"\n\n\n\n\nclass cVillager:\n\tpublic cPassiveMonster\n{\n\tusing Super = cPassiveMonster;\n\npublic:\n\n\tenum eVillagerType\n\t{\n\t\tvtFarmer     = 0,\n\t\tvtLibrarian  = 1,\n\t\tvtPriest     = 2,\n\t\tvtBlacksmith = 3,\n\t\tvtButcher    = 4,\n\t\tvtGeneric    = 5,\n\t\tvtMax\n\t} ;\n\n\tcVillager(eVillagerType VillagerType);\n\n\tCLASS_PROTODEF(cVillager)\n\n\t/** Returns a random Profession. */\n\tstatic eVillagerType GetRandomProfession();\n\n\t// cEntity overrides\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\tvirtual void Tick        (std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void KilledBy    (TakeDamageInfo & a_TDI) override;\n\n\t// cVillager functions\n\t/** Returns the villager hidden inventory (8 slots). */\n\tcItemGrid & GetInventory(void) { return m_Inventory; }\n\tconst cItemGrid & GetInventory(void) const { return m_Inventory; }\n\n\t/** Returns true if the given blocktype are: crops, potatoes or carrots and they have full grown up. */\n\tbool IsBlockFarmable(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** Returns true if the block at the given location is a fully grown up crop. */\n\tbool IsHarvestable(Vector3i a_CropsPos);\n\n\t/** Returns true if seeds can be planted at a given location. */\n\tbool IsPlantable(Vector3i a_CropsPos);\n\n\t// Farmer functions\n\tenum eFarmerAction\n\t{\n\t\tfaIdling,\n\t\tfaPlanting,\n\t\tfaHarvesting,\n\t} ;\n\n\tstatic const int FARMER_RANDOM_TICK_SPEED = 5;\n\t/** With 10% chance, it takes about 20 seconds to find a spot. */\n\tstatic constexpr double FARMER_SPECIAL_ACTION_CHANCE = 0.1;\n\t/** This distance from the Villager makes for a 31x3x31 area. */\n\tstatic constexpr Vector3i FARMER_SCAN_CROPS_DIST {15, 1, 15};\n\n\t/** Tick function for farmers. */\n\tvoid TickFarmer();\n\n\t/** Searches in a 31x3x31 area to harvest crops or spaces to plant crops. If it found some it will navigate to them. */\n\tvoid ScanAreaForWork();\n\n\t/** Looks if the farmer has reached it's destination, and if it's still crops and the destination is closer then 1 block it will harvest them. */\n\tvoid HandleFarmerTryHarvestCrops();\n\n\t/** Looks if the farmer has reached it's destination, and if it's still non obstructed farmland and the destination is closer then 1 block it will plant crops. */\n\tvoid HandleFarmerTryPlaceCrops();\n\n\t/** Checking for harvesting or planting nearby crops */\n\tvoid CheckForNearbyCrops();\n\n\t/** Returns whether the farmer has crops in his inventory to plant. */\n\tbool CanPlantCrops();\n\n\t/** Returns whether the farmer is not working. */\n\tbool IsIdling()\n\t{\n\t\treturn m_FarmerAction == faIdling;\n\t}\n\n\t// Get and set functions.\n\tint           GetVilType(void)      const { return m_Type; }\n\teFarmerAction GetFarmerAction(void) const { return m_FarmerAction; }\n\nprivate:\n\n\tint m_ActionCountDown;\n\tint m_Type;\n\teFarmerAction m_FarmerAction;\n\tVector3i m_CropsPos;\n\tcItemGrid m_Inventory;\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Witch.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Witch.h\"\n#include \"../FastRandom.h\"\n\n\n\n\n\ncWitch::cWitch(void) :\n\tSuper(\"Witch\", mtWitch, \"entity.witch.hurt\", \"entity.witch.death\", \"entity.witch.ambient\", 0.6f, 1.95f)\n{\n}\n\n\n\n\n\nvoid cWitch::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tauto & r1 = GetRandomProvider();\n\tint DropTypeCount = r1.RandInt(1, 3);\n\tfor (int i = 0; i < DropTypeCount; i++)\n\t{\n\t\tint DropType = r1.RandInt(6);\n\t\tswitch (DropType)\n\t\t{\n\t\t\tcase 0: AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GLASS_BOTTLE); break;\n\t\t\tcase 1: AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GLOWSTONE_DUST); break;\n\t\t\tcase 2: AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GUNPOWDER); break;\n\t\t\tcase 3: AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_REDSTONE_DUST); break;\n\t\t\tcase 4: AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_SPIDER_EYE); break;\n\t\t\tcase 5: AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_STICK); break;\n\t\t\tcase 6: AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_SUGAR); break;\n\t\t}\n\t}\n\tAddRandomWeaponDropItem(a_Drops, LootingLevel);\n}\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Witch.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cWitch:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcWitch();\n\n\tCLASS_PROTODEF(cWitch)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\n\tbool IsAngry(void) const {return ((m_EMState == ATTACKING) || (m_EMState == CHASING)); }\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Wither.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Wither.h\"\n\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../ClientHandle.h\"\n#include \"../CompositeChat.h\"\n\n\n\n\n\ncWither::cWither(void) :\n\tSuper(\"Wither\", mtWither, \"entity.wither.hurt\", \"entity.wither.death\", \"entity.wither.ambient\", 0.9f, 3.5f),\n\tm_WitherInvulnerableTicks(220)\n{\n\tSetMaxHealth(300);\n\tSetHealth(GetMaxHealth() / 3);\n}\n\n\n\n\n\nbool cWither::IsArmored(void) const\n{\n\treturn GetHealth() <= (GetMaxHealth() / 2);\n}\n\n\n\n\n\nbool cWither::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tif (a_TDI.DamageType == dtDrowning)\n\t{\n\t\treturn false;\n\t}\n\n\tif (m_WitherInvulnerableTicks > 0)\n\t{\n\t\treturn false;\n\t}\n\n\tif (IsArmored() && (a_TDI.DamageType == dtRangedAttack))\n\t{\n\t\treturn false;\n\t}\n\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tm_World->BroadcastBossBarUpdateHealth(*this, GetUniqueID(), GetHealth() / GetMaxHealth());\n\treturn true;\n}\n\n\n\n\n\nvoid cWither::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tAddRandomDropItem(a_Drops, 1, 1, E_ITEM_NETHER_STAR);\n}\n\n\n\n\n\nvoid cWither::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\n\tVector3d Pos = GetPosition();\n\tm_World->ForEachPlayer([=](cPlayer & a_Player)\n\t\t{\n\t\t\t// TODO 2014-05-21 xdot: Vanilla minecraft uses an AABB check instead of a radius one\n\t\t\tdouble Dist = (a_Player.GetPosition() - Pos).Length();\n\t\t\tif (Dist < 50.0)\n\t\t\t{\n\t\t\t\t// If player is close, award achievement\n\t\t\t\ta_Player.AwardAchievement(CustomStatistic::AchKillWither);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWither::SpawnOn(cClientHandle & a_Client)\n{\n\tSuper::SpawnOn(a_Client);\n\n\t// Purple boss bar with no divisions that darkens the sky:\n\ta_Client.SendBossBarAdd(GetUniqueID(), cCompositeChat(\"Wither\"), GetHealth() / GetMaxHealth(), BossBarColor::Purple, BossBarDivisionType::None, true, false, false);\n}\n\n\n\n\n\nvoid cWither::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (m_WitherInvulnerableTicks > 0)\n\t{\n\t\tunsigned int NewTicks = m_WitherInvulnerableTicks - 1;\n\n\t\tif (NewTicks == 0)\n\t\t{\n\t\t\tm_World->DoExplosionAt(7.0, GetPosX(), GetPosY(), GetPosZ(), false, esWitherBirth, this);\n\t\t}\n\n\t\tm_WitherInvulnerableTicks = NewTicks;\n\n\t\tif ((NewTicks % 10) == 0)\n\t\t{\n\t\t\tHeal(10);\n\t\t}\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n}\n"
  },
  {
    "path": "src/Mobs/Wither.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cWither:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcWither();\n\n\tCLASS_PROTODEF(cWither)\n\n\tunsigned int GetWitherInvulnerableTicks(void) const { return m_WitherInvulnerableTicks; }\n\n\tvoid SetWitherInvulnerableTicks(unsigned int a_Ticks) { m_WitherInvulnerableTicks = a_Ticks; }\n\n\t/** Returns whether the wither is invulnerable to arrows. */\n\tbool IsArmored(void) const;\n\n\t// cEntity overrides\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool IsUndead(void) override { return true; }\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\tvirtual void SpawnOn(cClientHandle & a_Client) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\nprivate:\n\n\t/** The number of ticks of invulnerability left after being initially created. Zero once invulnerability has expired. */\n\tunsigned int m_WitherInvulnerableTicks;\n\n} ;\n"
  },
  {
    "path": "src/Mobs/WitherSkeleton.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"WitherSkeleton.h\"\n#include \"../World.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\ncWitherSkeleton::cWitherSkeleton(void) :\n\tSuper(\"WitherSkeleton\", mtWitherSkeleton, \"entity.wither_skeleton.hurt\", \"entity.wither_skeleton.death\", \"entity.wither_skeleton.ambient\", 0.7f, 2.4f)\n{\n}\n\n\n\n\n\nbool cWitherSkeleton::Attack(std::chrono::milliseconds a_Dt)\n{\n\tif (GetTarget() == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\tGetTarget()->AddEntityEffect(cEntityEffect::effWither, 200, 0);\n\treturn Super::Attack(a_Dt);\n}\n\n\n\n\n\nvoid cWitherSkeleton::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomUncommonDropItem(a_Drops, 33.0f, E_ITEM_COAL);\n\tAddRandomUncommonDropItem(a_Drops, 8.5f, E_ITEM_STONE_SWORD, GetRandomProvider().RandInt<short>(50));\n\n\tcItems RareDrops;\n\tRareDrops.Add(cItem(E_ITEM_HEAD, 1, 1));\n\tAddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);\n\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_BONE);\n\tAddRandomArmorDropItem(a_Drops, LootingLevel);\n\tAddRandomWeaponDropItem(a_Drops, LootingLevel);\n}\n\n\n\n\n\nvoid cWitherSkeleton::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\tSuper::SpawnOn(a_ClientHandle);\n\ta_ClientHandle.SendEntityEquipment(*this, 0, cItem(E_ITEM_STONE_SWORD));\n}\n"
  },
  {
    "path": "src/Mobs/WitherSkeleton.h",
    "content": "\n#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cWitherSkeleton:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcWitherSkeleton();\n\n\tCLASS_PROTODEF(cWitherSkeleton)\n\nprivate:\n\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool IsNetherNative(void) override { return true; }\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n} ;\n"
  },
  {
    "path": "src/Mobs/Wolf.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Wolf.h\"\n#include \"../World.h\"\n#include \"../Entities/Player.h\"\n#include \"../Items/ItemHandler.h\"\n#include \"../Items/ItemSpawnEgg.h\"\n\n\n\n\n\ncWolf::cWolf(void) :\n\tSuper(\"Wolf\", mtWolf, \"entity.wolf.hurt\", \"entity.wolf.death\", \"entity.wolf.ambient\", 0.6f, 0.85f),\n\tm_IsSitting(false),\n\tm_IsTame(false),\n\tm_IsBegging(false),\n\tm_IsAngry(false),\n\tm_CollarColor(E_META_DYE_ORANGE),\n\tm_NotificationCooldown(0)\n{\n}\n\n\n\n\n\nbool cWolf::DoTakeDamage(TakeDamageInfo & a_TDI)\n{\n\tcPawn * PreviousTarget = GetTarget();\n\tif (!Super::DoTakeDamage(a_TDI))\n\t{\n\t\treturn false;\n\t}\n\n\tif ((a_TDI.Attacker != nullptr) && a_TDI.Attacker->IsPawn())\n\t{\n\t\tauto currTarget = GetTarget();\n\t\tif ((currTarget != nullptr) && currTarget->IsPlayer())\n\t\t{\n\t\t\tif (m_IsTame)\n\t\t\t{\n\t\t\t\tif ((static_cast<cPlayer*>(currTarget)->GetUUID() == m_OwnerUUID))\n\t\t\t\t{\n\t\t\t\t\tSetTarget(PreviousTarget);  // Do not attack owner\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSetIsSitting(false);\n\t\t\t\t\tNotifyAlliesOfFight(static_cast<cPawn*>(a_TDI.Attacker));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_IsAngry = true;\n\t\t\t}\n\t\t}\n\t\telse if (m_IsTame)\n\t\t{\n\t\t\tSetIsSitting(false);\n\t\t\tNotifyAlliesOfFight(static_cast<cPawn*>(a_TDI.Attacker));\n\t\t}\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);  // Broadcast health and possibly angry face\n\treturn true;\n}\n\n\n\n\n\nvoid cWolf::NotifyAlliesOfFight(cPawn * a_Opponent)\n{\n\tif (GetOwnerName() == \"\")\n\t{\n\t\treturn;\n\t}\n\tm_NotificationCooldown = 15;\n\n\tm_World->DoWithPlayerByUUID(m_OwnerUUID, [=](cPlayer & a_Player)\n\t\t{\n\t\t\ta_Player.NotifyNearbyWolves(a_Opponent, false);\n\t\t\treturn false;\n\t\t}\n\t);\n}\n\n\n\n\n\nbool cWolf::Attack(std::chrono::milliseconds a_Dt)\n{\n\tUNUSED(a_Dt);\n\n\tif ((GetTarget() != nullptr) && (GetTarget()->IsPlayer()))\n\t{\n\t\tif (static_cast<cPlayer *>(GetTarget())->GetUUID() == m_OwnerUUID)\n\t\t{\n\t\t\tSetTarget(nullptr);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tNotifyAlliesOfFight(static_cast<cPawn*>(GetTarget()));\n\treturn Super::Attack(a_Dt);\n\n}\n\n\n\n\n\nvoid cWolf::ReceiveNearbyFightInfo(const cUUID & a_PlayerID, cPawn * a_Opponent, bool a_IsPlayerInvolved)\n{\n\tif (\n\t\t(a_Opponent == nullptr) || IsSitting() || (!IsTame()) ||\n\t\t(!a_Opponent->IsPawn()) || (a_PlayerID != m_OwnerUUID)\n\t)\n\t{\n\t\treturn;\n\t}\n\n\t// If we already have a target\n\tif (GetTarget() != nullptr)\n\t{\n\t\t// If a wolf is asking for help and we already have a target, do nothing\n\t\tif (!a_IsPlayerInvolved)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t// If a player is asking for help and we already have a target,\n\t\t// there's a 50% chance of helping and a 50% chance of doing nothing\n\t\t// This helps spread a wolf pack's targets over several mobs\n\t\telse if (GetRandomProvider().RandBool())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (a_Opponent->IsPlayer() && static_cast<cPlayer *>(a_Opponent)->GetUUID() == m_OwnerUUID)\n\t{\n\t\treturn;  // Our owner has hurt himself, avoid attacking them.\n\t}\n\n\tif (a_Opponent->IsMob() && static_cast<cMonster *>(a_Opponent)->GetMobType() == mtWolf)\n\t{\n\t\tcWolf * Wolf = static_cast<cWolf *>(a_Opponent);\n\t\tif (Wolf->GetOwnerUUID() == GetOwnerUUID())\n\t\t{\n\t\t\treturn;  // Our owner attacked one of their wolves. Abort attacking wolf.\n\t\t}\n\t}\n\n\tSetTarget(a_Opponent);\n\n\n}\n\n\n\n\n\nvoid cWolf::OnRightClicked(cPlayer & a_Player)\n{\n\tcMonster::OnRightClicked(a_Player);\n\tconst cItem & EquippedItem = a_Player.GetEquippedItem();\n\tconst int EquippedItemType = EquippedItem.m_ItemType;\n\n\tif (!IsTame() && !IsAngry())\n\t{\n\t\t// If the player is holding a bone, try to tame the wolf:\n\t\tif (EquippedItemType == E_ITEM_BONE)\n\t\t{\n\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t{\n\t\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t\t}\n\n\t\t\tif (GetRandomProvider().RandBool(0.125))\n\t\t\t{\n\t\t\t\t// Taming succeeded\n\t\t\t\tSetMaxHealth(20);\n\t\t\t\tSetIsTame(true);\n\t\t\t\tSetOwner(a_Player.GetName(), a_Player.GetUUID());\n\t\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::WolfTamingSucceeds);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Taming failed\n\t\t\t\tm_World->BroadcastEntityAnimation(*this, EntityAnimation::WolfTamingFails);\n\t\t\t}\n\t\t}\n\t}\n\telse if (IsTame())\n\t{\n\t\tif (a_Player.GetUUID() == m_OwnerUUID)\n\t\t{\n\t\t\tcMonster::RightClickFeed(a_Player);\n\t\t}\n\t\t// Feed the wolf, restoring its health, or dye its collar:\n\t\tswitch (EquippedItemType)\n\t\t{\n\t\t\tcase E_ITEM_RAW_BEEF:\n\t\t\tcase E_ITEM_STEAK:\n\t\t\tcase E_ITEM_RAW_PORKCHOP:\n\t\t\tcase E_ITEM_COOKED_PORKCHOP:\n\t\t\tcase E_ITEM_RAW_CHICKEN:\n\t\t\tcase E_ITEM_COOKED_CHICKEN:\n\t\t\tcase E_ITEM_ROTTEN_FLESH:\n\t\t\tcase E_ITEM_RAW_MUTTON:\n\t\t\tcase E_ITEM_RAW_RABBIT:\n\t\t\tcase E_ITEM_COOKED_RABBIT:\n\t\t\tcase E_ITEM_COOKED_MUTTON:\n\t\t\t{\n\t\t\t\tif (m_Health < m_MaxHealth)\n\t\t\t\t{\n\t\t\t\t\tHeal(EquippedItem.GetHandler().GetFoodInfo(&EquippedItem).FoodLevel);\n\t\t\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (a_Player.GetUUID() == m_OwnerUUID)  // Is the player the owner of the dog?\n\t\t\t\t{\n\t\t\t\t\tif (IsBaby())\n\t\t\t\t\t{\n\t\t\t\t\t\tm_AgingTimer = FloorC(m_AgingTimer * 0.9);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase E_ITEM_DYE:\n\t\t\t{\n\t\t\t\tif (a_Player.GetUUID() == m_OwnerUUID)  // Is the player the owner of the dog?\n\t\t\t\t{\n\t\t\t\t\tSetCollarColor(EquippedItem.m_ItemDamage);\n\t\t\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Multiplication is handled in cMonster. Just prevents from sitting down.\n\t\t\tcase E_ITEM_SPAWN_EGG:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tif (a_Player.GetUUID() == m_OwnerUUID)  // Is the player the owner of the dog?\n\t\t\t\t{\n\t\t\t\t\tSetIsSitting(!IsSitting());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ((EquippedItemType == E_ITEM_SPAWN_EGG) && (!IsTame()))\n\t{\n\t\teMonsterType MonsterType = cItemSpawnEggHandler::ItemDamageToMonsterType(EquippedItem.m_ItemDamage);\n\t\tif (\n\t\t\t(MonsterType == m_MobType) &&\n\t\t\t(m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), m_MobType, true) != cEntity::INVALID_ID))  // Spawning succeeded\n\t\t{\n\t\t\tif (!a_Player.IsGameModeCreative())\n\t\t\t{\n\t\t\t\t// The mob was spawned, \"use\" the item:\n\t\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t\t}\n\t\t}\n\t}\n\n\tm_World->BroadcastEntityMetadata(*this);\n}\n\n\n\n\n\nvoid cWolf::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tif (!IsAngry())\n\t{\n\t\tcMonster::Tick(a_Dt, a_Chunk);\n\t\tif (m_NotificationCooldown > 0)\n\t\t{\n\t\t\tm_NotificationCooldown -= 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tSuper::Tick(a_Dt, a_Chunk);\n\t}\n\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tif (GetTarget() == nullptr)\n\t{\n\t\tm_World->DoWithNearestPlayer(GetPosition(), static_cast<float>(m_SightDistance), [&](cPlayer & a_Player) -> bool\n\t\t{\n\t\t\tswitch (a_Player.GetEquippedItem().m_ItemType)\n\t\t\t{\n\t\t\t\tcase E_ITEM_BONE:\n\t\t\t\tcase E_ITEM_RAW_BEEF:\n\t\t\t\tcase E_ITEM_STEAK:\n\t\t\t\tcase E_ITEM_RAW_CHICKEN:\n\t\t\t\tcase E_ITEM_COOKED_CHICKEN:\n\t\t\t\tcase E_ITEM_ROTTEN_FLESH:\n\t\t\t\tcase E_ITEM_RAW_PORKCHOP:\n\t\t\t\tcase E_ITEM_COOKED_PORKCHOP:\n\t\t\t\t{\n\t\t\t\t\tif (!IsBegging())\n\t\t\t\t\t{\n\t\t\t\t\t\tSetIsBegging(true);\n\t\t\t\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t\t\t\t}\n\n\t\t\t\t\tm_FinalDestination = a_Player.GetPosition();  // So that we will look at a player holding food\n\n\t\t\t\t\t// Don't move to the player if the wolf is sitting.\n\t\t\t\t\tif (!IsSitting())\n\t\t\t\t\t{\n\t\t\t\t\t\tMoveToPosition(a_Player.GetPosition());\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tif (IsBegging())\n\t\t\t\t\t{\n\t\t\t\t\t\tSetIsBegging(false);\n\t\t\t\t\t\tm_World->BroadcastEntityMetadata(*this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\t}\n\telse\n\t{\n\t\tif (IsSitting())\n\t\t{\n\t\t\tSetTarget(nullptr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMoveToPosition(GetTarget()->GetPosition());\n\t\t\tif (TargetIsInRange())\n\t\t\t{\n\t\t\t\tAttack(a_Dt);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (IsTame() && !IsSitting())\n\t{\n\t\tTickFollowPlayer();\n\t}\n\telse if (IsSitting())\n\t{\n\t\tStopMovingToPosition();\n\t}\n\n\tcMonster::LoveTick();\n}\n\n\n\n\n\nvoid cWolf::TickFollowPlayer()\n{\n\tVector3d OwnerPos;\n\tbool OwnerFlying;\n\tauto Callback = [&](cPlayer & a_Player)\n\t{\n\t\tOwnerPos = a_Player.GetPosition();\n\t\tOwnerFlying = a_Player.IsFlying();\n\t\treturn true;\n\t};\n\n\tif (m_World->DoWithPlayerByUUID(m_OwnerUUID, Callback))\n\t{\n\t\t// The player is present in the world, follow him:\n\t\tdouble Distance = (OwnerPos - GetPosition()).Length();\n\t\tif (Distance > 20)\n\t\t{\n\t\t\tif (!OwnerFlying)\n\t\t\t{\n\t\t\t\tOwnerPos.y = FindFirstNonAirBlockPosition(OwnerPos.x, OwnerPos.z);\n\t\t\t\tTeleportToCoords(OwnerPos.x, OwnerPos.y, OwnerPos.z);\n\t\t\t\tSetTarget(nullptr);\n\t\t\t}\n\t\t}\n\t\tif (Distance < 2)\n\t\t{\n\t\t\tif (GetTarget() == nullptr)\n\t\t\t{\n\t\t\t\tStopMovingToPosition();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (GetTarget() == nullptr)\n\t\t\t{\n\t\t\t\tif (!OwnerFlying)\n\t\t\t\t{\n\t\t\t\t\tMoveToPosition(OwnerPos);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cWolf::InStateIdle(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tif (!IsTame())\n\t{\n\t\tcMonster::InStateIdle(a_Dt, a_Chunk);\n\t}\n}\n\n\n\n\n\nvoid cWolf::InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2)\n{\n\tconst auto Parent1 = static_cast<cWolf *>(a_Parent1);\n\tconst auto Parent2 = static_cast<cWolf *>(a_Parent2);\n\tif (Parent1->GetOwnerUUID() == Parent2->GetOwnerUUID())\n\t{\n\t\tSetOwner(Parent1->GetOwnerName(), Parent2->GetOwnerUUID());\n\t}\n\telse\n\t{\n\t\tauto Parent1Age = Parent1->GetAge();\n\t\tauto Parent2Age = Parent2->GetAge();\n\n\t\tif (Parent1Age > Parent2Age)\n\t\t{\n\t\t\tSetOwner(Parent2->GetOwnerName(), Parent2->GetOwnerUUID());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSetOwner(Parent1->GetOwnerName(), Parent1->GetOwnerUUID());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/Wolf.h",
    "content": "\n#pragma once\n\n#include \"PassiveAggressiveMonster.h\"\n#include \"../UUID.h\"\n\n\nclass cEntity;\n\n\n\nclass cWolf:\n\tpublic cPassiveAggressiveMonster\n{\n\tusing Super = cPassiveAggressiveMonster;\n\npublic:\n\n\tcWolf();\n\n\tCLASS_PROTODEF(cWolf)\n\n\tvoid NotifyAlliesOfFight(cPawn * a_Opponent);\n\tvirtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;\n\tvirtual void OnRightClicked(cPlayer & a_Player) override;\n\tvirtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void TickFollowPlayer();\n\tvirtual bool Attack(std::chrono::milliseconds a_Dt) override;\n\n\t// Get functions\n\tbool    IsSitting     (void) const override { return m_IsSitting; }\n\tbool    IsTame        (void) const override { return m_IsTame; }\n\tbool    IsBegging     (void) const { return m_IsBegging; }\n\tbool    IsAngry       (void) const { return m_IsAngry; }\n\tAString GetOwnerName  (void) const { return m_OwnerName; }\n\tcUUID   GetOwnerUUID  (void) const { return m_OwnerUUID; }\n\tint     GetCollarColor(void) const { return m_CollarColor; }\n\n\t// Set functions\n\tvoid SetIsSitting  (bool a_IsSitting)   { m_IsSitting = a_IsSitting; }\n\tvoid SetIsTame     (bool a_IsTame)      { m_IsTame = a_IsTame; }\n\tvoid SetIsBegging  (bool a_IsBegging)   { m_IsBegging = a_IsBegging; }\n\tvoid SetIsAngry    (bool a_IsAngry)     { m_IsAngry = a_IsAngry; }\n\tvoid SetCollarColor(int a_CollarColor)  { m_CollarColor = a_CollarColor; }\n\tvoid SetOwner      (const AString & a_NewOwnerName, const cUUID & a_NewOwnerUUID)\n\t{\n\t\tm_OwnerName = a_NewOwnerName;\n\t\tm_OwnerUUID = a_NewOwnerUUID;\n\t}\n\n\t/** Notfies the wolf of a nearby fight.\n\tThe wolf may then decide to attack a_Opponent.\n\tIf a_IsPlayerInvolved is true, then the player whose UUID is a_PlayerUUID is fighting a_Opponent\n\tIf false, then a wolf owned by the player whose UUID is a_PlayerUUID is fighting a_Opponent\n\t@param a_PlayerUUID The UUID of the fighting player, or the UUID of the owner whose wolf is fighting.\n\t@param a_Opponent The opponent who is being faught.\n\t@param a_IsPlayerInvolved Whether the fighter a player or a wolf. */\n\tvoid ReceiveNearbyFightInfo(const cUUID & a_PlayerUUID, cPawn * a_Opponent, bool a_IsPlayerInvolved);\n\n\tvirtual void InStateIdle(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\n\tvirtual void InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2) override;\n\tvirtual void GetBreedingItems(cItems & a_Items) override\n\t{\n\t\ta_Items.Add(E_ITEM_RAW_BEEF);\n\t\ta_Items.Add(E_ITEM_STEAK);\n\t\ta_Items.Add(E_ITEM_RAW_PORKCHOP);\n\t\ta_Items.Add(E_ITEM_COOKED_PORKCHOP);\n\t\ta_Items.Add(E_ITEM_RAW_CHICKEN);\n\t\ta_Items.Add(E_ITEM_COOKED_CHICKEN);\n\t\ta_Items.Add(E_ITEM_RAW_MUTTON);\n\t\ta_Items.Add(E_ITEM_COOKED_MUTTON);\n\t\ta_Items.Add(E_ITEM_RAW_RABBIT);\n\t\ta_Items.Add(E_ITEM_COOKED_RABBIT);\n\t\ta_Items.Add(E_ITEM_ROTTEN_FLESH);\n\t}\n\n\nprotected:\n\n\tbool    m_IsSitting;\n\tbool    m_IsTame;\n\tbool    m_IsBegging;\n\tbool    m_IsAngry;\n\tAString m_OwnerName;\n\tcUUID   m_OwnerUUID;\n\tint     m_CollarColor;\n\tint     m_NotificationCooldown;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/Zombie.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Zombie.h\"\n#include \"../World.h\"\n#include \"../LineBlockTracer.h\"\n\n\n\n\n\ncZombie::cZombie() :\n\tSuper(\"Zombie\", mtZombie, \"entity.zombie.hurt\", \"entity.zombie.death\", \"entity.zombie.ambient\", 0.6f, 1.95f)\n{\n}\n\n\n\n\n\nvoid cZombie::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_ROTTEN_FLESH);\n\tcItems RareDrops;\n\tRareDrops.Add(cItem(E_ITEM_IRON));\n\tRareDrops.Add(cItem(E_ITEM_CARROT));\n\tRareDrops.Add(cItem(E_ITEM_POTATO));\n\tAddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);\n\tAddRandomArmorDropItem(a_Drops, LootingLevel);\n\tAddRandomWeaponDropItem(a_Drops, LootingLevel);\n}\n"
  },
  {
    "path": "src/Mobs/Zombie.h",
    "content": "#pragma once\n\n#include \"AggressiveMonster.h\"\n\n\n\n\n\nclass cZombie:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcZombie();\n\n\tCLASS_PROTODEF(cZombie)\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool IsUndead(void) override { return true; }\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Mobs/ZombiePigman.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ZombiePigman.h\"\n#include \"../World.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncZombiePigman::cZombiePigman(void) :\n\tSuper(\"ZombiePigman\", mtZombiePigman, \"entity.zombie_pig.hurt\", \"entity.zombie_pig.death\", \"entity.zombie_pig.ambient\", 0.6f, 1.95f)\n{\n}\n\n\n\n\n\nvoid cZombiePigman::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_ROTTEN_FLESH);\n\tAddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_GOLD_NUGGET);\n\n\tcItems RareDrops;\n\tRareDrops.Add(cItem(E_ITEM_GOLD));\n\tAddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);\n\tAddRandomArmorDropItem(a_Drops, LootingLevel);\n\tAddRandomWeaponDropItem(a_Drops, LootingLevel);\n}\n\n\n\n\n\nvoid cZombiePigman::KilledBy(TakeDamageInfo & a_TDI)\n{\n\tSuper::KilledBy(a_TDI);\n\n\tif ((a_TDI.Attacker != nullptr) && (a_TDI.Attacker->IsPlayer()))\n\t{\n\t\t// TODO: Anger all nearby zombie pigmen\n\t\t// TODO: In vanilla, if one player angers ZPs, do they attack any nearby player, or only that one attacker?\n\t}\n}\n\n\n\n\n\nvoid cZombiePigman::SpawnOn(cClientHandle & a_ClientHandle)\n{\n\tSuper::SpawnOn(a_ClientHandle);\n\ta_ClientHandle.SendEntityEquipment(*this, 0, cItem(E_ITEM_GOLD_SWORD));\n}\n"
  },
  {
    "path": "src/Mobs/ZombiePigman.h",
    "content": "#pragma once\n\n#include \"PassiveAggressiveMonster.h\"\n\n\n\n\n\nclass cZombiePigman:\n\tpublic cPassiveAggressiveMonster\n{\n\tusing Super = cPassiveAggressiveMonster;\n\npublic:\n\n\tcZombiePigman();\n\n\tCLASS_PROTODEF(cZombiePigman)\n\nprivate:\n\n\tvirtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual bool IsUndead(void) override { return true; }\n\tvirtual bool IsNetherNative(void) override { return true; }\n\tvirtual void KilledBy(TakeDamageInfo & a_TDI) override;\n\tvirtual void SpawnOn(cClientHandle & a_ClientHandle) override;\n} ;\n"
  },
  {
    "path": "src/Mobs/ZombieVillager.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"ZombieVillager.h\"\n#include \"../World.h\"\n#include \"../LineBlockTracer.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\ncZombieVillager::cZombieVillager(cVillager::eVillagerType a_Profession) :\n\tSuper(\"ZombieVillager\", mtZombieVillager, \"entity.zombie_villager.hurt\", \"entity.zombie_villager.death\", \"entity.ambient\", 0.6f, 1.95f),\n\tm_ConversionTime(-1),\n\tm_Profession(a_Profession)\n{\n\tSetBurnsInDaylight(true);\n}\n\n\n\n\n\nvoid cZombieVillager::GetDrops(cItems & a_Drops, cEntity * a_Killer)\n{\n\tunsigned int LootingLevel = 0;\n\tif (a_Killer != nullptr)\n\t{\n\t\tLootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);\n\t}\n\tAddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_ROTTEN_FLESH);\n\tcItems RareDrops;\n\tRareDrops.Add(cItem(E_ITEM_IRON));\n\tRareDrops.Add(cItem(E_ITEM_CARROT));\n\tRareDrops.Add(cItem(E_ITEM_POTATO));\n\tAddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);\n\tAddRandomArmorDropItem(a_Drops, LootingLevel);\n\tAddRandomWeaponDropItem(a_Drops, LootingLevel);\n}\n\n\n\n\n\nvoid cZombieVillager::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n\tSuper::Tick(a_Dt, a_Chunk);\n\tif (!IsTicking())\n\t{\n\t\t// The base class tick destroyed us\n\t\treturn;\n\t}\n\n\tLOGD(\"Conversion time: %d\", m_ConversionTime);\n\n\tif (m_ConversionTime == 0)\n\t{\n\t\tm_World->BroadcastSoundEffect(\"entity.zombie_villager.cure\", GetPosition(), 1.0f, 1.0f);\n\t\tDestroy();\n\t\tm_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtVillager, false);\n\t}\n\telse if (m_ConversionTime > 0)\n\t{\n\t\tm_ConversionTime--;\n\t}\n}\n\n\n\n\n\nvoid cZombieVillager::OnRightClicked(cPlayer & a_Player)\n{\n\tSuper::OnRightClicked(a_Player);\n\n\tconst cItem & EquippedItem = a_Player.GetEquippedItem();\n\tif ((EquippedItem.m_ItemType == E_ITEM_GOLDEN_APPLE) && GetEntityEffect(cEntityEffect::effWeakness) != nullptr)\n\t{\n\t\tif (!a_Player.IsGameModeCreative())\n\t\t{\n\t\t\ta_Player.GetInventory().RemoveOneEquippedItem();\n\t\t}\n\n\t\tm_ConversionTime = 6000;\n\t}\n}\n"
  },
  {
    "path": "src/Mobs/ZombieVillager.h",
    "content": "#pragma once\n\n#include \"AggressiveMonster.h\"\n#include \"Villager.h\"\n\n\n\n\n\nclass cZombieVillager:\n\tpublic cAggressiveMonster\n{\n\tusing Super = cAggressiveMonster;\n\npublic:\n\n\tcZombieVillager(cVillager::eVillagerType a_Profession);\n\n\tCLASS_PROTODEF(cZombieVillager)\n\n\tvirtual void GetDrops       (cItems & a_Drops, cEntity * a_Killer = nullptr) override;\n\tvirtual void Tick           (std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;\n\tvirtual void OnRightClicked (cPlayer & a_Player) override;\n\tvirtual bool IsUndead       (void) override { return true; }\n\n\tint ConversionTime                     (void) const { return m_ConversionTime; }\n\tcVillager::eVillagerType GetProfession (void) const { return m_Profession; }\n\nprivate:\n\n\tint m_ConversionTime;\n\tcVillager::eVillagerType m_Profession;\n\n} ;\n"
  },
  {
    "path": "src/MonsterConfig.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"MonsterConfig.h\"\n#include \"Mobs/Monster.h\"\n#include \"IniFile.h\"\n\n\n\n\n\nstruct cMonsterConfig::sAttributesStruct\n{\n\tAString m_Name;\n\tint     m_SightDistance;\n\tint     m_AttackDamage;\n\tdouble  m_AttackRange;\n\tdouble  m_AttackRate;\n\tdouble  m_MaxHealth;\n\tdouble  m_BaseWalkSpeed;\n\tdouble  m_BaseRunSpeed;\n\tbool    m_IsFireproof;\n\tbool    m_BurnsInDaylight;\n};\n\n\n\n\n\nstruct cMonsterConfig::sMonsterConfigState\n{\n\tAString MonsterTypes;\n\tstd::list< sAttributesStruct > AttributesList;\n};\n\n\n\n\n\ncMonsterConfig::cMonsterConfig(void)\n\t: m_pState( new sMonsterConfigState)\n{\n\tInitialize();\n}\n\n\n\n\n\ncMonsterConfig::~cMonsterConfig()\n{\n\tdelete m_pState;\n\tm_pState = nullptr;\n}\n\n\n\n\n\nvoid cMonsterConfig::Initialize()\n{\n\tcIniFile MonstersIniFile;\n\n\tif (!MonstersIniFile.ReadFile(\"monsters.ini\"))\n\t{\n\t\tLOGWARNING(\"%s: Cannot read monsters.ini file, monster attributes not available\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tfor (int i = static_cast<int>(MonstersIniFile.GetNumKeys()); i >= 0; i--)\n\t{\n\t\tsAttributesStruct Attributes;\n\t\tAString Name = MonstersIniFile.GetKeyName(i);\n\t\tAttributes.m_Name = Name;\n\t\tAttributes.m_AttackDamage    = MonstersIniFile.GetValueI(Name, \"AttackDamage\",    0);\n\t\tAttributes.m_AttackRange     = MonstersIniFile.GetValueI(Name, \"AttackRange\",     0);\n\t\tAttributes.m_SightDistance   = MonstersIniFile.GetValueI(Name, \"SightDistance\",   0);\n\t\tAttributes.m_AttackRate      = MonstersIniFile.GetValueF(Name, \"AttackRate\",      0);\n\t\tAttributes.m_MaxHealth       = MonstersIniFile.GetValueF(Name, \"MaxHealth\",       1);\n\t\tAttributes.m_BaseWalkSpeed   = MonstersIniFile.GetValueF(Name, \"WalkSpeed\",       1);\n\t\tAttributes.m_BaseRunSpeed    = MonstersIniFile.GetValueF(Name, \"RunSpeed\",        Attributes.m_BaseWalkSpeed);\n\t\tAttributes.m_IsFireproof     = MonstersIniFile.GetValueB(Name, \"IsFireproof\",     false);\n\t\tAttributes.m_BurnsInDaylight = MonstersIniFile.GetValueB(Name, \"BurnsInDaylight\", false);\n\t\tm_pState->AttributesList.push_front(Attributes);\n\t}  // for i - SplitList[]\n}\n\n\n\n\n\nvoid cMonsterConfig::AssignAttributes(cMonster * a_Monster, const AString & a_Name)\n{\n\tstd::list<sAttributesStruct>::const_iterator itr;\n\tfor (itr = m_pState->AttributesList.begin(); itr != m_pState->AttributesList.end(); ++itr)\n\t{\n\t\tif (itr->m_Name.compare(a_Name) == 0)\n\t\t{\n\t\t\ta_Monster->SetAttackDamage   (itr->m_AttackDamage);\n\t\t\ta_Monster->SetAttackRange    (itr->m_AttackRange);\n\t\t\ta_Monster->SetSightDistance  (itr->m_SightDistance);\n\t\t\ta_Monster->SetAttackRate     (static_cast<float>(itr->m_AttackRate));\n\t\t\ta_Monster->SetMaxHealth      (static_cast<float>(itr->m_MaxHealth));\n\t\t\ta_Monster->SetBaseWalkSpeed  (itr->m_BaseWalkSpeed);\n\t\t\ta_Monster->SetBaseRunSpeed   (itr->m_BaseRunSpeed);\n\t\t\ta_Monster->SetIsFireproof    (itr->m_IsFireproof);\n\t\t\ta_Monster->SetBurnsInDaylight(itr->m_BurnsInDaylight);\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_pState->AttributesList[]\n}\n\n\n\n\n"
  },
  {
    "path": "src/MonsterConfig.h",
    "content": "\n#pragma once\n\n\n\n\n\n// fwd:\nclass cMonster;\n\n\n\n\n\nclass cMonsterConfig\n{\npublic:\n\tcMonsterConfig(void);\n\t~cMonsterConfig();\n\n\tvoid AssignAttributes(cMonster * a_Monster, const AString & a_Name);\n\nprivate:\n\tstruct sAttributesStruct;\n\tstruct sMonsterConfigState;\n\tsMonsterConfigState * m_pState;\n\tvoid Initialize();\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/NetherPortalScanner.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"NetherPortalScanner.h\"\n#include \"BlockInfo.h\"\n#include \"Entities/Entity.h\"\n#include \"World.h\"\n\n\n\n\n\nconst double cNetherPortalScanner::OutOffset = 0.5;\nconst double cNetherPortalScanner::AcrossOffset = 0.5;\n\n\n\n\n\ncNetherPortalScanner::cNetherPortalScanner(cEntity & a_MovingEntity, cWorld & a_DestinationWorld, Vector3d a_DestPosition, int a_MaxY) :\n\tm_EntityID(a_MovingEntity.GetUniqueID()),\n\tm_SourceWorld(*a_MovingEntity.GetWorld()),\n\tm_World(a_DestinationWorld),\n\tm_FoundPortal(false),\n\tm_BuildPlatform(true),\n\tm_Dir(Direction::X),\n\tm_PortalLoc(a_DestPosition.Floor()),\n\tm_Position(a_DestPosition),\n\tm_MaxY(a_MaxY)\n{\n\tint MinX = FloorC((m_Position.x - SearchRadius) / cChunkDef::Width);\n\tint MinZ = FloorC((m_Position.z - SearchRadius) / cChunkDef::Width);\n\tint MaxX = CeilC((m_Position.x + SearchRadius) / cChunkDef::Width);\n\tint MaxZ = CeilC((m_Position.z + SearchRadius) / cChunkDef::Width);\n\tfor (int x = MinX; x < MaxX; x++)\n\t{\n\t\tfor (int z = MinZ; z < MaxZ; z++)\n\t\t{\n\t\t\tAdd(x, z);\n\t\t}\n\t}\n\tEnable(*a_DestinationWorld.GetChunkMap());\n}\n\n\n\n\n\nvoid cNetherPortalScanner::OnChunkAvailable(int a_ChunkX, int a_ChunkZ)\n{\n\tclass PortalSearchCallback : public cChunkDataCallback\n\t{\n\tpublic:\n\n\t\tPortalSearchCallback(const int a_ChunkX, const int a_ChunkZ, bool & a_FoundPortal, Vector3i & a_PortalLoc, const Vector3d a_Position, const int a_MaxY) :\n\t\t\tm_ChunkX(a_ChunkX),\n\t\t\tm_ChunkZ(a_ChunkZ),\n\t\t\tm_FoundPortal(a_FoundPortal),\n\t\t\tm_PortalLoc(a_PortalLoc),\n\t\t\tm_Position(a_Position),\n\t\t\tm_MaxY(a_MaxY)\n\t\t{\n\t\t}\n\n\tprivate:\n\n\t\tvirtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData &) override\n\t\t{\n\t\t\tfor (size_t Y = 0; Y < cChunkDef::NumSections; ++Y)\n\t\t\t{\n\t\t\t\tconst auto Blocks = a_BlockData.GetSection(Y);\n\t\t\t\tif (Blocks == nullptr)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Iterate through all of the blocks in the chunk:\n\t\t\t\tfor (size_t i = 0; i < ChunkBlockData::SectionBlockCount; i++)\n\t\t\t\t{\n\t\t\t\t\tif ((*Blocks)[i] != E_BLOCK_NETHER_PORTAL)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tVector3i Coordinate = cChunkDef::IndexToCoordinate(i + Y * ChunkBlockData::SectionBlockCount);\n\t\t\t\t\tif (Coordinate.y >= m_MaxY)\n\t\t\t\t\t{\n\t\t\t\t\t\t// This is above the map, don't consider it:\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tVector3d PortalLoc = Vector3d(Coordinate.x + m_ChunkX * cChunkDef::Width, Coordinate.y, Coordinate.z + m_ChunkZ * cChunkDef::Width);\n\t\t\t\t\tif (!m_FoundPortal)\n\t\t\t\t\t{\n\t\t\t\t\t\tm_FoundPortal = true;\n\t\t\t\t\t\tm_PortalLoc = PortalLoc;\n\t\t\t\t\t}\n\t\t\t\t\telse if ((PortalLoc - m_Position).SqrLength() < (m_PortalLoc - m_Position).SqrLength())\n\t\t\t\t\t{\n\t\t\t\t\t\t// Found a closer portal, use that instead:\n\t\t\t\t\t\tm_PortalLoc = PortalLoc;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tint m_ChunkX, m_ChunkZ;\n\n\t\tbool & m_FoundPortal;\n\t\tVector3i & m_PortalLoc;\n\t\tconst Vector3d m_Position;\n\n\t\tconst int m_MaxY;\n\t} Callback(a_ChunkX, a_ChunkZ, m_FoundPortal, m_PortalLoc, m_Position, m_MaxY);\n\n\t[[maybe_unused]] const bool Result = m_World.GetChunkData({ a_ChunkX, a_ChunkZ }, Callback);\n\tASSERT(Result);\n}\n\n\n\n\n\nbool cNetherPortalScanner::IsValidBuildLocation(Vector3i a_BlockPos)\n{\n\t// Check the base\n\tfor (int i = 0; i < SearchSolidBaseWidth; i++)\n\t{\n\t\tfor (int j = 0; j < PortalLength; j++)\n\t\t{\n\t\t\tBLOCKTYPE blocktype = m_World.GetBlock(a_BlockPos.addedXZ(i, j));\n\t\t\tif (!cBlockInfo::IsSolid(blocktype))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Check the airspace\n\t\t\tfor (int k = 1; k < PortalHeight; k++)\n\t\t\t{\n\t\t\t\tblocktype = m_World.GetBlock(a_BlockPos + Vector3i(i, k, j));\n\t\t\t\tif (blocktype != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cNetherPortalScanner::OnAllChunksAvailable(void)\n{\n\tif (m_FoundPortal)\n\t{\n\t\t// Find the bottom of this portal\n\t\twhile (m_World.GetBlock(m_PortalLoc) == E_BLOCK_NETHER_PORTAL)\n\t\t{\n\t\t\tm_PortalLoc.y -= 1;\n\t\t}\n\t\tm_PortalLoc.y += 1;\n\n\t\t// Figure out which way the portal is facing\n\t\tint BXP = m_World.GetBlock(m_PortalLoc.addedX(1));\n\t\tint BXM = m_World.GetBlock(m_PortalLoc.addedX(-1));\n\t\tif ((BXP == E_BLOCK_NETHER_PORTAL) || (BXM == E_BLOCK_NETHER_PORTAL))\n\t\t{\n\t\t\t// The long axis is along X\n\t\t\tm_Dir = Direction::X;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// The long axis is along Z\n\t\t\tm_Dir = Direction::Y;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Scan the area for a suitable location\n\t\tint minx = FloorC(m_Position.x) - BuildSearchRadius;\n\t\tint minz = FloorC(m_Position.z) - BuildSearchRadius;\n\t\tint maxx = FloorC(m_Position.x) + BuildSearchRadius;\n\t\tint maxz = FloorC(m_Position.z) + BuildSearchRadius;\n\t\tint maxy = m_MaxY;\n\t\tstd::vector<Vector3i> Possibilities;\n\t\tint x, y, z;\n\t\tfor (y = 0; y < maxy - PortalHeight; y++)\n\t\t{\n\t\t\tfor (x = minx; x < maxx - PortalLength; x++)\n\t\t\t{\n\t\t\t\tfor (z = minz; z < maxz - SearchSolidBaseWidth; z++)\n\t\t\t\t{\n\t\t\t\t\tVector3i Location = Vector3i(x, y, z);\n\t\t\t\t\tif (IsValidBuildLocation(Location))\n\t\t\t\t\t{\n\t\t\t\t\t\tPossibilities.emplace_back(x, y, z);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Possibilities.size() > 0)\n\t\t{\n\t\t\tm_BuildPlatform = false;\n\n\t\t\t// Find the nearest\n\t\t\tdouble DistanceToClosest = (Possibilities[0] - m_Position).SqrLength();\n\t\t\tVector3i Closest = Possibilities[0];\n\t\t\tfor (const auto & itr : Possibilities)\n\t\t\t{\n\t\t\t\tdouble Distance = (itr - m_Position).SqrLength();\n\t\t\t\tif (Distance < DistanceToClosest)\n\t\t\t\t{\n\t\t\t\t\tDistanceToClosest = Distance;\n\t\t\t\t\tClosest = itr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tm_PortalLoc = Closest;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cNetherPortalScanner::BuildNetherPortal(Vector3i a_Location, Direction a_Direction, bool a_IncludePlatform)\n{\n\tint x = a_Location.x;\n\tint y = a_Location.y;\n\tint z = a_Location.z;\n\n\t// Clear a 3x4x4 area starting right above the base\n\tfor (int i = 0; i < SearchSolidBaseWidth; i++)\n\t{\n\t\tfor (int j = 0; j < PortalLength; j++)\n\t\t{\n\t\t\tfor (int k = 1; k < PortalHeight; k++)\n\t\t\t{\n\t\t\t\tif (a_Direction == Direction::Y)\n\t\t\t\t{\n\t\t\t\t\tm_World.SetBlock({ x + i, y + k, z + j }, E_BLOCK_AIR, 0);\n\t\t\t\t}\n\t\t\t\telse if (a_Direction == Direction::X)\n\t\t\t\t{\n\t\t\t\t\tm_World.SetBlock({ x + j, y + k, z + i }, E_BLOCK_AIR, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Put in an obsidian base\n\tif (a_IncludePlatform)\n\t{\n\t\tfor (int j = 0; j < PortalLength; j++)\n\t\t{\n\t\t\t// +2 on the short axis because that's where we deposit the entity\n\t\t\tif (a_Direction == Direction::Y)\n\t\t\t{\n\t\t\t\tm_World.SetBlock({ x + 2, y, z + j }, E_BLOCK_OBSIDIAN, 0);\n\t\t\t}\n\t\t\telse if (a_Direction == Direction::X)\n\t\t\t{\n\t\t\t\tm_World.SetBlock({ x + j, y, z + 2 }, E_BLOCK_OBSIDIAN, 0);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build an obsidian frame\n\tfor (int i = 0; i < PortalHeight; i++)\n\t{\n\t\tif (a_Direction == Direction::Y)\n\t\t{\n\t\t\tm_World.SetBlock({ x + 1, y + i, z }, E_BLOCK_OBSIDIAN, 0);\n\t\t\tm_World.SetBlock({ x + 1, y + i, z + 3 }, E_BLOCK_OBSIDIAN, 0);\n\t\t}\n\t\telse if (a_Direction == Direction::X)\n\t\t{\n\t\t\tm_World.SetBlock({ x, y + i, z + 1 }, E_BLOCK_OBSIDIAN, 0);\n\t\t\tm_World.SetBlock({ x + 3, y + i, z + 1 }, E_BLOCK_OBSIDIAN, 0);\n\t\t}\n\t}\n\tfor (int i = 0; i < PortalLength; i++)\n\t{\n\t\tif (a_Direction == Direction::Y)\n\t\t{\n\t\t\tm_World.SetBlock({ x + 1, y + 4, z + i }, E_BLOCK_OBSIDIAN, 0);\n\t\t\tm_World.SetBlock({ x + 1, y, z + i }, E_BLOCK_OBSIDIAN, 0);\n\t\t}\n\t\telse if (a_Direction == Direction::X)\n\t\t{\n\t\t\tm_World.SetBlock({ x + i, y + 4, z + 1 }, E_BLOCK_OBSIDIAN, 0);\n\t\t\tm_World.SetBlock({ x + i, y, z + 1 }, E_BLOCK_OBSIDIAN, 0);\n\t\t}\n\t}\n\n\t// Fill the frame (place a fire in the bottom)\n\tm_World.PlaceBlock(Vector3<int>(x + 1, y + 1, z + 1), E_BLOCK_FIRE, 0);\n}\n\n\n\n\n\nvoid cNetherPortalScanner::OnDisabled(void)\n{\n\t// Now we actually move the player\n\tif (!m_FoundPortal)\n\t{\n\t\t// Build a new nether portal.\n\t\tFLOGD(\"Building nether portal at {0}\", m_PortalLoc);\n\t\tBuildNetherPortal(m_PortalLoc, m_Dir, m_BuildPlatform);\n\t\tm_PortalLoc.x += 1;\n\t\tm_PortalLoc.y += 1;\n\t\tm_PortalLoc.z += 1;\n\t}\n\n\t// Put the entity near the opening\n\tVector3d Position = m_PortalLoc;\n\tif (m_Dir == Direction::Y)\n\t{\n\t\tPosition.x += OutOffset;\n\t\tPosition.z += AcrossOffset;\n\t}\n\telse if (m_Dir == Direction::X)\n\t{\n\t\tPosition.x += AcrossOffset;\n\t\tPosition.z += OutOffset;\n\t}\n\n\tauto EntityID = m_EntityID;\n\tauto & DestinationWorld = m_World;\n\tauto DestinationPosition = Position;\n\n\t// Lookup our warping entity by ID\n\t// Necessary as they may have been destroyed in the meantime (#4582)\n\t// And since this is called from the destination world's thread queue a task on the source world\n\tm_SourceWorld.QueueTask(\n\t\t[EntityID, &DestinationWorld, DestinationPosition](cWorld & a_World)\n\t\t{\n\t\t\ta_World.DoWithEntityByID(\n\t\t\t\tEntityID,\n\t\t\t\t[&DestinationWorld, &DestinationPosition](cEntity & a_Entity)\n\t\t\t\t{\n\t\t\t\t\tFLOGD(\"Placing player at {0}\", DestinationPosition);\n\t\t\t\t\ta_Entity.MoveToWorld(DestinationWorld, DestinationPosition, true, false);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t);\n\n\tdelete this;\n}\n\n"
  },
  {
    "path": "src/NetherPortalScanner.h",
    "content": "\n#pragma once\n\n#include \"ChunkStay.h\"\n\n\nclass cEntity;\nclass cWorld;\n\n\n\n\n\n// This is the chunk stay which finds nearby nether portals\nclass cNetherPortalScanner : public cChunkStay\n{\npublic:\n\tcNetherPortalScanner(cEntity & a_MovingEntity, cWorld & a_DestinationWorld, Vector3d a_DestPosition, int a_MaxY);\n\tvirtual void OnChunkAvailable(int a_ChunkX, int a_ChunkY) override;\n\tvirtual bool OnAllChunksAvailable(void) override;\n\tvirtual void OnDisabled(void) override;\n\n\tenum class Direction\n\t{\n\t\tX,\n\t\tY\n\t};\n\nprivate:\n\n\t/** Length and height, including the obsidian. */\n\tstatic const int PortalLength = 4;\n\tstatic const int PortalHeight = 5;\n\n\tstatic const int SearchRadius = 128;\n\tstatic const int BuildSearchRadius = 16;\n\n\t/** The width of a solid base to search for when building. */\n\tstatic const int SearchSolidBaseWidth = 3;\n\n\t/** Where to place the player out from the face and across the face */\n\tstatic const double OutOffset;\n\tstatic const double AcrossOffset;\n\n\t/** Builds a portal. */\n\tvoid BuildNetherPortal(Vector3i a_Location, Direction a_Direction, bool a_IncludePlatform);\n\n\t/** Whether the given location is a valid location to build a portal. */\n\tbool IsValidBuildLocation(Vector3i a_BlockPosition);\n\n\t/** The ID of the entity that's being moved. */\n\tUInt32 m_EntityID;\n\n\t/** The world we're moving the entity from, used to query the entity ID. */\n\tcWorld & m_SourceWorld;\n\n\t/** The world we're moving the entity to. */\n\tcWorld & m_World;\n\n\t/** Whether we found a portal during the loading of the chunks. */\n\tbool m_FoundPortal;\n\n\t/** Whether to build a platform. True if we couldn't build the portal on solid ground */\n\tbool m_BuildPlatform;\n\n\t/** The direction of the portal. */\n\tDirection m_Dir;\n\n\t/** The position of the pre-existing portal. */\n\tVector3i m_PortalLoc;\n\n\t/** The center of the search area */\n\tVector3d m_Position;\n\n\t/** The maximum Y to scan to */\n\tint m_MaxY;\n};\n"
  },
  {
    "path": "src/Noise/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tNoise.cpp\n\n\tInterpolNoise.h\n\tNoise.h\n\tOctavedNoise.h\n\tRidgedNoise.h\n)\n"
  },
  {
    "path": "src/Noise/InterpolNoise.h",
    "content": "\n// InterpolNoise.h\n\n// Implements the cInterpolNoise class template representing a noise that interpolates the values between integer coords from a single set of neighbors\n\n\n\n\n\n#pragma once\n\n#include \"Noise.h\"\n\n#define FAST_FLOOR(x) (((x) < 0) ? ((static_cast<int>(x)) - 1) : (static_cast<int>(x)))\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cInterpolCell2D:\n\ntemplate <typename T>\nclass cInterpolCell2D\n{\npublic:\n\tcInterpolCell2D(\n\t\tconst cNoise & a_Noise,    ///< Noise to use for generating the random values\n\t\tNOISE_DATATYPE * a_Array,  ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY,  ///< Count of the array, in each direction\n\t\tconst NOISE_DATATYPE * a_FracX,  ///< Pointer to the array that stores the X fractional values\n\t\tconst NOISE_DATATYPE * a_FracY   ///< Pointer to the attay that stores the Y fractional values\n\t):\n\t\tm_Noise(a_Noise),\n\t\tm_WorkRnds(&m_Workspace1),\n\t\tm_CurFloorX(0),\n\t\tm_CurFloorY(0),\n\t\tm_Array(a_Array),\n\t\tm_SizeX(a_SizeX),\n\t\tm_SizeY(a_SizeY),\n\t\tm_FracX(a_FracX),\n\t\tm_FracY(a_FracY)\n\t{\n\t}\n\n\n\t/** Generates part of the output noise array using the current m_WorkRnds[] values */\n\tvoid Generate(\n\t\tint a_FromX, int a_ToX,\n\t\tint a_FromY, int a_ToY\n\t)\n\t{\n\t\tfor (int y = a_FromY; y < a_ToY; y++)\n\t\t{\n\t\t\tNOISE_DATATYPE Interp[2];\n\t\t\tNOISE_DATATYPE FracY = T::coeff(m_FracY[y]);\n\t\t\tInterp[0] = Lerp((*m_WorkRnds)[0][0], (*m_WorkRnds)[0][1], FracY);\n\t\t\tInterp[1] = Lerp((*m_WorkRnds)[1][0], (*m_WorkRnds)[1][1], FracY);\n\t\t\tint idx = y * m_SizeX + a_FromX;\n\t\t\tfor (int x = a_FromX; x < a_ToX; x++)\n\t\t\t{\n\t\t\t\tm_Array[idx++] = Lerp(Interp[0], Interp[1], T::coeff(m_FracX[x]));\n\t\t\t}  // for x\n\t\t}  // for y\n\t}\n\n\n\t/** Initializes m_WorkRnds[] with the specified values of the noise at the specified integral coords. */\n\tvoid InitWorkRnds(int a_FloorX, int a_FloorY)\n\t{\n\t\tm_CurFloorX = a_FloorX;\n\t\tm_CurFloorY = a_FloorY;\n\t\t(*m_WorkRnds)[0][0] = m_Noise.IntNoise2D(m_CurFloorX,     m_CurFloorY);\n\t\t(*m_WorkRnds)[0][1] = m_Noise.IntNoise2D(m_CurFloorX,     m_CurFloorY + 1);\n\t\t(*m_WorkRnds)[1][0] = m_Noise.IntNoise2D(m_CurFloorX + 1, m_CurFloorY);\n\t\t(*m_WorkRnds)[1][1] = m_Noise.IntNoise2D(m_CurFloorX + 1, m_CurFloorY + 1);\n\t}\n\n\n\t/** Updates m_WorkRnds[] for the new integral coords */\n\tvoid Move(int a_NewFloorX, int a_NewFloorY)\n\t{\n\t\t// Swap the doublebuffer:\n\t\tint OldFloorX = m_CurFloorX;\n\t\tint OldFloorY = m_CurFloorY;\n\t\tWorkspace * OldWorkRnds = m_WorkRnds;\n\t\tm_WorkRnds = (m_WorkRnds == &m_Workspace1) ? &m_Workspace2 : &m_Workspace1;\n\n\t\t// Reuse as much of the old workspace as possible:\n\t\t// TODO: Try out if simply calculating all 4 elements each time is faster than this monster loop\n\t\tint DiffX = OldFloorX - a_NewFloorX;\n\t\tint DiffY = OldFloorY - a_NewFloorY;\n\t\tfor (int x = 0; x < 2; x++)\n\t\t{\n\t\t\tint cx = a_NewFloorX + x;\n\t\t\tint OldX = x - DiffX;  // Where would this X be in the old grid?\n\t\t\tfor (int y = 0; y < 2; y++)\n\t\t\t{\n\t\t\t\tint cy = a_NewFloorY + y;\n\t\t\t\tint OldY = y - DiffY;  // Where would this Y be in the old grid?\n\t\t\t\tif ((OldX >= 0) && (OldX < 2) && (OldY >= 0) && (OldY < 2))\n\t\t\t\t{\n\t\t\t\t\t(*m_WorkRnds)[x][y] = (*OldWorkRnds)[OldX][OldY];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t(*m_WorkRnds)[x][y] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise2D(cx, cy));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tm_CurFloorX = a_NewFloorX;\n\t\tm_CurFloorY = a_NewFloorY;\n\t}\n\nprotected:\n\ttypedef NOISE_DATATYPE Workspace[2][2];\n\n\t/** The noise used for generating the values at integral coords. */\n\tconst cNoise & m_Noise;\n\n\t/** The current random values; points to either m_Workspace1 or m_Workspace2 (doublebuffering) */\n\tWorkspace * m_WorkRnds;\n\n\t/** Buffer 1 for workspace doublebuffering, used in Move() */\n\tWorkspace m_Workspace1;\n\n\t/** Buffer 2 for workspace doublebuffering, used in Move() */\n\tWorkspace m_Workspace2;\n\n\t/** Coords of the currently calculated m_WorkRnds[]. */\n\tint m_CurFloorX, m_CurFloorY;\n\n\t/** The output array to generate into. */\n\tNOISE_DATATYPE * m_Array;\n\n\t/** Dimensions of the output array. */\n\tint m_SizeX, m_SizeY;\n\n\t/** Arrays holding the fractional values of the coords in each direction. */\n\tconst NOISE_DATATYPE * m_FracX;\n\tconst NOISE_DATATYPE * m_FracY;\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cInterpolCell3D:\n\n/** Holds a cache of the last calculated integral noise values and interpolates between them en masse.\nProvides a massive optimization for cInterpolNoise.\nWorks by calculating multiple noise values (that have the same integral noise coords) at once. The underlying noise values\nneedn't be recalculated for these values, only the interpolation is done within the unit cube. */\ntemplate <typename T>\nclass cInterpolCell3D\n{\npublic:\n\tcInterpolCell3D(\n\t\tconst cNoise & a_Noise,                 ///< Noise to use for generating the random values\n\t\tNOISE_DATATYPE * a_Array,               ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY, int a_SizeZ,  ///< Count of the array, in each direction\n\t\tconst NOISE_DATATYPE * a_FracX,         ///< Pointer to the array that stores the X fractional values\n\t\tconst NOISE_DATATYPE * a_FracY,         ///< Pointer to the attay that stores the Y fractional values\n\t\tconst NOISE_DATATYPE * a_FracZ          ///< Pointer to the array that stores the Z fractional values\n\t):\n\t\tm_Noise(a_Noise),\n\t\tm_WorkRnds(&m_Workspace1),\n\t\tm_CurFloorX(0),\n\t\tm_CurFloorY(0),\n\t\tm_CurFloorZ(0),\n\t\tm_Array(a_Array),\n\t\tm_SizeX(a_SizeX),\n\t\tm_SizeY(a_SizeY),\n\t\tm_SizeZ(a_SizeZ),\n\t\tm_FracX(a_FracX),\n\t\tm_FracY(a_FracY),\n\t\tm_FracZ(a_FracZ)\n\t{\n\t}\n\n\n\t/** Generates part of the output array using current m_WorkRnds[]. */\n\tvoid Generate(\n\t\tint a_FromX, int a_ToX,\n\t\tint a_FromY, int a_ToY,\n\t\tint a_FromZ, int a_ToZ\n\t)\n\t{\n\t\tfor (int z = a_FromZ; z < a_ToZ; z++)\n\t\t{\n\t\t\tint idxZ = z * m_SizeX * m_SizeY;\n\t\t\tNOISE_DATATYPE Interp2[2][2];\n\t\t\tNOISE_DATATYPE FracZ = T::coeff(m_FracZ[z]);\n\t\t\tfor (int x = 0; x < 2; x++)\n\t\t\t{\n\t\t\t\tfor (int y = 0; y < 2; y++)\n\t\t\t\t{\n\t\t\t\t\tInterp2[x][y] = Lerp((*m_WorkRnds)[x][y][0], (*m_WorkRnds)[x][y][1], FracZ);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int y = a_FromY; y < a_ToY; y++)\n\t\t\t{\n\t\t\t\tNOISE_DATATYPE Interp[2];\n\t\t\t\tNOISE_DATATYPE FracY = T::coeff(m_FracY[y]);\n\t\t\t\tInterp[0] = Lerp(Interp2[0][0], Interp2[0][1], FracY);\n\t\t\t\tInterp[1] = Lerp(Interp2[1][0], Interp2[1][1], FracY);\n\t\t\t\tint idx = idxZ + y * m_SizeX + a_FromX;\n\t\t\t\tfor (int x = a_FromX; x < a_ToX; x++)\n\t\t\t\t{\n\t\t\t\t\tm_Array[idx++] = Lerp(Interp[0], Interp[1], T::coeff(m_FracX[x]));\n\t\t\t\t}  // for x\n\t\t\t}  // for y\n\t\t}  // for z\n\t}\n\n\n\t/** Initializes m_WorkRnds[] with the specified Floor values. */\n\tvoid InitWorkRnds(int a_FloorX, int a_FloorY, int a_FloorZ)\n\t{\n\t\tm_CurFloorX = a_FloorX;\n\t\tm_CurFloorY = a_FloorY;\n\t\tm_CurFloorZ = a_FloorZ;\n\t\t(*m_WorkRnds)[0][0][0] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(m_CurFloorX,     m_CurFloorY,     m_CurFloorZ));\n\t\t(*m_WorkRnds)[0][0][1] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(m_CurFloorX,     m_CurFloorY,     m_CurFloorZ + 1));\n\t\t(*m_WorkRnds)[0][1][0] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(m_CurFloorX,     m_CurFloorY + 1, m_CurFloorZ));\n\t\t(*m_WorkRnds)[0][1][1] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(m_CurFloorX,     m_CurFloorY + 1, m_CurFloorZ + 1));\n\t\t(*m_WorkRnds)[1][0][0] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(m_CurFloorX + 1, m_CurFloorY,     m_CurFloorZ));\n\t\t(*m_WorkRnds)[1][0][1] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(m_CurFloorX + 1, m_CurFloorY,     m_CurFloorZ + 1));\n\t\t(*m_WorkRnds)[1][1][0] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(m_CurFloorX + 1, m_CurFloorY + 1, m_CurFloorZ));\n\t\t(*m_WorkRnds)[1][1][1] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(m_CurFloorX + 1, m_CurFloorY + 1, m_CurFloorZ + 1));\n\t}\n\n\n\t/** Updates m_WorkRnds[] for the new Floor values. */\n\tvoid Move(int a_NewFloorX, int a_NewFloorY, int a_NewFloorZ)\n\t{\n\t\t// Swap the doublebuffer:\n\t\tint OldFloorX = m_CurFloorX;\n\t\tint OldFloorY = m_CurFloorY;\n\t\tint OldFloorZ = m_CurFloorZ;\n\t\tWorkspace * OldWorkRnds = m_WorkRnds;\n\t\tm_WorkRnds = (m_WorkRnds == &m_Workspace1) ? &m_Workspace2 : &m_Workspace1;\n\n\t\t// Reuse as much of the old workspace as possible:\n\t\t// TODO: Try out if simply calculating all 8 elements each time is faster than this monster loop\n\t\tint DiffX = OldFloorX - a_NewFloorX;\n\t\tint DiffY = OldFloorY - a_NewFloorY;\n\t\tint DiffZ = OldFloorZ - a_NewFloorZ;\n\t\tfor (int x = 0; x < 2; x++)\n\t\t{\n\t\t\tint cx = a_NewFloorX + x;\n\t\t\tint OldX = x - DiffX;  // Where would this X be in the old grid?\n\t\t\tfor (int y = 0; y < 2; y++)\n\t\t\t{\n\t\t\t\tint cy = a_NewFloorY + y;\n\t\t\t\tint OldY = y - DiffY;  // Where would this Y be in the old grid?\n\t\t\t\tfor (int z = 0; z < 2; z++)\n\t\t\t\t{\n\t\t\t\t\tint cz = a_NewFloorZ + z;\n\t\t\t\t\tint OldZ = z - DiffZ;\n\t\t\t\t\tif ((OldX >= 0) && (OldX < 2) && (OldY >= 0) && (OldY < 2) && (OldZ >= 0) && (OldZ < 2))\n\t\t\t\t\t{\n\t\t\t\t\t\t(*m_WorkRnds)[x][y][z] = (*OldWorkRnds)[OldX][OldY][OldZ];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t(*m_WorkRnds)[x][y][z] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(cx, cy, cz));\n\t\t\t\t\t}\n\t\t\t\t}  // for z\n\t\t\t}  // for y\n\t\t}  // for x\n\t\tm_CurFloorX = a_NewFloorX;\n\t\tm_CurFloorY = a_NewFloorY;\n\t\tm_CurFloorZ = a_NewFloorZ;\n\t}\n\nprotected:\n\ttypedef NOISE_DATATYPE Workspace[2][2][2];\n\n\t/** The noise used for generating the values at integral coords. */\n\tconst cNoise & m_Noise;\n\n\t/** The current random values; points to either m_Workspace1 or m_Workspace2 (doublebuffering) */\n\tWorkspace * m_WorkRnds;\n\n\t/** Buffer 1 for workspace doublebuffering, used in Move() */\n\tWorkspace m_Workspace1;\n\n\t/** Buffer 2 for workspace doublebuffering, used in Move() */\n\tWorkspace m_Workspace2;\n\n\t/** The integral coords of the currently calculated WorkRnds[] */\n\tint m_CurFloorX, m_CurFloorY, m_CurFloorZ;\n\n\t/** The output array where the noise is calculated. */\n\tNOISE_DATATYPE * m_Array;\n\n\t/** Dimensions of the output array. */\n\tint m_SizeX, m_SizeY, m_SizeZ;\n\n\t/** Arrays holding the fractional values of the coords in each direction. */\n\tconst NOISE_DATATYPE * m_FracX;\n\tconst NOISE_DATATYPE * m_FracY;\n\tconst NOISE_DATATYPE * m_FracZ;\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cInterpolNoise:\n\ntemplate <typename T>\nclass cInterpolNoise\n{\n\t/** Maximum size, for each direction, of the generated array. */\n\tstatic const int MAX_SIZE = 256;\n\npublic:\n\tcInterpolNoise(int a_Seed):\n\t\tm_Noise(a_Seed)\n\t{\n\t}\n\n\n\t/** Sets a new seed for the generators. Relays the seed to the underlying noise. */\n\tvoid SetSeed(int a_Seed)\n\t{\n\t\tm_Noise.SetSeed(a_Seed);\n\t}\n\n\n\t/** Fills a 2D array with the values of the noise. */\n\tvoid Generate2D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY,                        ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY   ///< Noise-space coords of the array in the Y direction\n\t) const\n\t{\n\t\tASSERT(a_SizeX > 0);\n\t\tASSERT(a_SizeY > 0);\n\t\tASSERT(a_SizeX < MAX_SIZE);\n\t\tASSERT(a_SizeY < MAX_SIZE);\n\t\tASSERT(a_StartX < a_EndX);\n\t\tASSERT(a_StartY < a_EndY);\n\n\t\t// Calculate the integral and fractional parts of each coord:\n\t\tint FloorX[MAX_SIZE];\n\t\tint FloorY[MAX_SIZE];\n\t\tNOISE_DATATYPE FracX[MAX_SIZE];\n\t\tNOISE_DATATYPE FracY[MAX_SIZE];\n\t\tint SameX[MAX_SIZE];\n\t\tint SameY[MAX_SIZE];\n\t\tint NumSameX, NumSameY;\n\t\tCalcFloorFrac(a_SizeX, a_StartX, a_EndX, FloorX, FracX, SameX, NumSameX);\n\t\tCalcFloorFrac(a_SizeY, a_StartY, a_EndY, FloorY, FracY, SameY, NumSameY);\n\n\t\tcInterpolCell2D<T> Cell(m_Noise, a_Array, a_SizeX, a_SizeY, FracX, FracY);\n\n\t\tCell.InitWorkRnds(FloorX[0], FloorY[0]);\n\n\t\t// Calculate query values using Cell:\n\t\tint FromY = 0;\n\t\tfor (int y = 0; y < NumSameY; y++)\n\t\t{\n\t\t\tint ToY = FromY + SameY[y];\n\t\t\tint FromX = 0;\n\t\t\tint CurFloorY = FloorY[FromY];\n\t\t\tfor (int x = 0; x < NumSameX; x++)\n\t\t\t{\n\t\t\t\tint ToX = FromX + SameX[x];\n\t\t\t\tCell.Generate(FromX, ToX, FromY, ToY);\n\t\t\t\tCell.Move(FloorX[ToX], CurFloorY);\n\t\t\t\tFromX = ToX;\n\t\t\t}  // for x\n\t\t\tCell.Move(FloorX[0], FloorY[ToY]);\n\t\t\tFromY = ToY;\n\t\t}  // for y\n\t}\n\n\n\t/** Fills a 3D array with the values of the noise. */\n\tvoid Generate3D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y + a_SizeX * a_SizeY * z]\n\t\tint a_SizeX, int a_SizeY, int a_SizeZ,           ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY,  ///< Noise-space coords of the array in the Y direction\n\t\tNOISE_DATATYPE a_StartZ, NOISE_DATATYPE a_EndZ   ///< Noise-space coords of the array in the Z direction\n\t) const\n\t{\n\t\t// Check params:\n\t\tASSERT(a_SizeX > 1);\n\t\tASSERT(a_SizeY > 1);\n\n\t\tASSERT(a_SizeX < MAX_SIZE);\n\t\tASSERT(a_SizeY < MAX_SIZE);\n\t\tASSERT(a_SizeZ < MAX_SIZE);\n\t\tASSERT(a_StartX < a_EndX);\n\t\tASSERT(a_StartY < a_EndY);\n\t\tASSERT(a_StartZ < a_EndZ);\n\n\t\t// Calculate the integral and fractional parts of each coord:\n\t\tint FloorX[MAX_SIZE];\n\t\tint FloorY[MAX_SIZE];\n\t\tint FloorZ[MAX_SIZE];\n\t\tNOISE_DATATYPE FracX[MAX_SIZE];\n\t\tNOISE_DATATYPE FracY[MAX_SIZE];\n\t\tNOISE_DATATYPE FracZ[MAX_SIZE];\n\t\tint SameX[MAX_SIZE];\n\t\tint SameY[MAX_SIZE];\n\t\tint SameZ[MAX_SIZE];\n\t\tint NumSameX, NumSameY, NumSameZ;\n\t\tCalcFloorFrac(a_SizeX, a_StartX, a_EndX, FloorX, FracX, SameX, NumSameX);\n\t\tCalcFloorFrac(a_SizeY, a_StartY, a_EndY, FloorY, FracY, SameY, NumSameY);\n\t\tCalcFloorFrac(a_SizeZ, a_StartZ, a_EndZ, FloorZ, FracZ, SameZ, NumSameZ);\n\n\t\tcInterpolCell3D<T> Cell(\n\t\t\tm_Noise, a_Array,\n\t\t\ta_SizeX, a_SizeY, a_SizeZ,\n\t\t\tFracX, FracY, FracZ\n\t\t);\n\n\t\tCell.InitWorkRnds(FloorX[0], FloorY[0], FloorZ[0]);\n\n\t\t// Calculate query values using Cell:\n\t\tint FromZ = 0;\n\t\tfor (int z = 0; z < NumSameZ;)\n\t\t{\n\t\t\tint ToZ = FromZ + SameZ[z];\n\t\t\tint CurFloorZ = FloorZ[FromZ];\n\t\t\tint FromY = 0;\n\t\t\tfor (int y = 0; y < NumSameY;)\n\t\t\t{\n\t\t\t\tint ToY = FromY + SameY[y];\n\t\t\t\tint CurFloorY = FloorY[FromY];\n\t\t\t\tint FromX = 0;\n\t\t\t\tfor (int x = 0; x < NumSameX;)\n\t\t\t\t{\n\t\t\t\t\tint ToX = FromX + SameX[x];\n\t\t\t\t\tCell.Generate(FromX, ToX, FromY, ToY, FromZ, ToZ);\n\t\t\t\t\tif (++x < NumSameX)  // Call Move() every time except for the last loop iteration\n\t\t\t\t\t{\n\t\t\t\t\t\tCell.Move(FloorX[ToX], CurFloorY, CurFloorZ);\n\t\t\t\t\t\tFromX = ToX;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (++y < NumSameY)  // Call Move() every time except for the last loop iteration\n\t\t\t\t{\n\t\t\t\t\tCell.Move(FloorX[0], FloorY[ToY], CurFloorZ);\n\t\t\t\t\tFromY = ToY;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t\tif (++z < NumSameZ)  // Call Move() every time except for the last loop iteration\n\t\t\t{\n\t\t\t\tCell.Move(FloorX[0], FloorY[0], FloorZ[ToZ]);\n\t\t\t\tFromZ = ToZ;\n\t\t\t}\n\t\t}  // for z\n\t}\n\nprotected:\n\n\t/** The noise used for the underlying value generation. */\n\tcNoise m_Noise;\n\n\n\t/** Calculates the integral and fractional parts along one axis.\n\ta_Floor will receive the integral parts (array of a_Size ints).\n\ta_Frac will receive the fractional parts (array of a_Size floats).\n\ta_Same will receive the counts of items that have the same integral parts (array of up to a_Size ints).\n\ta_NumSame will receive the count of a_Same elements (total count of different integral parts). */\n\tvoid CalcFloorFrac(\n\t\tint a_Size,\n\t\tNOISE_DATATYPE a_Start, NOISE_DATATYPE a_End,\n\t\tint * a_Floor, NOISE_DATATYPE * a_Frac,\n\t\tint * a_Same, int & a_NumSame\n\t) const\n\t{\n\t\tASSERT(a_Size > 0);\n\n\t\t// Calculate the floor and frac values:\n\t\tNOISE_DATATYPE val = a_Start;\n\t\tNOISE_DATATYPE dif = (a_End - a_Start) / (a_Size - 1);\n\t\tfor (int i = 0; i < a_Size; i++)\n\t\t{\n\t\t\ta_Floor[i] = FAST_FLOOR(val);\n\t\t\ta_Frac[i] = val - a_Floor[i];\n\t\t\tval += dif;\n\t\t}\n\n\t\t// Mark up the same floor values into a_Same / a_NumSame:\n\t\tint CurFloor = a_Floor[0];\n\t\tint LastSame = 0;\n\t\ta_NumSame = 0;\n\t\tfor (int i = 1; i < a_Size; i++)\n\t\t{\n\t\t\tif (a_Floor[i] != CurFloor)\n\t\t\t{\n\t\t\t\ta_Same[a_NumSame] = i - LastSame;\n\t\t\t\tLastSame = i;\n\t\t\t\ta_NumSame += 1;\n\t\t\t\tCurFloor = a_Floor[i];\n\t\t\t}\n\t\t}  // for i - a_Floor[]\n\t\tif (LastSame < a_Size)\n\t\t{\n\t\t\ta_Same[a_NumSame] = a_Size - LastSame;\n\t\t\ta_NumSame += 1;\n\t\t}\n\t}\n};\n\n\n\n\n\n/** A fifth-degree curve for interpolating.\nImplemented as a functor for better chance of inlining. */\nstruct Interp5Deg\n{\n\tstatic NOISE_DATATYPE coeff(NOISE_DATATYPE a_Val)\n\t{\n\t\treturn a_Val * a_Val * a_Val * (a_Val * (a_Val * 6 - 15) + 10);\n\t}\n};\n\ntypedef cInterpolNoise<Interp5Deg> cInterp5DegNoise;\n\n\n\n"
  },
  {
    "path": "src/Noise/Noise.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Noise.h\"\n\n#define FAST_FLOOR(x) (((x) < 0) ? ((static_cast<int>(x)) - 1) : (static_cast<int>(x)))\n\n\n\n\n\n#if 0\n/** cImprovedPerlin noise test suite:\n- Generate a rather large 2D and 3D noise array and output it to a file\n- Compare performance of cCubicNoise and cImprovedNoise, both in single-value and 3D-array usages */\nstatic class cImprovedPerlinNoiseTest\n{\npublic:\n\tcImprovedPerlinNoiseTest(void)\n\t{\n\t\tprintf(\"Performing Improved Perlin Noise tests...\\n\");\n\t\tTestImage();\n\t\tTestSpeed();\n\t\tTestSpeedArr();\n\t\tprintf(\"Improved Perlin Noise tests complete.\\n\");\n\t}\n\n\n\t/** Tests the noise by generating 2D and 3D images and dumping them to files. */\n\tvoid TestImage(void)\n\t{\n\t\tstatic const int SIZE_X = 256;\n\t\tstatic const int SIZE_Y = 256;\n\t\tstatic const int SIZE_Z = 16;\n\n\t\tcImprovedNoise noise(1);\n\t\tstd::unique_ptr<NOISE_DATATYPE[]> arr(new NOISE_DATATYPE[SIZE_X * SIZE_Y * SIZE_Z]);\n\t\tnoise.Generate3D(arr.get(), SIZE_X, SIZE_Y, SIZE_Z, 0, 14, 0, 14, 0, 14);\n\t\tDebug3DNoise(arr.get(), SIZE_X, SIZE_Y, SIZE_Z, \"ImprovedPerlinNoiseTest3D\", 128);\n\t\tnoise.Generate2D(arr.get(), SIZE_X, SIZE_Y, 0, 14, 15, 28);\n\t\tDebug2DNoise(arr.get(), SIZE_X, SIZE_Y, \"ImprovedPerlinNoiseTest2D\", 128);\n\t}\n\n\n\t/** Tests the speeds of cImprovedPerlin and cCubicNoise when generating individual values. */\n\tvoid TestSpeed(void)\n\t{\n\t\tcImprovedNoise improvedNoise(1);\n\t\tcNoise         noise(1);\n\t\tcTimer timer;\n\n\t\t// Measure the improvedNoise:\n\t\tNOISE_DATATYPE sum = 0;\n\t\tlong long start = timer.GetNowTime();\n\t\tfor (int i = 0; i < 100000000; i++)\n\t\t{\n\t\t\tsum += improvedNoise.GetValueAt(i, 0, -i);\n\t\t}\n\t\tlong long finish = timer.GetNowTime();\n\t\tprintf(\"cImprovedNoise took %.2f seconds; total is %f.\\n\", static_cast<float>(finish - start) / 1000.0f, sum);\n\n\t\t// Measure the cubicNoise:\n\t\tsum = 0;\n\t\tstart = timer.GetNowTime();\n\t\tfor (int i = 0; i < 100000000; i++)\n\t\t{\n\t\t\tsum += noise.IntNoise3D(i, 0, -i);\n\t\t}\n\t\tfinish = timer.GetNowTime();\n\t\tprintf(\"cCubicNoise took %.2f seconds; total is %f.\\n\", static_cast<float>(finish - start) / 1000.0f, sum);\n\t}\n\n\n\t/** Tests the speeds of cImprovedPerlin and cCubicNoise when generating arrays. */\n\tvoid TestSpeedArr(void)\n\t{\n\t\tstatic const int SIZE_X = 256;\n\t\tstatic const int SIZE_Y = 256;\n\t\tstatic const int SIZE_Z = 16;\n\n\t\tstd::unique_ptr<NOISE_DATATYPE[]> arr(new NOISE_DATATYPE[SIZE_X * SIZE_Y * SIZE_Z]);\n\t\tcTimer timer;\n\t\tcImprovedNoise improvedNoise(1);\n\t\tcCubicNoise    cubicNoise(1);\n\n\t\t// Measure the improvedNoise:\n\t\tlong long start = timer.GetNowTime();\n\t\tfor (int i = 0; i < 40; i++)\n\t\t{\n\t\t\timprovedNoise.Generate3D(arr.get(), SIZE_X, SIZE_Y, SIZE_Z, 0, 14, 0, 14, 0, 14);\n\t\t}\n\t\tlong long finish = timer.GetNowTime();\n\t\tprintf(\"cImprovedNoise(arr) took %.2f seconds.\\n\", static_cast<float>(finish - start) / 1000.0f);\n\n\t\t// Measure the cubicNoise:\n\t\tstart = timer.GetNowTime();\n\t\tfor (int i = 0; i < 40; i++)\n\t\t{\n\t\t\tcubicNoise.Generate3D(arr.get(), SIZE_X, SIZE_Y, SIZE_Z, 0, 14, 0, 14, 0, 14);\n\t\t}\n\t\tfinish = timer.GetNowTime();\n\t\tprintf(\"cCubicNoise(arr) took %.2f seconds.\\n\", static_cast<float>(finish - start) / 1000.0f);\n\t}\n} g_Test;\n\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Globals:\n\nvoid Debug3DNoise(const NOISE_DATATYPE * a_Noise, size_t a_SizeX, size_t a_SizeY, size_t a_SizeZ, const AString & a_FileNameBase, NOISE_DATATYPE a_Coeff)\n{\n\tconst int BUF_SIZE = 512;\n\tASSERT(a_SizeX <= BUF_SIZE);  // Just stretch it, if needed\n\n\t// Save in XY cuts:\n\tcFile f1;\n\tif (f1.Open(fmt::format(FMT_STRING(\"{}_XY ({}).grab\"), a_FileNameBase, a_SizeX), cFile::fmWrite))\n\t{\n\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t{\n\t\t\tfor (size_t y = 0; y < a_SizeY; y++)\n\t\t\t{\n\t\t\t\tsize_t idx = y * a_SizeX + z * a_SizeX * a_SizeY;\n\t\t\t\tunsigned char buf[BUF_SIZE];\n\t\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t\t{\n\t\t\t\t\tbuf[x] = static_cast<unsigned char>(Clamp(static_cast<int>(128 + a_Coeff * a_Noise[idx++]), 0, 255));\n\t\t\t\t}\n\t\t\t\tf1.Write(buf, a_SizeX);\n\t\t\t}  // for y\n\t\t\tunsigned char buf[BUF_SIZE];\n\t\t\tmemset(buf, 0, a_SizeX);\n\t\t\tf1.Write(buf, a_SizeX);\n\t\t}  // for z\n\t}  // if (XY file open)\n\n\tcFile f2;\n\tif (f2.Open(fmt::format(FMT_STRING(\"{}_XZ ({}).grab\"), a_FileNameBase, a_SizeX), cFile::fmWrite))\n\t{\n\t\tfor (size_t y = 0; y < a_SizeY; y++)\n\t\t{\n\t\t\tfor (size_t z = 0; z < a_SizeZ; z++)\n\t\t\t{\n\t\t\t\tsize_t idx = y * a_SizeX + z * a_SizeX * a_SizeY;\n\t\t\t\tunsigned char buf[BUF_SIZE];\n\t\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t\t{\n\t\t\t\t\tbuf[x] = static_cast<unsigned char>(Clamp(static_cast<int>(128 + a_Coeff * a_Noise[idx++]), 0, 255));\n\t\t\t\t}\n\t\t\t\tf2.Write(buf, a_SizeX);\n\t\t\t}  // for z\n\t\t\tunsigned char buf[BUF_SIZE];\n\t\t\tmemset(buf, 0, a_SizeX);\n\t\t\tf2.Write(buf, a_SizeX);\n\t\t}  // for y\n\t}  // if (XZ file open)\n}\n\n\n\n\n\nvoid Debug2DNoise(const NOISE_DATATYPE * a_Noise, size_t a_SizeX, size_t a_SizeY, const AString & a_FileNameBase, NOISE_DATATYPE a_Coeff)\n{\n\tconst int BUF_SIZE = 512;\n\tASSERT(a_SizeX <= BUF_SIZE);  // Just stretch it, if needed\n\n\tcFile f1;\n\tif (f1.Open(fmt::format(FMT_STRING(\"{} ({}).grab\"), a_FileNameBase, a_SizeX), cFile::fmWrite))\n\t{\n\t\tfor (size_t y = 0; y < a_SizeY; y++)\n\t\t{\n\t\t\tsize_t idx = y * a_SizeX;\n\t\t\tunsigned char buf[BUF_SIZE];\n\t\t\tfor (size_t x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tbuf[x] = static_cast<unsigned char>(Clamp(static_cast<int>(128 + a_Coeff * a_Noise[idx++]), 0, 255));\n\t\t\t}\n\t\t\tf1.Write(buf, a_SizeX);\n\t\t}  // for y\n\t}  // if (file open)\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCubicCell2D:\n\nclass cCubicCell2D\n{\npublic:\n\tcCubicCell2D(\n\t\tconst cNoise & a_Noise,    ///< Noise to use for generating the random values\n\t\tNOISE_DATATYPE * a_Array,  ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY,  ///< Count of the array, in each direction\n\t\tconst NOISE_DATATYPE * a_FracX,  ///< Pointer to the array that stores the X fractional values\n\t\tconst NOISE_DATATYPE * a_FracY   ///< Pointer to the attay that stores the Y fractional values\n\t);\n\n\t/** Uses current m_WorkRnds[] to generate part of the array */\n\tvoid Generate(\n\t\tint a_FromX, int a_ToX,\n\t\tint a_FromY, int a_ToY\n\t);\n\n\t/** Initializes m_WorkRnds[] with the specified Floor values */\n\tvoid InitWorkRnds(int a_FloorX, int a_FloorY);\n\n\t/** Updates m_WorkRnds[] for the new Floor values. */\n\tvoid Move(int a_NewFloorX, int a_NewFloorY);\n\nprotected:\n\ttypedef NOISE_DATATYPE Workspace[4][4];\n\n\tconst cNoise & m_Noise;\n\n\tWorkspace * m_WorkRnds;  ///< The current random values; points to either m_Workspace1 or m_Workspace2 (doublebuffering)\n\tWorkspace m_Workspace1;  ///< Buffer 1 for workspace doublebuffering, used in Move()\n\tWorkspace m_Workspace2;  ///< Buffer 2 for workspace doublebuffering, used in Move()\n\tint m_CurFloorX;\n\tint m_CurFloorY;\n\n\tNOISE_DATATYPE * m_Array;\n\tint m_SizeX, m_SizeY;\n\tconst NOISE_DATATYPE * m_FracX;\n\tconst NOISE_DATATYPE * m_FracY;\n} ;\n\n\n\n\n\ncCubicCell2D::cCubicCell2D(\n\tconst cNoise & a_Noise,    ///< Noise to use for generating the random values\n\tNOISE_DATATYPE * a_Array,  ///< Array to generate into [x + a_SizeX * y]\n\tint a_SizeX, int a_SizeY,  ///< Count of the array, in each direction\n\tconst NOISE_DATATYPE * a_FracX,  ///< Pointer to the array that stores the X fractional values\n\tconst NOISE_DATATYPE * a_FracY   ///< Pointer to the attay that stores the Y fractional values\n) :\n\tm_Noise(a_Noise),\n\tm_WorkRnds(&m_Workspace1),\n\tm_CurFloorX(0),\n\tm_CurFloorY(0),\n\tm_Array(a_Array),\n\tm_SizeX(a_SizeX),\n\tm_SizeY(a_SizeY),\n\tm_FracX(a_FracX),\n\tm_FracY(a_FracY)\n{\n}\n\n\n\n\n\nvoid cCubicCell2D::Generate(\n\tint a_FromX, int a_ToX,\n\tint a_FromY, int a_ToY\n)\n{\n\tfor (int y = a_FromY; y < a_ToY; y++)\n\t{\n\t\tNOISE_DATATYPE Interp[4];\n\t\tNOISE_DATATYPE FracY = m_FracY[y];\n\t\tInterp[0] = cNoise::CubicInterpolate((*m_WorkRnds)[0][0], (*m_WorkRnds)[0][1], (*m_WorkRnds)[0][2], (*m_WorkRnds)[0][3], FracY);\n\t\tInterp[1] = cNoise::CubicInterpolate((*m_WorkRnds)[1][0], (*m_WorkRnds)[1][1], (*m_WorkRnds)[1][2], (*m_WorkRnds)[1][3], FracY);\n\t\tInterp[2] = cNoise::CubicInterpolate((*m_WorkRnds)[2][0], (*m_WorkRnds)[2][1], (*m_WorkRnds)[2][2], (*m_WorkRnds)[2][3], FracY);\n\t\tInterp[3] = cNoise::CubicInterpolate((*m_WorkRnds)[3][0], (*m_WorkRnds)[3][1], (*m_WorkRnds)[3][2], (*m_WorkRnds)[3][3], FracY);\n\t\tint idx = y * m_SizeX + a_FromX;\n\t\tfor (int x = a_FromX; x < a_ToX; x++)\n\t\t{\n\t\t\tm_Array[idx++] = cNoise::CubicInterpolate(Interp[0], Interp[1], Interp[2], Interp[3], m_FracX[x]);\n\t\t}  // for x\n\t}  // for y\n}\n\n\n\n\n\nvoid cCubicCell2D::InitWorkRnds(int a_FloorX, int a_FloorY)\n{\n\tm_CurFloorX = a_FloorX;\n\tm_CurFloorY = a_FloorY;\n\tfor (int x = 0; x < 4; x++)\n\t{\n\t\tint cx = a_FloorX + x - 1;\n\t\tfor (int y = 0; y < 4; y++)\n\t\t{\n\t\t\tint cy = a_FloorY + y - 1;\n\t\t\t(*m_WorkRnds)[x][y] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise2D(cx, cy));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cCubicCell2D::Move(int a_NewFloorX, int a_NewFloorY)\n{\n\t// Swap the doublebuffer:\n\tint OldFloorX = m_CurFloorX;\n\tint OldFloorY = m_CurFloorY;\n\tWorkspace * OldWorkRnds = m_WorkRnds;\n\tm_WorkRnds = (m_WorkRnds == &m_Workspace1) ? &m_Workspace2 : &m_Workspace1;\n\n\t// Reuse as much of the old workspace as possible:\n\tint DiffX = OldFloorX - a_NewFloorX;\n\tint DiffY = OldFloorY - a_NewFloorY;\n\tfor (int x = 0; x < 4; x++)\n\t{\n\t\tint cx = a_NewFloorX + x - 1;\n\t\tint OldX = x - DiffX;  // Where would this X be in the old grid?\n\t\tfor (int y = 0; y < 4; y++)\n\t\t{\n\t\t\tint cy = a_NewFloorY + y - 1;\n\t\t\tint OldY = y - DiffY;  // Where would this Y be in the old grid?\n\t\t\tif ((OldX >= 0) && (OldX < 4) && (OldY >= 0) && (OldY < 4))\n\t\t\t{\n\t\t\t\t(*m_WorkRnds)[x][y] = (*OldWorkRnds)[OldX][OldY];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t(*m_WorkRnds)[x][y] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise2D(cx, cy));\n\t\t\t}\n\t\t}\n\t}\n\tm_CurFloorX = a_NewFloorX;\n\tm_CurFloorY = a_NewFloorY;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCubicCell3D:\n\nclass cCubicCell3D\n{\npublic:\n\tcCubicCell3D(\n\t\tconst cNoise & a_Noise,                 ///< Noise to use for generating the random values\n\t\tNOISE_DATATYPE * a_Array,               ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY, int a_SizeZ,  ///< Count of the array, in each direction\n\t\tconst NOISE_DATATYPE * a_FracX,         ///< Pointer to the array that stores the X fractional values\n\t\tconst NOISE_DATATYPE * a_FracY,         ///< Pointer to the attay that stores the Y fractional values\n\t\tconst NOISE_DATATYPE * a_FracZ          ///< Pointer to the array that stores the Z fractional values\n\t);\n\n\t/** Uses current m_WorkRnds[] to generate part of the array */\n\tvoid Generate(\n\t\tint a_FromX, int a_ToX,\n\t\tint a_FromY, int a_ToY,\n\t\tint a_FromZ, int a_ToZ\n\t);\n\n\t/** Initializes m_WorkRnds[] with the specified Floor values */\n\tvoid InitWorkRnds(int a_FloorX, int a_FloorY, int a_FloorZ);\n\n\t/** Updates m_WorkRnds[] for the new Floor values. */\n\tvoid Move(int a_NewFloorX, int a_NewFloorY, int a_NewFloorZ);\n\nprotected:\n\ttypedef NOISE_DATATYPE Workspace[4][4][4];\n\n\tconst cNoise & m_Noise;\n\n\tWorkspace * m_WorkRnds;  ///< The current random values; points to either m_Workspace1 or m_Workspace2 (doublebuffering)\n\tWorkspace m_Workspace1;  ///< Buffer 1 for workspace doublebuffering, used in Move()\n\tWorkspace m_Workspace2;  ///< Buffer 2 for workspace doublebuffering, used in Move()\n\tint m_CurFloorX;\n\tint m_CurFloorY;\n\tint m_CurFloorZ;\n\n\tNOISE_DATATYPE * m_Array;\n\tint m_SizeX, m_SizeY, m_SizeZ;\n\tconst NOISE_DATATYPE * m_FracX;\n\tconst NOISE_DATATYPE * m_FracY;\n\tconst NOISE_DATATYPE * m_FracZ;\n} ;\n\n\n\n\n\ncCubicCell3D::cCubicCell3D(\n\tconst cNoise & a_Noise,                 ///< Noise to use for generating the random values\n\tNOISE_DATATYPE * a_Array,               ///< Array to generate into [x + a_SizeX * y]\n\tint a_SizeX, int a_SizeY, int a_SizeZ,  ///< Count of the array, in each direction\n\tconst NOISE_DATATYPE * a_FracX,         ///< Pointer to the array that stores the X fractional values\n\tconst NOISE_DATATYPE * a_FracY,         ///< Pointer to the attay that stores the Y fractional values\n\tconst NOISE_DATATYPE * a_FracZ          ///< Pointer to the array that stores the Z fractional values\n) :\n\tm_Noise(a_Noise),\n\tm_WorkRnds(&m_Workspace1),\n\tm_CurFloorX(0),\n\tm_CurFloorY(0),\n\tm_CurFloorZ(0),\n\tm_Array(a_Array),\n\tm_SizeX(a_SizeX),\n\tm_SizeY(a_SizeY),\n\tm_SizeZ(a_SizeZ),\n\tm_FracX(a_FracX),\n\tm_FracY(a_FracY),\n\tm_FracZ(a_FracZ)\n{\n}\n\n\n\n\n\nvoid cCubicCell3D::Generate(\n\tint a_FromX, int a_ToX,\n\tint a_FromY, int a_ToY,\n\tint a_FromZ, int a_ToZ\n)\n{\n\tfor (int z = a_FromZ; z < a_ToZ; z++)\n\t{\n\t\tint idxZ = z * m_SizeX * m_SizeY;\n\t\tNOISE_DATATYPE Interp2[4][4];\n\t\tNOISE_DATATYPE FracZ = m_FracZ[z];\n\t\tfor (int x = 0; x < 4; x++)\n\t\t{\n\t\t\tfor (int y = 0; y < 4; y++)\n\t\t\t{\n\t\t\t\tInterp2[x][y] = cNoise::CubicInterpolate((*m_WorkRnds)[x][y][0], (*m_WorkRnds)[x][y][1], (*m_WorkRnds)[x][y][2], (*m_WorkRnds)[x][y][3], FracZ);\n\t\t\t}\n\t\t}\n\t\tfor (int y = a_FromY; y < a_ToY; y++)\n\t\t{\n\t\t\tNOISE_DATATYPE Interp[4];\n\t\t\tNOISE_DATATYPE FracY = m_FracY[y];\n\t\t\tInterp[0] = cNoise::CubicInterpolate(Interp2[0][0], Interp2[0][1], Interp2[0][2], Interp2[0][3], FracY);\n\t\t\tInterp[1] = cNoise::CubicInterpolate(Interp2[1][0], Interp2[1][1], Interp2[1][2], Interp2[1][3], FracY);\n\t\t\tInterp[2] = cNoise::CubicInterpolate(Interp2[2][0], Interp2[2][1], Interp2[2][2], Interp2[2][3], FracY);\n\t\t\tInterp[3] = cNoise::CubicInterpolate(Interp2[3][0], Interp2[3][1], Interp2[3][2], Interp2[3][3], FracY);\n\t\t\tint idx = idxZ + y * m_SizeX + a_FromX;\n\t\t\tfor (int x = a_FromX; x < a_ToX; x++)\n\t\t\t{\n\t\t\t\tm_Array[idx++] = cNoise::CubicInterpolate(Interp[0], Interp[1], Interp[2], Interp[3], m_FracX[x]);\n\t\t\t}  // for x\n\t\t}  // for y\n\t}  // for z\n}\n\n\n\n\n\nvoid cCubicCell3D::InitWorkRnds(int a_FloorX, int a_FloorY, int a_FloorZ)\n{\n\tm_CurFloorX = a_FloorX;\n\tm_CurFloorY = a_FloorY;\n\tm_CurFloorZ = a_FloorZ;\n\tfor (int x = 0; x < 4; x++)\n\t{\n\t\tint cx = a_FloorX + x - 1;\n\t\tfor (int y = 0; y < 4; y++)\n\t\t{\n\t\t\tint cy = a_FloorY + y - 1;\n\t\t\tfor (int z = 0; z < 4; z++)\n\t\t\t{\n\t\t\t\tint cz = a_FloorZ + z - 1;\n\t\t\t\t(*m_WorkRnds)[x][y][z] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(cx, cy, cz));\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cCubicCell3D::Move(int a_NewFloorX, int a_NewFloorY, int a_NewFloorZ)\n{\n\t// Swap the doublebuffer:\n\tint OldFloorX = m_CurFloorX;\n\tint OldFloorY = m_CurFloorY;\n\tint OldFloorZ = m_CurFloorZ;\n\tWorkspace * OldWorkRnds = m_WorkRnds;\n\tm_WorkRnds = (m_WorkRnds == &m_Workspace1) ? &m_Workspace2 : &m_Workspace1;\n\n\t// Reuse as much of the old workspace as possible:\n\tint DiffX = OldFloorX - a_NewFloorX;\n\tint DiffY = OldFloorY - a_NewFloorY;\n\tint DiffZ = OldFloorZ - a_NewFloorZ;\n\tfor (int x = 0; x < 4; x++)\n\t{\n\t\tint cx = a_NewFloorX + x - 1;\n\t\tint OldX = x - DiffX;  // Where would this X be in the old grid?\n\t\tfor (int y = 0; y < 4; y++)\n\t\t{\n\t\t\tint cy = a_NewFloorY + y - 1;\n\t\t\tint OldY = y - DiffY;  // Where would this Y be in the old grid?\n\t\t\tfor (int z = 0; z < 4; z++)\n\t\t\t{\n\t\t\t\tint cz = a_NewFloorZ + z - 1;\n\t\t\t\tint OldZ = z - DiffZ;\n\t\t\t\tif ((OldX >= 0) && (OldX < 4) && (OldY >= 0) && (OldY < 4) && (OldZ >= 0) && (OldZ < 4))\n\t\t\t\t{\n\t\t\t\t\t(*m_WorkRnds)[x][y][z] = (*OldWorkRnds)[OldX][OldY][OldZ];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t(*m_WorkRnds)[x][y][z] = static_cast<NOISE_DATATYPE>(m_Noise.IntNoise3D(cx, cy, cz));\n\t\t\t\t}\n\t\t\t}  // for z\n\t\t}  // for y\n\t}  // for x\n\tm_CurFloorX = a_NewFloorX;\n\tm_CurFloorY = a_NewFloorY;\n\tm_CurFloorZ = a_NewFloorZ;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNoise:\n\ncNoise::cNoise(int a_Seed) :\n\tm_Seed(a_Seed)\n{\n}\n\n\n\n\n\ncNoise::cNoise(const cNoise & a_Noise) :\n\tm_Seed(a_Noise.m_Seed)\n{\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::LinearNoise1D(NOISE_DATATYPE a_X) const\n{\n\tint BaseX = FAST_FLOOR(a_X);\n\tNOISE_DATATYPE FracX = a_X - BaseX;\n\treturn LinearInterpolate(IntNoise1D(BaseX), IntNoise1D(BaseX + 1), FracX);\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::CosineNoise1D(NOISE_DATATYPE a_X) const\n{\n\tint BaseX = FAST_FLOOR(a_X);\n\tNOISE_DATATYPE FracX = a_X - BaseX;\n\treturn CosineInterpolate(IntNoise1D(BaseX), IntNoise1D(BaseX + 1), FracX);\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::CubicNoise1D(NOISE_DATATYPE a_X) const\n{\n\tint BaseX = FAST_FLOOR(a_X);\n\tNOISE_DATATYPE FracX = a_X - BaseX;\n\treturn CubicInterpolate(IntNoise1D(BaseX - 1), IntNoise1D(BaseX), IntNoise1D(BaseX + 1), IntNoise1D(BaseX + 2), FracX);\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::SmoothNoise1D(int a_X) const\n{\n\treturn IntNoise1D(a_X) / 2 + IntNoise1D(a_X - 1) / 4 + IntNoise1D(a_X + 1) / 4;\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::CubicNoise2D(NOISE_DATATYPE a_X, NOISE_DATATYPE a_Y) const\n{\n\tconst int BaseX = FAST_FLOOR(a_X);\n\tconst int BaseY = FAST_FLOOR(a_Y);\n\n\tconst NOISE_DATATYPE points[4][4] =\n\t{\n\t\t{ IntNoise2D(BaseX - 1, BaseY - 1), IntNoise2D(BaseX, BaseY - 1), IntNoise2D(BaseX + 1, BaseY - 1), IntNoise2D(BaseX + 2, BaseY - 1), },\n\t\t{ IntNoise2D(BaseX - 1, BaseY),     IntNoise2D(BaseX, BaseY),     IntNoise2D(BaseX + 1, BaseY),     IntNoise2D(BaseX + 2, BaseY),     },\n\t\t{ IntNoise2D(BaseX - 1, BaseY + 1), IntNoise2D(BaseX, BaseY + 1), IntNoise2D(BaseX + 1, BaseY + 1), IntNoise2D(BaseX + 2, BaseY + 1), },\n\t\t{ IntNoise2D(BaseX - 1, BaseY + 2), IntNoise2D(BaseX, BaseY + 2), IntNoise2D(BaseX + 1, BaseY + 2), IntNoise2D(BaseX + 2, BaseY + 2), },\n\t};\n\n\tconst NOISE_DATATYPE FracX = a_X - BaseX;\n\tconst NOISE_DATATYPE interp1 = CubicInterpolate(points[0][0], points[0][1], points[0][2], points[0][3], FracX);\n\tconst NOISE_DATATYPE interp2 = CubicInterpolate(points[1][0], points[1][1], points[1][2], points[1][3], FracX);\n\tconst NOISE_DATATYPE interp3 = CubicInterpolate(points[2][0], points[2][1], points[2][2], points[2][3], FracX);\n\tconst NOISE_DATATYPE interp4 = CubicInterpolate(points[3][0], points[3][1], points[3][2], points[3][3], FracX);\n\n\n\tconst NOISE_DATATYPE FracY = a_Y - BaseY;\n\treturn CubicInterpolate(interp1, interp2, interp3, interp4, FracY);\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::CubicNoise3D(NOISE_DATATYPE a_X, NOISE_DATATYPE a_Y, NOISE_DATATYPE a_Z) const\n{\n\tconst int BaseX = FAST_FLOOR(a_X);\n\tconst int BaseY = FAST_FLOOR(a_Y);\n\tconst int BaseZ = FAST_FLOOR(a_Z);\n\n\tconst NOISE_DATATYPE points1[4][4] =\n\t{\n\t\t{ IntNoise3D(BaseX - 1, BaseY - 1, BaseZ - 1), IntNoise3D(BaseX, BaseY - 1, BaseZ - 1), IntNoise3D(BaseX + 1, BaseY - 1, BaseZ - 1), IntNoise3D(BaseX + 2, BaseY - 1, BaseZ - 1), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY,     BaseZ - 1), IntNoise3D(BaseX, BaseY,     BaseZ - 1), IntNoise3D(BaseX + 1, BaseY,     BaseZ - 1), IntNoise3D(BaseX + 2, BaseY,     BaseZ - 1), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY + 1, BaseZ - 1), IntNoise3D(BaseX, BaseY + 1, BaseZ - 1), IntNoise3D(BaseX + 1, BaseY + 1, BaseZ - 1), IntNoise3D(BaseX + 2, BaseY + 1, BaseZ - 1), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY + 2, BaseZ - 1), IntNoise3D(BaseX, BaseY + 2, BaseZ - 1), IntNoise3D(BaseX + 1, BaseY + 2, BaseZ - 1), IntNoise3D(BaseX + 2, BaseY + 2, BaseZ - 1), },\n\t};\n\n\tconst NOISE_DATATYPE FracX = (a_X) - BaseX;\n\tconst NOISE_DATATYPE x1interp1 = CubicInterpolate(points1[0][0], points1[0][1], points1[0][2], points1[0][3], FracX);\n\tconst NOISE_DATATYPE x1interp2 = CubicInterpolate(points1[1][0], points1[1][1], points1[1][2], points1[1][3], FracX);\n\tconst NOISE_DATATYPE x1interp3 = CubicInterpolate(points1[2][0], points1[2][1], points1[2][2], points1[2][3], FracX);\n\tconst NOISE_DATATYPE x1interp4 = CubicInterpolate(points1[3][0], points1[3][1], points1[3][2], points1[3][3], FracX);\n\n\tconst NOISE_DATATYPE points2[4][4] =\n\t{\n\t\t{ IntNoise3D(BaseX - 1, BaseY - 1, BaseZ), IntNoise3D(BaseX, BaseY - 1, BaseZ), IntNoise3D(BaseX + 1, BaseY - 1, BaseZ), IntNoise3D(BaseX + 2, BaseY - 1, BaseZ), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY,     BaseZ), IntNoise3D(BaseX, BaseY,     BaseZ), IntNoise3D(BaseX + 1, BaseY,     BaseZ), IntNoise3D(BaseX + 2, BaseY,     BaseZ), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY + 1, BaseZ), IntNoise3D(BaseX, BaseY + 1, BaseZ), IntNoise3D(BaseX + 1, BaseY + 1, BaseZ), IntNoise3D(BaseX + 2, BaseY + 1, BaseZ), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY + 2, BaseZ), IntNoise3D(BaseX, BaseY + 2, BaseZ), IntNoise3D(BaseX + 1, BaseY + 2, BaseZ), IntNoise3D(BaseX + 2, BaseY + 2, BaseZ), },\n\t};\n\n\tconst NOISE_DATATYPE x2interp1 = CubicInterpolate(points2[0][0], points2[0][1], points2[0][2], points2[0][3], FracX);\n\tconst NOISE_DATATYPE x2interp2 = CubicInterpolate(points2[1][0], points2[1][1], points2[1][2], points2[1][3], FracX);\n\tconst NOISE_DATATYPE x2interp3 = CubicInterpolate(points2[2][0], points2[2][1], points2[2][2], points2[2][3], FracX);\n\tconst NOISE_DATATYPE x2interp4 = CubicInterpolate(points2[3][0], points2[3][1], points2[3][2], points2[3][3], FracX);\n\n\tconst NOISE_DATATYPE points3[4][4] =\n\t{\n\t\t{ IntNoise3D(BaseX - 1, BaseY - 1, BaseZ + 1), IntNoise3D(BaseX, BaseY - 1, BaseZ + 1), IntNoise3D(BaseX + 1, BaseY - 1, BaseZ + 1), IntNoise3D(BaseX + 2, BaseY - 1, BaseZ + 1), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY,\t   BaseZ + 1), IntNoise3D(BaseX, BaseY,     BaseZ + 1), IntNoise3D(BaseX + 1, BaseY,     BaseZ + 1), IntNoise3D(BaseX + 2, BaseY,     BaseZ + 1), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY + 1, BaseZ + 1), IntNoise3D(BaseX, BaseY + 1, BaseZ + 1), IntNoise3D(BaseX + 1, BaseY + 1, BaseZ + 1), IntNoise3D(BaseX + 2, BaseY + 1, BaseZ + 1), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY + 2, BaseZ + 1), IntNoise3D(BaseX, BaseY + 2, BaseZ + 1), IntNoise3D(BaseX + 1, BaseY + 2, BaseZ + 1), IntNoise3D(BaseX + 2, BaseY + 2, BaseZ + 1), },\n\t};\n\n\tconst NOISE_DATATYPE x3interp1 = CubicInterpolate(points3[0][0], points3[0][1], points3[0][2], points3[0][3], FracX);\n\tconst NOISE_DATATYPE x3interp2 = CubicInterpolate(points3[1][0], points3[1][1], points3[1][2], points3[1][3], FracX);\n\tconst NOISE_DATATYPE x3interp3 = CubicInterpolate(points3[2][0], points3[2][1], points3[2][2], points3[2][3], FracX);\n\tconst NOISE_DATATYPE x3interp4 = CubicInterpolate(points3[3][0], points3[3][1], points3[3][2], points3[3][3], FracX);\n\n\tconst NOISE_DATATYPE points4[4][4] =\n\t{\n\t\t{ IntNoise3D(BaseX - 1, BaseY - 1, BaseZ + 2), IntNoise3D(BaseX, BaseY - 1, BaseZ + 2), IntNoise3D(BaseX + 1, BaseY - 1, BaseZ + 2), IntNoise3D(BaseX + 2, BaseY - 1, BaseZ + 2), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY,\t   BaseZ + 2), IntNoise3D(BaseX, BaseY,     BaseZ + 2), IntNoise3D(BaseX + 1, BaseY,     BaseZ + 2), IntNoise3D(BaseX + 2, BaseY,     BaseZ + 2), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY + 1, BaseZ + 2), IntNoise3D(BaseX, BaseY + 1, BaseZ + 2), IntNoise3D(BaseX + 1, BaseY + 1, BaseZ + 2), IntNoise3D(BaseX + 2, BaseY + 1, BaseZ + 2), },\n\t\t{ IntNoise3D(BaseX - 1, BaseY + 2, BaseZ + 2), IntNoise3D(BaseX, BaseY + 2, BaseZ + 2), IntNoise3D(BaseX + 1, BaseY + 2, BaseZ + 2), IntNoise3D(BaseX + 2, BaseY + 2, BaseZ + 2), },\n\t};\n\n\tconst NOISE_DATATYPE x4interp1 = CubicInterpolate(points4[0][0], points4[0][1], points4[0][2], points4[0][3], FracX);\n\tconst NOISE_DATATYPE x4interp2 = CubicInterpolate(points4[1][0], points4[1][1], points4[1][2], points4[1][3], FracX);\n\tconst NOISE_DATATYPE x4interp3 = CubicInterpolate(points4[2][0], points4[2][1], points4[2][2], points4[2][3], FracX);\n\tconst NOISE_DATATYPE x4interp4 = CubicInterpolate(points4[3][0], points4[3][1], points4[3][2], points4[3][3], FracX);\n\n\tconst NOISE_DATATYPE FracY = (a_Y) - BaseY;\n\tconst NOISE_DATATYPE yinterp1 = CubicInterpolate(x1interp1, x1interp2, x1interp3, x1interp4, FracY);\n\tconst NOISE_DATATYPE yinterp2 = CubicInterpolate(x2interp1, x2interp2, x2interp3, x2interp4, FracY);\n\tconst NOISE_DATATYPE yinterp3 = CubicInterpolate(x3interp1, x3interp2, x3interp3, x3interp4, FracY);\n\tconst NOISE_DATATYPE yinterp4 = CubicInterpolate(x4interp1, x4interp2, x4interp3, x4interp4, FracY);\n\n\tconst NOISE_DATATYPE FracZ = (a_Z) - BaseZ;\n\treturn CubicInterpolate(yinterp1, yinterp2, yinterp3, yinterp4, FracZ);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCubicNoise:\n\ncCubicNoise::cCubicNoise(int a_Seed) :\n\tm_Noise(a_Seed)\n{\n}\n\n\n\n\n\nvoid cCubicNoise::Generate2D(\n\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y]\n\tint a_SizeX, int a_SizeY,                        ///< Size of the array (num doubles), in each direction\n\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY   ///< Noise-space coords of the array in the Y direction\n) const\n{\n\tASSERT(a_SizeX > 0);\n\tASSERT(a_SizeY > 0);\n\tASSERT(a_SizeX < MAX_SIZE);\n\tASSERT(a_SizeY < MAX_SIZE);\n\tASSERT(a_StartX < a_EndX);\n\tASSERT(a_StartY < a_EndY);\n\n\t// Calculate the integral and fractional parts of each coord:\n\tint FloorX[MAX_SIZE];\n\tint FloorY[MAX_SIZE];\n\tNOISE_DATATYPE FracX[MAX_SIZE];\n\tNOISE_DATATYPE FracY[MAX_SIZE];\n\tint SameX[MAX_SIZE];\n\tint SameY[MAX_SIZE];\n\tint NumSameX, NumSameY;\n\tCalcFloorFrac(a_SizeX, a_StartX, a_EndX, FloorX, FracX, SameX, NumSameX);\n\tCalcFloorFrac(a_SizeY, a_StartY, a_EndY, FloorY, FracY, SameY, NumSameY);\n\n\tcCubicCell2D Cell(m_Noise, a_Array, a_SizeX, a_SizeY, FracX, FracY);\n\n\tCell.InitWorkRnds(FloorX[0], FloorY[0]);\n\n\t// Calculate query values using Cell:\n\tint FromY = 0;\n\tfor (int y = 0; y < NumSameY;)\n\t{\n\t\tint ToY = FromY + SameY[y];\n\t\tint FromX = 0;\n\t\tint CurFloorY = FloorY[FromY];\n\t\tfor (int x = 0; x < NumSameX;)\n\t\t{\n\t\t\tint ToX = FromX + SameX[x];\n\t\t\tCell.Generate(FromX, ToX, FromY, ToY);\n\t\t\tif (++x < NumSameX)  // Call Move() every time except for the last loop iteration\n\t\t\t{\n\t\t\t\tCell.Move(FloorX[ToX], CurFloorY);\n\t\t\t\tFromX = ToX;\n\t\t\t}\n\t\t}\n\t\tif (++y < NumSameY)  // Call Move() every time except for the last loop iteration\n\t\t{\n\t\t\tCell.Move(FloorX[0], FloorY[ToY]);\n\t\t\tFromY = ToY;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cCubicNoise::Generate3D(\n\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y]\n\tint a_SizeX, int a_SizeY, int a_SizeZ,           ///< Size of the array (num doubles), in each direction\n\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY,  ///< Noise-space coords of the array in the Y direction\n\tNOISE_DATATYPE a_StartZ, NOISE_DATATYPE a_EndZ   ///< Noise-space coords of the array in the Y direction\n) const\n{\n\tASSERT(a_SizeX < MAX_SIZE);\n\tASSERT(a_SizeY < MAX_SIZE);\n\tASSERT(a_SizeZ < MAX_SIZE);\n\tASSERT(a_StartX < a_EndX);\n\tASSERT(a_StartY < a_EndY);\n\tASSERT(a_StartZ < a_EndZ);\n\n\t// Calculate the integral and fractional parts of each coord:\n\tint FloorX[MAX_SIZE];\n\tint FloorY[MAX_SIZE];\n\tint FloorZ[MAX_SIZE];\n\tNOISE_DATATYPE FracX[MAX_SIZE];\n\tNOISE_DATATYPE FracY[MAX_SIZE];\n\tNOISE_DATATYPE FracZ[MAX_SIZE];\n\tint SameX[MAX_SIZE];\n\tint SameY[MAX_SIZE];\n\tint SameZ[MAX_SIZE];\n\tint NumSameX, NumSameY, NumSameZ;\n\tCalcFloorFrac(a_SizeX, a_StartX, a_EndX, FloorX, FracX, SameX, NumSameX);\n\tCalcFloorFrac(a_SizeY, a_StartY, a_EndY, FloorY, FracY, SameY, NumSameY);\n\tCalcFloorFrac(a_SizeZ, a_StartZ, a_EndZ, FloorZ, FracZ, SameZ, NumSameZ);\n\n\tcCubicCell3D Cell(\n\t\tm_Noise, a_Array,\n\t\ta_SizeX, a_SizeY, a_SizeZ,\n\t\tFracX, FracY, FracZ\n\t);\n\n\tCell.InitWorkRnds(FloorX[0], FloorY[0], FloorZ[0]);\n\n\t// Calculate query values using Cell:\n\tint FromZ = 0;\n\tfor (int z = 0; z < NumSameZ;)\n\t{\n\t\tint ToZ = FromZ + SameZ[z];\n\t\tint CurFloorZ = FloorZ[FromZ];\n\t\tint FromY = 0;\n\t\tfor (int y = 0; y < NumSameY;)\n\t\t{\n\t\t\tint ToY = FromY + SameY[y];\n\t\t\tint CurFloorY = FloorY[FromY];\n\t\t\tint FromX = 0;\n\t\t\tfor (int x = 0; x < NumSameX;)\n\t\t\t{\n\t\t\t\tint ToX = FromX + SameX[x];\n\t\t\t\tCell.Generate(FromX, ToX, FromY, ToY, FromZ, ToZ);\n\t\t\t\tif (++x < NumSameX)  // Call Move() every time except for the last loop iteration\n\t\t\t\t{\n\t\t\t\t\tCell.Move(FloorX[ToX], CurFloorY, CurFloorZ);\n\t\t\t\t\tFromX = ToX;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (++y < NumSameY)  // Call Move() every time except for the last loop iteration\n\t\t\t{\n\t\t\t\tCell.Move(FloorX[0], FloorY[ToY], CurFloorZ);\n\t\t\t\tFromY = ToY;\n\t\t\t}\n\t\t}  // for y\n\t\tif (++z < NumSameZ)  // Call Move() every time except for the last loop iteration\n\t\t{\n\t\t\tCell.Move(FloorX[0], FloorY[0], FloorZ[ToZ]);\n\t\t\tFromZ = ToZ;\n\t\t}\n\t}  // for z\n}\n\n\n\n\n\nvoid cCubicNoise::CalcFloorFrac(\n\tint a_Size,\n\tNOISE_DATATYPE a_Start, NOISE_DATATYPE a_End,\n\tint * a_Floor, NOISE_DATATYPE * a_Frac,\n\tint * a_Same, int & a_NumSame\n) const\n{\n\tASSERT(a_Size > 0);\n\n\tNOISE_DATATYPE val = a_Start;\n\tNOISE_DATATYPE dif = (a_End - a_Start) / (a_Size - 1);\n\tfor (int i = 0; i < a_Size; i++)\n\t{\n\t\ta_Floor[i] = FAST_FLOOR(val);\n\t\ta_Frac[i] = val - a_Floor[i];\n\t\tval += dif;\n\t}\n\n\t// Mark up the same floor values into a_Same / a_NumSame:\n\tint CurFloor = a_Floor[0];\n\tint LastSame = 0;\n\ta_NumSame = 0;\n\tfor (int i = 1; i < a_Size; i++)\n\t{\n\t\tif (a_Floor[i] != CurFloor)\n\t\t{\n\t\t\ta_Same[a_NumSame] = i - LastSame;\n\t\t\tLastSame = i;\n\t\t\ta_NumSame += 1;\n\t\t\tCurFloor = a_Floor[i];\n\t\t}\n\t}  // for i - a_Floor[]\n\tif (LastSame < a_Size)\n\t{\n\t\ta_Same[a_NumSame] = a_Size - LastSame;\n\t\ta_NumSame += 1;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cImprovedNoise:\n\ncImprovedNoise::cImprovedNoise(int a_Seed)\n{\n\t// Initialize the permutations with identity:\n\tfor (int i = 0; i < 256; i++)\n\t{\n\t\tm_Perm[i] = i;\n\t}\n\n\t// Randomize the permutation table - swap each element with a random other element:\n\tcNoise noise(a_Seed);\n\tfor (int i = 0; i < 256; i++)\n\t{\n\t\tint rnd = (noise.IntNoise1DInt(i) / 7) % 256;\n\t\tstd::swap(m_Perm[i], m_Perm[rnd]);\n\t}\n\n\t// Copy the lower 256 entries into upper 256 entries:\n\tfor (int i = 0; i < 256; i++)\n\t{\n\t\tm_Perm[i + 256] = m_Perm[i];\n\t}\n}\n\n\n\n\n\nvoid cImprovedNoise::Generate2D(\n\tNOISE_DATATYPE * a_Array,\n\tint a_SizeX, int a_SizeY,\n\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,\n\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY\n) const\n{\n\tsize_t idx = 0;\n\tfor (int y = 0; y < a_SizeY; y++)\n\t{\n\t\tNOISE_DATATYPE ratioY = static_cast<NOISE_DATATYPE>(y) / (a_SizeY - 1);\n\t\tNOISE_DATATYPE noiseY = Lerp(a_StartY, a_EndY, ratioY);\n\t\tint noiseYInt = FAST_FLOOR(noiseY);\n\t\tint yCoord = noiseYInt & 255;\n\t\tNOISE_DATATYPE noiseYFrac = noiseY - noiseYInt;\n\t\tNOISE_DATATYPE fadeY = Fade(noiseYFrac);\n\t\tfor (int x = 0; x < a_SizeX; x++)\n\t\t{\n\t\t\tNOISE_DATATYPE ratioX = static_cast<NOISE_DATATYPE>(x) / (a_SizeX - 1);\n\t\t\tNOISE_DATATYPE noiseX = Lerp(a_StartX, a_EndX, ratioX);\n\t\t\tint noiseXInt = FAST_FLOOR(noiseX);\n\t\t\tint xCoord = noiseXInt & 255;\n\t\t\tNOISE_DATATYPE noiseXFrac = noiseX - noiseXInt;\n\t\t\tNOISE_DATATYPE fadeX = Fade(noiseXFrac);\n\n\t\t\t// Hash the coordinates:\n\t\t\tint A  = m_Perm[xCoord] + yCoord;\n\t\t\tint AA = m_Perm[A];\n\t\t\tint AB = m_Perm[A + 1];\n\t\t\tint B  = m_Perm[xCoord + 1] + yCoord;\n\t\t\tint BA = m_Perm[B];\n\t\t\tint BB = m_Perm[B + 1];\n\n\t\t\t// Lerp the gradients:\n\t\t\ta_Array[idx++] = Lerp(\n\t\t\t\tLerp(Grad(m_Perm[AA], noiseXFrac, noiseYFrac,     0), Grad(m_Perm[BA], noiseXFrac - 1, noiseYFrac,     0), fadeX),\n\t\t\t\tLerp(Grad(m_Perm[AB], noiseXFrac, noiseYFrac - 1, 0), Grad(m_Perm[BB], noiseXFrac - 1, noiseYFrac - 1, 0), fadeX),\n\t\t\t\tfadeY\n\t\t\t);\n\t\t}  // for x\n\t}  // for y\n}\n\n\n\n\n\nvoid cImprovedNoise::Generate3D(\n\tNOISE_DATATYPE * a_Array,\n\tint a_SizeX, int a_SizeY, int a_SizeZ,\n\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,\n\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY,\n\tNOISE_DATATYPE a_StartZ, NOISE_DATATYPE a_EndZ\n) const\n{\n\tsize_t idx = 0;\n\tfor (int z = 0; z < a_SizeZ; z++)\n\t{\n\t\tNOISE_DATATYPE ratioZ = static_cast<NOISE_DATATYPE>(z) / (a_SizeZ - 1);\n\t\tNOISE_DATATYPE noiseZ = Lerp(a_StartZ, a_EndZ, ratioZ);\n\t\tint noiseZInt = FAST_FLOOR(noiseZ);\n\t\tint zCoord = noiseZInt & 255;\n\t\tNOISE_DATATYPE noiseZFrac = noiseZ - noiseZInt;\n\t\tNOISE_DATATYPE fadeZ = Fade(noiseZFrac);\n\t\tfor (int y = 0; y < a_SizeY; y++)\n\t\t{\n\t\t\tNOISE_DATATYPE ratioY = static_cast<NOISE_DATATYPE>(y) / (a_SizeY - 1);\n\t\t\tNOISE_DATATYPE noiseY = Lerp(a_StartY, a_EndY, ratioY);\n\t\t\tint noiseYInt = FAST_FLOOR(noiseY);\n\t\t\tint yCoord = noiseYInt & 255;\n\t\t\tNOISE_DATATYPE noiseYFrac = noiseY - noiseYInt;\n\t\t\tNOISE_DATATYPE fadeY = Fade(noiseYFrac);\n\t\t\tfor (int x = 0; x < a_SizeX; x++)\n\t\t\t{\n\t\t\t\tNOISE_DATATYPE ratioX = static_cast<NOISE_DATATYPE>(x) / (a_SizeX - 1);\n\t\t\t\tNOISE_DATATYPE noiseX = Lerp(a_StartX, a_EndX, ratioX);\n\t\t\t\tint noiseXInt = FAST_FLOOR(noiseX);\n\t\t\t\tint xCoord = noiseXInt & 255;\n\t\t\t\tNOISE_DATATYPE noiseXFrac = noiseX - noiseXInt;\n\t\t\t\tNOISE_DATATYPE fadeX = Fade(noiseXFrac);\n\n\t\t\t\t// Hash the coordinates:\n\t\t\t\tint A  = m_Perm[xCoord] + yCoord;\n\t\t\t\tint AA = m_Perm[A] + zCoord;\n\t\t\t\tint AB = m_Perm[A + 1] + zCoord;\n\t\t\t\tint B  = m_Perm[xCoord + 1] + yCoord;\n\t\t\t\tint BA = m_Perm[B] + zCoord;\n\t\t\t\tint BB = m_Perm[B + 1] + zCoord;\n\n\t\t\t\t// Lerp the gradients:\n\t\t\t\t// TODO: This may be optimized by swapping the coords and recalculating most lerps only \"once every x\"\n\t\t\t\ta_Array[idx++] = Lerp(\n\t\t\t\t\tLerp(\n\t\t\t\t\t\tLerp(Grad(m_Perm[AA], noiseXFrac, noiseYFrac,     noiseZFrac), Grad(m_Perm[BA], noiseXFrac - 1, noiseYFrac,     noiseZFrac), fadeX),\n\t\t\t\t\t\tLerp(Grad(m_Perm[AB], noiseXFrac, noiseYFrac - 1, noiseZFrac), Grad(m_Perm[BB], noiseXFrac - 1, noiseYFrac - 1, noiseZFrac), fadeX),\n\t\t\t\t\t\tfadeY\n\t\t\t\t\t),\n\t\t\t\t\tLerp(\n\t\t\t\t\t\tLerp(Grad(m_Perm[AA + 1], noiseXFrac, noiseYFrac,     noiseZFrac - 1), Grad(m_Perm[BA + 1], noiseXFrac - 1, noiseYFrac,     noiseZFrac - 1), fadeX),\n\t\t\t\t\t\tLerp(Grad(m_Perm[AB + 1], noiseXFrac, noiseYFrac - 1, noiseZFrac - 1), Grad(m_Perm[BB + 1], noiseXFrac - 1, noiseYFrac - 1, noiseZFrac - 1), fadeX),\n\t\t\t\t\t\tfadeY\n\t\t\t\t\t),\n\t\t\t\t\tfadeZ\n\t\t\t\t);\n\t\t\t}  // for x\n\t\t}  // for y\n\t}  // for z\n}\n\n\n\n\n\nNOISE_DATATYPE cImprovedNoise::GetValueAt(int a_X, int a_Y, int a_Z)\n{\n\t// Hash the coordinates:\n\ta_X = a_X & 255;\n\ta_Y = a_Y & 255;\n\ta_Z = a_Z & 255;\n\tint A  = m_Perm[a_X] + a_Y;\n\tint AA = m_Perm[A] + a_Z;\n\n\treturn Grad(m_Perm[AA], 1, 1, 1);\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/Noise/Noise.h",
    "content": "\n// Noise.h\n\n// Declares the cNoise, cCubicNoise and cPerlinNoise classes for generating noise\n\n#pragma once\n\n/** The datatype used by all the noise generators. */\ntypedef float NOISE_DATATYPE;\n\n#include \"../Vector3.h\"\n#include \"OctavedNoise.h\"\n#include \"RidgedNoise.h\"\n\n\n\n\n\nclass cNoise\n{\npublic:\n\tcNoise(int a_Seed);\n\tcNoise(const cNoise & a_Noise);\n\n\t// The following functions, if not marked INLINE, are about 20 % slower\n\tinline NOISE_DATATYPE IntNoise1D(int a_X) const;\n\tinline NOISE_DATATYPE IntNoise2D(int a_X, int a_Y) const;\n\tinline NOISE_DATATYPE IntNoise3D(int a_X, int a_Y, int a_Z) const;\n\tinline NOISE_DATATYPE IntNoise3D(Vector3i a_Pos) const;\n\n\t// Return a float number in the specified range:\n\tinline NOISE_DATATYPE IntNoise2DInRange(int a_X, int a_Y, float a_Min, float a_Max) const\n\t{\n\t\treturn a_Min + std::abs(IntNoise2D(a_X, a_Y)) * (a_Max - a_Min);\n\t}\n\n\t// Note: These functions have a mod8-irregular chance - each of the mod8 remainders has different chance of occurrence. Divide by 8 to rectify.\n\tinline int IntNoise1DInt(int a_X) const;\n\tinline int IntNoise2DInt(int a_X, int a_Y) const;\n\tinline int IntNoise3DInt(int a_X, int a_Y, int a_Z) const;\n\tinline int IntNoise3DInt(Vector3i a_Pos) const;\n\n\tNOISE_DATATYPE LinearNoise1D(NOISE_DATATYPE a_X) const;\n\tNOISE_DATATYPE CosineNoise1D(NOISE_DATATYPE a_X) const;\n\tNOISE_DATATYPE CubicNoise1D (NOISE_DATATYPE a_X) const;\n\tNOISE_DATATYPE SmoothNoise1D(int a_X) const;\n\n\tNOISE_DATATYPE CubicNoise2D (NOISE_DATATYPE a_X, NOISE_DATATYPE a_Y) const;\n\n\tNOISE_DATATYPE CubicNoise3D (NOISE_DATATYPE a_X, NOISE_DATATYPE a_Y, NOISE_DATATYPE a_Z) const;\n\n\tvoid SetSeed(int a_Seed) { m_Seed = a_Seed; }\n\tint GetSeed(void) const { return m_Seed; }\n\n\tinline static NOISE_DATATYPE CubicInterpolate (NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_C, NOISE_DATATYPE a_D, NOISE_DATATYPE a_Pct);\n\tinline static NOISE_DATATYPE CosineInterpolate(NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_Pct);\n\tinline static NOISE_DATATYPE LinearInterpolate(NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_Pct);\n\nprivate:\n\tint m_Seed;\n} ;\n\n\n\n\n\nclass cCubicNoise\n{\npublic:\n\t/** Maximum size of each dimension of the query arrays. */\n\tstatic const int MAX_SIZE = 512;\n\n\n\t/** Creates a new instance with the specified seed. */\n\tcCubicNoise(int a_Seed);\n\n\n\t/** Fills a 2D array with the values of the noise. */\n\tvoid Generate2D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY,                        ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY   ///< Noise-space coords of the array in the Y direction\n\t) const;\n\n\n\t/** Fills a 3D array with the values of the noise. */\n\tvoid Generate3D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y + a_SizeX * a_SizeY * z]\n\t\tint a_SizeX, int a_SizeY, int a_SizeZ,           ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY,  ///< Noise-space coords of the array in the Y direction\n\t\tNOISE_DATATYPE a_StartZ, NOISE_DATATYPE a_EndZ   ///< Noise-space coords of the array in the Z direction\n\t) const;\n\nprotected:\n\n\t/** Noise used for integral random values. */\n\tcNoise m_Noise;\n\n\n\t/** Calculates the integral and fractional parts along one axis.\n\ta_Floor will receive the integral parts (array of a_Size ints).\n\ta_Frac will receive the fractional parts (array of a_Size floats).\n\ta_Same will receive the counts of items that have the same integral parts (array of up to a_Size ints).\n\ta_NumSame will receive the count of a_Same elements (total count of different integral parts). */\n\tvoid CalcFloorFrac(\n\t\tint a_Size,\n\t\tNOISE_DATATYPE a_Start, NOISE_DATATYPE a_End,\n\t\tint * a_Floor, NOISE_DATATYPE * a_Frac,\n\t\tint * a_Same, int & a_NumSame\n\t) const;\n} ;\n\n\n\n\n\n/** Improved noise, as described by Ken Perlin: https://mrl.nyu.edu/~perlin/paper445.pdf\nImplementation adapted from Perlin's Java implementation: https://mrl.nyu.edu/~perlin/noise/ */\nclass cImprovedNoise\n{\npublic:\n\t/** Constructs a new instance of the noise obbject.\n\tNote that this operation is quite expensive (the permutation array being constructed). */\n\tcImprovedNoise(int a_Seed);\n\n\n\t/** Fills a 2D array with the values of the noise. */\n\tvoid Generate2D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY,                        ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY   ///< Noise-space coords of the array in the Y direction\n\t) const;\n\n\n\t/** Fills a 3D array with the values of the noise. */\n\tvoid Generate3D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y + a_SizeX * a_SizeY * z]\n\t\tint a_SizeX, int a_SizeY, int a_SizeZ,           ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY,  ///< Noise-space coords of the array in the Y direction\n\t\tNOISE_DATATYPE a_StartZ, NOISE_DATATYPE a_EndZ   ///< Noise-space coords of the array in the Z direction\n\t) const;\n\n\t/** Returns the value at the specified integral coords. Used for raw speed measurement. */\n\tNOISE_DATATYPE GetValueAt(int a_X, int a_Y, int a_Z);\n\nprotected:\n\n\t/** The permutation table used by the noise function. Initialized using seed. */\n\tint m_Perm[512];\n\n\n\t/** Calculates the fade curve, 6 * t^5 - 15 * t^4 + 10 * t^3. */\n\tinline static NOISE_DATATYPE Fade(NOISE_DATATYPE a_T)\n\t{\n\t\treturn a_T * a_T * a_T * (a_T * (a_T * 6 - 15) + 10);\n\t}\n\n\t/** Returns the gradient value based on the hash. */\n\tinline static NOISE_DATATYPE Grad(int a_Hash, NOISE_DATATYPE a_X, NOISE_DATATYPE a_Y, NOISE_DATATYPE a_Z)\n\t{\n\t\tint hash = a_Hash % 16;\n\t\tNOISE_DATATYPE u = (hash < 8) ? a_X : a_Y;\n\t\tNOISE_DATATYPE v = (hash < 4) ? a_Y : (((hash == 12) || (hash == 14)) ? a_X : a_Z);\n\t\treturn (((hash & 1) == 0) ? u : -u) + (((hash & 2) == 0) ? v : -v);\n\t}\n};\n\n\n\n\n\ntypedef cOctavedNoise<cCubicNoise> cPerlinNoise;\ntypedef cOctavedNoise<cRidgedNoise<cCubicNoise>> cRidgedMultiNoise;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Inline function definitions:\n// These need to be in the header, otherwise linker error occur in MSVC\n\nNOISE_DATATYPE cNoise::IntNoise1D(int a_X) const\n{\n\tint x = ((a_X * m_Seed) << 13) ^ a_X;\n\treturn (1 - static_cast<NOISE_DATATYPE>((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824);\n\t// returns a float number in the range of [-1, 1]\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::IntNoise2D(int a_X, int a_Y) const\n{\n\tint n = a_X + a_Y * 57 + m_Seed * 57 * 57;\n\tn = (n << 13) ^ n;\n\treturn (1 - static_cast<NOISE_DATATYPE>((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824);\n\t// returns a float number in the range of [-1, 1]\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::IntNoise3D(int a_X, int a_Y, int a_Z) const\n{\n\tint n = a_X + a_Y * 57 + a_Z * 57 * 57 + m_Seed * 57 * 57 * 57;\n\tn = (n << 13) ^ n;\n\treturn (static_cast<NOISE_DATATYPE>(1) -\n\t\tstatic_cast<NOISE_DATATYPE>((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0f\n\t);\n\t// returns a float number in the range of [-1, 1]\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::IntNoise3D(Vector3i a_Pos) const\n{\n\treturn IntNoise3D(a_Pos.x, a_Pos.y, a_Pos.z);\n}\n\n\n\n\n\nint cNoise::IntNoise1DInt(int a_X) const\n{\n\tint x = ((a_X * m_Seed) << 13) ^ a_X;\n\treturn ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff);\n}\n\n\n\n\n\nint cNoise::IntNoise2DInt(int a_X, int a_Y) const\n{\n\tint n = a_X + a_Y * 57 + m_Seed * 57 * 57;\n\tn = (n << 13) ^ n;\n\treturn ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff);\n}\n\n\n\n\n\nint cNoise::IntNoise3DInt(int a_X, int a_Y, int a_Z) const\n{\n\tint n = a_X + a_Y * 57 + a_Z * 57 * 57 + m_Seed * 57 * 57 * 57;\n\tn = (n << 13) ^ n;\n\treturn ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff);\n}\n\n\n\n\n\nint cNoise::IntNoise3DInt(Vector3i a_Pos) const\n{\n\treturn IntNoise3DInt(a_Pos.x, a_Pos.y, a_Pos.z);\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::CubicInterpolate(NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_C, NOISE_DATATYPE a_D, NOISE_DATATYPE a_Pct)\n{\n\tNOISE_DATATYPE P = (a_D - a_C) - (a_A - a_B);\n\tNOISE_DATATYPE Q = (a_A - a_B) - P;\n\tNOISE_DATATYPE R = a_C - a_A;\n\tNOISE_DATATYPE S = a_B;\n\n\treturn ((P * a_Pct + Q) * a_Pct + R) * a_Pct + S;\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::CosineInterpolate(NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_Pct)\n{\n\tconst NOISE_DATATYPE ft = a_Pct * static_cast<NOISE_DATATYPE>(3.1415927);\n\tconst NOISE_DATATYPE f = static_cast<NOISE_DATATYPE>(static_cast<NOISE_DATATYPE>(1 - cos(ft)) * static_cast<NOISE_DATATYPE>(0.5));\n\treturn  a_A * (1 - f) + a_B * f;\n}\n\n\n\n\n\nNOISE_DATATYPE cNoise::LinearInterpolate(NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_Pct)\n{\n\treturn  a_A * (1 - a_Pct) + a_B * a_Pct;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Global functions:\n\n/** Exports the noise array into a file.\na_Coeff specifies the value that each array value is multiplied by before being converted into a byte. */\nextern void Debug2DNoise(const NOISE_DATATYPE * a_Array, size_t a_SizeX, size_t a_SizeY, const AString & a_FileNameBase, NOISE_DATATYPE a_Coeff = 32);\n\n/** Exports the noise array into a set of files, ordered by XY and XZ.\na_Coeff specifies the value that each array value is multiplied by before being converted into a byte. */\nextern void Debug3DNoise(const NOISE_DATATYPE * a_Array, size_t a_SizeX, size_t a_SizeY, size_t a_SizeZ, const AString & a_FileNameBase, NOISE_DATATYPE a_Coeff = 32);\n\n\n\n\n/** Linearly interpolates between two values.\nAssumes that a_Ratio is in range [0, 1]. */\ninline NOISE_DATATYPE Lerp(NOISE_DATATYPE a_Val1, NOISE_DATATYPE a_Val2, NOISE_DATATYPE a_Ratio)\n{\n\treturn a_Val1 + (a_Val2 - a_Val1) * a_Ratio;\n}\n\n\n\n\n\n/** Linearly interpolates between two values, clamping the ratio to [0, 1] first. */\ninline NOISE_DATATYPE ClampedLerp(NOISE_DATATYPE a_Val1, NOISE_DATATYPE a_Val2, NOISE_DATATYPE a_Ratio)\n{\n\tif (a_Ratio < 0)\n\t{\n\t\treturn a_Val1;\n\t}\n\tif (a_Ratio > 1)\n\t{\n\t\treturn a_Val2;\n\t}\n\treturn Lerp(a_Val1, a_Val2, a_Ratio);\n}\n"
  },
  {
    "path": "src/Noise/OctavedNoise.h",
    "content": "\n// OctavedNoise.h\n\n// Implements the cOctavedNoise class template representing a noise generator that layers several octaves of another noise\n\n\n\n\n\n#pragma once\n\n\n\n\n\ntemplate <typename N>\nclass cOctavedNoise\n{\npublic:\n\tcOctavedNoise(int a_Seed = 0):\n\t\tm_Seed(a_Seed)\n\t{\n\t}\n\n\n\t/** Sets a new seed for the generators. Relays the seed to all underlying octaves. */\n\tvoid SetSeed(int a_Seed)\n\t{\n\t\tm_Seed = a_Seed;\n\t\tfor (auto oct: m_Octaves)\n\t\t{\n\t\t\toct->SetSeed(a_Seed);\n\t\t}\n\t}\n\n\n\t/** Adds a new octave to the list of octaves that compose this noise. */\n\tvoid AddOctave(NOISE_DATATYPE a_Frequency, NOISE_DATATYPE a_Amplitude)\n\t{\n\t\tm_Octaves.emplace_back(m_Seed, a_Frequency, a_Amplitude);\n\t}\n\n\n\t/** Fills a 2D array with the values of the noise. */\n\tvoid Generate2D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY,                        ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY,  ///< Noise-space coords of the array in the Y direction\n\t\tNOISE_DATATYPE * a_Workspace = nullptr           ///< Workspace that this function can use and trash.\n\t) const\n\t{\n\t\t// Check that state is alright:\n\t\tif (m_Octaves.empty())\n\t\t{\n\t\t\tASSERT(!\"cOctavedNoise: No octaves to generate!\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Allocate the workspace on the heap, if it wasn't given:\n\t\tstd::unique_ptr<NOISE_DATATYPE[]> workspaceHeap;\n\t\tif (a_Workspace == nullptr)\n\t\t{\n\t\t\tworkspaceHeap.reset(new NOISE_DATATYPE[ToUnsigned(a_SizeX * a_SizeY)]);\n\t\t\ta_Workspace = workspaceHeap.get();\n\t\t}\n\n\t\t// Generate the first octave directly into array:\n\t\tint ArrayCount = a_SizeX * a_SizeY;\n\t\t{\n\t\t\tconst cOctave & FirstOctave = m_Octaves.front();\n\t\t\tFirstOctave.m_Noise.Generate2D(\n\t\t\t\ta_Workspace, a_SizeX, a_SizeY,\n\t\t\t\ta_StartX * FirstOctave.m_Frequency, a_EndX * FirstOctave.m_Frequency,\n\t\t\t\ta_StartY * FirstOctave.m_Frequency, a_EndY * FirstOctave.m_Frequency\n\t\t\t);\n\t\t\tNOISE_DATATYPE Amplitude = FirstOctave.m_Amplitude;\n\t\t\tfor (int i = 0; i < ArrayCount; i++)\n\t\t\t{\n\t\t\t\ta_Array[i] = a_Workspace[i] * Amplitude;\n\t\t\t}\n\t\t}\n\n\t\t// Add each octave:\n\t\tfor (auto itr = m_Octaves.cbegin() + 1, end = m_Octaves.cend(); itr != end; ++itr)\n\t\t{\n\t\t\t// Generate the noise for the octave:\n\t\t\titr->m_Noise.Generate2D(\n\t\t\t\ta_Workspace, a_SizeX, a_SizeY,\n\t\t\t\ta_StartX * itr->m_Frequency, a_EndX * itr->m_Frequency,\n\t\t\t\ta_StartY * itr->m_Frequency, a_EndY * itr->m_Frequency\n\t\t\t);\n\t\t\t// Add it into the output:\n\t\t\tNOISE_DATATYPE Amplitude = itr->m_Amplitude;\n\t\t\tfor (int i = 0; i < ArrayCount; i++)\n\t\t\t{\n\t\t\t\ta_Array[i] += a_Workspace[i] * Amplitude;\n\t\t\t}\n\t\t}  // for itr - m_Octaves[]\n\t}\n\n\n\t/** Fills a 3D array with the values of the noise. */\n\tvoid Generate3D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y + a_SizeX * a_SizeY * z]\n\t\tint a_SizeX, int a_SizeY, int a_SizeZ,           ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY,  ///< Noise-space coords of the array in the Y direction\n\t\tNOISE_DATATYPE a_StartZ, NOISE_DATATYPE a_EndZ,  ///< Noise-space coords of the array in the Z direction\n\t\tNOISE_DATATYPE * a_Workspace = nullptr           ///< Workspace that this function can use and trash, same size as a_Array\n\t) const\n\t{\n\t\t// Check that state is alright:\n\t\tif (m_Octaves.empty())\n\t\t{\n\t\t\tASSERT(!\"cOctavedNoise: No octaves to generate!\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Allocate the workspace on the heap, if it wasn't given:\n\t\tstd::unique_ptr<NOISE_DATATYPE[]> workspaceHeap;\n\t\tif (a_Workspace == nullptr)\n\t\t{\n\t\t\tworkspaceHeap.reset(new NOISE_DATATYPE[ToUnsigned(a_SizeX * a_SizeY * a_SizeZ)]);\n\t\t\ta_Workspace = workspaceHeap.get();\n\t\t}\n\n\t\t// Generate the first octave directly into array:\n\t\tint ArrayCount = a_SizeX * a_SizeY * a_SizeZ;\n\t\t{\n\t\t\tconst cOctave & FirstOctave = m_Octaves.front();\n\t\t\tFirstOctave.m_Noise.Generate3D(\n\t\t\t\ta_Workspace, a_SizeX, a_SizeY, a_SizeZ,\n\t\t\t\ta_StartX * FirstOctave.m_Frequency, a_EndX * FirstOctave.m_Frequency,\n\t\t\t\ta_StartY * FirstOctave.m_Frequency, a_EndY * FirstOctave.m_Frequency,\n\t\t\t\ta_StartZ * FirstOctave.m_Frequency, a_EndZ * FirstOctave.m_Frequency\n\t\t\t);\n\t\t\tNOISE_DATATYPE Amplitude = FirstOctave.m_Amplitude;\n\t\t\tfor (int i = 0; i < ArrayCount; i++)\n\t\t\t{\n\t\t\t\ta_Array[i] = a_Workspace[i] * Amplitude;\n\t\t\t}\n\t\t}\n\n\t\t// Add each octave:\n\t\tfor (auto itr = m_Octaves.cbegin() + 1, end = m_Octaves.cend(); itr != end; ++itr)\n\t\t{\n\t\t\t// Generate the noise for the octave:\n\t\t\titr->m_Noise.Generate3D(\n\t\t\t\ta_Workspace, a_SizeX, a_SizeY, a_SizeZ,\n\t\t\t\ta_StartX * itr->m_Frequency, a_EndX * itr->m_Frequency,\n\t\t\t\ta_StartY * itr->m_Frequency, a_EndY * itr->m_Frequency,\n\t\t\t\ta_StartZ * itr->m_Frequency, a_EndZ * itr->m_Frequency\n\t\t\t);\n\t\t\t// Add it into the output:\n\t\t\tNOISE_DATATYPE Amplitude = itr->m_Amplitude;\n\t\t\tfor (int i = 0; i < ArrayCount; i++)\n\t\t\t{\n\t\t\t\ta_Array[i] += a_Workspace[i] * Amplitude;\n\t\t\t}\n\t\t}  // for itr - m_Octaves[]\n\t}\n\nprotected:\n\t/** Stores information and state for one octave of the noise. */\n\tclass cOctave\n\t{\n\tpublic:\n\t\tN m_Noise;\n\n\t\t/** Coord multiplier. */\n\t\tNOISE_DATATYPE m_Frequency;\n\n\t\t/** Value multiplier. */\n\t\tNOISE_DATATYPE m_Amplitude;\n\n\t\tcOctave(int a_Seed, NOISE_DATATYPE a_Frequency, NOISE_DATATYPE a_Amplitude) :\n\t\t\tm_Noise(a_Seed),\n\t\t\tm_Frequency(a_Frequency),\n\t\t\tm_Amplitude(a_Amplitude)\n\t\t{\n\t\t}\n\t} ;\n\ttypedef std::vector<cOctave> cOctaves;\n\n\n\t/** The seed used by the underlying generators. */\n\tint m_Seed;\n\n\t/** The octaves that compose this noise. */\n\tcOctaves m_Octaves;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Noise/RidgedNoise.h",
    "content": "\n// RidgedNoise.h\n\n// Implements the cRidgedNoise template class that generates ridged noise based on another noise provider.\n\n\n\n\n\n#pragma once\n\n\n\n\n\ntemplate <typename N>\nclass cRidgedNoise\n{\npublic:\n\t/** Creates a new instance with the seed set to 0. */\n\tcRidgedNoise(void):\n\t\tm_Noise(0)\n\t{\n\t}\n\n\n\t/** Creates a new instance with the specified seed. */\n\tcRidgedNoise(int a_Seed):\n\t\tm_Noise(a_Seed)\n\t{\n\t}\n\n\n\t/** Sets the seed for the underlying noise. */\n\tvoid SetSeed(int a_Seed)\n\t{\n\t\tm_Noise.SetSeed(a_Seed);\n\t}\n\n\n\t/** Fills a 2D array with the values of the noise. */\n\tvoid Generate2D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y]\n\t\tint a_SizeX, int a_SizeY,                        ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY   ///< Noise-space coords of the array in the Y direction\n\t) const\n\t{\n\t\tint ArrayCount = a_SizeX * a_SizeY;\n\t\tm_Noise.Generate2D(\n\t\t\ta_Array, a_SizeX, a_SizeY,\n\t\t\ta_StartX, a_EndX,\n\t\t\ta_StartY, a_EndY\n\t\t);\n\t\tfor (int i = 0; i < ArrayCount; i++)\n\t\t{\n\t\t\ta_Array[i] = std::abs(a_Array[i]);\n\t\t}\n\t}\n\n\n\t/** Fills a 3D array with the values of the noise. */\n\tvoid Generate3D(\n\t\tNOISE_DATATYPE * a_Array,                        ///< Array to generate into [x + a_SizeX * y + a_SizeX * a_SizeY * z]\n\t\tint a_SizeX, int a_SizeY, int a_SizeZ,           ///< Count of the array, in each direction\n\t\tNOISE_DATATYPE a_StartX, NOISE_DATATYPE a_EndX,  ///< Noise-space coords of the array in the X direction\n\t\tNOISE_DATATYPE a_StartY, NOISE_DATATYPE a_EndY,  ///< Noise-space coords of the array in the Y direction\n\t\tNOISE_DATATYPE a_StartZ, NOISE_DATATYPE a_EndZ   ///< Noise-space coords of the array in the Z direction\n\t) const\n\t{\n\t\tint ArrayCount = a_SizeX * a_SizeY * a_SizeZ;\n\t\tm_Noise.Generate2D(\n\t\t\ta_Array, a_SizeX, a_SizeY, a_SizeZ,\n\t\t\ta_StartX, a_EndX,\n\t\t\ta_StartY, a_EndY,\n\t\t\ta_StartZ, a_EndZ\n\t\t);\n\t\tfor (int i = 0; i < ArrayCount; i++)\n\t\t{\n\t\t\ta_Array[i] = std::abs(a_Array[i]);\n\t\t}\n\t}\n\nprotected:\n\tN m_Noise;\n} ;\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/AtomicUniquePtr.h",
    "content": "\n\n#pragma once\n\n\n/** An RAII wrapper for std::atomic<T*>. */\ntemplate <typename T>\nclass cAtomicUniquePtr\n{\npublic:\n\tstatic_assert(!std::is_array<T>::value, \"cAtomicUniquePtr does not support arrays\");\n\tDISALLOW_COPY_AND_ASSIGN(cAtomicUniquePtr);\n\n\tcAtomicUniquePtr() noexcept:\n\t\tm_Ptr(nullptr)\n\t{\n\t}\n\n\n\tcAtomicUniquePtr(std::unique_ptr<T> a_Ptr) noexcept:\n\t\tm_Ptr(a_Ptr.release())\n\t{\n\t}\n\n\tcAtomicUniquePtr & operator = (std::unique_ptr<T> a_Ptr) noexcept\n\t{\n\t\tstore(std::move(a_Ptr));\n\t\treturn *this;\n\t}\n\n\t~cAtomicUniquePtr() noexcept\n\t{\n\t\tdelete load();\n\t}\n\n\toperator T * () const noexcept\n\t{\n\t\treturn load();\n\t}\n\n\tbool compare_exchange_weak(T *& a_Expected, std::unique_ptr<T> && a_Desired, std::memory_order a_Order = std::memory_order_seq_cst) noexcept\n\t{\n\t\tbool DidExchange = m_Ptr.compare_exchange_weak(a_Expected, a_Desired.get(), a_Order);\n\t\tif (DidExchange)\n\t\t{\n\t\t\t// Only release ownership from the caller if the exchange occurred\n\t\t\ta_Desired.release();\n\t\t}\n\t\treturn DidExchange;\n\t}\n\n\tbool compare_exchange_strong(T *& a_Expected, std::unique_ptr<T> && a_Desired, std::memory_order a_Order = std::memory_order_seq_cst) noexcept\n\t{\n\t\tbool DidExchange = m_Ptr.compare_exchange_strong(a_Expected, a_Desired.get(), a_Order);\n\t\tif (DidExchange)\n\t\t{\n\t\t\t// Only release ownership from the caller if the exchange occurred\n\t\t\ta_Desired.release();\n\t\t}\n\t\treturn DidExchange;\n\t}\n\n\tstd::unique_ptr<T> exchange(std::unique_ptr<T> a_Ptr, std::memory_order a_Order = std::memory_order_seq_cst) noexcept\n\t{\n\t\treturn std::unique_ptr<T>{ m_Ptr.exchange(a_Ptr.release(), a_Order) };\n\t}\n\n\tT * load(std::memory_order a_Order = std::memory_order_seq_cst) const noexcept\n\t{\n\t\treturn m_Ptr.load(a_Order);\n\t}\n\n\tvoid store(std::unique_ptr<T> a_Ptr, std::memory_order a_Order = std::memory_order_seq_cst) noexcept\n\t{\n\t\t// Store new value and delete old value\n\t\tdelete m_Ptr.exchange(a_Ptr.release(), a_Order);\n\t}\n\nprivate:\n\tstd::atomic<T*> m_Ptr;\n};\n"
  },
  {
    "path": "src/OSSupport/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tCriticalSection.cpp\n\tEvent.cpp\n\tFile.cpp\n\tGZipFile.cpp\n\tHostnameLookup.cpp\n\tIPLookup.cpp\n\tIsThread.cpp\n\tNetworkInterfaceEnum.cpp\n\tNetworkLookup.cpp\n\tNetworkSingleton.cpp\n\tServerHandleImpl.cpp\n\tStackTrace.cpp\n\tTCPLinkImpl.cpp\n\tUDPEndpointImpl.cpp\n\tWinStackWalker.cpp\n\n\tAtomicUniquePtr.h\n\tConsoleSignalHandler.h\n\tCriticalSection.h\n\tEvent.h\n\tFile.h\n\tGetAddressInfoError.h\n\tGZipFile.h\n\tHostnameLookup.h\n\tIPLookup.h\n\tIsThread.h\n\tMiniDumpWriter.h\n\tNetwork.h\n\tNetworkLookup.h\n\tNetworkSingleton.h\n\tQueue.h\n\tServerHandleImpl.h\n\tSleepResolutionBooster.h\n\tStackTrace.h\n\tStartAsService.h\n\tStopwatch.h\n\tTCPLinkImpl.h\n\tUDPEndpointImpl.h\n\tWinStackWalker.h\n)\n\n"
  },
  {
    "path": "src/OSSupport/ConsoleSignalHandler.h",
    "content": "\n// ConsoleSignalHandler.h\n\n// Intercepts signals for graceful CTRL-C (and others) handling.\n\n// This file MUST NOT be included from anywhere other than main.cpp.\n\n\n\n\n\n#include <csignal>\n\n\n\n\n\n// Because SIG_DFL or SIG_IGN could be NULL instead of nullptr, we need to disable the Clang warning here:\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#pragma clang diagnostic ignored \"-Wunknown-pragmas\"\n#pragma clang diagnostic ignored \"-Wzero-as-null-pointer-constant\"\n#endif\n\nstatic void NonCtrlHandler(int a_Signal)\n{\n\tLOGD(\"Terminate event raised from std::signal\");\n\n\tswitch (a_Signal)\n\t{\n\t\tcase SIGSEGV:\n\t\t{\n\t\t\tPrintStackTrace();\n\n\t\t\tLOGERROR(\n\t\t\t\t\"Failure report: \\n\\n\"\n\t\t\t\t\"  :(   | Cuberite has encountered an error and needs to close\\n\"\n\t\t\t\t\"       | SIGSEGV: Segmentation fault\\n\"\n\t\t\t\t\"       |\\n\"\n#ifdef BUILD_ID\n\t\t\t\t\"       | Cuberite \" BUILD_SERIES_NAME \" (id: \" BUILD_ID \")\\n\"\n\t\t\t\t\"       | from commit \" BUILD_COMMIT_ID \"\\n\"\n#endif\n\t\t\t);\n\n\t\t\tstd::signal(SIGSEGV, SIG_DFL);\n\t\t\treturn;\n\t\t}\n\t\tcase SIGABRT:\n#ifdef SIGABRT_COMPAT\n\t\tcase SIGABRT_COMPAT:\n#endif\n\t\t{\n\t\t\tPrintStackTrace();\n\n\t\t\tLOGERROR(\n\t\t\t\t\"Failure report: \\n\\n\"\n\t\t\t\t\"  :(   | Cuberite has encountered an error and needs to close\\n\"\n\t\t\t\t\"       | SIGABRT: Server self-terminated due to an internal fault\\n\"\n\t\t\t\t\"       |\\n\"\n#ifdef BUILD_ID\n\t\t\t\t\"       | Cuberite \" BUILD_SERIES_NAME \" (id: \" BUILD_ID \")\\n\"\n\t\t\t\t\"       | from commit \" BUILD_COMMIT_ID \"\\n\"\n#endif\n\t\t\t);\n\n\t\t\tstd::signal(SIGSEGV, SIG_DFL);\n\t\t\treturn;\n\t\t}\n\t\tcase SIGINT:\n\t\tcase SIGTERM:\n\t\t{\n\t\t\t// Server is shutting down, wait for it...\n\t\t\tcRoot::Stop();\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n\n\n\n\n#ifdef _WIN32\n\n/** Handle CTRL events in windows, including console window close. */\nstatic BOOL CtrlHandler(DWORD fdwCtrlType)\n{\n\tcRoot::Stop();\n\tLOGD(\"Terminate event raised from the Windows CtrlHandler\");\n\n\t// Delay as much as possible to try to get the server to shut down cleanly - 10 seconds given by Windows:\n\tstd::this_thread::sleep_for(std::chrono::seconds(10));\n\n\t// Returning from main() automatically aborts this handler thread.\n\n\treturn TRUE;\n}\n\n#endif\n\n\n\n\n\nnamespace ConsoleSignalHandler\n{\n\tstatic void Register()\n\t{\n\t\tstd::signal(SIGSEGV, NonCtrlHandler);\n\t\tstd::signal(SIGTERM, NonCtrlHandler);\n\t\tstd::signal(SIGINT, NonCtrlHandler);\n\t\tstd::signal(SIGABRT, NonCtrlHandler);\n#ifdef SIGABRT_COMPAT\n\t\tstd::signal(SIGABRT_COMPAT, NonCtrlHandler);\n#endif\n#ifdef SIGPIPE\n\t\tstd::signal(SIGPIPE, SIG_IGN);  // Ignore (PR #2487).\n#endif\n\n#ifdef _WIN32\n\t\tSetConsoleCtrlHandler(reinterpret_cast<PHANDLER_ROUTINE>(CtrlHandler), TRUE);\n#endif\n\t}\n};\n"
  },
  {
    "path": "src/OSSupport/CriticalSection.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n#include \"CriticalSection.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCriticalSection:\n\ncCriticalSection::cCriticalSection():\n\tm_RecursionCount(0)\n{\n}\n\n\n\n\n\nvoid cCriticalSection::Lock()\n{\n\tm_Mutex.lock();\n\n\tm_RecursionCount += 1;\n\tm_OwningThreadID = std::this_thread::get_id();\n}\n\n\n\n\n\nvoid cCriticalSection::Unlock()\n{\n\tASSERT(IsLockedByCurrentThread());\n\tm_RecursionCount -= 1;\n\n\tm_Mutex.unlock();\n}\n\n\n\n\n\nbool cCriticalSection::IsLocked(void)\n{\n\treturn (m_RecursionCount > 0);\n}\n\n\n\n\n\nbool cCriticalSection::IsLockedByCurrentThread(void)\n{\n\treturn ((m_RecursionCount > 0) && (m_OwningThreadID == std::this_thread::get_id()));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCSLock\n\ncCSLock::cCSLock(cCriticalSection * a_CS)\n\t: m_CS(a_CS)\n\t, m_IsLocked(false)\n{\n\tLock();\n}\n\n\n\n\n\ncCSLock::cCSLock(cCriticalSection & a_CS)\n\t: m_CS(&a_CS)\n\t, m_IsLocked(false)\n{\n\tLock();\n}\n\n\n\n\n\ncCSLock::~cCSLock()\n{\n\tif (!m_IsLocked)\n\t{\n\t\treturn;\n\t}\n\tUnlock();\n}\n\n\n\n\n\nvoid cCSLock::Lock(void)\n{\n\tASSERT(!m_IsLocked);\n\tm_IsLocked = true;\n\tm_CS->Lock();\n}\n\n\n\n\n\nvoid cCSLock::Unlock(void)\n{\n\tASSERT(m_IsLocked);\n\tm_IsLocked = false;\n\tm_CS->Unlock();\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cCSUnlock:\n\ncCSUnlock::cCSUnlock(cCSLock & a_Lock) :\n\tm_Lock(a_Lock)\n{\n\tm_Lock.Unlock();\n}\n\n\n\n\n\ncCSUnlock::~cCSUnlock()\n{\n\tm_Lock.Lock();\n}\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/CriticalSection.h",
    "content": "\n#pragma once\n\n\n\n\n\nclass cCriticalSection\n{\n\tfriend class cDeadlockDetect;  // Allow the DeadlockDetect to read the internals, so that it may output some statistics\n\npublic:\n\tvoid Lock(void);\n\tvoid Unlock(void);\n\n\tcCriticalSection(void);\n\n\t/** Returns true if the CS is currently locked.\n\tNote that since it relies on the m_RecursionCount value, it is inherently thread-unsafe, prone to false positives.\n\tAlso, due to multithreading, the state can change between this when function is evaluated and the returned value is used.\n\tTo be used in ASSERT(IsLocked()) only. */\n\tbool IsLocked(void);\n\n\t/** Returns true if the CS is currently locked by the thread calling this function.\n\tNote that since it relies on the m_RecursionCount value, it is inherently thread-unsafe, prone to false positives.\n\tAlso, due to multithreading, the state can change between this when function is evaluated and the returned value is used.\n\tTo be used in ASSERT(IsLockedByCurrentThread()) only. */\n\tbool IsLockedByCurrentThread(void);\n\nprivate:\n\n\t/** Number of times that this CS is currently locked (levels of recursion). Zero if not locked.\n\tNote that this value should be considered true only when the CS is locked; without the lock, it is UndefinedBehavior to even read it,\n\tbut making it std::atomic would impose too much of a runtime penalty.\n\tIt is only ever read without the lock in the DeadlockDetect, where the server is terminating anyway. */\n\tint m_RecursionCount;\n\n\t/** ID of the thread that is currently holding the CS.\n\tNote that this value should be considered true only when the CS is locked; without the lock, it is UndefinedBehavior to even read it,\n\tbut making it std::atomic would impose too much of a runtime penalty.\n\tWhen unlocked, the value stored here has no meaning, it may be an ID of a previous holder, or it could be any garbage.\n\tIt is only ever read without the lock in the DeadlockDetect, where the server is terminating anyway. */\n\tstd::thread::id m_OwningThreadID;\n\n\tstd::recursive_mutex m_Mutex;\n};\n\n\n\n\n/** RAII for cCriticalSection - locks the CS on creation, unlocks on destruction */\nclass cCSLock\n{\n\tcCriticalSection * m_CS;\n\n\t// Unlike a cCriticalSection, this object should be used from a single thread, therefore access to m_IsLocked is not threadsafe\n\t// In Windows, it is an error to call cCriticalSection::Unlock() multiple times if the lock is not held,\n\t// therefore we need to check this value whether we are locked or not.\n\tbool m_IsLocked;\n\npublic:\n\tcCSLock(cCriticalSection * a_CS);\n\tcCSLock(cCriticalSection & a_CS);\n\t~cCSLock();\n\n\t// Temporarily unlock or re-lock:\n\tvoid Lock(void);\n\tvoid Unlock(void);\n\nprivate:\n\tDISALLOW_COPY_AND_ASSIGN(cCSLock);\n} ;\n\n\n\n\n\n/** Temporary RAII unlock for a cCSLock. Useful for unlock-wait-relock scenarios */\nclass cCSUnlock\n{\n\tcCSLock & m_Lock;\npublic:\n\tcCSUnlock(cCSLock & a_Lock);\n\t~cCSUnlock();\n\nprivate:\n\tDISALLOW_COPY_AND_ASSIGN(cCSUnlock);\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/Event.cpp",
    "content": "\n// Event.cpp\n\n// Interfaces to the cEvent object representing a synchronization primitive that can be waited-for\n// Implemented using C++11 condition variable and mutex\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Event.h\"\n\n\n\n\ncEvent::cEvent(void) :\n\tm_ShouldContinue(false)\n{\n}\n\n\n\n\n\nvoid cEvent::Wait(void)\n{\n\t{\n\t\tstd::unique_lock<std::mutex> Lock(m_Mutex);\n\t\tm_CondVar.wait(Lock, [this](){ return m_ShouldContinue; });\n\t\tm_ShouldContinue = false;\n\t}\n}\n\n\n\n\n\nbool cEvent::Wait(unsigned a_TimeoutMSec)\n{\n\tauto dst = std::chrono::system_clock::now() + std::chrono::milliseconds(a_TimeoutMSec);\n\tbool Result;\n\t{\n\t\tstd::unique_lock<std::mutex> Lock(m_Mutex);  // We assume that this lock is acquired without much delay - we are the only user of the mutex\n\t\tResult = m_CondVar.wait_until(Lock, dst, [this](){ return m_ShouldContinue; });\n\t\tm_ShouldContinue = false;\n\t}\n\treturn Result;\n}\n\n\n\n\n\nvoid cEvent::Set(void)\n{\n\t{\n\t\tstd::unique_lock<std::mutex> Lock(m_Mutex);\n\t\tm_ShouldContinue = true;\n\t}\n\tm_CondVar.notify_one();\n}\n\n\n\n\n\nvoid cEvent::SetAll(void)\n{\n\t{\n\t\tstd::unique_lock<std::mutex> Lock(m_Mutex);\n\t\tm_ShouldContinue = true;\n\t}\n\tm_CondVar.notify_all();\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/Event.h",
    "content": "\n// Event.h\n\n// Interfaces to the cEvent object representing a synchronization primitive that can be waited-for\n// Implemented using C++11 condition variable and mutex\n\n\n\n\n\n#pragma once\n\n\n\n\n\nclass cEvent\n{\npublic:\n\tcEvent(void);\n\n\t/** Waits until the event has been set.\n\tIf the event has been set before it has been waited for, Wait() returns immediately. */\n\tvoid Wait(void);\n\n\t/** Sets the event - releases one thread that has been waiting in Wait().\n\tIf there was no thread waiting, the next call to Wait() will not block. */\n\tvoid Set(void);\n\n\t/** Sets the event - releases all threads that have been waiting in Wait().\n\tIf there was no thread waiting, the next call to Wait() will not block. */\n\tvoid SetAll(void);\n\n\t/** Waits for the event until either it is signalled, or the (relative) timeout is passed.\n\tReturns true if the event was signalled, false if the timeout was hit or there was an error. */\n\tbool Wait(unsigned a_TimeoutMSec);\n\nprivate:\n\n\t/** Used for checking for spurious wakeups. */\n\tbool m_ShouldContinue;\n\n\t/** Mutex protecting m_ShouldContinue from multithreaded access. */\n\tstd::mutex m_Mutex;\n\n\t/** The condition variable used as the Event. */\n\tstd::condition_variable m_CondVar;\n} ;\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/File.cpp",
    "content": "\n// cFile.cpp\n\n// Implements the cFile class providing an OS-independent abstraction of a file.\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"File.h\"\n#include <sys/stat.h>\n#ifdef _WIN32\n\t#include <share.h>  // for _SH_DENYWRITE\n#else\n\t#include <dirent.h>\n#endif  // _WIN32\n\n\n\n\n\ncFile::cFile(void) :\n\tm_File(nullptr)\n{\n\t// Nothing needed yet\n}\n\n\n\n\n\ncFile::cFile(const AString & iFileName, eMode iMode) :\n\tm_File(nullptr)\n{\n\tOpen(iFileName, iMode);\n}\n\n\n\n\n\ncFile::~cFile()\n{\n\tif (IsOpen())\n\t{\n\t\tClose();\n\t}\n}\n\n\n\n\n\nbool cFile::Open(const AString & iFileName, eMode iMode)\n{\n\tASSERT(!IsOpen());  // You should close the file before opening another one\n\n\tif (IsOpen())\n\t{\n\t\tClose();\n\t}\n\n\tconst char * Mode = nullptr;\n\tswitch (iMode)\n\t{\n\t\tcase fmRead:      Mode = \"rb\";  break;\n\t\tcase fmWrite:     Mode = \"wb\";  break;\n\t\tcase fmReadWrite: Mode = \"rb+\"; break;\n\t\tcase fmAppend:    Mode = \"a+\";  break;\n\t}\n\tif (Mode == nullptr)\n\t{\n\t\tASSERT(!\"Unhandled file mode\");\n\t\treturn false;\n\t}\n\n\t#ifdef _WIN32\n\t\tm_File = _fsopen((iFileName).c_str(), Mode, _SH_DENYWR);\n\t#else\n\t\tm_File = fopen((iFileName).c_str(), Mode);\n\t#endif  // _WIN32\n\n\tif ((m_File == nullptr) && (iMode == fmReadWrite))\n\t{\n\t\t// Fix for MS not following C spec, opening \"a\" mode files for writing at the end only\n\t\t// The file open operation has been tried with \"read update\", fails if file not found\n\t\t// So now we know either the file doesn't exist or we don't have rights, no need to worry about file contents.\n\t\t// Simply re-open for read-writing, erasing existing contents:\n\n\t\t#ifdef _WIN32\n\t\t\tm_File = _fsopen((iFileName).c_str(), \"wb+\", _SH_DENYWR);\n\t\t#else\n\t\t\tm_File = fopen((iFileName).c_str(), \"wb+\");\n\t\t#endif  // _WIN32\n\n\t}\n\treturn (m_File != nullptr);\n}\n\n\n\n\n\nvoid cFile::Close(void)\n{\n\tif (!IsOpen())\n\t{\n\t\t// Closing an unopened file is a legal nop\n\t\treturn;\n\t}\n\n\tfclose(m_File);\n\tm_File = nullptr;\n}\n\n\n\n\n\nbool cFile::IsOpen(void) const\n{\n\treturn (m_File != nullptr);\n}\n\n\n\n\n\nbool cFile::IsEOF(void) const\n{\n\tASSERT(IsOpen());\n\n\tif (!IsOpen())\n\t{\n\t\t// Unopened files behave as at EOF\n\t\treturn true;\n\t}\n\n\treturn (feof(m_File) != 0);\n}\n\n\n\n\n\nint cFile::Read (void * a_Buffer, size_t a_NumBytes)\n{\n\tASSERT(IsOpen());\n\n\tif (!IsOpen())\n\t{\n\t\treturn -1;\n\t}\n\n\treturn static_cast<int>(fread(a_Buffer, 1, a_NumBytes, m_File));  // fread() returns the portion of Count parameter actually read, so we need to send a_a_NumBytes as Count\n}\n\n\n\n\n\nContiguousByteBuffer cFile::Read(size_t a_NumBytes)\n{\n\tASSERT(IsOpen());\n\n\tif (!IsOpen())\n\t{\n\t\treturn {};\n\t}\n\n\tContiguousByteBuffer res;\n\tres.resize(a_NumBytes);  // TODO: investigate if worth hacking around std::string internals to avoid initialisation\n\tauto newSize = fread(res.data(), sizeof(std::byte), a_NumBytes, m_File);\n\tres.resize(newSize);\n\treturn res;\n}\n\n\n\n\n\nint cFile::Write(const void * a_Buffer, size_t a_NumBytes)\n{\n\tASSERT(IsOpen());\n\n\tif (!IsOpen())\n\t{\n\t\treturn -1;\n\t}\n\n\tint res = static_cast<int>(fwrite(a_Buffer, 1, a_NumBytes, m_File));  // fwrite() returns the portion of Count parameter actually written, so we need to send a_NumBytes as Count\n\treturn res;\n}\n\n\n\n\n\nlong cFile::Seek (int iPosition)\n{\n\tASSERT(IsOpen());\n\n\tif (!IsOpen())\n\t{\n\t\treturn -1;\n\t}\n\n\tif (fseek(m_File, iPosition, SEEK_SET) != 0)\n\t{\n\t\treturn -1;\n\t}\n\treturn ftell(m_File);\n}\n\n\n\n\n\nlong cFile::Tell (void) const\n{\n\tASSERT(IsOpen());\n\n\tif (!IsOpen())\n\t{\n\t\treturn -1;\n\t}\n\n\treturn ftell(m_File);\n}\n\n\n\n\n\nlong cFile::GetSize(void) const\n{\n\tASSERT(IsOpen());\n\n\tif (!IsOpen())\n\t{\n\t\treturn -1;\n\t}\n\n\tlong CurPos = Tell();\n\tif (CurPos < 0)\n\t{\n\t\treturn -1;\n\t}\n\tif (fseek(m_File, 0, SEEK_END) != 0)\n\t{\n\t\treturn -1;\n\t}\n\tlong res = Tell();\n\tif (fseek(m_File, static_cast<long>(CurPos), SEEK_SET) != 0)\n\t{\n\t\treturn -1;\n\t}\n\treturn res;\n}\n\n\n\n\n\nint cFile::ReadRestOfFile(AString & a_Contents)\n{\n\tASSERT(IsOpen());\n\n\tif (!IsOpen())\n\t{\n\t\treturn -1;\n\t}\n\n\tlong TotalSize = GetSize();\n\tif (TotalSize < 0)\n\t{\n\t\treturn -1;\n\t}\n\n\tlong Position = Tell();\n\tif (Position < 0)\n\t{\n\t\treturn -1;\n\t}\n\n\tauto DataSize = static_cast<size_t>(TotalSize - Position);\n\n\ta_Contents.resize(DataSize);  // TODO: investigate if worth hacking around std::string internals to avoid initialisation\n\treturn Read(a_Contents.data(), DataSize);\n}\n\n\n\n\n\nbool cFile::Exists(const AString & a_FileName)\n{\n\tcFile test(a_FileName, fmRead);\n\treturn test.IsOpen();\n}\n\n\n\n\n\nbool cFile::Delete(const AString & a_Path)\n{\n\tif (IsFolder(a_Path))\n\t{\n\t\treturn DeleteFolder(a_Path);\n\t}\n\telse\n\t{\n\t\treturn DeleteFile(a_Path);\n\t}\n}\n\n\n\n\n\nbool cFile::DeleteFolder(const AString & a_FolderName)\n{\n\t#ifdef _WIN32\n\t\treturn (RemoveDirectoryA(a_FolderName.c_str()) != 0);\n\t#else  // _WIN32\n\t\treturn (rmdir(a_FolderName.c_str()) == 0);\n\t#endif  // else _WIN32\n}\n\n\n\n\n\nbool cFile::DeleteFolderContents(const AString & a_FolderName)\n{\n\tauto Contents = cFile::GetFolderContents(a_FolderName);\n\tfor (const auto & item: Contents)\n\t{\n\t\t// Remove the item:\n\t\tauto WholePath = a_FolderName + GetPathSeparator() + item;\n\t\tif (IsFolder(WholePath))\n\t\t{\n\t\t\tif (!DeleteFolderContents(WholePath))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!DeleteFolder(WholePath))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!DeleteFile(WholePath))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}  // for item - Contents[]\n\n\t// All deletes succeeded\n\treturn true;\n}\n\n\n\n\n\nbool cFile::DeleteFile(const AString & a_FileName)\n{\n\treturn (remove(a_FileName.c_str()) == 0);\n}\n\n\n\n\n\nbool cFile::Rename(const AString & a_OrigFileName, const AString & a_NewFileName)\n{\n\treturn (rename(a_OrigFileName.c_str(), a_NewFileName.c_str()) == 0);\n}\n\n\n\n\n\nbool cFile::Copy(const AString & a_SrcFileName, const AString & a_DstFileName)\n{\n\t#ifdef _WIN32\n\t\treturn (CopyFileA(a_SrcFileName.c_str(), a_DstFileName.c_str(), FALSE) != 0);\n\t#else\n\t\t// Other OSs don't have a direct CopyFile equivalent, do it the harder way:\n\t\tstd::ifstream src(a_SrcFileName.c_str(), std::ios::binary);\n\t\tstd::ofstream dst(a_DstFileName.c_str(), std::ios::binary);\n\t\tif (dst.good())\n\t\t{\n\t\t\tdst << src.rdbuf();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t#endif\n}\n\n\n\n\n\nbool cFile::IsFolder(const AString & a_Path)\n{\n\t#ifdef _WIN32\n\t\tDWORD FileAttrib = GetFileAttributesA(a_Path.c_str());\n\t\treturn ((FileAttrib != INVALID_FILE_ATTRIBUTES) && ((FileAttrib & FILE_ATTRIBUTE_DIRECTORY) != 0));\n\t#else\n\t\tstruct stat st;\n\t\treturn ((stat(a_Path.c_str(), &st) == 0) && S_ISDIR(st.st_mode));\n\t#endif\n}\n\n\n\n\n\nbool cFile::IsFile(const AString & a_Path)\n{\n\t#ifdef _WIN32\n\t\tDWORD FileAttrib = GetFileAttributesA(a_Path.c_str());\n\t\treturn ((FileAttrib != INVALID_FILE_ATTRIBUTES) && ((FileAttrib & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE)) == 0));\n\t#else\n\t\tstruct stat st;\n\t\treturn ((stat(a_Path.c_str(), &st) == 0) && S_ISREG(st.st_mode));\n\t#endif\n}\n\n\n\n\n\nlong cFile::GetSize(const AString & a_FileName)\n{\n\tstruct stat st;\n\tif (stat(a_FileName.c_str(), &st) == 0)\n\t{\n\t\treturn static_cast<int>(st.st_size);\n\t}\n\treturn -1;\n}\n\n\n\n\n\nbool cFile::CreateFolder(const AString & a_FolderPath)\n{\n\t#ifdef _WIN32\n\t\treturn (CreateDirectoryA(a_FolderPath.c_str(), nullptr) != 0);\n\t#else\n\t\treturn (mkdir(a_FolderPath.c_str(), S_IRWXU | S_IRWXG | S_IRWXO) == 0);\n\t#endif\n}\n\n\n\n\n\nbool cFile::CreateFolderRecursive(const AString & a_FolderPath)\n{\n\t// Special case: Fail if the path is empty\n\tif (a_FolderPath.empty())\n\t{\n\t\treturn false;\n\t}\n\n\t// Go through each path element and create the folder:\n\tauto len = a_FolderPath.length();\n\tfor (decltype(len) i = 0; i < len; i++)\n\t{\n\t#ifdef _WIN32\n\t\tif ((a_FolderPath[i] == '\\\\') || (a_FolderPath[i] == '/'))\n\t#else\n\t\tif (a_FolderPath[i] == '/')\n\t#endif\n\t\t{\n\t\t\tCreateFolder(a_FolderPath.substr(0, i));\n\t\t}\n\t}\n\tCreateFolder(a_FolderPath);\n\n\t// Check the result by querying whether the final path exists:\n\treturn IsFolder(a_FolderPath);\n}\n\n\n\n\n\nAStringVector cFile::GetFolderContents(const AString & a_Folder)\n{\n\tAStringVector AllFiles;\n\n\t#ifdef _WIN32\n\n\t\t// If the folder name doesn't contain the terminating slash / backslash, add it:\n\t\tAString FileFilter = a_Folder;\n\t\tif (\n\t\t\t!FileFilter.empty() &&\n\t\t\t(FileFilter[FileFilter.length() - 1] != '\\\\') &&\n\t\t\t(FileFilter[FileFilter.length() - 1] != '/')\n\t\t)\n\t\t{\n\t\t\tFileFilter.push_back('\\\\');\n\t\t}\n\n\t\t// Find all files / folders:\n\t\tFileFilter.append(\"*.*\");\n\t\tHANDLE hFind;\n\t\tWIN32_FIND_DATAA FindFileData;\n\t\tif ((hFind = FindFirstFileA(FileFilter.c_str(), &FindFileData)) != INVALID_HANDLE_VALUE)\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t(strcmp(FindFileData.cFileName, \".\") == 0) ||\n\t\t\t\t\t(strcmp(FindFileData.cFileName, \"..\") == 0)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tAllFiles.push_back(FindFileData.cFileName);\n\t\t\t} while (FindNextFileA(hFind, &FindFileData));\n\t\t\tFindClose(hFind);\n\t\t}\n\n\t#else  // _WIN32\n\n\t\tDIR * dp;\n\t\tAString Folder = a_Folder;\n\t\tif (Folder.empty())\n\t\t{\n\t\t\tFolder = \".\";\n\t\t}\n\t\tif ((dp = opendir(Folder.c_str())) == nullptr)\n\t\t{\n\t\t\tLOGERROR(\"Error (%i) opening directory \\\"%s\\\"\\n\", errno, Folder.c_str());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstruct dirent *dirp;\n\t\t\twhile ((dirp = readdir(dp)) != nullptr)\n\t\t\t{\n\t\t\t\tif (\n\t\t\t\t\t(strcmp(dirp->d_name, \".\") == 0) ||\n\t\t\t\t\t(strcmp(dirp->d_name, \"..\") == 0)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tAllFiles.push_back(dirp->d_name);\n\t\t\t}\n\t\t\tclosedir(dp);\n\t\t}\n\n\t#endif  // else _WIN32\n\n\treturn AllFiles;\n}\n\n\n\n\n\nAString cFile::ReadWholeFile(const AString & a_FileName)\n{\n\tcFile f;\n\tif (!f.Open(a_FileName, fmRead))\n\t{\n\t\treturn \"\";\n\t}\n\tAString Contents;\n\tf.ReadRestOfFile(Contents);\n\treturn Contents;\n}\n\n\n\n\n\nAString cFile::ChangeFileExt(const AString & a_FileName, const AString & a_NewExt)\n{\n\tauto res = a_FileName;\n\n\t// If the path separator is the last character of the string, return the string unmodified (refers to a folder):\n\t#if defined(_MSC_VER)\n\t\t// Find either path separator - MSVC CRT accepts slashes as separators, too\n\t\tauto LastPathSep = res.find_last_of(\"/\\\\\");\n\t#elif defined(_WIN32)\n\t\t// Windows with different CRTs support only the backslash separator\n\t\tauto LastPathSep = res.rfind('\\\\');\n\t#else\n\t\t// Linux supports only the slash separator\n\t\tauto LastPathSep = res.rfind('/');\n\t#endif\n\tif ((LastPathSep != AString::npos) && (LastPathSep + 1 == res.size()))\n\t{\n\t\treturn res;\n\t}\n\n\t// Append or replace the extension:\n\tauto DotPos = res.rfind('.');\n\tif (\n\t\t(DotPos == AString::npos) ||  // No dot found\n\t\t((LastPathSep != AString::npos) && (LastPathSep > DotPos))  // Last dot is before the last path separator (-> in folder name)\n\t)\n\t{\n\t\t// No extension, just append the new one:\n\t\tif (!a_NewExt.empty() && (a_NewExt[0] != '.'))\n\t\t{\n\t\t\t// a_NewExt doesn't start with a dot, insert one:\n\t\t\tres.push_back('.');\n\t\t}\n\t\tres.append(a_NewExt);\n\t}\n\telse\n\t{\n\t\t// Replace existing extension:\n\t\tif (!a_NewExt.empty() && (a_NewExt[0] != '.'))\n\t\t{\n\t\t\t// a_NewExt doesn't start with a dot, keep the current one:\n\t\t\tres.erase(DotPos + 1, AString::npos);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tres.erase(DotPos, AString::npos);\n\t\t}\n\t\tres.append(a_NewExt);\n\t}\n\treturn res;\n}\n\n\n\n\n\nunsigned cFile::GetLastModificationTime(const AString & a_FileName)\n{\n\tstruct stat st;\n\tif (stat(a_FileName.c_str(), &st) < 0)\n\t{\n\t\treturn 0;\n\t}\n\t#if defined(_WIN32)\n\t\t// Windows returns times in local time already\n\t\treturn static_cast<unsigned>(st.st_mtime);\n\t#elif defined(ANDROID)\n\t\t// Identical to Linux below, but st_mtime is an unsigned long, so cast is needed:\n\t\tauto Time = static_cast<time_t>(st.st_mtime);\n\t\treturn static_cast<unsigned>(mktime(localtime(&Time)));\n\t#else\n\t\t// Linux returns UTC time, convert to local timezone:\n\t\treturn static_cast<unsigned>(mktime(localtime(&st.st_mtime)));\n\t#endif\n}\n\n\n\n\n\nAString cFile::GetPathSeparator()\n{\n\t#ifdef _WIN32\n\t\treturn \"\\\\\";\n\t#else\n\t\treturn \"/\";\n\t#endif\n}\n\n\n\n\n\nAString cFile::GetExecutableExt()\n{\n\t#ifdef _WIN32\n\t\treturn \".exe\";\n\t#else\n\t\treturn \"\";\n\t#endif\n}\n\n\n\n\n\nvoid cFile::Flush()\n{\n\tfflush(m_File);\n}\n\n\n\n\n\ntemplate <class StreamType>\nFileStream<StreamType>::FileStream(const std::string & Path)\n{\n\t// Except on failbit, which is what open sets on failure:\n\tFileStream::exceptions(FileStream::failbit | FileStream::badbit);\n\n\t// Open the file:\n\tFileStream::open(Path);\n\n\t// Only subsequently except on serious errors, and not on conditions like EOF or malformed input:\n\tFileStream::exceptions(FileStream::badbit);\n}\n\n\n\n\n\ntemplate <class StreamType>\nFileStream<StreamType>::FileStream(const std::string & Path, const typename FileStream::openmode Mode)\n{\n\t// Except on failbit, which is what open sets on failure:\n\tFileStream::exceptions(FileStream::failbit | FileStream::badbit);\n\n\t// Open the file:\n\tFileStream::open(Path, Mode);\n\n\t// Only subsequently except on serious errors, and not on conditions like EOF or malformed input:\n\tFileStream::exceptions(FileStream::badbit);\n}\n\n\n\n\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wweak-template-vtables\"  // http://bugs.llvm.org/show_bug.cgi?id=18733\n#endif\n\n// Instantiate the templated wrapper for input and output:\ntemplate class FileStream<std::ifstream>;\ntemplate class FileStream<std::ofstream>;\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n"
  },
  {
    "path": "src/OSSupport/File.h",
    "content": "\n// cFile.h\n\n// Interfaces to the cFile class providing an OS-independent abstraction of a file.\n\n/*\nThe object is optimized towards binary reads.\nThe object has no multithreading locks, don't use from multiple threads!\nUsage:\n1, Construct a cFile instance (no-param constructor)\n2, Open a file using Open(), check return value for success\n3, Read / write\n4, Destroy the instance\n\n-- OR --\n\n1, Construct a cFile instance opening the file (filename-param constructor)\n2, Check if the file was opened using IsOpen()\n3, Read / write\n4, Destroy the instance\n\nFor reading entire files into memory, just use the static cFile::ReadWholeFile()\n*/\n\n\n\n\n\n#pragma once\n\n#include \"StringUtils.h\"\n\n\n\n// tolua_begin\n\nclass cFile\n{\npublic:\n\n\t// tolua_end\n\tinline static char PathSeparator()\n\t{\n\t\t#ifdef _WIN32\n\t\t\treturn '\\\\';\n\t\t#else\n\t\t\treturn '/';\n\t\t#endif\n\t}\n\n\t/** The mode in which to open the file */\n\tenum eMode\n\t{\n\t\tfmRead,       // Read-only. If the file doesn't exist, object will not be valid\n\t\tfmWrite,      // Write-only. If the file already exists, it will be overwritten\n\t\tfmReadWrite,  // Read / write. If the file already exists, it will be left intact; writing will overwrite the data from the beginning\n\t\tfmAppend      // Write-only. If the file already exists cursor will be moved to the end of the file\n\t} ;\n\n\t/** Simple constructor - creates an unopened file object, use Open() to open / create a real file */\n\tcFile(void);\n\n\t/** Constructs and opens / creates the file specified, use IsOpen() to check for success */\n\tcFile(const AString & iFileName, eMode iMode);\n\n\t/** Auto-closes the file, if open */\n\t~cFile();\n\n\tbool Open(const AString & iFileName, eMode iMode);\n\tvoid Close(void);\n\tbool IsOpen(void) const;\n\tbool IsEOF(void) const;\n\n\t/** Reads up to a_NumBytes bytes into a_Buffer, returns the number of bytes actually read, or -1 on failure; asserts if not open */\n\tint Read(void * a_Buffer, size_t a_NumBytes);\n\n\t/** Reads up to a_NumBytes bytes, returns the bytes actually read, or empty string on failure; asserts if not open */\n\tstd::basic_string<std::byte> Read(size_t a_NumBytes);\n\n\t/** Writes up to a_NumBytes bytes from a_Buffer, returns the number of bytes actually written, or -1 on failure; asserts if not open */\n\tint Write(const void * a_Buffer, size_t a_NumBytes);\n\n\tint Write(std::string_view a_String)\n\t{\n\t\treturn Write(a_String.data(), a_String.size());\n\t}\n\n\t/** Seeks to iPosition bytes from file start, returns old position or -1 for failure; asserts if not open */\n\tlong Seek (int iPosition);\n\n\t/** Returns the current position (bytes from file start) or -1 for failure; asserts if not open */\n\tlong Tell (void) const;\n\n\t/** Returns the size of file, in bytes, or -1 for failure; asserts if not open */\n\tlong GetSize(void) const;\n\n\t/** Reads the file from current position till EOF into an AString; returns the number of bytes read or -1 for error */\n\tint ReadRestOfFile(AString & a_Contents);\n\n\t/** Returns true if the file specified exists */\n\tstatic bool Exists(const AString & a_FileName);  // Exported in ManualBindings.cpp\n\n\t/** Deletes a file or a folder, returns true if successful.\n\tPrefer to use DeleteFile or DeleteFolder, since those don't have the penalty of checking whether a_Path is a folder. */\n\tstatic bool Delete(const AString & a_Path);  // Exported in ManualBindings.cpp\n\n\t/** Deletes a file, returns true if successful.\n\tReturns false if a_FileName points to a folder. */\n\tstatic bool DeleteFile(const AString & a_FileName);  // Exported in ManualBindings.cpp\n\n\t/** Deletes a folder, returns true if successful.\n\tReturns false if a_FolderName points to a file. */\n\tstatic bool DeleteFolder(const AString & a_FolderName);  // Exported in ManualBindings.cpp\n\n\t/** Deletes all content from the specified folder.\n\tThe specified folder itself stays intact.\n\tReturns true on success, false on failure. */\n\tstatic bool DeleteFolderContents(const AString & a_FolderName);  // Exported in ManualBindings.cpp\n\n\t/** Renames a file or folder, returns true if successful. May fail if dest already exists (libc-dependant)! */\n\tstatic bool Rename(const AString & a_OrigPath, const AString & a_NewPath);  // Exported in ManualBindings.cpp\n\n\t/** Copies a file, returns true if successful.\n\tOverwrites the dest file if it already exists. */\n\tstatic bool Copy(const AString & a_SrcFileName, const AString & a_DstFileName);  // Exported in ManualBindings.cpp\n\n\t/** Returns true if the specified path is a folder */\n\tstatic bool IsFolder(const AString & a_Path);  // Exported in ManualBindings.cpp\n\n\t/** Returns true if the specified path is a regular file */\n\tstatic bool IsFile(const AString & a_Path);  // Exported in ManualBindings.cpp\n\n\t/** Returns the size of the file, or a negative number on error */\n\tstatic long GetSize(const AString & a_FileName);  // Exported in ManualBindings.cpp\n\n\t/** Creates a new folder with the specified name. Returns true if successful. Path may be relative or absolute */\n\tstatic bool CreateFolder(const AString & a_FolderPath);  // Exported in ManualBindings.cpp\n\n\t/** Creates a new folder with the specified name, creating its parents if needed. Path may be relative or absolute.\n\tReturns true if the folder exists at the end of the operation (either created, or already existed).\n\tSupports only paths that use the path separator used by the current platform (MSVC CRT supports slashes for file paths, too, but this function doesn't) */\n\tstatic bool CreateFolderRecursive(const AString & a_FolderPath);  // Exported in ManualBindings.cpp\n\n\t/** Returns the entire contents of the specified file as a string. Returns empty string on error. */\n\tstatic AString ReadWholeFile(const AString & a_FileName);  // Exported in ManualBindings.cpp\n\n\t/** Returns a_FileName with its extension changed to a_NewExt.\n\ta_FileName may contain path specification. */\n\tstatic AString ChangeFileExt(const AString & a_FileName, const AString & a_NewExt);  // Exported in ManualBindings.cpp\n\n\t/** Returns the last modification time (in current timezone) of the specified file.\n\tThe value returned is in the same units as the value returned by time() function.\n\tIf the file is not found / accessible, zero is returned.\n\tWorks for folders, too, when specified without the trailing path separator. */\n\tstatic unsigned GetLastModificationTime(const AString & a_FileName);  // Exported in ManualBindings.cpp\n\n\t// tolua_begin\n\n\t/** Returns the path separator used by the current platform.\n\tNote that the platform / CRT may support additional path separators (such as slashes on Windows), these don't get reported. */\n\tstatic AString GetPathSeparator();\n\n\t/** Returns the customary executable extension used by the current platform. */\n\tstatic AString GetExecutableExt();\n\n\t// tolua_end\n\n\t/** Returns the list of all items in the specified folder (files, folders, nix pipes, whatever's there). */\n\tstatic AStringVector GetFolderContents(const AString & a_Folder);  // Exported in ManualBindings.cpp\n\n\t/** Flushes all the bufferef output into the file (only when writing) */\n\tvoid Flush();\n\nprivate:\n\tFILE * m_File;\n} ;  // tolua_export\n\n\n\n\n\n/** A wrapper for file streams that enables exceptions. */\ntemplate <class StreamType>\nclass FileStream final : public StreamType\n{\npublic:\n\n\tFileStream(const std::string & Path);\n\tFileStream(const std::string & Path, const typename FileStream::openmode Mode);\n};\n\n\n\n\n\nusing InputFileStream = FileStream<std::ifstream>;\nusing OutputFileStream = FileStream<std::ofstream>;\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wweak-template-vtables\"  // http://bugs.llvm.org/show_bug.cgi?id=18733\n#endif\n\nextern template class FileStream<std::ifstream>;\nextern template class FileStream<std::ofstream>;\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n"
  },
  {
    "path": "src/OSSupport/GZipFile.cpp",
    "content": "\n// GZipFile.cpp\n\n// Implements the cGZipFile class representing a RAII wrapper over zlib's GZip file routines\n\n#include \"Globals.h\"\n#include \"File.h\"\n#include \"GZipFile.h\"\n\n\n\n\n\nCompression::Result GZipFile::ReadRestOfFile(const std::string & a_FileName)\n{\n\tInputFileStream File(a_FileName, InputFileStream::binary);\n\tconst std::string Input{ std::istreambuf_iterator<char>(File), std::istreambuf_iterator<char>() };\n\tconst ContiguousByteBufferView Data{ reinterpret_cast<const std::byte *>(Input.data()), Input.size() };\n\n\treturn Compression::Extractor().ExtractGZip(Data);\n}\n\n\n\n\n\nvoid GZipFile::Write(const std::string & a_FileName, ContiguousByteBufferView a_Contents)\n{\n\tOutputFileStream(a_FileName, OutputFileStream::binary) << Compression::Compressor().CompressGZip(a_Contents).GetStringView();\n}\n"
  },
  {
    "path": "src/OSSupport/GZipFile.h",
    "content": "\n// GZipFile.h\n\n// Declares the GZipFile namespace representing a wrapper over a file stream that can read and write to GZip'd files\n\n\n\n\n\n#pragma once\n\n#include \"StringCompression.h\"\n\n\n\n\n\nnamespace GZipFile\n{\n\t/** Reads the rest of the file and returns the decompressed contents. */\n\tCompression::Result ReadRestOfFile(const std::string & a_FileName);\n\n\t/** Writes a_Contents into file, compressing it along the way. */\n\tvoid Write(const std::string & a_FileName, ContiguousByteBufferView a_Contents);\n} ;\n"
  },
  {
    "path": "src/OSSupport/GetAddressInfoError.h",
    "content": "#pragma once\n\n\n\n/** Returns the readable form of a getaddressinfo type error code */\ninline AString ErrorString(int a_ErrorCode)\n{\n\t// Note gai_strerror is not threadsafe on windows\n\t#ifdef _WIN32\n\t\tchar ErrorStr[GAI_STRERROR_BUFFER_SIZE + 1];\n\n\t\tint MsgLen = FormatMessageA(\n\t\t\tFORMAT_MESSAGE_FROM_SYSTEM |\n\t\t\tFORMAT_MESSAGE_IGNORE_INSERTS |\n\t\t\tFORMAT_MESSAGE_MAX_WIDTH_MASK,\n\t\t\tnullptr,\n\t\t\ta_ErrorCode,\n\t\t\tMAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n\t\t\tErrorStr,\n\t\t\tsizeof(ErrorStr) - 1,\n\t\t\tnullptr\n\t\t);\n\n\t\treturn AString(ErrorStr, MsgLen);\n\t#else\n\t\treturn gai_strerror(a_ErrorCode);\n\t#endif\n}\n\n"
  },
  {
    "path": "src/OSSupport/HostnameLookup.cpp",
    "content": "\n// HostnameLookup.cpp\n\n// Implements the cHostnameLookup class representing an in-progress hostname-to-IP lookup\n\n#include \"Globals.h\"\n#include \"HostnameLookup.h\"\n#include \"NetworkSingleton.h\"\n#include \"GetAddressInfoError.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cHostnameLookup:\n\ncHostnameLookup::cHostnameLookup(const AString & a_Hostname, cNetwork::cResolveNameCallbacksPtr a_Callbacks):\n\tm_Callbacks(std::move(a_Callbacks)),\n\tm_Hostname(a_Hostname)\n{\n}\n\n\n\n\n\nvoid cHostnameLookup::Lookup(const AString & a_Hostname, cNetwork::cResolveNameCallbacksPtr a_Callbacks)\n{\n\t// Cannot use std::make_shared here, constructor is not accessible\n\tcHostnameLookupPtr Lookup{ new cHostnameLookup(a_Hostname, std::move(a_Callbacks)) };\n\n\t// Note the Lookup object is owned solely by this lambda which is destroyed after it runs\n\tcNetworkSingleton::Get().GetLookupThread().ScheduleLookup([=]()\n\t{\n\t\t// Start the lookup:\n\t\taddrinfo hints;\n\t\tmemset(&hints, 0, sizeof(hints));\n\t\thints.ai_protocol = IPPROTO_TCP;\n\t\thints.ai_socktype = SOCK_STREAM;\n\t\thints.ai_family = AF_UNSPEC;\n\t\thints.ai_flags = AI_CANONNAME;\n\n\t\taddrinfo * Result;\n\t\tint ErrCode = getaddrinfo(Lookup->m_Hostname.c_str(), nullptr, &hints, &Result);\n\n\t\tLookup->Callback(ErrCode, Result);\n\t});\n}\n\n\n\n\n\nvoid cHostnameLookup::Callback(int a_ErrCode, addrinfo * a_Addr)\n{\n\t// If an error has occurred, notify the error callback:\n\tif (a_ErrCode != 0)\n\t{\n\t\tm_Callbacks->OnError(a_ErrCode, ErrorString(a_ErrCode));\n\t\treturn;\n\t}\n\n\t// Call the success handler for each entry received:\n\tbool HasResolved = false;\n\taddrinfo * OrigAddr = a_Addr;\n\tfor (;a_Addr != nullptr; a_Addr = a_Addr->ai_next)\n\t{\n\t\tchar IP[128];\n\t\tswitch (a_Addr->ai_family)\n\t\t{\n\t\t\tcase AF_INET:  // IPv4\n\t\t\t{\n\t\t\t\tsockaddr_in * sin = reinterpret_cast<sockaddr_in *>(a_Addr->ai_addr);\n\t\t\t\tif (!m_Callbacks->OnNameResolvedV4(m_Hostname, sin))\n\t\t\t\t{\n\t\t\t\t\t// Callback indicated that the IP shouldn't be serialized to a string, just continue with the next address:\n\t\t\t\t\tHasResolved = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tevutil_inet_ntop(AF_INET, &(sin->sin_addr), IP, sizeof(IP));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase AF_INET6:  // IPv6\n\t\t\t{\n\t\t\t\tsockaddr_in6 * sin = reinterpret_cast<sockaddr_in6 *>(a_Addr->ai_addr);\n\t\t\t\tif (!m_Callbacks->OnNameResolvedV6(m_Hostname, sin))\n\t\t\t\t{\n\t\t\t\t\t// Callback indicated that the IP shouldn't be serialized to a string, just continue with the next address:\n\t\t\t\t\tHasResolved = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tevutil_inet_ntop(AF_INET6, &(sin->sin6_addr), IP, sizeof(IP));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\t// Unknown address family, handle as if this entry wasn't received\n\t\t\t\tcontinue;  // for (a_Addr)\n\t\t\t}\n\t\t}\n\t\tm_Callbacks->OnNameResolved(m_Hostname, IP);\n\t\tHasResolved = true;\n\t}  // for (a_Addr)\n\n\t// If only unsupported families were reported, call the Error handler:\n\tif (!HasResolved)\n\t{\n\t\tm_Callbacks->OnError(EAI_NONAME, ErrorString(EAI_NONAME));\n\t}\n\telse\n\t{\n\t\tm_Callbacks->OnFinished();\n\t}\n\tfreeaddrinfo(OrigAddr);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNetwork API:\n\nbool cNetwork::HostnameToIP(\n\tconst AString & a_Hostname,\n\tcNetwork::cResolveNameCallbacksPtr a_Callbacks\n)\n{\n\tcHostnameLookup::Lookup(a_Hostname, std::move(a_Callbacks));\n\treturn true;\n}\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/HostnameLookup.h",
    "content": "\n// HostnameLookup.h\n\n// Declares the cHostnameLookup class representing an in-progress hostname-to-IP lookup\n\n// This is an internal header, no-one outside OSSupport should need to include it; use Network.h instead\n\n\n\n\n\n#pragma once\n\n#include \"Network.h\"\n\n\n\n\n\n/** Holds information about an in-progress Hostname-to-IP lookup. */\nclass cHostnameLookup\n{\npublic:\n\t/** Creates a lookup object and schedules the lookup. */\n\tstatic void Lookup(const AString & a_Hostname, cNetwork::cResolveNameCallbacksPtr a_Callbacks);\n\nprotected:\n\n\t/** Creates the lookup object. Doesn't start the lookup yet. */\n\tcHostnameLookup(const AString & a_Hostname, cNetwork::cResolveNameCallbacksPtr a_Callbacks);\n\n\t/** The callbacks to call for resolved names / errors. */\n\tcNetwork::cResolveNameCallbacksPtr m_Callbacks;\n\n\t/** The hostname that was queried (needed for the callbacks). */\n\tAString m_Hostname;\n\n\tvoid Callback(int a_ErrCode, struct addrinfo * a_Addr);\n};\ntypedef std::shared_ptr<cHostnameLookup> cHostnameLookupPtr;\ntypedef std::vector<cHostnameLookupPtr> cHostnameLookupPtrs;\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/IPLookup.cpp",
    "content": "\n// IPLookup.cpp\n\n// Implements the cIPLookup class representing an IP-to-hostname lookup in progress.\n\n#include \"Globals.h\"\n#include \"IPLookup.h\"\n#include <event2/util.h>\n#include \"NetworkSingleton.h\"\n#include \"GetAddressInfoError.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cIPLookup:\n\ncIPLookup::cIPLookup(const AString & a_IP, cNetwork::cResolveNameCallbacksPtr a_Callbacks):\n\tm_Callbacks(std::move(a_Callbacks)),\n\tm_IP(a_IP)\n{\n\tASSERT(m_Callbacks != nullptr);\n}\n\n\n\n\n\nvoid cIPLookup::Lookup(const AString & a_IP, cNetwork::cResolveNameCallbacksPtr a_Callbacks)\n{\n\tcIPLookupPtr Lookup{ new cIPLookup(a_IP, std::move(a_Callbacks)) };  // Cannot use std::make_shared here, constructor is not accessible\n\n\t// Note the Lookup object is owned solely by this lambda which is destroyed after it runs\n\tcNetworkSingleton::Get().GetLookupThread().ScheduleLookup([=]()\n\t{\n\t\tsockaddr_storage sa;\n\t\tint salen = sizeof(sa);\n\t\tmemset(&sa, 0, sizeof(sa));\n\n\t\tint ErrCode = evutil_parse_sockaddr_port(Lookup->m_IP.c_str(), reinterpret_cast<sockaddr *>(&sa), &salen);\n\n\t\tif (ErrCode != 0)\n\t\t{\n\t\t\tLOGD(\"Failed to parse IP address \\\"%s\\\".\", Lookup->m_IP.c_str());\n\t\t\tLookup->Callback(ErrCode, nullptr);\n\t\t\treturn;\n\t\t}\n\n\t\tchar Hostname[NI_MAXHOST];\n\t\tchar ServInfo[NI_MAXSERV];\n\n\t\tErrCode = getnameinfo(\n\t\t\treinterpret_cast<sockaddr *>(&sa),\n\t\t\tstatic_cast<socklen_t>(salen),\n\t\t\tHostname, sizeof(Hostname),\n\t\t\tServInfo, sizeof(ServInfo),\n\t\t\t0\n\t\t);\n\t\tLookup->Callback(ErrCode, Hostname);\n\t});\n}\n\n\n\n\n\nvoid cIPLookup::Callback(int a_Result, const char * a_Address)\n{\n\t// Call the proper callback based on the event received:\n\tif ((a_Result != 0) || (a_Address == nullptr))\n\t{\n\t\t// An error has occurred, notify the error callback:\n\t\tm_Callbacks->OnError(a_Result, ErrorString(a_Result));\n\t}\n\telse\n\t{\n\t\t// Call the success handler:\n\t\tm_Callbacks->OnNameResolved(a_Address, m_IP);\n\t\tm_Callbacks->OnFinished();\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNetwork API:\n\nbool cNetwork::IPToHostName(\n\tconst AString & a_IP,\n\tcNetwork::cResolveNameCallbacksPtr a_Callbacks\n)\n{\n\tcIPLookup::Lookup(a_IP, std::move(a_Callbacks));\n\treturn true;\n}\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/IPLookup.h",
    "content": "\n// IPLookup.h\n\n// Declares the cIPLookup class representing an IP-to-hostname lookup in progress.\n\n// This is an internal header, no-one outside OSSupport should need to include it; use Network.h instead\n\n\n\n\n\n#pragma once\n\n#include \"Network.h\"\n\n\n\n\n\n/** Holds information about an in-progress IP-to-Hostname lookup. */\nclass cIPLookup\n{\npublic:\n\n\t/** Creates a lookup object and schedules the lookup. */\n\tstatic void Lookup(const AString & a_IP, cNetwork::cResolveNameCallbacksPtr a_Callbacks);\n\nprotected:\n\n\t/** The callbacks to call for resolved names / errors. */\n\tcNetwork::cResolveNameCallbacksPtr m_Callbacks;\n\n\t/** The IP that was queried (needed for the callbacks). */\n\tAString m_IP;\n\n\t/** Creates the lookup object. Doesn't start the lookup yet. */\n\tcIPLookup(const AString & a_IP, cNetwork::cResolveNameCallbacksPtr a_Callbacks);\n\n\t/** Callback that is called by LibEvent when there's an event for the request. */\n\tvoid Callback(int a_Result, const char * a_Address);\n};\ntypedef std::shared_ptr<cIPLookup> cIPLookupPtr;\ntypedef std::vector<cIPLookupPtr> cIPLookupPtrs;\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/IsThread.cpp",
    "content": "\n// IsThread.cpp\n\n// Implements the cIsThread class representing an OS-independent wrapper for a class that implements a thread.\n\n#include \"Globals.h\"\n#include \"IsThread.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cIsThread:\n\ncIsThread::cIsThread(AString && a_ThreadName) :\n\tm_ShouldTerminate(false),\n\tm_ThreadName(std::move(a_ThreadName))\n{\n}\n\n\n\n\n\ncIsThread::~cIsThread()\n{\n\tStop();\n}\n\n\n\n\n\nvoid cIsThread::Start(void)\n{\n\t// Initialize the thread:\n\tm_Thread = std::thread(&cIsThread::Entrypoint, this);\n\n\t// Notify the thread that initialization is complete and it can run its code safely:\n\tm_Initialisation.Set();\n}\n\n\n\n\n\nvoid cIsThread::Stop(void)\n{\n\tm_ShouldTerminate = true;\n\t{\n\t\tLOGD(\"Waiting for the %s thread to finish\", m_ThreadName.c_str());\n\t\tif (m_Thread.joinable())\n\t\t{\n\t\t\tm_Thread.join();\n\t\t}\n\t\tLOGD(\"The %s thread finished\", m_ThreadName.c_str());\n\t}\n\tm_ShouldTerminate = false;\n}\n\n\n\n\n\nvoid cIsThread::Entrypoint(void)\n{\n\t// Apply thread naming:\n\tSetThreadName();\n\n\t// Wait for initialisation:\n\tm_Initialisation.Wait();\n\n\ttry\n\t{\n\t\tExecute();\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGERROR(\"Thread %s faulted with standard exception: %s\", m_ThreadName.c_str(), Oops.what());\n\t\tstd::abort();\n\t}\n\tcatch (...)\n\t{\n\t\tLOGERROR(\"Thread %s faulted with unknown exception!\", m_ThreadName.c_str());\n\t\tstd::abort();\n\t}\n}\n\n\n\n\n\nvoid cIsThread::SetThreadName() const\n{\n#if defined(_MSC_VER) && !defined(NDEBUG)\n\t/* Sets the name of this thread.\n\t(When in MSVC, the debugger provides \"thread naming\" by catching special exceptions)\n\tCode adapted from MSDN: https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx */\n\n\tif (m_ThreadName.empty())\n\t{\n\t\treturn;\n\t}\n\n#pragma pack(push, 8)\n\tstruct THREADNAME_INFO\n\t{\n\t\tDWORD  dwType;      // Must be 0x1000.\n\t\tLPCSTR szName;      // Pointer to name (in user addr space).\n\t\tDWORD  dwThreadID;  // Thread ID (-1 = caller thread).\n\t\tDWORD  dwFlags;     // Reserved for future use, must be zero.\n\t};\n#pragma pack(pop)\n\n\tconst DWORD NAME_EXCEPTION = 0x406D1388;\n\tconst THREADNAME_INFO Name = { 0x1000, m_ThreadName.c_str(), static_cast<DWORD>(-1), 0 };\n\n\t__try\n\t{\n\t\tRaiseException(NAME_EXCEPTION, 0, sizeof(Name) / sizeof(ULONG_PTR), reinterpret_cast<const ULONG_PTR *>(&Name));\n\t}\n\t__except (EXCEPTION_EXECUTE_HANDLER)\n\t{\n\t}\n#endif\n}\n"
  },
  {
    "path": "src/OSSupport/IsThread.h",
    "content": "\n// IsThread.h\n\n// Interfaces to the cIsThread class representing an OS-independent wrapper for a class that implements a thread.\n\n/*\nUsage:\nTo have a new thread, declare a class descending from cIsThread.\nThen override its Execute() method to provide your thread processing.\nIn the descending class' constructor call the Start() method to start the thread once you're finished with initialization.\n*/\n\n\n\n\n\n#pragma once\n\n\n\n\n\nclass cIsThread\n{\npublic:\n\n\tcIsThread(AString && a_ThreadName);\n\tvirtual ~cIsThread();\n\n\t/** Starts the thread; returns without waiting for the actual start. */\n\tvoid Start(void);\n\n\t/** Signals the thread to terminate and waits until it's finished. */\n\tvoid Stop(void);\n\n\t/** Returns true if the thread calling this function is the thread contained within this object. */\n\tbool IsCurrentThread(void) const { return std::this_thread::get_id() == m_Thread.get_id(); }\n\nprotected:\n\n\t/** This function, overloaded by the descendants, is called in the new thread. */\n\tvirtual void Execute(void) = 0;\n\n\t/** The overriden Execute() method should check this value periodically and terminate if this is true. */\n\tstd::atomic<bool> m_ShouldTerminate;\n\nprivate:\n\n\t/** The thread object which holds the created thread for later manipulation */\n\tstd::thread m_Thread;\n\n\t/** The name of the thread, used to aid debugging in IDEs which support named threads */\n\tAString m_ThreadName;\n\n\t/** The event that is used to wait with the thread's execution until the thread object is fully initialized.\n\tThis prevents the IsCurrentThread() call to fail because of a race-condition where the thread starts before m_Thread has been fully assigned. */\n\tcEvent m_Initialisation;\n\n\t/** This is the main thread entrypoint.\n\tWrapper for Execute() that waits for the initialization event, to prevent race conditions in thread initialization. */\n\tvoid Entrypoint(void);\n\n\t/** Sets the name of the current thread to be the name provided in m_ThreadName. */\n\tvoid SetThreadName() const;\n} ;\n"
  },
  {
    "path": "src/OSSupport/MiniDumpWriter.h",
    "content": "\n// MiniDumpWriter.h\n\n// 32-bit only:\n// When the server crashes, create a \"dump file\" containing the callstack of each thread and some variables;\n// let the user send us that crash file for analysis.\n\n// This file MUST NOT be included from anywhere other than main.cpp.\n\n\n\n\n\n/** Flags to control minidump contents on supported platforms. */\nenum class MiniDumpFlags\n{\n\tWithDataSegments,\n\tWithFullMemory\n};\n\n\n\n\n\n#if defined(_WIN32) && !defined(_WIN64) && defined(_MSC_VER)  // 32-bit Windows app compiled in MSVC\n\n#include <DbgHelp.h>\n\n\n\n\n\nusing MiniDumpWriteDumpFunction = decltype(&MiniDumpWriteDump);\n\nstatic HINSTANCE m_DbgHelp;\nstatic MiniDumpWriteDumpFunction s_WriteMiniDump;  // The function in dbghlp DLL that creates dump files\nstatic wchar_t s_DumpFileName[MAX_PATH];  // Filename of the dump file; hes to be created before the dump handler kicks in\nstatic char s_ExceptionStack[128 * 1024];  // Substitute stack, just in case the handler kicks in because of \"insufficient stack space\"\nstatic MINIDUMP_TYPE s_DumpFlags = MiniDumpNormal;  // By default dump only the stack and some helpers\n\n\n\n\n\n/** This function gets called just before the \"program executed an illegal instruction and will be terminated\" or similar.\nIts purpose is to create the crashdump using the dbghlp DLLs */\nstatic LONG WINAPI LastChanceExceptionFilter(__in struct _EXCEPTION_POINTERS * a_ExceptionInfo)\n{\n\tchar * newStack = &s_ExceptionStack[sizeof(s_ExceptionStack) - 1];\n\tchar * oldStack;\n\n\t// Use the substitute stack:\n\t_asm\n\t{\n\t\tmov oldStack, esp\n\t\tmov esp, newStack\n\t}\n\n\tMINIDUMP_EXCEPTION_INFORMATION  ExcInformation;\n\tExcInformation.ThreadId = GetCurrentThreadId();\n\tExcInformation.ExceptionPointers = a_ExceptionInfo;\n\tExcInformation.ClientPointers = 0;\n\n\t// Write the dump file:\n\tHANDLE dumpFile = CreateFile(s_DumpFileName, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);\n\ts_WriteMiniDump(GetCurrentProcess(), GetCurrentProcessId(), dumpFile, s_DumpFlags, (a_ExceptionInfo) ? &ExcInformation : nullptr, nullptr, nullptr);\n\tCloseHandle(dumpFile);\n\n\t// Revert to old stack:\n\t_asm\n\t{\n\t\tmov esp, oldStack\n\t}\n\n\treturn 0;\n}\n\n\n\n\n\nnamespace MiniDumpWriter\n{\n\tstatic void Register()\n\t{\n\t\t// Magic code to produce dump-files on Windows if the server crashes:\n\n\t\tm_DbgHelp = LoadLibrary(L\"DBGHELP.DLL\");\n\t\tif (m_DbgHelp == INVALID_HANDLE_VALUE)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\ts_WriteMiniDump = (MiniDumpWriteDumpFunction)GetProcAddress(m_DbgHelp, \"MiniDumpWriteDump\");\n\t\tif (s_WriteMiniDump != nullptr)\n\t\t{\n\t\t\tASSERT(swprintf(s_DumpFileName, ARRAYCOUNT(s_DumpFileName), L\"crash_mcs_%x.dmp\", GetCurrentProcessId()) > 0);\n\t\t\tSetUnhandledExceptionFilter(LastChanceExceptionFilter);\n\t\t}\n\n\t\t// End of dump-file magic\n\t}\n\n\tstatic void AddDumpFlags(const MiniDumpFlags a_Flags)\n\t{\n\t\tswitch (a_Flags)\n\t\t{\n\t\t\tcase MiniDumpFlags::WithDataSegments:\n\t\t\t{\n\t\t\t\ts_DumpFlags = static_cast<MINIDUMP_TYPE>(s_DumpFlags | MINIDUMP_TYPE::MiniDumpWithDataSegs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MiniDumpFlags::WithFullMemory:\n\t\t\t{\n\t\t\t\ts_DumpFlags = static_cast<MINIDUMP_TYPE>(s_DumpFlags | MINIDUMP_TYPE::MiniDumpWithFullMemory);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void Unregister()\n\t{\n\t\tFreeLibrary(m_DbgHelp);\n\t}\n};\n\n#else\n\nnamespace MiniDumpWriter\n{\n\tstatic void Register()\n\t{\n\t}\n\n\tstatic void AddDumpFlags(const MiniDumpFlags)\n\t{\n\t}\n\n\tstatic void Unregister()\n\t{\n\t}\n};\n\n#endif\n"
  },
  {
    "path": "src/OSSupport/Network.h",
    "content": "\n// Network.h\n\n// Declares the classes used for the Network API\n\n\n\n\n\n#pragma once\n\n\n\n\n\n#ifdef __FreeBSD__\n\t#include <netinet/in.h>\n#endif\n\n\n\n\n\n// fwd:\nclass cTCPLink;\ntypedef std::shared_ptr<cTCPLink> cTCPLinkPtr;\ntypedef std::vector<cTCPLinkPtr> cTCPLinkPtrs;\nclass cServerHandle;\ntypedef std::shared_ptr<cServerHandle> cServerHandlePtr;\ntypedef std::vector<cServerHandlePtr> cServerHandlePtrs;\nclass cCryptoKey;\ntypedef std::shared_ptr<cCryptoKey> cCryptoKeyPtr;\nclass cX509Cert;\ntypedef std::shared_ptr<cX509Cert> cX509CertPtr;\n\n\n\n\n\n/** Interface that provides the methods available on a single TCP connection. */\nclass cTCPLink\n{\n\tfriend class cNetwork;\n\npublic:\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor for all descendants:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when the cTCPLink for the connection is created.\n\t\tThe callback may store the cTCPLink instance for later use, but it should remove it in OnError(), OnRemoteClosed() or right after Close(). */\n\t\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) = 0;\n\n\t\t/** Called when there's data incoming from the remote peer. */\n\t\tvirtual void OnReceivedData(const char * a_Data, size_t a_Length) = 0;\n\n\t\t/** Called when the remote end closes the connection.\n\t\tThe link is still available for connection information query (IP / port).\n\t\tSending data on the link is not an error, but the data won't be delivered. */\n\t\tvirtual void OnRemoteClosed(void) = 0;\n\n\t\t/** Called when the TLS handshake has been completed and communication can continue regularly.\n\t\tHas an empty default implementation, so that link callback descendants don't need to specify TLS handlers when they don't use TLS at all. */\n\t\tvirtual void OnTlsHandshakeCompleted(void) {}\n\n\t\t/** Called when an error is detected on the connection. */\n\t\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) = 0;\n\t};\n\ttypedef std::shared_ptr<cCallbacks> cCallbacksPtr;\n\n\n\t// Force a virtual destructor for all descendants:\n\tvirtual ~cTCPLink() {}\n\n\t/** Queues the specified data for sending to the remote peer.\n\tReturns true on success, false on failure. Note that this success or failure only reports the queue status, not the actual data delivery. */\n\tvirtual bool Send(const void * a_Data, size_t a_Length) = 0;\n\n\t/** Queues the specified data for sending to the remote peer.\n\tReturns true on success, false on failure. Note that this success or failure only reports the queue status, not the actual data delivery. */\n\tbool Send(const AString & a_Data)\n\t{\n\t\treturn Send(a_Data.data(), a_Data.size());\n\t}\n\n\t/** Returns the IP address of the local endpoint of the connection. */\n\tvirtual AString GetLocalIP(void) const = 0;\n\n\t/** Returns the port used by the local endpoint of the connection. */\n\tvirtual UInt16 GetLocalPort(void) const = 0;\n\n\t/** Returns the IP address of the remote endpoint of the connection. */\n\tvirtual AString GetRemoteIP(void) const = 0;\n\n\t/** Returns the port used by the remote endpoint of the connection. */\n\tvirtual UInt16 GetRemotePort(void) const = 0;\n\n\t/** Closes the link gracefully.\n\tThe link will send any queued outgoing data, then it will send the FIN packet.\n\tThe link will still receive incoming data from remote until the remote closes the connection. */\n\tvirtual void Shutdown(void) = 0;\n\n\t/** Drops the connection without any more processing.\n\tSends the RST packet, queued outgoing and incoming data is lost. */\n\tvirtual void Close(void) = 0;\n\n\t/** Starts a TLS handshake as a client connection.\n\tIf a client certificate should be used for the connection, set the certificate into a_OwnCertData and\n\tits corresponding private key to a_OwnPrivKeyData. If both are empty, no client cert is presented.\n\ta_OwnPrivKeyPassword is the password to be used for decoding PrivKey, empty if not passworded.\n\tReturns empty string on success, non-empty error description on failure. */\n\tvirtual AString StartTLSClient(\n\t\tcX509CertPtr a_OwnCert,\n\t\tcCryptoKeyPtr a_OwnPrivKey,\n\t\tcX509CertPtr a_TrustedRootCAs\n\t) = 0;\n\n\t/** Starts a TLS handshake as a server connection.\n\tSet the server certificate into a_CertData and its corresponding private key to a_OwnPrivKeyData.\n\ta_OwnPrivKeyPassword is the password to be used for decoding PrivKey, empty if not passworded.\n\ta_StartTLSData is any data that should be pushed into the TLS before reading more data from the remote.\n\tThis is used mainly for protocols starting TLS in the middle of communication, when the TLS start command\n\tcan be received together with the TLS Client Hello message in one OnReceivedData() call, to re-queue the\n\tClient Hello message into the TLS handshake buffer.\n\tReturns empty string on success, non-empty error description on failure. */\n\tvirtual AString StartTLSServer(\n\t\tcX509CertPtr a_OwnCert,\n\t\tcCryptoKeyPtr a_OwnPrivKey,\n\t\tconst AString & a_StartTLSData\n\t) = 0;\n\n\t/** Returns the callbacks that are used. */\n\tcCallbacksPtr GetCallbacks(void) const { return m_Callbacks; }\n\nprotected:\n\t/** Callbacks to be used for the various situations. */\n\tcCallbacksPtr m_Callbacks;\n\n\n\t/** Creates a new link, with the specified callbacks. */\n\tcTCPLink(cCallbacksPtr a_Callbacks):\n\t\tm_Callbacks(std::move(a_Callbacks))\n\t{\n\t}\n};\n\n\n\n\n\n/** Interface that provides the methods available on a listening server socket. */\nclass cServerHandle\n{\n\tfriend class cNetwork;\npublic:\n\n\t// Force a virtual destructor for all descendants:\n\tvirtual ~cServerHandle() {}\n\n\t/** Stops the server, no more incoming connections will be accepted.\n\tAll current connections will be shut down (cTCPLink::Shutdown()). */\n\tvirtual void Close(void) = 0;\n\n\t/** Returns true if the server has been started correctly and is currently listening for incoming connections. */\n\tvirtual bool IsListening(void) const = 0;\n};\n\n\n\n\n\n/** Interface that provides methods available on UDP communication endpoints. */\nclass cUDPEndpoint\n{\npublic:\n\t/** Interface for the callbacks for events that can happen on the endpoint. */\n\tclass cCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in all descendants:\n\t\tvirtual ~cCallbacks() {}\n\n\t\t/** Called when an error occurs on the endpoint. */\n\t\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) = 0;\n\n\t\t/** Called when there is an incoming datagram from a remote host. */\n\t\tvirtual void OnReceivedData(const char * a_Data, size_t a_Size, const AString & a_RemoteHost, UInt16 a_RemotePort) = 0;\n\t};\n\n\n\t// Force a virtual destructor for all descendants:\n\tvirtual ~cUDPEndpoint() {}\n\n\t/** Closes the underlying socket.\n\tNote that there still might be callbacks in-flight after this method returns. */\n\tvirtual void Close(void) = 0;\n\n\t/** Returns true if the endpoint is open. */\n\tvirtual bool IsOpen(void) const = 0;\n\n\t/** Returns the local port to which the underlying socket is bound. */\n\tvirtual UInt16 GetPort(void) const = 0;\n\n\t/** Sends the specified payload in a single UDP datagram to the specified host + port combination.\n\tNote that in order to send to a broadcast address, you need to call EnableBroadcasts() first. */\n\tvirtual bool Send(const AString & a_Payload, const AString & a_Host, UInt16 a_Port) = 0;\n\n\t/** Marks the socket as capable of sending broadcast, using whatever OS API is needed.\n\tWithout this call, sending to a broadcast address using Send() may fail. */\n\tvirtual void EnableBroadcasts(void) = 0;\n\nprotected:\n\t/** The callbacks used for various events on the endpoint. */\n\tcCallbacks & m_Callbacks;\n\n\n\t/** Creates a new instance of an endpoint, with the specified callbacks. */\n\tcUDPEndpoint(cCallbacks & a_Callbacks):\n\t\tm_Callbacks(a_Callbacks)\n\t{\n\t}\n};\n\ntypedef std::shared_ptr<cUDPEndpoint> cUDPEndpointPtr;\n\n\n\n\n\nclass cNetwork\n{\npublic:\n\t/** Callbacks used for connecting to other servers as a client. */\n\tclass cConnectCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor for all descendants:\n\t\tvirtual ~cConnectCallbacks() {}\n\n\t\t/** Called when the Connect call succeeds.\n\t\tProvides the newly created link that can be used for communication. */\n\t\tvirtual void OnConnected(cTCPLink & a_Link) = 0;\n\n\t\t/** Called when the Connect call fails. */\n\t\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) = 0;\n\t};\n\ttypedef std::shared_ptr<cConnectCallbacks> cConnectCallbacksPtr;\n\n\n\t/** Callbacks used when listening for incoming connections as a server. */\n\tclass cListenCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor for all descendants:\n\t\tvirtual ~cListenCallbacks() {}\n\n\t\t/** Called when the TCP server created with Listen() receives a new incoming connection.\n\t\tReturns the link callbacks that the server should use for the newly created link.\n\t\tIf a nullptr is returned, the connection is dropped immediately;\n\t\totherwise a new cTCPLink instance is created and OnAccepted() is called. */\n\t\tvirtual cTCPLink::cCallbacksPtr OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort) = 0;\n\n\t\t/** Called when the TCP server created with Listen() creates a new link for an incoming connection.\n\t\tProvides the newly created Link that can be used for communication.\n\t\tCalled right after a successful OnIncomingConnection(). */\n\t\tvirtual void OnAccepted(cTCPLink & a_Link) = 0;\n\n\t\t/** Called when the socket fails to listen on the specified port. */\n\t\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) = 0;\n\t};\n\ttypedef std::shared_ptr<cListenCallbacks> cListenCallbacksPtr;\n\n\n\t/** Callbacks used when resolving names to IPs. */\n\tclass cResolveNameCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor for all descendants:\n\t\tvirtual ~cResolveNameCallbacks() {}\n\n\t\t/** Called when the hostname is successfully resolved into an IP address.\n\t\tMay be called multiple times if a name resolves to multiple addresses.\n\t\ta_IP may be either an IPv4 or an IPv6 address with their proper formatting.\n\t\tEach call to OnNameResolved() is preceded by a call to either OnNameResolvedV4() or OnNameResolvedV6(). */\n\t\tvirtual void OnNameResolved(const AString & a_Name, const AString & a_IP) = 0;\n\n\t\t/** Called when the hostname is successfully resolved into an IPv4 address.\n\t\tMay be called multiple times if a name resolves to multiple addresses.\n\t\tEach call to OnNameResolvedV4 is followed by OnNameResolved with the IP address serialized to a string.\n\t\tIf this callback returns false, the OnNameResolved() call is skipped for this address. */\n\t\tvirtual bool OnNameResolvedV4(const AString & a_Name, const sockaddr_in * a_IP) { return true; }\n\n\t\t/** Called when the hostname is successfully resolved into an IPv6 address.\n\t\tMay be called multiple times if a name resolves to multiple addresses.\n\t\tEach call to OnNameResolvedV4 is followed by OnNameResolved with the IP address serialized to a string.\n\t\tIf this callback returns false, the OnNameResolved() call is skipped for this address. */\n\t\tvirtual bool OnNameResolvedV6(const AString & a_Name, const sockaddr_in6 * a_IP) { return true; }\n\n\t\t/** Called when an error is encountered while resolving.\n\t\tIf an error is reported, the OnFinished() callback is not called. */\n\t\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) = 0;\n\n\t\t/** Called when all the addresses resolved have been reported via the OnNameResolved() callback.\n\t\tOnly called if there was no error reported. */\n\t\tvirtual void OnFinished(void) = 0;\n\t};\n\ttypedef std::shared_ptr<cResolveNameCallbacks> cResolveNameCallbacksPtr;\n\n\n\t/** Queues a TCP connection to be made to the specified host.\n\tCalls one the connection callbacks (success, error) when the connection is successfully established, or upon failure.\n\tThe a_LinkCallbacks is passed to the newly created cTCPLink.\n\tReturns true if queueing was successful, false on failure to queue.\n\tNote that the return value doesn't report the success of the actual connection; the connection is established asynchronously in the background.\n\tImplemented in TCPLinkImpl.cpp. */\n\tstatic bool Connect(\n\t\tconst AString & a_Host,\n\t\tUInt16 a_Port,\n\t\tcConnectCallbacksPtr a_ConnectCallbacks,\n\t\tcTCPLink::cCallbacksPtr a_LinkCallbacks\n\t);\n\n\n\t/** Opens up the specified port for incoming connections.\n\tCalls an OnAccepted callback for each incoming connection.\n\tA cTCPLink with the specified link callbacks is created for each connection.\n\tReturns a cServerHandle that can be used to query the operation status and close the server.\n\tImplemented in ServerHandleImpl.cpp. */\n\tstatic cServerHandlePtr Listen(\n\t\tUInt16 a_Port,\n\t\tcListenCallbacksPtr a_ListenCallbacks\n\t);\n\n\n\t/** Queues a DNS query to resolve the specified hostname to IP address.\n\tCalls one of the callbacks when the resolving succeeds, or when it fails.\n\tReturns true if queueing was successful, false if not.\n\tNote that the return value doesn't report the success of the actual lookup; the lookup happens asynchronously on the background.\n\tImplemented in HostnameLookup.cpp. */\n\tstatic bool HostnameToIP(\n\t\tconst AString & a_Hostname,\n\t\tcResolveNameCallbacksPtr a_Callbacks\n\t);\n\n\n\t/** Queues a DNS query to resolve the specified IP address to a hostname.\n\tCalls one of the callbacks when the resolving succeeds, or when it fails.\n\tReturns true if queueing was successful, false if not.\n\tNote that the return value doesn't report the success of the actual lookup; the lookup happens asynchronously on the background.\n\tImplemented in IPLookup.cpp. */\n\tstatic bool IPToHostName(\n\t\tconst AString & a_IP,\n\t\tcResolveNameCallbacksPtr a_Callbacks\n\t);\n\n\t/** Opens up an UDP endpoint for sending and receiving UDP datagrams on the specified port.\n\tIf a_Port is 0, the OS is free to assign any port number it likes to the endpoint.\n\tReturns the endpoint object that can be interacted with. */\n\tstatic cUDPEndpointPtr CreateUDPEndpoint(UInt16 a_Port, cUDPEndpoint::cCallbacks & a_Callbacks);\n\n\t/** Returns all local IP addresses for network interfaces currently available. */\n\tstatic AStringVector EnumLocalIPAddresses(void);\n};\n\n\n\n"
  },
  {
    "path": "src/OSSupport/NetworkInterfaceEnum.cpp",
    "content": "\n// NetworkInterfaceEnum.cpp\n\n// Implements the cNetwork::EnumLocalIPAddresses() interface enumeration function\n\n#include \"Globals.h\"\n#include \"Network.h\"\n#include \"event2/util.h\"\n\n#if defined(_WIN32)\n\t#include <IPHlpApi.h>\n\t#pragma comment(lib, \"IPHLPAPI.lib\")\n#elif !defined(ANDROID)  // _WIN32\n\t#include <sys/types.h>\n\t#include <ifaddrs.h>\n\t#include <netinet/in.h>\n\t#include <arpa/inet.h>\n#endif  // else _WIN32\n\n\n\n\n\n#if defined(_WIN32)\n\n/** Converts the SOCKET_ADDRESS structure received from the OS into an IP address string. */\nstatic AString PrintAddress(SOCKET_ADDRESS & a_Addr)\n{\n\tchar IP[128];\n\tswitch (a_Addr.lpSockaddr->sa_family)\n\t{\n\t\tcase AF_INET:\n\t\t{\n\t\t\tauto sin = reinterpret_cast<const sockaddr_in *>(a_Addr.lpSockaddr);\n\t\t\tevutil_inet_ntop(a_Addr.lpSockaddr->sa_family, &(sin->sin_addr), IP, sizeof(IP));\n\t\t\tbreak;\n\t\t}\n\t\tcase AF_INET6:\n\t\t{\n\t\t\tauto sin = reinterpret_cast<const sockaddr_in6 *>(a_Addr.lpSockaddr);\n\t\t\tevutil_inet_ntop(a_Addr.lpSockaddr->sa_family, &(sin->sin6_addr), IP, sizeof(IP));\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tIP[0] = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn IP;\n}\n\n#elif !defined(ANDROID)  // _WIN32\n\nstatic AString PrintAddress(ifaddrs * InterfaceAddress)\n{\n\tswitch (InterfaceAddress->ifa_addr->sa_family)\n\t{\n\t\tcase AF_INET:\n\t\t{  // IPv4\n\t\t\tchar AddressBuffer[INET_ADDRSTRLEN];\n\t\t\tsockaddr_in InternetSocket;\n\n\t\t\tstd::memcpy(&InternetSocket, InterfaceAddress->ifa_addr, sizeof(InternetSocket));\n\t\t\tinet_ntop(AF_INET, &InternetSocket.sin_addr, AddressBuffer, INET_ADDRSTRLEN);\n\t\t\treturn AddressBuffer;\n\t\t}\n\t\tcase AF_INET6:\n\t\t{  // IPv6\n\t\t\tchar AddressBuffer[INET6_ADDRSTRLEN];\n\t\t\tsockaddr_in6 InternetSocket;\n\n\t\t\tstd::memcpy(&InternetSocket, InterfaceAddress->ifa_addr, sizeof(InternetSocket));\n\t\t\tinet_ntop(AF_INET6, &InternetSocket.sin6_addr, AddressBuffer, INET6_ADDRSTRLEN);\n\t\t\treturn AddressBuffer;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tLOG(\"Unknown address family: %i\", InterfaceAddress->ifa_addr->sa_family);\n\t\t\treturn \"\";\n\t\t}\n\t}\n}\n\n#endif  // else !ANDROID\n\n\n\n\n\nAStringVector cNetwork::EnumLocalIPAddresses(void)\n{\n\tAStringVector res;\n\n\t#if defined(_WIN32)\n\n\t\t// Query the OS for all adapters' addresses:\n\t\tchar buffer[64 KiB];  // A buffer backing the address list\n\t\tPIP_ADAPTER_ADDRESSES pAddresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(&buffer);\n\t\tULONG outBufLen = sizeof(buffer);\n\t\tDWORD dwRetVal = GetAdaptersAddresses(\n\t\t\tAF_UNSPEC,\n\t\t\tGAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME, nullptr,\n\t\t\tpAddresses, &outBufLen\n\t\t);\n\t\tif (dwRetVal != ERROR_SUCCESS)\n\t\t{\n\t\t\tLOG(\"GetAdaptersAddresses() failed: %u\", dwRetVal);\n\t\t\treturn res;\n\t\t}\n\n\t\t// Enumerate all active adapters\n\t\tfor (auto pCurrAddresses = pAddresses; pCurrAddresses != nullptr; pCurrAddresses = pCurrAddresses->Next)\n\t\t{\n\t\t\tif (pCurrAddresses->OperStatus != IfOperStatusUp)\n\t\t\t{\n\t\t\t\t// Adapter not active, skip it:\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Collect all IP addresses on this adapter:\n\t\t\tfor (auto pUnicast = pCurrAddresses->FirstUnicastAddress; pUnicast != nullptr; pUnicast = pUnicast->Next)\n\t\t\t{\n\t\t\t\tauto Address = PrintAddress(pUnicast->Address);\n\t\t\t\tif (!Address.empty())\n\t\t\t\t{\n\t\t\t\t\tres.push_back(Address);\n\t\t\t\t}\n\t\t\t}  // for pUnicast\n\t\t}  // for pCurrAddresses\n\n\t#elif !defined(ANDROID)  // _WIN32\n\n\t\tstruct ifaddrs * ifAddrStruct = nullptr;\n\t\tgetifaddrs(&ifAddrStruct);\n\n\t\tfor (auto ifa = ifAddrStruct; ifa != nullptr; ifa = ifa->ifa_next)\n\t\t{\n\t\t\tif (ifa->ifa_addr == nullptr)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tauto Address = PrintAddress(ifa);\n\t\t\tif (!Address.empty())\n\t\t\t{\n\t\t\t\tres.emplace_back(Address);\n\t\t\t}\n\t\t}\n\n\t\tif (ifAddrStruct != nullptr)\n\t\t{\n\t\t\tfreeifaddrs(ifAddrStruct);\n\t\t}\n\n\t#endif  // else _WIN32\n\n\treturn res;\n}\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/NetworkLookup.cpp",
    "content": "\n// NetworkLookup.cpp\n\n// Implements the cNetworkLookup class representing an executor for asynchronous lookup tasks\n\n\n#include \"Globals.h\"\n#include \"NetworkLookup.h\"\n\n\n\n\ncNetworkLookup::cNetworkLookup() :\n\tcIsThread(\"Network Lookup Executor\")\n{\n}\n\n\n\n\n\ncNetworkLookup::~cNetworkLookup()\n{\n\tStop();\n}\n\n\n\n\n\nvoid cNetworkLookup::ScheduleLookup(std::function<void()> a_Lookup)\n{\n\tm_WorkQueue.EnqueueItem(std::move(a_Lookup));\n}\n\n\n\n\n\nvoid cNetworkLookup::Stop()\n{\n\tm_ShouldTerminate = true;\n\tm_WorkQueue.Clear();\n\tm_WorkQueue.EnqueueItem([](){});  // Dummy work to wake up the thread\n\tcIsThread::Stop();\n}\n\n\n\n\n\nvoid cNetworkLookup::Execute()\n{\n\twhile (!m_ShouldTerminate)\n\t{\n\t\t// Execute the next task in the queue\n\t\tauto Work = m_WorkQueue.DequeueItem();\n\t\tWork();\n\t}\n}\n\n\n\n"
  },
  {
    "path": "src/OSSupport/NetworkLookup.h",
    "content": "\n// NetworkLookup.h\n\n// Declares the cNetworkLookup class representing an executor for asynchronous lookup tasks\n\n#pragma once\n\n#include <functional>\n\n#include \"IsThread.h\"\n#include \"Queue.h\"\n\n\n\n\n\nclass cNetworkLookup :\n\tpublic cIsThread\n{\npublic:\n\n\tcNetworkLookup();\n\tvirtual ~cNetworkLookup() override;\n\n\t/** Schedule a lookup task for execution. */\n\tvoid ScheduleLookup(std::function<void()> a_Lookup);\n\n\t/** Cancels any scheduled lookups and joins the lookup thread. */\n\tvoid Stop();\n\nprotected:\n\n\t/** Process the queue until the thread is stopped. */\n\tvirtual void Execute() override final;\n\nprivate:\n\n\t/** The queue of lookup tasks waiting to be executed. */\n\tcQueue<std::function<void()>> m_WorkQueue;\n};\n\n\n"
  },
  {
    "path": "src/OSSupport/NetworkSingleton.cpp",
    "content": "\n// NetworkSingleton.cpp\n\n// Implements the cNetworkSingleton class representing the storage for global data pertaining to network API\n// such as a list of all connections, all listening sockets and the LibEvent dispatch thread.\n\n#include \"Globals.h\"\n#include \"NetworkSingleton.h\"\n#include \"Network.h\"\n#include <event2/thread.h>\n#include <event2/bufferevent.h>\n#include <event2/listener.h>\n\n\n\n\n\ncNetworkSingleton::cNetworkSingleton() :\n\tm_HasTerminated(true)\n{\n}\n\n\n\n\n\ncNetworkSingleton::~cNetworkSingleton() noexcept(false)\n{\n\t// Check that Terminate has been called already:\n\tASSERT(m_HasTerminated);\n}\n\n\n\n\n\ncNetworkSingleton & cNetworkSingleton::Get(void)\n{\n\tstatic cNetworkSingleton Instance;\n\treturn Instance;\n}\n\n\n\n\n\nvoid cNetworkSingleton::Initialise(void)\n{\n\t// Start the lookup thread\n\tm_LookupThread.Start();\n\n\t// Windows: initialize networking:\n\t#ifdef _WIN32\n\t\tWSADATA wsaData;\n\t\tmemset(&wsaData, 0, sizeof(wsaData));\n\t\tint res = WSAStartup (MAKEWORD(2, 2), &wsaData);\n\t\tif (res != 0)\n\t\t{\n\t\t\tint err = WSAGetLastError();\n\t\t\tLOGWARNING(\"WSAStartup failed: %d, WSAGLE = %d (%s)\", res, err, evutil_socket_error_to_string(err));\n\t\t\texit(1);\n\t\t}\n\t#endif  // _WIN32\n\n\t// Initialize LibEvent logging:\n\tevent_set_log_callback(LogCallback);\n\n\t// Initialize threading:\n\t#if defined(EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED)\n\t\tevthread_use_windows_threads();\n\t#elif defined(EVTHREAD_USE_PTHREADS_IMPLEMENTED)\n\t\tevthread_use_pthreads();\n\t#else\n\t\t#error No threading implemented for EVTHREAD\n\t#endif\n\n\t// Create the main event_base:\n\tevent_config * config = event_config_new();\n\tevent_config_set_flag(config, EVENT_BASE_FLAG_STARTUP_IOCP);\n\tm_EventBase = event_base_new_with_config(config);\n\tif (m_EventBase == nullptr)\n\t{\n\t\tLOGERROR(\"Failed to initialize LibEvent. The server will now terminate.\");\n\t\tabort();\n\t}\n\tevent_config_free(config);\n\n\t// Create the event loop thread:\n\tm_HasTerminated = false;\n\tm_EventLoopThread = std::thread(RunEventLoop, this);\n\tm_StartupEvent.Wait();  // Wait for the LibEvent loop to actually start running (otherwise calling Terminate too soon would hang, see #3228)\n}\n\n\n\n\n\nvoid cNetworkSingleton::Terminate(void)\n{\n\tASSERT(!m_HasTerminated);\n\n\t// Wait for the lookup thread to stop\n\tm_LookupThread.Stop();\n\n\t// Wait for the LibEvent event loop to terminate:\n\tevent_base_loopbreak(m_EventBase);\n\tm_EventLoopThread.join();\n\n\t// Close all open connections:\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\t// Must take copies because Close will modify lists\n\t\tauto Conns = m_Connections;\n\t\tfor (auto & Conn : Conns)\n\t\t{\n\t\t\tConn->Close();\n\t\t}\n\n\t\tauto Servers = m_Servers;\n\t\tfor (auto & Server : Servers)\n\t\t{\n\t\t\tServer->Close();\n\t\t}\n\n\t\t// Closed handles should have removed themself\n\t\tASSERT(m_Connections.empty());\n\t\tASSERT(m_Servers.empty());\n\t}\n\n\t// Free the underlying LibEvent objects:\n\tevent_base_free(m_EventBase);\n\n\tlibevent_global_shutdown();\n\n\t// Set the HasTerminated flag:\n\t// (Only set the flag after everything has been removed, to avoid the random failures in the Google-test, caused by links terminating after this flag was set)\n\tm_HasTerminated = true;\n}\n\n\n\n\n\nvoid cNetworkSingleton::LogCallback(int a_Severity, const char * a_Msg)\n{\n\tswitch (a_Severity)\n\t{\n\t\tcase _EVENT_LOG_DEBUG: LOGD      (\"LibEvent: %s\", a_Msg); break;\n\t\tcase _EVENT_LOG_MSG:   LOG       (\"LibEvent: %s\", a_Msg); break;\n\t\tcase _EVENT_LOG_WARN:  LOGWARNING(\"LibEvent: %s\", a_Msg); break;\n\t\tcase _EVENT_LOG_ERR:   LOGERROR  (\"LibEvent: %s\", a_Msg); break;\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"LibEvent: Unknown log severity (%d): %s\", a_Severity, a_Msg);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cNetworkSingleton::RunEventLoop(cNetworkSingleton * a_Self)\n{\n\tauto timer = evtimer_new(a_Self->m_EventBase, SignalizeStartup, a_Self);\n\ttimeval timeout{};  // Zero timeout - execute immediately\n\tevtimer_add(timer, &timeout);\n\tevent_base_loop(a_Self->m_EventBase, EVLOOP_NO_EXIT_ON_EMPTY);\n\tevent_free(timer);\n}\n\n\n\n\n\nvoid cNetworkSingleton::SignalizeStartup(evutil_socket_t a_Socket, short a_Events, void * a_Self)\n{\n\tauto self = static_cast<cNetworkSingleton *>(a_Self);\n\tASSERT(self != nullptr);\n\tself->m_StartupEvent.Set();\n}\n\n\n\n\n\nvoid cNetworkSingleton::AddLink(const cTCPLinkPtr & a_Link)\n{\n\tASSERT(!m_HasTerminated);\n\tcCSLock Lock(m_CS);\n\tm_Connections.push_back(a_Link);\n}\n\n\n\n\n\nvoid cNetworkSingleton::RemoveLink(const cTCPLink * a_Link)\n{\n\tASSERT(!m_HasTerminated);\n\tcCSLock Lock(m_CS);\n\tfor (auto itr = m_Connections.begin(), end = m_Connections.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->get() == a_Link)\n\t\t{\n\t\t\tm_Connections.erase(itr);\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_Connections[]\n}\n\n\n\n\n\nvoid cNetworkSingleton::AddServer(const cServerHandlePtr & a_Server)\n{\n\tASSERT(!m_HasTerminated);\n\tcCSLock Lock(m_CS);\n\tm_Servers.push_back(a_Server);\n}\n\n\n\n\n\nvoid cNetworkSingleton::RemoveServer(const cServerHandle * a_Server)\n{\n\tASSERT(!m_HasTerminated);\n\tcCSLock Lock(m_CS);\n\tfor (auto itr = m_Servers.begin(), end = m_Servers.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->get() == a_Server)\n\t\t{\n\t\t\tm_Servers.erase(itr);\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_Servers[]\n}\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/NetworkSingleton.h",
    "content": "\n// NetworkSingleton.h\n\n// Declares the cNetworkSingleton class representing the storage for global data pertaining to network API\n// such as a list of all connections, all listening sockets and the LibEvent dispatch thread.\n\n// This is an internal header, no-one outside OSSupport should need to include it; use Network.h instead;\n// the only exception being the main app entrypoint that needs to call Terminate before quitting.\n\n\n\n\n\n#pragma once\n\n#include <event2/event.h>\n#include \"NetworkLookup.h\"\n#include \"CriticalSection.h\"\n#include \"Event.h\"\n\n\n\n\n\n// fwd:\nstruct event_base;\nclass cTCPLink;\ntypedef std::shared_ptr<cTCPLink> cTCPLinkPtr;\ntypedef std::vector<cTCPLinkPtr> cTCPLinkPtrs;\nclass cServerHandle;\ntypedef std::shared_ptr<cServerHandle> cServerHandlePtr;\ntypedef std::vector<cServerHandlePtr> cServerHandlePtrs;\n\n\n\n\n\nclass cNetworkSingleton\n{\npublic:\n\tcNetworkSingleton();\n\t~cNetworkSingleton() noexcept(false);\n\n\t/** Returns the singleton instance of this class */\n\tstatic cNetworkSingleton & Get(void);\n\n\t/** Initialises all network-related threads.\n\tTo be called on first run or after app restart. */\n\tvoid Initialise(void);\n\n\t/** Terminates all network-related threads.\n\tTo be used only on app shutdown or restart.\n\tMSVC runtime requires that the LibEvent networking be shut down before the main() function is exitted; this is the way to do it. */\n\tvoid Terminate(void);\n\n\t/** Returns the main LibEvent handle for event registering. */\n\tevent_base * GetEventBase(void) { return m_EventBase; }\n\n\t/** Returns the thread used to perform hostname and IP lookups */\n\tcNetworkLookup & GetLookupThread() { return m_LookupThread; }\n\n\t/** Adds the specified link to m_Connections.\n\tUsed by the underlying link implementation when a new link is created. */\n\tvoid AddLink(const cTCPLinkPtr & a_Link);\n\n\t/** Removes the specified link from m_Connections.\n\tUsed by the underlying link implementation when the link is closed / errored. */\n\tvoid RemoveLink(const cTCPLink * a_Link);\n\n\t/** Adds the specified link to m_Servers.\n\tUsed by the underlying server handle implementation when a new listening server is created.\n\tOnly servers that succeed in listening are added. */\n\tvoid AddServer(const cServerHandlePtr & a_Server);\n\n\t/** Removes the specified server from m_Servers.\n\tUsed by the underlying server handle implementation when the server is closed. */\n\tvoid RemoveServer(const cServerHandle * a_Server);\n\nprotected:\n\n\t/** The main LibEvent container for driving the event loop. */\n\tevent_base * m_EventBase;\n\n\t/** Container for all client connections, including ones with pending-connect. */\n\tcTCPLinkPtrs m_Connections;\n\n\t/** Container for all servers that are currently active. */\n\tcServerHandlePtrs m_Servers;\n\n\t/** Mutex protecting all containers against multithreaded access. */\n\tcCriticalSection m_CS;\n\n\t/** Set to true if Terminate has been called. */\n\tstd::atomic<bool> m_HasTerminated;\n\n\t/** The thread in which the main LibEvent loop runs. */\n\tstd::thread m_EventLoopThread;\n\n\t/** Event that is signalled once the startup is finished and the LibEvent loop is running. */\n\tcEvent m_StartupEvent;\n\n\t/** The thread on which hostname and ip address lookup is performed. */\n\tcNetworkLookup m_LookupThread;\n\n\n\t/** Converts LibEvent-generated log events into log messages in MCS log. */\n\tstatic void LogCallback(int a_Severity, const char * a_Msg);\n\n\t/** Implements the thread that runs LibEvent's event dispatcher loop. */\n\tstatic void RunEventLoop(cNetworkSingleton * a_Self);\n\n\t/** Callback called by LibEvent when the event loop is started. */\n\tstatic void SignalizeStartup(evutil_socket_t a_Socket, short a_Events, void * a_Self);\n};\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/Queue.h",
    "content": "\n// Queue.h\n\n// Implements the cQueue class representing a thread safe queue\n\n#pragma once\n\n/*\nItems can be added multiple times to a queue, there are two functions for\nadding, EnqueueItem() and EnqueueItemIfNotPresent(). The first one always\nenqueues the specified item, the second one checks if the item is already\npresent and only queues it if it isn't.\n\nUsage:\nTo create a queue of type T, instantiate a cQueue<T> object. You can also\nmodify the behavior of the queue when deleting items and when adding items\nthat are already in the queue by providing a second parameter, a class that\nimplements the functions Delete() and Combine(). An example is given in\ncQueueFuncs and is used as the default behavior. */\n\n/** This empty struct allows for the callback functions to be inlined */\ntemplate <class T>\nstruct cQueueFuncs\n{\npublic:\n\n\t/** Called when an Item is deleted from the queue without being returned */\n\tstatic void Delete(T) {}\n\n\t/** Called when an Item is inserted with EnqueueItemIfNotPresent and there is another equal value already inserted */\n\tstatic void Combine(T & a_existing, const T & a_new)\n\t{\n\t\tUNUSED(a_existing);\n\t\tUNUSED(a_new);\n\t}\n};\n\n\n\n\n\ntemplate <class ItemType, class Funcs = cQueueFuncs<ItemType> >\nclass cQueue\n{\n\t// The actual storage type for the queue\n\ttypedef typename std::list<ItemType> QueueType;\n\n\t// Make iterator an alias for the QueueType's iterator\n\ttypedef typename QueueType::iterator iterator;\n\npublic:\n\tcQueue() {}\n\t~cQueue() {}\n\n\n\t/** Enqueues an item to the queue, may block if other threads are accessing the queue. */\n\tvoid EnqueueItem(ItemType a_Item)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tm_Contents.push_back(a_Item);\n\t\tm_evtAdded.Set();\n\t}\n\n\n\t/** Enqueues an item in the queue if not already present (as determined by operator ==). Blocks other threads from accessing the queue. */\n\tvoid EnqueueItemIfNotPresent(ItemType a_Item)\n\t{\n\t\tcCSLock Lock(m_CS);\n\n\t\tfor (iterator itr = m_Contents.begin(); itr != m_Contents.end(); ++itr)\n\t\t{\n\t\t\tif ((*itr) == a_Item)\n\t\t\t{\n\t\t\t\tFuncs::Combine(*itr, a_Item);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tm_Contents.push_back(a_Item);\n\t\tm_evtAdded.Set();\n\t}\n\n\n\t/** Dequeues an item from the queue if any are present.\n\tReturns true if successful. Value of item is undefined if dequeuing was unsuccessful. */\n\tbool TryDequeueItem(ItemType & item)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tif (m_Contents.empty())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\titem = m_Contents.front();\n\t\tm_Contents.pop_front();\n\t\tm_evtRemoved.Set();\n\t\treturn true;\n\t}\n\n\n\t/** Dequeues an item from the queue, blocking until an item is available. */\n\tItemType DequeueItem(void)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\twhile (m_Contents.empty())\n\t\t{\n\t\t\tcCSUnlock Unlock(Lock);\n\t\t\tm_evtAdded.Wait();\n\t\t}\n\t\tItemType item = m_Contents.front();\n\t\tm_Contents.pop_front();\n\t\tm_evtRemoved.Set();\n\t\treturn item;\n\t}\n\n\n\t/** Blocks until the queue is empty. */\n\tvoid BlockTillEmpty(void)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\twhile (!m_Contents.empty())\n\t\t{\n\t\t\tcCSUnlock Unlock(Lock);\n\t\t\tm_evtRemoved.Wait();\n\t\t}\n\t}\n\n\n\t/** Removes all Items from the Queue, calling Delete on each of them. */\n\tvoid Clear(void)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\twhile (!m_Contents.empty())\n\t\t{\n\t\t\tFuncs::Delete(m_Contents.front());\n\t\t\tm_Contents.pop_front();\n\t\t}\n\t}\n\n\n\t/** Returns the size at time of being called.\n\tDo not use to determine whether to call DequeueItem(), use TryDequeueItem() instead */\n\tsize_t Size(void)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\treturn m_Contents.size();\n\t}\n\n\n\t/** Removes the item from the queue. If there are multiple such items, only the first one is removed.\n\tReturns true if the item has been removed, false if no such item found. */\n\tbool Remove(ItemType a_Item)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tfor (iterator itr = m_Contents.begin(); itr != m_Contents.end(); ++itr)\n\t\t{\n\t\t\tif ((*itr) == a_Item)\n\t\t\t{\n\t\t\t\tm_Contents.erase(itr);\n\t\t\t\tm_evtRemoved.Set();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\n\t/** Removes all items for which the predicate returns true. */\n\ttemplate <class Predicate>\n\tvoid RemoveIf(Predicate a_Predicate)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tfor (auto itr = m_Contents.begin(); itr != m_Contents.end();)\n\t\t{\n\t\t\tif (a_Predicate(*itr))\n\t\t\t{\n\t\t\t\tauto itr2 = itr;\n\t\t\t\t++itr2;\n\t\t\t\tm_Contents.erase(itr);\n\t\t\t\tm_evtRemoved.Set();\n\t\t\t\titr = itr2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++itr;\n\t\t\t}\n\t\t}  // for itr - m_Contents[]\n\t}\n\nprivate:\n\t/** The contents of the queue */\n\tQueueType m_Contents;\n\n\t/** Mutex that protects access to the queue contents */\n\tcCriticalSection m_CS;\n\n\t/** Event that is signalled when an item is added */\n\tcEvent m_evtAdded;\n\n\t/** Event that is signalled when an item is removed (both dequeued or erased) */\n\tcEvent m_evtRemoved;\n};\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/ServerHandleImpl.cpp",
    "content": "\n// ServerHandleImpl.cpp\n\n// Implements the cServerHandleImpl class implementing the TCP server functionality\n\n#include \"Globals.h\"\n#include \"ServerHandleImpl.h\"\n#include \"TCPLinkImpl.h\"\n#include \"NetworkSingleton.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Globals:\n\nnamespace ServerHandleImplHelper\n{\n\tstatic bool IsValidSocket(evutil_socket_t a_Socket)\n\t{\n#ifdef _WIN32\n\t\treturn (a_Socket != INVALID_SOCKET);\n#else  // _WIN32\n\t\treturn (a_Socket >= 0);\n#endif  // else _WIN32\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cServerHandleImpl:\n\ncServerHandleImpl::cServerHandleImpl(cNetwork::cListenCallbacksPtr a_ListenCallbacks):\n\tm_ListenCallbacks(std::move(a_ListenCallbacks)),\n\tm_ConnListener(nullptr),\n\tm_SecondaryConnListener(nullptr),\n\tm_IsListening(false),\n\tm_ErrorCode(0)\n{\n}\n\n\n\n\n\ncServerHandleImpl::~cServerHandleImpl()\n{\n\tif (m_ConnListener != nullptr)\n\t{\n\t\tevconnlistener_free(m_ConnListener);\n\t}\n\tif (m_SecondaryConnListener != nullptr)\n\t{\n\t\tevconnlistener_free(m_SecondaryConnListener);\n\t}\n}\n\n\n\n\n\nvoid cServerHandleImpl::Close(void)\n{\n\t// Stop the listener sockets:\n\tif (m_ConnListener != nullptr)\n\t{\n\t\tevconnlistener_disable(m_ConnListener);\n\t}\n\tif (m_SecondaryConnListener != nullptr)\n\t{\n\t\tevconnlistener_disable(m_SecondaryConnListener);\n\t}\n\tm_IsListening = false;\n\n\t// Shutdown all connections:\n\tcTCPLinkImplPtrs Conns;\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tstd::swap(Conns, m_Connections);\n\t}\n\tfor (const auto & conn: Conns)\n\t{\n\t\tconn->Shutdown();\n\t}\n\n\t// Remove the ptr to self, so that the object may be freed:\n\tm_SelfPtr.reset();\n\n\t// Remove self from cNetworkSingleton:\n\tcNetworkSingleton::Get().RemoveServer(this);\n}\n\n\n\n\n\ncServerHandleImplPtr cServerHandleImpl::Listen(\n\tUInt16 a_Port,\n\tcNetwork::cListenCallbacksPtr a_ListenCallbacks\n)\n{\n\tcServerHandleImplPtr res{new cServerHandleImpl(std::move(a_ListenCallbacks))};\n\tres->m_SelfPtr = res;\n\tif (res->Listen(a_Port))\n\t{\n\t\tcNetworkSingleton::Get().AddServer(res);\n\t}\n\telse\n\t{\n\t\tres->m_ListenCallbacks->OnError(res->m_ErrorCode, res->m_ErrorMsg);\n\t\tres->m_SelfPtr.reset();\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool cServerHandleImpl::Listen(UInt16 a_Port)\n{\n\t// Make sure the cNetwork internals are innitialized:\n\tcNetworkSingleton::Get();\n\n\t// Set up the main socket:\n\t// It should listen on IPv6 with IPv4 fallback, when available; IPv4 when IPv6 is not available.\n\tbool NeedsTwoSockets = false;\n\tint err = 0;\n\tevutil_socket_t MainSock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);\n\n\tif (!ServerHandleImplHelper::IsValidSocket(MainSock))\n\t{\n\t\t// Failed to create IPv6 socket, create an IPv4 one instead:\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"Failed to create IPv6 MainSock: %d (%s)\", err, evutil_socket_error_to_string(err));\n\t\tMainSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n\t\tif (!ServerHandleImplHelper::IsValidSocket(MainSock))\n\t\t{\n\t\t\tm_ErrorCode = EVUTIL_SOCKET_ERROR();\n\t\t\tm_ErrorMsg = fmt::format(FMT_STRING(\"Cannot create a server socket for port {}: {} ({})\"),\n\t\t\t\ta_Port, m_ErrorCode, evutil_socket_error_to_string(m_ErrorCode)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Allow the port to be reused right after the socket closes:\n\t\tif (evutil_make_listen_socket_reuseable(MainSock) != 0)\n\t\t{\n\t\t\tm_ErrorCode = EVUTIL_SOCKET_ERROR();\n\t\t\tm_ErrorMsg = fmt::format(FMT_STRING(\"Port {} cannot be made reusable: {} ({}). Restarting the server might not work.\"),\n\t\t\t\ta_Port, m_ErrorCode, evutil_socket_error_to_string(m_ErrorCode)\n\t\t\t);\n\t\t\tLOG(\"%s\", m_ErrorMsg);\n\t\t}\n\n\t\t// Bind to all interfaces:\n\t\tsockaddr_in name;\n\t\tmemset(&name, 0, sizeof(name));\n\t\tname.sin_family = AF_INET;\n\t\tname.sin_port = ntohs(a_Port);\n\t\tif (bind(MainSock, reinterpret_cast<const sockaddr *>(&name), sizeof(name)) != 0)\n\t\t{\n\t\t\tm_ErrorCode = EVUTIL_SOCKET_ERROR();\n\t\t\tm_ErrorMsg = fmt::format(FMT_STRING(\"Cannot bind IPv4 socket to port {}: {} ({})\"),\n\t\t\t\ta_Port, m_ErrorCode, evutil_socket_error_to_string(m_ErrorCode)\n\t\t\t);\n\t\t\tevutil_closesocket(MainSock);\n\t\t\treturn false;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// IPv6 socket created, switch it into \"dualstack\" mode:\n\t\tUInt32 Zero = 0;\n\t\t#ifdef _WIN32\n\t\t\t// WinXP doesn't support this feature, so if the setting fails, create another socket later on:\n\t\t\tint res = setsockopt(MainSock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<const char *>(&Zero), sizeof(Zero));\n\t\t\terr = EVUTIL_SOCKET_ERROR();\n\t\t\tNeedsTwoSockets = ((res == SOCKET_ERROR) && (err == WSAENOPROTOOPT));\n\t\t#else\n\t\t\tsetsockopt(MainSock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<const char *>(&Zero), sizeof(Zero));\n\t\t#endif\n\n\t\t// Allow the port to be reused right after the socket closes:\n\t\tif (evutil_make_listen_socket_reuseable(MainSock) != 0)\n\t\t{\n\t\t\tm_ErrorCode = EVUTIL_SOCKET_ERROR();\n\t\t\tm_ErrorMsg = fmt::format(FMT_STRING(\"Port {} cannot be made reusable: {} ({}). Restarting the server might not work.\"),\n\t\t\t\ta_Port, m_ErrorCode, evutil_socket_error_to_string(m_ErrorCode)\n\t\t\t);\n\t\t\tLOG(\"%s\", m_ErrorMsg);\n\t\t}\n\n\t\t// Bind to all interfaces:\n\t\tsockaddr_in6 name;\n\t\tmemset(&name, 0, sizeof(name));\n\t\tname.sin6_family = AF_INET6;\n\t\tname.sin6_port = ntohs(a_Port);\n\t\tif (bind(MainSock, reinterpret_cast<const sockaddr *>(&name), sizeof(name)) != 0)\n\t\t{\n\t\t\tm_ErrorCode = EVUTIL_SOCKET_ERROR();\n\t\t\tm_ErrorMsg = fmt::format(FMT_STRING(\"Cannot bind IPv6 socket to port {}: {} ({})\"), a_Port, m_ErrorCode, evutil_socket_error_to_string(m_ErrorCode));\n\t\t\tevutil_closesocket(MainSock);\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (evutil_make_socket_nonblocking(MainSock) != 0)\n\t{\n\t\tm_ErrorCode = EVUTIL_SOCKET_ERROR();\n\t\tm_ErrorMsg = fmt::format(FMT_STRING(\"Cannot make socket on port {} non-blocking: {} ({})\"), a_Port, m_ErrorCode, evutil_socket_error_to_string(m_ErrorCode));\n\t\tevutil_closesocket(MainSock);\n\t\treturn false;\n\t}\n\tif (listen(MainSock, SOMAXCONN) != 0)\n\t{\n\t\tm_ErrorCode = EVUTIL_SOCKET_ERROR();\n\t\tm_ErrorMsg = fmt::format(FMT_STRING(\"Cannot listen on port {}: {} ({})\"), a_Port, m_ErrorCode, evutil_socket_error_to_string(m_ErrorCode));\n\t\tevutil_closesocket(MainSock);\n\t\treturn false;\n\t}\n\tm_ConnListener = evconnlistener_new(cNetworkSingleton::Get().GetEventBase(), Callback, this, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, 0, MainSock);\n\tm_IsListening = true;\n\n\tif (!NeedsTwoSockets)\n\t{\n\t\treturn true;\n\t}\n\n\t// If a secondary socket is required (WinXP dual-stack), create it here:\n\tLOGD(\"Creating a second socket for IPv4\");\n\tevutil_socket_t SecondSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n\n\tif (!ServerHandleImplHelper::IsValidSocket(SecondSock))\n\t{\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"socket(AF_INET, ...) failed for secondary socket: %d, %s\", err, evutil_socket_error_to_string(err));\n\t\treturn true;  // Report as success, the primary socket is working\n\t}\n\n\t// Allow the port to be reused right after the socket closes:\n\tif (evutil_make_listen_socket_reuseable(SecondSock) != 0)\n\t{\n\t\tm_ErrorCode = EVUTIL_SOCKET_ERROR();\n\t\tm_ErrorMsg = fmt::format(FMT_STRING(\"Port {} cannot be made reusable (second socket): {} ({}). Restarting the server might not work.\"),\n\t\t\ta_Port, m_ErrorCode, evutil_socket_error_to_string(m_ErrorCode)\n\t\t);\n\t\tLOG(\"%s\", m_ErrorMsg);\n\t}\n\n\t// Make the secondary socket nonblocking:\n\tif (evutil_make_socket_nonblocking(SecondSock) != 0)\n\t{\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"evutil_make_socket_nonblocking() failed for secondary socket: %d, %s\", err, evutil_socket_error_to_string(err));\n\t\tevutil_closesocket(SecondSock);\n\t\treturn true;  // Report as success, the primary socket is working\n\t}\n\n\t// Bind to all IPv4 interfaces:\n\tsockaddr_in name;\n\tmemset(&name, 0, sizeof(name));\n\tname.sin_family = AF_INET;\n\tname.sin_port = ntohs(a_Port);\n\tif (bind(SecondSock, reinterpret_cast<const sockaddr *>(&name), sizeof(name)) != 0)\n\t{\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"Cannot bind secondary socket to port %d: %d (%s)\", a_Port, err, evutil_socket_error_to_string(err));\n\t\tevutil_closesocket(SecondSock);\n\t\treturn true;  // Report as success, the primary socket is working\n\t}\n\n\tif (listen(SecondSock, SOMAXCONN) != 0)\n\t{\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"Cannot listen on secondary socket on port %d: %d (%s)\", a_Port, err, evutil_socket_error_to_string(err));\n\t\tevutil_closesocket(SecondSock);\n\t\treturn true;  // Report as success, the primary socket is working\n\t}\n\n\tUNUSED(err);\n\n\tm_SecondaryConnListener = evconnlistener_new(cNetworkSingleton::Get().GetEventBase(), Callback, this, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, 0, SecondSock);\n\treturn true;\n}\n\n\n\n\n\nvoid cServerHandleImpl::Callback(evconnlistener * a_Listener, evutil_socket_t a_Socket, sockaddr * a_Addr, int a_Len, void * a_Self)\n{\n\t// Cast to true self:\n\tcServerHandleImpl * Self = static_cast<cServerHandleImpl *>(a_Self);\n\tASSERT(Self != nullptr);\n\tASSERT(Self->m_SelfPtr != nullptr);\n\n\t// Get the textual IP address and port number out of a_Addr:\n\tchar IPAddress[128];\n\tUInt16 Port = 0;\n\tswitch (a_Addr->sa_family)\n\t{\n\t\tcase AF_INET:\n\t\t{\n\t\t\tsockaddr_in * sin = reinterpret_cast<sockaddr_in *>(a_Addr);\n\t\t\tevutil_inet_ntop(AF_INET, &(sin->sin_addr), IPAddress, ARRAYCOUNT(IPAddress));\n\t\t\tPort = ntohs(sin->sin_port);\n\t\t\tbreak;\n\t\t}\n\t\tcase AF_INET6:\n\t\t{\n\t\t\tsockaddr_in6 * sin6 = reinterpret_cast<sockaddr_in6 *>(a_Addr);\n\t\t\tevutil_inet_ntop(AF_INET6, &(sin6->sin6_addr), IPAddress, ARRAYCOUNT(IPAddress));\n\t\t\tPort = ntohs(sin6->sin6_port);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Call the OnIncomingConnection callback to get the link callbacks to use:\n\tcTCPLink::cCallbacksPtr LinkCallbacks = Self->m_ListenCallbacks->OnIncomingConnection(IPAddress, Port);\n\tif (LinkCallbacks == nullptr)\n\t{\n\t\t// Drop the connection:\n\t\tevutil_closesocket(a_Socket);\n\t\treturn;\n\t}\n\n\tconst int one = 1;\n\tsetsockopt(a_Socket, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<const char *>(&one), sizeof(one));\n\n\t// Create a new cTCPLink for the incoming connection:\n\tcTCPLinkImplPtr Link = std::make_shared<cTCPLinkImpl>(a_Socket, LinkCallbacks, Self->m_SelfPtr, a_Addr, static_cast<socklen_t>(a_Len));\n\t{\n\t\tcCSLock Lock(Self->m_CS);\n\t\tSelf->m_Connections.push_back(Link);\n\t}  // Lock(m_CS)\n\tLinkCallbacks->OnLinkCreated(Link);\n\tLink->Enable(Link);\n\n\t// Call the OnAccepted callback:\n\tSelf->m_ListenCallbacks->OnAccepted(*Link);\n}\n\n\n\n\n\nvoid cServerHandleImpl::RemoveLink(const cTCPLinkImpl * a_Link)\n{\n\tcCSLock Lock(m_CS);\n\tfor (auto itr = m_Connections.begin(), end = m_Connections.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->get() == a_Link)\n\t\t{\n\t\t\tm_Connections.erase(itr);\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_Connections[]\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNetwork API:\n\ncServerHandlePtr cNetwork::Listen(\n\tUInt16 a_Port,\n\tcNetwork::cListenCallbacksPtr a_ListenCallbacks\n)\n{\n\treturn cServerHandleImpl::Listen(a_Port, std::move(a_ListenCallbacks));\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/ServerHandleImpl.h",
    "content": "\n// ServerHandleImpl.h\n\n// Declares the cServerHandleImpl class implementing the TCP server functionality\n\n// This is an internal header, no-one outside OSSupport should need to include it; use Network.h instead\n\n\n\n\n\n#pragma once\n\n#include \"Network.h\"\n#include <event2/listener.h>\n#include \"CriticalSection.h\"\n\n\n\n\n\n// fwd:\nclass cTCPLinkImpl;\ntypedef std::shared_ptr<cTCPLinkImpl> cTCPLinkImplPtr;\ntypedef std::vector<cTCPLinkImplPtr> cTCPLinkImplPtrs;\nclass cServerHandleImpl;\ntypedef std::shared_ptr<cServerHandleImpl> cServerHandleImplPtr;\ntypedef std::vector<cServerHandleImplPtr> cServerHandleImplPtrs;\n\n\n\n\n\nclass cServerHandleImpl:\n\tpublic cServerHandle\n{\n\tusing Super = cServerHandle;\n\tfriend class cTCPLinkImpl;\n\npublic:\n\n\t/** Closes the server, dropping all the connections. */\n\tvirtual ~cServerHandleImpl() override;\n\n\t/** Creates a new server instance listening on the specified port.\n\tBoth IPv4 and IPv6 interfaces are used, if possible.\n\tAlways returns a server instance; in the event of a failure, the instance holds the error details. Use IsListening() to query success. */\n\tstatic cServerHandleImplPtr Listen(\n\t\tUInt16 a_Port,\n\t\tcNetwork::cListenCallbacksPtr a_ListenCallbacks\n\t);\n\n\t// cServerHandle overrides:\n\tvirtual void Close(void) override;\n\tvirtual bool IsListening(void) const override { return m_IsListening; }\n\nprotected:\n\t/** The callbacks used to notify about incoming connections. */\n\tcNetwork::cListenCallbacksPtr m_ListenCallbacks;\n\n\t/** The LibEvent handle representing the main listening socket. */\n\tevconnlistener * m_ConnListener;\n\n\t/** The LibEvent handle representing the secondary listening socket (only when side-by-side listening is needed, such as WinXP). */\n\tevconnlistener * m_SecondaryConnListener;\n\n\t/** Set to true when the server is initialized successfully and is listening for incoming connections. */\n\tbool m_IsListening;\n\n\t/** Container for all currently active connections on this server. */\n\tcTCPLinkImplPtrs m_Connections;\n\n\t/** Mutex protecting m_Connections againt multithreaded access. */\n\tcCriticalSection m_CS;\n\n\t/** Contains the error code for the failure to listen. Only valid for non-listening instances. */\n\tint m_ErrorCode;\n\n\t/** Contains the error message for the failure to listen. Only valid for non-listening instances. */\n\tAString m_ErrorMsg;\n\n\t/** The SharedPtr to self, so that it can be passed to created links. */\n\tcServerHandleImplPtr m_SelfPtr;\n\n\n\n\t/** Creates a new instance with the specified callbacks.\n\tInitializes the internals, but doesn't start listening yet. */\n\tcServerHandleImpl(cNetwork::cListenCallbacksPtr a_ListenCallbacks);\n\n\t/** Starts listening on the specified port.\n\tReturns true if successful, false on failure. On failure, sets m_ErrorCode and m_ErrorMsg. */\n\tbool Listen(UInt16 a_Port);\n\n\t/** The callback called by LibEvent upon incoming connection. */\n\tstatic void Callback(evconnlistener * a_Listener, evutil_socket_t a_Socket, sockaddr * a_Addr, int a_Len, void * a_Self);\n\n\t/** Removes the specified link from m_Connections.\n\tCalled by cTCPLinkImpl when the link is terminated. */\n\tvoid RemoveLink(const cTCPLinkImpl * a_Link);\n};\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/SleepResolutionBooster.h",
    "content": "\n// SleepResolutionBooster.h\n\n// Increases the accuracy of Sleep on Windows (GH #5140).\n\n// This file MUST NOT be included from anywhere other than main.cpp.\n\n\n\n\n\n#ifdef _WIN32\n\n#include <timeapi.h>\n\n\n\n\n\nstatic TIMECAPS g_Resolution;\n\n\n\n\n\nnamespace SleepResolutionBooster\n{\n\tstatic void Register()\n\t{\n\t\t// Default sleep resolution on Windows isn't accurate enough (GH #5140) so try to boost it:\n\t\tif (\n\t\t\t(timeGetDevCaps(&g_Resolution, sizeof(g_Resolution)) == MMSYSERR_NOERROR) &&\n\t\t\t(timeBeginPeriod(g_Resolution.wPeriodMin) == MMSYSERR_NOERROR)\n\t\t)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Max < Min sentinel for failure, to prevent bogus timeEndPeriod calls:\n\t\tg_Resolution.wPeriodMax = 0;\n\t\tg_Resolution.wPeriodMin = 1;\n\t}\n\n\tstatic void Unregister()\n\t{\n\t\tif (g_Resolution.wPeriodMax >= g_Resolution.wPeriodMin)\n\t\t{\n\t\t\ttimeEndPeriod(g_Resolution.wPeriodMin);\n\t\t}\n\t}\n};\n\n#else\n\nnamespace SleepResolutionBooster\n{\n\tstatic void Register()\n\t{\n\t}\n\n\tstatic void Unregister()\n\t{\n\t}\n};\n\n#endif\n"
  },
  {
    "path": "src/OSSupport/StackTrace.cpp",
    "content": "\n// StackTrace.cpp\n\n// Implements the functions to print current stack traces\n\n#include \"Globals.h\"\n#include \"StackTrace.h\"\n#ifdef _WIN32\n\t#include \"WinStackWalker.h\"\n#else\n\t#ifdef __GLIBC__\n\t\t#include <execinfo.h>\n\t#endif\n\t#include <unistd.h>\n#endif\n\n\n\n\n\nvoid PrintStackTrace(void)\n{\n\t#ifdef _WIN32\n\t\tclass PrintingStackWalker:\n\t\t\tpublic WinStackWalker\n\t\t{\n\t\t\tvirtual void OnOutput(LPCSTR szText) override\n\t\t\t{\n\t\t\t\tstd::fputs(szText, stdout);\n\t\t\t}\n\t\t} sw;\n\t\tsw.ShowCallstack();\n\t#else\n\t\t#ifdef __GLIBC__\n\t\t\t// Use the backtrace() function to get and output the stackTrace:\n\t\t\t// Code adapted from https://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes\n\t\t\tvoid * stackTrace[30];\n\t\t\tauto numItems = backtrace(stackTrace, ARRAYCOUNT(stackTrace));\n\t\t\tbacktrace_symbols_fd(stackTrace, numItems, STDERR_FILENO);\n\t\t#endif\n\t#endif\n}\n"
  },
  {
    "path": "src/OSSupport/StackTrace.h",
    "content": "\n// StackTrace.h\n\n// Declares the functions to print current stack trace\n\n\n\n\n\n/** Prints the stacktrace for the current thread. */\nextern void PrintStackTrace(void);\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/StartAsService.h",
    "content": "\n// StartAsService.h\n\n// Handles startup as a Windows Service or UNIX daemon.\n\n// This file MUST NOT be included from anywhere other than main.cpp.\n\n\n\n\n\n#ifdef _WIN32\n\nclass StartAsService\n{\npublic:\n\n\t/** Make a Windows service. */\n\ttemplate <auto UniversalMain>\n\tstatic bool MakeIntoService()\n\t{\n\t\tSERVICE_TABLE_ENTRY ServiceTable[] =\n\t\t{\n\t\t\t{ g_ServiceName, (LPSERVICE_MAIN_FUNCTION)serviceMain<UniversalMain> },\n\t\t\t{ nullptr, nullptr }\n\t\t};\n\n\t\tif (StartServiceCtrlDispatcher(ServiceTable) == FALSE)\n\t\t{\n\t\t\tthrow std::system_error(GetLastError(), std::system_category());\n\t\t}\n\n\t\treturn true;\n\t}\n\nprivate:\n\n\t/** Set the internal status of the service */\n\tstatic void serviceSetState(DWORD acceptedControls, DWORD newState, DWORD exitCode)\n\t{\n\t\tSERVICE_STATUS serviceStatus = {};\n\t\tserviceStatus.dwCheckPoint = 0;\n\t\tserviceStatus.dwControlsAccepted = acceptedControls;\n\t\tserviceStatus.dwCurrentState = newState;\n\t\tserviceStatus.dwServiceSpecificExitCode = 0;\n\t\tserviceStatus.dwServiceType = SERVICE_WIN32;\n\t\tserviceStatus.dwWaitHint = 0;\n\t\tserviceStatus.dwWin32ExitCode = exitCode;\n\n\t\tif (SetServiceStatus(g_StatusHandle, &serviceStatus) == FALSE)\n\t\t{\n\t\t\tLOGERROR(\"SetServiceStatus() failed\\n\");\n\t\t}\n\t}\n\n\t/** Handle stop events from the Service Control Manager */\n\tstatic void WINAPI serviceCtrlHandler(DWORD CtrlCode)\n\t{\n\t\tif (CtrlCode == SERVICE_CONTROL_STOP)\n\t\t{\n\t\t\tstd::raise(SIGINT);\n\t\t\tserviceSetState(0, SERVICE_STOP_PENDING, 0);\n\t\t}\n\t}\n\n\t/* Startup logic for running as a service */\n\ttemplate <auto MainFunction>\n\tstatic void WINAPI serviceMain(DWORD argc, TCHAR *argv[])\n\t{\n\t\twchar_t applicationFilename[MAX_PATH];\n\t\twchar_t applicationDirectory[MAX_PATH];\n\n\t\t// Get this binary's file path:\n\t\tif (GetModuleFileName(nullptr, applicationFilename, std::size(applicationFilename)) == 0)\n\t\t{\n\t\t\tserviceSetState(0, SERVICE_STOPPED, GetLastError());\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto LastComponent = std::wcsrchr(applicationFilename, L'\\\\');\n\t\tif (LastComponent == nullptr)\n\t\t{\n\t\t\tserviceSetState(0, SERVICE_STOPPED, E_UNEXPECTED);\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto LengthToLastComponent = LastComponent - applicationFilename;\n\n\t\t// Strip off the filename, keep only the path:\n\t\tstd::wcsncpy(applicationDirectory, applicationFilename, LengthToLastComponent);\n\t\tapplicationDirectory[LengthToLastComponent] = L'\\0';  // Make sure new path is null terminated\n\n\t\t// Services are run by the SCM, and inherit its working directory - usually System32.\n\t\t// Set the working directory to the same location as the binary.\n\t\tif (SetCurrentDirectory(applicationDirectory) == FALSE)\n\t\t{\n\t\t\tserviceSetState(0, SERVICE_STOPPED, GetLastError());\n\t\t\treturn;\n\t\t}\n\n\n\t\tg_StatusHandle = RegisterServiceCtrlHandler(g_ServiceName, serviceCtrlHandler);\n\t\tif (g_StatusHandle == nullptr)\n\t\t{\n\t\t\tOutputDebugStringA(\"RegisterServiceCtrlHandler() failed\\n\");\n\t\t\tserviceSetState(0, SERVICE_STOPPED, GetLastError());\n\t\t\treturn;\n\t\t}\n\n\t\tserviceSetState(SERVICE_ACCEPT_STOP, SERVICE_RUNNING, 0);\n\n\t\tchar MultibyteArgV0[MAX_PATH];\n\t\tchar * MultibyteArgV[] = { MultibyteArgV0 };\n\n\t\tconst auto OutputSize = std::size(MultibyteArgV0);\n\t\tconst auto TranslateResult = std::wcstombs(MultibyteArgV0, argv[0], OutputSize);\n\n\t\tif (TranslateResult == static_cast<size_t>(-1))\n\t\t{\n\t\t\t// Translation failed entirely (!):\n\t\t\tMultibyteArgV0[0] = '\\0';\n\t\t}\n\t\telse if (TranslateResult == OutputSize)\n\t\t{\n\t\t\t// Output too small:\n\t\t\tMultibyteArgV0[OutputSize - 1] = '\\0';\n\t\t}\n\n\t\tconst auto Result = MainFunction(1, MultibyteArgV, true);\n\t\tconst auto Return = (Result == EXIT_SUCCESS) ? S_OK : E_FAIL;\n\n\t\tserviceSetState(0, SERVICE_STOPPED, Return);\n\t}\n\n\tstatic inline SERVICE_STATUS_HANDLE g_StatusHandle  = nullptr;\n\tstatic inline HANDLE                g_ServiceThread = INVALID_HANDLE_VALUE;\n\tstatic inline wchar_t               g_ServiceName[] = L\"Cuberite\";\n};\n\n#else\n\nstruct StartAsService\n{\n\t/** Make a UNIX daemon. */\n\ttemplate <auto>\n\tstatic bool MakeIntoService()\n\t{\n\t\tpid_t pid = fork();\n\n\t\t// fork() returns a negative value on error.\n\t\tif (pid < 0)\n\t\t{\n\t\t\tthrow std::system_error(errno, std::system_category());\n\t\t}\n\n\t\t// Check if we are the parent or child process. Parent stops here.\n\t\tif (pid > 0)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t//  Child process now goes quiet, running in the background.\n\t\tclose(STDIN_FILENO);\n\t\tclose(STDOUT_FILENO);\n\t\tclose(STDERR_FILENO);\n\n\t\treturn false;\n\t}\n};\n\n#endif\n"
  },
  {
    "path": "src/OSSupport/Stopwatch.h",
    "content": "\n// Stopwatch.h\n\n// Implements the cStopwatch class that measures and logs time between its creation and destruction\n\n\n\n\n\n#pragma once\n\n\n\n\n\nclass cStopwatch\n{\npublic:\n\tcStopwatch(const AString & a_Name):\n\t\tm_Name(a_Name),\n\t\tm_StartTime(std::chrono::high_resolution_clock::now())\n\t{\n\t}\n\n\t~cStopwatch()\n\t{\n\t\tauto duration = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - m_StartTime).count();\n\t\tLOG(\"Stopwatch: %s took %.03f sec\", m_Name, static_cast<double>(duration) / 1000);\n\t}\n\nprotected:\n\tAString m_Name;\n\tstd::chrono::high_resolution_clock::time_point m_StartTime;\n};\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/TCPLinkImpl.cpp",
    "content": "\n// TCPLinkImpl.cpp\n\n// Implements the cTCPLinkImpl class implementing the TCP link functionality\n\n#include \"Globals.h\"\n#include \"TCPLinkImpl.h\"\n#include \"../mbedTLS++/SslConfig.h\"\n#include \"NetworkSingleton.h\"\n#include \"ServerHandleImpl.h\"\n#include \"event2/buffer.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cTCPLinkImpl:\n\ncTCPLinkImpl::cTCPLinkImpl(const std::string & a_Host, cTCPLink::cCallbacksPtr a_LinkCallbacks):\n\tSuper(std::move(a_LinkCallbacks)),\n\tm_BufferEvent(bufferevent_socket_new(cNetworkSingleton::Get().GetEventBase(), -1, BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE | BEV_OPT_DEFER_CALLBACKS | BEV_OPT_UNLOCK_CALLBACKS)),\n\tm_LocalPort(0),\n\tm_RemoteHost(a_Host),\n\tm_RemotePort(0),\n\tm_ShouldShutdown(false)\n{\n}\n\n\n\n\n\ncTCPLinkImpl::cTCPLinkImpl(\n\tevutil_socket_t a_Socket,\n\tcTCPLink::cCallbacksPtr a_LinkCallbacks,\n\tcServerHandleImplPtr a_Server,\n\tconst sockaddr * a_Address,\n\tsocklen_t a_AddrLen\n):\n\tSuper(std::move(a_LinkCallbacks)),\n\tm_BufferEvent(bufferevent_socket_new(cNetworkSingleton::Get().GetEventBase(), a_Socket, BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE | BEV_OPT_DEFER_CALLBACKS | BEV_OPT_UNLOCK_CALLBACKS)),\n\tm_Server(std::move(a_Server)),\n\tm_LocalPort(0),\n\tm_RemotePort(0),\n\tm_ShouldShutdown(false)\n{\n\t// Update the endpoint addresses:\n\tUpdateLocalAddress();\n\tUpdateAddress(a_Address, a_AddrLen, m_RemoteIP, m_RemotePort);\n}\n\n\n\n\n\ncTCPLinkImpl::~cTCPLinkImpl()\n{\n\t// If the TLS context still exists, free it:\n\tm_TlsContext.reset();\n\n\tbufferevent_free(m_BufferEvent);\n}\n\n\n\n\n\ncTCPLinkImplPtr cTCPLinkImpl::Connect(const AString & a_Host, UInt16 a_Port, cTCPLink::cCallbacksPtr a_LinkCallbacks, cNetwork::cConnectCallbacksPtr a_ConnectCallbacks)\n{\n\tASSERT(a_LinkCallbacks != nullptr);\n\tASSERT(a_ConnectCallbacks != nullptr);\n\n\t// Create a new link:\n\tcTCPLinkImplPtr res{new cTCPLinkImpl(a_Host, std::move(a_LinkCallbacks))};  // Cannot use std::make_shared here, constructor is not accessible\n\tres->m_ConnectCallbacks = std::move(a_ConnectCallbacks);\n\tcNetworkSingleton::Get().AddLink(res);\n\tres->m_Callbacks->OnLinkCreated(res);\n\tres->Enable(res);\n\n\t// Callback to connect after performing lookup:\n\tclass cHostnameCallback :\n\t\tpublic cNetwork::cResolveNameCallbacks\n\t{\n\t\tcTCPLinkImplPtr m_Link;\n\t\tUInt16 m_Port;\n\t\tbool m_IsConnecting;\n\n\tpublic:\n\n\t\tcHostnameCallback(cTCPLinkImplPtr a_Link, UInt16 a_ConnectPort):\n\t\t\tm_Link(std::move(a_Link)),\n\t\t\tm_Port(a_ConnectPort),\n\t\t\tm_IsConnecting(false)\n\t\t{\n\t\t}\n\n\t\tvoid DoConnect(const sockaddr * a_IP, int size)\n\t\t{\n\t\t\t// Make sure connect is only completed once\n\t\t\tif (!m_IsConnecting)\n\t\t\t{\n\t\t\t\tint ErrCode = bufferevent_socket_connect(m_Link->m_BufferEvent, a_IP, size);\n\t\t\t\tif (ErrCode == 0)\n\t\t\t\t{\n\t\t\t\t\tm_IsConnecting = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tm_Link->GetCallbacks()->OnError(ErrCode, evutil_socket_error_to_string(ErrCode));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvirtual bool OnNameResolvedV4(const AString & a_Name, const sockaddr_in * a_IP) override\n\t\t{\n\t\t\tsockaddr_in Addr = *a_IP;\n\t\t\tAddr.sin_port = htons(m_Port);\n\t\t\tDoConnect(reinterpret_cast<const sockaddr *>(&Addr), sizeof(Addr));\n\t\t\treturn false;  // Don't care about recieving ip as string\n\t\t}\n\n\t\tvirtual bool OnNameResolvedV6(const AString & a_Name, const sockaddr_in6 * a_IP) override\n\t\t{\n\t\t\tsockaddr_in6 Addr = *a_IP;\n\t\t\tAddr.sin6_port = htons(m_Port);\n\t\t\tDoConnect(reinterpret_cast<const sockaddr *>(&Addr), sizeof(Addr));\n\t\t\treturn false;  // Don't care about recieving ip as string\n\t\t}\n\n\t\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t\t{\n\t\t\tm_Link->GetCallbacks()->OnError(a_ErrorCode, a_ErrorMsg);\n\t\t\tcNetworkSingleton::Get().RemoveLink(m_Link.get());\n\t\t}\n\n\t\t// Don't need to do anything for these\n\t\tvirtual void OnFinished() override\n\t\t{\n\t\t}\n\n\t\tvirtual void OnNameResolved(const AString & a_Name, const AString & a_IP) override\n\t\t{\n\t\t}\n\t};\n\n\t// Schedule the host query\n\tcNetwork::HostnameToIP(a_Host, std::make_shared<cHostnameCallback>(res, a_Port));\n\treturn res;\n}\n\n\n\n\n\nvoid cTCPLinkImpl::Enable(cTCPLinkImplPtr a_Self)\n{\n\t// Take hold of a shared copy of self, to keep as long as the callbacks are coming:\n\tm_Self = std::move(a_Self);\n\n\t// Set the LibEvent callbacks and enable processing:\n\tbufferevent_setcb(m_BufferEvent, ReadCallback, WriteCallback, EventCallback, this);\n\tbufferevent_enable(m_BufferEvent, EV_READ | EV_WRITE);\n}\n\n\n\n\n\nbool cTCPLinkImpl::Send(const void * a_Data, size_t a_Length)\n{\n\tif (m_ShouldShutdown)\n\t{\n\t\tLOGD(\"%s: Cannot send data, the link is already shut down.\", __FUNCTION__);\n\t\treturn false;\n\t}\n\n\t// If running in TLS mode, push the data into the TLS context instead:\n\tif (m_TlsContext != nullptr)\n\t{\n\t\tm_TlsContext->Send(a_Data, a_Length);\n\t\treturn true;\n\t}\n\n\t// Send the data:\n\treturn SendRaw(a_Data, a_Length);\n}\n\n\n\n\n\nvoid cTCPLinkImpl::Shutdown(void)\n{\n\t// If running in TLS mode, notify the TLS layer:\n\tif (m_TlsContext != nullptr)\n\t{\n\t\tm_TlsContext->NotifyClose();\n\t\tm_TlsContext->ResetSelf();\n\t\tm_TlsContext.reset();\n\t}\n\n\t// If there's no outgoing data, shutdown the socket directly:\n\tif (evbuffer_get_length(bufferevent_get_output(m_BufferEvent)) == 0)\n\t{\n\t\tDoActualShutdown();\n\t\treturn;\n\t}\n\n\t// There's still outgoing data in the LibEvent buffer, schedule a shutdown when it's written to OS's TCP stack:\n\tm_ShouldShutdown = true;\n}\n\n\n\n\n\nvoid cTCPLinkImpl::Close(void)\n{\n\t// If running in TLS mode, notify the TLS layer:\n\tif (m_TlsContext != nullptr)\n\t{\n\t\tm_TlsContext->NotifyClose();\n\t\tm_TlsContext->ResetSelf();\n\t\tm_TlsContext.reset();\n\t}\n\n\t// Disable all events on the socket, but keep it alive:\n\tbufferevent_disable(m_BufferEvent, EV_READ | EV_WRITE);\n\tif (m_Server == nullptr)\n\t{\n\t\tcNetworkSingleton::Get().RemoveLink(this);\n\t}\n\telse\n\t{\n\t\tm_Server->RemoveLink(this);\n\t}\n\tm_Self.reset();\n}\n\n\n\n\n\nAString cTCPLinkImpl::StartTLSClient(\n\tcX509CertPtr a_OwnCert,\n\tcCryptoKeyPtr a_OwnPrivKey,\n\tcX509CertPtr a_TrustedRootCAs\n)\n{\n\t// Check preconditions:\n\tif (m_TlsContext != nullptr)\n\t{\n\t\treturn \"TLS is already active on this link\";\n\t}\n\tif ((a_OwnCert == nullptr) != (a_OwnPrivKey == nullptr))\n\t{\n\t\treturn \"Either provide both the certificate and private key, or neither\";\n\t}\n\n\t// Create the TLS context:\n\tm_TlsContext = std::make_shared<cLinkTlsContext>(*this);\n\tif ((a_OwnCert == nullptr) && (a_TrustedRootCAs == nullptr))\n\t{\n\t\t// Use the (shared) default TLS config\n\t\tm_TlsContext->Initialize(true);\n\t}\n\telse\n\t{\n\t\t// Need a specialized config for the own certificate / trusted root CAs:\n\t\tauto Config = cSslConfig::MakeDefaultConfig(true);\n\t\tif (a_OwnCert != nullptr)\n\t\t{\n\t\t\tConfig->SetOwnCert(std::move(a_OwnCert), std::move(a_OwnPrivKey));\n\t\t}\n\t\tif (a_TrustedRootCAs != nullptr)\n\t\t{\n\t\t\tConfig->SetAuthMode(eSslAuthMode::Required);\n\t\t\tConfig->SetCACerts(std::move(a_TrustedRootCAs));\n\t\t}\n\t\tm_TlsContext->Initialize(Config);\n\t}\n\n\t// Enable SNI / peer name verification:\n\tif (!m_RemoteHost.empty())\n\t{\n\t\tm_TlsContext->SetExpectedPeerName(m_RemoteHost);\n\t}\n\n\tm_TlsContext->SetSelf(cLinkTlsContextWPtr(m_TlsContext));\n\n\t// Start the handshake:\n\tm_TlsContext->Handshake();\n\treturn {};\n}\n\n\n\n\n\nAString cTCPLinkImpl::StartTLSServer(\n\tcX509CertPtr a_OwnCert,\n\tcCryptoKeyPtr a_OwnPrivKey,\n\tconst AString & a_StartTLSData\n)\n{\n\t// Check preconditions:\n\tif (m_TlsContext != nullptr)\n\t{\n\t\treturn \"TLS is already active on this link\";\n\t}\n\tif ((a_OwnCert == nullptr) || (a_OwnPrivKey == nullptr))\n\t{\n\t\treturn \"Provide the server certificate and private key\";\n\t}\n\n\t// Create the TLS context:\n\tm_TlsContext = std::make_shared<cLinkTlsContext>(*this);\n\t{\n\t\tauto Config = cSslConfig::MakeDefaultConfig(false);\n\t\tConfig->SetOwnCert(a_OwnCert, a_OwnPrivKey);\n\t\tm_TlsContext->Initialize(std::move(Config));\n\t}\n\tm_TlsContext->SetSelf(cLinkTlsContextWPtr(m_TlsContext));\n\n\t// Push the initial data:\n\tm_TlsContext->StoreReceivedData(a_StartTLSData.data(), a_StartTLSData.size());\n\n\t// Start the handshake:\n\tm_TlsContext->Handshake();\n\treturn {};\n}\n\n\n\n\n\nvoid cTCPLinkImpl::ReadCallback(bufferevent * a_BufferEvent, void * a_Self)\n{\n\tASSERT(a_Self != nullptr);\n\tcTCPLinkImpl * Self = static_cast<cTCPLinkImpl *>(a_Self);\n\tASSERT(Self->m_BufferEvent == a_BufferEvent);\n\tASSERT(Self->m_Callbacks != nullptr);\n\n\t// Read all the incoming data, in 1024-byte chunks:\n\tchar data[1024];\n\tsize_t length;\n\tauto tlsContext = Self->m_TlsContext;\n\twhile ((length = bufferevent_read(a_BufferEvent, data, sizeof(data))) > 0)\n\t{\n\t\tif (tlsContext != nullptr)\n\t\t{\n\t\t\tASSERT(tlsContext->IsLink(Self));\n\t\t\ttlsContext->StoreReceivedData(data, length);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSelf->ReceivedCleartextData(data, length);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cTCPLinkImpl::WriteCallback(bufferevent * a_BufferEvent, void * a_Self)\n{\n\tASSERT(a_Self != nullptr);\n\tauto Self = static_cast<cTCPLinkImpl *>(a_Self);\n\tASSERT(Self->m_Callbacks != nullptr);\n\n\t// If there's no more data to write and the link has been scheduled for shutdown, do the shutdown:\n\tauto OutLen = evbuffer_get_length(bufferevent_get_output(Self->m_BufferEvent));\n\tif ((OutLen == 0) && (Self->m_ShouldShutdown))\n\t{\n\t\tSelf->DoActualShutdown();\n\t}\n}\n\n\n\n\n\nvoid cTCPLinkImpl::EventCallback(bufferevent * a_BufferEvent, short a_What, void * a_Self)\n{\n\tASSERT(a_Self != nullptr);\n\tcTCPLinkImplPtr Self = static_cast<cTCPLinkImpl *>(a_Self)->m_Self;\n\tif (Self == nullptr)\n\t{\n\t\t// The link has already been freed\n\t\treturn;\n\t}\n\n\t// If an error is reported, call the error callback:\n\tif (a_What & BEV_EVENT_ERROR)\n\t{\n\t\t// Choose the proper callback to call based on whether we were waiting for connection or not:\n\t\tint err = EVUTIL_SOCKET_ERROR();\n\t\tif (Self->m_ConnectCallbacks != nullptr)\n\t\t{\n\t\t\tif (err == 0)\n\t\t\t{\n\t\t\t\t// This could be a DNS failure\n\t\t\t\terr = bufferevent_socket_get_dns_error(a_BufferEvent);\n\t\t\t}\n\t\t\tSelf->m_ConnectCallbacks->OnError(err, evutil_socket_error_to_string(err));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSelf->m_Callbacks->OnError(err, evutil_socket_error_to_string(err));\n\t\t\tif (Self->m_Server == nullptr)\n\t\t\t{\n\t\t\t\tcNetworkSingleton::Get().RemoveLink(Self.get());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSelf->m_Server->RemoveLink(Self.get());\n\t\t\t}\n\t\t}\n\t\tSelf->m_Self.reset();\n\t\treturn;\n\t}\n\n\t// Pending connection succeeded, call the connection callback:\n\tif (a_What & BEV_EVENT_CONNECTED)\n\t{\n\t\tSelf->UpdateLocalAddress();\n\t\tSelf->UpdateRemoteAddress();\n\t\tif (Self->m_ConnectCallbacks != nullptr)\n\t\t{\n\t\t\tSelf->m_ConnectCallbacks->OnConnected(*Self);\n\t\t\t// Reset the connect callbacks so that later errors get reported through the link callbacks:\n\t\t\tSelf->m_ConnectCallbacks.reset();\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// If the connection has been closed, call the link callback and remove the connection:\n\tif (a_What & BEV_EVENT_EOF)\n\t{\n\t\t// If running in TLS mode and there's data left in the TLS contect, report it:\n\t\tauto tlsContext = Self->m_TlsContext;\n\t\tif (tlsContext != nullptr)\n\t\t{\n\t\t\ttlsContext->FlushBuffers();\n\t\t}\n\n\t\tSelf->m_Callbacks->OnRemoteClosed();\n\t\tif (Self->m_Server != nullptr)\n\t\t{\n\t\t\tSelf->m_Server->RemoveLink(Self.get());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcNetworkSingleton::Get().RemoveLink(Self.get());\n\t\t}\n\t\tSelf->m_Self.reset();\n\t\treturn;\n\t}\n\n\t// Unknown event, report it:\n\tLOGWARNING(\"cTCPLinkImpl: Unhandled LibEvent event %d (0x%x)\", a_What, a_What);\n\tASSERT(!\"cTCPLinkImpl: Unhandled LibEvent event\");\n}\n\n\n\n\n\nvoid cTCPLinkImpl::UpdateAddress(const sockaddr * a_Address, socklen_t a_AddrLen, AString & a_IP, UInt16 & a_Port)\n{\n\t// Based on the family specified in the address, use the correct datastructure to convert to IP string:\n\tchar IP[128];\n\tswitch (a_Address->sa_family)\n\t{\n\t\tcase AF_INET:  // IPv4:\n\t\t{\n\t\t\tconst sockaddr_in * sin = reinterpret_cast<const sockaddr_in *>(a_Address);\n\t\t\tevutil_inet_ntop(AF_INET, &(sin->sin_addr), IP, sizeof(IP));\n\t\t\ta_Port = ntohs(sin->sin_port);\n\t\t\tbreak;\n\t\t}\n\t\tcase AF_INET6:  // IPv6\n\t\t{\n\t\t\tconst sockaddr_in6 * sin = reinterpret_cast<const sockaddr_in6 *>(a_Address);\n\t\t\tevutil_inet_ntop(AF_INET6, &(sin->sin6_addr), IP, sizeof(IP));\n\t\t\ta_Port = ntohs(sin->sin6_port);\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"%s: Unknown socket address family: %d\", __FUNCTION__, a_Address->sa_family);\n\t\t\tASSERT(!\"Unknown socket address family\");\n\t\t\tbreak;\n\t\t}\n\t}\n\ta_IP.assign(IP);\n}\n\n\n\n\n\nvoid cTCPLinkImpl::UpdateLocalAddress(void)\n{\n\tsockaddr_storage sa;\n\tsocklen_t salen = static_cast<socklen_t>(sizeof(sa));\n\tgetsockname(bufferevent_getfd(m_BufferEvent), reinterpret_cast<sockaddr *>(&sa), &salen);\n\tUpdateAddress(reinterpret_cast<const sockaddr *>(&sa), salen, m_LocalIP, m_LocalPort);\n}\n\n\n\n\n\nvoid cTCPLinkImpl::UpdateRemoteAddress(void)\n{\n\tsockaddr_storage sa;\n\tsocklen_t salen = static_cast<socklen_t>(sizeof(sa));\n\tgetpeername(bufferevent_getfd(m_BufferEvent), reinterpret_cast<sockaddr *>(&sa), &salen);\n\tUpdateAddress(reinterpret_cast<const sockaddr *>(&sa), salen, m_RemoteIP, m_RemotePort);\n}\n\n\n\n\n\nvoid cTCPLinkImpl::DoActualShutdown(void)\n{\n\t#ifdef _WIN32\n\t\tshutdown(bufferevent_getfd(m_BufferEvent), SD_SEND);\n\t#else\n\t\tshutdown(bufferevent_getfd(m_BufferEvent), SHUT_WR);\n\t#endif\n\tbufferevent_disable(m_BufferEvent, EV_WRITE);\n}\n\n\n\n\n\nbool cTCPLinkImpl::SendRaw(const void * a_Data, size_t a_Length)\n{\n\treturn (bufferevent_write(m_BufferEvent, a_Data, a_Length) == 0);\n}\n\n\n\n\n\nvoid cTCPLinkImpl::ReceivedCleartextData(const char * a_Data, size_t a_Length)\n{\n\tASSERT(m_Callbacks != nullptr);\n\tm_Callbacks->OnReceivedData(a_Data, a_Length);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cTCPLinkImpl::cLinkTlsContext:\n\ncTCPLinkImpl::cLinkTlsContext::cLinkTlsContext(cTCPLinkImpl & a_Link):\n\tm_Link(a_Link)\n{\n}\n\n\n\n\n\nvoid cTCPLinkImpl::cLinkTlsContext::SetSelf(cLinkTlsContextWPtr a_Self)\n{\n\tm_Self = std::move(a_Self);\n}\n\n\n\n\n\nvoid cTCPLinkImpl::cLinkTlsContext::ResetSelf(void)\n{\n\tm_Self.reset();\n}\n\n\n\n\n\nvoid cTCPLinkImpl::cLinkTlsContext::StoreReceivedData(const char * a_Data, size_t a_NumBytes)\n{\n\t// Hold self alive for the duration of this function\n\tcLinkTlsContextPtr Self(m_Self);\n\n\tm_EncryptedData.append(a_Data, a_NumBytes);\n\n\t// Try to finish a pending handshake:\n\tTryFinishHandshaking();\n\n\t// Flush any cleartext data that can be \"received\":\n\tFlushBuffers();\n}\n\n\n\n\n\nvoid cTCPLinkImpl::cLinkTlsContext::FlushBuffers(void)\n{\n\t// Hold self alive for the duration of this function\n\tcLinkTlsContextPtr Self(m_Self);\n\n\t// If the handshake didn't complete yet, bail out:\n\tif (!HasHandshaken())\n\t{\n\t\treturn;\n\t}\n\n\tchar Buffer[1024];\n\tint NumBytes;\n\twhile ((NumBytes = ReadPlain(Buffer, sizeof(Buffer))) > 0)\n\t{\n\t\tm_Link.ReceivedCleartextData(Buffer, static_cast<size_t>(NumBytes));\n\t\tif (m_Self.expired())\n\t\t{\n\t\t\t// The callback closed the SSL context, bail out\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cTCPLinkImpl::cLinkTlsContext::TryFinishHandshaking(void)\n{\n\t// Hold self alive for the duration of this function\n\tcLinkTlsContextPtr Self(m_Self);\n\n\t// If the handshake hasn't finished yet, retry:\n\tif (!HasHandshaken())\n\t{\n\t\tHandshake();\n\t\t// If the handshake succeeded, write all the queued plaintext data:\n\t\tif (HasHandshaken())\n\t\t{\n\t\t\tm_Link.GetCallbacks()->OnTlsHandshakeCompleted();\n\t\t\tWritePlain(m_CleartextData.data(), m_CleartextData.size());\n\t\t\tm_CleartextData.clear();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cTCPLinkImpl::cLinkTlsContext::Send(const void * a_Data, size_t a_Length)\n{\n\t// Hold self alive for the duration of this function\n\tcLinkTlsContextPtr Self(m_Self);\n\n\t// If the handshake hasn't completed yet, queue the data:\n\tif (!HasHandshaken())\n\t{\n\t\tm_CleartextData.append(reinterpret_cast<const char *>(a_Data), a_Length);\n\t\tTryFinishHandshaking();\n\t\treturn;\n\t}\n\n\t// The connection is all set up, write the cleartext data into the SSL context:\n\tWritePlain(a_Data, a_Length);\n\tFlushBuffers();\n}\n\n\n\n\n\nint cTCPLinkImpl::cLinkTlsContext::ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes)\n{\n\t// Hold self alive for the duration of this function\n\tcLinkTlsContextPtr Self(m_Self);\n\n\t// If there's nothing queued in the buffer, report empty buffer:\n\tif (m_EncryptedData.empty())\n\t{\n\t\treturn MBEDTLS_ERR_SSL_WANT_READ;\n\t}\n\n\t// Copy as much data as possible to the provided buffer:\n\tsize_t BytesToCopy = std::min(a_NumBytes, m_EncryptedData.size());\n\tmemcpy(a_Buffer, m_EncryptedData.data(), BytesToCopy);\n\tm_EncryptedData.erase(0, BytesToCopy);\n\treturn static_cast<int>(BytesToCopy);\n}\n\n\n\n\n\nint cTCPLinkImpl::cLinkTlsContext::SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes)\n{\n\tm_Link.SendRaw(a_Buffer, a_NumBytes);\n\treturn static_cast<int>(a_NumBytes);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNetwork API:\n\nbool cNetwork::Connect(\n\tconst AString & a_Host,\n\tUInt16 a_Port,\n\tcNetwork::cConnectCallbacksPtr a_ConnectCallbacks,\n\tcTCPLink::cCallbacksPtr a_LinkCallbacks\n)\n{\n\t// Add a connection request to the queue:\n\tcTCPLinkImplPtr Conn = cTCPLinkImpl::Connect(a_Host, a_Port, std::move(a_LinkCallbacks), std::move(a_ConnectCallbacks));\n\treturn (Conn != nullptr);\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/TCPLinkImpl.h",
    "content": "\n// TCPLinkImpl.h\n\n// Declares the cTCPLinkImpl class implementing the TCP link functionality\n\n// This is an internal header, no-one outside OSSupport should need to include it; use Network.h instead\n\n\n\n\n\n#pragma once\n\n#include \"Network.h\"\n#include <event2/event.h>\n#include <event2/bufferevent.h>\n#include \"../mbedTLS++/SslContext.h\"\n\n\n\n\n\n// fwd:\nclass cServerHandleImpl;\ntypedef std::shared_ptr<cServerHandleImpl> cServerHandleImplPtr;\nclass cTCPLinkImpl;\ntypedef std::shared_ptr<cTCPLinkImpl> cTCPLinkImplPtr;\ntypedef std::vector<cTCPLinkImplPtr> cTCPLinkImplPtrs;\n\n\n\n\n\nclass cTCPLinkImpl:\n\tpublic cTCPLink\n{\n\tusing Super = cTCPLink;\n\npublic:\n\n\t/** Creates a new link based on the given socket.\n\tUsed for connections accepted in a server using cNetwork::Listen().\n\ta_Host is the hostname used for TLS SNI (can be empty in cases TLS is not used).\n\ta_Address and a_AddrLen describe the remote peer that has connected.\n\tThe link is created disabled, you need to call Enable() to start the regular communication. */\n\tcTCPLinkImpl(\n\t\tevutil_socket_t a_Socket,\n\t\tcCallbacksPtr a_LinkCallbacks,\n\t\tcServerHandleImplPtr a_Server,\n\t\tconst sockaddr * a_Address,\n\t\tsocklen_t a_AddrLen\n\t);\n\n\t/** Destroys the LibEvent handle representing the link. */\n\tvirtual ~cTCPLinkImpl() override;\n\n\t/** Queues a connection request to the specified host.\n\ta_ConnectCallbacks must be valid.\n\tReturns a link that has the connection request queued, or NULL for failure. */\n\tstatic cTCPLinkImplPtr Connect(const AString & a_Host, UInt16 a_Port, cTCPLink::cCallbacksPtr a_LinkCallbacks, cNetwork::cConnectCallbacksPtr a_ConnectCallbacks);\n\n\t/** Enables communication over the link.\n\tLinks are created with communication disabled, so that creation callbacks can be called first.\n\tThis function then enables the regular communication to be reported.\n\tThe a_Self parameter is used so that the socket can keep itself alive as long as the callbacks are coming. */\n\tvoid Enable(cTCPLinkImplPtr a_Self);\n\n\t// cTCPLink overrides:\n\tvirtual bool Send(const void * a_Data, size_t a_Length) override;\n\tvirtual AString GetLocalIP(void) const override { return m_LocalIP; }\n\tvirtual UInt16 GetLocalPort(void) const override { return m_LocalPort; }\n\tvirtual AString GetRemoteIP(void) const override { return m_RemoteIP; }\n\tvirtual UInt16 GetRemotePort(void) const override { return m_RemotePort; }\n\tvirtual void Shutdown(void) override;\n\tvirtual void Close(void) override;\n\tvirtual AString StartTLSClient(\n\t\tcX509CertPtr a_OwnCert,\n\t\tcCryptoKeyPtr a_OwnPrivKey,\n\t\tcX509CertPtr a_TrustedRootCAs\n\t) override;\n\tvirtual AString StartTLSServer(\n\t\tcX509CertPtr a_OwnCert,\n\t\tcCryptoKeyPtr a_OwnPrivKey,\n\t\tconst AString & a_StartTLSData\n\t) override;\n\nprotected:\n\n\t// fwd:\n\tclass cLinkTlsContext;\n\ttypedef std::shared_ptr<cLinkTlsContext> cLinkTlsContextPtr;\n\ttypedef std::weak_ptr<cLinkTlsContext> cLinkTlsContextWPtr;\n\n\t/** Wrapper around cSslContext that is used when this link is being encrypted by SSL. */\n\tclass cLinkTlsContext :\n\t\tpublic cSslContext\n\t{\n\t\tcTCPLinkImpl & m_Link;\n\n\t\t/** Buffer for storing the incoming encrypted data until it is requested by the SSL decryptor. */\n\t\tAString m_EncryptedData;\n\n\t\t/** Buffer for storing the outgoing cleartext data until the link has finished handshaking. */\n\t\tAString m_CleartextData;\n\n\t\t/** Shared ownership of self, so that this object can keep itself alive for as long as it needs. */\n\t\tcLinkTlsContextWPtr m_Self;\n\n\tpublic:\n\t\tcLinkTlsContext(cTCPLinkImpl & a_Link);\n\n\t\t/** Shares ownership of self, so that this object can keep itself alive for as long as it needs. */\n\t\tvoid SetSelf(cLinkTlsContextWPtr a_Self);\n\n\t\t/** Removes the self ownership so that we can detect the SSL closure. */\n\t\tvoid ResetSelf(void);\n\n\t\t/** Stores the specified block of data into the buffer of the data to be decrypted (incoming from remote).\n\t\tAlso flushes the SSL buffers by attempting to read any data through the SSL context. */\n\t\tvoid StoreReceivedData(const char * a_Data, size_t a_NumBytes);\n\n\t\t/** Tries to read any cleartext data available through the SSL, reports it in the link. */\n\t\tvoid FlushBuffers(void);\n\n\t\t/** Tries to finish handshaking the SSL. */\n\t\tvoid TryFinishHandshaking(void);\n\n\t\t/** Sends the specified cleartext data over the SSL to the remote peer.\n\t\tIf the handshake hasn't been completed yet, queues the data for sending when it completes. */\n\t\tvoid Send(const void * a_Data, size_t a_Length);\n\n\t\t// cSslContext overrides:\n\t\tvirtual int ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes) override;\n\t\tvirtual int SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes) override;\n\n\t\t/** Returns true if the context's associated TCP link is the same link as a_Link. */\n\t\tbool IsLink(cTCPLinkImpl * a_Link)\n\t\t{\n\t\t\treturn (a_Link == &m_Link);\n\t\t}\n\t};\n\n\n\t/** Callbacks to call when the connection is established.\n\tMay be NULL if not used. Only used for outgoing connections (cNetwork::Connect()). */\n\tcNetwork::cConnectCallbacksPtr m_ConnectCallbacks;\n\n\t/** The LibEvent handle representing this connection. */\n\tbufferevent * m_BufferEvent;\n\n\t/** The server handle that has created this link.\n\tOnly valid for incoming connections, nullptr for outgoing connections. */\n\tcServerHandleImplPtr m_Server;\n\n\t/** The IP address of the local endpoint. Valid only after the socket has been connected. */\n\tAString m_LocalIP;\n\n\t/** The port of the local endpoint. Valid only after the socket has been connected. */\n\tUInt16 m_LocalPort;\n\n\t/** The original host parameter which was used for creating the link, either hostname or IP address.\n\tUsed for TLS SNI. */\n\tAString m_RemoteHost;\n\n\t/** The IP address of the remote endpoint. Valid only after the socket has been connected. */\n\tAString m_RemoteIP;\n\n\t/** The port of the remote endpoint. Valid only after the socket has been connected. */\n\tUInt16 m_RemotePort;\n\n\t/** SharedPtr to self, used to keep this object alive as long as the callbacks are coming.\n\tInitialized in Enable(), cleared in Close() and EventCallback(RemoteClosed). */\n\tcTCPLinkImplPtr m_Self;\n\n\t/** If true, Shutdown() has been called and is in queue.\n\tNo more data is allowed to be sent via Send() and after all the currently buffered\n\tdata is sent to the OS TCP stack, the socket gets shut down. */\n\tbool m_ShouldShutdown;\n\n\t/** The SSL context used for encryption, if this link uses SSL.\n\tIf valid, the link uses encryption through this context. */\n\tcLinkTlsContextPtr m_TlsContext;\n\n\n\t/** Creates a new link to be queued to connect to a specified host:port.\n\tUsed for outgoing connections created using cNetwork::Connect().\n\tTo be used only by the Connect() factory function.\n\tThe link is created disabled, you need to call Enable() to start the regular communication. */\n\tcTCPLinkImpl(const std::string & a_Host, const cCallbacksPtr a_LinkCallbacks);\n\n\t/** Callback that LibEvent calls when there's data available from the remote peer. */\n\tstatic void ReadCallback(bufferevent * a_BufferEvent, void * a_Self);\n\n\t/** Callback that LibEvent calls when the remote peer can receive more data. */\n\tstatic void WriteCallback(bufferevent * a_BufferEvent, void * a_Self);\n\n\t/** Callback that LibEvent calls when there's a non-data-related event on the socket. */\n\tstatic void EventCallback(bufferevent * a_BufferEvent, short a_What, void * a_Self);\n\n\t/** Sets a_IP and a_Port to values read from a_Address, based on the correct address family. */\n\tstatic void UpdateAddress(const sockaddr * a_Address, socklen_t a_AddrLen, AString & a_IP, UInt16 & a_Port);\n\n\t/** Updates m_LocalIP and m_LocalPort based on the metadata read from the socket. */\n\tvoid UpdateLocalAddress(void);\n\n\t/** Updates m_RemoteIP and m_RemotePort based on the metadata read from the socket. */\n\tvoid UpdateRemoteAddress(void);\n\n\t/** Calls shutdown on the link and disables LibEvent writing.\n\tCalled after all data from LibEvent buffers is sent to the OS TCP stack and shutdown() has been called before. */\n\tvoid DoActualShutdown(void);\n\n\t/** Sends the data directly to the socket (without the optional TLS). */\n\tbool SendRaw(const void * a_Data, size_t a_Length);\n\n\t/** Called by the TLS when it has decoded a piece of incoming cleartext data from the socket. */\n\tvoid ReceivedCleartextData(const char * a_Data, size_t a_Length);\n};\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/UDPEndpointImpl.cpp",
    "content": "\n// UDPEndpointImpl.cpp\n\n// Implements the cUDPEndpointImpl class representing an implementation of an endpoint in UDP communication\n\n#include \"Globals.h\"\n#include \"UDPEndpointImpl.h\"\n#include \"NetworkSingleton.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Globals:\n\nnamespace UDPEndpointImplHelper\n{\n\tstatic bool IsValidSocket(evutil_socket_t a_Socket)\n\t{\n#ifdef _WIN32\n\t\treturn (a_Socket != INVALID_SOCKET);\n#else  // _WIN32\n\t\treturn (a_Socket >= 0);\n#endif  // else _WIN32\n\t}\n}\n\n\n\n\n\n/** Converts a_SrcAddr in IPv4 format to a_DstAddr in IPv6 format (using IPv4-mapped IPv6). */\nstatic void ConvertIPv4ToMappedIPv6(sockaddr_in & a_SrcAddr, sockaddr_in6 & a_DstAddr)\n{\n\tmemset(&a_DstAddr, 0, sizeof(a_DstAddr));\n\ta_DstAddr.sin6_family = AF_INET6;\n\ta_DstAddr.sin6_addr.s6_addr[10] = 0xff;\n\ta_DstAddr.sin6_addr.s6_addr[11] = 0xff;\n\ta_DstAddr.sin6_addr.s6_addr[12] = static_cast<Byte>((a_SrcAddr.sin_addr.s_addr >>  0) & 0xff);\n\ta_DstAddr.sin6_addr.s6_addr[13] = static_cast<Byte>((a_SrcAddr.sin_addr.s_addr >>  8) & 0xff);\n\ta_DstAddr.sin6_addr.s6_addr[14] = static_cast<Byte>((a_SrcAddr.sin_addr.s_addr >> 16) & 0xff);\n\ta_DstAddr.sin6_addr.s6_addr[15] = static_cast<Byte>((a_SrcAddr.sin_addr.s_addr >> 24) & 0xff);\n\ta_DstAddr.sin6_port = a_SrcAddr.sin_port;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cUDPSendAfterLookup:\n\n/** A hostname-to-IP resolver callback that sends the data stored within to the resolved IP address.\nThis is used for sending UDP datagrams to hostnames, so that the cUDPEndpoint::Send() doesn't block.\nInstead an instance of this callback is queued for resolving and the data is sent once the IP is resolved. */\nclass cUDPSendAfterLookup:\n\tpublic cNetwork::cResolveNameCallbacks\n{\npublic:\n\tcUDPSendAfterLookup(const AString & a_Data, UInt16 a_Port, evutil_socket_t a_MainSock, evutil_socket_t a_SecondSock, bool a_IsMainSockIPv6):\n\t\tm_Data(a_Data),\n\t\tm_Port(a_Port),\n\t\tm_MainSock(a_MainSock),\n\t\tm_SecondSock(a_SecondSock),\n\t\tm_IsMainSockIPv6(a_IsMainSockIPv6),\n\t\tm_HasIPv4(false),\n\t\tm_HasIPv6(false)\n\t{\n\t}\n\nprotected:\n\t/** The data to send after the hostname is resolved. */\n\tAString m_Data;\n\n\t/** The port to which to send the data. */\n\tUInt16 m_Port;\n\n\t/** The primary socket to use for sending. */\n\tevutil_socket_t m_MainSock;\n\n\t/** The secondary socket to use for sending, if needed by the OS. */\n\tevutil_socket_t m_SecondSock;\n\n\t/** True if m_MainSock is an IPv6 socket. */\n\tbool m_IsMainSockIPv6;\n\n\t/** The IPv4 address resolved, if any. */\n\tsockaddr_in m_AddrIPv4;\n\n\t/** Set to true if the name resolved to an IPv4 address. */\n\tbool m_HasIPv4;\n\n\t/** The IPv6 address resolved, if any. */\n\tsockaddr_in6 m_AddrIPv6;\n\n\t/** Set to true if the name resolved to an IPv6 address. */\n\tbool m_HasIPv6;\n\n\n\t// cNetwork::cResolveNameCallbacks overrides:\n\tvirtual void OnNameResolved(const AString & a_Name, const AString & a_PI) override\n\t{\n\t\t// Not needed\n\t}\n\n\tvirtual bool OnNameResolvedV4(const AString & a_Name, const sockaddr_in * a_IP) override\n\t{\n\t\tif (!m_HasIPv4)\n\t\t{\n\t\t\tm_AddrIPv4 = *a_IP;\n\t\t\tm_AddrIPv4.sin_port = htons(m_Port);\n\t\t\tm_HasIPv4 = true;\n\t\t}\n\n\t\t// Don't want OnNameResolved() callback\n\t\treturn false;\n\t}\n\n\tvirtual bool OnNameResolvedV6(const AString & a_Name, const sockaddr_in6 * a_IP) override\n\t{\n\t\tif (!m_HasIPv6)\n\t\t{\n\t\t\tm_AddrIPv6 = *a_IP;\n\t\t\tm_AddrIPv6.sin6_port = htons(m_Port);\n\t\t\tm_HasIPv6 = true;\n\t\t}\n\n\t\t// Don't want OnNameResolved() callback\n\t\treturn false;\n\t}\n\n\tvirtual void OnFinished(void) override\n\t{\n\t\t// Send the actual data, through the correct socket and using the correct resolved address:\n\t\tif (m_IsMainSockIPv6)\n\t\t{\n\t\t\tif (m_HasIPv6)\n\t\t\t{\n\t\t\t\tsendto(m_MainSock, m_Data.data(), m_Data.size(), 0, reinterpret_cast<const sockaddr *>(&m_AddrIPv6), static_cast<socklen_t>(sizeof(m_AddrIPv6)));\n\t\t\t}\n\t\t\telse if (m_HasIPv4)\n\t\t\t{\n\t\t\t\t// If the secondary socket is valid, it is an IPv4 socket, so use that:\n\t\t\t\tif (m_SecondSock != -1)\n\t\t\t\t{\n\t\t\t\t\tsendto(m_SecondSock, m_Data.data(), m_Data.size(), 0, reinterpret_cast<const sockaddr *>(&m_AddrIPv4), static_cast<socklen_t>(sizeof(m_AddrIPv4)));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Need an address conversion from IPv4 to IPv6-mapped-IPv4:\n\t\t\t\t\tConvertIPv4ToMappedIPv6(m_AddrIPv4, m_AddrIPv6);\n\t\t\t\t\tsendto(m_MainSock, m_Data.data(), m_Data.size(), 0, reinterpret_cast<const sockaddr *>(&m_AddrIPv6), static_cast<socklen_t>(sizeof(m_AddrIPv6)));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLOGD(\"UDP endpoint queued sendto: Name not resolved\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse  // m_IsMainSockIPv6\n\t\t{\n\t\t\t// Main socket is IPv4 only, only allow IPv4 dst address:\n\t\t\tif (!m_HasIPv4)\n\t\t\t{\n\t\t\t\tLOGD(\"UDP endpoint queued sendto: Name not resolved to IPv4 for an IPv4-only socket\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsendto(m_MainSock, m_Data.data(), m_Data.size(), 0, reinterpret_cast<const sockaddr *>(&m_AddrIPv4), static_cast<socklen_t>(sizeof(m_AddrIPv4)));\n\t\t}\n\t}\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\t// Nothing needed\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cUDPEndpointImpl:\n\ncUDPEndpointImpl::cUDPEndpointImpl(UInt16 a_Port, cUDPEndpoint::cCallbacks & a_Callbacks):\n\tSuper(a_Callbacks),\n\tm_Port(0),\n\tm_MainSock(-1),\n\tm_IsMainSockIPv6(true),\n\tm_SecondarySock(-1),\n\tm_MainEvent(nullptr),\n\tm_SecondaryEvent(nullptr)\n{\n\tOpen(a_Port);\n}\n\n\n\n\n\ncUDPEndpointImpl::~cUDPEndpointImpl()\n{\n\tClose();\n}\n\n\n\n\n\nvoid cUDPEndpointImpl::Close(void)\n{\n\tif (m_Port == 0)\n\t{\n\t\t// Already closed\n\t\treturn;\n\t}\n\n\t// Close the LibEvent handles:\n\tif (m_MainEvent != nullptr)\n\t{\n\t\tevent_free(m_MainEvent);\n\t\tm_MainEvent = nullptr;\n\t}\n\tif (m_SecondaryEvent != nullptr)\n\t{\n\t\tevent_free(m_SecondaryEvent);\n\t\tm_SecondaryEvent = nullptr;\n\t}\n\n\t// Close the OS sockets:\n\tevutil_closesocket(m_MainSock);\n\tm_MainSock = -1;\n\tevutil_closesocket(m_SecondarySock);\n\tm_SecondarySock = -1;\n\n\t// Mark as closed:\n\tm_Port = 0;\n}\n\n\n\n\n\nbool cUDPEndpointImpl::IsOpen(void) const\n{\n\treturn (m_Port != 0);\n}\n\n\n\n\n\nUInt16 cUDPEndpointImpl::GetPort(void) const\n{\n\treturn m_Port;\n}\n\n\n\n\n\nbool cUDPEndpointImpl::Send(const AString & a_Payload, const AString & a_Host, UInt16 a_Port)\n{\n\t// If a_Host is an IP address, send the data directly:\n\tsockaddr_storage sa;\n\tint salen = static_cast<int>(sizeof(sa));\n\tmemset(&sa, 0, sizeof(sa));\n\tif (evutil_parse_sockaddr_port(a_Host.c_str(), reinterpret_cast<sockaddr *>(&sa), &salen) != 0)\n\t{\n\t\t// a_Host is a hostname, we need to do a lookup first:\n\t\tauto queue = std::make_shared<cUDPSendAfterLookup>(a_Payload, a_Port, m_MainSock, m_SecondarySock, m_IsMainSockIPv6);\n\t\treturn cNetwork::HostnameToIP(a_Host, queue);\n\t}\n\n\t// a_Host is an IP address and has been parsed into \"sa\"\n\t// Insert the correct port and send data:\n\tint NumSent;\n\tswitch (sa.ss_family)\n\t{\n\t\tcase AF_INET:\n\t\t{\n\t\t\treinterpret_cast<sockaddr_in *>(&sa)->sin_port = htons(a_Port);\n\t\t\tif (m_IsMainSockIPv6)\n\t\t\t{\n\t\t\t\tif (UDPEndpointImplHelper::IsValidSocket(m_SecondarySock))\n\t\t\t\t{\n\t\t\t\t\t// The secondary socket, which is always IPv4, is present:\n\t\t\t\t\tNumSent = static_cast<int>(sendto(m_SecondarySock, a_Payload.data(), a_Payload.size(), 0, reinterpret_cast<const sockaddr *>(&sa), static_cast<socklen_t>(salen)));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Need to convert IPv4 to IPv6 address before sending:\n\t\t\t\t\tsockaddr_in6 IPv6;\n\t\t\t\t\tConvertIPv4ToMappedIPv6(*reinterpret_cast<sockaddr_in *>(&sa), IPv6);\n\t\t\t\t\tNumSent = static_cast<int>(sendto(m_MainSock, a_Payload.data(), a_Payload.size(), 0, reinterpret_cast<const sockaddr *>(&IPv6), static_cast<socklen_t>(sizeof(IPv6))));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNumSent = static_cast<int>(sendto(m_MainSock, a_Payload.data(), a_Payload.size(), 0, reinterpret_cast<const sockaddr *>(&sa), static_cast<socklen_t>(salen)));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase AF_INET6:\n\t\t{\n\t\t\treinterpret_cast<sockaddr_in6 *>(&sa)->sin6_port = htons(a_Port);\n\t\t\tNumSent = static_cast<int>(sendto(m_MainSock, a_Payload.data(), a_Payload.size(), 0, reinterpret_cast<const sockaddr *>(&sa), static_cast<socklen_t>(salen)));\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tLOGD(\"UDP sendto: Invalid address family for address \\\"%s\\\".\", a_Host.c_str());\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn (NumSent > 0);\n}\n\n\n\n\n\nvoid cUDPEndpointImpl::EnableBroadcasts(void)\n{\n\tASSERT(IsOpen());\n\n\t// Enable broadcasts on the main socket:\n\t// Some OSes use ints, others use chars, so we try both\n\tint broadcastInt = 1;\n\tchar broadcastChar = 1;\n\t// (Note that Windows uses const char * for option values, while Linux uses const void *)\n\tif (setsockopt(m_MainSock, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<const char *>(&broadcastInt), sizeof(broadcastInt)) == -1)\n\t{\n\t\tif (setsockopt(m_MainSock, SOL_SOCKET, SO_BROADCAST, &broadcastChar, sizeof(broadcastChar)) == -1)\n\t\t{\n\t\t\tint err = EVUTIL_SOCKET_ERROR();\n\t\t\tLOGWARNING(\"Cannot enable broadcasts on port %d: %d (%s)\", m_Port, err, evutil_socket_error_to_string(err));\n\t\t\treturn;\n\t\t}\n\n\t\t// Enable broadcasts on the secondary socket, if opened (use char, it worked for primary):\n\t\tif (UDPEndpointImplHelper::IsValidSocket(m_SecondarySock))\n\t\t{\n\t\t\tif (setsockopt(m_SecondarySock, SOL_SOCKET, SO_BROADCAST, &broadcastChar, sizeof(broadcastChar)) == -1)\n\t\t\t{\n\t\t\t\tint err = EVUTIL_SOCKET_ERROR();\n\t\t\t\tLOGWARNING(\"Cannot enable broadcasts on port %d (secondary): %d (%s)\", m_Port, err, evutil_socket_error_to_string(err));\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\t// Enable broadcasts on the secondary socket, if opened (use int, it worked for primary):\n\tif (UDPEndpointImplHelper::IsValidSocket(m_SecondarySock))\n\t{\n\t\tif (setsockopt(m_SecondarySock, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<const char *>(&broadcastInt), sizeof(broadcastInt)) == -1)\n\t\t{\n\t\t\tint err = EVUTIL_SOCKET_ERROR();\n\t\t\tLOGWARNING(\"Cannot enable broadcasts on port %d (secondary): %d (%s)\", m_Port, err, evutil_socket_error_to_string(err));\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cUDPEndpointImpl::Open(UInt16 a_Port)\n{\n\tASSERT(m_Port == 0);  // Must not be already open\n\n\t// Make sure the cNetwork internals are innitialized:\n\tcNetworkSingleton::Get();\n\n\t// Set up the main socket:\n\t// It should listen on IPv6 with IPv4 fallback, when available; IPv4 when IPv6 is not available.\n\tbool NeedsTwoSockets = false;\n\tm_IsMainSockIPv6 = true;\n\tm_MainSock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);\n\n\tint err;\n\tif (!UDPEndpointImplHelper::IsValidSocket(m_MainSock))\n\t{\n\t\t// Failed to create IPv6 socket, create an IPv4 one instead:\n\t\tm_IsMainSockIPv6 = false;\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"UDP: Failed to create IPv6 MainSock: %d (%s)\", err, evutil_socket_error_to_string(err));\n\t\tm_MainSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);\n\t\tif (!UDPEndpointImplHelper::IsValidSocket(m_MainSock))\n\t\t{\n\t\t\terr = EVUTIL_SOCKET_ERROR();\n\t\t\tm_Callbacks.OnError(err, fmt::format(FMT_STRING(\"Cannot create UDP socket for port {}: {} ({})\"),\n\t\t\t\ta_Port, err, evutil_socket_error_to_string(err))\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Allow the port to be reused right after the socket closes:\n\t\tif (evutil_make_listen_socket_reuseable(m_MainSock) != 0)\n\t\t{\n\t\t\terr = EVUTIL_SOCKET_ERROR();\n\t\t\tLOG(\"UDP Port %d cannot be made reusable: %d (%s). Restarting the server might not work.\",\n\t\t\t\ta_Port, err, evutil_socket_error_to_string(err)\n\t\t\t);\n\t\t}\n\n\t\t// Bind to all interfaces:\n\t\tsockaddr_in name;\n\t\tmemset(&name, 0, sizeof(name));\n\t\tname.sin_family = AF_INET;\n\t\tname.sin_port = ntohs(a_Port);\n\t\tif (bind(m_MainSock, reinterpret_cast<const sockaddr *>(&name), sizeof(name)) != 0)\n\t\t{\n\t\t\terr = EVUTIL_SOCKET_ERROR();\n\t\t\tm_Callbacks.OnError(err, fmt::format(FMT_STRING(\"Cannot bind UDP port {}: {} ({})\"),\n\t\t\t\ta_Port, err, evutil_socket_error_to_string(err))\n\t\t\t);\n\t\t\tevutil_closesocket(m_MainSock);\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// IPv6 socket created, switch it into \"dualstack\" mode:\n\t\tUInt32 Zero = 0;\n\t\t#ifdef _WIN32\n\t\t\t// WinXP doesn't support this feature, so if the setting fails, create another socket later on:\n\t\t\tint res = setsockopt(m_MainSock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<const char *>(&Zero), sizeof(Zero));\n\t\t\terr = EVUTIL_SOCKET_ERROR();\n\t\t\tNeedsTwoSockets = ((res == SOCKET_ERROR) && (err == WSAENOPROTOOPT));\n\t\t#else\n\t\t\tsetsockopt(m_MainSock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<const char *>(&Zero), sizeof(Zero));\n\t\t#endif\n\n\t\t// Allow the port to be reused right after the socket closes:\n\t\tif (evutil_make_listen_socket_reuseable(m_MainSock) != 0)\n\t\t{\n\t\t\terr  = EVUTIL_SOCKET_ERROR();\n\t\t\tLOG(\"UDP Port %d cannot be made reusable: %d (%s). Restarting the server might not work.\",\n\t\t\t\ta_Port, err, evutil_socket_error_to_string(err)\n\t\t\t);\n\t\t}\n\n\t\t// Bind to all interfaces:\n\t\tsockaddr_in6 name;\n\t\tmemset(&name, 0, sizeof(name));\n\t\tname.sin6_family = AF_INET6;\n\t\tname.sin6_port = ntohs(a_Port);\n\t\tif (bind(m_MainSock, reinterpret_cast<const sockaddr *>(&name), sizeof(name)) != 0)\n\t\t{\n\t\t\terr = EVUTIL_SOCKET_ERROR();\n\t\t\tm_Callbacks.OnError(err, fmt::format(FMT_STRING(\"Cannot bind to UDP port {}: {} ({})\"),\n\t\t\t\ta_Port, err, evutil_socket_error_to_string(err))\n\t\t\t);\n\t\t\tevutil_closesocket(m_MainSock);\n\t\t\treturn;\n\t\t}\n\t}\n\tif (evutil_make_socket_nonblocking(m_MainSock) != 0)\n\t{\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tm_Callbacks.OnError(err, fmt::format(FMT_STRING(\"Cannot make socket on UDP port {} nonblocking: {} ({})\"),\n\t\t\ta_Port, err, evutil_socket_error_to_string(err))\n\t\t);\n\t\tevutil_closesocket(m_MainSock);\n\t\treturn;\n\t}\n\tm_MainEvent = event_new(cNetworkSingleton::Get().GetEventBase(), m_MainSock, EV_READ | EV_PERSIST, RawCallback, this);\n\tevent_add(m_MainEvent, nullptr);\n\n\t// Read the actual port number on which the socket is listening:\n\t{\n\t\tsockaddr_storage name;\n\t\tsocklen_t namelen = static_cast<socklen_t>(sizeof(name));\n\t\tgetsockname(m_MainSock, reinterpret_cast<sockaddr *>(&name), &namelen);\n\t\tswitch (name.ss_family)\n\t\t{\n\t\t\tcase AF_INET:\n\t\t\t{\n\t\t\t\tsockaddr_in * sin = reinterpret_cast<sockaddr_in *>(&name);\n\t\t\t\tm_Port = ntohs(sin->sin_port);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase AF_INET6:\n\t\t\t{\n\t\t\t\tsockaddr_in6 * sin6 = reinterpret_cast<sockaddr_in6 *>(&name);\n\t\t\t\tm_Port = ntohs(sin6->sin6_port);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// If we don't need to create another socket, bail out now:\n\tif (!NeedsTwoSockets)\n\t{\n\t\treturn;\n\t}\n\n\t// If a secondary socket is required (WinXP dual-stack), create it here:\n\tLOGD(\"Creating a second UDP socket for IPv4\");\n\tm_SecondarySock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);\n\n\tif (!UDPEndpointImplHelper::IsValidSocket(m_SecondarySock))\n\t{\n\t\t// Don't report as an error, the primary socket is working\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"Socket creation failed for secondary UDP socket for port %d: %d, %s\", m_Port, err, evutil_socket_error_to_string(err));\n\t\treturn;\n\t}\n\n\t// Allow the port to be reused right after the socket closes:\n\tif (evutil_make_listen_socket_reuseable(m_SecondarySock) != 0)\n\t{\n\t\t// Don't report as an error, the primary socket is working\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"UDP Port %d cannot be made reusable (second socket): %d (%s). Restarting the server might not work.\",\n\t\t\ta_Port, err, evutil_socket_error_to_string(err)\n\t\t);\n\t\tevutil_closesocket(m_SecondarySock);\n\t\tm_SecondarySock = -1;\n\t\treturn;\n\t}\n\n\t// Make the secondary socket nonblocking:\n\tif (evutil_make_socket_nonblocking(m_SecondarySock) != 0)\n\t{\n\t\t// Don't report as an error, the primary socket is working\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"evutil_make_socket_nonblocking() failed for secondary UDP socket: %d, %s\", err, evutil_socket_error_to_string(err));\n\t\tevutil_closesocket(m_SecondarySock);\n\t\tm_SecondarySock = -1;\n\t\treturn;\n\t}\n\n\t// Bind to all IPv4 interfaces:\n\tsockaddr_in name;\n\tmemset(&name, 0, sizeof(name));\n\tname.sin_family = AF_INET;\n\tname.sin_port = ntohs(m_Port);\n\tif (bind(m_SecondarySock, reinterpret_cast<const sockaddr *>(&name), sizeof(name)) != 0)\n\t{\n\t\t// Don't report as an error, the primary socket is working\n\t\terr = EVUTIL_SOCKET_ERROR();\n\t\tLOGD(\"Cannot bind secondary socket to UDP port %d: %d (%s)\", m_Port, err, evutil_socket_error_to_string(err));\n\t\tevutil_closesocket(m_SecondarySock);\n\t\tm_SecondarySock = -1;\n\t\treturn;\n\t}\n\n\tm_SecondaryEvent = event_new(cNetworkSingleton::Get().GetEventBase(), m_SecondarySock, EV_READ | EV_PERSIST, RawCallback, this);\n\tevent_add(m_SecondaryEvent, nullptr);\n}\n\n\n\n\n\nvoid cUDPEndpointImpl::RawCallback(evutil_socket_t a_Socket, short a_What, void * a_Self)\n{\n\tcUDPEndpointImpl * Self = reinterpret_cast<cUDPEndpointImpl *>(a_Self);\n\tSelf->Callback(a_Socket, a_What);\n}\n\n\n\n\n\nvoid cUDPEndpointImpl::Callback(evutil_socket_t a_Socket, short a_What)\n{\n\tif ((a_What & EV_READ) != 0)\n\t{\n\t\t// Receive datagram from the socket:\n\t\tchar buf[64 KiB];\n\t\tsockaddr_storage sa;\n\t\tsocklen_t salen = static_cast<socklen_t>(sizeof(sa));\n\t\tauto len = recvfrom(a_Socket, buf, sizeof(buf), 0, reinterpret_cast<sockaddr *>(&sa), &salen);\n\t\tif (len >= 0)\n\t\t{\n\t\t\t// Convert the remote IP address to a string:\n\t\t\tchar RemoteHost[128];\n\t\t\tUInt16 RemotePort;\n\t\t\tswitch (sa.ss_family)\n\t\t\t{\n\t\t\t\tcase AF_INET:\n\t\t\t\t{\n\t\t\t\t\tauto sin = reinterpret_cast<sockaddr_in *>(&sa);\n\t\t\t\t\tevutil_inet_ntop(sa.ss_family, &sin->sin_addr, RemoteHost, sizeof(RemoteHost));\n\t\t\t\t\tRemotePort = ntohs(sin->sin_port);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase AF_INET6:\n\t\t\t\t{\n\t\t\t\t\tauto sin = reinterpret_cast<sockaddr_in6 *>(&sa);\n\t\t\t\t\tevutil_inet_ntop(sa.ss_family, &sin->sin6_addr, RemoteHost, sizeof(RemoteHost));\n\t\t\t\t\tRemotePort = ntohs(sin->sin6_port);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Call the callback:\n\t\t\tm_Callbacks.OnReceivedData(buf, static_cast<size_t>(len), RemoteHost, RemotePort);\n\t\t}\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNetwork API:\n\ncUDPEndpointPtr cNetwork::CreateUDPEndpoint(UInt16 a_Port, cUDPEndpoint::cCallbacks & a_Callbacks)\n{\n\treturn std::make_shared<cUDPEndpointImpl>(a_Port, a_Callbacks);\n}\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/UDPEndpointImpl.h",
    "content": "\n// UDPEndpointImpl.h\n\n// Declares the cUDPEndpointImpl class representing an implementation of an endpoint in UDP communication\n\n\n\n\n\n#pragma once\n\n#include \"Network.h\"\n#include <event2/event.h>\n\n\n\n\n\n// fwd:\nclass cUDPEndpointImpl;\ntypedef std::shared_ptr<cUDPEndpointImpl> cUDPEndpointImplPtr;\n\n\n\n\n\nclass cUDPEndpointImpl:\n\tpublic cUDPEndpoint\n{\n\tusing Super = cUDPEndpoint;\n\npublic:\n\n\t/** Creates a new instance of the endpoint, with the specified callbacks.\n\tTries to open on the specified port; if it fails, the endpoint is left in the \"closed\" state.\n\tIf a_Port is 0, the OS is free to assign any port number it likes to the endpoint. */\n\tcUDPEndpointImpl(UInt16 a_Port, cUDPEndpoint::cCallbacks & a_Callbacks);\n\n\tvirtual ~cUDPEndpointImpl() override;\n\n\t// cUDPEndpoint overrides:\n\tvirtual void Close(void) override;\n\tvirtual bool IsOpen(void) const override;\n\tvirtual UInt16 GetPort(void) const override;\n\tvirtual bool Send(const AString & a_Payload, const AString & a_Host, UInt16 a_Port) override;\n\tvirtual void EnableBroadcasts(void) override;\n\nprotected:\n\t/** The local port on which the endpoint is open.\n\tIf this is zero, it means the endpoint is closed - either opening has failed, or it has been closed explicitly. */\n\tUInt16 m_Port;\n\n\t/** The primary underlying OS socket. */\n\tevutil_socket_t m_MainSock;\n\n\t/** True if m_MainSock is in the IPv6 namespace (needs IPv6 addresses for sending). */\n\tbool m_IsMainSockIPv6;\n\n\t/** The secondary OS socket (if primary doesn't support dualstack). */\n\tevutil_socket_t m_SecondarySock;\n\n\t/** The LibEvent handle for the primary socket. */\n\tevent * m_MainEvent;\n\n\t/** The LibEvent handle for the secondary socket. */\n\tevent * m_SecondaryEvent;\n\n\n\t/** Creates and opens the socket on the specified port.\n\tIf a_Port is 0, the OS is free to assign any port number it likes to the endpoint.\n\tIf the opening fails, the OnError() callback is called and the endpoint is left \"closed\" (IsOpen() returns false). */\n\tvoid Open(UInt16 a_Port);\n\n\t/** The callback that LibEvent calls when an event occurs on one of the sockets.\n\tCalls Callback() on a_Self. */\n\tstatic void RawCallback(evutil_socket_t a_Socket, short a_What, void * a_Self);\n\n\t/** The callback that is called when an event occurs on one of the sockets. */\n\tvoid Callback(evutil_socket_t a_Socket, short a_What);\n};\n\n\n\n\n"
  },
  {
    "path": "src/OSSupport/WinStackWalker.cpp",
    "content": "// WinStackWalker.cpp\n\n// Implements the stack walking for Windows binaries\n\n\n\n/*\nLICENSE (https://www.opensource.org/licenses/bsd-license.php)\n\nCopyright (c) 2005-2010, Jochen Kalmbach\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice,\nthis list of conditions and the following disclaimer.\nRedistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand / or other materials provided with the distribution.\nNeither the name of Jochen Kalmbach nor the names of its contributors may be\nused to endorse or promote products derived from this software without\nspecific prior written permission.\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\nNOTE: 2017-06-16 madmaxoft: Removed the legacy VS code and generally cleaned up\n*/\n\n\n\n\n\n#include \"Globals.h\"\n\n#ifdef _WIN32\n\n#include <tchar.h>\n#pragma comment(lib, \"version.lib\")  // for \"VerQueryValue\"\n#pragma warning(disable:4826)\n#pragma warning(disable:4996)  // \"GetVersionEx\" was declared deprecated\n\n#include \"WinStackWalker.h\"\n\n\n#pragma pack(push, 8)\n\t#include <dbghelp.h>\n#pragma pack(pop)\n\n\n\n\n\n// Copy szSrc to szDest, but at most nMaxDestSize bytes. Always NUL-terminate\ntemplate<size_t COUNT>\nstatic void MyStrCpy(CHAR (&szDest)[COUNT], const CHAR * szSrc)\n{\n\tauto len = strlen(szSrc);\n\tif (len < COUNT)\n\t{\n\t\tmemcpy(szDest, szSrc, len + 1);\n\t}\n\telse\n\t{\n\t\tmemcpy(szDest, szSrc, COUNT - 1);\n\t\tszDest[COUNT - 1] = 0;\n\t}\n}\n\n\n\n\n\n// Normally it should be enough to use 'CONTEXT_FULL' (better would be 'CONTEXT_ALL')\n#define USED_CONTEXT_FLAGS CONTEXT_FULL\n\n\n\n\n\nclass StackWalkerInternal\n{\npublic:\n\tStackWalkerInternal(WinStackWalker * parent, HANDLE hProcess)\n\t{\n\t\tm_parent = parent;\n\t\tm_hDbhHelp = nullptr;\n\t\tpSC = nullptr;\n\t\tm_hProcess = hProcess;\n\t\tm_szSymPath = nullptr;\n\t\tpSFTA = nullptr;\n\t\tpSGLFA = nullptr;\n\t\tpSGMB = nullptr;\n\t\tpSGMI = nullptr;\n\t\tpSGO = nullptr;\n\t\tpSGSFA = nullptr;\n\t\tpSI = nullptr;\n\t\tpSLM = nullptr;\n\t\tpSSO = nullptr;\n\t\tpSW = nullptr;\n\t\tpUDSN = nullptr;\n\t\tpSGSP = nullptr;\n\t}\n\n\n\t~StackWalkerInternal()\n\t{\n\t\tif (pSC != nullptr)\n\t\t{\n\t\t\tpSC(m_hProcess);  // SymCleanup\n\t\t}\n\t\tif (m_hDbhHelp != nullptr)\n\t\t{\n\t\t\tFreeLibrary(m_hDbhHelp);\n\t\t}\n\t\tm_hDbhHelp = nullptr;\n\t\tm_parent = nullptr;\n\t\tif (m_szSymPath != nullptr)\n\t\t{\n\t\t\tfree(m_szSymPath);\n\t\t}\n\t\tm_szSymPath = nullptr;\n\t}\n\n\n\tBOOL Init(LPCSTR szSymPath)\n\t{\n\t\tif (m_parent == nullptr)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t// Dynamically load the Entry-Points for dbghelp.dll:\n\t\t// First try to load the newsest one from\n\t\tTCHAR szTemp[4096];\n\t\t// But before wqe do this, we first check if the \".local\" file exists\n\t\tif (GetModuleFileName(nullptr, szTemp, sizeof(szTemp)) > 0)\n\t\t{\n\t\t\t_tcscat_s(szTemp, _T(\".local\"));\n\t\t\tif (GetFileAttributes(szTemp) == INVALID_FILE_ATTRIBUTES)\n\t\t\t{\n\t\t\t\t// \".local\" file does not exist, so we can try to load the dbghelp.dll from the \"Debugging Tools for Windows\"\n\t\t\t\t// Ok, first try the new path according to the archtitecture:\n\t\t\t\t#ifdef _M_IX86\n\t\t\t\t\tif ((m_hDbhHelp == nullptr) && (GetEnvironmentVariable(_T(\"ProgramFiles\"), szTemp, ARRAYCOUNT(szTemp)) > 0))\n\t\t\t\t\t{\n\t\t\t\t\t\t_tcscat_s(szTemp, _T(\"\\\\Debugging Tools for Windows (x86)\\\\dbghelp.dll\"));\n\t\t\t\t\t\t// now check if the file exists:\n\t\t\t\t\t\tif (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_hDbhHelp = LoadLibrary(szTemp);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t#elif _M_X64\n\t\t\t\t\tif ((m_hDbhHelp == nullptr) && (GetEnvironmentVariable(_T(\"ProgramFiles\"), szTemp, ARRAYCOUNT(szTemp)) > 0))\n\t\t\t\t\t{\n\t\t\t\t\t\t_tcscat_s(szTemp, _T(\"\\\\Debugging Tools for Windows (x64)\\\\dbghelp.dll\"));\n\t\t\t\t\t\t// now check if the file exists:\n\t\t\t\t\t\tif (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_hDbhHelp = LoadLibrary(szTemp);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t#elif _M_IA64\n\t\t\t\t\tif ((m_hDbhHelp == nullptr) && (GetEnvironmentVariable(_T(\"ProgramFiles\"), szTemp, ARRAYCOUNT(szTemp)) > 0))\n\t\t\t\t\t{\n\t\t\t\t\t\t_tcscat_s(szTemp, _T(\"\\\\Debugging Tools for Windows (ia64)\\\\dbghelp.dll\"));\n\t\t\t\t\t\t// now check if the file exists:\n\t\t\t\t\t\tif (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_hDbhHelp = LoadLibrary(szTemp);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t\t// If still not found, try the old directories...\n\t\t\t\tif ((m_hDbhHelp == nullptr) && (GetEnvironmentVariable(_T(\"ProgramFiles\"), szTemp, ARRAYCOUNT(szTemp)) > 0))\n\t\t\t\t{\n\t\t\t\t\t_tcscat_s(szTemp, _T(\"\\\\Debugging Tools for Windows\\\\dbghelp.dll\"));\n\t\t\t\t\t// now check if the file exists:\n\t\t\t\t\tif (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES)\n\t\t\t\t\t{\n\t\t\t\t\t\tm_hDbhHelp = LoadLibrary(szTemp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t#if defined _M_X64 || defined _M_IA64\n\t\t\t\t\t// Still not found? Then try to load the (old) 64-Bit version:\n\t\t\t\t\tif ((m_hDbhHelp == nullptr) && (GetEnvironmentVariable(_T(\"ProgramFiles\"), szTemp, ARRAYCOUNT(szTemp)) > 0))\n\t\t\t\t\t{\n\t\t\t\t\t\t_tcscat_s(szTemp, _T(\"\\\\Debugging Tools for Windows 64-Bit\\\\dbghelp.dll\"));\n\t\t\t\t\t\tif (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_hDbhHelp = LoadLibrary(szTemp);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t}\n\t\t}\n\t\tif (m_hDbhHelp == nullptr)  // if not already loaded, try to load a default-one\n\t\t{\n\t\t\tm_hDbhHelp = LoadLibrary(_T(\"dbghelp.dll\"));\n\t\t}\n\t\tif (m_hDbhHelp == nullptr)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\tpSI = (tSI)GetProcAddress(m_hDbhHelp, \"SymInitialize\");\n\t\tpSC = (tSC)GetProcAddress(m_hDbhHelp, \"SymCleanup\");\n\n\t\tpSW = (tSW)GetProcAddress(m_hDbhHelp, \"StackWalk64\");\n\t\tpSGO = (tSGO)GetProcAddress(m_hDbhHelp, \"SymGetOptions\");\n\t\tpSSO = (tSSO)GetProcAddress(m_hDbhHelp, \"SymSetOptions\");\n\n\t\tpSFTA = (tSFTA)GetProcAddress(m_hDbhHelp, \"SymFunctionTableAccess64\");\n\t\tpSGLFA = (tSGLFA)GetProcAddress(m_hDbhHelp, \"SymGetLineFromAddr64\");\n\t\tpSGMB = (tSGMB)GetProcAddress(m_hDbhHelp, \"SymGetModuleBase64\");\n\t\tpSGMI = (tSGMI)GetProcAddress(m_hDbhHelp, \"SymGetModuleInfo64\");\n\t\t// pSGMI_V3 = (tSGMI_V3) GetProcAddress(m_hDbhHelp, \"SymGetModuleInfo64\");\n\t\tpSGSFA = (tSGSFA)GetProcAddress(m_hDbhHelp, \"SymGetSymFromAddr64\");\n\t\tpUDSN = (tUDSN)GetProcAddress(m_hDbhHelp, \"UnDecorateSymbolName\");\n\t\tpSLM = (tSLM)GetProcAddress(m_hDbhHelp, \"SymLoadModule64\");\n\t\tpSGSP = (tSGSP)GetProcAddress(m_hDbhHelp, \"SymGetSearchPath\");\n\n\t\tif (\n\t\t\t(pSC == nullptr)  || (pSFTA == nullptr)  || (pSGMB == nullptr) || (pSGMI == nullptr) ||\n\t\t\t(pSGO == nullptr) || (pSGSFA == nullptr) || (pSI == nullptr)   || (pSSO == nullptr) ||\n\t\t\t(pSW == nullptr)  || (pUDSN == nullptr)  || (pSLM == nullptr)\n\t\t)\n\t\t{\n\t\t\tFreeLibrary(m_hDbhHelp);\n\t\t\tm_hDbhHelp = nullptr;\n\t\t\tpSC = nullptr;\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// SymInitialize\n\t\tif (szSymPath != nullptr)\n\t\t{\n\t\t\tm_szSymPath = _strdup(szSymPath);\n\t\t}\n\t\tif (this->pSI(m_hProcess, m_szSymPath, FALSE) == FALSE)\n\t\t{\n\t\t\tthis->m_parent->OnDbgHelpErr(\"SymInitialize\", GetLastError(), 0);\n\t\t}\n\n\t\tDWORD symOptions = this->pSGO();  // SymGetOptions\n\t\tsymOptions |= SYMOPT_LOAD_LINES;\n\t\tsymOptions |= SYMOPT_FAIL_CRITICAL_ERRORS;\n\t\tsymOptions = this->pSSO(symOptions);\n\n\t\tchar buf[WinStackWalker::STACKWALK_MAX_NAMELEN] = { 0 };\n\t\tif (this->pSGSP != nullptr)\n\t\t{\n\t\t\tif (this->pSGSP(m_hProcess, buf, static_cast<DWORD>(sizeof(buf))) == FALSE)\n\t\t\t{\n\t\t\t\tthis->m_parent->OnDbgHelpErr(\"SymGetSearchPath\", GetLastError(), 0);\n\t\t\t}\n\t\t}\n\t\tchar szUserName[1024] = { 0 };\n\t\tDWORD dwSize = static_cast<DWORD>(sizeof(szUserName));\n\t\tGetUserNameA(szUserName, &dwSize);\n\t\tthis->m_parent->OnSymInit(buf, symOptions, szUserName);\n\n\t\treturn TRUE;\n\t}\n\n\n\n\n\n\tWinStackWalker * m_parent;\n\n\tHMODULE m_hDbhHelp;\n\tHANDLE m_hProcess;\n\tLPSTR m_szSymPath;\n\n\t#pragma pack(push, 8)\n\tstruct IMAGEHLP_MODULE64_V2\n\t{\n\t\tDWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)\n\t\tDWORD64  BaseOfImage;            // base load address of module\n\t\tDWORD    ImageSize;              // virtual size of the loaded module\n\t\tDWORD    TimeDateStamp;          // date / time stamp from pe header\n\t\tDWORD    CheckSum;               // checksum from the pe header\n\t\tDWORD    NumSyms;                // number of symbols in the symbol table\n\t\tSYM_TYPE SymType;                // type of symbols loaded\n\t\tCHAR     ModuleName[32];         // module name\n\t\tCHAR     ImageName[256];         // image name\n\t\tCHAR     LoadedImageName[256];   // symbol file name\n\t};\n\t#pragma pack(pop)\n\n\n\t// SymCleanup()\n\ttypedef BOOL(__stdcall *tSC)(IN HANDLE hProcess);\n\ttSC pSC;\n\n\t// SymFunctionTableAccess64()\n\ttypedef PVOID(__stdcall *tSFTA)(HANDLE hProcess, DWORD64 AddrBase);\n\ttSFTA pSFTA;\n\n\t// SymGetLineFromAddr64()\n\ttypedef BOOL(__stdcall *tSGLFA)(IN HANDLE hProcess, IN DWORD64 dwAddr, OUT PDWORD pdwDisplacement, OUT PIMAGEHLP_LINE64 Line);\n\ttSGLFA pSGLFA;\n\n\t// SymGetModuleBase64()\n\ttypedef DWORD64(__stdcall *tSGMB)(IN HANDLE hProcess, IN DWORD64 dwAddr);\n\ttSGMB pSGMB;\n\n\t// SymGetModuleInfo64()\n\ttypedef BOOL(__stdcall *tSGMI)(IN HANDLE hProcess, IN DWORD64 dwAddr, OUT IMAGEHLP_MODULE64_V2 *ModuleInfo);\n\ttSGMI pSGMI;\n\n\t//  // SymGetModuleInfo64()\n\t//  typedef BOOL (__stdcall *tSGMI_V3)( IN HANDLE hProcess, IN DWORD64 dwAddr, OUT IMAGEHLP_MODULE64_V3 *ModuleInfo);\n\t//  tSGMI_V3 pSGMI_V3;\n\n\t// SymGetOptions()\n\ttypedef DWORD(__stdcall *tSGO)(VOID);\n\ttSGO pSGO;\n\n\t// SymGetSymFromAddr64()\n\ttypedef BOOL(__stdcall *tSGSFA)(IN HANDLE hProcess, IN DWORD64 dwAddr, OUT PDWORD64 pdwDisplacement, OUT PIMAGEHLP_SYMBOL64 Symbol);\n\ttSGSFA pSGSFA;\n\n\t// SymInitialize()\n\ttypedef BOOL(__stdcall *tSI)(IN HANDLE hProcess, IN PSTR UserSearchPath, IN BOOL fInvadeProcess);\n\ttSI pSI;\n\n\t// SymLoadModule64()\n\ttypedef DWORD64(__stdcall *tSLM)(IN HANDLE hProcess, IN HANDLE hFile, IN PSTR ImageName, IN PSTR ModuleName, IN DWORD64 BaseOfDll, IN DWORD SizeOfDll);\n\ttSLM pSLM;\n\n\t// SymSetOptions()\n\ttypedef DWORD(__stdcall *tSSO)(IN DWORD SymOptions);\n\ttSSO pSSO;\n\n\t// StackWalk64()\n\ttypedef BOOL(__stdcall *tSW)(\n\t\tDWORD MachineType,\n\t\tHANDLE hProcess,\n\t\tHANDLE hThread,\n\t\tLPSTACKFRAME64 StackFrame,\n\t\tPVOID ContextRecord,\n\t\tPREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,\n\t\tPFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,\n\t\tPGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,\n\t\tPTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);\n\ttSW pSW;\n\n\t// UnDecorateSymbolName()\n\ttypedef DWORD(__stdcall WINAPI *tUDSN)(PCSTR DecoratedName, PSTR UnDecoratedName, DWORD UndecoratedLength, DWORD Flags);\n\ttUDSN pUDSN;\n\n\ttypedef BOOL(__stdcall WINAPI *tSGSP)(HANDLE hProcess, PSTR SearchPath, DWORD SearchPathLength);\n\ttSGSP pSGSP;\n\n\nprivate:\n\t// **************************************** ToolHelp32 ************************\n\t#define MAX_MODULE_NAME32 255\n\t#define TH32CS_SNAPMODULE   0x00000008\n\n\t#pragma pack(push, 8)\n\ttypedef struct tagMODULEENTRY32\n\t{\n\t\tDWORD   dwSize;\n\t\tDWORD   th32ModuleID;       // This module\n\t\tDWORD   th32ProcessID;      // owning process\n\t\tDWORD   GlblcntUsage;       // Global usage count on the module\n\t\tDWORD   ProccntUsage;       // Module usage count in th32ProcessID's context\n\t\tBYTE  * modBaseAddr;        // Base address of module in th32ProcessID's context\n\t\tDWORD   modBaseSize;        // Size in bytes of module starting at modBaseAddr\n\t\tHMODULE hModule;            // The hModule of this module in th32ProcessID's context\n\t\tchar    szModule[MAX_MODULE_NAME32 + 1];\n\t\tchar    szExePath[MAX_PATH];\n\t} MODULEENTRY32;\n\ttypedef MODULEENTRY32 *  PMODULEENTRY32;\n\ttypedef MODULEENTRY32 *  LPMODULEENTRY32;\n\t#pragma pack(pop)\n\n\tBOOL GetModuleListTH32(HANDLE hProcess, DWORD pid)\n\t{\n\t\t// CreateToolhelp32Snapshot()\n\t\ttypedef HANDLE(__stdcall *tCT32S)(DWORD dwFlags, DWORD th32ProcessID);\n\t\t// Module32First()\n\t\ttypedef BOOL(__stdcall *tM32F)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);\n\t\t// Module32Next()\n\t\ttypedef BOOL(__stdcall *tM32N)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);\n\n\t\t// try both dlls...\n\t\tconst TCHAR *dllname[] = { _T(\"kernel32.dll\"), _T(\"tlhelp32.dll\") };\n\t\tHINSTANCE hToolhelp = nullptr;\n\t\ttCT32S pCT32S = nullptr;\n\t\ttM32F pM32F = nullptr;\n\t\ttM32N pM32N = nullptr;\n\n\t\tHANDLE hSnap;\n\t\tMODULEENTRY32 me;\n\t\tme.dwSize = sizeof(me);\n\t\tBOOL keepGoing;\n\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(dllname); i++)\n\t\t{\n\t\t\thToolhelp = LoadLibrary(dllname[i]);\n\t\t\tif (hToolhelp == nullptr)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpCT32S = (tCT32S)GetProcAddress(hToolhelp, \"CreateToolhelp32Snapshot\");\n\t\t\tpM32F = (tM32F)GetProcAddress(hToolhelp, \"Module32First\");\n\t\t\tpM32N = (tM32N)GetProcAddress(hToolhelp, \"Module32Next\");\n\t\t\tif ((pCT32S != nullptr) && (pM32F != nullptr) && (pM32N != nullptr))\n\t\t\t{\n\t\t\t\tbreak;  // found the functions!\n\t\t\t}\n\t\t\tFreeLibrary(hToolhelp);\n\t\t\thToolhelp = nullptr;\n\t\t}\n\n\t\tif (hToolhelp == nullptr)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\thSnap = pCT32S(TH32CS_SNAPMODULE, pid);\n\t\tif (hSnap == (HANDLE)-1)\n\t\t{\n\t\t\tFreeLibrary(hToolhelp);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tkeepGoing = !!pM32F(hSnap, &me);\n\t\tint cnt = 0;\n\t\twhile (keepGoing)\n\t\t{\n\t\t\tthis->LoadModule(hProcess, me.szExePath, me.szModule, (DWORD64)me.modBaseAddr, me.modBaseSize);\n\t\t\tcnt++;\n\t\t\tkeepGoing = !!pM32N(hSnap, &me);\n\t\t}\n\t\tCloseHandle(hSnap);\n\t\tFreeLibrary(hToolhelp);\n\t\tif (cnt <= 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\treturn TRUE;\n\t}  // GetModuleListTH32\n\n\n\n\n\n\t// **************************************** PSAPI ************************\n\ttypedef struct _MODULEINFO\n\t{\n\t\tLPVOID lpBaseOfDll;\n\t\tDWORD SizeOfImage;\n\t\tLPVOID EntryPoint;\n\t} MODULEINFO, *LPMODULEINFO;\n\n\tBOOL GetModuleListPSAPI(HANDLE hProcess)\n\t{\n\t\t// EnumProcessModules()\n\t\ttypedef BOOL(__stdcall *tEPM)(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded);\n\t\t// GetModuleFileNameEx()\n\t\ttypedef DWORD(__stdcall *tGMFNE)(HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize);\n\t\t// GetModuleBaseName()\n\t\ttypedef DWORD(__stdcall *tGMBN)(HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize);\n\t\t// GetModuleInformation()\n\t\ttypedef BOOL(__stdcall *tGMI)(HANDLE hProcess, HMODULE hModule, LPMODULEINFO pmi, DWORD nSize);\n\n\t\tHINSTANCE hPsapi;\n\t\ttEPM pEPM;\n\t\ttGMFNE pGMFNE;\n\t\ttGMBN pGMBN;\n\t\ttGMI pGMI;\n\n\t\tDWORD i;\n\t\tDWORD cbNeeded;\n\t\tMODULEINFO mi;\n\t\tHMODULE *hMods = 0;\n\t\tchar *tt = nullptr;\n\t\tchar *tt2 = nullptr;\n\t\tconst SIZE_T TTBUFLEN = 8096;\n\t\tint cnt = 0;\n\n\t\thPsapi = LoadLibrary(_T(\"psapi.dll\"));\n\t\tif (hPsapi == nullptr)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tpEPM = (tEPM)GetProcAddress(hPsapi, \"EnumProcessModules\");\n\t\tpGMFNE = (tGMFNE)GetProcAddress(hPsapi, \"GetModuleFileNameExA\");\n\t\tpGMBN = (tGMFNE)GetProcAddress(hPsapi, \"GetModuleBaseNameA\");\n\t\tpGMI = (tGMI)GetProcAddress(hPsapi, \"GetModuleInformation\");\n\t\tif ((pEPM == nullptr) || (pGMFNE == nullptr) || (pGMBN == nullptr) || (pGMI == nullptr))\n\t\t{\n\t\t\t// we couldn't find all functions\n\t\t\tFreeLibrary(hPsapi);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\thMods = (HMODULE*)malloc(sizeof(HMODULE) * (TTBUFLEN / sizeof HMODULE));\n\t\ttt = (char*)malloc(sizeof(char) * TTBUFLEN);\n\t\ttt2 = (char*)malloc(sizeof(char) * TTBUFLEN);\n\t\tif ((hMods == nullptr) || (tt == nullptr) || (tt2 == nullptr))\n\t\t{\n\t\t\tgoto cleanup;\n\t\t}\n\n\t\tif (!pEPM(hProcess, hMods, TTBUFLEN, &cbNeeded))\n\t\t{\n\t\t\tgoto cleanup;\n\t\t}\n\n\t\tif (cbNeeded > TTBUFLEN)\n\t\t{\n\t\t\tgoto cleanup;\n\t\t}\n\n\t\tfor (i = 0; i < cbNeeded / sizeof hMods[0]; i++)\n\t\t{\n\t\t\t// base address, size\n\t\t\tpGMI(hProcess, hMods[i], &mi, sizeof mi);\n\t\t\t// image file name\n\t\t\ttt[0] = 0;\n\t\t\tpGMFNE(hProcess, hMods[i], tt, TTBUFLEN);\n\t\t\t// module name\n\t\t\ttt2[0] = 0;\n\t\t\tpGMBN(hProcess, hMods[i], tt2, TTBUFLEN);\n\n\t\t\tDWORD dwRes = this->LoadModule(hProcess, tt, tt2, (DWORD64)mi.lpBaseOfDll, mi.SizeOfImage);\n\t\t\tif (dwRes != ERROR_SUCCESS)\n\t\t\t{\n\t\t\t\tthis->m_parent->OnDbgHelpErr(\"LoadModule\", dwRes, 0);\n\t\t\t}\n\t\t\tcnt++;\n\t\t}\n\n\t\tcleanup:\n\t\tif (hPsapi != nullptr)\n\t\t{\n\t\t\tFreeLibrary(hPsapi);\n\t\t}\n\t\tif (tt2 != nullptr)\n\t\t{\n\t\t\tfree(tt2);\n\t\t}\n\t\tif (tt != nullptr)\n\t\t{\n\t\t\tfree(tt);\n\t\t}\n\t\tif (hMods != nullptr)\n\t\t{\n\t\t\tfree(hMods);\n\t\t}\n\n\t\treturn cnt != 0;\n\t}  // GetModuleListPSAPI\n\n\n\n\n\n\tDWORD LoadModule(HANDLE hProcess, LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size)\n\t{\n\t\tCHAR *szImg = _strdup(img);\n\t\tCHAR *szMod = _strdup(mod);\n\t\tDWORD result = ERROR_SUCCESS;\n\t\tif ((szImg == nullptr) || (szMod == nullptr))\n\t\t{\n\t\t\tresult = ERROR_NOT_ENOUGH_MEMORY;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pSLM(hProcess, 0, szImg, szMod, baseAddr, size) == 0)\n\t\t\t{\n\t\t\t\tresult = GetLastError();\n\t\t\t}\n\t\t}\n\t\tULONGLONG fileVersion = 0;\n\t\tif ((m_parent != nullptr) && (szImg != nullptr))\n\t\t{\n\t\t\t// try to retrive the file-version:\n\t\t\tif ((this->m_parent->m_options & WinStackWalker::RetrieveFileVersion) != 0)\n\t\t\t{\n\t\t\t\tVS_FIXEDFILEINFO *fInfo = nullptr;\n\t\t\t\tDWORD dwHandle;\n\t\t\t\tDWORD dwSize = GetFileVersionInfoSizeA(szImg, &dwHandle);\n\t\t\t\tif (dwSize > 0)\n\t\t\t\t{\n\t\t\t\t\tLPVOID vData = malloc(dwSize);\n\t\t\t\t\tif (vData != nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (GetFileVersionInfoA(szImg, dwHandle, dwSize, vData) != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUINT len;\n\t\t\t\t\t\t\tTCHAR szSubBlock[] = _T(\"\\\\\");\n\t\t\t\t\t\t\tif (VerQueryValue(vData, szSubBlock, (LPVOID*)&fInfo, &len) == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfInfo = nullptr;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfileVersion = ((ULONGLONG)fInfo->dwFileVersionLS) + ((ULONGLONG)fInfo->dwFileVersionMS << 32);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfree(vData);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Retrive some additional-infos about the module\n\t\t\tIMAGEHLP_MODULE64_V2 Module;\n\t\t\tconst char *szSymType = \"-unknown-\";\n\t\t\tif (this->GetModuleInfo(hProcess, baseAddr, &Module) != FALSE)\n\t\t\t{\n\t\t\t\tswitch (Module.SymType)\n\t\t\t\t{\n\t\t\t\t\tcase SymNone:   szSymType = \"-nosymbols-\"; break;\n\t\t\t\t\tcase SymCoff:   szSymType = \"COFF\"; break;\n\t\t\t\t\tcase SymCv:     szSymType = \"CV\"; break;\n\t\t\t\t\tcase SymPdb:    szSymType = \"PDB\"; break;\n\t\t\t\t\tcase SymExport: szSymType = \"-exported-\"; break;\n\t\t\t\t\tcase SymDeferred: szSymType = \"-deferred-\"; break;\n\t\t\t\t\tcase SymSym:      szSymType = \"SYM\"; break;\n\t\t\t\t\tcase 7:           szSymType = \"DIA\"; break;\n\t\t\t\t\tcase 8:           szSymType = \"Virtual\"; break;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis->m_parent->OnLoadModule(img, mod, baseAddr, size, result, szSymType, Module.LoadedImageName, fileVersion);\n\t\t}\n\t\tif (szImg != nullptr)\n\t\t{\n\t\t\tfree(szImg);\n\t\t}\n\t\tif (szMod != nullptr)\n\t\t{\n\t\t\tfree(szMod);\n\t\t}\n\t\treturn result;\n\t}\n\n\n\n\n\npublic:\n\tBOOL LoadModules(HANDLE hProcess, DWORD dwProcessId)\n\t{\n\t\t// first try toolhelp32\n\t\tif (GetModuleListTH32(hProcess, dwProcessId))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\t// then try psapi\n\t\treturn GetModuleListPSAPI(hProcess);\n\t}\n\n\n\tBOOL GetModuleInfo(HANDLE hProcess, DWORD64 baseAddr, IMAGEHLP_MODULE64_V2 *pModuleInfo)\n\t{\n\t\tif (this->pSGMI == nullptr)\n\t\t{\n\t\t\tSetLastError(ERROR_DLL_INIT_FAILED);\n\t\t\treturn FALSE;\n\t\t}\n\t\tpModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2);\n\t\tvoid * pData = malloc(4096);  // reserve enough memory, so the bug in v6.3.5.1 does not lead to memory-overwrites...\n\t\tif (pData == nullptr)\n\t\t{\n\t\t\tSetLastError(ERROR_NOT_ENOUGH_MEMORY);\n\t\t\treturn FALSE;\n\t\t}\n\t\tmemcpy(pData, pModuleInfo, sizeof(IMAGEHLP_MODULE64_V2));\n\t\tif (this->pSGMI(hProcess, baseAddr, (IMAGEHLP_MODULE64_V2*)pData) != FALSE)\n\t\t{\n\t\t\t// only copy as much memory as is reserved...\n\t\t\tmemcpy(pModuleInfo, pData, sizeof(IMAGEHLP_MODULE64_V2));\n\t\t\tpModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2);\n\t\t\tfree(pData);\n\t\t\treturn TRUE;\n\t\t}\n\t\tfree(pData);\n\t\tSetLastError(ERROR_DLL_INIT_FAILED);\n\t\treturn FALSE;\n\t}\n};\n\n\n\n\n\n// #############################################################\nWinStackWalker::WinStackWalker(DWORD dwProcessId, HANDLE hProcess)\n{\n\tthis->m_options = OptionsAll;\n\tthis->m_modulesLoaded = FALSE;\n\tthis->m_hProcess = hProcess;\n\tthis->m_sw = new StackWalkerInternal(this, this->m_hProcess);\n\tthis->m_dwProcessId = dwProcessId;\n\tthis->m_szSymPath = nullptr;\n\tthis->m_MaxRecursionCount = 1000;\n}\n\n\n\n\n\nWinStackWalker::WinStackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess)\n{\n\tthis->m_options = options;\n\tthis->m_modulesLoaded = FALSE;\n\tthis->m_hProcess = hProcess;\n\tthis->m_sw = new StackWalkerInternal(this, this->m_hProcess);\n\tthis->m_dwProcessId = dwProcessId;\n\tif (szSymPath != nullptr)\n\t{\n\t\tthis->m_szSymPath = _strdup(szSymPath);\n\t\tthis->m_options |= SymBuildPath;\n\t}\n\telse\n\t{\n\t\tthis->m_szSymPath = nullptr;\n\t}\n\tthis->m_MaxRecursionCount = 1000;\n}\n\n\n\n\n\nWinStackWalker::~WinStackWalker()\n{\n\tif (m_szSymPath != nullptr)\n\t{\n\t\tfree(m_szSymPath);\n\t}\n\tm_szSymPath = nullptr;\n\tif (this->m_sw != nullptr)\n\t{\n\t\tdelete this->m_sw;\n\t}\n\tthis->m_sw = nullptr;\n}\n\n\n\n\n\nBOOL WinStackWalker::LoadModules()\n{\n\tif (this->m_sw == nullptr)\n\t{\n\t\tSetLastError(ERROR_DLL_INIT_FAILED);\n\t\treturn FALSE;\n\t}\n\tif (m_modulesLoaded != FALSE)\n\t{\n\t\treturn TRUE;\n\t}\n\n\t// Build the sym-path:\n\tchar *szSymPath = nullptr;\n\tif ((this->m_options & SymBuildPath) != 0)\n\t{\n\t\tconst size_t nSymPathLen = 4096;\n\t\tszSymPath = (char*)malloc(nSymPathLen);\n\t\tif (szSymPath == nullptr)\n\t\t{\n\t\t\tSetLastError(ERROR_NOT_ENOUGH_MEMORY);\n\t\t\treturn FALSE;\n\t\t}\n\t\tszSymPath[0] = 0;\n\t\t// Now first add the (optional) provided sympath:\n\t\tif (this->m_szSymPath != nullptr)\n\t\t{\n\t\t\tstrcat_s(szSymPath, nSymPathLen, this->m_szSymPath);\n\t\t\tstrcat_s(szSymPath, nSymPathLen, \";\");\n\t\t}\n\n\t\tstrcat_s(szSymPath, nSymPathLen, \".;\");\n\n\t\tconst DWORD nTempLen = 1024;\n\t\tchar szTemp[nTempLen];\n\t\t// Now add the current directory:\n\t\tif (GetCurrentDirectoryA(nTempLen, szTemp) > 0)\n\t\t{\n\t\t\tszTemp[nTempLen - 1] = 0;\n\t\t\tstrcat_s(szSymPath, nSymPathLen, szTemp);\n\t\t\tstrcat_s(szSymPath, nSymPathLen, \";\");\n\t\t}\n\n\t\t// Now add the path for the main-module:\n\t\tif (GetModuleFileNameA(nullptr, szTemp, nTempLen) > 0)\n\t\t{\n\t\t\tszTemp[nTempLen - 1] = 0;\n\t\t\tfor (char *p = (szTemp + strlen(szTemp) - 1); p >= szTemp; --p)\n\t\t\t{\n\t\t\t\t// locate the rightmost path separator\n\t\t\t\tif ((*p == '\\\\') || (*p == '/') || (*p == ':'))\n\t\t\t\t{\n\t\t\t\t\t*p = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for (search for path separator...)\n\n\t\t\tif (szTemp[0] != '\\0')\n\t\t\t{\n\t\t\t\tstrcat_s(szSymPath, nSymPathLen, szTemp);\n\t\t\t\tstrcat_s(szSymPath, nSymPathLen, \";\");\n\t\t\t}\n\t\t}\n\t\tif (GetEnvironmentVariableA(\"_NT_SYMBOL_PATH\", szTemp, nTempLen) > 0)\n\t\t{\n\t\t\tszTemp[nTempLen - 1] = 0;\n\t\t\tstrcat_s(szSymPath, nSymPathLen, szTemp);\n\t\t\tstrcat_s(szSymPath, nSymPathLen, \";\");\n\t\t}\n\t\tif (GetEnvironmentVariableA(\"_NT_ALTERNATE_SYMBOL_PATH\", szTemp, nTempLen) > 0)\n\t\t{\n\t\t\tszTemp[nTempLen - 1] = 0;\n\t\t\tstrcat_s(szSymPath, nSymPathLen, szTemp);\n\t\t\tstrcat_s(szSymPath, nSymPathLen, \";\");\n\t\t}\n\t\tif (GetEnvironmentVariableA(\"SYSTEMROOT\", szTemp, nTempLen) > 0)\n\t\t{\n\t\t\tszTemp[nTempLen - 1] = 0;\n\t\t\tstrcat_s(szSymPath, nSymPathLen, szTemp);\n\t\t\tstrcat_s(szSymPath, nSymPathLen, \";\");\n\t\t\t// also add the \"system32\"-directory:\n\t\t\tstrcat_s(szTemp, nTempLen, \"\\\\system32\");\n\t\t\tstrcat_s(szSymPath, nSymPathLen, szTemp);\n\t\t\tstrcat_s(szSymPath, nSymPathLen, \";\");\n\t\t}\n\n\t\tif ((this->m_options & SymUseSymSrv) != 0)\n\t\t{\n\t\t\tif (GetEnvironmentVariableA(\"SYSTEMDRIVE\", szTemp, nTempLen) > 0)\n\t\t\t{\n\t\t\t\tszTemp[nTempLen - 1] = 0;\n\t\t\t\tstrcat_s(szSymPath, nSymPathLen, \"SRV*\");\n\t\t\t\tstrcat_s(szSymPath, nSymPathLen, szTemp);\n\t\t\t\tstrcat_s(szSymPath, nSymPathLen, \"\\\\websymbols\");\n\t\t\t\tstrcat_s(szSymPath, nSymPathLen, \"*https://msdl.microsoft.com/download/symbols;\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstrcat_s(szSymPath, nSymPathLen, \"SRV*c:\\\\websymbols*https://msdl.microsoft.com/download/symbols;\");\n\t\t\t}\n\t\t}\n\t}  // if SymBuildPath\n\n\t// First Init the whole stuff...\n\tBOOL bRet = this->m_sw->Init(szSymPath);\n\tif (szSymPath != nullptr)\n\t{\n\t\tfree(szSymPath);\n\t\tszSymPath = nullptr;\n\t}\n\tif (bRet == FALSE)\n\t{\n\t\tthis->OnDbgHelpErr(\"Error while initializing dbghelp.dll\", 0, 0);\n\t\tSetLastError(ERROR_DLL_INIT_FAILED);\n\t\treturn FALSE;\n\t}\n\n\tbRet = this->m_sw->LoadModules(this->m_hProcess, this->m_dwProcessId);\n\tif (bRet != FALSE)\n\t{\n\t\tm_modulesLoaded = TRUE;\n\t}\n\treturn bRet;\n}\n\n\n\n\n\n// The following is used to pass the \"userData\"-Pointer to the user-provided readMemoryFunction\n// This has to be done due to a problem with the \"hProcess\"-parameter in x64\n// Because this class is in no case multi-threading-enabled (because of the limitations\n// of dbghelp.dll) it is \"safe\" to use a static-variable\nstatic WinStackWalker::PReadProcessMemoryRoutine s_readMemoryFunction = nullptr;\nstatic LPVOID s_readMemoryFunction_UserData = nullptr;\n\nBOOL WinStackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadProcessMemoryRoutine readMemoryFunction, LPVOID pUserData)\n{\n\tCONTEXT c;\n\tCallstackEntry csEntry;\n\tIMAGEHLP_SYMBOL64 *pSym = nullptr;\n\tStackWalkerInternal::IMAGEHLP_MODULE64_V2 Module;\n\tIMAGEHLP_LINE64 Line;\n\tint frameNum;\n\tbool bLastEntryCalled = true;\n\tint curRecursionCount = 0;\n\n\tif (!m_modulesLoaded)\n\t{\n\t\tthis->LoadModules();  // ignore the result...\n\t}\n\n\tif (this->m_sw->m_hDbhHelp == nullptr)\n\t{\n\t\tSetLastError(ERROR_DLL_INIT_FAILED);\n\t\treturn FALSE;\n\t}\n\n\ts_readMemoryFunction = readMemoryFunction;\n\ts_readMemoryFunction_UserData = pUserData;\n\n\tif (context == nullptr)\n\t{\n\t\t// If no context is provided, capture the context\n\t\tif (hThread == GetCurrentThread())\n\t\t{\n\t\t\tGET_CURRENT_CONTEXT(c, USED_CONTEXT_FLAGS);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSuspendThread(hThread);\n\t\t\tmemset(&c, 0, sizeof(CONTEXT));\n\t\t\tc.ContextFlags = USED_CONTEXT_FLAGS;\n\t\t\tif (GetThreadContext(hThread, &c) == FALSE)\n\t\t\t{\n\t\t\t\tResumeThread(hThread);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tc = *context;\n\t}\n\n\t// init STACKFRAME for first call\n\tSTACKFRAME64 s;  // in / out stackframe\n\tmemset(&s, 0, sizeof(s));\n\tDWORD imageType;\n\t#ifdef _M_IX86\n\t\t// normally, call ImageNtHeader() and use machine info from PE header\n\t\timageType = IMAGE_FILE_MACHINE_I386;\n\t\ts.AddrPC.Offset = c.Eip;\n\t\ts.AddrPC.Mode = AddrModeFlat;\n\t\ts.AddrFrame.Offset = c.Ebp;\n\t\ts.AddrFrame.Mode = AddrModeFlat;\n\t\ts.AddrStack.Offset = c.Esp;\n\t\ts.AddrStack.Mode = AddrModeFlat;\n\t#elif _M_X64\n\t\timageType = IMAGE_FILE_MACHINE_AMD64;\n\t\ts.AddrPC.Offset = c.Rip;\n\t\ts.AddrPC.Mode = AddrModeFlat;\n\t\ts.AddrFrame.Offset = c.Rsp;\n\t\ts.AddrFrame.Mode = AddrModeFlat;\n\t\ts.AddrStack.Offset = c.Rsp;\n\t\ts.AddrStack.Mode = AddrModeFlat;\n\t#elif _M_IA64\n\t\timageType = IMAGE_FILE_MACHINE_IA64;\n\t\ts.AddrPC.Offset = c.StIIP;\n\t\ts.AddrPC.Mode = AddrModeFlat;\n\t\ts.AddrFrame.Offset = c.IntSp;\n\t\ts.AddrFrame.Mode = AddrModeFlat;\n\t\ts.AddrBStore.Offset = c.RsBSP;\n\t\ts.AddrBStore.Mode = AddrModeFlat;\n\t\ts.AddrStack.Offset = c.IntSp;\n\t\ts.AddrStack.Mode = AddrModeFlat;\n\t#else\n\t\t#error \"Platform not supported!\"\n\t#endif\n\n\tpSym = (IMAGEHLP_SYMBOL64 *)malloc(sizeof(IMAGEHLP_SYMBOL64) + STACKWALK_MAX_NAMELEN);\n\tif (!pSym)\n\t{\n\t\tgoto cleanup;  // not enough memory...\n\t}\n\tmemset(pSym, 0, sizeof(IMAGEHLP_SYMBOL64) + STACKWALK_MAX_NAMELEN);\n\tpSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);\n\tpSym->MaxNameLength = STACKWALK_MAX_NAMELEN;\n\n\tmemset(&Line, 0, sizeof(Line));\n\tLine.SizeOfStruct = sizeof(Line);\n\n\tmemset(&Module, 0, sizeof(Module));\n\tModule.SizeOfStruct = sizeof(Module);\n\n\tfor (frameNum = 0; ; ++frameNum)\n\t{\n\t\t// get next stack frame (StackWalk64(), SymFunctionTableAccess64(), SymGetModuleBase64())\n\t\t// if this returns ERROR_INVALID_ADDRESS (487) or ERROR_NOACCESS (998), you can\n\t\t// assume that either you are done, or that the stack is so hosed that the next\n\t\t// deeper frame could not be found.\n\t\t// CONTEXT need not to be suplied if imageTyp is IMAGE_FILE_MACHINE_I386!\n\t\tif (!this->m_sw->pSW(imageType, this->m_hProcess, hThread, &s, &c, myReadProcMem, this->m_sw->pSFTA, this->m_sw->pSGMB, nullptr))\n\t\t{\n\t\t\t// INFO: \"StackWalk64\" does not set \"GetLastError\"...\n\t\t\tthis->OnDbgHelpErr(\"StackWalk64\", 0, s.AddrPC.Offset);\n\t\t\tbreak;\n\t\t}\n\n\t\tcsEntry.offset = s.AddrPC.Offset;\n\t\tcsEntry.name[0] = 0;\n\t\tcsEntry.undName[0] = 0;\n\t\tcsEntry.undFullName[0] = 0;\n\t\tcsEntry.offsetFromSmybol = 0;\n\t\tcsEntry.offsetFromLine = 0;\n\t\tcsEntry.lineFileName[0] = 0;\n\t\tcsEntry.lineNumber = 0;\n\t\tcsEntry.loadedImageName[0] = 0;\n\t\tcsEntry.moduleName[0] = 0;\n\t\tif (s.AddrPC.Offset == s.AddrReturn.Offset)\n\t\t{\n\t\t\tif ((this->m_MaxRecursionCount > 0) && (curRecursionCount > m_MaxRecursionCount))\n\t\t\t{\n\t\t\t\tthis->OnDbgHelpErr(\"StackWalk64-Endless-Callstack!\", 0, s.AddrPC.Offset);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurRecursionCount++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcurRecursionCount = 0;\n\t\t}\n\t\tif (s.AddrPC.Offset != 0)\n\t\t{\n\t\t\t// we seem to have a valid PC\n\t\t\t// show procedure info (SymGetSymFromAddr64())\n\t\t\tif (this->m_sw->pSGSFA(this->m_hProcess, s.AddrPC.Offset, &(csEntry.offsetFromSmybol), pSym) != FALSE)\n\t\t\t{\n\t\t\t\tMyStrCpy(csEntry.name, pSym->Name);\n\t\t\t\t// UnDecorateSymbolName()\n\t\t\t\tthis->m_sw->pUDSN(pSym->Name, csEntry.undName, static_cast<DWORD>(sizeof(csEntry.undName)), UNDNAME_NAME_ONLY);\n\t\t\t\tthis->m_sw->pUDSN(pSym->Name, csEntry.undFullName, static_cast<DWORD>(sizeof(csEntry.undFullName)), UNDNAME_COMPLETE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis->OnDbgHelpErr(\"SymGetSymFromAddr64\", GetLastError(), s.AddrPC.Offset);\n\t\t\t}\n\n\t\t\t// show line number info, NT5.0-method (SymGetLineFromAddr64())\n\t\t\tif (this->m_sw->pSGLFA != nullptr)\n\t\t\t{\n\t\t\t\tif (this->m_sw->pSGLFA(this->m_hProcess, s.AddrPC.Offset, &(csEntry.offsetFromLine), &Line) != FALSE)\n\t\t\t\t{\n\t\t\t\t\tcsEntry.lineNumber = Line.LineNumber;\n\t\t\t\t\tMyStrCpy(csEntry.lineFileName, Line.FileName);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis->OnDbgHelpErr(\"SymGetLineFromAddr64\", GetLastError(), s.AddrPC.Offset);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// show module info (SymGetModuleInfo64())\n\t\t\tif (this->m_sw->GetModuleInfo(this->m_hProcess, s.AddrPC.Offset, &Module) != FALSE)\n\t\t\t{\n\t\t\t\tswitch (Module.SymType)\n\t\t\t\t{\n\t\t\t\t\tcase SymNone:     csEntry.symTypeString = \"-nosymbols-\"; break;\n\t\t\t\t\tcase SymCoff:     csEntry.symTypeString = \"COFF\"; break;\n\t\t\t\t\tcase SymCv:       csEntry.symTypeString = \"CV\"; break;\n\t\t\t\t\tcase SymPdb:      csEntry.symTypeString = \"PDB\"; break;\n\t\t\t\t\tcase SymExport:   csEntry.symTypeString = \"-exported-\"; break;\n\t\t\t\t\tcase SymDeferred: csEntry.symTypeString = \"-deferred-\"; break;\n\t\t\t\t\tcase SymSym:      csEntry.symTypeString = \"SYM\"; break;\n\t\t\t\t\tcase SymDia:      csEntry.symTypeString = \"DIA\"; break;\n\t\t\t\t\tcase 8:           csEntry.symTypeString = \"Virtual\"; break;\n\t\t\t\t\tdefault:          csEntry.symTypeString = nullptr; break;\n\t\t\t\t}\n\n\t\t\t\tMyStrCpy(csEntry.moduleName, Module.ModuleName);\n\t\t\t\tcsEntry.baseOfImage = Module.BaseOfImage;\n\t\t\t\tMyStrCpy(csEntry.loadedImageName, Module.LoadedImageName);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis->OnDbgHelpErr(\"SymGetModuleInfo64\", GetLastError(), s.AddrPC.Offset);\n\t\t\t}\n\t\t}\n\n\t\tCallstackEntryType et = nextEntry;\n\t\tif (frameNum == 0)\n\t\t{\n\t\t\tet = firstEntry;\n\t\t}\n\t\tbLastEntryCalled = false;\n\t\tthis->OnCallstackEntry(et, csEntry);\n\n\t\tif (s.AddrReturn.Offset == 0)\n\t\t{\n\t\t\tbLastEntryCalled = true;\n\t\t\tthis->OnCallstackEntry(lastEntry, csEntry);\n\t\t\tSetLastError(ERROR_SUCCESS);\n\t\t\tbreak;\n\t\t}\n\t}  // for (frameNum)\n\ncleanup:\n\tif (pSym)\n\t{\n\t\tfree(pSym);\n\t}\n\n\tif (bLastEntryCalled == false)\n\t{\n\t\tthis->OnCallstackEntry(lastEntry, csEntry);\n\t}\n\n\tif (context == nullptr)\n\t{\n\t\tResumeThread(hThread);\n\t}\n\n\treturn TRUE;\n}\n\n\n\n\n\nBOOL __stdcall WinStackWalker::myReadProcMem(\n\tHANDLE      hProcess,\n\tDWORD64     qwBaseAddress,\n\tPVOID       lpBuffer,\n\tDWORD       nSize,\n\tLPDWORD     lpNumberOfBytesRead\n)\n{\n\tif (s_readMemoryFunction == nullptr)\n\t{\n\t\tSIZE_T st;\n\t\tBOOL bRet = ReadProcessMemory(hProcess, (LPVOID)qwBaseAddress, lpBuffer, nSize, &st);\n\t\t*lpNumberOfBytesRead = (DWORD)st;\n\t\t// printf(\"ReadMemory: hProcess: %p, baseAddr: %p, buffer: %p, size: %d, read: %d, result: %d\\n\", hProcess, (LPVOID) qwBaseAddress, lpBuffer, nSize, (DWORD) st, (DWORD) bRet);\n\t\treturn bRet;\n\t}\n\telse\n\t{\n\t\treturn s_readMemoryFunction(hProcess, qwBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead, s_readMemoryFunction_UserData);\n\t}\n}\n\n\n\n\n\nvoid WinStackWalker::OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion)\n{\n\t/*\n\t// Uncomment to be notified of loaded DLL modules.\n\n\tchar buffer[STACKWALK_MAX_NAMELEN];\n\tif (fileVersion == 0)\n\t{\n\t\t_snprintf_s(buffer, sizeof(buffer), \"%s:%s (%p), size: %d (result: %d), SymType: '%s', PDB: '%s'\\n\", img, mod, (LPVOID)baseAddr, size, result, symType, pdbName);\n\t}\n\telse\n\t{\n\t\tDWORD v4 = (DWORD)fileVersion & 0xFFFF;\n\t\tDWORD v3 = (DWORD)(fileVersion >> 16) & 0xFFFF;\n\t\tDWORD v2 = (DWORD)(fileVersion >> 32) & 0xFFFF;\n\t\tDWORD v1 = (DWORD)(fileVersion >> 48) & 0xFFFF;\n\t\t_snprintf_s(buffer, sizeof(buffer), \"%s:%s (%p), size: %d (result: %d), SymType: '%s', PDB: '%s', fileVersion: %d.%d.%d.%d\\n\", img, mod, (LPVOID)baseAddr, size, result, symType, pdbName, v1, v2, v3, v4);\n\t}\n\tOnOutput(buffer);\n\t*/\n}\n\n\n\n\n\nvoid WinStackWalker::OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry)\n{\n\tCHAR buffer[STACKWALK_MAX_NAMELEN + MAX_PATH + 100];\n\tif ((eType == lastEntry) || (entry.offset == 0))\n\t{\n\t\treturn;\n\t}\n\tif (entry.undFullName[0] != 0)\n\t{\n\t\tMyStrCpy(entry.name, entry.undFullName);\n\t}\n\telse if (entry.undName[0] != 0)\n\t{\n\t\tMyStrCpy(entry.name, entry.undName);\n\t}\n\telse if (entry.name[0] == 0)\n\t{\n\t\tMyStrCpy(entry.name, \"(function-name not available)\");\n\t}\n\tif (entry.lineFileName[0] == 0)\n\t{\n\t\tMyStrCpy(entry.lineFileName, \"(filename not available)\");\n\t\tif (entry.moduleName[0] == 0)\n\t\t{\n\t\t\tMyStrCpy(entry.moduleName, \"(module-name not available)\");\n\t\t}\n\t\t_snprintf_s(buffer, sizeof(buffer), \"%p (%s): %s: %s\\n\", (LPVOID)entry.offset, entry.moduleName, entry.lineFileName, entry.name);\n\t}\n\telse\n\t{\n\t\t_snprintf_s(buffer, sizeof(buffer), \"%s (%d): %s\\n\", entry.lineFileName, entry.lineNumber, entry.name);\n\t}\n\tOnOutput(buffer);\n}\n\n\n\n\n\nvoid WinStackWalker::OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr)\n{\n\tCHAR buffer[STACKWALK_MAX_NAMELEN];\n\t_snprintf_s(buffer, sizeof(buffer), \"ERROR: %s, GetLastError: %d (Address: %p)\\n\", szFuncName, gle, (LPVOID)addr);\n\tOnOutput(buffer);\n}\n\n\n\n\n\nvoid WinStackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)\n{\n\tCHAR buffer[STACKWALK_MAX_NAMELEN];\n\t_snprintf_s(buffer, sizeof(buffer), \"SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\\n\", szSearchPath, symOptions, szUserName);\n\tOnOutput(buffer);\n\t// Also display the OS-version\n\tOSVERSIONINFOEXA ver;\n\tZeroMemory(&ver, sizeof(OSVERSIONINFOEXA));\n\tver.dwOSVersionInfoSize = sizeof(ver);\n\tif (GetVersionExA((OSVERSIONINFOA*)&ver) != FALSE)\n\t{\n\t\t_snprintf_s(buffer, sizeof(buffer), \"OS-Version: %d.%d.%d (%s) 0x%x-0x%x\\n\",\n\t\t\tver.dwMajorVersion, ver.dwMinorVersion, ver.dwBuildNumber,\n\t\t\tver.szCSDVersion, ver.wSuiteMask, ver.wProductType\n\t\t);\n\t\tOnOutput(buffer);\n\t}\n}\n\n\n\n\n\nvoid WinStackWalker::OnOutput(LPCSTR buffer)\n{\n\tOutputDebugStringA(buffer);\n}\n\n\n\n\n#endif  // _WIN32\n"
  },
  {
    "path": "src/OSSupport/WinStackWalker.h",
    "content": "// WinStackWalker.h\n\n// Declares the stack walking for Windows binaries\n\n/*\nLICENSE (https://www.opensource.org/licenses/bsd-license.php)\n\nCopyright (c) 2005-2010, Jochen Kalmbach\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice,\nthis list of conditions and the following disclaimer.\nRedistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand / or other materials provided with the distribution.\nNeither the name of Jochen Kalmbach nor the names of its contributors may be\nused to endorse or promote products derived from this software without\nspecific prior written permission.\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#pragma once\n\n\n\n\n\n#ifdef _WIN32  // This is Windows-only code\n\n\n\n\n\nclass StackWalkerInternal;  // forward\nclass WinStackWalker\n{\npublic:\n\tenum StackWalkOptions\n\t{\n\t\t// No addition info will be retrived\n\t\t// (only the address is available)\n\t\tRetrieveNone = 0,\n\n\t\t// Try to get the symbol-name\n\t\tRetrieveSymbol = 1,\n\n\t\t// Try to get the line for this symbol\n\t\tRetrieveLine = 2,\n\n\t\t// Try to retrieve the module-infos\n\t\tRetrieveModuleInfo = 4,\n\n\t\t// Also retrieve the version for the DLL / EXE\n\t\tRetrieveFileVersion = 8,\n\n\t\t// Contains all the abouve\n\t\tRetrieveVerbose = 0xF,\n\n\t\t// Generate a \"good\" symbol-search-path\n\t\tSymBuildPath = 0x10,\n\n\t\t// Also use the public Microsoft-Symbol-Server\n\t\tSymUseSymSrv = 0x20,\n\n\t\t// Contains all the abouve \"Sym\"-options\n\t\tSymAll = 0x30,\n\n\t\t// Contains all options (default)\n\t\tOptionsAll = 0x3F\n\t};\n\n\tWinStackWalker(\n\t\tint options = OptionsAll,\n\t\tLPCSTR szSymPath = nullptr,\n\t\tDWORD dwProcessId = GetCurrentProcessId(),\n\t\tHANDLE hProcess = GetCurrentProcess()\n\t);\n\n\tWinStackWalker(DWORD dwProcessId, HANDLE hProcess);\n\tvirtual ~WinStackWalker();\n\n\ttypedef BOOL(__stdcall *PReadProcessMemoryRoutine)(\n\t\tHANDLE      hProcess,\n\t\tDWORD64     qwBaseAddress,\n\t\tPVOID       lpBuffer,\n\t\tDWORD       nSize,\n\t\tLPDWORD     lpNumberOfBytesRead,\n\t\tLPVOID      pUserData  // optional data, which was passed in \"ShowCallstack\"\n\t);\n\n\tBOOL LoadModules();\n\n\tBOOL ShowCallstack(\n\t\tHANDLE hThread = GetCurrentThread(),\n\t\tconst CONTEXT *context = nullptr,\n\t\tPReadProcessMemoryRoutine readMemoryFunction = nullptr,\n\t\tLPVOID pUserData = nullptr  // optional to identify some data in the 'readMemoryFunction'-callback\n\t);\n\nprotected:\n\tenum\n\t{\n\t\tSTACKWALK_MAX_NAMELEN = 1024,  ///< Max name length for found symbols\n\t};\n\nprotected:\n\t// Entry for each Callstack-Entry\n\tstruct CallstackEntry\n\t{\n\t\tDWORD64 offset;  // if 0, we have no valid entry\n\t\tCHAR name[STACKWALK_MAX_NAMELEN];\n\t\tCHAR undName[STACKWALK_MAX_NAMELEN];\n\t\tCHAR undFullName[STACKWALK_MAX_NAMELEN];\n\t\tDWORD64 offsetFromSmybol;\n\t\tDWORD offsetFromLine;\n\t\tDWORD lineNumber;\n\t\tCHAR lineFileName[STACKWALK_MAX_NAMELEN];\n\t\tDWORD symType;\n\t\tLPCSTR symTypeString;\n\t\tCHAR moduleName[STACKWALK_MAX_NAMELEN];\n\t\tDWORD64 baseOfImage;\n\t\tCHAR loadedImageName[STACKWALK_MAX_NAMELEN];\n\t};\n\n\tenum CallstackEntryType { firstEntry, nextEntry, lastEntry };\n\n\tvirtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName);\n\tvirtual void OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion);\n\tvirtual void OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry);\n\tvirtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr);\n\tvirtual void OnOutput(LPCSTR szText);\n\n\tStackWalkerInternal *m_sw;\n\tHANDLE m_hProcess;\n\tDWORD m_dwProcessId;\n\tBOOL m_modulesLoaded;\n\tLPSTR m_szSymPath;\n\n\tint m_options;\n\tint m_MaxRecursionCount;\n\n\tstatic BOOL __stdcall myReadProcMem(HANDLE hProcess, DWORD64 qwBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);\n\n\tfriend StackWalkerInternal;\n};\n\n\n\n\n#define GET_CURRENT_CONTEXT(c, contextFlags) \\\n\tdo \\\n\t{ \\\n\t\tmemset(&c, 0, sizeof(CONTEXT)); \\\n\t\tc.ContextFlags = contextFlags; \\\n\t\tRtlCaptureContext(&c); \\\n\t} while (false);\n\n\n\n\n#endif  // _WIN32\n"
  },
  {
    "path": "src/OpaqueWorld.h",
    "content": "\n#pragma once\n\n// fwd:\nclass cBroadcastInterface;\nclass cChunkInterface;\nclass cForEachChunkProvider;\nclass cWorld;\nclass cWorldInterface;\n\n/** Utilities to allow casting a cWorld to one of its interfaces without including World.h. */\nnamespace World\n{\n\t// Defined in World.cpp\n\tcBroadcastInterface *   GetBroadcastInterface(cWorld * a_World);\n\tcForEachChunkProvider * GetFECProvider       (cWorld * a_World);\n\tcWorldInterface *       GetWorldInterface    (cWorld * a_World);\n\n\tinline cBroadcastInterface &   GetBroadcastInterface(cWorld & a_World) { return *GetBroadcastInterface(&a_World); }\n\tinline cForEachChunkProvider & GetFECProvider       (cWorld & a_World) { return *GetFECProvider(&a_World); }\n\tinline cWorldInterface &       GetWorldInterface    (cWorld & a_World) { return *GetWorldInterface(&a_World); }\n\n\t// cChunkInterface is more like a pimpl for cChunkMap than an interface so it needs to be returned by value\n\tcChunkInterface GetChunkInterface(cWorld & a_World);\n}\n"
  },
  {
    "path": "src/OverridesSettingsRepository.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"OverridesSettingsRepository.h\"\n\ncOverridesSettingsRepository::cOverridesSettingsRepository(std::unique_ptr<cSettingsRepositoryInterface> a_Main, cSettingsRepositoryInterface & a_Overrides) :\n\tm_Main(std::move(a_Main)),\n\tm_Overrides(&a_Overrides)\n{\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::KeyExists(const AString a_keyName) const\n{\n\treturn m_Overrides->KeyExists(a_keyName) || m_Main->KeyExists(a_keyName);\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::HasValue(const AString & a_KeyName, const AString & a_ValueName) const\n{\n\treturn m_Overrides->HasValue(a_KeyName, a_ValueName) || m_Main->HasValue(a_KeyName, a_ValueName);\n}\n\n\n\n\n\nint cOverridesSettingsRepository::AddKeyName(const AString & a_keyname)\n{\n\n\tif (m_Overrides->KeyExists(a_keyname))\n\t{\n\t\tm_Overrides->AddKeyName(a_keyname);\n\t\treturn 0;\n\t}\n\n\treturn m_Main->AddKeyName(a_keyname);\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::AddKeyComment(const AString & a_keyname, const AString & a_comment)\n{\n\tif (m_Overrides->KeyExists(a_keyname))\n\t{\n\t\treturn m_Overrides->AddKeyComment(a_keyname, a_comment);\n\t}\n\n\treturn m_Main->AddKeyComment(a_keyname, a_comment);\n}\n\n\n\n\n\nAString cOverridesSettingsRepository::GetKeyComment(const AString & a_keyname, const int a_commentID) const\n{\n\n\tif (m_Overrides->KeyExists(a_keyname))\n\t{\n\t\treturn m_Overrides->GetKeyComment(a_keyname, a_commentID);\n\t}\n\n\treturn m_Main->GetKeyComment(a_keyname, a_commentID);\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::DeleteKeyComment(const AString & a_keyname, const int a_commentID)\n{\n\tif (m_Overrides->KeyExists(a_keyname))\n\t{\n\t\treturn m_Overrides->DeleteKeyComment(a_keyname, a_commentID);\n\t}\n\n\treturn m_Main->DeleteKeyComment(a_keyname, a_commentID);\n}\n\n\n\n\n\nvoid cOverridesSettingsRepository::AddValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value)\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\tm_Overrides->AddValue(a_KeyName, a_ValueName, a_Value);\n\t}\n\telse\n\t{\n\t\tm_Main->AddValue(a_KeyName, a_ValueName, a_Value);\n\t}\n}\n\n\n\n\n\nstd::vector<std::pair<AString, AString>> cOverridesSettingsRepository::GetValues(AString a_keyName)\n{\n\tauto overrides = m_Overrides->GetValues(a_keyName);\n\tauto main = m_Main->GetValues(a_keyName);\n\n\tauto ret = overrides;\n\n\tfor (const auto & mainpair : main)\n\t{\n\t\tbool found = false;\n\t\tfor (const auto & overridepair : overrides)\n\t\t{\n\t\t\tif (overridepair.first == mainpair.first)\n\t\t\t{\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!found)\n\t\t{\n\t\t\tret.push_back(mainpair);\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n\n\nAString cOverridesSettingsRepository::GetValue(const AString & a_KeyName, const AString & a_ValueName, const AString & defValue) const\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\treturn m_Overrides->GetValue(a_KeyName, a_ValueName, defValue);\n\t}\n\telse\n\t{\n\t\treturn m_Main->GetValue(a_KeyName, a_ValueName, defValue);\n\t}\n}\n\n\n\n\n\nAString cOverridesSettingsRepository::GetValueSet (const AString & a_KeyName, const AString & a_ValueName, const AString & defValue)\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\treturn m_Overrides->GetValueSet(a_KeyName, a_ValueName, defValue);\n\t}\n\telse\n\t{\n\t\treturn m_Main->GetValueSet(a_KeyName, a_ValueName, defValue);\n\t}\n}\n\n\n\n\n\nint cOverridesSettingsRepository::GetValueSetI(const AString & a_KeyName, const AString & a_ValueName, const int defValue)\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\treturn m_Overrides->GetValueSetI(a_KeyName, a_ValueName, defValue);\n\t}\n\telse\n\t{\n\t\treturn m_Main->GetValueSetI(a_KeyName, a_ValueName, defValue);\n\t}\n}\n\n\n\n\n\nInt64 cOverridesSettingsRepository::GetValueSetI(const AString & a_KeyName, const AString & a_ValueName, const Int64 defValue)\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\treturn m_Overrides->GetValueSetI(a_KeyName, a_ValueName, defValue);\n\t}\n\telse\n\t{\n\t\treturn m_Main->GetValueSetI(a_KeyName, a_ValueName, defValue);\n\t}\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::GetValueSetB(const AString & a_KeyName, const AString & a_ValueName, const bool defValue)\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\treturn m_Overrides->GetValueSetB(a_KeyName, a_ValueName, defValue);\n\t}\n\telse\n\t{\n\t\treturn m_Main->GetValueSetB(a_KeyName, a_ValueName, defValue);\n\t}\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::SetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists)\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\treturn m_Overrides->SetValue(a_KeyName, a_ValueName, a_Value, a_CreateIfNotExists);\n\t}\n\telse\n\t{\n\t\treturn m_Main->SetValue(a_KeyName, a_ValueName, a_Value, a_CreateIfNotExists);\n\t}\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists)\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\treturn m_Overrides->SetValueI(a_KeyName, a_ValueName, a_Value, a_CreateIfNotExists);\n\t}\n\telse\n\t{\n\t\treturn m_Main->SetValueI(a_KeyName, a_ValueName, a_Value, a_CreateIfNotExists);\n\t}\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::DeleteValue(const AString & a_KeyName, const AString & a_ValueName)\n{\n\tif (m_Overrides->HasValue(a_KeyName, a_ValueName))\n\t{\n\t\treturn m_Overrides->DeleteValue(a_KeyName, a_ValueName);\n\t}\n\telse\n\t{\n\t\treturn m_Main->DeleteValue(a_KeyName, a_ValueName);\n\t}\n}\n\n\n\n\n\nbool cOverridesSettingsRepository::Flush()\n{\n\treturn m_Overrides->Flush() && m_Main->Flush();\n}\n\n"
  },
  {
    "path": "src/OverridesSettingsRepository.h",
    "content": "\n#pragma once\n\n#include \"SettingsRepositoryInterface.h\"\n\nclass cOverridesSettingsRepository : public cSettingsRepositoryInterface\n{\n\npublic:\n\tcOverridesSettingsRepository(std::unique_ptr<cSettingsRepositoryInterface> a_Main, cSettingsRepositoryInterface & a_Overrides);\n\n\tvirtual ~cOverridesSettingsRepository() override = default;\n\n\tvirtual bool KeyExists(const AString keyname) const override;\n\n\tvirtual bool HasValue(const AString & a_KeyName, const AString & a_ValueName) const override;\n\n\tvirtual int AddKeyName(const AString & keyname) override;\n\n\tvirtual bool AddKeyComment(const AString & keyname, const AString & comment) override;\n\n\tvirtual AString GetKeyComment(const AString & keyname, const int commentID) const override;\n\n\tvirtual bool DeleteKeyComment(const AString & keyname, const int commentID) override;\n\n\tvirtual void AddValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value) override;\n\n\tvirtual std::vector<std::pair<AString, AString>> GetValues(AString a_keyName) override;\n\n\tvirtual AString GetValue (const AString & keyname, const AString & valuename, const AString & defValue = \"\")    const override;\n\n\tvirtual AString GetValueSet (const AString & keyname, const AString & valuename, const AString & defValue = \"\") override;\n\tvirtual int     GetValueSetI(const AString & keyname, const AString & valuename, const int       defValue = 0) override;\n\tvirtual Int64   GetValueSetI(const AString & keyname, const AString & valuename, const Int64     defValue = 0) override;\n\tvirtual bool    GetValueSetB(const AString & keyname, const AString & valuename, const bool      defValue = false) override;\n\n\tvirtual bool SetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists = true) override;\n\tvirtual bool SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists = true) override;\n\n\tvirtual bool DeleteValue(const AString & keyname, const AString & valuename) override;\n\n\tvirtual bool Flush() override;\n\nprivate:\n\n\tstd::unique_ptr<cSettingsRepositoryInterface> m_Main;\n\tcSettingsRepositoryInterface * m_Overrides;\n\n};\n\n"
  },
  {
    "path": "src/PalettedBlockArea.cpp",
    "content": "#include \"Globals.h\"\n#include \"PalettedBlockArea.h\"\n\n\n\n\n\nPalettedBlockArea::PalettedBlockArea()\n{\n\t// Nothing needed yet\n}\n\n\n\n\n\nPalettedBlockArea PalettedBlockArea::createFilled(Vector3i aSize, const AString & aBlockTypeName, const BlockState & aBlockState)\n{\n\tASSERT(aSize.x > 0);\n\tASSERT(aSize.y > 0);\n\tASSERT(aSize.z > 0);\n\n\tPalettedBlockArea res;\n\tauto numBlocks = static_cast<UInt64>(aSize.x) * static_cast<UInt64>(aSize.y) * static_cast<UInt64>(aSize.z);\n\tif (numBlocks >= std::numeric_limits<UInt32>::max())\n\t{\n\t\t// We use 32-bit indices in some functions (for ARM speed), so we need the entire area to fit into UInt32\n\t\tthrow std::runtime_error(\"Size is too large\");\n\t}\n\tres.mSize = aSize;\n\tres.mBlocks.resize(static_cast<size_t>(numBlocks));\n\tres.fill(aBlockTypeName, aBlockState);\n\treturn res;\n}\n\n\n\n\n\ncCuboid PalettedBlockArea::whole() const\n{\n\treturn cCuboid(Vector3i(), mSize);\n}\n\n\n\n\n\nvoid PalettedBlockArea::setBlock(Vector3i aPos, const AString & aBlockTypeName, const BlockState & aBlockState)\n{\n\tsetBlock(aPos, paletteIndex(aBlockTypeName, aBlockState));\n}\n\n\n\n\n\nvoid PalettedBlockArea::setBlock(Vector3i aPos, UInt32 aPaletteIndex)\n{\n\tASSERT(isPositionValid(aPos));\n\tASSERT(aPaletteIndex < mPalette.count());\n\n\tauto idx = positionToIndex(aPos);\n\tmBlocks[idx] = aPaletteIndex;\n}\n\n\n\n\n\nUInt32 PalettedBlockArea::paletteIndex(const AString & aBlockTypeName, const BlockState & aBlockState)\n{\n\treturn mPalette.index(aBlockTypeName, aBlockState);\n}\n\n\n\n\n\nstd::pair<UInt32, bool> PalettedBlockArea::maybePaletteIndex(const AString & aBlockTypeName, const BlockState & aBlockState) const\n{\n\treturn mPalette.maybeIndex(aBlockTypeName, aBlockState);\n}\n\n\n\n\n\nUInt32 PalettedBlockArea::blockPaletteIndex(Vector3i aPos) const\n{\n\tauto idx = positionToIndex(aPos);\n\treturn mBlocks[idx];\n}\n\n\n\n\n\nconst std::pair<AString, BlockState> & PalettedBlockArea::block(Vector3i aPos) const\n{\n\treturn paletteEntry(blockPaletteIndex(aPos));\n}\n\n\n\n\n\nconst std::pair<AString, BlockState> & PalettedBlockArea::paletteEntry(UInt32 aPaletteIndex) const\n{\n\treturn mPalette.entry(aPaletteIndex);\n}\n\n\n\n\n\nbool PalettedBlockArea::isPositionValid(Vector3i aPos) const\n{\n\treturn (\n\t\t(aPos.x >= 0) && (aPos.y >= 0) && (aPos.z >= 0) &&              // Non-negative coords\n\t\t(aPos.x < mSize.x) && (aPos.y < mSize.y) && (aPos.z < mSize.z)  // Fit into size\n\t);\n}\n\n\n\n\n\nvoid PalettedBlockArea::fill(const AString & aBlockTypeName, const BlockState & aBlockState)\n{\n\tBlockTypePalette btp;\n\tauto idx = btp.index(aBlockTypeName, aBlockState);\n\tstd::swap(mPalette, btp);\n\tstd::fill(mBlocks.begin(), mBlocks.end(), idx);\n}\n\n\n\n\n\nvoid PalettedBlockArea::paste(const PalettedBlockArea & aSrc, const cCuboid & aSrcCuboid, Vector3i aDstOrigin)\n{\n\t// Clamp the src cuboid, first by src itself, then by this PBA's coord range:\n\tcCuboid srcCuboid(aSrcCuboid);\n\tsrcCuboid.Sort();\n\tsrcCuboid.Clamp(aSrc.whole());\n\tVector3i maxSize = mSize - aDstOrigin;\n\tsrcCuboid.ClampSize(maxSize);\n\tVector3i dstOrigin(aDstOrigin);\n\n\t// If any aDstOrigin coord is lower than 0, adjust the coord and src cuboid size:\n\tif (dstOrigin.x < 0)\n\t{\n\t\tsrcCuboid.p1.x -= dstOrigin.x;\n\t\tif (srcCuboid.p1.x >= srcCuboid.p2.x)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tdstOrigin.x = 0;\n\t}\n\tif (dstOrigin.y < 0)\n\t{\n\t\tsrcCuboid.p1.y -= dstOrigin.y;\n\t\tif (srcCuboid.p1.y >= srcCuboid.p2.y)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tdstOrigin.y = 0;\n\t}\n\tif (dstOrigin.z < 0)\n\t{\n\t\tsrcCuboid.p1.z -= dstOrigin.z;\n\t\tif (srcCuboid.p1.z >= srcCuboid.p2.z)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tdstOrigin.z = 0;\n\t}\n\n\t// Create a transform map from aSrc's palette to our palette:\n\tauto paletteTransform = mPalette.createTransformMapAddMissing(aSrc.mPalette);\n\n\t// Copy the data:\n\tUInt32 srcStrideY = static_cast<UInt32>(aSrc.size().x * aSrc.size().z);\n\tUInt32 srcStrideZ = static_cast<UInt32>(aSrc.size().x);\n\tUInt32 dstStrideY = static_cast<UInt32>(mSize.x * mSize.z);\n\tUInt32 dstStrideZ = static_cast<UInt32>(mSize.x);\n\tUInt32 minX = static_cast<UInt32>(srcCuboid.p1.x);\n\tUInt32 maxX = static_cast<UInt32>(srcCuboid.p2.x);\n\tUInt32 minY = static_cast<UInt32>(srcCuboid.p1.y);\n\tUInt32 maxY = static_cast<UInt32>(srcCuboid.p2.y);\n\tUInt32 minZ = static_cast<UInt32>(srcCuboid.p1.z);\n\tUInt32 maxZ = static_cast<UInt32>(srcCuboid.p2.z);\n\tUInt32 dstX = static_cast<UInt32>(dstOrigin.x);\n\tUInt32 dstY = static_cast<UInt32>(dstOrigin.y);\n\tUInt32 dstZ = static_cast<UInt32>(dstOrigin.z);\n\tfor (UInt32 y = minY; y < maxY; ++y)\n\t{\n\t\tUInt32 srcOfsY = y * srcStrideY;\n\t\tUInt32 dstOfsY = (y - minY + dstY) * dstStrideY;\n\t\tfor (UInt32 z = minZ; z < maxZ; ++z)\n\t\t{\n\t\t\tUInt32 srcOfs = srcOfsY + z * srcStrideZ + minX;\n\t\t\tUInt32 dstOfs = dstOfsY + (z - minZ + dstZ) * dstStrideZ + dstX;\n\t\t\tfor (UInt32 x = minX; x < maxX; ++x)\n\t\t\t{\n\t\t\t\tmBlocks[dstOfs] = paletteTransform[aSrc.mBlocks[srcOfs]];\n\t\t\t\tsrcOfs += 1;\n\t\t\t\tdstOfs += 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid PalettedBlockArea::crop(const cCuboid & aArea)\n{\n\tcCuboid area(aArea);\n\tarea.Clamp(whole());\n\n\t// Copy the data:\n\tUInt32 srcStrideY = static_cast<UInt32>(size().x * size().z);\n\tUInt32 srcStrideZ = static_cast<UInt32>(size().x);\n\tUInt32 dstStrideY = static_cast<UInt32>(area.DifX() * area.DifZ());\n\tUInt32 dstStrideZ = static_cast<UInt32>(area.DifZ());\n\tUInt32 minX = static_cast<UInt32>(area.p1.x);\n\tUInt32 maxX = static_cast<UInt32>(area.p2.x);\n\tUInt32 minY = static_cast<UInt32>(area.p1.y);\n\tUInt32 maxY = static_cast<UInt32>(area.p2.y);\n\tUInt32 minZ = static_cast<UInt32>(area.p1.z);\n\tUInt32 maxZ = static_cast<UInt32>(area.p2.z);\n\tfor (UInt32 y = minY; y < maxY; ++y)\n\t{\n\t\tUInt32 srcOfsY = (y - minY) * srcStrideY;\n\t\tUInt32 dstOfsY = y * dstStrideY;\n\t\tfor (UInt32 z = minZ; z < maxZ; ++z)\n\t\t{\n\t\t\tUInt32 srcOfs = srcOfsY + (z - minZ) * srcStrideZ + minX;\n\t\t\tUInt32 dstOfs = dstOfsY + z * dstStrideZ;\n\t\t\tfor (UInt32 x = minX; x < maxX; ++x)\n\t\t\t{\n\t\t\t\tmBlocks[dstOfs] = mBlocks[srcOfs];\n\t\t\t\tsrcOfs += 1;\n\t\t\t\tdstOfs += 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nUInt32 PalettedBlockArea::positionToIndex(Vector3i aPos) const\n{\n\tASSERT(isPositionValid(aPos));\n\treturn static_cast<UInt32>(aPos.x + aPos.z * mSize.x + aPos.y * mSize.x * mSize.z);\n}\n"
  },
  {
    "path": "src/PalettedBlockArea.h",
    "content": "#pragma once\n\n\n\n\n\n#include <utility>\n\n#include \"Bindings/BlockTypePalette.h\"\n#include \"Cuboid.h\"\n\n\n\n\n\n/** Represents an area of blocks that are represented using a palette.\nThe object itself provides no thread safety, users of this class need to handle locking, if required.\nThe PalettedBlockArea always contains Blocks and their associated BlockEntities, it may optionally contain Entities.\nThere's no way to instantiate this class directly, you need to use either createFilled(), or read from cWorld. */\nclass PalettedBlockArea\n{\npublic:\n\n\t/** Creates a new PBA of the specified size filled with the specified block.\n\tThrows if there is an error (memory allocation etc.) */\n\tstatic PalettedBlockArea createFilled(Vector3i aSize, const AString & aBlockTypeName, const BlockState & aBlockState);\n\n\t/** Returns the actual size of the area in all 3 axes. */\n\tconst Vector3i & size() const { return mSize; }\n\n\t/** Returns a cCuboid that encompasses the entire PBA.\n\tTechnically, {0, 0, 0} to mSize. */\n\tcCuboid whole() const;\n\n\t/** Sets a single block using its full blockspec.\n\tThe position must be valid (ASSERTed).\n\tIf the block is not already in palette, it is added. */\n\tvoid setBlock(Vector3i aPos, const AString & aBlockTypeName, const BlockState & aBlockState);\n\n\t/** Sets a single block using an index to the palette (retrieved earlier by paletteIndex()).\n\tThe position must be valid (ASSERTed).\n\tThe palette index must be valid (ASSERTed). */\n\tvoid setBlock(Vector3i aPos, UInt32 aPaletteIndex);\n\n\t/** Returns the index into the palette that is used by the specified full blockspec.\n\tAdds the blockspec to palette if not already there. */\n\tUInt32 paletteIndex(const AString & aBlockTypeName, const BlockState & aBlockState);\n\n\t/** Returns the <index, true> into the palette that is used by the specified full blockspec.\n\tReturns <undefined, false> if blockspec not in palette. */\n\tstd::pair<UInt32, bool> maybePaletteIndex(const AString & aBlockTypeName, const BlockState & aBlockState) const;\n\n\t/** Returns the index into the palette for the block at the specified pos.\n\tThe position must be valid (ASSERTed). */\n\tUInt32 blockPaletteIndex(Vector3i aPos) const;\n\n\t/** Returns the full blockspec of the block at the specified position.\n\tThe position must be valid (ASSERTed). */\n\tconst std::pair<AString, BlockState> & block(Vector3i aPos) const;\n\n\t/** Returns the blockspec represented by the specified palette index.\n\tThe index must be valid (ASSERTed). */\n\tconst std::pair<AString, BlockState> & paletteEntry(UInt32 aPaletteIndex) const;\n\n\t/** Returns true if the specified position is within the size bounds of the area. */\n\tbool isPositionValid(Vector3i aPos) const;\n\n\t/** Fills the entire PBA with a single block of the specified type.\n\tThe palette is reset to one containing only the single block. */\n\tvoid fill(const AString & aBlockTypeName, const BlockState & aBlockState);\n\n\t/** Pastes (copies verbatim) a cCuboid out of the src PBA into this PBA.\n\taSrcCuboid is the coord range in aSrc that will be copied (min-coord is inclusive, max-coord is exclusive).\n\taDstOrigin is the coord relative to this PBA where the lowest coords of the copied area will be put.\n\taDstOrigin can be outside of this PBA's coord range (only part of the src is copied).\n\tAutomatically crops aSrcCuboid so that the copied part is entirely inside this PBA's coord range. */\n\tvoid paste(const PalettedBlockArea & aSrc, const cCuboid & aSrcCuboid, Vector3i aDstOrigin = Vector3i());\n\n\t/** Pastes (copies verbatim) the entire src PBA into this PBA.\n\taDstOrigin is the coord relative to this PBA where the lowest coords of the copied area will be put.\n\taDstOrigin can be outside of this PBA's coord range (only part of the src is copied).\n\tGracefully handles situations where the copied src PBA goes outside of this PBA's coord range. */\n\tinline void paste(const PalettedBlockArea & aSrc, Vector3i aDstOrigin = Vector3i())\n\t{\n\t\tpaste(aSrc, aSrc.whole(), aDstOrigin);\n\t}\n\n\t/** Crops this PBA by the specified coords.\n\taArea is first cropped to the size of this PBA (so it's only possible to shrink a PBA, not enlarge). */\n\tvoid crop(const cCuboid & aArea);\n\n\t/** Returns the (reqd-only) palette used internally by this object. */\n\tconst BlockTypePalette & palette() { return mPalette; }\n\n\nprotected:\n\n\t/** The palette used in the area. */\n\tBlockTypePalette mPalette;\n\n\t/** The blocks contained in the area, stored as indices into mPalette. */\n\tstd::vector<UInt32> mBlocks;\n\n\t/** The size (dimensions) of the area. */\n\tVector3i mSize;\n\n\n\t/** Creates a new uninitialized instance (all sizes zero). */\n\tPalettedBlockArea();\n\n\t/** Converts the position to index in mBlocks.\n\tThis may be removed later on when optimizing the RAM usage of this class by compressing low-palette-count PBAs. */\n\tUInt32 positionToIndex(Vector3i aPos) const;\n};\n"
  },
  {
    "path": "src/Physics/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tExplodinator.cpp\n\t# Lightning.cpp\n\n\tExplodinator.h\n\t# Lightning.h\n)\n"
  },
  {
    "path": "src/Physics/Explodinator.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"BlockInfo.h\"\n#include \"Explodinator.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"Blocks/ChunkInterface.h\"\n#include \"Chunk.h\"\n#include \"ClientHandle.h\"\n#include \"Entities/FallingBlock.h\"\n#include \"LineBlockTracer.h\"\n#include \"Simulator/SandSimulator.h\"\n\n\n\n\n\nnamespace Explodinator\n{\n\tstatic const auto StepUnit = 0.3f;\n\tstatic const auto KnockbackFactor = 25U;\n\tstatic const auto StepAttenuation = 0.225f;\n\tstatic const auto TraceCubeSideLength = 16U;\n\tstatic const auto BoundingBoxStepUnit = 0.5;\n\n\t/** Converts an absolute floating-point Position into a Chunk-relative one. */\n\tstatic Vector3f AbsoluteToRelative(const Vector3f a_Position, const cChunkCoords a_ChunkPosition)\n\t{\n\t\treturn { a_Position.x - a_ChunkPosition.m_ChunkX * cChunkDef::Width, a_Position.y, a_Position.z - a_ChunkPosition.m_ChunkZ * cChunkDef::Width };\n\t}\n\n\t/** Make a From Chunk-relative Position into a To Chunk-relative position. */\n\tstatic Vector3f RebaseRelativePosition(const cChunkCoords a_From, const cChunkCoords a_To, const Vector3f a_Position)\n\t{\n\t\treturn\n\t\t{\n\t\t\ta_Position.x + (a_From.m_ChunkX - a_To.m_ChunkX) * cChunkDef::Width,\n\t\t\ta_Position.y,\n\t\t\ta_Position.z + (a_From.m_ChunkZ - a_To.m_ChunkZ) * cChunkDef::Width\n\t\t};\n\t}\n\n\t/** Returns how much of an explosion Destruction Lazor's (tm) intensity the given block attenuates.\n\tValues are scaled as 0.3 * (0.3 + Wiki) since some compilers miss the constant folding optimisation.\n\tWiki values are https://minecraft.wiki/w/Explosion#Blast_resistance as of 2021-02-06. */\n\tstatic float GetExplosionAbsorption(const BLOCKTYPE Block)\n\t{\n\t\tswitch (Block)\n\t\t{\n\t\t\tcase E_BLOCK_BEDROCK:\n\t\t\tcase E_BLOCK_COMMAND_BLOCK:\n\t\t\tcase E_BLOCK_END_GATEWAY:\n\t\t\tcase E_BLOCK_END_PORTAL:\n\t\t\tcase E_BLOCK_END_PORTAL_FRAME: return 1080000.09f;\n\t\t\tcase E_BLOCK_ANVIL:\n\t\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\t\tcase E_BLOCK_OBSIDIAN: return 360.09f;\n\t\t\tcase E_BLOCK_ENDER_CHEST: return 180.09f;\n\t\t\tcase E_BLOCK_LAVA:\n\t\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t\tcase E_BLOCK_WATER:\n\t\t\tcase E_BLOCK_STATIONARY_WATER: return 30.09f;\n\t\t\tcase E_BLOCK_DRAGON_EGG:\n\t\t\tcase E_BLOCK_END_STONE:\n\t\t\tcase E_BLOCK_END_BRICKS: return 2.79f;\n\t\t\tcase E_BLOCK_STONE:\n\t\t\tcase E_BLOCK_BLOCK_OF_COAL:\n\t\t\tcase E_BLOCK_DIAMOND_BLOCK:\n\t\t\tcase E_BLOCK_EMERALD_BLOCK:\n\t\t\tcase E_BLOCK_GOLD_BLOCK:\n\t\t\tcase E_BLOCK_IRON_BLOCK:\n\t\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:\n\t\t\tcase E_BLOCK_BRICK:\n\t\t\tcase E_BLOCK_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_COBBLESTONE:\n\t\t\tcase E_BLOCK_COBBLESTONE_STAIRS:\n\t\t\tcase E_BLOCK_IRON_BARS:\n\t\t\tcase E_BLOCK_JUKEBOX:\n\t\t\tcase E_BLOCK_MOSSY_COBBLESTONE:\n\t\t\tcase E_BLOCK_NETHER_BRICK:\n\t\t\tcase E_BLOCK_NETHER_BRICK_FENCE:\n\t\t\tcase E_BLOCK_NETHER_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_PRISMARINE_BLOCK:\n\t\t\tcase E_BLOCK_STONE_BRICKS:\n\t\t\tcase E_BLOCK_STONE_BRICK_STAIRS:\n\t\t\tcase E_BLOCK_COBBLESTONE_WALL: return 1.89f;\n\t\t\tcase E_BLOCK_IRON_DOOR:\n\t\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\t\tcase E_BLOCK_MOB_SPAWNER: return 1.59f;\n\t\t\tcase E_BLOCK_HOPPER: return 1.53f;\n\t\t\tcase E_BLOCK_TERRACOTTA: return 1.35f;\n\t\t\tcase E_BLOCK_COBWEB: return 1.29f;\n\t\t\tcase E_BLOCK_DISPENSER:\n\t\t\tcase E_BLOCK_DROPPER:\n\t\t\tcase E_BLOCK_FURNACE:\n\t\t\tcase E_BLOCK_OBSERVER: return 1.14f;\n\t\t\tcase E_BLOCK_BEACON:\n\t\t\tcase E_BLOCK_COAL_ORE:\n\t\t\tcase E_BLOCK_COCOA_POD:\n\t\t\tcase E_BLOCK_DIAMOND_ORE:\n\t\t\tcase E_BLOCK_EMERALD_ORE:\n\t\t\tcase E_BLOCK_GOLD_ORE:\n\t\t\tcase E_BLOCK_IRON_ORE:\n\t\t\tcase E_BLOCK_LAPIS_BLOCK:\n\t\t\tcase E_BLOCK_LAPIS_ORE:\n\t\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:\n\t\t\tcase E_BLOCK_PLANKS:\n\t\t\tcase E_BLOCK_REDSTONE_ORE:\n\t\t\tcase E_BLOCK_FENCE:\n\t\t\tcase E_BLOCK_FENCE_GATE:\n\t\t\tcase E_BLOCK_WOODEN_DOOR:\n\t\t\tcase E_BLOCK_WOODEN_SLAB:\n\t\t\tcase E_BLOCK_WOODEN_STAIRS:\n\t\t\tcase E_BLOCK_TRAPDOOR: return 0.99f;\n\t\t\tcase E_BLOCK_CHEST:\n\t\t\tcase E_BLOCK_WORKBENCH:\n\t\t\tcase E_BLOCK_TRAPPED_CHEST: return 0.84f;\n\t\t\tcase E_BLOCK_BONE_BLOCK:\n\t\t\tcase E_BLOCK_CAULDRON:\n\t\t\tcase E_BLOCK_LOG: return 0.69f;  // nIcE\n\t\t\tcase E_BLOCK_CONCRETE: return 0.63f;\n\t\t\tcase E_BLOCK_BOOKCASE: return 0.54f;\n\t\t\tcase E_BLOCK_STANDING_BANNER:\n\t\t\tcase E_BLOCK_WALL_BANNER:\n\t\t\tcase E_BLOCK_JACK_O_LANTERN:\n\t\t\tcase E_BLOCK_MELON:\n\t\t\tcase E_BLOCK_HEAD:\n\t\t\tcase E_BLOCK_NETHER_WART_BLOCK:\n\t\t\tcase E_BLOCK_PUMPKIN:\n\t\t\tcase E_BLOCK_SIGN_POST:\n\t\t\tcase E_BLOCK_WALLSIGN: return 0.39f;\n\t\t\tcase E_BLOCK_QUARTZ_BLOCK:\n\t\t\tcase E_BLOCK_QUARTZ_STAIRS:\n\t\t\tcase E_BLOCK_RED_SANDSTONE:\n\t\t\tcase E_BLOCK_RED_SANDSTONE_STAIRS:\n\t\t\tcase E_BLOCK_SANDSTONE:\n\t\t\tcase E_BLOCK_SANDSTONE_STAIRS:\n\t\t\tcase E_BLOCK_WOOL: return 0.33f;\n\t\t\tcase E_BLOCK_SILVERFISH_EGG: return 0.315f;\n\t\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\t\tcase E_BLOCK_POWERED_RAIL:\n\t\t\tcase E_BLOCK_RAIL: return 0.3f;\n\t\t\tcase E_BLOCK_GRASS_PATH:\n\t\t\tcase E_BLOCK_CLAY:\n\t\t\tcase E_BLOCK_FARMLAND:\n\t\t\tcase E_BLOCK_GRASS:\n\t\t\tcase E_BLOCK_GRAVEL:\n\t\t\tcase E_BLOCK_SPONGE: return 0.27f;\n\t\t\tcase E_BLOCK_BREWING_STAND:\n\t\t\tcase E_BLOCK_STONE_BUTTON:\n\t\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\t\tcase E_BLOCK_CAKE:\n\t\t\tcase E_BLOCK_CONCRETE_POWDER:\n\t\t\tcase E_BLOCK_DIRT:\n\t\t\tcase E_BLOCK_FROSTED_ICE:\n\t\t\tcase E_BLOCK_HAY_BALE:\n\t\t\tcase E_BLOCK_ICE: return 0.24f;\n\t\t\tdefault: return 0.09f;\n\t\t}\n\t}\n\n\t/** Calculates the approximate percentage of an Entity's bounding box that is exposed to an explosion centred at Position. */\n\tstatic float CalculateEntityExposure(const cChunk & a_Chunk, const cEntity & a_Entity, const Vector3f a_Position, const int a_SquareRadius)\n\t{\n\t\tclass LineOfSightCallbacks final : public cLineBlockTracer::cCallbacks\n\t\t{\n\t\t\tvirtual bool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) override\n\t\t\t{\n\t\t\t\treturn a_BlockType != E_BLOCK_AIR;\n\t\t\t}\n\t\t} Callback;\n\n\t\tconst Vector3d Position = a_Position;\n\t\tunsigned Unobstructed = 0, Total = 0;\n\t\tconst auto Box = a_Entity.GetBoundingBox();\n\t\tcLineBlockTracer Tracer(*a_Chunk.GetWorld(), Callback);\n\n\t\tfor (double X = Box.GetMinX(); X < Box.GetMaxX(); X += BoundingBoxStepUnit)\n\t\t{\n\t\t\tfor (double Y = Box.GetMinY(); Y < Box.GetMaxY(); Y += BoundingBoxStepUnit)\n\t\t\t{\n\t\t\t\tfor (double Z = Box.GetMinZ(); Z < Box.GetMaxZ(); Z += BoundingBoxStepUnit)\n\t\t\t\t{\n\t\t\t\t\tconst Vector3d Destination{X, Y, Z};\n\t\t\t\t\tif ((Destination - Position).SqrLength() > a_SquareRadius)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Don't bother with points outside our designated area-of-effect\n\t\t\t\t\t\t// This is, surprisingly, a massive amount of work saved (~3m to detonate a sphere of 37k TNT before, ~1m after):\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Tracer.Trace(a_Position, Destination))\n\t\t\t\t\t{\n\t\t\t\t\t\tUnobstructed++;\n\t\t\t\t\t}\n\t\t\t\t\tTotal++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn (Total == 0) ? 0 : (static_cast<float>(Unobstructed) / Total);\n\t}\n\n\t/** Applies distance-based damage and knockback to all entities within the explosion's effect range. */\n\tstatic void DamageEntities(const cChunk & a_Chunk, const Vector3f a_Position, const int a_Power)\n\t{\n\t\tconst auto Radius = a_Power * 2;\n\t\tconst auto SquareRadius = Radius * Radius;\n\n\t\ta_Chunk.GetWorld()->ForEachEntityInBox({ a_Position, Radius * 2.f }, [&a_Chunk, a_Position, a_Power, Radius, SquareRadius](cEntity & Entity)\n\t\t{\n\t\t\t// Percentage of rays unobstructed.\n\t\t\tconst auto Exposure = CalculateEntityExposure(a_Chunk, Entity, a_Position, SquareRadius);\n\t\t\tconst auto Direction = Entity.GetPosition() - a_Position;\n\t\t\tconst auto Impact = (1 - (static_cast<float>(Direction.Length()) / Radius)) * Exposure;\n\n\t\t\t// Don't apply damage to other TNT entities and falling blocks, they should be invincible:\n\t\t\tif (!Entity.IsTNT() && !Entity.IsFallingBlock())\n\t\t\t{\n\t\t\t\tconst auto Damage = (Impact * Impact + Impact) * 7 * a_Power + 1;\n\t\t\t\tEntity.TakeDamage(dtExplosion, nullptr, FloorC(Damage), 0);\n\t\t\t}\n\n\t\t\t// Impact reduced by armour, expensive call so only apply to Pawns:\n\t\t\tif (Entity.IsPawn())\n\t\t\t{\n\t\t\t\tconst auto ReducedImpact = Impact - Impact * Entity.GetEnchantmentBlastKnockbackReduction();\n\t\t\t\tEntity.AddSpeed(Direction.NormalizeCopy() * KnockbackFactor * ReducedImpact);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEntity.AddSpeed(Direction.NormalizeCopy() * KnockbackFactor * Impact);\n\t\t\t}\n\n\t\t\t// Continue iteration:\n\t\t\treturn false;\n\t\t});\n\t}\n\n\t/** Returns true if block should always drop when exploded.\n\tCurrently missing conduits from 1.13 */\n\tstatic bool BlockAlwaysDrops(const BLOCKTYPE a_Block)\n\t{\n\t\tif (IsBlockShulkerBox(a_Block))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tswitch (a_Block)\n\t\t{\n\t\t\tcase E_BLOCK_DRAGON_EGG:\n\t\t\tcase E_BLOCK_BEACON:\n\t\t\tcase E_BLOCK_HEAD: return true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Sets the block at the given position, updating surroundings. */\n\tstatic void SetBlock(cWorld & a_World, cChunk & a_Chunk, const Vector3i a_AbsolutePosition, const Vector3i a_RelativePosition, const BLOCKTYPE a_DestroyedBlock, const BLOCKTYPE a_NewBlock, const cEntity * const a_ExplodingEntity)\n\t{\n\t\tconst auto DestroyedMeta = a_Chunk.GetMeta(a_RelativePosition);\n\n\t\t// SetBlock wakes up all simulators for the area, so that water and lava flows and sand falls into the blasted holes\n\t\t// It also is responsible for calling cBlockHandler::OnNeighborChanged to pop off blocks that fail CanBeAt\n\t\t// An explicit call to cBlockHandler::OnBroken handles the destruction of multiblock structures\n\t\t// References at (FS #391, GH #4418):\n\t\ta_Chunk.SetBlock(a_RelativePosition, a_NewBlock, 0);\n\n\t\tcChunkInterface Interface(a_World.GetChunkMap());\n\t\tcBlockHandler::For(a_DestroyedBlock).OnBroken(Interface, a_World, a_AbsolutePosition, a_DestroyedBlock, DestroyedMeta, a_ExplodingEntity);\n\t}\n\n\t/** Work out what should happen when an explosion destroys the given block.\n\tTasks include lighting TNT, dropping pickups, setting fire and flinging shrapnel according to Minecraft rules.\n\tOK, _mostly_ Minecraft rules. */\n\tstatic void DestroyBlock(cChunk & a_Chunk, const Vector3i a_Position, const int a_Power, const bool a_Fiery, const cEntity * const a_ExplodingEntity)\n\t{\n\t\tconst auto DestroyedBlock = a_Chunk.GetBlock(a_Position);\n\t\tif (DestroyedBlock == E_BLOCK_AIR)\n\t\t{\n\t\t\t// There's nothing left for us here, but a barren and empty land\n\t\t\t// Let's go.\n\t\t\treturn;\n\t\t}\n\n\t\tauto & World = *a_Chunk.GetWorld();\n\t\tauto & Random = GetRandomProvider();\n\t\tconst auto Absolute = cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos());\n\n\t\tif (DestroyedBlock == E_BLOCK_TNT)  // If the block is TNT we should set it off\n\t\t{\n\t\t\t// Random fuse between 10 to 30 game ticks.\n\t\t\tconst int FuseTime = Random.RandInt(10, 30);\n\n\t\t\t// Activate the TNT, with initial velocity and no fuse sound:\n\t\t\tWorld.SpawnPrimedTNT(Vector3d(0.5, 0, 0.5) + Absolute, FuseTime, 1, false);\n\t\t}\n\t\telse if ((a_ExplodingEntity != nullptr) && (a_ExplodingEntity->IsTNT() || BlockAlwaysDrops(DestroyedBlock) || Random.RandBool(1.f / a_Power)))  // For TNT explosions, destroying a block that always drops, or if RandBool, drop pickups\n\t\t{\n\t\t\tconst auto DestroyedMeta = a_Chunk.GetMeta(a_Position);\n\t\t\ta_Chunk.GetWorld()->SpawnItemPickups(cBlockHandler::For(DestroyedBlock).ConvertToPickups(DestroyedMeta), Absolute);\n\t\t}\n\t\telse if (a_Fiery && Random.RandBool(1 / 3.0))  // 33% chance of starting fires if it can start fires\n\t\t{\n\t\t\tconst auto Below = a_Position.addedY(-1);\n\t\t\tif ((Below.y >= 0) && cBlockInfo::FullyOccupiesVoxel(a_Chunk.GetBlock(Below)))\n\t\t\t{\n\t\t\t\t// Start a fire:\n\t\t\t\tSetBlock(World, a_Chunk, Absolute, a_Position, DestroyedBlock, E_BLOCK_FIRE, a_ExplodingEntity);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse if (const auto Shrapnel = World.GetTNTShrapnelLevel(); (Shrapnel > slNone) && Random.RandBool(0))  // Currently 0% chance of flinging stuff around\n\t\t{\n\t\t\t// If the block is shrapnel-able, make a falling block entity out of it:\n\t\t\tif (\n\t\t\t\t((Shrapnel == slAll) && cBlockInfo::FullyOccupiesVoxel(DestroyedBlock)) ||\n\t\t\t\t((Shrapnel == slGravityAffectedOnly) && cSandSimulator::IsAllowedBlock(DestroyedBlock))\n\t\t\t)\n\t\t\t{\n\t\t\t\tconst auto DestroyedMeta = a_Chunk.GetMeta(a_Position);\n\t\t\t\tauto FallingBlock = std::make_unique<cFallingBlock>(Vector3d(0.5, 0, 0.5) + Absolute, DestroyedBlock, DestroyedMeta);\n\t\t\t\t// TODO: correct velocity FallingBlock->SetSpeedY(40);\n\t\t\t\tFallingBlock->Initialize(std::move(FallingBlock), World);\n\t\t\t}\n\t\t}\n\n\t\tSetBlock(World, a_Chunk, Absolute, a_Position, DestroyedBlock, E_BLOCK_AIR, a_ExplodingEntity);\n\t}\n\n\t/** Traces the path taken by one Explosion Lazor (tm) with given direction and intensity, that will destroy blocks until it is exhausted. */\n\tstatic void DestructionTrace(cChunk * a_Chunk, Vector3f a_Origin, const Vector3f a_Direction, const int a_Power, const bool a_Fiery, float a_Intensity, const cEntity * const a_ExplodingEntity)\n\t{\n\t\t// The current position the ray is at.\n\t\tauto Checkpoint = a_Origin;\n\n\t\t// The displacement that the ray in one iteration step should travel.\n\t\tconst auto Step = a_Direction.NormalizeCopy() * StepUnit;\n\n\t\t// Loop until intensity runs out:\n\t\twhile (a_Intensity > 0)\n\t\t{\n\t\t\tauto Position = Checkpoint.Floor();\n\t\t\tif (!cChunkDef::IsValidHeight(Position))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst auto Neighbour = a_Chunk->GetRelNeighborChunkAdjustCoords(Position);\n\t\t\tif ((Neighbour == nullptr) || !Neighbour->IsValid())\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ta_Intensity -= GetExplosionAbsorption(Neighbour->GetBlock(Position));\n\t\t\tif (a_Intensity <= 0)\n\t\t\t{\n\t\t\t\t// The ray is exhausted:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDestroyBlock(*Neighbour, Position, a_Power, a_Fiery, a_ExplodingEntity);\n\n\t\t\t// Adjust coordinates to be relative to the neighbour chunk:\n\t\t\tCheckpoint = RebaseRelativePosition(a_Chunk->GetPos(), Neighbour->GetPos(), Checkpoint);\n\t\t\ta_Origin = RebaseRelativePosition(a_Chunk->GetPos(), Neighbour->GetPos(), a_Origin);\n\t\t\ta_Chunk = Neighbour;\n\n\t\t\t// Increment the simulation, weaken the ray:\n\t\t\tCheckpoint += Step;\n\t\t\ta_Intensity -= StepAttenuation;\n\t\t}\n\t}\n\n\t/** Returns a random intensity for an Explosion Lazor (tm) as a function of the explosion's power. */\n\tstatic float RandomIntensity(MTRand & a_Random, const int a_Power)\n\t{\n\t\treturn a_Power * (0.7f + a_Random.RandReal(0.6f));\n\t}\n\n\t/** Sends out Explosion Lazors (tm) originating from the given position that destroy blocks. */\n\tstatic void DamageBlocks(cChunk & a_Chunk, const Vector3f a_Position, const int a_Power, const bool a_Fiery, const cEntity * const a_ExplodingEntity)\n\t{\n\t\t// Oh boy... Better hope you have a hot cache, 'cos this little manoeuvre's gonna cost us 1352 raytraces in one tick...\n\t\tconst int HalfSide = TraceCubeSideLength / 2;\n\t\tauto & Random = GetRandomProvider();\n\n\t\t// The following loops implement the tracing algorithm described in http://minecraft.wiki/w/Explosion\n\n\t\t// Trace rays from the explosion centre to all points in a square of area TraceCubeSideLength * TraceCubeSideLength\n\t\t// for the top and bottom sides:\n\t\tfor (float OffsetX = -HalfSide; OffsetX < HalfSide; OffsetX++)\n\t\t{\n\t\t\tfor (float OffsetZ = -HalfSide; OffsetZ < HalfSide; OffsetZ++)\n\t\t\t{\n\t\t\t\tDestructionTrace(&a_Chunk, a_Position, Vector3f(OffsetX, +HalfSide, OffsetZ), a_Power, a_Fiery, RandomIntensity(Random, a_Power), a_ExplodingEntity);\n\t\t\t\tDestructionTrace(&a_Chunk, a_Position, Vector3f(OffsetX, -HalfSide, OffsetZ), a_Power, a_Fiery, RandomIntensity(Random, a_Power), a_ExplodingEntity);\n\t\t\t}\n\t\t}\n\n\t\t// Left and right sides, avoid duplicates at top and bottom edges:\n\t\tfor (float OffsetX = -HalfSide; OffsetX < HalfSide; OffsetX++)\n\t\t{\n\t\t\tfor (float OffsetY = -HalfSide + 1; OffsetY < HalfSide - 1; OffsetY++)\n\t\t\t{\n\t\t\t\tDestructionTrace(&a_Chunk, a_Position, Vector3f(OffsetX, OffsetY, +HalfSide), a_Power, a_Fiery, RandomIntensity(Random, a_Power), a_ExplodingEntity);\n\t\t\t\tDestructionTrace(&a_Chunk, a_Position, Vector3f(OffsetX, OffsetY, -HalfSide), a_Power, a_Fiery, RandomIntensity(Random, a_Power), a_ExplodingEntity);\n\t\t\t}\n\t\t}\n\n\t\t// Front and back sides, avoid all edges:\n\t\tfor (float OffsetZ = -HalfSide + 1; OffsetZ < HalfSide - 1; OffsetZ++)\n\t\t{\n\t\t\tfor (float OffsetY = -HalfSide + 1; OffsetY < HalfSide - 1; OffsetY++)\n\t\t\t{\n\t\t\t\tDestructionTrace(&a_Chunk, a_Position, Vector3f(+HalfSide, OffsetY, OffsetZ), a_Power, a_Fiery, RandomIntensity(Random, a_Power), a_ExplodingEntity);\n\t\t\t\tDestructionTrace(&a_Chunk, a_Position, Vector3f(-HalfSide, OffsetY, OffsetZ), a_Power, a_Fiery, RandomIntensity(Random, a_Power), a_ExplodingEntity);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Sends an explosion packet to all clients in the given chunk. */\n\tstatic void LagTheClient(cChunk & a_Chunk, const Vector3f a_Position, const int a_Power)\n\t{\n\t\tfor (const auto Client : a_Chunk.GetAllClients())\n\t\t{\n\t\t\tClient->SendExplosion(a_Position, static_cast<float>(a_Power));\n\t\t}\n\t}\n\n\tvoid Kaboom(cWorld & a_World, const Vector3f a_Position, const int a_Power, const bool a_Fiery, const cEntity * const a_ExplodingEntity)\n\t{\n\t\ta_World.DoWithChunkAt(a_Position.Floor(), [a_Position, a_Power, a_Fiery, a_ExplodingEntity](cChunk & a_Chunk)\n\t\t{\n\t\t\tLagTheClient(a_Chunk, a_Position, a_Power);\n\t\t\tDamageEntities(a_Chunk, a_Position, a_Power);\n\t\t\tDamageBlocks(a_Chunk, AbsoluteToRelative(a_Position, a_Chunk.GetPos()), a_Power, a_Fiery, a_ExplodingEntity);\n\n\t\t\treturn false;\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "src/Physics/Explodinator.h",
    "content": "\n#pragma once\n\n\n\n\n\nclass cEntity;\nclass cWorld;\n\n\n\n\nnamespace Explodinator\n{\n\t/** Creates an explosion of Power, centred at Position, with ability to set fires as provided.\n\tFor maximum efficiency, Position should be in the centre of the entity or block that exploded.\n\tThe entity pointer is used to trigger OnBreak for the destroyed blocks.\n\tKaboom indeed, you drunken wretch. */\n\tvoid Kaboom(cWorld & World, Vector3f Position, int Power, bool Fiery, const cEntity * a_ExplodingEntity);\n}\n"
  },
  {
    "path": "src/ProbabDistrib.cpp",
    "content": "\n// ProbabDistrib.cpp\n\n// Implements the cProbabDistrib class representing a discrete probability distribution curve and random generator\n\n#include \"Globals.h\"\n#include \"ProbabDistrib.h\"\n\n\n\n\n\ncProbabDistrib::cProbabDistrib(int a_MaxValue) :\n\tm_MaxValue(a_MaxValue),\n\tm_Sum(-1)\n{\n}\n\n\n\n\n\nvoid cProbabDistrib::SetPoints(const cProbabDistrib::cPoints & a_Points)\n{\n\tASSERT(!a_Points.empty());\n\tm_Sum = 0;\n\tm_Cumulative.clear();\n\tm_Cumulative.reserve(a_Points.size() + 1);\n\tint ProbSum = 0;\n\tint LastProb = 0;\n\tint LastValue = -1;\n\tif (a_Points[0].m_Value != 0)\n\t{\n\t\tm_Cumulative.emplace_back(0, 0);  // Always push in the [0, 0] point for easier search algorithm bounds\n\t\tLastValue = 0;\n\t}\n\tfor (cPoints::const_iterator itr = a_Points.begin(), end = a_Points.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->m_Value == LastValue)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Add the current trapezoid to the sum:\n\t\tProbSum += (LastProb + itr->m_Probability) * (itr->m_Value - LastValue) / 2;\n\t\tLastProb = itr->m_Probability;\n\t\tLastValue = itr->m_Value;\n\t\tm_Cumulative.emplace_back(itr->m_Value, ProbSum);\n\t}  // for itr - a_Points[]\n\tif (LastValue != m_MaxValue)\n\t{\n\t\tm_Cumulative.emplace_back(m_MaxValue, 0);  // Always push in the last point for easier search algorithm bounds\n\t}\n\tm_Sum = ProbSum;\n}\n\n\n\n\n\nbool cProbabDistrib::SetDefString(const AString & a_DefString)\n{\n\tAStringVector Points = StringSplitAndTrim(a_DefString, \";\");\n\tif (Points.empty())\n\t{\n\t\treturn false;\n\t}\n\tcPoints Pts;\n\tfor (AStringVector::const_iterator itr = Points.begin(), end = Points.end(); itr != end; ++itr)\n\t{\n\t\tAStringVector Split = StringSplitAndTrim(*itr, \",\");\n\t\tif (Split.size() != 2)\n\t\t{\n\t\t\t// Bad format\n\t\t\treturn false;\n\t\t}\n\t\tint Value = atoi(Split[0].c_str());\n\t\tint Prob  = atoi(Split[1].c_str());\n\t\tif (\n\t\t\t((Value == 0) && (Split[0] != \"0\")) ||\n\t\t\t((Prob  == 0) && (Split[1] != \"0\"))\n\t\t)\n\t\t{\n\t\t\t// Number parse error\n\t\t\treturn false;\n\t\t}\n\t\tPts.emplace_back(Value, Prob);\n\t}  // for itr - Points[]\n\n\tSetPoints(Pts);\n\treturn true;\n}\n\n\n\n\n\nint cProbabDistrib::Random(MTRand & a_Rand) const\n{\n\treturn MapValue(a_Rand.RandInt(m_Sum));\n}\n\n\n\n\n\nint cProbabDistrib::MapValue(int a_OrigValue) const\n{\n\tASSERT(a_OrigValue >= 0);\n\tASSERT(a_OrigValue < m_Sum);\n\n\t// Binary search through m_Cumulative for placement:\n\tsize_t Lo = 0;\n\tsize_t Hi = m_Cumulative.size() - 1;\n\twhile (Hi - Lo > 1)\n\t{\n\t\tsize_t Mid = (Lo + Hi) / 2;\n\t\tint MidProbab = m_Cumulative[Mid].m_Probability;\n\t\tif (MidProbab < a_OrigValue)\n\t\t{\n\t\t\tLo = Mid;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tHi = Mid;\n\t\t}\n\t}\n\tASSERT(Hi - Lo == 1);\n\n\t// Linearly interpolate between Lo and Hi:\n\tint ProbDif  = m_Cumulative[Hi].m_Probability - m_Cumulative[Lo].m_Probability;\n\tProbDif = (ProbDif != 0) ? ProbDif : 1;\n\tint ValueDif = m_Cumulative[Hi].m_Value - m_Cumulative[Lo].m_Value;\n\treturn m_Cumulative[Lo].m_Value + (a_OrigValue - m_Cumulative[Lo].m_Probability) * ValueDif / ProbDif;\n}\n\n\n\n\n"
  },
  {
    "path": "src/ProbabDistrib.h",
    "content": "\n// ProbabDistrib.h\n\n// Declares the cProbabDistrib class representing a discrete probability distribution curve and random generator\n\n/*\nUsage:\n1, Create a cProbabDistrib instance\n2, Initialize the distribution either programmatically, using the SetPoints() function, or using a definition string\n3, Ask for random numbers in that probability distribution using the Random() function\n*/\n\n\n\n\n\n#pragma once\n\n\n\n\n\n#include \"FastRandom.h\"\n\n\n\n\n\nclass cProbabDistrib\n{\npublic:\n\tclass cPoint\n\t{\n\tpublic:\n\t\tint m_Value;\n\t\tint m_Probability;\n\n\t\tcPoint(int a_Value, int a_Probability) :\n\t\t\tm_Value(a_Value),\n\t\t\tm_Probability(a_Probability)\n\t\t{\n\t\t}\n\t} ;\n\n\ttypedef std::vector<cPoint> cPoints;\n\n\n\tcProbabDistrib(int a_MaxValue);\n\n\t/** Sets the distribution curve using an array of [value, probability] points, linearly interpolated. a_Points must not be empty. */\n\tvoid SetPoints(const cPoints & a_Points);\n\n\t/** Sets the distribution curve using a definition string; returns true on successful parse */\n\tbool SetDefString(const AString & a_DefString);\n\n\t/** Gets a random value from a_Rand, shapes it into the distribution curve and returns the value. */\n\tint Random(MTRand & a_Rand) const;\n\n\t/** Maps value in range [0, m_Sum] into the range [0, m_MaxValue] using the stored probability */\n\tint MapValue(int a_OrigValue) const;\n\n\tint GetSum(void) const { return m_Sum; }\n\nprotected:\n\n\tint m_MaxValue;\n\n\t/** Cumulative probability of the values, sorted, for fast bsearch lookup */\n\tcPoints m_Cumulative;\n\n\t/** Sum of all the probabilities across all values in the domain; -1 if not set */\n\tint m_Sum;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Protocol/Authenticator.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Protocol/Authenticator.h\"\n\n#include \"ClientHandle.h\"\n#include \"HTTP/UrlClient.h\"\n#include \"HTTP/UrlParser.h\"\n#include \"IniFile.h\"\n#include \"JsonUtils.h\"\n#include \"json/json.h\"\n#include \"Protocol/MojangAPI.h\"\n#include \"Root.h\"\n#include \"Server.h\"\n#include \"UUID.h\"\n\n\n\n\n\nconstexpr char DEFAULT_AUTH_SERVER[]  = \"sessionserver.mojang.com\";\nconstexpr char DEFAULT_AUTH_ADDRESS[] = \"/session/minecraft/hasJoined?username=%USERNAME%&serverId=%SERVERID%\";\n\n\n\n\n\ncAuthenticator::cAuthenticator(void) :\n\tSuper(\"Authenticator\"),\n\tm_Server(DEFAULT_AUTH_SERVER),\n\tm_Address(DEFAULT_AUTH_ADDRESS),\n\tm_ShouldAuthenticate(true)\n{\n}\n\n\n\n\n\ncAuthenticator::~cAuthenticator()\n{\n\tStop();\n}\n\n\n\n\n\nvoid cAuthenticator::ReadSettings(cSettingsRepositoryInterface & a_Settings)\n{\n\tm_Server             = a_Settings.GetValueSet (\"Authentication\", \"Server\", DEFAULT_AUTH_SERVER);\n\tm_Address            = a_Settings.GetValueSet (\"Authentication\", \"Address\", DEFAULT_AUTH_ADDRESS);\n\tm_ShouldAuthenticate = a_Settings.GetValueSetB(\"Authentication\", \"Authenticate\", true);\n\n\t// prepend https:// if missing\n\tconstexpr std::string_view HttpPrefix = \"http://\";\n\tconstexpr std::string_view HttpsPrefix = \"https://\";\n\n\tif (\n\t\t(std::string_view(m_Server).substr(0, HttpPrefix.size()) != HttpPrefix) &&\n\t\t(std::string_view(m_Server).substr(0, HttpsPrefix.size()) != HttpsPrefix)\n\t)\n\t{\n\t\tm_Server = \"https://\" + m_Server;\n\t}\n\n\t{\n\t\tauto [IsSuccessful, ErrorMessage] = cUrlParser::Validate(m_Server);\n\t\tif (!IsSuccessful)\n\t\t{\n\t\t\tLOGWARNING(\"%s %d: Supplied invalid URL for configuration value [Authentication: Server]: \\\"%s\\\", using default! Error: %s\", __FUNCTION__, __LINE__, m_Server.c_str(), ErrorMessage.c_str());\n\t\t\tm_Server = DEFAULT_AUTH_SERVER;\n\t\t}\n\t}\n\n\t{\n\t\tauto [IsSuccessful, ErrorMessage] = cUrlParser::Validate(m_Server);\n\t\tif (!IsSuccessful)\n\t\t{\n\t\t\tLOGWARNING(\"%s %d: Supplied invalid URL for configuration value [Authentication: Address]: \\\"%s\\\", using default! Error: %s\", __FUNCTION__, __LINE__, m_Address.c_str(), ErrorMessage.c_str());\n\t\t\tm_Address = DEFAULT_AUTH_ADDRESS;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cAuthenticator::Authenticate(int a_ClientID, const std::string_view a_Username, const std::string_view a_ServerHash)\n{\n\tif (!m_ShouldAuthenticate)\n\t{\n\t\t// An \"authenticated\" username, which is just what the client sent since auth is off.\n\t\tstd::string OfflineUsername(a_Username);\n\n\t\t// A specially constructed UUID based wholly on the username.\n\t\tconst auto OfflineUUID = cClientHandle::GenerateOfflineUUID(OfflineUsername);\n\n\t\t// \"Authenticate\" the user based on what little information we have:\n\t\tcRoot::Get()->GetServer()->AuthenticateUser(a_ClientID, std::move(OfflineUsername), OfflineUUID, Json::Value());\n\t\treturn;\n\t}\n\n\tcCSLock Lock(m_CS);\n\tm_Queue.emplace_back(a_ClientID, a_Username, a_ServerHash);\n\tm_QueueNonempty.Set();\n}\n\n\n\n\n\nvoid cAuthenticator::Start(cSettingsRepositoryInterface & a_Settings)\n{\n\tReadSettings(a_Settings);\n\tSuper::Start();\n}\n\n\n\n\n\nvoid cAuthenticator::Stop(void)\n{\n\tm_ShouldTerminate = true;\n\tm_QueueNonempty.Set();\n\tSuper::Stop();\n}\n\n\n\n\n\nvoid cAuthenticator::Execute(void)\n{\n\tfor (;;)\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\twhile (!m_ShouldTerminate && (m_Queue.size() == 0))\n\t\t{\n\t\t\tcCSUnlock Unlock(Lock);\n\t\t\tm_QueueNonempty.Wait();\n\t\t}\n\t\tif (m_ShouldTerminate)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tASSERT(!m_Queue.empty());\n\n\t\tcAuthenticator::cUser User = std::move(m_Queue.front());\n\t\tint & ClientID = User.m_ClientID;\n\t\tAString & Username = User.m_Name;\n\t\tAString & ServerID = User.m_ServerID;\n\t\tm_Queue.pop_front();\n\t\tLock.Unlock();\n\n\t\tcUUID UUID;\n\t\tJson::Value Properties;\n\t\tif (AuthWithYggdrasil(Username, ServerID, UUID, Properties))\n\t\t{\n\t\t\tLOGINFO(\"User %s authenticated with UUID %s\", Username.c_str(), UUID.ToShortString().c_str());\n\t\t\tcRoot::Get()->GetServer()->AuthenticateUser(ClientID, std::move(Username), UUID, std::move(Properties));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcRoot::Get()->KickUser(ClientID, \"Failed to authenticate account!\");\n\t\t}\n\t}  // for (-ever)\n}\n\n\n\n\n\nbool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_ServerId, cUUID & a_UUID, Json::Value & a_Properties) const\n{\n\tLOGD(\"Trying to authenticate user %s\", a_UserName.c_str());\n\n\t// Create the GET request:\n\tAString ActualAddress = m_Address;\n\tReplaceURL(ActualAddress, \"%USERNAME%\", a_UserName);\n\tReplaceURL(ActualAddress, \"%SERVERID%\", a_ServerId);\n\n\t// Create and send the HTTP request\n\tauto [IsSuccessful, Response] = cUrlClient::BlockingGet(m_Server + ActualAddress);\n\tif (!IsSuccessful)\n\t{\n\t\treturn false;\n\t}\n\n\t// Parse the Json response:\n\tif (Response.empty())\n\t{\n\t\treturn false;\n\t}\n\tJson::Value root;\n\tif (!JsonUtils::ParseString(Response, root))\n\t{\n\t\tLOGWARNING(\"%s: Cannot parse received data (authentication) to JSON!\", __FUNCTION__);\n\t\treturn false;\n\t}\n\ta_UserName = root.get(\"name\", \"Unknown\").asString();\n\ta_Properties = root[\"properties\"];\n\tif (!a_UUID.FromString(root.get(\"id\", \"\").asString()))\n\t{\n\t\tLOGWARNING(\"%s: Received invalid UUID format\", __FUNCTION__);\n\t\treturn false;\n\t}\n\n\t// Store the player's profile in the MojangAPI caches:\n\tcRoot::Get()->GetMojangAPI().AddPlayerProfile(a_UserName, a_UUID, a_Properties);\n\n\treturn true;\n}\n\n\n\n#ifdef ENABLE_PROPERTIES\n\n/* In case we want to export this function to the plugin API later - don't forget to add the relevant INI configuration lines for DEFAULT_PROPERTIES_ADDRESS */\n\n#define DEFAULT_PROPERTIES_ADDRESS \"/session/minecraft/profile/%UUID%\"\n\n// Gets the properties, such as skin, of a player based on their UUID via Mojang's API\nbool GetPlayerProperties(const AString & a_UUID, Json::Value & a_Properties);\n\nbool cAuthenticator::GetPlayerProperties(const AString & a_UUID, Json::Value & a_Properties)\n{\n\tLOGD(\"Trying to get properties for user %s\", a_UUID.c_str());\n\n\t// Create and send the HTTP request\n\tauto [IsSuccessful, Response] = cUrlClient::BlockingGet(m_Server + ActualAddress);\n\tif (!IsSuccessful)\n\t{\n\t\treturn false;\n\t}\n\n\t// Parse the Json response:\n\tif (Response.empty())\n\t{\n\t\treturn false;\n\t}\n\n\tJson::Value root;\n\tJson::Reader reader;\n\tif (!reader.parse(Response, root, false))\n\t{\n\t\tLOGWARNING(\"cAuthenticator: Cannot parse received properties data to JSON!\");\n\t\treturn false;\n\t}\n\n\ta_Properties = root[\"properties\"];\n\treturn true;\n}\n#endif\n\n\n\n\n"
  },
  {
    "path": "src/Protocol/Authenticator.h",
    "content": "\n// cAuthenticator.h\n\n// Interfaces to the cAuthenticator class representing the thread that authenticates users against the official Mojang servers\n// Authentication prevents \"hackers\" from joining with an arbitrary username (possibly impersonating the server admins)\n// For more info, see http://wiki.vg/Session\n// In Cuberite, authentication is implemented as a single thread that receives queued auth requests and dispatches them one by one.\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/IsThread.h\"\n\n// fwd:\nclass cUUID;\nclass cSettingsRepositoryInterface;\n\nnamespace Json\n{\n\tclass Value;\n}\n\n\n\n\n\nclass cAuthenticator:\n\tpublic cIsThread\n{\n\tusing Super = cIsThread;\n\npublic:\n\n\tcAuthenticator();\n\tvirtual ~cAuthenticator() override;\n\n\t/** (Re-)read server and address from INI: */\n\tvoid ReadSettings(cSettingsRepositoryInterface & a_Settings);\n\n\t/** Queues a request for authenticating a user. If the auth fails, the user will be kicked */\n\tvoid Authenticate(int a_ClientID, std::string_view a_Username, std::string_view a_ServerHash);\n\n\t/** Starts the authenticator thread. The thread may be started and stopped repeatedly */\n\tvoid Start(cSettingsRepositoryInterface & a_Settings);\n\n\t/** Stops the authenticator thread. The thread may be started and stopped repeatedly */\n\tvoid Stop(void);\n\nprivate:\n\n\tclass cUser\n\t{\n\tpublic:\n\t\tint     m_ClientID;\n\t\tAString m_Name;\n\t\tAString m_ServerID;\n\n\t\tcUser(int a_ClientID, const std::string_view a_Name, const std::string_view a_ServerID) :\n\t\t\tm_ClientID(a_ClientID),\n\t\t\tm_Name(a_Name),\n\t\t\tm_ServerID(a_ServerID)\n\t\t{\n\t\t}\n\t};\n\n\tusing cUserList = std::deque<cUser>;\n\n\tcCriticalSection m_CS;\n\tcUserList        m_Queue;\n\tcEvent           m_QueueNonempty;\n\n\t/** The server that is to be contacted for auth / UUID conversions */\n\tAString m_Server;\n\n\t/** The URL to use for auth, without server part.\n\t%USERNAME% will be replaced with actual user name.\n\t%SERVERID% will be replaced with server's ID.\n\tFor example \"/session/minecraft/hasJoined?username=%USERNAME%&serverId=%SERVERID%\". */\n\tAString m_Address;\n\n\tAString m_PropertiesAddress;\n\tbool    m_ShouldAuthenticate;\n\n\t/** cIsThread override: */\n\tvirtual void Execute(void) override;\n\n\t/** Returns true if the user authenticated okay, false on error\n\tReturns the case-corrected username, UUID, and properties (eg. skin). */\n\tbool AuthWithYggdrasil(AString & a_UserName, const AString & a_ServerId, cUUID & a_UUID, Json::Value & a_Properties) const;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Protocol/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tAuthenticator.cpp\n\tChunkDataSerializer.cpp\n\tForgeHandshake.cpp\n\tMojangAPI.cpp\n\tPacketizer.cpp\n\tProtocol_1_8.cpp\n\tProtocol_1_9.cpp\n\tProtocol_1_10.cpp\n\tProtocol_1_11.cpp\n\tProtocol_1_12.cpp\n\tProtocol_1_13.cpp\n\tProtocol_1_14.cpp\n\tProtocolRecognizer.cpp\n\tRecipeMapper.cpp\n\n\tAuthenticator.h\n\tChunkDataSerializer.h\n\tForgeHandshake.h\n\tMojangAPI.h\n\tPacketizer.h\n\tProtocol.h\n\tProtocol_1_8.h\n\tProtocol_1_9.h\n\tProtocol_1_10.h\n\tProtocol_1_11.h\n\tProtocol_1_12.h\n\tProtocol_1_13.h\n\tProtocol_1_14.h\n\tProtocolRecognizer.h\n\tRecipeMapper.h\n)\n\nadd_subdirectory(Palettes)"
  },
  {
    "path": "src/Protocol/ChunkDataSerializer.cpp",
    "content": "#include \"Globals.h\"\n#include \"ChunkDataSerializer.h\"\n#include \"Protocol_1_8.h\"\n#include \"Protocol_1_9.h\"\n#include \"../ClientHandle.h\"\n#include \"../WorldStorage/FastNBT.h\"\n\n#include \"Palettes/Upgrade.h\"\n#include \"Palettes/Palette_1_13.h\"\n#include \"Palettes/Palette_1_13_1.h\"\n#include \"Palettes/Palette_1_14.h\"\n\n\n\n\n\nnamespace\n{\n\tstd::pair<UInt16, size_t> GetSectionBitmask(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData)\n\t{\n\t\tsize_t Present = 0;\n\t\tUInt16 Mask = 0;\n\n\t\tChunkDef_ForEachSection(a_BlockData, a_LightData,\n\t\t{\n\t\t\tPresent++;\n\t\t\tMask |= (1 << Y);\n\t\t});\n\n\t\treturn { Mask, Present };\n\t}\n\n\tauto PaletteLegacy(const BLOCKTYPE a_BlockType, const NIBBLETYPE a_Meta)\n\t{\n\t\treturn (a_BlockType << 4) | a_Meta;\n\t}\n\n\tauto Palette393(const BLOCKTYPE a_BlockType, const NIBBLETYPE a_Meta)\n\t{\n\t\treturn Palette_1_13::From(PaletteUpgrade::FromBlock(a_BlockType, a_Meta));\n\t}\n\n\tauto Palette401(const BLOCKTYPE a_BlockType, const NIBBLETYPE a_Meta)\n\t{\n\t\treturn Palette_1_13_1::From(PaletteUpgrade::FromBlock(a_BlockType, a_Meta));\n\t}\n\n\tauto Palette477(const BLOCKTYPE a_BlockType, const NIBBLETYPE a_Meta)\n\t{\n\t\treturn Palette_1_14::From(PaletteUpgrade::FromBlock(a_BlockType, a_Meta));\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cChunkDataSerializer:\n\ncChunkDataSerializer::cChunkDataSerializer(const eDimension a_Dimension) :\n\tm_Packet(512 KiB),\n\tm_Dimension(a_Dimension)\n{\n}\n\n\n\n\n\nvoid cChunkDataSerializer::SendToClients(const int a_ChunkX, const int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap, const ClientHandles & a_SendTo)\n{\n\tfor (const auto & Client : a_SendTo)\n\t{\n\t\tswitch (static_cast<cProtocol::Version>(Client->GetProtocolVersion()))\n\t\t{\n\t\t\tcase cProtocol::Version::v1_8_0:\n\t\t\t{\n\t\t\t\tSerialize(Client, a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap, CacheVersion::v47);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase cProtocol::Version::v1_9_0:\n\t\t\tcase cProtocol::Version::v1_9_1:\n\t\t\tcase cProtocol::Version::v1_9_2:\n\t\t\t{\n\t\t\t\tSerialize(Client, a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap, CacheVersion::v107);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase cProtocol::Version::v1_9_4:\n\t\t\tcase cProtocol::Version::v1_10_0:\n\t\t\tcase cProtocol::Version::v1_11_0:\n\t\t\tcase cProtocol::Version::v1_11_1:\n\t\t\tcase cProtocol::Version::v1_12:\n\t\t\tcase cProtocol::Version::v1_12_1:\n\t\t\tcase cProtocol::Version::v1_12_2:\n\t\t\t{\n\t\t\t\tSerialize(Client, a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap, CacheVersion::v110);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase cProtocol::Version::v1_13:\n\t\t\t{\n\t\t\t\tSerialize(Client, a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap, CacheVersion::v393);  // This version didn't last very long xD\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase cProtocol::Version::v1_13_1:\n\t\t\tcase cProtocol::Version::v1_13_2:\n\t\t\t{\n\t\t\t\tSerialize(Client, a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap, CacheVersion::v401);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase cProtocol::Version::v1_14:\n\t\t\tcase cProtocol::Version::v1_14_1:\n\t\t\tcase cProtocol::Version::v1_14_2:\n\t\t\tcase cProtocol::Version::v1_14_3:\n\t\t\tcase cProtocol::Version::v1_14_4:\n\t\t\t{\n\t\t\t\tSerialize(Client, a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap, CacheVersion::v477);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tUNREACHABLE(\"Unknown chunk data serialization version\");\n\t}\n\n\t// Our cache is only persistent during the function call:\n\tfor (auto & Cache : m_Cache)\n\t{\n\t\tCache.Engaged = false;\n\t}\n}\n\n\n\n\n\ninline void cChunkDataSerializer::Serialize(const ClientHandles::value_type & a_Client, const int a_ChunkX, const int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap, const CacheVersion a_CacheVersion)\n{\n\tauto & Cache = m_Cache[static_cast<size_t>(a_CacheVersion)];\n\tif (Cache.Engaged)\n\t{\n\t\t// Success! We've done it already, just re-use:\n\t\ta_Client->SendChunkData(a_ChunkX, a_ChunkZ, Cache.ToSend);\n\t\treturn;\n\t}\n\n\tswitch (a_CacheVersion)\n\t{\n\t\tcase CacheVersion::v47:\n\t\t{\n\t\t\tSerialize47(a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap);\n\t\t\tbreak;\n\t\t}\n\t\tcase CacheVersion::v107:\n\t\t{\n\t\t\tSerialize107(a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap);\n\t\t\tbreak;\n\t\t}\n\t\tcase CacheVersion::v110:\n\t\t{\n\t\t\tSerialize110(a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap);\n\t\t\tbreak;\n\t\t}\n\t\tcase CacheVersion::v393:\n\t\t{\n\t\t\tSerialize393<&Palette393>(a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap);\n\t\t\tbreak;\n\t\t}\n\t\tcase CacheVersion::v401:\n\t\t{\n\t\t\tSerialize393<&Palette401>(a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap);\n\t\t\tbreak;\n\t\t}\n\t\tcase CacheVersion::v477:\n\t\t{\n\t\t\tSerialize477(a_ChunkX, a_ChunkZ, a_BlockData, a_LightData, a_BiomeMap);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tCompressPacketInto(Cache);\n\tASSERT(Cache.Engaged);  // Cache must be populated now\n\ta_Client->SendChunkData(a_ChunkX, a_ChunkZ, Cache.ToSend);\n}\n\n\n\n\n\ninline void cChunkDataSerializer::Serialize47(const int a_ChunkX, const int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap)\n{\n\t// This function returns the fully compressed packet (including packet size), not the raw packet!\n\n\tconst auto Bitmask = GetSectionBitmask(a_BlockData, a_LightData);\n\n\t// Create the packet:\n\tm_Packet.WriteVarInt32(0x21);  // Packet id (Chunk Data packet)\n\tm_Packet.WriteBEInt32(a_ChunkX);\n\tm_Packet.WriteBEInt32(a_ChunkZ);\n\tm_Packet.WriteBool(true);      // \"Ground-up continuous\", or rather, \"biome data present\" flag\n\n\t// Minecraft 1.8 does not like completely empty packets\n\t// Send one completely empty chunk section if this is the case\n\tm_Packet.WriteBEUInt16(Bitmask.first ? Bitmask.first : 1);\n\n\t// Write the chunk size:\n\t// Account for the single empty section if sending an empty chunk\n\tconst int BiomeDataSize = cChunkDef::Width * cChunkDef::Width;\n\tconst size_t ChunkSize = (\n\t\t(Bitmask.second ? Bitmask.second : 1) * (ChunkBlockData::SectionBlockCount * 2 + ChunkLightData::SectionLightCount * 2) +  // Blocks and lighting\n\t\tBiomeDataSize    // Biome data\n\t);\n\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize));\n\n\t// Chunk written as seperate arrays of (blocktype + meta), blocklight and skylight\n\t// each array stores all present sections of the same kind packed together\n\n\t// Write the block types to the packet:\n\tChunkDef_ForEachSection(a_BlockData, a_LightData,\n\t{\n\t\tconst bool BlocksExist = Blocks != nullptr;\n\t\tconst bool MetasExist = Metas != nullptr;\n\n\t\tfor (size_t BlockIdx = 0; BlockIdx != ChunkBlockData::SectionBlockCount; ++BlockIdx)\n\t\t{\n\t\t\tBLOCKTYPE BlockType = BlocksExist ? (*Blocks)[BlockIdx] : 0;\n\t\t\tNIBBLETYPE BlockMeta = MetasExist ? cChunkDef::ExpandNibble(Metas->data(), BlockIdx) : 0;\n\t\t\tm_Packet.WriteBEUInt8(static_cast<unsigned char>(BlockType << 4) | BlockMeta);\n\t\t\tm_Packet.WriteBEUInt8(static_cast<unsigned char>(BlockType >> 4));\n\t\t}\n\t});\n\n\t// Write the block lights:\n\tChunkDef_ForEachSection(a_BlockData, a_LightData,\n\t{\n\t\tif (BlockLights == nullptr)\n\t\t{\n\t\t\tm_Packet.WriteBuf(ChunkLightData::SectionLightCount, ChunkLightData::DefaultBlockLightValue);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_Packet.WriteBuf(BlockLights->data(), BlockLights->size());\n\t\t}\n\t});\n\n\t// Write the sky lights:\n\tChunkDef_ForEachSection(a_BlockData, a_LightData,\n\t{\n\t\tif (SkyLights == nullptr)\n\t\t{\n\t\t\tm_Packet.WriteBuf(ChunkLightData::SectionLightCount, ChunkLightData::DefaultSkyLightValue);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_Packet.WriteBuf(SkyLights->data(), SkyLights->size());\n\t\t}\n\t});\n\n\t// Serialize a single empty section if sending an empty chunk\n\tif (!Bitmask.first)\n\t{\n\t\t// Block data (all air)\n\t\tfor (size_t i = 0; i < ChunkBlockData::SectionBlockCount * 2; i++)\n\t\t{\n\t\t\tm_Packet.WriteBEUInt8(0);\n\t\t}\n\t\t// Light data (XXX: sky light is not sent if in the nether)\n\t\tm_Packet.WriteBuf(ChunkLightData::SectionLightCount, ChunkLightData::DefaultSkyLightValue);\n\t\tm_Packet.WriteBuf(ChunkLightData::SectionLightCount, ChunkLightData::DefaultSkyLightValue);\n\t}\n\n\t// Write the biome data:\n\tm_Packet.WriteBuf(a_BiomeMap, BiomeDataSize);\n}\n\n\n\n\n\ninline void cChunkDataSerializer::Serialize107(const int a_ChunkX, const int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap)\n{\n\t// This function returns the fully compressed packet (including packet size), not the raw packet!\n\t// Below variables tagged static because of https://developercommunity.visualstudio.com/content/problem/367326\n\n\tstatic constexpr UInt8 BitsPerEntry = 13;\n\tstatic constexpr size_t ChunkSectionDataArraySize = (ChunkBlockData::SectionBlockCount * BitsPerEntry) / 8 / 8;  // Convert from bit count to long count\n\n\tconst auto Bitmask = GetSectionBitmask(a_BlockData, a_LightData);\n\n\t// Create the packet:\n\tm_Packet.WriteVarInt32(0x20);  // Packet id (Chunk Data packet)\n\tm_Packet.WriteBEInt32(a_ChunkX);\n\tm_Packet.WriteBEInt32(a_ChunkZ);\n\tm_Packet.WriteBool(true);        // \"Ground-up continuous\", or rather, \"biome data present\" flag\n\tm_Packet.WriteVarInt32(Bitmask.first);\n\n\tsize_t ChunkSectionSize = (\n\t\t1 +                                // Bits per block - set to 13, so the global palette is used and the palette has a length of 0\n\t\t1 +                                // Palette length\n\t\t2 +                                // Data array length VarInt - 2 bytes for the current value\n\t\tChunkSectionDataArraySize * 8 +    // Actual block data - multiplied by 8 because first number is longs\n\t\tChunkLightData::SectionLightCount  // Block light\n\t);\n\n\tif (m_Dimension == dimOverworld)\n\t{\n\t\t// Sky light is only sent in the overworld.\n\t\tChunkSectionSize += ChunkLightData::SectionLightCount;\n\t}\n\n\tconst size_t BiomeDataSize = cChunkDef::Width * cChunkDef::Width;\n\tconst size_t ChunkSize = (\n\t\tChunkSectionSize * Bitmask.second +\n\t\tBiomeDataSize\n\t);\n\n\t// Write the chunk size:\n\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize));\n\n\t// Write each chunk section...\n\tChunkDef_ForEachSection(a_BlockData, a_LightData,\n\t{\n\t\tm_Packet.WriteBEUInt8(BitsPerEntry);\n\t\tm_Packet.WriteVarInt32(0);  // Palette length is 0\n\t\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSectionDataArraySize));\n\t\tWriteBlockSectionSeamless<&PaletteLegacy>(Blocks, Metas, BitsPerEntry);\n\t\tWriteLightSectionGrouped(BlockLights, SkyLights);\n\t});\n\n\t// Write the biome data\n\tm_Packet.WriteBuf(a_BiomeMap, BiomeDataSize);\n}\n\n\n\n\n\ninline void cChunkDataSerializer::Serialize110(const int a_ChunkX, const int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap)\n{\n\t// This function returns the fully compressed packet (including packet size), not the raw packet!\n\t// Below variables tagged static because of https://developercommunity.visualstudio.com/content/problem/367326\n\n\tstatic constexpr UInt8 BitsPerEntry = 13;\n\tstatic constexpr size_t ChunkSectionDataArraySize = (ChunkBlockData::SectionBlockCount * BitsPerEntry) / 8 / 8;  // Convert from bit count to long count\n\n\tconst auto Bitmask = GetSectionBitmask(a_BlockData, a_LightData);\n\n\t// Create the packet:\n\tm_Packet.WriteVarInt32(0x20);  // Packet id (Chunk Data packet)\n\tm_Packet.WriteBEInt32(a_ChunkX);\n\tm_Packet.WriteBEInt32(a_ChunkZ);\n\tm_Packet.WriteBool(true);        // \"Ground-up continuous\", or rather, \"biome data present\" flag\n\tm_Packet.WriteVarInt32(Bitmask.first);\n\n\tsize_t ChunkSectionSize = (\n\t\t1 +                                // Bits per block - set to 13, so the global palette is used and the palette has a length of 0\n\t\t1 +                                // Palette length\n\t\t2 +                                // Data array length VarInt - 2 bytes for the current value\n\t\tChunkSectionDataArraySize * 8 +    // Actual block data - multiplied by 8 because first number is longs\n\t\tChunkLightData::SectionLightCount  // Block light\n\t);\n\n\tif (m_Dimension == dimOverworld)\n\t{\n\t\t// Sky light is only sent in the overworld.\n\t\tChunkSectionSize += ChunkLightData::SectionLightCount;\n\t}\n\n\tconst size_t BiomeDataSize = cChunkDef::Width * cChunkDef::Width;\n\tconst size_t ChunkSize = (\n\t\tChunkSectionSize * Bitmask.second +\n\t\tBiomeDataSize\n\t);\n\n\t// Write the chunk size:\n\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize));\n\n\t// Write each chunk section...\n\tChunkDef_ForEachSection(a_BlockData, a_LightData,\n\t{\n\t\tm_Packet.WriteBEUInt8(BitsPerEntry);\n\t\tm_Packet.WriteVarInt32(0);  // Palette length is 0\n\t\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSectionDataArraySize));\n\t\tWriteBlockSectionSeamless<&PaletteLegacy>(Blocks, Metas, BitsPerEntry);\n\t\tWriteLightSectionGrouped(BlockLights, SkyLights);\n\t});\n\n\t// Write the biome data\n\tm_Packet.WriteBuf(a_BiomeMap, BiomeDataSize);\n\n\t// Identify 1.9.4's tile entity list as empty\n\tm_Packet.WriteBEUInt8(0);\n}\n\n\n\n\n\ntemplate <auto Palette>\ninline void cChunkDataSerializer::Serialize393(const int a_ChunkX, const int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap)\n{\n\t// This function returns the fully compressed packet (including packet size), not the raw packet!\n\t// Below variables tagged static because of https://developercommunity.visualstudio.com/content/problem/367326\n\n\tstatic constexpr UInt8 BitsPerEntry = 14;\n\tstatic constexpr size_t ChunkSectionDataArraySize = (ChunkBlockData::SectionBlockCount * BitsPerEntry) / 8 / 8;\n\n\tconst auto Bitmask = GetSectionBitmask(a_BlockData, a_LightData);\n\n\t// Create the packet:\n\tm_Packet.WriteVarInt32(0x22);  // Packet id (Chunk Data packet)\n\tm_Packet.WriteBEInt32(a_ChunkX);\n\tm_Packet.WriteBEInt32(a_ChunkZ);\n\tm_Packet.WriteBool(true);  // \"Ground-up continuous\", or rather, \"biome data present\" flag\n\tm_Packet.WriteVarInt32(Bitmask.first);\n\n\tsize_t ChunkSectionSize = (\n\t\t1 +  // Bits per entry, BEUInt8, 1 byte\n\t\tm_Packet.GetVarIntSize(static_cast<UInt32>(ChunkSectionDataArraySize)) +  // Field containing \"size of whole section\", VarInt32, variable size\n\t\tChunkSectionDataArraySize * 8 +  // Actual section data, lots of bytes (multiplier 1 long = 8 bytes)\n\t\tChunkLightData::SectionLightCount  // Size of blocklight which is always sent\n\t);\n\n\tif (m_Dimension == dimOverworld)\n\t{\n\t\t// Sky light is only sent in the overworld.\n\t\tChunkSectionSize += ChunkLightData::SectionLightCount;\n\t}\n\n\tconst size_t BiomeDataSize = cChunkDef::Width * cChunkDef::Width;\n\tconst size_t ChunkSize = (\n\t\tChunkSectionSize * Bitmask.second +\n\t\tBiomeDataSize * 4  // Biome data now BE ints\n\t);\n\n\t// Write the chunk size in bytes:\n\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize));\n\n\t// Write each chunk section...\n\tChunkDef_ForEachSection(a_BlockData, a_LightData,\n\t{\n\t\tm_Packet.WriteBEUInt8(BitsPerEntry);\n\t\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSectionDataArraySize));\n\t\tWriteBlockSectionSeamless<Palette>(Blocks, Metas, BitsPerEntry);\n\t\tWriteLightSectionGrouped(BlockLights, SkyLights);\n\t});\n\n\t// Write the biome data\n\tfor (size_t i = 0; i != BiomeDataSize; i++)\n\t{\n\t\tm_Packet.WriteBEUInt32(static_cast<UInt32>(a_BiomeMap[i]));\n\t}\n\n\t// Identify 1.9.4's tile entity list as empty\n\tm_Packet.WriteVarInt32(0);\n}\n\n\n\n\n\ninline void cChunkDataSerializer::Serialize477(const int a_ChunkX, const int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap)\n{\n\t// This function returns the fully compressed packet (including packet size), not the raw packet!\n\t// Below variables tagged static because of https://developercommunity.visualstudio.com/content/problem/367326\n\n\tstatic constexpr UInt8 BitsPerEntry = 14;\n\tstatic constexpr size_t ChunkSectionDataArraySize = (ChunkBlockData::SectionBlockCount * BitsPerEntry) / 8 / 8;\n\n\tconst auto Bitmask = GetSectionBitmask(a_BlockData, a_LightData);\n\n\t// Create the packet:\n\tm_Packet.WriteVarInt32(0x21);  // Packet id (Chunk Data packet)\n\tm_Packet.WriteBEInt32(a_ChunkX);\n\tm_Packet.WriteBEInt32(a_ChunkZ);\n\tm_Packet.WriteBool(true);  // \"Ground-up continuous\", or rather, \"biome data present\" flag\n\tm_Packet.WriteVarInt32(Bitmask.first);\n\n\t{\n\t\tcFastNBTWriter Writer;\n\t\t// TODO: client works fine without?\n\t\t// std::array<Int64, 36> Longz = {};\n\t\t// Writer.AddLongArray(\"MOTION_BLOCKING\", Longz.data(), Longz.size());\n\t\tWriter.Finish();\n\t\tm_Packet.Write(Writer.GetResult().data(), Writer.GetResult().size());\n\t}\n\n\tconst size_t ChunkSectionSize = (\n\t\t2 +  // Block count, BEInt16, 2 bytes\n\t\t1 +  // Bits per entry, BEUInt8, 1 byte\n\t\tm_Packet.GetVarIntSize(static_cast<UInt32>(ChunkSectionDataArraySize)) +  // Field containing \"size of whole section\", VarInt32, variable size\n\t\tChunkSectionDataArraySize * 8  // Actual section data, lots of bytes (multiplier 1 long = 8 bytes)\n\t);\n\n\tconst size_t BiomeDataSize = cChunkDef::Width * cChunkDef::Width;\n\tconst size_t ChunkSize = (\n\t\tChunkSectionSize * Bitmask.second +\n\t\tBiomeDataSize * 4  // Biome data now BE ints\n\t);\n\n\t// Write the chunk size in bytes:\n\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize));\n\n\t// Write each chunk section...\n\tChunkDef_ForEachSection(a_BlockData, a_LightData,\n\t{\n\t\tm_Packet.WriteBEInt16(ChunkBlockData::SectionBlockCount);  // a temp fix to make sure sections don't disappear\n\t\tm_Packet.WriteBEUInt8(BitsPerEntry);\n\t\tm_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSectionDataArraySize));\n\t\tWriteBlockSectionSeamless<&Palette477>(Blocks, Metas, BitsPerEntry);\n\t});\n\n\t// Write the biome data\n\tfor (size_t i = 0; i != BiomeDataSize; i++)\n\t{\n\t\tm_Packet.WriteBEUInt32(a_BiomeMap[i]);\n\t}\n\n\t// Identify 1.9.4's tile entity list as empty\n\tm_Packet.WriteVarInt32(0);\n}\n\n\n\n\n\ntemplate <auto Palette>\ninline void cChunkDataSerializer::WriteBlockSectionSeamless(const ChunkBlockData::BlockArray * a_Blocks, const ChunkBlockData::MetaArray * a_Metas, const UInt8 a_BitsPerEntry)\n{\n\t// https://wiki.vg/Chunk_Format#Data_structure\n\n\t// We shift a UInt64 by a_BitsPerEntry, the latter cannot be too big:\n\tASSERT(a_BitsPerEntry < 64);\n\n\tUInt64 Buffer = 0;  // A buffer to compose multiple smaller bitsizes into one 64-bit number\n\tunsigned char BitIndex = 0;  // The bit-position in Buffer that represents where to write next\n\n\tconst bool BlocksExist = a_Blocks != nullptr;\n\tconst bool MetasExist = a_Metas != nullptr;\n\n\tfor (size_t Index = 0; Index != ChunkBlockData::SectionBlockCount; Index++)\n\t{\n\t\tconst BLOCKTYPE BlockType = BlocksExist ? (*a_Blocks)[Index] : 0;\n\t\tconst NIBBLETYPE BlockMeta = MetasExist ? cChunkDef::ExpandNibble(a_Metas->data(), Index) : 0;\n\t\tconst auto Value = Palette(BlockType, BlockMeta);\n\n\t\t// Write as much as possible of Value, starting from BitIndex, into Buffer:\n\t\tBuffer |= static_cast<UInt64>(Value) << BitIndex;\n\n\t\t// The _signed_ count of bits in Value left to write\n\t\tconst auto Remaining = static_cast<char>(a_BitsPerEntry - (64 - BitIndex));\n\t\tif (Remaining >= 0)\n\t\t{\n\t\t\t// There were some bits remaining: we've filled the buffer. Flush it:\n\t\t\tm_Packet.WriteBEUInt64(Buffer);\n\n\t\t\t// And write the remaining bits, setting the new BitIndex:\n\t\t\tBuffer = static_cast<UInt64>(Value >> (a_BitsPerEntry - Remaining));\n\t\t\tBitIndex = static_cast<unsigned char>(Remaining);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// It fit, excellent.\n\t\t\tBitIndex += a_BitsPerEntry;\n\t\t}\n\t}\n\n\tstatic_assert((ChunkBlockData::SectionBlockCount % 64) == 0, \"Section must fit wholly into a 64-bit long array\");\n\tASSERT(BitIndex == 0);\n\tASSERT(Buffer == 0);\n}\n\n\n\n\n\ninline void cChunkDataSerializer::WriteLightSectionGrouped(const ChunkLightData::LightArray * const a_BlockLights, const ChunkLightData::LightArray * const a_SkyLights)\n{\n\t// Write lighting:\n\tif (a_BlockLights == nullptr)\n\t{\n\t\tm_Packet.WriteBuf(ChunkLightData::SectionLightCount, ChunkLightData::DefaultBlockLightValue);\n\t}\n\telse\n\t{\n\t\tm_Packet.WriteBuf(a_BlockLights->data(), a_BlockLights->size());\n\t}\n\n\t// Skylight is only sent in the overworld; the nether and end do not use it:\n\tif (m_Dimension == dimOverworld)\n\t{\n\t\tif (a_SkyLights == nullptr)\n\t\t{\n\t\t\tm_Packet.WriteBuf(ChunkLightData::SectionLightCount, ChunkLightData::DefaultSkyLightValue);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_Packet.WriteBuf(a_SkyLights->data(), a_SkyLights->size());\n\t\t}\n\t}\n}\n\n\n\n\n\ninline void cChunkDataSerializer::CompressPacketInto(ChunkDataCache & a_Cache)\n{\n\tm_Compressor.ReadFrom(m_Packet);\n\tm_Packet.CommitRead();\n\n\tcProtocol_1_8_0::CompressPacket(m_Compressor, a_Cache.ToSend);\n\n\ta_Cache.Engaged = true;\n}\n"
  },
  {
    "path": "src/Protocol/ChunkDataSerializer.h",
    "content": "#pragma once\n\n#include \"../ByteBuffer.h\"\n#include \"../ChunkData.h\"\n#include \"../Defines.h\"\n#include \"CircularBufferCompressor.h\"\n#include \"StringCompression.h\"\n\n\n\n\n\nclass cByteBuffer;\n\n\n\n\n\n/** Serializes one chunk's data to (possibly multiple) protocol versions.\nCaches the serialized data for as long as this object lives, so that the same data can be sent to\nother clients using the same protocol. */\nclass cChunkDataSerializer\n{\n\tusing ClientHandles = std::vector<std::shared_ptr<cClientHandle>>;\n\n\t/** Enum to collapse protocol versions into a contiguous index. */\n\tenum class CacheVersion\n\t{\n\t\tv47,\n\t\tv107,\n\t\tv110,\n\t\tv393,\n\t\tv401,\n\t\tv477,\n\n\t\tLast = CacheVersion::v477\n\t};\n\n\t/** A single cache entry containing the raw data, compressed data, and a validity flag. */\n\tstruct ChunkDataCache\n\t{\n\t\tContiguousByteBuffer ToSend;\n\t\tbool Engaged = false;\n\t};\n\npublic:\n\n\tcChunkDataSerializer(eDimension a_Dimension);\n\n\t/** For each client, serializes the chunk into their protocol version and sends it.\n\tParameters are the coordinates of the chunk to serialise, and the data and biome data read from the chunk. */\n\tvoid SendToClients(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap, const ClientHandles & a_SendTo);\n\nprivate:\n\n\t/** Serialises the given chunk, storing the result into the given cache entry, and sends the data.\n\tIf the cache entry is already present, simply re-uses it. */\n\tinline void Serialize(const ClientHandles::value_type & a_Client, int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap, CacheVersion a_CacheVersion);\n\n\tinline void Serialize47 (int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap);  // Release 1.8\n\tinline void Serialize107(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap);  // Release 1.9\n\tinline void Serialize110(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap);  // Release 1.9.4\n\ttemplate <auto Palette>\n\tinline void Serialize393(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap);  // Release 1.13 - 1.13.2\n\tinline void Serialize477(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap);  // Release 1.14 - 1.14.4\n\n\t/** Writes all blocks in a chunk section into a series of Int64.\n\tWrites start from the bit directly subsequent to the previous write's end, possibly crossing over to the next Int64. */\n\ttemplate <auto Palette>\n\tinline void WriteBlockSectionSeamless(const ChunkBlockData::BlockArray * a_Blocks, const ChunkBlockData::MetaArray * a_Metas, UInt8 a_BitsPerEntry);\n\n\t/** Copies all lights in a chunk section into the packet, block light followed immediately by sky light. */\n\tinline void WriteLightSectionGrouped(const ChunkLightData::LightArray * a_BlockLights, const ChunkLightData::LightArray * a_SkyLights);\n\n\t/** Finalises the data, compresses it if required, and stores it into cache. */\n\tinline void CompressPacketInto(ChunkDataCache & a_Cache);\n\n\t/** A staging area used to construct the chunk packet, persistent to avoid reallocating. */\n\tcByteBuffer m_Packet;\n\n\t/** A compressor used to compress the chunk data. */\n\tCircularBufferCompressor m_Compressor;\n\n\t/** The dimension for the World this Serializer is tied to. */\n\tconst eDimension m_Dimension;\n\n\t/** A cache, mapping protocol version to a fully serialised chunk.\n\tIt is used during a single invocation of SendToClients with more than one client. */\n\tstd::array<ChunkDataCache, static_cast<size_t>(CacheVersion::Last) + 1> m_Cache;\n} ;\n"
  },
  {
    "path": "src/Protocol/ForgeHandshake.cpp",
    "content": "\n// ForgeHandshake.cpp\n\n// Implements Forge protocol handshaking\n\n#include \"Globals.h\"\n#include \"ForgeHandshake.h\"\n#include \"json/json.h\"\n#include \"../Server.h\"\n#include \"../ByteBuffer.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../ClientHandle.h\"\n#include \"../Root.h\"\n\n\n/** Discriminator byte values prefixing the FML|HS packets to determine their type. */\nnamespace Discriminator\n{\n\tstatic const Int8 ServerHello = 0;\n\tstatic const Int8 ClientHello = 1;\n\tstatic const Int8 ModList = 2;\n\tstatic const Int8 RegistryData = 3;\n\t// static const Int8 HandshakeReset = -2;\n\tstatic const Int8 HandshakeAck = -1;\n}\n\n/** Client handshake state phases. */\nnamespace ClientPhase\n{\n\tstatic const Int8 WAITINGSERVERDATA = 2;\n\tstatic const Int8 WAITINGSERVERCOMPLETE = 3;\n\tstatic const Int8 PENDINGCOMPLETE = 4;\n\tstatic const Int8 COMPLETE = 5;\n}\n\n/** Server handshake state phases. */\nnamespace ServerPhase\n{\n\tstatic const auto WAITINGCACK = std::byte(2);\n\tstatic const auto COMPLETE = std::byte(3);\n}\n\n\n\n\n\ncForgeHandshake::cForgeHandshake() :\n\tIsForgeClient(false),\n\tm_Errored(false)\n{\n}\n\n\n\n\n\nvoid cForgeHandshake::SetError(const AString & message)\n{\n\tLOGD(\"Forge handshake error: %s\", message.c_str());\n\tm_Errored = true;\n}\n\n\n\n\n\nvoid cForgeHandshake::AugmentServerListPing(cClientHandle & a_Client, Json::Value & a_ResponseValue)\n{\n\tauto ProtocolVersion = a_Client.GetProtocolVersion();\n\tauto & Mods = cRoot::Get()->GetServer()->GetRegisteredForgeMods(ProtocolVersion);\n\n\tif (Mods.empty())\n\t{\n\t\treturn;\n\t}\n\n\tLOGD(\"Received server ping from version: %d\", ProtocolVersion);\n\n\tJson::Value Modinfo;\n\tModinfo[\"type\"] = \"FML\";\n\n\tJson::Value ModList(Json::arrayValue);\n\tfor (auto & item: Mods)\n\t{\n\t\tJson::Value Mod;\n\t\tMod[\"modid\"] = item.first;\n\t\tMod[\"version\"] = item.second;\n\t\tModList.append(Mod);\n\t}\n\tModinfo[\"modList\"] = ModList;\n\n\ta_ResponseValue[\"modinfo\"] = Modinfo;\n}\n\n\n\n\n\nvoid cForgeHandshake::BeginForgeHandshake(cClientHandle & a_Client)\n{\n\tASSERT(IsForgeClient);\n\n\tstatic const std::array<std::string_view, 5> Channels{{ \"FML|HS\", \"FML\", \"FML|MP\", \"FML\", \"FORGE\" }};\n\tContiguousByteBuffer ChannelsString;\n\tfor (auto & Channel: Channels)\n\t{\n\t\tChannelsString.append({ reinterpret_cast<const std::byte *>(Channel.data()), Channel.size() });\n\t\tChannelsString.push_back(std::byte(0));\n\t}\n\n\ta_Client.SendPluginMessage(\"REGISTER\", ChannelsString);\n\tSendServerHello(a_Client);\n}\n\n\n\n\n\nvoid cForgeHandshake::SendServerHello(cClientHandle & a_Client)\n{\n\tcByteBuffer Buf(6);\n\t// Discriminator | Byte | Always 0 for ServerHello\n\tBuf.WriteBEInt8(Discriminator::ServerHello);\n\t// FML protocol Version | Byte | Determined from NetworkRegistery. Currently 2.\n\tBuf.WriteBEInt8(2);\n\t// Dimension TODO\n\tBuf.WriteBEInt32(0);\n\n\tContiguousByteBuffer Message;\n\tBuf.ReadAll(Message);\n\n\ta_Client.SendPluginMessage(\"FML|HS\", Message);\n}\n\n\n\n\n\nAStringMap cForgeHandshake::ParseModList(const ContiguousByteBufferView a_Data)\n{\n\tAStringMap Mods;\n\n\tif (a_Data.size() < 4)\n\t{\n\t\tSetError(fmt::format(FMT_STRING(\"ParseModList invalid packet, missing length (size = {})\"), a_Data.size()));\n\t\treturn Mods;\n\t}\n\n\tcByteBuffer Buf(a_Data.size());\n\tBuf.Write(a_Data.data(), a_Data.size());\n\tUInt32 NumMods;\n\tif (!Buf.ReadVarInt32(NumMods))\n\t{\n\t\tSetError(\"ParseModList failed to read mod count\");\n\t\treturn Mods;\n\t}\n\n\tfor (UInt32 i = 0; i < NumMods; ++i)\n\t{\n\t\tAString Name, Version;\n\t\tif (!Buf.ReadVarUTF8String(Name))\n\t\t{\n\t\t\tSetError(fmt::format(FMT_STRING(\"ParseModList failed to read mod name at i = {}\"), i));\n\t\t\tbreak;\n\t\t}\n\t\tif (!Buf.ReadVarUTF8String(Version))\n\t\t{\n\t\t\tSetError(fmt::format(FMT_STRING(\"ParseModList failed to read mod version at i = {}\"), i));\n\t\t\tbreak;\n\t\t}\n\t\tMods.insert({Name, Version});\n\t}\n\n\treturn Mods;\n}\n\n\n\n\n\nvoid cForgeHandshake::HandleClientHello(cClientHandle & a_Client, const ContiguousByteBufferView a_Data)\n{\n\tif (a_Data.size() == 2)\n\t{\n\t\tconst auto FmlProtocolVersion = static_cast<Int8>(a_Data[1]);\n\t\tLOGD(\"Received ClientHello with FML protocol version %d\", FmlProtocolVersion);\n\t\tif (FmlProtocolVersion != 2)\n\t\t{\n\t\t\tSetError(fmt::format(FMT_STRING(\"Unsupported FML client protocol version received in ClientHello: {}\"), FmlProtocolVersion));\n\t\t}\n\t}\n\telse\n\t{\n\t\tSetError(fmt::format(FMT_STRING(\"Received unexpected length of ClientHello: {}\"), a_Data.size()));\n\t}\n}\n\n\n\n\n\nvoid cForgeHandshake::HandleModList(cClientHandle & a_Client, const ContiguousByteBufferView a_Data)\n{\n\tLOGD(\"Received ModList\");\n\n\tauto ClientMods = ParseModList(a_Data.substr(1));\n\tAString ClientModsString;\n\tfor (auto & item: ClientMods)\n\t{\n\t\tClientModsString.append(fmt::format(FMT_STRING(\"{}@{}, \"), item.first, item.second));\n\t}\n\n\tLOG(\"Client connected with %zu mods: %s\", ClientMods.size(), ClientModsString);\n\n\ta_Client.m_ForgeMods = ClientMods;\n\n\t// Let the plugins know about this event, they may refuse the player:\n\tif (cRoot::Get()->GetPluginManager()->CallHookLoginForge(a_Client, ClientMods))\n\t{\n\t\tSetError(\"Modded client refused by plugin\");\n\t\treturn;\n\t}\n\n\t// Send server ModList\n\n\t// Send server-side Forge mods registered by plugins\n\tconst auto & ServerMods = a_Client.GetForgeMods();\n\n\tconst auto ModCount = ServerMods.size();\n\n\tcByteBuffer Buf(256 * ModCount);\n\n\tBuf.WriteBEInt8(Discriminator::ModList);\n\tBuf.WriteVarInt32(static_cast<UInt32>(ModCount));\n\tfor (const auto & item: ServerMods)\n\t{\n\t\tBuf.WriteVarUTF8String(item.first);   // name\n\t\tBuf.WriteVarUTF8String(item.second);  // version\n\t}\n\n\tContiguousByteBuffer ServerModList;\n\tBuf.ReadAll(ServerModList);\n\n\ta_Client.SendPluginMessage(\"FML|HS\", ServerModList);\n}\n\n\n\n\n\nvoid cForgeHandshake::HandleHandshakeAck(cClientHandle & a_Client, const ContiguousByteBufferView a_Data)\n{\n\tif (a_Data.size() != 2)\n\t{\n\t\tSetError(fmt::format(FMT_STRING(\"Unexpected HandshakeAck packet length: {}\"), a_Data.size()));\n\t\treturn;\n\t}\n\n\tconst auto Phase = static_cast<Int8>(a_Data[1]);\n\tLOGD(\"Received client HandshakeAck with phase = %d\", Phase);\n\n\tswitch (Phase)\n\t{\n\t\tcase ClientPhase::WAITINGSERVERDATA:\n\t\t{\n\t\t\tcByteBuffer Buf(1024);\n\t\t\tBuf.WriteBEInt8(Discriminator::RegistryData);\n\n\t\t\t// TODO: send real registry data\n\t\t\tbool HasMore = false;\n\t\t\tAString RegistryName = \"potions\";\n\t\t\tUInt32 NumIDs = 0;\n\t\t\tUInt32 NumSubstitutions = 0;\n\t\t\tUInt32 NumDummies = 0;\n\n\t\t\tBuf.WriteBool(HasMore);\n\t\t\tBuf.WriteVarUTF8String(RegistryName);\n\t\t\tBuf.WriteVarInt32(NumIDs);\n\t\t\tBuf.WriteVarInt32(NumSubstitutions);\n\t\t\tBuf.WriteVarInt32(NumDummies);\n\n\t\t\tContiguousByteBuffer RegistryData;\n\t\t\tBuf.ReadAll(RegistryData);\n\t\t\ta_Client.SendPluginMessage(\"FML|HS\", RegistryData);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase ClientPhase::WAITINGSERVERCOMPLETE:\n\t\t{\n\t\t\tLOGD(\"Client finished receiving registry data; acknowledging\");\n\n\t\t\tContiguousByteBuffer Ack;\n\t\t\tAck.push_back(std::byte(Discriminator::HandshakeAck));\n\t\t\tAck.push_back(ServerPhase::WAITINGCACK);\n\t\t\ta_Client.SendPluginMessage(\"FML|HS\", Ack);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase ClientPhase::PENDINGCOMPLETE:\n\t\t{\n\t\t\tLOGD(\"Client is pending completion; sending complete ack\");\n\n\t\t\tContiguousByteBuffer Ack;\n\t\t\tAck.push_back(std::byte(Discriminator::HandshakeAck));\n\t\t\tAck.push_back(ServerPhase::COMPLETE);\n\t\t\ta_Client.SendPluginMessage(\"FML|HS\", Ack);\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase ClientPhase::COMPLETE:\n\t\t{\n\t\t\t// Now finish logging in:\n\t\t\ta_Client.FinishAuthenticate();\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tSetError(fmt::format(\"Received unknown phase in Forge handshake acknowledgement: {}\", Phase));\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cForgeHandshake::DataReceived(cClientHandle & a_Client, const ContiguousByteBufferView a_Data)\n{\n\tif (!IsForgeClient)\n\t{\n\t\tSetError(fmt::format(FMT_STRING(\"Received unexpected Forge data from non-Forge client ({} bytes)\"), a_Data.size()));\n\t\treturn;\n\t}\n\tif (m_Errored)\n\t{\n\t\tLOGD(\"Received unexpected Forge data when in errored state, ignored\");\n\t\treturn;\n\t}\n\n\tif (a_Data.size() <= 1)\n\t{\n\t\tSetError(fmt::format(FMT_STRING(\"Received unexpectedly short Forge data ({} bytes)\"), a_Data.size()));\n\t\treturn;\n\t}\n\n\tconst auto Discriminator = static_cast<Int8>(a_Data[0]);\n\tswitch (Discriminator)\n\t{\n\t\tcase Discriminator::ClientHello:  HandleClientHello(a_Client, a_Data); break;\n\t\tcase Discriminator::ModList:      HandleModList(a_Client, a_Data); break;\n\t\tcase Discriminator::HandshakeAck: HandleHandshakeAck(a_Client, a_Data); break;\n\n\t\tdefault:\n\t\t{\n\t\t\tSetError(fmt::format(FMT_STRING(\"Unexpected Forge packet {0} (0x{0:x}) received\"), Discriminator));\n\t\t\treturn;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/ForgeHandshake.h",
    "content": "\n// ForgeHandshake.h\n\n// Implements Forge protocol handshaking\n\n#pragma once\n\n#include <stddef.h>\n#include \"../UUID.h\"\n#include \"json/json.h\"\n\n\n\n\n\n// fwd:\nclass cClientHandle;\n\n\n\n\n\nclass cForgeHandshake\n{\npublic:\n\n\t/** True if the client advertised itself as a Forge client. */\n\tbool IsForgeClient;\n\n\tcForgeHandshake();\n\n\t/** Add the registered Forge mods to the server ping list packet. */\n\tvoid AugmentServerListPing(cClientHandle & a_Client, Json::Value & ResponseValue);\n\n\t/** Begin the Forge Modloader Handshake (FML|HS) sequence. */\n\tvoid BeginForgeHandshake(cClientHandle & a_Client);\n\n\t/** Send the ServerHello packet in the Forge handshake. */\n\tvoid SendServerHello(cClientHandle & a_Client);\n\n\t/** Process received data from the client advancing the Forge handshake. */\n\tvoid DataReceived(cClientHandle & a_Client, ContiguousByteBufferView a_Data);\n\nprivate:\n\n\t/** True if the Forge handshake is in an errored state. */\n\tbool m_Errored;\n\n\tvoid HandleClientHello(cClientHandle & a_Client, ContiguousByteBufferView a_Data);\n\tvoid HandleModList(cClientHandle & a_Client, ContiguousByteBufferView a_Data);\n\tvoid HandleHandshakeAck(cClientHandle & a_Client, ContiguousByteBufferView a_Data);\n\n\t/** Set errored state to prevent further handshake message processing. */\n\tvoid SetError(const AString & message);\n\n\t/** Parse the client ModList packet of installed Forge mods and versions. */\n\tAStringMap ParseModList(ContiguousByteBufferView a_Data);\n};\n"
  },
  {
    "path": "src/Protocol/MojangAPI.cpp",
    "content": "\n// MojangAPI.cpp\n\n// Implements the cMojangAPI class representing the various API points provided by Mojang's webservices, and a cache for their results\n\n#include \"Globals.h\"\n#include \"MojangAPI.h\"\n\n#include \"HTTP/UrlClient.h\"\n#include \"IniFile.h\"\n#include \"JsonUtils.h\"\n#include \"json/json.h\"\n#include \"mbedTLS++/BlockingSslClientSocket.h\"\n#include \"mbedTLS++/SslConfig.h\"\n#include \"OSSupport/IsThread.h\"\n#include \"RankManager.h\"\n#include \"Root.h\"\n#include \"SQLiteCpp/Database.h\"\n#include \"SQLiteCpp/Statement.h\"\n\n\n\n\n/** The maximum age for items to be kept in the cache. Any item older than this will be removed. */\nconst Int64 MAX_AGE = 7 * 24 * 60 * 60;  // 7 days ago\n\n/** The maximum number of names to send in a single query */\nconst int MAX_PER_QUERY = 100;\n\n\n\n\n\nconstexpr char DEFAULT_NAME_TO_UUID_SERVER[]     = \"api.mojang.com\";\nconstexpr char DEFAULT_NAME_TO_UUID_ADDRESS[]    = \"/profiles/minecraft\";\nconstexpr char DEFAULT_UUID_TO_PROFILE_SERVER[]  = \"sessionserver.mojang.com\";\nconstexpr char DEFAULT_UUID_TO_PROFILE_ADDRESS[] = \"/session/minecraft/profile/%UUID%?unsigned=false\";\n\n\n\n\n\nnamespace MojangTrustedRootCAs\n{\n\t/** Returns the Options that should be used for cUrlClient queries to the Mojang APIs. */\n\tstatic const AStringMap & UrlClientOptions()\n\t{\n\t\tstatic const AString CertString =\n\t\t\t// DigiCert Global Root CA (sessionserver.mojang.com, api.mojang.com)\n\t\t\t// Downloaded from https://www.digicert.com/kb/digicert-root-certificates.htm\n\n\t\t\t// DigiCert Global Root CA\n\t\t\t\"-----BEGIN CERTIFICATE-----\\n\"\n\t\t\t\"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\\n\"\n\t\t\t\"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\\n\"\n\t\t\t\"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\\n\"\n\t\t\t\"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\\n\"\n\t\t\t\"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\\n\"\n\t\t\t\"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\\n\"\n\t\t\t\"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\\n\"\n\t\t\t\"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\\n\"\n\t\t\t\"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\\n\"\n\t\t\t\"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\\n\"\n\t\t\t\"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\\n\"\n\t\t\t\"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\\n\"\n\t\t\t\"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\\n\"\n\t\t\t\"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\\n\"\n\t\t\t\"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\\n\"\n\t\t\t\"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\\n\"\n\t\t\t\"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\\n\"\n\t\t\t\"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\\n\"\n\t\t\t\"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\\n\"\n\t\t\t\"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\\n\"\n\t\t\t\"-----END CERTIFICATE-----\\n\"\n\n\t\t\t// AAA Certificate Services (authserver.ely.by GH#4832)\n\t\t\t// Downloaded from https://www.tbs-certificates.co.uk/FAQ/en/Comodo_AAA_Certificate_Services.html\n\t\t\t\"-----BEGIN CERTIFICATE-----\\n\"\n\t\t\t\"MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb\\n\"\n\t\t\t\"MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\\n\"\n\t\t\t\"GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj\\n\"\n\t\t\t\"YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL\\n\"\n\t\t\t\"MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\\n\"\n\t\t\t\"BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM\\n\"\n\t\t\t\"GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\\n\"\n\t\t\t\"ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua\\n\"\n\t\t\t\"BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe\\n\"\n\t\t\t\"3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4\\n\"\n\t\t\t\"YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR\\n\"\n\t\t\t\"rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm\\n\"\n\t\t\t\"ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU\\n\"\n\t\t\t\"oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\\n\"\n\t\t\t\"MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v\\n\"\n\t\t\t\"QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t\\n\"\n\t\t\t\"b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF\\n\"\n\t\t\t\"AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q\\n\"\n\t\t\t\"GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\\n\"\n\t\t\t\"Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2\\n\"\n\t\t\t\"G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi\\n\"\n\t\t\t\"l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3\\n\"\n\t\t\t\"smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\\n\"\n\t\t\t\"-----END CERTIFICATE-----\\n\"\n\t\t;\n\t\tstatic const AStringMap UrlClientOptions = {{\"TrustedRootCAs\", CertString}};\n\t\treturn UrlClientOptions;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMojangAPI::sProfile:\n\ncMojangAPI::sProfile::sProfile(\n\tconst AString & a_PlayerName,\n\tconst cUUID & a_UUID,\n\tconst Json::Value & a_Properties,\n\tInt64 a_DateTime\n) :\n\tm_PlayerName(a_PlayerName),\n\tm_UUID(a_UUID),\n\tm_Textures(),\n\tm_TexturesSignature(),\n\tm_DateTime(a_DateTime)\n{\n\t/*\n\tExample a_Profile contents:\n\t\"properties\":\n\t[\n\t\t{\n\t\t\t\"name\": \"textures\",\n\t\t\t\"value\": \"eyJ0aW1lc3RhbXAiOjE0MDcwNzAzMjEyNzEsInByb2ZpbGVJZCI6ImIxY2FmMjQyMDJhODQxYTc4MDU1YTA3OWM0NjBlZWU3IiwicHJvZmlsZU5hbWUiOiJ4b2Z0IiwiaXNQdWJsaWMiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iNzc5YmFiZjVhNTg3Zjk0OGFkNjc0N2VhOTEyNzU0MjliNjg4Mjk1YWUzYzA3YmQwZTJmNWJmNGQwNTIifX19\",\n\t\t\t\"signature\": \"XCty+jGEF39hEPrPhYNnCX087kPaoCjYruzYI/DS4nkL5hbjnkSM5Rh15hnUyv/FHhC8OF5rif3D1tQjtMI19KSVaXoUFXpbJM8/+PB8GDgEbX8Fc3u9nYkzOcM/xfxdYsFAdFhLQMkvase/BZLSuPhdy9DdI+TCrO7xuSTZfYmmwVuWo3w5gCY+mSIAnqltnOzaOOTcly75xvO0WYpVk7nJdnR2tvSi0wfrQPDrIg/uzhX7p0SnDqijmBU4QaNez/TNKiFxy69dAzt0RSotlQzqkDbyVKhhv9a4eY8h3pXi4UMftKEj4FAKczxLImkukJXuOn5NN15/Q+le0rJVBC60/xjKIVzltEsMN6qjWD0lQjey7WEL+4pGhCVuWY5KzuZjFvgqszuJTFz7lo+bcHiceldJtea8/fa02eTRObZvdLxbWC9ZfFY0IhpOVKfcLdno/ddDMNMQMi5kMrJ8MZZ/PcW1w5n7MMGWPGCla1kOaC55AL0QYSMGRVEZqgU9wXI5M7sHGZKGM4mWxkbEJYBkpI/p3GyxWgV6v33ZWlsz65TqlNrR1gCLaoFCm7Sif8NqPBZUAONHYon0roXhin/DyEanS93WV6i6FC1Wisscjq2AcvnOlgTo/5nN/1QsMbjNumuMGo37sqjRqlXoPb8zEUbAhhztYuJjEfQ2Rd8=\"\n\t\t}\n\t]\n\t*/\n\n\t// Parse the Textures and TexturesSignature from the Profile:\n\tif (!a_Properties.isArray())\n\t{\n\t\t// Properties is not a valid array, bail out\n\t\treturn;\n\t}\n\tJson::UInt Size = a_Properties.size();\n\tfor (Json::UInt i = 0; i < Size; i++)\n\t{\n\t\tconst Json::Value & Prop = a_Properties[i];\n\t\tif (Prop.get(\"name\", \"\").asString() != \"textures\")\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tm_Textures = Prop.get(\"value\", \"\").asString();\n\t\tm_TexturesSignature = Prop.get(\"signature\", \"\").asString();\n\t\tbreak;\n\t}  // for i - Properties[]\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMojangAPI::cUpdateThread:\n\nclass cMojangAPI::cUpdateThread:\n\tpublic cIsThread\n{\n\tusing Super = cIsThread;\n\npublic:\n\n\tcUpdateThread(cMojangAPI & a_MojangAPI):\n\t\tSuper(\"MojangAPI Updater\"),\n\t\tm_MojangAPI(a_MojangAPI)\n\t{\n\t}\n\n\tvirtual ~cUpdateThread() override\n\t{\n\t\t// Notify the thread that it should stop:\n\t\tm_ShouldTerminate = true;\n\t\tm_evtNotify.Set();\n\n\t\t// Wait for the thread to actually finish work:\n\t\tStop();\n\t}\n\nprotected:\n\n\t/** The cMojangAPI instance to update. */\n\tcMojangAPI & m_MojangAPI;\n\n\t/** The event used for notifying that the thread should terminate, as well as timing. */\n\tcEvent m_evtNotify;\n\n\n\t// cIsThread override:\n\tvirtual void Execute(void) override\n\t{\n\t\tdo\n\t\t{\n\t\t\tm_MojangAPI.Update();\n\t\t} while (!m_ShouldTerminate && !m_evtNotify.Wait(60 * 60 * 1000));  // Repeat every 60 minutes until termination request\n\t}\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cMojangAPI:\n\ncMojangAPI::cMojangAPI():\n\tm_RankMgr(nullptr),\n\tm_UpdateThread(new cUpdateThread(*this))\n{\n}\n\n\n\n\n\ncMojangAPI::~cMojangAPI()\n{\n\tSaveCachesToDisk();\n}\n\n\n\n\n\nvoid cMojangAPI::Start(cSettingsRepositoryInterface & a_Settings, bool a_ShouldAuth)\n{\n\tauto NameToUUIDServer     = a_Settings.GetValueSet(\"MojangAPI\", \"NameToUUIDServer\",     DEFAULT_NAME_TO_UUID_SERVER);\n\tauto NameToUUIDAddress    = a_Settings.GetValueSet(\"MojangAPI\", \"NameToUUIDAddress\",    DEFAULT_NAME_TO_UUID_ADDRESS);\n\tauto UUIDToProfileServer  = a_Settings.GetValueSet(\"MojangAPI\", \"UUIDToProfileServer\",  DEFAULT_UUID_TO_PROFILE_SERVER);\n\tauto UUIDToProfileAddress = a_Settings.GetValueSet(\"MojangAPI\", \"UUIDToProfileAddress\", DEFAULT_UUID_TO_PROFILE_ADDRESS);\n\tm_NameToUUIDUrl = \"https://\" + NameToUUIDServer + NameToUUIDAddress;\n\tm_UUIDToProfileUrl = \"https://\" + UUIDToProfileServer + UUIDToProfileAddress;\n\tLoadCachesFromDisk();\n\tif (a_ShouldAuth)\n\t{\n\t\tm_UpdateThread->Start();\n\t}\n}\n\n\n\n\n\ncUUID cMojangAPI::GetUUIDFromPlayerName(const AString & a_PlayerName, bool a_UseOnlyCached)\n{\n\t// Convert the playername to lowercase:\n\tAString lcPlayerName = StrToLower(a_PlayerName);\n\n\t// Request the cache to query the name if not yet cached:\n\tif (!a_UseOnlyCached)\n\t{\n\t\tAStringVector PlayerNames{ lcPlayerName };\n\t\tCacheNamesToUUIDs(PlayerNames);\n\t}\n\n\t// Retrieve from cache:\n\tcCSLock Lock(m_CSNameToUUID);\n\tcProfileMap::const_iterator itr = m_NameToUUID.find(lcPlayerName);\n\tif (itr == m_NameToUUID.end())\n\t{\n\t\t// No UUID found\n\t\treturn {};\n\t}\n\treturn itr->second.m_UUID;\n}\n\n\n\n\n\nAString cMojangAPI::GetPlayerNameFromUUID(const cUUID & a_UUID, bool a_UseOnlyCached)\n{\n\t// Retrieve from caches:\n\t{\n\t\tcCSLock Lock(m_CSUUIDToProfile);\n\t\tauto itr = m_UUIDToProfile.find(a_UUID);\n\t\tif (itr != m_UUIDToProfile.end())\n\t\t{\n\t\t\treturn itr->second.m_PlayerName;\n\t\t}\n\t}\n\t{\n\t\tcCSLock Lock(m_CSUUIDToName);\n\t\tauto itr = m_UUIDToName.find(a_UUID);\n\t\tif (itr != m_UUIDToName.end())\n\t\t{\n\t\t\treturn itr->second.m_PlayerName;\n\t\t}\n\t}\n\n\t// Name not yet cached, request cache and retry:\n\tif (!a_UseOnlyCached)\n\t{\n\t\tCacheUUIDToProfile(a_UUID);\n\t\treturn GetPlayerNameFromUUID(a_UUID, true);\n\t}\n\n\t// No value found, none queried. Return an error:\n\treturn {};\n}\n\n\n\n\n\nstd::vector<cUUID> cMojangAPI::GetUUIDsFromPlayerNames(const AStringVector & a_PlayerNames, bool a_UseOnlyCached)\n{\n\t// Convert all playernames to lowercase:\n\tAStringVector PlayerNames;\n\tfor (AStringVector::const_iterator itr = a_PlayerNames.begin(), end = a_PlayerNames.end(); itr != end; ++itr)\n\t{\n\t\tPlayerNames.push_back(StrToLower(*itr));\n\t}  // for itr - a_PlayerNames[]\n\n\t// Request the cache to populate any names not yet contained:\n\tif (!a_UseOnlyCached)\n\t{\n\t\tCacheNamesToUUIDs(PlayerNames);\n\t}\n\n\t// Retrieve from cache:\n\tsize_t idx = 0;\n\tstd::vector<cUUID> res;\n\tres.resize(PlayerNames.size());\n\tcCSLock Lock(m_CSNameToUUID);\n\tfor (AStringVector::const_iterator itr = PlayerNames.begin(), end = PlayerNames.end(); itr != end; ++itr, ++idx)\n\t{\n\t\tcProfileMap::const_iterator itrN = m_NameToUUID.find(*itr);\n\t\tif (itrN != m_NameToUUID.end())\n\t\t{\n\t\t\tres[idx] = itrN->second.m_UUID;\n\t\t}\n\t}  // for itr - PlayerNames[]\n\treturn res;\n}\n\n\n\n\n\nvoid cMojangAPI::AddPlayerNameToUUIDMapping(const AString & a_PlayerName, const cUUID & a_UUID)\n{\n\tInt64 Now = time(nullptr);\n\t{\n\t\tcCSLock Lock(m_CSNameToUUID);\n\t\tm_NameToUUID[StrToLower(a_PlayerName)] = sProfile(a_PlayerName, a_UUID, \"\", \"\", Now);\n\t}\n\t{\n\t\tcCSLock Lock(m_CSUUIDToName);\n\t\tm_UUIDToName[a_UUID] = sProfile(a_PlayerName, a_UUID, \"\", \"\", Now);\n\t}\n\tNotifyNameUUID(a_PlayerName, a_UUID);\n}\n\n\n\n\n\nvoid cMojangAPI::AddPlayerProfile(const AString & a_PlayerName, const cUUID & a_UUID, const Json::Value & a_Properties)\n{\n\tInt64 Now = time(nullptr);\n\t{\n\t\tcCSLock Lock(m_CSNameToUUID);\n\t\tm_NameToUUID[StrToLower(a_PlayerName)] = sProfile(a_PlayerName, a_UUID, \"\", \"\", Now);\n\t}\n\t{\n\t\tcCSLock Lock(m_CSUUIDToName);\n\t\tm_UUIDToName[a_UUID] = sProfile(a_PlayerName, a_UUID, \"\", \"\", Now);\n\t}\n\t{\n\t\tcCSLock Lock(m_CSUUIDToProfile);\n\t\tm_UUIDToProfile[a_UUID] = sProfile(a_PlayerName, a_UUID, a_Properties, Now);\n\t}\n\tNotifyNameUUID(a_PlayerName, a_UUID);\n}\n\n\n\n\n\nvoid cMojangAPI::LoadCachesFromDisk(void)\n{\n\ttry\n\t{\n\t\t// Open up the SQLite DB:\n\t\tSQLite::Database db(\"MojangAPI.sqlite\", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);\n\t\tdb.exec(\"CREATE TABLE IF NOT EXISTS PlayerNameToUUID (PlayerName, UUID, DateTime)\");\n\t\tdb.exec(\"CREATE TABLE IF NOT EXISTS UUIDToProfile    (UUID, PlayerName, Textures, TexturesSignature, DateTime)\");\n\n\t\t// Retrieve all entries:\n\t\t{\n\t\t\tSQLite::Statement stmt(db, \"SELECT PlayerName, UUID, DateTime FROM PlayerNameToUUID\");\n\t\t\twhile (stmt.executeStep())\n\t\t\t{\n\t\t\t\tAString PlayerName = stmt.getColumn(0).getString();\n\t\t\t\tAString StringUUID = stmt.getColumn(1).getString();\n\t\t\t\tInt64 DateTime     = stmt.getColumn(2).getInt64();\n\n\t\t\t\tcUUID UUID;\n\t\t\t\tif (!UUID.FromString(StringUUID))\n\t\t\t\t{\n\t\t\t\t\tcontinue;  // Invalid UUID\n\t\t\t\t}\n\n\t\t\t\tm_NameToUUID[StrToLower(PlayerName)] = sProfile(PlayerName, UUID, \"\", \"\", DateTime);\n\t\t\t\tm_UUIDToName[UUID] = sProfile(PlayerName, UUID, \"\", \"\", DateTime);\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tSQLite::Statement stmt(db, \"SELECT PlayerName, UUID, Textures, TexturesSignature, DateTime FROM UUIDToProfile\");\n\t\t\twhile (stmt.executeStep())\n\t\t\t{\n\t\t\t\tAString PlayerName        = stmt.getColumn(0).getString();\n\t\t\t\tAString StringUUID        = stmt.getColumn(1).getString();\n\t\t\t\tAString Textures          = stmt.getColumn(2).getString();\n\t\t\t\tAString TexturesSignature = stmt.getColumn(2).getString();\n\t\t\t\tInt64 DateTime            = stmt.getColumn(4).getInt64();\n\n\t\t\t\tcUUID UUID;\n\t\t\t\tif (!UUID.FromString(StringUUID))\n\t\t\t\t{\n\t\t\t\t\tcontinue;  // Invalid UUID\n\t\t\t\t}\n\n\t\t\t\tm_UUIDToProfile[UUID] = sProfile(PlayerName, UUID, Textures, TexturesSignature, DateTime);\n\t\t\t}\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGINFO(\"Loading MojangAPI cache failed: %s\", ex.what());\n\t}\n}\n\n\n\n\n\nvoid cMojangAPI::SaveCachesToDisk(void)\n{\n\ttry\n\t{\n\t\t// Open up the SQLite DB:\n\t\tSQLite::Database db(\"MojangAPI.sqlite\", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);\n\t\tdb.exec(\"CREATE TABLE IF NOT EXISTS PlayerNameToUUID (PlayerName, UUID, DateTime)\");\n\t\tdb.exec(\"CREATE TABLE IF NOT EXISTS UUIDToProfile (UUID, PlayerName, Textures, TexturesSignature, DateTime)\");\n\n\t\t// Remove all entries:\n\t\tdb.exec(\"DELETE FROM PlayerNameToUUID\");\n\t\tdb.exec(\"DELETE FROM UUIDToProfile\");\n\n\t\t// Save all cache entries - m_PlayerNameToUUID:\n\t\tInt64 LimitDateTime = time(nullptr) - MAX_AGE;\n\t\t{\n\t\t\tSQLite::Statement stmt(db, \"INSERT INTO PlayerNameToUUID(PlayerName, UUID, DateTime) VALUES (?, ?, ?)\");\n\t\t\tcCSLock Lock(m_CSNameToUUID);\n\t\t\tfor (auto & NameToUUID : m_NameToUUID)\n\t\t\t{\n\t\t\t\tauto & Profile = NameToUUID.second;\n\t\t\t\tif (Profile.m_DateTime < LimitDateTime)\n\t\t\t\t{\n\t\t\t\t\t// This item is too old, do not save\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstmt.bind(1, Profile.m_PlayerName);\n\t\t\t\tstmt.bind(2, Profile.m_UUID.ToShortString());\n\t\t\t\tstmt.bind(3, static_cast<int64_t>(Profile.m_DateTime));\n\t\t\t\tstmt.exec();\n\t\t\t\tstmt.reset();\n\t\t\t}\n\t\t}\n\n\t\t// Save all cache entries - m_UUIDToProfile:\n\t\t{\n\t\t\tSQLite::Statement stmt(db, \"INSERT INTO UUIDToProfile(UUID, PlayerName, Textures, TexturesSignature, DateTime) VALUES (?, ?, ?, ?, ?)\");\n\t\t\tcCSLock Lock(m_CSUUIDToProfile);\n\t\t\tfor (auto & UUIDToProfile : m_UUIDToProfile)\n\t\t\t{\n\t\t\t\tauto & Profile = UUIDToProfile.second;\n\t\t\t\tif (Profile.m_DateTime < LimitDateTime)\n\t\t\t\t{\n\t\t\t\t\t// This item is too old, do not save\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstmt.bind(1, Profile.m_UUID.ToShortString());\n\t\t\t\tstmt.bind(2, Profile.m_PlayerName);\n\t\t\t\tstmt.bind(3, Profile.m_Textures);\n\t\t\t\tstmt.bind(4, Profile.m_TexturesSignature);\n\t\t\t\tstmt.bind(5, static_cast<int64_t>(Profile.m_DateTime));\n\t\t\t\tstmt.exec();\n\t\t\t\tstmt.reset();\n\t\t\t}\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGINFO(\"Saving MojangAPI cache failed: %s\", ex.what());\n\t}\n}\n\n\n\n\n\nvoid cMojangAPI::CacheNamesToUUIDs(const AStringVector & a_PlayerNames)\n{\n\t// Create a list of names to query, by removing those that are already cached:\n\tAStringVector NamesToQuery;\n\tNamesToQuery.reserve(a_PlayerNames.size());\n\t{\n\t\tcCSLock Lock(m_CSNameToUUID);\n\t\tfor (AStringVector::const_iterator itr = a_PlayerNames.begin(), end = a_PlayerNames.end(); itr != end; ++itr)\n\t\t{\n\t\t\tif (m_NameToUUID.find(*itr) == m_NameToUUID.end())\n\t\t\t{\n\t\t\t\tNamesToQuery.push_back(*itr);\n\t\t\t}\n\t\t}  // for itr - a_PlayerNames[]\n\t}  // Lock(m_CSNameToUUID)\n\n\tQueryNamesToUUIDs(NamesToQuery);\n}\n\n\n\n\n\nvoid cMojangAPI::QueryNamesToUUIDs(AStringVector & a_NamesToQuery)\n{\n\twhile (!a_NamesToQuery.empty())\n\t{\n\t\t// Create the request body - a JSON containing up to MAX_PER_QUERY playernames:\n\t\tJson::Value root;\n\t\tint Count = 0;\n\t\tauto itr = a_NamesToQuery.begin();\n\t\tauto end = a_NamesToQuery.end();\n\t\tfor (; (itr != end) && (Count < MAX_PER_QUERY); ++itr, ++Count)\n\t\t{\n\t\t\tJson::Value req(*itr);\n\t\t\troot.append(req);\n\t\t}  // for itr - a_PlayerNames[]\n\t\ta_NamesToQuery.erase(a_NamesToQuery.begin(), itr);\n\t\tauto RequestBody = JsonUtils::WriteFastString(root);\n\n\t\t// Create and send the HTTP request\n\t\tauto [IsSuccessful, Response] = cUrlClient::BlockingPost(m_NameToUUIDUrl, {}, std::move(RequestBody), MojangTrustedRootCAs::UrlClientOptions());\n\t\tif (!IsSuccessful)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tAString HexDump;\n\n\t\t// Parse the returned string into Json:\n\t\tAString ParseError;\n\t\tif (!JsonUtils::ParseString(Response, root, &ParseError) || !root.isArray())\n\t\t{\n\t\t\tLOGWARNING(\"%s failed: Cannot parse received data (NameToUUID) to JSON: \\\"%s\\\"\", __METHOD_NAME__, ParseError);\n\t\t\tLOGD(\"Response body:\\n%s\", CreateHexDump(HexDump, Response.data(), Response.size(), 16));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Store the returned results into cache:\n\t\tJson::Value::UInt JsonCount = root.size();\n\t\tInt64 Now = time(nullptr);\n\t\t{\n\t\t\tcCSLock Lock(m_CSNameToUUID);\n\t\t\tfor (Json::Value::UInt idx = 0; idx < JsonCount; ++idx)\n\t\t\t{\n\t\t\t\tJson::Value & Val = root[idx];\n\t\t\t\tAString JsonName = Val.get(\"name\", \"\").asString();\n\t\t\t\tcUUID JsonUUID;\n\t\t\t\tif (!JsonUUID.FromString(Val.get(\"id\", \"\").asString()))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tm_NameToUUID[StrToLower(JsonName)] = sProfile(JsonName, JsonUUID, \"\", \"\", Now);\n\t\t\t\tNotifyNameUUID(JsonName, JsonUUID);\n\t\t\t}  // for idx - root[]\n\t\t}  // cCSLock (m_CSNameToUUID)\n\n\t\t// Also cache the UUIDToName:\n\t\t{\n\t\t\tcCSLock Lock(m_CSUUIDToName);\n\t\t\tfor (Json::Value::UInt idx = 0; idx < JsonCount; ++idx)\n\t\t\t{\n\t\t\t\tJson::Value & Val = root[idx];\n\t\t\t\tAString JsonName = Val.get(\"name\", \"\").asString();\n\t\t\t\tcUUID JsonUUID;\n\t\t\t\tif (!JsonUUID.FromString(Val.get(\"id\", \"\").asString()))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tm_UUIDToName[JsonUUID] = sProfile(JsonName, JsonUUID, \"\", \"\", Now);\n\t\t\t}  // for idx - root[]\n\t\t}\n\t}  // while (!NamesToQuery.empty())\n}\n\n\n\n\n\nvoid cMojangAPI::CacheUUIDToProfile(const cUUID & a_UUID)\n{\n\t// Check if already present:\n\t{\n\t\tcCSLock Lock(m_CSUUIDToProfile);\n\t\tif (m_UUIDToProfile.find(a_UUID) != m_UUIDToProfile.end())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tQueryUUIDToProfile(a_UUID);\n}\n\n\n\n\n\nvoid cMojangAPI::QueryUUIDToProfile(const cUUID & a_UUID)\n{\n\t// Create and send the HTTP request\n\tauto Url = m_UUIDToProfileUrl;\n\tReplaceString(Url, \"%UUID%\", URLEncode(a_UUID.ToShortString()));\n\tauto [IsSuccessful, Response] = cUrlClient::BlockingGet(Url, {}, {}, MojangTrustedRootCAs::UrlClientOptions());\n\tif (!IsSuccessful)\n\t{\n\t\treturn;\n\t}\n\n\t// Parse the returned string into Json:\n\tJson::Value root;\n\tAString ParseError;\n\tif (!JsonUtils::ParseString(Response, root, &ParseError) || !root.isObject())\n\t{\n\t\tLOGWARNING(\"%s failed: Cannot parse received data (NameToUUID) to JSON: \\\"%s\\\"\", __FUNCTION__, ParseError);\n#ifdef NDEBUG\n\t\tAString HexDump;\n\t\tLOGD(\"Response body:\\n%s\", CreateHexDump(HexDump, Response.data(), Response.size(), 16).c_str());\n#endif\n\t\treturn;\n\t}\n\n\t/* Example response:\n\t{\n\t\t\"id\": \"b1caf24202a841a78055a079c460eee7\",\n\t\t\"name\": \"xoft\",\n\t\t\"properties\":\n\t\t[\n\t\t\t{\n\t\t\t\t\"name\": \"textures\",\n\t\t\t\t\"value\": \"eyJ0aW1lc3RhbXAiOjE0MDcwNzAzMjEyNzEsInByb2ZpbGVJZCI6ImIxY2FmMjQyMDJhODQxYTc4MDU1YTA3OWM0NjBlZWU3IiwicHJvZmlsZU5hbWUiOiJ4b2Z0IiwiaXNQdWJsaWMiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iNzc5YmFiZjVhNTg3Zjk0OGFkNjc0N2VhOTEyNzU0MjliNjg4Mjk1YWUzYzA3YmQwZTJmNWJmNGQwNTIifX19\",\n\t\t\t\t\"signature\": \"XCty+jGEF39hEPrPhYNnCX087kPaoCjYruzYI/DS4nkL5hbjnkSM5Rh15hnUyv/FHhC8OF5rif3D1tQjtMI19KSVaXoUFXpbJM8/+PB8GDgEbX8Fc3u9nYkzOcM/xfxdYsFAdFhLQMkvase/BZLSuPhdy9DdI+TCrO7xuSTZfYmmwVuWo3w5gCY+mSIAnqltnOzaOOTcly75xvO0WYpVk7nJdnR2tvSi0wfrQPDrIg/uzhX7p0SnDqijmBU4QaNez/TNKiFxy69dAzt0RSotlQzqkDbyVKhhv9a4eY8h3pXi4UMftKEj4FAKczxLImkukJXuOn5NN15/Q+le0rJVBC60/xjKIVzltEsMN6qjWD0lQjey7WEL+4pGhCVuWY5KzuZjFvgqszuJTFz7lo+bcHiceldJtea8/fa02eTRObZvdLxbWC9ZfFY0IhpOVKfcLdno/ddDMNMQMi5kMrJ8MZZ/PcW1w5n7MMGWPGCla1kOaC55AL0QYSMGRVEZqgU9wXI5M7sHGZKGM4mWxkbEJYBkpI/p3GyxWgV6v33ZWlsz65TqlNrR1gCLaoFCm7Sif8NqPBZUAONHYon0roXhin/DyEanS93WV6i6FC1Wisscjq2AcvnOlgTo/5nN/1QsMbjNumuMGo37sqjRqlXoPb8zEUbAhhztYuJjEfQ2Rd8=\"\n\t\t\t}\n\t\t]\n\t}\n\t*/\n\n\t// Store the returned result into caches:\n\tAString PlayerName = root.get(\"name\", \"\").asString();\n\tif (PlayerName.empty())\n\t{\n\t\t// No valid playername, bail out\n\t\treturn;\n\t}\n\tJson::Value Properties = root.get(\"properties\", \"\");\n\tInt64 Now = time(nullptr);\n\t{\n\t\tcCSLock Lock(m_CSUUIDToProfile);\n\t\tm_UUIDToProfile[a_UUID] = sProfile(PlayerName, a_UUID, Properties, Now);\n\t}\n\t{\n\t\tcCSLock Lock(m_CSUUIDToName);\n\t\tm_UUIDToName[a_UUID] = sProfile(PlayerName, a_UUID, Properties, Now);\n\t}\n\t{\n\t\tcCSLock Lock(m_CSNameToUUID);\n\t\tm_NameToUUID[StrToLower(PlayerName)] = sProfile(PlayerName, a_UUID, Properties, Now);\n\t}\n\tNotifyNameUUID(PlayerName, a_UUID);\n}\n\n\n\n\n\nvoid cMojangAPI::NotifyNameUUID(const AString & a_PlayerName, const cUUID & a_UUID)\n{\n\t// Notify the rank manager:\n\tcCSLock Lock(m_CSRankMgr);\n\tif (m_RankMgr != nullptr)\n\t{\n\t\tm_RankMgr->NotifyNameUUID(a_PlayerName, a_UUID);\n\t}\n}\n\n\n\n\n\nvoid cMojangAPI::Update(void)\n{\n\tInt64 LimitDateTime = time(nullptr) - MAX_AGE;\n\n\t// Re-query all playernames that are stale:\n\tAStringVector PlayerNames;\n\t{\n\t\tcCSLock Lock(m_CSNameToUUID);\n\t\tfor (const auto & NameToUUID : m_NameToUUID)\n\t\t{\n\t\t\tif (NameToUUID.second.m_DateTime < LimitDateTime)\n\t\t\t{\n\t\t\t\tPlayerNames.push_back(NameToUUID.first);\n\t\t\t}\n\t\t}  // for itr - m_NameToUUID[]\n\t}\n\tif (!PlayerNames.empty())\n\t{\n\t\tLOG(\"%s: Updating name-to-uuid cache for %u names\", __METHOD_NAME__, static_cast<unsigned>(PlayerNames.size()));\n\t\tQueryNamesToUUIDs(PlayerNames);\n\t}\n\n\t// Re-query all profiles that are stale:\n\tstd::vector<cUUID> ProfileUUIDs;\n\t{\n\t\tcCSLock Lock(m_CSUUIDToProfile);\n\t\tfor (const auto & UUIDToProfile : m_UUIDToProfile)\n\t\t{\n\t\t\tif (UUIDToProfile.second.m_DateTime < LimitDateTime)\n\t\t\t{\n\t\t\t\tProfileUUIDs.push_back(UUIDToProfile.first);\n\t\t\t}\n\t\t}  // for itr - m_UUIDToProfile[]\n\t}\n\tif (!ProfileUUIDs.empty())\n\t{\n\t\tLOG(\"%s: Updating uuid-to-profile cache for %u uuids\", __METHOD_NAME__, static_cast<unsigned>(ProfileUUIDs.size()));\n\t\tfor (const auto & UUID : ProfileUUIDs)\n\t\t{\n\t\t\tQueryUUIDToProfile(UUID);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/MojangAPI.h",
    "content": "\n// MojangAPI.h\n\n// Declares the cMojangAPI class representing the various API points provided by Mojang's webservices, and a cache for their results\n\n\n\n\n\n#pragma once\n\n#include <time.h>\n\n#include \"UUID.h\"\n\n\n\n\n\n// fwd: ../RankManager.h\"\nclass cRankManager;\n\nnamespace Json\n{\n\tclass Value;\n}\n\n\n\nclass cSettingsRepositoryInterface;\n\n// tolua_begin\nclass cMojangAPI\n{\npublic:\n\t// tolua_end\n\n\tcMojangAPI(void);\n\t~cMojangAPI();\n\n\t/** Initializes the API; reads the settings from the specified ini file.\n\tLoads cached results from disk. */\n\tvoid Start(cSettingsRepositoryInterface & a_Settings, bool a_ShouldAuth);\n\n\t/** Converts a player name into a UUID.\n\tThe UUID will be nil on error.\n\tIf a_UseOnlyCached is true, the function only consults the cached values.\n\tIf a_UseOnlyCached is false and the name is not found in the cache, it is looked up online, which is a blocking\n\toperation, do not use this in world-tick thread!\n\tIf you have multiple names to resolve, use the GetUUIDsFromPlayerNames() function, it uses a single request for multiple names. */\n\tcUUID GetUUIDFromPlayerName(const AString & a_PlayerName, bool a_UseOnlyCached = false);\n\n\t/** Converts a UUID into a playername.\n\tThe returned playername will be empty on error.\n\tUses both m_UUIDToName and m_UUIDToProfile to search for the value. Uses m_UUIDToProfile for cache.\n\tIf a_UseOnlyCached is true, the function only consults the cached values.\n\tIf a_UseOnlyCached is false and the name is not found in the cache, it is looked up online, which is a blocking\n\toperation, do not use this in world-tick thread! */\n\tAString GetPlayerNameFromUUID(const cUUID & a_UUID, bool a_UseOnlyCached = false);\n\n\t/** Converts the player names into UUIDs.\n\ta_PlayerName[idx] will be converted to UUID and returned as idx-th value\n\tThe UUID will be nil on error.\n\tIf a_UseOnlyCached is true, only the cached values are returned.\n\tIf a_UseOnlyCached is false, the names not found in the cache are looked up online, which is a blocking\n\toperation, do not use this in world-tick thread! */\n\tstd::vector<cUUID> GetUUIDsFromPlayerNames(const AStringVector & a_PlayerName, bool a_UseOnlyCached = false);\n\n\t/** Called by the Authenticator to add a PlayerName -> UUID mapping that it has received from\n\tauthenticating a user. This adds the cache item and \"refreshes\" it if existing, adjusting its datetime\n\tstamp to now. */\n\tvoid AddPlayerNameToUUIDMapping(const AString & a_PlayerName, const cUUID & a_UUID);\n\n\t/** Called by the Authenticator to add a profile that it has received from authenticating a user. Adds\n\tthe profile to the respective mapping caches and updtes their datetime stamp to now. */\n\tvoid AddPlayerProfile(const AString & a_PlayerName, const cUUID & a_UUID, const Json::Value & a_Properties);\n\n\t/** Sets the m_RankMgr that is used for name-uuid notifications. Accepts nullptr to remove the binding. */\n\tvoid SetRankManager(cRankManager * a_RankManager) { m_RankMgr = a_RankManager; }\n\nprotected:\n\t/** The thread that periodically checks for stale data and re-queries it from the server. */\n\tclass cUpdateThread;\n\n\n\t/** Holds data for a single player profile. */\n\tstruct sProfile\n\t{\n\t\tAString m_PlayerName;         // Case-correct playername\n\t\tcUUID   m_UUID;               // Player UUID\n\t\tAString m_Textures;           // The Textures field of the profile properties\n\t\tAString m_TexturesSignature;  // The signature of the Textures field of the profile properties\n\t\tInt64   m_DateTime;           // UNIXtime of the profile lookup\n\n\t\t/** Default constructor for the container's sake. */\n\t\tsProfile(void) :\n\t\t\tm_PlayerName(),\n\t\t\tm_UUID(),\n\t\t\tm_Textures(),\n\t\t\tm_TexturesSignature(),\n\t\t\tm_DateTime(time(nullptr))\n\t\t{\n\t\t}\n\n\t\t/** Constructor for the storage creation. */\n\t\tsProfile(\n\t\t\tconst AString & a_PlayerName,\n\t\t\tconst cUUID & a_UUID,\n\t\t\tconst AString & a_Textures,\n\t\t\tconst AString & a_TexturesSignature,\n\t\t\tInt64 a_DateTime\n\t\t) :\n\t\t\tm_PlayerName(a_PlayerName),\n\t\t\tm_UUID(a_UUID),\n\t\t\tm_Textures(a_Textures),\n\t\t\tm_TexturesSignature(a_TexturesSignature),\n\t\t\tm_DateTime(a_DateTime)\n\t\t{\n\t\t}\n\n\t\t/** Constructor that parses the values from the Json profile. */\n\t\tsProfile(\n\t\t\tconst AString & a_PlayerName,\n\t\t\tconst cUUID & a_UUID,\n\t\t\tconst Json::Value & a_Properties,\n\t\t\tInt64 a_DateTime\n\t\t);\n\t};\n\tusing cProfileMap = std::map<AString, sProfile>;\n\tusing cUUIDProfileMap = std::map<cUUID, sProfile>;\n\n\n\t/** The full URL to check when converting player names to UUIDs.\n\tFor example: \"https://api.mojang.com/profiles/page/1\". */\n\tAString m_NameToUUIDUrl;\n\n\t/** The full URL to use for converting UUID to profile.\n\t%UUID% will get replaced with the actual UUID.\n\tFor example \"https://sessionserver.mojang.com/session/minecraft/profile/%UUID%?unsigned=false\". */\n\tAString m_UUIDToProfileUrl;\n\n\t/** Cache for the Name-to-UUID lookups. The map key is lowercased PlayerName. Protected by m_CSNameToUUID. */\n\tcProfileMap m_NameToUUID;\n\n\t/** Protects m_NameToUUID against simultaneous multi-threaded access. */\n\tcCriticalSection m_CSNameToUUID;\n\n\t/** Cache for the Name-to-UUID lookups. The map key is lowercased short UUID. Protected by m_CSUUIDToName. */\n\tcUUIDProfileMap m_UUIDToName;\n\n\t/** Protects m_UUIDToName against simultaneous multi-threaded access. */\n\tcCriticalSection m_CSUUIDToName;\n\n\t/** Cache for the UUID-to-profile lookups. The map key is lowercased short UUID.\n\tProtected by m_CSUUIDToProfile. */\n\tcUUIDProfileMap m_UUIDToProfile;\n\n\t/** Protects m_UUIDToProfile against simultaneous multi-threaded access. */\n\tcCriticalSection m_CSUUIDToProfile;\n\n\t/** The rank manager that is notified of the name-uuid pairings. May be nullptr. Protected by m_CSRankMgr. */\n\tcRankManager * m_RankMgr;\n\n\t/** Protects m_RankMgr agains simultaneous multi-threaded access. */\n\tcCriticalSection m_CSRankMgr;\n\n\t/** The thread that periodically updates the stale data in the DB from the Mojang servers. */\n\tstd::shared_ptr<cUpdateThread> m_UpdateThread;\n\n\n\t/** Loads the caches from a disk storage. */\n\tvoid LoadCachesFromDisk(void);\n\n\t/** Saves the caches to a disk storage. */\n\tvoid SaveCachesToDisk(void);\n\n\t/** Makes sure all specified names are in the m_PlayerNameToUUID cache. Downloads any missing ones from Mojang API servers.\n\tNames that are not valid are not added into the cache.\n\tASSUMEs that a_PlayerNames contains lowercased player names. */\n\tvoid CacheNamesToUUIDs(const AStringVector & a_PlayerNames);\n\n\t/** Queries all the specified names and stores them into the m_PlayerNameToUUID cache.\n\tNames that are not valid are not added into the cache.\n\tASSUMEs that a_PlayerNames contans lowercased player names.\n\tFor performance reasons takes a non-const reference and modifies the list given to it, until empty. */\n\tvoid QueryNamesToUUIDs(AStringVector & a_PlayerNames);\n\n\t/** Makes sure the specified UUID is in the m_UUIDToProfile cache. If missing, downloads it from Mojang API servers.\n\tUUIDs that are not valid will not be added into the cache. */\n\tvoid CacheUUIDToProfile(const cUUID & a_UUID);\n\n\t/** Queries the specified UUID's profile and stores it in the m_UUIDToProfile cache. If already present, updates the cache entry.\n\tUUIDs that are not valid will not be added into the cache. */\n\tvoid QueryUUIDToProfile(const cUUID & a_UUID);\n\n\t/** Called for each name-uuid pairing that is discovered.\n\tIf assigned, notifies the m_RankManager of the event. */\n\tvoid NotifyNameUUID(const AString & a_PlayerName, const cUUID & a_PlayerUUID);\n\n\t/** Updates the stale values in the DB from the Mojang servers. Called from the cUpdateThread, blocks on the HTTPS API calls. */\n\tvoid Update(void);\n} ;  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Protocol/Packetizer.cpp",
    "content": "\n// Packetizer.cpp\n\n// Implements the cPacketizer class representing a wrapper for sending a single packet over a protocol.\n\n#include \"Globals.h\"\n#include \"Packetizer.h\"\n#include \"../UUID.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cPacketizer:\n\ncPacketizer::~cPacketizer()\n{\n\tm_Protocol.SendPacket(*this);\n}\n\n\n\n\n\nvoid cPacketizer::WriteByteAngle(double a_Angle)\n{\n\tWriteBEInt8(static_cast<Int8>(255 * a_Angle / 360));\n}\n\n\n\n\n\nvoid cPacketizer::WriteFPInt(double a_Value)\n{\n\tWriteBEInt32(static_cast<Int32>(a_Value * 32));\n}\n\n\n\n\n\nvoid cPacketizer::WriteUUID(const cUUID & a_UUID)\n{\n\tfor (auto val : a_UUID.ToRaw())\n\t{\n\t\tVERIFY(m_Out.WriteBEUInt8(val));\n\t}\n}\n\n\n\n\n\nAString cPacketizer::PacketTypeToStr(cProtocol::ePacketType a_PacketType)\n{\n\tswitch (a_PacketType)\n\t{\n\t\tcase cProtocol::pktAttachEntity:           return \"pktAttachEntity\";\n\t\tcase cProtocol::pktBlockAction:            return \"pktBlockAction\";\n\t\tcase cProtocol::pktBlockBreakAnim:         return \"pktBlockBreakAnim\";\n\t\tcase cProtocol::pktBlockChange:            return \"pktBlockChange\";\n\t\tcase cProtocol::pktBlockChanges:           return \"pktBlockChanges\";\n\t\tcase cProtocol::pktBossBar:                return \"pktBossBar\";\n\t\tcase cProtocol::pktCameraSetTo:            return \"pktCameraSetTo\";\n\t\tcase cProtocol::pktChatRaw:                return \"pktChatRaw\";\n\t\tcase cProtocol::pktCollectEntity:          return \"pktCollectEntity\";\n\t\tcase cProtocol::pktDestroyEntity:          return \"pktDestroyEntity\";\n\t\tcase cProtocol::pktDifficulty:             return \"pktDifficulty\";\n\t\tcase cProtocol::pktDisconnectDuringLogin:  return \"pktDisconnectDuringLogin\";\n\t\tcase cProtocol::pktDisconnectDuringGame:   return \"pktDisconnectDuringGame\";\n\t\tcase cProtocol::pktDisplayObjective:       return \"pktDisplayObjective\";\n\t\tcase cProtocol::pktEditSign:               return \"pktEditSign\";\n\t\tcase cProtocol::pktEncryptionRequest:      return \"pktEncryptionRequest\";\n\t\tcase cProtocol::pktEntityAnimation:        return \"pktEntityAnimation\";\n\t\tcase cProtocol::pktEntityEffect:           return \"pktEntityEffect\";\n\t\tcase cProtocol::pktEntityEquipment:        return \"pktEntityEquipment\";\n\t\tcase cProtocol::pktEntityHeadLook:         return \"pktEntityHeadLook\";\n\t\tcase cProtocol::pktEntityLook:             return \"pktEntityLook\";\n\t\tcase cProtocol::pktEntityMeta:             return \"pktEntityMeta\";\n\t\tcase cProtocol::pktEntityProperties:       return \"pktEntityProperties\";\n\t\tcase cProtocol::pktEntityRelMove:          return \"pktEntityRelMove\";\n\t\tcase cProtocol::pktEntityRelMoveLook:      return \"pktEntityRelMoveLook\";\n\t\tcase cProtocol::pktEntityStatus:           return \"pktEntityStatus\";\n\t\tcase cProtocol::pktEntityVelocity:         return \"pktEntityVelocity\";\n\t\tcase cProtocol::pktExperience:             return \"pktExperience\";\n\t\tcase cProtocol::pktExplosion:              return \"pktExplosion\";\n\t\tcase cProtocol::pktGameMode:               return \"pktGameMode\";\n\t\tcase cProtocol::pktHeldItemChange:         return \"pktHeldItemChange\";\n\t\tcase cProtocol::pktHorseWindowOpen:        return \"pktHorseWindowOpen\";\n\t\tcase cProtocol::pktInventorySlot:          return \"pktInventorySlot\";\n\t\tcase cProtocol::pktJoinGame:               return \"pktJoinGame\";\n\t\tcase cProtocol::pktKeepAlive:              return \"pktKeepAlive\";\n\t\tcase cProtocol::pktLeashEntity:            return \"pktLeashEntity\";\n\t\tcase cProtocol::pktLoginSuccess:           return \"pktLoginSuccess\";\n\t\tcase cProtocol::pktMapData:                return \"pktMapData\";\n\t\tcase cProtocol::pktParticleEffect:         return \"pktParticleEffect\";\n\t\tcase cProtocol::pktPingResponse:           return \"pktPingResponse\";\n\t\tcase cProtocol::pktPlayerAbilities:        return \"pktPlayerAbilities\";\n\t\tcase cProtocol::pktPlayerList:             return \"pktPlayerList\";\n\t\tcase cProtocol::pktPlayerListHeaderFooter: return \"pktPlayerListHeaderFooter\";\n\t\tcase cProtocol::pktPlayerMoveLook:         return \"pktPlayerMoveLook\";\n\t\tcase cProtocol::pktPluginMessage:          return \"pktPluginMessage\";\n\t\tcase cProtocol::pktRemoveEntityEffect:     return \"pktRemoveEntityEffect\";\n\t\tcase cProtocol::pktResourcePack:           return \"pktResourcePack\";\n\t\tcase cProtocol::pktRespawn:                return \"pktRespawn\";\n\t\tcase cProtocol::pktScoreboardObjective:    return \"pktScoreboardObjective\";\n\t\tcase cProtocol::pktSpawnObject:            return \"pktSpawnObject\";\n\t\tcase cProtocol::pktSoundEffect:            return \"pktSoundEffect\";\n\t\tcase cProtocol::pktSoundParticleEffect:    return \"pktSoundParticleEffect\";\n\t\tcase cProtocol::pktSpawnExperienceOrb:     return \"pktSpawnExperienceOrb\";\n\t\tcase cProtocol::pktSpawnGlobalEntity:      return \"pktSpawnGlobalEntity\";\n\t\tcase cProtocol::pktSpawnMob:               return \"pktSpawnMob\";\n\t\tcase cProtocol::pktSpawnOtherPlayer:       return \"pktSpawnOtherPlayer\";\n\t\tcase cProtocol::pktSpawnPainting:          return \"pktSpawnPainting\";\n\t\tcase cProtocol::pktSpawnPosition:          return \"pktSpawnPosition\";\n\t\tcase cProtocol::pktStartCompression:       return \"pktStartCompression\";\n\t\tcase cProtocol::pktStatistics:             return \"pktStatistics\";\n\t\tcase cProtocol::pktStatusResponse:         return \"pktStatusResponse\";\n\t\tcase cProtocol::pktTabCompletionResults:   return \"pktTabCompletionResults\";\n\t\tcase cProtocol::pktTeleportEntity:         return \"pktTeleportEntity\";\n\t\tcase cProtocol::pktTimeUpdate:             return \"pktTimeUpdate\";\n\t\tcase cProtocol::pktTitle:                  return \"pktTitle\";\n\t\tcase cProtocol::pktUnloadChunk:            return \"pktUnloadChunk\";\n\t\tcase cProtocol::pktUnlockRecipe:           return \"pktUnlockRecipe\";\n\t\tcase cProtocol::pktUpdateBlockEntity:      return \"pktUpdateBlockEntity\";\n\t\tcase cProtocol::pktUpdateHealth:           return \"pktUpdateHealth\";\n\t\tcase cProtocol::pktUpdateScore:            return \"pktUpdateScore\";\n\t\tcase cProtocol::pktUpdateSign:             return \"pktUpdateSign\";\n\t\tcase cProtocol::pktUseBed:                 return \"pktUseBed\";\n\t\tcase cProtocol::pktWeather:                return \"pktWeather\";\n\t\tcase cProtocol::pktWindowItems:            return \"pktWindowItems\";\n\t\tcase cProtocol::pktWindowClose:            return \"pktWindowClose\";\n\t\tcase cProtocol::pktWindowOpen:             return \"pktWindowOpen\";\n\t\tcase cProtocol::pktWindowProperty:         return \"pktWindowProperty\";\n\t}\n\treturn fmt::format(FMT_STRING(\"Unknown packet type: 0x{:02x}\"), a_PacketType);\n}\n"
  },
  {
    "path": "src/Protocol/Packetizer.h",
    "content": "\n// Packetizer.h\n\n// Declares the cPacketizer class representing a wrapper for sending a single packet over a protocol.\n// The class provides auto-locking, serialization and send-on-instance-destroy semantics\n\n\n\n\n\n#pragma once\n\n#include \"Protocol.h\"\n\n\n\nclass cByteBuffer;\n\n\n// fwd:\nclass cUUID;\n\n\n\n\n\n/** Macros used to read packets more easily */\n#define HANDLE_READ(ByteBuf, Proc, Type, Var) \\\n\tType Var; \\\n\tdo { \\\n\t\tif (!ByteBuf.Proc(Var))\\\n\t\t{\\\n\t\t\treturn;\\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n#define HANDLE_PACKET_READ(ByteBuf, Proc, Type, Var) \\\n\tType Var; \\\n\tdo { \\\n\t\t{ \\\n\t\t\tif (!ByteBuf.Proc(Var)) \\\n\t\t\t{ \\\n\t\t\t\tByteBuf.CheckValid(); \\\n\t\t\t\treturn false; \\\n\t\t\t} \\\n\t\t\tByteBuf.CheckValid(); \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Composes an individual packet in the protocol's m_OutPacketBuffer; sends it just before being destructed. */\nclass cPacketizer\n{\npublic:\n\t/** Starts serializing a new packet into the protocol's m_OutPacketBuffer.\n\tLocks the protocol's m_CSPacket to avoid multithreading issues. */\n\tcPacketizer(cProtocol & a_Protocol, cProtocol::ePacketType a_PacketType) :\n\t\tm_Protocol(a_Protocol),\n\t\tm_Out(a_Protocol.m_OutPacketBuffer),\n\t\tm_Lock(a_Protocol.m_CSPacket),\n\t\tm_PacketType(a_PacketType)  // Used for logging purposes\n\t{\n\t\tm_Out.WriteVarInt32(m_Protocol.GetPacketID(a_PacketType));\n\t}\n\n\t/** Sends the packet via the contained protocol's SendPacket() function. */\n\t~cPacketizer();\n\n\tinline void WriteBool(bool a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBool(a_Value));\n\t}\n\n\tinline void WriteBEUInt8(UInt8 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEUInt8(a_Value));\n\t}\n\n\n\tinline void WriteBEInt8(Int8 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEInt8(a_Value));\n\t}\n\n\n\tinline void WriteBEInt16(Int16 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEInt16(a_Value));\n\t}\n\n\n\tinline void WriteBEUInt16(UInt16 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEUInt16(a_Value));\n\t}\n\n\n\tinline void WriteBEInt32(Int32 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEInt32(a_Value));\n\t}\n\n\n\tinline void WriteBEUInt32(UInt32 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEUInt32(a_Value));\n\t}\n\n\n\tinline void WriteBEInt64(Int64 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEInt64(a_Value));\n\t}\n\n\n\tinline void WriteBEUInt64(UInt64 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEUInt64(a_Value));\n\t}\n\n\n\tinline void WriteBEFloat(float a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEFloat(a_Value));\n\t}\n\n\n\tinline void WriteBEDouble(double a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteBEDouble(a_Value));\n\t}\n\n\n\tinline void WriteVarInt32(UInt32 a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteVarInt32(a_Value));\n\t}\n\n\n\tinline void WriteString(const AString & a_Value)\n\t{\n\t\tVERIFY(m_Out.WriteVarUTF8String(a_Value));\n\t}\n\n\n\tinline void WriteBuf(const ContiguousByteBufferView a_Data)\n\t{\n\t\tVERIFY(m_Out.Write(a_Data.data(), a_Data.size()));\n\t}\n\n\n\t/** Writes the specified block position as a single encoded 64-bit BigEndian integer.\n\tThe three coordinates are written in XYZ order. */\n\tinline void WriteXYZPosition64(int a_BlockX, int a_BlockY, int a_BlockZ)\n\t{\n\t\tVERIFY(m_Out.WriteXYZPosition64(a_BlockX, a_BlockY, a_BlockZ));\n\t}\n\n\t/** Writes the specified block position as a single encoded 64-bit BigEndian integer.\n\tThe three coordinates are written in XYZ order. */\n\tinline void WriteXYZPosition64(const Vector3i a_Position)\n\t{\n\t\tVERIFY(m_Out.WriteXYZPosition64(a_Position.x, a_Position.y, a_Position.z));\n\t}\n\n\t/** Writes the specified block position as a single encoded 64-bit BigEndian integer.\n\tThe three coordinates are written in XZY order, in 1.14+. */\n\tinline void WriteXZYPosition64(int a_BlockX, int a_BlockY, int a_BlockZ)\n\t{\n\t\tVERIFY(m_Out.WriteXZYPosition64(a_BlockX, a_BlockY, a_BlockZ));\n\t}\n\n\t/** Writes the specified block position as a single encoded 64-bit BigEndian integer.\n\tThe three coordinates are written in XZY order, in 1.14+. */\n\tinline void WriteXZYPosition64(const Vector3i a_Position)\n\t{\n\t\tVERIFY(m_Out.WriteXZYPosition64(a_Position.x, a_Position.y, a_Position.z));\n\t}\n\n\t/** Writes the specified angle using a single byte. */\n\tvoid WriteByteAngle(double a_Angle);\n\n\t/** Writes the double value as a 27:5 fixed-point integer. */\n\tvoid WriteFPInt(double a_Value);\n\n\t/** Writes the specified UUID as a 128-bit BigEndian integer. */\n\tvoid WriteUUID(const cUUID & a_UUID);\n\n\tcProtocol::ePacketType GetPacketType() const { return m_PacketType; }\n\n\t/** Returns the human-readable representation of the packet type.\n\tUsed for logging the packets. */\n\tstatic AString PacketTypeToStr(cProtocol::ePacketType a_PacketType);\n\nprotected:\n\t/** The protocol instance in which the packet is being constructed. */\n\tcProtocol & m_Protocol;\n\n\t/** The protocol's buffer for the constructed packet data. */\n\tcByteBuffer & m_Out;\n\n\t/** The RAII lock preventing multithreaded access to the protocol buffer while constructing the packet. */\n\tcCSLock m_Lock;\n\n\t/** Type of the contained packet.\n\tUsed for logging purposes, the packet type is encoded into m_Out immediately in constructor. */\n\tcProtocol::ePacketType m_PacketType;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Protocol/Palettes/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tPalette_1_13.cpp\n\tPalette_1_13_1.cpp\n\tPalette_1_14.cpp\n\tPalette_1_15.cpp\n\tPalette_1_16.cpp\n\tUpgrade.cpp\n\n\tPalette_1_13.h\n\tPalette_1_13_1.h\n\tPalette_1_14.h\n\tPalette_1_15.h\n\tPalette_1_16.h\n\tUpgrade.h\n)"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_13.cpp",
    "content": "#include \"Globals.h\"\n#include \"Palette_1_13.h\"\n#include \"Registries/BlockStates.h\"\n\nnamespace Palette_1_13\n{\n\tUInt32 From(const BlockState Block)\n\t{\n\t\tusing namespace Block;\n\n\t\tswitch (Block.ID)\n\t\t{\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5399;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5400;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5401;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5402;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5403;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5404;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5405;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5406;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5407;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5408;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5409;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5410;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5411;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5412;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5413;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5414;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5415;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5416;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5417;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5418;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5419;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5420;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5421;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5422;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 7869;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 7870;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 7871;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 7872;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 7873;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 7874;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 7875;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 7876;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 7877;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 7878;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 7879;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 7880;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 7881;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 7882;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 7883;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 7884;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 7885;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 7886;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 7887;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 7888;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 7889;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 7890;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 7891;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 7892;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 7893;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 7894;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 7895;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 7896;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 7897;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 7898;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 7899;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 7900;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 7901;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 7902;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 7903;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 7904;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 7905;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 7906;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 7907;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 7908;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 7909;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 7910;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 7911;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 7912;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 7913;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 7914;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 7915;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 7916;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 7917;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 7918;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 7919;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 7920;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 7921;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 7922;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 7923;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 7924;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 7925;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 7926;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 7927;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 7928;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 7929;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 7930;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 7931;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 7932;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, true).ID: return 7615;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, false).ID: return 7616;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, true).ID: return 7619;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, false).ID: return 7620;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, true).ID: return 7623;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, false).ID: return 7624;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, true).ID: return 7627;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, false).ID: return 7628;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, true).ID: return 7631;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, false).ID: return 7632;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, true).ID: return 7635;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, false).ID: return 7636;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, true).ID: return 7639;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, false).ID: return 7640;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, true).ID: return 7643;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, false).ID: return 7644;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7453;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7454;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7455;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7456;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7457;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7458;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7459;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7460;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7461;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7462;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7463;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7464;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7465;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7466;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7467;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7468;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7469;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7470;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7471;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7472;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7473;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7474;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7475;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7476;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7477;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7478;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7479;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7480;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7481;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7482;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7483;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7484;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, true).ID: return 200;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, false).ID: return 201;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, true).ID: return 202;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, false).ID: return 203;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, true).ID: return 204;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, false).ID: return 205;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, true).ID: return 206;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, false).ID: return 207;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, true).ID: return 208;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, false).ID: return 209;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, true).ID: return 210;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, false).ID: return 211;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, true).ID: return 212;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, false).ID: return 213;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::X).ID: return 84;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Y).ID: return 85;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Z).ID: return 86;\n\t\t\tcase AcaciaPlanks::AcaciaPlanks().ID: return 19;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(true).ID: return 3375;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(false).ID: return 3376;\n\t\t\tcase AcaciaSapling::AcaciaSapling(0).ID: return 29;\n\t\t\tcase AcaciaSapling::AcaciaSapling(1).ID: return 30;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Top).ID: return 7282;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Bottom).ID: return 7284;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Double).ID: return 7286;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6333;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6335;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6337;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6339;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6341;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6343;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6345;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6347;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6349;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6351;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6353;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6355;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6357;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6359;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6361;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6363;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6365;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6367;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6369;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6371;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6373;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6375;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6377;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6379;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6381;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6383;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6385;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6387;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6389;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6391;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6393;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6395;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6397;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6399;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6401;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6403;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6405;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6407;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6409;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6411;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, true).ID: return 3850;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, false).ID: return 3852;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, true).ID: return 3854;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, false).ID: return 3856;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 3858;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 3860;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 3862;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 3864;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, true).ID: return 3866;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, false).ID: return 3868;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, true).ID: return 3870;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, false).ID: return 3872;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 3874;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 3876;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 3878;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 3880;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, true).ID: return 3882;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, false).ID: return 3884;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, true).ID: return 3886;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, false).ID: return 3888;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 3890;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 3892;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 3894;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 3896;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, true).ID: return 3898;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, false).ID: return 3900;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, true).ID: return 3902;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, false).ID: return 3904;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 3906;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 3908;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 3910;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 3912;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::X).ID: return 120;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Y).ID: return 121;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Z).ID: return 122;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::NorthSouth).ID: return 5780;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::EastWest).ID: return 5781;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingEast).ID: return 5782;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingWest).ID: return 5783;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingNorth).ID: return 5784;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingSouth).ID: return 5785;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::NorthSouth).ID: return 5786;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::EastWest).ID: return 5787;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingEast).ID: return 5788;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingWest).ID: return 5789;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingNorth).ID: return 5790;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingSouth).ID: return 5791;\n\t\t\tcase Air::Air().ID: return -0;\n\t\t\tcase Allium::Allium().ID: return 1114;\n\t\t\tcase Andesite::Andesite().ID: return 6;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZM).ID: return 5567;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZP).ID: return 5568;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XM).ID: return 5569;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XP).ID: return 5570;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4248;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4249;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XM).ID: return 4250;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XP).ID: return 4251;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4244;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4245;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XM).ID: return 4246;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XP).ID: return 4247;\n\t\t\tcase AzureBluet::AzureBluet().ID: return 1115;\n\t\t\tcase Barrier::Barrier().ID: return 6493;\n\t\t\tcase Beacon::Beacon().ID: return 5136;\n\t\t\tcase Bedrock::Bedrock().ID: return 33;\n\t\t\tcase Beetroots::Beetroots(0).ID: return 8158;\n\t\t\tcase Beetroots::Beetroots(1).ID: return 8159;\n\t\t\tcase Beetroots::Beetroots(2).ID: return 8160;\n\t\t\tcase Beetroots::Beetroots(3).ID: return 8161;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5351;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5352;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5353;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5354;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5355;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5356;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5357;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5358;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5359;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5360;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5361;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5362;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5363;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5364;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5365;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5366;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5367;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5368;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5369;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5370;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5371;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5372;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5373;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5374;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 7741;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 7742;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 7743;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 7744;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 7745;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 7746;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 7747;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 7748;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 7749;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 7750;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 7751;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 7752;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 7753;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 7754;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 7755;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 7756;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 7757;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 7758;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 7759;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 7760;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 7761;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 7762;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 7763;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 7764;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 7765;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 7766;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 7767;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 7768;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 7769;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 7770;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 7771;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 7772;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 7773;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 7774;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 7775;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 7776;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 7777;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 7778;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 7779;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 7780;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 7781;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 7782;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 7783;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 7784;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 7785;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 7786;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 7787;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 7788;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 7789;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 7790;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 7791;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 7792;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 7793;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 7794;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 7795;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 7796;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 7797;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 7798;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 7799;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 7800;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 7801;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 7802;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 7803;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 7804;\n\t\t\tcase BirchFence::BirchFence(true, true, true, true).ID: return 7551;\n\t\t\tcase BirchFence::BirchFence(true, true, true, false).ID: return 7552;\n\t\t\tcase BirchFence::BirchFence(true, true, false, true).ID: return 7555;\n\t\t\tcase BirchFence::BirchFence(true, true, false, false).ID: return 7556;\n\t\t\tcase BirchFence::BirchFence(true, false, true, true).ID: return 7559;\n\t\t\tcase BirchFence::BirchFence(true, false, true, false).ID: return 7560;\n\t\t\tcase BirchFence::BirchFence(true, false, false, true).ID: return 7563;\n\t\t\tcase BirchFence::BirchFence(true, false, false, false).ID: return 7564;\n\t\t\tcase BirchFence::BirchFence(false, true, true, true).ID: return 7567;\n\t\t\tcase BirchFence::BirchFence(false, true, true, false).ID: return 7568;\n\t\t\tcase BirchFence::BirchFence(false, true, false, true).ID: return 7571;\n\t\t\tcase BirchFence::BirchFence(false, true, false, false).ID: return 7572;\n\t\t\tcase BirchFence::BirchFence(false, false, true, true).ID: return 7575;\n\t\t\tcase BirchFence::BirchFence(false, false, true, false).ID: return 7576;\n\t\t\tcase BirchFence::BirchFence(false, false, false, true).ID: return 7579;\n\t\t\tcase BirchFence::BirchFence(false, false, false, false).ID: return 7580;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7389;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7390;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7391;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7392;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7393;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7394;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7395;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7396;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7397;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7398;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7399;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7400;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7401;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7402;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7403;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7404;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7405;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7406;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7407;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7408;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7409;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7410;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7411;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7412;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7413;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7414;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7415;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7416;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7417;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7418;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7419;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7420;\n\t\t\tcase BirchLeaves::BirchLeaves(1, true).ID: return 172;\n\t\t\tcase BirchLeaves::BirchLeaves(1, false).ID: return 173;\n\t\t\tcase BirchLeaves::BirchLeaves(2, true).ID: return 174;\n\t\t\tcase BirchLeaves::BirchLeaves(2, false).ID: return 175;\n\t\t\tcase BirchLeaves::BirchLeaves(3, true).ID: return 176;\n\t\t\tcase BirchLeaves::BirchLeaves(3, false).ID: return 177;\n\t\t\tcase BirchLeaves::BirchLeaves(4, true).ID: return 178;\n\t\t\tcase BirchLeaves::BirchLeaves(4, false).ID: return 179;\n\t\t\tcase BirchLeaves::BirchLeaves(5, true).ID: return 180;\n\t\t\tcase BirchLeaves::BirchLeaves(5, false).ID: return 181;\n\t\t\tcase BirchLeaves::BirchLeaves(6, true).ID: return 182;\n\t\t\tcase BirchLeaves::BirchLeaves(6, false).ID: return 183;\n\t\t\tcase BirchLeaves::BirchLeaves(7, true).ID: return 184;\n\t\t\tcase BirchLeaves::BirchLeaves(7, false).ID: return 185;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::X).ID: return 78;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Y).ID: return 79;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Z).ID: return 80;\n\t\t\tcase BirchPlanks::BirchPlanks().ID: return 17;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(true).ID: return 3371;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(false).ID: return 3372;\n\t\t\tcase BirchSapling::BirchSapling(0).ID: return 25;\n\t\t\tcase BirchSapling::BirchSapling(1).ID: return 26;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Top).ID: return 7270;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Bottom).ID: return 7272;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Double).ID: return 7274;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 4965;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 4967;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 4969;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 4971;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 4973;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 4975;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 4977;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 4979;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 4981;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 4983;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 4985;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 4987;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 4989;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 4991;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 4993;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 4995;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 4997;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 4999;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5001;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5003;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5005;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5007;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5009;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5011;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5013;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5015;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5017;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5019;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5021;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5023;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5025;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5027;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5029;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5031;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5033;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5035;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5037;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5039;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5041;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5043;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, true).ID: return 3722;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, false).ID: return 3724;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, true).ID: return 3726;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, false).ID: return 3728;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, true).ID: return 3730;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, false).ID: return 3732;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, true).ID: return 3734;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, false).ID: return 3736;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, true).ID: return 3738;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, false).ID: return 3740;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, true).ID: return 3742;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, false).ID: return 3744;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, true).ID: return 3746;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, false).ID: return 3748;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, true).ID: return 3750;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, false).ID: return 3752;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, true).ID: return 3754;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, false).ID: return 3756;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, true).ID: return 3758;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, false).ID: return 3760;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, true).ID: return 3762;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, false).ID: return 3764;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, true).ID: return 3766;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, false).ID: return 3768;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, true).ID: return 3770;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, false).ID: return 3772;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, true).ID: return 3774;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, false).ID: return 3776;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, true).ID: return 3778;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, false).ID: return 3780;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, true).ID: return 3782;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, false).ID: return 3784;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::X).ID: return 114;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Y).ID: return 115;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Z).ID: return 116;\n\t\t\tcase BlackBanner::BlackBanner(0).ID: return 7094;\n\t\t\tcase BlackBanner::BlackBanner(1).ID: return 7095;\n\t\t\tcase BlackBanner::BlackBanner(2).ID: return 7096;\n\t\t\tcase BlackBanner::BlackBanner(3).ID: return 7097;\n\t\t\tcase BlackBanner::BlackBanner(4).ID: return 7098;\n\t\t\tcase BlackBanner::BlackBanner(5).ID: return 7099;\n\t\t\tcase BlackBanner::BlackBanner(6).ID: return 7100;\n\t\t\tcase BlackBanner::BlackBanner(7).ID: return 7101;\n\t\t\tcase BlackBanner::BlackBanner(8).ID: return 7102;\n\t\t\tcase BlackBanner::BlackBanner(9).ID: return 7103;\n\t\t\tcase BlackBanner::BlackBanner(10).ID: return 7104;\n\t\t\tcase BlackBanner::BlackBanner(11).ID: return 7105;\n\t\t\tcase BlackBanner::BlackBanner(12).ID: return 7106;\n\t\t\tcase BlackBanner::BlackBanner(13).ID: return 7107;\n\t\t\tcase BlackBanner::BlackBanner(14).ID: return 7108;\n\t\t\tcase BlackBanner::BlackBanner(15).ID: return 7109;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Head).ID: return 988;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Foot).ID: return 989;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Head).ID: return 990;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Foot).ID: return 991;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Head).ID: return 992;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Foot).ID: return 993;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Head).ID: return 994;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Foot).ID: return 995;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Head).ID: return 996;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Foot).ID: return 997;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Head).ID: return 998;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Foot).ID: return 999;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Head).ID: return 1000;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Foot).ID: return 1001;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Head).ID: return 1002;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Foot).ID: return 1003;\n\t\t\tcase BlackCarpet::BlackCarpet().ID: return 6838;\n\t\t\tcase BlackConcrete::BlackConcrete().ID: return 8392;\n\t\t\tcase BlackConcretePowder::BlackConcretePowder().ID: return 8408;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8373;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8374;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8375;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8376;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8307;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8308;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8309;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8310;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8311;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8312;\n\t\t\tcase BlackStainedGlass::BlackStainedGlass().ID: return 3592;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, true).ID: return 6302;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, false).ID: return 6303;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, true).ID: return 6306;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, false).ID: return 6307;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, true).ID: return 6310;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, false).ID: return 6311;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, true).ID: return 6314;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, false).ID: return 6315;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, true).ID: return 6318;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, false).ID: return 6319;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, true).ID: return 6322;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, false).ID: return 6323;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, true).ID: return 6326;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, false).ID: return 6327;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, true).ID: return 6330;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, false).ID: return 6331;\n\t\t\tcase BlackTerracotta::BlackTerracotta().ID: return 5819;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7170;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7171;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7172;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7173;\n\t\t\tcase BlackWool::BlackWool().ID: return 1098;\n\t\t\tcase BlueBanner::BlueBanner(0).ID: return 7030;\n\t\t\tcase BlueBanner::BlueBanner(1).ID: return 7031;\n\t\t\tcase BlueBanner::BlueBanner(2).ID: return 7032;\n\t\t\tcase BlueBanner::BlueBanner(3).ID: return 7033;\n\t\t\tcase BlueBanner::BlueBanner(4).ID: return 7034;\n\t\t\tcase BlueBanner::BlueBanner(5).ID: return 7035;\n\t\t\tcase BlueBanner::BlueBanner(6).ID: return 7036;\n\t\t\tcase BlueBanner::BlueBanner(7).ID: return 7037;\n\t\t\tcase BlueBanner::BlueBanner(8).ID: return 7038;\n\t\t\tcase BlueBanner::BlueBanner(9).ID: return 7039;\n\t\t\tcase BlueBanner::BlueBanner(10).ID: return 7040;\n\t\t\tcase BlueBanner::BlueBanner(11).ID: return 7041;\n\t\t\tcase BlueBanner::BlueBanner(12).ID: return 7042;\n\t\t\tcase BlueBanner::BlueBanner(13).ID: return 7043;\n\t\t\tcase BlueBanner::BlueBanner(14).ID: return 7044;\n\t\t\tcase BlueBanner::BlueBanner(15).ID: return 7045;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Head).ID: return 924;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Foot).ID: return 925;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Head).ID: return 926;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Foot).ID: return 927;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Head).ID: return 928;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Foot).ID: return 929;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Head).ID: return 930;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Foot).ID: return 931;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Head).ID: return 932;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Foot).ID: return 933;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Head).ID: return 934;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Foot).ID: return 935;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Head).ID: return 936;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Foot).ID: return 937;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Head).ID: return 938;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Foot).ID: return 939;\n\t\t\tcase BlueCarpet::BlueCarpet().ID: return 6834;\n\t\t\tcase BlueConcrete::BlueConcrete().ID: return 8388;\n\t\t\tcase BlueConcretePowder::BlueConcretePowder().ID: return 8404;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8357;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8358;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8359;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8360;\n\t\t\tcase BlueIce::BlueIce().ID: return 8572;\n\t\t\tcase BlueOrchid::BlueOrchid().ID: return 1113;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8283;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8284;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8285;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8286;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8287;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8288;\n\t\t\tcase BlueStainedGlass::BlueStainedGlass().ID: return 3588;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, true).ID: return 6174;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, false).ID: return 6175;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, true).ID: return 6178;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, false).ID: return 6179;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, true).ID: return 6182;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, false).ID: return 6183;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, true).ID: return 6186;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, false).ID: return 6187;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, true).ID: return 6190;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, false).ID: return 6191;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, true).ID: return 6194;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, false).ID: return 6195;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, true).ID: return 6198;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, false).ID: return 6199;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, true).ID: return 6202;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, false).ID: return 6203;\n\t\t\tcase BlueTerracotta::BlueTerracotta().ID: return 5815;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7154;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7155;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7156;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7157;\n\t\t\tcase BlueWool::BlueWool().ID: return 1094;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::X).ID: return 8195;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Y).ID: return 8196;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Z).ID: return 8197;\n\t\t\tcase Bookshelf::Bookshelf().ID: return 1127;\n\t\t\tcase BrainCoral::BrainCoral().ID: return 8460;\n\t\t\tcase BrainCoralBlock::BrainCoralBlock().ID: return 8455;\n\t\t\tcase BrainCoralFan::BrainCoralFan().ID: return 8557;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8513;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8515;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8517;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8519;\n\t\t\tcase BrewingStand::BrewingStand(true, true, true).ID: return 4613;\n\t\t\tcase BrewingStand::BrewingStand(true, true, false).ID: return 4614;\n\t\t\tcase BrewingStand::BrewingStand(true, false, true).ID: return 4615;\n\t\t\tcase BrewingStand::BrewingStand(true, false, false).ID: return 4616;\n\t\t\tcase BrewingStand::BrewingStand(false, true, true).ID: return 4617;\n\t\t\tcase BrewingStand::BrewingStand(false, true, false).ID: return 4618;\n\t\t\tcase BrewingStand::BrewingStand(false, false, true).ID: return 4619;\n\t\t\tcase BrewingStand::BrewingStand(false, false, false).ID: return 4620;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Top).ID: return 7318;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Bottom).ID: return 7320;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Double).ID: return 7322;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4333;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4335;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4337;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4339;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4341;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4343;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4345;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4347;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4349;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4351;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4353;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4355;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4357;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4359;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4361;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4363;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4365;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4367;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4369;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4371;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4373;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4375;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4377;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4379;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4381;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4383;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4385;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4387;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4389;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4391;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4393;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4395;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4397;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4399;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4401;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4403;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4405;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4407;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4409;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4411;\n\t\t\tcase Bricks::Bricks().ID: return 1125;\n\t\t\tcase BrownBanner::BrownBanner(0).ID: return 7046;\n\t\t\tcase BrownBanner::BrownBanner(1).ID: return 7047;\n\t\t\tcase BrownBanner::BrownBanner(2).ID: return 7048;\n\t\t\tcase BrownBanner::BrownBanner(3).ID: return 7049;\n\t\t\tcase BrownBanner::BrownBanner(4).ID: return 7050;\n\t\t\tcase BrownBanner::BrownBanner(5).ID: return 7051;\n\t\t\tcase BrownBanner::BrownBanner(6).ID: return 7052;\n\t\t\tcase BrownBanner::BrownBanner(7).ID: return 7053;\n\t\t\tcase BrownBanner::BrownBanner(8).ID: return 7054;\n\t\t\tcase BrownBanner::BrownBanner(9).ID: return 7055;\n\t\t\tcase BrownBanner::BrownBanner(10).ID: return 7056;\n\t\t\tcase BrownBanner::BrownBanner(11).ID: return 7057;\n\t\t\tcase BrownBanner::BrownBanner(12).ID: return 7058;\n\t\t\tcase BrownBanner::BrownBanner(13).ID: return 7059;\n\t\t\tcase BrownBanner::BrownBanner(14).ID: return 7060;\n\t\t\tcase BrownBanner::BrownBanner(15).ID: return 7061;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Head).ID: return 940;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Foot).ID: return 941;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Head).ID: return 942;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Foot).ID: return 943;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Head).ID: return 944;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Foot).ID: return 945;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Head).ID: return 946;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Foot).ID: return 947;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Head).ID: return 948;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Foot).ID: return 949;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Head).ID: return 950;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Foot).ID: return 951;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Head).ID: return 952;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Foot).ID: return 953;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Head).ID: return 954;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Foot).ID: return 955;\n\t\t\tcase BrownCarpet::BrownCarpet().ID: return 6835;\n\t\t\tcase BrownConcrete::BrownConcrete().ID: return 8389;\n\t\t\tcase BrownConcretePowder::BrownConcretePowder().ID: return 8405;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8361;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8362;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8363;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8364;\n\t\t\tcase BrownMushroom::BrownMushroom().ID: return 1121;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, true).ID: return 3987;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, false).ID: return 3988;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, true).ID: return 3989;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, false).ID: return 3990;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, true).ID: return 3991;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, false).ID: return 3992;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, true).ID: return 3993;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, false).ID: return 3994;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, true).ID: return 3995;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, false).ID: return 3996;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, true).ID: return 3997;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, false).ID: return 3998;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, true).ID: return 3999;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, false).ID: return 4000;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, true).ID: return 4001;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, false).ID: return 4002;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, true).ID: return 4003;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, false).ID: return 4004;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, true).ID: return 4005;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, false).ID: return 4006;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, true).ID: return 4007;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, false).ID: return 4008;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, true).ID: return 4009;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, false).ID: return 4010;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, true).ID: return 4011;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, false).ID: return 4012;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, true).ID: return 4013;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, false).ID: return 4014;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, true).ID: return 4015;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, false).ID: return 4016;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, true).ID: return 4017;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, false).ID: return 4018;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, true).ID: return 4019;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, false).ID: return 4020;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, true).ID: return 4021;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, false).ID: return 4022;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, true).ID: return 4023;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, false).ID: return 4024;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, true).ID: return 4025;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, false).ID: return 4026;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, true).ID: return 4027;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, false).ID: return 4028;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, true).ID: return 4029;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, false).ID: return 4030;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, true).ID: return 4031;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, false).ID: return 4032;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, true).ID: return 4033;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, false).ID: return 4034;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, true).ID: return 4035;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, false).ID: return 4036;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, true).ID: return 4037;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, false).ID: return 4038;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, true).ID: return 4039;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, false).ID: return 4040;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, true).ID: return 4041;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, false).ID: return 4042;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, true).ID: return 4043;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, false).ID: return 4044;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, true).ID: return 4045;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, false).ID: return 4046;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, true).ID: return 4047;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, false).ID: return 4048;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, true).ID: return 4049;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false).ID: return 4050;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8289;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8290;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8291;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8292;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8293;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8294;\n\t\t\tcase BrownStainedGlass::BrownStainedGlass().ID: return 3589;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, true).ID: return 6206;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, false).ID: return 6207;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, true).ID: return 6210;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, false).ID: return 6211;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, true).ID: return 6214;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, false).ID: return 6215;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, true).ID: return 6218;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, false).ID: return 6219;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, true).ID: return 6222;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, false).ID: return 6223;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, true).ID: return 6226;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, false).ID: return 6227;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, true).ID: return 6230;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, false).ID: return 6231;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, true).ID: return 6234;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, false).ID: return 6235;\n\t\t\tcase BrownTerracotta::BrownTerracotta().ID: return 5816;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7158;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7159;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7160;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7161;\n\t\t\tcase BrownWool::BrownWool().ID: return 1095;\n\t\t\tcase BubbleColumn::BubbleColumn(true).ID: return 8576;\n\t\t\tcase BubbleColumn::BubbleColumn(false).ID: return 8577;\n\t\t\tcase BubbleCoral::BubbleCoral().ID: return 8461;\n\t\t\tcase BubbleCoralBlock::BubbleCoralBlock().ID: return 8456;\n\t\t\tcase BubbleCoralFan::BubbleCoralFan().ID: return 8559;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8521;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8523;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8525;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8527;\n\t\t\tcase Cactus::Cactus(0).ID: return 3425;\n\t\t\tcase Cactus::Cactus(1).ID: return 3426;\n\t\t\tcase Cactus::Cactus(2).ID: return 3427;\n\t\t\tcase Cactus::Cactus(3).ID: return 3428;\n\t\t\tcase Cactus::Cactus(4).ID: return 3429;\n\t\t\tcase Cactus::Cactus(5).ID: return 3430;\n\t\t\tcase Cactus::Cactus(6).ID: return 3431;\n\t\t\tcase Cactus::Cactus(7).ID: return 3432;\n\t\t\tcase Cactus::Cactus(8).ID: return 3433;\n\t\t\tcase Cactus::Cactus(9).ID: return 3434;\n\t\t\tcase Cactus::Cactus(10).ID: return 3435;\n\t\t\tcase Cactus::Cactus(11).ID: return 3436;\n\t\t\tcase Cactus::Cactus(12).ID: return 3437;\n\t\t\tcase Cactus::Cactus(13).ID: return 3438;\n\t\t\tcase Cactus::Cactus(14).ID: return 3439;\n\t\t\tcase Cactus::Cactus(15).ID: return 3440;\n\t\t\tcase Cake::Cake(0).ID: return 3506;\n\t\t\tcase Cake::Cake(1).ID: return 3507;\n\t\t\tcase Cake::Cake(2).ID: return 3508;\n\t\t\tcase Cake::Cake(3).ID: return 3509;\n\t\t\tcase Cake::Cake(4).ID: return 3510;\n\t\t\tcase Cake::Cake(5).ID: return 3511;\n\t\t\tcase Cake::Cake(6).ID: return 3512;\n\t\t\tcase Carrots::Carrots(0).ID: return 5287;\n\t\t\tcase Carrots::Carrots(1).ID: return 5288;\n\t\t\tcase Carrots::Carrots(2).ID: return 5289;\n\t\t\tcase Carrots::Carrots(3).ID: return 5290;\n\t\t\tcase Carrots::Carrots(4).ID: return 5291;\n\t\t\tcase Carrots::Carrots(5).ID: return 5292;\n\t\t\tcase Carrots::Carrots(6).ID: return 5293;\n\t\t\tcase Carrots::Carrots(7).ID: return 5294;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZM).ID: return 3498;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZP).ID: return 3499;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XM).ID: return 3500;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XP).ID: return 3501;\n\t\t\tcase Cauldron::Cauldron(0).ID: return 4621;\n\t\t\tcase Cauldron::Cauldron(1).ID: return 4622;\n\t\t\tcase Cauldron::Cauldron(2).ID: return 4623;\n\t\t\tcase Cauldron::Cauldron(3).ID: return 4624;\n\t\t\tcase CaveAir::CaveAir().ID: return 8575;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 8176;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 8177;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 8178;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 8179;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 8180;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 8181;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 8182;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 8183;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 8184;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 8185;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 8186;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 8187;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Single).ID: return 1729;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Left).ID: return 1731;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Right).ID: return 1733;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Single).ID: return 1735;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Left).ID: return 1737;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Right).ID: return 1739;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Single).ID: return 1741;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Left).ID: return 1743;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Right).ID: return 1745;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Single).ID: return 1747;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Left).ID: return 1749;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Right).ID: return 1751;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 5571;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 5572;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 5573;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 5574;\n\t\t\tcase ChiseledQuartzBlock::ChiseledQuartzBlock().ID: return 5696;\n\t\t\tcase ChiseledRedSandstone::ChiseledRedSandstone().ID: return 7175;\n\t\t\tcase ChiseledSandstone::ChiseledSandstone().ID: return 246;\n\t\t\tcase ChiseledStoneBricks::ChiseledStoneBricks().ID: return 3986;\n\t\t\tcase ChorusFlower::ChorusFlower(0).ID: return 8067;\n\t\t\tcase ChorusFlower::ChorusFlower(1).ID: return 8068;\n\t\t\tcase ChorusFlower::ChorusFlower(2).ID: return 8069;\n\t\t\tcase ChorusFlower::ChorusFlower(3).ID: return 8070;\n\t\t\tcase ChorusFlower::ChorusFlower(4).ID: return 8071;\n\t\t\tcase ChorusFlower::ChorusFlower(5).ID: return 8072;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, true).ID: return 8003;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, false).ID: return 8004;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, true).ID: return 8005;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, false).ID: return 8006;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, true).ID: return 8007;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, false).ID: return 8008;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, true).ID: return 8009;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, false).ID: return 8010;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, true).ID: return 8011;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, false).ID: return 8012;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, true).ID: return 8013;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, false).ID: return 8014;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, true).ID: return 8015;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, false).ID: return 8016;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, true).ID: return 8017;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, false).ID: return 8018;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, true).ID: return 8019;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, false).ID: return 8020;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, true).ID: return 8021;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, false).ID: return 8022;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, true).ID: return 8023;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, false).ID: return 8024;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, true).ID: return 8025;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, false).ID: return 8026;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, true).ID: return 8027;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, false).ID: return 8028;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, true).ID: return 8029;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, false).ID: return 8030;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, true).ID: return 8031;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, false).ID: return 8032;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, true).ID: return 8033;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, false).ID: return 8034;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, true).ID: return 8035;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, false).ID: return 8036;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, true).ID: return 8037;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, false).ID: return 8038;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, true).ID: return 8039;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, false).ID: return 8040;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, true).ID: return 8041;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, false).ID: return 8042;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, true).ID: return 8043;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, false).ID: return 8044;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, true).ID: return 8045;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, false).ID: return 8046;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, true).ID: return 8047;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, false).ID: return 8048;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, true).ID: return 8049;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, false).ID: return 8050;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, true).ID: return 8051;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, false).ID: return 8052;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, true).ID: return 8053;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, false).ID: return 8054;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, true).ID: return 8055;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, false).ID: return 8056;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, true).ID: return 8057;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, false).ID: return 8058;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, true).ID: return 8059;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, false).ID: return 8060;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, true).ID: return 8061;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, false).ID: return 8062;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, true).ID: return 8063;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, false).ID: return 8064;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, true).ID: return 8065;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, false).ID: return 8066;\n\t\t\tcase Clay::Clay().ID: return 3441;\n\t\t\tcase CoalBlock::CoalBlock().ID: return 6840;\n\t\t\tcase CoalOre::CoalOre().ID: return 71;\n\t\t\tcase CoarseDirt::CoarseDirt().ID: return 11;\n\t\t\tcase Cobblestone::Cobblestone().ID: return 14;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Top).ID: return 7312;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Bottom).ID: return 7314;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Double).ID: return 7316;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3190;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3192;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3194;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3196;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3198;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3200;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3202;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3204;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3206;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3208;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3210;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3212;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3214;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3216;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3218;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3220;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3222;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3224;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3226;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3228;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3230;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3232;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3234;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3236;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3238;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3240;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3242;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3244;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3246;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3248;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3250;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3252;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3254;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3256;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3258;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3260;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3262;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3264;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3266;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3268;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5139;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5140;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5143;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5144;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5147;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5148;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5151;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5152;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5155;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5156;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5159;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5160;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5163;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5164;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5167;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5168;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5171;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5172;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5175;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5176;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5179;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5180;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5183;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5184;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5187;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5188;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5191;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5192;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5195;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5196;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5199;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5200;\n\t\t\tcase Cobweb::Cobweb().ID: return 1040;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZM).ID: return 4638;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZP).ID: return 4639;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XM).ID: return 4640;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XP).ID: return 4641;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZM).ID: return 4642;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZP).ID: return 4643;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XM).ID: return 4644;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XP).ID: return 4645;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZM).ID: return 4646;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZP).ID: return 4647;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XM).ID: return 4648;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XP).ID: return 4649;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5124;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 5125;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5126;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 5127;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 5128;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 5129;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5130;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 5131;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5132;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 5133;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 5134;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 5135;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, true).ID: return 5635;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, false).ID: return 5636;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, true).ID: return 5637;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, false).ID: return 5638;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, true).ID: return 5639;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, false).ID: return 5640;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, true).ID: return 5641;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, false).ID: return 5642;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, true).ID: return 5643;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, false).ID: return 5644;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, true).ID: return 5645;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, false).ID: return 5646;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, true).ID: return 5647;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, false).ID: return 5648;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, true).ID: return 5649;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, false).ID: return 5650;\n\t\t\tcase Conduit::Conduit().ID: return 8573;\n\t\t\tcase CrackedStoneBricks::CrackedStoneBricks().ID: return 3985;\n\t\t\tcase CraftingTable::CraftingTable().ID: return 3050;\n\t\t\tcase CreeperHead::CreeperHead(0).ID: return 5531;\n\t\t\tcase CreeperHead::CreeperHead(1).ID: return 5532;\n\t\t\tcase CreeperHead::CreeperHead(2).ID: return 5533;\n\t\t\tcase CreeperHead::CreeperHead(3).ID: return 5534;\n\t\t\tcase CreeperHead::CreeperHead(4).ID: return 5535;\n\t\t\tcase CreeperHead::CreeperHead(5).ID: return 5536;\n\t\t\tcase CreeperHead::CreeperHead(6).ID: return 5537;\n\t\t\tcase CreeperHead::CreeperHead(7).ID: return 5538;\n\t\t\tcase CreeperHead::CreeperHead(8).ID: return 5539;\n\t\t\tcase CreeperHead::CreeperHead(9).ID: return 5540;\n\t\t\tcase CreeperHead::CreeperHead(10).ID: return 5541;\n\t\t\tcase CreeperHead::CreeperHead(11).ID: return 5542;\n\t\t\tcase CreeperHead::CreeperHead(12).ID: return 5543;\n\t\t\tcase CreeperHead::CreeperHead(13).ID: return 5544;\n\t\t\tcase CreeperHead::CreeperHead(14).ID: return 5545;\n\t\t\tcase CreeperHead::CreeperHead(15).ID: return 5546;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 5527;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 5528;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 5529;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 5530;\n\t\t\tcase CutRedSandstone::CutRedSandstone().ID: return 7176;\n\t\t\tcase CutSandstone::CutSandstone().ID: return 247;\n\t\t\tcase CyanBanner::CyanBanner(0).ID: return 6998;\n\t\t\tcase CyanBanner::CyanBanner(1).ID: return 6999;\n\t\t\tcase CyanBanner::CyanBanner(2).ID: return 7000;\n\t\t\tcase CyanBanner::CyanBanner(3).ID: return 7001;\n\t\t\tcase CyanBanner::CyanBanner(4).ID: return 7002;\n\t\t\tcase CyanBanner::CyanBanner(5).ID: return 7003;\n\t\t\tcase CyanBanner::CyanBanner(6).ID: return 7004;\n\t\t\tcase CyanBanner::CyanBanner(7).ID: return 7005;\n\t\t\tcase CyanBanner::CyanBanner(8).ID: return 7006;\n\t\t\tcase CyanBanner::CyanBanner(9).ID: return 7007;\n\t\t\tcase CyanBanner::CyanBanner(10).ID: return 7008;\n\t\t\tcase CyanBanner::CyanBanner(11).ID: return 7009;\n\t\t\tcase CyanBanner::CyanBanner(12).ID: return 7010;\n\t\t\tcase CyanBanner::CyanBanner(13).ID: return 7011;\n\t\t\tcase CyanBanner::CyanBanner(14).ID: return 7012;\n\t\t\tcase CyanBanner::CyanBanner(15).ID: return 7013;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Head).ID: return 892;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Foot).ID: return 893;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Head).ID: return 894;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Foot).ID: return 895;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Head).ID: return 896;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Foot).ID: return 897;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Head).ID: return 898;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Foot).ID: return 899;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Head).ID: return 900;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Foot).ID: return 901;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Head).ID: return 902;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Foot).ID: return 903;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Head).ID: return 904;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Foot).ID: return 905;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Head).ID: return 906;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Foot).ID: return 907;\n\t\t\tcase CyanCarpet::CyanCarpet().ID: return 6832;\n\t\t\tcase CyanConcrete::CyanConcrete().ID: return 8386;\n\t\t\tcase CyanConcretePowder::CyanConcretePowder().ID: return 8402;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8349;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8350;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8351;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8352;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8271;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8272;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8273;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8274;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8275;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8276;\n\t\t\tcase CyanStainedGlass::CyanStainedGlass().ID: return 3586;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, true).ID: return 6110;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, false).ID: return 6111;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, true).ID: return 6114;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, false).ID: return 6115;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, true).ID: return 6118;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, false).ID: return 6119;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, true).ID: return 6122;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, false).ID: return 6123;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, true).ID: return 6126;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, false).ID: return 6127;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, true).ID: return 6130;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, false).ID: return 6131;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, true).ID: return 6134;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, false).ID: return 6135;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, true).ID: return 6138;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, false).ID: return 6139;\n\t\t\tcase CyanTerracotta::CyanTerracotta().ID: return 5813;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7146;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7147;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7148;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7149;\n\t\t\tcase CyanWool::CyanWool().ID: return 1092;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 5575;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 5576;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 5577;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 5578;\n\t\t\tcase Dandelion::Dandelion().ID: return 1111;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5423;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5424;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5425;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5426;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5427;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5428;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5429;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5430;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5431;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5432;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5433;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5434;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5435;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5436;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5437;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5438;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5439;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5440;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5441;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5442;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5443;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5444;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5445;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5446;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 7933;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 7934;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 7935;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 7936;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 7937;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 7938;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 7939;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 7940;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 7941;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 7942;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 7943;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 7944;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 7945;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 7946;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 7947;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 7948;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 7949;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 7950;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 7951;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 7952;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 7953;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 7954;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 7955;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 7956;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 7957;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 7958;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 7959;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 7960;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 7961;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 7962;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 7963;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 7964;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 7965;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 7966;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 7967;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 7968;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 7969;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 7970;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 7971;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 7972;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 7973;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 7974;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 7975;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 7976;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 7977;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 7978;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 7979;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 7980;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 7981;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 7982;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 7983;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 7984;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 7985;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 7986;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 7987;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 7988;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 7989;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 7990;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 7991;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 7992;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 7993;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 7994;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 7995;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 7996;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, true).ID: return 7647;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, false).ID: return 7648;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, true).ID: return 7651;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, false).ID: return 7652;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, true).ID: return 7655;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, false).ID: return 7656;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, true).ID: return 7659;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, false).ID: return 7660;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, true).ID: return 7663;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, false).ID: return 7664;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, true).ID: return 7667;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, false).ID: return 7668;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, true).ID: return 7671;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, false).ID: return 7672;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, true).ID: return 7675;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, false).ID: return 7676;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7485;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7486;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7487;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7488;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7489;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7490;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7491;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7492;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7493;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7494;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7495;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7496;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7497;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7498;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7499;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7500;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7501;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7502;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7503;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7504;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7505;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7506;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7507;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7508;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7509;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7510;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7511;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7512;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7513;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7514;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7515;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7516;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, true).ID: return 214;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, false).ID: return 215;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, true).ID: return 216;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, false).ID: return 217;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, true).ID: return 218;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, false).ID: return 219;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, true).ID: return 220;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, false).ID: return 221;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, true).ID: return 222;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, false).ID: return 223;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, true).ID: return 224;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, false).ID: return 225;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, true).ID: return 226;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, false).ID: return 227;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::X).ID: return 87;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Y).ID: return 88;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Z).ID: return 89;\n\t\t\tcase DarkOakPlanks::DarkOakPlanks().ID: return 20;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(true).ID: return 3377;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(false).ID: return 3378;\n\t\t\tcase DarkOakSapling::DarkOakSapling(0).ID: return 31;\n\t\t\tcase DarkOakSapling::DarkOakSapling(1).ID: return 32;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Top).ID: return 7288;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Bottom).ID: return 7290;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Double).ID: return 7292;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6413;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6415;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6417;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6419;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6421;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6423;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6425;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6427;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6429;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6431;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6433;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6435;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6437;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6439;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6441;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6443;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6445;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6447;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6449;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6451;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6453;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6455;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6457;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6459;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6461;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6463;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6465;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6467;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6469;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6471;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6473;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6475;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6477;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6479;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6481;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6483;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6485;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6487;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6489;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6491;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, true).ID: return 3914;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, false).ID: return 3916;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, true).ID: return 3918;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, false).ID: return 3920;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 3922;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 3924;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 3926;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 3928;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, true).ID: return 3930;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, false).ID: return 3932;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, true).ID: return 3934;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, false).ID: return 3936;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 3938;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 3940;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 3942;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 3944;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, true).ID: return 3946;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, false).ID: return 3948;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, true).ID: return 3950;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, false).ID: return 3952;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 3954;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 3956;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 3958;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 3960;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, true).ID: return 3962;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, false).ID: return 3964;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, true).ID: return 3966;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, false).ID: return 3968;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 3970;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 3972;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 3974;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 3976;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::X).ID: return 123;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Y).ID: return 124;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Z).ID: return 125;\n\t\t\tcase DarkPrismarine::DarkPrismarine().ID: return 6560;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Top).ID: return 6814;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Bottom).ID: return 6816;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Double).ID: return 6818;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 6722;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6724;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 6726;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6728;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 6730;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 6732;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6734;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 6736;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6738;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 6740;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 6742;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6744;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 6746;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6748;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 6750;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 6752;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6754;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 6756;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6758;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 6760;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 6762;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6764;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 6766;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6768;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 6770;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 6772;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6774;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 6776;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6778;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 6780;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 6782;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6784;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 6786;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6788;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 6790;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 6792;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6794;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 6796;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6798;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 6800;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 0).ID: return 5651;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 1).ID: return 5652;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 2).ID: return 5653;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 3).ID: return 5654;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 4).ID: return 5655;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 5).ID: return 5656;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 6).ID: return 5657;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 7).ID: return 5658;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 8).ID: return 5659;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 9).ID: return 5660;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 10).ID: return 5661;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 11).ID: return 5662;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 12).ID: return 5663;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 13).ID: return 5664;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 14).ID: return 5665;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 15).ID: return 5666;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 0).ID: return 5667;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 1).ID: return 5668;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 2).ID: return 5669;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 3).ID: return 5670;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 4).ID: return 5671;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 5).ID: return 5672;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 6).ID: return 5673;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 7).ID: return 5674;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 8).ID: return 5675;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 9).ID: return 5676;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 10).ID: return 5677;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 11).ID: return 5678;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 12).ID: return 5679;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 13).ID: return 5680;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 14).ID: return 5681;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 15).ID: return 5682;\n\t\t\tcase DeadBrainCoralBlock::DeadBrainCoralBlock().ID: return 8450;\n\t\t\tcase DeadBrainCoralFan::DeadBrainCoralFan().ID: return 8547;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8473;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8475;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8477;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8479;\n\t\t\tcase DeadBubbleCoralBlock::DeadBubbleCoralBlock().ID: return 8451;\n\t\t\tcase DeadBubbleCoralFan::DeadBubbleCoralFan().ID: return 8549;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8481;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8483;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8485;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8487;\n\t\t\tcase DeadBush::DeadBush().ID: return 1043;\n\t\t\tcase DeadFireCoralBlock::DeadFireCoralBlock().ID: return 8452;\n\t\t\tcase DeadFireCoralFan::DeadFireCoralFan().ID: return 8551;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8489;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8491;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8493;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8495;\n\t\t\tcase DeadHornCoralBlock::DeadHornCoralBlock().ID: return 8453;\n\t\t\tcase DeadHornCoralFan::DeadHornCoralFan().ID: return 8553;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8497;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8499;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8501;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8503;\n\t\t\tcase DeadTubeCoralBlock::DeadTubeCoralBlock().ID: return 8449;\n\t\t\tcase DeadTubeCoralFan::DeadTubeCoralFan().ID: return 8545;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8465;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8467;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8469;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8471;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::NorthSouth).ID: return 1016;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::EastWest).ID: return 1017;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingEast).ID: return 1018;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingWest).ID: return 1019;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingNorth).ID: return 1020;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingSouth).ID: return 1021;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::NorthSouth).ID: return 1022;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::EastWest).ID: return 1023;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingEast).ID: return 1024;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingWest).ID: return 1025;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingNorth).ID: return 1026;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingSouth).ID: return 1027;\n\t\t\tcase DiamondBlock::DiamondBlock().ID: return 3049;\n\t\t\tcase DiamondOre::DiamondOre().ID: return 3048;\n\t\t\tcase Diorite::Diorite().ID: return 4;\n\t\t\tcase Dirt::Dirt().ID: return 10;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, true).ID: return 233;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, false).ID: return 234;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, true).ID: return 235;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, false).ID: return 236;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, true).ID: return 237;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, false).ID: return 238;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, true).ID: return 239;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, false).ID: return 240;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, true).ID: return 241;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, false).ID: return 242;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, true).ID: return 243;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, false).ID: return 244;\n\t\t\tcase DragonEgg::DragonEgg().ID: return 4635;\n\t\t\tcase DragonHead::DragonHead(0).ID: return 5551;\n\t\t\tcase DragonHead::DragonHead(1).ID: return 5552;\n\t\t\tcase DragonHead::DragonHead(2).ID: return 5553;\n\t\t\tcase DragonHead::DragonHead(3).ID: return 5554;\n\t\t\tcase DragonHead::DragonHead(4).ID: return 5555;\n\t\t\tcase DragonHead::DragonHead(5).ID: return 5556;\n\t\t\tcase DragonHead::DragonHead(6).ID: return 5557;\n\t\t\tcase DragonHead::DragonHead(7).ID: return 5558;\n\t\t\tcase DragonHead::DragonHead(8).ID: return 5559;\n\t\t\tcase DragonHead::DragonHead(9).ID: return 5560;\n\t\t\tcase DragonHead::DragonHead(10).ID: return 5561;\n\t\t\tcase DragonHead::DragonHead(11).ID: return 5562;\n\t\t\tcase DragonHead::DragonHead(12).ID: return 5563;\n\t\t\tcase DragonHead::DragonHead(13).ID: return 5564;\n\t\t\tcase DragonHead::DragonHead(14).ID: return 5565;\n\t\t\tcase DragonHead::DragonHead(15).ID: return 5566;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 5547;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 5548;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 5549;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 5550;\n\t\t\tcase DriedKelpBlock::DriedKelpBlock().ID: return 8436;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, true).ID: return 5792;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, false).ID: return 5793;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, true).ID: return 5794;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, false).ID: return 5795;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, true).ID: return 5796;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, false).ID: return 5797;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, true).ID: return 5798;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, false).ID: return 5799;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, true).ID: return 5800;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, false).ID: return 5801;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, true).ID: return 5802;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, false).ID: return 5803;\n\t\t\tcase EmeraldBlock::EmeraldBlock().ID: return 4883;\n\t\t\tcase EmeraldOre::EmeraldOre().ID: return 4730;\n\t\t\tcase EnchantingTable::EnchantingTable().ID: return 4612;\n\t\t\tcase EndGateway::EndGateway().ID: return 8163;\n\t\t\tcase EndPortal::EndPortal().ID: return 4625;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZM).ID: return 4626;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZP).ID: return 4627;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XM).ID: return 4628;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XP).ID: return 4629;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZM).ID: return 4630;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZP).ID: return 4631;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XM).ID: return 4632;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XP).ID: return 4633;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZM).ID: return 7997;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XP).ID: return 7998;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZP).ID: return 7999;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XM).ID: return 8000;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YP).ID: return 8001;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YM).ID: return 8002;\n\t\t\tcase EndStone::EndStone().ID: return 4634;\n\t\t\tcase EndStoneBricks::EndStoneBricks().ID: return 8157;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZM).ID: return 4732;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZP).ID: return 4734;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XM).ID: return 4736;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XP).ID: return 4738;\n\t\t\tcase Farmland::Farmland(0).ID: return 3059;\n\t\t\tcase Farmland::Farmland(1).ID: return 3060;\n\t\t\tcase Farmland::Farmland(2).ID: return 3061;\n\t\t\tcase Farmland::Farmland(3).ID: return 3062;\n\t\t\tcase Farmland::Farmland(4).ID: return 3063;\n\t\t\tcase Farmland::Farmland(5).ID: return 3064;\n\t\t\tcase Farmland::Farmland(6).ID: return 3065;\n\t\t\tcase Farmland::Farmland(7).ID: return 3066;\n\t\t\tcase Fern::Fern().ID: return 1042;\n\t\t\tcase Fire::Fire(0, true, true, true, true, true).ID: return 1135;\n\t\t\tcase Fire::Fire(0, true, true, true, true, false).ID: return 1136;\n\t\t\tcase Fire::Fire(0, true, true, true, false, true).ID: return 1137;\n\t\t\tcase Fire::Fire(0, true, true, true, false, false).ID: return 1138;\n\t\t\tcase Fire::Fire(0, true, true, false, true, true).ID: return 1139;\n\t\t\tcase Fire::Fire(0, true, true, false, true, false).ID: return 1140;\n\t\t\tcase Fire::Fire(0, true, true, false, false, true).ID: return 1141;\n\t\t\tcase Fire::Fire(0, true, true, false, false, false).ID: return 1142;\n\t\t\tcase Fire::Fire(0, true, false, true, true, true).ID: return 1143;\n\t\t\tcase Fire::Fire(0, true, false, true, true, false).ID: return 1144;\n\t\t\tcase Fire::Fire(0, true, false, true, false, true).ID: return 1145;\n\t\t\tcase Fire::Fire(0, true, false, true, false, false).ID: return 1146;\n\t\t\tcase Fire::Fire(0, true, false, false, true, true).ID: return 1147;\n\t\t\tcase Fire::Fire(0, true, false, false, true, false).ID: return 1148;\n\t\t\tcase Fire::Fire(0, true, false, false, false, true).ID: return 1149;\n\t\t\tcase Fire::Fire(0, true, false, false, false, false).ID: return 1150;\n\t\t\tcase Fire::Fire(0, false, true, true, true, true).ID: return 1151;\n\t\t\tcase Fire::Fire(0, false, true, true, true, false).ID: return 1152;\n\t\t\tcase Fire::Fire(0, false, true, true, false, true).ID: return 1153;\n\t\t\tcase Fire::Fire(0, false, true, true, false, false).ID: return 1154;\n\t\t\tcase Fire::Fire(0, false, true, false, true, true).ID: return 1155;\n\t\t\tcase Fire::Fire(0, false, true, false, true, false).ID: return 1156;\n\t\t\tcase Fire::Fire(0, false, true, false, false, true).ID: return 1157;\n\t\t\tcase Fire::Fire(0, false, true, false, false, false).ID: return 1158;\n\t\t\tcase Fire::Fire(0, false, false, true, true, true).ID: return 1159;\n\t\t\tcase Fire::Fire(0, false, false, true, true, false).ID: return 1160;\n\t\t\tcase Fire::Fire(0, false, false, true, false, true).ID: return 1161;\n\t\t\tcase Fire::Fire(0, false, false, true, false, false).ID: return 1162;\n\t\t\tcase Fire::Fire(0, false, false, false, true, true).ID: return 1163;\n\t\t\tcase Fire::Fire(0, false, false, false, true, false).ID: return 1164;\n\t\t\tcase Fire::Fire(0, false, false, false, false, true).ID: return 1165;\n\t\t\tcase Fire::Fire(0, false, false, false, false, false).ID: return 1166;\n\t\t\tcase Fire::Fire(1, true, true, true, true, true).ID: return 1167;\n\t\t\tcase Fire::Fire(1, true, true, true, true, false).ID: return 1168;\n\t\t\tcase Fire::Fire(1, true, true, true, false, true).ID: return 1169;\n\t\t\tcase Fire::Fire(1, true, true, true, false, false).ID: return 1170;\n\t\t\tcase Fire::Fire(1, true, true, false, true, true).ID: return 1171;\n\t\t\tcase Fire::Fire(1, true, true, false, true, false).ID: return 1172;\n\t\t\tcase Fire::Fire(1, true, true, false, false, true).ID: return 1173;\n\t\t\tcase Fire::Fire(1, true, true, false, false, false).ID: return 1174;\n\t\t\tcase Fire::Fire(1, true, false, true, true, true).ID: return 1175;\n\t\t\tcase Fire::Fire(1, true, false, true, true, false).ID: return 1176;\n\t\t\tcase Fire::Fire(1, true, false, true, false, true).ID: return 1177;\n\t\t\tcase Fire::Fire(1, true, false, true, false, false).ID: return 1178;\n\t\t\tcase Fire::Fire(1, true, false, false, true, true).ID: return 1179;\n\t\t\tcase Fire::Fire(1, true, false, false, true, false).ID: return 1180;\n\t\t\tcase Fire::Fire(1, true, false, false, false, true).ID: return 1181;\n\t\t\tcase Fire::Fire(1, true, false, false, false, false).ID: return 1182;\n\t\t\tcase Fire::Fire(1, false, true, true, true, true).ID: return 1183;\n\t\t\tcase Fire::Fire(1, false, true, true, true, false).ID: return 1184;\n\t\t\tcase Fire::Fire(1, false, true, true, false, true).ID: return 1185;\n\t\t\tcase Fire::Fire(1, false, true, true, false, false).ID: return 1186;\n\t\t\tcase Fire::Fire(1, false, true, false, true, true).ID: return 1187;\n\t\t\tcase Fire::Fire(1, false, true, false, true, false).ID: return 1188;\n\t\t\tcase Fire::Fire(1, false, true, false, false, true).ID: return 1189;\n\t\t\tcase Fire::Fire(1, false, true, false, false, false).ID: return 1190;\n\t\t\tcase Fire::Fire(1, false, false, true, true, true).ID: return 1191;\n\t\t\tcase Fire::Fire(1, false, false, true, true, false).ID: return 1192;\n\t\t\tcase Fire::Fire(1, false, false, true, false, true).ID: return 1193;\n\t\t\tcase Fire::Fire(1, false, false, true, false, false).ID: return 1194;\n\t\t\tcase Fire::Fire(1, false, false, false, true, true).ID: return 1195;\n\t\t\tcase Fire::Fire(1, false, false, false, true, false).ID: return 1196;\n\t\t\tcase Fire::Fire(1, false, false, false, false, true).ID: return 1197;\n\t\t\tcase Fire::Fire(1, false, false, false, false, false).ID: return 1198;\n\t\t\tcase Fire::Fire(2, true, true, true, true, true).ID: return 1199;\n\t\t\tcase Fire::Fire(2, true, true, true, true, false).ID: return 1200;\n\t\t\tcase Fire::Fire(2, true, true, true, false, true).ID: return 1201;\n\t\t\tcase Fire::Fire(2, true, true, true, false, false).ID: return 1202;\n\t\t\tcase Fire::Fire(2, true, true, false, true, true).ID: return 1203;\n\t\t\tcase Fire::Fire(2, true, true, false, true, false).ID: return 1204;\n\t\t\tcase Fire::Fire(2, true, true, false, false, true).ID: return 1205;\n\t\t\tcase Fire::Fire(2, true, true, false, false, false).ID: return 1206;\n\t\t\tcase Fire::Fire(2, true, false, true, true, true).ID: return 1207;\n\t\t\tcase Fire::Fire(2, true, false, true, true, false).ID: return 1208;\n\t\t\tcase Fire::Fire(2, true, false, true, false, true).ID: return 1209;\n\t\t\tcase Fire::Fire(2, true, false, true, false, false).ID: return 1210;\n\t\t\tcase Fire::Fire(2, true, false, false, true, true).ID: return 1211;\n\t\t\tcase Fire::Fire(2, true, false, false, true, false).ID: return 1212;\n\t\t\tcase Fire::Fire(2, true, false, false, false, true).ID: return 1213;\n\t\t\tcase Fire::Fire(2, true, false, false, false, false).ID: return 1214;\n\t\t\tcase Fire::Fire(2, false, true, true, true, true).ID: return 1215;\n\t\t\tcase Fire::Fire(2, false, true, true, true, false).ID: return 1216;\n\t\t\tcase Fire::Fire(2, false, true, true, false, true).ID: return 1217;\n\t\t\tcase Fire::Fire(2, false, true, true, false, false).ID: return 1218;\n\t\t\tcase Fire::Fire(2, false, true, false, true, true).ID: return 1219;\n\t\t\tcase Fire::Fire(2, false, true, false, true, false).ID: return 1220;\n\t\t\tcase Fire::Fire(2, false, true, false, false, true).ID: return 1221;\n\t\t\tcase Fire::Fire(2, false, true, false, false, false).ID: return 1222;\n\t\t\tcase Fire::Fire(2, false, false, true, true, true).ID: return 1223;\n\t\t\tcase Fire::Fire(2, false, false, true, true, false).ID: return 1224;\n\t\t\tcase Fire::Fire(2, false, false, true, false, true).ID: return 1225;\n\t\t\tcase Fire::Fire(2, false, false, true, false, false).ID: return 1226;\n\t\t\tcase Fire::Fire(2, false, false, false, true, true).ID: return 1227;\n\t\t\tcase Fire::Fire(2, false, false, false, true, false).ID: return 1228;\n\t\t\tcase Fire::Fire(2, false, false, false, false, true).ID: return 1229;\n\t\t\tcase Fire::Fire(2, false, false, false, false, false).ID: return 1230;\n\t\t\tcase Fire::Fire(3, true, true, true, true, true).ID: return 1231;\n\t\t\tcase Fire::Fire(3, true, true, true, true, false).ID: return 1232;\n\t\t\tcase Fire::Fire(3, true, true, true, false, true).ID: return 1233;\n\t\t\tcase Fire::Fire(3, true, true, true, false, false).ID: return 1234;\n\t\t\tcase Fire::Fire(3, true, true, false, true, true).ID: return 1235;\n\t\t\tcase Fire::Fire(3, true, true, false, true, false).ID: return 1236;\n\t\t\tcase Fire::Fire(3, true, true, false, false, true).ID: return 1237;\n\t\t\tcase Fire::Fire(3, true, true, false, false, false).ID: return 1238;\n\t\t\tcase Fire::Fire(3, true, false, true, true, true).ID: return 1239;\n\t\t\tcase Fire::Fire(3, true, false, true, true, false).ID: return 1240;\n\t\t\tcase Fire::Fire(3, true, false, true, false, true).ID: return 1241;\n\t\t\tcase Fire::Fire(3, true, false, true, false, false).ID: return 1242;\n\t\t\tcase Fire::Fire(3, true, false, false, true, true).ID: return 1243;\n\t\t\tcase Fire::Fire(3, true, false, false, true, false).ID: return 1244;\n\t\t\tcase Fire::Fire(3, true, false, false, false, true).ID: return 1245;\n\t\t\tcase Fire::Fire(3, true, false, false, false, false).ID: return 1246;\n\t\t\tcase Fire::Fire(3, false, true, true, true, true).ID: return 1247;\n\t\t\tcase Fire::Fire(3, false, true, true, true, false).ID: return 1248;\n\t\t\tcase Fire::Fire(3, false, true, true, false, true).ID: return 1249;\n\t\t\tcase Fire::Fire(3, false, true, true, false, false).ID: return 1250;\n\t\t\tcase Fire::Fire(3, false, true, false, true, true).ID: return 1251;\n\t\t\tcase Fire::Fire(3, false, true, false, true, false).ID: return 1252;\n\t\t\tcase Fire::Fire(3, false, true, false, false, true).ID: return 1253;\n\t\t\tcase Fire::Fire(3, false, true, false, false, false).ID: return 1254;\n\t\t\tcase Fire::Fire(3, false, false, true, true, true).ID: return 1255;\n\t\t\tcase Fire::Fire(3, false, false, true, true, false).ID: return 1256;\n\t\t\tcase Fire::Fire(3, false, false, true, false, true).ID: return 1257;\n\t\t\tcase Fire::Fire(3, false, false, true, false, false).ID: return 1258;\n\t\t\tcase Fire::Fire(3, false, false, false, true, true).ID: return 1259;\n\t\t\tcase Fire::Fire(3, false, false, false, true, false).ID: return 1260;\n\t\t\tcase Fire::Fire(3, false, false, false, false, true).ID: return 1261;\n\t\t\tcase Fire::Fire(3, false, false, false, false, false).ID: return 1262;\n\t\t\tcase Fire::Fire(4, true, true, true, true, true).ID: return 1263;\n\t\t\tcase Fire::Fire(4, true, true, true, true, false).ID: return 1264;\n\t\t\tcase Fire::Fire(4, true, true, true, false, true).ID: return 1265;\n\t\t\tcase Fire::Fire(4, true, true, true, false, false).ID: return 1266;\n\t\t\tcase Fire::Fire(4, true, true, false, true, true).ID: return 1267;\n\t\t\tcase Fire::Fire(4, true, true, false, true, false).ID: return 1268;\n\t\t\tcase Fire::Fire(4, true, true, false, false, true).ID: return 1269;\n\t\t\tcase Fire::Fire(4, true, true, false, false, false).ID: return 1270;\n\t\t\tcase Fire::Fire(4, true, false, true, true, true).ID: return 1271;\n\t\t\tcase Fire::Fire(4, true, false, true, true, false).ID: return 1272;\n\t\t\tcase Fire::Fire(4, true, false, true, false, true).ID: return 1273;\n\t\t\tcase Fire::Fire(4, true, false, true, false, false).ID: return 1274;\n\t\t\tcase Fire::Fire(4, true, false, false, true, true).ID: return 1275;\n\t\t\tcase Fire::Fire(4, true, false, false, true, false).ID: return 1276;\n\t\t\tcase Fire::Fire(4, true, false, false, false, true).ID: return 1277;\n\t\t\tcase Fire::Fire(4, true, false, false, false, false).ID: return 1278;\n\t\t\tcase Fire::Fire(4, false, true, true, true, true).ID: return 1279;\n\t\t\tcase Fire::Fire(4, false, true, true, true, false).ID: return 1280;\n\t\t\tcase Fire::Fire(4, false, true, true, false, true).ID: return 1281;\n\t\t\tcase Fire::Fire(4, false, true, true, false, false).ID: return 1282;\n\t\t\tcase Fire::Fire(4, false, true, false, true, true).ID: return 1283;\n\t\t\tcase Fire::Fire(4, false, true, false, true, false).ID: return 1284;\n\t\t\tcase Fire::Fire(4, false, true, false, false, true).ID: return 1285;\n\t\t\tcase Fire::Fire(4, false, true, false, false, false).ID: return 1286;\n\t\t\tcase Fire::Fire(4, false, false, true, true, true).ID: return 1287;\n\t\t\tcase Fire::Fire(4, false, false, true, true, false).ID: return 1288;\n\t\t\tcase Fire::Fire(4, false, false, true, false, true).ID: return 1289;\n\t\t\tcase Fire::Fire(4, false, false, true, false, false).ID: return 1290;\n\t\t\tcase Fire::Fire(4, false, false, false, true, true).ID: return 1291;\n\t\t\tcase Fire::Fire(4, false, false, false, true, false).ID: return 1292;\n\t\t\tcase Fire::Fire(4, false, false, false, false, true).ID: return 1293;\n\t\t\tcase Fire::Fire(4, false, false, false, false, false).ID: return 1294;\n\t\t\tcase Fire::Fire(5, true, true, true, true, true).ID: return 1295;\n\t\t\tcase Fire::Fire(5, true, true, true, true, false).ID: return 1296;\n\t\t\tcase Fire::Fire(5, true, true, true, false, true).ID: return 1297;\n\t\t\tcase Fire::Fire(5, true, true, true, false, false).ID: return 1298;\n\t\t\tcase Fire::Fire(5, true, true, false, true, true).ID: return 1299;\n\t\t\tcase Fire::Fire(5, true, true, false, true, false).ID: return 1300;\n\t\t\tcase Fire::Fire(5, true, true, false, false, true).ID: return 1301;\n\t\t\tcase Fire::Fire(5, true, true, false, false, false).ID: return 1302;\n\t\t\tcase Fire::Fire(5, true, false, true, true, true).ID: return 1303;\n\t\t\tcase Fire::Fire(5, true, false, true, true, false).ID: return 1304;\n\t\t\tcase Fire::Fire(5, true, false, true, false, true).ID: return 1305;\n\t\t\tcase Fire::Fire(5, true, false, true, false, false).ID: return 1306;\n\t\t\tcase Fire::Fire(5, true, false, false, true, true).ID: return 1307;\n\t\t\tcase Fire::Fire(5, true, false, false, true, false).ID: return 1308;\n\t\t\tcase Fire::Fire(5, true, false, false, false, true).ID: return 1309;\n\t\t\tcase Fire::Fire(5, true, false, false, false, false).ID: return 1310;\n\t\t\tcase Fire::Fire(5, false, true, true, true, true).ID: return 1311;\n\t\t\tcase Fire::Fire(5, false, true, true, true, false).ID: return 1312;\n\t\t\tcase Fire::Fire(5, false, true, true, false, true).ID: return 1313;\n\t\t\tcase Fire::Fire(5, false, true, true, false, false).ID: return 1314;\n\t\t\tcase Fire::Fire(5, false, true, false, true, true).ID: return 1315;\n\t\t\tcase Fire::Fire(5, false, true, false, true, false).ID: return 1316;\n\t\t\tcase Fire::Fire(5, false, true, false, false, true).ID: return 1317;\n\t\t\tcase Fire::Fire(5, false, true, false, false, false).ID: return 1318;\n\t\t\tcase Fire::Fire(5, false, false, true, true, true).ID: return 1319;\n\t\t\tcase Fire::Fire(5, false, false, true, true, false).ID: return 1320;\n\t\t\tcase Fire::Fire(5, false, false, true, false, true).ID: return 1321;\n\t\t\tcase Fire::Fire(5, false, false, true, false, false).ID: return 1322;\n\t\t\tcase Fire::Fire(5, false, false, false, true, true).ID: return 1323;\n\t\t\tcase Fire::Fire(5, false, false, false, true, false).ID: return 1324;\n\t\t\tcase Fire::Fire(5, false, false, false, false, true).ID: return 1325;\n\t\t\tcase Fire::Fire(5, false, false, false, false, false).ID: return 1326;\n\t\t\tcase Fire::Fire(6, true, true, true, true, true).ID: return 1327;\n\t\t\tcase Fire::Fire(6, true, true, true, true, false).ID: return 1328;\n\t\t\tcase Fire::Fire(6, true, true, true, false, true).ID: return 1329;\n\t\t\tcase Fire::Fire(6, true, true, true, false, false).ID: return 1330;\n\t\t\tcase Fire::Fire(6, true, true, false, true, true).ID: return 1331;\n\t\t\tcase Fire::Fire(6, true, true, false, true, false).ID: return 1332;\n\t\t\tcase Fire::Fire(6, true, true, false, false, true).ID: return 1333;\n\t\t\tcase Fire::Fire(6, true, true, false, false, false).ID: return 1334;\n\t\t\tcase Fire::Fire(6, true, false, true, true, true).ID: return 1335;\n\t\t\tcase Fire::Fire(6, true, false, true, true, false).ID: return 1336;\n\t\t\tcase Fire::Fire(6, true, false, true, false, true).ID: return 1337;\n\t\t\tcase Fire::Fire(6, true, false, true, false, false).ID: return 1338;\n\t\t\tcase Fire::Fire(6, true, false, false, true, true).ID: return 1339;\n\t\t\tcase Fire::Fire(6, true, false, false, true, false).ID: return 1340;\n\t\t\tcase Fire::Fire(6, true, false, false, false, true).ID: return 1341;\n\t\t\tcase Fire::Fire(6, true, false, false, false, false).ID: return 1342;\n\t\t\tcase Fire::Fire(6, false, true, true, true, true).ID: return 1343;\n\t\t\tcase Fire::Fire(6, false, true, true, true, false).ID: return 1344;\n\t\t\tcase Fire::Fire(6, false, true, true, false, true).ID: return 1345;\n\t\t\tcase Fire::Fire(6, false, true, true, false, false).ID: return 1346;\n\t\t\tcase Fire::Fire(6, false, true, false, true, true).ID: return 1347;\n\t\t\tcase Fire::Fire(6, false, true, false, true, false).ID: return 1348;\n\t\t\tcase Fire::Fire(6, false, true, false, false, true).ID: return 1349;\n\t\t\tcase Fire::Fire(6, false, true, false, false, false).ID: return 1350;\n\t\t\tcase Fire::Fire(6, false, false, true, true, true).ID: return 1351;\n\t\t\tcase Fire::Fire(6, false, false, true, true, false).ID: return 1352;\n\t\t\tcase Fire::Fire(6, false, false, true, false, true).ID: return 1353;\n\t\t\tcase Fire::Fire(6, false, false, true, false, false).ID: return 1354;\n\t\t\tcase Fire::Fire(6, false, false, false, true, true).ID: return 1355;\n\t\t\tcase Fire::Fire(6, false, false, false, true, false).ID: return 1356;\n\t\t\tcase Fire::Fire(6, false, false, false, false, true).ID: return 1357;\n\t\t\tcase Fire::Fire(6, false, false, false, false, false).ID: return 1358;\n\t\t\tcase Fire::Fire(7, true, true, true, true, true).ID: return 1359;\n\t\t\tcase Fire::Fire(7, true, true, true, true, false).ID: return 1360;\n\t\t\tcase Fire::Fire(7, true, true, true, false, true).ID: return 1361;\n\t\t\tcase Fire::Fire(7, true, true, true, false, false).ID: return 1362;\n\t\t\tcase Fire::Fire(7, true, true, false, true, true).ID: return 1363;\n\t\t\tcase Fire::Fire(7, true, true, false, true, false).ID: return 1364;\n\t\t\tcase Fire::Fire(7, true, true, false, false, true).ID: return 1365;\n\t\t\tcase Fire::Fire(7, true, true, false, false, false).ID: return 1366;\n\t\t\tcase Fire::Fire(7, true, false, true, true, true).ID: return 1367;\n\t\t\tcase Fire::Fire(7, true, false, true, true, false).ID: return 1368;\n\t\t\tcase Fire::Fire(7, true, false, true, false, true).ID: return 1369;\n\t\t\tcase Fire::Fire(7, true, false, true, false, false).ID: return 1370;\n\t\t\tcase Fire::Fire(7, true, false, false, true, true).ID: return 1371;\n\t\t\tcase Fire::Fire(7, true, false, false, true, false).ID: return 1372;\n\t\t\tcase Fire::Fire(7, true, false, false, false, true).ID: return 1373;\n\t\t\tcase Fire::Fire(7, true, false, false, false, false).ID: return 1374;\n\t\t\tcase Fire::Fire(7, false, true, true, true, true).ID: return 1375;\n\t\t\tcase Fire::Fire(7, false, true, true, true, false).ID: return 1376;\n\t\t\tcase Fire::Fire(7, false, true, true, false, true).ID: return 1377;\n\t\t\tcase Fire::Fire(7, false, true, true, false, false).ID: return 1378;\n\t\t\tcase Fire::Fire(7, false, true, false, true, true).ID: return 1379;\n\t\t\tcase Fire::Fire(7, false, true, false, true, false).ID: return 1380;\n\t\t\tcase Fire::Fire(7, false, true, false, false, true).ID: return 1381;\n\t\t\tcase Fire::Fire(7, false, true, false, false, false).ID: return 1382;\n\t\t\tcase Fire::Fire(7, false, false, true, true, true).ID: return 1383;\n\t\t\tcase Fire::Fire(7, false, false, true, true, false).ID: return 1384;\n\t\t\tcase Fire::Fire(7, false, false, true, false, true).ID: return 1385;\n\t\t\tcase Fire::Fire(7, false, false, true, false, false).ID: return 1386;\n\t\t\tcase Fire::Fire(7, false, false, false, true, true).ID: return 1387;\n\t\t\tcase Fire::Fire(7, false, false, false, true, false).ID: return 1388;\n\t\t\tcase Fire::Fire(7, false, false, false, false, true).ID: return 1389;\n\t\t\tcase Fire::Fire(7, false, false, false, false, false).ID: return 1390;\n\t\t\tcase Fire::Fire(8, true, true, true, true, true).ID: return 1391;\n\t\t\tcase Fire::Fire(8, true, true, true, true, false).ID: return 1392;\n\t\t\tcase Fire::Fire(8, true, true, true, false, true).ID: return 1393;\n\t\t\tcase Fire::Fire(8, true, true, true, false, false).ID: return 1394;\n\t\t\tcase Fire::Fire(8, true, true, false, true, true).ID: return 1395;\n\t\t\tcase Fire::Fire(8, true, true, false, true, false).ID: return 1396;\n\t\t\tcase Fire::Fire(8, true, true, false, false, true).ID: return 1397;\n\t\t\tcase Fire::Fire(8, true, true, false, false, false).ID: return 1398;\n\t\t\tcase Fire::Fire(8, true, false, true, true, true).ID: return 1399;\n\t\t\tcase Fire::Fire(8, true, false, true, true, false).ID: return 1400;\n\t\t\tcase Fire::Fire(8, true, false, true, false, true).ID: return 1401;\n\t\t\tcase Fire::Fire(8, true, false, true, false, false).ID: return 1402;\n\t\t\tcase Fire::Fire(8, true, false, false, true, true).ID: return 1403;\n\t\t\tcase Fire::Fire(8, true, false, false, true, false).ID: return 1404;\n\t\t\tcase Fire::Fire(8, true, false, false, false, true).ID: return 1405;\n\t\t\tcase Fire::Fire(8, true, false, false, false, false).ID: return 1406;\n\t\t\tcase Fire::Fire(8, false, true, true, true, true).ID: return 1407;\n\t\t\tcase Fire::Fire(8, false, true, true, true, false).ID: return 1408;\n\t\t\tcase Fire::Fire(8, false, true, true, false, true).ID: return 1409;\n\t\t\tcase Fire::Fire(8, false, true, true, false, false).ID: return 1410;\n\t\t\tcase Fire::Fire(8, false, true, false, true, true).ID: return 1411;\n\t\t\tcase Fire::Fire(8, false, true, false, true, false).ID: return 1412;\n\t\t\tcase Fire::Fire(8, false, true, false, false, true).ID: return 1413;\n\t\t\tcase Fire::Fire(8, false, true, false, false, false).ID: return 1414;\n\t\t\tcase Fire::Fire(8, false, false, true, true, true).ID: return 1415;\n\t\t\tcase Fire::Fire(8, false, false, true, true, false).ID: return 1416;\n\t\t\tcase Fire::Fire(8, false, false, true, false, true).ID: return 1417;\n\t\t\tcase Fire::Fire(8, false, false, true, false, false).ID: return 1418;\n\t\t\tcase Fire::Fire(8, false, false, false, true, true).ID: return 1419;\n\t\t\tcase Fire::Fire(8, false, false, false, true, false).ID: return 1420;\n\t\t\tcase Fire::Fire(8, false, false, false, false, true).ID: return 1421;\n\t\t\tcase Fire::Fire(8, false, false, false, false, false).ID: return 1422;\n\t\t\tcase Fire::Fire(9, true, true, true, true, true).ID: return 1423;\n\t\t\tcase Fire::Fire(9, true, true, true, true, false).ID: return 1424;\n\t\t\tcase Fire::Fire(9, true, true, true, false, true).ID: return 1425;\n\t\t\tcase Fire::Fire(9, true, true, true, false, false).ID: return 1426;\n\t\t\tcase Fire::Fire(9, true, true, false, true, true).ID: return 1427;\n\t\t\tcase Fire::Fire(9, true, true, false, true, false).ID: return 1428;\n\t\t\tcase Fire::Fire(9, true, true, false, false, true).ID: return 1429;\n\t\t\tcase Fire::Fire(9, true, true, false, false, false).ID: return 1430;\n\t\t\tcase Fire::Fire(9, true, false, true, true, true).ID: return 1431;\n\t\t\tcase Fire::Fire(9, true, false, true, true, false).ID: return 1432;\n\t\t\tcase Fire::Fire(9, true, false, true, false, true).ID: return 1433;\n\t\t\tcase Fire::Fire(9, true, false, true, false, false).ID: return 1434;\n\t\t\tcase Fire::Fire(9, true, false, false, true, true).ID: return 1435;\n\t\t\tcase Fire::Fire(9, true, false, false, true, false).ID: return 1436;\n\t\t\tcase Fire::Fire(9, true, false, false, false, true).ID: return 1437;\n\t\t\tcase Fire::Fire(9, true, false, false, false, false).ID: return 1438;\n\t\t\tcase Fire::Fire(9, false, true, true, true, true).ID: return 1439;\n\t\t\tcase Fire::Fire(9, false, true, true, true, false).ID: return 1440;\n\t\t\tcase Fire::Fire(9, false, true, true, false, true).ID: return 1441;\n\t\t\tcase Fire::Fire(9, false, true, true, false, false).ID: return 1442;\n\t\t\tcase Fire::Fire(9, false, true, false, true, true).ID: return 1443;\n\t\t\tcase Fire::Fire(9, false, true, false, true, false).ID: return 1444;\n\t\t\tcase Fire::Fire(9, false, true, false, false, true).ID: return 1445;\n\t\t\tcase Fire::Fire(9, false, true, false, false, false).ID: return 1446;\n\t\t\tcase Fire::Fire(9, false, false, true, true, true).ID: return 1447;\n\t\t\tcase Fire::Fire(9, false, false, true, true, false).ID: return 1448;\n\t\t\tcase Fire::Fire(9, false, false, true, false, true).ID: return 1449;\n\t\t\tcase Fire::Fire(9, false, false, true, false, false).ID: return 1450;\n\t\t\tcase Fire::Fire(9, false, false, false, true, true).ID: return 1451;\n\t\t\tcase Fire::Fire(9, false, false, false, true, false).ID: return 1452;\n\t\t\tcase Fire::Fire(9, false, false, false, false, true).ID: return 1453;\n\t\t\tcase Fire::Fire(9, false, false, false, false, false).ID: return 1454;\n\t\t\tcase Fire::Fire(10, true, true, true, true, true).ID: return 1455;\n\t\t\tcase Fire::Fire(10, true, true, true, true, false).ID: return 1456;\n\t\t\tcase Fire::Fire(10, true, true, true, false, true).ID: return 1457;\n\t\t\tcase Fire::Fire(10, true, true, true, false, false).ID: return 1458;\n\t\t\tcase Fire::Fire(10, true, true, false, true, true).ID: return 1459;\n\t\t\tcase Fire::Fire(10, true, true, false, true, false).ID: return 1460;\n\t\t\tcase Fire::Fire(10, true, true, false, false, true).ID: return 1461;\n\t\t\tcase Fire::Fire(10, true, true, false, false, false).ID: return 1462;\n\t\t\tcase Fire::Fire(10, true, false, true, true, true).ID: return 1463;\n\t\t\tcase Fire::Fire(10, true, false, true, true, false).ID: return 1464;\n\t\t\tcase Fire::Fire(10, true, false, true, false, true).ID: return 1465;\n\t\t\tcase Fire::Fire(10, true, false, true, false, false).ID: return 1466;\n\t\t\tcase Fire::Fire(10, true, false, false, true, true).ID: return 1467;\n\t\t\tcase Fire::Fire(10, true, false, false, true, false).ID: return 1468;\n\t\t\tcase Fire::Fire(10, true, false, false, false, true).ID: return 1469;\n\t\t\tcase Fire::Fire(10, true, false, false, false, false).ID: return 1470;\n\t\t\tcase Fire::Fire(10, false, true, true, true, true).ID: return 1471;\n\t\t\tcase Fire::Fire(10, false, true, true, true, false).ID: return 1472;\n\t\t\tcase Fire::Fire(10, false, true, true, false, true).ID: return 1473;\n\t\t\tcase Fire::Fire(10, false, true, true, false, false).ID: return 1474;\n\t\t\tcase Fire::Fire(10, false, true, false, true, true).ID: return 1475;\n\t\t\tcase Fire::Fire(10, false, true, false, true, false).ID: return 1476;\n\t\t\tcase Fire::Fire(10, false, true, false, false, true).ID: return 1477;\n\t\t\tcase Fire::Fire(10, false, true, false, false, false).ID: return 1478;\n\t\t\tcase Fire::Fire(10, false, false, true, true, true).ID: return 1479;\n\t\t\tcase Fire::Fire(10, false, false, true, true, false).ID: return 1480;\n\t\t\tcase Fire::Fire(10, false, false, true, false, true).ID: return 1481;\n\t\t\tcase Fire::Fire(10, false, false, true, false, false).ID: return 1482;\n\t\t\tcase Fire::Fire(10, false, false, false, true, true).ID: return 1483;\n\t\t\tcase Fire::Fire(10, false, false, false, true, false).ID: return 1484;\n\t\t\tcase Fire::Fire(10, false, false, false, false, true).ID: return 1485;\n\t\t\tcase Fire::Fire(10, false, false, false, false, false).ID: return 1486;\n\t\t\tcase Fire::Fire(11, true, true, true, true, true).ID: return 1487;\n\t\t\tcase Fire::Fire(11, true, true, true, true, false).ID: return 1488;\n\t\t\tcase Fire::Fire(11, true, true, true, false, true).ID: return 1489;\n\t\t\tcase Fire::Fire(11, true, true, true, false, false).ID: return 1490;\n\t\t\tcase Fire::Fire(11, true, true, false, true, true).ID: return 1491;\n\t\t\tcase Fire::Fire(11, true, true, false, true, false).ID: return 1492;\n\t\t\tcase Fire::Fire(11, true, true, false, false, true).ID: return 1493;\n\t\t\tcase Fire::Fire(11, true, true, false, false, false).ID: return 1494;\n\t\t\tcase Fire::Fire(11, true, false, true, true, true).ID: return 1495;\n\t\t\tcase Fire::Fire(11, true, false, true, true, false).ID: return 1496;\n\t\t\tcase Fire::Fire(11, true, false, true, false, true).ID: return 1497;\n\t\t\tcase Fire::Fire(11, true, false, true, false, false).ID: return 1498;\n\t\t\tcase Fire::Fire(11, true, false, false, true, true).ID: return 1499;\n\t\t\tcase Fire::Fire(11, true, false, false, true, false).ID: return 1500;\n\t\t\tcase Fire::Fire(11, true, false, false, false, true).ID: return 1501;\n\t\t\tcase Fire::Fire(11, true, false, false, false, false).ID: return 1502;\n\t\t\tcase Fire::Fire(11, false, true, true, true, true).ID: return 1503;\n\t\t\tcase Fire::Fire(11, false, true, true, true, false).ID: return 1504;\n\t\t\tcase Fire::Fire(11, false, true, true, false, true).ID: return 1505;\n\t\t\tcase Fire::Fire(11, false, true, true, false, false).ID: return 1506;\n\t\t\tcase Fire::Fire(11, false, true, false, true, true).ID: return 1507;\n\t\t\tcase Fire::Fire(11, false, true, false, true, false).ID: return 1508;\n\t\t\tcase Fire::Fire(11, false, true, false, false, true).ID: return 1509;\n\t\t\tcase Fire::Fire(11, false, true, false, false, false).ID: return 1510;\n\t\t\tcase Fire::Fire(11, false, false, true, true, true).ID: return 1511;\n\t\t\tcase Fire::Fire(11, false, false, true, true, false).ID: return 1512;\n\t\t\tcase Fire::Fire(11, false, false, true, false, true).ID: return 1513;\n\t\t\tcase Fire::Fire(11, false, false, true, false, false).ID: return 1514;\n\t\t\tcase Fire::Fire(11, false, false, false, true, true).ID: return 1515;\n\t\t\tcase Fire::Fire(11, false, false, false, true, false).ID: return 1516;\n\t\t\tcase Fire::Fire(11, false, false, false, false, true).ID: return 1517;\n\t\t\tcase Fire::Fire(11, false, false, false, false, false).ID: return 1518;\n\t\t\tcase Fire::Fire(12, true, true, true, true, true).ID: return 1519;\n\t\t\tcase Fire::Fire(12, true, true, true, true, false).ID: return 1520;\n\t\t\tcase Fire::Fire(12, true, true, true, false, true).ID: return 1521;\n\t\t\tcase Fire::Fire(12, true, true, true, false, false).ID: return 1522;\n\t\t\tcase Fire::Fire(12, true, true, false, true, true).ID: return 1523;\n\t\t\tcase Fire::Fire(12, true, true, false, true, false).ID: return 1524;\n\t\t\tcase Fire::Fire(12, true, true, false, false, true).ID: return 1525;\n\t\t\tcase Fire::Fire(12, true, true, false, false, false).ID: return 1526;\n\t\t\tcase Fire::Fire(12, true, false, true, true, true).ID: return 1527;\n\t\t\tcase Fire::Fire(12, true, false, true, true, false).ID: return 1528;\n\t\t\tcase Fire::Fire(12, true, false, true, false, true).ID: return 1529;\n\t\t\tcase Fire::Fire(12, true, false, true, false, false).ID: return 1530;\n\t\t\tcase Fire::Fire(12, true, false, false, true, true).ID: return 1531;\n\t\t\tcase Fire::Fire(12, true, false, false, true, false).ID: return 1532;\n\t\t\tcase Fire::Fire(12, true, false, false, false, true).ID: return 1533;\n\t\t\tcase Fire::Fire(12, true, false, false, false, false).ID: return 1534;\n\t\t\tcase Fire::Fire(12, false, true, true, true, true).ID: return 1535;\n\t\t\tcase Fire::Fire(12, false, true, true, true, false).ID: return 1536;\n\t\t\tcase Fire::Fire(12, false, true, true, false, true).ID: return 1537;\n\t\t\tcase Fire::Fire(12, false, true, true, false, false).ID: return 1538;\n\t\t\tcase Fire::Fire(12, false, true, false, true, true).ID: return 1539;\n\t\t\tcase Fire::Fire(12, false, true, false, true, false).ID: return 1540;\n\t\t\tcase Fire::Fire(12, false, true, false, false, true).ID: return 1541;\n\t\t\tcase Fire::Fire(12, false, true, false, false, false).ID: return 1542;\n\t\t\tcase Fire::Fire(12, false, false, true, true, true).ID: return 1543;\n\t\t\tcase Fire::Fire(12, false, false, true, true, false).ID: return 1544;\n\t\t\tcase Fire::Fire(12, false, false, true, false, true).ID: return 1545;\n\t\t\tcase Fire::Fire(12, false, false, true, false, false).ID: return 1546;\n\t\t\tcase Fire::Fire(12, false, false, false, true, true).ID: return 1547;\n\t\t\tcase Fire::Fire(12, false, false, false, true, false).ID: return 1548;\n\t\t\tcase Fire::Fire(12, false, false, false, false, true).ID: return 1549;\n\t\t\tcase Fire::Fire(12, false, false, false, false, false).ID: return 1550;\n\t\t\tcase Fire::Fire(13, true, true, true, true, true).ID: return 1551;\n\t\t\tcase Fire::Fire(13, true, true, true, true, false).ID: return 1552;\n\t\t\tcase Fire::Fire(13, true, true, true, false, true).ID: return 1553;\n\t\t\tcase Fire::Fire(13, true, true, true, false, false).ID: return 1554;\n\t\t\tcase Fire::Fire(13, true, true, false, true, true).ID: return 1555;\n\t\t\tcase Fire::Fire(13, true, true, false, true, false).ID: return 1556;\n\t\t\tcase Fire::Fire(13, true, true, false, false, true).ID: return 1557;\n\t\t\tcase Fire::Fire(13, true, true, false, false, false).ID: return 1558;\n\t\t\tcase Fire::Fire(13, true, false, true, true, true).ID: return 1559;\n\t\t\tcase Fire::Fire(13, true, false, true, true, false).ID: return 1560;\n\t\t\tcase Fire::Fire(13, true, false, true, false, true).ID: return 1561;\n\t\t\tcase Fire::Fire(13, true, false, true, false, false).ID: return 1562;\n\t\t\tcase Fire::Fire(13, true, false, false, true, true).ID: return 1563;\n\t\t\tcase Fire::Fire(13, true, false, false, true, false).ID: return 1564;\n\t\t\tcase Fire::Fire(13, true, false, false, false, true).ID: return 1565;\n\t\t\tcase Fire::Fire(13, true, false, false, false, false).ID: return 1566;\n\t\t\tcase Fire::Fire(13, false, true, true, true, true).ID: return 1567;\n\t\t\tcase Fire::Fire(13, false, true, true, true, false).ID: return 1568;\n\t\t\tcase Fire::Fire(13, false, true, true, false, true).ID: return 1569;\n\t\t\tcase Fire::Fire(13, false, true, true, false, false).ID: return 1570;\n\t\t\tcase Fire::Fire(13, false, true, false, true, true).ID: return 1571;\n\t\t\tcase Fire::Fire(13, false, true, false, true, false).ID: return 1572;\n\t\t\tcase Fire::Fire(13, false, true, false, false, true).ID: return 1573;\n\t\t\tcase Fire::Fire(13, false, true, false, false, false).ID: return 1574;\n\t\t\tcase Fire::Fire(13, false, false, true, true, true).ID: return 1575;\n\t\t\tcase Fire::Fire(13, false, false, true, true, false).ID: return 1576;\n\t\t\tcase Fire::Fire(13, false, false, true, false, true).ID: return 1577;\n\t\t\tcase Fire::Fire(13, false, false, true, false, false).ID: return 1578;\n\t\t\tcase Fire::Fire(13, false, false, false, true, true).ID: return 1579;\n\t\t\tcase Fire::Fire(13, false, false, false, true, false).ID: return 1580;\n\t\t\tcase Fire::Fire(13, false, false, false, false, true).ID: return 1581;\n\t\t\tcase Fire::Fire(13, false, false, false, false, false).ID: return 1582;\n\t\t\tcase Fire::Fire(14, true, true, true, true, true).ID: return 1583;\n\t\t\tcase Fire::Fire(14, true, true, true, true, false).ID: return 1584;\n\t\t\tcase Fire::Fire(14, true, true, true, false, true).ID: return 1585;\n\t\t\tcase Fire::Fire(14, true, true, true, false, false).ID: return 1586;\n\t\t\tcase Fire::Fire(14, true, true, false, true, true).ID: return 1587;\n\t\t\tcase Fire::Fire(14, true, true, false, true, false).ID: return 1588;\n\t\t\tcase Fire::Fire(14, true, true, false, false, true).ID: return 1589;\n\t\t\tcase Fire::Fire(14, true, true, false, false, false).ID: return 1590;\n\t\t\tcase Fire::Fire(14, true, false, true, true, true).ID: return 1591;\n\t\t\tcase Fire::Fire(14, true, false, true, true, false).ID: return 1592;\n\t\t\tcase Fire::Fire(14, true, false, true, false, true).ID: return 1593;\n\t\t\tcase Fire::Fire(14, true, false, true, false, false).ID: return 1594;\n\t\t\tcase Fire::Fire(14, true, false, false, true, true).ID: return 1595;\n\t\t\tcase Fire::Fire(14, true, false, false, true, false).ID: return 1596;\n\t\t\tcase Fire::Fire(14, true, false, false, false, true).ID: return 1597;\n\t\t\tcase Fire::Fire(14, true, false, false, false, false).ID: return 1598;\n\t\t\tcase Fire::Fire(14, false, true, true, true, true).ID: return 1599;\n\t\t\tcase Fire::Fire(14, false, true, true, true, false).ID: return 1600;\n\t\t\tcase Fire::Fire(14, false, true, true, false, true).ID: return 1601;\n\t\t\tcase Fire::Fire(14, false, true, true, false, false).ID: return 1602;\n\t\t\tcase Fire::Fire(14, false, true, false, true, true).ID: return 1603;\n\t\t\tcase Fire::Fire(14, false, true, false, true, false).ID: return 1604;\n\t\t\tcase Fire::Fire(14, false, true, false, false, true).ID: return 1605;\n\t\t\tcase Fire::Fire(14, false, true, false, false, false).ID: return 1606;\n\t\t\tcase Fire::Fire(14, false, false, true, true, true).ID: return 1607;\n\t\t\tcase Fire::Fire(14, false, false, true, true, false).ID: return 1608;\n\t\t\tcase Fire::Fire(14, false, false, true, false, true).ID: return 1609;\n\t\t\tcase Fire::Fire(14, false, false, true, false, false).ID: return 1610;\n\t\t\tcase Fire::Fire(14, false, false, false, true, true).ID: return 1611;\n\t\t\tcase Fire::Fire(14, false, false, false, true, false).ID: return 1612;\n\t\t\tcase Fire::Fire(14, false, false, false, false, true).ID: return 1613;\n\t\t\tcase Fire::Fire(14, false, false, false, false, false).ID: return 1614;\n\t\t\tcase Fire::Fire(15, true, true, true, true, true).ID: return 1615;\n\t\t\tcase Fire::Fire(15, true, true, true, true, false).ID: return 1616;\n\t\t\tcase Fire::Fire(15, true, true, true, false, true).ID: return 1617;\n\t\t\tcase Fire::Fire(15, true, true, true, false, false).ID: return 1618;\n\t\t\tcase Fire::Fire(15, true, true, false, true, true).ID: return 1619;\n\t\t\tcase Fire::Fire(15, true, true, false, true, false).ID: return 1620;\n\t\t\tcase Fire::Fire(15, true, true, false, false, true).ID: return 1621;\n\t\t\tcase Fire::Fire(15, true, true, false, false, false).ID: return 1622;\n\t\t\tcase Fire::Fire(15, true, false, true, true, true).ID: return 1623;\n\t\t\tcase Fire::Fire(15, true, false, true, true, false).ID: return 1624;\n\t\t\tcase Fire::Fire(15, true, false, true, false, true).ID: return 1625;\n\t\t\tcase Fire::Fire(15, true, false, true, false, false).ID: return 1626;\n\t\t\tcase Fire::Fire(15, true, false, false, true, true).ID: return 1627;\n\t\t\tcase Fire::Fire(15, true, false, false, true, false).ID: return 1628;\n\t\t\tcase Fire::Fire(15, true, false, false, false, true).ID: return 1629;\n\t\t\tcase Fire::Fire(15, true, false, false, false, false).ID: return 1630;\n\t\t\tcase Fire::Fire(15, false, true, true, true, true).ID: return 1631;\n\t\t\tcase Fire::Fire(15, false, true, true, true, false).ID: return 1632;\n\t\t\tcase Fire::Fire(15, false, true, true, false, true).ID: return 1633;\n\t\t\tcase Fire::Fire(15, false, true, true, false, false).ID: return 1634;\n\t\t\tcase Fire::Fire(15, false, true, false, true, true).ID: return 1635;\n\t\t\tcase Fire::Fire(15, false, true, false, true, false).ID: return 1636;\n\t\t\tcase Fire::Fire(15, false, true, false, false, true).ID: return 1637;\n\t\t\tcase Fire::Fire(15, false, true, false, false, false).ID: return 1638;\n\t\t\tcase Fire::Fire(15, false, false, true, true, true).ID: return 1639;\n\t\t\tcase Fire::Fire(15, false, false, true, true, false).ID: return 1640;\n\t\t\tcase Fire::Fire(15, false, false, true, false, true).ID: return 1641;\n\t\t\tcase Fire::Fire(15, false, false, true, false, false).ID: return 1642;\n\t\t\tcase Fire::Fire(15, false, false, false, true, true).ID: return 1643;\n\t\t\tcase Fire::Fire(15, false, false, false, true, false).ID: return 1644;\n\t\t\tcase Fire::Fire(15, false, false, false, false, true).ID: return 1645;\n\t\t\tcase Fire::Fire(15, false, false, false, false, false).ID: return 1646;\n\t\t\tcase FireCoral::FireCoral().ID: return 8462;\n\t\t\tcase FireCoralBlock::FireCoralBlock().ID: return 8457;\n\t\t\tcase FireCoralFan::FireCoralFan().ID: return 8561;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8529;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8531;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8533;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8535;\n\t\t\tcase FlowerPot::FlowerPot().ID: return 5265;\n\t\t\tcase FrostedIce::FrostedIce(0).ID: return 8188;\n\t\t\tcase FrostedIce::FrostedIce(1).ID: return 8189;\n\t\t\tcase FrostedIce::FrostedIce(2).ID: return 8190;\n\t\t\tcase FrostedIce::FrostedIce(3).ID: return 8191;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3067;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3068;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3069;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3070;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, true).ID: return 3071;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, false).ID: return 3072;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, true).ID: return 3073;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, false).ID: return 3074;\n\t\t\tcase Glass::Glass().ID: return 230;\n\t\t\tcase GlassPane::GlassPane(true, true, true, true).ID: return 4213;\n\t\t\tcase GlassPane::GlassPane(true, true, true, false).ID: return 4214;\n\t\t\tcase GlassPane::GlassPane(true, true, false, true).ID: return 4217;\n\t\t\tcase GlassPane::GlassPane(true, true, false, false).ID: return 4218;\n\t\t\tcase GlassPane::GlassPane(true, false, true, true).ID: return 4221;\n\t\t\tcase GlassPane::GlassPane(true, false, true, false).ID: return 4222;\n\t\t\tcase GlassPane::GlassPane(true, false, false, true).ID: return 4225;\n\t\t\tcase GlassPane::GlassPane(true, false, false, false).ID: return 4226;\n\t\t\tcase GlassPane::GlassPane(false, true, true, true).ID: return 4229;\n\t\t\tcase GlassPane::GlassPane(false, true, true, false).ID: return 4230;\n\t\t\tcase GlassPane::GlassPane(false, true, false, true).ID: return 4233;\n\t\t\tcase GlassPane::GlassPane(false, true, false, false).ID: return 4234;\n\t\t\tcase GlassPane::GlassPane(false, false, true, true).ID: return 4237;\n\t\t\tcase GlassPane::GlassPane(false, false, true, false).ID: return 4238;\n\t\t\tcase GlassPane::GlassPane(false, false, false, true).ID: return 4241;\n\t\t\tcase GlassPane::GlassPane(false, false, false, false).ID: return 4242;\n\t\t\tcase Glowstone::Glowstone().ID: return 3495;\n\t\t\tcase GoldBlock::GoldBlock().ID: return 1123;\n\t\t\tcase GoldOre::GoldOre().ID: return 69;\n\t\t\tcase Granite::Granite().ID: return 2;\n\t\t\tcase Grass::Grass().ID: return 1041;\n\t\t\tcase GrassBlock::GrassBlock(true).ID: return 8;\n\t\t\tcase GrassBlock::GrassBlock(false).ID: return 9;\n\t\t\tcase GrassPath::GrassPath().ID: return 8162;\n\t\t\tcase Gravel::Gravel().ID: return 68;\n\t\t\tcase GrayBanner::GrayBanner(0).ID: return 6966;\n\t\t\tcase GrayBanner::GrayBanner(1).ID: return 6967;\n\t\t\tcase GrayBanner::GrayBanner(2).ID: return 6968;\n\t\t\tcase GrayBanner::GrayBanner(3).ID: return 6969;\n\t\t\tcase GrayBanner::GrayBanner(4).ID: return 6970;\n\t\t\tcase GrayBanner::GrayBanner(5).ID: return 6971;\n\t\t\tcase GrayBanner::GrayBanner(6).ID: return 6972;\n\t\t\tcase GrayBanner::GrayBanner(7).ID: return 6973;\n\t\t\tcase GrayBanner::GrayBanner(8).ID: return 6974;\n\t\t\tcase GrayBanner::GrayBanner(9).ID: return 6975;\n\t\t\tcase GrayBanner::GrayBanner(10).ID: return 6976;\n\t\t\tcase GrayBanner::GrayBanner(11).ID: return 6977;\n\t\t\tcase GrayBanner::GrayBanner(12).ID: return 6978;\n\t\t\tcase GrayBanner::GrayBanner(13).ID: return 6979;\n\t\t\tcase GrayBanner::GrayBanner(14).ID: return 6980;\n\t\t\tcase GrayBanner::GrayBanner(15).ID: return 6981;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Head).ID: return 860;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Foot).ID: return 861;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Head).ID: return 862;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Foot).ID: return 863;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Head).ID: return 864;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Foot).ID: return 865;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Head).ID: return 866;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Foot).ID: return 867;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Head).ID: return 868;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Foot).ID: return 869;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Head).ID: return 870;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Foot).ID: return 871;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Head).ID: return 872;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Foot).ID: return 873;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Head).ID: return 874;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Foot).ID: return 875;\n\t\t\tcase GrayCarpet::GrayCarpet().ID: return 6830;\n\t\t\tcase GrayConcrete::GrayConcrete().ID: return 8384;\n\t\t\tcase GrayConcretePowder::GrayConcretePowder().ID: return 8400;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8341;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8342;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8343;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8344;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8259;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8260;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8261;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8262;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8263;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8264;\n\t\t\tcase GrayStainedGlass::GrayStainedGlass().ID: return 3584;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, true).ID: return 6046;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, false).ID: return 6047;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, true).ID: return 6050;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, false).ID: return 6051;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, true).ID: return 6054;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, false).ID: return 6055;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, true).ID: return 6058;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, false).ID: return 6059;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, true).ID: return 6062;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, false).ID: return 6063;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, true).ID: return 6066;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, false).ID: return 6067;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, true).ID: return 6070;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, false).ID: return 6071;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, true).ID: return 6074;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, false).ID: return 6075;\n\t\t\tcase GrayTerracotta::GrayTerracotta().ID: return 5811;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7138;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7139;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7140;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7141;\n\t\t\tcase GrayWool::GrayWool().ID: return 1090;\n\t\t\tcase GreenBanner::GreenBanner(0).ID: return 7062;\n\t\t\tcase GreenBanner::GreenBanner(1).ID: return 7063;\n\t\t\tcase GreenBanner::GreenBanner(2).ID: return 7064;\n\t\t\tcase GreenBanner::GreenBanner(3).ID: return 7065;\n\t\t\tcase GreenBanner::GreenBanner(4).ID: return 7066;\n\t\t\tcase GreenBanner::GreenBanner(5).ID: return 7067;\n\t\t\tcase GreenBanner::GreenBanner(6).ID: return 7068;\n\t\t\tcase GreenBanner::GreenBanner(7).ID: return 7069;\n\t\t\tcase GreenBanner::GreenBanner(8).ID: return 7070;\n\t\t\tcase GreenBanner::GreenBanner(9).ID: return 7071;\n\t\t\tcase GreenBanner::GreenBanner(10).ID: return 7072;\n\t\t\tcase GreenBanner::GreenBanner(11).ID: return 7073;\n\t\t\tcase GreenBanner::GreenBanner(12).ID: return 7074;\n\t\t\tcase GreenBanner::GreenBanner(13).ID: return 7075;\n\t\t\tcase GreenBanner::GreenBanner(14).ID: return 7076;\n\t\t\tcase GreenBanner::GreenBanner(15).ID: return 7077;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Head).ID: return 956;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Foot).ID: return 957;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Head).ID: return 958;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Foot).ID: return 959;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Head).ID: return 960;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Foot).ID: return 961;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Head).ID: return 962;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Foot).ID: return 963;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Head).ID: return 964;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Foot).ID: return 965;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Head).ID: return 966;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Foot).ID: return 967;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Head).ID: return 968;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Foot).ID: return 969;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Head).ID: return 970;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Foot).ID: return 971;\n\t\t\tcase GreenCarpet::GreenCarpet().ID: return 6836;\n\t\t\tcase GreenConcrete::GreenConcrete().ID: return 8390;\n\t\t\tcase GreenConcretePowder::GreenConcretePowder().ID: return 8406;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8365;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8366;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8367;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8368;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8295;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8296;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8297;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8298;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8299;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8300;\n\t\t\tcase GreenStainedGlass::GreenStainedGlass().ID: return 3590;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, true).ID: return 6238;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, false).ID: return 6239;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, true).ID: return 6242;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, false).ID: return 6243;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, true).ID: return 6246;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, false).ID: return 6247;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, true).ID: return 6250;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, false).ID: return 6251;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, true).ID: return 6254;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, false).ID: return 6255;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, true).ID: return 6258;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, false).ID: return 6259;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, true).ID: return 6262;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, false).ID: return 6263;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, true).ID: return 6266;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, false).ID: return 6267;\n\t\t\tcase GreenTerracotta::GreenTerracotta().ID: return 5817;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7162;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7163;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7164;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7165;\n\t\t\tcase GreenWool::GreenWool().ID: return 1096;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::X).ID: return 6820;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Y).ID: return 6821;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Z).ID: return 6822;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(0).ID: return 5619;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(1).ID: return 5620;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(2).ID: return 5621;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(3).ID: return 5622;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(4).ID: return 5623;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(5).ID: return 5624;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(6).ID: return 5625;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(7).ID: return 5626;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(8).ID: return 5627;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(9).ID: return 5628;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(10).ID: return 5629;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(11).ID: return 5630;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(12).ID: return 5631;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(13).ID: return 5632;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(14).ID: return 5633;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(15).ID: return 5634;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_YM).ID: return 5685;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5686;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5687;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XM).ID: return 5688;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XP).ID: return 5689;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_YM).ID: return 5690;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5691;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5692;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XM).ID: return 5693;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XP).ID: return 5694;\n\t\t\tcase HornCoral::HornCoral().ID: return 8463;\n\t\t\tcase HornCoralBlock::HornCoralBlock().ID: return 8458;\n\t\t\tcase HornCoralFan::HornCoralFan().ID: return 8563;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8537;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8539;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8541;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8543;\n\t\t\tcase Ice::Ice().ID: return 3423;\n\t\t\tcase InfestedChiseledStoneBricks::InfestedChiseledStoneBricks().ID: return 3982;\n\t\t\tcase InfestedCobblestone::InfestedCobblestone().ID: return 3978;\n\t\t\tcase InfestedCrackedStoneBricks::InfestedCrackedStoneBricks().ID: return 3981;\n\t\t\tcase InfestedMossyStoneBricks::InfestedMossyStoneBricks().ID: return 3980;\n\t\t\tcase InfestedStone::InfestedStone().ID: return 3977;\n\t\t\tcase InfestedStoneBricks::InfestedStoneBricks().ID: return 3979;\n\t\t\tcase IronBars::IronBars(true, true, true, true).ID: return 4181;\n\t\t\tcase IronBars::IronBars(true, true, true, false).ID: return 4182;\n\t\t\tcase IronBars::IronBars(true, true, false, true).ID: return 4185;\n\t\t\tcase IronBars::IronBars(true, true, false, false).ID: return 4186;\n\t\t\tcase IronBars::IronBars(true, false, true, true).ID: return 4189;\n\t\t\tcase IronBars::IronBars(true, false, true, false).ID: return 4190;\n\t\t\tcase IronBars::IronBars(true, false, false, true).ID: return 4193;\n\t\t\tcase IronBars::IronBars(true, false, false, false).ID: return 4194;\n\t\t\tcase IronBars::IronBars(false, true, true, true).ID: return 4197;\n\t\t\tcase IronBars::IronBars(false, true, true, false).ID: return 4198;\n\t\t\tcase IronBars::IronBars(false, true, false, true).ID: return 4201;\n\t\t\tcase IronBars::IronBars(false, true, false, false).ID: return 4202;\n\t\t\tcase IronBars::IronBars(false, false, true, true).ID: return 4205;\n\t\t\tcase IronBars::IronBars(false, false, true, false).ID: return 4206;\n\t\t\tcase IronBars::IronBars(false, false, false, true).ID: return 4209;\n\t\t\tcase IronBars::IronBars(false, false, false, false).ID: return 4210;\n\t\t\tcase IronBlock::IronBlock().ID: return 1124;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3303;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3304;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3305;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3306;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3307;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3308;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3309;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3310;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3311;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3312;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3313;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3314;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3315;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3316;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3317;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3318;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3319;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3320;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3321;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3322;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3323;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3324;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3325;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3326;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3327;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3328;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3329;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3330;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3331;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3332;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3333;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3334;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3335;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3336;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3337;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3338;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3339;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3340;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3341;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3342;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3343;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3344;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3345;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3346;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3347;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3348;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3349;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3350;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3351;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3352;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3353;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3354;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3355;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3356;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3357;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3358;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3359;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3360;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3361;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3362;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3363;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3364;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3365;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3366;\n\t\t\tcase IronOre::IronOre().ID: return 70;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, true).ID: return 6495;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, false).ID: return 6497;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, true).ID: return 6499;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, false).ID: return 6501;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, true).ID: return 6503;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, false).ID: return 6505;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, true).ID: return 6507;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, false).ID: return 6509;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, true).ID: return 6511;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, false).ID: return 6513;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, true).ID: return 6515;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, false).ID: return 6517;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, true).ID: return 6519;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, false).ID: return 6521;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, true).ID: return 6523;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, false).ID: return 6525;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, true).ID: return 6527;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, false).ID: return 6529;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, true).ID: return 6531;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, false).ID: return 6533;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, true).ID: return 6535;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, false).ID: return 6537;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, true).ID: return 6539;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, false).ID: return 6541;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, true).ID: return 6543;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, false).ID: return 6545;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, true).ID: return 6547;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, false).ID: return 6549;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, true).ID: return 6551;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, false).ID: return 6553;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, true).ID: return 6555;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, false).ID: return 6557;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZM).ID: return 3502;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZP).ID: return 3503;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XM).ID: return 3504;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XP).ID: return 3505;\n\t\t\tcase Jukebox::Jukebox(true).ID: return 3458;\n\t\t\tcase Jukebox::Jukebox(false).ID: return 3459;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5375;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5376;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5377;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5378;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5379;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5380;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5381;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5382;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5383;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5384;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5385;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5386;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5387;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5388;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5389;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5390;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5391;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5392;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5393;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5394;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5395;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5396;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5397;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5398;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 7805;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 7806;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 7807;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 7808;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 7809;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 7810;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 7811;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 7812;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 7813;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 7814;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 7815;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 7816;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 7817;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 7818;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 7819;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 7820;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 7821;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 7822;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 7823;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 7824;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 7825;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 7826;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 7827;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 7828;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 7829;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 7830;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 7831;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 7832;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 7833;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 7834;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 7835;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 7836;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 7837;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 7838;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 7839;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 7840;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 7841;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 7842;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 7843;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 7844;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 7845;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 7846;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 7847;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 7848;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 7849;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 7850;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 7851;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 7852;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 7853;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 7854;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 7855;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 7856;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 7857;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 7858;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 7859;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 7860;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 7861;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 7862;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 7863;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 7864;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 7865;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 7866;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 7867;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 7868;\n\t\t\tcase JungleFence::JungleFence(true, true, true, true).ID: return 7583;\n\t\t\tcase JungleFence::JungleFence(true, true, true, false).ID: return 7584;\n\t\t\tcase JungleFence::JungleFence(true, true, false, true).ID: return 7587;\n\t\t\tcase JungleFence::JungleFence(true, true, false, false).ID: return 7588;\n\t\t\tcase JungleFence::JungleFence(true, false, true, true).ID: return 7591;\n\t\t\tcase JungleFence::JungleFence(true, false, true, false).ID: return 7592;\n\t\t\tcase JungleFence::JungleFence(true, false, false, true).ID: return 7595;\n\t\t\tcase JungleFence::JungleFence(true, false, false, false).ID: return 7596;\n\t\t\tcase JungleFence::JungleFence(false, true, true, true).ID: return 7599;\n\t\t\tcase JungleFence::JungleFence(false, true, true, false).ID: return 7600;\n\t\t\tcase JungleFence::JungleFence(false, true, false, true).ID: return 7603;\n\t\t\tcase JungleFence::JungleFence(false, true, false, false).ID: return 7604;\n\t\t\tcase JungleFence::JungleFence(false, false, true, true).ID: return 7607;\n\t\t\tcase JungleFence::JungleFence(false, false, true, false).ID: return 7608;\n\t\t\tcase JungleFence::JungleFence(false, false, false, true).ID: return 7611;\n\t\t\tcase JungleFence::JungleFence(false, false, false, false).ID: return 7612;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7421;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7422;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7423;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7424;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7425;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7426;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7427;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7428;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7429;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7430;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7431;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7432;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7433;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7434;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7435;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7436;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7437;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7438;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7439;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7440;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7441;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7442;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7443;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7444;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7445;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7446;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7447;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7448;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7449;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7450;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7451;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7452;\n\t\t\tcase JungleLeaves::JungleLeaves(1, true).ID: return 186;\n\t\t\tcase JungleLeaves::JungleLeaves(1, false).ID: return 187;\n\t\t\tcase JungleLeaves::JungleLeaves(2, true).ID: return 188;\n\t\t\tcase JungleLeaves::JungleLeaves(2, false).ID: return 189;\n\t\t\tcase JungleLeaves::JungleLeaves(3, true).ID: return 190;\n\t\t\tcase JungleLeaves::JungleLeaves(3, false).ID: return 191;\n\t\t\tcase JungleLeaves::JungleLeaves(4, true).ID: return 192;\n\t\t\tcase JungleLeaves::JungleLeaves(4, false).ID: return 193;\n\t\t\tcase JungleLeaves::JungleLeaves(5, true).ID: return 194;\n\t\t\tcase JungleLeaves::JungleLeaves(5, false).ID: return 195;\n\t\t\tcase JungleLeaves::JungleLeaves(6, true).ID: return 196;\n\t\t\tcase JungleLeaves::JungleLeaves(6, false).ID: return 197;\n\t\t\tcase JungleLeaves::JungleLeaves(7, true).ID: return 198;\n\t\t\tcase JungleLeaves::JungleLeaves(7, false).ID: return 199;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::X).ID: return 81;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Y).ID: return 82;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Z).ID: return 83;\n\t\t\tcase JunglePlanks::JunglePlanks().ID: return 18;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(true).ID: return 3373;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(false).ID: return 3374;\n\t\t\tcase JungleSapling::JungleSapling(0).ID: return 27;\n\t\t\tcase JungleSapling::JungleSapling(1).ID: return 28;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Top).ID: return 7276;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Bottom).ID: return 7278;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Double).ID: return 7280;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5045;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5047;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5049;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5051;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5053;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5055;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5057;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5059;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5061;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5063;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5065;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5067;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5069;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5071;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5073;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5075;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5077;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5079;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5081;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5083;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5085;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5087;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5089;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5091;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5093;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5095;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5097;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5099;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5101;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5103;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5105;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5107;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5109;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5111;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5113;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5115;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5117;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5119;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5121;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5123;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, true).ID: return 3786;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, false).ID: return 3788;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, true).ID: return 3790;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, false).ID: return 3792;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, true).ID: return 3794;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, false).ID: return 3796;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, true).ID: return 3798;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, false).ID: return 3800;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, true).ID: return 3802;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, false).ID: return 3804;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, true).ID: return 3806;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, false).ID: return 3808;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, true).ID: return 3810;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, false).ID: return 3812;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, true).ID: return 3814;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, false).ID: return 3816;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, true).ID: return 3818;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, false).ID: return 3820;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, true).ID: return 3822;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, false).ID: return 3824;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, true).ID: return 3826;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, false).ID: return 3828;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, true).ID: return 3830;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, false).ID: return 3832;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, true).ID: return 3834;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, false).ID: return 3836;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, true).ID: return 3838;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, false).ID: return 3840;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, true).ID: return 3842;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, false).ID: return 3844;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, true).ID: return 3846;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, false).ID: return 3848;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::X).ID: return 117;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Y).ID: return 118;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Z).ID: return 119;\n\t\t\tcase Kelp::Kelp(0).ID: return 8409;\n\t\t\tcase Kelp::Kelp(1).ID: return 8410;\n\t\t\tcase Kelp::Kelp(2).ID: return 8411;\n\t\t\tcase Kelp::Kelp(3).ID: return 8412;\n\t\t\tcase Kelp::Kelp(4).ID: return 8413;\n\t\t\tcase Kelp::Kelp(5).ID: return 8414;\n\t\t\tcase Kelp::Kelp(6).ID: return 8415;\n\t\t\tcase Kelp::Kelp(7).ID: return 8416;\n\t\t\tcase Kelp::Kelp(8).ID: return 8417;\n\t\t\tcase Kelp::Kelp(9).ID: return 8418;\n\t\t\tcase Kelp::Kelp(10).ID: return 8419;\n\t\t\tcase Kelp::Kelp(11).ID: return 8420;\n\t\t\tcase Kelp::Kelp(12).ID: return 8421;\n\t\t\tcase Kelp::Kelp(13).ID: return 8422;\n\t\t\tcase Kelp::Kelp(14).ID: return 8423;\n\t\t\tcase Kelp::Kelp(15).ID: return 8424;\n\t\t\tcase Kelp::Kelp(16).ID: return 8425;\n\t\t\tcase Kelp::Kelp(17).ID: return 8426;\n\t\t\tcase Kelp::Kelp(18).ID: return 8427;\n\t\t\tcase Kelp::Kelp(19).ID: return 8428;\n\t\t\tcase Kelp::Kelp(20).ID: return 8429;\n\t\t\tcase Kelp::Kelp(21).ID: return 8430;\n\t\t\tcase Kelp::Kelp(22).ID: return 8431;\n\t\t\tcase Kelp::Kelp(23).ID: return 8432;\n\t\t\tcase Kelp::Kelp(24).ID: return 8433;\n\t\t\tcase Kelp::Kelp(25).ID: return 8434;\n\t\t\tcase KelpPlant::KelpPlant().ID: return 8435;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZM).ID: return 3172;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZP).ID: return 3174;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XM).ID: return 3176;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XP).ID: return 3178;\n\t\t\tcase LapisBlock::LapisBlock().ID: return 232;\n\t\t\tcase LapisOre::LapisOre().ID: return 231;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Upper).ID: return 6852;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Lower).ID: return 6853;\n\t\t\tcase Lava::Lava(0).ID: return 50;\n\t\t\tcase Lava::Lava(1).ID: return 51;\n\t\t\tcase Lava::Lava(2).ID: return 52;\n\t\t\tcase Lava::Lava(3).ID: return 53;\n\t\t\tcase Lava::Lava(4).ID: return 54;\n\t\t\tcase Lava::Lava(5).ID: return 55;\n\t\t\tcase Lava::Lava(6).ID: return 56;\n\t\t\tcase Lava::Lava(7).ID: return 57;\n\t\t\tcase Lava::Lava(8).ID: return 58;\n\t\t\tcase Lava::Lava(9).ID: return 59;\n\t\t\tcase Lava::Lava(10).ID: return 60;\n\t\t\tcase Lava::Lava(11).ID: return 61;\n\t\t\tcase Lava::Lava(12).ID: return 62;\n\t\t\tcase Lava::Lava(13).ID: return 63;\n\t\t\tcase Lava::Lava(14).ID: return 64;\n\t\t\tcase Lava::Lava(15).ID: return 65;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3277;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3278;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3279;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3280;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3281;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3282;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3283;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3284;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3285;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3286;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3287;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3288;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3289;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3290;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3291;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3292;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3293;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3294;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3295;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3296;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3297;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3298;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3299;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3300;\n\t\t\tcase LightBlueBanner::LightBlueBanner(0).ID: return 6902;\n\t\t\tcase LightBlueBanner::LightBlueBanner(1).ID: return 6903;\n\t\t\tcase LightBlueBanner::LightBlueBanner(2).ID: return 6904;\n\t\t\tcase LightBlueBanner::LightBlueBanner(3).ID: return 6905;\n\t\t\tcase LightBlueBanner::LightBlueBanner(4).ID: return 6906;\n\t\t\tcase LightBlueBanner::LightBlueBanner(5).ID: return 6907;\n\t\t\tcase LightBlueBanner::LightBlueBanner(6).ID: return 6908;\n\t\t\tcase LightBlueBanner::LightBlueBanner(7).ID: return 6909;\n\t\t\tcase LightBlueBanner::LightBlueBanner(8).ID: return 6910;\n\t\t\tcase LightBlueBanner::LightBlueBanner(9).ID: return 6911;\n\t\t\tcase LightBlueBanner::LightBlueBanner(10).ID: return 6912;\n\t\t\tcase LightBlueBanner::LightBlueBanner(11).ID: return 6913;\n\t\t\tcase LightBlueBanner::LightBlueBanner(12).ID: return 6914;\n\t\t\tcase LightBlueBanner::LightBlueBanner(13).ID: return 6915;\n\t\t\tcase LightBlueBanner::LightBlueBanner(14).ID: return 6916;\n\t\t\tcase LightBlueBanner::LightBlueBanner(15).ID: return 6917;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Head).ID: return 796;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Foot).ID: return 797;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Head).ID: return 798;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Foot).ID: return 799;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Head).ID: return 800;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Foot).ID: return 801;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Head).ID: return 802;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Foot).ID: return 803;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Head).ID: return 804;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Foot).ID: return 805;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Head).ID: return 806;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Foot).ID: return 807;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Head).ID: return 808;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Foot).ID: return 809;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Head).ID: return 810;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Foot).ID: return 811;\n\t\t\tcase LightBlueCarpet::LightBlueCarpet().ID: return 6826;\n\t\t\tcase LightBlueConcrete::LightBlueConcrete().ID: return 8380;\n\t\t\tcase LightBlueConcretePowder::LightBlueConcretePowder().ID: return 8396;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8325;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8326;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8327;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8328;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8235;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8236;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8237;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8238;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8239;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8240;\n\t\t\tcase LightBlueStainedGlass::LightBlueStainedGlass().ID: return 3580;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, true).ID: return 5918;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, false).ID: return 5919;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, true).ID: return 5922;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, false).ID: return 5923;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, true).ID: return 5926;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, false).ID: return 5927;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, true).ID: return 5930;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, false).ID: return 5931;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, true).ID: return 5934;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, false).ID: return 5935;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, true).ID: return 5938;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, false).ID: return 5939;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, true).ID: return 5942;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, false).ID: return 5943;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, true).ID: return 5946;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, false).ID: return 5947;\n\t\t\tcase LightBlueTerracotta::LightBlueTerracotta().ID: return 5807;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7122;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7123;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7124;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7125;\n\t\t\tcase LightBlueWool::LightBlueWool().ID: return 1086;\n\t\t\tcase LightGrayBanner::LightGrayBanner(0).ID: return 6982;\n\t\t\tcase LightGrayBanner::LightGrayBanner(1).ID: return 6983;\n\t\t\tcase LightGrayBanner::LightGrayBanner(2).ID: return 6984;\n\t\t\tcase LightGrayBanner::LightGrayBanner(3).ID: return 6985;\n\t\t\tcase LightGrayBanner::LightGrayBanner(4).ID: return 6986;\n\t\t\tcase LightGrayBanner::LightGrayBanner(5).ID: return 6987;\n\t\t\tcase LightGrayBanner::LightGrayBanner(6).ID: return 6988;\n\t\t\tcase LightGrayBanner::LightGrayBanner(7).ID: return 6989;\n\t\t\tcase LightGrayBanner::LightGrayBanner(8).ID: return 6990;\n\t\t\tcase LightGrayBanner::LightGrayBanner(9).ID: return 6991;\n\t\t\tcase LightGrayBanner::LightGrayBanner(10).ID: return 6992;\n\t\t\tcase LightGrayBanner::LightGrayBanner(11).ID: return 6993;\n\t\t\tcase LightGrayBanner::LightGrayBanner(12).ID: return 6994;\n\t\t\tcase LightGrayBanner::LightGrayBanner(13).ID: return 6995;\n\t\t\tcase LightGrayBanner::LightGrayBanner(14).ID: return 6996;\n\t\t\tcase LightGrayBanner::LightGrayBanner(15).ID: return 6997;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Head).ID: return 876;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Foot).ID: return 877;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Head).ID: return 878;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Foot).ID: return 879;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Head).ID: return 880;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Foot).ID: return 881;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Head).ID: return 882;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Foot).ID: return 883;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Head).ID: return 884;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Foot).ID: return 885;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Head).ID: return 886;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Foot).ID: return 887;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Head).ID: return 888;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Foot).ID: return 889;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Head).ID: return 890;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Foot).ID: return 891;\n\t\t\tcase LightGrayCarpet::LightGrayCarpet().ID: return 6831;\n\t\t\tcase LightGrayConcrete::LightGrayConcrete().ID: return 8385;\n\t\t\tcase LightGrayConcretePowder::LightGrayConcretePowder().ID: return 8401;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8345;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8346;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8347;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8348;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8265;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8266;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8267;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8268;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8269;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8270;\n\t\t\tcase LightGrayStainedGlass::LightGrayStainedGlass().ID: return 3585;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, true).ID: return 6078;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, false).ID: return 6079;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, true).ID: return 6082;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, false).ID: return 6083;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, true).ID: return 6086;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, false).ID: return 6087;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, true).ID: return 6090;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, false).ID: return 6091;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, true).ID: return 6094;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, false).ID: return 6095;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, true).ID: return 6098;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, false).ID: return 6099;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, true).ID: return 6102;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, false).ID: return 6103;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, true).ID: return 6106;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, false).ID: return 6107;\n\t\t\tcase LightGrayTerracotta::LightGrayTerracotta().ID: return 5812;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7142;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7143;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7144;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7145;\n\t\t\tcase LightGrayWool::LightGrayWool().ID: return 1091;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(0).ID: return 5603;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(1).ID: return 5604;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(2).ID: return 5605;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(3).ID: return 5606;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(4).ID: return 5607;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(5).ID: return 5608;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(6).ID: return 5609;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(7).ID: return 5610;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(8).ID: return 5611;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(9).ID: return 5612;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(10).ID: return 5613;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(11).ID: return 5614;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(12).ID: return 5615;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(13).ID: return 5616;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(14).ID: return 5617;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(15).ID: return 5618;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Upper).ID: return 6844;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Lower).ID: return 6845;\n\t\t\tcase LilyPad::LilyPad().ID: return 4494;\n\t\t\tcase LimeBanner::LimeBanner(0).ID: return 6934;\n\t\t\tcase LimeBanner::LimeBanner(1).ID: return 6935;\n\t\t\tcase LimeBanner::LimeBanner(2).ID: return 6936;\n\t\t\tcase LimeBanner::LimeBanner(3).ID: return 6937;\n\t\t\tcase LimeBanner::LimeBanner(4).ID: return 6938;\n\t\t\tcase LimeBanner::LimeBanner(5).ID: return 6939;\n\t\t\tcase LimeBanner::LimeBanner(6).ID: return 6940;\n\t\t\tcase LimeBanner::LimeBanner(7).ID: return 6941;\n\t\t\tcase LimeBanner::LimeBanner(8).ID: return 6942;\n\t\t\tcase LimeBanner::LimeBanner(9).ID: return 6943;\n\t\t\tcase LimeBanner::LimeBanner(10).ID: return 6944;\n\t\t\tcase LimeBanner::LimeBanner(11).ID: return 6945;\n\t\t\tcase LimeBanner::LimeBanner(12).ID: return 6946;\n\t\t\tcase LimeBanner::LimeBanner(13).ID: return 6947;\n\t\t\tcase LimeBanner::LimeBanner(14).ID: return 6948;\n\t\t\tcase LimeBanner::LimeBanner(15).ID: return 6949;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Head).ID: return 828;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Foot).ID: return 829;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Head).ID: return 830;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Foot).ID: return 831;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Head).ID: return 832;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Foot).ID: return 833;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Head).ID: return 834;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Foot).ID: return 835;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Head).ID: return 836;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Foot).ID: return 837;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Head).ID: return 838;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Foot).ID: return 839;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Head).ID: return 840;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Foot).ID: return 841;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Head).ID: return 842;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Foot).ID: return 843;\n\t\t\tcase LimeCarpet::LimeCarpet().ID: return 6828;\n\t\t\tcase LimeConcrete::LimeConcrete().ID: return 8382;\n\t\t\tcase LimeConcretePowder::LimeConcretePowder().ID: return 8398;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8333;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8334;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8335;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8336;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8247;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8248;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8249;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8250;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8251;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8252;\n\t\t\tcase LimeStainedGlass::LimeStainedGlass().ID: return 3582;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, true).ID: return 5982;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, false).ID: return 5983;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, true).ID: return 5986;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, false).ID: return 5987;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, true).ID: return 5990;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, false).ID: return 5991;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, true).ID: return 5994;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, false).ID: return 5995;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, true).ID: return 5998;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, false).ID: return 5999;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, true).ID: return 6002;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, false).ID: return 6003;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, true).ID: return 6006;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, false).ID: return 6007;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, true).ID: return 6010;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, false).ID: return 6011;\n\t\t\tcase LimeTerracotta::LimeTerracotta().ID: return 5809;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7130;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7131;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7132;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7133;\n\t\t\tcase LimeWool::LimeWool().ID: return 1088;\n\t\t\tcase MagentaBanner::MagentaBanner(0).ID: return 6886;\n\t\t\tcase MagentaBanner::MagentaBanner(1).ID: return 6887;\n\t\t\tcase MagentaBanner::MagentaBanner(2).ID: return 6888;\n\t\t\tcase MagentaBanner::MagentaBanner(3).ID: return 6889;\n\t\t\tcase MagentaBanner::MagentaBanner(4).ID: return 6890;\n\t\t\tcase MagentaBanner::MagentaBanner(5).ID: return 6891;\n\t\t\tcase MagentaBanner::MagentaBanner(6).ID: return 6892;\n\t\t\tcase MagentaBanner::MagentaBanner(7).ID: return 6893;\n\t\t\tcase MagentaBanner::MagentaBanner(8).ID: return 6894;\n\t\t\tcase MagentaBanner::MagentaBanner(9).ID: return 6895;\n\t\t\tcase MagentaBanner::MagentaBanner(10).ID: return 6896;\n\t\t\tcase MagentaBanner::MagentaBanner(11).ID: return 6897;\n\t\t\tcase MagentaBanner::MagentaBanner(12).ID: return 6898;\n\t\t\tcase MagentaBanner::MagentaBanner(13).ID: return 6899;\n\t\t\tcase MagentaBanner::MagentaBanner(14).ID: return 6900;\n\t\t\tcase MagentaBanner::MagentaBanner(15).ID: return 6901;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Head).ID: return 780;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Foot).ID: return 781;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Head).ID: return 782;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Foot).ID: return 783;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Head).ID: return 784;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Foot).ID: return 785;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Head).ID: return 786;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Foot).ID: return 787;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Head).ID: return 788;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Foot).ID: return 789;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Head).ID: return 790;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Foot).ID: return 791;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Head).ID: return 792;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Foot).ID: return 793;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Head).ID: return 794;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Foot).ID: return 795;\n\t\t\tcase MagentaCarpet::MagentaCarpet().ID: return 6825;\n\t\t\tcase MagentaConcrete::MagentaConcrete().ID: return 8379;\n\t\t\tcase MagentaConcretePowder::MagentaConcretePowder().ID: return 8395;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8321;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8322;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8323;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8324;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8229;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8230;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8231;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8232;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8233;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8234;\n\t\t\tcase MagentaStainedGlass::MagentaStainedGlass().ID: return 3579;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, true).ID: return 5886;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, false).ID: return 5887;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, true).ID: return 5890;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, false).ID: return 5891;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, true).ID: return 5894;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, false).ID: return 5895;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, true).ID: return 5898;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, false).ID: return 5899;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, true).ID: return 5902;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, false).ID: return 5903;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, true).ID: return 5906;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, false).ID: return 5907;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, true).ID: return 5910;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, false).ID: return 5911;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, true).ID: return 5914;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, false).ID: return 5915;\n\t\t\tcase MagentaTerracotta::MagentaTerracotta().ID: return 5806;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7118;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7119;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7120;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7121;\n\t\t\tcase MagentaWool::MagentaWool().ID: return 1085;\n\t\t\tcase MagmaBlock::MagmaBlock().ID: return 8192;\n\t\t\tcase Melon::Melon().ID: return 4243;\n\t\t\tcase MelonStem::MelonStem(0).ID: return 4260;\n\t\t\tcase MelonStem::MelonStem(1).ID: return 4261;\n\t\t\tcase MelonStem::MelonStem(2).ID: return 4262;\n\t\t\tcase MelonStem::MelonStem(3).ID: return 4263;\n\t\t\tcase MelonStem::MelonStem(4).ID: return 4264;\n\t\t\tcase MelonStem::MelonStem(5).ID: return 4265;\n\t\t\tcase MelonStem::MelonStem(6).ID: return 4266;\n\t\t\tcase MelonStem::MelonStem(7).ID: return 4267;\n\t\t\tcase MossyCobblestone::MossyCobblestone().ID: return 1128;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5203;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5204;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5207;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5208;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5211;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5212;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5215;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5216;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5219;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5220;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5223;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5224;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5227;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5228;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5231;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5232;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5235;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5236;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5239;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5240;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5243;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5244;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5247;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5248;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5251;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5252;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5255;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5256;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5259;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5260;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5263;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5264;\n\t\t\tcase MossyStoneBricks::MossyStoneBricks().ID: return 3984;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Normal).ID: return 1099;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Sticky).ID: return 1100;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Normal).ID: return 1101;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Sticky).ID: return 1102;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Normal).ID: return 1103;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Sticky).ID: return 1104;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Normal).ID: return 1105;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Sticky).ID: return 1106;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Normal).ID: return 1107;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Sticky).ID: return 1108;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Normal).ID: return 1109;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Sticky).ID: return 1110;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, true).ID: return 4115;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, false).ID: return 4116;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, true).ID: return 4117;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, false).ID: return 4118;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, true).ID: return 4119;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, false).ID: return 4120;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, true).ID: return 4121;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, false).ID: return 4122;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, true).ID: return 4123;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, false).ID: return 4124;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, true).ID: return 4125;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, false).ID: return 4126;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, true).ID: return 4127;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, false).ID: return 4128;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, true).ID: return 4129;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, false).ID: return 4130;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, true).ID: return 4131;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, false).ID: return 4132;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, true).ID: return 4133;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, false).ID: return 4134;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, true).ID: return 4135;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, false).ID: return 4136;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, true).ID: return 4137;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, false).ID: return 4138;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, true).ID: return 4139;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, false).ID: return 4140;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, true).ID: return 4141;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, false).ID: return 4142;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, true).ID: return 4143;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, false).ID: return 4144;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, true).ID: return 4145;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, false).ID: return 4146;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, true).ID: return 4147;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, false).ID: return 4148;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, true).ID: return 4149;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, false).ID: return 4150;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, true).ID: return 4151;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, false).ID: return 4152;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, true).ID: return 4153;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, false).ID: return 4154;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, true).ID: return 4155;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, false).ID: return 4156;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, true).ID: return 4157;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, false).ID: return 4158;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, true).ID: return 4159;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, false).ID: return 4160;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, true).ID: return 4161;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, false).ID: return 4162;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, true).ID: return 4163;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, false).ID: return 4164;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, true).ID: return 4165;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, false).ID: return 4166;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, true).ID: return 4167;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, false).ID: return 4168;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, true).ID: return 4169;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, false).ID: return 4170;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, true).ID: return 4171;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, false).ID: return 4172;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, true).ID: return 4173;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, false).ID: return 4174;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, true).ID: return 4175;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, false).ID: return 4176;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, true).ID: return 4177;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, false).ID: return 4178;\n\t\t\tcase Mycelium::Mycelium(true).ID: return 4492;\n\t\t\tcase Mycelium::Mycelium(false).ID: return 4493;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, true).ID: return 4498;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, false).ID: return 4499;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, true).ID: return 4502;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, false).ID: return 4503;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, true).ID: return 4506;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, false).ID: return 4507;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, true).ID: return 4510;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, false).ID: return 4511;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, true).ID: return 4514;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, false).ID: return 4515;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, true).ID: return 4518;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, false).ID: return 4519;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, true).ID: return 4522;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, false).ID: return 4523;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, true).ID: return 4526;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, false).ID: return 4527;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Top).ID: return 7330;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Bottom).ID: return 7332;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Double).ID: return 7334;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 4529;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 4531;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 4533;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 4535;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 4537;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 4539;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 4541;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 4543;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 4545;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 4547;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 4549;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 4551;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 4553;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 4555;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 4557;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 4559;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 4561;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 4563;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 4565;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 4567;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 4569;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 4571;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 4573;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 4575;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 4577;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 4579;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 4581;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 4583;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 4585;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 4587;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 4589;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 4591;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 4593;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 4595;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 4597;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 4599;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 4601;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 4603;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 4605;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 4607;\n\t\t\tcase NetherBricks::NetherBricks().ID: return 4495;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::X).ID: return 3496;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::Z).ID: return 3497;\n\t\t\tcase NetherQuartzOre::NetherQuartzOre().ID: return 5684;\n\t\t\tcase NetherWart::NetherWart(0).ID: return 4608;\n\t\t\tcase NetherWart::NetherWart(1).ID: return 4609;\n\t\t\tcase NetherWart::NetherWart(2).ID: return 4610;\n\t\t\tcase NetherWart::NetherWart(3).ID: return 4611;\n\t\t\tcase NetherWartBlock::NetherWartBlock().ID: return 8193;\n\t\t\tcase Netherrack::Netherrack().ID: return 3493;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, true).ID: return 248;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, false).ID: return 249;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, true).ID: return 250;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, false).ID: return 251;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, true).ID: return 252;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, false).ID: return 253;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, true).ID: return 254;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, false).ID: return 255;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, true).ID: return 256;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, false).ID: return 257;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, true).ID: return 258;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, false).ID: return 259;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, true).ID: return 260;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, false).ID: return 261;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, true).ID: return 262;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, false).ID: return 263;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, true).ID: return 264;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, false).ID: return 265;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, true).ID: return 266;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, false).ID: return 267;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, true).ID: return 268;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, false).ID: return 269;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, true).ID: return 270;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, false).ID: return 271;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, true).ID: return 272;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, false).ID: return 273;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, true).ID: return 274;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, false).ID: return 275;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, true).ID: return 276;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, false).ID: return 277;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, true).ID: return 278;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, false).ID: return 279;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, true).ID: return 280;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, false).ID: return 281;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, true).ID: return 282;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, false).ID: return 283;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, true).ID: return 284;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, false).ID: return 285;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, true).ID: return 286;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, false).ID: return 287;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, true).ID: return 288;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, false).ID: return 289;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, true).ID: return 290;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, false).ID: return 291;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, true).ID: return 292;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, false).ID: return 293;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, true).ID: return 294;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, false).ID: return 295;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, true).ID: return 296;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, false).ID: return 297;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, true).ID: return 298;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, false).ID: return 299;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, true).ID: return 300;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, false).ID: return 301;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, true).ID: return 302;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, false).ID: return 303;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, true).ID: return 304;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, false).ID: return 305;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, true).ID: return 306;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, false).ID: return 307;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, true).ID: return 308;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, false).ID: return 309;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, true).ID: return 310;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, false).ID: return 311;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, true).ID: return 312;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, false).ID: return 313;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, true).ID: return 314;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, false).ID: return 315;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, true).ID: return 316;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, false).ID: return 317;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, true).ID: return 318;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, false).ID: return 319;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, true).ID: return 320;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, false).ID: return 321;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, true).ID: return 322;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, false).ID: return 323;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, true).ID: return 324;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, false).ID: return 325;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, true).ID: return 326;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, false).ID: return 327;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, true).ID: return 328;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, false).ID: return 329;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, true).ID: return 330;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, false).ID: return 331;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, true).ID: return 332;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, false).ID: return 333;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, true).ID: return 334;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, false).ID: return 335;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, true).ID: return 336;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, false).ID: return 337;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, true).ID: return 338;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, false).ID: return 339;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, true).ID: return 340;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, false).ID: return 341;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, true).ID: return 342;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, false).ID: return 343;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, true).ID: return 344;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, false).ID: return 345;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, true).ID: return 346;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, false).ID: return 347;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, true).ID: return 348;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, false).ID: return 349;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, true).ID: return 350;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, false).ID: return 351;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, true).ID: return 352;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, false).ID: return 353;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, true).ID: return 354;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, false).ID: return 355;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, true).ID: return 356;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, false).ID: return 357;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, true).ID: return 358;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, false).ID: return 359;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, true).ID: return 360;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, false).ID: return 361;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, true).ID: return 362;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, false).ID: return 363;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, true).ID: return 364;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, false).ID: return 365;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, true).ID: return 366;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, false).ID: return 367;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, true).ID: return 368;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, false).ID: return 369;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, true).ID: return 370;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, false).ID: return 371;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, true).ID: return 372;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, false).ID: return 373;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, true).ID: return 374;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, false).ID: return 375;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, true).ID: return 376;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, false).ID: return 377;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, true).ID: return 378;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, false).ID: return 379;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, true).ID: return 380;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, false).ID: return 381;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, true).ID: return 382;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, false).ID: return 383;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, true).ID: return 384;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, false).ID: return 385;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, true).ID: return 386;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, false).ID: return 387;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, true).ID: return 388;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, false).ID: return 389;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, true).ID: return 390;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, false).ID: return 391;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, true).ID: return 392;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, false).ID: return 393;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, true).ID: return 394;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, false).ID: return 395;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, true).ID: return 396;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, false).ID: return 397;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, true).ID: return 398;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, false).ID: return 399;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, true).ID: return 400;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, false).ID: return 401;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, true).ID: return 402;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, false).ID: return 403;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, true).ID: return 404;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, false).ID: return 405;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, true).ID: return 406;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, false).ID: return 407;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, true).ID: return 408;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, false).ID: return 409;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, true).ID: return 410;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, false).ID: return 411;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, true).ID: return 412;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, false).ID: return 413;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, true).ID: return 414;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, false).ID: return 415;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, true).ID: return 416;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, false).ID: return 417;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, true).ID: return 418;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, false).ID: return 419;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, true).ID: return 420;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, false).ID: return 421;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, true).ID: return 422;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, false).ID: return 423;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, true).ID: return 424;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, false).ID: return 425;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, true).ID: return 426;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, false).ID: return 427;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, true).ID: return 428;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, false).ID: return 429;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, true).ID: return 430;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, false).ID: return 431;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, true).ID: return 432;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, false).ID: return 433;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, true).ID: return 434;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, false).ID: return 435;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, true).ID: return 436;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, false).ID: return 437;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, true).ID: return 438;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, false).ID: return 439;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, true).ID: return 440;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, false).ID: return 441;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, true).ID: return 442;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, false).ID: return 443;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, true).ID: return 444;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, false).ID: return 445;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, true).ID: return 446;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, false).ID: return 447;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, true).ID: return 448;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, false).ID: return 449;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, true).ID: return 450;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, false).ID: return 451;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, true).ID: return 452;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, false).ID: return 453;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, true).ID: return 454;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, false).ID: return 455;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, true).ID: return 456;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, false).ID: return 457;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, true).ID: return 458;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, false).ID: return 459;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, true).ID: return 460;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, false).ID: return 461;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, true).ID: return 462;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, false).ID: return 463;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, true).ID: return 464;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, false).ID: return 465;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, true).ID: return 466;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, false).ID: return 467;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, true).ID: return 468;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, false).ID: return 469;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, true).ID: return 470;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, false).ID: return 471;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, true).ID: return 472;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, false).ID: return 473;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, true).ID: return 474;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, false).ID: return 475;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, true).ID: return 476;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, false).ID: return 477;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, true).ID: return 478;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, false).ID: return 479;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, true).ID: return 480;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, false).ID: return 481;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, true).ID: return 482;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, false).ID: return 483;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, true).ID: return 484;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, false).ID: return 485;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, true).ID: return 486;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, false).ID: return 487;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, true).ID: return 488;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, false).ID: return 489;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, true).ID: return 490;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, false).ID: return 491;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, true).ID: return 492;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, false).ID: return 493;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, true).ID: return 494;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, false).ID: return 495;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, true).ID: return 496;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, false).ID: return 497;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, true).ID: return 498;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, false).ID: return 499;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, true).ID: return 500;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, false).ID: return 501;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, true).ID: return 502;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, false).ID: return 503;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, true).ID: return 504;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, false).ID: return 505;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, true).ID: return 506;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, false).ID: return 507;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, true).ID: return 508;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, false).ID: return 509;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, true).ID: return 510;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, false).ID: return 511;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, true).ID: return 512;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, false).ID: return 513;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, true).ID: return 514;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, false).ID: return 515;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, true).ID: return 516;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, false).ID: return 517;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, true).ID: return 518;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, false).ID: return 519;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, true).ID: return 520;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, false).ID: return 521;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, true).ID: return 522;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, false).ID: return 523;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, true).ID: return 524;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, false).ID: return 525;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, true).ID: return 526;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, false).ID: return 527;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, true).ID: return 528;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, false).ID: return 529;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, true).ID: return 530;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, false).ID: return 531;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, true).ID: return 532;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, false).ID: return 533;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, true).ID: return 534;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, false).ID: return 535;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, true).ID: return 536;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, false).ID: return 537;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, true).ID: return 538;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, false).ID: return 539;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, true).ID: return 540;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, false).ID: return 541;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, true).ID: return 542;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, false).ID: return 543;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, true).ID: return 544;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, false).ID: return 545;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, true).ID: return 546;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, false).ID: return 547;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, true).ID: return 548;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, false).ID: return 549;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, true).ID: return 550;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, false).ID: return 551;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, true).ID: return 552;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, false).ID: return 553;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, true).ID: return 554;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, false).ID: return 555;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, true).ID: return 556;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, false).ID: return 557;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, true).ID: return 558;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, false).ID: return 559;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, true).ID: return 560;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, false).ID: return 561;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, true).ID: return 562;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, false).ID: return 563;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, true).ID: return 564;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, false).ID: return 565;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, true).ID: return 566;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, false).ID: return 567;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, true).ID: return 568;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, false).ID: return 569;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, true).ID: return 570;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, false).ID: return 571;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, true).ID: return 572;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, false).ID: return 573;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, true).ID: return 574;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, false).ID: return 575;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, true).ID: return 576;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, false).ID: return 577;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, true).ID: return 578;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, false).ID: return 579;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, true).ID: return 580;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, false).ID: return 581;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, true).ID: return 582;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, false).ID: return 583;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, true).ID: return 584;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, false).ID: return 585;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, true).ID: return 586;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, false).ID: return 587;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, true).ID: return 588;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, false).ID: return 589;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, true).ID: return 590;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, false).ID: return 591;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, true).ID: return 592;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, false).ID: return 593;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, true).ID: return 594;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, false).ID: return 595;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, true).ID: return 596;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, false).ID: return 597;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, true).ID: return 598;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, false).ID: return 599;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, true).ID: return 600;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, false).ID: return 601;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, true).ID: return 602;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, false).ID: return 603;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, true).ID: return 604;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, false).ID: return 605;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, true).ID: return 606;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, false).ID: return 607;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, true).ID: return 608;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, false).ID: return 609;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, true).ID: return 610;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, false).ID: return 611;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, true).ID: return 612;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, false).ID: return 613;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, true).ID: return 614;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, false).ID: return 615;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, true).ID: return 616;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, false).ID: return 617;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, true).ID: return 618;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, false).ID: return 619;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, true).ID: return 620;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, false).ID: return 621;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, true).ID: return 622;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, false).ID: return 623;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, true).ID: return 624;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, false).ID: return 625;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, true).ID: return 626;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, false).ID: return 627;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, true).ID: return 628;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, false).ID: return 629;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, true).ID: return 630;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, false).ID: return 631;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, true).ID: return 632;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, false).ID: return 633;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, true).ID: return 634;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, false).ID: return 635;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, true).ID: return 636;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, false).ID: return 637;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, true).ID: return 638;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, false).ID: return 639;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, true).ID: return 640;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, false).ID: return 641;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, true).ID: return 642;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, false).ID: return 643;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, true).ID: return 644;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, false).ID: return 645;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, true).ID: return 646;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, false).ID: return 647;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, true).ID: return 648;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, false).ID: return 649;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, true).ID: return 650;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, false).ID: return 651;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, true).ID: return 652;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, false).ID: return 653;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, true).ID: return 654;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, false).ID: return 655;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, true).ID: return 656;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, false).ID: return 657;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, true).ID: return 658;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, false).ID: return 659;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, true).ID: return 660;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, false).ID: return 661;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, true).ID: return 662;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, false).ID: return 663;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, true).ID: return 664;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, false).ID: return 665;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, true).ID: return 666;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, false).ID: return 667;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, true).ID: return 668;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, false).ID: return 669;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, true).ID: return 670;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, false).ID: return 671;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, true).ID: return 672;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, false).ID: return 673;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, true).ID: return 674;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, false).ID: return 675;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, true).ID: return 676;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, false).ID: return 677;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, true).ID: return 678;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, false).ID: return 679;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, true).ID: return 680;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, false).ID: return 681;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, true).ID: return 682;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, false).ID: return 683;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, true).ID: return 684;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, false).ID: return 685;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, true).ID: return 686;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, false).ID: return 687;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, true).ID: return 688;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, false).ID: return 689;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, true).ID: return 690;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, false).ID: return 691;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, true).ID: return 692;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, false).ID: return 693;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, true).ID: return 694;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, false).ID: return 695;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, true).ID: return 696;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, false).ID: return 697;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, true).ID: return 698;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, false).ID: return 699;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, true).ID: return 700;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, false).ID: return 701;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, true).ID: return 702;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, false).ID: return 703;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, true).ID: return 704;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, false).ID: return 705;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, true).ID: return 706;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, false).ID: return 707;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, true).ID: return 708;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, false).ID: return 709;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, true).ID: return 710;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, false).ID: return 711;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, true).ID: return 712;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, false).ID: return 713;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, true).ID: return 714;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, false).ID: return 715;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, true).ID: return 716;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, false).ID: return 717;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, true).ID: return 718;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, false).ID: return 719;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, true).ID: return 720;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, false).ID: return 721;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, true).ID: return 722;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, false).ID: return 723;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, true).ID: return 724;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, false).ID: return 725;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, true).ID: return 726;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, false).ID: return 727;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, true).ID: return 728;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, false).ID: return 729;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, true).ID: return 730;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, false).ID: return 731;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, true).ID: return 732;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, false).ID: return 733;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, true).ID: return 734;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, false).ID: return 735;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, true).ID: return 736;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, false).ID: return 737;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, true).ID: return 738;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, false).ID: return 739;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, true).ID: return 740;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, false).ID: return 741;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, true).ID: return 742;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, false).ID: return 743;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, true).ID: return 744;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, false).ID: return 745;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, true).ID: return 746;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, false).ID: return 747;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5303;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5304;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5305;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5306;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5307;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5308;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5309;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5310;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5311;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5312;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5313;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5314;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5315;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5316;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5317;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5318;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5319;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5320;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5321;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5322;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5323;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5324;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5325;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5326;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3107;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3108;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3109;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3110;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3111;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3112;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3113;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3114;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3115;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3116;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3117;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3118;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3119;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3120;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3121;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3122;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3123;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3124;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3125;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3126;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3127;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3128;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3129;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3130;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3131;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3132;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3133;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3134;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3135;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3136;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3137;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3138;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3139;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3140;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3141;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3142;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3143;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3144;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3145;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3146;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3147;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3148;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3149;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3150;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3151;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3152;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3153;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3154;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3155;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3156;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3157;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3158;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3159;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3160;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3161;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3162;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3163;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3164;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3165;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3166;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3167;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3168;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3169;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3170;\n\t\t\tcase OakFence::OakFence(true, true, true, true).ID: return 3462;\n\t\t\tcase OakFence::OakFence(true, true, true, false).ID: return 3463;\n\t\t\tcase OakFence::OakFence(true, true, false, true).ID: return 3466;\n\t\t\tcase OakFence::OakFence(true, true, false, false).ID: return 3467;\n\t\t\tcase OakFence::OakFence(true, false, true, true).ID: return 3470;\n\t\t\tcase OakFence::OakFence(true, false, true, false).ID: return 3471;\n\t\t\tcase OakFence::OakFence(true, false, false, true).ID: return 3474;\n\t\t\tcase OakFence::OakFence(true, false, false, false).ID: return 3475;\n\t\t\tcase OakFence::OakFence(false, true, true, true).ID: return 3478;\n\t\t\tcase OakFence::OakFence(false, true, true, false).ID: return 3479;\n\t\t\tcase OakFence::OakFence(false, true, false, true).ID: return 3482;\n\t\t\tcase OakFence::OakFence(false, true, false, false).ID: return 3483;\n\t\t\tcase OakFence::OakFence(false, false, true, true).ID: return 3486;\n\t\t\tcase OakFence::OakFence(false, false, true, false).ID: return 3487;\n\t\t\tcase OakFence::OakFence(false, false, false, true).ID: return 3490;\n\t\t\tcase OakFence::OakFence(false, false, false, false).ID: return 3491;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 4300;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 4301;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 4302;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 4303;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 4304;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 4305;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 4306;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 4307;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 4308;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 4309;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 4310;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 4311;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 4312;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 4313;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 4314;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 4315;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 4316;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 4317;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 4318;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 4319;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 4320;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 4321;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 4322;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 4323;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 4324;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 4325;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 4326;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 4327;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 4328;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 4329;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 4330;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 4331;\n\t\t\tcase OakLeaves::OakLeaves(1, true).ID: return 144;\n\t\t\tcase OakLeaves::OakLeaves(1, false).ID: return 145;\n\t\t\tcase OakLeaves::OakLeaves(2, true).ID: return 146;\n\t\t\tcase OakLeaves::OakLeaves(2, false).ID: return 147;\n\t\t\tcase OakLeaves::OakLeaves(3, true).ID: return 148;\n\t\t\tcase OakLeaves::OakLeaves(3, false).ID: return 149;\n\t\t\tcase OakLeaves::OakLeaves(4, true).ID: return 150;\n\t\t\tcase OakLeaves::OakLeaves(4, false).ID: return 151;\n\t\t\tcase OakLeaves::OakLeaves(5, true).ID: return 152;\n\t\t\tcase OakLeaves::OakLeaves(5, false).ID: return 153;\n\t\t\tcase OakLeaves::OakLeaves(6, true).ID: return 154;\n\t\t\tcase OakLeaves::OakLeaves(6, false).ID: return 155;\n\t\t\tcase OakLeaves::OakLeaves(7, true).ID: return 156;\n\t\t\tcase OakLeaves::OakLeaves(7, false).ID: return 157;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::X).ID: return 72;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Y).ID: return 73;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Z).ID: return 74;\n\t\t\tcase OakPlanks::OakPlanks().ID: return 15;\n\t\t\tcase OakPressurePlate::OakPressurePlate(true).ID: return 3367;\n\t\t\tcase OakPressurePlate::OakPressurePlate(false).ID: return 3368;\n\t\t\tcase OakSapling::OakSapling(0).ID: return 21;\n\t\t\tcase OakSapling::OakSapling(1).ID: return 22;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Top).ID: return 7258;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Bottom).ID: return 7260;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Double).ID: return 7262;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1649;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1651;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1653;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1655;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1657;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1659;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1661;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1663;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1665;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1667;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1669;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1671;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1673;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1675;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1677;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1679;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1681;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1683;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1685;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1687;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1689;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1691;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1693;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1695;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1697;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1699;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1701;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1703;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1705;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1707;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1709;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1711;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1713;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1715;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1717;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1719;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1721;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1723;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1725;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1727;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, true).ID: return 3594;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, false).ID: return 3596;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, true).ID: return 3598;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, false).ID: return 3600;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, true).ID: return 3602;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, false).ID: return 3604;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, true).ID: return 3606;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, false).ID: return 3608;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, true).ID: return 3610;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, false).ID: return 3612;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, true).ID: return 3614;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, false).ID: return 3616;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, true).ID: return 3618;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, false).ID: return 3620;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, true).ID: return 3622;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, false).ID: return 3624;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, true).ID: return 3626;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, false).ID: return 3628;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, true).ID: return 3630;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, false).ID: return 3632;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, true).ID: return 3634;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, false).ID: return 3636;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, true).ID: return 3638;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, false).ID: return 3640;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, true).ID: return 3642;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, false).ID: return 3644;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, true).ID: return 3646;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, false).ID: return 3648;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, true).ID: return 3650;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, false).ID: return 3652;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, true).ID: return 3654;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, false).ID: return 3656;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::X).ID: return 108;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Y).ID: return 109;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Z).ID: return 110;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, true).ID: return 8199;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, false).ID: return 8200;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, true).ID: return 8201;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, false).ID: return 8202;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, true).ID: return 8203;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, false).ID: return 8204;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, true).ID: return 8205;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, false).ID: return 8206;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, true).ID: return 8207;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, false).ID: return 8208;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, true).ID: return 8209;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, false).ID: return 8210;\n\t\t\tcase Obsidian::Obsidian().ID: return 1129;\n\t\t\tcase OrangeBanner::OrangeBanner(0).ID: return 6870;\n\t\t\tcase OrangeBanner::OrangeBanner(1).ID: return 6871;\n\t\t\tcase OrangeBanner::OrangeBanner(2).ID: return 6872;\n\t\t\tcase OrangeBanner::OrangeBanner(3).ID: return 6873;\n\t\t\tcase OrangeBanner::OrangeBanner(4).ID: return 6874;\n\t\t\tcase OrangeBanner::OrangeBanner(5).ID: return 6875;\n\t\t\tcase OrangeBanner::OrangeBanner(6).ID: return 6876;\n\t\t\tcase OrangeBanner::OrangeBanner(7).ID: return 6877;\n\t\t\tcase OrangeBanner::OrangeBanner(8).ID: return 6878;\n\t\t\tcase OrangeBanner::OrangeBanner(9).ID: return 6879;\n\t\t\tcase OrangeBanner::OrangeBanner(10).ID: return 6880;\n\t\t\tcase OrangeBanner::OrangeBanner(11).ID: return 6881;\n\t\t\tcase OrangeBanner::OrangeBanner(12).ID: return 6882;\n\t\t\tcase OrangeBanner::OrangeBanner(13).ID: return 6883;\n\t\t\tcase OrangeBanner::OrangeBanner(14).ID: return 6884;\n\t\t\tcase OrangeBanner::OrangeBanner(15).ID: return 6885;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Head).ID: return 764;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Foot).ID: return 765;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Head).ID: return 766;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Foot).ID: return 767;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Head).ID: return 768;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Foot).ID: return 769;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Head).ID: return 770;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Foot).ID: return 771;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Head).ID: return 772;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Foot).ID: return 773;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Head).ID: return 774;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Foot).ID: return 775;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Head).ID: return 776;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Foot).ID: return 777;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Head).ID: return 778;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Foot).ID: return 779;\n\t\t\tcase OrangeCarpet::OrangeCarpet().ID: return 6824;\n\t\t\tcase OrangeConcrete::OrangeConcrete().ID: return 8378;\n\t\t\tcase OrangeConcretePowder::OrangeConcretePowder().ID: return 8394;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8317;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8318;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8319;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8320;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8223;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8224;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8225;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8226;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8227;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8228;\n\t\t\tcase OrangeStainedGlass::OrangeStainedGlass().ID: return 3578;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, true).ID: return 5854;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, false).ID: return 5855;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, true).ID: return 5858;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, false).ID: return 5859;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, true).ID: return 5862;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, false).ID: return 5863;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, true).ID: return 5866;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, false).ID: return 5867;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, true).ID: return 5870;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, false).ID: return 5871;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, true).ID: return 5874;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, false).ID: return 5875;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, true).ID: return 5878;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, false).ID: return 5879;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, true).ID: return 5882;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, false).ID: return 5883;\n\t\t\tcase OrangeTerracotta::OrangeTerracotta().ID: return 5805;\n\t\t\tcase OrangeTulip::OrangeTulip().ID: return 1117;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7114;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7115;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7116;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7117;\n\t\t\tcase OrangeWool::OrangeWool().ID: return 1084;\n\t\t\tcase OxeyeDaisy::OxeyeDaisy().ID: return 1120;\n\t\t\tcase PackedIce::PackedIce().ID: return 6841;\n\t\t\tcase Peony::Peony(Peony::Half::Upper).ID: return 6848;\n\t\t\tcase Peony::Peony(Peony::Half::Lower).ID: return 6849;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Top).ID: return 7306;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Bottom).ID: return 7308;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Double).ID: return 7310;\n\t\t\tcase PinkBanner::PinkBanner(0).ID: return 6950;\n\t\t\tcase PinkBanner::PinkBanner(1).ID: return 6951;\n\t\t\tcase PinkBanner::PinkBanner(2).ID: return 6952;\n\t\t\tcase PinkBanner::PinkBanner(3).ID: return 6953;\n\t\t\tcase PinkBanner::PinkBanner(4).ID: return 6954;\n\t\t\tcase PinkBanner::PinkBanner(5).ID: return 6955;\n\t\t\tcase PinkBanner::PinkBanner(6).ID: return 6956;\n\t\t\tcase PinkBanner::PinkBanner(7).ID: return 6957;\n\t\t\tcase PinkBanner::PinkBanner(8).ID: return 6958;\n\t\t\tcase PinkBanner::PinkBanner(9).ID: return 6959;\n\t\t\tcase PinkBanner::PinkBanner(10).ID: return 6960;\n\t\t\tcase PinkBanner::PinkBanner(11).ID: return 6961;\n\t\t\tcase PinkBanner::PinkBanner(12).ID: return 6962;\n\t\t\tcase PinkBanner::PinkBanner(13).ID: return 6963;\n\t\t\tcase PinkBanner::PinkBanner(14).ID: return 6964;\n\t\t\tcase PinkBanner::PinkBanner(15).ID: return 6965;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Head).ID: return 844;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Foot).ID: return 845;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Head).ID: return 846;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Foot).ID: return 847;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Head).ID: return 848;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Foot).ID: return 849;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Head).ID: return 850;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Foot).ID: return 851;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Head).ID: return 852;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Foot).ID: return 853;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Head).ID: return 854;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Foot).ID: return 855;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Head).ID: return 856;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Foot).ID: return 857;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Head).ID: return 858;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Foot).ID: return 859;\n\t\t\tcase PinkCarpet::PinkCarpet().ID: return 6829;\n\t\t\tcase PinkConcrete::PinkConcrete().ID: return 8383;\n\t\t\tcase PinkConcretePowder::PinkConcretePowder().ID: return 8399;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8337;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8338;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8339;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8340;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8253;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8254;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8255;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8256;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8257;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8258;\n\t\t\tcase PinkStainedGlass::PinkStainedGlass().ID: return 3583;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, true).ID: return 6014;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, false).ID: return 6015;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, true).ID: return 6018;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, false).ID: return 6019;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, true).ID: return 6022;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, false).ID: return 6023;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, true).ID: return 6026;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, false).ID: return 6027;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, true).ID: return 6030;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, false).ID: return 6031;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, true).ID: return 6034;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, false).ID: return 6035;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, true).ID: return 6038;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, false).ID: return 6039;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, true).ID: return 6042;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, false).ID: return 6043;\n\t\t\tcase PinkTerracotta::PinkTerracotta().ID: return 5810;\n\t\t\tcase PinkTulip::PinkTulip().ID: return 1119;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7134;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7135;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7136;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7137;\n\t\t\tcase PinkWool::PinkWool().ID: return 1089;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1047;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1048;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1049;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1050;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1051;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1052;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1053;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1054;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1055;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1056;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1057;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1058;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Normal).ID: return 1059;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Sticky).ID: return 1060;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Normal).ID: return 1061;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Sticky).ID: return 1062;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Normal).ID: return 1063;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Sticky).ID: return 1064;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Normal).ID: return 1065;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Sticky).ID: return 1066;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Normal).ID: return 1067;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Sticky).ID: return 1068;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Normal).ID: return 1069;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Sticky).ID: return 1070;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Normal).ID: return 1071;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Sticky).ID: return 1072;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Normal).ID: return 1073;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Sticky).ID: return 1074;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Normal).ID: return 1075;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Sticky).ID: return 1076;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Normal).ID: return 1077;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Sticky).ID: return 1078;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Normal).ID: return 1079;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Sticky).ID: return 1080;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Normal).ID: return 1081;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Sticky).ID: return 1082;\n\t\t\tcase PlayerHead::PlayerHead(0).ID: return 5511;\n\t\t\tcase PlayerHead::PlayerHead(1).ID: return 5512;\n\t\t\tcase PlayerHead::PlayerHead(2).ID: return 5513;\n\t\t\tcase PlayerHead::PlayerHead(3).ID: return 5514;\n\t\t\tcase PlayerHead::PlayerHead(4).ID: return 5515;\n\t\t\tcase PlayerHead::PlayerHead(5).ID: return 5516;\n\t\t\tcase PlayerHead::PlayerHead(6).ID: return 5517;\n\t\t\tcase PlayerHead::PlayerHead(7).ID: return 5518;\n\t\t\tcase PlayerHead::PlayerHead(8).ID: return 5519;\n\t\t\tcase PlayerHead::PlayerHead(9).ID: return 5520;\n\t\t\tcase PlayerHead::PlayerHead(10).ID: return 5521;\n\t\t\tcase PlayerHead::PlayerHead(11).ID: return 5522;\n\t\t\tcase PlayerHead::PlayerHead(12).ID: return 5523;\n\t\t\tcase PlayerHead::PlayerHead(13).ID: return 5524;\n\t\t\tcase PlayerHead::PlayerHead(14).ID: return 5525;\n\t\t\tcase PlayerHead::PlayerHead(15).ID: return 5526;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 5507;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 5508;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 5509;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 5510;\n\t\t\tcase Podzol::Podzol(true).ID: return 12;\n\t\t\tcase Podzol::Podzol(false).ID: return 13;\n\t\t\tcase PolishedAndesite::PolishedAndesite().ID: return 7;\n\t\t\tcase PolishedDiorite::PolishedDiorite().ID: return 5;\n\t\t\tcase PolishedGranite::PolishedGranite().ID: return 3;\n\t\t\tcase Poppy::Poppy().ID: return 1112;\n\t\t\tcase Potatoes::Potatoes(0).ID: return 5295;\n\t\t\tcase Potatoes::Potatoes(1).ID: return 5296;\n\t\t\tcase Potatoes::Potatoes(2).ID: return 5297;\n\t\t\tcase Potatoes::Potatoes(3).ID: return 5298;\n\t\t\tcase Potatoes::Potatoes(4).ID: return 5299;\n\t\t\tcase Potatoes::Potatoes(5).ID: return 5300;\n\t\t\tcase Potatoes::Potatoes(6).ID: return 5301;\n\t\t\tcase Potatoes::Potatoes(7).ID: return 5302;\n\t\t\tcase PottedAcaciaSapling::PottedAcaciaSapling().ID: return 5270;\n\t\t\tcase PottedAllium::PottedAllium().ID: return 5276;\n\t\t\tcase PottedAzureBluet::PottedAzureBluet().ID: return 5277;\n\t\t\tcase PottedBirchSapling::PottedBirchSapling().ID: return 5268;\n\t\t\tcase PottedBlueOrchid::PottedBlueOrchid().ID: return 5275;\n\t\t\tcase PottedBrownMushroom::PottedBrownMushroom().ID: return 5284;\n\t\t\tcase PottedCactus::PottedCactus().ID: return 5286;\n\t\t\tcase PottedDandelion::PottedDandelion().ID: return 5273;\n\t\t\tcase PottedDarkOakSapling::PottedDarkOakSapling().ID: return 5271;\n\t\t\tcase PottedDeadBush::PottedDeadBush().ID: return 5285;\n\t\t\tcase PottedFern::PottedFern().ID: return 5272;\n\t\t\tcase PottedJungleSapling::PottedJungleSapling().ID: return 5269;\n\t\t\tcase PottedOakSapling::PottedOakSapling().ID: return 5266;\n\t\t\tcase PottedOrangeTulip::PottedOrangeTulip().ID: return 5279;\n\t\t\tcase PottedOxeyeDaisy::PottedOxeyeDaisy().ID: return 5282;\n\t\t\tcase PottedPinkTulip::PottedPinkTulip().ID: return 5281;\n\t\t\tcase PottedPoppy::PottedPoppy().ID: return 5274;\n\t\t\tcase PottedRedMushroom::PottedRedMushroom().ID: return 5283;\n\t\t\tcase PottedRedTulip::PottedRedTulip().ID: return 5278;\n\t\t\tcase PottedSpruceSapling::PottedSpruceSapling().ID: return 5267;\n\t\t\tcase PottedWhiteTulip::PottedWhiteTulip().ID: return 5280;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::NorthSouth).ID: return 1004;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::EastWest).ID: return 1005;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingEast).ID: return 1006;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingWest).ID: return 1007;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingNorth).ID: return 1008;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingSouth).ID: return 1009;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::NorthSouth).ID: return 1010;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::EastWest).ID: return 1011;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingEast).ID: return 1012;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingWest).ID: return 1013;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingNorth).ID: return 1014;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingSouth).ID: return 1015;\n\t\t\tcase Prismarine::Prismarine().ID: return 6558;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Top).ID: return 6808;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Bottom).ID: return 6810;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Double).ID: return 6812;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 6642;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6644;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 6646;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6648;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 6650;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 6652;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6654;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 6656;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6658;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 6660;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 6662;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6664;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 6666;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6668;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 6670;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 6672;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6674;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 6676;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6678;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 6680;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 6682;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6684;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 6686;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6688;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 6690;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 6692;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6694;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 6696;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6698;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 6700;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 6702;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6704;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 6706;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6708;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 6710;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 6712;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6714;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 6716;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6718;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 6720;\n\t\t\tcase PrismarineBricks::PrismarineBricks().ID: return 6559;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Top).ID: return 6802;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Bottom).ID: return 6804;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Double).ID: return 6806;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 6562;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 6564;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 6566;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 6568;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 6570;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 6572;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 6574;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 6576;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 6578;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 6580;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 6582;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 6584;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 6586;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 6588;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 6590;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 6592;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 6594;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 6596;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 6598;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 6600;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 6602;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 6604;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 6606;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 6608;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 6610;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 6612;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 6614;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 6616;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 6618;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 6620;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 6622;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 6624;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 6626;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 6628;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 6630;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 6632;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 6634;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 6636;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 6638;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 6640;\n\t\t\tcase Pumpkin::Pumpkin().ID: return 3492;\n\t\t\tcase PumpkinStem::PumpkinStem(0).ID: return 4252;\n\t\t\tcase PumpkinStem::PumpkinStem(1).ID: return 4253;\n\t\t\tcase PumpkinStem::PumpkinStem(2).ID: return 4254;\n\t\t\tcase PumpkinStem::PumpkinStem(3).ID: return 4255;\n\t\t\tcase PumpkinStem::PumpkinStem(4).ID: return 4256;\n\t\t\tcase PumpkinStem::PumpkinStem(5).ID: return 4257;\n\t\t\tcase PumpkinStem::PumpkinStem(6).ID: return 4258;\n\t\t\tcase PumpkinStem::PumpkinStem(7).ID: return 4259;\n\t\t\tcase PurpleBanner::PurpleBanner(0).ID: return 7014;\n\t\t\tcase PurpleBanner::PurpleBanner(1).ID: return 7015;\n\t\t\tcase PurpleBanner::PurpleBanner(2).ID: return 7016;\n\t\t\tcase PurpleBanner::PurpleBanner(3).ID: return 7017;\n\t\t\tcase PurpleBanner::PurpleBanner(4).ID: return 7018;\n\t\t\tcase PurpleBanner::PurpleBanner(5).ID: return 7019;\n\t\t\tcase PurpleBanner::PurpleBanner(6).ID: return 7020;\n\t\t\tcase PurpleBanner::PurpleBanner(7).ID: return 7021;\n\t\t\tcase PurpleBanner::PurpleBanner(8).ID: return 7022;\n\t\t\tcase PurpleBanner::PurpleBanner(9).ID: return 7023;\n\t\t\tcase PurpleBanner::PurpleBanner(10).ID: return 7024;\n\t\t\tcase PurpleBanner::PurpleBanner(11).ID: return 7025;\n\t\t\tcase PurpleBanner::PurpleBanner(12).ID: return 7026;\n\t\t\tcase PurpleBanner::PurpleBanner(13).ID: return 7027;\n\t\t\tcase PurpleBanner::PurpleBanner(14).ID: return 7028;\n\t\t\tcase PurpleBanner::PurpleBanner(15).ID: return 7029;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Head).ID: return 908;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Foot).ID: return 909;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Head).ID: return 910;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Foot).ID: return 911;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Head).ID: return 912;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Foot).ID: return 913;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Head).ID: return 914;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Foot).ID: return 915;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Head).ID: return 916;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Foot).ID: return 917;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Head).ID: return 918;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Foot).ID: return 919;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Head).ID: return 920;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Foot).ID: return 921;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Head).ID: return 922;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Foot).ID: return 923;\n\t\t\tcase PurpleCarpet::PurpleCarpet().ID: return 6833;\n\t\t\tcase PurpleConcrete::PurpleConcrete().ID: return 8387;\n\t\t\tcase PurpleConcretePowder::PurpleConcretePowder().ID: return 8403;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8353;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8354;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8355;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8356;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8277;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8278;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8279;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8280;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8281;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8282;\n\t\t\tcase PurpleStainedGlass::PurpleStainedGlass().ID: return 3587;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, true).ID: return 6142;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, false).ID: return 6143;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, true).ID: return 6146;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, false).ID: return 6147;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, true).ID: return 6150;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, false).ID: return 6151;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, true).ID: return 6154;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, false).ID: return 6155;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, true).ID: return 6158;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, false).ID: return 6159;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, true).ID: return 6162;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, false).ID: return 6163;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, true).ID: return 6166;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, false).ID: return 6167;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, true).ID: return 6170;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, false).ID: return 6171;\n\t\t\tcase PurpleTerracotta::PurpleTerracotta().ID: return 5814;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7150;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7151;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7152;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7153;\n\t\t\tcase PurpleWool::PurpleWool().ID: return 1093;\n\t\t\tcase PurpurBlock::PurpurBlock().ID: return 8073;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::X).ID: return 8074;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Y).ID: return 8075;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Z).ID: return 8076;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Top).ID: return 7348;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Bottom).ID: return 7350;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Double).ID: return 7352;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8078;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8080;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8082;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8084;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8086;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8088;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8090;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8092;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8094;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8096;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8098;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8100;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8102;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8104;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8106;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8108;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8110;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8112;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8114;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8116;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8118;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8120;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8122;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8124;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8126;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8128;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8130;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8132;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8134;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8136;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8138;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8140;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8142;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8144;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8146;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8148;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8150;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8152;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8154;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8156;\n\t\t\tcase QuartzBlock::QuartzBlock().ID: return 5695;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::X).ID: return 5697;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Y).ID: return 5698;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Z).ID: return 5699;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Top).ID: return 7336;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Bottom).ID: return 7338;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Double).ID: return 7340;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 5701;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 5703;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 5705;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 5707;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 5709;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 5711;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 5713;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 5715;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 5717;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 5719;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 5721;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 5723;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 5725;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 5727;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 5729;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 5731;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 5733;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 5735;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 5737;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 5739;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 5741;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 5743;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 5745;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 5747;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 5749;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 5751;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 5753;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 5755;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 5757;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 5759;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 5761;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 5763;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 5765;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 5767;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 5769;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 5771;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 5773;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 5775;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 5777;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 5779;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthSouth).ID: return 3179;\n\t\t\tcase Rail::Rail(Rail::Shape::EastWest).ID: return 3180;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingEast).ID: return 3181;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingWest).ID: return 3182;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingNorth).ID: return 3183;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingSouth).ID: return 3184;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthEast).ID: return 3185;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthWest).ID: return 3186;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthWest).ID: return 3187;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthEast).ID: return 3188;\n\t\t\tcase RedBanner::RedBanner(0).ID: return 7078;\n\t\t\tcase RedBanner::RedBanner(1).ID: return 7079;\n\t\t\tcase RedBanner::RedBanner(2).ID: return 7080;\n\t\t\tcase RedBanner::RedBanner(3).ID: return 7081;\n\t\t\tcase RedBanner::RedBanner(4).ID: return 7082;\n\t\t\tcase RedBanner::RedBanner(5).ID: return 7083;\n\t\t\tcase RedBanner::RedBanner(6).ID: return 7084;\n\t\t\tcase RedBanner::RedBanner(7).ID: return 7085;\n\t\t\tcase RedBanner::RedBanner(8).ID: return 7086;\n\t\t\tcase RedBanner::RedBanner(9).ID: return 7087;\n\t\t\tcase RedBanner::RedBanner(10).ID: return 7088;\n\t\t\tcase RedBanner::RedBanner(11).ID: return 7089;\n\t\t\tcase RedBanner::RedBanner(12).ID: return 7090;\n\t\t\tcase RedBanner::RedBanner(13).ID: return 7091;\n\t\t\tcase RedBanner::RedBanner(14).ID: return 7092;\n\t\t\tcase RedBanner::RedBanner(15).ID: return 7093;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Head).ID: return 972;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Foot).ID: return 973;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Head).ID: return 974;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Foot).ID: return 975;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Head).ID: return 976;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Foot).ID: return 977;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Head).ID: return 978;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Foot).ID: return 979;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Head).ID: return 980;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Foot).ID: return 981;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Head).ID: return 982;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Foot).ID: return 983;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Head).ID: return 984;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Foot).ID: return 985;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Head).ID: return 986;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Foot).ID: return 987;\n\t\t\tcase RedCarpet::RedCarpet().ID: return 6837;\n\t\t\tcase RedConcrete::RedConcrete().ID: return 8391;\n\t\t\tcase RedConcretePowder::RedConcretePowder().ID: return 8407;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8369;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8370;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8371;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8372;\n\t\t\tcase RedMushroom::RedMushroom().ID: return 1122;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, true).ID: return 4051;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, false).ID: return 4052;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, true).ID: return 4053;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, false).ID: return 4054;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, true).ID: return 4055;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, false).ID: return 4056;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, true).ID: return 4057;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, false).ID: return 4058;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, true).ID: return 4059;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, false).ID: return 4060;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, true).ID: return 4061;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, false).ID: return 4062;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, true).ID: return 4063;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, false).ID: return 4064;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, true).ID: return 4065;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, false).ID: return 4066;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, true).ID: return 4067;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, false).ID: return 4068;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, true).ID: return 4069;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, false).ID: return 4070;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, true).ID: return 4071;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, false).ID: return 4072;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, true).ID: return 4073;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, false).ID: return 4074;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, true).ID: return 4075;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, false).ID: return 4076;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, true).ID: return 4077;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, false).ID: return 4078;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, true).ID: return 4079;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, false).ID: return 4080;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, true).ID: return 4081;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, false).ID: return 4082;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, true).ID: return 4083;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, false).ID: return 4084;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, true).ID: return 4085;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, false).ID: return 4086;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, true).ID: return 4087;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, false).ID: return 4088;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, true).ID: return 4089;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, false).ID: return 4090;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, true).ID: return 4091;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, false).ID: return 4092;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, true).ID: return 4093;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, false).ID: return 4094;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, true).ID: return 4095;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, false).ID: return 4096;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, true).ID: return 4097;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, false).ID: return 4098;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, true).ID: return 4099;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, false).ID: return 4100;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, true).ID: return 4101;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, false).ID: return 4102;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, true).ID: return 4103;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, false).ID: return 4104;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, true).ID: return 4105;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, false).ID: return 4106;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, true).ID: return 4107;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, false).ID: return 4108;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, true).ID: return 4109;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, false).ID: return 4110;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, true).ID: return 4111;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, false).ID: return 4112;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, true).ID: return 4113;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false).ID: return 4114;\n\t\t\tcase RedNetherBricks::RedNetherBricks().ID: return 8194;\n\t\t\tcase RedSand::RedSand().ID: return 67;\n\t\t\tcase RedSandstone::RedSandstone().ID: return 7174;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Top).ID: return 7342;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Bottom).ID: return 7344;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Double).ID: return 7346;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7178;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7180;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7182;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7184;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7186;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7188;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7190;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7192;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7194;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7196;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7198;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7200;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7202;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7204;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7206;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7208;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7210;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7212;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7214;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7216;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7218;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7220;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7222;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7224;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7226;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7228;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7230;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7232;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7234;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7236;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7238;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7240;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7242;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7244;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7246;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7248;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7250;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7252;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7254;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7256;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8301;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8302;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8303;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8304;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8305;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8306;\n\t\t\tcase RedStainedGlass::RedStainedGlass().ID: return 3591;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, true).ID: return 6270;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, false).ID: return 6271;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, true).ID: return 6274;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, false).ID: return 6275;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, true).ID: return 6278;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, false).ID: return 6279;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, true).ID: return 6282;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, false).ID: return 6283;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, true).ID: return 6286;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, false).ID: return 6287;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, true).ID: return 6290;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, false).ID: return 6291;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, true).ID: return 6294;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, false).ID: return 6295;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, true).ID: return 6298;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, false).ID: return 6299;\n\t\t\tcase RedTerracotta::RedTerracotta().ID: return 5818;\n\t\t\tcase RedTulip::RedTulip().ID: return 1116;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7166;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7167;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7168;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7169;\n\t\t\tcase RedWool::RedWool().ID: return 1097;\n\t\t\tcase RedstoneBlock::RedstoneBlock().ID: return 5683;\n\t\t\tcase RedstoneLamp::RedstoneLamp(true).ID: return 4636;\n\t\t\tcase RedstoneLamp::RedstoneLamp(false).ID: return 4637;\n\t\t\tcase RedstoneOre::RedstoneOre(true).ID: return 3379;\n\t\t\tcase RedstoneOre::RedstoneOre(false).ID: return 3380;\n\t\t\tcase RedstoneTorch::RedstoneTorch(true).ID: return 3381;\n\t\t\tcase RedstoneTorch::RedstoneTorch(false).ID: return 3382;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3383;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3384;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3385;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3386;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, true).ID: return 3387;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, false).ID: return 3388;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, true).ID: return 3389;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, false).ID: return 3390;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1752;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1753;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1754;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1755;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1756;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1757;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1758;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1759;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1760;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1761;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1762;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1763;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1764;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1765;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1766;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1767;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1768;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1769;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1770;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1771;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1772;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1773;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1774;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1775;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1776;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1777;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1778;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1779;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1780;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1781;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1782;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1783;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1784;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1785;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1786;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1787;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1788;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1789;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1790;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1791;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1792;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1793;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1794;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1795;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1796;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1797;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1798;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1799;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1800;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1801;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1802;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1803;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1804;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1805;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1806;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1807;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1808;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1809;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1810;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1811;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1812;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1813;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1814;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1815;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1816;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1817;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1818;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1819;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1820;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1821;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1822;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1823;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1824;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1825;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1826;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1827;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1828;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1829;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1830;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1831;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1832;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1833;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1834;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1835;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1836;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1837;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1838;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1839;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1840;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1841;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1842;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1843;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1844;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1845;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1846;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1847;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1848;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1849;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1850;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1851;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1852;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1853;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1854;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1855;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1856;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1857;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1858;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1859;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1860;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1861;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1862;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1863;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1864;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1865;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1866;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1867;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1868;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1869;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1870;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1871;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1872;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1873;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1874;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1875;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1876;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1877;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1878;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1879;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1880;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1881;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1882;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1883;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1884;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1885;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1886;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1887;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1888;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1889;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1890;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1891;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1892;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1893;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1895;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1896;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1897;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1898;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1899;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1900;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1901;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1902;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1903;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1904;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1905;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1906;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1907;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1908;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1909;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1910;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1911;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1912;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1913;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1914;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1915;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1916;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1917;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1918;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1919;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1920;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1921;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1922;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1923;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1924;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1925;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1926;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1927;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1928;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1929;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1930;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1931;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1932;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1933;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1934;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1935;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1936;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1937;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1938;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1939;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1940;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1941;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1942;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1943;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1944;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1945;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1946;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1947;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1948;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1949;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1950;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1951;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1952;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1953;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1954;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1955;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1956;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1957;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1958;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1959;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1960;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1961;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1962;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1963;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1964;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1965;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1966;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1967;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1968;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1969;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1970;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1971;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1972;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1973;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1974;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1975;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1976;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1977;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1978;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1979;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1980;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1981;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1982;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1983;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1984;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1985;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1986;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1987;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1988;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1989;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1990;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1991;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1992;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1993;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1994;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1995;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1996;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1997;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1998;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1999;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2000;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2001;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2002;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2003;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2004;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2005;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2006;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2007;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2008;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2009;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2010;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2011;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2012;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2013;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2014;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2015;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2016;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2017;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2018;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2019;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2020;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2021;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2022;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2023;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2024;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2025;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2026;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2027;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2028;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2029;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2030;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2031;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2032;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2033;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2034;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2035;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2036;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2037;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2038;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2039;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2040;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2041;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2042;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2043;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2044;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2045;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2046;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2047;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2048;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2049;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2050;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2051;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2052;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2053;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2054;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2055;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2056;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2057;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2058;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2059;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2060;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2061;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2062;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2063;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2064;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2065;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2066;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2067;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2068;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2069;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2070;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2071;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2072;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2073;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2074;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2075;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2076;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2077;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2078;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2079;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2080;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2081;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2082;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2083;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2084;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2085;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2086;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2087;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2088;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2089;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2090;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2091;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2092;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2093;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2094;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2095;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2096;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2097;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2098;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2099;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2100;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2101;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2102;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2103;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2104;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2105;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2106;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2107;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2108;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2109;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2110;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2111;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2112;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2113;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2114;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2115;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2116;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2117;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2118;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2119;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2120;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2121;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2122;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2123;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2124;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2125;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2126;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2127;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2128;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2129;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2130;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2131;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2132;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2133;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2134;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2135;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2136;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2137;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2138;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2139;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2140;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2141;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2142;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2143;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2144;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2145;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2146;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2147;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2148;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2149;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2150;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2151;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2152;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2153;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2154;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2155;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2156;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2157;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2158;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2159;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2160;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2161;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2162;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2163;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2164;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2165;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2166;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2167;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2168;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2169;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2170;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2171;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2172;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2173;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2174;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2175;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2176;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2177;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2178;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2179;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2180;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2181;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2182;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2183;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2184;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2185;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2186;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2187;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2188;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2189;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2190;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2191;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2192;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2193;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2194;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2195;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2196;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2197;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2198;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2199;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2200;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2201;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2202;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2203;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2204;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2205;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2206;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2207;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2208;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2209;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2210;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2211;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2212;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2213;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2214;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2215;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2216;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2217;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2218;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2219;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2220;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2221;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2222;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2223;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2224;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2225;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2226;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2227;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2228;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2229;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2230;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2231;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2232;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2233;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2234;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2235;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2236;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2237;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2238;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2239;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2240;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2241;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2242;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2243;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2244;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2245;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2246;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2247;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2248;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2249;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2250;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2251;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2252;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2253;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2254;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2255;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2256;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2257;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2258;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2259;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2260;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2261;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2262;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2263;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2264;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2265;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2266;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2267;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2268;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2269;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2270;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2271;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2272;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2273;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2274;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2275;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2276;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2277;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2278;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2279;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2280;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2281;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2282;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2283;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2284;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2285;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2286;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2287;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2288;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2289;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2290;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2291;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2292;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2293;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2294;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2295;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2296;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2297;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2298;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2299;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2300;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2301;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2302;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2303;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2304;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2305;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2306;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2307;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2308;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2309;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2310;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2311;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2312;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2313;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2314;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2315;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2316;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2317;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2318;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2319;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2320;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2321;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2322;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2323;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2324;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2325;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2326;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2327;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2328;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2329;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2330;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2331;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2332;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2333;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2334;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2335;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2336;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2337;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2338;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2339;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2340;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2341;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2342;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2343;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2344;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2345;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2346;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2347;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2348;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2349;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2350;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2351;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2352;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2353;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2354;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2355;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2356;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2357;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2358;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2359;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2360;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2361;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2362;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2363;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2364;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2365;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2366;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2367;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2368;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2369;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2370;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2371;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2372;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2373;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2374;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2375;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2376;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2377;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2378;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2379;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2380;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2381;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2382;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2383;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2384;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2385;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2386;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2387;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2388;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2389;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2390;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2391;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2392;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2393;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2394;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2395;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2396;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2397;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2398;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2399;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2400;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2401;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2402;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2403;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2404;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2405;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2406;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2407;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2408;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2409;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2410;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2411;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2412;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2413;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2414;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2415;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2416;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2417;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2418;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2419;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2420;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2421;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2422;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2423;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2424;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2425;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2426;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2427;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2428;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2429;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2430;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2431;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2432;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2433;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2434;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2435;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2436;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2437;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2438;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2439;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2440;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2441;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2442;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2443;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2444;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2445;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2446;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2447;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2448;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2449;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2450;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2451;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2452;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2453;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2454;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2455;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2456;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2457;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2458;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2459;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2460;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2461;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2462;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2463;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2464;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2465;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2466;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2467;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2468;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2469;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2470;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2471;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2472;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2473;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2474;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2475;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2476;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2477;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2478;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2479;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2480;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2481;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2482;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2483;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2484;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2485;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2486;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2487;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2488;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2489;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2490;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2491;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2492;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2493;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2494;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2495;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2496;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2497;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2498;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2499;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2500;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2501;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2502;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2503;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2504;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2505;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2506;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2507;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2508;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2509;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2510;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2511;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2512;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2513;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2514;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2515;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2516;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2517;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2518;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2519;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2520;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2521;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2522;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2523;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2524;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2525;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2526;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2527;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2528;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2529;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2530;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2531;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2532;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2533;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2534;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2535;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2536;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2537;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2538;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2539;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2540;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2541;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2542;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2543;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2544;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2545;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2546;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2547;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2548;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2549;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2550;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2551;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2552;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2553;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2554;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2555;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2556;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2557;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2558;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2559;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2560;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2561;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2562;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2563;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2564;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2565;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2566;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2567;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2568;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2569;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2570;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2571;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2572;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2573;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2574;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2575;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2576;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2577;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2578;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2579;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2580;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2581;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2582;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2583;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2584;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2585;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2586;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2587;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2588;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2589;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2590;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2591;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2592;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2593;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2594;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2595;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2596;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2597;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2598;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2599;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2600;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2601;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2602;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2603;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2604;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2605;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2606;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2607;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2608;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2609;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2610;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2611;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2612;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2613;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2614;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2615;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2616;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2617;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2618;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2619;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2620;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2621;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2622;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2623;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2624;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2625;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2626;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2627;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2628;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2629;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2630;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2631;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2632;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2633;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2634;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2635;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2636;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2637;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2638;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2639;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2640;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2641;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2642;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2643;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2644;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2645;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2646;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2647;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2648;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2649;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2650;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2651;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2652;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2653;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2654;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2655;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2656;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2657;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2658;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2659;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2660;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2661;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2662;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2663;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2664;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2665;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2666;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2667;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2668;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2669;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2670;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2671;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2672;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2673;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2674;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2675;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2676;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2677;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2678;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2679;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2680;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2681;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2682;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2683;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2684;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2685;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2686;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2687;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2688;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2689;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2690;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2691;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2692;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2693;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2694;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2695;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2696;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2697;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2698;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2699;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2700;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2701;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2702;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2703;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2704;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2705;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2706;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2707;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2708;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2709;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2710;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2711;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2712;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2713;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2714;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2715;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2716;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2717;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2718;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2719;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2720;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2721;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2722;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2723;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2724;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2725;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2726;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2727;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2728;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2729;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2730;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2731;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2732;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2733;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2734;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2735;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2736;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2737;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2738;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2739;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2740;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2741;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2742;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2743;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2744;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2745;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2746;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2747;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2748;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2749;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2750;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2751;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2752;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2753;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2754;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2755;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2756;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2757;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2758;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2759;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2760;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2761;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2762;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2763;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2764;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2765;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2766;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2767;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2768;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2769;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2770;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2771;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2772;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2773;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2774;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2775;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2776;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2777;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2778;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2779;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2780;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2781;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2782;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2783;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2784;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2785;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2786;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2787;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2788;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2789;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2790;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2791;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2792;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2793;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2794;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2795;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2796;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2797;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2798;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2799;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2800;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2801;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2802;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2803;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2804;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2805;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2806;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2807;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2808;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2809;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2810;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2811;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2812;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2813;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2814;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2815;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2816;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2817;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2818;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2819;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2820;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2821;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2822;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2823;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2824;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2825;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2826;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2827;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2828;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2829;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2830;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2831;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2832;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2833;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2834;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2835;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2836;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2837;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2838;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2839;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2840;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2841;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2842;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2843;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2844;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2845;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2846;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2847;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2848;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2849;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2850;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2851;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2852;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2853;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2854;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2855;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2856;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2857;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2858;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2859;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2860;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2861;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2862;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2863;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2864;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2865;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2866;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2867;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2868;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2869;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2870;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2871;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2872;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2873;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2874;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2875;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2876;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2877;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2878;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2879;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2880;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2881;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2882;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2883;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2884;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2885;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2886;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2887;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2888;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2889;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2890;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2891;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2892;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2893;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2895;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2896;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2897;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2898;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2899;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2900;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2901;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2902;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2903;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2904;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2905;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2906;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2907;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2908;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2909;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2910;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2911;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2912;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2913;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2914;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2915;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2916;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2917;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2918;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2919;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2920;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2921;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2922;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2923;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2924;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2925;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2926;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2927;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2928;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2929;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2930;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2931;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2932;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2933;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2934;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2935;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2936;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2937;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2938;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2939;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2940;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2941;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2942;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2943;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2944;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2945;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2946;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2947;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2948;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2949;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2950;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2951;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2952;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2953;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2954;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2955;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2956;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2957;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2958;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2959;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2960;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2961;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2962;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2963;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2964;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2965;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2966;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2967;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2968;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2969;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2970;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2971;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2972;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2973;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2974;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2975;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2976;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2977;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2978;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2979;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2980;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2981;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2982;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2983;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2984;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2985;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2986;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2987;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2988;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2989;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2990;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2991;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2992;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2993;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2994;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2995;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2996;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2997;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2998;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2999;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3000;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3001;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3002;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3003;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3004;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3005;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3006;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3007;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3008;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3009;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3010;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3011;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3012;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3013;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3014;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3015;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3016;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3017;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3018;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3019;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3020;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3021;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3022;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3023;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3024;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3025;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3026;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3027;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3028;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3029;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3030;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3031;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3032;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3033;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3034;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3035;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3036;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3037;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3038;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3039;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3040;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3041;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3042;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3043;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3044;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3045;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3046;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3047;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 3513;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 3514;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 3515;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 3516;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 3517;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 3518;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 3519;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 3520;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 3521;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 3522;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 3523;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 3524;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 3525;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 3526;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 3527;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 3528;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 3529;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 3530;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 3531;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 3532;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 3533;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 3534;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 3535;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 3536;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 3537;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 3538;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 3539;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 3540;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 3541;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 3542;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 3543;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 3544;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 3545;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 3546;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 3547;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 3548;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 3549;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 3550;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 3551;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 3552;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 3553;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 3554;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 3555;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 3556;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 3557;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 3558;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 3559;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 3560;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 3561;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 3562;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 3563;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 3564;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 3565;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 3566;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 3567;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 3568;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 3569;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 3570;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 3571;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 3572;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 3573;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 3574;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 3575;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 3576;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 8164;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 8165;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 8166;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 8167;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 8168;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 8169;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 8170;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 8171;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 8172;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 8173;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 8174;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 8175;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Upper).ID: return 6846;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Lower).ID: return 6847;\n\t\t\tcase Sand::Sand().ID: return 66;\n\t\t\tcase Sandstone::Sandstone().ID: return 245;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Top).ID: return 7300;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Bottom).ID: return 7302;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Double).ID: return 7304;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 4651;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 4653;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 4655;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 4657;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 4659;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 4661;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 4663;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 4665;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 4667;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 4669;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 4671;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 4673;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 4675;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 4677;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 4679;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 4681;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 4683;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 4685;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 4687;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 4689;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 4691;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 4693;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 4695;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 4697;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 4699;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 4701;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 4703;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 4705;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 4707;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 4709;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 4711;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 4713;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 4715;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 4717;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 4719;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 4721;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 4723;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 4725;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 4727;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 4729;\n\t\t\tcase SeaLantern::SeaLantern().ID: return 6819;\n\t\t\tcase SeaPickle::SeaPickle(1).ID: return 8565;\n\t\t\tcase SeaPickle::SeaPickle(2).ID: return 8567;\n\t\t\tcase SeaPickle::SeaPickle(3).ID: return 8569;\n\t\t\tcase SeaPickle::SeaPickle(4).ID: return 8571;\n\t\t\tcase Seagrass::Seagrass().ID: return 1044;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8211;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8212;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8213;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8214;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8215;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8216;\n\t\t\tcase OakSign::OakSign(0).ID: return 3076;\n\t\t\tcase OakSign::OakSign(1).ID: return 3078;\n\t\t\tcase OakSign::OakSign(2).ID: return 3080;\n\t\t\tcase OakSign::OakSign(3).ID: return 3082;\n\t\t\tcase OakSign::OakSign(4).ID: return 3084;\n\t\t\tcase OakSign::OakSign(5).ID: return 3086;\n\t\t\tcase OakSign::OakSign(6).ID: return 3088;\n\t\t\tcase OakSign::OakSign(7).ID: return 3090;\n\t\t\tcase OakSign::OakSign(8).ID: return 3092;\n\t\t\tcase OakSign::OakSign(9).ID: return 3094;\n\t\t\tcase OakSign::OakSign(10).ID: return 3096;\n\t\t\tcase OakSign::OakSign(11).ID: return 3098;\n\t\t\tcase OakSign::OakSign(12).ID: return 3100;\n\t\t\tcase OakSign::OakSign(13).ID: return 3102;\n\t\t\tcase OakSign::OakSign(14).ID: return 3104;\n\t\t\tcase OakSign::OakSign(15).ID: return 3106;\n\t\t\tcase SkeletonSkull::SkeletonSkull(0).ID: return 5451;\n\t\t\tcase SkeletonSkull::SkeletonSkull(1).ID: return 5452;\n\t\t\tcase SkeletonSkull::SkeletonSkull(2).ID: return 5453;\n\t\t\tcase SkeletonSkull::SkeletonSkull(3).ID: return 5454;\n\t\t\tcase SkeletonSkull::SkeletonSkull(4).ID: return 5455;\n\t\t\tcase SkeletonSkull::SkeletonSkull(5).ID: return 5456;\n\t\t\tcase SkeletonSkull::SkeletonSkull(6).ID: return 5457;\n\t\t\tcase SkeletonSkull::SkeletonSkull(7).ID: return 5458;\n\t\t\tcase SkeletonSkull::SkeletonSkull(8).ID: return 5459;\n\t\t\tcase SkeletonSkull::SkeletonSkull(9).ID: return 5460;\n\t\t\tcase SkeletonSkull::SkeletonSkull(10).ID: return 5461;\n\t\t\tcase SkeletonSkull::SkeletonSkull(11).ID: return 5462;\n\t\t\tcase SkeletonSkull::SkeletonSkull(12).ID: return 5463;\n\t\t\tcase SkeletonSkull::SkeletonSkull(13).ID: return 5464;\n\t\t\tcase SkeletonSkull::SkeletonSkull(14).ID: return 5465;\n\t\t\tcase SkeletonSkull::SkeletonSkull(15).ID: return 5466;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 5447;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 5448;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 5449;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 5450;\n\t\t\tcase SlimeBlock::SlimeBlock().ID: return 6492;\n\t\t\tcase SmoothQuartz::SmoothQuartz().ID: return 7355;\n\t\t\tcase SmoothRedSandstone::SmoothRedSandstone().ID: return 7356;\n\t\t\tcase SmoothSandstone::SmoothSandstone().ID: return 7354;\n\t\t\tcase SmoothStone::SmoothStone().ID: return 7353;\n\t\t\tcase Snow::Snow(1).ID: return 3415;\n\t\t\tcase Snow::Snow(2).ID: return 3416;\n\t\t\tcase Snow::Snow(3).ID: return 3417;\n\t\t\tcase Snow::Snow(4).ID: return 3418;\n\t\t\tcase Snow::Snow(5).ID: return 3419;\n\t\t\tcase Snow::Snow(6).ID: return 3420;\n\t\t\tcase Snow::Snow(7).ID: return 3421;\n\t\t\tcase Snow::Snow(8).ID: return 3422;\n\t\t\tcase SnowBlock::SnowBlock().ID: return 3424;\n\t\t\tcase SoulSand::SoulSand().ID: return 3494;\n\t\t\tcase Spawner::Spawner().ID: return 1647;\n\t\t\tcase Sponge::Sponge().ID: return 228;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5327;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5328;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5329;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5330;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5331;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5332;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5333;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5334;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5335;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5336;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5337;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5338;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5339;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5340;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5341;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5342;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5343;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5344;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5345;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5346;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5347;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5348;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5349;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5350;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 7677;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 7678;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 7679;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 7680;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 7681;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 7682;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 7683;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 7684;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 7685;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 7686;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 7687;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 7688;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 7689;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 7690;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 7691;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 7692;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 7693;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 7694;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 7695;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 7696;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 7697;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 7698;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 7699;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 7700;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 7701;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 7702;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 7703;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 7704;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 7705;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 7706;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 7707;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 7708;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 7709;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 7710;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 7711;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 7712;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 7713;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 7714;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 7715;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 7716;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 7717;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 7718;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 7719;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 7720;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 7721;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 7722;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 7723;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 7724;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 7725;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 7726;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 7727;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 7728;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 7729;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 7730;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 7731;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 7732;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 7733;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 7734;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 7735;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 7736;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 7737;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 7738;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 7739;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 7740;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, true).ID: return 7519;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, false).ID: return 7520;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, true).ID: return 7523;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, false).ID: return 7524;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, true).ID: return 7527;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, false).ID: return 7528;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, true).ID: return 7531;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, false).ID: return 7532;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, true).ID: return 7535;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, false).ID: return 7536;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, true).ID: return 7539;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, false).ID: return 7540;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, true).ID: return 7543;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, false).ID: return 7544;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, true).ID: return 7547;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, false).ID: return 7548;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7357;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7358;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7359;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7360;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7361;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7362;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7363;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7364;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7365;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7366;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7367;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7368;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7369;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7370;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7371;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7372;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7373;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7374;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7375;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7376;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7377;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7378;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7379;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7380;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7381;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7382;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7383;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7384;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7385;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7386;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7387;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7388;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, true).ID: return 158;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, false).ID: return 159;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, true).ID: return 160;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, false).ID: return 161;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, true).ID: return 162;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, false).ID: return 163;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, true).ID: return 164;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, false).ID: return 165;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, true).ID: return 166;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, false).ID: return 167;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, true).ID: return 168;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, false).ID: return 169;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, true).ID: return 170;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, false).ID: return 171;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::X).ID: return 75;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Y).ID: return 76;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Z).ID: return 77;\n\t\t\tcase SprucePlanks::SprucePlanks().ID: return 16;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(true).ID: return 3369;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(false).ID: return 3370;\n\t\t\tcase SpruceSapling::SpruceSapling(0).ID: return 23;\n\t\t\tcase SpruceSapling::SpruceSapling(1).ID: return 24;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Top).ID: return 7264;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Bottom).ID: return 7266;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Double).ID: return 7268;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 4885;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 4887;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 4889;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 4891;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 4893;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 4895;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 4897;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 4899;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 4901;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 4903;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 4905;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 4907;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 4909;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 4911;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 4913;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 4915;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 4917;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 4919;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 4921;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 4923;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 4925;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 4927;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 4929;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 4931;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 4933;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 4935;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 4937;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 4939;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 4941;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 4943;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 4945;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 4947;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 4949;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 4951;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 4953;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 4955;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 4957;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 4959;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 4961;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 4963;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, true).ID: return 3658;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, false).ID: return 3660;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, true).ID: return 3662;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, false).ID: return 3664;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 3666;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 3668;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 3670;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 3672;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, true).ID: return 3674;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, false).ID: return 3676;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, true).ID: return 3678;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, false).ID: return 3680;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 3682;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 3684;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 3686;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 3688;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, true).ID: return 3690;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, false).ID: return 3692;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, true).ID: return 3694;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, false).ID: return 3696;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 3698;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 3700;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 3702;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 3704;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, true).ID: return 3706;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, false).ID: return 3708;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, true).ID: return 3710;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, false).ID: return 3712;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 3714;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 3716;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 3718;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 3720;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::X).ID: return 111;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Y).ID: return 112;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Z).ID: return 113;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1028;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1029;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1030;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1031;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1032;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1033;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1034;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1035;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1036;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1037;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1038;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1039;\n\t\t\tcase Stone::Stone().ID: return 1;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Top).ID: return 7324;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Bottom).ID: return 7326;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Double).ID: return 7328;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4413;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4415;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4417;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4419;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4421;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4423;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4425;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4427;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4429;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4431;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4433;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4435;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4437;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4439;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4441;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4443;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4445;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4447;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4449;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4451;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4453;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4455;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4457;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4459;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4461;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4463;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4465;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4467;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4469;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4471;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4473;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4475;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4477;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4479;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4481;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4483;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4485;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4487;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4489;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4491;\n\t\t\tcase StoneBricks::StoneBricks().ID: return 3983;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3391;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3392;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3393;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3394;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3395;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3396;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3397;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3398;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3399;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3400;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3401;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3402;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3403;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3404;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3405;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3406;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3407;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3408;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3409;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3410;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3411;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3412;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3413;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3414;\n\t\t\tcase StonePressurePlate::StonePressurePlate(true).ID: return 3301;\n\t\t\tcase StonePressurePlate::StonePressurePlate(false).ID: return 3302;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Top).ID: return 7294;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Bottom).ID: return 7296;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Double).ID: return 7298;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::X).ID: return 99;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Y).ID: return 100;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Z).ID: return 101;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::X).ID: return 138;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Y).ID: return 139;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Z).ID: return 140;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::X).ID: return 93;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Y).ID: return 94;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Z).ID: return 95;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::X).ID: return 132;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Y).ID: return 133;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Z).ID: return 134;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::X).ID: return 102;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Y).ID: return 103;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Z).ID: return 104;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::X).ID: return 141;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Y).ID: return 142;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Z).ID: return 143;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::X).ID: return 96;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Y).ID: return 97;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Z).ID: return 98;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::X).ID: return 135;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Y).ID: return 136;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Z).ID: return 137;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::X).ID: return 105;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Y).ID: return 106;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Z).ID: return 107;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::X).ID: return 126;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Y).ID: return 127;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Z).ID: return 128;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::X).ID: return 90;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Y).ID: return 91;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Z).ID: return 92;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::X).ID: return 129;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Y).ID: return 130;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Z).ID: return 131;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Save).ID: return 8578;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Load).ID: return 8579;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Corner).ID: return 8580;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Data).ID: return 8581;\n\t\t\tcase StructureVoid::StructureVoid().ID: return 8198;\n\t\t\tcase SugarCane::SugarCane(0).ID: return 3442;\n\t\t\tcase SugarCane::SugarCane(1).ID: return 3443;\n\t\t\tcase SugarCane::SugarCane(2).ID: return 3444;\n\t\t\tcase SugarCane::SugarCane(3).ID: return 3445;\n\t\t\tcase SugarCane::SugarCane(4).ID: return 3446;\n\t\t\tcase SugarCane::SugarCane(5).ID: return 3447;\n\t\t\tcase SugarCane::SugarCane(6).ID: return 3448;\n\t\t\tcase SugarCane::SugarCane(7).ID: return 3449;\n\t\t\tcase SugarCane::SugarCane(8).ID: return 3450;\n\t\t\tcase SugarCane::SugarCane(9).ID: return 3451;\n\t\t\tcase SugarCane::SugarCane(10).ID: return 3452;\n\t\t\tcase SugarCane::SugarCane(11).ID: return 3453;\n\t\t\tcase SugarCane::SugarCane(12).ID: return 3454;\n\t\t\tcase SugarCane::SugarCane(13).ID: return 3455;\n\t\t\tcase SugarCane::SugarCane(14).ID: return 3456;\n\t\t\tcase SugarCane::SugarCane(15).ID: return 3457;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Upper).ID: return 6842;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Lower).ID: return 6843;\n\t\t\tcase TNT::TNT(true).ID: return 1126;\n\t\t\tcase TNT::TNT(false).ID: return 1126;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Upper).ID: return 6850;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Lower).ID: return 6851;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Upper).ID: return 1045;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Lower).ID: return 1046;\n\t\t\tcase Terracotta::Terracotta().ID: return 6839;\n\t\t\tcase Torch::Torch().ID: return 1130;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Single).ID: return 5580;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Left).ID: return 5582;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Right).ID: return 5584;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Single).ID: return 5586;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Left).ID: return 5588;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Right).ID: return 5590;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Single).ID: return 5592;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Left).ID: return 5594;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Right).ID: return 5596;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Single).ID: return 5598;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Left).ID: return 5600;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Right).ID: return 5602;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, true).ID: return 4755;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, false).ID: return 4756;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, true).ID: return 4757;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, false).ID: return 4758;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, true).ID: return 4759;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, false).ID: return 4760;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, true).ID: return 4761;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, false).ID: return 4762;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, true).ID: return 4763;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, false).ID: return 4764;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, true).ID: return 4765;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, false).ID: return 4766;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, true).ID: return 4767;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, false).ID: return 4768;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, true).ID: return 4769;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, false).ID: return 4770;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, true).ID: return 4771;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, false).ID: return 4772;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, true).ID: return 4773;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, false).ID: return 4774;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, true).ID: return 4775;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, false).ID: return 4776;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, true).ID: return 4777;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, false).ID: return 4778;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, true).ID: return 4779;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, false).ID: return 4780;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, true).ID: return 4781;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, false).ID: return 4782;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, true).ID: return 4783;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, false).ID: return 4784;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, true).ID: return 4785;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, false).ID: return 4786;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, true).ID: return 4787;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, false).ID: return 4788;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, true).ID: return 4789;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, false).ID: return 4790;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, true).ID: return 4791;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, false).ID: return 4792;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, true).ID: return 4793;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, false).ID: return 4794;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, true).ID: return 4795;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, false).ID: return 4796;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, true).ID: return 4797;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, false).ID: return 4798;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, true).ID: return 4799;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, false).ID: return 4800;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, true).ID: return 4801;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, false).ID: return 4802;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, true).ID: return 4803;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, false).ID: return 4804;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, true).ID: return 4805;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, false).ID: return 4806;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, true).ID: return 4807;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, false).ID: return 4808;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, true).ID: return 4809;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, false).ID: return 4810;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, true).ID: return 4811;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, false).ID: return 4812;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, true).ID: return 4813;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, false).ID: return 4814;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, true).ID: return 4815;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, false).ID: return 4816;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, true).ID: return 4817;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, false).ID: return 4818;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, true).ID: return 4819;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, false).ID: return 4820;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, true).ID: return 4821;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, false).ID: return 4822;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, true).ID: return 4823;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, false).ID: return 4824;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, true).ID: return 4825;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, false).ID: return 4826;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, true).ID: return 4827;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, false).ID: return 4828;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, true).ID: return 4829;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, false).ID: return 4830;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, true).ID: return 4831;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, false).ID: return 4832;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, true).ID: return 4833;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, false).ID: return 4834;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, true).ID: return 4835;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, false).ID: return 4836;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, true).ID: return 4837;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, false).ID: return 4838;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, true).ID: return 4839;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, false).ID: return 4840;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, true).ID: return 4841;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, false).ID: return 4842;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, true).ID: return 4843;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, false).ID: return 4844;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, true).ID: return 4845;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, false).ID: return 4846;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, true).ID: return 4847;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, false).ID: return 4848;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, true).ID: return 4849;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, false).ID: return 4850;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, true).ID: return 4851;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, false).ID: return 4852;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, true).ID: return 4853;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, false).ID: return 4854;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, true).ID: return 4855;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, false).ID: return 4856;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, true).ID: return 4857;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, false).ID: return 4858;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, true).ID: return 4859;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, false).ID: return 4860;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, true).ID: return 4861;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, false).ID: return 4862;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, true).ID: return 4863;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, false).ID: return 4864;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, true).ID: return 4865;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, false).ID: return 4866;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, true).ID: return 4867;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, false).ID: return 4868;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, true).ID: return 4869;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, false).ID: return 4870;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, true).ID: return 4871;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, false).ID: return 4872;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, true).ID: return 4873;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, false).ID: return 4874;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, true).ID: return 4875;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, false).ID: return 4876;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, true).ID: return 4877;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, false).ID: return 4878;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, true).ID: return 4879;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, false).ID: return 4880;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, true).ID: return 4881;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, false).ID: return 4882;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, true).ID: return 4739;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, false).ID: return 4740;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, true).ID: return 4741;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, false).ID: return 4742;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, true).ID: return 4743;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, false).ID: return 4744;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, true).ID: return 4745;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, false).ID: return 4746;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, true).ID: return 4747;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, false).ID: return 4748;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, true).ID: return 4749;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, false).ID: return 4750;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, true).ID: return 4751;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, false).ID: return 4752;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, true).ID: return 4753;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, false).ID: return 4754;\n\t\t\tcase TubeCoral::TubeCoral().ID: return 8459;\n\t\t\tcase TubeCoralBlock::TubeCoralBlock().ID: return 8454;\n\t\t\tcase TubeCoralFan::TubeCoralFan().ID: return 8555;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8505;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8507;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8509;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8511;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 0).ID: return 8437;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 1).ID: return 8438;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 2).ID: return 8439;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 0).ID: return 8440;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 1).ID: return 8441;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 2).ID: return 8442;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 0).ID: return 8443;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 1).ID: return 8444;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 2).ID: return 8445;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 0).ID: return 8446;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 1).ID: return 8447;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 2).ID: return 8448;\n\t\t\tcase Vine::Vine(true, true, true, true, true).ID: return 4268;\n\t\t\tcase Vine::Vine(true, true, true, true, false).ID: return 4269;\n\t\t\tcase Vine::Vine(true, true, true, false, true).ID: return 4270;\n\t\t\tcase Vine::Vine(true, true, true, false, false).ID: return 4271;\n\t\t\tcase Vine::Vine(true, true, false, true, true).ID: return 4272;\n\t\t\tcase Vine::Vine(true, true, false, true, false).ID: return 4273;\n\t\t\tcase Vine::Vine(true, true, false, false, true).ID: return 4274;\n\t\t\tcase Vine::Vine(true, true, false, false, false).ID: return 4275;\n\t\t\tcase Vine::Vine(true, false, true, true, true).ID: return 4276;\n\t\t\tcase Vine::Vine(true, false, true, true, false).ID: return 4277;\n\t\t\tcase Vine::Vine(true, false, true, false, true).ID: return 4278;\n\t\t\tcase Vine::Vine(true, false, true, false, false).ID: return 4279;\n\t\t\tcase Vine::Vine(true, false, false, true, true).ID: return 4280;\n\t\t\tcase Vine::Vine(true, false, false, true, false).ID: return 4281;\n\t\t\tcase Vine::Vine(true, false, false, false, true).ID: return 4282;\n\t\t\tcase Vine::Vine(true, false, false, false, false).ID: return 4283;\n\t\t\tcase Vine::Vine(false, true, true, true, true).ID: return 4284;\n\t\t\tcase Vine::Vine(false, true, true, true, false).ID: return 4285;\n\t\t\tcase Vine::Vine(false, true, true, false, true).ID: return 4286;\n\t\t\tcase Vine::Vine(false, true, true, false, false).ID: return 4287;\n\t\t\tcase Vine::Vine(false, true, false, true, true).ID: return 4288;\n\t\t\tcase Vine::Vine(false, true, false, true, false).ID: return 4289;\n\t\t\tcase Vine::Vine(false, true, false, false, true).ID: return 4290;\n\t\t\tcase Vine::Vine(false, true, false, false, false).ID: return 4291;\n\t\t\tcase Vine::Vine(false, false, true, true, true).ID: return 4292;\n\t\t\tcase Vine::Vine(false, false, true, true, false).ID: return 4293;\n\t\t\tcase Vine::Vine(false, false, true, false, true).ID: return 4294;\n\t\t\tcase Vine::Vine(false, false, true, false, false).ID: return 4295;\n\t\t\tcase Vine::Vine(false, false, false, true, true).ID: return 4296;\n\t\t\tcase Vine::Vine(false, false, false, true, false).ID: return 4297;\n\t\t\tcase Vine::Vine(false, false, false, false, true).ID: return 4298;\n\t\t\tcase Vine::Vine(false, false, false, false, false).ID: return 4299;\n\t\t\tcase VoidAir::VoidAir().ID: return 8574;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3270;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3272;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3274;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3276;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZM).ID: return 1131;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZP).ID: return 1132;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XM).ID: return 1133;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XP).ID: return 1134;\n\t\t\tcase Water::Water(0).ID: return 34;\n\t\t\tcase Water::Water(1).ID: return 35;\n\t\t\tcase Water::Water(2).ID: return 36;\n\t\t\tcase Water::Water(3).ID: return 37;\n\t\t\tcase Water::Water(4).ID: return 38;\n\t\t\tcase Water::Water(5).ID: return 39;\n\t\t\tcase Water::Water(6).ID: return 40;\n\t\t\tcase Water::Water(7).ID: return 41;\n\t\t\tcase Water::Water(8).ID: return 42;\n\t\t\tcase Water::Water(9).ID: return 43;\n\t\t\tcase Water::Water(10).ID: return 44;\n\t\t\tcase Water::Water(11).ID: return 45;\n\t\t\tcase Water::Water(12).ID: return 46;\n\t\t\tcase Water::Water(13).ID: return 47;\n\t\t\tcase Water::Water(14).ID: return 48;\n\t\t\tcase Water::Water(15).ID: return 49;\n\t\t\tcase WetSponge::WetSponge().ID: return 229;\n\t\t\tcase Wheat::Wheat(0).ID: return 3051;\n\t\t\tcase Wheat::Wheat(1).ID: return 3052;\n\t\t\tcase Wheat::Wheat(2).ID: return 3053;\n\t\t\tcase Wheat::Wheat(3).ID: return 3054;\n\t\t\tcase Wheat::Wheat(4).ID: return 3055;\n\t\t\tcase Wheat::Wheat(5).ID: return 3056;\n\t\t\tcase Wheat::Wheat(6).ID: return 3057;\n\t\t\tcase Wheat::Wheat(7).ID: return 3058;\n\t\t\tcase WhiteBanner::WhiteBanner(0).ID: return 6854;\n\t\t\tcase WhiteBanner::WhiteBanner(1).ID: return 6855;\n\t\t\tcase WhiteBanner::WhiteBanner(2).ID: return 6856;\n\t\t\tcase WhiteBanner::WhiteBanner(3).ID: return 6857;\n\t\t\tcase WhiteBanner::WhiteBanner(4).ID: return 6858;\n\t\t\tcase WhiteBanner::WhiteBanner(5).ID: return 6859;\n\t\t\tcase WhiteBanner::WhiteBanner(6).ID: return 6860;\n\t\t\tcase WhiteBanner::WhiteBanner(7).ID: return 6861;\n\t\t\tcase WhiteBanner::WhiteBanner(8).ID: return 6862;\n\t\t\tcase WhiteBanner::WhiteBanner(9).ID: return 6863;\n\t\t\tcase WhiteBanner::WhiteBanner(10).ID: return 6864;\n\t\t\tcase WhiteBanner::WhiteBanner(11).ID: return 6865;\n\t\t\tcase WhiteBanner::WhiteBanner(12).ID: return 6866;\n\t\t\tcase WhiteBanner::WhiteBanner(13).ID: return 6867;\n\t\t\tcase WhiteBanner::WhiteBanner(14).ID: return 6868;\n\t\t\tcase WhiteBanner::WhiteBanner(15).ID: return 6869;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Head).ID: return 748;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Foot).ID: return 749;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Head).ID: return 750;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Foot).ID: return 751;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Head).ID: return 752;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Foot).ID: return 753;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Head).ID: return 754;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Foot).ID: return 755;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Head).ID: return 756;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Foot).ID: return 757;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Head).ID: return 758;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Foot).ID: return 759;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Head).ID: return 760;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Foot).ID: return 761;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Head).ID: return 762;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Foot).ID: return 763;\n\t\t\tcase WhiteCarpet::WhiteCarpet().ID: return 6823;\n\t\t\tcase WhiteConcrete::WhiteConcrete().ID: return 8377;\n\t\t\tcase WhiteConcretePowder::WhiteConcretePowder().ID: return 8393;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8313;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8314;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8315;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8316;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8217;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8218;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8219;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8220;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8221;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8222;\n\t\t\tcase WhiteStainedGlass::WhiteStainedGlass().ID: return 3577;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, true).ID: return 5822;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, false).ID: return 5823;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, true).ID: return 5826;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, false).ID: return 5827;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, true).ID: return 5830;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, false).ID: return 5831;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, true).ID: return 5834;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, false).ID: return 5835;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, true).ID: return 5838;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, false).ID: return 5839;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, true).ID: return 5842;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, false).ID: return 5843;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, true).ID: return 5846;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, false).ID: return 5847;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, true).ID: return 5850;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, false).ID: return 5851;\n\t\t\tcase WhiteTerracotta::WhiteTerracotta().ID: return 5804;\n\t\t\tcase WhiteTulip::WhiteTulip().ID: return 1118;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7110;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7111;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7112;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7113;\n\t\t\tcase WhiteWool::WhiteWool().ID: return 1083;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(0).ID: return 5471;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(1).ID: return 5472;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(2).ID: return 5473;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(3).ID: return 5474;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(4).ID: return 5475;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(5).ID: return 5476;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(6).ID: return 5477;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(7).ID: return 5478;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(8).ID: return 5479;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(9).ID: return 5480;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(10).ID: return 5481;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(11).ID: return 5482;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(12).ID: return 5483;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(13).ID: return 5484;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(14).ID: return 5485;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(15).ID: return 5486;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 5467;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 5468;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 5469;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 5470;\n\t\t\tcase YellowBanner::YellowBanner(0).ID: return 6918;\n\t\t\tcase YellowBanner::YellowBanner(1).ID: return 6919;\n\t\t\tcase YellowBanner::YellowBanner(2).ID: return 6920;\n\t\t\tcase YellowBanner::YellowBanner(3).ID: return 6921;\n\t\t\tcase YellowBanner::YellowBanner(4).ID: return 6922;\n\t\t\tcase YellowBanner::YellowBanner(5).ID: return 6923;\n\t\t\tcase YellowBanner::YellowBanner(6).ID: return 6924;\n\t\t\tcase YellowBanner::YellowBanner(7).ID: return 6925;\n\t\t\tcase YellowBanner::YellowBanner(8).ID: return 6926;\n\t\t\tcase YellowBanner::YellowBanner(9).ID: return 6927;\n\t\t\tcase YellowBanner::YellowBanner(10).ID: return 6928;\n\t\t\tcase YellowBanner::YellowBanner(11).ID: return 6929;\n\t\t\tcase YellowBanner::YellowBanner(12).ID: return 6930;\n\t\t\tcase YellowBanner::YellowBanner(13).ID: return 6931;\n\t\t\tcase YellowBanner::YellowBanner(14).ID: return 6932;\n\t\t\tcase YellowBanner::YellowBanner(15).ID: return 6933;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Head).ID: return 812;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Foot).ID: return 813;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Head).ID: return 814;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Foot).ID: return 815;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Head).ID: return 816;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Foot).ID: return 817;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Head).ID: return 818;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Foot).ID: return 819;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Head).ID: return 820;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Foot).ID: return 821;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Head).ID: return 822;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Foot).ID: return 823;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Head).ID: return 824;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Foot).ID: return 825;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Head).ID: return 826;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Foot).ID: return 827;\n\t\t\tcase YellowCarpet::YellowCarpet().ID: return 6827;\n\t\t\tcase YellowConcrete::YellowConcrete().ID: return 8381;\n\t\t\tcase YellowConcretePowder::YellowConcretePowder().ID: return 8397;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8329;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8330;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8331;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8332;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8241;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8242;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8243;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8244;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8245;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8246;\n\t\t\tcase YellowStainedGlass::YellowStainedGlass().ID: return 3581;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, true).ID: return 5950;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, false).ID: return 5951;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, true).ID: return 5954;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, false).ID: return 5955;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, true).ID: return 5958;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, false).ID: return 5959;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, true).ID: return 5962;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, false).ID: return 5963;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, true).ID: return 5966;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, false).ID: return 5967;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, true).ID: return 5970;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, false).ID: return 5971;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, true).ID: return 5974;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, false).ID: return 5975;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, true).ID: return 5978;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, false).ID: return 5979;\n\t\t\tcase YellowTerracotta::YellowTerracotta().ID: return 5808;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7126;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7127;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7128;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7129;\n\t\t\tcase YellowWool::YellowWool().ID: return 1087;\n\t\t\tcase ZombieHead::ZombieHead(0).ID: return 5491;\n\t\t\tcase ZombieHead::ZombieHead(1).ID: return 5492;\n\t\t\tcase ZombieHead::ZombieHead(2).ID: return 5493;\n\t\t\tcase ZombieHead::ZombieHead(3).ID: return 5494;\n\t\t\tcase ZombieHead::ZombieHead(4).ID: return 5495;\n\t\t\tcase ZombieHead::ZombieHead(5).ID: return 5496;\n\t\t\tcase ZombieHead::ZombieHead(6).ID: return 5497;\n\t\t\tcase ZombieHead::ZombieHead(7).ID: return 5498;\n\t\t\tcase ZombieHead::ZombieHead(8).ID: return 5499;\n\t\t\tcase ZombieHead::ZombieHead(9).ID: return 5500;\n\t\t\tcase ZombieHead::ZombieHead(10).ID: return 5501;\n\t\t\tcase ZombieHead::ZombieHead(11).ID: return 5502;\n\t\t\tcase ZombieHead::ZombieHead(12).ID: return 5503;\n\t\t\tcase ZombieHead::ZombieHead(13).ID: return 5504;\n\t\t\tcase ZombieHead::ZombieHead(14).ID: return 5505;\n\t\t\tcase ZombieHead::ZombieHead(15).ID: return 5506;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 5487;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 5488;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 5489;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 5490;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const Item ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase Item::AcaciaBoat: return 762;\n\t\t\tcase Item::AcaciaButton: return 245;\n\t\t\tcase Item::AcaciaDoor: return 460;\n\t\t\tcase Item::AcaciaFence: return 179;\n\t\t\tcase Item::AcaciaFenceGate: return 214;\n\t\t\tcase Item::AcaciaLeaves: return 60;\n\t\t\tcase Item::AcaciaLog: return 36;\n\t\t\tcase Item::AcaciaPlanks: return 17;\n\t\t\tcase Item::AcaciaPressurePlate: return 164;\n\t\t\tcase Item::AcaciaSapling: return 23;\n\t\t\tcase Item::AcaciaSlab: return 116;\n\t\t\tcase Item::AcaciaStairs: return 301;\n\t\t\tcase Item::AcaciaTrapdoor: return 191;\n\t\t\tcase Item::AcaciaWood: return 54;\n\t\t\tcase Item::ActivatorRail: return 261;\n\t\t\tcase Item::Air: return -0;\n\t\t\tcase Item::Allium: return 101;\n\t\t\tcase Item::Andesite: return 6;\n\t\t\tcase Item::Anvil: return 247;\n\t\t\tcase Item::Apple: return 471;\n\t\t\tcase Item::ArmorStand: return 721;\n\t\t\tcase Item::Arrow: return 473;\n\t\t\tcase Item::AzureBluet: return 102;\n\t\t\tcase Item::BakedPotato: return 694;\n\t\t\tcase Item::Barrier: return 279;\n\t\t\tcase Item::BatSpawnEgg: return 634;\n\t\t\tcase Item::Beacon: return 238;\n\t\t\tcase Item::Bedrock: return 25;\n\t\t\tcase Item::Beef: return 614;\n\t\t\tcase Item::Beetroot: return 749;\n\t\t\tcase Item::BeetrootSeeds: return 750;\n\t\t\tcase Item::BeetrootSoup: return 751;\n\t\t\tcase Item::BirchBoat: return 760;\n\t\t\tcase Item::BirchButton: return 243;\n\t\t\tcase Item::BirchDoor: return 458;\n\t\t\tcase Item::BirchFence: return 177;\n\t\t\tcase Item::BirchFenceGate: return 212;\n\t\t\tcase Item::BirchLeaves: return 58;\n\t\t\tcase Item::BirchLog: return 34;\n\t\t\tcase Item::BirchPlanks: return 15;\n\t\t\tcase Item::BirchPressurePlate: return 162;\n\t\t\tcase Item::BirchSapling: return 21;\n\t\t\tcase Item::BirchSlab: return 114;\n\t\t\tcase Item::BirchStairs: return 235;\n\t\t\tcase Item::BirchTrapdoor: return 189;\n\t\t\tcase Item::BirchWood: return 52;\n\t\t\tcase Item::BlackBanner: return 745;\n\t\t\tcase Item::BlackBed: return 606;\n\t\t\tcase Item::BlackCarpet: return 297;\n\t\t\tcase Item::BlackConcrete: return 410;\n\t\t\tcase Item::BlackConcretePowder: return 426;\n\t\t\tcase Item::BlackGlazedTerracotta: return 394;\n\t\t\tcase Item::BlackShulkerBox: return 378;\n\t\t\tcase Item::BlackStainedGlass: return 326;\n\t\t\tcase Item::BlackStainedGlassPane: return 342;\n\t\t\tcase Item::BlackTerracotta: return 278;\n\t\t\tcase Item::BlackWool: return 97;\n\t\t\tcase Item::BlazePowder: return 628;\n\t\t\tcase Item::BlazeRod: return 620;\n\t\t\tcase Item::BlazeSpawnEgg: return 635;\n\t\t\tcase Item::BlueBanner: return 741;\n\t\t\tcase Item::BlueBed: return 602;\n\t\t\tcase Item::BlueCarpet: return 293;\n\t\t\tcase Item::BlueConcrete: return 406;\n\t\t\tcase Item::BlueConcretePowder: return 422;\n\t\t\tcase Item::BlueGlazedTerracotta: return 390;\n\t\t\tcase Item::BlueIce: return 453;\n\t\t\tcase Item::BlueOrchid: return 100;\n\t\t\tcase Item::BlueShulkerBox: return 374;\n\t\t\tcase Item::BlueStainedGlass: return 322;\n\t\t\tcase Item::BlueStainedGlassPane: return 338;\n\t\t\tcase Item::BlueTerracotta: return 274;\n\t\t\tcase Item::BlueWool: return 93;\n\t\t\tcase Item::Bone: return 588;\n\t\t\tcase Item::BoneBlock: return 359;\n\t\t\tcase Item::BoneMeal: return 587;\n\t\t\tcase Item::Book: return 557;\n\t\t\tcase Item::Bookshelf: return 137;\n\t\t\tcase Item::Bow: return 472;\n\t\t\tcase Item::Bowl: return 493;\n\t\t\tcase Item::BrainCoral: return 439;\n\t\t\tcase Item::BrainCoralBlock: return 434;\n\t\t\tcase Item::BrainCoralFan: return 444;\n\t\t\tcase Item::Bread: return 509;\n\t\t\tcase Item::BrewingStand: return 630;\n\t\t\tcase Item::Brick: return 551;\n\t\t\tcase Item::BrickSlab: return 122;\n\t\t\tcase Item::BrickStairs: return 216;\n\t\t\tcase Item::Bricks: return 135;\n\t\t\tcase Item::BrownBanner: return 742;\n\t\t\tcase Item::BrownBed: return 603;\n\t\t\tcase Item::BrownCarpet: return 294;\n\t\t\tcase Item::BrownConcrete: return 407;\n\t\t\tcase Item::BrownConcretePowder: return 423;\n\t\t\tcase Item::BrownGlazedTerracotta: return 391;\n\t\t\tcase Item::BrownMushroom: return 108;\n\t\t\tcase Item::BrownMushroomBlock: return 203;\n\t\t\tcase Item::BrownShulkerBox: return 375;\n\t\t\tcase Item::BrownStainedGlass: return 323;\n\t\t\tcase Item::BrownStainedGlassPane: return 339;\n\t\t\tcase Item::BrownTerracotta: return 275;\n\t\t\tcase Item::BrownWool: return 94;\n\t\t\tcase Item::BubbleCoral: return 440;\n\t\t\tcase Item::BubbleCoralBlock: return 435;\n\t\t\tcase Item::BubbleCoralFan: return 445;\n\t\t\tcase Item::Bucket: return 537;\n\t\t\tcase Item::Cactus: return 172;\n\t\t\tcase Item::GreenDye: return 574;\n\t\t\tcase Item::Cake: return 590;\n\t\t\tcase Item::Carrot: return 692;\n\t\t\tcase Item::CarrotOnAStick: return 704;\n\t\t\tcase Item::CarvedPumpkin: return 182;\n\t\t\tcase Item::Cauldron: return 631;\n\t\t\tcase Item::CaveSpiderSpawnEgg: return 636;\n\t\t\tcase Item::ChainCommandBlock: return 355;\n\t\t\tcase Item::ChainmailBoots: return 517;\n\t\t\tcase Item::ChainmailChestplate: return 515;\n\t\t\tcase Item::ChainmailHelmet: return 514;\n\t\t\tcase Item::ChainmailLeggings: return 516;\n\t\t\tcase Item::Charcoal: return 475;\n\t\t\tcase Item::Chest: return 149;\n\t\t\tcase Item::ChestMinecart: return 559;\n\t\t\tcase Item::Chicken: return 616;\n\t\t\tcase Item::ChickenSpawnEgg: return 637;\n\t\t\tcase Item::ChippedAnvil: return 248;\n\t\t\tcase Item::ChiseledQuartzBlock: return 257;\n\t\t\tcase Item::ChiseledRedSandstone: return 351;\n\t\t\tcase Item::ChiseledSandstone: return 69;\n\t\t\tcase Item::ChiseledStoneBricks: return 202;\n\t\t\tcase Item::ChorusFlower: return 143;\n\t\t\tcase Item::ChorusFruit: return 747;\n\t\t\tcase Item::ChorusPlant: return 142;\n\t\t\tcase Item::Clay: return 173;\n\t\t\tcase Item::ClayBall: return 552;\n\t\t\tcase Item::Clock: return 564;\n\t\t\tcase Item::Coal: return 474;\n\t\t\tcase Item::CoalBlock: return 299;\n\t\t\tcase Item::CoalOre: return 31;\n\t\t\tcase Item::CoarseDirt: return 10;\n\t\t\tcase Item::Cobblestone: return 12;\n\t\t\tcase Item::CobblestoneSlab: return 121;\n\t\t\tcase Item::CobblestoneStairs: return 157;\n\t\t\tcase Item::CobblestoneWall: return 239;\n\t\t\tcase Item::Cobweb: return 75;\n\t\t\tcase Item::CocoaBeans: return 575;\n\t\t\tcase Item::Cod: return 566;\n\t\t\tcase Item::CodBucket: return 549;\n\t\t\tcase Item::CodSpawnEgg: return 638;\n\t\t\tcase Item::CommandBlock: return 237;\n\t\t\tcase Item::CommandBlockMinecart: return 727;\n\t\t\tcase Item::Comparator: return 463;\n\t\t\tcase Item::Compass: return 562;\n\t\t\tcase Item::Conduit: return 454;\n\t\t\tcase Item::CookedBeef: return 615;\n\t\t\tcase Item::CookedChicken: return 617;\n\t\t\tcase Item::CookedCod: return 570;\n\t\t\tcase Item::CookedMutton: return 729;\n\t\t\tcase Item::CookedPorkchop: return 532;\n\t\t\tcase Item::CookedRabbit: return 717;\n\t\t\tcase Item::CookedSalmon: return 571;\n\t\t\tcase Item::Cookie: return 607;\n\t\t\tcase Item::CowSpawnEgg: return 639;\n\t\t\tcase Item::CrackedStoneBricks: return 201;\n\t\t\tcase Item::CraftingTable: return 152;\n\t\t\tcase Item::CreeperHead: return 702;\n\t\t\tcase Item::CreeperSpawnEgg: return 640;\n\t\t\tcase Item::CutRedSandstone: return 352;\n\t\t\tcase Item::CutSandstone: return 70;\n\t\t\tcase Item::CyanBanner: return 739;\n\t\t\tcase Item::CyanBed: return 600;\n\t\t\tcase Item::CyanCarpet: return 291;\n\t\t\tcase Item::CyanConcrete: return 404;\n\t\t\tcase Item::CyanConcretePowder: return 420;\n\t\t\tcase Item::CyanDye: return 578;\n\t\t\tcase Item::CyanGlazedTerracotta: return 388;\n\t\t\tcase Item::CyanShulkerBox: return 372;\n\t\t\tcase Item::CyanStainedGlass: return 320;\n\t\t\tcase Item::CyanStainedGlassPane: return 336;\n\t\t\tcase Item::CyanTerracotta: return 272;\n\t\t\tcase Item::CyanWool: return 91;\n\t\t\tcase Item::DamagedAnvil: return 249;\n\t\t\tcase Item::Dandelion: return 98;\n\t\t\tcase Item::YellowDye: return 583;\n\t\t\tcase Item::DarkOakBoat: return 763;\n\t\t\tcase Item::DarkOakButton: return 246;\n\t\t\tcase Item::DarkOakDoor: return 461;\n\t\t\tcase Item::DarkOakFence: return 180;\n\t\t\tcase Item::DarkOakFenceGate: return 215;\n\t\t\tcase Item::DarkOakLeaves: return 61;\n\t\t\tcase Item::DarkOakLog: return 37;\n\t\t\tcase Item::DarkOakPlanks: return 18;\n\t\t\tcase Item::DarkOakPressurePlate: return 165;\n\t\t\tcase Item::DarkOakSapling: return 24;\n\t\t\tcase Item::DarkOakSlab: return 117;\n\t\t\tcase Item::DarkOakStairs: return 302;\n\t\t\tcase Item::DarkOakTrapdoor: return 192;\n\t\t\tcase Item::DarkOakWood: return 55;\n\t\t\tcase Item::DarkPrismarine: return 345;\n\t\t\tcase Item::DarkPrismarineSlab: return 130;\n\t\t\tcase Item::DarkPrismarineStairs: return 348;\n\t\t\tcase Item::DaylightDetector: return 253;\n\t\t\tcase Item::DeadBrainCoralBlock: return 429;\n\t\t\tcase Item::DeadBrainCoralFan: return 449;\n\t\t\tcase Item::DeadBubbleCoralBlock: return 430;\n\t\t\tcase Item::DeadBubbleCoralFan: return 450;\n\t\t\tcase Item::DeadBush: return 78;\n\t\t\tcase Item::DeadFireCoralBlock: return 431;\n\t\t\tcase Item::DeadFireCoralFan: return 451;\n\t\t\tcase Item::DeadHornCoralBlock: return 432;\n\t\t\tcase Item::DeadHornCoralFan: return 452;\n\t\t\tcase Item::DeadTubeCoralBlock: return 428;\n\t\t\tcase Item::DeadTubeCoralFan: return 448;\n\t\t\tcase Item::DebugStick: return 768;\n\t\t\tcase Item::DetectorRail: return 73;\n\t\t\tcase Item::Diamond: return 476;\n\t\t\tcase Item::DiamondAxe: return 491;\n\t\t\tcase Item::DiamondBlock: return 151;\n\t\t\tcase Item::DiamondBoots: return 525;\n\t\t\tcase Item::DiamondChestplate: return 523;\n\t\t\tcase Item::DiamondHelmet: return 522;\n\t\t\tcase Item::DiamondHoe: return 505;\n\t\t\tcase Item::DiamondHorseArmor: return 724;\n\t\t\tcase Item::DiamondLeggings: return 524;\n\t\t\tcase Item::DiamondOre: return 150;\n\t\t\tcase Item::DiamondPickaxe: return 490;\n\t\t\tcase Item::DiamondShovel: return 489;\n\t\t\tcase Item::DiamondSword: return 488;\n\t\t\tcase Item::Diorite: return 4;\n\t\t\tcase Item::Dirt: return 9;\n\t\t\tcase Item::Dispenser: return 67;\n\t\t\tcase Item::DolphinSpawnEgg: return 641;\n\t\t\tcase Item::DonkeySpawnEgg: return 642;\n\t\t\tcase Item::DragonBreath: return 752;\n\t\t\tcase Item::DragonEgg: return 227;\n\t\t\tcase Item::DragonHead: return 703;\n\t\t\tcase Item::DriedKelp: return 611;\n\t\t\tcase Item::DriedKelpBlock: return 555;\n\t\t\tcase Item::Dropper: return 262;\n\t\t\tcase Item::DrownedSpawnEgg: return 643;\n\t\t\tcase Item::Egg: return 561;\n\t\t\tcase Item::ElderGuardianSpawnEgg: return 644;\n\t\t\tcase Item::Elytra: return 758;\n\t\t\tcase Item::Emerald: return 689;\n\t\t\tcase Item::EmeraldBlock: return 233;\n\t\t\tcase Item::EmeraldOre: return 230;\n\t\t\tcase Item::EnchantedBook: return 709;\n\t\t\tcase Item::EnchantedGoldenApple: return 535;\n\t\t\tcase Item::EnchantingTable: return 223;\n\t\t\tcase Item::EndCrystal: return 746;\n\t\t\tcase Item::EndPortalFrame: return 224;\n\t\t\tcase Item::EndRod: return 141;\n\t\t\tcase Item::EndStone: return 225;\n\t\t\tcase Item::EndStoneBricks: return 226;\n\t\t\tcase Item::EnderChest: return 231;\n\t\t\tcase Item::EnderEye: return 632;\n\t\t\tcase Item::EnderPearl: return 619;\n\t\t\tcase Item::EndermanSpawnEgg: return 645;\n\t\t\tcase Item::EndermiteSpawnEgg: return 646;\n\t\t\tcase Item::EvokerSpawnEgg: return 647;\n\t\t\tcase Item::ExperienceBottle: return 685;\n\t\t\tcase Item::Farmland: return 153;\n\t\t\tcase Item::Feather: return 500;\n\t\t\tcase Item::FermentedSpiderEye: return 627;\n\t\t\tcase Item::Fern: return 77;\n\t\t\tcase Item::FilledMap: return 608;\n\t\t\tcase Item::FireCharge: return 686;\n\t\t\tcase Item::FireCoral: return 441;\n\t\t\tcase Item::FireCoralBlock: return 436;\n\t\t\tcase Item::FireCoralFan: return 446;\n\t\t\tcase Item::FireworkRocket: return 707;\n\t\t\tcase Item::FireworkStar: return 708;\n\t\t\tcase Item::FishingRod: return 563;\n\t\t\tcase Item::Flint: return 530;\n\t\t\tcase Item::FlintAndSteel: return 470;\n\t\t\tcase Item::FlowerPot: return 691;\n\t\t\tcase Item::Furnace: return 154;\n\t\t\tcase Item::FurnaceMinecart: return 560;\n\t\t\tcase Item::GhastSpawnEgg: return 648;\n\t\t\tcase Item::GhastTear: return 621;\n\t\t\tcase Item::Glass: return 64;\n\t\t\tcase Item::GlassBottle: return 625;\n\t\t\tcase Item::GlassPane: return 207;\n\t\t\tcase Item::GlisteringMelonSlice: return 633;\n\t\t\tcase Item::Glowstone: return 185;\n\t\t\tcase Item::GlowstoneDust: return 565;\n\t\t\tcase Item::GoldBlock: return 110;\n\t\t\tcase Item::GoldIngot: return 478;\n\t\t\tcase Item::GoldNugget: return 622;\n\t\t\tcase Item::GoldOre: return 29;\n\t\t\tcase Item::GoldenApple: return 534;\n\t\t\tcase Item::GoldenAxe: return 498;\n\t\t\tcase Item::GoldenBoots: return 529;\n\t\t\tcase Item::GoldenCarrot: return 697;\n\t\t\tcase Item::GoldenChestplate: return 527;\n\t\t\tcase Item::GoldenHelmet: return 526;\n\t\t\tcase Item::GoldenHoe: return 506;\n\t\t\tcase Item::GoldenHorseArmor: return 723;\n\t\t\tcase Item::GoldenLeggings: return 528;\n\t\t\tcase Item::GoldenPickaxe: return 497;\n\t\t\tcase Item::GoldenShovel: return 496;\n\t\t\tcase Item::GoldenSword: return 495;\n\t\t\tcase Item::Granite: return 2;\n\t\t\tcase Item::Grass: return 76;\n\t\t\tcase Item::GrassBlock: return 8;\n\t\t\tcase Item::GrassPath: return 304;\n\t\t\tcase Item::Gravel: return 28;\n\t\t\tcase Item::GrayBanner: return 737;\n\t\t\tcase Item::GrayBed: return 598;\n\t\t\tcase Item::GrayCarpet: return 289;\n\t\t\tcase Item::GrayConcrete: return 402;\n\t\t\tcase Item::GrayConcretePowder: return 418;\n\t\t\tcase Item::GrayDye: return 580;\n\t\t\tcase Item::GrayGlazedTerracotta: return 386;\n\t\t\tcase Item::GrayShulkerBox: return 370;\n\t\t\tcase Item::GrayStainedGlass: return 318;\n\t\t\tcase Item::GrayStainedGlassPane: return 334;\n\t\t\tcase Item::GrayTerracotta: return 270;\n\t\t\tcase Item::GrayWool: return 89;\n\t\t\tcase Item::GreenBanner: return 743;\n\t\t\tcase Item::GreenBed: return 604;\n\t\t\tcase Item::GreenCarpet: return 295;\n\t\t\tcase Item::GreenConcrete: return 408;\n\t\t\tcase Item::GreenConcretePowder: return 424;\n\t\t\tcase Item::GreenGlazedTerracotta: return 392;\n\t\t\tcase Item::GreenShulkerBox: return 376;\n\t\t\tcase Item::GreenStainedGlass: return 324;\n\t\t\tcase Item::GreenStainedGlassPane: return 340;\n\t\t\tcase Item::GreenTerracotta: return 276;\n\t\t\tcase Item::GreenWool: return 95;\n\t\t\tcase Item::GuardianSpawnEgg: return 649;\n\t\t\tcase Item::Gunpowder: return 501;\n\t\t\tcase Item::HayBale: return 281;\n\t\t\tcase Item::HeartOfTheSea: return 784;\n\t\t\tcase Item::HeavyWeightedPressurePlate: return 252;\n\t\t\tcase Item::Hopper: return 256;\n\t\t\tcase Item::HopperMinecart: return 713;\n\t\t\tcase Item::HornCoral: return 442;\n\t\t\tcase Item::HornCoralBlock: return 437;\n\t\t\tcase Item::HornCoralFan: return 447;\n\t\t\tcase Item::HorseSpawnEgg: return 650;\n\t\t\tcase Item::HuskSpawnEgg: return 651;\n\t\t\tcase Item::Ice: return 170;\n\t\t\tcase Item::InfestedChiseledStoneBricks: return 198;\n\t\t\tcase Item::InfestedCobblestone: return 194;\n\t\t\tcase Item::InfestedCrackedStoneBricks: return 197;\n\t\t\tcase Item::InfestedMossyStoneBricks: return 196;\n\t\t\tcase Item::InfestedStone: return 193;\n\t\t\tcase Item::InfestedStoneBricks: return 195;\n\t\t\tcase Item::InkSac: return 572;\n\t\t\tcase Item::IronAxe: return 469;\n\t\t\tcase Item::IronBars: return 206;\n\t\t\tcase Item::IronBlock: return 111;\n\t\t\tcase Item::IronBoots: return 521;\n\t\t\tcase Item::IronChestplate: return 519;\n\t\t\tcase Item::IronDoor: return 455;\n\t\t\tcase Item::IronHelmet: return 518;\n\t\t\tcase Item::IronHoe: return 504;\n\t\t\tcase Item::IronHorseArmor: return 722;\n\t\t\tcase Item::IronIngot: return 477;\n\t\t\tcase Item::IronLeggings: return 520;\n\t\t\tcase Item::IronNugget: return 766;\n\t\t\tcase Item::IronOre: return 30;\n\t\t\tcase Item::IronPickaxe: return 468;\n\t\t\tcase Item::IronShovel: return 467;\n\t\t\tcase Item::IronSword: return 479;\n\t\t\tcase Item::IronTrapdoor: return 280;\n\t\t\tcase Item::ItemFrame: return 690;\n\t\t\tcase Item::JackOLantern: return 186;\n\t\t\tcase Item::Jukebox: return 174;\n\t\t\tcase Item::JungleBoat: return 761;\n\t\t\tcase Item::JungleButton: return 244;\n\t\t\tcase Item::JungleDoor: return 459;\n\t\t\tcase Item::JungleFence: return 178;\n\t\t\tcase Item::JungleFenceGate: return 213;\n\t\t\tcase Item::JungleLeaves: return 59;\n\t\t\tcase Item::JungleLog: return 35;\n\t\t\tcase Item::JunglePlanks: return 16;\n\t\t\tcase Item::JunglePressurePlate: return 163;\n\t\t\tcase Item::JungleSapling: return 22;\n\t\t\tcase Item::JungleSlab: return 115;\n\t\t\tcase Item::JungleStairs: return 236;\n\t\t\tcase Item::JungleTrapdoor: return 190;\n\t\t\tcase Item::JungleWood: return 53;\n\t\t\tcase Item::Kelp: return 554;\n\t\t\tcase Item::KnowledgeBook: return 767;\n\t\t\tcase Item::Ladder: return 155;\n\t\t\tcase Item::LapisBlock: return 66;\n\t\t\tcase Item::LapisLazuli: return 576;\n\t\t\tcase Item::LapisOre: return 65;\n\t\t\tcase Item::LargeFern: return 310;\n\t\t\tcase Item::LavaBucket: return 539;\n\t\t\tcase Item::Lead: return 725;\n\t\t\tcase Item::Leather: return 545;\n\t\t\tcase Item::LeatherBoots: return 513;\n\t\t\tcase Item::LeatherChestplate: return 511;\n\t\t\tcase Item::LeatherHelmet: return 510;\n\t\t\tcase Item::LeatherLeggings: return 512;\n\t\t\tcase Item::Lever: return 158;\n\t\t\tcase Item::LightBlueBanner: return 733;\n\t\t\tcase Item::LightBlueBed: return 594;\n\t\t\tcase Item::LightBlueCarpet: return 285;\n\t\t\tcase Item::LightBlueConcrete: return 398;\n\t\t\tcase Item::LightBlueConcretePowder: return 414;\n\t\t\tcase Item::LightBlueDye: return 584;\n\t\t\tcase Item::LightBlueGlazedTerracotta: return 382;\n\t\t\tcase Item::LightBlueShulkerBox: return 366;\n\t\t\tcase Item::LightBlueStainedGlass: return 314;\n\t\t\tcase Item::LightBlueStainedGlassPane: return 330;\n\t\t\tcase Item::LightBlueTerracotta: return 266;\n\t\t\tcase Item::LightBlueWool: return 85;\n\t\t\tcase Item::LightGrayBanner: return 738;\n\t\t\tcase Item::LightGrayBed: return 599;\n\t\t\tcase Item::LightGrayCarpet: return 290;\n\t\t\tcase Item::LightGrayConcrete: return 403;\n\t\t\tcase Item::LightGrayConcretePowder: return 419;\n\t\t\tcase Item::LightGrayDye: return 579;\n\t\t\tcase Item::LightGrayGlazedTerracotta: return 387;\n\t\t\tcase Item::LightGrayShulkerBox: return 371;\n\t\t\tcase Item::LightGrayStainedGlass: return 319;\n\t\t\tcase Item::LightGrayStainedGlassPane: return 335;\n\t\t\tcase Item::LightGrayTerracotta: return 271;\n\t\t\tcase Item::LightGrayWool: return 90;\n\t\t\tcase Item::LightWeightedPressurePlate: return 251;\n\t\t\tcase Item::Lilac: return 306;\n\t\t\tcase Item::LilyPad: return 219;\n\t\t\tcase Item::LimeBanner: return 735;\n\t\t\tcase Item::LimeBed: return 596;\n\t\t\tcase Item::LimeCarpet: return 287;\n\t\t\tcase Item::LimeConcrete: return 400;\n\t\t\tcase Item::LimeConcretePowder: return 416;\n\t\t\tcase Item::LimeDye: return 582;\n\t\t\tcase Item::LimeGlazedTerracotta: return 384;\n\t\t\tcase Item::LimeShulkerBox: return 368;\n\t\t\tcase Item::LimeStainedGlass: return 316;\n\t\t\tcase Item::LimeStainedGlassPane: return 332;\n\t\t\tcase Item::LimeTerracotta: return 268;\n\t\t\tcase Item::LimeWool: return 87;\n\t\t\tcase Item::LingeringPotion: return 756;\n\t\t\tcase Item::LlamaSpawnEgg: return 652;\n\t\t\tcase Item::MagentaBanner: return 732;\n\t\t\tcase Item::MagentaBed: return 593;\n\t\t\tcase Item::MagentaCarpet: return 284;\n\t\t\tcase Item::MagentaConcrete: return 397;\n\t\t\tcase Item::MagentaConcretePowder: return 413;\n\t\t\tcase Item::MagentaDye: return 585;\n\t\t\tcase Item::MagentaGlazedTerracotta: return 381;\n\t\t\tcase Item::MagentaShulkerBox: return 365;\n\t\t\tcase Item::MagentaStainedGlass: return 313;\n\t\t\tcase Item::MagentaStainedGlassPane: return 329;\n\t\t\tcase Item::MagentaTerracotta: return 265;\n\t\t\tcase Item::MagentaWool: return 84;\n\t\t\tcase Item::MagmaBlock: return 356;\n\t\t\tcase Item::MagmaCream: return 629;\n\t\t\tcase Item::MagmaCubeSpawnEgg: return 653;\n\t\t\tcase Item::Map: return 696;\n\t\t\tcase Item::Melon: return 208;\n\t\t\tcase Item::MelonSeeds: return 613;\n\t\t\tcase Item::MelonSlice: return 610;\n\t\t\tcase Item::MilkBucket: return 546;\n\t\t\tcase Item::Minecart: return 540;\n\t\t\tcase Item::MooshroomSpawnEgg: return 654;\n\t\t\tcase Item::MossyCobblestone: return 138;\n\t\t\tcase Item::MossyCobblestoneWall: return 240;\n\t\t\tcase Item::MossyStoneBricks: return 200;\n\t\t\tcase Item::MuleSpawnEgg: return 655;\n\t\t\tcase Item::MushroomStem: return 205;\n\t\t\tcase Item::MushroomStew: return 494;\n\t\t\tcase Item::MusicDisc11: return 779;\n\t\t\tcase Item::MusicDisc13: return 769;\n\t\t\tcase Item::MusicDiscBlocks: return 771;\n\t\t\tcase Item::MusicDiscCat: return 770;\n\t\t\tcase Item::MusicDiscChirp: return 772;\n\t\t\tcase Item::MusicDiscFar: return 773;\n\t\t\tcase Item::MusicDiscMall: return 774;\n\t\t\tcase Item::MusicDiscMellohi: return 775;\n\t\t\tcase Item::MusicDiscStal: return 776;\n\t\t\tcase Item::MusicDiscStrad: return 777;\n\t\t\tcase Item::MusicDiscWait: return 780;\n\t\t\tcase Item::MusicDiscWard: return 778;\n\t\t\tcase Item::Mutton: return 728;\n\t\t\tcase Item::Mycelium: return 218;\n\t\t\tcase Item::NameTag: return 726;\n\t\t\tcase Item::NautilusShell: return 783;\n\t\t\tcase Item::NetherBrick: return 710;\n\t\t\tcase Item::NetherBrickFence: return 221;\n\t\t\tcase Item::NetherBrickSlab: return 124;\n\t\t\tcase Item::NetherBrickStairs: return 222;\n\t\t\tcase Item::NetherBricks: return 220;\n\t\t\tcase Item::NetherQuartzOre: return 255;\n\t\t\tcase Item::NetherStar: return 705;\n\t\t\tcase Item::NetherWart: return 623;\n\t\t\tcase Item::NetherWartBlock: return 357;\n\t\t\tcase Item::Netherrack: return 183;\n\t\t\tcase Item::NoteBlock: return 71;\n\t\t\tcase Item::OakBoat: return 544;\n\t\t\tcase Item::OakButton: return 241;\n\t\t\tcase Item::OakDoor: return 456;\n\t\t\tcase Item::OakFence: return 175;\n\t\t\tcase Item::OakFenceGate: return 210;\n\t\t\tcase Item::OakLeaves: return 56;\n\t\t\tcase Item::OakLog: return 32;\n\t\t\tcase Item::OakPlanks: return 13;\n\t\t\tcase Item::OakPressurePlate: return 160;\n\t\t\tcase Item::OakSapling: return 19;\n\t\t\tcase Item::OakSlab: return 112;\n\t\t\tcase Item::OakStairs: return 148;\n\t\t\tcase Item::OakTrapdoor: return 187;\n\t\t\tcase Item::OakWood: return 50;\n\t\t\tcase Item::Observer: return 361;\n\t\t\tcase Item::Obsidian: return 139;\n\t\t\tcase Item::OcelotSpawnEgg: return 656;\n\t\t\tcase Item::OrangeBanner: return 731;\n\t\t\tcase Item::OrangeBed: return 592;\n\t\t\tcase Item::OrangeCarpet: return 283;\n\t\t\tcase Item::OrangeConcrete: return 396;\n\t\t\tcase Item::OrangeConcretePowder: return 412;\n\t\t\tcase Item::OrangeDye: return 586;\n\t\t\tcase Item::OrangeGlazedTerracotta: return 380;\n\t\t\tcase Item::OrangeShulkerBox: return 364;\n\t\t\tcase Item::OrangeStainedGlass: return 312;\n\t\t\tcase Item::OrangeStainedGlassPane: return 328;\n\t\t\tcase Item::OrangeTerracotta: return 264;\n\t\t\tcase Item::OrangeTulip: return 104;\n\t\t\tcase Item::OrangeWool: return 83;\n\t\t\tcase Item::OxeyeDaisy: return 107;\n\t\t\tcase Item::PackedIce: return 300;\n\t\t\tcase Item::Painting: return 533;\n\t\t\tcase Item::Paper: return 556;\n\t\t\tcase Item::ParrotSpawnEgg: return 657;\n\t\t\tcase Item::Peony: return 308;\n\t\t\tcase Item::PetrifiedOakSlab: return 120;\n\t\t\tcase Item::PhantomMembrane: return 782;\n\t\t\tcase Item::PhantomSpawnEgg: return 658;\n\t\t\tcase Item::PigSpawnEgg: return 659;\n\t\t\tcase Item::PinkBanner: return 736;\n\t\t\tcase Item::PinkBed: return 597;\n\t\t\tcase Item::PinkCarpet: return 288;\n\t\t\tcase Item::PinkConcrete: return 401;\n\t\t\tcase Item::PinkConcretePowder: return 417;\n\t\t\tcase Item::PinkDye: return 581;\n\t\t\tcase Item::PinkGlazedTerracotta: return 385;\n\t\t\tcase Item::PinkShulkerBox: return 369;\n\t\t\tcase Item::PinkStainedGlass: return 317;\n\t\t\tcase Item::PinkStainedGlassPane: return 333;\n\t\t\tcase Item::PinkTerracotta: return 269;\n\t\t\tcase Item::PinkTulip: return 106;\n\t\t\tcase Item::PinkWool: return 88;\n\t\t\tcase Item::Piston: return 81;\n\t\t\tcase Item::PlayerHead: return 700;\n\t\t\tcase Item::Podzol: return 11;\n\t\t\tcase Item::PoisonousPotato: return 695;\n\t\t\tcase Item::PolarBearSpawnEgg: return 660;\n\t\t\tcase Item::PolishedAndesite: return 7;\n\t\t\tcase Item::PolishedDiorite: return 5;\n\t\t\tcase Item::PolishedGranite: return 3;\n\t\t\tcase Item::PoppedChorusFruit: return 748;\n\t\t\tcase Item::Poppy: return 99;\n\t\t\tcase Item::Porkchop: return 531;\n\t\t\tcase Item::Potato: return 693;\n\t\t\tcase Item::Potion: return 624;\n\t\t\tcase Item::PoweredRail: return 72;\n\t\t\tcase Item::Prismarine: return 343;\n\t\t\tcase Item::PrismarineBrickSlab: return 129;\n\t\t\tcase Item::PrismarineBrickStairs: return 347;\n\t\t\tcase Item::PrismarineBricks: return 344;\n\t\t\tcase Item::PrismarineCrystals: return 715;\n\t\t\tcase Item::PrismarineShard: return 714;\n\t\t\tcase Item::PrismarineSlab: return 128;\n\t\t\tcase Item::PrismarineStairs: return 346;\n\t\t\tcase Item::Pufferfish: return 569;\n\t\t\tcase Item::PufferfishBucket: return 547;\n\t\t\tcase Item::PufferfishSpawnEgg: return 661;\n\t\t\tcase Item::Pumpkin: return 181;\n\t\t\tcase Item::PumpkinPie: return 706;\n\t\t\tcase Item::PumpkinSeeds: return 612;\n\t\t\tcase Item::PurpleBanner: return 740;\n\t\t\tcase Item::PurpleBed: return 601;\n\t\t\tcase Item::PurpleCarpet: return 292;\n\t\t\tcase Item::PurpleConcrete: return 405;\n\t\t\tcase Item::PurpleConcretePowder: return 421;\n\t\t\tcase Item::PurpleDye: return 577;\n\t\t\tcase Item::PurpleGlazedTerracotta: return 389;\n\t\t\tcase Item::PurpleShulkerBox: return 373;\n\t\t\tcase Item::PurpleStainedGlass: return 321;\n\t\t\tcase Item::PurpleStainedGlassPane: return 337;\n\t\t\tcase Item::PurpleTerracotta: return 273;\n\t\t\tcase Item::PurpleWool: return 92;\n\t\t\tcase Item::PurpurBlock: return 144;\n\t\t\tcase Item::PurpurPillar: return 145;\n\t\t\tcase Item::PurpurSlab: return 127;\n\t\t\tcase Item::PurpurStairs: return 146;\n\t\t\tcase Item::Quartz: return 711;\n\t\t\tcase Item::QuartzBlock: return 258;\n\t\t\tcase Item::QuartzPillar: return 259;\n\t\t\tcase Item::QuartzSlab: return 125;\n\t\t\tcase Item::QuartzStairs: return 260;\n\t\t\tcase Item::Rabbit: return 716;\n\t\t\tcase Item::RabbitFoot: return 719;\n\t\t\tcase Item::RabbitHide: return 720;\n\t\t\tcase Item::RabbitSpawnEgg: return 662;\n\t\t\tcase Item::RabbitStew: return 718;\n\t\t\tcase Item::Rail: return 156;\n\t\t\tcase Item::RedBanner: return 744;\n\t\t\tcase Item::RedBed: return 605;\n\t\t\tcase Item::RedCarpet: return 296;\n\t\t\tcase Item::RedConcrete: return 409;\n\t\t\tcase Item::RedConcretePowder: return 425;\n\t\t\tcase Item::RedGlazedTerracotta: return 393;\n\t\t\tcase Item::RedMushroom: return 109;\n\t\t\tcase Item::RedMushroomBlock: return 204;\n\t\t\tcase Item::RedNetherBricks: return 358;\n\t\t\tcase Item::RedSand: return 27;\n\t\t\tcase Item::RedSandstone: return 350;\n\t\t\tcase Item::RedSandstoneSlab: return 126;\n\t\t\tcase Item::RedSandstoneStairs: return 353;\n\t\t\tcase Item::RedShulkerBox: return 377;\n\t\t\tcase Item::RedStainedGlass: return 325;\n\t\t\tcase Item::RedStainedGlassPane: return 341;\n\t\t\tcase Item::RedTerracotta: return 277;\n\t\t\tcase Item::RedTulip: return 103;\n\t\t\tcase Item::RedWool: return 96;\n\t\t\tcase Item::Redstone: return 542;\n\t\t\tcase Item::RedstoneBlock: return 254;\n\t\t\tcase Item::RedstoneLamp: return 228;\n\t\t\tcase Item::RedstoneOre: return 166;\n\t\t\tcase Item::RedstoneTorch: return 167;\n\t\t\tcase Item::Repeater: return 462;\n\t\t\tcase Item::RepeatingCommandBlock: return 354;\n\t\t\tcase Item::RoseBush: return 307;\n\t\t\tcase Item::RedDye: return 573;\n\t\t\tcase Item::RottenFlesh: return 618;\n\t\t\tcase Item::Saddle: return 541;\n\t\t\tcase Item::Salmon: return 567;\n\t\t\tcase Item::SalmonBucket: return 548;\n\t\t\tcase Item::SalmonSpawnEgg: return 663;\n\t\t\tcase Item::Sand: return 26;\n\t\t\tcase Item::Sandstone: return 68;\n\t\t\tcase Item::SandstoneSlab: return 119;\n\t\t\tcase Item::SandstoneStairs: return 229;\n\t\t\tcase Item::Scute: return 466;\n\t\t\tcase Item::SeaLantern: return 349;\n\t\t\tcase Item::SeaPickle: return 80;\n\t\t\tcase Item::Seagrass: return 79;\n\t\t\tcase Item::Shears: return 609;\n\t\t\tcase Item::SheepSpawnEgg: return 664;\n\t\t\tcase Item::Shield: return 757;\n\t\t\tcase Item::ShulkerBox: return 362;\n\t\t\tcase Item::ShulkerShell: return 765;\n\t\t\tcase Item::ShulkerSpawnEgg: return 665;\n\t\t\tcase Item::OakSign: return 536;\n\t\t\tcase Item::SilverfishSpawnEgg: return 666;\n\t\t\tcase Item::SkeletonHorseSpawnEgg: return 668;\n\t\t\tcase Item::SkeletonSkull: return 698;\n\t\t\tcase Item::SkeletonSpawnEgg: return 667;\n\t\t\tcase Item::SlimeBall: return 558;\n\t\t\tcase Item::SlimeBlock: return 303;\n\t\t\tcase Item::SlimeSpawnEgg: return 669;\n\t\t\tcase Item::SmoothQuartz: return 131;\n\t\t\tcase Item::SmoothRedSandstone: return 132;\n\t\t\tcase Item::SmoothSandstone: return 133;\n\t\t\tcase Item::SmoothStone: return 134;\n\t\t\tcase Item::Snow: return 169;\n\t\t\tcase Item::SnowBlock: return 171;\n\t\t\tcase Item::Snowball: return 543;\n\t\t\tcase Item::SoulSand: return 184;\n\t\t\tcase Item::Spawner: return 147;\n\t\t\tcase Item::SpectralArrow: return 754;\n\t\t\tcase Item::SpiderEye: return 626;\n\t\t\tcase Item::SpiderSpawnEgg: return 670;\n\t\t\tcase Item::SplashPotion: return 753;\n\t\t\tcase Item::Sponge: return 62;\n\t\t\tcase Item::SpruceBoat: return 759;\n\t\t\tcase Item::SpruceButton: return 242;\n\t\t\tcase Item::SpruceDoor: return 457;\n\t\t\tcase Item::SpruceFence: return 176;\n\t\t\tcase Item::SpruceFenceGate: return 211;\n\t\t\tcase Item::SpruceLeaves: return 57;\n\t\t\tcase Item::SpruceLog: return 33;\n\t\t\tcase Item::SprucePlanks: return 14;\n\t\t\tcase Item::SprucePressurePlate: return 161;\n\t\t\tcase Item::SpruceSapling: return 20;\n\t\t\tcase Item::SpruceSlab: return 113;\n\t\t\tcase Item::SpruceStairs: return 234;\n\t\t\tcase Item::SpruceTrapdoor: return 188;\n\t\t\tcase Item::SpruceWood: return 51;\n\t\t\tcase Item::SquidSpawnEgg: return 671;\n\t\t\tcase Item::Stick: return 492;\n\t\t\tcase Item::StickyPiston: return 74;\n\t\t\tcase Item::Stone: return 1;\n\t\t\tcase Item::StoneAxe: return 487;\n\t\t\tcase Item::StoneBrickSlab: return 123;\n\t\t\tcase Item::StoneBrickStairs: return 217;\n\t\t\tcase Item::StoneBricks: return 199;\n\t\t\tcase Item::StoneButton: return 168;\n\t\t\tcase Item::StoneHoe: return 503;\n\t\t\tcase Item::StonePickaxe: return 486;\n\t\t\tcase Item::StonePressurePlate: return 159;\n\t\t\tcase Item::StoneShovel: return 485;\n\t\t\tcase Item::StoneSlab: return 118;\n\t\t\tcase Item::StoneSword: return 484;\n\t\t\tcase Item::StraySpawnEgg: return 672;\n\t\t\tcase Item::String: return 499;\n\t\t\tcase Item::StrippedAcaciaLog: return 42;\n\t\t\tcase Item::StrippedAcaciaWood: return 48;\n\t\t\tcase Item::StrippedBirchLog: return 40;\n\t\t\tcase Item::StrippedBirchWood: return 46;\n\t\t\tcase Item::StrippedDarkOakLog: return 43;\n\t\t\tcase Item::StrippedDarkOakWood: return 49;\n\t\t\tcase Item::StrippedJungleLog: return 41;\n\t\t\tcase Item::StrippedJungleWood: return 47;\n\t\t\tcase Item::StrippedOakLog: return 38;\n\t\t\tcase Item::StrippedOakWood: return 44;\n\t\t\tcase Item::StrippedSpruceLog: return 39;\n\t\t\tcase Item::StrippedSpruceWood: return 45;\n\t\t\tcase Item::StructureBlock: return 464;\n\t\t\tcase Item::StructureVoid: return 360;\n\t\t\tcase Item::Sugar: return 589;\n\t\t\tcase Item::SugarCane: return 553;\n\t\t\tcase Item::Sunflower: return 305;\n\t\t\tcase Item::TallGrass: return 309;\n\t\t\tcase Item::Terracotta: return 298;\n\t\t\tcase Item::TippedArrow: return 755;\n\t\t\tcase Item::TNT: return 136;\n\t\t\tcase Item::TNTMinecart: return 712;\n\t\t\tcase Item::Torch: return 140;\n\t\t\tcase Item::TotemOfUndying: return 764;\n\t\t\tcase Item::TrappedChest: return 250;\n\t\t\tcase Item::Trident: return 781;\n\t\t\tcase Item::TripwireHook: return 232;\n\t\t\tcase Item::TropicalFish: return 568;\n\t\t\tcase Item::TropicalFishBucket: return 550;\n\t\t\tcase Item::TropicalFishSpawnEgg: return 673;\n\t\t\tcase Item::TubeCoral: return 438;\n\t\t\tcase Item::TubeCoralBlock: return 433;\n\t\t\tcase Item::TubeCoralFan: return 443;\n\t\t\tcase Item::TurtleEgg: return 427;\n\t\t\tcase Item::TurtleHelmet: return 465;\n\t\t\tcase Item::TurtleSpawnEgg: return 674;\n\t\t\tcase Item::VexSpawnEgg: return 675;\n\t\t\tcase Item::VillagerSpawnEgg: return 676;\n\t\t\tcase Item::VindicatorSpawnEgg: return 677;\n\t\t\tcase Item::Vine: return 209;\n\t\t\tcase Item::WaterBucket: return 538;\n\t\t\tcase Item::WetSponge: return 63;\n\t\t\tcase Item::Wheat: return 508;\n\t\t\tcase Item::WheatSeeds: return 507;\n\t\t\tcase Item::WhiteBanner: return 730;\n\t\t\tcase Item::WhiteBed: return 591;\n\t\t\tcase Item::WhiteCarpet: return 282;\n\t\t\tcase Item::WhiteConcrete: return 395;\n\t\t\tcase Item::WhiteConcretePowder: return 411;\n\t\t\tcase Item::WhiteGlazedTerracotta: return 379;\n\t\t\tcase Item::WhiteShulkerBox: return 363;\n\t\t\tcase Item::WhiteStainedGlass: return 311;\n\t\t\tcase Item::WhiteStainedGlassPane: return 327;\n\t\t\tcase Item::WhiteTerracotta: return 263;\n\t\t\tcase Item::WhiteTulip: return 105;\n\t\t\tcase Item::WhiteWool: return 82;\n\t\t\tcase Item::WitchSpawnEgg: return 678;\n\t\t\tcase Item::WitherSkeletonSkull: return 699;\n\t\t\tcase Item::WitherSkeletonSpawnEgg: return 679;\n\t\t\tcase Item::WolfSpawnEgg: return 680;\n\t\t\tcase Item::WoodenAxe: return 483;\n\t\t\tcase Item::WoodenHoe: return 502;\n\t\t\tcase Item::WoodenPickaxe: return 482;\n\t\t\tcase Item::WoodenShovel: return 481;\n\t\t\tcase Item::WoodenSword: return 480;\n\t\t\tcase Item::WritableBook: return 687;\n\t\t\tcase Item::WrittenBook: return 688;\n\t\t\tcase Item::YellowBanner: return 734;\n\t\t\tcase Item::YellowBed: return 595;\n\t\t\tcase Item::YellowCarpet: return 286;\n\t\t\tcase Item::YellowConcrete: return 399;\n\t\t\tcase Item::YellowConcretePowder: return 415;\n\t\t\tcase Item::YellowGlazedTerracotta: return 383;\n\t\t\tcase Item::YellowShulkerBox: return 367;\n\t\t\tcase Item::YellowStainedGlass: return 315;\n\t\t\tcase Item::YellowStainedGlassPane: return 331;\n\t\t\tcase Item::YellowTerracotta: return 267;\n\t\t\tcase Item::YellowWool: return 86;\n\t\t\tcase Item::ZombieHead: return 701;\n\t\t\tcase Item::ZombieHorseSpawnEgg: return 682;\n\t\t\tcase Item::ZombiePigmanSpawnEgg: return 683;\n\t\t\tcase Item::ZombieSpawnEgg: return 681;\n\t\t\tcase Item::ZombieVillagerSpawnEgg: return 684;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const CustomStatistic ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase CustomStatistic::AnimalsBred: return 25;\n\t\t\tcase CustomStatistic::AviateOneCm: return 17;\n\t\t\tcase CustomStatistic::BoatOneCm: return 14;\n\t\t\tcase CustomStatistic::CleanArmor: return 33;\n\t\t\tcase CustomStatistic::CleanBanner: return 34;\n\t\t\tcase CustomStatistic::ClimbOneCm: return 10;\n\t\t\tcase CustomStatistic::CrouchOneCm: return 6;\n\t\t\tcase CustomStatistic::DamageDealt: return 21;\n\t\t\tcase CustomStatistic::DamageTaken: return 22;\n\t\t\tcase CustomStatistic::Deaths: return 23;\n\t\t\tcase CustomStatistic::Drop: return 20;\n\t\t\tcase CustomStatistic::EatCakeSlice: return 30;\n\t\t\tcase CustomStatistic::EnchantItem: return 45;\n\t\t\tcase CustomStatistic::FallOneCm: return 9;\n\t\t\tcase CustomStatistic::FillCauldron: return 31;\n\t\t\tcase CustomStatistic::FishCaught: return 27;\n\t\t\tcase CustomStatistic::FlyOneCm: return 11;\n\t\t\tcase CustomStatistic::HorseOneCm: return 16;\n\t\t\tcase CustomStatistic::InspectDispenser: return 39;\n\t\t\tcase CustomStatistic::InspectDropper: return 37;\n\t\t\tcase CustomStatistic::InspectHopper: return 38;\n\t\t\tcase CustomStatistic::InteractWithBeacon: return 36;\n\t\t\tcase CustomStatistic::InteractWithBrewingstand: return 35;\n\t\t\tcase CustomStatistic::InteractWithCraftingTable: return 48;\n\t\t\tcase CustomStatistic::InteractWithFurnace: return 47;\n\t\t\tcase CustomStatistic::Jump: return 19;\n\t\t\tcase CustomStatistic::LeaveGame: return 0;\n\t\t\tcase CustomStatistic::MinecartOneCm: return 13;\n\t\t\tcase CustomStatistic::MobKills: return 24;\n\t\t\tcase CustomStatistic::OpenChest: return 49;\n\t\t\tcase CustomStatistic::OpenEnderchest: return 44;\n\t\t\tcase CustomStatistic::OpenShulkerBox: return 51;\n\t\t\tcase CustomStatistic::PigOneCm: return 15;\n\t\t\tcase CustomStatistic::PlayerKills: return 26;\n\t\t\tcase CustomStatistic::PlayNoteblock: return 40;\n\t\t\tcase CustomStatistic::PlayOneMinute: return 1;\n\t\t\tcase CustomStatistic::PlayRecord: return 46;\n\t\t\tcase CustomStatistic::PotFlower: return 42;\n\t\t\tcase CustomStatistic::SleepInBed: return 50;\n\t\t\tcase CustomStatistic::SneakTime: return 4;\n\t\t\tcase CustomStatistic::SprintOneCm: return 7;\n\t\t\tcase CustomStatistic::SwimOneCm: return 8;\n\t\t\tcase CustomStatistic::TalkedToVillager: return 28;\n\t\t\tcase CustomStatistic::TimeSinceDeath: return 2;\n\t\t\tcase CustomStatistic::TimeSinceRest: return 3;\n\t\t\tcase CustomStatistic::TradedWithVillager: return 29;\n\t\t\tcase CustomStatistic::TriggerTrappedChest: return 43;\n\t\t\tcase CustomStatistic::TuneNoteblock: return 41;\n\t\t\tcase CustomStatistic::UseCauldron: return 32;\n\t\t\tcase CustomStatistic::WalkOneCm: return 5;\n\t\t\tcase CustomStatistic::WalkOnWaterOneCm: return 18;\n\t\t\tcase CustomStatistic::WalkUnderWaterOneCm: return 12;\n\t\t\tdefault: return UInt32(-1);\n\t\t}\n\t}\n\n\tItem ToItem(const UInt32 ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase 762: return Item::AcaciaBoat;\n\t\t\tcase 245: return Item::AcaciaButton;\n\t\t\tcase 460: return Item::AcaciaDoor;\n\t\t\tcase 179: return Item::AcaciaFence;\n\t\t\tcase 214: return Item::AcaciaFenceGate;\n\t\t\tcase 60: return Item::AcaciaLeaves;\n\t\t\tcase 36: return Item::AcaciaLog;\n\t\t\tcase 17: return Item::AcaciaPlanks;\n\t\t\tcase 164: return Item::AcaciaPressurePlate;\n\t\t\tcase 23: return Item::AcaciaSapling;\n\t\t\tcase 116: return Item::AcaciaSlab;\n\t\t\tcase 301: return Item::AcaciaStairs;\n\t\t\tcase 191: return Item::AcaciaTrapdoor;\n\t\t\tcase 54: return Item::AcaciaWood;\n\t\t\tcase 261: return Item::ActivatorRail;\n\t\t\tcase -0: return Item::Air;\n\t\t\tcase 101: return Item::Allium;\n\t\t\tcase 6: return Item::Andesite;\n\t\t\tcase 247: return Item::Anvil;\n\t\t\tcase 471: return Item::Apple;\n\t\t\tcase 721: return Item::ArmorStand;\n\t\t\tcase 473: return Item::Arrow;\n\t\t\tcase 102: return Item::AzureBluet;\n\t\t\tcase 694: return Item::BakedPotato;\n\t\t\tcase 279: return Item::Barrier;\n\t\t\tcase 634: return Item::BatSpawnEgg;\n\t\t\tcase 238: return Item::Beacon;\n\t\t\tcase 25: return Item::Bedrock;\n\t\t\tcase 614: return Item::Beef;\n\t\t\tcase 749: return Item::Beetroot;\n\t\t\tcase 750: return Item::BeetrootSeeds;\n\t\t\tcase 751: return Item::BeetrootSoup;\n\t\t\tcase 760: return Item::BirchBoat;\n\t\t\tcase 243: return Item::BirchButton;\n\t\t\tcase 458: return Item::BirchDoor;\n\t\t\tcase 177: return Item::BirchFence;\n\t\t\tcase 212: return Item::BirchFenceGate;\n\t\t\tcase 58: return Item::BirchLeaves;\n\t\t\tcase 34: return Item::BirchLog;\n\t\t\tcase 15: return Item::BirchPlanks;\n\t\t\tcase 162: return Item::BirchPressurePlate;\n\t\t\tcase 21: return Item::BirchSapling;\n\t\t\tcase 114: return Item::BirchSlab;\n\t\t\tcase 235: return Item::BirchStairs;\n\t\t\tcase 189: return Item::BirchTrapdoor;\n\t\t\tcase 52: return Item::BirchWood;\n\t\t\tcase 745: return Item::BlackBanner;\n\t\t\tcase 606: return Item::BlackBed;\n\t\t\tcase 297: return Item::BlackCarpet;\n\t\t\tcase 410: return Item::BlackConcrete;\n\t\t\tcase 426: return Item::BlackConcretePowder;\n\t\t\tcase 394: return Item::BlackGlazedTerracotta;\n\t\t\tcase 378: return Item::BlackShulkerBox;\n\t\t\tcase 326: return Item::BlackStainedGlass;\n\t\t\tcase 342: return Item::BlackStainedGlassPane;\n\t\t\tcase 278: return Item::BlackTerracotta;\n\t\t\tcase 97: return Item::BlackWool;\n\t\t\tcase 628: return Item::BlazePowder;\n\t\t\tcase 620: return Item::BlazeRod;\n\t\t\tcase 635: return Item::BlazeSpawnEgg;\n\t\t\tcase 741: return Item::BlueBanner;\n\t\t\tcase 602: return Item::BlueBed;\n\t\t\tcase 293: return Item::BlueCarpet;\n\t\t\tcase 406: return Item::BlueConcrete;\n\t\t\tcase 422: return Item::BlueConcretePowder;\n\t\t\tcase 390: return Item::BlueGlazedTerracotta;\n\t\t\tcase 453: return Item::BlueIce;\n\t\t\tcase 100: return Item::BlueOrchid;\n\t\t\tcase 374: return Item::BlueShulkerBox;\n\t\t\tcase 322: return Item::BlueStainedGlass;\n\t\t\tcase 338: return Item::BlueStainedGlassPane;\n\t\t\tcase 274: return Item::BlueTerracotta;\n\t\t\tcase 93: return Item::BlueWool;\n\t\t\tcase 588: return Item::Bone;\n\t\t\tcase 359: return Item::BoneBlock;\n\t\t\tcase 587: return Item::BoneMeal;\n\t\t\tcase 557: return Item::Book;\n\t\t\tcase 137: return Item::Bookshelf;\n\t\t\tcase 472: return Item::Bow;\n\t\t\tcase 493: return Item::Bowl;\n\t\t\tcase 439: return Item::BrainCoral;\n\t\t\tcase 434: return Item::BrainCoralBlock;\n\t\t\tcase 444: return Item::BrainCoralFan;\n\t\t\tcase 509: return Item::Bread;\n\t\t\tcase 630: return Item::BrewingStand;\n\t\t\tcase 551: return Item::Brick;\n\t\t\tcase 122: return Item::BrickSlab;\n\t\t\tcase 216: return Item::BrickStairs;\n\t\t\tcase 135: return Item::Bricks;\n\t\t\tcase 742: return Item::BrownBanner;\n\t\t\tcase 603: return Item::BrownBed;\n\t\t\tcase 294: return Item::BrownCarpet;\n\t\t\tcase 407: return Item::BrownConcrete;\n\t\t\tcase 423: return Item::BrownConcretePowder;\n\t\t\tcase 391: return Item::BrownGlazedTerracotta;\n\t\t\tcase 108: return Item::BrownMushroom;\n\t\t\tcase 203: return Item::BrownMushroomBlock;\n\t\t\tcase 375: return Item::BrownShulkerBox;\n\t\t\tcase 323: return Item::BrownStainedGlass;\n\t\t\tcase 339: return Item::BrownStainedGlassPane;\n\t\t\tcase 275: return Item::BrownTerracotta;\n\t\t\tcase 94: return Item::BrownWool;\n\t\t\tcase 440: return Item::BubbleCoral;\n\t\t\tcase 435: return Item::BubbleCoralBlock;\n\t\t\tcase 445: return Item::BubbleCoralFan;\n\t\t\tcase 537: return Item::Bucket;\n\t\t\tcase 172: return Item::Cactus;\n\t\t\tcase 574: return Item::GreenDye;\n\t\t\tcase 590: return Item::Cake;\n\t\t\tcase 692: return Item::Carrot;\n\t\t\tcase 704: return Item::CarrotOnAStick;\n\t\t\tcase 182: return Item::CarvedPumpkin;\n\t\t\tcase 631: return Item::Cauldron;\n\t\t\tcase 636: return Item::CaveSpiderSpawnEgg;\n\t\t\tcase 355: return Item::ChainCommandBlock;\n\t\t\tcase 517: return Item::ChainmailBoots;\n\t\t\tcase 515: return Item::ChainmailChestplate;\n\t\t\tcase 514: return Item::ChainmailHelmet;\n\t\t\tcase 516: return Item::ChainmailLeggings;\n\t\t\tcase 475: return Item::Charcoal;\n\t\t\tcase 149: return Item::Chest;\n\t\t\tcase 559: return Item::ChestMinecart;\n\t\t\tcase 616: return Item::Chicken;\n\t\t\tcase 637: return Item::ChickenSpawnEgg;\n\t\t\tcase 248: return Item::ChippedAnvil;\n\t\t\tcase 257: return Item::ChiseledQuartzBlock;\n\t\t\tcase 351: return Item::ChiseledRedSandstone;\n\t\t\tcase 69: return Item::ChiseledSandstone;\n\t\t\tcase 202: return Item::ChiseledStoneBricks;\n\t\t\tcase 143: return Item::ChorusFlower;\n\t\t\tcase 747: return Item::ChorusFruit;\n\t\t\tcase 142: return Item::ChorusPlant;\n\t\t\tcase 173: return Item::Clay;\n\t\t\tcase 552: return Item::ClayBall;\n\t\t\tcase 564: return Item::Clock;\n\t\t\tcase 474: return Item::Coal;\n\t\t\tcase 299: return Item::CoalBlock;\n\t\t\tcase 31: return Item::CoalOre;\n\t\t\tcase 10: return Item::CoarseDirt;\n\t\t\tcase 12: return Item::Cobblestone;\n\t\t\tcase 121: return Item::CobblestoneSlab;\n\t\t\tcase 157: return Item::CobblestoneStairs;\n\t\t\tcase 239: return Item::CobblestoneWall;\n\t\t\tcase 75: return Item::Cobweb;\n\t\t\tcase 575: return Item::CocoaBeans;\n\t\t\tcase 566: return Item::Cod;\n\t\t\tcase 549: return Item::CodBucket;\n\t\t\tcase 638: return Item::CodSpawnEgg;\n\t\t\tcase 237: return Item::CommandBlock;\n\t\t\tcase 727: return Item::CommandBlockMinecart;\n\t\t\tcase 463: return Item::Comparator;\n\t\t\tcase 562: return Item::Compass;\n\t\t\tcase 454: return Item::Conduit;\n\t\t\tcase 615: return Item::CookedBeef;\n\t\t\tcase 617: return Item::CookedChicken;\n\t\t\tcase 570: return Item::CookedCod;\n\t\t\tcase 729: return Item::CookedMutton;\n\t\t\tcase 532: return Item::CookedPorkchop;\n\t\t\tcase 717: return Item::CookedRabbit;\n\t\t\tcase 571: return Item::CookedSalmon;\n\t\t\tcase 607: return Item::Cookie;\n\t\t\tcase 639: return Item::CowSpawnEgg;\n\t\t\tcase 201: return Item::CrackedStoneBricks;\n\t\t\tcase 152: return Item::CraftingTable;\n\t\t\tcase 702: return Item::CreeperHead;\n\t\t\tcase 640: return Item::CreeperSpawnEgg;\n\t\t\tcase 352: return Item::CutRedSandstone;\n\t\t\tcase 70: return Item::CutSandstone;\n\t\t\tcase 739: return Item::CyanBanner;\n\t\t\tcase 600: return Item::CyanBed;\n\t\t\tcase 291: return Item::CyanCarpet;\n\t\t\tcase 404: return Item::CyanConcrete;\n\t\t\tcase 420: return Item::CyanConcretePowder;\n\t\t\tcase 578: return Item::CyanDye;\n\t\t\tcase 388: return Item::CyanGlazedTerracotta;\n\t\t\tcase 372: return Item::CyanShulkerBox;\n\t\t\tcase 320: return Item::CyanStainedGlass;\n\t\t\tcase 336: return Item::CyanStainedGlassPane;\n\t\t\tcase 272: return Item::CyanTerracotta;\n\t\t\tcase 91: return Item::CyanWool;\n\t\t\tcase 249: return Item::DamagedAnvil;\n\t\t\tcase 98: return Item::Dandelion;\n\t\t\tcase 583: return Item::YellowDye;\n\t\t\tcase 763: return Item::DarkOakBoat;\n\t\t\tcase 246: return Item::DarkOakButton;\n\t\t\tcase 461: return Item::DarkOakDoor;\n\t\t\tcase 180: return Item::DarkOakFence;\n\t\t\tcase 215: return Item::DarkOakFenceGate;\n\t\t\tcase 61: return Item::DarkOakLeaves;\n\t\t\tcase 37: return Item::DarkOakLog;\n\t\t\tcase 18: return Item::DarkOakPlanks;\n\t\t\tcase 165: return Item::DarkOakPressurePlate;\n\t\t\tcase 24: return Item::DarkOakSapling;\n\t\t\tcase 117: return Item::DarkOakSlab;\n\t\t\tcase 302: return Item::DarkOakStairs;\n\t\t\tcase 192: return Item::DarkOakTrapdoor;\n\t\t\tcase 55: return Item::DarkOakWood;\n\t\t\tcase 345: return Item::DarkPrismarine;\n\t\t\tcase 130: return Item::DarkPrismarineSlab;\n\t\t\tcase 348: return Item::DarkPrismarineStairs;\n\t\t\tcase 253: return Item::DaylightDetector;\n\t\t\tcase 429: return Item::DeadBrainCoralBlock;\n\t\t\tcase 449: return Item::DeadBrainCoralFan;\n\t\t\tcase 430: return Item::DeadBubbleCoralBlock;\n\t\t\tcase 450: return Item::DeadBubbleCoralFan;\n\t\t\tcase 78: return Item::DeadBush;\n\t\t\tcase 431: return Item::DeadFireCoralBlock;\n\t\t\tcase 451: return Item::DeadFireCoralFan;\n\t\t\tcase 432: return Item::DeadHornCoralBlock;\n\t\t\tcase 452: return Item::DeadHornCoralFan;\n\t\t\tcase 428: return Item::DeadTubeCoralBlock;\n\t\t\tcase 448: return Item::DeadTubeCoralFan;\n\t\t\tcase 768: return Item::DebugStick;\n\t\t\tcase 73: return Item::DetectorRail;\n\t\t\tcase 476: return Item::Diamond;\n\t\t\tcase 491: return Item::DiamondAxe;\n\t\t\tcase 151: return Item::DiamondBlock;\n\t\t\tcase 525: return Item::DiamondBoots;\n\t\t\tcase 523: return Item::DiamondChestplate;\n\t\t\tcase 522: return Item::DiamondHelmet;\n\t\t\tcase 505: return Item::DiamondHoe;\n\t\t\tcase 724: return Item::DiamondHorseArmor;\n\t\t\tcase 524: return Item::DiamondLeggings;\n\t\t\tcase 150: return Item::DiamondOre;\n\t\t\tcase 490: return Item::DiamondPickaxe;\n\t\t\tcase 489: return Item::DiamondShovel;\n\t\t\tcase 488: return Item::DiamondSword;\n\t\t\tcase 4: return Item::Diorite;\n\t\t\tcase 9: return Item::Dirt;\n\t\t\tcase 67: return Item::Dispenser;\n\t\t\tcase 641: return Item::DolphinSpawnEgg;\n\t\t\tcase 642: return Item::DonkeySpawnEgg;\n\t\t\tcase 752: return Item::DragonBreath;\n\t\t\tcase 227: return Item::DragonEgg;\n\t\t\tcase 703: return Item::DragonHead;\n\t\t\tcase 611: return Item::DriedKelp;\n\t\t\tcase 555: return Item::DriedKelpBlock;\n\t\t\tcase 262: return Item::Dropper;\n\t\t\tcase 643: return Item::DrownedSpawnEgg;\n\t\t\tcase 561: return Item::Egg;\n\t\t\tcase 644: return Item::ElderGuardianSpawnEgg;\n\t\t\tcase 758: return Item::Elytra;\n\t\t\tcase 689: return Item::Emerald;\n\t\t\tcase 233: return Item::EmeraldBlock;\n\t\t\tcase 230: return Item::EmeraldOre;\n\t\t\tcase 709: return Item::EnchantedBook;\n\t\t\tcase 535: return Item::EnchantedGoldenApple;\n\t\t\tcase 223: return Item::EnchantingTable;\n\t\t\tcase 746: return Item::EndCrystal;\n\t\t\tcase 224: return Item::EndPortalFrame;\n\t\t\tcase 141: return Item::EndRod;\n\t\t\tcase 225: return Item::EndStone;\n\t\t\tcase 226: return Item::EndStoneBricks;\n\t\t\tcase 231: return Item::EnderChest;\n\t\t\tcase 632: return Item::EnderEye;\n\t\t\tcase 619: return Item::EnderPearl;\n\t\t\tcase 645: return Item::EndermanSpawnEgg;\n\t\t\tcase 646: return Item::EndermiteSpawnEgg;\n\t\t\tcase 647: return Item::EvokerSpawnEgg;\n\t\t\tcase 685: return Item::ExperienceBottle;\n\t\t\tcase 153: return Item::Farmland;\n\t\t\tcase 500: return Item::Feather;\n\t\t\tcase 627: return Item::FermentedSpiderEye;\n\t\t\tcase 77: return Item::Fern;\n\t\t\tcase 608: return Item::FilledMap;\n\t\t\tcase 686: return Item::FireCharge;\n\t\t\tcase 441: return Item::FireCoral;\n\t\t\tcase 436: return Item::FireCoralBlock;\n\t\t\tcase 446: return Item::FireCoralFan;\n\t\t\tcase 707: return Item::FireworkRocket;\n\t\t\tcase 708: return Item::FireworkStar;\n\t\t\tcase 563: return Item::FishingRod;\n\t\t\tcase 530: return Item::Flint;\n\t\t\tcase 470: return Item::FlintAndSteel;\n\t\t\tcase 691: return Item::FlowerPot;\n\t\t\tcase 154: return Item::Furnace;\n\t\t\tcase 560: return Item::FurnaceMinecart;\n\t\t\tcase 648: return Item::GhastSpawnEgg;\n\t\t\tcase 621: return Item::GhastTear;\n\t\t\tcase 64: return Item::Glass;\n\t\t\tcase 625: return Item::GlassBottle;\n\t\t\tcase 207: return Item::GlassPane;\n\t\t\tcase 633: return Item::GlisteringMelonSlice;\n\t\t\tcase 185: return Item::Glowstone;\n\t\t\tcase 565: return Item::GlowstoneDust;\n\t\t\tcase 110: return Item::GoldBlock;\n\t\t\tcase 478: return Item::GoldIngot;\n\t\t\tcase 622: return Item::GoldNugget;\n\t\t\tcase 29: return Item::GoldOre;\n\t\t\tcase 534: return Item::GoldenApple;\n\t\t\tcase 498: return Item::GoldenAxe;\n\t\t\tcase 529: return Item::GoldenBoots;\n\t\t\tcase 697: return Item::GoldenCarrot;\n\t\t\tcase 527: return Item::GoldenChestplate;\n\t\t\tcase 526: return Item::GoldenHelmet;\n\t\t\tcase 506: return Item::GoldenHoe;\n\t\t\tcase 723: return Item::GoldenHorseArmor;\n\t\t\tcase 528: return Item::GoldenLeggings;\n\t\t\tcase 497: return Item::GoldenPickaxe;\n\t\t\tcase 496: return Item::GoldenShovel;\n\t\t\tcase 495: return Item::GoldenSword;\n\t\t\tcase 2: return Item::Granite;\n\t\t\tcase 76: return Item::Grass;\n\t\t\tcase 8: return Item::GrassBlock;\n\t\t\tcase 304: return Item::GrassPath;\n\t\t\tcase 28: return Item::Gravel;\n\t\t\tcase 737: return Item::GrayBanner;\n\t\t\tcase 598: return Item::GrayBed;\n\t\t\tcase 289: return Item::GrayCarpet;\n\t\t\tcase 402: return Item::GrayConcrete;\n\t\t\tcase 418: return Item::GrayConcretePowder;\n\t\t\tcase 580: return Item::GrayDye;\n\t\t\tcase 386: return Item::GrayGlazedTerracotta;\n\t\t\tcase 370: return Item::GrayShulkerBox;\n\t\t\tcase 318: return Item::GrayStainedGlass;\n\t\t\tcase 334: return Item::GrayStainedGlassPane;\n\t\t\tcase 270: return Item::GrayTerracotta;\n\t\t\tcase 89: return Item::GrayWool;\n\t\t\tcase 743: return Item::GreenBanner;\n\t\t\tcase 604: return Item::GreenBed;\n\t\t\tcase 295: return Item::GreenCarpet;\n\t\t\tcase 408: return Item::GreenConcrete;\n\t\t\tcase 424: return Item::GreenConcretePowder;\n\t\t\tcase 392: return Item::GreenGlazedTerracotta;\n\t\t\tcase 376: return Item::GreenShulkerBox;\n\t\t\tcase 324: return Item::GreenStainedGlass;\n\t\t\tcase 340: return Item::GreenStainedGlassPane;\n\t\t\tcase 276: return Item::GreenTerracotta;\n\t\t\tcase 95: return Item::GreenWool;\n\t\t\tcase 649: return Item::GuardianSpawnEgg;\n\t\t\tcase 501: return Item::Gunpowder;\n\t\t\tcase 281: return Item::HayBale;\n\t\t\tcase 784: return Item::HeartOfTheSea;\n\t\t\tcase 252: return Item::HeavyWeightedPressurePlate;\n\t\t\tcase 256: return Item::Hopper;\n\t\t\tcase 713: return Item::HopperMinecart;\n\t\t\tcase 442: return Item::HornCoral;\n\t\t\tcase 437: return Item::HornCoralBlock;\n\t\t\tcase 447: return Item::HornCoralFan;\n\t\t\tcase 650: return Item::HorseSpawnEgg;\n\t\t\tcase 651: return Item::HuskSpawnEgg;\n\t\t\tcase 170: return Item::Ice;\n\t\t\tcase 198: return Item::InfestedChiseledStoneBricks;\n\t\t\tcase 194: return Item::InfestedCobblestone;\n\t\t\tcase 197: return Item::InfestedCrackedStoneBricks;\n\t\t\tcase 196: return Item::InfestedMossyStoneBricks;\n\t\t\tcase 193: return Item::InfestedStone;\n\t\t\tcase 195: return Item::InfestedStoneBricks;\n\t\t\tcase 572: return Item::InkSac;\n\t\t\tcase 469: return Item::IronAxe;\n\t\t\tcase 206: return Item::IronBars;\n\t\t\tcase 111: return Item::IronBlock;\n\t\t\tcase 521: return Item::IronBoots;\n\t\t\tcase 519: return Item::IronChestplate;\n\t\t\tcase 455: return Item::IronDoor;\n\t\t\tcase 518: return Item::IronHelmet;\n\t\t\tcase 504: return Item::IronHoe;\n\t\t\tcase 722: return Item::IronHorseArmor;\n\t\t\tcase 477: return Item::IronIngot;\n\t\t\tcase 520: return Item::IronLeggings;\n\t\t\tcase 766: return Item::IronNugget;\n\t\t\tcase 30: return Item::IronOre;\n\t\t\tcase 468: return Item::IronPickaxe;\n\t\t\tcase 467: return Item::IronShovel;\n\t\t\tcase 479: return Item::IronSword;\n\t\t\tcase 280: return Item::IronTrapdoor;\n\t\t\tcase 690: return Item::ItemFrame;\n\t\t\tcase 186: return Item::JackOLantern;\n\t\t\tcase 174: return Item::Jukebox;\n\t\t\tcase 761: return Item::JungleBoat;\n\t\t\tcase 244: return Item::JungleButton;\n\t\t\tcase 459: return Item::JungleDoor;\n\t\t\tcase 178: return Item::JungleFence;\n\t\t\tcase 213: return Item::JungleFenceGate;\n\t\t\tcase 59: return Item::JungleLeaves;\n\t\t\tcase 35: return Item::JungleLog;\n\t\t\tcase 16: return Item::JunglePlanks;\n\t\t\tcase 163: return Item::JunglePressurePlate;\n\t\t\tcase 22: return Item::JungleSapling;\n\t\t\tcase 115: return Item::JungleSlab;\n\t\t\tcase 236: return Item::JungleStairs;\n\t\t\tcase 190: return Item::JungleTrapdoor;\n\t\t\tcase 53: return Item::JungleWood;\n\t\t\tcase 554: return Item::Kelp;\n\t\t\tcase 767: return Item::KnowledgeBook;\n\t\t\tcase 155: return Item::Ladder;\n\t\t\tcase 66: return Item::LapisBlock;\n\t\t\tcase 576: return Item::LapisLazuli;\n\t\t\tcase 65: return Item::LapisOre;\n\t\t\tcase 310: return Item::LargeFern;\n\t\t\tcase 539: return Item::LavaBucket;\n\t\t\tcase 725: return Item::Lead;\n\t\t\tcase 545: return Item::Leather;\n\t\t\tcase 513: return Item::LeatherBoots;\n\t\t\tcase 511: return Item::LeatherChestplate;\n\t\t\tcase 510: return Item::LeatherHelmet;\n\t\t\tcase 512: return Item::LeatherLeggings;\n\t\t\tcase 158: return Item::Lever;\n\t\t\tcase 733: return Item::LightBlueBanner;\n\t\t\tcase 594: return Item::LightBlueBed;\n\t\t\tcase 285: return Item::LightBlueCarpet;\n\t\t\tcase 398: return Item::LightBlueConcrete;\n\t\t\tcase 414: return Item::LightBlueConcretePowder;\n\t\t\tcase 584: return Item::LightBlueDye;\n\t\t\tcase 382: return Item::LightBlueGlazedTerracotta;\n\t\t\tcase 366: return Item::LightBlueShulkerBox;\n\t\t\tcase 314: return Item::LightBlueStainedGlass;\n\t\t\tcase 330: return Item::LightBlueStainedGlassPane;\n\t\t\tcase 266: return Item::LightBlueTerracotta;\n\t\t\tcase 85: return Item::LightBlueWool;\n\t\t\tcase 738: return Item::LightGrayBanner;\n\t\t\tcase 599: return Item::LightGrayBed;\n\t\t\tcase 290: return Item::LightGrayCarpet;\n\t\t\tcase 403: return Item::LightGrayConcrete;\n\t\t\tcase 419: return Item::LightGrayConcretePowder;\n\t\t\tcase 579: return Item::LightGrayDye;\n\t\t\tcase 387: return Item::LightGrayGlazedTerracotta;\n\t\t\tcase 371: return Item::LightGrayShulkerBox;\n\t\t\tcase 319: return Item::LightGrayStainedGlass;\n\t\t\tcase 335: return Item::LightGrayStainedGlassPane;\n\t\t\tcase 271: return Item::LightGrayTerracotta;\n\t\t\tcase 90: return Item::LightGrayWool;\n\t\t\tcase 251: return Item::LightWeightedPressurePlate;\n\t\t\tcase 306: return Item::Lilac;\n\t\t\tcase 219: return Item::LilyPad;\n\t\t\tcase 735: return Item::LimeBanner;\n\t\t\tcase 596: return Item::LimeBed;\n\t\t\tcase 287: return Item::LimeCarpet;\n\t\t\tcase 400: return Item::LimeConcrete;\n\t\t\tcase 416: return Item::LimeConcretePowder;\n\t\t\tcase 582: return Item::LimeDye;\n\t\t\tcase 384: return Item::LimeGlazedTerracotta;\n\t\t\tcase 368: return Item::LimeShulkerBox;\n\t\t\tcase 316: return Item::LimeStainedGlass;\n\t\t\tcase 332: return Item::LimeStainedGlassPane;\n\t\t\tcase 268: return Item::LimeTerracotta;\n\t\t\tcase 87: return Item::LimeWool;\n\t\t\tcase 756: return Item::LingeringPotion;\n\t\t\tcase 652: return Item::LlamaSpawnEgg;\n\t\t\tcase 732: return Item::MagentaBanner;\n\t\t\tcase 593: return Item::MagentaBed;\n\t\t\tcase 284: return Item::MagentaCarpet;\n\t\t\tcase 397: return Item::MagentaConcrete;\n\t\t\tcase 413: return Item::MagentaConcretePowder;\n\t\t\tcase 585: return Item::MagentaDye;\n\t\t\tcase 381: return Item::MagentaGlazedTerracotta;\n\t\t\tcase 365: return Item::MagentaShulkerBox;\n\t\t\tcase 313: return Item::MagentaStainedGlass;\n\t\t\tcase 329: return Item::MagentaStainedGlassPane;\n\t\t\tcase 265: return Item::MagentaTerracotta;\n\t\t\tcase 84: return Item::MagentaWool;\n\t\t\tcase 356: return Item::MagmaBlock;\n\t\t\tcase 629: return Item::MagmaCream;\n\t\t\tcase 653: return Item::MagmaCubeSpawnEgg;\n\t\t\tcase 696: return Item::Map;\n\t\t\tcase 208: return Item::Melon;\n\t\t\tcase 613: return Item::MelonSeeds;\n\t\t\tcase 610: return Item::MelonSlice;\n\t\t\tcase 546: return Item::MilkBucket;\n\t\t\tcase 540: return Item::Minecart;\n\t\t\tcase 654: return Item::MooshroomSpawnEgg;\n\t\t\tcase 138: return Item::MossyCobblestone;\n\t\t\tcase 240: return Item::MossyCobblestoneWall;\n\t\t\tcase 200: return Item::MossyStoneBricks;\n\t\t\tcase 655: return Item::MuleSpawnEgg;\n\t\t\tcase 205: return Item::MushroomStem;\n\t\t\tcase 494: return Item::MushroomStew;\n\t\t\tcase 779: return Item::MusicDisc11;\n\t\t\tcase 769: return Item::MusicDisc13;\n\t\t\tcase 771: return Item::MusicDiscBlocks;\n\t\t\tcase 770: return Item::MusicDiscCat;\n\t\t\tcase 772: return Item::MusicDiscChirp;\n\t\t\tcase 773: return Item::MusicDiscFar;\n\t\t\tcase 774: return Item::MusicDiscMall;\n\t\t\tcase 775: return Item::MusicDiscMellohi;\n\t\t\tcase 776: return Item::MusicDiscStal;\n\t\t\tcase 777: return Item::MusicDiscStrad;\n\t\t\tcase 780: return Item::MusicDiscWait;\n\t\t\tcase 778: return Item::MusicDiscWard;\n\t\t\tcase 728: return Item::Mutton;\n\t\t\tcase 218: return Item::Mycelium;\n\t\t\tcase 726: return Item::NameTag;\n\t\t\tcase 783: return Item::NautilusShell;\n\t\t\tcase 710: return Item::NetherBrick;\n\t\t\tcase 221: return Item::NetherBrickFence;\n\t\t\tcase 124: return Item::NetherBrickSlab;\n\t\t\tcase 222: return Item::NetherBrickStairs;\n\t\t\tcase 220: return Item::NetherBricks;\n\t\t\tcase 255: return Item::NetherQuartzOre;\n\t\t\tcase 705: return Item::NetherStar;\n\t\t\tcase 623: return Item::NetherWart;\n\t\t\tcase 357: return Item::NetherWartBlock;\n\t\t\tcase 183: return Item::Netherrack;\n\t\t\tcase 71: return Item::NoteBlock;\n\t\t\tcase 544: return Item::OakBoat;\n\t\t\tcase 241: return Item::OakButton;\n\t\t\tcase 456: return Item::OakDoor;\n\t\t\tcase 175: return Item::OakFence;\n\t\t\tcase 210: return Item::OakFenceGate;\n\t\t\tcase 56: return Item::OakLeaves;\n\t\t\tcase 32: return Item::OakLog;\n\t\t\tcase 13: return Item::OakPlanks;\n\t\t\tcase 160: return Item::OakPressurePlate;\n\t\t\tcase 19: return Item::OakSapling;\n\t\t\tcase 112: return Item::OakSlab;\n\t\t\tcase 148: return Item::OakStairs;\n\t\t\tcase 187: return Item::OakTrapdoor;\n\t\t\tcase 50: return Item::OakWood;\n\t\t\tcase 361: return Item::Observer;\n\t\t\tcase 139: return Item::Obsidian;\n\t\t\tcase 656: return Item::OcelotSpawnEgg;\n\t\t\tcase 731: return Item::OrangeBanner;\n\t\t\tcase 592: return Item::OrangeBed;\n\t\t\tcase 283: return Item::OrangeCarpet;\n\t\t\tcase 396: return Item::OrangeConcrete;\n\t\t\tcase 412: return Item::OrangeConcretePowder;\n\t\t\tcase 586: return Item::OrangeDye;\n\t\t\tcase 380: return Item::OrangeGlazedTerracotta;\n\t\t\tcase 364: return Item::OrangeShulkerBox;\n\t\t\tcase 312: return Item::OrangeStainedGlass;\n\t\t\tcase 328: return Item::OrangeStainedGlassPane;\n\t\t\tcase 264: return Item::OrangeTerracotta;\n\t\t\tcase 104: return Item::OrangeTulip;\n\t\t\tcase 83: return Item::OrangeWool;\n\t\t\tcase 107: return Item::OxeyeDaisy;\n\t\t\tcase 300: return Item::PackedIce;\n\t\t\tcase 533: return Item::Painting;\n\t\t\tcase 556: return Item::Paper;\n\t\t\tcase 657: return Item::ParrotSpawnEgg;\n\t\t\tcase 308: return Item::Peony;\n\t\t\tcase 120: return Item::PetrifiedOakSlab;\n\t\t\tcase 782: return Item::PhantomMembrane;\n\t\t\tcase 658: return Item::PhantomSpawnEgg;\n\t\t\tcase 659: return Item::PigSpawnEgg;\n\t\t\tcase 736: return Item::PinkBanner;\n\t\t\tcase 597: return Item::PinkBed;\n\t\t\tcase 288: return Item::PinkCarpet;\n\t\t\tcase 401: return Item::PinkConcrete;\n\t\t\tcase 417: return Item::PinkConcretePowder;\n\t\t\tcase 581: return Item::PinkDye;\n\t\t\tcase 385: return Item::PinkGlazedTerracotta;\n\t\t\tcase 369: return Item::PinkShulkerBox;\n\t\t\tcase 317: return Item::PinkStainedGlass;\n\t\t\tcase 333: return Item::PinkStainedGlassPane;\n\t\t\tcase 269: return Item::PinkTerracotta;\n\t\t\tcase 106: return Item::PinkTulip;\n\t\t\tcase 88: return Item::PinkWool;\n\t\t\tcase 81: return Item::Piston;\n\t\t\tcase 700: return Item::PlayerHead;\n\t\t\tcase 11: return Item::Podzol;\n\t\t\tcase 695: return Item::PoisonousPotato;\n\t\t\tcase 660: return Item::PolarBearSpawnEgg;\n\t\t\tcase 7: return Item::PolishedAndesite;\n\t\t\tcase 5: return Item::PolishedDiorite;\n\t\t\tcase 3: return Item::PolishedGranite;\n\t\t\tcase 748: return Item::PoppedChorusFruit;\n\t\t\tcase 99: return Item::Poppy;\n\t\t\tcase 531: return Item::Porkchop;\n\t\t\tcase 693: return Item::Potato;\n\t\t\tcase 624: return Item::Potion;\n\t\t\tcase 72: return Item::PoweredRail;\n\t\t\tcase 343: return Item::Prismarine;\n\t\t\tcase 129: return Item::PrismarineBrickSlab;\n\t\t\tcase 347: return Item::PrismarineBrickStairs;\n\t\t\tcase 344: return Item::PrismarineBricks;\n\t\t\tcase 715: return Item::PrismarineCrystals;\n\t\t\tcase 714: return Item::PrismarineShard;\n\t\t\tcase 128: return Item::PrismarineSlab;\n\t\t\tcase 346: return Item::PrismarineStairs;\n\t\t\tcase 569: return Item::Pufferfish;\n\t\t\tcase 547: return Item::PufferfishBucket;\n\t\t\tcase 661: return Item::PufferfishSpawnEgg;\n\t\t\tcase 181: return Item::Pumpkin;\n\t\t\tcase 706: return Item::PumpkinPie;\n\t\t\tcase 612: return Item::PumpkinSeeds;\n\t\t\tcase 740: return Item::PurpleBanner;\n\t\t\tcase 601: return Item::PurpleBed;\n\t\t\tcase 292: return Item::PurpleCarpet;\n\t\t\tcase 405: return Item::PurpleConcrete;\n\t\t\tcase 421: return Item::PurpleConcretePowder;\n\t\t\tcase 577: return Item::PurpleDye;\n\t\t\tcase 389: return Item::PurpleGlazedTerracotta;\n\t\t\tcase 373: return Item::PurpleShulkerBox;\n\t\t\tcase 321: return Item::PurpleStainedGlass;\n\t\t\tcase 337: return Item::PurpleStainedGlassPane;\n\t\t\tcase 273: return Item::PurpleTerracotta;\n\t\t\tcase 92: return Item::PurpleWool;\n\t\t\tcase 144: return Item::PurpurBlock;\n\t\t\tcase 145: return Item::PurpurPillar;\n\t\t\tcase 127: return Item::PurpurSlab;\n\t\t\tcase 146: return Item::PurpurStairs;\n\t\t\tcase 711: return Item::Quartz;\n\t\t\tcase 258: return Item::QuartzBlock;\n\t\t\tcase 259: return Item::QuartzPillar;\n\t\t\tcase 125: return Item::QuartzSlab;\n\t\t\tcase 260: return Item::QuartzStairs;\n\t\t\tcase 716: return Item::Rabbit;\n\t\t\tcase 719: return Item::RabbitFoot;\n\t\t\tcase 720: return Item::RabbitHide;\n\t\t\tcase 662: return Item::RabbitSpawnEgg;\n\t\t\tcase 718: return Item::RabbitStew;\n\t\t\tcase 156: return Item::Rail;\n\t\t\tcase 744: return Item::RedBanner;\n\t\t\tcase 605: return Item::RedBed;\n\t\t\tcase 296: return Item::RedCarpet;\n\t\t\tcase 409: return Item::RedConcrete;\n\t\t\tcase 425: return Item::RedConcretePowder;\n\t\t\tcase 393: return Item::RedGlazedTerracotta;\n\t\t\tcase 109: return Item::RedMushroom;\n\t\t\tcase 204: return Item::RedMushroomBlock;\n\t\t\tcase 358: return Item::RedNetherBricks;\n\t\t\tcase 27: return Item::RedSand;\n\t\t\tcase 350: return Item::RedSandstone;\n\t\t\tcase 126: return Item::RedSandstoneSlab;\n\t\t\tcase 353: return Item::RedSandstoneStairs;\n\t\t\tcase 377: return Item::RedShulkerBox;\n\t\t\tcase 325: return Item::RedStainedGlass;\n\t\t\tcase 341: return Item::RedStainedGlassPane;\n\t\t\tcase 277: return Item::RedTerracotta;\n\t\t\tcase 103: return Item::RedTulip;\n\t\t\tcase 96: return Item::RedWool;\n\t\t\tcase 542: return Item::Redstone;\n\t\t\tcase 254: return Item::RedstoneBlock;\n\t\t\tcase 228: return Item::RedstoneLamp;\n\t\t\tcase 166: return Item::RedstoneOre;\n\t\t\tcase 167: return Item::RedstoneTorch;\n\t\t\tcase 462: return Item::Repeater;\n\t\t\tcase 354: return Item::RepeatingCommandBlock;\n\t\t\tcase 307: return Item::RoseBush;\n\t\t\tcase 573: return Item::RedDye;\n\t\t\tcase 618: return Item::RottenFlesh;\n\t\t\tcase 541: return Item::Saddle;\n\t\t\tcase 567: return Item::Salmon;\n\t\t\tcase 548: return Item::SalmonBucket;\n\t\t\tcase 663: return Item::SalmonSpawnEgg;\n\t\t\tcase 26: return Item::Sand;\n\t\t\tcase 68: return Item::Sandstone;\n\t\t\tcase 119: return Item::SandstoneSlab;\n\t\t\tcase 229: return Item::SandstoneStairs;\n\t\t\tcase 466: return Item::Scute;\n\t\t\tcase 349: return Item::SeaLantern;\n\t\t\tcase 80: return Item::SeaPickle;\n\t\t\tcase 79: return Item::Seagrass;\n\t\t\tcase 609: return Item::Shears;\n\t\t\tcase 664: return Item::SheepSpawnEgg;\n\t\t\tcase 757: return Item::Shield;\n\t\t\tcase 362: return Item::ShulkerBox;\n\t\t\tcase 765: return Item::ShulkerShell;\n\t\t\tcase 665: return Item::ShulkerSpawnEgg;\n\t\t\tcase 536: return Item::OakSign;\n\t\t\tcase 666: return Item::SilverfishSpawnEgg;\n\t\t\tcase 668: return Item::SkeletonHorseSpawnEgg;\n\t\t\tcase 698: return Item::SkeletonSkull;\n\t\t\tcase 667: return Item::SkeletonSpawnEgg;\n\t\t\tcase 558: return Item::SlimeBall;\n\t\t\tcase 303: return Item::SlimeBlock;\n\t\t\tcase 669: return Item::SlimeSpawnEgg;\n\t\t\tcase 131: return Item::SmoothQuartz;\n\t\t\tcase 132: return Item::SmoothRedSandstone;\n\t\t\tcase 133: return Item::SmoothSandstone;\n\t\t\tcase 134: return Item::SmoothStone;\n\t\t\tcase 169: return Item::Snow;\n\t\t\tcase 171: return Item::SnowBlock;\n\t\t\tcase 543: return Item::Snowball;\n\t\t\tcase 184: return Item::SoulSand;\n\t\t\tcase 147: return Item::Spawner;\n\t\t\tcase 754: return Item::SpectralArrow;\n\t\t\tcase 626: return Item::SpiderEye;\n\t\t\tcase 670: return Item::SpiderSpawnEgg;\n\t\t\tcase 753: return Item::SplashPotion;\n\t\t\tcase 62: return Item::Sponge;\n\t\t\tcase 759: return Item::SpruceBoat;\n\t\t\tcase 242: return Item::SpruceButton;\n\t\t\tcase 457: return Item::SpruceDoor;\n\t\t\tcase 176: return Item::SpruceFence;\n\t\t\tcase 211: return Item::SpruceFenceGate;\n\t\t\tcase 57: return Item::SpruceLeaves;\n\t\t\tcase 33: return Item::SpruceLog;\n\t\t\tcase 14: return Item::SprucePlanks;\n\t\t\tcase 161: return Item::SprucePressurePlate;\n\t\t\tcase 20: return Item::SpruceSapling;\n\t\t\tcase 113: return Item::SpruceSlab;\n\t\t\tcase 234: return Item::SpruceStairs;\n\t\t\tcase 188: return Item::SpruceTrapdoor;\n\t\t\tcase 51: return Item::SpruceWood;\n\t\t\tcase 671: return Item::SquidSpawnEgg;\n\t\t\tcase 492: return Item::Stick;\n\t\t\tcase 74: return Item::StickyPiston;\n\t\t\tcase 1: return Item::Stone;\n\t\t\tcase 487: return Item::StoneAxe;\n\t\t\tcase 123: return Item::StoneBrickSlab;\n\t\t\tcase 217: return Item::StoneBrickStairs;\n\t\t\tcase 199: return Item::StoneBricks;\n\t\t\tcase 168: return Item::StoneButton;\n\t\t\tcase 503: return Item::StoneHoe;\n\t\t\tcase 486: return Item::StonePickaxe;\n\t\t\tcase 159: return Item::StonePressurePlate;\n\t\t\tcase 485: return Item::StoneShovel;\n\t\t\tcase 118: return Item::StoneSlab;\n\t\t\tcase 484: return Item::StoneSword;\n\t\t\tcase 672: return Item::StraySpawnEgg;\n\t\t\tcase 499: return Item::String;\n\t\t\tcase 42: return Item::StrippedAcaciaLog;\n\t\t\tcase 48: return Item::StrippedAcaciaWood;\n\t\t\tcase 40: return Item::StrippedBirchLog;\n\t\t\tcase 46: return Item::StrippedBirchWood;\n\t\t\tcase 43: return Item::StrippedDarkOakLog;\n\t\t\tcase 49: return Item::StrippedDarkOakWood;\n\t\t\tcase 41: return Item::StrippedJungleLog;\n\t\t\tcase 47: return Item::StrippedJungleWood;\n\t\t\tcase 38: return Item::StrippedOakLog;\n\t\t\tcase 44: return Item::StrippedOakWood;\n\t\t\tcase 39: return Item::StrippedSpruceLog;\n\t\t\tcase 45: return Item::StrippedSpruceWood;\n\t\t\tcase 464: return Item::StructureBlock;\n\t\t\tcase 360: return Item::StructureVoid;\n\t\t\tcase 589: return Item::Sugar;\n\t\t\tcase 553: return Item::SugarCane;\n\t\t\tcase 305: return Item::Sunflower;\n\t\t\tcase 309: return Item::TallGrass;\n\t\t\tcase 298: return Item::Terracotta;\n\t\t\tcase 755: return Item::TippedArrow;\n\t\t\tcase 136: return Item::TNT;\n\t\t\tcase 712: return Item::TNTMinecart;\n\t\t\tcase 140: return Item::Torch;\n\t\t\tcase 764: return Item::TotemOfUndying;\n\t\t\tcase 250: return Item::TrappedChest;\n\t\t\tcase 781: return Item::Trident;\n\t\t\tcase 232: return Item::TripwireHook;\n\t\t\tcase 568: return Item::TropicalFish;\n\t\t\tcase 550: return Item::TropicalFishBucket;\n\t\t\tcase 673: return Item::TropicalFishSpawnEgg;\n\t\t\tcase 438: return Item::TubeCoral;\n\t\t\tcase 433: return Item::TubeCoralBlock;\n\t\t\tcase 443: return Item::TubeCoralFan;\n\t\t\tcase 427: return Item::TurtleEgg;\n\t\t\tcase 465: return Item::TurtleHelmet;\n\t\t\tcase 674: return Item::TurtleSpawnEgg;\n\t\t\tcase 675: return Item::VexSpawnEgg;\n\t\t\tcase 676: return Item::VillagerSpawnEgg;\n\t\t\tcase 677: return Item::VindicatorSpawnEgg;\n\t\t\tcase 209: return Item::Vine;\n\t\t\tcase 538: return Item::WaterBucket;\n\t\t\tcase 63: return Item::WetSponge;\n\t\t\tcase 508: return Item::Wheat;\n\t\t\tcase 507: return Item::WheatSeeds;\n\t\t\tcase 730: return Item::WhiteBanner;\n\t\t\tcase 591: return Item::WhiteBed;\n\t\t\tcase 282: return Item::WhiteCarpet;\n\t\t\tcase 395: return Item::WhiteConcrete;\n\t\t\tcase 411: return Item::WhiteConcretePowder;\n\t\t\tcase 379: return Item::WhiteGlazedTerracotta;\n\t\t\tcase 363: return Item::WhiteShulkerBox;\n\t\t\tcase 311: return Item::WhiteStainedGlass;\n\t\t\tcase 327: return Item::WhiteStainedGlassPane;\n\t\t\tcase 263: return Item::WhiteTerracotta;\n\t\t\tcase 105: return Item::WhiteTulip;\n\t\t\tcase 82: return Item::WhiteWool;\n\t\t\tcase 678: return Item::WitchSpawnEgg;\n\t\t\tcase 699: return Item::WitherSkeletonSkull;\n\t\t\tcase 679: return Item::WitherSkeletonSpawnEgg;\n\t\t\tcase 680: return Item::WolfSpawnEgg;\n\t\t\tcase 483: return Item::WoodenAxe;\n\t\t\tcase 502: return Item::WoodenHoe;\n\t\t\tcase 482: return Item::WoodenPickaxe;\n\t\t\tcase 481: return Item::WoodenShovel;\n\t\t\tcase 480: return Item::WoodenSword;\n\t\t\tcase 687: return Item::WritableBook;\n\t\t\tcase 688: return Item::WrittenBook;\n\t\t\tcase 734: return Item::YellowBanner;\n\t\t\tcase 595: return Item::YellowBed;\n\t\t\tcase 286: return Item::YellowCarpet;\n\t\t\tcase 399: return Item::YellowConcrete;\n\t\t\tcase 415: return Item::YellowConcretePowder;\n\t\t\tcase 383: return Item::YellowGlazedTerracotta;\n\t\t\tcase 367: return Item::YellowShulkerBox;\n\t\t\tcase 315: return Item::YellowStainedGlass;\n\t\t\tcase 331: return Item::YellowStainedGlassPane;\n\t\t\tcase 267: return Item::YellowTerracotta;\n\t\t\tcase 86: return Item::YellowWool;\n\t\t\tcase 701: return Item::ZombieHead;\n\t\t\tcase 682: return Item::ZombieHorseSpawnEgg;\n\t\t\tcase 683: return Item::ZombiePigmanSpawnEgg;\n\t\t\tcase 681: return Item::ZombieSpawnEgg;\n\t\t\tcase 684: return Item::ZombieVillagerSpawnEgg;\n\t\t\tdefault: return Item::Air;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_13.h",
    "content": "#pragma once\n\n#include \"BlockState.h\"\n#include \"Registries/Items.h\"\n#include \"Registries/CustomStatistics.h\"\n\nnamespace Palette_1_13\n{\n\tUInt32 From(BlockState Block);\n\tUInt32 From(Item ID);\n\tUInt32 From(CustomStatistic ID);\n\tItem ToItem(UInt32 ID);\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_13_1.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"Palette_1_13_1.h\"\n#include \"Registries/BlockStates.h\"\n\nnamespace Palette_1_13_1\n{\n\tUInt32 From(const BlockState Block)\n\t{\n\t\tusing namespace Block;\n\n\t\tswitch (Block.ID)\n\t\t{\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5400;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5401;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5402;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5403;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5404;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5405;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5406;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5407;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5408;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5409;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5410;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5411;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5412;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5413;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5414;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5415;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5416;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5417;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5418;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5419;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5420;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5421;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5422;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5423;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 7870;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 7871;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 7872;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 7873;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 7874;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 7875;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 7876;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 7877;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 7878;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 7879;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 7880;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 7881;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 7882;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 7883;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 7884;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 7885;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 7886;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 7887;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 7888;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 7889;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 7890;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 7891;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 7892;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 7893;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 7894;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 7895;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 7896;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 7897;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 7898;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 7899;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 7900;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 7901;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 7902;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 7903;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 7904;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 7905;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 7906;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 7907;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 7908;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 7909;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 7910;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 7911;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 7912;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 7913;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 7914;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 7915;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 7916;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 7917;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 7918;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 7919;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 7920;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 7921;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 7922;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 7923;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 7924;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 7925;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 7926;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 7927;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 7928;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 7929;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 7930;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 7931;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 7932;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 7933;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, true).ID: return 7616;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, false).ID: return 7617;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, true).ID: return 7620;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, false).ID: return 7621;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, true).ID: return 7624;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, false).ID: return 7625;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, true).ID: return 7628;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, false).ID: return 7629;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, true).ID: return 7632;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, false).ID: return 7633;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, true).ID: return 7636;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, false).ID: return 7637;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, true).ID: return 7640;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, false).ID: return 7641;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, true).ID: return 7644;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, false).ID: return 7645;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7454;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7455;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7456;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7457;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7458;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7459;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7460;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7461;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7462;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7463;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7464;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7465;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7466;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7467;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7468;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7469;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7470;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7471;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7472;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7473;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7474;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7475;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7476;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7477;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7478;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7479;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7480;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7481;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7482;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7483;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7484;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7485;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, true).ID: return 200;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, false).ID: return 201;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, true).ID: return 202;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, false).ID: return 203;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, true).ID: return 204;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, false).ID: return 205;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, true).ID: return 206;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, false).ID: return 207;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, true).ID: return 208;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, false).ID: return 209;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, true).ID: return 210;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, false).ID: return 211;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, true).ID: return 212;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, false).ID: return 213;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::X).ID: return 84;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Y).ID: return 85;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Z).ID: return 86;\n\t\t\tcase AcaciaPlanks::AcaciaPlanks().ID: return 19;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(true).ID: return 3376;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(false).ID: return 3377;\n\t\t\tcase AcaciaSapling::AcaciaSapling(0).ID: return 29;\n\t\t\tcase AcaciaSapling::AcaciaSapling(1).ID: return 30;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Top).ID: return 7283;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Bottom).ID: return 7285;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Double).ID: return 7287;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6334;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6336;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6338;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6340;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6342;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6344;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6346;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6348;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6350;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6352;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6354;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6356;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6358;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6360;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6362;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6364;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6366;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6368;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6370;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6372;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6374;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6376;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6378;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6380;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6382;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6384;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6386;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6388;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6390;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6392;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6394;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6396;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6398;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6400;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6402;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6404;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6406;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6408;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6410;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6412;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, true).ID: return 3851;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, false).ID: return 3853;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, true).ID: return 3855;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, false).ID: return 3857;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 3859;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 3861;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 3863;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 3865;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, true).ID: return 3867;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, false).ID: return 3869;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, true).ID: return 3871;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, false).ID: return 3873;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 3875;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 3877;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 3879;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 3881;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, true).ID: return 3883;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, false).ID: return 3885;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, true).ID: return 3887;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, false).ID: return 3889;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 3891;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 3893;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 3895;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 3897;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, true).ID: return 3899;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, false).ID: return 3901;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, true).ID: return 3903;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, false).ID: return 3905;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 3907;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 3909;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 3911;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 3913;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::X).ID: return 120;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Y).ID: return 121;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Z).ID: return 122;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::NorthSouth).ID: return 5781;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::EastWest).ID: return 5782;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingEast).ID: return 5783;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingWest).ID: return 5784;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingNorth).ID: return 5785;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingSouth).ID: return 5786;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::NorthSouth).ID: return 5787;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::EastWest).ID: return 5788;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingEast).ID: return 5789;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingWest).ID: return 5790;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingNorth).ID: return 5791;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingSouth).ID: return 5792;\n\t\t\tcase Air::Air().ID: return -0;\n\t\t\tcase Allium::Allium().ID: return 1114;\n\t\t\tcase Andesite::Andesite().ID: return 6;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZM).ID: return 5568;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZP).ID: return 5569;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XM).ID: return 5570;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XP).ID: return 5571;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4249;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4250;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XM).ID: return 4251;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XP).ID: return 4252;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4245;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4246;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XM).ID: return 4247;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XP).ID: return 4248;\n\t\t\tcase AzureBluet::AzureBluet().ID: return 1115;\n\t\t\tcase Barrier::Barrier().ID: return 6494;\n\t\t\tcase Beacon::Beacon().ID: return 5137;\n\t\t\tcase Bedrock::Bedrock().ID: return 33;\n\t\t\tcase Beetroots::Beetroots(0).ID: return 8159;\n\t\t\tcase Beetroots::Beetroots(1).ID: return 8160;\n\t\t\tcase Beetroots::Beetroots(2).ID: return 8161;\n\t\t\tcase Beetroots::Beetroots(3).ID: return 8162;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5352;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5353;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5354;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5355;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5356;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5357;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5358;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5359;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5360;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5361;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5362;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5363;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5364;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5365;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5366;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5367;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5368;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5369;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5370;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5371;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5372;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5373;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5374;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5375;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 7742;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 7743;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 7744;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 7745;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 7746;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 7747;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 7748;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 7749;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 7750;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 7751;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 7752;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 7753;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 7754;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 7755;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 7756;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 7757;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 7758;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 7759;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 7760;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 7761;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 7762;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 7763;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 7764;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 7765;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 7766;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 7767;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 7768;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 7769;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 7770;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 7771;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 7772;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 7773;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 7774;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 7775;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 7776;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 7777;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 7778;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 7779;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 7780;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 7781;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 7782;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 7783;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 7784;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 7785;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 7786;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 7787;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 7788;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 7789;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 7790;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 7791;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 7792;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 7793;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 7794;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 7795;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 7796;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 7797;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 7798;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 7799;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 7800;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 7801;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 7802;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 7803;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 7804;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 7805;\n\t\t\tcase BirchFence::BirchFence(true, true, true, true).ID: return 7552;\n\t\t\tcase BirchFence::BirchFence(true, true, true, false).ID: return 7553;\n\t\t\tcase BirchFence::BirchFence(true, true, false, true).ID: return 7556;\n\t\t\tcase BirchFence::BirchFence(true, true, false, false).ID: return 7557;\n\t\t\tcase BirchFence::BirchFence(true, false, true, true).ID: return 7560;\n\t\t\tcase BirchFence::BirchFence(true, false, true, false).ID: return 7561;\n\t\t\tcase BirchFence::BirchFence(true, false, false, true).ID: return 7564;\n\t\t\tcase BirchFence::BirchFence(true, false, false, false).ID: return 7565;\n\t\t\tcase BirchFence::BirchFence(false, true, true, true).ID: return 7568;\n\t\t\tcase BirchFence::BirchFence(false, true, true, false).ID: return 7569;\n\t\t\tcase BirchFence::BirchFence(false, true, false, true).ID: return 7572;\n\t\t\tcase BirchFence::BirchFence(false, true, false, false).ID: return 7573;\n\t\t\tcase BirchFence::BirchFence(false, false, true, true).ID: return 7576;\n\t\t\tcase BirchFence::BirchFence(false, false, true, false).ID: return 7577;\n\t\t\tcase BirchFence::BirchFence(false, false, false, true).ID: return 7580;\n\t\t\tcase BirchFence::BirchFence(false, false, false, false).ID: return 7581;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7390;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7391;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7392;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7393;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7394;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7395;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7396;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7397;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7398;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7399;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7400;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7401;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7402;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7403;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7404;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7405;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7406;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7407;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7408;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7409;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7410;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7411;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7412;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7413;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7414;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7415;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7416;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7417;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7418;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7419;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7420;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7421;\n\t\t\tcase BirchLeaves::BirchLeaves(1, true).ID: return 172;\n\t\t\tcase BirchLeaves::BirchLeaves(1, false).ID: return 173;\n\t\t\tcase BirchLeaves::BirchLeaves(2, true).ID: return 174;\n\t\t\tcase BirchLeaves::BirchLeaves(2, false).ID: return 175;\n\t\t\tcase BirchLeaves::BirchLeaves(3, true).ID: return 176;\n\t\t\tcase BirchLeaves::BirchLeaves(3, false).ID: return 177;\n\t\t\tcase BirchLeaves::BirchLeaves(4, true).ID: return 178;\n\t\t\tcase BirchLeaves::BirchLeaves(4, false).ID: return 179;\n\t\t\tcase BirchLeaves::BirchLeaves(5, true).ID: return 180;\n\t\t\tcase BirchLeaves::BirchLeaves(5, false).ID: return 181;\n\t\t\tcase BirchLeaves::BirchLeaves(6, true).ID: return 182;\n\t\t\tcase BirchLeaves::BirchLeaves(6, false).ID: return 183;\n\t\t\tcase BirchLeaves::BirchLeaves(7, true).ID: return 184;\n\t\t\tcase BirchLeaves::BirchLeaves(7, false).ID: return 185;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::X).ID: return 78;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Y).ID: return 79;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Z).ID: return 80;\n\t\t\tcase BirchPlanks::BirchPlanks().ID: return 17;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(true).ID: return 3372;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(false).ID: return 3373;\n\t\t\tcase BirchSapling::BirchSapling(0).ID: return 25;\n\t\t\tcase BirchSapling::BirchSapling(1).ID: return 26;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Top).ID: return 7271;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Bottom).ID: return 7273;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Double).ID: return 7275;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 4966;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 4968;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 4970;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 4972;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 4974;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 4976;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 4978;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 4980;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 4982;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 4984;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 4986;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 4988;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 4990;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 4992;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 4994;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 4996;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 4998;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5000;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5002;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5004;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5006;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5008;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5010;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5012;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5014;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5016;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5018;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5020;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5022;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5024;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5026;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5028;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5030;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5032;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5034;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5036;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5038;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5040;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5042;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5044;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, true).ID: return 3723;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, false).ID: return 3725;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, true).ID: return 3727;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, false).ID: return 3729;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, true).ID: return 3731;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, false).ID: return 3733;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, true).ID: return 3735;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, false).ID: return 3737;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, true).ID: return 3739;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, false).ID: return 3741;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, true).ID: return 3743;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, false).ID: return 3745;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, true).ID: return 3747;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, false).ID: return 3749;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, true).ID: return 3751;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, false).ID: return 3753;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, true).ID: return 3755;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, false).ID: return 3757;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, true).ID: return 3759;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, false).ID: return 3761;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, true).ID: return 3763;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, false).ID: return 3765;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, true).ID: return 3767;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, false).ID: return 3769;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, true).ID: return 3771;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, false).ID: return 3773;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, true).ID: return 3775;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, false).ID: return 3777;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, true).ID: return 3779;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, false).ID: return 3781;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, true).ID: return 3783;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, false).ID: return 3785;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::X).ID: return 114;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Y).ID: return 115;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Z).ID: return 116;\n\t\t\tcase BlackBanner::BlackBanner(0).ID: return 7095;\n\t\t\tcase BlackBanner::BlackBanner(1).ID: return 7096;\n\t\t\tcase BlackBanner::BlackBanner(2).ID: return 7097;\n\t\t\tcase BlackBanner::BlackBanner(3).ID: return 7098;\n\t\t\tcase BlackBanner::BlackBanner(4).ID: return 7099;\n\t\t\tcase BlackBanner::BlackBanner(5).ID: return 7100;\n\t\t\tcase BlackBanner::BlackBanner(6).ID: return 7101;\n\t\t\tcase BlackBanner::BlackBanner(7).ID: return 7102;\n\t\t\tcase BlackBanner::BlackBanner(8).ID: return 7103;\n\t\t\tcase BlackBanner::BlackBanner(9).ID: return 7104;\n\t\t\tcase BlackBanner::BlackBanner(10).ID: return 7105;\n\t\t\tcase BlackBanner::BlackBanner(11).ID: return 7106;\n\t\t\tcase BlackBanner::BlackBanner(12).ID: return 7107;\n\t\t\tcase BlackBanner::BlackBanner(13).ID: return 7108;\n\t\t\tcase BlackBanner::BlackBanner(14).ID: return 7109;\n\t\t\tcase BlackBanner::BlackBanner(15).ID: return 7110;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Head).ID: return 988;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Foot).ID: return 989;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Head).ID: return 990;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Foot).ID: return 991;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Head).ID: return 992;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Foot).ID: return 993;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Head).ID: return 994;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Foot).ID: return 995;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Head).ID: return 996;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Foot).ID: return 997;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Head).ID: return 998;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Foot).ID: return 999;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Head).ID: return 1000;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Foot).ID: return 1001;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Head).ID: return 1002;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Foot).ID: return 1003;\n\t\t\tcase BlackCarpet::BlackCarpet().ID: return 6839;\n\t\t\tcase BlackConcrete::BlackConcrete().ID: return 8393;\n\t\t\tcase BlackConcretePowder::BlackConcretePowder().ID: return 8409;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8374;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8375;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8376;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8377;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8308;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8309;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8310;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8311;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8312;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8313;\n\t\t\tcase BlackStainedGlass::BlackStainedGlass().ID: return 3593;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, true).ID: return 6303;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, false).ID: return 6304;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, true).ID: return 6307;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, false).ID: return 6308;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, true).ID: return 6311;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, false).ID: return 6312;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, true).ID: return 6315;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, false).ID: return 6316;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, true).ID: return 6319;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, false).ID: return 6320;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, true).ID: return 6323;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, false).ID: return 6324;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, true).ID: return 6327;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, false).ID: return 6328;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, true).ID: return 6331;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, false).ID: return 6332;\n\t\t\tcase BlackTerracotta::BlackTerracotta().ID: return 5820;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7171;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7172;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7173;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7174;\n\t\t\tcase BlackWool::BlackWool().ID: return 1098;\n\t\t\tcase BlueBanner::BlueBanner(0).ID: return 7031;\n\t\t\tcase BlueBanner::BlueBanner(1).ID: return 7032;\n\t\t\tcase BlueBanner::BlueBanner(2).ID: return 7033;\n\t\t\tcase BlueBanner::BlueBanner(3).ID: return 7034;\n\t\t\tcase BlueBanner::BlueBanner(4).ID: return 7035;\n\t\t\tcase BlueBanner::BlueBanner(5).ID: return 7036;\n\t\t\tcase BlueBanner::BlueBanner(6).ID: return 7037;\n\t\t\tcase BlueBanner::BlueBanner(7).ID: return 7038;\n\t\t\tcase BlueBanner::BlueBanner(8).ID: return 7039;\n\t\t\tcase BlueBanner::BlueBanner(9).ID: return 7040;\n\t\t\tcase BlueBanner::BlueBanner(10).ID: return 7041;\n\t\t\tcase BlueBanner::BlueBanner(11).ID: return 7042;\n\t\t\tcase BlueBanner::BlueBanner(12).ID: return 7043;\n\t\t\tcase BlueBanner::BlueBanner(13).ID: return 7044;\n\t\t\tcase BlueBanner::BlueBanner(14).ID: return 7045;\n\t\t\tcase BlueBanner::BlueBanner(15).ID: return 7046;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Head).ID: return 924;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Foot).ID: return 925;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Head).ID: return 926;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Foot).ID: return 927;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Head).ID: return 928;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Foot).ID: return 929;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Head).ID: return 930;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Foot).ID: return 931;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Head).ID: return 932;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Foot).ID: return 933;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Head).ID: return 934;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Foot).ID: return 935;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Head).ID: return 936;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Foot).ID: return 937;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Head).ID: return 938;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Foot).ID: return 939;\n\t\t\tcase BlueCarpet::BlueCarpet().ID: return 6835;\n\t\t\tcase BlueConcrete::BlueConcrete().ID: return 8389;\n\t\t\tcase BlueConcretePowder::BlueConcretePowder().ID: return 8405;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8358;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8359;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8360;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8361;\n\t\t\tcase BlueIce::BlueIce().ID: return 8588;\n\t\t\tcase BlueOrchid::BlueOrchid().ID: return 1113;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8284;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8285;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8286;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8287;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8288;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8289;\n\t\t\tcase BlueStainedGlass::BlueStainedGlass().ID: return 3589;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, true).ID: return 6175;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, false).ID: return 6176;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, true).ID: return 6179;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, false).ID: return 6180;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, true).ID: return 6183;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, false).ID: return 6184;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, true).ID: return 6187;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, false).ID: return 6188;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, true).ID: return 6191;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, false).ID: return 6192;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, true).ID: return 6195;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, false).ID: return 6196;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, true).ID: return 6199;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, false).ID: return 6200;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, true).ID: return 6203;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, false).ID: return 6204;\n\t\t\tcase BlueTerracotta::BlueTerracotta().ID: return 5816;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7155;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7156;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7157;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7158;\n\t\t\tcase BlueWool::BlueWool().ID: return 1094;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::X).ID: return 8196;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Y).ID: return 8197;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Z).ID: return 8198;\n\t\t\tcase Bookshelf::Bookshelf().ID: return 1128;\n\t\t\tcase BrainCoral::BrainCoral().ID: return 8473;\n\t\t\tcase BrainCoralBlock::BrainCoralBlock().ID: return 8456;\n\t\t\tcase BrainCoralFan::BrainCoralFan().ID: return 8573;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8529;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8531;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8533;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8535;\n\t\t\tcase BrewingStand::BrewingStand(true, true, true).ID: return 4614;\n\t\t\tcase BrewingStand::BrewingStand(true, true, false).ID: return 4615;\n\t\t\tcase BrewingStand::BrewingStand(true, false, true).ID: return 4616;\n\t\t\tcase BrewingStand::BrewingStand(true, false, false).ID: return 4617;\n\t\t\tcase BrewingStand::BrewingStand(false, true, true).ID: return 4618;\n\t\t\tcase BrewingStand::BrewingStand(false, true, false).ID: return 4619;\n\t\t\tcase BrewingStand::BrewingStand(false, false, true).ID: return 4620;\n\t\t\tcase BrewingStand::BrewingStand(false, false, false).ID: return 4621;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Top).ID: return 7319;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Bottom).ID: return 7321;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Double).ID: return 7323;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4334;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4336;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4338;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4340;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4342;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4344;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4346;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4348;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4350;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4352;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4354;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4356;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4358;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4360;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4362;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4364;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4366;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4368;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4370;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4372;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4374;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4376;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4378;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4380;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4382;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4384;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4386;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4388;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4390;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4392;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4394;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4396;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4398;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4400;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4402;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4404;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4406;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4408;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4410;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4412;\n\t\t\tcase Bricks::Bricks().ID: return 1125;\n\t\t\tcase BrownBanner::BrownBanner(0).ID: return 7047;\n\t\t\tcase BrownBanner::BrownBanner(1).ID: return 7048;\n\t\t\tcase BrownBanner::BrownBanner(2).ID: return 7049;\n\t\t\tcase BrownBanner::BrownBanner(3).ID: return 7050;\n\t\t\tcase BrownBanner::BrownBanner(4).ID: return 7051;\n\t\t\tcase BrownBanner::BrownBanner(5).ID: return 7052;\n\t\t\tcase BrownBanner::BrownBanner(6).ID: return 7053;\n\t\t\tcase BrownBanner::BrownBanner(7).ID: return 7054;\n\t\t\tcase BrownBanner::BrownBanner(8).ID: return 7055;\n\t\t\tcase BrownBanner::BrownBanner(9).ID: return 7056;\n\t\t\tcase BrownBanner::BrownBanner(10).ID: return 7057;\n\t\t\tcase BrownBanner::BrownBanner(11).ID: return 7058;\n\t\t\tcase BrownBanner::BrownBanner(12).ID: return 7059;\n\t\t\tcase BrownBanner::BrownBanner(13).ID: return 7060;\n\t\t\tcase BrownBanner::BrownBanner(14).ID: return 7061;\n\t\t\tcase BrownBanner::BrownBanner(15).ID: return 7062;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Head).ID: return 940;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Foot).ID: return 941;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Head).ID: return 942;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Foot).ID: return 943;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Head).ID: return 944;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Foot).ID: return 945;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Head).ID: return 946;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Foot).ID: return 947;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Head).ID: return 948;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Foot).ID: return 949;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Head).ID: return 950;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Foot).ID: return 951;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Head).ID: return 952;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Foot).ID: return 953;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Head).ID: return 954;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Foot).ID: return 955;\n\t\t\tcase BrownCarpet::BrownCarpet().ID: return 6836;\n\t\t\tcase BrownConcrete::BrownConcrete().ID: return 8390;\n\t\t\tcase BrownConcretePowder::BrownConcretePowder().ID: return 8406;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8362;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8363;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8364;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8365;\n\t\t\tcase BrownMushroom::BrownMushroom().ID: return 1121;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, true).ID: return 3988;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, false).ID: return 3989;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, true).ID: return 3990;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, false).ID: return 3991;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, true).ID: return 3992;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, false).ID: return 3993;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, true).ID: return 3994;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, false).ID: return 3995;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, true).ID: return 3996;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, false).ID: return 3997;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, true).ID: return 3998;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, false).ID: return 3999;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, true).ID: return 4000;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, false).ID: return 4001;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, true).ID: return 4002;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, false).ID: return 4003;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, true).ID: return 4004;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, false).ID: return 4005;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, true).ID: return 4006;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, false).ID: return 4007;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, true).ID: return 4008;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, false).ID: return 4009;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, true).ID: return 4010;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, false).ID: return 4011;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, true).ID: return 4012;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, false).ID: return 4013;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, true).ID: return 4014;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, false).ID: return 4015;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, true).ID: return 4016;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, false).ID: return 4017;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, true).ID: return 4018;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, false).ID: return 4019;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, true).ID: return 4020;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, false).ID: return 4021;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, true).ID: return 4022;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, false).ID: return 4023;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, true).ID: return 4024;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, false).ID: return 4025;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, true).ID: return 4026;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, false).ID: return 4027;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, true).ID: return 4028;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, false).ID: return 4029;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, true).ID: return 4030;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, false).ID: return 4031;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, true).ID: return 4032;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, false).ID: return 4033;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, true).ID: return 4034;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, false).ID: return 4035;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, true).ID: return 4036;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, false).ID: return 4037;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, true).ID: return 4038;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, false).ID: return 4039;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, true).ID: return 4040;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, false).ID: return 4041;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, true).ID: return 4042;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, false).ID: return 4043;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, true).ID: return 4044;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, false).ID: return 4045;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, true).ID: return 4046;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, false).ID: return 4047;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, true).ID: return 4048;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, false).ID: return 4049;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, true).ID: return 4050;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false).ID: return 4051;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8290;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8291;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8292;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8293;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8294;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8295;\n\t\t\tcase BrownStainedGlass::BrownStainedGlass().ID: return 3590;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, true).ID: return 6207;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, false).ID: return 6208;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, true).ID: return 6211;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, false).ID: return 6212;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, true).ID: return 6215;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, false).ID: return 6216;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, true).ID: return 6219;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, false).ID: return 6220;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, true).ID: return 6223;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, false).ID: return 6224;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, true).ID: return 6227;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, false).ID: return 6228;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, true).ID: return 6231;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, false).ID: return 6232;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, true).ID: return 6235;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, false).ID: return 6236;\n\t\t\tcase BrownTerracotta::BrownTerracotta().ID: return 5817;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7159;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7160;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7161;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7162;\n\t\t\tcase BrownWool::BrownWool().ID: return 1095;\n\t\t\tcase BubbleColumn::BubbleColumn(true).ID: return 8593;\n\t\t\tcase BubbleColumn::BubbleColumn(false).ID: return 8594;\n\t\t\tcase BubbleCoral::BubbleCoral().ID: return 8475;\n\t\t\tcase BubbleCoralBlock::BubbleCoralBlock().ID: return 8457;\n\t\t\tcase BubbleCoralFan::BubbleCoralFan().ID: return 8575;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8537;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8539;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8541;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8543;\n\t\t\tcase Cactus::Cactus(0).ID: return 3426;\n\t\t\tcase Cactus::Cactus(1).ID: return 3427;\n\t\t\tcase Cactus::Cactus(2).ID: return 3428;\n\t\t\tcase Cactus::Cactus(3).ID: return 3429;\n\t\t\tcase Cactus::Cactus(4).ID: return 3430;\n\t\t\tcase Cactus::Cactus(5).ID: return 3431;\n\t\t\tcase Cactus::Cactus(6).ID: return 3432;\n\t\t\tcase Cactus::Cactus(7).ID: return 3433;\n\t\t\tcase Cactus::Cactus(8).ID: return 3434;\n\t\t\tcase Cactus::Cactus(9).ID: return 3435;\n\t\t\tcase Cactus::Cactus(10).ID: return 3436;\n\t\t\tcase Cactus::Cactus(11).ID: return 3437;\n\t\t\tcase Cactus::Cactus(12).ID: return 3438;\n\t\t\tcase Cactus::Cactus(13).ID: return 3439;\n\t\t\tcase Cactus::Cactus(14).ID: return 3440;\n\t\t\tcase Cactus::Cactus(15).ID: return 3441;\n\t\t\tcase Cake::Cake(0).ID: return 3507;\n\t\t\tcase Cake::Cake(1).ID: return 3508;\n\t\t\tcase Cake::Cake(2).ID: return 3509;\n\t\t\tcase Cake::Cake(3).ID: return 3510;\n\t\t\tcase Cake::Cake(4).ID: return 3511;\n\t\t\tcase Cake::Cake(5).ID: return 3512;\n\t\t\tcase Cake::Cake(6).ID: return 3513;\n\t\t\tcase Carrots::Carrots(0).ID: return 5288;\n\t\t\tcase Carrots::Carrots(1).ID: return 5289;\n\t\t\tcase Carrots::Carrots(2).ID: return 5290;\n\t\t\tcase Carrots::Carrots(3).ID: return 5291;\n\t\t\tcase Carrots::Carrots(4).ID: return 5292;\n\t\t\tcase Carrots::Carrots(5).ID: return 5293;\n\t\t\tcase Carrots::Carrots(6).ID: return 5294;\n\t\t\tcase Carrots::Carrots(7).ID: return 5295;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZM).ID: return 3499;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZP).ID: return 3500;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XM).ID: return 3501;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XP).ID: return 3502;\n\t\t\tcase Cauldron::Cauldron(0).ID: return 4622;\n\t\t\tcase Cauldron::Cauldron(1).ID: return 4623;\n\t\t\tcase Cauldron::Cauldron(2).ID: return 4624;\n\t\t\tcase Cauldron::Cauldron(3).ID: return 4625;\n\t\t\tcase CaveAir::CaveAir().ID: return 8592;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 8177;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 8178;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 8179;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 8180;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 8181;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 8182;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 8183;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 8184;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 8185;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 8186;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 8187;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 8188;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Single).ID: return 1730;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Left).ID: return 1732;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Right).ID: return 1734;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Single).ID: return 1736;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Left).ID: return 1738;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Right).ID: return 1740;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Single).ID: return 1742;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Left).ID: return 1744;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Right).ID: return 1746;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Single).ID: return 1748;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Left).ID: return 1750;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Right).ID: return 1752;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 5572;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 5573;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 5574;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 5575;\n\t\t\tcase ChiseledQuartzBlock::ChiseledQuartzBlock().ID: return 5697;\n\t\t\tcase ChiseledRedSandstone::ChiseledRedSandstone().ID: return 7176;\n\t\t\tcase ChiseledSandstone::ChiseledSandstone().ID: return 246;\n\t\t\tcase ChiseledStoneBricks::ChiseledStoneBricks().ID: return 3987;\n\t\t\tcase ChorusFlower::ChorusFlower(0).ID: return 8068;\n\t\t\tcase ChorusFlower::ChorusFlower(1).ID: return 8069;\n\t\t\tcase ChorusFlower::ChorusFlower(2).ID: return 8070;\n\t\t\tcase ChorusFlower::ChorusFlower(3).ID: return 8071;\n\t\t\tcase ChorusFlower::ChorusFlower(4).ID: return 8072;\n\t\t\tcase ChorusFlower::ChorusFlower(5).ID: return 8073;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, true).ID: return 8004;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, false).ID: return 8005;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, true).ID: return 8006;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, false).ID: return 8007;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, true).ID: return 8008;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, false).ID: return 8009;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, true).ID: return 8010;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, false).ID: return 8011;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, true).ID: return 8012;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, false).ID: return 8013;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, true).ID: return 8014;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, false).ID: return 8015;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, true).ID: return 8016;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, false).ID: return 8017;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, true).ID: return 8018;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, false).ID: return 8019;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, true).ID: return 8020;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, false).ID: return 8021;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, true).ID: return 8022;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, false).ID: return 8023;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, true).ID: return 8024;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, false).ID: return 8025;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, true).ID: return 8026;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, false).ID: return 8027;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, true).ID: return 8028;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, false).ID: return 8029;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, true).ID: return 8030;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, false).ID: return 8031;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, true).ID: return 8032;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, false).ID: return 8033;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, true).ID: return 8034;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, false).ID: return 8035;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, true).ID: return 8036;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, false).ID: return 8037;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, true).ID: return 8038;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, false).ID: return 8039;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, true).ID: return 8040;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, false).ID: return 8041;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, true).ID: return 8042;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, false).ID: return 8043;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, true).ID: return 8044;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, false).ID: return 8045;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, true).ID: return 8046;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, false).ID: return 8047;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, true).ID: return 8048;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, false).ID: return 8049;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, true).ID: return 8050;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, false).ID: return 8051;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, true).ID: return 8052;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, false).ID: return 8053;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, true).ID: return 8054;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, false).ID: return 8055;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, true).ID: return 8056;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, false).ID: return 8057;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, true).ID: return 8058;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, false).ID: return 8059;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, true).ID: return 8060;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, false).ID: return 8061;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, true).ID: return 8062;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, false).ID: return 8063;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, true).ID: return 8064;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, false).ID: return 8065;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, true).ID: return 8066;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, false).ID: return 8067;\n\t\t\tcase Clay::Clay().ID: return 3442;\n\t\t\tcase CoalBlock::CoalBlock().ID: return 6841;\n\t\t\tcase CoalOre::CoalOre().ID: return 71;\n\t\t\tcase CoarseDirt::CoarseDirt().ID: return 11;\n\t\t\tcase Cobblestone::Cobblestone().ID: return 14;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Top).ID: return 7313;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Bottom).ID: return 7315;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Double).ID: return 7317;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3191;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3193;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3195;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3197;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3199;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3201;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3203;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3205;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3207;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3209;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3211;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3213;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3215;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3217;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3219;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3221;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3223;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3225;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3227;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3229;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3231;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3233;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3235;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3237;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3239;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3241;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3243;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3245;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3247;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3249;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3251;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3253;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3255;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3257;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3259;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3261;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3263;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3265;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3267;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3269;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5140;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5141;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5144;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5145;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5148;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5149;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5152;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5153;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5156;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5157;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5160;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5161;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5164;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5165;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5168;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5169;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5172;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5173;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5176;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5177;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5180;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5181;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5184;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5185;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5188;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5189;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5192;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5193;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5196;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5197;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5200;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5201;\n\t\t\tcase Cobweb::Cobweb().ID: return 1040;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZM).ID: return 4639;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZP).ID: return 4640;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XM).ID: return 4641;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XP).ID: return 4642;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZM).ID: return 4643;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZP).ID: return 4644;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XM).ID: return 4645;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XP).ID: return 4646;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZM).ID: return 4647;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZP).ID: return 4648;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XM).ID: return 4649;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XP).ID: return 4650;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5125;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 5126;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5127;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 5128;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 5129;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 5130;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5131;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 5132;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5133;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 5134;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 5135;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 5136;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, true).ID: return 5636;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, false).ID: return 5637;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, true).ID: return 5638;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, false).ID: return 5639;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, true).ID: return 5640;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, false).ID: return 5641;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, true).ID: return 5642;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, false).ID: return 5643;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, true).ID: return 5644;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, false).ID: return 5645;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, true).ID: return 5646;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, false).ID: return 5647;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, true).ID: return 5648;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, false).ID: return 5649;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, true).ID: return 5650;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, false).ID: return 5651;\n\t\t\tcase Conduit::Conduit().ID: return 8590;\n\t\t\tcase CrackedStoneBricks::CrackedStoneBricks().ID: return 3986;\n\t\t\tcase CraftingTable::CraftingTable().ID: return 3051;\n\t\t\tcase CreeperHead::CreeperHead(0).ID: return 5532;\n\t\t\tcase CreeperHead::CreeperHead(1).ID: return 5533;\n\t\t\tcase CreeperHead::CreeperHead(2).ID: return 5534;\n\t\t\tcase CreeperHead::CreeperHead(3).ID: return 5535;\n\t\t\tcase CreeperHead::CreeperHead(4).ID: return 5536;\n\t\t\tcase CreeperHead::CreeperHead(5).ID: return 5537;\n\t\t\tcase CreeperHead::CreeperHead(6).ID: return 5538;\n\t\t\tcase CreeperHead::CreeperHead(7).ID: return 5539;\n\t\t\tcase CreeperHead::CreeperHead(8).ID: return 5540;\n\t\t\tcase CreeperHead::CreeperHead(9).ID: return 5541;\n\t\t\tcase CreeperHead::CreeperHead(10).ID: return 5542;\n\t\t\tcase CreeperHead::CreeperHead(11).ID: return 5543;\n\t\t\tcase CreeperHead::CreeperHead(12).ID: return 5544;\n\t\t\tcase CreeperHead::CreeperHead(13).ID: return 5545;\n\t\t\tcase CreeperHead::CreeperHead(14).ID: return 5546;\n\t\t\tcase CreeperHead::CreeperHead(15).ID: return 5547;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 5528;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 5529;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 5530;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 5531;\n\t\t\tcase CutRedSandstone::CutRedSandstone().ID: return 7177;\n\t\t\tcase CutSandstone::CutSandstone().ID: return 247;\n\t\t\tcase CyanBanner::CyanBanner(0).ID: return 6999;\n\t\t\tcase CyanBanner::CyanBanner(1).ID: return 7000;\n\t\t\tcase CyanBanner::CyanBanner(2).ID: return 7001;\n\t\t\tcase CyanBanner::CyanBanner(3).ID: return 7002;\n\t\t\tcase CyanBanner::CyanBanner(4).ID: return 7003;\n\t\t\tcase CyanBanner::CyanBanner(5).ID: return 7004;\n\t\t\tcase CyanBanner::CyanBanner(6).ID: return 7005;\n\t\t\tcase CyanBanner::CyanBanner(7).ID: return 7006;\n\t\t\tcase CyanBanner::CyanBanner(8).ID: return 7007;\n\t\t\tcase CyanBanner::CyanBanner(9).ID: return 7008;\n\t\t\tcase CyanBanner::CyanBanner(10).ID: return 7009;\n\t\t\tcase CyanBanner::CyanBanner(11).ID: return 7010;\n\t\t\tcase CyanBanner::CyanBanner(12).ID: return 7011;\n\t\t\tcase CyanBanner::CyanBanner(13).ID: return 7012;\n\t\t\tcase CyanBanner::CyanBanner(14).ID: return 7013;\n\t\t\tcase CyanBanner::CyanBanner(15).ID: return 7014;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Head).ID: return 892;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Foot).ID: return 893;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Head).ID: return 894;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Foot).ID: return 895;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Head).ID: return 896;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Foot).ID: return 897;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Head).ID: return 898;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Foot).ID: return 899;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Head).ID: return 900;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Foot).ID: return 901;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Head).ID: return 902;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Foot).ID: return 903;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Head).ID: return 904;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Foot).ID: return 905;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Head).ID: return 906;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Foot).ID: return 907;\n\t\t\tcase CyanCarpet::CyanCarpet().ID: return 6833;\n\t\t\tcase CyanConcrete::CyanConcrete().ID: return 8387;\n\t\t\tcase CyanConcretePowder::CyanConcretePowder().ID: return 8403;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8350;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8351;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8352;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8353;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8272;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8273;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8274;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8275;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8276;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8277;\n\t\t\tcase CyanStainedGlass::CyanStainedGlass().ID: return 3587;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, true).ID: return 6111;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, false).ID: return 6112;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, true).ID: return 6115;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, false).ID: return 6116;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, true).ID: return 6119;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, false).ID: return 6120;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, true).ID: return 6123;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, false).ID: return 6124;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, true).ID: return 6127;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, false).ID: return 6128;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, true).ID: return 6131;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, false).ID: return 6132;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, true).ID: return 6135;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, false).ID: return 6136;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, true).ID: return 6139;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, false).ID: return 6140;\n\t\t\tcase CyanTerracotta::CyanTerracotta().ID: return 5814;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7147;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7148;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7149;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7150;\n\t\t\tcase CyanWool::CyanWool().ID: return 1092;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 5576;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 5577;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 5578;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 5579;\n\t\t\tcase Dandelion::Dandelion().ID: return 1111;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5424;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5425;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5426;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5427;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5428;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5429;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5430;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5431;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5432;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5433;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5434;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5435;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5436;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5437;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5438;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5439;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5440;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5441;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5442;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5443;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5444;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5445;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5446;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5447;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 7934;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 7935;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 7936;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 7937;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 7938;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 7939;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 7940;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 7941;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 7942;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 7943;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 7944;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 7945;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 7946;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 7947;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 7948;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 7949;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 7950;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 7951;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 7952;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 7953;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 7954;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 7955;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 7956;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 7957;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 7958;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 7959;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 7960;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 7961;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 7962;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 7963;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 7964;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 7965;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 7966;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 7967;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 7968;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 7969;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 7970;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 7971;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 7972;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 7973;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 7974;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 7975;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 7976;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 7977;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 7978;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 7979;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 7980;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 7981;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 7982;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 7983;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 7984;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 7985;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 7986;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 7987;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 7988;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 7989;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 7990;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 7991;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 7992;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 7993;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 7994;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 7995;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 7996;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 7997;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, true).ID: return 7648;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, false).ID: return 7649;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, true).ID: return 7652;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, false).ID: return 7653;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, true).ID: return 7656;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, false).ID: return 7657;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, true).ID: return 7660;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, false).ID: return 7661;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, true).ID: return 7664;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, false).ID: return 7665;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, true).ID: return 7668;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, false).ID: return 7669;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, true).ID: return 7672;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, false).ID: return 7673;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, true).ID: return 7676;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, false).ID: return 7677;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7486;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7487;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7488;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7489;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7490;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7491;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7492;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7493;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7494;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7495;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7496;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7497;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7498;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7499;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7500;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7501;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7502;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7503;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7504;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7505;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7506;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7507;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7508;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7509;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7510;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7511;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7512;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7513;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7514;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7515;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7516;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7517;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, true).ID: return 214;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, false).ID: return 215;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, true).ID: return 216;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, false).ID: return 217;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, true).ID: return 218;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, false).ID: return 219;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, true).ID: return 220;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, false).ID: return 221;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, true).ID: return 222;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, false).ID: return 223;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, true).ID: return 224;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, false).ID: return 225;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, true).ID: return 226;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, false).ID: return 227;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::X).ID: return 87;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Y).ID: return 88;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Z).ID: return 89;\n\t\t\tcase DarkOakPlanks::DarkOakPlanks().ID: return 20;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(true).ID: return 3378;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(false).ID: return 3379;\n\t\t\tcase DarkOakSapling::DarkOakSapling(0).ID: return 31;\n\t\t\tcase DarkOakSapling::DarkOakSapling(1).ID: return 32;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Top).ID: return 7289;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Bottom).ID: return 7291;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Double).ID: return 7293;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6414;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6416;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6418;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6420;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6422;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6424;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6426;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6428;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6430;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6432;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6434;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6436;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6438;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6440;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6442;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6444;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6446;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6448;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6450;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6452;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6454;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6456;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6458;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6460;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6462;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6464;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6466;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6468;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6470;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6472;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6474;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6476;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6478;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6480;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6482;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6484;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6486;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6488;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6490;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6492;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, true).ID: return 3915;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, false).ID: return 3917;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, true).ID: return 3919;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, false).ID: return 3921;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 3923;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 3925;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 3927;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 3929;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, true).ID: return 3931;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, false).ID: return 3933;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, true).ID: return 3935;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, false).ID: return 3937;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 3939;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 3941;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 3943;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 3945;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, true).ID: return 3947;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, false).ID: return 3949;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, true).ID: return 3951;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, false).ID: return 3953;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 3955;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 3957;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 3959;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 3961;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, true).ID: return 3963;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, false).ID: return 3965;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, true).ID: return 3967;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, false).ID: return 3969;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 3971;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 3973;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 3975;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 3977;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::X).ID: return 123;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Y).ID: return 124;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Z).ID: return 125;\n\t\t\tcase DarkPrismarine::DarkPrismarine().ID: return 6561;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Top).ID: return 6815;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Bottom).ID: return 6817;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Double).ID: return 6819;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 6723;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6725;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 6727;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6729;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 6731;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 6733;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6735;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 6737;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6739;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 6741;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 6743;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6745;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 6747;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6749;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 6751;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 6753;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6755;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 6757;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6759;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 6761;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 6763;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6765;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 6767;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6769;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 6771;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 6773;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6775;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 6777;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6779;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 6781;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 6783;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6785;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 6787;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6789;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 6791;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 6793;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 6795;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 6797;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 6799;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 6801;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 0).ID: return 5652;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 1).ID: return 5653;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 2).ID: return 5654;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 3).ID: return 5655;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 4).ID: return 5656;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 5).ID: return 5657;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 6).ID: return 5658;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 7).ID: return 5659;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 8).ID: return 5660;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 9).ID: return 5661;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 10).ID: return 5662;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 11).ID: return 5663;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 12).ID: return 5664;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 13).ID: return 5665;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 14).ID: return 5666;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 15).ID: return 5667;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 0).ID: return 5668;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 1).ID: return 5669;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 2).ID: return 5670;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 3).ID: return 5671;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 4).ID: return 5672;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 5).ID: return 5673;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 6).ID: return 5674;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 7).ID: return 5675;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 8).ID: return 5676;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 9).ID: return 5677;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 10).ID: return 5678;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 11).ID: return 5679;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 12).ID: return 5680;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 13).ID: return 5681;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 14).ID: return 5682;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 15).ID: return 5683;\n\t\t\tcase DeadBrainCoral::DeadBrainCoral().ID: return 8463;\n\t\t\tcase DeadBrainCoralBlock::DeadBrainCoralBlock().ID: return 8451;\n\t\t\tcase DeadBrainCoralFan::DeadBrainCoralFan().ID: return 8563;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8489;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8491;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8493;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8495;\n\t\t\tcase DeadBubbleCoral::DeadBubbleCoral().ID: return 8465;\n\t\t\tcase DeadBubbleCoralBlock::DeadBubbleCoralBlock().ID: return 8452;\n\t\t\tcase DeadBubbleCoralFan::DeadBubbleCoralFan().ID: return 8565;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8497;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8499;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8501;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8503;\n\t\t\tcase DeadBush::DeadBush().ID: return 1043;\n\t\t\tcase DeadFireCoral::DeadFireCoral().ID: return 8467;\n\t\t\tcase DeadFireCoralBlock::DeadFireCoralBlock().ID: return 8453;\n\t\t\tcase DeadFireCoralFan::DeadFireCoralFan().ID: return 8567;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8505;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8507;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8509;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8511;\n\t\t\tcase DeadHornCoral::DeadHornCoral().ID: return 8469;\n\t\t\tcase DeadHornCoralBlock::DeadHornCoralBlock().ID: return 8454;\n\t\t\tcase DeadHornCoralFan::DeadHornCoralFan().ID: return 8569;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8513;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8515;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8517;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8519;\n\t\t\tcase DeadTubeCoral::DeadTubeCoral().ID: return 8461;\n\t\t\tcase DeadTubeCoralBlock::DeadTubeCoralBlock().ID: return 8450;\n\t\t\tcase DeadTubeCoralFan::DeadTubeCoralFan().ID: return 8561;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8481;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8483;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8485;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8487;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::NorthSouth).ID: return 1016;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::EastWest).ID: return 1017;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingEast).ID: return 1018;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingWest).ID: return 1019;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingNorth).ID: return 1020;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingSouth).ID: return 1021;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::NorthSouth).ID: return 1022;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::EastWest).ID: return 1023;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingEast).ID: return 1024;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingWest).ID: return 1025;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingNorth).ID: return 1026;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingSouth).ID: return 1027;\n\t\t\tcase DiamondBlock::DiamondBlock().ID: return 3050;\n\t\t\tcase DiamondOre::DiamondOre().ID: return 3049;\n\t\t\tcase Diorite::Diorite().ID: return 4;\n\t\t\tcase Dirt::Dirt().ID: return 10;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, true).ID: return 233;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, false).ID: return 234;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, true).ID: return 235;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, false).ID: return 236;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, true).ID: return 237;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, false).ID: return 238;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, true).ID: return 239;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, false).ID: return 240;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, true).ID: return 241;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, false).ID: return 242;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, true).ID: return 243;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, false).ID: return 244;\n\t\t\tcase DragonEgg::DragonEgg().ID: return 4636;\n\t\t\tcase DragonHead::DragonHead(0).ID: return 5552;\n\t\t\tcase DragonHead::DragonHead(1).ID: return 5553;\n\t\t\tcase DragonHead::DragonHead(2).ID: return 5554;\n\t\t\tcase DragonHead::DragonHead(3).ID: return 5555;\n\t\t\tcase DragonHead::DragonHead(4).ID: return 5556;\n\t\t\tcase DragonHead::DragonHead(5).ID: return 5557;\n\t\t\tcase DragonHead::DragonHead(6).ID: return 5558;\n\t\t\tcase DragonHead::DragonHead(7).ID: return 5559;\n\t\t\tcase DragonHead::DragonHead(8).ID: return 5560;\n\t\t\tcase DragonHead::DragonHead(9).ID: return 5561;\n\t\t\tcase DragonHead::DragonHead(10).ID: return 5562;\n\t\t\tcase DragonHead::DragonHead(11).ID: return 5563;\n\t\t\tcase DragonHead::DragonHead(12).ID: return 5564;\n\t\t\tcase DragonHead::DragonHead(13).ID: return 5565;\n\t\t\tcase DragonHead::DragonHead(14).ID: return 5566;\n\t\t\tcase DragonHead::DragonHead(15).ID: return 5567;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 5548;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 5549;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 5550;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 5551;\n\t\t\tcase DriedKelpBlock::DriedKelpBlock().ID: return 8437;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, true).ID: return 5793;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, false).ID: return 5794;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, true).ID: return 5795;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, false).ID: return 5796;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, true).ID: return 5797;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, false).ID: return 5798;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, true).ID: return 5799;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, false).ID: return 5800;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, true).ID: return 5801;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, false).ID: return 5802;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, true).ID: return 5803;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, false).ID: return 5804;\n\t\t\tcase EmeraldBlock::EmeraldBlock().ID: return 4884;\n\t\t\tcase EmeraldOre::EmeraldOre().ID: return 4731;\n\t\t\tcase EnchantingTable::EnchantingTable().ID: return 4613;\n\t\t\tcase EndGateway::EndGateway().ID: return 8164;\n\t\t\tcase EndPortal::EndPortal().ID: return 4626;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZM).ID: return 4627;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZP).ID: return 4628;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XM).ID: return 4629;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XP).ID: return 4630;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZM).ID: return 4631;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZP).ID: return 4632;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XM).ID: return 4633;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XP).ID: return 4634;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZM).ID: return 7998;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XP).ID: return 7999;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZP).ID: return 8000;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XM).ID: return 8001;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YP).ID: return 8002;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YM).ID: return 8003;\n\t\t\tcase EndStone::EndStone().ID: return 4635;\n\t\t\tcase EndStoneBricks::EndStoneBricks().ID: return 8158;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZM).ID: return 4733;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZP).ID: return 4735;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XM).ID: return 4737;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XP).ID: return 4739;\n\t\t\tcase Farmland::Farmland(0).ID: return 3060;\n\t\t\tcase Farmland::Farmland(1).ID: return 3061;\n\t\t\tcase Farmland::Farmland(2).ID: return 3062;\n\t\t\tcase Farmland::Farmland(3).ID: return 3063;\n\t\t\tcase Farmland::Farmland(4).ID: return 3064;\n\t\t\tcase Farmland::Farmland(5).ID: return 3065;\n\t\t\tcase Farmland::Farmland(6).ID: return 3066;\n\t\t\tcase Farmland::Farmland(7).ID: return 3067;\n\t\t\tcase Fern::Fern().ID: return 1042;\n\t\t\tcase Fire::Fire(0, true, true, true, true, true).ID: return 1136;\n\t\t\tcase Fire::Fire(0, true, true, true, true, false).ID: return 1137;\n\t\t\tcase Fire::Fire(0, true, true, true, false, true).ID: return 1138;\n\t\t\tcase Fire::Fire(0, true, true, true, false, false).ID: return 1139;\n\t\t\tcase Fire::Fire(0, true, true, false, true, true).ID: return 1140;\n\t\t\tcase Fire::Fire(0, true, true, false, true, false).ID: return 1141;\n\t\t\tcase Fire::Fire(0, true, true, false, false, true).ID: return 1142;\n\t\t\tcase Fire::Fire(0, true, true, false, false, false).ID: return 1143;\n\t\t\tcase Fire::Fire(0, true, false, true, true, true).ID: return 1144;\n\t\t\tcase Fire::Fire(0, true, false, true, true, false).ID: return 1145;\n\t\t\tcase Fire::Fire(0, true, false, true, false, true).ID: return 1146;\n\t\t\tcase Fire::Fire(0, true, false, true, false, false).ID: return 1147;\n\t\t\tcase Fire::Fire(0, true, false, false, true, true).ID: return 1148;\n\t\t\tcase Fire::Fire(0, true, false, false, true, false).ID: return 1149;\n\t\t\tcase Fire::Fire(0, true, false, false, false, true).ID: return 1150;\n\t\t\tcase Fire::Fire(0, true, false, false, false, false).ID: return 1151;\n\t\t\tcase Fire::Fire(0, false, true, true, true, true).ID: return 1152;\n\t\t\tcase Fire::Fire(0, false, true, true, true, false).ID: return 1153;\n\t\t\tcase Fire::Fire(0, false, true, true, false, true).ID: return 1154;\n\t\t\tcase Fire::Fire(0, false, true, true, false, false).ID: return 1155;\n\t\t\tcase Fire::Fire(0, false, true, false, true, true).ID: return 1156;\n\t\t\tcase Fire::Fire(0, false, true, false, true, false).ID: return 1157;\n\t\t\tcase Fire::Fire(0, false, true, false, false, true).ID: return 1158;\n\t\t\tcase Fire::Fire(0, false, true, false, false, false).ID: return 1159;\n\t\t\tcase Fire::Fire(0, false, false, true, true, true).ID: return 1160;\n\t\t\tcase Fire::Fire(0, false, false, true, true, false).ID: return 1161;\n\t\t\tcase Fire::Fire(0, false, false, true, false, true).ID: return 1162;\n\t\t\tcase Fire::Fire(0, false, false, true, false, false).ID: return 1163;\n\t\t\tcase Fire::Fire(0, false, false, false, true, true).ID: return 1164;\n\t\t\tcase Fire::Fire(0, false, false, false, true, false).ID: return 1165;\n\t\t\tcase Fire::Fire(0, false, false, false, false, true).ID: return 1166;\n\t\t\tcase Fire::Fire(0, false, false, false, false, false).ID: return 1167;\n\t\t\tcase Fire::Fire(1, true, true, true, true, true).ID: return 1168;\n\t\t\tcase Fire::Fire(1, true, true, true, true, false).ID: return 1169;\n\t\t\tcase Fire::Fire(1, true, true, true, false, true).ID: return 1170;\n\t\t\tcase Fire::Fire(1, true, true, true, false, false).ID: return 1171;\n\t\t\tcase Fire::Fire(1, true, true, false, true, true).ID: return 1172;\n\t\t\tcase Fire::Fire(1, true, true, false, true, false).ID: return 1173;\n\t\t\tcase Fire::Fire(1, true, true, false, false, true).ID: return 1174;\n\t\t\tcase Fire::Fire(1, true, true, false, false, false).ID: return 1175;\n\t\t\tcase Fire::Fire(1, true, false, true, true, true).ID: return 1176;\n\t\t\tcase Fire::Fire(1, true, false, true, true, false).ID: return 1177;\n\t\t\tcase Fire::Fire(1, true, false, true, false, true).ID: return 1178;\n\t\t\tcase Fire::Fire(1, true, false, true, false, false).ID: return 1179;\n\t\t\tcase Fire::Fire(1, true, false, false, true, true).ID: return 1180;\n\t\t\tcase Fire::Fire(1, true, false, false, true, false).ID: return 1181;\n\t\t\tcase Fire::Fire(1, true, false, false, false, true).ID: return 1182;\n\t\t\tcase Fire::Fire(1, true, false, false, false, false).ID: return 1183;\n\t\t\tcase Fire::Fire(1, false, true, true, true, true).ID: return 1184;\n\t\t\tcase Fire::Fire(1, false, true, true, true, false).ID: return 1185;\n\t\t\tcase Fire::Fire(1, false, true, true, false, true).ID: return 1186;\n\t\t\tcase Fire::Fire(1, false, true, true, false, false).ID: return 1187;\n\t\t\tcase Fire::Fire(1, false, true, false, true, true).ID: return 1188;\n\t\t\tcase Fire::Fire(1, false, true, false, true, false).ID: return 1189;\n\t\t\tcase Fire::Fire(1, false, true, false, false, true).ID: return 1190;\n\t\t\tcase Fire::Fire(1, false, true, false, false, false).ID: return 1191;\n\t\t\tcase Fire::Fire(1, false, false, true, true, true).ID: return 1192;\n\t\t\tcase Fire::Fire(1, false, false, true, true, false).ID: return 1193;\n\t\t\tcase Fire::Fire(1, false, false, true, false, true).ID: return 1194;\n\t\t\tcase Fire::Fire(1, false, false, true, false, false).ID: return 1195;\n\t\t\tcase Fire::Fire(1, false, false, false, true, true).ID: return 1196;\n\t\t\tcase Fire::Fire(1, false, false, false, true, false).ID: return 1197;\n\t\t\tcase Fire::Fire(1, false, false, false, false, true).ID: return 1198;\n\t\t\tcase Fire::Fire(1, false, false, false, false, false).ID: return 1199;\n\t\t\tcase Fire::Fire(2, true, true, true, true, true).ID: return 1200;\n\t\t\tcase Fire::Fire(2, true, true, true, true, false).ID: return 1201;\n\t\t\tcase Fire::Fire(2, true, true, true, false, true).ID: return 1202;\n\t\t\tcase Fire::Fire(2, true, true, true, false, false).ID: return 1203;\n\t\t\tcase Fire::Fire(2, true, true, false, true, true).ID: return 1204;\n\t\t\tcase Fire::Fire(2, true, true, false, true, false).ID: return 1205;\n\t\t\tcase Fire::Fire(2, true, true, false, false, true).ID: return 1206;\n\t\t\tcase Fire::Fire(2, true, true, false, false, false).ID: return 1207;\n\t\t\tcase Fire::Fire(2, true, false, true, true, true).ID: return 1208;\n\t\t\tcase Fire::Fire(2, true, false, true, true, false).ID: return 1209;\n\t\t\tcase Fire::Fire(2, true, false, true, false, true).ID: return 1210;\n\t\t\tcase Fire::Fire(2, true, false, true, false, false).ID: return 1211;\n\t\t\tcase Fire::Fire(2, true, false, false, true, true).ID: return 1212;\n\t\t\tcase Fire::Fire(2, true, false, false, true, false).ID: return 1213;\n\t\t\tcase Fire::Fire(2, true, false, false, false, true).ID: return 1214;\n\t\t\tcase Fire::Fire(2, true, false, false, false, false).ID: return 1215;\n\t\t\tcase Fire::Fire(2, false, true, true, true, true).ID: return 1216;\n\t\t\tcase Fire::Fire(2, false, true, true, true, false).ID: return 1217;\n\t\t\tcase Fire::Fire(2, false, true, true, false, true).ID: return 1218;\n\t\t\tcase Fire::Fire(2, false, true, true, false, false).ID: return 1219;\n\t\t\tcase Fire::Fire(2, false, true, false, true, true).ID: return 1220;\n\t\t\tcase Fire::Fire(2, false, true, false, true, false).ID: return 1221;\n\t\t\tcase Fire::Fire(2, false, true, false, false, true).ID: return 1222;\n\t\t\tcase Fire::Fire(2, false, true, false, false, false).ID: return 1223;\n\t\t\tcase Fire::Fire(2, false, false, true, true, true).ID: return 1224;\n\t\t\tcase Fire::Fire(2, false, false, true, true, false).ID: return 1225;\n\t\t\tcase Fire::Fire(2, false, false, true, false, true).ID: return 1226;\n\t\t\tcase Fire::Fire(2, false, false, true, false, false).ID: return 1227;\n\t\t\tcase Fire::Fire(2, false, false, false, true, true).ID: return 1228;\n\t\t\tcase Fire::Fire(2, false, false, false, true, false).ID: return 1229;\n\t\t\tcase Fire::Fire(2, false, false, false, false, true).ID: return 1230;\n\t\t\tcase Fire::Fire(2, false, false, false, false, false).ID: return 1231;\n\t\t\tcase Fire::Fire(3, true, true, true, true, true).ID: return 1232;\n\t\t\tcase Fire::Fire(3, true, true, true, true, false).ID: return 1233;\n\t\t\tcase Fire::Fire(3, true, true, true, false, true).ID: return 1234;\n\t\t\tcase Fire::Fire(3, true, true, true, false, false).ID: return 1235;\n\t\t\tcase Fire::Fire(3, true, true, false, true, true).ID: return 1236;\n\t\t\tcase Fire::Fire(3, true, true, false, true, false).ID: return 1237;\n\t\t\tcase Fire::Fire(3, true, true, false, false, true).ID: return 1238;\n\t\t\tcase Fire::Fire(3, true, true, false, false, false).ID: return 1239;\n\t\t\tcase Fire::Fire(3, true, false, true, true, true).ID: return 1240;\n\t\t\tcase Fire::Fire(3, true, false, true, true, false).ID: return 1241;\n\t\t\tcase Fire::Fire(3, true, false, true, false, true).ID: return 1242;\n\t\t\tcase Fire::Fire(3, true, false, true, false, false).ID: return 1243;\n\t\t\tcase Fire::Fire(3, true, false, false, true, true).ID: return 1244;\n\t\t\tcase Fire::Fire(3, true, false, false, true, false).ID: return 1245;\n\t\t\tcase Fire::Fire(3, true, false, false, false, true).ID: return 1246;\n\t\t\tcase Fire::Fire(3, true, false, false, false, false).ID: return 1247;\n\t\t\tcase Fire::Fire(3, false, true, true, true, true).ID: return 1248;\n\t\t\tcase Fire::Fire(3, false, true, true, true, false).ID: return 1249;\n\t\t\tcase Fire::Fire(3, false, true, true, false, true).ID: return 1250;\n\t\t\tcase Fire::Fire(3, false, true, true, false, false).ID: return 1251;\n\t\t\tcase Fire::Fire(3, false, true, false, true, true).ID: return 1252;\n\t\t\tcase Fire::Fire(3, false, true, false, true, false).ID: return 1253;\n\t\t\tcase Fire::Fire(3, false, true, false, false, true).ID: return 1254;\n\t\t\tcase Fire::Fire(3, false, true, false, false, false).ID: return 1255;\n\t\t\tcase Fire::Fire(3, false, false, true, true, true).ID: return 1256;\n\t\t\tcase Fire::Fire(3, false, false, true, true, false).ID: return 1257;\n\t\t\tcase Fire::Fire(3, false, false, true, false, true).ID: return 1258;\n\t\t\tcase Fire::Fire(3, false, false, true, false, false).ID: return 1259;\n\t\t\tcase Fire::Fire(3, false, false, false, true, true).ID: return 1260;\n\t\t\tcase Fire::Fire(3, false, false, false, true, false).ID: return 1261;\n\t\t\tcase Fire::Fire(3, false, false, false, false, true).ID: return 1262;\n\t\t\tcase Fire::Fire(3, false, false, false, false, false).ID: return 1263;\n\t\t\tcase Fire::Fire(4, true, true, true, true, true).ID: return 1264;\n\t\t\tcase Fire::Fire(4, true, true, true, true, false).ID: return 1265;\n\t\t\tcase Fire::Fire(4, true, true, true, false, true).ID: return 1266;\n\t\t\tcase Fire::Fire(4, true, true, true, false, false).ID: return 1267;\n\t\t\tcase Fire::Fire(4, true, true, false, true, true).ID: return 1268;\n\t\t\tcase Fire::Fire(4, true, true, false, true, false).ID: return 1269;\n\t\t\tcase Fire::Fire(4, true, true, false, false, true).ID: return 1270;\n\t\t\tcase Fire::Fire(4, true, true, false, false, false).ID: return 1271;\n\t\t\tcase Fire::Fire(4, true, false, true, true, true).ID: return 1272;\n\t\t\tcase Fire::Fire(4, true, false, true, true, false).ID: return 1273;\n\t\t\tcase Fire::Fire(4, true, false, true, false, true).ID: return 1274;\n\t\t\tcase Fire::Fire(4, true, false, true, false, false).ID: return 1275;\n\t\t\tcase Fire::Fire(4, true, false, false, true, true).ID: return 1276;\n\t\t\tcase Fire::Fire(4, true, false, false, true, false).ID: return 1277;\n\t\t\tcase Fire::Fire(4, true, false, false, false, true).ID: return 1278;\n\t\t\tcase Fire::Fire(4, true, false, false, false, false).ID: return 1279;\n\t\t\tcase Fire::Fire(4, false, true, true, true, true).ID: return 1280;\n\t\t\tcase Fire::Fire(4, false, true, true, true, false).ID: return 1281;\n\t\t\tcase Fire::Fire(4, false, true, true, false, true).ID: return 1282;\n\t\t\tcase Fire::Fire(4, false, true, true, false, false).ID: return 1283;\n\t\t\tcase Fire::Fire(4, false, true, false, true, true).ID: return 1284;\n\t\t\tcase Fire::Fire(4, false, true, false, true, false).ID: return 1285;\n\t\t\tcase Fire::Fire(4, false, true, false, false, true).ID: return 1286;\n\t\t\tcase Fire::Fire(4, false, true, false, false, false).ID: return 1287;\n\t\t\tcase Fire::Fire(4, false, false, true, true, true).ID: return 1288;\n\t\t\tcase Fire::Fire(4, false, false, true, true, false).ID: return 1289;\n\t\t\tcase Fire::Fire(4, false, false, true, false, true).ID: return 1290;\n\t\t\tcase Fire::Fire(4, false, false, true, false, false).ID: return 1291;\n\t\t\tcase Fire::Fire(4, false, false, false, true, true).ID: return 1292;\n\t\t\tcase Fire::Fire(4, false, false, false, true, false).ID: return 1293;\n\t\t\tcase Fire::Fire(4, false, false, false, false, true).ID: return 1294;\n\t\t\tcase Fire::Fire(4, false, false, false, false, false).ID: return 1295;\n\t\t\tcase Fire::Fire(5, true, true, true, true, true).ID: return 1296;\n\t\t\tcase Fire::Fire(5, true, true, true, true, false).ID: return 1297;\n\t\t\tcase Fire::Fire(5, true, true, true, false, true).ID: return 1298;\n\t\t\tcase Fire::Fire(5, true, true, true, false, false).ID: return 1299;\n\t\t\tcase Fire::Fire(5, true, true, false, true, true).ID: return 1300;\n\t\t\tcase Fire::Fire(5, true, true, false, true, false).ID: return 1301;\n\t\t\tcase Fire::Fire(5, true, true, false, false, true).ID: return 1302;\n\t\t\tcase Fire::Fire(5, true, true, false, false, false).ID: return 1303;\n\t\t\tcase Fire::Fire(5, true, false, true, true, true).ID: return 1304;\n\t\t\tcase Fire::Fire(5, true, false, true, true, false).ID: return 1305;\n\t\t\tcase Fire::Fire(5, true, false, true, false, true).ID: return 1306;\n\t\t\tcase Fire::Fire(5, true, false, true, false, false).ID: return 1307;\n\t\t\tcase Fire::Fire(5, true, false, false, true, true).ID: return 1308;\n\t\t\tcase Fire::Fire(5, true, false, false, true, false).ID: return 1309;\n\t\t\tcase Fire::Fire(5, true, false, false, false, true).ID: return 1310;\n\t\t\tcase Fire::Fire(5, true, false, false, false, false).ID: return 1311;\n\t\t\tcase Fire::Fire(5, false, true, true, true, true).ID: return 1312;\n\t\t\tcase Fire::Fire(5, false, true, true, true, false).ID: return 1313;\n\t\t\tcase Fire::Fire(5, false, true, true, false, true).ID: return 1314;\n\t\t\tcase Fire::Fire(5, false, true, true, false, false).ID: return 1315;\n\t\t\tcase Fire::Fire(5, false, true, false, true, true).ID: return 1316;\n\t\t\tcase Fire::Fire(5, false, true, false, true, false).ID: return 1317;\n\t\t\tcase Fire::Fire(5, false, true, false, false, true).ID: return 1318;\n\t\t\tcase Fire::Fire(5, false, true, false, false, false).ID: return 1319;\n\t\t\tcase Fire::Fire(5, false, false, true, true, true).ID: return 1320;\n\t\t\tcase Fire::Fire(5, false, false, true, true, false).ID: return 1321;\n\t\t\tcase Fire::Fire(5, false, false, true, false, true).ID: return 1322;\n\t\t\tcase Fire::Fire(5, false, false, true, false, false).ID: return 1323;\n\t\t\tcase Fire::Fire(5, false, false, false, true, true).ID: return 1324;\n\t\t\tcase Fire::Fire(5, false, false, false, true, false).ID: return 1325;\n\t\t\tcase Fire::Fire(5, false, false, false, false, true).ID: return 1326;\n\t\t\tcase Fire::Fire(5, false, false, false, false, false).ID: return 1327;\n\t\t\tcase Fire::Fire(6, true, true, true, true, true).ID: return 1328;\n\t\t\tcase Fire::Fire(6, true, true, true, true, false).ID: return 1329;\n\t\t\tcase Fire::Fire(6, true, true, true, false, true).ID: return 1330;\n\t\t\tcase Fire::Fire(6, true, true, true, false, false).ID: return 1331;\n\t\t\tcase Fire::Fire(6, true, true, false, true, true).ID: return 1332;\n\t\t\tcase Fire::Fire(6, true, true, false, true, false).ID: return 1333;\n\t\t\tcase Fire::Fire(6, true, true, false, false, true).ID: return 1334;\n\t\t\tcase Fire::Fire(6, true, true, false, false, false).ID: return 1335;\n\t\t\tcase Fire::Fire(6, true, false, true, true, true).ID: return 1336;\n\t\t\tcase Fire::Fire(6, true, false, true, true, false).ID: return 1337;\n\t\t\tcase Fire::Fire(6, true, false, true, false, true).ID: return 1338;\n\t\t\tcase Fire::Fire(6, true, false, true, false, false).ID: return 1339;\n\t\t\tcase Fire::Fire(6, true, false, false, true, true).ID: return 1340;\n\t\t\tcase Fire::Fire(6, true, false, false, true, false).ID: return 1341;\n\t\t\tcase Fire::Fire(6, true, false, false, false, true).ID: return 1342;\n\t\t\tcase Fire::Fire(6, true, false, false, false, false).ID: return 1343;\n\t\t\tcase Fire::Fire(6, false, true, true, true, true).ID: return 1344;\n\t\t\tcase Fire::Fire(6, false, true, true, true, false).ID: return 1345;\n\t\t\tcase Fire::Fire(6, false, true, true, false, true).ID: return 1346;\n\t\t\tcase Fire::Fire(6, false, true, true, false, false).ID: return 1347;\n\t\t\tcase Fire::Fire(6, false, true, false, true, true).ID: return 1348;\n\t\t\tcase Fire::Fire(6, false, true, false, true, false).ID: return 1349;\n\t\t\tcase Fire::Fire(6, false, true, false, false, true).ID: return 1350;\n\t\t\tcase Fire::Fire(6, false, true, false, false, false).ID: return 1351;\n\t\t\tcase Fire::Fire(6, false, false, true, true, true).ID: return 1352;\n\t\t\tcase Fire::Fire(6, false, false, true, true, false).ID: return 1353;\n\t\t\tcase Fire::Fire(6, false, false, true, false, true).ID: return 1354;\n\t\t\tcase Fire::Fire(6, false, false, true, false, false).ID: return 1355;\n\t\t\tcase Fire::Fire(6, false, false, false, true, true).ID: return 1356;\n\t\t\tcase Fire::Fire(6, false, false, false, true, false).ID: return 1357;\n\t\t\tcase Fire::Fire(6, false, false, false, false, true).ID: return 1358;\n\t\t\tcase Fire::Fire(6, false, false, false, false, false).ID: return 1359;\n\t\t\tcase Fire::Fire(7, true, true, true, true, true).ID: return 1360;\n\t\t\tcase Fire::Fire(7, true, true, true, true, false).ID: return 1361;\n\t\t\tcase Fire::Fire(7, true, true, true, false, true).ID: return 1362;\n\t\t\tcase Fire::Fire(7, true, true, true, false, false).ID: return 1363;\n\t\t\tcase Fire::Fire(7, true, true, false, true, true).ID: return 1364;\n\t\t\tcase Fire::Fire(7, true, true, false, true, false).ID: return 1365;\n\t\t\tcase Fire::Fire(7, true, true, false, false, true).ID: return 1366;\n\t\t\tcase Fire::Fire(7, true, true, false, false, false).ID: return 1367;\n\t\t\tcase Fire::Fire(7, true, false, true, true, true).ID: return 1368;\n\t\t\tcase Fire::Fire(7, true, false, true, true, false).ID: return 1369;\n\t\t\tcase Fire::Fire(7, true, false, true, false, true).ID: return 1370;\n\t\t\tcase Fire::Fire(7, true, false, true, false, false).ID: return 1371;\n\t\t\tcase Fire::Fire(7, true, false, false, true, true).ID: return 1372;\n\t\t\tcase Fire::Fire(7, true, false, false, true, false).ID: return 1373;\n\t\t\tcase Fire::Fire(7, true, false, false, false, true).ID: return 1374;\n\t\t\tcase Fire::Fire(7, true, false, false, false, false).ID: return 1375;\n\t\t\tcase Fire::Fire(7, false, true, true, true, true).ID: return 1376;\n\t\t\tcase Fire::Fire(7, false, true, true, true, false).ID: return 1377;\n\t\t\tcase Fire::Fire(7, false, true, true, false, true).ID: return 1378;\n\t\t\tcase Fire::Fire(7, false, true, true, false, false).ID: return 1379;\n\t\t\tcase Fire::Fire(7, false, true, false, true, true).ID: return 1380;\n\t\t\tcase Fire::Fire(7, false, true, false, true, false).ID: return 1381;\n\t\t\tcase Fire::Fire(7, false, true, false, false, true).ID: return 1382;\n\t\t\tcase Fire::Fire(7, false, true, false, false, false).ID: return 1383;\n\t\t\tcase Fire::Fire(7, false, false, true, true, true).ID: return 1384;\n\t\t\tcase Fire::Fire(7, false, false, true, true, false).ID: return 1385;\n\t\t\tcase Fire::Fire(7, false, false, true, false, true).ID: return 1386;\n\t\t\tcase Fire::Fire(7, false, false, true, false, false).ID: return 1387;\n\t\t\tcase Fire::Fire(7, false, false, false, true, true).ID: return 1388;\n\t\t\tcase Fire::Fire(7, false, false, false, true, false).ID: return 1389;\n\t\t\tcase Fire::Fire(7, false, false, false, false, true).ID: return 1390;\n\t\t\tcase Fire::Fire(7, false, false, false, false, false).ID: return 1391;\n\t\t\tcase Fire::Fire(8, true, true, true, true, true).ID: return 1392;\n\t\t\tcase Fire::Fire(8, true, true, true, true, false).ID: return 1393;\n\t\t\tcase Fire::Fire(8, true, true, true, false, true).ID: return 1394;\n\t\t\tcase Fire::Fire(8, true, true, true, false, false).ID: return 1395;\n\t\t\tcase Fire::Fire(8, true, true, false, true, true).ID: return 1396;\n\t\t\tcase Fire::Fire(8, true, true, false, true, false).ID: return 1397;\n\t\t\tcase Fire::Fire(8, true, true, false, false, true).ID: return 1398;\n\t\t\tcase Fire::Fire(8, true, true, false, false, false).ID: return 1399;\n\t\t\tcase Fire::Fire(8, true, false, true, true, true).ID: return 1400;\n\t\t\tcase Fire::Fire(8, true, false, true, true, false).ID: return 1401;\n\t\t\tcase Fire::Fire(8, true, false, true, false, true).ID: return 1402;\n\t\t\tcase Fire::Fire(8, true, false, true, false, false).ID: return 1403;\n\t\t\tcase Fire::Fire(8, true, false, false, true, true).ID: return 1404;\n\t\t\tcase Fire::Fire(8, true, false, false, true, false).ID: return 1405;\n\t\t\tcase Fire::Fire(8, true, false, false, false, true).ID: return 1406;\n\t\t\tcase Fire::Fire(8, true, false, false, false, false).ID: return 1407;\n\t\t\tcase Fire::Fire(8, false, true, true, true, true).ID: return 1408;\n\t\t\tcase Fire::Fire(8, false, true, true, true, false).ID: return 1409;\n\t\t\tcase Fire::Fire(8, false, true, true, false, true).ID: return 1410;\n\t\t\tcase Fire::Fire(8, false, true, true, false, false).ID: return 1411;\n\t\t\tcase Fire::Fire(8, false, true, false, true, true).ID: return 1412;\n\t\t\tcase Fire::Fire(8, false, true, false, true, false).ID: return 1413;\n\t\t\tcase Fire::Fire(8, false, true, false, false, true).ID: return 1414;\n\t\t\tcase Fire::Fire(8, false, true, false, false, false).ID: return 1415;\n\t\t\tcase Fire::Fire(8, false, false, true, true, true).ID: return 1416;\n\t\t\tcase Fire::Fire(8, false, false, true, true, false).ID: return 1417;\n\t\t\tcase Fire::Fire(8, false, false, true, false, true).ID: return 1418;\n\t\t\tcase Fire::Fire(8, false, false, true, false, false).ID: return 1419;\n\t\t\tcase Fire::Fire(8, false, false, false, true, true).ID: return 1420;\n\t\t\tcase Fire::Fire(8, false, false, false, true, false).ID: return 1421;\n\t\t\tcase Fire::Fire(8, false, false, false, false, true).ID: return 1422;\n\t\t\tcase Fire::Fire(8, false, false, false, false, false).ID: return 1423;\n\t\t\tcase Fire::Fire(9, true, true, true, true, true).ID: return 1424;\n\t\t\tcase Fire::Fire(9, true, true, true, true, false).ID: return 1425;\n\t\t\tcase Fire::Fire(9, true, true, true, false, true).ID: return 1426;\n\t\t\tcase Fire::Fire(9, true, true, true, false, false).ID: return 1427;\n\t\t\tcase Fire::Fire(9, true, true, false, true, true).ID: return 1428;\n\t\t\tcase Fire::Fire(9, true, true, false, true, false).ID: return 1429;\n\t\t\tcase Fire::Fire(9, true, true, false, false, true).ID: return 1430;\n\t\t\tcase Fire::Fire(9, true, true, false, false, false).ID: return 1431;\n\t\t\tcase Fire::Fire(9, true, false, true, true, true).ID: return 1432;\n\t\t\tcase Fire::Fire(9, true, false, true, true, false).ID: return 1433;\n\t\t\tcase Fire::Fire(9, true, false, true, false, true).ID: return 1434;\n\t\t\tcase Fire::Fire(9, true, false, true, false, false).ID: return 1435;\n\t\t\tcase Fire::Fire(9, true, false, false, true, true).ID: return 1436;\n\t\t\tcase Fire::Fire(9, true, false, false, true, false).ID: return 1437;\n\t\t\tcase Fire::Fire(9, true, false, false, false, true).ID: return 1438;\n\t\t\tcase Fire::Fire(9, true, false, false, false, false).ID: return 1439;\n\t\t\tcase Fire::Fire(9, false, true, true, true, true).ID: return 1440;\n\t\t\tcase Fire::Fire(9, false, true, true, true, false).ID: return 1441;\n\t\t\tcase Fire::Fire(9, false, true, true, false, true).ID: return 1442;\n\t\t\tcase Fire::Fire(9, false, true, true, false, false).ID: return 1443;\n\t\t\tcase Fire::Fire(9, false, true, false, true, true).ID: return 1444;\n\t\t\tcase Fire::Fire(9, false, true, false, true, false).ID: return 1445;\n\t\t\tcase Fire::Fire(9, false, true, false, false, true).ID: return 1446;\n\t\t\tcase Fire::Fire(9, false, true, false, false, false).ID: return 1447;\n\t\t\tcase Fire::Fire(9, false, false, true, true, true).ID: return 1448;\n\t\t\tcase Fire::Fire(9, false, false, true, true, false).ID: return 1449;\n\t\t\tcase Fire::Fire(9, false, false, true, false, true).ID: return 1450;\n\t\t\tcase Fire::Fire(9, false, false, true, false, false).ID: return 1451;\n\t\t\tcase Fire::Fire(9, false, false, false, true, true).ID: return 1452;\n\t\t\tcase Fire::Fire(9, false, false, false, true, false).ID: return 1453;\n\t\t\tcase Fire::Fire(9, false, false, false, false, true).ID: return 1454;\n\t\t\tcase Fire::Fire(9, false, false, false, false, false).ID: return 1455;\n\t\t\tcase Fire::Fire(10, true, true, true, true, true).ID: return 1456;\n\t\t\tcase Fire::Fire(10, true, true, true, true, false).ID: return 1457;\n\t\t\tcase Fire::Fire(10, true, true, true, false, true).ID: return 1458;\n\t\t\tcase Fire::Fire(10, true, true, true, false, false).ID: return 1459;\n\t\t\tcase Fire::Fire(10, true, true, false, true, true).ID: return 1460;\n\t\t\tcase Fire::Fire(10, true, true, false, true, false).ID: return 1461;\n\t\t\tcase Fire::Fire(10, true, true, false, false, true).ID: return 1462;\n\t\t\tcase Fire::Fire(10, true, true, false, false, false).ID: return 1463;\n\t\t\tcase Fire::Fire(10, true, false, true, true, true).ID: return 1464;\n\t\t\tcase Fire::Fire(10, true, false, true, true, false).ID: return 1465;\n\t\t\tcase Fire::Fire(10, true, false, true, false, true).ID: return 1466;\n\t\t\tcase Fire::Fire(10, true, false, true, false, false).ID: return 1467;\n\t\t\tcase Fire::Fire(10, true, false, false, true, true).ID: return 1468;\n\t\t\tcase Fire::Fire(10, true, false, false, true, false).ID: return 1469;\n\t\t\tcase Fire::Fire(10, true, false, false, false, true).ID: return 1470;\n\t\t\tcase Fire::Fire(10, true, false, false, false, false).ID: return 1471;\n\t\t\tcase Fire::Fire(10, false, true, true, true, true).ID: return 1472;\n\t\t\tcase Fire::Fire(10, false, true, true, true, false).ID: return 1473;\n\t\t\tcase Fire::Fire(10, false, true, true, false, true).ID: return 1474;\n\t\t\tcase Fire::Fire(10, false, true, true, false, false).ID: return 1475;\n\t\t\tcase Fire::Fire(10, false, true, false, true, true).ID: return 1476;\n\t\t\tcase Fire::Fire(10, false, true, false, true, false).ID: return 1477;\n\t\t\tcase Fire::Fire(10, false, true, false, false, true).ID: return 1478;\n\t\t\tcase Fire::Fire(10, false, true, false, false, false).ID: return 1479;\n\t\t\tcase Fire::Fire(10, false, false, true, true, true).ID: return 1480;\n\t\t\tcase Fire::Fire(10, false, false, true, true, false).ID: return 1481;\n\t\t\tcase Fire::Fire(10, false, false, true, false, true).ID: return 1482;\n\t\t\tcase Fire::Fire(10, false, false, true, false, false).ID: return 1483;\n\t\t\tcase Fire::Fire(10, false, false, false, true, true).ID: return 1484;\n\t\t\tcase Fire::Fire(10, false, false, false, true, false).ID: return 1485;\n\t\t\tcase Fire::Fire(10, false, false, false, false, true).ID: return 1486;\n\t\t\tcase Fire::Fire(10, false, false, false, false, false).ID: return 1487;\n\t\t\tcase Fire::Fire(11, true, true, true, true, true).ID: return 1488;\n\t\t\tcase Fire::Fire(11, true, true, true, true, false).ID: return 1489;\n\t\t\tcase Fire::Fire(11, true, true, true, false, true).ID: return 1490;\n\t\t\tcase Fire::Fire(11, true, true, true, false, false).ID: return 1491;\n\t\t\tcase Fire::Fire(11, true, true, false, true, true).ID: return 1492;\n\t\t\tcase Fire::Fire(11, true, true, false, true, false).ID: return 1493;\n\t\t\tcase Fire::Fire(11, true, true, false, false, true).ID: return 1494;\n\t\t\tcase Fire::Fire(11, true, true, false, false, false).ID: return 1495;\n\t\t\tcase Fire::Fire(11, true, false, true, true, true).ID: return 1496;\n\t\t\tcase Fire::Fire(11, true, false, true, true, false).ID: return 1497;\n\t\t\tcase Fire::Fire(11, true, false, true, false, true).ID: return 1498;\n\t\t\tcase Fire::Fire(11, true, false, true, false, false).ID: return 1499;\n\t\t\tcase Fire::Fire(11, true, false, false, true, true).ID: return 1500;\n\t\t\tcase Fire::Fire(11, true, false, false, true, false).ID: return 1501;\n\t\t\tcase Fire::Fire(11, true, false, false, false, true).ID: return 1502;\n\t\t\tcase Fire::Fire(11, true, false, false, false, false).ID: return 1503;\n\t\t\tcase Fire::Fire(11, false, true, true, true, true).ID: return 1504;\n\t\t\tcase Fire::Fire(11, false, true, true, true, false).ID: return 1505;\n\t\t\tcase Fire::Fire(11, false, true, true, false, true).ID: return 1506;\n\t\t\tcase Fire::Fire(11, false, true, true, false, false).ID: return 1507;\n\t\t\tcase Fire::Fire(11, false, true, false, true, true).ID: return 1508;\n\t\t\tcase Fire::Fire(11, false, true, false, true, false).ID: return 1509;\n\t\t\tcase Fire::Fire(11, false, true, false, false, true).ID: return 1510;\n\t\t\tcase Fire::Fire(11, false, true, false, false, false).ID: return 1511;\n\t\t\tcase Fire::Fire(11, false, false, true, true, true).ID: return 1512;\n\t\t\tcase Fire::Fire(11, false, false, true, true, false).ID: return 1513;\n\t\t\tcase Fire::Fire(11, false, false, true, false, true).ID: return 1514;\n\t\t\tcase Fire::Fire(11, false, false, true, false, false).ID: return 1515;\n\t\t\tcase Fire::Fire(11, false, false, false, true, true).ID: return 1516;\n\t\t\tcase Fire::Fire(11, false, false, false, true, false).ID: return 1517;\n\t\t\tcase Fire::Fire(11, false, false, false, false, true).ID: return 1518;\n\t\t\tcase Fire::Fire(11, false, false, false, false, false).ID: return 1519;\n\t\t\tcase Fire::Fire(12, true, true, true, true, true).ID: return 1520;\n\t\t\tcase Fire::Fire(12, true, true, true, true, false).ID: return 1521;\n\t\t\tcase Fire::Fire(12, true, true, true, false, true).ID: return 1522;\n\t\t\tcase Fire::Fire(12, true, true, true, false, false).ID: return 1523;\n\t\t\tcase Fire::Fire(12, true, true, false, true, true).ID: return 1524;\n\t\t\tcase Fire::Fire(12, true, true, false, true, false).ID: return 1525;\n\t\t\tcase Fire::Fire(12, true, true, false, false, true).ID: return 1526;\n\t\t\tcase Fire::Fire(12, true, true, false, false, false).ID: return 1527;\n\t\t\tcase Fire::Fire(12, true, false, true, true, true).ID: return 1528;\n\t\t\tcase Fire::Fire(12, true, false, true, true, false).ID: return 1529;\n\t\t\tcase Fire::Fire(12, true, false, true, false, true).ID: return 1530;\n\t\t\tcase Fire::Fire(12, true, false, true, false, false).ID: return 1531;\n\t\t\tcase Fire::Fire(12, true, false, false, true, true).ID: return 1532;\n\t\t\tcase Fire::Fire(12, true, false, false, true, false).ID: return 1533;\n\t\t\tcase Fire::Fire(12, true, false, false, false, true).ID: return 1534;\n\t\t\tcase Fire::Fire(12, true, false, false, false, false).ID: return 1535;\n\t\t\tcase Fire::Fire(12, false, true, true, true, true).ID: return 1536;\n\t\t\tcase Fire::Fire(12, false, true, true, true, false).ID: return 1537;\n\t\t\tcase Fire::Fire(12, false, true, true, false, true).ID: return 1538;\n\t\t\tcase Fire::Fire(12, false, true, true, false, false).ID: return 1539;\n\t\t\tcase Fire::Fire(12, false, true, false, true, true).ID: return 1540;\n\t\t\tcase Fire::Fire(12, false, true, false, true, false).ID: return 1541;\n\t\t\tcase Fire::Fire(12, false, true, false, false, true).ID: return 1542;\n\t\t\tcase Fire::Fire(12, false, true, false, false, false).ID: return 1543;\n\t\t\tcase Fire::Fire(12, false, false, true, true, true).ID: return 1544;\n\t\t\tcase Fire::Fire(12, false, false, true, true, false).ID: return 1545;\n\t\t\tcase Fire::Fire(12, false, false, true, false, true).ID: return 1546;\n\t\t\tcase Fire::Fire(12, false, false, true, false, false).ID: return 1547;\n\t\t\tcase Fire::Fire(12, false, false, false, true, true).ID: return 1548;\n\t\t\tcase Fire::Fire(12, false, false, false, true, false).ID: return 1549;\n\t\t\tcase Fire::Fire(12, false, false, false, false, true).ID: return 1550;\n\t\t\tcase Fire::Fire(12, false, false, false, false, false).ID: return 1551;\n\t\t\tcase Fire::Fire(13, true, true, true, true, true).ID: return 1552;\n\t\t\tcase Fire::Fire(13, true, true, true, true, false).ID: return 1553;\n\t\t\tcase Fire::Fire(13, true, true, true, false, true).ID: return 1554;\n\t\t\tcase Fire::Fire(13, true, true, true, false, false).ID: return 1555;\n\t\t\tcase Fire::Fire(13, true, true, false, true, true).ID: return 1556;\n\t\t\tcase Fire::Fire(13, true, true, false, true, false).ID: return 1557;\n\t\t\tcase Fire::Fire(13, true, true, false, false, true).ID: return 1558;\n\t\t\tcase Fire::Fire(13, true, true, false, false, false).ID: return 1559;\n\t\t\tcase Fire::Fire(13, true, false, true, true, true).ID: return 1560;\n\t\t\tcase Fire::Fire(13, true, false, true, true, false).ID: return 1561;\n\t\t\tcase Fire::Fire(13, true, false, true, false, true).ID: return 1562;\n\t\t\tcase Fire::Fire(13, true, false, true, false, false).ID: return 1563;\n\t\t\tcase Fire::Fire(13, true, false, false, true, true).ID: return 1564;\n\t\t\tcase Fire::Fire(13, true, false, false, true, false).ID: return 1565;\n\t\t\tcase Fire::Fire(13, true, false, false, false, true).ID: return 1566;\n\t\t\tcase Fire::Fire(13, true, false, false, false, false).ID: return 1567;\n\t\t\tcase Fire::Fire(13, false, true, true, true, true).ID: return 1568;\n\t\t\tcase Fire::Fire(13, false, true, true, true, false).ID: return 1569;\n\t\t\tcase Fire::Fire(13, false, true, true, false, true).ID: return 1570;\n\t\t\tcase Fire::Fire(13, false, true, true, false, false).ID: return 1571;\n\t\t\tcase Fire::Fire(13, false, true, false, true, true).ID: return 1572;\n\t\t\tcase Fire::Fire(13, false, true, false, true, false).ID: return 1573;\n\t\t\tcase Fire::Fire(13, false, true, false, false, true).ID: return 1574;\n\t\t\tcase Fire::Fire(13, false, true, false, false, false).ID: return 1575;\n\t\t\tcase Fire::Fire(13, false, false, true, true, true).ID: return 1576;\n\t\t\tcase Fire::Fire(13, false, false, true, true, false).ID: return 1577;\n\t\t\tcase Fire::Fire(13, false, false, true, false, true).ID: return 1578;\n\t\t\tcase Fire::Fire(13, false, false, true, false, false).ID: return 1579;\n\t\t\tcase Fire::Fire(13, false, false, false, true, true).ID: return 1580;\n\t\t\tcase Fire::Fire(13, false, false, false, true, false).ID: return 1581;\n\t\t\tcase Fire::Fire(13, false, false, false, false, true).ID: return 1582;\n\t\t\tcase Fire::Fire(13, false, false, false, false, false).ID: return 1583;\n\t\t\tcase Fire::Fire(14, true, true, true, true, true).ID: return 1584;\n\t\t\tcase Fire::Fire(14, true, true, true, true, false).ID: return 1585;\n\t\t\tcase Fire::Fire(14, true, true, true, false, true).ID: return 1586;\n\t\t\tcase Fire::Fire(14, true, true, true, false, false).ID: return 1587;\n\t\t\tcase Fire::Fire(14, true, true, false, true, true).ID: return 1588;\n\t\t\tcase Fire::Fire(14, true, true, false, true, false).ID: return 1589;\n\t\t\tcase Fire::Fire(14, true, true, false, false, true).ID: return 1590;\n\t\t\tcase Fire::Fire(14, true, true, false, false, false).ID: return 1591;\n\t\t\tcase Fire::Fire(14, true, false, true, true, true).ID: return 1592;\n\t\t\tcase Fire::Fire(14, true, false, true, true, false).ID: return 1593;\n\t\t\tcase Fire::Fire(14, true, false, true, false, true).ID: return 1594;\n\t\t\tcase Fire::Fire(14, true, false, true, false, false).ID: return 1595;\n\t\t\tcase Fire::Fire(14, true, false, false, true, true).ID: return 1596;\n\t\t\tcase Fire::Fire(14, true, false, false, true, false).ID: return 1597;\n\t\t\tcase Fire::Fire(14, true, false, false, false, true).ID: return 1598;\n\t\t\tcase Fire::Fire(14, true, false, false, false, false).ID: return 1599;\n\t\t\tcase Fire::Fire(14, false, true, true, true, true).ID: return 1600;\n\t\t\tcase Fire::Fire(14, false, true, true, true, false).ID: return 1601;\n\t\t\tcase Fire::Fire(14, false, true, true, false, true).ID: return 1602;\n\t\t\tcase Fire::Fire(14, false, true, true, false, false).ID: return 1603;\n\t\t\tcase Fire::Fire(14, false, true, false, true, true).ID: return 1604;\n\t\t\tcase Fire::Fire(14, false, true, false, true, false).ID: return 1605;\n\t\t\tcase Fire::Fire(14, false, true, false, false, true).ID: return 1606;\n\t\t\tcase Fire::Fire(14, false, true, false, false, false).ID: return 1607;\n\t\t\tcase Fire::Fire(14, false, false, true, true, true).ID: return 1608;\n\t\t\tcase Fire::Fire(14, false, false, true, true, false).ID: return 1609;\n\t\t\tcase Fire::Fire(14, false, false, true, false, true).ID: return 1610;\n\t\t\tcase Fire::Fire(14, false, false, true, false, false).ID: return 1611;\n\t\t\tcase Fire::Fire(14, false, false, false, true, true).ID: return 1612;\n\t\t\tcase Fire::Fire(14, false, false, false, true, false).ID: return 1613;\n\t\t\tcase Fire::Fire(14, false, false, false, false, true).ID: return 1614;\n\t\t\tcase Fire::Fire(14, false, false, false, false, false).ID: return 1615;\n\t\t\tcase Fire::Fire(15, true, true, true, true, true).ID: return 1616;\n\t\t\tcase Fire::Fire(15, true, true, true, true, false).ID: return 1617;\n\t\t\tcase Fire::Fire(15, true, true, true, false, true).ID: return 1618;\n\t\t\tcase Fire::Fire(15, true, true, true, false, false).ID: return 1619;\n\t\t\tcase Fire::Fire(15, true, true, false, true, true).ID: return 1620;\n\t\t\tcase Fire::Fire(15, true, true, false, true, false).ID: return 1621;\n\t\t\tcase Fire::Fire(15, true, true, false, false, true).ID: return 1622;\n\t\t\tcase Fire::Fire(15, true, true, false, false, false).ID: return 1623;\n\t\t\tcase Fire::Fire(15, true, false, true, true, true).ID: return 1624;\n\t\t\tcase Fire::Fire(15, true, false, true, true, false).ID: return 1625;\n\t\t\tcase Fire::Fire(15, true, false, true, false, true).ID: return 1626;\n\t\t\tcase Fire::Fire(15, true, false, true, false, false).ID: return 1627;\n\t\t\tcase Fire::Fire(15, true, false, false, true, true).ID: return 1628;\n\t\t\tcase Fire::Fire(15, true, false, false, true, false).ID: return 1629;\n\t\t\tcase Fire::Fire(15, true, false, false, false, true).ID: return 1630;\n\t\t\tcase Fire::Fire(15, true, false, false, false, false).ID: return 1631;\n\t\t\tcase Fire::Fire(15, false, true, true, true, true).ID: return 1632;\n\t\t\tcase Fire::Fire(15, false, true, true, true, false).ID: return 1633;\n\t\t\tcase Fire::Fire(15, false, true, true, false, true).ID: return 1634;\n\t\t\tcase Fire::Fire(15, false, true, true, false, false).ID: return 1635;\n\t\t\tcase Fire::Fire(15, false, true, false, true, true).ID: return 1636;\n\t\t\tcase Fire::Fire(15, false, true, false, true, false).ID: return 1637;\n\t\t\tcase Fire::Fire(15, false, true, false, false, true).ID: return 1638;\n\t\t\tcase Fire::Fire(15, false, true, false, false, false).ID: return 1639;\n\t\t\tcase Fire::Fire(15, false, false, true, true, true).ID: return 1640;\n\t\t\tcase Fire::Fire(15, false, false, true, true, false).ID: return 1641;\n\t\t\tcase Fire::Fire(15, false, false, true, false, true).ID: return 1642;\n\t\t\tcase Fire::Fire(15, false, false, true, false, false).ID: return 1643;\n\t\t\tcase Fire::Fire(15, false, false, false, true, true).ID: return 1644;\n\t\t\tcase Fire::Fire(15, false, false, false, true, false).ID: return 1645;\n\t\t\tcase Fire::Fire(15, false, false, false, false, true).ID: return 1646;\n\t\t\tcase Fire::Fire(15, false, false, false, false, false).ID: return 1647;\n\t\t\tcase FireCoral::FireCoral().ID: return 8477;\n\t\t\tcase FireCoralBlock::FireCoralBlock().ID: return 8458;\n\t\t\tcase FireCoralFan::FireCoralFan().ID: return 8577;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8545;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8547;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8549;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8551;\n\t\t\tcase FlowerPot::FlowerPot().ID: return 5266;\n\t\t\tcase FrostedIce::FrostedIce(0).ID: return 8189;\n\t\t\tcase FrostedIce::FrostedIce(1).ID: return 8190;\n\t\t\tcase FrostedIce::FrostedIce(2).ID: return 8191;\n\t\t\tcase FrostedIce::FrostedIce(3).ID: return 8192;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3068;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3069;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3070;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3071;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, true).ID: return 3072;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, false).ID: return 3073;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, true).ID: return 3074;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, false).ID: return 3075;\n\t\t\tcase Glass::Glass().ID: return 230;\n\t\t\tcase GlassPane::GlassPane(true, true, true, true).ID: return 4214;\n\t\t\tcase GlassPane::GlassPane(true, true, true, false).ID: return 4215;\n\t\t\tcase GlassPane::GlassPane(true, true, false, true).ID: return 4218;\n\t\t\tcase GlassPane::GlassPane(true, true, false, false).ID: return 4219;\n\t\t\tcase GlassPane::GlassPane(true, false, true, true).ID: return 4222;\n\t\t\tcase GlassPane::GlassPane(true, false, true, false).ID: return 4223;\n\t\t\tcase GlassPane::GlassPane(true, false, false, true).ID: return 4226;\n\t\t\tcase GlassPane::GlassPane(true, false, false, false).ID: return 4227;\n\t\t\tcase GlassPane::GlassPane(false, true, true, true).ID: return 4230;\n\t\t\tcase GlassPane::GlassPane(false, true, true, false).ID: return 4231;\n\t\t\tcase GlassPane::GlassPane(false, true, false, true).ID: return 4234;\n\t\t\tcase GlassPane::GlassPane(false, true, false, false).ID: return 4235;\n\t\t\tcase GlassPane::GlassPane(false, false, true, true).ID: return 4238;\n\t\t\tcase GlassPane::GlassPane(false, false, true, false).ID: return 4239;\n\t\t\tcase GlassPane::GlassPane(false, false, false, true).ID: return 4242;\n\t\t\tcase GlassPane::GlassPane(false, false, false, false).ID: return 4243;\n\t\t\tcase Glowstone::Glowstone().ID: return 3496;\n\t\t\tcase GoldBlock::GoldBlock().ID: return 1123;\n\t\t\tcase GoldOre::GoldOre().ID: return 69;\n\t\t\tcase Granite::Granite().ID: return 2;\n\t\t\tcase Grass::Grass().ID: return 1041;\n\t\t\tcase GrassBlock::GrassBlock(true).ID: return 8;\n\t\t\tcase GrassBlock::GrassBlock(false).ID: return 9;\n\t\t\tcase GrassPath::GrassPath().ID: return 8163;\n\t\t\tcase Gravel::Gravel().ID: return 68;\n\t\t\tcase GrayBanner::GrayBanner(0).ID: return 6967;\n\t\t\tcase GrayBanner::GrayBanner(1).ID: return 6968;\n\t\t\tcase GrayBanner::GrayBanner(2).ID: return 6969;\n\t\t\tcase GrayBanner::GrayBanner(3).ID: return 6970;\n\t\t\tcase GrayBanner::GrayBanner(4).ID: return 6971;\n\t\t\tcase GrayBanner::GrayBanner(5).ID: return 6972;\n\t\t\tcase GrayBanner::GrayBanner(6).ID: return 6973;\n\t\t\tcase GrayBanner::GrayBanner(7).ID: return 6974;\n\t\t\tcase GrayBanner::GrayBanner(8).ID: return 6975;\n\t\t\tcase GrayBanner::GrayBanner(9).ID: return 6976;\n\t\t\tcase GrayBanner::GrayBanner(10).ID: return 6977;\n\t\t\tcase GrayBanner::GrayBanner(11).ID: return 6978;\n\t\t\tcase GrayBanner::GrayBanner(12).ID: return 6979;\n\t\t\tcase GrayBanner::GrayBanner(13).ID: return 6980;\n\t\t\tcase GrayBanner::GrayBanner(14).ID: return 6981;\n\t\t\tcase GrayBanner::GrayBanner(15).ID: return 6982;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Head).ID: return 860;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Foot).ID: return 861;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Head).ID: return 862;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Foot).ID: return 863;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Head).ID: return 864;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Foot).ID: return 865;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Head).ID: return 866;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Foot).ID: return 867;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Head).ID: return 868;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Foot).ID: return 869;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Head).ID: return 870;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Foot).ID: return 871;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Head).ID: return 872;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Foot).ID: return 873;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Head).ID: return 874;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Foot).ID: return 875;\n\t\t\tcase GrayCarpet::GrayCarpet().ID: return 6831;\n\t\t\tcase GrayConcrete::GrayConcrete().ID: return 8385;\n\t\t\tcase GrayConcretePowder::GrayConcretePowder().ID: return 8401;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8342;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8343;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8344;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8345;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8260;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8261;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8262;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8263;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8264;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8265;\n\t\t\tcase GrayStainedGlass::GrayStainedGlass().ID: return 3585;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, true).ID: return 6047;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, false).ID: return 6048;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, true).ID: return 6051;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, false).ID: return 6052;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, true).ID: return 6055;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, false).ID: return 6056;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, true).ID: return 6059;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, false).ID: return 6060;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, true).ID: return 6063;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, false).ID: return 6064;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, true).ID: return 6067;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, false).ID: return 6068;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, true).ID: return 6071;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, false).ID: return 6072;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, true).ID: return 6075;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, false).ID: return 6076;\n\t\t\tcase GrayTerracotta::GrayTerracotta().ID: return 5812;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7139;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7140;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7141;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7142;\n\t\t\tcase GrayWool::GrayWool().ID: return 1090;\n\t\t\tcase GreenBanner::GreenBanner(0).ID: return 7063;\n\t\t\tcase GreenBanner::GreenBanner(1).ID: return 7064;\n\t\t\tcase GreenBanner::GreenBanner(2).ID: return 7065;\n\t\t\tcase GreenBanner::GreenBanner(3).ID: return 7066;\n\t\t\tcase GreenBanner::GreenBanner(4).ID: return 7067;\n\t\t\tcase GreenBanner::GreenBanner(5).ID: return 7068;\n\t\t\tcase GreenBanner::GreenBanner(6).ID: return 7069;\n\t\t\tcase GreenBanner::GreenBanner(7).ID: return 7070;\n\t\t\tcase GreenBanner::GreenBanner(8).ID: return 7071;\n\t\t\tcase GreenBanner::GreenBanner(9).ID: return 7072;\n\t\t\tcase GreenBanner::GreenBanner(10).ID: return 7073;\n\t\t\tcase GreenBanner::GreenBanner(11).ID: return 7074;\n\t\t\tcase GreenBanner::GreenBanner(12).ID: return 7075;\n\t\t\tcase GreenBanner::GreenBanner(13).ID: return 7076;\n\t\t\tcase GreenBanner::GreenBanner(14).ID: return 7077;\n\t\t\tcase GreenBanner::GreenBanner(15).ID: return 7078;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Head).ID: return 956;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Foot).ID: return 957;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Head).ID: return 958;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Foot).ID: return 959;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Head).ID: return 960;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Foot).ID: return 961;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Head).ID: return 962;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Foot).ID: return 963;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Head).ID: return 964;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Foot).ID: return 965;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Head).ID: return 966;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Foot).ID: return 967;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Head).ID: return 968;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Foot).ID: return 969;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Head).ID: return 970;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Foot).ID: return 971;\n\t\t\tcase GreenCarpet::GreenCarpet().ID: return 6837;\n\t\t\tcase GreenConcrete::GreenConcrete().ID: return 8391;\n\t\t\tcase GreenConcretePowder::GreenConcretePowder().ID: return 8407;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8366;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8367;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8368;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8369;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8296;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8297;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8298;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8299;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8300;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8301;\n\t\t\tcase GreenStainedGlass::GreenStainedGlass().ID: return 3591;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, true).ID: return 6239;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, false).ID: return 6240;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, true).ID: return 6243;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, false).ID: return 6244;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, true).ID: return 6247;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, false).ID: return 6248;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, true).ID: return 6251;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, false).ID: return 6252;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, true).ID: return 6255;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, false).ID: return 6256;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, true).ID: return 6259;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, false).ID: return 6260;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, true).ID: return 6263;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, false).ID: return 6264;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, true).ID: return 6267;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, false).ID: return 6268;\n\t\t\tcase GreenTerracotta::GreenTerracotta().ID: return 5818;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7163;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7164;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7165;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7166;\n\t\t\tcase GreenWool::GreenWool().ID: return 1096;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::X).ID: return 6821;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Y).ID: return 6822;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Z).ID: return 6823;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(0).ID: return 5620;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(1).ID: return 5621;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(2).ID: return 5622;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(3).ID: return 5623;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(4).ID: return 5624;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(5).ID: return 5625;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(6).ID: return 5626;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(7).ID: return 5627;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(8).ID: return 5628;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(9).ID: return 5629;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(10).ID: return 5630;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(11).ID: return 5631;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(12).ID: return 5632;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(13).ID: return 5633;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(14).ID: return 5634;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(15).ID: return 5635;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_YM).ID: return 5686;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5687;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5688;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XM).ID: return 5689;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XP).ID: return 5690;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_YM).ID: return 5691;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5692;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5693;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XM).ID: return 5694;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XP).ID: return 5695;\n\t\t\tcase HornCoral::HornCoral().ID: return 8479;\n\t\t\tcase HornCoralBlock::HornCoralBlock().ID: return 8459;\n\t\t\tcase HornCoralFan::HornCoralFan().ID: return 8579;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8553;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8555;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8557;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8559;\n\t\t\tcase Ice::Ice().ID: return 3424;\n\t\t\tcase InfestedChiseledStoneBricks::InfestedChiseledStoneBricks().ID: return 3983;\n\t\t\tcase InfestedCobblestone::InfestedCobblestone().ID: return 3979;\n\t\t\tcase InfestedCrackedStoneBricks::InfestedCrackedStoneBricks().ID: return 3982;\n\t\t\tcase InfestedMossyStoneBricks::InfestedMossyStoneBricks().ID: return 3981;\n\t\t\tcase InfestedStone::InfestedStone().ID: return 3978;\n\t\t\tcase InfestedStoneBricks::InfestedStoneBricks().ID: return 3980;\n\t\t\tcase IronBars::IronBars(true, true, true, true).ID: return 4182;\n\t\t\tcase IronBars::IronBars(true, true, true, false).ID: return 4183;\n\t\t\tcase IronBars::IronBars(true, true, false, true).ID: return 4186;\n\t\t\tcase IronBars::IronBars(true, true, false, false).ID: return 4187;\n\t\t\tcase IronBars::IronBars(true, false, true, true).ID: return 4190;\n\t\t\tcase IronBars::IronBars(true, false, true, false).ID: return 4191;\n\t\t\tcase IronBars::IronBars(true, false, false, true).ID: return 4194;\n\t\t\tcase IronBars::IronBars(true, false, false, false).ID: return 4195;\n\t\t\tcase IronBars::IronBars(false, true, true, true).ID: return 4198;\n\t\t\tcase IronBars::IronBars(false, true, true, false).ID: return 4199;\n\t\t\tcase IronBars::IronBars(false, true, false, true).ID: return 4202;\n\t\t\tcase IronBars::IronBars(false, true, false, false).ID: return 4203;\n\t\t\tcase IronBars::IronBars(false, false, true, true).ID: return 4206;\n\t\t\tcase IronBars::IronBars(false, false, true, false).ID: return 4207;\n\t\t\tcase IronBars::IronBars(false, false, false, true).ID: return 4210;\n\t\t\tcase IronBars::IronBars(false, false, false, false).ID: return 4211;\n\t\t\tcase IronBlock::IronBlock().ID: return 1124;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3304;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3305;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3306;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3307;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3308;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3309;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3310;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3311;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3312;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3313;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3314;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3315;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3316;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3317;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3318;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3319;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3320;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3321;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3322;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3323;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3324;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3325;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3326;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3327;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3328;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3329;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3330;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3331;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3332;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3333;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3334;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3335;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3336;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3337;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3338;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3339;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3340;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3341;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3342;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3343;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3344;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3345;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3346;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3347;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3348;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3349;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3350;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3351;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3352;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3353;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3354;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3355;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3356;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3357;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3358;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3359;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3360;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3361;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3362;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3363;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3364;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3365;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3366;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3367;\n\t\t\tcase IronOre::IronOre().ID: return 70;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, true).ID: return 6496;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, false).ID: return 6498;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, true).ID: return 6500;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, false).ID: return 6502;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, true).ID: return 6504;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, false).ID: return 6506;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, true).ID: return 6508;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, false).ID: return 6510;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, true).ID: return 6512;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, false).ID: return 6514;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, true).ID: return 6516;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, false).ID: return 6518;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, true).ID: return 6520;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, false).ID: return 6522;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, true).ID: return 6524;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, false).ID: return 6526;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, true).ID: return 6528;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, false).ID: return 6530;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, true).ID: return 6532;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, false).ID: return 6534;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, true).ID: return 6536;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, false).ID: return 6538;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, true).ID: return 6540;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, false).ID: return 6542;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, true).ID: return 6544;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, false).ID: return 6546;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, true).ID: return 6548;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, false).ID: return 6550;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, true).ID: return 6552;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, false).ID: return 6554;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, true).ID: return 6556;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, false).ID: return 6558;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZM).ID: return 3503;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZP).ID: return 3504;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XM).ID: return 3505;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XP).ID: return 3506;\n\t\t\tcase Jukebox::Jukebox(true).ID: return 3459;\n\t\t\tcase Jukebox::Jukebox(false).ID: return 3460;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5376;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5377;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5378;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5379;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5380;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5381;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5382;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5383;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5384;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5385;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5386;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5387;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5388;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5389;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5390;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5391;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5392;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5393;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5394;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5395;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5396;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5397;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5398;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5399;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 7806;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 7807;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 7808;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 7809;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 7810;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 7811;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 7812;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 7813;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 7814;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 7815;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 7816;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 7817;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 7818;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 7819;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 7820;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 7821;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 7822;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 7823;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 7824;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 7825;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 7826;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 7827;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 7828;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 7829;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 7830;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 7831;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 7832;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 7833;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 7834;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 7835;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 7836;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 7837;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 7838;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 7839;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 7840;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 7841;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 7842;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 7843;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 7844;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 7845;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 7846;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 7847;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 7848;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 7849;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 7850;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 7851;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 7852;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 7853;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 7854;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 7855;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 7856;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 7857;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 7858;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 7859;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 7860;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 7861;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 7862;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 7863;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 7864;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 7865;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 7866;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 7867;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 7868;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 7869;\n\t\t\tcase JungleFence::JungleFence(true, true, true, true).ID: return 7584;\n\t\t\tcase JungleFence::JungleFence(true, true, true, false).ID: return 7585;\n\t\t\tcase JungleFence::JungleFence(true, true, false, true).ID: return 7588;\n\t\t\tcase JungleFence::JungleFence(true, true, false, false).ID: return 7589;\n\t\t\tcase JungleFence::JungleFence(true, false, true, true).ID: return 7592;\n\t\t\tcase JungleFence::JungleFence(true, false, true, false).ID: return 7593;\n\t\t\tcase JungleFence::JungleFence(true, false, false, true).ID: return 7596;\n\t\t\tcase JungleFence::JungleFence(true, false, false, false).ID: return 7597;\n\t\t\tcase JungleFence::JungleFence(false, true, true, true).ID: return 7600;\n\t\t\tcase JungleFence::JungleFence(false, true, true, false).ID: return 7601;\n\t\t\tcase JungleFence::JungleFence(false, true, false, true).ID: return 7604;\n\t\t\tcase JungleFence::JungleFence(false, true, false, false).ID: return 7605;\n\t\t\tcase JungleFence::JungleFence(false, false, true, true).ID: return 7608;\n\t\t\tcase JungleFence::JungleFence(false, false, true, false).ID: return 7609;\n\t\t\tcase JungleFence::JungleFence(false, false, false, true).ID: return 7612;\n\t\t\tcase JungleFence::JungleFence(false, false, false, false).ID: return 7613;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7422;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7423;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7424;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7425;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7426;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7427;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7428;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7429;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7430;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7431;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7432;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7433;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7434;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7435;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7436;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7437;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7438;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7439;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7440;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7441;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7442;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7443;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7444;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7445;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7446;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7447;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7448;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7449;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7450;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7451;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7452;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7453;\n\t\t\tcase JungleLeaves::JungleLeaves(1, true).ID: return 186;\n\t\t\tcase JungleLeaves::JungleLeaves(1, false).ID: return 187;\n\t\t\tcase JungleLeaves::JungleLeaves(2, true).ID: return 188;\n\t\t\tcase JungleLeaves::JungleLeaves(2, false).ID: return 189;\n\t\t\tcase JungleLeaves::JungleLeaves(3, true).ID: return 190;\n\t\t\tcase JungleLeaves::JungleLeaves(3, false).ID: return 191;\n\t\t\tcase JungleLeaves::JungleLeaves(4, true).ID: return 192;\n\t\t\tcase JungleLeaves::JungleLeaves(4, false).ID: return 193;\n\t\t\tcase JungleLeaves::JungleLeaves(5, true).ID: return 194;\n\t\t\tcase JungleLeaves::JungleLeaves(5, false).ID: return 195;\n\t\t\tcase JungleLeaves::JungleLeaves(6, true).ID: return 196;\n\t\t\tcase JungleLeaves::JungleLeaves(6, false).ID: return 197;\n\t\t\tcase JungleLeaves::JungleLeaves(7, true).ID: return 198;\n\t\t\tcase JungleLeaves::JungleLeaves(7, false).ID: return 199;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::X).ID: return 81;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Y).ID: return 82;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Z).ID: return 83;\n\t\t\tcase JunglePlanks::JunglePlanks().ID: return 18;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(true).ID: return 3374;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(false).ID: return 3375;\n\t\t\tcase JungleSapling::JungleSapling(0).ID: return 27;\n\t\t\tcase JungleSapling::JungleSapling(1).ID: return 28;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Top).ID: return 7277;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Bottom).ID: return 7279;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Double).ID: return 7281;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5046;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5048;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5050;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5052;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5054;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5056;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5058;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5060;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5062;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5064;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5066;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5068;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5070;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5072;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5074;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5076;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5078;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5080;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5082;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5084;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5086;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5088;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5090;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5092;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5094;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5096;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5098;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5100;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5102;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5104;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5106;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5108;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5110;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5112;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5114;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5116;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5118;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5120;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5122;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5124;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, true).ID: return 3787;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, false).ID: return 3789;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, true).ID: return 3791;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, false).ID: return 3793;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, true).ID: return 3795;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, false).ID: return 3797;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, true).ID: return 3799;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, false).ID: return 3801;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, true).ID: return 3803;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, false).ID: return 3805;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, true).ID: return 3807;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, false).ID: return 3809;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, true).ID: return 3811;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, false).ID: return 3813;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, true).ID: return 3815;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, false).ID: return 3817;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, true).ID: return 3819;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, false).ID: return 3821;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, true).ID: return 3823;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, false).ID: return 3825;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, true).ID: return 3827;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, false).ID: return 3829;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, true).ID: return 3831;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, false).ID: return 3833;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, true).ID: return 3835;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, false).ID: return 3837;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, true).ID: return 3839;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, false).ID: return 3841;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, true).ID: return 3843;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, false).ID: return 3845;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, true).ID: return 3847;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, false).ID: return 3849;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::X).ID: return 117;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Y).ID: return 118;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Z).ID: return 119;\n\t\t\tcase Kelp::Kelp(0).ID: return 8410;\n\t\t\tcase Kelp::Kelp(1).ID: return 8411;\n\t\t\tcase Kelp::Kelp(2).ID: return 8412;\n\t\t\tcase Kelp::Kelp(3).ID: return 8413;\n\t\t\tcase Kelp::Kelp(4).ID: return 8414;\n\t\t\tcase Kelp::Kelp(5).ID: return 8415;\n\t\t\tcase Kelp::Kelp(6).ID: return 8416;\n\t\t\tcase Kelp::Kelp(7).ID: return 8417;\n\t\t\tcase Kelp::Kelp(8).ID: return 8418;\n\t\t\tcase Kelp::Kelp(9).ID: return 8419;\n\t\t\tcase Kelp::Kelp(10).ID: return 8420;\n\t\t\tcase Kelp::Kelp(11).ID: return 8421;\n\t\t\tcase Kelp::Kelp(12).ID: return 8422;\n\t\t\tcase Kelp::Kelp(13).ID: return 8423;\n\t\t\tcase Kelp::Kelp(14).ID: return 8424;\n\t\t\tcase Kelp::Kelp(15).ID: return 8425;\n\t\t\tcase Kelp::Kelp(16).ID: return 8426;\n\t\t\tcase Kelp::Kelp(17).ID: return 8427;\n\t\t\tcase Kelp::Kelp(18).ID: return 8428;\n\t\t\tcase Kelp::Kelp(19).ID: return 8429;\n\t\t\tcase Kelp::Kelp(20).ID: return 8430;\n\t\t\tcase Kelp::Kelp(21).ID: return 8431;\n\t\t\tcase Kelp::Kelp(22).ID: return 8432;\n\t\t\tcase Kelp::Kelp(23).ID: return 8433;\n\t\t\tcase Kelp::Kelp(24).ID: return 8434;\n\t\t\tcase Kelp::Kelp(25).ID: return 8435;\n\t\t\tcase KelpPlant::KelpPlant().ID: return 8436;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZM).ID: return 3173;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZP).ID: return 3175;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XM).ID: return 3177;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XP).ID: return 3179;\n\t\t\tcase LapisBlock::LapisBlock().ID: return 232;\n\t\t\tcase LapisOre::LapisOre().ID: return 231;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Upper).ID: return 6853;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Lower).ID: return 6854;\n\t\t\tcase Lava::Lava(0).ID: return 50;\n\t\t\tcase Lava::Lava(1).ID: return 51;\n\t\t\tcase Lava::Lava(2).ID: return 52;\n\t\t\tcase Lava::Lava(3).ID: return 53;\n\t\t\tcase Lava::Lava(4).ID: return 54;\n\t\t\tcase Lava::Lava(5).ID: return 55;\n\t\t\tcase Lava::Lava(6).ID: return 56;\n\t\t\tcase Lava::Lava(7).ID: return 57;\n\t\t\tcase Lava::Lava(8).ID: return 58;\n\t\t\tcase Lava::Lava(9).ID: return 59;\n\t\t\tcase Lava::Lava(10).ID: return 60;\n\t\t\tcase Lava::Lava(11).ID: return 61;\n\t\t\tcase Lava::Lava(12).ID: return 62;\n\t\t\tcase Lava::Lava(13).ID: return 63;\n\t\t\tcase Lava::Lava(14).ID: return 64;\n\t\t\tcase Lava::Lava(15).ID: return 65;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3278;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3279;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3280;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3281;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3282;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3283;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3284;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3285;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3286;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3287;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3288;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3289;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3290;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3291;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3292;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3293;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3294;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3295;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3296;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3297;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3298;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3299;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3300;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3301;\n\t\t\tcase LightBlueBanner::LightBlueBanner(0).ID: return 6903;\n\t\t\tcase LightBlueBanner::LightBlueBanner(1).ID: return 6904;\n\t\t\tcase LightBlueBanner::LightBlueBanner(2).ID: return 6905;\n\t\t\tcase LightBlueBanner::LightBlueBanner(3).ID: return 6906;\n\t\t\tcase LightBlueBanner::LightBlueBanner(4).ID: return 6907;\n\t\t\tcase LightBlueBanner::LightBlueBanner(5).ID: return 6908;\n\t\t\tcase LightBlueBanner::LightBlueBanner(6).ID: return 6909;\n\t\t\tcase LightBlueBanner::LightBlueBanner(7).ID: return 6910;\n\t\t\tcase LightBlueBanner::LightBlueBanner(8).ID: return 6911;\n\t\t\tcase LightBlueBanner::LightBlueBanner(9).ID: return 6912;\n\t\t\tcase LightBlueBanner::LightBlueBanner(10).ID: return 6913;\n\t\t\tcase LightBlueBanner::LightBlueBanner(11).ID: return 6914;\n\t\t\tcase LightBlueBanner::LightBlueBanner(12).ID: return 6915;\n\t\t\tcase LightBlueBanner::LightBlueBanner(13).ID: return 6916;\n\t\t\tcase LightBlueBanner::LightBlueBanner(14).ID: return 6917;\n\t\t\tcase LightBlueBanner::LightBlueBanner(15).ID: return 6918;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Head).ID: return 796;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Foot).ID: return 797;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Head).ID: return 798;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Foot).ID: return 799;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Head).ID: return 800;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Foot).ID: return 801;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Head).ID: return 802;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Foot).ID: return 803;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Head).ID: return 804;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Foot).ID: return 805;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Head).ID: return 806;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Foot).ID: return 807;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Head).ID: return 808;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Foot).ID: return 809;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Head).ID: return 810;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Foot).ID: return 811;\n\t\t\tcase LightBlueCarpet::LightBlueCarpet().ID: return 6827;\n\t\t\tcase LightBlueConcrete::LightBlueConcrete().ID: return 8381;\n\t\t\tcase LightBlueConcretePowder::LightBlueConcretePowder().ID: return 8397;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8326;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8327;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8328;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8329;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8236;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8237;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8238;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8239;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8240;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8241;\n\t\t\tcase LightBlueStainedGlass::LightBlueStainedGlass().ID: return 3581;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, true).ID: return 5919;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, false).ID: return 5920;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, true).ID: return 5923;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, false).ID: return 5924;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, true).ID: return 5927;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, false).ID: return 5928;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, true).ID: return 5931;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, false).ID: return 5932;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, true).ID: return 5935;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, false).ID: return 5936;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, true).ID: return 5939;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, false).ID: return 5940;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, true).ID: return 5943;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, false).ID: return 5944;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, true).ID: return 5947;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, false).ID: return 5948;\n\t\t\tcase LightBlueTerracotta::LightBlueTerracotta().ID: return 5808;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7123;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7124;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7125;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7126;\n\t\t\tcase LightBlueWool::LightBlueWool().ID: return 1086;\n\t\t\tcase LightGrayBanner::LightGrayBanner(0).ID: return 6983;\n\t\t\tcase LightGrayBanner::LightGrayBanner(1).ID: return 6984;\n\t\t\tcase LightGrayBanner::LightGrayBanner(2).ID: return 6985;\n\t\t\tcase LightGrayBanner::LightGrayBanner(3).ID: return 6986;\n\t\t\tcase LightGrayBanner::LightGrayBanner(4).ID: return 6987;\n\t\t\tcase LightGrayBanner::LightGrayBanner(5).ID: return 6988;\n\t\t\tcase LightGrayBanner::LightGrayBanner(6).ID: return 6989;\n\t\t\tcase LightGrayBanner::LightGrayBanner(7).ID: return 6990;\n\t\t\tcase LightGrayBanner::LightGrayBanner(8).ID: return 6991;\n\t\t\tcase LightGrayBanner::LightGrayBanner(9).ID: return 6992;\n\t\t\tcase LightGrayBanner::LightGrayBanner(10).ID: return 6993;\n\t\t\tcase LightGrayBanner::LightGrayBanner(11).ID: return 6994;\n\t\t\tcase LightGrayBanner::LightGrayBanner(12).ID: return 6995;\n\t\t\tcase LightGrayBanner::LightGrayBanner(13).ID: return 6996;\n\t\t\tcase LightGrayBanner::LightGrayBanner(14).ID: return 6997;\n\t\t\tcase LightGrayBanner::LightGrayBanner(15).ID: return 6998;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Head).ID: return 876;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Foot).ID: return 877;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Head).ID: return 878;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Foot).ID: return 879;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Head).ID: return 880;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Foot).ID: return 881;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Head).ID: return 882;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Foot).ID: return 883;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Head).ID: return 884;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Foot).ID: return 885;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Head).ID: return 886;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Foot).ID: return 887;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Head).ID: return 888;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Foot).ID: return 889;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Head).ID: return 890;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Foot).ID: return 891;\n\t\t\tcase LightGrayCarpet::LightGrayCarpet().ID: return 6832;\n\t\t\tcase LightGrayConcrete::LightGrayConcrete().ID: return 8386;\n\t\t\tcase LightGrayConcretePowder::LightGrayConcretePowder().ID: return 8402;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8346;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8347;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8348;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8349;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8266;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8267;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8268;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8269;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8270;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8271;\n\t\t\tcase LightGrayStainedGlass::LightGrayStainedGlass().ID: return 3586;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, true).ID: return 6079;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, false).ID: return 6080;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, true).ID: return 6083;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, false).ID: return 6084;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, true).ID: return 6087;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, false).ID: return 6088;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, true).ID: return 6091;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, false).ID: return 6092;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, true).ID: return 6095;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, false).ID: return 6096;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, true).ID: return 6099;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, false).ID: return 6100;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, true).ID: return 6103;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, false).ID: return 6104;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, true).ID: return 6107;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, false).ID: return 6108;\n\t\t\tcase LightGrayTerracotta::LightGrayTerracotta().ID: return 5813;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7143;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7144;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7145;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7146;\n\t\t\tcase LightGrayWool::LightGrayWool().ID: return 1091;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(0).ID: return 5604;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(1).ID: return 5605;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(2).ID: return 5606;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(3).ID: return 5607;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(4).ID: return 5608;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(5).ID: return 5609;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(6).ID: return 5610;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(7).ID: return 5611;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(8).ID: return 5612;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(9).ID: return 5613;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(10).ID: return 5614;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(11).ID: return 5615;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(12).ID: return 5616;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(13).ID: return 5617;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(14).ID: return 5618;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(15).ID: return 5619;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Upper).ID: return 6845;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Lower).ID: return 6846;\n\t\t\tcase LilyPad::LilyPad().ID: return 4495;\n\t\t\tcase LimeBanner::LimeBanner(0).ID: return 6935;\n\t\t\tcase LimeBanner::LimeBanner(1).ID: return 6936;\n\t\t\tcase LimeBanner::LimeBanner(2).ID: return 6937;\n\t\t\tcase LimeBanner::LimeBanner(3).ID: return 6938;\n\t\t\tcase LimeBanner::LimeBanner(4).ID: return 6939;\n\t\t\tcase LimeBanner::LimeBanner(5).ID: return 6940;\n\t\t\tcase LimeBanner::LimeBanner(6).ID: return 6941;\n\t\t\tcase LimeBanner::LimeBanner(7).ID: return 6942;\n\t\t\tcase LimeBanner::LimeBanner(8).ID: return 6943;\n\t\t\tcase LimeBanner::LimeBanner(9).ID: return 6944;\n\t\t\tcase LimeBanner::LimeBanner(10).ID: return 6945;\n\t\t\tcase LimeBanner::LimeBanner(11).ID: return 6946;\n\t\t\tcase LimeBanner::LimeBanner(12).ID: return 6947;\n\t\t\tcase LimeBanner::LimeBanner(13).ID: return 6948;\n\t\t\tcase LimeBanner::LimeBanner(14).ID: return 6949;\n\t\t\tcase LimeBanner::LimeBanner(15).ID: return 6950;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Head).ID: return 828;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Foot).ID: return 829;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Head).ID: return 830;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Foot).ID: return 831;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Head).ID: return 832;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Foot).ID: return 833;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Head).ID: return 834;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Foot).ID: return 835;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Head).ID: return 836;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Foot).ID: return 837;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Head).ID: return 838;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Foot).ID: return 839;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Head).ID: return 840;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Foot).ID: return 841;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Head).ID: return 842;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Foot).ID: return 843;\n\t\t\tcase LimeCarpet::LimeCarpet().ID: return 6829;\n\t\t\tcase LimeConcrete::LimeConcrete().ID: return 8383;\n\t\t\tcase LimeConcretePowder::LimeConcretePowder().ID: return 8399;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8334;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8335;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8336;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8337;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8248;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8249;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8250;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8251;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8252;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8253;\n\t\t\tcase LimeStainedGlass::LimeStainedGlass().ID: return 3583;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, true).ID: return 5983;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, false).ID: return 5984;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, true).ID: return 5987;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, false).ID: return 5988;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, true).ID: return 5991;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, false).ID: return 5992;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, true).ID: return 5995;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, false).ID: return 5996;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, true).ID: return 5999;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, false).ID: return 6000;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, true).ID: return 6003;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, false).ID: return 6004;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, true).ID: return 6007;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, false).ID: return 6008;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, true).ID: return 6011;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, false).ID: return 6012;\n\t\t\tcase LimeTerracotta::LimeTerracotta().ID: return 5810;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7131;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7132;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7133;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7134;\n\t\t\tcase LimeWool::LimeWool().ID: return 1088;\n\t\t\tcase MagentaBanner::MagentaBanner(0).ID: return 6887;\n\t\t\tcase MagentaBanner::MagentaBanner(1).ID: return 6888;\n\t\t\tcase MagentaBanner::MagentaBanner(2).ID: return 6889;\n\t\t\tcase MagentaBanner::MagentaBanner(3).ID: return 6890;\n\t\t\tcase MagentaBanner::MagentaBanner(4).ID: return 6891;\n\t\t\tcase MagentaBanner::MagentaBanner(5).ID: return 6892;\n\t\t\tcase MagentaBanner::MagentaBanner(6).ID: return 6893;\n\t\t\tcase MagentaBanner::MagentaBanner(7).ID: return 6894;\n\t\t\tcase MagentaBanner::MagentaBanner(8).ID: return 6895;\n\t\t\tcase MagentaBanner::MagentaBanner(9).ID: return 6896;\n\t\t\tcase MagentaBanner::MagentaBanner(10).ID: return 6897;\n\t\t\tcase MagentaBanner::MagentaBanner(11).ID: return 6898;\n\t\t\tcase MagentaBanner::MagentaBanner(12).ID: return 6899;\n\t\t\tcase MagentaBanner::MagentaBanner(13).ID: return 6900;\n\t\t\tcase MagentaBanner::MagentaBanner(14).ID: return 6901;\n\t\t\tcase MagentaBanner::MagentaBanner(15).ID: return 6902;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Head).ID: return 780;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Foot).ID: return 781;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Head).ID: return 782;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Foot).ID: return 783;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Head).ID: return 784;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Foot).ID: return 785;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Head).ID: return 786;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Foot).ID: return 787;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Head).ID: return 788;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Foot).ID: return 789;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Head).ID: return 790;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Foot).ID: return 791;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Head).ID: return 792;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Foot).ID: return 793;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Head).ID: return 794;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Foot).ID: return 795;\n\t\t\tcase MagentaCarpet::MagentaCarpet().ID: return 6826;\n\t\t\tcase MagentaConcrete::MagentaConcrete().ID: return 8380;\n\t\t\tcase MagentaConcretePowder::MagentaConcretePowder().ID: return 8396;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8322;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8323;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8324;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8325;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8230;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8231;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8232;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8233;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8234;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8235;\n\t\t\tcase MagentaStainedGlass::MagentaStainedGlass().ID: return 3580;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, true).ID: return 5887;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, false).ID: return 5888;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, true).ID: return 5891;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, false).ID: return 5892;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, true).ID: return 5895;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, false).ID: return 5896;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, true).ID: return 5899;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, false).ID: return 5900;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, true).ID: return 5903;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, false).ID: return 5904;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, true).ID: return 5907;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, false).ID: return 5908;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, true).ID: return 5911;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, false).ID: return 5912;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, true).ID: return 5915;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, false).ID: return 5916;\n\t\t\tcase MagentaTerracotta::MagentaTerracotta().ID: return 5807;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7119;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7120;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7121;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7122;\n\t\t\tcase MagentaWool::MagentaWool().ID: return 1085;\n\t\t\tcase MagmaBlock::MagmaBlock().ID: return 8193;\n\t\t\tcase Melon::Melon().ID: return 4244;\n\t\t\tcase MelonStem::MelonStem(0).ID: return 4261;\n\t\t\tcase MelonStem::MelonStem(1).ID: return 4262;\n\t\t\tcase MelonStem::MelonStem(2).ID: return 4263;\n\t\t\tcase MelonStem::MelonStem(3).ID: return 4264;\n\t\t\tcase MelonStem::MelonStem(4).ID: return 4265;\n\t\t\tcase MelonStem::MelonStem(5).ID: return 4266;\n\t\t\tcase MelonStem::MelonStem(6).ID: return 4267;\n\t\t\tcase MelonStem::MelonStem(7).ID: return 4268;\n\t\t\tcase MossyCobblestone::MossyCobblestone().ID: return 1129;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5204;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5205;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5208;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5209;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5212;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5213;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5216;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5217;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5220;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5221;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5224;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5225;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5228;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5229;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5232;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5233;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5236;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5237;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5240;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5241;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5244;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5245;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5248;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5249;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5252;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5253;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5256;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5257;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5260;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5261;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5264;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5265;\n\t\t\tcase MossyStoneBricks::MossyStoneBricks().ID: return 3985;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Normal).ID: return 1099;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Sticky).ID: return 1100;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Normal).ID: return 1101;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Sticky).ID: return 1102;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Normal).ID: return 1103;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Sticky).ID: return 1104;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Normal).ID: return 1105;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Sticky).ID: return 1106;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Normal).ID: return 1107;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Sticky).ID: return 1108;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Normal).ID: return 1109;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Sticky).ID: return 1110;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, true).ID: return 4116;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, false).ID: return 4117;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, true).ID: return 4118;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, false).ID: return 4119;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, true).ID: return 4120;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, false).ID: return 4121;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, true).ID: return 4122;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, false).ID: return 4123;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, true).ID: return 4124;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, false).ID: return 4125;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, true).ID: return 4126;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, false).ID: return 4127;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, true).ID: return 4128;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, false).ID: return 4129;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, true).ID: return 4130;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, false).ID: return 4131;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, true).ID: return 4132;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, false).ID: return 4133;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, true).ID: return 4134;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, false).ID: return 4135;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, true).ID: return 4136;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, false).ID: return 4137;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, true).ID: return 4138;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, false).ID: return 4139;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, true).ID: return 4140;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, false).ID: return 4141;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, true).ID: return 4142;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, false).ID: return 4143;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, true).ID: return 4144;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, false).ID: return 4145;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, true).ID: return 4146;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, false).ID: return 4147;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, true).ID: return 4148;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, false).ID: return 4149;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, true).ID: return 4150;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, false).ID: return 4151;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, true).ID: return 4152;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, false).ID: return 4153;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, true).ID: return 4154;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, false).ID: return 4155;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, true).ID: return 4156;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, false).ID: return 4157;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, true).ID: return 4158;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, false).ID: return 4159;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, true).ID: return 4160;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, false).ID: return 4161;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, true).ID: return 4162;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, false).ID: return 4163;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, true).ID: return 4164;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, false).ID: return 4165;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, true).ID: return 4166;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, false).ID: return 4167;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, true).ID: return 4168;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, false).ID: return 4169;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, true).ID: return 4170;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, false).ID: return 4171;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, true).ID: return 4172;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, false).ID: return 4173;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, true).ID: return 4174;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, false).ID: return 4175;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, true).ID: return 4176;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, false).ID: return 4177;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, true).ID: return 4178;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, false).ID: return 4179;\n\t\t\tcase Mycelium::Mycelium(true).ID: return 4493;\n\t\t\tcase Mycelium::Mycelium(false).ID: return 4494;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, true).ID: return 4499;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, false).ID: return 4500;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, true).ID: return 4503;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, false).ID: return 4504;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, true).ID: return 4507;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, false).ID: return 4508;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, true).ID: return 4511;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, false).ID: return 4512;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, true).ID: return 4515;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, false).ID: return 4516;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, true).ID: return 4519;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, false).ID: return 4520;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, true).ID: return 4523;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, false).ID: return 4524;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, true).ID: return 4527;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, false).ID: return 4528;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Top).ID: return 7331;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Bottom).ID: return 7333;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Double).ID: return 7335;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 4530;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 4532;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 4534;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 4536;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 4538;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 4540;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 4542;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 4544;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 4546;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 4548;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 4550;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 4552;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 4554;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 4556;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 4558;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 4560;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 4562;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 4564;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 4566;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 4568;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 4570;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 4572;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 4574;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 4576;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 4578;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 4580;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 4582;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 4584;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 4586;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 4588;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 4590;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 4592;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 4594;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 4596;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 4598;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 4600;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 4602;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 4604;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 4606;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 4608;\n\t\t\tcase NetherBricks::NetherBricks().ID: return 4496;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::X).ID: return 3497;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::Z).ID: return 3498;\n\t\t\tcase NetherQuartzOre::NetherQuartzOre().ID: return 5685;\n\t\t\tcase NetherWart::NetherWart(0).ID: return 4609;\n\t\t\tcase NetherWart::NetherWart(1).ID: return 4610;\n\t\t\tcase NetherWart::NetherWart(2).ID: return 4611;\n\t\t\tcase NetherWart::NetherWart(3).ID: return 4612;\n\t\t\tcase NetherWartBlock::NetherWartBlock().ID: return 8194;\n\t\t\tcase Netherrack::Netherrack().ID: return 3494;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, true).ID: return 248;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, false).ID: return 249;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, true).ID: return 250;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, false).ID: return 251;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, true).ID: return 252;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, false).ID: return 253;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, true).ID: return 254;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, false).ID: return 255;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, true).ID: return 256;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, false).ID: return 257;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, true).ID: return 258;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, false).ID: return 259;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, true).ID: return 260;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, false).ID: return 261;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, true).ID: return 262;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, false).ID: return 263;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, true).ID: return 264;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, false).ID: return 265;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, true).ID: return 266;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, false).ID: return 267;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, true).ID: return 268;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, false).ID: return 269;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, true).ID: return 270;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, false).ID: return 271;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, true).ID: return 272;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, false).ID: return 273;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, true).ID: return 274;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, false).ID: return 275;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, true).ID: return 276;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, false).ID: return 277;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, true).ID: return 278;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, false).ID: return 279;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, true).ID: return 280;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, false).ID: return 281;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, true).ID: return 282;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, false).ID: return 283;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, true).ID: return 284;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, false).ID: return 285;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, true).ID: return 286;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, false).ID: return 287;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, true).ID: return 288;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, false).ID: return 289;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, true).ID: return 290;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, false).ID: return 291;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, true).ID: return 292;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, false).ID: return 293;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, true).ID: return 294;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, false).ID: return 295;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, true).ID: return 296;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, false).ID: return 297;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, true).ID: return 298;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, false).ID: return 299;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, true).ID: return 300;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, false).ID: return 301;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, true).ID: return 302;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, false).ID: return 303;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, true).ID: return 304;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, false).ID: return 305;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, true).ID: return 306;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, false).ID: return 307;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, true).ID: return 308;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, false).ID: return 309;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, true).ID: return 310;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, false).ID: return 311;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, true).ID: return 312;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, false).ID: return 313;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, true).ID: return 314;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, false).ID: return 315;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, true).ID: return 316;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, false).ID: return 317;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, true).ID: return 318;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, false).ID: return 319;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, true).ID: return 320;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, false).ID: return 321;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, true).ID: return 322;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, false).ID: return 323;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, true).ID: return 324;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, false).ID: return 325;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, true).ID: return 326;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, false).ID: return 327;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, true).ID: return 328;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, false).ID: return 329;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, true).ID: return 330;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, false).ID: return 331;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, true).ID: return 332;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, false).ID: return 333;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, true).ID: return 334;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, false).ID: return 335;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, true).ID: return 336;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, false).ID: return 337;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, true).ID: return 338;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, false).ID: return 339;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, true).ID: return 340;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, false).ID: return 341;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, true).ID: return 342;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, false).ID: return 343;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, true).ID: return 344;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, false).ID: return 345;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, true).ID: return 346;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, false).ID: return 347;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, true).ID: return 348;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, false).ID: return 349;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, true).ID: return 350;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, false).ID: return 351;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, true).ID: return 352;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, false).ID: return 353;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, true).ID: return 354;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, false).ID: return 355;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, true).ID: return 356;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, false).ID: return 357;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, true).ID: return 358;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, false).ID: return 359;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, true).ID: return 360;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, false).ID: return 361;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, true).ID: return 362;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, false).ID: return 363;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, true).ID: return 364;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, false).ID: return 365;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, true).ID: return 366;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, false).ID: return 367;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, true).ID: return 368;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, false).ID: return 369;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, true).ID: return 370;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, false).ID: return 371;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, true).ID: return 372;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, false).ID: return 373;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, true).ID: return 374;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, false).ID: return 375;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, true).ID: return 376;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, false).ID: return 377;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, true).ID: return 378;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, false).ID: return 379;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, true).ID: return 380;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, false).ID: return 381;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, true).ID: return 382;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, false).ID: return 383;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, true).ID: return 384;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, false).ID: return 385;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, true).ID: return 386;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, false).ID: return 387;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, true).ID: return 388;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, false).ID: return 389;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, true).ID: return 390;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, false).ID: return 391;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, true).ID: return 392;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, false).ID: return 393;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, true).ID: return 394;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, false).ID: return 395;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, true).ID: return 396;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, false).ID: return 397;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, true).ID: return 398;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, false).ID: return 399;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, true).ID: return 400;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, false).ID: return 401;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, true).ID: return 402;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, false).ID: return 403;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, true).ID: return 404;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, false).ID: return 405;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, true).ID: return 406;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, false).ID: return 407;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, true).ID: return 408;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, false).ID: return 409;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, true).ID: return 410;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, false).ID: return 411;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, true).ID: return 412;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, false).ID: return 413;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, true).ID: return 414;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, false).ID: return 415;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, true).ID: return 416;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, false).ID: return 417;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, true).ID: return 418;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, false).ID: return 419;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, true).ID: return 420;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, false).ID: return 421;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, true).ID: return 422;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, false).ID: return 423;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, true).ID: return 424;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, false).ID: return 425;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, true).ID: return 426;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, false).ID: return 427;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, true).ID: return 428;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, false).ID: return 429;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, true).ID: return 430;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, false).ID: return 431;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, true).ID: return 432;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, false).ID: return 433;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, true).ID: return 434;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, false).ID: return 435;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, true).ID: return 436;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, false).ID: return 437;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, true).ID: return 438;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, false).ID: return 439;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, true).ID: return 440;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, false).ID: return 441;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, true).ID: return 442;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, false).ID: return 443;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, true).ID: return 444;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, false).ID: return 445;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, true).ID: return 446;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, false).ID: return 447;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, true).ID: return 448;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, false).ID: return 449;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, true).ID: return 450;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, false).ID: return 451;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, true).ID: return 452;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, false).ID: return 453;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, true).ID: return 454;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, false).ID: return 455;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, true).ID: return 456;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, false).ID: return 457;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, true).ID: return 458;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, false).ID: return 459;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, true).ID: return 460;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, false).ID: return 461;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, true).ID: return 462;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, false).ID: return 463;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, true).ID: return 464;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, false).ID: return 465;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, true).ID: return 466;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, false).ID: return 467;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, true).ID: return 468;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, false).ID: return 469;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, true).ID: return 470;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, false).ID: return 471;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, true).ID: return 472;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, false).ID: return 473;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, true).ID: return 474;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, false).ID: return 475;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, true).ID: return 476;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, false).ID: return 477;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, true).ID: return 478;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, false).ID: return 479;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, true).ID: return 480;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, false).ID: return 481;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, true).ID: return 482;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, false).ID: return 483;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, true).ID: return 484;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, false).ID: return 485;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, true).ID: return 486;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, false).ID: return 487;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, true).ID: return 488;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, false).ID: return 489;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, true).ID: return 490;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, false).ID: return 491;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, true).ID: return 492;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, false).ID: return 493;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, true).ID: return 494;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, false).ID: return 495;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, true).ID: return 496;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, false).ID: return 497;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, true).ID: return 498;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, false).ID: return 499;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, true).ID: return 500;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, false).ID: return 501;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, true).ID: return 502;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, false).ID: return 503;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, true).ID: return 504;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, false).ID: return 505;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, true).ID: return 506;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, false).ID: return 507;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, true).ID: return 508;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, false).ID: return 509;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, true).ID: return 510;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, false).ID: return 511;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, true).ID: return 512;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, false).ID: return 513;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, true).ID: return 514;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, false).ID: return 515;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, true).ID: return 516;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, false).ID: return 517;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, true).ID: return 518;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, false).ID: return 519;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, true).ID: return 520;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, false).ID: return 521;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, true).ID: return 522;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, false).ID: return 523;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, true).ID: return 524;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, false).ID: return 525;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, true).ID: return 526;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, false).ID: return 527;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, true).ID: return 528;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, false).ID: return 529;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, true).ID: return 530;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, false).ID: return 531;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, true).ID: return 532;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, false).ID: return 533;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, true).ID: return 534;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, false).ID: return 535;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, true).ID: return 536;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, false).ID: return 537;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, true).ID: return 538;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, false).ID: return 539;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, true).ID: return 540;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, false).ID: return 541;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, true).ID: return 542;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, false).ID: return 543;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, true).ID: return 544;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, false).ID: return 545;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, true).ID: return 546;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, false).ID: return 547;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, true).ID: return 548;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, false).ID: return 549;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, true).ID: return 550;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, false).ID: return 551;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, true).ID: return 552;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, false).ID: return 553;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, true).ID: return 554;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, false).ID: return 555;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, true).ID: return 556;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, false).ID: return 557;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, true).ID: return 558;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, false).ID: return 559;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, true).ID: return 560;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, false).ID: return 561;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, true).ID: return 562;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, false).ID: return 563;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, true).ID: return 564;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, false).ID: return 565;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, true).ID: return 566;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, false).ID: return 567;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, true).ID: return 568;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, false).ID: return 569;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, true).ID: return 570;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, false).ID: return 571;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, true).ID: return 572;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, false).ID: return 573;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, true).ID: return 574;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, false).ID: return 575;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, true).ID: return 576;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, false).ID: return 577;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, true).ID: return 578;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, false).ID: return 579;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, true).ID: return 580;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, false).ID: return 581;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, true).ID: return 582;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, false).ID: return 583;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, true).ID: return 584;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, false).ID: return 585;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, true).ID: return 586;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, false).ID: return 587;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, true).ID: return 588;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, false).ID: return 589;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, true).ID: return 590;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, false).ID: return 591;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, true).ID: return 592;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, false).ID: return 593;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, true).ID: return 594;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, false).ID: return 595;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, true).ID: return 596;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, false).ID: return 597;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, true).ID: return 598;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, false).ID: return 599;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, true).ID: return 600;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, false).ID: return 601;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, true).ID: return 602;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, false).ID: return 603;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, true).ID: return 604;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, false).ID: return 605;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, true).ID: return 606;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, false).ID: return 607;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, true).ID: return 608;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, false).ID: return 609;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, true).ID: return 610;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, false).ID: return 611;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, true).ID: return 612;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, false).ID: return 613;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, true).ID: return 614;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, false).ID: return 615;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, true).ID: return 616;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, false).ID: return 617;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, true).ID: return 618;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, false).ID: return 619;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, true).ID: return 620;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, false).ID: return 621;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, true).ID: return 622;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, false).ID: return 623;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, true).ID: return 624;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, false).ID: return 625;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, true).ID: return 626;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, false).ID: return 627;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, true).ID: return 628;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, false).ID: return 629;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, true).ID: return 630;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, false).ID: return 631;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, true).ID: return 632;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, false).ID: return 633;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, true).ID: return 634;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, false).ID: return 635;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, true).ID: return 636;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, false).ID: return 637;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, true).ID: return 638;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, false).ID: return 639;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, true).ID: return 640;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, false).ID: return 641;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, true).ID: return 642;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, false).ID: return 643;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, true).ID: return 644;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, false).ID: return 645;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, true).ID: return 646;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, false).ID: return 647;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, true).ID: return 648;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, false).ID: return 649;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, true).ID: return 650;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, false).ID: return 651;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, true).ID: return 652;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, false).ID: return 653;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, true).ID: return 654;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, false).ID: return 655;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, true).ID: return 656;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, false).ID: return 657;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, true).ID: return 658;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, false).ID: return 659;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, true).ID: return 660;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, false).ID: return 661;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, true).ID: return 662;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, false).ID: return 663;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, true).ID: return 664;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, false).ID: return 665;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, true).ID: return 666;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, false).ID: return 667;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, true).ID: return 668;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, false).ID: return 669;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, true).ID: return 670;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, false).ID: return 671;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, true).ID: return 672;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, false).ID: return 673;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, true).ID: return 674;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, false).ID: return 675;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, true).ID: return 676;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, false).ID: return 677;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, true).ID: return 678;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, false).ID: return 679;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, true).ID: return 680;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, false).ID: return 681;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, true).ID: return 682;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, false).ID: return 683;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, true).ID: return 684;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, false).ID: return 685;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, true).ID: return 686;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, false).ID: return 687;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, true).ID: return 688;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, false).ID: return 689;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, true).ID: return 690;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, false).ID: return 691;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, true).ID: return 692;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, false).ID: return 693;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, true).ID: return 694;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, false).ID: return 695;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, true).ID: return 696;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, false).ID: return 697;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, true).ID: return 698;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, false).ID: return 699;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, true).ID: return 700;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, false).ID: return 701;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, true).ID: return 702;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, false).ID: return 703;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, true).ID: return 704;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, false).ID: return 705;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, true).ID: return 706;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, false).ID: return 707;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, true).ID: return 708;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, false).ID: return 709;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, true).ID: return 710;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, false).ID: return 711;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, true).ID: return 712;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, false).ID: return 713;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, true).ID: return 714;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, false).ID: return 715;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, true).ID: return 716;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, false).ID: return 717;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, true).ID: return 718;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, false).ID: return 719;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, true).ID: return 720;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, false).ID: return 721;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, true).ID: return 722;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, false).ID: return 723;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, true).ID: return 724;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, false).ID: return 725;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, true).ID: return 726;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, false).ID: return 727;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, true).ID: return 728;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, false).ID: return 729;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, true).ID: return 730;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, false).ID: return 731;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, true).ID: return 732;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, false).ID: return 733;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, true).ID: return 734;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, false).ID: return 735;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, true).ID: return 736;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, false).ID: return 737;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, true).ID: return 738;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, false).ID: return 739;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, true).ID: return 740;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, false).ID: return 741;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, true).ID: return 742;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, false).ID: return 743;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, true).ID: return 744;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, false).ID: return 745;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, true).ID: return 746;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, false).ID: return 747;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5304;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5305;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5306;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5307;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5308;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5309;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5310;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5311;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5312;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5313;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5314;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5315;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5316;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5317;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5318;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5319;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5320;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5321;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5322;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5323;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5324;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5325;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5326;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5327;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3108;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3109;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3110;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3111;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3112;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3113;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3114;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3115;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3116;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3117;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3118;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3119;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3120;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3121;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3122;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3123;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3124;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3125;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3126;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3127;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3128;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3129;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3130;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3131;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3132;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3133;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3134;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3135;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3136;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3137;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3138;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3139;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3140;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3141;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3142;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3143;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3144;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3145;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3146;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3147;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3148;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3149;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3150;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3151;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3152;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3153;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3154;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3155;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3156;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3157;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3158;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3159;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3160;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3161;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3162;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3163;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3164;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3165;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3166;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3167;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3168;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3169;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3170;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3171;\n\t\t\tcase OakFence::OakFence(true, true, true, true).ID: return 3463;\n\t\t\tcase OakFence::OakFence(true, true, true, false).ID: return 3464;\n\t\t\tcase OakFence::OakFence(true, true, false, true).ID: return 3467;\n\t\t\tcase OakFence::OakFence(true, true, false, false).ID: return 3468;\n\t\t\tcase OakFence::OakFence(true, false, true, true).ID: return 3471;\n\t\t\tcase OakFence::OakFence(true, false, true, false).ID: return 3472;\n\t\t\tcase OakFence::OakFence(true, false, false, true).ID: return 3475;\n\t\t\tcase OakFence::OakFence(true, false, false, false).ID: return 3476;\n\t\t\tcase OakFence::OakFence(false, true, true, true).ID: return 3479;\n\t\t\tcase OakFence::OakFence(false, true, true, false).ID: return 3480;\n\t\t\tcase OakFence::OakFence(false, true, false, true).ID: return 3483;\n\t\t\tcase OakFence::OakFence(false, true, false, false).ID: return 3484;\n\t\t\tcase OakFence::OakFence(false, false, true, true).ID: return 3487;\n\t\t\tcase OakFence::OakFence(false, false, true, false).ID: return 3488;\n\t\t\tcase OakFence::OakFence(false, false, false, true).ID: return 3491;\n\t\t\tcase OakFence::OakFence(false, false, false, false).ID: return 3492;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 4301;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 4302;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 4303;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 4304;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 4305;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 4306;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 4307;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 4308;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 4309;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 4310;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 4311;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 4312;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 4313;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 4314;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 4315;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 4316;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 4317;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 4318;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 4319;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 4320;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 4321;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 4322;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 4323;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 4324;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 4325;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 4326;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 4327;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 4328;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 4329;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 4330;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 4331;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 4332;\n\t\t\tcase OakLeaves::OakLeaves(1, true).ID: return 144;\n\t\t\tcase OakLeaves::OakLeaves(1, false).ID: return 145;\n\t\t\tcase OakLeaves::OakLeaves(2, true).ID: return 146;\n\t\t\tcase OakLeaves::OakLeaves(2, false).ID: return 147;\n\t\t\tcase OakLeaves::OakLeaves(3, true).ID: return 148;\n\t\t\tcase OakLeaves::OakLeaves(3, false).ID: return 149;\n\t\t\tcase OakLeaves::OakLeaves(4, true).ID: return 150;\n\t\t\tcase OakLeaves::OakLeaves(4, false).ID: return 151;\n\t\t\tcase OakLeaves::OakLeaves(5, true).ID: return 152;\n\t\t\tcase OakLeaves::OakLeaves(5, false).ID: return 153;\n\t\t\tcase OakLeaves::OakLeaves(6, true).ID: return 154;\n\t\t\tcase OakLeaves::OakLeaves(6, false).ID: return 155;\n\t\t\tcase OakLeaves::OakLeaves(7, true).ID: return 156;\n\t\t\tcase OakLeaves::OakLeaves(7, false).ID: return 157;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::X).ID: return 72;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Y).ID: return 73;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Z).ID: return 74;\n\t\t\tcase OakPlanks::OakPlanks().ID: return 15;\n\t\t\tcase OakPressurePlate::OakPressurePlate(true).ID: return 3368;\n\t\t\tcase OakPressurePlate::OakPressurePlate(false).ID: return 3369;\n\t\t\tcase OakSapling::OakSapling(0).ID: return 21;\n\t\t\tcase OakSapling::OakSapling(1).ID: return 22;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Top).ID: return 7259;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Bottom).ID: return 7261;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Double).ID: return 7263;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1650;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1652;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1654;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1656;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1658;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1660;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1662;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1664;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1666;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1668;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1670;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1672;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1674;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1676;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1678;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1680;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1682;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1684;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1686;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1688;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1690;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1692;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1694;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1696;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1698;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1700;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1702;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1704;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1706;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1708;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1710;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1712;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1714;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1716;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1718;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1720;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1722;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1724;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1726;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1728;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, true).ID: return 3595;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, false).ID: return 3597;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, true).ID: return 3599;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, false).ID: return 3601;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, true).ID: return 3603;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, false).ID: return 3605;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, true).ID: return 3607;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, false).ID: return 3609;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, true).ID: return 3611;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, false).ID: return 3613;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, true).ID: return 3615;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, false).ID: return 3617;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, true).ID: return 3619;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, false).ID: return 3621;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, true).ID: return 3623;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, false).ID: return 3625;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, true).ID: return 3627;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, false).ID: return 3629;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, true).ID: return 3631;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, false).ID: return 3633;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, true).ID: return 3635;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, false).ID: return 3637;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, true).ID: return 3639;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, false).ID: return 3641;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, true).ID: return 3643;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, false).ID: return 3645;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, true).ID: return 3647;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, false).ID: return 3649;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, true).ID: return 3651;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, false).ID: return 3653;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, true).ID: return 3655;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, false).ID: return 3657;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::X).ID: return 108;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Y).ID: return 109;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Z).ID: return 110;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, true).ID: return 8200;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, false).ID: return 8201;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, true).ID: return 8202;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, false).ID: return 8203;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, true).ID: return 8204;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, false).ID: return 8205;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, true).ID: return 8206;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, false).ID: return 8207;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, true).ID: return 8208;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, false).ID: return 8209;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, true).ID: return 8210;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, false).ID: return 8211;\n\t\t\tcase Obsidian::Obsidian().ID: return 1130;\n\t\t\tcase OrangeBanner::OrangeBanner(0).ID: return 6871;\n\t\t\tcase OrangeBanner::OrangeBanner(1).ID: return 6872;\n\t\t\tcase OrangeBanner::OrangeBanner(2).ID: return 6873;\n\t\t\tcase OrangeBanner::OrangeBanner(3).ID: return 6874;\n\t\t\tcase OrangeBanner::OrangeBanner(4).ID: return 6875;\n\t\t\tcase OrangeBanner::OrangeBanner(5).ID: return 6876;\n\t\t\tcase OrangeBanner::OrangeBanner(6).ID: return 6877;\n\t\t\tcase OrangeBanner::OrangeBanner(7).ID: return 6878;\n\t\t\tcase OrangeBanner::OrangeBanner(8).ID: return 6879;\n\t\t\tcase OrangeBanner::OrangeBanner(9).ID: return 6880;\n\t\t\tcase OrangeBanner::OrangeBanner(10).ID: return 6881;\n\t\t\tcase OrangeBanner::OrangeBanner(11).ID: return 6882;\n\t\t\tcase OrangeBanner::OrangeBanner(12).ID: return 6883;\n\t\t\tcase OrangeBanner::OrangeBanner(13).ID: return 6884;\n\t\t\tcase OrangeBanner::OrangeBanner(14).ID: return 6885;\n\t\t\tcase OrangeBanner::OrangeBanner(15).ID: return 6886;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Head).ID: return 764;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Foot).ID: return 765;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Head).ID: return 766;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Foot).ID: return 767;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Head).ID: return 768;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Foot).ID: return 769;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Head).ID: return 770;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Foot).ID: return 771;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Head).ID: return 772;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Foot).ID: return 773;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Head).ID: return 774;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Foot).ID: return 775;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Head).ID: return 776;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Foot).ID: return 777;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Head).ID: return 778;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Foot).ID: return 779;\n\t\t\tcase OrangeCarpet::OrangeCarpet().ID: return 6825;\n\t\t\tcase OrangeConcrete::OrangeConcrete().ID: return 8379;\n\t\t\tcase OrangeConcretePowder::OrangeConcretePowder().ID: return 8395;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8318;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8319;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8320;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8321;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8224;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8225;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8226;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8227;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8228;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8229;\n\t\t\tcase OrangeStainedGlass::OrangeStainedGlass().ID: return 3579;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, true).ID: return 5855;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, false).ID: return 5856;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, true).ID: return 5859;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, false).ID: return 5860;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, true).ID: return 5863;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, false).ID: return 5864;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, true).ID: return 5867;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, false).ID: return 5868;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, true).ID: return 5871;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, false).ID: return 5872;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, true).ID: return 5875;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, false).ID: return 5876;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, true).ID: return 5879;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, false).ID: return 5880;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, true).ID: return 5883;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, false).ID: return 5884;\n\t\t\tcase OrangeTerracotta::OrangeTerracotta().ID: return 5806;\n\t\t\tcase OrangeTulip::OrangeTulip().ID: return 1117;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7115;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7116;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7117;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7118;\n\t\t\tcase OrangeWool::OrangeWool().ID: return 1084;\n\t\t\tcase OxeyeDaisy::OxeyeDaisy().ID: return 1120;\n\t\t\tcase PackedIce::PackedIce().ID: return 6842;\n\t\t\tcase Peony::Peony(Peony::Half::Upper).ID: return 6849;\n\t\t\tcase Peony::Peony(Peony::Half::Lower).ID: return 6850;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Top).ID: return 7307;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Bottom).ID: return 7309;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Double).ID: return 7311;\n\t\t\tcase PinkBanner::PinkBanner(0).ID: return 6951;\n\t\t\tcase PinkBanner::PinkBanner(1).ID: return 6952;\n\t\t\tcase PinkBanner::PinkBanner(2).ID: return 6953;\n\t\t\tcase PinkBanner::PinkBanner(3).ID: return 6954;\n\t\t\tcase PinkBanner::PinkBanner(4).ID: return 6955;\n\t\t\tcase PinkBanner::PinkBanner(5).ID: return 6956;\n\t\t\tcase PinkBanner::PinkBanner(6).ID: return 6957;\n\t\t\tcase PinkBanner::PinkBanner(7).ID: return 6958;\n\t\t\tcase PinkBanner::PinkBanner(8).ID: return 6959;\n\t\t\tcase PinkBanner::PinkBanner(9).ID: return 6960;\n\t\t\tcase PinkBanner::PinkBanner(10).ID: return 6961;\n\t\t\tcase PinkBanner::PinkBanner(11).ID: return 6962;\n\t\t\tcase PinkBanner::PinkBanner(12).ID: return 6963;\n\t\t\tcase PinkBanner::PinkBanner(13).ID: return 6964;\n\t\t\tcase PinkBanner::PinkBanner(14).ID: return 6965;\n\t\t\tcase PinkBanner::PinkBanner(15).ID: return 6966;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Head).ID: return 844;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Foot).ID: return 845;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Head).ID: return 846;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Foot).ID: return 847;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Head).ID: return 848;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Foot).ID: return 849;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Head).ID: return 850;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Foot).ID: return 851;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Head).ID: return 852;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Foot).ID: return 853;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Head).ID: return 854;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Foot).ID: return 855;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Head).ID: return 856;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Foot).ID: return 857;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Head).ID: return 858;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Foot).ID: return 859;\n\t\t\tcase PinkCarpet::PinkCarpet().ID: return 6830;\n\t\t\tcase PinkConcrete::PinkConcrete().ID: return 8384;\n\t\t\tcase PinkConcretePowder::PinkConcretePowder().ID: return 8400;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8338;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8339;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8340;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8341;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8254;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8255;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8256;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8257;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8258;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8259;\n\t\t\tcase PinkStainedGlass::PinkStainedGlass().ID: return 3584;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, true).ID: return 6015;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, false).ID: return 6016;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, true).ID: return 6019;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, false).ID: return 6020;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, true).ID: return 6023;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, false).ID: return 6024;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, true).ID: return 6027;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, false).ID: return 6028;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, true).ID: return 6031;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, false).ID: return 6032;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, true).ID: return 6035;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, false).ID: return 6036;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, true).ID: return 6039;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, false).ID: return 6040;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, true).ID: return 6043;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, false).ID: return 6044;\n\t\t\tcase PinkTerracotta::PinkTerracotta().ID: return 5811;\n\t\t\tcase PinkTulip::PinkTulip().ID: return 1119;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7135;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7136;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7137;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7138;\n\t\t\tcase PinkWool::PinkWool().ID: return 1089;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1047;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1048;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1049;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1050;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1051;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1052;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1053;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1054;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1055;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1056;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1057;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1058;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Normal).ID: return 1059;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Sticky).ID: return 1060;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Normal).ID: return 1061;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Sticky).ID: return 1062;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Normal).ID: return 1063;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Sticky).ID: return 1064;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Normal).ID: return 1065;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Sticky).ID: return 1066;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Normal).ID: return 1067;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Sticky).ID: return 1068;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Normal).ID: return 1069;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Sticky).ID: return 1070;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Normal).ID: return 1071;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Sticky).ID: return 1072;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Normal).ID: return 1073;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Sticky).ID: return 1074;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Normal).ID: return 1075;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Sticky).ID: return 1076;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Normal).ID: return 1077;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Sticky).ID: return 1078;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Normal).ID: return 1079;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Sticky).ID: return 1080;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Normal).ID: return 1081;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Sticky).ID: return 1082;\n\t\t\tcase PlayerHead::PlayerHead(0).ID: return 5512;\n\t\t\tcase PlayerHead::PlayerHead(1).ID: return 5513;\n\t\t\tcase PlayerHead::PlayerHead(2).ID: return 5514;\n\t\t\tcase PlayerHead::PlayerHead(3).ID: return 5515;\n\t\t\tcase PlayerHead::PlayerHead(4).ID: return 5516;\n\t\t\tcase PlayerHead::PlayerHead(5).ID: return 5517;\n\t\t\tcase PlayerHead::PlayerHead(6).ID: return 5518;\n\t\t\tcase PlayerHead::PlayerHead(7).ID: return 5519;\n\t\t\tcase PlayerHead::PlayerHead(8).ID: return 5520;\n\t\t\tcase PlayerHead::PlayerHead(9).ID: return 5521;\n\t\t\tcase PlayerHead::PlayerHead(10).ID: return 5522;\n\t\t\tcase PlayerHead::PlayerHead(11).ID: return 5523;\n\t\t\tcase PlayerHead::PlayerHead(12).ID: return 5524;\n\t\t\tcase PlayerHead::PlayerHead(13).ID: return 5525;\n\t\t\tcase PlayerHead::PlayerHead(14).ID: return 5526;\n\t\t\tcase PlayerHead::PlayerHead(15).ID: return 5527;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 5508;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 5509;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 5510;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 5511;\n\t\t\tcase Podzol::Podzol(true).ID: return 12;\n\t\t\tcase Podzol::Podzol(false).ID: return 13;\n\t\t\tcase PolishedAndesite::PolishedAndesite().ID: return 7;\n\t\t\tcase PolishedDiorite::PolishedDiorite().ID: return 5;\n\t\t\tcase PolishedGranite::PolishedGranite().ID: return 3;\n\t\t\tcase Poppy::Poppy().ID: return 1112;\n\t\t\tcase Potatoes::Potatoes(0).ID: return 5296;\n\t\t\tcase Potatoes::Potatoes(1).ID: return 5297;\n\t\t\tcase Potatoes::Potatoes(2).ID: return 5298;\n\t\t\tcase Potatoes::Potatoes(3).ID: return 5299;\n\t\t\tcase Potatoes::Potatoes(4).ID: return 5300;\n\t\t\tcase Potatoes::Potatoes(5).ID: return 5301;\n\t\t\tcase Potatoes::Potatoes(6).ID: return 5302;\n\t\t\tcase Potatoes::Potatoes(7).ID: return 5303;\n\t\t\tcase PottedAcaciaSapling::PottedAcaciaSapling().ID: return 5271;\n\t\t\tcase PottedAllium::PottedAllium().ID: return 5277;\n\t\t\tcase PottedAzureBluet::PottedAzureBluet().ID: return 5278;\n\t\t\tcase PottedBirchSapling::PottedBirchSapling().ID: return 5269;\n\t\t\tcase PottedBlueOrchid::PottedBlueOrchid().ID: return 5276;\n\t\t\tcase PottedBrownMushroom::PottedBrownMushroom().ID: return 5285;\n\t\t\tcase PottedCactus::PottedCactus().ID: return 5287;\n\t\t\tcase PottedDandelion::PottedDandelion().ID: return 5274;\n\t\t\tcase PottedDarkOakSapling::PottedDarkOakSapling().ID: return 5272;\n\t\t\tcase PottedDeadBush::PottedDeadBush().ID: return 5286;\n\t\t\tcase PottedFern::PottedFern().ID: return 5273;\n\t\t\tcase PottedJungleSapling::PottedJungleSapling().ID: return 5270;\n\t\t\tcase PottedOakSapling::PottedOakSapling().ID: return 5267;\n\t\t\tcase PottedOrangeTulip::PottedOrangeTulip().ID: return 5280;\n\t\t\tcase PottedOxeyeDaisy::PottedOxeyeDaisy().ID: return 5283;\n\t\t\tcase PottedPinkTulip::PottedPinkTulip().ID: return 5282;\n\t\t\tcase PottedPoppy::PottedPoppy().ID: return 5275;\n\t\t\tcase PottedRedMushroom::PottedRedMushroom().ID: return 5284;\n\t\t\tcase PottedRedTulip::PottedRedTulip().ID: return 5279;\n\t\t\tcase PottedSpruceSapling::PottedSpruceSapling().ID: return 5268;\n\t\t\tcase PottedWhiteTulip::PottedWhiteTulip().ID: return 5281;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::NorthSouth).ID: return 1004;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::EastWest).ID: return 1005;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingEast).ID: return 1006;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingWest).ID: return 1007;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingNorth).ID: return 1008;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingSouth).ID: return 1009;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::NorthSouth).ID: return 1010;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::EastWest).ID: return 1011;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingEast).ID: return 1012;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingWest).ID: return 1013;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingNorth).ID: return 1014;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingSouth).ID: return 1015;\n\t\t\tcase Prismarine::Prismarine().ID: return 6559;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Top).ID: return 6809;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Bottom).ID: return 6811;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Double).ID: return 6813;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 6643;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6645;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 6647;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6649;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 6651;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 6653;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6655;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 6657;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6659;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 6661;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 6663;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6665;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 6667;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6669;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 6671;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 6673;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6675;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 6677;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6679;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 6681;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 6683;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6685;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 6687;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6689;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 6691;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 6693;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6695;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 6697;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6699;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 6701;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 6703;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6705;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 6707;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6709;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 6711;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 6713;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 6715;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 6717;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 6719;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 6721;\n\t\t\tcase PrismarineBricks::PrismarineBricks().ID: return 6560;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Top).ID: return 6803;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Bottom).ID: return 6805;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Double).ID: return 6807;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 6563;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 6565;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 6567;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 6569;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 6571;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 6573;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 6575;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 6577;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 6579;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 6581;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 6583;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 6585;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 6587;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 6589;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 6591;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 6593;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 6595;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 6597;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 6599;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 6601;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 6603;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 6605;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 6607;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 6609;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 6611;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 6613;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 6615;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 6617;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 6619;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 6621;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 6623;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 6625;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 6627;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 6629;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 6631;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 6633;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 6635;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 6637;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 6639;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 6641;\n\t\t\tcase Pumpkin::Pumpkin().ID: return 3493;\n\t\t\tcase PumpkinStem::PumpkinStem(0).ID: return 4253;\n\t\t\tcase PumpkinStem::PumpkinStem(1).ID: return 4254;\n\t\t\tcase PumpkinStem::PumpkinStem(2).ID: return 4255;\n\t\t\tcase PumpkinStem::PumpkinStem(3).ID: return 4256;\n\t\t\tcase PumpkinStem::PumpkinStem(4).ID: return 4257;\n\t\t\tcase PumpkinStem::PumpkinStem(5).ID: return 4258;\n\t\t\tcase PumpkinStem::PumpkinStem(6).ID: return 4259;\n\t\t\tcase PumpkinStem::PumpkinStem(7).ID: return 4260;\n\t\t\tcase PurpleBanner::PurpleBanner(0).ID: return 7015;\n\t\t\tcase PurpleBanner::PurpleBanner(1).ID: return 7016;\n\t\t\tcase PurpleBanner::PurpleBanner(2).ID: return 7017;\n\t\t\tcase PurpleBanner::PurpleBanner(3).ID: return 7018;\n\t\t\tcase PurpleBanner::PurpleBanner(4).ID: return 7019;\n\t\t\tcase PurpleBanner::PurpleBanner(5).ID: return 7020;\n\t\t\tcase PurpleBanner::PurpleBanner(6).ID: return 7021;\n\t\t\tcase PurpleBanner::PurpleBanner(7).ID: return 7022;\n\t\t\tcase PurpleBanner::PurpleBanner(8).ID: return 7023;\n\t\t\tcase PurpleBanner::PurpleBanner(9).ID: return 7024;\n\t\t\tcase PurpleBanner::PurpleBanner(10).ID: return 7025;\n\t\t\tcase PurpleBanner::PurpleBanner(11).ID: return 7026;\n\t\t\tcase PurpleBanner::PurpleBanner(12).ID: return 7027;\n\t\t\tcase PurpleBanner::PurpleBanner(13).ID: return 7028;\n\t\t\tcase PurpleBanner::PurpleBanner(14).ID: return 7029;\n\t\t\tcase PurpleBanner::PurpleBanner(15).ID: return 7030;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Head).ID: return 908;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Foot).ID: return 909;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Head).ID: return 910;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Foot).ID: return 911;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Head).ID: return 912;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Foot).ID: return 913;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Head).ID: return 914;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Foot).ID: return 915;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Head).ID: return 916;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Foot).ID: return 917;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Head).ID: return 918;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Foot).ID: return 919;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Head).ID: return 920;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Foot).ID: return 921;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Head).ID: return 922;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Foot).ID: return 923;\n\t\t\tcase PurpleCarpet::PurpleCarpet().ID: return 6834;\n\t\t\tcase PurpleConcrete::PurpleConcrete().ID: return 8388;\n\t\t\tcase PurpleConcretePowder::PurpleConcretePowder().ID: return 8404;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8354;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8355;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8356;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8357;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8278;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8279;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8280;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8281;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8282;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8283;\n\t\t\tcase PurpleStainedGlass::PurpleStainedGlass().ID: return 3588;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, true).ID: return 6143;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, false).ID: return 6144;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, true).ID: return 6147;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, false).ID: return 6148;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, true).ID: return 6151;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, false).ID: return 6152;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, true).ID: return 6155;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, false).ID: return 6156;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, true).ID: return 6159;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, false).ID: return 6160;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, true).ID: return 6163;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, false).ID: return 6164;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, true).ID: return 6167;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, false).ID: return 6168;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, true).ID: return 6171;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, false).ID: return 6172;\n\t\t\tcase PurpleTerracotta::PurpleTerracotta().ID: return 5815;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7151;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7152;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7153;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7154;\n\t\t\tcase PurpleWool::PurpleWool().ID: return 1093;\n\t\t\tcase PurpurBlock::PurpurBlock().ID: return 8074;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::X).ID: return 8075;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Y).ID: return 8076;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Z).ID: return 8077;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Top).ID: return 7349;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Bottom).ID: return 7351;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Double).ID: return 7353;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8079;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8081;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8083;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8085;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8087;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8089;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8091;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8093;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8095;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8097;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8099;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8101;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8103;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8105;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8107;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8109;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8111;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8113;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8115;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8117;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8119;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8121;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8123;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8125;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8127;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8129;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8131;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8133;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8135;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8137;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8139;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8141;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8143;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8145;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8147;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8149;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8151;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8153;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8155;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8157;\n\t\t\tcase QuartzBlock::QuartzBlock().ID: return 5696;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::X).ID: return 5698;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Y).ID: return 5699;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Z).ID: return 5700;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Top).ID: return 7337;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Bottom).ID: return 7339;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Double).ID: return 7341;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 5702;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 5704;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 5706;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 5708;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 5710;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 5712;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 5714;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 5716;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 5718;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 5720;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 5722;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 5724;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 5726;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 5728;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 5730;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 5732;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 5734;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 5736;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 5738;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 5740;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 5742;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 5744;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 5746;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 5748;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 5750;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 5752;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 5754;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 5756;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 5758;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 5760;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 5762;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 5764;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 5766;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 5768;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 5770;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 5772;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 5774;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 5776;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 5778;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 5780;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthSouth).ID: return 3180;\n\t\t\tcase Rail::Rail(Rail::Shape::EastWest).ID: return 3181;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingEast).ID: return 3182;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingWest).ID: return 3183;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingNorth).ID: return 3184;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingSouth).ID: return 3185;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthEast).ID: return 3186;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthWest).ID: return 3187;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthWest).ID: return 3188;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthEast).ID: return 3189;\n\t\t\tcase RedBanner::RedBanner(0).ID: return 7079;\n\t\t\tcase RedBanner::RedBanner(1).ID: return 7080;\n\t\t\tcase RedBanner::RedBanner(2).ID: return 7081;\n\t\t\tcase RedBanner::RedBanner(3).ID: return 7082;\n\t\t\tcase RedBanner::RedBanner(4).ID: return 7083;\n\t\t\tcase RedBanner::RedBanner(5).ID: return 7084;\n\t\t\tcase RedBanner::RedBanner(6).ID: return 7085;\n\t\t\tcase RedBanner::RedBanner(7).ID: return 7086;\n\t\t\tcase RedBanner::RedBanner(8).ID: return 7087;\n\t\t\tcase RedBanner::RedBanner(9).ID: return 7088;\n\t\t\tcase RedBanner::RedBanner(10).ID: return 7089;\n\t\t\tcase RedBanner::RedBanner(11).ID: return 7090;\n\t\t\tcase RedBanner::RedBanner(12).ID: return 7091;\n\t\t\tcase RedBanner::RedBanner(13).ID: return 7092;\n\t\t\tcase RedBanner::RedBanner(14).ID: return 7093;\n\t\t\tcase RedBanner::RedBanner(15).ID: return 7094;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Head).ID: return 972;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Foot).ID: return 973;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Head).ID: return 974;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Foot).ID: return 975;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Head).ID: return 976;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Foot).ID: return 977;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Head).ID: return 978;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Foot).ID: return 979;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Head).ID: return 980;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Foot).ID: return 981;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Head).ID: return 982;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Foot).ID: return 983;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Head).ID: return 984;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Foot).ID: return 985;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Head).ID: return 986;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Foot).ID: return 987;\n\t\t\tcase RedCarpet::RedCarpet().ID: return 6838;\n\t\t\tcase RedConcrete::RedConcrete().ID: return 8392;\n\t\t\tcase RedConcretePowder::RedConcretePowder().ID: return 8408;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8370;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8371;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8372;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8373;\n\t\t\tcase RedMushroom::RedMushroom().ID: return 1122;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, true).ID: return 4052;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, false).ID: return 4053;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, true).ID: return 4054;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, false).ID: return 4055;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, true).ID: return 4056;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, false).ID: return 4057;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, true).ID: return 4058;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, false).ID: return 4059;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, true).ID: return 4060;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, false).ID: return 4061;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, true).ID: return 4062;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, false).ID: return 4063;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, true).ID: return 4064;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, false).ID: return 4065;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, true).ID: return 4066;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, false).ID: return 4067;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, true).ID: return 4068;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, false).ID: return 4069;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, true).ID: return 4070;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, false).ID: return 4071;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, true).ID: return 4072;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, false).ID: return 4073;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, true).ID: return 4074;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, false).ID: return 4075;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, true).ID: return 4076;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, false).ID: return 4077;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, true).ID: return 4078;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, false).ID: return 4079;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, true).ID: return 4080;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, false).ID: return 4081;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, true).ID: return 4082;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, false).ID: return 4083;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, true).ID: return 4084;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, false).ID: return 4085;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, true).ID: return 4086;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, false).ID: return 4087;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, true).ID: return 4088;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, false).ID: return 4089;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, true).ID: return 4090;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, false).ID: return 4091;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, true).ID: return 4092;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, false).ID: return 4093;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, true).ID: return 4094;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, false).ID: return 4095;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, true).ID: return 4096;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, false).ID: return 4097;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, true).ID: return 4098;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, false).ID: return 4099;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, true).ID: return 4100;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, false).ID: return 4101;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, true).ID: return 4102;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, false).ID: return 4103;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, true).ID: return 4104;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, false).ID: return 4105;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, true).ID: return 4106;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, false).ID: return 4107;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, true).ID: return 4108;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, false).ID: return 4109;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, true).ID: return 4110;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, false).ID: return 4111;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, true).ID: return 4112;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, false).ID: return 4113;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, true).ID: return 4114;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false).ID: return 4115;\n\t\t\tcase RedNetherBricks::RedNetherBricks().ID: return 8195;\n\t\t\tcase RedSand::RedSand().ID: return 67;\n\t\t\tcase RedSandstone::RedSandstone().ID: return 7175;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Top).ID: return 7343;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Bottom).ID: return 7345;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Double).ID: return 7347;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7179;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7181;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7183;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7185;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7187;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7189;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7191;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7193;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7195;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7197;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7199;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7201;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7203;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7205;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7207;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7209;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7211;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7213;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7215;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7217;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7219;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7221;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7223;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7225;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7227;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7229;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7231;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7233;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7235;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7237;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7239;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7241;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7243;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7245;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7247;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7249;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7251;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7253;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7255;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7257;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8302;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8303;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8304;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8305;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8306;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8307;\n\t\t\tcase RedStainedGlass::RedStainedGlass().ID: return 3592;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, true).ID: return 6271;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, false).ID: return 6272;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, true).ID: return 6275;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, false).ID: return 6276;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, true).ID: return 6279;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, false).ID: return 6280;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, true).ID: return 6283;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, false).ID: return 6284;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, true).ID: return 6287;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, false).ID: return 6288;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, true).ID: return 6291;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, false).ID: return 6292;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, true).ID: return 6295;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, false).ID: return 6296;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, true).ID: return 6299;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, false).ID: return 6300;\n\t\t\tcase RedTerracotta::RedTerracotta().ID: return 5819;\n\t\t\tcase RedTulip::RedTulip().ID: return 1116;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7167;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7168;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7169;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7170;\n\t\t\tcase RedWool::RedWool().ID: return 1097;\n\t\t\tcase RedstoneBlock::RedstoneBlock().ID: return 5684;\n\t\t\tcase RedstoneLamp::RedstoneLamp(true).ID: return 4637;\n\t\t\tcase RedstoneLamp::RedstoneLamp(false).ID: return 4638;\n\t\t\tcase RedstoneOre::RedstoneOre(true).ID: return 3380;\n\t\t\tcase RedstoneOre::RedstoneOre(false).ID: return 3381;\n\t\t\tcase RedstoneTorch::RedstoneTorch(true).ID: return 3382;\n\t\t\tcase RedstoneTorch::RedstoneTorch(false).ID: return 3383;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3384;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3385;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3386;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3387;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, true).ID: return 3388;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, false).ID: return 3389;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, true).ID: return 3390;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, false).ID: return 3391;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1753;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1754;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1755;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1756;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1757;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1758;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1759;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1760;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1761;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1762;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1763;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1764;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1765;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1766;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1767;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1768;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1769;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1770;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1771;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1772;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1773;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1774;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1775;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1776;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1777;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1778;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1779;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1780;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1781;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1782;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1783;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1784;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1785;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1786;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1787;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1788;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1789;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1790;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1791;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1792;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1793;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1794;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1795;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1796;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1797;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1798;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1799;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1800;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1801;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1802;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1803;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1804;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1805;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1806;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1807;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1808;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1809;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1810;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1811;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1812;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1813;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1814;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1815;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1816;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1817;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1818;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1819;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1820;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1821;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1822;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1823;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1824;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1825;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1826;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1827;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1828;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1829;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1830;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1831;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1832;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1833;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1834;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1835;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1836;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1837;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1838;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1839;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1840;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1841;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1842;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1843;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1844;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1845;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1846;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1847;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1848;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1849;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1850;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1851;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1852;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1853;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1854;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1855;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1856;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1857;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1858;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1859;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1860;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1861;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1862;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1863;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1864;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1865;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1866;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1867;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1868;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1869;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1870;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1871;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1872;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1873;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1874;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1875;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1876;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1877;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1878;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1879;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1880;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1881;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1882;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1883;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1884;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1885;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1886;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1887;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1888;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1889;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1890;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1891;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1892;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1893;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1895;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1896;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1897;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1898;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1899;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1900;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1901;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1902;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1903;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1904;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1905;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1906;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1907;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1908;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1909;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1910;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1911;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1912;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1913;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1914;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1915;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1916;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1917;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1918;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1919;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1920;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1921;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1922;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1923;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1924;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1925;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1926;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1927;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1928;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1929;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1930;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1931;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1932;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1933;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1934;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1935;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1936;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1937;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1938;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1939;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1940;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1941;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1942;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1943;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1944;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1945;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1946;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1947;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1948;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1949;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1950;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1951;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1952;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1953;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1954;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1955;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1956;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1957;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1958;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1959;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1960;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1961;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1962;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1963;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1964;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1965;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1966;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1967;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1968;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1969;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1970;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1971;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1972;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1973;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1974;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1975;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1976;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1977;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1978;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1979;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1980;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1981;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1982;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1983;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1984;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1985;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1986;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1987;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1988;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1989;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1990;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 1991;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 1992;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 1993;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 1994;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 1995;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 1996;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 1997;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 1998;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 1999;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2000;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2001;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2002;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2003;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2004;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2005;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2006;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2007;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2008;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2009;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2010;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2011;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2012;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2013;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2014;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2015;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2016;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2017;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2018;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2019;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2020;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2021;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2022;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2023;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2024;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2025;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2026;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2027;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2028;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2029;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2030;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2031;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2032;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2033;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2034;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2035;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2036;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2037;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2038;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2039;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2040;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2041;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2042;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2043;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2044;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2045;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2046;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2047;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2048;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2049;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2050;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2051;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2052;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2053;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2054;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2055;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2056;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2057;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2058;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2059;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2060;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2061;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2062;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2063;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2064;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2065;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2066;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2067;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2068;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2069;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2070;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2071;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2072;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2073;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2074;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2075;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2076;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2077;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2078;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2079;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2080;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2081;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2082;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2083;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2084;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2085;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2086;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2087;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2088;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2089;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2090;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2091;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2092;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2093;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2094;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2095;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2096;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2097;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2098;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2099;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2100;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2101;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2102;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2103;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2104;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2105;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2106;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2107;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2108;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2109;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2110;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2111;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2112;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2113;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2114;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2115;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2116;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2117;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2118;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2119;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2120;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2121;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2122;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2123;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2124;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2125;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2126;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2127;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2128;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2129;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2130;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2131;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2132;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2133;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2134;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2135;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2136;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2137;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2138;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2139;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2140;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2141;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2142;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2143;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2144;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2145;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2146;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2147;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2148;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2149;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2150;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2151;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2152;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2153;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2154;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2155;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2156;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2157;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2158;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2159;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2160;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2161;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2162;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2163;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2164;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2165;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2166;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2167;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2168;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2169;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2170;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2171;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2172;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2173;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2174;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2175;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2176;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2177;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2178;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2179;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2180;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2181;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2182;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2183;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2184;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2185;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2186;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2187;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2188;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2189;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2190;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2191;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2192;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2193;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2194;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2195;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2196;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2197;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2198;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2199;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2200;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2201;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2202;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2203;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2204;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2205;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2206;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2207;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2208;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2209;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2210;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2211;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2212;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2213;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2214;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2215;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2216;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2217;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2218;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2219;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2220;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2221;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2222;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2223;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2224;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2225;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2226;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2227;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2228;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2229;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2230;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2231;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2232;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2233;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2234;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2235;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2236;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2237;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2238;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2239;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2240;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2241;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2242;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2243;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2244;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2245;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2246;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2247;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2248;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2249;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2250;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2251;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2252;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2253;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2254;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2255;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2256;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2257;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2258;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2259;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2260;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2261;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2262;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2263;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2264;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2265;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2266;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2267;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2268;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2269;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2270;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2271;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2272;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2273;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2274;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2275;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2276;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2277;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2278;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2279;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2280;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2281;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2282;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2283;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2284;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2285;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2286;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2287;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2288;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2289;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2290;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2291;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2292;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2293;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2294;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2295;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2296;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2297;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2298;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2299;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2300;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2301;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2302;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2303;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2304;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2305;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2306;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2307;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2308;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2309;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2310;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2311;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2312;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2313;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2314;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2315;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2316;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2317;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2318;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2319;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2320;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2321;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2322;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2323;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2324;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2325;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2326;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2327;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2328;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2329;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2330;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2331;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2332;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2333;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2334;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2335;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2336;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2337;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2338;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2339;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2340;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2341;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2342;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2343;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2344;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2345;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2346;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2347;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2348;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2349;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2350;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2351;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2352;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2353;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2354;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2355;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2356;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2357;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2358;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2359;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2360;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2361;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2362;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2363;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2364;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2365;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2366;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2367;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2368;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2369;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2370;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2371;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2372;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2373;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2374;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2375;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2376;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2377;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2378;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2379;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2380;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2381;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2382;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2383;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2384;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2385;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2386;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2387;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2388;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2389;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2390;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2391;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2392;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2393;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2394;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2395;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2396;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2397;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2398;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2399;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2400;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2401;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2402;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2403;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2404;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2405;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2406;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2407;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2408;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2409;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2410;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2411;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2412;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2413;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2414;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2415;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2416;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2417;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2418;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2419;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2420;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2421;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2422;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2423;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2424;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2425;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2426;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2427;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2428;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2429;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2430;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2431;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2432;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2433;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2434;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2435;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2436;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2437;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2438;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2439;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2440;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2441;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2442;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2443;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2444;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2445;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2446;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2447;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2448;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2449;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2450;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2451;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2452;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2453;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2454;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2455;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2456;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2457;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2458;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2459;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2460;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2461;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2462;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2463;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2464;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2465;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2466;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2467;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2468;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2469;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2470;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2471;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2472;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2473;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2474;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2475;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2476;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2477;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2478;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2479;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2480;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2481;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2482;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2483;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2484;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2485;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2486;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2487;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2488;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2489;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2490;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2491;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2492;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2493;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2494;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2495;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2496;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2497;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2498;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2499;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2500;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2501;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2502;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2503;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2504;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2505;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2506;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2507;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2508;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2509;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2510;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2511;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2512;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2513;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2514;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2515;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2516;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2517;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2518;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2519;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2520;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2521;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2522;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2523;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2524;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2525;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2526;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2527;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2528;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2529;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2530;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2531;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2532;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2533;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2534;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2535;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2536;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2537;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2538;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2539;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2540;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2541;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2542;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2543;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2544;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2545;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2546;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2547;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2548;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2549;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2550;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2551;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2552;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2553;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2554;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2555;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2556;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2557;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2558;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2559;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2560;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2561;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2562;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2563;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2564;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2565;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2566;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2567;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2568;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2569;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2570;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2571;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2572;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2573;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2574;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2575;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2576;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2577;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2578;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2579;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2580;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2581;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2582;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2583;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2584;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2585;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2586;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2587;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2588;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2589;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2590;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2591;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2592;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2593;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2594;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2595;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2596;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2597;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2598;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2599;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2600;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2601;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2602;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2603;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2604;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2605;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2606;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2607;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2608;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2609;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2610;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2611;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2612;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2613;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2614;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2615;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2616;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2617;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2618;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2619;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2620;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2621;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2622;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2623;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2624;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2625;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2626;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2627;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2628;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2629;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2630;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2631;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2632;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2633;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2634;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2635;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2636;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2637;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2638;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2639;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2640;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2641;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2642;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2643;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2644;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2645;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2646;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2647;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2648;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2649;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2650;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2651;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2652;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2653;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2654;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2655;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2656;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2657;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2658;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2659;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2660;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2661;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2662;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2663;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2664;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2665;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2666;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2667;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2668;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2669;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2670;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2671;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2672;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2673;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2674;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2675;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2676;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2677;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2678;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2679;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2680;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2681;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2682;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2683;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2684;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2685;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2686;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2687;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2688;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2689;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2690;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2691;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2692;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2693;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2694;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2695;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2696;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2697;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2698;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2699;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2700;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2701;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2702;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2703;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2704;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2705;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2706;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2707;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2708;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2709;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2710;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2711;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2712;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2713;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2714;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2715;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2716;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2717;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2718;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2719;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2720;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2721;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2722;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2723;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2724;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2725;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2726;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2727;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2728;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2729;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2730;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2731;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2732;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2733;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2734;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2735;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2736;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2737;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2738;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2739;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2740;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2741;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2742;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2743;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2744;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2745;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2746;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2747;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2748;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2749;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2750;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2751;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2752;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2753;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2754;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2755;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2756;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2757;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2758;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2759;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2760;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2761;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2762;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2763;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2764;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2765;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2766;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2767;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2768;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2769;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2770;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2771;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2772;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2773;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2774;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2775;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2776;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2777;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2778;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2779;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2780;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2781;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2782;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2783;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2784;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2785;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2786;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2787;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2788;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2789;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2790;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2791;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2792;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2793;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2794;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2795;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2796;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2797;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2798;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2799;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2800;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2801;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2802;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2803;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2804;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2805;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2806;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2807;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2808;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2809;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2810;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2811;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2812;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2813;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2814;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2815;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2816;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2817;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2818;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2819;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2820;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2821;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2822;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2823;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2824;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2825;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2826;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2827;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2828;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2829;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2830;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2831;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2832;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2833;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2834;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2835;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2836;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2837;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2838;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2839;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2840;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2841;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2842;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2843;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2844;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2845;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2846;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2847;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2848;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2849;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2850;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2851;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2852;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2853;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2854;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2855;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2856;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2857;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2858;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2859;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2860;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2861;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2862;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2863;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2864;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2865;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2866;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2867;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2868;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2869;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2870;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2871;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2872;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2873;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2874;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2875;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2876;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2877;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2878;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2879;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2880;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2881;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2882;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2883;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2884;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2885;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2886;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2887;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2888;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2889;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2890;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2891;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2892;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2893;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2895;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2896;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2897;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2898;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2899;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2900;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2901;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2902;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2903;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2904;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2905;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2906;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2907;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2908;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2909;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2910;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2911;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2912;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2913;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2914;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2915;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2916;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2917;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2918;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2919;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2920;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2921;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2922;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2923;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2924;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2925;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2926;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2927;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2928;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2929;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2930;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2931;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2932;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2933;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2934;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2935;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2936;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2937;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2938;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2939;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2940;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2941;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2942;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2943;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2944;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2945;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2946;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2947;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2948;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2949;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2950;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2951;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2952;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2953;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2954;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2955;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2956;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2957;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2958;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2959;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2960;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2961;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2962;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2963;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2964;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2965;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2966;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2967;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2968;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2969;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2970;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2971;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2972;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2973;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2974;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2975;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2976;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2977;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2978;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2979;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2980;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2981;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2982;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2983;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2984;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2985;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2986;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2987;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2988;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2989;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2990;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2991;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2992;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2993;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2994;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2995;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2996;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2997;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2998;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2999;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3000;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3001;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3002;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3003;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3004;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3005;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3006;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3007;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3008;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3009;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3010;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3011;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3012;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3013;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3014;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3015;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3016;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3017;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3018;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3019;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3020;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3021;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3022;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3023;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3024;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3025;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3026;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3027;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3028;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3029;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3030;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3031;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3032;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3033;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3034;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3035;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3036;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3037;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3038;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3039;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3040;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3041;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3042;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3043;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3044;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3045;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3046;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3047;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3048;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 3514;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 3515;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 3516;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 3517;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 3518;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 3519;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 3520;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 3521;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 3522;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 3523;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 3524;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 3525;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 3526;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 3527;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 3528;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 3529;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 3530;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 3531;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 3532;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 3533;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 3534;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 3535;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 3536;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 3537;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 3538;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 3539;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 3540;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 3541;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 3542;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 3543;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 3544;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 3545;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 3546;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 3547;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 3548;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 3549;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 3550;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 3551;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 3552;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 3553;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 3554;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 3555;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 3556;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 3557;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 3558;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 3559;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 3560;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 3561;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 3562;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 3563;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 3564;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 3565;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 3566;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 3567;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 3568;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 3569;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 3570;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 3571;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 3572;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 3573;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 3574;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 3575;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 3576;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 3577;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 8165;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 8166;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 8167;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 8168;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 8169;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 8170;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 8171;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 8172;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 8173;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 8174;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 8175;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 8176;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Upper).ID: return 6847;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Lower).ID: return 6848;\n\t\t\tcase Sand::Sand().ID: return 66;\n\t\t\tcase Sandstone::Sandstone().ID: return 245;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Top).ID: return 7301;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Bottom).ID: return 7303;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Double).ID: return 7305;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 4652;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 4654;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 4656;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 4658;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 4660;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 4662;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 4664;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 4666;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 4668;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 4670;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 4672;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 4674;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 4676;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 4678;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 4680;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 4682;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 4684;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 4686;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 4688;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 4690;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 4692;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 4694;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 4696;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 4698;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 4700;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 4702;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 4704;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 4706;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 4708;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 4710;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 4712;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 4714;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 4716;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 4718;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 4720;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 4722;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 4724;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 4726;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 4728;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 4730;\n\t\t\tcase SeaLantern::SeaLantern().ID: return 6820;\n\t\t\tcase SeaPickle::SeaPickle(1).ID: return 8581;\n\t\t\tcase SeaPickle::SeaPickle(2).ID: return 8583;\n\t\t\tcase SeaPickle::SeaPickle(3).ID: return 8585;\n\t\t\tcase SeaPickle::SeaPickle(4).ID: return 8587;\n\t\t\tcase Seagrass::Seagrass().ID: return 1044;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8212;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8213;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8214;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8215;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8216;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8217;\n\t\t\tcase OakSign::OakSign(0).ID: return 3077;\n\t\t\tcase OakSign::OakSign(1).ID: return 3079;\n\t\t\tcase OakSign::OakSign(2).ID: return 3081;\n\t\t\tcase OakSign::OakSign(3).ID: return 3083;\n\t\t\tcase OakSign::OakSign(4).ID: return 3085;\n\t\t\tcase OakSign::OakSign(5).ID: return 3087;\n\t\t\tcase OakSign::OakSign(6).ID: return 3089;\n\t\t\tcase OakSign::OakSign(7).ID: return 3091;\n\t\t\tcase OakSign::OakSign(8).ID: return 3093;\n\t\t\tcase OakSign::OakSign(9).ID: return 3095;\n\t\t\tcase OakSign::OakSign(10).ID: return 3097;\n\t\t\tcase OakSign::OakSign(11).ID: return 3099;\n\t\t\tcase OakSign::OakSign(12).ID: return 3101;\n\t\t\tcase OakSign::OakSign(13).ID: return 3103;\n\t\t\tcase OakSign::OakSign(14).ID: return 3105;\n\t\t\tcase OakSign::OakSign(15).ID: return 3107;\n\t\t\tcase SkeletonSkull::SkeletonSkull(0).ID: return 5452;\n\t\t\tcase SkeletonSkull::SkeletonSkull(1).ID: return 5453;\n\t\t\tcase SkeletonSkull::SkeletonSkull(2).ID: return 5454;\n\t\t\tcase SkeletonSkull::SkeletonSkull(3).ID: return 5455;\n\t\t\tcase SkeletonSkull::SkeletonSkull(4).ID: return 5456;\n\t\t\tcase SkeletonSkull::SkeletonSkull(5).ID: return 5457;\n\t\t\tcase SkeletonSkull::SkeletonSkull(6).ID: return 5458;\n\t\t\tcase SkeletonSkull::SkeletonSkull(7).ID: return 5459;\n\t\t\tcase SkeletonSkull::SkeletonSkull(8).ID: return 5460;\n\t\t\tcase SkeletonSkull::SkeletonSkull(9).ID: return 5461;\n\t\t\tcase SkeletonSkull::SkeletonSkull(10).ID: return 5462;\n\t\t\tcase SkeletonSkull::SkeletonSkull(11).ID: return 5463;\n\t\t\tcase SkeletonSkull::SkeletonSkull(12).ID: return 5464;\n\t\t\tcase SkeletonSkull::SkeletonSkull(13).ID: return 5465;\n\t\t\tcase SkeletonSkull::SkeletonSkull(14).ID: return 5466;\n\t\t\tcase SkeletonSkull::SkeletonSkull(15).ID: return 5467;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 5448;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 5449;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 5450;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 5451;\n\t\t\tcase SlimeBlock::SlimeBlock().ID: return 6493;\n\t\t\tcase SmoothQuartz::SmoothQuartz().ID: return 7356;\n\t\t\tcase SmoothRedSandstone::SmoothRedSandstone().ID: return 7357;\n\t\t\tcase SmoothSandstone::SmoothSandstone().ID: return 7355;\n\t\t\tcase SmoothStone::SmoothStone().ID: return 7354;\n\t\t\tcase Snow::Snow(1).ID: return 3416;\n\t\t\tcase Snow::Snow(2).ID: return 3417;\n\t\t\tcase Snow::Snow(3).ID: return 3418;\n\t\t\tcase Snow::Snow(4).ID: return 3419;\n\t\t\tcase Snow::Snow(5).ID: return 3420;\n\t\t\tcase Snow::Snow(6).ID: return 3421;\n\t\t\tcase Snow::Snow(7).ID: return 3422;\n\t\t\tcase Snow::Snow(8).ID: return 3423;\n\t\t\tcase SnowBlock::SnowBlock().ID: return 3425;\n\t\t\tcase SoulSand::SoulSand().ID: return 3495;\n\t\t\tcase Spawner::Spawner().ID: return 1648;\n\t\t\tcase Sponge::Sponge().ID: return 228;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5328;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5329;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5330;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5331;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5332;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5333;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5334;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5335;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5336;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5337;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5338;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5339;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5340;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5341;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5342;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5343;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5344;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5345;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5346;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5347;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5348;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5349;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5350;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5351;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 7678;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 7679;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 7680;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 7681;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 7682;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 7683;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 7684;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 7685;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 7686;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 7687;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 7688;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 7689;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 7690;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 7691;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 7692;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 7693;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 7694;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 7695;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 7696;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 7697;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 7698;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 7699;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 7700;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 7701;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 7702;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 7703;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 7704;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 7705;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 7706;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 7707;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 7708;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 7709;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 7710;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 7711;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 7712;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 7713;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 7714;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 7715;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 7716;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 7717;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 7718;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 7719;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 7720;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 7721;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 7722;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 7723;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 7724;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 7725;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 7726;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 7727;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 7728;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 7729;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 7730;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 7731;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 7732;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 7733;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 7734;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 7735;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 7736;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 7737;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 7738;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 7739;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 7740;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 7741;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, true).ID: return 7520;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, false).ID: return 7521;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, true).ID: return 7524;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, false).ID: return 7525;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, true).ID: return 7528;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, false).ID: return 7529;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, true).ID: return 7532;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, false).ID: return 7533;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, true).ID: return 7536;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, false).ID: return 7537;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, true).ID: return 7540;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, false).ID: return 7541;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, true).ID: return 7544;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, false).ID: return 7545;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, true).ID: return 7548;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, false).ID: return 7549;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7358;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7359;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7360;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7361;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7362;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7363;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7364;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7365;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7366;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7367;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7368;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7369;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7370;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7371;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7372;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7373;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7374;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7375;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7376;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7377;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7378;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7379;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7380;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7381;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7382;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7383;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7384;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7385;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7386;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7387;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7388;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7389;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, true).ID: return 158;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, false).ID: return 159;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, true).ID: return 160;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, false).ID: return 161;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, true).ID: return 162;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, false).ID: return 163;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, true).ID: return 164;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, false).ID: return 165;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, true).ID: return 166;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, false).ID: return 167;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, true).ID: return 168;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, false).ID: return 169;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, true).ID: return 170;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, false).ID: return 171;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::X).ID: return 75;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Y).ID: return 76;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Z).ID: return 77;\n\t\t\tcase SprucePlanks::SprucePlanks().ID: return 16;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(true).ID: return 3370;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(false).ID: return 3371;\n\t\t\tcase SpruceSapling::SpruceSapling(0).ID: return 23;\n\t\t\tcase SpruceSapling::SpruceSapling(1).ID: return 24;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Top).ID: return 7265;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Bottom).ID: return 7267;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Double).ID: return 7269;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 4886;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 4888;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 4890;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 4892;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 4894;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 4896;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 4898;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 4900;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 4902;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 4904;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 4906;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 4908;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 4910;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 4912;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 4914;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 4916;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 4918;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 4920;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 4922;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 4924;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 4926;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 4928;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 4930;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 4932;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 4934;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 4936;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 4938;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 4940;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 4942;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 4944;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 4946;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 4948;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 4950;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 4952;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 4954;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 4956;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 4958;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 4960;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 4962;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 4964;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, true).ID: return 3659;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, false).ID: return 3661;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, true).ID: return 3663;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, false).ID: return 3665;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 3667;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 3669;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 3671;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 3673;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, true).ID: return 3675;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, false).ID: return 3677;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, true).ID: return 3679;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, false).ID: return 3681;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 3683;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 3685;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 3687;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 3689;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, true).ID: return 3691;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, false).ID: return 3693;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, true).ID: return 3695;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, false).ID: return 3697;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 3699;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 3701;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 3703;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 3705;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, true).ID: return 3707;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, false).ID: return 3709;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, true).ID: return 3711;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, false).ID: return 3713;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 3715;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 3717;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 3719;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 3721;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::X).ID: return 111;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Y).ID: return 112;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Z).ID: return 113;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1028;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1029;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1030;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1031;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1032;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1033;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1034;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1035;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1036;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1037;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1038;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1039;\n\t\t\tcase Stone::Stone().ID: return 1;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Top).ID: return 7325;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Bottom).ID: return 7327;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Double).ID: return 7329;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4414;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4416;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4418;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4420;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4422;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4424;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4426;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4428;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4430;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4432;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4434;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4436;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4438;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4440;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4442;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4444;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4446;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4448;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4450;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4452;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4454;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4456;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4458;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4460;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4462;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4464;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4466;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4468;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4470;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4472;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4474;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4476;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4478;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4480;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4482;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4484;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4486;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4488;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4490;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4492;\n\t\t\tcase StoneBricks::StoneBricks().ID: return 3984;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3392;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3393;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3394;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3395;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3396;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3397;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3398;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3399;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3400;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3401;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3402;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3403;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3404;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3405;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3406;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3407;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3408;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3409;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3410;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3411;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3412;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3413;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3414;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3415;\n\t\t\tcase StonePressurePlate::StonePressurePlate(true).ID: return 3302;\n\t\t\tcase StonePressurePlate::StonePressurePlate(false).ID: return 3303;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Top).ID: return 7295;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Bottom).ID: return 7297;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Double).ID: return 7299;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::X).ID: return 99;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Y).ID: return 100;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Z).ID: return 101;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::X).ID: return 138;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Y).ID: return 139;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Z).ID: return 140;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::X).ID: return 93;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Y).ID: return 94;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Z).ID: return 95;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::X).ID: return 132;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Y).ID: return 133;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Z).ID: return 134;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::X).ID: return 102;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Y).ID: return 103;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Z).ID: return 104;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::X).ID: return 141;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Y).ID: return 142;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Z).ID: return 143;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::X).ID: return 96;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Y).ID: return 97;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Z).ID: return 98;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::X).ID: return 135;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Y).ID: return 136;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Z).ID: return 137;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::X).ID: return 105;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Y).ID: return 106;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Z).ID: return 107;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::X).ID: return 126;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Y).ID: return 127;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Z).ID: return 128;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::X).ID: return 90;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Y).ID: return 91;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Z).ID: return 92;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::X).ID: return 129;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Y).ID: return 130;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Z).ID: return 131;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Save).ID: return 8595;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Load).ID: return 8596;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Corner).ID: return 8597;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Data).ID: return 8598;\n\t\t\tcase StructureVoid::StructureVoid().ID: return 8199;\n\t\t\tcase SugarCane::SugarCane(0).ID: return 3443;\n\t\t\tcase SugarCane::SugarCane(1).ID: return 3444;\n\t\t\tcase SugarCane::SugarCane(2).ID: return 3445;\n\t\t\tcase SugarCane::SugarCane(3).ID: return 3446;\n\t\t\tcase SugarCane::SugarCane(4).ID: return 3447;\n\t\t\tcase SugarCane::SugarCane(5).ID: return 3448;\n\t\t\tcase SugarCane::SugarCane(6).ID: return 3449;\n\t\t\tcase SugarCane::SugarCane(7).ID: return 3450;\n\t\t\tcase SugarCane::SugarCane(8).ID: return 3451;\n\t\t\tcase SugarCane::SugarCane(9).ID: return 3452;\n\t\t\tcase SugarCane::SugarCane(10).ID: return 3453;\n\t\t\tcase SugarCane::SugarCane(11).ID: return 3454;\n\t\t\tcase SugarCane::SugarCane(12).ID: return 3455;\n\t\t\tcase SugarCane::SugarCane(13).ID: return 3456;\n\t\t\tcase SugarCane::SugarCane(14).ID: return 3457;\n\t\t\tcase SugarCane::SugarCane(15).ID: return 3458;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Upper).ID: return 6843;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Lower).ID: return 6844;\n\t\t\tcase TNT::TNT(true).ID: return 1126;\n\t\t\tcase TNT::TNT(false).ID: return 1127;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Upper).ID: return 6851;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Lower).ID: return 6852;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Upper).ID: return 1045;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Lower).ID: return 1046;\n\t\t\tcase Terracotta::Terracotta().ID: return 6840;\n\t\t\tcase Torch::Torch().ID: return 1131;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Single).ID: return 5581;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Left).ID: return 5583;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Right).ID: return 5585;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Single).ID: return 5587;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Left).ID: return 5589;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Right).ID: return 5591;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Single).ID: return 5593;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Left).ID: return 5595;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Right).ID: return 5597;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Single).ID: return 5599;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Left).ID: return 5601;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Right).ID: return 5603;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, true).ID: return 4756;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, false).ID: return 4757;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, true).ID: return 4758;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, false).ID: return 4759;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, true).ID: return 4760;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, false).ID: return 4761;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, true).ID: return 4762;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, false).ID: return 4763;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, true).ID: return 4764;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, false).ID: return 4765;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, true).ID: return 4766;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, false).ID: return 4767;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, true).ID: return 4768;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, false).ID: return 4769;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, true).ID: return 4770;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, false).ID: return 4771;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, true).ID: return 4772;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, false).ID: return 4773;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, true).ID: return 4774;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, false).ID: return 4775;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, true).ID: return 4776;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, false).ID: return 4777;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, true).ID: return 4778;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, false).ID: return 4779;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, true).ID: return 4780;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, false).ID: return 4781;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, true).ID: return 4782;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, false).ID: return 4783;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, true).ID: return 4784;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, false).ID: return 4785;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, true).ID: return 4786;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, false).ID: return 4787;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, true).ID: return 4788;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, false).ID: return 4789;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, true).ID: return 4790;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, false).ID: return 4791;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, true).ID: return 4792;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, false).ID: return 4793;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, true).ID: return 4794;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, false).ID: return 4795;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, true).ID: return 4796;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, false).ID: return 4797;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, true).ID: return 4798;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, false).ID: return 4799;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, true).ID: return 4800;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, false).ID: return 4801;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, true).ID: return 4802;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, false).ID: return 4803;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, true).ID: return 4804;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, false).ID: return 4805;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, true).ID: return 4806;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, false).ID: return 4807;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, true).ID: return 4808;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, false).ID: return 4809;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, true).ID: return 4810;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, false).ID: return 4811;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, true).ID: return 4812;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, false).ID: return 4813;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, true).ID: return 4814;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, false).ID: return 4815;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, true).ID: return 4816;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, false).ID: return 4817;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, true).ID: return 4818;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, false).ID: return 4819;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, true).ID: return 4820;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, false).ID: return 4821;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, true).ID: return 4822;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, false).ID: return 4823;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, true).ID: return 4824;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, false).ID: return 4825;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, true).ID: return 4826;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, false).ID: return 4827;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, true).ID: return 4828;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, false).ID: return 4829;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, true).ID: return 4830;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, false).ID: return 4831;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, true).ID: return 4832;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, false).ID: return 4833;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, true).ID: return 4834;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, false).ID: return 4835;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, true).ID: return 4836;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, false).ID: return 4837;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, true).ID: return 4838;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, false).ID: return 4839;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, true).ID: return 4840;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, false).ID: return 4841;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, true).ID: return 4842;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, false).ID: return 4843;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, true).ID: return 4844;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, false).ID: return 4845;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, true).ID: return 4846;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, false).ID: return 4847;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, true).ID: return 4848;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, false).ID: return 4849;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, true).ID: return 4850;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, false).ID: return 4851;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, true).ID: return 4852;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, false).ID: return 4853;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, true).ID: return 4854;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, false).ID: return 4855;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, true).ID: return 4856;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, false).ID: return 4857;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, true).ID: return 4858;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, false).ID: return 4859;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, true).ID: return 4860;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, false).ID: return 4861;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, true).ID: return 4862;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, false).ID: return 4863;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, true).ID: return 4864;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, false).ID: return 4865;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, true).ID: return 4866;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, false).ID: return 4867;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, true).ID: return 4868;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, false).ID: return 4869;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, true).ID: return 4870;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, false).ID: return 4871;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, true).ID: return 4872;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, false).ID: return 4873;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, true).ID: return 4874;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, false).ID: return 4875;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, true).ID: return 4876;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, false).ID: return 4877;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, true).ID: return 4878;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, false).ID: return 4879;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, true).ID: return 4880;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, false).ID: return 4881;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, true).ID: return 4882;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, false).ID: return 4883;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, true).ID: return 4740;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, false).ID: return 4741;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, true).ID: return 4742;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, false).ID: return 4743;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, true).ID: return 4744;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, false).ID: return 4745;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, true).ID: return 4746;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, false).ID: return 4747;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, true).ID: return 4748;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, false).ID: return 4749;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, true).ID: return 4750;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, false).ID: return 4751;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, true).ID: return 4752;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, false).ID: return 4753;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, true).ID: return 4754;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, false).ID: return 4755;\n\t\t\tcase TubeCoral::TubeCoral().ID: return 8471;\n\t\t\tcase TubeCoralBlock::TubeCoralBlock().ID: return 8455;\n\t\t\tcase TubeCoralFan::TubeCoralFan().ID: return 8571;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 8521;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 8523;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 8525;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 8527;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 0).ID: return 8438;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 1).ID: return 8439;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 2).ID: return 8440;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 0).ID: return 8441;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 1).ID: return 8442;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 2).ID: return 8443;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 0).ID: return 8444;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 1).ID: return 8445;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 2).ID: return 8446;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 0).ID: return 8447;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 1).ID: return 8448;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 2).ID: return 8449;\n\t\t\tcase Vine::Vine(true, true, true, true, true).ID: return 4269;\n\t\t\tcase Vine::Vine(true, true, true, true, false).ID: return 4270;\n\t\t\tcase Vine::Vine(true, true, true, false, true).ID: return 4271;\n\t\t\tcase Vine::Vine(true, true, true, false, false).ID: return 4272;\n\t\t\tcase Vine::Vine(true, true, false, true, true).ID: return 4273;\n\t\t\tcase Vine::Vine(true, true, false, true, false).ID: return 4274;\n\t\t\tcase Vine::Vine(true, true, false, false, true).ID: return 4275;\n\t\t\tcase Vine::Vine(true, true, false, false, false).ID: return 4276;\n\t\t\tcase Vine::Vine(true, false, true, true, true).ID: return 4277;\n\t\t\tcase Vine::Vine(true, false, true, true, false).ID: return 4278;\n\t\t\tcase Vine::Vine(true, false, true, false, true).ID: return 4279;\n\t\t\tcase Vine::Vine(true, false, true, false, false).ID: return 4280;\n\t\t\tcase Vine::Vine(true, false, false, true, true).ID: return 4281;\n\t\t\tcase Vine::Vine(true, false, false, true, false).ID: return 4282;\n\t\t\tcase Vine::Vine(true, false, false, false, true).ID: return 4283;\n\t\t\tcase Vine::Vine(true, false, false, false, false).ID: return 4284;\n\t\t\tcase Vine::Vine(false, true, true, true, true).ID: return 4285;\n\t\t\tcase Vine::Vine(false, true, true, true, false).ID: return 4286;\n\t\t\tcase Vine::Vine(false, true, true, false, true).ID: return 4287;\n\t\t\tcase Vine::Vine(false, true, true, false, false).ID: return 4288;\n\t\t\tcase Vine::Vine(false, true, false, true, true).ID: return 4289;\n\t\t\tcase Vine::Vine(false, true, false, true, false).ID: return 4290;\n\t\t\tcase Vine::Vine(false, true, false, false, true).ID: return 4291;\n\t\t\tcase Vine::Vine(false, true, false, false, false).ID: return 4292;\n\t\t\tcase Vine::Vine(false, false, true, true, true).ID: return 4293;\n\t\t\tcase Vine::Vine(false, false, true, true, false).ID: return 4294;\n\t\t\tcase Vine::Vine(false, false, true, false, true).ID: return 4295;\n\t\t\tcase Vine::Vine(false, false, true, false, false).ID: return 4296;\n\t\t\tcase Vine::Vine(false, false, false, true, true).ID: return 4297;\n\t\t\tcase Vine::Vine(false, false, false, true, false).ID: return 4298;\n\t\t\tcase Vine::Vine(false, false, false, false, true).ID: return 4299;\n\t\t\tcase Vine::Vine(false, false, false, false, false).ID: return 4300;\n\t\t\tcase VoidAir::VoidAir().ID: return 8591;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3271;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3273;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3275;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3277;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZM).ID: return 1132;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZP).ID: return 1133;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XM).ID: return 1134;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XP).ID: return 1135;\n\t\t\tcase Water::Water(0).ID: return 34;\n\t\t\tcase Water::Water(1).ID: return 35;\n\t\t\tcase Water::Water(2).ID: return 36;\n\t\t\tcase Water::Water(3).ID: return 37;\n\t\t\tcase Water::Water(4).ID: return 38;\n\t\t\tcase Water::Water(5).ID: return 39;\n\t\t\tcase Water::Water(6).ID: return 40;\n\t\t\tcase Water::Water(7).ID: return 41;\n\t\t\tcase Water::Water(8).ID: return 42;\n\t\t\tcase Water::Water(9).ID: return 43;\n\t\t\tcase Water::Water(10).ID: return 44;\n\t\t\tcase Water::Water(11).ID: return 45;\n\t\t\tcase Water::Water(12).ID: return 46;\n\t\t\tcase Water::Water(13).ID: return 47;\n\t\t\tcase Water::Water(14).ID: return 48;\n\t\t\tcase Water::Water(15).ID: return 49;\n\t\t\tcase WetSponge::WetSponge().ID: return 229;\n\t\t\tcase Wheat::Wheat(0).ID: return 3052;\n\t\t\tcase Wheat::Wheat(1).ID: return 3053;\n\t\t\tcase Wheat::Wheat(2).ID: return 3054;\n\t\t\tcase Wheat::Wheat(3).ID: return 3055;\n\t\t\tcase Wheat::Wheat(4).ID: return 3056;\n\t\t\tcase Wheat::Wheat(5).ID: return 3057;\n\t\t\tcase Wheat::Wheat(6).ID: return 3058;\n\t\t\tcase Wheat::Wheat(7).ID: return 3059;\n\t\t\tcase WhiteBanner::WhiteBanner(0).ID: return 6855;\n\t\t\tcase WhiteBanner::WhiteBanner(1).ID: return 6856;\n\t\t\tcase WhiteBanner::WhiteBanner(2).ID: return 6857;\n\t\t\tcase WhiteBanner::WhiteBanner(3).ID: return 6858;\n\t\t\tcase WhiteBanner::WhiteBanner(4).ID: return 6859;\n\t\t\tcase WhiteBanner::WhiteBanner(5).ID: return 6860;\n\t\t\tcase WhiteBanner::WhiteBanner(6).ID: return 6861;\n\t\t\tcase WhiteBanner::WhiteBanner(7).ID: return 6862;\n\t\t\tcase WhiteBanner::WhiteBanner(8).ID: return 6863;\n\t\t\tcase WhiteBanner::WhiteBanner(9).ID: return 6864;\n\t\t\tcase WhiteBanner::WhiteBanner(10).ID: return 6865;\n\t\t\tcase WhiteBanner::WhiteBanner(11).ID: return 6866;\n\t\t\tcase WhiteBanner::WhiteBanner(12).ID: return 6867;\n\t\t\tcase WhiteBanner::WhiteBanner(13).ID: return 6868;\n\t\t\tcase WhiteBanner::WhiteBanner(14).ID: return 6869;\n\t\t\tcase WhiteBanner::WhiteBanner(15).ID: return 6870;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Head).ID: return 748;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Foot).ID: return 749;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Head).ID: return 750;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Foot).ID: return 751;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Head).ID: return 752;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Foot).ID: return 753;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Head).ID: return 754;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Foot).ID: return 755;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Head).ID: return 756;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Foot).ID: return 757;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Head).ID: return 758;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Foot).ID: return 759;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Head).ID: return 760;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Foot).ID: return 761;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Head).ID: return 762;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Foot).ID: return 763;\n\t\t\tcase WhiteCarpet::WhiteCarpet().ID: return 6824;\n\t\t\tcase WhiteConcrete::WhiteConcrete().ID: return 8378;\n\t\t\tcase WhiteConcretePowder::WhiteConcretePowder().ID: return 8394;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8314;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8315;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8316;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8317;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8218;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8219;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8220;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8221;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8222;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8223;\n\t\t\tcase WhiteStainedGlass::WhiteStainedGlass().ID: return 3578;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, true).ID: return 5823;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, false).ID: return 5824;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, true).ID: return 5827;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, false).ID: return 5828;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, true).ID: return 5831;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, false).ID: return 5832;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, true).ID: return 5835;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, false).ID: return 5836;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, true).ID: return 5839;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, false).ID: return 5840;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, true).ID: return 5843;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, false).ID: return 5844;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, true).ID: return 5847;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, false).ID: return 5848;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, true).ID: return 5851;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, false).ID: return 5852;\n\t\t\tcase WhiteTerracotta::WhiteTerracotta().ID: return 5805;\n\t\t\tcase WhiteTulip::WhiteTulip().ID: return 1118;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7111;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7112;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7113;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7114;\n\t\t\tcase WhiteWool::WhiteWool().ID: return 1083;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(0).ID: return 5472;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(1).ID: return 5473;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(2).ID: return 5474;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(3).ID: return 5475;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(4).ID: return 5476;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(5).ID: return 5477;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(6).ID: return 5478;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(7).ID: return 5479;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(8).ID: return 5480;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(9).ID: return 5481;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(10).ID: return 5482;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(11).ID: return 5483;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(12).ID: return 5484;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(13).ID: return 5485;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(14).ID: return 5486;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(15).ID: return 5487;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 5468;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 5469;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 5470;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 5471;\n\t\t\tcase YellowBanner::YellowBanner(0).ID: return 6919;\n\t\t\tcase YellowBanner::YellowBanner(1).ID: return 6920;\n\t\t\tcase YellowBanner::YellowBanner(2).ID: return 6921;\n\t\t\tcase YellowBanner::YellowBanner(3).ID: return 6922;\n\t\t\tcase YellowBanner::YellowBanner(4).ID: return 6923;\n\t\t\tcase YellowBanner::YellowBanner(5).ID: return 6924;\n\t\t\tcase YellowBanner::YellowBanner(6).ID: return 6925;\n\t\t\tcase YellowBanner::YellowBanner(7).ID: return 6926;\n\t\t\tcase YellowBanner::YellowBanner(8).ID: return 6927;\n\t\t\tcase YellowBanner::YellowBanner(9).ID: return 6928;\n\t\t\tcase YellowBanner::YellowBanner(10).ID: return 6929;\n\t\t\tcase YellowBanner::YellowBanner(11).ID: return 6930;\n\t\t\tcase YellowBanner::YellowBanner(12).ID: return 6931;\n\t\t\tcase YellowBanner::YellowBanner(13).ID: return 6932;\n\t\t\tcase YellowBanner::YellowBanner(14).ID: return 6933;\n\t\t\tcase YellowBanner::YellowBanner(15).ID: return 6934;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Head).ID: return 812;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Foot).ID: return 813;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Head).ID: return 814;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Foot).ID: return 815;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Head).ID: return 816;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Foot).ID: return 817;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Head).ID: return 818;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Foot).ID: return 819;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Head).ID: return 820;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Foot).ID: return 821;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Head).ID: return 822;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Foot).ID: return 823;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Head).ID: return 824;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Foot).ID: return 825;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Head).ID: return 826;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Foot).ID: return 827;\n\t\t\tcase YellowCarpet::YellowCarpet().ID: return 6828;\n\t\t\tcase YellowConcrete::YellowConcrete().ID: return 8382;\n\t\t\tcase YellowConcretePowder::YellowConcretePowder().ID: return 8398;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8330;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8331;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8332;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8333;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8242;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8243;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8244;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8245;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8246;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8247;\n\t\t\tcase YellowStainedGlass::YellowStainedGlass().ID: return 3582;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, true).ID: return 5951;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, false).ID: return 5952;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, true).ID: return 5955;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, false).ID: return 5956;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, true).ID: return 5959;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, false).ID: return 5960;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, true).ID: return 5963;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, false).ID: return 5964;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, true).ID: return 5967;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, false).ID: return 5968;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, true).ID: return 5971;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, false).ID: return 5972;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, true).ID: return 5975;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, false).ID: return 5976;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, true).ID: return 5979;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, false).ID: return 5980;\n\t\t\tcase YellowTerracotta::YellowTerracotta().ID: return 5809;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7127;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7128;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7129;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7130;\n\t\t\tcase YellowWool::YellowWool().ID: return 1087;\n\t\t\tcase ZombieHead::ZombieHead(0).ID: return 5492;\n\t\t\tcase ZombieHead::ZombieHead(1).ID: return 5493;\n\t\t\tcase ZombieHead::ZombieHead(2).ID: return 5494;\n\t\t\tcase ZombieHead::ZombieHead(3).ID: return 5495;\n\t\t\tcase ZombieHead::ZombieHead(4).ID: return 5496;\n\t\t\tcase ZombieHead::ZombieHead(5).ID: return 5497;\n\t\t\tcase ZombieHead::ZombieHead(6).ID: return 5498;\n\t\t\tcase ZombieHead::ZombieHead(7).ID: return 5499;\n\t\t\tcase ZombieHead::ZombieHead(8).ID: return 5500;\n\t\t\tcase ZombieHead::ZombieHead(9).ID: return 5501;\n\t\t\tcase ZombieHead::ZombieHead(10).ID: return 5502;\n\t\t\tcase ZombieHead::ZombieHead(11).ID: return 5503;\n\t\t\tcase ZombieHead::ZombieHead(12).ID: return 5504;\n\t\t\tcase ZombieHead::ZombieHead(13).ID: return 5505;\n\t\t\tcase ZombieHead::ZombieHead(14).ID: return 5506;\n\t\t\tcase ZombieHead::ZombieHead(15).ID: return 5507;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 5488;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 5489;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 5490;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 5491;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const Item ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase Item::AcaciaBoat: return 767;\n\t\t\tcase Item::AcaciaButton: return 245;\n\t\t\tcase Item::AcaciaDoor: return 465;\n\t\t\tcase Item::AcaciaFence: return 179;\n\t\t\tcase Item::AcaciaFenceGate: return 214;\n\t\t\tcase Item::AcaciaLeaves: return 60;\n\t\t\tcase Item::AcaciaLog: return 36;\n\t\t\tcase Item::AcaciaPlanks: return 17;\n\t\t\tcase Item::AcaciaPressurePlate: return 164;\n\t\t\tcase Item::AcaciaSapling: return 23;\n\t\t\tcase Item::AcaciaSlab: return 116;\n\t\t\tcase Item::AcaciaStairs: return 301;\n\t\t\tcase Item::AcaciaTrapdoor: return 191;\n\t\t\tcase Item::AcaciaWood: return 54;\n\t\t\tcase Item::ActivatorRail: return 261;\n\t\t\tcase Item::Air: return -0;\n\t\t\tcase Item::Allium: return 101;\n\t\t\tcase Item::Andesite: return 6;\n\t\t\tcase Item::Anvil: return 247;\n\t\t\tcase Item::Apple: return 476;\n\t\t\tcase Item::ArmorStand: return 726;\n\t\t\tcase Item::Arrow: return 478;\n\t\t\tcase Item::AzureBluet: return 102;\n\t\t\tcase Item::BakedPotato: return 699;\n\t\t\tcase Item::Barrier: return 279;\n\t\t\tcase Item::BatSpawnEgg: return 639;\n\t\t\tcase Item::Beacon: return 238;\n\t\t\tcase Item::Bedrock: return 25;\n\t\t\tcase Item::Beef: return 619;\n\t\t\tcase Item::Beetroot: return 754;\n\t\t\tcase Item::BeetrootSeeds: return 755;\n\t\t\tcase Item::BeetrootSoup: return 756;\n\t\t\tcase Item::BirchBoat: return 765;\n\t\t\tcase Item::BirchButton: return 243;\n\t\t\tcase Item::BirchDoor: return 463;\n\t\t\tcase Item::BirchFence: return 177;\n\t\t\tcase Item::BirchFenceGate: return 212;\n\t\t\tcase Item::BirchLeaves: return 58;\n\t\t\tcase Item::BirchLog: return 34;\n\t\t\tcase Item::BirchPlanks: return 15;\n\t\t\tcase Item::BirchPressurePlate: return 162;\n\t\t\tcase Item::BirchSapling: return 21;\n\t\t\tcase Item::BirchSlab: return 114;\n\t\t\tcase Item::BirchStairs: return 235;\n\t\t\tcase Item::BirchTrapdoor: return 189;\n\t\t\tcase Item::BirchWood: return 52;\n\t\t\tcase Item::BlackBanner: return 750;\n\t\t\tcase Item::BlackBed: return 611;\n\t\t\tcase Item::BlackCarpet: return 297;\n\t\t\tcase Item::BlackConcrete: return 410;\n\t\t\tcase Item::BlackConcretePowder: return 426;\n\t\t\tcase Item::BlackGlazedTerracotta: return 394;\n\t\t\tcase Item::BlackShulkerBox: return 378;\n\t\t\tcase Item::BlackStainedGlass: return 326;\n\t\t\tcase Item::BlackStainedGlassPane: return 342;\n\t\t\tcase Item::BlackTerracotta: return 278;\n\t\t\tcase Item::BlackWool: return 97;\n\t\t\tcase Item::BlazePowder: return 633;\n\t\t\tcase Item::BlazeRod: return 625;\n\t\t\tcase Item::BlazeSpawnEgg: return 640;\n\t\t\tcase Item::BlueBanner: return 746;\n\t\t\tcase Item::BlueBed: return 607;\n\t\t\tcase Item::BlueCarpet: return 293;\n\t\t\tcase Item::BlueConcrete: return 406;\n\t\t\tcase Item::BlueConcretePowder: return 422;\n\t\t\tcase Item::BlueGlazedTerracotta: return 390;\n\t\t\tcase Item::BlueIce: return 458;\n\t\t\tcase Item::BlueOrchid: return 100;\n\t\t\tcase Item::BlueShulkerBox: return 374;\n\t\t\tcase Item::BlueStainedGlass: return 322;\n\t\t\tcase Item::BlueStainedGlassPane: return 338;\n\t\t\tcase Item::BlueTerracotta: return 274;\n\t\t\tcase Item::BlueWool: return 93;\n\t\t\tcase Item::Bone: return 593;\n\t\t\tcase Item::BoneBlock: return 359;\n\t\t\tcase Item::BoneMeal: return 592;\n\t\t\tcase Item::Book: return 562;\n\t\t\tcase Item::Bookshelf: return 137;\n\t\t\tcase Item::Bow: return 477;\n\t\t\tcase Item::Bowl: return 498;\n\t\t\tcase Item::BrainCoral: return 439;\n\t\t\tcase Item::BrainCoralBlock: return 434;\n\t\t\tcase Item::BrainCoralFan: return 449;\n\t\t\tcase Item::Bread: return 514;\n\t\t\tcase Item::BrewingStand: return 635;\n\t\t\tcase Item::Brick: return 556;\n\t\t\tcase Item::BrickSlab: return 122;\n\t\t\tcase Item::BrickStairs: return 216;\n\t\t\tcase Item::Bricks: return 135;\n\t\t\tcase Item::BrownBanner: return 747;\n\t\t\tcase Item::BrownBed: return 608;\n\t\t\tcase Item::BrownCarpet: return 294;\n\t\t\tcase Item::BrownConcrete: return 407;\n\t\t\tcase Item::BrownConcretePowder: return 423;\n\t\t\tcase Item::BrownGlazedTerracotta: return 391;\n\t\t\tcase Item::BrownMushroom: return 108;\n\t\t\tcase Item::BrownMushroomBlock: return 203;\n\t\t\tcase Item::BrownShulkerBox: return 375;\n\t\t\tcase Item::BrownStainedGlass: return 323;\n\t\t\tcase Item::BrownStainedGlassPane: return 339;\n\t\t\tcase Item::BrownTerracotta: return 275;\n\t\t\tcase Item::BrownWool: return 94;\n\t\t\tcase Item::BubbleCoral: return 440;\n\t\t\tcase Item::BubbleCoralBlock: return 435;\n\t\t\tcase Item::BubbleCoralFan: return 450;\n\t\t\tcase Item::Bucket: return 542;\n\t\t\tcase Item::Cactus: return 172;\n\t\t\tcase Item::GreenDye: return 579;\n\t\t\tcase Item::Cake: return 595;\n\t\t\tcase Item::Carrot: return 697;\n\t\t\tcase Item::CarrotOnAStick: return 709;\n\t\t\tcase Item::CarvedPumpkin: return 182;\n\t\t\tcase Item::Cauldron: return 636;\n\t\t\tcase Item::CaveSpiderSpawnEgg: return 641;\n\t\t\tcase Item::ChainCommandBlock: return 355;\n\t\t\tcase Item::ChainmailBoots: return 522;\n\t\t\tcase Item::ChainmailChestplate: return 520;\n\t\t\tcase Item::ChainmailHelmet: return 519;\n\t\t\tcase Item::ChainmailLeggings: return 521;\n\t\t\tcase Item::Charcoal: return 480;\n\t\t\tcase Item::Chest: return 149;\n\t\t\tcase Item::ChestMinecart: return 564;\n\t\t\tcase Item::Chicken: return 621;\n\t\t\tcase Item::ChickenSpawnEgg: return 642;\n\t\t\tcase Item::ChippedAnvil: return 248;\n\t\t\tcase Item::ChiseledQuartzBlock: return 257;\n\t\t\tcase Item::ChiseledRedSandstone: return 351;\n\t\t\tcase Item::ChiseledSandstone: return 69;\n\t\t\tcase Item::ChiseledStoneBricks: return 202;\n\t\t\tcase Item::ChorusFlower: return 143;\n\t\t\tcase Item::ChorusFruit: return 752;\n\t\t\tcase Item::ChorusPlant: return 142;\n\t\t\tcase Item::Clay: return 173;\n\t\t\tcase Item::ClayBall: return 557;\n\t\t\tcase Item::Clock: return 569;\n\t\t\tcase Item::Coal: return 479;\n\t\t\tcase Item::CoalBlock: return 299;\n\t\t\tcase Item::CoalOre: return 31;\n\t\t\tcase Item::CoarseDirt: return 10;\n\t\t\tcase Item::Cobblestone: return 12;\n\t\t\tcase Item::CobblestoneSlab: return 121;\n\t\t\tcase Item::CobblestoneStairs: return 157;\n\t\t\tcase Item::CobblestoneWall: return 239;\n\t\t\tcase Item::Cobweb: return 75;\n\t\t\tcase Item::CocoaBeans: return 580;\n\t\t\tcase Item::Cod: return 571;\n\t\t\tcase Item::CodBucket: return 554;\n\t\t\tcase Item::CodSpawnEgg: return 643;\n\t\t\tcase Item::CommandBlock: return 237;\n\t\t\tcase Item::CommandBlockMinecart: return 732;\n\t\t\tcase Item::Comparator: return 468;\n\t\t\tcase Item::Compass: return 567;\n\t\t\tcase Item::Conduit: return 459;\n\t\t\tcase Item::CookedBeef: return 620;\n\t\t\tcase Item::CookedChicken: return 622;\n\t\t\tcase Item::CookedCod: return 575;\n\t\t\tcase Item::CookedMutton: return 734;\n\t\t\tcase Item::CookedPorkchop: return 537;\n\t\t\tcase Item::CookedRabbit: return 722;\n\t\t\tcase Item::CookedSalmon: return 576;\n\t\t\tcase Item::Cookie: return 612;\n\t\t\tcase Item::CowSpawnEgg: return 644;\n\t\t\tcase Item::CrackedStoneBricks: return 201;\n\t\t\tcase Item::CraftingTable: return 152;\n\t\t\tcase Item::CreeperHead: return 707;\n\t\t\tcase Item::CreeperSpawnEgg: return 645;\n\t\t\tcase Item::CutRedSandstone: return 352;\n\t\t\tcase Item::CutSandstone: return 70;\n\t\t\tcase Item::CyanBanner: return 744;\n\t\t\tcase Item::CyanBed: return 605;\n\t\t\tcase Item::CyanCarpet: return 291;\n\t\t\tcase Item::CyanConcrete: return 404;\n\t\t\tcase Item::CyanConcretePowder: return 420;\n\t\t\tcase Item::CyanDye: return 583;\n\t\t\tcase Item::CyanGlazedTerracotta: return 388;\n\t\t\tcase Item::CyanShulkerBox: return 372;\n\t\t\tcase Item::CyanStainedGlass: return 320;\n\t\t\tcase Item::CyanStainedGlassPane: return 336;\n\t\t\tcase Item::CyanTerracotta: return 272;\n\t\t\tcase Item::CyanWool: return 91;\n\t\t\tcase Item::DamagedAnvil: return 249;\n\t\t\tcase Item::Dandelion: return 98;\n\t\t\tcase Item::YellowDye: return 588;\n\t\t\tcase Item::DarkOakBoat: return 768;\n\t\t\tcase Item::DarkOakButton: return 246;\n\t\t\tcase Item::DarkOakDoor: return 466;\n\t\t\tcase Item::DarkOakFence: return 180;\n\t\t\tcase Item::DarkOakFenceGate: return 215;\n\t\t\tcase Item::DarkOakLeaves: return 61;\n\t\t\tcase Item::DarkOakLog: return 37;\n\t\t\tcase Item::DarkOakPlanks: return 18;\n\t\t\tcase Item::DarkOakPressurePlate: return 165;\n\t\t\tcase Item::DarkOakSapling: return 24;\n\t\t\tcase Item::DarkOakSlab: return 117;\n\t\t\tcase Item::DarkOakStairs: return 302;\n\t\t\tcase Item::DarkOakTrapdoor: return 192;\n\t\t\tcase Item::DarkOakWood: return 55;\n\t\t\tcase Item::DarkPrismarine: return 345;\n\t\t\tcase Item::DarkPrismarineSlab: return 130;\n\t\t\tcase Item::DarkPrismarineStairs: return 348;\n\t\t\tcase Item::DaylightDetector: return 253;\n\t\t\tcase Item::DeadBrainCoral: return 443;\n\t\t\tcase Item::DeadBrainCoralBlock: return 429;\n\t\t\tcase Item::DeadBrainCoralFan: return 454;\n\t\t\tcase Item::DeadBubbleCoral: return 444;\n\t\t\tcase Item::DeadBubbleCoralBlock: return 430;\n\t\t\tcase Item::DeadBubbleCoralFan: return 455;\n\t\t\tcase Item::DeadBush: return 78;\n\t\t\tcase Item::DeadFireCoral: return 445;\n\t\t\tcase Item::DeadFireCoralBlock: return 431;\n\t\t\tcase Item::DeadFireCoralFan: return 456;\n\t\t\tcase Item::DeadHornCoral: return 446;\n\t\t\tcase Item::DeadHornCoralBlock: return 432;\n\t\t\tcase Item::DeadHornCoralFan: return 457;\n\t\t\tcase Item::DeadTubeCoral: return 447;\n\t\t\tcase Item::DeadTubeCoralBlock: return 428;\n\t\t\tcase Item::DeadTubeCoralFan: return 453;\n\t\t\tcase Item::DebugStick: return 773;\n\t\t\tcase Item::DetectorRail: return 73;\n\t\t\tcase Item::Diamond: return 481;\n\t\t\tcase Item::DiamondAxe: return 496;\n\t\t\tcase Item::DiamondBlock: return 151;\n\t\t\tcase Item::DiamondBoots: return 530;\n\t\t\tcase Item::DiamondChestplate: return 528;\n\t\t\tcase Item::DiamondHelmet: return 527;\n\t\t\tcase Item::DiamondHoe: return 510;\n\t\t\tcase Item::DiamondHorseArmor: return 729;\n\t\t\tcase Item::DiamondLeggings: return 529;\n\t\t\tcase Item::DiamondOre: return 150;\n\t\t\tcase Item::DiamondPickaxe: return 495;\n\t\t\tcase Item::DiamondShovel: return 494;\n\t\t\tcase Item::DiamondSword: return 493;\n\t\t\tcase Item::Diorite: return 4;\n\t\t\tcase Item::Dirt: return 9;\n\t\t\tcase Item::Dispenser: return 67;\n\t\t\tcase Item::DolphinSpawnEgg: return 646;\n\t\t\tcase Item::DonkeySpawnEgg: return 647;\n\t\t\tcase Item::DragonBreath: return 757;\n\t\t\tcase Item::DragonEgg: return 227;\n\t\t\tcase Item::DragonHead: return 708;\n\t\t\tcase Item::DriedKelp: return 616;\n\t\t\tcase Item::DriedKelpBlock: return 560;\n\t\t\tcase Item::Dropper: return 262;\n\t\t\tcase Item::DrownedSpawnEgg: return 648;\n\t\t\tcase Item::Egg: return 566;\n\t\t\tcase Item::ElderGuardianSpawnEgg: return 649;\n\t\t\tcase Item::Elytra: return 763;\n\t\t\tcase Item::Emerald: return 694;\n\t\t\tcase Item::EmeraldBlock: return 233;\n\t\t\tcase Item::EmeraldOre: return 230;\n\t\t\tcase Item::EnchantedBook: return 714;\n\t\t\tcase Item::EnchantedGoldenApple: return 540;\n\t\t\tcase Item::EnchantingTable: return 223;\n\t\t\tcase Item::EndCrystal: return 751;\n\t\t\tcase Item::EndPortalFrame: return 224;\n\t\t\tcase Item::EndRod: return 141;\n\t\t\tcase Item::EndStone: return 225;\n\t\t\tcase Item::EndStoneBricks: return 226;\n\t\t\tcase Item::EnderChest: return 231;\n\t\t\tcase Item::EnderEye: return 637;\n\t\t\tcase Item::EnderPearl: return 624;\n\t\t\tcase Item::EndermanSpawnEgg: return 650;\n\t\t\tcase Item::EndermiteSpawnEgg: return 651;\n\t\t\tcase Item::EvokerSpawnEgg: return 652;\n\t\t\tcase Item::ExperienceBottle: return 690;\n\t\t\tcase Item::Farmland: return 153;\n\t\t\tcase Item::Feather: return 505;\n\t\t\tcase Item::FermentedSpiderEye: return 632;\n\t\t\tcase Item::Fern: return 77;\n\t\t\tcase Item::FilledMap: return 613;\n\t\t\tcase Item::FireCharge: return 691;\n\t\t\tcase Item::FireCoral: return 441;\n\t\t\tcase Item::FireCoralBlock: return 436;\n\t\t\tcase Item::FireCoralFan: return 451;\n\t\t\tcase Item::FireworkRocket: return 712;\n\t\t\tcase Item::FireworkStar: return 713;\n\t\t\tcase Item::FishingRod: return 568;\n\t\t\tcase Item::Flint: return 535;\n\t\t\tcase Item::FlintAndSteel: return 475;\n\t\t\tcase Item::FlowerPot: return 696;\n\t\t\tcase Item::Furnace: return 154;\n\t\t\tcase Item::FurnaceMinecart: return 565;\n\t\t\tcase Item::GhastSpawnEgg: return 653;\n\t\t\tcase Item::GhastTear: return 626;\n\t\t\tcase Item::Glass: return 64;\n\t\t\tcase Item::GlassBottle: return 630;\n\t\t\tcase Item::GlassPane: return 207;\n\t\t\tcase Item::GlisteringMelonSlice: return 638;\n\t\t\tcase Item::Glowstone: return 185;\n\t\t\tcase Item::GlowstoneDust: return 570;\n\t\t\tcase Item::GoldBlock: return 110;\n\t\t\tcase Item::GoldIngot: return 483;\n\t\t\tcase Item::GoldNugget: return 627;\n\t\t\tcase Item::GoldOre: return 29;\n\t\t\tcase Item::GoldenApple: return 539;\n\t\t\tcase Item::GoldenAxe: return 503;\n\t\t\tcase Item::GoldenBoots: return 534;\n\t\t\tcase Item::GoldenCarrot: return 702;\n\t\t\tcase Item::GoldenChestplate: return 532;\n\t\t\tcase Item::GoldenHelmet: return 531;\n\t\t\tcase Item::GoldenHoe: return 511;\n\t\t\tcase Item::GoldenHorseArmor: return 728;\n\t\t\tcase Item::GoldenLeggings: return 533;\n\t\t\tcase Item::GoldenPickaxe: return 502;\n\t\t\tcase Item::GoldenShovel: return 501;\n\t\t\tcase Item::GoldenSword: return 500;\n\t\t\tcase Item::Granite: return 2;\n\t\t\tcase Item::Grass: return 76;\n\t\t\tcase Item::GrassBlock: return 8;\n\t\t\tcase Item::GrassPath: return 304;\n\t\t\tcase Item::Gravel: return 28;\n\t\t\tcase Item::GrayBanner: return 742;\n\t\t\tcase Item::GrayBed: return 603;\n\t\t\tcase Item::GrayCarpet: return 289;\n\t\t\tcase Item::GrayConcrete: return 402;\n\t\t\tcase Item::GrayConcretePowder: return 418;\n\t\t\tcase Item::GrayDye: return 585;\n\t\t\tcase Item::GrayGlazedTerracotta: return 386;\n\t\t\tcase Item::GrayShulkerBox: return 370;\n\t\t\tcase Item::GrayStainedGlass: return 318;\n\t\t\tcase Item::GrayStainedGlassPane: return 334;\n\t\t\tcase Item::GrayTerracotta: return 270;\n\t\t\tcase Item::GrayWool: return 89;\n\t\t\tcase Item::GreenBanner: return 748;\n\t\t\tcase Item::GreenBed: return 609;\n\t\t\tcase Item::GreenCarpet: return 295;\n\t\t\tcase Item::GreenConcrete: return 408;\n\t\t\tcase Item::GreenConcretePowder: return 424;\n\t\t\tcase Item::GreenGlazedTerracotta: return 392;\n\t\t\tcase Item::GreenShulkerBox: return 376;\n\t\t\tcase Item::GreenStainedGlass: return 324;\n\t\t\tcase Item::GreenStainedGlassPane: return 340;\n\t\t\tcase Item::GreenTerracotta: return 276;\n\t\t\tcase Item::GreenWool: return 95;\n\t\t\tcase Item::GuardianSpawnEgg: return 654;\n\t\t\tcase Item::Gunpowder: return 506;\n\t\t\tcase Item::HayBale: return 281;\n\t\t\tcase Item::HeartOfTheSea: return 789;\n\t\t\tcase Item::HeavyWeightedPressurePlate: return 252;\n\t\t\tcase Item::Hopper: return 256;\n\t\t\tcase Item::HopperMinecart: return 718;\n\t\t\tcase Item::HornCoral: return 442;\n\t\t\tcase Item::HornCoralBlock: return 437;\n\t\t\tcase Item::HornCoralFan: return 452;\n\t\t\tcase Item::HorseSpawnEgg: return 655;\n\t\t\tcase Item::HuskSpawnEgg: return 656;\n\t\t\tcase Item::Ice: return 170;\n\t\t\tcase Item::InfestedChiseledStoneBricks: return 198;\n\t\t\tcase Item::InfestedCobblestone: return 194;\n\t\t\tcase Item::InfestedCrackedStoneBricks: return 197;\n\t\t\tcase Item::InfestedMossyStoneBricks: return 196;\n\t\t\tcase Item::InfestedStone: return 193;\n\t\t\tcase Item::InfestedStoneBricks: return 195;\n\t\t\tcase Item::InkSac: return 577;\n\t\t\tcase Item::IronAxe: return 474;\n\t\t\tcase Item::IronBars: return 206;\n\t\t\tcase Item::IronBlock: return 111;\n\t\t\tcase Item::IronBoots: return 526;\n\t\t\tcase Item::IronChestplate: return 524;\n\t\t\tcase Item::IronDoor: return 460;\n\t\t\tcase Item::IronHelmet: return 523;\n\t\t\tcase Item::IronHoe: return 509;\n\t\t\tcase Item::IronHorseArmor: return 727;\n\t\t\tcase Item::IronIngot: return 482;\n\t\t\tcase Item::IronLeggings: return 525;\n\t\t\tcase Item::IronNugget: return 771;\n\t\t\tcase Item::IronOre: return 30;\n\t\t\tcase Item::IronPickaxe: return 473;\n\t\t\tcase Item::IronShovel: return 472;\n\t\t\tcase Item::IronSword: return 484;\n\t\t\tcase Item::IronTrapdoor: return 280;\n\t\t\tcase Item::ItemFrame: return 695;\n\t\t\tcase Item::JackOLantern: return 186;\n\t\t\tcase Item::Jukebox: return 174;\n\t\t\tcase Item::JungleBoat: return 766;\n\t\t\tcase Item::JungleButton: return 244;\n\t\t\tcase Item::JungleDoor: return 464;\n\t\t\tcase Item::JungleFence: return 178;\n\t\t\tcase Item::JungleFenceGate: return 213;\n\t\t\tcase Item::JungleLeaves: return 59;\n\t\t\tcase Item::JungleLog: return 35;\n\t\t\tcase Item::JunglePlanks: return 16;\n\t\t\tcase Item::JunglePressurePlate: return 163;\n\t\t\tcase Item::JungleSapling: return 22;\n\t\t\tcase Item::JungleSlab: return 115;\n\t\t\tcase Item::JungleStairs: return 236;\n\t\t\tcase Item::JungleTrapdoor: return 190;\n\t\t\tcase Item::JungleWood: return 53;\n\t\t\tcase Item::Kelp: return 559;\n\t\t\tcase Item::KnowledgeBook: return 772;\n\t\t\tcase Item::Ladder: return 155;\n\t\t\tcase Item::LapisBlock: return 66;\n\t\t\tcase Item::LapisLazuli: return 581;\n\t\t\tcase Item::LapisOre: return 65;\n\t\t\tcase Item::LargeFern: return 310;\n\t\t\tcase Item::LavaBucket: return 544;\n\t\t\tcase Item::Lead: return 730;\n\t\t\tcase Item::Leather: return 550;\n\t\t\tcase Item::LeatherBoots: return 518;\n\t\t\tcase Item::LeatherChestplate: return 516;\n\t\t\tcase Item::LeatherHelmet: return 515;\n\t\t\tcase Item::LeatherLeggings: return 517;\n\t\t\tcase Item::Lever: return 158;\n\t\t\tcase Item::LightBlueBanner: return 738;\n\t\t\tcase Item::LightBlueBed: return 599;\n\t\t\tcase Item::LightBlueCarpet: return 285;\n\t\t\tcase Item::LightBlueConcrete: return 398;\n\t\t\tcase Item::LightBlueConcretePowder: return 414;\n\t\t\tcase Item::LightBlueDye: return 589;\n\t\t\tcase Item::LightBlueGlazedTerracotta: return 382;\n\t\t\tcase Item::LightBlueShulkerBox: return 366;\n\t\t\tcase Item::LightBlueStainedGlass: return 314;\n\t\t\tcase Item::LightBlueStainedGlassPane: return 330;\n\t\t\tcase Item::LightBlueTerracotta: return 266;\n\t\t\tcase Item::LightBlueWool: return 85;\n\t\t\tcase Item::LightGrayBanner: return 743;\n\t\t\tcase Item::LightGrayBed: return 604;\n\t\t\tcase Item::LightGrayCarpet: return 290;\n\t\t\tcase Item::LightGrayConcrete: return 403;\n\t\t\tcase Item::LightGrayConcretePowder: return 419;\n\t\t\tcase Item::LightGrayDye: return 584;\n\t\t\tcase Item::LightGrayGlazedTerracotta: return 387;\n\t\t\tcase Item::LightGrayShulkerBox: return 371;\n\t\t\tcase Item::LightGrayStainedGlass: return 319;\n\t\t\tcase Item::LightGrayStainedGlassPane: return 335;\n\t\t\tcase Item::LightGrayTerracotta: return 271;\n\t\t\tcase Item::LightGrayWool: return 90;\n\t\t\tcase Item::LightWeightedPressurePlate: return 251;\n\t\t\tcase Item::Lilac: return 306;\n\t\t\tcase Item::LilyPad: return 219;\n\t\t\tcase Item::LimeBanner: return 740;\n\t\t\tcase Item::LimeBed: return 601;\n\t\t\tcase Item::LimeCarpet: return 287;\n\t\t\tcase Item::LimeConcrete: return 400;\n\t\t\tcase Item::LimeConcretePowder: return 416;\n\t\t\tcase Item::LimeDye: return 587;\n\t\t\tcase Item::LimeGlazedTerracotta: return 384;\n\t\t\tcase Item::LimeShulkerBox: return 368;\n\t\t\tcase Item::LimeStainedGlass: return 316;\n\t\t\tcase Item::LimeStainedGlassPane: return 332;\n\t\t\tcase Item::LimeTerracotta: return 268;\n\t\t\tcase Item::LimeWool: return 87;\n\t\t\tcase Item::LingeringPotion: return 761;\n\t\t\tcase Item::LlamaSpawnEgg: return 657;\n\t\t\tcase Item::MagentaBanner: return 737;\n\t\t\tcase Item::MagentaBed: return 598;\n\t\t\tcase Item::MagentaCarpet: return 284;\n\t\t\tcase Item::MagentaConcrete: return 397;\n\t\t\tcase Item::MagentaConcretePowder: return 413;\n\t\t\tcase Item::MagentaDye: return 590;\n\t\t\tcase Item::MagentaGlazedTerracotta: return 381;\n\t\t\tcase Item::MagentaShulkerBox: return 365;\n\t\t\tcase Item::MagentaStainedGlass: return 313;\n\t\t\tcase Item::MagentaStainedGlassPane: return 329;\n\t\t\tcase Item::MagentaTerracotta: return 265;\n\t\t\tcase Item::MagentaWool: return 84;\n\t\t\tcase Item::MagmaBlock: return 356;\n\t\t\tcase Item::MagmaCream: return 634;\n\t\t\tcase Item::MagmaCubeSpawnEgg: return 658;\n\t\t\tcase Item::Map: return 701;\n\t\t\tcase Item::Melon: return 208;\n\t\t\tcase Item::MelonSeeds: return 618;\n\t\t\tcase Item::MelonSlice: return 615;\n\t\t\tcase Item::MilkBucket: return 551;\n\t\t\tcase Item::Minecart: return 545;\n\t\t\tcase Item::MooshroomSpawnEgg: return 659;\n\t\t\tcase Item::MossyCobblestone: return 138;\n\t\t\tcase Item::MossyCobblestoneWall: return 240;\n\t\t\tcase Item::MossyStoneBricks: return 200;\n\t\t\tcase Item::MuleSpawnEgg: return 660;\n\t\t\tcase Item::MushroomStem: return 205;\n\t\t\tcase Item::MushroomStew: return 499;\n\t\t\tcase Item::MusicDisc11: return 784;\n\t\t\tcase Item::MusicDisc13: return 774;\n\t\t\tcase Item::MusicDiscBlocks: return 776;\n\t\t\tcase Item::MusicDiscCat: return 775;\n\t\t\tcase Item::MusicDiscChirp: return 777;\n\t\t\tcase Item::MusicDiscFar: return 778;\n\t\t\tcase Item::MusicDiscMall: return 779;\n\t\t\tcase Item::MusicDiscMellohi: return 780;\n\t\t\tcase Item::MusicDiscStal: return 781;\n\t\t\tcase Item::MusicDiscStrad: return 782;\n\t\t\tcase Item::MusicDiscWait: return 785;\n\t\t\tcase Item::MusicDiscWard: return 783;\n\t\t\tcase Item::Mutton: return 733;\n\t\t\tcase Item::Mycelium: return 218;\n\t\t\tcase Item::NameTag: return 731;\n\t\t\tcase Item::NautilusShell: return 788;\n\t\t\tcase Item::NetherBrick: return 715;\n\t\t\tcase Item::NetherBrickFence: return 221;\n\t\t\tcase Item::NetherBrickSlab: return 124;\n\t\t\tcase Item::NetherBrickStairs: return 222;\n\t\t\tcase Item::NetherBricks: return 220;\n\t\t\tcase Item::NetherQuartzOre: return 255;\n\t\t\tcase Item::NetherStar: return 710;\n\t\t\tcase Item::NetherWart: return 628;\n\t\t\tcase Item::NetherWartBlock: return 357;\n\t\t\tcase Item::Netherrack: return 183;\n\t\t\tcase Item::NoteBlock: return 71;\n\t\t\tcase Item::OakBoat: return 549;\n\t\t\tcase Item::OakButton: return 241;\n\t\t\tcase Item::OakDoor: return 461;\n\t\t\tcase Item::OakFence: return 175;\n\t\t\tcase Item::OakFenceGate: return 210;\n\t\t\tcase Item::OakLeaves: return 56;\n\t\t\tcase Item::OakLog: return 32;\n\t\t\tcase Item::OakPlanks: return 13;\n\t\t\tcase Item::OakPressurePlate: return 160;\n\t\t\tcase Item::OakSapling: return 19;\n\t\t\tcase Item::OakSlab: return 112;\n\t\t\tcase Item::OakStairs: return 148;\n\t\t\tcase Item::OakTrapdoor: return 187;\n\t\t\tcase Item::OakWood: return 50;\n\t\t\tcase Item::Observer: return 361;\n\t\t\tcase Item::Obsidian: return 139;\n\t\t\tcase Item::OcelotSpawnEgg: return 661;\n\t\t\tcase Item::OrangeBanner: return 736;\n\t\t\tcase Item::OrangeBed: return 597;\n\t\t\tcase Item::OrangeCarpet: return 283;\n\t\t\tcase Item::OrangeConcrete: return 396;\n\t\t\tcase Item::OrangeConcretePowder: return 412;\n\t\t\tcase Item::OrangeDye: return 591;\n\t\t\tcase Item::OrangeGlazedTerracotta: return 380;\n\t\t\tcase Item::OrangeShulkerBox: return 364;\n\t\t\tcase Item::OrangeStainedGlass: return 312;\n\t\t\tcase Item::OrangeStainedGlassPane: return 328;\n\t\t\tcase Item::OrangeTerracotta: return 264;\n\t\t\tcase Item::OrangeTulip: return 104;\n\t\t\tcase Item::OrangeWool: return 83;\n\t\t\tcase Item::OxeyeDaisy: return 107;\n\t\t\tcase Item::PackedIce: return 300;\n\t\t\tcase Item::Painting: return 538;\n\t\t\tcase Item::Paper: return 561;\n\t\t\tcase Item::ParrotSpawnEgg: return 662;\n\t\t\tcase Item::Peony: return 308;\n\t\t\tcase Item::PetrifiedOakSlab: return 120;\n\t\t\tcase Item::PhantomMembrane: return 787;\n\t\t\tcase Item::PhantomSpawnEgg: return 663;\n\t\t\tcase Item::PigSpawnEgg: return 664;\n\t\t\tcase Item::PinkBanner: return 741;\n\t\t\tcase Item::PinkBed: return 602;\n\t\t\tcase Item::PinkCarpet: return 288;\n\t\t\tcase Item::PinkConcrete: return 401;\n\t\t\tcase Item::PinkConcretePowder: return 417;\n\t\t\tcase Item::PinkDye: return 586;\n\t\t\tcase Item::PinkGlazedTerracotta: return 385;\n\t\t\tcase Item::PinkShulkerBox: return 369;\n\t\t\tcase Item::PinkStainedGlass: return 317;\n\t\t\tcase Item::PinkStainedGlassPane: return 333;\n\t\t\tcase Item::PinkTerracotta: return 269;\n\t\t\tcase Item::PinkTulip: return 106;\n\t\t\tcase Item::PinkWool: return 88;\n\t\t\tcase Item::Piston: return 81;\n\t\t\tcase Item::PlayerHead: return 705;\n\t\t\tcase Item::Podzol: return 11;\n\t\t\tcase Item::PoisonousPotato: return 700;\n\t\t\tcase Item::PolarBearSpawnEgg: return 665;\n\t\t\tcase Item::PolishedAndesite: return 7;\n\t\t\tcase Item::PolishedDiorite: return 5;\n\t\t\tcase Item::PolishedGranite: return 3;\n\t\t\tcase Item::PoppedChorusFruit: return 753;\n\t\t\tcase Item::Poppy: return 99;\n\t\t\tcase Item::Porkchop: return 536;\n\t\t\tcase Item::Potato: return 698;\n\t\t\tcase Item::Potion: return 629;\n\t\t\tcase Item::PoweredRail: return 72;\n\t\t\tcase Item::Prismarine: return 343;\n\t\t\tcase Item::PrismarineBrickSlab: return 129;\n\t\t\tcase Item::PrismarineBrickStairs: return 347;\n\t\t\tcase Item::PrismarineBricks: return 344;\n\t\t\tcase Item::PrismarineCrystals: return 720;\n\t\t\tcase Item::PrismarineShard: return 719;\n\t\t\tcase Item::PrismarineSlab: return 128;\n\t\t\tcase Item::PrismarineStairs: return 346;\n\t\t\tcase Item::Pufferfish: return 574;\n\t\t\tcase Item::PufferfishBucket: return 552;\n\t\t\tcase Item::PufferfishSpawnEgg: return 666;\n\t\t\tcase Item::Pumpkin: return 181;\n\t\t\tcase Item::PumpkinPie: return 711;\n\t\t\tcase Item::PumpkinSeeds: return 617;\n\t\t\tcase Item::PurpleBanner: return 745;\n\t\t\tcase Item::PurpleBed: return 606;\n\t\t\tcase Item::PurpleCarpet: return 292;\n\t\t\tcase Item::PurpleConcrete: return 405;\n\t\t\tcase Item::PurpleConcretePowder: return 421;\n\t\t\tcase Item::PurpleDye: return 582;\n\t\t\tcase Item::PurpleGlazedTerracotta: return 389;\n\t\t\tcase Item::PurpleShulkerBox: return 373;\n\t\t\tcase Item::PurpleStainedGlass: return 321;\n\t\t\tcase Item::PurpleStainedGlassPane: return 337;\n\t\t\tcase Item::PurpleTerracotta: return 273;\n\t\t\tcase Item::PurpleWool: return 92;\n\t\t\tcase Item::PurpurBlock: return 144;\n\t\t\tcase Item::PurpurPillar: return 145;\n\t\t\tcase Item::PurpurSlab: return 127;\n\t\t\tcase Item::PurpurStairs: return 146;\n\t\t\tcase Item::Quartz: return 716;\n\t\t\tcase Item::QuartzBlock: return 258;\n\t\t\tcase Item::QuartzPillar: return 259;\n\t\t\tcase Item::QuartzSlab: return 125;\n\t\t\tcase Item::QuartzStairs: return 260;\n\t\t\tcase Item::Rabbit: return 721;\n\t\t\tcase Item::RabbitFoot: return 724;\n\t\t\tcase Item::RabbitHide: return 725;\n\t\t\tcase Item::RabbitSpawnEgg: return 667;\n\t\t\tcase Item::RabbitStew: return 723;\n\t\t\tcase Item::Rail: return 156;\n\t\t\tcase Item::RedBanner: return 749;\n\t\t\tcase Item::RedBed: return 610;\n\t\t\tcase Item::RedCarpet: return 296;\n\t\t\tcase Item::RedConcrete: return 409;\n\t\t\tcase Item::RedConcretePowder: return 425;\n\t\t\tcase Item::RedGlazedTerracotta: return 393;\n\t\t\tcase Item::RedMushroom: return 109;\n\t\t\tcase Item::RedMushroomBlock: return 204;\n\t\t\tcase Item::RedNetherBricks: return 358;\n\t\t\tcase Item::RedSand: return 27;\n\t\t\tcase Item::RedSandstone: return 350;\n\t\t\tcase Item::RedSandstoneSlab: return 126;\n\t\t\tcase Item::RedSandstoneStairs: return 353;\n\t\t\tcase Item::RedShulkerBox: return 377;\n\t\t\tcase Item::RedStainedGlass: return 325;\n\t\t\tcase Item::RedStainedGlassPane: return 341;\n\t\t\tcase Item::RedTerracotta: return 277;\n\t\t\tcase Item::RedTulip: return 103;\n\t\t\tcase Item::RedWool: return 96;\n\t\t\tcase Item::Redstone: return 547;\n\t\t\tcase Item::RedstoneBlock: return 254;\n\t\t\tcase Item::RedstoneLamp: return 228;\n\t\t\tcase Item::RedstoneOre: return 166;\n\t\t\tcase Item::RedstoneTorch: return 167;\n\t\t\tcase Item::Repeater: return 467;\n\t\t\tcase Item::RepeatingCommandBlock: return 354;\n\t\t\tcase Item::RoseBush: return 307;\n\t\t\tcase Item::RedDye: return 578;\n\t\t\tcase Item::RottenFlesh: return 623;\n\t\t\tcase Item::Saddle: return 546;\n\t\t\tcase Item::Salmon: return 572;\n\t\t\tcase Item::SalmonBucket: return 553;\n\t\t\tcase Item::SalmonSpawnEgg: return 668;\n\t\t\tcase Item::Sand: return 26;\n\t\t\tcase Item::Sandstone: return 68;\n\t\t\tcase Item::SandstoneSlab: return 119;\n\t\t\tcase Item::SandstoneStairs: return 229;\n\t\t\tcase Item::Scute: return 471;\n\t\t\tcase Item::SeaLantern: return 349;\n\t\t\tcase Item::SeaPickle: return 80;\n\t\t\tcase Item::Seagrass: return 79;\n\t\t\tcase Item::Shears: return 614;\n\t\t\tcase Item::SheepSpawnEgg: return 669;\n\t\t\tcase Item::Shield: return 762;\n\t\t\tcase Item::ShulkerBox: return 362;\n\t\t\tcase Item::ShulkerShell: return 770;\n\t\t\tcase Item::ShulkerSpawnEgg: return 670;\n\t\t\tcase Item::OakSign: return 541;\n\t\t\tcase Item::SilverfishSpawnEgg: return 671;\n\t\t\tcase Item::SkeletonHorseSpawnEgg: return 673;\n\t\t\tcase Item::SkeletonSkull: return 703;\n\t\t\tcase Item::SkeletonSpawnEgg: return 672;\n\t\t\tcase Item::SlimeBall: return 563;\n\t\t\tcase Item::SlimeBlock: return 303;\n\t\t\tcase Item::SlimeSpawnEgg: return 674;\n\t\t\tcase Item::SmoothQuartz: return 131;\n\t\t\tcase Item::SmoothRedSandstone: return 132;\n\t\t\tcase Item::SmoothSandstone: return 133;\n\t\t\tcase Item::SmoothStone: return 134;\n\t\t\tcase Item::Snow: return 169;\n\t\t\tcase Item::SnowBlock: return 171;\n\t\t\tcase Item::Snowball: return 548;\n\t\t\tcase Item::SoulSand: return 184;\n\t\t\tcase Item::Spawner: return 147;\n\t\t\tcase Item::SpectralArrow: return 759;\n\t\t\tcase Item::SpiderEye: return 631;\n\t\t\tcase Item::SpiderSpawnEgg: return 675;\n\t\t\tcase Item::SplashPotion: return 758;\n\t\t\tcase Item::Sponge: return 62;\n\t\t\tcase Item::SpruceBoat: return 764;\n\t\t\tcase Item::SpruceButton: return 242;\n\t\t\tcase Item::SpruceDoor: return 462;\n\t\t\tcase Item::SpruceFence: return 176;\n\t\t\tcase Item::SpruceFenceGate: return 211;\n\t\t\tcase Item::SpruceLeaves: return 57;\n\t\t\tcase Item::SpruceLog: return 33;\n\t\t\tcase Item::SprucePlanks: return 14;\n\t\t\tcase Item::SprucePressurePlate: return 161;\n\t\t\tcase Item::SpruceSapling: return 20;\n\t\t\tcase Item::SpruceSlab: return 113;\n\t\t\tcase Item::SpruceStairs: return 234;\n\t\t\tcase Item::SpruceTrapdoor: return 188;\n\t\t\tcase Item::SpruceWood: return 51;\n\t\t\tcase Item::SquidSpawnEgg: return 676;\n\t\t\tcase Item::Stick: return 497;\n\t\t\tcase Item::StickyPiston: return 74;\n\t\t\tcase Item::Stone: return 1;\n\t\t\tcase Item::StoneAxe: return 492;\n\t\t\tcase Item::StoneBrickSlab: return 123;\n\t\t\tcase Item::StoneBrickStairs: return 217;\n\t\t\tcase Item::StoneBricks: return 199;\n\t\t\tcase Item::StoneButton: return 168;\n\t\t\tcase Item::StoneHoe: return 508;\n\t\t\tcase Item::StonePickaxe: return 491;\n\t\t\tcase Item::StonePressurePlate: return 159;\n\t\t\tcase Item::StoneShovel: return 490;\n\t\t\tcase Item::StoneSlab: return 118;\n\t\t\tcase Item::StoneSword: return 489;\n\t\t\tcase Item::StraySpawnEgg: return 677;\n\t\t\tcase Item::String: return 504;\n\t\t\tcase Item::StrippedAcaciaLog: return 42;\n\t\t\tcase Item::StrippedAcaciaWood: return 48;\n\t\t\tcase Item::StrippedBirchLog: return 40;\n\t\t\tcase Item::StrippedBirchWood: return 46;\n\t\t\tcase Item::StrippedDarkOakLog: return 43;\n\t\t\tcase Item::StrippedDarkOakWood: return 49;\n\t\t\tcase Item::StrippedJungleLog: return 41;\n\t\t\tcase Item::StrippedJungleWood: return 47;\n\t\t\tcase Item::StrippedOakLog: return 38;\n\t\t\tcase Item::StrippedOakWood: return 44;\n\t\t\tcase Item::StrippedSpruceLog: return 39;\n\t\t\tcase Item::StrippedSpruceWood: return 45;\n\t\t\tcase Item::StructureBlock: return 469;\n\t\t\tcase Item::StructureVoid: return 360;\n\t\t\tcase Item::Sugar: return 594;\n\t\t\tcase Item::SugarCane: return 558;\n\t\t\tcase Item::Sunflower: return 305;\n\t\t\tcase Item::TallGrass: return 309;\n\t\t\tcase Item::Terracotta: return 298;\n\t\t\tcase Item::TippedArrow: return 760;\n\t\t\tcase Item::TNT: return 136;\n\t\t\tcase Item::TNTMinecart: return 717;\n\t\t\tcase Item::Torch: return 140;\n\t\t\tcase Item::TotemOfUndying: return 769;\n\t\t\tcase Item::TrappedChest: return 250;\n\t\t\tcase Item::Trident: return 786;\n\t\t\tcase Item::TripwireHook: return 232;\n\t\t\tcase Item::TropicalFish: return 573;\n\t\t\tcase Item::TropicalFishBucket: return 555;\n\t\t\tcase Item::TropicalFishSpawnEgg: return 678;\n\t\t\tcase Item::TubeCoral: return 438;\n\t\t\tcase Item::TubeCoralBlock: return 433;\n\t\t\tcase Item::TubeCoralFan: return 448;\n\t\t\tcase Item::TurtleEgg: return 427;\n\t\t\tcase Item::TurtleHelmet: return 470;\n\t\t\tcase Item::TurtleSpawnEgg: return 679;\n\t\t\tcase Item::VexSpawnEgg: return 680;\n\t\t\tcase Item::VillagerSpawnEgg: return 681;\n\t\t\tcase Item::VindicatorSpawnEgg: return 682;\n\t\t\tcase Item::Vine: return 209;\n\t\t\tcase Item::WaterBucket: return 543;\n\t\t\tcase Item::WetSponge: return 63;\n\t\t\tcase Item::Wheat: return 513;\n\t\t\tcase Item::WheatSeeds: return 512;\n\t\t\tcase Item::WhiteBanner: return 735;\n\t\t\tcase Item::WhiteBed: return 596;\n\t\t\tcase Item::WhiteCarpet: return 282;\n\t\t\tcase Item::WhiteConcrete: return 395;\n\t\t\tcase Item::WhiteConcretePowder: return 411;\n\t\t\tcase Item::WhiteGlazedTerracotta: return 379;\n\t\t\tcase Item::WhiteShulkerBox: return 363;\n\t\t\tcase Item::WhiteStainedGlass: return 311;\n\t\t\tcase Item::WhiteStainedGlassPane: return 327;\n\t\t\tcase Item::WhiteTerracotta: return 263;\n\t\t\tcase Item::WhiteTulip: return 105;\n\t\t\tcase Item::WhiteWool: return 82;\n\t\t\tcase Item::WitchSpawnEgg: return 683;\n\t\t\tcase Item::WitherSkeletonSkull: return 704;\n\t\t\tcase Item::WitherSkeletonSpawnEgg: return 684;\n\t\t\tcase Item::WolfSpawnEgg: return 685;\n\t\t\tcase Item::WoodenAxe: return 488;\n\t\t\tcase Item::WoodenHoe: return 507;\n\t\t\tcase Item::WoodenPickaxe: return 487;\n\t\t\tcase Item::WoodenShovel: return 486;\n\t\t\tcase Item::WoodenSword: return 485;\n\t\t\tcase Item::WritableBook: return 692;\n\t\t\tcase Item::WrittenBook: return 693;\n\t\t\tcase Item::YellowBanner: return 739;\n\t\t\tcase Item::YellowBed: return 600;\n\t\t\tcase Item::YellowCarpet: return 286;\n\t\t\tcase Item::YellowConcrete: return 399;\n\t\t\tcase Item::YellowConcretePowder: return 415;\n\t\t\tcase Item::YellowGlazedTerracotta: return 383;\n\t\t\tcase Item::YellowShulkerBox: return 367;\n\t\t\tcase Item::YellowStainedGlass: return 315;\n\t\t\tcase Item::YellowStainedGlassPane: return 331;\n\t\t\tcase Item::YellowTerracotta: return 267;\n\t\t\tcase Item::YellowWool: return 86;\n\t\t\tcase Item::ZombieHead: return 706;\n\t\t\tcase Item::ZombieHorseSpawnEgg: return 687;\n\t\t\tcase Item::ZombiePigmanSpawnEgg: return 688;\n\t\t\tcase Item::ZombieSpawnEgg: return 686;\n\t\t\tcase Item::ZombieVillagerSpawnEgg: return 689;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const CustomStatistic ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase CustomStatistic::AnimalsBred: return 30;\n\t\t\tcase CustomStatistic::AviateOneCm: return 17;\n\t\t\tcase CustomStatistic::BoatOneCm: return 14;\n\t\t\tcase CustomStatistic::CleanArmor: return 38;\n\t\t\tcase CustomStatistic::CleanBanner: return 39;\n\t\t\tcase CustomStatistic::CleanShulkerBox: return 40;\n\t\t\tcase CustomStatistic::ClimbOneCm: return 10;\n\t\t\tcase CustomStatistic::CrouchOneCm: return 6;\n\t\t\tcase CustomStatistic::DamageAbsorbed: return 26;\n\t\t\tcase CustomStatistic::DamageBlockedByShield: return 25;\n\t\t\tcase CustomStatistic::DamageDealt: return 21;\n\t\t\tcase CustomStatistic::DamageDealtAbsorbed: return 22;\n\t\t\tcase CustomStatistic::DamageDealtResisted: return 23;\n\t\t\tcase CustomStatistic::DamageResisted: return 27;\n\t\t\tcase CustomStatistic::DamageTaken: return 24;\n\t\t\tcase CustomStatistic::Deaths: return 28;\n\t\t\tcase CustomStatistic::Drop: return 20;\n\t\t\tcase CustomStatistic::EatCakeSlice: return 35;\n\t\t\tcase CustomStatistic::EnchantItem: return 51;\n\t\t\tcase CustomStatistic::FallOneCm: return 9;\n\t\t\tcase CustomStatistic::FillCauldron: return 36;\n\t\t\tcase CustomStatistic::FishCaught: return 32;\n\t\t\tcase CustomStatistic::FlyOneCm: return 11;\n\t\t\tcase CustomStatistic::HorseOneCm: return 16;\n\t\t\tcase CustomStatistic::InspectDispenser: return 45;\n\t\t\tcase CustomStatistic::InspectDropper: return 43;\n\t\t\tcase CustomStatistic::InspectHopper: return 44;\n\t\t\tcase CustomStatistic::InteractWithBeacon: return 42;\n\t\t\tcase CustomStatistic::InteractWithBrewingstand: return 41;\n\t\t\tcase CustomStatistic::InteractWithCraftingTable: return 54;\n\t\t\tcase CustomStatistic::InteractWithFurnace: return 53;\n\t\t\tcase CustomStatistic::Jump: return 19;\n\t\t\tcase CustomStatistic::LeaveGame: return 0;\n\t\t\tcase CustomStatistic::MinecartOneCm: return 13;\n\t\t\tcase CustomStatistic::MobKills: return 29;\n\t\t\tcase CustomStatistic::OpenChest: return 55;\n\t\t\tcase CustomStatistic::OpenEnderchest: return 50;\n\t\t\tcase CustomStatistic::OpenShulkerBox: return 57;\n\t\t\tcase CustomStatistic::PigOneCm: return 15;\n\t\t\tcase CustomStatistic::PlayerKills: return 31;\n\t\t\tcase CustomStatistic::PlayNoteblock: return 46;\n\t\t\tcase CustomStatistic::PlayOneMinute: return 1;\n\t\t\tcase CustomStatistic::PlayRecord: return 52;\n\t\t\tcase CustomStatistic::PotFlower: return 48;\n\t\t\tcase CustomStatistic::SleepInBed: return 56;\n\t\t\tcase CustomStatistic::SneakTime: return 4;\n\t\t\tcase CustomStatistic::SprintOneCm: return 7;\n\t\t\tcase CustomStatistic::SwimOneCm: return 8;\n\t\t\tcase CustomStatistic::TalkedToVillager: return 33;\n\t\t\tcase CustomStatistic::TimeSinceDeath: return 2;\n\t\t\tcase CustomStatistic::TimeSinceRest: return 3;\n\t\t\tcase CustomStatistic::TradedWithVillager: return 34;\n\t\t\tcase CustomStatistic::TriggerTrappedChest: return 49;\n\t\t\tcase CustomStatistic::TuneNoteblock: return 47;\n\t\t\tcase CustomStatistic::UseCauldron: return 37;\n\t\t\tcase CustomStatistic::WalkOneCm: return 5;\n\t\t\tcase CustomStatistic::WalkOnWaterOneCm: return 18;\n\t\t\tcase CustomStatistic::WalkUnderWaterOneCm: return 12;\n\t\t\tdefault: return UInt32(-1);\n\t\t}\n\t}\n\n\tItem ToItem(const UInt32 ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase 767: return Item::AcaciaBoat;\n\t\t\tcase 245: return Item::AcaciaButton;\n\t\t\tcase 465: return Item::AcaciaDoor;\n\t\t\tcase 179: return Item::AcaciaFence;\n\t\t\tcase 214: return Item::AcaciaFenceGate;\n\t\t\tcase 60: return Item::AcaciaLeaves;\n\t\t\tcase 36: return Item::AcaciaLog;\n\t\t\tcase 17: return Item::AcaciaPlanks;\n\t\t\tcase 164: return Item::AcaciaPressurePlate;\n\t\t\tcase 23: return Item::AcaciaSapling;\n\t\t\tcase 116: return Item::AcaciaSlab;\n\t\t\tcase 301: return Item::AcaciaStairs;\n\t\t\tcase 191: return Item::AcaciaTrapdoor;\n\t\t\tcase 54: return Item::AcaciaWood;\n\t\t\tcase 261: return Item::ActivatorRail;\n\t\t\tcase -0: return Item::Air;\n\t\t\tcase 101: return Item::Allium;\n\t\t\tcase 6: return Item::Andesite;\n\t\t\tcase 247: return Item::Anvil;\n\t\t\tcase 476: return Item::Apple;\n\t\t\tcase 726: return Item::ArmorStand;\n\t\t\tcase 478: return Item::Arrow;\n\t\t\tcase 102: return Item::AzureBluet;\n\t\t\tcase 699: return Item::BakedPotato;\n\t\t\tcase 279: return Item::Barrier;\n\t\t\tcase 639: return Item::BatSpawnEgg;\n\t\t\tcase 238: return Item::Beacon;\n\t\t\tcase 25: return Item::Bedrock;\n\t\t\tcase 619: return Item::Beef;\n\t\t\tcase 754: return Item::Beetroot;\n\t\t\tcase 755: return Item::BeetrootSeeds;\n\t\t\tcase 756: return Item::BeetrootSoup;\n\t\t\tcase 765: return Item::BirchBoat;\n\t\t\tcase 243: return Item::BirchButton;\n\t\t\tcase 463: return Item::BirchDoor;\n\t\t\tcase 177: return Item::BirchFence;\n\t\t\tcase 212: return Item::BirchFenceGate;\n\t\t\tcase 58: return Item::BirchLeaves;\n\t\t\tcase 34: return Item::BirchLog;\n\t\t\tcase 15: return Item::BirchPlanks;\n\t\t\tcase 162: return Item::BirchPressurePlate;\n\t\t\tcase 21: return Item::BirchSapling;\n\t\t\tcase 114: return Item::BirchSlab;\n\t\t\tcase 235: return Item::BirchStairs;\n\t\t\tcase 189: return Item::BirchTrapdoor;\n\t\t\tcase 52: return Item::BirchWood;\n\t\t\tcase 750: return Item::BlackBanner;\n\t\t\tcase 611: return Item::BlackBed;\n\t\t\tcase 297: return Item::BlackCarpet;\n\t\t\tcase 410: return Item::BlackConcrete;\n\t\t\tcase 426: return Item::BlackConcretePowder;\n\t\t\tcase 394: return Item::BlackGlazedTerracotta;\n\t\t\tcase 378: return Item::BlackShulkerBox;\n\t\t\tcase 326: return Item::BlackStainedGlass;\n\t\t\tcase 342: return Item::BlackStainedGlassPane;\n\t\t\tcase 278: return Item::BlackTerracotta;\n\t\t\tcase 97: return Item::BlackWool;\n\t\t\tcase 633: return Item::BlazePowder;\n\t\t\tcase 625: return Item::BlazeRod;\n\t\t\tcase 640: return Item::BlazeSpawnEgg;\n\t\t\tcase 746: return Item::BlueBanner;\n\t\t\tcase 607: return Item::BlueBed;\n\t\t\tcase 293: return Item::BlueCarpet;\n\t\t\tcase 406: return Item::BlueConcrete;\n\t\t\tcase 422: return Item::BlueConcretePowder;\n\t\t\tcase 390: return Item::BlueGlazedTerracotta;\n\t\t\tcase 458: return Item::BlueIce;\n\t\t\tcase 100: return Item::BlueOrchid;\n\t\t\tcase 374: return Item::BlueShulkerBox;\n\t\t\tcase 322: return Item::BlueStainedGlass;\n\t\t\tcase 338: return Item::BlueStainedGlassPane;\n\t\t\tcase 274: return Item::BlueTerracotta;\n\t\t\tcase 93: return Item::BlueWool;\n\t\t\tcase 593: return Item::Bone;\n\t\t\tcase 359: return Item::BoneBlock;\n\t\t\tcase 592: return Item::BoneMeal;\n\t\t\tcase 562: return Item::Book;\n\t\t\tcase 137: return Item::Bookshelf;\n\t\t\tcase 477: return Item::Bow;\n\t\t\tcase 498: return Item::Bowl;\n\t\t\tcase 439: return Item::BrainCoral;\n\t\t\tcase 434: return Item::BrainCoralBlock;\n\t\t\tcase 449: return Item::BrainCoralFan;\n\t\t\tcase 514: return Item::Bread;\n\t\t\tcase 635: return Item::BrewingStand;\n\t\t\tcase 556: return Item::Brick;\n\t\t\tcase 122: return Item::BrickSlab;\n\t\t\tcase 216: return Item::BrickStairs;\n\t\t\tcase 135: return Item::Bricks;\n\t\t\tcase 747: return Item::BrownBanner;\n\t\t\tcase 608: return Item::BrownBed;\n\t\t\tcase 294: return Item::BrownCarpet;\n\t\t\tcase 407: return Item::BrownConcrete;\n\t\t\tcase 423: return Item::BrownConcretePowder;\n\t\t\tcase 391: return Item::BrownGlazedTerracotta;\n\t\t\tcase 108: return Item::BrownMushroom;\n\t\t\tcase 203: return Item::BrownMushroomBlock;\n\t\t\tcase 375: return Item::BrownShulkerBox;\n\t\t\tcase 323: return Item::BrownStainedGlass;\n\t\t\tcase 339: return Item::BrownStainedGlassPane;\n\t\t\tcase 275: return Item::BrownTerracotta;\n\t\t\tcase 94: return Item::BrownWool;\n\t\t\tcase 440: return Item::BubbleCoral;\n\t\t\tcase 435: return Item::BubbleCoralBlock;\n\t\t\tcase 450: return Item::BubbleCoralFan;\n\t\t\tcase 542: return Item::Bucket;\n\t\t\tcase 172: return Item::Cactus;\n\t\t\tcase 579: return Item::GreenDye;\n\t\t\tcase 595: return Item::Cake;\n\t\t\tcase 697: return Item::Carrot;\n\t\t\tcase 709: return Item::CarrotOnAStick;\n\t\t\tcase 182: return Item::CarvedPumpkin;\n\t\t\tcase 636: return Item::Cauldron;\n\t\t\tcase 641: return Item::CaveSpiderSpawnEgg;\n\t\t\tcase 355: return Item::ChainCommandBlock;\n\t\t\tcase 522: return Item::ChainmailBoots;\n\t\t\tcase 520: return Item::ChainmailChestplate;\n\t\t\tcase 519: return Item::ChainmailHelmet;\n\t\t\tcase 521: return Item::ChainmailLeggings;\n\t\t\tcase 480: return Item::Charcoal;\n\t\t\tcase 149: return Item::Chest;\n\t\t\tcase 564: return Item::ChestMinecart;\n\t\t\tcase 621: return Item::Chicken;\n\t\t\tcase 642: return Item::ChickenSpawnEgg;\n\t\t\tcase 248: return Item::ChippedAnvil;\n\t\t\tcase 257: return Item::ChiseledQuartzBlock;\n\t\t\tcase 351: return Item::ChiseledRedSandstone;\n\t\t\tcase 69: return Item::ChiseledSandstone;\n\t\t\tcase 202: return Item::ChiseledStoneBricks;\n\t\t\tcase 143: return Item::ChorusFlower;\n\t\t\tcase 752: return Item::ChorusFruit;\n\t\t\tcase 142: return Item::ChorusPlant;\n\t\t\tcase 173: return Item::Clay;\n\t\t\tcase 557: return Item::ClayBall;\n\t\t\tcase 569: return Item::Clock;\n\t\t\tcase 479: return Item::Coal;\n\t\t\tcase 299: return Item::CoalBlock;\n\t\t\tcase 31: return Item::CoalOre;\n\t\t\tcase 10: return Item::CoarseDirt;\n\t\t\tcase 12: return Item::Cobblestone;\n\t\t\tcase 121: return Item::CobblestoneSlab;\n\t\t\tcase 157: return Item::CobblestoneStairs;\n\t\t\tcase 239: return Item::CobblestoneWall;\n\t\t\tcase 75: return Item::Cobweb;\n\t\t\tcase 580: return Item::CocoaBeans;\n\t\t\tcase 571: return Item::Cod;\n\t\t\tcase 554: return Item::CodBucket;\n\t\t\tcase 643: return Item::CodSpawnEgg;\n\t\t\tcase 237: return Item::CommandBlock;\n\t\t\tcase 732: return Item::CommandBlockMinecart;\n\t\t\tcase 468: return Item::Comparator;\n\t\t\tcase 567: return Item::Compass;\n\t\t\tcase 459: return Item::Conduit;\n\t\t\tcase 620: return Item::CookedBeef;\n\t\t\tcase 622: return Item::CookedChicken;\n\t\t\tcase 575: return Item::CookedCod;\n\t\t\tcase 734: return Item::CookedMutton;\n\t\t\tcase 537: return Item::CookedPorkchop;\n\t\t\tcase 722: return Item::CookedRabbit;\n\t\t\tcase 576: return Item::CookedSalmon;\n\t\t\tcase 612: return Item::Cookie;\n\t\t\tcase 644: return Item::CowSpawnEgg;\n\t\t\tcase 201: return Item::CrackedStoneBricks;\n\t\t\tcase 152: return Item::CraftingTable;\n\t\t\tcase 707: return Item::CreeperHead;\n\t\t\tcase 645: return Item::CreeperSpawnEgg;\n\t\t\tcase 352: return Item::CutRedSandstone;\n\t\t\tcase 70: return Item::CutSandstone;\n\t\t\tcase 744: return Item::CyanBanner;\n\t\t\tcase 605: return Item::CyanBed;\n\t\t\tcase 291: return Item::CyanCarpet;\n\t\t\tcase 404: return Item::CyanConcrete;\n\t\t\tcase 420: return Item::CyanConcretePowder;\n\t\t\tcase 583: return Item::CyanDye;\n\t\t\tcase 388: return Item::CyanGlazedTerracotta;\n\t\t\tcase 372: return Item::CyanShulkerBox;\n\t\t\tcase 320: return Item::CyanStainedGlass;\n\t\t\tcase 336: return Item::CyanStainedGlassPane;\n\t\t\tcase 272: return Item::CyanTerracotta;\n\t\t\tcase 91: return Item::CyanWool;\n\t\t\tcase 249: return Item::DamagedAnvil;\n\t\t\tcase 98: return Item::Dandelion;\n\t\t\tcase 588: return Item::YellowDye;\n\t\t\tcase 768: return Item::DarkOakBoat;\n\t\t\tcase 246: return Item::DarkOakButton;\n\t\t\tcase 466: return Item::DarkOakDoor;\n\t\t\tcase 180: return Item::DarkOakFence;\n\t\t\tcase 215: return Item::DarkOakFenceGate;\n\t\t\tcase 61: return Item::DarkOakLeaves;\n\t\t\tcase 37: return Item::DarkOakLog;\n\t\t\tcase 18: return Item::DarkOakPlanks;\n\t\t\tcase 165: return Item::DarkOakPressurePlate;\n\t\t\tcase 24: return Item::DarkOakSapling;\n\t\t\tcase 117: return Item::DarkOakSlab;\n\t\t\tcase 302: return Item::DarkOakStairs;\n\t\t\tcase 192: return Item::DarkOakTrapdoor;\n\t\t\tcase 55: return Item::DarkOakWood;\n\t\t\tcase 345: return Item::DarkPrismarine;\n\t\t\tcase 130: return Item::DarkPrismarineSlab;\n\t\t\tcase 348: return Item::DarkPrismarineStairs;\n\t\t\tcase 253: return Item::DaylightDetector;\n\t\t\tcase 443: return Item::DeadBrainCoral;\n\t\t\tcase 429: return Item::DeadBrainCoralBlock;\n\t\t\tcase 454: return Item::DeadBrainCoralFan;\n\t\t\tcase 444: return Item::DeadBubbleCoral;\n\t\t\tcase 430: return Item::DeadBubbleCoralBlock;\n\t\t\tcase 455: return Item::DeadBubbleCoralFan;\n\t\t\tcase 78: return Item::DeadBush;\n\t\t\tcase 445: return Item::DeadFireCoral;\n\t\t\tcase 431: return Item::DeadFireCoralBlock;\n\t\t\tcase 456: return Item::DeadFireCoralFan;\n\t\t\tcase 446: return Item::DeadHornCoral;\n\t\t\tcase 432: return Item::DeadHornCoralBlock;\n\t\t\tcase 457: return Item::DeadHornCoralFan;\n\t\t\tcase 447: return Item::DeadTubeCoral;\n\t\t\tcase 428: return Item::DeadTubeCoralBlock;\n\t\t\tcase 453: return Item::DeadTubeCoralFan;\n\t\t\tcase 773: return Item::DebugStick;\n\t\t\tcase 73: return Item::DetectorRail;\n\t\t\tcase 481: return Item::Diamond;\n\t\t\tcase 496: return Item::DiamondAxe;\n\t\t\tcase 151: return Item::DiamondBlock;\n\t\t\tcase 530: return Item::DiamondBoots;\n\t\t\tcase 528: return Item::DiamondChestplate;\n\t\t\tcase 527: return Item::DiamondHelmet;\n\t\t\tcase 510: return Item::DiamondHoe;\n\t\t\tcase 729: return Item::DiamondHorseArmor;\n\t\t\tcase 529: return Item::DiamondLeggings;\n\t\t\tcase 150: return Item::DiamondOre;\n\t\t\tcase 495: return Item::DiamondPickaxe;\n\t\t\tcase 494: return Item::DiamondShovel;\n\t\t\tcase 493: return Item::DiamondSword;\n\t\t\tcase 4: return Item::Diorite;\n\t\t\tcase 9: return Item::Dirt;\n\t\t\tcase 67: return Item::Dispenser;\n\t\t\tcase 646: return Item::DolphinSpawnEgg;\n\t\t\tcase 647: return Item::DonkeySpawnEgg;\n\t\t\tcase 757: return Item::DragonBreath;\n\t\t\tcase 227: return Item::DragonEgg;\n\t\t\tcase 708: return Item::DragonHead;\n\t\t\tcase 616: return Item::DriedKelp;\n\t\t\tcase 560: return Item::DriedKelpBlock;\n\t\t\tcase 262: return Item::Dropper;\n\t\t\tcase 648: return Item::DrownedSpawnEgg;\n\t\t\tcase 566: return Item::Egg;\n\t\t\tcase 649: return Item::ElderGuardianSpawnEgg;\n\t\t\tcase 763: return Item::Elytra;\n\t\t\tcase 694: return Item::Emerald;\n\t\t\tcase 233: return Item::EmeraldBlock;\n\t\t\tcase 230: return Item::EmeraldOre;\n\t\t\tcase 714: return Item::EnchantedBook;\n\t\t\tcase 540: return Item::EnchantedGoldenApple;\n\t\t\tcase 223: return Item::EnchantingTable;\n\t\t\tcase 751: return Item::EndCrystal;\n\t\t\tcase 224: return Item::EndPortalFrame;\n\t\t\tcase 141: return Item::EndRod;\n\t\t\tcase 225: return Item::EndStone;\n\t\t\tcase 226: return Item::EndStoneBricks;\n\t\t\tcase 231: return Item::EnderChest;\n\t\t\tcase 637: return Item::EnderEye;\n\t\t\tcase 624: return Item::EnderPearl;\n\t\t\tcase 650: return Item::EndermanSpawnEgg;\n\t\t\tcase 651: return Item::EndermiteSpawnEgg;\n\t\t\tcase 652: return Item::EvokerSpawnEgg;\n\t\t\tcase 690: return Item::ExperienceBottle;\n\t\t\tcase 153: return Item::Farmland;\n\t\t\tcase 505: return Item::Feather;\n\t\t\tcase 632: return Item::FermentedSpiderEye;\n\t\t\tcase 77: return Item::Fern;\n\t\t\tcase 613: return Item::FilledMap;\n\t\t\tcase 691: return Item::FireCharge;\n\t\t\tcase 441: return Item::FireCoral;\n\t\t\tcase 436: return Item::FireCoralBlock;\n\t\t\tcase 451: return Item::FireCoralFan;\n\t\t\tcase 712: return Item::FireworkRocket;\n\t\t\tcase 713: return Item::FireworkStar;\n\t\t\tcase 568: return Item::FishingRod;\n\t\t\tcase 535: return Item::Flint;\n\t\t\tcase 475: return Item::FlintAndSteel;\n\t\t\tcase 696: return Item::FlowerPot;\n\t\t\tcase 154: return Item::Furnace;\n\t\t\tcase 565: return Item::FurnaceMinecart;\n\t\t\tcase 653: return Item::GhastSpawnEgg;\n\t\t\tcase 626: return Item::GhastTear;\n\t\t\tcase 64: return Item::Glass;\n\t\t\tcase 630: return Item::GlassBottle;\n\t\t\tcase 207: return Item::GlassPane;\n\t\t\tcase 638: return Item::GlisteringMelonSlice;\n\t\t\tcase 185: return Item::Glowstone;\n\t\t\tcase 570: return Item::GlowstoneDust;\n\t\t\tcase 110: return Item::GoldBlock;\n\t\t\tcase 483: return Item::GoldIngot;\n\t\t\tcase 627: return Item::GoldNugget;\n\t\t\tcase 29: return Item::GoldOre;\n\t\t\tcase 539: return Item::GoldenApple;\n\t\t\tcase 503: return Item::GoldenAxe;\n\t\t\tcase 534: return Item::GoldenBoots;\n\t\t\tcase 702: return Item::GoldenCarrot;\n\t\t\tcase 532: return Item::GoldenChestplate;\n\t\t\tcase 531: return Item::GoldenHelmet;\n\t\t\tcase 511: return Item::GoldenHoe;\n\t\t\tcase 728: return Item::GoldenHorseArmor;\n\t\t\tcase 533: return Item::GoldenLeggings;\n\t\t\tcase 502: return Item::GoldenPickaxe;\n\t\t\tcase 501: return Item::GoldenShovel;\n\t\t\tcase 500: return Item::GoldenSword;\n\t\t\tcase 2: return Item::Granite;\n\t\t\tcase 76: return Item::Grass;\n\t\t\tcase 8: return Item::GrassBlock;\n\t\t\tcase 304: return Item::GrassPath;\n\t\t\tcase 28: return Item::Gravel;\n\t\t\tcase 742: return Item::GrayBanner;\n\t\t\tcase 603: return Item::GrayBed;\n\t\t\tcase 289: return Item::GrayCarpet;\n\t\t\tcase 402: return Item::GrayConcrete;\n\t\t\tcase 418: return Item::GrayConcretePowder;\n\t\t\tcase 585: return Item::GrayDye;\n\t\t\tcase 386: return Item::GrayGlazedTerracotta;\n\t\t\tcase 370: return Item::GrayShulkerBox;\n\t\t\tcase 318: return Item::GrayStainedGlass;\n\t\t\tcase 334: return Item::GrayStainedGlassPane;\n\t\t\tcase 270: return Item::GrayTerracotta;\n\t\t\tcase 89: return Item::GrayWool;\n\t\t\tcase 748: return Item::GreenBanner;\n\t\t\tcase 609: return Item::GreenBed;\n\t\t\tcase 295: return Item::GreenCarpet;\n\t\t\tcase 408: return Item::GreenConcrete;\n\t\t\tcase 424: return Item::GreenConcretePowder;\n\t\t\tcase 392: return Item::GreenGlazedTerracotta;\n\t\t\tcase 376: return Item::GreenShulkerBox;\n\t\t\tcase 324: return Item::GreenStainedGlass;\n\t\t\tcase 340: return Item::GreenStainedGlassPane;\n\t\t\tcase 276: return Item::GreenTerracotta;\n\t\t\tcase 95: return Item::GreenWool;\n\t\t\tcase 654: return Item::GuardianSpawnEgg;\n\t\t\tcase 506: return Item::Gunpowder;\n\t\t\tcase 281: return Item::HayBale;\n\t\t\tcase 789: return Item::HeartOfTheSea;\n\t\t\tcase 252: return Item::HeavyWeightedPressurePlate;\n\t\t\tcase 256: return Item::Hopper;\n\t\t\tcase 718: return Item::HopperMinecart;\n\t\t\tcase 442: return Item::HornCoral;\n\t\t\tcase 437: return Item::HornCoralBlock;\n\t\t\tcase 452: return Item::HornCoralFan;\n\t\t\tcase 655: return Item::HorseSpawnEgg;\n\t\t\tcase 656: return Item::HuskSpawnEgg;\n\t\t\tcase 170: return Item::Ice;\n\t\t\tcase 198: return Item::InfestedChiseledStoneBricks;\n\t\t\tcase 194: return Item::InfestedCobblestone;\n\t\t\tcase 197: return Item::InfestedCrackedStoneBricks;\n\t\t\tcase 196: return Item::InfestedMossyStoneBricks;\n\t\t\tcase 193: return Item::InfestedStone;\n\t\t\tcase 195: return Item::InfestedStoneBricks;\n\t\t\tcase 577: return Item::InkSac;\n\t\t\tcase 474: return Item::IronAxe;\n\t\t\tcase 206: return Item::IronBars;\n\t\t\tcase 111: return Item::IronBlock;\n\t\t\tcase 526: return Item::IronBoots;\n\t\t\tcase 524: return Item::IronChestplate;\n\t\t\tcase 460: return Item::IronDoor;\n\t\t\tcase 523: return Item::IronHelmet;\n\t\t\tcase 509: return Item::IronHoe;\n\t\t\tcase 727: return Item::IronHorseArmor;\n\t\t\tcase 482: return Item::IronIngot;\n\t\t\tcase 525: return Item::IronLeggings;\n\t\t\tcase 771: return Item::IronNugget;\n\t\t\tcase 30: return Item::IronOre;\n\t\t\tcase 473: return Item::IronPickaxe;\n\t\t\tcase 472: return Item::IronShovel;\n\t\t\tcase 484: return Item::IronSword;\n\t\t\tcase 280: return Item::IronTrapdoor;\n\t\t\tcase 695: return Item::ItemFrame;\n\t\t\tcase 186: return Item::JackOLantern;\n\t\t\tcase 174: return Item::Jukebox;\n\t\t\tcase 766: return Item::JungleBoat;\n\t\t\tcase 244: return Item::JungleButton;\n\t\t\tcase 464: return Item::JungleDoor;\n\t\t\tcase 178: return Item::JungleFence;\n\t\t\tcase 213: return Item::JungleFenceGate;\n\t\t\tcase 59: return Item::JungleLeaves;\n\t\t\tcase 35: return Item::JungleLog;\n\t\t\tcase 16: return Item::JunglePlanks;\n\t\t\tcase 163: return Item::JunglePressurePlate;\n\t\t\tcase 22: return Item::JungleSapling;\n\t\t\tcase 115: return Item::JungleSlab;\n\t\t\tcase 236: return Item::JungleStairs;\n\t\t\tcase 190: return Item::JungleTrapdoor;\n\t\t\tcase 53: return Item::JungleWood;\n\t\t\tcase 559: return Item::Kelp;\n\t\t\tcase 772: return Item::KnowledgeBook;\n\t\t\tcase 155: return Item::Ladder;\n\t\t\tcase 66: return Item::LapisBlock;\n\t\t\tcase 581: return Item::LapisLazuli;\n\t\t\tcase 65: return Item::LapisOre;\n\t\t\tcase 310: return Item::LargeFern;\n\t\t\tcase 544: return Item::LavaBucket;\n\t\t\tcase 730: return Item::Lead;\n\t\t\tcase 550: return Item::Leather;\n\t\t\tcase 518: return Item::LeatherBoots;\n\t\t\tcase 516: return Item::LeatherChestplate;\n\t\t\tcase 515: return Item::LeatherHelmet;\n\t\t\tcase 517: return Item::LeatherLeggings;\n\t\t\tcase 158: return Item::Lever;\n\t\t\tcase 738: return Item::LightBlueBanner;\n\t\t\tcase 599: return Item::LightBlueBed;\n\t\t\tcase 285: return Item::LightBlueCarpet;\n\t\t\tcase 398: return Item::LightBlueConcrete;\n\t\t\tcase 414: return Item::LightBlueConcretePowder;\n\t\t\tcase 589: return Item::LightBlueDye;\n\t\t\tcase 382: return Item::LightBlueGlazedTerracotta;\n\t\t\tcase 366: return Item::LightBlueShulkerBox;\n\t\t\tcase 314: return Item::LightBlueStainedGlass;\n\t\t\tcase 330: return Item::LightBlueStainedGlassPane;\n\t\t\tcase 266: return Item::LightBlueTerracotta;\n\t\t\tcase 85: return Item::LightBlueWool;\n\t\t\tcase 743: return Item::LightGrayBanner;\n\t\t\tcase 604: return Item::LightGrayBed;\n\t\t\tcase 290: return Item::LightGrayCarpet;\n\t\t\tcase 403: return Item::LightGrayConcrete;\n\t\t\tcase 419: return Item::LightGrayConcretePowder;\n\t\t\tcase 584: return Item::LightGrayDye;\n\t\t\tcase 387: return Item::LightGrayGlazedTerracotta;\n\t\t\tcase 371: return Item::LightGrayShulkerBox;\n\t\t\tcase 319: return Item::LightGrayStainedGlass;\n\t\t\tcase 335: return Item::LightGrayStainedGlassPane;\n\t\t\tcase 271: return Item::LightGrayTerracotta;\n\t\t\tcase 90: return Item::LightGrayWool;\n\t\t\tcase 251: return Item::LightWeightedPressurePlate;\n\t\t\tcase 306: return Item::Lilac;\n\t\t\tcase 219: return Item::LilyPad;\n\t\t\tcase 740: return Item::LimeBanner;\n\t\t\tcase 601: return Item::LimeBed;\n\t\t\tcase 287: return Item::LimeCarpet;\n\t\t\tcase 400: return Item::LimeConcrete;\n\t\t\tcase 416: return Item::LimeConcretePowder;\n\t\t\tcase 587: return Item::LimeDye;\n\t\t\tcase 384: return Item::LimeGlazedTerracotta;\n\t\t\tcase 368: return Item::LimeShulkerBox;\n\t\t\tcase 316: return Item::LimeStainedGlass;\n\t\t\tcase 332: return Item::LimeStainedGlassPane;\n\t\t\tcase 268: return Item::LimeTerracotta;\n\t\t\tcase 87: return Item::LimeWool;\n\t\t\tcase 761: return Item::LingeringPotion;\n\t\t\tcase 657: return Item::LlamaSpawnEgg;\n\t\t\tcase 737: return Item::MagentaBanner;\n\t\t\tcase 598: return Item::MagentaBed;\n\t\t\tcase 284: return Item::MagentaCarpet;\n\t\t\tcase 397: return Item::MagentaConcrete;\n\t\t\tcase 413: return Item::MagentaConcretePowder;\n\t\t\tcase 590: return Item::MagentaDye;\n\t\t\tcase 381: return Item::MagentaGlazedTerracotta;\n\t\t\tcase 365: return Item::MagentaShulkerBox;\n\t\t\tcase 313: return Item::MagentaStainedGlass;\n\t\t\tcase 329: return Item::MagentaStainedGlassPane;\n\t\t\tcase 265: return Item::MagentaTerracotta;\n\t\t\tcase 84: return Item::MagentaWool;\n\t\t\tcase 356: return Item::MagmaBlock;\n\t\t\tcase 634: return Item::MagmaCream;\n\t\t\tcase 658: return Item::MagmaCubeSpawnEgg;\n\t\t\tcase 701: return Item::Map;\n\t\t\tcase 208: return Item::Melon;\n\t\t\tcase 618: return Item::MelonSeeds;\n\t\t\tcase 615: return Item::MelonSlice;\n\t\t\tcase 551: return Item::MilkBucket;\n\t\t\tcase 545: return Item::Minecart;\n\t\t\tcase 659: return Item::MooshroomSpawnEgg;\n\t\t\tcase 138: return Item::MossyCobblestone;\n\t\t\tcase 240: return Item::MossyCobblestoneWall;\n\t\t\tcase 200: return Item::MossyStoneBricks;\n\t\t\tcase 660: return Item::MuleSpawnEgg;\n\t\t\tcase 205: return Item::MushroomStem;\n\t\t\tcase 499: return Item::MushroomStew;\n\t\t\tcase 784: return Item::MusicDisc11;\n\t\t\tcase 774: return Item::MusicDisc13;\n\t\t\tcase 776: return Item::MusicDiscBlocks;\n\t\t\tcase 775: return Item::MusicDiscCat;\n\t\t\tcase 777: return Item::MusicDiscChirp;\n\t\t\tcase 778: return Item::MusicDiscFar;\n\t\t\tcase 779: return Item::MusicDiscMall;\n\t\t\tcase 780: return Item::MusicDiscMellohi;\n\t\t\tcase 781: return Item::MusicDiscStal;\n\t\t\tcase 782: return Item::MusicDiscStrad;\n\t\t\tcase 785: return Item::MusicDiscWait;\n\t\t\tcase 783: return Item::MusicDiscWard;\n\t\t\tcase 733: return Item::Mutton;\n\t\t\tcase 218: return Item::Mycelium;\n\t\t\tcase 731: return Item::NameTag;\n\t\t\tcase 788: return Item::NautilusShell;\n\t\t\tcase 715: return Item::NetherBrick;\n\t\t\tcase 221: return Item::NetherBrickFence;\n\t\t\tcase 124: return Item::NetherBrickSlab;\n\t\t\tcase 222: return Item::NetherBrickStairs;\n\t\t\tcase 220: return Item::NetherBricks;\n\t\t\tcase 255: return Item::NetherQuartzOre;\n\t\t\tcase 710: return Item::NetherStar;\n\t\t\tcase 628: return Item::NetherWart;\n\t\t\tcase 357: return Item::NetherWartBlock;\n\t\t\tcase 183: return Item::Netherrack;\n\t\t\tcase 71: return Item::NoteBlock;\n\t\t\tcase 549: return Item::OakBoat;\n\t\t\tcase 241: return Item::OakButton;\n\t\t\tcase 461: return Item::OakDoor;\n\t\t\tcase 175: return Item::OakFence;\n\t\t\tcase 210: return Item::OakFenceGate;\n\t\t\tcase 56: return Item::OakLeaves;\n\t\t\tcase 32: return Item::OakLog;\n\t\t\tcase 13: return Item::OakPlanks;\n\t\t\tcase 160: return Item::OakPressurePlate;\n\t\t\tcase 19: return Item::OakSapling;\n\t\t\tcase 112: return Item::OakSlab;\n\t\t\tcase 148: return Item::OakStairs;\n\t\t\tcase 187: return Item::OakTrapdoor;\n\t\t\tcase 50: return Item::OakWood;\n\t\t\tcase 361: return Item::Observer;\n\t\t\tcase 139: return Item::Obsidian;\n\t\t\tcase 661: return Item::OcelotSpawnEgg;\n\t\t\tcase 736: return Item::OrangeBanner;\n\t\t\tcase 597: return Item::OrangeBed;\n\t\t\tcase 283: return Item::OrangeCarpet;\n\t\t\tcase 396: return Item::OrangeConcrete;\n\t\t\tcase 412: return Item::OrangeConcretePowder;\n\t\t\tcase 591: return Item::OrangeDye;\n\t\t\tcase 380: return Item::OrangeGlazedTerracotta;\n\t\t\tcase 364: return Item::OrangeShulkerBox;\n\t\t\tcase 312: return Item::OrangeStainedGlass;\n\t\t\tcase 328: return Item::OrangeStainedGlassPane;\n\t\t\tcase 264: return Item::OrangeTerracotta;\n\t\t\tcase 104: return Item::OrangeTulip;\n\t\t\tcase 83: return Item::OrangeWool;\n\t\t\tcase 107: return Item::OxeyeDaisy;\n\t\t\tcase 300: return Item::PackedIce;\n\t\t\tcase 538: return Item::Painting;\n\t\t\tcase 561: return Item::Paper;\n\t\t\tcase 662: return Item::ParrotSpawnEgg;\n\t\t\tcase 308: return Item::Peony;\n\t\t\tcase 120: return Item::PetrifiedOakSlab;\n\t\t\tcase 787: return Item::PhantomMembrane;\n\t\t\tcase 663: return Item::PhantomSpawnEgg;\n\t\t\tcase 664: return Item::PigSpawnEgg;\n\t\t\tcase 741: return Item::PinkBanner;\n\t\t\tcase 602: return Item::PinkBed;\n\t\t\tcase 288: return Item::PinkCarpet;\n\t\t\tcase 401: return Item::PinkConcrete;\n\t\t\tcase 417: return Item::PinkConcretePowder;\n\t\t\tcase 586: return Item::PinkDye;\n\t\t\tcase 385: return Item::PinkGlazedTerracotta;\n\t\t\tcase 369: return Item::PinkShulkerBox;\n\t\t\tcase 317: return Item::PinkStainedGlass;\n\t\t\tcase 333: return Item::PinkStainedGlassPane;\n\t\t\tcase 269: return Item::PinkTerracotta;\n\t\t\tcase 106: return Item::PinkTulip;\n\t\t\tcase 88: return Item::PinkWool;\n\t\t\tcase 81: return Item::Piston;\n\t\t\tcase 705: return Item::PlayerHead;\n\t\t\tcase 11: return Item::Podzol;\n\t\t\tcase 700: return Item::PoisonousPotato;\n\t\t\tcase 665: return Item::PolarBearSpawnEgg;\n\t\t\tcase 7: return Item::PolishedAndesite;\n\t\t\tcase 5: return Item::PolishedDiorite;\n\t\t\tcase 3: return Item::PolishedGranite;\n\t\t\tcase 753: return Item::PoppedChorusFruit;\n\t\t\tcase 99: return Item::Poppy;\n\t\t\tcase 536: return Item::Porkchop;\n\t\t\tcase 698: return Item::Potato;\n\t\t\tcase 629: return Item::Potion;\n\t\t\tcase 72: return Item::PoweredRail;\n\t\t\tcase 343: return Item::Prismarine;\n\t\t\tcase 129: return Item::PrismarineBrickSlab;\n\t\t\tcase 347: return Item::PrismarineBrickStairs;\n\t\t\tcase 344: return Item::PrismarineBricks;\n\t\t\tcase 720: return Item::PrismarineCrystals;\n\t\t\tcase 719: return Item::PrismarineShard;\n\t\t\tcase 128: return Item::PrismarineSlab;\n\t\t\tcase 346: return Item::PrismarineStairs;\n\t\t\tcase 574: return Item::Pufferfish;\n\t\t\tcase 552: return Item::PufferfishBucket;\n\t\t\tcase 666: return Item::PufferfishSpawnEgg;\n\t\t\tcase 181: return Item::Pumpkin;\n\t\t\tcase 711: return Item::PumpkinPie;\n\t\t\tcase 617: return Item::PumpkinSeeds;\n\t\t\tcase 745: return Item::PurpleBanner;\n\t\t\tcase 606: return Item::PurpleBed;\n\t\t\tcase 292: return Item::PurpleCarpet;\n\t\t\tcase 405: return Item::PurpleConcrete;\n\t\t\tcase 421: return Item::PurpleConcretePowder;\n\t\t\tcase 582: return Item::PurpleDye;\n\t\t\tcase 389: return Item::PurpleGlazedTerracotta;\n\t\t\tcase 373: return Item::PurpleShulkerBox;\n\t\t\tcase 321: return Item::PurpleStainedGlass;\n\t\t\tcase 337: return Item::PurpleStainedGlassPane;\n\t\t\tcase 273: return Item::PurpleTerracotta;\n\t\t\tcase 92: return Item::PurpleWool;\n\t\t\tcase 144: return Item::PurpurBlock;\n\t\t\tcase 145: return Item::PurpurPillar;\n\t\t\tcase 127: return Item::PurpurSlab;\n\t\t\tcase 146: return Item::PurpurStairs;\n\t\t\tcase 716: return Item::Quartz;\n\t\t\tcase 258: return Item::QuartzBlock;\n\t\t\tcase 259: return Item::QuartzPillar;\n\t\t\tcase 125: return Item::QuartzSlab;\n\t\t\tcase 260: return Item::QuartzStairs;\n\t\t\tcase 721: return Item::Rabbit;\n\t\t\tcase 724: return Item::RabbitFoot;\n\t\t\tcase 725: return Item::RabbitHide;\n\t\t\tcase 667: return Item::RabbitSpawnEgg;\n\t\t\tcase 723: return Item::RabbitStew;\n\t\t\tcase 156: return Item::Rail;\n\t\t\tcase 749: return Item::RedBanner;\n\t\t\tcase 610: return Item::RedBed;\n\t\t\tcase 296: return Item::RedCarpet;\n\t\t\tcase 409: return Item::RedConcrete;\n\t\t\tcase 425: return Item::RedConcretePowder;\n\t\t\tcase 393: return Item::RedGlazedTerracotta;\n\t\t\tcase 109: return Item::RedMushroom;\n\t\t\tcase 204: return Item::RedMushroomBlock;\n\t\t\tcase 358: return Item::RedNetherBricks;\n\t\t\tcase 27: return Item::RedSand;\n\t\t\tcase 350: return Item::RedSandstone;\n\t\t\tcase 126: return Item::RedSandstoneSlab;\n\t\t\tcase 353: return Item::RedSandstoneStairs;\n\t\t\tcase 377: return Item::RedShulkerBox;\n\t\t\tcase 325: return Item::RedStainedGlass;\n\t\t\tcase 341: return Item::RedStainedGlassPane;\n\t\t\tcase 277: return Item::RedTerracotta;\n\t\t\tcase 103: return Item::RedTulip;\n\t\t\tcase 96: return Item::RedWool;\n\t\t\tcase 547: return Item::Redstone;\n\t\t\tcase 254: return Item::RedstoneBlock;\n\t\t\tcase 228: return Item::RedstoneLamp;\n\t\t\tcase 166: return Item::RedstoneOre;\n\t\t\tcase 167: return Item::RedstoneTorch;\n\t\t\tcase 467: return Item::Repeater;\n\t\t\tcase 354: return Item::RepeatingCommandBlock;\n\t\t\tcase 307: return Item::RoseBush;\n\t\t\tcase 578: return Item::RedDye;\n\t\t\tcase 623: return Item::RottenFlesh;\n\t\t\tcase 546: return Item::Saddle;\n\t\t\tcase 572: return Item::Salmon;\n\t\t\tcase 553: return Item::SalmonBucket;\n\t\t\tcase 668: return Item::SalmonSpawnEgg;\n\t\t\tcase 26: return Item::Sand;\n\t\t\tcase 68: return Item::Sandstone;\n\t\t\tcase 119: return Item::SandstoneSlab;\n\t\t\tcase 229: return Item::SandstoneStairs;\n\t\t\tcase 471: return Item::Scute;\n\t\t\tcase 349: return Item::SeaLantern;\n\t\t\tcase 80: return Item::SeaPickle;\n\t\t\tcase 79: return Item::Seagrass;\n\t\t\tcase 614: return Item::Shears;\n\t\t\tcase 669: return Item::SheepSpawnEgg;\n\t\t\tcase 762: return Item::Shield;\n\t\t\tcase 362: return Item::ShulkerBox;\n\t\t\tcase 770: return Item::ShulkerShell;\n\t\t\tcase 670: return Item::ShulkerSpawnEgg;\n\t\t\tcase 541: return Item::OakSign;\n\t\t\tcase 671: return Item::SilverfishSpawnEgg;\n\t\t\tcase 673: return Item::SkeletonHorseSpawnEgg;\n\t\t\tcase 703: return Item::SkeletonSkull;\n\t\t\tcase 672: return Item::SkeletonSpawnEgg;\n\t\t\tcase 563: return Item::SlimeBall;\n\t\t\tcase 303: return Item::SlimeBlock;\n\t\t\tcase 674: return Item::SlimeSpawnEgg;\n\t\t\tcase 131: return Item::SmoothQuartz;\n\t\t\tcase 132: return Item::SmoothRedSandstone;\n\t\t\tcase 133: return Item::SmoothSandstone;\n\t\t\tcase 134: return Item::SmoothStone;\n\t\t\tcase 169: return Item::Snow;\n\t\t\tcase 171: return Item::SnowBlock;\n\t\t\tcase 548: return Item::Snowball;\n\t\t\tcase 184: return Item::SoulSand;\n\t\t\tcase 147: return Item::Spawner;\n\t\t\tcase 759: return Item::SpectralArrow;\n\t\t\tcase 631: return Item::SpiderEye;\n\t\t\tcase 675: return Item::SpiderSpawnEgg;\n\t\t\tcase 758: return Item::SplashPotion;\n\t\t\tcase 62: return Item::Sponge;\n\t\t\tcase 764: return Item::SpruceBoat;\n\t\t\tcase 242: return Item::SpruceButton;\n\t\t\tcase 462: return Item::SpruceDoor;\n\t\t\tcase 176: return Item::SpruceFence;\n\t\t\tcase 211: return Item::SpruceFenceGate;\n\t\t\tcase 57: return Item::SpruceLeaves;\n\t\t\tcase 33: return Item::SpruceLog;\n\t\t\tcase 14: return Item::SprucePlanks;\n\t\t\tcase 161: return Item::SprucePressurePlate;\n\t\t\tcase 20: return Item::SpruceSapling;\n\t\t\tcase 113: return Item::SpruceSlab;\n\t\t\tcase 234: return Item::SpruceStairs;\n\t\t\tcase 188: return Item::SpruceTrapdoor;\n\t\t\tcase 51: return Item::SpruceWood;\n\t\t\tcase 676: return Item::SquidSpawnEgg;\n\t\t\tcase 497: return Item::Stick;\n\t\t\tcase 74: return Item::StickyPiston;\n\t\t\tcase 1: return Item::Stone;\n\t\t\tcase 492: return Item::StoneAxe;\n\t\t\tcase 123: return Item::StoneBrickSlab;\n\t\t\tcase 217: return Item::StoneBrickStairs;\n\t\t\tcase 199: return Item::StoneBricks;\n\t\t\tcase 168: return Item::StoneButton;\n\t\t\tcase 508: return Item::StoneHoe;\n\t\t\tcase 491: return Item::StonePickaxe;\n\t\t\tcase 159: return Item::StonePressurePlate;\n\t\t\tcase 490: return Item::StoneShovel;\n\t\t\tcase 118: return Item::StoneSlab;\n\t\t\tcase 489: return Item::StoneSword;\n\t\t\tcase 677: return Item::StraySpawnEgg;\n\t\t\tcase 504: return Item::String;\n\t\t\tcase 42: return Item::StrippedAcaciaLog;\n\t\t\tcase 48: return Item::StrippedAcaciaWood;\n\t\t\tcase 40: return Item::StrippedBirchLog;\n\t\t\tcase 46: return Item::StrippedBirchWood;\n\t\t\tcase 43: return Item::StrippedDarkOakLog;\n\t\t\tcase 49: return Item::StrippedDarkOakWood;\n\t\t\tcase 41: return Item::StrippedJungleLog;\n\t\t\tcase 47: return Item::StrippedJungleWood;\n\t\t\tcase 38: return Item::StrippedOakLog;\n\t\t\tcase 44: return Item::StrippedOakWood;\n\t\t\tcase 39: return Item::StrippedSpruceLog;\n\t\t\tcase 45: return Item::StrippedSpruceWood;\n\t\t\tcase 469: return Item::StructureBlock;\n\t\t\tcase 360: return Item::StructureVoid;\n\t\t\tcase 594: return Item::Sugar;\n\t\t\tcase 558: return Item::SugarCane;\n\t\t\tcase 305: return Item::Sunflower;\n\t\t\tcase 309: return Item::TallGrass;\n\t\t\tcase 298: return Item::Terracotta;\n\t\t\tcase 760: return Item::TippedArrow;\n\t\t\tcase 136: return Item::TNT;\n\t\t\tcase 717: return Item::TNTMinecart;\n\t\t\tcase 140: return Item::Torch;\n\t\t\tcase 769: return Item::TotemOfUndying;\n\t\t\tcase 250: return Item::TrappedChest;\n\t\t\tcase 786: return Item::Trident;\n\t\t\tcase 232: return Item::TripwireHook;\n\t\t\tcase 573: return Item::TropicalFish;\n\t\t\tcase 555: return Item::TropicalFishBucket;\n\t\t\tcase 678: return Item::TropicalFishSpawnEgg;\n\t\t\tcase 438: return Item::TubeCoral;\n\t\t\tcase 433: return Item::TubeCoralBlock;\n\t\t\tcase 448: return Item::TubeCoralFan;\n\t\t\tcase 427: return Item::TurtleEgg;\n\t\t\tcase 470: return Item::TurtleHelmet;\n\t\t\tcase 679: return Item::TurtleSpawnEgg;\n\t\t\tcase 680: return Item::VexSpawnEgg;\n\t\t\tcase 681: return Item::VillagerSpawnEgg;\n\t\t\tcase 682: return Item::VindicatorSpawnEgg;\n\t\t\tcase 209: return Item::Vine;\n\t\t\tcase 543: return Item::WaterBucket;\n\t\t\tcase 63: return Item::WetSponge;\n\t\t\tcase 513: return Item::Wheat;\n\t\t\tcase 512: return Item::WheatSeeds;\n\t\t\tcase 735: return Item::WhiteBanner;\n\t\t\tcase 596: return Item::WhiteBed;\n\t\t\tcase 282: return Item::WhiteCarpet;\n\t\t\tcase 395: return Item::WhiteConcrete;\n\t\t\tcase 411: return Item::WhiteConcretePowder;\n\t\t\tcase 379: return Item::WhiteGlazedTerracotta;\n\t\t\tcase 363: return Item::WhiteShulkerBox;\n\t\t\tcase 311: return Item::WhiteStainedGlass;\n\t\t\tcase 327: return Item::WhiteStainedGlassPane;\n\t\t\tcase 263: return Item::WhiteTerracotta;\n\t\t\tcase 105: return Item::WhiteTulip;\n\t\t\tcase 82: return Item::WhiteWool;\n\t\t\tcase 683: return Item::WitchSpawnEgg;\n\t\t\tcase 704: return Item::WitherSkeletonSkull;\n\t\t\tcase 684: return Item::WitherSkeletonSpawnEgg;\n\t\t\tcase 685: return Item::WolfSpawnEgg;\n\t\t\tcase 488: return Item::WoodenAxe;\n\t\t\tcase 507: return Item::WoodenHoe;\n\t\t\tcase 487: return Item::WoodenPickaxe;\n\t\t\tcase 486: return Item::WoodenShovel;\n\t\t\tcase 485: return Item::WoodenSword;\n\t\t\tcase 692: return Item::WritableBook;\n\t\t\tcase 693: return Item::WrittenBook;\n\t\t\tcase 739: return Item::YellowBanner;\n\t\t\tcase 600: return Item::YellowBed;\n\t\t\tcase 286: return Item::YellowCarpet;\n\t\t\tcase 399: return Item::YellowConcrete;\n\t\t\tcase 415: return Item::YellowConcretePowder;\n\t\t\tcase 383: return Item::YellowGlazedTerracotta;\n\t\t\tcase 367: return Item::YellowShulkerBox;\n\t\t\tcase 315: return Item::YellowStainedGlass;\n\t\t\tcase 331: return Item::YellowStainedGlassPane;\n\t\t\tcase 267: return Item::YellowTerracotta;\n\t\t\tcase 86: return Item::YellowWool;\n\t\t\tcase 706: return Item::ZombieHead;\n\t\t\tcase 687: return Item::ZombieHorseSpawnEgg;\n\t\t\tcase 688: return Item::ZombiePigmanSpawnEgg;\n\t\t\tcase 686: return Item::ZombieSpawnEgg;\n\t\t\tcase 689: return Item::ZombieVillagerSpawnEgg;\n\t\t\tdefault: return Item::Air;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_13_1.h",
    "content": "#pragma once\n\n#include \"BlockState.h\"\n#include \"Registries/Items.h\"\n#include \"Registries/CustomStatistics.h\"\n\nnamespace Palette_1_13_1\n{\n\tUInt32 From(BlockState Block);\n\tUInt32 From(Item ID);\n\tUInt32 From(CustomStatistic ID);\n\tItem ToItem(UInt32 ID);\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_14.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"Palette_1_14.h\"\n#include \"Registries/BlockStates.h\"\n\nnamespace Palette_1_14\n{\n\tUInt32 From(const BlockState Block)\n\t{\n\t\tusing namespace Block;\n\n\t\tswitch (Block.ID)\n\t\t{\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5906;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5907;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5908;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5909;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5910;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5911;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5912;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5913;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5914;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5915;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5916;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5917;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5918;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5919;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5920;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5921;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5922;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5923;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5924;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5925;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5926;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5927;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5928;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5929;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8394;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8395;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8396;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8397;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8398;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8399;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8400;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8401;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8402;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8403;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8404;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8405;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8406;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8407;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8408;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8409;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8410;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8411;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8412;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8413;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8414;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8415;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8416;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8417;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8418;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8419;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8420;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8421;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8422;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8423;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8424;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8425;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8426;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8427;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8428;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8429;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8430;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8431;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8432;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8433;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8434;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8435;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8436;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8437;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8438;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8439;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8440;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8441;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8442;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8443;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8444;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8445;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8446;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8447;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8448;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8449;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8450;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8451;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8452;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8453;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8454;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8455;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8456;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8457;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, true).ID: return 8140;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, false).ID: return 8141;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, true).ID: return 8144;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, false).ID: return 8145;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, true).ID: return 8148;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, false).ID: return 8149;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, true).ID: return 8152;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, false).ID: return 8153;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, true).ID: return 8156;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, false).ID: return 8157;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, true).ID: return 8160;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, false).ID: return 8161;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, true).ID: return 8164;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, false).ID: return 8165;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, true).ID: return 8168;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, false).ID: return 8169;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7978;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7979;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7980;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7981;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7982;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7983;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7984;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7985;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7986;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7987;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7988;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7989;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7990;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7991;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7992;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7993;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7994;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7995;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7996;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7997;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7998;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7999;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8000;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8001;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8002;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8003;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8004;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8005;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8006;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8007;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8008;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8009;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, true).ID: return 200;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, false).ID: return 201;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, true).ID: return 202;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, false).ID: return 203;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, true).ID: return 204;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, false).ID: return 205;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, true).ID: return 206;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, false).ID: return 207;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, true).ID: return 208;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, false).ID: return 209;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, true).ID: return 210;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, false).ID: return 211;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, true).ID: return 212;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, false).ID: return 213;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::X).ID: return 84;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Y).ID: return 85;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Z).ID: return 86;\n\t\t\tcase AcaciaPlanks::AcaciaPlanks().ID: return 19;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(true).ID: return 3879;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(false).ID: return 3880;\n\t\t\tcase AcaciaSapling::AcaciaSapling(0).ID: return 29;\n\t\t\tcase AcaciaSapling::AcaciaSapling(1).ID: return 30;\n\t\t\tcase AcaciaSign::AcaciaSign(0).ID: return 3476;\n\t\t\tcase AcaciaSign::AcaciaSign(1).ID: return 3478;\n\t\t\tcase AcaciaSign::AcaciaSign(2).ID: return 3480;\n\t\t\tcase AcaciaSign::AcaciaSign(3).ID: return 3482;\n\t\t\tcase AcaciaSign::AcaciaSign(4).ID: return 3484;\n\t\t\tcase AcaciaSign::AcaciaSign(5).ID: return 3486;\n\t\t\tcase AcaciaSign::AcaciaSign(6).ID: return 3488;\n\t\t\tcase AcaciaSign::AcaciaSign(7).ID: return 3490;\n\t\t\tcase AcaciaSign::AcaciaSign(8).ID: return 3492;\n\t\t\tcase AcaciaSign::AcaciaSign(9).ID: return 3494;\n\t\t\tcase AcaciaSign::AcaciaSign(10).ID: return 3496;\n\t\t\tcase AcaciaSign::AcaciaSign(11).ID: return 3498;\n\t\t\tcase AcaciaSign::AcaciaSign(12).ID: return 3500;\n\t\t\tcase AcaciaSign::AcaciaSign(13).ID: return 3502;\n\t\t\tcase AcaciaSign::AcaciaSign(14).ID: return 3504;\n\t\t\tcase AcaciaSign::AcaciaSign(15).ID: return 3506;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Top).ID: return 7789;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Bottom).ID: return 7791;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Double).ID: return 7793;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6840;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6842;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6844;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6846;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6848;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6850;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6852;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6854;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6856;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6858;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6860;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6862;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6864;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6866;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6868;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6870;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6872;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6874;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6876;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6878;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6880;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6882;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6884;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6886;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6888;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6890;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6892;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6894;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6896;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6898;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6900;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6902;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6904;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6906;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6908;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6910;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6912;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6914;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6916;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6918;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, true).ID: return 4354;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, false).ID: return 4356;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, true).ID: return 4358;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, false).ID: return 4360;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4362;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4364;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4366;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4368;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, true).ID: return 4370;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, false).ID: return 4372;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, true).ID: return 4374;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, false).ID: return 4376;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4378;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4380;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4382;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4384;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, true).ID: return 4386;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, false).ID: return 4388;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, true).ID: return 4390;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, false).ID: return 4392;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4394;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4396;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4398;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4400;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, true).ID: return 4402;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, false).ID: return 4404;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, true).ID: return 4406;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, false).ID: return 4408;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4410;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4412;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4414;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4416;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3758;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3760;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3762;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3764;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::X).ID: return 120;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Y).ID: return 121;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Z).ID: return 122;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::NorthSouth).ID: return 6287;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::EastWest).ID: return 6288;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingEast).ID: return 6289;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingWest).ID: return 6290;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingNorth).ID: return 6291;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingSouth).ID: return 6292;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::NorthSouth).ID: return 6293;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::EastWest).ID: return 6294;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingEast).ID: return 6295;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingWest).ID: return 6296;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingNorth).ID: return 6297;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingSouth).ID: return 6298;\n\t\t\tcase Air::Air().ID: return -0;\n\t\t\tcase Allium::Allium().ID: return 1414;\n\t\t\tcase Andesite::Andesite().ID: return 6;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Top).ID: return 10308;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Bottom).ID: return 10310;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Double).ID: return 10312;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 9934;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 9936;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 9938;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 9940;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 9942;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 9944;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 9946;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 9948;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 9950;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 9952;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 9954;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 9956;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 9958;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 9960;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 9962;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 9964;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 9966;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 9968;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 9970;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 9972;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 9974;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 9976;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 9978;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 9980;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 9982;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 9984;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 9986;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 9988;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 9990;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 9992;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 9994;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 9996;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 9998;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 10000;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 10002;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 10004;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 10006;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 10008;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 10010;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 10012;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 10781;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 10782;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 10785;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 10786;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 10789;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 10790;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 10793;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 10794;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 10797;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 10798;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 10801;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 10802;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 10805;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 10806;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 10809;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 10810;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 10813;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 10814;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 10817;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 10818;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 10821;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 10822;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 10825;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 10826;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 10829;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 10830;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 10833;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 10834;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 10837;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 10838;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 10841;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 10842;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6074;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6075;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XM).ID: return 6076;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XP).ID: return 6077;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4752;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4753;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XM).ID: return 4754;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XP).ID: return 4755;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4748;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4749;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XM).ID: return 4750;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XP).ID: return 4751;\n\t\t\tcase AzureBluet::AzureBluet().ID: return 1415;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::None, 0).ID: return 9116;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::None, 1).ID: return 9117;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Small, 0).ID: return 9118;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Small, 1).ID: return 9119;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Large, 0).ID: return 9120;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Large, 1).ID: return 9121;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::None, 0).ID: return 9122;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::None, 1).ID: return 9123;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Small, 0).ID: return 9124;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Small, 1).ID: return 9125;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Large, 0).ID: return 9126;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Large, 1).ID: return 9127;\n\t\t\tcase BambooSapling::BambooSapling().ID: return 9115;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZM, true).ID: return 11135;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZM, false).ID: return 11136;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XP, true).ID: return 11137;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XP, false).ID: return 11138;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZP, true).ID: return 11139;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZP, false).ID: return 11140;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XM, true).ID: return 11141;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XM, false).ID: return 11142;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YP, true).ID: return 11143;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YP, false).ID: return 11144;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YM, true).ID: return 11145;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YM, false).ID: return 11146;\n\t\t\tcase Barrier::Barrier().ID: return 7000;\n\t\t\tcase Beacon::Beacon().ID: return 5640;\n\t\t\tcase Bedrock::Bedrock().ID: return 33;\n\t\t\tcase Beetroots::Beetroots(0).ID: return 8683;\n\t\t\tcase Beetroots::Beetroots(1).ID: return 8684;\n\t\t\tcase Beetroots::Beetroots(2).ID: return 8685;\n\t\t\tcase Beetroots::Beetroots(3).ID: return 8686;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 11198;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 11199;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 11200;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 11201;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 11202;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 11203;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 11204;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 11205;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 11206;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 11207;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XM, false).ID: return 11208;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XP, false).ID: return 11209;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 11210;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 11211;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XM, false).ID: return 11212;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XP, false).ID: return 11213;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5858;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5859;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5860;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5861;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5862;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5863;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5864;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5865;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5866;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5867;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5868;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5869;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5870;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5871;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5872;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5873;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5874;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5875;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5876;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5877;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5878;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5879;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5880;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5881;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8266;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8267;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8268;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8269;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8270;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8271;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8272;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8273;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8274;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8275;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8276;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8277;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8278;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8279;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8280;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8281;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8282;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8283;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8284;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8285;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8286;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8287;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8288;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8289;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8290;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8291;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8292;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8293;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8294;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8295;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8296;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8297;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8298;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8299;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8300;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8301;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8302;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8303;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8304;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8305;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8306;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8307;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8308;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8309;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8310;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8311;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8312;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8313;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8314;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8315;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8316;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8317;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8318;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8319;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8320;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8321;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8322;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8323;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8324;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8325;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8326;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8327;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8328;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8329;\n\t\t\tcase BirchFence::BirchFence(true, true, true, true).ID: return 8076;\n\t\t\tcase BirchFence::BirchFence(true, true, true, false).ID: return 8077;\n\t\t\tcase BirchFence::BirchFence(true, true, false, true).ID: return 8080;\n\t\t\tcase BirchFence::BirchFence(true, true, false, false).ID: return 8081;\n\t\t\tcase BirchFence::BirchFence(true, false, true, true).ID: return 8084;\n\t\t\tcase BirchFence::BirchFence(true, false, true, false).ID: return 8085;\n\t\t\tcase BirchFence::BirchFence(true, false, false, true).ID: return 8088;\n\t\t\tcase BirchFence::BirchFence(true, false, false, false).ID: return 8089;\n\t\t\tcase BirchFence::BirchFence(false, true, true, true).ID: return 8092;\n\t\t\tcase BirchFence::BirchFence(false, true, true, false).ID: return 8093;\n\t\t\tcase BirchFence::BirchFence(false, true, false, true).ID: return 8096;\n\t\t\tcase BirchFence::BirchFence(false, true, false, false).ID: return 8097;\n\t\t\tcase BirchFence::BirchFence(false, false, true, true).ID: return 8100;\n\t\t\tcase BirchFence::BirchFence(false, false, true, false).ID: return 8101;\n\t\t\tcase BirchFence::BirchFence(false, false, false, true).ID: return 8104;\n\t\t\tcase BirchFence::BirchFence(false, false, false, false).ID: return 8105;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7914;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7915;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7916;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7917;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7918;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7919;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7920;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7921;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7922;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7923;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7924;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7925;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7926;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7927;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7928;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7929;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7930;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7931;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7932;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7933;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7934;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7935;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7936;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7937;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7938;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7939;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7940;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7941;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7942;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7943;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7944;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7945;\n\t\t\tcase BirchLeaves::BirchLeaves(1, true).ID: return 172;\n\t\t\tcase BirchLeaves::BirchLeaves(1, false).ID: return 173;\n\t\t\tcase BirchLeaves::BirchLeaves(2, true).ID: return 174;\n\t\t\tcase BirchLeaves::BirchLeaves(2, false).ID: return 175;\n\t\t\tcase BirchLeaves::BirchLeaves(3, true).ID: return 176;\n\t\t\tcase BirchLeaves::BirchLeaves(3, false).ID: return 177;\n\t\t\tcase BirchLeaves::BirchLeaves(4, true).ID: return 178;\n\t\t\tcase BirchLeaves::BirchLeaves(4, false).ID: return 179;\n\t\t\tcase BirchLeaves::BirchLeaves(5, true).ID: return 180;\n\t\t\tcase BirchLeaves::BirchLeaves(5, false).ID: return 181;\n\t\t\tcase BirchLeaves::BirchLeaves(6, true).ID: return 182;\n\t\t\tcase BirchLeaves::BirchLeaves(6, false).ID: return 183;\n\t\t\tcase BirchLeaves::BirchLeaves(7, true).ID: return 184;\n\t\t\tcase BirchLeaves::BirchLeaves(7, false).ID: return 185;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::X).ID: return 78;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Y).ID: return 79;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Z).ID: return 80;\n\t\t\tcase BirchPlanks::BirchPlanks().ID: return 17;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(true).ID: return 3875;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(false).ID: return 3876;\n\t\t\tcase BirchSapling::BirchSapling(0).ID: return 25;\n\t\t\tcase BirchSapling::BirchSapling(1).ID: return 26;\n\t\t\tcase BirchSign::BirchSign(0).ID: return 3444;\n\t\t\tcase BirchSign::BirchSign(1).ID: return 3446;\n\t\t\tcase BirchSign::BirchSign(2).ID: return 3448;\n\t\t\tcase BirchSign::BirchSign(3).ID: return 3450;\n\t\t\tcase BirchSign::BirchSign(4).ID: return 3452;\n\t\t\tcase BirchSign::BirchSign(5).ID: return 3454;\n\t\t\tcase BirchSign::BirchSign(6).ID: return 3456;\n\t\t\tcase BirchSign::BirchSign(7).ID: return 3458;\n\t\t\tcase BirchSign::BirchSign(8).ID: return 3460;\n\t\t\tcase BirchSign::BirchSign(9).ID: return 3462;\n\t\t\tcase BirchSign::BirchSign(10).ID: return 3464;\n\t\t\tcase BirchSign::BirchSign(11).ID: return 3466;\n\t\t\tcase BirchSign::BirchSign(12).ID: return 3468;\n\t\t\tcase BirchSign::BirchSign(13).ID: return 3470;\n\t\t\tcase BirchSign::BirchSign(14).ID: return 3472;\n\t\t\tcase BirchSign::BirchSign(15).ID: return 3474;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Top).ID: return 7777;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Bottom).ID: return 7779;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Double).ID: return 7781;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5469;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5471;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5473;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5475;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5477;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5479;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5481;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5483;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5485;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5487;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5489;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5491;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5493;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5495;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5497;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5499;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5501;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5503;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5505;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5507;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5509;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5511;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5513;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5515;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5517;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5519;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5521;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5523;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5525;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5527;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5529;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5531;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5533;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5535;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5537;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5539;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5541;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5543;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5545;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5547;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, true).ID: return 4226;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, false).ID: return 4228;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, true).ID: return 4230;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, false).ID: return 4232;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, true).ID: return 4234;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, false).ID: return 4236;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, true).ID: return 4238;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, false).ID: return 4240;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, true).ID: return 4242;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, false).ID: return 4244;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, true).ID: return 4246;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, false).ID: return 4248;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, true).ID: return 4250;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, false).ID: return 4252;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, true).ID: return 4254;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, false).ID: return 4256;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, true).ID: return 4258;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, false).ID: return 4260;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, true).ID: return 4262;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, false).ID: return 4264;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, true).ID: return 4266;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, false).ID: return 4268;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, true).ID: return 4270;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, false).ID: return 4272;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, true).ID: return 4274;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, false).ID: return 4276;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, true).ID: return 4278;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, false).ID: return 4280;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, true).ID: return 4282;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, false).ID: return 4284;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, true).ID: return 4286;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, false).ID: return 4288;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3750;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3752;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3754;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3756;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::X).ID: return 114;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Y).ID: return 115;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Z).ID: return 116;\n\t\t\tcase BlackBanner::BlackBanner(0).ID: return 7601;\n\t\t\tcase BlackBanner::BlackBanner(1).ID: return 7602;\n\t\t\tcase BlackBanner::BlackBanner(2).ID: return 7603;\n\t\t\tcase BlackBanner::BlackBanner(3).ID: return 7604;\n\t\t\tcase BlackBanner::BlackBanner(4).ID: return 7605;\n\t\t\tcase BlackBanner::BlackBanner(5).ID: return 7606;\n\t\t\tcase BlackBanner::BlackBanner(6).ID: return 7607;\n\t\t\tcase BlackBanner::BlackBanner(7).ID: return 7608;\n\t\t\tcase BlackBanner::BlackBanner(8).ID: return 7609;\n\t\t\tcase BlackBanner::BlackBanner(9).ID: return 7610;\n\t\t\tcase BlackBanner::BlackBanner(10).ID: return 7611;\n\t\t\tcase BlackBanner::BlackBanner(11).ID: return 7612;\n\t\t\tcase BlackBanner::BlackBanner(12).ID: return 7613;\n\t\t\tcase BlackBanner::BlackBanner(13).ID: return 7614;\n\t\t\tcase BlackBanner::BlackBanner(14).ID: return 7615;\n\t\t\tcase BlackBanner::BlackBanner(15).ID: return 7616;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Head).ID: return 1288;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Foot).ID: return 1289;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Head).ID: return 1290;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Foot).ID: return 1291;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Head).ID: return 1292;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Foot).ID: return 1293;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Head).ID: return 1294;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Foot).ID: return 1295;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Head).ID: return 1296;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Foot).ID: return 1297;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Head).ID: return 1298;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Foot).ID: return 1299;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Head).ID: return 1300;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Foot).ID: return 1301;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Head).ID: return 1302;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Foot).ID: return 1303;\n\t\t\tcase BlackCarpet::BlackCarpet().ID: return 7345;\n\t\t\tcase BlackConcrete::BlackConcrete().ID: return 8917;\n\t\t\tcase BlackConcretePowder::BlackConcretePowder().ID: return 8933;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8898;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8899;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8900;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8901;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8832;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8833;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8834;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8835;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8836;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8837;\n\t\t\tcase BlackStainedGlass::BlackStainedGlass().ID: return 4096;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, true).ID: return 6809;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, false).ID: return 6810;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, true).ID: return 6813;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, false).ID: return 6814;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, true).ID: return 6817;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, false).ID: return 6818;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, true).ID: return 6821;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, false).ID: return 6822;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, true).ID: return 6825;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, false).ID: return 6826;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, true).ID: return 6829;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, false).ID: return 6830;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, true).ID: return 6833;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, false).ID: return 6834;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, true).ID: return 6837;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, false).ID: return 6838;\n\t\t\tcase BlackTerracotta::BlackTerracotta().ID: return 6326;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7677;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7678;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7679;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7680;\n\t\t\tcase BlackWool::BlackWool().ID: return 1398;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZM, true).ID: return 11155;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZM, false).ID: return 11156;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZP, true).ID: return 11157;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZP, false).ID: return 11158;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XM, true).ID: return 11159;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XM, false).ID: return 11160;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XP, true).ID: return 11161;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XP, false).ID: return 11162;\n\t\t\tcase BlueBanner::BlueBanner(0).ID: return 7537;\n\t\t\tcase BlueBanner::BlueBanner(1).ID: return 7538;\n\t\t\tcase BlueBanner::BlueBanner(2).ID: return 7539;\n\t\t\tcase BlueBanner::BlueBanner(3).ID: return 7540;\n\t\t\tcase BlueBanner::BlueBanner(4).ID: return 7541;\n\t\t\tcase BlueBanner::BlueBanner(5).ID: return 7542;\n\t\t\tcase BlueBanner::BlueBanner(6).ID: return 7543;\n\t\t\tcase BlueBanner::BlueBanner(7).ID: return 7544;\n\t\t\tcase BlueBanner::BlueBanner(8).ID: return 7545;\n\t\t\tcase BlueBanner::BlueBanner(9).ID: return 7546;\n\t\t\tcase BlueBanner::BlueBanner(10).ID: return 7547;\n\t\t\tcase BlueBanner::BlueBanner(11).ID: return 7548;\n\t\t\tcase BlueBanner::BlueBanner(12).ID: return 7549;\n\t\t\tcase BlueBanner::BlueBanner(13).ID: return 7550;\n\t\t\tcase BlueBanner::BlueBanner(14).ID: return 7551;\n\t\t\tcase BlueBanner::BlueBanner(15).ID: return 7552;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Head).ID: return 1224;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Foot).ID: return 1225;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Head).ID: return 1226;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Foot).ID: return 1227;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Head).ID: return 1228;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Foot).ID: return 1229;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Head).ID: return 1230;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Foot).ID: return 1231;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Head).ID: return 1232;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Foot).ID: return 1233;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Head).ID: return 1234;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Foot).ID: return 1235;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Head).ID: return 1236;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Foot).ID: return 1237;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Head).ID: return 1238;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Foot).ID: return 1239;\n\t\t\tcase BlueCarpet::BlueCarpet().ID: return 7341;\n\t\t\tcase BlueConcrete::BlueConcrete().ID: return 8913;\n\t\t\tcase BlueConcretePowder::BlueConcretePowder().ID: return 8929;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8882;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8883;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8884;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8885;\n\t\t\tcase BlueIce::BlueIce().ID: return 9112;\n\t\t\tcase BlueOrchid::BlueOrchid().ID: return 1413;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8808;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8809;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8810;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8811;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8812;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8813;\n\t\t\tcase BlueStainedGlass::BlueStainedGlass().ID: return 4092;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, true).ID: return 6681;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, false).ID: return 6682;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, true).ID: return 6685;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, false).ID: return 6686;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, true).ID: return 6689;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, false).ID: return 6690;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, true).ID: return 6693;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, false).ID: return 6694;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, true).ID: return 6697;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, false).ID: return 6698;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, true).ID: return 6701;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, false).ID: return 6702;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, true).ID: return 6705;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, false).ID: return 6706;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, true).ID: return 6709;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, false).ID: return 6710;\n\t\t\tcase BlueTerracotta::BlueTerracotta().ID: return 6322;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7661;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7662;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7663;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7664;\n\t\t\tcase BlueWool::BlueWool().ID: return 1394;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::X).ID: return 8720;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Y).ID: return 8721;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Z).ID: return 8722;\n\t\t\tcase Bookshelf::Bookshelf().ID: return 1431;\n\t\t\tcase BrainCoral::BrainCoral().ID: return 8997;\n\t\t\tcase BrainCoralBlock::BrainCoralBlock().ID: return 8980;\n\t\t\tcase BrainCoralFan::BrainCoralFan().ID: return 9017;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9073;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9075;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9077;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9079;\n\t\t\tcase BrewingStand::BrewingStand(true, true, true).ID: return 5117;\n\t\t\tcase BrewingStand::BrewingStand(true, true, false).ID: return 5118;\n\t\t\tcase BrewingStand::BrewingStand(true, false, true).ID: return 5119;\n\t\t\tcase BrewingStand::BrewingStand(true, false, false).ID: return 5120;\n\t\t\tcase BrewingStand::BrewingStand(false, true, true).ID: return 5121;\n\t\t\tcase BrewingStand::BrewingStand(false, true, false).ID: return 5122;\n\t\t\tcase BrewingStand::BrewingStand(false, false, true).ID: return 5123;\n\t\t\tcase BrewingStand::BrewingStand(false, false, false).ID: return 5124;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Top).ID: return 7837;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Bottom).ID: return 7839;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Double).ID: return 7841;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4837;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4839;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4841;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4843;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4845;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4847;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4849;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4851;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4853;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4855;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4857;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4859;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4861;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4863;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4865;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4867;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4869;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4871;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4873;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4875;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4877;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4879;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4881;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4883;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4885;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4887;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4889;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4891;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4893;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4895;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4897;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4899;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4901;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4903;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4905;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4907;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4909;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4911;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4913;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4915;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10333;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10334;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10337;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10338;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10341;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::None).ID: return 10342;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10345;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::None).ID: return 10346;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10349;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10350;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10353;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10354;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10357;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::None).ID: return 10358;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10361;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::None).ID: return 10362;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10365;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10366;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10369;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10370;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10373;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::None).ID: return 10374;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10377;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::None).ID: return 10378;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10381;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10382;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10385;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10386;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10389;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::None).ID: return 10390;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10393;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::None).ID: return 10394;\n\t\t\tcase Bricks::Bricks().ID: return 1428;\n\t\t\tcase BrownBanner::BrownBanner(0).ID: return 7553;\n\t\t\tcase BrownBanner::BrownBanner(1).ID: return 7554;\n\t\t\tcase BrownBanner::BrownBanner(2).ID: return 7555;\n\t\t\tcase BrownBanner::BrownBanner(3).ID: return 7556;\n\t\t\tcase BrownBanner::BrownBanner(4).ID: return 7557;\n\t\t\tcase BrownBanner::BrownBanner(5).ID: return 7558;\n\t\t\tcase BrownBanner::BrownBanner(6).ID: return 7559;\n\t\t\tcase BrownBanner::BrownBanner(7).ID: return 7560;\n\t\t\tcase BrownBanner::BrownBanner(8).ID: return 7561;\n\t\t\tcase BrownBanner::BrownBanner(9).ID: return 7562;\n\t\t\tcase BrownBanner::BrownBanner(10).ID: return 7563;\n\t\t\tcase BrownBanner::BrownBanner(11).ID: return 7564;\n\t\t\tcase BrownBanner::BrownBanner(12).ID: return 7565;\n\t\t\tcase BrownBanner::BrownBanner(13).ID: return 7566;\n\t\t\tcase BrownBanner::BrownBanner(14).ID: return 7567;\n\t\t\tcase BrownBanner::BrownBanner(15).ID: return 7568;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Head).ID: return 1240;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Foot).ID: return 1241;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Head).ID: return 1242;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Foot).ID: return 1243;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Head).ID: return 1244;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Foot).ID: return 1245;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Head).ID: return 1246;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Foot).ID: return 1247;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Head).ID: return 1248;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Foot).ID: return 1249;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Head).ID: return 1250;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Foot).ID: return 1251;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Head).ID: return 1252;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Foot).ID: return 1253;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Head).ID: return 1254;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Foot).ID: return 1255;\n\t\t\tcase BrownCarpet::BrownCarpet().ID: return 7342;\n\t\t\tcase BrownConcrete::BrownConcrete().ID: return 8914;\n\t\t\tcase BrownConcretePowder::BrownConcretePowder().ID: return 8930;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8886;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8887;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8888;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8889;\n\t\t\tcase BrownMushroom::BrownMushroom().ID: return 1424;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, true).ID: return 4491;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, false).ID: return 4492;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, true).ID: return 4493;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, false).ID: return 4494;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, true).ID: return 4495;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, false).ID: return 4496;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, true).ID: return 4497;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, false).ID: return 4498;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, true).ID: return 4499;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, false).ID: return 4500;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, true).ID: return 4501;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, false).ID: return 4502;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, true).ID: return 4503;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, false).ID: return 4504;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, true).ID: return 4505;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, false).ID: return 4506;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, true).ID: return 4507;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, false).ID: return 4508;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, true).ID: return 4509;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, false).ID: return 4510;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, true).ID: return 4511;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, false).ID: return 4512;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, true).ID: return 4513;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, false).ID: return 4514;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, true).ID: return 4515;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, false).ID: return 4516;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, true).ID: return 4517;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, false).ID: return 4518;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, true).ID: return 4519;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, false).ID: return 4520;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, true).ID: return 4521;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, false).ID: return 4522;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, true).ID: return 4523;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, false).ID: return 4524;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, true).ID: return 4525;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, false).ID: return 4526;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, true).ID: return 4527;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, false).ID: return 4528;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, true).ID: return 4529;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, false).ID: return 4530;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, true).ID: return 4531;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, false).ID: return 4532;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, true).ID: return 4533;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, false).ID: return 4534;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, true).ID: return 4535;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, false).ID: return 4536;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, true).ID: return 4537;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, false).ID: return 4538;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, true).ID: return 4539;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, false).ID: return 4540;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, true).ID: return 4541;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, false).ID: return 4542;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, true).ID: return 4543;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, false).ID: return 4544;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, true).ID: return 4545;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, false).ID: return 4546;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, true).ID: return 4547;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, false).ID: return 4548;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, true).ID: return 4549;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, false).ID: return 4550;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, true).ID: return 4551;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, false).ID: return 4552;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, true).ID: return 4553;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false).ID: return 4554;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8814;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8815;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8816;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8817;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8818;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8819;\n\t\t\tcase BrownStainedGlass::BrownStainedGlass().ID: return 4093;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, true).ID: return 6713;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, false).ID: return 6714;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, true).ID: return 6717;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, false).ID: return 6718;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, true).ID: return 6721;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, false).ID: return 6722;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, true).ID: return 6725;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, false).ID: return 6726;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, true).ID: return 6729;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, false).ID: return 6730;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, true).ID: return 6733;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, false).ID: return 6734;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, true).ID: return 6737;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, false).ID: return 6738;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, true).ID: return 6741;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, false).ID: return 6742;\n\t\t\tcase BrownTerracotta::BrownTerracotta().ID: return 6323;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7665;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7666;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7667;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7668;\n\t\t\tcase BrownWool::BrownWool().ID: return 1395;\n\t\t\tcase BubbleColumn::BubbleColumn(true).ID: return 9131;\n\t\t\tcase BubbleColumn::BubbleColumn(false).ID: return 9132;\n\t\t\tcase BubbleCoral::BubbleCoral().ID: return 8999;\n\t\t\tcase BubbleCoralBlock::BubbleCoralBlock().ID: return 8981;\n\t\t\tcase BubbleCoralFan::BubbleCoralFan().ID: return 9019;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9081;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9083;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9085;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9087;\n\t\t\tcase Cactus::Cactus(0).ID: return 3929;\n\t\t\tcase Cactus::Cactus(1).ID: return 3930;\n\t\t\tcase Cactus::Cactus(2).ID: return 3931;\n\t\t\tcase Cactus::Cactus(3).ID: return 3932;\n\t\t\tcase Cactus::Cactus(4).ID: return 3933;\n\t\t\tcase Cactus::Cactus(5).ID: return 3934;\n\t\t\tcase Cactus::Cactus(6).ID: return 3935;\n\t\t\tcase Cactus::Cactus(7).ID: return 3936;\n\t\t\tcase Cactus::Cactus(8).ID: return 3937;\n\t\t\tcase Cactus::Cactus(9).ID: return 3938;\n\t\t\tcase Cactus::Cactus(10).ID: return 3939;\n\t\t\tcase Cactus::Cactus(11).ID: return 3940;\n\t\t\tcase Cactus::Cactus(12).ID: return 3941;\n\t\t\tcase Cactus::Cactus(13).ID: return 3942;\n\t\t\tcase Cactus::Cactus(14).ID: return 3943;\n\t\t\tcase Cactus::Cactus(15).ID: return 3944;\n\t\t\tcase Cake::Cake(0).ID: return 4010;\n\t\t\tcase Cake::Cake(1).ID: return 4011;\n\t\t\tcase Cake::Cake(2).ID: return 4012;\n\t\t\tcase Cake::Cake(3).ID: return 4013;\n\t\t\tcase Cake::Cake(4).ID: return 4014;\n\t\t\tcase Cake::Cake(5).ID: return 4015;\n\t\t\tcase Cake::Cake(6).ID: return 4016;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 11217;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 11219;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 11221;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 11223;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 11225;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 11227;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 11229;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 11231;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, true, true).ID: return 11233;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, true, false).ID: return 11235;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, false, true).ID: return 11237;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, false, false).ID: return 11239;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, true, true).ID: return 11241;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, true, false).ID: return 11243;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, false, true).ID: return 11245;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, false, false).ID: return 11247;\n\t\t\tcase Carrots::Carrots(0).ID: return 5794;\n\t\t\tcase Carrots::Carrots(1).ID: return 5795;\n\t\t\tcase Carrots::Carrots(2).ID: return 5796;\n\t\t\tcase Carrots::Carrots(3).ID: return 5797;\n\t\t\tcase Carrots::Carrots(4).ID: return 5798;\n\t\t\tcase Carrots::Carrots(5).ID: return 5799;\n\t\t\tcase Carrots::Carrots(6).ID: return 5800;\n\t\t\tcase Carrots::Carrots(7).ID: return 5801;\n\t\t\tcase CartographyTable::CartographyTable().ID: return 11163;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZM).ID: return 4002;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZP).ID: return 4003;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XM).ID: return 4004;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XP).ID: return 4005;\n\t\t\tcase Cauldron::Cauldron(0).ID: return 5125;\n\t\t\tcase Cauldron::Cauldron(1).ID: return 5126;\n\t\t\tcase Cauldron::Cauldron(2).ID: return 5127;\n\t\t\tcase Cauldron::Cauldron(3).ID: return 5128;\n\t\t\tcase CaveAir::CaveAir().ID: return 9130;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 8701;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 8702;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 8703;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 8704;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 8705;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 8706;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 8707;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 8708;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 8709;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 8710;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 8711;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 8712;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Single).ID: return 2033;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Left).ID: return 2035;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Right).ID: return 2037;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Single).ID: return 2039;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Left).ID: return 2041;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Right).ID: return 2043;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Single).ID: return 2045;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Left).ID: return 2047;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Right).ID: return 2049;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Single).ID: return 2051;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Left).ID: return 2053;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Right).ID: return 2055;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6078;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6079;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 6080;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 6081;\n\t\t\tcase ChiseledQuartzBlock::ChiseledQuartzBlock().ID: return 6203;\n\t\t\tcase ChiseledRedSandstone::ChiseledRedSandstone().ID: return 7682;\n\t\t\tcase ChiseledSandstone::ChiseledSandstone().ID: return 246;\n\t\t\tcase ChiseledStoneBricks::ChiseledStoneBricks().ID: return 4484;\n\t\t\tcase ChorusFlower::ChorusFlower(0).ID: return 8592;\n\t\t\tcase ChorusFlower::ChorusFlower(1).ID: return 8593;\n\t\t\tcase ChorusFlower::ChorusFlower(2).ID: return 8594;\n\t\t\tcase ChorusFlower::ChorusFlower(3).ID: return 8595;\n\t\t\tcase ChorusFlower::ChorusFlower(4).ID: return 8596;\n\t\t\tcase ChorusFlower::ChorusFlower(5).ID: return 8597;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, true).ID: return 8528;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, false).ID: return 8529;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, true).ID: return 8530;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, false).ID: return 8531;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, true).ID: return 8532;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, false).ID: return 8533;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, true).ID: return 8534;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, false).ID: return 8535;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, true).ID: return 8536;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, false).ID: return 8537;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, true).ID: return 8538;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, false).ID: return 8539;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, true).ID: return 8540;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, false).ID: return 8541;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, true).ID: return 8542;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, false).ID: return 8543;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, true).ID: return 8544;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, false).ID: return 8545;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, true).ID: return 8546;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, false).ID: return 8547;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, true).ID: return 8548;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, false).ID: return 8549;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, true).ID: return 8550;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, false).ID: return 8551;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, true).ID: return 8552;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, false).ID: return 8553;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, true).ID: return 8554;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, false).ID: return 8555;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, true).ID: return 8556;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, false).ID: return 8557;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, true).ID: return 8558;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, false).ID: return 8559;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, true).ID: return 8560;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, false).ID: return 8561;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, true).ID: return 8562;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, false).ID: return 8563;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, true).ID: return 8564;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, false).ID: return 8565;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, true).ID: return 8566;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, false).ID: return 8567;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, true).ID: return 8568;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, false).ID: return 8569;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, true).ID: return 8570;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, false).ID: return 8571;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, true).ID: return 8572;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, false).ID: return 8573;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, true).ID: return 8574;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, false).ID: return 8575;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, true).ID: return 8576;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, false).ID: return 8577;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, true).ID: return 8578;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, false).ID: return 8579;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, true).ID: return 8580;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, false).ID: return 8581;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, true).ID: return 8582;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, false).ID: return 8583;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, true).ID: return 8584;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, false).ID: return 8585;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, true).ID: return 8586;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, false).ID: return 8587;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, true).ID: return 8588;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, false).ID: return 8589;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, true).ID: return 8590;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, false).ID: return 8591;\n\t\t\tcase Clay::Clay().ID: return 3945;\n\t\t\tcase CoalBlock::CoalBlock().ID: return 7347;\n\t\t\tcase CoalOre::CoalOre().ID: return 71;\n\t\t\tcase CoarseDirt::CoarseDirt().ID: return 11;\n\t\t\tcase Cobblestone::Cobblestone().ID: return 14;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Top).ID: return 7831;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Bottom).ID: return 7833;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Double).ID: return 7835;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3654;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3656;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3658;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3660;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3662;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3664;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3666;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3668;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3670;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3672;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3674;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3676;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3678;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3680;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3682;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3684;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3686;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3688;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3690;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3692;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3694;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3696;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3698;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3700;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3702;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3704;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3706;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3708;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3710;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3712;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3714;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3716;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3718;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3720;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3722;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3724;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3726;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3728;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3730;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3732;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5643;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5644;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5647;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5648;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5651;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5652;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5655;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5656;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5659;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5660;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5663;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5664;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5667;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5668;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5671;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5672;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5675;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5676;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5679;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5680;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5683;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5684;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5687;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5688;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5691;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5692;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5695;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5696;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5699;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5700;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5703;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5704;\n\t\t\tcase Cobweb::Cobweb().ID: return 1340;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZM).ID: return 5142;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZP).ID: return 5143;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XM).ID: return 5144;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XP).ID: return 5145;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZM).ID: return 5146;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZP).ID: return 5147;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XM).ID: return 5148;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XP).ID: return 5149;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZM).ID: return 5150;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZP).ID: return 5151;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XM).ID: return 5152;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XP).ID: return 5153;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5628;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 5629;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5630;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 5631;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 5632;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 5633;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5634;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 5635;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5636;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 5637;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 5638;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 5639;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, true).ID: return 6142;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, false).ID: return 6143;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, true).ID: return 6144;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, false).ID: return 6145;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, true).ID: return 6146;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, false).ID: return 6147;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, true).ID: return 6148;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, false).ID: return 6149;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, true).ID: return 6150;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, false).ID: return 6151;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, true).ID: return 6152;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, false).ID: return 6153;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, true).ID: return 6154;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, false).ID: return 6155;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, true).ID: return 6156;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, false).ID: return 6157;\n\t\t\tcase Composter::Composter(0).ID: return 11262;\n\t\t\tcase Composter::Composter(1).ID: return 11263;\n\t\t\tcase Composter::Composter(2).ID: return 11264;\n\t\t\tcase Composter::Composter(3).ID: return 11265;\n\t\t\tcase Composter::Composter(4).ID: return 11266;\n\t\t\tcase Composter::Composter(5).ID: return 11267;\n\t\t\tcase Composter::Composter(6).ID: return 11268;\n\t\t\tcase Composter::Composter(7).ID: return 11269;\n\t\t\tcase Composter::Composter(8).ID: return 11270;\n\t\t\tcase Conduit::Conduit().ID: return 9114;\n\t\t\tcase Cornflower::Cornflower().ID: return 1421;\n\t\t\tcase CrackedStoneBricks::CrackedStoneBricks().ID: return 4483;\n\t\t\tcase CraftingTable::CraftingTable().ID: return 3354;\n\t\t\tcase CreeperHead::CreeperHead(0).ID: return 6034;\n\t\t\tcase CreeperHead::CreeperHead(1).ID: return 6035;\n\t\t\tcase CreeperHead::CreeperHead(2).ID: return 6036;\n\t\t\tcase CreeperHead::CreeperHead(3).ID: return 6037;\n\t\t\tcase CreeperHead::CreeperHead(4).ID: return 6038;\n\t\t\tcase CreeperHead::CreeperHead(5).ID: return 6039;\n\t\t\tcase CreeperHead::CreeperHead(6).ID: return 6040;\n\t\t\tcase CreeperHead::CreeperHead(7).ID: return 6041;\n\t\t\tcase CreeperHead::CreeperHead(8).ID: return 6042;\n\t\t\tcase CreeperHead::CreeperHead(9).ID: return 6043;\n\t\t\tcase CreeperHead::CreeperHead(10).ID: return 6044;\n\t\t\tcase CreeperHead::CreeperHead(11).ID: return 6045;\n\t\t\tcase CreeperHead::CreeperHead(12).ID: return 6046;\n\t\t\tcase CreeperHead::CreeperHead(13).ID: return 6047;\n\t\t\tcase CreeperHead::CreeperHead(14).ID: return 6048;\n\t\t\tcase CreeperHead::CreeperHead(15).ID: return 6049;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6050;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6051;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6052;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6053;\n\t\t\tcase CutRedSandstone::CutRedSandstone().ID: return 7683;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Top).ID: return 7867;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Bottom).ID: return 7869;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Double).ID: return 7871;\n\t\t\tcase CutSandstone::CutSandstone().ID: return 247;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Top).ID: return 7819;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Bottom).ID: return 7821;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Double).ID: return 7823;\n\t\t\tcase CyanBanner::CyanBanner(0).ID: return 7505;\n\t\t\tcase CyanBanner::CyanBanner(1).ID: return 7506;\n\t\t\tcase CyanBanner::CyanBanner(2).ID: return 7507;\n\t\t\tcase CyanBanner::CyanBanner(3).ID: return 7508;\n\t\t\tcase CyanBanner::CyanBanner(4).ID: return 7509;\n\t\t\tcase CyanBanner::CyanBanner(5).ID: return 7510;\n\t\t\tcase CyanBanner::CyanBanner(6).ID: return 7511;\n\t\t\tcase CyanBanner::CyanBanner(7).ID: return 7512;\n\t\t\tcase CyanBanner::CyanBanner(8).ID: return 7513;\n\t\t\tcase CyanBanner::CyanBanner(9).ID: return 7514;\n\t\t\tcase CyanBanner::CyanBanner(10).ID: return 7515;\n\t\t\tcase CyanBanner::CyanBanner(11).ID: return 7516;\n\t\t\tcase CyanBanner::CyanBanner(12).ID: return 7517;\n\t\t\tcase CyanBanner::CyanBanner(13).ID: return 7518;\n\t\t\tcase CyanBanner::CyanBanner(14).ID: return 7519;\n\t\t\tcase CyanBanner::CyanBanner(15).ID: return 7520;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Head).ID: return 1192;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Foot).ID: return 1193;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Head).ID: return 1194;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Foot).ID: return 1195;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Head).ID: return 1196;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Foot).ID: return 1197;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Head).ID: return 1198;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Foot).ID: return 1199;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Head).ID: return 1200;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Foot).ID: return 1201;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Head).ID: return 1202;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Foot).ID: return 1203;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Head).ID: return 1204;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Foot).ID: return 1205;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Head).ID: return 1206;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Foot).ID: return 1207;\n\t\t\tcase CyanCarpet::CyanCarpet().ID: return 7339;\n\t\t\tcase CyanConcrete::CyanConcrete().ID: return 8911;\n\t\t\tcase CyanConcretePowder::CyanConcretePowder().ID: return 8927;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8874;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8875;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8876;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8877;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8796;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8797;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8798;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8799;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8800;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8801;\n\t\t\tcase CyanStainedGlass::CyanStainedGlass().ID: return 4090;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, true).ID: return 6617;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, false).ID: return 6618;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, true).ID: return 6621;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, false).ID: return 6622;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, true).ID: return 6625;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, false).ID: return 6626;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, true).ID: return 6629;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, false).ID: return 6630;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, true).ID: return 6633;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, false).ID: return 6634;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, true).ID: return 6637;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, false).ID: return 6638;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, true).ID: return 6641;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, false).ID: return 6642;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, true).ID: return 6645;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, false).ID: return 6646;\n\t\t\tcase CyanTerracotta::CyanTerracotta().ID: return 6320;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7653;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7654;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7655;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7656;\n\t\t\tcase CyanWool::CyanWool().ID: return 1392;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6082;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6083;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 6084;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 6085;\n\t\t\tcase Dandelion::Dandelion().ID: return 1411;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5930;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5931;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5932;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5933;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5934;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5935;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5936;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5937;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5938;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5939;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5940;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5941;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5942;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5943;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5944;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5945;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5946;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5947;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5948;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5949;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5950;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5951;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5952;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5953;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8458;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8459;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8460;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8461;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8462;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8463;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 8464;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 8465;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 8466;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 8467;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 8468;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 8469;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 8470;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 8471;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 8472;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 8473;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8474;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8475;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8476;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8477;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8478;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8479;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 8480;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 8481;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 8482;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 8483;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 8484;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 8485;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 8486;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 8487;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 8488;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 8489;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8490;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8491;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8492;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8493;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8494;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8495;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 8496;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 8497;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 8498;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 8499;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 8500;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 8501;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 8502;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 8503;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 8504;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 8505;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8506;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8507;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8508;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8509;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8510;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8511;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 8512;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 8513;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 8514;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 8515;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 8516;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 8517;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 8518;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 8519;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 8520;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 8521;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, true).ID: return 8172;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, false).ID: return 8173;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, true).ID: return 8176;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, false).ID: return 8177;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, true).ID: return 8180;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, false).ID: return 8181;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, true).ID: return 8184;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, false).ID: return 8185;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, true).ID: return 8188;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, false).ID: return 8189;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, true).ID: return 8192;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, false).ID: return 8193;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, true).ID: return 8196;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, false).ID: return 8197;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, true).ID: return 8200;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, false).ID: return 8201;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 8010;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 8011;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 8012;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 8013;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 8014;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 8015;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 8016;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 8017;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 8018;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 8019;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 8020;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 8021;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 8022;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 8023;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 8024;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 8025;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 8026;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 8027;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 8028;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 8029;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 8030;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 8031;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8032;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8033;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8034;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8035;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8036;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8037;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8038;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8039;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8040;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8041;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, true).ID: return 214;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, false).ID: return 215;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, true).ID: return 216;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, false).ID: return 217;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, true).ID: return 218;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, false).ID: return 219;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, true).ID: return 220;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, false).ID: return 221;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, true).ID: return 222;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, false).ID: return 223;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, true).ID: return 224;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, false).ID: return 225;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, true).ID: return 226;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, false).ID: return 227;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::X).ID: return 87;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Y).ID: return 88;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Z).ID: return 89;\n\t\t\tcase DarkOakPlanks::DarkOakPlanks().ID: return 20;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(true).ID: return 3881;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(false).ID: return 3882;\n\t\t\tcase DarkOakSapling::DarkOakSapling(0).ID: return 31;\n\t\t\tcase DarkOakSapling::DarkOakSapling(1).ID: return 32;\n\t\t\tcase DarkOakSign::DarkOakSign(0).ID: return 3540;\n\t\t\tcase DarkOakSign::DarkOakSign(1).ID: return 3542;\n\t\t\tcase DarkOakSign::DarkOakSign(2).ID: return 3544;\n\t\t\tcase DarkOakSign::DarkOakSign(3).ID: return 3546;\n\t\t\tcase DarkOakSign::DarkOakSign(4).ID: return 3548;\n\t\t\tcase DarkOakSign::DarkOakSign(5).ID: return 3550;\n\t\t\tcase DarkOakSign::DarkOakSign(6).ID: return 3552;\n\t\t\tcase DarkOakSign::DarkOakSign(7).ID: return 3554;\n\t\t\tcase DarkOakSign::DarkOakSign(8).ID: return 3556;\n\t\t\tcase DarkOakSign::DarkOakSign(9).ID: return 3558;\n\t\t\tcase DarkOakSign::DarkOakSign(10).ID: return 3560;\n\t\t\tcase DarkOakSign::DarkOakSign(11).ID: return 3562;\n\t\t\tcase DarkOakSign::DarkOakSign(12).ID: return 3564;\n\t\t\tcase DarkOakSign::DarkOakSign(13).ID: return 3566;\n\t\t\tcase DarkOakSign::DarkOakSign(14).ID: return 3568;\n\t\t\tcase DarkOakSign::DarkOakSign(15).ID: return 3570;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Top).ID: return 7795;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Bottom).ID: return 7797;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Double).ID: return 7799;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6920;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6922;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6924;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6926;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6928;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6930;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6932;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6934;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6936;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6938;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6940;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6942;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6944;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6946;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6948;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6950;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6952;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6954;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6956;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6958;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6960;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6962;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6964;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6966;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6968;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6970;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6972;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6974;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6976;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6978;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6980;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6982;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6984;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6986;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6988;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6990;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6992;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6994;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6996;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6998;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, true).ID: return 4418;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, false).ID: return 4420;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, true).ID: return 4422;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, false).ID: return 4424;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4426;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4428;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4430;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4432;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, true).ID: return 4434;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, false).ID: return 4436;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, true).ID: return 4438;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, false).ID: return 4440;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4442;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4444;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4446;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4448;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, true).ID: return 4450;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, false).ID: return 4452;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, true).ID: return 4454;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, false).ID: return 4456;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4458;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4460;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4462;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4464;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, true).ID: return 4466;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, false).ID: return 4468;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, true).ID: return 4470;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, false).ID: return 4472;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4474;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4476;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4478;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4480;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3774;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3776;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3778;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3780;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::X).ID: return 123;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Y).ID: return 124;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Z).ID: return 125;\n\t\t\tcase DarkPrismarine::DarkPrismarine().ID: return 7067;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Top).ID: return 7321;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Bottom).ID: return 7323;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Double).ID: return 7325;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7229;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7231;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7233;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7235;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7237;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7239;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7241;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7243;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7245;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7247;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7249;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7251;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7253;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7255;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7257;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7259;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7261;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7263;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7265;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7267;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7269;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7271;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7273;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7275;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7277;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7279;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7281;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7283;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7285;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7287;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7289;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7291;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7293;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7295;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7297;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7299;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7301;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7303;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7305;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7307;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 0).ID: return 6158;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 1).ID: return 6159;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 2).ID: return 6160;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 3).ID: return 6161;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 4).ID: return 6162;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 5).ID: return 6163;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 6).ID: return 6164;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 7).ID: return 6165;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 8).ID: return 6166;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 9).ID: return 6167;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 10).ID: return 6168;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 11).ID: return 6169;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 12).ID: return 6170;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 13).ID: return 6171;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 14).ID: return 6172;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 15).ID: return 6173;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 0).ID: return 6174;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 1).ID: return 6175;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 2).ID: return 6176;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 3).ID: return 6177;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 4).ID: return 6178;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 5).ID: return 6179;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 6).ID: return 6180;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 7).ID: return 6181;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 8).ID: return 6182;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 9).ID: return 6183;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 10).ID: return 6184;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 11).ID: return 6185;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 12).ID: return 6186;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 13).ID: return 6187;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 14).ID: return 6188;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 15).ID: return 6189;\n\t\t\tcase DeadBrainCoral::DeadBrainCoral().ID: return 8987;\n\t\t\tcase DeadBrainCoralBlock::DeadBrainCoralBlock().ID: return 8975;\n\t\t\tcase DeadBrainCoralFan::DeadBrainCoralFan().ID: return 9007;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9033;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9035;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9037;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9039;\n\t\t\tcase DeadBubbleCoral::DeadBubbleCoral().ID: return 8989;\n\t\t\tcase DeadBubbleCoralBlock::DeadBubbleCoralBlock().ID: return 8976;\n\t\t\tcase DeadBubbleCoralFan::DeadBubbleCoralFan().ID: return 9009;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9041;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9043;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9045;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9047;\n\t\t\tcase DeadBush::DeadBush().ID: return 1343;\n\t\t\tcase DeadFireCoral::DeadFireCoral().ID: return 8991;\n\t\t\tcase DeadFireCoralBlock::DeadFireCoralBlock().ID: return 8977;\n\t\t\tcase DeadFireCoralFan::DeadFireCoralFan().ID: return 9011;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9049;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9051;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9053;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9055;\n\t\t\tcase DeadHornCoral::DeadHornCoral().ID: return 8993;\n\t\t\tcase DeadHornCoralBlock::DeadHornCoralBlock().ID: return 8978;\n\t\t\tcase DeadHornCoralFan::DeadHornCoralFan().ID: return 9013;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9057;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9059;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9061;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9063;\n\t\t\tcase DeadTubeCoral::DeadTubeCoral().ID: return 8985;\n\t\t\tcase DeadTubeCoralBlock::DeadTubeCoralBlock().ID: return 8974;\n\t\t\tcase DeadTubeCoralFan::DeadTubeCoralFan().ID: return 9005;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9025;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9027;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9029;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9031;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::NorthSouth).ID: return 1316;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::EastWest).ID: return 1317;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingEast).ID: return 1318;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingWest).ID: return 1319;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingNorth).ID: return 1320;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingSouth).ID: return 1321;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::NorthSouth).ID: return 1322;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::EastWest).ID: return 1323;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingEast).ID: return 1324;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingWest).ID: return 1325;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingNorth).ID: return 1326;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingSouth).ID: return 1327;\n\t\t\tcase DiamondBlock::DiamondBlock().ID: return 3353;\n\t\t\tcase DiamondOre::DiamondOre().ID: return 3352;\n\t\t\tcase Diorite::Diorite().ID: return 4;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Top).ID: return 10326;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Bottom).ID: return 10328;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Double).ID: return 10330;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10174;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10176;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10178;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10180;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10182;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10184;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10186;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10188;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10190;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10192;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10194;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10196;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10198;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10200;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10202;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10204;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10206;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10208;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10210;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10212;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10214;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10216;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10218;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10220;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10222;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10224;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10226;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10228;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10230;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10232;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10234;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10236;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10238;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10240;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10242;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10244;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10246;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10248;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10250;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10252;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 11037;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 11038;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 11041;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 11042;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 11045;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 11046;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 11049;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 11050;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 11053;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 11054;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 11057;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 11058;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 11061;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 11062;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 11065;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 11066;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 11069;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 11070;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 11073;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 11074;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 11077;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 11078;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 11081;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 11082;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 11085;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 11086;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 11089;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 11090;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 11093;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 11094;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 11097;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 11098;\n\t\t\tcase Dirt::Dirt().ID: return 10;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, true).ID: return 233;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, false).ID: return 234;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, true).ID: return 235;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, false).ID: return 236;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, true).ID: return 237;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, false).ID: return 238;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, true).ID: return 239;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, false).ID: return 240;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, true).ID: return 241;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, false).ID: return 242;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, true).ID: return 243;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, false).ID: return 244;\n\t\t\tcase DragonEgg::DragonEgg().ID: return 5139;\n\t\t\tcase DragonHead::DragonHead(0).ID: return 6054;\n\t\t\tcase DragonHead::DragonHead(1).ID: return 6055;\n\t\t\tcase DragonHead::DragonHead(2).ID: return 6056;\n\t\t\tcase DragonHead::DragonHead(3).ID: return 6057;\n\t\t\tcase DragonHead::DragonHead(4).ID: return 6058;\n\t\t\tcase DragonHead::DragonHead(5).ID: return 6059;\n\t\t\tcase DragonHead::DragonHead(6).ID: return 6060;\n\t\t\tcase DragonHead::DragonHead(7).ID: return 6061;\n\t\t\tcase DragonHead::DragonHead(8).ID: return 6062;\n\t\t\tcase DragonHead::DragonHead(9).ID: return 6063;\n\t\t\tcase DragonHead::DragonHead(10).ID: return 6064;\n\t\t\tcase DragonHead::DragonHead(11).ID: return 6065;\n\t\t\tcase DragonHead::DragonHead(12).ID: return 6066;\n\t\t\tcase DragonHead::DragonHead(13).ID: return 6067;\n\t\t\tcase DragonHead::DragonHead(14).ID: return 6068;\n\t\t\tcase DragonHead::DragonHead(15).ID: return 6069;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6070;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6071;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6072;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6073;\n\t\t\tcase DriedKelpBlock::DriedKelpBlock().ID: return 8961;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, true).ID: return 6299;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, false).ID: return 6300;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, true).ID: return 6301;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, false).ID: return 6302;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, true).ID: return 6303;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, false).ID: return 6304;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, true).ID: return 6305;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, false).ID: return 6306;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, true).ID: return 6307;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, false).ID: return 6308;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, true).ID: return 6309;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, false).ID: return 6310;\n\t\t\tcase EmeraldBlock::EmeraldBlock().ID: return 5387;\n\t\t\tcase EmeraldOre::EmeraldOre().ID: return 5234;\n\t\t\tcase EnchantingTable::EnchantingTable().ID: return 5116;\n\t\t\tcase EndGateway::EndGateway().ID: return 8688;\n\t\t\tcase EndPortal::EndPortal().ID: return 5129;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5130;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5131;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XM).ID: return 5132;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XP).ID: return 5133;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5134;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5135;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XM).ID: return 5136;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XP).ID: return 5137;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZM).ID: return 8522;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XP).ID: return 8523;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZP).ID: return 8524;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XM).ID: return 8525;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YP).ID: return 8526;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YM).ID: return 8527;\n\t\t\tcase EndStone::EndStone().ID: return 5138;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Top).ID: return 10284;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Bottom).ID: return 10286;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Double).ID: return 10288;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 9534;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9536;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 9538;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9540;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 9542;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 9544;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9546;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 9548;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9550;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 9552;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 9554;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9556;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 9558;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9560;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 9562;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 9564;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9566;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 9568;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9570;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 9572;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 9574;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9576;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 9578;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9580;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 9582;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 9584;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9586;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 9588;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9590;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 9592;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 9594;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9596;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 9598;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9600;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 9602;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 9604;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9606;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 9608;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9610;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 9612;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 10973;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 10974;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 10977;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 10978;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 10981;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 10982;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 10985;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 10986;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 10989;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 10990;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 10993;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 10994;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 10997;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 10998;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 11001;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 11002;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 11005;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 11006;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 11009;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 11010;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 11013;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 11014;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 11017;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 11018;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 11021;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 11022;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 11025;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 11026;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 11029;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 11030;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 11033;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 11034;\n\t\t\tcase EndStoneBricks::EndStoneBricks().ID: return 8682;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZM).ID: return 5236;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZP).ID: return 5238;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XM).ID: return 5240;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XP).ID: return 5242;\n\t\t\tcase Farmland::Farmland(0).ID: return 3363;\n\t\t\tcase Farmland::Farmland(1).ID: return 3364;\n\t\t\tcase Farmland::Farmland(2).ID: return 3365;\n\t\t\tcase Farmland::Farmland(3).ID: return 3366;\n\t\t\tcase Farmland::Farmland(4).ID: return 3367;\n\t\t\tcase Farmland::Farmland(5).ID: return 3368;\n\t\t\tcase Farmland::Farmland(6).ID: return 3369;\n\t\t\tcase Farmland::Farmland(7).ID: return 3370;\n\t\t\tcase Fern::Fern().ID: return 1342;\n\t\t\tcase Fire::Fire(0, true, true, true, true, true).ID: return 1439;\n\t\t\tcase Fire::Fire(0, true, true, true, true, false).ID: return 1440;\n\t\t\tcase Fire::Fire(0, true, true, true, false, true).ID: return 1441;\n\t\t\tcase Fire::Fire(0, true, true, true, false, false).ID: return 1442;\n\t\t\tcase Fire::Fire(0, true, true, false, true, true).ID: return 1443;\n\t\t\tcase Fire::Fire(0, true, true, false, true, false).ID: return 1444;\n\t\t\tcase Fire::Fire(0, true, true, false, false, true).ID: return 1445;\n\t\t\tcase Fire::Fire(0, true, true, false, false, false).ID: return 1446;\n\t\t\tcase Fire::Fire(0, true, false, true, true, true).ID: return 1447;\n\t\t\tcase Fire::Fire(0, true, false, true, true, false).ID: return 1448;\n\t\t\tcase Fire::Fire(0, true, false, true, false, true).ID: return 1449;\n\t\t\tcase Fire::Fire(0, true, false, true, false, false).ID: return 1450;\n\t\t\tcase Fire::Fire(0, true, false, false, true, true).ID: return 1451;\n\t\t\tcase Fire::Fire(0, true, false, false, true, false).ID: return 1452;\n\t\t\tcase Fire::Fire(0, true, false, false, false, true).ID: return 1453;\n\t\t\tcase Fire::Fire(0, true, false, false, false, false).ID: return 1454;\n\t\t\tcase Fire::Fire(0, false, true, true, true, true).ID: return 1455;\n\t\t\tcase Fire::Fire(0, false, true, true, true, false).ID: return 1456;\n\t\t\tcase Fire::Fire(0, false, true, true, false, true).ID: return 1457;\n\t\t\tcase Fire::Fire(0, false, true, true, false, false).ID: return 1458;\n\t\t\tcase Fire::Fire(0, false, true, false, true, true).ID: return 1459;\n\t\t\tcase Fire::Fire(0, false, true, false, true, false).ID: return 1460;\n\t\t\tcase Fire::Fire(0, false, true, false, false, true).ID: return 1461;\n\t\t\tcase Fire::Fire(0, false, true, false, false, false).ID: return 1462;\n\t\t\tcase Fire::Fire(0, false, false, true, true, true).ID: return 1463;\n\t\t\tcase Fire::Fire(0, false, false, true, true, false).ID: return 1464;\n\t\t\tcase Fire::Fire(0, false, false, true, false, true).ID: return 1465;\n\t\t\tcase Fire::Fire(0, false, false, true, false, false).ID: return 1466;\n\t\t\tcase Fire::Fire(0, false, false, false, true, true).ID: return 1467;\n\t\t\tcase Fire::Fire(0, false, false, false, true, false).ID: return 1468;\n\t\t\tcase Fire::Fire(0, false, false, false, false, true).ID: return 1469;\n\t\t\tcase Fire::Fire(0, false, false, false, false, false).ID: return 1470;\n\t\t\tcase Fire::Fire(1, true, true, true, true, true).ID: return 1471;\n\t\t\tcase Fire::Fire(1, true, true, true, true, false).ID: return 1472;\n\t\t\tcase Fire::Fire(1, true, true, true, false, true).ID: return 1473;\n\t\t\tcase Fire::Fire(1, true, true, true, false, false).ID: return 1474;\n\t\t\tcase Fire::Fire(1, true, true, false, true, true).ID: return 1475;\n\t\t\tcase Fire::Fire(1, true, true, false, true, false).ID: return 1476;\n\t\t\tcase Fire::Fire(1, true, true, false, false, true).ID: return 1477;\n\t\t\tcase Fire::Fire(1, true, true, false, false, false).ID: return 1478;\n\t\t\tcase Fire::Fire(1, true, false, true, true, true).ID: return 1479;\n\t\t\tcase Fire::Fire(1, true, false, true, true, false).ID: return 1480;\n\t\t\tcase Fire::Fire(1, true, false, true, false, true).ID: return 1481;\n\t\t\tcase Fire::Fire(1, true, false, true, false, false).ID: return 1482;\n\t\t\tcase Fire::Fire(1, true, false, false, true, true).ID: return 1483;\n\t\t\tcase Fire::Fire(1, true, false, false, true, false).ID: return 1484;\n\t\t\tcase Fire::Fire(1, true, false, false, false, true).ID: return 1485;\n\t\t\tcase Fire::Fire(1, true, false, false, false, false).ID: return 1486;\n\t\t\tcase Fire::Fire(1, false, true, true, true, true).ID: return 1487;\n\t\t\tcase Fire::Fire(1, false, true, true, true, false).ID: return 1488;\n\t\t\tcase Fire::Fire(1, false, true, true, false, true).ID: return 1489;\n\t\t\tcase Fire::Fire(1, false, true, true, false, false).ID: return 1490;\n\t\t\tcase Fire::Fire(1, false, true, false, true, true).ID: return 1491;\n\t\t\tcase Fire::Fire(1, false, true, false, true, false).ID: return 1492;\n\t\t\tcase Fire::Fire(1, false, true, false, false, true).ID: return 1493;\n\t\t\tcase Fire::Fire(1, false, true, false, false, false).ID: return 1494;\n\t\t\tcase Fire::Fire(1, false, false, true, true, true).ID: return 1495;\n\t\t\tcase Fire::Fire(1, false, false, true, true, false).ID: return 1496;\n\t\t\tcase Fire::Fire(1, false, false, true, false, true).ID: return 1497;\n\t\t\tcase Fire::Fire(1, false, false, true, false, false).ID: return 1498;\n\t\t\tcase Fire::Fire(1, false, false, false, true, true).ID: return 1499;\n\t\t\tcase Fire::Fire(1, false, false, false, true, false).ID: return 1500;\n\t\t\tcase Fire::Fire(1, false, false, false, false, true).ID: return 1501;\n\t\t\tcase Fire::Fire(1, false, false, false, false, false).ID: return 1502;\n\t\t\tcase Fire::Fire(2, true, true, true, true, true).ID: return 1503;\n\t\t\tcase Fire::Fire(2, true, true, true, true, false).ID: return 1504;\n\t\t\tcase Fire::Fire(2, true, true, true, false, true).ID: return 1505;\n\t\t\tcase Fire::Fire(2, true, true, true, false, false).ID: return 1506;\n\t\t\tcase Fire::Fire(2, true, true, false, true, true).ID: return 1507;\n\t\t\tcase Fire::Fire(2, true, true, false, true, false).ID: return 1508;\n\t\t\tcase Fire::Fire(2, true, true, false, false, true).ID: return 1509;\n\t\t\tcase Fire::Fire(2, true, true, false, false, false).ID: return 1510;\n\t\t\tcase Fire::Fire(2, true, false, true, true, true).ID: return 1511;\n\t\t\tcase Fire::Fire(2, true, false, true, true, false).ID: return 1512;\n\t\t\tcase Fire::Fire(2, true, false, true, false, true).ID: return 1513;\n\t\t\tcase Fire::Fire(2, true, false, true, false, false).ID: return 1514;\n\t\t\tcase Fire::Fire(2, true, false, false, true, true).ID: return 1515;\n\t\t\tcase Fire::Fire(2, true, false, false, true, false).ID: return 1516;\n\t\t\tcase Fire::Fire(2, true, false, false, false, true).ID: return 1517;\n\t\t\tcase Fire::Fire(2, true, false, false, false, false).ID: return 1518;\n\t\t\tcase Fire::Fire(2, false, true, true, true, true).ID: return 1519;\n\t\t\tcase Fire::Fire(2, false, true, true, true, false).ID: return 1520;\n\t\t\tcase Fire::Fire(2, false, true, true, false, true).ID: return 1521;\n\t\t\tcase Fire::Fire(2, false, true, true, false, false).ID: return 1522;\n\t\t\tcase Fire::Fire(2, false, true, false, true, true).ID: return 1523;\n\t\t\tcase Fire::Fire(2, false, true, false, true, false).ID: return 1524;\n\t\t\tcase Fire::Fire(2, false, true, false, false, true).ID: return 1525;\n\t\t\tcase Fire::Fire(2, false, true, false, false, false).ID: return 1526;\n\t\t\tcase Fire::Fire(2, false, false, true, true, true).ID: return 1527;\n\t\t\tcase Fire::Fire(2, false, false, true, true, false).ID: return 1528;\n\t\t\tcase Fire::Fire(2, false, false, true, false, true).ID: return 1529;\n\t\t\tcase Fire::Fire(2, false, false, true, false, false).ID: return 1530;\n\t\t\tcase Fire::Fire(2, false, false, false, true, true).ID: return 1531;\n\t\t\tcase Fire::Fire(2, false, false, false, true, false).ID: return 1532;\n\t\t\tcase Fire::Fire(2, false, false, false, false, true).ID: return 1533;\n\t\t\tcase Fire::Fire(2, false, false, false, false, false).ID: return 1534;\n\t\t\tcase Fire::Fire(3, true, true, true, true, true).ID: return 1535;\n\t\t\tcase Fire::Fire(3, true, true, true, true, false).ID: return 1536;\n\t\t\tcase Fire::Fire(3, true, true, true, false, true).ID: return 1537;\n\t\t\tcase Fire::Fire(3, true, true, true, false, false).ID: return 1538;\n\t\t\tcase Fire::Fire(3, true, true, false, true, true).ID: return 1539;\n\t\t\tcase Fire::Fire(3, true, true, false, true, false).ID: return 1540;\n\t\t\tcase Fire::Fire(3, true, true, false, false, true).ID: return 1541;\n\t\t\tcase Fire::Fire(3, true, true, false, false, false).ID: return 1542;\n\t\t\tcase Fire::Fire(3, true, false, true, true, true).ID: return 1543;\n\t\t\tcase Fire::Fire(3, true, false, true, true, false).ID: return 1544;\n\t\t\tcase Fire::Fire(3, true, false, true, false, true).ID: return 1545;\n\t\t\tcase Fire::Fire(3, true, false, true, false, false).ID: return 1546;\n\t\t\tcase Fire::Fire(3, true, false, false, true, true).ID: return 1547;\n\t\t\tcase Fire::Fire(3, true, false, false, true, false).ID: return 1548;\n\t\t\tcase Fire::Fire(3, true, false, false, false, true).ID: return 1549;\n\t\t\tcase Fire::Fire(3, true, false, false, false, false).ID: return 1550;\n\t\t\tcase Fire::Fire(3, false, true, true, true, true).ID: return 1551;\n\t\t\tcase Fire::Fire(3, false, true, true, true, false).ID: return 1552;\n\t\t\tcase Fire::Fire(3, false, true, true, false, true).ID: return 1553;\n\t\t\tcase Fire::Fire(3, false, true, true, false, false).ID: return 1554;\n\t\t\tcase Fire::Fire(3, false, true, false, true, true).ID: return 1555;\n\t\t\tcase Fire::Fire(3, false, true, false, true, false).ID: return 1556;\n\t\t\tcase Fire::Fire(3, false, true, false, false, true).ID: return 1557;\n\t\t\tcase Fire::Fire(3, false, true, false, false, false).ID: return 1558;\n\t\t\tcase Fire::Fire(3, false, false, true, true, true).ID: return 1559;\n\t\t\tcase Fire::Fire(3, false, false, true, true, false).ID: return 1560;\n\t\t\tcase Fire::Fire(3, false, false, true, false, true).ID: return 1561;\n\t\t\tcase Fire::Fire(3, false, false, true, false, false).ID: return 1562;\n\t\t\tcase Fire::Fire(3, false, false, false, true, true).ID: return 1563;\n\t\t\tcase Fire::Fire(3, false, false, false, true, false).ID: return 1564;\n\t\t\tcase Fire::Fire(3, false, false, false, false, true).ID: return 1565;\n\t\t\tcase Fire::Fire(3, false, false, false, false, false).ID: return 1566;\n\t\t\tcase Fire::Fire(4, true, true, true, true, true).ID: return 1567;\n\t\t\tcase Fire::Fire(4, true, true, true, true, false).ID: return 1568;\n\t\t\tcase Fire::Fire(4, true, true, true, false, true).ID: return 1569;\n\t\t\tcase Fire::Fire(4, true, true, true, false, false).ID: return 1570;\n\t\t\tcase Fire::Fire(4, true, true, false, true, true).ID: return 1571;\n\t\t\tcase Fire::Fire(4, true, true, false, true, false).ID: return 1572;\n\t\t\tcase Fire::Fire(4, true, true, false, false, true).ID: return 1573;\n\t\t\tcase Fire::Fire(4, true, true, false, false, false).ID: return 1574;\n\t\t\tcase Fire::Fire(4, true, false, true, true, true).ID: return 1575;\n\t\t\tcase Fire::Fire(4, true, false, true, true, false).ID: return 1576;\n\t\t\tcase Fire::Fire(4, true, false, true, false, true).ID: return 1577;\n\t\t\tcase Fire::Fire(4, true, false, true, false, false).ID: return 1578;\n\t\t\tcase Fire::Fire(4, true, false, false, true, true).ID: return 1579;\n\t\t\tcase Fire::Fire(4, true, false, false, true, false).ID: return 1580;\n\t\t\tcase Fire::Fire(4, true, false, false, false, true).ID: return 1581;\n\t\t\tcase Fire::Fire(4, true, false, false, false, false).ID: return 1582;\n\t\t\tcase Fire::Fire(4, false, true, true, true, true).ID: return 1583;\n\t\t\tcase Fire::Fire(4, false, true, true, true, false).ID: return 1584;\n\t\t\tcase Fire::Fire(4, false, true, true, false, true).ID: return 1585;\n\t\t\tcase Fire::Fire(4, false, true, true, false, false).ID: return 1586;\n\t\t\tcase Fire::Fire(4, false, true, false, true, true).ID: return 1587;\n\t\t\tcase Fire::Fire(4, false, true, false, true, false).ID: return 1588;\n\t\t\tcase Fire::Fire(4, false, true, false, false, true).ID: return 1589;\n\t\t\tcase Fire::Fire(4, false, true, false, false, false).ID: return 1590;\n\t\t\tcase Fire::Fire(4, false, false, true, true, true).ID: return 1591;\n\t\t\tcase Fire::Fire(4, false, false, true, true, false).ID: return 1592;\n\t\t\tcase Fire::Fire(4, false, false, true, false, true).ID: return 1593;\n\t\t\tcase Fire::Fire(4, false, false, true, false, false).ID: return 1594;\n\t\t\tcase Fire::Fire(4, false, false, false, true, true).ID: return 1595;\n\t\t\tcase Fire::Fire(4, false, false, false, true, false).ID: return 1596;\n\t\t\tcase Fire::Fire(4, false, false, false, false, true).ID: return 1597;\n\t\t\tcase Fire::Fire(4, false, false, false, false, false).ID: return 1598;\n\t\t\tcase Fire::Fire(5, true, true, true, true, true).ID: return 1599;\n\t\t\tcase Fire::Fire(5, true, true, true, true, false).ID: return 1600;\n\t\t\tcase Fire::Fire(5, true, true, true, false, true).ID: return 1601;\n\t\t\tcase Fire::Fire(5, true, true, true, false, false).ID: return 1602;\n\t\t\tcase Fire::Fire(5, true, true, false, true, true).ID: return 1603;\n\t\t\tcase Fire::Fire(5, true, true, false, true, false).ID: return 1604;\n\t\t\tcase Fire::Fire(5, true, true, false, false, true).ID: return 1605;\n\t\t\tcase Fire::Fire(5, true, true, false, false, false).ID: return 1606;\n\t\t\tcase Fire::Fire(5, true, false, true, true, true).ID: return 1607;\n\t\t\tcase Fire::Fire(5, true, false, true, true, false).ID: return 1608;\n\t\t\tcase Fire::Fire(5, true, false, true, false, true).ID: return 1609;\n\t\t\tcase Fire::Fire(5, true, false, true, false, false).ID: return 1610;\n\t\t\tcase Fire::Fire(5, true, false, false, true, true).ID: return 1611;\n\t\t\tcase Fire::Fire(5, true, false, false, true, false).ID: return 1612;\n\t\t\tcase Fire::Fire(5, true, false, false, false, true).ID: return 1613;\n\t\t\tcase Fire::Fire(5, true, false, false, false, false).ID: return 1614;\n\t\t\tcase Fire::Fire(5, false, true, true, true, true).ID: return 1615;\n\t\t\tcase Fire::Fire(5, false, true, true, true, false).ID: return 1616;\n\t\t\tcase Fire::Fire(5, false, true, true, false, true).ID: return 1617;\n\t\t\tcase Fire::Fire(5, false, true, true, false, false).ID: return 1618;\n\t\t\tcase Fire::Fire(5, false, true, false, true, true).ID: return 1619;\n\t\t\tcase Fire::Fire(5, false, true, false, true, false).ID: return 1620;\n\t\t\tcase Fire::Fire(5, false, true, false, false, true).ID: return 1621;\n\t\t\tcase Fire::Fire(5, false, true, false, false, false).ID: return 1622;\n\t\t\tcase Fire::Fire(5, false, false, true, true, true).ID: return 1623;\n\t\t\tcase Fire::Fire(5, false, false, true, true, false).ID: return 1624;\n\t\t\tcase Fire::Fire(5, false, false, true, false, true).ID: return 1625;\n\t\t\tcase Fire::Fire(5, false, false, true, false, false).ID: return 1626;\n\t\t\tcase Fire::Fire(5, false, false, false, true, true).ID: return 1627;\n\t\t\tcase Fire::Fire(5, false, false, false, true, false).ID: return 1628;\n\t\t\tcase Fire::Fire(5, false, false, false, false, true).ID: return 1629;\n\t\t\tcase Fire::Fire(5, false, false, false, false, false).ID: return 1630;\n\t\t\tcase Fire::Fire(6, true, true, true, true, true).ID: return 1631;\n\t\t\tcase Fire::Fire(6, true, true, true, true, false).ID: return 1632;\n\t\t\tcase Fire::Fire(6, true, true, true, false, true).ID: return 1633;\n\t\t\tcase Fire::Fire(6, true, true, true, false, false).ID: return 1634;\n\t\t\tcase Fire::Fire(6, true, true, false, true, true).ID: return 1635;\n\t\t\tcase Fire::Fire(6, true, true, false, true, false).ID: return 1636;\n\t\t\tcase Fire::Fire(6, true, true, false, false, true).ID: return 1637;\n\t\t\tcase Fire::Fire(6, true, true, false, false, false).ID: return 1638;\n\t\t\tcase Fire::Fire(6, true, false, true, true, true).ID: return 1639;\n\t\t\tcase Fire::Fire(6, true, false, true, true, false).ID: return 1640;\n\t\t\tcase Fire::Fire(6, true, false, true, false, true).ID: return 1641;\n\t\t\tcase Fire::Fire(6, true, false, true, false, false).ID: return 1642;\n\t\t\tcase Fire::Fire(6, true, false, false, true, true).ID: return 1643;\n\t\t\tcase Fire::Fire(6, true, false, false, true, false).ID: return 1644;\n\t\t\tcase Fire::Fire(6, true, false, false, false, true).ID: return 1645;\n\t\t\tcase Fire::Fire(6, true, false, false, false, false).ID: return 1646;\n\t\t\tcase Fire::Fire(6, false, true, true, true, true).ID: return 1647;\n\t\t\tcase Fire::Fire(6, false, true, true, true, false).ID: return 1648;\n\t\t\tcase Fire::Fire(6, false, true, true, false, true).ID: return 1649;\n\t\t\tcase Fire::Fire(6, false, true, true, false, false).ID: return 1650;\n\t\t\tcase Fire::Fire(6, false, true, false, true, true).ID: return 1651;\n\t\t\tcase Fire::Fire(6, false, true, false, true, false).ID: return 1652;\n\t\t\tcase Fire::Fire(6, false, true, false, false, true).ID: return 1653;\n\t\t\tcase Fire::Fire(6, false, true, false, false, false).ID: return 1654;\n\t\t\tcase Fire::Fire(6, false, false, true, true, true).ID: return 1655;\n\t\t\tcase Fire::Fire(6, false, false, true, true, false).ID: return 1656;\n\t\t\tcase Fire::Fire(6, false, false, true, false, true).ID: return 1657;\n\t\t\tcase Fire::Fire(6, false, false, true, false, false).ID: return 1658;\n\t\t\tcase Fire::Fire(6, false, false, false, true, true).ID: return 1659;\n\t\t\tcase Fire::Fire(6, false, false, false, true, false).ID: return 1660;\n\t\t\tcase Fire::Fire(6, false, false, false, false, true).ID: return 1661;\n\t\t\tcase Fire::Fire(6, false, false, false, false, false).ID: return 1662;\n\t\t\tcase Fire::Fire(7, true, true, true, true, true).ID: return 1663;\n\t\t\tcase Fire::Fire(7, true, true, true, true, false).ID: return 1664;\n\t\t\tcase Fire::Fire(7, true, true, true, false, true).ID: return 1665;\n\t\t\tcase Fire::Fire(7, true, true, true, false, false).ID: return 1666;\n\t\t\tcase Fire::Fire(7, true, true, false, true, true).ID: return 1667;\n\t\t\tcase Fire::Fire(7, true, true, false, true, false).ID: return 1668;\n\t\t\tcase Fire::Fire(7, true, true, false, false, true).ID: return 1669;\n\t\t\tcase Fire::Fire(7, true, true, false, false, false).ID: return 1670;\n\t\t\tcase Fire::Fire(7, true, false, true, true, true).ID: return 1671;\n\t\t\tcase Fire::Fire(7, true, false, true, true, false).ID: return 1672;\n\t\t\tcase Fire::Fire(7, true, false, true, false, true).ID: return 1673;\n\t\t\tcase Fire::Fire(7, true, false, true, false, false).ID: return 1674;\n\t\t\tcase Fire::Fire(7, true, false, false, true, true).ID: return 1675;\n\t\t\tcase Fire::Fire(7, true, false, false, true, false).ID: return 1676;\n\t\t\tcase Fire::Fire(7, true, false, false, false, true).ID: return 1677;\n\t\t\tcase Fire::Fire(7, true, false, false, false, false).ID: return 1678;\n\t\t\tcase Fire::Fire(7, false, true, true, true, true).ID: return 1679;\n\t\t\tcase Fire::Fire(7, false, true, true, true, false).ID: return 1680;\n\t\t\tcase Fire::Fire(7, false, true, true, false, true).ID: return 1681;\n\t\t\tcase Fire::Fire(7, false, true, true, false, false).ID: return 1682;\n\t\t\tcase Fire::Fire(7, false, true, false, true, true).ID: return 1683;\n\t\t\tcase Fire::Fire(7, false, true, false, true, false).ID: return 1684;\n\t\t\tcase Fire::Fire(7, false, true, false, false, true).ID: return 1685;\n\t\t\tcase Fire::Fire(7, false, true, false, false, false).ID: return 1686;\n\t\t\tcase Fire::Fire(7, false, false, true, true, true).ID: return 1687;\n\t\t\tcase Fire::Fire(7, false, false, true, true, false).ID: return 1688;\n\t\t\tcase Fire::Fire(7, false, false, true, false, true).ID: return 1689;\n\t\t\tcase Fire::Fire(7, false, false, true, false, false).ID: return 1690;\n\t\t\tcase Fire::Fire(7, false, false, false, true, true).ID: return 1691;\n\t\t\tcase Fire::Fire(7, false, false, false, true, false).ID: return 1692;\n\t\t\tcase Fire::Fire(7, false, false, false, false, true).ID: return 1693;\n\t\t\tcase Fire::Fire(7, false, false, false, false, false).ID: return 1694;\n\t\t\tcase Fire::Fire(8, true, true, true, true, true).ID: return 1695;\n\t\t\tcase Fire::Fire(8, true, true, true, true, false).ID: return 1696;\n\t\t\tcase Fire::Fire(8, true, true, true, false, true).ID: return 1697;\n\t\t\tcase Fire::Fire(8, true, true, true, false, false).ID: return 1698;\n\t\t\tcase Fire::Fire(8, true, true, false, true, true).ID: return 1699;\n\t\t\tcase Fire::Fire(8, true, true, false, true, false).ID: return 1700;\n\t\t\tcase Fire::Fire(8, true, true, false, false, true).ID: return 1701;\n\t\t\tcase Fire::Fire(8, true, true, false, false, false).ID: return 1702;\n\t\t\tcase Fire::Fire(8, true, false, true, true, true).ID: return 1703;\n\t\t\tcase Fire::Fire(8, true, false, true, true, false).ID: return 1704;\n\t\t\tcase Fire::Fire(8, true, false, true, false, true).ID: return 1705;\n\t\t\tcase Fire::Fire(8, true, false, true, false, false).ID: return 1706;\n\t\t\tcase Fire::Fire(8, true, false, false, true, true).ID: return 1707;\n\t\t\tcase Fire::Fire(8, true, false, false, true, false).ID: return 1708;\n\t\t\tcase Fire::Fire(8, true, false, false, false, true).ID: return 1709;\n\t\t\tcase Fire::Fire(8, true, false, false, false, false).ID: return 1710;\n\t\t\tcase Fire::Fire(8, false, true, true, true, true).ID: return 1711;\n\t\t\tcase Fire::Fire(8, false, true, true, true, false).ID: return 1712;\n\t\t\tcase Fire::Fire(8, false, true, true, false, true).ID: return 1713;\n\t\t\tcase Fire::Fire(8, false, true, true, false, false).ID: return 1714;\n\t\t\tcase Fire::Fire(8, false, true, false, true, true).ID: return 1715;\n\t\t\tcase Fire::Fire(8, false, true, false, true, false).ID: return 1716;\n\t\t\tcase Fire::Fire(8, false, true, false, false, true).ID: return 1717;\n\t\t\tcase Fire::Fire(8, false, true, false, false, false).ID: return 1718;\n\t\t\tcase Fire::Fire(8, false, false, true, true, true).ID: return 1719;\n\t\t\tcase Fire::Fire(8, false, false, true, true, false).ID: return 1720;\n\t\t\tcase Fire::Fire(8, false, false, true, false, true).ID: return 1721;\n\t\t\tcase Fire::Fire(8, false, false, true, false, false).ID: return 1722;\n\t\t\tcase Fire::Fire(8, false, false, false, true, true).ID: return 1723;\n\t\t\tcase Fire::Fire(8, false, false, false, true, false).ID: return 1724;\n\t\t\tcase Fire::Fire(8, false, false, false, false, true).ID: return 1725;\n\t\t\tcase Fire::Fire(8, false, false, false, false, false).ID: return 1726;\n\t\t\tcase Fire::Fire(9, true, true, true, true, true).ID: return 1727;\n\t\t\tcase Fire::Fire(9, true, true, true, true, false).ID: return 1728;\n\t\t\tcase Fire::Fire(9, true, true, true, false, true).ID: return 1729;\n\t\t\tcase Fire::Fire(9, true, true, true, false, false).ID: return 1730;\n\t\t\tcase Fire::Fire(9, true, true, false, true, true).ID: return 1731;\n\t\t\tcase Fire::Fire(9, true, true, false, true, false).ID: return 1732;\n\t\t\tcase Fire::Fire(9, true, true, false, false, true).ID: return 1733;\n\t\t\tcase Fire::Fire(9, true, true, false, false, false).ID: return 1734;\n\t\t\tcase Fire::Fire(9, true, false, true, true, true).ID: return 1735;\n\t\t\tcase Fire::Fire(9, true, false, true, true, false).ID: return 1736;\n\t\t\tcase Fire::Fire(9, true, false, true, false, true).ID: return 1737;\n\t\t\tcase Fire::Fire(9, true, false, true, false, false).ID: return 1738;\n\t\t\tcase Fire::Fire(9, true, false, false, true, true).ID: return 1739;\n\t\t\tcase Fire::Fire(9, true, false, false, true, false).ID: return 1740;\n\t\t\tcase Fire::Fire(9, true, false, false, false, true).ID: return 1741;\n\t\t\tcase Fire::Fire(9, true, false, false, false, false).ID: return 1742;\n\t\t\tcase Fire::Fire(9, false, true, true, true, true).ID: return 1743;\n\t\t\tcase Fire::Fire(9, false, true, true, true, false).ID: return 1744;\n\t\t\tcase Fire::Fire(9, false, true, true, false, true).ID: return 1745;\n\t\t\tcase Fire::Fire(9, false, true, true, false, false).ID: return 1746;\n\t\t\tcase Fire::Fire(9, false, true, false, true, true).ID: return 1747;\n\t\t\tcase Fire::Fire(9, false, true, false, true, false).ID: return 1748;\n\t\t\tcase Fire::Fire(9, false, true, false, false, true).ID: return 1749;\n\t\t\tcase Fire::Fire(9, false, true, false, false, false).ID: return 1750;\n\t\t\tcase Fire::Fire(9, false, false, true, true, true).ID: return 1751;\n\t\t\tcase Fire::Fire(9, false, false, true, true, false).ID: return 1752;\n\t\t\tcase Fire::Fire(9, false, false, true, false, true).ID: return 1753;\n\t\t\tcase Fire::Fire(9, false, false, true, false, false).ID: return 1754;\n\t\t\tcase Fire::Fire(9, false, false, false, true, true).ID: return 1755;\n\t\t\tcase Fire::Fire(9, false, false, false, true, false).ID: return 1756;\n\t\t\tcase Fire::Fire(9, false, false, false, false, true).ID: return 1757;\n\t\t\tcase Fire::Fire(9, false, false, false, false, false).ID: return 1758;\n\t\t\tcase Fire::Fire(10, true, true, true, true, true).ID: return 1759;\n\t\t\tcase Fire::Fire(10, true, true, true, true, false).ID: return 1760;\n\t\t\tcase Fire::Fire(10, true, true, true, false, true).ID: return 1761;\n\t\t\tcase Fire::Fire(10, true, true, true, false, false).ID: return 1762;\n\t\t\tcase Fire::Fire(10, true, true, false, true, true).ID: return 1763;\n\t\t\tcase Fire::Fire(10, true, true, false, true, false).ID: return 1764;\n\t\t\tcase Fire::Fire(10, true, true, false, false, true).ID: return 1765;\n\t\t\tcase Fire::Fire(10, true, true, false, false, false).ID: return 1766;\n\t\t\tcase Fire::Fire(10, true, false, true, true, true).ID: return 1767;\n\t\t\tcase Fire::Fire(10, true, false, true, true, false).ID: return 1768;\n\t\t\tcase Fire::Fire(10, true, false, true, false, true).ID: return 1769;\n\t\t\tcase Fire::Fire(10, true, false, true, false, false).ID: return 1770;\n\t\t\tcase Fire::Fire(10, true, false, false, true, true).ID: return 1771;\n\t\t\tcase Fire::Fire(10, true, false, false, true, false).ID: return 1772;\n\t\t\tcase Fire::Fire(10, true, false, false, false, true).ID: return 1773;\n\t\t\tcase Fire::Fire(10, true, false, false, false, false).ID: return 1774;\n\t\t\tcase Fire::Fire(10, false, true, true, true, true).ID: return 1775;\n\t\t\tcase Fire::Fire(10, false, true, true, true, false).ID: return 1776;\n\t\t\tcase Fire::Fire(10, false, true, true, false, true).ID: return 1777;\n\t\t\tcase Fire::Fire(10, false, true, true, false, false).ID: return 1778;\n\t\t\tcase Fire::Fire(10, false, true, false, true, true).ID: return 1779;\n\t\t\tcase Fire::Fire(10, false, true, false, true, false).ID: return 1780;\n\t\t\tcase Fire::Fire(10, false, true, false, false, true).ID: return 1781;\n\t\t\tcase Fire::Fire(10, false, true, false, false, false).ID: return 1782;\n\t\t\tcase Fire::Fire(10, false, false, true, true, true).ID: return 1783;\n\t\t\tcase Fire::Fire(10, false, false, true, true, false).ID: return 1784;\n\t\t\tcase Fire::Fire(10, false, false, true, false, true).ID: return 1785;\n\t\t\tcase Fire::Fire(10, false, false, true, false, false).ID: return 1786;\n\t\t\tcase Fire::Fire(10, false, false, false, true, true).ID: return 1787;\n\t\t\tcase Fire::Fire(10, false, false, false, true, false).ID: return 1788;\n\t\t\tcase Fire::Fire(10, false, false, false, false, true).ID: return 1789;\n\t\t\tcase Fire::Fire(10, false, false, false, false, false).ID: return 1790;\n\t\t\tcase Fire::Fire(11, true, true, true, true, true).ID: return 1791;\n\t\t\tcase Fire::Fire(11, true, true, true, true, false).ID: return 1792;\n\t\t\tcase Fire::Fire(11, true, true, true, false, true).ID: return 1793;\n\t\t\tcase Fire::Fire(11, true, true, true, false, false).ID: return 1794;\n\t\t\tcase Fire::Fire(11, true, true, false, true, true).ID: return 1795;\n\t\t\tcase Fire::Fire(11, true, true, false, true, false).ID: return 1796;\n\t\t\tcase Fire::Fire(11, true, true, false, false, true).ID: return 1797;\n\t\t\tcase Fire::Fire(11, true, true, false, false, false).ID: return 1798;\n\t\t\tcase Fire::Fire(11, true, false, true, true, true).ID: return 1799;\n\t\t\tcase Fire::Fire(11, true, false, true, true, false).ID: return 1800;\n\t\t\tcase Fire::Fire(11, true, false, true, false, true).ID: return 1801;\n\t\t\tcase Fire::Fire(11, true, false, true, false, false).ID: return 1802;\n\t\t\tcase Fire::Fire(11, true, false, false, true, true).ID: return 1803;\n\t\t\tcase Fire::Fire(11, true, false, false, true, false).ID: return 1804;\n\t\t\tcase Fire::Fire(11, true, false, false, false, true).ID: return 1805;\n\t\t\tcase Fire::Fire(11, true, false, false, false, false).ID: return 1806;\n\t\t\tcase Fire::Fire(11, false, true, true, true, true).ID: return 1807;\n\t\t\tcase Fire::Fire(11, false, true, true, true, false).ID: return 1808;\n\t\t\tcase Fire::Fire(11, false, true, true, false, true).ID: return 1809;\n\t\t\tcase Fire::Fire(11, false, true, true, false, false).ID: return 1810;\n\t\t\tcase Fire::Fire(11, false, true, false, true, true).ID: return 1811;\n\t\t\tcase Fire::Fire(11, false, true, false, true, false).ID: return 1812;\n\t\t\tcase Fire::Fire(11, false, true, false, false, true).ID: return 1813;\n\t\t\tcase Fire::Fire(11, false, true, false, false, false).ID: return 1814;\n\t\t\tcase Fire::Fire(11, false, false, true, true, true).ID: return 1815;\n\t\t\tcase Fire::Fire(11, false, false, true, true, false).ID: return 1816;\n\t\t\tcase Fire::Fire(11, false, false, true, false, true).ID: return 1817;\n\t\t\tcase Fire::Fire(11, false, false, true, false, false).ID: return 1818;\n\t\t\tcase Fire::Fire(11, false, false, false, true, true).ID: return 1819;\n\t\t\tcase Fire::Fire(11, false, false, false, true, false).ID: return 1820;\n\t\t\tcase Fire::Fire(11, false, false, false, false, true).ID: return 1821;\n\t\t\tcase Fire::Fire(11, false, false, false, false, false).ID: return 1822;\n\t\t\tcase Fire::Fire(12, true, true, true, true, true).ID: return 1823;\n\t\t\tcase Fire::Fire(12, true, true, true, true, false).ID: return 1824;\n\t\t\tcase Fire::Fire(12, true, true, true, false, true).ID: return 1825;\n\t\t\tcase Fire::Fire(12, true, true, true, false, false).ID: return 1826;\n\t\t\tcase Fire::Fire(12, true, true, false, true, true).ID: return 1827;\n\t\t\tcase Fire::Fire(12, true, true, false, true, false).ID: return 1828;\n\t\t\tcase Fire::Fire(12, true, true, false, false, true).ID: return 1829;\n\t\t\tcase Fire::Fire(12, true, true, false, false, false).ID: return 1830;\n\t\t\tcase Fire::Fire(12, true, false, true, true, true).ID: return 1831;\n\t\t\tcase Fire::Fire(12, true, false, true, true, false).ID: return 1832;\n\t\t\tcase Fire::Fire(12, true, false, true, false, true).ID: return 1833;\n\t\t\tcase Fire::Fire(12, true, false, true, false, false).ID: return 1834;\n\t\t\tcase Fire::Fire(12, true, false, false, true, true).ID: return 1835;\n\t\t\tcase Fire::Fire(12, true, false, false, true, false).ID: return 1836;\n\t\t\tcase Fire::Fire(12, true, false, false, false, true).ID: return 1837;\n\t\t\tcase Fire::Fire(12, true, false, false, false, false).ID: return 1838;\n\t\t\tcase Fire::Fire(12, false, true, true, true, true).ID: return 1839;\n\t\t\tcase Fire::Fire(12, false, true, true, true, false).ID: return 1840;\n\t\t\tcase Fire::Fire(12, false, true, true, false, true).ID: return 1841;\n\t\t\tcase Fire::Fire(12, false, true, true, false, false).ID: return 1842;\n\t\t\tcase Fire::Fire(12, false, true, false, true, true).ID: return 1843;\n\t\t\tcase Fire::Fire(12, false, true, false, true, false).ID: return 1844;\n\t\t\tcase Fire::Fire(12, false, true, false, false, true).ID: return 1845;\n\t\t\tcase Fire::Fire(12, false, true, false, false, false).ID: return 1846;\n\t\t\tcase Fire::Fire(12, false, false, true, true, true).ID: return 1847;\n\t\t\tcase Fire::Fire(12, false, false, true, true, false).ID: return 1848;\n\t\t\tcase Fire::Fire(12, false, false, true, false, true).ID: return 1849;\n\t\t\tcase Fire::Fire(12, false, false, true, false, false).ID: return 1850;\n\t\t\tcase Fire::Fire(12, false, false, false, true, true).ID: return 1851;\n\t\t\tcase Fire::Fire(12, false, false, false, true, false).ID: return 1852;\n\t\t\tcase Fire::Fire(12, false, false, false, false, true).ID: return 1853;\n\t\t\tcase Fire::Fire(12, false, false, false, false, false).ID: return 1854;\n\t\t\tcase Fire::Fire(13, true, true, true, true, true).ID: return 1855;\n\t\t\tcase Fire::Fire(13, true, true, true, true, false).ID: return 1856;\n\t\t\tcase Fire::Fire(13, true, true, true, false, true).ID: return 1857;\n\t\t\tcase Fire::Fire(13, true, true, true, false, false).ID: return 1858;\n\t\t\tcase Fire::Fire(13, true, true, false, true, true).ID: return 1859;\n\t\t\tcase Fire::Fire(13, true, true, false, true, false).ID: return 1860;\n\t\t\tcase Fire::Fire(13, true, true, false, false, true).ID: return 1861;\n\t\t\tcase Fire::Fire(13, true, true, false, false, false).ID: return 1862;\n\t\t\tcase Fire::Fire(13, true, false, true, true, true).ID: return 1863;\n\t\t\tcase Fire::Fire(13, true, false, true, true, false).ID: return 1864;\n\t\t\tcase Fire::Fire(13, true, false, true, false, true).ID: return 1865;\n\t\t\tcase Fire::Fire(13, true, false, true, false, false).ID: return 1866;\n\t\t\tcase Fire::Fire(13, true, false, false, true, true).ID: return 1867;\n\t\t\tcase Fire::Fire(13, true, false, false, true, false).ID: return 1868;\n\t\t\tcase Fire::Fire(13, true, false, false, false, true).ID: return 1869;\n\t\t\tcase Fire::Fire(13, true, false, false, false, false).ID: return 1870;\n\t\t\tcase Fire::Fire(13, false, true, true, true, true).ID: return 1871;\n\t\t\tcase Fire::Fire(13, false, true, true, true, false).ID: return 1872;\n\t\t\tcase Fire::Fire(13, false, true, true, false, true).ID: return 1873;\n\t\t\tcase Fire::Fire(13, false, true, true, false, false).ID: return 1874;\n\t\t\tcase Fire::Fire(13, false, true, false, true, true).ID: return 1875;\n\t\t\tcase Fire::Fire(13, false, true, false, true, false).ID: return 1876;\n\t\t\tcase Fire::Fire(13, false, true, false, false, true).ID: return 1877;\n\t\t\tcase Fire::Fire(13, false, true, false, false, false).ID: return 1878;\n\t\t\tcase Fire::Fire(13, false, false, true, true, true).ID: return 1879;\n\t\t\tcase Fire::Fire(13, false, false, true, true, false).ID: return 1880;\n\t\t\tcase Fire::Fire(13, false, false, true, false, true).ID: return 1881;\n\t\t\tcase Fire::Fire(13, false, false, true, false, false).ID: return 1882;\n\t\t\tcase Fire::Fire(13, false, false, false, true, true).ID: return 1883;\n\t\t\tcase Fire::Fire(13, false, false, false, true, false).ID: return 1884;\n\t\t\tcase Fire::Fire(13, false, false, false, false, true).ID: return 1885;\n\t\t\tcase Fire::Fire(13, false, false, false, false, false).ID: return 1886;\n\t\t\tcase Fire::Fire(14, true, true, true, true, true).ID: return 1887;\n\t\t\tcase Fire::Fire(14, true, true, true, true, false).ID: return 1888;\n\t\t\tcase Fire::Fire(14, true, true, true, false, true).ID: return 1889;\n\t\t\tcase Fire::Fire(14, true, true, true, false, false).ID: return 1890;\n\t\t\tcase Fire::Fire(14, true, true, false, true, true).ID: return 1891;\n\t\t\tcase Fire::Fire(14, true, true, false, true, false).ID: return 1892;\n\t\t\tcase Fire::Fire(14, true, true, false, false, true).ID: return 1893;\n\t\t\tcase Fire::Fire(14, true, true, false, false, false).ID: return 1894;\n\t\t\tcase Fire::Fire(14, true, false, true, true, true).ID: return 1895;\n\t\t\tcase Fire::Fire(14, true, false, true, true, false).ID: return 1896;\n\t\t\tcase Fire::Fire(14, true, false, true, false, true).ID: return 1897;\n\t\t\tcase Fire::Fire(14, true, false, true, false, false).ID: return 1898;\n\t\t\tcase Fire::Fire(14, true, false, false, true, true).ID: return 1899;\n\t\t\tcase Fire::Fire(14, true, false, false, true, false).ID: return 1900;\n\t\t\tcase Fire::Fire(14, true, false, false, false, true).ID: return 1901;\n\t\t\tcase Fire::Fire(14, true, false, false, false, false).ID: return 1902;\n\t\t\tcase Fire::Fire(14, false, true, true, true, true).ID: return 1903;\n\t\t\tcase Fire::Fire(14, false, true, true, true, false).ID: return 1904;\n\t\t\tcase Fire::Fire(14, false, true, true, false, true).ID: return 1905;\n\t\t\tcase Fire::Fire(14, false, true, true, false, false).ID: return 1906;\n\t\t\tcase Fire::Fire(14, false, true, false, true, true).ID: return 1907;\n\t\t\tcase Fire::Fire(14, false, true, false, true, false).ID: return 1908;\n\t\t\tcase Fire::Fire(14, false, true, false, false, true).ID: return 1909;\n\t\t\tcase Fire::Fire(14, false, true, false, false, false).ID: return 1910;\n\t\t\tcase Fire::Fire(14, false, false, true, true, true).ID: return 1911;\n\t\t\tcase Fire::Fire(14, false, false, true, true, false).ID: return 1912;\n\t\t\tcase Fire::Fire(14, false, false, true, false, true).ID: return 1913;\n\t\t\tcase Fire::Fire(14, false, false, true, false, false).ID: return 1914;\n\t\t\tcase Fire::Fire(14, false, false, false, true, true).ID: return 1915;\n\t\t\tcase Fire::Fire(14, false, false, false, true, false).ID: return 1916;\n\t\t\tcase Fire::Fire(14, false, false, false, false, true).ID: return 1917;\n\t\t\tcase Fire::Fire(14, false, false, false, false, false).ID: return 1918;\n\t\t\tcase Fire::Fire(15, true, true, true, true, true).ID: return 1919;\n\t\t\tcase Fire::Fire(15, true, true, true, true, false).ID: return 1920;\n\t\t\tcase Fire::Fire(15, true, true, true, false, true).ID: return 1921;\n\t\t\tcase Fire::Fire(15, true, true, true, false, false).ID: return 1922;\n\t\t\tcase Fire::Fire(15, true, true, false, true, true).ID: return 1923;\n\t\t\tcase Fire::Fire(15, true, true, false, true, false).ID: return 1924;\n\t\t\tcase Fire::Fire(15, true, true, false, false, true).ID: return 1925;\n\t\t\tcase Fire::Fire(15, true, true, false, false, false).ID: return 1926;\n\t\t\tcase Fire::Fire(15, true, false, true, true, true).ID: return 1927;\n\t\t\tcase Fire::Fire(15, true, false, true, true, false).ID: return 1928;\n\t\t\tcase Fire::Fire(15, true, false, true, false, true).ID: return 1929;\n\t\t\tcase Fire::Fire(15, true, false, true, false, false).ID: return 1930;\n\t\t\tcase Fire::Fire(15, true, false, false, true, true).ID: return 1931;\n\t\t\tcase Fire::Fire(15, true, false, false, true, false).ID: return 1932;\n\t\t\tcase Fire::Fire(15, true, false, false, false, true).ID: return 1933;\n\t\t\tcase Fire::Fire(15, true, false, false, false, false).ID: return 1934;\n\t\t\tcase Fire::Fire(15, false, true, true, true, true).ID: return 1935;\n\t\t\tcase Fire::Fire(15, false, true, true, true, false).ID: return 1936;\n\t\t\tcase Fire::Fire(15, false, true, true, false, true).ID: return 1937;\n\t\t\tcase Fire::Fire(15, false, true, true, false, false).ID: return 1938;\n\t\t\tcase Fire::Fire(15, false, true, false, true, true).ID: return 1939;\n\t\t\tcase Fire::Fire(15, false, true, false, true, false).ID: return 1940;\n\t\t\tcase Fire::Fire(15, false, true, false, false, true).ID: return 1941;\n\t\t\tcase Fire::Fire(15, false, true, false, false, false).ID: return 1942;\n\t\t\tcase Fire::Fire(15, false, false, true, true, true).ID: return 1943;\n\t\t\tcase Fire::Fire(15, false, false, true, true, false).ID: return 1944;\n\t\t\tcase Fire::Fire(15, false, false, true, false, true).ID: return 1945;\n\t\t\tcase Fire::Fire(15, false, false, true, false, false).ID: return 1946;\n\t\t\tcase Fire::Fire(15, false, false, false, true, true).ID: return 1947;\n\t\t\tcase Fire::Fire(15, false, false, false, true, false).ID: return 1948;\n\t\t\tcase Fire::Fire(15, false, false, false, false, true).ID: return 1949;\n\t\t\tcase Fire::Fire(15, false, false, false, false, false).ID: return 1950;\n\t\t\tcase FireCoral::FireCoral().ID: return 9001;\n\t\t\tcase FireCoralBlock::FireCoralBlock().ID: return 8982;\n\t\t\tcase FireCoralFan::FireCoralFan().ID: return 9021;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9089;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9091;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9093;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9095;\n\t\t\tcase FletchingTable::FletchingTable().ID: return 11164;\n\t\t\tcase FlowerPot::FlowerPot().ID: return 5769;\n\t\t\tcase FrostedIce::FrostedIce(0).ID: return 8713;\n\t\t\tcase FrostedIce::FrostedIce(1).ID: return 8714;\n\t\t\tcase FrostedIce::FrostedIce(2).ID: return 8715;\n\t\t\tcase FrostedIce::FrostedIce(3).ID: return 8716;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3371;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3372;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3373;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3374;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, true).ID: return 3375;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, false).ID: return 3376;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, true).ID: return 3377;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, false).ID: return 3378;\n\t\t\tcase Glass::Glass().ID: return 230;\n\t\t\tcase GlassPane::GlassPane(true, true, true, true).ID: return 4717;\n\t\t\tcase GlassPane::GlassPane(true, true, true, false).ID: return 4718;\n\t\t\tcase GlassPane::GlassPane(true, true, false, true).ID: return 4721;\n\t\t\tcase GlassPane::GlassPane(true, true, false, false).ID: return 4722;\n\t\t\tcase GlassPane::GlassPane(true, false, true, true).ID: return 4725;\n\t\t\tcase GlassPane::GlassPane(true, false, true, false).ID: return 4726;\n\t\t\tcase GlassPane::GlassPane(true, false, false, true).ID: return 4729;\n\t\t\tcase GlassPane::GlassPane(true, false, false, false).ID: return 4730;\n\t\t\tcase GlassPane::GlassPane(false, true, true, true).ID: return 4733;\n\t\t\tcase GlassPane::GlassPane(false, true, true, false).ID: return 4734;\n\t\t\tcase GlassPane::GlassPane(false, true, false, true).ID: return 4737;\n\t\t\tcase GlassPane::GlassPane(false, true, false, false).ID: return 4738;\n\t\t\tcase GlassPane::GlassPane(false, false, true, true).ID: return 4741;\n\t\t\tcase GlassPane::GlassPane(false, false, true, false).ID: return 4742;\n\t\t\tcase GlassPane::GlassPane(false, false, false, true).ID: return 4745;\n\t\t\tcase GlassPane::GlassPane(false, false, false, false).ID: return 4746;\n\t\t\tcase Glowstone::Glowstone().ID: return 3999;\n\t\t\tcase GoldBlock::GoldBlock().ID: return 1426;\n\t\t\tcase GoldOre::GoldOre().ID: return 69;\n\t\t\tcase Granite::Granite().ID: return 2;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Top).ID: return 10302;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Bottom).ID: return 10304;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Double).ID: return 10306;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 9854;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 9856;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 9858;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 9860;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 9862;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 9864;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 9866;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 9868;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 9870;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 9872;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 9874;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 9876;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 9878;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 9880;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 9882;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 9884;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 9886;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 9888;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 9890;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 9892;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 9894;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 9896;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 9898;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 9900;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 9902;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 9904;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 9906;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 9908;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 9910;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 9912;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 9914;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 9916;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 9918;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 9920;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 9922;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 9924;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 9926;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 9928;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 9930;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 9932;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 10589;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 10590;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 10593;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 10594;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 10597;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 10598;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 10601;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 10602;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 10605;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 10606;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 10609;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 10610;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 10613;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 10614;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 10617;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 10618;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 10621;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 10622;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 10625;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 10626;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 10629;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 10630;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 10633;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 10634;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 10637;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 10638;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 10641;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 10642;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 10645;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 10646;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 10649;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 10650;\n\t\t\tcase Grass::Grass().ID: return 1341;\n\t\t\tcase GrassBlock::GrassBlock(true).ID: return 8;\n\t\t\tcase GrassBlock::GrassBlock(false).ID: return 9;\n\t\t\tcase GrassPath::GrassPath().ID: return 8687;\n\t\t\tcase Gravel::Gravel().ID: return 68;\n\t\t\tcase GrayBanner::GrayBanner(0).ID: return 7473;\n\t\t\tcase GrayBanner::GrayBanner(1).ID: return 7474;\n\t\t\tcase GrayBanner::GrayBanner(2).ID: return 7475;\n\t\t\tcase GrayBanner::GrayBanner(3).ID: return 7476;\n\t\t\tcase GrayBanner::GrayBanner(4).ID: return 7477;\n\t\t\tcase GrayBanner::GrayBanner(5).ID: return 7478;\n\t\t\tcase GrayBanner::GrayBanner(6).ID: return 7479;\n\t\t\tcase GrayBanner::GrayBanner(7).ID: return 7480;\n\t\t\tcase GrayBanner::GrayBanner(8).ID: return 7481;\n\t\t\tcase GrayBanner::GrayBanner(9).ID: return 7482;\n\t\t\tcase GrayBanner::GrayBanner(10).ID: return 7483;\n\t\t\tcase GrayBanner::GrayBanner(11).ID: return 7484;\n\t\t\tcase GrayBanner::GrayBanner(12).ID: return 7485;\n\t\t\tcase GrayBanner::GrayBanner(13).ID: return 7486;\n\t\t\tcase GrayBanner::GrayBanner(14).ID: return 7487;\n\t\t\tcase GrayBanner::GrayBanner(15).ID: return 7488;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Head).ID: return 1160;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Foot).ID: return 1161;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Head).ID: return 1162;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Foot).ID: return 1163;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Head).ID: return 1164;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Foot).ID: return 1165;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Head).ID: return 1166;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Foot).ID: return 1167;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Head).ID: return 1168;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Foot).ID: return 1169;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Head).ID: return 1170;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Foot).ID: return 1171;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Head).ID: return 1172;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Foot).ID: return 1173;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Head).ID: return 1174;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Foot).ID: return 1175;\n\t\t\tcase GrayCarpet::GrayCarpet().ID: return 7337;\n\t\t\tcase GrayConcrete::GrayConcrete().ID: return 8909;\n\t\t\tcase GrayConcretePowder::GrayConcretePowder().ID: return 8925;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8866;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8867;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8868;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8869;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8784;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8785;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8786;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8787;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8788;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8789;\n\t\t\tcase GrayStainedGlass::GrayStainedGlass().ID: return 4088;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, true).ID: return 6553;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, false).ID: return 6554;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, true).ID: return 6557;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, false).ID: return 6558;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, true).ID: return 6561;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, false).ID: return 6562;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, true).ID: return 6565;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, false).ID: return 6566;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, true).ID: return 6569;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, false).ID: return 6570;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, true).ID: return 6573;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, false).ID: return 6574;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, true).ID: return 6577;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, false).ID: return 6578;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, true).ID: return 6581;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, false).ID: return 6582;\n\t\t\tcase GrayTerracotta::GrayTerracotta().ID: return 6318;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7645;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7646;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7647;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7648;\n\t\t\tcase GrayWool::GrayWool().ID: return 1390;\n\t\t\tcase GreenBanner::GreenBanner(0).ID: return 7569;\n\t\t\tcase GreenBanner::GreenBanner(1).ID: return 7570;\n\t\t\tcase GreenBanner::GreenBanner(2).ID: return 7571;\n\t\t\tcase GreenBanner::GreenBanner(3).ID: return 7572;\n\t\t\tcase GreenBanner::GreenBanner(4).ID: return 7573;\n\t\t\tcase GreenBanner::GreenBanner(5).ID: return 7574;\n\t\t\tcase GreenBanner::GreenBanner(6).ID: return 7575;\n\t\t\tcase GreenBanner::GreenBanner(7).ID: return 7576;\n\t\t\tcase GreenBanner::GreenBanner(8).ID: return 7577;\n\t\t\tcase GreenBanner::GreenBanner(9).ID: return 7578;\n\t\t\tcase GreenBanner::GreenBanner(10).ID: return 7579;\n\t\t\tcase GreenBanner::GreenBanner(11).ID: return 7580;\n\t\t\tcase GreenBanner::GreenBanner(12).ID: return 7581;\n\t\t\tcase GreenBanner::GreenBanner(13).ID: return 7582;\n\t\t\tcase GreenBanner::GreenBanner(14).ID: return 7583;\n\t\t\tcase GreenBanner::GreenBanner(15).ID: return 7584;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Head).ID: return 1256;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Foot).ID: return 1257;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Head).ID: return 1258;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Foot).ID: return 1259;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Head).ID: return 1260;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Foot).ID: return 1261;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Head).ID: return 1262;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Foot).ID: return 1263;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Head).ID: return 1264;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Foot).ID: return 1265;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Head).ID: return 1266;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Foot).ID: return 1267;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Head).ID: return 1268;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Foot).ID: return 1269;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Head).ID: return 1270;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Foot).ID: return 1271;\n\t\t\tcase GreenCarpet::GreenCarpet().ID: return 7343;\n\t\t\tcase GreenConcrete::GreenConcrete().ID: return 8915;\n\t\t\tcase GreenConcretePowder::GreenConcretePowder().ID: return 8931;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8890;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8891;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8892;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8893;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8820;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8821;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8822;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8823;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8824;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8825;\n\t\t\tcase GreenStainedGlass::GreenStainedGlass().ID: return 4094;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, true).ID: return 6745;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, false).ID: return 6746;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, true).ID: return 6749;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, false).ID: return 6750;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, true).ID: return 6753;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, false).ID: return 6754;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, true).ID: return 6757;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, false).ID: return 6758;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, true).ID: return 6761;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, false).ID: return 6762;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, true).ID: return 6765;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, false).ID: return 6766;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, true).ID: return 6769;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, false).ID: return 6770;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, true).ID: return 6773;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, false).ID: return 6774;\n\t\t\tcase GreenTerracotta::GreenTerracotta().ID: return 6324;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7669;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7670;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7671;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7672;\n\t\t\tcase GreenWool::GreenWool().ID: return 1396;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_ZM).ID: return 11165;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_ZP).ID: return 11166;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_XM).ID: return 11167;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_XP).ID: return 11168;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_ZM).ID: return 11169;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_ZP).ID: return 11170;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_XM).ID: return 11171;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_XP).ID: return 11172;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM).ID: return 11173;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP).ID: return 11174;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_XM).ID: return 11175;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_XP).ID: return 11176;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::X).ID: return 7327;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Y).ID: return 7328;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Z).ID: return 7329;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(0).ID: return 6126;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(1).ID: return 6127;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(2).ID: return 6128;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(3).ID: return 6129;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(4).ID: return 6130;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(5).ID: return 6131;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(6).ID: return 6132;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(7).ID: return 6133;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(8).ID: return 6134;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(9).ID: return 6135;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(10).ID: return 6136;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(11).ID: return 6137;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(12).ID: return 6138;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(13).ID: return 6139;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(14).ID: return 6140;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(15).ID: return 6141;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_YM).ID: return 6192;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZM).ID: return 6193;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZP).ID: return 6194;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XM).ID: return 6195;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XP).ID: return 6196;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_YM).ID: return 6197;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZM).ID: return 6198;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZP).ID: return 6199;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XM).ID: return 6200;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XP).ID: return 6201;\n\t\t\tcase HornCoral::HornCoral().ID: return 9003;\n\t\t\tcase HornCoralBlock::HornCoralBlock().ID: return 8983;\n\t\t\tcase HornCoralFan::HornCoralFan().ID: return 9023;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9097;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9099;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9101;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9103;\n\t\t\tcase Ice::Ice().ID: return 3927;\n\t\t\tcase InfestedChiseledStoneBricks::InfestedChiseledStoneBricks().ID: return 4490;\n\t\t\tcase InfestedCobblestone::InfestedCobblestone().ID: return 4486;\n\t\t\tcase InfestedCrackedStoneBricks::InfestedCrackedStoneBricks().ID: return 4489;\n\t\t\tcase InfestedMossyStoneBricks::InfestedMossyStoneBricks().ID: return 4488;\n\t\t\tcase InfestedStone::InfestedStone().ID: return 4485;\n\t\t\tcase InfestedStoneBricks::InfestedStoneBricks().ID: return 4487;\n\t\t\tcase IronBars::IronBars(true, true, true, true).ID: return 4685;\n\t\t\tcase IronBars::IronBars(true, true, true, false).ID: return 4686;\n\t\t\tcase IronBars::IronBars(true, true, false, true).ID: return 4689;\n\t\t\tcase IronBars::IronBars(true, true, false, false).ID: return 4690;\n\t\t\tcase IronBars::IronBars(true, false, true, true).ID: return 4693;\n\t\t\tcase IronBars::IronBars(true, false, true, false).ID: return 4694;\n\t\t\tcase IronBars::IronBars(true, false, false, true).ID: return 4697;\n\t\t\tcase IronBars::IronBars(true, false, false, false).ID: return 4698;\n\t\t\tcase IronBars::IronBars(false, true, true, true).ID: return 4701;\n\t\t\tcase IronBars::IronBars(false, true, true, false).ID: return 4702;\n\t\t\tcase IronBars::IronBars(false, true, false, true).ID: return 4705;\n\t\t\tcase IronBars::IronBars(false, true, false, false).ID: return 4706;\n\t\t\tcase IronBars::IronBars(false, false, true, true).ID: return 4709;\n\t\t\tcase IronBars::IronBars(false, false, true, false).ID: return 4710;\n\t\t\tcase IronBars::IronBars(false, false, false, true).ID: return 4713;\n\t\t\tcase IronBars::IronBars(false, false, false, false).ID: return 4714;\n\t\t\tcase IronBlock::IronBlock().ID: return 1427;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3807;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3808;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3809;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3810;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3811;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3812;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3813;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3814;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3815;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3816;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3817;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3818;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3819;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3820;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3821;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3822;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3823;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3824;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3825;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3826;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3827;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3828;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3829;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3830;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3831;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3832;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3833;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3834;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3835;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3836;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3837;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3838;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3839;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3840;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3841;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3842;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3843;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3844;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3845;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3846;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3847;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3848;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3849;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3850;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3851;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3852;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3853;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3854;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3855;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3856;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3857;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3858;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3859;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3860;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3861;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3862;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3863;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3864;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3865;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3866;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3867;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3868;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3869;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3870;\n\t\t\tcase IronOre::IronOre().ID: return 70;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, true).ID: return 7002;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, false).ID: return 7004;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, true).ID: return 7006;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, false).ID: return 7008;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, true).ID: return 7010;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, false).ID: return 7012;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, true).ID: return 7014;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, false).ID: return 7016;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, true).ID: return 7018;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, false).ID: return 7020;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, true).ID: return 7022;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, false).ID: return 7024;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, true).ID: return 7026;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, false).ID: return 7028;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, true).ID: return 7030;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, false).ID: return 7032;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, true).ID: return 7034;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, false).ID: return 7036;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, true).ID: return 7038;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, false).ID: return 7040;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, true).ID: return 7042;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, false).ID: return 7044;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, true).ID: return 7046;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, false).ID: return 7048;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, true).ID: return 7050;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, false).ID: return 7052;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, true).ID: return 7054;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, false).ID: return 7056;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, true).ID: return 7058;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, false).ID: return 7060;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, true).ID: return 7062;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, false).ID: return 7064;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZM).ID: return 4006;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZP).ID: return 4007;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XM).ID: return 4008;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XP).ID: return 4009;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::NorthUp).ID: return 11256;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::EastUp).ID: return 11257;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::SouthUp).ID: return 11258;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::WestUp).ID: return 11259;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::UpSouth).ID: return 11260;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::DownSouth).ID: return 11261;\n\t\t\tcase Jukebox::Jukebox(true).ID: return 3962;\n\t\t\tcase Jukebox::Jukebox(false).ID: return 3963;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5882;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5883;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5884;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5885;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5886;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5887;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5888;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5889;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5890;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5891;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5892;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5893;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5894;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5895;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5896;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5897;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5898;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5899;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5900;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5901;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5902;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5903;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5904;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5905;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8330;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8331;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8332;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8333;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8334;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8335;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8336;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8337;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8338;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8339;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8340;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8341;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8342;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8343;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8344;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8345;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8346;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8347;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8348;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8349;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8350;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8351;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8352;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8353;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8354;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8355;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8356;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8357;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8358;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8359;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8360;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8361;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8362;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8363;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8364;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8365;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8366;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8367;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8368;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8369;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8370;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8371;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8372;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8373;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8374;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8375;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8376;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8377;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8378;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8379;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8380;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8381;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8382;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8383;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8384;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8385;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8386;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8387;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8388;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8389;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8390;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8391;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8392;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8393;\n\t\t\tcase JungleFence::JungleFence(true, true, true, true).ID: return 8108;\n\t\t\tcase JungleFence::JungleFence(true, true, true, false).ID: return 8109;\n\t\t\tcase JungleFence::JungleFence(true, true, false, true).ID: return 8112;\n\t\t\tcase JungleFence::JungleFence(true, true, false, false).ID: return 8113;\n\t\t\tcase JungleFence::JungleFence(true, false, true, true).ID: return 8116;\n\t\t\tcase JungleFence::JungleFence(true, false, true, false).ID: return 8117;\n\t\t\tcase JungleFence::JungleFence(true, false, false, true).ID: return 8120;\n\t\t\tcase JungleFence::JungleFence(true, false, false, false).ID: return 8121;\n\t\t\tcase JungleFence::JungleFence(false, true, true, true).ID: return 8124;\n\t\t\tcase JungleFence::JungleFence(false, true, true, false).ID: return 8125;\n\t\t\tcase JungleFence::JungleFence(false, true, false, true).ID: return 8128;\n\t\t\tcase JungleFence::JungleFence(false, true, false, false).ID: return 8129;\n\t\t\tcase JungleFence::JungleFence(false, false, true, true).ID: return 8132;\n\t\t\tcase JungleFence::JungleFence(false, false, true, false).ID: return 8133;\n\t\t\tcase JungleFence::JungleFence(false, false, false, true).ID: return 8136;\n\t\t\tcase JungleFence::JungleFence(false, false, false, false).ID: return 8137;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7946;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7947;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7948;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7949;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7950;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7951;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7952;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7953;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7954;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7955;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7956;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7957;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7958;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7959;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7960;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7961;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7962;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7963;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7964;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7965;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7966;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7967;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7968;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7969;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7970;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7971;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7972;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7973;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7974;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7975;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7976;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7977;\n\t\t\tcase JungleLeaves::JungleLeaves(1, true).ID: return 186;\n\t\t\tcase JungleLeaves::JungleLeaves(1, false).ID: return 187;\n\t\t\tcase JungleLeaves::JungleLeaves(2, true).ID: return 188;\n\t\t\tcase JungleLeaves::JungleLeaves(2, false).ID: return 189;\n\t\t\tcase JungleLeaves::JungleLeaves(3, true).ID: return 190;\n\t\t\tcase JungleLeaves::JungleLeaves(3, false).ID: return 191;\n\t\t\tcase JungleLeaves::JungleLeaves(4, true).ID: return 192;\n\t\t\tcase JungleLeaves::JungleLeaves(4, false).ID: return 193;\n\t\t\tcase JungleLeaves::JungleLeaves(5, true).ID: return 194;\n\t\t\tcase JungleLeaves::JungleLeaves(5, false).ID: return 195;\n\t\t\tcase JungleLeaves::JungleLeaves(6, true).ID: return 196;\n\t\t\tcase JungleLeaves::JungleLeaves(6, false).ID: return 197;\n\t\t\tcase JungleLeaves::JungleLeaves(7, true).ID: return 198;\n\t\t\tcase JungleLeaves::JungleLeaves(7, false).ID: return 199;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::X).ID: return 81;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Y).ID: return 82;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Z).ID: return 83;\n\t\t\tcase JunglePlanks::JunglePlanks().ID: return 18;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(true).ID: return 3877;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(false).ID: return 3878;\n\t\t\tcase JungleSapling::JungleSapling(0).ID: return 27;\n\t\t\tcase JungleSapling::JungleSapling(1).ID: return 28;\n\t\t\tcase JungleSign::JungleSign(0).ID: return 3508;\n\t\t\tcase JungleSign::JungleSign(1).ID: return 3510;\n\t\t\tcase JungleSign::JungleSign(2).ID: return 3512;\n\t\t\tcase JungleSign::JungleSign(3).ID: return 3514;\n\t\t\tcase JungleSign::JungleSign(4).ID: return 3516;\n\t\t\tcase JungleSign::JungleSign(5).ID: return 3518;\n\t\t\tcase JungleSign::JungleSign(6).ID: return 3520;\n\t\t\tcase JungleSign::JungleSign(7).ID: return 3522;\n\t\t\tcase JungleSign::JungleSign(8).ID: return 3524;\n\t\t\tcase JungleSign::JungleSign(9).ID: return 3526;\n\t\t\tcase JungleSign::JungleSign(10).ID: return 3528;\n\t\t\tcase JungleSign::JungleSign(11).ID: return 3530;\n\t\t\tcase JungleSign::JungleSign(12).ID: return 3532;\n\t\t\tcase JungleSign::JungleSign(13).ID: return 3534;\n\t\t\tcase JungleSign::JungleSign(14).ID: return 3536;\n\t\t\tcase JungleSign::JungleSign(15).ID: return 3538;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Top).ID: return 7783;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Bottom).ID: return 7785;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Double).ID: return 7787;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5549;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5551;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5553;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5555;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5557;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5559;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5561;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5563;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5565;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5567;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5569;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5571;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5573;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5575;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5577;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5579;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5581;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5583;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5585;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5587;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5589;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5591;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5593;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5595;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5597;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5599;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5601;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5603;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5605;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5607;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5609;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5611;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5613;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5615;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5617;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5619;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5621;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5623;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5625;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5627;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, true).ID: return 4290;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, false).ID: return 4292;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, true).ID: return 4294;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, false).ID: return 4296;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, true).ID: return 4298;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, false).ID: return 4300;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, true).ID: return 4302;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, false).ID: return 4304;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, true).ID: return 4306;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, false).ID: return 4308;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, true).ID: return 4310;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, false).ID: return 4312;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, true).ID: return 4314;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, false).ID: return 4316;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, true).ID: return 4318;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, false).ID: return 4320;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, true).ID: return 4322;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, false).ID: return 4324;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, true).ID: return 4326;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, false).ID: return 4328;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, true).ID: return 4330;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, false).ID: return 4332;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, true).ID: return 4334;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, false).ID: return 4336;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, true).ID: return 4338;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, false).ID: return 4340;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, true).ID: return 4342;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, false).ID: return 4344;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, true).ID: return 4346;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, false).ID: return 4348;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, true).ID: return 4350;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, false).ID: return 4352;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3766;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3768;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3770;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3772;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::X).ID: return 117;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Y).ID: return 118;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Z).ID: return 119;\n\t\t\tcase Kelp::Kelp(0).ID: return 8934;\n\t\t\tcase Kelp::Kelp(1).ID: return 8935;\n\t\t\tcase Kelp::Kelp(2).ID: return 8936;\n\t\t\tcase Kelp::Kelp(3).ID: return 8937;\n\t\t\tcase Kelp::Kelp(4).ID: return 8938;\n\t\t\tcase Kelp::Kelp(5).ID: return 8939;\n\t\t\tcase Kelp::Kelp(6).ID: return 8940;\n\t\t\tcase Kelp::Kelp(7).ID: return 8941;\n\t\t\tcase Kelp::Kelp(8).ID: return 8942;\n\t\t\tcase Kelp::Kelp(9).ID: return 8943;\n\t\t\tcase Kelp::Kelp(10).ID: return 8944;\n\t\t\tcase Kelp::Kelp(11).ID: return 8945;\n\t\t\tcase Kelp::Kelp(12).ID: return 8946;\n\t\t\tcase Kelp::Kelp(13).ID: return 8947;\n\t\t\tcase Kelp::Kelp(14).ID: return 8948;\n\t\t\tcase Kelp::Kelp(15).ID: return 8949;\n\t\t\tcase Kelp::Kelp(16).ID: return 8950;\n\t\t\tcase Kelp::Kelp(17).ID: return 8951;\n\t\t\tcase Kelp::Kelp(18).ID: return 8952;\n\t\t\tcase Kelp::Kelp(19).ID: return 8953;\n\t\t\tcase Kelp::Kelp(20).ID: return 8954;\n\t\t\tcase Kelp::Kelp(21).ID: return 8955;\n\t\t\tcase Kelp::Kelp(22).ID: return 8956;\n\t\t\tcase Kelp::Kelp(23).ID: return 8957;\n\t\t\tcase Kelp::Kelp(24).ID: return 8958;\n\t\t\tcase Kelp::Kelp(25).ID: return 8959;\n\t\t\tcase KelpPlant::KelpPlant().ID: return 8960;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZM).ID: return 3636;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZP).ID: return 3638;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XM).ID: return 3640;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XP).ID: return 3642;\n\t\t\tcase Lantern::Lantern(true).ID: return 11214;\n\t\t\tcase Lantern::Lantern(false).ID: return 11215;\n\t\t\tcase LapisBlock::LapisBlock().ID: return 232;\n\t\t\tcase LapisOre::LapisOre().ID: return 231;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Upper).ID: return 7359;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Lower).ID: return 7360;\n\t\t\tcase Lava::Lava(0).ID: return 50;\n\t\t\tcase Lava::Lava(1).ID: return 51;\n\t\t\tcase Lava::Lava(2).ID: return 52;\n\t\t\tcase Lava::Lava(3).ID: return 53;\n\t\t\tcase Lava::Lava(4).ID: return 54;\n\t\t\tcase Lava::Lava(5).ID: return 55;\n\t\t\tcase Lava::Lava(6).ID: return 56;\n\t\t\tcase Lava::Lava(7).ID: return 57;\n\t\t\tcase Lava::Lava(8).ID: return 58;\n\t\t\tcase Lava::Lava(9).ID: return 59;\n\t\t\tcase Lava::Lava(10).ID: return 60;\n\t\t\tcase Lava::Lava(11).ID: return 61;\n\t\t\tcase Lava::Lava(12).ID: return 62;\n\t\t\tcase Lava::Lava(13).ID: return 63;\n\t\t\tcase Lava::Lava(14).ID: return 64;\n\t\t\tcase Lava::Lava(15).ID: return 65;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 11177;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 11178;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 11179;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 11180;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 11181;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 11182;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 11183;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 11184;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, true, true).ID: return 11185;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, true, false).ID: return 11186;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, false, true).ID: return 11187;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, false, false).ID: return 11188;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, true, true).ID: return 11189;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, true, false).ID: return 11190;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, false, true).ID: return 11191;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, false, false).ID: return 11192;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3781;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3782;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3783;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3784;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3785;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3786;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3787;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3788;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3789;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3790;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3791;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3792;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3793;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3794;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3795;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3796;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3797;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3798;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3799;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3800;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3801;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3802;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3803;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3804;\n\t\t\tcase LightBlueBanner::LightBlueBanner(0).ID: return 7409;\n\t\t\tcase LightBlueBanner::LightBlueBanner(1).ID: return 7410;\n\t\t\tcase LightBlueBanner::LightBlueBanner(2).ID: return 7411;\n\t\t\tcase LightBlueBanner::LightBlueBanner(3).ID: return 7412;\n\t\t\tcase LightBlueBanner::LightBlueBanner(4).ID: return 7413;\n\t\t\tcase LightBlueBanner::LightBlueBanner(5).ID: return 7414;\n\t\t\tcase LightBlueBanner::LightBlueBanner(6).ID: return 7415;\n\t\t\tcase LightBlueBanner::LightBlueBanner(7).ID: return 7416;\n\t\t\tcase LightBlueBanner::LightBlueBanner(8).ID: return 7417;\n\t\t\tcase LightBlueBanner::LightBlueBanner(9).ID: return 7418;\n\t\t\tcase LightBlueBanner::LightBlueBanner(10).ID: return 7419;\n\t\t\tcase LightBlueBanner::LightBlueBanner(11).ID: return 7420;\n\t\t\tcase LightBlueBanner::LightBlueBanner(12).ID: return 7421;\n\t\t\tcase LightBlueBanner::LightBlueBanner(13).ID: return 7422;\n\t\t\tcase LightBlueBanner::LightBlueBanner(14).ID: return 7423;\n\t\t\tcase LightBlueBanner::LightBlueBanner(15).ID: return 7424;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Head).ID: return 1096;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Foot).ID: return 1097;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Head).ID: return 1098;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Foot).ID: return 1099;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Head).ID: return 1100;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Foot).ID: return 1101;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Head).ID: return 1102;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Foot).ID: return 1103;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Head).ID: return 1104;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Foot).ID: return 1105;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Head).ID: return 1106;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Foot).ID: return 1107;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Head).ID: return 1108;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Foot).ID: return 1109;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Head).ID: return 1110;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Foot).ID: return 1111;\n\t\t\tcase LightBlueCarpet::LightBlueCarpet().ID: return 7333;\n\t\t\tcase LightBlueConcrete::LightBlueConcrete().ID: return 8905;\n\t\t\tcase LightBlueConcretePowder::LightBlueConcretePowder().ID: return 8921;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8850;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8851;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8852;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8853;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8760;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8761;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8762;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8763;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8764;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8765;\n\t\t\tcase LightBlueStainedGlass::LightBlueStainedGlass().ID: return 4084;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, true).ID: return 6425;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, false).ID: return 6426;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, true).ID: return 6429;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, false).ID: return 6430;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, true).ID: return 6433;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, false).ID: return 6434;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, true).ID: return 6437;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, false).ID: return 6438;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, true).ID: return 6441;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, false).ID: return 6442;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, true).ID: return 6445;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, false).ID: return 6446;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, true).ID: return 6449;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, false).ID: return 6450;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, true).ID: return 6453;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, false).ID: return 6454;\n\t\t\tcase LightBlueTerracotta::LightBlueTerracotta().ID: return 6314;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7629;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7630;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7631;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7632;\n\t\t\tcase LightBlueWool::LightBlueWool().ID: return 1386;\n\t\t\tcase LightGrayBanner::LightGrayBanner(0).ID: return 7489;\n\t\t\tcase LightGrayBanner::LightGrayBanner(1).ID: return 7490;\n\t\t\tcase LightGrayBanner::LightGrayBanner(2).ID: return 7491;\n\t\t\tcase LightGrayBanner::LightGrayBanner(3).ID: return 7492;\n\t\t\tcase LightGrayBanner::LightGrayBanner(4).ID: return 7493;\n\t\t\tcase LightGrayBanner::LightGrayBanner(5).ID: return 7494;\n\t\t\tcase LightGrayBanner::LightGrayBanner(6).ID: return 7495;\n\t\t\tcase LightGrayBanner::LightGrayBanner(7).ID: return 7496;\n\t\t\tcase LightGrayBanner::LightGrayBanner(8).ID: return 7497;\n\t\t\tcase LightGrayBanner::LightGrayBanner(9).ID: return 7498;\n\t\t\tcase LightGrayBanner::LightGrayBanner(10).ID: return 7499;\n\t\t\tcase LightGrayBanner::LightGrayBanner(11).ID: return 7500;\n\t\t\tcase LightGrayBanner::LightGrayBanner(12).ID: return 7501;\n\t\t\tcase LightGrayBanner::LightGrayBanner(13).ID: return 7502;\n\t\t\tcase LightGrayBanner::LightGrayBanner(14).ID: return 7503;\n\t\t\tcase LightGrayBanner::LightGrayBanner(15).ID: return 7504;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Head).ID: return 1176;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Foot).ID: return 1177;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Head).ID: return 1178;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Foot).ID: return 1179;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Head).ID: return 1180;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Foot).ID: return 1181;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Head).ID: return 1182;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Foot).ID: return 1183;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Head).ID: return 1184;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Foot).ID: return 1185;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Head).ID: return 1186;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Foot).ID: return 1187;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Head).ID: return 1188;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Foot).ID: return 1189;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Head).ID: return 1190;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Foot).ID: return 1191;\n\t\t\tcase LightGrayCarpet::LightGrayCarpet().ID: return 7338;\n\t\t\tcase LightGrayConcrete::LightGrayConcrete().ID: return 8910;\n\t\t\tcase LightGrayConcretePowder::LightGrayConcretePowder().ID: return 8926;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8870;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8871;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8872;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8873;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8790;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8791;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8792;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8793;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8794;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8795;\n\t\t\tcase LightGrayStainedGlass::LightGrayStainedGlass().ID: return 4089;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, true).ID: return 6585;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, false).ID: return 6586;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, true).ID: return 6589;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, false).ID: return 6590;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, true).ID: return 6593;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, false).ID: return 6594;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, true).ID: return 6597;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, false).ID: return 6598;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, true).ID: return 6601;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, false).ID: return 6602;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, true).ID: return 6605;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, false).ID: return 6606;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, true).ID: return 6609;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, false).ID: return 6610;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, true).ID: return 6613;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, false).ID: return 6614;\n\t\t\tcase LightGrayTerracotta::LightGrayTerracotta().ID: return 6319;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7649;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7650;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7651;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7652;\n\t\t\tcase LightGrayWool::LightGrayWool().ID: return 1391;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(0).ID: return 6110;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(1).ID: return 6111;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(2).ID: return 6112;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(3).ID: return 6113;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(4).ID: return 6114;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(5).ID: return 6115;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(6).ID: return 6116;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(7).ID: return 6117;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(8).ID: return 6118;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(9).ID: return 6119;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(10).ID: return 6120;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(11).ID: return 6121;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(12).ID: return 6122;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(13).ID: return 6123;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(14).ID: return 6124;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(15).ID: return 6125;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Upper).ID: return 7351;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Lower).ID: return 7352;\n\t\t\tcase LilyOfTheValley::LilyOfTheValley().ID: return 1423;\n\t\t\tcase LilyPad::LilyPad().ID: return 4998;\n\t\t\tcase LimeBanner::LimeBanner(0).ID: return 7441;\n\t\t\tcase LimeBanner::LimeBanner(1).ID: return 7442;\n\t\t\tcase LimeBanner::LimeBanner(2).ID: return 7443;\n\t\t\tcase LimeBanner::LimeBanner(3).ID: return 7444;\n\t\t\tcase LimeBanner::LimeBanner(4).ID: return 7445;\n\t\t\tcase LimeBanner::LimeBanner(5).ID: return 7446;\n\t\t\tcase LimeBanner::LimeBanner(6).ID: return 7447;\n\t\t\tcase LimeBanner::LimeBanner(7).ID: return 7448;\n\t\t\tcase LimeBanner::LimeBanner(8).ID: return 7449;\n\t\t\tcase LimeBanner::LimeBanner(9).ID: return 7450;\n\t\t\tcase LimeBanner::LimeBanner(10).ID: return 7451;\n\t\t\tcase LimeBanner::LimeBanner(11).ID: return 7452;\n\t\t\tcase LimeBanner::LimeBanner(12).ID: return 7453;\n\t\t\tcase LimeBanner::LimeBanner(13).ID: return 7454;\n\t\t\tcase LimeBanner::LimeBanner(14).ID: return 7455;\n\t\t\tcase LimeBanner::LimeBanner(15).ID: return 7456;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Head).ID: return 1128;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Foot).ID: return 1129;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Head).ID: return 1130;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Foot).ID: return 1131;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Head).ID: return 1132;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Foot).ID: return 1133;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Head).ID: return 1134;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Foot).ID: return 1135;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Head).ID: return 1136;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Foot).ID: return 1137;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Head).ID: return 1138;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Foot).ID: return 1139;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Head).ID: return 1140;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Foot).ID: return 1141;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Head).ID: return 1142;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Foot).ID: return 1143;\n\t\t\tcase LimeCarpet::LimeCarpet().ID: return 7335;\n\t\t\tcase LimeConcrete::LimeConcrete().ID: return 8907;\n\t\t\tcase LimeConcretePowder::LimeConcretePowder().ID: return 8923;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8858;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8859;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8860;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8861;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8772;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8773;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8774;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8775;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8776;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8777;\n\t\t\tcase LimeStainedGlass::LimeStainedGlass().ID: return 4086;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, true).ID: return 6489;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, false).ID: return 6490;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, true).ID: return 6493;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, false).ID: return 6494;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, true).ID: return 6497;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, false).ID: return 6498;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, true).ID: return 6501;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, false).ID: return 6502;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, true).ID: return 6505;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, false).ID: return 6506;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, true).ID: return 6509;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, false).ID: return 6510;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, true).ID: return 6513;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, false).ID: return 6514;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, true).ID: return 6517;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, false).ID: return 6518;\n\t\t\tcase LimeTerracotta::LimeTerracotta().ID: return 6316;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7637;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7638;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7639;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7640;\n\t\t\tcase LimeWool::LimeWool().ID: return 1388;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_ZM).ID: return 11131;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_ZP).ID: return 11132;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_XM).ID: return 11133;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_XP).ID: return 11134;\n\t\t\tcase MagentaBanner::MagentaBanner(0).ID: return 7393;\n\t\t\tcase MagentaBanner::MagentaBanner(1).ID: return 7394;\n\t\t\tcase MagentaBanner::MagentaBanner(2).ID: return 7395;\n\t\t\tcase MagentaBanner::MagentaBanner(3).ID: return 7396;\n\t\t\tcase MagentaBanner::MagentaBanner(4).ID: return 7397;\n\t\t\tcase MagentaBanner::MagentaBanner(5).ID: return 7398;\n\t\t\tcase MagentaBanner::MagentaBanner(6).ID: return 7399;\n\t\t\tcase MagentaBanner::MagentaBanner(7).ID: return 7400;\n\t\t\tcase MagentaBanner::MagentaBanner(8).ID: return 7401;\n\t\t\tcase MagentaBanner::MagentaBanner(9).ID: return 7402;\n\t\t\tcase MagentaBanner::MagentaBanner(10).ID: return 7403;\n\t\t\tcase MagentaBanner::MagentaBanner(11).ID: return 7404;\n\t\t\tcase MagentaBanner::MagentaBanner(12).ID: return 7405;\n\t\t\tcase MagentaBanner::MagentaBanner(13).ID: return 7406;\n\t\t\tcase MagentaBanner::MagentaBanner(14).ID: return 7407;\n\t\t\tcase MagentaBanner::MagentaBanner(15).ID: return 7408;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Head).ID: return 1080;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Foot).ID: return 1081;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Head).ID: return 1082;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Foot).ID: return 1083;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Head).ID: return 1084;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Foot).ID: return 1085;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Head).ID: return 1086;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Foot).ID: return 1087;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Head).ID: return 1088;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Foot).ID: return 1089;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Head).ID: return 1090;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Foot).ID: return 1091;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Head).ID: return 1092;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Foot).ID: return 1093;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Head).ID: return 1094;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Foot).ID: return 1095;\n\t\t\tcase MagentaCarpet::MagentaCarpet().ID: return 7332;\n\t\t\tcase MagentaConcrete::MagentaConcrete().ID: return 8904;\n\t\t\tcase MagentaConcretePowder::MagentaConcretePowder().ID: return 8920;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8846;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8847;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8848;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8849;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8754;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8755;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8756;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8757;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8758;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8759;\n\t\t\tcase MagentaStainedGlass::MagentaStainedGlass().ID: return 4083;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, true).ID: return 6393;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, false).ID: return 6394;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, true).ID: return 6397;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, false).ID: return 6398;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, true).ID: return 6401;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, false).ID: return 6402;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, true).ID: return 6405;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, false).ID: return 6406;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, true).ID: return 6409;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, false).ID: return 6410;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, true).ID: return 6413;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, false).ID: return 6414;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, true).ID: return 6417;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, false).ID: return 6418;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, true).ID: return 6421;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, false).ID: return 6422;\n\t\t\tcase MagentaTerracotta::MagentaTerracotta().ID: return 6313;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7625;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7626;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7627;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7628;\n\t\t\tcase MagentaWool::MagentaWool().ID: return 1385;\n\t\t\tcase MagmaBlock::MagmaBlock().ID: return 8717;\n\t\t\tcase Melon::Melon().ID: return 4747;\n\t\t\tcase MelonStem::MelonStem(0).ID: return 4764;\n\t\t\tcase MelonStem::MelonStem(1).ID: return 4765;\n\t\t\tcase MelonStem::MelonStem(2).ID: return 4766;\n\t\t\tcase MelonStem::MelonStem(3).ID: return 4767;\n\t\t\tcase MelonStem::MelonStem(4).ID: return 4768;\n\t\t\tcase MelonStem::MelonStem(5).ID: return 4769;\n\t\t\tcase MelonStem::MelonStem(6).ID: return 4770;\n\t\t\tcase MelonStem::MelonStem(7).ID: return 4771;\n\t\t\tcase MossyCobblestone::MossyCobblestone().ID: return 1432;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Top).ID: return 10278;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Bottom).ID: return 10280;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Double).ID: return 10282;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9454;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9456;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9458;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9460;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9462;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 9464;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9466;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9468;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9470;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9472;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9474;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9476;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9478;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9480;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9482;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 9484;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9486;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9488;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9490;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9492;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9494;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9496;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9498;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9500;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9502;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 9504;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9506;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9508;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9510;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9512;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9514;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9516;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9518;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9520;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9522;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 9524;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9526;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9528;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9530;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9532;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5707;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5708;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5711;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5712;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5715;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5716;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5719;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5720;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5723;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5724;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5727;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5728;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5731;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5732;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5735;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5736;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5739;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5740;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5743;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5744;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5747;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5748;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5751;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5752;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5755;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5756;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5759;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5760;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5763;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5764;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5767;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5768;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Top).ID: return 10266;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Bottom).ID: return 10268;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Double).ID: return 10270;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9294;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9296;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9298;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9300;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9302;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9304;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9306;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9308;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9310;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9312;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9314;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9316;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9318;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9320;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9322;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9324;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9326;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9328;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9330;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9332;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9334;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9336;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9338;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9340;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9342;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9344;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9346;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9348;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9350;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9352;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9354;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9356;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9358;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9360;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9362;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9364;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9366;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9368;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9370;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9372;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 10525;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 10526;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 10529;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 10530;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 10533;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 10534;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 10537;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 10538;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 10541;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 10542;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 10545;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 10546;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 10549;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 10550;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 10553;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 10554;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 10557;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 10558;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 10561;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 10562;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 10565;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 10566;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 10569;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 10570;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 10573;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 10574;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 10577;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 10578;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 10581;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 10582;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 10585;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 10586;\n\t\t\tcase MossyStoneBricks::MossyStoneBricks().ID: return 4482;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Normal).ID: return 1399;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Sticky).ID: return 1400;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Normal).ID: return 1401;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Sticky).ID: return 1402;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Normal).ID: return 1403;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Sticky).ID: return 1404;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Normal).ID: return 1405;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Sticky).ID: return 1406;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Normal).ID: return 1407;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Sticky).ID: return 1408;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Normal).ID: return 1409;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Sticky).ID: return 1410;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, true).ID: return 4619;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, false).ID: return 4620;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, true).ID: return 4621;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, false).ID: return 4622;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, true).ID: return 4623;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, false).ID: return 4624;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, true).ID: return 4625;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, false).ID: return 4626;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, true).ID: return 4627;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, false).ID: return 4628;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, true).ID: return 4629;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, false).ID: return 4630;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, true).ID: return 4631;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, false).ID: return 4632;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, true).ID: return 4633;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, false).ID: return 4634;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, true).ID: return 4635;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, false).ID: return 4636;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, true).ID: return 4637;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, false).ID: return 4638;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, true).ID: return 4639;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, false).ID: return 4640;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, true).ID: return 4641;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, false).ID: return 4642;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, true).ID: return 4643;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, false).ID: return 4644;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, true).ID: return 4645;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, false).ID: return 4646;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, true).ID: return 4647;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, false).ID: return 4648;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, true).ID: return 4649;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, false).ID: return 4650;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, true).ID: return 4651;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, false).ID: return 4652;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, true).ID: return 4653;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, false).ID: return 4654;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, true).ID: return 4655;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, false).ID: return 4656;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, true).ID: return 4657;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, false).ID: return 4658;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, true).ID: return 4659;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, false).ID: return 4660;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, true).ID: return 4661;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, false).ID: return 4662;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, true).ID: return 4663;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, false).ID: return 4664;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, true).ID: return 4665;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, false).ID: return 4666;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, true).ID: return 4667;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, false).ID: return 4668;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, true).ID: return 4669;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, false).ID: return 4670;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, true).ID: return 4671;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, false).ID: return 4672;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, true).ID: return 4673;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, false).ID: return 4674;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, true).ID: return 4675;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, false).ID: return 4676;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, true).ID: return 4677;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, false).ID: return 4678;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, true).ID: return 4679;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, false).ID: return 4680;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, true).ID: return 4681;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, false).ID: return 4682;\n\t\t\tcase Mycelium::Mycelium(true).ID: return 4996;\n\t\t\tcase Mycelium::Mycelium(false).ID: return 4997;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, true).ID: return 5002;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, false).ID: return 5003;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, true).ID: return 5006;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, false).ID: return 5007;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, true).ID: return 5010;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, false).ID: return 5011;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, true).ID: return 5014;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, false).ID: return 5015;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, true).ID: return 5018;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, false).ID: return 5019;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, true).ID: return 5022;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, false).ID: return 5023;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, true).ID: return 5026;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, false).ID: return 5027;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, true).ID: return 5030;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, false).ID: return 5031;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Top).ID: return 7849;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Bottom).ID: return 7851;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Double).ID: return 7853;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5033;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5035;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5037;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5039;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5041;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5043;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5045;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5047;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5049;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5051;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5053;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5055;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5057;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5059;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5061;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5063;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5065;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5067;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5069;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5071;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5073;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5075;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5077;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5079;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5081;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5083;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5085;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5087;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5089;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5091;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5093;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5095;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5097;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5099;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5101;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5103;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5105;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5107;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5109;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5111;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 10717;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 10718;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 10721;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 10722;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 10725;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 10726;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 10729;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 10730;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 10733;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 10734;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 10737;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 10738;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 10741;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 10742;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 10745;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 10746;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 10749;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 10750;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 10753;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 10754;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 10757;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 10758;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 10761;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 10762;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 10765;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 10766;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 10769;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 10770;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 10773;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 10774;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 10777;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 10778;\n\t\t\tcase NetherBricks::NetherBricks().ID: return 4999;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::X).ID: return 4000;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::Z).ID: return 4001;\n\t\t\tcase NetherQuartzOre::NetherQuartzOre().ID: return 6191;\n\t\t\tcase NetherWart::NetherWart(0).ID: return 5112;\n\t\t\tcase NetherWart::NetherWart(1).ID: return 5113;\n\t\t\tcase NetherWart::NetherWart(2).ID: return 5114;\n\t\t\tcase NetherWart::NetherWart(3).ID: return 5115;\n\t\t\tcase NetherWartBlock::NetherWartBlock().ID: return 8718;\n\t\t\tcase Netherrack::Netherrack().ID: return 3997;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, true).ID: return 248;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, false).ID: return 249;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, true).ID: return 250;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, false).ID: return 251;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, true).ID: return 252;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, false).ID: return 253;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, true).ID: return 254;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, false).ID: return 255;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, true).ID: return 256;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, false).ID: return 257;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, true).ID: return 258;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, false).ID: return 259;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, true).ID: return 260;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, false).ID: return 261;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, true).ID: return 262;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, false).ID: return 263;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, true).ID: return 264;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, false).ID: return 265;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, true).ID: return 266;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, false).ID: return 267;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, true).ID: return 268;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, false).ID: return 269;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, true).ID: return 270;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, false).ID: return 271;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, true).ID: return 272;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, false).ID: return 273;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, true).ID: return 274;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, false).ID: return 275;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, true).ID: return 276;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, false).ID: return 277;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, true).ID: return 278;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, false).ID: return 279;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, true).ID: return 280;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, false).ID: return 281;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, true).ID: return 282;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, false).ID: return 283;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, true).ID: return 284;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, false).ID: return 285;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, true).ID: return 286;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, false).ID: return 287;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, true).ID: return 288;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, false).ID: return 289;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, true).ID: return 290;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, false).ID: return 291;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, true).ID: return 292;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, false).ID: return 293;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, true).ID: return 294;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, false).ID: return 295;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, true).ID: return 296;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, false).ID: return 297;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, true).ID: return 298;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, false).ID: return 299;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, true).ID: return 300;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, false).ID: return 301;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, true).ID: return 302;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, false).ID: return 303;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, true).ID: return 304;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, false).ID: return 305;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, true).ID: return 306;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, false).ID: return 307;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, true).ID: return 308;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, false).ID: return 309;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, true).ID: return 310;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, false).ID: return 311;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, true).ID: return 312;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, false).ID: return 313;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, true).ID: return 314;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, false).ID: return 315;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, true).ID: return 316;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, false).ID: return 317;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, true).ID: return 318;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, false).ID: return 319;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, true).ID: return 320;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, false).ID: return 321;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, true).ID: return 322;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, false).ID: return 323;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, true).ID: return 324;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, false).ID: return 325;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, true).ID: return 326;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, false).ID: return 327;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, true).ID: return 328;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, false).ID: return 329;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, true).ID: return 330;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, false).ID: return 331;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, true).ID: return 332;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, false).ID: return 333;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, true).ID: return 334;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, false).ID: return 335;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, true).ID: return 336;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, false).ID: return 337;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, true).ID: return 338;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, false).ID: return 339;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, true).ID: return 340;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, false).ID: return 341;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, true).ID: return 342;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, false).ID: return 343;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, true).ID: return 344;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, false).ID: return 345;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, true).ID: return 346;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, false).ID: return 347;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, true).ID: return 348;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, false).ID: return 349;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, true).ID: return 350;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, false).ID: return 351;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, true).ID: return 352;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, false).ID: return 353;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, true).ID: return 354;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, false).ID: return 355;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, true).ID: return 356;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, false).ID: return 357;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, true).ID: return 358;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, false).ID: return 359;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, true).ID: return 360;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, false).ID: return 361;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, true).ID: return 362;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, false).ID: return 363;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, true).ID: return 364;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, false).ID: return 365;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, true).ID: return 366;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, false).ID: return 367;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, true).ID: return 368;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, false).ID: return 369;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, true).ID: return 370;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, false).ID: return 371;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, true).ID: return 372;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, false).ID: return 373;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, true).ID: return 374;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, false).ID: return 375;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, true).ID: return 376;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, false).ID: return 377;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, true).ID: return 378;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, false).ID: return 379;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, true).ID: return 380;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, false).ID: return 381;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, true).ID: return 382;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, false).ID: return 383;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, true).ID: return 384;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, false).ID: return 385;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, true).ID: return 386;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, false).ID: return 387;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, true).ID: return 388;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, false).ID: return 389;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, true).ID: return 390;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, false).ID: return 391;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, true).ID: return 392;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, false).ID: return 393;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, true).ID: return 394;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, false).ID: return 395;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, true).ID: return 396;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, false).ID: return 397;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, true).ID: return 398;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, false).ID: return 399;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, true).ID: return 400;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, false).ID: return 401;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, true).ID: return 402;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, false).ID: return 403;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, true).ID: return 404;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, false).ID: return 405;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, true).ID: return 406;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, false).ID: return 407;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, true).ID: return 408;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, false).ID: return 409;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, true).ID: return 410;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, false).ID: return 411;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, true).ID: return 412;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, false).ID: return 413;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, true).ID: return 414;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, false).ID: return 415;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, true).ID: return 416;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, false).ID: return 417;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, true).ID: return 418;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, false).ID: return 419;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, true).ID: return 420;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, false).ID: return 421;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, true).ID: return 422;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, false).ID: return 423;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, true).ID: return 424;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, false).ID: return 425;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, true).ID: return 426;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, false).ID: return 427;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, true).ID: return 428;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, false).ID: return 429;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, true).ID: return 430;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, false).ID: return 431;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, true).ID: return 432;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, false).ID: return 433;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, true).ID: return 434;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, false).ID: return 435;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, true).ID: return 436;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, false).ID: return 437;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, true).ID: return 438;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, false).ID: return 439;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, true).ID: return 440;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, false).ID: return 441;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, true).ID: return 442;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, false).ID: return 443;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, true).ID: return 444;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, false).ID: return 445;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, true).ID: return 446;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, false).ID: return 447;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, true).ID: return 448;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, false).ID: return 449;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, true).ID: return 450;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, false).ID: return 451;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, true).ID: return 452;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, false).ID: return 453;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, true).ID: return 454;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, false).ID: return 455;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, true).ID: return 456;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, false).ID: return 457;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, true).ID: return 458;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, false).ID: return 459;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, true).ID: return 460;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, false).ID: return 461;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, true).ID: return 462;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, false).ID: return 463;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, true).ID: return 464;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, false).ID: return 465;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, true).ID: return 466;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, false).ID: return 467;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, true).ID: return 468;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, false).ID: return 469;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, true).ID: return 470;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, false).ID: return 471;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, true).ID: return 472;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, false).ID: return 473;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, true).ID: return 474;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, false).ID: return 475;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, true).ID: return 476;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, false).ID: return 477;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, true).ID: return 478;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, false).ID: return 479;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, true).ID: return 480;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, false).ID: return 481;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, true).ID: return 482;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, false).ID: return 483;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, true).ID: return 484;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, false).ID: return 485;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, true).ID: return 486;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, false).ID: return 487;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, true).ID: return 488;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, false).ID: return 489;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, true).ID: return 490;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, false).ID: return 491;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, true).ID: return 492;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, false).ID: return 493;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, true).ID: return 494;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, false).ID: return 495;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, true).ID: return 496;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, false).ID: return 497;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, true).ID: return 498;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, false).ID: return 499;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, true).ID: return 500;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, false).ID: return 501;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, true).ID: return 502;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, false).ID: return 503;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, true).ID: return 504;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, false).ID: return 505;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, true).ID: return 506;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, false).ID: return 507;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, true).ID: return 508;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, false).ID: return 509;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, true).ID: return 510;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, false).ID: return 511;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, true).ID: return 512;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, false).ID: return 513;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, true).ID: return 514;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, false).ID: return 515;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, true).ID: return 516;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, false).ID: return 517;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, true).ID: return 518;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, false).ID: return 519;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, true).ID: return 520;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, false).ID: return 521;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, true).ID: return 522;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, false).ID: return 523;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, true).ID: return 524;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, false).ID: return 525;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, true).ID: return 526;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, false).ID: return 527;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, true).ID: return 528;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, false).ID: return 529;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, true).ID: return 530;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, false).ID: return 531;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, true).ID: return 532;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, false).ID: return 533;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, true).ID: return 534;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, false).ID: return 535;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, true).ID: return 536;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, false).ID: return 537;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, true).ID: return 538;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, false).ID: return 539;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, true).ID: return 540;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, false).ID: return 541;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, true).ID: return 542;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, false).ID: return 543;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, true).ID: return 544;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, false).ID: return 545;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, true).ID: return 546;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, false).ID: return 547;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, true).ID: return 548;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, false).ID: return 549;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, true).ID: return 550;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, false).ID: return 551;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, true).ID: return 552;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, false).ID: return 553;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, true).ID: return 554;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, false).ID: return 555;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, true).ID: return 556;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, false).ID: return 557;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, true).ID: return 558;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, false).ID: return 559;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, true).ID: return 560;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, false).ID: return 561;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, true).ID: return 562;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, false).ID: return 563;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, true).ID: return 564;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, false).ID: return 565;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, true).ID: return 566;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, false).ID: return 567;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, true).ID: return 568;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, false).ID: return 569;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, true).ID: return 570;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, false).ID: return 571;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, true).ID: return 572;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, false).ID: return 573;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, true).ID: return 574;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, false).ID: return 575;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, true).ID: return 576;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, false).ID: return 577;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, true).ID: return 578;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, false).ID: return 579;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, true).ID: return 580;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, false).ID: return 581;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, true).ID: return 582;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, false).ID: return 583;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, true).ID: return 584;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, false).ID: return 585;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, true).ID: return 586;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, false).ID: return 587;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, true).ID: return 588;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, false).ID: return 589;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, true).ID: return 590;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, false).ID: return 591;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, true).ID: return 592;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, false).ID: return 593;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, true).ID: return 594;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, false).ID: return 595;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, true).ID: return 596;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, false).ID: return 597;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, true).ID: return 598;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, false).ID: return 599;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, true).ID: return 600;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, false).ID: return 601;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, true).ID: return 602;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, false).ID: return 603;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, true).ID: return 604;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, false).ID: return 605;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, true).ID: return 606;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, false).ID: return 607;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, true).ID: return 608;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, false).ID: return 609;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, true).ID: return 610;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, false).ID: return 611;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, true).ID: return 612;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, false).ID: return 613;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, true).ID: return 614;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, false).ID: return 615;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, true).ID: return 616;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, false).ID: return 617;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, true).ID: return 618;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, false).ID: return 619;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, true).ID: return 620;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, false).ID: return 621;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, true).ID: return 622;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, false).ID: return 623;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, true).ID: return 624;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, false).ID: return 625;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, true).ID: return 626;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, false).ID: return 627;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, true).ID: return 628;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, false).ID: return 629;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, true).ID: return 630;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, false).ID: return 631;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, true).ID: return 632;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, false).ID: return 633;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, true).ID: return 634;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, false).ID: return 635;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, true).ID: return 636;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, false).ID: return 637;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, true).ID: return 638;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, false).ID: return 639;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, true).ID: return 640;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, false).ID: return 641;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, true).ID: return 642;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, false).ID: return 643;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, true).ID: return 644;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, false).ID: return 645;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, true).ID: return 646;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, false).ID: return 647;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, true).ID: return 648;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, false).ID: return 649;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, true).ID: return 650;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, false).ID: return 651;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, true).ID: return 652;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, false).ID: return 653;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, true).ID: return 654;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, false).ID: return 655;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, true).ID: return 656;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, false).ID: return 657;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, true).ID: return 658;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, false).ID: return 659;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, true).ID: return 660;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, false).ID: return 661;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, true).ID: return 662;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, false).ID: return 663;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, true).ID: return 664;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, false).ID: return 665;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, true).ID: return 666;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, false).ID: return 667;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, true).ID: return 668;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, false).ID: return 669;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, true).ID: return 670;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, false).ID: return 671;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, true).ID: return 672;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, false).ID: return 673;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, true).ID: return 674;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, false).ID: return 675;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, true).ID: return 676;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, false).ID: return 677;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, true).ID: return 678;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, false).ID: return 679;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, true).ID: return 680;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, false).ID: return 681;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, true).ID: return 682;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, false).ID: return 683;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, true).ID: return 684;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, false).ID: return 685;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, true).ID: return 686;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, false).ID: return 687;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, true).ID: return 688;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, false).ID: return 689;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, true).ID: return 690;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, false).ID: return 691;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, true).ID: return 692;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, false).ID: return 693;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, true).ID: return 694;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, false).ID: return 695;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, true).ID: return 696;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, false).ID: return 697;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, true).ID: return 698;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, false).ID: return 699;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, true).ID: return 700;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, false).ID: return 701;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, true).ID: return 702;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, false).ID: return 703;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, true).ID: return 704;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, false).ID: return 705;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, true).ID: return 706;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, false).ID: return 707;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, true).ID: return 708;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, false).ID: return 709;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, true).ID: return 710;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, false).ID: return 711;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, true).ID: return 712;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, false).ID: return 713;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, true).ID: return 714;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, false).ID: return 715;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, true).ID: return 716;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, false).ID: return 717;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, true).ID: return 718;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, false).ID: return 719;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, true).ID: return 720;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, false).ID: return 721;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, true).ID: return 722;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, false).ID: return 723;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, true).ID: return 724;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, false).ID: return 725;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, true).ID: return 726;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, false).ID: return 727;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, true).ID: return 728;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, false).ID: return 729;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, true).ID: return 730;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, false).ID: return 731;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, true).ID: return 732;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, false).ID: return 733;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, true).ID: return 734;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, false).ID: return 735;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, true).ID: return 736;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, false).ID: return 737;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, true).ID: return 738;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, false).ID: return 739;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, true).ID: return 740;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, false).ID: return 741;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, true).ID: return 742;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, false).ID: return 743;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, true).ID: return 744;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, false).ID: return 745;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, true).ID: return 746;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, false).ID: return 747;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 0, true).ID: return 748;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 0, false).ID: return 749;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 1, true).ID: return 750;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 1, false).ID: return 751;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 2, true).ID: return 752;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 2, false).ID: return 753;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 3, true).ID: return 754;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 3, false).ID: return 755;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 4, true).ID: return 756;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 4, false).ID: return 757;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 5, true).ID: return 758;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 5, false).ID: return 759;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 6, true).ID: return 760;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 6, false).ID: return 761;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 7, true).ID: return 762;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 7, false).ID: return 763;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 8, true).ID: return 764;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 8, false).ID: return 765;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 9, true).ID: return 766;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 9, false).ID: return 767;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 10, true).ID: return 768;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 10, false).ID: return 769;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 11, true).ID: return 770;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 11, false).ID: return 771;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 12, true).ID: return 772;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 12, false).ID: return 773;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 13, true).ID: return 774;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 13, false).ID: return 775;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 14, true).ID: return 776;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 14, false).ID: return 777;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 15, true).ID: return 778;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 15, false).ID: return 779;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 16, true).ID: return 780;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 16, false).ID: return 781;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 17, true).ID: return 782;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 17, false).ID: return 783;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 18, true).ID: return 784;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 18, false).ID: return 785;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 19, true).ID: return 786;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 19, false).ID: return 787;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 20, true).ID: return 788;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 20, false).ID: return 789;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 21, true).ID: return 790;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 21, false).ID: return 791;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 22, true).ID: return 792;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 22, false).ID: return 793;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 23, true).ID: return 794;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 23, false).ID: return 795;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 24, true).ID: return 796;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 24, false).ID: return 797;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 0, true).ID: return 798;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 0, false).ID: return 799;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 1, true).ID: return 800;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 1, false).ID: return 801;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 2, true).ID: return 802;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 2, false).ID: return 803;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 3, true).ID: return 804;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 3, false).ID: return 805;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 4, true).ID: return 806;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 4, false).ID: return 807;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 5, true).ID: return 808;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 5, false).ID: return 809;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 6, true).ID: return 810;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 6, false).ID: return 811;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 7, true).ID: return 812;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 7, false).ID: return 813;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 8, true).ID: return 814;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 8, false).ID: return 815;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 9, true).ID: return 816;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 9, false).ID: return 817;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 10, true).ID: return 818;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 10, false).ID: return 819;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 11, true).ID: return 820;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 11, false).ID: return 821;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 12, true).ID: return 822;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 12, false).ID: return 823;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 13, true).ID: return 824;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 13, false).ID: return 825;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 14, true).ID: return 826;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 14, false).ID: return 827;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 15, true).ID: return 828;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 15, false).ID: return 829;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 16, true).ID: return 830;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 16, false).ID: return 831;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 17, true).ID: return 832;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 17, false).ID: return 833;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 18, true).ID: return 834;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 18, false).ID: return 835;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 19, true).ID: return 836;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 19, false).ID: return 837;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 20, true).ID: return 838;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 20, false).ID: return 839;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 21, true).ID: return 840;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 21, false).ID: return 841;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 22, true).ID: return 842;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 22, false).ID: return 843;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 23, true).ID: return 844;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 23, false).ID: return 845;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 24, true).ID: return 846;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 24, false).ID: return 847;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 0, true).ID: return 848;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 0, false).ID: return 849;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 1, true).ID: return 850;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 1, false).ID: return 851;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 2, true).ID: return 852;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 2, false).ID: return 853;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 3, true).ID: return 854;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 3, false).ID: return 855;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 4, true).ID: return 856;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 4, false).ID: return 857;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 5, true).ID: return 858;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 5, false).ID: return 859;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 6, true).ID: return 860;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 6, false).ID: return 861;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 7, true).ID: return 862;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 7, false).ID: return 863;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 8, true).ID: return 864;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 8, false).ID: return 865;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 9, true).ID: return 866;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 9, false).ID: return 867;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 10, true).ID: return 868;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 10, false).ID: return 869;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 11, true).ID: return 870;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 11, false).ID: return 871;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 12, true).ID: return 872;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 12, false).ID: return 873;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 13, true).ID: return 874;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 13, false).ID: return 875;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 14, true).ID: return 876;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 14, false).ID: return 877;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 15, true).ID: return 878;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 15, false).ID: return 879;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 16, true).ID: return 880;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 16, false).ID: return 881;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 17, true).ID: return 882;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 17, false).ID: return 883;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 18, true).ID: return 884;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 18, false).ID: return 885;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 19, true).ID: return 886;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 19, false).ID: return 887;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 20, true).ID: return 888;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 20, false).ID: return 889;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 21, true).ID: return 890;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 21, false).ID: return 891;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 22, true).ID: return 892;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 22, false).ID: return 893;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 23, true).ID: return 894;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 23, false).ID: return 895;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 24, true).ID: return 896;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 24, false).ID: return 897;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 0, true).ID: return 898;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 0, false).ID: return 899;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 1, true).ID: return 900;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 1, false).ID: return 901;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 2, true).ID: return 902;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 2, false).ID: return 903;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 3, true).ID: return 904;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 3, false).ID: return 905;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 4, true).ID: return 906;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 4, false).ID: return 907;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 5, true).ID: return 908;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 5, false).ID: return 909;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 6, true).ID: return 910;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 6, false).ID: return 911;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 7, true).ID: return 912;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 7, false).ID: return 913;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 8, true).ID: return 914;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 8, false).ID: return 915;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 9, true).ID: return 916;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 9, false).ID: return 917;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 10, true).ID: return 918;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 10, false).ID: return 919;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 11, true).ID: return 920;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 11, false).ID: return 921;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 12, true).ID: return 922;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 12, false).ID: return 923;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 13, true).ID: return 924;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 13, false).ID: return 925;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 14, true).ID: return 926;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 14, false).ID: return 927;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 15, true).ID: return 928;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 15, false).ID: return 929;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 16, true).ID: return 930;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 16, false).ID: return 931;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 17, true).ID: return 932;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 17, false).ID: return 933;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 18, true).ID: return 934;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 18, false).ID: return 935;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 19, true).ID: return 936;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 19, false).ID: return 937;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 20, true).ID: return 938;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 20, false).ID: return 939;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 21, true).ID: return 940;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 21, false).ID: return 941;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 22, true).ID: return 942;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 22, false).ID: return 943;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 23, true).ID: return 944;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 23, false).ID: return 945;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 24, true).ID: return 946;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 24, false).ID: return 947;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 0, true).ID: return 948;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 0, false).ID: return 949;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 1, true).ID: return 950;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 1, false).ID: return 951;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 2, true).ID: return 952;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 2, false).ID: return 953;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 3, true).ID: return 954;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 3, false).ID: return 955;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 4, true).ID: return 956;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 4, false).ID: return 957;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 5, true).ID: return 958;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 5, false).ID: return 959;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 6, true).ID: return 960;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 6, false).ID: return 961;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 7, true).ID: return 962;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 7, false).ID: return 963;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 8, true).ID: return 964;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 8, false).ID: return 965;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 9, true).ID: return 966;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 9, false).ID: return 967;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 10, true).ID: return 968;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 10, false).ID: return 969;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 11, true).ID: return 970;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 11, false).ID: return 971;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 12, true).ID: return 972;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 12, false).ID: return 973;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 13, true).ID: return 974;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 13, false).ID: return 975;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 14, true).ID: return 976;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 14, false).ID: return 977;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 15, true).ID: return 978;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 15, false).ID: return 979;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 16, true).ID: return 980;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 16, false).ID: return 981;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 17, true).ID: return 982;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 17, false).ID: return 983;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 18, true).ID: return 984;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 18, false).ID: return 985;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 19, true).ID: return 986;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 19, false).ID: return 987;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 20, true).ID: return 988;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 20, false).ID: return 989;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 21, true).ID: return 990;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 21, false).ID: return 991;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 22, true).ID: return 992;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 22, false).ID: return 993;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 23, true).ID: return 994;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 23, false).ID: return 995;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 24, true).ID: return 996;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 24, false).ID: return 997;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 0, true).ID: return 998;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 0, false).ID: return 999;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 1, true).ID: return 1000;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 1, false).ID: return 1001;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 2, true).ID: return 1002;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 2, false).ID: return 1003;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 3, true).ID: return 1004;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 3, false).ID: return 1005;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 4, true).ID: return 1006;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 4, false).ID: return 1007;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 5, true).ID: return 1008;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 5, false).ID: return 1009;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 6, true).ID: return 1010;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 6, false).ID: return 1011;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 7, true).ID: return 1012;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 7, false).ID: return 1013;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 8, true).ID: return 1014;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 8, false).ID: return 1015;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 9, true).ID: return 1016;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 9, false).ID: return 1017;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 10, true).ID: return 1018;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 10, false).ID: return 1019;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 11, true).ID: return 1020;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 11, false).ID: return 1021;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 12, true).ID: return 1022;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 12, false).ID: return 1023;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 13, true).ID: return 1024;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 13, false).ID: return 1025;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 14, true).ID: return 1026;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 14, false).ID: return 1027;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 15, true).ID: return 1028;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 15, false).ID: return 1029;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 16, true).ID: return 1030;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 16, false).ID: return 1031;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 17, true).ID: return 1032;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 17, false).ID: return 1033;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 18, true).ID: return 1034;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 18, false).ID: return 1035;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 19, true).ID: return 1036;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 19, false).ID: return 1037;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 20, true).ID: return 1038;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 20, false).ID: return 1039;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 21, true).ID: return 1040;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 21, false).ID: return 1041;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 22, true).ID: return 1042;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 22, false).ID: return 1043;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 23, true).ID: return 1044;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 23, false).ID: return 1045;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 24, true).ID: return 1046;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 24, false).ID: return 1047;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5810;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5811;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5812;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5813;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5814;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5815;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5816;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5817;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5818;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5819;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5820;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5821;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5822;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5823;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5824;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5825;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5826;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5827;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5828;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5829;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5830;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5831;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5832;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5833;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3571;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3572;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3573;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3574;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3575;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3576;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3577;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3578;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3579;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3580;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3581;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3582;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3583;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3584;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3585;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3586;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3587;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3588;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3589;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3590;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3591;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3592;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3593;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3594;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3595;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3596;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3597;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3598;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3599;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3600;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3601;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3602;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3603;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3604;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3605;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3606;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3607;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3608;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3609;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3610;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3611;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3612;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3613;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3614;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3615;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3616;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3617;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3618;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3619;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3620;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3621;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3622;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3623;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3624;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3625;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3626;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3627;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3628;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3629;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3630;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3631;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3632;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3633;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3634;\n\t\t\tcase OakFence::OakFence(true, true, true, true).ID: return 3966;\n\t\t\tcase OakFence::OakFence(true, true, true, false).ID: return 3967;\n\t\t\tcase OakFence::OakFence(true, true, false, true).ID: return 3970;\n\t\t\tcase OakFence::OakFence(true, true, false, false).ID: return 3971;\n\t\t\tcase OakFence::OakFence(true, false, true, true).ID: return 3974;\n\t\t\tcase OakFence::OakFence(true, false, true, false).ID: return 3975;\n\t\t\tcase OakFence::OakFence(true, false, false, true).ID: return 3978;\n\t\t\tcase OakFence::OakFence(true, false, false, false).ID: return 3979;\n\t\t\tcase OakFence::OakFence(false, true, true, true).ID: return 3982;\n\t\t\tcase OakFence::OakFence(false, true, true, false).ID: return 3983;\n\t\t\tcase OakFence::OakFence(false, true, false, true).ID: return 3986;\n\t\t\tcase OakFence::OakFence(false, true, false, false).ID: return 3987;\n\t\t\tcase OakFence::OakFence(false, false, true, true).ID: return 3990;\n\t\t\tcase OakFence::OakFence(false, false, true, false).ID: return 3991;\n\t\t\tcase OakFence::OakFence(false, false, false, true).ID: return 3994;\n\t\t\tcase OakFence::OakFence(false, false, false, false).ID: return 3995;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 4804;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 4805;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 4806;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 4807;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 4808;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 4809;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 4810;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 4811;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 4812;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 4813;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 4814;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 4815;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 4816;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 4817;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 4818;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 4819;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 4820;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 4821;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 4822;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 4823;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 4824;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 4825;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 4826;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 4827;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 4828;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 4829;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 4830;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 4831;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 4832;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 4833;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 4834;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 4835;\n\t\t\tcase OakLeaves::OakLeaves(1, true).ID: return 144;\n\t\t\tcase OakLeaves::OakLeaves(1, false).ID: return 145;\n\t\t\tcase OakLeaves::OakLeaves(2, true).ID: return 146;\n\t\t\tcase OakLeaves::OakLeaves(2, false).ID: return 147;\n\t\t\tcase OakLeaves::OakLeaves(3, true).ID: return 148;\n\t\t\tcase OakLeaves::OakLeaves(3, false).ID: return 149;\n\t\t\tcase OakLeaves::OakLeaves(4, true).ID: return 150;\n\t\t\tcase OakLeaves::OakLeaves(4, false).ID: return 151;\n\t\t\tcase OakLeaves::OakLeaves(5, true).ID: return 152;\n\t\t\tcase OakLeaves::OakLeaves(5, false).ID: return 153;\n\t\t\tcase OakLeaves::OakLeaves(6, true).ID: return 154;\n\t\t\tcase OakLeaves::OakLeaves(6, false).ID: return 155;\n\t\t\tcase OakLeaves::OakLeaves(7, true).ID: return 156;\n\t\t\tcase OakLeaves::OakLeaves(7, false).ID: return 157;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::X).ID: return 72;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Y).ID: return 73;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Z).ID: return 74;\n\t\t\tcase OakPlanks::OakPlanks().ID: return 15;\n\t\t\tcase OakPressurePlate::OakPressurePlate(true).ID: return 3871;\n\t\t\tcase OakPressurePlate::OakPressurePlate(false).ID: return 3872;\n\t\t\tcase OakSapling::OakSapling(0).ID: return 21;\n\t\t\tcase OakSapling::OakSapling(1).ID: return 22;\n\t\t\tcase OakSign::OakSign(0).ID: return 3380;\n\t\t\tcase OakSign::OakSign(1).ID: return 3382;\n\t\t\tcase OakSign::OakSign(2).ID: return 3384;\n\t\t\tcase OakSign::OakSign(3).ID: return 3386;\n\t\t\tcase OakSign::OakSign(4).ID: return 3388;\n\t\t\tcase OakSign::OakSign(5).ID: return 3390;\n\t\t\tcase OakSign::OakSign(6).ID: return 3392;\n\t\t\tcase OakSign::OakSign(7).ID: return 3394;\n\t\t\tcase OakSign::OakSign(8).ID: return 3396;\n\t\t\tcase OakSign::OakSign(9).ID: return 3398;\n\t\t\tcase OakSign::OakSign(10).ID: return 3400;\n\t\t\tcase OakSign::OakSign(11).ID: return 3402;\n\t\t\tcase OakSign::OakSign(12).ID: return 3404;\n\t\t\tcase OakSign::OakSign(13).ID: return 3406;\n\t\t\tcase OakSign::OakSign(14).ID: return 3408;\n\t\t\tcase OakSign::OakSign(15).ID: return 3410;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Top).ID: return 7765;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Bottom).ID: return 7767;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Double).ID: return 7769;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1953;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1955;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1957;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1959;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1961;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1963;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1965;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1967;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1969;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1971;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1973;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1975;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1977;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1979;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1981;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1983;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1985;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1987;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1989;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1991;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1993;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1995;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1997;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1999;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 2001;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 2003;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 2005;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 2007;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 2009;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 2011;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 2013;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 2015;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 2017;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 2019;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 2021;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 2023;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 2025;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 2027;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 2029;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 2031;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, true).ID: return 4098;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, false).ID: return 4100;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, true).ID: return 4102;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, false).ID: return 4104;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, true).ID: return 4106;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, false).ID: return 4108;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, true).ID: return 4110;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, false).ID: return 4112;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, true).ID: return 4114;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, false).ID: return 4116;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, true).ID: return 4118;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, false).ID: return 4120;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, true).ID: return 4122;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, false).ID: return 4124;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, true).ID: return 4126;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, false).ID: return 4128;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, true).ID: return 4130;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, false).ID: return 4132;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, true).ID: return 4134;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, false).ID: return 4136;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, true).ID: return 4138;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, false).ID: return 4140;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, true).ID: return 4142;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, false).ID: return 4144;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, true).ID: return 4146;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, false).ID: return 4148;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, true).ID: return 4150;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, false).ID: return 4152;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, true).ID: return 4154;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, false).ID: return 4156;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, true).ID: return 4158;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, false).ID: return 4160;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3734;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3736;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3738;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3740;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::X).ID: return 108;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Y).ID: return 109;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Z).ID: return 110;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, true).ID: return 8724;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, false).ID: return 8725;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, true).ID: return 8726;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, false).ID: return 8727;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, true).ID: return 8728;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, false).ID: return 8729;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, true).ID: return 8730;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, false).ID: return 8731;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, true).ID: return 8732;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, false).ID: return 8733;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, true).ID: return 8734;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, false).ID: return 8735;\n\t\t\tcase Obsidian::Obsidian().ID: return 1433;\n\t\t\tcase OrangeBanner::OrangeBanner(0).ID: return 7377;\n\t\t\tcase OrangeBanner::OrangeBanner(1).ID: return 7378;\n\t\t\tcase OrangeBanner::OrangeBanner(2).ID: return 7379;\n\t\t\tcase OrangeBanner::OrangeBanner(3).ID: return 7380;\n\t\t\tcase OrangeBanner::OrangeBanner(4).ID: return 7381;\n\t\t\tcase OrangeBanner::OrangeBanner(5).ID: return 7382;\n\t\t\tcase OrangeBanner::OrangeBanner(6).ID: return 7383;\n\t\t\tcase OrangeBanner::OrangeBanner(7).ID: return 7384;\n\t\t\tcase OrangeBanner::OrangeBanner(8).ID: return 7385;\n\t\t\tcase OrangeBanner::OrangeBanner(9).ID: return 7386;\n\t\t\tcase OrangeBanner::OrangeBanner(10).ID: return 7387;\n\t\t\tcase OrangeBanner::OrangeBanner(11).ID: return 7388;\n\t\t\tcase OrangeBanner::OrangeBanner(12).ID: return 7389;\n\t\t\tcase OrangeBanner::OrangeBanner(13).ID: return 7390;\n\t\t\tcase OrangeBanner::OrangeBanner(14).ID: return 7391;\n\t\t\tcase OrangeBanner::OrangeBanner(15).ID: return 7392;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Head).ID: return 1064;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Foot).ID: return 1065;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Head).ID: return 1066;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Foot).ID: return 1067;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Head).ID: return 1068;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Foot).ID: return 1069;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Head).ID: return 1070;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Foot).ID: return 1071;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Head).ID: return 1072;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Foot).ID: return 1073;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Head).ID: return 1074;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Foot).ID: return 1075;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Head).ID: return 1076;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Foot).ID: return 1077;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Head).ID: return 1078;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Foot).ID: return 1079;\n\t\t\tcase OrangeCarpet::OrangeCarpet().ID: return 7331;\n\t\t\tcase OrangeConcrete::OrangeConcrete().ID: return 8903;\n\t\t\tcase OrangeConcretePowder::OrangeConcretePowder().ID: return 8919;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8842;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8843;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8844;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8845;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8748;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8749;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8750;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8751;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8752;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8753;\n\t\t\tcase OrangeStainedGlass::OrangeStainedGlass().ID: return 4082;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, true).ID: return 6361;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, false).ID: return 6362;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, true).ID: return 6365;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, false).ID: return 6366;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, true).ID: return 6369;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, false).ID: return 6370;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, true).ID: return 6373;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, false).ID: return 6374;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, true).ID: return 6377;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, false).ID: return 6378;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, true).ID: return 6381;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, false).ID: return 6382;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, true).ID: return 6385;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, false).ID: return 6386;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, true).ID: return 6389;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, false).ID: return 6390;\n\t\t\tcase OrangeTerracotta::OrangeTerracotta().ID: return 6312;\n\t\t\tcase OrangeTulip::OrangeTulip().ID: return 1417;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7621;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7622;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7623;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7624;\n\t\t\tcase OrangeWool::OrangeWool().ID: return 1384;\n\t\t\tcase OxeyeDaisy::OxeyeDaisy().ID: return 1420;\n\t\t\tcase PackedIce::PackedIce().ID: return 7348;\n\t\t\tcase Peony::Peony(Peony::Half::Upper).ID: return 7355;\n\t\t\tcase Peony::Peony(Peony::Half::Lower).ID: return 7356;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Top).ID: return 7825;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Bottom).ID: return 7827;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Double).ID: return 7829;\n\t\t\tcase PinkBanner::PinkBanner(0).ID: return 7457;\n\t\t\tcase PinkBanner::PinkBanner(1).ID: return 7458;\n\t\t\tcase PinkBanner::PinkBanner(2).ID: return 7459;\n\t\t\tcase PinkBanner::PinkBanner(3).ID: return 7460;\n\t\t\tcase PinkBanner::PinkBanner(4).ID: return 7461;\n\t\t\tcase PinkBanner::PinkBanner(5).ID: return 7462;\n\t\t\tcase PinkBanner::PinkBanner(6).ID: return 7463;\n\t\t\tcase PinkBanner::PinkBanner(7).ID: return 7464;\n\t\t\tcase PinkBanner::PinkBanner(8).ID: return 7465;\n\t\t\tcase PinkBanner::PinkBanner(9).ID: return 7466;\n\t\t\tcase PinkBanner::PinkBanner(10).ID: return 7467;\n\t\t\tcase PinkBanner::PinkBanner(11).ID: return 7468;\n\t\t\tcase PinkBanner::PinkBanner(12).ID: return 7469;\n\t\t\tcase PinkBanner::PinkBanner(13).ID: return 7470;\n\t\t\tcase PinkBanner::PinkBanner(14).ID: return 7471;\n\t\t\tcase PinkBanner::PinkBanner(15).ID: return 7472;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Head).ID: return 1144;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Foot).ID: return 1145;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Head).ID: return 1146;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Foot).ID: return 1147;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Head).ID: return 1148;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Foot).ID: return 1149;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Head).ID: return 1150;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Foot).ID: return 1151;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Head).ID: return 1152;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Foot).ID: return 1153;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Head).ID: return 1154;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Foot).ID: return 1155;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Head).ID: return 1156;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Foot).ID: return 1157;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Head).ID: return 1158;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Foot).ID: return 1159;\n\t\t\tcase PinkCarpet::PinkCarpet().ID: return 7336;\n\t\t\tcase PinkConcrete::PinkConcrete().ID: return 8908;\n\t\t\tcase PinkConcretePowder::PinkConcretePowder().ID: return 8924;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8862;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8863;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8864;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8865;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8778;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8779;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8780;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8781;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8782;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8783;\n\t\t\tcase PinkStainedGlass::PinkStainedGlass().ID: return 4087;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, true).ID: return 6521;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, false).ID: return 6522;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, true).ID: return 6525;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, false).ID: return 6526;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, true).ID: return 6529;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, false).ID: return 6530;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, true).ID: return 6533;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, false).ID: return 6534;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, true).ID: return 6537;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, false).ID: return 6538;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, true).ID: return 6541;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, false).ID: return 6542;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, true).ID: return 6545;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, false).ID: return 6546;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, true).ID: return 6549;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, false).ID: return 6550;\n\t\t\tcase PinkTerracotta::PinkTerracotta().ID: return 6317;\n\t\t\tcase PinkTulip::PinkTulip().ID: return 1419;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7641;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7642;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7643;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7644;\n\t\t\tcase PinkWool::PinkWool().ID: return 1389;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1347;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1348;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1349;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1350;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1351;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1352;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1353;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1354;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1355;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1356;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1357;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1358;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Normal).ID: return 1359;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Sticky).ID: return 1360;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Normal).ID: return 1361;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Sticky).ID: return 1362;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Normal).ID: return 1363;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Sticky).ID: return 1364;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Normal).ID: return 1365;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Sticky).ID: return 1366;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Normal).ID: return 1367;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Sticky).ID: return 1368;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Normal).ID: return 1369;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Sticky).ID: return 1370;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Normal).ID: return 1371;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Sticky).ID: return 1372;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Normal).ID: return 1373;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Sticky).ID: return 1374;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Normal).ID: return 1375;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Sticky).ID: return 1376;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Normal).ID: return 1377;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Sticky).ID: return 1378;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Normal).ID: return 1379;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Sticky).ID: return 1380;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Normal).ID: return 1381;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Sticky).ID: return 1382;\n\t\t\tcase PlayerHead::PlayerHead(0).ID: return 6014;\n\t\t\tcase PlayerHead::PlayerHead(1).ID: return 6015;\n\t\t\tcase PlayerHead::PlayerHead(2).ID: return 6016;\n\t\t\tcase PlayerHead::PlayerHead(3).ID: return 6017;\n\t\t\tcase PlayerHead::PlayerHead(4).ID: return 6018;\n\t\t\tcase PlayerHead::PlayerHead(5).ID: return 6019;\n\t\t\tcase PlayerHead::PlayerHead(6).ID: return 6020;\n\t\t\tcase PlayerHead::PlayerHead(7).ID: return 6021;\n\t\t\tcase PlayerHead::PlayerHead(8).ID: return 6022;\n\t\t\tcase PlayerHead::PlayerHead(9).ID: return 6023;\n\t\t\tcase PlayerHead::PlayerHead(10).ID: return 6024;\n\t\t\tcase PlayerHead::PlayerHead(11).ID: return 6025;\n\t\t\tcase PlayerHead::PlayerHead(12).ID: return 6026;\n\t\t\tcase PlayerHead::PlayerHead(13).ID: return 6027;\n\t\t\tcase PlayerHead::PlayerHead(14).ID: return 6028;\n\t\t\tcase PlayerHead::PlayerHead(15).ID: return 6029;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6030;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6031;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6032;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6033;\n\t\t\tcase Podzol::Podzol(true).ID: return 12;\n\t\t\tcase Podzol::Podzol(false).ID: return 13;\n\t\t\tcase PolishedAndesite::PolishedAndesite().ID: return 7;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Top).ID: return 10320;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Bottom).ID: return 10322;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Double).ID: return 10324;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10094;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10096;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10098;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10100;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10102;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10104;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10106;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10108;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10110;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10112;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10114;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10116;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10118;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10120;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10122;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10124;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10126;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10128;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10130;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10132;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10134;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10136;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10138;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10140;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10142;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10144;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10146;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10148;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10150;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10152;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10154;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10156;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10158;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10160;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10162;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10164;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10166;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10168;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10170;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10172;\n\t\t\tcase PolishedDiorite::PolishedDiorite().ID: return 5;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Top).ID: return 10272;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Bottom).ID: return 10274;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Double).ID: return 10276;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9374;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9376;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9378;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9380;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9382;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9384;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9386;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9388;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9390;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9392;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9394;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9396;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9398;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9400;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9402;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9404;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9406;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9408;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9410;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9412;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9414;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9416;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9418;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9420;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9422;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9424;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9426;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9428;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9430;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9432;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9434;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9436;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9438;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9440;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9442;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9444;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9446;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9448;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9450;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9452;\n\t\t\tcase PolishedGranite::PolishedGranite().ID: return 3;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Top).ID: return 10254;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Bottom).ID: return 10256;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Double).ID: return 10258;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9134;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9136;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9138;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9140;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9142;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9144;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9146;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9148;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9150;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9152;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9154;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9156;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9158;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9160;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9162;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9164;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9166;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9168;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9170;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9172;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9174;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9176;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9178;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9180;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9182;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9184;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9186;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9188;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9190;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9192;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9194;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9196;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9198;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9200;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9202;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9204;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9206;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9208;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9210;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9212;\n\t\t\tcase Poppy::Poppy().ID: return 1412;\n\t\t\tcase Potatoes::Potatoes(0).ID: return 5802;\n\t\t\tcase Potatoes::Potatoes(1).ID: return 5803;\n\t\t\tcase Potatoes::Potatoes(2).ID: return 5804;\n\t\t\tcase Potatoes::Potatoes(3).ID: return 5805;\n\t\t\tcase Potatoes::Potatoes(4).ID: return 5806;\n\t\t\tcase Potatoes::Potatoes(5).ID: return 5807;\n\t\t\tcase Potatoes::Potatoes(6).ID: return 5808;\n\t\t\tcase Potatoes::Potatoes(7).ID: return 5809;\n\t\t\tcase PottedAcaciaSapling::PottedAcaciaSapling().ID: return 5774;\n\t\t\tcase PottedAllium::PottedAllium().ID: return 5780;\n\t\t\tcase PottedAzureBluet::PottedAzureBluet().ID: return 5781;\n\t\t\tcase PottedBamboo::PottedBamboo().ID: return 9128;\n\t\t\tcase PottedBirchSapling::PottedBirchSapling().ID: return 5772;\n\t\t\tcase PottedBlueOrchid::PottedBlueOrchid().ID: return 5779;\n\t\t\tcase PottedBrownMushroom::PottedBrownMushroom().ID: return 5791;\n\t\t\tcase PottedCactus::PottedCactus().ID: return 5793;\n\t\t\tcase PottedCornflower::PottedCornflower().ID: return 5787;\n\t\t\tcase PottedDandelion::PottedDandelion().ID: return 5777;\n\t\t\tcase PottedDarkOakSapling::PottedDarkOakSapling().ID: return 5775;\n\t\t\tcase PottedDeadBush::PottedDeadBush().ID: return 5792;\n\t\t\tcase PottedFern::PottedFern().ID: return 5776;\n\t\t\tcase PottedJungleSapling::PottedJungleSapling().ID: return 5773;\n\t\t\tcase PottedLilyOfTheValley::PottedLilyOfTheValley().ID: return 5788;\n\t\t\tcase PottedOakSapling::PottedOakSapling().ID: return 5770;\n\t\t\tcase PottedOrangeTulip::PottedOrangeTulip().ID: return 5783;\n\t\t\tcase PottedOxeyeDaisy::PottedOxeyeDaisy().ID: return 5786;\n\t\t\tcase PottedPinkTulip::PottedPinkTulip().ID: return 5785;\n\t\t\tcase PottedPoppy::PottedPoppy().ID: return 5778;\n\t\t\tcase PottedRedMushroom::PottedRedMushroom().ID: return 5790;\n\t\t\tcase PottedRedTulip::PottedRedTulip().ID: return 5782;\n\t\t\tcase PottedSpruceSapling::PottedSpruceSapling().ID: return 5771;\n\t\t\tcase PottedWhiteTulip::PottedWhiteTulip().ID: return 5784;\n\t\t\tcase PottedWitherRose::PottedWitherRose().ID: return 5789;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::NorthSouth).ID: return 1304;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::EastWest).ID: return 1305;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingEast).ID: return 1306;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingWest).ID: return 1307;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingNorth).ID: return 1308;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingSouth).ID: return 1309;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::NorthSouth).ID: return 1310;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::EastWest).ID: return 1311;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingEast).ID: return 1312;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingWest).ID: return 1313;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingNorth).ID: return 1314;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingSouth).ID: return 1315;\n\t\t\tcase Prismarine::Prismarine().ID: return 7065;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Top).ID: return 7315;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Bottom).ID: return 7317;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Double).ID: return 7319;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7149;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7151;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7153;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7155;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7157;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7159;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7161;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7163;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7165;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7167;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7169;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7171;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7173;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7175;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7177;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7179;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7181;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7183;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7185;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7187;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7189;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7191;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7193;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7195;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7197;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7199;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7201;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7203;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7205;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7207;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7209;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7211;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7213;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7215;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7217;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7219;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7221;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7223;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7225;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7227;\n\t\t\tcase PrismarineBricks::PrismarineBricks().ID: return 7066;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Top).ID: return 7309;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Bottom).ID: return 7311;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Double).ID: return 7313;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7069;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7071;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7073;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7075;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7077;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7079;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7081;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7083;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7085;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7087;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7089;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7091;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7093;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7095;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7097;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7099;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7101;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7103;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7105;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7107;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7109;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7111;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7113;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7115;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7117;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7119;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7121;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7123;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7125;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7127;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7129;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7131;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7133;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7135;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7137;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7139;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7141;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7143;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7145;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7147;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 10397;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 10398;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 10401;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 10402;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 10405;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 10406;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 10409;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 10410;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 10413;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 10414;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 10417;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 10418;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 10421;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 10422;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 10425;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 10426;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 10429;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 10430;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 10433;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 10434;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 10437;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 10438;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 10441;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 10442;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 10445;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 10446;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 10449;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 10450;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 10453;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 10454;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 10457;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 10458;\n\t\t\tcase Pumpkin::Pumpkin().ID: return 3996;\n\t\t\tcase PumpkinStem::PumpkinStem(0).ID: return 4756;\n\t\t\tcase PumpkinStem::PumpkinStem(1).ID: return 4757;\n\t\t\tcase PumpkinStem::PumpkinStem(2).ID: return 4758;\n\t\t\tcase PumpkinStem::PumpkinStem(3).ID: return 4759;\n\t\t\tcase PumpkinStem::PumpkinStem(4).ID: return 4760;\n\t\t\tcase PumpkinStem::PumpkinStem(5).ID: return 4761;\n\t\t\tcase PumpkinStem::PumpkinStem(6).ID: return 4762;\n\t\t\tcase PumpkinStem::PumpkinStem(7).ID: return 4763;\n\t\t\tcase PurpleBanner::PurpleBanner(0).ID: return 7521;\n\t\t\tcase PurpleBanner::PurpleBanner(1).ID: return 7522;\n\t\t\tcase PurpleBanner::PurpleBanner(2).ID: return 7523;\n\t\t\tcase PurpleBanner::PurpleBanner(3).ID: return 7524;\n\t\t\tcase PurpleBanner::PurpleBanner(4).ID: return 7525;\n\t\t\tcase PurpleBanner::PurpleBanner(5).ID: return 7526;\n\t\t\tcase PurpleBanner::PurpleBanner(6).ID: return 7527;\n\t\t\tcase PurpleBanner::PurpleBanner(7).ID: return 7528;\n\t\t\tcase PurpleBanner::PurpleBanner(8).ID: return 7529;\n\t\t\tcase PurpleBanner::PurpleBanner(9).ID: return 7530;\n\t\t\tcase PurpleBanner::PurpleBanner(10).ID: return 7531;\n\t\t\tcase PurpleBanner::PurpleBanner(11).ID: return 7532;\n\t\t\tcase PurpleBanner::PurpleBanner(12).ID: return 7533;\n\t\t\tcase PurpleBanner::PurpleBanner(13).ID: return 7534;\n\t\t\tcase PurpleBanner::PurpleBanner(14).ID: return 7535;\n\t\t\tcase PurpleBanner::PurpleBanner(15).ID: return 7536;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Head).ID: return 1208;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Foot).ID: return 1209;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Head).ID: return 1210;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Foot).ID: return 1211;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Head).ID: return 1212;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Foot).ID: return 1213;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Head).ID: return 1214;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Foot).ID: return 1215;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Head).ID: return 1216;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Foot).ID: return 1217;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Head).ID: return 1218;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Foot).ID: return 1219;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Head).ID: return 1220;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Foot).ID: return 1221;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Head).ID: return 1222;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Foot).ID: return 1223;\n\t\t\tcase PurpleCarpet::PurpleCarpet().ID: return 7340;\n\t\t\tcase PurpleConcrete::PurpleConcrete().ID: return 8912;\n\t\t\tcase PurpleConcretePowder::PurpleConcretePowder().ID: return 8928;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8878;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8879;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8880;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8881;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8802;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8803;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8804;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8805;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8806;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8807;\n\t\t\tcase PurpleStainedGlass::PurpleStainedGlass().ID: return 4091;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, true).ID: return 6649;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, false).ID: return 6650;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, true).ID: return 6653;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, false).ID: return 6654;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, true).ID: return 6657;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, false).ID: return 6658;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, true).ID: return 6661;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, false).ID: return 6662;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, true).ID: return 6665;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, false).ID: return 6666;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, true).ID: return 6669;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, false).ID: return 6670;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, true).ID: return 6673;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, false).ID: return 6674;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, true).ID: return 6677;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, false).ID: return 6678;\n\t\t\tcase PurpleTerracotta::PurpleTerracotta().ID: return 6321;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7657;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7658;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7659;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7660;\n\t\t\tcase PurpleWool::PurpleWool().ID: return 1393;\n\t\t\tcase PurpurBlock::PurpurBlock().ID: return 8598;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::X).ID: return 8599;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Y).ID: return 8600;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Z).ID: return 8601;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Top).ID: return 7873;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Bottom).ID: return 7875;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Double).ID: return 7877;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8603;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8605;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8607;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8609;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8611;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8613;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8615;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8617;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8619;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8621;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8623;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8625;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8627;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8629;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8631;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8633;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8635;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8637;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8639;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8641;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8643;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8645;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8647;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8649;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8651;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8653;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8655;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8657;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8659;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8661;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8663;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8665;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8667;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8669;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8671;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8673;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8675;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8677;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8679;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8681;\n\t\t\tcase QuartzBlock::QuartzBlock().ID: return 6202;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::X).ID: return 6204;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Y).ID: return 6205;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Z).ID: return 6206;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Top).ID: return 7855;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Bottom).ID: return 7857;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Double).ID: return 7859;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6208;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6210;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6212;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6214;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6216;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6218;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6220;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6222;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6224;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6226;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6228;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6230;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6232;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6234;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6236;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6238;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6240;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6242;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6244;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6246;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6248;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6250;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6252;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6254;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6256;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6258;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6260;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6262;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6264;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6266;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6268;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6270;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6272;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6274;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6276;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6278;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6280;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6282;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6284;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6286;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthSouth).ID: return 3643;\n\t\t\tcase Rail::Rail(Rail::Shape::EastWest).ID: return 3644;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingEast).ID: return 3645;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingWest).ID: return 3646;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingNorth).ID: return 3647;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingSouth).ID: return 3648;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthEast).ID: return 3649;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthWest).ID: return 3650;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthWest).ID: return 3651;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthEast).ID: return 3652;\n\t\t\tcase RedBanner::RedBanner(0).ID: return 7585;\n\t\t\tcase RedBanner::RedBanner(1).ID: return 7586;\n\t\t\tcase RedBanner::RedBanner(2).ID: return 7587;\n\t\t\tcase RedBanner::RedBanner(3).ID: return 7588;\n\t\t\tcase RedBanner::RedBanner(4).ID: return 7589;\n\t\t\tcase RedBanner::RedBanner(5).ID: return 7590;\n\t\t\tcase RedBanner::RedBanner(6).ID: return 7591;\n\t\t\tcase RedBanner::RedBanner(7).ID: return 7592;\n\t\t\tcase RedBanner::RedBanner(8).ID: return 7593;\n\t\t\tcase RedBanner::RedBanner(9).ID: return 7594;\n\t\t\tcase RedBanner::RedBanner(10).ID: return 7595;\n\t\t\tcase RedBanner::RedBanner(11).ID: return 7596;\n\t\t\tcase RedBanner::RedBanner(12).ID: return 7597;\n\t\t\tcase RedBanner::RedBanner(13).ID: return 7598;\n\t\t\tcase RedBanner::RedBanner(14).ID: return 7599;\n\t\t\tcase RedBanner::RedBanner(15).ID: return 7600;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Head).ID: return 1272;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Foot).ID: return 1273;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Head).ID: return 1274;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Foot).ID: return 1275;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Head).ID: return 1276;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Foot).ID: return 1277;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Head).ID: return 1278;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Foot).ID: return 1279;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Head).ID: return 1280;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Foot).ID: return 1281;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Head).ID: return 1282;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Foot).ID: return 1283;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Head).ID: return 1284;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Foot).ID: return 1285;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Head).ID: return 1286;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Foot).ID: return 1287;\n\t\t\tcase RedCarpet::RedCarpet().ID: return 7344;\n\t\t\tcase RedConcrete::RedConcrete().ID: return 8916;\n\t\t\tcase RedConcretePowder::RedConcretePowder().ID: return 8932;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8894;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8895;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8896;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8897;\n\t\t\tcase RedMushroom::RedMushroom().ID: return 1425;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, true).ID: return 4555;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, false).ID: return 4556;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, true).ID: return 4557;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, false).ID: return 4558;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, true).ID: return 4559;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, false).ID: return 4560;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, true).ID: return 4561;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, false).ID: return 4562;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, true).ID: return 4563;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, false).ID: return 4564;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, true).ID: return 4565;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, false).ID: return 4566;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, true).ID: return 4567;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, false).ID: return 4568;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, true).ID: return 4569;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, false).ID: return 4570;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, true).ID: return 4571;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, false).ID: return 4572;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, true).ID: return 4573;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, false).ID: return 4574;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, true).ID: return 4575;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, false).ID: return 4576;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, true).ID: return 4577;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, false).ID: return 4578;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, true).ID: return 4579;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, false).ID: return 4580;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, true).ID: return 4581;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, false).ID: return 4582;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, true).ID: return 4583;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, false).ID: return 4584;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, true).ID: return 4585;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, false).ID: return 4586;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, true).ID: return 4587;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, false).ID: return 4588;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, true).ID: return 4589;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, false).ID: return 4590;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, true).ID: return 4591;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, false).ID: return 4592;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, true).ID: return 4593;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, false).ID: return 4594;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, true).ID: return 4595;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, false).ID: return 4596;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, true).ID: return 4597;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, false).ID: return 4598;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, true).ID: return 4599;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, false).ID: return 4600;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, true).ID: return 4601;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, false).ID: return 4602;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, true).ID: return 4603;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, false).ID: return 4604;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, true).ID: return 4605;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, false).ID: return 4606;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, true).ID: return 4607;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, false).ID: return 4608;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, true).ID: return 4609;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, false).ID: return 4610;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, true).ID: return 4611;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, false).ID: return 4612;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, true).ID: return 4613;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, false).ID: return 4614;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, true).ID: return 4615;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, false).ID: return 4616;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, true).ID: return 4617;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false).ID: return 4618;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Top).ID: return 10314;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Bottom).ID: return 10316;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Double).ID: return 10318;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10014;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10016;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10018;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10020;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10022;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10024;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10026;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10028;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10030;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10032;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10034;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10036;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10038;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10040;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10042;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10044;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10046;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10048;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10050;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10052;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10054;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10056;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10058;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10060;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10062;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10064;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10066;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10068;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10070;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10072;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10074;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10076;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10078;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10080;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10082;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10084;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10086;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10088;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10090;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10092;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 10845;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 10846;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 10849;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 10850;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 10853;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 10854;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 10857;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 10858;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 10861;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 10862;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 10865;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 10866;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 10869;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 10870;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 10873;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 10874;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 10877;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 10878;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 10881;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 10882;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 10885;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 10886;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 10889;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 10890;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 10893;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 10894;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 10897;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 10898;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 10901;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 10902;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 10905;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 10906;\n\t\t\tcase RedNetherBricks::RedNetherBricks().ID: return 8719;\n\t\t\tcase RedSand::RedSand().ID: return 67;\n\t\t\tcase RedSandstone::RedSandstone().ID: return 7681;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Top).ID: return 7861;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Bottom).ID: return 7863;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Double).ID: return 7865;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7685;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7687;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7689;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7691;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7693;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7695;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7697;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7699;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7701;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7703;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7705;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7707;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7709;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7711;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7713;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7715;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7717;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7719;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7721;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7723;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7725;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7727;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7729;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7731;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7733;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7735;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7737;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7739;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7741;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7743;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7745;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7747;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7749;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7751;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7753;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7755;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7757;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7759;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7761;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7763;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 10461;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 10462;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 10465;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 10466;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 10469;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 10470;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 10473;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 10474;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 10477;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 10478;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 10481;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 10482;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 10485;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 10486;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 10489;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 10490;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 10493;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 10494;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 10497;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 10498;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 10501;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 10502;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 10505;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 10506;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 10509;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 10510;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 10513;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 10514;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 10517;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 10518;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 10521;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 10522;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8826;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8827;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8828;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8829;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8830;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8831;\n\t\t\tcase RedStainedGlass::RedStainedGlass().ID: return 4095;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, true).ID: return 6777;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, false).ID: return 6778;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, true).ID: return 6781;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, false).ID: return 6782;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, true).ID: return 6785;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, false).ID: return 6786;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, true).ID: return 6789;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, false).ID: return 6790;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, true).ID: return 6793;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, false).ID: return 6794;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, true).ID: return 6797;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, false).ID: return 6798;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, true).ID: return 6801;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, false).ID: return 6802;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, true).ID: return 6805;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, false).ID: return 6806;\n\t\t\tcase RedTerracotta::RedTerracotta().ID: return 6325;\n\t\t\tcase RedTulip::RedTulip().ID: return 1416;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7673;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7674;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7675;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7676;\n\t\t\tcase RedWool::RedWool().ID: return 1397;\n\t\t\tcase RedstoneBlock::RedstoneBlock().ID: return 6190;\n\t\t\tcase RedstoneLamp::RedstoneLamp(true).ID: return 5140;\n\t\t\tcase RedstoneLamp::RedstoneLamp(false).ID: return 5141;\n\t\t\tcase RedstoneOre::RedstoneOre(true).ID: return 3883;\n\t\t\tcase RedstoneOre::RedstoneOre(false).ID: return 3884;\n\t\t\tcase RedstoneTorch::RedstoneTorch(true).ID: return 3885;\n\t\t\tcase RedstoneTorch::RedstoneTorch(false).ID: return 3886;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3887;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3888;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3889;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3890;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, true).ID: return 3891;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, false).ID: return 3892;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, true).ID: return 3893;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, false).ID: return 3894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2056;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2057;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2058;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2059;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2060;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2061;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2062;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2063;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2064;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2065;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2066;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2067;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2068;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2069;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2070;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2071;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2072;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2073;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2074;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2075;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2076;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2077;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2078;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2079;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2080;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2081;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2082;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2083;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2084;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2085;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2086;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2087;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2088;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2089;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2090;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2091;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2092;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2093;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2094;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2095;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2096;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2097;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2098;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2099;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2100;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2101;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2102;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2103;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2104;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2105;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2106;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2107;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2108;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2109;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2110;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2111;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2112;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2113;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2114;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2115;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2116;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2117;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2118;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2119;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2120;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2121;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2122;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2123;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2124;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2125;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2126;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2127;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2128;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2129;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2130;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2131;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2132;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2133;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2134;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2135;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2136;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2137;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2138;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2139;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2140;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2141;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2142;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2143;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2144;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2145;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2146;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2147;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2148;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2149;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2150;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2151;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2152;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2153;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2154;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2155;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2156;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2157;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2158;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2159;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2160;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2161;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2162;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2163;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2164;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2165;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2166;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2167;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2168;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2169;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2170;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2171;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2172;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2173;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2174;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2175;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2176;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2177;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2178;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2179;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2180;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2181;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2182;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2183;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2184;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2185;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2186;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2187;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2188;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2189;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2190;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2191;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2192;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2193;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2194;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2195;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2196;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2197;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2198;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2199;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2200;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2201;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2202;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2203;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2204;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2205;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2206;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2207;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2208;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2209;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2210;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2211;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2212;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2213;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2214;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2215;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2216;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2217;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2218;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2219;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2220;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2221;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2222;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2223;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2224;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2225;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2226;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2227;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2228;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2229;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2230;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2231;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2232;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2233;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2234;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2235;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2236;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2237;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2238;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2239;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2240;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2241;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2242;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2243;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2244;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2245;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2246;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2247;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2248;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2249;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2250;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2251;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2252;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2253;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2254;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2255;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2256;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2257;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2258;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2259;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2260;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2261;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2262;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2263;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2264;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2265;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2266;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2267;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2268;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2269;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2270;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2271;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2272;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2273;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2274;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2275;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2276;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2277;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2278;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2279;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2280;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2281;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2282;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2283;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2284;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2285;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2286;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2287;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2288;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2289;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2290;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2291;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2292;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2293;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2294;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2295;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2296;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2297;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2298;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2299;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2300;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2301;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2302;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2303;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2304;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2305;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2306;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2307;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2308;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2309;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2310;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2311;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2312;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2313;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2314;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2315;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2316;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2317;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2318;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2319;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2320;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2321;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2322;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2323;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2324;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2325;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2326;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2327;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2328;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2329;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2330;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2331;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2332;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2333;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2334;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2335;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2336;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2337;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2338;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2339;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2340;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2341;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2342;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2343;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2344;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2345;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2346;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2347;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2348;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2349;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2350;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2351;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2352;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2353;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2354;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2355;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2356;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2357;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2358;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2359;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2360;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2361;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2362;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2363;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2364;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2365;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2366;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2367;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2368;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2369;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2370;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2371;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2372;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2373;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2374;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2375;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2376;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2377;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2378;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2379;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2380;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2381;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2382;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2383;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2384;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2385;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2386;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2387;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2388;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2389;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2390;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2391;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2392;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2393;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2394;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2395;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2396;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2397;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2398;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2399;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2400;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2401;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2402;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2403;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2404;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2405;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2406;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2407;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2408;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2409;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2410;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2411;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2412;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2413;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2414;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2415;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2416;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2417;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2418;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2419;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2420;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2421;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2422;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2423;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2424;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2425;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2426;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2427;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2428;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2429;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2430;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2431;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2432;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2433;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2434;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2435;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2436;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2437;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2438;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2439;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2440;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2441;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2442;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2443;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2444;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2445;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2446;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2447;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2448;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2449;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2450;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2451;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2452;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2453;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2454;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2455;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2456;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2457;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2458;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2459;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2460;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2461;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2462;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2463;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2464;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2465;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2466;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2467;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2468;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2469;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2470;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2471;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2472;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2473;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2474;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2475;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2476;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2477;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2478;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2479;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2480;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2481;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2482;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2483;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2484;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2485;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2486;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2487;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2488;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2489;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2490;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2491;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2492;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2493;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2494;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2495;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2496;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2497;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2498;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2499;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2500;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2501;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2502;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2503;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2504;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2505;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2506;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2507;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2508;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2509;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2510;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2511;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2512;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2513;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2514;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2515;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2516;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2517;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2518;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2519;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2520;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2521;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2522;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2523;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2524;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2525;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2526;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2527;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2528;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2529;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2530;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2531;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2532;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2533;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2534;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2535;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2536;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2537;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2538;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2539;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2540;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2541;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2542;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2543;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2544;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2545;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2546;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2547;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2548;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2549;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2550;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2551;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2552;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2553;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2554;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2555;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2556;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2557;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2558;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2559;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2560;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2561;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2562;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2563;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2564;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2565;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2566;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2567;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2568;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2569;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2570;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2571;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2572;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2573;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2574;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2575;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2576;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2577;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2578;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2579;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2580;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2581;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2582;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2583;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2584;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2585;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2586;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2587;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2588;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2589;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2590;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2591;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2592;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2593;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2594;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2595;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2596;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2597;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2598;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2599;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2600;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2601;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2602;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2603;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2604;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2605;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2606;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2607;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2608;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2609;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2610;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2611;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2612;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2613;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2614;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2615;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2616;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2617;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2618;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2619;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2620;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2621;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2622;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2623;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2624;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2625;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2626;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2627;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2628;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2629;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2630;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2631;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2632;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2633;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2634;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2635;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2636;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2637;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2638;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2639;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2640;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2641;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2642;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2643;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2644;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2645;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2646;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2647;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2648;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2649;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2650;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2651;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2652;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2653;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2654;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2655;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2656;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2657;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2658;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2659;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2660;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2661;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2662;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2663;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2664;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2665;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2666;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2667;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2668;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2669;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2670;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2671;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2672;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2673;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2674;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2675;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2676;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2677;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2678;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2679;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2680;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2681;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2682;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2683;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2684;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2685;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2686;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2687;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2688;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2689;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2690;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2691;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2692;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2693;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2694;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2695;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2696;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2697;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2698;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2699;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2700;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2701;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2702;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2703;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2704;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2705;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2706;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2707;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2708;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2709;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2710;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2711;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2712;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2713;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2714;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2715;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2716;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2717;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2718;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2719;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2720;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2721;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2722;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2723;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2724;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2725;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2726;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2727;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2728;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2729;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2730;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2731;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2732;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2733;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2734;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2735;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2736;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2737;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2738;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2739;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2740;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2741;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2742;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2743;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2744;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2745;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2746;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2747;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2748;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2749;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2750;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2751;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2752;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2753;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2754;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2755;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2756;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2757;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2758;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2759;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2760;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2761;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2762;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2763;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2764;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2765;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2766;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2767;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2768;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2769;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2770;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2771;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2772;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2773;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2774;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2775;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2776;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2777;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2778;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2779;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2780;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2781;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2782;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2783;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2784;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2785;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2786;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2787;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2788;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2789;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2790;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2791;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2792;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2793;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2794;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2795;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2796;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2797;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2798;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2799;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2800;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2801;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2802;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2803;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2804;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2805;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2806;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2807;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2808;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2809;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2810;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2811;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2812;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2813;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2814;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2815;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2816;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2817;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2818;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2819;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2820;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2821;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2822;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2823;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2824;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2825;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2826;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2827;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2828;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2829;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2830;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2831;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2832;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2833;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2834;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2835;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2836;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2837;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2838;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2839;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2840;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2841;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2842;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2843;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2844;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2845;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2846;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2847;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2848;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2849;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2850;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2851;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2852;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2853;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2854;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2855;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2856;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2857;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2858;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2859;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2860;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2861;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2862;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2863;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2864;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2865;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2866;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2867;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2868;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2869;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2870;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2871;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2872;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2873;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2874;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2875;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2876;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2877;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2878;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2879;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2880;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2881;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2882;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2883;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2884;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2885;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2886;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2887;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2888;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2889;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2890;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2891;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2892;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2893;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2895;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2896;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2897;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2898;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2899;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2900;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2901;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2902;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2903;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2904;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2905;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2906;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2907;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2908;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2909;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2910;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2911;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2912;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2913;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2914;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2915;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2916;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2917;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2918;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2919;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2920;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2921;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2922;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2923;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2924;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2925;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2926;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2927;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2928;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2929;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2930;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2931;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2932;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2933;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2934;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2935;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2936;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2937;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2938;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2939;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2940;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2941;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2942;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2943;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2944;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2945;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2946;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2947;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2948;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2949;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2950;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2951;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2952;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2953;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2954;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2955;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2956;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2957;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2958;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2959;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2960;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2961;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2962;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2963;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2964;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2965;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2966;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2967;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2968;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2969;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2970;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2971;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2972;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2973;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2974;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2975;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2976;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2977;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2978;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2979;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2980;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2981;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2982;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2983;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2984;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2985;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2986;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2987;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2988;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2989;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2990;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2991;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2992;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2993;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2994;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2995;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2996;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2997;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2998;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2999;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3000;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3001;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3002;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3003;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3004;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3005;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3006;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3007;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3008;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3009;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3010;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3011;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3012;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3013;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3014;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3015;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3016;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3017;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3018;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3019;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3020;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3021;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3022;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3023;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3024;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3025;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3026;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3027;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3028;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3029;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3030;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3031;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3032;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3033;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3034;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3035;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3036;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3037;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3038;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3039;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3040;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3041;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3042;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3043;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3044;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3045;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3046;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3047;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3048;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3049;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3050;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3051;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3052;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3053;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3054;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3055;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3056;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3057;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3058;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3059;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3060;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3061;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3062;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3063;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3064;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3065;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3066;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3067;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3068;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3069;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3070;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3071;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3072;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3073;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3074;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3075;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3076;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3077;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3078;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3079;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3080;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3081;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3082;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3083;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3084;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3085;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3086;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3087;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3088;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3089;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3090;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3091;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3092;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3093;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3094;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3095;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3096;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3097;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3098;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3099;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3100;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3101;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3102;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3103;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3104;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3105;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3106;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3107;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3108;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3109;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3110;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3111;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3112;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3113;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3114;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3115;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3116;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3117;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3118;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3119;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3120;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3121;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3122;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3123;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3124;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3125;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3126;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3127;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3128;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3129;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3130;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3131;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3132;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3133;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3134;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3135;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3136;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3137;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3138;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3139;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3140;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3141;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3142;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3143;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3144;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3145;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3146;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3147;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3148;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3149;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3150;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3151;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3152;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3153;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3154;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3155;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3156;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3157;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3158;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3159;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3160;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3161;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3162;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3163;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3164;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3165;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3166;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3167;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3168;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3169;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3170;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3171;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3172;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3173;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3174;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3175;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3176;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3177;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3178;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3179;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3180;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3181;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3182;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3183;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3184;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3185;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3186;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3187;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3188;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3189;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3190;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3191;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3192;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3193;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3194;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3195;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3196;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3197;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3198;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3199;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3200;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3201;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3202;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3203;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3204;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3205;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3206;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3207;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3208;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3209;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3210;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3211;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3212;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3213;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3214;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3215;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3216;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3217;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3218;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3219;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3220;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3221;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3222;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3223;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3224;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3225;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3226;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3227;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3228;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3229;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3230;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3231;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3232;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3233;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3234;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3235;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3236;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3237;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3238;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3239;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3240;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3241;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3242;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3243;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3244;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3245;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3246;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3247;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3248;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3249;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3250;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3251;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3252;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3253;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3254;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3255;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3256;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3257;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3258;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3259;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3260;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3261;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3262;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3263;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3264;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3265;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3266;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3267;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3268;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3269;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3270;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3271;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3272;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3273;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3274;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3275;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3276;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3277;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3278;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3279;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3280;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3281;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3282;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3283;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3284;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3285;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3286;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3287;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3288;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3289;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3290;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3291;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3292;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3293;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3294;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3295;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3296;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3297;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3298;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3299;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3300;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3301;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3302;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3303;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3304;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3305;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3306;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3307;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3308;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3309;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3310;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3311;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3312;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3313;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3314;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3315;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3316;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3317;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3318;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3319;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3320;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3321;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3322;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3323;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3324;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3325;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3326;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3327;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3328;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3329;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3330;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3331;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3332;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3333;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3334;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3335;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3336;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3337;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3338;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3339;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3340;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3341;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3342;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3343;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3344;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3345;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3346;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3347;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3348;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3349;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3350;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3351;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4017;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4018;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4019;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4020;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4021;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4022;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4023;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4024;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4025;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4026;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4027;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4028;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4029;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4030;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4031;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4032;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4033;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4034;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4035;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4036;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4037;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4038;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4039;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4040;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4041;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4042;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4043;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4044;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4045;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4046;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4047;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4048;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4049;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4050;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4051;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4052;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4053;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4054;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4055;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4056;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4057;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4058;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4059;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4060;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4061;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4062;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4063;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4064;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4065;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4066;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4067;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4068;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4069;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4070;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4071;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4072;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4073;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4074;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4075;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4076;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4077;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4078;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4079;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4080;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 8689;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 8690;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 8691;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 8692;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 8693;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 8694;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 8695;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 8696;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 8697;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 8698;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 8699;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 8700;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Upper).ID: return 7353;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Lower).ID: return 7354;\n\t\t\tcase Sand::Sand().ID: return 66;\n\t\t\tcase Sandstone::Sandstone().ID: return 245;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Top).ID: return 7813;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Bottom).ID: return 7815;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Double).ID: return 7817;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5155;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5157;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5159;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5161;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5163;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5165;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5167;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5169;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5171;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5173;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5175;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5177;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5179;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5181;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5183;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5185;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5187;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5189;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5191;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5193;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5195;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5197;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5199;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5201;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5203;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5205;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5207;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5209;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5211;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5213;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5215;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5217;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5219;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5221;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5223;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5225;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5227;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5229;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5231;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5233;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 10909;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 10910;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 10913;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 10914;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 10917;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 10918;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 10921;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 10922;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 10925;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 10926;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 10929;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 10930;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 10933;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 10934;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 10937;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 10938;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 10941;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 10942;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 10945;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 10946;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 10949;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 10950;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 10953;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 10954;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 10957;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 10958;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 10961;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 10962;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 10965;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 10966;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 10969;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 10970;\n\t\t\tcase Scaffolding::Scaffolding(true, 0).ID: return 11100;\n\t\t\tcase Scaffolding::Scaffolding(true, 1).ID: return 11102;\n\t\t\tcase Scaffolding::Scaffolding(true, 2).ID: return 11104;\n\t\t\tcase Scaffolding::Scaffolding(true, 3).ID: return 11106;\n\t\t\tcase Scaffolding::Scaffolding(true, 4).ID: return 11108;\n\t\t\tcase Scaffolding::Scaffolding(true, 5).ID: return 11110;\n\t\t\tcase Scaffolding::Scaffolding(true, 6).ID: return 11112;\n\t\t\tcase Scaffolding::Scaffolding(true, 7).ID: return 11114;\n\t\t\tcase Scaffolding::Scaffolding(false, 0).ID: return 11116;\n\t\t\tcase Scaffolding::Scaffolding(false, 1).ID: return 11118;\n\t\t\tcase Scaffolding::Scaffolding(false, 2).ID: return 11120;\n\t\t\tcase Scaffolding::Scaffolding(false, 3).ID: return 11122;\n\t\t\tcase Scaffolding::Scaffolding(false, 4).ID: return 11124;\n\t\t\tcase Scaffolding::Scaffolding(false, 5).ID: return 11126;\n\t\t\tcase Scaffolding::Scaffolding(false, 6).ID: return 11128;\n\t\t\tcase Scaffolding::Scaffolding(false, 7).ID: return 11130;\n\t\t\tcase SeaLantern::SeaLantern().ID: return 7326;\n\t\t\tcase SeaPickle::SeaPickle(1).ID: return 9105;\n\t\t\tcase SeaPickle::SeaPickle(2).ID: return 9107;\n\t\t\tcase SeaPickle::SeaPickle(3).ID: return 9109;\n\t\t\tcase SeaPickle::SeaPickle(4).ID: return 9111;\n\t\t\tcase Seagrass::Seagrass().ID: return 1344;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8736;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8737;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8738;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8739;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8740;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8741;\n\t\t\tcase SkeletonSkull::SkeletonSkull(0).ID: return 5954;\n\t\t\tcase SkeletonSkull::SkeletonSkull(1).ID: return 5955;\n\t\t\tcase SkeletonSkull::SkeletonSkull(2).ID: return 5956;\n\t\t\tcase SkeletonSkull::SkeletonSkull(3).ID: return 5957;\n\t\t\tcase SkeletonSkull::SkeletonSkull(4).ID: return 5958;\n\t\t\tcase SkeletonSkull::SkeletonSkull(5).ID: return 5959;\n\t\t\tcase SkeletonSkull::SkeletonSkull(6).ID: return 5960;\n\t\t\tcase SkeletonSkull::SkeletonSkull(7).ID: return 5961;\n\t\t\tcase SkeletonSkull::SkeletonSkull(8).ID: return 5962;\n\t\t\tcase SkeletonSkull::SkeletonSkull(9).ID: return 5963;\n\t\t\tcase SkeletonSkull::SkeletonSkull(10).ID: return 5964;\n\t\t\tcase SkeletonSkull::SkeletonSkull(11).ID: return 5965;\n\t\t\tcase SkeletonSkull::SkeletonSkull(12).ID: return 5966;\n\t\t\tcase SkeletonSkull::SkeletonSkull(13).ID: return 5967;\n\t\t\tcase SkeletonSkull::SkeletonSkull(14).ID: return 5968;\n\t\t\tcase SkeletonSkull::SkeletonSkull(15).ID: return 5969;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 5970;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 5971;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 5972;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 5973;\n\t\t\tcase SlimeBlock::SlimeBlock().ID: return 6999;\n\t\t\tcase SmithingTable::SmithingTable().ID: return 11193;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZM, true).ID: return 11147;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZM, false).ID: return 11148;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZP, true).ID: return 11149;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZP, false).ID: return 11150;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XM, true).ID: return 11151;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XM, false).ID: return 11152;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XP, true).ID: return 11153;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XP, false).ID: return 11154;\n\t\t\tcase SmoothQuartz::SmoothQuartz().ID: return 7880;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Top).ID: return 10296;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Bottom).ID: return 10298;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Double).ID: return 10300;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 9774;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9776;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 9778;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9780;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 9782;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 9784;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9786;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 9788;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9790;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 9792;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 9794;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9796;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 9798;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9800;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 9802;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 9804;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9806;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 9808;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9810;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 9812;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 9814;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9816;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 9818;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9820;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 9822;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 9824;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9826;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 9828;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9830;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 9832;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 9834;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9836;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 9838;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9840;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 9842;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 9844;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9846;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 9848;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9850;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 9852;\n\t\t\tcase SmoothRedSandstone::SmoothRedSandstone().ID: return 7881;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Top).ID: return 10260;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Bottom).ID: return 10262;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Double).ID: return 10264;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9214;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9216;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9218;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9220;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9222;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9224;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9226;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9228;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9230;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9232;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9234;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9236;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9238;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9240;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9242;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9244;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9246;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9248;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9250;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9252;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9254;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9256;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9258;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9260;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9262;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9264;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9266;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9268;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9270;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9272;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9274;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9276;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9278;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9280;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9282;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9284;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9286;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9288;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9290;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9292;\n\t\t\tcase SmoothSandstone::SmoothSandstone().ID: return 7879;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Top).ID: return 10290;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Bottom).ID: return 10292;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Double).ID: return 10294;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 9694;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9696;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9698;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9700;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9702;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 9704;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9706;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9708;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9710;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9712;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 9714;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9716;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9718;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9720;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9722;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 9724;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9726;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9728;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9730;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9732;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 9734;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9736;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9738;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9740;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9742;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 9744;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9746;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9748;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9750;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9752;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 9754;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9756;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9758;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9760;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9762;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 9764;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9766;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9768;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9770;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9772;\n\t\t\tcase SmoothStone::SmoothStone().ID: return 7878;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Top).ID: return 7807;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Bottom).ID: return 7809;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Double).ID: return 7811;\n\t\t\tcase Snow::Snow(1).ID: return 3919;\n\t\t\tcase Snow::Snow(2).ID: return 3920;\n\t\t\tcase Snow::Snow(3).ID: return 3921;\n\t\t\tcase Snow::Snow(4).ID: return 3922;\n\t\t\tcase Snow::Snow(5).ID: return 3923;\n\t\t\tcase Snow::Snow(6).ID: return 3924;\n\t\t\tcase Snow::Snow(7).ID: return 3925;\n\t\t\tcase Snow::Snow(8).ID: return 3926;\n\t\t\tcase SnowBlock::SnowBlock().ID: return 3928;\n\t\t\tcase SoulSand::SoulSand().ID: return 3998;\n\t\t\tcase Spawner::Spawner().ID: return 1951;\n\t\t\tcase Sponge::Sponge().ID: return 228;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5834;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5835;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5836;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5837;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5838;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5839;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5840;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5841;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5842;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5843;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5844;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5845;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5846;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5847;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5848;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5849;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5850;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5851;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5852;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5853;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5854;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5855;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5856;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5857;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8202;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8203;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8204;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8205;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8206;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8207;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8208;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8209;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8210;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8211;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8212;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8213;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8214;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8215;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8216;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8217;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8218;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8219;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8220;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8221;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8222;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8223;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8224;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8225;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8226;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8227;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8228;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8229;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8230;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8231;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8232;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8233;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8234;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8235;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8236;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8237;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8238;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8239;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8240;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8241;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8242;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8243;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8244;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8245;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8246;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8247;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8248;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8249;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8250;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8251;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8252;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8253;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8254;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8255;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8256;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8257;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8258;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8259;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8260;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8261;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8262;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8263;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8264;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8265;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, true).ID: return 8044;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, false).ID: return 8045;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, true).ID: return 8048;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, false).ID: return 8049;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, true).ID: return 8052;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, false).ID: return 8053;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, true).ID: return 8056;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, false).ID: return 8057;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, true).ID: return 8060;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, false).ID: return 8061;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, true).ID: return 8064;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, false).ID: return 8065;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, true).ID: return 8068;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, false).ID: return 8069;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, true).ID: return 8072;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, false).ID: return 8073;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7882;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7883;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7884;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7885;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7886;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7887;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7888;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7889;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7890;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7891;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7892;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7893;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7894;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7895;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7896;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7897;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7898;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7899;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7900;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7901;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7902;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7903;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7904;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7905;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7906;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7907;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7908;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7909;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7910;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7911;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7912;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7913;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, true).ID: return 158;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, false).ID: return 159;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, true).ID: return 160;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, false).ID: return 161;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, true).ID: return 162;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, false).ID: return 163;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, true).ID: return 164;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, false).ID: return 165;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, true).ID: return 166;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, false).ID: return 167;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, true).ID: return 168;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, false).ID: return 169;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, true).ID: return 170;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, false).ID: return 171;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::X).ID: return 75;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Y).ID: return 76;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Z).ID: return 77;\n\t\t\tcase SprucePlanks::SprucePlanks().ID: return 16;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(true).ID: return 3873;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(false).ID: return 3874;\n\t\t\tcase SpruceSapling::SpruceSapling(0).ID: return 23;\n\t\t\tcase SpruceSapling::SpruceSapling(1).ID: return 24;\n\t\t\tcase SpruceSign::SpruceSign(0).ID: return 3412;\n\t\t\tcase SpruceSign::SpruceSign(1).ID: return 3414;\n\t\t\tcase SpruceSign::SpruceSign(2).ID: return 3416;\n\t\t\tcase SpruceSign::SpruceSign(3).ID: return 3418;\n\t\t\tcase SpruceSign::SpruceSign(4).ID: return 3420;\n\t\t\tcase SpruceSign::SpruceSign(5).ID: return 3422;\n\t\t\tcase SpruceSign::SpruceSign(6).ID: return 3424;\n\t\t\tcase SpruceSign::SpruceSign(7).ID: return 3426;\n\t\t\tcase SpruceSign::SpruceSign(8).ID: return 3428;\n\t\t\tcase SpruceSign::SpruceSign(9).ID: return 3430;\n\t\t\tcase SpruceSign::SpruceSign(10).ID: return 3432;\n\t\t\tcase SpruceSign::SpruceSign(11).ID: return 3434;\n\t\t\tcase SpruceSign::SpruceSign(12).ID: return 3436;\n\t\t\tcase SpruceSign::SpruceSign(13).ID: return 3438;\n\t\t\tcase SpruceSign::SpruceSign(14).ID: return 3440;\n\t\t\tcase SpruceSign::SpruceSign(15).ID: return 3442;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Top).ID: return 7771;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Bottom).ID: return 7773;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Double).ID: return 7775;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5389;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5391;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5393;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5395;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5397;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5399;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5401;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5403;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5405;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5407;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5409;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5411;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5413;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5415;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5417;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5419;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5421;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5423;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5425;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5427;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5429;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5431;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5433;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5435;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5437;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5439;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5441;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5443;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5445;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5447;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5449;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5451;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5453;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5455;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5457;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5459;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5461;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5463;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5465;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5467;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, true).ID: return 4162;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, false).ID: return 4164;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, true).ID: return 4166;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, false).ID: return 4168;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4170;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4172;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4174;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4176;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, true).ID: return 4178;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, false).ID: return 4180;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, true).ID: return 4182;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, false).ID: return 4184;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4186;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4188;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4190;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4192;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, true).ID: return 4194;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, false).ID: return 4196;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, true).ID: return 4198;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, false).ID: return 4200;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4202;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4204;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4206;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4208;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, true).ID: return 4210;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, false).ID: return 4212;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, true).ID: return 4214;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, false).ID: return 4216;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4218;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4220;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4222;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4224;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3742;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3744;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3746;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3748;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::X).ID: return 111;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Y).ID: return 112;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Z).ID: return 113;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1328;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1329;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1330;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1331;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1332;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1333;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1334;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1335;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1336;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1337;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1338;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1339;\n\t\t\tcase Stone::Stone().ID: return 1;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Top).ID: return 7843;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Bottom).ID: return 7845;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Double).ID: return 7847;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4917;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4919;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4921;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4923;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4925;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4927;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4929;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4931;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4933;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4935;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4937;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4939;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4941;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4943;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4945;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4947;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4949;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4951;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4953;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4955;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4957;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4959;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4961;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4963;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4965;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4967;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4969;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4971;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4973;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4975;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4977;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4979;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4981;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4983;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4985;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4987;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4989;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4991;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4993;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4995;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 10653;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 10654;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 10657;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 10658;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 10661;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 10662;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 10665;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 10666;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 10669;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 10670;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 10673;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 10674;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 10677;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 10678;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 10681;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 10682;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 10685;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 10686;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 10689;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 10690;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 10693;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 10694;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 10697;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 10698;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 10701;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 10702;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 10705;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 10706;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 10709;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 10710;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 10713;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 10714;\n\t\t\tcase StoneBricks::StoneBricks().ID: return 4481;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3895;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3896;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3897;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3898;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3899;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3900;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3901;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3902;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3903;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3904;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3905;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3906;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3907;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3908;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3909;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3910;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3911;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3912;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3913;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3914;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3915;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3916;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3917;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3918;\n\t\t\tcase StonePressurePlate::StonePressurePlate(true).ID: return 3805;\n\t\t\tcase StonePressurePlate::StonePressurePlate(false).ID: return 3806;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Top).ID: return 7801;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Bottom).ID: return 7803;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Double).ID: return 7805;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 9614;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 9616;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 9618;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 9620;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 9622;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 9624;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 9626;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 9628;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 9630;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 9632;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 9634;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 9636;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 9638;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 9640;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 9642;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 9644;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 9646;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 9648;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 9650;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 9652;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 9654;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 9656;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 9658;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 9660;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 9662;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 9664;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 9666;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 9668;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 9670;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 9672;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 9674;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 9676;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 9678;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 9680;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 9682;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 9684;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 9686;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 9688;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 9690;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 9692;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_ZM).ID: return 11194;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_ZP).ID: return 11195;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_XM).ID: return 11196;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_XP).ID: return 11197;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::X).ID: return 99;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Y).ID: return 100;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Z).ID: return 101;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::X).ID: return 138;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Y).ID: return 139;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Z).ID: return 140;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::X).ID: return 93;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Y).ID: return 94;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Z).ID: return 95;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::X).ID: return 132;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Y).ID: return 133;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Z).ID: return 134;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::X).ID: return 102;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Y).ID: return 103;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Z).ID: return 104;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::X).ID: return 141;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Y).ID: return 142;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Z).ID: return 143;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::X).ID: return 96;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Y).ID: return 97;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Z).ID: return 98;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::X).ID: return 135;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Y).ID: return 136;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Z).ID: return 137;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::X).ID: return 105;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Y).ID: return 106;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Z).ID: return 107;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::X).ID: return 126;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Y).ID: return 127;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Z).ID: return 128;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::X).ID: return 90;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Y).ID: return 91;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Z).ID: return 92;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::X).ID: return 129;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Y).ID: return 130;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Z).ID: return 131;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Save).ID: return 11252;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Load).ID: return 11253;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Corner).ID: return 11254;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Data).ID: return 11255;\n\t\t\tcase StructureVoid::StructureVoid().ID: return 8723;\n\t\t\tcase SugarCane::SugarCane(0).ID: return 3946;\n\t\t\tcase SugarCane::SugarCane(1).ID: return 3947;\n\t\t\tcase SugarCane::SugarCane(2).ID: return 3948;\n\t\t\tcase SugarCane::SugarCane(3).ID: return 3949;\n\t\t\tcase SugarCane::SugarCane(4).ID: return 3950;\n\t\t\tcase SugarCane::SugarCane(5).ID: return 3951;\n\t\t\tcase SugarCane::SugarCane(6).ID: return 3952;\n\t\t\tcase SugarCane::SugarCane(7).ID: return 3953;\n\t\t\tcase SugarCane::SugarCane(8).ID: return 3954;\n\t\t\tcase SugarCane::SugarCane(9).ID: return 3955;\n\t\t\tcase SugarCane::SugarCane(10).ID: return 3956;\n\t\t\tcase SugarCane::SugarCane(11).ID: return 3957;\n\t\t\tcase SugarCane::SugarCane(12).ID: return 3958;\n\t\t\tcase SugarCane::SugarCane(13).ID: return 3959;\n\t\t\tcase SugarCane::SugarCane(14).ID: return 3960;\n\t\t\tcase SugarCane::SugarCane(15).ID: return 3961;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Upper).ID: return 7349;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Lower).ID: return 7350;\n\t\t\tcase SweetBerryBush::SweetBerryBush(0).ID: return 11248;\n\t\t\tcase SweetBerryBush::SweetBerryBush(1).ID: return 11249;\n\t\t\tcase SweetBerryBush::SweetBerryBush(2).ID: return 11250;\n\t\t\tcase SweetBerryBush::SweetBerryBush(3).ID: return 11251;\n\t\t\tcase TNT::TNT(true).ID: return 1429;\n\t\t\tcase TNT::TNT(false).ID: return 1430;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Upper).ID: return 7357;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Lower).ID: return 7358;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Upper).ID: return 1345;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Lower).ID: return 1346;\n\t\t\tcase Terracotta::Terracotta().ID: return 7346;\n\t\t\tcase Torch::Torch().ID: return 1434;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Single).ID: return 6087;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Left).ID: return 6089;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Right).ID: return 6091;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Single).ID: return 6093;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Left).ID: return 6095;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Right).ID: return 6097;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Single).ID: return 6099;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Left).ID: return 6101;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Right).ID: return 6103;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Single).ID: return 6105;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Left).ID: return 6107;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Right).ID: return 6109;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, true).ID: return 5259;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, false).ID: return 5260;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, true).ID: return 5261;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, false).ID: return 5262;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, true).ID: return 5263;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, false).ID: return 5264;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, true).ID: return 5265;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, false).ID: return 5266;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, true).ID: return 5267;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, false).ID: return 5268;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, true).ID: return 5269;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, false).ID: return 5270;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, true).ID: return 5271;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, false).ID: return 5272;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, true).ID: return 5273;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, false).ID: return 5274;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, true).ID: return 5275;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, false).ID: return 5276;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, true).ID: return 5277;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, false).ID: return 5278;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, true).ID: return 5279;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, false).ID: return 5280;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, true).ID: return 5281;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, false).ID: return 5282;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, true).ID: return 5283;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, false).ID: return 5284;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, true).ID: return 5285;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, false).ID: return 5286;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, true).ID: return 5287;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, false).ID: return 5288;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, true).ID: return 5289;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, false).ID: return 5290;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, true).ID: return 5291;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, false).ID: return 5292;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, true).ID: return 5293;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, false).ID: return 5294;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, true).ID: return 5295;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, false).ID: return 5296;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, true).ID: return 5297;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, false).ID: return 5298;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, true).ID: return 5299;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, false).ID: return 5300;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, true).ID: return 5301;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, false).ID: return 5302;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, true).ID: return 5303;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, false).ID: return 5304;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, true).ID: return 5305;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, false).ID: return 5306;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, true).ID: return 5307;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, false).ID: return 5308;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, true).ID: return 5309;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, false).ID: return 5310;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, true).ID: return 5311;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, false).ID: return 5312;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, true).ID: return 5313;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, false).ID: return 5314;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, true).ID: return 5315;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, false).ID: return 5316;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, true).ID: return 5317;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, false).ID: return 5318;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, true).ID: return 5319;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, false).ID: return 5320;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, true).ID: return 5321;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, false).ID: return 5322;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, true).ID: return 5323;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, false).ID: return 5324;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, true).ID: return 5325;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, false).ID: return 5326;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, true).ID: return 5327;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, false).ID: return 5328;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, true).ID: return 5329;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, false).ID: return 5330;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, true).ID: return 5331;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, false).ID: return 5332;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, true).ID: return 5333;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, false).ID: return 5334;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, true).ID: return 5335;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, false).ID: return 5336;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, true).ID: return 5337;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, false).ID: return 5338;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, true).ID: return 5339;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, false).ID: return 5340;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, true).ID: return 5341;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, false).ID: return 5342;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, true).ID: return 5343;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, false).ID: return 5344;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, true).ID: return 5345;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, false).ID: return 5346;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, true).ID: return 5347;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, false).ID: return 5348;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, true).ID: return 5349;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, false).ID: return 5350;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, true).ID: return 5351;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, false).ID: return 5352;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, true).ID: return 5353;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, false).ID: return 5354;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, true).ID: return 5355;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, false).ID: return 5356;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, true).ID: return 5357;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, false).ID: return 5358;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, true).ID: return 5359;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, false).ID: return 5360;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, true).ID: return 5361;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, false).ID: return 5362;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, true).ID: return 5363;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, false).ID: return 5364;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, true).ID: return 5365;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, false).ID: return 5366;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, true).ID: return 5367;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, false).ID: return 5368;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, true).ID: return 5369;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, false).ID: return 5370;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, true).ID: return 5371;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, false).ID: return 5372;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, true).ID: return 5373;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, false).ID: return 5374;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, true).ID: return 5375;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, false).ID: return 5376;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, true).ID: return 5377;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, false).ID: return 5378;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, true).ID: return 5379;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, false).ID: return 5380;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, true).ID: return 5381;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, false).ID: return 5382;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, true).ID: return 5383;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, false).ID: return 5384;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, true).ID: return 5385;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, false).ID: return 5386;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5243;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5244;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5245;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5246;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, true).ID: return 5247;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, false).ID: return 5248;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, true).ID: return 5249;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, false).ID: return 5250;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5251;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5252;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5253;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5254;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, true).ID: return 5255;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, false).ID: return 5256;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, true).ID: return 5257;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, false).ID: return 5258;\n\t\t\tcase TubeCoral::TubeCoral().ID: return 8995;\n\t\t\tcase TubeCoralBlock::TubeCoralBlock().ID: return 8979;\n\t\t\tcase TubeCoralFan::TubeCoralFan().ID: return 9015;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9065;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9067;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9069;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9071;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 0).ID: return 8962;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 1).ID: return 8963;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 2).ID: return 8964;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 0).ID: return 8965;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 1).ID: return 8966;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 2).ID: return 8967;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 0).ID: return 8968;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 1).ID: return 8969;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 2).ID: return 8970;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 0).ID: return 8971;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 1).ID: return 8972;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 2).ID: return 8973;\n\t\t\tcase Vine::Vine(true, true, true, true, true).ID: return 4772;\n\t\t\tcase Vine::Vine(true, true, true, true, false).ID: return 4773;\n\t\t\tcase Vine::Vine(true, true, true, false, true).ID: return 4774;\n\t\t\tcase Vine::Vine(true, true, true, false, false).ID: return 4775;\n\t\t\tcase Vine::Vine(true, true, false, true, true).ID: return 4776;\n\t\t\tcase Vine::Vine(true, true, false, true, false).ID: return 4777;\n\t\t\tcase Vine::Vine(true, true, false, false, true).ID: return 4778;\n\t\t\tcase Vine::Vine(true, true, false, false, false).ID: return 4779;\n\t\t\tcase Vine::Vine(true, false, true, true, true).ID: return 4780;\n\t\t\tcase Vine::Vine(true, false, true, true, false).ID: return 4781;\n\t\t\tcase Vine::Vine(true, false, true, false, true).ID: return 4782;\n\t\t\tcase Vine::Vine(true, false, true, false, false).ID: return 4783;\n\t\t\tcase Vine::Vine(true, false, false, true, true).ID: return 4784;\n\t\t\tcase Vine::Vine(true, false, false, true, false).ID: return 4785;\n\t\t\tcase Vine::Vine(true, false, false, false, true).ID: return 4786;\n\t\t\tcase Vine::Vine(true, false, false, false, false).ID: return 4787;\n\t\t\tcase Vine::Vine(false, true, true, true, true).ID: return 4788;\n\t\t\tcase Vine::Vine(false, true, true, true, false).ID: return 4789;\n\t\t\tcase Vine::Vine(false, true, true, false, true).ID: return 4790;\n\t\t\tcase Vine::Vine(false, true, true, false, false).ID: return 4791;\n\t\t\tcase Vine::Vine(false, true, false, true, true).ID: return 4792;\n\t\t\tcase Vine::Vine(false, true, false, true, false).ID: return 4793;\n\t\t\tcase Vine::Vine(false, true, false, false, true).ID: return 4794;\n\t\t\tcase Vine::Vine(false, true, false, false, false).ID: return 4795;\n\t\t\tcase Vine::Vine(false, false, true, true, true).ID: return 4796;\n\t\t\tcase Vine::Vine(false, false, true, true, false).ID: return 4797;\n\t\t\tcase Vine::Vine(false, false, true, false, true).ID: return 4798;\n\t\t\tcase Vine::Vine(false, false, true, false, false).ID: return 4799;\n\t\t\tcase Vine::Vine(false, false, false, true, true).ID: return 4800;\n\t\t\tcase Vine::Vine(false, false, false, true, false).ID: return 4801;\n\t\t\tcase Vine::Vine(false, false, false, false, true).ID: return 4802;\n\t\t\tcase Vine::Vine(false, false, false, false, false).ID: return 4803;\n\t\t\tcase VoidAir::VoidAir().ID: return 9129;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZM).ID: return 1435;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZP).ID: return 1436;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XM).ID: return 1437;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XP).ID: return 1438;\n\t\t\tcase Water::Water(0).ID: return 34;\n\t\t\tcase Water::Water(1).ID: return 35;\n\t\t\tcase Water::Water(2).ID: return 36;\n\t\t\tcase Water::Water(3).ID: return 37;\n\t\t\tcase Water::Water(4).ID: return 38;\n\t\t\tcase Water::Water(5).ID: return 39;\n\t\t\tcase Water::Water(6).ID: return 40;\n\t\t\tcase Water::Water(7).ID: return 41;\n\t\t\tcase Water::Water(8).ID: return 42;\n\t\t\tcase Water::Water(9).ID: return 43;\n\t\t\tcase Water::Water(10).ID: return 44;\n\t\t\tcase Water::Water(11).ID: return 45;\n\t\t\tcase Water::Water(12).ID: return 46;\n\t\t\tcase Water::Water(13).ID: return 47;\n\t\t\tcase Water::Water(14).ID: return 48;\n\t\t\tcase Water::Water(15).ID: return 49;\n\t\t\tcase WetSponge::WetSponge().ID: return 229;\n\t\t\tcase Wheat::Wheat(0).ID: return 3355;\n\t\t\tcase Wheat::Wheat(1).ID: return 3356;\n\t\t\tcase Wheat::Wheat(2).ID: return 3357;\n\t\t\tcase Wheat::Wheat(3).ID: return 3358;\n\t\t\tcase Wheat::Wheat(4).ID: return 3359;\n\t\t\tcase Wheat::Wheat(5).ID: return 3360;\n\t\t\tcase Wheat::Wheat(6).ID: return 3361;\n\t\t\tcase Wheat::Wheat(7).ID: return 3362;\n\t\t\tcase WhiteBanner::WhiteBanner(0).ID: return 7361;\n\t\t\tcase WhiteBanner::WhiteBanner(1).ID: return 7362;\n\t\t\tcase WhiteBanner::WhiteBanner(2).ID: return 7363;\n\t\t\tcase WhiteBanner::WhiteBanner(3).ID: return 7364;\n\t\t\tcase WhiteBanner::WhiteBanner(4).ID: return 7365;\n\t\t\tcase WhiteBanner::WhiteBanner(5).ID: return 7366;\n\t\t\tcase WhiteBanner::WhiteBanner(6).ID: return 7367;\n\t\t\tcase WhiteBanner::WhiteBanner(7).ID: return 7368;\n\t\t\tcase WhiteBanner::WhiteBanner(8).ID: return 7369;\n\t\t\tcase WhiteBanner::WhiteBanner(9).ID: return 7370;\n\t\t\tcase WhiteBanner::WhiteBanner(10).ID: return 7371;\n\t\t\tcase WhiteBanner::WhiteBanner(11).ID: return 7372;\n\t\t\tcase WhiteBanner::WhiteBanner(12).ID: return 7373;\n\t\t\tcase WhiteBanner::WhiteBanner(13).ID: return 7374;\n\t\t\tcase WhiteBanner::WhiteBanner(14).ID: return 7375;\n\t\t\tcase WhiteBanner::WhiteBanner(15).ID: return 7376;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Head).ID: return 1048;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Foot).ID: return 1049;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Head).ID: return 1050;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Foot).ID: return 1051;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Head).ID: return 1052;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Foot).ID: return 1053;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Head).ID: return 1054;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Foot).ID: return 1055;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Head).ID: return 1056;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Foot).ID: return 1057;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Head).ID: return 1058;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Foot).ID: return 1059;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Head).ID: return 1060;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Foot).ID: return 1061;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Head).ID: return 1062;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Foot).ID: return 1063;\n\t\t\tcase WhiteCarpet::WhiteCarpet().ID: return 7330;\n\t\t\tcase WhiteConcrete::WhiteConcrete().ID: return 8902;\n\t\t\tcase WhiteConcretePowder::WhiteConcretePowder().ID: return 8918;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8838;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8839;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8840;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8841;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8742;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8743;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8744;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8745;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8746;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8747;\n\t\t\tcase WhiteStainedGlass::WhiteStainedGlass().ID: return 4081;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, true).ID: return 6329;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, false).ID: return 6330;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, true).ID: return 6333;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, false).ID: return 6334;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, true).ID: return 6337;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, false).ID: return 6338;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, true).ID: return 6341;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, false).ID: return 6342;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, true).ID: return 6345;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, false).ID: return 6346;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, true).ID: return 6349;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, false).ID: return 6350;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, true).ID: return 6353;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, false).ID: return 6354;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, true).ID: return 6357;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, false).ID: return 6358;\n\t\t\tcase WhiteTerracotta::WhiteTerracotta().ID: return 6311;\n\t\t\tcase WhiteTulip::WhiteTulip().ID: return 1418;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7617;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7618;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7619;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7620;\n\t\t\tcase WhiteWool::WhiteWool().ID: return 1383;\n\t\t\tcase WitherRose::WitherRose().ID: return 1422;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(0).ID: return 5974;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(1).ID: return 5975;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(2).ID: return 5976;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(3).ID: return 5977;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(4).ID: return 5978;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(5).ID: return 5979;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(6).ID: return 5980;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(7).ID: return 5981;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(8).ID: return 5982;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(9).ID: return 5983;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(10).ID: return 5984;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(11).ID: return 5985;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(12).ID: return 5986;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(13).ID: return 5987;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(14).ID: return 5988;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(15).ID: return 5989;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 5990;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 5991;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 5992;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 5993;\n\t\t\tcase YellowBanner::YellowBanner(0).ID: return 7425;\n\t\t\tcase YellowBanner::YellowBanner(1).ID: return 7426;\n\t\t\tcase YellowBanner::YellowBanner(2).ID: return 7427;\n\t\t\tcase YellowBanner::YellowBanner(3).ID: return 7428;\n\t\t\tcase YellowBanner::YellowBanner(4).ID: return 7429;\n\t\t\tcase YellowBanner::YellowBanner(5).ID: return 7430;\n\t\t\tcase YellowBanner::YellowBanner(6).ID: return 7431;\n\t\t\tcase YellowBanner::YellowBanner(7).ID: return 7432;\n\t\t\tcase YellowBanner::YellowBanner(8).ID: return 7433;\n\t\t\tcase YellowBanner::YellowBanner(9).ID: return 7434;\n\t\t\tcase YellowBanner::YellowBanner(10).ID: return 7435;\n\t\t\tcase YellowBanner::YellowBanner(11).ID: return 7436;\n\t\t\tcase YellowBanner::YellowBanner(12).ID: return 7437;\n\t\t\tcase YellowBanner::YellowBanner(13).ID: return 7438;\n\t\t\tcase YellowBanner::YellowBanner(14).ID: return 7439;\n\t\t\tcase YellowBanner::YellowBanner(15).ID: return 7440;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Head).ID: return 1112;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Foot).ID: return 1113;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Head).ID: return 1114;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Foot).ID: return 1115;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Head).ID: return 1116;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Foot).ID: return 1117;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Head).ID: return 1118;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Foot).ID: return 1119;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Head).ID: return 1120;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Foot).ID: return 1121;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Head).ID: return 1122;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Foot).ID: return 1123;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Head).ID: return 1124;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Foot).ID: return 1125;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Head).ID: return 1126;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Foot).ID: return 1127;\n\t\t\tcase YellowCarpet::YellowCarpet().ID: return 7334;\n\t\t\tcase YellowConcrete::YellowConcrete().ID: return 8906;\n\t\t\tcase YellowConcretePowder::YellowConcretePowder().ID: return 8922;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8854;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8855;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8856;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8857;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8766;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8767;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8768;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8769;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8770;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8771;\n\t\t\tcase YellowStainedGlass::YellowStainedGlass().ID: return 4085;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, true).ID: return 6457;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, false).ID: return 6458;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, true).ID: return 6461;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, false).ID: return 6462;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, true).ID: return 6465;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, false).ID: return 6466;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, true).ID: return 6469;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, false).ID: return 6470;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, true).ID: return 6473;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, false).ID: return 6474;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, true).ID: return 6477;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, false).ID: return 6478;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, true).ID: return 6481;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, false).ID: return 6482;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, true).ID: return 6485;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, false).ID: return 6486;\n\t\t\tcase YellowTerracotta::YellowTerracotta().ID: return 6315;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7633;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7634;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7635;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7636;\n\t\t\tcase YellowWool::YellowWool().ID: return 1387;\n\t\t\tcase ZombieHead::ZombieHead(0).ID: return 5994;\n\t\t\tcase ZombieHead::ZombieHead(1).ID: return 5995;\n\t\t\tcase ZombieHead::ZombieHead(2).ID: return 5996;\n\t\t\tcase ZombieHead::ZombieHead(3).ID: return 5997;\n\t\t\tcase ZombieHead::ZombieHead(4).ID: return 5998;\n\t\t\tcase ZombieHead::ZombieHead(5).ID: return 5999;\n\t\t\tcase ZombieHead::ZombieHead(6).ID: return 6000;\n\t\t\tcase ZombieHead::ZombieHead(7).ID: return 6001;\n\t\t\tcase ZombieHead::ZombieHead(8).ID: return 6002;\n\t\t\tcase ZombieHead::ZombieHead(9).ID: return 6003;\n\t\t\tcase ZombieHead::ZombieHead(10).ID: return 6004;\n\t\t\tcase ZombieHead::ZombieHead(11).ID: return 6005;\n\t\t\tcase ZombieHead::ZombieHead(12).ID: return 6006;\n\t\t\tcase ZombieHead::ZombieHead(13).ID: return 6007;\n\t\t\tcase ZombieHead::ZombieHead(14).ID: return 6008;\n\t\t\tcase ZombieHead::ZombieHead(15).ID: return 6009;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6010;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6011;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6012;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6013;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const Item ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase Item::AcaciaBoat: return 833;\n\t\t\tcase Item::AcaciaButton: return 263;\n\t\t\tcase Item::AcaciaDoor: return 511;\n\t\t\tcase Item::AcaciaFence: return 185;\n\t\t\tcase Item::AcaciaFenceGate: return 220;\n\t\t\tcase Item::AcaciaLeaves: return 60;\n\t\t\tcase Item::AcaciaLog: return 36;\n\t\t\tcase Item::AcaciaPlanks: return 17;\n\t\t\tcase Item::AcaciaPressurePlate: return 170;\n\t\t\tcase Item::AcaciaSapling: return 23;\n\t\t\tcase Item::AcaciaSign: return 593;\n\t\t\tcase Item::AcaciaSlab: return 119;\n\t\t\tcase Item::AcaciaStairs: return 319;\n\t\t\tcase Item::AcaciaTrapdoor: return 197;\n\t\t\tcase Item::AcaciaWood: return 54;\n\t\t\tcase Item::ActivatorRail: return 279;\n\t\t\tcase Item::Air: return -0;\n\t\t\tcase Item::Allium: return 101;\n\t\t\tcase Item::Andesite: return 6;\n\t\t\tcase Item::AndesiteSlab: return 501;\n\t\t\tcase Item::AndesiteStairs: return 488;\n\t\t\tcase Item::AndesiteWall: return 254;\n\t\t\tcase Item::Anvil: return 265;\n\t\t\tcase Item::Apple: return 524;\n\t\t\tcase Item::ArmorStand: return 791;\n\t\t\tcase Item::Arrow: return 526;\n\t\t\tcase Item::AzureBluet: return 102;\n\t\t\tcase Item::BakedPotato: return 764;\n\t\t\tcase Item::Bamboo: return 614;\n\t\t\tcase Item::Barrel: return 864;\n\t\t\tcase Item::Barrier: return 297;\n\t\t\tcase Item::BatSpawnEgg: return 697;\n\t\t\tcase Item::Beacon: return 244;\n\t\t\tcase Item::Bedrock: return 25;\n\t\t\tcase Item::Beef: return 677;\n\t\t\tcase Item::Beetroot: return 820;\n\t\t\tcase Item::BeetrootSeeds: return 821;\n\t\t\tcase Item::BeetrootSoup: return 822;\n\t\t\tcase Item::Bell: return 873;\n\t\t\tcase Item::BirchBoat: return 831;\n\t\t\tcase Item::BirchButton: return 261;\n\t\t\tcase Item::BirchDoor: return 509;\n\t\t\tcase Item::BirchFence: return 183;\n\t\t\tcase Item::BirchFenceGate: return 218;\n\t\t\tcase Item::BirchLeaves: return 58;\n\t\t\tcase Item::BirchLog: return 34;\n\t\t\tcase Item::BirchPlanks: return 15;\n\t\t\tcase Item::BirchPressurePlate: return 168;\n\t\t\tcase Item::BirchSapling: return 21;\n\t\t\tcase Item::BirchSign: return 591;\n\t\t\tcase Item::BirchSlab: return 117;\n\t\t\tcase Item::BirchStairs: return 241;\n\t\t\tcase Item::BirchTrapdoor: return 195;\n\t\t\tcase Item::BirchWood: return 52;\n\t\t\tcase Item::BlackBanner: return 816;\n\t\t\tcase Item::BlackBed: return 669;\n\t\t\tcase Item::BlackCarpet: return 315;\n\t\t\tcase Item::BlackConcrete: return 428;\n\t\t\tcase Item::BlackConcretePowder: return 444;\n\t\t\tcase Item::BlackDye: return 649;\n\t\t\tcase Item::BlackGlazedTerracotta: return 412;\n\t\t\tcase Item::BlackShulkerBox: return 396;\n\t\t\tcase Item::BlackStainedGlass: return 344;\n\t\t\tcase Item::BlackStainedGlassPane: return 360;\n\t\t\tcase Item::BlackTerracotta: return 296;\n\t\t\tcase Item::BlackWool: return 97;\n\t\t\tcase Item::BlastFurnace: return 866;\n\t\t\tcase Item::BlazePowder: return 691;\n\t\t\tcase Item::BlazeRod: return 683;\n\t\t\tcase Item::BlazeSpawnEgg: return 698;\n\t\t\tcase Item::BlueBanner: return 812;\n\t\t\tcase Item::BlueBed: return 665;\n\t\t\tcase Item::BlueCarpet: return 311;\n\t\t\tcase Item::BlueConcrete: return 424;\n\t\t\tcase Item::BlueConcretePowder: return 440;\n\t\t\tcase Item::BlueDye: return 647;\n\t\t\tcase Item::BlueGlazedTerracotta: return 408;\n\t\t\tcase Item::BlueIce: return 476;\n\t\t\tcase Item::BlueOrchid: return 100;\n\t\t\tcase Item::BlueShulkerBox: return 392;\n\t\t\tcase Item::BlueStainedGlass: return 340;\n\t\t\tcase Item::BlueStainedGlassPane: return 356;\n\t\t\tcase Item::BlueTerracotta: return 292;\n\t\t\tcase Item::BlueWool: return 93;\n\t\t\tcase Item::Bone: return 651;\n\t\t\tcase Item::BoneBlock: return 377;\n\t\t\tcase Item::BoneMeal: return 646;\n\t\t\tcase Item::Book: return 616;\n\t\t\tcase Item::Bookshelf: return 143;\n\t\t\tcase Item::Bow: return 525;\n\t\t\tcase Item::Bowl: return 546;\n\t\t\tcase Item::BrainCoral: return 457;\n\t\t\tcase Item::BrainCoralBlock: return 452;\n\t\t\tcase Item::BrainCoralFan: return 467;\n\t\t\tcase Item::Bread: return 562;\n\t\t\tcase Item::BrewingStand: return 693;\n\t\t\tcase Item::Brick: return 609;\n\t\t\tcase Item::BrickSlab: return 127;\n\t\t\tcase Item::BrickStairs: return 222;\n\t\t\tcase Item::BrickWall: return 247;\n\t\t\tcase Item::Bricks: return 141;\n\t\t\tcase Item::BrownBanner: return 813;\n\t\t\tcase Item::BrownBed: return 666;\n\t\t\tcase Item::BrownCarpet: return 312;\n\t\t\tcase Item::BrownConcrete: return 425;\n\t\t\tcase Item::BrownConcretePowder: return 441;\n\t\t\tcase Item::BrownDye: return 648;\n\t\t\tcase Item::BrownGlazedTerracotta: return 409;\n\t\t\tcase Item::BrownMushroom: return 111;\n\t\t\tcase Item::BrownMushroomBlock: return 209;\n\t\t\tcase Item::BrownShulkerBox: return 393;\n\t\t\tcase Item::BrownStainedGlass: return 341;\n\t\t\tcase Item::BrownStainedGlassPane: return 357;\n\t\t\tcase Item::BrownTerracotta: return 293;\n\t\t\tcase Item::BrownWool: return 94;\n\t\t\tcase Item::BubbleCoral: return 458;\n\t\t\tcase Item::BubbleCoralBlock: return 453;\n\t\t\tcase Item::BubbleCoralFan: return 468;\n\t\t\tcase Item::Bucket: return 595;\n\t\t\tcase Item::Cactus: return 178;\n\t\t\tcase Item::Cake: return 653;\n\t\t\tcase Item::Campfire: return 876;\n\t\t\tcase Item::Carrot: return 762;\n\t\t\tcase Item::CarrotOnAStick: return 774;\n\t\t\tcase Item::CartographyTable: return 867;\n\t\t\tcase Item::CarvedPumpkin: return 188;\n\t\t\tcase Item::CatSpawnEgg: return 699;\n\t\t\tcase Item::Cauldron: return 694;\n\t\t\tcase Item::CaveSpiderSpawnEgg: return 700;\n\t\t\tcase Item::ChainCommandBlock: return 373;\n\t\t\tcase Item::ChainmailBoots: return 570;\n\t\t\tcase Item::ChainmailChestplate: return 568;\n\t\t\tcase Item::ChainmailHelmet: return 567;\n\t\t\tcase Item::ChainmailLeggings: return 569;\n\t\t\tcase Item::Charcoal: return 528;\n\t\t\tcase Item::Chest: return 155;\n\t\t\tcase Item::ChestMinecart: return 618;\n\t\t\tcase Item::Chicken: return 679;\n\t\t\tcase Item::ChickenSpawnEgg: return 701;\n\t\t\tcase Item::ChippedAnvil: return 266;\n\t\t\tcase Item::ChiseledQuartzBlock: return 275;\n\t\t\tcase Item::ChiseledRedSandstone: return 369;\n\t\t\tcase Item::ChiseledSandstone: return 69;\n\t\t\tcase Item::ChiseledStoneBricks: return 208;\n\t\t\tcase Item::ChorusFlower: return 149;\n\t\t\tcase Item::ChorusFruit: return 818;\n\t\t\tcase Item::ChorusPlant: return 148;\n\t\t\tcase Item::Clay: return 179;\n\t\t\tcase Item::ClayBall: return 610;\n\t\t\tcase Item::Clock: return 623;\n\t\t\tcase Item::Coal: return 527;\n\t\t\tcase Item::CoalBlock: return 317;\n\t\t\tcase Item::CoalOre: return 31;\n\t\t\tcase Item::CoarseDirt: return 10;\n\t\t\tcase Item::Cobblestone: return 12;\n\t\t\tcase Item::CobblestoneSlab: return 126;\n\t\t\tcase Item::CobblestoneStairs: return 163;\n\t\t\tcase Item::CobblestoneWall: return 245;\n\t\t\tcase Item::Cobweb: return 75;\n\t\t\tcase Item::CocoaBeans: return 634;\n\t\t\tcase Item::Cod: return 625;\n\t\t\tcase Item::CodBucket: return 607;\n\t\t\tcase Item::CodSpawnEgg: return 702;\n\t\t\tcase Item::CommandBlock: return 243;\n\t\t\tcase Item::CommandBlockMinecart: return 798;\n\t\t\tcase Item::Comparator: return 514;\n\t\t\tcase Item::Compass: return 621;\n\t\t\tcase Item::Composter: return 517;\n\t\t\tcase Item::Conduit: return 477;\n\t\t\tcase Item::CookedBeef: return 678;\n\t\t\tcase Item::CookedChicken: return 680;\n\t\t\tcase Item::CookedCod: return 629;\n\t\t\tcase Item::CookedMutton: return 800;\n\t\t\tcase Item::CookedPorkchop: return 585;\n\t\t\tcase Item::CookedRabbit: return 787;\n\t\t\tcase Item::CookedSalmon: return 630;\n\t\t\tcase Item::Cookie: return 670;\n\t\t\tcase Item::Cornflower: return 108;\n\t\t\tcase Item::CowSpawnEgg: return 703;\n\t\t\tcase Item::CrackedStoneBricks: return 207;\n\t\t\tcase Item::CraftingTable: return 158;\n\t\t\tcase Item::CreeperBannerPattern: return 860;\n\t\t\tcase Item::CreeperHead: return 772;\n\t\t\tcase Item::CreeperSpawnEgg: return 704;\n\t\t\tcase Item::Crossbow: return 856;\n\t\t\tcase Item::CutRedSandstone: return 370;\n\t\t\tcase Item::CutRedSandstoneSlab: return 132;\n\t\t\tcase Item::CutSandstone: return 70;\n\t\t\tcase Item::CutSandstoneSlab: return 124;\n\t\t\tcase Item::CyanBanner: return 810;\n\t\t\tcase Item::CyanBed: return 663;\n\t\t\tcase Item::CyanCarpet: return 309;\n\t\t\tcase Item::CyanConcrete: return 422;\n\t\t\tcase Item::CyanConcretePowder: return 438;\n\t\t\tcase Item::CyanDye: return 637;\n\t\t\tcase Item::CyanGlazedTerracotta: return 406;\n\t\t\tcase Item::CyanShulkerBox: return 390;\n\t\t\tcase Item::CyanStainedGlass: return 338;\n\t\t\tcase Item::CyanStainedGlassPane: return 354;\n\t\t\tcase Item::CyanTerracotta: return 290;\n\t\t\tcase Item::CyanWool: return 91;\n\t\t\tcase Item::DamagedAnvil: return 267;\n\t\t\tcase Item::Dandelion: return 98;\n\t\t\tcase Item::DarkOakBoat: return 834;\n\t\t\tcase Item::DarkOakButton: return 264;\n\t\t\tcase Item::DarkOakDoor: return 512;\n\t\t\tcase Item::DarkOakFence: return 186;\n\t\t\tcase Item::DarkOakFenceGate: return 221;\n\t\t\tcase Item::DarkOakLeaves: return 61;\n\t\t\tcase Item::DarkOakLog: return 37;\n\t\t\tcase Item::DarkOakPlanks: return 18;\n\t\t\tcase Item::DarkOakPressurePlate: return 171;\n\t\t\tcase Item::DarkOakSapling: return 24;\n\t\t\tcase Item::DarkOakSign: return 594;\n\t\t\tcase Item::DarkOakSlab: return 120;\n\t\t\tcase Item::DarkOakStairs: return 320;\n\t\t\tcase Item::DarkOakTrapdoor: return 198;\n\t\t\tcase Item::DarkOakWood: return 55;\n\t\t\tcase Item::DarkPrismarine: return 363;\n\t\t\tcase Item::DarkPrismarineSlab: return 136;\n\t\t\tcase Item::DarkPrismarineStairs: return 366;\n\t\t\tcase Item::DaylightDetector: return 271;\n\t\t\tcase Item::DeadBrainCoral: return 461;\n\t\t\tcase Item::DeadBrainCoralBlock: return 447;\n\t\t\tcase Item::DeadBrainCoralFan: return 472;\n\t\t\tcase Item::DeadBubbleCoral: return 462;\n\t\t\tcase Item::DeadBubbleCoralBlock: return 448;\n\t\t\tcase Item::DeadBubbleCoralFan: return 473;\n\t\t\tcase Item::DeadBush: return 78;\n\t\t\tcase Item::DeadFireCoral: return 463;\n\t\t\tcase Item::DeadFireCoralBlock: return 449;\n\t\t\tcase Item::DeadFireCoralFan: return 474;\n\t\t\tcase Item::DeadHornCoral: return 464;\n\t\t\tcase Item::DeadHornCoralBlock: return 450;\n\t\t\tcase Item::DeadHornCoralFan: return 475;\n\t\t\tcase Item::DeadTubeCoral: return 465;\n\t\t\tcase Item::DeadTubeCoralBlock: return 446;\n\t\t\tcase Item::DeadTubeCoralFan: return 471;\n\t\t\tcase Item::DebugStick: return 839;\n\t\t\tcase Item::DetectorRail: return 73;\n\t\t\tcase Item::Diamond: return 529;\n\t\t\tcase Item::DiamondAxe: return 544;\n\t\t\tcase Item::DiamondBlock: return 157;\n\t\t\tcase Item::DiamondBoots: return 578;\n\t\t\tcase Item::DiamondChestplate: return 576;\n\t\t\tcase Item::DiamondHelmet: return 575;\n\t\t\tcase Item::DiamondHoe: return 558;\n\t\t\tcase Item::DiamondHorseArmor: return 794;\n\t\t\tcase Item::DiamondLeggings: return 577;\n\t\t\tcase Item::DiamondOre: return 156;\n\t\t\tcase Item::DiamondPickaxe: return 543;\n\t\t\tcase Item::DiamondShovel: return 542;\n\t\t\tcase Item::DiamondSword: return 541;\n\t\t\tcase Item::Diorite: return 4;\n\t\t\tcase Item::DioriteSlab: return 504;\n\t\t\tcase Item::DioriteStairs: return 491;\n\t\t\tcase Item::DioriteWall: return 258;\n\t\t\tcase Item::Dirt: return 9;\n\t\t\tcase Item::Dispenser: return 67;\n\t\t\tcase Item::DolphinSpawnEgg: return 705;\n\t\t\tcase Item::DonkeySpawnEgg: return 706;\n\t\t\tcase Item::DragonBreath: return 823;\n\t\t\tcase Item::DragonEgg: return 233;\n\t\t\tcase Item::DragonHead: return 773;\n\t\t\tcase Item::DriedKelp: return 674;\n\t\t\tcase Item::DriedKelpBlock: return 613;\n\t\t\tcase Item::Dropper: return 280;\n\t\t\tcase Item::DrownedSpawnEgg: return 707;\n\t\t\tcase Item::Egg: return 620;\n\t\t\tcase Item::ElderGuardianSpawnEgg: return 708;\n\t\t\tcase Item::Elytra: return 829;\n\t\t\tcase Item::Emerald: return 759;\n\t\t\tcase Item::EmeraldBlock: return 239;\n\t\t\tcase Item::EmeraldOre: return 236;\n\t\t\tcase Item::EnchantedBook: return 779;\n\t\t\tcase Item::EnchantedGoldenApple: return 588;\n\t\t\tcase Item::EnchantingTable: return 229;\n\t\t\tcase Item::EndCrystal: return 817;\n\t\t\tcase Item::EndPortalFrame: return 230;\n\t\t\tcase Item::EndRod: return 147;\n\t\t\tcase Item::EndStone: return 231;\n\t\t\tcase Item::EndStoneBrickSlab: return 497;\n\t\t\tcase Item::EndStoneBrickStairs: return 483;\n\t\t\tcase Item::EndStoneBrickWall: return 257;\n\t\t\tcase Item::EndStoneBricks: return 232;\n\t\t\tcase Item::EnderChest: return 237;\n\t\t\tcase Item::EnderEye: return 695;\n\t\t\tcase Item::EnderPearl: return 682;\n\t\t\tcase Item::EndermanSpawnEgg: return 709;\n\t\t\tcase Item::EndermiteSpawnEgg: return 710;\n\t\t\tcase Item::EvokerSpawnEgg: return 711;\n\t\t\tcase Item::ExperienceBottle: return 755;\n\t\t\tcase Item::Farmland: return 159;\n\t\t\tcase Item::Feather: return 553;\n\t\t\tcase Item::FermentedSpiderEye: return 690;\n\t\t\tcase Item::Fern: return 77;\n\t\t\tcase Item::FilledMap: return 671;\n\t\t\tcase Item::FireCharge: return 756;\n\t\t\tcase Item::FireCoral: return 459;\n\t\t\tcase Item::FireCoralBlock: return 454;\n\t\t\tcase Item::FireCoralFan: return 469;\n\t\t\tcase Item::FireworkRocket: return 777;\n\t\t\tcase Item::FireworkStar: return 778;\n\t\t\tcase Item::FishingRod: return 622;\n\t\t\tcase Item::FletchingTable: return 868;\n\t\t\tcase Item::Flint: return 583;\n\t\t\tcase Item::FlintAndSteel: return 523;\n\t\t\tcase Item::FlowerBannerPattern: return 859;\n\t\t\tcase Item::FlowerPot: return 761;\n\t\t\tcase Item::FoxSpawnEgg: return 712;\n\t\t\tcase Item::Furnace: return 160;\n\t\t\tcase Item::FurnaceMinecart: return 619;\n\t\t\tcase Item::GhastSpawnEgg: return 713;\n\t\t\tcase Item::GhastTear: return 684;\n\t\t\tcase Item::Glass: return 64;\n\t\t\tcase Item::GlassBottle: return 688;\n\t\t\tcase Item::GlassPane: return 213;\n\t\t\tcase Item::GlisteringMelonSlice: return 696;\n\t\t\tcase Item::GlobeBannerPattern: return 863;\n\t\t\tcase Item::Glowstone: return 191;\n\t\t\tcase Item::GlowstoneDust: return 624;\n\t\t\tcase Item::GoldBlock: return 113;\n\t\t\tcase Item::GoldIngot: return 531;\n\t\t\tcase Item::GoldNugget: return 685;\n\t\t\tcase Item::GoldOre: return 29;\n\t\t\tcase Item::GoldenApple: return 587;\n\t\t\tcase Item::GoldenAxe: return 551;\n\t\t\tcase Item::GoldenBoots: return 582;\n\t\t\tcase Item::GoldenCarrot: return 767;\n\t\t\tcase Item::GoldenChestplate: return 580;\n\t\t\tcase Item::GoldenHelmet: return 579;\n\t\t\tcase Item::GoldenHoe: return 559;\n\t\t\tcase Item::GoldenHorseArmor: return 793;\n\t\t\tcase Item::GoldenLeggings: return 581;\n\t\t\tcase Item::GoldenPickaxe: return 550;\n\t\t\tcase Item::GoldenShovel: return 549;\n\t\t\tcase Item::GoldenSword: return 548;\n\t\t\tcase Item::Granite: return 2;\n\t\t\tcase Item::GraniteSlab: return 500;\n\t\t\tcase Item::GraniteStairs: return 487;\n\t\t\tcase Item::GraniteWall: return 251;\n\t\t\tcase Item::Grass: return 76;\n\t\t\tcase Item::GrassBlock: return 8;\n\t\t\tcase Item::GrassPath: return 322;\n\t\t\tcase Item::Gravel: return 28;\n\t\t\tcase Item::GrayBanner: return 808;\n\t\t\tcase Item::GrayBed: return 661;\n\t\t\tcase Item::GrayCarpet: return 307;\n\t\t\tcase Item::GrayConcrete: return 420;\n\t\t\tcase Item::GrayConcretePowder: return 436;\n\t\t\tcase Item::GrayDye: return 639;\n\t\t\tcase Item::GrayGlazedTerracotta: return 404;\n\t\t\tcase Item::GrayShulkerBox: return 388;\n\t\t\tcase Item::GrayStainedGlass: return 336;\n\t\t\tcase Item::GrayStainedGlassPane: return 352;\n\t\t\tcase Item::GrayTerracotta: return 288;\n\t\t\tcase Item::GrayWool: return 89;\n\t\t\tcase Item::GreenBanner: return 814;\n\t\t\tcase Item::GreenBed: return 667;\n\t\t\tcase Item::GreenCarpet: return 313;\n\t\t\tcase Item::GreenConcrete: return 426;\n\t\t\tcase Item::GreenConcretePowder: return 442;\n\t\t\tcase Item::GreenDye: return 633;\n\t\t\tcase Item::GreenGlazedTerracotta: return 410;\n\t\t\tcase Item::GreenShulkerBox: return 394;\n\t\t\tcase Item::GreenStainedGlass: return 342;\n\t\t\tcase Item::GreenStainedGlassPane: return 358;\n\t\t\tcase Item::GreenTerracotta: return 294;\n\t\t\tcase Item::GreenWool: return 95;\n\t\t\tcase Item::Grindstone: return 869;\n\t\t\tcase Item::GuardianSpawnEgg: return 714;\n\t\t\tcase Item::Gunpowder: return 554;\n\t\t\tcase Item::HayBale: return 299;\n\t\t\tcase Item::HeartOfTheSea: return 855;\n\t\t\tcase Item::HeavyWeightedPressurePlate: return 270;\n\t\t\tcase Item::Hopper: return 274;\n\t\t\tcase Item::HopperMinecart: return 783;\n\t\t\tcase Item::HornCoral: return 460;\n\t\t\tcase Item::HornCoralBlock: return 455;\n\t\t\tcase Item::HornCoralFan: return 470;\n\t\t\tcase Item::HorseSpawnEgg: return 715;\n\t\t\tcase Item::HuskSpawnEgg: return 716;\n\t\t\tcase Item::Ice: return 176;\n\t\t\tcase Item::InfestedChiseledStoneBricks: return 204;\n\t\t\tcase Item::InfestedCobblestone: return 200;\n\t\t\tcase Item::InfestedCrackedStoneBricks: return 203;\n\t\t\tcase Item::InfestedMossyStoneBricks: return 202;\n\t\t\tcase Item::InfestedStone: return 199;\n\t\t\tcase Item::InfestedStoneBricks: return 201;\n\t\t\tcase Item::InkSac: return 631;\n\t\t\tcase Item::IronAxe: return 522;\n\t\t\tcase Item::IronBars: return 212;\n\t\t\tcase Item::IronBlock: return 114;\n\t\t\tcase Item::IronBoots: return 574;\n\t\t\tcase Item::IronChestplate: return 572;\n\t\t\tcase Item::IronDoor: return 506;\n\t\t\tcase Item::IronHelmet: return 571;\n\t\t\tcase Item::IronHoe: return 557;\n\t\t\tcase Item::IronHorseArmor: return 792;\n\t\t\tcase Item::IronIngot: return 530;\n\t\t\tcase Item::IronLeggings: return 573;\n\t\t\tcase Item::IronNugget: return 837;\n\t\t\tcase Item::IronOre: return 30;\n\t\t\tcase Item::IronPickaxe: return 521;\n\t\t\tcase Item::IronShovel: return 520;\n\t\t\tcase Item::IronSword: return 532;\n\t\t\tcase Item::IronTrapdoor: return 298;\n\t\t\tcase Item::ItemFrame: return 760;\n\t\t\tcase Item::JackOLantern: return 192;\n\t\t\tcase Item::Jigsaw: return 516;\n\t\t\tcase Item::Jukebox: return 180;\n\t\t\tcase Item::JungleBoat: return 832;\n\t\t\tcase Item::JungleButton: return 262;\n\t\t\tcase Item::JungleDoor: return 510;\n\t\t\tcase Item::JungleFence: return 184;\n\t\t\tcase Item::JungleFenceGate: return 219;\n\t\t\tcase Item::JungleLeaves: return 59;\n\t\t\tcase Item::JungleLog: return 35;\n\t\t\tcase Item::JunglePlanks: return 16;\n\t\t\tcase Item::JunglePressurePlate: return 169;\n\t\t\tcase Item::JungleSapling: return 22;\n\t\t\tcase Item::JungleSign: return 592;\n\t\t\tcase Item::JungleSlab: return 118;\n\t\t\tcase Item::JungleStairs: return 242;\n\t\t\tcase Item::JungleTrapdoor: return 196;\n\t\t\tcase Item::JungleWood: return 53;\n\t\t\tcase Item::Kelp: return 612;\n\t\t\tcase Item::KnowledgeBook: return 838;\n\t\t\tcase Item::Ladder: return 161;\n\t\t\tcase Item::Lantern: return 874;\n\t\t\tcase Item::LapisBlock: return 66;\n\t\t\tcase Item::LapisLazuli: return 635;\n\t\t\tcase Item::LapisOre: return 65;\n\t\t\tcase Item::LargeFern: return 328;\n\t\t\tcase Item::LavaBucket: return 597;\n\t\t\tcase Item::Lead: return 796;\n\t\t\tcase Item::Leather: return 603;\n\t\t\tcase Item::LeatherBoots: return 566;\n\t\t\tcase Item::LeatherChestplate: return 564;\n\t\t\tcase Item::LeatherHelmet: return 563;\n\t\t\tcase Item::LeatherHorseArmor: return 795;\n\t\t\tcase Item::LeatherLeggings: return 565;\n\t\t\tcase Item::Lectern: return 870;\n\t\t\tcase Item::Lever: return 164;\n\t\t\tcase Item::LightBlueBanner: return 804;\n\t\t\tcase Item::LightBlueBed: return 657;\n\t\t\tcase Item::LightBlueCarpet: return 303;\n\t\t\tcase Item::LightBlueConcrete: return 416;\n\t\t\tcase Item::LightBlueConcretePowder: return 432;\n\t\t\tcase Item::LightBlueDye: return 643;\n\t\t\tcase Item::LightBlueGlazedTerracotta: return 400;\n\t\t\tcase Item::LightBlueShulkerBox: return 384;\n\t\t\tcase Item::LightBlueStainedGlass: return 332;\n\t\t\tcase Item::LightBlueStainedGlassPane: return 348;\n\t\t\tcase Item::LightBlueTerracotta: return 284;\n\t\t\tcase Item::LightBlueWool: return 85;\n\t\t\tcase Item::LightGrayBanner: return 809;\n\t\t\tcase Item::LightGrayBed: return 662;\n\t\t\tcase Item::LightGrayCarpet: return 308;\n\t\t\tcase Item::LightGrayConcrete: return 421;\n\t\t\tcase Item::LightGrayConcretePowder: return 437;\n\t\t\tcase Item::LightGrayDye: return 638;\n\t\t\tcase Item::LightGrayGlazedTerracotta: return 405;\n\t\t\tcase Item::LightGrayShulkerBox: return 389;\n\t\t\tcase Item::LightGrayStainedGlass: return 337;\n\t\t\tcase Item::LightGrayStainedGlassPane: return 353;\n\t\t\tcase Item::LightGrayTerracotta: return 289;\n\t\t\tcase Item::LightGrayWool: return 90;\n\t\t\tcase Item::LightWeightedPressurePlate: return 269;\n\t\t\tcase Item::Lilac: return 324;\n\t\t\tcase Item::LilyOfTheValley: return 109;\n\t\t\tcase Item::LilyPad: return 225;\n\t\t\tcase Item::LimeBanner: return 806;\n\t\t\tcase Item::LimeBed: return 659;\n\t\t\tcase Item::LimeCarpet: return 305;\n\t\t\tcase Item::LimeConcrete: return 418;\n\t\t\tcase Item::LimeConcretePowder: return 434;\n\t\t\tcase Item::LimeDye: return 641;\n\t\t\tcase Item::LimeGlazedTerracotta: return 402;\n\t\t\tcase Item::LimeShulkerBox: return 386;\n\t\t\tcase Item::LimeStainedGlass: return 334;\n\t\t\tcase Item::LimeStainedGlassPane: return 350;\n\t\t\tcase Item::LimeTerracotta: return 286;\n\t\t\tcase Item::LimeWool: return 87;\n\t\t\tcase Item::LingeringPotion: return 827;\n\t\t\tcase Item::LlamaSpawnEgg: return 717;\n\t\t\tcase Item::Loom: return 858;\n\t\t\tcase Item::MagentaBanner: return 803;\n\t\t\tcase Item::MagentaBed: return 656;\n\t\t\tcase Item::MagentaCarpet: return 302;\n\t\t\tcase Item::MagentaConcrete: return 415;\n\t\t\tcase Item::MagentaConcretePowder: return 431;\n\t\t\tcase Item::MagentaDye: return 644;\n\t\t\tcase Item::MagentaGlazedTerracotta: return 399;\n\t\t\tcase Item::MagentaShulkerBox: return 383;\n\t\t\tcase Item::MagentaStainedGlass: return 331;\n\t\t\tcase Item::MagentaStainedGlassPane: return 347;\n\t\t\tcase Item::MagentaTerracotta: return 283;\n\t\t\tcase Item::MagentaWool: return 84;\n\t\t\tcase Item::MagmaBlock: return 374;\n\t\t\tcase Item::MagmaCream: return 692;\n\t\t\tcase Item::MagmaCubeSpawnEgg: return 718;\n\t\t\tcase Item::Map: return 766;\n\t\t\tcase Item::Melon: return 214;\n\t\t\tcase Item::MelonSeeds: return 676;\n\t\t\tcase Item::MelonSlice: return 673;\n\t\t\tcase Item::MilkBucket: return 604;\n\t\t\tcase Item::Minecart: return 598;\n\t\t\tcase Item::MojangBannerPattern: return 862;\n\t\t\tcase Item::MooshroomSpawnEgg: return 719;\n\t\t\tcase Item::MossyCobblestone: return 144;\n\t\t\tcase Item::MossyCobblestoneSlab: return 496;\n\t\t\tcase Item::MossyCobblestoneStairs: return 482;\n\t\t\tcase Item::MossyCobblestoneWall: return 246;\n\t\t\tcase Item::MossyStoneBrickSlab: return 494;\n\t\t\tcase Item::MossyStoneBrickStairs: return 480;\n\t\t\tcase Item::MossyStoneBrickWall: return 250;\n\t\t\tcase Item::MossyStoneBricks: return 206;\n\t\t\tcase Item::MuleSpawnEgg: return 720;\n\t\t\tcase Item::MushroomStem: return 211;\n\t\t\tcase Item::MushroomStew: return 547;\n\t\t\tcase Item::MusicDisc11: return 850;\n\t\t\tcase Item::MusicDisc13: return 840;\n\t\t\tcase Item::MusicDiscBlocks: return 842;\n\t\t\tcase Item::MusicDiscCat: return 841;\n\t\t\tcase Item::MusicDiscChirp: return 843;\n\t\t\tcase Item::MusicDiscFar: return 844;\n\t\t\tcase Item::MusicDiscMall: return 845;\n\t\t\tcase Item::MusicDiscMellohi: return 846;\n\t\t\tcase Item::MusicDiscStal: return 847;\n\t\t\tcase Item::MusicDiscStrad: return 848;\n\t\t\tcase Item::MusicDiscWait: return 851;\n\t\t\tcase Item::MusicDiscWard: return 849;\n\t\t\tcase Item::Mutton: return 799;\n\t\t\tcase Item::Mycelium: return 224;\n\t\t\tcase Item::NameTag: return 797;\n\t\t\tcase Item::NautilusShell: return 854;\n\t\t\tcase Item::NetherBrick: return 780;\n\t\t\tcase Item::NetherBrickFence: return 227;\n\t\t\tcase Item::NetherBrickSlab: return 129;\n\t\t\tcase Item::NetherBrickStairs: return 228;\n\t\t\tcase Item::NetherBrickWall: return 253;\n\t\t\tcase Item::NetherBricks: return 226;\n\t\t\tcase Item::NetherQuartzOre: return 273;\n\t\t\tcase Item::NetherStar: return 775;\n\t\t\tcase Item::NetherWart: return 686;\n\t\t\tcase Item::NetherWartBlock: return 375;\n\t\t\tcase Item::Netherrack: return 189;\n\t\t\tcase Item::NoteBlock: return 71;\n\t\t\tcase Item::OakBoat: return 602;\n\t\t\tcase Item::OakButton: return 259;\n\t\t\tcase Item::OakDoor: return 507;\n\t\t\tcase Item::OakFence: return 181;\n\t\t\tcase Item::OakFenceGate: return 216;\n\t\t\tcase Item::OakLeaves: return 56;\n\t\t\tcase Item::OakLog: return 32;\n\t\t\tcase Item::OakPlanks: return 13;\n\t\t\tcase Item::OakPressurePlate: return 166;\n\t\t\tcase Item::OakSapling: return 19;\n\t\t\tcase Item::OakSign: return 589;\n\t\t\tcase Item::OakSlab: return 115;\n\t\t\tcase Item::OakStairs: return 154;\n\t\t\tcase Item::OakTrapdoor: return 193;\n\t\t\tcase Item::OakWood: return 50;\n\t\t\tcase Item::Observer: return 379;\n\t\t\tcase Item::Obsidian: return 145;\n\t\t\tcase Item::OcelotSpawnEgg: return 721;\n\t\t\tcase Item::OrangeBanner: return 802;\n\t\t\tcase Item::OrangeBed: return 655;\n\t\t\tcase Item::OrangeCarpet: return 301;\n\t\t\tcase Item::OrangeConcrete: return 414;\n\t\t\tcase Item::OrangeConcretePowder: return 430;\n\t\t\tcase Item::OrangeDye: return 645;\n\t\t\tcase Item::OrangeGlazedTerracotta: return 398;\n\t\t\tcase Item::OrangeShulkerBox: return 382;\n\t\t\tcase Item::OrangeStainedGlass: return 330;\n\t\t\tcase Item::OrangeStainedGlassPane: return 346;\n\t\t\tcase Item::OrangeTerracotta: return 282;\n\t\t\tcase Item::OrangeTulip: return 104;\n\t\t\tcase Item::OrangeWool: return 83;\n\t\t\tcase Item::OxeyeDaisy: return 107;\n\t\t\tcase Item::PackedIce: return 318;\n\t\t\tcase Item::Painting: return 586;\n\t\t\tcase Item::PandaSpawnEgg: return 722;\n\t\t\tcase Item::Paper: return 615;\n\t\t\tcase Item::ParrotSpawnEgg: return 723;\n\t\t\tcase Item::Peony: return 326;\n\t\t\tcase Item::PetrifiedOakSlab: return 125;\n\t\t\tcase Item::PhantomMembrane: return 853;\n\t\t\tcase Item::PhantomSpawnEgg: return 724;\n\t\t\tcase Item::PigSpawnEgg: return 725;\n\t\t\tcase Item::PillagerSpawnEgg: return 726;\n\t\t\tcase Item::PinkBanner: return 807;\n\t\t\tcase Item::PinkBed: return 660;\n\t\t\tcase Item::PinkCarpet: return 306;\n\t\t\tcase Item::PinkConcrete: return 419;\n\t\t\tcase Item::PinkConcretePowder: return 435;\n\t\t\tcase Item::PinkDye: return 640;\n\t\t\tcase Item::PinkGlazedTerracotta: return 403;\n\t\t\tcase Item::PinkShulkerBox: return 387;\n\t\t\tcase Item::PinkStainedGlass: return 335;\n\t\t\tcase Item::PinkStainedGlassPane: return 351;\n\t\t\tcase Item::PinkTerracotta: return 287;\n\t\t\tcase Item::PinkTulip: return 106;\n\t\t\tcase Item::PinkWool: return 88;\n\t\t\tcase Item::Piston: return 81;\n\t\t\tcase Item::PlayerHead: return 770;\n\t\t\tcase Item::Podzol: return 11;\n\t\t\tcase Item::PoisonousPotato: return 765;\n\t\t\tcase Item::PolarBearSpawnEgg: return 727;\n\t\t\tcase Item::PolishedAndesite: return 7;\n\t\t\tcase Item::PolishedAndesiteSlab: return 503;\n\t\t\tcase Item::PolishedAndesiteStairs: return 490;\n\t\t\tcase Item::PolishedDiorite: return 5;\n\t\t\tcase Item::PolishedDioriteSlab: return 495;\n\t\t\tcase Item::PolishedDioriteStairs: return 481;\n\t\t\tcase Item::PolishedGranite: return 3;\n\t\t\tcase Item::PolishedGraniteSlab: return 492;\n\t\t\tcase Item::PolishedGraniteStairs: return 478;\n\t\t\tcase Item::PoppedChorusFruit: return 819;\n\t\t\tcase Item::Poppy: return 99;\n\t\t\tcase Item::Porkchop: return 584;\n\t\t\tcase Item::Potato: return 763;\n\t\t\tcase Item::Potion: return 687;\n\t\t\tcase Item::PoweredRail: return 72;\n\t\t\tcase Item::Prismarine: return 361;\n\t\t\tcase Item::PrismarineBrickSlab: return 135;\n\t\t\tcase Item::PrismarineBrickStairs: return 365;\n\t\t\tcase Item::PrismarineBricks: return 362;\n\t\t\tcase Item::PrismarineCrystals: return 785;\n\t\t\tcase Item::PrismarineShard: return 784;\n\t\t\tcase Item::PrismarineSlab: return 134;\n\t\t\tcase Item::PrismarineStairs: return 364;\n\t\t\tcase Item::PrismarineWall: return 248;\n\t\t\tcase Item::Pufferfish: return 628;\n\t\t\tcase Item::PufferfishBucket: return 605;\n\t\t\tcase Item::PufferfishSpawnEgg: return 728;\n\t\t\tcase Item::Pumpkin: return 187;\n\t\t\tcase Item::PumpkinPie: return 776;\n\t\t\tcase Item::PumpkinSeeds: return 675;\n\t\t\tcase Item::PurpleBanner: return 811;\n\t\t\tcase Item::PurpleBed: return 664;\n\t\t\tcase Item::PurpleCarpet: return 310;\n\t\t\tcase Item::PurpleConcrete: return 423;\n\t\t\tcase Item::PurpleConcretePowder: return 439;\n\t\t\tcase Item::PurpleDye: return 636;\n\t\t\tcase Item::PurpleGlazedTerracotta: return 407;\n\t\t\tcase Item::PurpleShulkerBox: return 391;\n\t\t\tcase Item::PurpleStainedGlass: return 339;\n\t\t\tcase Item::PurpleStainedGlassPane: return 355;\n\t\t\tcase Item::PurpleTerracotta: return 291;\n\t\t\tcase Item::PurpleWool: return 92;\n\t\t\tcase Item::PurpurBlock: return 150;\n\t\t\tcase Item::PurpurPillar: return 151;\n\t\t\tcase Item::PurpurSlab: return 133;\n\t\t\tcase Item::PurpurStairs: return 152;\n\t\t\tcase Item::Quartz: return 781;\n\t\t\tcase Item::QuartzBlock: return 276;\n\t\t\tcase Item::QuartzPillar: return 277;\n\t\t\tcase Item::QuartzSlab: return 130;\n\t\t\tcase Item::QuartzStairs: return 278;\n\t\t\tcase Item::Rabbit: return 786;\n\t\t\tcase Item::RabbitFoot: return 789;\n\t\t\tcase Item::RabbitHide: return 790;\n\t\t\tcase Item::RabbitSpawnEgg: return 729;\n\t\t\tcase Item::RabbitStew: return 788;\n\t\t\tcase Item::Rail: return 162;\n\t\t\tcase Item::RavagerSpawnEgg: return 730;\n\t\t\tcase Item::RedBanner: return 815;\n\t\t\tcase Item::RedBed: return 668;\n\t\t\tcase Item::RedCarpet: return 314;\n\t\t\tcase Item::RedConcrete: return 427;\n\t\t\tcase Item::RedConcretePowder: return 443;\n\t\t\tcase Item::RedDye: return 632;\n\t\t\tcase Item::RedGlazedTerracotta: return 411;\n\t\t\tcase Item::RedMushroom: return 112;\n\t\t\tcase Item::RedMushroomBlock: return 210;\n\t\t\tcase Item::RedNetherBrickSlab: return 502;\n\t\t\tcase Item::RedNetherBrickStairs: return 489;\n\t\t\tcase Item::RedNetherBrickWall: return 255;\n\t\t\tcase Item::RedNetherBricks: return 376;\n\t\t\tcase Item::RedSand: return 27;\n\t\t\tcase Item::RedSandstone: return 368;\n\t\t\tcase Item::RedSandstoneSlab: return 131;\n\t\t\tcase Item::RedSandstoneStairs: return 371;\n\t\t\tcase Item::RedSandstoneWall: return 249;\n\t\t\tcase Item::RedShulkerBox: return 395;\n\t\t\tcase Item::RedStainedGlass: return 343;\n\t\t\tcase Item::RedStainedGlassPane: return 359;\n\t\t\tcase Item::RedTerracotta: return 295;\n\t\t\tcase Item::RedTulip: return 103;\n\t\t\tcase Item::RedWool: return 96;\n\t\t\tcase Item::Redstone: return 600;\n\t\t\tcase Item::RedstoneBlock: return 272;\n\t\t\tcase Item::RedstoneLamp: return 234;\n\t\t\tcase Item::RedstoneOre: return 172;\n\t\t\tcase Item::RedstoneTorch: return 173;\n\t\t\tcase Item::Repeater: return 513;\n\t\t\tcase Item::RepeatingCommandBlock: return 372;\n\t\t\tcase Item::RoseBush: return 325;\n\t\t\tcase Item::RottenFlesh: return 681;\n\t\t\tcase Item::Saddle: return 599;\n\t\t\tcase Item::Salmon: return 626;\n\t\t\tcase Item::SalmonBucket: return 606;\n\t\t\tcase Item::SalmonSpawnEgg: return 731;\n\t\t\tcase Item::Sand: return 26;\n\t\t\tcase Item::Sandstone: return 68;\n\t\t\tcase Item::SandstoneSlab: return 123;\n\t\t\tcase Item::SandstoneStairs: return 235;\n\t\t\tcase Item::SandstoneWall: return 256;\n\t\t\tcase Item::Scaffolding: return 505;\n\t\t\tcase Item::Scute: return 519;\n\t\t\tcase Item::SeaLantern: return 367;\n\t\t\tcase Item::SeaPickle: return 80;\n\t\t\tcase Item::Seagrass: return 79;\n\t\t\tcase Item::Shears: return 672;\n\t\t\tcase Item::SheepSpawnEgg: return 732;\n\t\t\tcase Item::Shield: return 828;\n\t\t\tcase Item::ShulkerBox: return 380;\n\t\t\tcase Item::ShulkerShell: return 836;\n\t\t\tcase Item::ShulkerSpawnEgg: return 733;\n\t\t\tcase Item::SilverfishSpawnEgg: return 734;\n\t\t\tcase Item::SkeletonHorseSpawnEgg: return 736;\n\t\t\tcase Item::SkeletonSkull: return 768;\n\t\t\tcase Item::SkeletonSpawnEgg: return 735;\n\t\t\tcase Item::SkullBannerPattern: return 861;\n\t\t\tcase Item::SlimeBall: return 617;\n\t\t\tcase Item::SlimeBlock: return 321;\n\t\t\tcase Item::SlimeSpawnEgg: return 737;\n\t\t\tcase Item::SmithingTable: return 871;\n\t\t\tcase Item::Smoker: return 865;\n\t\t\tcase Item::SmoothQuartz: return 137;\n\t\t\tcase Item::SmoothQuartzSlab: return 499;\n\t\t\tcase Item::SmoothQuartzStairs: return 486;\n\t\t\tcase Item::SmoothRedSandstone: return 138;\n\t\t\tcase Item::SmoothRedSandstoneSlab: return 493;\n\t\t\tcase Item::SmoothRedSandstoneStairs: return 479;\n\t\t\tcase Item::SmoothSandstone: return 139;\n\t\t\tcase Item::SmoothSandstoneSlab: return 498;\n\t\t\tcase Item::SmoothSandstoneStairs: return 485;\n\t\t\tcase Item::SmoothStone: return 140;\n\t\t\tcase Item::SmoothStoneSlab: return 122;\n\t\t\tcase Item::Snow: return 175;\n\t\t\tcase Item::SnowBlock: return 177;\n\t\t\tcase Item::Snowball: return 601;\n\t\t\tcase Item::SoulSand: return 190;\n\t\t\tcase Item::Spawner: return 153;\n\t\t\tcase Item::SpectralArrow: return 825;\n\t\t\tcase Item::SpiderEye: return 689;\n\t\t\tcase Item::SpiderSpawnEgg: return 738;\n\t\t\tcase Item::SplashPotion: return 824;\n\t\t\tcase Item::Sponge: return 62;\n\t\t\tcase Item::SpruceBoat: return 830;\n\t\t\tcase Item::SpruceButton: return 260;\n\t\t\tcase Item::SpruceDoor: return 508;\n\t\t\tcase Item::SpruceFence: return 182;\n\t\t\tcase Item::SpruceFenceGate: return 217;\n\t\t\tcase Item::SpruceLeaves: return 57;\n\t\t\tcase Item::SpruceLog: return 33;\n\t\t\tcase Item::SprucePlanks: return 14;\n\t\t\tcase Item::SprucePressurePlate: return 167;\n\t\t\tcase Item::SpruceSapling: return 20;\n\t\t\tcase Item::SpruceSign: return 590;\n\t\t\tcase Item::SpruceSlab: return 116;\n\t\t\tcase Item::SpruceStairs: return 240;\n\t\t\tcase Item::SpruceTrapdoor: return 194;\n\t\t\tcase Item::SpruceWood: return 51;\n\t\t\tcase Item::SquidSpawnEgg: return 739;\n\t\t\tcase Item::Stick: return 545;\n\t\t\tcase Item::StickyPiston: return 74;\n\t\t\tcase Item::Stone: return 1;\n\t\t\tcase Item::StoneAxe: return 540;\n\t\t\tcase Item::StoneBrickSlab: return 128;\n\t\t\tcase Item::StoneBrickStairs: return 223;\n\t\t\tcase Item::StoneBrickWall: return 252;\n\t\t\tcase Item::StoneBricks: return 205;\n\t\t\tcase Item::StoneButton: return 174;\n\t\t\tcase Item::StoneHoe: return 556;\n\t\t\tcase Item::StonePickaxe: return 539;\n\t\t\tcase Item::StonePressurePlate: return 165;\n\t\t\tcase Item::StoneShovel: return 538;\n\t\t\tcase Item::StoneSlab: return 121;\n\t\t\tcase Item::StoneStairs: return 484;\n\t\t\tcase Item::StoneSword: return 537;\n\t\t\tcase Item::Stonecutter: return 872;\n\t\t\tcase Item::StraySpawnEgg: return 740;\n\t\t\tcase Item::String: return 552;\n\t\t\tcase Item::StrippedAcaciaLog: return 42;\n\t\t\tcase Item::StrippedAcaciaWood: return 48;\n\t\t\tcase Item::StrippedBirchLog: return 40;\n\t\t\tcase Item::StrippedBirchWood: return 46;\n\t\t\tcase Item::StrippedDarkOakLog: return 43;\n\t\t\tcase Item::StrippedDarkOakWood: return 49;\n\t\t\tcase Item::StrippedJungleLog: return 41;\n\t\t\tcase Item::StrippedJungleWood: return 47;\n\t\t\tcase Item::StrippedOakLog: return 38;\n\t\t\tcase Item::StrippedOakWood: return 44;\n\t\t\tcase Item::StrippedSpruceLog: return 39;\n\t\t\tcase Item::StrippedSpruceWood: return 45;\n\t\t\tcase Item::StructureBlock: return 515;\n\t\t\tcase Item::StructureVoid: return 378;\n\t\t\tcase Item::Sugar: return 652;\n\t\t\tcase Item::SugarCane: return 611;\n\t\t\tcase Item::Sunflower: return 323;\n\t\t\tcase Item::SuspiciousStew: return 857;\n\t\t\tcase Item::SweetBerries: return 875;\n\t\t\tcase Item::TallGrass: return 327;\n\t\t\tcase Item::Terracotta: return 316;\n\t\t\tcase Item::TippedArrow: return 826;\n\t\t\tcase Item::TNT: return 142;\n\t\t\tcase Item::TNTMinecart: return 782;\n\t\t\tcase Item::Torch: return 146;\n\t\t\tcase Item::TotemOfUndying: return 835;\n\t\t\tcase Item::TraderLlamaSpawnEgg: return 741;\n\t\t\tcase Item::TrappedChest: return 268;\n\t\t\tcase Item::Trident: return 852;\n\t\t\tcase Item::TripwireHook: return 238;\n\t\t\tcase Item::TropicalFish: return 627;\n\t\t\tcase Item::TropicalFishBucket: return 608;\n\t\t\tcase Item::TropicalFishSpawnEgg: return 742;\n\t\t\tcase Item::TubeCoral: return 456;\n\t\t\tcase Item::TubeCoralBlock: return 451;\n\t\t\tcase Item::TubeCoralFan: return 466;\n\t\t\tcase Item::TurtleEgg: return 445;\n\t\t\tcase Item::TurtleHelmet: return 518;\n\t\t\tcase Item::TurtleSpawnEgg: return 743;\n\t\t\tcase Item::VexSpawnEgg: return 744;\n\t\t\tcase Item::VillagerSpawnEgg: return 745;\n\t\t\tcase Item::VindicatorSpawnEgg: return 746;\n\t\t\tcase Item::Vine: return 215;\n\t\t\tcase Item::WanderingTraderSpawnEgg: return 747;\n\t\t\tcase Item::WaterBucket: return 596;\n\t\t\tcase Item::WetSponge: return 63;\n\t\t\tcase Item::Wheat: return 561;\n\t\t\tcase Item::WheatSeeds: return 560;\n\t\t\tcase Item::WhiteBanner: return 801;\n\t\t\tcase Item::WhiteBed: return 654;\n\t\t\tcase Item::WhiteCarpet: return 300;\n\t\t\tcase Item::WhiteConcrete: return 413;\n\t\t\tcase Item::WhiteConcretePowder: return 429;\n\t\t\tcase Item::WhiteDye: return 650;\n\t\t\tcase Item::WhiteGlazedTerracotta: return 397;\n\t\t\tcase Item::WhiteShulkerBox: return 381;\n\t\t\tcase Item::WhiteStainedGlass: return 329;\n\t\t\tcase Item::WhiteStainedGlassPane: return 345;\n\t\t\tcase Item::WhiteTerracotta: return 281;\n\t\t\tcase Item::WhiteTulip: return 105;\n\t\t\tcase Item::WhiteWool: return 82;\n\t\t\tcase Item::WitchSpawnEgg: return 748;\n\t\t\tcase Item::WitherRose: return 110;\n\t\t\tcase Item::WitherSkeletonSkull: return 769;\n\t\t\tcase Item::WitherSkeletonSpawnEgg: return 749;\n\t\t\tcase Item::WolfSpawnEgg: return 750;\n\t\t\tcase Item::WoodenAxe: return 536;\n\t\t\tcase Item::WoodenHoe: return 555;\n\t\t\tcase Item::WoodenPickaxe: return 535;\n\t\t\tcase Item::WoodenShovel: return 534;\n\t\t\tcase Item::WoodenSword: return 533;\n\t\t\tcase Item::WritableBook: return 757;\n\t\t\tcase Item::WrittenBook: return 758;\n\t\t\tcase Item::YellowBanner: return 805;\n\t\t\tcase Item::YellowBed: return 658;\n\t\t\tcase Item::YellowCarpet: return 304;\n\t\t\tcase Item::YellowConcrete: return 417;\n\t\t\tcase Item::YellowConcretePowder: return 433;\n\t\t\tcase Item::YellowDye: return 642;\n\t\t\tcase Item::YellowGlazedTerracotta: return 401;\n\t\t\tcase Item::YellowShulkerBox: return 385;\n\t\t\tcase Item::YellowStainedGlass: return 333;\n\t\t\tcase Item::YellowStainedGlassPane: return 349;\n\t\t\tcase Item::YellowTerracotta: return 285;\n\t\t\tcase Item::YellowWool: return 86;\n\t\t\tcase Item::ZombieHead: return 771;\n\t\t\tcase Item::ZombieHorseSpawnEgg: return 752;\n\t\t\tcase Item::ZombiePigmanSpawnEgg: return 753;\n\t\t\tcase Item::ZombieSpawnEgg: return 751;\n\t\t\tcase Item::ZombieVillagerSpawnEgg: return 754;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const CustomStatistic ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase CustomStatistic::AnimalsBred: return 30;\n\t\t\tcase CustomStatistic::AviateOneCm: return 17;\n\t\t\tcase CustomStatistic::BellRing: return 66;\n\t\t\tcase CustomStatistic::BoatOneCm: return 14;\n\t\t\tcase CustomStatistic::CleanArmor: return 38;\n\t\t\tcase CustomStatistic::CleanBanner: return 39;\n\t\t\tcase CustomStatistic::CleanShulkerBox: return 40;\n\t\t\tcase CustomStatistic::ClimbOneCm: return 10;\n\t\t\tcase CustomStatistic::CrouchOneCm: return 6;\n\t\t\tcase CustomStatistic::DamageAbsorbed: return 26;\n\t\t\tcase CustomStatistic::DamageBlockedByShield: return 25;\n\t\t\tcase CustomStatistic::DamageDealt: return 21;\n\t\t\tcase CustomStatistic::DamageDealtAbsorbed: return 22;\n\t\t\tcase CustomStatistic::DamageDealtResisted: return 23;\n\t\t\tcase CustomStatistic::DamageResisted: return 27;\n\t\t\tcase CustomStatistic::DamageTaken: return 24;\n\t\t\tcase CustomStatistic::Deaths: return 28;\n\t\t\tcase CustomStatistic::Drop: return 20;\n\t\t\tcase CustomStatistic::EatCakeSlice: return 35;\n\t\t\tcase CustomStatistic::EnchantItem: return 51;\n\t\t\tcase CustomStatistic::FallOneCm: return 9;\n\t\t\tcase CustomStatistic::FillCauldron: return 36;\n\t\t\tcase CustomStatistic::FishCaught: return 32;\n\t\t\tcase CustomStatistic::FlyOneCm: return 11;\n\t\t\tcase CustomStatistic::HorseOneCm: return 16;\n\t\t\tcase CustomStatistic::InspectDispenser: return 45;\n\t\t\tcase CustomStatistic::InspectDropper: return 43;\n\t\t\tcase CustomStatistic::InspectHopper: return 44;\n\t\t\tcase CustomStatistic::InteractWithBeacon: return 42;\n\t\t\tcase CustomStatistic::InteractWithBlastFurnace: return 59;\n\t\t\tcase CustomStatistic::InteractWithBrewingstand: return 41;\n\t\t\tcase CustomStatistic::InteractWithCampfire: return 62;\n\t\t\tcase CustomStatistic::InteractWithCartographyTable: return 63;\n\t\t\tcase CustomStatistic::InteractWithCraftingTable: return 54;\n\t\t\tcase CustomStatistic::InteractWithFurnace: return 53;\n\t\t\tcase CustomStatistic::InteractWithLectern: return 61;\n\t\t\tcase CustomStatistic::InteractWithLoom: return 64;\n\t\t\tcase CustomStatistic::InteractWithSmoker: return 60;\n\t\t\tcase CustomStatistic::InteractWithStonecutter: return 65;\n\t\t\tcase CustomStatistic::Jump: return 19;\n\t\t\tcase CustomStatistic::LeaveGame: return 0;\n\t\t\tcase CustomStatistic::MinecartOneCm: return 13;\n\t\t\tcase CustomStatistic::MobKills: return 29;\n\t\t\tcase CustomStatistic::OpenBarrel: return 58;\n\t\t\tcase CustomStatistic::OpenChest: return 55;\n\t\t\tcase CustomStatistic::OpenEnderchest: return 50;\n\t\t\tcase CustomStatistic::OpenShulkerBox: return 57;\n\t\t\tcase CustomStatistic::PigOneCm: return 15;\n\t\t\tcase CustomStatistic::PlayerKills: return 31;\n\t\t\tcase CustomStatistic::PlayNoteblock: return 46;\n\t\t\tcase CustomStatistic::PlayOneMinute: return 1;\n\t\t\tcase CustomStatistic::PlayRecord: return 52;\n\t\t\tcase CustomStatistic::PotFlower: return 48;\n\t\t\tcase CustomStatistic::RaidTrigger: return 67;\n\t\t\tcase CustomStatistic::RaidWin: return 68;\n\t\t\tcase CustomStatistic::SleepInBed: return 56;\n\t\t\tcase CustomStatistic::SneakTime: return 4;\n\t\t\tcase CustomStatistic::SprintOneCm: return 7;\n\t\t\tcase CustomStatistic::SwimOneCm: return 18;\n\t\t\tcase CustomStatistic::TalkedToVillager: return 33;\n\t\t\tcase CustomStatistic::TimeSinceDeath: return 2;\n\t\t\tcase CustomStatistic::TimeSinceRest: return 3;\n\t\t\tcase CustomStatistic::TradedWithVillager: return 34;\n\t\t\tcase CustomStatistic::TriggerTrappedChest: return 49;\n\t\t\tcase CustomStatistic::TuneNoteblock: return 47;\n\t\t\tcase CustomStatistic::UseCauldron: return 37;\n\t\t\tcase CustomStatistic::WalkOneCm: return 5;\n\t\t\tcase CustomStatistic::WalkOnWaterOneCm: return 8;\n\t\t\tcase CustomStatistic::WalkUnderWaterOneCm: return 12;\n\t\t\tdefault: return static_cast<UInt32>(-1);\n\t\t}\n\t}\n\n\tItem ToItem(const UInt32 ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase 833: return Item::AcaciaBoat;\n\t\t\tcase 263: return Item::AcaciaButton;\n\t\t\tcase 511: return Item::AcaciaDoor;\n\t\t\tcase 185: return Item::AcaciaFence;\n\t\t\tcase 220: return Item::AcaciaFenceGate;\n\t\t\tcase 60: return Item::AcaciaLeaves;\n\t\t\tcase 36: return Item::AcaciaLog;\n\t\t\tcase 17: return Item::AcaciaPlanks;\n\t\t\tcase 170: return Item::AcaciaPressurePlate;\n\t\t\tcase 23: return Item::AcaciaSapling;\n\t\t\tcase 593: return Item::AcaciaSign;\n\t\t\tcase 119: return Item::AcaciaSlab;\n\t\t\tcase 319: return Item::AcaciaStairs;\n\t\t\tcase 197: return Item::AcaciaTrapdoor;\n\t\t\tcase 54: return Item::AcaciaWood;\n\t\t\tcase 279: return Item::ActivatorRail;\n\t\t\tcase -0: return Item::Air;\n\t\t\tcase 101: return Item::Allium;\n\t\t\tcase 6: return Item::Andesite;\n\t\t\tcase 501: return Item::AndesiteSlab;\n\t\t\tcase 488: return Item::AndesiteStairs;\n\t\t\tcase 254: return Item::AndesiteWall;\n\t\t\tcase 265: return Item::Anvil;\n\t\t\tcase 524: return Item::Apple;\n\t\t\tcase 791: return Item::ArmorStand;\n\t\t\tcase 526: return Item::Arrow;\n\t\t\tcase 102: return Item::AzureBluet;\n\t\t\tcase 764: return Item::BakedPotato;\n\t\t\tcase 614: return Item::Bamboo;\n\t\t\tcase 864: return Item::Barrel;\n\t\t\tcase 297: return Item::Barrier;\n\t\t\tcase 697: return Item::BatSpawnEgg;\n\t\t\tcase 244: return Item::Beacon;\n\t\t\tcase 25: return Item::Bedrock;\n\t\t\tcase 677: return Item::Beef;\n\t\t\tcase 820: return Item::Beetroot;\n\t\t\tcase 821: return Item::BeetrootSeeds;\n\t\t\tcase 822: return Item::BeetrootSoup;\n\t\t\tcase 873: return Item::Bell;\n\t\t\tcase 831: return Item::BirchBoat;\n\t\t\tcase 261: return Item::BirchButton;\n\t\t\tcase 509: return Item::BirchDoor;\n\t\t\tcase 183: return Item::BirchFence;\n\t\t\tcase 218: return Item::BirchFenceGate;\n\t\t\tcase 58: return Item::BirchLeaves;\n\t\t\tcase 34: return Item::BirchLog;\n\t\t\tcase 15: return Item::BirchPlanks;\n\t\t\tcase 168: return Item::BirchPressurePlate;\n\t\t\tcase 21: return Item::BirchSapling;\n\t\t\tcase 591: return Item::BirchSign;\n\t\t\tcase 117: return Item::BirchSlab;\n\t\t\tcase 241: return Item::BirchStairs;\n\t\t\tcase 195: return Item::BirchTrapdoor;\n\t\t\tcase 52: return Item::BirchWood;\n\t\t\tcase 816: return Item::BlackBanner;\n\t\t\tcase 669: return Item::BlackBed;\n\t\t\tcase 315: return Item::BlackCarpet;\n\t\t\tcase 428: return Item::BlackConcrete;\n\t\t\tcase 444: return Item::BlackConcretePowder;\n\t\t\tcase 649: return Item::BlackDye;\n\t\t\tcase 412: return Item::BlackGlazedTerracotta;\n\t\t\tcase 396: return Item::BlackShulkerBox;\n\t\t\tcase 344: return Item::BlackStainedGlass;\n\t\t\tcase 360: return Item::BlackStainedGlassPane;\n\t\t\tcase 296: return Item::BlackTerracotta;\n\t\t\tcase 97: return Item::BlackWool;\n\t\t\tcase 866: return Item::BlastFurnace;\n\t\t\tcase 691: return Item::BlazePowder;\n\t\t\tcase 683: return Item::BlazeRod;\n\t\t\tcase 698: return Item::BlazeSpawnEgg;\n\t\t\tcase 812: return Item::BlueBanner;\n\t\t\tcase 665: return Item::BlueBed;\n\t\t\tcase 311: return Item::BlueCarpet;\n\t\t\tcase 424: return Item::BlueConcrete;\n\t\t\tcase 440: return Item::BlueConcretePowder;\n\t\t\tcase 647: return Item::BlueDye;\n\t\t\tcase 408: return Item::BlueGlazedTerracotta;\n\t\t\tcase 476: return Item::BlueIce;\n\t\t\tcase 100: return Item::BlueOrchid;\n\t\t\tcase 392: return Item::BlueShulkerBox;\n\t\t\tcase 340: return Item::BlueStainedGlass;\n\t\t\tcase 356: return Item::BlueStainedGlassPane;\n\t\t\tcase 292: return Item::BlueTerracotta;\n\t\t\tcase 93: return Item::BlueWool;\n\t\t\tcase 651: return Item::Bone;\n\t\t\tcase 377: return Item::BoneBlock;\n\t\t\tcase 646: return Item::BoneMeal;\n\t\t\tcase 616: return Item::Book;\n\t\t\tcase 143: return Item::Bookshelf;\n\t\t\tcase 525: return Item::Bow;\n\t\t\tcase 546: return Item::Bowl;\n\t\t\tcase 457: return Item::BrainCoral;\n\t\t\tcase 452: return Item::BrainCoralBlock;\n\t\t\tcase 467: return Item::BrainCoralFan;\n\t\t\tcase 562: return Item::Bread;\n\t\t\tcase 693: return Item::BrewingStand;\n\t\t\tcase 609: return Item::Brick;\n\t\t\tcase 127: return Item::BrickSlab;\n\t\t\tcase 222: return Item::BrickStairs;\n\t\t\tcase 247: return Item::BrickWall;\n\t\t\tcase 141: return Item::Bricks;\n\t\t\tcase 813: return Item::BrownBanner;\n\t\t\tcase 666: return Item::BrownBed;\n\t\t\tcase 312: return Item::BrownCarpet;\n\t\t\tcase 425: return Item::BrownConcrete;\n\t\t\tcase 441: return Item::BrownConcretePowder;\n\t\t\tcase 648: return Item::BrownDye;\n\t\t\tcase 409: return Item::BrownGlazedTerracotta;\n\t\t\tcase 111: return Item::BrownMushroom;\n\t\t\tcase 209: return Item::BrownMushroomBlock;\n\t\t\tcase 393: return Item::BrownShulkerBox;\n\t\t\tcase 341: return Item::BrownStainedGlass;\n\t\t\tcase 357: return Item::BrownStainedGlassPane;\n\t\t\tcase 293: return Item::BrownTerracotta;\n\t\t\tcase 94: return Item::BrownWool;\n\t\t\tcase 458: return Item::BubbleCoral;\n\t\t\tcase 453: return Item::BubbleCoralBlock;\n\t\t\tcase 468: return Item::BubbleCoralFan;\n\t\t\tcase 595: return Item::Bucket;\n\t\t\tcase 178: return Item::Cactus;\n\t\t\tcase 653: return Item::Cake;\n\t\t\tcase 876: return Item::Campfire;\n\t\t\tcase 762: return Item::Carrot;\n\t\t\tcase 774: return Item::CarrotOnAStick;\n\t\t\tcase 867: return Item::CartographyTable;\n\t\t\tcase 188: return Item::CarvedPumpkin;\n\t\t\tcase 699: return Item::CatSpawnEgg;\n\t\t\tcase 694: return Item::Cauldron;\n\t\t\tcase 700: return Item::CaveSpiderSpawnEgg;\n\t\t\tcase 373: return Item::ChainCommandBlock;\n\t\t\tcase 570: return Item::ChainmailBoots;\n\t\t\tcase 568: return Item::ChainmailChestplate;\n\t\t\tcase 567: return Item::ChainmailHelmet;\n\t\t\tcase 569: return Item::ChainmailLeggings;\n\t\t\tcase 528: return Item::Charcoal;\n\t\t\tcase 155: return Item::Chest;\n\t\t\tcase 618: return Item::ChestMinecart;\n\t\t\tcase 679: return Item::Chicken;\n\t\t\tcase 701: return Item::ChickenSpawnEgg;\n\t\t\tcase 266: return Item::ChippedAnvil;\n\t\t\tcase 275: return Item::ChiseledQuartzBlock;\n\t\t\tcase 369: return Item::ChiseledRedSandstone;\n\t\t\tcase 69: return Item::ChiseledSandstone;\n\t\t\tcase 208: return Item::ChiseledStoneBricks;\n\t\t\tcase 149: return Item::ChorusFlower;\n\t\t\tcase 818: return Item::ChorusFruit;\n\t\t\tcase 148: return Item::ChorusPlant;\n\t\t\tcase 179: return Item::Clay;\n\t\t\tcase 610: return Item::ClayBall;\n\t\t\tcase 623: return Item::Clock;\n\t\t\tcase 527: return Item::Coal;\n\t\t\tcase 317: return Item::CoalBlock;\n\t\t\tcase 31: return Item::CoalOre;\n\t\t\tcase 10: return Item::CoarseDirt;\n\t\t\tcase 12: return Item::Cobblestone;\n\t\t\tcase 126: return Item::CobblestoneSlab;\n\t\t\tcase 163: return Item::CobblestoneStairs;\n\t\t\tcase 245: return Item::CobblestoneWall;\n\t\t\tcase 75: return Item::Cobweb;\n\t\t\tcase 634: return Item::CocoaBeans;\n\t\t\tcase 625: return Item::Cod;\n\t\t\tcase 607: return Item::CodBucket;\n\t\t\tcase 702: return Item::CodSpawnEgg;\n\t\t\tcase 243: return Item::CommandBlock;\n\t\t\tcase 798: return Item::CommandBlockMinecart;\n\t\t\tcase 514: return Item::Comparator;\n\t\t\tcase 621: return Item::Compass;\n\t\t\tcase 517: return Item::Composter;\n\t\t\tcase 477: return Item::Conduit;\n\t\t\tcase 678: return Item::CookedBeef;\n\t\t\tcase 680: return Item::CookedChicken;\n\t\t\tcase 629: return Item::CookedCod;\n\t\t\tcase 800: return Item::CookedMutton;\n\t\t\tcase 585: return Item::CookedPorkchop;\n\t\t\tcase 787: return Item::CookedRabbit;\n\t\t\tcase 630: return Item::CookedSalmon;\n\t\t\tcase 670: return Item::Cookie;\n\t\t\tcase 108: return Item::Cornflower;\n\t\t\tcase 703: return Item::CowSpawnEgg;\n\t\t\tcase 207: return Item::CrackedStoneBricks;\n\t\t\tcase 158: return Item::CraftingTable;\n\t\t\tcase 860: return Item::CreeperBannerPattern;\n\t\t\tcase 772: return Item::CreeperHead;\n\t\t\tcase 704: return Item::CreeperSpawnEgg;\n\t\t\tcase 856: return Item::Crossbow;\n\t\t\tcase 370: return Item::CutRedSandstone;\n\t\t\tcase 132: return Item::CutRedSandstoneSlab;\n\t\t\tcase 70: return Item::CutSandstone;\n\t\t\tcase 124: return Item::CutSandstoneSlab;\n\t\t\tcase 810: return Item::CyanBanner;\n\t\t\tcase 663: return Item::CyanBed;\n\t\t\tcase 309: return Item::CyanCarpet;\n\t\t\tcase 422: return Item::CyanConcrete;\n\t\t\tcase 438: return Item::CyanConcretePowder;\n\t\t\tcase 637: return Item::CyanDye;\n\t\t\tcase 406: return Item::CyanGlazedTerracotta;\n\t\t\tcase 390: return Item::CyanShulkerBox;\n\t\t\tcase 338: return Item::CyanStainedGlass;\n\t\t\tcase 354: return Item::CyanStainedGlassPane;\n\t\t\tcase 290: return Item::CyanTerracotta;\n\t\t\tcase 91: return Item::CyanWool;\n\t\t\tcase 267: return Item::DamagedAnvil;\n\t\t\tcase 98: return Item::Dandelion;\n\t\t\tcase 834: return Item::DarkOakBoat;\n\t\t\tcase 264: return Item::DarkOakButton;\n\t\t\tcase 512: return Item::DarkOakDoor;\n\t\t\tcase 186: return Item::DarkOakFence;\n\t\t\tcase 221: return Item::DarkOakFenceGate;\n\t\t\tcase 61: return Item::DarkOakLeaves;\n\t\t\tcase 37: return Item::DarkOakLog;\n\t\t\tcase 18: return Item::DarkOakPlanks;\n\t\t\tcase 171: return Item::DarkOakPressurePlate;\n\t\t\tcase 24: return Item::DarkOakSapling;\n\t\t\tcase 594: return Item::DarkOakSign;\n\t\t\tcase 120: return Item::DarkOakSlab;\n\t\t\tcase 320: return Item::DarkOakStairs;\n\t\t\tcase 198: return Item::DarkOakTrapdoor;\n\t\t\tcase 55: return Item::DarkOakWood;\n\t\t\tcase 363: return Item::DarkPrismarine;\n\t\t\tcase 136: return Item::DarkPrismarineSlab;\n\t\t\tcase 366: return Item::DarkPrismarineStairs;\n\t\t\tcase 271: return Item::DaylightDetector;\n\t\t\tcase 461: return Item::DeadBrainCoral;\n\t\t\tcase 447: return Item::DeadBrainCoralBlock;\n\t\t\tcase 472: return Item::DeadBrainCoralFan;\n\t\t\tcase 462: return Item::DeadBubbleCoral;\n\t\t\tcase 448: return Item::DeadBubbleCoralBlock;\n\t\t\tcase 473: return Item::DeadBubbleCoralFan;\n\t\t\tcase 78: return Item::DeadBush;\n\t\t\tcase 463: return Item::DeadFireCoral;\n\t\t\tcase 449: return Item::DeadFireCoralBlock;\n\t\t\tcase 474: return Item::DeadFireCoralFan;\n\t\t\tcase 464: return Item::DeadHornCoral;\n\t\t\tcase 450: return Item::DeadHornCoralBlock;\n\t\t\tcase 475: return Item::DeadHornCoralFan;\n\t\t\tcase 465: return Item::DeadTubeCoral;\n\t\t\tcase 446: return Item::DeadTubeCoralBlock;\n\t\t\tcase 471: return Item::DeadTubeCoralFan;\n\t\t\tcase 839: return Item::DebugStick;\n\t\t\tcase 73: return Item::DetectorRail;\n\t\t\tcase 529: return Item::Diamond;\n\t\t\tcase 544: return Item::DiamondAxe;\n\t\t\tcase 157: return Item::DiamondBlock;\n\t\t\tcase 578: return Item::DiamondBoots;\n\t\t\tcase 576: return Item::DiamondChestplate;\n\t\t\tcase 575: return Item::DiamondHelmet;\n\t\t\tcase 558: return Item::DiamondHoe;\n\t\t\tcase 794: return Item::DiamondHorseArmor;\n\t\t\tcase 577: return Item::DiamondLeggings;\n\t\t\tcase 156: return Item::DiamondOre;\n\t\t\tcase 543: return Item::DiamondPickaxe;\n\t\t\tcase 542: return Item::DiamondShovel;\n\t\t\tcase 541: return Item::DiamondSword;\n\t\t\tcase 4: return Item::Diorite;\n\t\t\tcase 504: return Item::DioriteSlab;\n\t\t\tcase 491: return Item::DioriteStairs;\n\t\t\tcase 258: return Item::DioriteWall;\n\t\t\tcase 9: return Item::Dirt;\n\t\t\tcase 67: return Item::Dispenser;\n\t\t\tcase 705: return Item::DolphinSpawnEgg;\n\t\t\tcase 706: return Item::DonkeySpawnEgg;\n\t\t\tcase 823: return Item::DragonBreath;\n\t\t\tcase 233: return Item::DragonEgg;\n\t\t\tcase 773: return Item::DragonHead;\n\t\t\tcase 674: return Item::DriedKelp;\n\t\t\tcase 613: return Item::DriedKelpBlock;\n\t\t\tcase 280: return Item::Dropper;\n\t\t\tcase 707: return Item::DrownedSpawnEgg;\n\t\t\tcase 620: return Item::Egg;\n\t\t\tcase 708: return Item::ElderGuardianSpawnEgg;\n\t\t\tcase 829: return Item::Elytra;\n\t\t\tcase 759: return Item::Emerald;\n\t\t\tcase 239: return Item::EmeraldBlock;\n\t\t\tcase 236: return Item::EmeraldOre;\n\t\t\tcase 779: return Item::EnchantedBook;\n\t\t\tcase 588: return Item::EnchantedGoldenApple;\n\t\t\tcase 229: return Item::EnchantingTable;\n\t\t\tcase 817: return Item::EndCrystal;\n\t\t\tcase 230: return Item::EndPortalFrame;\n\t\t\tcase 147: return Item::EndRod;\n\t\t\tcase 231: return Item::EndStone;\n\t\t\tcase 497: return Item::EndStoneBrickSlab;\n\t\t\tcase 483: return Item::EndStoneBrickStairs;\n\t\t\tcase 257: return Item::EndStoneBrickWall;\n\t\t\tcase 232: return Item::EndStoneBricks;\n\t\t\tcase 237: return Item::EnderChest;\n\t\t\tcase 695: return Item::EnderEye;\n\t\t\tcase 682: return Item::EnderPearl;\n\t\t\tcase 709: return Item::EndermanSpawnEgg;\n\t\t\tcase 710: return Item::EndermiteSpawnEgg;\n\t\t\tcase 711: return Item::EvokerSpawnEgg;\n\t\t\tcase 755: return Item::ExperienceBottle;\n\t\t\tcase 159: return Item::Farmland;\n\t\t\tcase 553: return Item::Feather;\n\t\t\tcase 690: return Item::FermentedSpiderEye;\n\t\t\tcase 77: return Item::Fern;\n\t\t\tcase 671: return Item::FilledMap;\n\t\t\tcase 756: return Item::FireCharge;\n\t\t\tcase 459: return Item::FireCoral;\n\t\t\tcase 454: return Item::FireCoralBlock;\n\t\t\tcase 469: return Item::FireCoralFan;\n\t\t\tcase 777: return Item::FireworkRocket;\n\t\t\tcase 778: return Item::FireworkStar;\n\t\t\tcase 622: return Item::FishingRod;\n\t\t\tcase 868: return Item::FletchingTable;\n\t\t\tcase 583: return Item::Flint;\n\t\t\tcase 523: return Item::FlintAndSteel;\n\t\t\tcase 859: return Item::FlowerBannerPattern;\n\t\t\tcase 761: return Item::FlowerPot;\n\t\t\tcase 712: return Item::FoxSpawnEgg;\n\t\t\tcase 160: return Item::Furnace;\n\t\t\tcase 619: return Item::FurnaceMinecart;\n\t\t\tcase 713: return Item::GhastSpawnEgg;\n\t\t\tcase 684: return Item::GhastTear;\n\t\t\tcase 64: return Item::Glass;\n\t\t\tcase 688: return Item::GlassBottle;\n\t\t\tcase 213: return Item::GlassPane;\n\t\t\tcase 696: return Item::GlisteringMelonSlice;\n\t\t\tcase 863: return Item::GlobeBannerPattern;\n\t\t\tcase 191: return Item::Glowstone;\n\t\t\tcase 624: return Item::GlowstoneDust;\n\t\t\tcase 113: return Item::GoldBlock;\n\t\t\tcase 531: return Item::GoldIngot;\n\t\t\tcase 685: return Item::GoldNugget;\n\t\t\tcase 29: return Item::GoldOre;\n\t\t\tcase 587: return Item::GoldenApple;\n\t\t\tcase 551: return Item::GoldenAxe;\n\t\t\tcase 582: return Item::GoldenBoots;\n\t\t\tcase 767: return Item::GoldenCarrot;\n\t\t\tcase 580: return Item::GoldenChestplate;\n\t\t\tcase 579: return Item::GoldenHelmet;\n\t\t\tcase 559: return Item::GoldenHoe;\n\t\t\tcase 793: return Item::GoldenHorseArmor;\n\t\t\tcase 581: return Item::GoldenLeggings;\n\t\t\tcase 550: return Item::GoldenPickaxe;\n\t\t\tcase 549: return Item::GoldenShovel;\n\t\t\tcase 548: return Item::GoldenSword;\n\t\t\tcase 2: return Item::Granite;\n\t\t\tcase 500: return Item::GraniteSlab;\n\t\t\tcase 487: return Item::GraniteStairs;\n\t\t\tcase 251: return Item::GraniteWall;\n\t\t\tcase 76: return Item::Grass;\n\t\t\tcase 8: return Item::GrassBlock;\n\t\t\tcase 322: return Item::GrassPath;\n\t\t\tcase 28: return Item::Gravel;\n\t\t\tcase 808: return Item::GrayBanner;\n\t\t\tcase 661: return Item::GrayBed;\n\t\t\tcase 307: return Item::GrayCarpet;\n\t\t\tcase 420: return Item::GrayConcrete;\n\t\t\tcase 436: return Item::GrayConcretePowder;\n\t\t\tcase 639: return Item::GrayDye;\n\t\t\tcase 404: return Item::GrayGlazedTerracotta;\n\t\t\tcase 388: return Item::GrayShulkerBox;\n\t\t\tcase 336: return Item::GrayStainedGlass;\n\t\t\tcase 352: return Item::GrayStainedGlassPane;\n\t\t\tcase 288: return Item::GrayTerracotta;\n\t\t\tcase 89: return Item::GrayWool;\n\t\t\tcase 814: return Item::GreenBanner;\n\t\t\tcase 667: return Item::GreenBed;\n\t\t\tcase 313: return Item::GreenCarpet;\n\t\t\tcase 426: return Item::GreenConcrete;\n\t\t\tcase 442: return Item::GreenConcretePowder;\n\t\t\tcase 633: return Item::GreenDye;\n\t\t\tcase 410: return Item::GreenGlazedTerracotta;\n\t\t\tcase 394: return Item::GreenShulkerBox;\n\t\t\tcase 342: return Item::GreenStainedGlass;\n\t\t\tcase 358: return Item::GreenStainedGlassPane;\n\t\t\tcase 294: return Item::GreenTerracotta;\n\t\t\tcase 95: return Item::GreenWool;\n\t\t\tcase 869: return Item::Grindstone;\n\t\t\tcase 714: return Item::GuardianSpawnEgg;\n\t\t\tcase 554: return Item::Gunpowder;\n\t\t\tcase 299: return Item::HayBale;\n\t\t\tcase 855: return Item::HeartOfTheSea;\n\t\t\tcase 270: return Item::HeavyWeightedPressurePlate;\n\t\t\tcase 274: return Item::Hopper;\n\t\t\tcase 783: return Item::HopperMinecart;\n\t\t\tcase 460: return Item::HornCoral;\n\t\t\tcase 455: return Item::HornCoralBlock;\n\t\t\tcase 470: return Item::HornCoralFan;\n\t\t\tcase 715: return Item::HorseSpawnEgg;\n\t\t\tcase 716: return Item::HuskSpawnEgg;\n\t\t\tcase 176: return Item::Ice;\n\t\t\tcase 204: return Item::InfestedChiseledStoneBricks;\n\t\t\tcase 200: return Item::InfestedCobblestone;\n\t\t\tcase 203: return Item::InfestedCrackedStoneBricks;\n\t\t\tcase 202: return Item::InfestedMossyStoneBricks;\n\t\t\tcase 199: return Item::InfestedStone;\n\t\t\tcase 201: return Item::InfestedStoneBricks;\n\t\t\tcase 631: return Item::InkSac;\n\t\t\tcase 522: return Item::IronAxe;\n\t\t\tcase 212: return Item::IronBars;\n\t\t\tcase 114: return Item::IronBlock;\n\t\t\tcase 574: return Item::IronBoots;\n\t\t\tcase 572: return Item::IronChestplate;\n\t\t\tcase 506: return Item::IronDoor;\n\t\t\tcase 571: return Item::IronHelmet;\n\t\t\tcase 557: return Item::IronHoe;\n\t\t\tcase 792: return Item::IronHorseArmor;\n\t\t\tcase 530: return Item::IronIngot;\n\t\t\tcase 573: return Item::IronLeggings;\n\t\t\tcase 837: return Item::IronNugget;\n\t\t\tcase 30: return Item::IronOre;\n\t\t\tcase 521: return Item::IronPickaxe;\n\t\t\tcase 520: return Item::IronShovel;\n\t\t\tcase 532: return Item::IronSword;\n\t\t\tcase 298: return Item::IronTrapdoor;\n\t\t\tcase 760: return Item::ItemFrame;\n\t\t\tcase 192: return Item::JackOLantern;\n\t\t\tcase 516: return Item::Jigsaw;\n\t\t\tcase 180: return Item::Jukebox;\n\t\t\tcase 832: return Item::JungleBoat;\n\t\t\tcase 262: return Item::JungleButton;\n\t\t\tcase 510: return Item::JungleDoor;\n\t\t\tcase 184: return Item::JungleFence;\n\t\t\tcase 219: return Item::JungleFenceGate;\n\t\t\tcase 59: return Item::JungleLeaves;\n\t\t\tcase 35: return Item::JungleLog;\n\t\t\tcase 16: return Item::JunglePlanks;\n\t\t\tcase 169: return Item::JunglePressurePlate;\n\t\t\tcase 22: return Item::JungleSapling;\n\t\t\tcase 592: return Item::JungleSign;\n\t\t\tcase 118: return Item::JungleSlab;\n\t\t\tcase 242: return Item::JungleStairs;\n\t\t\tcase 196: return Item::JungleTrapdoor;\n\t\t\tcase 53: return Item::JungleWood;\n\t\t\tcase 612: return Item::Kelp;\n\t\t\tcase 838: return Item::KnowledgeBook;\n\t\t\tcase 161: return Item::Ladder;\n\t\t\tcase 874: return Item::Lantern;\n\t\t\tcase 66: return Item::LapisBlock;\n\t\t\tcase 635: return Item::LapisLazuli;\n\t\t\tcase 65: return Item::LapisOre;\n\t\t\tcase 328: return Item::LargeFern;\n\t\t\tcase 597: return Item::LavaBucket;\n\t\t\tcase 796: return Item::Lead;\n\t\t\tcase 603: return Item::Leather;\n\t\t\tcase 566: return Item::LeatherBoots;\n\t\t\tcase 564: return Item::LeatherChestplate;\n\t\t\tcase 563: return Item::LeatherHelmet;\n\t\t\tcase 795: return Item::LeatherHorseArmor;\n\t\t\tcase 565: return Item::LeatherLeggings;\n\t\t\tcase 870: return Item::Lectern;\n\t\t\tcase 164: return Item::Lever;\n\t\t\tcase 804: return Item::LightBlueBanner;\n\t\t\tcase 657: return Item::LightBlueBed;\n\t\t\tcase 303: return Item::LightBlueCarpet;\n\t\t\tcase 416: return Item::LightBlueConcrete;\n\t\t\tcase 432: return Item::LightBlueConcretePowder;\n\t\t\tcase 643: return Item::LightBlueDye;\n\t\t\tcase 400: return Item::LightBlueGlazedTerracotta;\n\t\t\tcase 384: return Item::LightBlueShulkerBox;\n\t\t\tcase 332: return Item::LightBlueStainedGlass;\n\t\t\tcase 348: return Item::LightBlueStainedGlassPane;\n\t\t\tcase 284: return Item::LightBlueTerracotta;\n\t\t\tcase 85: return Item::LightBlueWool;\n\t\t\tcase 809: return Item::LightGrayBanner;\n\t\t\tcase 662: return Item::LightGrayBed;\n\t\t\tcase 308: return Item::LightGrayCarpet;\n\t\t\tcase 421: return Item::LightGrayConcrete;\n\t\t\tcase 437: return Item::LightGrayConcretePowder;\n\t\t\tcase 638: return Item::LightGrayDye;\n\t\t\tcase 405: return Item::LightGrayGlazedTerracotta;\n\t\t\tcase 389: return Item::LightGrayShulkerBox;\n\t\t\tcase 337: return Item::LightGrayStainedGlass;\n\t\t\tcase 353: return Item::LightGrayStainedGlassPane;\n\t\t\tcase 289: return Item::LightGrayTerracotta;\n\t\t\tcase 90: return Item::LightGrayWool;\n\t\t\tcase 269: return Item::LightWeightedPressurePlate;\n\t\t\tcase 324: return Item::Lilac;\n\t\t\tcase 109: return Item::LilyOfTheValley;\n\t\t\tcase 225: return Item::LilyPad;\n\t\t\tcase 806: return Item::LimeBanner;\n\t\t\tcase 659: return Item::LimeBed;\n\t\t\tcase 305: return Item::LimeCarpet;\n\t\t\tcase 418: return Item::LimeConcrete;\n\t\t\tcase 434: return Item::LimeConcretePowder;\n\t\t\tcase 641: return Item::LimeDye;\n\t\t\tcase 402: return Item::LimeGlazedTerracotta;\n\t\t\tcase 386: return Item::LimeShulkerBox;\n\t\t\tcase 334: return Item::LimeStainedGlass;\n\t\t\tcase 350: return Item::LimeStainedGlassPane;\n\t\t\tcase 286: return Item::LimeTerracotta;\n\t\t\tcase 87: return Item::LimeWool;\n\t\t\tcase 827: return Item::LingeringPotion;\n\t\t\tcase 717: return Item::LlamaSpawnEgg;\n\t\t\tcase 858: return Item::Loom;\n\t\t\tcase 803: return Item::MagentaBanner;\n\t\t\tcase 656: return Item::MagentaBed;\n\t\t\tcase 302: return Item::MagentaCarpet;\n\t\t\tcase 415: return Item::MagentaConcrete;\n\t\t\tcase 431: return Item::MagentaConcretePowder;\n\t\t\tcase 644: return Item::MagentaDye;\n\t\t\tcase 399: return Item::MagentaGlazedTerracotta;\n\t\t\tcase 383: return Item::MagentaShulkerBox;\n\t\t\tcase 331: return Item::MagentaStainedGlass;\n\t\t\tcase 347: return Item::MagentaStainedGlassPane;\n\t\t\tcase 283: return Item::MagentaTerracotta;\n\t\t\tcase 84: return Item::MagentaWool;\n\t\t\tcase 374: return Item::MagmaBlock;\n\t\t\tcase 692: return Item::MagmaCream;\n\t\t\tcase 718: return Item::MagmaCubeSpawnEgg;\n\t\t\tcase 766: return Item::Map;\n\t\t\tcase 214: return Item::Melon;\n\t\t\tcase 676: return Item::MelonSeeds;\n\t\t\tcase 673: return Item::MelonSlice;\n\t\t\tcase 604: return Item::MilkBucket;\n\t\t\tcase 598: return Item::Minecart;\n\t\t\tcase 862: return Item::MojangBannerPattern;\n\t\t\tcase 719: return Item::MooshroomSpawnEgg;\n\t\t\tcase 144: return Item::MossyCobblestone;\n\t\t\tcase 496: return Item::MossyCobblestoneSlab;\n\t\t\tcase 482: return Item::MossyCobblestoneStairs;\n\t\t\tcase 246: return Item::MossyCobblestoneWall;\n\t\t\tcase 494: return Item::MossyStoneBrickSlab;\n\t\t\tcase 480: return Item::MossyStoneBrickStairs;\n\t\t\tcase 250: return Item::MossyStoneBrickWall;\n\t\t\tcase 206: return Item::MossyStoneBricks;\n\t\t\tcase 720: return Item::MuleSpawnEgg;\n\t\t\tcase 211: return Item::MushroomStem;\n\t\t\tcase 547: return Item::MushroomStew;\n\t\t\tcase 850: return Item::MusicDisc11;\n\t\t\tcase 840: return Item::MusicDisc13;\n\t\t\tcase 842: return Item::MusicDiscBlocks;\n\t\t\tcase 841: return Item::MusicDiscCat;\n\t\t\tcase 843: return Item::MusicDiscChirp;\n\t\t\tcase 844: return Item::MusicDiscFar;\n\t\t\tcase 845: return Item::MusicDiscMall;\n\t\t\tcase 846: return Item::MusicDiscMellohi;\n\t\t\tcase 847: return Item::MusicDiscStal;\n\t\t\tcase 848: return Item::MusicDiscStrad;\n\t\t\tcase 851: return Item::MusicDiscWait;\n\t\t\tcase 849: return Item::MusicDiscWard;\n\t\t\tcase 799: return Item::Mutton;\n\t\t\tcase 224: return Item::Mycelium;\n\t\t\tcase 797: return Item::NameTag;\n\t\t\tcase 854: return Item::NautilusShell;\n\t\t\tcase 780: return Item::NetherBrick;\n\t\t\tcase 227: return Item::NetherBrickFence;\n\t\t\tcase 129: return Item::NetherBrickSlab;\n\t\t\tcase 228: return Item::NetherBrickStairs;\n\t\t\tcase 253: return Item::NetherBrickWall;\n\t\t\tcase 226: return Item::NetherBricks;\n\t\t\tcase 273: return Item::NetherQuartzOre;\n\t\t\tcase 775: return Item::NetherStar;\n\t\t\tcase 686: return Item::NetherWart;\n\t\t\tcase 375: return Item::NetherWartBlock;\n\t\t\tcase 189: return Item::Netherrack;\n\t\t\tcase 71: return Item::NoteBlock;\n\t\t\tcase 602: return Item::OakBoat;\n\t\t\tcase 259: return Item::OakButton;\n\t\t\tcase 507: return Item::OakDoor;\n\t\t\tcase 181: return Item::OakFence;\n\t\t\tcase 216: return Item::OakFenceGate;\n\t\t\tcase 56: return Item::OakLeaves;\n\t\t\tcase 32: return Item::OakLog;\n\t\t\tcase 13: return Item::OakPlanks;\n\t\t\tcase 166: return Item::OakPressurePlate;\n\t\t\tcase 19: return Item::OakSapling;\n\t\t\tcase 589: return Item::OakSign;\n\t\t\tcase 115: return Item::OakSlab;\n\t\t\tcase 154: return Item::OakStairs;\n\t\t\tcase 193: return Item::OakTrapdoor;\n\t\t\tcase 50: return Item::OakWood;\n\t\t\tcase 379: return Item::Observer;\n\t\t\tcase 145: return Item::Obsidian;\n\t\t\tcase 721: return Item::OcelotSpawnEgg;\n\t\t\tcase 802: return Item::OrangeBanner;\n\t\t\tcase 655: return Item::OrangeBed;\n\t\t\tcase 301: return Item::OrangeCarpet;\n\t\t\tcase 414: return Item::OrangeConcrete;\n\t\t\tcase 430: return Item::OrangeConcretePowder;\n\t\t\tcase 645: return Item::OrangeDye;\n\t\t\tcase 398: return Item::OrangeGlazedTerracotta;\n\t\t\tcase 382: return Item::OrangeShulkerBox;\n\t\t\tcase 330: return Item::OrangeStainedGlass;\n\t\t\tcase 346: return Item::OrangeStainedGlassPane;\n\t\t\tcase 282: return Item::OrangeTerracotta;\n\t\t\tcase 104: return Item::OrangeTulip;\n\t\t\tcase 83: return Item::OrangeWool;\n\t\t\tcase 107: return Item::OxeyeDaisy;\n\t\t\tcase 318: return Item::PackedIce;\n\t\t\tcase 586: return Item::Painting;\n\t\t\tcase 722: return Item::PandaSpawnEgg;\n\t\t\tcase 615: return Item::Paper;\n\t\t\tcase 723: return Item::ParrotSpawnEgg;\n\t\t\tcase 326: return Item::Peony;\n\t\t\tcase 125: return Item::PetrifiedOakSlab;\n\t\t\tcase 853: return Item::PhantomMembrane;\n\t\t\tcase 724: return Item::PhantomSpawnEgg;\n\t\t\tcase 725: return Item::PigSpawnEgg;\n\t\t\tcase 726: return Item::PillagerSpawnEgg;\n\t\t\tcase 807: return Item::PinkBanner;\n\t\t\tcase 660: return Item::PinkBed;\n\t\t\tcase 306: return Item::PinkCarpet;\n\t\t\tcase 419: return Item::PinkConcrete;\n\t\t\tcase 435: return Item::PinkConcretePowder;\n\t\t\tcase 640: return Item::PinkDye;\n\t\t\tcase 403: return Item::PinkGlazedTerracotta;\n\t\t\tcase 387: return Item::PinkShulkerBox;\n\t\t\tcase 335: return Item::PinkStainedGlass;\n\t\t\tcase 351: return Item::PinkStainedGlassPane;\n\t\t\tcase 287: return Item::PinkTerracotta;\n\t\t\tcase 106: return Item::PinkTulip;\n\t\t\tcase 88: return Item::PinkWool;\n\t\t\tcase 81: return Item::Piston;\n\t\t\tcase 770: return Item::PlayerHead;\n\t\t\tcase 11: return Item::Podzol;\n\t\t\tcase 765: return Item::PoisonousPotato;\n\t\t\tcase 727: return Item::PolarBearSpawnEgg;\n\t\t\tcase 7: return Item::PolishedAndesite;\n\t\t\tcase 503: return Item::PolishedAndesiteSlab;\n\t\t\tcase 490: return Item::PolishedAndesiteStairs;\n\t\t\tcase 5: return Item::PolishedDiorite;\n\t\t\tcase 495: return Item::PolishedDioriteSlab;\n\t\t\tcase 481: return Item::PolishedDioriteStairs;\n\t\t\tcase 3: return Item::PolishedGranite;\n\t\t\tcase 492: return Item::PolishedGraniteSlab;\n\t\t\tcase 478: return Item::PolishedGraniteStairs;\n\t\t\tcase 819: return Item::PoppedChorusFruit;\n\t\t\tcase 99: return Item::Poppy;\n\t\t\tcase 584: return Item::Porkchop;\n\t\t\tcase 763: return Item::Potato;\n\t\t\tcase 687: return Item::Potion;\n\t\t\tcase 72: return Item::PoweredRail;\n\t\t\tcase 361: return Item::Prismarine;\n\t\t\tcase 135: return Item::PrismarineBrickSlab;\n\t\t\tcase 365: return Item::PrismarineBrickStairs;\n\t\t\tcase 362: return Item::PrismarineBricks;\n\t\t\tcase 785: return Item::PrismarineCrystals;\n\t\t\tcase 784: return Item::PrismarineShard;\n\t\t\tcase 134: return Item::PrismarineSlab;\n\t\t\tcase 364: return Item::PrismarineStairs;\n\t\t\tcase 248: return Item::PrismarineWall;\n\t\t\tcase 628: return Item::Pufferfish;\n\t\t\tcase 605: return Item::PufferfishBucket;\n\t\t\tcase 728: return Item::PufferfishSpawnEgg;\n\t\t\tcase 187: return Item::Pumpkin;\n\t\t\tcase 776: return Item::PumpkinPie;\n\t\t\tcase 675: return Item::PumpkinSeeds;\n\t\t\tcase 811: return Item::PurpleBanner;\n\t\t\tcase 664: return Item::PurpleBed;\n\t\t\tcase 310: return Item::PurpleCarpet;\n\t\t\tcase 423: return Item::PurpleConcrete;\n\t\t\tcase 439: return Item::PurpleConcretePowder;\n\t\t\tcase 636: return Item::PurpleDye;\n\t\t\tcase 407: return Item::PurpleGlazedTerracotta;\n\t\t\tcase 391: return Item::PurpleShulkerBox;\n\t\t\tcase 339: return Item::PurpleStainedGlass;\n\t\t\tcase 355: return Item::PurpleStainedGlassPane;\n\t\t\tcase 291: return Item::PurpleTerracotta;\n\t\t\tcase 92: return Item::PurpleWool;\n\t\t\tcase 150: return Item::PurpurBlock;\n\t\t\tcase 151: return Item::PurpurPillar;\n\t\t\tcase 133: return Item::PurpurSlab;\n\t\t\tcase 152: return Item::PurpurStairs;\n\t\t\tcase 781: return Item::Quartz;\n\t\t\tcase 276: return Item::QuartzBlock;\n\t\t\tcase 277: return Item::QuartzPillar;\n\t\t\tcase 130: return Item::QuartzSlab;\n\t\t\tcase 278: return Item::QuartzStairs;\n\t\t\tcase 786: return Item::Rabbit;\n\t\t\tcase 789: return Item::RabbitFoot;\n\t\t\tcase 790: return Item::RabbitHide;\n\t\t\tcase 729: return Item::RabbitSpawnEgg;\n\t\t\tcase 788: return Item::RabbitStew;\n\t\t\tcase 162: return Item::Rail;\n\t\t\tcase 730: return Item::RavagerSpawnEgg;\n\t\t\tcase 815: return Item::RedBanner;\n\t\t\tcase 668: return Item::RedBed;\n\t\t\tcase 314: return Item::RedCarpet;\n\t\t\tcase 427: return Item::RedConcrete;\n\t\t\tcase 443: return Item::RedConcretePowder;\n\t\t\tcase 632: return Item::RedDye;\n\t\t\tcase 411: return Item::RedGlazedTerracotta;\n\t\t\tcase 112: return Item::RedMushroom;\n\t\t\tcase 210: return Item::RedMushroomBlock;\n\t\t\tcase 502: return Item::RedNetherBrickSlab;\n\t\t\tcase 489: return Item::RedNetherBrickStairs;\n\t\t\tcase 255: return Item::RedNetherBrickWall;\n\t\t\tcase 376: return Item::RedNetherBricks;\n\t\t\tcase 27: return Item::RedSand;\n\t\t\tcase 368: return Item::RedSandstone;\n\t\t\tcase 131: return Item::RedSandstoneSlab;\n\t\t\tcase 371: return Item::RedSandstoneStairs;\n\t\t\tcase 249: return Item::RedSandstoneWall;\n\t\t\tcase 395: return Item::RedShulkerBox;\n\t\t\tcase 343: return Item::RedStainedGlass;\n\t\t\tcase 359: return Item::RedStainedGlassPane;\n\t\t\tcase 295: return Item::RedTerracotta;\n\t\t\tcase 103: return Item::RedTulip;\n\t\t\tcase 96: return Item::RedWool;\n\t\t\tcase 600: return Item::Redstone;\n\t\t\tcase 272: return Item::RedstoneBlock;\n\t\t\tcase 234: return Item::RedstoneLamp;\n\t\t\tcase 172: return Item::RedstoneOre;\n\t\t\tcase 173: return Item::RedstoneTorch;\n\t\t\tcase 513: return Item::Repeater;\n\t\t\tcase 372: return Item::RepeatingCommandBlock;\n\t\t\tcase 325: return Item::RoseBush;\n\t\t\tcase 681: return Item::RottenFlesh;\n\t\t\tcase 599: return Item::Saddle;\n\t\t\tcase 626: return Item::Salmon;\n\t\t\tcase 606: return Item::SalmonBucket;\n\t\t\tcase 731: return Item::SalmonSpawnEgg;\n\t\t\tcase 26: return Item::Sand;\n\t\t\tcase 68: return Item::Sandstone;\n\t\t\tcase 123: return Item::SandstoneSlab;\n\t\t\tcase 235: return Item::SandstoneStairs;\n\t\t\tcase 256: return Item::SandstoneWall;\n\t\t\tcase 505: return Item::Scaffolding;\n\t\t\tcase 519: return Item::Scute;\n\t\t\tcase 367: return Item::SeaLantern;\n\t\t\tcase 80: return Item::SeaPickle;\n\t\t\tcase 79: return Item::Seagrass;\n\t\t\tcase 672: return Item::Shears;\n\t\t\tcase 732: return Item::SheepSpawnEgg;\n\t\t\tcase 828: return Item::Shield;\n\t\t\tcase 380: return Item::ShulkerBox;\n\t\t\tcase 836: return Item::ShulkerShell;\n\t\t\tcase 733: return Item::ShulkerSpawnEgg;\n\t\t\tcase 734: return Item::SilverfishSpawnEgg;\n\t\t\tcase 736: return Item::SkeletonHorseSpawnEgg;\n\t\t\tcase 768: return Item::SkeletonSkull;\n\t\t\tcase 735: return Item::SkeletonSpawnEgg;\n\t\t\tcase 861: return Item::SkullBannerPattern;\n\t\t\tcase 617: return Item::SlimeBall;\n\t\t\tcase 321: return Item::SlimeBlock;\n\t\t\tcase 737: return Item::SlimeSpawnEgg;\n\t\t\tcase 871: return Item::SmithingTable;\n\t\t\tcase 865: return Item::Smoker;\n\t\t\tcase 137: return Item::SmoothQuartz;\n\t\t\tcase 499: return Item::SmoothQuartzSlab;\n\t\t\tcase 486: return Item::SmoothQuartzStairs;\n\t\t\tcase 138: return Item::SmoothRedSandstone;\n\t\t\tcase 493: return Item::SmoothRedSandstoneSlab;\n\t\t\tcase 479: return Item::SmoothRedSandstoneStairs;\n\t\t\tcase 139: return Item::SmoothSandstone;\n\t\t\tcase 498: return Item::SmoothSandstoneSlab;\n\t\t\tcase 485: return Item::SmoothSandstoneStairs;\n\t\t\tcase 140: return Item::SmoothStone;\n\t\t\tcase 122: return Item::SmoothStoneSlab;\n\t\t\tcase 175: return Item::Snow;\n\t\t\tcase 177: return Item::SnowBlock;\n\t\t\tcase 601: return Item::Snowball;\n\t\t\tcase 190: return Item::SoulSand;\n\t\t\tcase 153: return Item::Spawner;\n\t\t\tcase 825: return Item::SpectralArrow;\n\t\t\tcase 689: return Item::SpiderEye;\n\t\t\tcase 738: return Item::SpiderSpawnEgg;\n\t\t\tcase 824: return Item::SplashPotion;\n\t\t\tcase 62: return Item::Sponge;\n\t\t\tcase 830: return Item::SpruceBoat;\n\t\t\tcase 260: return Item::SpruceButton;\n\t\t\tcase 508: return Item::SpruceDoor;\n\t\t\tcase 182: return Item::SpruceFence;\n\t\t\tcase 217: return Item::SpruceFenceGate;\n\t\t\tcase 57: return Item::SpruceLeaves;\n\t\t\tcase 33: return Item::SpruceLog;\n\t\t\tcase 14: return Item::SprucePlanks;\n\t\t\tcase 167: return Item::SprucePressurePlate;\n\t\t\tcase 20: return Item::SpruceSapling;\n\t\t\tcase 590: return Item::SpruceSign;\n\t\t\tcase 116: return Item::SpruceSlab;\n\t\t\tcase 240: return Item::SpruceStairs;\n\t\t\tcase 194: return Item::SpruceTrapdoor;\n\t\t\tcase 51: return Item::SpruceWood;\n\t\t\tcase 739: return Item::SquidSpawnEgg;\n\t\t\tcase 545: return Item::Stick;\n\t\t\tcase 74: return Item::StickyPiston;\n\t\t\tcase 1: return Item::Stone;\n\t\t\tcase 540: return Item::StoneAxe;\n\t\t\tcase 128: return Item::StoneBrickSlab;\n\t\t\tcase 223: return Item::StoneBrickStairs;\n\t\t\tcase 252: return Item::StoneBrickWall;\n\t\t\tcase 205: return Item::StoneBricks;\n\t\t\tcase 174: return Item::StoneButton;\n\t\t\tcase 556: return Item::StoneHoe;\n\t\t\tcase 539: return Item::StonePickaxe;\n\t\t\tcase 165: return Item::StonePressurePlate;\n\t\t\tcase 538: return Item::StoneShovel;\n\t\t\tcase 121: return Item::StoneSlab;\n\t\t\tcase 484: return Item::StoneStairs;\n\t\t\tcase 537: return Item::StoneSword;\n\t\t\tcase 872: return Item::Stonecutter;\n\t\t\tcase 740: return Item::StraySpawnEgg;\n\t\t\tcase 552: return Item::String;\n\t\t\tcase 42: return Item::StrippedAcaciaLog;\n\t\t\tcase 48: return Item::StrippedAcaciaWood;\n\t\t\tcase 40: return Item::StrippedBirchLog;\n\t\t\tcase 46: return Item::StrippedBirchWood;\n\t\t\tcase 43: return Item::StrippedDarkOakLog;\n\t\t\tcase 49: return Item::StrippedDarkOakWood;\n\t\t\tcase 41: return Item::StrippedJungleLog;\n\t\t\tcase 47: return Item::StrippedJungleWood;\n\t\t\tcase 38: return Item::StrippedOakLog;\n\t\t\tcase 44: return Item::StrippedOakWood;\n\t\t\tcase 39: return Item::StrippedSpruceLog;\n\t\t\tcase 45: return Item::StrippedSpruceWood;\n\t\t\tcase 515: return Item::StructureBlock;\n\t\t\tcase 378: return Item::StructureVoid;\n\t\t\tcase 652: return Item::Sugar;\n\t\t\tcase 611: return Item::SugarCane;\n\t\t\tcase 323: return Item::Sunflower;\n\t\t\tcase 857: return Item::SuspiciousStew;\n\t\t\tcase 875: return Item::SweetBerries;\n\t\t\tcase 327: return Item::TallGrass;\n\t\t\tcase 316: return Item::Terracotta;\n\t\t\tcase 826: return Item::TippedArrow;\n\t\t\tcase 142: return Item::TNT;\n\t\t\tcase 782: return Item::TNTMinecart;\n\t\t\tcase 146: return Item::Torch;\n\t\t\tcase 835: return Item::TotemOfUndying;\n\t\t\tcase 741: return Item::TraderLlamaSpawnEgg;\n\t\t\tcase 268: return Item::TrappedChest;\n\t\t\tcase 852: return Item::Trident;\n\t\t\tcase 238: return Item::TripwireHook;\n\t\t\tcase 627: return Item::TropicalFish;\n\t\t\tcase 608: return Item::TropicalFishBucket;\n\t\t\tcase 742: return Item::TropicalFishSpawnEgg;\n\t\t\tcase 456: return Item::TubeCoral;\n\t\t\tcase 451: return Item::TubeCoralBlock;\n\t\t\tcase 466: return Item::TubeCoralFan;\n\t\t\tcase 445: return Item::TurtleEgg;\n\t\t\tcase 518: return Item::TurtleHelmet;\n\t\t\tcase 743: return Item::TurtleSpawnEgg;\n\t\t\tcase 744: return Item::VexSpawnEgg;\n\t\t\tcase 745: return Item::VillagerSpawnEgg;\n\t\t\tcase 746: return Item::VindicatorSpawnEgg;\n\t\t\tcase 215: return Item::Vine;\n\t\t\tcase 747: return Item::WanderingTraderSpawnEgg;\n\t\t\tcase 596: return Item::WaterBucket;\n\t\t\tcase 63: return Item::WetSponge;\n\t\t\tcase 561: return Item::Wheat;\n\t\t\tcase 560: return Item::WheatSeeds;\n\t\t\tcase 801: return Item::WhiteBanner;\n\t\t\tcase 654: return Item::WhiteBed;\n\t\t\tcase 300: return Item::WhiteCarpet;\n\t\t\tcase 413: return Item::WhiteConcrete;\n\t\t\tcase 429: return Item::WhiteConcretePowder;\n\t\t\tcase 650: return Item::WhiteDye;\n\t\t\tcase 397: return Item::WhiteGlazedTerracotta;\n\t\t\tcase 381: return Item::WhiteShulkerBox;\n\t\t\tcase 329: return Item::WhiteStainedGlass;\n\t\t\tcase 345: return Item::WhiteStainedGlassPane;\n\t\t\tcase 281: return Item::WhiteTerracotta;\n\t\t\tcase 105: return Item::WhiteTulip;\n\t\t\tcase 82: return Item::WhiteWool;\n\t\t\tcase 748: return Item::WitchSpawnEgg;\n\t\t\tcase 110: return Item::WitherRose;\n\t\t\tcase 769: return Item::WitherSkeletonSkull;\n\t\t\tcase 749: return Item::WitherSkeletonSpawnEgg;\n\t\t\tcase 750: return Item::WolfSpawnEgg;\n\t\t\tcase 536: return Item::WoodenAxe;\n\t\t\tcase 555: return Item::WoodenHoe;\n\t\t\tcase 535: return Item::WoodenPickaxe;\n\t\t\tcase 534: return Item::WoodenShovel;\n\t\t\tcase 533: return Item::WoodenSword;\n\t\t\tcase 757: return Item::WritableBook;\n\t\t\tcase 758: return Item::WrittenBook;\n\t\t\tcase 805: return Item::YellowBanner;\n\t\t\tcase 658: return Item::YellowBed;\n\t\t\tcase 304: return Item::YellowCarpet;\n\t\t\tcase 417: return Item::YellowConcrete;\n\t\t\tcase 433: return Item::YellowConcretePowder;\n\t\t\tcase 642: return Item::YellowDye;\n\t\t\tcase 401: return Item::YellowGlazedTerracotta;\n\t\t\tcase 385: return Item::YellowShulkerBox;\n\t\t\tcase 333: return Item::YellowStainedGlass;\n\t\t\tcase 349: return Item::YellowStainedGlassPane;\n\t\t\tcase 285: return Item::YellowTerracotta;\n\t\t\tcase 86: return Item::YellowWool;\n\t\t\tcase 771: return Item::ZombieHead;\n\t\t\tcase 752: return Item::ZombieHorseSpawnEgg;\n\t\t\tcase 753: return Item::ZombiePigmanSpawnEgg;\n\t\t\tcase 751: return Item::ZombieSpawnEgg;\n\t\t\tcase 754: return Item::ZombieVillagerSpawnEgg;\n\t\t\tdefault: return Item::Air;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_14.h",
    "content": "#pragma once\n\n#include \"BlockState.h\"\n#include \"Registries/Items.h\"\n#include \"Registries/CustomStatistics.h\"\n\nnamespace Palette_1_14\n{\n\tUInt32 From(BlockState Block);\n\tUInt32 From(Item ID);\n\tUInt32 From(CustomStatistic ID);\n\tItem ToItem(UInt32 ID);\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_15.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"Palette_1_15.h\"\n#include \"Registries/BlockStates.h\"\n\nnamespace Palette_1_15\n{\n\tUInt32 From(const BlockState Block)\n\t{\n\t\tusing namespace Block;\n\n\t\tswitch (Block.ID)\n\t\t{\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5906;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5907;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5908;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5909;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5910;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5911;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5912;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5913;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5914;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5915;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5916;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5917;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5918;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5919;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5920;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5921;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5922;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5923;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5924;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5925;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5926;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5927;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5928;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5929;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8394;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8395;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8396;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8397;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8398;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8399;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8400;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8401;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8402;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8403;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8404;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8405;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8406;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8407;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8408;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8409;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8410;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8411;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8412;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8413;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8414;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8415;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8416;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8417;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8418;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8419;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8420;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8421;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8422;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8423;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8424;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8425;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8426;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8427;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8428;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8429;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8430;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8431;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8432;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8433;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8434;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8435;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8436;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8437;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8438;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8439;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8440;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8441;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8442;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8443;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8444;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8445;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8446;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8447;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8448;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8449;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8450;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8451;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8452;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8453;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8454;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8455;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8456;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8457;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, true).ID: return 8140;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, false).ID: return 8141;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, true).ID: return 8144;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, false).ID: return 8145;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, true).ID: return 8148;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, false).ID: return 8149;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, true).ID: return 8152;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, false).ID: return 8153;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, true).ID: return 8156;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, false).ID: return 8157;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, true).ID: return 8160;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, false).ID: return 8161;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, true).ID: return 8164;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, false).ID: return 8165;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, true).ID: return 8168;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, false).ID: return 8169;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7978;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7979;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7980;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7981;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7982;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7983;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7984;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7985;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7986;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7987;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7988;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7989;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7990;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7991;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7992;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7993;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7994;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7995;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7996;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7997;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7998;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7999;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8000;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8001;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8002;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8003;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8004;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8005;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8006;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8007;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8008;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8009;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, true).ID: return 200;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, false).ID: return 201;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, true).ID: return 202;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, false).ID: return 203;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, true).ID: return 204;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, false).ID: return 205;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, true).ID: return 206;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, false).ID: return 207;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, true).ID: return 208;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, false).ID: return 209;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, true).ID: return 210;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, false).ID: return 211;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, true).ID: return 212;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, false).ID: return 213;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::X).ID: return 84;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Y).ID: return 85;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Z).ID: return 86;\n\t\t\tcase AcaciaPlanks::AcaciaPlanks().ID: return 19;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(true).ID: return 3879;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(false).ID: return 3880;\n\t\t\tcase AcaciaSapling::AcaciaSapling(0).ID: return 29;\n\t\t\tcase AcaciaSapling::AcaciaSapling(1).ID: return 30;\n\t\t\tcase AcaciaSign::AcaciaSign(0).ID: return 3476;\n\t\t\tcase AcaciaSign::AcaciaSign(1).ID: return 3478;\n\t\t\tcase AcaciaSign::AcaciaSign(2).ID: return 3480;\n\t\t\tcase AcaciaSign::AcaciaSign(3).ID: return 3482;\n\t\t\tcase AcaciaSign::AcaciaSign(4).ID: return 3484;\n\t\t\tcase AcaciaSign::AcaciaSign(5).ID: return 3486;\n\t\t\tcase AcaciaSign::AcaciaSign(6).ID: return 3488;\n\t\t\tcase AcaciaSign::AcaciaSign(7).ID: return 3490;\n\t\t\tcase AcaciaSign::AcaciaSign(8).ID: return 3492;\n\t\t\tcase AcaciaSign::AcaciaSign(9).ID: return 3494;\n\t\t\tcase AcaciaSign::AcaciaSign(10).ID: return 3496;\n\t\t\tcase AcaciaSign::AcaciaSign(11).ID: return 3498;\n\t\t\tcase AcaciaSign::AcaciaSign(12).ID: return 3500;\n\t\t\tcase AcaciaSign::AcaciaSign(13).ID: return 3502;\n\t\t\tcase AcaciaSign::AcaciaSign(14).ID: return 3504;\n\t\t\tcase AcaciaSign::AcaciaSign(15).ID: return 3506;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Top).ID: return 7789;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Bottom).ID: return 7791;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Double).ID: return 7793;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6840;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6842;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6844;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6846;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6848;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6850;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6852;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6854;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6856;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6858;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6860;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6862;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6864;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6866;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6868;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6870;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6872;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6874;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6876;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6878;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6880;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6882;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6884;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6886;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6888;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6890;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6892;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6894;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6896;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6898;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 6900;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 6902;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 6904;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 6906;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 6908;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 6910;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 6912;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 6914;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 6916;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 6918;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, true).ID: return 4354;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, false).ID: return 4356;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, true).ID: return 4358;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, false).ID: return 4360;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4362;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4364;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4366;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4368;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, true).ID: return 4370;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, false).ID: return 4372;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, true).ID: return 4374;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, false).ID: return 4376;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4378;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4380;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4382;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4384;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, true).ID: return 4386;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, false).ID: return 4388;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, true).ID: return 4390;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, false).ID: return 4392;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4394;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4396;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4398;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4400;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, true).ID: return 4402;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, false).ID: return 4404;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, true).ID: return 4406;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, false).ID: return 4408;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4410;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4412;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4414;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4416;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3758;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3760;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3762;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3764;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::X).ID: return 120;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Y).ID: return 121;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Z).ID: return 122;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::NorthSouth).ID: return 6287;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::EastWest).ID: return 6288;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingEast).ID: return 6289;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingWest).ID: return 6290;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingNorth).ID: return 6291;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingSouth).ID: return 6292;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::NorthSouth).ID: return 6293;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::EastWest).ID: return 6294;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingEast).ID: return 6295;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingWest).ID: return 6296;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingNorth).ID: return 6297;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingSouth).ID: return 6298;\n\t\t\tcase Air::Air().ID: return -0;\n\t\t\tcase Allium::Allium().ID: return 1414;\n\t\t\tcase Andesite::Andesite().ID: return 6;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Top).ID: return 10308;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Bottom).ID: return 10310;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Double).ID: return 10312;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 9934;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 9936;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 9938;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 9940;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 9942;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 9944;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 9946;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 9948;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 9950;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 9952;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 9954;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 9956;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 9958;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 9960;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 9962;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 9964;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 9966;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 9968;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 9970;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 9972;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 9974;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 9976;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 9978;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 9980;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 9982;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 9984;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 9986;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 9988;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 9990;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 9992;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 9994;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 9996;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 9998;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 10000;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 10002;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 10004;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 10006;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 10008;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 10010;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 10012;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 10781;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 10782;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 10785;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 10786;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 10789;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 10790;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 10793;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 10794;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 10797;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 10798;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 10801;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 10802;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 10805;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 10806;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 10809;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 10810;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 10813;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 10814;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 10817;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 10818;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 10821;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 10822;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 10825;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 10826;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 10829;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 10830;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 10833;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 10834;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 10837;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 10838;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 10841;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 10842;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6074;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6075;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XM).ID: return 6076;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XP).ID: return 6077;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4752;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4753;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XM).ID: return 4754;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XP).ID: return 4755;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4748;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4749;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XM).ID: return 4750;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XP).ID: return 4751;\n\t\t\tcase AzureBluet::AzureBluet().ID: return 1415;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::None, 0).ID: return 9116;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::None, 1).ID: return 9117;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Small, 0).ID: return 9118;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Small, 1).ID: return 9119;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Large, 0).ID: return 9120;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Large, 1).ID: return 9121;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::None, 0).ID: return 9122;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::None, 1).ID: return 9123;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Small, 0).ID: return 9124;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Small, 1).ID: return 9125;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Large, 0).ID: return 9126;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Large, 1).ID: return 9127;\n\t\t\tcase BambooSapling::BambooSapling().ID: return 9115;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZM, true).ID: return 11135;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZM, false).ID: return 11136;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XP, true).ID: return 11137;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XP, false).ID: return 11138;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZP, true).ID: return 11139;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZP, false).ID: return 11140;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XM, true).ID: return 11141;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XM, false).ID: return 11142;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YP, true).ID: return 11143;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YP, false).ID: return 11144;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YM, true).ID: return 11145;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YM, false).ID: return 11146;\n\t\t\tcase Barrier::Barrier().ID: return 7000;\n\t\t\tcase Beacon::Beacon().ID: return 5640;\n\t\t\tcase Bedrock::Bedrock().ID: return 33;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 0).ID: return 11287;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 1).ID: return 11288;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 2).ID: return 11289;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 3).ID: return 11290;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 4).ID: return 11291;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 5).ID: return 11292;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 0).ID: return 11293;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 1).ID: return 11294;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 2).ID: return 11295;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 3).ID: return 11296;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 4).ID: return 11297;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 5).ID: return 11298;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 0).ID: return 11299;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 1).ID: return 11300;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 2).ID: return 11301;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 3).ID: return 11302;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 4).ID: return 11303;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 5).ID: return 11304;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 0).ID: return 11305;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 1).ID: return 11306;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 2).ID: return 11307;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 3).ID: return 11308;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 4).ID: return 11309;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 5).ID: return 11310;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 0).ID: return 11311;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 1).ID: return 11312;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 2).ID: return 11313;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 3).ID: return 11314;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 4).ID: return 11315;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 5).ID: return 11316;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 0).ID: return 11317;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 1).ID: return 11318;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 2).ID: return 11319;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 3).ID: return 11320;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 4).ID: return 11321;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 5).ID: return 11322;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 0).ID: return 11323;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 1).ID: return 11324;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 2).ID: return 11325;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 3).ID: return 11326;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 4).ID: return 11327;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 5).ID: return 11328;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 0).ID: return 11329;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 1).ID: return 11330;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 2).ID: return 11331;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 3).ID: return 11332;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 4).ID: return 11333;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 5).ID: return 11334;\n\t\t\tcase Beetroots::Beetroots(0).ID: return 8683;\n\t\t\tcase Beetroots::Beetroots(1).ID: return 8684;\n\t\t\tcase Beetroots::Beetroots(2).ID: return 8685;\n\t\t\tcase Beetroots::Beetroots(3).ID: return 8686;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 11198;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 11199;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 11200;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 11201;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 11202;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 11203;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 11204;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 11205;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 11206;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 11207;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 11208;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 11209;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 11210;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 11211;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 11212;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 11213;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 11214;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 11215;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 11216;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 11217;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XM, true).ID: return 11218;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XM, false).ID: return 11219;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XP, true).ID: return 11220;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XP, false).ID: return 11221;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 11222;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 11223;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 11224;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 11225;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XM, true).ID: return 11226;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XM, false).ID: return 11227;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XP, true).ID: return 11228;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XP, false).ID: return 11229;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5858;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5859;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5860;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5861;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5862;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5863;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5864;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5865;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5866;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5867;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5868;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5869;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5870;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5871;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5872;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5873;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5874;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5875;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5876;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5877;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5878;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5879;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5880;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5881;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8266;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8267;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8268;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8269;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8270;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8271;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8272;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8273;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8274;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8275;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8276;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8277;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8278;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8279;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8280;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8281;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8282;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8283;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8284;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8285;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8286;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8287;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8288;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8289;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8290;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8291;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8292;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8293;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8294;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8295;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8296;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8297;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8298;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8299;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8300;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8301;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8302;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8303;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8304;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8305;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8306;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8307;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8308;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8309;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8310;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8311;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8312;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8313;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8314;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8315;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8316;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8317;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8318;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8319;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8320;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8321;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8322;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8323;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8324;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8325;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8326;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8327;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8328;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8329;\n\t\t\tcase BirchFence::BirchFence(true, true, true, true).ID: return 8076;\n\t\t\tcase BirchFence::BirchFence(true, true, true, false).ID: return 8077;\n\t\t\tcase BirchFence::BirchFence(true, true, false, true).ID: return 8080;\n\t\t\tcase BirchFence::BirchFence(true, true, false, false).ID: return 8081;\n\t\t\tcase BirchFence::BirchFence(true, false, true, true).ID: return 8084;\n\t\t\tcase BirchFence::BirchFence(true, false, true, false).ID: return 8085;\n\t\t\tcase BirchFence::BirchFence(true, false, false, true).ID: return 8088;\n\t\t\tcase BirchFence::BirchFence(true, false, false, false).ID: return 8089;\n\t\t\tcase BirchFence::BirchFence(false, true, true, true).ID: return 8092;\n\t\t\tcase BirchFence::BirchFence(false, true, true, false).ID: return 8093;\n\t\t\tcase BirchFence::BirchFence(false, true, false, true).ID: return 8096;\n\t\t\tcase BirchFence::BirchFence(false, true, false, false).ID: return 8097;\n\t\t\tcase BirchFence::BirchFence(false, false, true, true).ID: return 8100;\n\t\t\tcase BirchFence::BirchFence(false, false, true, false).ID: return 8101;\n\t\t\tcase BirchFence::BirchFence(false, false, false, true).ID: return 8104;\n\t\t\tcase BirchFence::BirchFence(false, false, false, false).ID: return 8105;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7914;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7915;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7916;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7917;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7918;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7919;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7920;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7921;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7922;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7923;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7924;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7925;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7926;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7927;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7928;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7929;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7930;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7931;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7932;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7933;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7934;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7935;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7936;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7937;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7938;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7939;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7940;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7941;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7942;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7943;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7944;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7945;\n\t\t\tcase BirchLeaves::BirchLeaves(1, true).ID: return 172;\n\t\t\tcase BirchLeaves::BirchLeaves(1, false).ID: return 173;\n\t\t\tcase BirchLeaves::BirchLeaves(2, true).ID: return 174;\n\t\t\tcase BirchLeaves::BirchLeaves(2, false).ID: return 175;\n\t\t\tcase BirchLeaves::BirchLeaves(3, true).ID: return 176;\n\t\t\tcase BirchLeaves::BirchLeaves(3, false).ID: return 177;\n\t\t\tcase BirchLeaves::BirchLeaves(4, true).ID: return 178;\n\t\t\tcase BirchLeaves::BirchLeaves(4, false).ID: return 179;\n\t\t\tcase BirchLeaves::BirchLeaves(5, true).ID: return 180;\n\t\t\tcase BirchLeaves::BirchLeaves(5, false).ID: return 181;\n\t\t\tcase BirchLeaves::BirchLeaves(6, true).ID: return 182;\n\t\t\tcase BirchLeaves::BirchLeaves(6, false).ID: return 183;\n\t\t\tcase BirchLeaves::BirchLeaves(7, true).ID: return 184;\n\t\t\tcase BirchLeaves::BirchLeaves(7, false).ID: return 185;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::X).ID: return 78;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Y).ID: return 79;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Z).ID: return 80;\n\t\t\tcase BirchPlanks::BirchPlanks().ID: return 17;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(true).ID: return 3875;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(false).ID: return 3876;\n\t\t\tcase BirchSapling::BirchSapling(0).ID: return 25;\n\t\t\tcase BirchSapling::BirchSapling(1).ID: return 26;\n\t\t\tcase BirchSign::BirchSign(0).ID: return 3444;\n\t\t\tcase BirchSign::BirchSign(1).ID: return 3446;\n\t\t\tcase BirchSign::BirchSign(2).ID: return 3448;\n\t\t\tcase BirchSign::BirchSign(3).ID: return 3450;\n\t\t\tcase BirchSign::BirchSign(4).ID: return 3452;\n\t\t\tcase BirchSign::BirchSign(5).ID: return 3454;\n\t\t\tcase BirchSign::BirchSign(6).ID: return 3456;\n\t\t\tcase BirchSign::BirchSign(7).ID: return 3458;\n\t\t\tcase BirchSign::BirchSign(8).ID: return 3460;\n\t\t\tcase BirchSign::BirchSign(9).ID: return 3462;\n\t\t\tcase BirchSign::BirchSign(10).ID: return 3464;\n\t\t\tcase BirchSign::BirchSign(11).ID: return 3466;\n\t\t\tcase BirchSign::BirchSign(12).ID: return 3468;\n\t\t\tcase BirchSign::BirchSign(13).ID: return 3470;\n\t\t\tcase BirchSign::BirchSign(14).ID: return 3472;\n\t\t\tcase BirchSign::BirchSign(15).ID: return 3474;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Top).ID: return 7777;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Bottom).ID: return 7779;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Double).ID: return 7781;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5469;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5471;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5473;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5475;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5477;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5479;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5481;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5483;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5485;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5487;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5489;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5491;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5493;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5495;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5497;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5499;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5501;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5503;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5505;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5507;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5509;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5511;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5513;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5515;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5517;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5519;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5521;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5523;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5525;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5527;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5529;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5531;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5533;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5535;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5537;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5539;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5541;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5543;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5545;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5547;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, true).ID: return 4226;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, false).ID: return 4228;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, true).ID: return 4230;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, false).ID: return 4232;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, true).ID: return 4234;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, false).ID: return 4236;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, true).ID: return 4238;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, false).ID: return 4240;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, true).ID: return 4242;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, false).ID: return 4244;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, true).ID: return 4246;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, false).ID: return 4248;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, true).ID: return 4250;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, false).ID: return 4252;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, true).ID: return 4254;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, false).ID: return 4256;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, true).ID: return 4258;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, false).ID: return 4260;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, true).ID: return 4262;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, false).ID: return 4264;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, true).ID: return 4266;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, false).ID: return 4268;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, true).ID: return 4270;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, false).ID: return 4272;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, true).ID: return 4274;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, false).ID: return 4276;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, true).ID: return 4278;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, false).ID: return 4280;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, true).ID: return 4282;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, false).ID: return 4284;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, true).ID: return 4286;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, false).ID: return 4288;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3750;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3752;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3754;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3756;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::X).ID: return 114;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Y).ID: return 115;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Z).ID: return 116;\n\t\t\tcase BlackBanner::BlackBanner(0).ID: return 7601;\n\t\t\tcase BlackBanner::BlackBanner(1).ID: return 7602;\n\t\t\tcase BlackBanner::BlackBanner(2).ID: return 7603;\n\t\t\tcase BlackBanner::BlackBanner(3).ID: return 7604;\n\t\t\tcase BlackBanner::BlackBanner(4).ID: return 7605;\n\t\t\tcase BlackBanner::BlackBanner(5).ID: return 7606;\n\t\t\tcase BlackBanner::BlackBanner(6).ID: return 7607;\n\t\t\tcase BlackBanner::BlackBanner(7).ID: return 7608;\n\t\t\tcase BlackBanner::BlackBanner(8).ID: return 7609;\n\t\t\tcase BlackBanner::BlackBanner(9).ID: return 7610;\n\t\t\tcase BlackBanner::BlackBanner(10).ID: return 7611;\n\t\t\tcase BlackBanner::BlackBanner(11).ID: return 7612;\n\t\t\tcase BlackBanner::BlackBanner(12).ID: return 7613;\n\t\t\tcase BlackBanner::BlackBanner(13).ID: return 7614;\n\t\t\tcase BlackBanner::BlackBanner(14).ID: return 7615;\n\t\t\tcase BlackBanner::BlackBanner(15).ID: return 7616;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Head).ID: return 1288;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Foot).ID: return 1289;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Head).ID: return 1290;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Foot).ID: return 1291;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Head).ID: return 1292;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Foot).ID: return 1293;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Head).ID: return 1294;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Foot).ID: return 1295;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Head).ID: return 1296;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Foot).ID: return 1297;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Head).ID: return 1298;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Foot).ID: return 1299;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Head).ID: return 1300;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Foot).ID: return 1301;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Head).ID: return 1302;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Foot).ID: return 1303;\n\t\t\tcase BlackCarpet::BlackCarpet().ID: return 7345;\n\t\t\tcase BlackConcrete::BlackConcrete().ID: return 8917;\n\t\t\tcase BlackConcretePowder::BlackConcretePowder().ID: return 8933;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8898;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8899;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8900;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8901;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8832;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8833;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8834;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8835;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8836;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8837;\n\t\t\tcase BlackStainedGlass::BlackStainedGlass().ID: return 4096;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, true).ID: return 6809;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, false).ID: return 6810;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, true).ID: return 6813;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, false).ID: return 6814;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, true).ID: return 6817;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, false).ID: return 6818;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, true).ID: return 6821;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, false).ID: return 6822;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, true).ID: return 6825;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, false).ID: return 6826;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, true).ID: return 6829;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, false).ID: return 6830;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, true).ID: return 6833;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, false).ID: return 6834;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, true).ID: return 6837;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, false).ID: return 6838;\n\t\t\tcase BlackTerracotta::BlackTerracotta().ID: return 6326;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7677;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7678;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7679;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7680;\n\t\t\tcase BlackWool::BlackWool().ID: return 1398;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZM, true).ID: return 11155;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZM, false).ID: return 11156;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZP, true).ID: return 11157;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZP, false).ID: return 11158;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XM, true).ID: return 11159;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XM, false).ID: return 11160;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XP, true).ID: return 11161;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XP, false).ID: return 11162;\n\t\t\tcase BlueBanner::BlueBanner(0).ID: return 7537;\n\t\t\tcase BlueBanner::BlueBanner(1).ID: return 7538;\n\t\t\tcase BlueBanner::BlueBanner(2).ID: return 7539;\n\t\t\tcase BlueBanner::BlueBanner(3).ID: return 7540;\n\t\t\tcase BlueBanner::BlueBanner(4).ID: return 7541;\n\t\t\tcase BlueBanner::BlueBanner(5).ID: return 7542;\n\t\t\tcase BlueBanner::BlueBanner(6).ID: return 7543;\n\t\t\tcase BlueBanner::BlueBanner(7).ID: return 7544;\n\t\t\tcase BlueBanner::BlueBanner(8).ID: return 7545;\n\t\t\tcase BlueBanner::BlueBanner(9).ID: return 7546;\n\t\t\tcase BlueBanner::BlueBanner(10).ID: return 7547;\n\t\t\tcase BlueBanner::BlueBanner(11).ID: return 7548;\n\t\t\tcase BlueBanner::BlueBanner(12).ID: return 7549;\n\t\t\tcase BlueBanner::BlueBanner(13).ID: return 7550;\n\t\t\tcase BlueBanner::BlueBanner(14).ID: return 7551;\n\t\t\tcase BlueBanner::BlueBanner(15).ID: return 7552;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Head).ID: return 1224;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Foot).ID: return 1225;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Head).ID: return 1226;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Foot).ID: return 1227;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Head).ID: return 1228;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Foot).ID: return 1229;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Head).ID: return 1230;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Foot).ID: return 1231;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Head).ID: return 1232;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Foot).ID: return 1233;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Head).ID: return 1234;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Foot).ID: return 1235;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Head).ID: return 1236;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Foot).ID: return 1237;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Head).ID: return 1238;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Foot).ID: return 1239;\n\t\t\tcase BlueCarpet::BlueCarpet().ID: return 7341;\n\t\t\tcase BlueConcrete::BlueConcrete().ID: return 8913;\n\t\t\tcase BlueConcretePowder::BlueConcretePowder().ID: return 8929;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8882;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8883;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8884;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8885;\n\t\t\tcase BlueIce::BlueIce().ID: return 9112;\n\t\t\tcase BlueOrchid::BlueOrchid().ID: return 1413;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8808;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8809;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8810;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8811;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8812;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8813;\n\t\t\tcase BlueStainedGlass::BlueStainedGlass().ID: return 4092;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, true).ID: return 6681;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, false).ID: return 6682;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, true).ID: return 6685;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, false).ID: return 6686;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, true).ID: return 6689;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, false).ID: return 6690;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, true).ID: return 6693;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, false).ID: return 6694;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, true).ID: return 6697;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, false).ID: return 6698;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, true).ID: return 6701;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, false).ID: return 6702;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, true).ID: return 6705;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, false).ID: return 6706;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, true).ID: return 6709;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, false).ID: return 6710;\n\t\t\tcase BlueTerracotta::BlueTerracotta().ID: return 6322;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7661;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7662;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7663;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7664;\n\t\t\tcase BlueWool::BlueWool().ID: return 1394;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::X).ID: return 8720;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Y).ID: return 8721;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Z).ID: return 8722;\n\t\t\tcase Bookshelf::Bookshelf().ID: return 1431;\n\t\t\tcase BrainCoral::BrainCoral().ID: return 8997;\n\t\t\tcase BrainCoralBlock::BrainCoralBlock().ID: return 8980;\n\t\t\tcase BrainCoralFan::BrainCoralFan().ID: return 9017;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9073;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9075;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9077;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9079;\n\t\t\tcase BrewingStand::BrewingStand(true, true, true).ID: return 5117;\n\t\t\tcase BrewingStand::BrewingStand(true, true, false).ID: return 5118;\n\t\t\tcase BrewingStand::BrewingStand(true, false, true).ID: return 5119;\n\t\t\tcase BrewingStand::BrewingStand(true, false, false).ID: return 5120;\n\t\t\tcase BrewingStand::BrewingStand(false, true, true).ID: return 5121;\n\t\t\tcase BrewingStand::BrewingStand(false, true, false).ID: return 5122;\n\t\t\tcase BrewingStand::BrewingStand(false, false, true).ID: return 5123;\n\t\t\tcase BrewingStand::BrewingStand(false, false, false).ID: return 5124;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Top).ID: return 7837;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Bottom).ID: return 7839;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Double).ID: return 7841;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4837;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4839;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4841;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4843;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4845;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4847;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4849;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4851;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4853;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4855;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4857;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4859;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4861;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4863;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4865;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4867;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4869;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4871;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4873;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4875;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4877;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4879;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4881;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4883;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4885;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4887;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4889;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4891;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4893;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4895;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4897;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4899;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4901;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4903;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4905;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4907;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4909;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4911;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4913;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4915;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10333;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10334;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10337;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10338;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10341;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::None).ID: return 10342;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10345;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::None).ID: return 10346;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10349;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10350;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10353;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10354;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10357;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::None).ID: return 10358;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10361;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::None).ID: return 10362;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10365;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10366;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10369;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10370;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10373;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::None).ID: return 10374;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10377;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::None).ID: return 10378;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10381;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10382;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10385;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10386;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10389;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::None).ID: return 10390;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10393;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::None).ID: return 10394;\n\t\t\tcase Bricks::Bricks().ID: return 1428;\n\t\t\tcase BrownBanner::BrownBanner(0).ID: return 7553;\n\t\t\tcase BrownBanner::BrownBanner(1).ID: return 7554;\n\t\t\tcase BrownBanner::BrownBanner(2).ID: return 7555;\n\t\t\tcase BrownBanner::BrownBanner(3).ID: return 7556;\n\t\t\tcase BrownBanner::BrownBanner(4).ID: return 7557;\n\t\t\tcase BrownBanner::BrownBanner(5).ID: return 7558;\n\t\t\tcase BrownBanner::BrownBanner(6).ID: return 7559;\n\t\t\tcase BrownBanner::BrownBanner(7).ID: return 7560;\n\t\t\tcase BrownBanner::BrownBanner(8).ID: return 7561;\n\t\t\tcase BrownBanner::BrownBanner(9).ID: return 7562;\n\t\t\tcase BrownBanner::BrownBanner(10).ID: return 7563;\n\t\t\tcase BrownBanner::BrownBanner(11).ID: return 7564;\n\t\t\tcase BrownBanner::BrownBanner(12).ID: return 7565;\n\t\t\tcase BrownBanner::BrownBanner(13).ID: return 7566;\n\t\t\tcase BrownBanner::BrownBanner(14).ID: return 7567;\n\t\t\tcase BrownBanner::BrownBanner(15).ID: return 7568;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Head).ID: return 1240;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Foot).ID: return 1241;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Head).ID: return 1242;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Foot).ID: return 1243;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Head).ID: return 1244;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Foot).ID: return 1245;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Head).ID: return 1246;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Foot).ID: return 1247;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Head).ID: return 1248;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Foot).ID: return 1249;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Head).ID: return 1250;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Foot).ID: return 1251;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Head).ID: return 1252;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Foot).ID: return 1253;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Head).ID: return 1254;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Foot).ID: return 1255;\n\t\t\tcase BrownCarpet::BrownCarpet().ID: return 7342;\n\t\t\tcase BrownConcrete::BrownConcrete().ID: return 8914;\n\t\t\tcase BrownConcretePowder::BrownConcretePowder().ID: return 8930;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8886;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8887;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8888;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8889;\n\t\t\tcase BrownMushroom::BrownMushroom().ID: return 1424;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, true).ID: return 4491;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, false).ID: return 4492;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, true).ID: return 4493;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, false).ID: return 4494;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, true).ID: return 4495;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, false).ID: return 4496;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, true).ID: return 4497;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, false).ID: return 4498;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, true).ID: return 4499;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, false).ID: return 4500;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, true).ID: return 4501;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, false).ID: return 4502;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, true).ID: return 4503;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, false).ID: return 4504;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, true).ID: return 4505;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, false).ID: return 4506;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, true).ID: return 4507;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, false).ID: return 4508;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, true).ID: return 4509;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, false).ID: return 4510;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, true).ID: return 4511;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, false).ID: return 4512;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, true).ID: return 4513;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, false).ID: return 4514;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, true).ID: return 4515;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, false).ID: return 4516;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, true).ID: return 4517;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, false).ID: return 4518;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, true).ID: return 4519;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, false).ID: return 4520;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, true).ID: return 4521;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, false).ID: return 4522;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, true).ID: return 4523;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, false).ID: return 4524;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, true).ID: return 4525;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, false).ID: return 4526;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, true).ID: return 4527;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, false).ID: return 4528;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, true).ID: return 4529;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, false).ID: return 4530;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, true).ID: return 4531;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, false).ID: return 4532;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, true).ID: return 4533;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, false).ID: return 4534;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, true).ID: return 4535;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, false).ID: return 4536;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, true).ID: return 4537;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, false).ID: return 4538;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, true).ID: return 4539;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, false).ID: return 4540;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, true).ID: return 4541;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, false).ID: return 4542;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, true).ID: return 4543;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, false).ID: return 4544;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, true).ID: return 4545;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, false).ID: return 4546;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, true).ID: return 4547;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, false).ID: return 4548;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, true).ID: return 4549;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, false).ID: return 4550;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, true).ID: return 4551;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, false).ID: return 4552;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, true).ID: return 4553;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false).ID: return 4554;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8814;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8815;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8816;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8817;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8818;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8819;\n\t\t\tcase BrownStainedGlass::BrownStainedGlass().ID: return 4093;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, true).ID: return 6713;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, false).ID: return 6714;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, true).ID: return 6717;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, false).ID: return 6718;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, true).ID: return 6721;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, false).ID: return 6722;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, true).ID: return 6725;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, false).ID: return 6726;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, true).ID: return 6729;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, false).ID: return 6730;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, true).ID: return 6733;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, false).ID: return 6734;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, true).ID: return 6737;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, false).ID: return 6738;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, true).ID: return 6741;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, false).ID: return 6742;\n\t\t\tcase BrownTerracotta::BrownTerracotta().ID: return 6323;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7665;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7666;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7667;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7668;\n\t\t\tcase BrownWool::BrownWool().ID: return 1395;\n\t\t\tcase BubbleColumn::BubbleColumn(true).ID: return 9131;\n\t\t\tcase BubbleColumn::BubbleColumn(false).ID: return 9132;\n\t\t\tcase BubbleCoral::BubbleCoral().ID: return 8999;\n\t\t\tcase BubbleCoralBlock::BubbleCoralBlock().ID: return 8981;\n\t\t\tcase BubbleCoralFan::BubbleCoralFan().ID: return 9019;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9081;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9083;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9085;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9087;\n\t\t\tcase Cactus::Cactus(0).ID: return 3929;\n\t\t\tcase Cactus::Cactus(1).ID: return 3930;\n\t\t\tcase Cactus::Cactus(2).ID: return 3931;\n\t\t\tcase Cactus::Cactus(3).ID: return 3932;\n\t\t\tcase Cactus::Cactus(4).ID: return 3933;\n\t\t\tcase Cactus::Cactus(5).ID: return 3934;\n\t\t\tcase Cactus::Cactus(6).ID: return 3935;\n\t\t\tcase Cactus::Cactus(7).ID: return 3936;\n\t\t\tcase Cactus::Cactus(8).ID: return 3937;\n\t\t\tcase Cactus::Cactus(9).ID: return 3938;\n\t\t\tcase Cactus::Cactus(10).ID: return 3939;\n\t\t\tcase Cactus::Cactus(11).ID: return 3940;\n\t\t\tcase Cactus::Cactus(12).ID: return 3941;\n\t\t\tcase Cactus::Cactus(13).ID: return 3942;\n\t\t\tcase Cactus::Cactus(14).ID: return 3943;\n\t\t\tcase Cactus::Cactus(15).ID: return 3944;\n\t\t\tcase Cake::Cake(0).ID: return 4010;\n\t\t\tcase Cake::Cake(1).ID: return 4011;\n\t\t\tcase Cake::Cake(2).ID: return 4012;\n\t\t\tcase Cake::Cake(3).ID: return 4013;\n\t\t\tcase Cake::Cake(4).ID: return 4014;\n\t\t\tcase Cake::Cake(5).ID: return 4015;\n\t\t\tcase Cake::Cake(6).ID: return 4016;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 11233;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 11235;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 11237;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 11239;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 11241;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 11243;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 11245;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 11247;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, true, true).ID: return 11249;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, true, false).ID: return 11251;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, false, true).ID: return 11253;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, false, false).ID: return 11255;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, true, true).ID: return 11257;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, true, false).ID: return 11259;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, false, true).ID: return 11261;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, false, false).ID: return 11263;\n\t\t\tcase Carrots::Carrots(0).ID: return 5794;\n\t\t\tcase Carrots::Carrots(1).ID: return 5795;\n\t\t\tcase Carrots::Carrots(2).ID: return 5796;\n\t\t\tcase Carrots::Carrots(3).ID: return 5797;\n\t\t\tcase Carrots::Carrots(4).ID: return 5798;\n\t\t\tcase Carrots::Carrots(5).ID: return 5799;\n\t\t\tcase Carrots::Carrots(6).ID: return 5800;\n\t\t\tcase Carrots::Carrots(7).ID: return 5801;\n\t\t\tcase CartographyTable::CartographyTable().ID: return 11163;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZM).ID: return 4002;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZP).ID: return 4003;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XM).ID: return 4004;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XP).ID: return 4005;\n\t\t\tcase Cauldron::Cauldron(0).ID: return 5125;\n\t\t\tcase Cauldron::Cauldron(1).ID: return 5126;\n\t\t\tcase Cauldron::Cauldron(2).ID: return 5127;\n\t\t\tcase Cauldron::Cauldron(3).ID: return 5128;\n\t\t\tcase CaveAir::CaveAir().ID: return 9130;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 8701;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 8702;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 8703;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 8704;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 8705;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 8706;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 8707;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 8708;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 8709;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 8710;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 8711;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 8712;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Single).ID: return 2033;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Left).ID: return 2035;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Right).ID: return 2037;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Single).ID: return 2039;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Left).ID: return 2041;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Right).ID: return 2043;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Single).ID: return 2045;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Left).ID: return 2047;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Right).ID: return 2049;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Single).ID: return 2051;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Left).ID: return 2053;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Right).ID: return 2055;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6078;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6079;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 6080;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 6081;\n\t\t\tcase ChiseledQuartzBlock::ChiseledQuartzBlock().ID: return 6203;\n\t\t\tcase ChiseledRedSandstone::ChiseledRedSandstone().ID: return 7682;\n\t\t\tcase ChiseledSandstone::ChiseledSandstone().ID: return 246;\n\t\t\tcase ChiseledStoneBricks::ChiseledStoneBricks().ID: return 4484;\n\t\t\tcase ChorusFlower::ChorusFlower(0).ID: return 8592;\n\t\t\tcase ChorusFlower::ChorusFlower(1).ID: return 8593;\n\t\t\tcase ChorusFlower::ChorusFlower(2).ID: return 8594;\n\t\t\tcase ChorusFlower::ChorusFlower(3).ID: return 8595;\n\t\t\tcase ChorusFlower::ChorusFlower(4).ID: return 8596;\n\t\t\tcase ChorusFlower::ChorusFlower(5).ID: return 8597;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, true).ID: return 8528;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, false).ID: return 8529;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, true).ID: return 8530;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, false).ID: return 8531;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, true).ID: return 8532;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, false).ID: return 8533;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, true).ID: return 8534;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, false).ID: return 8535;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, true).ID: return 8536;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, false).ID: return 8537;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, true).ID: return 8538;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, false).ID: return 8539;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, true).ID: return 8540;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, false).ID: return 8541;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, true).ID: return 8542;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, false).ID: return 8543;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, true).ID: return 8544;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, false).ID: return 8545;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, true).ID: return 8546;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, false).ID: return 8547;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, true).ID: return 8548;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, false).ID: return 8549;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, true).ID: return 8550;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, false).ID: return 8551;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, true).ID: return 8552;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, false).ID: return 8553;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, true).ID: return 8554;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, false).ID: return 8555;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, true).ID: return 8556;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, false).ID: return 8557;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, true).ID: return 8558;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, false).ID: return 8559;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, true).ID: return 8560;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, false).ID: return 8561;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, true).ID: return 8562;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, false).ID: return 8563;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, true).ID: return 8564;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, false).ID: return 8565;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, true).ID: return 8566;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, false).ID: return 8567;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, true).ID: return 8568;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, false).ID: return 8569;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, true).ID: return 8570;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, false).ID: return 8571;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, true).ID: return 8572;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, false).ID: return 8573;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, true).ID: return 8574;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, false).ID: return 8575;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, true).ID: return 8576;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, false).ID: return 8577;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, true).ID: return 8578;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, false).ID: return 8579;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, true).ID: return 8580;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, false).ID: return 8581;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, true).ID: return 8582;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, false).ID: return 8583;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, true).ID: return 8584;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, false).ID: return 8585;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, true).ID: return 8586;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, false).ID: return 8587;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, true).ID: return 8588;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, false).ID: return 8589;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, true).ID: return 8590;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, false).ID: return 8591;\n\t\t\tcase Clay::Clay().ID: return 3945;\n\t\t\tcase CoalBlock::CoalBlock().ID: return 7347;\n\t\t\tcase CoalOre::CoalOre().ID: return 71;\n\t\t\tcase CoarseDirt::CoarseDirt().ID: return 11;\n\t\t\tcase Cobblestone::Cobblestone().ID: return 14;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Top).ID: return 7831;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Bottom).ID: return 7833;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Double).ID: return 7835;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3654;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3656;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3658;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3660;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3662;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3664;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3666;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3668;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3670;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3672;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3674;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3676;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3678;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3680;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3682;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3684;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3686;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3688;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3690;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3692;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3694;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3696;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3698;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3700;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3702;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3704;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3706;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3708;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3710;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3712;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3714;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3716;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3718;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3720;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3722;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3724;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3726;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3728;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3730;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3732;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5643;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5644;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5647;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5648;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5651;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5652;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5655;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5656;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5659;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5660;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5663;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5664;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5667;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5668;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5671;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5672;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5675;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5676;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5679;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5680;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5683;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5684;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5687;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5688;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5691;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5692;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5695;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5696;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5699;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5700;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5703;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5704;\n\t\t\tcase Cobweb::Cobweb().ID: return 1340;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZM).ID: return 5142;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZP).ID: return 5143;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XM).ID: return 5144;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XP).ID: return 5145;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZM).ID: return 5146;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZP).ID: return 5147;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XM).ID: return 5148;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XP).ID: return 5149;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZM).ID: return 5150;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZP).ID: return 5151;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XM).ID: return 5152;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XP).ID: return 5153;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5628;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 5629;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5630;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 5631;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 5632;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 5633;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5634;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 5635;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5636;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 5637;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 5638;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 5639;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, true).ID: return 6142;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, false).ID: return 6143;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, true).ID: return 6144;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, false).ID: return 6145;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, true).ID: return 6146;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, false).ID: return 6147;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, true).ID: return 6148;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, false).ID: return 6149;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, true).ID: return 6150;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, false).ID: return 6151;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, true).ID: return 6152;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, false).ID: return 6153;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, true).ID: return 6154;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, false).ID: return 6155;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, true).ID: return 6156;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, false).ID: return 6157;\n\t\t\tcase Composter::Composter(0).ID: return 11278;\n\t\t\tcase Composter::Composter(1).ID: return 11279;\n\t\t\tcase Composter::Composter(2).ID: return 11280;\n\t\t\tcase Composter::Composter(3).ID: return 11281;\n\t\t\tcase Composter::Composter(4).ID: return 11282;\n\t\t\tcase Composter::Composter(5).ID: return 11283;\n\t\t\tcase Composter::Composter(6).ID: return 11284;\n\t\t\tcase Composter::Composter(7).ID: return 11285;\n\t\t\tcase Composter::Composter(8).ID: return 11286;\n\t\t\tcase Conduit::Conduit().ID: return 9114;\n\t\t\tcase Cornflower::Cornflower().ID: return 1421;\n\t\t\tcase CrackedStoneBricks::CrackedStoneBricks().ID: return 4483;\n\t\t\tcase CraftingTable::CraftingTable().ID: return 3354;\n\t\t\tcase CreeperHead::CreeperHead(0).ID: return 6034;\n\t\t\tcase CreeperHead::CreeperHead(1).ID: return 6035;\n\t\t\tcase CreeperHead::CreeperHead(2).ID: return 6036;\n\t\t\tcase CreeperHead::CreeperHead(3).ID: return 6037;\n\t\t\tcase CreeperHead::CreeperHead(4).ID: return 6038;\n\t\t\tcase CreeperHead::CreeperHead(5).ID: return 6039;\n\t\t\tcase CreeperHead::CreeperHead(6).ID: return 6040;\n\t\t\tcase CreeperHead::CreeperHead(7).ID: return 6041;\n\t\t\tcase CreeperHead::CreeperHead(8).ID: return 6042;\n\t\t\tcase CreeperHead::CreeperHead(9).ID: return 6043;\n\t\t\tcase CreeperHead::CreeperHead(10).ID: return 6044;\n\t\t\tcase CreeperHead::CreeperHead(11).ID: return 6045;\n\t\t\tcase CreeperHead::CreeperHead(12).ID: return 6046;\n\t\t\tcase CreeperHead::CreeperHead(13).ID: return 6047;\n\t\t\tcase CreeperHead::CreeperHead(14).ID: return 6048;\n\t\t\tcase CreeperHead::CreeperHead(15).ID: return 6049;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6050;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6051;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6052;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6053;\n\t\t\tcase CutRedSandstone::CutRedSandstone().ID: return 7683;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Top).ID: return 7867;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Bottom).ID: return 7869;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Double).ID: return 7871;\n\t\t\tcase CutSandstone::CutSandstone().ID: return 247;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Top).ID: return 7819;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Bottom).ID: return 7821;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Double).ID: return 7823;\n\t\t\tcase CyanBanner::CyanBanner(0).ID: return 7505;\n\t\t\tcase CyanBanner::CyanBanner(1).ID: return 7506;\n\t\t\tcase CyanBanner::CyanBanner(2).ID: return 7507;\n\t\t\tcase CyanBanner::CyanBanner(3).ID: return 7508;\n\t\t\tcase CyanBanner::CyanBanner(4).ID: return 7509;\n\t\t\tcase CyanBanner::CyanBanner(5).ID: return 7510;\n\t\t\tcase CyanBanner::CyanBanner(6).ID: return 7511;\n\t\t\tcase CyanBanner::CyanBanner(7).ID: return 7512;\n\t\t\tcase CyanBanner::CyanBanner(8).ID: return 7513;\n\t\t\tcase CyanBanner::CyanBanner(9).ID: return 7514;\n\t\t\tcase CyanBanner::CyanBanner(10).ID: return 7515;\n\t\t\tcase CyanBanner::CyanBanner(11).ID: return 7516;\n\t\t\tcase CyanBanner::CyanBanner(12).ID: return 7517;\n\t\t\tcase CyanBanner::CyanBanner(13).ID: return 7518;\n\t\t\tcase CyanBanner::CyanBanner(14).ID: return 7519;\n\t\t\tcase CyanBanner::CyanBanner(15).ID: return 7520;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Head).ID: return 1192;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Foot).ID: return 1193;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Head).ID: return 1194;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Foot).ID: return 1195;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Head).ID: return 1196;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Foot).ID: return 1197;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Head).ID: return 1198;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Foot).ID: return 1199;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Head).ID: return 1200;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Foot).ID: return 1201;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Head).ID: return 1202;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Foot).ID: return 1203;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Head).ID: return 1204;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Foot).ID: return 1205;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Head).ID: return 1206;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Foot).ID: return 1207;\n\t\t\tcase CyanCarpet::CyanCarpet().ID: return 7339;\n\t\t\tcase CyanConcrete::CyanConcrete().ID: return 8911;\n\t\t\tcase CyanConcretePowder::CyanConcretePowder().ID: return 8927;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8874;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8875;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8876;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8877;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8796;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8797;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8798;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8799;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8800;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8801;\n\t\t\tcase CyanStainedGlass::CyanStainedGlass().ID: return 4090;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, true).ID: return 6617;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, false).ID: return 6618;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, true).ID: return 6621;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, false).ID: return 6622;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, true).ID: return 6625;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, false).ID: return 6626;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, true).ID: return 6629;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, false).ID: return 6630;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, true).ID: return 6633;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, false).ID: return 6634;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, true).ID: return 6637;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, false).ID: return 6638;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, true).ID: return 6641;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, false).ID: return 6642;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, true).ID: return 6645;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, false).ID: return 6646;\n\t\t\tcase CyanTerracotta::CyanTerracotta().ID: return 6320;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7653;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7654;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7655;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7656;\n\t\t\tcase CyanWool::CyanWool().ID: return 1392;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6082;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6083;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 6084;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 6085;\n\t\t\tcase Dandelion::Dandelion().ID: return 1411;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5930;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5931;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5932;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5933;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5934;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5935;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5936;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5937;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5938;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5939;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5940;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5941;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5942;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5943;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5944;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5945;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5946;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5947;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5948;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5949;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5950;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5951;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5952;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5953;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8458;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8459;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8460;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8461;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8462;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8463;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 8464;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 8465;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 8466;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 8467;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 8468;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 8469;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 8470;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 8471;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 8472;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 8473;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8474;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8475;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8476;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8477;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8478;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8479;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 8480;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 8481;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 8482;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 8483;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 8484;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 8485;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 8486;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 8487;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 8488;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 8489;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8490;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8491;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8492;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8493;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8494;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8495;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 8496;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 8497;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 8498;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 8499;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 8500;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 8501;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 8502;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 8503;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 8504;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 8505;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8506;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8507;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8508;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8509;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8510;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8511;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 8512;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 8513;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 8514;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 8515;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 8516;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 8517;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 8518;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 8519;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 8520;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 8521;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, true).ID: return 8172;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, false).ID: return 8173;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, true).ID: return 8176;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, false).ID: return 8177;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, true).ID: return 8180;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, false).ID: return 8181;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, true).ID: return 8184;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, false).ID: return 8185;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, true).ID: return 8188;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, false).ID: return 8189;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, true).ID: return 8192;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, false).ID: return 8193;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, true).ID: return 8196;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, false).ID: return 8197;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, true).ID: return 8200;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, false).ID: return 8201;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 8010;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 8011;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 8012;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 8013;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 8014;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 8015;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 8016;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 8017;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 8018;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 8019;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 8020;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 8021;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 8022;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 8023;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 8024;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 8025;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 8026;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 8027;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 8028;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 8029;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 8030;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 8031;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8032;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8033;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8034;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8035;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8036;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8037;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8038;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8039;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8040;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8041;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, true).ID: return 214;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, false).ID: return 215;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, true).ID: return 216;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, false).ID: return 217;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, true).ID: return 218;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, false).ID: return 219;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, true).ID: return 220;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, false).ID: return 221;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, true).ID: return 222;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, false).ID: return 223;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, true).ID: return 224;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, false).ID: return 225;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, true).ID: return 226;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, false).ID: return 227;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::X).ID: return 87;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Y).ID: return 88;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Z).ID: return 89;\n\t\t\tcase DarkOakPlanks::DarkOakPlanks().ID: return 20;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(true).ID: return 3881;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(false).ID: return 3882;\n\t\t\tcase DarkOakSapling::DarkOakSapling(0).ID: return 31;\n\t\t\tcase DarkOakSapling::DarkOakSapling(1).ID: return 32;\n\t\t\tcase DarkOakSign::DarkOakSign(0).ID: return 3540;\n\t\t\tcase DarkOakSign::DarkOakSign(1).ID: return 3542;\n\t\t\tcase DarkOakSign::DarkOakSign(2).ID: return 3544;\n\t\t\tcase DarkOakSign::DarkOakSign(3).ID: return 3546;\n\t\t\tcase DarkOakSign::DarkOakSign(4).ID: return 3548;\n\t\t\tcase DarkOakSign::DarkOakSign(5).ID: return 3550;\n\t\t\tcase DarkOakSign::DarkOakSign(6).ID: return 3552;\n\t\t\tcase DarkOakSign::DarkOakSign(7).ID: return 3554;\n\t\t\tcase DarkOakSign::DarkOakSign(8).ID: return 3556;\n\t\t\tcase DarkOakSign::DarkOakSign(9).ID: return 3558;\n\t\t\tcase DarkOakSign::DarkOakSign(10).ID: return 3560;\n\t\t\tcase DarkOakSign::DarkOakSign(11).ID: return 3562;\n\t\t\tcase DarkOakSign::DarkOakSign(12).ID: return 3564;\n\t\t\tcase DarkOakSign::DarkOakSign(13).ID: return 3566;\n\t\t\tcase DarkOakSign::DarkOakSign(14).ID: return 3568;\n\t\t\tcase DarkOakSign::DarkOakSign(15).ID: return 3570;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Top).ID: return 7795;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Bottom).ID: return 7797;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Double).ID: return 7799;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6920;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6922;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6924;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6926;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6928;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6930;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6932;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6934;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6936;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6938;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6940;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6942;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6944;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6946;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6948;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6950;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6952;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6954;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6956;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6958;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6960;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6962;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6964;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6966;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6968;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6970;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6972;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6974;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6976;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6978;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 6980;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 6982;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 6984;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 6986;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 6988;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 6990;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 6992;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 6994;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 6996;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 6998;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, true).ID: return 4418;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, false).ID: return 4420;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, true).ID: return 4422;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, false).ID: return 4424;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4426;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4428;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4430;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4432;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, true).ID: return 4434;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, false).ID: return 4436;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, true).ID: return 4438;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, false).ID: return 4440;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4442;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4444;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4446;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4448;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, true).ID: return 4450;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, false).ID: return 4452;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, true).ID: return 4454;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, false).ID: return 4456;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4458;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4460;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4462;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4464;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, true).ID: return 4466;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, false).ID: return 4468;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, true).ID: return 4470;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, false).ID: return 4472;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4474;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4476;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4478;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4480;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3774;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3776;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3778;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3780;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::X).ID: return 123;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Y).ID: return 124;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Z).ID: return 125;\n\t\t\tcase DarkPrismarine::DarkPrismarine().ID: return 7067;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Top).ID: return 7321;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Bottom).ID: return 7323;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Double).ID: return 7325;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7229;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7231;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7233;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7235;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7237;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7239;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7241;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7243;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7245;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7247;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7249;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7251;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7253;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7255;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7257;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7259;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7261;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7263;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7265;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7267;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7269;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7271;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7273;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7275;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7277;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7279;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7281;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7283;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7285;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7287;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7289;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7291;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7293;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7295;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7297;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7299;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7301;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7303;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7305;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7307;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 0).ID: return 6158;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 1).ID: return 6159;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 2).ID: return 6160;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 3).ID: return 6161;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 4).ID: return 6162;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 5).ID: return 6163;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 6).ID: return 6164;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 7).ID: return 6165;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 8).ID: return 6166;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 9).ID: return 6167;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 10).ID: return 6168;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 11).ID: return 6169;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 12).ID: return 6170;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 13).ID: return 6171;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 14).ID: return 6172;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 15).ID: return 6173;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 0).ID: return 6174;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 1).ID: return 6175;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 2).ID: return 6176;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 3).ID: return 6177;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 4).ID: return 6178;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 5).ID: return 6179;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 6).ID: return 6180;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 7).ID: return 6181;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 8).ID: return 6182;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 9).ID: return 6183;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 10).ID: return 6184;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 11).ID: return 6185;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 12).ID: return 6186;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 13).ID: return 6187;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 14).ID: return 6188;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 15).ID: return 6189;\n\t\t\tcase DeadBrainCoral::DeadBrainCoral().ID: return 8987;\n\t\t\tcase DeadBrainCoralBlock::DeadBrainCoralBlock().ID: return 8975;\n\t\t\tcase DeadBrainCoralFan::DeadBrainCoralFan().ID: return 9007;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9033;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9035;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9037;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9039;\n\t\t\tcase DeadBubbleCoral::DeadBubbleCoral().ID: return 8989;\n\t\t\tcase DeadBubbleCoralBlock::DeadBubbleCoralBlock().ID: return 8976;\n\t\t\tcase DeadBubbleCoralFan::DeadBubbleCoralFan().ID: return 9009;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9041;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9043;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9045;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9047;\n\t\t\tcase DeadBush::DeadBush().ID: return 1343;\n\t\t\tcase DeadFireCoral::DeadFireCoral().ID: return 8991;\n\t\t\tcase DeadFireCoralBlock::DeadFireCoralBlock().ID: return 8977;\n\t\t\tcase DeadFireCoralFan::DeadFireCoralFan().ID: return 9011;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9049;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9051;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9053;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9055;\n\t\t\tcase DeadHornCoral::DeadHornCoral().ID: return 8993;\n\t\t\tcase DeadHornCoralBlock::DeadHornCoralBlock().ID: return 8978;\n\t\t\tcase DeadHornCoralFan::DeadHornCoralFan().ID: return 9013;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9057;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9059;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9061;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9063;\n\t\t\tcase DeadTubeCoral::DeadTubeCoral().ID: return 8985;\n\t\t\tcase DeadTubeCoralBlock::DeadTubeCoralBlock().ID: return 8974;\n\t\t\tcase DeadTubeCoralFan::DeadTubeCoralFan().ID: return 9005;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9025;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9027;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9029;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9031;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::NorthSouth).ID: return 1316;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::EastWest).ID: return 1317;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingEast).ID: return 1318;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingWest).ID: return 1319;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingNorth).ID: return 1320;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingSouth).ID: return 1321;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::NorthSouth).ID: return 1322;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::EastWest).ID: return 1323;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingEast).ID: return 1324;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingWest).ID: return 1325;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingNorth).ID: return 1326;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingSouth).ID: return 1327;\n\t\t\tcase DiamondBlock::DiamondBlock().ID: return 3353;\n\t\t\tcase DiamondOre::DiamondOre().ID: return 3352;\n\t\t\tcase Diorite::Diorite().ID: return 4;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Top).ID: return 10326;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Bottom).ID: return 10328;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Double).ID: return 10330;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10174;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10176;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10178;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10180;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10182;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10184;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10186;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10188;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10190;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10192;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10194;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10196;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10198;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10200;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10202;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10204;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10206;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10208;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10210;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10212;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10214;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10216;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10218;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10220;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10222;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10224;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10226;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10228;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10230;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10232;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10234;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10236;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10238;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10240;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10242;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10244;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10246;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10248;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10250;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10252;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 11037;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 11038;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 11041;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 11042;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 11045;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 11046;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 11049;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 11050;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 11053;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 11054;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 11057;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 11058;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 11061;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 11062;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 11065;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 11066;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 11069;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 11070;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 11073;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 11074;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 11077;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 11078;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 11081;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 11082;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 11085;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 11086;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 11089;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 11090;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 11093;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 11094;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 11097;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 11098;\n\t\t\tcase Dirt::Dirt().ID: return 10;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, true).ID: return 233;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, false).ID: return 234;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, true).ID: return 235;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, false).ID: return 236;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, true).ID: return 237;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, false).ID: return 238;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, true).ID: return 239;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, false).ID: return 240;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, true).ID: return 241;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, false).ID: return 242;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, true).ID: return 243;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, false).ID: return 244;\n\t\t\tcase DragonEgg::DragonEgg().ID: return 5139;\n\t\t\tcase DragonHead::DragonHead(0).ID: return 6054;\n\t\t\tcase DragonHead::DragonHead(1).ID: return 6055;\n\t\t\tcase DragonHead::DragonHead(2).ID: return 6056;\n\t\t\tcase DragonHead::DragonHead(3).ID: return 6057;\n\t\t\tcase DragonHead::DragonHead(4).ID: return 6058;\n\t\t\tcase DragonHead::DragonHead(5).ID: return 6059;\n\t\t\tcase DragonHead::DragonHead(6).ID: return 6060;\n\t\t\tcase DragonHead::DragonHead(7).ID: return 6061;\n\t\t\tcase DragonHead::DragonHead(8).ID: return 6062;\n\t\t\tcase DragonHead::DragonHead(9).ID: return 6063;\n\t\t\tcase DragonHead::DragonHead(10).ID: return 6064;\n\t\t\tcase DragonHead::DragonHead(11).ID: return 6065;\n\t\t\tcase DragonHead::DragonHead(12).ID: return 6066;\n\t\t\tcase DragonHead::DragonHead(13).ID: return 6067;\n\t\t\tcase DragonHead::DragonHead(14).ID: return 6068;\n\t\t\tcase DragonHead::DragonHead(15).ID: return 6069;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6070;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6071;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6072;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6073;\n\t\t\tcase DriedKelpBlock::DriedKelpBlock().ID: return 8961;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, true).ID: return 6299;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, false).ID: return 6300;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, true).ID: return 6301;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, false).ID: return 6302;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, true).ID: return 6303;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, false).ID: return 6304;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, true).ID: return 6305;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, false).ID: return 6306;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, true).ID: return 6307;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, false).ID: return 6308;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, true).ID: return 6309;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, false).ID: return 6310;\n\t\t\tcase EmeraldBlock::EmeraldBlock().ID: return 5387;\n\t\t\tcase EmeraldOre::EmeraldOre().ID: return 5234;\n\t\t\tcase EnchantingTable::EnchantingTable().ID: return 5116;\n\t\t\tcase EndGateway::EndGateway().ID: return 8688;\n\t\t\tcase EndPortal::EndPortal().ID: return 5129;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5130;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5131;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XM).ID: return 5132;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XP).ID: return 5133;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5134;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5135;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XM).ID: return 5136;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XP).ID: return 5137;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZM).ID: return 8522;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XP).ID: return 8523;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZP).ID: return 8524;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XM).ID: return 8525;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YP).ID: return 8526;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YM).ID: return 8527;\n\t\t\tcase EndStone::EndStone().ID: return 5138;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Top).ID: return 10284;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Bottom).ID: return 10286;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Double).ID: return 10288;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 9534;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9536;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 9538;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9540;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 9542;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 9544;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9546;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 9548;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9550;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 9552;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 9554;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9556;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 9558;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9560;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 9562;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 9564;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9566;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 9568;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9570;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 9572;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 9574;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9576;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 9578;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9580;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 9582;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 9584;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9586;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 9588;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9590;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 9592;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 9594;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9596;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 9598;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9600;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 9602;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 9604;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 9606;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 9608;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 9610;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 9612;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 10973;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 10974;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 10977;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 10978;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 10981;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 10982;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 10985;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 10986;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 10989;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 10990;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 10993;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 10994;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 10997;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 10998;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 11001;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 11002;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 11005;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 11006;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 11009;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 11010;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 11013;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 11014;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 11017;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 11018;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 11021;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 11022;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 11025;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 11026;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 11029;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 11030;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 11033;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 11034;\n\t\t\tcase EndStoneBricks::EndStoneBricks().ID: return 8682;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZM).ID: return 5236;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZP).ID: return 5238;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XM).ID: return 5240;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XP).ID: return 5242;\n\t\t\tcase Farmland::Farmland(0).ID: return 3363;\n\t\t\tcase Farmland::Farmland(1).ID: return 3364;\n\t\t\tcase Farmland::Farmland(2).ID: return 3365;\n\t\t\tcase Farmland::Farmland(3).ID: return 3366;\n\t\t\tcase Farmland::Farmland(4).ID: return 3367;\n\t\t\tcase Farmland::Farmland(5).ID: return 3368;\n\t\t\tcase Farmland::Farmland(6).ID: return 3369;\n\t\t\tcase Farmland::Farmland(7).ID: return 3370;\n\t\t\tcase Fern::Fern().ID: return 1342;\n\t\t\tcase Fire::Fire(0, true, true, true, true, true).ID: return 1439;\n\t\t\tcase Fire::Fire(0, true, true, true, true, false).ID: return 1440;\n\t\t\tcase Fire::Fire(0, true, true, true, false, true).ID: return 1441;\n\t\t\tcase Fire::Fire(0, true, true, true, false, false).ID: return 1442;\n\t\t\tcase Fire::Fire(0, true, true, false, true, true).ID: return 1443;\n\t\t\tcase Fire::Fire(0, true, true, false, true, false).ID: return 1444;\n\t\t\tcase Fire::Fire(0, true, true, false, false, true).ID: return 1445;\n\t\t\tcase Fire::Fire(0, true, true, false, false, false).ID: return 1446;\n\t\t\tcase Fire::Fire(0, true, false, true, true, true).ID: return 1447;\n\t\t\tcase Fire::Fire(0, true, false, true, true, false).ID: return 1448;\n\t\t\tcase Fire::Fire(0, true, false, true, false, true).ID: return 1449;\n\t\t\tcase Fire::Fire(0, true, false, true, false, false).ID: return 1450;\n\t\t\tcase Fire::Fire(0, true, false, false, true, true).ID: return 1451;\n\t\t\tcase Fire::Fire(0, true, false, false, true, false).ID: return 1452;\n\t\t\tcase Fire::Fire(0, true, false, false, false, true).ID: return 1453;\n\t\t\tcase Fire::Fire(0, true, false, false, false, false).ID: return 1454;\n\t\t\tcase Fire::Fire(0, false, true, true, true, true).ID: return 1455;\n\t\t\tcase Fire::Fire(0, false, true, true, true, false).ID: return 1456;\n\t\t\tcase Fire::Fire(0, false, true, true, false, true).ID: return 1457;\n\t\t\tcase Fire::Fire(0, false, true, true, false, false).ID: return 1458;\n\t\t\tcase Fire::Fire(0, false, true, false, true, true).ID: return 1459;\n\t\t\tcase Fire::Fire(0, false, true, false, true, false).ID: return 1460;\n\t\t\tcase Fire::Fire(0, false, true, false, false, true).ID: return 1461;\n\t\t\tcase Fire::Fire(0, false, true, false, false, false).ID: return 1462;\n\t\t\tcase Fire::Fire(0, false, false, true, true, true).ID: return 1463;\n\t\t\tcase Fire::Fire(0, false, false, true, true, false).ID: return 1464;\n\t\t\tcase Fire::Fire(0, false, false, true, false, true).ID: return 1465;\n\t\t\tcase Fire::Fire(0, false, false, true, false, false).ID: return 1466;\n\t\t\tcase Fire::Fire(0, false, false, false, true, true).ID: return 1467;\n\t\t\tcase Fire::Fire(0, false, false, false, true, false).ID: return 1468;\n\t\t\tcase Fire::Fire(0, false, false, false, false, true).ID: return 1469;\n\t\t\tcase Fire::Fire(0, false, false, false, false, false).ID: return 1470;\n\t\t\tcase Fire::Fire(1, true, true, true, true, true).ID: return 1471;\n\t\t\tcase Fire::Fire(1, true, true, true, true, false).ID: return 1472;\n\t\t\tcase Fire::Fire(1, true, true, true, false, true).ID: return 1473;\n\t\t\tcase Fire::Fire(1, true, true, true, false, false).ID: return 1474;\n\t\t\tcase Fire::Fire(1, true, true, false, true, true).ID: return 1475;\n\t\t\tcase Fire::Fire(1, true, true, false, true, false).ID: return 1476;\n\t\t\tcase Fire::Fire(1, true, true, false, false, true).ID: return 1477;\n\t\t\tcase Fire::Fire(1, true, true, false, false, false).ID: return 1478;\n\t\t\tcase Fire::Fire(1, true, false, true, true, true).ID: return 1479;\n\t\t\tcase Fire::Fire(1, true, false, true, true, false).ID: return 1480;\n\t\t\tcase Fire::Fire(1, true, false, true, false, true).ID: return 1481;\n\t\t\tcase Fire::Fire(1, true, false, true, false, false).ID: return 1482;\n\t\t\tcase Fire::Fire(1, true, false, false, true, true).ID: return 1483;\n\t\t\tcase Fire::Fire(1, true, false, false, true, false).ID: return 1484;\n\t\t\tcase Fire::Fire(1, true, false, false, false, true).ID: return 1485;\n\t\t\tcase Fire::Fire(1, true, false, false, false, false).ID: return 1486;\n\t\t\tcase Fire::Fire(1, false, true, true, true, true).ID: return 1487;\n\t\t\tcase Fire::Fire(1, false, true, true, true, false).ID: return 1488;\n\t\t\tcase Fire::Fire(1, false, true, true, false, true).ID: return 1489;\n\t\t\tcase Fire::Fire(1, false, true, true, false, false).ID: return 1490;\n\t\t\tcase Fire::Fire(1, false, true, false, true, true).ID: return 1491;\n\t\t\tcase Fire::Fire(1, false, true, false, true, false).ID: return 1492;\n\t\t\tcase Fire::Fire(1, false, true, false, false, true).ID: return 1493;\n\t\t\tcase Fire::Fire(1, false, true, false, false, false).ID: return 1494;\n\t\t\tcase Fire::Fire(1, false, false, true, true, true).ID: return 1495;\n\t\t\tcase Fire::Fire(1, false, false, true, true, false).ID: return 1496;\n\t\t\tcase Fire::Fire(1, false, false, true, false, true).ID: return 1497;\n\t\t\tcase Fire::Fire(1, false, false, true, false, false).ID: return 1498;\n\t\t\tcase Fire::Fire(1, false, false, false, true, true).ID: return 1499;\n\t\t\tcase Fire::Fire(1, false, false, false, true, false).ID: return 1500;\n\t\t\tcase Fire::Fire(1, false, false, false, false, true).ID: return 1501;\n\t\t\tcase Fire::Fire(1, false, false, false, false, false).ID: return 1502;\n\t\t\tcase Fire::Fire(2, true, true, true, true, true).ID: return 1503;\n\t\t\tcase Fire::Fire(2, true, true, true, true, false).ID: return 1504;\n\t\t\tcase Fire::Fire(2, true, true, true, false, true).ID: return 1505;\n\t\t\tcase Fire::Fire(2, true, true, true, false, false).ID: return 1506;\n\t\t\tcase Fire::Fire(2, true, true, false, true, true).ID: return 1507;\n\t\t\tcase Fire::Fire(2, true, true, false, true, false).ID: return 1508;\n\t\t\tcase Fire::Fire(2, true, true, false, false, true).ID: return 1509;\n\t\t\tcase Fire::Fire(2, true, true, false, false, false).ID: return 1510;\n\t\t\tcase Fire::Fire(2, true, false, true, true, true).ID: return 1511;\n\t\t\tcase Fire::Fire(2, true, false, true, true, false).ID: return 1512;\n\t\t\tcase Fire::Fire(2, true, false, true, false, true).ID: return 1513;\n\t\t\tcase Fire::Fire(2, true, false, true, false, false).ID: return 1514;\n\t\t\tcase Fire::Fire(2, true, false, false, true, true).ID: return 1515;\n\t\t\tcase Fire::Fire(2, true, false, false, true, false).ID: return 1516;\n\t\t\tcase Fire::Fire(2, true, false, false, false, true).ID: return 1517;\n\t\t\tcase Fire::Fire(2, true, false, false, false, false).ID: return 1518;\n\t\t\tcase Fire::Fire(2, false, true, true, true, true).ID: return 1519;\n\t\t\tcase Fire::Fire(2, false, true, true, true, false).ID: return 1520;\n\t\t\tcase Fire::Fire(2, false, true, true, false, true).ID: return 1521;\n\t\t\tcase Fire::Fire(2, false, true, true, false, false).ID: return 1522;\n\t\t\tcase Fire::Fire(2, false, true, false, true, true).ID: return 1523;\n\t\t\tcase Fire::Fire(2, false, true, false, true, false).ID: return 1524;\n\t\t\tcase Fire::Fire(2, false, true, false, false, true).ID: return 1525;\n\t\t\tcase Fire::Fire(2, false, true, false, false, false).ID: return 1526;\n\t\t\tcase Fire::Fire(2, false, false, true, true, true).ID: return 1527;\n\t\t\tcase Fire::Fire(2, false, false, true, true, false).ID: return 1528;\n\t\t\tcase Fire::Fire(2, false, false, true, false, true).ID: return 1529;\n\t\t\tcase Fire::Fire(2, false, false, true, false, false).ID: return 1530;\n\t\t\tcase Fire::Fire(2, false, false, false, true, true).ID: return 1531;\n\t\t\tcase Fire::Fire(2, false, false, false, true, false).ID: return 1532;\n\t\t\tcase Fire::Fire(2, false, false, false, false, true).ID: return 1533;\n\t\t\tcase Fire::Fire(2, false, false, false, false, false).ID: return 1534;\n\t\t\tcase Fire::Fire(3, true, true, true, true, true).ID: return 1535;\n\t\t\tcase Fire::Fire(3, true, true, true, true, false).ID: return 1536;\n\t\t\tcase Fire::Fire(3, true, true, true, false, true).ID: return 1537;\n\t\t\tcase Fire::Fire(3, true, true, true, false, false).ID: return 1538;\n\t\t\tcase Fire::Fire(3, true, true, false, true, true).ID: return 1539;\n\t\t\tcase Fire::Fire(3, true, true, false, true, false).ID: return 1540;\n\t\t\tcase Fire::Fire(3, true, true, false, false, true).ID: return 1541;\n\t\t\tcase Fire::Fire(3, true, true, false, false, false).ID: return 1542;\n\t\t\tcase Fire::Fire(3, true, false, true, true, true).ID: return 1543;\n\t\t\tcase Fire::Fire(3, true, false, true, true, false).ID: return 1544;\n\t\t\tcase Fire::Fire(3, true, false, true, false, true).ID: return 1545;\n\t\t\tcase Fire::Fire(3, true, false, true, false, false).ID: return 1546;\n\t\t\tcase Fire::Fire(3, true, false, false, true, true).ID: return 1547;\n\t\t\tcase Fire::Fire(3, true, false, false, true, false).ID: return 1548;\n\t\t\tcase Fire::Fire(3, true, false, false, false, true).ID: return 1549;\n\t\t\tcase Fire::Fire(3, true, false, false, false, false).ID: return 1550;\n\t\t\tcase Fire::Fire(3, false, true, true, true, true).ID: return 1551;\n\t\t\tcase Fire::Fire(3, false, true, true, true, false).ID: return 1552;\n\t\t\tcase Fire::Fire(3, false, true, true, false, true).ID: return 1553;\n\t\t\tcase Fire::Fire(3, false, true, true, false, false).ID: return 1554;\n\t\t\tcase Fire::Fire(3, false, true, false, true, true).ID: return 1555;\n\t\t\tcase Fire::Fire(3, false, true, false, true, false).ID: return 1556;\n\t\t\tcase Fire::Fire(3, false, true, false, false, true).ID: return 1557;\n\t\t\tcase Fire::Fire(3, false, true, false, false, false).ID: return 1558;\n\t\t\tcase Fire::Fire(3, false, false, true, true, true).ID: return 1559;\n\t\t\tcase Fire::Fire(3, false, false, true, true, false).ID: return 1560;\n\t\t\tcase Fire::Fire(3, false, false, true, false, true).ID: return 1561;\n\t\t\tcase Fire::Fire(3, false, false, true, false, false).ID: return 1562;\n\t\t\tcase Fire::Fire(3, false, false, false, true, true).ID: return 1563;\n\t\t\tcase Fire::Fire(3, false, false, false, true, false).ID: return 1564;\n\t\t\tcase Fire::Fire(3, false, false, false, false, true).ID: return 1565;\n\t\t\tcase Fire::Fire(3, false, false, false, false, false).ID: return 1566;\n\t\t\tcase Fire::Fire(4, true, true, true, true, true).ID: return 1567;\n\t\t\tcase Fire::Fire(4, true, true, true, true, false).ID: return 1568;\n\t\t\tcase Fire::Fire(4, true, true, true, false, true).ID: return 1569;\n\t\t\tcase Fire::Fire(4, true, true, true, false, false).ID: return 1570;\n\t\t\tcase Fire::Fire(4, true, true, false, true, true).ID: return 1571;\n\t\t\tcase Fire::Fire(4, true, true, false, true, false).ID: return 1572;\n\t\t\tcase Fire::Fire(4, true, true, false, false, true).ID: return 1573;\n\t\t\tcase Fire::Fire(4, true, true, false, false, false).ID: return 1574;\n\t\t\tcase Fire::Fire(4, true, false, true, true, true).ID: return 1575;\n\t\t\tcase Fire::Fire(4, true, false, true, true, false).ID: return 1576;\n\t\t\tcase Fire::Fire(4, true, false, true, false, true).ID: return 1577;\n\t\t\tcase Fire::Fire(4, true, false, true, false, false).ID: return 1578;\n\t\t\tcase Fire::Fire(4, true, false, false, true, true).ID: return 1579;\n\t\t\tcase Fire::Fire(4, true, false, false, true, false).ID: return 1580;\n\t\t\tcase Fire::Fire(4, true, false, false, false, true).ID: return 1581;\n\t\t\tcase Fire::Fire(4, true, false, false, false, false).ID: return 1582;\n\t\t\tcase Fire::Fire(4, false, true, true, true, true).ID: return 1583;\n\t\t\tcase Fire::Fire(4, false, true, true, true, false).ID: return 1584;\n\t\t\tcase Fire::Fire(4, false, true, true, false, true).ID: return 1585;\n\t\t\tcase Fire::Fire(4, false, true, true, false, false).ID: return 1586;\n\t\t\tcase Fire::Fire(4, false, true, false, true, true).ID: return 1587;\n\t\t\tcase Fire::Fire(4, false, true, false, true, false).ID: return 1588;\n\t\t\tcase Fire::Fire(4, false, true, false, false, true).ID: return 1589;\n\t\t\tcase Fire::Fire(4, false, true, false, false, false).ID: return 1590;\n\t\t\tcase Fire::Fire(4, false, false, true, true, true).ID: return 1591;\n\t\t\tcase Fire::Fire(4, false, false, true, true, false).ID: return 1592;\n\t\t\tcase Fire::Fire(4, false, false, true, false, true).ID: return 1593;\n\t\t\tcase Fire::Fire(4, false, false, true, false, false).ID: return 1594;\n\t\t\tcase Fire::Fire(4, false, false, false, true, true).ID: return 1595;\n\t\t\tcase Fire::Fire(4, false, false, false, true, false).ID: return 1596;\n\t\t\tcase Fire::Fire(4, false, false, false, false, true).ID: return 1597;\n\t\t\tcase Fire::Fire(4, false, false, false, false, false).ID: return 1598;\n\t\t\tcase Fire::Fire(5, true, true, true, true, true).ID: return 1599;\n\t\t\tcase Fire::Fire(5, true, true, true, true, false).ID: return 1600;\n\t\t\tcase Fire::Fire(5, true, true, true, false, true).ID: return 1601;\n\t\t\tcase Fire::Fire(5, true, true, true, false, false).ID: return 1602;\n\t\t\tcase Fire::Fire(5, true, true, false, true, true).ID: return 1603;\n\t\t\tcase Fire::Fire(5, true, true, false, true, false).ID: return 1604;\n\t\t\tcase Fire::Fire(5, true, true, false, false, true).ID: return 1605;\n\t\t\tcase Fire::Fire(5, true, true, false, false, false).ID: return 1606;\n\t\t\tcase Fire::Fire(5, true, false, true, true, true).ID: return 1607;\n\t\t\tcase Fire::Fire(5, true, false, true, true, false).ID: return 1608;\n\t\t\tcase Fire::Fire(5, true, false, true, false, true).ID: return 1609;\n\t\t\tcase Fire::Fire(5, true, false, true, false, false).ID: return 1610;\n\t\t\tcase Fire::Fire(5, true, false, false, true, true).ID: return 1611;\n\t\t\tcase Fire::Fire(5, true, false, false, true, false).ID: return 1612;\n\t\t\tcase Fire::Fire(5, true, false, false, false, true).ID: return 1613;\n\t\t\tcase Fire::Fire(5, true, false, false, false, false).ID: return 1614;\n\t\t\tcase Fire::Fire(5, false, true, true, true, true).ID: return 1615;\n\t\t\tcase Fire::Fire(5, false, true, true, true, false).ID: return 1616;\n\t\t\tcase Fire::Fire(5, false, true, true, false, true).ID: return 1617;\n\t\t\tcase Fire::Fire(5, false, true, true, false, false).ID: return 1618;\n\t\t\tcase Fire::Fire(5, false, true, false, true, true).ID: return 1619;\n\t\t\tcase Fire::Fire(5, false, true, false, true, false).ID: return 1620;\n\t\t\tcase Fire::Fire(5, false, true, false, false, true).ID: return 1621;\n\t\t\tcase Fire::Fire(5, false, true, false, false, false).ID: return 1622;\n\t\t\tcase Fire::Fire(5, false, false, true, true, true).ID: return 1623;\n\t\t\tcase Fire::Fire(5, false, false, true, true, false).ID: return 1624;\n\t\t\tcase Fire::Fire(5, false, false, true, false, true).ID: return 1625;\n\t\t\tcase Fire::Fire(5, false, false, true, false, false).ID: return 1626;\n\t\t\tcase Fire::Fire(5, false, false, false, true, true).ID: return 1627;\n\t\t\tcase Fire::Fire(5, false, false, false, true, false).ID: return 1628;\n\t\t\tcase Fire::Fire(5, false, false, false, false, true).ID: return 1629;\n\t\t\tcase Fire::Fire(5, false, false, false, false, false).ID: return 1630;\n\t\t\tcase Fire::Fire(6, true, true, true, true, true).ID: return 1631;\n\t\t\tcase Fire::Fire(6, true, true, true, true, false).ID: return 1632;\n\t\t\tcase Fire::Fire(6, true, true, true, false, true).ID: return 1633;\n\t\t\tcase Fire::Fire(6, true, true, true, false, false).ID: return 1634;\n\t\t\tcase Fire::Fire(6, true, true, false, true, true).ID: return 1635;\n\t\t\tcase Fire::Fire(6, true, true, false, true, false).ID: return 1636;\n\t\t\tcase Fire::Fire(6, true, true, false, false, true).ID: return 1637;\n\t\t\tcase Fire::Fire(6, true, true, false, false, false).ID: return 1638;\n\t\t\tcase Fire::Fire(6, true, false, true, true, true).ID: return 1639;\n\t\t\tcase Fire::Fire(6, true, false, true, true, false).ID: return 1640;\n\t\t\tcase Fire::Fire(6, true, false, true, false, true).ID: return 1641;\n\t\t\tcase Fire::Fire(6, true, false, true, false, false).ID: return 1642;\n\t\t\tcase Fire::Fire(6, true, false, false, true, true).ID: return 1643;\n\t\t\tcase Fire::Fire(6, true, false, false, true, false).ID: return 1644;\n\t\t\tcase Fire::Fire(6, true, false, false, false, true).ID: return 1645;\n\t\t\tcase Fire::Fire(6, true, false, false, false, false).ID: return 1646;\n\t\t\tcase Fire::Fire(6, false, true, true, true, true).ID: return 1647;\n\t\t\tcase Fire::Fire(6, false, true, true, true, false).ID: return 1648;\n\t\t\tcase Fire::Fire(6, false, true, true, false, true).ID: return 1649;\n\t\t\tcase Fire::Fire(6, false, true, true, false, false).ID: return 1650;\n\t\t\tcase Fire::Fire(6, false, true, false, true, true).ID: return 1651;\n\t\t\tcase Fire::Fire(6, false, true, false, true, false).ID: return 1652;\n\t\t\tcase Fire::Fire(6, false, true, false, false, true).ID: return 1653;\n\t\t\tcase Fire::Fire(6, false, true, false, false, false).ID: return 1654;\n\t\t\tcase Fire::Fire(6, false, false, true, true, true).ID: return 1655;\n\t\t\tcase Fire::Fire(6, false, false, true, true, false).ID: return 1656;\n\t\t\tcase Fire::Fire(6, false, false, true, false, true).ID: return 1657;\n\t\t\tcase Fire::Fire(6, false, false, true, false, false).ID: return 1658;\n\t\t\tcase Fire::Fire(6, false, false, false, true, true).ID: return 1659;\n\t\t\tcase Fire::Fire(6, false, false, false, true, false).ID: return 1660;\n\t\t\tcase Fire::Fire(6, false, false, false, false, true).ID: return 1661;\n\t\t\tcase Fire::Fire(6, false, false, false, false, false).ID: return 1662;\n\t\t\tcase Fire::Fire(7, true, true, true, true, true).ID: return 1663;\n\t\t\tcase Fire::Fire(7, true, true, true, true, false).ID: return 1664;\n\t\t\tcase Fire::Fire(7, true, true, true, false, true).ID: return 1665;\n\t\t\tcase Fire::Fire(7, true, true, true, false, false).ID: return 1666;\n\t\t\tcase Fire::Fire(7, true, true, false, true, true).ID: return 1667;\n\t\t\tcase Fire::Fire(7, true, true, false, true, false).ID: return 1668;\n\t\t\tcase Fire::Fire(7, true, true, false, false, true).ID: return 1669;\n\t\t\tcase Fire::Fire(7, true, true, false, false, false).ID: return 1670;\n\t\t\tcase Fire::Fire(7, true, false, true, true, true).ID: return 1671;\n\t\t\tcase Fire::Fire(7, true, false, true, true, false).ID: return 1672;\n\t\t\tcase Fire::Fire(7, true, false, true, false, true).ID: return 1673;\n\t\t\tcase Fire::Fire(7, true, false, true, false, false).ID: return 1674;\n\t\t\tcase Fire::Fire(7, true, false, false, true, true).ID: return 1675;\n\t\t\tcase Fire::Fire(7, true, false, false, true, false).ID: return 1676;\n\t\t\tcase Fire::Fire(7, true, false, false, false, true).ID: return 1677;\n\t\t\tcase Fire::Fire(7, true, false, false, false, false).ID: return 1678;\n\t\t\tcase Fire::Fire(7, false, true, true, true, true).ID: return 1679;\n\t\t\tcase Fire::Fire(7, false, true, true, true, false).ID: return 1680;\n\t\t\tcase Fire::Fire(7, false, true, true, false, true).ID: return 1681;\n\t\t\tcase Fire::Fire(7, false, true, true, false, false).ID: return 1682;\n\t\t\tcase Fire::Fire(7, false, true, false, true, true).ID: return 1683;\n\t\t\tcase Fire::Fire(7, false, true, false, true, false).ID: return 1684;\n\t\t\tcase Fire::Fire(7, false, true, false, false, true).ID: return 1685;\n\t\t\tcase Fire::Fire(7, false, true, false, false, false).ID: return 1686;\n\t\t\tcase Fire::Fire(7, false, false, true, true, true).ID: return 1687;\n\t\t\tcase Fire::Fire(7, false, false, true, true, false).ID: return 1688;\n\t\t\tcase Fire::Fire(7, false, false, true, false, true).ID: return 1689;\n\t\t\tcase Fire::Fire(7, false, false, true, false, false).ID: return 1690;\n\t\t\tcase Fire::Fire(7, false, false, false, true, true).ID: return 1691;\n\t\t\tcase Fire::Fire(7, false, false, false, true, false).ID: return 1692;\n\t\t\tcase Fire::Fire(7, false, false, false, false, true).ID: return 1693;\n\t\t\tcase Fire::Fire(7, false, false, false, false, false).ID: return 1694;\n\t\t\tcase Fire::Fire(8, true, true, true, true, true).ID: return 1695;\n\t\t\tcase Fire::Fire(8, true, true, true, true, false).ID: return 1696;\n\t\t\tcase Fire::Fire(8, true, true, true, false, true).ID: return 1697;\n\t\t\tcase Fire::Fire(8, true, true, true, false, false).ID: return 1698;\n\t\t\tcase Fire::Fire(8, true, true, false, true, true).ID: return 1699;\n\t\t\tcase Fire::Fire(8, true, true, false, true, false).ID: return 1700;\n\t\t\tcase Fire::Fire(8, true, true, false, false, true).ID: return 1701;\n\t\t\tcase Fire::Fire(8, true, true, false, false, false).ID: return 1702;\n\t\t\tcase Fire::Fire(8, true, false, true, true, true).ID: return 1703;\n\t\t\tcase Fire::Fire(8, true, false, true, true, false).ID: return 1704;\n\t\t\tcase Fire::Fire(8, true, false, true, false, true).ID: return 1705;\n\t\t\tcase Fire::Fire(8, true, false, true, false, false).ID: return 1706;\n\t\t\tcase Fire::Fire(8, true, false, false, true, true).ID: return 1707;\n\t\t\tcase Fire::Fire(8, true, false, false, true, false).ID: return 1708;\n\t\t\tcase Fire::Fire(8, true, false, false, false, true).ID: return 1709;\n\t\t\tcase Fire::Fire(8, true, false, false, false, false).ID: return 1710;\n\t\t\tcase Fire::Fire(8, false, true, true, true, true).ID: return 1711;\n\t\t\tcase Fire::Fire(8, false, true, true, true, false).ID: return 1712;\n\t\t\tcase Fire::Fire(8, false, true, true, false, true).ID: return 1713;\n\t\t\tcase Fire::Fire(8, false, true, true, false, false).ID: return 1714;\n\t\t\tcase Fire::Fire(8, false, true, false, true, true).ID: return 1715;\n\t\t\tcase Fire::Fire(8, false, true, false, true, false).ID: return 1716;\n\t\t\tcase Fire::Fire(8, false, true, false, false, true).ID: return 1717;\n\t\t\tcase Fire::Fire(8, false, true, false, false, false).ID: return 1718;\n\t\t\tcase Fire::Fire(8, false, false, true, true, true).ID: return 1719;\n\t\t\tcase Fire::Fire(8, false, false, true, true, false).ID: return 1720;\n\t\t\tcase Fire::Fire(8, false, false, true, false, true).ID: return 1721;\n\t\t\tcase Fire::Fire(8, false, false, true, false, false).ID: return 1722;\n\t\t\tcase Fire::Fire(8, false, false, false, true, true).ID: return 1723;\n\t\t\tcase Fire::Fire(8, false, false, false, true, false).ID: return 1724;\n\t\t\tcase Fire::Fire(8, false, false, false, false, true).ID: return 1725;\n\t\t\tcase Fire::Fire(8, false, false, false, false, false).ID: return 1726;\n\t\t\tcase Fire::Fire(9, true, true, true, true, true).ID: return 1727;\n\t\t\tcase Fire::Fire(9, true, true, true, true, false).ID: return 1728;\n\t\t\tcase Fire::Fire(9, true, true, true, false, true).ID: return 1729;\n\t\t\tcase Fire::Fire(9, true, true, true, false, false).ID: return 1730;\n\t\t\tcase Fire::Fire(9, true, true, false, true, true).ID: return 1731;\n\t\t\tcase Fire::Fire(9, true, true, false, true, false).ID: return 1732;\n\t\t\tcase Fire::Fire(9, true, true, false, false, true).ID: return 1733;\n\t\t\tcase Fire::Fire(9, true, true, false, false, false).ID: return 1734;\n\t\t\tcase Fire::Fire(9, true, false, true, true, true).ID: return 1735;\n\t\t\tcase Fire::Fire(9, true, false, true, true, false).ID: return 1736;\n\t\t\tcase Fire::Fire(9, true, false, true, false, true).ID: return 1737;\n\t\t\tcase Fire::Fire(9, true, false, true, false, false).ID: return 1738;\n\t\t\tcase Fire::Fire(9, true, false, false, true, true).ID: return 1739;\n\t\t\tcase Fire::Fire(9, true, false, false, true, false).ID: return 1740;\n\t\t\tcase Fire::Fire(9, true, false, false, false, true).ID: return 1741;\n\t\t\tcase Fire::Fire(9, true, false, false, false, false).ID: return 1742;\n\t\t\tcase Fire::Fire(9, false, true, true, true, true).ID: return 1743;\n\t\t\tcase Fire::Fire(9, false, true, true, true, false).ID: return 1744;\n\t\t\tcase Fire::Fire(9, false, true, true, false, true).ID: return 1745;\n\t\t\tcase Fire::Fire(9, false, true, true, false, false).ID: return 1746;\n\t\t\tcase Fire::Fire(9, false, true, false, true, true).ID: return 1747;\n\t\t\tcase Fire::Fire(9, false, true, false, true, false).ID: return 1748;\n\t\t\tcase Fire::Fire(9, false, true, false, false, true).ID: return 1749;\n\t\t\tcase Fire::Fire(9, false, true, false, false, false).ID: return 1750;\n\t\t\tcase Fire::Fire(9, false, false, true, true, true).ID: return 1751;\n\t\t\tcase Fire::Fire(9, false, false, true, true, false).ID: return 1752;\n\t\t\tcase Fire::Fire(9, false, false, true, false, true).ID: return 1753;\n\t\t\tcase Fire::Fire(9, false, false, true, false, false).ID: return 1754;\n\t\t\tcase Fire::Fire(9, false, false, false, true, true).ID: return 1755;\n\t\t\tcase Fire::Fire(9, false, false, false, true, false).ID: return 1756;\n\t\t\tcase Fire::Fire(9, false, false, false, false, true).ID: return 1757;\n\t\t\tcase Fire::Fire(9, false, false, false, false, false).ID: return 1758;\n\t\t\tcase Fire::Fire(10, true, true, true, true, true).ID: return 1759;\n\t\t\tcase Fire::Fire(10, true, true, true, true, false).ID: return 1760;\n\t\t\tcase Fire::Fire(10, true, true, true, false, true).ID: return 1761;\n\t\t\tcase Fire::Fire(10, true, true, true, false, false).ID: return 1762;\n\t\t\tcase Fire::Fire(10, true, true, false, true, true).ID: return 1763;\n\t\t\tcase Fire::Fire(10, true, true, false, true, false).ID: return 1764;\n\t\t\tcase Fire::Fire(10, true, true, false, false, true).ID: return 1765;\n\t\t\tcase Fire::Fire(10, true, true, false, false, false).ID: return 1766;\n\t\t\tcase Fire::Fire(10, true, false, true, true, true).ID: return 1767;\n\t\t\tcase Fire::Fire(10, true, false, true, true, false).ID: return 1768;\n\t\t\tcase Fire::Fire(10, true, false, true, false, true).ID: return 1769;\n\t\t\tcase Fire::Fire(10, true, false, true, false, false).ID: return 1770;\n\t\t\tcase Fire::Fire(10, true, false, false, true, true).ID: return 1771;\n\t\t\tcase Fire::Fire(10, true, false, false, true, false).ID: return 1772;\n\t\t\tcase Fire::Fire(10, true, false, false, false, true).ID: return 1773;\n\t\t\tcase Fire::Fire(10, true, false, false, false, false).ID: return 1774;\n\t\t\tcase Fire::Fire(10, false, true, true, true, true).ID: return 1775;\n\t\t\tcase Fire::Fire(10, false, true, true, true, false).ID: return 1776;\n\t\t\tcase Fire::Fire(10, false, true, true, false, true).ID: return 1777;\n\t\t\tcase Fire::Fire(10, false, true, true, false, false).ID: return 1778;\n\t\t\tcase Fire::Fire(10, false, true, false, true, true).ID: return 1779;\n\t\t\tcase Fire::Fire(10, false, true, false, true, false).ID: return 1780;\n\t\t\tcase Fire::Fire(10, false, true, false, false, true).ID: return 1781;\n\t\t\tcase Fire::Fire(10, false, true, false, false, false).ID: return 1782;\n\t\t\tcase Fire::Fire(10, false, false, true, true, true).ID: return 1783;\n\t\t\tcase Fire::Fire(10, false, false, true, true, false).ID: return 1784;\n\t\t\tcase Fire::Fire(10, false, false, true, false, true).ID: return 1785;\n\t\t\tcase Fire::Fire(10, false, false, true, false, false).ID: return 1786;\n\t\t\tcase Fire::Fire(10, false, false, false, true, true).ID: return 1787;\n\t\t\tcase Fire::Fire(10, false, false, false, true, false).ID: return 1788;\n\t\t\tcase Fire::Fire(10, false, false, false, false, true).ID: return 1789;\n\t\t\tcase Fire::Fire(10, false, false, false, false, false).ID: return 1790;\n\t\t\tcase Fire::Fire(11, true, true, true, true, true).ID: return 1791;\n\t\t\tcase Fire::Fire(11, true, true, true, true, false).ID: return 1792;\n\t\t\tcase Fire::Fire(11, true, true, true, false, true).ID: return 1793;\n\t\t\tcase Fire::Fire(11, true, true, true, false, false).ID: return 1794;\n\t\t\tcase Fire::Fire(11, true, true, false, true, true).ID: return 1795;\n\t\t\tcase Fire::Fire(11, true, true, false, true, false).ID: return 1796;\n\t\t\tcase Fire::Fire(11, true, true, false, false, true).ID: return 1797;\n\t\t\tcase Fire::Fire(11, true, true, false, false, false).ID: return 1798;\n\t\t\tcase Fire::Fire(11, true, false, true, true, true).ID: return 1799;\n\t\t\tcase Fire::Fire(11, true, false, true, true, false).ID: return 1800;\n\t\t\tcase Fire::Fire(11, true, false, true, false, true).ID: return 1801;\n\t\t\tcase Fire::Fire(11, true, false, true, false, false).ID: return 1802;\n\t\t\tcase Fire::Fire(11, true, false, false, true, true).ID: return 1803;\n\t\t\tcase Fire::Fire(11, true, false, false, true, false).ID: return 1804;\n\t\t\tcase Fire::Fire(11, true, false, false, false, true).ID: return 1805;\n\t\t\tcase Fire::Fire(11, true, false, false, false, false).ID: return 1806;\n\t\t\tcase Fire::Fire(11, false, true, true, true, true).ID: return 1807;\n\t\t\tcase Fire::Fire(11, false, true, true, true, false).ID: return 1808;\n\t\t\tcase Fire::Fire(11, false, true, true, false, true).ID: return 1809;\n\t\t\tcase Fire::Fire(11, false, true, true, false, false).ID: return 1810;\n\t\t\tcase Fire::Fire(11, false, true, false, true, true).ID: return 1811;\n\t\t\tcase Fire::Fire(11, false, true, false, true, false).ID: return 1812;\n\t\t\tcase Fire::Fire(11, false, true, false, false, true).ID: return 1813;\n\t\t\tcase Fire::Fire(11, false, true, false, false, false).ID: return 1814;\n\t\t\tcase Fire::Fire(11, false, false, true, true, true).ID: return 1815;\n\t\t\tcase Fire::Fire(11, false, false, true, true, false).ID: return 1816;\n\t\t\tcase Fire::Fire(11, false, false, true, false, true).ID: return 1817;\n\t\t\tcase Fire::Fire(11, false, false, true, false, false).ID: return 1818;\n\t\t\tcase Fire::Fire(11, false, false, false, true, true).ID: return 1819;\n\t\t\tcase Fire::Fire(11, false, false, false, true, false).ID: return 1820;\n\t\t\tcase Fire::Fire(11, false, false, false, false, true).ID: return 1821;\n\t\t\tcase Fire::Fire(11, false, false, false, false, false).ID: return 1822;\n\t\t\tcase Fire::Fire(12, true, true, true, true, true).ID: return 1823;\n\t\t\tcase Fire::Fire(12, true, true, true, true, false).ID: return 1824;\n\t\t\tcase Fire::Fire(12, true, true, true, false, true).ID: return 1825;\n\t\t\tcase Fire::Fire(12, true, true, true, false, false).ID: return 1826;\n\t\t\tcase Fire::Fire(12, true, true, false, true, true).ID: return 1827;\n\t\t\tcase Fire::Fire(12, true, true, false, true, false).ID: return 1828;\n\t\t\tcase Fire::Fire(12, true, true, false, false, true).ID: return 1829;\n\t\t\tcase Fire::Fire(12, true, true, false, false, false).ID: return 1830;\n\t\t\tcase Fire::Fire(12, true, false, true, true, true).ID: return 1831;\n\t\t\tcase Fire::Fire(12, true, false, true, true, false).ID: return 1832;\n\t\t\tcase Fire::Fire(12, true, false, true, false, true).ID: return 1833;\n\t\t\tcase Fire::Fire(12, true, false, true, false, false).ID: return 1834;\n\t\t\tcase Fire::Fire(12, true, false, false, true, true).ID: return 1835;\n\t\t\tcase Fire::Fire(12, true, false, false, true, false).ID: return 1836;\n\t\t\tcase Fire::Fire(12, true, false, false, false, true).ID: return 1837;\n\t\t\tcase Fire::Fire(12, true, false, false, false, false).ID: return 1838;\n\t\t\tcase Fire::Fire(12, false, true, true, true, true).ID: return 1839;\n\t\t\tcase Fire::Fire(12, false, true, true, true, false).ID: return 1840;\n\t\t\tcase Fire::Fire(12, false, true, true, false, true).ID: return 1841;\n\t\t\tcase Fire::Fire(12, false, true, true, false, false).ID: return 1842;\n\t\t\tcase Fire::Fire(12, false, true, false, true, true).ID: return 1843;\n\t\t\tcase Fire::Fire(12, false, true, false, true, false).ID: return 1844;\n\t\t\tcase Fire::Fire(12, false, true, false, false, true).ID: return 1845;\n\t\t\tcase Fire::Fire(12, false, true, false, false, false).ID: return 1846;\n\t\t\tcase Fire::Fire(12, false, false, true, true, true).ID: return 1847;\n\t\t\tcase Fire::Fire(12, false, false, true, true, false).ID: return 1848;\n\t\t\tcase Fire::Fire(12, false, false, true, false, true).ID: return 1849;\n\t\t\tcase Fire::Fire(12, false, false, true, false, false).ID: return 1850;\n\t\t\tcase Fire::Fire(12, false, false, false, true, true).ID: return 1851;\n\t\t\tcase Fire::Fire(12, false, false, false, true, false).ID: return 1852;\n\t\t\tcase Fire::Fire(12, false, false, false, false, true).ID: return 1853;\n\t\t\tcase Fire::Fire(12, false, false, false, false, false).ID: return 1854;\n\t\t\tcase Fire::Fire(13, true, true, true, true, true).ID: return 1855;\n\t\t\tcase Fire::Fire(13, true, true, true, true, false).ID: return 1856;\n\t\t\tcase Fire::Fire(13, true, true, true, false, true).ID: return 1857;\n\t\t\tcase Fire::Fire(13, true, true, true, false, false).ID: return 1858;\n\t\t\tcase Fire::Fire(13, true, true, false, true, true).ID: return 1859;\n\t\t\tcase Fire::Fire(13, true, true, false, true, false).ID: return 1860;\n\t\t\tcase Fire::Fire(13, true, true, false, false, true).ID: return 1861;\n\t\t\tcase Fire::Fire(13, true, true, false, false, false).ID: return 1862;\n\t\t\tcase Fire::Fire(13, true, false, true, true, true).ID: return 1863;\n\t\t\tcase Fire::Fire(13, true, false, true, true, false).ID: return 1864;\n\t\t\tcase Fire::Fire(13, true, false, true, false, true).ID: return 1865;\n\t\t\tcase Fire::Fire(13, true, false, true, false, false).ID: return 1866;\n\t\t\tcase Fire::Fire(13, true, false, false, true, true).ID: return 1867;\n\t\t\tcase Fire::Fire(13, true, false, false, true, false).ID: return 1868;\n\t\t\tcase Fire::Fire(13, true, false, false, false, true).ID: return 1869;\n\t\t\tcase Fire::Fire(13, true, false, false, false, false).ID: return 1870;\n\t\t\tcase Fire::Fire(13, false, true, true, true, true).ID: return 1871;\n\t\t\tcase Fire::Fire(13, false, true, true, true, false).ID: return 1872;\n\t\t\tcase Fire::Fire(13, false, true, true, false, true).ID: return 1873;\n\t\t\tcase Fire::Fire(13, false, true, true, false, false).ID: return 1874;\n\t\t\tcase Fire::Fire(13, false, true, false, true, true).ID: return 1875;\n\t\t\tcase Fire::Fire(13, false, true, false, true, false).ID: return 1876;\n\t\t\tcase Fire::Fire(13, false, true, false, false, true).ID: return 1877;\n\t\t\tcase Fire::Fire(13, false, true, false, false, false).ID: return 1878;\n\t\t\tcase Fire::Fire(13, false, false, true, true, true).ID: return 1879;\n\t\t\tcase Fire::Fire(13, false, false, true, true, false).ID: return 1880;\n\t\t\tcase Fire::Fire(13, false, false, true, false, true).ID: return 1881;\n\t\t\tcase Fire::Fire(13, false, false, true, false, false).ID: return 1882;\n\t\t\tcase Fire::Fire(13, false, false, false, true, true).ID: return 1883;\n\t\t\tcase Fire::Fire(13, false, false, false, true, false).ID: return 1884;\n\t\t\tcase Fire::Fire(13, false, false, false, false, true).ID: return 1885;\n\t\t\tcase Fire::Fire(13, false, false, false, false, false).ID: return 1886;\n\t\t\tcase Fire::Fire(14, true, true, true, true, true).ID: return 1887;\n\t\t\tcase Fire::Fire(14, true, true, true, true, false).ID: return 1888;\n\t\t\tcase Fire::Fire(14, true, true, true, false, true).ID: return 1889;\n\t\t\tcase Fire::Fire(14, true, true, true, false, false).ID: return 1890;\n\t\t\tcase Fire::Fire(14, true, true, false, true, true).ID: return 1891;\n\t\t\tcase Fire::Fire(14, true, true, false, true, false).ID: return 1892;\n\t\t\tcase Fire::Fire(14, true, true, false, false, true).ID: return 1893;\n\t\t\tcase Fire::Fire(14, true, true, false, false, false).ID: return 1894;\n\t\t\tcase Fire::Fire(14, true, false, true, true, true).ID: return 1895;\n\t\t\tcase Fire::Fire(14, true, false, true, true, false).ID: return 1896;\n\t\t\tcase Fire::Fire(14, true, false, true, false, true).ID: return 1897;\n\t\t\tcase Fire::Fire(14, true, false, true, false, false).ID: return 1898;\n\t\t\tcase Fire::Fire(14, true, false, false, true, true).ID: return 1899;\n\t\t\tcase Fire::Fire(14, true, false, false, true, false).ID: return 1900;\n\t\t\tcase Fire::Fire(14, true, false, false, false, true).ID: return 1901;\n\t\t\tcase Fire::Fire(14, true, false, false, false, false).ID: return 1902;\n\t\t\tcase Fire::Fire(14, false, true, true, true, true).ID: return 1903;\n\t\t\tcase Fire::Fire(14, false, true, true, true, false).ID: return 1904;\n\t\t\tcase Fire::Fire(14, false, true, true, false, true).ID: return 1905;\n\t\t\tcase Fire::Fire(14, false, true, true, false, false).ID: return 1906;\n\t\t\tcase Fire::Fire(14, false, true, false, true, true).ID: return 1907;\n\t\t\tcase Fire::Fire(14, false, true, false, true, false).ID: return 1908;\n\t\t\tcase Fire::Fire(14, false, true, false, false, true).ID: return 1909;\n\t\t\tcase Fire::Fire(14, false, true, false, false, false).ID: return 1910;\n\t\t\tcase Fire::Fire(14, false, false, true, true, true).ID: return 1911;\n\t\t\tcase Fire::Fire(14, false, false, true, true, false).ID: return 1912;\n\t\t\tcase Fire::Fire(14, false, false, true, false, true).ID: return 1913;\n\t\t\tcase Fire::Fire(14, false, false, true, false, false).ID: return 1914;\n\t\t\tcase Fire::Fire(14, false, false, false, true, true).ID: return 1915;\n\t\t\tcase Fire::Fire(14, false, false, false, true, false).ID: return 1916;\n\t\t\tcase Fire::Fire(14, false, false, false, false, true).ID: return 1917;\n\t\t\tcase Fire::Fire(14, false, false, false, false, false).ID: return 1918;\n\t\t\tcase Fire::Fire(15, true, true, true, true, true).ID: return 1919;\n\t\t\tcase Fire::Fire(15, true, true, true, true, false).ID: return 1920;\n\t\t\tcase Fire::Fire(15, true, true, true, false, true).ID: return 1921;\n\t\t\tcase Fire::Fire(15, true, true, true, false, false).ID: return 1922;\n\t\t\tcase Fire::Fire(15, true, true, false, true, true).ID: return 1923;\n\t\t\tcase Fire::Fire(15, true, true, false, true, false).ID: return 1924;\n\t\t\tcase Fire::Fire(15, true, true, false, false, true).ID: return 1925;\n\t\t\tcase Fire::Fire(15, true, true, false, false, false).ID: return 1926;\n\t\t\tcase Fire::Fire(15, true, false, true, true, true).ID: return 1927;\n\t\t\tcase Fire::Fire(15, true, false, true, true, false).ID: return 1928;\n\t\t\tcase Fire::Fire(15, true, false, true, false, true).ID: return 1929;\n\t\t\tcase Fire::Fire(15, true, false, true, false, false).ID: return 1930;\n\t\t\tcase Fire::Fire(15, true, false, false, true, true).ID: return 1931;\n\t\t\tcase Fire::Fire(15, true, false, false, true, false).ID: return 1932;\n\t\t\tcase Fire::Fire(15, true, false, false, false, true).ID: return 1933;\n\t\t\tcase Fire::Fire(15, true, false, false, false, false).ID: return 1934;\n\t\t\tcase Fire::Fire(15, false, true, true, true, true).ID: return 1935;\n\t\t\tcase Fire::Fire(15, false, true, true, true, false).ID: return 1936;\n\t\t\tcase Fire::Fire(15, false, true, true, false, true).ID: return 1937;\n\t\t\tcase Fire::Fire(15, false, true, true, false, false).ID: return 1938;\n\t\t\tcase Fire::Fire(15, false, true, false, true, true).ID: return 1939;\n\t\t\tcase Fire::Fire(15, false, true, false, true, false).ID: return 1940;\n\t\t\tcase Fire::Fire(15, false, true, false, false, true).ID: return 1941;\n\t\t\tcase Fire::Fire(15, false, true, false, false, false).ID: return 1942;\n\t\t\tcase Fire::Fire(15, false, false, true, true, true).ID: return 1943;\n\t\t\tcase Fire::Fire(15, false, false, true, true, false).ID: return 1944;\n\t\t\tcase Fire::Fire(15, false, false, true, false, true).ID: return 1945;\n\t\t\tcase Fire::Fire(15, false, false, true, false, false).ID: return 1946;\n\t\t\tcase Fire::Fire(15, false, false, false, true, true).ID: return 1947;\n\t\t\tcase Fire::Fire(15, false, false, false, true, false).ID: return 1948;\n\t\t\tcase Fire::Fire(15, false, false, false, false, true).ID: return 1949;\n\t\t\tcase Fire::Fire(15, false, false, false, false, false).ID: return 1950;\n\t\t\tcase FireCoral::FireCoral().ID: return 9001;\n\t\t\tcase FireCoralBlock::FireCoralBlock().ID: return 8982;\n\t\t\tcase FireCoralFan::FireCoralFan().ID: return 9021;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9089;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9091;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9093;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9095;\n\t\t\tcase FletchingTable::FletchingTable().ID: return 11164;\n\t\t\tcase FlowerPot::FlowerPot().ID: return 5769;\n\t\t\tcase FrostedIce::FrostedIce(0).ID: return 8713;\n\t\t\tcase FrostedIce::FrostedIce(1).ID: return 8714;\n\t\t\tcase FrostedIce::FrostedIce(2).ID: return 8715;\n\t\t\tcase FrostedIce::FrostedIce(3).ID: return 8716;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3371;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3372;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3373;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3374;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, true).ID: return 3375;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, false).ID: return 3376;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, true).ID: return 3377;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, false).ID: return 3378;\n\t\t\tcase Glass::Glass().ID: return 230;\n\t\t\tcase GlassPane::GlassPane(true, true, true, true).ID: return 4717;\n\t\t\tcase GlassPane::GlassPane(true, true, true, false).ID: return 4718;\n\t\t\tcase GlassPane::GlassPane(true, true, false, true).ID: return 4721;\n\t\t\tcase GlassPane::GlassPane(true, true, false, false).ID: return 4722;\n\t\t\tcase GlassPane::GlassPane(true, false, true, true).ID: return 4725;\n\t\t\tcase GlassPane::GlassPane(true, false, true, false).ID: return 4726;\n\t\t\tcase GlassPane::GlassPane(true, false, false, true).ID: return 4729;\n\t\t\tcase GlassPane::GlassPane(true, false, false, false).ID: return 4730;\n\t\t\tcase GlassPane::GlassPane(false, true, true, true).ID: return 4733;\n\t\t\tcase GlassPane::GlassPane(false, true, true, false).ID: return 4734;\n\t\t\tcase GlassPane::GlassPane(false, true, false, true).ID: return 4737;\n\t\t\tcase GlassPane::GlassPane(false, true, false, false).ID: return 4738;\n\t\t\tcase GlassPane::GlassPane(false, false, true, true).ID: return 4741;\n\t\t\tcase GlassPane::GlassPane(false, false, true, false).ID: return 4742;\n\t\t\tcase GlassPane::GlassPane(false, false, false, true).ID: return 4745;\n\t\t\tcase GlassPane::GlassPane(false, false, false, false).ID: return 4746;\n\t\t\tcase Glowstone::Glowstone().ID: return 3999;\n\t\t\tcase GoldBlock::GoldBlock().ID: return 1426;\n\t\t\tcase GoldOre::GoldOre().ID: return 69;\n\t\t\tcase Granite::Granite().ID: return 2;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Top).ID: return 10302;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Bottom).ID: return 10304;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Double).ID: return 10306;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 9854;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 9856;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 9858;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 9860;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 9862;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 9864;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 9866;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 9868;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 9870;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 9872;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 9874;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 9876;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 9878;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 9880;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 9882;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 9884;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 9886;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 9888;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 9890;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 9892;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 9894;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 9896;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 9898;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 9900;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 9902;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 9904;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 9906;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 9908;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 9910;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 9912;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 9914;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 9916;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 9918;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 9920;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 9922;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 9924;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 9926;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 9928;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 9930;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 9932;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 10589;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 10590;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 10593;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 10594;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 10597;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 10598;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 10601;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 10602;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 10605;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 10606;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 10609;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 10610;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 10613;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 10614;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 10617;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 10618;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 10621;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 10622;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 10625;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 10626;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 10629;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 10630;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 10633;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 10634;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 10637;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 10638;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 10641;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 10642;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 10645;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 10646;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 10649;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 10650;\n\t\t\tcase Grass::Grass().ID: return 1341;\n\t\t\tcase GrassBlock::GrassBlock(true).ID: return 8;\n\t\t\tcase GrassBlock::GrassBlock(false).ID: return 9;\n\t\t\tcase GrassPath::GrassPath().ID: return 8687;\n\t\t\tcase Gravel::Gravel().ID: return 68;\n\t\t\tcase GrayBanner::GrayBanner(0).ID: return 7473;\n\t\t\tcase GrayBanner::GrayBanner(1).ID: return 7474;\n\t\t\tcase GrayBanner::GrayBanner(2).ID: return 7475;\n\t\t\tcase GrayBanner::GrayBanner(3).ID: return 7476;\n\t\t\tcase GrayBanner::GrayBanner(4).ID: return 7477;\n\t\t\tcase GrayBanner::GrayBanner(5).ID: return 7478;\n\t\t\tcase GrayBanner::GrayBanner(6).ID: return 7479;\n\t\t\tcase GrayBanner::GrayBanner(7).ID: return 7480;\n\t\t\tcase GrayBanner::GrayBanner(8).ID: return 7481;\n\t\t\tcase GrayBanner::GrayBanner(9).ID: return 7482;\n\t\t\tcase GrayBanner::GrayBanner(10).ID: return 7483;\n\t\t\tcase GrayBanner::GrayBanner(11).ID: return 7484;\n\t\t\tcase GrayBanner::GrayBanner(12).ID: return 7485;\n\t\t\tcase GrayBanner::GrayBanner(13).ID: return 7486;\n\t\t\tcase GrayBanner::GrayBanner(14).ID: return 7487;\n\t\t\tcase GrayBanner::GrayBanner(15).ID: return 7488;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Head).ID: return 1160;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Foot).ID: return 1161;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Head).ID: return 1162;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Foot).ID: return 1163;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Head).ID: return 1164;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Foot).ID: return 1165;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Head).ID: return 1166;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Foot).ID: return 1167;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Head).ID: return 1168;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Foot).ID: return 1169;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Head).ID: return 1170;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Foot).ID: return 1171;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Head).ID: return 1172;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Foot).ID: return 1173;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Head).ID: return 1174;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Foot).ID: return 1175;\n\t\t\tcase GrayCarpet::GrayCarpet().ID: return 7337;\n\t\t\tcase GrayConcrete::GrayConcrete().ID: return 8909;\n\t\t\tcase GrayConcretePowder::GrayConcretePowder().ID: return 8925;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8866;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8867;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8868;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8869;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8784;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8785;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8786;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8787;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8788;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8789;\n\t\t\tcase GrayStainedGlass::GrayStainedGlass().ID: return 4088;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, true).ID: return 6553;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, false).ID: return 6554;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, true).ID: return 6557;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, false).ID: return 6558;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, true).ID: return 6561;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, false).ID: return 6562;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, true).ID: return 6565;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, false).ID: return 6566;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, true).ID: return 6569;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, false).ID: return 6570;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, true).ID: return 6573;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, false).ID: return 6574;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, true).ID: return 6577;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, false).ID: return 6578;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, true).ID: return 6581;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, false).ID: return 6582;\n\t\t\tcase GrayTerracotta::GrayTerracotta().ID: return 6318;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7645;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7646;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7647;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7648;\n\t\t\tcase GrayWool::GrayWool().ID: return 1390;\n\t\t\tcase GreenBanner::GreenBanner(0).ID: return 7569;\n\t\t\tcase GreenBanner::GreenBanner(1).ID: return 7570;\n\t\t\tcase GreenBanner::GreenBanner(2).ID: return 7571;\n\t\t\tcase GreenBanner::GreenBanner(3).ID: return 7572;\n\t\t\tcase GreenBanner::GreenBanner(4).ID: return 7573;\n\t\t\tcase GreenBanner::GreenBanner(5).ID: return 7574;\n\t\t\tcase GreenBanner::GreenBanner(6).ID: return 7575;\n\t\t\tcase GreenBanner::GreenBanner(7).ID: return 7576;\n\t\t\tcase GreenBanner::GreenBanner(8).ID: return 7577;\n\t\t\tcase GreenBanner::GreenBanner(9).ID: return 7578;\n\t\t\tcase GreenBanner::GreenBanner(10).ID: return 7579;\n\t\t\tcase GreenBanner::GreenBanner(11).ID: return 7580;\n\t\t\tcase GreenBanner::GreenBanner(12).ID: return 7581;\n\t\t\tcase GreenBanner::GreenBanner(13).ID: return 7582;\n\t\t\tcase GreenBanner::GreenBanner(14).ID: return 7583;\n\t\t\tcase GreenBanner::GreenBanner(15).ID: return 7584;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Head).ID: return 1256;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Foot).ID: return 1257;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Head).ID: return 1258;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Foot).ID: return 1259;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Head).ID: return 1260;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Foot).ID: return 1261;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Head).ID: return 1262;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Foot).ID: return 1263;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Head).ID: return 1264;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Foot).ID: return 1265;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Head).ID: return 1266;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Foot).ID: return 1267;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Head).ID: return 1268;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Foot).ID: return 1269;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Head).ID: return 1270;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Foot).ID: return 1271;\n\t\t\tcase GreenCarpet::GreenCarpet().ID: return 7343;\n\t\t\tcase GreenConcrete::GreenConcrete().ID: return 8915;\n\t\t\tcase GreenConcretePowder::GreenConcretePowder().ID: return 8931;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8890;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8891;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8892;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8893;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8820;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8821;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8822;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8823;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8824;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8825;\n\t\t\tcase GreenStainedGlass::GreenStainedGlass().ID: return 4094;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, true).ID: return 6745;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, false).ID: return 6746;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, true).ID: return 6749;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, false).ID: return 6750;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, true).ID: return 6753;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, false).ID: return 6754;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, true).ID: return 6757;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, false).ID: return 6758;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, true).ID: return 6761;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, false).ID: return 6762;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, true).ID: return 6765;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, false).ID: return 6766;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, true).ID: return 6769;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, false).ID: return 6770;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, true).ID: return 6773;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, false).ID: return 6774;\n\t\t\tcase GreenTerracotta::GreenTerracotta().ID: return 6324;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7669;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7670;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7671;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7672;\n\t\t\tcase GreenWool::GreenWool().ID: return 1396;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_ZM).ID: return 11165;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_ZP).ID: return 11166;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_XM).ID: return 11167;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_XP).ID: return 11168;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_ZM).ID: return 11169;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_ZP).ID: return 11170;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_XM).ID: return 11171;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_XP).ID: return 11172;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM).ID: return 11173;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP).ID: return 11174;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_XM).ID: return 11175;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_XP).ID: return 11176;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::X).ID: return 7327;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Y).ID: return 7328;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Z).ID: return 7329;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(0).ID: return 6126;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(1).ID: return 6127;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(2).ID: return 6128;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(3).ID: return 6129;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(4).ID: return 6130;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(5).ID: return 6131;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(6).ID: return 6132;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(7).ID: return 6133;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(8).ID: return 6134;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(9).ID: return 6135;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(10).ID: return 6136;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(11).ID: return 6137;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(12).ID: return 6138;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(13).ID: return 6139;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(14).ID: return 6140;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(15).ID: return 6141;\n\t\t\tcase HoneyBlock::HoneyBlock().ID: return 11335;\n\t\t\tcase HoneycombBlock::HoneycombBlock().ID: return 11336;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_YM).ID: return 6192;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZM).ID: return 6193;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZP).ID: return 6194;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XM).ID: return 6195;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XP).ID: return 6196;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_YM).ID: return 6197;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZM).ID: return 6198;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZP).ID: return 6199;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XM).ID: return 6200;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XP).ID: return 6201;\n\t\t\tcase HornCoral::HornCoral().ID: return 9003;\n\t\t\tcase HornCoralBlock::HornCoralBlock().ID: return 8983;\n\t\t\tcase HornCoralFan::HornCoralFan().ID: return 9023;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9097;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9099;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9101;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9103;\n\t\t\tcase Ice::Ice().ID: return 3927;\n\t\t\tcase InfestedChiseledStoneBricks::InfestedChiseledStoneBricks().ID: return 4490;\n\t\t\tcase InfestedCobblestone::InfestedCobblestone().ID: return 4486;\n\t\t\tcase InfestedCrackedStoneBricks::InfestedCrackedStoneBricks().ID: return 4489;\n\t\t\tcase InfestedMossyStoneBricks::InfestedMossyStoneBricks().ID: return 4488;\n\t\t\tcase InfestedStone::InfestedStone().ID: return 4485;\n\t\t\tcase InfestedStoneBricks::InfestedStoneBricks().ID: return 4487;\n\t\t\tcase IronBars::IronBars(true, true, true, true).ID: return 4685;\n\t\t\tcase IronBars::IronBars(true, true, true, false).ID: return 4686;\n\t\t\tcase IronBars::IronBars(true, true, false, true).ID: return 4689;\n\t\t\tcase IronBars::IronBars(true, true, false, false).ID: return 4690;\n\t\t\tcase IronBars::IronBars(true, false, true, true).ID: return 4693;\n\t\t\tcase IronBars::IronBars(true, false, true, false).ID: return 4694;\n\t\t\tcase IronBars::IronBars(true, false, false, true).ID: return 4697;\n\t\t\tcase IronBars::IronBars(true, false, false, false).ID: return 4698;\n\t\t\tcase IronBars::IronBars(false, true, true, true).ID: return 4701;\n\t\t\tcase IronBars::IronBars(false, true, true, false).ID: return 4702;\n\t\t\tcase IronBars::IronBars(false, true, false, true).ID: return 4705;\n\t\t\tcase IronBars::IronBars(false, true, false, false).ID: return 4706;\n\t\t\tcase IronBars::IronBars(false, false, true, true).ID: return 4709;\n\t\t\tcase IronBars::IronBars(false, false, true, false).ID: return 4710;\n\t\t\tcase IronBars::IronBars(false, false, false, true).ID: return 4713;\n\t\t\tcase IronBars::IronBars(false, false, false, false).ID: return 4714;\n\t\t\tcase IronBlock::IronBlock().ID: return 1427;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3807;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3808;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3809;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3810;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3811;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3812;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3813;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3814;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3815;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3816;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3817;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3818;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3819;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3820;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3821;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3822;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3823;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3824;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3825;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3826;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3827;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3828;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3829;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3830;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3831;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3832;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3833;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3834;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3835;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3836;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3837;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3838;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3839;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3840;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3841;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3842;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3843;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3844;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3845;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3846;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3847;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3848;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3849;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3850;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3851;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3852;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3853;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3854;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3855;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3856;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3857;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3858;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3859;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3860;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3861;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3862;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3863;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3864;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3865;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3866;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3867;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3868;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3869;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3870;\n\t\t\tcase IronOre::IronOre().ID: return 70;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, true).ID: return 7002;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, false).ID: return 7004;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, true).ID: return 7006;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, false).ID: return 7008;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, true).ID: return 7010;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, false).ID: return 7012;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, true).ID: return 7014;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, false).ID: return 7016;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, true).ID: return 7018;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, false).ID: return 7020;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, true).ID: return 7022;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, false).ID: return 7024;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, true).ID: return 7026;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, false).ID: return 7028;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, true).ID: return 7030;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, false).ID: return 7032;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, true).ID: return 7034;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, false).ID: return 7036;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, true).ID: return 7038;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, false).ID: return 7040;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, true).ID: return 7042;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, false).ID: return 7044;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, true).ID: return 7046;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, false).ID: return 7048;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, true).ID: return 7050;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, false).ID: return 7052;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, true).ID: return 7054;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, false).ID: return 7056;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, true).ID: return 7058;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, false).ID: return 7060;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, true).ID: return 7062;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, false).ID: return 7064;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZM).ID: return 4006;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZP).ID: return 4007;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XM).ID: return 4008;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XP).ID: return 4009;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::NorthUp).ID: return 11272;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::EastUp).ID: return 11273;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::SouthUp).ID: return 11274;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::WestUp).ID: return 11275;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::UpSouth).ID: return 11276;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::DownSouth).ID: return 11277;\n\t\t\tcase Jukebox::Jukebox(true).ID: return 3962;\n\t\t\tcase Jukebox::Jukebox(false).ID: return 3963;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5882;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5883;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5884;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5885;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5886;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5887;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5888;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5889;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5890;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5891;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5892;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5893;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5894;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5895;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5896;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5897;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5898;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5899;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5900;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5901;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5902;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5903;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5904;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5905;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8330;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8331;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8332;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8333;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8334;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8335;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8336;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8337;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8338;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8339;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8340;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8341;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8342;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8343;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8344;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8345;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8346;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8347;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8348;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8349;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8350;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8351;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8352;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8353;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8354;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8355;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8356;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8357;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8358;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8359;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8360;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8361;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8362;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8363;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8364;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8365;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8366;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8367;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8368;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8369;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8370;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8371;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8372;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8373;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8374;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8375;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8376;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8377;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8378;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8379;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8380;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8381;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8382;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8383;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8384;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8385;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8386;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8387;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8388;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8389;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8390;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8391;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8392;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8393;\n\t\t\tcase JungleFence::JungleFence(true, true, true, true).ID: return 8108;\n\t\t\tcase JungleFence::JungleFence(true, true, true, false).ID: return 8109;\n\t\t\tcase JungleFence::JungleFence(true, true, false, true).ID: return 8112;\n\t\t\tcase JungleFence::JungleFence(true, true, false, false).ID: return 8113;\n\t\t\tcase JungleFence::JungleFence(true, false, true, true).ID: return 8116;\n\t\t\tcase JungleFence::JungleFence(true, false, true, false).ID: return 8117;\n\t\t\tcase JungleFence::JungleFence(true, false, false, true).ID: return 8120;\n\t\t\tcase JungleFence::JungleFence(true, false, false, false).ID: return 8121;\n\t\t\tcase JungleFence::JungleFence(false, true, true, true).ID: return 8124;\n\t\t\tcase JungleFence::JungleFence(false, true, true, false).ID: return 8125;\n\t\t\tcase JungleFence::JungleFence(false, true, false, true).ID: return 8128;\n\t\t\tcase JungleFence::JungleFence(false, true, false, false).ID: return 8129;\n\t\t\tcase JungleFence::JungleFence(false, false, true, true).ID: return 8132;\n\t\t\tcase JungleFence::JungleFence(false, false, true, false).ID: return 8133;\n\t\t\tcase JungleFence::JungleFence(false, false, false, true).ID: return 8136;\n\t\t\tcase JungleFence::JungleFence(false, false, false, false).ID: return 8137;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7946;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7947;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7948;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7949;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7950;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7951;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7952;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7953;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7954;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7955;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7956;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7957;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7958;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7959;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7960;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7961;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7962;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7963;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7964;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7965;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7966;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7967;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7968;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7969;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7970;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7971;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7972;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7973;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7974;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7975;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7976;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7977;\n\t\t\tcase JungleLeaves::JungleLeaves(1, true).ID: return 186;\n\t\t\tcase JungleLeaves::JungleLeaves(1, false).ID: return 187;\n\t\t\tcase JungleLeaves::JungleLeaves(2, true).ID: return 188;\n\t\t\tcase JungleLeaves::JungleLeaves(2, false).ID: return 189;\n\t\t\tcase JungleLeaves::JungleLeaves(3, true).ID: return 190;\n\t\t\tcase JungleLeaves::JungleLeaves(3, false).ID: return 191;\n\t\t\tcase JungleLeaves::JungleLeaves(4, true).ID: return 192;\n\t\t\tcase JungleLeaves::JungleLeaves(4, false).ID: return 193;\n\t\t\tcase JungleLeaves::JungleLeaves(5, true).ID: return 194;\n\t\t\tcase JungleLeaves::JungleLeaves(5, false).ID: return 195;\n\t\t\tcase JungleLeaves::JungleLeaves(6, true).ID: return 196;\n\t\t\tcase JungleLeaves::JungleLeaves(6, false).ID: return 197;\n\t\t\tcase JungleLeaves::JungleLeaves(7, true).ID: return 198;\n\t\t\tcase JungleLeaves::JungleLeaves(7, false).ID: return 199;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::X).ID: return 81;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Y).ID: return 82;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Z).ID: return 83;\n\t\t\tcase JunglePlanks::JunglePlanks().ID: return 18;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(true).ID: return 3877;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(false).ID: return 3878;\n\t\t\tcase JungleSapling::JungleSapling(0).ID: return 27;\n\t\t\tcase JungleSapling::JungleSapling(1).ID: return 28;\n\t\t\tcase JungleSign::JungleSign(0).ID: return 3508;\n\t\t\tcase JungleSign::JungleSign(1).ID: return 3510;\n\t\t\tcase JungleSign::JungleSign(2).ID: return 3512;\n\t\t\tcase JungleSign::JungleSign(3).ID: return 3514;\n\t\t\tcase JungleSign::JungleSign(4).ID: return 3516;\n\t\t\tcase JungleSign::JungleSign(5).ID: return 3518;\n\t\t\tcase JungleSign::JungleSign(6).ID: return 3520;\n\t\t\tcase JungleSign::JungleSign(7).ID: return 3522;\n\t\t\tcase JungleSign::JungleSign(8).ID: return 3524;\n\t\t\tcase JungleSign::JungleSign(9).ID: return 3526;\n\t\t\tcase JungleSign::JungleSign(10).ID: return 3528;\n\t\t\tcase JungleSign::JungleSign(11).ID: return 3530;\n\t\t\tcase JungleSign::JungleSign(12).ID: return 3532;\n\t\t\tcase JungleSign::JungleSign(13).ID: return 3534;\n\t\t\tcase JungleSign::JungleSign(14).ID: return 3536;\n\t\t\tcase JungleSign::JungleSign(15).ID: return 3538;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Top).ID: return 7783;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Bottom).ID: return 7785;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Double).ID: return 7787;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5549;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5551;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5553;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5555;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5557;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5559;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5561;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5563;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5565;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5567;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5569;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5571;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5573;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5575;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5577;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5579;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5581;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5583;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5585;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5587;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5589;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5591;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5593;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5595;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5597;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5599;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5601;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5603;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5605;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5607;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5609;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5611;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5613;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5615;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5617;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5619;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5621;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5623;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5625;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5627;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, true).ID: return 4290;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, false).ID: return 4292;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, true).ID: return 4294;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, false).ID: return 4296;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, true).ID: return 4298;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, false).ID: return 4300;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, true).ID: return 4302;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, false).ID: return 4304;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, true).ID: return 4306;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, false).ID: return 4308;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, true).ID: return 4310;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, false).ID: return 4312;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, true).ID: return 4314;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, false).ID: return 4316;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, true).ID: return 4318;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, false).ID: return 4320;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, true).ID: return 4322;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, false).ID: return 4324;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, true).ID: return 4326;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, false).ID: return 4328;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, true).ID: return 4330;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, false).ID: return 4332;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, true).ID: return 4334;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, false).ID: return 4336;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, true).ID: return 4338;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, false).ID: return 4340;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, true).ID: return 4342;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, false).ID: return 4344;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, true).ID: return 4346;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, false).ID: return 4348;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, true).ID: return 4350;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, false).ID: return 4352;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3766;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3768;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3770;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3772;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::X).ID: return 117;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Y).ID: return 118;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Z).ID: return 119;\n\t\t\tcase Kelp::Kelp(0).ID: return 8934;\n\t\t\tcase Kelp::Kelp(1).ID: return 8935;\n\t\t\tcase Kelp::Kelp(2).ID: return 8936;\n\t\t\tcase Kelp::Kelp(3).ID: return 8937;\n\t\t\tcase Kelp::Kelp(4).ID: return 8938;\n\t\t\tcase Kelp::Kelp(5).ID: return 8939;\n\t\t\tcase Kelp::Kelp(6).ID: return 8940;\n\t\t\tcase Kelp::Kelp(7).ID: return 8941;\n\t\t\tcase Kelp::Kelp(8).ID: return 8942;\n\t\t\tcase Kelp::Kelp(9).ID: return 8943;\n\t\t\tcase Kelp::Kelp(10).ID: return 8944;\n\t\t\tcase Kelp::Kelp(11).ID: return 8945;\n\t\t\tcase Kelp::Kelp(12).ID: return 8946;\n\t\t\tcase Kelp::Kelp(13).ID: return 8947;\n\t\t\tcase Kelp::Kelp(14).ID: return 8948;\n\t\t\tcase Kelp::Kelp(15).ID: return 8949;\n\t\t\tcase Kelp::Kelp(16).ID: return 8950;\n\t\t\tcase Kelp::Kelp(17).ID: return 8951;\n\t\t\tcase Kelp::Kelp(18).ID: return 8952;\n\t\t\tcase Kelp::Kelp(19).ID: return 8953;\n\t\t\tcase Kelp::Kelp(20).ID: return 8954;\n\t\t\tcase Kelp::Kelp(21).ID: return 8955;\n\t\t\tcase Kelp::Kelp(22).ID: return 8956;\n\t\t\tcase Kelp::Kelp(23).ID: return 8957;\n\t\t\tcase Kelp::Kelp(24).ID: return 8958;\n\t\t\tcase Kelp::Kelp(25).ID: return 8959;\n\t\t\tcase KelpPlant::KelpPlant().ID: return 8960;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZM).ID: return 3636;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZP).ID: return 3638;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XM).ID: return 3640;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XP).ID: return 3642;\n\t\t\tcase Lantern::Lantern(true).ID: return 11230;\n\t\t\tcase Lantern::Lantern(false).ID: return 11231;\n\t\t\tcase LapisBlock::LapisBlock().ID: return 232;\n\t\t\tcase LapisOre::LapisOre().ID: return 231;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Upper).ID: return 7359;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Lower).ID: return 7360;\n\t\t\tcase Lava::Lava(0).ID: return 50;\n\t\t\tcase Lava::Lava(1).ID: return 51;\n\t\t\tcase Lava::Lava(2).ID: return 52;\n\t\t\tcase Lava::Lava(3).ID: return 53;\n\t\t\tcase Lava::Lava(4).ID: return 54;\n\t\t\tcase Lava::Lava(5).ID: return 55;\n\t\t\tcase Lava::Lava(6).ID: return 56;\n\t\t\tcase Lava::Lava(7).ID: return 57;\n\t\t\tcase Lava::Lava(8).ID: return 58;\n\t\t\tcase Lava::Lava(9).ID: return 59;\n\t\t\tcase Lava::Lava(10).ID: return 60;\n\t\t\tcase Lava::Lava(11).ID: return 61;\n\t\t\tcase Lava::Lava(12).ID: return 62;\n\t\t\tcase Lava::Lava(13).ID: return 63;\n\t\t\tcase Lava::Lava(14).ID: return 64;\n\t\t\tcase Lava::Lava(15).ID: return 65;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 11177;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 11178;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 11179;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 11180;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 11181;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 11182;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 11183;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 11184;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, true, true).ID: return 11185;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, true, false).ID: return 11186;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, false, true).ID: return 11187;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, false, false).ID: return 11188;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, true, true).ID: return 11189;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, true, false).ID: return 11190;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, false, true).ID: return 11191;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, false, false).ID: return 11192;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3781;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3782;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3783;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3784;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3785;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3786;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3787;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3788;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3789;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3790;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3791;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3792;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3793;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3794;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3795;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3796;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3797;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3798;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3799;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3800;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3801;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3802;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3803;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3804;\n\t\t\tcase LightBlueBanner::LightBlueBanner(0).ID: return 7409;\n\t\t\tcase LightBlueBanner::LightBlueBanner(1).ID: return 7410;\n\t\t\tcase LightBlueBanner::LightBlueBanner(2).ID: return 7411;\n\t\t\tcase LightBlueBanner::LightBlueBanner(3).ID: return 7412;\n\t\t\tcase LightBlueBanner::LightBlueBanner(4).ID: return 7413;\n\t\t\tcase LightBlueBanner::LightBlueBanner(5).ID: return 7414;\n\t\t\tcase LightBlueBanner::LightBlueBanner(6).ID: return 7415;\n\t\t\tcase LightBlueBanner::LightBlueBanner(7).ID: return 7416;\n\t\t\tcase LightBlueBanner::LightBlueBanner(8).ID: return 7417;\n\t\t\tcase LightBlueBanner::LightBlueBanner(9).ID: return 7418;\n\t\t\tcase LightBlueBanner::LightBlueBanner(10).ID: return 7419;\n\t\t\tcase LightBlueBanner::LightBlueBanner(11).ID: return 7420;\n\t\t\tcase LightBlueBanner::LightBlueBanner(12).ID: return 7421;\n\t\t\tcase LightBlueBanner::LightBlueBanner(13).ID: return 7422;\n\t\t\tcase LightBlueBanner::LightBlueBanner(14).ID: return 7423;\n\t\t\tcase LightBlueBanner::LightBlueBanner(15).ID: return 7424;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Head).ID: return 1096;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Foot).ID: return 1097;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Head).ID: return 1098;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Foot).ID: return 1099;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Head).ID: return 1100;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Foot).ID: return 1101;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Head).ID: return 1102;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Foot).ID: return 1103;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Head).ID: return 1104;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Foot).ID: return 1105;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Head).ID: return 1106;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Foot).ID: return 1107;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Head).ID: return 1108;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Foot).ID: return 1109;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Head).ID: return 1110;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Foot).ID: return 1111;\n\t\t\tcase LightBlueCarpet::LightBlueCarpet().ID: return 7333;\n\t\t\tcase LightBlueConcrete::LightBlueConcrete().ID: return 8905;\n\t\t\tcase LightBlueConcretePowder::LightBlueConcretePowder().ID: return 8921;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8850;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8851;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8852;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8853;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8760;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8761;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8762;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8763;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8764;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8765;\n\t\t\tcase LightBlueStainedGlass::LightBlueStainedGlass().ID: return 4084;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, true).ID: return 6425;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, false).ID: return 6426;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, true).ID: return 6429;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, false).ID: return 6430;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, true).ID: return 6433;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, false).ID: return 6434;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, true).ID: return 6437;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, false).ID: return 6438;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, true).ID: return 6441;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, false).ID: return 6442;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, true).ID: return 6445;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, false).ID: return 6446;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, true).ID: return 6449;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, false).ID: return 6450;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, true).ID: return 6453;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, false).ID: return 6454;\n\t\t\tcase LightBlueTerracotta::LightBlueTerracotta().ID: return 6314;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7629;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7630;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7631;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7632;\n\t\t\tcase LightBlueWool::LightBlueWool().ID: return 1386;\n\t\t\tcase LightGrayBanner::LightGrayBanner(0).ID: return 7489;\n\t\t\tcase LightGrayBanner::LightGrayBanner(1).ID: return 7490;\n\t\t\tcase LightGrayBanner::LightGrayBanner(2).ID: return 7491;\n\t\t\tcase LightGrayBanner::LightGrayBanner(3).ID: return 7492;\n\t\t\tcase LightGrayBanner::LightGrayBanner(4).ID: return 7493;\n\t\t\tcase LightGrayBanner::LightGrayBanner(5).ID: return 7494;\n\t\t\tcase LightGrayBanner::LightGrayBanner(6).ID: return 7495;\n\t\t\tcase LightGrayBanner::LightGrayBanner(7).ID: return 7496;\n\t\t\tcase LightGrayBanner::LightGrayBanner(8).ID: return 7497;\n\t\t\tcase LightGrayBanner::LightGrayBanner(9).ID: return 7498;\n\t\t\tcase LightGrayBanner::LightGrayBanner(10).ID: return 7499;\n\t\t\tcase LightGrayBanner::LightGrayBanner(11).ID: return 7500;\n\t\t\tcase LightGrayBanner::LightGrayBanner(12).ID: return 7501;\n\t\t\tcase LightGrayBanner::LightGrayBanner(13).ID: return 7502;\n\t\t\tcase LightGrayBanner::LightGrayBanner(14).ID: return 7503;\n\t\t\tcase LightGrayBanner::LightGrayBanner(15).ID: return 7504;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Head).ID: return 1176;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Foot).ID: return 1177;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Head).ID: return 1178;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Foot).ID: return 1179;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Head).ID: return 1180;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Foot).ID: return 1181;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Head).ID: return 1182;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Foot).ID: return 1183;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Head).ID: return 1184;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Foot).ID: return 1185;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Head).ID: return 1186;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Foot).ID: return 1187;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Head).ID: return 1188;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Foot).ID: return 1189;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Head).ID: return 1190;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Foot).ID: return 1191;\n\t\t\tcase LightGrayCarpet::LightGrayCarpet().ID: return 7338;\n\t\t\tcase LightGrayConcrete::LightGrayConcrete().ID: return 8910;\n\t\t\tcase LightGrayConcretePowder::LightGrayConcretePowder().ID: return 8926;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8870;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8871;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8872;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8873;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8790;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8791;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8792;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8793;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8794;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8795;\n\t\t\tcase LightGrayStainedGlass::LightGrayStainedGlass().ID: return 4089;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, true).ID: return 6585;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, false).ID: return 6586;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, true).ID: return 6589;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, false).ID: return 6590;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, true).ID: return 6593;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, false).ID: return 6594;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, true).ID: return 6597;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, false).ID: return 6598;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, true).ID: return 6601;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, false).ID: return 6602;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, true).ID: return 6605;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, false).ID: return 6606;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, true).ID: return 6609;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, false).ID: return 6610;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, true).ID: return 6613;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, false).ID: return 6614;\n\t\t\tcase LightGrayTerracotta::LightGrayTerracotta().ID: return 6319;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7649;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7650;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7651;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7652;\n\t\t\tcase LightGrayWool::LightGrayWool().ID: return 1391;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(0).ID: return 6110;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(1).ID: return 6111;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(2).ID: return 6112;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(3).ID: return 6113;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(4).ID: return 6114;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(5).ID: return 6115;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(6).ID: return 6116;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(7).ID: return 6117;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(8).ID: return 6118;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(9).ID: return 6119;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(10).ID: return 6120;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(11).ID: return 6121;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(12).ID: return 6122;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(13).ID: return 6123;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(14).ID: return 6124;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(15).ID: return 6125;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Upper).ID: return 7351;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Lower).ID: return 7352;\n\t\t\tcase LilyOfTheValley::LilyOfTheValley().ID: return 1423;\n\t\t\tcase LilyPad::LilyPad().ID: return 4998;\n\t\t\tcase LimeBanner::LimeBanner(0).ID: return 7441;\n\t\t\tcase LimeBanner::LimeBanner(1).ID: return 7442;\n\t\t\tcase LimeBanner::LimeBanner(2).ID: return 7443;\n\t\t\tcase LimeBanner::LimeBanner(3).ID: return 7444;\n\t\t\tcase LimeBanner::LimeBanner(4).ID: return 7445;\n\t\t\tcase LimeBanner::LimeBanner(5).ID: return 7446;\n\t\t\tcase LimeBanner::LimeBanner(6).ID: return 7447;\n\t\t\tcase LimeBanner::LimeBanner(7).ID: return 7448;\n\t\t\tcase LimeBanner::LimeBanner(8).ID: return 7449;\n\t\t\tcase LimeBanner::LimeBanner(9).ID: return 7450;\n\t\t\tcase LimeBanner::LimeBanner(10).ID: return 7451;\n\t\t\tcase LimeBanner::LimeBanner(11).ID: return 7452;\n\t\t\tcase LimeBanner::LimeBanner(12).ID: return 7453;\n\t\t\tcase LimeBanner::LimeBanner(13).ID: return 7454;\n\t\t\tcase LimeBanner::LimeBanner(14).ID: return 7455;\n\t\t\tcase LimeBanner::LimeBanner(15).ID: return 7456;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Head).ID: return 1128;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Foot).ID: return 1129;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Head).ID: return 1130;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Foot).ID: return 1131;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Head).ID: return 1132;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Foot).ID: return 1133;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Head).ID: return 1134;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Foot).ID: return 1135;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Head).ID: return 1136;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Foot).ID: return 1137;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Head).ID: return 1138;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Foot).ID: return 1139;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Head).ID: return 1140;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Foot).ID: return 1141;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Head).ID: return 1142;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Foot).ID: return 1143;\n\t\t\tcase LimeCarpet::LimeCarpet().ID: return 7335;\n\t\t\tcase LimeConcrete::LimeConcrete().ID: return 8907;\n\t\t\tcase LimeConcretePowder::LimeConcretePowder().ID: return 8923;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8858;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8859;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8860;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8861;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8772;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8773;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8774;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8775;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8776;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8777;\n\t\t\tcase LimeStainedGlass::LimeStainedGlass().ID: return 4086;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, true).ID: return 6489;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, false).ID: return 6490;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, true).ID: return 6493;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, false).ID: return 6494;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, true).ID: return 6497;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, false).ID: return 6498;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, true).ID: return 6501;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, false).ID: return 6502;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, true).ID: return 6505;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, false).ID: return 6506;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, true).ID: return 6509;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, false).ID: return 6510;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, true).ID: return 6513;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, false).ID: return 6514;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, true).ID: return 6517;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, false).ID: return 6518;\n\t\t\tcase LimeTerracotta::LimeTerracotta().ID: return 6316;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7637;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7638;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7639;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7640;\n\t\t\tcase LimeWool::LimeWool().ID: return 1388;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_ZM).ID: return 11131;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_ZP).ID: return 11132;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_XM).ID: return 11133;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_XP).ID: return 11134;\n\t\t\tcase MagentaBanner::MagentaBanner(0).ID: return 7393;\n\t\t\tcase MagentaBanner::MagentaBanner(1).ID: return 7394;\n\t\t\tcase MagentaBanner::MagentaBanner(2).ID: return 7395;\n\t\t\tcase MagentaBanner::MagentaBanner(3).ID: return 7396;\n\t\t\tcase MagentaBanner::MagentaBanner(4).ID: return 7397;\n\t\t\tcase MagentaBanner::MagentaBanner(5).ID: return 7398;\n\t\t\tcase MagentaBanner::MagentaBanner(6).ID: return 7399;\n\t\t\tcase MagentaBanner::MagentaBanner(7).ID: return 7400;\n\t\t\tcase MagentaBanner::MagentaBanner(8).ID: return 7401;\n\t\t\tcase MagentaBanner::MagentaBanner(9).ID: return 7402;\n\t\t\tcase MagentaBanner::MagentaBanner(10).ID: return 7403;\n\t\t\tcase MagentaBanner::MagentaBanner(11).ID: return 7404;\n\t\t\tcase MagentaBanner::MagentaBanner(12).ID: return 7405;\n\t\t\tcase MagentaBanner::MagentaBanner(13).ID: return 7406;\n\t\t\tcase MagentaBanner::MagentaBanner(14).ID: return 7407;\n\t\t\tcase MagentaBanner::MagentaBanner(15).ID: return 7408;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Head).ID: return 1080;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Foot).ID: return 1081;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Head).ID: return 1082;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Foot).ID: return 1083;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Head).ID: return 1084;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Foot).ID: return 1085;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Head).ID: return 1086;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Foot).ID: return 1087;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Head).ID: return 1088;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Foot).ID: return 1089;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Head).ID: return 1090;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Foot).ID: return 1091;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Head).ID: return 1092;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Foot).ID: return 1093;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Head).ID: return 1094;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Foot).ID: return 1095;\n\t\t\tcase MagentaCarpet::MagentaCarpet().ID: return 7332;\n\t\t\tcase MagentaConcrete::MagentaConcrete().ID: return 8904;\n\t\t\tcase MagentaConcretePowder::MagentaConcretePowder().ID: return 8920;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8846;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8847;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8848;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8849;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8754;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8755;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8756;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8757;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8758;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8759;\n\t\t\tcase MagentaStainedGlass::MagentaStainedGlass().ID: return 4083;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, true).ID: return 6393;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, false).ID: return 6394;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, true).ID: return 6397;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, false).ID: return 6398;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, true).ID: return 6401;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, false).ID: return 6402;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, true).ID: return 6405;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, false).ID: return 6406;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, true).ID: return 6409;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, false).ID: return 6410;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, true).ID: return 6413;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, false).ID: return 6414;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, true).ID: return 6417;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, false).ID: return 6418;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, true).ID: return 6421;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, false).ID: return 6422;\n\t\t\tcase MagentaTerracotta::MagentaTerracotta().ID: return 6313;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7625;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7626;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7627;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7628;\n\t\t\tcase MagentaWool::MagentaWool().ID: return 1385;\n\t\t\tcase MagmaBlock::MagmaBlock().ID: return 8717;\n\t\t\tcase Melon::Melon().ID: return 4747;\n\t\t\tcase MelonStem::MelonStem(0).ID: return 4764;\n\t\t\tcase MelonStem::MelonStem(1).ID: return 4765;\n\t\t\tcase MelonStem::MelonStem(2).ID: return 4766;\n\t\t\tcase MelonStem::MelonStem(3).ID: return 4767;\n\t\t\tcase MelonStem::MelonStem(4).ID: return 4768;\n\t\t\tcase MelonStem::MelonStem(5).ID: return 4769;\n\t\t\tcase MelonStem::MelonStem(6).ID: return 4770;\n\t\t\tcase MelonStem::MelonStem(7).ID: return 4771;\n\t\t\tcase MossyCobblestone::MossyCobblestone().ID: return 1432;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Top).ID: return 10278;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Bottom).ID: return 10280;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Double).ID: return 10282;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9454;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9456;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9458;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9460;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9462;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 9464;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9466;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9468;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9470;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9472;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9474;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9476;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9478;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9480;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9482;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 9484;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9486;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9488;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9490;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9492;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9494;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9496;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9498;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9500;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9502;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 9504;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9506;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9508;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9510;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9512;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9514;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9516;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9518;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9520;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9522;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 9524;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9526;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9528;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9530;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9532;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5707;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5708;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5711;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5712;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5715;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5716;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5719;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5720;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5723;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5724;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5727;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5728;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5731;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5732;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5735;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5736;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5739;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5740;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5743;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5744;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5747;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5748;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5751;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5752;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5755;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5756;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 5759;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 5760;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5763;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5764;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5767;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5768;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Top).ID: return 10266;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Bottom).ID: return 10268;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Double).ID: return 10270;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9294;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9296;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9298;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9300;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9302;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9304;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9306;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9308;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9310;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9312;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9314;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9316;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9318;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9320;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9322;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9324;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9326;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9328;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9330;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9332;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9334;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9336;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9338;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9340;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9342;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9344;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9346;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9348;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9350;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9352;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9354;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9356;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9358;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9360;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9362;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9364;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9366;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9368;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9370;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9372;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 10525;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 10526;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 10529;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 10530;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 10533;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 10534;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 10537;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 10538;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 10541;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 10542;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 10545;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 10546;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 10549;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 10550;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 10553;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 10554;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 10557;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 10558;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 10561;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 10562;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 10565;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 10566;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 10569;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 10570;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 10573;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 10574;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 10577;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 10578;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 10581;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 10582;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 10585;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 10586;\n\t\t\tcase MossyStoneBricks::MossyStoneBricks().ID: return 4482;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Normal).ID: return 1399;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Sticky).ID: return 1400;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Normal).ID: return 1401;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Sticky).ID: return 1402;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Normal).ID: return 1403;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Sticky).ID: return 1404;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Normal).ID: return 1405;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Sticky).ID: return 1406;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Normal).ID: return 1407;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Sticky).ID: return 1408;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Normal).ID: return 1409;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Sticky).ID: return 1410;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, true).ID: return 4619;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, false).ID: return 4620;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, true).ID: return 4621;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, false).ID: return 4622;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, true).ID: return 4623;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, false).ID: return 4624;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, true).ID: return 4625;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, false).ID: return 4626;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, true).ID: return 4627;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, false).ID: return 4628;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, true).ID: return 4629;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, false).ID: return 4630;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, true).ID: return 4631;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, false).ID: return 4632;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, true).ID: return 4633;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, false).ID: return 4634;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, true).ID: return 4635;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, false).ID: return 4636;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, true).ID: return 4637;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, false).ID: return 4638;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, true).ID: return 4639;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, false).ID: return 4640;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, true).ID: return 4641;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, false).ID: return 4642;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, true).ID: return 4643;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, false).ID: return 4644;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, true).ID: return 4645;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, false).ID: return 4646;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, true).ID: return 4647;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, false).ID: return 4648;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, true).ID: return 4649;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, false).ID: return 4650;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, true).ID: return 4651;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, false).ID: return 4652;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, true).ID: return 4653;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, false).ID: return 4654;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, true).ID: return 4655;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, false).ID: return 4656;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, true).ID: return 4657;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, false).ID: return 4658;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, true).ID: return 4659;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, false).ID: return 4660;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, true).ID: return 4661;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, false).ID: return 4662;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, true).ID: return 4663;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, false).ID: return 4664;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, true).ID: return 4665;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, false).ID: return 4666;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, true).ID: return 4667;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, false).ID: return 4668;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, true).ID: return 4669;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, false).ID: return 4670;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, true).ID: return 4671;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, false).ID: return 4672;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, true).ID: return 4673;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, false).ID: return 4674;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, true).ID: return 4675;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, false).ID: return 4676;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, true).ID: return 4677;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, false).ID: return 4678;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, true).ID: return 4679;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, false).ID: return 4680;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, true).ID: return 4681;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, false).ID: return 4682;\n\t\t\tcase Mycelium::Mycelium(true).ID: return 4996;\n\t\t\tcase Mycelium::Mycelium(false).ID: return 4997;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, true).ID: return 5002;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, false).ID: return 5003;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, true).ID: return 5006;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, false).ID: return 5007;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, true).ID: return 5010;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, false).ID: return 5011;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, true).ID: return 5014;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, false).ID: return 5015;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, true).ID: return 5018;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, false).ID: return 5019;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, true).ID: return 5022;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, false).ID: return 5023;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, true).ID: return 5026;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, false).ID: return 5027;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, true).ID: return 5030;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, false).ID: return 5031;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Top).ID: return 7849;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Bottom).ID: return 7851;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Double).ID: return 7853;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5033;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5035;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5037;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5039;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5041;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5043;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5045;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5047;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5049;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5051;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5053;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5055;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5057;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5059;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5061;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5063;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5065;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5067;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5069;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5071;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5073;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5075;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5077;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5079;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5081;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5083;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5085;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5087;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5089;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5091;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5093;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5095;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5097;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5099;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5101;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5103;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5105;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5107;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5109;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5111;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 10717;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 10718;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 10721;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 10722;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 10725;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 10726;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 10729;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 10730;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 10733;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 10734;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 10737;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 10738;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 10741;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 10742;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 10745;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 10746;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 10749;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 10750;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 10753;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 10754;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 10757;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 10758;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 10761;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 10762;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 10765;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 10766;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 10769;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 10770;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 10773;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 10774;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 10777;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 10778;\n\t\t\tcase NetherBricks::NetherBricks().ID: return 4999;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::X).ID: return 4000;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::Z).ID: return 4001;\n\t\t\tcase NetherQuartzOre::NetherQuartzOre().ID: return 6191;\n\t\t\tcase NetherWart::NetherWart(0).ID: return 5112;\n\t\t\tcase NetherWart::NetherWart(1).ID: return 5113;\n\t\t\tcase NetherWart::NetherWart(2).ID: return 5114;\n\t\t\tcase NetherWart::NetherWart(3).ID: return 5115;\n\t\t\tcase NetherWartBlock::NetherWartBlock().ID: return 8718;\n\t\t\tcase Netherrack::Netherrack().ID: return 3997;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, true).ID: return 248;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, false).ID: return 249;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, true).ID: return 250;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, false).ID: return 251;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, true).ID: return 252;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, false).ID: return 253;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, true).ID: return 254;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, false).ID: return 255;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, true).ID: return 256;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, false).ID: return 257;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, true).ID: return 258;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, false).ID: return 259;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, true).ID: return 260;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, false).ID: return 261;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, true).ID: return 262;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, false).ID: return 263;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, true).ID: return 264;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, false).ID: return 265;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, true).ID: return 266;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, false).ID: return 267;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, true).ID: return 268;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, false).ID: return 269;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, true).ID: return 270;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, false).ID: return 271;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, true).ID: return 272;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, false).ID: return 273;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, true).ID: return 274;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, false).ID: return 275;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, true).ID: return 276;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, false).ID: return 277;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, true).ID: return 278;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, false).ID: return 279;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, true).ID: return 280;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, false).ID: return 281;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, true).ID: return 282;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, false).ID: return 283;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, true).ID: return 284;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, false).ID: return 285;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, true).ID: return 286;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, false).ID: return 287;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, true).ID: return 288;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, false).ID: return 289;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, true).ID: return 290;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, false).ID: return 291;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, true).ID: return 292;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, false).ID: return 293;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, true).ID: return 294;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, false).ID: return 295;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, true).ID: return 296;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, false).ID: return 297;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, true).ID: return 298;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, false).ID: return 299;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, true).ID: return 300;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, false).ID: return 301;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, true).ID: return 302;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, false).ID: return 303;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, true).ID: return 304;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, false).ID: return 305;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, true).ID: return 306;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, false).ID: return 307;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, true).ID: return 308;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, false).ID: return 309;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, true).ID: return 310;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, false).ID: return 311;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, true).ID: return 312;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, false).ID: return 313;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, true).ID: return 314;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, false).ID: return 315;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, true).ID: return 316;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, false).ID: return 317;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, true).ID: return 318;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, false).ID: return 319;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, true).ID: return 320;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, false).ID: return 321;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, true).ID: return 322;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, false).ID: return 323;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, true).ID: return 324;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, false).ID: return 325;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, true).ID: return 326;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, false).ID: return 327;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, true).ID: return 328;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, false).ID: return 329;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, true).ID: return 330;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, false).ID: return 331;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, true).ID: return 332;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, false).ID: return 333;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, true).ID: return 334;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, false).ID: return 335;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, true).ID: return 336;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, false).ID: return 337;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, true).ID: return 338;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, false).ID: return 339;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, true).ID: return 340;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, false).ID: return 341;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, true).ID: return 342;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, false).ID: return 343;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, true).ID: return 344;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, false).ID: return 345;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, true).ID: return 346;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, false).ID: return 347;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, true).ID: return 348;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, false).ID: return 349;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, true).ID: return 350;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, false).ID: return 351;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, true).ID: return 352;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, false).ID: return 353;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, true).ID: return 354;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, false).ID: return 355;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, true).ID: return 356;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, false).ID: return 357;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, true).ID: return 358;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, false).ID: return 359;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, true).ID: return 360;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, false).ID: return 361;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, true).ID: return 362;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, false).ID: return 363;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, true).ID: return 364;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, false).ID: return 365;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, true).ID: return 366;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, false).ID: return 367;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, true).ID: return 368;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, false).ID: return 369;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, true).ID: return 370;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, false).ID: return 371;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, true).ID: return 372;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, false).ID: return 373;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, true).ID: return 374;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, false).ID: return 375;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, true).ID: return 376;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, false).ID: return 377;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, true).ID: return 378;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, false).ID: return 379;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, true).ID: return 380;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, false).ID: return 381;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, true).ID: return 382;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, false).ID: return 383;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, true).ID: return 384;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, false).ID: return 385;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, true).ID: return 386;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, false).ID: return 387;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, true).ID: return 388;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, false).ID: return 389;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, true).ID: return 390;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, false).ID: return 391;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, true).ID: return 392;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, false).ID: return 393;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, true).ID: return 394;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, false).ID: return 395;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, true).ID: return 396;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, false).ID: return 397;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, true).ID: return 398;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, false).ID: return 399;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, true).ID: return 400;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, false).ID: return 401;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, true).ID: return 402;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, false).ID: return 403;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, true).ID: return 404;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, false).ID: return 405;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, true).ID: return 406;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, false).ID: return 407;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, true).ID: return 408;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, false).ID: return 409;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, true).ID: return 410;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, false).ID: return 411;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, true).ID: return 412;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, false).ID: return 413;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, true).ID: return 414;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, false).ID: return 415;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, true).ID: return 416;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, false).ID: return 417;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, true).ID: return 418;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, false).ID: return 419;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, true).ID: return 420;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, false).ID: return 421;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, true).ID: return 422;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, false).ID: return 423;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, true).ID: return 424;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, false).ID: return 425;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, true).ID: return 426;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, false).ID: return 427;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, true).ID: return 428;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, false).ID: return 429;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, true).ID: return 430;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, false).ID: return 431;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, true).ID: return 432;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, false).ID: return 433;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, true).ID: return 434;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, false).ID: return 435;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, true).ID: return 436;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, false).ID: return 437;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, true).ID: return 438;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, false).ID: return 439;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, true).ID: return 440;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, false).ID: return 441;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, true).ID: return 442;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, false).ID: return 443;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, true).ID: return 444;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, false).ID: return 445;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, true).ID: return 446;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, false).ID: return 447;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, true).ID: return 448;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, false).ID: return 449;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, true).ID: return 450;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, false).ID: return 451;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, true).ID: return 452;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, false).ID: return 453;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, true).ID: return 454;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, false).ID: return 455;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, true).ID: return 456;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, false).ID: return 457;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, true).ID: return 458;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, false).ID: return 459;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, true).ID: return 460;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, false).ID: return 461;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, true).ID: return 462;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, false).ID: return 463;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, true).ID: return 464;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, false).ID: return 465;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, true).ID: return 466;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, false).ID: return 467;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, true).ID: return 468;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, false).ID: return 469;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, true).ID: return 470;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, false).ID: return 471;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, true).ID: return 472;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, false).ID: return 473;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, true).ID: return 474;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, false).ID: return 475;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, true).ID: return 476;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, false).ID: return 477;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, true).ID: return 478;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, false).ID: return 479;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, true).ID: return 480;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, false).ID: return 481;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, true).ID: return 482;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, false).ID: return 483;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, true).ID: return 484;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, false).ID: return 485;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, true).ID: return 486;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, false).ID: return 487;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, true).ID: return 488;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, false).ID: return 489;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, true).ID: return 490;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, false).ID: return 491;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, true).ID: return 492;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, false).ID: return 493;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, true).ID: return 494;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, false).ID: return 495;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, true).ID: return 496;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, false).ID: return 497;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, true).ID: return 498;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, false).ID: return 499;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, true).ID: return 500;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, false).ID: return 501;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, true).ID: return 502;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, false).ID: return 503;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, true).ID: return 504;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, false).ID: return 505;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, true).ID: return 506;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, false).ID: return 507;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, true).ID: return 508;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, false).ID: return 509;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, true).ID: return 510;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, false).ID: return 511;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, true).ID: return 512;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, false).ID: return 513;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, true).ID: return 514;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, false).ID: return 515;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, true).ID: return 516;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, false).ID: return 517;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, true).ID: return 518;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, false).ID: return 519;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, true).ID: return 520;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, false).ID: return 521;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, true).ID: return 522;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, false).ID: return 523;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, true).ID: return 524;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, false).ID: return 525;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, true).ID: return 526;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, false).ID: return 527;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, true).ID: return 528;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, false).ID: return 529;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, true).ID: return 530;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, false).ID: return 531;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, true).ID: return 532;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, false).ID: return 533;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, true).ID: return 534;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, false).ID: return 535;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, true).ID: return 536;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, false).ID: return 537;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, true).ID: return 538;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, false).ID: return 539;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, true).ID: return 540;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, false).ID: return 541;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, true).ID: return 542;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, false).ID: return 543;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, true).ID: return 544;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, false).ID: return 545;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, true).ID: return 546;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, false).ID: return 547;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, true).ID: return 548;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, false).ID: return 549;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, true).ID: return 550;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, false).ID: return 551;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, true).ID: return 552;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, false).ID: return 553;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, true).ID: return 554;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, false).ID: return 555;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, true).ID: return 556;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, false).ID: return 557;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, true).ID: return 558;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, false).ID: return 559;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, true).ID: return 560;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, false).ID: return 561;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, true).ID: return 562;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, false).ID: return 563;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, true).ID: return 564;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, false).ID: return 565;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, true).ID: return 566;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, false).ID: return 567;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, true).ID: return 568;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, false).ID: return 569;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, true).ID: return 570;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, false).ID: return 571;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, true).ID: return 572;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, false).ID: return 573;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, true).ID: return 574;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, false).ID: return 575;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, true).ID: return 576;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, false).ID: return 577;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, true).ID: return 578;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, false).ID: return 579;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, true).ID: return 580;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, false).ID: return 581;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, true).ID: return 582;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, false).ID: return 583;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, true).ID: return 584;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, false).ID: return 585;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, true).ID: return 586;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, false).ID: return 587;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, true).ID: return 588;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, false).ID: return 589;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, true).ID: return 590;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, false).ID: return 591;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, true).ID: return 592;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, false).ID: return 593;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, true).ID: return 594;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, false).ID: return 595;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, true).ID: return 596;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, false).ID: return 597;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, true).ID: return 598;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, false).ID: return 599;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, true).ID: return 600;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, false).ID: return 601;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, true).ID: return 602;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, false).ID: return 603;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, true).ID: return 604;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, false).ID: return 605;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, true).ID: return 606;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, false).ID: return 607;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, true).ID: return 608;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, false).ID: return 609;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, true).ID: return 610;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, false).ID: return 611;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, true).ID: return 612;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, false).ID: return 613;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, true).ID: return 614;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, false).ID: return 615;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, true).ID: return 616;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, false).ID: return 617;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, true).ID: return 618;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, false).ID: return 619;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, true).ID: return 620;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, false).ID: return 621;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, true).ID: return 622;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, false).ID: return 623;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, true).ID: return 624;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, false).ID: return 625;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, true).ID: return 626;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, false).ID: return 627;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, true).ID: return 628;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, false).ID: return 629;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, true).ID: return 630;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, false).ID: return 631;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, true).ID: return 632;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, false).ID: return 633;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, true).ID: return 634;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, false).ID: return 635;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, true).ID: return 636;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, false).ID: return 637;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, true).ID: return 638;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, false).ID: return 639;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, true).ID: return 640;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, false).ID: return 641;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, true).ID: return 642;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, false).ID: return 643;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, true).ID: return 644;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, false).ID: return 645;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, true).ID: return 646;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, false).ID: return 647;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, true).ID: return 648;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, false).ID: return 649;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, true).ID: return 650;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, false).ID: return 651;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, true).ID: return 652;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, false).ID: return 653;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, true).ID: return 654;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, false).ID: return 655;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, true).ID: return 656;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, false).ID: return 657;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, true).ID: return 658;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, false).ID: return 659;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, true).ID: return 660;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, false).ID: return 661;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, true).ID: return 662;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, false).ID: return 663;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, true).ID: return 664;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, false).ID: return 665;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, true).ID: return 666;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, false).ID: return 667;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, true).ID: return 668;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, false).ID: return 669;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, true).ID: return 670;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, false).ID: return 671;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, true).ID: return 672;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, false).ID: return 673;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, true).ID: return 674;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, false).ID: return 675;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, true).ID: return 676;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, false).ID: return 677;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, true).ID: return 678;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, false).ID: return 679;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, true).ID: return 680;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, false).ID: return 681;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, true).ID: return 682;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, false).ID: return 683;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, true).ID: return 684;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, false).ID: return 685;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, true).ID: return 686;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, false).ID: return 687;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, true).ID: return 688;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, false).ID: return 689;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, true).ID: return 690;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, false).ID: return 691;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, true).ID: return 692;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, false).ID: return 693;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, true).ID: return 694;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, false).ID: return 695;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, true).ID: return 696;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, false).ID: return 697;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, true).ID: return 698;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, false).ID: return 699;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, true).ID: return 700;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, false).ID: return 701;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, true).ID: return 702;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, false).ID: return 703;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, true).ID: return 704;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, false).ID: return 705;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, true).ID: return 706;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, false).ID: return 707;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, true).ID: return 708;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, false).ID: return 709;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, true).ID: return 710;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, false).ID: return 711;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, true).ID: return 712;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, false).ID: return 713;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, true).ID: return 714;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, false).ID: return 715;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, true).ID: return 716;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, false).ID: return 717;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, true).ID: return 718;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, false).ID: return 719;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, true).ID: return 720;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, false).ID: return 721;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, true).ID: return 722;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, false).ID: return 723;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, true).ID: return 724;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, false).ID: return 725;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, true).ID: return 726;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, false).ID: return 727;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, true).ID: return 728;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, false).ID: return 729;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, true).ID: return 730;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, false).ID: return 731;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, true).ID: return 732;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, false).ID: return 733;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, true).ID: return 734;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, false).ID: return 735;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, true).ID: return 736;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, false).ID: return 737;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, true).ID: return 738;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, false).ID: return 739;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, true).ID: return 740;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, false).ID: return 741;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, true).ID: return 742;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, false).ID: return 743;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, true).ID: return 744;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, false).ID: return 745;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, true).ID: return 746;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, false).ID: return 747;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 0, true).ID: return 748;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 0, false).ID: return 749;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 1, true).ID: return 750;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 1, false).ID: return 751;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 2, true).ID: return 752;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 2, false).ID: return 753;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 3, true).ID: return 754;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 3, false).ID: return 755;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 4, true).ID: return 756;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 4, false).ID: return 757;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 5, true).ID: return 758;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 5, false).ID: return 759;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 6, true).ID: return 760;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 6, false).ID: return 761;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 7, true).ID: return 762;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 7, false).ID: return 763;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 8, true).ID: return 764;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 8, false).ID: return 765;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 9, true).ID: return 766;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 9, false).ID: return 767;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 10, true).ID: return 768;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 10, false).ID: return 769;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 11, true).ID: return 770;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 11, false).ID: return 771;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 12, true).ID: return 772;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 12, false).ID: return 773;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 13, true).ID: return 774;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 13, false).ID: return 775;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 14, true).ID: return 776;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 14, false).ID: return 777;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 15, true).ID: return 778;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 15, false).ID: return 779;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 16, true).ID: return 780;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 16, false).ID: return 781;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 17, true).ID: return 782;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 17, false).ID: return 783;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 18, true).ID: return 784;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 18, false).ID: return 785;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 19, true).ID: return 786;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 19, false).ID: return 787;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 20, true).ID: return 788;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 20, false).ID: return 789;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 21, true).ID: return 790;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 21, false).ID: return 791;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 22, true).ID: return 792;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 22, false).ID: return 793;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 23, true).ID: return 794;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 23, false).ID: return 795;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 24, true).ID: return 796;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 24, false).ID: return 797;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 0, true).ID: return 798;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 0, false).ID: return 799;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 1, true).ID: return 800;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 1, false).ID: return 801;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 2, true).ID: return 802;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 2, false).ID: return 803;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 3, true).ID: return 804;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 3, false).ID: return 805;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 4, true).ID: return 806;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 4, false).ID: return 807;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 5, true).ID: return 808;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 5, false).ID: return 809;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 6, true).ID: return 810;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 6, false).ID: return 811;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 7, true).ID: return 812;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 7, false).ID: return 813;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 8, true).ID: return 814;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 8, false).ID: return 815;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 9, true).ID: return 816;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 9, false).ID: return 817;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 10, true).ID: return 818;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 10, false).ID: return 819;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 11, true).ID: return 820;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 11, false).ID: return 821;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 12, true).ID: return 822;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 12, false).ID: return 823;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 13, true).ID: return 824;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 13, false).ID: return 825;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 14, true).ID: return 826;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 14, false).ID: return 827;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 15, true).ID: return 828;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 15, false).ID: return 829;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 16, true).ID: return 830;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 16, false).ID: return 831;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 17, true).ID: return 832;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 17, false).ID: return 833;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 18, true).ID: return 834;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 18, false).ID: return 835;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 19, true).ID: return 836;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 19, false).ID: return 837;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 20, true).ID: return 838;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 20, false).ID: return 839;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 21, true).ID: return 840;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 21, false).ID: return 841;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 22, true).ID: return 842;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 22, false).ID: return 843;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 23, true).ID: return 844;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 23, false).ID: return 845;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 24, true).ID: return 846;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 24, false).ID: return 847;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 0, true).ID: return 848;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 0, false).ID: return 849;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 1, true).ID: return 850;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 1, false).ID: return 851;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 2, true).ID: return 852;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 2, false).ID: return 853;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 3, true).ID: return 854;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 3, false).ID: return 855;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 4, true).ID: return 856;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 4, false).ID: return 857;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 5, true).ID: return 858;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 5, false).ID: return 859;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 6, true).ID: return 860;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 6, false).ID: return 861;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 7, true).ID: return 862;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 7, false).ID: return 863;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 8, true).ID: return 864;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 8, false).ID: return 865;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 9, true).ID: return 866;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 9, false).ID: return 867;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 10, true).ID: return 868;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 10, false).ID: return 869;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 11, true).ID: return 870;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 11, false).ID: return 871;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 12, true).ID: return 872;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 12, false).ID: return 873;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 13, true).ID: return 874;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 13, false).ID: return 875;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 14, true).ID: return 876;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 14, false).ID: return 877;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 15, true).ID: return 878;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 15, false).ID: return 879;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 16, true).ID: return 880;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 16, false).ID: return 881;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 17, true).ID: return 882;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 17, false).ID: return 883;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 18, true).ID: return 884;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 18, false).ID: return 885;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 19, true).ID: return 886;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 19, false).ID: return 887;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 20, true).ID: return 888;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 20, false).ID: return 889;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 21, true).ID: return 890;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 21, false).ID: return 891;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 22, true).ID: return 892;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 22, false).ID: return 893;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 23, true).ID: return 894;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 23, false).ID: return 895;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 24, true).ID: return 896;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 24, false).ID: return 897;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 0, true).ID: return 898;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 0, false).ID: return 899;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 1, true).ID: return 900;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 1, false).ID: return 901;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 2, true).ID: return 902;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 2, false).ID: return 903;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 3, true).ID: return 904;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 3, false).ID: return 905;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 4, true).ID: return 906;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 4, false).ID: return 907;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 5, true).ID: return 908;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 5, false).ID: return 909;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 6, true).ID: return 910;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 6, false).ID: return 911;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 7, true).ID: return 912;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 7, false).ID: return 913;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 8, true).ID: return 914;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 8, false).ID: return 915;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 9, true).ID: return 916;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 9, false).ID: return 917;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 10, true).ID: return 918;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 10, false).ID: return 919;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 11, true).ID: return 920;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 11, false).ID: return 921;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 12, true).ID: return 922;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 12, false).ID: return 923;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 13, true).ID: return 924;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 13, false).ID: return 925;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 14, true).ID: return 926;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 14, false).ID: return 927;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 15, true).ID: return 928;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 15, false).ID: return 929;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 16, true).ID: return 930;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 16, false).ID: return 931;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 17, true).ID: return 932;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 17, false).ID: return 933;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 18, true).ID: return 934;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 18, false).ID: return 935;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 19, true).ID: return 936;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 19, false).ID: return 937;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 20, true).ID: return 938;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 20, false).ID: return 939;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 21, true).ID: return 940;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 21, false).ID: return 941;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 22, true).ID: return 942;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 22, false).ID: return 943;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 23, true).ID: return 944;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 23, false).ID: return 945;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 24, true).ID: return 946;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 24, false).ID: return 947;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 0, true).ID: return 948;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 0, false).ID: return 949;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 1, true).ID: return 950;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 1, false).ID: return 951;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 2, true).ID: return 952;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 2, false).ID: return 953;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 3, true).ID: return 954;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 3, false).ID: return 955;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 4, true).ID: return 956;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 4, false).ID: return 957;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 5, true).ID: return 958;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 5, false).ID: return 959;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 6, true).ID: return 960;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 6, false).ID: return 961;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 7, true).ID: return 962;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 7, false).ID: return 963;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 8, true).ID: return 964;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 8, false).ID: return 965;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 9, true).ID: return 966;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 9, false).ID: return 967;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 10, true).ID: return 968;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 10, false).ID: return 969;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 11, true).ID: return 970;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 11, false).ID: return 971;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 12, true).ID: return 972;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 12, false).ID: return 973;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 13, true).ID: return 974;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 13, false).ID: return 975;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 14, true).ID: return 976;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 14, false).ID: return 977;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 15, true).ID: return 978;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 15, false).ID: return 979;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 16, true).ID: return 980;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 16, false).ID: return 981;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 17, true).ID: return 982;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 17, false).ID: return 983;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 18, true).ID: return 984;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 18, false).ID: return 985;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 19, true).ID: return 986;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 19, false).ID: return 987;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 20, true).ID: return 988;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 20, false).ID: return 989;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 21, true).ID: return 990;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 21, false).ID: return 991;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 22, true).ID: return 992;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 22, false).ID: return 993;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 23, true).ID: return 994;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 23, false).ID: return 995;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 24, true).ID: return 996;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 24, false).ID: return 997;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 0, true).ID: return 998;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 0, false).ID: return 999;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 1, true).ID: return 1000;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 1, false).ID: return 1001;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 2, true).ID: return 1002;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 2, false).ID: return 1003;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 3, true).ID: return 1004;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 3, false).ID: return 1005;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 4, true).ID: return 1006;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 4, false).ID: return 1007;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 5, true).ID: return 1008;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 5, false).ID: return 1009;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 6, true).ID: return 1010;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 6, false).ID: return 1011;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 7, true).ID: return 1012;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 7, false).ID: return 1013;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 8, true).ID: return 1014;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 8, false).ID: return 1015;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 9, true).ID: return 1016;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 9, false).ID: return 1017;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 10, true).ID: return 1018;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 10, false).ID: return 1019;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 11, true).ID: return 1020;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 11, false).ID: return 1021;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 12, true).ID: return 1022;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 12, false).ID: return 1023;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 13, true).ID: return 1024;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 13, false).ID: return 1025;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 14, true).ID: return 1026;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 14, false).ID: return 1027;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 15, true).ID: return 1028;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 15, false).ID: return 1029;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 16, true).ID: return 1030;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 16, false).ID: return 1031;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 17, true).ID: return 1032;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 17, false).ID: return 1033;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 18, true).ID: return 1034;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 18, false).ID: return 1035;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 19, true).ID: return 1036;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 19, false).ID: return 1037;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 20, true).ID: return 1038;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 20, false).ID: return 1039;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 21, true).ID: return 1040;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 21, false).ID: return 1041;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 22, true).ID: return 1042;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 22, false).ID: return 1043;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 23, true).ID: return 1044;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 23, false).ID: return 1045;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 24, true).ID: return 1046;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 24, false).ID: return 1047;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5810;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5811;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5812;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5813;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5814;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5815;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5816;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5817;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5818;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5819;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5820;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5821;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5822;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5823;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5824;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5825;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5826;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5827;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5828;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5829;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5830;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5831;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5832;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5833;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3571;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3572;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3573;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3574;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3575;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3576;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3577;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3578;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3579;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3580;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3581;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3582;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3583;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3584;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3585;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3586;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3587;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3588;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3589;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3590;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3591;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3592;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3593;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3594;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3595;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3596;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3597;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3598;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3599;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3600;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3601;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3602;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3603;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3604;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3605;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3606;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3607;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3608;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3609;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3610;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3611;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3612;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3613;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3614;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3615;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3616;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3617;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3618;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3619;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3620;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3621;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3622;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3623;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3624;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3625;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3626;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3627;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3628;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3629;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3630;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3631;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3632;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3633;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3634;\n\t\t\tcase OakFence::OakFence(true, true, true, true).ID: return 3966;\n\t\t\tcase OakFence::OakFence(true, true, true, false).ID: return 3967;\n\t\t\tcase OakFence::OakFence(true, true, false, true).ID: return 3970;\n\t\t\tcase OakFence::OakFence(true, true, false, false).ID: return 3971;\n\t\t\tcase OakFence::OakFence(true, false, true, true).ID: return 3974;\n\t\t\tcase OakFence::OakFence(true, false, true, false).ID: return 3975;\n\t\t\tcase OakFence::OakFence(true, false, false, true).ID: return 3978;\n\t\t\tcase OakFence::OakFence(true, false, false, false).ID: return 3979;\n\t\t\tcase OakFence::OakFence(false, true, true, true).ID: return 3982;\n\t\t\tcase OakFence::OakFence(false, true, true, false).ID: return 3983;\n\t\t\tcase OakFence::OakFence(false, true, false, true).ID: return 3986;\n\t\t\tcase OakFence::OakFence(false, true, false, false).ID: return 3987;\n\t\t\tcase OakFence::OakFence(false, false, true, true).ID: return 3990;\n\t\t\tcase OakFence::OakFence(false, false, true, false).ID: return 3991;\n\t\t\tcase OakFence::OakFence(false, false, false, true).ID: return 3994;\n\t\t\tcase OakFence::OakFence(false, false, false, false).ID: return 3995;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 4804;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 4805;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 4806;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 4807;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 4808;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 4809;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 4810;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 4811;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 4812;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 4813;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 4814;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 4815;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 4816;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 4817;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 4818;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 4819;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 4820;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 4821;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 4822;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 4823;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 4824;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 4825;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 4826;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 4827;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 4828;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 4829;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 4830;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 4831;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 4832;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 4833;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 4834;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 4835;\n\t\t\tcase OakLeaves::OakLeaves(1, true).ID: return 144;\n\t\t\tcase OakLeaves::OakLeaves(1, false).ID: return 145;\n\t\t\tcase OakLeaves::OakLeaves(2, true).ID: return 146;\n\t\t\tcase OakLeaves::OakLeaves(2, false).ID: return 147;\n\t\t\tcase OakLeaves::OakLeaves(3, true).ID: return 148;\n\t\t\tcase OakLeaves::OakLeaves(3, false).ID: return 149;\n\t\t\tcase OakLeaves::OakLeaves(4, true).ID: return 150;\n\t\t\tcase OakLeaves::OakLeaves(4, false).ID: return 151;\n\t\t\tcase OakLeaves::OakLeaves(5, true).ID: return 152;\n\t\t\tcase OakLeaves::OakLeaves(5, false).ID: return 153;\n\t\t\tcase OakLeaves::OakLeaves(6, true).ID: return 154;\n\t\t\tcase OakLeaves::OakLeaves(6, false).ID: return 155;\n\t\t\tcase OakLeaves::OakLeaves(7, true).ID: return 156;\n\t\t\tcase OakLeaves::OakLeaves(7, false).ID: return 157;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::X).ID: return 72;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Y).ID: return 73;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Z).ID: return 74;\n\t\t\tcase OakPlanks::OakPlanks().ID: return 15;\n\t\t\tcase OakPressurePlate::OakPressurePlate(true).ID: return 3871;\n\t\t\tcase OakPressurePlate::OakPressurePlate(false).ID: return 3872;\n\t\t\tcase OakSapling::OakSapling(0).ID: return 21;\n\t\t\tcase OakSapling::OakSapling(1).ID: return 22;\n\t\t\tcase OakSign::OakSign(0).ID: return 3380;\n\t\t\tcase OakSign::OakSign(1).ID: return 3382;\n\t\t\tcase OakSign::OakSign(2).ID: return 3384;\n\t\t\tcase OakSign::OakSign(3).ID: return 3386;\n\t\t\tcase OakSign::OakSign(4).ID: return 3388;\n\t\t\tcase OakSign::OakSign(5).ID: return 3390;\n\t\t\tcase OakSign::OakSign(6).ID: return 3392;\n\t\t\tcase OakSign::OakSign(7).ID: return 3394;\n\t\t\tcase OakSign::OakSign(8).ID: return 3396;\n\t\t\tcase OakSign::OakSign(9).ID: return 3398;\n\t\t\tcase OakSign::OakSign(10).ID: return 3400;\n\t\t\tcase OakSign::OakSign(11).ID: return 3402;\n\t\t\tcase OakSign::OakSign(12).ID: return 3404;\n\t\t\tcase OakSign::OakSign(13).ID: return 3406;\n\t\t\tcase OakSign::OakSign(14).ID: return 3408;\n\t\t\tcase OakSign::OakSign(15).ID: return 3410;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Top).ID: return 7765;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Bottom).ID: return 7767;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Double).ID: return 7769;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1953;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1955;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1957;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1959;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1961;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1963;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1965;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1967;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1969;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1971;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1973;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1975;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1977;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1979;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1981;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1983;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1985;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1987;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1989;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1991;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1993;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1995;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1997;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1999;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 2001;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 2003;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 2005;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 2007;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 2009;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 2011;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 2013;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 2015;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 2017;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 2019;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 2021;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 2023;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 2025;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 2027;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 2029;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 2031;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, true).ID: return 4098;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, false).ID: return 4100;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, true).ID: return 4102;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, false).ID: return 4104;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, true).ID: return 4106;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, false).ID: return 4108;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, true).ID: return 4110;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, false).ID: return 4112;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, true).ID: return 4114;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, false).ID: return 4116;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, true).ID: return 4118;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, false).ID: return 4120;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, true).ID: return 4122;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, false).ID: return 4124;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, true).ID: return 4126;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, false).ID: return 4128;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, true).ID: return 4130;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, false).ID: return 4132;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, true).ID: return 4134;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, false).ID: return 4136;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, true).ID: return 4138;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, false).ID: return 4140;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, true).ID: return 4142;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, false).ID: return 4144;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, true).ID: return 4146;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, false).ID: return 4148;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, true).ID: return 4150;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, false).ID: return 4152;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, true).ID: return 4154;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, false).ID: return 4156;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, true).ID: return 4158;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, false).ID: return 4160;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3734;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3736;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3738;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3740;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::X).ID: return 108;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Y).ID: return 109;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Z).ID: return 110;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, true).ID: return 8724;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, false).ID: return 8725;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, true).ID: return 8726;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, false).ID: return 8727;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, true).ID: return 8728;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, false).ID: return 8729;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, true).ID: return 8730;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, false).ID: return 8731;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, true).ID: return 8732;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, false).ID: return 8733;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, true).ID: return 8734;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, false).ID: return 8735;\n\t\t\tcase Obsidian::Obsidian().ID: return 1433;\n\t\t\tcase OrangeBanner::OrangeBanner(0).ID: return 7377;\n\t\t\tcase OrangeBanner::OrangeBanner(1).ID: return 7378;\n\t\t\tcase OrangeBanner::OrangeBanner(2).ID: return 7379;\n\t\t\tcase OrangeBanner::OrangeBanner(3).ID: return 7380;\n\t\t\tcase OrangeBanner::OrangeBanner(4).ID: return 7381;\n\t\t\tcase OrangeBanner::OrangeBanner(5).ID: return 7382;\n\t\t\tcase OrangeBanner::OrangeBanner(6).ID: return 7383;\n\t\t\tcase OrangeBanner::OrangeBanner(7).ID: return 7384;\n\t\t\tcase OrangeBanner::OrangeBanner(8).ID: return 7385;\n\t\t\tcase OrangeBanner::OrangeBanner(9).ID: return 7386;\n\t\t\tcase OrangeBanner::OrangeBanner(10).ID: return 7387;\n\t\t\tcase OrangeBanner::OrangeBanner(11).ID: return 7388;\n\t\t\tcase OrangeBanner::OrangeBanner(12).ID: return 7389;\n\t\t\tcase OrangeBanner::OrangeBanner(13).ID: return 7390;\n\t\t\tcase OrangeBanner::OrangeBanner(14).ID: return 7391;\n\t\t\tcase OrangeBanner::OrangeBanner(15).ID: return 7392;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Head).ID: return 1064;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Foot).ID: return 1065;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Head).ID: return 1066;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Foot).ID: return 1067;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Head).ID: return 1068;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Foot).ID: return 1069;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Head).ID: return 1070;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Foot).ID: return 1071;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Head).ID: return 1072;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Foot).ID: return 1073;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Head).ID: return 1074;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Foot).ID: return 1075;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Head).ID: return 1076;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Foot).ID: return 1077;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Head).ID: return 1078;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Foot).ID: return 1079;\n\t\t\tcase OrangeCarpet::OrangeCarpet().ID: return 7331;\n\t\t\tcase OrangeConcrete::OrangeConcrete().ID: return 8903;\n\t\t\tcase OrangeConcretePowder::OrangeConcretePowder().ID: return 8919;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8842;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8843;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8844;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8845;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8748;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8749;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8750;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8751;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8752;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8753;\n\t\t\tcase OrangeStainedGlass::OrangeStainedGlass().ID: return 4082;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, true).ID: return 6361;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, false).ID: return 6362;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, true).ID: return 6365;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, false).ID: return 6366;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, true).ID: return 6369;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, false).ID: return 6370;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, true).ID: return 6373;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, false).ID: return 6374;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, true).ID: return 6377;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, false).ID: return 6378;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, true).ID: return 6381;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, false).ID: return 6382;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, true).ID: return 6385;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, false).ID: return 6386;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, true).ID: return 6389;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, false).ID: return 6390;\n\t\t\tcase OrangeTerracotta::OrangeTerracotta().ID: return 6312;\n\t\t\tcase OrangeTulip::OrangeTulip().ID: return 1417;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7621;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7622;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7623;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7624;\n\t\t\tcase OrangeWool::OrangeWool().ID: return 1384;\n\t\t\tcase OxeyeDaisy::OxeyeDaisy().ID: return 1420;\n\t\t\tcase PackedIce::PackedIce().ID: return 7348;\n\t\t\tcase Peony::Peony(Peony::Half::Upper).ID: return 7355;\n\t\t\tcase Peony::Peony(Peony::Half::Lower).ID: return 7356;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Top).ID: return 7825;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Bottom).ID: return 7827;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Double).ID: return 7829;\n\t\t\tcase PinkBanner::PinkBanner(0).ID: return 7457;\n\t\t\tcase PinkBanner::PinkBanner(1).ID: return 7458;\n\t\t\tcase PinkBanner::PinkBanner(2).ID: return 7459;\n\t\t\tcase PinkBanner::PinkBanner(3).ID: return 7460;\n\t\t\tcase PinkBanner::PinkBanner(4).ID: return 7461;\n\t\t\tcase PinkBanner::PinkBanner(5).ID: return 7462;\n\t\t\tcase PinkBanner::PinkBanner(6).ID: return 7463;\n\t\t\tcase PinkBanner::PinkBanner(7).ID: return 7464;\n\t\t\tcase PinkBanner::PinkBanner(8).ID: return 7465;\n\t\t\tcase PinkBanner::PinkBanner(9).ID: return 7466;\n\t\t\tcase PinkBanner::PinkBanner(10).ID: return 7467;\n\t\t\tcase PinkBanner::PinkBanner(11).ID: return 7468;\n\t\t\tcase PinkBanner::PinkBanner(12).ID: return 7469;\n\t\t\tcase PinkBanner::PinkBanner(13).ID: return 7470;\n\t\t\tcase PinkBanner::PinkBanner(14).ID: return 7471;\n\t\t\tcase PinkBanner::PinkBanner(15).ID: return 7472;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Head).ID: return 1144;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Foot).ID: return 1145;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Head).ID: return 1146;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Foot).ID: return 1147;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Head).ID: return 1148;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Foot).ID: return 1149;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Head).ID: return 1150;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Foot).ID: return 1151;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Head).ID: return 1152;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Foot).ID: return 1153;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Head).ID: return 1154;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Foot).ID: return 1155;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Head).ID: return 1156;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Foot).ID: return 1157;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Head).ID: return 1158;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Foot).ID: return 1159;\n\t\t\tcase PinkCarpet::PinkCarpet().ID: return 7336;\n\t\t\tcase PinkConcrete::PinkConcrete().ID: return 8908;\n\t\t\tcase PinkConcretePowder::PinkConcretePowder().ID: return 8924;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8862;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8863;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8864;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8865;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8778;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8779;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8780;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8781;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8782;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8783;\n\t\t\tcase PinkStainedGlass::PinkStainedGlass().ID: return 4087;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, true).ID: return 6521;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, false).ID: return 6522;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, true).ID: return 6525;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, false).ID: return 6526;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, true).ID: return 6529;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, false).ID: return 6530;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, true).ID: return 6533;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, false).ID: return 6534;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, true).ID: return 6537;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, false).ID: return 6538;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, true).ID: return 6541;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, false).ID: return 6542;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, true).ID: return 6545;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, false).ID: return 6546;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, true).ID: return 6549;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, false).ID: return 6550;\n\t\t\tcase PinkTerracotta::PinkTerracotta().ID: return 6317;\n\t\t\tcase PinkTulip::PinkTulip().ID: return 1419;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7641;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7642;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7643;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7644;\n\t\t\tcase PinkWool::PinkWool().ID: return 1389;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1347;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1348;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1349;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1350;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1351;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1352;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1353;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1354;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1355;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1356;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1357;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1358;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Normal).ID: return 1359;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Sticky).ID: return 1360;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Normal).ID: return 1361;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Sticky).ID: return 1362;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Normal).ID: return 1363;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Sticky).ID: return 1364;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Normal).ID: return 1365;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Sticky).ID: return 1366;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Normal).ID: return 1367;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Sticky).ID: return 1368;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Normal).ID: return 1369;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Sticky).ID: return 1370;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Normal).ID: return 1371;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Sticky).ID: return 1372;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Normal).ID: return 1373;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Sticky).ID: return 1374;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Normal).ID: return 1375;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Sticky).ID: return 1376;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Normal).ID: return 1377;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Sticky).ID: return 1378;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Normal).ID: return 1379;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Sticky).ID: return 1380;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Normal).ID: return 1381;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Sticky).ID: return 1382;\n\t\t\tcase PlayerHead::PlayerHead(0).ID: return 6014;\n\t\t\tcase PlayerHead::PlayerHead(1).ID: return 6015;\n\t\t\tcase PlayerHead::PlayerHead(2).ID: return 6016;\n\t\t\tcase PlayerHead::PlayerHead(3).ID: return 6017;\n\t\t\tcase PlayerHead::PlayerHead(4).ID: return 6018;\n\t\t\tcase PlayerHead::PlayerHead(5).ID: return 6019;\n\t\t\tcase PlayerHead::PlayerHead(6).ID: return 6020;\n\t\t\tcase PlayerHead::PlayerHead(7).ID: return 6021;\n\t\t\tcase PlayerHead::PlayerHead(8).ID: return 6022;\n\t\t\tcase PlayerHead::PlayerHead(9).ID: return 6023;\n\t\t\tcase PlayerHead::PlayerHead(10).ID: return 6024;\n\t\t\tcase PlayerHead::PlayerHead(11).ID: return 6025;\n\t\t\tcase PlayerHead::PlayerHead(12).ID: return 6026;\n\t\t\tcase PlayerHead::PlayerHead(13).ID: return 6027;\n\t\t\tcase PlayerHead::PlayerHead(14).ID: return 6028;\n\t\t\tcase PlayerHead::PlayerHead(15).ID: return 6029;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6030;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6031;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6032;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6033;\n\t\t\tcase Podzol::Podzol(true).ID: return 12;\n\t\t\tcase Podzol::Podzol(false).ID: return 13;\n\t\t\tcase PolishedAndesite::PolishedAndesite().ID: return 7;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Top).ID: return 10320;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Bottom).ID: return 10322;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Double).ID: return 10324;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10094;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10096;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10098;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10100;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10102;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10104;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10106;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10108;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10110;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10112;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10114;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10116;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10118;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10120;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10122;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10124;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10126;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10128;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10130;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10132;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10134;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10136;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10138;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10140;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10142;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10144;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10146;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10148;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10150;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10152;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10154;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10156;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10158;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10160;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10162;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10164;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10166;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10168;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10170;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10172;\n\t\t\tcase PolishedDiorite::PolishedDiorite().ID: return 5;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Top).ID: return 10272;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Bottom).ID: return 10274;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Double).ID: return 10276;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9374;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9376;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9378;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9380;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9382;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9384;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9386;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9388;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9390;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9392;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9394;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9396;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9398;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9400;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9402;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9404;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9406;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9408;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9410;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9412;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9414;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9416;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9418;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9420;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9422;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9424;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9426;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9428;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9430;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9432;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9434;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9436;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9438;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9440;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9442;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9444;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9446;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9448;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9450;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9452;\n\t\t\tcase PolishedGranite::PolishedGranite().ID: return 3;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Top).ID: return 10254;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Bottom).ID: return 10256;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Double).ID: return 10258;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9134;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9136;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9138;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9140;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9142;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9144;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9146;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9148;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9150;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9152;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9154;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9156;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9158;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9160;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9162;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9164;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9166;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9168;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9170;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9172;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9174;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9176;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9178;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9180;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9182;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9184;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9186;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9188;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9190;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9192;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9194;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9196;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9198;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9200;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9202;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9204;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9206;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9208;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9210;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9212;\n\t\t\tcase Poppy::Poppy().ID: return 1412;\n\t\t\tcase Potatoes::Potatoes(0).ID: return 5802;\n\t\t\tcase Potatoes::Potatoes(1).ID: return 5803;\n\t\t\tcase Potatoes::Potatoes(2).ID: return 5804;\n\t\t\tcase Potatoes::Potatoes(3).ID: return 5805;\n\t\t\tcase Potatoes::Potatoes(4).ID: return 5806;\n\t\t\tcase Potatoes::Potatoes(5).ID: return 5807;\n\t\t\tcase Potatoes::Potatoes(6).ID: return 5808;\n\t\t\tcase Potatoes::Potatoes(7).ID: return 5809;\n\t\t\tcase PottedAcaciaSapling::PottedAcaciaSapling().ID: return 5774;\n\t\t\tcase PottedAllium::PottedAllium().ID: return 5780;\n\t\t\tcase PottedAzureBluet::PottedAzureBluet().ID: return 5781;\n\t\t\tcase PottedBamboo::PottedBamboo().ID: return 9128;\n\t\t\tcase PottedBirchSapling::PottedBirchSapling().ID: return 5772;\n\t\t\tcase PottedBlueOrchid::PottedBlueOrchid().ID: return 5779;\n\t\t\tcase PottedBrownMushroom::PottedBrownMushroom().ID: return 5791;\n\t\t\tcase PottedCactus::PottedCactus().ID: return 5793;\n\t\t\tcase PottedCornflower::PottedCornflower().ID: return 5787;\n\t\t\tcase PottedDandelion::PottedDandelion().ID: return 5777;\n\t\t\tcase PottedDarkOakSapling::PottedDarkOakSapling().ID: return 5775;\n\t\t\tcase PottedDeadBush::PottedDeadBush().ID: return 5792;\n\t\t\tcase PottedFern::PottedFern().ID: return 5776;\n\t\t\tcase PottedJungleSapling::PottedJungleSapling().ID: return 5773;\n\t\t\tcase PottedLilyOfTheValley::PottedLilyOfTheValley().ID: return 5788;\n\t\t\tcase PottedOakSapling::PottedOakSapling().ID: return 5770;\n\t\t\tcase PottedOrangeTulip::PottedOrangeTulip().ID: return 5783;\n\t\t\tcase PottedOxeyeDaisy::PottedOxeyeDaisy().ID: return 5786;\n\t\t\tcase PottedPinkTulip::PottedPinkTulip().ID: return 5785;\n\t\t\tcase PottedPoppy::PottedPoppy().ID: return 5778;\n\t\t\tcase PottedRedMushroom::PottedRedMushroom().ID: return 5790;\n\t\t\tcase PottedRedTulip::PottedRedTulip().ID: return 5782;\n\t\t\tcase PottedSpruceSapling::PottedSpruceSapling().ID: return 5771;\n\t\t\tcase PottedWhiteTulip::PottedWhiteTulip().ID: return 5784;\n\t\t\tcase PottedWitherRose::PottedWitherRose().ID: return 5789;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::NorthSouth).ID: return 1304;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::EastWest).ID: return 1305;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingEast).ID: return 1306;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingWest).ID: return 1307;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingNorth).ID: return 1308;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingSouth).ID: return 1309;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::NorthSouth).ID: return 1310;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::EastWest).ID: return 1311;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingEast).ID: return 1312;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingWest).ID: return 1313;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingNorth).ID: return 1314;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingSouth).ID: return 1315;\n\t\t\tcase Prismarine::Prismarine().ID: return 7065;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Top).ID: return 7315;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Bottom).ID: return 7317;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Double).ID: return 7319;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7149;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7151;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7153;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7155;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7157;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7159;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7161;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7163;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7165;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7167;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7169;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7171;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7173;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7175;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7177;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7179;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7181;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7183;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7185;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7187;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7189;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7191;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7193;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7195;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7197;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7199;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7201;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7203;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7205;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7207;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7209;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7211;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7213;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7215;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7217;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7219;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7221;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7223;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7225;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7227;\n\t\t\tcase PrismarineBricks::PrismarineBricks().ID: return 7066;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Top).ID: return 7309;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Bottom).ID: return 7311;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Double).ID: return 7313;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7069;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7071;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7073;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7075;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7077;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7079;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7081;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7083;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7085;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7087;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7089;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7091;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7093;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7095;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7097;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7099;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7101;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7103;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7105;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7107;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7109;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7111;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7113;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7115;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7117;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7119;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7121;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7123;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7125;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7127;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7129;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7131;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7133;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7135;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7137;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7139;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7141;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7143;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7145;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7147;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 10397;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 10398;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 10401;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 10402;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 10405;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 10406;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 10409;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 10410;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 10413;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 10414;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 10417;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 10418;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 10421;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 10422;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 10425;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 10426;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 10429;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 10430;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 10433;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 10434;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 10437;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 10438;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 10441;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 10442;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 10445;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 10446;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 10449;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 10450;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 10453;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 10454;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 10457;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 10458;\n\t\t\tcase Pumpkin::Pumpkin().ID: return 3996;\n\t\t\tcase PumpkinStem::PumpkinStem(0).ID: return 4756;\n\t\t\tcase PumpkinStem::PumpkinStem(1).ID: return 4757;\n\t\t\tcase PumpkinStem::PumpkinStem(2).ID: return 4758;\n\t\t\tcase PumpkinStem::PumpkinStem(3).ID: return 4759;\n\t\t\tcase PumpkinStem::PumpkinStem(4).ID: return 4760;\n\t\t\tcase PumpkinStem::PumpkinStem(5).ID: return 4761;\n\t\t\tcase PumpkinStem::PumpkinStem(6).ID: return 4762;\n\t\t\tcase PumpkinStem::PumpkinStem(7).ID: return 4763;\n\t\t\tcase PurpleBanner::PurpleBanner(0).ID: return 7521;\n\t\t\tcase PurpleBanner::PurpleBanner(1).ID: return 7522;\n\t\t\tcase PurpleBanner::PurpleBanner(2).ID: return 7523;\n\t\t\tcase PurpleBanner::PurpleBanner(3).ID: return 7524;\n\t\t\tcase PurpleBanner::PurpleBanner(4).ID: return 7525;\n\t\t\tcase PurpleBanner::PurpleBanner(5).ID: return 7526;\n\t\t\tcase PurpleBanner::PurpleBanner(6).ID: return 7527;\n\t\t\tcase PurpleBanner::PurpleBanner(7).ID: return 7528;\n\t\t\tcase PurpleBanner::PurpleBanner(8).ID: return 7529;\n\t\t\tcase PurpleBanner::PurpleBanner(9).ID: return 7530;\n\t\t\tcase PurpleBanner::PurpleBanner(10).ID: return 7531;\n\t\t\tcase PurpleBanner::PurpleBanner(11).ID: return 7532;\n\t\t\tcase PurpleBanner::PurpleBanner(12).ID: return 7533;\n\t\t\tcase PurpleBanner::PurpleBanner(13).ID: return 7534;\n\t\t\tcase PurpleBanner::PurpleBanner(14).ID: return 7535;\n\t\t\tcase PurpleBanner::PurpleBanner(15).ID: return 7536;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Head).ID: return 1208;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Foot).ID: return 1209;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Head).ID: return 1210;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Foot).ID: return 1211;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Head).ID: return 1212;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Foot).ID: return 1213;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Head).ID: return 1214;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Foot).ID: return 1215;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Head).ID: return 1216;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Foot).ID: return 1217;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Head).ID: return 1218;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Foot).ID: return 1219;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Head).ID: return 1220;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Foot).ID: return 1221;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Head).ID: return 1222;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Foot).ID: return 1223;\n\t\t\tcase PurpleCarpet::PurpleCarpet().ID: return 7340;\n\t\t\tcase PurpleConcrete::PurpleConcrete().ID: return 8912;\n\t\t\tcase PurpleConcretePowder::PurpleConcretePowder().ID: return 8928;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8878;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8879;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8880;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8881;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8802;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8803;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8804;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8805;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8806;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8807;\n\t\t\tcase PurpleStainedGlass::PurpleStainedGlass().ID: return 4091;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, true).ID: return 6649;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, false).ID: return 6650;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, true).ID: return 6653;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, false).ID: return 6654;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, true).ID: return 6657;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, false).ID: return 6658;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, true).ID: return 6661;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, false).ID: return 6662;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, true).ID: return 6665;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, false).ID: return 6666;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, true).ID: return 6669;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, false).ID: return 6670;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, true).ID: return 6673;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, false).ID: return 6674;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, true).ID: return 6677;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, false).ID: return 6678;\n\t\t\tcase PurpleTerracotta::PurpleTerracotta().ID: return 6321;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7657;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7658;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7659;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7660;\n\t\t\tcase PurpleWool::PurpleWool().ID: return 1393;\n\t\t\tcase PurpurBlock::PurpurBlock().ID: return 8598;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::X).ID: return 8599;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Y).ID: return 8600;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Z).ID: return 8601;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Top).ID: return 7873;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Bottom).ID: return 7875;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Double).ID: return 7877;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8603;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8605;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8607;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8609;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8611;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8613;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8615;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8617;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8619;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8621;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8623;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8625;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8627;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8629;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8631;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8633;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8635;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8637;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8639;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8641;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8643;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8645;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8647;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8649;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8651;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8653;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8655;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8657;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8659;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8661;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 8663;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 8665;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 8667;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 8669;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 8671;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 8673;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 8675;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 8677;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 8679;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 8681;\n\t\t\tcase QuartzBlock::QuartzBlock().ID: return 6202;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::X).ID: return 6204;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Y).ID: return 6205;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Z).ID: return 6206;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Top).ID: return 7855;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Bottom).ID: return 7857;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Double).ID: return 7859;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6208;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6210;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6212;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6214;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6216;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6218;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6220;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6222;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6224;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6226;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6228;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6230;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6232;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6234;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6236;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6238;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6240;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6242;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6244;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6246;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6248;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6250;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6252;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6254;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6256;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6258;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6260;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6262;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6264;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6266;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6268;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6270;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6272;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6274;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6276;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6278;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6280;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6282;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6284;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6286;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthSouth).ID: return 3643;\n\t\t\tcase Rail::Rail(Rail::Shape::EastWest).ID: return 3644;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingEast).ID: return 3645;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingWest).ID: return 3646;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingNorth).ID: return 3647;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingSouth).ID: return 3648;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthEast).ID: return 3649;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthWest).ID: return 3650;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthWest).ID: return 3651;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthEast).ID: return 3652;\n\t\t\tcase RedBanner::RedBanner(0).ID: return 7585;\n\t\t\tcase RedBanner::RedBanner(1).ID: return 7586;\n\t\t\tcase RedBanner::RedBanner(2).ID: return 7587;\n\t\t\tcase RedBanner::RedBanner(3).ID: return 7588;\n\t\t\tcase RedBanner::RedBanner(4).ID: return 7589;\n\t\t\tcase RedBanner::RedBanner(5).ID: return 7590;\n\t\t\tcase RedBanner::RedBanner(6).ID: return 7591;\n\t\t\tcase RedBanner::RedBanner(7).ID: return 7592;\n\t\t\tcase RedBanner::RedBanner(8).ID: return 7593;\n\t\t\tcase RedBanner::RedBanner(9).ID: return 7594;\n\t\t\tcase RedBanner::RedBanner(10).ID: return 7595;\n\t\t\tcase RedBanner::RedBanner(11).ID: return 7596;\n\t\t\tcase RedBanner::RedBanner(12).ID: return 7597;\n\t\t\tcase RedBanner::RedBanner(13).ID: return 7598;\n\t\t\tcase RedBanner::RedBanner(14).ID: return 7599;\n\t\t\tcase RedBanner::RedBanner(15).ID: return 7600;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Head).ID: return 1272;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Foot).ID: return 1273;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Head).ID: return 1274;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Foot).ID: return 1275;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Head).ID: return 1276;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Foot).ID: return 1277;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Head).ID: return 1278;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Foot).ID: return 1279;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Head).ID: return 1280;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Foot).ID: return 1281;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Head).ID: return 1282;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Foot).ID: return 1283;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Head).ID: return 1284;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Foot).ID: return 1285;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Head).ID: return 1286;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Foot).ID: return 1287;\n\t\t\tcase RedCarpet::RedCarpet().ID: return 7344;\n\t\t\tcase RedConcrete::RedConcrete().ID: return 8916;\n\t\t\tcase RedConcretePowder::RedConcretePowder().ID: return 8932;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8894;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8895;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8896;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8897;\n\t\t\tcase RedMushroom::RedMushroom().ID: return 1425;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, true).ID: return 4555;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, false).ID: return 4556;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, true).ID: return 4557;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, false).ID: return 4558;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, true).ID: return 4559;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, false).ID: return 4560;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, true).ID: return 4561;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, false).ID: return 4562;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, true).ID: return 4563;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, false).ID: return 4564;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, true).ID: return 4565;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, false).ID: return 4566;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, true).ID: return 4567;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, false).ID: return 4568;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, true).ID: return 4569;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, false).ID: return 4570;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, true).ID: return 4571;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, false).ID: return 4572;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, true).ID: return 4573;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, false).ID: return 4574;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, true).ID: return 4575;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, false).ID: return 4576;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, true).ID: return 4577;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, false).ID: return 4578;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, true).ID: return 4579;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, false).ID: return 4580;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, true).ID: return 4581;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, false).ID: return 4582;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, true).ID: return 4583;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, false).ID: return 4584;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, true).ID: return 4585;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, false).ID: return 4586;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, true).ID: return 4587;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, false).ID: return 4588;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, true).ID: return 4589;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, false).ID: return 4590;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, true).ID: return 4591;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, false).ID: return 4592;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, true).ID: return 4593;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, false).ID: return 4594;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, true).ID: return 4595;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, false).ID: return 4596;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, true).ID: return 4597;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, false).ID: return 4598;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, true).ID: return 4599;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, false).ID: return 4600;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, true).ID: return 4601;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, false).ID: return 4602;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, true).ID: return 4603;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, false).ID: return 4604;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, true).ID: return 4605;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, false).ID: return 4606;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, true).ID: return 4607;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, false).ID: return 4608;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, true).ID: return 4609;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, false).ID: return 4610;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, true).ID: return 4611;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, false).ID: return 4612;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, true).ID: return 4613;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, false).ID: return 4614;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, true).ID: return 4615;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, false).ID: return 4616;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, true).ID: return 4617;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false).ID: return 4618;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Top).ID: return 10314;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Bottom).ID: return 10316;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Double).ID: return 10318;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10014;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10016;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10018;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10020;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10022;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10024;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10026;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10028;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10030;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10032;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10034;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10036;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10038;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10040;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10042;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10044;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10046;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10048;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10050;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10052;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10054;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10056;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10058;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10060;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10062;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10064;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10066;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10068;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10070;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10072;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10074;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10076;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10078;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10080;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10082;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10084;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10086;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10088;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10090;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10092;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 10845;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 10846;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 10849;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 10850;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 10853;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 10854;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 10857;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 10858;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 10861;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 10862;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 10865;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 10866;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 10869;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 10870;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 10873;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 10874;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 10877;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 10878;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 10881;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 10882;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 10885;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 10886;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 10889;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 10890;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 10893;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 10894;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 10897;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 10898;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 10901;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 10902;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 10905;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 10906;\n\t\t\tcase RedNetherBricks::RedNetherBricks().ID: return 8719;\n\t\t\tcase RedSand::RedSand().ID: return 67;\n\t\t\tcase RedSandstone::RedSandstone().ID: return 7681;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Top).ID: return 7861;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Bottom).ID: return 7863;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Double).ID: return 7865;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7685;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7687;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7689;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7691;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7693;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7695;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7697;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7699;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7701;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7703;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7705;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7707;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7709;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7711;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7713;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7715;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7717;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7719;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7721;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7723;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7725;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7727;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7729;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7731;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7733;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7735;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7737;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7739;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7741;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7743;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 7745;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 7747;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 7749;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 7751;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 7753;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 7755;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 7757;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 7759;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 7761;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 7763;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 10461;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 10462;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 10465;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 10466;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 10469;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 10470;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 10473;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 10474;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 10477;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 10478;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 10481;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 10482;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 10485;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 10486;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 10489;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 10490;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 10493;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 10494;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 10497;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 10498;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 10501;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 10502;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 10505;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 10506;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 10509;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 10510;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 10513;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 10514;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 10517;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 10518;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 10521;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 10522;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8826;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8827;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8828;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8829;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8830;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8831;\n\t\t\tcase RedStainedGlass::RedStainedGlass().ID: return 4095;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, true).ID: return 6777;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, false).ID: return 6778;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, true).ID: return 6781;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, false).ID: return 6782;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, true).ID: return 6785;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, false).ID: return 6786;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, true).ID: return 6789;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, false).ID: return 6790;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, true).ID: return 6793;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, false).ID: return 6794;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, true).ID: return 6797;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, false).ID: return 6798;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, true).ID: return 6801;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, false).ID: return 6802;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, true).ID: return 6805;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, false).ID: return 6806;\n\t\t\tcase RedTerracotta::RedTerracotta().ID: return 6325;\n\t\t\tcase RedTulip::RedTulip().ID: return 1416;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7673;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7674;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7675;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7676;\n\t\t\tcase RedWool::RedWool().ID: return 1397;\n\t\t\tcase RedstoneBlock::RedstoneBlock().ID: return 6190;\n\t\t\tcase RedstoneLamp::RedstoneLamp(true).ID: return 5140;\n\t\t\tcase RedstoneLamp::RedstoneLamp(false).ID: return 5141;\n\t\t\tcase RedstoneOre::RedstoneOre(true).ID: return 3883;\n\t\t\tcase RedstoneOre::RedstoneOre(false).ID: return 3884;\n\t\t\tcase RedstoneTorch::RedstoneTorch(true).ID: return 3885;\n\t\t\tcase RedstoneTorch::RedstoneTorch(false).ID: return 3886;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3887;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3888;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3889;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3890;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, true).ID: return 3891;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, false).ID: return 3892;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, true).ID: return 3893;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, false).ID: return 3894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2056;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2057;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2058;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2059;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2060;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2061;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2062;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2063;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2064;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2065;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2066;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2067;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2068;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2069;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2070;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2071;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2072;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2073;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2074;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2075;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2076;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2077;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2078;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2079;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2080;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2081;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2082;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2083;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2084;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2085;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2086;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2087;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2088;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2089;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2090;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2091;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2092;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2093;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2094;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2095;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2096;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2097;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2098;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2099;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2100;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2101;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2102;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2103;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2104;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2105;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2106;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2107;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2108;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2109;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2110;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2111;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2112;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2113;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2114;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2115;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2116;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2117;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2118;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2119;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2120;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2121;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2122;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2123;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2124;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2125;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2126;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2127;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2128;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2129;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2130;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2131;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2132;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2133;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2134;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2135;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2136;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2137;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2138;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2139;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2140;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2141;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2142;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2143;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2144;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2145;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2146;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2147;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2148;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2149;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2150;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2151;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2152;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2153;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2154;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2155;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2156;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2157;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2158;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2159;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2160;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2161;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2162;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2163;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2164;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2165;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2166;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2167;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2168;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2169;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2170;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2171;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2172;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2173;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2174;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2175;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2176;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2177;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2178;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2179;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2180;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2181;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2182;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2183;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2184;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2185;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2186;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2187;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2188;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2189;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2190;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2191;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2192;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2193;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2194;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2195;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2196;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2197;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2198;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2199;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2200;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2201;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2202;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2203;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2204;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2205;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2206;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2207;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2208;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2209;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2210;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2211;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2212;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2213;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2214;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2215;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2216;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2217;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2218;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2219;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2220;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2221;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2222;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2223;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2224;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2225;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2226;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2227;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2228;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2229;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2230;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2231;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2232;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2233;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2234;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2235;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2236;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2237;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2238;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2239;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2240;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2241;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2242;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2243;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2244;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2245;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2246;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2247;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2248;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2249;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2250;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2251;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2252;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2253;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2254;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2255;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2256;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2257;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2258;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2259;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2260;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2261;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2262;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2263;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2264;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2265;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2266;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2267;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2268;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2269;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2270;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2271;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2272;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2273;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2274;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2275;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2276;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2277;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2278;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2279;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2280;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2281;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2282;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2283;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2284;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2285;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2286;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2287;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2288;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2289;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2290;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2291;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2292;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2293;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2294;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2295;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2296;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2297;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2298;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2299;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2300;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2301;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2302;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2303;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2304;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2305;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2306;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2307;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2308;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2309;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2310;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2311;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2312;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2313;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2314;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2315;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2316;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2317;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2318;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2319;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2320;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2321;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2322;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2323;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2324;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2325;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2326;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2327;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2328;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2329;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2330;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2331;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2332;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2333;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2334;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2335;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2336;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2337;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2338;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2339;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2340;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2341;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2342;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2343;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2344;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2345;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2346;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2347;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2348;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2349;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2350;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2351;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2352;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2353;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2354;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2355;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2356;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2357;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2358;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2359;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2360;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2361;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2362;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2363;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2364;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2365;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2366;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2367;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2368;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2369;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2370;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2371;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2372;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2373;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2374;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2375;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2376;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2377;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2378;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2379;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2380;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2381;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2382;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2383;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2384;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2385;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2386;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2387;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2388;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2389;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2390;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2391;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2392;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2393;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2394;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2395;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2396;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2397;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2398;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2399;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2400;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2401;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2402;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2403;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2404;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2405;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2406;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2407;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2408;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2409;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2410;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2411;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2412;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2413;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2414;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2415;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2416;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2417;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2418;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2419;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2420;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2421;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2422;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2423;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2424;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2425;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2426;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2427;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2428;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2429;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2430;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2431;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2432;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2433;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2434;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2435;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2436;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2437;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2438;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2439;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2440;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2441;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2442;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2443;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2444;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2445;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2446;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2447;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2448;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2449;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2450;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2451;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2452;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2453;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2454;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2455;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2456;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2457;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2458;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2459;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2460;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2461;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2462;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2463;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2464;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2465;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2466;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2467;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2468;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2469;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2470;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2471;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2472;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2473;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2474;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2475;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2476;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2477;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2478;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2479;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2480;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2481;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2482;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2483;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2484;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2485;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2486;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2487;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2488;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2489;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2490;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2491;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2492;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2493;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2494;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2495;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2496;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2497;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2498;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2499;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2500;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2501;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2502;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2503;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2504;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2505;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2506;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2507;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2508;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2509;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2510;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2511;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2512;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2513;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2514;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2515;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2516;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2517;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2518;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2519;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2520;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2521;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2522;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2523;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2524;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2525;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2526;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2527;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2528;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2529;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2530;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2531;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2532;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2533;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2534;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2535;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2536;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2537;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2538;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2539;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2540;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2541;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2542;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2543;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2544;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2545;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2546;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2547;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2548;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2549;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2550;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2551;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2552;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2553;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2554;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2555;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2556;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2557;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2558;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2559;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2560;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2561;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2562;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2563;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2564;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2565;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2566;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2567;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2568;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2569;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2570;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2571;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2572;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2573;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2574;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2575;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2576;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2577;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2578;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2579;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2580;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2581;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2582;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2583;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2584;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2585;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2586;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2587;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2588;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2589;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2590;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2591;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2592;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2593;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2594;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2595;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2596;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2597;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2598;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2599;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2600;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2601;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2602;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2603;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2604;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2605;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2606;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2607;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2608;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2609;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2610;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2611;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2612;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2613;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2614;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2615;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2616;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2617;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2618;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2619;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2620;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2621;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2622;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2623;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2624;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2625;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2626;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2627;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2628;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2629;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2630;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2631;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2632;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2633;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2634;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2635;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2636;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2637;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2638;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2639;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2640;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2641;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2642;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2643;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2644;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2645;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2646;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2647;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2648;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2649;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2650;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2651;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2652;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2653;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2654;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2655;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2656;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2657;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2658;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2659;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2660;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2661;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2662;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2663;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2664;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2665;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2666;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2667;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2668;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2669;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2670;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2671;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2672;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2673;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2674;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2675;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2676;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2677;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2678;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2679;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2680;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2681;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2682;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2683;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2684;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2685;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2686;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2687;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2688;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2689;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2690;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2691;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2692;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2693;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2694;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2695;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2696;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2697;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2698;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2699;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2700;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2701;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2702;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2703;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2704;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2705;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2706;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2707;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2708;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2709;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2710;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2711;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2712;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2713;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2714;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2715;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2716;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2717;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2718;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2719;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2720;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2721;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2722;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2723;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2724;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2725;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2726;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2727;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2728;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2729;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2730;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2731;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2732;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2733;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2734;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2735;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2736;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2737;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2738;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2739;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2740;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2741;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2742;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2743;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2744;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2745;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2746;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2747;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2748;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2749;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2750;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2751;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2752;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2753;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2754;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2755;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2756;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2757;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2758;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2759;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2760;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2761;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2762;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2763;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2764;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2765;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2766;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2767;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2768;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2769;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2770;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2771;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2772;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2773;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2774;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2775;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2776;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2777;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2778;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2779;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2780;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2781;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2782;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2783;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2784;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2785;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2786;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2787;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2788;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2789;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2790;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2791;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2792;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2793;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2794;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2795;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2796;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2797;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2798;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2799;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2800;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2801;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2802;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2803;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2804;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2805;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2806;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2807;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2808;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2809;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2810;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2811;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2812;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2813;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2814;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2815;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2816;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2817;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2818;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2819;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2820;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2821;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2822;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2823;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2824;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2825;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2826;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2827;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2828;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2829;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2830;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2831;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2832;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2833;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2834;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2835;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2836;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2837;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2838;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2839;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2840;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2841;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2842;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2843;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2844;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2845;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2846;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2847;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2848;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2849;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2850;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2851;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2852;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2853;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2854;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2855;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2856;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2857;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2858;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2859;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2860;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2861;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2862;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2863;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2864;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2865;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2866;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2867;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2868;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2869;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2870;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2871;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2872;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2873;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2874;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2875;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2876;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2877;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2878;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2879;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2880;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2881;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2882;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2883;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2884;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2885;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2886;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2887;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2888;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2889;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2890;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2891;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2892;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2893;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2895;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2896;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2897;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2898;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2899;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2900;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2901;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2902;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2903;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2904;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2905;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2906;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2907;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2908;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2909;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2910;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2911;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2912;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2913;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2914;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2915;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2916;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2917;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2918;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2919;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2920;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2921;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2922;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2923;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2924;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2925;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2926;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2927;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2928;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2929;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2930;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2931;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2932;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2933;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2934;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2935;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2936;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2937;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2938;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2939;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2940;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2941;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2942;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2943;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2944;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2945;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2946;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2947;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2948;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2949;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2950;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2951;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2952;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2953;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2954;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2955;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2956;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2957;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2958;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2959;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2960;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2961;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2962;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2963;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2964;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2965;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2966;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2967;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2968;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2969;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2970;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2971;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2972;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2973;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2974;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2975;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2976;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2977;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2978;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2979;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2980;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2981;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2982;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2983;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2984;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2985;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2986;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2987;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2988;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2989;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2990;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2991;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2992;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2993;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2994;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2995;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2996;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2997;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2998;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2999;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3000;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3001;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3002;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3003;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3004;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3005;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3006;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3007;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3008;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3009;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3010;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3011;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3012;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3013;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3014;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3015;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3016;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3017;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3018;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3019;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3020;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3021;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3022;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3023;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3024;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3025;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3026;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3027;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3028;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3029;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3030;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3031;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3032;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3033;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3034;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3035;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3036;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3037;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3038;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3039;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3040;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3041;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3042;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3043;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3044;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3045;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3046;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3047;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3048;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3049;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3050;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3051;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3052;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3053;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3054;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3055;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3056;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3057;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3058;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3059;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3060;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3061;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3062;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3063;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3064;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3065;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3066;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3067;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3068;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3069;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3070;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3071;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3072;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3073;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3074;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3075;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3076;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3077;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3078;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3079;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3080;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3081;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3082;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3083;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3084;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3085;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3086;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3087;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3088;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3089;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3090;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3091;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3092;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3093;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3094;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3095;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3096;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3097;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3098;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3099;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3100;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3101;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3102;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3103;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3104;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3105;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3106;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3107;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3108;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3109;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3110;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3111;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3112;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3113;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3114;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3115;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3116;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3117;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3118;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3119;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3120;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3121;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3122;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3123;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3124;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3125;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3126;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3127;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3128;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3129;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3130;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3131;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3132;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3133;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3134;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3135;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3136;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3137;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3138;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3139;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3140;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3141;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3142;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3143;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3144;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3145;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3146;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3147;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3148;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3149;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3150;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3151;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3152;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3153;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3154;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3155;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3156;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3157;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3158;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3159;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3160;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3161;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3162;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3163;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3164;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3165;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3166;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3167;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3168;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3169;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3170;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3171;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3172;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3173;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3174;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3175;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3176;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3177;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3178;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3179;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3180;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3181;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3182;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3183;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3184;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3185;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3186;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3187;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3188;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3189;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3190;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3191;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3192;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3193;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3194;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3195;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3196;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3197;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3198;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3199;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3200;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3201;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3202;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3203;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3204;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3205;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3206;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3207;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3208;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3209;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3210;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3211;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3212;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3213;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3214;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3215;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3216;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3217;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3218;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3219;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3220;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3221;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3222;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3223;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3224;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3225;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3226;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3227;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3228;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3229;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3230;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3231;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3232;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3233;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3234;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3235;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3236;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3237;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3238;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3239;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3240;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3241;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3242;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3243;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3244;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3245;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3246;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3247;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3248;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3249;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3250;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3251;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3252;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3253;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3254;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3255;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3256;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3257;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3258;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3259;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3260;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3261;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3262;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3263;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3264;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3265;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3266;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3267;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3268;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3269;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3270;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3271;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3272;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3273;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3274;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3275;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3276;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3277;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3278;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3279;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3280;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3281;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3282;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3283;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3284;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3285;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3286;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3287;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3288;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3289;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3290;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3291;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3292;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3293;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3294;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3295;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3296;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3297;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3298;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3299;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3300;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3301;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3302;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3303;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3304;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3305;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3306;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3307;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3308;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3309;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3310;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3311;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3312;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3313;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3314;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3315;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3316;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3317;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3318;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3319;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3320;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3321;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3322;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3323;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3324;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3325;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3326;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3327;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3328;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3329;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3330;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3331;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3332;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3333;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3334;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3335;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3336;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3337;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3338;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3339;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3340;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3341;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3342;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3343;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3344;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3345;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3346;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3347;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3348;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3349;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3350;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3351;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4017;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4018;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4019;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4020;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4021;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4022;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4023;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4024;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4025;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4026;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4027;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4028;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4029;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4030;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4031;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4032;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4033;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4034;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4035;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4036;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4037;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4038;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4039;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4040;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4041;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4042;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4043;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4044;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4045;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4046;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4047;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4048;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4049;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4050;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4051;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4052;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4053;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4054;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4055;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4056;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4057;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4058;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4059;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4060;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4061;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4062;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4063;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4064;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4065;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4066;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4067;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4068;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4069;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4070;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4071;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4072;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4073;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4074;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4075;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4076;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4077;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4078;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4079;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4080;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 8689;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 8690;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 8691;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 8692;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 8693;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 8694;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 8695;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 8696;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 8697;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 8698;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 8699;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 8700;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Upper).ID: return 7353;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Lower).ID: return 7354;\n\t\t\tcase Sand::Sand().ID: return 66;\n\t\t\tcase Sandstone::Sandstone().ID: return 245;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Top).ID: return 7813;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Bottom).ID: return 7815;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Double).ID: return 7817;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5155;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5157;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5159;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5161;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5163;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5165;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5167;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5169;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5171;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5173;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5175;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5177;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5179;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5181;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5183;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5185;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5187;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5189;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5191;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5193;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5195;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5197;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5199;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5201;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5203;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5205;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5207;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5209;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5211;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5213;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5215;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5217;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5219;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5221;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5223;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5225;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5227;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5229;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5231;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5233;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 10909;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 10910;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 10913;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 10914;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 10917;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 10918;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 10921;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 10922;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 10925;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 10926;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 10929;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 10930;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 10933;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 10934;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 10937;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 10938;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 10941;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 10942;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 10945;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 10946;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 10949;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 10950;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 10953;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 10954;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 10957;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 10958;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 10961;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 10962;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 10965;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 10966;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 10969;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 10970;\n\t\t\tcase Scaffolding::Scaffolding(true, 0).ID: return 11100;\n\t\t\tcase Scaffolding::Scaffolding(true, 1).ID: return 11102;\n\t\t\tcase Scaffolding::Scaffolding(true, 2).ID: return 11104;\n\t\t\tcase Scaffolding::Scaffolding(true, 3).ID: return 11106;\n\t\t\tcase Scaffolding::Scaffolding(true, 4).ID: return 11108;\n\t\t\tcase Scaffolding::Scaffolding(true, 5).ID: return 11110;\n\t\t\tcase Scaffolding::Scaffolding(true, 6).ID: return 11112;\n\t\t\tcase Scaffolding::Scaffolding(true, 7).ID: return 11114;\n\t\t\tcase Scaffolding::Scaffolding(false, 0).ID: return 11116;\n\t\t\tcase Scaffolding::Scaffolding(false, 1).ID: return 11118;\n\t\t\tcase Scaffolding::Scaffolding(false, 2).ID: return 11120;\n\t\t\tcase Scaffolding::Scaffolding(false, 3).ID: return 11122;\n\t\t\tcase Scaffolding::Scaffolding(false, 4).ID: return 11124;\n\t\t\tcase Scaffolding::Scaffolding(false, 5).ID: return 11126;\n\t\t\tcase Scaffolding::Scaffolding(false, 6).ID: return 11128;\n\t\t\tcase Scaffolding::Scaffolding(false, 7).ID: return 11130;\n\t\t\tcase SeaLantern::SeaLantern().ID: return 7326;\n\t\t\tcase SeaPickle::SeaPickle(1).ID: return 9105;\n\t\t\tcase SeaPickle::SeaPickle(2).ID: return 9107;\n\t\t\tcase SeaPickle::SeaPickle(3).ID: return 9109;\n\t\t\tcase SeaPickle::SeaPickle(4).ID: return 9111;\n\t\t\tcase Seagrass::Seagrass().ID: return 1344;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8736;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8737;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8738;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8739;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8740;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8741;\n\t\t\tcase SkeletonSkull::SkeletonSkull(0).ID: return 5954;\n\t\t\tcase SkeletonSkull::SkeletonSkull(1).ID: return 5955;\n\t\t\tcase SkeletonSkull::SkeletonSkull(2).ID: return 5956;\n\t\t\tcase SkeletonSkull::SkeletonSkull(3).ID: return 5957;\n\t\t\tcase SkeletonSkull::SkeletonSkull(4).ID: return 5958;\n\t\t\tcase SkeletonSkull::SkeletonSkull(5).ID: return 5959;\n\t\t\tcase SkeletonSkull::SkeletonSkull(6).ID: return 5960;\n\t\t\tcase SkeletonSkull::SkeletonSkull(7).ID: return 5961;\n\t\t\tcase SkeletonSkull::SkeletonSkull(8).ID: return 5962;\n\t\t\tcase SkeletonSkull::SkeletonSkull(9).ID: return 5963;\n\t\t\tcase SkeletonSkull::SkeletonSkull(10).ID: return 5964;\n\t\t\tcase SkeletonSkull::SkeletonSkull(11).ID: return 5965;\n\t\t\tcase SkeletonSkull::SkeletonSkull(12).ID: return 5966;\n\t\t\tcase SkeletonSkull::SkeletonSkull(13).ID: return 5967;\n\t\t\tcase SkeletonSkull::SkeletonSkull(14).ID: return 5968;\n\t\t\tcase SkeletonSkull::SkeletonSkull(15).ID: return 5969;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 5970;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 5971;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 5972;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 5973;\n\t\t\tcase SlimeBlock::SlimeBlock().ID: return 6999;\n\t\t\tcase SmithingTable::SmithingTable().ID: return 11193;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZM, true).ID: return 11147;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZM, false).ID: return 11148;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZP, true).ID: return 11149;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZP, false).ID: return 11150;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XM, true).ID: return 11151;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XM, false).ID: return 11152;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XP, true).ID: return 11153;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XP, false).ID: return 11154;\n\t\t\tcase SmoothQuartz::SmoothQuartz().ID: return 7880;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Top).ID: return 10296;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Bottom).ID: return 10298;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Double).ID: return 10300;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 9774;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9776;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 9778;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9780;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 9782;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 9784;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9786;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 9788;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9790;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 9792;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 9794;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9796;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 9798;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9800;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 9802;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 9804;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9806;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 9808;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9810;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 9812;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 9814;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9816;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 9818;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9820;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 9822;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 9824;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9826;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 9828;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9830;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 9832;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 9834;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9836;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 9838;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9840;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 9842;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 9844;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 9846;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 9848;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 9850;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 9852;\n\t\t\tcase SmoothRedSandstone::SmoothRedSandstone().ID: return 7881;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Top).ID: return 10260;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Bottom).ID: return 10262;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Double).ID: return 10264;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9214;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9216;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9218;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9220;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9222;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9224;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9226;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9228;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9230;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9232;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9234;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9236;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9238;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9240;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9242;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9244;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9246;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9248;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9250;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9252;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9254;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9256;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9258;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9260;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9262;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9264;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9266;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9268;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9270;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9272;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9274;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9276;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9278;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9280;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9282;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9284;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9286;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9288;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9290;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9292;\n\t\t\tcase SmoothSandstone::SmoothSandstone().ID: return 7879;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Top).ID: return 10290;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Bottom).ID: return 10292;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Double).ID: return 10294;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 9694;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9696;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9698;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9700;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9702;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 9704;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9706;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9708;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9710;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9712;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 9714;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9716;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9718;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9720;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9722;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 9724;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9726;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9728;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9730;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9732;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 9734;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9736;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9738;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9740;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9742;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 9744;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9746;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9748;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9750;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9752;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 9754;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9756;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9758;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9760;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9762;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 9764;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 9766;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 9768;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 9770;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 9772;\n\t\t\tcase SmoothStone::SmoothStone().ID: return 7878;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Top).ID: return 7807;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Bottom).ID: return 7809;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Double).ID: return 7811;\n\t\t\tcase Snow::Snow(1).ID: return 3919;\n\t\t\tcase Snow::Snow(2).ID: return 3920;\n\t\t\tcase Snow::Snow(3).ID: return 3921;\n\t\t\tcase Snow::Snow(4).ID: return 3922;\n\t\t\tcase Snow::Snow(5).ID: return 3923;\n\t\t\tcase Snow::Snow(6).ID: return 3924;\n\t\t\tcase Snow::Snow(7).ID: return 3925;\n\t\t\tcase Snow::Snow(8).ID: return 3926;\n\t\t\tcase SnowBlock::SnowBlock().ID: return 3928;\n\t\t\tcase SoulSand::SoulSand().ID: return 3998;\n\t\t\tcase Spawner::Spawner().ID: return 1951;\n\t\t\tcase Sponge::Sponge().ID: return 228;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5834;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5835;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5836;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5837;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 5838;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 5839;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 5840;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 5841;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5842;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5843;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5844;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5845;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 5846;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 5847;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 5848;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 5849;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5850;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5851;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5852;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5853;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 5854;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 5855;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 5856;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 5857;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8202;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8203;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8204;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8205;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8206;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8207;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8208;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8209;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8210;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8211;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8212;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8213;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8214;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8215;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8216;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8217;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8218;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8219;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8220;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8221;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8222;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8223;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8224;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8225;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8226;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8227;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8228;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8229;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8230;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8231;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8232;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8233;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8234;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8235;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8236;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8237;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8238;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8239;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8240;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8241;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8242;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8243;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8244;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8245;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8246;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8247;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8248;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8249;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8250;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8251;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8252;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8253;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8254;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8255;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8256;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8257;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8258;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8259;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8260;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8261;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8262;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8263;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8264;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8265;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, true).ID: return 8044;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, false).ID: return 8045;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, true).ID: return 8048;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, false).ID: return 8049;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, true).ID: return 8052;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, false).ID: return 8053;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, true).ID: return 8056;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, false).ID: return 8057;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, true).ID: return 8060;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, false).ID: return 8061;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, true).ID: return 8064;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, false).ID: return 8065;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, true).ID: return 8068;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, false).ID: return 8069;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, true).ID: return 8072;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, false).ID: return 8073;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 7882;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 7883;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 7884;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 7885;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 7886;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 7887;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 7888;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 7889;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 7890;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 7891;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 7892;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 7893;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 7894;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 7895;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 7896;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 7897;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 7898;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 7899;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 7900;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 7901;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 7902;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 7903;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 7904;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 7905;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 7906;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 7907;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 7908;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 7909;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 7910;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 7911;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 7912;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 7913;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, true).ID: return 158;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, false).ID: return 159;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, true).ID: return 160;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, false).ID: return 161;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, true).ID: return 162;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, false).ID: return 163;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, true).ID: return 164;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, false).ID: return 165;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, true).ID: return 166;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, false).ID: return 167;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, true).ID: return 168;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, false).ID: return 169;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, true).ID: return 170;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, false).ID: return 171;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::X).ID: return 75;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Y).ID: return 76;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Z).ID: return 77;\n\t\t\tcase SprucePlanks::SprucePlanks().ID: return 16;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(true).ID: return 3873;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(false).ID: return 3874;\n\t\t\tcase SpruceSapling::SpruceSapling(0).ID: return 23;\n\t\t\tcase SpruceSapling::SpruceSapling(1).ID: return 24;\n\t\t\tcase SpruceSign::SpruceSign(0).ID: return 3412;\n\t\t\tcase SpruceSign::SpruceSign(1).ID: return 3414;\n\t\t\tcase SpruceSign::SpruceSign(2).ID: return 3416;\n\t\t\tcase SpruceSign::SpruceSign(3).ID: return 3418;\n\t\t\tcase SpruceSign::SpruceSign(4).ID: return 3420;\n\t\t\tcase SpruceSign::SpruceSign(5).ID: return 3422;\n\t\t\tcase SpruceSign::SpruceSign(6).ID: return 3424;\n\t\t\tcase SpruceSign::SpruceSign(7).ID: return 3426;\n\t\t\tcase SpruceSign::SpruceSign(8).ID: return 3428;\n\t\t\tcase SpruceSign::SpruceSign(9).ID: return 3430;\n\t\t\tcase SpruceSign::SpruceSign(10).ID: return 3432;\n\t\t\tcase SpruceSign::SpruceSign(11).ID: return 3434;\n\t\t\tcase SpruceSign::SpruceSign(12).ID: return 3436;\n\t\t\tcase SpruceSign::SpruceSign(13).ID: return 3438;\n\t\t\tcase SpruceSign::SpruceSign(14).ID: return 3440;\n\t\t\tcase SpruceSign::SpruceSign(15).ID: return 3442;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Top).ID: return 7771;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Bottom).ID: return 7773;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Double).ID: return 7775;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5389;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5391;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5393;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5395;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5397;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5399;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5401;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5403;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5405;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5407;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5409;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5411;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5413;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5415;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5417;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5419;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5421;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5423;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5425;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5427;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5429;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5431;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5433;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5435;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5437;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5439;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5441;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5443;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5445;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5447;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5449;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5451;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5453;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5455;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5457;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5459;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5461;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5463;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5465;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5467;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, true).ID: return 4162;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, false).ID: return 4164;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, true).ID: return 4166;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, false).ID: return 4168;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4170;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4172;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4174;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4176;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, true).ID: return 4178;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, false).ID: return 4180;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, true).ID: return 4182;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, false).ID: return 4184;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4186;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4188;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4190;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4192;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, true).ID: return 4194;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, false).ID: return 4196;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, true).ID: return 4198;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, false).ID: return 4200;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4202;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4204;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4206;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4208;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, true).ID: return 4210;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, false).ID: return 4212;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, true).ID: return 4214;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, false).ID: return 4216;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4218;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4220;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4222;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4224;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3742;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3744;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3746;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3748;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::X).ID: return 111;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Y).ID: return 112;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Z).ID: return 113;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1328;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1329;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1330;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1331;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1332;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1333;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1334;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1335;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1336;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1337;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1338;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1339;\n\t\t\tcase Stone::Stone().ID: return 1;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Top).ID: return 7843;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Bottom).ID: return 7845;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Double).ID: return 7847;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4917;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4919;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4921;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4923;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4925;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4927;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4929;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4931;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4933;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4935;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4937;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4939;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4941;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4943;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4945;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4947;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4949;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4951;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4953;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4955;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4957;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4959;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4961;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4963;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4965;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4967;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4969;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4971;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4973;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4975;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4977;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4979;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4981;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4983;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4985;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4987;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4989;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4991;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4993;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4995;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 10653;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 10654;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 10657;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 10658;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 10661;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 10662;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 10665;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 10666;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 10669;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 10670;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 10673;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 10674;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 10677;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 10678;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 10681;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 10682;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 10685;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 10686;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 10689;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 10690;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 10693;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 10694;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 10697;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 10698;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 10701;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 10702;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 10705;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 10706;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 10709;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 10710;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 10713;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 10714;\n\t\t\tcase StoneBricks::StoneBricks().ID: return 4481;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3895;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3896;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3897;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3898;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3899;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3900;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3901;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3902;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3903;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3904;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3905;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3906;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3907;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3908;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3909;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3910;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3911;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3912;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3913;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3914;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3915;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3916;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3917;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3918;\n\t\t\tcase StonePressurePlate::StonePressurePlate(true).ID: return 3805;\n\t\t\tcase StonePressurePlate::StonePressurePlate(false).ID: return 3806;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Top).ID: return 7801;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Bottom).ID: return 7803;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Double).ID: return 7805;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 9614;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 9616;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 9618;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 9620;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 9622;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 9624;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 9626;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 9628;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 9630;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 9632;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 9634;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 9636;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 9638;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 9640;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 9642;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 9644;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 9646;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 9648;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 9650;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 9652;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 9654;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 9656;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 9658;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 9660;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 9662;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 9664;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 9666;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 9668;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 9670;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 9672;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 9674;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 9676;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 9678;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 9680;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 9682;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 9684;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 9686;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 9688;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 9690;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 9692;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_ZM).ID: return 11194;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_ZP).ID: return 11195;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_XM).ID: return 11196;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_XP).ID: return 11197;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::X).ID: return 99;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Y).ID: return 100;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Z).ID: return 101;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::X).ID: return 138;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Y).ID: return 139;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Z).ID: return 140;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::X).ID: return 93;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Y).ID: return 94;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Z).ID: return 95;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::X).ID: return 132;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Y).ID: return 133;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Z).ID: return 134;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::X).ID: return 102;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Y).ID: return 103;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Z).ID: return 104;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::X).ID: return 141;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Y).ID: return 142;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Z).ID: return 143;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::X).ID: return 96;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Y).ID: return 97;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Z).ID: return 98;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::X).ID: return 135;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Y).ID: return 136;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Z).ID: return 137;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::X).ID: return 105;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Y).ID: return 106;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Z).ID: return 107;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::X).ID: return 126;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Y).ID: return 127;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Z).ID: return 128;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::X).ID: return 90;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Y).ID: return 91;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Z).ID: return 92;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::X).ID: return 129;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Y).ID: return 130;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Z).ID: return 131;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Save).ID: return 11268;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Load).ID: return 11269;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Corner).ID: return 11270;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Data).ID: return 11271;\n\t\t\tcase StructureVoid::StructureVoid().ID: return 8723;\n\t\t\tcase SugarCane::SugarCane(0).ID: return 3946;\n\t\t\tcase SugarCane::SugarCane(1).ID: return 3947;\n\t\t\tcase SugarCane::SugarCane(2).ID: return 3948;\n\t\t\tcase SugarCane::SugarCane(3).ID: return 3949;\n\t\t\tcase SugarCane::SugarCane(4).ID: return 3950;\n\t\t\tcase SugarCane::SugarCane(5).ID: return 3951;\n\t\t\tcase SugarCane::SugarCane(6).ID: return 3952;\n\t\t\tcase SugarCane::SugarCane(7).ID: return 3953;\n\t\t\tcase SugarCane::SugarCane(8).ID: return 3954;\n\t\t\tcase SugarCane::SugarCane(9).ID: return 3955;\n\t\t\tcase SugarCane::SugarCane(10).ID: return 3956;\n\t\t\tcase SugarCane::SugarCane(11).ID: return 3957;\n\t\t\tcase SugarCane::SugarCane(12).ID: return 3958;\n\t\t\tcase SugarCane::SugarCane(13).ID: return 3959;\n\t\t\tcase SugarCane::SugarCane(14).ID: return 3960;\n\t\t\tcase SugarCane::SugarCane(15).ID: return 3961;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Upper).ID: return 7349;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Lower).ID: return 7350;\n\t\t\tcase SweetBerryBush::SweetBerryBush(0).ID: return 11264;\n\t\t\tcase SweetBerryBush::SweetBerryBush(1).ID: return 11265;\n\t\t\tcase SweetBerryBush::SweetBerryBush(2).ID: return 11266;\n\t\t\tcase SweetBerryBush::SweetBerryBush(3).ID: return 11267;\n\t\t\tcase TNT::TNT(true).ID: return 1429;\n\t\t\tcase TNT::TNT(false).ID: return 1430;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Upper).ID: return 7357;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Lower).ID: return 7358;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Upper).ID: return 1345;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Lower).ID: return 1346;\n\t\t\tcase Terracotta::Terracotta().ID: return 7346;\n\t\t\tcase Torch::Torch().ID: return 1434;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Single).ID: return 6087;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Left).ID: return 6089;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Right).ID: return 6091;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Single).ID: return 6093;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Left).ID: return 6095;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Right).ID: return 6097;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Single).ID: return 6099;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Left).ID: return 6101;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Right).ID: return 6103;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Single).ID: return 6105;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Left).ID: return 6107;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Right).ID: return 6109;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, true).ID: return 5259;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, false).ID: return 5260;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, true).ID: return 5261;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, false).ID: return 5262;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, true).ID: return 5263;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, false).ID: return 5264;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, true).ID: return 5265;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, false).ID: return 5266;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, true).ID: return 5267;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, false).ID: return 5268;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, true).ID: return 5269;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, false).ID: return 5270;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, true).ID: return 5271;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, false).ID: return 5272;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, true).ID: return 5273;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, false).ID: return 5274;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, true).ID: return 5275;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, false).ID: return 5276;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, true).ID: return 5277;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, false).ID: return 5278;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, true).ID: return 5279;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, false).ID: return 5280;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, true).ID: return 5281;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, false).ID: return 5282;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, true).ID: return 5283;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, false).ID: return 5284;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, true).ID: return 5285;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, false).ID: return 5286;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, true).ID: return 5287;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, false).ID: return 5288;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, true).ID: return 5289;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, false).ID: return 5290;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, true).ID: return 5291;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, false).ID: return 5292;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, true).ID: return 5293;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, false).ID: return 5294;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, true).ID: return 5295;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, false).ID: return 5296;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, true).ID: return 5297;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, false).ID: return 5298;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, true).ID: return 5299;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, false).ID: return 5300;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, true).ID: return 5301;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, false).ID: return 5302;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, true).ID: return 5303;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, false).ID: return 5304;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, true).ID: return 5305;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, false).ID: return 5306;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, true).ID: return 5307;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, false).ID: return 5308;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, true).ID: return 5309;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, false).ID: return 5310;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, true).ID: return 5311;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, false).ID: return 5312;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, true).ID: return 5313;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, false).ID: return 5314;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, true).ID: return 5315;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, false).ID: return 5316;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, true).ID: return 5317;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, false).ID: return 5318;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, true).ID: return 5319;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, false).ID: return 5320;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, true).ID: return 5321;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, false).ID: return 5322;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, true).ID: return 5323;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, false).ID: return 5324;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, true).ID: return 5325;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, false).ID: return 5326;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, true).ID: return 5327;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, false).ID: return 5328;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, true).ID: return 5329;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, false).ID: return 5330;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, true).ID: return 5331;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, false).ID: return 5332;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, true).ID: return 5333;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, false).ID: return 5334;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, true).ID: return 5335;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, false).ID: return 5336;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, true).ID: return 5337;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, false).ID: return 5338;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, true).ID: return 5339;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, false).ID: return 5340;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, true).ID: return 5341;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, false).ID: return 5342;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, true).ID: return 5343;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, false).ID: return 5344;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, true).ID: return 5345;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, false).ID: return 5346;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, true).ID: return 5347;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, false).ID: return 5348;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, true).ID: return 5349;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, false).ID: return 5350;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, true).ID: return 5351;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, false).ID: return 5352;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, true).ID: return 5353;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, false).ID: return 5354;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, true).ID: return 5355;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, false).ID: return 5356;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, true).ID: return 5357;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, false).ID: return 5358;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, true).ID: return 5359;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, false).ID: return 5360;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, true).ID: return 5361;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, false).ID: return 5362;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, true).ID: return 5363;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, false).ID: return 5364;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, true).ID: return 5365;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, false).ID: return 5366;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, true).ID: return 5367;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, false).ID: return 5368;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, true).ID: return 5369;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, false).ID: return 5370;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, true).ID: return 5371;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, false).ID: return 5372;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, true).ID: return 5373;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, false).ID: return 5374;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, true).ID: return 5375;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, false).ID: return 5376;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, true).ID: return 5377;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, false).ID: return 5378;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, true).ID: return 5379;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, false).ID: return 5380;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, true).ID: return 5381;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, false).ID: return 5382;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, true).ID: return 5383;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, false).ID: return 5384;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, true).ID: return 5385;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, false).ID: return 5386;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5243;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5244;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5245;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5246;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, true).ID: return 5247;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, false).ID: return 5248;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, true).ID: return 5249;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, false).ID: return 5250;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5251;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5252;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5253;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5254;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, true).ID: return 5255;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, false).ID: return 5256;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, true).ID: return 5257;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, false).ID: return 5258;\n\t\t\tcase TubeCoral::TubeCoral().ID: return 8995;\n\t\t\tcase TubeCoralBlock::TubeCoralBlock().ID: return 8979;\n\t\t\tcase TubeCoralFan::TubeCoralFan().ID: return 9015;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9065;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9067;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9069;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9071;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 0).ID: return 8962;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 1).ID: return 8963;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 2).ID: return 8964;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 0).ID: return 8965;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 1).ID: return 8966;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 2).ID: return 8967;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 0).ID: return 8968;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 1).ID: return 8969;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 2).ID: return 8970;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 0).ID: return 8971;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 1).ID: return 8972;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 2).ID: return 8973;\n\t\t\tcase Vine::Vine(true, true, true, true, true).ID: return 4772;\n\t\t\tcase Vine::Vine(true, true, true, true, false).ID: return 4773;\n\t\t\tcase Vine::Vine(true, true, true, false, true).ID: return 4774;\n\t\t\tcase Vine::Vine(true, true, true, false, false).ID: return 4775;\n\t\t\tcase Vine::Vine(true, true, false, true, true).ID: return 4776;\n\t\t\tcase Vine::Vine(true, true, false, true, false).ID: return 4777;\n\t\t\tcase Vine::Vine(true, true, false, false, true).ID: return 4778;\n\t\t\tcase Vine::Vine(true, true, false, false, false).ID: return 4779;\n\t\t\tcase Vine::Vine(true, false, true, true, true).ID: return 4780;\n\t\t\tcase Vine::Vine(true, false, true, true, false).ID: return 4781;\n\t\t\tcase Vine::Vine(true, false, true, false, true).ID: return 4782;\n\t\t\tcase Vine::Vine(true, false, true, false, false).ID: return 4783;\n\t\t\tcase Vine::Vine(true, false, false, true, true).ID: return 4784;\n\t\t\tcase Vine::Vine(true, false, false, true, false).ID: return 4785;\n\t\t\tcase Vine::Vine(true, false, false, false, true).ID: return 4786;\n\t\t\tcase Vine::Vine(true, false, false, false, false).ID: return 4787;\n\t\t\tcase Vine::Vine(false, true, true, true, true).ID: return 4788;\n\t\t\tcase Vine::Vine(false, true, true, true, false).ID: return 4789;\n\t\t\tcase Vine::Vine(false, true, true, false, true).ID: return 4790;\n\t\t\tcase Vine::Vine(false, true, true, false, false).ID: return 4791;\n\t\t\tcase Vine::Vine(false, true, false, true, true).ID: return 4792;\n\t\t\tcase Vine::Vine(false, true, false, true, false).ID: return 4793;\n\t\t\tcase Vine::Vine(false, true, false, false, true).ID: return 4794;\n\t\t\tcase Vine::Vine(false, true, false, false, false).ID: return 4795;\n\t\t\tcase Vine::Vine(false, false, true, true, true).ID: return 4796;\n\t\t\tcase Vine::Vine(false, false, true, true, false).ID: return 4797;\n\t\t\tcase Vine::Vine(false, false, true, false, true).ID: return 4798;\n\t\t\tcase Vine::Vine(false, false, true, false, false).ID: return 4799;\n\t\t\tcase Vine::Vine(false, false, false, true, true).ID: return 4800;\n\t\t\tcase Vine::Vine(false, false, false, true, false).ID: return 4801;\n\t\t\tcase Vine::Vine(false, false, false, false, true).ID: return 4802;\n\t\t\tcase Vine::Vine(false, false, false, false, false).ID: return 4803;\n\t\t\tcase VoidAir::VoidAir().ID: return 9129;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZM).ID: return 1435;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZP).ID: return 1436;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XM).ID: return 1437;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XP).ID: return 1438;\n\t\t\tcase Water::Water(0).ID: return 34;\n\t\t\tcase Water::Water(1).ID: return 35;\n\t\t\tcase Water::Water(2).ID: return 36;\n\t\t\tcase Water::Water(3).ID: return 37;\n\t\t\tcase Water::Water(4).ID: return 38;\n\t\t\tcase Water::Water(5).ID: return 39;\n\t\t\tcase Water::Water(6).ID: return 40;\n\t\t\tcase Water::Water(7).ID: return 41;\n\t\t\tcase Water::Water(8).ID: return 42;\n\t\t\tcase Water::Water(9).ID: return 43;\n\t\t\tcase Water::Water(10).ID: return 44;\n\t\t\tcase Water::Water(11).ID: return 45;\n\t\t\tcase Water::Water(12).ID: return 46;\n\t\t\tcase Water::Water(13).ID: return 47;\n\t\t\tcase Water::Water(14).ID: return 48;\n\t\t\tcase Water::Water(15).ID: return 49;\n\t\t\tcase WetSponge::WetSponge().ID: return 229;\n\t\t\tcase Wheat::Wheat(0).ID: return 3355;\n\t\t\tcase Wheat::Wheat(1).ID: return 3356;\n\t\t\tcase Wheat::Wheat(2).ID: return 3357;\n\t\t\tcase Wheat::Wheat(3).ID: return 3358;\n\t\t\tcase Wheat::Wheat(4).ID: return 3359;\n\t\t\tcase Wheat::Wheat(5).ID: return 3360;\n\t\t\tcase Wheat::Wheat(6).ID: return 3361;\n\t\t\tcase Wheat::Wheat(7).ID: return 3362;\n\t\t\tcase WhiteBanner::WhiteBanner(0).ID: return 7361;\n\t\t\tcase WhiteBanner::WhiteBanner(1).ID: return 7362;\n\t\t\tcase WhiteBanner::WhiteBanner(2).ID: return 7363;\n\t\t\tcase WhiteBanner::WhiteBanner(3).ID: return 7364;\n\t\t\tcase WhiteBanner::WhiteBanner(4).ID: return 7365;\n\t\t\tcase WhiteBanner::WhiteBanner(5).ID: return 7366;\n\t\t\tcase WhiteBanner::WhiteBanner(6).ID: return 7367;\n\t\t\tcase WhiteBanner::WhiteBanner(7).ID: return 7368;\n\t\t\tcase WhiteBanner::WhiteBanner(8).ID: return 7369;\n\t\t\tcase WhiteBanner::WhiteBanner(9).ID: return 7370;\n\t\t\tcase WhiteBanner::WhiteBanner(10).ID: return 7371;\n\t\t\tcase WhiteBanner::WhiteBanner(11).ID: return 7372;\n\t\t\tcase WhiteBanner::WhiteBanner(12).ID: return 7373;\n\t\t\tcase WhiteBanner::WhiteBanner(13).ID: return 7374;\n\t\t\tcase WhiteBanner::WhiteBanner(14).ID: return 7375;\n\t\t\tcase WhiteBanner::WhiteBanner(15).ID: return 7376;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Head).ID: return 1048;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Foot).ID: return 1049;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Head).ID: return 1050;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Foot).ID: return 1051;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Head).ID: return 1052;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Foot).ID: return 1053;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Head).ID: return 1054;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Foot).ID: return 1055;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Head).ID: return 1056;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Foot).ID: return 1057;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Head).ID: return 1058;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Foot).ID: return 1059;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Head).ID: return 1060;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Foot).ID: return 1061;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Head).ID: return 1062;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Foot).ID: return 1063;\n\t\t\tcase WhiteCarpet::WhiteCarpet().ID: return 7330;\n\t\t\tcase WhiteConcrete::WhiteConcrete().ID: return 8902;\n\t\t\tcase WhiteConcretePowder::WhiteConcretePowder().ID: return 8918;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8838;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8839;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8840;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8841;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8742;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8743;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8744;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8745;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8746;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8747;\n\t\t\tcase WhiteStainedGlass::WhiteStainedGlass().ID: return 4081;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, true).ID: return 6329;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, false).ID: return 6330;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, true).ID: return 6333;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, false).ID: return 6334;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, true).ID: return 6337;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, false).ID: return 6338;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, true).ID: return 6341;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, false).ID: return 6342;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, true).ID: return 6345;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, false).ID: return 6346;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, true).ID: return 6349;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, false).ID: return 6350;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, true).ID: return 6353;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, false).ID: return 6354;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, true).ID: return 6357;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, false).ID: return 6358;\n\t\t\tcase WhiteTerracotta::WhiteTerracotta().ID: return 6311;\n\t\t\tcase WhiteTulip::WhiteTulip().ID: return 1418;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7617;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7618;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7619;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7620;\n\t\t\tcase WhiteWool::WhiteWool().ID: return 1383;\n\t\t\tcase WitherRose::WitherRose().ID: return 1422;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(0).ID: return 5974;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(1).ID: return 5975;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(2).ID: return 5976;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(3).ID: return 5977;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(4).ID: return 5978;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(5).ID: return 5979;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(6).ID: return 5980;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(7).ID: return 5981;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(8).ID: return 5982;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(9).ID: return 5983;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(10).ID: return 5984;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(11).ID: return 5985;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(12).ID: return 5986;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(13).ID: return 5987;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(14).ID: return 5988;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(15).ID: return 5989;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 5990;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 5991;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 5992;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 5993;\n\t\t\tcase YellowBanner::YellowBanner(0).ID: return 7425;\n\t\t\tcase YellowBanner::YellowBanner(1).ID: return 7426;\n\t\t\tcase YellowBanner::YellowBanner(2).ID: return 7427;\n\t\t\tcase YellowBanner::YellowBanner(3).ID: return 7428;\n\t\t\tcase YellowBanner::YellowBanner(4).ID: return 7429;\n\t\t\tcase YellowBanner::YellowBanner(5).ID: return 7430;\n\t\t\tcase YellowBanner::YellowBanner(6).ID: return 7431;\n\t\t\tcase YellowBanner::YellowBanner(7).ID: return 7432;\n\t\t\tcase YellowBanner::YellowBanner(8).ID: return 7433;\n\t\t\tcase YellowBanner::YellowBanner(9).ID: return 7434;\n\t\t\tcase YellowBanner::YellowBanner(10).ID: return 7435;\n\t\t\tcase YellowBanner::YellowBanner(11).ID: return 7436;\n\t\t\tcase YellowBanner::YellowBanner(12).ID: return 7437;\n\t\t\tcase YellowBanner::YellowBanner(13).ID: return 7438;\n\t\t\tcase YellowBanner::YellowBanner(14).ID: return 7439;\n\t\t\tcase YellowBanner::YellowBanner(15).ID: return 7440;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Head).ID: return 1112;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Foot).ID: return 1113;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Head).ID: return 1114;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Foot).ID: return 1115;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Head).ID: return 1116;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Foot).ID: return 1117;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Head).ID: return 1118;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Foot).ID: return 1119;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Head).ID: return 1120;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Foot).ID: return 1121;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Head).ID: return 1122;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Foot).ID: return 1123;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Head).ID: return 1124;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Foot).ID: return 1125;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Head).ID: return 1126;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Foot).ID: return 1127;\n\t\t\tcase YellowCarpet::YellowCarpet().ID: return 7334;\n\t\t\tcase YellowConcrete::YellowConcrete().ID: return 8906;\n\t\t\tcase YellowConcretePowder::YellowConcretePowder().ID: return 8922;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 8854;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 8855;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 8856;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 8857;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 8766;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 8767;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 8768;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 8769;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 8770;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 8771;\n\t\t\tcase YellowStainedGlass::YellowStainedGlass().ID: return 4085;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, true).ID: return 6457;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, false).ID: return 6458;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, true).ID: return 6461;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, false).ID: return 6462;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, true).ID: return 6465;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, false).ID: return 6466;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, true).ID: return 6469;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, false).ID: return 6470;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, true).ID: return 6473;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, false).ID: return 6474;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, true).ID: return 6477;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, false).ID: return 6478;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, true).ID: return 6481;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, false).ID: return 6482;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, true).ID: return 6485;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, false).ID: return 6486;\n\t\t\tcase YellowTerracotta::YellowTerracotta().ID: return 6315;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 7633;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 7634;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 7635;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 7636;\n\t\t\tcase YellowWool::YellowWool().ID: return 1387;\n\t\t\tcase ZombieHead::ZombieHead(0).ID: return 5994;\n\t\t\tcase ZombieHead::ZombieHead(1).ID: return 5995;\n\t\t\tcase ZombieHead::ZombieHead(2).ID: return 5996;\n\t\t\tcase ZombieHead::ZombieHead(3).ID: return 5997;\n\t\t\tcase ZombieHead::ZombieHead(4).ID: return 5998;\n\t\t\tcase ZombieHead::ZombieHead(5).ID: return 5999;\n\t\t\tcase ZombieHead::ZombieHead(6).ID: return 6000;\n\t\t\tcase ZombieHead::ZombieHead(7).ID: return 6001;\n\t\t\tcase ZombieHead::ZombieHead(8).ID: return 6002;\n\t\t\tcase ZombieHead::ZombieHead(9).ID: return 6003;\n\t\t\tcase ZombieHead::ZombieHead(10).ID: return 6004;\n\t\t\tcase ZombieHead::ZombieHead(11).ID: return 6005;\n\t\t\tcase ZombieHead::ZombieHead(12).ID: return 6006;\n\t\t\tcase ZombieHead::ZombieHead(13).ID: return 6007;\n\t\t\tcase ZombieHead::ZombieHead(14).ID: return 6008;\n\t\t\tcase ZombieHead::ZombieHead(15).ID: return 6009;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6010;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6011;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6012;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6013;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const Item ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase Item::AcaciaBoat: return 834;\n\t\t\tcase Item::AcaciaButton: return 263;\n\t\t\tcase Item::AcaciaDoor: return 511;\n\t\t\tcase Item::AcaciaFence: return 185;\n\t\t\tcase Item::AcaciaFenceGate: return 220;\n\t\t\tcase Item::AcaciaLeaves: return 60;\n\t\t\tcase Item::AcaciaLog: return 36;\n\t\t\tcase Item::AcaciaPlanks: return 17;\n\t\t\tcase Item::AcaciaPressurePlate: return 170;\n\t\t\tcase Item::AcaciaSapling: return 23;\n\t\t\tcase Item::AcaciaSign: return 593;\n\t\t\tcase Item::AcaciaSlab: return 119;\n\t\t\tcase Item::AcaciaStairs: return 319;\n\t\t\tcase Item::AcaciaTrapdoor: return 197;\n\t\t\tcase Item::AcaciaWood: return 54;\n\t\t\tcase Item::ActivatorRail: return 279;\n\t\t\tcase Item::Air: return -0;\n\t\t\tcase Item::Allium: return 101;\n\t\t\tcase Item::Andesite: return 6;\n\t\t\tcase Item::AndesiteSlab: return 501;\n\t\t\tcase Item::AndesiteStairs: return 488;\n\t\t\tcase Item::AndesiteWall: return 254;\n\t\t\tcase Item::Anvil: return 265;\n\t\t\tcase Item::Apple: return 524;\n\t\t\tcase Item::ArmorStand: return 792;\n\t\t\tcase Item::Arrow: return 526;\n\t\t\tcase Item::AzureBluet: return 102;\n\t\t\tcase Item::BakedPotato: return 765;\n\t\t\tcase Item::Bamboo: return 614;\n\t\t\tcase Item::Barrel: return 865;\n\t\t\tcase Item::Barrier: return 297;\n\t\t\tcase Item::BatSpawnEgg: return 697;\n\t\t\tcase Item::Beacon: return 244;\n\t\t\tcase Item::Bedrock: return 25;\n\t\t\tcase Item::BeeNest: return 879;\n\t\t\tcase Item::BeeSpawnEgg: return 698;\n\t\t\tcase Item::Beef: return 677;\n\t\t\tcase Item::Beehive: return 880;\n\t\t\tcase Item::Beetroot: return 821;\n\t\t\tcase Item::BeetrootSeeds: return 822;\n\t\t\tcase Item::BeetrootSoup: return 823;\n\t\t\tcase Item::Bell: return 874;\n\t\t\tcase Item::BirchBoat: return 832;\n\t\t\tcase Item::BirchButton: return 261;\n\t\t\tcase Item::BirchDoor: return 509;\n\t\t\tcase Item::BirchFence: return 183;\n\t\t\tcase Item::BirchFenceGate: return 218;\n\t\t\tcase Item::BirchLeaves: return 58;\n\t\t\tcase Item::BirchLog: return 34;\n\t\t\tcase Item::BirchPlanks: return 15;\n\t\t\tcase Item::BirchPressurePlate: return 168;\n\t\t\tcase Item::BirchSapling: return 21;\n\t\t\tcase Item::BirchSign: return 591;\n\t\t\tcase Item::BirchSlab: return 117;\n\t\t\tcase Item::BirchStairs: return 241;\n\t\t\tcase Item::BirchTrapdoor: return 195;\n\t\t\tcase Item::BirchWood: return 52;\n\t\t\tcase Item::BlackBanner: return 817;\n\t\t\tcase Item::BlackBed: return 669;\n\t\t\tcase Item::BlackCarpet: return 315;\n\t\t\tcase Item::BlackConcrete: return 428;\n\t\t\tcase Item::BlackConcretePowder: return 444;\n\t\t\tcase Item::BlackDye: return 649;\n\t\t\tcase Item::BlackGlazedTerracotta: return 412;\n\t\t\tcase Item::BlackShulkerBox: return 396;\n\t\t\tcase Item::BlackStainedGlass: return 344;\n\t\t\tcase Item::BlackStainedGlassPane: return 360;\n\t\t\tcase Item::BlackTerracotta: return 296;\n\t\t\tcase Item::BlackWool: return 97;\n\t\t\tcase Item::BlastFurnace: return 867;\n\t\t\tcase Item::BlazePowder: return 691;\n\t\t\tcase Item::BlazeRod: return 683;\n\t\t\tcase Item::BlazeSpawnEgg: return 699;\n\t\t\tcase Item::BlueBanner: return 813;\n\t\t\tcase Item::BlueBed: return 665;\n\t\t\tcase Item::BlueCarpet: return 311;\n\t\t\tcase Item::BlueConcrete: return 424;\n\t\t\tcase Item::BlueConcretePowder: return 440;\n\t\t\tcase Item::BlueDye: return 647;\n\t\t\tcase Item::BlueGlazedTerracotta: return 408;\n\t\t\tcase Item::BlueIce: return 476;\n\t\t\tcase Item::BlueOrchid: return 100;\n\t\t\tcase Item::BlueShulkerBox: return 392;\n\t\t\tcase Item::BlueStainedGlass: return 340;\n\t\t\tcase Item::BlueStainedGlassPane: return 356;\n\t\t\tcase Item::BlueTerracotta: return 292;\n\t\t\tcase Item::BlueWool: return 93;\n\t\t\tcase Item::Bone: return 651;\n\t\t\tcase Item::BoneBlock: return 377;\n\t\t\tcase Item::BoneMeal: return 646;\n\t\t\tcase Item::Book: return 616;\n\t\t\tcase Item::Bookshelf: return 143;\n\t\t\tcase Item::Bow: return 525;\n\t\t\tcase Item::Bowl: return 546;\n\t\t\tcase Item::BrainCoral: return 457;\n\t\t\tcase Item::BrainCoralBlock: return 452;\n\t\t\tcase Item::BrainCoralFan: return 467;\n\t\t\tcase Item::Bread: return 562;\n\t\t\tcase Item::BrewingStand: return 693;\n\t\t\tcase Item::Brick: return 609;\n\t\t\tcase Item::BrickSlab: return 127;\n\t\t\tcase Item::BrickStairs: return 222;\n\t\t\tcase Item::BrickWall: return 247;\n\t\t\tcase Item::Bricks: return 141;\n\t\t\tcase Item::BrownBanner: return 814;\n\t\t\tcase Item::BrownBed: return 666;\n\t\t\tcase Item::BrownCarpet: return 312;\n\t\t\tcase Item::BrownConcrete: return 425;\n\t\t\tcase Item::BrownConcretePowder: return 441;\n\t\t\tcase Item::BrownDye: return 648;\n\t\t\tcase Item::BrownGlazedTerracotta: return 409;\n\t\t\tcase Item::BrownMushroom: return 111;\n\t\t\tcase Item::BrownMushroomBlock: return 209;\n\t\t\tcase Item::BrownShulkerBox: return 393;\n\t\t\tcase Item::BrownStainedGlass: return 341;\n\t\t\tcase Item::BrownStainedGlassPane: return 357;\n\t\t\tcase Item::BrownTerracotta: return 293;\n\t\t\tcase Item::BrownWool: return 94;\n\t\t\tcase Item::BubbleCoral: return 458;\n\t\t\tcase Item::BubbleCoralBlock: return 453;\n\t\t\tcase Item::BubbleCoralFan: return 468;\n\t\t\tcase Item::Bucket: return 595;\n\t\t\tcase Item::Cactus: return 178;\n\t\t\tcase Item::Cake: return 653;\n\t\t\tcase Item::Campfire: return 877;\n\t\t\tcase Item::Carrot: return 763;\n\t\t\tcase Item::CarrotOnAStick: return 775;\n\t\t\tcase Item::CartographyTable: return 868;\n\t\t\tcase Item::CarvedPumpkin: return 188;\n\t\t\tcase Item::CatSpawnEgg: return 700;\n\t\t\tcase Item::Cauldron: return 694;\n\t\t\tcase Item::CaveSpiderSpawnEgg: return 701;\n\t\t\tcase Item::ChainCommandBlock: return 373;\n\t\t\tcase Item::ChainmailBoots: return 570;\n\t\t\tcase Item::ChainmailChestplate: return 568;\n\t\t\tcase Item::ChainmailHelmet: return 567;\n\t\t\tcase Item::ChainmailLeggings: return 569;\n\t\t\tcase Item::Charcoal: return 528;\n\t\t\tcase Item::Chest: return 155;\n\t\t\tcase Item::ChestMinecart: return 618;\n\t\t\tcase Item::Chicken: return 679;\n\t\t\tcase Item::ChickenSpawnEgg: return 702;\n\t\t\tcase Item::ChippedAnvil: return 266;\n\t\t\tcase Item::ChiseledQuartzBlock: return 275;\n\t\t\tcase Item::ChiseledRedSandstone: return 369;\n\t\t\tcase Item::ChiseledSandstone: return 69;\n\t\t\tcase Item::ChiseledStoneBricks: return 208;\n\t\t\tcase Item::ChorusFlower: return 149;\n\t\t\tcase Item::ChorusFruit: return 819;\n\t\t\tcase Item::ChorusPlant: return 148;\n\t\t\tcase Item::Clay: return 179;\n\t\t\tcase Item::ClayBall: return 610;\n\t\t\tcase Item::Clock: return 623;\n\t\t\tcase Item::Coal: return 527;\n\t\t\tcase Item::CoalBlock: return 317;\n\t\t\tcase Item::CoalOre: return 31;\n\t\t\tcase Item::CoarseDirt: return 10;\n\t\t\tcase Item::Cobblestone: return 12;\n\t\t\tcase Item::CobblestoneSlab: return 126;\n\t\t\tcase Item::CobblestoneStairs: return 163;\n\t\t\tcase Item::CobblestoneWall: return 245;\n\t\t\tcase Item::Cobweb: return 75;\n\t\t\tcase Item::CocoaBeans: return 634;\n\t\t\tcase Item::Cod: return 625;\n\t\t\tcase Item::CodBucket: return 607;\n\t\t\tcase Item::CodSpawnEgg: return 703;\n\t\t\tcase Item::CommandBlock: return 243;\n\t\t\tcase Item::CommandBlockMinecart: return 799;\n\t\t\tcase Item::Comparator: return 514;\n\t\t\tcase Item::Compass: return 621;\n\t\t\tcase Item::Composter: return 517;\n\t\t\tcase Item::Conduit: return 477;\n\t\t\tcase Item::CookedBeef: return 678;\n\t\t\tcase Item::CookedChicken: return 680;\n\t\t\tcase Item::CookedCod: return 629;\n\t\t\tcase Item::CookedMutton: return 801;\n\t\t\tcase Item::CookedPorkchop: return 585;\n\t\t\tcase Item::CookedRabbit: return 788;\n\t\t\tcase Item::CookedSalmon: return 630;\n\t\t\tcase Item::Cookie: return 670;\n\t\t\tcase Item::Cornflower: return 108;\n\t\t\tcase Item::CowSpawnEgg: return 704;\n\t\t\tcase Item::CrackedStoneBricks: return 207;\n\t\t\tcase Item::CraftingTable: return 158;\n\t\t\tcase Item::CreeperBannerPattern: return 861;\n\t\t\tcase Item::CreeperHead: return 773;\n\t\t\tcase Item::CreeperSpawnEgg: return 705;\n\t\t\tcase Item::Crossbow: return 857;\n\t\t\tcase Item::CutRedSandstone: return 370;\n\t\t\tcase Item::CutRedSandstoneSlab: return 132;\n\t\t\tcase Item::CutSandstone: return 70;\n\t\t\tcase Item::CutSandstoneSlab: return 124;\n\t\t\tcase Item::CyanBanner: return 811;\n\t\t\tcase Item::CyanBed: return 663;\n\t\t\tcase Item::CyanCarpet: return 309;\n\t\t\tcase Item::CyanConcrete: return 422;\n\t\t\tcase Item::CyanConcretePowder: return 438;\n\t\t\tcase Item::CyanDye: return 637;\n\t\t\tcase Item::CyanGlazedTerracotta: return 406;\n\t\t\tcase Item::CyanShulkerBox: return 390;\n\t\t\tcase Item::CyanStainedGlass: return 338;\n\t\t\tcase Item::CyanStainedGlassPane: return 354;\n\t\t\tcase Item::CyanTerracotta: return 290;\n\t\t\tcase Item::CyanWool: return 91;\n\t\t\tcase Item::DamagedAnvil: return 267;\n\t\t\tcase Item::Dandelion: return 98;\n\t\t\tcase Item::DarkOakBoat: return 835;\n\t\t\tcase Item::DarkOakButton: return 264;\n\t\t\tcase Item::DarkOakDoor: return 512;\n\t\t\tcase Item::DarkOakFence: return 186;\n\t\t\tcase Item::DarkOakFenceGate: return 221;\n\t\t\tcase Item::DarkOakLeaves: return 61;\n\t\t\tcase Item::DarkOakLog: return 37;\n\t\t\tcase Item::DarkOakPlanks: return 18;\n\t\t\tcase Item::DarkOakPressurePlate: return 171;\n\t\t\tcase Item::DarkOakSapling: return 24;\n\t\t\tcase Item::DarkOakSign: return 594;\n\t\t\tcase Item::DarkOakSlab: return 120;\n\t\t\tcase Item::DarkOakStairs: return 320;\n\t\t\tcase Item::DarkOakTrapdoor: return 198;\n\t\t\tcase Item::DarkOakWood: return 55;\n\t\t\tcase Item::DarkPrismarine: return 363;\n\t\t\tcase Item::DarkPrismarineSlab: return 136;\n\t\t\tcase Item::DarkPrismarineStairs: return 366;\n\t\t\tcase Item::DaylightDetector: return 271;\n\t\t\tcase Item::DeadBrainCoral: return 461;\n\t\t\tcase Item::DeadBrainCoralBlock: return 447;\n\t\t\tcase Item::DeadBrainCoralFan: return 472;\n\t\t\tcase Item::DeadBubbleCoral: return 462;\n\t\t\tcase Item::DeadBubbleCoralBlock: return 448;\n\t\t\tcase Item::DeadBubbleCoralFan: return 473;\n\t\t\tcase Item::DeadBush: return 78;\n\t\t\tcase Item::DeadFireCoral: return 463;\n\t\t\tcase Item::DeadFireCoralBlock: return 449;\n\t\t\tcase Item::DeadFireCoralFan: return 474;\n\t\t\tcase Item::DeadHornCoral: return 464;\n\t\t\tcase Item::DeadHornCoralBlock: return 450;\n\t\t\tcase Item::DeadHornCoralFan: return 475;\n\t\t\tcase Item::DeadTubeCoral: return 465;\n\t\t\tcase Item::DeadTubeCoralBlock: return 446;\n\t\t\tcase Item::DeadTubeCoralFan: return 471;\n\t\t\tcase Item::DebugStick: return 840;\n\t\t\tcase Item::DetectorRail: return 73;\n\t\t\tcase Item::Diamond: return 529;\n\t\t\tcase Item::DiamondAxe: return 544;\n\t\t\tcase Item::DiamondBlock: return 157;\n\t\t\tcase Item::DiamondBoots: return 578;\n\t\t\tcase Item::DiamondChestplate: return 576;\n\t\t\tcase Item::DiamondHelmet: return 575;\n\t\t\tcase Item::DiamondHoe: return 558;\n\t\t\tcase Item::DiamondHorseArmor: return 795;\n\t\t\tcase Item::DiamondLeggings: return 577;\n\t\t\tcase Item::DiamondOre: return 156;\n\t\t\tcase Item::DiamondPickaxe: return 543;\n\t\t\tcase Item::DiamondShovel: return 542;\n\t\t\tcase Item::DiamondSword: return 541;\n\t\t\tcase Item::Diorite: return 4;\n\t\t\tcase Item::DioriteSlab: return 504;\n\t\t\tcase Item::DioriteStairs: return 491;\n\t\t\tcase Item::DioriteWall: return 258;\n\t\t\tcase Item::Dirt: return 9;\n\t\t\tcase Item::Dispenser: return 67;\n\t\t\tcase Item::DolphinSpawnEgg: return 706;\n\t\t\tcase Item::DonkeySpawnEgg: return 707;\n\t\t\tcase Item::DragonBreath: return 824;\n\t\t\tcase Item::DragonEgg: return 233;\n\t\t\tcase Item::DragonHead: return 774;\n\t\t\tcase Item::DriedKelp: return 674;\n\t\t\tcase Item::DriedKelpBlock: return 613;\n\t\t\tcase Item::Dropper: return 280;\n\t\t\tcase Item::DrownedSpawnEgg: return 708;\n\t\t\tcase Item::Egg: return 620;\n\t\t\tcase Item::ElderGuardianSpawnEgg: return 709;\n\t\t\tcase Item::Elytra: return 830;\n\t\t\tcase Item::Emerald: return 760;\n\t\t\tcase Item::EmeraldBlock: return 239;\n\t\t\tcase Item::EmeraldOre: return 236;\n\t\t\tcase Item::EnchantedBook: return 780;\n\t\t\tcase Item::EnchantedGoldenApple: return 588;\n\t\t\tcase Item::EnchantingTable: return 229;\n\t\t\tcase Item::EndCrystal: return 818;\n\t\t\tcase Item::EndPortalFrame: return 230;\n\t\t\tcase Item::EndRod: return 147;\n\t\t\tcase Item::EndStone: return 231;\n\t\t\tcase Item::EndStoneBrickSlab: return 497;\n\t\t\tcase Item::EndStoneBrickStairs: return 483;\n\t\t\tcase Item::EndStoneBrickWall: return 257;\n\t\t\tcase Item::EndStoneBricks: return 232;\n\t\t\tcase Item::EnderChest: return 237;\n\t\t\tcase Item::EnderEye: return 695;\n\t\t\tcase Item::EnderPearl: return 682;\n\t\t\tcase Item::EndermanSpawnEgg: return 710;\n\t\t\tcase Item::EndermiteSpawnEgg: return 711;\n\t\t\tcase Item::EvokerSpawnEgg: return 712;\n\t\t\tcase Item::ExperienceBottle: return 756;\n\t\t\tcase Item::Farmland: return 159;\n\t\t\tcase Item::Feather: return 553;\n\t\t\tcase Item::FermentedSpiderEye: return 690;\n\t\t\tcase Item::Fern: return 77;\n\t\t\tcase Item::FilledMap: return 671;\n\t\t\tcase Item::FireCharge: return 757;\n\t\t\tcase Item::FireCoral: return 459;\n\t\t\tcase Item::FireCoralBlock: return 454;\n\t\t\tcase Item::FireCoralFan: return 469;\n\t\t\tcase Item::FireworkRocket: return 778;\n\t\t\tcase Item::FireworkStar: return 779;\n\t\t\tcase Item::FishingRod: return 622;\n\t\t\tcase Item::FletchingTable: return 869;\n\t\t\tcase Item::Flint: return 583;\n\t\t\tcase Item::FlintAndSteel: return 523;\n\t\t\tcase Item::FlowerBannerPattern: return 860;\n\t\t\tcase Item::FlowerPot: return 762;\n\t\t\tcase Item::FoxSpawnEgg: return 713;\n\t\t\tcase Item::Furnace: return 160;\n\t\t\tcase Item::FurnaceMinecart: return 619;\n\t\t\tcase Item::GhastSpawnEgg: return 714;\n\t\t\tcase Item::GhastTear: return 684;\n\t\t\tcase Item::Glass: return 64;\n\t\t\tcase Item::GlassBottle: return 688;\n\t\t\tcase Item::GlassPane: return 213;\n\t\t\tcase Item::GlisteringMelonSlice: return 696;\n\t\t\tcase Item::GlobeBannerPattern: return 864;\n\t\t\tcase Item::Glowstone: return 191;\n\t\t\tcase Item::GlowstoneDust: return 624;\n\t\t\tcase Item::GoldBlock: return 113;\n\t\t\tcase Item::GoldIngot: return 531;\n\t\t\tcase Item::GoldNugget: return 685;\n\t\t\tcase Item::GoldOre: return 29;\n\t\t\tcase Item::GoldenApple: return 587;\n\t\t\tcase Item::GoldenAxe: return 551;\n\t\t\tcase Item::GoldenBoots: return 582;\n\t\t\tcase Item::GoldenCarrot: return 768;\n\t\t\tcase Item::GoldenChestplate: return 580;\n\t\t\tcase Item::GoldenHelmet: return 579;\n\t\t\tcase Item::GoldenHoe: return 559;\n\t\t\tcase Item::GoldenHorseArmor: return 794;\n\t\t\tcase Item::GoldenLeggings: return 581;\n\t\t\tcase Item::GoldenPickaxe: return 550;\n\t\t\tcase Item::GoldenShovel: return 549;\n\t\t\tcase Item::GoldenSword: return 548;\n\t\t\tcase Item::Granite: return 2;\n\t\t\tcase Item::GraniteSlab: return 500;\n\t\t\tcase Item::GraniteStairs: return 487;\n\t\t\tcase Item::GraniteWall: return 251;\n\t\t\tcase Item::Grass: return 76;\n\t\t\tcase Item::GrassBlock: return 8;\n\t\t\tcase Item::GrassPath: return 322;\n\t\t\tcase Item::Gravel: return 28;\n\t\t\tcase Item::GrayBanner: return 809;\n\t\t\tcase Item::GrayBed: return 661;\n\t\t\tcase Item::GrayCarpet: return 307;\n\t\t\tcase Item::GrayConcrete: return 420;\n\t\t\tcase Item::GrayConcretePowder: return 436;\n\t\t\tcase Item::GrayDye: return 639;\n\t\t\tcase Item::GrayGlazedTerracotta: return 404;\n\t\t\tcase Item::GrayShulkerBox: return 388;\n\t\t\tcase Item::GrayStainedGlass: return 336;\n\t\t\tcase Item::GrayStainedGlassPane: return 352;\n\t\t\tcase Item::GrayTerracotta: return 288;\n\t\t\tcase Item::GrayWool: return 89;\n\t\t\tcase Item::GreenBanner: return 815;\n\t\t\tcase Item::GreenBed: return 667;\n\t\t\tcase Item::GreenCarpet: return 313;\n\t\t\tcase Item::GreenConcrete: return 426;\n\t\t\tcase Item::GreenConcretePowder: return 442;\n\t\t\tcase Item::GreenDye: return 633;\n\t\t\tcase Item::GreenGlazedTerracotta: return 410;\n\t\t\tcase Item::GreenShulkerBox: return 394;\n\t\t\tcase Item::GreenStainedGlass: return 342;\n\t\t\tcase Item::GreenStainedGlassPane: return 358;\n\t\t\tcase Item::GreenTerracotta: return 294;\n\t\t\tcase Item::GreenWool: return 95;\n\t\t\tcase Item::Grindstone: return 870;\n\t\t\tcase Item::GuardianSpawnEgg: return 715;\n\t\t\tcase Item::Gunpowder: return 554;\n\t\t\tcase Item::HayBale: return 299;\n\t\t\tcase Item::HeartOfTheSea: return 856;\n\t\t\tcase Item::HeavyWeightedPressurePlate: return 270;\n\t\t\tcase Item::HoneyBlock: return 882;\n\t\t\tcase Item::HoneyBottle: return 881;\n\t\t\tcase Item::Honeycomb: return 878;\n\t\t\tcase Item::HoneycombBlock: return 883;\n\t\t\tcase Item::Hopper: return 274;\n\t\t\tcase Item::HopperMinecart: return 784;\n\t\t\tcase Item::HornCoral: return 460;\n\t\t\tcase Item::HornCoralBlock: return 455;\n\t\t\tcase Item::HornCoralFan: return 470;\n\t\t\tcase Item::HorseSpawnEgg: return 716;\n\t\t\tcase Item::HuskSpawnEgg: return 717;\n\t\t\tcase Item::Ice: return 176;\n\t\t\tcase Item::InfestedChiseledStoneBricks: return 204;\n\t\t\tcase Item::InfestedCobblestone: return 200;\n\t\t\tcase Item::InfestedCrackedStoneBricks: return 203;\n\t\t\tcase Item::InfestedMossyStoneBricks: return 202;\n\t\t\tcase Item::InfestedStone: return 199;\n\t\t\tcase Item::InfestedStoneBricks: return 201;\n\t\t\tcase Item::InkSac: return 631;\n\t\t\tcase Item::IronAxe: return 522;\n\t\t\tcase Item::IronBars: return 212;\n\t\t\tcase Item::IronBlock: return 114;\n\t\t\tcase Item::IronBoots: return 574;\n\t\t\tcase Item::IronChestplate: return 572;\n\t\t\tcase Item::IronDoor: return 506;\n\t\t\tcase Item::IronHelmet: return 571;\n\t\t\tcase Item::IronHoe: return 557;\n\t\t\tcase Item::IronHorseArmor: return 793;\n\t\t\tcase Item::IronIngot: return 530;\n\t\t\tcase Item::IronLeggings: return 573;\n\t\t\tcase Item::IronNugget: return 838;\n\t\t\tcase Item::IronOre: return 30;\n\t\t\tcase Item::IronPickaxe: return 521;\n\t\t\tcase Item::IronShovel: return 520;\n\t\t\tcase Item::IronSword: return 532;\n\t\t\tcase Item::IronTrapdoor: return 298;\n\t\t\tcase Item::ItemFrame: return 761;\n\t\t\tcase Item::JackOLantern: return 192;\n\t\t\tcase Item::Jigsaw: return 516;\n\t\t\tcase Item::Jukebox: return 180;\n\t\t\tcase Item::JungleBoat: return 833;\n\t\t\tcase Item::JungleButton: return 262;\n\t\t\tcase Item::JungleDoor: return 510;\n\t\t\tcase Item::JungleFence: return 184;\n\t\t\tcase Item::JungleFenceGate: return 219;\n\t\t\tcase Item::JungleLeaves: return 59;\n\t\t\tcase Item::JungleLog: return 35;\n\t\t\tcase Item::JunglePlanks: return 16;\n\t\t\tcase Item::JunglePressurePlate: return 169;\n\t\t\tcase Item::JungleSapling: return 22;\n\t\t\tcase Item::JungleSign: return 592;\n\t\t\tcase Item::JungleSlab: return 118;\n\t\t\tcase Item::JungleStairs: return 242;\n\t\t\tcase Item::JungleTrapdoor: return 196;\n\t\t\tcase Item::JungleWood: return 53;\n\t\t\tcase Item::Kelp: return 612;\n\t\t\tcase Item::KnowledgeBook: return 839;\n\t\t\tcase Item::Ladder: return 161;\n\t\t\tcase Item::Lantern: return 875;\n\t\t\tcase Item::LapisBlock: return 66;\n\t\t\tcase Item::LapisLazuli: return 635;\n\t\t\tcase Item::LapisOre: return 65;\n\t\t\tcase Item::LargeFern: return 328;\n\t\t\tcase Item::LavaBucket: return 597;\n\t\t\tcase Item::Lead: return 797;\n\t\t\tcase Item::Leather: return 603;\n\t\t\tcase Item::LeatherBoots: return 566;\n\t\t\tcase Item::LeatherChestplate: return 564;\n\t\t\tcase Item::LeatherHelmet: return 563;\n\t\t\tcase Item::LeatherHorseArmor: return 796;\n\t\t\tcase Item::LeatherLeggings: return 565;\n\t\t\tcase Item::Lectern: return 871;\n\t\t\tcase Item::Lever: return 164;\n\t\t\tcase Item::LightBlueBanner: return 805;\n\t\t\tcase Item::LightBlueBed: return 657;\n\t\t\tcase Item::LightBlueCarpet: return 303;\n\t\t\tcase Item::LightBlueConcrete: return 416;\n\t\t\tcase Item::LightBlueConcretePowder: return 432;\n\t\t\tcase Item::LightBlueDye: return 643;\n\t\t\tcase Item::LightBlueGlazedTerracotta: return 400;\n\t\t\tcase Item::LightBlueShulkerBox: return 384;\n\t\t\tcase Item::LightBlueStainedGlass: return 332;\n\t\t\tcase Item::LightBlueStainedGlassPane: return 348;\n\t\t\tcase Item::LightBlueTerracotta: return 284;\n\t\t\tcase Item::LightBlueWool: return 85;\n\t\t\tcase Item::LightGrayBanner: return 810;\n\t\t\tcase Item::LightGrayBed: return 662;\n\t\t\tcase Item::LightGrayCarpet: return 308;\n\t\t\tcase Item::LightGrayConcrete: return 421;\n\t\t\tcase Item::LightGrayConcretePowder: return 437;\n\t\t\tcase Item::LightGrayDye: return 638;\n\t\t\tcase Item::LightGrayGlazedTerracotta: return 405;\n\t\t\tcase Item::LightGrayShulkerBox: return 389;\n\t\t\tcase Item::LightGrayStainedGlass: return 337;\n\t\t\tcase Item::LightGrayStainedGlassPane: return 353;\n\t\t\tcase Item::LightGrayTerracotta: return 289;\n\t\t\tcase Item::LightGrayWool: return 90;\n\t\t\tcase Item::LightWeightedPressurePlate: return 269;\n\t\t\tcase Item::Lilac: return 324;\n\t\t\tcase Item::LilyOfTheValley: return 109;\n\t\t\tcase Item::LilyPad: return 225;\n\t\t\tcase Item::LimeBanner: return 807;\n\t\t\tcase Item::LimeBed: return 659;\n\t\t\tcase Item::LimeCarpet: return 305;\n\t\t\tcase Item::LimeConcrete: return 418;\n\t\t\tcase Item::LimeConcretePowder: return 434;\n\t\t\tcase Item::LimeDye: return 641;\n\t\t\tcase Item::LimeGlazedTerracotta: return 402;\n\t\t\tcase Item::LimeShulkerBox: return 386;\n\t\t\tcase Item::LimeStainedGlass: return 334;\n\t\t\tcase Item::LimeStainedGlassPane: return 350;\n\t\t\tcase Item::LimeTerracotta: return 286;\n\t\t\tcase Item::LimeWool: return 87;\n\t\t\tcase Item::LingeringPotion: return 828;\n\t\t\tcase Item::LlamaSpawnEgg: return 718;\n\t\t\tcase Item::Loom: return 859;\n\t\t\tcase Item::MagentaBanner: return 804;\n\t\t\tcase Item::MagentaBed: return 656;\n\t\t\tcase Item::MagentaCarpet: return 302;\n\t\t\tcase Item::MagentaConcrete: return 415;\n\t\t\tcase Item::MagentaConcretePowder: return 431;\n\t\t\tcase Item::MagentaDye: return 644;\n\t\t\tcase Item::MagentaGlazedTerracotta: return 399;\n\t\t\tcase Item::MagentaShulkerBox: return 383;\n\t\t\tcase Item::MagentaStainedGlass: return 331;\n\t\t\tcase Item::MagentaStainedGlassPane: return 347;\n\t\t\tcase Item::MagentaTerracotta: return 283;\n\t\t\tcase Item::MagentaWool: return 84;\n\t\t\tcase Item::MagmaBlock: return 374;\n\t\t\tcase Item::MagmaCream: return 692;\n\t\t\tcase Item::MagmaCubeSpawnEgg: return 719;\n\t\t\tcase Item::Map: return 767;\n\t\t\tcase Item::Melon: return 214;\n\t\t\tcase Item::MelonSeeds: return 676;\n\t\t\tcase Item::MelonSlice: return 673;\n\t\t\tcase Item::MilkBucket: return 604;\n\t\t\tcase Item::Minecart: return 598;\n\t\t\tcase Item::MojangBannerPattern: return 863;\n\t\t\tcase Item::MooshroomSpawnEgg: return 720;\n\t\t\tcase Item::MossyCobblestone: return 144;\n\t\t\tcase Item::MossyCobblestoneSlab: return 496;\n\t\t\tcase Item::MossyCobblestoneStairs: return 482;\n\t\t\tcase Item::MossyCobblestoneWall: return 246;\n\t\t\tcase Item::MossyStoneBrickSlab: return 494;\n\t\t\tcase Item::MossyStoneBrickStairs: return 480;\n\t\t\tcase Item::MossyStoneBrickWall: return 250;\n\t\t\tcase Item::MossyStoneBricks: return 206;\n\t\t\tcase Item::MuleSpawnEgg: return 721;\n\t\t\tcase Item::MushroomStem: return 211;\n\t\t\tcase Item::MushroomStew: return 547;\n\t\t\tcase Item::MusicDisc11: return 851;\n\t\t\tcase Item::MusicDisc13: return 841;\n\t\t\tcase Item::MusicDiscBlocks: return 843;\n\t\t\tcase Item::MusicDiscCat: return 842;\n\t\t\tcase Item::MusicDiscChirp: return 844;\n\t\t\tcase Item::MusicDiscFar: return 845;\n\t\t\tcase Item::MusicDiscMall: return 846;\n\t\t\tcase Item::MusicDiscMellohi: return 847;\n\t\t\tcase Item::MusicDiscStal: return 848;\n\t\t\tcase Item::MusicDiscStrad: return 849;\n\t\t\tcase Item::MusicDiscWait: return 852;\n\t\t\tcase Item::MusicDiscWard: return 850;\n\t\t\tcase Item::Mutton: return 800;\n\t\t\tcase Item::Mycelium: return 224;\n\t\t\tcase Item::NameTag: return 798;\n\t\t\tcase Item::NautilusShell: return 855;\n\t\t\tcase Item::NetherBrick: return 781;\n\t\t\tcase Item::NetherBrickFence: return 227;\n\t\t\tcase Item::NetherBrickSlab: return 129;\n\t\t\tcase Item::NetherBrickStairs: return 228;\n\t\t\tcase Item::NetherBrickWall: return 253;\n\t\t\tcase Item::NetherBricks: return 226;\n\t\t\tcase Item::NetherQuartzOre: return 273;\n\t\t\tcase Item::NetherStar: return 776;\n\t\t\tcase Item::NetherWart: return 686;\n\t\t\tcase Item::NetherWartBlock: return 375;\n\t\t\tcase Item::Netherrack: return 189;\n\t\t\tcase Item::NoteBlock: return 71;\n\t\t\tcase Item::OakBoat: return 602;\n\t\t\tcase Item::OakButton: return 259;\n\t\t\tcase Item::OakDoor: return 507;\n\t\t\tcase Item::OakFence: return 181;\n\t\t\tcase Item::OakFenceGate: return 216;\n\t\t\tcase Item::OakLeaves: return 56;\n\t\t\tcase Item::OakLog: return 32;\n\t\t\tcase Item::OakPlanks: return 13;\n\t\t\tcase Item::OakPressurePlate: return 166;\n\t\t\tcase Item::OakSapling: return 19;\n\t\t\tcase Item::OakSign: return 589;\n\t\t\tcase Item::OakSlab: return 115;\n\t\t\tcase Item::OakStairs: return 154;\n\t\t\tcase Item::OakTrapdoor: return 193;\n\t\t\tcase Item::OakWood: return 50;\n\t\t\tcase Item::Observer: return 379;\n\t\t\tcase Item::Obsidian: return 145;\n\t\t\tcase Item::OcelotSpawnEgg: return 722;\n\t\t\tcase Item::OrangeBanner: return 803;\n\t\t\tcase Item::OrangeBed: return 655;\n\t\t\tcase Item::OrangeCarpet: return 301;\n\t\t\tcase Item::OrangeConcrete: return 414;\n\t\t\tcase Item::OrangeConcretePowder: return 430;\n\t\t\tcase Item::OrangeDye: return 645;\n\t\t\tcase Item::OrangeGlazedTerracotta: return 398;\n\t\t\tcase Item::OrangeShulkerBox: return 382;\n\t\t\tcase Item::OrangeStainedGlass: return 330;\n\t\t\tcase Item::OrangeStainedGlassPane: return 346;\n\t\t\tcase Item::OrangeTerracotta: return 282;\n\t\t\tcase Item::OrangeTulip: return 104;\n\t\t\tcase Item::OrangeWool: return 83;\n\t\t\tcase Item::OxeyeDaisy: return 107;\n\t\t\tcase Item::PackedIce: return 318;\n\t\t\tcase Item::Painting: return 586;\n\t\t\tcase Item::PandaSpawnEgg: return 723;\n\t\t\tcase Item::Paper: return 615;\n\t\t\tcase Item::ParrotSpawnEgg: return 724;\n\t\t\tcase Item::Peony: return 326;\n\t\t\tcase Item::PetrifiedOakSlab: return 125;\n\t\t\tcase Item::PhantomMembrane: return 854;\n\t\t\tcase Item::PhantomSpawnEgg: return 725;\n\t\t\tcase Item::PigSpawnEgg: return 726;\n\t\t\tcase Item::PillagerSpawnEgg: return 727;\n\t\t\tcase Item::PinkBanner: return 808;\n\t\t\tcase Item::PinkBed: return 660;\n\t\t\tcase Item::PinkCarpet: return 306;\n\t\t\tcase Item::PinkConcrete: return 419;\n\t\t\tcase Item::PinkConcretePowder: return 435;\n\t\t\tcase Item::PinkDye: return 640;\n\t\t\tcase Item::PinkGlazedTerracotta: return 403;\n\t\t\tcase Item::PinkShulkerBox: return 387;\n\t\t\tcase Item::PinkStainedGlass: return 335;\n\t\t\tcase Item::PinkStainedGlassPane: return 351;\n\t\t\tcase Item::PinkTerracotta: return 287;\n\t\t\tcase Item::PinkTulip: return 106;\n\t\t\tcase Item::PinkWool: return 88;\n\t\t\tcase Item::Piston: return 81;\n\t\t\tcase Item::PlayerHead: return 771;\n\t\t\tcase Item::Podzol: return 11;\n\t\t\tcase Item::PoisonousPotato: return 766;\n\t\t\tcase Item::PolarBearSpawnEgg: return 728;\n\t\t\tcase Item::PolishedAndesite: return 7;\n\t\t\tcase Item::PolishedAndesiteSlab: return 503;\n\t\t\tcase Item::PolishedAndesiteStairs: return 490;\n\t\t\tcase Item::PolishedDiorite: return 5;\n\t\t\tcase Item::PolishedDioriteSlab: return 495;\n\t\t\tcase Item::PolishedDioriteStairs: return 481;\n\t\t\tcase Item::PolishedGranite: return 3;\n\t\t\tcase Item::PolishedGraniteSlab: return 492;\n\t\t\tcase Item::PolishedGraniteStairs: return 478;\n\t\t\tcase Item::PoppedChorusFruit: return 820;\n\t\t\tcase Item::Poppy: return 99;\n\t\t\tcase Item::Porkchop: return 584;\n\t\t\tcase Item::Potato: return 764;\n\t\t\tcase Item::Potion: return 687;\n\t\t\tcase Item::PoweredRail: return 72;\n\t\t\tcase Item::Prismarine: return 361;\n\t\t\tcase Item::PrismarineBrickSlab: return 135;\n\t\t\tcase Item::PrismarineBrickStairs: return 365;\n\t\t\tcase Item::PrismarineBricks: return 362;\n\t\t\tcase Item::PrismarineCrystals: return 786;\n\t\t\tcase Item::PrismarineShard: return 785;\n\t\t\tcase Item::PrismarineSlab: return 134;\n\t\t\tcase Item::PrismarineStairs: return 364;\n\t\t\tcase Item::PrismarineWall: return 248;\n\t\t\tcase Item::Pufferfish: return 628;\n\t\t\tcase Item::PufferfishBucket: return 605;\n\t\t\tcase Item::PufferfishSpawnEgg: return 729;\n\t\t\tcase Item::Pumpkin: return 187;\n\t\t\tcase Item::PumpkinPie: return 777;\n\t\t\tcase Item::PumpkinSeeds: return 675;\n\t\t\tcase Item::PurpleBanner: return 812;\n\t\t\tcase Item::PurpleBed: return 664;\n\t\t\tcase Item::PurpleCarpet: return 310;\n\t\t\tcase Item::PurpleConcrete: return 423;\n\t\t\tcase Item::PurpleConcretePowder: return 439;\n\t\t\tcase Item::PurpleDye: return 636;\n\t\t\tcase Item::PurpleGlazedTerracotta: return 407;\n\t\t\tcase Item::PurpleShulkerBox: return 391;\n\t\t\tcase Item::PurpleStainedGlass: return 339;\n\t\t\tcase Item::PurpleStainedGlassPane: return 355;\n\t\t\tcase Item::PurpleTerracotta: return 291;\n\t\t\tcase Item::PurpleWool: return 92;\n\t\t\tcase Item::PurpurBlock: return 150;\n\t\t\tcase Item::PurpurPillar: return 151;\n\t\t\tcase Item::PurpurSlab: return 133;\n\t\t\tcase Item::PurpurStairs: return 152;\n\t\t\tcase Item::Quartz: return 782;\n\t\t\tcase Item::QuartzBlock: return 276;\n\t\t\tcase Item::QuartzPillar: return 277;\n\t\t\tcase Item::QuartzSlab: return 130;\n\t\t\tcase Item::QuartzStairs: return 278;\n\t\t\tcase Item::Rabbit: return 787;\n\t\t\tcase Item::RabbitFoot: return 790;\n\t\t\tcase Item::RabbitHide: return 791;\n\t\t\tcase Item::RabbitSpawnEgg: return 730;\n\t\t\tcase Item::RabbitStew: return 789;\n\t\t\tcase Item::Rail: return 162;\n\t\t\tcase Item::RavagerSpawnEgg: return 731;\n\t\t\tcase Item::RedBanner: return 816;\n\t\t\tcase Item::RedBed: return 668;\n\t\t\tcase Item::RedCarpet: return 314;\n\t\t\tcase Item::RedConcrete: return 427;\n\t\t\tcase Item::RedConcretePowder: return 443;\n\t\t\tcase Item::RedDye: return 632;\n\t\t\tcase Item::RedGlazedTerracotta: return 411;\n\t\t\tcase Item::RedMushroom: return 112;\n\t\t\tcase Item::RedMushroomBlock: return 210;\n\t\t\tcase Item::RedNetherBrickSlab: return 502;\n\t\t\tcase Item::RedNetherBrickStairs: return 489;\n\t\t\tcase Item::RedNetherBrickWall: return 255;\n\t\t\tcase Item::RedNetherBricks: return 376;\n\t\t\tcase Item::RedSand: return 27;\n\t\t\tcase Item::RedSandstone: return 368;\n\t\t\tcase Item::RedSandstoneSlab: return 131;\n\t\t\tcase Item::RedSandstoneStairs: return 371;\n\t\t\tcase Item::RedSandstoneWall: return 249;\n\t\t\tcase Item::RedShulkerBox: return 395;\n\t\t\tcase Item::RedStainedGlass: return 343;\n\t\t\tcase Item::RedStainedGlassPane: return 359;\n\t\t\tcase Item::RedTerracotta: return 295;\n\t\t\tcase Item::RedTulip: return 103;\n\t\t\tcase Item::RedWool: return 96;\n\t\t\tcase Item::Redstone: return 600;\n\t\t\tcase Item::RedstoneBlock: return 272;\n\t\t\tcase Item::RedstoneLamp: return 234;\n\t\t\tcase Item::RedstoneOre: return 172;\n\t\t\tcase Item::RedstoneTorch: return 173;\n\t\t\tcase Item::Repeater: return 513;\n\t\t\tcase Item::RepeatingCommandBlock: return 372;\n\t\t\tcase Item::RoseBush: return 325;\n\t\t\tcase Item::RottenFlesh: return 681;\n\t\t\tcase Item::Saddle: return 599;\n\t\t\tcase Item::Salmon: return 626;\n\t\t\tcase Item::SalmonBucket: return 606;\n\t\t\tcase Item::SalmonSpawnEgg: return 732;\n\t\t\tcase Item::Sand: return 26;\n\t\t\tcase Item::Sandstone: return 68;\n\t\t\tcase Item::SandstoneSlab: return 123;\n\t\t\tcase Item::SandstoneStairs: return 235;\n\t\t\tcase Item::SandstoneWall: return 256;\n\t\t\tcase Item::Scaffolding: return 505;\n\t\t\tcase Item::Scute: return 519;\n\t\t\tcase Item::SeaLantern: return 367;\n\t\t\tcase Item::SeaPickle: return 80;\n\t\t\tcase Item::Seagrass: return 79;\n\t\t\tcase Item::Shears: return 672;\n\t\t\tcase Item::SheepSpawnEgg: return 733;\n\t\t\tcase Item::Shield: return 829;\n\t\t\tcase Item::ShulkerBox: return 380;\n\t\t\tcase Item::ShulkerShell: return 837;\n\t\t\tcase Item::ShulkerSpawnEgg: return 734;\n\t\t\tcase Item::SilverfishSpawnEgg: return 735;\n\t\t\tcase Item::SkeletonHorseSpawnEgg: return 737;\n\t\t\tcase Item::SkeletonSkull: return 769;\n\t\t\tcase Item::SkeletonSpawnEgg: return 736;\n\t\t\tcase Item::SkullBannerPattern: return 862;\n\t\t\tcase Item::SlimeBall: return 617;\n\t\t\tcase Item::SlimeBlock: return 321;\n\t\t\tcase Item::SlimeSpawnEgg: return 738;\n\t\t\tcase Item::SmithingTable: return 872;\n\t\t\tcase Item::Smoker: return 866;\n\t\t\tcase Item::SmoothQuartz: return 137;\n\t\t\tcase Item::SmoothQuartzSlab: return 499;\n\t\t\tcase Item::SmoothQuartzStairs: return 486;\n\t\t\tcase Item::SmoothRedSandstone: return 138;\n\t\t\tcase Item::SmoothRedSandstoneSlab: return 493;\n\t\t\tcase Item::SmoothRedSandstoneStairs: return 479;\n\t\t\tcase Item::SmoothSandstone: return 139;\n\t\t\tcase Item::SmoothSandstoneSlab: return 498;\n\t\t\tcase Item::SmoothSandstoneStairs: return 485;\n\t\t\tcase Item::SmoothStone: return 140;\n\t\t\tcase Item::SmoothStoneSlab: return 122;\n\t\t\tcase Item::Snow: return 175;\n\t\t\tcase Item::SnowBlock: return 177;\n\t\t\tcase Item::Snowball: return 601;\n\t\t\tcase Item::SoulSand: return 190;\n\t\t\tcase Item::Spawner: return 153;\n\t\t\tcase Item::SpectralArrow: return 826;\n\t\t\tcase Item::SpiderEye: return 689;\n\t\t\tcase Item::SpiderSpawnEgg: return 739;\n\t\t\tcase Item::SplashPotion: return 825;\n\t\t\tcase Item::Sponge: return 62;\n\t\t\tcase Item::SpruceBoat: return 831;\n\t\t\tcase Item::SpruceButton: return 260;\n\t\t\tcase Item::SpruceDoor: return 508;\n\t\t\tcase Item::SpruceFence: return 182;\n\t\t\tcase Item::SpruceFenceGate: return 217;\n\t\t\tcase Item::SpruceLeaves: return 57;\n\t\t\tcase Item::SpruceLog: return 33;\n\t\t\tcase Item::SprucePlanks: return 14;\n\t\t\tcase Item::SprucePressurePlate: return 167;\n\t\t\tcase Item::SpruceSapling: return 20;\n\t\t\tcase Item::SpruceSign: return 590;\n\t\t\tcase Item::SpruceSlab: return 116;\n\t\t\tcase Item::SpruceStairs: return 240;\n\t\t\tcase Item::SpruceTrapdoor: return 194;\n\t\t\tcase Item::SpruceWood: return 51;\n\t\t\tcase Item::SquidSpawnEgg: return 740;\n\t\t\tcase Item::Stick: return 545;\n\t\t\tcase Item::StickyPiston: return 74;\n\t\t\tcase Item::Stone: return 1;\n\t\t\tcase Item::StoneAxe: return 540;\n\t\t\tcase Item::StoneBrickSlab: return 128;\n\t\t\tcase Item::StoneBrickStairs: return 223;\n\t\t\tcase Item::StoneBrickWall: return 252;\n\t\t\tcase Item::StoneBricks: return 205;\n\t\t\tcase Item::StoneButton: return 174;\n\t\t\tcase Item::StoneHoe: return 556;\n\t\t\tcase Item::StonePickaxe: return 539;\n\t\t\tcase Item::StonePressurePlate: return 165;\n\t\t\tcase Item::StoneShovel: return 538;\n\t\t\tcase Item::StoneSlab: return 121;\n\t\t\tcase Item::StoneStairs: return 484;\n\t\t\tcase Item::StoneSword: return 537;\n\t\t\tcase Item::Stonecutter: return 873;\n\t\t\tcase Item::StraySpawnEgg: return 741;\n\t\t\tcase Item::String: return 552;\n\t\t\tcase Item::StrippedAcaciaLog: return 42;\n\t\t\tcase Item::StrippedAcaciaWood: return 48;\n\t\t\tcase Item::StrippedBirchLog: return 40;\n\t\t\tcase Item::StrippedBirchWood: return 46;\n\t\t\tcase Item::StrippedDarkOakLog: return 43;\n\t\t\tcase Item::StrippedDarkOakWood: return 49;\n\t\t\tcase Item::StrippedJungleLog: return 41;\n\t\t\tcase Item::StrippedJungleWood: return 47;\n\t\t\tcase Item::StrippedOakLog: return 38;\n\t\t\tcase Item::StrippedOakWood: return 44;\n\t\t\tcase Item::StrippedSpruceLog: return 39;\n\t\t\tcase Item::StrippedSpruceWood: return 45;\n\t\t\tcase Item::StructureBlock: return 515;\n\t\t\tcase Item::StructureVoid: return 378;\n\t\t\tcase Item::Sugar: return 652;\n\t\t\tcase Item::SugarCane: return 611;\n\t\t\tcase Item::Sunflower: return 323;\n\t\t\tcase Item::SuspiciousStew: return 858;\n\t\t\tcase Item::SweetBerries: return 876;\n\t\t\tcase Item::TallGrass: return 327;\n\t\t\tcase Item::Terracotta: return 316;\n\t\t\tcase Item::TippedArrow: return 827;\n\t\t\tcase Item::TNT: return 142;\n\t\t\tcase Item::TNTMinecart: return 783;\n\t\t\tcase Item::Torch: return 146;\n\t\t\tcase Item::TotemOfUndying: return 836;\n\t\t\tcase Item::TraderLlamaSpawnEgg: return 742;\n\t\t\tcase Item::TrappedChest: return 268;\n\t\t\tcase Item::Trident: return 853;\n\t\t\tcase Item::TripwireHook: return 238;\n\t\t\tcase Item::TropicalFish: return 627;\n\t\t\tcase Item::TropicalFishBucket: return 608;\n\t\t\tcase Item::TropicalFishSpawnEgg: return 743;\n\t\t\tcase Item::TubeCoral: return 456;\n\t\t\tcase Item::TubeCoralBlock: return 451;\n\t\t\tcase Item::TubeCoralFan: return 466;\n\t\t\tcase Item::TurtleEgg: return 445;\n\t\t\tcase Item::TurtleHelmet: return 518;\n\t\t\tcase Item::TurtleSpawnEgg: return 744;\n\t\t\tcase Item::VexSpawnEgg: return 745;\n\t\t\tcase Item::VillagerSpawnEgg: return 746;\n\t\t\tcase Item::VindicatorSpawnEgg: return 747;\n\t\t\tcase Item::Vine: return 215;\n\t\t\tcase Item::WanderingTraderSpawnEgg: return 748;\n\t\t\tcase Item::WaterBucket: return 596;\n\t\t\tcase Item::WetSponge: return 63;\n\t\t\tcase Item::Wheat: return 561;\n\t\t\tcase Item::WheatSeeds: return 560;\n\t\t\tcase Item::WhiteBanner: return 802;\n\t\t\tcase Item::WhiteBed: return 654;\n\t\t\tcase Item::WhiteCarpet: return 300;\n\t\t\tcase Item::WhiteConcrete: return 413;\n\t\t\tcase Item::WhiteConcretePowder: return 429;\n\t\t\tcase Item::WhiteDye: return 650;\n\t\t\tcase Item::WhiteGlazedTerracotta: return 397;\n\t\t\tcase Item::WhiteShulkerBox: return 381;\n\t\t\tcase Item::WhiteStainedGlass: return 329;\n\t\t\tcase Item::WhiteStainedGlassPane: return 345;\n\t\t\tcase Item::WhiteTerracotta: return 281;\n\t\t\tcase Item::WhiteTulip: return 105;\n\t\t\tcase Item::WhiteWool: return 82;\n\t\t\tcase Item::WitchSpawnEgg: return 749;\n\t\t\tcase Item::WitherRose: return 110;\n\t\t\tcase Item::WitherSkeletonSkull: return 770;\n\t\t\tcase Item::WitherSkeletonSpawnEgg: return 750;\n\t\t\tcase Item::WolfSpawnEgg: return 751;\n\t\t\tcase Item::WoodenAxe: return 536;\n\t\t\tcase Item::WoodenHoe: return 555;\n\t\t\tcase Item::WoodenPickaxe: return 535;\n\t\t\tcase Item::WoodenShovel: return 534;\n\t\t\tcase Item::WoodenSword: return 533;\n\t\t\tcase Item::WritableBook: return 758;\n\t\t\tcase Item::WrittenBook: return 759;\n\t\t\tcase Item::YellowBanner: return 806;\n\t\t\tcase Item::YellowBed: return 658;\n\t\t\tcase Item::YellowCarpet: return 304;\n\t\t\tcase Item::YellowConcrete: return 417;\n\t\t\tcase Item::YellowConcretePowder: return 433;\n\t\t\tcase Item::YellowDye: return 642;\n\t\t\tcase Item::YellowGlazedTerracotta: return 401;\n\t\t\tcase Item::YellowShulkerBox: return 385;\n\t\t\tcase Item::YellowStainedGlass: return 333;\n\t\t\tcase Item::YellowStainedGlassPane: return 349;\n\t\t\tcase Item::YellowTerracotta: return 285;\n\t\t\tcase Item::YellowWool: return 86;\n\t\t\tcase Item::ZombieHead: return 772;\n\t\t\tcase Item::ZombieHorseSpawnEgg: return 753;\n\t\t\tcase Item::ZombiePigmanSpawnEgg: return 754;\n\t\t\tcase Item::ZombieSpawnEgg: return 752;\n\t\t\tcase Item::ZombieVillagerSpawnEgg: return 755;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const CustomStatistic ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase CustomStatistic::AnimalsBred: return 30;\n\t\t\tcase CustomStatistic::AviateOneCm: return 17;\n\t\t\tcase CustomStatistic::BellRing: return 66;\n\t\t\tcase CustomStatistic::BoatOneCm: return 14;\n\t\t\tcase CustomStatistic::CleanArmor: return 38;\n\t\t\tcase CustomStatistic::CleanBanner: return 39;\n\t\t\tcase CustomStatistic::CleanShulkerBox: return 40;\n\t\t\tcase CustomStatistic::ClimbOneCm: return 10;\n\t\t\tcase CustomStatistic::CrouchOneCm: return 6;\n\t\t\tcase CustomStatistic::DamageAbsorbed: return 26;\n\t\t\tcase CustomStatistic::DamageBlockedByShield: return 25;\n\t\t\tcase CustomStatistic::DamageDealt: return 21;\n\t\t\tcase CustomStatistic::DamageDealtAbsorbed: return 22;\n\t\t\tcase CustomStatistic::DamageDealtResisted: return 23;\n\t\t\tcase CustomStatistic::DamageResisted: return 27;\n\t\t\tcase CustomStatistic::DamageTaken: return 24;\n\t\t\tcase CustomStatistic::Deaths: return 28;\n\t\t\tcase CustomStatistic::Drop: return 20;\n\t\t\tcase CustomStatistic::EatCakeSlice: return 35;\n\t\t\tcase CustomStatistic::EnchantItem: return 51;\n\t\t\tcase CustomStatistic::FallOneCm: return 9;\n\t\t\tcase CustomStatistic::FillCauldron: return 36;\n\t\t\tcase CustomStatistic::FishCaught: return 32;\n\t\t\tcase CustomStatistic::FlyOneCm: return 11;\n\t\t\tcase CustomStatistic::HorseOneCm: return 16;\n\t\t\tcase CustomStatistic::InspectDispenser: return 45;\n\t\t\tcase CustomStatistic::InspectDropper: return 43;\n\t\t\tcase CustomStatistic::InspectHopper: return 44;\n\t\t\tcase CustomStatistic::InteractWithAnvil: return 69;\n\t\t\tcase CustomStatistic::InteractWithBeacon: return 42;\n\t\t\tcase CustomStatistic::InteractWithBlastFurnace: return 59;\n\t\t\tcase CustomStatistic::InteractWithBrewingstand: return 41;\n\t\t\tcase CustomStatistic::InteractWithCampfire: return 62;\n\t\t\tcase CustomStatistic::InteractWithCartographyTable: return 63;\n\t\t\tcase CustomStatistic::InteractWithCraftingTable: return 54;\n\t\t\tcase CustomStatistic::InteractWithFurnace: return 53;\n\t\t\tcase CustomStatistic::InteractWithGrindstone: return 70;\n\t\t\tcase CustomStatistic::InteractWithLectern: return 61;\n\t\t\tcase CustomStatistic::InteractWithLoom: return 64;\n\t\t\tcase CustomStatistic::InteractWithSmoker: return 60;\n\t\t\tcase CustomStatistic::InteractWithStonecutter: return 65;\n\t\t\tcase CustomStatistic::Jump: return 19;\n\t\t\tcase CustomStatistic::LeaveGame: return -0;\n\t\t\tcase CustomStatistic::MinecartOneCm: return 13;\n\t\t\tcase CustomStatistic::MobKills: return 29;\n\t\t\tcase CustomStatistic::OpenBarrel: return 58;\n\t\t\tcase CustomStatistic::OpenChest: return 55;\n\t\t\tcase CustomStatistic::OpenEnderchest: return 50;\n\t\t\tcase CustomStatistic::OpenShulkerBox: return 57;\n\t\t\tcase CustomStatistic::PigOneCm: return 15;\n\t\t\tcase CustomStatistic::PlayNoteblock: return 46;\n\t\t\tcase CustomStatistic::PlayOneMinute: return 1;\n\t\t\tcase CustomStatistic::PlayRecord: return 52;\n\t\t\tcase CustomStatistic::PlayerKills: return 31;\n\t\t\tcase CustomStatistic::PotFlower: return 48;\n\t\t\tcase CustomStatistic::RaidTrigger: return 67;\n\t\t\tcase CustomStatistic::RaidWin: return 68;\n\t\t\tcase CustomStatistic::SleepInBed: return 56;\n\t\t\tcase CustomStatistic::SneakTime: return 4;\n\t\t\tcase CustomStatistic::SprintOneCm: return 7;\n\t\t\tcase CustomStatistic::SwimOneCm: return 18;\n\t\t\tcase CustomStatistic::TalkedToVillager: return 33;\n\t\t\tcase CustomStatistic::TimeSinceDeath: return 2;\n\t\t\tcase CustomStatistic::TimeSinceRest: return 3;\n\t\t\tcase CustomStatistic::TradedWithVillager: return 34;\n\t\t\tcase CustomStatistic::TriggerTrappedChest: return 49;\n\t\t\tcase CustomStatistic::TuneNoteblock: return 47;\n\t\t\tcase CustomStatistic::UseCauldron: return 37;\n\t\t\tcase CustomStatistic::WalkOnWaterOneCm: return 8;\n\t\t\tcase CustomStatistic::WalkOneCm: return 5;\n\t\t\tcase CustomStatistic::WalkUnderWaterOneCm: return 12;\n\t\t\tdefault: return UInt32(-1);\n\t\t}\n\t}\n\n\tItem ToItem(const UInt32 ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase 834: return Item::AcaciaBoat;\n\t\t\tcase 263: return Item::AcaciaButton;\n\t\t\tcase 511: return Item::AcaciaDoor;\n\t\t\tcase 185: return Item::AcaciaFence;\n\t\t\tcase 220: return Item::AcaciaFenceGate;\n\t\t\tcase 60: return Item::AcaciaLeaves;\n\t\t\tcase 36: return Item::AcaciaLog;\n\t\t\tcase 17: return Item::AcaciaPlanks;\n\t\t\tcase 170: return Item::AcaciaPressurePlate;\n\t\t\tcase 23: return Item::AcaciaSapling;\n\t\t\tcase 593: return Item::AcaciaSign;\n\t\t\tcase 119: return Item::AcaciaSlab;\n\t\t\tcase 319: return Item::AcaciaStairs;\n\t\t\tcase 197: return Item::AcaciaTrapdoor;\n\t\t\tcase 54: return Item::AcaciaWood;\n\t\t\tcase 279: return Item::ActivatorRail;\n\t\t\tcase -0: return Item::Air;\n\t\t\tcase 101: return Item::Allium;\n\t\t\tcase 6: return Item::Andesite;\n\t\t\tcase 501: return Item::AndesiteSlab;\n\t\t\tcase 488: return Item::AndesiteStairs;\n\t\t\tcase 254: return Item::AndesiteWall;\n\t\t\tcase 265: return Item::Anvil;\n\t\t\tcase 524: return Item::Apple;\n\t\t\tcase 792: return Item::ArmorStand;\n\t\t\tcase 526: return Item::Arrow;\n\t\t\tcase 102: return Item::AzureBluet;\n\t\t\tcase 765: return Item::BakedPotato;\n\t\t\tcase 614: return Item::Bamboo;\n\t\t\tcase 865: return Item::Barrel;\n\t\t\tcase 297: return Item::Barrier;\n\t\t\tcase 697: return Item::BatSpawnEgg;\n\t\t\tcase 244: return Item::Beacon;\n\t\t\tcase 25: return Item::Bedrock;\n\t\t\tcase 879: return Item::BeeNest;\n\t\t\tcase 698: return Item::BeeSpawnEgg;\n\t\t\tcase 677: return Item::Beef;\n\t\t\tcase 880: return Item::Beehive;\n\t\t\tcase 821: return Item::Beetroot;\n\t\t\tcase 822: return Item::BeetrootSeeds;\n\t\t\tcase 823: return Item::BeetrootSoup;\n\t\t\tcase 874: return Item::Bell;\n\t\t\tcase 832: return Item::BirchBoat;\n\t\t\tcase 261: return Item::BirchButton;\n\t\t\tcase 509: return Item::BirchDoor;\n\t\t\tcase 183: return Item::BirchFence;\n\t\t\tcase 218: return Item::BirchFenceGate;\n\t\t\tcase 58: return Item::BirchLeaves;\n\t\t\tcase 34: return Item::BirchLog;\n\t\t\tcase 15: return Item::BirchPlanks;\n\t\t\tcase 168: return Item::BirchPressurePlate;\n\t\t\tcase 21: return Item::BirchSapling;\n\t\t\tcase 591: return Item::BirchSign;\n\t\t\tcase 117: return Item::BirchSlab;\n\t\t\tcase 241: return Item::BirchStairs;\n\t\t\tcase 195: return Item::BirchTrapdoor;\n\t\t\tcase 52: return Item::BirchWood;\n\t\t\tcase 817: return Item::BlackBanner;\n\t\t\tcase 669: return Item::BlackBed;\n\t\t\tcase 315: return Item::BlackCarpet;\n\t\t\tcase 428: return Item::BlackConcrete;\n\t\t\tcase 444: return Item::BlackConcretePowder;\n\t\t\tcase 649: return Item::BlackDye;\n\t\t\tcase 412: return Item::BlackGlazedTerracotta;\n\t\t\tcase 396: return Item::BlackShulkerBox;\n\t\t\tcase 344: return Item::BlackStainedGlass;\n\t\t\tcase 360: return Item::BlackStainedGlassPane;\n\t\t\tcase 296: return Item::BlackTerracotta;\n\t\t\tcase 97: return Item::BlackWool;\n\t\t\tcase 867: return Item::BlastFurnace;\n\t\t\tcase 691: return Item::BlazePowder;\n\t\t\tcase 683: return Item::BlazeRod;\n\t\t\tcase 699: return Item::BlazeSpawnEgg;\n\t\t\tcase 813: return Item::BlueBanner;\n\t\t\tcase 665: return Item::BlueBed;\n\t\t\tcase 311: return Item::BlueCarpet;\n\t\t\tcase 424: return Item::BlueConcrete;\n\t\t\tcase 440: return Item::BlueConcretePowder;\n\t\t\tcase 647: return Item::BlueDye;\n\t\t\tcase 408: return Item::BlueGlazedTerracotta;\n\t\t\tcase 476: return Item::BlueIce;\n\t\t\tcase 100: return Item::BlueOrchid;\n\t\t\tcase 392: return Item::BlueShulkerBox;\n\t\t\tcase 340: return Item::BlueStainedGlass;\n\t\t\tcase 356: return Item::BlueStainedGlassPane;\n\t\t\tcase 292: return Item::BlueTerracotta;\n\t\t\tcase 93: return Item::BlueWool;\n\t\t\tcase 651: return Item::Bone;\n\t\t\tcase 377: return Item::BoneBlock;\n\t\t\tcase 646: return Item::BoneMeal;\n\t\t\tcase 616: return Item::Book;\n\t\t\tcase 143: return Item::Bookshelf;\n\t\t\tcase 525: return Item::Bow;\n\t\t\tcase 546: return Item::Bowl;\n\t\t\tcase 457: return Item::BrainCoral;\n\t\t\tcase 452: return Item::BrainCoralBlock;\n\t\t\tcase 467: return Item::BrainCoralFan;\n\t\t\tcase 562: return Item::Bread;\n\t\t\tcase 693: return Item::BrewingStand;\n\t\t\tcase 609: return Item::Brick;\n\t\t\tcase 127: return Item::BrickSlab;\n\t\t\tcase 222: return Item::BrickStairs;\n\t\t\tcase 247: return Item::BrickWall;\n\t\t\tcase 141: return Item::Bricks;\n\t\t\tcase 814: return Item::BrownBanner;\n\t\t\tcase 666: return Item::BrownBed;\n\t\t\tcase 312: return Item::BrownCarpet;\n\t\t\tcase 425: return Item::BrownConcrete;\n\t\t\tcase 441: return Item::BrownConcretePowder;\n\t\t\tcase 648: return Item::BrownDye;\n\t\t\tcase 409: return Item::BrownGlazedTerracotta;\n\t\t\tcase 111: return Item::BrownMushroom;\n\t\t\tcase 209: return Item::BrownMushroomBlock;\n\t\t\tcase 393: return Item::BrownShulkerBox;\n\t\t\tcase 341: return Item::BrownStainedGlass;\n\t\t\tcase 357: return Item::BrownStainedGlassPane;\n\t\t\tcase 293: return Item::BrownTerracotta;\n\t\t\tcase 94: return Item::BrownWool;\n\t\t\tcase 458: return Item::BubbleCoral;\n\t\t\tcase 453: return Item::BubbleCoralBlock;\n\t\t\tcase 468: return Item::BubbleCoralFan;\n\t\t\tcase 595: return Item::Bucket;\n\t\t\tcase 178: return Item::Cactus;\n\t\t\tcase 653: return Item::Cake;\n\t\t\tcase 877: return Item::Campfire;\n\t\t\tcase 763: return Item::Carrot;\n\t\t\tcase 775: return Item::CarrotOnAStick;\n\t\t\tcase 868: return Item::CartographyTable;\n\t\t\tcase 188: return Item::CarvedPumpkin;\n\t\t\tcase 700: return Item::CatSpawnEgg;\n\t\t\tcase 694: return Item::Cauldron;\n\t\t\tcase 701: return Item::CaveSpiderSpawnEgg;\n\t\t\tcase 373: return Item::ChainCommandBlock;\n\t\t\tcase 570: return Item::ChainmailBoots;\n\t\t\tcase 568: return Item::ChainmailChestplate;\n\t\t\tcase 567: return Item::ChainmailHelmet;\n\t\t\tcase 569: return Item::ChainmailLeggings;\n\t\t\tcase 528: return Item::Charcoal;\n\t\t\tcase 155: return Item::Chest;\n\t\t\tcase 618: return Item::ChestMinecart;\n\t\t\tcase 679: return Item::Chicken;\n\t\t\tcase 702: return Item::ChickenSpawnEgg;\n\t\t\tcase 266: return Item::ChippedAnvil;\n\t\t\tcase 275: return Item::ChiseledQuartzBlock;\n\t\t\tcase 369: return Item::ChiseledRedSandstone;\n\t\t\tcase 69: return Item::ChiseledSandstone;\n\t\t\tcase 208: return Item::ChiseledStoneBricks;\n\t\t\tcase 149: return Item::ChorusFlower;\n\t\t\tcase 819: return Item::ChorusFruit;\n\t\t\tcase 148: return Item::ChorusPlant;\n\t\t\tcase 179: return Item::Clay;\n\t\t\tcase 610: return Item::ClayBall;\n\t\t\tcase 623: return Item::Clock;\n\t\t\tcase 527: return Item::Coal;\n\t\t\tcase 317: return Item::CoalBlock;\n\t\t\tcase 31: return Item::CoalOre;\n\t\t\tcase 10: return Item::CoarseDirt;\n\t\t\tcase 12: return Item::Cobblestone;\n\t\t\tcase 126: return Item::CobblestoneSlab;\n\t\t\tcase 163: return Item::CobblestoneStairs;\n\t\t\tcase 245: return Item::CobblestoneWall;\n\t\t\tcase 75: return Item::Cobweb;\n\t\t\tcase 634: return Item::CocoaBeans;\n\t\t\tcase 625: return Item::Cod;\n\t\t\tcase 607: return Item::CodBucket;\n\t\t\tcase 703: return Item::CodSpawnEgg;\n\t\t\tcase 243: return Item::CommandBlock;\n\t\t\tcase 799: return Item::CommandBlockMinecart;\n\t\t\tcase 514: return Item::Comparator;\n\t\t\tcase 621: return Item::Compass;\n\t\t\tcase 517: return Item::Composter;\n\t\t\tcase 477: return Item::Conduit;\n\t\t\tcase 678: return Item::CookedBeef;\n\t\t\tcase 680: return Item::CookedChicken;\n\t\t\tcase 629: return Item::CookedCod;\n\t\t\tcase 801: return Item::CookedMutton;\n\t\t\tcase 585: return Item::CookedPorkchop;\n\t\t\tcase 788: return Item::CookedRabbit;\n\t\t\tcase 630: return Item::CookedSalmon;\n\t\t\tcase 670: return Item::Cookie;\n\t\t\tcase 108: return Item::Cornflower;\n\t\t\tcase 704: return Item::CowSpawnEgg;\n\t\t\tcase 207: return Item::CrackedStoneBricks;\n\t\t\tcase 158: return Item::CraftingTable;\n\t\t\tcase 861: return Item::CreeperBannerPattern;\n\t\t\tcase 773: return Item::CreeperHead;\n\t\t\tcase 705: return Item::CreeperSpawnEgg;\n\t\t\tcase 857: return Item::Crossbow;\n\t\t\tcase 370: return Item::CutRedSandstone;\n\t\t\tcase 132: return Item::CutRedSandstoneSlab;\n\t\t\tcase 70: return Item::CutSandstone;\n\t\t\tcase 124: return Item::CutSandstoneSlab;\n\t\t\tcase 811: return Item::CyanBanner;\n\t\t\tcase 663: return Item::CyanBed;\n\t\t\tcase 309: return Item::CyanCarpet;\n\t\t\tcase 422: return Item::CyanConcrete;\n\t\t\tcase 438: return Item::CyanConcretePowder;\n\t\t\tcase 637: return Item::CyanDye;\n\t\t\tcase 406: return Item::CyanGlazedTerracotta;\n\t\t\tcase 390: return Item::CyanShulkerBox;\n\t\t\tcase 338: return Item::CyanStainedGlass;\n\t\t\tcase 354: return Item::CyanStainedGlassPane;\n\t\t\tcase 290: return Item::CyanTerracotta;\n\t\t\tcase 91: return Item::CyanWool;\n\t\t\tcase 267: return Item::DamagedAnvil;\n\t\t\tcase 98: return Item::Dandelion;\n\t\t\tcase 835: return Item::DarkOakBoat;\n\t\t\tcase 264: return Item::DarkOakButton;\n\t\t\tcase 512: return Item::DarkOakDoor;\n\t\t\tcase 186: return Item::DarkOakFence;\n\t\t\tcase 221: return Item::DarkOakFenceGate;\n\t\t\tcase 61: return Item::DarkOakLeaves;\n\t\t\tcase 37: return Item::DarkOakLog;\n\t\t\tcase 18: return Item::DarkOakPlanks;\n\t\t\tcase 171: return Item::DarkOakPressurePlate;\n\t\t\tcase 24: return Item::DarkOakSapling;\n\t\t\tcase 594: return Item::DarkOakSign;\n\t\t\tcase 120: return Item::DarkOakSlab;\n\t\t\tcase 320: return Item::DarkOakStairs;\n\t\t\tcase 198: return Item::DarkOakTrapdoor;\n\t\t\tcase 55: return Item::DarkOakWood;\n\t\t\tcase 363: return Item::DarkPrismarine;\n\t\t\tcase 136: return Item::DarkPrismarineSlab;\n\t\t\tcase 366: return Item::DarkPrismarineStairs;\n\t\t\tcase 271: return Item::DaylightDetector;\n\t\t\tcase 461: return Item::DeadBrainCoral;\n\t\t\tcase 447: return Item::DeadBrainCoralBlock;\n\t\t\tcase 472: return Item::DeadBrainCoralFan;\n\t\t\tcase 462: return Item::DeadBubbleCoral;\n\t\t\tcase 448: return Item::DeadBubbleCoralBlock;\n\t\t\tcase 473: return Item::DeadBubbleCoralFan;\n\t\t\tcase 78: return Item::DeadBush;\n\t\t\tcase 463: return Item::DeadFireCoral;\n\t\t\tcase 449: return Item::DeadFireCoralBlock;\n\t\t\tcase 474: return Item::DeadFireCoralFan;\n\t\t\tcase 464: return Item::DeadHornCoral;\n\t\t\tcase 450: return Item::DeadHornCoralBlock;\n\t\t\tcase 475: return Item::DeadHornCoralFan;\n\t\t\tcase 465: return Item::DeadTubeCoral;\n\t\t\tcase 446: return Item::DeadTubeCoralBlock;\n\t\t\tcase 471: return Item::DeadTubeCoralFan;\n\t\t\tcase 840: return Item::DebugStick;\n\t\t\tcase 73: return Item::DetectorRail;\n\t\t\tcase 529: return Item::Diamond;\n\t\t\tcase 544: return Item::DiamondAxe;\n\t\t\tcase 157: return Item::DiamondBlock;\n\t\t\tcase 578: return Item::DiamondBoots;\n\t\t\tcase 576: return Item::DiamondChestplate;\n\t\t\tcase 575: return Item::DiamondHelmet;\n\t\t\tcase 558: return Item::DiamondHoe;\n\t\t\tcase 795: return Item::DiamondHorseArmor;\n\t\t\tcase 577: return Item::DiamondLeggings;\n\t\t\tcase 156: return Item::DiamondOre;\n\t\t\tcase 543: return Item::DiamondPickaxe;\n\t\t\tcase 542: return Item::DiamondShovel;\n\t\t\tcase 541: return Item::DiamondSword;\n\t\t\tcase 4: return Item::Diorite;\n\t\t\tcase 504: return Item::DioriteSlab;\n\t\t\tcase 491: return Item::DioriteStairs;\n\t\t\tcase 258: return Item::DioriteWall;\n\t\t\tcase 9: return Item::Dirt;\n\t\t\tcase 67: return Item::Dispenser;\n\t\t\tcase 706: return Item::DolphinSpawnEgg;\n\t\t\tcase 707: return Item::DonkeySpawnEgg;\n\t\t\tcase 824: return Item::DragonBreath;\n\t\t\tcase 233: return Item::DragonEgg;\n\t\t\tcase 774: return Item::DragonHead;\n\t\t\tcase 674: return Item::DriedKelp;\n\t\t\tcase 613: return Item::DriedKelpBlock;\n\t\t\tcase 280: return Item::Dropper;\n\t\t\tcase 708: return Item::DrownedSpawnEgg;\n\t\t\tcase 620: return Item::Egg;\n\t\t\tcase 709: return Item::ElderGuardianSpawnEgg;\n\t\t\tcase 830: return Item::Elytra;\n\t\t\tcase 760: return Item::Emerald;\n\t\t\tcase 239: return Item::EmeraldBlock;\n\t\t\tcase 236: return Item::EmeraldOre;\n\t\t\tcase 780: return Item::EnchantedBook;\n\t\t\tcase 588: return Item::EnchantedGoldenApple;\n\t\t\tcase 229: return Item::EnchantingTable;\n\t\t\tcase 818: return Item::EndCrystal;\n\t\t\tcase 230: return Item::EndPortalFrame;\n\t\t\tcase 147: return Item::EndRod;\n\t\t\tcase 231: return Item::EndStone;\n\t\t\tcase 497: return Item::EndStoneBrickSlab;\n\t\t\tcase 483: return Item::EndStoneBrickStairs;\n\t\t\tcase 257: return Item::EndStoneBrickWall;\n\t\t\tcase 232: return Item::EndStoneBricks;\n\t\t\tcase 237: return Item::EnderChest;\n\t\t\tcase 695: return Item::EnderEye;\n\t\t\tcase 682: return Item::EnderPearl;\n\t\t\tcase 710: return Item::EndermanSpawnEgg;\n\t\t\tcase 711: return Item::EndermiteSpawnEgg;\n\t\t\tcase 712: return Item::EvokerSpawnEgg;\n\t\t\tcase 756: return Item::ExperienceBottle;\n\t\t\tcase 159: return Item::Farmland;\n\t\t\tcase 553: return Item::Feather;\n\t\t\tcase 690: return Item::FermentedSpiderEye;\n\t\t\tcase 77: return Item::Fern;\n\t\t\tcase 671: return Item::FilledMap;\n\t\t\tcase 757: return Item::FireCharge;\n\t\t\tcase 459: return Item::FireCoral;\n\t\t\tcase 454: return Item::FireCoralBlock;\n\t\t\tcase 469: return Item::FireCoralFan;\n\t\t\tcase 778: return Item::FireworkRocket;\n\t\t\tcase 779: return Item::FireworkStar;\n\t\t\tcase 622: return Item::FishingRod;\n\t\t\tcase 869: return Item::FletchingTable;\n\t\t\tcase 583: return Item::Flint;\n\t\t\tcase 523: return Item::FlintAndSteel;\n\t\t\tcase 860: return Item::FlowerBannerPattern;\n\t\t\tcase 762: return Item::FlowerPot;\n\t\t\tcase 713: return Item::FoxSpawnEgg;\n\t\t\tcase 160: return Item::Furnace;\n\t\t\tcase 619: return Item::FurnaceMinecart;\n\t\t\tcase 714: return Item::GhastSpawnEgg;\n\t\t\tcase 684: return Item::GhastTear;\n\t\t\tcase 64: return Item::Glass;\n\t\t\tcase 688: return Item::GlassBottle;\n\t\t\tcase 213: return Item::GlassPane;\n\t\t\tcase 696: return Item::GlisteringMelonSlice;\n\t\t\tcase 864: return Item::GlobeBannerPattern;\n\t\t\tcase 191: return Item::Glowstone;\n\t\t\tcase 624: return Item::GlowstoneDust;\n\t\t\tcase 113: return Item::GoldBlock;\n\t\t\tcase 531: return Item::GoldIngot;\n\t\t\tcase 685: return Item::GoldNugget;\n\t\t\tcase 29: return Item::GoldOre;\n\t\t\tcase 587: return Item::GoldenApple;\n\t\t\tcase 551: return Item::GoldenAxe;\n\t\t\tcase 582: return Item::GoldenBoots;\n\t\t\tcase 768: return Item::GoldenCarrot;\n\t\t\tcase 580: return Item::GoldenChestplate;\n\t\t\tcase 579: return Item::GoldenHelmet;\n\t\t\tcase 559: return Item::GoldenHoe;\n\t\t\tcase 794: return Item::GoldenHorseArmor;\n\t\t\tcase 581: return Item::GoldenLeggings;\n\t\t\tcase 550: return Item::GoldenPickaxe;\n\t\t\tcase 549: return Item::GoldenShovel;\n\t\t\tcase 548: return Item::GoldenSword;\n\t\t\tcase 2: return Item::Granite;\n\t\t\tcase 500: return Item::GraniteSlab;\n\t\t\tcase 487: return Item::GraniteStairs;\n\t\t\tcase 251: return Item::GraniteWall;\n\t\t\tcase 76: return Item::Grass;\n\t\t\tcase 8: return Item::GrassBlock;\n\t\t\tcase 322: return Item::GrassPath;\n\t\t\tcase 28: return Item::Gravel;\n\t\t\tcase 809: return Item::GrayBanner;\n\t\t\tcase 661: return Item::GrayBed;\n\t\t\tcase 307: return Item::GrayCarpet;\n\t\t\tcase 420: return Item::GrayConcrete;\n\t\t\tcase 436: return Item::GrayConcretePowder;\n\t\t\tcase 639: return Item::GrayDye;\n\t\t\tcase 404: return Item::GrayGlazedTerracotta;\n\t\t\tcase 388: return Item::GrayShulkerBox;\n\t\t\tcase 336: return Item::GrayStainedGlass;\n\t\t\tcase 352: return Item::GrayStainedGlassPane;\n\t\t\tcase 288: return Item::GrayTerracotta;\n\t\t\tcase 89: return Item::GrayWool;\n\t\t\tcase 815: return Item::GreenBanner;\n\t\t\tcase 667: return Item::GreenBed;\n\t\t\tcase 313: return Item::GreenCarpet;\n\t\t\tcase 426: return Item::GreenConcrete;\n\t\t\tcase 442: return Item::GreenConcretePowder;\n\t\t\tcase 633: return Item::GreenDye;\n\t\t\tcase 410: return Item::GreenGlazedTerracotta;\n\t\t\tcase 394: return Item::GreenShulkerBox;\n\t\t\tcase 342: return Item::GreenStainedGlass;\n\t\t\tcase 358: return Item::GreenStainedGlassPane;\n\t\t\tcase 294: return Item::GreenTerracotta;\n\t\t\tcase 95: return Item::GreenWool;\n\t\t\tcase 870: return Item::Grindstone;\n\t\t\tcase 715: return Item::GuardianSpawnEgg;\n\t\t\tcase 554: return Item::Gunpowder;\n\t\t\tcase 299: return Item::HayBale;\n\t\t\tcase 856: return Item::HeartOfTheSea;\n\t\t\tcase 270: return Item::HeavyWeightedPressurePlate;\n\t\t\tcase 882: return Item::HoneyBlock;\n\t\t\tcase 881: return Item::HoneyBottle;\n\t\t\tcase 878: return Item::Honeycomb;\n\t\t\tcase 883: return Item::HoneycombBlock;\n\t\t\tcase 274: return Item::Hopper;\n\t\t\tcase 784: return Item::HopperMinecart;\n\t\t\tcase 460: return Item::HornCoral;\n\t\t\tcase 455: return Item::HornCoralBlock;\n\t\t\tcase 470: return Item::HornCoralFan;\n\t\t\tcase 716: return Item::HorseSpawnEgg;\n\t\t\tcase 717: return Item::HuskSpawnEgg;\n\t\t\tcase 176: return Item::Ice;\n\t\t\tcase 204: return Item::InfestedChiseledStoneBricks;\n\t\t\tcase 200: return Item::InfestedCobblestone;\n\t\t\tcase 203: return Item::InfestedCrackedStoneBricks;\n\t\t\tcase 202: return Item::InfestedMossyStoneBricks;\n\t\t\tcase 199: return Item::InfestedStone;\n\t\t\tcase 201: return Item::InfestedStoneBricks;\n\t\t\tcase 631: return Item::InkSac;\n\t\t\tcase 522: return Item::IronAxe;\n\t\t\tcase 212: return Item::IronBars;\n\t\t\tcase 114: return Item::IronBlock;\n\t\t\tcase 574: return Item::IronBoots;\n\t\t\tcase 572: return Item::IronChestplate;\n\t\t\tcase 506: return Item::IronDoor;\n\t\t\tcase 571: return Item::IronHelmet;\n\t\t\tcase 557: return Item::IronHoe;\n\t\t\tcase 793: return Item::IronHorseArmor;\n\t\t\tcase 530: return Item::IronIngot;\n\t\t\tcase 573: return Item::IronLeggings;\n\t\t\tcase 838: return Item::IronNugget;\n\t\t\tcase 30: return Item::IronOre;\n\t\t\tcase 521: return Item::IronPickaxe;\n\t\t\tcase 520: return Item::IronShovel;\n\t\t\tcase 532: return Item::IronSword;\n\t\t\tcase 298: return Item::IronTrapdoor;\n\t\t\tcase 761: return Item::ItemFrame;\n\t\t\tcase 192: return Item::JackOLantern;\n\t\t\tcase 516: return Item::Jigsaw;\n\t\t\tcase 180: return Item::Jukebox;\n\t\t\tcase 833: return Item::JungleBoat;\n\t\t\tcase 262: return Item::JungleButton;\n\t\t\tcase 510: return Item::JungleDoor;\n\t\t\tcase 184: return Item::JungleFence;\n\t\t\tcase 219: return Item::JungleFenceGate;\n\t\t\tcase 59: return Item::JungleLeaves;\n\t\t\tcase 35: return Item::JungleLog;\n\t\t\tcase 16: return Item::JunglePlanks;\n\t\t\tcase 169: return Item::JunglePressurePlate;\n\t\t\tcase 22: return Item::JungleSapling;\n\t\t\tcase 592: return Item::JungleSign;\n\t\t\tcase 118: return Item::JungleSlab;\n\t\t\tcase 242: return Item::JungleStairs;\n\t\t\tcase 196: return Item::JungleTrapdoor;\n\t\t\tcase 53: return Item::JungleWood;\n\t\t\tcase 612: return Item::Kelp;\n\t\t\tcase 839: return Item::KnowledgeBook;\n\t\t\tcase 161: return Item::Ladder;\n\t\t\tcase 875: return Item::Lantern;\n\t\t\tcase 66: return Item::LapisBlock;\n\t\t\tcase 635: return Item::LapisLazuli;\n\t\t\tcase 65: return Item::LapisOre;\n\t\t\tcase 328: return Item::LargeFern;\n\t\t\tcase 597: return Item::LavaBucket;\n\t\t\tcase 797: return Item::Lead;\n\t\t\tcase 603: return Item::Leather;\n\t\t\tcase 566: return Item::LeatherBoots;\n\t\t\tcase 564: return Item::LeatherChestplate;\n\t\t\tcase 563: return Item::LeatherHelmet;\n\t\t\tcase 796: return Item::LeatherHorseArmor;\n\t\t\tcase 565: return Item::LeatherLeggings;\n\t\t\tcase 871: return Item::Lectern;\n\t\t\tcase 164: return Item::Lever;\n\t\t\tcase 805: return Item::LightBlueBanner;\n\t\t\tcase 657: return Item::LightBlueBed;\n\t\t\tcase 303: return Item::LightBlueCarpet;\n\t\t\tcase 416: return Item::LightBlueConcrete;\n\t\t\tcase 432: return Item::LightBlueConcretePowder;\n\t\t\tcase 643: return Item::LightBlueDye;\n\t\t\tcase 400: return Item::LightBlueGlazedTerracotta;\n\t\t\tcase 384: return Item::LightBlueShulkerBox;\n\t\t\tcase 332: return Item::LightBlueStainedGlass;\n\t\t\tcase 348: return Item::LightBlueStainedGlassPane;\n\t\t\tcase 284: return Item::LightBlueTerracotta;\n\t\t\tcase 85: return Item::LightBlueWool;\n\t\t\tcase 810: return Item::LightGrayBanner;\n\t\t\tcase 662: return Item::LightGrayBed;\n\t\t\tcase 308: return Item::LightGrayCarpet;\n\t\t\tcase 421: return Item::LightGrayConcrete;\n\t\t\tcase 437: return Item::LightGrayConcretePowder;\n\t\t\tcase 638: return Item::LightGrayDye;\n\t\t\tcase 405: return Item::LightGrayGlazedTerracotta;\n\t\t\tcase 389: return Item::LightGrayShulkerBox;\n\t\t\tcase 337: return Item::LightGrayStainedGlass;\n\t\t\tcase 353: return Item::LightGrayStainedGlassPane;\n\t\t\tcase 289: return Item::LightGrayTerracotta;\n\t\t\tcase 90: return Item::LightGrayWool;\n\t\t\tcase 269: return Item::LightWeightedPressurePlate;\n\t\t\tcase 324: return Item::Lilac;\n\t\t\tcase 109: return Item::LilyOfTheValley;\n\t\t\tcase 225: return Item::LilyPad;\n\t\t\tcase 807: return Item::LimeBanner;\n\t\t\tcase 659: return Item::LimeBed;\n\t\t\tcase 305: return Item::LimeCarpet;\n\t\t\tcase 418: return Item::LimeConcrete;\n\t\t\tcase 434: return Item::LimeConcretePowder;\n\t\t\tcase 641: return Item::LimeDye;\n\t\t\tcase 402: return Item::LimeGlazedTerracotta;\n\t\t\tcase 386: return Item::LimeShulkerBox;\n\t\t\tcase 334: return Item::LimeStainedGlass;\n\t\t\tcase 350: return Item::LimeStainedGlassPane;\n\t\t\tcase 286: return Item::LimeTerracotta;\n\t\t\tcase 87: return Item::LimeWool;\n\t\t\tcase 828: return Item::LingeringPotion;\n\t\t\tcase 718: return Item::LlamaSpawnEgg;\n\t\t\tcase 859: return Item::Loom;\n\t\t\tcase 804: return Item::MagentaBanner;\n\t\t\tcase 656: return Item::MagentaBed;\n\t\t\tcase 302: return Item::MagentaCarpet;\n\t\t\tcase 415: return Item::MagentaConcrete;\n\t\t\tcase 431: return Item::MagentaConcretePowder;\n\t\t\tcase 644: return Item::MagentaDye;\n\t\t\tcase 399: return Item::MagentaGlazedTerracotta;\n\t\t\tcase 383: return Item::MagentaShulkerBox;\n\t\t\tcase 331: return Item::MagentaStainedGlass;\n\t\t\tcase 347: return Item::MagentaStainedGlassPane;\n\t\t\tcase 283: return Item::MagentaTerracotta;\n\t\t\tcase 84: return Item::MagentaWool;\n\t\t\tcase 374: return Item::MagmaBlock;\n\t\t\tcase 692: return Item::MagmaCream;\n\t\t\tcase 719: return Item::MagmaCubeSpawnEgg;\n\t\t\tcase 767: return Item::Map;\n\t\t\tcase 214: return Item::Melon;\n\t\t\tcase 676: return Item::MelonSeeds;\n\t\t\tcase 673: return Item::MelonSlice;\n\t\t\tcase 604: return Item::MilkBucket;\n\t\t\tcase 598: return Item::Minecart;\n\t\t\tcase 863: return Item::MojangBannerPattern;\n\t\t\tcase 720: return Item::MooshroomSpawnEgg;\n\t\t\tcase 144: return Item::MossyCobblestone;\n\t\t\tcase 496: return Item::MossyCobblestoneSlab;\n\t\t\tcase 482: return Item::MossyCobblestoneStairs;\n\t\t\tcase 246: return Item::MossyCobblestoneWall;\n\t\t\tcase 494: return Item::MossyStoneBrickSlab;\n\t\t\tcase 480: return Item::MossyStoneBrickStairs;\n\t\t\tcase 250: return Item::MossyStoneBrickWall;\n\t\t\tcase 206: return Item::MossyStoneBricks;\n\t\t\tcase 721: return Item::MuleSpawnEgg;\n\t\t\tcase 211: return Item::MushroomStem;\n\t\t\tcase 547: return Item::MushroomStew;\n\t\t\tcase 851: return Item::MusicDisc11;\n\t\t\tcase 841: return Item::MusicDisc13;\n\t\t\tcase 843: return Item::MusicDiscBlocks;\n\t\t\tcase 842: return Item::MusicDiscCat;\n\t\t\tcase 844: return Item::MusicDiscChirp;\n\t\t\tcase 845: return Item::MusicDiscFar;\n\t\t\tcase 846: return Item::MusicDiscMall;\n\t\t\tcase 847: return Item::MusicDiscMellohi;\n\t\t\tcase 848: return Item::MusicDiscStal;\n\t\t\tcase 849: return Item::MusicDiscStrad;\n\t\t\tcase 852: return Item::MusicDiscWait;\n\t\t\tcase 850: return Item::MusicDiscWard;\n\t\t\tcase 800: return Item::Mutton;\n\t\t\tcase 224: return Item::Mycelium;\n\t\t\tcase 798: return Item::NameTag;\n\t\t\tcase 855: return Item::NautilusShell;\n\t\t\tcase 781: return Item::NetherBrick;\n\t\t\tcase 227: return Item::NetherBrickFence;\n\t\t\tcase 129: return Item::NetherBrickSlab;\n\t\t\tcase 228: return Item::NetherBrickStairs;\n\t\t\tcase 253: return Item::NetherBrickWall;\n\t\t\tcase 226: return Item::NetherBricks;\n\t\t\tcase 273: return Item::NetherQuartzOre;\n\t\t\tcase 776: return Item::NetherStar;\n\t\t\tcase 686: return Item::NetherWart;\n\t\t\tcase 375: return Item::NetherWartBlock;\n\t\t\tcase 189: return Item::Netherrack;\n\t\t\tcase 71: return Item::NoteBlock;\n\t\t\tcase 602: return Item::OakBoat;\n\t\t\tcase 259: return Item::OakButton;\n\t\t\tcase 507: return Item::OakDoor;\n\t\t\tcase 181: return Item::OakFence;\n\t\t\tcase 216: return Item::OakFenceGate;\n\t\t\tcase 56: return Item::OakLeaves;\n\t\t\tcase 32: return Item::OakLog;\n\t\t\tcase 13: return Item::OakPlanks;\n\t\t\tcase 166: return Item::OakPressurePlate;\n\t\t\tcase 19: return Item::OakSapling;\n\t\t\tcase 589: return Item::OakSign;\n\t\t\tcase 115: return Item::OakSlab;\n\t\t\tcase 154: return Item::OakStairs;\n\t\t\tcase 193: return Item::OakTrapdoor;\n\t\t\tcase 50: return Item::OakWood;\n\t\t\tcase 379: return Item::Observer;\n\t\t\tcase 145: return Item::Obsidian;\n\t\t\tcase 722: return Item::OcelotSpawnEgg;\n\t\t\tcase 803: return Item::OrangeBanner;\n\t\t\tcase 655: return Item::OrangeBed;\n\t\t\tcase 301: return Item::OrangeCarpet;\n\t\t\tcase 414: return Item::OrangeConcrete;\n\t\t\tcase 430: return Item::OrangeConcretePowder;\n\t\t\tcase 645: return Item::OrangeDye;\n\t\t\tcase 398: return Item::OrangeGlazedTerracotta;\n\t\t\tcase 382: return Item::OrangeShulkerBox;\n\t\t\tcase 330: return Item::OrangeStainedGlass;\n\t\t\tcase 346: return Item::OrangeStainedGlassPane;\n\t\t\tcase 282: return Item::OrangeTerracotta;\n\t\t\tcase 104: return Item::OrangeTulip;\n\t\t\tcase 83: return Item::OrangeWool;\n\t\t\tcase 107: return Item::OxeyeDaisy;\n\t\t\tcase 318: return Item::PackedIce;\n\t\t\tcase 586: return Item::Painting;\n\t\t\tcase 723: return Item::PandaSpawnEgg;\n\t\t\tcase 615: return Item::Paper;\n\t\t\tcase 724: return Item::ParrotSpawnEgg;\n\t\t\tcase 326: return Item::Peony;\n\t\t\tcase 125: return Item::PetrifiedOakSlab;\n\t\t\tcase 854: return Item::PhantomMembrane;\n\t\t\tcase 725: return Item::PhantomSpawnEgg;\n\t\t\tcase 726: return Item::PigSpawnEgg;\n\t\t\tcase 727: return Item::PillagerSpawnEgg;\n\t\t\tcase 808: return Item::PinkBanner;\n\t\t\tcase 660: return Item::PinkBed;\n\t\t\tcase 306: return Item::PinkCarpet;\n\t\t\tcase 419: return Item::PinkConcrete;\n\t\t\tcase 435: return Item::PinkConcretePowder;\n\t\t\tcase 640: return Item::PinkDye;\n\t\t\tcase 403: return Item::PinkGlazedTerracotta;\n\t\t\tcase 387: return Item::PinkShulkerBox;\n\t\t\tcase 335: return Item::PinkStainedGlass;\n\t\t\tcase 351: return Item::PinkStainedGlassPane;\n\t\t\tcase 287: return Item::PinkTerracotta;\n\t\t\tcase 106: return Item::PinkTulip;\n\t\t\tcase 88: return Item::PinkWool;\n\t\t\tcase 81: return Item::Piston;\n\t\t\tcase 771: return Item::PlayerHead;\n\t\t\tcase 11: return Item::Podzol;\n\t\t\tcase 766: return Item::PoisonousPotato;\n\t\t\tcase 728: return Item::PolarBearSpawnEgg;\n\t\t\tcase 7: return Item::PolishedAndesite;\n\t\t\tcase 503: return Item::PolishedAndesiteSlab;\n\t\t\tcase 490: return Item::PolishedAndesiteStairs;\n\t\t\tcase 5: return Item::PolishedDiorite;\n\t\t\tcase 495: return Item::PolishedDioriteSlab;\n\t\t\tcase 481: return Item::PolishedDioriteStairs;\n\t\t\tcase 3: return Item::PolishedGranite;\n\t\t\tcase 492: return Item::PolishedGraniteSlab;\n\t\t\tcase 478: return Item::PolishedGraniteStairs;\n\t\t\tcase 820: return Item::PoppedChorusFruit;\n\t\t\tcase 99: return Item::Poppy;\n\t\t\tcase 584: return Item::Porkchop;\n\t\t\tcase 764: return Item::Potato;\n\t\t\tcase 687: return Item::Potion;\n\t\t\tcase 72: return Item::PoweredRail;\n\t\t\tcase 361: return Item::Prismarine;\n\t\t\tcase 135: return Item::PrismarineBrickSlab;\n\t\t\tcase 365: return Item::PrismarineBrickStairs;\n\t\t\tcase 362: return Item::PrismarineBricks;\n\t\t\tcase 786: return Item::PrismarineCrystals;\n\t\t\tcase 785: return Item::PrismarineShard;\n\t\t\tcase 134: return Item::PrismarineSlab;\n\t\t\tcase 364: return Item::PrismarineStairs;\n\t\t\tcase 248: return Item::PrismarineWall;\n\t\t\tcase 628: return Item::Pufferfish;\n\t\t\tcase 605: return Item::PufferfishBucket;\n\t\t\tcase 729: return Item::PufferfishSpawnEgg;\n\t\t\tcase 187: return Item::Pumpkin;\n\t\t\tcase 777: return Item::PumpkinPie;\n\t\t\tcase 675: return Item::PumpkinSeeds;\n\t\t\tcase 812: return Item::PurpleBanner;\n\t\t\tcase 664: return Item::PurpleBed;\n\t\t\tcase 310: return Item::PurpleCarpet;\n\t\t\tcase 423: return Item::PurpleConcrete;\n\t\t\tcase 439: return Item::PurpleConcretePowder;\n\t\t\tcase 636: return Item::PurpleDye;\n\t\t\tcase 407: return Item::PurpleGlazedTerracotta;\n\t\t\tcase 391: return Item::PurpleShulkerBox;\n\t\t\tcase 339: return Item::PurpleStainedGlass;\n\t\t\tcase 355: return Item::PurpleStainedGlassPane;\n\t\t\tcase 291: return Item::PurpleTerracotta;\n\t\t\tcase 92: return Item::PurpleWool;\n\t\t\tcase 150: return Item::PurpurBlock;\n\t\t\tcase 151: return Item::PurpurPillar;\n\t\t\tcase 133: return Item::PurpurSlab;\n\t\t\tcase 152: return Item::PurpurStairs;\n\t\t\tcase 782: return Item::Quartz;\n\t\t\tcase 276: return Item::QuartzBlock;\n\t\t\tcase 277: return Item::QuartzPillar;\n\t\t\tcase 130: return Item::QuartzSlab;\n\t\t\tcase 278: return Item::QuartzStairs;\n\t\t\tcase 787: return Item::Rabbit;\n\t\t\tcase 790: return Item::RabbitFoot;\n\t\t\tcase 791: return Item::RabbitHide;\n\t\t\tcase 730: return Item::RabbitSpawnEgg;\n\t\t\tcase 789: return Item::RabbitStew;\n\t\t\tcase 162: return Item::Rail;\n\t\t\tcase 731: return Item::RavagerSpawnEgg;\n\t\t\tcase 816: return Item::RedBanner;\n\t\t\tcase 668: return Item::RedBed;\n\t\t\tcase 314: return Item::RedCarpet;\n\t\t\tcase 427: return Item::RedConcrete;\n\t\t\tcase 443: return Item::RedConcretePowder;\n\t\t\tcase 632: return Item::RedDye;\n\t\t\tcase 411: return Item::RedGlazedTerracotta;\n\t\t\tcase 112: return Item::RedMushroom;\n\t\t\tcase 210: return Item::RedMushroomBlock;\n\t\t\tcase 502: return Item::RedNetherBrickSlab;\n\t\t\tcase 489: return Item::RedNetherBrickStairs;\n\t\t\tcase 255: return Item::RedNetherBrickWall;\n\t\t\tcase 376: return Item::RedNetherBricks;\n\t\t\tcase 27: return Item::RedSand;\n\t\t\tcase 368: return Item::RedSandstone;\n\t\t\tcase 131: return Item::RedSandstoneSlab;\n\t\t\tcase 371: return Item::RedSandstoneStairs;\n\t\t\tcase 249: return Item::RedSandstoneWall;\n\t\t\tcase 395: return Item::RedShulkerBox;\n\t\t\tcase 343: return Item::RedStainedGlass;\n\t\t\tcase 359: return Item::RedStainedGlassPane;\n\t\t\tcase 295: return Item::RedTerracotta;\n\t\t\tcase 103: return Item::RedTulip;\n\t\t\tcase 96: return Item::RedWool;\n\t\t\tcase 600: return Item::Redstone;\n\t\t\tcase 272: return Item::RedstoneBlock;\n\t\t\tcase 234: return Item::RedstoneLamp;\n\t\t\tcase 172: return Item::RedstoneOre;\n\t\t\tcase 173: return Item::RedstoneTorch;\n\t\t\tcase 513: return Item::Repeater;\n\t\t\tcase 372: return Item::RepeatingCommandBlock;\n\t\t\tcase 325: return Item::RoseBush;\n\t\t\tcase 681: return Item::RottenFlesh;\n\t\t\tcase 599: return Item::Saddle;\n\t\t\tcase 626: return Item::Salmon;\n\t\t\tcase 606: return Item::SalmonBucket;\n\t\t\tcase 732: return Item::SalmonSpawnEgg;\n\t\t\tcase 26: return Item::Sand;\n\t\t\tcase 68: return Item::Sandstone;\n\t\t\tcase 123: return Item::SandstoneSlab;\n\t\t\tcase 235: return Item::SandstoneStairs;\n\t\t\tcase 256: return Item::SandstoneWall;\n\t\t\tcase 505: return Item::Scaffolding;\n\t\t\tcase 519: return Item::Scute;\n\t\t\tcase 367: return Item::SeaLantern;\n\t\t\tcase 80: return Item::SeaPickle;\n\t\t\tcase 79: return Item::Seagrass;\n\t\t\tcase 672: return Item::Shears;\n\t\t\tcase 733: return Item::SheepSpawnEgg;\n\t\t\tcase 829: return Item::Shield;\n\t\t\tcase 380: return Item::ShulkerBox;\n\t\t\tcase 837: return Item::ShulkerShell;\n\t\t\tcase 734: return Item::ShulkerSpawnEgg;\n\t\t\tcase 735: return Item::SilverfishSpawnEgg;\n\t\t\tcase 737: return Item::SkeletonHorseSpawnEgg;\n\t\t\tcase 769: return Item::SkeletonSkull;\n\t\t\tcase 736: return Item::SkeletonSpawnEgg;\n\t\t\tcase 862: return Item::SkullBannerPattern;\n\t\t\tcase 617: return Item::SlimeBall;\n\t\t\tcase 321: return Item::SlimeBlock;\n\t\t\tcase 738: return Item::SlimeSpawnEgg;\n\t\t\tcase 872: return Item::SmithingTable;\n\t\t\tcase 866: return Item::Smoker;\n\t\t\tcase 137: return Item::SmoothQuartz;\n\t\t\tcase 499: return Item::SmoothQuartzSlab;\n\t\t\tcase 486: return Item::SmoothQuartzStairs;\n\t\t\tcase 138: return Item::SmoothRedSandstone;\n\t\t\tcase 493: return Item::SmoothRedSandstoneSlab;\n\t\t\tcase 479: return Item::SmoothRedSandstoneStairs;\n\t\t\tcase 139: return Item::SmoothSandstone;\n\t\t\tcase 498: return Item::SmoothSandstoneSlab;\n\t\t\tcase 485: return Item::SmoothSandstoneStairs;\n\t\t\tcase 140: return Item::SmoothStone;\n\t\t\tcase 122: return Item::SmoothStoneSlab;\n\t\t\tcase 175: return Item::Snow;\n\t\t\tcase 177: return Item::SnowBlock;\n\t\t\tcase 601: return Item::Snowball;\n\t\t\tcase 190: return Item::SoulSand;\n\t\t\tcase 153: return Item::Spawner;\n\t\t\tcase 826: return Item::SpectralArrow;\n\t\t\tcase 689: return Item::SpiderEye;\n\t\t\tcase 739: return Item::SpiderSpawnEgg;\n\t\t\tcase 825: return Item::SplashPotion;\n\t\t\tcase 62: return Item::Sponge;\n\t\t\tcase 831: return Item::SpruceBoat;\n\t\t\tcase 260: return Item::SpruceButton;\n\t\t\tcase 508: return Item::SpruceDoor;\n\t\t\tcase 182: return Item::SpruceFence;\n\t\t\tcase 217: return Item::SpruceFenceGate;\n\t\t\tcase 57: return Item::SpruceLeaves;\n\t\t\tcase 33: return Item::SpruceLog;\n\t\t\tcase 14: return Item::SprucePlanks;\n\t\t\tcase 167: return Item::SprucePressurePlate;\n\t\t\tcase 20: return Item::SpruceSapling;\n\t\t\tcase 590: return Item::SpruceSign;\n\t\t\tcase 116: return Item::SpruceSlab;\n\t\t\tcase 240: return Item::SpruceStairs;\n\t\t\tcase 194: return Item::SpruceTrapdoor;\n\t\t\tcase 51: return Item::SpruceWood;\n\t\t\tcase 740: return Item::SquidSpawnEgg;\n\t\t\tcase 545: return Item::Stick;\n\t\t\tcase 74: return Item::StickyPiston;\n\t\t\tcase 1: return Item::Stone;\n\t\t\tcase 540: return Item::StoneAxe;\n\t\t\tcase 128: return Item::StoneBrickSlab;\n\t\t\tcase 223: return Item::StoneBrickStairs;\n\t\t\tcase 252: return Item::StoneBrickWall;\n\t\t\tcase 205: return Item::StoneBricks;\n\t\t\tcase 174: return Item::StoneButton;\n\t\t\tcase 556: return Item::StoneHoe;\n\t\t\tcase 539: return Item::StonePickaxe;\n\t\t\tcase 165: return Item::StonePressurePlate;\n\t\t\tcase 538: return Item::StoneShovel;\n\t\t\tcase 121: return Item::StoneSlab;\n\t\t\tcase 484: return Item::StoneStairs;\n\t\t\tcase 537: return Item::StoneSword;\n\t\t\tcase 873: return Item::Stonecutter;\n\t\t\tcase 741: return Item::StraySpawnEgg;\n\t\t\tcase 552: return Item::String;\n\t\t\tcase 42: return Item::StrippedAcaciaLog;\n\t\t\tcase 48: return Item::StrippedAcaciaWood;\n\t\t\tcase 40: return Item::StrippedBirchLog;\n\t\t\tcase 46: return Item::StrippedBirchWood;\n\t\t\tcase 43: return Item::StrippedDarkOakLog;\n\t\t\tcase 49: return Item::StrippedDarkOakWood;\n\t\t\tcase 41: return Item::StrippedJungleLog;\n\t\t\tcase 47: return Item::StrippedJungleWood;\n\t\t\tcase 38: return Item::StrippedOakLog;\n\t\t\tcase 44: return Item::StrippedOakWood;\n\t\t\tcase 39: return Item::StrippedSpruceLog;\n\t\t\tcase 45: return Item::StrippedSpruceWood;\n\t\t\tcase 515: return Item::StructureBlock;\n\t\t\tcase 378: return Item::StructureVoid;\n\t\t\tcase 652: return Item::Sugar;\n\t\t\tcase 611: return Item::SugarCane;\n\t\t\tcase 323: return Item::Sunflower;\n\t\t\tcase 858: return Item::SuspiciousStew;\n\t\t\tcase 876: return Item::SweetBerries;\n\t\t\tcase 327: return Item::TallGrass;\n\t\t\tcase 316: return Item::Terracotta;\n\t\t\tcase 827: return Item::TippedArrow;\n\t\t\tcase 142: return Item::TNT;\n\t\t\tcase 783: return Item::TNTMinecart;\n\t\t\tcase 146: return Item::Torch;\n\t\t\tcase 836: return Item::TotemOfUndying;\n\t\t\tcase 742: return Item::TraderLlamaSpawnEgg;\n\t\t\tcase 268: return Item::TrappedChest;\n\t\t\tcase 853: return Item::Trident;\n\t\t\tcase 238: return Item::TripwireHook;\n\t\t\tcase 627: return Item::TropicalFish;\n\t\t\tcase 608: return Item::TropicalFishBucket;\n\t\t\tcase 743: return Item::TropicalFishSpawnEgg;\n\t\t\tcase 456: return Item::TubeCoral;\n\t\t\tcase 451: return Item::TubeCoralBlock;\n\t\t\tcase 466: return Item::TubeCoralFan;\n\t\t\tcase 445: return Item::TurtleEgg;\n\t\t\tcase 518: return Item::TurtleHelmet;\n\t\t\tcase 744: return Item::TurtleSpawnEgg;\n\t\t\tcase 745: return Item::VexSpawnEgg;\n\t\t\tcase 746: return Item::VillagerSpawnEgg;\n\t\t\tcase 747: return Item::VindicatorSpawnEgg;\n\t\t\tcase 215: return Item::Vine;\n\t\t\tcase 748: return Item::WanderingTraderSpawnEgg;\n\t\t\tcase 596: return Item::WaterBucket;\n\t\t\tcase 63: return Item::WetSponge;\n\t\t\tcase 561: return Item::Wheat;\n\t\t\tcase 560: return Item::WheatSeeds;\n\t\t\tcase 802: return Item::WhiteBanner;\n\t\t\tcase 654: return Item::WhiteBed;\n\t\t\tcase 300: return Item::WhiteCarpet;\n\t\t\tcase 413: return Item::WhiteConcrete;\n\t\t\tcase 429: return Item::WhiteConcretePowder;\n\t\t\tcase 650: return Item::WhiteDye;\n\t\t\tcase 397: return Item::WhiteGlazedTerracotta;\n\t\t\tcase 381: return Item::WhiteShulkerBox;\n\t\t\tcase 329: return Item::WhiteStainedGlass;\n\t\t\tcase 345: return Item::WhiteStainedGlassPane;\n\t\t\tcase 281: return Item::WhiteTerracotta;\n\t\t\tcase 105: return Item::WhiteTulip;\n\t\t\tcase 82: return Item::WhiteWool;\n\t\t\tcase 749: return Item::WitchSpawnEgg;\n\t\t\tcase 110: return Item::WitherRose;\n\t\t\tcase 770: return Item::WitherSkeletonSkull;\n\t\t\tcase 750: return Item::WitherSkeletonSpawnEgg;\n\t\t\tcase 751: return Item::WolfSpawnEgg;\n\t\t\tcase 536: return Item::WoodenAxe;\n\t\t\tcase 555: return Item::WoodenHoe;\n\t\t\tcase 535: return Item::WoodenPickaxe;\n\t\t\tcase 534: return Item::WoodenShovel;\n\t\t\tcase 533: return Item::WoodenSword;\n\t\t\tcase 758: return Item::WritableBook;\n\t\t\tcase 759: return Item::WrittenBook;\n\t\t\tcase 806: return Item::YellowBanner;\n\t\t\tcase 658: return Item::YellowBed;\n\t\t\tcase 304: return Item::YellowCarpet;\n\t\t\tcase 417: return Item::YellowConcrete;\n\t\t\tcase 433: return Item::YellowConcretePowder;\n\t\t\tcase 642: return Item::YellowDye;\n\t\t\tcase 401: return Item::YellowGlazedTerracotta;\n\t\t\tcase 385: return Item::YellowShulkerBox;\n\t\t\tcase 333: return Item::YellowStainedGlass;\n\t\t\tcase 349: return Item::YellowStainedGlassPane;\n\t\t\tcase 285: return Item::YellowTerracotta;\n\t\t\tcase 86: return Item::YellowWool;\n\t\t\tcase 772: return Item::ZombieHead;\n\t\t\tcase 753: return Item::ZombieHorseSpawnEgg;\n\t\t\tcase 754: return Item::ZombiePigmanSpawnEgg;\n\t\t\tcase 752: return Item::ZombieSpawnEgg;\n\t\t\tcase 755: return Item::ZombieVillagerSpawnEgg;\n\t\t\tdefault: return Item::Air;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_15.h",
    "content": "#pragma once\n\n#include \"BlockState.h\"\n#include \"Registries/Items.h\"\n#include \"Registries/CustomStatistics.h\"\n\nnamespace Palette_1_15\n{\n\tUInt32 From(BlockState Block);\n\tUInt32 From(Item ID);\n\tUInt32 From(CustomStatistic ID);\n\tItem ToItem(UInt32 ID);\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_16.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"Palette_1_16.h\"\n#include \"Registries/BlockStates.h\"\n\nnamespace Palette_1_16\n{\n\tUInt32 From(const BlockState Block)\n\t{\n\t\tusing namespace Block;\n\n\t\tswitch (Block.ID)\n\t\t{\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6442;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6443;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6444;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6445;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 6446;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 6447;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 6448;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 6449;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6450;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6451;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6452;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6453;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 6454;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 6455;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 6456;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 6457;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6458;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6459;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6460;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6461;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 6462;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 6463;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 6464;\n\t\t\tcase AcaciaButton::AcaciaButton(AcaciaButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 6465;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8930;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8931;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8932;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8933;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8934;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8935;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8936;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8937;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8938;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8939;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8940;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8941;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8942;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8943;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8944;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8945;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8946;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8947;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8948;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8949;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8950;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8951;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8952;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8953;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8954;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8955;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8956;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8957;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8958;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8959;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8960;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8961;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8962;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8963;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8964;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8965;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8966;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8967;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8968;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8969;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8970;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8971;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8972;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8973;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8974;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8975;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8976;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8977;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, true).ID: return 8978;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, true, false).ID: return 8979;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true).ID: return 8980;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false).ID: return 8981;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, true).ID: return 8982;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, true, false).ID: return 8983;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true).ID: return 8984;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false).ID: return 8985;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, true).ID: return 8986;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, true, false).ID: return 8987;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, true).ID: return 8988;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Left, false, false).ID: return 8989;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, true).ID: return 8990;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false).ID: return 8991;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, true).ID: return 8992;\n\t\t\tcase AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false).ID: return 8993;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, true).ID: return 8676;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, true, false).ID: return 8677;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, true).ID: return 8680;\n\t\t\tcase AcaciaFence::AcaciaFence(true, true, false, false).ID: return 8681;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, true).ID: return 8684;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, true, false).ID: return 8685;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, true).ID: return 8688;\n\t\t\tcase AcaciaFence::AcaciaFence(true, false, false, false).ID: return 8689;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, true).ID: return 8692;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, true, false).ID: return 8693;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, true).ID: return 8696;\n\t\t\tcase AcaciaFence::AcaciaFence(false, true, false, false).ID: return 8697;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, true).ID: return 8700;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, true, false).ID: return 8701;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, true).ID: return 8704;\n\t\t\tcase AcaciaFence::AcaciaFence(false, false, false, false).ID: return 8705;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 8514;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 8515;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 8516;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 8517;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 8518;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 8519;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 8520;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 8521;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 8522;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 8523;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 8524;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 8525;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 8526;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 8527;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 8528;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 8529;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 8530;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 8531;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 8532;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 8533;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 8534;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 8535;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8536;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8537;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8538;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8539;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8540;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8541;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8542;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8543;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8544;\n\t\t\tcase AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8545;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, true).ID: return 201;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(1, false).ID: return 202;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, true).ID: return 203;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(2, false).ID: return 204;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, true).ID: return 205;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(3, false).ID: return 206;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, true).ID: return 207;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(4, false).ID: return 208;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, true).ID: return 209;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(5, false).ID: return 210;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, true).ID: return 211;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(6, false).ID: return 212;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, true).ID: return 213;\n\t\t\tcase AcaciaLeaves::AcaciaLeaves(7, false).ID: return 214;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::X).ID: return 85;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Y).ID: return 86;\n\t\t\tcase AcaciaLog::AcaciaLog(AcaciaLog::Axis::Z).ID: return 87;\n\t\t\tcase AcaciaPlanks::AcaciaPlanks().ID: return 19;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(true).ID: return 3881;\n\t\t\tcase AcaciaPressurePlate::AcaciaPressurePlate(false).ID: return 3882;\n\t\t\tcase AcaciaSapling::AcaciaSapling(0).ID: return 29;\n\t\t\tcase AcaciaSapling::AcaciaSapling(1).ID: return 30;\n\t\t\tcase AcaciaSign::AcaciaSign(0).ID: return 3478;\n\t\t\tcase AcaciaSign::AcaciaSign(1).ID: return 3480;\n\t\t\tcase AcaciaSign::AcaciaSign(2).ID: return 3482;\n\t\t\tcase AcaciaSign::AcaciaSign(3).ID: return 3484;\n\t\t\tcase AcaciaSign::AcaciaSign(4).ID: return 3486;\n\t\t\tcase AcaciaSign::AcaciaSign(5).ID: return 3488;\n\t\t\tcase AcaciaSign::AcaciaSign(6).ID: return 3490;\n\t\t\tcase AcaciaSign::AcaciaSign(7).ID: return 3492;\n\t\t\tcase AcaciaSign::AcaciaSign(8).ID: return 3494;\n\t\t\tcase AcaciaSign::AcaciaSign(9).ID: return 3496;\n\t\t\tcase AcaciaSign::AcaciaSign(10).ID: return 3498;\n\t\t\tcase AcaciaSign::AcaciaSign(11).ID: return 3500;\n\t\t\tcase AcaciaSign::AcaciaSign(12).ID: return 3502;\n\t\t\tcase AcaciaSign::AcaciaSign(13).ID: return 3504;\n\t\t\tcase AcaciaSign::AcaciaSign(14).ID: return 3506;\n\t\t\tcase AcaciaSign::AcaciaSign(15).ID: return 3508;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Top).ID: return 8325;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Bottom).ID: return 8327;\n\t\t\tcase AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Double).ID: return 8329;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 7376;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 7378;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 7380;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 7382;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 7384;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 7386;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 7388;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 7390;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 7392;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 7394;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 7396;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 7398;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 7400;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 7402;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 7404;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 7406;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 7408;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 7410;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 7412;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 7414;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 7416;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 7418;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 7420;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 7422;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 7424;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 7426;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 7428;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 7430;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 7432;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 7434;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight).ID: return 7436;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerLeft).ID: return 7438;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::InnerRight).ID: return 7440;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterLeft).ID: return 7442;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::OuterRight).ID: return 7444;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight).ID: return 7446;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerLeft).ID: return 7448;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::InnerRight).ID: return 7450;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterLeft).ID: return 7452;\n\t\t\tcase AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::OuterRight).ID: return 7454;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, true).ID: return 4368;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, true, false).ID: return 4370;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, true).ID: return 4372;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Top, false, false).ID: return 4374;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4376;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4378;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4380;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4382;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, true).ID: return 4384;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, true, false).ID: return 4386;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, true).ID: return 4388;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Top, false, false).ID: return 4390;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4392;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4394;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4396;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_ZP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4398;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, true).ID: return 4400;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, true, false).ID: return 4402;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, true).ID: return 4404;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Top, false, false).ID: return 4406;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4408;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4410;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4412;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XM, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4414;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, true).ID: return 4416;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, true, false).ID: return 4418;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, true).ID: return 4420;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Top, false, false).ID: return 4422;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, true).ID: return 4424;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, true, false).ID: return 4426;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, true).ID: return 4428;\n\t\t\tcase AcaciaTrapdoor::AcaciaTrapdoor(eBlockFace::BLOCK_FACE_XP, AcaciaTrapdoor::Half::Bottom, false, false).ID: return 4430;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3760;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3762;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3764;\n\t\t\tcase AcaciaWallSign::AcaciaWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3766;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::X).ID: return 121;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Y).ID: return 122;\n\t\t\tcase AcaciaWood::AcaciaWood(AcaciaWood::Axis::Z).ID: return 123;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::NorthSouth).ID: return 6823;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::EastWest).ID: return 6824;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingEast).ID: return 6825;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingWest).ID: return 6826;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingNorth).ID: return 6827;\n\t\t\tcase ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingSouth).ID: return 6828;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::NorthSouth).ID: return 6829;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::EastWest).ID: return 6830;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingEast).ID: return 6831;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingWest).ID: return 6832;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingNorth).ID: return 6833;\n\t\t\tcase ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingSouth).ID: return 6834;\n\t\t\tcase Air::Air().ID: return -0;\n\t\t\tcase Allium::Allium().ID: return 1415;\n\t\t\tcase AncientDebris::AncientDebris().ID: return 15827;\n\t\t\tcase Andesite::Andesite().ID: return 6;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Top).ID: return 10844;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Bottom).ID: return 10846;\n\t\t\tcase AndesiteSlab::AndesiteSlab(AndesiteSlab::Type::Double).ID: return 10848;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 10470;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 10472;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 10474;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 10476;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 10478;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 10480;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 10482;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 10484;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 10486;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 10488;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 10490;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 10492;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 10494;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 10496;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 10498;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 10500;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 10502;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 10504;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 10506;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_ZP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 10508;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 10510;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 10512;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 10514;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 10516;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 10518;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 10520;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 10522;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 10524;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 10526;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XM, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 10528;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::Straight).ID: return 10530;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerLeft).ID: return 10532;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::InnerRight).ID: return 10534;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterLeft).ID: return 10536;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Top, AndesiteStairs::Shape::OuterRight).ID: return 10538;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::Straight).ID: return 10540;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerLeft).ID: return 10542;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::InnerRight).ID: return 10544;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterLeft).ID: return 10546;\n\t\t\tcase AndesiteStairs::AndesiteStairs(eBlockFace::BLOCK_FACE_XP, AndesiteStairs::Half::Bottom, AndesiteStairs::Shape::OuterRight).ID: return 10548;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13138;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13139;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13140;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13144;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13145;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13146;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13150;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13151;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13152;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13156;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13157;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13158;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13162;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13163;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13164;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13168;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13169;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13170;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13174;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13175;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13176;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13180;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13181;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13182;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13186;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13187;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13188;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13192;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13193;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13194;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13198;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13199;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13200;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13204;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13205;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13206;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13210;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13211;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13212;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13216;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13217;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13218;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13222;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13223;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13224;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13228;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13229;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13230;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13234;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13235;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13236;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13240;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13241;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::None, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13242;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13246;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13247;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13248;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13252;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13253;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13254;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13258;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13259;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13260;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13264;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13265;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13266;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13270;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13271;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13272;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13276;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13277;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13278;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13282;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13283;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13284;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13288;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13289;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13290;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13294;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13295;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13296;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13300;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13301;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13302;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13306;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13307;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13308;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13312;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13313;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13314;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13318;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13319;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13320;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13324;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13325;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13326;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13330;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13331;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13332;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13336;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13337;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13338;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13342;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13343;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13344;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13348;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13349;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Low, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13350;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13354;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13355;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13356;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13360;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13361;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13362;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13366;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13367;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13368;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13372;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13373;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13374;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13378;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13379;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13380;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13384;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13385;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::None, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13386;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13390;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13391;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13392;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13396;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13397;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13398;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13402;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13403;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13404;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13408;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13409;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13410;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13414;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13415;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13416;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13420;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13421;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Low, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13422;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::None).ID: return 13426;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::Low).ID: return 13427;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::None, true, AndesiteWall::West::Tall).ID: return 13428;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::None).ID: return 13432;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::Low).ID: return 13433;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::None, false, AndesiteWall::West::Tall).ID: return 13434;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::None).ID: return 13438;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::Low).ID: return 13439;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Low, true, AndesiteWall::West::Tall).ID: return 13440;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::None).ID: return 13444;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::Low).ID: return 13445;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Low, false, AndesiteWall::West::Tall).ID: return 13446;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::None).ID: return 13450;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::Low).ID: return 13451;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Tall, true, AndesiteWall::West::Tall).ID: return 13452;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::None).ID: return 13456;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::Low).ID: return 13457;\n\t\t\tcase AndesiteWall::AndesiteWall(AndesiteWall::East::Tall, AndesiteWall::North::Tall, AndesiteWall::South::Tall, false, AndesiteWall::West::Tall).ID: return 13458;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6610;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6611;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XM).ID: return 6612;\n\t\t\tcase Anvil::Anvil(eBlockFace::BLOCK_FACE_XP).ID: return 6613;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4768;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4769;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XM).ID: return 4770;\n\t\t\tcase AttachedMelonStem::AttachedMelonStem(eBlockFace::BLOCK_FACE_XP).ID: return 4771;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZM).ID: return 4764;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_ZP).ID: return 4765;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XM).ID: return 4766;\n\t\t\tcase AttachedPumpkinStem::AttachedPumpkinStem(eBlockFace::BLOCK_FACE_XP).ID: return 4767;\n\t\t\tcase AzureBluet::AzureBluet().ID: return 1416;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::None, 0).ID: return 9652;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::None, 1).ID: return 9653;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Small, 0).ID: return 9654;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Small, 1).ID: return 9655;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Large, 0).ID: return 9656;\n\t\t\tcase Bamboo::Bamboo(0, Bamboo::Leaves::Large, 1).ID: return 9657;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::None, 0).ID: return 9658;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::None, 1).ID: return 9659;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Small, 0).ID: return 9660;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Small, 1).ID: return 9661;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Large, 0).ID: return 9662;\n\t\t\tcase Bamboo::Bamboo(1, Bamboo::Leaves::Large, 1).ID: return 9663;\n\t\t\tcase BambooSapling::BambooSapling().ID: return 9651;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZM, true).ID: return 14791;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZM, false).ID: return 14792;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XP, true).ID: return 14793;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XP, false).ID: return 14794;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZP, true).ID: return 14795;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_ZP, false).ID: return 14796;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XM, true).ID: return 14797;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_XM, false).ID: return 14798;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YP, true).ID: return 14799;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YP, false).ID: return 14800;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YM, true).ID: return 14801;\n\t\t\tcase Barrel::Barrel(eBlockFace::BLOCK_FACE_YM, false).ID: return 14802;\n\t\t\tcase Barrier::Barrier().ID: return 7536;\n\t\t\tcase Basalt::Basalt(Basalt::Axis::X).ID: return 4002;\n\t\t\tcase Basalt::Basalt(Basalt::Axis::Y).ID: return 4003;\n\t\t\tcase Basalt::Basalt(Basalt::Axis::Z).ID: return 4004;\n\t\t\tcase Beacon::Beacon().ID: return 5656;\n\t\t\tcase Bedrock::Bedrock().ID: return 33;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 0).ID: return 15776;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 1).ID: return 15777;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 2).ID: return 15778;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 3).ID: return 15779;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 4).ID: return 15780;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZM, 5).ID: return 15781;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 0).ID: return 15782;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 1).ID: return 15783;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 2).ID: return 15784;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 3).ID: return 15785;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 4).ID: return 15786;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_ZP, 5).ID: return 15787;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 0).ID: return 15788;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 1).ID: return 15789;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 2).ID: return 15790;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 3).ID: return 15791;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 4).ID: return 15792;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XM, 5).ID: return 15793;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 0).ID: return 15794;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 1).ID: return 15795;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 2).ID: return 15796;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 3).ID: return 15797;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 4).ID: return 15798;\n\t\t\tcase BeeNest::BeeNest(eBlockFace::BLOCK_FACE_XP, 5).ID: return 15799;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 0).ID: return 15800;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 1).ID: return 15801;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 2).ID: return 15802;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 3).ID: return 15803;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 4).ID: return 15804;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZM, 5).ID: return 15805;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 0).ID: return 15806;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 1).ID: return 15807;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 2).ID: return 15808;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 3).ID: return 15809;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 4).ID: return 15810;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_ZP, 5).ID: return 15811;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 0).ID: return 15812;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 1).ID: return 15813;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 2).ID: return 15814;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 3).ID: return 15815;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 4).ID: return 15816;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XM, 5).ID: return 15817;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 0).ID: return 15818;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 1).ID: return 15819;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 2).ID: return 15820;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 3).ID: return 15821;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 4).ID: return 15822;\n\t\t\tcase Beehive::Beehive(eBlockFace::BLOCK_FACE_XP, 5).ID: return 15823;\n\t\t\tcase Beetroots::Beetroots(0).ID: return 9219;\n\t\t\tcase Beetroots::Beetroots(1).ID: return 9220;\n\t\t\tcase Beetroots::Beetroots(2).ID: return 9221;\n\t\t\tcase Beetroots::Beetroots(3).ID: return 9222;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 14854;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 14855;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 14856;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 14857;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 14858;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 14859;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 14860;\n\t\t\tcase Bell::Bell(Bell::Attachment::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 14861;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 14862;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 14863;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 14864;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 14865;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 14866;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 14867;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 14868;\n\t\t\tcase Bell::Bell(Bell::Attachment::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 14869;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 14870;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 14871;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 14872;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 14873;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XM, true).ID: return 14874;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XM, false).ID: return 14875;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XP, true).ID: return 14876;\n\t\t\tcase Bell::Bell(Bell::Attachment::SingleWall, eBlockFace::BLOCK_FACE_XP, false).ID: return 14877;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 14878;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 14879;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 14880;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 14881;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XM, true).ID: return 14882;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XM, false).ID: return 14883;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XP, true).ID: return 14884;\n\t\t\tcase Bell::Bell(Bell::Attachment::DoubleWall, eBlockFace::BLOCK_FACE_XP, false).ID: return 14885;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6394;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6395;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6396;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6397;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 6398;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 6399;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 6400;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 6401;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6402;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6403;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6404;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6405;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 6406;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 6407;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 6408;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 6409;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6410;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6411;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6412;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6413;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 6414;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 6415;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 6416;\n\t\t\tcase BirchButton::BirchButton(BirchButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 6417;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8802;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8803;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8804;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8805;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8806;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8807;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8808;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8809;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8810;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8811;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8812;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8813;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8814;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8815;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8816;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8817;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8818;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8819;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8820;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8821;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8822;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8823;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8824;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8825;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8826;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8827;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8828;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8829;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8830;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8831;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8832;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8833;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8834;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8835;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8836;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8837;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8838;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8839;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8840;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8841;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8842;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8843;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8844;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8845;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8846;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8847;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8848;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8849;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, true).ID: return 8850;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, true, false).ID: return 8851;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true).ID: return 8852;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false).ID: return 8853;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, true).ID: return 8854;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, true, false).ID: return 8855;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true).ID: return 8856;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false).ID: return 8857;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, true).ID: return 8858;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, true, false).ID: return 8859;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, true).ID: return 8860;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Left, false, false).ID: return 8861;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, true).ID: return 8862;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false).ID: return 8863;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, true).ID: return 8864;\n\t\t\tcase BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false).ID: return 8865;\n\t\t\tcase BirchFence::BirchFence(true, true, true, true).ID: return 8612;\n\t\t\tcase BirchFence::BirchFence(true, true, true, false).ID: return 8613;\n\t\t\tcase BirchFence::BirchFence(true, true, false, true).ID: return 8616;\n\t\t\tcase BirchFence::BirchFence(true, true, false, false).ID: return 8617;\n\t\t\tcase BirchFence::BirchFence(true, false, true, true).ID: return 8620;\n\t\t\tcase BirchFence::BirchFence(true, false, true, false).ID: return 8621;\n\t\t\tcase BirchFence::BirchFence(true, false, false, true).ID: return 8624;\n\t\t\tcase BirchFence::BirchFence(true, false, false, false).ID: return 8625;\n\t\t\tcase BirchFence::BirchFence(false, true, true, true).ID: return 8628;\n\t\t\tcase BirchFence::BirchFence(false, true, true, false).ID: return 8629;\n\t\t\tcase BirchFence::BirchFence(false, true, false, true).ID: return 8632;\n\t\t\tcase BirchFence::BirchFence(false, true, false, false).ID: return 8633;\n\t\t\tcase BirchFence::BirchFence(false, false, true, true).ID: return 8636;\n\t\t\tcase BirchFence::BirchFence(false, false, true, false).ID: return 8637;\n\t\t\tcase BirchFence::BirchFence(false, false, false, true).ID: return 8640;\n\t\t\tcase BirchFence::BirchFence(false, false, false, false).ID: return 8641;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 8450;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 8451;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 8452;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 8453;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 8454;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 8455;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 8456;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 8457;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 8458;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 8459;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 8460;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 8461;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 8462;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 8463;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 8464;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 8465;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 8466;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 8467;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 8468;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 8469;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 8470;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 8471;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8472;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8473;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8474;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8475;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8476;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8477;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8478;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8479;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8480;\n\t\t\tcase BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8481;\n\t\t\tcase BirchLeaves::BirchLeaves(1, true).ID: return 173;\n\t\t\tcase BirchLeaves::BirchLeaves(1, false).ID: return 174;\n\t\t\tcase BirchLeaves::BirchLeaves(2, true).ID: return 175;\n\t\t\tcase BirchLeaves::BirchLeaves(2, false).ID: return 176;\n\t\t\tcase BirchLeaves::BirchLeaves(3, true).ID: return 177;\n\t\t\tcase BirchLeaves::BirchLeaves(3, false).ID: return 178;\n\t\t\tcase BirchLeaves::BirchLeaves(4, true).ID: return 179;\n\t\t\tcase BirchLeaves::BirchLeaves(4, false).ID: return 180;\n\t\t\tcase BirchLeaves::BirchLeaves(5, true).ID: return 181;\n\t\t\tcase BirchLeaves::BirchLeaves(5, false).ID: return 182;\n\t\t\tcase BirchLeaves::BirchLeaves(6, true).ID: return 183;\n\t\t\tcase BirchLeaves::BirchLeaves(6, false).ID: return 184;\n\t\t\tcase BirchLeaves::BirchLeaves(7, true).ID: return 185;\n\t\t\tcase BirchLeaves::BirchLeaves(7, false).ID: return 186;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::X).ID: return 79;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Y).ID: return 80;\n\t\t\tcase BirchLog::BirchLog(BirchLog::Axis::Z).ID: return 81;\n\t\t\tcase BirchPlanks::BirchPlanks().ID: return 17;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(true).ID: return 3877;\n\t\t\tcase BirchPressurePlate::BirchPressurePlate(false).ID: return 3878;\n\t\t\tcase BirchSapling::BirchSapling(0).ID: return 25;\n\t\t\tcase BirchSapling::BirchSapling(1).ID: return 26;\n\t\t\tcase BirchSign::BirchSign(0).ID: return 3446;\n\t\t\tcase BirchSign::BirchSign(1).ID: return 3448;\n\t\t\tcase BirchSign::BirchSign(2).ID: return 3450;\n\t\t\tcase BirchSign::BirchSign(3).ID: return 3452;\n\t\t\tcase BirchSign::BirchSign(4).ID: return 3454;\n\t\t\tcase BirchSign::BirchSign(5).ID: return 3456;\n\t\t\tcase BirchSign::BirchSign(6).ID: return 3458;\n\t\t\tcase BirchSign::BirchSign(7).ID: return 3460;\n\t\t\tcase BirchSign::BirchSign(8).ID: return 3462;\n\t\t\tcase BirchSign::BirchSign(9).ID: return 3464;\n\t\t\tcase BirchSign::BirchSign(10).ID: return 3466;\n\t\t\tcase BirchSign::BirchSign(11).ID: return 3468;\n\t\t\tcase BirchSign::BirchSign(12).ID: return 3470;\n\t\t\tcase BirchSign::BirchSign(13).ID: return 3472;\n\t\t\tcase BirchSign::BirchSign(14).ID: return 3474;\n\t\t\tcase BirchSign::BirchSign(15).ID: return 3476;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Top).ID: return 8313;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Bottom).ID: return 8315;\n\t\t\tcase BirchSlab::BirchSlab(BirchSlab::Type::Double).ID: return 8317;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5485;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5487;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5489;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5491;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5493;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5495;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5497;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5499;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5501;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5503;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5505;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5507;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5509;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5511;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5513;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5515;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5517;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5519;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5521;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5523;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5525;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5527;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5529;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5531;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5533;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5535;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5537;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5539;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5541;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5543;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::Straight).ID: return 5545;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerLeft).ID: return 5547;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::InnerRight).ID: return 5549;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterLeft).ID: return 5551;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::OuterRight).ID: return 5553;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight).ID: return 5555;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerLeft).ID: return 5557;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::InnerRight).ID: return 5559;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterLeft).ID: return 5561;\n\t\t\tcase BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::OuterRight).ID: return 5563;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, true).ID: return 4240;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, true, false).ID: return 4242;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, true).ID: return 4244;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Top, false, false).ID: return 4246;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, true).ID: return 4248;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, true, false).ID: return 4250;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, true).ID: return 4252;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZM, BirchTrapdoor::Half::Bottom, false, false).ID: return 4254;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, true).ID: return 4256;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, true, false).ID: return 4258;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, true).ID: return 4260;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Top, false, false).ID: return 4262;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, true).ID: return 4264;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, true, false).ID: return 4266;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, true).ID: return 4268;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_ZP, BirchTrapdoor::Half::Bottom, false, false).ID: return 4270;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, true).ID: return 4272;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, true, false).ID: return 4274;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, true).ID: return 4276;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Top, false, false).ID: return 4278;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, true).ID: return 4280;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, true, false).ID: return 4282;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, true).ID: return 4284;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XM, BirchTrapdoor::Half::Bottom, false, false).ID: return 4286;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, true).ID: return 4288;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, true, false).ID: return 4290;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, true).ID: return 4292;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Top, false, false).ID: return 4294;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, true).ID: return 4296;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, true, false).ID: return 4298;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, true).ID: return 4300;\n\t\t\tcase BirchTrapdoor::BirchTrapdoor(eBlockFace::BLOCK_FACE_XP, BirchTrapdoor::Half::Bottom, false, false).ID: return 4302;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3752;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3754;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3756;\n\t\t\tcase BirchWallSign::BirchWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3758;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::X).ID: return 115;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Y).ID: return 116;\n\t\t\tcase BirchWood::BirchWood(BirchWood::Axis::Z).ID: return 117;\n\t\t\tcase BlackBanner::BlackBanner(0).ID: return 8137;\n\t\t\tcase BlackBanner::BlackBanner(1).ID: return 8138;\n\t\t\tcase BlackBanner::BlackBanner(2).ID: return 8139;\n\t\t\tcase BlackBanner::BlackBanner(3).ID: return 8140;\n\t\t\tcase BlackBanner::BlackBanner(4).ID: return 8141;\n\t\t\tcase BlackBanner::BlackBanner(5).ID: return 8142;\n\t\t\tcase BlackBanner::BlackBanner(6).ID: return 8143;\n\t\t\tcase BlackBanner::BlackBanner(7).ID: return 8144;\n\t\t\tcase BlackBanner::BlackBanner(8).ID: return 8145;\n\t\t\tcase BlackBanner::BlackBanner(9).ID: return 8146;\n\t\t\tcase BlackBanner::BlackBanner(10).ID: return 8147;\n\t\t\tcase BlackBanner::BlackBanner(11).ID: return 8148;\n\t\t\tcase BlackBanner::BlackBanner(12).ID: return 8149;\n\t\t\tcase BlackBanner::BlackBanner(13).ID: return 8150;\n\t\t\tcase BlackBanner::BlackBanner(14).ID: return 8151;\n\t\t\tcase BlackBanner::BlackBanner(15).ID: return 8152;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Head).ID: return 1289;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, true, BlackBed::Part::Foot).ID: return 1290;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Head).ID: return 1291;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZM, false, BlackBed::Part::Foot).ID: return 1292;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Head).ID: return 1293;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, true, BlackBed::Part::Foot).ID: return 1294;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Head).ID: return 1295;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_ZP, false, BlackBed::Part::Foot).ID: return 1296;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Head).ID: return 1297;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, true, BlackBed::Part::Foot).ID: return 1298;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Head).ID: return 1299;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XM, false, BlackBed::Part::Foot).ID: return 1300;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Head).ID: return 1301;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, true, BlackBed::Part::Foot).ID: return 1302;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Head).ID: return 1303;\n\t\t\tcase BlackBed::BlackBed(eBlockFace::BLOCK_FACE_XP, false, BlackBed::Part::Foot).ID: return 1304;\n\t\t\tcase BlackCarpet::BlackCarpet().ID: return 7881;\n\t\t\tcase BlackConcrete::BlackConcrete().ID: return 9453;\n\t\t\tcase BlackConcretePowder::BlackConcretePowder().ID: return 9469;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9434;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9435;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9436;\n\t\t\tcase BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9437;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9368;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9369;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9370;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9371;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9372;\n\t\t\tcase BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9373;\n\t\t\tcase BlackStainedGlass::BlackStainedGlass().ID: return 4110;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, true).ID: return 7345;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, true, false).ID: return 7346;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, true).ID: return 7349;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, true, false, false).ID: return 7350;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, true).ID: return 7353;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, true, false).ID: return 7354;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, true).ID: return 7357;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(true, false, false, false).ID: return 7358;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, true).ID: return 7361;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, true, false).ID: return 7362;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, true).ID: return 7365;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, true, false, false).ID: return 7366;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, true).ID: return 7369;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, true, false).ID: return 7370;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, true).ID: return 7373;\n\t\t\tcase BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, false).ID: return 7374;\n\t\t\tcase BlackTerracotta::BlackTerracotta().ID: return 6862;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8213;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8214;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8215;\n\t\t\tcase BlackWallBanner::BlackWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8216;\n\t\t\tcase BlackWool::BlackWool().ID: return 1399;\n\t\t\tcase Blackstone::Blackstone().ID: return 15839;\n\t\t\tcase BlackstoneSlab::BlackstoneSlab(BlackstoneSlab::Type::Top).ID: return 16245;\n\t\t\tcase BlackstoneSlab::BlackstoneSlab(BlackstoneSlab::Type::Bottom).ID: return 16247;\n\t\t\tcase BlackstoneSlab::BlackstoneSlab(BlackstoneSlab::Type::Double).ID: return 16249;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::Straight).ID: return 15841;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::InnerLeft).ID: return 15843;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::InnerRight).ID: return 15845;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::OuterLeft).ID: return 15847;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::OuterRight).ID: return 15849;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::Straight).ID: return 15851;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::InnerLeft).ID: return 15853;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::InnerRight).ID: return 15855;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::OuterLeft).ID: return 15857;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::OuterRight).ID: return 15859;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::Straight).ID: return 15861;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::InnerLeft).ID: return 15863;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::InnerRight).ID: return 15865;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::OuterLeft).ID: return 15867;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::OuterRight).ID: return 15869;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::Straight).ID: return 15871;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::InnerLeft).ID: return 15873;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::InnerRight).ID: return 15875;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::OuterLeft).ID: return 15877;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::OuterRight).ID: return 15879;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::Straight).ID: return 15881;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::InnerLeft).ID: return 15883;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::InnerRight).ID: return 15885;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::OuterLeft).ID: return 15887;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::OuterRight).ID: return 15889;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::Straight).ID: return 15891;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::InnerLeft).ID: return 15893;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::InnerRight).ID: return 15895;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::OuterLeft).ID: return 15897;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XM, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::OuterRight).ID: return 15899;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::Straight).ID: return 15901;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::InnerLeft).ID: return 15903;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::InnerRight).ID: return 15905;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::OuterLeft).ID: return 15907;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Top, BlackstoneStairs::Shape::OuterRight).ID: return 15909;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::Straight).ID: return 15911;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::InnerLeft).ID: return 15913;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::InnerRight).ID: return 15915;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::OuterLeft).ID: return 15917;\n\t\t\tcase BlackstoneStairs::BlackstoneStairs(eBlockFace::BLOCK_FACE_XP, BlackstoneStairs::Half::Bottom, BlackstoneStairs::Shape::OuterRight).ID: return 15919;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 15923;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 15924;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 15925;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 15929;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 15930;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 15931;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 15935;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 15936;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 15937;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 15941;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 15942;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 15943;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 15947;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 15948;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 15949;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 15953;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 15954;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 15955;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 15959;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 15960;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 15961;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 15965;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 15966;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 15967;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 15971;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 15972;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 15973;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 15977;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 15978;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 15979;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 15983;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 15984;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 15985;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 15989;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 15990;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 15991;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 15995;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 15996;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 15997;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 16001;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 16002;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 16003;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 16007;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 16008;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 16009;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 16013;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 16014;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 16015;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 16019;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 16020;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 16021;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 16025;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 16026;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::None, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 16027;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 16031;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 16032;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 16033;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 16037;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 16038;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 16039;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 16043;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 16044;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 16045;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 16049;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 16050;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 16051;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 16055;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 16056;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 16057;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 16061;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 16062;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 16063;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 16067;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 16068;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 16069;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 16073;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 16074;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 16075;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 16079;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 16080;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 16081;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 16085;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 16086;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 16087;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 16091;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 16092;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 16093;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 16097;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 16098;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 16099;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 16103;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 16104;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 16105;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 16109;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 16110;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 16111;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 16115;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 16116;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 16117;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 16121;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 16122;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 16123;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 16127;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 16128;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 16129;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 16133;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 16134;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Low, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 16135;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 16139;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 16140;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 16141;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 16145;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 16146;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 16147;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 16151;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 16152;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 16153;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 16157;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 16158;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 16159;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 16163;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 16164;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 16165;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 16169;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 16170;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::None, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 16171;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 16175;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 16176;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 16177;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 16181;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 16182;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 16183;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 16187;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 16188;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 16189;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 16193;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 16194;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 16195;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 16199;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 16200;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 16201;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 16205;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 16206;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Low, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 16207;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::None).ID: return 16211;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::Low).ID: return 16212;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::None, true, BlackstoneWall::West::Tall).ID: return 16213;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::None).ID: return 16217;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::Low).ID: return 16218;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::None, false, BlackstoneWall::West::Tall).ID: return 16219;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::None).ID: return 16223;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::Low).ID: return 16224;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, true, BlackstoneWall::West::Tall).ID: return 16225;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::None).ID: return 16229;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::Low).ID: return 16230;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Low, false, BlackstoneWall::West::Tall).ID: return 16231;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::None).ID: return 16235;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Low).ID: return 16236;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, true, BlackstoneWall::West::Tall).ID: return 16237;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::None).ID: return 16241;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Low).ID: return 16242;\n\t\t\tcase BlackstoneWall::BlackstoneWall(BlackstoneWall::East::Tall, BlackstoneWall::North::Tall, BlackstoneWall::South::Tall, false, BlackstoneWall::West::Tall).ID: return 16243;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZM, true).ID: return 14811;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZM, false).ID: return 14812;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZP, true).ID: return 14813;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_ZP, false).ID: return 14814;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XM, true).ID: return 14815;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XM, false).ID: return 14816;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XP, true).ID: return 14817;\n\t\t\tcase BlastFurnace::BlastFurnace(eBlockFace::BLOCK_FACE_XP, false).ID: return 14818;\n\t\t\tcase BlueBanner::BlueBanner(0).ID: return 8073;\n\t\t\tcase BlueBanner::BlueBanner(1).ID: return 8074;\n\t\t\tcase BlueBanner::BlueBanner(2).ID: return 8075;\n\t\t\tcase BlueBanner::BlueBanner(3).ID: return 8076;\n\t\t\tcase BlueBanner::BlueBanner(4).ID: return 8077;\n\t\t\tcase BlueBanner::BlueBanner(5).ID: return 8078;\n\t\t\tcase BlueBanner::BlueBanner(6).ID: return 8079;\n\t\t\tcase BlueBanner::BlueBanner(7).ID: return 8080;\n\t\t\tcase BlueBanner::BlueBanner(8).ID: return 8081;\n\t\t\tcase BlueBanner::BlueBanner(9).ID: return 8082;\n\t\t\tcase BlueBanner::BlueBanner(10).ID: return 8083;\n\t\t\tcase BlueBanner::BlueBanner(11).ID: return 8084;\n\t\t\tcase BlueBanner::BlueBanner(12).ID: return 8085;\n\t\t\tcase BlueBanner::BlueBanner(13).ID: return 8086;\n\t\t\tcase BlueBanner::BlueBanner(14).ID: return 8087;\n\t\t\tcase BlueBanner::BlueBanner(15).ID: return 8088;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Head).ID: return 1225;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, true, BlueBed::Part::Foot).ID: return 1226;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Head).ID: return 1227;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZM, false, BlueBed::Part::Foot).ID: return 1228;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Head).ID: return 1229;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, true, BlueBed::Part::Foot).ID: return 1230;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Head).ID: return 1231;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_ZP, false, BlueBed::Part::Foot).ID: return 1232;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Head).ID: return 1233;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, true, BlueBed::Part::Foot).ID: return 1234;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Head).ID: return 1235;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XM, false, BlueBed::Part::Foot).ID: return 1236;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Head).ID: return 1237;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, true, BlueBed::Part::Foot).ID: return 1238;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Head).ID: return 1239;\n\t\t\tcase BlueBed::BlueBed(eBlockFace::BLOCK_FACE_XP, false, BlueBed::Part::Foot).ID: return 1240;\n\t\t\tcase BlueCarpet::BlueCarpet().ID: return 7877;\n\t\t\tcase BlueConcrete::BlueConcrete().ID: return 9449;\n\t\t\tcase BlueConcretePowder::BlueConcretePowder().ID: return 9465;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9418;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9419;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9420;\n\t\t\tcase BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9421;\n\t\t\tcase BlueIce::BlueIce().ID: return 9648;\n\t\t\tcase BlueOrchid::BlueOrchid().ID: return 1414;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9344;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9345;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9346;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9347;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9348;\n\t\t\tcase BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9349;\n\t\t\tcase BlueStainedGlass::BlueStainedGlass().ID: return 4106;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, true).ID: return 7217;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, true, false).ID: return 7218;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, true).ID: return 7221;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, true, false, false).ID: return 7222;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, true).ID: return 7225;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, true, false).ID: return 7226;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, true).ID: return 7229;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(true, false, false, false).ID: return 7230;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, true).ID: return 7233;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, true, false).ID: return 7234;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, true).ID: return 7237;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, true, false, false).ID: return 7238;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, true).ID: return 7241;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, true, false).ID: return 7242;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, true).ID: return 7245;\n\t\t\tcase BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, false).ID: return 7246;\n\t\t\tcase BlueTerracotta::BlueTerracotta().ID: return 6858;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8197;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8198;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8199;\n\t\t\tcase BlueWallBanner::BlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8200;\n\t\t\tcase BlueWool::BlueWool().ID: return 1395;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::X).ID: return 9256;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Y).ID: return 9257;\n\t\t\tcase BoneBlock::BoneBlock(BoneBlock::Axis::Z).ID: return 9258;\n\t\t\tcase Bookshelf::Bookshelf().ID: return 1432;\n\t\t\tcase BrainCoral::BrainCoral().ID: return 9533;\n\t\t\tcase BrainCoralBlock::BrainCoralBlock().ID: return 9516;\n\t\t\tcase BrainCoralFan::BrainCoralFan().ID: return 9553;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9609;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9611;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9613;\n\t\t\tcase BrainCoralWallFan::BrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9615;\n\t\t\tcase BrewingStand::BrewingStand(true, true, true).ID: return 5133;\n\t\t\tcase BrewingStand::BrewingStand(true, true, false).ID: return 5134;\n\t\t\tcase BrewingStand::BrewingStand(true, false, true).ID: return 5135;\n\t\t\tcase BrewingStand::BrewingStand(true, false, false).ID: return 5136;\n\t\t\tcase BrewingStand::BrewingStand(false, true, true).ID: return 5137;\n\t\t\tcase BrewingStand::BrewingStand(false, true, false).ID: return 5138;\n\t\t\tcase BrewingStand::BrewingStand(false, false, true).ID: return 5139;\n\t\t\tcase BrewingStand::BrewingStand(false, false, false).ID: return 5140;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Top).ID: return 8373;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Bottom).ID: return 8375;\n\t\t\tcase BrickSlab::BrickSlab(BrickSlab::Type::Double).ID: return 8377;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4853;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4855;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4857;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4859;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4861;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4863;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4865;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4867;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4869;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4871;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4873;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4875;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4877;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4879;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4881;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4883;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4885;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4887;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4889;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4891;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4893;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4895;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4897;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4899;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4901;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4903;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4905;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4907;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4909;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4911;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::Straight).ID: return 4913;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerLeft).ID: return 4915;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::InnerRight).ID: return 4917;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterLeft).ID: return 4919;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::OuterRight).ID: return 4921;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight).ID: return 4923;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerLeft).ID: return 4925;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::InnerRight).ID: return 4927;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterLeft).ID: return 4929;\n\t\t\tcase BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::OuterRight).ID: return 4931;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::None).ID: return 10870;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10871;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 10872;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::None).ID: return 10876;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10877;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 10878;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10882;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10883;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 10884;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10888;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10889;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 10890;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 10894;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 10895;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 10896;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 10900;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 10901;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 10902;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::None).ID: return 10906;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10907;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 10908;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::None).ID: return 10912;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10913;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 10914;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10918;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10919;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 10920;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10924;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10925;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 10926;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 10930;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 10931;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 10932;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 10936;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 10937;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 10938;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::None).ID: return 10942;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10943;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 10944;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::None).ID: return 10948;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10949;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 10950;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10954;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10955;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 10956;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10960;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10961;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 10962;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 10966;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 10967;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 10968;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 10972;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 10973;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::None, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 10974;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::None).ID: return 10978;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Low).ID: return 10979;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 10980;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::None).ID: return 10984;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Low).ID: return 10985;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 10986;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::None).ID: return 10990;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 10991;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 10992;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::None).ID: return 10996;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 10997;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 10998;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 11002;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 11003;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 11004;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 11008;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 11009;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 11010;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::None).ID: return 11014;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Low).ID: return 11015;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 11016;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::None).ID: return 11020;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Low).ID: return 11021;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 11022;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::None).ID: return 11026;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 11027;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 11028;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::None).ID: return 11032;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 11033;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 11034;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 11038;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 11039;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 11040;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 11044;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 11045;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 11046;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::None).ID: return 11050;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::Low).ID: return 11051;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 11052;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::None).ID: return 11056;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::Low).ID: return 11057;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 11058;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::None).ID: return 11062;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 11063;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 11064;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::None).ID: return 11068;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 11069;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 11070;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 11074;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 11075;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 11076;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 11080;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 11081;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Low, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 11082;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::None).ID: return 11086;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Low).ID: return 11087;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 11088;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::None).ID: return 11092;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Low).ID: return 11093;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 11094;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::None).ID: return 11098;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 11099;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 11100;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::None).ID: return 11104;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 11105;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 11106;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 11110;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 11111;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 11112;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 11116;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 11117;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::None, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 11118;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::None).ID: return 11122;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Low).ID: return 11123;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 11124;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::None).ID: return 11128;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Low).ID: return 11129;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 11130;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::None).ID: return 11134;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 11135;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 11136;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::None).ID: return 11140;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 11141;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 11142;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 11146;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 11147;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 11148;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 11152;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 11153;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Low, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 11154;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::None).ID: return 11158;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::Low).ID: return 11159;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::None, true, BrickWall::West::Tall).ID: return 11160;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::None).ID: return 11164;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::Low).ID: return 11165;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::None, false, BrickWall::West::Tall).ID: return 11166;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::None).ID: return 11170;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::Low).ID: return 11171;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Low, true, BrickWall::West::Tall).ID: return 11172;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::None).ID: return 11176;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::Low).ID: return 11177;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Low, false, BrickWall::West::Tall).ID: return 11178;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::None).ID: return 11182;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::Low).ID: return 11183;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Tall, true, BrickWall::West::Tall).ID: return 11184;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::None).ID: return 11188;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::Low).ID: return 11189;\n\t\t\tcase BrickWall::BrickWall(BrickWall::East::Tall, BrickWall::North::Tall, BrickWall::South::Tall, false, BrickWall::West::Tall).ID: return 11190;\n\t\t\tcase Bricks::Bricks().ID: return 1429;\n\t\t\tcase BrownBanner::BrownBanner(0).ID: return 8089;\n\t\t\tcase BrownBanner::BrownBanner(1).ID: return 8090;\n\t\t\tcase BrownBanner::BrownBanner(2).ID: return 8091;\n\t\t\tcase BrownBanner::BrownBanner(3).ID: return 8092;\n\t\t\tcase BrownBanner::BrownBanner(4).ID: return 8093;\n\t\t\tcase BrownBanner::BrownBanner(5).ID: return 8094;\n\t\t\tcase BrownBanner::BrownBanner(6).ID: return 8095;\n\t\t\tcase BrownBanner::BrownBanner(7).ID: return 8096;\n\t\t\tcase BrownBanner::BrownBanner(8).ID: return 8097;\n\t\t\tcase BrownBanner::BrownBanner(9).ID: return 8098;\n\t\t\tcase BrownBanner::BrownBanner(10).ID: return 8099;\n\t\t\tcase BrownBanner::BrownBanner(11).ID: return 8100;\n\t\t\tcase BrownBanner::BrownBanner(12).ID: return 8101;\n\t\t\tcase BrownBanner::BrownBanner(13).ID: return 8102;\n\t\t\tcase BrownBanner::BrownBanner(14).ID: return 8103;\n\t\t\tcase BrownBanner::BrownBanner(15).ID: return 8104;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Head).ID: return 1241;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, true, BrownBed::Part::Foot).ID: return 1242;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Head).ID: return 1243;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZM, false, BrownBed::Part::Foot).ID: return 1244;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Head).ID: return 1245;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, true, BrownBed::Part::Foot).ID: return 1246;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Head).ID: return 1247;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_ZP, false, BrownBed::Part::Foot).ID: return 1248;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Head).ID: return 1249;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, true, BrownBed::Part::Foot).ID: return 1250;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Head).ID: return 1251;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XM, false, BrownBed::Part::Foot).ID: return 1252;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Head).ID: return 1253;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, true, BrownBed::Part::Foot).ID: return 1254;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Head).ID: return 1255;\n\t\t\tcase BrownBed::BrownBed(eBlockFace::BLOCK_FACE_XP, false, BrownBed::Part::Foot).ID: return 1256;\n\t\t\tcase BrownCarpet::BrownCarpet().ID: return 7878;\n\t\t\tcase BrownConcrete::BrownConcrete().ID: return 9450;\n\t\t\tcase BrownConcretePowder::BrownConcretePowder().ID: return 9466;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9422;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9423;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9424;\n\t\t\tcase BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9425;\n\t\t\tcase BrownMushroom::BrownMushroom().ID: return 1425;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, true).ID: return 4505;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, false).ID: return 4506;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, true).ID: return 4507;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, false, false).ID: return 4508;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, true).ID: return 4509;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, true, false).ID: return 4510;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, true).ID: return 4511;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, true, false, false, false).ID: return 4512;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, true).ID: return 4513;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, true, false).ID: return 4514;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, true).ID: return 4515;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, true, false, false).ID: return 4516;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, true).ID: return 4517;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, true, false).ID: return 4518;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, true).ID: return 4519;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, true, false, false, false, false).ID: return 4520;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, true).ID: return 4521;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, true, false).ID: return 4522;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, true).ID: return 4523;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, true, false, false).ID: return 4524;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, true).ID: return 4525;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, true, false).ID: return 4526;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, true).ID: return 4527;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, true, false, false, false).ID: return 4528;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, true).ID: return 4529;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, true, false).ID: return 4530;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, true).ID: return 4531;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, true, false, false).ID: return 4532;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, true).ID: return 4533;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, true, false).ID: return 4534;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, true).ID: return 4535;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(true, false, false, false, false, false).ID: return 4536;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, true).ID: return 4537;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, true, false).ID: return 4538;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, true).ID: return 4539;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, true, false, false).ID: return 4540;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, true).ID: return 4541;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, false).ID: return 4542;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, true).ID: return 4543;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, false, false).ID: return 4544;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, true).ID: return 4545;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, false).ID: return 4546;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, true).ID: return 4547;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, false, false).ID: return 4548;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, true).ID: return 4549;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, false).ID: return 4550;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, true).ID: return 4551;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, false, false).ID: return 4552;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, true).ID: return 4553;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, true, false).ID: return 4554;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, true).ID: return 4555;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, true, false, false).ID: return 4556;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, true).ID: return 4557;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, false).ID: return 4558;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, true).ID: return 4559;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, false, false).ID: return 4560;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, true).ID: return 4561;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, false).ID: return 4562;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, true).ID: return 4563;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, false, false).ID: return 4564;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, true).ID: return 4565;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, false).ID: return 4566;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, true).ID: return 4567;\n\t\t\tcase BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false).ID: return 4568;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9350;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9351;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9352;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9353;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9354;\n\t\t\tcase BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9355;\n\t\t\tcase BrownStainedGlass::BrownStainedGlass().ID: return 4107;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, true).ID: return 7249;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, true, false).ID: return 7250;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, true).ID: return 7253;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, true, false, false).ID: return 7254;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, true).ID: return 7257;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, true, false).ID: return 7258;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, true).ID: return 7261;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(true, false, false, false).ID: return 7262;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, true).ID: return 7265;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, true, false).ID: return 7266;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, true).ID: return 7269;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, true, false, false).ID: return 7270;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, true).ID: return 7273;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, true, false).ID: return 7274;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, true).ID: return 7277;\n\t\t\tcase BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, false).ID: return 7278;\n\t\t\tcase BrownTerracotta::BrownTerracotta().ID: return 6859;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8201;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8202;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8203;\n\t\t\tcase BrownWallBanner::BrownWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8204;\n\t\t\tcase BrownWool::BrownWool().ID: return 1396;\n\t\t\tcase BubbleColumn::BubbleColumn(true).ID: return 9667;\n\t\t\tcase BubbleColumn::BubbleColumn(false).ID: return 9668;\n\t\t\tcase BubbleCoral::BubbleCoral().ID: return 9535;\n\t\t\tcase BubbleCoralBlock::BubbleCoralBlock().ID: return 9517;\n\t\t\tcase BubbleCoralFan::BubbleCoralFan().ID: return 9555;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9617;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9619;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9621;\n\t\t\tcase BubbleCoralWallFan::BubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9623;\n\t\t\tcase Cactus::Cactus(0).ID: return 3931;\n\t\t\tcase Cactus::Cactus(1).ID: return 3932;\n\t\t\tcase Cactus::Cactus(2).ID: return 3933;\n\t\t\tcase Cactus::Cactus(3).ID: return 3934;\n\t\t\tcase Cactus::Cactus(4).ID: return 3935;\n\t\t\tcase Cactus::Cactus(5).ID: return 3936;\n\t\t\tcase Cactus::Cactus(6).ID: return 3937;\n\t\t\tcase Cactus::Cactus(7).ID: return 3938;\n\t\t\tcase Cactus::Cactus(8).ID: return 3939;\n\t\t\tcase Cactus::Cactus(9).ID: return 3940;\n\t\t\tcase Cactus::Cactus(10).ID: return 3941;\n\t\t\tcase Cactus::Cactus(11).ID: return 3942;\n\t\t\tcase Cactus::Cactus(12).ID: return 3943;\n\t\t\tcase Cactus::Cactus(13).ID: return 3944;\n\t\t\tcase Cactus::Cactus(14).ID: return 3945;\n\t\t\tcase Cactus::Cactus(15).ID: return 3946;\n\t\t\tcase Cake::Cake(0).ID: return 4024;\n\t\t\tcase Cake::Cake(1).ID: return 4025;\n\t\t\tcase Cake::Cake(2).ID: return 4026;\n\t\t\tcase Cake::Cake(3).ID: return 4027;\n\t\t\tcase Cake::Cake(4).ID: return 4028;\n\t\t\tcase Cake::Cake(5).ID: return 4029;\n\t\t\tcase Cake::Cake(6).ID: return 4030;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 14891;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 14893;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 14895;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 14897;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 14899;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 14901;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 14903;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 14905;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, true, true).ID: return 14907;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, true, false).ID: return 14909;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, false, true).ID: return 14911;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XM, false, false).ID: return 14913;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, true, true).ID: return 14915;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, true, false).ID: return 14917;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, false, true).ID: return 14919;\n\t\t\tcase Campfire::Campfire(eBlockFace::BLOCK_FACE_XP, false, false).ID: return 14921;\n\t\t\tcase Carrots::Carrots(0).ID: return 6330;\n\t\t\tcase Carrots::Carrots(1).ID: return 6331;\n\t\t\tcase Carrots::Carrots(2).ID: return 6332;\n\t\t\tcase Carrots::Carrots(3).ID: return 6333;\n\t\t\tcase Carrots::Carrots(4).ID: return 6334;\n\t\t\tcase Carrots::Carrots(5).ID: return 6335;\n\t\t\tcase Carrots::Carrots(6).ID: return 6336;\n\t\t\tcase Carrots::Carrots(7).ID: return 6337;\n\t\t\tcase CartographyTable::CartographyTable().ID: return 14819;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZM).ID: return 4016;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZP).ID: return 4017;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XM).ID: return 4018;\n\t\t\tcase CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XP).ID: return 4019;\n\t\t\tcase Cauldron::Cauldron(0).ID: return 5141;\n\t\t\tcase Cauldron::Cauldron(1).ID: return 5142;\n\t\t\tcase Cauldron::Cauldron(2).ID: return 5143;\n\t\t\tcase Cauldron::Cauldron(3).ID: return 5144;\n\t\t\tcase CaveAir::CaveAir().ID: return 9666;\n\t\t\tcase Chain::Chain().ID: return 4730;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 9237;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 9238;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 9239;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 9240;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 9241;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 9242;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 9243;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 9244;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 9245;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 9246;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 9247;\n\t\t\tcase ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 9248;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Single).ID: return 2035;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Left).ID: return 2037;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Right).ID: return 2039;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Single).ID: return 2041;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Left).ID: return 2043;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Right).ID: return 2045;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Single).ID: return 2047;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Left).ID: return 2049;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Right).ID: return 2051;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Single).ID: return 2053;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Left).ID: return 2055;\n\t\t\tcase Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Right).ID: return 2057;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6614;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6615;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 6616;\n\t\t\tcase ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 6617;\n\t\t\tcase ChiseledNetherBricks::ChiseledNetherBricks().ID: return 17101;\n\t\t\tcase ChiseledPolishedBlackstone::ChiseledPolishedBlackstone().ID: return 16253;\n\t\t\tcase ChiseledQuartzBlock::ChiseledQuartzBlock().ID: return 6739;\n\t\t\tcase ChiseledRedSandstone::ChiseledRedSandstone().ID: return 8218;\n\t\t\tcase ChiseledSandstone::ChiseledSandstone().ID: return 247;\n\t\t\tcase ChiseledStoneBricks::ChiseledStoneBricks().ID: return 4498;\n\t\t\tcase ChorusFlower::ChorusFlower(0).ID: return 9128;\n\t\t\tcase ChorusFlower::ChorusFlower(1).ID: return 9129;\n\t\t\tcase ChorusFlower::ChorusFlower(2).ID: return 9130;\n\t\t\tcase ChorusFlower::ChorusFlower(3).ID: return 9131;\n\t\t\tcase ChorusFlower::ChorusFlower(4).ID: return 9132;\n\t\t\tcase ChorusFlower::ChorusFlower(5).ID: return 9133;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, true).ID: return 9064;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, true, false).ID: return 9065;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, true).ID: return 9066;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, true, false, false).ID: return 9067;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, true).ID: return 9068;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, true, false).ID: return 9069;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, true).ID: return 9070;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, true, false, false, false).ID: return 9071;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, true).ID: return 9072;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, true, false).ID: return 9073;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, true).ID: return 9074;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, true, false, false).ID: return 9075;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, true).ID: return 9076;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, true, false).ID: return 9077;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, true).ID: return 9078;\n\t\t\tcase ChorusPlant::ChorusPlant(true, true, false, false, false, false).ID: return 9079;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, true).ID: return 9080;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, true, false).ID: return 9081;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, true).ID: return 9082;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, true, false, false).ID: return 9083;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, true).ID: return 9084;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, true, false).ID: return 9085;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, true).ID: return 9086;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, true, false, false, false).ID: return 9087;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, true).ID: return 9088;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, true, false).ID: return 9089;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, true).ID: return 9090;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, true, false, false).ID: return 9091;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, true).ID: return 9092;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, true, false).ID: return 9093;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, true).ID: return 9094;\n\t\t\tcase ChorusPlant::ChorusPlant(true, false, false, false, false, false).ID: return 9095;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, true).ID: return 9096;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, true, false).ID: return 9097;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, true).ID: return 9098;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, true, false, false).ID: return 9099;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, true).ID: return 9100;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, true, false).ID: return 9101;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, true).ID: return 9102;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, true, false, false, false).ID: return 9103;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, true).ID: return 9104;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, true, false).ID: return 9105;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, true).ID: return 9106;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, true, false, false).ID: return 9107;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, true).ID: return 9108;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, true, false).ID: return 9109;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, true).ID: return 9110;\n\t\t\tcase ChorusPlant::ChorusPlant(false, true, false, false, false, false).ID: return 9111;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, true).ID: return 9112;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, true, false).ID: return 9113;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, true).ID: return 9114;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, true, false, false).ID: return 9115;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, true).ID: return 9116;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, true, false).ID: return 9117;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, true).ID: return 9118;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, true, false, false, false).ID: return 9119;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, true).ID: return 9120;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, true, false).ID: return 9121;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, true).ID: return 9122;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, true, false, false).ID: return 9123;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, true).ID: return 9124;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, true, false).ID: return 9125;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, true).ID: return 9126;\n\t\t\tcase ChorusPlant::ChorusPlant(false, false, false, false, false, false).ID: return 9127;\n\t\t\tcase Clay::Clay().ID: return 3947;\n\t\t\tcase CoalBlock::CoalBlock().ID: return 7883;\n\t\t\tcase CoalOre::CoalOre().ID: return 71;\n\t\t\tcase CoarseDirt::CoarseDirt().ID: return 11;\n\t\t\tcase Cobblestone::Cobblestone().ID: return 14;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Top).ID: return 8367;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Bottom).ID: return 8369;\n\t\t\tcase CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Double).ID: return 8371;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3656;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3658;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3660;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3662;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3664;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3666;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3668;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3670;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3672;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3674;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3676;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3678;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3680;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3682;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3684;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3686;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3688;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3690;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3692;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3694;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3696;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3698;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3700;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3702;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3704;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3706;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3708;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3710;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3712;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3714;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight).ID: return 3716;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerLeft).ID: return 3718;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::InnerRight).ID: return 3720;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterLeft).ID: return 3722;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::OuterRight).ID: return 3724;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight).ID: return 3726;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerLeft).ID: return 3728;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::InnerRight).ID: return 3730;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterLeft).ID: return 3732;\n\t\t\tcase CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::OuterRight).ID: return 3734;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5660;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5661;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5662;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5666;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5667;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5668;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5672;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5673;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5674;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5678;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5679;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5680;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5684;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5685;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5686;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5690;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5691;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5692;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5696;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5697;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5698;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5702;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5703;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5704;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5708;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5709;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5710;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5714;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5715;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5716;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5720;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5721;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5722;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5726;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5727;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5728;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5732;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5733;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5734;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5738;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5739;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5740;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5744;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5745;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5746;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5750;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5751;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5752;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5756;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5757;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5758;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5762;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5763;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5764;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5768;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5769;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5770;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5774;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5775;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5776;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5780;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5781;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5782;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5786;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5787;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5788;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5792;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5793;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5794;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5798;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5799;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5800;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5804;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5805;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5806;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5810;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5811;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5812;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5816;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5817;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5818;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5822;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5823;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5824;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5828;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5829;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5830;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5834;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5835;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5836;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5840;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5841;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5842;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5846;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5847;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5848;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5852;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5853;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5854;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5858;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5859;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5860;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5864;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5865;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5866;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5870;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5871;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Low, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5872;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5876;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5877;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5878;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5882;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5883;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5884;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5888;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5889;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5890;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5894;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5895;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5896;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5900;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5901;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5902;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5906;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5907;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::None, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5908;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5912;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5913;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5914;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5918;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5919;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5920;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5924;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5925;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5926;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5930;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5931;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5932;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5936;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5937;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5938;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5942;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5943;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Low, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5944;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::None).ID: return 5948;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::Low).ID: return 5949;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::None, true, CobblestoneWall::West::Tall).ID: return 5950;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::None).ID: return 5954;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::Low).ID: return 5955;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::None, false, CobblestoneWall::West::Tall).ID: return 5956;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::None).ID: return 5960;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::Low).ID: return 5961;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, true, CobblestoneWall::West::Tall).ID: return 5962;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::None).ID: return 5966;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::Low).ID: return 5967;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Low, false, CobblestoneWall::West::Tall).ID: return 5968;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::None).ID: return 5972;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Low).ID: return 5973;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, true, CobblestoneWall::West::Tall).ID: return 5974;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::None).ID: return 5978;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Low).ID: return 5979;\n\t\t\tcase CobblestoneWall::CobblestoneWall(CobblestoneWall::East::Tall, CobblestoneWall::North::Tall, CobblestoneWall::South::Tall, false, CobblestoneWall::West::Tall).ID: return 5980;\n\t\t\tcase Cobweb::Cobweb().ID: return 1341;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZM).ID: return 5158;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZP).ID: return 5159;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XM).ID: return 5160;\n\t\t\tcase Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XP).ID: return 5161;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZM).ID: return 5162;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZP).ID: return 5163;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XM).ID: return 5164;\n\t\t\tcase Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XP).ID: return 5165;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZM).ID: return 5166;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZP).ID: return 5167;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XM).ID: return 5168;\n\t\t\tcase Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XP).ID: return 5169;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5644;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 5645;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5646;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 5647;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 5648;\n\t\t\tcase CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 5649;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5650;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 5651;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5652;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 5653;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 5654;\n\t\t\tcase CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 5655;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, true).ID: return 6678;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, false).ID: return 6679;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, true).ID: return 6680;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, false).ID: return 6681;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, true).ID: return 6682;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, false).ID: return 6683;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, true).ID: return 6684;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, false).ID: return 6685;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, true).ID: return 6686;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, false).ID: return 6687;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, true).ID: return 6688;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, false).ID: return 6689;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, true).ID: return 6690;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, false).ID: return 6691;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, true).ID: return 6692;\n\t\t\tcase Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, false).ID: return 6693;\n\t\t\tcase Composter::Composter(0).ID: return 15751;\n\t\t\tcase Composter::Composter(1).ID: return 15752;\n\t\t\tcase Composter::Composter(2).ID: return 15753;\n\t\t\tcase Composter::Composter(3).ID: return 15754;\n\t\t\tcase Composter::Composter(4).ID: return 15755;\n\t\t\tcase Composter::Composter(5).ID: return 15756;\n\t\t\tcase Composter::Composter(6).ID: return 15757;\n\t\t\tcase Composter::Composter(7).ID: return 15758;\n\t\t\tcase Composter::Composter(8).ID: return 15759;\n\t\t\tcase Conduit::Conduit().ID: return 9650;\n\t\t\tcase Cornflower::Cornflower().ID: return 1422;\n\t\t\tcase CrackedNetherBricks::CrackedNetherBricks().ID: return 17102;\n\t\t\tcase CrackedPolishedBlackstoneBricks::CrackedPolishedBlackstoneBricks().ID: return 16252;\n\t\t\tcase CrackedStoneBricks::CrackedStoneBricks().ID: return 4497;\n\t\t\tcase CraftingTable::CraftingTable().ID: return 3356;\n\t\t\tcase CreeperHead::CreeperHead(0).ID: return 6570;\n\t\t\tcase CreeperHead::CreeperHead(1).ID: return 6571;\n\t\t\tcase CreeperHead::CreeperHead(2).ID: return 6572;\n\t\t\tcase CreeperHead::CreeperHead(3).ID: return 6573;\n\t\t\tcase CreeperHead::CreeperHead(4).ID: return 6574;\n\t\t\tcase CreeperHead::CreeperHead(5).ID: return 6575;\n\t\t\tcase CreeperHead::CreeperHead(6).ID: return 6576;\n\t\t\tcase CreeperHead::CreeperHead(7).ID: return 6577;\n\t\t\tcase CreeperHead::CreeperHead(8).ID: return 6578;\n\t\t\tcase CreeperHead::CreeperHead(9).ID: return 6579;\n\t\t\tcase CreeperHead::CreeperHead(10).ID: return 6580;\n\t\t\tcase CreeperHead::CreeperHead(11).ID: return 6581;\n\t\t\tcase CreeperHead::CreeperHead(12).ID: return 6582;\n\t\t\tcase CreeperHead::CreeperHead(13).ID: return 6583;\n\t\t\tcase CreeperHead::CreeperHead(14).ID: return 6584;\n\t\t\tcase CreeperHead::CreeperHead(15).ID: return 6585;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6586;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6587;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6588;\n\t\t\tcase CreeperWallHead::CreeperWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6589;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 15479;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 15480;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 15481;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 15482;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 15483;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 15484;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 15485;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 15486;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 15487;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 15488;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 15489;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 15490;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 15491;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 15492;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 15493;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 15494;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 15495;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 15496;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 15497;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 15498;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 15499;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 15500;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 15501;\n\t\t\tcase CrimsonButton::CrimsonButton(CrimsonButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 15502;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, true, true).ID: return 15527;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, true, false).ID: return 15528;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, false, true).ID: return 15529;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, false, false).ID: return 15530;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, true, true).ID: return 15531;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, true, false).ID: return 15532;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, false, true).ID: return 15533;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, false, false).ID: return 15534;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, true, true).ID: return 15535;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, true, false).ID: return 15536;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, false, true).ID: return 15537;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, false, false).ID: return 15538;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, true, true).ID: return 15539;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, true, false).ID: return 15540;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, false, true).ID: return 15541;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, false, false).ID: return 15542;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, true, true).ID: return 15543;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, true, false).ID: return 15544;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, false, true).ID: return 15545;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, false, false).ID: return 15546;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, true, true).ID: return 15547;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, true, false).ID: return 15548;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, false, true).ID: return 15549;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, false, false).ID: return 15550;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, true, true).ID: return 15551;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, true, false).ID: return 15552;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, false, true).ID: return 15553;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, false, false).ID: return 15554;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, true, true).ID: return 15555;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, true, false).ID: return 15556;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, false, true).ID: return 15557;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_ZP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, false, false).ID: return 15558;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, true, true).ID: return 15559;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, true, false).ID: return 15560;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, false, true).ID: return 15561;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, false, false).ID: return 15562;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, true, true).ID: return 15563;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, true, false).ID: return 15564;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, false, true).ID: return 15565;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, false, false).ID: return 15566;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, true, true).ID: return 15567;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, true, false).ID: return 15568;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, false, true).ID: return 15569;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, false, false).ID: return 15570;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, true, true).ID: return 15571;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, true, false).ID: return 15572;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, false, true).ID: return 15573;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XM, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, false, false).ID: return 15574;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, true, true).ID: return 15575;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, true, false).ID: return 15576;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, false, true).ID: return 15577;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Left, false, false).ID: return 15578;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, true, true).ID: return 15579;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, true, false).ID: return 15580;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, false, true).ID: return 15581;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Upper, CrimsonDoor::Hinge::Right, false, false).ID: return 15582;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, true, true).ID: return 15583;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, true, false).ID: return 15584;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, false, true).ID: return 15585;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Left, false, false).ID: return 15586;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, true, true).ID: return 15587;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, true, false).ID: return 15588;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, false, true).ID: return 15589;\n\t\t\tcase CrimsonDoor::CrimsonDoor(eBlockFace::BLOCK_FACE_XP, CrimsonDoor::Half::Lower, CrimsonDoor::Hinge::Right, false, false).ID: return 15590;\n\t\t\tcase CrimsonFence::CrimsonFence(true, true, true, true).ID: return 15065;\n\t\t\tcase CrimsonFence::CrimsonFence(true, true, true, false).ID: return 15066;\n\t\t\tcase CrimsonFence::CrimsonFence(true, true, false, true).ID: return 15069;\n\t\t\tcase CrimsonFence::CrimsonFence(true, true, false, false).ID: return 15070;\n\t\t\tcase CrimsonFence::CrimsonFence(true, false, true, true).ID: return 15073;\n\t\t\tcase CrimsonFence::CrimsonFence(true, false, true, false).ID: return 15074;\n\t\t\tcase CrimsonFence::CrimsonFence(true, false, false, true).ID: return 15077;\n\t\t\tcase CrimsonFence::CrimsonFence(true, false, false, false).ID: return 15078;\n\t\t\tcase CrimsonFence::CrimsonFence(false, true, true, true).ID: return 15081;\n\t\t\tcase CrimsonFence::CrimsonFence(false, true, true, false).ID: return 15082;\n\t\t\tcase CrimsonFence::CrimsonFence(false, true, false, true).ID: return 15085;\n\t\t\tcase CrimsonFence::CrimsonFence(false, true, false, false).ID: return 15086;\n\t\t\tcase CrimsonFence::CrimsonFence(false, false, true, true).ID: return 15089;\n\t\t\tcase CrimsonFence::CrimsonFence(false, false, true, false).ID: return 15090;\n\t\t\tcase CrimsonFence::CrimsonFence(false, false, false, true).ID: return 15093;\n\t\t\tcase CrimsonFence::CrimsonFence(false, false, false, false).ID: return 15094;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 15255;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 15256;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 15257;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 15258;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 15259;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 15260;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 15261;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 15262;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 15263;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 15264;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 15265;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 15266;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 15267;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 15268;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 15269;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 15270;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 15271;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 15272;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 15273;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 15274;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 15275;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 15276;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 15277;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 15278;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 15279;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 15280;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 15281;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 15282;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 15283;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 15284;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 15285;\n\t\t\tcase CrimsonFenceGate::CrimsonFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 15286;\n\t\t\tcase CrimsonFungus::CrimsonFungus().ID: return 14988;\n\t\t\tcase CrimsonHyphae::CrimsonHyphae(CrimsonHyphae::Axis::X).ID: return 14981;\n\t\t\tcase CrimsonHyphae::CrimsonHyphae(CrimsonHyphae::Axis::Y).ID: return 14982;\n\t\t\tcase CrimsonHyphae::CrimsonHyphae(CrimsonHyphae::Axis::Z).ID: return 14983;\n\t\t\tcase CrimsonNylium::CrimsonNylium().ID: return 14987;\n\t\t\tcase CrimsonPlanks::CrimsonPlanks().ID: return 15045;\n\t\t\tcase CrimsonPressurePlate::CrimsonPressurePlate(true).ID: return 15059;\n\t\t\tcase CrimsonPressurePlate::CrimsonPressurePlate(false).ID: return 15060;\n\t\t\tcase CrimsonRoots::CrimsonRoots().ID: return 15044;\n\t\t\tcase CrimsonSign::CrimsonSign(0).ID: return 15656;\n\t\t\tcase CrimsonSign::CrimsonSign(1).ID: return 15658;\n\t\t\tcase CrimsonSign::CrimsonSign(2).ID: return 15660;\n\t\t\tcase CrimsonSign::CrimsonSign(3).ID: return 15662;\n\t\t\tcase CrimsonSign::CrimsonSign(4).ID: return 15664;\n\t\t\tcase CrimsonSign::CrimsonSign(5).ID: return 15666;\n\t\t\tcase CrimsonSign::CrimsonSign(6).ID: return 15668;\n\t\t\tcase CrimsonSign::CrimsonSign(7).ID: return 15670;\n\t\t\tcase CrimsonSign::CrimsonSign(8).ID: return 15672;\n\t\t\tcase CrimsonSign::CrimsonSign(9).ID: return 15674;\n\t\t\tcase CrimsonSign::CrimsonSign(10).ID: return 15676;\n\t\t\tcase CrimsonSign::CrimsonSign(11).ID: return 15678;\n\t\t\tcase CrimsonSign::CrimsonSign(12).ID: return 15680;\n\t\t\tcase CrimsonSign::CrimsonSign(13).ID: return 15682;\n\t\t\tcase CrimsonSign::CrimsonSign(14).ID: return 15684;\n\t\t\tcase CrimsonSign::CrimsonSign(15).ID: return 15686;\n\t\t\tcase CrimsonSlab::CrimsonSlab(CrimsonSlab::Type::Top).ID: return 15048;\n\t\t\tcase CrimsonSlab::CrimsonSlab(CrimsonSlab::Type::Bottom).ID: return 15050;\n\t\t\tcase CrimsonSlab::CrimsonSlab(CrimsonSlab::Type::Double).ID: return 15052;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::Straight).ID: return 15320;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::InnerLeft).ID: return 15322;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::InnerRight).ID: return 15324;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::OuterLeft).ID: return 15326;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::OuterRight).ID: return 15328;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::Straight).ID: return 15330;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::InnerLeft).ID: return 15332;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::InnerRight).ID: return 15334;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::OuterLeft).ID: return 15336;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::OuterRight).ID: return 15338;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::Straight).ID: return 15340;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::InnerLeft).ID: return 15342;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::InnerRight).ID: return 15344;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::OuterLeft).ID: return 15346;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::OuterRight).ID: return 15348;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::Straight).ID: return 15350;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::InnerLeft).ID: return 15352;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::InnerRight).ID: return 15354;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::OuterLeft).ID: return 15356;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_ZP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::OuterRight).ID: return 15358;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::Straight).ID: return 15360;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::InnerLeft).ID: return 15362;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::InnerRight).ID: return 15364;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::OuterLeft).ID: return 15366;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Top, CrimsonStairs::Shape::OuterRight).ID: return 15368;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::Straight).ID: return 15370;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::InnerLeft).ID: return 15372;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::InnerRight).ID: return 15374;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::OuterLeft).ID: return 15376;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XM, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::OuterRight).ID: return 15378;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::Straight).ID: return 15380;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::InnerLeft).ID: return 15382;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::InnerRight).ID: return 15384;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::OuterLeft).ID: return 15386;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Top, CrimsonStairs::Shape::OuterRight).ID: return 15388;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::Straight).ID: return 15390;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::InnerLeft).ID: return 15392;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::InnerRight).ID: return 15394;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::OuterLeft).ID: return 15396;\n\t\t\tcase CrimsonStairs::CrimsonStairs(eBlockFace::BLOCK_FACE_XP, CrimsonStairs::Half::Bottom, CrimsonStairs::Shape::OuterRight).ID: return 15398;\n\t\t\tcase CrimsonStem::CrimsonStem(CrimsonStem::Axis::X).ID: return 14975;\n\t\t\tcase CrimsonStem::CrimsonStem(CrimsonStem::Axis::Y).ID: return 14976;\n\t\t\tcase CrimsonStem::CrimsonStem(CrimsonStem::Axis::Z).ID: return 14977;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZM, CrimsonTrapdoor::Half::Top, true, true).ID: return 15128;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZM, CrimsonTrapdoor::Half::Top, true, false).ID: return 15130;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZM, CrimsonTrapdoor::Half::Top, false, true).ID: return 15132;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZM, CrimsonTrapdoor::Half::Top, false, false).ID: return 15134;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZM, CrimsonTrapdoor::Half::Bottom, true, true).ID: return 15136;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZM, CrimsonTrapdoor::Half::Bottom, true, false).ID: return 15138;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZM, CrimsonTrapdoor::Half::Bottom, false, true).ID: return 15140;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZM, CrimsonTrapdoor::Half::Bottom, false, false).ID: return 15142;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZP, CrimsonTrapdoor::Half::Top, true, true).ID: return 15144;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZP, CrimsonTrapdoor::Half::Top, true, false).ID: return 15146;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZP, CrimsonTrapdoor::Half::Top, false, true).ID: return 15148;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZP, CrimsonTrapdoor::Half::Top, false, false).ID: return 15150;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZP, CrimsonTrapdoor::Half::Bottom, true, true).ID: return 15152;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZP, CrimsonTrapdoor::Half::Bottom, true, false).ID: return 15154;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZP, CrimsonTrapdoor::Half::Bottom, false, true).ID: return 15156;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_ZP, CrimsonTrapdoor::Half::Bottom, false, false).ID: return 15158;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XM, CrimsonTrapdoor::Half::Top, true, true).ID: return 15160;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XM, CrimsonTrapdoor::Half::Top, true, false).ID: return 15162;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XM, CrimsonTrapdoor::Half::Top, false, true).ID: return 15164;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XM, CrimsonTrapdoor::Half::Top, false, false).ID: return 15166;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XM, CrimsonTrapdoor::Half::Bottom, true, true).ID: return 15168;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XM, CrimsonTrapdoor::Half::Bottom, true, false).ID: return 15170;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XM, CrimsonTrapdoor::Half::Bottom, false, true).ID: return 15172;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XM, CrimsonTrapdoor::Half::Bottom, false, false).ID: return 15174;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XP, CrimsonTrapdoor::Half::Top, true, true).ID: return 15176;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XP, CrimsonTrapdoor::Half::Top, true, false).ID: return 15178;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XP, CrimsonTrapdoor::Half::Top, false, true).ID: return 15180;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XP, CrimsonTrapdoor::Half::Top, false, false).ID: return 15182;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XP, CrimsonTrapdoor::Half::Bottom, true, true).ID: return 15184;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XP, CrimsonTrapdoor::Half::Bottom, true, false).ID: return 15186;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XP, CrimsonTrapdoor::Half::Bottom, false, true).ID: return 15188;\n\t\t\tcase CrimsonTrapdoor::CrimsonTrapdoor(eBlockFace::BLOCK_FACE_XP, CrimsonTrapdoor::Half::Bottom, false, false).ID: return 15190;\n\t\t\tcase CrimsonWallSign::CrimsonWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 15720;\n\t\t\tcase CrimsonWallSign::CrimsonWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 15722;\n\t\t\tcase CrimsonWallSign::CrimsonWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 15724;\n\t\t\tcase CrimsonWallSign::CrimsonWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 15726;\n\t\t\tcase CryingObsidian::CryingObsidian().ID: return 15828;\n\t\t\tcase CutRedSandstone::CutRedSandstone().ID: return 8219;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Top).ID: return 8403;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Bottom).ID: return 8405;\n\t\t\tcase CutRedSandstoneSlab::CutRedSandstoneSlab(CutRedSandstoneSlab::Type::Double).ID: return 8407;\n\t\t\tcase CutSandstone::CutSandstone().ID: return 248;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Top).ID: return 8355;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Bottom).ID: return 8357;\n\t\t\tcase CutSandstoneSlab::CutSandstoneSlab(CutSandstoneSlab::Type::Double).ID: return 8359;\n\t\t\tcase CyanBanner::CyanBanner(0).ID: return 8041;\n\t\t\tcase CyanBanner::CyanBanner(1).ID: return 8042;\n\t\t\tcase CyanBanner::CyanBanner(2).ID: return 8043;\n\t\t\tcase CyanBanner::CyanBanner(3).ID: return 8044;\n\t\t\tcase CyanBanner::CyanBanner(4).ID: return 8045;\n\t\t\tcase CyanBanner::CyanBanner(5).ID: return 8046;\n\t\t\tcase CyanBanner::CyanBanner(6).ID: return 8047;\n\t\t\tcase CyanBanner::CyanBanner(7).ID: return 8048;\n\t\t\tcase CyanBanner::CyanBanner(8).ID: return 8049;\n\t\t\tcase CyanBanner::CyanBanner(9).ID: return 8050;\n\t\t\tcase CyanBanner::CyanBanner(10).ID: return 8051;\n\t\t\tcase CyanBanner::CyanBanner(11).ID: return 8052;\n\t\t\tcase CyanBanner::CyanBanner(12).ID: return 8053;\n\t\t\tcase CyanBanner::CyanBanner(13).ID: return 8054;\n\t\t\tcase CyanBanner::CyanBanner(14).ID: return 8055;\n\t\t\tcase CyanBanner::CyanBanner(15).ID: return 8056;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Head).ID: return 1193;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, true, CyanBed::Part::Foot).ID: return 1194;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Head).ID: return 1195;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZM, false, CyanBed::Part::Foot).ID: return 1196;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Head).ID: return 1197;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, true, CyanBed::Part::Foot).ID: return 1198;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Head).ID: return 1199;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_ZP, false, CyanBed::Part::Foot).ID: return 1200;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Head).ID: return 1201;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, true, CyanBed::Part::Foot).ID: return 1202;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Head).ID: return 1203;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XM, false, CyanBed::Part::Foot).ID: return 1204;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Head).ID: return 1205;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, true, CyanBed::Part::Foot).ID: return 1206;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Head).ID: return 1207;\n\t\t\tcase CyanBed::CyanBed(eBlockFace::BLOCK_FACE_XP, false, CyanBed::Part::Foot).ID: return 1208;\n\t\t\tcase CyanCarpet::CyanCarpet().ID: return 7875;\n\t\t\tcase CyanConcrete::CyanConcrete().ID: return 9447;\n\t\t\tcase CyanConcretePowder::CyanConcretePowder().ID: return 9463;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9410;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9411;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9412;\n\t\t\tcase CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9413;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9332;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9333;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9334;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9335;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9336;\n\t\t\tcase CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9337;\n\t\t\tcase CyanStainedGlass::CyanStainedGlass().ID: return 4104;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, true).ID: return 7153;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, true, false).ID: return 7154;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, true).ID: return 7157;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, true, false, false).ID: return 7158;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, true).ID: return 7161;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, true, false).ID: return 7162;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, true).ID: return 7165;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(true, false, false, false).ID: return 7166;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, true).ID: return 7169;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, true, false).ID: return 7170;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, true).ID: return 7173;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, true, false, false).ID: return 7174;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, true).ID: return 7177;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, true, false).ID: return 7178;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, true).ID: return 7181;\n\t\t\tcase CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, false).ID: return 7182;\n\t\t\tcase CyanTerracotta::CyanTerracotta().ID: return 6856;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8189;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8190;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8191;\n\t\t\tcase CyanWallBanner::CyanWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8192;\n\t\t\tcase CyanWool::CyanWool().ID: return 1393;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZM).ID: return 6618;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZP).ID: return 6619;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XM).ID: return 6620;\n\t\t\tcase DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XP).ID: return 6621;\n\t\t\tcase Dandelion::Dandelion().ID: return 1412;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6466;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6467;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6468;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6469;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 6470;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 6471;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 6472;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 6473;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6474;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6475;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6476;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6477;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 6478;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 6479;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 6480;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 6481;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6482;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6483;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6484;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6485;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 6486;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 6487;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 6488;\n\t\t\tcase DarkOakButton::DarkOakButton(DarkOakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 6489;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 8994;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 8995;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 8996;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 8997;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 8998;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 8999;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 9000;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 9001;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 9002;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 9003;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 9004;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 9005;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 9006;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 9007;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 9008;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 9009;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 9010;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 9011;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 9012;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 9013;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 9014;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 9015;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 9016;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 9017;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 9018;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 9019;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 9020;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 9021;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 9022;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 9023;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 9024;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 9025;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 9026;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 9027;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 9028;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 9029;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 9030;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 9031;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 9032;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 9033;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 9034;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 9035;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 9036;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 9037;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 9038;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 9039;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 9040;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 9041;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, true).ID: return 9042;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, true, false).ID: return 9043;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true).ID: return 9044;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false).ID: return 9045;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, true).ID: return 9046;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, true, false).ID: return 9047;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true).ID: return 9048;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false).ID: return 9049;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, true).ID: return 9050;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, true, false).ID: return 9051;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, true).ID: return 9052;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Left, false, false).ID: return 9053;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, true).ID: return 9054;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false).ID: return 9055;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, true).ID: return 9056;\n\t\t\tcase DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false).ID: return 9057;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, true).ID: return 8708;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, true, false).ID: return 8709;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, true).ID: return 8712;\n\t\t\tcase DarkOakFence::DarkOakFence(true, true, false, false).ID: return 8713;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, true).ID: return 8716;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, true, false).ID: return 8717;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, true).ID: return 8720;\n\t\t\tcase DarkOakFence::DarkOakFence(true, false, false, false).ID: return 8721;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, true).ID: return 8724;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, true, false).ID: return 8725;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, true).ID: return 8728;\n\t\t\tcase DarkOakFence::DarkOakFence(false, true, false, false).ID: return 8729;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, true).ID: return 8732;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, true, false).ID: return 8733;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, true).ID: return 8736;\n\t\t\tcase DarkOakFence::DarkOakFence(false, false, false, false).ID: return 8737;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 8546;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 8547;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 8548;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 8549;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 8550;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 8551;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 8552;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 8553;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 8554;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 8555;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 8556;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 8557;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 8558;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 8559;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 8560;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 8561;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 8562;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 8563;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 8564;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 8565;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 8566;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 8567;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8568;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8569;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8570;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8571;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8572;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8573;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8574;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8575;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8576;\n\t\t\tcase DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8577;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, true).ID: return 215;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(1, false).ID: return 216;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, true).ID: return 217;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(2, false).ID: return 218;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, true).ID: return 219;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(3, false).ID: return 220;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, true).ID: return 221;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(4, false).ID: return 222;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, true).ID: return 223;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(5, false).ID: return 224;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, true).ID: return 225;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(6, false).ID: return 226;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, true).ID: return 227;\n\t\t\tcase DarkOakLeaves::DarkOakLeaves(7, false).ID: return 228;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::X).ID: return 88;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Y).ID: return 89;\n\t\t\tcase DarkOakLog::DarkOakLog(DarkOakLog::Axis::Z).ID: return 90;\n\t\t\tcase DarkOakPlanks::DarkOakPlanks().ID: return 20;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(true).ID: return 3883;\n\t\t\tcase DarkOakPressurePlate::DarkOakPressurePlate(false).ID: return 3884;\n\t\t\tcase DarkOakSapling::DarkOakSapling(0).ID: return 31;\n\t\t\tcase DarkOakSapling::DarkOakSapling(1).ID: return 32;\n\t\t\tcase DarkOakSign::DarkOakSign(0).ID: return 3542;\n\t\t\tcase DarkOakSign::DarkOakSign(1).ID: return 3544;\n\t\t\tcase DarkOakSign::DarkOakSign(2).ID: return 3546;\n\t\t\tcase DarkOakSign::DarkOakSign(3).ID: return 3548;\n\t\t\tcase DarkOakSign::DarkOakSign(4).ID: return 3550;\n\t\t\tcase DarkOakSign::DarkOakSign(5).ID: return 3552;\n\t\t\tcase DarkOakSign::DarkOakSign(6).ID: return 3554;\n\t\t\tcase DarkOakSign::DarkOakSign(7).ID: return 3556;\n\t\t\tcase DarkOakSign::DarkOakSign(8).ID: return 3558;\n\t\t\tcase DarkOakSign::DarkOakSign(9).ID: return 3560;\n\t\t\tcase DarkOakSign::DarkOakSign(10).ID: return 3562;\n\t\t\tcase DarkOakSign::DarkOakSign(11).ID: return 3564;\n\t\t\tcase DarkOakSign::DarkOakSign(12).ID: return 3566;\n\t\t\tcase DarkOakSign::DarkOakSign(13).ID: return 3568;\n\t\t\tcase DarkOakSign::DarkOakSign(14).ID: return 3570;\n\t\t\tcase DarkOakSign::DarkOakSign(15).ID: return 3572;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Top).ID: return 8331;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Bottom).ID: return 8333;\n\t\t\tcase DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Double).ID: return 8335;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 7456;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 7458;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 7460;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 7462;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 7464;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 7466;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 7468;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 7470;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 7472;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 7474;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 7476;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 7478;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 7480;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 7482;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 7484;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 7486;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 7488;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 7490;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 7492;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 7494;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 7496;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 7498;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 7500;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 7502;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 7504;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 7506;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 7508;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 7510;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 7512;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 7514;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight).ID: return 7516;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerLeft).ID: return 7518;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::InnerRight).ID: return 7520;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterLeft).ID: return 7522;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::OuterRight).ID: return 7524;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight).ID: return 7526;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerLeft).ID: return 7528;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::InnerRight).ID: return 7530;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterLeft).ID: return 7532;\n\t\t\tcase DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::OuterRight).ID: return 7534;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, true).ID: return 4432;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, true, false).ID: return 4434;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, true).ID: return 4436;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Top, false, false).ID: return 4438;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4440;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4442;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4444;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4446;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, true).ID: return 4448;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, true, false).ID: return 4450;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, true).ID: return 4452;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Top, false, false).ID: return 4454;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4456;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4458;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4460;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_ZP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4462;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, true).ID: return 4464;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, true, false).ID: return 4466;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, true).ID: return 4468;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Top, false, false).ID: return 4470;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4472;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4474;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4476;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XM, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4478;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, true).ID: return 4480;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, true, false).ID: return 4482;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, true).ID: return 4484;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Top, false, false).ID: return 4486;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, true).ID: return 4488;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, true, false).ID: return 4490;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, true).ID: return 4492;\n\t\t\tcase DarkOakTrapdoor::DarkOakTrapdoor(eBlockFace::BLOCK_FACE_XP, DarkOakTrapdoor::Half::Bottom, false, false).ID: return 4494;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3776;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3778;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3780;\n\t\t\tcase DarkOakWallSign::DarkOakWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3782;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::X).ID: return 124;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Y).ID: return 125;\n\t\t\tcase DarkOakWood::DarkOakWood(DarkOakWood::Axis::Z).ID: return 126;\n\t\t\tcase DarkPrismarine::DarkPrismarine().ID: return 7603;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Top).ID: return 7857;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Bottom).ID: return 7859;\n\t\t\tcase DarkPrismarineSlab::DarkPrismarineSlab(DarkPrismarineSlab::Type::Double).ID: return 7861;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7765;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7767;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7769;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7771;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7773;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7775;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7777;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7779;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7781;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7783;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7785;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7787;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7789;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7791;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7793;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7795;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7797;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7799;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7801;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_ZP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7803;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7805;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7807;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7809;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7811;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7813;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7815;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7817;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7819;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7821;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XM, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7823;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::Straight).ID: return 7825;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7827;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::InnerRight).ID: return 7829;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7831;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Top, DarkPrismarineStairs::Shape::OuterRight).ID: return 7833;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::Straight).ID: return 7835;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerLeft).ID: return 7837;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::InnerRight).ID: return 7839;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterLeft).ID: return 7841;\n\t\t\tcase DarkPrismarineStairs::DarkPrismarineStairs(eBlockFace::BLOCK_FACE_XP, DarkPrismarineStairs::Half::Bottom, DarkPrismarineStairs::Shape::OuterRight).ID: return 7843;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 0).ID: return 6694;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 1).ID: return 6695;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 2).ID: return 6696;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 3).ID: return 6697;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 4).ID: return 6698;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 5).ID: return 6699;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 6).ID: return 6700;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 7).ID: return 6701;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 8).ID: return 6702;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 9).ID: return 6703;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 10).ID: return 6704;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 11).ID: return 6705;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 12).ID: return 6706;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 13).ID: return 6707;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 14).ID: return 6708;\n\t\t\tcase DaylightDetector::DaylightDetector(true, 15).ID: return 6709;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 0).ID: return 6710;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 1).ID: return 6711;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 2).ID: return 6712;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 3).ID: return 6713;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 4).ID: return 6714;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 5).ID: return 6715;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 6).ID: return 6716;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 7).ID: return 6717;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 8).ID: return 6718;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 9).ID: return 6719;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 10).ID: return 6720;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 11).ID: return 6721;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 12).ID: return 6722;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 13).ID: return 6723;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 14).ID: return 6724;\n\t\t\tcase DaylightDetector::DaylightDetector(false, 15).ID: return 6725;\n\t\t\tcase DeadBrainCoral::DeadBrainCoral().ID: return 9523;\n\t\t\tcase DeadBrainCoralBlock::DeadBrainCoralBlock().ID: return 9511;\n\t\t\tcase DeadBrainCoralFan::DeadBrainCoralFan().ID: return 9543;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9569;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9571;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9573;\n\t\t\tcase DeadBrainCoralWallFan::DeadBrainCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9575;\n\t\t\tcase DeadBubbleCoral::DeadBubbleCoral().ID: return 9525;\n\t\t\tcase DeadBubbleCoralBlock::DeadBubbleCoralBlock().ID: return 9512;\n\t\t\tcase DeadBubbleCoralFan::DeadBubbleCoralFan().ID: return 9545;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9577;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9579;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9581;\n\t\t\tcase DeadBubbleCoralWallFan::DeadBubbleCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9583;\n\t\t\tcase DeadBush::DeadBush().ID: return 1344;\n\t\t\tcase DeadFireCoral::DeadFireCoral().ID: return 9527;\n\t\t\tcase DeadFireCoralBlock::DeadFireCoralBlock().ID: return 9513;\n\t\t\tcase DeadFireCoralFan::DeadFireCoralFan().ID: return 9547;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9585;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9587;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9589;\n\t\t\tcase DeadFireCoralWallFan::DeadFireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9591;\n\t\t\tcase DeadHornCoral::DeadHornCoral().ID: return 9529;\n\t\t\tcase DeadHornCoralBlock::DeadHornCoralBlock().ID: return 9514;\n\t\t\tcase DeadHornCoralFan::DeadHornCoralFan().ID: return 9549;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9593;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9595;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9597;\n\t\t\tcase DeadHornCoralWallFan::DeadHornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9599;\n\t\t\tcase DeadTubeCoral::DeadTubeCoral().ID: return 9521;\n\t\t\tcase DeadTubeCoralBlock::DeadTubeCoralBlock().ID: return 9510;\n\t\t\tcase DeadTubeCoralFan::DeadTubeCoralFan().ID: return 9541;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9561;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9563;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9565;\n\t\t\tcase DeadTubeCoralWallFan::DeadTubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9567;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::NorthSouth).ID: return 1317;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::EastWest).ID: return 1318;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingEast).ID: return 1319;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingWest).ID: return 1320;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingNorth).ID: return 1321;\n\t\t\tcase DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingSouth).ID: return 1322;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::NorthSouth).ID: return 1323;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::EastWest).ID: return 1324;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingEast).ID: return 1325;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingWest).ID: return 1326;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingNorth).ID: return 1327;\n\t\t\tcase DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingSouth).ID: return 1328;\n\t\t\tcase DiamondBlock::DiamondBlock().ID: return 3355;\n\t\t\tcase DiamondOre::DiamondOre().ID: return 3354;\n\t\t\tcase Diorite::Diorite().ID: return 4;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Top).ID: return 10862;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Bottom).ID: return 10864;\n\t\t\tcase DioriteSlab::DioriteSlab(DioriteSlab::Type::Double).ID: return 10866;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10710;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10712;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10714;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10716;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10718;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10720;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10722;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10724;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10726;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10728;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10730;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10732;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10734;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10736;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10738;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10740;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10742;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10744;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10746;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_ZP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10748;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10750;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10752;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10754;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10756;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10758;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10760;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10762;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10764;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10766;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XM, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10768;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::Straight).ID: return 10770;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerLeft).ID: return 10772;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::InnerRight).ID: return 10774;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterLeft).ID: return 10776;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Top, DioriteStairs::Shape::OuterRight).ID: return 10778;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::Straight).ID: return 10780;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerLeft).ID: return 10782;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::InnerRight).ID: return 10784;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterLeft).ID: return 10786;\n\t\t\tcase DioriteStairs::DioriteStairs(eBlockFace::BLOCK_FACE_XP, DioriteStairs::Half::Bottom, DioriteStairs::Shape::OuterRight).ID: return 10788;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14434;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14435;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14436;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14440;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14441;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14442;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14446;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14447;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14448;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14452;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14453;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14454;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14458;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14459;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14460;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14464;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14465;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14466;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14470;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14471;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14472;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14476;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14477;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14478;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14482;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14483;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14484;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14488;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14489;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14490;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14494;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14495;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14496;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14500;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14501;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14502;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14506;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14507;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14508;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14512;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14513;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14514;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14518;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14519;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14520;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14524;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14525;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14526;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14530;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14531;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14532;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14536;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14537;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::None, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14538;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14542;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14543;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14544;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14548;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14549;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14550;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14554;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14555;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14556;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14560;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14561;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14562;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14566;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14567;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14568;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14572;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14573;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14574;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14578;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14579;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14580;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14584;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14585;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14586;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14590;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14591;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14592;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14596;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14597;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14598;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14602;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14603;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14604;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14608;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14609;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14610;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14614;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14615;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14616;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14620;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14621;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14622;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14626;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14627;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14628;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14632;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14633;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14634;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14638;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14639;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14640;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14644;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14645;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Low, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14646;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14650;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14651;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14652;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14656;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14657;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14658;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14662;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14663;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14664;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14668;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14669;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14670;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14674;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14675;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14676;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14680;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14681;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::None, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14682;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14686;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14687;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14688;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14692;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14693;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14694;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14698;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14699;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14700;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14704;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14705;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14706;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14710;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14711;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14712;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14716;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14717;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Low, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14718;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::None).ID: return 14722;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::Low).ID: return 14723;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::None, true, DioriteWall::West::Tall).ID: return 14724;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::None).ID: return 14728;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::Low).ID: return 14729;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::None, false, DioriteWall::West::Tall).ID: return 14730;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::None).ID: return 14734;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::Low).ID: return 14735;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Low, true, DioriteWall::West::Tall).ID: return 14736;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::None).ID: return 14740;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::Low).ID: return 14741;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Low, false, DioriteWall::West::Tall).ID: return 14742;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::None).ID: return 14746;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::Low).ID: return 14747;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Tall, true, DioriteWall::West::Tall).ID: return 14748;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::None).ID: return 14752;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::Low).ID: return 14753;\n\t\t\tcase DioriteWall::DioriteWall(DioriteWall::East::Tall, DioriteWall::North::Tall, DioriteWall::South::Tall, false, DioriteWall::West::Tall).ID: return 14754;\n\t\t\tcase Dirt::Dirt().ID: return 10;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, true).ID: return 234;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, false).ID: return 235;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, true).ID: return 236;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, false).ID: return 237;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, true).ID: return 238;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, false).ID: return 239;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, true).ID: return 240;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, false).ID: return 241;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, true).ID: return 242;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, false).ID: return 243;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, true).ID: return 244;\n\t\t\tcase Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, false).ID: return 245;\n\t\t\tcase DragonEgg::DragonEgg().ID: return 5155;\n\t\t\tcase DragonHead::DragonHead(0).ID: return 6590;\n\t\t\tcase DragonHead::DragonHead(1).ID: return 6591;\n\t\t\tcase DragonHead::DragonHead(2).ID: return 6592;\n\t\t\tcase DragonHead::DragonHead(3).ID: return 6593;\n\t\t\tcase DragonHead::DragonHead(4).ID: return 6594;\n\t\t\tcase DragonHead::DragonHead(5).ID: return 6595;\n\t\t\tcase DragonHead::DragonHead(6).ID: return 6596;\n\t\t\tcase DragonHead::DragonHead(7).ID: return 6597;\n\t\t\tcase DragonHead::DragonHead(8).ID: return 6598;\n\t\t\tcase DragonHead::DragonHead(9).ID: return 6599;\n\t\t\tcase DragonHead::DragonHead(10).ID: return 6600;\n\t\t\tcase DragonHead::DragonHead(11).ID: return 6601;\n\t\t\tcase DragonHead::DragonHead(12).ID: return 6602;\n\t\t\tcase DragonHead::DragonHead(13).ID: return 6603;\n\t\t\tcase DragonHead::DragonHead(14).ID: return 6604;\n\t\t\tcase DragonHead::DragonHead(15).ID: return 6605;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6606;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6607;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6608;\n\t\t\tcase DragonWallHead::DragonWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6609;\n\t\t\tcase DriedKelpBlock::DriedKelpBlock().ID: return 9497;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, true).ID: return 6835;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, false).ID: return 6836;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, true).ID: return 6837;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, false).ID: return 6838;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, true).ID: return 6839;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, false).ID: return 6840;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, true).ID: return 6841;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, false).ID: return 6842;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, true).ID: return 6843;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, false).ID: return 6844;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, true).ID: return 6845;\n\t\t\tcase Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, false).ID: return 6846;\n\t\t\tcase EmeraldBlock::EmeraldBlock().ID: return 5403;\n\t\t\tcase EmeraldOre::EmeraldOre().ID: return 5250;\n\t\t\tcase EnchantingTable::EnchantingTable().ID: return 5132;\n\t\t\tcase EndGateway::EndGateway().ID: return 9224;\n\t\t\tcase EndPortal::EndPortal().ID: return 5145;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZM).ID: return 5146;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZP).ID: return 5147;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XM).ID: return 5148;\n\t\t\tcase EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XP).ID: return 5149;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZM).ID: return 5150;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZP).ID: return 5151;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XM).ID: return 5152;\n\t\t\tcase EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XP).ID: return 5153;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZM).ID: return 9058;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XP).ID: return 9059;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_ZP).ID: return 9060;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_XM).ID: return 9061;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YP).ID: return 9062;\n\t\t\tcase EndRod::EndRod(eBlockFace::BLOCK_FACE_YM).ID: return 9063;\n\t\t\tcase EndStone::EndStone().ID: return 5154;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Top).ID: return 10820;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Bottom).ID: return 10822;\n\t\t\tcase EndStoneBrickSlab::EndStoneBrickSlab(EndStoneBrickSlab::Type::Double).ID: return 10824;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 10070;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 10072;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 10074;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 10076;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 10078;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 10080;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 10082;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 10084;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 10086;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 10088;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 10090;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 10092;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 10094;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 10096;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 10098;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 10100;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 10102;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 10104;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 10106;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 10108;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 10110;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 10112;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 10114;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 10116;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 10118;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 10120;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 10122;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 10124;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 10126;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 10128;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::Straight).ID: return 10130;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerLeft).ID: return 10132;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::InnerRight).ID: return 10134;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterLeft).ID: return 10136;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Top, EndStoneBrickStairs::Shape::OuterRight).ID: return 10138;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::Straight).ID: return 10140;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerLeft).ID: return 10142;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::InnerRight).ID: return 10144;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterLeft).ID: return 10146;\n\t\t\tcase EndStoneBrickStairs::EndStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, EndStoneBrickStairs::Half::Bottom, EndStoneBrickStairs::Shape::OuterRight).ID: return 10148;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14110;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14111;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14112;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14116;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14117;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14118;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14122;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14123;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14124;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14128;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14129;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14130;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14134;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14135;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14136;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14140;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14141;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14142;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14146;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14147;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14148;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14152;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14153;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14154;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14158;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14159;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14160;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14164;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14165;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14166;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14170;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14171;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14172;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14176;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14177;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14178;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14182;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14183;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14184;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14188;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14189;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14190;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14194;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14195;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14196;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14200;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14201;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14202;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14206;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14207;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14208;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14212;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14213;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::None, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14214;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14218;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14219;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14220;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14224;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14225;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14226;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14230;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14231;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14232;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14236;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14237;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14238;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14242;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14243;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14244;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14248;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14249;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14250;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14254;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14255;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14256;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14260;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14261;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14262;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14266;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14267;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14268;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14272;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14273;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14274;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14278;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14279;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14280;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14284;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14285;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14286;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14290;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14291;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14292;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14296;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14297;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14298;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14302;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14303;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14304;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14308;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14309;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14310;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14314;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14315;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14316;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14320;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14321;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Low, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14322;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14326;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14327;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14328;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14332;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14333;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14334;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14338;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14339;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14340;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14344;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14345;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14346;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14350;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14351;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14352;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14356;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14357;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::None, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14358;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14362;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14363;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14364;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14368;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14369;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14370;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14374;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14375;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14376;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14380;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14381;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14382;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14386;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14387;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14388;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14392;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14393;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Low, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14394;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::None).ID: return 14398;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Low).ID: return 14399;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, true, EndStoneBrickWall::West::Tall).ID: return 14400;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::None).ID: return 14404;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Low).ID: return 14405;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::None, false, EndStoneBrickWall::West::Tall).ID: return 14406;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::None).ID: return 14410;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Low).ID: return 14411;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, true, EndStoneBrickWall::West::Tall).ID: return 14412;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::None).ID: return 14416;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Low).ID: return 14417;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Low, false, EndStoneBrickWall::West::Tall).ID: return 14418;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::None).ID: return 14422;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Low).ID: return 14423;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, true, EndStoneBrickWall::West::Tall).ID: return 14424;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::None).ID: return 14428;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Low).ID: return 14429;\n\t\t\tcase EndStoneBrickWall::EndStoneBrickWall(EndStoneBrickWall::East::Tall, EndStoneBrickWall::North::Tall, EndStoneBrickWall::South::Tall, false, EndStoneBrickWall::West::Tall).ID: return 14430;\n\t\t\tcase EndStoneBricks::EndStoneBricks().ID: return 9218;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZM).ID: return 5252;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZP).ID: return 5254;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XM).ID: return 5256;\n\t\t\tcase EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XP).ID: return 5258;\n\t\t\tcase Farmland::Farmland(0).ID: return 3365;\n\t\t\tcase Farmland::Farmland(1).ID: return 3366;\n\t\t\tcase Farmland::Farmland(2).ID: return 3367;\n\t\t\tcase Farmland::Farmland(3).ID: return 3368;\n\t\t\tcase Farmland::Farmland(4).ID: return 3369;\n\t\t\tcase Farmland::Farmland(5).ID: return 3370;\n\t\t\tcase Farmland::Farmland(6).ID: return 3371;\n\t\t\tcase Farmland::Farmland(7).ID: return 3372;\n\t\t\tcase Fern::Fern().ID: return 1343;\n\t\t\tcase Fire::Fire(0, true, true, true, true, true).ID: return 1440;\n\t\t\tcase Fire::Fire(0, true, true, true, true, false).ID: return 1441;\n\t\t\tcase Fire::Fire(0, true, true, true, false, true).ID: return 1442;\n\t\t\tcase Fire::Fire(0, true, true, true, false, false).ID: return 1443;\n\t\t\tcase Fire::Fire(0, true, true, false, true, true).ID: return 1444;\n\t\t\tcase Fire::Fire(0, true, true, false, true, false).ID: return 1445;\n\t\t\tcase Fire::Fire(0, true, true, false, false, true).ID: return 1446;\n\t\t\tcase Fire::Fire(0, true, true, false, false, false).ID: return 1447;\n\t\t\tcase Fire::Fire(0, true, false, true, true, true).ID: return 1448;\n\t\t\tcase Fire::Fire(0, true, false, true, true, false).ID: return 1449;\n\t\t\tcase Fire::Fire(0, true, false, true, false, true).ID: return 1450;\n\t\t\tcase Fire::Fire(0, true, false, true, false, false).ID: return 1451;\n\t\t\tcase Fire::Fire(0, true, false, false, true, true).ID: return 1452;\n\t\t\tcase Fire::Fire(0, true, false, false, true, false).ID: return 1453;\n\t\t\tcase Fire::Fire(0, true, false, false, false, true).ID: return 1454;\n\t\t\tcase Fire::Fire(0, true, false, false, false, false).ID: return 1455;\n\t\t\tcase Fire::Fire(0, false, true, true, true, true).ID: return 1456;\n\t\t\tcase Fire::Fire(0, false, true, true, true, false).ID: return 1457;\n\t\t\tcase Fire::Fire(0, false, true, true, false, true).ID: return 1458;\n\t\t\tcase Fire::Fire(0, false, true, true, false, false).ID: return 1459;\n\t\t\tcase Fire::Fire(0, false, true, false, true, true).ID: return 1460;\n\t\t\tcase Fire::Fire(0, false, true, false, true, false).ID: return 1461;\n\t\t\tcase Fire::Fire(0, false, true, false, false, true).ID: return 1462;\n\t\t\tcase Fire::Fire(0, false, true, false, false, false).ID: return 1463;\n\t\t\tcase Fire::Fire(0, false, false, true, true, true).ID: return 1464;\n\t\t\tcase Fire::Fire(0, false, false, true, true, false).ID: return 1465;\n\t\t\tcase Fire::Fire(0, false, false, true, false, true).ID: return 1466;\n\t\t\tcase Fire::Fire(0, false, false, true, false, false).ID: return 1467;\n\t\t\tcase Fire::Fire(0, false, false, false, true, true).ID: return 1468;\n\t\t\tcase Fire::Fire(0, false, false, false, true, false).ID: return 1469;\n\t\t\tcase Fire::Fire(0, false, false, false, false, true).ID: return 1470;\n\t\t\tcase Fire::Fire(0, false, false, false, false, false).ID: return 1471;\n\t\t\tcase Fire::Fire(1, true, true, true, true, true).ID: return 1472;\n\t\t\tcase Fire::Fire(1, true, true, true, true, false).ID: return 1473;\n\t\t\tcase Fire::Fire(1, true, true, true, false, true).ID: return 1474;\n\t\t\tcase Fire::Fire(1, true, true, true, false, false).ID: return 1475;\n\t\t\tcase Fire::Fire(1, true, true, false, true, true).ID: return 1476;\n\t\t\tcase Fire::Fire(1, true, true, false, true, false).ID: return 1477;\n\t\t\tcase Fire::Fire(1, true, true, false, false, true).ID: return 1478;\n\t\t\tcase Fire::Fire(1, true, true, false, false, false).ID: return 1479;\n\t\t\tcase Fire::Fire(1, true, false, true, true, true).ID: return 1480;\n\t\t\tcase Fire::Fire(1, true, false, true, true, false).ID: return 1481;\n\t\t\tcase Fire::Fire(1, true, false, true, false, true).ID: return 1482;\n\t\t\tcase Fire::Fire(1, true, false, true, false, false).ID: return 1483;\n\t\t\tcase Fire::Fire(1, true, false, false, true, true).ID: return 1484;\n\t\t\tcase Fire::Fire(1, true, false, false, true, false).ID: return 1485;\n\t\t\tcase Fire::Fire(1, true, false, false, false, true).ID: return 1486;\n\t\t\tcase Fire::Fire(1, true, false, false, false, false).ID: return 1487;\n\t\t\tcase Fire::Fire(1, false, true, true, true, true).ID: return 1488;\n\t\t\tcase Fire::Fire(1, false, true, true, true, false).ID: return 1489;\n\t\t\tcase Fire::Fire(1, false, true, true, false, true).ID: return 1490;\n\t\t\tcase Fire::Fire(1, false, true, true, false, false).ID: return 1491;\n\t\t\tcase Fire::Fire(1, false, true, false, true, true).ID: return 1492;\n\t\t\tcase Fire::Fire(1, false, true, false, true, false).ID: return 1493;\n\t\t\tcase Fire::Fire(1, false, true, false, false, true).ID: return 1494;\n\t\t\tcase Fire::Fire(1, false, true, false, false, false).ID: return 1495;\n\t\t\tcase Fire::Fire(1, false, false, true, true, true).ID: return 1496;\n\t\t\tcase Fire::Fire(1, false, false, true, true, false).ID: return 1497;\n\t\t\tcase Fire::Fire(1, false, false, true, false, true).ID: return 1498;\n\t\t\tcase Fire::Fire(1, false, false, true, false, false).ID: return 1499;\n\t\t\tcase Fire::Fire(1, false, false, false, true, true).ID: return 1500;\n\t\t\tcase Fire::Fire(1, false, false, false, true, false).ID: return 1501;\n\t\t\tcase Fire::Fire(1, false, false, false, false, true).ID: return 1502;\n\t\t\tcase Fire::Fire(1, false, false, false, false, false).ID: return 1503;\n\t\t\tcase Fire::Fire(2, true, true, true, true, true).ID: return 1504;\n\t\t\tcase Fire::Fire(2, true, true, true, true, false).ID: return 1505;\n\t\t\tcase Fire::Fire(2, true, true, true, false, true).ID: return 1506;\n\t\t\tcase Fire::Fire(2, true, true, true, false, false).ID: return 1507;\n\t\t\tcase Fire::Fire(2, true, true, false, true, true).ID: return 1508;\n\t\t\tcase Fire::Fire(2, true, true, false, true, false).ID: return 1509;\n\t\t\tcase Fire::Fire(2, true, true, false, false, true).ID: return 1510;\n\t\t\tcase Fire::Fire(2, true, true, false, false, false).ID: return 1511;\n\t\t\tcase Fire::Fire(2, true, false, true, true, true).ID: return 1512;\n\t\t\tcase Fire::Fire(2, true, false, true, true, false).ID: return 1513;\n\t\t\tcase Fire::Fire(2, true, false, true, false, true).ID: return 1514;\n\t\t\tcase Fire::Fire(2, true, false, true, false, false).ID: return 1515;\n\t\t\tcase Fire::Fire(2, true, false, false, true, true).ID: return 1516;\n\t\t\tcase Fire::Fire(2, true, false, false, true, false).ID: return 1517;\n\t\t\tcase Fire::Fire(2, true, false, false, false, true).ID: return 1518;\n\t\t\tcase Fire::Fire(2, true, false, false, false, false).ID: return 1519;\n\t\t\tcase Fire::Fire(2, false, true, true, true, true).ID: return 1520;\n\t\t\tcase Fire::Fire(2, false, true, true, true, false).ID: return 1521;\n\t\t\tcase Fire::Fire(2, false, true, true, false, true).ID: return 1522;\n\t\t\tcase Fire::Fire(2, false, true, true, false, false).ID: return 1523;\n\t\t\tcase Fire::Fire(2, false, true, false, true, true).ID: return 1524;\n\t\t\tcase Fire::Fire(2, false, true, false, true, false).ID: return 1525;\n\t\t\tcase Fire::Fire(2, false, true, false, false, true).ID: return 1526;\n\t\t\tcase Fire::Fire(2, false, true, false, false, false).ID: return 1527;\n\t\t\tcase Fire::Fire(2, false, false, true, true, true).ID: return 1528;\n\t\t\tcase Fire::Fire(2, false, false, true, true, false).ID: return 1529;\n\t\t\tcase Fire::Fire(2, false, false, true, false, true).ID: return 1530;\n\t\t\tcase Fire::Fire(2, false, false, true, false, false).ID: return 1531;\n\t\t\tcase Fire::Fire(2, false, false, false, true, true).ID: return 1532;\n\t\t\tcase Fire::Fire(2, false, false, false, true, false).ID: return 1533;\n\t\t\tcase Fire::Fire(2, false, false, false, false, true).ID: return 1534;\n\t\t\tcase Fire::Fire(2, false, false, false, false, false).ID: return 1535;\n\t\t\tcase Fire::Fire(3, true, true, true, true, true).ID: return 1536;\n\t\t\tcase Fire::Fire(3, true, true, true, true, false).ID: return 1537;\n\t\t\tcase Fire::Fire(3, true, true, true, false, true).ID: return 1538;\n\t\t\tcase Fire::Fire(3, true, true, true, false, false).ID: return 1539;\n\t\t\tcase Fire::Fire(3, true, true, false, true, true).ID: return 1540;\n\t\t\tcase Fire::Fire(3, true, true, false, true, false).ID: return 1541;\n\t\t\tcase Fire::Fire(3, true, true, false, false, true).ID: return 1542;\n\t\t\tcase Fire::Fire(3, true, true, false, false, false).ID: return 1543;\n\t\t\tcase Fire::Fire(3, true, false, true, true, true).ID: return 1544;\n\t\t\tcase Fire::Fire(3, true, false, true, true, false).ID: return 1545;\n\t\t\tcase Fire::Fire(3, true, false, true, false, true).ID: return 1546;\n\t\t\tcase Fire::Fire(3, true, false, true, false, false).ID: return 1547;\n\t\t\tcase Fire::Fire(3, true, false, false, true, true).ID: return 1548;\n\t\t\tcase Fire::Fire(3, true, false, false, true, false).ID: return 1549;\n\t\t\tcase Fire::Fire(3, true, false, false, false, true).ID: return 1550;\n\t\t\tcase Fire::Fire(3, true, false, false, false, false).ID: return 1551;\n\t\t\tcase Fire::Fire(3, false, true, true, true, true).ID: return 1552;\n\t\t\tcase Fire::Fire(3, false, true, true, true, false).ID: return 1553;\n\t\t\tcase Fire::Fire(3, false, true, true, false, true).ID: return 1554;\n\t\t\tcase Fire::Fire(3, false, true, true, false, false).ID: return 1555;\n\t\t\tcase Fire::Fire(3, false, true, false, true, true).ID: return 1556;\n\t\t\tcase Fire::Fire(3, false, true, false, true, false).ID: return 1557;\n\t\t\tcase Fire::Fire(3, false, true, false, false, true).ID: return 1558;\n\t\t\tcase Fire::Fire(3, false, true, false, false, false).ID: return 1559;\n\t\t\tcase Fire::Fire(3, false, false, true, true, true).ID: return 1560;\n\t\t\tcase Fire::Fire(3, false, false, true, true, false).ID: return 1561;\n\t\t\tcase Fire::Fire(3, false, false, true, false, true).ID: return 1562;\n\t\t\tcase Fire::Fire(3, false, false, true, false, false).ID: return 1563;\n\t\t\tcase Fire::Fire(3, false, false, false, true, true).ID: return 1564;\n\t\t\tcase Fire::Fire(3, false, false, false, true, false).ID: return 1565;\n\t\t\tcase Fire::Fire(3, false, false, false, false, true).ID: return 1566;\n\t\t\tcase Fire::Fire(3, false, false, false, false, false).ID: return 1567;\n\t\t\tcase Fire::Fire(4, true, true, true, true, true).ID: return 1568;\n\t\t\tcase Fire::Fire(4, true, true, true, true, false).ID: return 1569;\n\t\t\tcase Fire::Fire(4, true, true, true, false, true).ID: return 1570;\n\t\t\tcase Fire::Fire(4, true, true, true, false, false).ID: return 1571;\n\t\t\tcase Fire::Fire(4, true, true, false, true, true).ID: return 1572;\n\t\t\tcase Fire::Fire(4, true, true, false, true, false).ID: return 1573;\n\t\t\tcase Fire::Fire(4, true, true, false, false, true).ID: return 1574;\n\t\t\tcase Fire::Fire(4, true, true, false, false, false).ID: return 1575;\n\t\t\tcase Fire::Fire(4, true, false, true, true, true).ID: return 1576;\n\t\t\tcase Fire::Fire(4, true, false, true, true, false).ID: return 1577;\n\t\t\tcase Fire::Fire(4, true, false, true, false, true).ID: return 1578;\n\t\t\tcase Fire::Fire(4, true, false, true, false, false).ID: return 1579;\n\t\t\tcase Fire::Fire(4, true, false, false, true, true).ID: return 1580;\n\t\t\tcase Fire::Fire(4, true, false, false, true, false).ID: return 1581;\n\t\t\tcase Fire::Fire(4, true, false, false, false, true).ID: return 1582;\n\t\t\tcase Fire::Fire(4, true, false, false, false, false).ID: return 1583;\n\t\t\tcase Fire::Fire(4, false, true, true, true, true).ID: return 1584;\n\t\t\tcase Fire::Fire(4, false, true, true, true, false).ID: return 1585;\n\t\t\tcase Fire::Fire(4, false, true, true, false, true).ID: return 1586;\n\t\t\tcase Fire::Fire(4, false, true, true, false, false).ID: return 1587;\n\t\t\tcase Fire::Fire(4, false, true, false, true, true).ID: return 1588;\n\t\t\tcase Fire::Fire(4, false, true, false, true, false).ID: return 1589;\n\t\t\tcase Fire::Fire(4, false, true, false, false, true).ID: return 1590;\n\t\t\tcase Fire::Fire(4, false, true, false, false, false).ID: return 1591;\n\t\t\tcase Fire::Fire(4, false, false, true, true, true).ID: return 1592;\n\t\t\tcase Fire::Fire(4, false, false, true, true, false).ID: return 1593;\n\t\t\tcase Fire::Fire(4, false, false, true, false, true).ID: return 1594;\n\t\t\tcase Fire::Fire(4, false, false, true, false, false).ID: return 1595;\n\t\t\tcase Fire::Fire(4, false, false, false, true, true).ID: return 1596;\n\t\t\tcase Fire::Fire(4, false, false, false, true, false).ID: return 1597;\n\t\t\tcase Fire::Fire(4, false, false, false, false, true).ID: return 1598;\n\t\t\tcase Fire::Fire(4, false, false, false, false, false).ID: return 1599;\n\t\t\tcase Fire::Fire(5, true, true, true, true, true).ID: return 1600;\n\t\t\tcase Fire::Fire(5, true, true, true, true, false).ID: return 1601;\n\t\t\tcase Fire::Fire(5, true, true, true, false, true).ID: return 1602;\n\t\t\tcase Fire::Fire(5, true, true, true, false, false).ID: return 1603;\n\t\t\tcase Fire::Fire(5, true, true, false, true, true).ID: return 1604;\n\t\t\tcase Fire::Fire(5, true, true, false, true, false).ID: return 1605;\n\t\t\tcase Fire::Fire(5, true, true, false, false, true).ID: return 1606;\n\t\t\tcase Fire::Fire(5, true, true, false, false, false).ID: return 1607;\n\t\t\tcase Fire::Fire(5, true, false, true, true, true).ID: return 1608;\n\t\t\tcase Fire::Fire(5, true, false, true, true, false).ID: return 1609;\n\t\t\tcase Fire::Fire(5, true, false, true, false, true).ID: return 1610;\n\t\t\tcase Fire::Fire(5, true, false, true, false, false).ID: return 1611;\n\t\t\tcase Fire::Fire(5, true, false, false, true, true).ID: return 1612;\n\t\t\tcase Fire::Fire(5, true, false, false, true, false).ID: return 1613;\n\t\t\tcase Fire::Fire(5, true, false, false, false, true).ID: return 1614;\n\t\t\tcase Fire::Fire(5, true, false, false, false, false).ID: return 1615;\n\t\t\tcase Fire::Fire(5, false, true, true, true, true).ID: return 1616;\n\t\t\tcase Fire::Fire(5, false, true, true, true, false).ID: return 1617;\n\t\t\tcase Fire::Fire(5, false, true, true, false, true).ID: return 1618;\n\t\t\tcase Fire::Fire(5, false, true, true, false, false).ID: return 1619;\n\t\t\tcase Fire::Fire(5, false, true, false, true, true).ID: return 1620;\n\t\t\tcase Fire::Fire(5, false, true, false, true, false).ID: return 1621;\n\t\t\tcase Fire::Fire(5, false, true, false, false, true).ID: return 1622;\n\t\t\tcase Fire::Fire(5, false, true, false, false, false).ID: return 1623;\n\t\t\tcase Fire::Fire(5, false, false, true, true, true).ID: return 1624;\n\t\t\tcase Fire::Fire(5, false, false, true, true, false).ID: return 1625;\n\t\t\tcase Fire::Fire(5, false, false, true, false, true).ID: return 1626;\n\t\t\tcase Fire::Fire(5, false, false, true, false, false).ID: return 1627;\n\t\t\tcase Fire::Fire(5, false, false, false, true, true).ID: return 1628;\n\t\t\tcase Fire::Fire(5, false, false, false, true, false).ID: return 1629;\n\t\t\tcase Fire::Fire(5, false, false, false, false, true).ID: return 1630;\n\t\t\tcase Fire::Fire(5, false, false, false, false, false).ID: return 1631;\n\t\t\tcase Fire::Fire(6, true, true, true, true, true).ID: return 1632;\n\t\t\tcase Fire::Fire(6, true, true, true, true, false).ID: return 1633;\n\t\t\tcase Fire::Fire(6, true, true, true, false, true).ID: return 1634;\n\t\t\tcase Fire::Fire(6, true, true, true, false, false).ID: return 1635;\n\t\t\tcase Fire::Fire(6, true, true, false, true, true).ID: return 1636;\n\t\t\tcase Fire::Fire(6, true, true, false, true, false).ID: return 1637;\n\t\t\tcase Fire::Fire(6, true, true, false, false, true).ID: return 1638;\n\t\t\tcase Fire::Fire(6, true, true, false, false, false).ID: return 1639;\n\t\t\tcase Fire::Fire(6, true, false, true, true, true).ID: return 1640;\n\t\t\tcase Fire::Fire(6, true, false, true, true, false).ID: return 1641;\n\t\t\tcase Fire::Fire(6, true, false, true, false, true).ID: return 1642;\n\t\t\tcase Fire::Fire(6, true, false, true, false, false).ID: return 1643;\n\t\t\tcase Fire::Fire(6, true, false, false, true, true).ID: return 1644;\n\t\t\tcase Fire::Fire(6, true, false, false, true, false).ID: return 1645;\n\t\t\tcase Fire::Fire(6, true, false, false, false, true).ID: return 1646;\n\t\t\tcase Fire::Fire(6, true, false, false, false, false).ID: return 1647;\n\t\t\tcase Fire::Fire(6, false, true, true, true, true).ID: return 1648;\n\t\t\tcase Fire::Fire(6, false, true, true, true, false).ID: return 1649;\n\t\t\tcase Fire::Fire(6, false, true, true, false, true).ID: return 1650;\n\t\t\tcase Fire::Fire(6, false, true, true, false, false).ID: return 1651;\n\t\t\tcase Fire::Fire(6, false, true, false, true, true).ID: return 1652;\n\t\t\tcase Fire::Fire(6, false, true, false, true, false).ID: return 1653;\n\t\t\tcase Fire::Fire(6, false, true, false, false, true).ID: return 1654;\n\t\t\tcase Fire::Fire(6, false, true, false, false, false).ID: return 1655;\n\t\t\tcase Fire::Fire(6, false, false, true, true, true).ID: return 1656;\n\t\t\tcase Fire::Fire(6, false, false, true, true, false).ID: return 1657;\n\t\t\tcase Fire::Fire(6, false, false, true, false, true).ID: return 1658;\n\t\t\tcase Fire::Fire(6, false, false, true, false, false).ID: return 1659;\n\t\t\tcase Fire::Fire(6, false, false, false, true, true).ID: return 1660;\n\t\t\tcase Fire::Fire(6, false, false, false, true, false).ID: return 1661;\n\t\t\tcase Fire::Fire(6, false, false, false, false, true).ID: return 1662;\n\t\t\tcase Fire::Fire(6, false, false, false, false, false).ID: return 1663;\n\t\t\tcase Fire::Fire(7, true, true, true, true, true).ID: return 1664;\n\t\t\tcase Fire::Fire(7, true, true, true, true, false).ID: return 1665;\n\t\t\tcase Fire::Fire(7, true, true, true, false, true).ID: return 1666;\n\t\t\tcase Fire::Fire(7, true, true, true, false, false).ID: return 1667;\n\t\t\tcase Fire::Fire(7, true, true, false, true, true).ID: return 1668;\n\t\t\tcase Fire::Fire(7, true, true, false, true, false).ID: return 1669;\n\t\t\tcase Fire::Fire(7, true, true, false, false, true).ID: return 1670;\n\t\t\tcase Fire::Fire(7, true, true, false, false, false).ID: return 1671;\n\t\t\tcase Fire::Fire(7, true, false, true, true, true).ID: return 1672;\n\t\t\tcase Fire::Fire(7, true, false, true, true, false).ID: return 1673;\n\t\t\tcase Fire::Fire(7, true, false, true, false, true).ID: return 1674;\n\t\t\tcase Fire::Fire(7, true, false, true, false, false).ID: return 1675;\n\t\t\tcase Fire::Fire(7, true, false, false, true, true).ID: return 1676;\n\t\t\tcase Fire::Fire(7, true, false, false, true, false).ID: return 1677;\n\t\t\tcase Fire::Fire(7, true, false, false, false, true).ID: return 1678;\n\t\t\tcase Fire::Fire(7, true, false, false, false, false).ID: return 1679;\n\t\t\tcase Fire::Fire(7, false, true, true, true, true).ID: return 1680;\n\t\t\tcase Fire::Fire(7, false, true, true, true, false).ID: return 1681;\n\t\t\tcase Fire::Fire(7, false, true, true, false, true).ID: return 1682;\n\t\t\tcase Fire::Fire(7, false, true, true, false, false).ID: return 1683;\n\t\t\tcase Fire::Fire(7, false, true, false, true, true).ID: return 1684;\n\t\t\tcase Fire::Fire(7, false, true, false, true, false).ID: return 1685;\n\t\t\tcase Fire::Fire(7, false, true, false, false, true).ID: return 1686;\n\t\t\tcase Fire::Fire(7, false, true, false, false, false).ID: return 1687;\n\t\t\tcase Fire::Fire(7, false, false, true, true, true).ID: return 1688;\n\t\t\tcase Fire::Fire(7, false, false, true, true, false).ID: return 1689;\n\t\t\tcase Fire::Fire(7, false, false, true, false, true).ID: return 1690;\n\t\t\tcase Fire::Fire(7, false, false, true, false, false).ID: return 1691;\n\t\t\tcase Fire::Fire(7, false, false, false, true, true).ID: return 1692;\n\t\t\tcase Fire::Fire(7, false, false, false, true, false).ID: return 1693;\n\t\t\tcase Fire::Fire(7, false, false, false, false, true).ID: return 1694;\n\t\t\tcase Fire::Fire(7, false, false, false, false, false).ID: return 1695;\n\t\t\tcase Fire::Fire(8, true, true, true, true, true).ID: return 1696;\n\t\t\tcase Fire::Fire(8, true, true, true, true, false).ID: return 1697;\n\t\t\tcase Fire::Fire(8, true, true, true, false, true).ID: return 1698;\n\t\t\tcase Fire::Fire(8, true, true, true, false, false).ID: return 1699;\n\t\t\tcase Fire::Fire(8, true, true, false, true, true).ID: return 1700;\n\t\t\tcase Fire::Fire(8, true, true, false, true, false).ID: return 1701;\n\t\t\tcase Fire::Fire(8, true, true, false, false, true).ID: return 1702;\n\t\t\tcase Fire::Fire(8, true, true, false, false, false).ID: return 1703;\n\t\t\tcase Fire::Fire(8, true, false, true, true, true).ID: return 1704;\n\t\t\tcase Fire::Fire(8, true, false, true, true, false).ID: return 1705;\n\t\t\tcase Fire::Fire(8, true, false, true, false, true).ID: return 1706;\n\t\t\tcase Fire::Fire(8, true, false, true, false, false).ID: return 1707;\n\t\t\tcase Fire::Fire(8, true, false, false, true, true).ID: return 1708;\n\t\t\tcase Fire::Fire(8, true, false, false, true, false).ID: return 1709;\n\t\t\tcase Fire::Fire(8, true, false, false, false, true).ID: return 1710;\n\t\t\tcase Fire::Fire(8, true, false, false, false, false).ID: return 1711;\n\t\t\tcase Fire::Fire(8, false, true, true, true, true).ID: return 1712;\n\t\t\tcase Fire::Fire(8, false, true, true, true, false).ID: return 1713;\n\t\t\tcase Fire::Fire(8, false, true, true, false, true).ID: return 1714;\n\t\t\tcase Fire::Fire(8, false, true, true, false, false).ID: return 1715;\n\t\t\tcase Fire::Fire(8, false, true, false, true, true).ID: return 1716;\n\t\t\tcase Fire::Fire(8, false, true, false, true, false).ID: return 1717;\n\t\t\tcase Fire::Fire(8, false, true, false, false, true).ID: return 1718;\n\t\t\tcase Fire::Fire(8, false, true, false, false, false).ID: return 1719;\n\t\t\tcase Fire::Fire(8, false, false, true, true, true).ID: return 1720;\n\t\t\tcase Fire::Fire(8, false, false, true, true, false).ID: return 1721;\n\t\t\tcase Fire::Fire(8, false, false, true, false, true).ID: return 1722;\n\t\t\tcase Fire::Fire(8, false, false, true, false, false).ID: return 1723;\n\t\t\tcase Fire::Fire(8, false, false, false, true, true).ID: return 1724;\n\t\t\tcase Fire::Fire(8, false, false, false, true, false).ID: return 1725;\n\t\t\tcase Fire::Fire(8, false, false, false, false, true).ID: return 1726;\n\t\t\tcase Fire::Fire(8, false, false, false, false, false).ID: return 1727;\n\t\t\tcase Fire::Fire(9, true, true, true, true, true).ID: return 1728;\n\t\t\tcase Fire::Fire(9, true, true, true, true, false).ID: return 1729;\n\t\t\tcase Fire::Fire(9, true, true, true, false, true).ID: return 1730;\n\t\t\tcase Fire::Fire(9, true, true, true, false, false).ID: return 1731;\n\t\t\tcase Fire::Fire(9, true, true, false, true, true).ID: return 1732;\n\t\t\tcase Fire::Fire(9, true, true, false, true, false).ID: return 1733;\n\t\t\tcase Fire::Fire(9, true, true, false, false, true).ID: return 1734;\n\t\t\tcase Fire::Fire(9, true, true, false, false, false).ID: return 1735;\n\t\t\tcase Fire::Fire(9, true, false, true, true, true).ID: return 1736;\n\t\t\tcase Fire::Fire(9, true, false, true, true, false).ID: return 1737;\n\t\t\tcase Fire::Fire(9, true, false, true, false, true).ID: return 1738;\n\t\t\tcase Fire::Fire(9, true, false, true, false, false).ID: return 1739;\n\t\t\tcase Fire::Fire(9, true, false, false, true, true).ID: return 1740;\n\t\t\tcase Fire::Fire(9, true, false, false, true, false).ID: return 1741;\n\t\t\tcase Fire::Fire(9, true, false, false, false, true).ID: return 1742;\n\t\t\tcase Fire::Fire(9, true, false, false, false, false).ID: return 1743;\n\t\t\tcase Fire::Fire(9, false, true, true, true, true).ID: return 1744;\n\t\t\tcase Fire::Fire(9, false, true, true, true, false).ID: return 1745;\n\t\t\tcase Fire::Fire(9, false, true, true, false, true).ID: return 1746;\n\t\t\tcase Fire::Fire(9, false, true, true, false, false).ID: return 1747;\n\t\t\tcase Fire::Fire(9, false, true, false, true, true).ID: return 1748;\n\t\t\tcase Fire::Fire(9, false, true, false, true, false).ID: return 1749;\n\t\t\tcase Fire::Fire(9, false, true, false, false, true).ID: return 1750;\n\t\t\tcase Fire::Fire(9, false, true, false, false, false).ID: return 1751;\n\t\t\tcase Fire::Fire(9, false, false, true, true, true).ID: return 1752;\n\t\t\tcase Fire::Fire(9, false, false, true, true, false).ID: return 1753;\n\t\t\tcase Fire::Fire(9, false, false, true, false, true).ID: return 1754;\n\t\t\tcase Fire::Fire(9, false, false, true, false, false).ID: return 1755;\n\t\t\tcase Fire::Fire(9, false, false, false, true, true).ID: return 1756;\n\t\t\tcase Fire::Fire(9, false, false, false, true, false).ID: return 1757;\n\t\t\tcase Fire::Fire(9, false, false, false, false, true).ID: return 1758;\n\t\t\tcase Fire::Fire(9, false, false, false, false, false).ID: return 1759;\n\t\t\tcase Fire::Fire(10, true, true, true, true, true).ID: return 1760;\n\t\t\tcase Fire::Fire(10, true, true, true, true, false).ID: return 1761;\n\t\t\tcase Fire::Fire(10, true, true, true, false, true).ID: return 1762;\n\t\t\tcase Fire::Fire(10, true, true, true, false, false).ID: return 1763;\n\t\t\tcase Fire::Fire(10, true, true, false, true, true).ID: return 1764;\n\t\t\tcase Fire::Fire(10, true, true, false, true, false).ID: return 1765;\n\t\t\tcase Fire::Fire(10, true, true, false, false, true).ID: return 1766;\n\t\t\tcase Fire::Fire(10, true, true, false, false, false).ID: return 1767;\n\t\t\tcase Fire::Fire(10, true, false, true, true, true).ID: return 1768;\n\t\t\tcase Fire::Fire(10, true, false, true, true, false).ID: return 1769;\n\t\t\tcase Fire::Fire(10, true, false, true, false, true).ID: return 1770;\n\t\t\tcase Fire::Fire(10, true, false, true, false, false).ID: return 1771;\n\t\t\tcase Fire::Fire(10, true, false, false, true, true).ID: return 1772;\n\t\t\tcase Fire::Fire(10, true, false, false, true, false).ID: return 1773;\n\t\t\tcase Fire::Fire(10, true, false, false, false, true).ID: return 1774;\n\t\t\tcase Fire::Fire(10, true, false, false, false, false).ID: return 1775;\n\t\t\tcase Fire::Fire(10, false, true, true, true, true).ID: return 1776;\n\t\t\tcase Fire::Fire(10, false, true, true, true, false).ID: return 1777;\n\t\t\tcase Fire::Fire(10, false, true, true, false, true).ID: return 1778;\n\t\t\tcase Fire::Fire(10, false, true, true, false, false).ID: return 1779;\n\t\t\tcase Fire::Fire(10, false, true, false, true, true).ID: return 1780;\n\t\t\tcase Fire::Fire(10, false, true, false, true, false).ID: return 1781;\n\t\t\tcase Fire::Fire(10, false, true, false, false, true).ID: return 1782;\n\t\t\tcase Fire::Fire(10, false, true, false, false, false).ID: return 1783;\n\t\t\tcase Fire::Fire(10, false, false, true, true, true).ID: return 1784;\n\t\t\tcase Fire::Fire(10, false, false, true, true, false).ID: return 1785;\n\t\t\tcase Fire::Fire(10, false, false, true, false, true).ID: return 1786;\n\t\t\tcase Fire::Fire(10, false, false, true, false, false).ID: return 1787;\n\t\t\tcase Fire::Fire(10, false, false, false, true, true).ID: return 1788;\n\t\t\tcase Fire::Fire(10, false, false, false, true, false).ID: return 1789;\n\t\t\tcase Fire::Fire(10, false, false, false, false, true).ID: return 1790;\n\t\t\tcase Fire::Fire(10, false, false, false, false, false).ID: return 1791;\n\t\t\tcase Fire::Fire(11, true, true, true, true, true).ID: return 1792;\n\t\t\tcase Fire::Fire(11, true, true, true, true, false).ID: return 1793;\n\t\t\tcase Fire::Fire(11, true, true, true, false, true).ID: return 1794;\n\t\t\tcase Fire::Fire(11, true, true, true, false, false).ID: return 1795;\n\t\t\tcase Fire::Fire(11, true, true, false, true, true).ID: return 1796;\n\t\t\tcase Fire::Fire(11, true, true, false, true, false).ID: return 1797;\n\t\t\tcase Fire::Fire(11, true, true, false, false, true).ID: return 1798;\n\t\t\tcase Fire::Fire(11, true, true, false, false, false).ID: return 1799;\n\t\t\tcase Fire::Fire(11, true, false, true, true, true).ID: return 1800;\n\t\t\tcase Fire::Fire(11, true, false, true, true, false).ID: return 1801;\n\t\t\tcase Fire::Fire(11, true, false, true, false, true).ID: return 1802;\n\t\t\tcase Fire::Fire(11, true, false, true, false, false).ID: return 1803;\n\t\t\tcase Fire::Fire(11, true, false, false, true, true).ID: return 1804;\n\t\t\tcase Fire::Fire(11, true, false, false, true, false).ID: return 1805;\n\t\t\tcase Fire::Fire(11, true, false, false, false, true).ID: return 1806;\n\t\t\tcase Fire::Fire(11, true, false, false, false, false).ID: return 1807;\n\t\t\tcase Fire::Fire(11, false, true, true, true, true).ID: return 1808;\n\t\t\tcase Fire::Fire(11, false, true, true, true, false).ID: return 1809;\n\t\t\tcase Fire::Fire(11, false, true, true, false, true).ID: return 1810;\n\t\t\tcase Fire::Fire(11, false, true, true, false, false).ID: return 1811;\n\t\t\tcase Fire::Fire(11, false, true, false, true, true).ID: return 1812;\n\t\t\tcase Fire::Fire(11, false, true, false, true, false).ID: return 1813;\n\t\t\tcase Fire::Fire(11, false, true, false, false, true).ID: return 1814;\n\t\t\tcase Fire::Fire(11, false, true, false, false, false).ID: return 1815;\n\t\t\tcase Fire::Fire(11, false, false, true, true, true).ID: return 1816;\n\t\t\tcase Fire::Fire(11, false, false, true, true, false).ID: return 1817;\n\t\t\tcase Fire::Fire(11, false, false, true, false, true).ID: return 1818;\n\t\t\tcase Fire::Fire(11, false, false, true, false, false).ID: return 1819;\n\t\t\tcase Fire::Fire(11, false, false, false, true, true).ID: return 1820;\n\t\t\tcase Fire::Fire(11, false, false, false, true, false).ID: return 1821;\n\t\t\tcase Fire::Fire(11, false, false, false, false, true).ID: return 1822;\n\t\t\tcase Fire::Fire(11, false, false, false, false, false).ID: return 1823;\n\t\t\tcase Fire::Fire(12, true, true, true, true, true).ID: return 1824;\n\t\t\tcase Fire::Fire(12, true, true, true, true, false).ID: return 1825;\n\t\t\tcase Fire::Fire(12, true, true, true, false, true).ID: return 1826;\n\t\t\tcase Fire::Fire(12, true, true, true, false, false).ID: return 1827;\n\t\t\tcase Fire::Fire(12, true, true, false, true, true).ID: return 1828;\n\t\t\tcase Fire::Fire(12, true, true, false, true, false).ID: return 1829;\n\t\t\tcase Fire::Fire(12, true, true, false, false, true).ID: return 1830;\n\t\t\tcase Fire::Fire(12, true, true, false, false, false).ID: return 1831;\n\t\t\tcase Fire::Fire(12, true, false, true, true, true).ID: return 1832;\n\t\t\tcase Fire::Fire(12, true, false, true, true, false).ID: return 1833;\n\t\t\tcase Fire::Fire(12, true, false, true, false, true).ID: return 1834;\n\t\t\tcase Fire::Fire(12, true, false, true, false, false).ID: return 1835;\n\t\t\tcase Fire::Fire(12, true, false, false, true, true).ID: return 1836;\n\t\t\tcase Fire::Fire(12, true, false, false, true, false).ID: return 1837;\n\t\t\tcase Fire::Fire(12, true, false, false, false, true).ID: return 1838;\n\t\t\tcase Fire::Fire(12, true, false, false, false, false).ID: return 1839;\n\t\t\tcase Fire::Fire(12, false, true, true, true, true).ID: return 1840;\n\t\t\tcase Fire::Fire(12, false, true, true, true, false).ID: return 1841;\n\t\t\tcase Fire::Fire(12, false, true, true, false, true).ID: return 1842;\n\t\t\tcase Fire::Fire(12, false, true, true, false, false).ID: return 1843;\n\t\t\tcase Fire::Fire(12, false, true, false, true, true).ID: return 1844;\n\t\t\tcase Fire::Fire(12, false, true, false, true, false).ID: return 1845;\n\t\t\tcase Fire::Fire(12, false, true, false, false, true).ID: return 1846;\n\t\t\tcase Fire::Fire(12, false, true, false, false, false).ID: return 1847;\n\t\t\tcase Fire::Fire(12, false, false, true, true, true).ID: return 1848;\n\t\t\tcase Fire::Fire(12, false, false, true, true, false).ID: return 1849;\n\t\t\tcase Fire::Fire(12, false, false, true, false, true).ID: return 1850;\n\t\t\tcase Fire::Fire(12, false, false, true, false, false).ID: return 1851;\n\t\t\tcase Fire::Fire(12, false, false, false, true, true).ID: return 1852;\n\t\t\tcase Fire::Fire(12, false, false, false, true, false).ID: return 1853;\n\t\t\tcase Fire::Fire(12, false, false, false, false, true).ID: return 1854;\n\t\t\tcase Fire::Fire(12, false, false, false, false, false).ID: return 1855;\n\t\t\tcase Fire::Fire(13, true, true, true, true, true).ID: return 1856;\n\t\t\tcase Fire::Fire(13, true, true, true, true, false).ID: return 1857;\n\t\t\tcase Fire::Fire(13, true, true, true, false, true).ID: return 1858;\n\t\t\tcase Fire::Fire(13, true, true, true, false, false).ID: return 1859;\n\t\t\tcase Fire::Fire(13, true, true, false, true, true).ID: return 1860;\n\t\t\tcase Fire::Fire(13, true, true, false, true, false).ID: return 1861;\n\t\t\tcase Fire::Fire(13, true, true, false, false, true).ID: return 1862;\n\t\t\tcase Fire::Fire(13, true, true, false, false, false).ID: return 1863;\n\t\t\tcase Fire::Fire(13, true, false, true, true, true).ID: return 1864;\n\t\t\tcase Fire::Fire(13, true, false, true, true, false).ID: return 1865;\n\t\t\tcase Fire::Fire(13, true, false, true, false, true).ID: return 1866;\n\t\t\tcase Fire::Fire(13, true, false, true, false, false).ID: return 1867;\n\t\t\tcase Fire::Fire(13, true, false, false, true, true).ID: return 1868;\n\t\t\tcase Fire::Fire(13, true, false, false, true, false).ID: return 1869;\n\t\t\tcase Fire::Fire(13, true, false, false, false, true).ID: return 1870;\n\t\t\tcase Fire::Fire(13, true, false, false, false, false).ID: return 1871;\n\t\t\tcase Fire::Fire(13, false, true, true, true, true).ID: return 1872;\n\t\t\tcase Fire::Fire(13, false, true, true, true, false).ID: return 1873;\n\t\t\tcase Fire::Fire(13, false, true, true, false, true).ID: return 1874;\n\t\t\tcase Fire::Fire(13, false, true, true, false, false).ID: return 1875;\n\t\t\tcase Fire::Fire(13, false, true, false, true, true).ID: return 1876;\n\t\t\tcase Fire::Fire(13, false, true, false, true, false).ID: return 1877;\n\t\t\tcase Fire::Fire(13, false, true, false, false, true).ID: return 1878;\n\t\t\tcase Fire::Fire(13, false, true, false, false, false).ID: return 1879;\n\t\t\tcase Fire::Fire(13, false, false, true, true, true).ID: return 1880;\n\t\t\tcase Fire::Fire(13, false, false, true, true, false).ID: return 1881;\n\t\t\tcase Fire::Fire(13, false, false, true, false, true).ID: return 1882;\n\t\t\tcase Fire::Fire(13, false, false, true, false, false).ID: return 1883;\n\t\t\tcase Fire::Fire(13, false, false, false, true, true).ID: return 1884;\n\t\t\tcase Fire::Fire(13, false, false, false, true, false).ID: return 1885;\n\t\t\tcase Fire::Fire(13, false, false, false, false, true).ID: return 1886;\n\t\t\tcase Fire::Fire(13, false, false, false, false, false).ID: return 1887;\n\t\t\tcase Fire::Fire(14, true, true, true, true, true).ID: return 1888;\n\t\t\tcase Fire::Fire(14, true, true, true, true, false).ID: return 1889;\n\t\t\tcase Fire::Fire(14, true, true, true, false, true).ID: return 1890;\n\t\t\tcase Fire::Fire(14, true, true, true, false, false).ID: return 1891;\n\t\t\tcase Fire::Fire(14, true, true, false, true, true).ID: return 1892;\n\t\t\tcase Fire::Fire(14, true, true, false, true, false).ID: return 1893;\n\t\t\tcase Fire::Fire(14, true, true, false, false, true).ID: return 1894;\n\t\t\tcase Fire::Fire(14, true, true, false, false, false).ID: return 1895;\n\t\t\tcase Fire::Fire(14, true, false, true, true, true).ID: return 1896;\n\t\t\tcase Fire::Fire(14, true, false, true, true, false).ID: return 1897;\n\t\t\tcase Fire::Fire(14, true, false, true, false, true).ID: return 1898;\n\t\t\tcase Fire::Fire(14, true, false, true, false, false).ID: return 1899;\n\t\t\tcase Fire::Fire(14, true, false, false, true, true).ID: return 1900;\n\t\t\tcase Fire::Fire(14, true, false, false, true, false).ID: return 1901;\n\t\t\tcase Fire::Fire(14, true, false, false, false, true).ID: return 1902;\n\t\t\tcase Fire::Fire(14, true, false, false, false, false).ID: return 1903;\n\t\t\tcase Fire::Fire(14, false, true, true, true, true).ID: return 1904;\n\t\t\tcase Fire::Fire(14, false, true, true, true, false).ID: return 1905;\n\t\t\tcase Fire::Fire(14, false, true, true, false, true).ID: return 1906;\n\t\t\tcase Fire::Fire(14, false, true, true, false, false).ID: return 1907;\n\t\t\tcase Fire::Fire(14, false, true, false, true, true).ID: return 1908;\n\t\t\tcase Fire::Fire(14, false, true, false, true, false).ID: return 1909;\n\t\t\tcase Fire::Fire(14, false, true, false, false, true).ID: return 1910;\n\t\t\tcase Fire::Fire(14, false, true, false, false, false).ID: return 1911;\n\t\t\tcase Fire::Fire(14, false, false, true, true, true).ID: return 1912;\n\t\t\tcase Fire::Fire(14, false, false, true, true, false).ID: return 1913;\n\t\t\tcase Fire::Fire(14, false, false, true, false, true).ID: return 1914;\n\t\t\tcase Fire::Fire(14, false, false, true, false, false).ID: return 1915;\n\t\t\tcase Fire::Fire(14, false, false, false, true, true).ID: return 1916;\n\t\t\tcase Fire::Fire(14, false, false, false, true, false).ID: return 1917;\n\t\t\tcase Fire::Fire(14, false, false, false, false, true).ID: return 1918;\n\t\t\tcase Fire::Fire(14, false, false, false, false, false).ID: return 1919;\n\t\t\tcase Fire::Fire(15, true, true, true, true, true).ID: return 1920;\n\t\t\tcase Fire::Fire(15, true, true, true, true, false).ID: return 1921;\n\t\t\tcase Fire::Fire(15, true, true, true, false, true).ID: return 1922;\n\t\t\tcase Fire::Fire(15, true, true, true, false, false).ID: return 1923;\n\t\t\tcase Fire::Fire(15, true, true, false, true, true).ID: return 1924;\n\t\t\tcase Fire::Fire(15, true, true, false, true, false).ID: return 1925;\n\t\t\tcase Fire::Fire(15, true, true, false, false, true).ID: return 1926;\n\t\t\tcase Fire::Fire(15, true, true, false, false, false).ID: return 1927;\n\t\t\tcase Fire::Fire(15, true, false, true, true, true).ID: return 1928;\n\t\t\tcase Fire::Fire(15, true, false, true, true, false).ID: return 1929;\n\t\t\tcase Fire::Fire(15, true, false, true, false, true).ID: return 1930;\n\t\t\tcase Fire::Fire(15, true, false, true, false, false).ID: return 1931;\n\t\t\tcase Fire::Fire(15, true, false, false, true, true).ID: return 1932;\n\t\t\tcase Fire::Fire(15, true, false, false, true, false).ID: return 1933;\n\t\t\tcase Fire::Fire(15, true, false, false, false, true).ID: return 1934;\n\t\t\tcase Fire::Fire(15, true, false, false, false, false).ID: return 1935;\n\t\t\tcase Fire::Fire(15, false, true, true, true, true).ID: return 1936;\n\t\t\tcase Fire::Fire(15, false, true, true, true, false).ID: return 1937;\n\t\t\tcase Fire::Fire(15, false, true, true, false, true).ID: return 1938;\n\t\t\tcase Fire::Fire(15, false, true, true, false, false).ID: return 1939;\n\t\t\tcase Fire::Fire(15, false, true, false, true, true).ID: return 1940;\n\t\t\tcase Fire::Fire(15, false, true, false, true, false).ID: return 1941;\n\t\t\tcase Fire::Fire(15, false, true, false, false, true).ID: return 1942;\n\t\t\tcase Fire::Fire(15, false, true, false, false, false).ID: return 1943;\n\t\t\tcase Fire::Fire(15, false, false, true, true, true).ID: return 1944;\n\t\t\tcase Fire::Fire(15, false, false, true, true, false).ID: return 1945;\n\t\t\tcase Fire::Fire(15, false, false, true, false, true).ID: return 1946;\n\t\t\tcase Fire::Fire(15, false, false, true, false, false).ID: return 1947;\n\t\t\tcase Fire::Fire(15, false, false, false, true, true).ID: return 1948;\n\t\t\tcase Fire::Fire(15, false, false, false, true, false).ID: return 1949;\n\t\t\tcase Fire::Fire(15, false, false, false, false, true).ID: return 1950;\n\t\t\tcase Fire::Fire(15, false, false, false, false, false).ID: return 1951;\n\t\t\tcase FireCoral::FireCoral().ID: return 9537;\n\t\t\tcase FireCoralBlock::FireCoralBlock().ID: return 9518;\n\t\t\tcase FireCoralFan::FireCoralFan().ID: return 9557;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9625;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9627;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9629;\n\t\t\tcase FireCoralWallFan::FireCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9631;\n\t\t\tcase FletchingTable::FletchingTable().ID: return 14820;\n\t\t\tcase FlowerPot::FlowerPot().ID: return 6305;\n\t\t\tcase FrostedIce::FrostedIce(0).ID: return 9249;\n\t\t\tcase FrostedIce::FrostedIce(1).ID: return 9250;\n\t\t\tcase FrostedIce::FrostedIce(2).ID: return 9251;\n\t\t\tcase FrostedIce::FrostedIce(3).ID: return 9252;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3373;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3374;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3375;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3376;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, true).ID: return 3377;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, false).ID: return 3378;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, true).ID: return 3379;\n\t\t\tcase Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, false).ID: return 3380;\n\t\t\tcase GildedBlackstone::GildedBlackstone().ID: return 16664;\n\t\t\tcase Glass::Glass().ID: return 231;\n\t\t\tcase GlassPane::GlassPane(true, true, true, true).ID: return 4733;\n\t\t\tcase GlassPane::GlassPane(true, true, true, false).ID: return 4734;\n\t\t\tcase GlassPane::GlassPane(true, true, false, true).ID: return 4737;\n\t\t\tcase GlassPane::GlassPane(true, true, false, false).ID: return 4738;\n\t\t\tcase GlassPane::GlassPane(true, false, true, true).ID: return 4741;\n\t\t\tcase GlassPane::GlassPane(true, false, true, false).ID: return 4742;\n\t\t\tcase GlassPane::GlassPane(true, false, false, true).ID: return 4745;\n\t\t\tcase GlassPane::GlassPane(true, false, false, false).ID: return 4746;\n\t\t\tcase GlassPane::GlassPane(false, true, true, true).ID: return 4749;\n\t\t\tcase GlassPane::GlassPane(false, true, true, false).ID: return 4750;\n\t\t\tcase GlassPane::GlassPane(false, true, false, true).ID: return 4753;\n\t\t\tcase GlassPane::GlassPane(false, true, false, false).ID: return 4754;\n\t\t\tcase GlassPane::GlassPane(false, false, true, true).ID: return 4757;\n\t\t\tcase GlassPane::GlassPane(false, false, true, false).ID: return 4758;\n\t\t\tcase GlassPane::GlassPane(false, false, false, true).ID: return 4761;\n\t\t\tcase GlassPane::GlassPane(false, false, false, false).ID: return 4762;\n\t\t\tcase Glowstone::Glowstone().ID: return 4013;\n\t\t\tcase GoldBlock::GoldBlock().ID: return 1427;\n\t\t\tcase GoldOre::GoldOre().ID: return 69;\n\t\t\tcase Granite::Granite().ID: return 2;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Top).ID: return 10838;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Bottom).ID: return 10840;\n\t\t\tcase GraniteSlab::GraniteSlab(GraniteSlab::Type::Double).ID: return 10842;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 10390;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 10392;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 10394;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 10396;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 10398;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 10400;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 10402;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 10404;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 10406;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 10408;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 10410;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 10412;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 10414;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 10416;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 10418;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 10420;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 10422;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 10424;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 10426;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_ZP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 10428;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 10430;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 10432;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 10434;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 10436;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 10438;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 10440;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 10442;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 10444;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 10446;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XM, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 10448;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::Straight).ID: return 10450;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerLeft).ID: return 10452;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::InnerRight).ID: return 10454;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterLeft).ID: return 10456;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Top, GraniteStairs::Shape::OuterRight).ID: return 10458;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::Straight).ID: return 10460;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerLeft).ID: return 10462;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::InnerRight).ID: return 10464;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterLeft).ID: return 10466;\n\t\t\tcase GraniteStairs::GraniteStairs(eBlockFace::BLOCK_FACE_XP, GraniteStairs::Half::Bottom, GraniteStairs::Shape::OuterRight).ID: return 10468;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12166;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12167;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12168;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12172;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12173;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12174;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12178;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12179;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12180;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12184;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12185;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12186;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12190;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12191;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12192;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12196;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12197;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12198;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12202;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12203;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12204;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12208;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12209;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12210;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12214;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12215;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12216;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12220;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12221;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12222;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12226;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12227;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12228;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12232;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12233;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12234;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12238;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12239;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12240;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12244;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12245;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12246;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12250;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12251;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12252;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12256;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12257;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12258;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12262;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12263;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12264;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12268;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12269;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::None, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12270;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12274;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12275;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12276;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12280;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12281;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12282;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12286;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12287;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12288;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12292;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12293;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12294;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12298;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12299;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12300;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12304;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12305;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12306;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12310;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12311;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12312;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12316;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12317;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12318;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12322;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12323;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12324;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12328;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12329;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12330;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12334;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12335;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12336;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12340;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12341;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12342;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12346;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12347;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12348;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12352;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12353;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12354;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12358;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12359;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12360;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12364;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12365;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12366;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12370;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12371;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12372;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12376;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12377;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Low, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12378;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12382;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12383;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12384;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12388;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12389;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12390;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12394;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12395;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12396;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12400;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12401;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12402;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12406;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12407;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12408;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12412;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12413;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::None, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12414;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12418;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12419;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12420;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12424;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12425;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12426;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12430;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12431;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12432;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12436;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12437;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12438;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12442;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12443;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12444;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12448;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12449;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Low, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12450;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::None).ID: return 12454;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::Low).ID: return 12455;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::None, true, GraniteWall::West::Tall).ID: return 12456;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::None).ID: return 12460;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::Low).ID: return 12461;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::None, false, GraniteWall::West::Tall).ID: return 12462;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::None).ID: return 12466;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::Low).ID: return 12467;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Low, true, GraniteWall::West::Tall).ID: return 12468;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::None).ID: return 12472;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::Low).ID: return 12473;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Low, false, GraniteWall::West::Tall).ID: return 12474;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::None).ID: return 12478;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::Low).ID: return 12479;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Tall, true, GraniteWall::West::Tall).ID: return 12480;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::None).ID: return 12484;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::Low).ID: return 12485;\n\t\t\tcase GraniteWall::GraniteWall(GraniteWall::East::Tall, GraniteWall::North::Tall, GraniteWall::South::Tall, false, GraniteWall::West::Tall).ID: return 12486;\n\t\t\tcase Grass::Grass().ID: return 1342;\n\t\t\tcase GrassBlock::GrassBlock(true).ID: return 8;\n\t\t\tcase GrassBlock::GrassBlock(false).ID: return 9;\n\t\t\tcase GrassPath::GrassPath().ID: return 9223;\n\t\t\tcase Gravel::Gravel().ID: return 68;\n\t\t\tcase GrayBanner::GrayBanner(0).ID: return 8009;\n\t\t\tcase GrayBanner::GrayBanner(1).ID: return 8010;\n\t\t\tcase GrayBanner::GrayBanner(2).ID: return 8011;\n\t\t\tcase GrayBanner::GrayBanner(3).ID: return 8012;\n\t\t\tcase GrayBanner::GrayBanner(4).ID: return 8013;\n\t\t\tcase GrayBanner::GrayBanner(5).ID: return 8014;\n\t\t\tcase GrayBanner::GrayBanner(6).ID: return 8015;\n\t\t\tcase GrayBanner::GrayBanner(7).ID: return 8016;\n\t\t\tcase GrayBanner::GrayBanner(8).ID: return 8017;\n\t\t\tcase GrayBanner::GrayBanner(9).ID: return 8018;\n\t\t\tcase GrayBanner::GrayBanner(10).ID: return 8019;\n\t\t\tcase GrayBanner::GrayBanner(11).ID: return 8020;\n\t\t\tcase GrayBanner::GrayBanner(12).ID: return 8021;\n\t\t\tcase GrayBanner::GrayBanner(13).ID: return 8022;\n\t\t\tcase GrayBanner::GrayBanner(14).ID: return 8023;\n\t\t\tcase GrayBanner::GrayBanner(15).ID: return 8024;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Head).ID: return 1161;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, true, GrayBed::Part::Foot).ID: return 1162;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Head).ID: return 1163;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZM, false, GrayBed::Part::Foot).ID: return 1164;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Head).ID: return 1165;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, true, GrayBed::Part::Foot).ID: return 1166;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Head).ID: return 1167;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_ZP, false, GrayBed::Part::Foot).ID: return 1168;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Head).ID: return 1169;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, true, GrayBed::Part::Foot).ID: return 1170;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Head).ID: return 1171;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XM, false, GrayBed::Part::Foot).ID: return 1172;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Head).ID: return 1173;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, true, GrayBed::Part::Foot).ID: return 1174;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Head).ID: return 1175;\n\t\t\tcase GrayBed::GrayBed(eBlockFace::BLOCK_FACE_XP, false, GrayBed::Part::Foot).ID: return 1176;\n\t\t\tcase GrayCarpet::GrayCarpet().ID: return 7873;\n\t\t\tcase GrayConcrete::GrayConcrete().ID: return 9445;\n\t\t\tcase GrayConcretePowder::GrayConcretePowder().ID: return 9461;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9402;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9403;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9404;\n\t\t\tcase GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9405;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9320;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9321;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9322;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9323;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9324;\n\t\t\tcase GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9325;\n\t\t\tcase GrayStainedGlass::GrayStainedGlass().ID: return 4102;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, true).ID: return 7089;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, true, false).ID: return 7090;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, true).ID: return 7093;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, true, false, false).ID: return 7094;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, true).ID: return 7097;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, true, false).ID: return 7098;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, true).ID: return 7101;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(true, false, false, false).ID: return 7102;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, true).ID: return 7105;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, true, false).ID: return 7106;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, true).ID: return 7109;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, true, false, false).ID: return 7110;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, true).ID: return 7113;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, true, false).ID: return 7114;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, true).ID: return 7117;\n\t\t\tcase GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, false).ID: return 7118;\n\t\t\tcase GrayTerracotta::GrayTerracotta().ID: return 6854;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8181;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8182;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8183;\n\t\t\tcase GrayWallBanner::GrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8184;\n\t\t\tcase GrayWool::GrayWool().ID: return 1391;\n\t\t\tcase GreenBanner::GreenBanner(0).ID: return 8105;\n\t\t\tcase GreenBanner::GreenBanner(1).ID: return 8106;\n\t\t\tcase GreenBanner::GreenBanner(2).ID: return 8107;\n\t\t\tcase GreenBanner::GreenBanner(3).ID: return 8108;\n\t\t\tcase GreenBanner::GreenBanner(4).ID: return 8109;\n\t\t\tcase GreenBanner::GreenBanner(5).ID: return 8110;\n\t\t\tcase GreenBanner::GreenBanner(6).ID: return 8111;\n\t\t\tcase GreenBanner::GreenBanner(7).ID: return 8112;\n\t\t\tcase GreenBanner::GreenBanner(8).ID: return 8113;\n\t\t\tcase GreenBanner::GreenBanner(9).ID: return 8114;\n\t\t\tcase GreenBanner::GreenBanner(10).ID: return 8115;\n\t\t\tcase GreenBanner::GreenBanner(11).ID: return 8116;\n\t\t\tcase GreenBanner::GreenBanner(12).ID: return 8117;\n\t\t\tcase GreenBanner::GreenBanner(13).ID: return 8118;\n\t\t\tcase GreenBanner::GreenBanner(14).ID: return 8119;\n\t\t\tcase GreenBanner::GreenBanner(15).ID: return 8120;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Head).ID: return 1257;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, true, GreenBed::Part::Foot).ID: return 1258;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Head).ID: return 1259;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZM, false, GreenBed::Part::Foot).ID: return 1260;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Head).ID: return 1261;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, true, GreenBed::Part::Foot).ID: return 1262;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Head).ID: return 1263;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_ZP, false, GreenBed::Part::Foot).ID: return 1264;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Head).ID: return 1265;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, true, GreenBed::Part::Foot).ID: return 1266;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Head).ID: return 1267;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XM, false, GreenBed::Part::Foot).ID: return 1268;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Head).ID: return 1269;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, true, GreenBed::Part::Foot).ID: return 1270;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Head).ID: return 1271;\n\t\t\tcase GreenBed::GreenBed(eBlockFace::BLOCK_FACE_XP, false, GreenBed::Part::Foot).ID: return 1272;\n\t\t\tcase GreenCarpet::GreenCarpet().ID: return 7879;\n\t\t\tcase GreenConcrete::GreenConcrete().ID: return 9451;\n\t\t\tcase GreenConcretePowder::GreenConcretePowder().ID: return 9467;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9426;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9427;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9428;\n\t\t\tcase GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9429;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9356;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9357;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9358;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9359;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9360;\n\t\t\tcase GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9361;\n\t\t\tcase GreenStainedGlass::GreenStainedGlass().ID: return 4108;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, true).ID: return 7281;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, true, false).ID: return 7282;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, true).ID: return 7285;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, true, false, false).ID: return 7286;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, true).ID: return 7289;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, true, false).ID: return 7290;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, true).ID: return 7293;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(true, false, false, false).ID: return 7294;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, true).ID: return 7297;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, true, false).ID: return 7298;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, true).ID: return 7301;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, true, false, false).ID: return 7302;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, true).ID: return 7305;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, true, false).ID: return 7306;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, true).ID: return 7309;\n\t\t\tcase GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, false).ID: return 7310;\n\t\t\tcase GreenTerracotta::GreenTerracotta().ID: return 6860;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8205;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8206;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8207;\n\t\t\tcase GreenWallBanner::GreenWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8208;\n\t\t\tcase GreenWool::GreenWool().ID: return 1397;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_ZM).ID: return 14821;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_ZP).ID: return 14822;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_XM).ID: return 14823;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Floor, eBlockFace::BLOCK_FACE_XP).ID: return 14824;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_ZM).ID: return 14825;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_ZP).ID: return 14826;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_XM).ID: return 14827;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Wall, eBlockFace::BLOCK_FACE_XP).ID: return 14828;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM).ID: return 14829;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP).ID: return 14830;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_XM).ID: return 14831;\n\t\t\tcase Grindstone::Grindstone(Grindstone::Face::Ceiling, eBlockFace::BLOCK_FACE_XP).ID: return 14832;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::X).ID: return 7863;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Y).ID: return 7864;\n\t\t\tcase HayBale::HayBale(HayBale::Axis::Z).ID: return 7865;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(0).ID: return 6662;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(1).ID: return 6663;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(2).ID: return 6664;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(3).ID: return 6665;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(4).ID: return 6666;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(5).ID: return 6667;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(6).ID: return 6668;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(7).ID: return 6669;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(8).ID: return 6670;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(9).ID: return 6671;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(10).ID: return 6672;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(11).ID: return 6673;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(12).ID: return 6674;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(13).ID: return 6675;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(14).ID: return 6676;\n\t\t\tcase HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(15).ID: return 6677;\n\t\t\tcase HoneyBlock::HoneyBlock().ID: return 15824;\n\t\t\tcase HoneycombBlock::HoneycombBlock().ID: return 15825;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_YM).ID: return 6728;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZM).ID: return 6729;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZP).ID: return 6730;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XM).ID: return 6731;\n\t\t\tcase Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XP).ID: return 6732;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_YM).ID: return 6733;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZM).ID: return 6734;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZP).ID: return 6735;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XM).ID: return 6736;\n\t\t\tcase Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XP).ID: return 6737;\n\t\t\tcase HornCoral::HornCoral().ID: return 9539;\n\t\t\tcase HornCoralBlock::HornCoralBlock().ID: return 9519;\n\t\t\tcase HornCoralFan::HornCoralFan().ID: return 9559;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9633;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9635;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9637;\n\t\t\tcase HornCoralWallFan::HornCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9639;\n\t\t\tcase Ice::Ice().ID: return 3929;\n\t\t\tcase InfestedChiseledStoneBricks::InfestedChiseledStoneBricks().ID: return 4504;\n\t\t\tcase InfestedCobblestone::InfestedCobblestone().ID: return 4500;\n\t\t\tcase InfestedCrackedStoneBricks::InfestedCrackedStoneBricks().ID: return 4503;\n\t\t\tcase InfestedMossyStoneBricks::InfestedMossyStoneBricks().ID: return 4502;\n\t\t\tcase InfestedStone::InfestedStone().ID: return 4499;\n\t\t\tcase InfestedStoneBricks::InfestedStoneBricks().ID: return 4501;\n\t\t\tcase IronBars::IronBars(true, true, true, true).ID: return 4699;\n\t\t\tcase IronBars::IronBars(true, true, true, false).ID: return 4700;\n\t\t\tcase IronBars::IronBars(true, true, false, true).ID: return 4703;\n\t\t\tcase IronBars::IronBars(true, true, false, false).ID: return 4704;\n\t\t\tcase IronBars::IronBars(true, false, true, true).ID: return 4707;\n\t\t\tcase IronBars::IronBars(true, false, true, false).ID: return 4708;\n\t\t\tcase IronBars::IronBars(true, false, false, true).ID: return 4711;\n\t\t\tcase IronBars::IronBars(true, false, false, false).ID: return 4712;\n\t\t\tcase IronBars::IronBars(false, true, true, true).ID: return 4715;\n\t\t\tcase IronBars::IronBars(false, true, true, false).ID: return 4716;\n\t\t\tcase IronBars::IronBars(false, true, false, true).ID: return 4719;\n\t\t\tcase IronBars::IronBars(false, true, false, false).ID: return 4720;\n\t\t\tcase IronBars::IronBars(false, false, true, true).ID: return 4723;\n\t\t\tcase IronBars::IronBars(false, false, true, false).ID: return 4724;\n\t\t\tcase IronBars::IronBars(false, false, false, true).ID: return 4727;\n\t\t\tcase IronBars::IronBars(false, false, false, false).ID: return 4728;\n\t\t\tcase IronBlock::IronBlock().ID: return 1428;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3809;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3810;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3811;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3812;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3813;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3814;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3815;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3816;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3817;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3818;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3819;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3820;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3821;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3822;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3823;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3824;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3825;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3826;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3827;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3828;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3829;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3830;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3831;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3832;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3833;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3834;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3835;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3836;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3837;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3838;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3839;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3840;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3841;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3842;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3843;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3844;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3845;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3846;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3847;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3848;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3849;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3850;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3851;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3852;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3853;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3854;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3855;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3856;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, true).ID: return 3857;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false).ID: return 3858;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true).ID: return 3859;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false).ID: return 3860;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, true).ID: return 3861;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, true, false).ID: return 3862;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true).ID: return 3863;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false).ID: return 3864;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, true).ID: return 3865;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, true, false).ID: return 3866;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, true).ID: return 3867;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Left, false, false).ID: return 3868;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, true).ID: return 3869;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false).ID: return 3870;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, true).ID: return 3871;\n\t\t\tcase IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false).ID: return 3872;\n\t\t\tcase IronOre::IronOre().ID: return 70;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, true).ID: return 7538;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, false).ID: return 7540;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, true).ID: return 7542;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, false).ID: return 7544;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, true).ID: return 7546;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, false).ID: return 7548;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, true).ID: return 7550;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, false).ID: return 7552;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, true).ID: return 7554;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, false).ID: return 7556;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, true).ID: return 7558;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, false).ID: return 7560;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, true).ID: return 7562;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, false).ID: return 7564;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, true).ID: return 7566;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, false).ID: return 7568;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, true).ID: return 7570;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, false).ID: return 7572;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, true).ID: return 7574;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, false).ID: return 7576;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, true).ID: return 7578;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, false).ID: return 7580;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, true).ID: return 7582;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, false).ID: return 7584;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, true).ID: return 7586;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, false).ID: return 7588;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, true).ID: return 7590;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, false).ID: return 7592;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, true).ID: return 7594;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, false).ID: return 7596;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, true).ID: return 7598;\n\t\t\tcase IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, false).ID: return 7600;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZM).ID: return 4020;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZP).ID: return 4021;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XM).ID: return 4022;\n\t\t\tcase JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XP).ID: return 4023;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::DownEast).ID: return 15739;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::DownNorth).ID: return 15740;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::DownSouth).ID: return 15741;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::DownWest).ID: return 15742;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::UpEast).ID: return 15743;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::UpNorth).ID: return 15744;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::UpSouth).ID: return 15745;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::UpWest).ID: return 15746;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::WestUp).ID: return 15747;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::EastUp).ID: return 15748;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::NorthUp).ID: return 15749;\n\t\t\tcase Jigsaw::Jigsaw(Jigsaw::Orientation::SouthUp).ID: return 15750;\n\t\t\tcase Jukebox::Jukebox(true).ID: return 3964;\n\t\t\tcase Jukebox::Jukebox(false).ID: return 3965;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6418;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6419;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6420;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6421;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 6422;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 6423;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 6424;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 6425;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6426;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6427;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6428;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6429;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 6430;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 6431;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 6432;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 6433;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6434;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6435;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6436;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6437;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 6438;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 6439;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 6440;\n\t\t\tcase JungleButton::JungleButton(JungleButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 6441;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8866;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8867;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8868;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8869;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8870;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8871;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8872;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8873;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8874;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8875;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8876;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8877;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8878;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8879;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8880;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8881;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8882;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8883;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8884;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8885;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8886;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8887;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8888;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8889;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8890;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8891;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8892;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8893;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8894;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8895;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8896;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8897;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8898;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8899;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8900;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8901;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8902;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8903;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8904;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8905;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8906;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8907;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8908;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8909;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8910;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8911;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8912;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8913;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, true).ID: return 8914;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, true, false).ID: return 8915;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true).ID: return 8916;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false).ID: return 8917;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, true).ID: return 8918;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, true, false).ID: return 8919;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true).ID: return 8920;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false).ID: return 8921;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, true).ID: return 8922;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, true, false).ID: return 8923;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, true).ID: return 8924;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Left, false, false).ID: return 8925;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, true).ID: return 8926;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false).ID: return 8927;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, true).ID: return 8928;\n\t\t\tcase JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false).ID: return 8929;\n\t\t\tcase JungleFence::JungleFence(true, true, true, true).ID: return 8644;\n\t\t\tcase JungleFence::JungleFence(true, true, true, false).ID: return 8645;\n\t\t\tcase JungleFence::JungleFence(true, true, false, true).ID: return 8648;\n\t\t\tcase JungleFence::JungleFence(true, true, false, false).ID: return 8649;\n\t\t\tcase JungleFence::JungleFence(true, false, true, true).ID: return 8652;\n\t\t\tcase JungleFence::JungleFence(true, false, true, false).ID: return 8653;\n\t\t\tcase JungleFence::JungleFence(true, false, false, true).ID: return 8656;\n\t\t\tcase JungleFence::JungleFence(true, false, false, false).ID: return 8657;\n\t\t\tcase JungleFence::JungleFence(false, true, true, true).ID: return 8660;\n\t\t\tcase JungleFence::JungleFence(false, true, true, false).ID: return 8661;\n\t\t\tcase JungleFence::JungleFence(false, true, false, true).ID: return 8664;\n\t\t\tcase JungleFence::JungleFence(false, true, false, false).ID: return 8665;\n\t\t\tcase JungleFence::JungleFence(false, false, true, true).ID: return 8668;\n\t\t\tcase JungleFence::JungleFence(false, false, true, false).ID: return 8669;\n\t\t\tcase JungleFence::JungleFence(false, false, false, true).ID: return 8672;\n\t\t\tcase JungleFence::JungleFence(false, false, false, false).ID: return 8673;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 8482;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 8483;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 8484;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 8485;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 8486;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 8487;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 8488;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 8489;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 8490;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 8491;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 8492;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 8493;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 8494;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 8495;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 8496;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 8497;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 8498;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 8499;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 8500;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 8501;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 8502;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 8503;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8504;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8505;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8506;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8507;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8508;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8509;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8510;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8511;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8512;\n\t\t\tcase JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8513;\n\t\t\tcase JungleLeaves::JungleLeaves(1, true).ID: return 187;\n\t\t\tcase JungleLeaves::JungleLeaves(1, false).ID: return 188;\n\t\t\tcase JungleLeaves::JungleLeaves(2, true).ID: return 189;\n\t\t\tcase JungleLeaves::JungleLeaves(2, false).ID: return 190;\n\t\t\tcase JungleLeaves::JungleLeaves(3, true).ID: return 191;\n\t\t\tcase JungleLeaves::JungleLeaves(3, false).ID: return 192;\n\t\t\tcase JungleLeaves::JungleLeaves(4, true).ID: return 193;\n\t\t\tcase JungleLeaves::JungleLeaves(4, false).ID: return 194;\n\t\t\tcase JungleLeaves::JungleLeaves(5, true).ID: return 195;\n\t\t\tcase JungleLeaves::JungleLeaves(5, false).ID: return 196;\n\t\t\tcase JungleLeaves::JungleLeaves(6, true).ID: return 197;\n\t\t\tcase JungleLeaves::JungleLeaves(6, false).ID: return 198;\n\t\t\tcase JungleLeaves::JungleLeaves(7, true).ID: return 199;\n\t\t\tcase JungleLeaves::JungleLeaves(7, false).ID: return 200;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::X).ID: return 82;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Y).ID: return 83;\n\t\t\tcase JungleLog::JungleLog(JungleLog::Axis::Z).ID: return 84;\n\t\t\tcase JunglePlanks::JunglePlanks().ID: return 18;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(true).ID: return 3879;\n\t\t\tcase JunglePressurePlate::JunglePressurePlate(false).ID: return 3880;\n\t\t\tcase JungleSapling::JungleSapling(0).ID: return 27;\n\t\t\tcase JungleSapling::JungleSapling(1).ID: return 28;\n\t\t\tcase JungleSign::JungleSign(0).ID: return 3510;\n\t\t\tcase JungleSign::JungleSign(1).ID: return 3512;\n\t\t\tcase JungleSign::JungleSign(2).ID: return 3514;\n\t\t\tcase JungleSign::JungleSign(3).ID: return 3516;\n\t\t\tcase JungleSign::JungleSign(4).ID: return 3518;\n\t\t\tcase JungleSign::JungleSign(5).ID: return 3520;\n\t\t\tcase JungleSign::JungleSign(6).ID: return 3522;\n\t\t\tcase JungleSign::JungleSign(7).ID: return 3524;\n\t\t\tcase JungleSign::JungleSign(8).ID: return 3526;\n\t\t\tcase JungleSign::JungleSign(9).ID: return 3528;\n\t\t\tcase JungleSign::JungleSign(10).ID: return 3530;\n\t\t\tcase JungleSign::JungleSign(11).ID: return 3532;\n\t\t\tcase JungleSign::JungleSign(12).ID: return 3534;\n\t\t\tcase JungleSign::JungleSign(13).ID: return 3536;\n\t\t\tcase JungleSign::JungleSign(14).ID: return 3538;\n\t\t\tcase JungleSign::JungleSign(15).ID: return 3540;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Top).ID: return 8319;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Bottom).ID: return 8321;\n\t\t\tcase JungleSlab::JungleSlab(JungleSlab::Type::Double).ID: return 8323;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5565;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5567;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5569;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5571;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5573;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5575;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5577;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5579;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5581;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5583;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5585;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5587;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5589;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5591;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5593;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5595;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5597;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5599;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5601;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5603;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5605;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5607;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5609;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5611;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5613;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5615;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5617;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5619;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5621;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5623;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::Straight).ID: return 5625;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerLeft).ID: return 5627;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::InnerRight).ID: return 5629;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterLeft).ID: return 5631;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::OuterRight).ID: return 5633;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight).ID: return 5635;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerLeft).ID: return 5637;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::InnerRight).ID: return 5639;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterLeft).ID: return 5641;\n\t\t\tcase JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::OuterRight).ID: return 5643;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, true).ID: return 4304;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, true, false).ID: return 4306;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, true).ID: return 4308;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Top, false, false).ID: return 4310;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, true).ID: return 4312;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, true, false).ID: return 4314;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, true).ID: return 4316;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZM, JungleTrapdoor::Half::Bottom, false, false).ID: return 4318;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, true).ID: return 4320;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, true, false).ID: return 4322;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, true).ID: return 4324;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Top, false, false).ID: return 4326;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, true).ID: return 4328;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, true, false).ID: return 4330;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, true).ID: return 4332;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_ZP, JungleTrapdoor::Half::Bottom, false, false).ID: return 4334;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, true).ID: return 4336;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, true, false).ID: return 4338;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, true).ID: return 4340;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Top, false, false).ID: return 4342;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, true).ID: return 4344;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, true, false).ID: return 4346;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, true).ID: return 4348;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XM, JungleTrapdoor::Half::Bottom, false, false).ID: return 4350;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, true).ID: return 4352;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, true, false).ID: return 4354;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, true).ID: return 4356;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Top, false, false).ID: return 4358;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, true).ID: return 4360;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, true, false).ID: return 4362;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, true).ID: return 4364;\n\t\t\tcase JungleTrapdoor::JungleTrapdoor(eBlockFace::BLOCK_FACE_XP, JungleTrapdoor::Half::Bottom, false, false).ID: return 4366;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3768;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3770;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3772;\n\t\t\tcase JungleWallSign::JungleWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3774;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::X).ID: return 118;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Y).ID: return 119;\n\t\t\tcase JungleWood::JungleWood(JungleWood::Axis::Z).ID: return 120;\n\t\t\tcase Kelp::Kelp(0).ID: return 9470;\n\t\t\tcase Kelp::Kelp(1).ID: return 9471;\n\t\t\tcase Kelp::Kelp(2).ID: return 9472;\n\t\t\tcase Kelp::Kelp(3).ID: return 9473;\n\t\t\tcase Kelp::Kelp(4).ID: return 9474;\n\t\t\tcase Kelp::Kelp(5).ID: return 9475;\n\t\t\tcase Kelp::Kelp(6).ID: return 9476;\n\t\t\tcase Kelp::Kelp(7).ID: return 9477;\n\t\t\tcase Kelp::Kelp(8).ID: return 9478;\n\t\t\tcase Kelp::Kelp(9).ID: return 9479;\n\t\t\tcase Kelp::Kelp(10).ID: return 9480;\n\t\t\tcase Kelp::Kelp(11).ID: return 9481;\n\t\t\tcase Kelp::Kelp(12).ID: return 9482;\n\t\t\tcase Kelp::Kelp(13).ID: return 9483;\n\t\t\tcase Kelp::Kelp(14).ID: return 9484;\n\t\t\tcase Kelp::Kelp(15).ID: return 9485;\n\t\t\tcase Kelp::Kelp(16).ID: return 9486;\n\t\t\tcase Kelp::Kelp(17).ID: return 9487;\n\t\t\tcase Kelp::Kelp(18).ID: return 9488;\n\t\t\tcase Kelp::Kelp(19).ID: return 9489;\n\t\t\tcase Kelp::Kelp(20).ID: return 9490;\n\t\t\tcase Kelp::Kelp(21).ID: return 9491;\n\t\t\tcase Kelp::Kelp(22).ID: return 9492;\n\t\t\tcase Kelp::Kelp(23).ID: return 9493;\n\t\t\tcase Kelp::Kelp(24).ID: return 9494;\n\t\t\tcase Kelp::Kelp(25).ID: return 9495;\n\t\t\tcase KelpPlant::KelpPlant().ID: return 9496;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZM).ID: return 3638;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_ZP).ID: return 3640;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XM).ID: return 3642;\n\t\t\tcase Ladder::Ladder(eBlockFace::BLOCK_FACE_XP).ID: return 3644;\n\t\t\tcase Lantern::Lantern(true).ID: return 14886;\n\t\t\tcase Lantern::Lantern(false).ID: return 14887;\n\t\t\tcase LapisBlock::LapisBlock().ID: return 233;\n\t\t\tcase LapisOre::LapisOre().ID: return 232;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Upper).ID: return 7895;\n\t\t\tcase LargeFern::LargeFern(LargeFern::Half::Lower).ID: return 7896;\n\t\t\tcase Lava::Lava(0).ID: return 50;\n\t\t\tcase Lava::Lava(1).ID: return 51;\n\t\t\tcase Lava::Lava(2).ID: return 52;\n\t\t\tcase Lava::Lava(3).ID: return 53;\n\t\t\tcase Lava::Lava(4).ID: return 54;\n\t\t\tcase Lava::Lava(5).ID: return 55;\n\t\t\tcase Lava::Lava(6).ID: return 56;\n\t\t\tcase Lava::Lava(7).ID: return 57;\n\t\t\tcase Lava::Lava(8).ID: return 58;\n\t\t\tcase Lava::Lava(9).ID: return 59;\n\t\t\tcase Lava::Lava(10).ID: return 60;\n\t\t\tcase Lava::Lava(11).ID: return 61;\n\t\t\tcase Lava::Lava(12).ID: return 62;\n\t\t\tcase Lava::Lava(13).ID: return 63;\n\t\t\tcase Lava::Lava(14).ID: return 64;\n\t\t\tcase Lava::Lava(15).ID: return 65;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 14833;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 14834;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 14835;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 14836;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 14837;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 14838;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 14839;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 14840;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, true, true).ID: return 14841;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, true, false).ID: return 14842;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, false, true).ID: return 14843;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XM, false, false).ID: return 14844;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, true, true).ID: return 14845;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, true, false).ID: return 14846;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, false, true).ID: return 14847;\n\t\t\tcase Lectern::Lectern(eBlockFace::BLOCK_FACE_XP, false, false).ID: return 14848;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3783;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3784;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3785;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3786;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3787;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3788;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3789;\n\t\t\tcase Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3790;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3791;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3792;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3793;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3794;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3795;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3796;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3797;\n\t\t\tcase Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3798;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3799;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3800;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3801;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3802;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3803;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3804;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3805;\n\t\t\tcase Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3806;\n\t\t\tcase LightBlueBanner::LightBlueBanner(0).ID: return 7945;\n\t\t\tcase LightBlueBanner::LightBlueBanner(1).ID: return 7946;\n\t\t\tcase LightBlueBanner::LightBlueBanner(2).ID: return 7947;\n\t\t\tcase LightBlueBanner::LightBlueBanner(3).ID: return 7948;\n\t\t\tcase LightBlueBanner::LightBlueBanner(4).ID: return 7949;\n\t\t\tcase LightBlueBanner::LightBlueBanner(5).ID: return 7950;\n\t\t\tcase LightBlueBanner::LightBlueBanner(6).ID: return 7951;\n\t\t\tcase LightBlueBanner::LightBlueBanner(7).ID: return 7952;\n\t\t\tcase LightBlueBanner::LightBlueBanner(8).ID: return 7953;\n\t\t\tcase LightBlueBanner::LightBlueBanner(9).ID: return 7954;\n\t\t\tcase LightBlueBanner::LightBlueBanner(10).ID: return 7955;\n\t\t\tcase LightBlueBanner::LightBlueBanner(11).ID: return 7956;\n\t\t\tcase LightBlueBanner::LightBlueBanner(12).ID: return 7957;\n\t\t\tcase LightBlueBanner::LightBlueBanner(13).ID: return 7958;\n\t\t\tcase LightBlueBanner::LightBlueBanner(14).ID: return 7959;\n\t\t\tcase LightBlueBanner::LightBlueBanner(15).ID: return 7960;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Head).ID: return 1097;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, true, LightBlueBed::Part::Foot).ID: return 1098;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Head).ID: return 1099;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZM, false, LightBlueBed::Part::Foot).ID: return 1100;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Head).ID: return 1101;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, true, LightBlueBed::Part::Foot).ID: return 1102;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Head).ID: return 1103;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_ZP, false, LightBlueBed::Part::Foot).ID: return 1104;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Head).ID: return 1105;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, true, LightBlueBed::Part::Foot).ID: return 1106;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Head).ID: return 1107;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XM, false, LightBlueBed::Part::Foot).ID: return 1108;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Head).ID: return 1109;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, true, LightBlueBed::Part::Foot).ID: return 1110;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Head).ID: return 1111;\n\t\t\tcase LightBlueBed::LightBlueBed(eBlockFace::BLOCK_FACE_XP, false, LightBlueBed::Part::Foot).ID: return 1112;\n\t\t\tcase LightBlueCarpet::LightBlueCarpet().ID: return 7869;\n\t\t\tcase LightBlueConcrete::LightBlueConcrete().ID: return 9441;\n\t\t\tcase LightBlueConcretePowder::LightBlueConcretePowder().ID: return 9457;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9386;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9387;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9388;\n\t\t\tcase LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9389;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9296;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9297;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9298;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9299;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9300;\n\t\t\tcase LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9301;\n\t\t\tcase LightBlueStainedGlass::LightBlueStainedGlass().ID: return 4098;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, true).ID: return 6961;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, true, false).ID: return 6962;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, true).ID: return 6965;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, true, false, false).ID: return 6966;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, true).ID: return 6969;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, true, false).ID: return 6970;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, true).ID: return 6973;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(true, false, false, false).ID: return 6974;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, true).ID: return 6977;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, true, false).ID: return 6978;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, true).ID: return 6981;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, true, false, false).ID: return 6982;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, true).ID: return 6985;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, true, false).ID: return 6986;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, true).ID: return 6989;\n\t\t\tcase LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, false).ID: return 6990;\n\t\t\tcase LightBlueTerracotta::LightBlueTerracotta().ID: return 6850;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8165;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8166;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8167;\n\t\t\tcase LightBlueWallBanner::LightBlueWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8168;\n\t\t\tcase LightBlueWool::LightBlueWool().ID: return 1387;\n\t\t\tcase LightGrayBanner::LightGrayBanner(0).ID: return 8025;\n\t\t\tcase LightGrayBanner::LightGrayBanner(1).ID: return 8026;\n\t\t\tcase LightGrayBanner::LightGrayBanner(2).ID: return 8027;\n\t\t\tcase LightGrayBanner::LightGrayBanner(3).ID: return 8028;\n\t\t\tcase LightGrayBanner::LightGrayBanner(4).ID: return 8029;\n\t\t\tcase LightGrayBanner::LightGrayBanner(5).ID: return 8030;\n\t\t\tcase LightGrayBanner::LightGrayBanner(6).ID: return 8031;\n\t\t\tcase LightGrayBanner::LightGrayBanner(7).ID: return 8032;\n\t\t\tcase LightGrayBanner::LightGrayBanner(8).ID: return 8033;\n\t\t\tcase LightGrayBanner::LightGrayBanner(9).ID: return 8034;\n\t\t\tcase LightGrayBanner::LightGrayBanner(10).ID: return 8035;\n\t\t\tcase LightGrayBanner::LightGrayBanner(11).ID: return 8036;\n\t\t\tcase LightGrayBanner::LightGrayBanner(12).ID: return 8037;\n\t\t\tcase LightGrayBanner::LightGrayBanner(13).ID: return 8038;\n\t\t\tcase LightGrayBanner::LightGrayBanner(14).ID: return 8039;\n\t\t\tcase LightGrayBanner::LightGrayBanner(15).ID: return 8040;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Head).ID: return 1177;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, true, LightGrayBed::Part::Foot).ID: return 1178;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Head).ID: return 1179;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZM, false, LightGrayBed::Part::Foot).ID: return 1180;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Head).ID: return 1181;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, true, LightGrayBed::Part::Foot).ID: return 1182;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Head).ID: return 1183;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_ZP, false, LightGrayBed::Part::Foot).ID: return 1184;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Head).ID: return 1185;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, true, LightGrayBed::Part::Foot).ID: return 1186;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Head).ID: return 1187;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XM, false, LightGrayBed::Part::Foot).ID: return 1188;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Head).ID: return 1189;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, true, LightGrayBed::Part::Foot).ID: return 1190;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Head).ID: return 1191;\n\t\t\tcase LightGrayBed::LightGrayBed(eBlockFace::BLOCK_FACE_XP, false, LightGrayBed::Part::Foot).ID: return 1192;\n\t\t\tcase LightGrayCarpet::LightGrayCarpet().ID: return 7874;\n\t\t\tcase LightGrayConcrete::LightGrayConcrete().ID: return 9446;\n\t\t\tcase LightGrayConcretePowder::LightGrayConcretePowder().ID: return 9462;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9406;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9407;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9408;\n\t\t\tcase LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9409;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9326;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9327;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9328;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9329;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9330;\n\t\t\tcase LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9331;\n\t\t\tcase LightGrayStainedGlass::LightGrayStainedGlass().ID: return 4103;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, true).ID: return 7121;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, true, false).ID: return 7122;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, true).ID: return 7125;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, true, false, false).ID: return 7126;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, true).ID: return 7129;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, true, false).ID: return 7130;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, true).ID: return 7133;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(true, false, false, false).ID: return 7134;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, true).ID: return 7137;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, true, false).ID: return 7138;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, true).ID: return 7141;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, true, false, false).ID: return 7142;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, true).ID: return 7145;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, true, false).ID: return 7146;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, true).ID: return 7149;\n\t\t\tcase LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, false).ID: return 7150;\n\t\t\tcase LightGrayTerracotta::LightGrayTerracotta().ID: return 6855;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8185;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8186;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8187;\n\t\t\tcase LightGrayWallBanner::LightGrayWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8188;\n\t\t\tcase LightGrayWool::LightGrayWool().ID: return 1392;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(0).ID: return 6646;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(1).ID: return 6647;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(2).ID: return 6648;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(3).ID: return 6649;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(4).ID: return 6650;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(5).ID: return 6651;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(6).ID: return 6652;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(7).ID: return 6653;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(8).ID: return 6654;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(9).ID: return 6655;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(10).ID: return 6656;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(11).ID: return 6657;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(12).ID: return 6658;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(13).ID: return 6659;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(14).ID: return 6660;\n\t\t\tcase LightWeightedPressurePlate::LightWeightedPressurePlate(15).ID: return 6661;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Upper).ID: return 7887;\n\t\t\tcase Lilac::Lilac(Lilac::Half::Lower).ID: return 7888;\n\t\t\tcase LilyOfTheValley::LilyOfTheValley().ID: return 1424;\n\t\t\tcase LilyPad::LilyPad().ID: return 5014;\n\t\t\tcase LimeBanner::LimeBanner(0).ID: return 7977;\n\t\t\tcase LimeBanner::LimeBanner(1).ID: return 7978;\n\t\t\tcase LimeBanner::LimeBanner(2).ID: return 7979;\n\t\t\tcase LimeBanner::LimeBanner(3).ID: return 7980;\n\t\t\tcase LimeBanner::LimeBanner(4).ID: return 7981;\n\t\t\tcase LimeBanner::LimeBanner(5).ID: return 7982;\n\t\t\tcase LimeBanner::LimeBanner(6).ID: return 7983;\n\t\t\tcase LimeBanner::LimeBanner(7).ID: return 7984;\n\t\t\tcase LimeBanner::LimeBanner(8).ID: return 7985;\n\t\t\tcase LimeBanner::LimeBanner(9).ID: return 7986;\n\t\t\tcase LimeBanner::LimeBanner(10).ID: return 7987;\n\t\t\tcase LimeBanner::LimeBanner(11).ID: return 7988;\n\t\t\tcase LimeBanner::LimeBanner(12).ID: return 7989;\n\t\t\tcase LimeBanner::LimeBanner(13).ID: return 7990;\n\t\t\tcase LimeBanner::LimeBanner(14).ID: return 7991;\n\t\t\tcase LimeBanner::LimeBanner(15).ID: return 7992;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Head).ID: return 1129;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, true, LimeBed::Part::Foot).ID: return 1130;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Head).ID: return 1131;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZM, false, LimeBed::Part::Foot).ID: return 1132;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Head).ID: return 1133;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, true, LimeBed::Part::Foot).ID: return 1134;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Head).ID: return 1135;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_ZP, false, LimeBed::Part::Foot).ID: return 1136;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Head).ID: return 1137;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, true, LimeBed::Part::Foot).ID: return 1138;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Head).ID: return 1139;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XM, false, LimeBed::Part::Foot).ID: return 1140;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Head).ID: return 1141;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, true, LimeBed::Part::Foot).ID: return 1142;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Head).ID: return 1143;\n\t\t\tcase LimeBed::LimeBed(eBlockFace::BLOCK_FACE_XP, false, LimeBed::Part::Foot).ID: return 1144;\n\t\t\tcase LimeCarpet::LimeCarpet().ID: return 7871;\n\t\t\tcase LimeConcrete::LimeConcrete().ID: return 9443;\n\t\t\tcase LimeConcretePowder::LimeConcretePowder().ID: return 9459;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9394;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9395;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9396;\n\t\t\tcase LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9397;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9308;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9309;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9310;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9311;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9312;\n\t\t\tcase LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9313;\n\t\t\tcase LimeStainedGlass::LimeStainedGlass().ID: return 4100;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, true).ID: return 7025;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, true, false).ID: return 7026;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, true).ID: return 7029;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, true, false, false).ID: return 7030;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, true).ID: return 7033;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, true, false).ID: return 7034;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, true).ID: return 7037;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(true, false, false, false).ID: return 7038;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, true).ID: return 7041;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, true, false).ID: return 7042;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, true).ID: return 7045;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, true, false, false).ID: return 7046;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, true).ID: return 7049;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, true, false).ID: return 7050;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, true).ID: return 7053;\n\t\t\tcase LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, false).ID: return 7054;\n\t\t\tcase LimeTerracotta::LimeTerracotta().ID: return 6852;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8173;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8174;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8175;\n\t\t\tcase LimeWallBanner::LimeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8176;\n\t\t\tcase LimeWool::LimeWool().ID: return 1389;\n\t\t\tcase Lodestone::Lodestone().ID: return 15838;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_ZM).ID: return 14787;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_ZP).ID: return 14788;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_XM).ID: return 14789;\n\t\t\tcase Loom::Loom(eBlockFace::BLOCK_FACE_XP).ID: return 14790;\n\t\t\tcase MagentaBanner::MagentaBanner(0).ID: return 7929;\n\t\t\tcase MagentaBanner::MagentaBanner(1).ID: return 7930;\n\t\t\tcase MagentaBanner::MagentaBanner(2).ID: return 7931;\n\t\t\tcase MagentaBanner::MagentaBanner(3).ID: return 7932;\n\t\t\tcase MagentaBanner::MagentaBanner(4).ID: return 7933;\n\t\t\tcase MagentaBanner::MagentaBanner(5).ID: return 7934;\n\t\t\tcase MagentaBanner::MagentaBanner(6).ID: return 7935;\n\t\t\tcase MagentaBanner::MagentaBanner(7).ID: return 7936;\n\t\t\tcase MagentaBanner::MagentaBanner(8).ID: return 7937;\n\t\t\tcase MagentaBanner::MagentaBanner(9).ID: return 7938;\n\t\t\tcase MagentaBanner::MagentaBanner(10).ID: return 7939;\n\t\t\tcase MagentaBanner::MagentaBanner(11).ID: return 7940;\n\t\t\tcase MagentaBanner::MagentaBanner(12).ID: return 7941;\n\t\t\tcase MagentaBanner::MagentaBanner(13).ID: return 7942;\n\t\t\tcase MagentaBanner::MagentaBanner(14).ID: return 7943;\n\t\t\tcase MagentaBanner::MagentaBanner(15).ID: return 7944;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Head).ID: return 1081;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, true, MagentaBed::Part::Foot).ID: return 1082;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Head).ID: return 1083;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZM, false, MagentaBed::Part::Foot).ID: return 1084;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Head).ID: return 1085;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, true, MagentaBed::Part::Foot).ID: return 1086;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Head).ID: return 1087;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_ZP, false, MagentaBed::Part::Foot).ID: return 1088;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Head).ID: return 1089;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, true, MagentaBed::Part::Foot).ID: return 1090;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Head).ID: return 1091;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XM, false, MagentaBed::Part::Foot).ID: return 1092;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Head).ID: return 1093;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, true, MagentaBed::Part::Foot).ID: return 1094;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Head).ID: return 1095;\n\t\t\tcase MagentaBed::MagentaBed(eBlockFace::BLOCK_FACE_XP, false, MagentaBed::Part::Foot).ID: return 1096;\n\t\t\tcase MagentaCarpet::MagentaCarpet().ID: return 7868;\n\t\t\tcase MagentaConcrete::MagentaConcrete().ID: return 9440;\n\t\t\tcase MagentaConcretePowder::MagentaConcretePowder().ID: return 9456;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9382;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9383;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9384;\n\t\t\tcase MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9385;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9290;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9291;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9292;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9293;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9294;\n\t\t\tcase MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9295;\n\t\t\tcase MagentaStainedGlass::MagentaStainedGlass().ID: return 4097;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, true).ID: return 6929;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, true, false).ID: return 6930;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, true).ID: return 6933;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, true, false, false).ID: return 6934;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, true).ID: return 6937;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, true, false).ID: return 6938;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, true).ID: return 6941;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(true, false, false, false).ID: return 6942;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, true).ID: return 6945;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, true, false).ID: return 6946;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, true).ID: return 6949;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, true, false, false).ID: return 6950;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, true).ID: return 6953;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, true, false).ID: return 6954;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, true).ID: return 6957;\n\t\t\tcase MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, false).ID: return 6958;\n\t\t\tcase MagentaTerracotta::MagentaTerracotta().ID: return 6849;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8161;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8162;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8163;\n\t\t\tcase MagentaWallBanner::MagentaWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8164;\n\t\t\tcase MagentaWool::MagentaWool().ID: return 1386;\n\t\t\tcase MagmaBlock::MagmaBlock().ID: return 9253;\n\t\t\tcase Melon::Melon().ID: return 4763;\n\t\t\tcase MelonStem::MelonStem(0).ID: return 4780;\n\t\t\tcase MelonStem::MelonStem(1).ID: return 4781;\n\t\t\tcase MelonStem::MelonStem(2).ID: return 4782;\n\t\t\tcase MelonStem::MelonStem(3).ID: return 4783;\n\t\t\tcase MelonStem::MelonStem(4).ID: return 4784;\n\t\t\tcase MelonStem::MelonStem(5).ID: return 4785;\n\t\t\tcase MelonStem::MelonStem(6).ID: return 4786;\n\t\t\tcase MelonStem::MelonStem(7).ID: return 4787;\n\t\t\tcase MossyCobblestone::MossyCobblestone().ID: return 1433;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Top).ID: return 10814;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Bottom).ID: return 10816;\n\t\t\tcase MossyCobblestoneSlab::MossyCobblestoneSlab(MossyCobblestoneSlab::Type::Double).ID: return 10818;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 9990;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 9992;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 9994;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 9996;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 9998;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 10000;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 10002;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 10004;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 10006;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 10008;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 10010;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 10012;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 10014;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 10016;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 10018;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 10020;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 10022;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 10024;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 10026;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 10028;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 10030;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 10032;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 10034;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 10036;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 10038;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 10040;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 10042;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 10044;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 10046;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XM, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 10048;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::Straight).ID: return 10050;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 10052;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::InnerRight).ID: return 10054;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 10056;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Top, MossyCobblestoneStairs::Shape::OuterRight).ID: return 10058;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::Straight).ID: return 10060;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerLeft).ID: return 10062;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::InnerRight).ID: return 10064;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterLeft).ID: return 10066;\n\t\t\tcase MossyCobblestoneStairs::MossyCobblestoneStairs(eBlockFace::BLOCK_FACE_XP, MossyCobblestoneStairs::Half::Bottom, MossyCobblestoneStairs::Shape::OuterRight).ID: return 10068;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 5984;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 5985;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 5986;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 5990;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 5991;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 5992;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 5996;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 5997;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 5998;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6002;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6003;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6004;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6008;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6009;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6010;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6014;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6015;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6016;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 6020;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 6021;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 6022;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 6026;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 6027;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 6028;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 6032;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 6033;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 6034;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6038;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6039;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6040;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6044;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6045;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6046;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6050;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6051;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6052;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 6056;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 6057;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 6058;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 6062;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 6063;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 6064;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 6068;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 6069;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 6070;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6074;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6075;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6076;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6080;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6081;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6082;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6086;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6087;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6088;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 6092;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 6093;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 6094;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 6098;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 6099;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 6100;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 6104;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 6105;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 6106;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6110;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6111;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6112;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6116;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6117;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6118;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6122;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6123;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6124;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 6128;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 6129;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 6130;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 6134;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 6135;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 6136;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 6140;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 6141;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 6142;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6146;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6147;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6148;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6152;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6153;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6154;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6158;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6159;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6160;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 6164;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 6165;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 6166;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 6170;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 6171;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 6172;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 6176;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 6177;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 6178;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6182;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6183;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6184;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6188;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6189;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6190;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6194;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6195;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Low, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6196;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 6200;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 6201;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 6202;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 6206;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 6207;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 6208;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 6212;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 6213;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 6214;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6218;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6219;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6220;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6224;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6225;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6226;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6230;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6231;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6232;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 6236;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 6237;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 6238;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 6242;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 6243;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 6244;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 6248;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 6249;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 6250;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6254;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6255;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6256;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6260;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6261;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6262;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6266;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6267;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Low, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6268;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None).ID: return 6272;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Low).ID: return 6273;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::Tall).ID: return 6274;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::None).ID: return 6278;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Low).ID: return 6279;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::None, false, MossyCobblestoneWall::West::Tall).ID: return 6280;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::None).ID: return 6284;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Low).ID: return 6285;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, true, MossyCobblestoneWall::West::Tall).ID: return 6286;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::None).ID: return 6290;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Low).ID: return 6291;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Low, false, MossyCobblestoneWall::West::Tall).ID: return 6292;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::None).ID: return 6296;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Low).ID: return 6297;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, true, MossyCobblestoneWall::West::Tall).ID: return 6298;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::None).ID: return 6302;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Low).ID: return 6303;\n\t\t\tcase MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::Tall, MossyCobblestoneWall::North::Tall, MossyCobblestoneWall::South::Tall, false, MossyCobblestoneWall::West::Tall).ID: return 6304;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Top).ID: return 10802;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Bottom).ID: return 10804;\n\t\t\tcase MossyStoneBrickSlab::MossyStoneBrickSlab(MossyStoneBrickSlab::Type::Double).ID: return 10806;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9830;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9832;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9834;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9836;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9838;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9840;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9842;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9844;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9846;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9848;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9850;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9852;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9854;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9856;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9858;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9860;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9862;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9864;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9866;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9868;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9870;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9872;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9874;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9876;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9878;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9880;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9882;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9884;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9886;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XM, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9888;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::Straight).ID: return 9890;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9892;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9894;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9896;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Top, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9898;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::Straight).ID: return 9900;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerLeft).ID: return 9902;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::InnerRight).ID: return 9904;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterLeft).ID: return 9906;\n\t\t\tcase MossyStoneBrickStairs::MossyStoneBrickStairs(eBlockFace::BLOCK_FACE_XP, MossyStoneBrickStairs::Half::Bottom, MossyStoneBrickStairs::Shape::OuterRight).ID: return 9908;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 11842;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 11843;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 11844;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 11848;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 11849;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 11850;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 11854;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 11855;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 11856;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 11860;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 11861;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 11862;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 11866;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 11867;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 11868;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 11872;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 11873;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 11874;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 11878;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 11879;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 11880;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 11884;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 11885;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 11886;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 11890;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 11891;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 11892;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 11896;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 11897;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 11898;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 11902;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 11903;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 11904;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 11908;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 11909;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 11910;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 11914;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 11915;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 11916;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 11920;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 11921;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 11922;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 11926;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 11927;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 11928;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 11932;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 11933;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 11934;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 11938;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 11939;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 11940;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 11944;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 11945;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::None, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 11946;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 11950;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 11951;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 11952;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 11956;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 11957;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 11958;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 11962;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 11963;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 11964;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 11968;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 11969;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 11970;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 11974;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 11975;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 11976;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 11980;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 11981;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 11982;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 11986;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 11987;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 11988;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 11992;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 11993;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 11994;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 11998;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 11999;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 12000;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 12004;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 12005;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 12006;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 12010;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 12011;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 12012;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 12016;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 12017;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 12018;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 12022;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 12023;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 12024;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 12028;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 12029;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 12030;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 12034;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 12035;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 12036;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 12040;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 12041;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 12042;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 12046;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 12047;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 12048;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 12052;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 12053;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Low, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 12054;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 12058;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 12059;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 12060;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 12064;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 12065;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 12066;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 12070;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 12071;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 12072;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 12076;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 12077;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 12078;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 12082;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 12083;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 12084;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 12088;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 12089;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::None, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 12090;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 12094;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 12095;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 12096;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 12100;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 12101;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 12102;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 12106;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 12107;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 12108;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 12112;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 12113;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 12114;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 12118;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 12119;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 12120;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 12124;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 12125;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Low, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 12126;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::None).ID: return 12130;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Low).ID: return 12131;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, true, MossyStoneBrickWall::West::Tall).ID: return 12132;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::None).ID: return 12136;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Low).ID: return 12137;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::None, false, MossyStoneBrickWall::West::Tall).ID: return 12138;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::None).ID: return 12142;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Low).ID: return 12143;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, true, MossyStoneBrickWall::West::Tall).ID: return 12144;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::None).ID: return 12148;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Low).ID: return 12149;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Low, false, MossyStoneBrickWall::West::Tall).ID: return 12150;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::None).ID: return 12154;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Low).ID: return 12155;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, true, MossyStoneBrickWall::West::Tall).ID: return 12156;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::None).ID: return 12160;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Low).ID: return 12161;\n\t\t\tcase MossyStoneBrickWall::MossyStoneBrickWall(MossyStoneBrickWall::East::Tall, MossyStoneBrickWall::North::Tall, MossyStoneBrickWall::South::Tall, false, MossyStoneBrickWall::West::Tall).ID: return 12162;\n\t\t\tcase MossyStoneBricks::MossyStoneBricks().ID: return 4496;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Normal).ID: return 1400;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Sticky).ID: return 1401;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Normal).ID: return 1402;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Sticky).ID: return 1403;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Normal).ID: return 1404;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Sticky).ID: return 1405;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Normal).ID: return 1406;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Sticky).ID: return 1407;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Normal).ID: return 1408;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Sticky).ID: return 1409;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Normal).ID: return 1410;\n\t\t\tcase MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Sticky).ID: return 1411;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, true).ID: return 4633;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, true, false).ID: return 4634;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, true).ID: return 4635;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, true, false, false).ID: return 4636;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, true).ID: return 4637;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, true, false).ID: return 4638;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, true).ID: return 4639;\n\t\t\tcase MushroomStem::MushroomStem(true, true, true, false, false, false).ID: return 4640;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, true).ID: return 4641;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, true, false).ID: return 4642;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, true).ID: return 4643;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, true, false, false).ID: return 4644;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, true).ID: return 4645;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, true, false).ID: return 4646;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, true).ID: return 4647;\n\t\t\tcase MushroomStem::MushroomStem(true, true, false, false, false, false).ID: return 4648;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, true).ID: return 4649;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, true, false).ID: return 4650;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, true).ID: return 4651;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, true, false, false).ID: return 4652;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, true).ID: return 4653;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, true, false).ID: return 4654;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, true).ID: return 4655;\n\t\t\tcase MushroomStem::MushroomStem(true, false, true, false, false, false).ID: return 4656;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, true).ID: return 4657;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, true, false).ID: return 4658;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, true).ID: return 4659;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, true, false, false).ID: return 4660;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, true).ID: return 4661;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, true, false).ID: return 4662;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, true).ID: return 4663;\n\t\t\tcase MushroomStem::MushroomStem(true, false, false, false, false, false).ID: return 4664;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, true).ID: return 4665;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, true, false).ID: return 4666;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, true).ID: return 4667;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, true, false, false).ID: return 4668;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, true).ID: return 4669;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, true, false).ID: return 4670;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, true).ID: return 4671;\n\t\t\tcase MushroomStem::MushroomStem(false, true, true, false, false, false).ID: return 4672;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, true).ID: return 4673;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, true, false).ID: return 4674;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, true).ID: return 4675;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, true, false, false).ID: return 4676;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, true).ID: return 4677;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, true, false).ID: return 4678;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, true).ID: return 4679;\n\t\t\tcase MushroomStem::MushroomStem(false, true, false, false, false, false).ID: return 4680;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, true).ID: return 4681;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, true, false).ID: return 4682;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, true).ID: return 4683;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, true, false, false).ID: return 4684;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, true).ID: return 4685;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, true, false).ID: return 4686;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, true).ID: return 4687;\n\t\t\tcase MushroomStem::MushroomStem(false, false, true, false, false, false).ID: return 4688;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, true).ID: return 4689;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, true, false).ID: return 4690;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, true).ID: return 4691;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, true, false, false).ID: return 4692;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, true).ID: return 4693;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, true, false).ID: return 4694;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, true).ID: return 4695;\n\t\t\tcase MushroomStem::MushroomStem(false, false, false, false, false, false).ID: return 4696;\n\t\t\tcase Mycelium::Mycelium(true).ID: return 5012;\n\t\t\tcase Mycelium::Mycelium(false).ID: return 5013;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, true).ID: return 5018;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, true, false).ID: return 5019;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, true).ID: return 5022;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, true, false, false).ID: return 5023;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, true).ID: return 5026;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, true, false).ID: return 5027;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, true).ID: return 5030;\n\t\t\tcase NetherBrickFence::NetherBrickFence(true, false, false, false).ID: return 5031;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, true).ID: return 5034;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, true, false).ID: return 5035;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, true).ID: return 5038;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, true, false, false).ID: return 5039;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, true).ID: return 5042;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, true, false).ID: return 5043;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, true).ID: return 5046;\n\t\t\tcase NetherBrickFence::NetherBrickFence(false, false, false, false).ID: return 5047;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Top).ID: return 8385;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Bottom).ID: return 8387;\n\t\t\tcase NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Double).ID: return 8389;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5049;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5051;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5053;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5055;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5057;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5059;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5061;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5063;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5065;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5067;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5069;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5071;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5073;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5075;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5077;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5079;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5081;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5083;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5085;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5087;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5089;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5091;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5093;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5095;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5097;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5099;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5101;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5103;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5105;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5107;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight).ID: return 5109;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerLeft).ID: return 5111;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::InnerRight).ID: return 5113;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterLeft).ID: return 5115;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::OuterRight).ID: return 5117;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight).ID: return 5119;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerLeft).ID: return 5121;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::InnerRight).ID: return 5123;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterLeft).ID: return 5125;\n\t\t\tcase NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::OuterRight).ID: return 5127;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 12814;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 12815;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 12816;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 12820;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 12821;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 12822;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 12826;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 12827;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 12828;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 12832;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 12833;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 12834;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 12838;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 12839;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 12840;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 12844;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 12845;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 12846;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 12850;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 12851;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 12852;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 12856;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 12857;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 12858;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 12862;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 12863;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 12864;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 12868;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 12869;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 12870;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 12874;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 12875;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 12876;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 12880;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 12881;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 12882;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 12886;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 12887;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 12888;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 12892;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 12893;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 12894;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 12898;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 12899;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 12900;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 12904;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 12905;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 12906;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 12910;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 12911;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 12912;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 12916;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 12917;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::None, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 12918;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 12922;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 12923;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 12924;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 12928;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 12929;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 12930;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 12934;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 12935;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 12936;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 12940;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 12941;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 12942;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 12946;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 12947;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 12948;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 12952;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 12953;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 12954;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 12958;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 12959;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 12960;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 12964;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 12965;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 12966;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 12970;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 12971;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 12972;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 12976;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 12977;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 12978;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 12982;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 12983;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 12984;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 12988;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 12989;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 12990;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 12994;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 12995;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 12996;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 13000;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 13001;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 13002;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 13006;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 13007;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 13008;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 13012;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 13013;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 13014;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 13018;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 13019;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 13020;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 13024;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 13025;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Low, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 13026;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 13030;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 13031;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 13032;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 13036;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 13037;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 13038;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 13042;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 13043;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 13044;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 13048;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 13049;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 13050;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 13054;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 13055;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 13056;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 13060;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 13061;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::None, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 13062;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 13066;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 13067;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 13068;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 13072;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 13073;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 13074;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 13078;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 13079;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 13080;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 13084;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 13085;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 13086;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 13090;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 13091;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 13092;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 13096;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 13097;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Low, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 13098;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::None).ID: return 13102;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::Low).ID: return 13103;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::None, true, NetherBrickWall::West::Tall).ID: return 13104;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::None).ID: return 13108;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::Low).ID: return 13109;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::None, false, NetherBrickWall::West::Tall).ID: return 13110;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::None).ID: return 13114;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::Low).ID: return 13115;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, true, NetherBrickWall::West::Tall).ID: return 13116;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::None).ID: return 13120;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::Low).ID: return 13121;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Low, false, NetherBrickWall::West::Tall).ID: return 13122;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::None).ID: return 13126;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Low).ID: return 13127;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, true, NetherBrickWall::West::Tall).ID: return 13128;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::None).ID: return 13132;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Low).ID: return 13133;\n\t\t\tcase NetherBrickWall::NetherBrickWall(NetherBrickWall::East::Tall, NetherBrickWall::North::Tall, NetherBrickWall::South::Tall, false, NetherBrickWall::West::Tall).ID: return 13134;\n\t\t\tcase NetherBricks::NetherBricks().ID: return 5015;\n\t\t\tcase NetherGoldOre::NetherGoldOre().ID: return 72;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::X).ID: return 4014;\n\t\t\tcase NetherPortal::NetherPortal(NetherPortal::Axis::Z).ID: return 4015;\n\t\t\tcase NetherQuartzOre::NetherQuartzOre().ID: return 6727;\n\t\t\tcase NetherSprouts::NetherSprouts().ID: return 14974;\n\t\t\tcase NetherWart::NetherWart(0).ID: return 5128;\n\t\t\tcase NetherWart::NetherWart(1).ID: return 5129;\n\t\t\tcase NetherWart::NetherWart(2).ID: return 5130;\n\t\t\tcase NetherWart::NetherWart(3).ID: return 5131;\n\t\t\tcase NetherWartBlock::NetherWartBlock().ID: return 9254;\n\t\t\tcase NetheriteBlock::NetheriteBlock().ID: return 15826;\n\t\t\tcase Netherrack::Netherrack().ID: return 3999;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, true).ID: return 249;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 0, false).ID: return 250;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, true).ID: return 251;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 1, false).ID: return 252;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, true).ID: return 253;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 2, false).ID: return 254;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, true).ID: return 255;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 3, false).ID: return 256;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, true).ID: return 257;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 4, false).ID: return 258;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, true).ID: return 259;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 5, false).ID: return 260;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, true).ID: return 261;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 6, false).ID: return 262;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, true).ID: return 263;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 7, false).ID: return 264;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, true).ID: return 265;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 8, false).ID: return 266;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, true).ID: return 267;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 9, false).ID: return 268;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, true).ID: return 269;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 10, false).ID: return 270;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, true).ID: return 271;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 11, false).ID: return 272;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, true).ID: return 273;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 12, false).ID: return 274;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, true).ID: return 275;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 13, false).ID: return 276;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, true).ID: return 277;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 14, false).ID: return 278;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, true).ID: return 279;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 15, false).ID: return 280;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, true).ID: return 281;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 16, false).ID: return 282;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, true).ID: return 283;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 17, false).ID: return 284;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, true).ID: return 285;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 18, false).ID: return 286;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, true).ID: return 287;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 19, false).ID: return 288;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, true).ID: return 289;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 20, false).ID: return 290;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, true).ID: return 291;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 21, false).ID: return 292;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, true).ID: return 293;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 22, false).ID: return 294;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, true).ID: return 295;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 23, false).ID: return 296;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, true).ID: return 297;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Harp, 24, false).ID: return 298;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, true).ID: return 299;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 0, false).ID: return 300;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, true).ID: return 301;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 1, false).ID: return 302;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, true).ID: return 303;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 2, false).ID: return 304;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, true).ID: return 305;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 3, false).ID: return 306;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, true).ID: return 307;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 4, false).ID: return 308;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, true).ID: return 309;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 5, false).ID: return 310;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, true).ID: return 311;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 6, false).ID: return 312;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, true).ID: return 313;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 7, false).ID: return 314;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, true).ID: return 315;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 8, false).ID: return 316;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, true).ID: return 317;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 9, false).ID: return 318;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, true).ID: return 319;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 10, false).ID: return 320;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, true).ID: return 321;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 11, false).ID: return 322;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, true).ID: return 323;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 12, false).ID: return 324;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, true).ID: return 325;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 13, false).ID: return 326;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, true).ID: return 327;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 14, false).ID: return 328;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, true).ID: return 329;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 15, false).ID: return 330;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, true).ID: return 331;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 16, false).ID: return 332;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, true).ID: return 333;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 17, false).ID: return 334;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, true).ID: return 335;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 18, false).ID: return 336;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, true).ID: return 337;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 19, false).ID: return 338;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, true).ID: return 339;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 20, false).ID: return 340;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, true).ID: return 341;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 21, false).ID: return 342;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, true).ID: return 343;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 22, false).ID: return 344;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, true).ID: return 345;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 23, false).ID: return 346;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, true).ID: return 347;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Basedrum, 24, false).ID: return 348;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, true).ID: return 349;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 0, false).ID: return 350;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, true).ID: return 351;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 1, false).ID: return 352;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, true).ID: return 353;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 2, false).ID: return 354;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, true).ID: return 355;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 3, false).ID: return 356;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, true).ID: return 357;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 4, false).ID: return 358;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, true).ID: return 359;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 5, false).ID: return 360;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, true).ID: return 361;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 6, false).ID: return 362;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, true).ID: return 363;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 7, false).ID: return 364;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, true).ID: return 365;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 8, false).ID: return 366;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, true).ID: return 367;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 9, false).ID: return 368;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, true).ID: return 369;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 10, false).ID: return 370;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, true).ID: return 371;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 11, false).ID: return 372;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, true).ID: return 373;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 12, false).ID: return 374;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, true).ID: return 375;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 13, false).ID: return 376;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, true).ID: return 377;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 14, false).ID: return 378;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, true).ID: return 379;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 15, false).ID: return 380;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, true).ID: return 381;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 16, false).ID: return 382;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, true).ID: return 383;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 17, false).ID: return 384;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, true).ID: return 385;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 18, false).ID: return 386;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, true).ID: return 387;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 19, false).ID: return 388;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, true).ID: return 389;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 20, false).ID: return 390;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, true).ID: return 391;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 21, false).ID: return 392;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, true).ID: return 393;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 22, false).ID: return 394;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, true).ID: return 395;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 23, false).ID: return 396;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, true).ID: return 397;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Snare, 24, false).ID: return 398;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, true).ID: return 399;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 0, false).ID: return 400;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, true).ID: return 401;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 1, false).ID: return 402;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, true).ID: return 403;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 2, false).ID: return 404;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, true).ID: return 405;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 3, false).ID: return 406;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, true).ID: return 407;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 4, false).ID: return 408;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, true).ID: return 409;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 5, false).ID: return 410;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, true).ID: return 411;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 6, false).ID: return 412;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, true).ID: return 413;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 7, false).ID: return 414;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, true).ID: return 415;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 8, false).ID: return 416;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, true).ID: return 417;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 9, false).ID: return 418;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, true).ID: return 419;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 10, false).ID: return 420;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, true).ID: return 421;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 11, false).ID: return 422;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, true).ID: return 423;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 12, false).ID: return 424;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, true).ID: return 425;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 13, false).ID: return 426;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, true).ID: return 427;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 14, false).ID: return 428;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, true).ID: return 429;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 15, false).ID: return 430;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, true).ID: return 431;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 16, false).ID: return 432;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, true).ID: return 433;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 17, false).ID: return 434;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, true).ID: return 435;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 18, false).ID: return 436;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, true).ID: return 437;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 19, false).ID: return 438;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, true).ID: return 439;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 20, false).ID: return 440;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, true).ID: return 441;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 21, false).ID: return 442;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, true).ID: return 443;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 22, false).ID: return 444;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, true).ID: return 445;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 23, false).ID: return 446;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, true).ID: return 447;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Hat, 24, false).ID: return 448;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, true).ID: return 449;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 0, false).ID: return 450;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, true).ID: return 451;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 1, false).ID: return 452;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, true).ID: return 453;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 2, false).ID: return 454;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, true).ID: return 455;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 3, false).ID: return 456;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, true).ID: return 457;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 4, false).ID: return 458;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, true).ID: return 459;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 5, false).ID: return 460;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, true).ID: return 461;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 6, false).ID: return 462;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, true).ID: return 463;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 7, false).ID: return 464;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, true).ID: return 465;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 8, false).ID: return 466;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, true).ID: return 467;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 9, false).ID: return 468;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, true).ID: return 469;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 10, false).ID: return 470;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, true).ID: return 471;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 11, false).ID: return 472;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, true).ID: return 473;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 12, false).ID: return 474;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, true).ID: return 475;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 13, false).ID: return 476;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, true).ID: return 477;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 14, false).ID: return 478;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, true).ID: return 479;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 15, false).ID: return 480;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, true).ID: return 481;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 16, false).ID: return 482;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, true).ID: return 483;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 17, false).ID: return 484;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, true).ID: return 485;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 18, false).ID: return 486;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, true).ID: return 487;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 19, false).ID: return 488;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, true).ID: return 489;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 20, false).ID: return 490;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, true).ID: return 491;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 21, false).ID: return 492;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, true).ID: return 493;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 22, false).ID: return 494;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, true).ID: return 495;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 23, false).ID: return 496;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, true).ID: return 497;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bass, 24, false).ID: return 498;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, true).ID: return 499;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 0, false).ID: return 500;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, true).ID: return 501;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 1, false).ID: return 502;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, true).ID: return 503;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 2, false).ID: return 504;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, true).ID: return 505;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 3, false).ID: return 506;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, true).ID: return 507;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 4, false).ID: return 508;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, true).ID: return 509;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 5, false).ID: return 510;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, true).ID: return 511;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 6, false).ID: return 512;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, true).ID: return 513;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 7, false).ID: return 514;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, true).ID: return 515;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 8, false).ID: return 516;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, true).ID: return 517;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 9, false).ID: return 518;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, true).ID: return 519;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 10, false).ID: return 520;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, true).ID: return 521;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 11, false).ID: return 522;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, true).ID: return 523;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 12, false).ID: return 524;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, true).ID: return 525;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 13, false).ID: return 526;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, true).ID: return 527;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 14, false).ID: return 528;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, true).ID: return 529;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 15, false).ID: return 530;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, true).ID: return 531;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 16, false).ID: return 532;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, true).ID: return 533;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 17, false).ID: return 534;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, true).ID: return 535;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 18, false).ID: return 536;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, true).ID: return 537;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 19, false).ID: return 538;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, true).ID: return 539;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 20, false).ID: return 540;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, true).ID: return 541;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 21, false).ID: return 542;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, true).ID: return 543;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 22, false).ID: return 544;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, true).ID: return 545;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 23, false).ID: return 546;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, true).ID: return 547;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Flute, 24, false).ID: return 548;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, true).ID: return 549;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 0, false).ID: return 550;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, true).ID: return 551;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 1, false).ID: return 552;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, true).ID: return 553;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 2, false).ID: return 554;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, true).ID: return 555;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 3, false).ID: return 556;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, true).ID: return 557;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 4, false).ID: return 558;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, true).ID: return 559;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 5, false).ID: return 560;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, true).ID: return 561;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 6, false).ID: return 562;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, true).ID: return 563;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 7, false).ID: return 564;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, true).ID: return 565;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 8, false).ID: return 566;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, true).ID: return 567;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 9, false).ID: return 568;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, true).ID: return 569;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 10, false).ID: return 570;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, true).ID: return 571;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 11, false).ID: return 572;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, true).ID: return 573;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 12, false).ID: return 574;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, true).ID: return 575;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 13, false).ID: return 576;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, true).ID: return 577;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 14, false).ID: return 578;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, true).ID: return 579;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 15, false).ID: return 580;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, true).ID: return 581;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 16, false).ID: return 582;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, true).ID: return 583;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 17, false).ID: return 584;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, true).ID: return 585;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 18, false).ID: return 586;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, true).ID: return 587;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 19, false).ID: return 588;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, true).ID: return 589;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 20, false).ID: return 590;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, true).ID: return 591;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 21, false).ID: return 592;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, true).ID: return 593;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 22, false).ID: return 594;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, true).ID: return 595;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 23, false).ID: return 596;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, true).ID: return 597;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bell, 24, false).ID: return 598;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, true).ID: return 599;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 0, false).ID: return 600;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, true).ID: return 601;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 1, false).ID: return 602;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, true).ID: return 603;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 2, false).ID: return 604;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, true).ID: return 605;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 3, false).ID: return 606;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, true).ID: return 607;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 4, false).ID: return 608;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, true).ID: return 609;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 5, false).ID: return 610;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, true).ID: return 611;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 6, false).ID: return 612;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, true).ID: return 613;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 7, false).ID: return 614;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, true).ID: return 615;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 8, false).ID: return 616;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, true).ID: return 617;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 9, false).ID: return 618;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, true).ID: return 619;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 10, false).ID: return 620;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, true).ID: return 621;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 11, false).ID: return 622;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, true).ID: return 623;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 12, false).ID: return 624;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, true).ID: return 625;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 13, false).ID: return 626;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, true).ID: return 627;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 14, false).ID: return 628;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, true).ID: return 629;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 15, false).ID: return 630;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, true).ID: return 631;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 16, false).ID: return 632;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, true).ID: return 633;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 17, false).ID: return 634;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, true).ID: return 635;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 18, false).ID: return 636;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, true).ID: return 637;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 19, false).ID: return 638;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, true).ID: return 639;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 20, false).ID: return 640;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, true).ID: return 641;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 21, false).ID: return 642;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, true).ID: return 643;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 22, false).ID: return 644;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, true).ID: return 645;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 23, false).ID: return 646;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, true).ID: return 647;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Guitar, 24, false).ID: return 648;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, true).ID: return 649;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 0, false).ID: return 650;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, true).ID: return 651;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 1, false).ID: return 652;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, true).ID: return 653;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 2, false).ID: return 654;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, true).ID: return 655;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 3, false).ID: return 656;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, true).ID: return 657;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 4, false).ID: return 658;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, true).ID: return 659;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 5, false).ID: return 660;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, true).ID: return 661;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 6, false).ID: return 662;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, true).ID: return 663;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 7, false).ID: return 664;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, true).ID: return 665;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 8, false).ID: return 666;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, true).ID: return 667;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 9, false).ID: return 668;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, true).ID: return 669;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 10, false).ID: return 670;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, true).ID: return 671;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 11, false).ID: return 672;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, true).ID: return 673;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 12, false).ID: return 674;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, true).ID: return 675;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 13, false).ID: return 676;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, true).ID: return 677;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 14, false).ID: return 678;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, true).ID: return 679;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 15, false).ID: return 680;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, true).ID: return 681;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 16, false).ID: return 682;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, true).ID: return 683;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 17, false).ID: return 684;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, true).ID: return 685;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 18, false).ID: return 686;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, true).ID: return 687;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 19, false).ID: return 688;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, true).ID: return 689;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 20, false).ID: return 690;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, true).ID: return 691;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 21, false).ID: return 692;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, true).ID: return 693;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 22, false).ID: return 694;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, true).ID: return 695;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 23, false).ID: return 696;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, true).ID: return 697;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Chime, 24, false).ID: return 698;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, true).ID: return 699;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 0, false).ID: return 700;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, true).ID: return 701;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 1, false).ID: return 702;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, true).ID: return 703;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 2, false).ID: return 704;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, true).ID: return 705;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 3, false).ID: return 706;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, true).ID: return 707;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 4, false).ID: return 708;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, true).ID: return 709;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 5, false).ID: return 710;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, true).ID: return 711;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 6, false).ID: return 712;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, true).ID: return 713;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 7, false).ID: return 714;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, true).ID: return 715;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 8, false).ID: return 716;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, true).ID: return 717;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 9, false).ID: return 718;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, true).ID: return 719;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 10, false).ID: return 720;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, true).ID: return 721;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 11, false).ID: return 722;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, true).ID: return 723;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 12, false).ID: return 724;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, true).ID: return 725;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 13, false).ID: return 726;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, true).ID: return 727;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 14, false).ID: return 728;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, true).ID: return 729;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 15, false).ID: return 730;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, true).ID: return 731;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 16, false).ID: return 732;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, true).ID: return 733;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 17, false).ID: return 734;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, true).ID: return 735;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 18, false).ID: return 736;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, true).ID: return 737;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 19, false).ID: return 738;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, true).ID: return 739;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 20, false).ID: return 740;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, true).ID: return 741;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 21, false).ID: return 742;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, true).ID: return 743;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 22, false).ID: return 744;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, true).ID: return 745;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 23, false).ID: return 746;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, true).ID: return 747;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Xylophone, 24, false).ID: return 748;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 0, true).ID: return 749;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 0, false).ID: return 750;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 1, true).ID: return 751;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 1, false).ID: return 752;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 2, true).ID: return 753;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 2, false).ID: return 754;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 3, true).ID: return 755;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 3, false).ID: return 756;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 4, true).ID: return 757;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 4, false).ID: return 758;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 5, true).ID: return 759;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 5, false).ID: return 760;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 6, true).ID: return 761;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 6, false).ID: return 762;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 7, true).ID: return 763;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 7, false).ID: return 764;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 8, true).ID: return 765;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 8, false).ID: return 766;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 9, true).ID: return 767;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 9, false).ID: return 768;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 10, true).ID: return 769;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 10, false).ID: return 770;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 11, true).ID: return 771;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 11, false).ID: return 772;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 12, true).ID: return 773;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 12, false).ID: return 774;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 13, true).ID: return 775;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 13, false).ID: return 776;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 14, true).ID: return 777;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 14, false).ID: return 778;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 15, true).ID: return 779;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 15, false).ID: return 780;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 16, true).ID: return 781;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 16, false).ID: return 782;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 17, true).ID: return 783;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 17, false).ID: return 784;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 18, true).ID: return 785;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 18, false).ID: return 786;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 19, true).ID: return 787;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 19, false).ID: return 788;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 20, true).ID: return 789;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 20, false).ID: return 790;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 21, true).ID: return 791;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 21, false).ID: return 792;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 22, true).ID: return 793;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 22, false).ID: return 794;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 23, true).ID: return 795;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 23, false).ID: return 796;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 24, true).ID: return 797;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::IronXylophone, 24, false).ID: return 798;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 0, true).ID: return 799;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 0, false).ID: return 800;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 1, true).ID: return 801;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 1, false).ID: return 802;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 2, true).ID: return 803;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 2, false).ID: return 804;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 3, true).ID: return 805;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 3, false).ID: return 806;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 4, true).ID: return 807;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 4, false).ID: return 808;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 5, true).ID: return 809;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 5, false).ID: return 810;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 6, true).ID: return 811;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 6, false).ID: return 812;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 7, true).ID: return 813;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 7, false).ID: return 814;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 8, true).ID: return 815;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 8, false).ID: return 816;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 9, true).ID: return 817;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 9, false).ID: return 818;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 10, true).ID: return 819;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 10, false).ID: return 820;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 11, true).ID: return 821;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 11, false).ID: return 822;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 12, true).ID: return 823;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 12, false).ID: return 824;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 13, true).ID: return 825;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 13, false).ID: return 826;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 14, true).ID: return 827;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 14, false).ID: return 828;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 15, true).ID: return 829;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 15, false).ID: return 830;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 16, true).ID: return 831;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 16, false).ID: return 832;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 17, true).ID: return 833;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 17, false).ID: return 834;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 18, true).ID: return 835;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 18, false).ID: return 836;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 19, true).ID: return 837;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 19, false).ID: return 838;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 20, true).ID: return 839;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 20, false).ID: return 840;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 21, true).ID: return 841;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 21, false).ID: return 842;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 22, true).ID: return 843;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 22, false).ID: return 844;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 23, true).ID: return 845;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 23, false).ID: return 846;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 24, true).ID: return 847;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::CowBell, 24, false).ID: return 848;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 0, true).ID: return 849;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 0, false).ID: return 850;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 1, true).ID: return 851;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 1, false).ID: return 852;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 2, true).ID: return 853;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 2, false).ID: return 854;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 3, true).ID: return 855;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 3, false).ID: return 856;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 4, true).ID: return 857;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 4, false).ID: return 858;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 5, true).ID: return 859;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 5, false).ID: return 860;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 6, true).ID: return 861;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 6, false).ID: return 862;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 7, true).ID: return 863;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 7, false).ID: return 864;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 8, true).ID: return 865;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 8, false).ID: return 866;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 9, true).ID: return 867;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 9, false).ID: return 868;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 10, true).ID: return 869;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 10, false).ID: return 870;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 11, true).ID: return 871;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 11, false).ID: return 872;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 12, true).ID: return 873;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 12, false).ID: return 874;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 13, true).ID: return 875;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 13, false).ID: return 876;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 14, true).ID: return 877;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 14, false).ID: return 878;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 15, true).ID: return 879;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 15, false).ID: return 880;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 16, true).ID: return 881;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 16, false).ID: return 882;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 17, true).ID: return 883;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 17, false).ID: return 884;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 18, true).ID: return 885;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 18, false).ID: return 886;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 19, true).ID: return 887;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 19, false).ID: return 888;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 20, true).ID: return 889;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 20, false).ID: return 890;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 21, true).ID: return 891;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 21, false).ID: return 892;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 22, true).ID: return 893;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 22, false).ID: return 894;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 23, true).ID: return 895;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 23, false).ID: return 896;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 24, true).ID: return 897;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Didgeridoo, 24, false).ID: return 898;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 0, true).ID: return 899;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 0, false).ID: return 900;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 1, true).ID: return 901;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 1, false).ID: return 902;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 2, true).ID: return 903;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 2, false).ID: return 904;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 3, true).ID: return 905;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 3, false).ID: return 906;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 4, true).ID: return 907;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 4, false).ID: return 908;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 5, true).ID: return 909;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 5, false).ID: return 910;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 6, true).ID: return 911;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 6, false).ID: return 912;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 7, true).ID: return 913;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 7, false).ID: return 914;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 8, true).ID: return 915;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 8, false).ID: return 916;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 9, true).ID: return 917;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 9, false).ID: return 918;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 10, true).ID: return 919;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 10, false).ID: return 920;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 11, true).ID: return 921;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 11, false).ID: return 922;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 12, true).ID: return 923;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 12, false).ID: return 924;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 13, true).ID: return 925;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 13, false).ID: return 926;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 14, true).ID: return 927;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 14, false).ID: return 928;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 15, true).ID: return 929;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 15, false).ID: return 930;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 16, true).ID: return 931;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 16, false).ID: return 932;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 17, true).ID: return 933;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 17, false).ID: return 934;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 18, true).ID: return 935;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 18, false).ID: return 936;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 19, true).ID: return 937;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 19, false).ID: return 938;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 20, true).ID: return 939;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 20, false).ID: return 940;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 21, true).ID: return 941;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 21, false).ID: return 942;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 22, true).ID: return 943;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 22, false).ID: return 944;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 23, true).ID: return 945;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 23, false).ID: return 946;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 24, true).ID: return 947;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Bit, 24, false).ID: return 948;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 0, true).ID: return 949;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 0, false).ID: return 950;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 1, true).ID: return 951;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 1, false).ID: return 952;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 2, true).ID: return 953;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 2, false).ID: return 954;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 3, true).ID: return 955;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 3, false).ID: return 956;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 4, true).ID: return 957;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 4, false).ID: return 958;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 5, true).ID: return 959;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 5, false).ID: return 960;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 6, true).ID: return 961;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 6, false).ID: return 962;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 7, true).ID: return 963;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 7, false).ID: return 964;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 8, true).ID: return 965;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 8, false).ID: return 966;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 9, true).ID: return 967;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 9, false).ID: return 968;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 10, true).ID: return 969;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 10, false).ID: return 970;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 11, true).ID: return 971;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 11, false).ID: return 972;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 12, true).ID: return 973;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 12, false).ID: return 974;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 13, true).ID: return 975;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 13, false).ID: return 976;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 14, true).ID: return 977;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 14, false).ID: return 978;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 15, true).ID: return 979;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 15, false).ID: return 980;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 16, true).ID: return 981;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 16, false).ID: return 982;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 17, true).ID: return 983;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 17, false).ID: return 984;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 18, true).ID: return 985;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 18, false).ID: return 986;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 19, true).ID: return 987;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 19, false).ID: return 988;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 20, true).ID: return 989;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 20, false).ID: return 990;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 21, true).ID: return 991;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 21, false).ID: return 992;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 22, true).ID: return 993;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 22, false).ID: return 994;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 23, true).ID: return 995;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 23, false).ID: return 996;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 24, true).ID: return 997;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Banjo, 24, false).ID: return 998;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 0, true).ID: return 999;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 0, false).ID: return 1000;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 1, true).ID: return 1001;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 1, false).ID: return 1002;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 2, true).ID: return 1003;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 2, false).ID: return 1004;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 3, true).ID: return 1005;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 3, false).ID: return 1006;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 4, true).ID: return 1007;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 4, false).ID: return 1008;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 5, true).ID: return 1009;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 5, false).ID: return 1010;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 6, true).ID: return 1011;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 6, false).ID: return 1012;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 7, true).ID: return 1013;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 7, false).ID: return 1014;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 8, true).ID: return 1015;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 8, false).ID: return 1016;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 9, true).ID: return 1017;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 9, false).ID: return 1018;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 10, true).ID: return 1019;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 10, false).ID: return 1020;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 11, true).ID: return 1021;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 11, false).ID: return 1022;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 12, true).ID: return 1023;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 12, false).ID: return 1024;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 13, true).ID: return 1025;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 13, false).ID: return 1026;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 14, true).ID: return 1027;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 14, false).ID: return 1028;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 15, true).ID: return 1029;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 15, false).ID: return 1030;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 16, true).ID: return 1031;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 16, false).ID: return 1032;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 17, true).ID: return 1033;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 17, false).ID: return 1034;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 18, true).ID: return 1035;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 18, false).ID: return 1036;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 19, true).ID: return 1037;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 19, false).ID: return 1038;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 20, true).ID: return 1039;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 20, false).ID: return 1040;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 21, true).ID: return 1041;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 21, false).ID: return 1042;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 22, true).ID: return 1043;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 22, false).ID: return 1044;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 23, true).ID: return 1045;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 23, false).ID: return 1046;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 24, true).ID: return 1047;\n\t\t\tcase NoteBlock::NoteBlock(NoteBlock::Instrument::Pling, 24, false).ID: return 1048;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6346;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6347;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6348;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6349;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 6350;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 6351;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 6352;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 6353;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6354;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6355;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6356;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6357;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 6358;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 6359;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 6360;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 6361;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6362;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6363;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6364;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6365;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 6366;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 6367;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 6368;\n\t\t\tcase OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 6369;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3573;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3574;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3575;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3576;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3577;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3578;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3579;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3580;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3581;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3582;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3583;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3584;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3585;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3586;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3587;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3588;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3589;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3590;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3591;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3592;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3593;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3594;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3595;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3596;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3597;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3598;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3599;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3600;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3601;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3602;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3603;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3604;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3605;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3606;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3607;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3608;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3609;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3610;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3611;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3612;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3613;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3614;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3615;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3616;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3617;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3618;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3619;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3620;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, true).ID: return 3621;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false).ID: return 3622;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true).ID: return 3623;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false).ID: return 3624;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, true).ID: return 3625;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, true, false).ID: return 3626;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true).ID: return 3627;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false).ID: return 3628;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, true).ID: return 3629;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, true, false).ID: return 3630;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, true).ID: return 3631;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Left, false, false).ID: return 3632;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, true).ID: return 3633;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false).ID: return 3634;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, true).ID: return 3635;\n\t\t\tcase OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false).ID: return 3636;\n\t\t\tcase OakFence::OakFence(true, true, true, true).ID: return 3968;\n\t\t\tcase OakFence::OakFence(true, true, true, false).ID: return 3969;\n\t\t\tcase OakFence::OakFence(true, true, false, true).ID: return 3972;\n\t\t\tcase OakFence::OakFence(true, true, false, false).ID: return 3973;\n\t\t\tcase OakFence::OakFence(true, false, true, true).ID: return 3976;\n\t\t\tcase OakFence::OakFence(true, false, true, false).ID: return 3977;\n\t\t\tcase OakFence::OakFence(true, false, false, true).ID: return 3980;\n\t\t\tcase OakFence::OakFence(true, false, false, false).ID: return 3981;\n\t\t\tcase OakFence::OakFence(false, true, true, true).ID: return 3984;\n\t\t\tcase OakFence::OakFence(false, true, true, false).ID: return 3985;\n\t\t\tcase OakFence::OakFence(false, true, false, true).ID: return 3988;\n\t\t\tcase OakFence::OakFence(false, true, false, false).ID: return 3989;\n\t\t\tcase OakFence::OakFence(false, false, true, true).ID: return 3992;\n\t\t\tcase OakFence::OakFence(false, false, true, false).ID: return 3993;\n\t\t\tcase OakFence::OakFence(false, false, false, true).ID: return 3996;\n\t\t\tcase OakFence::OakFence(false, false, false, false).ID: return 3997;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 4820;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 4821;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 4822;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 4823;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 4824;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 4825;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 4826;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 4827;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 4828;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 4829;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 4830;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 4831;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 4832;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 4833;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 4834;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 4835;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 4836;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 4837;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 4838;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 4839;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 4840;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 4841;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 4842;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 4843;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 4844;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 4845;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 4846;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 4847;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 4848;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 4849;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 4850;\n\t\t\tcase OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 4851;\n\t\t\tcase OakLeaves::OakLeaves(1, true).ID: return 145;\n\t\t\tcase OakLeaves::OakLeaves(1, false).ID: return 146;\n\t\t\tcase OakLeaves::OakLeaves(2, true).ID: return 147;\n\t\t\tcase OakLeaves::OakLeaves(2, false).ID: return 148;\n\t\t\tcase OakLeaves::OakLeaves(3, true).ID: return 149;\n\t\t\tcase OakLeaves::OakLeaves(3, false).ID: return 150;\n\t\t\tcase OakLeaves::OakLeaves(4, true).ID: return 151;\n\t\t\tcase OakLeaves::OakLeaves(4, false).ID: return 152;\n\t\t\tcase OakLeaves::OakLeaves(5, true).ID: return 153;\n\t\t\tcase OakLeaves::OakLeaves(5, false).ID: return 154;\n\t\t\tcase OakLeaves::OakLeaves(6, true).ID: return 155;\n\t\t\tcase OakLeaves::OakLeaves(6, false).ID: return 156;\n\t\t\tcase OakLeaves::OakLeaves(7, true).ID: return 157;\n\t\t\tcase OakLeaves::OakLeaves(7, false).ID: return 158;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::X).ID: return 73;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Y).ID: return 74;\n\t\t\tcase OakLog::OakLog(OakLog::Axis::Z).ID: return 75;\n\t\t\tcase OakPlanks::OakPlanks().ID: return 15;\n\t\t\tcase OakPressurePlate::OakPressurePlate(true).ID: return 3873;\n\t\t\tcase OakPressurePlate::OakPressurePlate(false).ID: return 3874;\n\t\t\tcase OakSapling::OakSapling(0).ID: return 21;\n\t\t\tcase OakSapling::OakSapling(1).ID: return 22;\n\t\t\tcase OakSign::OakSign(0).ID: return 3382;\n\t\t\tcase OakSign::OakSign(1).ID: return 3384;\n\t\t\tcase OakSign::OakSign(2).ID: return 3386;\n\t\t\tcase OakSign::OakSign(3).ID: return 3388;\n\t\t\tcase OakSign::OakSign(4).ID: return 3390;\n\t\t\tcase OakSign::OakSign(5).ID: return 3392;\n\t\t\tcase OakSign::OakSign(6).ID: return 3394;\n\t\t\tcase OakSign::OakSign(7).ID: return 3396;\n\t\t\tcase OakSign::OakSign(8).ID: return 3398;\n\t\t\tcase OakSign::OakSign(9).ID: return 3400;\n\t\t\tcase OakSign::OakSign(10).ID: return 3402;\n\t\t\tcase OakSign::OakSign(11).ID: return 3404;\n\t\t\tcase OakSign::OakSign(12).ID: return 3406;\n\t\t\tcase OakSign::OakSign(13).ID: return 3408;\n\t\t\tcase OakSign::OakSign(14).ID: return 3410;\n\t\t\tcase OakSign::OakSign(15).ID: return 3412;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Top).ID: return 8301;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Bottom).ID: return 8303;\n\t\t\tcase OakSlab::OakSlab(OakSlab::Type::Double).ID: return 8305;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1955;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1957;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1959;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1961;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1963;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1965;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1967;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1969;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1971;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1973;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1975;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1977;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1979;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 1981;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 1983;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 1985;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 1987;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 1989;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 1991;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 1993;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 1995;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 1997;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 1999;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 2001;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 2003;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 2005;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 2007;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 2009;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 2011;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 2013;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::Straight).ID: return 2015;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerLeft).ID: return 2017;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::InnerRight).ID: return 2019;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterLeft).ID: return 2021;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::OuterRight).ID: return 2023;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::Straight).ID: return 2025;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerLeft).ID: return 2027;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::InnerRight).ID: return 2029;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterLeft).ID: return 2031;\n\t\t\tcase OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::OuterRight).ID: return 2033;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, true).ID: return 4112;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, false).ID: return 4114;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, true).ID: return 4116;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, false).ID: return 4118;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, true).ID: return 4120;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, false).ID: return 4122;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, true).ID: return 4124;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, false).ID: return 4126;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, true).ID: return 4128;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, false).ID: return 4130;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, true).ID: return 4132;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, false).ID: return 4134;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, true).ID: return 4136;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, false).ID: return 4138;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, true).ID: return 4140;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, false).ID: return 4142;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, true).ID: return 4144;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, false).ID: return 4146;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, true).ID: return 4148;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, false).ID: return 4150;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, true).ID: return 4152;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, false).ID: return 4154;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, true).ID: return 4156;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, false).ID: return 4158;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, true).ID: return 4160;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, false).ID: return 4162;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, true).ID: return 4164;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, false).ID: return 4166;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, true).ID: return 4168;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, false).ID: return 4170;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, true).ID: return 4172;\n\t\t\tcase OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, false).ID: return 4174;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3736;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3738;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3740;\n\t\t\tcase OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3742;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::X).ID: return 109;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Y).ID: return 110;\n\t\t\tcase OakWood::OakWood(OakWood::Axis::Z).ID: return 111;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, true).ID: return 9260;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZM, false).ID: return 9261;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, true).ID: return 9262;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XP, false).ID: return 9263;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, true).ID: return 9264;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_ZP, false).ID: return 9265;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, true).ID: return 9266;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_XM, false).ID: return 9267;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, true).ID: return 9268;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YP, false).ID: return 9269;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, true).ID: return 9270;\n\t\t\tcase Observer::Observer(eBlockFace::BLOCK_FACE_YM, false).ID: return 9271;\n\t\t\tcase Obsidian::Obsidian().ID: return 1434;\n\t\t\tcase OrangeBanner::OrangeBanner(0).ID: return 7913;\n\t\t\tcase OrangeBanner::OrangeBanner(1).ID: return 7914;\n\t\t\tcase OrangeBanner::OrangeBanner(2).ID: return 7915;\n\t\t\tcase OrangeBanner::OrangeBanner(3).ID: return 7916;\n\t\t\tcase OrangeBanner::OrangeBanner(4).ID: return 7917;\n\t\t\tcase OrangeBanner::OrangeBanner(5).ID: return 7918;\n\t\t\tcase OrangeBanner::OrangeBanner(6).ID: return 7919;\n\t\t\tcase OrangeBanner::OrangeBanner(7).ID: return 7920;\n\t\t\tcase OrangeBanner::OrangeBanner(8).ID: return 7921;\n\t\t\tcase OrangeBanner::OrangeBanner(9).ID: return 7922;\n\t\t\tcase OrangeBanner::OrangeBanner(10).ID: return 7923;\n\t\t\tcase OrangeBanner::OrangeBanner(11).ID: return 7924;\n\t\t\tcase OrangeBanner::OrangeBanner(12).ID: return 7925;\n\t\t\tcase OrangeBanner::OrangeBanner(13).ID: return 7926;\n\t\t\tcase OrangeBanner::OrangeBanner(14).ID: return 7927;\n\t\t\tcase OrangeBanner::OrangeBanner(15).ID: return 7928;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Head).ID: return 1065;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, true, OrangeBed::Part::Foot).ID: return 1066;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Head).ID: return 1067;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZM, false, OrangeBed::Part::Foot).ID: return 1068;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Head).ID: return 1069;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, true, OrangeBed::Part::Foot).ID: return 1070;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Head).ID: return 1071;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_ZP, false, OrangeBed::Part::Foot).ID: return 1072;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Head).ID: return 1073;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, true, OrangeBed::Part::Foot).ID: return 1074;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Head).ID: return 1075;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XM, false, OrangeBed::Part::Foot).ID: return 1076;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Head).ID: return 1077;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, true, OrangeBed::Part::Foot).ID: return 1078;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Head).ID: return 1079;\n\t\t\tcase OrangeBed::OrangeBed(eBlockFace::BLOCK_FACE_XP, false, OrangeBed::Part::Foot).ID: return 1080;\n\t\t\tcase OrangeCarpet::OrangeCarpet().ID: return 7867;\n\t\t\tcase OrangeConcrete::OrangeConcrete().ID: return 9439;\n\t\t\tcase OrangeConcretePowder::OrangeConcretePowder().ID: return 9455;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9378;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9379;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9380;\n\t\t\tcase OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9381;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9284;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9285;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9286;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9287;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9288;\n\t\t\tcase OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9289;\n\t\t\tcase OrangeStainedGlass::OrangeStainedGlass().ID: return 4096;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, true).ID: return 6897;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, true, false).ID: return 6898;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, true).ID: return 6901;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, true, false, false).ID: return 6902;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, true).ID: return 6905;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, true, false).ID: return 6906;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, true).ID: return 6909;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(true, false, false, false).ID: return 6910;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, true).ID: return 6913;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, true, false).ID: return 6914;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, true).ID: return 6917;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, true, false, false).ID: return 6918;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, true).ID: return 6921;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, true, false).ID: return 6922;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, true).ID: return 6925;\n\t\t\tcase OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, false).ID: return 6926;\n\t\t\tcase OrangeTerracotta::OrangeTerracotta().ID: return 6848;\n\t\t\tcase OrangeTulip::OrangeTulip().ID: return 1418;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8157;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8158;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8159;\n\t\t\tcase OrangeWallBanner::OrangeWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8160;\n\t\t\tcase OrangeWool::OrangeWool().ID: return 1385;\n\t\t\tcase OxeyeDaisy::OxeyeDaisy().ID: return 1421;\n\t\t\tcase PackedIce::PackedIce().ID: return 7884;\n\t\t\tcase Peony::Peony(Peony::Half::Upper).ID: return 7891;\n\t\t\tcase Peony::Peony(Peony::Half::Lower).ID: return 7892;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Top).ID: return 8361;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Bottom).ID: return 8363;\n\t\t\tcase PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Double).ID: return 8365;\n\t\t\tcase PinkBanner::PinkBanner(0).ID: return 7993;\n\t\t\tcase PinkBanner::PinkBanner(1).ID: return 7994;\n\t\t\tcase PinkBanner::PinkBanner(2).ID: return 7995;\n\t\t\tcase PinkBanner::PinkBanner(3).ID: return 7996;\n\t\t\tcase PinkBanner::PinkBanner(4).ID: return 7997;\n\t\t\tcase PinkBanner::PinkBanner(5).ID: return 7998;\n\t\t\tcase PinkBanner::PinkBanner(6).ID: return 7999;\n\t\t\tcase PinkBanner::PinkBanner(7).ID: return 8000;\n\t\t\tcase PinkBanner::PinkBanner(8).ID: return 8001;\n\t\t\tcase PinkBanner::PinkBanner(9).ID: return 8002;\n\t\t\tcase PinkBanner::PinkBanner(10).ID: return 8003;\n\t\t\tcase PinkBanner::PinkBanner(11).ID: return 8004;\n\t\t\tcase PinkBanner::PinkBanner(12).ID: return 8005;\n\t\t\tcase PinkBanner::PinkBanner(13).ID: return 8006;\n\t\t\tcase PinkBanner::PinkBanner(14).ID: return 8007;\n\t\t\tcase PinkBanner::PinkBanner(15).ID: return 8008;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Head).ID: return 1145;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, true, PinkBed::Part::Foot).ID: return 1146;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Head).ID: return 1147;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZM, false, PinkBed::Part::Foot).ID: return 1148;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Head).ID: return 1149;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, true, PinkBed::Part::Foot).ID: return 1150;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Head).ID: return 1151;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_ZP, false, PinkBed::Part::Foot).ID: return 1152;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Head).ID: return 1153;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, true, PinkBed::Part::Foot).ID: return 1154;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Head).ID: return 1155;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XM, false, PinkBed::Part::Foot).ID: return 1156;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Head).ID: return 1157;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, true, PinkBed::Part::Foot).ID: return 1158;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Head).ID: return 1159;\n\t\t\tcase PinkBed::PinkBed(eBlockFace::BLOCK_FACE_XP, false, PinkBed::Part::Foot).ID: return 1160;\n\t\t\tcase PinkCarpet::PinkCarpet().ID: return 7872;\n\t\t\tcase PinkConcrete::PinkConcrete().ID: return 9444;\n\t\t\tcase PinkConcretePowder::PinkConcretePowder().ID: return 9460;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9398;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9399;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9400;\n\t\t\tcase PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9401;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9314;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9315;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9316;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9317;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9318;\n\t\t\tcase PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9319;\n\t\t\tcase PinkStainedGlass::PinkStainedGlass().ID: return 4101;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, true).ID: return 7057;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, true, false).ID: return 7058;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, true).ID: return 7061;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, true, false, false).ID: return 7062;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, true).ID: return 7065;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, true, false).ID: return 7066;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, true).ID: return 7069;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(true, false, false, false).ID: return 7070;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, true).ID: return 7073;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, true, false).ID: return 7074;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, true).ID: return 7077;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, true, false, false).ID: return 7078;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, true).ID: return 7081;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, true, false).ID: return 7082;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, true).ID: return 7085;\n\t\t\tcase PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, false).ID: return 7086;\n\t\t\tcase PinkTerracotta::PinkTerracotta().ID: return 6853;\n\t\t\tcase PinkTulip::PinkTulip().ID: return 1420;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8177;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8178;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8179;\n\t\t\tcase PinkWallBanner::PinkWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8180;\n\t\t\tcase PinkWool::PinkWool().ID: return 1390;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1348;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1349;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1350;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1351;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1352;\n\t\t\tcase Piston::Piston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1353;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1354;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1355;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1356;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1357;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1358;\n\t\t\tcase Piston::Piston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1359;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Normal).ID: return 1360;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, true, PistonHead::Type::Sticky).ID: return 1361;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Normal).ID: return 1362;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Sticky).ID: return 1363;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Normal).ID: return 1364;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, true, PistonHead::Type::Sticky).ID: return 1365;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Normal).ID: return 1366;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Sticky).ID: return 1367;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Normal).ID: return 1368;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, true, PistonHead::Type::Sticky).ID: return 1369;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Normal).ID: return 1370;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Sticky).ID: return 1371;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Normal).ID: return 1372;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, true, PistonHead::Type::Sticky).ID: return 1373;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Normal).ID: return 1374;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Sticky).ID: return 1375;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Normal).ID: return 1376;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, true, PistonHead::Type::Sticky).ID: return 1377;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Normal).ID: return 1378;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Sticky).ID: return 1379;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Normal).ID: return 1380;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, true, PistonHead::Type::Sticky).ID: return 1381;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Normal).ID: return 1382;\n\t\t\tcase PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Sticky).ID: return 1383;\n\t\t\tcase PlayerHead::PlayerHead(0).ID: return 6550;\n\t\t\tcase PlayerHead::PlayerHead(1).ID: return 6551;\n\t\t\tcase PlayerHead::PlayerHead(2).ID: return 6552;\n\t\t\tcase PlayerHead::PlayerHead(3).ID: return 6553;\n\t\t\tcase PlayerHead::PlayerHead(4).ID: return 6554;\n\t\t\tcase PlayerHead::PlayerHead(5).ID: return 6555;\n\t\t\tcase PlayerHead::PlayerHead(6).ID: return 6556;\n\t\t\tcase PlayerHead::PlayerHead(7).ID: return 6557;\n\t\t\tcase PlayerHead::PlayerHead(8).ID: return 6558;\n\t\t\tcase PlayerHead::PlayerHead(9).ID: return 6559;\n\t\t\tcase PlayerHead::PlayerHead(10).ID: return 6560;\n\t\t\tcase PlayerHead::PlayerHead(11).ID: return 6561;\n\t\t\tcase PlayerHead::PlayerHead(12).ID: return 6562;\n\t\t\tcase PlayerHead::PlayerHead(13).ID: return 6563;\n\t\t\tcase PlayerHead::PlayerHead(14).ID: return 6564;\n\t\t\tcase PlayerHead::PlayerHead(15).ID: return 6565;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6566;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6567;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6568;\n\t\t\tcase PlayerWallHead::PlayerWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6569;\n\t\t\tcase Podzol::Podzol(true).ID: return 12;\n\t\t\tcase Podzol::Podzol(false).ID: return 13;\n\t\t\tcase PolishedAndesite::PolishedAndesite().ID: return 7;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Top).ID: return 10856;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Bottom).ID: return 10858;\n\t\t\tcase PolishedAndesiteSlab::PolishedAndesiteSlab(PolishedAndesiteSlab::Type::Double).ID: return 10860;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10630;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10632;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10634;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10636;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10638;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10640;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10642;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10644;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10646;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10648;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10650;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10652;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10654;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10656;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10658;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10660;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10662;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10664;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10666;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10668;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10670;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10672;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10674;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10676;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10678;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10680;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10682;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10684;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10686;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XM, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10688;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::Straight).ID: return 10690;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10692;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10694;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10696;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Top, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10698;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::Straight).ID: return 10700;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerLeft).ID: return 10702;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::InnerRight).ID: return 10704;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterLeft).ID: return 10706;\n\t\t\tcase PolishedAndesiteStairs::PolishedAndesiteStairs(eBlockFace::BLOCK_FACE_XP, PolishedAndesiteStairs::Half::Bottom, PolishedAndesiteStairs::Shape::OuterRight).ID: return 10708;\n\t\t\tcase PolishedBasalt::PolishedBasalt(PolishedBasalt::Axis::X).ID: return 4005;\n\t\t\tcase PolishedBasalt::PolishedBasalt(PolishedBasalt::Axis::Y).ID: return 4006;\n\t\t\tcase PolishedBasalt::PolishedBasalt(PolishedBasalt::Axis::Z).ID: return 4007;\n\t\t\tcase PolishedBlackstone::PolishedBlackstone().ID: return 16250;\n\t\t\tcase PolishedBlackstoneBrickSlab::PolishedBlackstoneBrickSlab(PolishedBlackstoneBrickSlab::Type::Top).ID: return 16255;\n\t\t\tcase PolishedBlackstoneBrickSlab::PolishedBlackstoneBrickSlab(PolishedBlackstoneBrickSlab::Type::Bottom).ID: return 16257;\n\t\t\tcase PolishedBlackstoneBrickSlab::PolishedBlackstoneBrickSlab(PolishedBlackstoneBrickSlab::Type::Double).ID: return 16259;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::Straight).ID: return 16261;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::InnerLeft).ID: return 16263;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::InnerRight).ID: return 16265;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::OuterLeft).ID: return 16267;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::OuterRight).ID: return 16269;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::Straight).ID: return 16271;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::InnerLeft).ID: return 16273;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::InnerRight).ID: return 16275;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::OuterLeft).ID: return 16277;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::OuterRight).ID: return 16279;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::Straight).ID: return 16281;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::InnerLeft).ID: return 16283;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::InnerRight).ID: return 16285;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::OuterLeft).ID: return 16287;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::OuterRight).ID: return 16289;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::Straight).ID: return 16291;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::InnerLeft).ID: return 16293;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::InnerRight).ID: return 16295;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::OuterLeft).ID: return 16297;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::OuterRight).ID: return 16299;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::Straight).ID: return 16301;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::InnerLeft).ID: return 16303;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::InnerRight).ID: return 16305;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::OuterLeft).ID: return 16307;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::OuterRight).ID: return 16309;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::Straight).ID: return 16311;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::InnerLeft).ID: return 16313;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::InnerRight).ID: return 16315;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::OuterLeft).ID: return 16317;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::OuterRight).ID: return 16319;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::Straight).ID: return 16321;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::InnerLeft).ID: return 16323;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::InnerRight).ID: return 16325;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::OuterLeft).ID: return 16327;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Top, PolishedBlackstoneBrickStairs::Shape::OuterRight).ID: return 16329;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::Straight).ID: return 16331;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::InnerLeft).ID: return 16333;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::InnerRight).ID: return 16335;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::OuterLeft).ID: return 16337;\n\t\t\tcase PolishedBlackstoneBrickStairs::PolishedBlackstoneBrickStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneBrickStairs::Half::Bottom, PolishedBlackstoneBrickStairs::Shape::OuterRight).ID: return 16339;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16343;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16344;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16345;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16349;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16350;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16351;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16355;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16356;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16357;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16361;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16362;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16363;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16367;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16368;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16369;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16373;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16374;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16375;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16379;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16380;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16381;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16385;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16386;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16387;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16391;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16392;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16393;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16397;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16398;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16399;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16403;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16404;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16405;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16409;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16410;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16411;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16415;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16416;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16417;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16421;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16422;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16423;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16427;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16428;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16429;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16433;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16434;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16435;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16439;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16440;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16441;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16445;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16446;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::None, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16447;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16451;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16452;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16453;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16457;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16458;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16459;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16463;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16464;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16465;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16469;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16470;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16471;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16475;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16476;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16477;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16481;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16482;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16483;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16487;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16488;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16489;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16493;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16494;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16495;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16499;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16500;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16501;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16505;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16506;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16507;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16511;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16512;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16513;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16517;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16518;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16519;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16523;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16524;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16525;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16529;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16530;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16531;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16535;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16536;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16537;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16541;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16542;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16543;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16547;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16548;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16549;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16553;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16554;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Low, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16555;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16559;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16560;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16561;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16565;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16566;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16567;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16571;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16572;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16573;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16577;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16578;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16579;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16583;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16584;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16585;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16589;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16590;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::None, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16591;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16595;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16596;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16597;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16601;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16602;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16603;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16607;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16608;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16609;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16613;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16614;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16615;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16619;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16620;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16621;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16625;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16626;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Low, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16627;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::None).ID: return 16631;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16632;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16633;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::None).ID: return 16637;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16638;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::None, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16639;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::None).ID: return 16643;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16644;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16645;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::None).ID: return 16649;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16650;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Low, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16651;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::None).ID: return 16655;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Low).ID: return 16656;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, true, PolishedBlackstoneBrickWall::West::Tall).ID: return 16657;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::None).ID: return 16661;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Low).ID: return 16662;\n\t\t\tcase PolishedBlackstoneBrickWall::PolishedBlackstoneBrickWall(PolishedBlackstoneBrickWall::East::Tall, PolishedBlackstoneBrickWall::North::Tall, PolishedBlackstoneBrickWall::South::Tall, false, PolishedBlackstoneBrickWall::West::Tall).ID: return 16663;\n\t\t\tcase PolishedBlackstoneBricks::PolishedBlackstoneBricks().ID: return 16251;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 16753;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 16754;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 16755;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 16756;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 16757;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 16758;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 16759;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 16760;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 16761;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 16762;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 16763;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 16764;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 16765;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 16766;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 16767;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 16768;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 16769;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 16770;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 16771;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 16772;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 16773;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 16774;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 16775;\n\t\t\tcase PolishedBlackstoneButton::PolishedBlackstoneButton(PolishedBlackstoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 16776;\n\t\t\tcase PolishedBlackstonePressurePlate::PolishedBlackstonePressurePlate(true).ID: return 16751;\n\t\t\tcase PolishedBlackstonePressurePlate::PolishedBlackstonePressurePlate(false).ID: return 16752;\n\t\t\tcase PolishedBlackstoneSlab::PolishedBlackstoneSlab(PolishedBlackstoneSlab::Type::Top).ID: return 16746;\n\t\t\tcase PolishedBlackstoneSlab::PolishedBlackstoneSlab(PolishedBlackstoneSlab::Type::Bottom).ID: return 16748;\n\t\t\tcase PolishedBlackstoneSlab::PolishedBlackstoneSlab(PolishedBlackstoneSlab::Type::Double).ID: return 16750;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::Straight).ID: return 16666;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::InnerLeft).ID: return 16668;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::InnerRight).ID: return 16670;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::OuterLeft).ID: return 16672;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::OuterRight).ID: return 16674;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::Straight).ID: return 16676;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::InnerLeft).ID: return 16678;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::InnerRight).ID: return 16680;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::OuterLeft).ID: return 16682;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::OuterRight).ID: return 16684;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::Straight).ID: return 16686;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::InnerLeft).ID: return 16688;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::InnerRight).ID: return 16690;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::OuterLeft).ID: return 16692;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::OuterRight).ID: return 16694;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::Straight).ID: return 16696;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::InnerLeft).ID: return 16698;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::InnerRight).ID: return 16700;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::OuterLeft).ID: return 16702;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_ZP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::OuterRight).ID: return 16704;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::Straight).ID: return 16706;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::InnerLeft).ID: return 16708;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::InnerRight).ID: return 16710;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::OuterLeft).ID: return 16712;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::OuterRight).ID: return 16714;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::Straight).ID: return 16716;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::InnerLeft).ID: return 16718;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::InnerRight).ID: return 16720;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::OuterLeft).ID: return 16722;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XM, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::OuterRight).ID: return 16724;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::Straight).ID: return 16726;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::InnerLeft).ID: return 16728;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::InnerRight).ID: return 16730;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::OuterLeft).ID: return 16732;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Top, PolishedBlackstoneStairs::Shape::OuterRight).ID: return 16734;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::Straight).ID: return 16736;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::InnerLeft).ID: return 16738;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::InnerRight).ID: return 16740;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::OuterLeft).ID: return 16742;\n\t\t\tcase PolishedBlackstoneStairs::PolishedBlackstoneStairs(eBlockFace::BLOCK_FACE_XP, PolishedBlackstoneStairs::Half::Bottom, PolishedBlackstoneStairs::Shape::OuterRight).ID: return 16744;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 16780;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 16781;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 16782;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 16786;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 16787;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 16788;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 16792;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 16793;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 16794;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 16798;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 16799;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 16800;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 16804;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 16805;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 16806;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 16810;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 16811;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 16812;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 16816;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 16817;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 16818;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 16822;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 16823;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 16824;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 16828;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 16829;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 16830;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 16834;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 16835;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 16836;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 16840;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 16841;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 16842;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 16846;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 16847;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 16848;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 16852;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 16853;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 16854;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 16858;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 16859;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 16860;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 16864;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 16865;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 16866;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 16870;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 16871;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 16872;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 16876;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 16877;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 16878;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 16882;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 16883;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::None, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 16884;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 16888;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 16889;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 16890;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 16894;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 16895;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 16896;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 16900;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 16901;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 16902;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 16906;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 16907;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 16908;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 16912;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 16913;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 16914;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 16918;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 16919;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 16920;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 16924;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 16925;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 16926;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 16930;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 16931;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 16932;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 16936;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 16937;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 16938;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 16942;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 16943;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 16944;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 16948;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 16949;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 16950;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 16954;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 16955;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 16956;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 16960;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 16961;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 16962;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 16966;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 16967;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 16968;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 16972;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 16973;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 16974;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 16978;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 16979;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 16980;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 16984;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 16985;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 16986;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 16990;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 16991;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Low, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 16992;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 16996;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 16997;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 16998;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 17002;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 17003;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 17004;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 17008;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 17009;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 17010;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 17014;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 17015;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 17016;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 17020;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 17021;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 17022;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 17026;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 17027;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::None, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 17028;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 17032;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 17033;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 17034;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 17038;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 17039;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 17040;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 17044;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 17045;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 17046;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 17050;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 17051;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 17052;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 17056;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 17057;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 17058;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 17062;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 17063;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Low, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 17064;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::None).ID: return 17068;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Low).ID: return 17069;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, true, PolishedBlackstoneWall::West::Tall).ID: return 17070;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::None).ID: return 17074;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Low).ID: return 17075;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::None, false, PolishedBlackstoneWall::West::Tall).ID: return 17076;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::None).ID: return 17080;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Low).ID: return 17081;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, true, PolishedBlackstoneWall::West::Tall).ID: return 17082;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::None).ID: return 17086;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Low).ID: return 17087;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Low, false, PolishedBlackstoneWall::West::Tall).ID: return 17088;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::None).ID: return 17092;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Low).ID: return 17093;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, true, PolishedBlackstoneWall::West::Tall).ID: return 17094;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::None).ID: return 17098;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Low).ID: return 17099;\n\t\t\tcase PolishedBlackstoneWall::PolishedBlackstoneWall(PolishedBlackstoneWall::East::Tall, PolishedBlackstoneWall::North::Tall, PolishedBlackstoneWall::South::Tall, false, PolishedBlackstoneWall::West::Tall).ID: return 17100;\n\t\t\tcase PolishedDiorite::PolishedDiorite().ID: return 5;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Top).ID: return 10808;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Bottom).ID: return 10810;\n\t\t\tcase PolishedDioriteSlab::PolishedDioriteSlab(PolishedDioriteSlab::Type::Double).ID: return 10812;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9910;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9912;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9914;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9916;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9918;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9920;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9922;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9924;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9926;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9928;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9930;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9932;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9934;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9936;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9938;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9940;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9942;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9944;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9946;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9948;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9950;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9952;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9954;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9956;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9958;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9960;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9962;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9964;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9966;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XM, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9968;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::Straight).ID: return 9970;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9972;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::InnerRight).ID: return 9974;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9976;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Top, PolishedDioriteStairs::Shape::OuterRight).ID: return 9978;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::Straight).ID: return 9980;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerLeft).ID: return 9982;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::InnerRight).ID: return 9984;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterLeft).ID: return 9986;\n\t\t\tcase PolishedDioriteStairs::PolishedDioriteStairs(eBlockFace::BLOCK_FACE_XP, PolishedDioriteStairs::Half::Bottom, PolishedDioriteStairs::Shape::OuterRight).ID: return 9988;\n\t\t\tcase PolishedGranite::PolishedGranite().ID: return 3;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Top).ID: return 10790;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Bottom).ID: return 10792;\n\t\t\tcase PolishedGraniteSlab::PolishedGraniteSlab(PolishedGraniteSlab::Type::Double).ID: return 10794;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9670;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9672;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9674;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9676;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9678;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9680;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9682;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9684;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9686;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9688;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9690;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9692;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9694;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9696;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9698;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9700;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9702;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9704;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9706;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_ZP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9708;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9710;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9712;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9714;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9716;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9718;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9720;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9722;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9724;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9726;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XM, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9728;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::Straight).ID: return 9730;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9732;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::InnerRight).ID: return 9734;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9736;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Top, PolishedGraniteStairs::Shape::OuterRight).ID: return 9738;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::Straight).ID: return 9740;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerLeft).ID: return 9742;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::InnerRight).ID: return 9744;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterLeft).ID: return 9746;\n\t\t\tcase PolishedGraniteStairs::PolishedGraniteStairs(eBlockFace::BLOCK_FACE_XP, PolishedGraniteStairs::Half::Bottom, PolishedGraniteStairs::Shape::OuterRight).ID: return 9748;\n\t\t\tcase Poppy::Poppy().ID: return 1413;\n\t\t\tcase Potatoes::Potatoes(0).ID: return 6338;\n\t\t\tcase Potatoes::Potatoes(1).ID: return 6339;\n\t\t\tcase Potatoes::Potatoes(2).ID: return 6340;\n\t\t\tcase Potatoes::Potatoes(3).ID: return 6341;\n\t\t\tcase Potatoes::Potatoes(4).ID: return 6342;\n\t\t\tcase Potatoes::Potatoes(5).ID: return 6343;\n\t\t\tcase Potatoes::Potatoes(6).ID: return 6344;\n\t\t\tcase Potatoes::Potatoes(7).ID: return 6345;\n\t\t\tcase PottedAcaciaSapling::PottedAcaciaSapling().ID: return 6310;\n\t\t\tcase PottedAllium::PottedAllium().ID: return 6316;\n\t\t\tcase PottedAzureBluet::PottedAzureBluet().ID: return 6317;\n\t\t\tcase PottedBamboo::PottedBamboo().ID: return 9664;\n\t\t\tcase PottedBirchSapling::PottedBirchSapling().ID: return 6308;\n\t\t\tcase PottedBlueOrchid::PottedBlueOrchid().ID: return 6315;\n\t\t\tcase PottedBrownMushroom::PottedBrownMushroom().ID: return 6327;\n\t\t\tcase PottedCactus::PottedCactus().ID: return 6329;\n\t\t\tcase PottedCornflower::PottedCornflower().ID: return 6323;\n\t\t\tcase PottedCrimsonFungus::PottedCrimsonFungus().ID: return 15834;\n\t\t\tcase PottedCrimsonRoots::PottedCrimsonRoots().ID: return 15836;\n\t\t\tcase PottedDandelion::PottedDandelion().ID: return 6313;\n\t\t\tcase PottedDarkOakSapling::PottedDarkOakSapling().ID: return 6311;\n\t\t\tcase PottedDeadBush::PottedDeadBush().ID: return 6328;\n\t\t\tcase PottedFern::PottedFern().ID: return 6312;\n\t\t\tcase PottedJungleSapling::PottedJungleSapling().ID: return 6309;\n\t\t\tcase PottedLilyOfTheValley::PottedLilyOfTheValley().ID: return 6324;\n\t\t\tcase PottedOakSapling::PottedOakSapling().ID: return 6306;\n\t\t\tcase PottedOrangeTulip::PottedOrangeTulip().ID: return 6319;\n\t\t\tcase PottedOxeyeDaisy::PottedOxeyeDaisy().ID: return 6322;\n\t\t\tcase PottedPinkTulip::PottedPinkTulip().ID: return 6321;\n\t\t\tcase PottedPoppy::PottedPoppy().ID: return 6314;\n\t\t\tcase PottedRedMushroom::PottedRedMushroom().ID: return 6326;\n\t\t\tcase PottedRedTulip::PottedRedTulip().ID: return 6318;\n\t\t\tcase PottedSpruceSapling::PottedSpruceSapling().ID: return 6307;\n\t\t\tcase PottedWarpedFungus::PottedWarpedFungus().ID: return 15835;\n\t\t\tcase PottedWarpedRoots::PottedWarpedRoots().ID: return 15837;\n\t\t\tcase PottedWhiteTulip::PottedWhiteTulip().ID: return 6320;\n\t\t\tcase PottedWitherRose::PottedWitherRose().ID: return 6325;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::NorthSouth).ID: return 1305;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::EastWest).ID: return 1306;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingEast).ID: return 1307;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingWest).ID: return 1308;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingNorth).ID: return 1309;\n\t\t\tcase PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingSouth).ID: return 1310;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::NorthSouth).ID: return 1311;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::EastWest).ID: return 1312;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingEast).ID: return 1313;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingWest).ID: return 1314;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingNorth).ID: return 1315;\n\t\t\tcase PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingSouth).ID: return 1316;\n\t\t\tcase Prismarine::Prismarine().ID: return 7601;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Top).ID: return 7851;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Bottom).ID: return 7853;\n\t\t\tcase PrismarineBrickSlab::PrismarineBrickSlab(PrismarineBrickSlab::Type::Double).ID: return 7855;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7685;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7687;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7689;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7691;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7693;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7695;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7697;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7699;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7701;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7703;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7705;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7707;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7709;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7711;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7713;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7715;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7717;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7719;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7721;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7723;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7725;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7727;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7729;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7731;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7733;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7735;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7737;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7739;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7741;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XM, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7743;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::Straight).ID: return 7745;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7747;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::InnerRight).ID: return 7749;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7751;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Top, PrismarineBrickStairs::Shape::OuterRight).ID: return 7753;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::Straight).ID: return 7755;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerLeft).ID: return 7757;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::InnerRight).ID: return 7759;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterLeft).ID: return 7761;\n\t\t\tcase PrismarineBrickStairs::PrismarineBrickStairs(eBlockFace::BLOCK_FACE_XP, PrismarineBrickStairs::Half::Bottom, PrismarineBrickStairs::Shape::OuterRight).ID: return 7763;\n\t\t\tcase PrismarineBricks::PrismarineBricks().ID: return 7602;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Top).ID: return 7845;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Bottom).ID: return 7847;\n\t\t\tcase PrismarineSlab::PrismarineSlab(PrismarineSlab::Type::Double).ID: return 7849;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7605;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7607;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7609;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7611;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7613;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7615;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7617;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7619;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7621;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7623;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7625;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7627;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7629;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7631;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7633;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7635;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7637;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7639;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7641;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_ZP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7643;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7645;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7647;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7649;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7651;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7653;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7655;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7657;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7659;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7661;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XM, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7663;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::Straight).ID: return 7665;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerLeft).ID: return 7667;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::InnerRight).ID: return 7669;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterLeft).ID: return 7671;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Top, PrismarineStairs::Shape::OuterRight).ID: return 7673;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::Straight).ID: return 7675;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerLeft).ID: return 7677;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::InnerRight).ID: return 7679;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterLeft).ID: return 7681;\n\t\t\tcase PrismarineStairs::PrismarineStairs(eBlockFace::BLOCK_FACE_XP, PrismarineStairs::Half::Bottom, PrismarineStairs::Shape::OuterRight).ID: return 7683;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11194;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11195;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11196;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11200;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11201;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11202;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11206;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11207;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11208;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11212;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11213;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11214;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11218;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11219;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11220;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11224;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11225;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11226;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11230;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11231;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11232;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11236;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11237;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11238;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11242;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11243;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11244;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11248;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11249;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11250;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11254;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11255;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11256;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11260;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11261;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11262;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11266;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11267;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11268;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11272;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11273;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11274;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11278;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11279;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11280;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11284;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11285;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11286;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11290;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11291;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11292;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11296;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11297;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::None, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11298;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11302;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11303;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11304;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11308;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11309;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11310;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11314;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11315;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11316;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11320;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11321;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11322;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11326;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11327;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11328;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11332;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11333;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11334;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11338;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11339;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11340;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11344;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11345;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11346;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11350;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11351;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11352;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11356;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11357;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11358;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11362;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11363;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11364;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11368;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11369;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11370;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11374;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11375;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11376;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11380;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11381;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11382;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11386;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11387;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11388;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11392;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11393;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11394;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11398;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11399;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11400;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11404;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11405;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Low, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11406;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11410;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11411;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11412;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11416;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11417;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11418;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11422;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11423;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11424;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11428;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11429;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11430;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11434;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11435;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11436;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11440;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11441;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::None, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11442;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11446;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11447;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11448;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11452;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11453;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11454;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11458;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11459;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11460;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11464;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11465;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11466;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11470;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11471;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11472;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11476;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11477;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Low, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11478;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::None).ID: return 11482;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::Low).ID: return 11483;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::None, true, PrismarineWall::West::Tall).ID: return 11484;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::None).ID: return 11488;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::Low).ID: return 11489;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::None, false, PrismarineWall::West::Tall).ID: return 11490;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::None).ID: return 11494;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::Low).ID: return 11495;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Low, true, PrismarineWall::West::Tall).ID: return 11496;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::None).ID: return 11500;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::Low).ID: return 11501;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Low, false, PrismarineWall::West::Tall).ID: return 11502;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::None).ID: return 11506;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::Low).ID: return 11507;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Tall, true, PrismarineWall::West::Tall).ID: return 11508;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::None).ID: return 11512;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::Low).ID: return 11513;\n\t\t\tcase PrismarineWall::PrismarineWall(PrismarineWall::East::Tall, PrismarineWall::North::Tall, PrismarineWall::South::Tall, false, PrismarineWall::West::Tall).ID: return 11514;\n\t\t\tcase Pumpkin::Pumpkin().ID: return 3998;\n\t\t\tcase PumpkinStem::PumpkinStem(0).ID: return 4772;\n\t\t\tcase PumpkinStem::PumpkinStem(1).ID: return 4773;\n\t\t\tcase PumpkinStem::PumpkinStem(2).ID: return 4774;\n\t\t\tcase PumpkinStem::PumpkinStem(3).ID: return 4775;\n\t\t\tcase PumpkinStem::PumpkinStem(4).ID: return 4776;\n\t\t\tcase PumpkinStem::PumpkinStem(5).ID: return 4777;\n\t\t\tcase PumpkinStem::PumpkinStem(6).ID: return 4778;\n\t\t\tcase PumpkinStem::PumpkinStem(7).ID: return 4779;\n\t\t\tcase PurpleBanner::PurpleBanner(0).ID: return 8057;\n\t\t\tcase PurpleBanner::PurpleBanner(1).ID: return 8058;\n\t\t\tcase PurpleBanner::PurpleBanner(2).ID: return 8059;\n\t\t\tcase PurpleBanner::PurpleBanner(3).ID: return 8060;\n\t\t\tcase PurpleBanner::PurpleBanner(4).ID: return 8061;\n\t\t\tcase PurpleBanner::PurpleBanner(5).ID: return 8062;\n\t\t\tcase PurpleBanner::PurpleBanner(6).ID: return 8063;\n\t\t\tcase PurpleBanner::PurpleBanner(7).ID: return 8064;\n\t\t\tcase PurpleBanner::PurpleBanner(8).ID: return 8065;\n\t\t\tcase PurpleBanner::PurpleBanner(9).ID: return 8066;\n\t\t\tcase PurpleBanner::PurpleBanner(10).ID: return 8067;\n\t\t\tcase PurpleBanner::PurpleBanner(11).ID: return 8068;\n\t\t\tcase PurpleBanner::PurpleBanner(12).ID: return 8069;\n\t\t\tcase PurpleBanner::PurpleBanner(13).ID: return 8070;\n\t\t\tcase PurpleBanner::PurpleBanner(14).ID: return 8071;\n\t\t\tcase PurpleBanner::PurpleBanner(15).ID: return 8072;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Head).ID: return 1209;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, true, PurpleBed::Part::Foot).ID: return 1210;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Head).ID: return 1211;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZM, false, PurpleBed::Part::Foot).ID: return 1212;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Head).ID: return 1213;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, true, PurpleBed::Part::Foot).ID: return 1214;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Head).ID: return 1215;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_ZP, false, PurpleBed::Part::Foot).ID: return 1216;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Head).ID: return 1217;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, true, PurpleBed::Part::Foot).ID: return 1218;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Head).ID: return 1219;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XM, false, PurpleBed::Part::Foot).ID: return 1220;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Head).ID: return 1221;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, true, PurpleBed::Part::Foot).ID: return 1222;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Head).ID: return 1223;\n\t\t\tcase PurpleBed::PurpleBed(eBlockFace::BLOCK_FACE_XP, false, PurpleBed::Part::Foot).ID: return 1224;\n\t\t\tcase PurpleCarpet::PurpleCarpet().ID: return 7876;\n\t\t\tcase PurpleConcrete::PurpleConcrete().ID: return 9448;\n\t\t\tcase PurpleConcretePowder::PurpleConcretePowder().ID: return 9464;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9414;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9415;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9416;\n\t\t\tcase PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9417;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9338;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9339;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9340;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9341;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9342;\n\t\t\tcase PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9343;\n\t\t\tcase PurpleStainedGlass::PurpleStainedGlass().ID: return 4105;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, true).ID: return 7185;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, true, false).ID: return 7186;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, true).ID: return 7189;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, true, false, false).ID: return 7190;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, true).ID: return 7193;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, true, false).ID: return 7194;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, true).ID: return 7197;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(true, false, false, false).ID: return 7198;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, true).ID: return 7201;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, true, false).ID: return 7202;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, true).ID: return 7205;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, true, false, false).ID: return 7206;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, true).ID: return 7209;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, true, false).ID: return 7210;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, true).ID: return 7213;\n\t\t\tcase PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, false).ID: return 7214;\n\t\t\tcase PurpleTerracotta::PurpleTerracotta().ID: return 6857;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8193;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8194;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8195;\n\t\t\tcase PurpleWallBanner::PurpleWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8196;\n\t\t\tcase PurpleWool::PurpleWool().ID: return 1394;\n\t\t\tcase PurpurBlock::PurpurBlock().ID: return 9134;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::X).ID: return 9135;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Y).ID: return 9136;\n\t\t\tcase PurpurPillar::PurpurPillar(PurpurPillar::Axis::Z).ID: return 9137;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Top).ID: return 8409;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Bottom).ID: return 8411;\n\t\t\tcase PurpurSlab::PurpurSlab(PurpurSlab::Type::Double).ID: return 8413;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 9139;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 9141;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 9143;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 9145;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 9147;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 9149;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 9151;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 9153;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 9155;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 9157;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 9159;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 9161;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 9163;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 9165;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 9167;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 9169;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 9171;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 9173;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 9175;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 9177;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 9179;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 9181;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 9183;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 9185;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 9187;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 9189;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 9191;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 9193;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 9195;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 9197;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight).ID: return 9199;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerLeft).ID: return 9201;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::InnerRight).ID: return 9203;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterLeft).ID: return 9205;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::OuterRight).ID: return 9207;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight).ID: return 9209;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerLeft).ID: return 9211;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::InnerRight).ID: return 9213;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterLeft).ID: return 9215;\n\t\t\tcase PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::OuterRight).ID: return 9217;\n\t\t\tcase QuartzBlock::QuartzBlock().ID: return 6738;\n\t\t\tcase QuartzBricks::QuartzBricks().ID: return 17103;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::X).ID: return 6740;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Y).ID: return 6741;\n\t\t\tcase QuartzPillar::QuartzPillar(QuartzPillar::Axis::Z).ID: return 6742;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Top).ID: return 8391;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Bottom).ID: return 8393;\n\t\t\tcase QuartzSlab::QuartzSlab(QuartzSlab::Type::Double).ID: return 8395;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6744;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6746;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6748;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6750;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6752;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6754;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6756;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6758;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6760;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6762;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6764;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6766;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6768;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6770;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6772;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6774;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6776;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6778;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6780;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6782;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6784;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6786;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6788;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6790;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6792;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6794;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6796;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6798;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6800;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6802;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight).ID: return 6804;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerLeft).ID: return 6806;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::InnerRight).ID: return 6808;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterLeft).ID: return 6810;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::OuterRight).ID: return 6812;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight).ID: return 6814;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerLeft).ID: return 6816;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::InnerRight).ID: return 6818;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterLeft).ID: return 6820;\n\t\t\tcase QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::OuterRight).ID: return 6822;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthSouth).ID: return 3645;\n\t\t\tcase Rail::Rail(Rail::Shape::EastWest).ID: return 3646;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingEast).ID: return 3647;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingWest).ID: return 3648;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingNorth).ID: return 3649;\n\t\t\tcase Rail::Rail(Rail::Shape::AscendingSouth).ID: return 3650;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthEast).ID: return 3651;\n\t\t\tcase Rail::Rail(Rail::Shape::SouthWest).ID: return 3652;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthWest).ID: return 3653;\n\t\t\tcase Rail::Rail(Rail::Shape::NorthEast).ID: return 3654;\n\t\t\tcase RedBanner::RedBanner(0).ID: return 8121;\n\t\t\tcase RedBanner::RedBanner(1).ID: return 8122;\n\t\t\tcase RedBanner::RedBanner(2).ID: return 8123;\n\t\t\tcase RedBanner::RedBanner(3).ID: return 8124;\n\t\t\tcase RedBanner::RedBanner(4).ID: return 8125;\n\t\t\tcase RedBanner::RedBanner(5).ID: return 8126;\n\t\t\tcase RedBanner::RedBanner(6).ID: return 8127;\n\t\t\tcase RedBanner::RedBanner(7).ID: return 8128;\n\t\t\tcase RedBanner::RedBanner(8).ID: return 8129;\n\t\t\tcase RedBanner::RedBanner(9).ID: return 8130;\n\t\t\tcase RedBanner::RedBanner(10).ID: return 8131;\n\t\t\tcase RedBanner::RedBanner(11).ID: return 8132;\n\t\t\tcase RedBanner::RedBanner(12).ID: return 8133;\n\t\t\tcase RedBanner::RedBanner(13).ID: return 8134;\n\t\t\tcase RedBanner::RedBanner(14).ID: return 8135;\n\t\t\tcase RedBanner::RedBanner(15).ID: return 8136;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Head).ID: return 1273;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Foot).ID: return 1274;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Head).ID: return 1275;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Foot).ID: return 1276;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Head).ID: return 1277;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Foot).ID: return 1278;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Head).ID: return 1279;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Foot).ID: return 1280;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Head).ID: return 1281;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Foot).ID: return 1282;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Head).ID: return 1283;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Foot).ID: return 1284;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Head).ID: return 1285;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Foot).ID: return 1286;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Head).ID: return 1287;\n\t\t\tcase RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Foot).ID: return 1288;\n\t\t\tcase RedCarpet::RedCarpet().ID: return 7880;\n\t\t\tcase RedConcrete::RedConcrete().ID: return 9452;\n\t\t\tcase RedConcretePowder::RedConcretePowder().ID: return 9468;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9430;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9431;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9432;\n\t\t\tcase RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9433;\n\t\t\tcase RedMushroom::RedMushroom().ID: return 1426;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, true).ID: return 4569;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, false).ID: return 4570;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, true).ID: return 4571;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, true, false, false).ID: return 4572;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, true).ID: return 4573;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, true, false).ID: return 4574;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, true).ID: return 4575;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, true, false, false, false).ID: return 4576;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, true).ID: return 4577;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, true, false).ID: return 4578;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, true).ID: return 4579;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, true, false, false).ID: return 4580;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, true).ID: return 4581;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, true, false).ID: return 4582;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, true).ID: return 4583;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, true, false, false, false, false).ID: return 4584;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, true).ID: return 4585;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, true, false).ID: return 4586;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, true).ID: return 4587;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, true, false, false).ID: return 4588;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, true).ID: return 4589;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, true, false).ID: return 4590;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, true).ID: return 4591;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, true, false, false, false).ID: return 4592;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, true).ID: return 4593;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, true, false).ID: return 4594;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, true).ID: return 4595;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, true, false, false).ID: return 4596;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, true).ID: return 4597;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, true, false).ID: return 4598;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, true).ID: return 4599;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(true, false, false, false, false, false).ID: return 4600;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, true).ID: return 4601;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, true, false).ID: return 4602;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, true).ID: return 4603;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, true, false, false).ID: return 4604;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, true).ID: return 4605;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, false).ID: return 4606;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, true).ID: return 4607;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, true, false, false, false).ID: return 4608;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, true).ID: return 4609;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, false).ID: return 4610;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, true).ID: return 4611;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, true, false, false).ID: return 4612;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, true).ID: return 4613;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, false).ID: return 4614;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, true).ID: return 4615;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, true, false, false, false, false).ID: return 4616;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, true).ID: return 4617;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, true, false).ID: return 4618;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, true).ID: return 4619;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, true, false, false).ID: return 4620;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, true).ID: return 4621;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, false).ID: return 4622;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, true).ID: return 4623;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, true, false, false, false).ID: return 4624;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, true).ID: return 4625;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, false).ID: return 4626;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, true).ID: return 4627;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, true, false, false).ID: return 4628;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, true).ID: return 4629;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, false).ID: return 4630;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, true).ID: return 4631;\n\t\t\tcase RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false).ID: return 4632;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Top).ID: return 10850;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Bottom).ID: return 10852;\n\t\t\tcase RedNetherBrickSlab::RedNetherBrickSlab(RedNetherBrickSlab::Type::Double).ID: return 10854;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10550;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10552;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10554;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10556;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10558;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10560;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10562;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10564;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10566;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10568;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10570;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10572;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10574;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10576;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10578;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10580;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10582;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10584;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10586;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10588;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10590;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10592;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10594;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10596;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10598;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10600;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10602;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10604;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10606;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XM, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10608;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::Straight).ID: return 10610;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10612;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::InnerRight).ID: return 10614;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10616;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Top, RedNetherBrickStairs::Shape::OuterRight).ID: return 10618;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::Straight).ID: return 10620;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerLeft).ID: return 10622;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::InnerRight).ID: return 10624;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterLeft).ID: return 10626;\n\t\t\tcase RedNetherBrickStairs::RedNetherBrickStairs(eBlockFace::BLOCK_FACE_XP, RedNetherBrickStairs::Half::Bottom, RedNetherBrickStairs::Shape::OuterRight).ID: return 10628;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13462;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13463;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13464;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13468;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13469;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13470;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13474;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13475;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13476;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13480;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13481;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13482;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13486;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13487;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13488;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13492;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13493;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13494;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13498;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13499;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13500;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13504;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13505;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13506;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13510;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13511;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13512;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13516;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13517;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13518;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13522;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13523;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13524;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13528;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13529;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13530;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13534;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13535;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13536;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13540;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13541;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13542;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13546;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13547;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13548;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13552;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13553;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13554;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13558;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13559;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13560;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13564;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13565;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::None, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13566;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13570;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13571;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13572;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13576;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13577;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13578;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13582;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13583;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13584;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13588;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13589;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13590;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13594;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13595;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13596;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13600;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13601;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13602;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13606;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13607;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13608;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13612;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13613;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13614;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13618;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13619;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13620;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13624;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13625;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13626;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13630;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13631;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13632;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13636;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13637;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13638;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13642;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13643;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13644;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13648;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13649;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13650;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13654;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13655;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13656;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13660;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13661;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13662;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13666;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13667;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13668;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13672;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13673;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Low, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13674;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13678;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13679;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13680;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13684;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13685;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13686;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13690;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13691;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13692;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13696;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13697;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13698;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13702;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13703;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13704;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13708;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13709;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::None, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13710;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13714;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13715;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13716;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13720;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13721;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13722;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13726;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13727;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13728;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13732;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13733;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13734;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13738;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13739;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13740;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13744;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13745;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Low, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13746;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::None).ID: return 13750;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Low).ID: return 13751;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, true, RedNetherBrickWall::West::Tall).ID: return 13752;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::None).ID: return 13756;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Low).ID: return 13757;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::None, false, RedNetherBrickWall::West::Tall).ID: return 13758;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::None).ID: return 13762;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Low).ID: return 13763;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, true, RedNetherBrickWall::West::Tall).ID: return 13764;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::None).ID: return 13768;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Low).ID: return 13769;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Low, false, RedNetherBrickWall::West::Tall).ID: return 13770;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::None).ID: return 13774;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Low).ID: return 13775;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, true, RedNetherBrickWall::West::Tall).ID: return 13776;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::None).ID: return 13780;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Low).ID: return 13781;\n\t\t\tcase RedNetherBrickWall::RedNetherBrickWall(RedNetherBrickWall::East::Tall, RedNetherBrickWall::North::Tall, RedNetherBrickWall::South::Tall, false, RedNetherBrickWall::West::Tall).ID: return 13782;\n\t\t\tcase RedNetherBricks::RedNetherBricks().ID: return 9255;\n\t\t\tcase RedSand::RedSand().ID: return 67;\n\t\t\tcase RedSandstone::RedSandstone().ID: return 8217;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Top).ID: return 8397;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Bottom).ID: return 8399;\n\t\t\tcase RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Double).ID: return 8401;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 8221;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 8223;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 8225;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 8227;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 8229;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 8231;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 8233;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 8235;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 8237;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 8239;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 8241;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 8243;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 8245;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 8247;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 8249;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 8251;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 8253;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 8255;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 8257;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 8259;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 8261;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 8263;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 8265;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 8267;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 8269;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 8271;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 8273;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 8275;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 8277;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 8279;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight).ID: return 8281;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerLeft).ID: return 8283;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::InnerRight).ID: return 8285;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterLeft).ID: return 8287;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::OuterRight).ID: return 8289;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight).ID: return 8291;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerLeft).ID: return 8293;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::InnerRight).ID: return 8295;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterLeft).ID: return 8297;\n\t\t\tcase RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::OuterRight).ID: return 8299;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11518;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11519;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11520;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11524;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11525;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11526;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11530;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11531;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11532;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11536;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11537;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11538;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11542;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11543;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11544;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11548;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11549;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11550;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11554;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11555;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11556;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11560;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11561;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11562;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11566;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11567;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11568;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11572;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11573;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11574;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11578;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11579;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11580;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11584;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11585;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11586;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11590;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11591;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11592;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11596;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11597;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11598;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11602;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11603;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11604;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11608;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11609;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11610;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11614;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11615;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11616;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11620;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11621;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::None, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11622;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11626;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11627;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11628;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11632;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11633;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11634;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11638;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11639;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11640;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11644;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11645;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11646;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11650;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11651;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11652;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11656;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11657;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11658;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11662;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11663;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11664;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11668;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11669;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11670;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11674;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11675;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11676;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11680;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11681;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11682;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11686;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11687;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11688;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11692;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11693;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11694;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11698;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11699;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11700;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11704;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11705;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11706;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11710;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11711;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11712;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11716;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11717;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11718;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11722;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11723;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11724;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11728;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11729;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Low, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11730;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11734;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11735;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11736;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11740;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11741;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11742;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11746;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11747;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11748;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11752;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11753;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11754;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11758;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11759;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11760;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11764;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11765;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::None, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11766;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11770;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11771;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11772;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11776;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11777;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11778;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11782;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11783;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11784;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11788;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11789;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11790;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11794;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11795;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11796;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11800;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11801;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Low, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11802;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::None).ID: return 11806;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Low).ID: return 11807;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, true, RedSandstoneWall::West::Tall).ID: return 11808;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::None).ID: return 11812;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Low).ID: return 11813;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::None, false, RedSandstoneWall::West::Tall).ID: return 11814;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::None).ID: return 11818;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Low).ID: return 11819;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, true, RedSandstoneWall::West::Tall).ID: return 11820;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::None).ID: return 11824;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Low).ID: return 11825;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Low, false, RedSandstoneWall::West::Tall).ID: return 11826;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::None).ID: return 11830;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Low).ID: return 11831;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, true, RedSandstoneWall::West::Tall).ID: return 11832;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::None).ID: return 11836;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Low).ID: return 11837;\n\t\t\tcase RedSandstoneWall::RedSandstoneWall(RedSandstoneWall::East::Tall, RedSandstoneWall::North::Tall, RedSandstoneWall::South::Tall, false, RedSandstoneWall::West::Tall).ID: return 11838;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9362;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9363;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9364;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9365;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9366;\n\t\t\tcase RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9367;\n\t\t\tcase RedStainedGlass::RedStainedGlass().ID: return 4109;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, true).ID: return 7313;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, true, false).ID: return 7314;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, true).ID: return 7317;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, true, false, false).ID: return 7318;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, true).ID: return 7321;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, true, false).ID: return 7322;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, true).ID: return 7325;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(true, false, false, false).ID: return 7326;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, true).ID: return 7329;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, true, false).ID: return 7330;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, true).ID: return 7333;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, true, false, false).ID: return 7334;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, true).ID: return 7337;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, true, false).ID: return 7338;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, true).ID: return 7341;\n\t\t\tcase RedStainedGlassPane::RedStainedGlassPane(false, false, false, false).ID: return 7342;\n\t\t\tcase RedTerracotta::RedTerracotta().ID: return 6861;\n\t\t\tcase RedTulip::RedTulip().ID: return 1417;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8209;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8210;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8211;\n\t\t\tcase RedWallBanner::RedWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8212;\n\t\t\tcase RedWool::RedWool().ID: return 1398;\n\t\t\tcase RedstoneBlock::RedstoneBlock().ID: return 6726;\n\t\t\tcase RedstoneLamp::RedstoneLamp(true).ID: return 5156;\n\t\t\tcase RedstoneLamp::RedstoneLamp(false).ID: return 5157;\n\t\t\tcase RedstoneOre::RedstoneOre(true).ID: return 3885;\n\t\t\tcase RedstoneOre::RedstoneOre(false).ID: return 3886;\n\t\t\tcase RedstoneTorch::RedstoneTorch(true).ID: return 3887;\n\t\t\tcase RedstoneTorch::RedstoneTorch(false).ID: return 3888;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, true).ID: return 3889;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, false).ID: return 3890;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, true).ID: return 3891;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, false).ID: return 3892;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, true).ID: return 3893;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, false).ID: return 3894;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, true).ID: return 3895;\n\t\t\tcase RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, false).ID: return 3896;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2058;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2059;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2060;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2061;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2062;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2063;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2064;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2065;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2066;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2067;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2068;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2069;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2070;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2071;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2072;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2073;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2074;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2075;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2076;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2077;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2078;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2079;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2080;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2081;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2082;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2083;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2084;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2085;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2086;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2087;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2088;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2089;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2090;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2091;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2092;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2093;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2094;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2095;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2096;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2097;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2098;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2099;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2100;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2101;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2102;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2103;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2104;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2105;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2106;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2107;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2108;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2109;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2110;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2111;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2112;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2113;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2114;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2115;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2116;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2117;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2118;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2119;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2120;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2121;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2122;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2123;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2124;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2125;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2126;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2127;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2128;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2129;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2130;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2131;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2132;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2133;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2134;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2135;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2136;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2137;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2138;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2139;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2140;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2141;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2142;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2143;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2144;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2145;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2146;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2147;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2148;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2149;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2150;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2151;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2152;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2153;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2154;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2155;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2156;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2157;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2158;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2159;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2160;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2161;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2162;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2163;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2164;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2165;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2166;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2167;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2168;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2169;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2170;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2171;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2172;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2173;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2174;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2175;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2176;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2177;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2178;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2179;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2180;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2181;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2182;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2183;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2184;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2185;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2186;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2187;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2188;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2189;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2190;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2191;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2192;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2193;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2194;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2195;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2196;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2197;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2198;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2199;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2200;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2201;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2202;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2203;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2204;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2205;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2206;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2207;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2208;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2209;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2210;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2211;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2212;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2213;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2214;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2215;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2216;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2217;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2218;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2219;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2220;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2221;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2222;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2223;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2224;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2225;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2226;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2227;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2228;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2229;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2230;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2231;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2232;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2233;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2234;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2235;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2236;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2237;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2238;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2239;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2240;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2241;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2242;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2243;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2244;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2245;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2246;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2247;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2248;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2249;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2250;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2251;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2252;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2253;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2254;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2255;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2256;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2257;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2258;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2259;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2260;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2261;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2262;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2263;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2264;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2265;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2266;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2267;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2268;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2269;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2270;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2271;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2272;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2273;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2274;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2275;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2276;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2277;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2278;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2279;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2280;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2281;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2282;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2283;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2284;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2285;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2286;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2287;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2288;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2289;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2290;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2291;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2292;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2293;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2294;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2295;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2296;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2297;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2298;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2299;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2300;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2301;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2302;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2303;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2304;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2305;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2306;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2307;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2308;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2309;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2310;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2311;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2312;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2313;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2314;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2315;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2316;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2317;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2318;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2319;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2320;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2321;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2322;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2323;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2324;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2325;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2326;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2327;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2328;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2329;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2330;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2331;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2332;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2333;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2334;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2335;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2336;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2337;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2338;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2339;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2340;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2341;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2342;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2343;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2344;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2345;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2346;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2347;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2348;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2349;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2350;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2351;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2352;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2353;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2354;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2355;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2356;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2357;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2358;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2359;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2360;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2361;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2362;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2363;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2364;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2365;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2366;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2367;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2368;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2369;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2370;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2371;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2372;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2373;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2374;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2375;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2376;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2377;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2378;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2379;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2380;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2381;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2382;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2383;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2384;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2385;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2386;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2387;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2388;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2389;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2390;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2391;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2392;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2393;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2394;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2395;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2396;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2397;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2398;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2399;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2400;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2401;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2402;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2403;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2404;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2405;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2406;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2407;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2408;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2409;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2410;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2411;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2412;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2413;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2414;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2415;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2416;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2417;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2418;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2419;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2420;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2421;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2422;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2423;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2424;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2425;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2426;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2427;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2428;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2429;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2430;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2431;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2432;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2433;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2434;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2435;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2436;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2437;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2438;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2439;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2440;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2441;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2442;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2443;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2444;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2445;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2446;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2447;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2448;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2449;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2450;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2451;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2452;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2453;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2454;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2455;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2456;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2457;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2458;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2459;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2460;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2461;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2462;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2463;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2464;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2465;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2466;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2467;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2468;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2469;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2470;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2471;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2472;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2473;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2474;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2475;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2476;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2477;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2478;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2479;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2480;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2481;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2482;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2483;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2484;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2485;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2486;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2487;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2488;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Up, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2489;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2490;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2491;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2492;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2493;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2494;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2495;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2496;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2497;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2498;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2499;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2500;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2501;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2502;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2503;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2504;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2505;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2506;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2507;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2508;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2509;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2510;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2511;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2512;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2513;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2514;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2515;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2516;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2517;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2518;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2519;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2520;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2521;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2522;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2523;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2524;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2525;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2526;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2527;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2528;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2529;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2530;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2531;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2532;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2533;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2534;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2535;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2536;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2537;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2538;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2539;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2540;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2541;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2542;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2543;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2544;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2545;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2546;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2547;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2548;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2549;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2550;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2551;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2552;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2553;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2554;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2555;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2556;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2557;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2558;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2559;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2560;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2561;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2562;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2563;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2564;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2565;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2566;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2567;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2568;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2569;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2570;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2571;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2572;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2573;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2574;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2575;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2576;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2577;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2578;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2579;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2580;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2581;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2582;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2583;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2584;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2585;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2586;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2587;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2588;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2589;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2590;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2591;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2592;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2593;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2594;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2595;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2596;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2597;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2598;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2599;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2600;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2601;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2602;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2603;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2604;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2605;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2606;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2607;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2608;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2609;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2610;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2611;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2612;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2613;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2614;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2615;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2616;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2617;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2618;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2619;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2620;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2621;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2622;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2623;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2624;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2625;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2626;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2627;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2628;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2629;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2630;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2631;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2632;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2633;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2634;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2635;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2636;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2637;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2638;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2639;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2640;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2641;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2642;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2643;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2644;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2645;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2646;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2647;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2648;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2649;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2650;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2651;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2652;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2653;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2654;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2655;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2656;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2657;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2658;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2659;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2660;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2661;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2662;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2663;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2664;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2665;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2666;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2667;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2668;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2669;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2670;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2671;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2672;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2673;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2674;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2675;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2676;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2677;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2678;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2679;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2680;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2681;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2682;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2683;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2684;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2685;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2686;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2687;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2688;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2689;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2690;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2691;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2692;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2693;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2694;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2695;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2696;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2697;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2698;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2699;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2700;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2701;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2702;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2703;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2704;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2705;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2706;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2707;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2708;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2709;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2710;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2711;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2712;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2713;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2714;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2715;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2716;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2717;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2718;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2719;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2720;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2721;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2722;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2723;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2724;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2725;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2726;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2727;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2728;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2729;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2730;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2731;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2732;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2733;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2734;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2735;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2736;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2737;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2738;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2739;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2740;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2741;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2742;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2743;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2744;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2745;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2746;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2747;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2748;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2749;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2750;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2751;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2752;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2753;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2754;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2755;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2756;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2757;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2758;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2759;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2760;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2761;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2762;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2763;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2764;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2765;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2766;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2767;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2768;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2769;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2770;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2771;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2772;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2773;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2774;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2775;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2776;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2777;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2778;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2779;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2780;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2781;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2782;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2783;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2784;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2785;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2786;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2787;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2788;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2789;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2790;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2791;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2792;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2793;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2794;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2795;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2796;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2797;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2798;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2799;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2800;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2801;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2802;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2803;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2804;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2805;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2806;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2807;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2808;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2809;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2810;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2811;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2812;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2813;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2814;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2815;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2816;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2817;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2818;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2819;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2820;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2821;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2822;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2823;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2824;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2825;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2826;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2827;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2828;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2829;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2830;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2831;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2832;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2833;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2834;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2835;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2836;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2837;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2838;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2839;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2840;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2841;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2842;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2843;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2844;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2845;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2846;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2847;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2848;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2849;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2850;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2851;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2852;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2853;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2854;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2855;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2856;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2857;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2858;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2859;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2860;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2861;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2862;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2863;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2864;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2865;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2866;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2867;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2868;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2869;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2870;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2871;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2872;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2873;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2874;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2875;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2876;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2877;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2878;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2879;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2880;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2881;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2882;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2883;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2884;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2885;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2886;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2887;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2888;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2889;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2890;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2891;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2892;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2893;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2894;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2895;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2896;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2897;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2898;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2899;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2900;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2901;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2902;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2903;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2904;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2905;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2906;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2907;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2908;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2909;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2910;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2911;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2912;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2913;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2914;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2915;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2916;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2917;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2918;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2919;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2920;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::Side, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2921;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2922;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2923;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2924;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2925;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2926;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2927;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2928;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2929;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2930;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2931;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2932;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2933;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2934;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2935;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2936;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2937;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2938;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2939;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2940;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2941;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2942;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2943;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2944;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2945;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2946;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2947;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2948;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2949;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2950;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2951;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2952;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2953;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2954;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2955;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2956;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2957;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2958;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2959;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2960;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2961;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2962;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2963;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2964;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2965;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2966;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2967;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2968;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2969;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2970;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2971;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2972;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2973;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2974;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2975;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2976;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2977;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2978;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2979;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2980;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2981;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2982;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2983;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2984;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2985;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2986;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2987;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2988;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2989;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2990;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 2991;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 2992;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 2993;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 2994;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 2995;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 2996;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 2997;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 2998;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 2999;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3000;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3001;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3002;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3003;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3004;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3005;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3006;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3007;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3008;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3009;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3010;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3011;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3012;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3013;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3014;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3015;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3016;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3017;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3018;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3019;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3020;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3021;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3022;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3023;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3024;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3025;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3026;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3027;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3028;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3029;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3030;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3031;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3032;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3033;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3034;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3035;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3036;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3037;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3038;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3039;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3040;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3041;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3042;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3043;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3044;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3045;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3046;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3047;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3048;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3049;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3050;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3051;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3052;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3053;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3054;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3055;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3056;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3057;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3058;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3059;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3060;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3061;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3062;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3063;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3064;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Up, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3065;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3066;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3067;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3068;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3069;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3070;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3071;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3072;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3073;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3074;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3075;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3076;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3077;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3078;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3079;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3080;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3081;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3082;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3083;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3084;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3085;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3086;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3087;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3088;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3089;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3090;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3091;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3092;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3093;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3094;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3095;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3096;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3097;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3098;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3099;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3100;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3101;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3102;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3103;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3104;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3105;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3106;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3107;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3108;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3109;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3110;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3111;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3112;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3113;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3114;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3115;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3116;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3117;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3118;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3119;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3120;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3121;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3122;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3123;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3124;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3125;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3126;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3127;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3128;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3129;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3130;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3131;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3132;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3133;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3134;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3135;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3136;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3137;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3138;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3139;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3140;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3141;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3142;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3143;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3144;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3145;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3146;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3147;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3148;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3149;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3150;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3151;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3152;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3153;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3154;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3155;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3156;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3157;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3158;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3159;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3160;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3161;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3162;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3163;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3164;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3165;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3166;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3167;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3168;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3169;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3170;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3171;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3172;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3173;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3174;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3175;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3176;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3177;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3178;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3179;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3180;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3181;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3182;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3183;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3184;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3185;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3186;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3187;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3188;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3189;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3190;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3191;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3192;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3193;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3194;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3195;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3196;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3197;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3198;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3199;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3200;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3201;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3202;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3203;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3204;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3205;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3206;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3207;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3208;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::Side, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3209;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3210;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3211;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3212;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3213;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3214;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3215;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3216;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3217;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3218;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3219;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3220;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3221;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3222;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3223;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3224;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3225;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3226;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3227;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3228;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3229;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3230;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3231;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3232;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3233;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3234;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3235;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3236;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3237;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3238;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3239;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3240;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3241;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3242;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3243;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3244;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3245;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3246;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3247;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3248;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3249;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3250;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3251;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3252;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3253;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3254;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3255;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3256;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3257;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3258;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3259;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3260;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3261;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3262;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3263;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3264;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3265;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3266;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3267;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3268;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3269;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3270;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3271;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3272;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3273;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3274;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3275;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3276;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3277;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3278;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3279;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3280;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3281;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3282;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3283;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3284;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3285;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3286;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3287;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3288;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3289;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3290;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3291;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3292;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3293;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3294;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3295;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3296;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3297;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3298;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3299;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3300;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3301;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3302;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3303;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3304;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3305;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3306;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3307;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3308;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3309;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3310;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3311;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3312;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3313;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3314;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3315;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3316;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3317;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3318;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3319;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3320;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3321;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3322;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3323;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3324;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3325;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3326;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3327;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3328;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3329;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3330;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3331;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3332;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3333;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3334;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3335;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3336;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3337;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3338;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3339;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3340;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3341;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3342;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3343;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3344;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Up).ID: return 3345;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::Side).ID: return 3346;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Up, RedstoneWire::West::None).ID: return 3347;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Up).ID: return 3348;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::Side).ID: return 3349;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::Side, RedstoneWire::West::None).ID: return 3350;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Up).ID: return 3351;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::Side).ID: return 3352;\n\t\t\tcase RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None).ID: return 3353;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4031;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4032;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4033;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4034;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4035;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4036;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4037;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4038;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4039;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4040;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4041;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4042;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4043;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4044;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4045;\n\t\t\tcase Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4046;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4047;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4048;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4049;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4050;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4051;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4052;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4053;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4054;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4055;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4056;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4057;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4058;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4059;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4060;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4061;\n\t\t\tcase Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4062;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4063;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4064;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4065;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4066;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4067;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4068;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4069;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4070;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4071;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4072;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4073;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4074;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4075;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4076;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4077;\n\t\t\tcase Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4078;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 4079;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 4080;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 4081;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 4082;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 4083;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 4084;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 4085;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 4086;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, true).ID: return 4087;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, true, false).ID: return 4088;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, true).ID: return 4089;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, false).ID: return 4090;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, true).ID: return 4091;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, true, false).ID: return 4092;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, true).ID: return 4093;\n\t\t\tcase Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, false).ID: return 4094;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZM).ID: return 9225;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XP).ID: return 9226;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZP).ID: return 9227;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XM).ID: return 9228;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YP).ID: return 9229;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YM).ID: return 9230;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZM).ID: return 9231;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XP).ID: return 9232;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZP).ID: return 9233;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XM).ID: return 9234;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YP).ID: return 9235;\n\t\t\tcase RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YM).ID: return 9236;\n\t\t\tcase RespawnAnchor::RespawnAnchor(0).ID: return 15829;\n\t\t\tcase RespawnAnchor::RespawnAnchor(1).ID: return 15830;\n\t\t\tcase RespawnAnchor::RespawnAnchor(2).ID: return 15831;\n\t\t\tcase RespawnAnchor::RespawnAnchor(3).ID: return 15832;\n\t\t\tcase RespawnAnchor::RespawnAnchor(4).ID: return 15833;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Upper).ID: return 7889;\n\t\t\tcase RoseBush::RoseBush(RoseBush::Half::Lower).ID: return 7890;\n\t\t\tcase Sand::Sand().ID: return 66;\n\t\t\tcase Sandstone::Sandstone().ID: return 246;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Top).ID: return 8349;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Bottom).ID: return 8351;\n\t\t\tcase SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Double).ID: return 8353;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5171;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5173;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5175;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5177;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5179;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5181;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5183;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5185;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5187;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5189;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5191;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5193;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5195;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5197;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5199;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5201;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5203;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5205;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5207;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5209;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5211;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5213;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5215;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5217;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5219;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5221;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5223;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5225;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5227;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5229;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight).ID: return 5231;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerLeft).ID: return 5233;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::InnerRight).ID: return 5235;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterLeft).ID: return 5237;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::OuterRight).ID: return 5239;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight).ID: return 5241;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerLeft).ID: return 5243;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::InnerRight).ID: return 5245;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterLeft).ID: return 5247;\n\t\t\tcase SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::OuterRight).ID: return 5249;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 13786;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 13787;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 13788;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 13792;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 13793;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 13794;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 13798;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 13799;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 13800;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 13804;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 13805;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 13806;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 13810;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 13811;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 13812;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 13816;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 13817;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 13818;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 13822;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 13823;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 13824;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 13828;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 13829;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 13830;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 13834;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 13835;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 13836;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 13840;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 13841;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 13842;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 13846;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 13847;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 13848;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 13852;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 13853;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 13854;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 13858;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 13859;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 13860;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 13864;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 13865;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 13866;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 13870;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 13871;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 13872;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 13876;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 13877;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 13878;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 13882;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 13883;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 13884;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 13888;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 13889;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::None, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 13890;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 13894;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 13895;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 13896;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 13900;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 13901;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 13902;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 13906;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 13907;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 13908;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 13912;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 13913;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 13914;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 13918;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 13919;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 13920;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 13924;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 13925;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 13926;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 13930;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 13931;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 13932;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 13936;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 13937;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 13938;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 13942;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 13943;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 13944;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 13948;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 13949;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 13950;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 13954;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 13955;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 13956;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 13960;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 13961;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 13962;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 13966;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 13967;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 13968;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 13972;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 13973;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 13974;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 13978;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 13979;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 13980;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 13984;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 13985;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 13986;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 13990;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 13991;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 13992;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 13996;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 13997;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Low, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 13998;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 14002;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 14003;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 14004;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 14008;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 14009;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 14010;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 14014;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 14015;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 14016;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 14020;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 14021;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 14022;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 14026;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 14027;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 14028;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 14032;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 14033;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::None, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 14034;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 14038;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 14039;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 14040;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 14044;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 14045;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 14046;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 14050;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 14051;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 14052;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 14056;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 14057;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 14058;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 14062;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 14063;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 14064;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 14068;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 14069;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Low, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 14070;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::None).ID: return 14074;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::Low).ID: return 14075;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::None, true, SandstoneWall::West::Tall).ID: return 14076;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::None).ID: return 14080;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::Low).ID: return 14081;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::None, false, SandstoneWall::West::Tall).ID: return 14082;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::None).ID: return 14086;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::Low).ID: return 14087;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Low, true, SandstoneWall::West::Tall).ID: return 14088;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::None).ID: return 14092;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::Low).ID: return 14093;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Low, false, SandstoneWall::West::Tall).ID: return 14094;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::None).ID: return 14098;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::Low).ID: return 14099;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Tall, true, SandstoneWall::West::Tall).ID: return 14100;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::None).ID: return 14104;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::Low).ID: return 14105;\n\t\t\tcase SandstoneWall::SandstoneWall(SandstoneWall::East::Tall, SandstoneWall::North::Tall, SandstoneWall::South::Tall, false, SandstoneWall::West::Tall).ID: return 14106;\n\t\t\tcase Scaffolding::Scaffolding(true, 0).ID: return 14756;\n\t\t\tcase Scaffolding::Scaffolding(true, 1).ID: return 14758;\n\t\t\tcase Scaffolding::Scaffolding(true, 2).ID: return 14760;\n\t\t\tcase Scaffolding::Scaffolding(true, 3).ID: return 14762;\n\t\t\tcase Scaffolding::Scaffolding(true, 4).ID: return 14764;\n\t\t\tcase Scaffolding::Scaffolding(true, 5).ID: return 14766;\n\t\t\tcase Scaffolding::Scaffolding(true, 6).ID: return 14768;\n\t\t\tcase Scaffolding::Scaffolding(true, 7).ID: return 14770;\n\t\t\tcase Scaffolding::Scaffolding(false, 0).ID: return 14772;\n\t\t\tcase Scaffolding::Scaffolding(false, 1).ID: return 14774;\n\t\t\tcase Scaffolding::Scaffolding(false, 2).ID: return 14776;\n\t\t\tcase Scaffolding::Scaffolding(false, 3).ID: return 14778;\n\t\t\tcase Scaffolding::Scaffolding(false, 4).ID: return 14780;\n\t\t\tcase Scaffolding::Scaffolding(false, 5).ID: return 14782;\n\t\t\tcase Scaffolding::Scaffolding(false, 6).ID: return 14784;\n\t\t\tcase Scaffolding::Scaffolding(false, 7).ID: return 14786;\n\t\t\tcase SeaLantern::SeaLantern().ID: return 7862;\n\t\t\tcase SeaPickle::SeaPickle(1).ID: return 9641;\n\t\t\tcase SeaPickle::SeaPickle(2).ID: return 9643;\n\t\t\tcase SeaPickle::SeaPickle(3).ID: return 9645;\n\t\t\tcase SeaPickle::SeaPickle(4).ID: return 9647;\n\t\t\tcase Seagrass::Seagrass().ID: return 1345;\n\t\t\tcase Shroomlight::Shroomlight().ID: return 14989;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9272;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9273;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9274;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9275;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9276;\n\t\t\tcase ShulkerBox::ShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9277;\n\t\t\tcase SkeletonSkull::SkeletonSkull(0).ID: return 6490;\n\t\t\tcase SkeletonSkull::SkeletonSkull(1).ID: return 6491;\n\t\t\tcase SkeletonSkull::SkeletonSkull(2).ID: return 6492;\n\t\t\tcase SkeletonSkull::SkeletonSkull(3).ID: return 6493;\n\t\t\tcase SkeletonSkull::SkeletonSkull(4).ID: return 6494;\n\t\t\tcase SkeletonSkull::SkeletonSkull(5).ID: return 6495;\n\t\t\tcase SkeletonSkull::SkeletonSkull(6).ID: return 6496;\n\t\t\tcase SkeletonSkull::SkeletonSkull(7).ID: return 6497;\n\t\t\tcase SkeletonSkull::SkeletonSkull(8).ID: return 6498;\n\t\t\tcase SkeletonSkull::SkeletonSkull(9).ID: return 6499;\n\t\t\tcase SkeletonSkull::SkeletonSkull(10).ID: return 6500;\n\t\t\tcase SkeletonSkull::SkeletonSkull(11).ID: return 6501;\n\t\t\tcase SkeletonSkull::SkeletonSkull(12).ID: return 6502;\n\t\t\tcase SkeletonSkull::SkeletonSkull(13).ID: return 6503;\n\t\t\tcase SkeletonSkull::SkeletonSkull(14).ID: return 6504;\n\t\t\tcase SkeletonSkull::SkeletonSkull(15).ID: return 6505;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 6506;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 6507;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 6508;\n\t\t\tcase SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 6509;\n\t\t\tcase SlimeBlock::SlimeBlock().ID: return 7535;\n\t\t\tcase SmithingTable::SmithingTable().ID: return 14849;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZM, true).ID: return 14803;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZM, false).ID: return 14804;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZP, true).ID: return 14805;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_ZP, false).ID: return 14806;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XM, true).ID: return 14807;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XM, false).ID: return 14808;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XP, true).ID: return 14809;\n\t\t\tcase Smoker::Smoker(eBlockFace::BLOCK_FACE_XP, false).ID: return 14810;\n\t\t\tcase SmoothQuartz::SmoothQuartz().ID: return 8416;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Top).ID: return 10832;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Bottom).ID: return 10834;\n\t\t\tcase SmoothQuartzSlab::SmoothQuartzSlab(SmoothQuartzSlab::Type::Double).ID: return 10836;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 10310;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 10312;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 10314;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 10316;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 10318;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 10320;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 10322;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 10324;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 10326;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 10328;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 10330;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 10332;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 10334;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 10336;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 10338;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 10340;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 10342;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 10344;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 10346;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_ZP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 10348;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 10350;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 10352;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 10354;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 10356;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 10358;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 10360;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 10362;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 10364;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 10366;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XM, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 10368;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::Straight).ID: return 10370;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerLeft).ID: return 10372;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::InnerRight).ID: return 10374;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterLeft).ID: return 10376;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Top, SmoothQuartzStairs::Shape::OuterRight).ID: return 10378;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::Straight).ID: return 10380;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerLeft).ID: return 10382;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::InnerRight).ID: return 10384;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterLeft).ID: return 10386;\n\t\t\tcase SmoothQuartzStairs::SmoothQuartzStairs(eBlockFace::BLOCK_FACE_XP, SmoothQuartzStairs::Half::Bottom, SmoothQuartzStairs::Shape::OuterRight).ID: return 10388;\n\t\t\tcase SmoothRedSandstone::SmoothRedSandstone().ID: return 8417;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Top).ID: return 10796;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Bottom).ID: return 10798;\n\t\t\tcase SmoothRedSandstoneSlab::SmoothRedSandstoneSlab(SmoothRedSandstoneSlab::Type::Double).ID: return 10800;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9750;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9752;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9754;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9756;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9758;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9760;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9762;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9764;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9766;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9768;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9770;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9772;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9774;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9776;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9778;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9780;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9782;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9784;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9786;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9788;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9790;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9792;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9794;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9796;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9798;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9800;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9802;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9804;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9806;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9808;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9810;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9812;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9814;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9816;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Top, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9818;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::Straight).ID: return 9820;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerLeft).ID: return 9822;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::InnerRight).ID: return 9824;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterLeft).ID: return 9826;\n\t\t\tcase SmoothRedSandstoneStairs::SmoothRedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothRedSandstoneStairs::Half::Bottom, SmoothRedSandstoneStairs::Shape::OuterRight).ID: return 9828;\n\t\t\tcase SmoothSandstone::SmoothSandstone().ID: return 8415;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Top).ID: return 10826;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Bottom).ID: return 10828;\n\t\t\tcase SmoothSandstoneSlab::SmoothSandstoneSlab(SmoothSandstoneSlab::Type::Double).ID: return 10830;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 10230;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 10232;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 10234;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 10236;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 10238;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 10240;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 10242;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 10244;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 10246;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 10248;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 10250;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 10252;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 10254;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 10256;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 10258;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 10260;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 10262;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 10264;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 10266;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 10268;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 10270;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 10272;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 10274;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 10276;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 10278;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 10280;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 10282;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 10284;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 10286;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XM, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 10288;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::Straight).ID: return 10290;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 10292;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::InnerRight).ID: return 10294;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 10296;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Top, SmoothSandstoneStairs::Shape::OuterRight).ID: return 10298;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::Straight).ID: return 10300;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerLeft).ID: return 10302;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::InnerRight).ID: return 10304;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterLeft).ID: return 10306;\n\t\t\tcase SmoothSandstoneStairs::SmoothSandstoneStairs(eBlockFace::BLOCK_FACE_XP, SmoothSandstoneStairs::Half::Bottom, SmoothSandstoneStairs::Shape::OuterRight).ID: return 10308;\n\t\t\tcase SmoothStone::SmoothStone().ID: return 8414;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Top).ID: return 8343;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Bottom).ID: return 8345;\n\t\t\tcase SmoothStoneSlab::SmoothStoneSlab(SmoothStoneSlab::Type::Double).ID: return 8347;\n\t\t\tcase Snow::Snow(1).ID: return 3921;\n\t\t\tcase Snow::Snow(2).ID: return 3922;\n\t\t\tcase Snow::Snow(3).ID: return 3923;\n\t\t\tcase Snow::Snow(4).ID: return 3924;\n\t\t\tcase Snow::Snow(5).ID: return 3925;\n\t\t\tcase Snow::Snow(6).ID: return 3926;\n\t\t\tcase Snow::Snow(7).ID: return 3927;\n\t\t\tcase Snow::Snow(8).ID: return 3928;\n\t\t\tcase SnowBlock::SnowBlock().ID: return 3930;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_ZM, true, true).ID: return 14923;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_ZM, true, false).ID: return 14925;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_ZM, false, true).ID: return 14927;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_ZM, false, false).ID: return 14929;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_ZP, true, true).ID: return 14931;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_ZP, true, false).ID: return 14933;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_ZP, false, true).ID: return 14935;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_ZP, false, false).ID: return 14937;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_XM, true, true).ID: return 14939;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_XM, true, false).ID: return 14941;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_XM, false, true).ID: return 14943;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_XM, false, false).ID: return 14945;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_XP, true, true).ID: return 14947;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_XP, true, false).ID: return 14949;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_XP, false, true).ID: return 14951;\n\t\t\tcase SoulCampfire::SoulCampfire(eBlockFace::BLOCK_FACE_XP, false, false).ID: return 14953;\n\t\t\tcase SoulFire::SoulFire().ID: return 1952;\n\t\t\tcase SoulLantern::SoulLantern(true).ID: return 14888;\n\t\t\tcase SoulLantern::SoulLantern(false).ID: return 14889;\n\t\t\tcase SoulSand::SoulSand().ID: return 4000;\n\t\t\tcase SoulSoil::SoulSoil().ID: return 4001;\n\t\t\tcase SoulTorch::SoulTorch().ID: return 4008;\n\t\t\tcase SoulWallTorch::SoulWallTorch(eBlockFace::BLOCK_FACE_ZM).ID: return 4009;\n\t\t\tcase SoulWallTorch::SoulWallTorch(eBlockFace::BLOCK_FACE_ZP).ID: return 4010;\n\t\t\tcase SoulWallTorch::SoulWallTorch(eBlockFace::BLOCK_FACE_XM).ID: return 4011;\n\t\t\tcase SoulWallTorch::SoulWallTorch(eBlockFace::BLOCK_FACE_XP).ID: return 4012;\n\t\t\tcase Spawner::Spawner().ID: return 1953;\n\t\t\tcase Sponge::Sponge().ID: return 229;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6370;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6371;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6372;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6373;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 6374;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 6375;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 6376;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 6377;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6378;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6379;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6380;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6381;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 6382;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 6383;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 6384;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 6385;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 6386;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 6387;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 6388;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 6389;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 6390;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 6391;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 6392;\n\t\t\tcase SpruceButton::SpruceButton(SpruceButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 6393;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8738;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8739;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8740;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8741;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8742;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8743;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8744;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8745;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8746;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8747;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8748;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8749;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8750;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8751;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8752;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8753;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8754;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8755;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8756;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8757;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8758;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8759;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8760;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8761;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8762;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8763;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8764;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8765;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8766;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8767;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8768;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8769;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8770;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8771;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8772;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8773;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8774;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8775;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8776;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8777;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8778;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8779;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8780;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8781;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8782;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8783;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8784;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8785;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, true).ID: return 8786;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, true, false).ID: return 8787;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true).ID: return 8788;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false).ID: return 8789;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, true).ID: return 8790;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, true, false).ID: return 8791;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true).ID: return 8792;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false).ID: return 8793;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, true).ID: return 8794;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, true, false).ID: return 8795;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, true).ID: return 8796;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Left, false, false).ID: return 8797;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, true).ID: return 8798;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false).ID: return 8799;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, true).ID: return 8800;\n\t\t\tcase SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false).ID: return 8801;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, true).ID: return 8580;\n\t\t\tcase SpruceFence::SpruceFence(true, true, true, false).ID: return 8581;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, true).ID: return 8584;\n\t\t\tcase SpruceFence::SpruceFence(true, true, false, false).ID: return 8585;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, true).ID: return 8588;\n\t\t\tcase SpruceFence::SpruceFence(true, false, true, false).ID: return 8589;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, true).ID: return 8592;\n\t\t\tcase SpruceFence::SpruceFence(true, false, false, false).ID: return 8593;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, true).ID: return 8596;\n\t\t\tcase SpruceFence::SpruceFence(false, true, true, false).ID: return 8597;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, true).ID: return 8600;\n\t\t\tcase SpruceFence::SpruceFence(false, true, false, false).ID: return 8601;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, true).ID: return 8604;\n\t\t\tcase SpruceFence::SpruceFence(false, false, true, false).ID: return 8605;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, true).ID: return 8608;\n\t\t\tcase SpruceFence::SpruceFence(false, false, false, false).ID: return 8609;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 8418;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 8419;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 8420;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 8421;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 8422;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 8423;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 8424;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 8425;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 8426;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 8427;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 8428;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 8429;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 8430;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 8431;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 8432;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 8433;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 8434;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 8435;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 8436;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 8437;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 8438;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 8439;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 8440;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 8441;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 8442;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 8443;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 8444;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 8445;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 8446;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 8447;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 8448;\n\t\t\tcase SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 8449;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, true).ID: return 159;\n\t\t\tcase SpruceLeaves::SpruceLeaves(1, false).ID: return 160;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, true).ID: return 161;\n\t\t\tcase SpruceLeaves::SpruceLeaves(2, false).ID: return 162;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, true).ID: return 163;\n\t\t\tcase SpruceLeaves::SpruceLeaves(3, false).ID: return 164;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, true).ID: return 165;\n\t\t\tcase SpruceLeaves::SpruceLeaves(4, false).ID: return 166;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, true).ID: return 167;\n\t\t\tcase SpruceLeaves::SpruceLeaves(5, false).ID: return 168;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, true).ID: return 169;\n\t\t\tcase SpruceLeaves::SpruceLeaves(6, false).ID: return 170;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, true).ID: return 171;\n\t\t\tcase SpruceLeaves::SpruceLeaves(7, false).ID: return 172;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::X).ID: return 76;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Y).ID: return 77;\n\t\t\tcase SpruceLog::SpruceLog(SpruceLog::Axis::Z).ID: return 78;\n\t\t\tcase SprucePlanks::SprucePlanks().ID: return 16;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(true).ID: return 3875;\n\t\t\tcase SprucePressurePlate::SprucePressurePlate(false).ID: return 3876;\n\t\t\tcase SpruceSapling::SpruceSapling(0).ID: return 23;\n\t\t\tcase SpruceSapling::SpruceSapling(1).ID: return 24;\n\t\t\tcase SpruceSign::SpruceSign(0).ID: return 3414;\n\t\t\tcase SpruceSign::SpruceSign(1).ID: return 3416;\n\t\t\tcase SpruceSign::SpruceSign(2).ID: return 3418;\n\t\t\tcase SpruceSign::SpruceSign(3).ID: return 3420;\n\t\t\tcase SpruceSign::SpruceSign(4).ID: return 3422;\n\t\t\tcase SpruceSign::SpruceSign(5).ID: return 3424;\n\t\t\tcase SpruceSign::SpruceSign(6).ID: return 3426;\n\t\t\tcase SpruceSign::SpruceSign(7).ID: return 3428;\n\t\t\tcase SpruceSign::SpruceSign(8).ID: return 3430;\n\t\t\tcase SpruceSign::SpruceSign(9).ID: return 3432;\n\t\t\tcase SpruceSign::SpruceSign(10).ID: return 3434;\n\t\t\tcase SpruceSign::SpruceSign(11).ID: return 3436;\n\t\t\tcase SpruceSign::SpruceSign(12).ID: return 3438;\n\t\t\tcase SpruceSign::SpruceSign(13).ID: return 3440;\n\t\t\tcase SpruceSign::SpruceSign(14).ID: return 3442;\n\t\t\tcase SpruceSign::SpruceSign(15).ID: return 3444;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Top).ID: return 8307;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Bottom).ID: return 8309;\n\t\t\tcase SpruceSlab::SpruceSlab(SpruceSlab::Type::Double).ID: return 8311;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5405;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5407;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5409;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5411;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5413;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5415;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5417;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5419;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5421;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5423;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5425;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5427;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5429;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5431;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5433;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5435;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5437;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5439;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5441;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5443;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5445;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5447;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5449;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5451;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5453;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5455;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5457;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5459;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5461;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5463;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight).ID: return 5465;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerLeft).ID: return 5467;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::InnerRight).ID: return 5469;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterLeft).ID: return 5471;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::OuterRight).ID: return 5473;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight).ID: return 5475;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerLeft).ID: return 5477;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::InnerRight).ID: return 5479;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterLeft).ID: return 5481;\n\t\t\tcase SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::OuterRight).ID: return 5483;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, true).ID: return 4176;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, true, false).ID: return 4178;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, true).ID: return 4180;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Top, false, false).ID: return 4182;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4184;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4186;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4188;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4190;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, true).ID: return 4192;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, true, false).ID: return 4194;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, true).ID: return 4196;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Top, false, false).ID: return 4198;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4200;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4202;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4204;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_ZP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4206;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, true).ID: return 4208;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, true, false).ID: return 4210;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, true).ID: return 4212;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Top, false, false).ID: return 4214;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4216;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4218;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4220;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XM, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4222;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, true).ID: return 4224;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, true, false).ID: return 4226;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, true).ID: return 4228;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Top, false, false).ID: return 4230;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, true).ID: return 4232;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, true, false).ID: return 4234;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, true).ID: return 4236;\n\t\t\tcase SpruceTrapdoor::SpruceTrapdoor(eBlockFace::BLOCK_FACE_XP, SpruceTrapdoor::Half::Bottom, false, false).ID: return 4238;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 3744;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 3746;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 3748;\n\t\t\tcase SpruceWallSign::SpruceWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 3750;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::X).ID: return 112;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Y).ID: return 113;\n\t\t\tcase SpruceWood::SpruceWood(SpruceWood::Axis::Z).ID: return 114;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZM).ID: return 1329;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XP).ID: return 1330;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZP).ID: return 1331;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XM).ID: return 1332;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YP).ID: return 1333;\n\t\t\tcase StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YM).ID: return 1334;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZM).ID: return 1335;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XP).ID: return 1336;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZP).ID: return 1337;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XM).ID: return 1338;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YP).ID: return 1339;\n\t\t\tcase StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YM).ID: return 1340;\n\t\t\tcase Stone::Stone().ID: return 1;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Top).ID: return 8379;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Bottom).ID: return 8381;\n\t\t\tcase StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Double).ID: return 8383;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4933;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4935;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4937;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4939;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4941;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4943;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4945;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4947;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4949;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4951;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4953;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4955;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4957;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4959;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4961;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4963;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4965;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4967;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4969;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4971;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4973;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4975;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4977;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4979;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 4981;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 4983;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 4985;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 4987;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 4989;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 4991;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight).ID: return 4993;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerLeft).ID: return 4995;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::InnerRight).ID: return 4997;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterLeft).ID: return 4999;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::OuterRight).ID: return 5001;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight).ID: return 5003;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerLeft).ID: return 5005;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::InnerRight).ID: return 5007;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterLeft).ID: return 5009;\n\t\t\tcase StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::OuterRight).ID: return 5011;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12490;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12491;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12492;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12496;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12497;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12498;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12502;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12503;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12504;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12508;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12509;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12510;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12514;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12515;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12516;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12520;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12521;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12522;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12526;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12527;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12528;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12532;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12533;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12534;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12538;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12539;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12540;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12544;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12545;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12546;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12550;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12551;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12552;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12556;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12557;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12558;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12562;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12563;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12564;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12568;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12569;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12570;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12574;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12575;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12576;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12580;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12581;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12582;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12586;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12587;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12588;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12592;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12593;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::None, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12594;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12598;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12599;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12600;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12604;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12605;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12606;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12610;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12611;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12612;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12616;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12617;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12618;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12622;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12623;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12624;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12628;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12629;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12630;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12634;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12635;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12636;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12640;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12641;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12642;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12646;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12647;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12648;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12652;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12653;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12654;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12658;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12659;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12660;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12664;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12665;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12666;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12670;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12671;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12672;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12676;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12677;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12678;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12682;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12683;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12684;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12688;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12689;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12690;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12694;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12695;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12696;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12700;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12701;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Low, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12702;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12706;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12707;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12708;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12712;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12713;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12714;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12718;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12719;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12720;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12724;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12725;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12726;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12730;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12731;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12732;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12736;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12737;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::None, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12738;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12742;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12743;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12744;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12748;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12749;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12750;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12754;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12755;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12756;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12760;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12761;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12762;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12766;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12767;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12768;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12772;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12773;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Low, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12774;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::None).ID: return 12778;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::Low).ID: return 12779;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::None, true, StoneBrickWall::West::Tall).ID: return 12780;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::None).ID: return 12784;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::Low).ID: return 12785;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::None, false, StoneBrickWall::West::Tall).ID: return 12786;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::None).ID: return 12790;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::Low).ID: return 12791;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, true, StoneBrickWall::West::Tall).ID: return 12792;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::None).ID: return 12796;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::Low).ID: return 12797;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Low, false, StoneBrickWall::West::Tall).ID: return 12798;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::None).ID: return 12802;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Low).ID: return 12803;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, true, StoneBrickWall::West::Tall).ID: return 12804;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::None).ID: return 12808;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Low).ID: return 12809;\n\t\t\tcase StoneBrickWall::StoneBrickWall(StoneBrickWall::East::Tall, StoneBrickWall::North::Tall, StoneBrickWall::South::Tall, false, StoneBrickWall::West::Tall).ID: return 12810;\n\t\t\tcase StoneBricks::StoneBricks().ID: return 4495;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3897;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3898;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3899;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3900;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 3901;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 3902;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 3903;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 3904;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3905;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3906;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3907;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3908;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 3909;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 3910;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 3911;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 3912;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 3913;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 3914;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 3915;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 3916;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 3917;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 3918;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 3919;\n\t\t\tcase StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 3920;\n\t\t\tcase StonePressurePlate::StonePressurePlate(true).ID: return 3807;\n\t\t\tcase StonePressurePlate::StonePressurePlate(false).ID: return 3808;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Top).ID: return 8337;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Bottom).ID: return 8339;\n\t\t\tcase StoneSlab::StoneSlab(StoneSlab::Type::Double).ID: return 8341;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 10150;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 10152;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 10154;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 10156;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 10158;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 10160;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 10162;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 10164;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 10166;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 10168;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 10170;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 10172;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 10174;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 10176;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 10178;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 10180;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 10182;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 10184;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 10186;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_ZP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 10188;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 10190;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 10192;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 10194;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 10196;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 10198;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 10200;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 10202;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 10204;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 10206;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XM, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 10208;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::Straight).ID: return 10210;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::InnerLeft).ID: return 10212;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::InnerRight).ID: return 10214;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::OuterLeft).ID: return 10216;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Top, StoneStairs::Shape::OuterRight).ID: return 10218;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::Straight).ID: return 10220;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerLeft).ID: return 10222;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::InnerRight).ID: return 10224;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterLeft).ID: return 10226;\n\t\t\tcase StoneStairs::StoneStairs(eBlockFace::BLOCK_FACE_XP, StoneStairs::Half::Bottom, StoneStairs::Shape::OuterRight).ID: return 10228;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_ZM).ID: return 14850;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_ZP).ID: return 14851;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_XM).ID: return 14852;\n\t\t\tcase Stonecutter::Stonecutter(eBlockFace::BLOCK_FACE_XP).ID: return 14853;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::X).ID: return 100;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Y).ID: return 101;\n\t\t\tcase StrippedAcaciaLog::StrippedAcaciaLog(StrippedAcaciaLog::Axis::Z).ID: return 102;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::X).ID: return 139;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Y).ID: return 140;\n\t\t\tcase StrippedAcaciaWood::StrippedAcaciaWood(StrippedAcaciaWood::Axis::Z).ID: return 141;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::X).ID: return 94;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Y).ID: return 95;\n\t\t\tcase StrippedBirchLog::StrippedBirchLog(StrippedBirchLog::Axis::Z).ID: return 96;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::X).ID: return 133;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Y).ID: return 134;\n\t\t\tcase StrippedBirchWood::StrippedBirchWood(StrippedBirchWood::Axis::Z).ID: return 135;\n\t\t\tcase StrippedCrimsonHyphae::StrippedCrimsonHyphae(StrippedCrimsonHyphae::Axis::X).ID: return 14984;\n\t\t\tcase StrippedCrimsonHyphae::StrippedCrimsonHyphae(StrippedCrimsonHyphae::Axis::Y).ID: return 14985;\n\t\t\tcase StrippedCrimsonHyphae::StrippedCrimsonHyphae(StrippedCrimsonHyphae::Axis::Z).ID: return 14986;\n\t\t\tcase StrippedCrimsonStem::StrippedCrimsonStem(StrippedCrimsonStem::Axis::X).ID: return 14978;\n\t\t\tcase StrippedCrimsonStem::StrippedCrimsonStem(StrippedCrimsonStem::Axis::Y).ID: return 14979;\n\t\t\tcase StrippedCrimsonStem::StrippedCrimsonStem(StrippedCrimsonStem::Axis::Z).ID: return 14980;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::X).ID: return 103;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Y).ID: return 104;\n\t\t\tcase StrippedDarkOakLog::StrippedDarkOakLog(StrippedDarkOakLog::Axis::Z).ID: return 105;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::X).ID: return 142;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Y).ID: return 143;\n\t\t\tcase StrippedDarkOakWood::StrippedDarkOakWood(StrippedDarkOakWood::Axis::Z).ID: return 144;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::X).ID: return 97;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Y).ID: return 98;\n\t\t\tcase StrippedJungleLog::StrippedJungleLog(StrippedJungleLog::Axis::Z).ID: return 99;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::X).ID: return 136;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Y).ID: return 137;\n\t\t\tcase StrippedJungleWood::StrippedJungleWood(StrippedJungleWood::Axis::Z).ID: return 138;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::X).ID: return 106;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Y).ID: return 107;\n\t\t\tcase StrippedOakLog::StrippedOakLog(StrippedOakLog::Axis::Z).ID: return 108;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::X).ID: return 127;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Y).ID: return 128;\n\t\t\tcase StrippedOakWood::StrippedOakWood(StrippedOakWood::Axis::Z).ID: return 129;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::X).ID: return 91;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Y).ID: return 92;\n\t\t\tcase StrippedSpruceLog::StrippedSpruceLog(StrippedSpruceLog::Axis::Z).ID: return 93;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::X).ID: return 130;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Y).ID: return 131;\n\t\t\tcase StrippedSpruceWood::StrippedSpruceWood(StrippedSpruceWood::Axis::Z).ID: return 132;\n\t\t\tcase StrippedWarpedHyphae::StrippedWarpedHyphae(StrippedWarpedHyphae::Axis::X).ID: return 14967;\n\t\t\tcase StrippedWarpedHyphae::StrippedWarpedHyphae(StrippedWarpedHyphae::Axis::Y).ID: return 14968;\n\t\t\tcase StrippedWarpedHyphae::StrippedWarpedHyphae(StrippedWarpedHyphae::Axis::Z).ID: return 14969;\n\t\t\tcase StrippedWarpedStem::StrippedWarpedStem(StrippedWarpedStem::Axis::X).ID: return 14961;\n\t\t\tcase StrippedWarpedStem::StrippedWarpedStem(StrippedWarpedStem::Axis::Y).ID: return 14962;\n\t\t\tcase StrippedWarpedStem::StrippedWarpedStem(StrippedWarpedStem::Axis::Z).ID: return 14963;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Save).ID: return 15735;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Load).ID: return 15736;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Corner).ID: return 15737;\n\t\t\tcase StructureBlock::StructureBlock(StructureBlock::Mode::Data).ID: return 15738;\n\t\t\tcase StructureVoid::StructureVoid().ID: return 9259;\n\t\t\tcase SugarCane::SugarCane(0).ID: return 3948;\n\t\t\tcase SugarCane::SugarCane(1).ID: return 3949;\n\t\t\tcase SugarCane::SugarCane(2).ID: return 3950;\n\t\t\tcase SugarCane::SugarCane(3).ID: return 3951;\n\t\t\tcase SugarCane::SugarCane(4).ID: return 3952;\n\t\t\tcase SugarCane::SugarCane(5).ID: return 3953;\n\t\t\tcase SugarCane::SugarCane(6).ID: return 3954;\n\t\t\tcase SugarCane::SugarCane(7).ID: return 3955;\n\t\t\tcase SugarCane::SugarCane(8).ID: return 3956;\n\t\t\tcase SugarCane::SugarCane(9).ID: return 3957;\n\t\t\tcase SugarCane::SugarCane(10).ID: return 3958;\n\t\t\tcase SugarCane::SugarCane(11).ID: return 3959;\n\t\t\tcase SugarCane::SugarCane(12).ID: return 3960;\n\t\t\tcase SugarCane::SugarCane(13).ID: return 3961;\n\t\t\tcase SugarCane::SugarCane(14).ID: return 3962;\n\t\t\tcase SugarCane::SugarCane(15).ID: return 3963;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Upper).ID: return 7885;\n\t\t\tcase Sunflower::Sunflower(Sunflower::Half::Lower).ID: return 7886;\n\t\t\tcase SweetBerryBush::SweetBerryBush(0).ID: return 14954;\n\t\t\tcase SweetBerryBush::SweetBerryBush(1).ID: return 14955;\n\t\t\tcase SweetBerryBush::SweetBerryBush(2).ID: return 14956;\n\t\t\tcase SweetBerryBush::SweetBerryBush(3).ID: return 14957;\n\t\t\tcase TNT::TNT(true).ID: return 1430;\n\t\t\tcase TNT::TNT(false).ID: return 1431;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Upper).ID: return 7893;\n\t\t\tcase TallGrass::TallGrass(TallGrass::Half::Lower).ID: return 7894;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Upper).ID: return 1346;\n\t\t\tcase TallSeagrass::TallSeagrass(TallSeagrass::Half::Lower).ID: return 1347;\n\t\t\tcase Target::Target(0).ID: return 15760;\n\t\t\tcase Target::Target(1).ID: return 15761;\n\t\t\tcase Target::Target(2).ID: return 15762;\n\t\t\tcase Target::Target(3).ID: return 15763;\n\t\t\tcase Target::Target(4).ID: return 15764;\n\t\t\tcase Target::Target(5).ID: return 15765;\n\t\t\tcase Target::Target(6).ID: return 15766;\n\t\t\tcase Target::Target(7).ID: return 15767;\n\t\t\tcase Target::Target(8).ID: return 15768;\n\t\t\tcase Target::Target(9).ID: return 15769;\n\t\t\tcase Target::Target(10).ID: return 15770;\n\t\t\tcase Target::Target(11).ID: return 15771;\n\t\t\tcase Target::Target(12).ID: return 15772;\n\t\t\tcase Target::Target(13).ID: return 15773;\n\t\t\tcase Target::Target(14).ID: return 15774;\n\t\t\tcase Target::Target(15).ID: return 15775;\n\t\t\tcase Terracotta::Terracotta().ID: return 7882;\n\t\t\tcase Torch::Torch().ID: return 1435;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Single).ID: return 6623;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Left).ID: return 6625;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Right).ID: return 6627;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Single).ID: return 6629;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Left).ID: return 6631;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Right).ID: return 6633;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Single).ID: return 6635;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Left).ID: return 6637;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Right).ID: return 6639;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Single).ID: return 6641;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Left).ID: return 6643;\n\t\t\tcase TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Right).ID: return 6645;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, true).ID: return 5275;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, true, false).ID: return 5276;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, true).ID: return 5277;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, true, false, false).ID: return 5278;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, true).ID: return 5279;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, true, false).ID: return 5280;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, true).ID: return 5281;\n\t\t\tcase Tripwire::Tripwire(true, true, true, true, false, false, false).ID: return 5282;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, true).ID: return 5283;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, true, false).ID: return 5284;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, true).ID: return 5285;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, true, false, false).ID: return 5286;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, true).ID: return 5287;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, true, false).ID: return 5288;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, true).ID: return 5289;\n\t\t\tcase Tripwire::Tripwire(true, true, true, false, false, false, false).ID: return 5290;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, true).ID: return 5291;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, true, false).ID: return 5292;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, true).ID: return 5293;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, true, false, false).ID: return 5294;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, true).ID: return 5295;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, true, false).ID: return 5296;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, true).ID: return 5297;\n\t\t\tcase Tripwire::Tripwire(true, true, false, true, false, false, false).ID: return 5298;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, true).ID: return 5299;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, true, false).ID: return 5300;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, true).ID: return 5301;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, true, false, false).ID: return 5302;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, true).ID: return 5303;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, true, false).ID: return 5304;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, true).ID: return 5305;\n\t\t\tcase Tripwire::Tripwire(true, true, false, false, false, false, false).ID: return 5306;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, true).ID: return 5307;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, true, false).ID: return 5308;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, true).ID: return 5309;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, true, false, false).ID: return 5310;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, true).ID: return 5311;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, true, false).ID: return 5312;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, true).ID: return 5313;\n\t\t\tcase Tripwire::Tripwire(true, false, true, true, false, false, false).ID: return 5314;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, true).ID: return 5315;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, true, false).ID: return 5316;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, true).ID: return 5317;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, true, false, false).ID: return 5318;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, true).ID: return 5319;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, true, false).ID: return 5320;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, true).ID: return 5321;\n\t\t\tcase Tripwire::Tripwire(true, false, true, false, false, false, false).ID: return 5322;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, true).ID: return 5323;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, true, false).ID: return 5324;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, true).ID: return 5325;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, true, false, false).ID: return 5326;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, true).ID: return 5327;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, true, false).ID: return 5328;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, true).ID: return 5329;\n\t\t\tcase Tripwire::Tripwire(true, false, false, true, false, false, false).ID: return 5330;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, true).ID: return 5331;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, true, false).ID: return 5332;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, true).ID: return 5333;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, true, false, false).ID: return 5334;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, true).ID: return 5335;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, true, false).ID: return 5336;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, true).ID: return 5337;\n\t\t\tcase Tripwire::Tripwire(true, false, false, false, false, false, false).ID: return 5338;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, true).ID: return 5339;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, true, false).ID: return 5340;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, true).ID: return 5341;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, true, false, false).ID: return 5342;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, true).ID: return 5343;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, true, false).ID: return 5344;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, true).ID: return 5345;\n\t\t\tcase Tripwire::Tripwire(false, true, true, true, false, false, false).ID: return 5346;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, true).ID: return 5347;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, true, false).ID: return 5348;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, true).ID: return 5349;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, true, false, false).ID: return 5350;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, true).ID: return 5351;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, true, false).ID: return 5352;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, true).ID: return 5353;\n\t\t\tcase Tripwire::Tripwire(false, true, true, false, false, false, false).ID: return 5354;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, true).ID: return 5355;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, true, false).ID: return 5356;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, true).ID: return 5357;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, true, false, false).ID: return 5358;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, true).ID: return 5359;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, true, false).ID: return 5360;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, true).ID: return 5361;\n\t\t\tcase Tripwire::Tripwire(false, true, false, true, false, false, false).ID: return 5362;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, true).ID: return 5363;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, true, false).ID: return 5364;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, true).ID: return 5365;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, true, false, false).ID: return 5366;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, true).ID: return 5367;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, true, false).ID: return 5368;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, true).ID: return 5369;\n\t\t\tcase Tripwire::Tripwire(false, true, false, false, false, false, false).ID: return 5370;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, true).ID: return 5371;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, true, false).ID: return 5372;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, true).ID: return 5373;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, true, false, false).ID: return 5374;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, true).ID: return 5375;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, true, false).ID: return 5376;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, true).ID: return 5377;\n\t\t\tcase Tripwire::Tripwire(false, false, true, true, false, false, false).ID: return 5378;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, true).ID: return 5379;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, true, false).ID: return 5380;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, true).ID: return 5381;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, true, false, false).ID: return 5382;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, true).ID: return 5383;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, true, false).ID: return 5384;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, true).ID: return 5385;\n\t\t\tcase Tripwire::Tripwire(false, false, true, false, false, false, false).ID: return 5386;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, true).ID: return 5387;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, true, false).ID: return 5388;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, true).ID: return 5389;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, true, false, false).ID: return 5390;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, true).ID: return 5391;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, true, false).ID: return 5392;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, true).ID: return 5393;\n\t\t\tcase Tripwire::Tripwire(false, false, false, true, false, false, false).ID: return 5394;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, true).ID: return 5395;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, true, false).ID: return 5396;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, true).ID: return 5397;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, true, false, false).ID: return 5398;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, true).ID: return 5399;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, true, false).ID: return 5400;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, true).ID: return 5401;\n\t\t\tcase Tripwire::Tripwire(false, false, false, false, false, false, false).ID: return 5402;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5259;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5260;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5261;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5262;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, true).ID: return 5263;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, false).ID: return 5264;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, true).ID: return 5265;\n\t\t\tcase TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, false).ID: return 5266;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, true).ID: return 5267;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, false).ID: return 5268;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, true).ID: return 5269;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, false).ID: return 5270;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, true).ID: return 5271;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, false).ID: return 5272;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, true).ID: return 5273;\n\t\t\tcase TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, false).ID: return 5274;\n\t\t\tcase TubeCoral::TubeCoral().ID: return 9531;\n\t\t\tcase TubeCoralBlock::TubeCoralBlock().ID: return 9515;\n\t\t\tcase TubeCoralFan::TubeCoralFan().ID: return 9551;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZM).ID: return 9601;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_ZP).ID: return 9603;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XM).ID: return 9605;\n\t\t\tcase TubeCoralWallFan::TubeCoralWallFan(eBlockFace::BLOCK_FACE_XP).ID: return 9607;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 0).ID: return 9498;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 1).ID: return 9499;\n\t\t\tcase TurtleEgg::TurtleEgg(1, 2).ID: return 9500;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 0).ID: return 9501;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 1).ID: return 9502;\n\t\t\tcase TurtleEgg::TurtleEgg(2, 2).ID: return 9503;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 0).ID: return 9504;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 1).ID: return 9505;\n\t\t\tcase TurtleEgg::TurtleEgg(3, 2).ID: return 9506;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 0).ID: return 9507;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 1).ID: return 9508;\n\t\t\tcase TurtleEgg::TurtleEgg(4, 2).ID: return 9509;\n\t\t\tcase TwistingVines::TwistingVines(0).ID: return 15017;\n\t\t\tcase TwistingVines::TwistingVines(1).ID: return 15018;\n\t\t\tcase TwistingVines::TwistingVines(2).ID: return 15019;\n\t\t\tcase TwistingVines::TwistingVines(3).ID: return 15020;\n\t\t\tcase TwistingVines::TwistingVines(4).ID: return 15021;\n\t\t\tcase TwistingVines::TwistingVines(5).ID: return 15022;\n\t\t\tcase TwistingVines::TwistingVines(6).ID: return 15023;\n\t\t\tcase TwistingVines::TwistingVines(7).ID: return 15024;\n\t\t\tcase TwistingVines::TwistingVines(8).ID: return 15025;\n\t\t\tcase TwistingVines::TwistingVines(9).ID: return 15026;\n\t\t\tcase TwistingVines::TwistingVines(10).ID: return 15027;\n\t\t\tcase TwistingVines::TwistingVines(11).ID: return 15028;\n\t\t\tcase TwistingVines::TwistingVines(12).ID: return 15029;\n\t\t\tcase TwistingVines::TwistingVines(13).ID: return 15030;\n\t\t\tcase TwistingVines::TwistingVines(14).ID: return 15031;\n\t\t\tcase TwistingVines::TwistingVines(15).ID: return 15032;\n\t\t\tcase TwistingVines::TwistingVines(16).ID: return 15033;\n\t\t\tcase TwistingVines::TwistingVines(17).ID: return 15034;\n\t\t\tcase TwistingVines::TwistingVines(18).ID: return 15035;\n\t\t\tcase TwistingVines::TwistingVines(19).ID: return 15036;\n\t\t\tcase TwistingVines::TwistingVines(20).ID: return 15037;\n\t\t\tcase TwistingVines::TwistingVines(21).ID: return 15038;\n\t\t\tcase TwistingVines::TwistingVines(22).ID: return 15039;\n\t\t\tcase TwistingVines::TwistingVines(23).ID: return 15040;\n\t\t\tcase TwistingVines::TwistingVines(24).ID: return 15041;\n\t\t\tcase TwistingVines::TwistingVines(25).ID: return 15042;\n\t\t\tcase TwistingVinesPlant::TwistingVinesPlant().ID: return 15043;\n\t\t\tcase Vine::Vine(true, true, true, true, true).ID: return 4788;\n\t\t\tcase Vine::Vine(true, true, true, true, false).ID: return 4789;\n\t\t\tcase Vine::Vine(true, true, true, false, true).ID: return 4790;\n\t\t\tcase Vine::Vine(true, true, true, false, false).ID: return 4791;\n\t\t\tcase Vine::Vine(true, true, false, true, true).ID: return 4792;\n\t\t\tcase Vine::Vine(true, true, false, true, false).ID: return 4793;\n\t\t\tcase Vine::Vine(true, true, false, false, true).ID: return 4794;\n\t\t\tcase Vine::Vine(true, true, false, false, false).ID: return 4795;\n\t\t\tcase Vine::Vine(true, false, true, true, true).ID: return 4796;\n\t\t\tcase Vine::Vine(true, false, true, true, false).ID: return 4797;\n\t\t\tcase Vine::Vine(true, false, true, false, true).ID: return 4798;\n\t\t\tcase Vine::Vine(true, false, true, false, false).ID: return 4799;\n\t\t\tcase Vine::Vine(true, false, false, true, true).ID: return 4800;\n\t\t\tcase Vine::Vine(true, false, false, true, false).ID: return 4801;\n\t\t\tcase Vine::Vine(true, false, false, false, true).ID: return 4802;\n\t\t\tcase Vine::Vine(true, false, false, false, false).ID: return 4803;\n\t\t\tcase Vine::Vine(false, true, true, true, true).ID: return 4804;\n\t\t\tcase Vine::Vine(false, true, true, true, false).ID: return 4805;\n\t\t\tcase Vine::Vine(false, true, true, false, true).ID: return 4806;\n\t\t\tcase Vine::Vine(false, true, true, false, false).ID: return 4807;\n\t\t\tcase Vine::Vine(false, true, false, true, true).ID: return 4808;\n\t\t\tcase Vine::Vine(false, true, false, true, false).ID: return 4809;\n\t\t\tcase Vine::Vine(false, true, false, false, true).ID: return 4810;\n\t\t\tcase Vine::Vine(false, true, false, false, false).ID: return 4811;\n\t\t\tcase Vine::Vine(false, false, true, true, true).ID: return 4812;\n\t\t\tcase Vine::Vine(false, false, true, true, false).ID: return 4813;\n\t\t\tcase Vine::Vine(false, false, true, false, true).ID: return 4814;\n\t\t\tcase Vine::Vine(false, false, true, false, false).ID: return 4815;\n\t\t\tcase Vine::Vine(false, false, false, true, true).ID: return 4816;\n\t\t\tcase Vine::Vine(false, false, false, true, false).ID: return 4817;\n\t\t\tcase Vine::Vine(false, false, false, false, true).ID: return 4818;\n\t\t\tcase Vine::Vine(false, false, false, false, false).ID: return 4819;\n\t\t\tcase VoidAir::VoidAir().ID: return 9665;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZM).ID: return 1436;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZP).ID: return 1437;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XM).ID: return 1438;\n\t\t\tcase WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XP).ID: return 1439;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true).ID: return 15503;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false).ID: return 15504;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, true).ID: return 15505;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Floor, eBlockFace::BLOCK_FACE_ZP, false).ID: return 15506;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, true).ID: return 15507;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Floor, eBlockFace::BLOCK_FACE_XM, false).ID: return 15508;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, true).ID: return 15509;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Floor, eBlockFace::BLOCK_FACE_XP, false).ID: return 15510;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true).ID: return 15511;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false).ID: return 15512;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true).ID: return 15513;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false).ID: return 15514;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true).ID: return 15515;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false).ID: return 15516;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true).ID: return 15517;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false).ID: return 15518;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true).ID: return 15519;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false).ID: return 15520;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, true).ID: return 15521;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZP, false).ID: return 15522;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true).ID: return 15523;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false).ID: return 15524;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, true).ID: return 15525;\n\t\t\tcase WarpedButton::WarpedButton(WarpedButton::Face::Ceiling, eBlockFace::BLOCK_FACE_XP, false).ID: return 15526;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, true, true).ID: return 15591;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, true, false).ID: return 15592;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, false, true).ID: return 15593;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, false, false).ID: return 15594;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, true, true).ID: return 15595;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, true, false).ID: return 15596;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, false, true).ID: return 15597;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, false, false).ID: return 15598;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, true, true).ID: return 15599;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, true, false).ID: return 15600;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, false, true).ID: return 15601;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, false, false).ID: return 15602;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, true, true).ID: return 15603;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, true, false).ID: return 15604;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, false, true).ID: return 15605;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, false, false).ID: return 15606;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, true, true).ID: return 15607;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, true, false).ID: return 15608;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, false, true).ID: return 15609;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, false, false).ID: return 15610;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, true, true).ID: return 15611;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, true, false).ID: return 15612;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, false, true).ID: return 15613;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, false, false).ID: return 15614;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, true, true).ID: return 15615;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, true, false).ID: return 15616;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, false, true).ID: return 15617;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, false, false).ID: return 15618;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, true, true).ID: return 15619;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, true, false).ID: return 15620;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, false, true).ID: return 15621;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_ZP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, false, false).ID: return 15622;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, true, true).ID: return 15623;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, true, false).ID: return 15624;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, false, true).ID: return 15625;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, false, false).ID: return 15626;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, true, true).ID: return 15627;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, true, false).ID: return 15628;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, false, true).ID: return 15629;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, false, false).ID: return 15630;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, true, true).ID: return 15631;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, true, false).ID: return 15632;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, false, true).ID: return 15633;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, false, false).ID: return 15634;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, true, true).ID: return 15635;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, true, false).ID: return 15636;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, false, true).ID: return 15637;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XM, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, false, false).ID: return 15638;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, true, true).ID: return 15639;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, true, false).ID: return 15640;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, false, true).ID: return 15641;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Left, false, false).ID: return 15642;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, true, true).ID: return 15643;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, true, false).ID: return 15644;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, false, true).ID: return 15645;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Upper, WarpedDoor::Hinge::Right, false, false).ID: return 15646;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, true, true).ID: return 15647;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, true, false).ID: return 15648;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, false, true).ID: return 15649;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Left, false, false).ID: return 15650;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, true, true).ID: return 15651;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, true, false).ID: return 15652;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, false, true).ID: return 15653;\n\t\t\tcase WarpedDoor::WarpedDoor(eBlockFace::BLOCK_FACE_XP, WarpedDoor::Half::Lower, WarpedDoor::Hinge::Right, false, false).ID: return 15654;\n\t\t\tcase WarpedFence::WarpedFence(true, true, true, true).ID: return 15097;\n\t\t\tcase WarpedFence::WarpedFence(true, true, true, false).ID: return 15098;\n\t\t\tcase WarpedFence::WarpedFence(true, true, false, true).ID: return 15101;\n\t\t\tcase WarpedFence::WarpedFence(true, true, false, false).ID: return 15102;\n\t\t\tcase WarpedFence::WarpedFence(true, false, true, true).ID: return 15105;\n\t\t\tcase WarpedFence::WarpedFence(true, false, true, false).ID: return 15106;\n\t\t\tcase WarpedFence::WarpedFence(true, false, false, true).ID: return 15109;\n\t\t\tcase WarpedFence::WarpedFence(true, false, false, false).ID: return 15110;\n\t\t\tcase WarpedFence::WarpedFence(false, true, true, true).ID: return 15113;\n\t\t\tcase WarpedFence::WarpedFence(false, true, true, false).ID: return 15114;\n\t\t\tcase WarpedFence::WarpedFence(false, true, false, true).ID: return 15117;\n\t\t\tcase WarpedFence::WarpedFence(false, true, false, false).ID: return 15118;\n\t\t\tcase WarpedFence::WarpedFence(false, false, true, true).ID: return 15121;\n\t\t\tcase WarpedFence::WarpedFence(false, false, true, false).ID: return 15122;\n\t\t\tcase WarpedFence::WarpedFence(false, false, false, true).ID: return 15125;\n\t\t\tcase WarpedFence::WarpedFence(false, false, false, false).ID: return 15126;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, true).ID: return 15287;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZM, true, true, false).ID: return 15288;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, true).ID: return 15289;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZM, true, false, false).ID: return 15290;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true).ID: return 15291;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false).ID: return 15292;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true).ID: return 15293;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false).ID: return 15294;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, true).ID: return 15295;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZP, true, true, false).ID: return 15296;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, true).ID: return 15297;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZP, true, false, false).ID: return 15298;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true).ID: return 15299;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false).ID: return 15300;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true).ID: return 15301;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false).ID: return 15302;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, true).ID: return 15303;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XM, true, true, false).ID: return 15304;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, true).ID: return 15305;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XM, true, false, false).ID: return 15306;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true).ID: return 15307;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false).ID: return 15308;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true).ID: return 15309;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false).ID: return 15310;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, true).ID: return 15311;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XP, true, true, false).ID: return 15312;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, true).ID: return 15313;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XP, true, false, false).ID: return 15314;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true).ID: return 15315;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false).ID: return 15316;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true).ID: return 15317;\n\t\t\tcase WarpedFenceGate::WarpedFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false).ID: return 15318;\n\t\t\tcase WarpedFungus::WarpedFungus().ID: return 14971;\n\t\t\tcase WarpedHyphae::WarpedHyphae(WarpedHyphae::Axis::X).ID: return 14964;\n\t\t\tcase WarpedHyphae::WarpedHyphae(WarpedHyphae::Axis::Y).ID: return 14965;\n\t\t\tcase WarpedHyphae::WarpedHyphae(WarpedHyphae::Axis::Z).ID: return 14966;\n\t\t\tcase WarpedNylium::WarpedNylium().ID: return 14970;\n\t\t\tcase WarpedPlanks::WarpedPlanks().ID: return 15046;\n\t\t\tcase WarpedPressurePlate::WarpedPressurePlate(true).ID: return 15061;\n\t\t\tcase WarpedPressurePlate::WarpedPressurePlate(false).ID: return 15062;\n\t\t\tcase WarpedRoots::WarpedRoots().ID: return 14973;\n\t\t\tcase WarpedSign::WarpedSign(0).ID: return 15688;\n\t\t\tcase WarpedSign::WarpedSign(1).ID: return 15690;\n\t\t\tcase WarpedSign::WarpedSign(2).ID: return 15692;\n\t\t\tcase WarpedSign::WarpedSign(3).ID: return 15694;\n\t\t\tcase WarpedSign::WarpedSign(4).ID: return 15696;\n\t\t\tcase WarpedSign::WarpedSign(5).ID: return 15698;\n\t\t\tcase WarpedSign::WarpedSign(6).ID: return 15700;\n\t\t\tcase WarpedSign::WarpedSign(7).ID: return 15702;\n\t\t\tcase WarpedSign::WarpedSign(8).ID: return 15704;\n\t\t\tcase WarpedSign::WarpedSign(9).ID: return 15706;\n\t\t\tcase WarpedSign::WarpedSign(10).ID: return 15708;\n\t\t\tcase WarpedSign::WarpedSign(11).ID: return 15710;\n\t\t\tcase WarpedSign::WarpedSign(12).ID: return 15712;\n\t\t\tcase WarpedSign::WarpedSign(13).ID: return 15714;\n\t\t\tcase WarpedSign::WarpedSign(14).ID: return 15716;\n\t\t\tcase WarpedSign::WarpedSign(15).ID: return 15718;\n\t\t\tcase WarpedSlab::WarpedSlab(WarpedSlab::Type::Top).ID: return 15054;\n\t\t\tcase WarpedSlab::WarpedSlab(WarpedSlab::Type::Bottom).ID: return 15056;\n\t\t\tcase WarpedSlab::WarpedSlab(WarpedSlab::Type::Double).ID: return 15058;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Top, WarpedStairs::Shape::Straight).ID: return 15400;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Top, WarpedStairs::Shape::InnerLeft).ID: return 15402;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Top, WarpedStairs::Shape::InnerRight).ID: return 15404;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Top, WarpedStairs::Shape::OuterLeft).ID: return 15406;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Top, WarpedStairs::Shape::OuterRight).ID: return 15408;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::Straight).ID: return 15410;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::InnerLeft).ID: return 15412;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::InnerRight).ID: return 15414;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::OuterLeft).ID: return 15416;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::OuterRight).ID: return 15418;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Top, WarpedStairs::Shape::Straight).ID: return 15420;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Top, WarpedStairs::Shape::InnerLeft).ID: return 15422;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Top, WarpedStairs::Shape::InnerRight).ID: return 15424;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Top, WarpedStairs::Shape::OuterLeft).ID: return 15426;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Top, WarpedStairs::Shape::OuterRight).ID: return 15428;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::Straight).ID: return 15430;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::InnerLeft).ID: return 15432;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::InnerRight).ID: return 15434;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::OuterLeft).ID: return 15436;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_ZP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::OuterRight).ID: return 15438;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Top, WarpedStairs::Shape::Straight).ID: return 15440;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Top, WarpedStairs::Shape::InnerLeft).ID: return 15442;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Top, WarpedStairs::Shape::InnerRight).ID: return 15444;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Top, WarpedStairs::Shape::OuterLeft).ID: return 15446;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Top, WarpedStairs::Shape::OuterRight).ID: return 15448;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::Straight).ID: return 15450;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::InnerLeft).ID: return 15452;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::InnerRight).ID: return 15454;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::OuterLeft).ID: return 15456;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XM, WarpedStairs::Half::Bottom, WarpedStairs::Shape::OuterRight).ID: return 15458;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Top, WarpedStairs::Shape::Straight).ID: return 15460;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Top, WarpedStairs::Shape::InnerLeft).ID: return 15462;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Top, WarpedStairs::Shape::InnerRight).ID: return 15464;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Top, WarpedStairs::Shape::OuterLeft).ID: return 15466;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Top, WarpedStairs::Shape::OuterRight).ID: return 15468;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::Straight).ID: return 15470;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::InnerLeft).ID: return 15472;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::InnerRight).ID: return 15474;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::OuterLeft).ID: return 15476;\n\t\t\tcase WarpedStairs::WarpedStairs(eBlockFace::BLOCK_FACE_XP, WarpedStairs::Half::Bottom, WarpedStairs::Shape::OuterRight).ID: return 15478;\n\t\t\tcase WarpedStem::WarpedStem(WarpedStem::Axis::X).ID: return 14958;\n\t\t\tcase WarpedStem::WarpedStem(WarpedStem::Axis::Y).ID: return 14959;\n\t\t\tcase WarpedStem::WarpedStem(WarpedStem::Axis::Z).ID: return 14960;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZM, WarpedTrapdoor::Half::Top, true, true).ID: return 15192;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZM, WarpedTrapdoor::Half::Top, true, false).ID: return 15194;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZM, WarpedTrapdoor::Half::Top, false, true).ID: return 15196;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZM, WarpedTrapdoor::Half::Top, false, false).ID: return 15198;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZM, WarpedTrapdoor::Half::Bottom, true, true).ID: return 15200;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZM, WarpedTrapdoor::Half::Bottom, true, false).ID: return 15202;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZM, WarpedTrapdoor::Half::Bottom, false, true).ID: return 15204;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZM, WarpedTrapdoor::Half::Bottom, false, false).ID: return 15206;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZP, WarpedTrapdoor::Half::Top, true, true).ID: return 15208;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZP, WarpedTrapdoor::Half::Top, true, false).ID: return 15210;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZP, WarpedTrapdoor::Half::Top, false, true).ID: return 15212;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZP, WarpedTrapdoor::Half::Top, false, false).ID: return 15214;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZP, WarpedTrapdoor::Half::Bottom, true, true).ID: return 15216;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZP, WarpedTrapdoor::Half::Bottom, true, false).ID: return 15218;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZP, WarpedTrapdoor::Half::Bottom, false, true).ID: return 15220;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_ZP, WarpedTrapdoor::Half::Bottom, false, false).ID: return 15222;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XM, WarpedTrapdoor::Half::Top, true, true).ID: return 15224;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XM, WarpedTrapdoor::Half::Top, true, false).ID: return 15226;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XM, WarpedTrapdoor::Half::Top, false, true).ID: return 15228;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XM, WarpedTrapdoor::Half::Top, false, false).ID: return 15230;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XM, WarpedTrapdoor::Half::Bottom, true, true).ID: return 15232;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XM, WarpedTrapdoor::Half::Bottom, true, false).ID: return 15234;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XM, WarpedTrapdoor::Half::Bottom, false, true).ID: return 15236;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XM, WarpedTrapdoor::Half::Bottom, false, false).ID: return 15238;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XP, WarpedTrapdoor::Half::Top, true, true).ID: return 15240;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XP, WarpedTrapdoor::Half::Top, true, false).ID: return 15242;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XP, WarpedTrapdoor::Half::Top, false, true).ID: return 15244;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XP, WarpedTrapdoor::Half::Top, false, false).ID: return 15246;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XP, WarpedTrapdoor::Half::Bottom, true, true).ID: return 15248;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XP, WarpedTrapdoor::Half::Bottom, true, false).ID: return 15250;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XP, WarpedTrapdoor::Half::Bottom, false, true).ID: return 15252;\n\t\t\tcase WarpedTrapdoor::WarpedTrapdoor(eBlockFace::BLOCK_FACE_XP, WarpedTrapdoor::Half::Bottom, false, false).ID: return 15254;\n\t\t\tcase WarpedWallSign::WarpedWallSign(eBlockFace::BLOCK_FACE_ZM).ID: return 15728;\n\t\t\tcase WarpedWallSign::WarpedWallSign(eBlockFace::BLOCK_FACE_ZP).ID: return 15730;\n\t\t\tcase WarpedWallSign::WarpedWallSign(eBlockFace::BLOCK_FACE_XM).ID: return 15732;\n\t\t\tcase WarpedWallSign::WarpedWallSign(eBlockFace::BLOCK_FACE_XP).ID: return 15734;\n\t\t\tcase WarpedWartBlock::WarpedWartBlock().ID: return 14972;\n\t\t\tcase Water::Water(0).ID: return 34;\n\t\t\tcase Water::Water(1).ID: return 35;\n\t\t\tcase Water::Water(2).ID: return 36;\n\t\t\tcase Water::Water(3).ID: return 37;\n\t\t\tcase Water::Water(4).ID: return 38;\n\t\t\tcase Water::Water(5).ID: return 39;\n\t\t\tcase Water::Water(6).ID: return 40;\n\t\t\tcase Water::Water(7).ID: return 41;\n\t\t\tcase Water::Water(8).ID: return 42;\n\t\t\tcase Water::Water(9).ID: return 43;\n\t\t\tcase Water::Water(10).ID: return 44;\n\t\t\tcase Water::Water(11).ID: return 45;\n\t\t\tcase Water::Water(12).ID: return 46;\n\t\t\tcase Water::Water(13).ID: return 47;\n\t\t\tcase Water::Water(14).ID: return 48;\n\t\t\tcase Water::Water(15).ID: return 49;\n\t\t\tcase WeepingVines::WeepingVines(0).ID: return 14990;\n\t\t\tcase WeepingVines::WeepingVines(1).ID: return 14991;\n\t\t\tcase WeepingVines::WeepingVines(2).ID: return 14992;\n\t\t\tcase WeepingVines::WeepingVines(3).ID: return 14993;\n\t\t\tcase WeepingVines::WeepingVines(4).ID: return 14994;\n\t\t\tcase WeepingVines::WeepingVines(5).ID: return 14995;\n\t\t\tcase WeepingVines::WeepingVines(6).ID: return 14996;\n\t\t\tcase WeepingVines::WeepingVines(7).ID: return 14997;\n\t\t\tcase WeepingVines::WeepingVines(8).ID: return 14998;\n\t\t\tcase WeepingVines::WeepingVines(9).ID: return 14999;\n\t\t\tcase WeepingVines::WeepingVines(10).ID: return 15000;\n\t\t\tcase WeepingVines::WeepingVines(11).ID: return 15001;\n\t\t\tcase WeepingVines::WeepingVines(12).ID: return 15002;\n\t\t\tcase WeepingVines::WeepingVines(13).ID: return 15003;\n\t\t\tcase WeepingVines::WeepingVines(14).ID: return 15004;\n\t\t\tcase WeepingVines::WeepingVines(15).ID: return 15005;\n\t\t\tcase WeepingVines::WeepingVines(16).ID: return 15006;\n\t\t\tcase WeepingVines::WeepingVines(17).ID: return 15007;\n\t\t\tcase WeepingVines::WeepingVines(18).ID: return 15008;\n\t\t\tcase WeepingVines::WeepingVines(19).ID: return 15009;\n\t\t\tcase WeepingVines::WeepingVines(20).ID: return 15010;\n\t\t\tcase WeepingVines::WeepingVines(21).ID: return 15011;\n\t\t\tcase WeepingVines::WeepingVines(22).ID: return 15012;\n\t\t\tcase WeepingVines::WeepingVines(23).ID: return 15013;\n\t\t\tcase WeepingVines::WeepingVines(24).ID: return 15014;\n\t\t\tcase WeepingVines::WeepingVines(25).ID: return 15015;\n\t\t\tcase WeepingVinesPlant::WeepingVinesPlant().ID: return 15016;\n\t\t\tcase WetSponge::WetSponge().ID: return 230;\n\t\t\tcase Wheat::Wheat(0).ID: return 3357;\n\t\t\tcase Wheat::Wheat(1).ID: return 3358;\n\t\t\tcase Wheat::Wheat(2).ID: return 3359;\n\t\t\tcase Wheat::Wheat(3).ID: return 3360;\n\t\t\tcase Wheat::Wheat(4).ID: return 3361;\n\t\t\tcase Wheat::Wheat(5).ID: return 3362;\n\t\t\tcase Wheat::Wheat(6).ID: return 3363;\n\t\t\tcase Wheat::Wheat(7).ID: return 3364;\n\t\t\tcase WhiteBanner::WhiteBanner(0).ID: return 7897;\n\t\t\tcase WhiteBanner::WhiteBanner(1).ID: return 7898;\n\t\t\tcase WhiteBanner::WhiteBanner(2).ID: return 7899;\n\t\t\tcase WhiteBanner::WhiteBanner(3).ID: return 7900;\n\t\t\tcase WhiteBanner::WhiteBanner(4).ID: return 7901;\n\t\t\tcase WhiteBanner::WhiteBanner(5).ID: return 7902;\n\t\t\tcase WhiteBanner::WhiteBanner(6).ID: return 7903;\n\t\t\tcase WhiteBanner::WhiteBanner(7).ID: return 7904;\n\t\t\tcase WhiteBanner::WhiteBanner(8).ID: return 7905;\n\t\t\tcase WhiteBanner::WhiteBanner(9).ID: return 7906;\n\t\t\tcase WhiteBanner::WhiteBanner(10).ID: return 7907;\n\t\t\tcase WhiteBanner::WhiteBanner(11).ID: return 7908;\n\t\t\tcase WhiteBanner::WhiteBanner(12).ID: return 7909;\n\t\t\tcase WhiteBanner::WhiteBanner(13).ID: return 7910;\n\t\t\tcase WhiteBanner::WhiteBanner(14).ID: return 7911;\n\t\t\tcase WhiteBanner::WhiteBanner(15).ID: return 7912;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Head).ID: return 1049;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, true, WhiteBed::Part::Foot).ID: return 1050;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Head).ID: return 1051;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZM, false, WhiteBed::Part::Foot).ID: return 1052;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Head).ID: return 1053;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, true, WhiteBed::Part::Foot).ID: return 1054;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Head).ID: return 1055;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_ZP, false, WhiteBed::Part::Foot).ID: return 1056;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Head).ID: return 1057;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, true, WhiteBed::Part::Foot).ID: return 1058;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Head).ID: return 1059;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XM, false, WhiteBed::Part::Foot).ID: return 1060;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Head).ID: return 1061;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, true, WhiteBed::Part::Foot).ID: return 1062;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Head).ID: return 1063;\n\t\t\tcase WhiteBed::WhiteBed(eBlockFace::BLOCK_FACE_XP, false, WhiteBed::Part::Foot).ID: return 1064;\n\t\t\tcase WhiteCarpet::WhiteCarpet().ID: return 7866;\n\t\t\tcase WhiteConcrete::WhiteConcrete().ID: return 9438;\n\t\t\tcase WhiteConcretePowder::WhiteConcretePowder().ID: return 9454;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9374;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9375;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9376;\n\t\t\tcase WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9377;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9278;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9279;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9280;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9281;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9282;\n\t\t\tcase WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9283;\n\t\t\tcase WhiteStainedGlass::WhiteStainedGlass().ID: return 4095;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, true).ID: return 6865;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, true, false).ID: return 6866;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, true).ID: return 6869;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, true, false, false).ID: return 6870;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, true).ID: return 6873;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, true, false).ID: return 6874;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, true).ID: return 6877;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(true, false, false, false).ID: return 6878;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, true).ID: return 6881;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, true, false).ID: return 6882;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, true).ID: return 6885;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, true, false, false).ID: return 6886;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, true).ID: return 6889;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, true, false).ID: return 6890;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, true).ID: return 6893;\n\t\t\tcase WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, false).ID: return 6894;\n\t\t\tcase WhiteTerracotta::WhiteTerracotta().ID: return 6847;\n\t\t\tcase WhiteTulip::WhiteTulip().ID: return 1419;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8153;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8154;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8155;\n\t\t\tcase WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8156;\n\t\t\tcase WhiteWool::WhiteWool().ID: return 1384;\n\t\t\tcase WitherRose::WitherRose().ID: return 1423;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(0).ID: return 6510;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(1).ID: return 6511;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(2).ID: return 6512;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(3).ID: return 6513;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(4).ID: return 6514;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(5).ID: return 6515;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(6).ID: return 6516;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(7).ID: return 6517;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(8).ID: return 6518;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(9).ID: return 6519;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(10).ID: return 6520;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(11).ID: return 6521;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(12).ID: return 6522;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(13).ID: return 6523;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(14).ID: return 6524;\n\t\t\tcase WitherSkeletonSkull::WitherSkeletonSkull(15).ID: return 6525;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM).ID: return 6526;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP).ID: return 6527;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XM).ID: return 6528;\n\t\t\tcase WitherSkeletonWallSkull::WitherSkeletonWallSkull(eBlockFace::BLOCK_FACE_XP).ID: return 6529;\n\t\t\tcase YellowBanner::YellowBanner(0).ID: return 7961;\n\t\t\tcase YellowBanner::YellowBanner(1).ID: return 7962;\n\t\t\tcase YellowBanner::YellowBanner(2).ID: return 7963;\n\t\t\tcase YellowBanner::YellowBanner(3).ID: return 7964;\n\t\t\tcase YellowBanner::YellowBanner(4).ID: return 7965;\n\t\t\tcase YellowBanner::YellowBanner(5).ID: return 7966;\n\t\t\tcase YellowBanner::YellowBanner(6).ID: return 7967;\n\t\t\tcase YellowBanner::YellowBanner(7).ID: return 7968;\n\t\t\tcase YellowBanner::YellowBanner(8).ID: return 7969;\n\t\t\tcase YellowBanner::YellowBanner(9).ID: return 7970;\n\t\t\tcase YellowBanner::YellowBanner(10).ID: return 7971;\n\t\t\tcase YellowBanner::YellowBanner(11).ID: return 7972;\n\t\t\tcase YellowBanner::YellowBanner(12).ID: return 7973;\n\t\t\tcase YellowBanner::YellowBanner(13).ID: return 7974;\n\t\t\tcase YellowBanner::YellowBanner(14).ID: return 7975;\n\t\t\tcase YellowBanner::YellowBanner(15).ID: return 7976;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Head).ID: return 1113;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, true, YellowBed::Part::Foot).ID: return 1114;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Head).ID: return 1115;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZM, false, YellowBed::Part::Foot).ID: return 1116;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Head).ID: return 1117;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, true, YellowBed::Part::Foot).ID: return 1118;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Head).ID: return 1119;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_ZP, false, YellowBed::Part::Foot).ID: return 1120;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Head).ID: return 1121;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, true, YellowBed::Part::Foot).ID: return 1122;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Head).ID: return 1123;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XM, false, YellowBed::Part::Foot).ID: return 1124;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Head).ID: return 1125;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, true, YellowBed::Part::Foot).ID: return 1126;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Head).ID: return 1127;\n\t\t\tcase YellowBed::YellowBed(eBlockFace::BLOCK_FACE_XP, false, YellowBed::Part::Foot).ID: return 1128;\n\t\t\tcase YellowCarpet::YellowCarpet().ID: return 7870;\n\t\t\tcase YellowConcrete::YellowConcrete().ID: return 9442;\n\t\t\tcase YellowConcretePowder::YellowConcretePowder().ID: return 9458;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM).ID: return 9390;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP).ID: return 9391;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XM).ID: return 9392;\n\t\t\tcase YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XP).ID: return 9393;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZM).ID: return 9302;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XP).ID: return 9303;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZP).ID: return 9304;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XM).ID: return 9305;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YP).ID: return 9306;\n\t\t\tcase YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YM).ID: return 9307;\n\t\t\tcase YellowStainedGlass::YellowStainedGlass().ID: return 4099;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, true).ID: return 6993;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, true, false).ID: return 6994;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, true).ID: return 6997;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, true, false, false).ID: return 6998;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, true).ID: return 7001;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, true, false).ID: return 7002;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, true).ID: return 7005;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(true, false, false, false).ID: return 7006;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, true).ID: return 7009;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, true, false).ID: return 7010;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, true).ID: return 7013;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, true, false, false).ID: return 7014;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, true).ID: return 7017;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, true, false).ID: return 7018;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, true).ID: return 7021;\n\t\t\tcase YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, false).ID: return 7022;\n\t\t\tcase YellowTerracotta::YellowTerracotta().ID: return 6851;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZM).ID: return 8169;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_ZP).ID: return 8170;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XM).ID: return 8171;\n\t\t\tcase YellowWallBanner::YellowWallBanner(eBlockFace::BLOCK_FACE_XP).ID: return 8172;\n\t\t\tcase YellowWool::YellowWool().ID: return 1388;\n\t\t\tcase ZombieHead::ZombieHead(0).ID: return 6530;\n\t\t\tcase ZombieHead::ZombieHead(1).ID: return 6531;\n\t\t\tcase ZombieHead::ZombieHead(2).ID: return 6532;\n\t\t\tcase ZombieHead::ZombieHead(3).ID: return 6533;\n\t\t\tcase ZombieHead::ZombieHead(4).ID: return 6534;\n\t\t\tcase ZombieHead::ZombieHead(5).ID: return 6535;\n\t\t\tcase ZombieHead::ZombieHead(6).ID: return 6536;\n\t\t\tcase ZombieHead::ZombieHead(7).ID: return 6537;\n\t\t\tcase ZombieHead::ZombieHead(8).ID: return 6538;\n\t\t\tcase ZombieHead::ZombieHead(9).ID: return 6539;\n\t\t\tcase ZombieHead::ZombieHead(10).ID: return 6540;\n\t\t\tcase ZombieHead::ZombieHead(11).ID: return 6541;\n\t\t\tcase ZombieHead::ZombieHead(12).ID: return 6542;\n\t\t\tcase ZombieHead::ZombieHead(13).ID: return 6543;\n\t\t\tcase ZombieHead::ZombieHead(14).ID: return 6544;\n\t\t\tcase ZombieHead::ZombieHead(15).ID: return 6545;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZM).ID: return 6546;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_ZP).ID: return 6547;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XM).ID: return 6548;\n\t\t\tcase ZombieWallHead::ZombieWallHead(eBlockFace::BLOCK_FACE_XP).ID: return 6549;\n\t\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tUInt32 From(const Item ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase Item::AcaciaBoat: return 901;\n\t\t\tcase Item::AcaciaButton: return 309;\n\t\t\tcase Item::AcaciaDoor: return 562;\n\t\t\tcase Item::AcaciaFence: return 212;\n\t\t\tcase Item::AcaciaFenceGate: return 256;\n\t\t\tcase Item::AcaciaLeaves: return 73;\n\t\t\tcase Item::AcaciaLog: return 41;\n\t\t\tcase Item::AcaciaPlanks: return 19;\n\t\t\tcase Item::AcaciaPressurePlate: return 195;\n\t\t\tcase Item::AcaciaSapling: return 27;\n\t\t\tcase Item::AcaciaSign: return 656;\n\t\t\tcase Item::AcaciaSlab: return 142;\n\t\t\tcase Item::AcaciaStairs: return 369;\n\t\t\tcase Item::AcaciaTrapdoor: return 230;\n\t\t\tcase Item::AcaciaWood: return 65;\n\t\t\tcase Item::ActivatorRail: return 329;\n\t\t\tcase Item::Air: return -0;\n\t\t\tcase Item::Allium: return 114;\n\t\t\tcase Item::AncientDebris: return 959;\n\t\t\tcase Item::Andesite: return 6;\n\t\t\tcase Item::AndesiteSlab: return 552;\n\t\t\tcase Item::AndesiteStairs: return 539;\n\t\t\tcase Item::AndesiteWall: return 296;\n\t\t\tcase Item::Anvil: return 314;\n\t\t\tcase Item::Apple: return 576;\n\t\t\tcase Item::ArmorStand: return 859;\n\t\t\tcase Item::Arrow: return 578;\n\t\t\tcase Item::AzureBluet: return 115;\n\t\t\tcase Item::BakedPotato: return 831;\n\t\t\tcase Item::Bamboo: return 135;\n\t\t\tcase Item::Barrel: return 935;\n\t\t\tcase Item::Barrier: return 347;\n\t\t\tcase Item::Basalt: return 221;\n\t\t\tcase Item::BatSpawnEgg: return 759;\n\t\t\tcase Item::Beacon: return 286;\n\t\t\tcase Item::Bedrock: return 29;\n\t\t\tcase Item::BeeNest: return 952;\n\t\t\tcase Item::BeeSpawnEgg: return 760;\n\t\t\tcase Item::Beef: return 739;\n\t\t\tcase Item::Beehive: return 953;\n\t\t\tcase Item::Beetroot: return 888;\n\t\t\tcase Item::BeetrootSeeds: return 889;\n\t\t\tcase Item::BeetrootSoup: return 890;\n\t\t\tcase Item::Bell: return 944;\n\t\t\tcase Item::BirchBoat: return 899;\n\t\t\tcase Item::BirchButton: return 307;\n\t\t\tcase Item::BirchDoor: return 560;\n\t\t\tcase Item::BirchFence: return 210;\n\t\t\tcase Item::BirchFenceGate: return 254;\n\t\t\tcase Item::BirchLeaves: return 71;\n\t\t\tcase Item::BirchLog: return 39;\n\t\t\tcase Item::BirchPlanks: return 17;\n\t\t\tcase Item::BirchPressurePlate: return 193;\n\t\t\tcase Item::BirchSapling: return 25;\n\t\t\tcase Item::BirchSign: return 654;\n\t\t\tcase Item::BirchSlab: return 140;\n\t\t\tcase Item::BirchStairs: return 281;\n\t\t\tcase Item::BirchTrapdoor: return 228;\n\t\t\tcase Item::BirchWood: return 63;\n\t\t\tcase Item::BlackBanner: return 884;\n\t\t\tcase Item::BlackBed: return 731;\n\t\t\tcase Item::BlackCarpet: return 365;\n\t\t\tcase Item::BlackConcrete: return 479;\n\t\t\tcase Item::BlackConcretePowder: return 495;\n\t\t\tcase Item::BlackDye: return 711;\n\t\t\tcase Item::BlackGlazedTerracotta: return 463;\n\t\t\tcase Item::BlackShulkerBox: return 447;\n\t\t\tcase Item::BlackStainedGlass: return 394;\n\t\t\tcase Item::BlackStainedGlassPane: return 410;\n\t\t\tcase Item::BlackTerracotta: return 346;\n\t\t\tcase Item::BlackWool: return 110;\n\t\t\tcase Item::Blackstone: return 962;\n\t\t\tcase Item::BlackstoneSlab: return 963;\n\t\t\tcase Item::BlackstoneStairs: return 964;\n\t\t\tcase Item::BlackstoneWall: return 301;\n\t\t\tcase Item::BlastFurnace: return 937;\n\t\t\tcase Item::BlazePowder: return 753;\n\t\t\tcase Item::BlazeRod: return 745;\n\t\t\tcase Item::BlazeSpawnEgg: return 761;\n\t\t\tcase Item::BlueBanner: return 880;\n\t\t\tcase Item::BlueBed: return 727;\n\t\t\tcase Item::BlueCarpet: return 361;\n\t\t\tcase Item::BlueConcrete: return 475;\n\t\t\tcase Item::BlueConcretePowder: return 491;\n\t\t\tcase Item::BlueDye: return 709;\n\t\t\tcase Item::BlueGlazedTerracotta: return 459;\n\t\t\tcase Item::BlueIce: return 527;\n\t\t\tcase Item::BlueOrchid: return 113;\n\t\t\tcase Item::BlueShulkerBox: return 443;\n\t\t\tcase Item::BlueStainedGlass: return 390;\n\t\t\tcase Item::BlueStainedGlassPane: return 406;\n\t\t\tcase Item::BlueTerracotta: return 342;\n\t\t\tcase Item::BlueWool: return 106;\n\t\t\tcase Item::Bone: return 713;\n\t\t\tcase Item::BoneBlock: return 428;\n\t\t\tcase Item::BoneMeal: return 708;\n\t\t\tcase Item::Book: return 678;\n\t\t\tcase Item::Bookshelf: return 168;\n\t\t\tcase Item::Bow: return 577;\n\t\t\tcase Item::Bowl: return 600;\n\t\t\tcase Item::BrainCoral: return 508;\n\t\t\tcase Item::BrainCoralBlock: return 503;\n\t\t\tcase Item::BrainCoralFan: return 518;\n\t\t\tcase Item::Bread: return 621;\n\t\t\tcase Item::BrewingStand: return 755;\n\t\t\tcase Item::Brick: return 674;\n\t\t\tcase Item::BrickSlab: return 152;\n\t\t\tcase Item::BrickStairs: return 260;\n\t\t\tcase Item::BrickWall: return 289;\n\t\t\tcase Item::Bricks: return 166;\n\t\t\tcase Item::BrownBanner: return 881;\n\t\t\tcase Item::BrownBed: return 728;\n\t\t\tcase Item::BrownCarpet: return 362;\n\t\t\tcase Item::BrownConcrete: return 476;\n\t\t\tcase Item::BrownConcretePowder: return 492;\n\t\t\tcase Item::BrownDye: return 710;\n\t\t\tcase Item::BrownGlazedTerracotta: return 460;\n\t\t\tcase Item::BrownMushroom: return 124;\n\t\t\tcase Item::BrownMushroomBlock: return 244;\n\t\t\tcase Item::BrownShulkerBox: return 444;\n\t\t\tcase Item::BrownStainedGlass: return 391;\n\t\t\tcase Item::BrownStainedGlassPane: return 407;\n\t\t\tcase Item::BrownTerracotta: return 343;\n\t\t\tcase Item::BrownWool: return 107;\n\t\t\tcase Item::BubbleCoral: return 509;\n\t\t\tcase Item::BubbleCoralBlock: return 504;\n\t\t\tcase Item::BubbleCoralFan: return 519;\n\t\t\tcase Item::Bucket: return 660;\n\t\t\tcase Item::Cactus: return 205;\n\t\t\tcase Item::Cake: return 715;\n\t\t\tcase Item::Campfire: return 948;\n\t\t\tcase Item::Carrot: return 829;\n\t\t\tcase Item::CarrotOnAStick: return 841;\n\t\t\tcase Item::CartographyTable: return 938;\n\t\t\tcase Item::CarvedPumpkin: return 217;\n\t\t\tcase Item::CatSpawnEgg: return 762;\n\t\t\tcase Item::Cauldron: return 756;\n\t\t\tcase Item::CaveSpiderSpawnEgg: return 763;\n\t\t\tcase Item::Chain: return 248;\n\t\t\tcase Item::ChainCommandBlock: return 423;\n\t\t\tcase Item::ChainmailBoots: return 629;\n\t\t\tcase Item::ChainmailChestplate: return 627;\n\t\t\tcase Item::ChainmailHelmet: return 626;\n\t\t\tcase Item::ChainmailLeggings: return 628;\n\t\t\tcase Item::Charcoal: return 580;\n\t\t\tcase Item::Chest: return 180;\n\t\t\tcase Item::ChestMinecart: return 680;\n\t\t\tcase Item::Chicken: return 741;\n\t\t\tcase Item::ChickenSpawnEgg: return 764;\n\t\t\tcase Item::ChippedAnvil: return 315;\n\t\t\tcase Item::ChiseledNetherBricks: return 266;\n\t\t\tcase Item::ChiseledPolishedBlackstone: return 969;\n\t\t\tcase Item::ChiseledQuartzBlock: return 324;\n\t\t\tcase Item::ChiseledRedSandstone: return 419;\n\t\t\tcase Item::ChiseledSandstone: return 82;\n\t\t\tcase Item::ChiseledStoneBricks: return 243;\n\t\t\tcase Item::ChorusFlower: return 174;\n\t\t\tcase Item::ChorusFruit: return 886;\n\t\t\tcase Item::ChorusPlant: return 173;\n\t\t\tcase Item::Clay: return 206;\n\t\t\tcase Item::ClayBall: return 675;\n\t\t\tcase Item::Clock: return 685;\n\t\t\tcase Item::Coal: return 579;\n\t\t\tcase Item::CoalBlock: return 367;\n\t\t\tcase Item::CoalOre: return 35;\n\t\t\tcase Item::CoarseDirt: return 10;\n\t\t\tcase Item::Cobblestone: return 14;\n\t\t\tcase Item::CobblestoneSlab: return 151;\n\t\t\tcase Item::CobblestoneStairs: return 188;\n\t\t\tcase Item::CobblestoneWall: return 287;\n\t\t\tcase Item::Cobweb: return 88;\n\t\t\tcase Item::CocoaBeans: return 696;\n\t\t\tcase Item::Cod: return 687;\n\t\t\tcase Item::CodBucket: return 672;\n\t\t\tcase Item::CodSpawnEgg: return 765;\n\t\t\tcase Item::CommandBlock: return 285;\n\t\t\tcase Item::CommandBlockMinecart: return 866;\n\t\t\tcase Item::Comparator: return 567;\n\t\t\tcase Item::Compass: return 683;\n\t\t\tcase Item::Composter: return 934;\n\t\t\tcase Item::Conduit: return 528;\n\t\t\tcase Item::CookedBeef: return 740;\n\t\t\tcase Item::CookedChicken: return 742;\n\t\t\tcase Item::CookedCod: return 691;\n\t\t\tcase Item::CookedMutton: return 868;\n\t\t\tcase Item::CookedPorkchop: return 648;\n\t\t\tcase Item::CookedRabbit: return 855;\n\t\t\tcase Item::CookedSalmon: return 692;\n\t\t\tcase Item::Cookie: return 732;\n\t\t\tcase Item::Cornflower: return 121;\n\t\t\tcase Item::CowSpawnEgg: return 766;\n\t\t\tcase Item::CrackedNetherBricks: return 265;\n\t\t\tcase Item::CrackedPolishedBlackstoneBricks: return 973;\n\t\t\tcase Item::CrackedStoneBricks: return 242;\n\t\t\tcase Item::CraftingTable: return 183;\n\t\t\tcase Item::CreeperBannerPattern: return 929;\n\t\t\tcase Item::CreeperHead: return 839;\n\t\t\tcase Item::CreeperSpawnEgg: return 767;\n\t\t\tcase Item::CrimsonButton: return 311;\n\t\t\tcase Item::CrimsonDoor: return 564;\n\t\t\tcase Item::CrimsonFence: return 214;\n\t\t\tcase Item::CrimsonFenceGate: return 258;\n\t\t\tcase Item::CrimsonFungus: return 126;\n\t\t\tcase Item::CrimsonHyphae: return 67;\n\t\t\tcase Item::CrimsonNylium: return 12;\n\t\t\tcase Item::CrimsonPlanks: return 21;\n\t\t\tcase Item::CrimsonPressurePlate: return 197;\n\t\t\tcase Item::CrimsonRoots: return 128;\n\t\t\tcase Item::CrimsonSign: return 658;\n\t\t\tcase Item::CrimsonSlab: return 144;\n\t\t\tcase Item::CrimsonStairs: return 283;\n\t\t\tcase Item::CrimsonStem: return 43;\n\t\t\tcase Item::CrimsonTrapdoor: return 232;\n\t\t\tcase Item::Crossbow: return 925;\n\t\t\tcase Item::CryingObsidian: return 961;\n\t\t\tcase Item::CutRedSandstone: return 420;\n\t\t\tcase Item::CutRedSandstoneSlab: return 157;\n\t\t\tcase Item::CutSandstone: return 83;\n\t\t\tcase Item::CutSandstoneSlab: return 149;\n\t\t\tcase Item::CyanBanner: return 878;\n\t\t\tcase Item::CyanBed: return 725;\n\t\t\tcase Item::CyanCarpet: return 359;\n\t\t\tcase Item::CyanConcrete: return 473;\n\t\t\tcase Item::CyanConcretePowder: return 489;\n\t\t\tcase Item::CyanDye: return 699;\n\t\t\tcase Item::CyanGlazedTerracotta: return 457;\n\t\t\tcase Item::CyanShulkerBox: return 441;\n\t\t\tcase Item::CyanStainedGlass: return 388;\n\t\t\tcase Item::CyanStainedGlassPane: return 404;\n\t\t\tcase Item::CyanTerracotta: return 340;\n\t\t\tcase Item::CyanWool: return 104;\n\t\t\tcase Item::DamagedAnvil: return 316;\n\t\t\tcase Item::Dandelion: return 111;\n\t\t\tcase Item::DarkOakBoat: return 902;\n\t\t\tcase Item::DarkOakButton: return 310;\n\t\t\tcase Item::DarkOakDoor: return 563;\n\t\t\tcase Item::DarkOakFence: return 213;\n\t\t\tcase Item::DarkOakFenceGate: return 257;\n\t\t\tcase Item::DarkOakLeaves: return 74;\n\t\t\tcase Item::DarkOakLog: return 42;\n\t\t\tcase Item::DarkOakPlanks: return 20;\n\t\t\tcase Item::DarkOakPressurePlate: return 196;\n\t\t\tcase Item::DarkOakSapling: return 28;\n\t\t\tcase Item::DarkOakSign: return 657;\n\t\t\tcase Item::DarkOakSlab: return 143;\n\t\t\tcase Item::DarkOakStairs: return 370;\n\t\t\tcase Item::DarkOakTrapdoor: return 231;\n\t\t\tcase Item::DarkOakWood: return 66;\n\t\t\tcase Item::DarkPrismarine: return 413;\n\t\t\tcase Item::DarkPrismarineSlab: return 161;\n\t\t\tcase Item::DarkPrismarineStairs: return 416;\n\t\t\tcase Item::DaylightDetector: return 320;\n\t\t\tcase Item::DeadBrainCoral: return 512;\n\t\t\tcase Item::DeadBrainCoralBlock: return 498;\n\t\t\tcase Item::DeadBrainCoralFan: return 523;\n\t\t\tcase Item::DeadBubbleCoral: return 513;\n\t\t\tcase Item::DeadBubbleCoralBlock: return 499;\n\t\t\tcase Item::DeadBubbleCoralFan: return 524;\n\t\t\tcase Item::DeadBush: return 91;\n\t\t\tcase Item::DeadFireCoral: return 514;\n\t\t\tcase Item::DeadFireCoralBlock: return 500;\n\t\t\tcase Item::DeadFireCoralFan: return 525;\n\t\t\tcase Item::DeadHornCoral: return 515;\n\t\t\tcase Item::DeadHornCoralBlock: return 501;\n\t\t\tcase Item::DeadHornCoralFan: return 526;\n\t\t\tcase Item::DeadTubeCoral: return 516;\n\t\t\tcase Item::DeadTubeCoralBlock: return 497;\n\t\t\tcase Item::DeadTubeCoralFan: return 522;\n\t\t\tcase Item::DebugStick: return 907;\n\t\t\tcase Item::DetectorRail: return 86;\n\t\t\tcase Item::Diamond: return 581;\n\t\t\tcase Item::DiamondAxe: return 598;\n\t\t\tcase Item::DiamondBlock: return 182;\n\t\t\tcase Item::DiamondBoots: return 637;\n\t\t\tcase Item::DiamondChestplate: return 635;\n\t\t\tcase Item::DiamondHelmet: return 634;\n\t\t\tcase Item::DiamondHoe: return 616;\n\t\t\tcase Item::DiamondHorseArmor: return 862;\n\t\t\tcase Item::DiamondLeggings: return 636;\n\t\t\tcase Item::DiamondOre: return 181;\n\t\t\tcase Item::DiamondPickaxe: return 597;\n\t\t\tcase Item::DiamondShovel: return 596;\n\t\t\tcase Item::DiamondSword: return 595;\n\t\t\tcase Item::Diorite: return 4;\n\t\t\tcase Item::DioriteSlab: return 555;\n\t\t\tcase Item::DioriteStairs: return 542;\n\t\t\tcase Item::DioriteWall: return 300;\n\t\t\tcase Item::Dirt: return 9;\n\t\t\tcase Item::Dispenser: return 80;\n\t\t\tcase Item::DolphinSpawnEgg: return 768;\n\t\t\tcase Item::DonkeySpawnEgg: return 769;\n\t\t\tcase Item::DragonBreath: return 891;\n\t\t\tcase Item::DragonEgg: return 273;\n\t\t\tcase Item::DragonHead: return 840;\n\t\t\tcase Item::DriedKelp: return 736;\n\t\t\tcase Item::DriedKelpBlock: return 676;\n\t\t\tcase Item::Dropper: return 330;\n\t\t\tcase Item::DrownedSpawnEgg: return 770;\n\t\t\tcase Item::Egg: return 682;\n\t\t\tcase Item::ElderGuardianSpawnEgg: return 771;\n\t\t\tcase Item::Elytra: return 897;\n\t\t\tcase Item::Emerald: return 826;\n\t\t\tcase Item::EmeraldBlock: return 279;\n\t\t\tcase Item::EmeraldOre: return 276;\n\t\t\tcase Item::EnchantedBook: return 847;\n\t\t\tcase Item::EnchantedGoldenApple: return 651;\n\t\t\tcase Item::EnchantingTable: return 269;\n\t\t\tcase Item::EndCrystal: return 885;\n\t\t\tcase Item::EndPortalFrame: return 270;\n\t\t\tcase Item::EndRod: return 172;\n\t\t\tcase Item::EndStone: return 271;\n\t\t\tcase Item::EndStoneBrickSlab: return 548;\n\t\t\tcase Item::EndStoneBrickStairs: return 534;\n\t\t\tcase Item::EndStoneBrickWall: return 299;\n\t\t\tcase Item::EndStoneBricks: return 272;\n\t\t\tcase Item::EnderChest: return 277;\n\t\t\tcase Item::EnderEye: return 757;\n\t\t\tcase Item::EnderPearl: return 744;\n\t\t\tcase Item::EndermanSpawnEgg: return 772;\n\t\t\tcase Item::EndermiteSpawnEgg: return 773;\n\t\t\tcase Item::EvokerSpawnEgg: return 774;\n\t\t\tcase Item::ExperienceBottle: return 822;\n\t\t\tcase Item::Farmland: return 184;\n\t\t\tcase Item::Feather: return 611;\n\t\t\tcase Item::FermentedSpiderEye: return 752;\n\t\t\tcase Item::Fern: return 90;\n\t\t\tcase Item::FilledMap: return 733;\n\t\t\tcase Item::FireCharge: return 823;\n\t\t\tcase Item::FireCoral: return 510;\n\t\t\tcase Item::FireCoralBlock: return 505;\n\t\t\tcase Item::FireCoralFan: return 520;\n\t\t\tcase Item::FireworkRocket: return 845;\n\t\t\tcase Item::FireworkStar: return 846;\n\t\t\tcase Item::FishingRod: return 684;\n\t\t\tcase Item::FletchingTable: return 939;\n\t\t\tcase Item::Flint: return 646;\n\t\t\tcase Item::FlintAndSteel: return 575;\n\t\t\tcase Item::FlowerBannerPattern: return 928;\n\t\t\tcase Item::FlowerPot: return 828;\n\t\t\tcase Item::FoxSpawnEgg: return 775;\n\t\t\tcase Item::Furnace: return 185;\n\t\t\tcase Item::FurnaceMinecart: return 681;\n\t\t\tcase Item::GhastSpawnEgg: return 776;\n\t\t\tcase Item::GhastTear: return 746;\n\t\t\tcase Item::GildedBlackstone: return 965;\n\t\t\tcase Item::Glass: return 77;\n\t\t\tcase Item::GlassBottle: return 750;\n\t\t\tcase Item::GlassPane: return 249;\n\t\t\tcase Item::GlisteringMelonSlice: return 758;\n\t\t\tcase Item::GlobeBannerPattern: return 932;\n\t\t\tcase Item::Glowstone: return 224;\n\t\t\tcase Item::GlowstoneDust: return 686;\n\t\t\tcase Item::GoldBlock: return 136;\n\t\t\tcase Item::GoldIngot: return 583;\n\t\t\tcase Item::GoldNugget: return 747;\n\t\t\tcase Item::GoldOre: return 33;\n\t\t\tcase Item::GoldenApple: return 650;\n\t\t\tcase Item::GoldenAxe: return 605;\n\t\t\tcase Item::GoldenBoots: return 641;\n\t\t\tcase Item::GoldenCarrot: return 834;\n\t\t\tcase Item::GoldenChestplate: return 639;\n\t\t\tcase Item::GoldenHelmet: return 638;\n\t\t\tcase Item::GoldenHoe: return 617;\n\t\t\tcase Item::GoldenHorseArmor: return 861;\n\t\t\tcase Item::GoldenLeggings: return 640;\n\t\t\tcase Item::GoldenPickaxe: return 604;\n\t\t\tcase Item::GoldenShovel: return 603;\n\t\t\tcase Item::GoldenSword: return 602;\n\t\t\tcase Item::Granite: return 2;\n\t\t\tcase Item::GraniteSlab: return 551;\n\t\t\tcase Item::GraniteStairs: return 538;\n\t\t\tcase Item::GraniteWall: return 293;\n\t\t\tcase Item::Grass: return 89;\n\t\t\tcase Item::GrassBlock: return 8;\n\t\t\tcase Item::GrassPath: return 372;\n\t\t\tcase Item::Gravel: return 32;\n\t\t\tcase Item::GrayBanner: return 876;\n\t\t\tcase Item::GrayBed: return 723;\n\t\t\tcase Item::GrayCarpet: return 357;\n\t\t\tcase Item::GrayConcrete: return 471;\n\t\t\tcase Item::GrayConcretePowder: return 487;\n\t\t\tcase Item::GrayDye: return 701;\n\t\t\tcase Item::GrayGlazedTerracotta: return 455;\n\t\t\tcase Item::GrayShulkerBox: return 439;\n\t\t\tcase Item::GrayStainedGlass: return 386;\n\t\t\tcase Item::GrayStainedGlassPane: return 402;\n\t\t\tcase Item::GrayTerracotta: return 338;\n\t\t\tcase Item::GrayWool: return 102;\n\t\t\tcase Item::GreenBanner: return 882;\n\t\t\tcase Item::GreenBed: return 729;\n\t\t\tcase Item::GreenCarpet: return 363;\n\t\t\tcase Item::GreenConcrete: return 477;\n\t\t\tcase Item::GreenConcretePowder: return 493;\n\t\t\tcase Item::GreenDye: return 695;\n\t\t\tcase Item::GreenGlazedTerracotta: return 461;\n\t\t\tcase Item::GreenShulkerBox: return 445;\n\t\t\tcase Item::GreenStainedGlass: return 392;\n\t\t\tcase Item::GreenStainedGlassPane: return 408;\n\t\t\tcase Item::GreenTerracotta: return 344;\n\t\t\tcase Item::GreenWool: return 108;\n\t\t\tcase Item::Grindstone: return 940;\n\t\t\tcase Item::GuardianSpawnEgg: return 777;\n\t\t\tcase Item::Gunpowder: return 612;\n\t\t\tcase Item::HayBale: return 349;\n\t\t\tcase Item::HeartOfTheSea: return 924;\n\t\t\tcase Item::HeavyWeightedPressurePlate: return 319;\n\t\t\tcase Item::HoglinSpawnEgg: return 778;\n\t\t\tcase Item::HoneyBlock: return 955;\n\t\t\tcase Item::HoneyBottle: return 954;\n\t\t\tcase Item::Honeycomb: return 951;\n\t\t\tcase Item::HoneycombBlock: return 956;\n\t\t\tcase Item::Hopper: return 323;\n\t\t\tcase Item::HopperMinecart: return 851;\n\t\t\tcase Item::HornCoral: return 511;\n\t\t\tcase Item::HornCoralBlock: return 506;\n\t\t\tcase Item::HornCoralFan: return 521;\n\t\t\tcase Item::HorseSpawnEgg: return 779;\n\t\t\tcase Item::HuskSpawnEgg: return 780;\n\t\t\tcase Item::Ice: return 203;\n\t\t\tcase Item::InfestedChiseledStoneBricks: return 239;\n\t\t\tcase Item::InfestedCobblestone: return 235;\n\t\t\tcase Item::InfestedCrackedStoneBricks: return 238;\n\t\t\tcase Item::InfestedMossyStoneBricks: return 237;\n\t\t\tcase Item::InfestedStone: return 234;\n\t\t\tcase Item::InfestedStoneBricks: return 236;\n\t\t\tcase Item::InkSac: return 693;\n\t\t\tcase Item::IronAxe: return 574;\n\t\t\tcase Item::IronBars: return 247;\n\t\t\tcase Item::IronBlock: return 137;\n\t\t\tcase Item::IronBoots: return 633;\n\t\t\tcase Item::IronChestplate: return 631;\n\t\t\tcase Item::IronDoor: return 557;\n\t\t\tcase Item::IronHelmet: return 630;\n\t\t\tcase Item::IronHoe: return 615;\n\t\t\tcase Item::IronHorseArmor: return 860;\n\t\t\tcase Item::IronIngot: return 582;\n\t\t\tcase Item::IronLeggings: return 632;\n\t\t\tcase Item::IronNugget: return 905;\n\t\t\tcase Item::IronOre: return 34;\n\t\t\tcase Item::IronPickaxe: return 573;\n\t\t\tcase Item::IronShovel: return 572;\n\t\t\tcase Item::IronSword: return 586;\n\t\t\tcase Item::IronTrapdoor: return 348;\n\t\t\tcase Item::ItemFrame: return 827;\n\t\t\tcase Item::JackOLantern: return 225;\n\t\t\tcase Item::Jigsaw: return 569;\n\t\t\tcase Item::Jukebox: return 207;\n\t\t\tcase Item::JungleBoat: return 900;\n\t\t\tcase Item::JungleButton: return 308;\n\t\t\tcase Item::JungleDoor: return 561;\n\t\t\tcase Item::JungleFence: return 211;\n\t\t\tcase Item::JungleFenceGate: return 255;\n\t\t\tcase Item::JungleLeaves: return 72;\n\t\t\tcase Item::JungleLog: return 40;\n\t\t\tcase Item::JunglePlanks: return 18;\n\t\t\tcase Item::JunglePressurePlate: return 194;\n\t\t\tcase Item::JungleSapling: return 26;\n\t\t\tcase Item::JungleSign: return 655;\n\t\t\tcase Item::JungleSlab: return 141;\n\t\t\tcase Item::JungleStairs: return 282;\n\t\t\tcase Item::JungleTrapdoor: return 229;\n\t\t\tcase Item::JungleWood: return 64;\n\t\t\tcase Item::Kelp: return 134;\n\t\t\tcase Item::KnowledgeBook: return 906;\n\t\t\tcase Item::Ladder: return 186;\n\t\t\tcase Item::Lantern: return 945;\n\t\t\tcase Item::LapisBlock: return 79;\n\t\t\tcase Item::LapisLazuli: return 697;\n\t\t\tcase Item::LapisOre: return 78;\n\t\t\tcase Item::LargeFern: return 378;\n\t\t\tcase Item::LavaBucket: return 662;\n\t\t\tcase Item::Lead: return 864;\n\t\t\tcase Item::Leather: return 668;\n\t\t\tcase Item::LeatherBoots: return 625;\n\t\t\tcase Item::LeatherChestplate: return 623;\n\t\t\tcase Item::LeatherHelmet: return 622;\n\t\t\tcase Item::LeatherHorseArmor: return 863;\n\t\t\tcase Item::LeatherLeggings: return 624;\n\t\t\tcase Item::Lectern: return 941;\n\t\t\tcase Item::Lever: return 189;\n\t\t\tcase Item::LightBlueBanner: return 872;\n\t\t\tcase Item::LightBlueBed: return 719;\n\t\t\tcase Item::LightBlueCarpet: return 353;\n\t\t\tcase Item::LightBlueConcrete: return 467;\n\t\t\tcase Item::LightBlueConcretePowder: return 483;\n\t\t\tcase Item::LightBlueDye: return 705;\n\t\t\tcase Item::LightBlueGlazedTerracotta: return 451;\n\t\t\tcase Item::LightBlueShulkerBox: return 435;\n\t\t\tcase Item::LightBlueStainedGlass: return 382;\n\t\t\tcase Item::LightBlueStainedGlassPane: return 398;\n\t\t\tcase Item::LightBlueTerracotta: return 334;\n\t\t\tcase Item::LightBlueWool: return 98;\n\t\t\tcase Item::LightGrayBanner: return 877;\n\t\t\tcase Item::LightGrayBed: return 724;\n\t\t\tcase Item::LightGrayCarpet: return 358;\n\t\t\tcase Item::LightGrayConcrete: return 472;\n\t\t\tcase Item::LightGrayConcretePowder: return 488;\n\t\t\tcase Item::LightGrayDye: return 700;\n\t\t\tcase Item::LightGrayGlazedTerracotta: return 456;\n\t\t\tcase Item::LightGrayShulkerBox: return 440;\n\t\t\tcase Item::LightGrayStainedGlass: return 387;\n\t\t\tcase Item::LightGrayStainedGlassPane: return 403;\n\t\t\tcase Item::LightGrayTerracotta: return 339;\n\t\t\tcase Item::LightGrayWool: return 103;\n\t\t\tcase Item::LightWeightedPressurePlate: return 318;\n\t\t\tcase Item::Lilac: return 374;\n\t\t\tcase Item::LilyOfTheValley: return 122;\n\t\t\tcase Item::LilyPad: return 263;\n\t\t\tcase Item::LimeBanner: return 874;\n\t\t\tcase Item::LimeBed: return 721;\n\t\t\tcase Item::LimeCarpet: return 355;\n\t\t\tcase Item::LimeConcrete: return 469;\n\t\t\tcase Item::LimeConcretePowder: return 485;\n\t\t\tcase Item::LimeDye: return 703;\n\t\t\tcase Item::LimeGlazedTerracotta: return 453;\n\t\t\tcase Item::LimeShulkerBox: return 437;\n\t\t\tcase Item::LimeStainedGlass: return 384;\n\t\t\tcase Item::LimeStainedGlassPane: return 400;\n\t\t\tcase Item::LimeTerracotta: return 336;\n\t\t\tcase Item::LimeWool: return 100;\n\t\t\tcase Item::LingeringPotion: return 895;\n\t\t\tcase Item::LlamaSpawnEgg: return 781;\n\t\t\tcase Item::Lodestone: return 957;\n\t\t\tcase Item::Loom: return 927;\n\t\t\tcase Item::MagentaBanner: return 871;\n\t\t\tcase Item::MagentaBed: return 718;\n\t\t\tcase Item::MagentaCarpet: return 352;\n\t\t\tcase Item::MagentaConcrete: return 466;\n\t\t\tcase Item::MagentaConcretePowder: return 482;\n\t\t\tcase Item::MagentaDye: return 706;\n\t\t\tcase Item::MagentaGlazedTerracotta: return 450;\n\t\t\tcase Item::MagentaShulkerBox: return 434;\n\t\t\tcase Item::MagentaStainedGlass: return 381;\n\t\t\tcase Item::MagentaStainedGlassPane: return 397;\n\t\t\tcase Item::MagentaTerracotta: return 333;\n\t\t\tcase Item::MagentaWool: return 97;\n\t\t\tcase Item::MagmaBlock: return 424;\n\t\t\tcase Item::MagmaCream: return 754;\n\t\t\tcase Item::MagmaCubeSpawnEgg: return 782;\n\t\t\tcase Item::Map: return 833;\n\t\t\tcase Item::Melon: return 250;\n\t\t\tcase Item::MelonSeeds: return 738;\n\t\t\tcase Item::MelonSlice: return 735;\n\t\t\tcase Item::MilkBucket: return 669;\n\t\t\tcase Item::Minecart: return 663;\n\t\t\tcase Item::MojangBannerPattern: return 931;\n\t\t\tcase Item::MooshroomSpawnEgg: return 783;\n\t\t\tcase Item::MossyCobblestone: return 169;\n\t\t\tcase Item::MossyCobblestoneSlab: return 547;\n\t\t\tcase Item::MossyCobblestoneStairs: return 533;\n\t\t\tcase Item::MossyCobblestoneWall: return 288;\n\t\t\tcase Item::MossyStoneBrickSlab: return 545;\n\t\t\tcase Item::MossyStoneBrickStairs: return 531;\n\t\t\tcase Item::MossyStoneBrickWall: return 292;\n\t\t\tcase Item::MossyStoneBricks: return 241;\n\t\t\tcase Item::MuleSpawnEgg: return 784;\n\t\t\tcase Item::MushroomStem: return 246;\n\t\t\tcase Item::MushroomStew: return 601;\n\t\t\tcase Item::MusicDiscBlocks: return 910;\n\t\t\tcase Item::MusicDiscCat: return 909;\n\t\t\tcase Item::MusicDiscChirp: return 911;\n\t\t\tcase Item::MusicDiscFar: return 912;\n\t\t\tcase Item::MusicDiscMall: return 913;\n\t\t\tcase Item::MusicDiscMellohi: return 914;\n\t\t\tcase Item::MusicDiscPigstep: return 920;\n\t\t\tcase Item::MusicDiscStal: return 915;\n\t\t\tcase Item::MusicDiscStrad: return 916;\n\t\t\tcase Item::MusicDiscWait: return 919;\n\t\t\tcase Item::MusicDiscWard: return 917;\n\t\t\tcase Item::MusicDisc11: return 918;\n\t\t\tcase Item::MusicDisc13: return 908;\n\t\t\tcase Item::Mutton: return 867;\n\t\t\tcase Item::Mycelium: return 262;\n\t\t\tcase Item::NameTag: return 865;\n\t\t\tcase Item::NautilusShell: return 923;\n\t\t\tcase Item::NetherBrick: return 848;\n\t\t\tcase Item::NetherBrickFence: return 267;\n\t\t\tcase Item::NetherBrickSlab: return 154;\n\t\t\tcase Item::NetherBrickStairs: return 268;\n\t\t\tcase Item::NetherBrickWall: return 295;\n\t\t\tcase Item::NetherBricks: return 264;\n\t\t\tcase Item::NetherGoldOre: return 36;\n\t\t\tcase Item::NetherQuartzOre: return 322;\n\t\t\tcase Item::NetherSprouts: return 130;\n\t\t\tcase Item::NetherStar: return 843;\n\t\t\tcase Item::NetherWart: return 748;\n\t\t\tcase Item::NetherWartBlock: return 425;\n\t\t\tcase Item::NetheriteAxe: return 609;\n\t\t\tcase Item::NetheriteBlock: return 958;\n\t\t\tcase Item::NetheriteBoots: return 645;\n\t\t\tcase Item::NetheriteChestplate: return 643;\n\t\t\tcase Item::NetheriteHelmet: return 642;\n\t\t\tcase Item::NetheriteHoe: return 618;\n\t\t\tcase Item::NetheriteIngot: return 584;\n\t\t\tcase Item::NetheriteLeggings: return 644;\n\t\t\tcase Item::NetheritePickaxe: return 608;\n\t\t\tcase Item::NetheriteScrap: return 585;\n\t\t\tcase Item::NetheriteShovel: return 607;\n\t\t\tcase Item::NetheriteSword: return 606;\n\t\t\tcase Item::Netherrack: return 218;\n\t\t\tcase Item::NoteBlock: return 84;\n\t\t\tcase Item::OakBoat: return 667;\n\t\t\tcase Item::OakButton: return 305;\n\t\t\tcase Item::OakDoor: return 558;\n\t\t\tcase Item::OakFence: return 208;\n\t\t\tcase Item::OakFenceGate: return 252;\n\t\t\tcase Item::OakLeaves: return 69;\n\t\t\tcase Item::OakLog: return 37;\n\t\t\tcase Item::OakPlanks: return 15;\n\t\t\tcase Item::OakPressurePlate: return 191;\n\t\t\tcase Item::OakSapling: return 23;\n\t\t\tcase Item::OakSign: return 652;\n\t\t\tcase Item::OakSlab: return 138;\n\t\t\tcase Item::OakStairs: return 179;\n\t\t\tcase Item::OakTrapdoor: return 226;\n\t\t\tcase Item::OakWood: return 61;\n\t\t\tcase Item::Observer: return 430;\n\t\t\tcase Item::Obsidian: return 170;\n\t\t\tcase Item::OcelotSpawnEgg: return 785;\n\t\t\tcase Item::OrangeBanner: return 870;\n\t\t\tcase Item::OrangeBed: return 717;\n\t\t\tcase Item::OrangeCarpet: return 351;\n\t\t\tcase Item::OrangeConcrete: return 465;\n\t\t\tcase Item::OrangeConcretePowder: return 481;\n\t\t\tcase Item::OrangeDye: return 707;\n\t\t\tcase Item::OrangeGlazedTerracotta: return 449;\n\t\t\tcase Item::OrangeShulkerBox: return 433;\n\t\t\tcase Item::OrangeStainedGlass: return 380;\n\t\t\tcase Item::OrangeStainedGlassPane: return 396;\n\t\t\tcase Item::OrangeTerracotta: return 332;\n\t\t\tcase Item::OrangeTulip: return 117;\n\t\t\tcase Item::OrangeWool: return 96;\n\t\t\tcase Item::OxeyeDaisy: return 120;\n\t\t\tcase Item::PackedIce: return 368;\n\t\t\tcase Item::Painting: return 649;\n\t\t\tcase Item::PandaSpawnEgg: return 786;\n\t\t\tcase Item::Paper: return 677;\n\t\t\tcase Item::ParrotSpawnEgg: return 787;\n\t\t\tcase Item::Peony: return 376;\n\t\t\tcase Item::PetrifiedOakSlab: return 150;\n\t\t\tcase Item::PhantomMembrane: return 922;\n\t\t\tcase Item::PhantomSpawnEgg: return 788;\n\t\t\tcase Item::PigSpawnEgg: return 789;\n\t\t\tcase Item::PiglinBannerPattern: return 933;\n\t\t\tcase Item::PiglinSpawnEgg: return 790;\n\t\t\tcase Item::PillagerSpawnEgg: return 791;\n\t\t\tcase Item::PinkBanner: return 875;\n\t\t\tcase Item::PinkBed: return 722;\n\t\t\tcase Item::PinkCarpet: return 356;\n\t\t\tcase Item::PinkConcrete: return 470;\n\t\t\tcase Item::PinkConcretePowder: return 486;\n\t\t\tcase Item::PinkDye: return 702;\n\t\t\tcase Item::PinkGlazedTerracotta: return 454;\n\t\t\tcase Item::PinkShulkerBox: return 438;\n\t\t\tcase Item::PinkStainedGlass: return 385;\n\t\t\tcase Item::PinkStainedGlassPane: return 401;\n\t\t\tcase Item::PinkTerracotta: return 337;\n\t\t\tcase Item::PinkTulip: return 119;\n\t\t\tcase Item::PinkWool: return 101;\n\t\t\tcase Item::Piston: return 94;\n\t\t\tcase Item::PlayerHead: return 837;\n\t\t\tcase Item::Podzol: return 11;\n\t\t\tcase Item::PoisonousPotato: return 832;\n\t\t\tcase Item::PolarBearSpawnEgg: return 792;\n\t\t\tcase Item::PolishedAndesite: return 7;\n\t\t\tcase Item::PolishedAndesiteSlab: return 554;\n\t\t\tcase Item::PolishedAndesiteStairs: return 541;\n\t\t\tcase Item::PolishedBasalt: return 222;\n\t\t\tcase Item::PolishedBlackstone: return 966;\n\t\t\tcase Item::PolishedBlackstoneBrickSlab: return 971;\n\t\t\tcase Item::PolishedBlackstoneBrickStairs: return 972;\n\t\t\tcase Item::PolishedBlackstoneBrickWall: return 303;\n\t\t\tcase Item::PolishedBlackstoneBricks: return 970;\n\t\t\tcase Item::PolishedBlackstoneButton: return 313;\n\t\t\tcase Item::PolishedBlackstonePressurePlate: return 199;\n\t\t\tcase Item::PolishedBlackstoneSlab: return 967;\n\t\t\tcase Item::PolishedBlackstoneStairs: return 968;\n\t\t\tcase Item::PolishedBlackstoneWall: return 302;\n\t\t\tcase Item::PolishedDiorite: return 5;\n\t\t\tcase Item::PolishedDioriteSlab: return 546;\n\t\t\tcase Item::PolishedDioriteStairs: return 532;\n\t\t\tcase Item::PolishedGranite: return 3;\n\t\t\tcase Item::PolishedGraniteSlab: return 543;\n\t\t\tcase Item::PolishedGraniteStairs: return 529;\n\t\t\tcase Item::PoppedChorusFruit: return 887;\n\t\t\tcase Item::Poppy: return 112;\n\t\t\tcase Item::Porkchop: return 647;\n\t\t\tcase Item::Potato: return 830;\n\t\t\tcase Item::Potion: return 749;\n\t\t\tcase Item::PoweredRail: return 85;\n\t\t\tcase Item::Prismarine: return 411;\n\t\t\tcase Item::PrismarineBrickSlab: return 160;\n\t\t\tcase Item::PrismarineBrickStairs: return 415;\n\t\t\tcase Item::PrismarineBricks: return 412;\n\t\t\tcase Item::PrismarineCrystals: return 853;\n\t\t\tcase Item::PrismarineShard: return 852;\n\t\t\tcase Item::PrismarineSlab: return 159;\n\t\t\tcase Item::PrismarineStairs: return 414;\n\t\t\tcase Item::PrismarineWall: return 290;\n\t\t\tcase Item::Pufferfish: return 690;\n\t\t\tcase Item::PufferfishBucket: return 670;\n\t\t\tcase Item::PufferfishSpawnEgg: return 793;\n\t\t\tcase Item::Pumpkin: return 216;\n\t\t\tcase Item::PumpkinPie: return 844;\n\t\t\tcase Item::PumpkinSeeds: return 737;\n\t\t\tcase Item::PurpleBanner: return 879;\n\t\t\tcase Item::PurpleBed: return 726;\n\t\t\tcase Item::PurpleCarpet: return 360;\n\t\t\tcase Item::PurpleConcrete: return 474;\n\t\t\tcase Item::PurpleConcretePowder: return 490;\n\t\t\tcase Item::PurpleDye: return 698;\n\t\t\tcase Item::PurpleGlazedTerracotta: return 458;\n\t\t\tcase Item::PurpleShulkerBox: return 442;\n\t\t\tcase Item::PurpleStainedGlass: return 389;\n\t\t\tcase Item::PurpleStainedGlassPane: return 405;\n\t\t\tcase Item::PurpleTerracotta: return 341;\n\t\t\tcase Item::PurpleWool: return 105;\n\t\t\tcase Item::PurpurBlock: return 175;\n\t\t\tcase Item::PurpurPillar: return 176;\n\t\t\tcase Item::PurpurSlab: return 158;\n\t\t\tcase Item::PurpurStairs: return 177;\n\t\t\tcase Item::Quartz: return 849;\n\t\t\tcase Item::QuartzBlock: return 325;\n\t\t\tcase Item::QuartzBricks: return 326;\n\t\t\tcase Item::QuartzPillar: return 327;\n\t\t\tcase Item::QuartzSlab: return 155;\n\t\t\tcase Item::QuartzStairs: return 328;\n\t\t\tcase Item::Rabbit: return 854;\n\t\t\tcase Item::RabbitFoot: return 857;\n\t\t\tcase Item::RabbitHide: return 858;\n\t\t\tcase Item::RabbitSpawnEgg: return 794;\n\t\t\tcase Item::RabbitStew: return 856;\n\t\t\tcase Item::Rail: return 187;\n\t\t\tcase Item::RavagerSpawnEgg: return 795;\n\t\t\tcase Item::RedBanner: return 883;\n\t\t\tcase Item::RedBed: return 730;\n\t\t\tcase Item::RedCarpet: return 364;\n\t\t\tcase Item::RedConcrete: return 478;\n\t\t\tcase Item::RedConcretePowder: return 494;\n\t\t\tcase Item::RedDye: return 694;\n\t\t\tcase Item::RedGlazedTerracotta: return 462;\n\t\t\tcase Item::RedMushroom: return 125;\n\t\t\tcase Item::RedMushroomBlock: return 245;\n\t\t\tcase Item::RedNetherBrickSlab: return 553;\n\t\t\tcase Item::RedNetherBrickStairs: return 540;\n\t\t\tcase Item::RedNetherBrickWall: return 297;\n\t\t\tcase Item::RedNetherBricks: return 427;\n\t\t\tcase Item::RedSand: return 31;\n\t\t\tcase Item::RedSandstone: return 418;\n\t\t\tcase Item::RedSandstoneSlab: return 156;\n\t\t\tcase Item::RedSandstoneStairs: return 421;\n\t\t\tcase Item::RedSandstoneWall: return 291;\n\t\t\tcase Item::RedShulkerBox: return 446;\n\t\t\tcase Item::RedStainedGlass: return 393;\n\t\t\tcase Item::RedStainedGlassPane: return 409;\n\t\t\tcase Item::RedTerracotta: return 345;\n\t\t\tcase Item::RedTulip: return 116;\n\t\t\tcase Item::RedWool: return 109;\n\t\t\tcase Item::Redstone: return 665;\n\t\t\tcase Item::RedstoneBlock: return 321;\n\t\t\tcase Item::RedstoneLamp: return 274;\n\t\t\tcase Item::RedstoneOre: return 200;\n\t\t\tcase Item::RedstoneTorch: return 201;\n\t\t\tcase Item::Repeater: return 566;\n\t\t\tcase Item::RepeatingCommandBlock: return 422;\n\t\t\tcase Item::RespawnAnchor: return 974;\n\t\t\tcase Item::RoseBush: return 375;\n\t\t\tcase Item::RottenFlesh: return 743;\n\t\t\tcase Item::Saddle: return 664;\n\t\t\tcase Item::Salmon: return 688;\n\t\t\tcase Item::SalmonBucket: return 671;\n\t\t\tcase Item::SalmonSpawnEgg: return 796;\n\t\t\tcase Item::Sand: return 30;\n\t\t\tcase Item::Sandstone: return 81;\n\t\t\tcase Item::SandstoneSlab: return 148;\n\t\t\tcase Item::SandstoneStairs: return 275;\n\t\t\tcase Item::SandstoneWall: return 298;\n\t\t\tcase Item::Scaffolding: return 556;\n\t\t\tcase Item::Scute: return 571;\n\t\t\tcase Item::SeaLantern: return 417;\n\t\t\tcase Item::SeaPickle: return 93;\n\t\t\tcase Item::Seagrass: return 92;\n\t\t\tcase Item::Shears: return 734;\n\t\t\tcase Item::SheepSpawnEgg: return 797;\n\t\t\tcase Item::Shield: return 896;\n\t\t\tcase Item::Shroomlight: return 950;\n\t\t\tcase Item::ShulkerBox: return 431;\n\t\t\tcase Item::ShulkerShell: return 904;\n\t\t\tcase Item::ShulkerSpawnEgg: return 798;\n\t\t\tcase Item::SilverfishSpawnEgg: return 799;\n\t\t\tcase Item::SkeletonHorseSpawnEgg: return 801;\n\t\t\tcase Item::SkeletonSkull: return 835;\n\t\t\tcase Item::SkeletonSpawnEgg: return 800;\n\t\t\tcase Item::SkullBannerPattern: return 930;\n\t\t\tcase Item::SlimeBall: return 679;\n\t\t\tcase Item::SlimeBlock: return 371;\n\t\t\tcase Item::SlimeSpawnEgg: return 802;\n\t\t\tcase Item::SmithingTable: return 942;\n\t\t\tcase Item::Smoker: return 936;\n\t\t\tcase Item::SmoothQuartz: return 162;\n\t\t\tcase Item::SmoothQuartzSlab: return 550;\n\t\t\tcase Item::SmoothQuartzStairs: return 537;\n\t\t\tcase Item::SmoothRedSandstone: return 163;\n\t\t\tcase Item::SmoothRedSandstoneSlab: return 544;\n\t\t\tcase Item::SmoothRedSandstoneStairs: return 530;\n\t\t\tcase Item::SmoothSandstone: return 164;\n\t\t\tcase Item::SmoothSandstoneSlab: return 549;\n\t\t\tcase Item::SmoothSandstoneStairs: return 536;\n\t\t\tcase Item::SmoothStone: return 165;\n\t\t\tcase Item::SmoothStoneSlab: return 147;\n\t\t\tcase Item::Snow: return 202;\n\t\t\tcase Item::SnowBlock: return 204;\n\t\t\tcase Item::Snowball: return 666;\n\t\t\tcase Item::SoulCampfire: return 949;\n\t\t\tcase Item::SoulLantern: return 946;\n\t\t\tcase Item::SoulSand: return 219;\n\t\t\tcase Item::SoulSoil: return 220;\n\t\t\tcase Item::SoulTorch: return 223;\n\t\t\tcase Item::Spawner: return 178;\n\t\t\tcase Item::SpectralArrow: return 893;\n\t\t\tcase Item::SpiderEye: return 751;\n\t\t\tcase Item::SpiderSpawnEgg: return 803;\n\t\t\tcase Item::SplashPotion: return 892;\n\t\t\tcase Item::Sponge: return 75;\n\t\t\tcase Item::SpruceBoat: return 898;\n\t\t\tcase Item::SpruceButton: return 306;\n\t\t\tcase Item::SpruceDoor: return 559;\n\t\t\tcase Item::SpruceFence: return 209;\n\t\t\tcase Item::SpruceFenceGate: return 253;\n\t\t\tcase Item::SpruceLeaves: return 70;\n\t\t\tcase Item::SpruceLog: return 38;\n\t\t\tcase Item::SprucePlanks: return 16;\n\t\t\tcase Item::SprucePressurePlate: return 192;\n\t\t\tcase Item::SpruceSapling: return 24;\n\t\t\tcase Item::SpruceSign: return 653;\n\t\t\tcase Item::SpruceSlab: return 139;\n\t\t\tcase Item::SpruceStairs: return 280;\n\t\t\tcase Item::SpruceTrapdoor: return 227;\n\t\t\tcase Item::SpruceWood: return 62;\n\t\t\tcase Item::SquidSpawnEgg: return 804;\n\t\t\tcase Item::Stick: return 599;\n\t\t\tcase Item::StickyPiston: return 87;\n\t\t\tcase Item::Stone: return 1;\n\t\t\tcase Item::StoneAxe: return 594;\n\t\t\tcase Item::StoneBrickSlab: return 153;\n\t\t\tcase Item::StoneBrickStairs: return 261;\n\t\t\tcase Item::StoneBrickWall: return 294;\n\t\t\tcase Item::StoneBricks: return 240;\n\t\t\tcase Item::StoneButton: return 304;\n\t\t\tcase Item::StoneHoe: return 614;\n\t\t\tcase Item::StonePickaxe: return 593;\n\t\t\tcase Item::StonePressurePlate: return 190;\n\t\t\tcase Item::StoneShovel: return 592;\n\t\t\tcase Item::StoneSlab: return 146;\n\t\t\tcase Item::StoneStairs: return 535;\n\t\t\tcase Item::StoneSword: return 591;\n\t\t\tcase Item::Stonecutter: return 943;\n\t\t\tcase Item::StraySpawnEgg: return 805;\n\t\t\tcase Item::StriderSpawnEgg: return 806;\n\t\t\tcase Item::String: return 610;\n\t\t\tcase Item::StrippedAcaciaLog: return 49;\n\t\t\tcase Item::StrippedAcaciaWood: return 57;\n\t\t\tcase Item::StrippedBirchLog: return 47;\n\t\t\tcase Item::StrippedBirchWood: return 55;\n\t\t\tcase Item::StrippedCrimsonHyphae: return 59;\n\t\t\tcase Item::StrippedCrimsonStem: return 51;\n\t\t\tcase Item::StrippedDarkOakLog: return 50;\n\t\t\tcase Item::StrippedDarkOakWood: return 58;\n\t\t\tcase Item::StrippedJungleLog: return 48;\n\t\t\tcase Item::StrippedJungleWood: return 56;\n\t\t\tcase Item::StrippedOakLog: return 45;\n\t\t\tcase Item::StrippedOakWood: return 53;\n\t\t\tcase Item::StrippedSpruceLog: return 46;\n\t\t\tcase Item::StrippedSpruceWood: return 54;\n\t\t\tcase Item::StrippedWarpedHyphae: return 60;\n\t\t\tcase Item::StrippedWarpedStem: return 52;\n\t\t\tcase Item::StructureBlock: return 568;\n\t\t\tcase Item::StructureVoid: return 429;\n\t\t\tcase Item::Sugar: return 714;\n\t\t\tcase Item::SugarCane: return 133;\n\t\t\tcase Item::Sunflower: return 373;\n\t\t\tcase Item::SuspiciousStew: return 926;\n\t\t\tcase Item::SweetBerries: return 947;\n\t\t\tcase Item::TallGrass: return 377;\n\t\t\tcase Item::Target: return 960;\n\t\t\tcase Item::Terracotta: return 366;\n\t\t\tcase Item::TippedArrow: return 894;\n\t\t\tcase Item::TNT: return 167;\n\t\t\tcase Item::TNTMinecart: return 850;\n\t\t\tcase Item::Torch: return 171;\n\t\t\tcase Item::TotemOfUndying: return 903;\n\t\t\tcase Item::TraderLlamaSpawnEgg: return 807;\n\t\t\tcase Item::TrappedChest: return 317;\n\t\t\tcase Item::Trident: return 921;\n\t\t\tcase Item::TripwireHook: return 278;\n\t\t\tcase Item::TropicalFish: return 689;\n\t\t\tcase Item::TropicalFishBucket: return 673;\n\t\t\tcase Item::TropicalFishSpawnEgg: return 808;\n\t\t\tcase Item::TubeCoral: return 507;\n\t\t\tcase Item::TubeCoralBlock: return 502;\n\t\t\tcase Item::TubeCoralFan: return 517;\n\t\t\tcase Item::TurtleEgg: return 496;\n\t\t\tcase Item::TurtleHelmet: return 570;\n\t\t\tcase Item::TurtleSpawnEgg: return 809;\n\t\t\tcase Item::TwistingVines: return 132;\n\t\t\tcase Item::VexSpawnEgg: return 810;\n\t\t\tcase Item::VillagerSpawnEgg: return 811;\n\t\t\tcase Item::VindicatorSpawnEgg: return 812;\n\t\t\tcase Item::Vine: return 251;\n\t\t\tcase Item::WanderingTraderSpawnEgg: return 813;\n\t\t\tcase Item::WarpedButton: return 312;\n\t\t\tcase Item::WarpedDoor: return 565;\n\t\t\tcase Item::WarpedFence: return 215;\n\t\t\tcase Item::WarpedFenceGate: return 259;\n\t\t\tcase Item::WarpedFungus: return 127;\n\t\t\tcase Item::WarpedFungusOnA_stick: return 842;\n\t\t\tcase Item::WarpedHyphae: return 68;\n\t\t\tcase Item::WarpedNylium: return 13;\n\t\t\tcase Item::WarpedPlanks: return 22;\n\t\t\tcase Item::WarpedPressurePlate: return 198;\n\t\t\tcase Item::WarpedRoots: return 129;\n\t\t\tcase Item::WarpedSign: return 659;\n\t\t\tcase Item::WarpedSlab: return 145;\n\t\t\tcase Item::WarpedStairs: return 284;\n\t\t\tcase Item::WarpedStem: return 44;\n\t\t\tcase Item::WarpedTrapdoor: return 233;\n\t\t\tcase Item::WarpedWartBlock: return 426;\n\t\t\tcase Item::WaterBucket: return 661;\n\t\t\tcase Item::WeepingVines: return 131;\n\t\t\tcase Item::WetSponge: return 76;\n\t\t\tcase Item::Wheat: return 620;\n\t\t\tcase Item::WheatSeeds: return 619;\n\t\t\tcase Item::WhiteBanner: return 869;\n\t\t\tcase Item::WhiteBed: return 716;\n\t\t\tcase Item::WhiteCarpet: return 350;\n\t\t\tcase Item::WhiteConcrete: return 464;\n\t\t\tcase Item::WhiteConcretePowder: return 480;\n\t\t\tcase Item::WhiteDye: return 712;\n\t\t\tcase Item::WhiteGlazedTerracotta: return 448;\n\t\t\tcase Item::WhiteShulkerBox: return 432;\n\t\t\tcase Item::WhiteStainedGlass: return 379;\n\t\t\tcase Item::WhiteStainedGlassPane: return 395;\n\t\t\tcase Item::WhiteTerracotta: return 331;\n\t\t\tcase Item::WhiteTulip: return 118;\n\t\t\tcase Item::WhiteWool: return 95;\n\t\t\tcase Item::WitchSpawnEgg: return 814;\n\t\t\tcase Item::WitherRose: return 123;\n\t\t\tcase Item::WitherSkeletonSkull: return 836;\n\t\t\tcase Item::WitherSkeletonSpawnEgg: return 815;\n\t\t\tcase Item::WolfSpawnEgg: return 816;\n\t\t\tcase Item::WoodenAxe: return 590;\n\t\t\tcase Item::WoodenHoe: return 613;\n\t\t\tcase Item::WoodenPickaxe: return 589;\n\t\t\tcase Item::WoodenShovel: return 588;\n\t\t\tcase Item::WoodenSword: return 587;\n\t\t\tcase Item::WritableBook: return 824;\n\t\t\tcase Item::WrittenBook: return 825;\n\t\t\tcase Item::YellowBanner: return 873;\n\t\t\tcase Item::YellowBed: return 720;\n\t\t\tcase Item::YellowCarpet: return 354;\n\t\t\tcase Item::YellowConcrete: return 468;\n\t\t\tcase Item::YellowConcretePowder: return 484;\n\t\t\tcase Item::YellowDye: return 704;\n\t\t\tcase Item::YellowGlazedTerracotta: return 452;\n\t\t\tcase Item::YellowShulkerBox: return 436;\n\t\t\tcase Item::YellowStainedGlass: return 383;\n\t\t\tcase Item::YellowStainedGlassPane: return 399;\n\t\t\tcase Item::YellowTerracotta: return 335;\n\t\t\tcase Item::YellowWool: return 99;\n\t\t\tcase Item::ZoglinSpawnEgg: return 817;\n\t\t\tcase Item::ZombieHead: return 838;\n\t\t\tcase Item::ZombieHorseSpawnEgg: return 819;\n\t\t\tcase Item::ZombieSpawnEgg: return 818;\n\t\t\tcase Item::ZombieVillagerSpawnEgg: return 820;\n\t\t\tcase Item::ZombiePigmanSpawnEgg: return 821;\n\t\t}\n\t\tUNREACHABLE(\"Invalid item\");\n\t}\n\n\tUInt32 From(const CustomStatistic ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase CustomStatistic::AnimalsBred: return 31;\n\t\t\tcase CustomStatistic::AviateOneCm: return 17;\n\t\t\tcase CustomStatistic::BellRing: return 67;\n\t\t\tcase CustomStatistic::BoatOneCm: return 14;\n\t\t\tcase CustomStatistic::CleanArmor: return 39;\n\t\t\tcase CustomStatistic::CleanBanner: return 40;\n\t\t\tcase CustomStatistic::CleanShulkerBox: return 41;\n\t\t\tcase CustomStatistic::ClimbOneCm: return 10;\n\t\t\tcase CustomStatistic::CrouchOneCm: return 6;\n\t\t\tcase CustomStatistic::DamageAbsorbed: return 27;\n\t\t\tcase CustomStatistic::DamageBlockedByShield: return 26;\n\t\t\tcase CustomStatistic::DamageDealt: return 22;\n\t\t\tcase CustomStatistic::DamageDealtAbsorbed: return 23;\n\t\t\tcase CustomStatistic::DamageDealtResisted: return 24;\n\t\t\tcase CustomStatistic::DamageResisted: return 28;\n\t\t\tcase CustomStatistic::DamageTaken: return 25;\n\t\t\tcase CustomStatistic::Deaths: return 29;\n\t\t\tcase CustomStatistic::Drop: return 21;\n\t\t\tcase CustomStatistic::EatCakeSlice: return 36;\n\t\t\tcase CustomStatistic::EnchantItem: return 52;\n\t\t\tcase CustomStatistic::FallOneCm: return 9;\n\t\t\tcase CustomStatistic::FillCauldron: return 37;\n\t\t\tcase CustomStatistic::FishCaught: return 33;\n\t\t\tcase CustomStatistic::FlyOneCm: return 11;\n\t\t\tcase CustomStatistic::HorseOneCm: return 16;\n\t\t\tcase CustomStatistic::InspectDispenser: return 46;\n\t\t\tcase CustomStatistic::InspectDropper: return 44;\n\t\t\tcase CustomStatistic::InspectHopper: return 45;\n\t\t\tcase CustomStatistic::InteractWithAnvil: return 70;\n\t\t\tcase CustomStatistic::InteractWithBeacon: return 43;\n\t\t\tcase CustomStatistic::InteractWithBlastFurnace: return 60;\n\t\t\tcase CustomStatistic::InteractWithBrewingstand: return 42;\n\t\t\tcase CustomStatistic::InteractWithCampfire: return 63;\n\t\t\tcase CustomStatistic::InteractWithCartographyTable: return 64;\n\t\t\tcase CustomStatistic::InteractWithCraftingTable: return 55;\n\t\t\tcase CustomStatistic::InteractWithFurnace: return 54;\n\t\t\tcase CustomStatistic::InteractWithGrindstone: return 71;\n\t\t\tcase CustomStatistic::InteractWithLectern: return 62;\n\t\t\tcase CustomStatistic::InteractWithLoom: return 65;\n\t\t\tcase CustomStatistic::InteractWithSmithingTable: return 73;\n\t\t\tcase CustomStatistic::InteractWithSmoker: return 61;\n\t\t\tcase CustomStatistic::InteractWithStonecutter: return 66;\n\t\t\tcase CustomStatistic::Jump: return 20;\n\t\t\tcase CustomStatistic::LeaveGame: return -0;\n\t\t\tcase CustomStatistic::MinecartOneCm: return 13;\n\t\t\tcase CustomStatistic::MobKills: return 30;\n\t\t\tcase CustomStatistic::OpenBarrel: return 59;\n\t\t\tcase CustomStatistic::OpenChest: return 56;\n\t\t\tcase CustomStatistic::OpenEnderchest: return 51;\n\t\t\tcase CustomStatistic::OpenShulkerBox: return 58;\n\t\t\tcase CustomStatistic::PigOneCm: return 15;\n\t\t\tcase CustomStatistic::PlayNoteblock: return 47;\n\t\t\tcase CustomStatistic::PlayOneMinute: return 1;\n\t\t\tcase CustomStatistic::PlayRecord: return 53;\n\t\t\tcase CustomStatistic::PlayerKills: return 32;\n\t\t\tcase CustomStatistic::PotFlower: return 49;\n\t\t\tcase CustomStatistic::RaidTrigger: return 68;\n\t\t\tcase CustomStatistic::RaidWin: return 69;\n\t\t\tcase CustomStatistic::SleepInBed: return 57;\n\t\t\tcase CustomStatistic::SneakTime: return 4;\n\t\t\tcase CustomStatistic::SprintOneCm: return 7;\n\t\t\tcase CustomStatistic::StriderOneCm: return 19;\n\t\t\tcase CustomStatistic::SwimOneCm: return 18;\n\t\t\tcase CustomStatistic::TalkedToVillager: return 34;\n\t\t\tcase CustomStatistic::TargetHit: return 72;\n\t\t\tcase CustomStatistic::TimeSinceDeath: return 2;\n\t\t\tcase CustomStatistic::TimeSinceRest: return 3;\n\t\t\tcase CustomStatistic::TradedWithVillager: return 35;\n\t\t\tcase CustomStatistic::TriggerTrappedChest: return 50;\n\t\t\tcase CustomStatistic::TuneNoteblock: return 48;\n\t\t\tcase CustomStatistic::UseCauldron: return 38;\n\t\t\tcase CustomStatistic::WalkOnWaterOneCm: return 8;\n\t\t\tcase CustomStatistic::WalkOneCm: return 5;\n\t\t\tcase CustomStatistic::WalkUnderWaterOneCm: return 12;\n\t\t\tdefault: return UInt32(-1);\n\t\t}\n\t}\n\n\tItem ToItem(const UInt32 ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase 901: return Item::AcaciaBoat;\n\t\t\tcase 309: return Item::AcaciaButton;\n\t\t\tcase 562: return Item::AcaciaDoor;\n\t\t\tcase 212: return Item::AcaciaFence;\n\t\t\tcase 256: return Item::AcaciaFenceGate;\n\t\t\tcase 73: return Item::AcaciaLeaves;\n\t\t\tcase 41: return Item::AcaciaLog;\n\t\t\tcase 19: return Item::AcaciaPlanks;\n\t\t\tcase 195: return Item::AcaciaPressurePlate;\n\t\t\tcase 27: return Item::AcaciaSapling;\n\t\t\tcase 656: return Item::AcaciaSign;\n\t\t\tcase 142: return Item::AcaciaSlab;\n\t\t\tcase 369: return Item::AcaciaStairs;\n\t\t\tcase 230: return Item::AcaciaTrapdoor;\n\t\t\tcase 65: return Item::AcaciaWood;\n\t\t\tcase 329: return Item::ActivatorRail;\n\t\t\tcase -0: return Item::Air;\n\t\t\tcase 114: return Item::Allium;\n\t\t\tcase 959: return Item::AncientDebris;\n\t\t\tcase 6: return Item::Andesite;\n\t\t\tcase 552: return Item::AndesiteSlab;\n\t\t\tcase 539: return Item::AndesiteStairs;\n\t\t\tcase 296: return Item::AndesiteWall;\n\t\t\tcase 314: return Item::Anvil;\n\t\t\tcase 576: return Item::Apple;\n\t\t\tcase 859: return Item::ArmorStand;\n\t\t\tcase 578: return Item::Arrow;\n\t\t\tcase 115: return Item::AzureBluet;\n\t\t\tcase 831: return Item::BakedPotato;\n\t\t\tcase 135: return Item::Bamboo;\n\t\t\tcase 935: return Item::Barrel;\n\t\t\tcase 347: return Item::Barrier;\n\t\t\tcase 221: return Item::Basalt;\n\t\t\tcase 759: return Item::BatSpawnEgg;\n\t\t\tcase 286: return Item::Beacon;\n\t\t\tcase 29: return Item::Bedrock;\n\t\t\tcase 952: return Item::BeeNest;\n\t\t\tcase 760: return Item::BeeSpawnEgg;\n\t\t\tcase 739: return Item::Beef;\n\t\t\tcase 953: return Item::Beehive;\n\t\t\tcase 888: return Item::Beetroot;\n\t\t\tcase 889: return Item::BeetrootSeeds;\n\t\t\tcase 890: return Item::BeetrootSoup;\n\t\t\tcase 944: return Item::Bell;\n\t\t\tcase 899: return Item::BirchBoat;\n\t\t\tcase 307: return Item::BirchButton;\n\t\t\tcase 560: return Item::BirchDoor;\n\t\t\tcase 210: return Item::BirchFence;\n\t\t\tcase 254: return Item::BirchFenceGate;\n\t\t\tcase 71: return Item::BirchLeaves;\n\t\t\tcase 39: return Item::BirchLog;\n\t\t\tcase 17: return Item::BirchPlanks;\n\t\t\tcase 193: return Item::BirchPressurePlate;\n\t\t\tcase 25: return Item::BirchSapling;\n\t\t\tcase 654: return Item::BirchSign;\n\t\t\tcase 140: return Item::BirchSlab;\n\t\t\tcase 281: return Item::BirchStairs;\n\t\t\tcase 228: return Item::BirchTrapdoor;\n\t\t\tcase 63: return Item::BirchWood;\n\t\t\tcase 884: return Item::BlackBanner;\n\t\t\tcase 731: return Item::BlackBed;\n\t\t\tcase 365: return Item::BlackCarpet;\n\t\t\tcase 479: return Item::BlackConcrete;\n\t\t\tcase 495: return Item::BlackConcretePowder;\n\t\t\tcase 711: return Item::BlackDye;\n\t\t\tcase 463: return Item::BlackGlazedTerracotta;\n\t\t\tcase 447: return Item::BlackShulkerBox;\n\t\t\tcase 394: return Item::BlackStainedGlass;\n\t\t\tcase 410: return Item::BlackStainedGlassPane;\n\t\t\tcase 346: return Item::BlackTerracotta;\n\t\t\tcase 110: return Item::BlackWool;\n\t\t\tcase 962: return Item::Blackstone;\n\t\t\tcase 963: return Item::BlackstoneSlab;\n\t\t\tcase 964: return Item::BlackstoneStairs;\n\t\t\tcase 301: return Item::BlackstoneWall;\n\t\t\tcase 937: return Item::BlastFurnace;\n\t\t\tcase 753: return Item::BlazePowder;\n\t\t\tcase 745: return Item::BlazeRod;\n\t\t\tcase 761: return Item::BlazeSpawnEgg;\n\t\t\tcase 880: return Item::BlueBanner;\n\t\t\tcase 727: return Item::BlueBed;\n\t\t\tcase 361: return Item::BlueCarpet;\n\t\t\tcase 475: return Item::BlueConcrete;\n\t\t\tcase 491: return Item::BlueConcretePowder;\n\t\t\tcase 709: return Item::BlueDye;\n\t\t\tcase 459: return Item::BlueGlazedTerracotta;\n\t\t\tcase 527: return Item::BlueIce;\n\t\t\tcase 113: return Item::BlueOrchid;\n\t\t\tcase 443: return Item::BlueShulkerBox;\n\t\t\tcase 390: return Item::BlueStainedGlass;\n\t\t\tcase 406: return Item::BlueStainedGlassPane;\n\t\t\tcase 342: return Item::BlueTerracotta;\n\t\t\tcase 106: return Item::BlueWool;\n\t\t\tcase 713: return Item::Bone;\n\t\t\tcase 428: return Item::BoneBlock;\n\t\t\tcase 708: return Item::BoneMeal;\n\t\t\tcase 678: return Item::Book;\n\t\t\tcase 168: return Item::Bookshelf;\n\t\t\tcase 577: return Item::Bow;\n\t\t\tcase 600: return Item::Bowl;\n\t\t\tcase 508: return Item::BrainCoral;\n\t\t\tcase 503: return Item::BrainCoralBlock;\n\t\t\tcase 518: return Item::BrainCoralFan;\n\t\t\tcase 621: return Item::Bread;\n\t\t\tcase 755: return Item::BrewingStand;\n\t\t\tcase 674: return Item::Brick;\n\t\t\tcase 152: return Item::BrickSlab;\n\t\t\tcase 260: return Item::BrickStairs;\n\t\t\tcase 289: return Item::BrickWall;\n\t\t\tcase 166: return Item::Bricks;\n\t\t\tcase 881: return Item::BrownBanner;\n\t\t\tcase 728: return Item::BrownBed;\n\t\t\tcase 362: return Item::BrownCarpet;\n\t\t\tcase 476: return Item::BrownConcrete;\n\t\t\tcase 492: return Item::BrownConcretePowder;\n\t\t\tcase 710: return Item::BrownDye;\n\t\t\tcase 460: return Item::BrownGlazedTerracotta;\n\t\t\tcase 124: return Item::BrownMushroom;\n\t\t\tcase 244: return Item::BrownMushroomBlock;\n\t\t\tcase 444: return Item::BrownShulkerBox;\n\t\t\tcase 391: return Item::BrownStainedGlass;\n\t\t\tcase 407: return Item::BrownStainedGlassPane;\n\t\t\tcase 343: return Item::BrownTerracotta;\n\t\t\tcase 107: return Item::BrownWool;\n\t\t\tcase 509: return Item::BubbleCoral;\n\t\t\tcase 504: return Item::BubbleCoralBlock;\n\t\t\tcase 519: return Item::BubbleCoralFan;\n\t\t\tcase 660: return Item::Bucket;\n\t\t\tcase 205: return Item::Cactus;\n\t\t\tcase 715: return Item::Cake;\n\t\t\tcase 948: return Item::Campfire;\n\t\t\tcase 829: return Item::Carrot;\n\t\t\tcase 841: return Item::CarrotOnAStick;\n\t\t\tcase 938: return Item::CartographyTable;\n\t\t\tcase 217: return Item::CarvedPumpkin;\n\t\t\tcase 762: return Item::CatSpawnEgg;\n\t\t\tcase 756: return Item::Cauldron;\n\t\t\tcase 763: return Item::CaveSpiderSpawnEgg;\n\t\t\tcase 248: return Item::Chain;\n\t\t\tcase 423: return Item::ChainCommandBlock;\n\t\t\tcase 629: return Item::ChainmailBoots;\n\t\t\tcase 627: return Item::ChainmailChestplate;\n\t\t\tcase 626: return Item::ChainmailHelmet;\n\t\t\tcase 628: return Item::ChainmailLeggings;\n\t\t\tcase 580: return Item::Charcoal;\n\t\t\tcase 180: return Item::Chest;\n\t\t\tcase 680: return Item::ChestMinecart;\n\t\t\tcase 741: return Item::Chicken;\n\t\t\tcase 764: return Item::ChickenSpawnEgg;\n\t\t\tcase 315: return Item::ChippedAnvil;\n\t\t\tcase 266: return Item::ChiseledNetherBricks;\n\t\t\tcase 969: return Item::ChiseledPolishedBlackstone;\n\t\t\tcase 324: return Item::ChiseledQuartzBlock;\n\t\t\tcase 419: return Item::ChiseledRedSandstone;\n\t\t\tcase 82: return Item::ChiseledSandstone;\n\t\t\tcase 243: return Item::ChiseledStoneBricks;\n\t\t\tcase 174: return Item::ChorusFlower;\n\t\t\tcase 886: return Item::ChorusFruit;\n\t\t\tcase 173: return Item::ChorusPlant;\n\t\t\tcase 206: return Item::Clay;\n\t\t\tcase 675: return Item::ClayBall;\n\t\t\tcase 685: return Item::Clock;\n\t\t\tcase 579: return Item::Coal;\n\t\t\tcase 367: return Item::CoalBlock;\n\t\t\tcase 35: return Item::CoalOre;\n\t\t\tcase 10: return Item::CoarseDirt;\n\t\t\tcase 14: return Item::Cobblestone;\n\t\t\tcase 151: return Item::CobblestoneSlab;\n\t\t\tcase 188: return Item::CobblestoneStairs;\n\t\t\tcase 287: return Item::CobblestoneWall;\n\t\t\tcase 88: return Item::Cobweb;\n\t\t\tcase 696: return Item::CocoaBeans;\n\t\t\tcase 687: return Item::Cod;\n\t\t\tcase 672: return Item::CodBucket;\n\t\t\tcase 765: return Item::CodSpawnEgg;\n\t\t\tcase 285: return Item::CommandBlock;\n\t\t\tcase 866: return Item::CommandBlockMinecart;\n\t\t\tcase 567: return Item::Comparator;\n\t\t\tcase 683: return Item::Compass;\n\t\t\tcase 934: return Item::Composter;\n\t\t\tcase 528: return Item::Conduit;\n\t\t\tcase 740: return Item::CookedBeef;\n\t\t\tcase 742: return Item::CookedChicken;\n\t\t\tcase 691: return Item::CookedCod;\n\t\t\tcase 868: return Item::CookedMutton;\n\t\t\tcase 648: return Item::CookedPorkchop;\n\t\t\tcase 855: return Item::CookedRabbit;\n\t\t\tcase 692: return Item::CookedSalmon;\n\t\t\tcase 732: return Item::Cookie;\n\t\t\tcase 121: return Item::Cornflower;\n\t\t\tcase 766: return Item::CowSpawnEgg;\n\t\t\tcase 265: return Item::CrackedNetherBricks;\n\t\t\tcase 973: return Item::CrackedPolishedBlackstoneBricks;\n\t\t\tcase 242: return Item::CrackedStoneBricks;\n\t\t\tcase 183: return Item::CraftingTable;\n\t\t\tcase 929: return Item::CreeperBannerPattern;\n\t\t\tcase 839: return Item::CreeperHead;\n\t\t\tcase 767: return Item::CreeperSpawnEgg;\n\t\t\tcase 311: return Item::CrimsonButton;\n\t\t\tcase 564: return Item::CrimsonDoor;\n\t\t\tcase 214: return Item::CrimsonFence;\n\t\t\tcase 258: return Item::CrimsonFenceGate;\n\t\t\tcase 126: return Item::CrimsonFungus;\n\t\t\tcase 67: return Item::CrimsonHyphae;\n\t\t\tcase 12: return Item::CrimsonNylium;\n\t\t\tcase 21: return Item::CrimsonPlanks;\n\t\t\tcase 197: return Item::CrimsonPressurePlate;\n\t\t\tcase 128: return Item::CrimsonRoots;\n\t\t\tcase 658: return Item::CrimsonSign;\n\t\t\tcase 144: return Item::CrimsonSlab;\n\t\t\tcase 283: return Item::CrimsonStairs;\n\t\t\tcase 43: return Item::CrimsonStem;\n\t\t\tcase 232: return Item::CrimsonTrapdoor;\n\t\t\tcase 925: return Item::Crossbow;\n\t\t\tcase 961: return Item::CryingObsidian;\n\t\t\tcase 420: return Item::CutRedSandstone;\n\t\t\tcase 157: return Item::CutRedSandstoneSlab;\n\t\t\tcase 83: return Item::CutSandstone;\n\t\t\tcase 149: return Item::CutSandstoneSlab;\n\t\t\tcase 878: return Item::CyanBanner;\n\t\t\tcase 725: return Item::CyanBed;\n\t\t\tcase 359: return Item::CyanCarpet;\n\t\t\tcase 473: return Item::CyanConcrete;\n\t\t\tcase 489: return Item::CyanConcretePowder;\n\t\t\tcase 699: return Item::CyanDye;\n\t\t\tcase 457: return Item::CyanGlazedTerracotta;\n\t\t\tcase 441: return Item::CyanShulkerBox;\n\t\t\tcase 388: return Item::CyanStainedGlass;\n\t\t\tcase 404: return Item::CyanStainedGlassPane;\n\t\t\tcase 340: return Item::CyanTerracotta;\n\t\t\tcase 104: return Item::CyanWool;\n\t\t\tcase 316: return Item::DamagedAnvil;\n\t\t\tcase 111: return Item::Dandelion;\n\t\t\tcase 902: return Item::DarkOakBoat;\n\t\t\tcase 310: return Item::DarkOakButton;\n\t\t\tcase 563: return Item::DarkOakDoor;\n\t\t\tcase 213: return Item::DarkOakFence;\n\t\t\tcase 257: return Item::DarkOakFenceGate;\n\t\t\tcase 74: return Item::DarkOakLeaves;\n\t\t\tcase 42: return Item::DarkOakLog;\n\t\t\tcase 20: return Item::DarkOakPlanks;\n\t\t\tcase 196: return Item::DarkOakPressurePlate;\n\t\t\tcase 28: return Item::DarkOakSapling;\n\t\t\tcase 657: return Item::DarkOakSign;\n\t\t\tcase 143: return Item::DarkOakSlab;\n\t\t\tcase 370: return Item::DarkOakStairs;\n\t\t\tcase 231: return Item::DarkOakTrapdoor;\n\t\t\tcase 66: return Item::DarkOakWood;\n\t\t\tcase 413: return Item::DarkPrismarine;\n\t\t\tcase 161: return Item::DarkPrismarineSlab;\n\t\t\tcase 416: return Item::DarkPrismarineStairs;\n\t\t\tcase 320: return Item::DaylightDetector;\n\t\t\tcase 512: return Item::DeadBrainCoral;\n\t\t\tcase 498: return Item::DeadBrainCoralBlock;\n\t\t\tcase 523: return Item::DeadBrainCoralFan;\n\t\t\tcase 513: return Item::DeadBubbleCoral;\n\t\t\tcase 499: return Item::DeadBubbleCoralBlock;\n\t\t\tcase 524: return Item::DeadBubbleCoralFan;\n\t\t\tcase 91: return Item::DeadBush;\n\t\t\tcase 514: return Item::DeadFireCoral;\n\t\t\tcase 500: return Item::DeadFireCoralBlock;\n\t\t\tcase 525: return Item::DeadFireCoralFan;\n\t\t\tcase 515: return Item::DeadHornCoral;\n\t\t\tcase 501: return Item::DeadHornCoralBlock;\n\t\t\tcase 526: return Item::DeadHornCoralFan;\n\t\t\tcase 516: return Item::DeadTubeCoral;\n\t\t\tcase 497: return Item::DeadTubeCoralBlock;\n\t\t\tcase 522: return Item::DeadTubeCoralFan;\n\t\t\tcase 907: return Item::DebugStick;\n\t\t\tcase 86: return Item::DetectorRail;\n\t\t\tcase 581: return Item::Diamond;\n\t\t\tcase 598: return Item::DiamondAxe;\n\t\t\tcase 182: return Item::DiamondBlock;\n\t\t\tcase 637: return Item::DiamondBoots;\n\t\t\tcase 635: return Item::DiamondChestplate;\n\t\t\tcase 634: return Item::DiamondHelmet;\n\t\t\tcase 616: return Item::DiamondHoe;\n\t\t\tcase 862: return Item::DiamondHorseArmor;\n\t\t\tcase 636: return Item::DiamondLeggings;\n\t\t\tcase 181: return Item::DiamondOre;\n\t\t\tcase 597: return Item::DiamondPickaxe;\n\t\t\tcase 596: return Item::DiamondShovel;\n\t\t\tcase 595: return Item::DiamondSword;\n\t\t\tcase 4: return Item::Diorite;\n\t\t\tcase 555: return Item::DioriteSlab;\n\t\t\tcase 542: return Item::DioriteStairs;\n\t\t\tcase 300: return Item::DioriteWall;\n\t\t\tcase 9: return Item::Dirt;\n\t\t\tcase 80: return Item::Dispenser;\n\t\t\tcase 768: return Item::DolphinSpawnEgg;\n\t\t\tcase 769: return Item::DonkeySpawnEgg;\n\t\t\tcase 891: return Item::DragonBreath;\n\t\t\tcase 273: return Item::DragonEgg;\n\t\t\tcase 840: return Item::DragonHead;\n\t\t\tcase 736: return Item::DriedKelp;\n\t\t\tcase 676: return Item::DriedKelpBlock;\n\t\t\tcase 330: return Item::Dropper;\n\t\t\tcase 770: return Item::DrownedSpawnEgg;\n\t\t\tcase 682: return Item::Egg;\n\t\t\tcase 771: return Item::ElderGuardianSpawnEgg;\n\t\t\tcase 897: return Item::Elytra;\n\t\t\tcase 826: return Item::Emerald;\n\t\t\tcase 279: return Item::EmeraldBlock;\n\t\t\tcase 276: return Item::EmeraldOre;\n\t\t\tcase 847: return Item::EnchantedBook;\n\t\t\tcase 651: return Item::EnchantedGoldenApple;\n\t\t\tcase 269: return Item::EnchantingTable;\n\t\t\tcase 885: return Item::EndCrystal;\n\t\t\tcase 270: return Item::EndPortalFrame;\n\t\t\tcase 172: return Item::EndRod;\n\t\t\tcase 271: return Item::EndStone;\n\t\t\tcase 548: return Item::EndStoneBrickSlab;\n\t\t\tcase 534: return Item::EndStoneBrickStairs;\n\t\t\tcase 299: return Item::EndStoneBrickWall;\n\t\t\tcase 272: return Item::EndStoneBricks;\n\t\t\tcase 277: return Item::EnderChest;\n\t\t\tcase 757: return Item::EnderEye;\n\t\t\tcase 744: return Item::EnderPearl;\n\t\t\tcase 772: return Item::EndermanSpawnEgg;\n\t\t\tcase 773: return Item::EndermiteSpawnEgg;\n\t\t\tcase 774: return Item::EvokerSpawnEgg;\n\t\t\tcase 822: return Item::ExperienceBottle;\n\t\t\tcase 184: return Item::Farmland;\n\t\t\tcase 611: return Item::Feather;\n\t\t\tcase 752: return Item::FermentedSpiderEye;\n\t\t\tcase 90: return Item::Fern;\n\t\t\tcase 733: return Item::FilledMap;\n\t\t\tcase 823: return Item::FireCharge;\n\t\t\tcase 510: return Item::FireCoral;\n\t\t\tcase 505: return Item::FireCoralBlock;\n\t\t\tcase 520: return Item::FireCoralFan;\n\t\t\tcase 845: return Item::FireworkRocket;\n\t\t\tcase 846: return Item::FireworkStar;\n\t\t\tcase 684: return Item::FishingRod;\n\t\t\tcase 939: return Item::FletchingTable;\n\t\t\tcase 646: return Item::Flint;\n\t\t\tcase 575: return Item::FlintAndSteel;\n\t\t\tcase 928: return Item::FlowerBannerPattern;\n\t\t\tcase 828: return Item::FlowerPot;\n\t\t\tcase 775: return Item::FoxSpawnEgg;\n\t\t\tcase 185: return Item::Furnace;\n\t\t\tcase 681: return Item::FurnaceMinecart;\n\t\t\tcase 776: return Item::GhastSpawnEgg;\n\t\t\tcase 746: return Item::GhastTear;\n\t\t\tcase 965: return Item::GildedBlackstone;\n\t\t\tcase 77: return Item::Glass;\n\t\t\tcase 750: return Item::GlassBottle;\n\t\t\tcase 249: return Item::GlassPane;\n\t\t\tcase 758: return Item::GlisteringMelonSlice;\n\t\t\tcase 932: return Item::GlobeBannerPattern;\n\t\t\tcase 224: return Item::Glowstone;\n\t\t\tcase 686: return Item::GlowstoneDust;\n\t\t\tcase 136: return Item::GoldBlock;\n\t\t\tcase 583: return Item::GoldIngot;\n\t\t\tcase 747: return Item::GoldNugget;\n\t\t\tcase 33: return Item::GoldOre;\n\t\t\tcase 650: return Item::GoldenApple;\n\t\t\tcase 605: return Item::GoldenAxe;\n\t\t\tcase 641: return Item::GoldenBoots;\n\t\t\tcase 834: return Item::GoldenCarrot;\n\t\t\tcase 639: return Item::GoldenChestplate;\n\t\t\tcase 638: return Item::GoldenHelmet;\n\t\t\tcase 617: return Item::GoldenHoe;\n\t\t\tcase 861: return Item::GoldenHorseArmor;\n\t\t\tcase 640: return Item::GoldenLeggings;\n\t\t\tcase 604: return Item::GoldenPickaxe;\n\t\t\tcase 603: return Item::GoldenShovel;\n\t\t\tcase 602: return Item::GoldenSword;\n\t\t\tcase 2: return Item::Granite;\n\t\t\tcase 551: return Item::GraniteSlab;\n\t\t\tcase 538: return Item::GraniteStairs;\n\t\t\tcase 293: return Item::GraniteWall;\n\t\t\tcase 89: return Item::Grass;\n\t\t\tcase 8: return Item::GrassBlock;\n\t\t\tcase 372: return Item::GrassPath;\n\t\t\tcase 32: return Item::Gravel;\n\t\t\tcase 876: return Item::GrayBanner;\n\t\t\tcase 723: return Item::GrayBed;\n\t\t\tcase 357: return Item::GrayCarpet;\n\t\t\tcase 471: return Item::GrayConcrete;\n\t\t\tcase 487: return Item::GrayConcretePowder;\n\t\t\tcase 701: return Item::GrayDye;\n\t\t\tcase 455: return Item::GrayGlazedTerracotta;\n\t\t\tcase 439: return Item::GrayShulkerBox;\n\t\t\tcase 386: return Item::GrayStainedGlass;\n\t\t\tcase 402: return Item::GrayStainedGlassPane;\n\t\t\tcase 338: return Item::GrayTerracotta;\n\t\t\tcase 102: return Item::GrayWool;\n\t\t\tcase 882: return Item::GreenBanner;\n\t\t\tcase 729: return Item::GreenBed;\n\t\t\tcase 363: return Item::GreenCarpet;\n\t\t\tcase 477: return Item::GreenConcrete;\n\t\t\tcase 493: return Item::GreenConcretePowder;\n\t\t\tcase 695: return Item::GreenDye;\n\t\t\tcase 461: return Item::GreenGlazedTerracotta;\n\t\t\tcase 445: return Item::GreenShulkerBox;\n\t\t\tcase 392: return Item::GreenStainedGlass;\n\t\t\tcase 408: return Item::GreenStainedGlassPane;\n\t\t\tcase 344: return Item::GreenTerracotta;\n\t\t\tcase 108: return Item::GreenWool;\n\t\t\tcase 940: return Item::Grindstone;\n\t\t\tcase 777: return Item::GuardianSpawnEgg;\n\t\t\tcase 612: return Item::Gunpowder;\n\t\t\tcase 349: return Item::HayBale;\n\t\t\tcase 924: return Item::HeartOfTheSea;\n\t\t\tcase 319: return Item::HeavyWeightedPressurePlate;\n\t\t\tcase 778: return Item::HoglinSpawnEgg;\n\t\t\tcase 955: return Item::HoneyBlock;\n\t\t\tcase 954: return Item::HoneyBottle;\n\t\t\tcase 951: return Item::Honeycomb;\n\t\t\tcase 956: return Item::HoneycombBlock;\n\t\t\tcase 323: return Item::Hopper;\n\t\t\tcase 851: return Item::HopperMinecart;\n\t\t\tcase 511: return Item::HornCoral;\n\t\t\tcase 506: return Item::HornCoralBlock;\n\t\t\tcase 521: return Item::HornCoralFan;\n\t\t\tcase 779: return Item::HorseSpawnEgg;\n\t\t\tcase 780: return Item::HuskSpawnEgg;\n\t\t\tcase 203: return Item::Ice;\n\t\t\tcase 239: return Item::InfestedChiseledStoneBricks;\n\t\t\tcase 235: return Item::InfestedCobblestone;\n\t\t\tcase 238: return Item::InfestedCrackedStoneBricks;\n\t\t\tcase 237: return Item::InfestedMossyStoneBricks;\n\t\t\tcase 234: return Item::InfestedStone;\n\t\t\tcase 236: return Item::InfestedStoneBricks;\n\t\t\tcase 693: return Item::InkSac;\n\t\t\tcase 574: return Item::IronAxe;\n\t\t\tcase 247: return Item::IronBars;\n\t\t\tcase 137: return Item::IronBlock;\n\t\t\tcase 633: return Item::IronBoots;\n\t\t\tcase 631: return Item::IronChestplate;\n\t\t\tcase 557: return Item::IronDoor;\n\t\t\tcase 630: return Item::IronHelmet;\n\t\t\tcase 615: return Item::IronHoe;\n\t\t\tcase 860: return Item::IronHorseArmor;\n\t\t\tcase 582: return Item::IronIngot;\n\t\t\tcase 632: return Item::IronLeggings;\n\t\t\tcase 905: return Item::IronNugget;\n\t\t\tcase 34: return Item::IronOre;\n\t\t\tcase 573: return Item::IronPickaxe;\n\t\t\tcase 572: return Item::IronShovel;\n\t\t\tcase 586: return Item::IronSword;\n\t\t\tcase 348: return Item::IronTrapdoor;\n\t\t\tcase 827: return Item::ItemFrame;\n\t\t\tcase 225: return Item::JackOLantern;\n\t\t\tcase 569: return Item::Jigsaw;\n\t\t\tcase 207: return Item::Jukebox;\n\t\t\tcase 900: return Item::JungleBoat;\n\t\t\tcase 308: return Item::JungleButton;\n\t\t\tcase 561: return Item::JungleDoor;\n\t\t\tcase 211: return Item::JungleFence;\n\t\t\tcase 255: return Item::JungleFenceGate;\n\t\t\tcase 72: return Item::JungleLeaves;\n\t\t\tcase 40: return Item::JungleLog;\n\t\t\tcase 18: return Item::JunglePlanks;\n\t\t\tcase 194: return Item::JunglePressurePlate;\n\t\t\tcase 26: return Item::JungleSapling;\n\t\t\tcase 655: return Item::JungleSign;\n\t\t\tcase 141: return Item::JungleSlab;\n\t\t\tcase 282: return Item::JungleStairs;\n\t\t\tcase 229: return Item::JungleTrapdoor;\n\t\t\tcase 64: return Item::JungleWood;\n\t\t\tcase 134: return Item::Kelp;\n\t\t\tcase 906: return Item::KnowledgeBook;\n\t\t\tcase 186: return Item::Ladder;\n\t\t\tcase 945: return Item::Lantern;\n\t\t\tcase 79: return Item::LapisBlock;\n\t\t\tcase 697: return Item::LapisLazuli;\n\t\t\tcase 78: return Item::LapisOre;\n\t\t\tcase 378: return Item::LargeFern;\n\t\t\tcase 662: return Item::LavaBucket;\n\t\t\tcase 864: return Item::Lead;\n\t\t\tcase 668: return Item::Leather;\n\t\t\tcase 625: return Item::LeatherBoots;\n\t\t\tcase 623: return Item::LeatherChestplate;\n\t\t\tcase 622: return Item::LeatherHelmet;\n\t\t\tcase 863: return Item::LeatherHorseArmor;\n\t\t\tcase 624: return Item::LeatherLeggings;\n\t\t\tcase 941: return Item::Lectern;\n\t\t\tcase 189: return Item::Lever;\n\t\t\tcase 872: return Item::LightBlueBanner;\n\t\t\tcase 719: return Item::LightBlueBed;\n\t\t\tcase 353: return Item::LightBlueCarpet;\n\t\t\tcase 467: return Item::LightBlueConcrete;\n\t\t\tcase 483: return Item::LightBlueConcretePowder;\n\t\t\tcase 705: return Item::LightBlueDye;\n\t\t\tcase 451: return Item::LightBlueGlazedTerracotta;\n\t\t\tcase 435: return Item::LightBlueShulkerBox;\n\t\t\tcase 382: return Item::LightBlueStainedGlass;\n\t\t\tcase 398: return Item::LightBlueStainedGlassPane;\n\t\t\tcase 334: return Item::LightBlueTerracotta;\n\t\t\tcase 98: return Item::LightBlueWool;\n\t\t\tcase 877: return Item::LightGrayBanner;\n\t\t\tcase 724: return Item::LightGrayBed;\n\t\t\tcase 358: return Item::LightGrayCarpet;\n\t\t\tcase 472: return Item::LightGrayConcrete;\n\t\t\tcase 488: return Item::LightGrayConcretePowder;\n\t\t\tcase 700: return Item::LightGrayDye;\n\t\t\tcase 456: return Item::LightGrayGlazedTerracotta;\n\t\t\tcase 440: return Item::LightGrayShulkerBox;\n\t\t\tcase 387: return Item::LightGrayStainedGlass;\n\t\t\tcase 403: return Item::LightGrayStainedGlassPane;\n\t\t\tcase 339: return Item::LightGrayTerracotta;\n\t\t\tcase 103: return Item::LightGrayWool;\n\t\t\tcase 318: return Item::LightWeightedPressurePlate;\n\t\t\tcase 374: return Item::Lilac;\n\t\t\tcase 122: return Item::LilyOfTheValley;\n\t\t\tcase 263: return Item::LilyPad;\n\t\t\tcase 874: return Item::LimeBanner;\n\t\t\tcase 721: return Item::LimeBed;\n\t\t\tcase 355: return Item::LimeCarpet;\n\t\t\tcase 469: return Item::LimeConcrete;\n\t\t\tcase 485: return Item::LimeConcretePowder;\n\t\t\tcase 703: return Item::LimeDye;\n\t\t\tcase 453: return Item::LimeGlazedTerracotta;\n\t\t\tcase 437: return Item::LimeShulkerBox;\n\t\t\tcase 384: return Item::LimeStainedGlass;\n\t\t\tcase 400: return Item::LimeStainedGlassPane;\n\t\t\tcase 336: return Item::LimeTerracotta;\n\t\t\tcase 100: return Item::LimeWool;\n\t\t\tcase 895: return Item::LingeringPotion;\n\t\t\tcase 781: return Item::LlamaSpawnEgg;\n\t\t\tcase 957: return Item::Lodestone;\n\t\t\tcase 927: return Item::Loom;\n\t\t\tcase 871: return Item::MagentaBanner;\n\t\t\tcase 718: return Item::MagentaBed;\n\t\t\tcase 352: return Item::MagentaCarpet;\n\t\t\tcase 466: return Item::MagentaConcrete;\n\t\t\tcase 482: return Item::MagentaConcretePowder;\n\t\t\tcase 706: return Item::MagentaDye;\n\t\t\tcase 450: return Item::MagentaGlazedTerracotta;\n\t\t\tcase 434: return Item::MagentaShulkerBox;\n\t\t\tcase 381: return Item::MagentaStainedGlass;\n\t\t\tcase 397: return Item::MagentaStainedGlassPane;\n\t\t\tcase 333: return Item::MagentaTerracotta;\n\t\t\tcase 97: return Item::MagentaWool;\n\t\t\tcase 424: return Item::MagmaBlock;\n\t\t\tcase 754: return Item::MagmaCream;\n\t\t\tcase 782: return Item::MagmaCubeSpawnEgg;\n\t\t\tcase 833: return Item::Map;\n\t\t\tcase 250: return Item::Melon;\n\t\t\tcase 738: return Item::MelonSeeds;\n\t\t\tcase 735: return Item::MelonSlice;\n\t\t\tcase 669: return Item::MilkBucket;\n\t\t\tcase 663: return Item::Minecart;\n\t\t\tcase 931: return Item::MojangBannerPattern;\n\t\t\tcase 783: return Item::MooshroomSpawnEgg;\n\t\t\tcase 169: return Item::MossyCobblestone;\n\t\t\tcase 547: return Item::MossyCobblestoneSlab;\n\t\t\tcase 533: return Item::MossyCobblestoneStairs;\n\t\t\tcase 288: return Item::MossyCobblestoneWall;\n\t\t\tcase 545: return Item::MossyStoneBrickSlab;\n\t\t\tcase 531: return Item::MossyStoneBrickStairs;\n\t\t\tcase 292: return Item::MossyStoneBrickWall;\n\t\t\tcase 241: return Item::MossyStoneBricks;\n\t\t\tcase 784: return Item::MuleSpawnEgg;\n\t\t\tcase 246: return Item::MushroomStem;\n\t\t\tcase 601: return Item::MushroomStew;\n\t\t\tcase 910: return Item::MusicDiscBlocks;\n\t\t\tcase 909: return Item::MusicDiscCat;\n\t\t\tcase 911: return Item::MusicDiscChirp;\n\t\t\tcase 912: return Item::MusicDiscFar;\n\t\t\tcase 913: return Item::MusicDiscMall;\n\t\t\tcase 914: return Item::MusicDiscMellohi;\n\t\t\tcase 920: return Item::MusicDiscPigstep;\n\t\t\tcase 915: return Item::MusicDiscStal;\n\t\t\tcase 916: return Item::MusicDiscStrad;\n\t\t\tcase 919: return Item::MusicDiscWait;\n\t\t\tcase 917: return Item::MusicDiscWard;\n\t\t\tcase 918: return Item::MusicDisc11;\n\t\t\tcase 908: return Item::MusicDisc13;\n\t\t\tcase 867: return Item::Mutton;\n\t\t\tcase 262: return Item::Mycelium;\n\t\t\tcase 865: return Item::NameTag;\n\t\t\tcase 923: return Item::NautilusShell;\n\t\t\tcase 848: return Item::NetherBrick;\n\t\t\tcase 267: return Item::NetherBrickFence;\n\t\t\tcase 154: return Item::NetherBrickSlab;\n\t\t\tcase 268: return Item::NetherBrickStairs;\n\t\t\tcase 295: return Item::NetherBrickWall;\n\t\t\tcase 264: return Item::NetherBricks;\n\t\t\tcase 36: return Item::NetherGoldOre;\n\t\t\tcase 322: return Item::NetherQuartzOre;\n\t\t\tcase 130: return Item::NetherSprouts;\n\t\t\tcase 843: return Item::NetherStar;\n\t\t\tcase 748: return Item::NetherWart;\n\t\t\tcase 425: return Item::NetherWartBlock;\n\t\t\tcase 609: return Item::NetheriteAxe;\n\t\t\tcase 958: return Item::NetheriteBlock;\n\t\t\tcase 645: return Item::NetheriteBoots;\n\t\t\tcase 643: return Item::NetheriteChestplate;\n\t\t\tcase 642: return Item::NetheriteHelmet;\n\t\t\tcase 618: return Item::NetheriteHoe;\n\t\t\tcase 584: return Item::NetheriteIngot;\n\t\t\tcase 644: return Item::NetheriteLeggings;\n\t\t\tcase 608: return Item::NetheritePickaxe;\n\t\t\tcase 585: return Item::NetheriteScrap;\n\t\t\tcase 607: return Item::NetheriteShovel;\n\t\t\tcase 606: return Item::NetheriteSword;\n\t\t\tcase 218: return Item::Netherrack;\n\t\t\tcase 84: return Item::NoteBlock;\n\t\t\tcase 667: return Item::OakBoat;\n\t\t\tcase 305: return Item::OakButton;\n\t\t\tcase 558: return Item::OakDoor;\n\t\t\tcase 208: return Item::OakFence;\n\t\t\tcase 252: return Item::OakFenceGate;\n\t\t\tcase 69: return Item::OakLeaves;\n\t\t\tcase 37: return Item::OakLog;\n\t\t\tcase 15: return Item::OakPlanks;\n\t\t\tcase 191: return Item::OakPressurePlate;\n\t\t\tcase 23: return Item::OakSapling;\n\t\t\tcase 652: return Item::OakSign;\n\t\t\tcase 138: return Item::OakSlab;\n\t\t\tcase 179: return Item::OakStairs;\n\t\t\tcase 226: return Item::OakTrapdoor;\n\t\t\tcase 61: return Item::OakWood;\n\t\t\tcase 430: return Item::Observer;\n\t\t\tcase 170: return Item::Obsidian;\n\t\t\tcase 785: return Item::OcelotSpawnEgg;\n\t\t\tcase 870: return Item::OrangeBanner;\n\t\t\tcase 717: return Item::OrangeBed;\n\t\t\tcase 351: return Item::OrangeCarpet;\n\t\t\tcase 465: return Item::OrangeConcrete;\n\t\t\tcase 481: return Item::OrangeConcretePowder;\n\t\t\tcase 707: return Item::OrangeDye;\n\t\t\tcase 449: return Item::OrangeGlazedTerracotta;\n\t\t\tcase 433: return Item::OrangeShulkerBox;\n\t\t\tcase 380: return Item::OrangeStainedGlass;\n\t\t\tcase 396: return Item::OrangeStainedGlassPane;\n\t\t\tcase 332: return Item::OrangeTerracotta;\n\t\t\tcase 117: return Item::OrangeTulip;\n\t\t\tcase 96: return Item::OrangeWool;\n\t\t\tcase 120: return Item::OxeyeDaisy;\n\t\t\tcase 368: return Item::PackedIce;\n\t\t\tcase 649: return Item::Painting;\n\t\t\tcase 786: return Item::PandaSpawnEgg;\n\t\t\tcase 677: return Item::Paper;\n\t\t\tcase 787: return Item::ParrotSpawnEgg;\n\t\t\tcase 376: return Item::Peony;\n\t\t\tcase 150: return Item::PetrifiedOakSlab;\n\t\t\tcase 922: return Item::PhantomMembrane;\n\t\t\tcase 788: return Item::PhantomSpawnEgg;\n\t\t\tcase 789: return Item::PigSpawnEgg;\n\t\t\tcase 933: return Item::PiglinBannerPattern;\n\t\t\tcase 790: return Item::PiglinSpawnEgg;\n\t\t\tcase 791: return Item::PillagerSpawnEgg;\n\t\t\tcase 875: return Item::PinkBanner;\n\t\t\tcase 722: return Item::PinkBed;\n\t\t\tcase 356: return Item::PinkCarpet;\n\t\t\tcase 470: return Item::PinkConcrete;\n\t\t\tcase 486: return Item::PinkConcretePowder;\n\t\t\tcase 702: return Item::PinkDye;\n\t\t\tcase 454: return Item::PinkGlazedTerracotta;\n\t\t\tcase 438: return Item::PinkShulkerBox;\n\t\t\tcase 385: return Item::PinkStainedGlass;\n\t\t\tcase 401: return Item::PinkStainedGlassPane;\n\t\t\tcase 337: return Item::PinkTerracotta;\n\t\t\tcase 119: return Item::PinkTulip;\n\t\t\tcase 101: return Item::PinkWool;\n\t\t\tcase 94: return Item::Piston;\n\t\t\tcase 837: return Item::PlayerHead;\n\t\t\tcase 11: return Item::Podzol;\n\t\t\tcase 832: return Item::PoisonousPotato;\n\t\t\tcase 792: return Item::PolarBearSpawnEgg;\n\t\t\tcase 7: return Item::PolishedAndesite;\n\t\t\tcase 554: return Item::PolishedAndesiteSlab;\n\t\t\tcase 541: return Item::PolishedAndesiteStairs;\n\t\t\tcase 222: return Item::PolishedBasalt;\n\t\t\tcase 966: return Item::PolishedBlackstone;\n\t\t\tcase 971: return Item::PolishedBlackstoneBrickSlab;\n\t\t\tcase 972: return Item::PolishedBlackstoneBrickStairs;\n\t\t\tcase 303: return Item::PolishedBlackstoneBrickWall;\n\t\t\tcase 970: return Item::PolishedBlackstoneBricks;\n\t\t\tcase 313: return Item::PolishedBlackstoneButton;\n\t\t\tcase 199: return Item::PolishedBlackstonePressurePlate;\n\t\t\tcase 967: return Item::PolishedBlackstoneSlab;\n\t\t\tcase 968: return Item::PolishedBlackstoneStairs;\n\t\t\tcase 302: return Item::PolishedBlackstoneWall;\n\t\t\tcase 5: return Item::PolishedDiorite;\n\t\t\tcase 546: return Item::PolishedDioriteSlab;\n\t\t\tcase 532: return Item::PolishedDioriteStairs;\n\t\t\tcase 3: return Item::PolishedGranite;\n\t\t\tcase 543: return Item::PolishedGraniteSlab;\n\t\t\tcase 529: return Item::PolishedGraniteStairs;\n\t\t\tcase 887: return Item::PoppedChorusFruit;\n\t\t\tcase 112: return Item::Poppy;\n\t\t\tcase 647: return Item::Porkchop;\n\t\t\tcase 830: return Item::Potato;\n\t\t\tcase 749: return Item::Potion;\n\t\t\tcase 85: return Item::PoweredRail;\n\t\t\tcase 411: return Item::Prismarine;\n\t\t\tcase 160: return Item::PrismarineBrickSlab;\n\t\t\tcase 415: return Item::PrismarineBrickStairs;\n\t\t\tcase 412: return Item::PrismarineBricks;\n\t\t\tcase 853: return Item::PrismarineCrystals;\n\t\t\tcase 852: return Item::PrismarineShard;\n\t\t\tcase 159: return Item::PrismarineSlab;\n\t\t\tcase 414: return Item::PrismarineStairs;\n\t\t\tcase 290: return Item::PrismarineWall;\n\t\t\tcase 690: return Item::Pufferfish;\n\t\t\tcase 670: return Item::PufferfishBucket;\n\t\t\tcase 793: return Item::PufferfishSpawnEgg;\n\t\t\tcase 216: return Item::Pumpkin;\n\t\t\tcase 844: return Item::PumpkinPie;\n\t\t\tcase 737: return Item::PumpkinSeeds;\n\t\t\tcase 879: return Item::PurpleBanner;\n\t\t\tcase 726: return Item::PurpleBed;\n\t\t\tcase 360: return Item::PurpleCarpet;\n\t\t\tcase 474: return Item::PurpleConcrete;\n\t\t\tcase 490: return Item::PurpleConcretePowder;\n\t\t\tcase 698: return Item::PurpleDye;\n\t\t\tcase 458: return Item::PurpleGlazedTerracotta;\n\t\t\tcase 442: return Item::PurpleShulkerBox;\n\t\t\tcase 389: return Item::PurpleStainedGlass;\n\t\t\tcase 405: return Item::PurpleStainedGlassPane;\n\t\t\tcase 341: return Item::PurpleTerracotta;\n\t\t\tcase 105: return Item::PurpleWool;\n\t\t\tcase 175: return Item::PurpurBlock;\n\t\t\tcase 176: return Item::PurpurPillar;\n\t\t\tcase 158: return Item::PurpurSlab;\n\t\t\tcase 177: return Item::PurpurStairs;\n\t\t\tcase 849: return Item::Quartz;\n\t\t\tcase 325: return Item::QuartzBlock;\n\t\t\tcase 326: return Item::QuartzBricks;\n\t\t\tcase 327: return Item::QuartzPillar;\n\t\t\tcase 155: return Item::QuartzSlab;\n\t\t\tcase 328: return Item::QuartzStairs;\n\t\t\tcase 854: return Item::Rabbit;\n\t\t\tcase 857: return Item::RabbitFoot;\n\t\t\tcase 858: return Item::RabbitHide;\n\t\t\tcase 794: return Item::RabbitSpawnEgg;\n\t\t\tcase 856: return Item::RabbitStew;\n\t\t\tcase 187: return Item::Rail;\n\t\t\tcase 795: return Item::RavagerSpawnEgg;\n\t\t\tcase 883: return Item::RedBanner;\n\t\t\tcase 730: return Item::RedBed;\n\t\t\tcase 364: return Item::RedCarpet;\n\t\t\tcase 478: return Item::RedConcrete;\n\t\t\tcase 494: return Item::RedConcretePowder;\n\t\t\tcase 694: return Item::RedDye;\n\t\t\tcase 462: return Item::RedGlazedTerracotta;\n\t\t\tcase 125: return Item::RedMushroom;\n\t\t\tcase 245: return Item::RedMushroomBlock;\n\t\t\tcase 553: return Item::RedNetherBrickSlab;\n\t\t\tcase 540: return Item::RedNetherBrickStairs;\n\t\t\tcase 297: return Item::RedNetherBrickWall;\n\t\t\tcase 427: return Item::RedNetherBricks;\n\t\t\tcase 31: return Item::RedSand;\n\t\t\tcase 418: return Item::RedSandstone;\n\t\t\tcase 156: return Item::RedSandstoneSlab;\n\t\t\tcase 421: return Item::RedSandstoneStairs;\n\t\t\tcase 291: return Item::RedSandstoneWall;\n\t\t\tcase 446: return Item::RedShulkerBox;\n\t\t\tcase 393: return Item::RedStainedGlass;\n\t\t\tcase 409: return Item::RedStainedGlassPane;\n\t\t\tcase 345: return Item::RedTerracotta;\n\t\t\tcase 116: return Item::RedTulip;\n\t\t\tcase 109: return Item::RedWool;\n\t\t\tcase 665: return Item::Redstone;\n\t\t\tcase 321: return Item::RedstoneBlock;\n\t\t\tcase 274: return Item::RedstoneLamp;\n\t\t\tcase 200: return Item::RedstoneOre;\n\t\t\tcase 201: return Item::RedstoneTorch;\n\t\t\tcase 566: return Item::Repeater;\n\t\t\tcase 422: return Item::RepeatingCommandBlock;\n\t\t\tcase 974: return Item::RespawnAnchor;\n\t\t\tcase 375: return Item::RoseBush;\n\t\t\tcase 743: return Item::RottenFlesh;\n\t\t\tcase 664: return Item::Saddle;\n\t\t\tcase 688: return Item::Salmon;\n\t\t\tcase 671: return Item::SalmonBucket;\n\t\t\tcase 796: return Item::SalmonSpawnEgg;\n\t\t\tcase 30: return Item::Sand;\n\t\t\tcase 81: return Item::Sandstone;\n\t\t\tcase 148: return Item::SandstoneSlab;\n\t\t\tcase 275: return Item::SandstoneStairs;\n\t\t\tcase 298: return Item::SandstoneWall;\n\t\t\tcase 556: return Item::Scaffolding;\n\t\t\tcase 571: return Item::Scute;\n\t\t\tcase 417: return Item::SeaLantern;\n\t\t\tcase 93: return Item::SeaPickle;\n\t\t\tcase 92: return Item::Seagrass;\n\t\t\tcase 734: return Item::Shears;\n\t\t\tcase 797: return Item::SheepSpawnEgg;\n\t\t\tcase 896: return Item::Shield;\n\t\t\tcase 950: return Item::Shroomlight;\n\t\t\tcase 431: return Item::ShulkerBox;\n\t\t\tcase 904: return Item::ShulkerShell;\n\t\t\tcase 798: return Item::ShulkerSpawnEgg;\n\t\t\tcase 799: return Item::SilverfishSpawnEgg;\n\t\t\tcase 801: return Item::SkeletonHorseSpawnEgg;\n\t\t\tcase 835: return Item::SkeletonSkull;\n\t\t\tcase 800: return Item::SkeletonSpawnEgg;\n\t\t\tcase 930: return Item::SkullBannerPattern;\n\t\t\tcase 679: return Item::SlimeBall;\n\t\t\tcase 371: return Item::SlimeBlock;\n\t\t\tcase 802: return Item::SlimeSpawnEgg;\n\t\t\tcase 942: return Item::SmithingTable;\n\t\t\tcase 936: return Item::Smoker;\n\t\t\tcase 162: return Item::SmoothQuartz;\n\t\t\tcase 550: return Item::SmoothQuartzSlab;\n\t\t\tcase 537: return Item::SmoothQuartzStairs;\n\t\t\tcase 163: return Item::SmoothRedSandstone;\n\t\t\tcase 544: return Item::SmoothRedSandstoneSlab;\n\t\t\tcase 530: return Item::SmoothRedSandstoneStairs;\n\t\t\tcase 164: return Item::SmoothSandstone;\n\t\t\tcase 549: return Item::SmoothSandstoneSlab;\n\t\t\tcase 536: return Item::SmoothSandstoneStairs;\n\t\t\tcase 165: return Item::SmoothStone;\n\t\t\tcase 147: return Item::SmoothStoneSlab;\n\t\t\tcase 202: return Item::Snow;\n\t\t\tcase 204: return Item::SnowBlock;\n\t\t\tcase 666: return Item::Snowball;\n\t\t\tcase 949: return Item::SoulCampfire;\n\t\t\tcase 946: return Item::SoulLantern;\n\t\t\tcase 219: return Item::SoulSand;\n\t\t\tcase 220: return Item::SoulSoil;\n\t\t\tcase 223: return Item::SoulTorch;\n\t\t\tcase 178: return Item::Spawner;\n\t\t\tcase 893: return Item::SpectralArrow;\n\t\t\tcase 751: return Item::SpiderEye;\n\t\t\tcase 803: return Item::SpiderSpawnEgg;\n\t\t\tcase 892: return Item::SplashPotion;\n\t\t\tcase 75: return Item::Sponge;\n\t\t\tcase 898: return Item::SpruceBoat;\n\t\t\tcase 306: return Item::SpruceButton;\n\t\t\tcase 559: return Item::SpruceDoor;\n\t\t\tcase 209: return Item::SpruceFence;\n\t\t\tcase 253: return Item::SpruceFenceGate;\n\t\t\tcase 70: return Item::SpruceLeaves;\n\t\t\tcase 38: return Item::SpruceLog;\n\t\t\tcase 16: return Item::SprucePlanks;\n\t\t\tcase 192: return Item::SprucePressurePlate;\n\t\t\tcase 24: return Item::SpruceSapling;\n\t\t\tcase 653: return Item::SpruceSign;\n\t\t\tcase 139: return Item::SpruceSlab;\n\t\t\tcase 280: return Item::SpruceStairs;\n\t\t\tcase 227: return Item::SpruceTrapdoor;\n\t\t\tcase 62: return Item::SpruceWood;\n\t\t\tcase 804: return Item::SquidSpawnEgg;\n\t\t\tcase 599: return Item::Stick;\n\t\t\tcase 87: return Item::StickyPiston;\n\t\t\tcase 1: return Item::Stone;\n\t\t\tcase 594: return Item::StoneAxe;\n\t\t\tcase 153: return Item::StoneBrickSlab;\n\t\t\tcase 261: return Item::StoneBrickStairs;\n\t\t\tcase 294: return Item::StoneBrickWall;\n\t\t\tcase 240: return Item::StoneBricks;\n\t\t\tcase 304: return Item::StoneButton;\n\t\t\tcase 614: return Item::StoneHoe;\n\t\t\tcase 593: return Item::StonePickaxe;\n\t\t\tcase 190: return Item::StonePressurePlate;\n\t\t\tcase 592: return Item::StoneShovel;\n\t\t\tcase 146: return Item::StoneSlab;\n\t\t\tcase 535: return Item::StoneStairs;\n\t\t\tcase 591: return Item::StoneSword;\n\t\t\tcase 943: return Item::Stonecutter;\n\t\t\tcase 805: return Item::StraySpawnEgg;\n\t\t\tcase 806: return Item::StriderSpawnEgg;\n\t\t\tcase 610: return Item::String;\n\t\t\tcase 49: return Item::StrippedAcaciaLog;\n\t\t\tcase 57: return Item::StrippedAcaciaWood;\n\t\t\tcase 47: return Item::StrippedBirchLog;\n\t\t\tcase 55: return Item::StrippedBirchWood;\n\t\t\tcase 59: return Item::StrippedCrimsonHyphae;\n\t\t\tcase 51: return Item::StrippedCrimsonStem;\n\t\t\tcase 50: return Item::StrippedDarkOakLog;\n\t\t\tcase 58: return Item::StrippedDarkOakWood;\n\t\t\tcase 48: return Item::StrippedJungleLog;\n\t\t\tcase 56: return Item::StrippedJungleWood;\n\t\t\tcase 45: return Item::StrippedOakLog;\n\t\t\tcase 53: return Item::StrippedOakWood;\n\t\t\tcase 46: return Item::StrippedSpruceLog;\n\t\t\tcase 54: return Item::StrippedSpruceWood;\n\t\t\tcase 60: return Item::StrippedWarpedHyphae;\n\t\t\tcase 52: return Item::StrippedWarpedStem;\n\t\t\tcase 568: return Item::StructureBlock;\n\t\t\tcase 429: return Item::StructureVoid;\n\t\t\tcase 714: return Item::Sugar;\n\t\t\tcase 133: return Item::SugarCane;\n\t\t\tcase 373: return Item::Sunflower;\n\t\t\tcase 926: return Item::SuspiciousStew;\n\t\t\tcase 947: return Item::SweetBerries;\n\t\t\tcase 377: return Item::TallGrass;\n\t\t\tcase 960: return Item::Target;\n\t\t\tcase 366: return Item::Terracotta;\n\t\t\tcase 894: return Item::TippedArrow;\n\t\t\tcase 167: return Item::TNT;\n\t\t\tcase 850: return Item::TNTMinecart;\n\t\t\tcase 171: return Item::Torch;\n\t\t\tcase 903: return Item::TotemOfUndying;\n\t\t\tcase 807: return Item::TraderLlamaSpawnEgg;\n\t\t\tcase 317: return Item::TrappedChest;\n\t\t\tcase 921: return Item::Trident;\n\t\t\tcase 278: return Item::TripwireHook;\n\t\t\tcase 689: return Item::TropicalFish;\n\t\t\tcase 673: return Item::TropicalFishBucket;\n\t\t\tcase 808: return Item::TropicalFishSpawnEgg;\n\t\t\tcase 507: return Item::TubeCoral;\n\t\t\tcase 502: return Item::TubeCoralBlock;\n\t\t\tcase 517: return Item::TubeCoralFan;\n\t\t\tcase 496: return Item::TurtleEgg;\n\t\t\tcase 570: return Item::TurtleHelmet;\n\t\t\tcase 809: return Item::TurtleSpawnEgg;\n\t\t\tcase 132: return Item::TwistingVines;\n\t\t\tcase 810: return Item::VexSpawnEgg;\n\t\t\tcase 811: return Item::VillagerSpawnEgg;\n\t\t\tcase 812: return Item::VindicatorSpawnEgg;\n\t\t\tcase 251: return Item::Vine;\n\t\t\tcase 813: return Item::WanderingTraderSpawnEgg;\n\t\t\tcase 312: return Item::WarpedButton;\n\t\t\tcase 565: return Item::WarpedDoor;\n\t\t\tcase 215: return Item::WarpedFence;\n\t\t\tcase 259: return Item::WarpedFenceGate;\n\t\t\tcase 127: return Item::WarpedFungus;\n\t\t\tcase 842: return Item::WarpedFungusOnA_stick;\n\t\t\tcase 68: return Item::WarpedHyphae;\n\t\t\tcase 13: return Item::WarpedNylium;\n\t\t\tcase 22: return Item::WarpedPlanks;\n\t\t\tcase 198: return Item::WarpedPressurePlate;\n\t\t\tcase 129: return Item::WarpedRoots;\n\t\t\tcase 659: return Item::WarpedSign;\n\t\t\tcase 145: return Item::WarpedSlab;\n\t\t\tcase 284: return Item::WarpedStairs;\n\t\t\tcase 44: return Item::WarpedStem;\n\t\t\tcase 233: return Item::WarpedTrapdoor;\n\t\t\tcase 426: return Item::WarpedWartBlock;\n\t\t\tcase 661: return Item::WaterBucket;\n\t\t\tcase 131: return Item::WeepingVines;\n\t\t\tcase 76: return Item::WetSponge;\n\t\t\tcase 620: return Item::Wheat;\n\t\t\tcase 619: return Item::WheatSeeds;\n\t\t\tcase 869: return Item::WhiteBanner;\n\t\t\tcase 716: return Item::WhiteBed;\n\t\t\tcase 350: return Item::WhiteCarpet;\n\t\t\tcase 464: return Item::WhiteConcrete;\n\t\t\tcase 480: return Item::WhiteConcretePowder;\n\t\t\tcase 712: return Item::WhiteDye;\n\t\t\tcase 448: return Item::WhiteGlazedTerracotta;\n\t\t\tcase 432: return Item::WhiteShulkerBox;\n\t\t\tcase 379: return Item::WhiteStainedGlass;\n\t\t\tcase 395: return Item::WhiteStainedGlassPane;\n\t\t\tcase 331: return Item::WhiteTerracotta;\n\t\t\tcase 118: return Item::WhiteTulip;\n\t\t\tcase 95: return Item::WhiteWool;\n\t\t\tcase 814: return Item::WitchSpawnEgg;\n\t\t\tcase 123: return Item::WitherRose;\n\t\t\tcase 836: return Item::WitherSkeletonSkull;\n\t\t\tcase 815: return Item::WitherSkeletonSpawnEgg;\n\t\t\tcase 816: return Item::WolfSpawnEgg;\n\t\t\tcase 590: return Item::WoodenAxe;\n\t\t\tcase 613: return Item::WoodenHoe;\n\t\t\tcase 589: return Item::WoodenPickaxe;\n\t\t\tcase 588: return Item::WoodenShovel;\n\t\t\tcase 587: return Item::WoodenSword;\n\t\t\tcase 824: return Item::WritableBook;\n\t\t\tcase 825: return Item::WrittenBook;\n\t\t\tcase 873: return Item::YellowBanner;\n\t\t\tcase 720: return Item::YellowBed;\n\t\t\tcase 354: return Item::YellowCarpet;\n\t\t\tcase 468: return Item::YellowConcrete;\n\t\t\tcase 484: return Item::YellowConcretePowder;\n\t\t\tcase 704: return Item::YellowDye;\n\t\t\tcase 452: return Item::YellowGlazedTerracotta;\n\t\t\tcase 436: return Item::YellowShulkerBox;\n\t\t\tcase 383: return Item::YellowStainedGlass;\n\t\t\tcase 399: return Item::YellowStainedGlassPane;\n\t\t\tcase 335: return Item::YellowTerracotta;\n\t\t\tcase 99: return Item::YellowWool;\n\t\t\tcase 817: return Item::ZoglinSpawnEgg;\n\t\t\tcase 838: return Item::ZombieHead;\n\t\t\tcase 819: return Item::ZombieHorseSpawnEgg;\n\t\t\tcase 818: return Item::ZombieSpawnEgg;\n\t\t\tcase 820: return Item::ZombieVillagerSpawnEgg;\n\t\t\tcase 821: return Item::ZombiePigmanSpawnEgg;\n\t\t\tdefault: return Item::Air;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Palette_1_16.h",
    "content": "#pragma once\n\n#include \"BlockState.h\"\n#include \"Registries/Items.h\"\n#include \"Registries/CustomStatistics.h\"\n\nnamespace Palette_1_16\n{\n\tUInt32 From(BlockState Block);\n\tUInt32 From(Item ID);\n\tUInt32 From(CustomStatistic ID);\n\tItem ToItem(UInt32 ID);\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Upgrade.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"Upgrade.h\"\n#include \"Registries/BlockStates.h\"\n\nnamespace PaletteUpgrade\n{\n\tBlockState FromBlock(const BLOCKTYPE Block, const NIBBLETYPE Meta)\n\t{\n\t\tusing namespace Block;\n\n\t\tswitch ((Block << 4) | Meta)\n\t\t{\n\t\t\tcase (0 << 4) | 0: return Air::Air();\n\t\t\tcase (1 << 4) | 0: return Stone::Stone();\n\t\t\tcase (1 << 4) | 1: return Granite::Granite();\n\t\t\tcase (1 << 4) | 2: return PolishedGranite::PolishedGranite();\n\t\t\tcase (1 << 4) | 3: return Diorite::Diorite();\n\t\t\tcase (1 << 4) | 4: return PolishedDiorite::PolishedDiorite();\n\t\t\tcase (1 << 4) | 5: return Andesite::Andesite();\n\t\t\tcase (1 << 4) | 6: return PolishedAndesite::PolishedAndesite();\n\t\t\tcase (2 << 4) | 0: return GrassBlock::GrassBlock(false);\n\t\t\tcase (3 << 4) | 0: return Dirt::Dirt();\n\t\t\tcase (3 << 4) | 1: return CoarseDirt::CoarseDirt();\n\t\t\tcase (3 << 4) | 2: return Podzol::Podzol(false);\n\t\t\tcase (4 << 4) | 0: return Cobblestone::Cobblestone();\n\t\t\tcase (5 << 4) | 0: return OakPlanks::OakPlanks();\n\t\t\tcase (5 << 4) | 1: return SprucePlanks::SprucePlanks();\n\t\t\tcase (5 << 4) | 2: return BirchPlanks::BirchPlanks();\n\t\t\tcase (5 << 4) | 3: return JunglePlanks::JunglePlanks();\n\t\t\tcase (5 << 4) | 4: return AcaciaPlanks::AcaciaPlanks();\n\t\t\tcase (5 << 4) | 5: return DarkOakPlanks::DarkOakPlanks();\n\t\t\tcase (6 << 4) | 0: return OakSapling::OakSapling(0);\n\t\t\tcase (6 << 4) | 1: return SpruceSapling::SpruceSapling(0);\n\t\t\tcase (6 << 4) | 2: return BirchSapling::BirchSapling(0);\n\t\t\tcase (6 << 4) | 3: return JungleSapling::JungleSapling(0);\n\t\t\tcase (6 << 4) | 4: return AcaciaSapling::AcaciaSapling(0);\n\t\t\tcase (6 << 4) | 5: return DarkOakSapling::DarkOakSapling(0);\n\t\t\tcase (6 << 4) | 8: return OakSapling::OakSapling(1);\n\t\t\tcase (6 << 4) | 9: return SpruceSapling::SpruceSapling(1);\n\t\t\tcase (6 << 4) | 10: return BirchSapling::BirchSapling(1);\n\t\t\tcase (6 << 4) | 11: return JungleSapling::JungleSapling(1);\n\t\t\tcase (6 << 4) | 12: return AcaciaSapling::AcaciaSapling(1);\n\t\t\tcase (6 << 4) | 13: return DarkOakSapling::DarkOakSapling(1);\n\t\t\tcase (7 << 4) | 0: return Bedrock::Bedrock();\n\t\t\tcase (8 << 4) | 0: return Water::Water(0);\n\t\t\tcase (8 << 4) | 1: return Water::Water(1);\n\t\t\tcase (8 << 4) | 2: return Water::Water(2);\n\t\t\tcase (8 << 4) | 3: return Water::Water(3);\n\t\t\tcase (8 << 4) | 4: return Water::Water(4);\n\t\t\tcase (8 << 4) | 5: return Water::Water(5);\n\t\t\tcase (8 << 4) | 6: return Water::Water(6);\n\t\t\tcase (8 << 4) | 7: return Water::Water(7);\n\t\t\tcase (8 << 4) | 8: return Water::Water(8);\n\t\t\tcase (8 << 4) | 9: return Water::Water(9);\n\t\t\tcase (8 << 4) | 10: return Water::Water(10);\n\t\t\tcase (8 << 4) | 11: return Water::Water(11);\n\t\t\tcase (8 << 4) | 12: return Water::Water(12);\n\t\t\tcase (8 << 4) | 13: return Water::Water(13);\n\t\t\tcase (8 << 4) | 14: return Water::Water(14);\n\t\t\tcase (8 << 4) | 15: return Water::Water(15);\n\t\t\tcase (9 << 4) | 0: return Water::Water(0);\n\t\t\tcase (9 << 4) | 1: return Water::Water(1);\n\t\t\tcase (9 << 4) | 2: return Water::Water(2);\n\t\t\tcase (9 << 4) | 3: return Water::Water(3);\n\t\t\tcase (9 << 4) | 4: return Water::Water(4);\n\t\t\tcase (9 << 4) | 5: return Water::Water(5);\n\t\t\tcase (9 << 4) | 6: return Water::Water(6);\n\t\t\tcase (9 << 4) | 7: return Water::Water(7);\n\t\t\tcase (9 << 4) | 8: return Water::Water(8);\n\t\t\tcase (9 << 4) | 9: return Water::Water(9);\n\t\t\tcase (9 << 4) | 10: return Water::Water(10);\n\t\t\tcase (9 << 4) | 11: return Water::Water(11);\n\t\t\tcase (9 << 4) | 12: return Water::Water(12);\n\t\t\tcase (9 << 4) | 13: return Water::Water(13);\n\t\t\tcase (9 << 4) | 14: return Water::Water(14);\n\t\t\tcase (9 << 4) | 15: return Water::Water(15);\n\t\t\tcase (10 << 4) | 0: return Lava::Lava(0);\n\t\t\tcase (10 << 4) | 1: return Lava::Lava(1);\n\t\t\tcase (10 << 4) | 2: return Lava::Lava(2);\n\t\t\tcase (10 << 4) | 3: return Lava::Lava(3);\n\t\t\tcase (10 << 4) | 4: return Lava::Lava(4);\n\t\t\tcase (10 << 4) | 5: return Lava::Lava(5);\n\t\t\tcase (10 << 4) | 6: return Lava::Lava(6);\n\t\t\tcase (10 << 4) | 7: return Lava::Lava(7);\n\t\t\tcase (10 << 4) | 8: return Lava::Lava(8);\n\t\t\tcase (10 << 4) | 9: return Lava::Lava(9);\n\t\t\tcase (10 << 4) | 10: return Lava::Lava(10);\n\t\t\tcase (10 << 4) | 11: return Lava::Lava(11);\n\t\t\tcase (10 << 4) | 12: return Lava::Lava(12);\n\t\t\tcase (10 << 4) | 13: return Lava::Lava(13);\n\t\t\tcase (10 << 4) | 14: return Lava::Lava(14);\n\t\t\tcase (10 << 4) | 15: return Lava::Lava(15);\n\t\t\tcase (11 << 4) | 0: return Lava::Lava(0);\n\t\t\tcase (11 << 4) | 1: return Lava::Lava(1);\n\t\t\tcase (11 << 4) | 2: return Lava::Lava(2);\n\t\t\tcase (11 << 4) | 3: return Lava::Lava(3);\n\t\t\tcase (11 << 4) | 4: return Lava::Lava(4);\n\t\t\tcase (11 << 4) | 5: return Lava::Lava(5);\n\t\t\tcase (11 << 4) | 6: return Lava::Lava(6);\n\t\t\tcase (11 << 4) | 7: return Lava::Lava(7);\n\t\t\tcase (11 << 4) | 8: return Lava::Lava(8);\n\t\t\tcase (11 << 4) | 9: return Lava::Lava(9);\n\t\t\tcase (11 << 4) | 10: return Lava::Lava(10);\n\t\t\tcase (11 << 4) | 11: return Lava::Lava(11);\n\t\t\tcase (11 << 4) | 12: return Lava::Lava(12);\n\t\t\tcase (11 << 4) | 13: return Lava::Lava(13);\n\t\t\tcase (11 << 4) | 14: return Lava::Lava(14);\n\t\t\tcase (11 << 4) | 15: return Lava::Lava(15);\n\t\t\tcase (12 << 4) | 0: return Sand::Sand();\n\t\t\tcase (12 << 4) | 1: return RedSand::RedSand();\n\t\t\tcase (13 << 4) | 0: return Gravel::Gravel();\n\t\t\tcase (14 << 4) | 0: return GoldOre::GoldOre();\n\t\t\tcase (15 << 4) | 0: return IronOre::IronOre();\n\t\t\tcase (16 << 4) | 0: return CoalOre::CoalOre();\n\t\t\tcase (17 << 4) | 0: return OakLog::OakLog(OakLog::Axis::Y);\n\t\t\tcase (17 << 4) | 1: return SpruceLog::SpruceLog(SpruceLog::Axis::Y);\n\t\t\tcase (17 << 4) | 2: return BirchLog::BirchLog(BirchLog::Axis::Y);\n\t\t\tcase (17 << 4) | 3: return JungleLog::JungleLog(JungleLog::Axis::Y);\n\t\t\tcase (17 << 4) | 4: return OakLog::OakLog(OakLog::Axis::X);\n\t\t\tcase (17 << 4) | 5: return SpruceLog::SpruceLog(SpruceLog::Axis::X);\n\t\t\tcase (17 << 4) | 6: return BirchLog::BirchLog(BirchLog::Axis::X);\n\t\t\tcase (17 << 4) | 7: return JungleLog::JungleLog(JungleLog::Axis::X);\n\t\t\tcase (17 << 4) | 8: return OakLog::OakLog(OakLog::Axis::Z);\n\t\t\tcase (17 << 4) | 9: return SpruceLog::SpruceLog(SpruceLog::Axis::Z);\n\t\t\tcase (17 << 4) | 10: return BirchLog::BirchLog(BirchLog::Axis::Z);\n\t\t\tcase (17 << 4) | 11: return JungleLog::JungleLog(JungleLog::Axis::Z);\n\t\t\tcase (17 << 4) | 12: return OakWood::OakWood();\n\t\t\tcase (17 << 4) | 13: return SpruceWood::SpruceWood();\n\t\t\tcase (17 << 4) | 14: return BirchWood::BirchWood();\n\t\t\tcase (17 << 4) | 15: return JungleWood::JungleWood();\n\t\t\tcase (18 << 4) | 0: return OakLeaves::OakLeaves(false, true);\n\t\t\tcase (18 << 4) | 1: return SpruceLeaves::SpruceLeaves(false, true);\n\t\t\tcase (18 << 4) | 2: return BirchLeaves::BirchLeaves(false, true);\n\t\t\tcase (18 << 4) | 3: return JungleLeaves::JungleLeaves(false, true);\n\t\t\tcase (18 << 4) | 4: return OakLeaves::OakLeaves(false, false);\n\t\t\tcase (18 << 4) | 5: return SpruceLeaves::SpruceLeaves(false, false);\n\t\t\tcase (18 << 4) | 6: return BirchLeaves::BirchLeaves(false, false);\n\t\t\tcase (18 << 4) | 7: return JungleLeaves::JungleLeaves(false, false);\n\t\t\tcase (18 << 4) | 8: return OakLeaves::OakLeaves(true, true);\n\t\t\tcase (18 << 4) | 9: return SpruceLeaves::SpruceLeaves(true, true);\n\t\t\tcase (18 << 4) | 10: return BirchLeaves::BirchLeaves(true, true);\n\t\t\tcase (18 << 4) | 11: return JungleLeaves::JungleLeaves(true, true);\n\t\t\tcase (18 << 4) | 12: return OakLeaves::OakLeaves(true, false);\n\t\t\tcase (18 << 4) | 13: return SpruceLeaves::SpruceLeaves(true, false);\n\t\t\tcase (18 << 4) | 14: return BirchLeaves::BirchLeaves(true, false);\n\t\t\tcase (18 << 4) | 15: return JungleLeaves::JungleLeaves(true, false);\n\t\t\tcase (19 << 4) | 0: return Sponge::Sponge();\n\t\t\tcase (19 << 4) | 1: return WetSponge::WetSponge();\n\t\t\tcase (20 << 4) | 0: return Glass::Glass();\n\t\t\tcase (21 << 4) | 0: return LapisOre::LapisOre();\n\t\t\tcase (22 << 4) | 0: return LapisBlock::LapisBlock();\n\t\t\tcase (23 << 4) | 0: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, false);\n\t\t\tcase (23 << 4) | 1: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, false);\n\t\t\tcase (23 << 4) | 2: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (23 << 4) | 3: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (23 << 4) | 4: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (23 << 4) | 5: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (23 << 4) | 8: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YM, true);\n\t\t\tcase (23 << 4) | 9: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_YP, true);\n\t\t\tcase (23 << 4) | 10: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (23 << 4) | 11: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (23 << 4) | 12: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (23 << 4) | 13: return Dispenser::Dispenser(eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (24 << 4) | 0: return Sandstone::Sandstone();\n\t\t\tcase (24 << 4) | 1: return ChiseledSandstone::ChiseledSandstone();\n\t\t\tcase (24 << 4) | 2: return CutSandstone::CutSandstone();\n\t\t\tcase (25 << 4) | 0: return NoteBlock::NoteBlock();\n\t\t\tcase (26 << 4) | 0: return RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Foot);\n\t\t\tcase (26 << 4) | 1: return RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Foot);\n\t\t\tcase (26 << 4) | 2: return RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Foot);\n\t\t\tcase (26 << 4) | 3: return RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Foot);\n\t\t\tcase (26 << 4) | 8: return RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, false, RedBed::Part::Head);\n\t\t\tcase (26 << 4) | 9: return RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, false, RedBed::Part::Head);\n\t\t\tcase (26 << 4) | 10: return RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, false, RedBed::Part::Head);\n\t\t\tcase (26 << 4) | 11: return RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, false, RedBed::Part::Head);\n\t\t\tcase (26 << 4) | 12: return RedBed::RedBed(eBlockFace::BLOCK_FACE_ZP, true, RedBed::Part::Head);\n\t\t\tcase (26 << 4) | 13: return RedBed::RedBed(eBlockFace::BLOCK_FACE_XM, true, RedBed::Part::Head);\n\t\t\tcase (26 << 4) | 14: return RedBed::RedBed(eBlockFace::BLOCK_FACE_ZM, true, RedBed::Part::Head);\n\t\t\tcase (26 << 4) | 15: return RedBed::RedBed(eBlockFace::BLOCK_FACE_XP, true, RedBed::Part::Head);\n\t\t\tcase (27 << 4) | 0: return PoweredRail::PoweredRail(false, PoweredRail::Shape::NorthSouth);\n\t\t\tcase (27 << 4) | 1: return PoweredRail::PoweredRail(false, PoweredRail::Shape::EastWest);\n\t\t\tcase (27 << 4) | 2: return PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingEast);\n\t\t\tcase (27 << 4) | 3: return PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingWest);\n\t\t\tcase (27 << 4) | 4: return PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingNorth);\n\t\t\tcase (27 << 4) | 5: return PoweredRail::PoweredRail(false, PoweredRail::Shape::AscendingSouth);\n\t\t\tcase (27 << 4) | 8: return PoweredRail::PoweredRail(true, PoweredRail::Shape::NorthSouth);\n\t\t\tcase (27 << 4) | 9: return PoweredRail::PoweredRail(true, PoweredRail::Shape::EastWest);\n\t\t\tcase (27 << 4) | 10: return PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingEast);\n\t\t\tcase (27 << 4) | 11: return PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingWest);\n\t\t\tcase (27 << 4) | 12: return PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingNorth);\n\t\t\tcase (27 << 4) | 13: return PoweredRail::PoweredRail(true, PoweredRail::Shape::AscendingSouth);\n\t\t\tcase (28 << 4) | 0: return DetectorRail::DetectorRail(false, DetectorRail::Shape::NorthSouth);\n\t\t\tcase (28 << 4) | 1: return DetectorRail::DetectorRail(false, DetectorRail::Shape::EastWest);\n\t\t\tcase (28 << 4) | 2: return DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingEast);\n\t\t\tcase (28 << 4) | 3: return DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingWest);\n\t\t\tcase (28 << 4) | 4: return DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingNorth);\n\t\t\tcase (28 << 4) | 5: return DetectorRail::DetectorRail(false, DetectorRail::Shape::AscendingSouth);\n\t\t\tcase (28 << 4) | 8: return DetectorRail::DetectorRail(true, DetectorRail::Shape::NorthSouth);\n\t\t\tcase (28 << 4) | 9: return DetectorRail::DetectorRail(true, DetectorRail::Shape::EastWest);\n\t\t\tcase (28 << 4) | 10: return DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingEast);\n\t\t\tcase (28 << 4) | 11: return DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingWest);\n\t\t\tcase (28 << 4) | 12: return DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingNorth);\n\t\t\tcase (28 << 4) | 13: return DetectorRail::DetectorRail(true, DetectorRail::Shape::AscendingSouth);\n\t\t\tcase (29 << 4) | 0: return StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (29 << 4) | 1: return StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (29 << 4) | 2: return StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (29 << 4) | 3: return StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (29 << 4) | 4: return StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (29 << 4) | 5: return StickyPiston::StickyPiston(false, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (29 << 4) | 8: return StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (29 << 4) | 9: return StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (29 << 4) | 10: return StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (29 << 4) | 11: return StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (29 << 4) | 12: return StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (29 << 4) | 13: return StickyPiston::StickyPiston(true, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (30 << 4) | 0: return Cobweb::Cobweb();\n\t\t\tcase (31 << 4) | 0: return DeadBush::DeadBush();\n\t\t\tcase (31 << 4) | 1: return Grass::Grass();\n\t\t\tcase (31 << 4) | 2: return Fern::Fern();\n\t\t\tcase (32 << 4) | 0: return DeadBush::DeadBush();\n\t\t\tcase (33 << 4) | 0: return Piston::Piston(false, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (33 << 4) | 1: return Piston::Piston(false, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (33 << 4) | 2: return Piston::Piston(false, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (33 << 4) | 3: return Piston::Piston(false, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (33 << 4) | 4: return Piston::Piston(false, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (33 << 4) | 5: return Piston::Piston(false, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (33 << 4) | 8: return Piston::Piston(true, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (33 << 4) | 9: return Piston::Piston(true, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (33 << 4) | 10: return Piston::Piston(true, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (33 << 4) | 11: return Piston::Piston(true, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (33 << 4) | 12: return Piston::Piston(true, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (33 << 4) | 13: return Piston::Piston(true, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (34 << 4) | 0: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Normal);\n\t\t\tcase (34 << 4) | 1: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Normal);\n\t\t\tcase (34 << 4) | 2: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Normal);\n\t\t\tcase (34 << 4) | 3: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Normal);\n\t\t\tcase (34 << 4) | 4: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Normal);\n\t\t\tcase (34 << 4) | 5: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Normal);\n\t\t\tcase (34 << 4) | 8: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YM, false, PistonHead::Type::Sticky);\n\t\t\tcase (34 << 4) | 9: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_YP, false, PistonHead::Type::Sticky);\n\t\t\tcase (34 << 4) | 10: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZM, false, PistonHead::Type::Sticky);\n\t\t\tcase (34 << 4) | 11: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_ZP, false, PistonHead::Type::Sticky);\n\t\t\tcase (34 << 4) | 12: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XM, false, PistonHead::Type::Sticky);\n\t\t\tcase (34 << 4) | 13: return PistonHead::PistonHead(eBlockFace::BLOCK_FACE_XP, false, PistonHead::Type::Sticky);\n\t\t\tcase (35 << 4) | 0: return WhiteWool::WhiteWool();\n\t\t\tcase (35 << 4) | 1: return OrangeWool::OrangeWool();\n\t\t\tcase (35 << 4) | 2: return MagentaWool::MagentaWool();\n\t\t\tcase (35 << 4) | 3: return LightBlueWool::LightBlueWool();\n\t\t\tcase (35 << 4) | 4: return YellowWool::YellowWool();\n\t\t\tcase (35 << 4) | 5: return LimeWool::LimeWool();\n\t\t\tcase (35 << 4) | 6: return PinkWool::PinkWool();\n\t\t\tcase (35 << 4) | 7: return GrayWool::GrayWool();\n\t\t\tcase (35 << 4) | 8: return LightGrayWool::LightGrayWool();\n\t\t\tcase (35 << 4) | 9: return CyanWool::CyanWool();\n\t\t\tcase (35 << 4) | 10: return PurpleWool::PurpleWool();\n\t\t\tcase (35 << 4) | 11: return BlueWool::BlueWool();\n\t\t\tcase (35 << 4) | 12: return BrownWool::BrownWool();\n\t\t\tcase (35 << 4) | 13: return GreenWool::GreenWool();\n\t\t\tcase (35 << 4) | 14: return RedWool::RedWool();\n\t\t\tcase (35 << 4) | 15: return BlackWool::BlackWool();\n\t\t\tcase (36 << 4) | 0: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Normal);\n\t\t\tcase (36 << 4) | 1: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Normal);\n\t\t\tcase (36 << 4) | 2: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Normal);\n\t\t\tcase (36 << 4) | 3: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Normal);\n\t\t\tcase (36 << 4) | 4: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Normal);\n\t\t\tcase (36 << 4) | 5: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Normal);\n\t\t\tcase (36 << 4) | 8: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YM, MovingPiston::Type::Sticky);\n\t\t\tcase (36 << 4) | 9: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_YP, MovingPiston::Type::Sticky);\n\t\t\tcase (36 << 4) | 10: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZM, MovingPiston::Type::Sticky);\n\t\t\tcase (36 << 4) | 11: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_ZP, MovingPiston::Type::Sticky);\n\t\t\tcase (36 << 4) | 12: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XM, MovingPiston::Type::Sticky);\n\t\t\tcase (36 << 4) | 13: return MovingPiston::MovingPiston(eBlockFace::BLOCK_FACE_XP, MovingPiston::Type::Sticky);\n\t\t\tcase (37 << 4) | 0: return Dandelion::Dandelion();\n\t\t\tcase (38 << 4) | 0: return Poppy::Poppy();\n\t\t\tcase (38 << 4) | 1: return BlueOrchid::BlueOrchid();\n\t\t\tcase (38 << 4) | 2: return Allium::Allium();\n\t\t\tcase (38 << 4) | 3: return AzureBluet::AzureBluet();\n\t\t\tcase (38 << 4) | 4: return RedTulip::RedTulip();\n\t\t\tcase (38 << 4) | 5: return OrangeTulip::OrangeTulip();\n\t\t\tcase (38 << 4) | 6: return WhiteTulip::WhiteTulip();\n\t\t\tcase (38 << 4) | 7: return PinkTulip::PinkTulip();\n\t\t\tcase (38 << 4) | 8: return OxeyeDaisy::OxeyeDaisy();\n\t\t\tcase (39 << 4) | 0: return BrownMushroom::BrownMushroom();\n\t\t\tcase (40 << 4) | 0: return RedMushroom::RedMushroom();\n\t\t\tcase (41 << 4) | 0: return GoldBlock::GoldBlock();\n\t\t\tcase (42 << 4) | 0: return IronBlock::IronBlock();\n\t\t\tcase (43 << 4) | 0: return StoneSlab::StoneSlab(StoneSlab::Type::Double);\n\t\t\tcase (43 << 4) | 1: return SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Double);\n\t\t\tcase (43 << 4) | 2: return PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Double);\n\t\t\tcase (43 << 4) | 3: return CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Double);\n\t\t\tcase (43 << 4) | 4: return BrickSlab::BrickSlab(BrickSlab::Type::Double);\n\t\t\tcase (43 << 4) | 5: return StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Double);\n\t\t\tcase (43 << 4) | 6: return NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Double);\n\t\t\tcase (43 << 4) | 7: return QuartzSlab::QuartzSlab(QuartzSlab::Type::Double);\n\t\t\tcase (43 << 4) | 8: return SmoothStone::SmoothStone();\n\t\t\tcase (43 << 4) | 9: return SmoothSandstone::SmoothSandstone();\n\t\t\tcase (43 << 4) | 10: return PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Double);\n\t\t\tcase (43 << 4) | 11: return CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Double);\n\t\t\tcase (43 << 4) | 12: return BrickSlab::BrickSlab(BrickSlab::Type::Double);\n\t\t\tcase (43 << 4) | 13: return StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Double);\n\t\t\tcase (43 << 4) | 14: return NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Double);\n\t\t\tcase (43 << 4) | 15: return SmoothQuartz::SmoothQuartz();\n\t\t\tcase (44 << 4) | 0: return StoneSlab::StoneSlab(StoneSlab::Type::Bottom);\n\t\t\tcase (44 << 4) | 1: return SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Bottom);\n\t\t\tcase (44 << 4) | 2: return PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Bottom);\n\t\t\tcase (44 << 4) | 3: return CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Bottom);\n\t\t\tcase (44 << 4) | 4: return BrickSlab::BrickSlab(BrickSlab::Type::Bottom);\n\t\t\tcase (44 << 4) | 5: return StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Bottom);\n\t\t\tcase (44 << 4) | 6: return NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Bottom);\n\t\t\tcase (44 << 4) | 7: return QuartzSlab::QuartzSlab(QuartzSlab::Type::Bottom);\n\t\t\tcase (44 << 4) | 8: return StoneSlab::StoneSlab(StoneSlab::Type::Top);\n\t\t\tcase (44 << 4) | 9: return SandstoneSlab::SandstoneSlab(SandstoneSlab::Type::Top);\n\t\t\tcase (44 << 4) | 10: return PetrifiedOakSlab::PetrifiedOakSlab(PetrifiedOakSlab::Type::Top);\n\t\t\tcase (44 << 4) | 11: return CobblestoneSlab::CobblestoneSlab(CobblestoneSlab::Type::Top);\n\t\t\tcase (44 << 4) | 12: return BrickSlab::BrickSlab(BrickSlab::Type::Top);\n\t\t\tcase (44 << 4) | 13: return StoneBrickSlab::StoneBrickSlab(StoneBrickSlab::Type::Top);\n\t\t\tcase (44 << 4) | 14: return NetherBrickSlab::NetherBrickSlab(NetherBrickSlab::Type::Top);\n\t\t\tcase (44 << 4) | 15: return QuartzSlab::QuartzSlab(QuartzSlab::Type::Top);\n\t\t\tcase (45 << 4) | 0: return Bricks::Bricks();\n\t\t\tcase (46 << 4) | 0: return TNT::TNT(false);\n\t\t\tcase (46 << 4) | 1: return TNT::TNT(true);\n\t\t\tcase (47 << 4) | 0: return Bookshelf::Bookshelf();\n\t\t\tcase (48 << 4) | 0: return MossyCobblestone::MossyCobblestone();\n\t\t\tcase (49 << 4) | 0: return Obsidian::Obsidian();\n\t\t\tcase (50 << 4) | 1: return WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (50 << 4) | 2: return WallTorch::WallTorch(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (50 << 4) | 3: return WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (50 << 4) | 4: return WallTorch::WallTorch(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (50 << 4) | 5: return Torch::Torch();\n\t\t\tcase (51 << 4) | 0: return Fire::Fire(0, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 1: return Fire::Fire(1, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 2: return Fire::Fire(2, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 3: return Fire::Fire(3, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 4: return Fire::Fire(4, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 5: return Fire::Fire(5, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 6: return Fire::Fire(6, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 7: return Fire::Fire(7, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 8: return Fire::Fire(8, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 9: return Fire::Fire(9, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 10: return Fire::Fire(10, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 11: return Fire::Fire(11, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 12: return Fire::Fire(12, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 13: return Fire::Fire(13, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 14: return Fire::Fire(14, false, false, false, false, false);\n\t\t\tcase (51 << 4) | 15: return Fire::Fire(15, false, false, false, false, false);\n\t\t\tcase (52 << 4) | 0: return Spawner::Spawner();\n\t\t\tcase (53 << 4) | 0: return OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Bottom, OakStairs::Shape::Straight);\n\t\t\tcase (53 << 4) | 1: return OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Bottom, OakStairs::Shape::Straight);\n\t\t\tcase (53 << 4) | 2: return OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Bottom, OakStairs::Shape::Straight);\n\t\t\tcase (53 << 4) | 3: return OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Bottom, OakStairs::Shape::Straight);\n\t\t\tcase (53 << 4) | 4: return OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XP, OakStairs::Half::Top, OakStairs::Shape::Straight);\n\t\t\tcase (53 << 4) | 5: return OakStairs::OakStairs(eBlockFace::BLOCK_FACE_XM, OakStairs::Half::Top, OakStairs::Shape::Straight);\n\t\t\tcase (53 << 4) | 6: return OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZP, OakStairs::Half::Top, OakStairs::Shape::Straight);\n\t\t\tcase (53 << 4) | 7: return OakStairs::OakStairs(eBlockFace::BLOCK_FACE_ZM, OakStairs::Half::Top, OakStairs::Shape::Straight);\n\t\t\tcase (54 << 4) | 2: return Chest::Chest(eBlockFace::BLOCK_FACE_ZM, Chest::Type::Single);\n\t\t\tcase (54 << 4) | 3: return Chest::Chest(eBlockFace::BLOCK_FACE_ZP, Chest::Type::Single);\n\t\t\tcase (54 << 4) | 4: return Chest::Chest(eBlockFace::BLOCK_FACE_XM, Chest::Type::Single);\n\t\t\tcase (54 << 4) | 5: return Chest::Chest(eBlockFace::BLOCK_FACE_XP, Chest::Type::Single);\n\t\t\tcase (55 << 4) | 0: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 0, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 1: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 1, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 2: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 2, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 3: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 3, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 4: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 4, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 5: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 5, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 6: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 6, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 7: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 7, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 8: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 8, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 9: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 9, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 10: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 10, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 11: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 11, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 12: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 12, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 13: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 13, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 14: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 14, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (55 << 4) | 15: return RedstoneWire::RedstoneWire(RedstoneWire::East::None, RedstoneWire::North::None, 15, RedstoneWire::South::None, RedstoneWire::West::None);\n\t\t\tcase (56 << 4) | 0: return DiamondOre::DiamondOre();\n\t\t\tcase (57 << 4) | 0: return DiamondBlock::DiamondBlock();\n\t\t\tcase (58 << 4) | 0: return CraftingTable::CraftingTable();\n\t\t\tcase (59 << 4) | 0: return Wheat::Wheat(0);\n\t\t\tcase (59 << 4) | 1: return Wheat::Wheat(1);\n\t\t\tcase (59 << 4) | 2: return Wheat::Wheat(2);\n\t\t\tcase (59 << 4) | 3: return Wheat::Wheat(3);\n\t\t\tcase (59 << 4) | 4: return Wheat::Wheat(4);\n\t\t\tcase (59 << 4) | 5: return Wheat::Wheat(5);\n\t\t\tcase (59 << 4) | 6: return Wheat::Wheat(6);\n\t\t\tcase (59 << 4) | 7: return Wheat::Wheat(7);\n\t\t\tcase (60 << 4) | 0: return Farmland::Farmland(0);\n\t\t\tcase (60 << 4) | 1: return Farmland::Farmland(1);\n\t\t\tcase (60 << 4) | 2: return Farmland::Farmland(2);\n\t\t\tcase (60 << 4) | 3: return Farmland::Farmland(3);\n\t\t\tcase (60 << 4) | 4: return Farmland::Farmland(4);\n\t\t\tcase (60 << 4) | 5: return Farmland::Farmland(5);\n\t\t\tcase (60 << 4) | 6: return Farmland::Farmland(6);\n\t\t\tcase (60 << 4) | 7: return Farmland::Farmland(7);\n\t\t\tcase (61 << 4) | 2: return Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (61 << 4) | 3: return Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (61 << 4) | 4: return Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (61 << 4) | 5: return Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (62 << 4) | 2: return Furnace::Furnace(eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (62 << 4) | 3: return Furnace::Furnace(eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (62 << 4) | 4: return Furnace::Furnace(eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (62 << 4) | 5: return Furnace::Furnace(eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (63 << 4) | 0: return OakSign::OakSign(0);\n\t\t\tcase (63 << 4) | 1: return OakSign::OakSign(1);\n\t\t\tcase (63 << 4) | 2: return OakSign::OakSign(2);\n\t\t\tcase (63 << 4) | 3: return OakSign::OakSign(3);\n\t\t\tcase (63 << 4) | 4: return OakSign::OakSign(4);\n\t\t\tcase (63 << 4) | 5: return OakSign::OakSign(5);\n\t\t\tcase (63 << 4) | 6: return OakSign::OakSign(6);\n\t\t\tcase (63 << 4) | 7: return OakSign::OakSign(7);\n\t\t\tcase (63 << 4) | 8: return OakSign::OakSign(8);\n\t\t\tcase (63 << 4) | 9: return OakSign::OakSign(9);\n\t\t\tcase (63 << 4) | 10: return OakSign::OakSign(10);\n\t\t\tcase (63 << 4) | 11: return OakSign::OakSign(11);\n\t\t\tcase (63 << 4) | 12: return OakSign::OakSign(12);\n\t\t\tcase (63 << 4) | 13: return OakSign::OakSign(13);\n\t\t\tcase (63 << 4) | 14: return OakSign::OakSign(14);\n\t\t\tcase (63 << 4) | 15: return OakSign::OakSign(15);\n\t\t\tcase (64 << 4) | 0: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false);\n\t\t\tcase (64 << 4) | 1: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false);\n\t\t\tcase (64 << 4) | 2: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false);\n\t\t\tcase (64 << 4) | 3: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, false, false);\n\t\t\tcase (64 << 4) | 4: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false);\n\t\t\tcase (64 << 4) | 5: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false);\n\t\t\tcase (64 << 4) | 6: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false);\n\t\t\tcase (64 << 4) | 7: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Lower, OakDoor::Hinge::Right, true, false);\n\t\t\tcase (64 << 4) | 8: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, false);\n\t\t\tcase (64 << 4) | 9: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, false);\n\t\t\tcase (64 << 4) | 10: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, false, true);\n\t\t\tcase (64 << 4) | 11: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Right, false, true);\n\t\t\tcase (64 << 4) | 12: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false);\n\t\t\tcase (64 << 4) | 13: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZP, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false);\n\t\t\tcase (64 << 4) | 14: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_XM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false);\n\t\t\tcase (64 << 4) | 15: return OakDoor::OakDoor(eBlockFace::BLOCK_FACE_ZM, OakDoor::Half::Upper, OakDoor::Hinge::Left, true, false);\n\t\t\tcase (65 << 4) | 2: return Ladder::Ladder(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (65 << 4) | 3: return Ladder::Ladder(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (65 << 4) | 4: return Ladder::Ladder(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (65 << 4) | 5: return Ladder::Ladder(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (66 << 4) | 0: return Rail::Rail(Rail::Shape::NorthSouth);\n\t\t\tcase (66 << 4) | 1: return Rail::Rail(Rail::Shape::EastWest);\n\t\t\tcase (66 << 4) | 2: return Rail::Rail(Rail::Shape::AscendingEast);\n\t\t\tcase (66 << 4) | 3: return Rail::Rail(Rail::Shape::AscendingWest);\n\t\t\tcase (66 << 4) | 4: return Rail::Rail(Rail::Shape::AscendingNorth);\n\t\t\tcase (66 << 4) | 5: return Rail::Rail(Rail::Shape::AscendingSouth);\n\t\t\tcase (66 << 4) | 6: return Rail::Rail(Rail::Shape::SouthEast);\n\t\t\tcase (66 << 4) | 7: return Rail::Rail(Rail::Shape::SouthWest);\n\t\t\tcase (66 << 4) | 8: return Rail::Rail(Rail::Shape::NorthWest);\n\t\t\tcase (66 << 4) | 9: return Rail::Rail(Rail::Shape::NorthEast);\n\t\t\tcase (67 << 4) | 0: return CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight);\n\t\t\tcase (67 << 4) | 1: return CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight);\n\t\t\tcase (67 << 4) | 2: return CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight);\n\t\t\tcase (67 << 4) | 3: return CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Bottom, CobblestoneStairs::Shape::Straight);\n\t\t\tcase (67 << 4) | 4: return CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight);\n\t\t\tcase (67 << 4) | 5: return CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_XM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight);\n\t\t\tcase (67 << 4) | 6: return CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZP, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight);\n\t\t\tcase (67 << 4) | 7: return CobblestoneStairs::CobblestoneStairs(eBlockFace::BLOCK_FACE_ZM, CobblestoneStairs::Half::Top, CobblestoneStairs::Shape::Straight);\n\t\t\tcase (68 << 4) | 2: return OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (68 << 4) | 3: return OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (68 << 4) | 4: return OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (68 << 4) | 5: return OakWallSign::OakWallSign(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (69 << 4) | 0: return Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (69 << 4) | 1: return Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (69 << 4) | 2: return Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (69 << 4) | 3: return Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (69 << 4) | 4: return Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (69 << 4) | 5: return Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (69 << 4) | 6: return Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (69 << 4) | 7: return Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (69 << 4) | 8: return Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (69 << 4) | 9: return Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (69 << 4) | 10: return Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (69 << 4) | 11: return Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (69 << 4) | 12: return Lever::Lever(Lever::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (69 << 4) | 13: return Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (69 << 4) | 14: return Lever::Lever(Lever::Face::Floor, eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (69 << 4) | 15: return Lever::Lever(Lever::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (70 << 4) | 0: return StonePressurePlate::StonePressurePlate(false);\n\t\t\tcase (70 << 4) | 1: return StonePressurePlate::StonePressurePlate(true);\n\t\t\tcase (71 << 4) | 0: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false);\n\t\t\tcase (71 << 4) | 1: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false);\n\t\t\tcase (71 << 4) | 2: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false);\n\t\t\tcase (71 << 4) | 3: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, false, false);\n\t\t\tcase (71 << 4) | 4: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false);\n\t\t\tcase (71 << 4) | 5: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false);\n\t\t\tcase (71 << 4) | 6: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false);\n\t\t\tcase (71 << 4) | 7: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Lower, IronDoor::Hinge::Right, true, false);\n\t\t\tcase (71 << 4) | 8: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, false);\n\t\t\tcase (71 << 4) | 9: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, false);\n\t\t\tcase (71 << 4) | 10: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, false, true);\n\t\t\tcase (71 << 4) | 11: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Right, false, true);\n\t\t\tcase (71 << 4) | 12: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false);\n\t\t\tcase (71 << 4) | 13: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZP, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false);\n\t\t\tcase (71 << 4) | 14: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_XM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false);\n\t\t\tcase (71 << 4) | 15: return IronDoor::IronDoor(eBlockFace::BLOCK_FACE_ZM, IronDoor::Half::Upper, IronDoor::Hinge::Left, true, false);\n\t\t\tcase (72 << 4) | 0: return OakPressurePlate::OakPressurePlate(false);\n\t\t\tcase (72 << 4) | 1: return OakPressurePlate::OakPressurePlate(true);\n\t\t\tcase (73 << 4) | 0: return RedstoneOre::RedstoneOre(false);\n\t\t\tcase (74 << 4) | 0: return RedstoneOre::RedstoneOre(true);\n\t\t\tcase (75 << 4) | 1: return RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (75 << 4) | 2: return RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (75 << 4) | 3: return RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (75 << 4) | 4: return RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (75 << 4) | 5: return RedstoneTorch::RedstoneTorch(false);\n\t\t\tcase (76 << 4) | 1: return RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (76 << 4) | 2: return RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (76 << 4) | 3: return RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (76 << 4) | 4: return RedstoneWallTorch::RedstoneWallTorch(eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (76 << 4) | 5: return RedstoneTorch::RedstoneTorch(true);\n\t\t\tcase (77 << 4) | 0: return StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (77 << 4) | 1: return StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (77 << 4) | 2: return StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (77 << 4) | 3: return StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (77 << 4) | 4: return StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (77 << 4) | 5: return StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (77 << 4) | 8: return StoneButton::StoneButton(StoneButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (77 << 4) | 9: return StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (77 << 4) | 10: return StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (77 << 4) | 11: return StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (77 << 4) | 12: return StoneButton::StoneButton(StoneButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (77 << 4) | 13: return StoneButton::StoneButton(StoneButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (78 << 4) | 0: return Snow::Snow(1);\n\t\t\tcase (78 << 4) | 1: return Snow::Snow(2);\n\t\t\tcase (78 << 4) | 2: return Snow::Snow(3);\n\t\t\tcase (78 << 4) | 3: return Snow::Snow(4);\n\t\t\tcase (78 << 4) | 4: return Snow::Snow(5);\n\t\t\tcase (78 << 4) | 5: return Snow::Snow(6);\n\t\t\tcase (78 << 4) | 6: return Snow::Snow(7);\n\t\t\tcase (78 << 4) | 7: return Snow::Snow(8);\n\t\t\tcase (79 << 4) | 0: return Ice::Ice();\n\t\t\tcase (80 << 4) | 0: return SnowBlock::SnowBlock();\n\t\t\tcase (81 << 4) | 0: return Cactus::Cactus(0);\n\t\t\tcase (81 << 4) | 1: return Cactus::Cactus(1);\n\t\t\tcase (81 << 4) | 2: return Cactus::Cactus(2);\n\t\t\tcase (81 << 4) | 3: return Cactus::Cactus(3);\n\t\t\tcase (81 << 4) | 4: return Cactus::Cactus(4);\n\t\t\tcase (81 << 4) | 5: return Cactus::Cactus(5);\n\t\t\tcase (81 << 4) | 6: return Cactus::Cactus(6);\n\t\t\tcase (81 << 4) | 7: return Cactus::Cactus(7);\n\t\t\tcase (81 << 4) | 8: return Cactus::Cactus(8);\n\t\t\tcase (81 << 4) | 9: return Cactus::Cactus(9);\n\t\t\tcase (81 << 4) | 10: return Cactus::Cactus(10);\n\t\t\tcase (81 << 4) | 11: return Cactus::Cactus(11);\n\t\t\tcase (81 << 4) | 12: return Cactus::Cactus(12);\n\t\t\tcase (81 << 4) | 13: return Cactus::Cactus(13);\n\t\t\tcase (81 << 4) | 14: return Cactus::Cactus(14);\n\t\t\tcase (81 << 4) | 15: return Cactus::Cactus(15);\n\t\t\tcase (82 << 4) | 0: return Clay::Clay();\n\t\t\tcase (83 << 4) | 0: return SugarCane::SugarCane(0);\n\t\t\tcase (83 << 4) | 1: return SugarCane::SugarCane(1);\n\t\t\tcase (83 << 4) | 2: return SugarCane::SugarCane(2);\n\t\t\tcase (83 << 4) | 3: return SugarCane::SugarCane(3);\n\t\t\tcase (83 << 4) | 4: return SugarCane::SugarCane(4);\n\t\t\tcase (83 << 4) | 5: return SugarCane::SugarCane(5);\n\t\t\tcase (83 << 4) | 6: return SugarCane::SugarCane(6);\n\t\t\tcase (83 << 4) | 7: return SugarCane::SugarCane(7);\n\t\t\tcase (83 << 4) | 8: return SugarCane::SugarCane(8);\n\t\t\tcase (83 << 4) | 9: return SugarCane::SugarCane(9);\n\t\t\tcase (83 << 4) | 10: return SugarCane::SugarCane(10);\n\t\t\tcase (83 << 4) | 11: return SugarCane::SugarCane(11);\n\t\t\tcase (83 << 4) | 12: return SugarCane::SugarCane(12);\n\t\t\tcase (83 << 4) | 13: return SugarCane::SugarCane(13);\n\t\t\tcase (83 << 4) | 14: return SugarCane::SugarCane(14);\n\t\t\tcase (83 << 4) | 15: return SugarCane::SugarCane(15);\n\t\t\tcase (84 << 4) | 0: return Jukebox::Jukebox(false);\n\t\t\tcase (84 << 4) | 1: return Jukebox::Jukebox(true);\n\t\t\tcase (85 << 4) | 0: return OakFence::OakFence(false, false, false, false);\n\t\t\tcase (86 << 4) | 0: return CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (86 << 4) | 1: return CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (86 << 4) | 2: return CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (86 << 4) | 3: return CarvedPumpkin::CarvedPumpkin(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (87 << 4) | 0: return Netherrack::Netherrack();\n\t\t\tcase (88 << 4) | 0: return SoulSand::SoulSand();\n\t\t\tcase (89 << 4) | 0: return Glowstone::Glowstone();\n\t\t\tcase (90 << 4) | 1: return NetherPortal::NetherPortal(NetherPortal::Axis::X);\n\t\t\tcase (90 << 4) | 2: return NetherPortal::NetherPortal(NetherPortal::Axis::Z);\n\t\t\tcase (91 << 4) | 0: return JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (91 << 4) | 1: return JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (91 << 4) | 2: return JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (91 << 4) | 3: return JackOLantern::JackOLantern(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (92 << 4) | 0: return Cake::Cake(0);\n\t\t\tcase (92 << 4) | 1: return Cake::Cake(1);\n\t\t\tcase (92 << 4) | 2: return Cake::Cake(2);\n\t\t\tcase (92 << 4) | 3: return Cake::Cake(3);\n\t\t\tcase (92 << 4) | 4: return Cake::Cake(4);\n\t\t\tcase (92 << 4) | 5: return Cake::Cake(5);\n\t\t\tcase (92 << 4) | 6: return Cake::Cake(6);\n\t\t\tcase (93 << 4) | 0: return Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, false);\n\t\t\tcase (93 << 4) | 1: return Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, false);\n\t\t\tcase (93 << 4) | 2: return Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, false);\n\t\t\tcase (93 << 4) | 3: return Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, false);\n\t\t\tcase (93 << 4) | 4: return Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, false);\n\t\t\tcase (93 << 4) | 5: return Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, false);\n\t\t\tcase (93 << 4) | 6: return Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, false);\n\t\t\tcase (93 << 4) | 7: return Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, false);\n\t\t\tcase (93 << 4) | 8: return Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, false);\n\t\t\tcase (93 << 4) | 9: return Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, false);\n\t\t\tcase (93 << 4) | 10: return Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, false);\n\t\t\tcase (93 << 4) | 11: return Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, false);\n\t\t\tcase (93 << 4) | 12: return Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, false);\n\t\t\tcase (93 << 4) | 13: return Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, false);\n\t\t\tcase (93 << 4) | 14: return Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, false);\n\t\t\tcase (93 << 4) | 15: return Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, false);\n\t\t\tcase (94 << 4) | 0: return Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZP, false, true);\n\t\t\tcase (94 << 4) | 1: return Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XM, false, true);\n\t\t\tcase (94 << 4) | 2: return Repeater::Repeater(1, eBlockFace::BLOCK_FACE_ZM, false, true);\n\t\t\tcase (94 << 4) | 3: return Repeater::Repeater(1, eBlockFace::BLOCK_FACE_XP, false, true);\n\t\t\tcase (94 << 4) | 4: return Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZP, false, true);\n\t\t\tcase (94 << 4) | 5: return Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XM, false, true);\n\t\t\tcase (94 << 4) | 6: return Repeater::Repeater(2, eBlockFace::BLOCK_FACE_ZM, false, true);\n\t\t\tcase (94 << 4) | 7: return Repeater::Repeater(2, eBlockFace::BLOCK_FACE_XP, false, true);\n\t\t\tcase (94 << 4) | 8: return Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZP, false, true);\n\t\t\tcase (94 << 4) | 9: return Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XM, false, true);\n\t\t\tcase (94 << 4) | 10: return Repeater::Repeater(3, eBlockFace::BLOCK_FACE_ZM, false, true);\n\t\t\tcase (94 << 4) | 11: return Repeater::Repeater(3, eBlockFace::BLOCK_FACE_XP, false, true);\n\t\t\tcase (94 << 4) | 12: return Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZP, false, true);\n\t\t\tcase (94 << 4) | 13: return Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XM, false, true);\n\t\t\tcase (94 << 4) | 14: return Repeater::Repeater(4, eBlockFace::BLOCK_FACE_ZM, false, true);\n\t\t\tcase (94 << 4) | 15: return Repeater::Repeater(4, eBlockFace::BLOCK_FACE_XP, false, true);\n\t\t\tcase (95 << 4) | 0: return WhiteStainedGlass::WhiteStainedGlass();\n\t\t\tcase (95 << 4) | 1: return OrangeStainedGlass::OrangeStainedGlass();\n\t\t\tcase (95 << 4) | 2: return MagentaStainedGlass::MagentaStainedGlass();\n\t\t\tcase (95 << 4) | 3: return LightBlueStainedGlass::LightBlueStainedGlass();\n\t\t\tcase (95 << 4) | 4: return YellowStainedGlass::YellowStainedGlass();\n\t\t\tcase (95 << 4) | 5: return LimeStainedGlass::LimeStainedGlass();\n\t\t\tcase (95 << 4) | 6: return PinkStainedGlass::PinkStainedGlass();\n\t\t\tcase (95 << 4) | 7: return GrayStainedGlass::GrayStainedGlass();\n\t\t\tcase (95 << 4) | 8: return LightGrayStainedGlass::LightGrayStainedGlass();\n\t\t\tcase (95 << 4) | 9: return CyanStainedGlass::CyanStainedGlass();\n\t\t\tcase (95 << 4) | 10: return PurpleStainedGlass::PurpleStainedGlass();\n\t\t\tcase (95 << 4) | 11: return BlueStainedGlass::BlueStainedGlass();\n\t\t\tcase (95 << 4) | 12: return BrownStainedGlass::BrownStainedGlass();\n\t\t\tcase (95 << 4) | 13: return GreenStainedGlass::GreenStainedGlass();\n\t\t\tcase (95 << 4) | 14: return RedStainedGlass::RedStainedGlass();\n\t\t\tcase (95 << 4) | 15: return BlackStainedGlass::BlackStainedGlass();\n\t\t\tcase (96 << 4) | 0: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, false, false);\n\t\t\tcase (96 << 4) | 1: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, false, false);\n\t\t\tcase (96 << 4) | 2: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, false, false);\n\t\t\tcase (96 << 4) | 3: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, false, false);\n\t\t\tcase (96 << 4) | 4: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Bottom, true, false);\n\t\t\tcase (96 << 4) | 5: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Bottom, true, false);\n\t\t\tcase (96 << 4) | 6: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Bottom, true, false);\n\t\t\tcase (96 << 4) | 7: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Bottom, true, false);\n\t\t\tcase (96 << 4) | 8: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, false, false);\n\t\t\tcase (96 << 4) | 9: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, false, false);\n\t\t\tcase (96 << 4) | 10: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, false, false);\n\t\t\tcase (96 << 4) | 11: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, false, false);\n\t\t\tcase (96 << 4) | 12: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZM, OakTrapdoor::Half::Top, true, false);\n\t\t\tcase (96 << 4) | 13: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_ZP, OakTrapdoor::Half::Top, true, false);\n\t\t\tcase (96 << 4) | 14: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XM, OakTrapdoor::Half::Top, true, false);\n\t\t\tcase (96 << 4) | 15: return OakTrapdoor::OakTrapdoor(eBlockFace::BLOCK_FACE_XP, OakTrapdoor::Half::Top, true, false);\n\t\t\tcase (97 << 4) | 0: return InfestedStone::InfestedStone();\n\t\t\tcase (97 << 4) | 1: return InfestedCobblestone::InfestedCobblestone();\n\t\t\tcase (97 << 4) | 2: return InfestedStoneBricks::InfestedStoneBricks();\n\t\t\tcase (97 << 4) | 3: return InfestedMossyStoneBricks::InfestedMossyStoneBricks();\n\t\t\tcase (97 << 4) | 4: return InfestedCrackedStoneBricks::InfestedCrackedStoneBricks();\n\t\t\tcase (97 << 4) | 5: return InfestedChiseledStoneBricks::InfestedChiseledStoneBricks();\n\t\t\tcase (98 << 4) | 0: return StoneBricks::StoneBricks();\n\t\t\tcase (98 << 4) | 1: return MossyStoneBricks::MossyStoneBricks();\n\t\t\tcase (98 << 4) | 2: return CrackedStoneBricks::CrackedStoneBricks();\n\t\t\tcase (98 << 4) | 3: return ChiseledStoneBricks::ChiseledStoneBricks();\n\t\t\tcase (99 << 4) | 0: return BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false);\n\t\t\tcase (99 << 4) | 1: return BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, true);\n\t\t\tcase (99 << 4) | 2: return BrownMushroomBlock::BrownMushroomBlock(false, false, true, false, true, false);\n\t\t\tcase (99 << 4) | 3: return BrownMushroomBlock::BrownMushroomBlock(false, true, true, false, true, false);\n\t\t\tcase (99 << 4) | 4: return BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, true);\n\t\t\tcase (99 << 4) | 5: return BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, true, false);\n\t\t\tcase (99 << 4) | 6: return BrownMushroomBlock::BrownMushroomBlock(false, true, false, false, true, false);\n\t\t\tcase (99 << 4) | 7: return BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, true);\n\t\t\tcase (99 << 4) | 8: return BrownMushroomBlock::BrownMushroomBlock(false, false, false, true, true, false);\n\t\t\tcase (99 << 4) | 9: return BrownMushroomBlock::BrownMushroomBlock(false, true, false, true, true, false);\n\t\t\tcase (99 << 4) | 10: return MushroomStem::MushroomStem(false, true, true, true, false, true);\n\t\t\tcase (99 << 4) | 11: return BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false);\n\t\t\tcase (99 << 4) | 12: return BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false);\n\t\t\tcase (99 << 4) | 13: return BrownMushroomBlock::BrownMushroomBlock(false, false, false, false, false, false);\n\t\t\tcase (99 << 4) | 14: return BrownMushroomBlock::BrownMushroomBlock(true, true, true, true, true, true);\n\t\t\tcase (99 << 4) | 15: return MushroomStem::MushroomStem(true, true, true, true, true, true);\n\t\t\tcase (100 << 4) | 0: return RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false);\n\t\t\tcase (100 << 4) | 1: return RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, true);\n\t\t\tcase (100 << 4) | 2: return RedMushroomBlock::RedMushroomBlock(false, false, true, false, true, false);\n\t\t\tcase (100 << 4) | 3: return RedMushroomBlock::RedMushroomBlock(false, true, true, false, true, false);\n\t\t\tcase (100 << 4) | 4: return RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, true);\n\t\t\tcase (100 << 4) | 5: return RedMushroomBlock::RedMushroomBlock(false, false, false, false, true, false);\n\t\t\tcase (100 << 4) | 6: return RedMushroomBlock::RedMushroomBlock(false, true, false, false, true, false);\n\t\t\tcase (100 << 4) | 7: return RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, true);\n\t\t\tcase (100 << 4) | 8: return RedMushroomBlock::RedMushroomBlock(false, false, false, true, true, false);\n\t\t\tcase (100 << 4) | 9: return RedMushroomBlock::RedMushroomBlock(false, true, false, true, true, false);\n\t\t\tcase (100 << 4) | 10: return MushroomStem::MushroomStem(false, true, true, true, false, true);\n\t\t\tcase (100 << 4) | 11: return RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false);\n\t\t\tcase (100 << 4) | 12: return RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false);\n\t\t\tcase (100 << 4) | 13: return RedMushroomBlock::RedMushroomBlock(false, false, false, false, false, false);\n\t\t\tcase (100 << 4) | 14: return RedMushroomBlock::RedMushroomBlock(true, true, true, true, true, true);\n\t\t\tcase (100 << 4) | 15: return MushroomStem::MushroomStem(true, true, true, true, true, true);\n\t\t\tcase (101 << 4) | 0: return IronBars::IronBars(false, false, false, false);\n\t\t\tcase (102 << 4) | 0: return GlassPane::GlassPane(false, false, false, false);\n\t\t\tcase (103 << 4) | 0: return Melon::Melon();\n\t\t\tcase (104 << 4) | 0: return PumpkinStem::PumpkinStem(0);\n\t\t\tcase (104 << 4) | 1: return PumpkinStem::PumpkinStem(1);\n\t\t\tcase (104 << 4) | 2: return PumpkinStem::PumpkinStem(2);\n\t\t\tcase (104 << 4) | 3: return PumpkinStem::PumpkinStem(3);\n\t\t\tcase (104 << 4) | 4: return PumpkinStem::PumpkinStem(4);\n\t\t\tcase (104 << 4) | 5: return PumpkinStem::PumpkinStem(5);\n\t\t\tcase (104 << 4) | 6: return PumpkinStem::PumpkinStem(6);\n\t\t\tcase (104 << 4) | 7: return PumpkinStem::PumpkinStem(7);\n\t\t\tcase (105 << 4) | 0: return MelonStem::MelonStem(0);\n\t\t\tcase (105 << 4) | 1: return MelonStem::MelonStem(1);\n\t\t\tcase (105 << 4) | 2: return MelonStem::MelonStem(2);\n\t\t\tcase (105 << 4) | 3: return MelonStem::MelonStem(3);\n\t\t\tcase (105 << 4) | 4: return MelonStem::MelonStem(4);\n\t\t\tcase (105 << 4) | 5: return MelonStem::MelonStem(5);\n\t\t\tcase (105 << 4) | 6: return MelonStem::MelonStem(6);\n\t\t\tcase (105 << 4) | 7: return MelonStem::MelonStem(7);\n\t\t\tcase (106 << 4) | 0: return Vine::Vine(false, false, false, true, false);\n\t\t\tcase (106 << 4) | 1: return Vine::Vine(false, false, true, true, false);\n\t\t\tcase (106 << 4) | 2: return Vine::Vine(false, false, false, true, true);\n\t\t\tcase (106 << 4) | 3: return Vine::Vine(false, false, true, true, true);\n\t\t\tcase (106 << 4) | 4: return Vine::Vine(false, true, false, true, false);\n\t\t\tcase (106 << 4) | 5: return Vine::Vine(false, true, true, true, false);\n\t\t\tcase (106 << 4) | 6: return Vine::Vine(false, true, false, true, true);\n\t\t\tcase (106 << 4) | 7: return Vine::Vine(false, true, true, true, true);\n\t\t\tcase (106 << 4) | 8: return Vine::Vine(true, false, false, true, false);\n\t\t\tcase (106 << 4) | 9: return Vine::Vine(true, false, true, true, false);\n\t\t\tcase (106 << 4) | 10: return Vine::Vine(true, false, false, true, true);\n\t\t\tcase (106 << 4) | 11: return Vine::Vine(true, false, true, true, true);\n\t\t\tcase (106 << 4) | 12: return Vine::Vine(true, true, false, true, false);\n\t\t\tcase (106 << 4) | 13: return Vine::Vine(true, true, true, true, false);\n\t\t\tcase (106 << 4) | 14: return Vine::Vine(true, true, false, true, true);\n\t\t\tcase (106 << 4) | 15: return Vine::Vine(true, true, true, true, true);\n\t\t\tcase (107 << 4) | 0: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false);\n\t\t\tcase (107 << 4) | 1: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false);\n\t\t\tcase (107 << 4) | 2: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false);\n\t\t\tcase (107 << 4) | 3: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false);\n\t\t\tcase (107 << 4) | 4: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false);\n\t\t\tcase (107 << 4) | 5: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false);\n\t\t\tcase (107 << 4) | 6: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false);\n\t\t\tcase (107 << 4) | 7: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false);\n\t\t\tcase (107 << 4) | 8: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true);\n\t\t\tcase (107 << 4) | 9: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true);\n\t\t\tcase (107 << 4) | 10: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true);\n\t\t\tcase (107 << 4) | 11: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true);\n\t\t\tcase (107 << 4) | 12: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true);\n\t\t\tcase (107 << 4) | 13: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true);\n\t\t\tcase (107 << 4) | 14: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true);\n\t\t\tcase (107 << 4) | 15: return OakFenceGate::OakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true);\n\t\t\tcase (108 << 4) | 0: return BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight);\n\t\t\tcase (108 << 4) | 1: return BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight);\n\t\t\tcase (108 << 4) | 2: return BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight);\n\t\t\tcase (108 << 4) | 3: return BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Bottom, BrickStairs::Shape::Straight);\n\t\t\tcase (108 << 4) | 4: return BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XP, BrickStairs::Half::Top, BrickStairs::Shape::Straight);\n\t\t\tcase (108 << 4) | 5: return BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_XM, BrickStairs::Half::Top, BrickStairs::Shape::Straight);\n\t\t\tcase (108 << 4) | 6: return BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZP, BrickStairs::Half::Top, BrickStairs::Shape::Straight);\n\t\t\tcase (108 << 4) | 7: return BrickStairs::BrickStairs(eBlockFace::BLOCK_FACE_ZM, BrickStairs::Half::Top, BrickStairs::Shape::Straight);\n\t\t\tcase (109 << 4) | 0: return StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight);\n\t\t\tcase (109 << 4) | 1: return StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight);\n\t\t\tcase (109 << 4) | 2: return StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight);\n\t\t\tcase (109 << 4) | 3: return StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Bottom, StoneBrickStairs::Shape::Straight);\n\t\t\tcase (109 << 4) | 4: return StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight);\n\t\t\tcase (109 << 4) | 5: return StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_XM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight);\n\t\t\tcase (109 << 4) | 6: return StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZP, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight);\n\t\t\tcase (109 << 4) | 7: return StoneBrickStairs::StoneBrickStairs(eBlockFace::BLOCK_FACE_ZM, StoneBrickStairs::Half::Top, StoneBrickStairs::Shape::Straight);\n\t\t\tcase (110 << 4) | 0: return Mycelium::Mycelium(false);\n\t\t\tcase (111 << 4) | 0: return LilyPad::LilyPad();\n\t\t\tcase (112 << 4) | 0: return NetherBricks::NetherBricks();\n\t\t\tcase (113 << 4) | 0: return NetherBrickFence::NetherBrickFence(false, false, false, false);\n\t\t\tcase (114 << 4) | 0: return NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight);\n\t\t\tcase (114 << 4) | 1: return NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight);\n\t\t\tcase (114 << 4) | 2: return NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight);\n\t\t\tcase (114 << 4) | 3: return NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Bottom, NetherBrickStairs::Shape::Straight);\n\t\t\tcase (114 << 4) | 4: return NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight);\n\t\t\tcase (114 << 4) | 5: return NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_XM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight);\n\t\t\tcase (114 << 4) | 6: return NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZP, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight);\n\t\t\tcase (114 << 4) | 7: return NetherBrickStairs::NetherBrickStairs(eBlockFace::BLOCK_FACE_ZM, NetherBrickStairs::Half::Top, NetherBrickStairs::Shape::Straight);\n\t\t\tcase (115 << 4) | 0: return NetherWart::NetherWart(0);\n\t\t\tcase (115 << 4) | 1: return NetherWart::NetherWart(1);\n\t\t\tcase (115 << 4) | 2: return NetherWart::NetherWart(2);\n\t\t\tcase (115 << 4) | 3: return NetherWart::NetherWart(3);\n\t\t\tcase (116 << 4) | 0: return EnchantingTable::EnchantingTable();\n\t\t\tcase (117 << 4) | 0: return BrewingStand::BrewingStand(false, false, false);\n\t\t\tcase (117 << 4) | 1: return BrewingStand::BrewingStand(true, false, false);\n\t\t\tcase (117 << 4) | 2: return BrewingStand::BrewingStand(false, true, false);\n\t\t\tcase (117 << 4) | 3: return BrewingStand::BrewingStand(true, true, false);\n\t\t\tcase (117 << 4) | 4: return BrewingStand::BrewingStand(false, false, true);\n\t\t\tcase (117 << 4) | 5: return BrewingStand::BrewingStand(true, false, true);\n\t\t\tcase (117 << 4) | 6: return BrewingStand::BrewingStand(false, true, true);\n\t\t\tcase (117 << 4) | 7: return BrewingStand::BrewingStand(true, true, true);\n\t\t\tcase (118 << 4) | 0: return Cauldron::Cauldron(0);\n\t\t\tcase (118 << 4) | 1: return Cauldron::Cauldron(1);\n\t\t\tcase (118 << 4) | 2: return Cauldron::Cauldron(2);\n\t\t\tcase (118 << 4) | 3: return Cauldron::Cauldron(3);\n\t\t\tcase (119 << 4) | 0: return EndPortal::EndPortal();\n\t\t\tcase (120 << 4) | 0: return EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (120 << 4) | 1: return EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (120 << 4) | 2: return EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (120 << 4) | 3: return EndPortalFrame::EndPortalFrame(false, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (120 << 4) | 4: return EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (120 << 4) | 5: return EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (120 << 4) | 6: return EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (120 << 4) | 7: return EndPortalFrame::EndPortalFrame(true, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (121 << 4) | 0: return EndStone::EndStone();\n\t\t\tcase (122 << 4) | 0: return DragonEgg::DragonEgg();\n\t\t\tcase (123 << 4) | 0: return RedstoneLamp::RedstoneLamp(false);\n\t\t\tcase (124 << 4) | 0: return RedstoneLamp::RedstoneLamp(true);\n\t\t\tcase (125 << 4) | 0: return OakSlab::OakSlab(OakSlab::Type::Double);\n\t\t\tcase (125 << 4) | 1: return SpruceSlab::SpruceSlab(SpruceSlab::Type::Double);\n\t\t\tcase (125 << 4) | 2: return BirchSlab::BirchSlab(BirchSlab::Type::Double);\n\t\t\tcase (125 << 4) | 3: return JungleSlab::JungleSlab(JungleSlab::Type::Double);\n\t\t\tcase (125 << 4) | 4: return AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Double);\n\t\t\tcase (125 << 4) | 5: return DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Double);\n\t\t\tcase (126 << 4) | 0: return OakSlab::OakSlab(OakSlab::Type::Bottom);\n\t\t\tcase (126 << 4) | 1: return SpruceSlab::SpruceSlab(SpruceSlab::Type::Bottom);\n\t\t\tcase (126 << 4) | 2: return BirchSlab::BirchSlab(BirchSlab::Type::Bottom);\n\t\t\tcase (126 << 4) | 3: return JungleSlab::JungleSlab(JungleSlab::Type::Bottom);\n\t\t\tcase (126 << 4) | 4: return AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Bottom);\n\t\t\tcase (126 << 4) | 5: return DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Bottom);\n\t\t\tcase (126 << 4) | 8: return OakSlab::OakSlab(OakSlab::Type::Top);\n\t\t\tcase (126 << 4) | 9: return SpruceSlab::SpruceSlab(SpruceSlab::Type::Top);\n\t\t\tcase (126 << 4) | 10: return BirchSlab::BirchSlab(BirchSlab::Type::Top);\n\t\t\tcase (126 << 4) | 11: return JungleSlab::JungleSlab(JungleSlab::Type::Top);\n\t\t\tcase (126 << 4) | 12: return AcaciaSlab::AcaciaSlab(AcaciaSlab::Type::Top);\n\t\t\tcase (126 << 4) | 13: return DarkOakSlab::DarkOakSlab(DarkOakSlab::Type::Top);\n\t\t\tcase (127 << 4) | 0: return Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (127 << 4) | 1: return Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (127 << 4) | 2: return Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (127 << 4) | 3: return Cocoa::Cocoa(0, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (127 << 4) | 4: return Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (127 << 4) | 5: return Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (127 << 4) | 6: return Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (127 << 4) | 7: return Cocoa::Cocoa(1, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (127 << 4) | 8: return Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (127 << 4) | 9: return Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (127 << 4) | 10: return Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (127 << 4) | 11: return Cocoa::Cocoa(2, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (128 << 4) | 0: return SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight);\n\t\t\tcase (128 << 4) | 1: return SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight);\n\t\t\tcase (128 << 4) | 2: return SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight);\n\t\t\tcase (128 << 4) | 3: return SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Bottom, SandstoneStairs::Shape::Straight);\n\t\t\tcase (128 << 4) | 4: return SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight);\n\t\t\tcase (128 << 4) | 5: return SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_XM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight);\n\t\t\tcase (128 << 4) | 6: return SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZP, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight);\n\t\t\tcase (128 << 4) | 7: return SandstoneStairs::SandstoneStairs(eBlockFace::BLOCK_FACE_ZM, SandstoneStairs::Half::Top, SandstoneStairs::Shape::Straight);\n\t\t\tcase (129 << 4) | 0: return EmeraldOre::EmeraldOre();\n\t\t\tcase (130 << 4) | 2: return EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (130 << 4) | 3: return EnderChest::EnderChest(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (130 << 4) | 4: return EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (130 << 4) | 5: return EnderChest::EnderChest(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (131 << 4) | 0: return TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (131 << 4) | 1: return TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (131 << 4) | 2: return TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (131 << 4) | 3: return TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (131 << 4) | 4: return TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (131 << 4) | 5: return TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (131 << 4) | 6: return TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (131 << 4) | 7: return TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (131 << 4) | 8: return TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (131 << 4) | 9: return TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (131 << 4) | 10: return TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (131 << 4) | 11: return TripwireHook::TripwireHook(false, eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (131 << 4) | 12: return TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (131 << 4) | 13: return TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (131 << 4) | 14: return TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (131 << 4) | 15: return TripwireHook::TripwireHook(true, eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (132 << 4) | 0: return Tripwire::Tripwire(false, false, false, false, false, false, false);\n\t\t\tcase (132 << 4) | 1: return Tripwire::Tripwire(false, false, false, false, true, false, false);\n\t\t\tcase (132 << 4) | 2: return Tripwire::Tripwire(false, false, false, false, false, false, false);\n\t\t\tcase (132 << 4) | 3: return Tripwire::Tripwire(false, false, false, false, true, false, false);\n\t\t\tcase (132 << 4) | 4: return Tripwire::Tripwire(true, false, false, false, false, false, false);\n\t\t\tcase (132 << 4) | 5: return Tripwire::Tripwire(true, false, false, false, true, false, false);\n\t\t\tcase (132 << 4) | 6: return Tripwire::Tripwire(true, false, false, false, false, false, false);\n\t\t\tcase (132 << 4) | 7: return Tripwire::Tripwire(true, false, false, false, true, false, false);\n\t\t\tcase (132 << 4) | 8: return Tripwire::Tripwire(false, true, false, false, false, false, false);\n\t\t\tcase (132 << 4) | 9: return Tripwire::Tripwire(false, true, false, false, true, false, false);\n\t\t\tcase (132 << 4) | 10: return Tripwire::Tripwire(false, true, false, false, false, false, false);\n\t\t\tcase (132 << 4) | 11: return Tripwire::Tripwire(false, true, false, false, true, false, false);\n\t\t\tcase (132 << 4) | 12: return Tripwire::Tripwire(true, true, false, false, false, false, false);\n\t\t\tcase (132 << 4) | 13: return Tripwire::Tripwire(true, true, false, false, true, false, false);\n\t\t\tcase (132 << 4) | 14: return Tripwire::Tripwire(true, true, false, false, false, false, false);\n\t\t\tcase (133 << 4) | 0: return EmeraldBlock::EmeraldBlock();\n\t\t\tcase (134 << 4) | 0: return SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight);\n\t\t\tcase (134 << 4) | 1: return SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight);\n\t\t\tcase (134 << 4) | 2: return SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight);\n\t\t\tcase (134 << 4) | 3: return SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Bottom, SpruceStairs::Shape::Straight);\n\t\t\tcase (134 << 4) | 4: return SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight);\n\t\t\tcase (134 << 4) | 5: return SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_XM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight);\n\t\t\tcase (134 << 4) | 6: return SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZP, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight);\n\t\t\tcase (134 << 4) | 7: return SpruceStairs::SpruceStairs(eBlockFace::BLOCK_FACE_ZM, SpruceStairs::Half::Top, SpruceStairs::Shape::Straight);\n\t\t\tcase (135 << 4) | 0: return BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight);\n\t\t\tcase (135 << 4) | 1: return BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight);\n\t\t\tcase (135 << 4) | 2: return BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight);\n\t\t\tcase (135 << 4) | 3: return BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Bottom, BirchStairs::Shape::Straight);\n\t\t\tcase (135 << 4) | 4: return BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XP, BirchStairs::Half::Top, BirchStairs::Shape::Straight);\n\t\t\tcase (135 << 4) | 5: return BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_XM, BirchStairs::Half::Top, BirchStairs::Shape::Straight);\n\t\t\tcase (135 << 4) | 6: return BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZP, BirchStairs::Half::Top, BirchStairs::Shape::Straight);\n\t\t\tcase (135 << 4) | 7: return BirchStairs::BirchStairs(eBlockFace::BLOCK_FACE_ZM, BirchStairs::Half::Top, BirchStairs::Shape::Straight);\n\t\t\tcase (136 << 4) | 0: return JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight);\n\t\t\tcase (136 << 4) | 1: return JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight);\n\t\t\tcase (136 << 4) | 2: return JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight);\n\t\t\tcase (136 << 4) | 3: return JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Bottom, JungleStairs::Shape::Straight);\n\t\t\tcase (136 << 4) | 4: return JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XP, JungleStairs::Half::Top, JungleStairs::Shape::Straight);\n\t\t\tcase (136 << 4) | 5: return JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_XM, JungleStairs::Half::Top, JungleStairs::Shape::Straight);\n\t\t\tcase (136 << 4) | 6: return JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZP, JungleStairs::Half::Top, JungleStairs::Shape::Straight);\n\t\t\tcase (136 << 4) | 7: return JungleStairs::JungleStairs(eBlockFace::BLOCK_FACE_ZM, JungleStairs::Half::Top, JungleStairs::Shape::Straight);\n\t\t\tcase (137 << 4) | 0: return CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (137 << 4) | 1: return CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (137 << 4) | 2: return CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (137 << 4) | 3: return CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (137 << 4) | 4: return CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (137 << 4) | 5: return CommandBlock::CommandBlock(false, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (137 << 4) | 8: return CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (137 << 4) | 9: return CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (137 << 4) | 10: return CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (137 << 4) | 11: return CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (137 << 4) | 12: return CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (137 << 4) | 13: return CommandBlock::CommandBlock(true, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (138 << 4) | 0: return Beacon::Beacon();\n\t\t\tcase (139 << 4) | 0: return CobblestoneWall::CobblestoneWall(CobblestoneWall::East::None, CobblestoneWall::North::None, CobblestoneWall::South::None, true, CobblestoneWall::West::None);\n\t\t\tcase (139 << 4) | 1: return MossyCobblestoneWall::MossyCobblestoneWall(MossyCobblestoneWall::East::None, MossyCobblestoneWall::North::None, MossyCobblestoneWall::South::None, true, MossyCobblestoneWall::West::None);\n\t\t\tcase (140 << 4) | 0: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 1: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 2: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 3: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 4: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 5: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 6: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 7: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 8: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 9: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 10: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 11: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 12: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 13: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 14: return PottedCactus::PottedCactus();\n\t\t\tcase (140 << 4) | 15: return PottedCactus::PottedCactus();\n\t\t\tcase (141 << 4) | 0: return Carrots::Carrots(0);\n\t\t\tcase (141 << 4) | 1: return Carrots::Carrots(1);\n\t\t\tcase (141 << 4) | 2: return Carrots::Carrots(2);\n\t\t\tcase (141 << 4) | 3: return Carrots::Carrots(3);\n\t\t\tcase (141 << 4) | 4: return Carrots::Carrots(4);\n\t\t\tcase (141 << 4) | 5: return Carrots::Carrots(5);\n\t\t\tcase (141 << 4) | 6: return Carrots::Carrots(6);\n\t\t\tcase (141 << 4) | 7: return Carrots::Carrots(7);\n\t\t\tcase (142 << 4) | 0: return Potatoes::Potatoes(0);\n\t\t\tcase (142 << 4) | 1: return Potatoes::Potatoes(1);\n\t\t\tcase (142 << 4) | 2: return Potatoes::Potatoes(2);\n\t\t\tcase (142 << 4) | 3: return Potatoes::Potatoes(3);\n\t\t\tcase (142 << 4) | 4: return Potatoes::Potatoes(4);\n\t\t\tcase (142 << 4) | 5: return Potatoes::Potatoes(5);\n\t\t\tcase (142 << 4) | 6: return Potatoes::Potatoes(6);\n\t\t\tcase (142 << 4) | 7: return Potatoes::Potatoes(7);\n\t\t\tcase (143 << 4) | 0: return OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (143 << 4) | 1: return OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (143 << 4) | 2: return OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (143 << 4) | 3: return OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (143 << 4) | 4: return OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (143 << 4) | 5: return OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (143 << 4) | 8: return OakButton::OakButton(OakButton::Face::Ceiling, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (143 << 4) | 9: return OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (143 << 4) | 10: return OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (143 << 4) | 11: return OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (143 << 4) | 12: return OakButton::OakButton(OakButton::Face::Wall, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (143 << 4) | 13: return OakButton::OakButton(OakButton::Face::Floor, eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (144 << 4) | 1: return SkeletonSkull::SkeletonSkull(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (144 << 4) | 2: return SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (144 << 4) | 3: return SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (144 << 4) | 4: return SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (144 << 4) | 5: return SkeletonWallSkull::SkeletonWallSkull(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (145 << 4) | 0: return Anvil::Anvil(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (145 << 4) | 1: return Anvil::Anvil(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (145 << 4) | 2: return Anvil::Anvil(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (145 << 4) | 3: return Anvil::Anvil(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (145 << 4) | 4: return ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (145 << 4) | 5: return ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (145 << 4) | 6: return ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (145 << 4) | 7: return ChippedAnvil::ChippedAnvil(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (145 << 4) | 8: return DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (145 << 4) | 9: return DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (145 << 4) | 10: return DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (145 << 4) | 11: return DamagedAnvil::DamagedAnvil(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (146 << 4) | 2: return TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZM, TrappedChest::Type::Single);\n\t\t\tcase (146 << 4) | 3: return TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_ZP, TrappedChest::Type::Single);\n\t\t\tcase (146 << 4) | 4: return TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XM, TrappedChest::Type::Single);\n\t\t\tcase (146 << 4) | 5: return TrappedChest::TrappedChest(eBlockFace::BLOCK_FACE_XP, TrappedChest::Type::Single);\n\t\t\tcase (147 << 4) | 0: return LightWeightedPressurePlate::LightWeightedPressurePlate(0);\n\t\t\tcase (147 << 4) | 1: return LightWeightedPressurePlate::LightWeightedPressurePlate(1);\n\t\t\tcase (147 << 4) | 2: return LightWeightedPressurePlate::LightWeightedPressurePlate(2);\n\t\t\tcase (147 << 4) | 3: return LightWeightedPressurePlate::LightWeightedPressurePlate(3);\n\t\t\tcase (147 << 4) | 4: return LightWeightedPressurePlate::LightWeightedPressurePlate(4);\n\t\t\tcase (147 << 4) | 5: return LightWeightedPressurePlate::LightWeightedPressurePlate(5);\n\t\t\tcase (147 << 4) | 6: return LightWeightedPressurePlate::LightWeightedPressurePlate(6);\n\t\t\tcase (147 << 4) | 7: return LightWeightedPressurePlate::LightWeightedPressurePlate(7);\n\t\t\tcase (147 << 4) | 8: return LightWeightedPressurePlate::LightWeightedPressurePlate(8);\n\t\t\tcase (147 << 4) | 9: return LightWeightedPressurePlate::LightWeightedPressurePlate(9);\n\t\t\tcase (147 << 4) | 10: return LightWeightedPressurePlate::LightWeightedPressurePlate(10);\n\t\t\tcase (147 << 4) | 11: return LightWeightedPressurePlate::LightWeightedPressurePlate(11);\n\t\t\tcase (147 << 4) | 12: return LightWeightedPressurePlate::LightWeightedPressurePlate(12);\n\t\t\tcase (147 << 4) | 13: return LightWeightedPressurePlate::LightWeightedPressurePlate(13);\n\t\t\tcase (147 << 4) | 14: return LightWeightedPressurePlate::LightWeightedPressurePlate(14);\n\t\t\tcase (147 << 4) | 15: return LightWeightedPressurePlate::LightWeightedPressurePlate(15);\n\t\t\tcase (148 << 4) | 0: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(0);\n\t\t\tcase (148 << 4) | 1: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(1);\n\t\t\tcase (148 << 4) | 2: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(2);\n\t\t\tcase (148 << 4) | 3: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(3);\n\t\t\tcase (148 << 4) | 4: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(4);\n\t\t\tcase (148 << 4) | 5: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(5);\n\t\t\tcase (148 << 4) | 6: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(6);\n\t\t\tcase (148 << 4) | 7: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(7);\n\t\t\tcase (148 << 4) | 8: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(8);\n\t\t\tcase (148 << 4) | 9: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(9);\n\t\t\tcase (148 << 4) | 10: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(10);\n\t\t\tcase (148 << 4) | 11: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(11);\n\t\t\tcase (148 << 4) | 12: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(12);\n\t\t\tcase (148 << 4) | 13: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(13);\n\t\t\tcase (148 << 4) | 14: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(14);\n\t\t\tcase (148 << 4) | 15: return HeavyWeightedPressurePlate::HeavyWeightedPressurePlate(15);\n\t\t\tcase (149 << 4) | 0: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, false);\n\t\t\tcase (149 << 4) | 1: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, false);\n\t\t\tcase (149 << 4) | 2: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, false);\n\t\t\tcase (149 << 4) | 3: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, false);\n\t\t\tcase (149 << 4) | 4: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, false);\n\t\t\tcase (149 << 4) | 5: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, false);\n\t\t\tcase (149 << 4) | 6: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, false);\n\t\t\tcase (149 << 4) | 7: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, false);\n\t\t\tcase (149 << 4) | 8: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, true);\n\t\t\tcase (149 << 4) | 9: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, true);\n\t\t\tcase (149 << 4) | 10: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, true);\n\t\t\tcase (149 << 4) | 11: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, true);\n\t\t\tcase (149 << 4) | 12: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, true);\n\t\t\tcase (149 << 4) | 13: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, true);\n\t\t\tcase (149 << 4) | 14: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, true);\n\t\t\tcase (149 << 4) | 15: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, true);\n\t\t\tcase (150 << 4) | 0: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, false);\n\t\t\tcase (150 << 4) | 1: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, false);\n\t\t\tcase (150 << 4) | 2: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, false);\n\t\t\tcase (150 << 4) | 3: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, false);\n\t\t\tcase (150 << 4) | 4: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, false);\n\t\t\tcase (150 << 4) | 5: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, false);\n\t\t\tcase (150 << 4) | 6: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, false);\n\t\t\tcase (150 << 4) | 7: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, false);\n\t\t\tcase (150 << 4) | 8: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Compare, true);\n\t\t\tcase (150 << 4) | 9: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Compare, true);\n\t\t\tcase (150 << 4) | 10: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Compare, true);\n\t\t\tcase (150 << 4) | 11: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Compare, true);\n\t\t\tcase (150 << 4) | 12: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZP, Comparator::Mode::Subtract, true);\n\t\t\tcase (150 << 4) | 13: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XM, Comparator::Mode::Subtract, true);\n\t\t\tcase (150 << 4) | 14: return Comparator::Comparator(eBlockFace::BLOCK_FACE_ZM, Comparator::Mode::Subtract, true);\n\t\t\tcase (150 << 4) | 15: return Comparator::Comparator(eBlockFace::BLOCK_FACE_XP, Comparator::Mode::Subtract, true);\n\t\t\tcase (151 << 4) | 0: return DaylightDetector::DaylightDetector(false, 0);\n\t\t\tcase (151 << 4) | 1: return DaylightDetector::DaylightDetector(false, 1);\n\t\t\tcase (151 << 4) | 2: return DaylightDetector::DaylightDetector(false, 2);\n\t\t\tcase (151 << 4) | 3: return DaylightDetector::DaylightDetector(false, 3);\n\t\t\tcase (151 << 4) | 4: return DaylightDetector::DaylightDetector(false, 4);\n\t\t\tcase (151 << 4) | 5: return DaylightDetector::DaylightDetector(false, 5);\n\t\t\tcase (151 << 4) | 6: return DaylightDetector::DaylightDetector(false, 6);\n\t\t\tcase (151 << 4) | 7: return DaylightDetector::DaylightDetector(false, 7);\n\t\t\tcase (151 << 4) | 8: return DaylightDetector::DaylightDetector(false, 8);\n\t\t\tcase (151 << 4) | 9: return DaylightDetector::DaylightDetector(false, 9);\n\t\t\tcase (151 << 4) | 10: return DaylightDetector::DaylightDetector(false, 10);\n\t\t\tcase (151 << 4) | 11: return DaylightDetector::DaylightDetector(false, 11);\n\t\t\tcase (151 << 4) | 12: return DaylightDetector::DaylightDetector(false, 12);\n\t\t\tcase (151 << 4) | 13: return DaylightDetector::DaylightDetector(false, 13);\n\t\t\tcase (151 << 4) | 14: return DaylightDetector::DaylightDetector(false, 14);\n\t\t\tcase (151 << 4) | 15: return DaylightDetector::DaylightDetector(false, 15);\n\t\t\tcase (152 << 4) | 0: return RedstoneBlock::RedstoneBlock();\n\t\t\tcase (153 << 4) | 0: return NetherQuartzOre::NetherQuartzOre();\n\t\t\tcase (154 << 4) | 0: return Hopper::Hopper(true, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (154 << 4) | 2: return Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (154 << 4) | 3: return Hopper::Hopper(true, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (154 << 4) | 4: return Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (154 << 4) | 5: return Hopper::Hopper(true, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (154 << 4) | 8: return Hopper::Hopper(false, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (154 << 4) | 10: return Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (154 << 4) | 11: return Hopper::Hopper(false, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (154 << 4) | 12: return Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (154 << 4) | 13: return Hopper::Hopper(false, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (155 << 4) | 0: return QuartzBlock::QuartzBlock();\n\t\t\tcase (155 << 4) | 1: return ChiseledQuartzBlock::ChiseledQuartzBlock();\n\t\t\tcase (155 << 4) | 2: return QuartzPillar::QuartzPillar(QuartzPillar::Axis::Y);\n\t\t\tcase (155 << 4) | 3: return QuartzPillar::QuartzPillar(QuartzPillar::Axis::X);\n\t\t\tcase (155 << 4) | 4: return QuartzPillar::QuartzPillar(QuartzPillar::Axis::Z);\n\t\t\tcase (156 << 4) | 0: return QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight);\n\t\t\tcase (156 << 4) | 1: return QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight);\n\t\t\tcase (156 << 4) | 2: return QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight);\n\t\t\tcase (156 << 4) | 3: return QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Bottom, QuartzStairs::Shape::Straight);\n\t\t\tcase (156 << 4) | 4: return QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight);\n\t\t\tcase (156 << 4) | 5: return QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_XM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight);\n\t\t\tcase (156 << 4) | 6: return QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZP, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight);\n\t\t\tcase (156 << 4) | 7: return QuartzStairs::QuartzStairs(eBlockFace::BLOCK_FACE_ZM, QuartzStairs::Half::Top, QuartzStairs::Shape::Straight);\n\t\t\tcase (157 << 4) | 0: return ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::NorthSouth);\n\t\t\tcase (157 << 4) | 1: return ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::EastWest);\n\t\t\tcase (157 << 4) | 2: return ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingEast);\n\t\t\tcase (157 << 4) | 3: return ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingWest);\n\t\t\tcase (157 << 4) | 4: return ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingNorth);\n\t\t\tcase (157 << 4) | 5: return ActivatorRail::ActivatorRail(false, ActivatorRail::Shape::AscendingSouth);\n\t\t\tcase (157 << 4) | 8: return ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::NorthSouth);\n\t\t\tcase (157 << 4) | 9: return ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::EastWest);\n\t\t\tcase (157 << 4) | 10: return ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingEast);\n\t\t\tcase (157 << 4) | 11: return ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingWest);\n\t\t\tcase (157 << 4) | 12: return ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingNorth);\n\t\t\tcase (157 << 4) | 13: return ActivatorRail::ActivatorRail(true, ActivatorRail::Shape::AscendingSouth);\n\t\t\tcase (158 << 4) | 0: return Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, false);\n\t\t\tcase (158 << 4) | 1: return Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, false);\n\t\t\tcase (158 << 4) | 2: return Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (158 << 4) | 3: return Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (158 << 4) | 4: return Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (158 << 4) | 5: return Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (158 << 4) | 8: return Dropper::Dropper(eBlockFace::BLOCK_FACE_YM, true);\n\t\t\tcase (158 << 4) | 9: return Dropper::Dropper(eBlockFace::BLOCK_FACE_YP, true);\n\t\t\tcase (158 << 4) | 10: return Dropper::Dropper(eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (158 << 4) | 11: return Dropper::Dropper(eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (158 << 4) | 12: return Dropper::Dropper(eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (158 << 4) | 13: return Dropper::Dropper(eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (159 << 4) | 0: return WhiteTerracotta::WhiteTerracotta();\n\t\t\tcase (159 << 4) | 1: return OrangeTerracotta::OrangeTerracotta();\n\t\t\tcase (159 << 4) | 2: return MagentaTerracotta::MagentaTerracotta();\n\t\t\tcase (159 << 4) | 3: return LightBlueTerracotta::LightBlueTerracotta();\n\t\t\tcase (159 << 4) | 4: return YellowTerracotta::YellowTerracotta();\n\t\t\tcase (159 << 4) | 5: return LimeTerracotta::LimeTerracotta();\n\t\t\tcase (159 << 4) | 6: return PinkTerracotta::PinkTerracotta();\n\t\t\tcase (159 << 4) | 7: return GrayTerracotta::GrayTerracotta();\n\t\t\tcase (159 << 4) | 8: return LightGrayTerracotta::LightGrayTerracotta();\n\t\t\tcase (159 << 4) | 9: return CyanTerracotta::CyanTerracotta();\n\t\t\tcase (159 << 4) | 10: return PurpleTerracotta::PurpleTerracotta();\n\t\t\tcase (159 << 4) | 11: return BlueTerracotta::BlueTerracotta();\n\t\t\tcase (159 << 4) | 12: return BrownTerracotta::BrownTerracotta();\n\t\t\tcase (159 << 4) | 13: return GreenTerracotta::GreenTerracotta();\n\t\t\tcase (159 << 4) | 14: return RedTerracotta::RedTerracotta();\n\t\t\tcase (159 << 4) | 15: return BlackTerracotta::BlackTerracotta();\n\t\t\tcase (160 << 4) | 0: return WhiteStainedGlassPane::WhiteStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 1: return OrangeStainedGlassPane::OrangeStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 2: return MagentaStainedGlassPane::MagentaStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 3: return LightBlueStainedGlassPane::LightBlueStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 4: return YellowStainedGlassPane::YellowStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 5: return LimeStainedGlassPane::LimeStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 6: return PinkStainedGlassPane::PinkStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 7: return GrayStainedGlassPane::GrayStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 8: return LightGrayStainedGlassPane::LightGrayStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 9: return CyanStainedGlassPane::CyanStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 10: return PurpleStainedGlassPane::PurpleStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 11: return BlueStainedGlassPane::BlueStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 12: return BrownStainedGlassPane::BrownStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 13: return GreenStainedGlassPane::GreenStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 14: return RedStainedGlassPane::RedStainedGlassPane(false, false, false, false);\n\t\t\tcase (160 << 4) | 15: return BlackStainedGlassPane::BlackStainedGlassPane(false, false, false, false);\n\t\t\tcase (161 << 4) | 0: return AcaciaLeaves::AcaciaLeaves(false, true);\n\t\t\tcase (161 << 4) | 1: return DarkOakLeaves::DarkOakLeaves(false, true);\n\t\t\tcase (161 << 4) | 4: return AcaciaLeaves::AcaciaLeaves(false, false);\n\t\t\tcase (161 << 4) | 5: return DarkOakLeaves::DarkOakLeaves(false, false);\n\t\t\tcase (161 << 4) | 8: return AcaciaLeaves::AcaciaLeaves(true, true);\n\t\t\tcase (161 << 4) | 9: return DarkOakLeaves::DarkOakLeaves(true, true);\n\t\t\tcase (161 << 4) | 12: return AcaciaLeaves::AcaciaLeaves(true, false);\n\t\t\tcase (161 << 4) | 13: return DarkOakLeaves::DarkOakLeaves(true, false);\n\t\t\tcase (162 << 4) | 0: return AcaciaLog::AcaciaLog(AcaciaLog::Axis::Y);\n\t\t\tcase (162 << 4) | 1: return DarkOakLog::DarkOakLog(DarkOakLog::Axis::Y);\n\t\t\tcase (162 << 4) | 4: return AcaciaLog::AcaciaLog(AcaciaLog::Axis::X);\n\t\t\tcase (162 << 4) | 5: return DarkOakLog::DarkOakLog(DarkOakLog::Axis::X);\n\t\t\tcase (162 << 4) | 8: return AcaciaLog::AcaciaLog(AcaciaLog::Axis::Z);\n\t\t\tcase (162 << 4) | 9: return DarkOakLog::DarkOakLog(DarkOakLog::Axis::Z);\n\t\t\tcase (162 << 4) | 12: return AcaciaWood::AcaciaWood();\n\t\t\tcase (162 << 4) | 13: return DarkOakWood::DarkOakWood();\n\t\t\tcase (163 << 4) | 0: return AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight);\n\t\t\tcase (163 << 4) | 1: return AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight);\n\t\t\tcase (163 << 4) | 2: return AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight);\n\t\t\tcase (163 << 4) | 3: return AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Bottom, AcaciaStairs::Shape::Straight);\n\t\t\tcase (163 << 4) | 4: return AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight);\n\t\t\tcase (163 << 4) | 5: return AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_XM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight);\n\t\t\tcase (163 << 4) | 6: return AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZP, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight);\n\t\t\tcase (163 << 4) | 7: return AcaciaStairs::AcaciaStairs(eBlockFace::BLOCK_FACE_ZM, AcaciaStairs::Half::Top, AcaciaStairs::Shape::Straight);\n\t\t\tcase (164 << 4) | 0: return DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight);\n\t\t\tcase (164 << 4) | 1: return DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight);\n\t\t\tcase (164 << 4) | 2: return DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight);\n\t\t\tcase (164 << 4) | 3: return DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Bottom, DarkOakStairs::Shape::Straight);\n\t\t\tcase (164 << 4) | 4: return DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight);\n\t\t\tcase (164 << 4) | 5: return DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_XM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight);\n\t\t\tcase (164 << 4) | 6: return DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZP, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight);\n\t\t\tcase (164 << 4) | 7: return DarkOakStairs::DarkOakStairs(eBlockFace::BLOCK_FACE_ZM, DarkOakStairs::Half::Top, DarkOakStairs::Shape::Straight);\n\t\t\tcase (165 << 4) | 0: return SlimeBlock::SlimeBlock();\n\t\t\tcase (166 << 4) | 0: return Barrier::Barrier();\n\t\t\tcase (167 << 4) | 0: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, false, false);\n\t\t\tcase (167 << 4) | 1: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, false, false);\n\t\t\tcase (167 << 4) | 2: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, false, false);\n\t\t\tcase (167 << 4) | 3: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, false, false);\n\t\t\tcase (167 << 4) | 4: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Bottom, true, false);\n\t\t\tcase (167 << 4) | 5: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Bottom, true, false);\n\t\t\tcase (167 << 4) | 6: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Bottom, true, false);\n\t\t\tcase (167 << 4) | 7: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Bottom, true, false);\n\t\t\tcase (167 << 4) | 8: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, false, false);\n\t\t\tcase (167 << 4) | 9: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, false, false);\n\t\t\tcase (167 << 4) | 10: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, false, false);\n\t\t\tcase (167 << 4) | 11: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, false, false);\n\t\t\tcase (167 << 4) | 12: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZM, IronTrapdoor::Half::Top, true, false);\n\t\t\tcase (167 << 4) | 13: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_ZP, IronTrapdoor::Half::Top, true, false);\n\t\t\tcase (167 << 4) | 14: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XM, IronTrapdoor::Half::Top, true, false);\n\t\t\tcase (167 << 4) | 15: return IronTrapdoor::IronTrapdoor(eBlockFace::BLOCK_FACE_XP, IronTrapdoor::Half::Top, true, false);\n\t\t\tcase (168 << 4) | 0: return Prismarine::Prismarine();\n\t\t\tcase (168 << 4) | 1: return PrismarineBricks::PrismarineBricks();\n\t\t\tcase (168 << 4) | 2: return DarkPrismarine::DarkPrismarine();\n\t\t\tcase (169 << 4) | 0: return SeaLantern::SeaLantern();\n\t\t\tcase (170 << 4) | 0: return HayBale::HayBale(HayBale::Axis::Y);\n\t\t\tcase (170 << 4) | 4: return HayBale::HayBale(HayBale::Axis::X);\n\t\t\tcase (170 << 4) | 8: return HayBale::HayBale(HayBale::Axis::Z);\n\t\t\tcase (171 << 4) | 0: return WhiteCarpet::WhiteCarpet();\n\t\t\tcase (171 << 4) | 1: return OrangeCarpet::OrangeCarpet();\n\t\t\tcase (171 << 4) | 2: return MagentaCarpet::MagentaCarpet();\n\t\t\tcase (171 << 4) | 3: return LightBlueCarpet::LightBlueCarpet();\n\t\t\tcase (171 << 4) | 4: return YellowCarpet::YellowCarpet();\n\t\t\tcase (171 << 4) | 5: return LimeCarpet::LimeCarpet();\n\t\t\tcase (171 << 4) | 6: return PinkCarpet::PinkCarpet();\n\t\t\tcase (171 << 4) | 7: return GrayCarpet::GrayCarpet();\n\t\t\tcase (171 << 4) | 8: return LightGrayCarpet::LightGrayCarpet();\n\t\t\tcase (171 << 4) | 9: return CyanCarpet::CyanCarpet();\n\t\t\tcase (171 << 4) | 10: return PurpleCarpet::PurpleCarpet();\n\t\t\tcase (171 << 4) | 11: return BlueCarpet::BlueCarpet();\n\t\t\tcase (171 << 4) | 12: return BrownCarpet::BrownCarpet();\n\t\t\tcase (171 << 4) | 13: return GreenCarpet::GreenCarpet();\n\t\t\tcase (171 << 4) | 14: return RedCarpet::RedCarpet();\n\t\t\tcase (171 << 4) | 15: return BlackCarpet::BlackCarpet();\n\t\t\tcase (172 << 4) | 0: return Terracotta::Terracotta();\n\t\t\tcase (173 << 4) | 0: return CoalBlock::CoalBlock();\n\t\t\tcase (174 << 4) | 0: return PackedIce::PackedIce();\n\t\t\tcase (175 << 4) | 0: return Sunflower::Sunflower(Sunflower::Half::Lower);\n\t\t\tcase (175 << 4) | 1: return Lilac::Lilac(Lilac::Half::Lower);\n\t\t\tcase (175 << 4) | 2: return TallGrass::TallGrass(TallGrass::Half::Lower);\n\t\t\tcase (175 << 4) | 3: return LargeFern::LargeFern(LargeFern::Half::Lower);\n\t\t\tcase (175 << 4) | 4: return RoseBush::RoseBush(RoseBush::Half::Lower);\n\t\t\tcase (175 << 4) | 5: return Peony::Peony(Peony::Half::Lower);\n\t\t\tcase (175 << 4) | 8: return Sunflower::Sunflower(Sunflower::Half::Upper);\n\t\t\tcase (175 << 4) | 9: return Lilac::Lilac(Lilac::Half::Upper);\n\t\t\tcase (175 << 4) | 10: return TallGrass::TallGrass(TallGrass::Half::Upper);\n\t\t\tcase (175 << 4) | 11: return LargeFern::LargeFern(LargeFern::Half::Upper);\n\t\t\tcase (175 << 4) | 12: return RoseBush::RoseBush(RoseBush::Half::Upper);\n\t\t\tcase (175 << 4) | 13: return Peony::Peony(Peony::Half::Upper);\n\t\t\tcase (176 << 4) | 0: return WhiteBanner::WhiteBanner(0);\n\t\t\tcase (176 << 4) | 1: return WhiteBanner::WhiteBanner(1);\n\t\t\tcase (176 << 4) | 2: return WhiteBanner::WhiteBanner(2);\n\t\t\tcase (176 << 4) | 3: return WhiteBanner::WhiteBanner(3);\n\t\t\tcase (176 << 4) | 4: return WhiteBanner::WhiteBanner(4);\n\t\t\tcase (176 << 4) | 5: return WhiteBanner::WhiteBanner(5);\n\t\t\tcase (176 << 4) | 6: return WhiteBanner::WhiteBanner(6);\n\t\t\tcase (176 << 4) | 7: return WhiteBanner::WhiteBanner(7);\n\t\t\tcase (176 << 4) | 8: return WhiteBanner::WhiteBanner(8);\n\t\t\tcase (176 << 4) | 9: return WhiteBanner::WhiteBanner(9);\n\t\t\tcase (176 << 4) | 10: return WhiteBanner::WhiteBanner(10);\n\t\t\tcase (176 << 4) | 11: return WhiteBanner::WhiteBanner(11);\n\t\t\tcase (176 << 4) | 12: return WhiteBanner::WhiteBanner(12);\n\t\t\tcase (176 << 4) | 13: return WhiteBanner::WhiteBanner(13);\n\t\t\tcase (176 << 4) | 14: return WhiteBanner::WhiteBanner(14);\n\t\t\tcase (176 << 4) | 15: return WhiteBanner::WhiteBanner(15);\n\t\t\tcase (177 << 4) | 2: return WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (177 << 4) | 3: return WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (177 << 4) | 4: return WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (177 << 4) | 5: return WhiteWallBanner::WhiteWallBanner(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (178 << 4) | 0: return DaylightDetector::DaylightDetector(true, 0);\n\t\t\tcase (178 << 4) | 1: return DaylightDetector::DaylightDetector(true, 1);\n\t\t\tcase (178 << 4) | 2: return DaylightDetector::DaylightDetector(true, 2);\n\t\t\tcase (178 << 4) | 3: return DaylightDetector::DaylightDetector(true, 3);\n\t\t\tcase (178 << 4) | 4: return DaylightDetector::DaylightDetector(true, 4);\n\t\t\tcase (178 << 4) | 5: return DaylightDetector::DaylightDetector(true, 5);\n\t\t\tcase (178 << 4) | 6: return DaylightDetector::DaylightDetector(true, 6);\n\t\t\tcase (178 << 4) | 7: return DaylightDetector::DaylightDetector(true, 7);\n\t\t\tcase (178 << 4) | 8: return DaylightDetector::DaylightDetector(true, 8);\n\t\t\tcase (178 << 4) | 9: return DaylightDetector::DaylightDetector(true, 9);\n\t\t\tcase (178 << 4) | 10: return DaylightDetector::DaylightDetector(true, 10);\n\t\t\tcase (178 << 4) | 11: return DaylightDetector::DaylightDetector(true, 11);\n\t\t\tcase (178 << 4) | 12: return DaylightDetector::DaylightDetector(true, 12);\n\t\t\tcase (178 << 4) | 13: return DaylightDetector::DaylightDetector(true, 13);\n\t\t\tcase (178 << 4) | 14: return DaylightDetector::DaylightDetector(true, 14);\n\t\t\tcase (178 << 4) | 15: return DaylightDetector::DaylightDetector(true, 15);\n\t\t\tcase (179 << 4) | 0: return RedSandstone::RedSandstone();\n\t\t\tcase (179 << 4) | 1: return ChiseledRedSandstone::ChiseledRedSandstone();\n\t\t\tcase (179 << 4) | 2: return CutRedSandstone::CutRedSandstone();\n\t\t\tcase (180 << 4) | 0: return RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight);\n\t\t\tcase (180 << 4) | 1: return RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight);\n\t\t\tcase (180 << 4) | 2: return RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight);\n\t\t\tcase (180 << 4) | 3: return RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Bottom, RedSandstoneStairs::Shape::Straight);\n\t\t\tcase (180 << 4) | 4: return RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight);\n\t\t\tcase (180 << 4) | 5: return RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_XM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight);\n\t\t\tcase (180 << 4) | 6: return RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZP, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight);\n\t\t\tcase (180 << 4) | 7: return RedSandstoneStairs::RedSandstoneStairs(eBlockFace::BLOCK_FACE_ZM, RedSandstoneStairs::Half::Top, RedSandstoneStairs::Shape::Straight);\n\t\t\tcase (181 << 4) | 0: return RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Double);\n\t\t\tcase (181 << 4) | 8: return SmoothRedSandstone::SmoothRedSandstone();\n\t\t\tcase (182 << 4) | 0: return RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Bottom);\n\t\t\tcase (182 << 4) | 8: return RedSandstoneSlab::RedSandstoneSlab(RedSandstoneSlab::Type::Top);\n\t\t\tcase (183 << 4) | 0: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false);\n\t\t\tcase (183 << 4) | 1: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false);\n\t\t\tcase (183 << 4) | 2: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false);\n\t\t\tcase (183 << 4) | 3: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false);\n\t\t\tcase (183 << 4) | 4: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false);\n\t\t\tcase (183 << 4) | 5: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false);\n\t\t\tcase (183 << 4) | 6: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false);\n\t\t\tcase (183 << 4) | 7: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false);\n\t\t\tcase (183 << 4) | 8: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true);\n\t\t\tcase (183 << 4) | 9: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true);\n\t\t\tcase (183 << 4) | 10: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true);\n\t\t\tcase (183 << 4) | 11: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true);\n\t\t\tcase (183 << 4) | 12: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true);\n\t\t\tcase (183 << 4) | 13: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true);\n\t\t\tcase (183 << 4) | 14: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true);\n\t\t\tcase (183 << 4) | 15: return SpruceFenceGate::SpruceFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true);\n\t\t\tcase (184 << 4) | 0: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false);\n\t\t\tcase (184 << 4) | 1: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false);\n\t\t\tcase (184 << 4) | 2: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false);\n\t\t\tcase (184 << 4) | 3: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false);\n\t\t\tcase (184 << 4) | 4: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false);\n\t\t\tcase (184 << 4) | 5: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false);\n\t\t\tcase (184 << 4) | 6: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false);\n\t\t\tcase (184 << 4) | 7: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false);\n\t\t\tcase (184 << 4) | 8: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true);\n\t\t\tcase (184 << 4) | 9: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true);\n\t\t\tcase (184 << 4) | 10: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true);\n\t\t\tcase (184 << 4) | 11: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true);\n\t\t\tcase (184 << 4) | 12: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true);\n\t\t\tcase (184 << 4) | 13: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true);\n\t\t\tcase (184 << 4) | 14: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true);\n\t\t\tcase (184 << 4) | 15: return BirchFenceGate::BirchFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true);\n\t\t\tcase (185 << 4) | 0: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false);\n\t\t\tcase (185 << 4) | 1: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false);\n\t\t\tcase (185 << 4) | 2: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false);\n\t\t\tcase (185 << 4) | 3: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false);\n\t\t\tcase (185 << 4) | 4: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false);\n\t\t\tcase (185 << 4) | 5: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false);\n\t\t\tcase (185 << 4) | 6: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false);\n\t\t\tcase (185 << 4) | 7: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false);\n\t\t\tcase (185 << 4) | 8: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true);\n\t\t\tcase (185 << 4) | 9: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true);\n\t\t\tcase (185 << 4) | 10: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true);\n\t\t\tcase (185 << 4) | 11: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true);\n\t\t\tcase (185 << 4) | 12: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true);\n\t\t\tcase (185 << 4) | 13: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true);\n\t\t\tcase (185 << 4) | 14: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true);\n\t\t\tcase (185 << 4) | 15: return JungleFenceGate::JungleFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true);\n\t\t\tcase (186 << 4) | 0: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false);\n\t\t\tcase (186 << 4) | 1: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false);\n\t\t\tcase (186 << 4) | 2: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false);\n\t\t\tcase (186 << 4) | 3: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false);\n\t\t\tcase (186 << 4) | 4: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false);\n\t\t\tcase (186 << 4) | 5: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false);\n\t\t\tcase (186 << 4) | 6: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false);\n\t\t\tcase (186 << 4) | 7: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false);\n\t\t\tcase (186 << 4) | 8: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true);\n\t\t\tcase (186 << 4) | 9: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true);\n\t\t\tcase (186 << 4) | 10: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true);\n\t\t\tcase (186 << 4) | 11: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true);\n\t\t\tcase (186 << 4) | 12: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true);\n\t\t\tcase (186 << 4) | 13: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true);\n\t\t\tcase (186 << 4) | 14: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true);\n\t\t\tcase (186 << 4) | 15: return DarkOakFenceGate::DarkOakFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true);\n\t\t\tcase (187 << 4) | 0: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, false);\n\t\t\tcase (187 << 4) | 1: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, false);\n\t\t\tcase (187 << 4) | 2: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, false);\n\t\t\tcase (187 << 4) | 3: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, false);\n\t\t\tcase (187 << 4) | 4: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, false);\n\t\t\tcase (187 << 4) | 5: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, false);\n\t\t\tcase (187 << 4) | 6: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, false);\n\t\t\tcase (187 << 4) | 7: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, false);\n\t\t\tcase (187 << 4) | 8: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, false, true);\n\t\t\tcase (187 << 4) | 9: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, false, true);\n\t\t\tcase (187 << 4) | 10: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, false, true);\n\t\t\tcase (187 << 4) | 11: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, false, true);\n\t\t\tcase (187 << 4) | 12: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZP, false, true, true);\n\t\t\tcase (187 << 4) | 13: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XM, false, true, true);\n\t\t\tcase (187 << 4) | 14: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_ZM, false, true, true);\n\t\t\tcase (187 << 4) | 15: return AcaciaFenceGate::AcaciaFenceGate(eBlockFace::BLOCK_FACE_XP, false, true, true);\n\t\t\tcase (188 << 4) | 0: return SpruceFence::SpruceFence(false, false, false, false);\n\t\t\tcase (189 << 4) | 0: return BirchFence::BirchFence(false, false, false, false);\n\t\t\tcase (190 << 4) | 0: return JungleFence::JungleFence(false, false, false, false);\n\t\t\tcase (191 << 4) | 0: return DarkOakFence::DarkOakFence(false, false, false, false);\n\t\t\tcase (192 << 4) | 0: return AcaciaFence::AcaciaFence(false, false, false, false);\n\t\t\tcase (193 << 4) | 0: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false);\n\t\t\tcase (193 << 4) | 1: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false);\n\t\t\tcase (193 << 4) | 2: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false);\n\t\t\tcase (193 << 4) | 3: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, false, false);\n\t\t\tcase (193 << 4) | 4: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false);\n\t\t\tcase (193 << 4) | 5: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZP, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false);\n\t\t\tcase (193 << 4) | 6: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false);\n\t\t\tcase (193 << 4) | 7: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_ZM, SpruceDoor::Half::Lower, SpruceDoor::Hinge::Right, true, false);\n\t\t\tcase (193 << 4) | 8: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, false);\n\t\t\tcase (193 << 4) | 9: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, false);\n\t\t\tcase (193 << 4) | 10: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Left, false, true);\n\t\t\tcase (193 << 4) | 11: return SpruceDoor::SpruceDoor(eBlockFace::BLOCK_FACE_XP, SpruceDoor::Half::Upper, SpruceDoor::Hinge::Right, false, true);\n\t\t\tcase (194 << 4) | 0: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false);\n\t\t\tcase (194 << 4) | 1: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false);\n\t\t\tcase (194 << 4) | 2: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false);\n\t\t\tcase (194 << 4) | 3: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, false, false);\n\t\t\tcase (194 << 4) | 4: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false);\n\t\t\tcase (194 << 4) | 5: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZP, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false);\n\t\t\tcase (194 << 4) | 6: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false);\n\t\t\tcase (194 << 4) | 7: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_ZM, BirchDoor::Half::Lower, BirchDoor::Hinge::Right, true, false);\n\t\t\tcase (194 << 4) | 8: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, false);\n\t\t\tcase (194 << 4) | 9: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, false);\n\t\t\tcase (194 << 4) | 10: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Left, false, true);\n\t\t\tcase (194 << 4) | 11: return BirchDoor::BirchDoor(eBlockFace::BLOCK_FACE_XP, BirchDoor::Half::Upper, BirchDoor::Hinge::Right, false, true);\n\t\t\tcase (195 << 4) | 0: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false);\n\t\t\tcase (195 << 4) | 1: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false);\n\t\t\tcase (195 << 4) | 2: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false);\n\t\t\tcase (195 << 4) | 3: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, false, false);\n\t\t\tcase (195 << 4) | 4: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false);\n\t\t\tcase (195 << 4) | 5: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZP, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false);\n\t\t\tcase (195 << 4) | 6: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false);\n\t\t\tcase (195 << 4) | 7: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_ZM, JungleDoor::Half::Lower, JungleDoor::Hinge::Right, true, false);\n\t\t\tcase (195 << 4) | 8: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, false);\n\t\t\tcase (195 << 4) | 9: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, false);\n\t\t\tcase (195 << 4) | 10: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Left, false, true);\n\t\t\tcase (195 << 4) | 11: return JungleDoor::JungleDoor(eBlockFace::BLOCK_FACE_XP, JungleDoor::Half::Upper, JungleDoor::Hinge::Right, false, true);\n\t\t\tcase (196 << 4) | 0: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false);\n\t\t\tcase (196 << 4) | 1: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false);\n\t\t\tcase (196 << 4) | 2: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false);\n\t\t\tcase (196 << 4) | 3: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, false, false);\n\t\t\tcase (196 << 4) | 4: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false);\n\t\t\tcase (196 << 4) | 5: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZP, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false);\n\t\t\tcase (196 << 4) | 6: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false);\n\t\t\tcase (196 << 4) | 7: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_ZM, AcaciaDoor::Half::Lower, AcaciaDoor::Hinge::Right, true, false);\n\t\t\tcase (196 << 4) | 8: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, false);\n\t\t\tcase (196 << 4) | 9: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, false);\n\t\t\tcase (196 << 4) | 10: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Left, false, true);\n\t\t\tcase (196 << 4) | 11: return AcaciaDoor::AcaciaDoor(eBlockFace::BLOCK_FACE_XP, AcaciaDoor::Half::Upper, AcaciaDoor::Hinge::Right, false, true);\n\t\t\tcase (197 << 4) | 0: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false);\n\t\t\tcase (197 << 4) | 1: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false);\n\t\t\tcase (197 << 4) | 2: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false);\n\t\t\tcase (197 << 4) | 3: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, false, false);\n\t\t\tcase (197 << 4) | 4: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false);\n\t\t\tcase (197 << 4) | 5: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZP, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false);\n\t\t\tcase (197 << 4) | 6: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false);\n\t\t\tcase (197 << 4) | 7: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_ZM, DarkOakDoor::Half::Lower, DarkOakDoor::Hinge::Right, true, false);\n\t\t\tcase (197 << 4) | 8: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, false);\n\t\t\tcase (197 << 4) | 9: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, false);\n\t\t\tcase (197 << 4) | 10: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Left, false, true);\n\t\t\tcase (197 << 4) | 11: return DarkOakDoor::DarkOakDoor(eBlockFace::BLOCK_FACE_XP, DarkOakDoor::Half::Upper, DarkOakDoor::Hinge::Right, false, true);\n\t\t\tcase (198 << 4) | 0: return EndRod::EndRod(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (198 << 4) | 1: return EndRod::EndRod(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (198 << 4) | 2: return EndRod::EndRod(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (198 << 4) | 3: return EndRod::EndRod(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (198 << 4) | 4: return EndRod::EndRod(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (198 << 4) | 5: return EndRod::EndRod(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (199 << 4) | 0: return ChorusPlant::ChorusPlant(false, false, false, false, false, false);\n\t\t\tcase (200 << 4) | 0: return ChorusFlower::ChorusFlower(0);\n\t\t\tcase (200 << 4) | 1: return ChorusFlower::ChorusFlower(1);\n\t\t\tcase (200 << 4) | 2: return ChorusFlower::ChorusFlower(2);\n\t\t\tcase (200 << 4) | 3: return ChorusFlower::ChorusFlower(3);\n\t\t\tcase (200 << 4) | 4: return ChorusFlower::ChorusFlower(4);\n\t\t\tcase (200 << 4) | 5: return ChorusFlower::ChorusFlower(5);\n\t\t\tcase (201 << 4) | 0: return PurpurBlock::PurpurBlock();\n\t\t\tcase (202 << 4) | 0: return PurpurPillar::PurpurPillar(PurpurPillar::Axis::Y);\n\t\t\tcase (202 << 4) | 4: return PurpurPillar::PurpurPillar(PurpurPillar::Axis::X);\n\t\t\tcase (202 << 4) | 8: return PurpurPillar::PurpurPillar(PurpurPillar::Axis::Z);\n\t\t\tcase (203 << 4) | 0: return PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight);\n\t\t\tcase (203 << 4) | 1: return PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight);\n\t\t\tcase (203 << 4) | 2: return PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight);\n\t\t\tcase (203 << 4) | 3: return PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Bottom, PurpurStairs::Shape::Straight);\n\t\t\tcase (203 << 4) | 4: return PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight);\n\t\t\tcase (203 << 4) | 5: return PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_XM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight);\n\t\t\tcase (203 << 4) | 6: return PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZP, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight);\n\t\t\tcase (203 << 4) | 7: return PurpurStairs::PurpurStairs(eBlockFace::BLOCK_FACE_ZM, PurpurStairs::Half::Top, PurpurStairs::Shape::Straight);\n\t\t\tcase (204 << 4) | 0: return PurpurSlab::PurpurSlab(PurpurSlab::Type::Double);\n\t\t\tcase (205 << 4) | 0: return PurpurSlab::PurpurSlab(PurpurSlab::Type::Bottom);\n\t\t\tcase (205 << 4) | 8: return PurpurSlab::PurpurSlab(PurpurSlab::Type::Top);\n\t\t\tcase (206 << 4) | 0: return EndStoneBricks::EndStoneBricks();\n\t\t\tcase (207 << 4) | 0: return Beetroots::Beetroots(0);\n\t\t\tcase (207 << 4) | 1: return Beetroots::Beetroots(1);\n\t\t\tcase (207 << 4) | 2: return Beetroots::Beetroots(2);\n\t\t\tcase (207 << 4) | 3: return Beetroots::Beetroots(3);\n\t\t\tcase (208 << 4) | 0: return GrassPath::GrassPath();\n\t\t\tcase (209 << 4) | 0: return EndGateway::EndGateway();\n\t\t\tcase (210 << 4) | 0: return RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (210 << 4) | 1: return RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (210 << 4) | 2: return RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (210 << 4) | 3: return RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (210 << 4) | 4: return RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (210 << 4) | 5: return RepeatingCommandBlock::RepeatingCommandBlock(false, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (210 << 4) | 8: return RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (210 << 4) | 9: return RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (210 << 4) | 10: return RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (210 << 4) | 11: return RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (210 << 4) | 12: return RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (210 << 4) | 13: return RepeatingCommandBlock::RepeatingCommandBlock(true, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (211 << 4) | 0: return ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (211 << 4) | 1: return ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (211 << 4) | 2: return ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (211 << 4) | 3: return ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (211 << 4) | 4: return ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (211 << 4) | 5: return ChainCommandBlock::ChainCommandBlock(false, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (211 << 4) | 8: return ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (211 << 4) | 9: return ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (211 << 4) | 10: return ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (211 << 4) | 11: return ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (211 << 4) | 12: return ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (211 << 4) | 13: return ChainCommandBlock::ChainCommandBlock(true, eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (212 << 4) | 0: return FrostedIce::FrostedIce(0);\n\t\t\tcase (212 << 4) | 1: return FrostedIce::FrostedIce(1);\n\t\t\tcase (212 << 4) | 2: return FrostedIce::FrostedIce(2);\n\t\t\tcase (212 << 4) | 3: return FrostedIce::FrostedIce(3);\n\t\t\tcase (213 << 4) | 0: return MagmaBlock::MagmaBlock();\n\t\t\tcase (214 << 4) | 0: return NetherWartBlock::NetherWartBlock();\n\t\t\tcase (215 << 4) | 0: return RedNetherBricks::RedNetherBricks();\n\t\t\tcase (216 << 4) | 0: return BoneBlock::BoneBlock(BoneBlock::Axis::Y);\n\t\t\tcase (216 << 4) | 4: return BoneBlock::BoneBlock(BoneBlock::Axis::X);\n\t\t\tcase (216 << 4) | 8: return BoneBlock::BoneBlock(BoneBlock::Axis::Z);\n\t\t\tcase (217 << 4) | 0: return StructureVoid::StructureVoid();\n\t\t\tcase (218 << 4) | 0: return Observer::Observer(eBlockFace::BLOCK_FACE_YM, false);\n\t\t\tcase (218 << 4) | 1: return Observer::Observer(eBlockFace::BLOCK_FACE_YP, false);\n\t\t\tcase (218 << 4) | 2: return Observer::Observer(eBlockFace::BLOCK_FACE_ZM, false);\n\t\t\tcase (218 << 4) | 3: return Observer::Observer(eBlockFace::BLOCK_FACE_ZP, false);\n\t\t\tcase (218 << 4) | 4: return Observer::Observer(eBlockFace::BLOCK_FACE_XM, false);\n\t\t\tcase (218 << 4) | 5: return Observer::Observer(eBlockFace::BLOCK_FACE_XP, false);\n\t\t\tcase (218 << 4) | 8: return Observer::Observer(eBlockFace::BLOCK_FACE_YM, true);\n\t\t\tcase (218 << 4) | 9: return Observer::Observer(eBlockFace::BLOCK_FACE_YP, true);\n\t\t\tcase (218 << 4) | 10: return Observer::Observer(eBlockFace::BLOCK_FACE_ZM, true);\n\t\t\tcase (218 << 4) | 11: return Observer::Observer(eBlockFace::BLOCK_FACE_ZP, true);\n\t\t\tcase (218 << 4) | 12: return Observer::Observer(eBlockFace::BLOCK_FACE_XM, true);\n\t\t\tcase (218 << 4) | 13: return Observer::Observer(eBlockFace::BLOCK_FACE_XP, true);\n\t\t\tcase (219 << 4) | 0: return WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (219 << 4) | 1: return WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (219 << 4) | 2: return WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (219 << 4) | 3: return WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (219 << 4) | 4: return WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (219 << 4) | 5: return WhiteShulkerBox::WhiteShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (220 << 4) | 0: return OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (220 << 4) | 1: return OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (220 << 4) | 2: return OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (220 << 4) | 3: return OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (220 << 4) | 4: return OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (220 << 4) | 5: return OrangeShulkerBox::OrangeShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (221 << 4) | 0: return MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (221 << 4) | 1: return MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (221 << 4) | 2: return MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (221 << 4) | 3: return MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (221 << 4) | 4: return MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (221 << 4) | 5: return MagentaShulkerBox::MagentaShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (222 << 4) | 0: return LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (222 << 4) | 1: return LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (222 << 4) | 2: return LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (222 << 4) | 3: return LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (222 << 4) | 4: return LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (222 << 4) | 5: return LightBlueShulkerBox::LightBlueShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (223 << 4) | 0: return YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (223 << 4) | 1: return YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (223 << 4) | 2: return YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (223 << 4) | 3: return YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (223 << 4) | 4: return YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (223 << 4) | 5: return YellowShulkerBox::YellowShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (224 << 4) | 0: return LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (224 << 4) | 1: return LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (224 << 4) | 2: return LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (224 << 4) | 3: return LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (224 << 4) | 4: return LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (224 << 4) | 5: return LimeShulkerBox::LimeShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (225 << 4) | 0: return PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (225 << 4) | 1: return PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (225 << 4) | 2: return PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (225 << 4) | 3: return PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (225 << 4) | 4: return PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (225 << 4) | 5: return PinkShulkerBox::PinkShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (226 << 4) | 0: return GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (226 << 4) | 1: return GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (226 << 4) | 2: return GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (226 << 4) | 3: return GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (226 << 4) | 4: return GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (226 << 4) | 5: return GrayShulkerBox::GrayShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (227 << 4) | 0: return LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (227 << 4) | 1: return LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (227 << 4) | 2: return LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (227 << 4) | 3: return LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (227 << 4) | 4: return LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (227 << 4) | 5: return LightGrayShulkerBox::LightGrayShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (228 << 4) | 0: return CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (228 << 4) | 1: return CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (228 << 4) | 2: return CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (228 << 4) | 3: return CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (228 << 4) | 4: return CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (228 << 4) | 5: return CyanShulkerBox::CyanShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (229 << 4) | 0: return PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (229 << 4) | 1: return PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (229 << 4) | 2: return PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (229 << 4) | 3: return PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (229 << 4) | 4: return PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (229 << 4) | 5: return PurpleShulkerBox::PurpleShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (230 << 4) | 0: return BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (230 << 4) | 1: return BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (230 << 4) | 2: return BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (230 << 4) | 3: return BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (230 << 4) | 4: return BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (230 << 4) | 5: return BlueShulkerBox::BlueShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (231 << 4) | 0: return BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (231 << 4) | 1: return BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (231 << 4) | 2: return BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (231 << 4) | 3: return BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (231 << 4) | 4: return BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (231 << 4) | 5: return BrownShulkerBox::BrownShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (232 << 4) | 0: return GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (232 << 4) | 1: return GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (232 << 4) | 2: return GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (232 << 4) | 3: return GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (232 << 4) | 4: return GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (232 << 4) | 5: return GreenShulkerBox::GreenShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (233 << 4) | 0: return RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (233 << 4) | 1: return RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (233 << 4) | 2: return RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (233 << 4) | 3: return RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (233 << 4) | 4: return RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (233 << 4) | 5: return RedShulkerBox::RedShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (234 << 4) | 0: return BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YM);\n\t\t\tcase (234 << 4) | 1: return BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_YP);\n\t\t\tcase (234 << 4) | 2: return BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (234 << 4) | 3: return BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (234 << 4) | 4: return BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (234 << 4) | 5: return BlackShulkerBox::BlackShulkerBox(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (235 << 4) | 0: return WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (235 << 4) | 1: return WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (235 << 4) | 2: return WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (235 << 4) | 3: return WhiteGlazedTerracotta::WhiteGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (236 << 4) | 0: return OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (236 << 4) | 1: return OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (236 << 4) | 2: return OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (236 << 4) | 3: return OrangeGlazedTerracotta::OrangeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (237 << 4) | 0: return MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (237 << 4) | 1: return MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (237 << 4) | 2: return MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (237 << 4) | 3: return MagentaGlazedTerracotta::MagentaGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (238 << 4) | 0: return LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (238 << 4) | 1: return LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (238 << 4) | 2: return LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (238 << 4) | 3: return LightBlueGlazedTerracotta::LightBlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (239 << 4) | 0: return YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (239 << 4) | 1: return YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (239 << 4) | 2: return YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (239 << 4) | 3: return YellowGlazedTerracotta::YellowGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (240 << 4) | 0: return LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (240 << 4) | 1: return LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (240 << 4) | 2: return LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (240 << 4) | 3: return LimeGlazedTerracotta::LimeGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (241 << 4) | 0: return PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (241 << 4) | 1: return PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (241 << 4) | 2: return PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (241 << 4) | 3: return PinkGlazedTerracotta::PinkGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (242 << 4) | 0: return GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (242 << 4) | 1: return GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (242 << 4) | 2: return GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (242 << 4) | 3: return GrayGlazedTerracotta::GrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (243 << 4) | 0: return LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (243 << 4) | 1: return LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (243 << 4) | 2: return LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (243 << 4) | 3: return LightGrayGlazedTerracotta::LightGrayGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (244 << 4) | 0: return CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (244 << 4) | 1: return CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (244 << 4) | 2: return CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (244 << 4) | 3: return CyanGlazedTerracotta::CyanGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (245 << 4) | 0: return PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (245 << 4) | 1: return PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (245 << 4) | 2: return PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (245 << 4) | 3: return PurpleGlazedTerracotta::PurpleGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (246 << 4) | 0: return BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (246 << 4) | 1: return BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (246 << 4) | 2: return BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (246 << 4) | 3: return BlueGlazedTerracotta::BlueGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (247 << 4) | 0: return BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (247 << 4) | 1: return BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (247 << 4) | 2: return BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (247 << 4) | 3: return BrownGlazedTerracotta::BrownGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (248 << 4) | 0: return GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (248 << 4) | 1: return GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (248 << 4) | 2: return GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (248 << 4) | 3: return GreenGlazedTerracotta::GreenGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (249 << 4) | 0: return RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (249 << 4) | 1: return RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (249 << 4) | 2: return RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (249 << 4) | 3: return RedGlazedTerracotta::RedGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (250 << 4) | 0: return BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZP);\n\t\t\tcase (250 << 4) | 1: return BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XM);\n\t\t\tcase (250 << 4) | 2: return BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_ZM);\n\t\t\tcase (250 << 4) | 3: return BlackGlazedTerracotta::BlackGlazedTerracotta(eBlockFace::BLOCK_FACE_XP);\n\t\t\tcase (251 << 4) | 0: return WhiteConcrete::WhiteConcrete();\n\t\t\tcase (251 << 4) | 1: return OrangeConcrete::OrangeConcrete();\n\t\t\tcase (251 << 4) | 2: return MagentaConcrete::MagentaConcrete();\n\t\t\tcase (251 << 4) | 3: return LightBlueConcrete::LightBlueConcrete();\n\t\t\tcase (251 << 4) | 4: return YellowConcrete::YellowConcrete();\n\t\t\tcase (251 << 4) | 5: return LimeConcrete::LimeConcrete();\n\t\t\tcase (251 << 4) | 6: return PinkConcrete::PinkConcrete();\n\t\t\tcase (251 << 4) | 7: return GrayConcrete::GrayConcrete();\n\t\t\tcase (251 << 4) | 8: return LightGrayConcrete::LightGrayConcrete();\n\t\t\tcase (251 << 4) | 9: return CyanConcrete::CyanConcrete();\n\t\t\tcase (251 << 4) | 10: return PurpleConcrete::PurpleConcrete();\n\t\t\tcase (251 << 4) | 11: return BlueConcrete::BlueConcrete();\n\t\t\tcase (251 << 4) | 12: return BrownConcrete::BrownConcrete();\n\t\t\tcase (251 << 4) | 13: return GreenConcrete::GreenConcrete();\n\t\t\tcase (251 << 4) | 14: return RedConcrete::RedConcrete();\n\t\t\tcase (251 << 4) | 15: return BlackConcrete::BlackConcrete();\n\t\t\tcase (252 << 4) | 0: return WhiteConcretePowder::WhiteConcretePowder();\n\t\t\tcase (252 << 4) | 1: return OrangeConcretePowder::OrangeConcretePowder();\n\t\t\tcase (252 << 4) | 2: return MagentaConcretePowder::MagentaConcretePowder();\n\t\t\tcase (252 << 4) | 3: return LightBlueConcretePowder::LightBlueConcretePowder();\n\t\t\tcase (252 << 4) | 4: return YellowConcretePowder::YellowConcretePowder();\n\t\t\tcase (252 << 4) | 5: return LimeConcretePowder::LimeConcretePowder();\n\t\t\tcase (252 << 4) | 6: return PinkConcretePowder::PinkConcretePowder();\n\t\t\tcase (252 << 4) | 7: return GrayConcretePowder::GrayConcretePowder();\n\t\t\tcase (252 << 4) | 8: return LightGrayConcretePowder::LightGrayConcretePowder();\n\t\t\tcase (252 << 4) | 9: return CyanConcretePowder::CyanConcretePowder();\n\t\t\tcase (252 << 4) | 10: return PurpleConcretePowder::PurpleConcretePowder();\n\t\t\tcase (252 << 4) | 11: return BlueConcretePowder::BlueConcretePowder();\n\t\t\tcase (252 << 4) | 12: return BrownConcretePowder::BrownConcretePowder();\n\t\t\tcase (252 << 4) | 13: return GreenConcretePowder::GreenConcretePowder();\n\t\t\tcase (252 << 4) | 14: return RedConcretePowder::RedConcretePowder();\n\t\t\tcase (252 << 4) | 15: return BlackConcretePowder::BlackConcretePowder();\n\t\t\tcase (255 << 4) | 0: return StructureBlock::StructureBlock(StructureBlock::Mode::Save);\n\t\t\tcase (255 << 4) | 1: return StructureBlock::StructureBlock(StructureBlock::Mode::Load);\n\t\t\tcase (255 << 4) | 2: return StructureBlock::StructureBlock(StructureBlock::Mode::Corner);\n\t\t\tcase (255 << 4) | 3: return StructureBlock::StructureBlock(StructureBlock::Mode::Data);\n\t\t\tdefault: return Air::Air();\n\t\t}\n\t}\n\n\tItem FromItem(const short Item, const short Damage)\n\t{\n\t\tswitch ((Item << 16) | Damage)\n\t\t{\n\t\t\tcase (1 << 16) | 0: return Item::Stone;\n\t\t\tcase (1 << 16) | 1: return Item::Granite;\n\t\t\tcase (1 << 16) | 2: return Item::PolishedGranite;\n\t\t\tcase (1 << 16) | 3: return Item::Diorite;\n\t\t\tcase (1 << 16) | 4: return Item::PolishedDiorite;\n\t\t\tcase (1 << 16) | 5: return Item::Andesite;\n\t\t\tcase (1 << 16) | 6: return Item::PolishedAndesite;\n\t\t\tcase (2 << 16) | 0: return Item::GrassBlock;\n\t\t\tcase (3 << 16) | 0: return Item::Dirt;\n\t\t\tcase (3 << 16) | 1: return Item::CoarseDirt;\n\t\t\tcase (3 << 16) | 2: return Item::Podzol;\n\t\t\tcase (4 << 16) | 0: return Item::Cobblestone;\n\t\t\tcase (5 << 16) | 0: return Item::OakPlanks;\n\t\t\tcase (5 << 16) | 1: return Item::SprucePlanks;\n\t\t\tcase (5 << 16) | 2: return Item::BirchPlanks;\n\t\t\tcase (5 << 16) | 3: return Item::JunglePlanks;\n\t\t\tcase (5 << 16) | 4: return Item::AcaciaPlanks;\n\t\t\tcase (5 << 16) | 5: return Item::DarkOakPlanks;\n\t\t\tcase (6 << 16) | 0: return Item::OakSapling;\n\t\t\tcase (6 << 16) | 1: return Item::SpruceSapling;\n\t\t\tcase (6 << 16) | 2: return Item::BirchSapling;\n\t\t\tcase (6 << 16) | 3: return Item::JungleSapling;\n\t\t\tcase (6 << 16) | 4: return Item::AcaciaSapling;\n\t\t\tcase (6 << 16) | 5: return Item::DarkOakSapling;\n\t\t\tcase (7 << 16) | 0: return Item::Bedrock;\n\t\t\tcase (12 << 16) | 0: return Item::Sand;\n\t\t\tcase (12 << 16) | 1: return Item::RedSand;\n\t\t\tcase (13 << 16) | 0: return Item::Gravel;\n\t\t\tcase (14 << 16) | 0: return Item::GoldOre;\n\t\t\tcase (15 << 16) | 0: return Item::IronOre;\n\t\t\tcase (16 << 16) | 0: return Item::CoalOre;\n\t\t\tcase (17 << 16) | 0: return Item::OakLog;\n\t\t\tcase (17 << 16) | 1: return Item::SpruceLog;\n\t\t\tcase (17 << 16) | 2: return Item::BirchLog;\n\t\t\tcase (17 << 16) | 3: return Item::JungleLog;\n\t\t\tcase (162 << 16) | 0: return Item::AcaciaLog;\n\t\t\tcase (162 << 16) | 1: return Item::DarkOakLog;\n\t\t\tcase (18 << 16) | 0: return Item::OakLeaves;\n\t\t\tcase (18 << 16) | 1: return Item::SpruceLeaves;\n\t\t\tcase (18 << 16) | 2: return Item::BirchLeaves;\n\t\t\tcase (18 << 16) | 3: return Item::JungleLeaves;\n\t\t\tcase (161 << 16) | 0: return Item::AcaciaLeaves;\n\t\t\tcase (161 << 16) | 1: return Item::DarkOakLeaves;\n\t\t\tcase (19 << 16) | 0: return Item::Sponge;\n\t\t\tcase (19 << 16) | 1: return Item::WetSponge;\n\t\t\tcase (20 << 16) | 0: return Item::Glass;\n\t\t\tcase (21 << 16) | 0: return Item::LapisOre;\n\t\t\tcase (22 << 16) | 0: return Item::LapisBlock;\n\t\t\tcase (23 << 16) | 0: return Item::Dispenser;\n\t\t\tcase (24 << 16) | 0: return Item::Sandstone;\n\t\t\tcase (24 << 16) | 1: return Item::ChiseledSandstone;\n\t\t\tcase (24 << 16) | 2: return Item::CutSandstone;\n\t\t\tcase (25 << 16) | 0: return Item::NoteBlock;\n\t\t\tcase (27 << 16) | 0: return Item::PoweredRail;\n\t\t\tcase (28 << 16) | 0: return Item::DetectorRail;\n\t\t\tcase (29 << 16) | 0: return Item::StickyPiston;\n\t\t\tcase (30 << 16) | 0: return Item::Cobweb;\n\t\t\tcase (31 << 16) | 2: return Item::Fern;\n\t\t\tcase (32 << 16) | 0: return Item::DeadBush;\n\t\t\tcase (33 << 16) | 0: return Item::Piston;\n\t\t\tcase (35 << 16) | 0: return Item::WhiteWool;\n\t\t\tcase (35 << 16) | 1: return Item::OrangeWool;\n\t\t\tcase (35 << 16) | 2: return Item::MagentaWool;\n\t\t\tcase (35 << 16) | 3: return Item::LightBlueWool;\n\t\t\tcase (35 << 16) | 4: return Item::YellowWool;\n\t\t\tcase (35 << 16) | 5: return Item::LimeWool;\n\t\t\tcase (35 << 16) | 6: return Item::PinkWool;\n\t\t\tcase (35 << 16) | 7: return Item::GrayWool;\n\t\t\tcase (35 << 16) | 8: return Item::LightGrayWool;\n\t\t\tcase (35 << 16) | 9: return Item::CyanWool;\n\t\t\tcase (35 << 16) | 10: return Item::PurpleWool;\n\t\t\tcase (35 << 16) | 11: return Item::BlueWool;\n\t\t\tcase (35 << 16) | 12: return Item::BrownWool;\n\t\t\tcase (35 << 16) | 13: return Item::GreenWool;\n\t\t\tcase (35 << 16) | 14: return Item::RedWool;\n\t\t\tcase (35 << 16) | 15: return Item::BlackWool;\n\t\t\tcase (37 << 16) | 0: return Item::Dandelion;\n\t\t\tcase (38 << 16) | 0: return Item::Poppy;\n\t\t\tcase (38 << 16) | 1: return Item::BlueOrchid;\n\t\t\tcase (38 << 16) | 2: return Item::Allium;\n\t\t\tcase (38 << 16) | 3: return Item::AzureBluet;\n\t\t\tcase (38 << 16) | 4: return Item::RedTulip;\n\t\t\tcase (38 << 16) | 5: return Item::OrangeTulip;\n\t\t\tcase (38 << 16) | 6: return Item::WhiteTulip;\n\t\t\tcase (38 << 16) | 7: return Item::PinkTulip;\n\t\t\tcase (38 << 16) | 8: return Item::OxeyeDaisy;\n\t\t\tcase (39 << 16) | 0: return Item::BrownMushroom;\n\t\t\tcase (40 << 16) | 0: return Item::RedMushroom;\n\t\t\tcase (41 << 16) | 0: return Item::GoldBlock;\n\t\t\tcase (42 << 16) | 0: return Item::IronBlock;\n\t\t\tcase (126 << 16) | 0: return Item::OakSlab;\n\t\t\tcase (126 << 16) | 1: return Item::SpruceSlab;\n\t\t\tcase (126 << 16) | 2: return Item::BirchSlab;\n\t\t\tcase (126 << 16) | 3: return Item::JungleSlab;\n\t\t\tcase (126 << 16) | 4: return Item::AcaciaSlab;\n\t\t\tcase (126 << 16) | 5: return Item::DarkOakSlab;\n\t\t\tcase (44 << 16) | 2: return Item::StoneSlab;\n\t\t\tcase (44 << 16) | 1: return Item::SandstoneSlab;\n\t\t\tcase (44 << 16) | 3: return Item::CobblestoneSlab;\n\t\t\tcase (44 << 16) | 4: return Item::BrickSlab;\n\t\t\tcase (44 << 16) | 5: return Item::StoneBrickSlab;\n\t\t\tcase (44 << 16) | 6: return Item::NetherBrickSlab;\n\t\t\tcase (44 << 16) | 7: return Item::QuartzSlab;\n\t\t\tcase (182 << 16) | 0: return Item::RedSandstoneSlab;\n\t\t\tcase (205 << 16) | 0: return Item::PurpurSlab;\n\t\t\tcase (43 << 16) | 7: return Item::SmoothQuartz;\n\t\t\tcase (43 << 16) | 8: return Item::SmoothStone;\n\t\t\tcase (45 << 16) | 0: return Item::Bricks;\n\t\t\tcase (46 << 16) | 0: return Item::TNT;\n\t\t\tcase (47 << 16) | 0: return Item::Bookshelf;\n\t\t\tcase (48 << 16) | 0: return Item::MossyCobblestone;\n\t\t\tcase (49 << 16) | 0: return Item::Obsidian;\n\t\t\tcase (50 << 16) | 0: return Item::Torch;\n\t\t\tcase (198 << 16) | 0: return Item::EndRod;\n\t\t\tcase (199 << 16) | 0: return Item::ChorusPlant;\n\t\t\tcase (200 << 16) | 0: return Item::ChorusFlower;\n\t\t\tcase (201 << 16) | 0: return Item::PurpurBlock;\n\t\t\tcase (202 << 16) | 0: return Item::PurpurPillar;\n\t\t\tcase (203 << 16) | 0: return Item::PurpurStairs;\n\t\t\tcase (52 << 16) | 0: return Item::Spawner;\n\t\t\tcase (53 << 16) | 0: return Item::OakStairs;\n\t\t\tcase (54 << 16) | 0: return Item::Chest;\n\t\t\tcase (56 << 16) | 0: return Item::DiamondOre;\n\t\t\tcase (57 << 16) | 0: return Item::DiamondBlock;\n\t\t\tcase (58 << 16) | 0: return Item::CraftingTable;\n\t\t\tcase (60 << 16) | 0: return Item::Farmland;\n\t\t\tcase (61 << 16) | 0: return Item::Furnace;\n\t\t\tcase (65 << 16) | 0: return Item::Ladder;\n\t\t\tcase (66 << 16) | 0: return Item::Rail;\n\t\t\tcase (67 << 16) | 0: return Item::CobblestoneStairs;\n\t\t\tcase (69 << 16) | 0: return Item::Lever;\n\t\t\tcase (70 << 16) | 0: return Item::StonePressurePlate;\n\t\t\tcase (72 << 16) | 0: return Item::OakPressurePlate;\n\t\t\tcase (73 << 16) | 0: return Item::RedstoneOre;\n\t\t\tcase (76 << 16) | 0: return Item::RedstoneTorch;\n\t\t\tcase (77 << 16) | 0: return Item::StoneButton;\n\t\t\tcase (78 << 16) | 0: return Item::Snow;\n\t\t\tcase (79 << 16) | 0: return Item::Ice;\n\t\t\tcase (80 << 16) | 0: return Item::SnowBlock;\n\t\t\tcase (81 << 16) | 0: return Item::Cactus;\n\t\t\tcase (82 << 16) | 0: return Item::Clay;\n\t\t\tcase (84 << 16) | 0: return Item::Jukebox;\n\t\t\tcase (85 << 16) | 0: return Item::OakFence;\n\t\t\tcase (188 << 16) | 0: return Item::SpruceFence;\n\t\t\tcase (189 << 16) | 0: return Item::BirchFence;\n\t\t\tcase (190 << 16) | 0: return Item::JungleFence;\n\t\t\tcase (192 << 16) | 0: return Item::AcaciaFence;\n\t\t\tcase (191 << 16) | 0: return Item::DarkOakFence;\n\t\t\tcase (86 << 16) | 0: return Item::Pumpkin;\n\t\t\tcase (87 << 16) | 0: return Item::Netherrack;\n\t\t\tcase (88 << 16) | 0: return Item::SoulSand;\n\t\t\tcase (89 << 16) | 0: return Item::Glowstone;\n\t\t\tcase (91 << 16) | 0: return Item::JackOLantern;\n\t\t\tcase (96 << 16) | 0: return Item::OakTrapdoor;\n\t\t\tcase (97 << 16) | 0: return Item::InfestedStone;\n\t\t\tcase (97 << 16) | 1: return Item::InfestedCobblestone;\n\t\t\tcase (97 << 16) | 2: return Item::InfestedStoneBricks;\n\t\t\tcase (97 << 16) | 3: return Item::InfestedMossyStoneBricks;\n\t\t\tcase (97 << 16) | 4: return Item::InfestedCrackedStoneBricks;\n\t\t\tcase (97 << 16) | 5: return Item::InfestedChiseledStoneBricks;\n\t\t\tcase (98 << 16) | 0: return Item::StoneBricks;\n\t\t\tcase (98 << 16) | 1: return Item::MossyStoneBricks;\n\t\t\tcase (98 << 16) | 2: return Item::CrackedStoneBricks;\n\t\t\tcase (98 << 16) | 3: return Item::ChiseledStoneBricks;\n\t\t\tcase (99 << 16) | 0: return Item::BrownMushroomBlock;\n\t\t\tcase (100 << 16) | 0: return Item::RedMushroomBlock;\n\t\t\tcase (101 << 16) | 0: return Item::IronBars;\n\t\t\tcase (102 << 16) | 0: return Item::GlassPane;\n\t\t\tcase (103 << 16) | 0: return Item::Melon;\n\t\t\tcase (106 << 16) | 0: return Item::Vine;\n\t\t\tcase (107 << 16) | 0: return Item::OakFenceGate;\n\t\t\tcase (183 << 16) | 0: return Item::SpruceFenceGate;\n\t\t\tcase (184 << 16) | 0: return Item::BirchFenceGate;\n\t\t\tcase (185 << 16) | 0: return Item::JungleFenceGate;\n\t\t\tcase (187 << 16) | 0: return Item::AcaciaFenceGate;\n\t\t\tcase (186 << 16) | 0: return Item::DarkOakFenceGate;\n\t\t\tcase (108 << 16) | 0: return Item::BrickStairs;\n\t\t\tcase (109 << 16) | 0: return Item::StoneBrickStairs;\n\t\t\tcase (110 << 16) | 0: return Item::Mycelium;\n\t\t\tcase (111 << 16) | 0: return Item::LilyPad;\n\t\t\tcase (112 << 16) | 0: return Item::NetherBricks;\n\t\t\tcase (113 << 16) | 0: return Item::NetherBrickFence;\n\t\t\tcase (114 << 16) | 0: return Item::NetherBrickStairs;\n\t\t\tcase (116 << 16) | 0: return Item::EnchantingTable;\n\t\t\tcase (120 << 16) | 0: return Item::EndPortalFrame;\n\t\t\tcase (121 << 16) | 0: return Item::EndStone;\n\t\t\tcase (206 << 16) | 0: return Item::EndStoneBricks;\n\t\t\tcase (122 << 16) | 0: return Item::DragonEgg;\n\t\t\tcase (123 << 16) | 0: return Item::RedstoneLamp;\n\t\t\tcase (128 << 16) | 0: return Item::SandstoneStairs;\n\t\t\tcase (129 << 16) | 0: return Item::EmeraldOre;\n\t\t\tcase (130 << 16) | 0: return Item::EnderChest;\n\t\t\tcase (131 << 16) | 0: return Item::TripwireHook;\n\t\t\tcase (133 << 16) | 0: return Item::EmeraldBlock;\n\t\t\tcase (134 << 16) | 0: return Item::SpruceStairs;\n\t\t\tcase (135 << 16) | 0: return Item::BirchStairs;\n\t\t\tcase (136 << 16) | 0: return Item::JungleStairs;\n\t\t\tcase (137 << 16) | 0: return Item::CommandBlock;\n\t\t\tcase (138 << 16) | 0: return Item::Beacon;\n\t\t\tcase (139 << 16) | 0: return Item::CobblestoneWall;\n\t\t\tcase (139 << 16) | 1: return Item::MossyCobblestoneWall;\n\t\t\tcase (143 << 16) | 0: return Item::OakButton;\n\t\t\tcase (145 << 16) | 0: return Item::Anvil;\n\t\t\tcase (145 << 16) | 1: return Item::ChippedAnvil;\n\t\t\tcase (145 << 16) | 2: return Item::DamagedAnvil;\n\t\t\tcase (146 << 16) | 0: return Item::TrappedChest;\n\t\t\tcase (147 << 16) | 0: return Item::LightWeightedPressurePlate;\n\t\t\tcase (148 << 16) | 0: return Item::HeavyWeightedPressurePlate;\n\t\t\tcase (151 << 16) | 0: return Item::DaylightDetector;\n\t\t\tcase (152 << 16) | 0: return Item::RedstoneBlock;\n\t\t\tcase (153 << 16) | 0: return Item::NetherQuartzOre;\n\t\t\tcase (154 << 16) | 0: return Item::Hopper;\n\t\t\tcase (155 << 16) | 1: return Item::ChiseledQuartzBlock;\n\t\t\tcase (155 << 16) | 0: return Item::QuartzBlock;\n\t\t\tcase (155 << 16) | 2: return Item::QuartzPillar;\n\t\t\tcase (156 << 16) | 0: return Item::QuartzStairs;\n\t\t\tcase (157 << 16) | 0: return Item::ActivatorRail;\n\t\t\tcase (158 << 16) | 0: return Item::Dropper;\n\t\t\tcase (159 << 16) | 0: return Item::WhiteTerracotta;\n\t\t\tcase (159 << 16) | 1: return Item::OrangeTerracotta;\n\t\t\tcase (159 << 16) | 2: return Item::MagentaTerracotta;\n\t\t\tcase (159 << 16) | 3: return Item::LightBlueTerracotta;\n\t\t\tcase (159 << 16) | 4: return Item::YellowTerracotta;\n\t\t\tcase (159 << 16) | 5: return Item::LimeTerracotta;\n\t\t\tcase (159 << 16) | 6: return Item::PinkTerracotta;\n\t\t\tcase (159 << 16) | 7: return Item::GrayTerracotta;\n\t\t\tcase (159 << 16) | 8: return Item::LightGrayTerracotta;\n\t\t\tcase (159 << 16) | 9: return Item::CyanTerracotta;\n\t\t\tcase (159 << 16) | 10: return Item::PurpleTerracotta;\n\t\t\tcase (159 << 16) | 11: return Item::BlueTerracotta;\n\t\t\tcase (159 << 16) | 12: return Item::BrownTerracotta;\n\t\t\tcase (159 << 16) | 13: return Item::GreenTerracotta;\n\t\t\tcase (159 << 16) | 14: return Item::RedTerracotta;\n\t\t\tcase (159 << 16) | 15: return Item::BlackTerracotta;\n\t\t\tcase (166 << 16) | 0: return Item::Barrier;\n\t\t\tcase (167 << 16) | 0: return Item::IronTrapdoor;\n\t\t\tcase (170 << 16) | 0: return Item::HayBale;\n\t\t\tcase (171 << 16) | 0: return Item::WhiteCarpet;\n\t\t\tcase (171 << 16) | 1: return Item::OrangeCarpet;\n\t\t\tcase (171 << 16) | 2: return Item::MagentaCarpet;\n\t\t\tcase (171 << 16) | 3: return Item::LightBlueCarpet;\n\t\t\tcase (171 << 16) | 4: return Item::YellowCarpet;\n\t\t\tcase (171 << 16) | 5: return Item::LimeCarpet;\n\t\t\tcase (171 << 16) | 6: return Item::PinkCarpet;\n\t\t\tcase (171 << 16) | 7: return Item::GrayCarpet;\n\t\t\tcase (171 << 16) | 8: return Item::LightGrayCarpet;\n\t\t\tcase (171 << 16) | 9: return Item::CyanCarpet;\n\t\t\tcase (171 << 16) | 10: return Item::PurpleCarpet;\n\t\t\tcase (171 << 16) | 11: return Item::BlueCarpet;\n\t\t\tcase (171 << 16) | 12: return Item::BrownCarpet;\n\t\t\tcase (171 << 16) | 13: return Item::GreenCarpet;\n\t\t\tcase (171 << 16) | 14: return Item::RedCarpet;\n\t\t\tcase (171 << 16) | 15: return Item::BlackCarpet;\n\t\t\tcase (172 << 16) | 0: return Item::Terracotta;\n\t\t\tcase (173 << 16) | 0: return Item::CoalBlock;\n\t\t\tcase (174 << 16) | 0: return Item::PackedIce;\n\t\t\tcase (163 << 16) | 0: return Item::AcaciaStairs;\n\t\t\tcase (164 << 16) | 0: return Item::DarkOakStairs;\n\t\t\tcase (165 << 16) | 0: return Item::SlimeBlock;\n\t\t\tcase (208 << 16) | 0: return Item::GrassPath;\n\t\t\tcase (175 << 16) | 0: return Item::Sunflower;\n\t\t\tcase (175 << 16) | 1: return Item::Lilac;\n\t\t\tcase (175 << 16) | 4: return Item::RoseBush;\n\t\t\tcase (175 << 16) | 5: return Item::Peony;\n\t\t\tcase (175 << 16) | 2: return Item::TallGrass;\n\t\t\tcase (175 << 16) | 3: return Item::LargeFern;\n\t\t\tcase (95 << 16) | 0: return Item::WhiteStainedGlass;\n\t\t\tcase (95 << 16) | 1: return Item::OrangeStainedGlass;\n\t\t\tcase (95 << 16) | 2: return Item::MagentaStainedGlass;\n\t\t\tcase (95 << 16) | 3: return Item::LightBlueStainedGlass;\n\t\t\tcase (95 << 16) | 4: return Item::YellowStainedGlass;\n\t\t\tcase (95 << 16) | 5: return Item::LimeStainedGlass;\n\t\t\tcase (95 << 16) | 6: return Item::PinkStainedGlass;\n\t\t\tcase (95 << 16) | 7: return Item::GrayStainedGlass;\n\t\t\tcase (95 << 16) | 8: return Item::LightGrayStainedGlass;\n\t\t\tcase (95 << 16) | 9: return Item::CyanStainedGlass;\n\t\t\tcase (95 << 16) | 10: return Item::PurpleStainedGlass;\n\t\t\tcase (95 << 16) | 11: return Item::BlueStainedGlass;\n\t\t\tcase (95 << 16) | 12: return Item::BrownStainedGlass;\n\t\t\tcase (95 << 16) | 13: return Item::GreenStainedGlass;\n\t\t\tcase (95 << 16) | 14: return Item::RedStainedGlass;\n\t\t\tcase (95 << 16) | 15: return Item::BlackStainedGlass;\n\t\t\tcase (160 << 16) | 0: return Item::WhiteStainedGlassPane;\n\t\t\tcase (160 << 16) | 1: return Item::OrangeStainedGlassPane;\n\t\t\tcase (160 << 16) | 2: return Item::MagentaStainedGlassPane;\n\t\t\tcase (160 << 16) | 3: return Item::LightBlueStainedGlassPane;\n\t\t\tcase (160 << 16) | 4: return Item::YellowStainedGlassPane;\n\t\t\tcase (160 << 16) | 5: return Item::LimeStainedGlassPane;\n\t\t\tcase (160 << 16) | 6: return Item::PinkStainedGlassPane;\n\t\t\tcase (160 << 16) | 7: return Item::GrayStainedGlassPane;\n\t\t\tcase (160 << 16) | 8: return Item::LightGrayStainedGlassPane;\n\t\t\tcase (160 << 16) | 9: return Item::CyanStainedGlassPane;\n\t\t\tcase (160 << 16) | 10: return Item::PurpleStainedGlassPane;\n\t\t\tcase (160 << 16) | 11: return Item::BlueStainedGlassPane;\n\t\t\tcase (160 << 16) | 12: return Item::BrownStainedGlassPane;\n\t\t\tcase (160 << 16) | 13: return Item::GreenStainedGlassPane;\n\t\t\tcase (160 << 16) | 14: return Item::RedStainedGlassPane;\n\t\t\tcase (160 << 16) | 15: return Item::BlackStainedGlassPane;\n\t\t\tcase (168 << 16) | 0: return Item::Prismarine;\n\t\t\tcase (168 << 16) | 1: return Item::PrismarineBricks;\n\t\t\tcase (168 << 16) | 2: return Item::DarkPrismarine;\n\t\t\tcase (169 << 16) | 0: return Item::SeaLantern;\n\t\t\tcase (179 << 16) | 0: return Item::RedSandstone;\n\t\t\tcase (179 << 16) | 1: return Item::ChiseledRedSandstone;\n\t\t\tcase (179 << 16) | 2: return Item::CutRedSandstone;\n\t\t\tcase (180 << 16) | 0: return Item::RedSandstoneStairs;\n\t\t\tcase (210 << 16) | 0: return Item::RepeatingCommandBlock;\n\t\t\tcase (211 << 16) | 0: return Item::ChainCommandBlock;\n\t\t\tcase (213 << 16) | 0: return Item::MagmaBlock;\n\t\t\tcase (214 << 16) | 0: return Item::NetherWartBlock;\n\t\t\tcase (215 << 16) | 0: return Item::RedNetherBricks;\n\t\t\tcase (216 << 16) | 0: return Item::BoneBlock;\n\t\t\tcase (217 << 16) | 0: return Item::StructureVoid;\n\t\t\tcase (218 << 16) | 0: return Item::Observer;\n\t\t\tcase (219 << 16) | 0: return Item::WhiteShulkerBox;\n\t\t\tcase (220 << 16) | 0: return Item::OrangeShulkerBox;\n\t\t\tcase (221 << 16) | 0: return Item::MagentaShulkerBox;\n\t\t\tcase (222 << 16) | 0: return Item::LightBlueShulkerBox;\n\t\t\tcase (223 << 16) | 0: return Item::YellowShulkerBox;\n\t\t\tcase (224 << 16) | 0: return Item::LimeShulkerBox;\n\t\t\tcase (225 << 16) | 0: return Item::PinkShulkerBox;\n\t\t\tcase (226 << 16) | 0: return Item::GrayShulkerBox;\n\t\t\tcase (227 << 16) | 0: return Item::LightGrayShulkerBox;\n\t\t\tcase (228 << 16) | 0: return Item::CyanShulkerBox;\n\t\t\tcase (229 << 16) | 0: return Item::PurpleShulkerBox;\n\t\t\tcase (230 << 16) | 0: return Item::BlueShulkerBox;\n\t\t\tcase (231 << 16) | 0: return Item::BrownShulkerBox;\n\t\t\tcase (232 << 16) | 0: return Item::GreenShulkerBox;\n\t\t\tcase (233 << 16) | 0: return Item::RedShulkerBox;\n\t\t\tcase (234 << 16) | 0: return Item::BlackShulkerBox;\n\t\t\tcase (235 << 16) | 0: return Item::WhiteGlazedTerracotta;\n\t\t\tcase (236 << 16) | 0: return Item::OrangeGlazedTerracotta;\n\t\t\tcase (237 << 16) | 0: return Item::MagentaGlazedTerracotta;\n\t\t\tcase (238 << 16) | 0: return Item::LightBlueGlazedTerracotta;\n\t\t\tcase (239 << 16) | 0: return Item::YellowGlazedTerracotta;\n\t\t\tcase (240 << 16) | 0: return Item::LimeGlazedTerracotta;\n\t\t\tcase (241 << 16) | 0: return Item::PinkGlazedTerracotta;\n\t\t\tcase (242 << 16) | 0: return Item::GrayGlazedTerracotta;\n\t\t\tcase (243 << 16) | 0: return Item::LightGrayGlazedTerracotta;\n\t\t\tcase (244 << 16) | 0: return Item::CyanGlazedTerracotta;\n\t\t\tcase (245 << 16) | 0: return Item::PurpleGlazedTerracotta;\n\t\t\tcase (246 << 16) | 0: return Item::BlueGlazedTerracotta;\n\t\t\tcase (247 << 16) | 0: return Item::BrownGlazedTerracotta;\n\t\t\tcase (248 << 16) | 0: return Item::GreenGlazedTerracotta;\n\t\t\tcase (249 << 16) | 0: return Item::RedGlazedTerracotta;\n\t\t\tcase (250 << 16) | 0: return Item::BlackGlazedTerracotta;\n\t\t\tcase (251 << 16) | 0: return Item::WhiteConcrete;\n\t\t\tcase (251 << 16) | 1: return Item::OrangeConcrete;\n\t\t\tcase (251 << 16) | 2: return Item::MagentaConcrete;\n\t\t\tcase (251 << 16) | 3: return Item::LightBlueConcrete;\n\t\t\tcase (251 << 16) | 4: return Item::YellowConcrete;\n\t\t\tcase (251 << 16) | 5: return Item::LimeConcrete;\n\t\t\tcase (251 << 16) | 6: return Item::PinkConcrete;\n\t\t\tcase (251 << 16) | 7: return Item::GrayConcrete;\n\t\t\tcase (251 << 16) | 8: return Item::LightGrayConcrete;\n\t\t\tcase (251 << 16) | 9: return Item::CyanConcrete;\n\t\t\tcase (251 << 16) | 10: return Item::PurpleConcrete;\n\t\t\tcase (251 << 16) | 11: return Item::BlueConcrete;\n\t\t\tcase (251 << 16) | 12: return Item::BrownConcrete;\n\t\t\tcase (251 << 16) | 13: return Item::GreenConcrete;\n\t\t\tcase (251 << 16) | 14: return Item::RedConcrete;\n\t\t\tcase (251 << 16) | 15: return Item::BlackConcrete;\n\t\t\tcase (252 << 16) | 0: return Item::WhiteConcretePowder;\n\t\t\tcase (252 << 16) | 1: return Item::OrangeConcretePowder;\n\t\t\tcase (252 << 16) | 2: return Item::MagentaConcretePowder;\n\t\t\tcase (252 << 16) | 3: return Item::LightBlueConcretePowder;\n\t\t\tcase (252 << 16) | 4: return Item::YellowConcretePowder;\n\t\t\tcase (252 << 16) | 5: return Item::LimeConcretePowder;\n\t\t\tcase (252 << 16) | 6: return Item::PinkConcretePowder;\n\t\t\tcase (252 << 16) | 7: return Item::GrayConcretePowder;\n\t\t\tcase (252 << 16) | 8: return Item::LightGrayConcretePowder;\n\t\t\tcase (252 << 16) | 9: return Item::CyanConcretePowder;\n\t\t\tcase (252 << 16) | 10: return Item::PurpleConcretePowder;\n\t\t\tcase (252 << 16) | 11: return Item::BlueConcretePowder;\n\t\t\tcase (252 << 16) | 12: return Item::BrownConcretePowder;\n\t\t\tcase (252 << 16) | 13: return Item::GreenConcretePowder;\n\t\t\tcase (252 << 16) | 14: return Item::RedConcretePowder;\n\t\t\tcase (252 << 16) | 15: return Item::BlackConcretePowder;\n\t\t\tcase (330 << 16) | 0: return Item::IronDoor;\n\t\t\tcase (324 << 16) | 0: return Item::OakDoor;\n\t\t\tcase (427 << 16) | 0: return Item::SpruceDoor;\n\t\t\tcase (428 << 16) | 0: return Item::BirchDoor;\n\t\t\tcase (429 << 16) | 0: return Item::JungleDoor;\n\t\t\tcase (430 << 16) | 0: return Item::AcaciaDoor;\n\t\t\tcase (431 << 16) | 0: return Item::DarkOakDoor;\n\t\t\tcase (356 << 16) | 0: return Item::Repeater;\n\t\t\tcase (404 << 16) | 0: return Item::Comparator;\n\t\t\tcase (255 << 16) | 0: return Item::StructureBlock;\n\t\t\tcase (256 << 16) | 0: return Item::IronShovel;\n\t\t\tcase (257 << 16) | 0: return Item::IronPickaxe;\n\t\t\tcase (258 << 16) | 0: return Item::IronAxe;\n\t\t\tcase (259 << 16) | 0: return Item::FlintAndSteel;\n\t\t\tcase (260 << 16) | 0: return Item::Apple;\n\t\t\tcase (261 << 16) | 0: return Item::Bow;\n\t\t\tcase (262 << 16) | 0: return Item::Arrow;\n\t\t\tcase (263 << 16) | 0: return Item::Coal;\n\t\t\tcase (263 << 16) | 1: return Item::Charcoal;\n\t\t\tcase (264 << 16) | 0: return Item::Diamond;\n\t\t\tcase (265 << 16) | 0: return Item::IronIngot;\n\t\t\tcase (266 << 16) | 0: return Item::GoldIngot;\n\t\t\tcase (267 << 16) | 0: return Item::IronSword;\n\t\t\tcase (268 << 16) | 0: return Item::WoodenSword;\n\t\t\tcase (269 << 16) | 0: return Item::WoodenShovel;\n\t\t\tcase (270 << 16) | 0: return Item::WoodenPickaxe;\n\t\t\tcase (271 << 16) | 0: return Item::WoodenAxe;\n\t\t\tcase (272 << 16) | 0: return Item::StoneSword;\n\t\t\tcase (273 << 16) | 0: return Item::StoneShovel;\n\t\t\tcase (274 << 16) | 0: return Item::StonePickaxe;\n\t\t\tcase (275 << 16) | 0: return Item::StoneAxe;\n\t\t\tcase (276 << 16) | 0: return Item::DiamondSword;\n\t\t\tcase (277 << 16) | 0: return Item::DiamondShovel;\n\t\t\tcase (278 << 16) | 0: return Item::DiamondPickaxe;\n\t\t\tcase (279 << 16) | 0: return Item::DiamondAxe;\n\t\t\tcase (280 << 16) | 0: return Item::Stick;\n\t\t\tcase (281 << 16) | 0: return Item::Bowl;\n\t\t\tcase (282 << 16) | 0: return Item::MushroomStew;\n\t\t\tcase (283 << 16) | 0: return Item::GoldenSword;\n\t\t\tcase (284 << 16) | 0: return Item::GoldenShovel;\n\t\t\tcase (285 << 16) | 0: return Item::GoldenPickaxe;\n\t\t\tcase (286 << 16) | 0: return Item::GoldenAxe;\n\t\t\tcase (287 << 16) | 0: return Item::String;\n\t\t\tcase (288 << 16) | 0: return Item::Feather;\n\t\t\tcase (289 << 16) | 0: return Item::Gunpowder;\n\t\t\tcase (290 << 16) | 0: return Item::WoodenHoe;\n\t\t\tcase (291 << 16) | 0: return Item::StoneHoe;\n\t\t\tcase (292 << 16) | 0: return Item::IronHoe;\n\t\t\tcase (293 << 16) | 0: return Item::DiamondHoe;\n\t\t\tcase (294 << 16) | 0: return Item::GoldenHoe;\n\t\t\tcase (295 << 16) | 0: return Item::WheatSeeds;\n\t\t\tcase (296 << 16) | 0: return Item::Wheat;\n\t\t\tcase (297 << 16) | 0: return Item::Bread;\n\t\t\tcase (298 << 16) | 0: return Item::LeatherHelmet;\n\t\t\tcase (299 << 16) | 0: return Item::LeatherChestplate;\n\t\t\tcase (300 << 16) | 0: return Item::LeatherLeggings;\n\t\t\tcase (301 << 16) | 0: return Item::LeatherBoots;\n\t\t\tcase (302 << 16) | 0: return Item::ChainmailHelmet;\n\t\t\tcase (303 << 16) | 0: return Item::ChainmailChestplate;\n\t\t\tcase (304 << 16) | 0: return Item::ChainmailLeggings;\n\t\t\tcase (305 << 16) | 0: return Item::ChainmailBoots;\n\t\t\tcase (306 << 16) | 0: return Item::IronHelmet;\n\t\t\tcase (307 << 16) | 0: return Item::IronChestplate;\n\t\t\tcase (308 << 16) | 0: return Item::IronLeggings;\n\t\t\tcase (309 << 16) | 0: return Item::IronBoots;\n\t\t\tcase (310 << 16) | 0: return Item::DiamondHelmet;\n\t\t\tcase (311 << 16) | 0: return Item::DiamondChestplate;\n\t\t\tcase (312 << 16) | 0: return Item::DiamondLeggings;\n\t\t\tcase (313 << 16) | 0: return Item::DiamondBoots;\n\t\t\tcase (314 << 16) | 0: return Item::GoldenHelmet;\n\t\t\tcase (315 << 16) | 0: return Item::GoldenChestplate;\n\t\t\tcase (316 << 16) | 0: return Item::GoldenLeggings;\n\t\t\tcase (317 << 16) | 0: return Item::GoldenBoots;\n\t\t\tcase (318 << 16) | 0: return Item::Flint;\n\t\t\tcase (319 << 16) | 0: return Item::Porkchop;\n\t\t\tcase (320 << 16) | 0: return Item::CookedPorkchop;\n\t\t\tcase (321 << 16) | 0: return Item::Painting;\n\t\t\tcase (322 << 16) | 0: return Item::GoldenApple;\n\t\t\tcase (322 << 16) | 1: return Item::EnchantedGoldenApple;\n\t\t\tcase (323 << 16) | 0: return Item::OakSign;\n\t\t\tcase (325 << 16) | 0: return Item::Bucket;\n\t\t\tcase (326 << 16) | 0: return Item::WaterBucket;\n\t\t\tcase (327 << 16) | 0: return Item::LavaBucket;\n\t\t\tcase (328 << 16) | 0: return Item::Minecart;\n\t\t\tcase (329 << 16) | 0: return Item::Saddle;\n\t\t\tcase (331 << 16) | 0: return Item::Redstone;\n\t\t\tcase (332 << 16) | 0: return Item::Snowball;\n\t\t\tcase (333 << 16) | 0: return Item::OakBoat;\n\t\t\tcase (334 << 16) | 0: return Item::Leather;\n\t\t\tcase (335 << 16) | 0: return Item::MilkBucket;\n\t\t\tcase (336 << 16) | 0: return Item::Brick;\n\t\t\tcase (337 << 16) | 0: return Item::ClayBall;\n\t\t\tcase (338 << 16) | 0: return Item::SugarCane;\n\t\t\tcase (339 << 16) | 0: return Item::Paper;\n\t\t\tcase (340 << 16) | 0: return Item::Book;\n\t\t\tcase (341 << 16) | 0: return Item::SlimeBall;\n\t\t\tcase (342 << 16) | 0: return Item::ChestMinecart;\n\t\t\tcase (343 << 16) | 0: return Item::FurnaceMinecart;\n\t\t\tcase (344 << 16) | 0: return Item::Egg;\n\t\t\tcase (345 << 16) | 0: return Item::Compass;\n\t\t\tcase (346 << 16) | 0: return Item::FishingRod;\n\t\t\tcase (347 << 16) | 0: return Item::Clock;\n\t\t\tcase (348 << 16) | 0: return Item::GlowstoneDust;\n\t\t\tcase (349 << 16) | 0: return Item::Cod;\n\t\t\tcase (349 << 16) | 1: return Item::Salmon;\n\t\t\tcase (349 << 16) | 2: return Item::TropicalFish;\n\t\t\tcase (349 << 16) | 3: return Item::Pufferfish;\n\t\t\tcase (350 << 16) | 0: return Item::CookedCod;\n\t\t\tcase (350 << 16) | 1: return Item::CookedSalmon;\n\t\t\tcase (351 << 16) | 0: return Item::InkSac;\n\t\t\tcase (351 << 16) | 1: return Item::RedDye;\n\t\t\tcase (351 << 16) | 2: return Item::GreenDye;\n\t\t\tcase (351 << 16) | 3: return Item::CocoaBeans;\n\t\t\tcase (351 << 16) | 4: return Item::LapisLazuli;\n\t\t\tcase (351 << 16) | 5: return Item::PurpleDye;\n\t\t\tcase (351 << 16) | 6: return Item::CyanDye;\n\t\t\tcase (351 << 16) | 7: return Item::LightGrayDye;\n\t\t\tcase (351 << 16) | 8: return Item::GrayDye;\n\t\t\tcase (351 << 16) | 9: return Item::PinkDye;\n\t\t\tcase (351 << 16) | 10: return Item::LimeDye;\n\t\t\tcase (351 << 16) | 11: return Item::YellowDye;\n\t\t\tcase (351 << 16) | 12: return Item::LightBlueDye;\n\t\t\tcase (351 << 16) | 13: return Item::MagentaDye;\n\t\t\tcase (351 << 16) | 14: return Item::OrangeDye;\n\t\t\tcase (351 << 16) | 15: return Item::BoneMeal;\n\t\t\tcase (352 << 16) | 0: return Item::Bone;\n\t\t\tcase (353 << 16) | 0: return Item::Sugar;\n\t\t\tcase (354 << 16) | 0: return Item::Cake;\n\t\t\tcase (355 << 16) | 0: return Item::WhiteBed;\n\t\t\tcase (355 << 16) | 1: return Item::OrangeBed;\n\t\t\tcase (355 << 16) | 2: return Item::MagentaBed;\n\t\t\tcase (355 << 16) | 3: return Item::LightBlueBed;\n\t\t\tcase (355 << 16) | 4: return Item::YellowBed;\n\t\t\tcase (355 << 16) | 5: return Item::LimeBed;\n\t\t\tcase (355 << 16) | 6: return Item::PinkBed;\n\t\t\tcase (355 << 16) | 7: return Item::GrayBed;\n\t\t\tcase (355 << 16) | 8: return Item::LightGrayBed;\n\t\t\tcase (355 << 16) | 9: return Item::CyanBed;\n\t\t\tcase (355 << 16) | 10: return Item::PurpleBed;\n\t\t\tcase (355 << 16) | 11: return Item::BlueBed;\n\t\t\tcase (355 << 16) | 12: return Item::BrownBed;\n\t\t\tcase (355 << 16) | 13: return Item::GreenBed;\n\t\t\tcase (355 << 16) | 14: return Item::RedBed;\n\t\t\tcase (355 << 16) | 15: return Item::BlackBed;\n\t\t\tcase (357 << 16) | 0: return Item::Cookie;\n\t\t\tcase (358 << 16) | 0: return Item::FilledMap;\n\t\t\tcase (359 << 16) | 0: return Item::Shears;\n\t\t\tcase (360 << 16) | 0: return Item::MelonSlice;\n\t\t\tcase (361 << 16) | 0: return Item::PumpkinSeeds;\n\t\t\tcase (362 << 16) | 0: return Item::MelonSeeds;\n\t\t\tcase (363 << 16) | 0: return Item::Beef;\n\t\t\tcase (364 << 16) | 0: return Item::CookedBeef;\n\t\t\tcase (365 << 16) | 0: return Item::Chicken;\n\t\t\tcase (366 << 16) | 0: return Item::CookedChicken;\n\t\t\tcase (367 << 16) | 0: return Item::RottenFlesh;\n\t\t\tcase (368 << 16) | 0: return Item::EnderPearl;\n\t\t\tcase (369 << 16) | 0: return Item::BlazeRod;\n\t\t\tcase (370 << 16) | 0: return Item::GhastTear;\n\t\t\tcase (371 << 16) | 0: return Item::GoldNugget;\n\t\t\tcase (372 << 16) | 0: return Item::NetherWart;\n\t\t\tcase (373 << 16) | 0: return Item::Potion;\n\t\t\tcase (438 << 16) | 0: return Item::SplashPotion;\n\t\t\tcase (441 << 16) | 0: return Item::LingeringPotion;\n\n\t\t\t// Potion type encoded in Item NBT:\n\t\t\tcase (373 << 16) | 16:\n\t\t\tcase (373 << 16) | 32:\n\t\t\tcase (373 << 16) | 64:\n\t\t\tcase (373 << 16) | 8193:\n\t\t\tcase (373 << 16) | 8194:\n\t\t\tcase (373 << 16) | 8195:\n\t\t\tcase (373 << 16) | 8196:\n\t\t\tcase (373 << 16) | 8197:\n\t\t\tcase (373 << 16) | 8198:\n\t\t\tcase (373 << 16) | 8200:\n\t\t\tcase (373 << 16) | 8201:\n\t\t\tcase (373 << 16) | 8202:\n\t\t\tcase (373 << 16) | 8204:\n\t\t\tcase (373 << 16) | 8205:\n\t\t\tcase (373 << 16) | 8206:\n\t\t\tcase (373 << 16) | 8225:\n\t\t\tcase (373 << 16) | 8226:\n\t\t\tcase (373 << 16) | 8228:\n\t\t\tcase (373 << 16) | 8229:\n\t\t\tcase (373 << 16) | 8233:\n\t\t\tcase (373 << 16) | 8235:\n\t\t\tcase (373 << 16) | 8236:\n\t\t\tcase (373 << 16) | 8257:\n\t\t\tcase (373 << 16) | 8258:\n\t\t\tcase (373 << 16) | 8259:\n\t\t\tcase (373 << 16) | 8260:\n\t\t\tcase (373 << 16) | 8262:\n\t\t\tcase (373 << 16) | 8264:\n\t\t\tcase (373 << 16) | 8265:\n\t\t\tcase (373 << 16) | 8266:\n\t\t\tcase (373 << 16) | 8267:\n\t\t\tcase (373 << 16) | 8269:\n\t\t\tcase (373 << 16) | 8270:\n\t\t\tcase (373 << 16) | 8289:\n\t\t\tcase (373 << 16) | 8290:\n\t\t\tcase (373 << 16) | 8292:\n\t\t\tcase (373 << 16) | 8297: return Item::Potion;\n\n\t\t\t// Potion type encoded in Item NBT:\n\t\t\tcase (373 << 16) | 16385:\n\t\t\tcase (373 << 16) | 16386:\n\t\t\tcase (373 << 16) | 16387:\n\t\t\tcase (373 << 16) | 16388:\n\t\t\tcase (373 << 16) | 16389:\n\t\t\tcase (373 << 16) | 16390:\n\t\t\tcase (373 << 16) | 16392:\n\t\t\tcase (373 << 16) | 16393:\n\t\t\tcase (373 << 16) | 16394:\n\t\t\tcase (373 << 16) | 16396:\n\t\t\tcase (373 << 16) | 16397:\n\t\t\tcase (373 << 16) | 16398:\n\t\t\tcase (373 << 16) | 16417:\n\t\t\tcase (373 << 16) | 16418:\n\t\t\tcase (373 << 16) | 16420:\n\t\t\tcase (373 << 16) | 16421:\n\t\t\tcase (373 << 16) | 16425:\n\t\t\tcase (373 << 16) | 16427:\n\t\t\tcase (373 << 16) | 16428:\n\t\t\tcase (373 << 16) | 16449:\n\t\t\tcase (373 << 16) | 16450:\n\t\t\tcase (373 << 16) | 16451:\n\t\t\tcase (373 << 16) | 16452:\n\t\t\tcase (373 << 16) | 16454:\n\t\t\tcase (373 << 16) | 16456:\n\t\t\tcase (373 << 16) | 16457:\n\t\t\tcase (373 << 16) | 16458:\n\t\t\tcase (373 << 16) | 16459:\n\t\t\tcase (373 << 16) | 16461:\n\t\t\tcase (373 << 16) | 16462:\n\t\t\tcase (373 << 16) | 16481:\n\t\t\tcase (373 << 16) | 16482:\n\t\t\tcase (373 << 16) | 16484:\n\t\t\tcase (373 << 16) | 16489: return Item::SplashPotion;\n\n\t\t\tcase (374 << 16) | 0: return Item::GlassBottle;\n\t\t\tcase (375 << 16) | 0: return Item::SpiderEye;\n\t\t\tcase (376 << 16) | 0: return Item::FermentedSpiderEye;\n\t\t\tcase (377 << 16) | 0: return Item::BlazePowder;\n\t\t\tcase (378 << 16) | 0: return Item::MagmaCream;\n\t\t\tcase (379 << 16) | 0: return Item::BrewingStand;\n\t\t\tcase (380 << 16) | 0: return Item::Cauldron;\n\t\t\tcase (381 << 16) | 0: return Item::EnderEye;\n\t\t\tcase (382 << 16) | 0: return Item::GlisteringMelonSlice;\n\t\t\tcase (383 << 16) | 65: return Item::BatSpawnEgg;\n\t\t\tcase (383 << 16) | 61: return Item::BlazeSpawnEgg;\n\t\t\tcase (383 << 16) | 59: return Item::CaveSpiderSpawnEgg;\n\t\t\tcase (383 << 16) | 93: return Item::ChickenSpawnEgg;\n\t\t\tcase (383 << 16) | 92: return Item::CowSpawnEgg;\n\t\t\tcase (383 << 16) | 50: return Item::CreeperSpawnEgg;\n\t\t\tcase (383 << 16) | 31: return Item::DonkeySpawnEgg;\n\t\t\tcase (383 << 16) | 4: return Item::ElderGuardianSpawnEgg;\n\t\t\tcase (383 << 16) | 58: return Item::EndermanSpawnEgg;\n\t\t\tcase (383 << 16) | 67: return Item::EndermiteSpawnEgg;\n\t\t\tcase (383 << 16) | 34: return Item::EvokerSpawnEgg;\n\t\t\tcase (383 << 16) | 56: return Item::GhastSpawnEgg;\n\t\t\tcase (383 << 16) | 68: return Item::GuardianSpawnEgg;\n\t\t\tcase (383 << 16) | 100: return Item::HorseSpawnEgg;\n\t\t\tcase (383 << 16) | 23: return Item::HuskSpawnEgg;\n\t\t\tcase (383 << 16) | 103: return Item::LlamaSpawnEgg;\n\t\t\tcase (383 << 16) | 62: return Item::MagmaCubeSpawnEgg;\n\t\t\tcase (383 << 16) | 96: return Item::MooshroomSpawnEgg;\n\t\t\tcase (383 << 16) | 32: return Item::MuleSpawnEgg;\n\t\t\tcase (383 << 16) | 98: return Item::OcelotSpawnEgg;\n\t\t\tcase (383 << 16) | 90: return Item::PigSpawnEgg;\n\t\t\tcase (383 << 16) | 102: return Item::PolarBearSpawnEgg;\n\t\t\tcase (383 << 16) | 101: return Item::RabbitSpawnEgg;\n\t\t\tcase (383 << 16) | 91: return Item::SheepSpawnEgg;\n\t\t\tcase (383 << 16) | 69: return Item::ShulkerSpawnEgg;\n\t\t\tcase (383 << 16) | 51: return Item::SkeletonSpawnEgg;\n\t\t\tcase (383 << 16) | 28: return Item::SkeletonHorseSpawnEgg;\n\t\t\tcase (383 << 16) | 55: return Item::SlimeSpawnEgg;\n\t\t\tcase (383 << 16) | 52: return Item::SpiderSpawnEgg;\n\t\t\tcase (383 << 16) | 94: return Item::SquidSpawnEgg;\n\t\t\tcase (383 << 16) | 6: return Item::StraySpawnEgg;\n\t\t\tcase (383 << 16) | 35: return Item::VexSpawnEgg;\n\t\t\tcase (383 << 16) | 120: return Item::VillagerSpawnEgg;\n\t\t\tcase (383 << 16) | 36: return Item::VindicatorSpawnEgg;\n\t\t\tcase (383 << 16) | 66: return Item::WitchSpawnEgg;\n\t\t\tcase (383 << 16) | 5: return Item::WitherSkeletonSpawnEgg;\n\t\t\tcase (383 << 16) | 95: return Item::WolfSpawnEgg;\n\t\t\tcase (383 << 16) | 54: return Item::ZombieSpawnEgg;\n\t\t\tcase (383 << 16) | 29: return Item::ZombieHorseSpawnEgg;\n\t\t\tcase (383 << 16) | 57: return Item::ZombiePigmanSpawnEgg;\n\t\t\tcase (383 << 16) | 27: return Item::ZombieVillagerSpawnEgg;\n\t\t\tcase (384 << 16) | 0: return Item::ExperienceBottle;\n\t\t\tcase (385 << 16) | 0: return Item::FireCharge;\n\t\t\tcase (386 << 16) | 0: return Item::WritableBook;\n\t\t\tcase (387 << 16) | 0: return Item::WrittenBook;\n\t\t\tcase (388 << 16) | 0: return Item::Emerald;\n\t\t\tcase (389 << 16) | 0: return Item::ItemFrame;\n\t\t\tcase (390 << 16) | 0: return Item::FlowerPot;\n\t\t\tcase (391 << 16) | 0: return Item::Carrot;\n\t\t\tcase (392 << 16) | 0: return Item::Potato;\n\t\t\tcase (393 << 16) | 0: return Item::BakedPotato;\n\t\t\tcase (394 << 16) | 0: return Item::PoisonousPotato;\n\t\t\tcase (395 << 16) | 0: return Item::Map;\n\t\t\tcase (396 << 16) | 0: return Item::GoldenCarrot;\n\t\t\tcase (397 << 16) | 0: return Item::SkeletonSkull;\n\t\t\tcase (397 << 16) | 1: return Item::WitherSkeletonSkull;\n\t\t\tcase (397 << 16) | 3: return Item::PlayerHead;\n\t\t\tcase (397 << 16) | 2: return Item::ZombieHead;\n\t\t\tcase (397 << 16) | 4: return Item::CreeperHead;\n\t\t\tcase (397 << 16) | 5: return Item::DragonHead;\n\t\t\tcase (398 << 16) | 0: return Item::CarrotOnAStick;\n\t\t\tcase (399 << 16) | 0: return Item::NetherStar;\n\t\t\tcase (400 << 16) | 0: return Item::PumpkinPie;\n\t\t\tcase (401 << 16) | 0: return Item::FireworkRocket;\n\t\t\tcase (402 << 16) | 0: return Item::FireworkStar;\n\t\t\tcase (403 << 16) | 0: return Item::EnchantedBook;\n\t\t\tcase (405 << 16) | 0: return Item::NetherBrick;\n\t\t\tcase (406 << 16) | 0: return Item::Quartz;\n\t\t\tcase (407 << 16) | 0: return Item::TNTMinecart;\n\t\t\tcase (408 << 16) | 0: return Item::HopperMinecart;\n\t\t\tcase (409 << 16) | 0: return Item::PrismarineShard;\n\t\t\tcase (410 << 16) | 0: return Item::PrismarineCrystals;\n\t\t\tcase (411 << 16) | 0: return Item::Rabbit;\n\t\t\tcase (412 << 16) | 0: return Item::CookedRabbit;\n\t\t\tcase (413 << 16) | 0: return Item::RabbitStew;\n\t\t\tcase (414 << 16) | 0: return Item::RabbitFoot;\n\t\t\tcase (415 << 16) | 0: return Item::RabbitHide;\n\t\t\tcase (416 << 16) | 0: return Item::ArmorStand;\n\t\t\tcase (417 << 16) | 0: return Item::IronHorseArmor;\n\t\t\tcase (418 << 16) | 0: return Item::GoldenHorseArmor;\n\t\t\tcase (419 << 16) | 0: return Item::DiamondHorseArmor;\n\t\t\tcase (420 << 16) | 0: return Item::Lead;\n\t\t\tcase (421 << 16) | 0: return Item::NameTag;\n\t\t\tcase (422 << 16) | 0: return Item::CommandBlockMinecart;\n\t\t\tcase (423 << 16) | 0: return Item::Mutton;\n\t\t\tcase (424 << 16) | 0: return Item::CookedMutton;\n\t\t\tcase (425 << 16) | 15: return Item::WhiteBanner;\n\t\t\tcase (425 << 16) | 14: return Item::OrangeBanner;\n\t\t\tcase (425 << 16) | 13: return Item::MagentaBanner;\n\t\t\tcase (425 << 16) | 12: return Item::LightBlueBanner;\n\t\t\tcase (425 << 16) | 11: return Item::YellowBanner;\n\t\t\tcase (425 << 16) | 10: return Item::LimeBanner;\n\t\t\tcase (425 << 16) | 9: return Item::PinkBanner;\n\t\t\tcase (425 << 16) | 8: return Item::GrayBanner;\n\t\t\tcase (425 << 16) | 7: return Item::LightGrayBanner;\n\t\t\tcase (425 << 16) | 6: return Item::CyanBanner;\n\t\t\tcase (425 << 16) | 5: return Item::PurpleBanner;\n\t\t\tcase (425 << 16) | 4: return Item::BlueBanner;\n\t\t\tcase (425 << 16) | 3: return Item::BrownBanner;\n\t\t\tcase (425 << 16) | 2: return Item::GreenBanner;\n\t\t\tcase (425 << 16) | 1: return Item::RedBanner;\n\t\t\tcase (425 << 16) | 0: return Item::BlackBanner;\n\t\t\tcase (426 << 16) | 0: return Item::EndCrystal;\n\t\t\tcase (432 << 16) | 0: return Item::ChorusFruit;\n\t\t\tcase (433 << 16) | 0: return Item::PoppedChorusFruit;\n\t\t\tcase (434 << 16) | 0: return Item::Beetroot;\n\t\t\tcase (435 << 16) | 0: return Item::BeetrootSeeds;\n\t\t\tcase (436 << 16) | 0: return Item::BeetrootSoup;\n\t\t\tcase (437 << 16) | 0: return Item::DragonBreath;\n\t\t\tcase (439 << 16) | 0: return Item::SpectralArrow;\n\t\t\tcase (440 << 16) | 0: return Item::TippedArrow;\n\t\t\tcase (442 << 16) | 0: return Item::Shield;\n\t\t\tcase (443 << 16) | 0: return Item::Elytra;\n\t\t\tcase (444 << 16) | 0: return Item::SpruceBoat;\n\t\t\tcase (445 << 16) | 0: return Item::BirchBoat;\n\t\t\tcase (446 << 16) | 0: return Item::JungleBoat;\n\t\t\tcase (447 << 16) | 0: return Item::AcaciaBoat;\n\t\t\tcase (448 << 16) | 0: return Item::DarkOakBoat;\n\t\t\tcase (449 << 16) | 0: return Item::TotemOfUndying;\n\t\t\tcase (450 << 16) | 0: return Item::ShulkerShell;\n\t\t\tcase (452 << 16) | 0: return Item::IronNugget;\n\t\t\tcase (2256 << 16) | 0: return Item::MusicDisc13;\n\t\t\tcase (2257 << 16) | 0: return Item::MusicDiscCat;\n\t\t\tcase (2258 << 16) | 0: return Item::MusicDiscBlocks;\n\t\t\tcase (2259 << 16) | 0: return Item::MusicDiscChirp;\n\t\t\tcase (2260 << 16) | 0: return Item::MusicDiscFar;\n\t\t\tcase (2261 << 16) | 0: return Item::MusicDiscMall;\n\t\t\tcase (2262 << 16) | 0: return Item::MusicDiscMellohi;\n\t\t\tcase (2263 << 16) | 0: return Item::MusicDiscStal;\n\t\t\tcase (2264 << 16) | 0: return Item::MusicDiscStrad;\n\t\t\tcase (2265 << 16) | 0: return Item::MusicDiscWard;\n\t\t\tcase (2266 << 16) | 0: return Item::MusicDisc11;\n\t\t\tcase (2267 << 16) | 0: return Item::MusicDiscWait;\n\n\t\t\t// Technical blocks that used to be able to appear\n\t\t\t// in the inventory. e.g. Water, Lava, Piston Head, Fire\n\t\t\t// Redstone Wire, Wall Sign, Stem, Portal, Cocoa, Tripwire, etc.\n\t\t\t// Some technical blocks have been manually mapped to item analogues.\n\t\t\tcase (55 << 16) | 0: return Item::Redstone;\n\t\t\tcase (68 << 16) | 0: return Item::OakSign;\n\t\t\tcase (83 << 16) | 0: return Item::SugarCane;\n\t\t\tcase (127 << 16) | 0: return Item::CocoaBeans;\n\t\t\tcase (132 << 16) | 0: return Item::String;\n\t\t\tcase (141 << 16) | 0: return Item::Carrot;\n\t\t\tcase (142 << 16) | 0: return Item::Potato;\n\t\t\tcase (207 << 16) | 0: return Item::Beetroot;\n\n\t\t\t// Monster Spawner type encoded in Item NBT\n\t\t\tcase (52 << 16) | 50:\n\t\t\tcase (52 << 16) | 51:\n\t\t\tcase (52 << 16) | 52:\n\t\t\tcase (52 << 16) | 53:\n\t\t\tcase (52 << 16) | 54:\n\t\t\tcase (52 << 16) | 55:\n\t\t\tcase (52 << 16) | 56:\n\t\t\tcase (52 << 16) | 57:\n\t\t\tcase (52 << 16) | 58:\n\t\t\tcase (52 << 16) | 59:\n\t\t\tcase (52 << 16) | 60:\n\t\t\tcase (52 << 16) | 61:\n\t\t\tcase (52 << 16) | 62:\n\t\t\tcase (52 << 16) | 63:\n\t\t\tcase (52 << 16) | 64:\n\t\t\tcase (52 << 16) | 65:\n\t\t\tcase (52 << 16) | 66:\n\t\t\tcase (52 << 16) | 90:\n\t\t\tcase (52 << 16) | 91:\n\t\t\tcase (52 << 16) | 92:\n\t\t\tcase (52 << 16) | 93:\n\t\t\tcase (52 << 16) | 94:\n\t\t\tcase (52 << 16) | 95:\n\t\t\tcase (52 << 16) | 96:\n\t\t\tcase (52 << 16) | 97:\n\t\t\tcase (52 << 16) | 98:\n\t\t\tcase (52 << 16) | 99:\n\t\t\tcase (52 << 16) | 100: return Item::Spawner;\n\n\t\t\tdefault: return Item::Air;\n\t\t}\n\t}\n\n\tstd::pair<short, short> ToItem(const Item ID)\n\t{\n\t\tswitch (ID)\n\t\t{\n\t\t\tcase Item::Stone: return { 1, 0 };\n\t\t\tcase Item::Granite: return { 1, 1 };\n\t\t\tcase Item::PolishedGranite: return { 1, 2 };\n\t\t\tcase Item::Diorite: return { 1, 3 };\n\t\t\tcase Item::PolishedDiorite: return { 1, 4 };\n\t\t\tcase Item::Andesite: return { 1, 5 };\n\t\t\tcase Item::PolishedAndesite: return { 1, 6 };\n\t\t\tcase Item::GrassBlock: return { 2, 0 };\n\t\t\tcase Item::Dirt: return { 3, 0 };\n\t\t\tcase Item::CoarseDirt: return { 3, 1 };\n\t\t\tcase Item::Podzol: return { 3, 2 };\n\t\t\tcase Item::Cobblestone: return { 4, 0 };\n\t\t\tcase Item::OakPlanks: return { 5, 0 };\n\t\t\tcase Item::SprucePlanks: return { 5, 1 };\n\t\t\tcase Item::BirchPlanks: return { 5, 2 };\n\t\t\tcase Item::JunglePlanks: return { 5, 3 };\n\t\t\tcase Item::AcaciaPlanks: return { 5, 4 };\n\t\t\tcase Item::DarkOakPlanks: return { 5, 5 };\n\t\t\tcase Item::OakSapling: return { 6, 0 };\n\t\t\tcase Item::SpruceSapling: return { 6, 1 };\n\t\t\tcase Item::BirchSapling: return { 6, 2 };\n\t\t\tcase Item::JungleSapling: return { 6, 3 };\n\t\t\tcase Item::AcaciaSapling: return { 6, 4 };\n\t\t\tcase Item::DarkOakSapling: return { 6, 5 };\n\t\t\tcase Item::Bedrock: return { 7, 0 };\n\t\t\tcase Item::Sand: return { 12, 0 };\n\t\t\tcase Item::RedSand: return { 12, 1 };\n\t\t\tcase Item::Gravel: return { 13, 0 };\n\t\t\tcase Item::GoldOre: return { 14, 0 };\n\t\t\tcase Item::IronOre: return { 15, 0 };\n\t\t\tcase Item::CoalOre: return { 16, 0 };\n\t\t\tcase Item::OakLog: return { 17, 0 };\n\t\t\tcase Item::SpruceLog: return { 17, 1 };\n\t\t\tcase Item::BirchLog: return { 17, 2 };\n\t\t\tcase Item::JungleLog: return { 17, 3 };\n\t\t\tcase Item::AcaciaLog: return { 162, 0 };\n\t\t\tcase Item::DarkOakLog: return { 162, 1 };\n\t\t\tcase Item::OakLeaves: return { 18, 0 };\n\t\t\tcase Item::SpruceLeaves: return { 18, 1 };\n\t\t\tcase Item::BirchLeaves: return { 18, 2 };\n\t\t\tcase Item::JungleLeaves: return { 18, 3 };\n\t\t\tcase Item::AcaciaLeaves: return { 161, 0 };\n\t\t\tcase Item::DarkOakLeaves: return { 161, 1 };\n\t\t\tcase Item::Sponge: return { 19, 0 };\n\t\t\tcase Item::WetSponge: return { 19, 1 };\n\t\t\tcase Item::Glass: return { 20, 0 };\n\t\t\tcase Item::LapisOre: return { 21, 0 };\n\t\t\tcase Item::LapisBlock: return { 22, 0 };\n\t\t\tcase Item::Dispenser: return { 23, 0 };\n\t\t\tcase Item::Sandstone: return { 24, 0 };\n\t\t\tcase Item::ChiseledSandstone: return { 24, 1 };\n\t\t\tcase Item::CutSandstone: return { 24, 2 };\n\t\t\tcase Item::NoteBlock: return { 25, 0 };\n\t\t\tcase Item::PoweredRail: return { 27, 0 };\n\t\t\tcase Item::DetectorRail: return { 28, 0 };\n\t\t\tcase Item::StickyPiston: return { 29, 0 };\n\t\t\tcase Item::Cobweb: return { 30, 0 };\n\t\t\tcase Item::Fern: return { 31, 2 };\n\t\t\tcase Item::DeadBush: return { 32, 0 };\n\t\t\tcase Item::Piston: return { 33, 0 };\n\t\t\tcase Item::WhiteWool: return { 35, 0 };\n\t\t\tcase Item::OrangeWool: return { 35, 1 };\n\t\t\tcase Item::MagentaWool: return { 35, 2 };\n\t\t\tcase Item::LightBlueWool: return { 35, 3 };\n\t\t\tcase Item::YellowWool: return { 35, 4 };\n\t\t\tcase Item::LimeWool: return { 35, 5 };\n\t\t\tcase Item::PinkWool: return { 35, 6 };\n\t\t\tcase Item::GrayWool: return { 35, 7 };\n\t\t\tcase Item::LightGrayWool: return { 35, 8 };\n\t\t\tcase Item::CyanWool: return { 35, 9 };\n\t\t\tcase Item::PurpleWool: return { 35, 10 };\n\t\t\tcase Item::BlueWool: return { 35, 11 };\n\t\t\tcase Item::BrownWool: return { 35, 12 };\n\t\t\tcase Item::GreenWool: return { 35, 13 };\n\t\t\tcase Item::RedWool: return { 35, 14 };\n\t\t\tcase Item::BlackWool: return { 35, 15 };\n\t\t\tcase Item::Dandelion: return { 37, 0 };\n\t\t\tcase Item::Poppy: return { 38, 0 };\n\t\t\tcase Item::BlueOrchid: return { 38, 1 };\n\t\t\tcase Item::Allium: return { 38, 2 };\n\t\t\tcase Item::AzureBluet: return { 38, 3 };\n\t\t\tcase Item::RedTulip: return { 38, 4 };\n\t\t\tcase Item::OrangeTulip: return { 38, 5 };\n\t\t\tcase Item::WhiteTulip: return { 38, 6 };\n\t\t\tcase Item::PinkTulip: return { 38, 7 };\n\t\t\tcase Item::OxeyeDaisy: return { 38, 8 };\n\t\t\tcase Item::BrownMushroom: return { 39, 0 };\n\t\t\tcase Item::RedMushroom: return { 40, 0 };\n\t\t\tcase Item::GoldBlock: return { 41, 0 };\n\t\t\tcase Item::IronBlock: return { 42, 0 };\n\t\t\tcase Item::OakSlab: return { 126, 0 };\n\t\t\tcase Item::SpruceSlab: return { 126, 1 };\n\t\t\tcase Item::BirchSlab: return { 126, 2 };\n\t\t\tcase Item::JungleSlab: return { 126, 3 };\n\t\t\tcase Item::AcaciaSlab: return { 126, 4 };\n\t\t\tcase Item::DarkOakSlab: return { 126, 5 };\n\t\t\tcase Item::StoneSlab: return { 44, 2 };\n\t\t\tcase Item::SandstoneSlab: return { 44, 1 };\n\t\t\tcase Item::CobblestoneSlab: return { 44, 3 };\n\t\t\tcase Item::BrickSlab: return { 44, 4 };\n\t\t\tcase Item::StoneBrickSlab: return { 44, 5 };\n\t\t\tcase Item::NetherBrickSlab: return { 44, 6 };\n\t\t\tcase Item::QuartzSlab: return { 44, 7 };\n\t\t\tcase Item::RedSandstoneSlab: return { 182, 0 };\n\t\t\tcase Item::PurpurSlab: return { 205, 0 };\n\t\t\tcase Item::SmoothQuartz: return { 43, 7 };\n\t\t\tcase Item::SmoothStone: return { 43, 8 };\n\t\t\tcase Item::Bricks: return { 45, 0 };\n\t\t\tcase Item::TNT: return { 46, 0 };\n\t\t\tcase Item::Bookshelf: return { 47, 0 };\n\t\t\tcase Item::MossyCobblestone: return { 48, 0 };\n\t\t\tcase Item::Obsidian: return { 49, 0 };\n\t\t\tcase Item::Torch: return { 50, 0 };\n\t\t\tcase Item::EndRod: return { 198, 0 };\n\t\t\tcase Item::ChorusPlant: return { 199, 0 };\n\t\t\tcase Item::ChorusFlower: return { 200, 0 };\n\t\t\tcase Item::PurpurBlock: return { 201, 0 };\n\t\t\tcase Item::PurpurPillar: return { 202, 0 };\n\t\t\tcase Item::PurpurStairs: return { 203, 0 };\n\t\t\tcase Item::Spawner: return { 52, 0 };\n\t\t\tcase Item::OakStairs: return { 53, 0 };\n\t\t\tcase Item::Chest: return { 54, 0 };\n\t\t\tcase Item::DiamondOre: return { 56, 0 };\n\t\t\tcase Item::DiamondBlock: return { 57, 0 };\n\t\t\tcase Item::CraftingTable: return { 58, 0 };\n\t\t\tcase Item::Farmland: return { 60, 0 };\n\t\t\tcase Item::Furnace: return { 61, 0 };\n\t\t\tcase Item::Ladder: return { 65, 0 };\n\t\t\tcase Item::Rail: return { 66, 0 };\n\t\t\tcase Item::CobblestoneStairs: return { 67, 0 };\n\t\t\tcase Item::Lever: return { 69, 0 };\n\t\t\tcase Item::StonePressurePlate: return { 70, 0 };\n\t\t\tcase Item::OakPressurePlate: return { 72, 0 };\n\t\t\tcase Item::RedstoneOre: return { 73, 0 };\n\t\t\tcase Item::RedstoneTorch: return { 76, 0 };\n\t\t\tcase Item::StoneButton: return { 77, 0 };\n\t\t\tcase Item::Snow: return { 78, 0 };\n\t\t\tcase Item::Ice: return { 79, 0 };\n\t\t\tcase Item::SnowBlock: return { 80, 0 };\n\t\t\tcase Item::Cactus: return { 81, 0 };\n\t\t\tcase Item::Clay: return { 82, 0 };\n\t\t\tcase Item::Jukebox: return { 84, 0 };\n\t\t\tcase Item::OakFence: return { 85, 0 };\n\t\t\tcase Item::SpruceFence: return { 188, 0 };\n\t\t\tcase Item::BirchFence: return { 189, 0 };\n\t\t\tcase Item::JungleFence: return { 190, 0 };\n\t\t\tcase Item::AcaciaFence: return { 192, 0 };\n\t\t\tcase Item::DarkOakFence: return { 191, 0 };\n\t\t\tcase Item::Pumpkin: return { 86, 0 };\n\t\t\tcase Item::Netherrack: return { 87, 0 };\n\t\t\tcase Item::SoulSand: return { 88, 0 };\n\t\t\tcase Item::Glowstone: return { 89, 0 };\n\t\t\tcase Item::JackOLantern: return { 91, 0 };\n\t\t\tcase Item::OakTrapdoor: return { 96, 0 };\n\t\t\tcase Item::InfestedStone: return { 97, 0 };\n\t\t\tcase Item::InfestedCobblestone: return { 97, 1 };\n\t\t\tcase Item::InfestedStoneBricks: return { 97, 2 };\n\t\t\tcase Item::InfestedMossyStoneBricks: return { 97, 3 };\n\t\t\tcase Item::InfestedCrackedStoneBricks: return { 97, 4 };\n\t\t\tcase Item::InfestedChiseledStoneBricks: return { 97, 5 };\n\t\t\tcase Item::StoneBricks: return { 98, 0 };\n\t\t\tcase Item::MossyStoneBricks: return { 98, 1 };\n\t\t\tcase Item::CrackedStoneBricks: return { 98, 2 };\n\t\t\tcase Item::ChiseledStoneBricks: return { 98, 3 };\n\t\t\tcase Item::BrownMushroomBlock: return { 99, 0 };\n\t\t\tcase Item::RedMushroomBlock: return { 100, 0 };\n\t\t\tcase Item::IronBars: return { 101, 0 };\n\t\t\tcase Item::GlassPane: return { 102, 0 };\n\t\t\tcase Item::Melon: return { 103, 0 };\n\t\t\tcase Item::Vine: return { 106, 0 };\n\t\t\tcase Item::OakFenceGate: return { 107, 0 };\n\t\t\tcase Item::SpruceFenceGate: return { 183, 0 };\n\t\t\tcase Item::BirchFenceGate: return { 184, 0 };\n\t\t\tcase Item::JungleFenceGate: return { 185, 0 };\n\t\t\tcase Item::AcaciaFenceGate: return { 187, 0 };\n\t\t\tcase Item::DarkOakFenceGate: return { 186, 0 };\n\t\t\tcase Item::BrickStairs: return { 108, 0 };\n\t\t\tcase Item::StoneBrickStairs: return { 109, 0 };\n\t\t\tcase Item::Mycelium: return { 110, 0 };\n\t\t\tcase Item::LilyPad: return { 111, 0 };\n\t\t\tcase Item::NetherBricks: return { 112, 0 };\n\t\t\tcase Item::NetherBrickFence: return { 113, 0 };\n\t\t\tcase Item::NetherBrickStairs: return { 114, 0 };\n\t\t\tcase Item::EnchantingTable: return { 116, 0 };\n\t\t\tcase Item::EndPortalFrame: return { 120, 0 };\n\t\t\tcase Item::EndStone: return { 121, 0 };\n\t\t\tcase Item::EndStoneBricks: return { 206, 0 };\n\t\t\tcase Item::DragonEgg: return { 122, 0 };\n\t\t\tcase Item::RedstoneLamp: return { 123, 0 };\n\t\t\tcase Item::SandstoneStairs: return { 128, 0 };\n\t\t\tcase Item::EmeraldOre: return { 129, 0 };\n\t\t\tcase Item::EnderChest: return { 130, 0 };\n\t\t\tcase Item::TripwireHook: return { 131, 0 };\n\t\t\tcase Item::EmeraldBlock: return { 133, 0 };\n\t\t\tcase Item::SpruceStairs: return { 134, 0 };\n\t\t\tcase Item::BirchStairs: return { 135, 0 };\n\t\t\tcase Item::JungleStairs: return { 136, 0 };\n\t\t\tcase Item::CommandBlock: return { 137, 0 };\n\t\t\tcase Item::Beacon: return { 138, 0 };\n\t\t\tcase Item::CobblestoneWall: return { 139, 0 };\n\t\t\tcase Item::MossyCobblestoneWall: return { 139, 1 };\n\t\t\tcase Item::OakButton: return { 143, 0 };\n\t\t\tcase Item::Anvil: return { 145, 0 };\n\t\t\tcase Item::ChippedAnvil: return { 145, 1 };\n\t\t\tcase Item::DamagedAnvil: return { 145, 2 };\n\t\t\tcase Item::TrappedChest: return { 146, 0 };\n\t\t\tcase Item::LightWeightedPressurePlate: return { 147, 0 };\n\t\t\tcase Item::HeavyWeightedPressurePlate: return { 148, 0 };\n\t\t\tcase Item::DaylightDetector: return { 151, 0 };\n\t\t\tcase Item::RedstoneBlock: return { 152, 0 };\n\t\t\tcase Item::NetherQuartzOre: return { 153, 0 };\n\t\t\tcase Item::Hopper: return { 154, 0 };\n\t\t\tcase Item::ChiseledQuartzBlock: return { 155, 1 };\n\t\t\tcase Item::QuartzBlock: return { 155, 0 };\n\t\t\tcase Item::QuartzPillar: return { 155, 2 };\n\t\t\tcase Item::QuartzStairs: return { 156, 0 };\n\t\t\tcase Item::ActivatorRail: return { 157, 0 };\n\t\t\tcase Item::Dropper: return { 158, 0 };\n\t\t\tcase Item::WhiteTerracotta: return { 159, 0 };\n\t\t\tcase Item::OrangeTerracotta: return { 159, 1 };\n\t\t\tcase Item::MagentaTerracotta: return { 159, 2 };\n\t\t\tcase Item::LightBlueTerracotta: return { 159, 3 };\n\t\t\tcase Item::YellowTerracotta: return { 159, 4 };\n\t\t\tcase Item::LimeTerracotta: return { 159, 5 };\n\t\t\tcase Item::PinkTerracotta: return { 159, 6 };\n\t\t\tcase Item::GrayTerracotta: return { 159, 7 };\n\t\t\tcase Item::LightGrayTerracotta: return { 159, 8 };\n\t\t\tcase Item::CyanTerracotta: return { 159, 9 };\n\t\t\tcase Item::PurpleTerracotta: return { 159, 10 };\n\t\t\tcase Item::BlueTerracotta: return { 159, 11 };\n\t\t\tcase Item::BrownTerracotta: return { 159, 12 };\n\t\t\tcase Item::GreenTerracotta: return { 159, 13 };\n\t\t\tcase Item::RedTerracotta: return { 159, 14 };\n\t\t\tcase Item::BlackTerracotta: return { 159, 15 };\n\t\t\tcase Item::Barrier: return { 166, 0 };\n\t\t\tcase Item::IronTrapdoor: return { 167, 0 };\n\t\t\tcase Item::HayBale: return { 170, 0 };\n\t\t\tcase Item::WhiteCarpet: return { 171, 0 };\n\t\t\tcase Item::OrangeCarpet: return { 171, 1 };\n\t\t\tcase Item::MagentaCarpet: return { 171, 2 };\n\t\t\tcase Item::LightBlueCarpet: return { 171, 3 };\n\t\t\tcase Item::YellowCarpet: return { 171, 4 };\n\t\t\tcase Item::LimeCarpet: return { 171, 5 };\n\t\t\tcase Item::PinkCarpet: return { 171, 6 };\n\t\t\tcase Item::GrayCarpet: return { 171, 7 };\n\t\t\tcase Item::LightGrayCarpet: return { 171, 8 };\n\t\t\tcase Item::CyanCarpet: return { 171, 9 };\n\t\t\tcase Item::PurpleCarpet: return { 171, 10 };\n\t\t\tcase Item::BlueCarpet: return { 171, 11 };\n\t\t\tcase Item::BrownCarpet: return { 171, 12 };\n\t\t\tcase Item::GreenCarpet: return { 171, 13 };\n\t\t\tcase Item::RedCarpet: return { 171, 14 };\n\t\t\tcase Item::BlackCarpet: return { 171, 15 };\n\t\t\tcase Item::Terracotta: return { 172, 0 };\n\t\t\tcase Item::CoalBlock: return { 173, 0 };\n\t\t\tcase Item::PackedIce: return { 174, 0 };\n\t\t\tcase Item::AcaciaStairs: return { 163, 0 };\n\t\t\tcase Item::DarkOakStairs: return { 164, 0 };\n\t\t\tcase Item::SlimeBlock: return { 165, 0 };\n\t\t\tcase Item::GrassPath: return { 208, 0 };\n\t\t\tcase Item::Sunflower: return { 175, 0 };\n\t\t\tcase Item::Lilac: return { 175, 1 };\n\t\t\tcase Item::RoseBush: return { 175, 4 };\n\t\t\tcase Item::Peony: return { 175, 5 };\n\t\t\tcase Item::TallGrass: return { 175, 2 };\n\t\t\tcase Item::LargeFern: return { 175, 3 };\n\t\t\tcase Item::WhiteStainedGlass: return { 95, 0 };\n\t\t\tcase Item::OrangeStainedGlass: return { 95, 1 };\n\t\t\tcase Item::MagentaStainedGlass: return { 95, 2 };\n\t\t\tcase Item::LightBlueStainedGlass: return { 95, 3 };\n\t\t\tcase Item::YellowStainedGlass: return { 95, 4 };\n\t\t\tcase Item::LimeStainedGlass: return { 95, 5 };\n\t\t\tcase Item::PinkStainedGlass: return { 95, 6 };\n\t\t\tcase Item::GrayStainedGlass: return { 95, 7 };\n\t\t\tcase Item::LightGrayStainedGlass: return { 95, 8 };\n\t\t\tcase Item::CyanStainedGlass: return { 95, 9 };\n\t\t\tcase Item::PurpleStainedGlass: return { 95, 10 };\n\t\t\tcase Item::BlueStainedGlass: return { 95, 11 };\n\t\t\tcase Item::BrownStainedGlass: return { 95, 12 };\n\t\t\tcase Item::GreenStainedGlass: return { 95, 13 };\n\t\t\tcase Item::RedStainedGlass: return { 95, 14 };\n\t\t\tcase Item::BlackStainedGlass: return { 95, 15 };\n\t\t\tcase Item::WhiteStainedGlassPane: return { 160, 0 };\n\t\t\tcase Item::OrangeStainedGlassPane: return { 160, 1 };\n\t\t\tcase Item::MagentaStainedGlassPane: return { 160, 2 };\n\t\t\tcase Item::LightBlueStainedGlassPane: return { 160, 3 };\n\t\t\tcase Item::YellowStainedGlassPane: return { 160, 4 };\n\t\t\tcase Item::LimeStainedGlassPane: return { 160, 5 };\n\t\t\tcase Item::PinkStainedGlassPane: return { 160, 6 };\n\t\t\tcase Item::GrayStainedGlassPane: return { 160, 7 };\n\t\t\tcase Item::LightGrayStainedGlassPane: return { 160, 8 };\n\t\t\tcase Item::CyanStainedGlassPane: return { 160, 9 };\n\t\t\tcase Item::PurpleStainedGlassPane: return { 160, 10 };\n\t\t\tcase Item::BlueStainedGlassPane: return { 160, 11 };\n\t\t\tcase Item::BrownStainedGlassPane: return { 160, 12 };\n\t\t\tcase Item::GreenStainedGlassPane: return { 160, 13 };\n\t\t\tcase Item::RedStainedGlassPane: return { 160, 14 };\n\t\t\tcase Item::BlackStainedGlassPane: return { 160, 15 };\n\t\t\tcase Item::Prismarine: return { 168, 0 };\n\t\t\tcase Item::PrismarineBricks: return { 168, 1 };\n\t\t\tcase Item::DarkPrismarine: return { 168, 2 };\n\t\t\tcase Item::SeaLantern: return { 169, 0 };\n\t\t\tcase Item::RedSandstone: return { 179, 0 };\n\t\t\tcase Item::ChiseledRedSandstone: return { 179, 1 };\n\t\t\tcase Item::CutRedSandstone: return { 179, 2 };\n\t\t\tcase Item::RedSandstoneStairs: return { 180, 0 };\n\t\t\tcase Item::RepeatingCommandBlock: return { 210, 0 };\n\t\t\tcase Item::ChainCommandBlock: return { 211, 0 };\n\t\t\tcase Item::MagmaBlock: return { 213, 0 };\n\t\t\tcase Item::NetherWartBlock: return { 214, 0 };\n\t\t\tcase Item::RedNetherBricks: return { 215, 0 };\n\t\t\tcase Item::BoneBlock: return { 216, 0 };\n\t\t\tcase Item::StructureVoid: return { 217, 0 };\n\t\t\tcase Item::Observer: return { 218, 0 };\n\t\t\tcase Item::WhiteShulkerBox: return { 219, 0 };\n\t\t\tcase Item::OrangeShulkerBox: return { 220, 0 };\n\t\t\tcase Item::MagentaShulkerBox: return { 221, 0 };\n\t\t\tcase Item::LightBlueShulkerBox: return { 222, 0 };\n\t\t\tcase Item::YellowShulkerBox: return { 223, 0 };\n\t\t\tcase Item::LimeShulkerBox: return { 224, 0 };\n\t\t\tcase Item::PinkShulkerBox: return { 225, 0 };\n\t\t\tcase Item::GrayShulkerBox: return { 226, 0 };\n\t\t\tcase Item::LightGrayShulkerBox: return { 227, 0 };\n\t\t\tcase Item::CyanShulkerBox: return { 228, 0 };\n\t\t\tcase Item::PurpleShulkerBox: return { 229, 0 };\n\t\t\tcase Item::BlueShulkerBox: return { 230, 0 };\n\t\t\tcase Item::BrownShulkerBox: return { 231, 0 };\n\t\t\tcase Item::GreenShulkerBox: return { 232, 0 };\n\t\t\tcase Item::RedShulkerBox: return { 233, 0 };\n\t\t\tcase Item::BlackShulkerBox: return { 234, 0 };\n\t\t\tcase Item::WhiteGlazedTerracotta: return { 235, 0 };\n\t\t\tcase Item::OrangeGlazedTerracotta: return { 236, 0 };\n\t\t\tcase Item::MagentaGlazedTerracotta: return { 237, 0 };\n\t\t\tcase Item::LightBlueGlazedTerracotta: return { 238, 0 };\n\t\t\tcase Item::YellowGlazedTerracotta: return { 239, 0 };\n\t\t\tcase Item::LimeGlazedTerracotta: return { 240, 0 };\n\t\t\tcase Item::PinkGlazedTerracotta: return { 241, 0 };\n\t\t\tcase Item::GrayGlazedTerracotta: return { 242, 0 };\n\t\t\tcase Item::LightGrayGlazedTerracotta: return { 243, 0 };\n\t\t\tcase Item::CyanGlazedTerracotta: return { 244, 0 };\n\t\t\tcase Item::PurpleGlazedTerracotta: return { 245, 0 };\n\t\t\tcase Item::BlueGlazedTerracotta: return { 246, 0 };\n\t\t\tcase Item::BrownGlazedTerracotta: return { 247, 0 };\n\t\t\tcase Item::GreenGlazedTerracotta: return { 248, 0 };\n\t\t\tcase Item::RedGlazedTerracotta: return { 249, 0 };\n\t\t\tcase Item::BlackGlazedTerracotta: return { 250, 0 };\n\t\t\tcase Item::WhiteConcrete: return { 251, 0 };\n\t\t\tcase Item::OrangeConcrete: return { 251, 1 };\n\t\t\tcase Item::MagentaConcrete: return { 251, 2 };\n\t\t\tcase Item::LightBlueConcrete: return { 251, 3 };\n\t\t\tcase Item::YellowConcrete: return { 251, 4 };\n\t\t\tcase Item::LimeConcrete: return { 251, 5 };\n\t\t\tcase Item::PinkConcrete: return { 251, 6 };\n\t\t\tcase Item::GrayConcrete: return { 251, 7 };\n\t\t\tcase Item::LightGrayConcrete: return { 251, 8 };\n\t\t\tcase Item::CyanConcrete: return { 251, 9 };\n\t\t\tcase Item::PurpleConcrete: return { 251, 10 };\n\t\t\tcase Item::BlueConcrete: return { 251, 11 };\n\t\t\tcase Item::BrownConcrete: return { 251, 12 };\n\t\t\tcase Item::GreenConcrete: return { 251, 13 };\n\t\t\tcase Item::RedConcrete: return { 251, 14 };\n\t\t\tcase Item::BlackConcrete: return { 251, 15 };\n\t\t\tcase Item::WhiteConcretePowder: return { 252, 0 };\n\t\t\tcase Item::OrangeConcretePowder: return { 252, 1 };\n\t\t\tcase Item::MagentaConcretePowder: return { 252, 2 };\n\t\t\tcase Item::LightBlueConcretePowder: return { 252, 3 };\n\t\t\tcase Item::YellowConcretePowder: return { 252, 4 };\n\t\t\tcase Item::LimeConcretePowder: return { 252, 5 };\n\t\t\tcase Item::PinkConcretePowder: return { 252, 6 };\n\t\t\tcase Item::GrayConcretePowder: return { 252, 7 };\n\t\t\tcase Item::LightGrayConcretePowder: return { 252, 8 };\n\t\t\tcase Item::CyanConcretePowder: return { 252, 9 };\n\t\t\tcase Item::PurpleConcretePowder: return { 252, 10 };\n\t\t\tcase Item::BlueConcretePowder: return { 252, 11 };\n\t\t\tcase Item::BrownConcretePowder: return { 252, 12 };\n\t\t\tcase Item::GreenConcretePowder: return { 252, 13 };\n\t\t\tcase Item::RedConcretePowder: return { 252, 14 };\n\t\t\tcase Item::BlackConcretePowder: return { 252, 15 };\n\t\t\tcase Item::IronDoor: return { 330, 0 };\n\t\t\tcase Item::OakDoor: return { 324, 0 };\n\t\t\tcase Item::SpruceDoor: return { 427, 0 };\n\t\t\tcase Item::BirchDoor: return { 428, 0 };\n\t\t\tcase Item::JungleDoor: return { 429, 0 };\n\t\t\tcase Item::AcaciaDoor: return { 430, 0 };\n\t\t\tcase Item::DarkOakDoor: return { 431, 0 };\n\t\t\tcase Item::Repeater: return { 356, 0 };\n\t\t\tcase Item::Comparator: return { 404, 0 };\n\t\t\tcase Item::StructureBlock: return { 255, 0 };\n\t\t\tcase Item::IronShovel: return { 256, 0 };\n\t\t\tcase Item::IronPickaxe: return { 257, 0 };\n\t\t\tcase Item::IronAxe: return { 258, 0 };\n\t\t\tcase Item::FlintAndSteel: return { 259, 0 };\n\t\t\tcase Item::Apple: return { 260, 0 };\n\t\t\tcase Item::Bow: return { 261, 0 };\n\t\t\tcase Item::Arrow: return { 262, 0 };\n\t\t\tcase Item::Coal: return { 263, 0 };\n\t\t\tcase Item::Charcoal: return { 263, 1 };\n\t\t\tcase Item::Diamond: return { 264, 0 };\n\t\t\tcase Item::IronIngot: return { 265, 0 };\n\t\t\tcase Item::GoldIngot: return { 266, 0 };\n\t\t\tcase Item::IronSword: return { 267, 0 };\n\t\t\tcase Item::WoodenSword: return { 268, 0 };\n\t\t\tcase Item::WoodenShovel: return { 269, 0 };\n\t\t\tcase Item::WoodenPickaxe: return { 270, 0 };\n\t\t\tcase Item::WoodenAxe: return { 271, 0 };\n\t\t\tcase Item::StoneSword: return { 272, 0 };\n\t\t\tcase Item::StoneShovel: return { 273, 0 };\n\t\t\tcase Item::StonePickaxe: return { 274, 0 };\n\t\t\tcase Item::StoneAxe: return { 275, 0 };\n\t\t\tcase Item::DiamondSword: return { 276, 0 };\n\t\t\tcase Item::DiamondShovel: return { 277, 0 };\n\t\t\tcase Item::DiamondPickaxe: return { 278, 0 };\n\t\t\tcase Item::DiamondAxe: return { 279, 0 };\n\t\t\tcase Item::Stick: return { 280, 0 };\n\t\t\tcase Item::Bowl: return { 281, 0 };\n\t\t\tcase Item::MushroomStew: return { 282, 0 };\n\t\t\tcase Item::GoldenSword: return { 283, 0 };\n\t\t\tcase Item::GoldenShovel: return { 284, 0 };\n\t\t\tcase Item::GoldenPickaxe: return { 285, 0 };\n\t\t\tcase Item::GoldenAxe: return { 286, 0 };\n\t\t\tcase Item::String: return { 287, 0 };\n\t\t\tcase Item::Feather: return { 288, 0 };\n\t\t\tcase Item::Gunpowder: return { 289, 0 };\n\t\t\tcase Item::WoodenHoe: return { 290, 0 };\n\t\t\tcase Item::StoneHoe: return { 291, 0 };\n\t\t\tcase Item::IronHoe: return { 292, 0 };\n\t\t\tcase Item::DiamondHoe: return { 293, 0 };\n\t\t\tcase Item::GoldenHoe: return { 294, 0 };\n\t\t\tcase Item::WheatSeeds: return { 295, 0 };\n\t\t\tcase Item::Wheat: return { 296, 0 };\n\t\t\tcase Item::Bread: return { 297, 0 };\n\t\t\tcase Item::LeatherHelmet: return { 298, 0 };\n\t\t\tcase Item::LeatherChestplate: return { 299, 0 };\n\t\t\tcase Item::LeatherLeggings: return { 300, 0 };\n\t\t\tcase Item::LeatherBoots: return { 301, 0 };\n\t\t\tcase Item::ChainmailHelmet: return { 302, 0 };\n\t\t\tcase Item::ChainmailChestplate: return { 303, 0 };\n\t\t\tcase Item::ChainmailLeggings: return { 304, 0 };\n\t\t\tcase Item::ChainmailBoots: return { 305, 0 };\n\t\t\tcase Item::IronHelmet: return { 306, 0 };\n\t\t\tcase Item::IronChestplate: return { 307, 0 };\n\t\t\tcase Item::IronLeggings: return { 308, 0 };\n\t\t\tcase Item::IronBoots: return { 309, 0 };\n\t\t\tcase Item::DiamondHelmet: return { 310, 0 };\n\t\t\tcase Item::DiamondChestplate: return { 311, 0 };\n\t\t\tcase Item::DiamondLeggings: return { 312, 0 };\n\t\t\tcase Item::DiamondBoots: return { 313, 0 };\n\t\t\tcase Item::GoldenHelmet: return { 314, 0 };\n\t\t\tcase Item::GoldenChestplate: return { 315, 0 };\n\t\t\tcase Item::GoldenLeggings: return { 316, 0 };\n\t\t\tcase Item::GoldenBoots: return { 317, 0 };\n\t\t\tcase Item::Flint: return { 318, 0 };\n\t\t\tcase Item::Porkchop: return { 319, 0 };\n\t\t\tcase Item::CookedPorkchop: return { 320, 0 };\n\t\t\tcase Item::Painting: return { 321, 0 };\n\t\t\tcase Item::GoldenApple: return { 322, 0 };\n\t\t\tcase Item::EnchantedGoldenApple: return { 322, 1 };\n\t\t\tcase Item::OakSign: return { 323, 0 };\n\t\t\tcase Item::Bucket: return { 325, 0 };\n\t\t\tcase Item::WaterBucket: return { 326, 0 };\n\t\t\tcase Item::LavaBucket: return { 327, 0 };\n\t\t\tcase Item::Minecart: return { 328, 0 };\n\t\t\tcase Item::Saddle: return { 329, 0 };\n\t\t\tcase Item::Redstone: return { 331, 0 };\n\t\t\tcase Item::Snowball: return { 332, 0 };\n\t\t\tcase Item::OakBoat: return { 333, 0 };\n\t\t\tcase Item::Leather: return { 334, 0 };\n\t\t\tcase Item::MilkBucket: return { 335, 0 };\n\t\t\tcase Item::Brick: return { 336, 0 };\n\t\t\tcase Item::ClayBall: return { 337, 0 };\n\t\t\tcase Item::SugarCane: return { 338, 0 };\n\t\t\tcase Item::Paper: return { 339, 0 };\n\t\t\tcase Item::Book: return { 340, 0 };\n\t\t\tcase Item::SlimeBall: return { 341, 0 };\n\t\t\tcase Item::ChestMinecart: return { 342, 0 };\n\t\t\tcase Item::FurnaceMinecart: return { 343, 0 };\n\t\t\tcase Item::Egg: return { 344, 0 };\n\t\t\tcase Item::Compass: return { 345, 0 };\n\t\t\tcase Item::FishingRod: return { 346, 0 };\n\t\t\tcase Item::Clock: return { 347, 0 };\n\t\t\tcase Item::GlowstoneDust: return { 348, 0 };\n\t\t\tcase Item::Cod: return { 349, 0 };\n\t\t\tcase Item::Salmon: return { 349, 1 };\n\t\t\tcase Item::TropicalFish: return { 349, 2 };\n\t\t\tcase Item::Pufferfish: return { 349, 3 };\n\t\t\tcase Item::CookedCod: return { 350, 0 };\n\t\t\tcase Item::CookedSalmon: return { 350, 1 };\n\t\t\tcase Item::InkSac: return { 351, 0 };\n\t\t\tcase Item::RedDye: return { 351, 1 };\n\t\t\tcase Item::GreenDye: return { 351, 2 };\n\t\t\tcase Item::CocoaBeans: return { 351, 3 };\n\t\t\tcase Item::LapisLazuli: return { 351, 4 };\n\t\t\tcase Item::PurpleDye: return { 351, 5 };\n\t\t\tcase Item::CyanDye: return { 351, 6 };\n\t\t\tcase Item::LightGrayDye: return { 351, 7 };\n\t\t\tcase Item::GrayDye: return { 351, 8 };\n\t\t\tcase Item::PinkDye: return { 351, 9 };\n\t\t\tcase Item::LimeDye: return { 351, 10 };\n\t\t\tcase Item::YellowDye: return { 351, 11 };\n\t\t\tcase Item::LightBlueDye: return { 351, 12 };\n\t\t\tcase Item::MagentaDye: return { 351, 13 };\n\t\t\tcase Item::OrangeDye: return { 351, 14 };\n\t\t\tcase Item::BoneMeal: return { 351, 15 };\n\t\t\tcase Item::Bone: return { 352, 0 };\n\t\t\tcase Item::Sugar: return { 353, 0 };\n\t\t\tcase Item::Cake: return { 354, 0 };\n\t\t\tcase Item::WhiteBed: return { 355, 0 };\n\t\t\tcase Item::OrangeBed: return { 355, 1 };\n\t\t\tcase Item::MagentaBed: return { 355, 2 };\n\t\t\tcase Item::LightBlueBed: return { 355, 3 };\n\t\t\tcase Item::YellowBed: return { 355, 4 };\n\t\t\tcase Item::LimeBed: return { 355, 5 };\n\t\t\tcase Item::PinkBed: return { 355, 6 };\n\t\t\tcase Item::GrayBed: return { 355, 7 };\n\t\t\tcase Item::LightGrayBed: return { 355, 8 };\n\t\t\tcase Item::CyanBed: return { 355, 9 };\n\t\t\tcase Item::PurpleBed: return { 355, 10 };\n\t\t\tcase Item::BlueBed: return { 355, 11 };\n\t\t\tcase Item::BrownBed: return { 355, 12 };\n\t\t\tcase Item::GreenBed: return { 355, 13 };\n\t\t\tcase Item::RedBed: return { 355, 14 };\n\t\t\tcase Item::BlackBed: return { 355, 15 };\n\t\t\tcase Item::Cookie: return { 357, 0 };\n\t\t\tcase Item::FilledMap: return { 358, 0 };\n\t\t\tcase Item::Shears: return { 359, 0 };\n\t\t\tcase Item::MelonSlice: return { 360, 0 };\n\t\t\tcase Item::PumpkinSeeds: return { 361, 0 };\n\t\t\tcase Item::MelonSeeds: return { 362, 0 };\n\t\t\tcase Item::Beef: return { 363, 0 };\n\t\t\tcase Item::CookedBeef: return { 364, 0 };\n\t\t\tcase Item::Chicken: return { 365, 0 };\n\t\t\tcase Item::CookedChicken: return { 366, 0 };\n\t\t\tcase Item::RottenFlesh: return { 367, 0 };\n\t\t\tcase Item::EnderPearl: return { 368, 0 };\n\t\t\tcase Item::BlazeRod: return { 369, 0 };\n\t\t\tcase Item::GhastTear: return { 370, 0 };\n\t\t\tcase Item::GoldNugget: return { 371, 0 };\n\t\t\tcase Item::NetherWart: return { 372, 0 };\n\t\t\tcase Item::Potion: return { 373, 0 };\n\t\t\tcase Item::SplashPotion: return { 438, 0 };\n\t\t\tcase Item::LingeringPotion: return { 441, 0 };\n\t\t\tcase Item::GlassBottle: return { 374, 0 };\n\t\t\tcase Item::SpiderEye: return { 375, 0 };\n\t\t\tcase Item::FermentedSpiderEye: return { 376, 0 };\n\t\t\tcase Item::BlazePowder: return { 377, 0 };\n\t\t\tcase Item::MagmaCream: return { 378, 0 };\n\t\t\tcase Item::BrewingStand: return { 379, 0 };\n\t\t\tcase Item::Cauldron: return { 380, 0 };\n\t\t\tcase Item::EnderEye: return { 381, 0 };\n\t\t\tcase Item::GlisteringMelonSlice: return { 382, 0 };\n\t\t\tcase Item::BatSpawnEgg: return { 383, 65 };\n\t\t\tcase Item::BlazeSpawnEgg: return { 383, 61 };\n\t\t\tcase Item::CaveSpiderSpawnEgg: return { 383, 59 };\n\t\t\tcase Item::ChickenSpawnEgg: return { 383, 93 };\n\t\t\tcase Item::CowSpawnEgg: return { 383, 92 };\n\t\t\tcase Item::CreeperSpawnEgg: return { 383, 50 };\n\t\t\tcase Item::DonkeySpawnEgg: return { 383, 31 };\n\t\t\tcase Item::ElderGuardianSpawnEgg: return { 383, 4 };\n\t\t\tcase Item::EndermanSpawnEgg: return { 383, 58 };\n\t\t\tcase Item::EndermiteSpawnEgg: return { 383, 67 };\n\t\t\tcase Item::EvokerSpawnEgg: return { 383, 34 };\n\t\t\tcase Item::GhastSpawnEgg: return { 383, 56 };\n\t\t\tcase Item::GuardianSpawnEgg: return { 383, 68 };\n\t\t\tcase Item::HorseSpawnEgg: return { 383, 100 };\n\t\t\tcase Item::HuskSpawnEgg: return { 383, 23 };\n\t\t\tcase Item::LlamaSpawnEgg: return { 383, 103 };\n\t\t\tcase Item::MagmaCubeSpawnEgg: return { 383, 62 };\n\t\t\tcase Item::MooshroomSpawnEgg: return { 383, 96 };\n\t\t\tcase Item::MuleSpawnEgg: return { 383, 32 };\n\t\t\tcase Item::OcelotSpawnEgg: return { 383, 98 };\n\t\t\tcase Item::PigSpawnEgg: return { 383, 90 };\n\t\t\tcase Item::PolarBearSpawnEgg: return { 383, 102 };\n\t\t\tcase Item::RabbitSpawnEgg: return { 383, 101 };\n\t\t\tcase Item::SheepSpawnEgg: return { 383, 91 };\n\t\t\tcase Item::ShulkerSpawnEgg: return { 383, 69 };\n\t\t\tcase Item::SkeletonSpawnEgg: return { 383, 51 };\n\t\t\tcase Item::SkeletonHorseSpawnEgg: return { 383, 28 };\n\t\t\tcase Item::SlimeSpawnEgg: return { 383, 55 };\n\t\t\tcase Item::SpiderSpawnEgg: return { 383, 52 };\n\t\t\tcase Item::SquidSpawnEgg: return { 383, 94 };\n\t\t\tcase Item::StraySpawnEgg: return { 383, 6 };\n\t\t\tcase Item::VexSpawnEgg: return { 383, 35 };\n\t\t\tcase Item::VillagerSpawnEgg: return { 383, 120 };\n\t\t\tcase Item::VindicatorSpawnEgg: return { 383, 36 };\n\t\t\tcase Item::WitchSpawnEgg: return { 383, 66 };\n\t\t\tcase Item::WitherSkeletonSpawnEgg: return { 383, 5 };\n\t\t\tcase Item::WolfSpawnEgg: return { 383, 95 };\n\t\t\tcase Item::ZombieSpawnEgg: return { 383, 54 };\n\t\t\tcase Item::ZombieHorseSpawnEgg: return { 383, 29 };\n\t\t\tcase Item::ZombiePigmanSpawnEgg: return { 383, 57 };\n\t\t\tcase Item::ZombieVillagerSpawnEgg: return { 383, 27 };\n\t\t\tcase Item::ExperienceBottle: return { 384, 0 };\n\t\t\tcase Item::FireCharge: return { 385, 0 };\n\t\t\tcase Item::WritableBook: return { 386, 0 };\n\t\t\tcase Item::WrittenBook: return { 387, 0 };\n\t\t\tcase Item::Emerald: return { 388, 0 };\n\t\t\tcase Item::ItemFrame: return { 389, 0 };\n\t\t\tcase Item::FlowerPot: return { 390, 0 };\n\t\t\tcase Item::Carrot: return { 391, 0 };\n\t\t\tcase Item::Potato: return { 392, 0 };\n\t\t\tcase Item::BakedPotato: return { 393, 0 };\n\t\t\tcase Item::PoisonousPotato: return { 394, 0 };\n\t\t\tcase Item::Map: return { 395, 0 };\n\t\t\tcase Item::GoldenCarrot: return { 396, 0 };\n\t\t\tcase Item::SkeletonSkull: return { 397, 0 };\n\t\t\tcase Item::WitherSkeletonSkull: return { 397, 1 };\n\t\t\tcase Item::PlayerHead: return { 397, 3 };\n\t\t\tcase Item::ZombieHead: return { 397, 2 };\n\t\t\tcase Item::CreeperHead: return { 397, 4 };\n\t\t\tcase Item::DragonHead: return { 397, 5 };\n\t\t\tcase Item::CarrotOnAStick: return { 398, 0 };\n\t\t\tcase Item::NetherStar: return { 399, 0 };\n\t\t\tcase Item::PumpkinPie: return { 400, 0 };\n\t\t\tcase Item::FireworkRocket: return { 401, 0 };\n\t\t\tcase Item::FireworkStar: return { 402, 0 };\n\t\t\tcase Item::EnchantedBook: return { 403, 0 };\n\t\t\tcase Item::NetherBrick: return { 405, 0 };\n\t\t\tcase Item::Quartz: return { 406, 0 };\n\t\t\tcase Item::TNTMinecart: return { 407, 0 };\n\t\t\tcase Item::HopperMinecart: return { 408, 0 };\n\t\t\tcase Item::PrismarineShard: return { 409, 0 };\n\t\t\tcase Item::PrismarineCrystals: return { 410, 0 };\n\t\t\tcase Item::Rabbit: return { 411, 0 };\n\t\t\tcase Item::CookedRabbit: return { 412, 0 };\n\t\t\tcase Item::RabbitStew: return { 413, 0 };\n\t\t\tcase Item::RabbitFoot: return { 414, 0 };\n\t\t\tcase Item::RabbitHide: return { 415, 0 };\n\t\t\tcase Item::ArmorStand: return { 416, 0 };\n\t\t\tcase Item::IronHorseArmor: return { 417, 0 };\n\t\t\tcase Item::GoldenHorseArmor: return { 418, 0 };\n\t\t\tcase Item::DiamondHorseArmor: return { 419, 0 };\n\t\t\tcase Item::Lead: return { 420, 0 };\n\t\t\tcase Item::NameTag: return { 421, 0 };\n\t\t\tcase Item::CommandBlockMinecart: return { 422, 0 };\n\t\t\tcase Item::Mutton: return { 423, 0 };\n\t\t\tcase Item::CookedMutton: return { 424, 0 };\n\t\t\tcase Item::WhiteBanner: return { 425, 15 };\n\t\t\tcase Item::OrangeBanner: return { 425, 14 };\n\t\t\tcase Item::MagentaBanner: return { 425, 13 };\n\t\t\tcase Item::LightBlueBanner: return { 425, 12 };\n\t\t\tcase Item::YellowBanner: return { 425, 11 };\n\t\t\tcase Item::LimeBanner: return { 425, 10 };\n\t\t\tcase Item::PinkBanner: return { 425, 9 };\n\t\t\tcase Item::GrayBanner: return { 425, 8 };\n\t\t\tcase Item::LightGrayBanner: return { 425, 7 };\n\t\t\tcase Item::CyanBanner: return { 425, 6 };\n\t\t\tcase Item::PurpleBanner: return { 425, 5 };\n\t\t\tcase Item::BlueBanner: return { 425, 4 };\n\t\t\tcase Item::BrownBanner: return { 425, 3 };\n\t\t\tcase Item::GreenBanner: return { 425, 2 };\n\t\t\tcase Item::RedBanner: return { 425, 1 };\n\t\t\tcase Item::BlackBanner: return { 425, 0 };\n\t\t\tcase Item::EndCrystal: return { 426, 0 };\n\t\t\tcase Item::ChorusFruit: return { 432, 0 };\n\t\t\tcase Item::PoppedChorusFruit: return { 433, 0 };\n\t\t\tcase Item::Beetroot: return { 434, 0 };\n\t\t\tcase Item::BeetrootSeeds: return { 435, 0 };\n\t\t\tcase Item::BeetrootSoup: return { 436, 0 };\n\t\t\tcase Item::DragonBreath: return { 437, 0 };\n\t\t\tcase Item::SpectralArrow: return { 439, 0 };\n\t\t\tcase Item::TippedArrow: return { 440, 0 };\n\t\t\tcase Item::Shield: return { 442, 0 };\n\t\t\tcase Item::Elytra: return { 443, 0 };\n\t\t\tcase Item::SpruceBoat: return { 444, 0 };\n\t\t\tcase Item::BirchBoat: return { 445, 0 };\n\t\t\tcase Item::JungleBoat: return { 446, 0 };\n\t\t\tcase Item::AcaciaBoat: return { 447, 0 };\n\t\t\tcase Item::DarkOakBoat: return { 448, 0 };\n\t\t\tcase Item::TotemOfUndying: return { 449, 0 };\n\t\t\tcase Item::ShulkerShell: return { 450, 0 };\n\t\t\tcase Item::IronNugget: return { 452, 0 };\n\t\t\tcase Item::MusicDisc13: return { 2256, 0 };\n\t\t\tcase Item::MusicDiscCat: return { 2257, 0 };\n\t\t\tcase Item::MusicDiscBlocks: return { 2258, 0 };\n\t\t\tcase Item::MusicDiscChirp: return { 2259, 0 };\n\t\t\tcase Item::MusicDiscFar: return { 2260, 0 };\n\t\t\tcase Item::MusicDiscMall: return { 2261, 0 };\n\t\t\tcase Item::MusicDiscMellohi: return { 2262, 0 };\n\t\t\tcase Item::MusicDiscStal: return { 2263, 0 };\n\t\t\tcase Item::MusicDiscStrad: return { 2264, 0 };\n\t\t\tcase Item::MusicDiscWard: return { 2265, 0 };\n\t\t\tcase Item::MusicDisc11: return { 2266, 0 };\n\t\t\tcase Item::MusicDiscWait: return { 2267, 0 };\n\t\t\tdefault: return { 0, 0 };\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/Palettes/Upgrade.h",
    "content": "#pragma once\n\n#include \"ChunkDef.h\"\n#include \"BlockState.h\"\n#include \"Registries/Items.h\"\n\nnamespace PaletteUpgrade\n{\n\tBlockState FromBlock(BLOCKTYPE Block, NIBBLETYPE Meta);\n\tItem FromItem(short Item, short Damage);\n\tstd::pair<short, short> ToItem(Item ID);\n}\n"
  },
  {
    "path": "src/Protocol/Protocol.h",
    "content": "\n// Protocol.h\n\n// Interfaces to the cProtocol class representing the generic interface that a protocol\n// parser and serializer must implement\n\n\n\n\n\n#pragma once\n\n#include \"../Defines.h\"\n#include \"../Scoreboard.h\"\n#include \"../ByteBuffer.h\"\n#include \"../EffectID.h\"\n#include \"../World.h\"\n\n\n\n\n\nclass cMap;\nclass cExpOrb;\nclass cPlayer;\nclass cEntity;\nclass cWindow;\nclass cPainting;\nclass cWorld;\nclass cMonster;\nclass cCompositeChat;\nclass cPacketizer;\n\nstruct StatisticsManager;\n\n\n\n\n\nclass cProtocol\n{\npublic:\n\n\tcProtocol(cClientHandle * a_Client) :\n\t\tm_Client(a_Client),\n\t\tm_OutPacketBuffer(64 KiB),\n\t\tm_OutPacketLenBuffer(20)  // 20 bytes is more than enough for one VarInt\n\t{\n\t}\n\n\tvirtual ~cProtocol() {}\n\n\t/** Logical types of outgoing packets.\n\tThese values get translated to on-wire packet IDs in GetPacketID(), specific for each protocol.\n\tThis is mainly useful for protocol sub-versions that re-number the packets while using mostly the same packet layout. */\n\tenum ePacketType\n\t{\n\t\tpktAttachEntity = 0,\n\t\tpktBlockAction,\n\t\tpktBlockBreakAnim,\n\t\tpktBlockChange,\n\t\tpktBlockChanges,\n\t\tpktBossBar,\n\t\tpktCameraSetTo,\n\t\tpktChatRaw,\n\t\tpktCollectEntity,\n\t\tpktDestroyEntity,\n\t\tpktDifficulty,\n\t\tpktDisconnectDuringLogin,\n\t\tpktDisconnectDuringGame,\n\t\tpktDisplayObjective,\n\t\tpktEditSign,\n\t\tpktEncryptionRequest,\n\t\tpktEntityAnimation,\n\t\tpktEntityEffect,\n\t\tpktEntityEquipment,\n\t\tpktEntityHeadLook,\n\t\tpktEntityLook,\n\t\tpktEntityMeta,\n\t\tpktEntityProperties,\n\t\tpktEntityRelMove,\n\t\tpktEntityRelMoveLook,\n\t\tpktEntityStatus,\n\t\tpktEntityVelocity,\n\t\tpktExperience,\n\t\tpktExplosion,\n\t\tpktGameMode,\n\t\tpktHeldItemChange,\n\t\tpktHorseWindowOpen,\n\t\tpktInventorySlot,\n\t\tpktJoinGame,\n\t\tpktKeepAlive,\n\t\tpktLeashEntity,\n\t\tpktLoginSuccess,\n\t\tpktMapData,\n\t\tpktParticleEffect,\n\t\tpktPingResponse,\n\t\tpktPlayerAbilities,\n\t\tpktPlayerList,\n\t\tpktPlayerListHeaderFooter,\n\t\tpktPlayerMoveLook,\n\t\tpktPluginMessage,\n\t\tpktRemoveEntityEffect,\n\t\tpktResourcePack,\n\t\tpktRespawn,\n\t\tpktScoreboardObjective,\n\t\tpktSpawnObject,\n\t\tpktSoundEffect,\n\t\tpktSoundParticleEffect,\n\t\tpktSpawnExperienceOrb,\n\t\tpktSpawnGlobalEntity,\n\t\tpktSpawnMob,\n\t\tpktSpawnOtherPlayer,\n\t\tpktSpawnPainting,\n\t\tpktSpawnPosition,\n\t\tpktStartCompression,\n\t\tpktStatistics,\n\t\tpktStatusResponse,\n\t\tpktTabCompletionResults,\n\t\tpktTeleportEntity,\n\t\tpktTimeUpdate,\n\t\tpktTitle,\n\t\tpktUnloadChunk,\n\t\tpktUnlockRecipe,\n\t\tpktUpdateBlockEntity,\n\t\tpktUpdateHealth,\n\t\tpktUpdateScore,\n\t\tpktUpdateSign,\n\t\tpktUseBed,\n\t\tpktWeather,\n\t\tpktWindowItems,\n\t\tpktWindowClose,\n\t\tpktWindowOpen,\n\t\tpktWindowProperty\n\t};\n\n\tenum class EntityMetadata\n\t{\n\t\tEntityFlags,\n\t\tEntityAir,\n\t\tEntityCustomName,\n\t\tEntityCustomNameVisible,\n\t\tEntitySilent,\n\t\tEntityNoGravity,\n\t\tEntityPose,\n\n\t\tPotionThrown,\n\n\t\tFallingBlockPosition,\n\n\t\tAreaEffectCloudRadius,\n\t\tAreaEffectCloudColor,\n\t\tAreaEffectCloudSinglePointEffect,\n\t\tAreaEffectCloudParticleId,\n\t\tAreaEffectCloudParticleParameter1,\n\t\tAreaEffectCloudParticleParameter2,\n\n\t\tArrowFlags,\n\t\tTippedArrowColor,\n\t\tPiercingLevel,\n\n\t\tBoatLastHitTime,\n\t\tBoatForwardDirection,\n\t\tBoatDamageTaken,\n\t\tBoatType,\n\t\tBoatLeftPaddleTurning,\n\t\tBoatRightPaddleTurning,\n\t\tBoatSplashTimer,\n\n\t\tEnderCrystalBeamTarget,\n\t\tEnderCrystalShowBottom,\n\n\t\tWitherSkullInvulnerable,\n\n\t\tFireworkInfo,\n\t\tFireworkBoostedEntityId,\n\t\tFireworkFromCrossbow,\n\n\t\tItemFrameItem,\n\t\tItemFrameRotation,\n\n\t\tItemItem,\n\n\t\tLivingActiveHand,\n\t\tLivingHealth,\n\t\tLivingPotionEffectColor,\n\t\tLivingPotionEffectAmbient,\n\t\tLivingNumberOfArrows,\n\n\t\tPlayerAdditionalHearts,\n\t\tPlayerScore,\n\t\tPlayerDisplayedSkinParts,\n\t\tPlayerMainHand,\n\n\t\tArmorStandStatus,\n\t\tArmorStandHeadRotation,\n\t\tArmorStandBodyRotation,\n\t\tArmorStandLeftArmRotation,\n\t\tArmorStandRightArmRotation,\n\t\tArmorStandLeftLegRotation,\n\t\tArmorStandRightLegRotation,\n\n\t\tInsentientFlags,\n\n\t\tBatHanging,\n\n\t\tAgeableIsBaby,\n\n\t\tAbstractHorseFlags,\n\t\tAbstractHorseOwner,\n\n\t\tHorseVariant,\n\t\tHorseArmour,\n\n\t\tChestedHorseChested,\n\n\t\tLlamaStrength,\n\t\tLlamaCarpetColor,\n\t\tLlamaVariant,\n\n\t\tPigHasSaddle,\n\t\tPigTotalCarrotOnAStickBoost,\n\n\t\tRabbitType,\n\n\t\tPolarBearStanding,\n\n\t\tSheepFlags,\n\n\t\tTameableAnimalFlags,\n\t\tTameableAnimalOwner,\n\n\t\tThrowableItem,\n\n\t\tTridentLoyaltyLevel,\n\n\t\tOcelotType,\n\n\t\tWolfDamageTaken,\n\t\tWolfBegging,\n\t\tWolfCollarColour,\n\n\t\tVillagerProfession,\n\n\t\tIronGolemPlayerCreated,\n\n\t\tShulkerFacingDirection,\n\t\tShulkerAttachmentFallingBlockPosition,\n\t\tShulkerShieldHeight,\n\n\t\tBlazeOnFire,\n\n\t\tCreeperState,\n\t\tCreeperPowered,\n\t\tCreeperIgnited,\n\n\t\tGuardianStatus,\n\t\tGuardianTarget,\n\n\t\tIllagerFlags,\n\t\tSpeIlagerSpell,\n\n\t\tVexFlags,\n\n\t\tAbstractSkeletonArmsSwinging,\n\n\t\tSpiderClimbing,\n\n\t\tWitchAggresive,\n\t\tWitchDrinking,\n\n\t\tWitherFirstHeadTarget,\n\t\tWitherSecondHeadTarget,\n\t\tWitherThirdHeadTarget,\n\t\tWitherInvulnerableTimer,\n\n\t\tZombieIsBaby,\n\t\tZombieUnusedWasType,\n\t\tZombieHandsRisedUp,\n\n\t\tZombieVillagerConverting,\n\t\tZombieVillagerProfession,\n\n\t\tEndermanCarriedBlock,\n\t\tEndermanScreaming,\n\n\t\tEnderDragonDragonPhase,\n\n\t\tGhastAttacking,\n\n\t\tSlimeSize,\n\n\t\tMinecartShakingPower,\n\t\tMinecartShakingDirection,\n\t\tMinecartShakingMultiplier,\n\t\tMinecartBlockIDMeta,\n\t\tMinecartBlockY,\n\t\tMinecartShowBlock,\n\n\t\tMinecartCommandBlockCommand,\n\t\tMinecartCommandBlockLastOutput,\n\n\t\tMinecartFurnacePowered,\n\n\t\tMooshroomType,\n\n\t\tTNTPrimedFuseTime\n\t};\n\n\tenum class EntityMetadataType\n\t{\n\t\tByte,\n\t\tVarInt,\n\t\tFloat,\n\t\tString,\n\t\tChat,\n\t\tOptChat,\n\t\tItem,\n\t\tBoolean,\n\t\tRotation,\n\t\tPosition,\n\t\tOptPosition,\n\t\tDirection,\n\t\tOptUUID,\n\t\tOptBlockID,\n\t\tNBT,\n\t\tParticle,\n\t\tVillagerData,\n\t\tOptVarInt,\n\t\tPose\n\t};\n\n\t/** The protocol version number, received from the client in the Handshake packet. */\n\tenum class Version\n\t{\n\t\tv1_8_0  = 47,\n\t\tv1_9_0  = 107,\n\t\tv1_9_1  = 108,\n\t\tv1_9_2  = 109,\n\t\tv1_9_4  = 110,\n\t\tv1_10_0 = 210,\n\t\tv1_11_0 = 315,\n\t\tv1_11_1 = 316,\n\t\tv1_12   = 335,\n\t\tv1_12_1 = 338,\n\t\tv1_12_2 = 340,\n\t\tv1_13   = 393,\n\t\tv1_13_1 = 401,\n\t\tv1_13_2 = 404,\n\t\tv1_14   = 477,\n\t\tv1_14_1 = 480,\n\t\tv1_14_2 = 485,\n\t\tv1_14_3 = 490,\n\t\tv1_14_4 = 498\n\t};\n\n\tenum State\n\t{\n\t\tStatus = 1,\n\t\tLogin = 2,\n\t\tGame = 3,\n\t};\n\n\t/** Called by cClientHandle to process data, when the client sends some.\n\tThe protocol uses the provided buffers for storage and processing, and must have exclusive access to them. */\n\tvirtual void DataReceived(cByteBuffer & a_Buffer, ContiguousByteBuffer & a_Data) = 0;\n\n\t/** Called by cClientHandle to finalise a buffer of prepared data before they are sent to the client.\n\tDescendants may for example, encrypt the data if needed.\n\tThe protocol modifies the provided buffer in-place. */\n\tvirtual void DataPrepared(ContiguousByteBuffer & a_Data) = 0;\n\n\t// Sending stuff to clients (alphabetically sorted):\n\tvirtual void SendAttachEntity               (const cEntity & a_Entity, const cEntity & a_Vehicle) = 0;\n\tvirtual void SendBlockAction                (Vector3i a_BlockPos, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType) = 0;\n\tvirtual void SendBlockBreakAnim             (UInt32 a_EntityID, Vector3i a_BlockPos, char a_Stage) = 0;\n\tvirtual void SendBlockChange                (Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;\n\tvirtual void SendBlockChanges               (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) = 0;\n\tvirtual void SendBossBarAdd                 (UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog) = 0;\n\tvirtual void SendBossBarRemove              (UInt32 a_UniqueID) = 0;\n\tvirtual void SendBossBarUpdateHealth        (UInt32 a_UniqueID, float a_FractionFilled) = 0;\n\tvirtual void SendBossBarUpdateFlags         (UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog) = 0;\n\tvirtual void SendBossBarUpdateStyle         (UInt32 a_UniqueID, BossBarColor a_Color, BossBarDivisionType a_DivisionType) = 0;\n\tvirtual void SendBossBarUpdateTitle         (UInt32 a_UniqueID, const cCompositeChat & a_Title) = 0;\n\tvirtual void SendCameraSetTo                (const cEntity & a_Entity) = 0;\n\tvirtual void SendChat                       (const AString & a_Message, eChatType a_Type) = 0;\n\tvirtual void SendChat                       (const cCompositeChat & a_Message, eChatType a_Type, bool a_ShouldUseChatPrefixes) = 0;\n\tvirtual void SendChatRaw                    (const AString & a_MessageRaw, eChatType a_Type) = 0;\n\tvirtual void SendChunkData                  (ContiguousByteBufferView a_ChunkData) = 0;\n\tvirtual void SendCollectEntity              (const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count) = 0;\n\tvirtual void SendDestroyEntity              (const cEntity & a_Entity) = 0;\n\tvirtual void SendDetachEntity               (const cEntity & a_Entity, const cEntity & a_PreviousVehicle) = 0;\n\tvirtual void SendDisconnect                 (const AString & a_Reason) = 0;\n\tvirtual void SendEditSign                   (Vector3i a_BlockPos) = 0;  ///< Request the client to open up the sign editor for the sign (1.6+)\n\tvirtual void SendEntityEffect               (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, int a_Duration) = 0;\n\tvirtual void SendEntityAnimation            (const cEntity & a_Entity, EntityAnimation a_Animation) = 0;\n\tvirtual void SendEntityEquipment            (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) = 0;\n\tvirtual void SendEntityHeadLook             (const cEntity & a_Entity) = 0;\n\tvirtual void SendEntityLook                 (const cEntity & a_Entity) = 0;\n\tvirtual void SendEntityMetadata             (const cEntity & a_Entity) = 0;\n\tvirtual void SendEntityPosition             (const cEntity & a_Entity) = 0;\n\tvirtual void SendEntityProperties           (const cEntity & a_Entity) = 0;\n\tvirtual void SendEntityVelocity             (const cEntity & a_Entity) = 0;\n\tvirtual void SendExplosion                  (Vector3f a_Position, float a_Power) = 0;\n\tvirtual void SendGameMode                   (eGameMode a_GameMode) = 0;\n\tvirtual void SendHealth                     (void) = 0;\n\tvirtual void SendHeldItemChange             (int a_ItemIndex) = 0;\n\tvirtual void SendHideTitle                  (void) = 0;\n\tvirtual void SendInventorySlot              (char a_WindowID, short a_SlotNum, const cItem & a_Item) = 0;\n\tvirtual void SendKeepAlive                  (UInt32 a_PingID) = 0;\n\tvirtual void SendLeashEntity                (const cEntity & a_Entity, const cEntity & a_EntityLeashedTo) = 0;\n\tvirtual void SendLogin                      (const cPlayer & a_Player, const cWorld & a_World) = 0;\n\tvirtual void SendLoginSuccess               (void) = 0;\n\tvirtual void SendMapData                    (const cMap & a_Map, int a_DataStartX, int a_DataStartY) = 0;\n\tvirtual void SendPaintingSpawn              (const cPainting & a_Painting) = 0;\n\tvirtual void SendPlayerAbilities            (void) = 0;\n\tvirtual void SendParticleEffect             (const AString & a_SoundName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount) = 0;\n\tvirtual void SendParticleEffect             (const AString & a_SoundName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data) = 0;\n\tvirtual void SendPlayerListAddPlayer        (const cPlayer & a_Player) = 0;\n\tvirtual void SendPlayerListHeaderFooter     (const cCompositeChat & a_Header, const cCompositeChat & a_Footer) = 0;\n\tvirtual void SendPlayerListRemovePlayer     (const cPlayer & a_Player) = 0;\n\tvirtual void SendPlayerListUpdateGameMode   (const cPlayer & a_Player) = 0;\n\tvirtual void SendPlayerListUpdatePing       () = 0;\n\tvirtual void SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_CustomName) = 0;\n\tvirtual void SendPlayerMoveLook             (Vector3d a_Pos, float a_Yaw, float a_Pitch, bool a_IsRelative) = 0;\n\tvirtual void SendPlayerMoveLook             (void) = 0;\n\tvirtual void SendPlayerPermissionLevel      (void) = 0;\n\tvirtual void SendPlayerPosition             (void) = 0;\n\tvirtual void SendPlayerSpawn                (const cPlayer & a_Player) = 0;\n\tvirtual void SendPluginMessage              (const AString & a_Channel, ContiguousByteBufferView a_Message) = 0;\n\tvirtual void SendRemoveEntityEffect         (const cEntity & a_Entity, int a_EffectID) = 0;\n\tvirtual void SendResetTitle                 (void) = 0;\n\tvirtual void SendResourcePack               (const AString & a_ResourcePackUrl) = 0;\n\tvirtual void SendRespawn                    (eDimension a_Dimension) = 0;\n\tvirtual void SendExperience                 (void) = 0;\n\tvirtual void SendExperienceOrb              (const cExpOrb & a_ExpOrb) = 0;\n\tvirtual void SendScoreboardObjective        (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) = 0;\n\tvirtual void SendScoreUpdate                (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) = 0;\n\tvirtual void SendDisplayObjective           (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) = 0;\n\tvirtual void SendSetSubTitle                (const cCompositeChat & a_SubTitle) = 0;\n\tvirtual void SendSetRawSubTitle             (const AString & a_SubTitle) = 0;\n\tvirtual void SendSetTitle                   (const cCompositeChat & a_Title) = 0;\n\tvirtual void SendSetRawTitle                (const AString & a_Title) = 0;\n\tvirtual void SendSoundEffect                (const AString & a_SoundName, Vector3d a_Origin, float a_Volume, float a_Pitch) = 0;\n\tvirtual void SendSoundParticleEffect        (const EffectID a_EffectID, Vector3i a_Origin, int a_Data) = 0;\n\tvirtual void SendSpawnEntity                (const cEntity & a_Entity) = 0;\n\tvirtual void SendSpawnMob                   (const cMonster & a_Mob) = 0;\n\tvirtual void SendStatistics                 (const StatisticsManager & a_Manager) = 0;\n\tvirtual void SendTabCompletionResults       (const AStringVector & a_Results) = 0;\n\tvirtual void SendThunderbolt                (Vector3i a_Origin) = 0;\n\tvirtual void SendTitleTimes                 (int a_FadeInTicks, int a_DisplayTicks, int a_FadeOutTicks) = 0;\n\tvirtual void SendTimeUpdate                 (cTickTimeLong a_WorldAge, cTickTimeLong a_WorldDate, bool a_DoDaylightCycle) = 0;\n\tvirtual void SendUnleashEntity              (const cEntity & a_Entity) = 0;\n\tvirtual void SendUnloadChunk                (int a_ChunkX, int a_ChunkZ) = 0;\n\tvirtual void SendUpdateBlockEntity          (cBlockEntity & a_BlockEntity) = 0;\n\tvirtual void SendUpdateSign                 (Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) = 0;\n\tvirtual void SendUnlockRecipe               (UInt32 a_RecipeID) = 0;\n\tvirtual void SendInitRecipes                (UInt32 a_RecipeID) = 0;\n\tvirtual void SendWeather                    (eWeather a_Weather) = 0;\n\tvirtual void SendWholeInventory             (const cWindow    & a_Window) = 0;\n\tvirtual void SendWindowClose                (const cWindow    & a_Window) = 0;\n\tvirtual void SendWindowOpen                 (const cWindow & a_Window) = 0;\n\tvirtual void SendWindowProperty             (const cWindow & a_Window, size_t a_Property, short a_Value) = 0;\n\n\t/** Returns the ServerID used for authentication through session.minecraft.net */\n\tvirtual AString GetAuthServerID(void) = 0;\n\nprotected:\n\n\tfriend class cPacketizer;\n\n\tcClientHandle * m_Client;\n\n\t/** Provides synchronization for sending the entire packet at once.\n\tEach SendXYZ() function must acquire this CS in order to send the whole packet at once.\n\tAutomated via cPacketizer class. */\n\tcCriticalSection m_CSPacket;\n\n\t/** Buffer for composing the outgoing packets, through cPacketizer */\n\tcByteBuffer m_OutPacketBuffer;\n\n\t/** Buffer for composing packet length (so that each cPacketizer instance doesn't allocate a new cPacketBuffer) */\n\tcByteBuffer m_OutPacketLenBuffer;\n\n\t/** Returns the protocol-specific packet ID given the protocol-agnostic packet enum. */\n\tvirtual UInt32 GetPacketID(ePacketType a_Packet) const = 0;\n\n\t/** Returns the current protocol's version, for handling status requests. */\n\tvirtual Version GetProtocolVersion() const = 0;\n\n\t/** Sends a single packet contained within the cPacketizer class.\n\tThe cPacketizer's destructor calls this to send the contained packet; protocol may transform the data (compression in 1.8 etc). */\n\tvirtual void SendPacket(cPacketizer & a_Packet) = 0;\n} ;\n"
  },
  {
    "path": "src/Protocol/ProtocolRecognizer.cpp",
    "content": "\n// ProtocolRecognizer.cpp\n\n// Implements the cProtocolRecognizer class representing the meta-protocol that recognizes possibly multiple\n// protocol versions and redirects everything to them\n\n#include \"Globals.h\"\n\n#include \"ProtocolRecognizer.h\"\n#include \"Protocol_1_8.h\"\n#include \"Protocol_1_9.h\"\n#include \"Protocol_1_10.h\"\n#include \"Protocol_1_11.h\"\n#include \"Protocol_1_12.h\"\n#include \"Protocol_1_13.h\"\n#include \"Protocol_1_14.h\"\n#include \"../ClientHandle.h\"\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../World.h\"\n#include \"../JsonUtils.h\"\n#include \"../Bindings/PluginManager.h\"\n\n\n\n\n\nstruct TriedToJoinWithUnsupportedProtocolException : public std::runtime_error\n{\n\texplicit TriedToJoinWithUnsupportedProtocolException(const std::string & a_Message) :\n\t\tstd::runtime_error(a_Message)\n\t{\n\t}\n};\n\n\n\n\n\ncMultiVersionProtocol::cMultiVersionProtocol() :\n\tm_Buffer(32 KiB),\n\tm_WaitingForData(true)\n{\n}\n\n\n\n\n\nAString cMultiVersionProtocol::GetVersionTextFromInt(cProtocol::Version a_ProtocolVersion)\n{\n\tswitch (a_ProtocolVersion)\n\t{\n\t\tcase cProtocol::Version::v1_8_0:   return \"1.8\";\n\t\tcase cProtocol::Version::v1_9_0:   return \"1.9\";\n\t\tcase cProtocol::Version::v1_9_1:   return \"1.9.1\";\n\t\tcase cProtocol::Version::v1_9_2:   return \"1.9.2\";\n\t\tcase cProtocol::Version::v1_9_4:   return \"1.9.4\";\n\t\tcase cProtocol::Version::v1_10_0:  return \"1.10\";\n\t\tcase cProtocol::Version::v1_11_0:  return \"1.11\";\n\t\tcase cProtocol::Version::v1_11_1:  return \"1.11.1\";\n\t\tcase cProtocol::Version::v1_12:    return \"1.12\";\n\t\tcase cProtocol::Version::v1_12_1:  return \"1.12.1\";\n\t\tcase cProtocol::Version::v1_12_2:  return \"1.12.2\";\n\t\tcase cProtocol::Version::v1_13:    return \"1.13\";\n\t\tcase cProtocol::Version::v1_13_1:  return \"1.13.1\";\n\t\tcase cProtocol::Version::v1_13_2:  return \"1.13.2\";\n\t\tcase cProtocol::Version::v1_14:    return \"1.14\";\n\t\tcase cProtocol::Version::v1_14_1:  return \"1.14.1\";\n\t\tcase cProtocol::Version::v1_14_2:  return \"1.14.2\";\n\t\tcase cProtocol::Version::v1_14_3:  return \"1.14.3\";\n\t\tcase cProtocol::Version::v1_14_4:  return \"1.14.4\";\n\t}\n\n\tASSERT(!\"Unknown protocol version\");\n\treturn fmt::format(FMT_STRING(\"Unknown protocol ({})\"), a_ProtocolVersion);\n}\n\n\n\n\n\nvoid cMultiVersionProtocol::HandleIncomingDataInRecognitionStage(cClientHandle & a_Client, ContiguousByteBuffer & a_Data)\n{\n\t// NOTE: If a new protocol is added or an old one is removed, adjust MCS_CLIENT_VERSIONS and MCS_PROTOCOL_VERSIONS macros in the header file\n\n\t/* Write all incoming data unmodified into m_Buffer.\n\tWriting everything is always okay to do:\n\t1. We can be sure protocol encryption hasn't started yet since m_Protocol hasn't been called, hence no decryption needs to take place\n\t2. The extra data are processed at the end of this function */\n\tif (!m_Buffer.Write(a_Data.data(), a_Data.size()))\n\t{\n\t\ta_Client.PacketBufferFull();\n\t\treturn;\n\t}\n\n\tif (TryHandleHTTPRequest(a_Client, a_Data))\n\t{\n\t\treturn;\n\t}\n\n\t// TODO: recover from git history\n\t// Unlengthed protocol, ...\n\n\t// Lengthed protocol, try if it has the entire initial handshake packet:\n\tif (\n\t\tUInt32 PacketLen;\n\n\t\t// If not enough bytes for the packet length, keep waiting\n\t\t!m_Buffer.ReadVarInt(PacketLen) ||\n\n\t\t// If not enough bytes for the packet, keep waiting\n\t\t// (More of a sanity check to make sure no one tries anything funny, since ReadXXX can wait for data themselves)\n\t\t!m_Buffer.CanReadBytes(PacketLen)\n\t)\n\t{\n\t\tm_Buffer.ResetRead();\n\t\treturn;\n\t}\n\n\t/* Figure out the client's version.\n\t1. m_Protocol != nullptr: the protocol is supported and we have a handler\n\t2. m_Protocol == nullptr: the protocol is unsupported, handling is a special case done by ourselves\n\t3. Exception: the data sent were garbage, the client handle deals with it by disconnecting */\n\tm_Protocol = TryRecognizeLengthedProtocol(a_Client);\n\n\t// Version recognised. Cause HandleIncomingData to stop calling us to handle data:\n\tm_WaitingForData = false;\n\n\t// Explicitly process any remaining data (already written to m_Buffer) with the new handler:\n\t{\n\t\tContiguousByteBuffer Empty;\n\t\tHandleIncomingData(a_Client, Empty);\n\t}\n}\n\n\n\n\n\nvoid cMultiVersionProtocol::HandleIncomingDataInOldPingResponseStage(cClientHandle & a_Client, const ContiguousByteBufferView a_Data)\n{\n\tif (!m_Buffer.Write(a_Data.data(), a_Data.size()))\n\t{\n\t\ta_Client.PacketBufferFull();\n\t\treturn;\n\t}\n\n\t// Handle server list ping packets\n\tfor (;;)\n\t{\n\t\tUInt32 PacketLen;\n\t\tUInt32 PacketID;\n\t\tif (\n\t\t\t!m_Buffer.ReadVarInt32(PacketLen) ||\n\t\t\t!m_Buffer.CanReadBytes(PacketLen) ||\n\t\t\t!m_Buffer.ReadVarInt32(PacketID)\n\t\t)\n\t\t{\n\t\t\t// Not enough data\n\t\t\tm_Buffer.ResetRead();\n\t\t\tbreak;\n\t\t}\n\n\t\tif ((PacketID == 0x00) && (PacketLen == 1))  // Request packet\n\t\t{\n\t\t\tHandlePacketStatusRequest(a_Client);\n\t\t}\n\t\telse if ((PacketID == 0x01) && (PacketLen == 9))  // Ping packet\n\t\t{\n\t\t\tHandlePacketStatusPing(a_Client);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Client.PacketUnknown(PacketID);\n\t\t\treturn;\n\t\t}\n\n\t\tm_Buffer.CommitRead();\n\t}\n}\n\n\n\n\n\nvoid cMultiVersionProtocol::HandleIncomingData(cClientHandle & a_Client, ContiguousByteBuffer & a_Data)\n{\n\tif (m_WaitingForData)\n\t{\n\t\tHandleIncomingDataInRecognitionStage(a_Client, a_Data);\n\t}\n\telse if (m_Protocol == nullptr)\n\t{\n\t\t// Got a Handshake for an unrecognised version, process future data accordingly:\n\t\tHandleIncomingDataInOldPingResponseStage(a_Client, a_Data);\n\t}\n\telse\n\t{\n\t\t// The protocol recogniser succesfully identified a supported version, direct data to that protocol:\n\t\tm_Protocol->DataReceived(m_Buffer, a_Data);\n\t}\n}\n\n\n\n\n\nvoid cMultiVersionProtocol::HandleOutgoingData(ContiguousByteBuffer & a_Data)\n{\n\t// Normally only the protocol sends data, so outgoing data are only present when m_Protocol != nullptr.\n\t// However, for unrecognised protocols we send data too, and that's when m_Protocol == nullptr. Check to avoid crashing (GH #5260).\n\n\tif (m_Protocol != nullptr)\n\t{\n\t\tm_Protocol->DataPrepared(a_Data);\n\t}\n}\n\n\n\n\n\nvoid cMultiVersionProtocol::SendDisconnect(cClientHandle & a_Client, const AString & a_Reason)\n{\n\tif (m_Protocol != nullptr)\n\t{\n\t\tm_Protocol->SendDisconnect(a_Reason);\n\t\treturn;\n\t}\n\n\tconst AString Message = JsonUtils::SerializeSingleValueJsonObject(\"text\", a_Reason);\n\tconst auto PacketID = GetPacketID(cProtocol::ePacketType::pktDisconnectDuringLogin);\n\tcByteBuffer Out(\n\t\tcByteBuffer::GetVarIntSize(PacketID) +\n\t\tcByteBuffer::GetVarIntSize(static_cast<UInt32>(Message.size())) + Message.size()\n\t);\n\n\tVERIFY(Out.WriteVarInt32(PacketID));\n\tVERIFY(Out.WriteVarUTF8String(Message));\n\tSendPacket(a_Client, Out);\n}\n\n\n\n\n\nbool cMultiVersionProtocol::TryHandleHTTPRequest(cClientHandle & a_Client, ContiguousByteBuffer & a_Data)\n{\n\tconst auto RedirectUrl = cRoot::Get()->GetServer()->GetCustomRedirectUrl();\n\n\tif (RedirectUrl.empty())\n\t{\n\t\treturn false;\n\t}\n\n\tContiguousByteBuffer Buffer;\n\tm_Buffer.ReadSome(Buffer, 10U);\n\tm_Buffer.ResetRead();\n\n\t// The request line, hastily decoded with the hope that it's encoded in US-ASCII.\n\tconst std::string_view Value(reinterpret_cast<const char *>(Buffer.data()), Buffer.size());\n\n\tif (Value == u8\"GET / HTTP\")\n\t{\n\t\tconst auto Response = fmt::format(u8\"HTTP/1.0 303 See Other\\r\\nLocation: {}\\r\\n\\r\\n\", cRoot::Get()->GetServer()->GetCustomRedirectUrl());\n\t\ta_Client.SendData({ reinterpret_cast<const std::byte *>(Response.data()), Response.size() });\n\t\ta_Client.Destroy();\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nstd::unique_ptr<cProtocol> cMultiVersionProtocol::TryRecognizeLengthedProtocol(cClientHandle & a_Client)\n{\n\tUInt32 PacketType;\n\tUInt32 ProtocolVersion;\n\tAString ServerAddress;\n\tUInt16 ServerPort;\n\tUInt32 NextStateValue;\n\n\tif (!m_Buffer.ReadVarInt(PacketType) || (PacketType != 0x00))\n\t{\n\t\t// Not an initial handshake packet, we don't know how to talk to them:\n\t\tLOGD(\"Client \\\"%s\\\" uses an unsupported protocol (lengthed, initial packet %u)\",\n\t\t\ta_Client.GetIPString().c_str(), PacketType\n\t\t);\n\n\t\tthrow TriedToJoinWithUnsupportedProtocolException(\"Your client isn't supported.\\nTry connecting with Minecraft \" MCS_CLIENT_VERSIONS);\n\t}\n\n\tif (\n\t\t!m_Buffer.ReadVarInt(ProtocolVersion) ||\n\t\t!m_Buffer.ReadVarUTF8String(ServerAddress) ||\n\t\t!m_Buffer.ReadBEUInt16(ServerPort) ||\n\t\t!m_Buffer.ReadVarInt(NextStateValue)\n\t)\n\t{\n\t\t// TryRecognizeProtocol guarantees that we will have as much\n\t\t// data to read as the client claims in the protocol length field:\n\t\tthrow TriedToJoinWithUnsupportedProtocolException(\"Incorrect amount of data received - hacked client?\");\n\t}\n\n\tconst auto NextState = [NextStateValue]\n\t{\n\t\tswitch (NextStateValue)\n\t\t{\n\t\t\tcase 1:  return cProtocol::State::Status;\n\t\t\tcase 2:  return cProtocol::State::Login;\n\t\t\tcase 3:  return cProtocol::State::Game;\n\t\t\tdefault: throw TriedToJoinWithUnsupportedProtocolException(\"Your client isn't supported.\\nTry connecting with Minecraft \" MCS_CLIENT_VERSIONS);\n\t\t}\n\t}();\n\n\t// TODO: this should be a protocol property, not ClientHandle:\n\ta_Client.SetProtocolVersion(ProtocolVersion);\n\n\t// All good, eat up the data:\n\tm_Buffer.CommitRead();\n\n\tswitch (ProtocolVersion)\n\t{\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_8_0):  return std::make_unique<cProtocol_1_8_0> (&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_9_0):  return std::make_unique<cProtocol_1_9_0> (&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_9_1):  return std::make_unique<cProtocol_1_9_1> (&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_9_2):  return std::make_unique<cProtocol_1_9_2> (&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_9_4):  return std::make_unique<cProtocol_1_9_4> (&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_10_0): return std::make_unique<cProtocol_1_10_0>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_11_0): return std::make_unique<cProtocol_1_11_0>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_11_1): return std::make_unique<cProtocol_1_11_1>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_12):   return std::make_unique<cProtocol_1_12>  (&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_12_1): return std::make_unique<cProtocol_1_12_1>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_12_2): return std::make_unique<cProtocol_1_12_2>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_13):   return std::make_unique<cProtocol_1_13>  (&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_13_1): return std::make_unique<cProtocol_1_13_1>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_13_2): return std::make_unique<cProtocol_1_13_2>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_14):   return std::make_unique<cProtocol_1_14>  (&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_14_1): return std::make_unique<cProtocol_1_14_1>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_14_2): return std::make_unique<cProtocol_1_14_2>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_14_3): return std::make_unique<cProtocol_1_14_3>(&a_Client, ServerAddress, NextState);\n\t\tcase static_cast<UInt32>(cProtocol::Version::v1_14_4): return std::make_unique<cProtocol_1_14_4>(&a_Client, ServerAddress, NextState);\n\n\t\tdefault:\n\t\t{\n\t\t\tLOGD(\"Client \\\"%s\\\" uses an unsupported protocol (lengthed, version %u (0x%x))\",\n\t\t\t\ta_Client.GetIPString(), ProtocolVersion, ProtocolVersion\n\t\t\t);\n\n\t\t\tif (NextState != cProtocol::State::Status)\n\t\t\t{\n\t\t\t\tthrow TriedToJoinWithUnsupportedProtocolException(\n\t\t\t\t\tfmt::format(FMT_STRING(\"Unsupported protocol version {}.\\nTry connecting with Minecraft {}\"),\n\t\t\t\t\tProtocolVersion, MCS_CLIENT_VERSIONS)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// No cProtocol can handle the client:\n\t\t\treturn nullptr;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMultiVersionProtocol::SendPacket(cClientHandle & a_Client, cByteBuffer & a_OutPacketBuffer)\n{\n\t// Writes out the packet normally.\n\tUInt32 PacketLen = static_cast<UInt32>(a_OutPacketBuffer.GetUsedSpace());\n\tcByteBuffer OutPacketLenBuffer(cByteBuffer::GetVarIntSize(PacketLen));\n\n\t// Compression doesn't apply to this state, send raw data:\n\tVERIFY(OutPacketLenBuffer.WriteVarInt32(PacketLen));\n\tContiguousByteBuffer LengthData;\n\tOutPacketLenBuffer.ReadAll(LengthData);\n\ta_Client.SendData(LengthData);\n\n\t// Send the packet's payload:\n\tContiguousByteBuffer PacketData;\n\ta_OutPacketBuffer.ReadAll(PacketData);\n\ta_OutPacketBuffer.CommitRead();\n\ta_Client.SendData(PacketData);\n}\n\n\n\n\n\nUInt32 cMultiVersionProtocol::GetPacketID(cProtocol::ePacketType a_PacketType)\n{\n\tswitch (a_PacketType)\n\t{\n\t\tcase cProtocol::ePacketType::pktDisconnectDuringLogin: return 0x00;\n\t\tcase cProtocol::ePacketType::pktStatusResponse:        return 0x00;\n\t\tcase cProtocol::ePacketType::pktPingResponse:          return 0x01;\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"GetPacketID() called for an unhandled packet\");\n\t\t\treturn 0;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cMultiVersionProtocol::HandlePacketStatusRequest(cClientHandle & a_Client)\n{\n\tcServer * Server = cRoot::Get()->GetServer();\n\tAString ServerDescription = Server->GetDescription();\n\tauto NumPlayers = static_cast<signed>(Server->GetNumPlayers());\n\tauto MaxPlayers = static_cast<signed>(Server->GetMaxPlayers());\n\tAString Favicon = Server->GetFaviconData();\n\tcRoot::Get()->GetPluginManager()->CallHookServerPing(a_Client, ServerDescription, NumPlayers, MaxPlayers, Favicon);\n\n\t// Version:\n\tJson::Value Version;\n\tVersion[\"name\"] = \"Cuberite \" MCS_CLIENT_VERSIONS;\n\tVersion[\"protocol\"] = MCS_LATEST_PROTOCOL_VERSION;\n\n\t// Players:\n\tJson::Value Players;\n\tPlayers[\"online\"] = NumPlayers;\n\tPlayers[\"max\"] = MaxPlayers;\n\t// TODO: Add \"sample\"\n\n\t// Description:\n\tJson::Value Description;\n\tDescription[\"text\"] = ServerDescription.c_str();\n\n\t// Create the response:\n\tJson::Value ResponseValue;\n\tResponseValue[\"version\"] = Version;\n\tResponseValue[\"players\"] = Players;\n\tResponseValue[\"description\"] = Description;\n\tif (!Favicon.empty())\n\t{\n\t\tResponseValue[\"favicon\"] = \"data:image/png;base64,\" + Favicon;\n\t}\n\tAString Response = JsonUtils::WriteFastString(ResponseValue);\n\n\t// Send the response in a packet:\n\tcByteBuffer out(Response.size() + 12);  // String + 2x VarInt + extra space for safety\n\tVERIFY(out.WriteVarInt32(GetPacketID(cProtocol::ePacketType::pktStatusResponse)));\n\tVERIFY(out.WriteVarUTF8String(Response));\n\tSendPacket(a_Client, out);\n}\n\n\n\n\n\nvoid cMultiVersionProtocol::HandlePacketStatusPing(cClientHandle & a_Client)\n{\n\tInt64 Timestamp;\n\tif (!m_Buffer.ReadBEInt64(Timestamp))\n\t{\n\t\treturn;\n\t}\n\n\t// Send the ping response packet:\n\tcByteBuffer out(16);  // VarInt + Int64 + extra space for safety\n\tVERIFY(out.WriteVarInt32(GetPacketID(cProtocol::ePacketType::pktPingResponse)));\n\tVERIFY(out.WriteBEInt64(Timestamp));\n\tSendPacket(a_Client, out);\n}\n"
  },
  {
    "path": "src/Protocol/ProtocolRecognizer.h",
    "content": "#pragma once\n\n#include \"Protocol.h\"\n\n\n\n\n\n// Adjust these if a new protocol is added or an old one is removed:\n#define MCS_CLIENT_VERSIONS \"1.8.x-1.14.4\"\n#define MCS_PROTOCOL_VERSIONS \"47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 477, 480, 485, 490, 498\"\n#define MCS_LATEST_PROTOCOL_VERSION 498\n\n\n\n\n\n/** Meta-protocol that recognizes multiple protocol versions, creates the specific\nprotocol version instance and redirects everything to it. */\nclass cMultiVersionProtocol\n{\npublic:\n\n\tcMultiVersionProtocol();\n\n\t/** Translates protocol version number into protocol version text: 49 -> \"1.4.4\" */\n\tstatic AString GetVersionTextFromInt(cProtocol::Version a_ProtocolVersion);\n\n\t/** Returns if we contain a concrete protocol corresponding to the client's protocol version. */\n\tbool VersionRecognitionSuccessful()\n\t{\n\t\treturn m_Protocol != nullptr;\n\t}\n\n\t/** Convenience overload to enable redirecting sends to the underlying implementation. */\n\tauto & operator->()\n\t{\n\t\treturn m_Protocol;\n\t}\n\n\t/** Directs incoming protocol data along the correct pathway, depending on the state of the version recognition process.\n\tThe protocol modifies the provided buffer in-place. */\n\tvoid HandleIncomingData(cClientHandle & a_Client, ContiguousByteBuffer & a_Data);\n\n\t/** Allows the protocol (if any) to do a final pass on outgiong data, possibly modifying the provided buffer in-place. */\n\tvoid HandleOutgoingData(ContiguousByteBuffer & a_Data);\n\n\t/** Sends a disconnect to the client as a result of a recognition error.\n\tThis function can be used to disconnect before any protocol has been recognised. */\n\tvoid SendDisconnect(cClientHandle & a_Client, const AString & a_Reason);\n\nprivate:\n\n\t/** Handles data reception in a newly-created client handle that doesn't yet have a known protocol.\n\ta_Data contains a view of data that were just received.\n\tTries to recognize a protocol, populate m_Protocol, and transitions to another mode depending on success. */\n\tvoid HandleIncomingDataInRecognitionStage(cClientHandle & a_Client, ContiguousByteBuffer & a_Data);\n\n\t/** Handles and responds to unsupported clients sending pings. */\n\tvoid HandleIncomingDataInOldPingResponseStage(cClientHandle & a_Client, ContiguousByteBufferView a_Data);\n\n\t/* Checks if incoming data is an HTTP request and handles it if it is. */\n\tbool TryHandleHTTPRequest(cClientHandle & a_Client, ContiguousByteBuffer & a_Data);\n\n\t/** Tries to recognize a protocol in the lengthed family (1.7+), based on m_Buffer.\n\tReturns a cProtocol_XXX instance if recognized. */\n\tstd::unique_ptr<cProtocol> TryRecognizeLengthedProtocol(cClientHandle & a_Client);\n\n\t/** Sends one packet inside a cByteBuffer.\n\tThis is used only when handling an outdated server ping. */\n\tstatic void SendPacket(cClientHandle & a_Client, cByteBuffer & a_OutPacketBuffer);\n\n\t/** Returns the protocol-specific packet ID given the protocol-agnostic packet enum. */\n\tstatic UInt32 GetPacketID(cProtocol::ePacketType a_PacketType);\n\n\t/* Status handler for unrecognised versions. */\n\tvoid HandlePacketStatusRequest(cClientHandle & a_Client);\n\n\t/* Ping handler for unrecognised versions. */\n\tvoid HandlePacketStatusPing(cClientHandle & a_Client);\n\n\t/** Buffer for received protocol data. */\n\tcByteBuffer m_Buffer;\n\n\t/** The actual protocol implementation.\n\tCreated when recognition of the client version succeeds with a version we support. */\n\tstd::unique_ptr<cProtocol> m_Protocol;\n\n\t/** If we're still waiting for data required for version recognition to arrive. */\n\tbool m_WaitingForData;\n} ;\n"
  },
  {
    "path": "src/Protocol/Protocol_1_10.cpp",
    "content": "\n// Protocol_1_10.cpp\n\n/*\nImplements the 1.10 protocol classes:\n\t- cProtocol_1_10_0\n\t\t- release 1.10 protocol (#210), also used by 1.10.1 and 1.10.2\n*/\n\n#include \"Globals.h\"\n#include \"Protocol_1_10.h\"\n#include \"Packetizer.h\"\n\n#include \"json/json.h\"\n\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../ClientHandle.h\"\n#include \"../JsonUtils.h\"\n\n#include \"../WorldStorage/FastNBT.h\"\n\n#include \"../Entities/Boat.h\"\n#include \"../Entities/EnderCrystal.h\"\n#include \"../Entities/ExpOrb.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Entities/FallingBlock.h\"\n#include \"../Entities/Painting.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/FireworkEntity.h\"\n#include \"../Entities/SplashPotionEntity.h\"\n\n#include \"../Mobs/IncludeAllMonsters.h\"\n\n#include \"../BlockEntities/BannerEntity.h\"\n#include \"../BlockEntities/BeaconEntity.h\"\n#include \"../BlockEntities/CommandBlockEntity.h\"\n#include \"../BlockEntities/MobHeadEntity.h\"\n#include \"../BlockEntities/MobSpawnerEntity.h\"\n#include \"../BlockEntities/FlowerPotEntity.h\"\n\n#include \"../Bindings/PluginManager.h\"\n\n\n\n\n\n// The disabled error is intended, since the Metadata have overlapping indexes\n// based on the type of the Entity.\n//\n// IMPORTANT: The enum is used to automate the sequential counting of the\n// Metadata indexes. Adding a new enum value causes the following values to\n// increase their index. Therefore the ordering of the enum values is VERY important!\n#ifdef __clang__\n\t#pragma clang diagnostic push\n\t#pragma clang diagnostic ignored \"-Wduplicate-enum\"\n#endif\n\nnamespace Metadata\n{\n\tenum Metadata_Index\n\t{\n\t\t// Entity\n\t\tENTITY_FLAGS,\n\t\tENTITY_AIR,\n\t\tENTITY_CUSTOM_NAME,\n\t\tENTITY_CUSTOM_NAME_VISIBLE,\n\t\tENTITY_SILENT,\n\t\tENTITY_NO_GRAVITY,\n\t\t_ENTITY_NEXT,  // Used by descendants\n\n\t\t// Potion\n\t\tPOTION_THROWN = _ENTITY_NEXT,\n\n\t\t// FallingBlock\n\t\tFALLING_BLOCK_POSITION = _ENTITY_NEXT,\n\n\t\t// AreaEffectCloud\n\t\tAREA_EFFECT_CLOUD_RADIUS = _ENTITY_NEXT,\n\t\tAREA_EFFECT_CLOUD_COLOR,\n\t\tAREA_EFFECT_CLOUD_SINGLE_POINT_EFFECT,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_ID,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_PARAMETER1,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_PARAMETER2,\n\n\t\t// Arrow\n\t\tARROW_CRITICAL = _ENTITY_NEXT,\n\t\t_ARROW_NEXT,\n\n\t\t// TippedArrow\n\t\tTIPPED_ARROW_COLOR = _ARROW_NEXT,\n\n\t\t// Boat\n\t\tBOAT_LAST_HIT_TIME = _ENTITY_NEXT,\n\t\tBOAT_FORWARD_DIRECTION,\n\t\tBOAT_DAMAGE_TAKEN,\n\t\tBOAT_TYPE,\n\t\tBOAT_RIGHT_PADDLE_TURNING,\n\t\tBOAT_LEFT_PADDLE_TURNING,\n\n\t\t// EnderCrystal\n\t\tENDER_CRYSTAL_BEAM_TARGET = _ENTITY_NEXT,\n\t\tENDER_CRYSTAL_SHOW_BOTTOM,\n\n\t\t// Fireball\n\t\t_FIREBALL_NEXT = _ENTITY_NEXT,\n\n\t\t// WitherSkull\n\t\tWITHER_SKULL_INVULNERABLE = _FIREBALL_NEXT,\n\n\t\t// Fireworks\n\t\tFIREWORK_INFO = _ENTITY_NEXT,\n\n\t\t// Hanging\n\t\t_HANGING_NEXT = _ENTITY_NEXT,\n\n\t\t// ItemFrame\n\t\tITEM_FRAME_ITEM = _HANGING_NEXT,\n\t\tITEM_FRAME_ROTATION,\n\n\t\t// Item\n\t\tITEM_ITEM = _ENTITY_NEXT,\n\n\t\t// Living\n\t\tLIVING_ACTIVE_HAND = _ENTITY_NEXT,\n\t\tLIVING_HEALTH,\n\t\tLIVING_POTION_EFFECT_COLOR,\n\t\tLIVING_POTION_EFFECT_AMBIENT,\n\t\tLIVING_NUMBER_OF_ARROWS,\n\t\t_LIVING_NEXT,\n\n\t\t// Player\n\t\tPLAYER_ADDITIONAL_HEARTHS = _LIVING_NEXT,\n\t\tPLAYER_SCORE,\n\t\tPLAYER_DISPLAYED_SKIN_PARTS,\n\t\tPLAYER_MAIN_HAND,\n\n\t\t// ArmorStand\n\t\tARMOR_STAND_STATUS = _LIVING_NEXT,\n\t\tARMOR_STAND_HEAD_ROTATION,\n\t\tARMOR_STAND_BODY_ROTATION,\n\t\tARMOR_STAND_LEFT_ARM_ROTATION,\n\t\tARMOR_STAND_RIGHT_ARM_ROTATION,\n\t\tARMOR_STAND_LEFT_LEG_ROTATION,\n\t\tARMOR_STAND_RIGHT_LEG_ROTATION,\n\n\t\t// Insentient\n\t\tINSENTIENT_STATUS = _LIVING_NEXT,\n\t\t_INSENTIENT_NEXT,\n\n\t\t// Ambient\n\t\t_AMBIENT_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Bat\n\t\tBAT_HANGING = _AMBIENT_NEXT,\n\n\t\t// Creature\n\t\t_CREATURE_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Ageable\n\t\tAGEABLE_BABY = _CREATURE_NEXT,\n\t\t_AGEABLE_NEXT,\n\n\t\t// PolarBear\n\t\tPOLAR_BEAR_STANDING = _AGEABLE_NEXT,\n\n\t\t// Animal\n\t\t_ANIMAL_NEXT = _AGEABLE_NEXT,\n\n\t\t// Horse\n\t\tHORSE_STATUS = _ANIMAL_NEXT,\n\t\tHORSE_TYPE,\n\t\tHORSE_VARIANT,\n\t\tHORSE_OWNER,\n\t\tHORSE_ARMOR,\n\n\t\t// Pig\n\t\tPIG_HAS_SADDLE = _ANIMAL_NEXT,\n\n\t\t// Rabbit\n\t\tRABBIT_TYPE = _ANIMAL_NEXT,\n\n\t\t// Sheep\n\t\tSHEEP_STATUS = _ANIMAL_NEXT,\n\n\t\t// TameableAnimal\n\t\tTAMEABLE_ANIMAL_STATUS = _ANIMAL_NEXT,\n\t\tTAMEABLE_ANIMAL_OWNER,\n\t\t_TAMEABLE_NEXT,\n\n\t\t// Ocelot\n\t\tOCELOT_TYPE = _TAMEABLE_NEXT,\n\n\t\t// Wolf\n\t\tWOLF_DAMAGE_TAKEN = _TAMEABLE_NEXT,\n\t\tWOLF_BEGGING,\n\t\tWOLF_COLLAR_COLOR,\n\n\t\t// Villager\n\t\tVILLAGER_PROFESSION = _AGEABLE_NEXT,\n\n\t\t// Golem\n\t\t_GOLEM_NEXT = _CREATURE_NEXT,\n\n\t\t// IronGolem\n\t\tIRON_GOLEM_PLAYER_CREATED = _GOLEM_NEXT,\n\n\t\t// Shulker\n\t\tSHULKER_FACING_DIRECTION = _GOLEM_NEXT,\n\t\tSHULKER_ATTACHMENT_FALLING_BLOCK_POSITION,\n\t\tSHULKER_SHIELD_HEIGHT,\n\n\t\t// Monster\n\t\t_MONSTER_NEXT = _CREATURE_NEXT,\n\n\t\t// Blaze\n\t\tBLAZE_ON_FIRE = _MONSTER_NEXT,\n\n\t\t// Creeper\n\t\tCREEPER_STATE = _MONSTER_NEXT,\n\t\tCREEPER_POWERED,\n\t\tCREEPER_IGNITED,\n\n\t\t// Guardian\n\t\tGUARDIAN_STATUS = _MONSTER_NEXT,\n\t\tGUARDIAN_TARGET,\n\n\t\t// Skeleton\n\t\tSKELETON_TYPE = _MONSTER_NEXT,\n\t\tSKELETON_ARMS_SWINGING,\n\n\t\t// Spider\n\t\tSPIDER_CLIMBING = _MONSTER_NEXT,\n\n\t\t// Witch\n\t\tWITCH_AGGRESIVE = _MONSTER_NEXT,\n\n\t\t// Wither\n\t\tWITHER_FIRST_HEAD_TARGET = _MONSTER_NEXT,\n\t\tWITHER_SECOND_HEAD_TARGET,\n\t\tWITHER_THIRD_HEAD_TARGET,\n\t\tWITHER_INVULNERABLE_TIMER,\n\n\t\t// Zombie\n\t\tZOMBIE_IS_BABY = _MONSTER_NEXT,\n\t\tZOMBIE_TYPE,\n\t\tZOMBIE_CONVERTING,\n\t\tZOMBIE_HANDS_RISED_UP,\n\n\t\t// Enderman\n\t\tENDERMAN_CARRIED_BLOCK = _MONSTER_NEXT,\n\t\tENDERMAN_SCREAMING,\n\n\t\t// EnderDragon\n\t\tENDER_DRAGON_DRAGON_PHASE = _INSENTIENT_NEXT,\n\n\t\t// Flying\n\t\t_FLYING_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Ghast\n\t\tGHAST_ATTACKING = _FLYING_NEXT,\n\n\t\t// Slime\n\t\tSLIME_SIZE = _INSENTIENT_NEXT,\n\n\t\t// Minecart\n\t\tMINECART_SHAKING_POWER = _ENTITY_NEXT,\n\t\tMINECART_SHAKING_DIRECTION,\n\t\tMINECART_SHAKING_MULTIPLIER,\n\t\tMINECART_BLOCK_ID_META,\n\t\tMINECART_BLOCK_Y,\n\t\tMINECART_SHOW_BLOCK,\n\t\t_MINECART_NEXT,\n\n\t\t// MinecartCommandBlock\n\t\tMINECART_COMMAND_BLOCK_COMMAND = _MINECART_NEXT,\n\t\tMINECART_COMMAND_BLOCK_LAST_OUTPUT,\n\n\t\t// MinecartFurnace\n\t\tMINECART_FURNACE_POWERED = _MINECART_NEXT,\n\n\t\t// TNTPrimed\n\t\tTNT_PRIMED_FUSE_TIME = _ENTITY_NEXT,\n\t};\n}\n\n#ifdef __clang__\n\t#pragma clang diagnostic pop  // Restore ignored clang errors\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_10_0:\n\nvoid cProtocol_1_10_0::SendSoundEffect(const AString & a_SoundName, Vector3d a_Origin, float a_Volume, float a_Pitch)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSoundEffect);\n\tPkt.WriteString(a_SoundName);\n\tPkt.WriteVarInt32(0);  // Master sound category (may want to be changed to a parameter later)\n\tPkt.WriteBEInt32(FloorC(a_Origin.x * 8.0));\n\tPkt.WriteBEInt32(FloorC(a_Origin.y * 8.0));\n\tPkt.WriteBEInt32(FloorC(a_Origin.z * 8.0));\n\tPkt.WriteBEFloat(a_Volume);\n\tPkt.WriteBEFloat(a_Pitch);\n}\n\n\n\n\n\nUInt32 cProtocol_1_10_0::GetProtocolMobType(const eMonsterType a_MobType) const\n{\n\tswitch (a_MobType)\n\t{\n\t\tcase mtPolarBear: return 102;\n\t\tdefault:          return Super::GetProtocolMobType(a_MobType);\n\t}\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_10_0::GetProtocolVersion() const\n{\n\treturn Version::v1_10_0;\n}\n\n\n\n\n\nvoid cProtocol_1_10_0::HandlePacketResourcePackStatus(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Status);\n\tm_Client->HandleResourcePack(Status);\n}\n\n\n\n\n\nvoid cProtocol_1_10_0::WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const\n{\n\tusing namespace Metadata;\n\n\t// Common metadata:\n\tInt8 Flags = 0;\n\tif (a_Entity.IsOnFire())\n\t{\n\t\tFlags |= 0x01;\n\t}\n\tif (a_Entity.IsCrouched())\n\t{\n\t\tFlags |= 0x02;\n\t}\n\tif (a_Entity.IsSprinting())\n\t{\n\t\tFlags |= 0x08;\n\t}\n\tif (a_Entity.IsRclking())\n\t{\n\t\tFlags |= 0x10;\n\t}\n\tif (a_Entity.IsInvisible())\n\t{\n\t\tFlags |= 0x20;\n\t}\n\ta_Pkt.WriteBEUInt8(ENTITY_FLAGS);  // Index\n\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);  // Type\n\ta_Pkt.WriteBEInt8(Flags);\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase cEntity::etPlayer:\n\t\t{\n\t\t\tauto & Player = static_cast<const cPlayer &>(a_Entity);\n\n\t\t\t// TODO Set player custom name to their name.\n\t\t\t// Then it's possible to move the custom name of mobs to the entities\n\t\t\t// and to remove the \"special\" player custom name.\n\t\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_STRING);\n\t\t\ta_Pkt.WriteString(Player.GetName());\n\n\t\t\ta_Pkt.WriteBEUInt8(LIVING_HEALTH);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Player.GetHealth()));\n\n\t\t\ta_Pkt.WriteBEUInt8(PLAYER_DISPLAYED_SKIN_PARTS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Player.GetSkinParts()));\n\n\t\t\ta_Pkt.WriteBEUInt8(PLAYER_MAIN_HAND);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(Player.IsLeftHanded() ? 0 : 1);\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etPickup:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_ITEM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\tWriteItem(a_Pkt, static_cast<const cPickup &>(a_Entity).GetItem());\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etMinecart:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_POWER);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\n\t\t\t// The following expression makes Minecarts shake more with less health or higher damage taken\n\t\t\tauto & Minecart = static_cast<const cMinecart &>(a_Entity);\n\t\t\tauto maxHealth = a_Entity.GetMaxHealth();\n\t\t\tauto curHealth = a_Entity.GetHealth();\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>((maxHealth - curHealth) * Minecart.LastDamage() * 4));\n\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_DIRECTION);  // (doesn't seem to effect anything)\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(1);\n\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_MULTIPLIER);  // or damage taken\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Minecart.LastDamage() + 10));\n\n\t\t\tif (Minecart.GetPayload() == cMinecart::mpNone)\n\t\t\t{\n\t\t\t\tauto & RideableMinecart = static_cast<const cRideableMinecart &>(Minecart);\n\t\t\t\tconst cItem & MinecartContent = RideableMinecart.GetContent();\n\t\t\t\tif (!MinecartContent.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_BLOCK_ID_META);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t\t\tint Content = MinecartContent.m_ItemType;\n\t\t\t\t\tContent |= MinecartContent.m_ItemDamage << 8;\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Content));\n\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_BLOCK_Y);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(RideableMinecart.GetBlockHeight()));\n\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHOW_BLOCK);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\t\t\ta_Pkt.WriteBool(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Minecart.GetPayload() == cMinecart::mpFurnace)\n\t\t\t{\n\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_FURNACE_POWERED);\n\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\t\ta_Pkt.WriteBool(static_cast<const cMinecartWithFurnace &>(Minecart).IsFueled());\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etMinecart\n\n\t\tcase cEntity::etProjectile:\n\t\t{\n\t\t\tauto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase cProjectileEntity::pkArrow:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(ARROW_CRITICAL);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\t\t\ta_Pkt.WriteBEInt8(static_cast<const cArrowEntity &>(Projectile).IsCritical() ? 1 : 0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkFirework:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(FIREWORK_INFO);  // Firework item used for this firework\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cFireworkEntity &>(Projectile).GetItem());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkSplashPotion:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(POTION_THROWN);  // Potion item which was thrown\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cSplashPotionEntity &>(Projectile).GetItem());\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etProjectile\n\n\t\tcase cEntity::etMonster:\n\t\t{\n\t\t\tWriteMobMetadata(a_Pkt, static_cast<const cMonster &>(a_Entity));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntity::etBoat:\n\t\t{\n\t\t\tauto & Boat = static_cast<const cBoat &>(a_Entity);\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_LAST_HIT_TIME);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetLastDamage()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_FORWARD_DIRECTION);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetForwardDirection()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_DAMAGE_TAKEN);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(Boat.GetDamageTaken());\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_TYPE);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetMaterial()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_RIGHT_PADDLE_TURNING);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Boat.IsRightPaddleUsed());\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_LEFT_PADDLE_TURNING);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Boat.IsLeftPaddleUsed());\n\n\t\t\tbreak;\n\t\t}  // case etBoat\n\n\t\tcase cEntity::etItemFrame:\n\t\t{\n\t\t\tauto & Frame = static_cast<const cItemFrame &>(a_Entity);\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_FRAME_ITEM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\tWriteItem(a_Pkt, Frame.GetItem());\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_FRAME_ROTATION);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Frame.GetItemRotation());\n\t\t\tbreak;\n\t\t}  // case etItemFrame\n\n\t\tcase cEntity::etEnderCrystal:\n\t\t{\n\t\t\tconst auto & EnderCrystal = static_cast<const cEnderCrystal &>(a_Entity);\n\t\t\ta_Pkt.WriteBEUInt8(ENDER_CRYSTAL_BEAM_TARGET);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_OPTIONAL_POSITION);\n\t\t\ta_Pkt.WriteBool(EnderCrystal.DisplaysBeam());\n\t\t\tif (EnderCrystal.DisplaysBeam())\n\t\t\t{\n\t\t\t\ta_Pkt.WriteXYZPosition64(EnderCrystal.GetBeamTarget());\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(ENDER_CRYSTAL_SHOW_BOTTOM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(EnderCrystal.ShowsBottom());\n\t\t\tbreak;\n\t\t}  // case etEnderCrystal\n\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_10_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const\n{\n\tusing namespace Metadata;\n\n\t// Living entity metadata\n\tif (a_Mob.HasCustomName())\n\t{\n\t\t// TODO: As of 1.9 _all_ entities can have custom names; should this be moved up?\n\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME);\n\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_STRING);\n\t\ta_Pkt.WriteString(a_Mob.GetCustomName());\n\n\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME_VISIBLE);  // Custom name always visible\n\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\ta_Pkt.WriteBool(a_Mob.IsCustomNameAlwaysVisible());\n\t}\n\n\ta_Pkt.WriteBEUInt8(LIVING_HEALTH);\n\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\n\tswitch (a_Mob.GetMobType())\n\t{\n\t\tcase mtBat:\n\t\t{\n\t\t\tauto & Bat = static_cast<const cBat &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(BAT_HANGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(Bat.IsHanging() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtBat\n\n\t\tcase mtChicken:\n\t\t{\n\t\t\tauto & Chicken = static_cast<const cChicken &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Chicken.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtChicken\n\n\t\tcase mtCow:\n\t\t{\n\t\t\tauto & Cow = static_cast<const cCow &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Cow.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtCow\n\n\t\tcase mtCreeper:\n\t\t{\n\t\t\tauto & Creeper = static_cast<const cCreeper &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_STATE);  // (idle or \"blowing\")\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Creeper.IsBlowing() ? 1 : static_cast<UInt32>(-1));\n\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_POWERED);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Creeper.IsCharged());\n\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_IGNITED);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Creeper.IsBurnedWithFlintAndSteel());\n\t\t\tbreak;\n\t\t}  // case mtCreeper\n\n\t\tcase mtEnderman:\n\t\t{\n\t\t\tauto & Enderman = static_cast<const cEnderman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ENDERMAN_CARRIED_BLOCK);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BLOCKID);\n\t\t\tUInt32 Carried = 0;\n\t\t\tCarried |= static_cast<UInt32>(Enderman.GetCarriedBlock() << 4);\n\t\t\tCarried |= Enderman.GetCarriedMeta();\n\t\t\ta_Pkt.WriteVarInt32(Carried);\n\n\t\t\ta_Pkt.WriteBEUInt8(ENDERMAN_SCREAMING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Enderman.IsScreaming());\n\t\t\tbreak;\n\t\t}  // case mtEnderman\n\n\t\tcase mtGhast:\n\t\t{\n\t\t\tauto & Ghast = static_cast<const cGhast &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(GHAST_ATTACKING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Ghast.IsCharging());\n\t\t\tbreak;\n\t\t}  // case mtGhast\n\n\t\tcase mtHorse:\n\t\t{\n\t\t\tauto & Horse = static_cast<const cHorse &>(a_Mob);\n\t\t\tInt8 Flags = 0;\n\t\t\tif (Horse.IsTame())\n\t\t\t{\n\t\t\t\tFlags |= 0x02;\n\t\t\t}\n\t\t\tif (Horse.IsSaddled())\n\t\t\t{\n\t\t\t\tFlags |= 0x04;\n\t\t\t}\n\t\t\tif (Horse.IsChested())\n\t\t\t{\n\t\t\t\tFlags |= 0x08;\n\t\t\t}\n\t\t\tif (Horse.IsEating())\n\t\t\t{\n\t\t\t\tFlags |= 0x20;\n\t\t\t}\n\t\t\tif (Horse.IsRearing())\n\t\t\t{\n\t\t\t\tFlags |= 0x40;\n\t\t\t}\n\t\t\tif (Horse.IsMthOpen())\n\t\t\t{\n\t\t\t\tFlags |= 0x80;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(HORSE_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(Flags);\n\n\t\t\ta_Pkt.WriteBEUInt8(HORSE_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseType()));\n\n\t\t\ta_Pkt.WriteBEUInt8(HORSE_VARIANT);  // Color / style\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\tint Appearance = 0;\n\t\t\tAppearance = Horse.GetHorseColor();\n\t\t\tAppearance |= Horse.GetHorseStyle() << 8;\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Appearance));\n\n\t\t\ta_Pkt.WriteBEUInt8(HORSE_ARMOR);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseArmour()));\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Horse.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtHorse\n\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\tauto & MagmaCube = static_cast<const cMagmaCube &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(SLIME_SIZE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(MagmaCube.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtMagmaCube\n\n\t\tcase mtOcelot:\n\t\t{\n\t\t\tauto & Ocelot = static_cast<const cOcelot &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Ocelot.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtOcelot\n\n\t\tcase mtPig:\n\t\t{\n\t\t\tauto & Pig = static_cast<const cPig &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Pig.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(PIG_HAS_SADDLE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Pig.IsSaddled());\n\n\t\t\tbreak;\n\t\t}  // case mtPig\n\n\t\tcase mtRabbit:\n\t\t{\n\t\t\tauto & Rabbit = static_cast<const cRabbit &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Rabbit.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(RABBIT_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Rabbit.GetRabbitType()));\n\t\t\tbreak;\n\t\t}  // case mtRabbit\n\n\t\tcase mtSheep:\n\t\t{\n\t\t\tauto & Sheep = static_cast<const cSheep &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Sheep.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(SHEEP_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\tInt8 SheepMetadata = 0;\n\t\t\tSheepMetadata = static_cast<Int8>(Sheep.GetFurColor());\n\t\t\tif (Sheep.IsSheared())\n\t\t\t{\n\t\t\t\tSheepMetadata |= 0x10;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEInt8(SheepMetadata);\n\t\t\tbreak;\n\t\t}  // case mtSheep\n\n\t\tcase mtSkeleton:\n\t\t{\n\t\t\tauto & Skeleton = static_cast<const cSkeleton &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(LIVING_ACTIVE_HAND);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);\n\n\t\t\ta_Pkt.WriteBEUInt8(SKELETON_ARMS_SWINGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Skeleton.IsChargingBow());\n\t\t\tbreak;\n\t\t}  // case mtSkeleton\n\n\t\tcase mtSlime:\n\t\t{\n\t\t\tauto & Slime = static_cast<const cSlime &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(SLIME_SIZE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Slime.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtSlime\n\n\t\tcase mtVillager:\n\t\t{\n\t\t\tauto & Villager = static_cast<const cVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Villager.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(VILLAGER_PROFESSION);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Villager.GetVilType()));\n\t\t\tbreak;\n\t\t}  // case mtVillager\n\n\t\tcase mtWitch:\n\t\t{\n\t\t\tauto & Witch = static_cast<const cWitch &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(WITCH_AGGRESIVE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Witch.IsAngry());\n\t\t\tbreak;\n\t\t}  // case mtWitch\n\n\t\tcase mtWither:\n\t\t{\n\t\t\tauto & Wither = static_cast<const cWither &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(WITHER_INVULNERABLE_TIMER);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Wither.GetWitherInvulnerableTicks());\n\n\t\t\t// TODO: Use boss bar packet for health\n\t\t\tbreak;\n\t\t}  // case mtWither\n\n\t\tcase mtWitherSkeleton:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(SKELETON_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(1);  // Is wither skeleton\n\t\t\tbreak;\n\t\t}  // case mtWitherSkeleton\n\n\t\tcase mtWolf:\n\t\t{\n\t\t\tauto & Wolf = static_cast<const cWolf &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBaby());\n\n\t\t\tInt8 WolfStatus = 0;\n\t\t\tif (Wolf.IsSitting())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Wolf.IsAngry())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x2;\n\t\t\t}\n\t\t\tif (Wolf.IsTame())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x4;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(TAMEABLE_ANIMAL_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(WolfStatus);\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_DAMAGE_TAKEN);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));  // TODO Not use the current health\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_BEGGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBegging());\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_COLLAR_COLOR);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Wolf.GetCollarColor()));\n\t\t\tbreak;\n\t\t}  // case mtWolf\n\n\t\tcase mtHusk:\n\t\tcase mtZombie:\n\t\t{\n\t\t\tauto & Zombie = static_cast<const cZombie &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_IS_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Zombie.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(0);\n\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_CONVERTING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(false);\n\t\t\tbreak;\n\t\t}  // case mtZombie\n\n\t\tcase mtZombiePigman:\n\t\t{\n\t\t\tauto & ZombiePigman = static_cast<const cZombiePigman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombiePigman.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombiePigman\n\n\t\tcase mtZombieVillager:\n\t\t{\n\t\t\tauto & ZombieVillager = reinterpret_cast<const cZombieVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_IS_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombieVillager.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(ZombieVillager.GetProfession());\n\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_CONVERTING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombieVillager.ConversionTime() != -1);\n\t\t\tbreak;\n\t\t}  // case mtZombieVillager\n\n\t\tcase mtBlaze:\n\t\tcase mtElderGuardian:\n\t\tcase mtGuardian:\n\t\t{\n\t\t\t// TODO: Mobs with extra fields that aren't implemented\n\t\t\tbreak;\n\t\t}\n\t\tcase mtCat:\n\n\t\tcase mtPolarBear:\n\n\t\tcase mtShulker:\n\n\t\tcase mtDonkey:\n\t\tcase mtMule:\n\t\tcase mtSkeletonHorse:\n\t\tcase mtZombieHorse:\n\t\t{\n\t\t\t// Todo: Mobs not added yet. Grouped ones have the same metadata\n\t\t\tASSERT(!\"cProtocol_1_10::WriteMobMetadata: received unimplemented type\");\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCaveSpider:\n\t\tcase mtEnderDragon:\n\t\tcase mtEndermite:\n\t\tcase mtGiant:\n\t\tcase mtIronGolem:\n\t\tcase mtMooshroom:\n\t\tcase mtSilverfish:\n\t\tcase mtSnowGolem:\n\t\tcase mtStray:\n\t\tcase mtSpider:\n\t\tcase mtSquid:\n\t\t{\n\t\t\t// Entities without additional metadata\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: UNREACHABLE(\"cProtocol_1_10::WriteMobMetadata: received mob of invalid type\");\n\t}  // switch (a_Mob.GetType())\n}\n"
  },
  {
    "path": "src/Protocol/Protocol_1_10.h",
    "content": "\n// Protocol_1_10.h\n\n/*\nDeclares the 1.10 protocol classes:\n\t- cProtocol_1_10\n\t\t- release 1.10 protocol (#210), also used by 1.10.1 and 1.10.2\n*/\n\n\n\n\n\n#pragma once\n\n#include \"Protocol_1_9.h\"\n\n\n\n\n\nclass cProtocol_1_10_0:\n\tpublic cProtocol_1_9_4\n{\n\tusing Super = cProtocol_1_9_4;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual void SendSoundEffect(const AString & a_SoundName, Vector3d a_Origin, float a_Volume, float a_Pitch) override;\n\n\tvirtual UInt32 GetProtocolMobType(eMonsterType a_MobType) const override;\n\tvirtual Version GetProtocolVersion() const override;\n\n\tvirtual void HandlePacketResourcePackStatus(cByteBuffer & a_ByteBuffer) override;\n\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const override;\n\tvirtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const override;\n};\n"
  },
  {
    "path": "src/Protocol/Protocol_1_11.cpp",
    "content": "\n// Protocol_1_11.cpp\n\n/*\nImplements the 1.11 protocol classes:\n\t- cProtocol_1_11_0\n\t\t- release 1.11 protocol (#315)\n\t- cProtocol_1_11_1\n\t\t- release 1.11.1 protocol (#316)\n*/\n\n#include \"Globals.h\"\n#include \"Protocol_1_11.h\"\n#include \"Packetizer.h\"\n\n#include \"../WorldStorage/FastNBT.h\"\n\n#include \"../Entities/Boat.h\"\n#include \"../Entities/EnderCrystal.h\"\n#include \"../Entities/ExpOrb.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Entities/FallingBlock.h\"\n#include \"../Entities/Painting.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/FireworkEntity.h\"\n#include \"../Entities/SplashPotionEntity.h\"\n\n#include \"../Mobs/IncludeAllMonsters.h\"\n\n#include \"../BlockEntities/BedEntity.h\"\n#include \"../BlockEntities/MobSpawnerEntity.h\"\n\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../ClientHandle.h\"\n#include \"../CompositeChat.h\"\n#include \"../JsonUtils.h\"\n#include \"../Bindings/PluginManager.h\"\n\n\n\n\n\n// The disabled error is intended, since the Metadata have overlapping indexes\n// based on the type of the Entity.\n//\n// IMPORTANT: The enum is used to automate the sequential counting of the\n// Metadata indexes. Adding a new enum value causes the following values to\n// increase their index. Therefore the ordering of the enum values is VERY important!\n#ifdef __clang__\n\t#pragma clang diagnostic push\n\t#pragma clang diagnostic ignored \"-Wduplicate-enum\"\n#endif\n\nnamespace Metadata_1_11\n{\n\tenum MetadataIndex\n\t{\n\t\t// Entity\n\t\tENTITY_FLAGS,\n\t\tENTITY_AIR,\n\t\tENTITY_CUSTOM_NAME,\n\t\tENTITY_CUSTOM_NAME_VISIBLE,\n\t\tENTITY_SILENT,\n\t\tENTITY_NO_GRAVITY,\n\t\t_ENTITY_NEXT,  // Used by descendants\n\n\t\t// Potion\n\t\tPOTION_THROWN = _ENTITY_NEXT,\n\n\t\t// FallingBlock\n\t\tFALLING_BLOCK_POSITION = _ENTITY_NEXT,\n\n\t\t// AreaEffectCloud\n\t\tAREA_EFFECT_CLOUD_RADIUS = _ENTITY_NEXT,\n\t\tAREA_EFFECT_CLOUD_COLOR,\n\t\tAREA_EFFECT_CLOUD_SINGLE_POINT_EFFECT,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_ID,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_PARAMETER1,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_PARAMETER2,\n\n\t\t// Arrow\n\t\tARROW_CRITICAL = _ENTITY_NEXT,\n\t\t_ARROW_NEXT,\n\n\t\t// TippedArrow\n\t\tTIPPED_ARROW_COLOR = _ARROW_NEXT,\n\n\t\t// Boat\n\t\tBOAT_LAST_HIT_TIME = _ENTITY_NEXT,\n\t\tBOAT_FORWARD_DIRECTION,\n\t\tBOAT_DAMAGE_TAKEN,\n\t\tBOAT_TYPE,\n\t\tBOAT_RIGHT_PADDLE_TURNING,\n\t\tBOAT_LEFT_PADDLE_TURNING,\n\n\t\t// EnderCrystal\n\t\tENDER_CRYSTAL_BEAM_TARGET = _ENTITY_NEXT,\n\t\tENDER_CRYSTAL_SHOW_BOTTOM,\n\n\t\t// Fireball\n\t\t_FIREBALL_NEXT = _ENTITY_NEXT,\n\n\t\t// WitherSkull\n\t\tWITHER_SKULL_INVULNERABLE = _FIREBALL_NEXT,\n\n\t\t// Fireworks\n\t\tFIREWORK_INFO = _ENTITY_NEXT,\n\t\tFIREWORK_BOOSTED_ENTITY_ID,  // 1.11.1 only\n\n\t\t// Hanging\n\t\t_HANGING_NEXT = _ENTITY_NEXT,\n\n\t\t// ItemFrame\n\t\tITEM_FRAME_ITEM = _HANGING_NEXT,\n\t\tITEM_FRAME_ROTATION,\n\n\t\t// Item\n\t\tITEM_ITEM = _ENTITY_NEXT,\n\n\t\t// Living\n\t\tLIVING_ACTIVE_HAND = _ENTITY_NEXT,\n\t\tLIVING_HEALTH,\n\t\tLIVING_POTION_EFFECT_COLOR,\n\t\tLIVING_POTION_EFFECT_AMBIENT,\n\t\tLIVING_NUMBER_OF_ARROWS,\n\t\t_LIVING_NEXT,\n\n\t\t// Player\n\t\tPLAYER_ADDITIONAL_HEARTHS = _LIVING_NEXT,\n\t\tPLAYER_SCORE,\n\t\tPLAYER_DISPLAYED_SKIN_PARTS,\n\t\tPLAYER_MAIN_HAND,\n\n\t\t// ArmorStand\n\t\tARMOR_STAND_STATUS = _LIVING_NEXT,\n\t\tARMOR_STAND_HEAD_ROTATION,\n\t\tARMOR_STAND_BODY_ROTATION,\n\t\tARMOR_STAND_LEFT_ARM_ROTATION,\n\t\tARMOR_STAND_RIGHT_ARM_ROTATION,\n\t\tARMOR_STAND_LEFT_LEG_ROTATION,\n\t\tARMOR_STAND_RIGHT_LEG_ROTATION,\n\n\t\t// Insentient\n\t\tINSENTIENT_STATUS = _LIVING_NEXT,\n\t\t_INSENTIENT_NEXT,\n\n\t\t// Ambient\n\t\t_AMBIENT_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Bat\n\t\tBAT_HANGING = _AMBIENT_NEXT,\n\n\t\t// Creature\n\t\t_CREATURE_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Ageable\n\t\tAGEABLE_BABY = _CREATURE_NEXT,\n\t\t_AGEABLE_NEXT,\n\n\t\t// PolarBear\n\t\tPOLAR_BEAR_STANDING = _AGEABLE_NEXT,\n\n\t\t// Animal\n\t\t_ANIMAL_NEXT = _AGEABLE_NEXT,\n\n\t\t// Abstract horse\n\t\tABSTRACT_HORSE_STATUS = _ANIMAL_NEXT,\n\t\tABSTRACT_HORSE_OWNER,\n\t\t_ABSTRACT_HORSE_NEXT,\n\n\t\t// Horse\n\t\tHORSE_VARIANT = _ABSTRACT_HORSE_NEXT,\n\t\tHORSE_ARMOR,\n\n\t\t// Chested horse\n\t\tCHESTED_HORSE_CHESTED = _ABSTRACT_HORSE_NEXT,\n\t\t_CHESTED_HORSE_NEXT,\n\n\t\t// Llama\n\t\tLLAMA_STRENGTH = _CHESTED_HORSE_NEXT,\n\t\tLLAMA_CARPET_COLOR,\n\t\tLLAMA_VARIANT,\n\n\t\t// Pig\n\t\tPIG_HAS_SADDLE = _ANIMAL_NEXT,\n\t\tPIG_TOTAL_CARROT_ON_A_STICK_BOOST,  // 1.11.1 only\n\n\t\t// Rabbit\n\t\tRABBIT_TYPE = _ANIMAL_NEXT,\n\n\t\t// Sheep\n\t\tSHEEP_STATUS = _ANIMAL_NEXT,\n\n\t\t// TameableAnimal\n\t\tTAMEABLE_ANIMAL_STATUS = _ANIMAL_NEXT,\n\t\tTAMEABLE_ANIMAL_OWNER,\n\t\t_TAMEABLE_NEXT,\n\n\t\t// Ocelot\n\t\tOCELOT_TYPE = _TAMEABLE_NEXT,\n\n\t\t// Wolf\n\t\tWOLF_DAMAGE_TAKEN = _TAMEABLE_NEXT,\n\t\tWOLF_BEGGING,\n\t\tWOLF_COLLAR_COLOR,\n\n\t\t// Villager\n\t\tVILLAGER_PROFESSION = _AGEABLE_NEXT,\n\n\t\t// Golem\n\t\t_GOLEM_NEXT = _CREATURE_NEXT,\n\n\t\t// IronGolem\n\t\tIRON_GOLEM_PLAYER_CREATED = _GOLEM_NEXT,\n\n\t\t// Shulker\n\t\tSHULKER_FACING_DIRECTION = _GOLEM_NEXT,\n\t\tSHULKER_ATTACHMENT_FALLING_BLOCK_POSITION,\n\t\tSHULKER_SHIELD_HEIGHT,\n\n\t\t// Monster\n\t\t_MONSTER_NEXT = _CREATURE_NEXT,\n\n\t\t// Blaze\n\t\tBLAZE_ON_FIRE = _MONSTER_NEXT,\n\n\t\t// Creeper\n\t\tCREEPER_STATE = _MONSTER_NEXT,\n\t\tCREEPER_POWERED,\n\t\tCREEPER_IGNITED,\n\n\t\t// Guardian\n\t\tGUARDIAN_STATUS = _MONSTER_NEXT,\n\t\tGUARDIAN_TARGET,\n\n\t\t// Abstract Skeleton\n\t\tABSTRACT_SKELETON_ARMS_SWINGING = _MONSTER_NEXT,\n\n\t\t// Spider\n\t\tSPIDER_CLIMBING = _MONSTER_NEXT,\n\n\t\t// Witch\n\t\tWITCH_AGGRESIVE = _MONSTER_NEXT,\n\n\t\t// Wither\n\t\tWITHER_FIRST_HEAD_TARGET = _MONSTER_NEXT,\n\t\tWITHER_SECOND_HEAD_TARGET,\n\t\tWITHER_THIRD_HEAD_TARGET,\n\t\tWITHER_INVULNERABLE_TIMER,\n\n\t\t// Zombie\n\t\tZOMBIE_IS_BABY = _MONSTER_NEXT,\n\t\tZOMBIE_UNUSED,  // Was type\n\t\tZOMBIE_HANDS_RISED_UP,\n\t\t_ZOMBIE_NEXT,\n\n\t\t// Zombie villager\n\t\tZOMBIE_VILLAGER_CONVERTING = _ZOMBIE_NEXT,\n\t\tZOMBIE_VILLAGER_PROFESSION,\n\n\t\t// Enderman\n\t\tENDERMAN_CARRIED_BLOCK = _MONSTER_NEXT,\n\t\tENDERMAN_SCREAMING,\n\n\t\t// Evocation illager\n\t\tEVOKER_SPELL = _MONSTER_NEXT,\n\n\t\t// Vex\n\t\tVEX_FLAGS = _MONSTER_NEXT,\n\n\t\t// Vindication illager\n\t\tVINDICATOR_FLAGS = _MONSTER_NEXT,\n\n\t\t// EnderDragon\n\t\tENDER_DRAGON_DRAGON_PHASE = _INSENTIENT_NEXT,\n\n\t\t// Flying\n\t\t_FLYING_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Ghast\n\t\tGHAST_ATTACKING = _FLYING_NEXT,\n\n\t\t// Slime\n\t\tSLIME_SIZE = _INSENTIENT_NEXT,\n\n\t\t// Minecart\n\t\tMINECART_SHAKING_POWER = _ENTITY_NEXT,\n\t\tMINECART_SHAKING_DIRECTION,\n\t\tMINECART_SHAKING_MULTIPLIER,\n\t\tMINECART_BLOCK_ID_META,\n\t\tMINECART_BLOCK_Y,\n\t\tMINECART_SHOW_BLOCK,\n\t\t_MINECART_NEXT,\n\n\t\t// MinecartCommandBlock\n\t\tMINECART_COMMAND_BLOCK_COMMAND = _MINECART_NEXT,\n\t\tMINECART_COMMAND_BLOCK_LAST_OUTPUT,\n\n\t\t// MinecartFurnace\n\t\tMINECART_FURNACE_POWERED = _MINECART_NEXT,\n\n\t\t// TNTPrimed\n\t\tTNT_PRIMED_FUSE_TIME = _ENTITY_NEXT,\n\t};\n}\n\n#ifdef __clang__\n\t#pragma clang diagnostic pop  // Restore ignored clang errors\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_11_0:\n\nvoid cProtocol_1_11_0::SendCollectEntity(const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktCollectEntity);\n\tPkt.WriteVarInt32(a_Collected.GetUniqueID());\n\tPkt.WriteVarInt32(a_Collector.GetUniqueID());\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Count));\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::SendEntityAnimation(const cEntity & a_Entity, const EntityAnimation a_Animation)\n{\n\tswitch (a_Animation)\n\t{\n\t\tcase EntityAnimation::EggCracks:\n\t\tcase EntityAnimation::SnowballPoofs:\n\t\t{\n\t\t\t// Vanilla stopped doing clientside prediction for thrown projectile particle effects (for some reason).\n\t\t\t// But they're still doing motion prediction, and latency exists, hence re-send the server position to avoid particle effects happening inside a block:\n\t\t\tSendEntityPosition(a_Entity);\n\t\t\tbreak;\n\t\t}\n\t\tcase EntityAnimation::PawnChestEquipmentBreaks:\n\t\tcase EntityAnimation::PawnFeetEquipmentBreaks:\n\t\tcase EntityAnimation::PawnHeadEquipmentBreaks:\n\t\tcase EntityAnimation::PawnLegsEquipmentBreaks:\n\t\tcase EntityAnimation::PawnMainHandEquipmentBreaks:\n\t\tcase EntityAnimation::PawnOffHandEquipmentBreaks:\n\t\t{\n\t\t\tconst auto Position = a_Entity.GetPosition();\n\n\t\t\t// 1.11 dropped the automatic particle effect + sound on item break. Emulate at least some of it:\n\t\t\tSendSoundEffect(\"entity.item.break\", Position, 1, 0.75f + ((a_Entity.GetUniqueID() * 23) % 32) / 64.f);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: break;\n\t}\n\n\tSuper::SendEntityAnimation(a_Entity, a_Animation);\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::SendHideTitle(void)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTitle);\n\tPkt.WriteVarInt32(4);  // Hide title\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::SendResetTitle(void)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTitle);\n\tPkt.WriteVarInt32(5);  // Reset title\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::SendSpawnMob(const cMonster & a_Mob)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tconst auto MobType = GetProtocolMobType(a_Mob.GetMobType());\n\n\t// If the type is not valid in this protocol bail out:\n\tif (MobType == 0)\n\t{\n\t\treturn;\n\t}\n\n\tcPacketizer Pkt(*this, pktSpawnMob);\n\tPkt.WriteVarInt32(a_Mob.GetUniqueID());\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_Mob.GetUniqueID());\n\tPkt.WriteVarInt32(MobType);\n\tVector3d LastSentPos = a_Mob.GetLastSentPosition();\n\tPkt.WriteBEDouble(LastSentPos.x);\n\tPkt.WriteBEDouble(LastSentPos.y);\n\tPkt.WriteBEDouble(LastSentPos.z);\n\tPkt.WriteByteAngle(a_Mob.GetHeadYaw());  // Doesn't seem to be used\n\tPkt.WriteByteAngle(a_Mob.GetPitch());\n\tPkt.WriteByteAngle(a_Mob.GetYaw());\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedX() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedY() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedZ() * 400));\n\tWriteEntityMetadata(Pkt, a_Mob);\n\tPkt.WriteBEUInt8(0xff);  // Metadata terminator\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::SendTitleTimes(int a_FadeInTicks, int a_DisplayTicks, int a_FadeOutTicks)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTitle);\n\tPkt.WriteVarInt32(3);  // Set title display times\n\tPkt.WriteBEInt32(a_FadeInTicks);\n\tPkt.WriteBEInt32(a_DisplayTicks);\n\tPkt.WriteBEInt32(a_FadeOutTicks);\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tByte Action;\n\tswitch (a_BlockEntity.GetBlockType())\n\t{\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\t{\n\t\t\t// The ones with a action of 0 is just a workaround to send the block entities to a client.\n\t\t\t// Todo: 18.09.2020 - remove this when block entities are transmitted in the ChunkData packet - 12xx12\n\t\t\tAction = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_MOB_SPAWNER:       Action = 1;  break;  // Update mob spawner spinny mob thing\n\t\tcase E_BLOCK_COMMAND_BLOCK:     Action = 2;  break;  // Update command block text\n\t\tcase E_BLOCK_BEACON:            Action = 3;  break;  // Update beacon entity\n\t\tcase E_BLOCK_HEAD:              Action = 4;  break;  // Update mobhead entity\n\t\tcase E_BLOCK_FLOWER_POT:        Action = 5;  break;  // Update flower pot\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_STANDING_BANNER:   Action = 6;  break;  // Update banner\n\t\tcase E_BLOCK_BED:               Action = 11; break;  // Update bed color (new!)\n\n\t\tdefault: return;  // Block entities change between versions\n\t}\n\n\tcPacketizer Pkt(*this, pktUpdateBlockEntity);\n\tPkt.WriteXYZPosition64(a_BlockEntity.GetPosX(), a_BlockEntity.GetPosY(), a_BlockEntity.GetPosZ());\n\tPkt.WriteBEUInt8(Action);\n\n\tcFastNBTWriter Writer;\n\tWriteBlockEntity(Writer, a_BlockEntity);\n\tWriter.Finish();\n\tPkt.WriteBuf(Writer.GetResult());\n}\n\n\n\n\n\nsigned char cProtocol_1_11_0::GetProtocolEntityStatus(const EntityAnimation a_Animation) const\n{\n\tswitch (a_Animation)\n\t{\n\t\tcase EntityAnimation::EggCracks: return 3;\n\t\tcase EntityAnimation::EvokerFangsAttacks: return 4;\n\t\tcase EntityAnimation::IronGolemStashesGift: return 34;\n\t\tcase EntityAnimation::PawnTotemActivates: return 35;\n\t\tcase EntityAnimation::SnowballPoofs: return 3;\n\t\tdefault: return Super::GetProtocolEntityStatus(a_Animation);\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_11_0::GetProtocolMobType(const eMonsterType a_MobType) const\n{\n\tswitch (a_MobType)\n\t{\n\t\t// Map invalid type to Giant for easy debugging (if this ever spawns, something has gone very wrong)\n\t\tcase mtInvalidType:           return 53;\n\t\tcase mtBat:                   return 65;\n\t\tcase mtBlaze:                 return 61;\n\t\tcase mtCaveSpider:            return 59;\n\t\tcase mtChicken:               return 93;\n\t\tcase mtCow:                   return 92;\n\t\tcase mtCreeper:               return 50;\n\t\tcase mtDonkey:                return 31;\n\t\tcase mtEnderDragon:           return 63;\n\t\tcase mtEnderman:              return 58;\n\t\tcase mtEndermite:             return 67;\n\t\tcase mtEvoker:                return 34;\n\t\tcase mtGhast:                 return 56;\n\t\tcase mtGiant:                 return 53;\n\t\tcase mtGuardian:              return 68;\n\t\tcase mtHorse:                 return 100;\n\t\tcase mtHusk:                  return 23;\n\t\tcase mtIronGolem:             return 99;\n\t\tcase mtLlama:                 return 103;\n\t\tcase mtMagmaCube:             return 62;\n\t\tcase mtMooshroom:             return 96;\n\t\tcase mtMule:                  return 32;\n\t\tcase mtOcelot:                return 98;\n\t\tcase mtPig:                   return 90;\n\t\tcase mtPolarBear:             return 102;\n\t\tcase mtRabbit:                return 101;\n\t\tcase mtSheep:                 return 91;\n\t\tcase mtShulker:               return 69;\n\t\tcase mtSilverfish:            return 60;\n\t\tcase mtSkeleton:              return 51;\n\t\tcase mtSlime:                 return 55;\n\t\tcase mtSnowGolem:             return 97;\n\t\tcase mtSpider:                return 52;\n\t\tcase mtStray:                 return 6;\n\t\tcase mtTraderLlama:           return 103;\n\t\tcase mtSquid:                 return 94;\n\t\tcase mtVex:                   return 35;\n\t\tcase mtVillager:              return 120;\n\t\tcase mtVindicator:            return 36;\n\t\tcase mtWitch:                 return 66;\n\t\tcase mtWither:                return 64;\n\t\tcase mtWitherSkeleton:        return 5;\n\t\tcase mtWolf:                  return 95;\n\t\tcase mtZombie:                return 54;\n\t\tcase mtZombiePigman:          return 57;\n\t\tcase mtZombieVillager:        return 27;\n\n\t\tdefault:                      return 0;\n\t}\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_11_0::GetProtocolVersion() const\n{\n\treturn Version::v1_11_0;\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::HandlePacketBlockPlace(cByteBuffer & a_ByteBuffer)\n{\n\tVector3i Position;\n\tif (!a_ByteBuffer.ReadXYZPosition64(Position))\n\t{\n\t\treturn;\n\t}\n\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Face);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Hand);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, CursorX);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, CursorY);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, CursorZ);\n\n\tm_Client->HandleRightClick(Position, FaceIntToBlockFace(Face), {FloorC(CursorX * 16), FloorC(CursorY * 16), FloorC(CursorZ * 16)}, Hand == 0);\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::WriteBlockEntity(cFastNBTWriter & a_Writer, const cBlockEntity & a_BlockEntity) const\n{\n\tswitch (a_BlockEntity.GetBlockType())\n\t{\n\t\tcase E_BLOCK_BED:\n\t\t{\n\t\t\tauto & BedEntity = static_cast<const cBedEntity &>(a_BlockEntity);\n\t\t\ta_Writer.AddInt(\"color\", BedEntity.GetColor());  // New: multicoloured beds\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\t{\n\t\t\tauto & MobSpawnerEntity = static_cast<const cMobSpawnerEntity &>(a_BlockEntity);\n\t\t\ta_Writer.BeginCompound(\"SpawnData\");\n\t\t\t\ta_Writer.AddString(\"id\", cMonster::MobTypeToVanillaNBT(MobSpawnerEntity.GetEntity()));  // New: uses namespaced ID\n\t\t\ta_Writer.EndCompound();\n\t\t\ta_Writer.AddShort(\"Delay\", MobSpawnerEntity.GetSpawnDelay());\n\t\t\tbreak;\n\t\t}\n\t\tdefault: return Super::WriteBlockEntity(a_Writer, a_BlockEntity);\n\t}\n\n\ta_Writer.AddInt(\"x\", a_BlockEntity.GetPosX());\n\ta_Writer.AddInt(\"y\", a_BlockEntity.GetPosY());\n\ta_Writer.AddInt(\"z\", a_BlockEntity.GetPosZ());\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const\n{\n\tusing namespace Metadata_1_11;\n\n\t// Common metadata:\n\tInt8 Flags = 0;\n\tif (a_Entity.IsOnFire())\n\t{\n\t\tFlags |= 0x01;\n\t}\n\tif (a_Entity.IsCrouched())\n\t{\n\t\tFlags |= 0x02;\n\t}\n\tif (a_Entity.IsSprinting())\n\t{\n\t\tFlags |= 0x08;\n\t}\n\tif (a_Entity.IsRclking())\n\t{\n\t\tFlags |= 0x10;\n\t}\n\tif (a_Entity.IsInvisible())\n\t{\n\t\tFlags |= 0x20;\n\t}\n\ta_Pkt.WriteBEUInt8(ENTITY_FLAGS);  // Index\n\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);  // Type\n\ta_Pkt.WriteBEInt8(Flags);\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase cEntity::etPlayer:\n\t\t{\n\t\t\tauto & Player = static_cast<const cPlayer &>(a_Entity);\n\n\t\t\t// TODO Set player custom name to their name.\n\t\t\t// Then it's possible to move the custom name of mobs to the entities\n\t\t\t// and to remove the \"special\" player custom name.\n\t\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_STRING);\n\t\t\ta_Pkt.WriteString(Player.GetName());\n\n\t\t\ta_Pkt.WriteBEUInt8(LIVING_HEALTH);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Player.GetHealth()));\n\n\t\t\ta_Pkt.WriteBEUInt8(PLAYER_DISPLAYED_SKIN_PARTS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Player.GetSkinParts()));\n\n\t\t\ta_Pkt.WriteBEUInt8(PLAYER_MAIN_HAND);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(Player.IsLeftHanded() ? 0 : 1);\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etPickup:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_ITEM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\tWriteItem(a_Pkt, static_cast<const cPickup &>(a_Entity).GetItem());\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etMinecart:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_POWER);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\n\t\t\t// The following expression makes Minecarts shake more with less health or higher damage taken\n\t\t\tauto & Minecart = static_cast<const cMinecart &>(a_Entity);\n\t\t\tauto maxHealth = a_Entity.GetMaxHealth();\n\t\t\tauto curHealth = a_Entity.GetHealth();\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>((maxHealth - curHealth) * Minecart.LastDamage() * 4));\n\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_DIRECTION);  // (doesn't seem to effect anything)\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(1);\n\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_MULTIPLIER);  // or damage taken\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Minecart.LastDamage() + 10));\n\n\t\t\tif (Minecart.GetPayload() == cMinecart::mpNone)\n\t\t\t{\n\t\t\t\tauto & RideableMinecart = static_cast<const cRideableMinecart &>(Minecart);\n\t\t\t\tconst cItem & MinecartContent = RideableMinecart.GetContent();\n\t\t\t\tif (!MinecartContent.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_BLOCK_ID_META);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t\t\tint Content = MinecartContent.m_ItemType;\n\t\t\t\t\tContent |= MinecartContent.m_ItemDamage << 8;\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Content));\n\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_BLOCK_Y);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(RideableMinecart.GetBlockHeight()));\n\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHOW_BLOCK);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\t\t\ta_Pkt.WriteBool(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Minecart.GetPayload() == cMinecart::mpFurnace)\n\t\t\t{\n\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_FURNACE_POWERED);\n\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\t\ta_Pkt.WriteBool(static_cast<const cMinecartWithFurnace &>(Minecart).IsFueled());\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etMinecart\n\n\t\tcase cEntity::etProjectile:\n\t\t{\n\t\t\tauto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase cProjectileEntity::pkArrow:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(ARROW_CRITICAL);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\t\t\ta_Pkt.WriteBEInt8(static_cast<const cArrowEntity &>(Projectile).IsCritical() ? 1 : 0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkFirework:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(FIREWORK_INFO);  // Firework item used for this firework\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cFireworkEntity &>(Projectile).GetItem());\n\n\t\t\t\t\t// FIREWORK_BOOSTED_ENTITY_ID, in 1.11.1 only\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkSplashPotion:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(POTION_THROWN);  // Potion item which was thrown\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cSplashPotionEntity &>(Projectile).GetItem());\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etProjectile\n\n\t\tcase cEntity::etMonster:\n\t\t{\n\t\t\tWriteMobMetadata(a_Pkt, static_cast<const cMonster &>(a_Entity));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntity::etBoat:\n\t\t{\n\t\t\tauto & Boat = static_cast<const cBoat &>(a_Entity);\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_LAST_HIT_TIME);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetLastDamage()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_FORWARD_DIRECTION);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetForwardDirection()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_DAMAGE_TAKEN);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(Boat.GetDamageTaken());\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_TYPE);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetMaterial()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_RIGHT_PADDLE_TURNING);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Boat.IsRightPaddleUsed());\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_LEFT_PADDLE_TURNING);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Boat.IsLeftPaddleUsed());\n\n\t\t\tbreak;\n\t\t}  // case etBoat\n\n\t\tcase cEntity::etItemFrame:\n\t\t{\n\t\t\tauto & Frame = static_cast<const cItemFrame &>(a_Entity);\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_FRAME_ITEM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\tWriteItem(a_Pkt, Frame.GetItem());\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_FRAME_ROTATION);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Frame.GetItemRotation());\n\t\t\tbreak;\n\t\t}  // case etItemFrame\n\n\t\tcase cEntity::etEnderCrystal:\n\t\t{\n\t\t\tconst auto & EnderCrystal = static_cast<const cEnderCrystal &>(a_Entity);\n\t\t\tif (EnderCrystal.DisplaysBeam())\n\t\t\t{\n\t\t\t\ta_Pkt.WriteBEUInt8(ENDER_CRYSTAL_BEAM_TARGET);\n\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_OPTIONAL_POSITION);\n\t\t\t\ta_Pkt.WriteBool(true);  // Dont do a second check if it should display the beam\n\t\t\t\ta_Pkt.WriteXYZPosition64(EnderCrystal.GetBeamTarget());\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(ENDER_CRYSTAL_SHOW_BOTTOM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(EnderCrystal.ShowsBottom());\n\t\t\tbreak;\n\t\t}  // case etEnderCrystal\n\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_11_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const\n{\n\tusing namespace Metadata_1_11;\n\n\t// Living entity Metadata\n\tif (a_Mob.HasCustomName())\n\t{\n\t\t// TODO: As of 1.9 _all_ entities can have custom names; should this be moved up?\n\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME);\n\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_STRING);\n\t\ta_Pkt.WriteString(a_Mob.GetCustomName());\n\n\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME_VISIBLE);  // Custom name always visible\n\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\ta_Pkt.WriteBool(a_Mob.IsCustomNameAlwaysVisible());\n\t}\n\n\ta_Pkt.WriteBEUInt8(LIVING_HEALTH);\n\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\n\tswitch (a_Mob.GetMobType())\n\t{\n\t\tcase mtBat:\n\t\t{\n\t\t\tauto & Bat = static_cast<const cBat &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(BAT_HANGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(Bat.IsHanging() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtBat\n\n\t\tcase mtChicken:\n\t\t{\n\t\t\tauto & Chicken = static_cast<const cChicken &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Chicken.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtChicken\n\n\t\tcase mtCow:\n\t\t{\n\t\t\tauto & Cow = static_cast<const cCow &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Cow.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtCow\n\n\t\tcase mtCreeper:\n\t\t{\n\t\t\tauto & Creeper = static_cast<const cCreeper &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_STATE);  // (idle or \"blowing\")\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Creeper.IsBlowing() ? 1 : static_cast<UInt32>(-1));\n\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_POWERED);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Creeper.IsCharged());\n\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_IGNITED);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Creeper.IsBurnedWithFlintAndSteel());\n\t\t\tbreak;\n\t\t}  // case mtCreeper\n\n\t\tcase mtEnderman:\n\t\t{\n\t\t\tauto & Enderman = static_cast<const cEnderman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ENDERMAN_CARRIED_BLOCK);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BLOCKID);\n\t\t\tUInt32 Carried = 0;\n\t\t\tCarried |= static_cast<UInt32>(Enderman.GetCarriedBlock() << 4);\n\t\t\tCarried |= Enderman.GetCarriedMeta();\n\t\t\ta_Pkt.WriteVarInt32(Carried);\n\n\t\t\ta_Pkt.WriteBEUInt8(ENDERMAN_SCREAMING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Enderman.IsScreaming());\n\t\t\tbreak;\n\t\t}  // case mtEnderman\n\n\t\tcase mtGhast:\n\t\t{\n\t\t\tauto & Ghast = static_cast<const cGhast &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(GHAST_ATTACKING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Ghast.IsCharging());\n\t\t\tbreak;\n\t\t}  // case mtGhast\n\n\t\tcase mtHorse:\n\t\t{\n\t\t\t// XXX This behaves incorrectly with different variants; horses have different entity IDs now\n\n\t\t\t// Abstract horse\n\t\t\tauto & Horse = static_cast<const cHorse &>(a_Mob);\n\t\t\tInt8 Flags = 0;\n\t\t\tif (Horse.IsTame())\n\t\t\t{\n\t\t\t\tFlags |= 0x02;\n\t\t\t}\n\t\t\tif (Horse.IsSaddled())\n\t\t\t{\n\t\t\t\tFlags |= 0x04;\n\t\t\t}\n\t\t\tif (Horse.IsChested())\n\t\t\t{\n\t\t\t\tFlags |= 0x08;\n\t\t\t}\n\t\t\tif (Horse.IsEating())\n\t\t\t{\n\t\t\t\tFlags |= 0x20;\n\t\t\t}\n\t\t\tif (Horse.IsRearing())\n\t\t\t{\n\t\t\t\tFlags |= 0x40;\n\t\t\t}\n\t\t\tif (Horse.IsMthOpen())\n\t\t\t{\n\t\t\t\tFlags |= 0x80;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(ABSTRACT_HORSE_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(Flags);\n\n\t\t\t// This doesn't exist any more; it'll cause horses to all be the normal type\n\t\t\t// a_Pkt.WriteBEUInt8(HORSE_TYPE);\n\t\t\t// a_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t// a_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseType()));\n\n\t\t\t// Regular horses\n\t\t\ta_Pkt.WriteBEUInt8(HORSE_VARIANT);  // Color / style\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\tint Appearance = 0;\n\t\t\tAppearance = Horse.GetHorseColor();\n\t\t\tAppearance |= Horse.GetHorseStyle() << 8;\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Appearance));\n\n\t\t\ta_Pkt.WriteBEUInt8(HORSE_ARMOR);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseArmour()));\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Horse.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtHorse\n\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\tauto & MagmaCube = static_cast<const cMagmaCube &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(SLIME_SIZE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(MagmaCube.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtMagmaCube\n\n\t\tcase mtOcelot:\n\t\t{\n\t\t\t// Todo: move unnecessary to cat\n\t\t\tauto & Ocelot = static_cast<const cOcelot &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Ocelot.IsBaby());\n\n\t\t\tInt8 OcelotStatus = 0;\n\t\t\tif (Ocelot.IsSitting())\n\t\t\t{\n\t\t\t\tOcelotStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Ocelot.IsTame())\n\t\t\t{\n\t\t\t\tOcelotStatus |= 0x4;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(TAMEABLE_ANIMAL_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(OcelotStatus);\n\n\t\t\ta_Pkt.WriteBEUInt8(OCELOT_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Ocelot.GetOcelotType()));\n\n\t\t\tbreak;\n\t\t}  // case mtOcelot\n\n\t\tcase mtPig:\n\t\t{\n\t\t\tauto & Pig = static_cast<const cPig &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Pig.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(PIG_HAS_SADDLE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Pig.IsSaddled());\n\n\t\t\t// PIG_TOTAL_CARROT_ON_A_STICK_BOOST in 1.11.1 only\n\t\t\tbreak;\n\t\t}  // case mtPig\n\n\t\tcase mtRabbit:\n\t\t{\n\t\t\tauto & Rabbit = static_cast<const cRabbit &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Rabbit.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(RABBIT_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Rabbit.GetRabbitType()));\n\t\t\tbreak;\n\t\t}  // case mtRabbit\n\n\t\tcase mtSheep:\n\t\t{\n\t\t\tauto & Sheep = static_cast<const cSheep &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Sheep.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(SHEEP_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\tInt8 SheepMetadata = 0;\n\t\t\tSheepMetadata = static_cast<Int8>(Sheep.GetFurColor());\n\t\t\tif (Sheep.IsSheared())\n\t\t\t{\n\t\t\t\tSheepMetadata |= 0x10;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEInt8(SheepMetadata);\n\t\t\tbreak;\n\t\t}  // case mtSheep\n\n\t\tcase mtSkeleton:\n\t\t{\n\t\t\tauto & Skeleton = static_cast<const cSkeleton &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(LIVING_ACTIVE_HAND);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);\n\n\t\t\ta_Pkt.WriteBEUInt8(ABSTRACT_SKELETON_ARMS_SWINGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Skeleton.IsChargingBow());\n\t\t\tbreak;\n\t\t}  // case mtSkeleton\n\n\t\tcase mtSlime:\n\t\t{\n\t\t\tauto & Slime = static_cast<const cSlime &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(SLIME_SIZE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Slime.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtSlime\n\n\t\tcase mtVillager:\n\t\t{\n\t\t\tauto & Villager = static_cast<const cVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Villager.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(VILLAGER_PROFESSION);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Villager.GetVilType()));\n\t\t\tbreak;\n\t\t}  // case mtVillager\n\n\t\tcase mtWitch:\n\t\t{\n\t\t\tauto & Witch = static_cast<const cWitch &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(WITCH_AGGRESIVE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Witch.IsAngry());\n\t\t\tbreak;\n\t\t}  // case mtWitch\n\n\t\tcase mtWither:\n\t\t{\n\t\t\tauto & Wither = static_cast<const cWither &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(WITHER_INVULNERABLE_TIMER);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Wither.GetWitherInvulnerableTicks());\n\n\t\t\t// TODO: Use boss bar packet for health\n\t\t\tbreak;\n\t\t}  // case mtWither\n\n\t\tcase mtWolf:\n\t\t{\n\t\t\tauto & Wolf = static_cast<const cWolf &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBaby());\n\n\t\t\tInt8 WolfStatus = 0;\n\t\t\tif (Wolf.IsSitting())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Wolf.IsAngry())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x2;\n\t\t\t}\n\t\t\tif (Wolf.IsTame())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x4;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(TAMEABLE_ANIMAL_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(WolfStatus);\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_DAMAGE_TAKEN);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));  // TODO Not use the current health\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_BEGGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBegging());\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_COLLAR_COLOR);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Wolf.GetCollarColor()));\n\t\t\tbreak;\n\t\t}  // case mtWolf\n\n\t\tcase mtZombie:\n\t\t{\n\t\t\t// XXX Zombies were also split into new subclasses; this doesn't handle that.\n\t\t\tauto & Zombie = static_cast<const cZombie &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_IS_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Zombie.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombie\n\n\t\tcase mtZombiePigman:\n\t\t{\n\t\t\tauto & ZombiePigman = static_cast<const cZombiePigman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombiePigman.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombiePigman\n\n\t\tcase mtZombieVillager:\n\t\t{\n\t\t\tauto & ZombieVillager = reinterpret_cast<const cZombieVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_IS_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombieVillager.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_VILLAGER_CONVERTING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(ZombieVillager.ConversionTime()));\n\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_VILLAGER_PROFESSION);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(ZombieVillager.GetProfession()));\n\t\t\tbreak;\n\t\t}  // case mtZombieVillager\n\n\t\tcase mtBlaze:\n\t\tcase mtElderGuardian:\n\t\tcase mtGuardian:\n\t\tcase mtSnowGolem:\n\t\t{\n\t\t\t// TODO: Mobs with extra fields that aren't implemented\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCat:\n\n\t\tcase mtDonkey:\n\t\tcase mtMule:\n\n\t\tcase mtEvoker:\n\n\t\tcase mtLlama:\n\n\t\tcase mtPolarBear:\n\n\t\tcase mtShulker:\n\n\t\tcase mtSkeletonHorse:\n\t\tcase mtZombieHorse:\n\n\t\tcase mtVex:\n\n\t\tcase mtVindicator:\n\t\t{\n\t\t\t// Todo: Mobs not added yet. Grouped ones have the same metadata\n\t\t\tASSERT(!\"cProtocol_1_11::WriteMobMetadata: received unimplemented type\");\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCaveSpider:\n\t\tcase mtEnderDragon:\n\t\tcase mtEndermite:\n\t\tcase mtGiant:\n\t\tcase mtIronGolem:\n\t\tcase mtMooshroom:\n\t\tcase mtSilverfish:\n\t\tcase mtStray:\n\t\tcase mtSpider:\n\t\tcase mtSquid:\n\t\tcase mtWitherSkeleton:\n\t\t{\n\t\t\t// Mobs without additional metadata\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: UNREACHABLE(\"cProtocol_1_11::WriteMobMetadata: received mob of invalid type\");\n\t}  // switch (a_Mob.GetType())\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_11_1:\n\ncProtocol::Version cProtocol_1_11_1::GetProtocolVersion() const\n{\n\treturn Version::v1_11_1;\n}\n"
  },
  {
    "path": "src/Protocol/Protocol_1_11.h",
    "content": "\n// Protocol_1_11.h\n\n/*\nDeclares the 1.11 protocol classes:\n\t- cProtocol_1_11_0\n\t\t- release 1.11 protocol (#315)\n\t- cProtocol_1_11_1\n\t\t- release 1.11.1 protocol (#316)\n*/\n\n\n\n\n\n#pragma once\n\n#include \"Protocol_1_10.h\"\n\n\n\n\n\nclass cProtocol_1_11_0:\n\tpublic cProtocol_1_10_0\n{\n\tusing Super = cProtocol_1_10_0;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual void SendCollectEntity    (const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count) override;\n\tvirtual void SendEntityAnimation  (const cEntity & a_Entity, EntityAnimation a_Animation) override;\n\tvirtual void SendHideTitle        (void) override;\n\tvirtual void SendResetTitle       (void) override;\n\tvirtual void SendSpawnMob         (const cMonster & a_Mob) override;\n\tvirtual void SendTitleTimes       (int a_FadeInTicks, int a_DisplayTicks, int a_FadeOutTicks) override;\n\tvirtual void SendUpdateBlockEntity(cBlockEntity & a_BlockEntity) override;\n\n\tvirtual signed char GetProtocolEntityStatus(EntityAnimation a_Animation) const override;\n\tvirtual UInt32 GetProtocolMobType(eMonsterType a_MobType) const override;\n\tvirtual Version GetProtocolVersion() const override;\n\n\tvirtual void HandlePacketBlockPlace(cByteBuffer & a_ByteBuffer) override;\n\n\tvirtual void WriteBlockEntity(cFastNBTWriter & a_Writer, const cBlockEntity & a_BlockEntity) const override;\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const override;\n\tvirtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const override;\n};\n\n\n\n\n\nclass cProtocol_1_11_1:\n\tpublic cProtocol_1_11_0\n{\n\tusing Super = cProtocol_1_11_0;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual Version GetProtocolVersion() const override;\n};\n"
  },
  {
    "path": "src/Protocol/Protocol_1_12.cpp",
    "content": "\n// Protocol_1_12.cpp\n\n/*\nImplements the 1.12 protocol classes:\n- release 1.12 protocol (#335)\n- release 1.12.1 protocol (#338)\n- release 1.12.2 protocol (#340)\n*/\n\n#include \"Globals.h\"\n#include \"Protocol_1_12.h\"\n#include \"Packetizer.h\"\n\n#include \"../Entities/Boat.h\"\n#include \"../Entities/EnderCrystal.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/FireworkEntity.h\"\n#include \"../Entities/SplashPotionEntity.h\"\n\n#include \"../Mobs/IncludeAllMonsters.h\"\n\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../ClientHandle.h\"\n#include \"../CraftingRecipes.h\"\n#include \"../Bindings/PluginManager.h\"\n#include \"../JsonUtils.h\"\n\n\n\n\n\n// The disabled error is intended, since the Metadata have overlapping indexes\n// based on the type of the Entity.\n//\n// IMPORTANT: The enum is used to automate the sequential counting of the\n// Metadata indexes. Adding a new enum value causes the following values to\n// increase their index. Therefore the ordering of the enum values is VERY important!\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wduplicate-enum\"\n#endif\n\nnamespace Metadata_1_12\n{\n\tenum MetadataIndex\n\t{\n\t\t// Entity\n\t\tENTITY_FLAGS,\n\t\tENTITY_AIR,\n\t\tENTITY_CUSTOM_NAME,\n\t\tENTITY_CUSTOM_NAME_VISIBLE,\n\t\tENTITY_SILENT,\n\t\tENTITY_NO_GRAVITY,\n\t\t_ENTITY_NEXT,  // Used by descendants\n\n\t\t// Potion\n\t\tPOTION_THROWN = _ENTITY_NEXT,\n\n\t\t// FallingBlock\n\t\tFALLING_BLOCK_POSITION = _ENTITY_NEXT,\n\n\t\t// AreaEffectCloud\n\t\tAREA_EFFECT_CLOUD_RADIUS = _ENTITY_NEXT,\n\t\tAREA_EFFECT_CLOUD_COLOR,\n\t\tAREA_EFFECT_CLOUD_SINGLE_POINT_EFFECT,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_ID,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_PARAMETER1,\n\t\tAREA_EFFECT_CLOUD_PARTICLE_PARAMETER2,\n\n\t\t// Arrow\n\t\tARROW_CRITICAL = _ENTITY_NEXT,\n\t\t_ARROW_NEXT,\n\n\t\t// TippedArrow\n\t\tTIPPED_ARROW_COLOR = _ARROW_NEXT,\n\n\t\t// Boat\n\t\tBOAT_LAST_HIT_TIME = _ENTITY_NEXT,\n\t\tBOAT_FORWARD_DIRECTION,\n\t\tBOAT_DAMAGE_TAKEN,\n\t\tBOAT_TYPE,\n\t\tBOAT_RIGHT_PADDLE_TURNING,\n\t\tBOAT_LEFT_PADDLE_TURNING,\n\n\t\t// EnderCrystal\n\t\tENDER_CRYSTAL_BEAM_TARGET = _ENTITY_NEXT,\n\t\tENDER_CRYSTAL_SHOW_BOTTOM,\n\n\t\t// Fireball\n\t\t_FIREBALL_NEXT = _ENTITY_NEXT,\n\n\t\t// WitherSkull\n\t\tWITHER_SKULL_INVULNERABLE = _FIREBALL_NEXT,\n\n\t\t// Fireworks\n\t\tFIREWORK_INFO = _ENTITY_NEXT,\n\t\tFIREWORK_BOOSTED_ENTITY_ID,  // 1.11.1 only\n\n\t\t// Hanging\n\t\t_HANGING_NEXT = _ENTITY_NEXT,\n\n\t\t// ItemFrame\n\t\tITEM_FRAME_ITEM = _HANGING_NEXT,\n\t\tITEM_FRAME_ROTATION,\n\n\t\t// Item\n\t\tITEM_ITEM = _ENTITY_NEXT,\n\n\t\t// Living\n\t\tLIVING_ACTIVE_HAND = _ENTITY_NEXT,\n\t\tLIVING_HEALTH,\n\t\tLIVING_POTION_EFFECT_COLOR,\n\t\tLIVING_POTION_EFFECT_AMBIENT,\n\t\tLIVING_NUMBER_OF_ARROWS,\n\t\t_LIVING_NEXT,\n\n\t\t// Player\n\t\tPLAYER_ADDITIONAL_HEARTHS = _LIVING_NEXT,\n\t\tPLAYER_SCORE,\n\t\tPLAYER_DISPLAYED_SKIN_PARTS,\n\t\tPLAYER_MAIN_HAND,\n\n\t\t// ArmorStand\n\t\tARMOR_STAND_STATUS = _LIVING_NEXT,\n\t\tARMOR_STAND_HEAD_ROTATION,\n\t\tARMOR_STAND_BODY_ROTATION,\n\t\tARMOR_STAND_LEFT_ARM_ROTATION,\n\t\tARMOR_STAND_RIGHT_ARM_ROTATION,\n\t\tARMOR_STAND_LEFT_LEG_ROTATION,\n\t\tARMOR_STAND_RIGHT_LEG_ROTATION,\n\n\t\t// Insentient\n\t\tINSENTIENT_STATUS = _LIVING_NEXT,\n\t\t_INSENTIENT_NEXT,\n\n\t\t// Ambient\n\t\t_AMBIENT_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Bat\n\t\tBAT_HANGING = _AMBIENT_NEXT,\n\n\t\t// Creature\n\t\t_CREATURE_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Ageable\n\t\tAGEABLE_BABY = _CREATURE_NEXT,\n\t\t_AGEABLE_NEXT,\n\n\t\t// PolarBear\n\t\tPOLAR_BEAR_STANDING = _AGEABLE_NEXT,\n\n\t\t// Animal\n\t\t_ANIMAL_NEXT = _AGEABLE_NEXT,\n\n\t\t// Abstract horse\n\t\tABSTRACT_HORSE_STATUS = _ANIMAL_NEXT,\n\t\tABSTRACT_HORSE_OWNER,\n\t\t_ABSTRACT_HORSE_NEXT,\n\n\t\t// Horse\n\t\tHORSE_VARIANT = _ABSTRACT_HORSE_NEXT,\n\t\tHORSE_ARMOR,\n\n\t\t// Chested horse\n\t\tCHESTED_HORSE_CHESTED = _ABSTRACT_HORSE_NEXT,\n\t\t_CHESTED_HORSE_NEXT,\n\n\t\t// Llama\n\t\tLLAMA_STRENGTH = _CHESTED_HORSE_NEXT,\n\t\tLLAMA_CARPET_COLOR,\n\t\tLLAMA_VARIANT,\n\n\t\t// Pig\n\t\tPIG_HAS_SADDLE = _ANIMAL_NEXT,\n\t\tPIG_TOTAL_CARROT_ON_A_STICK_BOOST,  // 1.11.1 only\n\n\t\t// Rabbit\n\t\tRABBIT_TYPE = _ANIMAL_NEXT,\n\n\t\t// Sheep\n\t\tSHEEP_STATUS = _ANIMAL_NEXT,\n\n\t\t// TameableAnimal\n\t\tTAMEABLE_ANIMAL_STATUS = _ANIMAL_NEXT,\n\t\tTAMEABLE_ANIMAL_OWNER,\n\t\t_TAMEABLE_NEXT,\n\n\t\t// Ocelot\n\t\tOCELOT_TYPE = _TAMEABLE_NEXT,\n\n\t\t// Wolf\n\t\tWOLF_DAMAGE_TAKEN = _TAMEABLE_NEXT,\n\t\tWOLF_BEGGING,\n\t\tWOLF_COLLAR_COLOR,\n\n\t\t// Villager\n\t\tVILLAGER_PROFESSION = _AGEABLE_NEXT,\n\n\t\t// Golem\n\t\t_GOLEM_NEXT = _CREATURE_NEXT,\n\n\t\t// IronGolem\n\t\tIRON_GOLEM_PLAYER_CREATED = _GOLEM_NEXT,\n\n\t\t// Shulker\n\t\tSHULKER_FACING_DIRECTION = _GOLEM_NEXT,\n\t\tSHULKER_ATTACHMENT_FALLING_BLOCK_POSITION,\n\t\tSHULKER_SHIELD_HEIGHT,\n\n\t\t// Monster\n\t\t_MONSTER_NEXT = _CREATURE_NEXT,\n\n\t\t// Blaze\n\t\tBLAZE_ON_FIRE = _MONSTER_NEXT,\n\n\t\t// Creeper\n\t\tCREEPER_STATE = _MONSTER_NEXT,\n\t\tCREEPER_POWERED,\n\t\tCREEPER_IGNITED,\n\n\t\t// Guardian\n\t\tGUARDIAN_STATUS = _MONSTER_NEXT,\n\t\tGUARDIAN_TARGET,\n\n\t\t// Abstract Skeleton\n\t\tABSTRACT_SKELETON_ARMS_SWINGING = _MONSTER_NEXT,\n\n\t\t// Spider\n\t\tSPIDER_CLIMBING = _MONSTER_NEXT,\n\n\t\t// Witch\n\t\tWITCH_AGGRESIVE = _MONSTER_NEXT,\n\n\t\t// Wither\n\t\tWITHER_FIRST_HEAD_TARGET = _MONSTER_NEXT,\n\t\tWITHER_SECOND_HEAD_TARGET,\n\t\tWITHER_THIRD_HEAD_TARGET,\n\t\tWITHER_INVULNERABLE_TIMER,\n\n\t\t// Zombie\n\t\tZOMBIE_IS_BABY = _MONSTER_NEXT,\n\t\tZOMBIE_UNUSED,  // Was type\n\t\tZOMBIE_HANDS_RISED_UP,\n\t\t_ZOMBIE_NEXT,\n\n\t\t// Zombie villager\n\t\tZOMBIE_VILLAGER_CONVERTING = _ZOMBIE_NEXT,\n\t\tZOMBIE_VILLAGER_PROFESSION,\n\n\t\t// Enderman\n\t\tENDERMAN_CARRIED_BLOCK = _MONSTER_NEXT,\n\t\tENDERMAN_SCREAMING,\n\n\t\t// Evocation illager\n\t\tEVOKER_SPELL = _MONSTER_NEXT,\n\n\t\t// Vex\n\t\tVEX_FLAGS = _MONSTER_NEXT,\n\n\t\t// Vindication illager\n\t\tVINDICATOR_FLAGS = _MONSTER_NEXT,\n\n\t\t// EnderDragon\n\t\tENDER_DRAGON_DRAGON_PHASE = _INSENTIENT_NEXT,\n\n\t\t// Flying\n\t\t_FLYING_NEXT = _INSENTIENT_NEXT,\n\n\t\t// Ghast\n\t\tGHAST_ATTACKING = _FLYING_NEXT,\n\n\t\t// Slime\n\t\tSLIME_SIZE = _INSENTIENT_NEXT,\n\n\t\t// Minecart\n\t\tMINECART_SHAKING_POWER = _ENTITY_NEXT,\n\t\tMINECART_SHAKING_DIRECTION,\n\t\tMINECART_SHAKING_MULTIPLIER,\n\t\tMINECART_BLOCK_ID_META,\n\t\tMINECART_BLOCK_Y,\n\t\tMINECART_SHOW_BLOCK,\n\t\t_MINECART_NEXT,\n\n\t\t// MinecartCommandBlock\n\t\tMINECART_COMMAND_BLOCK_COMMAND = _MINECART_NEXT,\n\t\tMINECART_COMMAND_BLOCK_LAST_OUTPUT,\n\n\t\t// MinecartFurnace\n\t\tMINECART_FURNACE_POWERED = _MINECART_NEXT,\n\n\t\t// TNTPrimed\n\t\tTNT_PRIMED_FUSE_TIME = _ENTITY_NEXT,\n\t};\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop  // Restore ignored clang errors\n#endif\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_12:\n\nvoid cProtocol_1_12::WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const\n{\n\tusing namespace Metadata_1_12;\n\n\t// Common metadata:\n\tInt8 Flags = 0;\n\tif (a_Entity.IsOnFire())\n\t{\n\t\tFlags |= 0x01;\n\t}\n\tif (a_Entity.IsCrouched())\n\t{\n\t\tFlags |= 0x02;\n\t}\n\tif (a_Entity.IsSprinting())\n\t{\n\t\tFlags |= 0x08;\n\t}\n\tif (a_Entity.IsRclking())\n\t{\n\t\tFlags |= 0x10;\n\t}\n\tif (a_Entity.IsInvisible())\n\t{\n\t\tFlags |= 0x20;\n\t}\n\tif (a_Entity.IsElytraFlying())\n\t{\n\t\tFlags |= 0x80;\n\t}\n\ta_Pkt.WriteBEUInt8(ENTITY_FLAGS);  // Index\n\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);  // Type\n\ta_Pkt.WriteBEInt8(Flags);\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase cEntity::etPlayer:\n\t\t{\n\t\t\tauto & Player = static_cast<const cPlayer &>(a_Entity);\n\n\t\t\t// TODO Set player custom name to their name.\n\t\t\t// Then it's possible to move the custom name of mobs to the entities\n\t\t\t// and to remove the \"special\" player custom name.\n\t\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_STRING);\n\t\t\ta_Pkt.WriteString(Player.GetName());\n\n\t\t\ta_Pkt.WriteBEUInt8(LIVING_HEALTH);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Player.GetHealth()));\n\n\t\t\ta_Pkt.WriteBEUInt8(PLAYER_DISPLAYED_SKIN_PARTS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Player.GetSkinParts()));\n\n\t\t\ta_Pkt.WriteBEUInt8(PLAYER_MAIN_HAND);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(Player.IsLeftHanded() ? 0 : 1);\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etPickup:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_ITEM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\tWriteItem(a_Pkt, static_cast<const cPickup &>(a_Entity).GetItem());\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etMinecart:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_POWER);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\n\t\t\t// The following expression makes Minecarts shake more with less health or higher damage taken\n\t\t\tauto & Minecart = static_cast<const cMinecart &>(a_Entity);\n\t\t\tauto maxHealth = a_Entity.GetMaxHealth();\n\t\t\tauto curHealth = a_Entity.GetHealth();\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>((maxHealth - curHealth) * Minecart.LastDamage() * 4));\n\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_DIRECTION);  // (doesn't seem to effect anything)\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(1);\n\n\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHAKING_MULTIPLIER);  // or damage taken\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Minecart.LastDamage() + 10));\n\n\t\t\tif (Minecart.GetPayload() == cMinecart::mpNone)\n\t\t\t{\n\t\t\t\tauto & RideableMinecart = static_cast<const cRideableMinecart &>(Minecart);\n\t\t\t\tconst cItem & MinecartContent = RideableMinecart.GetContent();\n\t\t\t\tif (!MinecartContent.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_BLOCK_ID_META);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t\t\tint Content = MinecartContent.m_ItemType;\n\t\t\t\t\tContent |= MinecartContent.m_ItemDamage << 8;\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Content));\n\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_BLOCK_Y);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(RideableMinecart.GetBlockHeight()));\n\n\t\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_SHOW_BLOCK);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\t\t\ta_Pkt.WriteBool(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Minecart.GetPayload() == cMinecart::mpFurnace)\n\t\t\t{\n\t\t\t\ta_Pkt.WriteBEUInt8(MINECART_FURNACE_POWERED);\n\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\t\ta_Pkt.WriteBool(static_cast<const cMinecartWithFurnace &>(Minecart).IsFueled());\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etMinecart\n\n\t\tcase cEntity::etProjectile:\n\t\t{\n\t\t\tauto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase cProjectileEntity::pkArrow:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(ARROW_CRITICAL);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\t\t\ta_Pkt.WriteBEInt8(static_cast<const cArrowEntity &>(Projectile).IsCritical() ? 1 : 0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkFirework:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(FIREWORK_INFO);  // Firework item used for this firework\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cFireworkEntity &>(Projectile).GetItem());\n\n\t\t\t\t\t// FIREWORK_BOOSTED_ENTITY_ID, in 1.11.1 only\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkSplashPotion:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(POTION_THROWN);  // Potion item which was thrown\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cSplashPotionEntity &>(Projectile).GetItem());\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etProjectile\n\n\t\tcase cEntity::etMonster:\n\t\t{\n\t\t\tWriteMobMetadata(a_Pkt, static_cast<const cMonster &>(a_Entity));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntity::etBoat:\n\t\t{\n\t\t\tauto & Boat = static_cast<const cBoat &>(a_Entity);\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_LAST_HIT_TIME);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetLastDamage()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_FORWARD_DIRECTION);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetForwardDirection()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_DAMAGE_TAKEN);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(Boat.GetDamageTaken());\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_TYPE);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetMaterial()));\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_RIGHT_PADDLE_TURNING);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Boat.IsRightPaddleUsed());\n\n\t\t\ta_Pkt.WriteBEInt8(BOAT_LEFT_PADDLE_TURNING);\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Boat.IsLeftPaddleUsed());\n\n\t\t\tbreak;\n\t\t}  // case etBoat\n\n\t\tcase cEntity::etItemFrame:\n\t\t{\n\t\t\tauto & Frame = static_cast<const cItemFrame &>(a_Entity);\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_FRAME_ITEM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\tWriteItem(a_Pkt, Frame.GetItem());\n\t\t\ta_Pkt.WriteBEUInt8(ITEM_FRAME_ROTATION);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Frame.GetItemRotation());\n\t\t\tbreak;\n\t\t}  // case etItemFrame\n\n\t\tcase cEntity::etEnderCrystal:\n\t\t{\n\t\t\tconst auto & EnderCrystal = static_cast<const cEnderCrystal &>(a_Entity);\n\t\t\tif (EnderCrystal.DisplaysBeam())\n\t\t\t{\n\t\t\t\ta_Pkt.WriteBEUInt8(ENDER_CRYSTAL_BEAM_TARGET);\n\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_OPTIONAL_POSITION);\n\t\t\t\ta_Pkt.WriteBool(true);  // Dont do a second check if it should display the beam\n\t\t\t\ta_Pkt.WriteXYZPosition64(EnderCrystal.GetBeamTarget());\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(ENDER_CRYSTAL_SHOW_BOTTOM);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(EnderCrystal.ShowsBottom());\n\t\t\tbreak;\n\t\t}  // case etEnderCrystal\n\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_12::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const\n{\n\tusing namespace Metadata_1_12;\n\n\t// Living entity metadata\n\tif (a_Mob.HasCustomName())\n\t{\n\t\t// TODO: As of 1.9 _all_ entities can have custom names; should this be moved up?\n\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME);\n\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_STRING);\n\t\ta_Pkt.WriteString(a_Mob.GetCustomName());\n\n\t\ta_Pkt.WriteBEUInt8(ENTITY_CUSTOM_NAME_VISIBLE);  // Custom name always visible\n\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\ta_Pkt.WriteBool(a_Mob.IsCustomNameAlwaysVisible());\n\t}\n\n\ta_Pkt.WriteBEUInt8(LIVING_HEALTH);\n\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\n\tswitch (a_Mob.GetMobType())\n\t{\n\t\tcase mtBat:\n\t\t{\n\t\t\tauto & Bat = static_cast<const cBat &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(BAT_HANGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(Bat.IsHanging() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtBat\n\n\t\tcase mtChicken:\n\t\t{\n\t\t\tauto & Chicken = static_cast<const cChicken &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Chicken.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtChicken\n\n\t\tcase mtCow:\n\t\t{\n\t\t\tauto & Cow = static_cast<const cCow &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Cow.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtCow\n\n\t\tcase mtCreeper:\n\t\t{\n\t\t\tauto & Creeper = static_cast<const cCreeper &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_STATE);  // (idle or \"blowing\")\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Creeper.IsBlowing() ? 1 : static_cast<UInt32>(-1));\n\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_POWERED);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Creeper.IsCharged());\n\n\t\t\ta_Pkt.WriteBEUInt8(CREEPER_IGNITED);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Creeper.IsBurnedWithFlintAndSteel());\n\t\t\tbreak;\n\t\t}  // case mtCreeper\n\n\t\tcase mtEnderman:\n\t\t{\n\t\t\tauto & Enderman = static_cast<const cEnderman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ENDERMAN_CARRIED_BLOCK);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BLOCKID);\n\t\t\tUInt32 Carried = 0;\n\t\t\tCarried |= static_cast<UInt32>(Enderman.GetCarriedBlock() << 4);\n\t\t\tCarried |= Enderman.GetCarriedMeta();\n\t\t\ta_Pkt.WriteVarInt32(Carried);\n\n\t\t\ta_Pkt.WriteBEUInt8(ENDERMAN_SCREAMING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Enderman.IsScreaming());\n\t\t\tbreak;\n\t\t}  // case mtEnderman\n\n\t\tcase mtGhast:\n\t\t{\n\t\t\tauto & Ghast = static_cast<const cGhast &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(GHAST_ATTACKING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Ghast.IsCharging());\n\t\t\tbreak;\n\t\t}  // case mtGhast\n\n\t\tcase mtHorse:\n\t\t{\n\t\t\t// XXX This behaves incorrectly with different variants; horses have different entity IDs now\n\n\t\t\t// Abstract horse\n\t\t\tauto & Horse = static_cast<const cHorse &>(a_Mob);\n\t\t\tInt8 Flags = 0;\n\t\t\tif (Horse.IsTame())\n\t\t\t{\n\t\t\t\tFlags |= 0x02;\n\t\t\t}\n\t\t\tif (Horse.IsSaddled())\n\t\t\t{\n\t\t\t\tFlags |= 0x04;\n\t\t\t}\n\t\t\tif (Horse.IsChested())\n\t\t\t{\n\t\t\t\tFlags |= 0x08;\n\t\t\t}\n\t\t\tif (Horse.IsEating())\n\t\t\t{\n\t\t\t\tFlags |= 0x20;\n\t\t\t}\n\t\t\tif (Horse.IsRearing())\n\t\t\t{\n\t\t\t\tFlags |= 0x40;\n\t\t\t}\n\t\t\tif (Horse.IsMthOpen())\n\t\t\t{\n\t\t\t\tFlags |= 0x80;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(ABSTRACT_HORSE_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(Flags);\n\n\t\t\t// This doesn't exist any more; it'll cause horses to all be the normal type\n\t\t\t// a_Pkt.WriteBEUInt8(HORSE_TYPE);\n\t\t\t// a_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t// a_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseType()));\n\n\t\t\t// Regular horses\n\t\t\ta_Pkt.WriteBEUInt8(HORSE_VARIANT);  // Color / style\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\tint Appearance = 0;\n\t\t\tAppearance = Horse.GetHorseColor();\n\t\t\tAppearance |= Horse.GetHorseStyle() << 8;\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Appearance));\n\n\t\t\ta_Pkt.WriteBEUInt8(HORSE_ARMOR);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseArmour()));\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Horse.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtHorse\n\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\tauto & MagmaCube = static_cast<const cMagmaCube &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(SLIME_SIZE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(MagmaCube.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtMagmaCube\n\n\t\tcase mtOcelot:\n\t\t{\n\t\t\tauto & Ocelot = static_cast<const cOcelot &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Ocelot.IsBaby());\n\n\t\t\tInt8 OcelotStatus = 0;\n\t\t\tif (Ocelot.IsSitting())\n\t\t\t{\n\t\t\t\tOcelotStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Ocelot.IsTame())\n\t\t\t{\n\t\t\t\tOcelotStatus |= 0x4;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(TAMEABLE_ANIMAL_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(OcelotStatus);\n\n\t\t\ta_Pkt.WriteBEUInt8(OCELOT_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Ocelot.GetOcelotType()));\n\n\t\t\tbreak;\n\t\t}  // case mtOcelot\n\n\t\tcase mtPig:\n\t\t{\n\t\t\tauto & Pig = static_cast<const cPig &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Pig.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(PIG_HAS_SADDLE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Pig.IsSaddled());\n\n\t\t\t// PIG_TOTAL_CARROT_ON_A_STICK_BOOST in 1.11.1 only\n\t\t\tbreak;\n\t\t}  // case mtPig\n\n\t\tcase mtRabbit:\n\t\t{\n\t\t\tauto & Rabbit = static_cast<const cRabbit &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Rabbit.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(RABBIT_TYPE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Rabbit.GetRabbitType()));\n\t\t\tbreak;\n\t\t}  // case mtRabbit\n\n\t\tcase mtSheep:\n\t\t{\n\t\t\tauto & Sheep = static_cast<const cSheep &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Sheep.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(SHEEP_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\tInt8 SheepMetadata = 0;\n\t\t\tSheepMetadata = static_cast<Int8>(Sheep.GetFurColor());\n\t\t\tif (Sheep.IsSheared())\n\t\t\t{\n\t\t\t\tSheepMetadata |= 0x10;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEInt8(SheepMetadata);\n\t\t\tbreak;\n\t\t}  // case mtSheep\n\n\t\tcase mtSkeleton:\n\t\t{\n\t\t\tauto & Skeleton = static_cast<const cSkeleton &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(LIVING_ACTIVE_HAND);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);\n\n\t\t\ta_Pkt.WriteBEUInt8(ABSTRACT_SKELETON_ARMS_SWINGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Skeleton.IsChargingBow());\n\t\t\tbreak;\n\t\t}  // case mtSkeleton\n\n\t\tcase mtSlime:\n\t\t{\n\t\t\tauto & Slime = static_cast<const cSlime &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(SLIME_SIZE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Slime.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtSlime\n\n\t\tcase mtVillager:\n\t\t{\n\t\t\tauto & Villager = static_cast<const cVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Villager.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(VILLAGER_PROFESSION);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Villager.GetVilType()));\n\t\t\tbreak;\n\t\t}  // case mtVillager\n\n\t\tcase mtWitch:\n\t\t{\n\t\t\tauto & Witch = static_cast<const cWitch &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(WITCH_AGGRESIVE);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Witch.IsAngry());\n\t\t\tbreak;\n\t\t}  // case mtWitch\n\n\t\tcase mtWither:\n\t\t{\n\t\t\tauto & Wither = static_cast<const cWither &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(WITHER_INVULNERABLE_TIMER);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Wither.GetWitherInvulnerableTicks());\n\n\t\t\t// TODO: Use boss bar packet for health\n\t\t\tbreak;\n\t\t}  // case mtWither\n\n\t\tcase mtWolf:\n\t\t{\n\t\t\tauto & Wolf = static_cast<const cWolf &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBaby());\n\n\t\t\tInt8 WolfStatus = 0;\n\t\t\tif (Wolf.IsSitting())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Wolf.IsAngry())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x2;\n\t\t\t}\n\t\t\tif (Wolf.IsTame())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x4;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(TAMEABLE_ANIMAL_STATUS);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(WolfStatus);\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_DAMAGE_TAKEN);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));  // TODO Not use the current health\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_BEGGING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBegging());\n\n\t\t\ta_Pkt.WriteBEUInt8(WOLF_COLLAR_COLOR);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Wolf.GetCollarColor()));\n\t\t\tbreak;\n\t\t}  // case mtWolf\n\n\t\tcase mtZombie:\n\t\t{\n\t\t\t// XXX Zombies were also split into new subclasses; this doesn't handle that.\n\t\t\tauto & Zombie = static_cast<const cZombie &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_IS_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Zombie.IsBaby());\n\n\t\t\t// These don't exist\n\t\t\t// a_Pkt.WriteBEUInt8(ZOMBIE_TYPE);\n\t\t\t// a_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t// a_Pkt.WriteVarInt32(Zombie.IsVillagerZombie() ? 1 : 0);\n\n\t\t\tbreak;\n\t\t}  // case mtZombie\n\n\t\tcase mtZombiePigman:\n\t\t{\n\t\t\tauto & ZombiePigman = static_cast<const cZombiePigman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(AGEABLE_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombiePigman.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombiePigman\n\n\t\tcase mtZombieVillager:\n\t\t{\n\t\t\tauto & ZombieVillager = reinterpret_cast<const cZombieVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_IS_BABY);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombieVillager.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_VILLAGER_CONVERTING);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(ZombieVillager.ConversionTime()));\n\n\t\t\ta_Pkt.WriteBEUInt8(ZOMBIE_VILLAGER_PROFESSION);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(ZombieVillager.GetProfession()));\n\t\t\tbreak;\n\t\t}  // case mtZombieVillager\n\n\t\tcase mtBlaze:\n\t\tcase mtCaveSpider:\n\t\tcase mtElderGuardian:\n\t\tcase mtEnderDragon:\n\t\tcase mtGuardian:\n\t\tcase mtIronGolem:\n\t\tcase mtSnowGolem:\n\t\tcase mtSpider:\n\t\tcase mtWitherSkeleton:\n\t\t{\n\t\t\t// TODO: Mobs with extra fields that aren't implemented\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtMooshroom:\n\t\t{\n\t\t\t// Not mentioned on http://wiki.vg/Entities\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCat:\n\n\t\tcase mtDonkey:\n\t\tcase mtMule:\n\n\t\tcase mtEvoker:\n\n\t\tcase mtHusk:\n\n\t\tcase mtIllusioner:\n\n\t\tcase mtLlama:\n\n\t\tcase mtParrot:\n\n\t\tcase mtPolarBear:\n\n\t\tcase mtShulker:\n\n\t\tcase mtSkeletonHorse:\n\t\tcase mtZombieHorse:\n\n\t\tcase mtStray:\n\n\t\tcase mtVex:\n\n\t\tcase mtVindicator:\n\t\t{\n\t\t\t// Todo: Mobs not added yet. Grouped ones have the same metadata\n\t\t\tASSERT(!\"cProtocol_1_12::WriteMobMetadata: received unimplemented type\");\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtEndermite:\n\t\tcase mtGiant:\n\t\tcase mtSilverfish:\n\t\tcase mtSquid:\n\t\t{\n\t\t\t// Mobs with no extra fields\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: UNREACHABLE(\"cProtocol_1_12::WriteMobMetadata: received mob of invalid type\");\n\t}  // switch (a_Mob.GetType())\n}\n\n\n\n\n\nUInt32 cProtocol_1_12::GetPacketID(cProtocol::ePacketType a_Packet) const\n{\n\tswitch (a_Packet)\n\t{\n\t\tcase pktAttachEntity:        return 0x42;\n\t\tcase pktCameraSetTo:         return 0x38;\n\t\tcase pktCollectEntity:       return 0x4a;\n\t\tcase pktDestroyEntity:       return 0x31;\n\t\tcase pktDisplayObjective:    return 0x3a;\n\t\tcase pktEntityEffect:        return 0x4e;\n\t\tcase pktEntityEquipment:     return 0x3e;\n\t\tcase pktEntityHeadLook:      return 0x35;\n\t\tcase pktEntityLook:          return 0x28;\n\t\tcase pktEntityMeta:          return 0x3b;\n\t\tcase pktEntityProperties:    return 0x4d;\n\t\tcase pktEntityRelMove:       return 0x26;\n\t\tcase pktEntityRelMoveLook:   return 0x27;\n\t\tcase pktEntityVelocity:      return 0x3d;\n\t\tcase pktExperience:          return 0x3f;\n\t\tcase pktHeldItemChange:      return 0x39;\n\t\tcase pktLeashEntity:         return 0x3c;\n\t\tcase pktRemoveEntityEffect:  return 0x32;\n\t\tcase pktResourcePack:        return 0x33;\n\t\tcase pktRespawn:             return 0x34;\n\t\tcase pktScoreboardObjective: return 0x41;\n\t\tcase pktSpawnPosition:       return 0x45;\n\t\tcase pktTeleportEntity:      return 0x4b;\n\t\tcase pktTimeUpdate:          return 0x46;\n\t\tcase pktTitle:               return 0x47;\n\t\tcase pktUnlockRecipe:        return 0x30;\n\t\tcase pktUpdateBlockEntity:   return 0x09;\n\t\tcase pktUpdateHealth:        return 0x40;\n\t\tcase pktUpdateScore:         return 0x44;\n\n\t\tdefault: return Super::GetPacketID(a_Packet);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_12::HandleCraftRecipe(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8,  WindowID);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt,  UInt32, RecipeID);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,    bool,   MakeAll);\n\tauto CuberiteRecipeId = cRoot::Get()->GetRecipeMapper()->GetCuberiteRecipeId(RecipeID, m_Client->GetProtocolVersion());\n\tif (CuberiteRecipeId.has_value())\n\t{\n\t\tm_Client->HandleCraftRecipe(CuberiteRecipeId.value());\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_12::HandlePacketCraftingBookData(cByteBuffer & a_ByteBuffer)\n{\n\t// TODO not yet used, not sure if it is needed\n\t// https://wiki.vg/index.php?title=Protocol&oldid=14204#Crafting_Book_Data\n\ta_ByteBuffer.SkipRead(a_ByteBuffer.GetReadableSpace());\n}\n\n\n\n\n\nvoid cProtocol_1_12::HandlePacketAdvancementTab(cByteBuffer & a_ByteBuffer)\n{\n\ta_ByteBuffer.SkipRead(a_ByteBuffer.GetReadableSpace());\n\tm_Client->GetPlayer()->SendMessageInfo(\"The new advancements are not implemented.\");\n}\n\n\n\n\n\nsigned char cProtocol_1_12::GetProtocolEntityStatus(EntityAnimation a_Animation) const\n{\n\tswitch (a_Animation)\n\t{\n\t\tcase EntityAnimation::PawnBurns: return 37;\n\t\tcase EntityAnimation::PawnDrowns: return 36;\n\t\tdefault: return Super::GetProtocolEntityStatus(a_Animation);\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_12::GetProtocolMobType(const eMonsterType a_MobType) const\n{\n\tswitch (a_MobType)\n\t{\n\t\tcase mtIllusioner: return 37;\n\t\tcase mtParrot:     return 105;\n\t\tdefault:           return Super::GetProtocolMobType(a_MobType);\n\t}\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_12::GetProtocolVersion() const\n{\n\treturn Version::v1_12;\n}\n\n\n\n\n\nbool cProtocol_1_12::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType)\n{\n\tswitch (m_State)\n\t{\n\t\tcase State::Status:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketStatusRequest(a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketStatusPing(a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase State::Login:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketLoginStart(a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketLoginEncryptionResponse(a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase State::Game:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandleConfirmTeleport(a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: break;  // Prepare Crafting Grid, not yet implemented\n\t\t\t\tcase 0x02: HandlePacketTabComplete(a_ByteBuffer); return true;\n\t\t\t\tcase 0x03: HandlePacketChatMessage(a_ByteBuffer); return true;\n\t\t\t\tcase 0x04: HandlePacketClientStatus(a_ByteBuffer); return true;\n\t\t\t\tcase 0x05: HandlePacketClientSettings(a_ByteBuffer); return true;\n\t\t\t\tcase 0x06: break;  // Confirm transaction - not used in Cuberite\n\t\t\t\tcase 0x07: HandlePacketEnchantItem(a_ByteBuffer); return true;\n\t\t\t\tcase 0x08: HandlePacketWindowClick(a_ByteBuffer); return true;\n\t\t\t\tcase 0x09: HandlePacketWindowClose(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0a: HandlePacketPluginMessage(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0b: HandlePacketUseEntity(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0c: HandlePacketKeepAlive(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0d: HandlePacketPlayer(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0e: HandlePacketPlayerPos(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0f: HandlePacketPlayerPosLook(a_ByteBuffer); return true;\n\t\t\t\tcase 0x10: HandlePacketPlayerLook(a_ByteBuffer); return true;\n\t\t\t\tcase 0x11: HandlePacketVehicleMove(a_ByteBuffer); return true;\n\t\t\t\tcase 0x12: HandlePacketBoatSteer(a_ByteBuffer); return true;\n\t\t\t\tcase 0x13: HandlePacketPlayerAbilities(a_ByteBuffer); return true;\n\t\t\t\tcase 0x14: HandlePacketBlockDig(a_ByteBuffer); return true;\n\t\t\t\tcase 0x15: HandlePacketEntityAction(a_ByteBuffer); return true;\n\t\t\t\tcase 0x16: HandlePacketSteerVehicle(a_ByteBuffer); return true;\n\t\t\t\tcase 0x17: HandlePacketCraftingBookData(a_ByteBuffer); return true;\n\t\t\t\tcase 0x18: HandlePacketResourcePackStatus(a_ByteBuffer); return true;\n\t\t\t\tcase 0x19: HandlePacketAdvancementTab(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1a: HandlePacketSlotSelect(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1b: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1c: HandlePacketUpdateSign(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1d: HandlePacketAnimation(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1e: HandlePacketSpectate(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1f: HandlePacketBlockPlace(a_ByteBuffer); return true;\n\t\t\t\tcase 0x20: HandlePacketUseItem(a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}  // switch (m_State)\n\n\t// Unknown packet type, report to the ClientHandle:\n\tm_Client->PacketUnknown(a_PacketType);\n\treturn false;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_12_1:\n\nUInt32 cProtocol_1_12_1::GetPacketID(ePacketType a_Packet) const\n{\n\tswitch (a_Packet)\n\t{\n\t\tcase pktAttachEntity:           return 0x43;\n\t\tcase pktCameraSetTo:            return 0x39;\n\t\tcase pktCollectEntity:          return 0x4b;\n\t\tcase pktDestroyEntity:          return 0x32;\n\t\tcase pktDisplayObjective:       return 0x3b;\n\t\tcase pktEntityEffect:           return 0x4f;\n\t\tcase pktEntityEquipment:        return 0x3f;\n\t\tcase pktEntityHeadLook:         return 0x36;\n\t\tcase pktEntityMeta:             return 0x3c;\n\t\tcase pktEntityProperties:       return 0x4e;\n\t\tcase pktEntityVelocity:         return 0x3e;\n\t\tcase pktExperience:             return 0x40;\n\t\tcase pktHeldItemChange:         return 0x3a;\n\t\tcase pktLeashEntity:            return 0x3d;\n\t\tcase pktPlayerList:             return 0x2e;\n\t\tcase pktPlayerListHeaderFooter: return 0x4a;\n\t\tcase pktPlayerAbilities:        return 0x2c;\n\t\tcase pktPlayerMoveLook:         return 0x2f;\n\t\tcase pktRemoveEntityEffect:     return 0x33;\n\t\tcase pktResourcePack:           return 0x34;\n\t\tcase pktRespawn:                return 0x35;\n\t\tcase pktScoreboardObjective:    return 0x42;\n\t\tcase pktSpawnPosition:          return 0x46;\n\t\tcase pktUnlockRecipe:           return 0x31;\n\t\tcase pktUpdateHealth:           return 0x41;\n\t\tcase pktUpdateScore:            return 0x45;\n\t\tcase pktUseBed:                 return 0x30;\n\t\tcase pktTeleportEntity:         return 0x4c;\n\t\tcase pktTimeUpdate:             return 0x47;\n\t\tcase pktTitle:                  return 0x48;\n\n\t\tdefault: return Super::GetPacketID(a_Packet);\n\t}\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_12_1::GetProtocolVersion() const\n{\n\treturn Version::v1_12_1;\n}\n\n\n\n\n\nbool cProtocol_1_12_1::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType)\n{\n\tswitch (m_State)\n\t{\n\t\tcase State::Status:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketStatusRequest(a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketStatusPing(a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase State::Login:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketLoginStart(a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketLoginEncryptionResponse(a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase State::Game:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandleConfirmTeleport(a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketTabComplete(a_ByteBuffer); return true;\n\t\t\t\tcase 0x02: HandlePacketChatMessage(a_ByteBuffer); return true;\n\t\t\t\tcase 0x03: HandlePacketClientStatus(a_ByteBuffer); return true;\n\t\t\t\tcase 0x04: HandlePacketClientSettings(a_ByteBuffer); return true;\n\t\t\t\tcase 0x05: break;  // Confirm transaction - not used in Cuberite\n\t\t\t\tcase 0x06: HandlePacketEnchantItem(a_ByteBuffer); return true;\n\t\t\t\tcase 0x07: HandlePacketWindowClick(a_ByteBuffer); return true;\n\t\t\t\tcase 0x08: HandlePacketWindowClose(a_ByteBuffer); return true;\n\t\t\t\tcase 0x09: HandlePacketPluginMessage(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0a: HandlePacketUseEntity(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0b: HandlePacketKeepAlive(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0c: HandlePacketPlayer(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0d: HandlePacketPlayerPos(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0e: HandlePacketPlayerPosLook(a_ByteBuffer); return true;\n\t\t\t\tcase 0x0f: HandlePacketPlayerLook(a_ByteBuffer); return true;\n\t\t\t\tcase 0x10: HandlePacketVehicleMove(a_ByteBuffer); return true;\n\t\t\t\tcase 0x11: HandlePacketBoatSteer(a_ByteBuffer); return true;\n\t\t\t\tcase 0x12: HandleCraftRecipe(a_ByteBuffer); return true;\n\t\t\t\tcase 0x13: HandlePacketPlayerAbilities(a_ByteBuffer); return true;\n\t\t\t\tcase 0x14: HandlePacketBlockDig(a_ByteBuffer); return true;\n\t\t\t\tcase 0x15: HandlePacketEntityAction(a_ByteBuffer); return true;\n\t\t\t\tcase 0x16: HandlePacketSteerVehicle(a_ByteBuffer); return true;\n\t\t\t\tcase 0x17: HandlePacketCraftingBookData(a_ByteBuffer); return true;\n\t\t\t\tcase 0x18: HandlePacketResourcePackStatus(a_ByteBuffer); return true;\n\t\t\t\tcase 0x19: HandlePacketAdvancementTab(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1a: HandlePacketSlotSelect(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1b: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1c: HandlePacketUpdateSign(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1d: HandlePacketAnimation(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1e: HandlePacketSpectate(a_ByteBuffer); return true;\n\t\t\t\tcase 0x1f: HandlePacketBlockPlace(a_ByteBuffer); return true;\n\t\t\t\tcase 0x20: HandlePacketUseItem(a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}  // switch (m_State)\n\n\t// Unknown packet type, report to the ClientHandle:\n\tm_Client->PacketUnknown(a_PacketType);\n\treturn false;\n}\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_12_2::\n\ncProtocol::Version cProtocol_1_12_2::GetProtocolVersion() const\n{\n\treturn Version::v1_12_2;\n}\n\n\n\n\n\nvoid cProtocol_1_12_2::HandlePacketKeepAlive(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEInt64, Int64, KeepAliveID);\n\tif (\n\t\t(KeepAliveID <= std::numeric_limits<UInt32>::max()) &&\n\t\t(KeepAliveID >= 0)\n\t)\n\t{\n\t\t// The server will only send a UInt32 so any value out of that range shouldn't keep the client alive.\n\t\tm_Client->HandleKeepAlive(static_cast<UInt32>(KeepAliveID));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_12_2::SendKeepAlive(UInt32 a_PingID)\n{\n\t// Drop the packet if the protocol is not in the Game state yet (caused a client crash):\n\tif (m_State != 3)\n\t{\n\t\tLOGWARNING(\"Trying to send a KeepAlive packet to a player who's not yet fully logged in (%d). The protocol class prevented the packet.\", m_State);\n\t\treturn;\n\t}\n\n\tcPacketizer Pkt(*this, pktKeepAlive);\n\tPkt.WriteBEInt64(a_PingID);\n}\n\n\n\n\n\nvoid cProtocol_1_12_2::SendUnlockRecipe(UInt32 a_RecipeID)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tauto ProtocolRecipeId = cRoot::Get()->GetRecipeMapper()->GetProtocolRecipeId(a_RecipeID, m_Client->GetProtocolVersion());\n\tif (ProtocolRecipeId.has_value())\n\t{\n\t\tcPacketizer Pkt(*this, pktUnlockRecipe);\n\t\tPkt.WriteVarInt32(1);\n\t\tPkt.WriteBool(true);\n\t\tPkt.WriteBool(false);\n\t\tPkt.WriteVarInt32(1);\n\t\tPkt.WriteVarInt32(ProtocolRecipeId.value());\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_12_2::SendInitRecipes(UInt32 a_RecipeID)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tauto ProtocolRecipeId = cRoot::Get()->GetRecipeMapper()->GetProtocolRecipeId(a_RecipeID, m_Client->GetProtocolVersion());\n\tif (!ProtocolRecipeId.has_value())\n\t{\n\t\treturn;\n\t}\n\n\tcPacketizer Pkt(*this, pktUnlockRecipe);\n\tPkt.WriteVarInt32(0);\n\tPkt.WriteBool(true);\n\tPkt.WriteBool(false);\n\tif (a_RecipeID == 0)\n\t{\n\t\tPkt.WriteVarInt32(0);\n\t\tPkt.WriteVarInt32(0);\n\t}\n\telse\n\t{\n\t\tPkt.WriteVarInt32(1);\n\t\tPkt.WriteVarInt32(ProtocolRecipeId.value());\n\t\tPkt.WriteVarInt32(1);\n\t\tPkt.WriteVarInt32(ProtocolRecipeId.value());\n\t}\n}\n"
  },
  {
    "path": "src/Protocol/Protocol_1_12.h",
    "content": "\n// Protocol_1_12.h\n\n/*\nDeclares the 1.12 protocol classes:\n\t- cProtocol_1_12\n\t\t- release 1.12 protocol (#335)\n\t- cProtocol_1_12_1\n\t\t- release 1.12.1 protocol (#338)\n\t- cProtocol_1_12_2\n\t\t- release 1.12.2 protocol (#340)\n*/\n\n\n\n\n\n#pragma once\n\n#include \"Protocol_1_11.h\"\n\n#include \"RecipeMapper.h\"\n\n\n\nclass cProtocol_1_12:\n\tpublic cProtocol_1_11_1\n{\n\tusing Super = cProtocol_1_11_1;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual UInt32 GetPacketID(ePacketType a_Packet) const override;\n\tvirtual signed char GetProtocolEntityStatus(EntityAnimation a_Animation) const override;\n\tvirtual UInt32 GetProtocolMobType(eMonsterType a_MobType) const override;\n\tvirtual Version GetProtocolVersion() const override;\n\n\tvirtual bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) override;\n\tvirtual void HandlePacketAdvancementTab(cByteBuffer & a_ByteBuffer);\n\tvirtual void HandleCraftRecipe(cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketCraftingBookData(cByteBuffer & a_ByteBuffer);\n\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const override;\n\tvirtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const override;\n};\n\n\n\n\n\nclass cProtocol_1_12_1:\n\tpublic cProtocol_1_12\n{\n\tusing Super = cProtocol_1_12;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual UInt32 GetPacketID(ePacketType a_Packet) const override;\n\tvirtual Version GetProtocolVersion() const override;\n\n\tvirtual bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) override;\n};\n\n\n\n\n\nclass cProtocol_1_12_2:\n\tpublic cProtocol_1_12_1\n{\n\tusing Super = cProtocol_1_12_1;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual Version GetProtocolVersion() const override;\n\n\tvirtual void HandlePacketKeepAlive(cByteBuffer & a_ByteBuffer) override;\n\n\tvirtual void SendKeepAlive(UInt32 a_PingID) override;\n\tvirtual void SendUnlockRecipe(UInt32 a_RecipeID) override;\n\tvirtual void SendInitRecipes(UInt32 a_RecipeID) override;\n};\n"
  },
  {
    "path": "src/Protocol/Protocol_1_13.cpp",
    "content": "\n// Protocol_1_13.cpp\n\n/*\nImplements the 1.13 protocol classes:\n- release 1.13 protocol (#393)\n- release 1.13.1 protocol (#401)\n- release 1.13.2 protocol (#404)\n*/\n\n#include \"Globals.h\"\n#include \"Protocol_1_13.h\"\n\n#include \"../Entities/Boat.h\"\n#include \"../Entities/EnderCrystal.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/FireworkEntity.h\"\n#include \"../Entities/SplashPotionEntity.h\"\n\n#include \"../Mobs/IncludeAllMonsters.h\"\n\n#include \"../CompositeChat.h\"\n#include \"../ClientHandle.h\"\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../World.h\"\n#include \"../JsonUtils.h\"\n#include \"../WorldStorage/FastNBT.h\"\n#include \"WorldStorage/NamespaceSerializer.h\"\n\n#include \"../Bindings/PluginManager.h\"\n\n#include \"Palettes/Palette_1_13.h\"\n#include \"Palettes/Palette_1_13_1.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_13:\n\nvoid cProtocol_1_13::SendBlockChange(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tcPacketizer Pkt(*this, pktBlockChange);\n\tPkt.WriteXYZPosition64(a_BlockPos);\n\tPkt.WriteVarInt32(GetProtocolBlockType(a_BlockType, a_BlockMeta));\n}\n\n\n\n\n\nvoid cProtocol_1_13::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBlockChanges);\n\tPkt.WriteBEInt32(a_ChunkX);\n\tPkt.WriteBEInt32(a_ChunkZ);\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Changes.size()));\n\n\tfor (const auto & Change : a_Changes)\n\t{\n\t\tInt16 Coords = static_cast<Int16>(Change.m_RelY | (Change.m_RelZ << 8) | (Change.m_RelX << 12));\n\t\tPkt.WriteBEInt16(Coords);\n\t\tPkt.WriteVarInt32(GetProtocolBlockType(Change.m_BlockType, Change.m_BlockMeta));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_13::SendMapData(const cMap & a_Map, int a_DataStartX, int a_DataStartY)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cProtocol_1_13::SendPaintingSpawn(const cPainting & a_Painting)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cProtocol_1_13::SendParticleEffect(const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data)\n{\n\t// This packet is unchanged since 1.8\n\t// However we are hardcoding a string-to-id mapping inside there\n\t// TODO: make a virtual enum-to-id mapping\n}\n\n\n\n\n\nvoid cProtocol_1_13::SendScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cProtocol_1_13::SendStatistics(const StatisticsManager & a_Manager)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tUInt32 Size = 0;\n\n\tfor (const auto & [Statistic, Value] : a_Manager.Custom)\n\t{\n\t\t// Client balks at out-of-range values so there is no good default value.\n\t\t// We're forced to not send the statistics this protocol version doesn't support.\n\n\t\tif (GetProtocolStatisticType(Statistic) != static_cast<UInt32>(-1))\n\t\t{\n\t\t\tSize++;\n\t\t}\n\t}\n\n\t// No need to check Size != 0\n\t// Assume that the vast majority of the time there's at least one statistic to send\n\n\tcPacketizer Pkt(*this, pktStatistics);\n\tPkt.WriteVarInt32(Size);\n\n\tfor (const auto & [Statistic, Value] : a_Manager.Custom)\n\t{\n\t\tconst auto ID = GetProtocolStatisticType(Statistic);\n\t\tif (ID == static_cast<UInt32>(-1))\n\t\t{\n\t\t\t// Unsupported, don't send:\n\t\t\tcontinue;\n\t\t}\n\n\t\tPkt.WriteVarInt32(8);  // \"Custom\" category.\n\t\tPkt.WriteVarInt32(ID);\n\t\tPkt.WriteVarInt32(static_cast<UInt32>(Value));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_13::SendTabCompletionResults(const AStringVector & a_Results)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cProtocol_1_13::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tByte Action;\n\tswitch (a_BlockEntity.GetBlockType())\n\t{\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\t{\n\t\t\t// The ones with a action of 0 is just a workaround to send the block entities to a client.\n\t\t\t// Todo: 18.09.2020 - remove this when block entities are transmitted in the ChunkData packet - 12xx12\n\t\t\tAction = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_MOB_SPAWNER:       Action = 1;  break;  // Update mob spawner spinny mob thing\n\t\tcase E_BLOCK_COMMAND_BLOCK:     Action = 2;  break;  // Update command block text\n\t\tcase E_BLOCK_BEACON:            Action = 3;  break;  // Update beacon entity\n\t\tcase E_BLOCK_HEAD:              Action = 4;  break;  // Update Mobhead entity\n\t\t// case E_BLOCK_CONDUIT:        Action = 5;  break;  // Update Conduit entity\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_WALL_BANNER:       Action = 6;  break;  // Update banner entity\n\t\t// case Structure Block:        Action = 7;  break;  // Update Structure tile entity\n\t\tcase E_BLOCK_END_GATEWAY:       Action = 8;  break;  // Update destination for a end gateway entity\n\t\tcase E_BLOCK_SIGN_POST:         Action = 9;  break;  // Update sign entity\n\t\t// case E_BLOCK_SHULKER_BOX:    Action = 10; break;  // sets shulker box - not used just here if anyone is confused from reading the protocol wiki\n\t\tcase E_BLOCK_BED:               Action = 11; break;  // Update bed color\n\n\t\tdefault: return;  // Block entities change between versions\n\t}\n\n\tcPacketizer Pkt(*this, pktUpdateBlockEntity);\n\tPkt.WriteXYZPosition64(a_BlockEntity.GetPosX(), a_BlockEntity.GetPosY(), a_BlockEntity.GetPosZ());\n\tPkt.WriteBEUInt8(Action);\n\n\tcFastNBTWriter Writer;\n\tWriteBlockEntity(Writer, a_BlockEntity);\n\tWriter.Finish();\n\tPkt.WriteBuf(Writer.GetResult());\n}\n\n\n\n\n\nUInt8 cProtocol_1_13::GetEntityMetadataID(EntityMetadata a_Metadata) const\n{\n\tconst UInt8 Entity = 6;\n\tconst UInt8 Living = Entity + 5;\n\tconst UInt8 Insentient = Living + 1;\n\tconst UInt8 Ageable = Insentient + 1;\n\tconst UInt8 AbstractHorse = Ageable + 2;\n\tconst UInt8 ChestedHorse = AbstractHorse + 1;\n\tconst UInt8 TameableAnimal = Ageable + 2;\n\tconst UInt8 Minecart = Entity + 6;\n\n\tswitch (a_Metadata)\n\t{\n\t\tcase EntityMetadata::EntityFlags:                           return 0;\n\t\tcase EntityMetadata::EntityAir:                             return 1;\n\t\tcase EntityMetadata::EntityCustomName:                      return 2;\n\t\tcase EntityMetadata::EntityCustomNameVisible:               return 3;\n\t\tcase EntityMetadata::EntitySilent:                          return 4;\n\t\tcase EntityMetadata::EntityNoGravity:                       return 5;\n\t\tcase EntityMetadata::PotionThrown:                          return Entity;\n\t\tcase EntityMetadata::FallingBlockPosition:                  return Entity;\n\t\tcase EntityMetadata::AreaEffectCloudRadius:                 return Entity;\n\t\tcase EntityMetadata::AreaEffectCloudColor:                  return Entity + 1;\n\t\tcase EntityMetadata::AreaEffectCloudSinglePointEffect:      return Entity + 2;\n\t\tcase EntityMetadata::AreaEffectCloudParticleId:             return Entity + 3;\n\t\tcase EntityMetadata::ArrowFlags:                            return Entity;\n\t\tcase EntityMetadata::TippedArrowColor:                      return Entity + 1;\n\t\tcase EntityMetadata::BoatLastHitTime:                       return Entity;\n\t\tcase EntityMetadata::BoatForwardDirection:                  return Entity + 1;\n\t\tcase EntityMetadata::BoatDamageTaken:                       return Entity + 2;\n\t\tcase EntityMetadata::BoatType:                              return Entity + 3;\n\t\tcase EntityMetadata::BoatLeftPaddleTurning:                 return Entity + 4;\n\t\tcase EntityMetadata::BoatRightPaddleTurning:                return Entity + 5;\n\t\tcase EntityMetadata::BoatSplashTimer:                       return Entity + 6;\n\t\tcase EntityMetadata::EnderCrystalBeamTarget:                return Entity;\n\t\tcase EntityMetadata::EnderCrystalShowBottom:                return Entity + 1;\n\t\tcase EntityMetadata::WitherSkullInvulnerable:               return Entity;\n\t\tcase EntityMetadata::FireworkInfo:                          return Entity;\n\t\tcase EntityMetadata::FireworkBoostedEntityId:               return Entity + 1;\n\t\tcase EntityMetadata::ItemFrameItem:                         return Entity;\n\t\tcase EntityMetadata::ItemFrameRotation:                     return Entity + 1;\n\t\tcase EntityMetadata::ItemItem:                              return Entity;\n\t\tcase EntityMetadata::LivingActiveHand:                      return Entity;\n\t\tcase EntityMetadata::LivingHealth:                          return Entity + 1;\n\t\tcase EntityMetadata::LivingPotionEffectColor:               return Entity + 2;\n\t\tcase EntityMetadata::LivingPotionEffectAmbient:             return Entity + 3;\n\t\tcase EntityMetadata::LivingNumberOfArrows:                  return Entity + 4;\n\t\tcase EntityMetadata::PlayerAdditionalHearts:                return Living;\n\t\tcase EntityMetadata::PlayerScore:                           return Living + 1;\n\t\tcase EntityMetadata::PlayerDisplayedSkinParts:              return Living + 2;\n\t\tcase EntityMetadata::PlayerMainHand:                        return Living + 3;\n\t\tcase EntityMetadata::ArmorStandStatus:                      return Living;\n\t\tcase EntityMetadata::ArmorStandHeadRotation:                return Living + 1;\n\t\tcase EntityMetadata::ArmorStandBodyRotation:                return Living + 2;\n\t\tcase EntityMetadata::ArmorStandLeftArmRotation:             return Living + 3;\n\t\tcase EntityMetadata::ArmorStandRightArmRotation:            return Living + 4;\n\t\tcase EntityMetadata::ArmorStandLeftLegRotation:             return Living + 5;\n\t\tcase EntityMetadata::ArmorStandRightLegRotation:            return Living + 6;\n\t\tcase EntityMetadata::InsentientFlags:                       return Living;\n\t\tcase EntityMetadata::BatHanging:                            return Insentient;\n\t\tcase EntityMetadata::AgeableIsBaby:                         return Insentient;\n\t\tcase EntityMetadata::AbstractHorseFlags:                    return Ageable;\n\t\tcase EntityMetadata::AbstractHorseOwner:                    return Ageable + 1;\n\t\tcase EntityMetadata::HorseVariant:                          return AbstractHorse;\n\t\tcase EntityMetadata::HorseArmour:                           return AbstractHorse + 1;\n\t\tcase EntityMetadata::ChestedHorseChested:                   return AbstractHorse;\n\t\tcase EntityMetadata::LlamaStrength:                         return ChestedHorse;\n\t\tcase EntityMetadata::LlamaCarpetColor:                      return ChestedHorse + 1;\n\t\tcase EntityMetadata::LlamaVariant:                          return ChestedHorse + 2;\n\t\tcase EntityMetadata::PigHasSaddle:                          return Ageable;\n\t\tcase EntityMetadata::PigTotalCarrotOnAStickBoost:           return Ageable + 1;\n\t\tcase EntityMetadata::RabbitType:                            return Ageable;\n\t\tcase EntityMetadata::PolarBearStanding:                     return Ageable;\n\t\tcase EntityMetadata::SheepFlags:                            return Ageable;\n\t\tcase EntityMetadata::TameableAnimalFlags:                   return Ageable;\n\t\tcase EntityMetadata::TameableAnimalOwner:                   return Ageable + 1;\n\t\tcase EntityMetadata::OcelotType:                            return TameableAnimal;\n\t\tcase EntityMetadata::WolfDamageTaken:                       return TameableAnimal;\n\t\tcase EntityMetadata::WolfBegging:                           return TameableAnimal + 1;\n\t\tcase EntityMetadata::WolfCollarColour:                      return TameableAnimal + 2;\n\t\tcase EntityMetadata::VillagerProfession:                    return Ageable;\n\t\tcase EntityMetadata::IronGolemPlayerCreated:                return Insentient;\n\t\tcase EntityMetadata::ShulkerFacingDirection:                return Insentient;\n\t\tcase EntityMetadata::ShulkerAttachmentFallingBlockPosition: return Insentient + 1;\n\t\tcase EntityMetadata::ShulkerShieldHeight:                   return Insentient + 2;\n\t\tcase EntityMetadata::BlazeOnFire:                           return Insentient;\n\t\tcase EntityMetadata::CreeperState:                          return Insentient;\n\t\tcase EntityMetadata::CreeperPowered:                        return Insentient + 1;\n\t\tcase EntityMetadata::CreeperIgnited:                        return Insentient + 2;\n\t\tcase EntityMetadata::GuardianStatus:                        return Insentient;\n\t\tcase EntityMetadata::GuardianTarget:                        return Insentient + 1;\n\t\tcase EntityMetadata::IllagerFlags:                          return Insentient;\n\t\tcase EntityMetadata::SpeIlagerSpell:                        return Insentient + 1;\n\t\tcase EntityMetadata::VexFlags:                              return Insentient;\n\t\tcase EntityMetadata::AbstractSkeletonArmsSwinging:          return Insentient;\n\t\tcase EntityMetadata::SpiderClimbing:                        return Insentient;\n\t\tcase EntityMetadata::WitchAggresive:                        return Insentient;\n\t\tcase EntityMetadata::WitherFirstHeadTarget:                 return Insentient;\n\t\tcase EntityMetadata::WitherSecondHeadTarget:                return Insentient + 1;\n\t\tcase EntityMetadata::WitherThirdHeadTarget:                 return Insentient + 2;\n\t\tcase EntityMetadata::WitherInvulnerableTimer:               return Insentient + 3;\n\t\tcase EntityMetadata::ZombieIsBaby:                          return Insentient;\n\t\tcase EntityMetadata::ZombieHandsRisedUp:                    return Insentient + 2;\n\t\tcase EntityMetadata::ZombieVillagerConverting:              return Insentient + 4;\n\t\tcase EntityMetadata::ZombieVillagerProfession:              return Insentient + 5;\n\t\tcase EntityMetadata::EndermanCarriedBlock:                  return Insentient;\n\t\tcase EntityMetadata::EndermanScreaming:                     return Insentient + 1;\n\t\tcase EntityMetadata::EnderDragonDragonPhase:                return Insentient;\n\t\tcase EntityMetadata::GhastAttacking:                        return Insentient;\n\t\tcase EntityMetadata::SlimeSize:                             return Insentient;\n\t\tcase EntityMetadata::MinecartShakingPower:                  return Entity;\n\t\tcase EntityMetadata::MinecartShakingDirection:              return Entity + 1;\n\t\tcase EntityMetadata::MinecartShakingMultiplier:             return Entity + 2;\n\t\tcase EntityMetadata::MinecartBlockIDMeta:                   return Entity + 3;\n\t\tcase EntityMetadata::MinecartBlockY:                        return Entity + 4;\n\t\tcase EntityMetadata::MinecartShowBlock:                     return Entity + 5;\n\t\tcase EntityMetadata::MinecartCommandBlockCommand:           return Minecart;\n\t\tcase EntityMetadata::MinecartCommandBlockLastOutput:        return Minecart + 1;\n\t\tcase EntityMetadata::MinecartFurnacePowered:                return Minecart;\n\t\tcase EntityMetadata::TNTPrimedFuseTime:                     return Entity;\n\n\t\tcase EntityMetadata::EntityPose:\n\t\tcase EntityMetadata::AreaEffectCloudParticleParameter1:\n\t\tcase EntityMetadata::AreaEffectCloudParticleParameter2:\n\t\tcase EntityMetadata::ZombieUnusedWasType: break;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\tUNREACHABLE(\"Retrieved invalid metadata for protocol\");\n}\n\n\n\n\n\nUInt8 cProtocol_1_13::GetEntityMetadataID(EntityMetadataType a_FieldType) const\n{\n\tswitch (a_FieldType)\n\t{\n\t\tcase EntityMetadataType::Byte:         return 0;\n\t\tcase EntityMetadataType::VarInt:       return 1;\n\t\tcase EntityMetadataType::Float:        return 2;\n\t\tcase EntityMetadataType::String:       return 3;\n\t\tcase EntityMetadataType::Chat:         return 4;\n\t\tcase EntityMetadataType::OptChat:      return 5;\n\t\tcase EntityMetadataType::Item:         return 6;\n\t\tcase EntityMetadataType::Boolean:      return 7;\n\t\tcase EntityMetadataType::Rotation:     return 8;\n\t\tcase EntityMetadataType::Position:     return 9;\n\t\tcase EntityMetadataType::OptPosition:  return 10;\n\t\tcase EntityMetadataType::Direction:    return 11;\n\t\tcase EntityMetadataType::OptUUID:      return 12;\n\t\tcase EntityMetadataType::OptBlockID:   return 13;\n\t\tcase EntityMetadataType::NBT:          return 14;\n\t\tcase EntityMetadataType::Particle:     return 15;\n\t\tcase EntityMetadataType::VillagerData: return 16;\n\t\tcase EntityMetadataType::OptVarInt:    return 17;\n\t\tcase EntityMetadataType::Pose:         return 18;\n\t}\n\tUNREACHABLE(\"Translated invalid metadata type for protocol\");\n}\n\n\n\n\n\nstd::pair<short, short> cProtocol_1_13::GetItemFromProtocolID(UInt32 a_ProtocolID) const\n{\n\treturn PaletteUpgrade::ToItem(Palette_1_13::ToItem(a_ProtocolID));\n}\n\n\n\n\n\nUInt32 cProtocol_1_13::GetPacketID(ePacketType a_PacketType) const\n{\n\tswitch (a_PacketType)\n\t{\n\t\tcase pktAttachEntity:           return 0x46;\n\t\tcase pktBlockChanges:           return 0x0f;\n\t\tcase pktCameraSetTo:            return 0x3c;\n\t\tcase pktChatRaw:                return 0x0e;\n\t\tcase pktCollectEntity:          return 0x4f;\n\t\tcase pktDestroyEntity:          return 0x35;\n\t\tcase pktDisconnectDuringGame:   return 0x1b;\n\t\tcase pktEditSign:               return 0x2c;\n\t\tcase pktEntityEffect:           return 0x53;\n\t\tcase pktEntityEquipment:        return 0x42;\n\t\tcase pktEntityHeadLook:         return 0x39;\n\t\tcase pktEntityLook:             return 0x2a;\n\t\tcase pktEntityMeta:             return 0x3f;\n\t\tcase pktEntityProperties:       return 0x52;\n\t\tcase pktEntityRelMove:          return 0x28;\n\t\tcase pktEntityRelMoveLook:      return 0x29;\n\t\tcase pktEntityStatus:           return 0x1c;\n\t\tcase pktEntityVelocity:         return 0x41;\n\t\tcase pktExperience:             return 0x43;\n\t\tcase pktExplosion:              return 0x1e;\n\t\tcase pktGameMode:               return 0x20;\n\t\tcase pktHeldItemChange:         return 0x3d;\n\t\tcase pktInventorySlot:          return 0x17;\n\t\tcase pktJoinGame:               return 0x25;\n\t\tcase pktKeepAlive:              return 0x21;\n\t\tcase pktLeashEntity:            return 0x40;\n\t\tcase pktMapData:                return 0x26;\n\t\tcase pktParticleEffect:         return 0x24;\n\t\tcase pktPlayerAbilities:        return 0x2e;\n\t\tcase pktPlayerList:             return 0x30;\n\t\tcase pktPlayerListHeaderFooter: return 0x4e;\n\t\tcase pktPlayerMoveLook:         return 0x32;\n\t\tcase pktPluginMessage:          return 0x19;\n\t\tcase pktRemoveEntityEffect:     return 0x36;\n\t\tcase pktRespawn:                return 0x38;\n\t\tcase pktScoreboardObjective:    return 0x45;\n\t\tcase pktSoundEffect:            return 0x1a;\n\t\tcase pktSoundParticleEffect:    return 0x23;\n\t\tcase pktSpawnPosition:          return 0x49;\n\t\tcase pktTabCompletionResults:   return 0x10;\n\t\tcase pktTeleportEntity:         return 0x50;\n\t\tcase pktTimeUpdate:             return 0x4a;\n\t\tcase pktTitle:                  return 0x4b;\n\t\tcase pktUnloadChunk:            return 0x1f;\n\t\tcase pktUnlockRecipe:           return 0x32;\n\t\tcase pktUpdateHealth:           return 0x44;\n\t\tcase pktUpdateScore:            return 0x48;\n\t\tcase pktUpdateSign:             return GetPacketID(pktUpdateBlockEntity);\n\t\tcase pktUseBed:                 return 0x33;\n\t\tcase pktWeather:                return 0x20;\n\t\tcase pktWindowClose:            return 0x13;\n\t\tcase pktWindowItems:            return 0x15;\n\t\tcase pktWindowOpen:             return 0x14;\n\t\tcase pktWindowProperty:         return 0x16;\n\t\tdefault: return Super::GetPacketID(a_PacketType);\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_13::GetProtocolBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta) const\n{\n\treturn Palette_1_13::From(PaletteUpgrade::FromBlock(a_BlockType, a_Meta));\n}\n\n\n\n\n\nsigned char cProtocol_1_13::GetProtocolEntityStatus(const EntityAnimation a_Animation) const\n{\n\tswitch (a_Animation)\n\t{\n\t\tcase EntityAnimation::DolphinShowsHappiness: return 38;\n\t\tdefault: return Super::GetProtocolEntityStatus(a_Animation);\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_13::GetProtocolItemType(short a_ItemID, short a_ItemDamage) const\n{\n\treturn Palette_1_13::From(PaletteUpgrade::FromItem(a_ItemID, a_ItemDamage));\n}\n\n\n\n\n\nUInt32 cProtocol_1_13::GetProtocolMobType(eMonsterType a_MobType) const\n{\n\tswitch (a_MobType)\n\t{\n\t\t// Map invalid type to Giant for easy debugging (if this ever spawns, something has gone very wrong)\n\t\tcase mtInvalidType:           return 27;\n\t\tcase mtBat:                   return 3;\n\t\tcase mtCat:                   return 48;\n\t\tcase mtBlaze:                 return 4;\n\t\tcase mtCaveSpider:            return 6;\n\t\tcase mtChicken:               return 7;\n\t\tcase mtCod:                   return 8;\n\t\tcase mtCow:                   return 9;\n\t\tcase mtCreeper:               return 10;\n\t\tcase mtDonkey:                return 11;\n\t\tcase mtDolphin:               return 12;\n\t\tcase mtDrowned:               return 14;\n\t\tcase mtElderGuardian:         return 15;\n\t\tcase mtEnderDragon:           return 17;\n\t\tcase mtEnderman:              return 18;\n\t\tcase mtEndermite:             return 19;\n\t\tcase mtEvoker:                return 21;\n\t\tcase mtGhast:                 return 26;\n\t\tcase mtGiant:                 return 27;\n\t\tcase mtGuardian:              return 28;\n\t\tcase mtHorse:                 return 29;\n\t\tcase mtHusk:                  return 30;\n\t\tcase mtIllusioner:            return 31;\n\t\tcase mtIronGolem:             return 80;\n\t\tcase mtLlama:                 return 36;\n\t\tcase mtMagmaCube:             return 38;\n\t\tcase mtMule:                  return 46;\n\t\tcase mtMooshroom:             return 47;\n\t\tcase mtOcelot:                return 48;\n\t\tcase mtParrot:                return 50;\n\t\tcase mtPhantom:               return 90;\n\t\tcase mtPig:                   return 51;\n\t\tcase mtPufferfish:            return 52;\n\t\tcase mtPolarBear:             return 54;\n\t\tcase mtRabbit:                return 56;\n\t\tcase mtSalmon:                return 57;\n\t\tcase mtSheep:                 return 58;\n\t\tcase mtShulker:               return 59;\n\t\tcase mtSilverfish:            return 61;\n\t\tcase mtSkeleton:              return 62;\n\t\tcase mtSkeletonHorse:         return 63;\n\t\tcase mtSlime:                 return 64;\n\t\tcase mtSnowGolem:             return 66;\n\t\tcase mtSpider:                return 69;\n\t\tcase mtSquid:                 return 70;\n\t\tcase mtStray:                 return 71;\n\t\tcase mtTropicalFish:          return 72;\n\t\tcase mtTurtle:                return 73;\n\t\tcase mtVex:                   return 78;\n\t\tcase mtVillager:              return 79;\n\t\tcase mtVindicator:            return 81;\n\t\tcase mtWitch:                 return 82;\n\t\tcase mtWither:                return 83;\n\t\tcase mtWitherSkeleton:        return 84;\n\t\tcase mtWolf:                  return 86;\n\t\tcase mtZombie:                return 87;\n\t\tcase mtZombiePigman:          return 53;\n\t\tcase mtZombieHorse:           return 88;\n\t\tcase mtZombieVillager:        return 89;\n\t\tdefault:                      return 0;\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_13::GetProtocolStatisticType(const CustomStatistic a_Statistic) const\n{\n\treturn Palette_1_13::From(a_Statistic);\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_13::GetProtocolVersion() const\n{\n\treturn Version::v1_13;\n}\n\n\n\n\n\nbool cProtocol_1_13::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType)\n{\n\tif (m_State != 3)\n\t{\n\t\treturn Super::HandlePacket(a_ByteBuffer, a_PacketType);\n\t}\n\n\t// Game\n\tswitch (a_PacketType)\n\t{\n\t\tcase 0x00: HandleConfirmTeleport(a_ByteBuffer); return true;\n\t\tcase 0x05: HandlePacketTabComplete(a_ByteBuffer); return true;\n\t\tcase 0x02: HandlePacketChatMessage(a_ByteBuffer); return true;\n\t\tcase 0x03: HandlePacketClientStatus(a_ByteBuffer); return true;\n\t\tcase 0x04: HandlePacketClientSettings(a_ByteBuffer); return true;\n\t\tcase 0x06: break;  // Confirm transaction - not used in Cuberite\n\t\tcase 0x07: HandlePacketEnchantItem(a_ByteBuffer); return true;\n\t\tcase 0x08: HandlePacketWindowClick(a_ByteBuffer); return true;\n\t\tcase 0x09: HandlePacketWindowClose(a_ByteBuffer); return true;\n\t\tcase 0x0a: HandlePacketPluginMessage(a_ByteBuffer); return true;\n\t\tcase 0x0d: HandlePacketUseEntity(a_ByteBuffer); return true;\n\t\tcase 0x0e: HandlePacketKeepAlive(a_ByteBuffer); return true;\n\t\tcase 0x0f: HandlePacketPlayer(a_ByteBuffer); return true;\n\t\tcase 0x10: HandlePacketPlayerPos(a_ByteBuffer); return true;\n\t\tcase 0x11: HandlePacketPlayerPosLook(a_ByteBuffer); return true;\n\t\tcase 0x12: HandlePacketPlayerLook(a_ByteBuffer); return true;\n\t\tcase 0x13: HandlePacketVehicleMove(a_ByteBuffer); return true;\n\t\tcase 0x14: HandlePacketBoatSteer(a_ByteBuffer); return true;\n\t\tcase 0x15: break;  // Pick item - not yet implemented\n\t\tcase 0x16: break;  // Craft Recipe Request - not yet implemented\n\t\tcase 0x17: HandlePacketPlayerAbilities(a_ByteBuffer); return true;\n\t\tcase 0x18: HandlePacketBlockDig(a_ByteBuffer); return true;\n\t\tcase 0x19: HandlePacketEntityAction(a_ByteBuffer); return true;\n\t\tcase 0x1a: HandlePacketSteerVehicle(a_ByteBuffer); return true;\n\t\tcase 0x1b: HandlePacketCraftingBookData(a_ByteBuffer); return true;\n\t\tcase 0x1c: HandlePacketNameItem(a_ByteBuffer); return true;\n\t\tcase 0x1d: break;  // Resource pack status - not yet implemented\n\t\tcase 0x1e: HandlePacketAdvancementTab(a_ByteBuffer); return true;\n\t\tcase 0x20: HandlePacketSetBeaconEffect(a_ByteBuffer); return true;\n\t\tcase 0x21: HandlePacketSlotSelect(a_ByteBuffer); return true;\n\t\tcase 0x24: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true;\n\t\tcase 0x26: HandlePacketUpdateSign(a_ByteBuffer); return true;\n\t\tcase 0x27: HandlePacketAnimation(a_ByteBuffer); return true;\n\t\tcase 0x28: HandlePacketSpectate(a_ByteBuffer); return true;\n\t\tcase 0x29: HandlePacketBlockPlace(a_ByteBuffer); return true;\n\t\tcase 0x2a: HandlePacketUseItem(a_ByteBuffer); return true;\n\t}\n\n\treturn Super::HandlePacket(a_ByteBuffer, a_PacketType);\n}\n\n\n\n\n\nvoid cProtocol_1_13::HandlePacketNameItem(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, NewItemName);\n\n\tLOGD(\"New item name : %s\", NewItemName);\n}\n\n\n\n\n\nvoid cProtocol_1_13::HandlePacketPluginMessage(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, NamespacedChannel);\n\n\tconst auto & [Namespace, Channel] = NamespaceSerializer::SplitNamespacedID(NamespacedChannel);\n\n\t// If the plugin channel is recognized vanilla, handle it directly:\n\tif (Namespace == NamespaceSerializer::Namespace::Minecraft)\n\t{\n\t\tHandleVanillaPluginMessage(a_ByteBuffer, Channel);\n\t\treturn;\n\t}\n\n\tContiguousByteBuffer Data;\n\n\t// Read the plugin message and relay to clienthandle:\n\ta_ByteBuffer.ReadSome(Data, a_ByteBuffer.GetReadableSpace());\n\tm_Client->HandlePluginMessage(NamespacedChannel, Data);\n}\n\n\n\n\n\nvoid cProtocol_1_13::HandlePacketSetBeaconEffect(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt32, UInt32, Effect1);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt32, UInt32, Effect2);\n\tm_Client->HandleBeaconSelection(Effect1, Effect2);\n}\n\n\n\n\n\nvoid cProtocol_1_13::HandleVanillaPluginMessage(cByteBuffer & a_ByteBuffer, const std::string_view a_Channel)\n{\n\tif (a_Channel == \"brand\")\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Brand);\n\n\t\tm_Client->SetClientBrand(Brand);\n\t\tm_Client->SendPluginMessage(\"brand\", \"\\x08\"\"Cuberite\");  // Send back our brand, including the length.\n\t}\n}\n\n\n\n\n\nbool cProtocol_1_13::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) const\n{\n\tHANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt16, Int16, ItemID);\n\tif (ItemID == -1)\n\t{\n\t\t// The item is empty, no more data follows\n\t\ta_Item.Empty();\n\t\treturn true;\n\t}\n\n\tconst auto Translated = GetItemFromProtocolID(ToUnsigned(ItemID));\n\ta_Item.m_ItemType = Translated.first;\n\ta_Item.m_ItemDamage = Translated.second;\n\n\tHANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt8, Int8, ItemCount);\n\ta_Item.m_ItemCount = ItemCount;\n\tif (ItemCount <= 0)\n\t{\n\t\ta_Item.Empty();\n\t}\n\n\tContiguousByteBuffer Metadata;\n\tif (!a_ByteBuffer.ReadSome(Metadata, a_ByteBuffer.GetReadableSpace() - a_KeepRemainingBytes) || Metadata.empty() || (Metadata[0] == std::byte(0)))\n\t{\n\t\t// No metadata\n\t\treturn true;\n\t}\n\n\tParseItemMetadata(a_Item, Metadata);\n\treturn true;\n}\n\n\n\n\n\nvoid cProtocol_1_13::WriteEntityMetadata(cPacketizer & a_Pkt, const EntityMetadata a_Metadata, const EntityMetadataType a_FieldType) const\n{\n\ta_Pkt.WriteBEUInt8(GetEntityMetadataID(a_Metadata));  // Index\n\ta_Pkt.WriteBEUInt8(GetEntityMetadataID(a_FieldType));  // Type\n}\n\n\n\n\n\nvoid cProtocol_1_13::WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const\n{\n\t// Common metadata:\n\tInt8 Flags = 0;\n\tif (a_Entity.IsOnFire())\n\t{\n\t\tFlags |= 0x01;\n\t}\n\tif (a_Entity.IsCrouched())\n\t{\n\t\tFlags |= 0x02;\n\t}\n\tif (a_Entity.IsSprinting())\n\t{\n\t\tFlags |= 0x08;\n\t}\n\tif (a_Entity.IsRclking())\n\t{\n\t\tFlags |= 0x10;\n\t}\n\tif (a_Entity.IsInvisible())\n\t{\n\t\tFlags |= 0x20;\n\t}\n\n\tWriteEntityMetadata(a_Pkt, EntityMetadata::EntityFlags, EntityMetadataType::Byte);\n\ta_Pkt.WriteBEInt8(Flags);\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase cEntity::etPlayer:\n\t\t{\n\t\t\tauto & Player = static_cast<const cPlayer &>(a_Entity);\n\n\t\t\t// TODO Set player custom name to their name.\n\t\t\t// Then it's possible to move the custom name of mobs to the entities\n\t\t\t// and to remove the \"special\" player custom name.\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EntityCustomName, EntityMetadataType::String);\n\t\t\ta_Pkt.WriteString(Player.GetName());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::LivingHealth, EntityMetadataType::Float);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Player.GetHealth()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::PlayerDisplayedSkinParts, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Player.GetSkinParts()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::PlayerMainHand, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEUInt8(Player.IsLeftHanded() ? 0 : 1);\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etPickup:\n\t\t{\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ItemItem, EntityMetadataType::Item);\n\t\t\tWriteItem(a_Pkt, static_cast<const cPickup &>(a_Entity).GetItem());\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etMinecart:\n\t\t{\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartShakingPower, EntityMetadataType::VarInt);\n\n\t\t\t// The following expression makes Minecarts shake more with less health or higher damage taken\n\t\t\tauto & Minecart = static_cast<const cMinecart &>(a_Entity);\n\t\t\tauto maxHealth = a_Entity.GetMaxHealth();\n\t\t\tauto curHealth = a_Entity.GetHealth();\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>((maxHealth - curHealth) * Minecart.LastDamage() * 4));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartShakingDirection, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(1);  // (doesn't seem to effect anything)\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartShakingMultiplier, EntityMetadataType::Float);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Minecart.LastDamage() + 10));  // or damage taken\n\n\t\t\tif (Minecart.GetPayload() == cMinecart::mpNone)\n\t\t\t{\n\t\t\t\tauto & RideableMinecart = static_cast<const cRideableMinecart &>(Minecart);\n\t\t\t\tconst cItem & MinecartContent = RideableMinecart.GetContent();\n\t\t\t\tif (!MinecartContent.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartBlockIDMeta, EntityMetadataType::VarInt);\n\t\t\t\t\tint Content = MinecartContent.m_ItemType;\n\t\t\t\t\tContent |= MinecartContent.m_ItemDamage << 8;\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Content));\n\n\t\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartBlockY, EntityMetadataType::VarInt);\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(RideableMinecart.GetBlockHeight()));\n\n\t\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartShowBlock, EntityMetadataType::Boolean);\n\t\t\t\t\ta_Pkt.WriteBool(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Minecart.GetPayload() == cMinecart::mpFurnace)\n\t\t\t{\n\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartFurnacePowered, EntityMetadataType::Boolean);\n\t\t\t\ta_Pkt.WriteBool(static_cast<const cMinecartWithFurnace &>(Minecart).IsFueled());\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etMinecart\n\n\t\tcase cEntity::etProjectile:\n\t\t{\n\t\t\tauto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase cProjectileEntity::pkArrow:\n\t\t\t\t{\n\t\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ArrowFlags, EntityMetadataType::Byte);\n\t\t\t\t\ta_Pkt.WriteBEInt8(static_cast<const cArrowEntity &>(Projectile).IsCritical() ? 1 : 0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkFirework:\n\t\t\t\t{\n\t\t\t\t\t// TODO\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkSplashPotion:\n\t\t\t\t{\n\t\t\t\t\t// TODO\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etProjectile\n\n\t\tcase cEntity::etMonster:\n\t\t{\n\t\t\tWriteMobMetadata(a_Pkt, static_cast<const cMonster &>(a_Entity));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntity::etBoat:\n\t\t{\n\t\t\tauto & Boat = static_cast<const cBoat &>(a_Entity);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatLastHitTime, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetLastDamage()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatForwardDirection, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetForwardDirection()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatDamageTaken, EntityMetadataType::Float);\n\t\t\ta_Pkt.WriteBEFloat(Boat.GetDamageTaken());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatType, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetMaterial()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatRightPaddleTurning, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Boat.IsRightPaddleUsed());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatLeftPaddleTurning, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(static_cast<bool>(Boat.IsLeftPaddleUsed()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatSplashTimer, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(0);\n\n\t\t\tbreak;\n\t\t}  // case etBoat\n\n\t\tcase cEntity::etItemFrame:\n\t\t{\n\t\t\tconst auto & Frame = static_cast<const cItemFrame &>(a_Entity);\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ItemFrameItem, EntityMetadataType::Item);\n\t\t\tWriteItem(a_Pkt, Frame.GetItem());\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ItemFrameRotation, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(Frame.GetItemRotation());\n\t\t\tbreak;\n\t\t}  // case etItemFrame\n\n\t\tcase cEntity::etEnderCrystal:\n\t\t{\n\t\t\tconst auto & EnderCrystal = static_cast<const cEnderCrystal &>(a_Entity);\n\t\t\tif (EnderCrystal.DisplaysBeam())\n\t\t\t{\n\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EnderCrystalBeamTarget, EntityMetadataType::OptPosition);\n\t\t\t\ta_Pkt.WriteBool(true);  // Dont do a second check if it should display the beam\n\t\t\t\ta_Pkt.WriteXYZPosition64(EnderCrystal.GetBeamTarget());\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EnderCrystalShowBottom, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(EnderCrystal.ShowsBottom());\n\t\t\tbreak;\n\t\t}  // case etEnderCrystal\n\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_13::WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) const\n{\n\tshort ItemType = a_Item.m_ItemType;\n\tASSERT(ItemType >= -1);  // Check validity of packets in debug runtime\n\tif (ItemType <= 0)\n\t{\n\t\t// Fix, to make sure no invalid values are sent.\n\t\tItemType = -1;\n\t}\n\n\tif (a_Item.IsEmpty())\n\t{\n\t\ta_Pkt.WriteBEInt16(-1);\n\t\treturn;\n\t}\n\n\t// Normal item\n\ta_Pkt.WriteBEInt16(static_cast<Int16>(GetProtocolItemType(a_Item.m_ItemType, a_Item.m_ItemDamage)));\n\ta_Pkt.WriteBEInt8(a_Item.m_ItemCount);\n\n\t// TODO: NBT\n\ta_Pkt.WriteBEInt8(0);\n}\n\n\n\n\n\nvoid cProtocol_1_13::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const\n{\n\t// Living Enitiy Metadata\n\tif (a_Mob.HasCustomName())\n\t{\n\t\t// TODO: As of 1.9 _all_ entities can have custom names; should this be moved up?\n\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EntityCustomName, EntityMetadataType::OptChat);\n\t\ta_Pkt.WriteBool(true);\n\t\ta_Pkt.WriteString(a_Mob.GetCustomName());\n\n\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EntityCustomNameVisible, EntityMetadataType::Boolean);\n\t\ta_Pkt.WriteBool(a_Mob.IsCustomNameAlwaysVisible());\n\t}\n\n\tWriteEntityMetadata(a_Pkt, EntityMetadata::LivingHealth, EntityMetadataType::Float);\n\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\n\tswitch (a_Mob.GetMobType())\n\t{\n\t\tcase mtBat:\n\t\t{\n\t\t\tauto & Bat = static_cast<const cBat &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BatHanging, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(Bat.IsHanging() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtBat\n\n\t\tcase mtChicken:\n\t\t{\n\t\t\tauto & Chicken = static_cast<const cChicken &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Chicken.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtChicken\n\n\t\tcase mtCow:\n\t\t{\n\t\t\tauto & Cow = static_cast<const cCow &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Cow.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtCow\n\n\t\tcase mtCreeper:\n\t\t{\n\t\t\tauto & Creeper = static_cast<const cCreeper &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::CreeperState, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(Creeper.IsBlowing() ? 1 : static_cast<UInt32>(-1));  // (idle or \"blowing\")\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::CreeperPowered, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Creeper.IsCharged());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::CreeperIgnited, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Creeper.IsBurnedWithFlintAndSteel());\n\t\t\tbreak;\n\t\t}  // case mtCreeper\n\n\t\tcase mtEnderman:\n\t\t{\n\t\t\tauto & Enderman = static_cast<const cEnderman &>(a_Mob);\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EndermanCarriedBlock, EntityMetadataType::OptBlockID);\n\t\t\tUInt32 Carried = 0;\n\t\t\tCarried |= static_cast<UInt32>(Enderman.GetCarriedBlock() << 4);\n\t\t\tCarried |= Enderman.GetCarriedMeta();\n\t\t\ta_Pkt.WriteVarInt32(Carried);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EndermanScreaming, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Enderman.IsScreaming());\n\t\t\tbreak;\n\t\t}  // case mtEnderman\n\n\t\tcase mtGhast:\n\t\t{\n\t\t\tauto & Ghast = static_cast<const cGhast &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::GhastAttacking, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Ghast.IsCharging());\n\t\t\tbreak;\n\t\t}  // case mtGhast\n\n\t\tcase mtHorse:\n\t\t{\n\t\t\t// XXX This behaves incorrectly with different varients; horses have different entity IDs now\n\n\t\t\t// Abstract horse\n\t\t\tauto & Horse = static_cast<const cHorse &>(a_Mob);\n\n\t\t\tInt8 Flags = 0;\n\t\t\tif (Horse.IsTame())\n\t\t\t{\n\t\t\t\tFlags |= 0x02;\n\t\t\t}\n\t\t\tif (Horse.IsSaddled())\n\t\t\t{\n\t\t\t\tFlags |= 0x04;\n\t\t\t}\n\t\t\tif (Horse.IsInLoveCooldown())\n\t\t\t{\n\t\t\t\tFlags |= 0x08;\n\t\t\t}\n\t\t\tif (Horse.IsEating())\n\t\t\t{\n\t\t\t\tFlags |= 0x10;\n\t\t\t}\n\t\t\tif (Horse.IsRearing())\n\t\t\t{\n\t\t\t\tFlags |= 0x20;\n\t\t\t}\n\t\t\tif (Horse.IsMthOpen())\n\t\t\t{\n\t\t\t\tFlags |= 0x40;\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AbstractHorseFlags, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(Flags);\n\n\t\t\t// Regular horses\n\t\t\tint Appearance = 0;\n\t\t\tAppearance = Horse.GetHorseColor();\n\t\t\tAppearance |= Horse.GetHorseStyle() << 8;\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::HorseVariant, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Appearance));  // Color / style\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::HorseArmour, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseArmour()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Horse.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtHorse\n\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\tauto & MagmaCube = static_cast<const cMagmaCube &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::SlimeSize, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(MagmaCube.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtMagmaCube\n\n\t\tcase mtOcelot:\n\t\t{\n\t\t\tauto & Ocelot = static_cast<const cOcelot &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Ocelot.IsBaby());\n\n\t\t\tInt8 OcelotStatus = 0;\n\t\t\tif (Ocelot.IsSitting())\n\t\t\t{\n\t\t\t\tOcelotStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Ocelot.IsTame())\n\t\t\t{\n\t\t\t\tOcelotStatus |= 0x4;\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::TameableAnimalFlags, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(OcelotStatus);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::OcelotType, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Ocelot.GetOcelotType()));\n\n\t\t\tbreak;\n\t\t}  // case mtOcelot\n\n\t\tcase mtPig:\n\t\t{\n\t\t\tauto & Pig = static_cast<const cPig &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Pig.IsBaby());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::PigHasSaddle, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Pig.IsSaddled());\n\n\t\t\t// PIG_TOTAL_CARROT_ON_A_STICK_BOOST in 1.11.1 only\n\t\t\tbreak;\n\t\t}  // case mtPig\n\n\t\tcase mtRabbit:\n\t\t{\n\t\t\tauto & Rabbit = static_cast<const cRabbit &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Rabbit.IsBaby());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::RabbitType, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Rabbit.GetRabbitType()));\n\t\t\tbreak;\n\t\t}  // case mtRabbit\n\n\t\tcase mtSheep:\n\t\t{\n\t\t\tauto & Sheep = static_cast<const cSheep &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Sheep.IsBaby());\n\n\t\t\tInt8 SheepMetadata = 0;\n\t\t\tSheepMetadata = static_cast<Int8>(Sheep.GetFurColor());\n\t\t\tif (Sheep.IsSheared())\n\t\t\t{\n\t\t\t\tSheepMetadata |= 0x10;\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::SheepFlags, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(SheepMetadata);\n\t\t\tbreak;\n\t\t}  // case mtSheep\n\n\t\tcase mtSkeleton:\n\t\t{\n\t\t\tauto & Skeleton = static_cast<const cSkeleton &>(a_Mob);\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::LivingActiveHand, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AbstractSkeletonArmsSwinging, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Skeleton.IsChargingBow());\n\t\t\tbreak;\n\t\t}  // case mtSkeleton\n\n\t\tcase mtSlime:\n\t\t{\n\t\t\tauto & Slime = static_cast<const cSlime &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::SlimeSize, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Slime.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtSlime\n\n\t\tcase mtVillager:\n\t\t{\n\t\t\tauto & Villager = static_cast<const cVillager &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Villager.IsBaby());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::VillagerProfession, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Villager.GetVilType()));\n\t\t\tbreak;\n\t\t}  // case mtVillager\n\n\t\tcase mtWitch:\n\t\t{\n\t\t\tauto & Witch = static_cast<const cWitch &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WitchAggresive, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Witch.IsAngry());\n\t\t\tbreak;\n\t\t}  // case mtWitch\n\n\t\tcase mtWither:\n\t\t{\n\t\t\tauto & Wither = static_cast<const cWither &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WitherInvulnerableTimer, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(Wither.GetWitherInvulnerableTicks());\n\n\t\t\t// TODO: Use boss bar packet for health\n\t\t\tbreak;\n\t\t}  // case mtWither\n\n\t\tcase mtWolf:\n\t\t{\n\t\t\tauto & Wolf = static_cast<const cWolf &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBaby());\n\n\t\t\tInt8 WolfStatus = 0;\n\t\t\tif (Wolf.IsSitting())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Wolf.IsAngry())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x2;\n\t\t\t}\n\t\t\tif (Wolf.IsTame())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x4;\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::TameableAnimalFlags, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(WolfStatus);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WolfDamageTaken, EntityMetadataType::Float);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));  // TODO Not use the current health\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WolfBegging, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBegging());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WolfCollarColour, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Wolf.GetCollarColor()));\n\t\t\tbreak;\n\t\t}  // case mtWolf\n\n\t\tcase mtZombie:\n\t\t{\n\t\t\t// XXX Zombies were also split into new sublcasses; this doesn't handle that.\n\n\t\t\tauto & Zombie = static_cast<const cZombie &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ZombieIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Zombie.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombie\n\n\t\tcase mtZombiePigman:\n\t\t{\n\t\t\tauto & ZombiePigman = static_cast<const cZombiePigman &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(ZombiePigman.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombiePigman\n\n\t\tcase mtBlaze:\n\t\tcase mtEnderDragon:\n\t\tcase mtIronGolem:\n\t\tcase mtSnowGolem:\n\t\tcase mtSpider:\n\t\tcase mtZombieVillager:\n\n\t\tcase mtElderGuardian:\n\t\tcase mtGuardian:\n\t\t{\n\t\t\t// TODO: Mobs with extra fields that aren't implemented\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCat:\n\n\t\tcase mtCod:\n\n\t\tcase mtDolphin:\n\n\t\tcase mtDonkey:\n\n\t\tcase mtDrowned:\n\n\t\tcase mtEvoker:\n\n\t\tcase mtIllusioner:\n\n\t\tcase mtLlama:\n\n\t\tcase mtMule:\n\n\t\tcase mtParrot:\n\n\t\tcase mtPhantom:\n\n\t\tcase mtPolarBear:\n\n\t\tcase mtPufferfish:\n\n\t\tcase mtSalmon:\n\n\t\tcase mtShulker:\n\n\t\tcase mtStray:\n\n\t\tcase mtSkeletonHorse:\n\t\tcase mtZombieHorse:\n\n\t\tcase mtTropicalFish:\n\n\t\tcase mtTurtle:\n\n\t\tcase mtVex:\n\n\t\tcase mtVindicator:\n\n\t\tcase mtHusk:\n\t\t{\n\t\t\t// Todo: Mobs not added yet. Grouped ones have the same metadata\n\t\t\tASSERT(!\"cProtocol_1_13::WriteMobMetadata: received unimplemented type\");\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtMooshroom:\n\t\tcase mtCaveSpider:\n\t\t{\n\t\t\t// Not mentioned on http://wiki.vg/Entities\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtEndermite:\n\t\tcase mtGiant:\n\t\tcase mtSilverfish:\n\t\tcase mtSquid:\n\t\tcase mtWitherSkeleton:\n\t\t{\n\t\t\t// Mobs with no extra fields\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: UNREACHABLE(\"cProtocol_1_13::WriteMobMetadata: received mob of invalid type\");\n\t}  // switch (a_Mob.GetType())\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_13_1:\n\nvoid cProtocol_1_13_1::SendBossBarAdd(UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBossBar);\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_UniqueID);\n\tPkt.WriteVarInt32(0);  // Add\n\tPkt.WriteString(a_Title.CreateJsonString());\n\tPkt.WriteBEFloat(a_FractionFilled);\n\tPkt.WriteVarInt32([a_Color]\n\t{\n\t\tswitch (a_Color)\n\t\t{\n\t\t\tcase BossBarColor::Pink: return 0U;\n\t\t\tcase BossBarColor::Blue: return 1U;\n\t\t\tcase BossBarColor::Red: return 2U;\n\t\t\tcase BossBarColor::Green: return 3U;\n\t\t\tcase BossBarColor::Yellow: return 4U;\n\t\t\tcase BossBarColor::Purple: return 5U;\n\t\t\tcase BossBarColor::White: return 6U;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported boss bar property\");\n\t}());\n\tPkt.WriteVarInt32([a_DivisionType]\n\t{\n\t\tswitch (a_DivisionType)\n\t\t{\n\t\t\tcase BossBarDivisionType::None: return 0U;\n\t\t\tcase BossBarDivisionType::SixNotches: return 1U;\n\t\t\tcase BossBarDivisionType::TenNotches: return 2U;\n\t\t\tcase BossBarDivisionType::TwelveNotches: return 3U;\n\t\t\tcase BossBarDivisionType::TwentyNotches: return 4U;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported boss bar property\");\n\t}());\n\t{\n\t\tUInt8 Flags = 0x00;\n\t\tif (a_DarkenSky)\n\t\t{\n\t\t\tFlags |= 0x01;\n\t\t}\n\t\tif (a_PlayEndMusic)\n\t\t{\n\t\t\tFlags |= 0x02;\n\t\t}\n\t\tif (a_CreateFog)\n\t\t{\n\t\t\tFlags |= 0x04;  // Only difference to 1.9 is fog now a separate flag\n\t\t}\n\t\tPkt.WriteBEUInt8(Flags);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_13_1::SendBossBarUpdateFlags(UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBossBar);\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_UniqueID);\n\tPkt.WriteVarInt32(5);  // Update Flags\n\t{\n\t\tUInt8 Flags = 0x00;\n\t\tif (a_DarkenSky)\n\t\t{\n\t\t\tFlags |= 0x01;\n\t\t}\n\t\tif (a_PlayEndMusic)\n\t\t{\n\t\t\tFlags |= 0x02;\n\t\t}\n\t\tif (a_CreateFog)\n\t\t{\n\t\t\tFlags |= 0x04;  // Only difference to 1.9 is fog now a separate flag\n\t\t}\n\t\tPkt.WriteBEUInt8(Flags);\n\t}\n}\n\n\n\n\n\nstd::pair<short, short> cProtocol_1_13_1::GetItemFromProtocolID(UInt32 a_ProtocolID) const\n{\n\treturn PaletteUpgrade::ToItem(Palette_1_13_1::ToItem(a_ProtocolID));\n}\n\n\n\n\n\nUInt32 cProtocol_1_13_1::GetProtocolBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta) const\n{\n\treturn Palette_1_13_1::From(PaletteUpgrade::FromBlock(a_BlockType, a_Meta));\n}\n\n\n\n\n\nUInt32 cProtocol_1_13_1::GetProtocolItemType(short a_ItemID, short a_ItemDamage) const\n{\n\treturn Palette_1_13_1::From(PaletteUpgrade::FromItem(a_ItemID, a_ItemDamage));\n}\n\n\n\n\n\nUInt32 cProtocol_1_13_1::GetProtocolStatisticType(const CustomStatistic a_Statistic) const\n{\n\treturn Palette_1_13_1::From(a_Statistic);\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_13_1::GetProtocolVersion() const\n{\n\treturn Version::v1_13_1;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_13_2:\n\ncProtocol::Version cProtocol_1_13_2::GetProtocolVersion() const\n{\n\treturn Version::v1_13_2;\n}\n\n\n\n\n\nbool cProtocol_1_13_2::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) const\n{\n\tHANDLE_PACKET_READ(a_ByteBuffer, ReadBool, bool, Present);\n\tif (!Present)\n\t{\n\t\t// The item is empty, no more data follows\n\t\ta_Item.Empty();\n\t\treturn true;\n\t}\n\n\tHANDLE_PACKET_READ(a_ByteBuffer, ReadVarInt32, UInt32, ItemID);\n\tconst auto Translated = GetItemFromProtocolID(ItemID);\n\ta_Item.m_ItemType = Translated.first;\n\ta_Item.m_ItemDamage = Translated.second;\n\n\tHANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt8, Int8, ItemCount);\n\ta_Item.m_ItemCount = ItemCount;\n\tif (ItemCount <= 0)\n\t{\n\t\ta_Item.Empty();\n\t}\n\n\tContiguousByteBuffer Metadata;\n\tif (!a_ByteBuffer.ReadSome(Metadata, a_ByteBuffer.GetReadableSpace() - a_KeepRemainingBytes) || Metadata.empty() || (Metadata[0] == std::byte(0)))\n\t{\n\t\t// No metadata\n\t\treturn true;\n\t}\n\n\tParseItemMetadata(a_Item, Metadata);\n\treturn true;\n}\n\n\n\n\n\nvoid cProtocol_1_13_2::WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) const\n{\n\tshort ItemType = a_Item.m_ItemType;\n\tASSERT(ItemType >= -1);  // Check validity of packets in debug runtime\n\tif (ItemType <= 0)\n\t{\n\t\t// Fix, to make sure no invalid values are sent.\n\t\tItemType = -1;\n\t}\n\n\tif (a_Item.IsEmpty())\n\t{\n\t\ta_Pkt.WriteBool(false);\n\t\treturn;\n\t}\n\n\t// Item present\n\ta_Pkt.WriteBool(true);\n\n\t// Normal item\n\ta_Pkt.WriteVarInt32(GetProtocolItemType(a_Item.m_ItemType, a_Item.m_ItemDamage));\n\ta_Pkt.WriteBEInt8(a_Item.m_ItemCount);\n\n\t// TODO: NBT\n\ta_Pkt.WriteBEInt8(0);\n}\n"
  },
  {
    "path": "src/Protocol/Protocol_1_13.h",
    "content": "\n// Protocol_1_13.h\n\n/*\nDeclares the 1.13 protocol classes:\n\t- cProtocol_1_13\n\t\t- release 1.13 protocol (#393)\n\t- cProtocol_1_13_1\n\t\t- release 1.13.1 protocol (#401)\n\t- cProtocol_1_13_2\n\t\t- release 1.13.2 protocol (#404)\n*/\n\n\n\n\n\n#pragma once\n\n#include \"Protocol_1_12.h\"\n#include \"Packetizer.h\"\n#include \"Palettes/Upgrade.h\"\n\n\n\n\n\nclass cProtocol_1_13:\n\tpublic cProtocol_1_12_2\n{\n\tusing Super = cProtocol_1_12_2;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual void SendBlockChange                (Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;\n\tvirtual void SendBlockChanges               (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;\n\tvirtual void SendMapData                    (const cMap & a_Map, int a_DataStartX, int a_DataStartY) override;\n\tvirtual void SendPaintingSpawn              (const cPainting & a_Painting) override;\n\tvirtual void SendParticleEffect             (const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data) override;\n\tvirtual void SendScoreboardObjective        (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;\n\tvirtual void SendStatistics                 (const StatisticsManager & a_Manager) override;\n\tvirtual void SendTabCompletionResults       (const AStringVector & a_Results) override;\n\tvirtual void SendUpdateBlockEntity          (cBlockEntity & a_BlockEntity) override;\n\tvirtual UInt8 GetEntityMetadataID(EntityMetadata a_Metadata) const;\n\tvirtual UInt8 GetEntityMetadataID(EntityMetadataType a_FieldType) const;\n\tvirtual std::pair<short, short> GetItemFromProtocolID(UInt32 a_ProtocolID) const;\n\tvirtual UInt32 GetPacketID(ePacketType a_PacketType) const override;\n\tvirtual UInt32 GetProtocolBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta) const;\n\tvirtual signed char GetProtocolEntityStatus(EntityAnimation a_Animation) const override;\n\tvirtual UInt32 GetProtocolItemType(short a_ItemID, short a_ItemDamage) const;\n\tvirtual UInt32 GetProtocolMobType(eMonsterType a_MobType) const override;\n\tvirtual UInt32 GetProtocolStatisticType(CustomStatistic a_Statistic) const;\n\tvirtual Version GetProtocolVersion() const override;\n\n\tvirtual bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) override;\n\tvirtual void HandlePacketNameItem(cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketPluginMessage(cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketSetBeaconEffect(cByteBuffer & a_ByteBuffer);\n\tvirtual void HandleVanillaPluginMessage(cByteBuffer & a_ByteBuffer, std::string_view a_Channel) override;\n\n\tvirtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) const override;\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, EntityMetadata a_Metadata, EntityMetadataType a_FieldType) const;\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const override;\n\tvirtual void WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) const override;\n\tvirtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const override;\n};\n\n\n\n\n\nclass cProtocol_1_13_1 :\n\tpublic cProtocol_1_13\n{\n\tusing Super = cProtocol_1_13;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual void SendBossBarAdd(UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog) override;\n\tvirtual void SendBossBarUpdateFlags(UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog) override;\n\n\tvirtual std::pair<short, short> GetItemFromProtocolID(UInt32 a_ProtocolID) const override;\n\tvirtual UInt32 GetProtocolBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta) const override;\n\tvirtual UInt32 GetProtocolItemType(short a_ItemID, short a_ItemDamage) const override;\n\tvirtual UInt32 GetProtocolStatisticType(CustomStatistic a_Statistic) const override;\n\tvirtual Version GetProtocolVersion() const override;\n};\n\n\n\n\n\nclass cProtocol_1_13_2 :\n\tpublic cProtocol_1_13_1\n{\n\tusing Super = cProtocol_1_13_1;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual Version GetProtocolVersion() const override;\n\tvirtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) const override;\n\tvirtual void WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) const override;\n};\n"
  },
  {
    "path": "src/Protocol/Protocol_1_14.cpp",
    "content": "\n// Protocol_1_14.cpp\n\n/*\nImplements the 1.14 protocol classes:\n- release 1.14 protocol (#477)\n*/\n\n#include \"Globals.h\"\n#include \"Protocol_1_14.h\"\n#include \"Packetizer.h\"\n#include \"JsonUtils.h\"\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../World.h\"\n#include \"../UI/HorseWindow.h\"\n#include \"../ClientHandle.h\"\n#include \"../WorldStorage/FastNBT.h\"\n#include \"../BlockEntities/BlockEntity.h\"\n\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Mobs/Bat.h\"\n#include \"../Entities/Boat.h\"\n#include \"../Mobs/Chicken.h\"\n#include \"../Mobs/Cow.h\"\n#include \"../Mobs/Creeper.h\"\n#include \"../Entities/EnderCrystal.h\"\n#include \"../Mobs/Enderman.h\"\n#include \"../Mobs/Ghast.h\"\n#include \"../Mobs/Horse.h\"\n#include \"../Mobs/MagmaCube.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Mobs/Ocelot.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Mobs/Pig.h\"\n#include \"../Entities/Player.h\"\n#include \"../Mobs/Rabbit.h\"\n#include \"../Mobs/Sheep.h\"\n#include \"../Mobs/Skeleton.h\"\n#include \"../Mobs/Slime.h\"\n#include \"../Mobs/Villager.h\"\n#include \"../Mobs/Wolf.h\"\n#include \"../Mobs/Wither.h\"\n#include \"../Mobs/Zombie.h\"\n#include \"../Mobs/ZombiePigman.h\"\n\n#include \"Palettes/Upgrade.h\"\n#include \"Palettes/Palette_1_14.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_14:\n\nvoid cProtocol_1_14::SendBlockAction(Vector3i a_BlockPos, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBlockAction);\n\tPkt.WriteXZYPosition64(a_BlockPos);\n\tPkt.WriteBEInt8(a_Byte1);\n\tPkt.WriteBEInt8(a_Byte2);\n\tPkt.WriteVarInt32(a_BlockType);\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendBlockBreakAnim(UInt32 a_EntityID, Vector3i a_BlockPos, char a_Stage)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBlockBreakAnim);\n\tPkt.WriteVarInt32(a_EntityID);\n\tPkt.WriteXZYPosition64(a_BlockPos);\n\tPkt.WriteBEInt8(a_Stage);\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendBlockChange(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tcPacketizer Pkt(*this, pktBlockChange);\n\tPkt.WriteXZYPosition64(a_BlockPos);\n\tPkt.WriteVarInt32(GetProtocolBlockType(a_BlockType, a_BlockMeta));\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendEditSign(Vector3i a_BlockPos)\n{\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendEntityAnimation(const cEntity & a_Entity, EntityAnimation a_Animation)\n{\n\tif (a_Animation == EntityAnimation::PlayerEntersBed)\n\t{\n\t\t// Use Bed packet removed, through metadata instead:\n\t\tSendEntityMetadata(a_Entity);\n\t\treturn;\n\t}\n\n\tSuper::SendEntityAnimation(a_Entity, a_Animation);\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendEntitySpawn(const cEntity & a_Entity, const UInt8 a_ObjectType, const Int32 a_ObjectData)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSpawnObject);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_Entity.GetUniqueID());\n\n\tPkt.WriteVarInt32(a_ObjectType);\n\tPkt.WriteBEDouble(a_Entity.GetPosX());\n\tPkt.WriteBEDouble(a_Entity.GetPosY());\n\tPkt.WriteBEDouble(a_Entity.GetPosZ());\n\tPkt.WriteByteAngle(a_Entity.GetPitch());\n\tPkt.WriteByteAngle(a_Entity.GetYaw());\n\tPkt.WriteBEInt32(a_ObjectData);\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedX() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedY() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedZ() * 400));\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendLogin(const cPlayer & a_Player, const cWorld & a_World)\n{\n\t// Send the Join Game packet:\n\t{\n\t\tcServer * Server = cRoot::Get()->GetServer();\n\t\tcPacketizer Pkt(*this, pktJoinGame);\n\t\tPkt.WriteBEUInt32(a_Player.GetUniqueID());\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Player.GetEffectiveGameMode()) | (Server->IsHardcore() ? 0x08 : 0));\n\t\tPkt.WriteBEInt32(static_cast<Int32>(a_World.GetDimension()));\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(Clamp<size_t>(Server->GetMaxPlayers(), 0, 255)));\n\t\tPkt.WriteString(\"default\");\n\t\tPkt.WriteVarInt32(ToUnsigned(a_World.GetMaxViewDistance()));\n\t\tPkt.WriteBool(false);\n\t}\n\n\t// Send the spawn position:\n\t{\n\t\tcPacketizer Pkt(*this, pktSpawnPosition);\n\t\tPkt.WriteXZYPosition64(a_World.GetSpawnX(), a_World.GetSpawnY(), a_World.GetSpawnZ());\n\t}\n\n\t// Send the server difficulty:\n\t{\n\t\tcPacketizer Pkt(*this, pktDifficulty);\n\t\tPkt.WriteBEInt8(1);\n\t\tPkt.WriteBool(false);  // Difficulty locked?\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendMapData(const cMap & a_Map, int a_DataStartX, int a_DataStartY)\n{\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendPaintingSpawn(const cPainting & a_Painting)\n{\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendParticleEffect(const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tconst auto ParticleID = GetProtocolParticleID(a_ParticleName);\n\n\tcPacketizer Pkt(*this, pktParticleEffect);\n\tPkt.WriteBEInt32(ParticleID);\n\tPkt.WriteBool(false);\n\tPkt.WriteBEFloat(a_Src.x);\n\tPkt.WriteBEFloat(a_Src.y);\n\tPkt.WriteBEFloat(a_Src.z);\n\tPkt.WriteBEFloat(a_Offset.x);\n\tPkt.WriteBEFloat(a_Offset.y);\n\tPkt.WriteBEFloat(a_Offset.z);\n\tPkt.WriteBEFloat(a_ParticleData);\n\tPkt.WriteBEInt32(a_ParticleAmount);\n\n\tswitch (ParticleID)\n\t{\n\t\t// blockdust\n\t\tcase 3:\n\t\t{\n\t\t\tPkt.WriteVarInt32(static_cast<UInt32>(a_Data[0]));\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendRespawn(eDimension a_Dimension)\n{\n\tcPacketizer Pkt(*this, pktRespawn);\n\tcPlayer * Player = m_Client->GetPlayer();\n\tPkt.WriteBEInt32(static_cast<Int32>(a_Dimension));\n\tPkt.WriteBEUInt8(static_cast<Byte>(Player->GetEffectiveGameMode()));\n\tPkt.WriteString(\"default\");\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendSoundParticleEffect(const EffectID a_EffectID, Vector3i a_Origin, int a_Data)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\t// Note: Particles from block break missing\n\n\tcPacketizer Pkt(*this, pktSoundParticleEffect);\n\tPkt.WriteBEInt32(static_cast<int>(a_EffectID));\n\tPkt.WriteXYZPosition64(a_Origin);\n\tPkt.WriteBEInt32(a_Data);\n\tPkt.WriteBool(false);\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tByte Action;\n\tswitch (a_BlockEntity.GetBlockType())\n\t{\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\t{\n\t\t\t// The ones with a action of 0 is just a workaround to send the block entities to a client.\n\t\t\t// Todo: 18.09.2020 - remove this when block entities are transmitted in the ChunkData packet - 12xx12\n\t\t\tAction = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_MOB_SPAWNER:       Action = 1;  break;  // Update mob spawner spinny mob thing\n\t\tcase E_BLOCK_COMMAND_BLOCK:     Action = 2;  break;  // Update command block text\n\t\tcase E_BLOCK_BEACON:            Action = 3;  break;  // Update beacon entity\n\t\tcase E_BLOCK_HEAD:              Action = 4;  break;  // Update Mobhead entity\n\t\t// case E_BLOCK_CONDUIT:        Action = 5;  break;  // Update Conduit entity\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_WALL_BANNER:       Action = 6;  break;  // Update banner entity\n\t\t// case Structure Block:        Action = 7;  break;  // Update Structure tile entity\n\t\tcase E_BLOCK_END_GATEWAY:       Action = 8;  break;  // Update destination for a end gateway entity\n\t\tcase E_BLOCK_SIGN_POST:         Action = 9;  break;  // Update sign entity\n\t\t// case E_BLOCK_SHULKER_BOX:    Action = 10; break;  // sets shulker box - not used just here if anyone is confused from reading the protocol wiki\n\t\tcase E_BLOCK_BED:               Action = 11; break;  // Update bed color\n\t\t// case E_BLOCK_JIGSAW:         Action = 12; break;\n\t\t// case E_BLOCK_CAMPFIRE:       Action = 13; break;\n\n\t\tdefault: return;  // Block entities change between versions\n\t}\n\n\tcPacketizer Pkt(*this, pktUpdateBlockEntity);\n\tPkt.WriteXZYPosition64(a_BlockEntity.GetPosX(), a_BlockEntity.GetPosY(), a_BlockEntity.GetPosZ());\n\tPkt.WriteBEUInt8(Action);\n\n\tcFastNBTWriter Writer;\n\tWriteBlockEntity(Writer, a_BlockEntity);\n\tWriter.Finish();\n\tPkt.WriteBuf(Writer.GetResult());\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendUpdateSign(Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4)\n{\n}\n\n\n\n\n\nvoid cProtocol_1_14::SendWindowOpen(const cWindow & a_Window)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tif (a_Window.GetWindowType() < 0)\n\t{\n\t\t// Do not send this packet for player inventory windows\n\t\treturn;\n\t}\n\n\tif (a_Window.GetWindowType() == cWindow::wtAnimalChest)\n\t{\n\t\tcPacketizer Pkt(*this, pktHorseWindowOpen);\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Window.GetWindowID()));\n\t\tPkt.WriteVarInt32(static_cast<UInt32>(a_Window.GetNumSlots()));\n\n\t\tUInt32 HorseID = static_cast<const cHorseWindow &>(a_Window).GetHorseID();\n\t\tPkt.WriteBEInt32(static_cast<Int32>(HorseID));\n\t}\n\telse\n\t{\n\t\tcPacketizer Pkt(*this, pktWindowOpen);\n\t\tPkt.WriteVarInt32(static_cast<UInt8>(a_Window.GetWindowID()));\n\n\t\tswitch (a_Window.GetWindowType())\n\t\t{\n\t\t\tcase cWindow::wtChest:\n\t\t\t{\n\t\t\t\t// Chests can have multiple size\n\t\t\t\tPkt.WriteVarInt32(static_cast<UInt32>(a_Window.GetNumNonInventorySlots() / 9 - 1));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtDropper:\n\t\t\tcase cWindow::wtDropSpenser:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(6);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtAnvil:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(7);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtBeacon:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(8);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtBrewery:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(10);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtWorkbench:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(11);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtEnchantment:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(12);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtFurnace:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(13);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/*\n\t\t\tcase cWindow::wtGrindstone:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(14);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t*/\n\t\t\tcase cWindow::wtHopper:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(15);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/*\n\t\t\tcase cWindow::wtLectern:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(16);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtLoom:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(17);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t*/\n\t\t\tcase cWindow::wtNPCTrade:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(18);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/*\n\t\t\tcase cWindow::wtShulker:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(19);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtSmoker:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(20);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtCartography:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(21);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase cWindow::wtStonecutter:\n\t\t\t{\n\t\t\t\tPkt.WriteVarInt32(22);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t*/\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Window.GetNumNonInventorySlots()));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tPkt.WriteString(JsonUtils::SerializeSingleValueJsonObject(\"text\", a_Window.GetWindowTitle()));\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_14::GetPacketID(ePacketType a_PacketType) const\n{\n\tswitch (a_PacketType)\n\t{\n\t\tcase cProtocol::pktAttachEntity:         return 0x4A;\n\t\tcase cProtocol::pktCameraSetTo:          return 0x3E;\n\t\tcase cProtocol::pktCollectEntity:        return 0x55;\n\t\tcase cProtocol::pktDestroyEntity:        return 0x37;\n\t\tcase cProtocol::pktDisconnectDuringGame: return 0x1A;\n\t\tcase cProtocol::pktEntityEffect:         return 0x59;\n\t\tcase cProtocol::pktEntityEquipment:      return 0x46;\n\t\tcase cProtocol::pktEntityHeadLook:       return 0x3B;\n\t\tcase cProtocol::pktEntityMeta:           return 0x43;\n\t\tcase cProtocol::pktEntityProperties:     return 0x58;\n\t\tcase cProtocol::pktEntityStatus:         return 0x1B;\n\t\tcase cProtocol::pktEntityVelocity:       return 0x45;\n\t\tcase cProtocol::pktExperience:           return 0x47;\n\t\tcase cProtocol::pktExplosion:            return 0x1C;\n\t\tcase cProtocol::pktGameMode:             return 0x1E;\n\t\tcase cProtocol::pktHeldItemChange:       return 0x3F;\n\t\tcase cProtocol::pktHorseWindowOpen:      return 0x1F;\n\t\tcase cProtocol::pktInventorySlot:        return 0x16;\n\t\tcase cProtocol::pktKeepAlive:            return 0x20;\n\t\tcase cProtocol::pktParticleEffect:       return 0x23;\n\t\tcase cProtocol::pktPlayerAbilities:      return 0x31;\n\t\tcase cProtocol::pktPlayerList:           return 0x33;\n\t\tcase cProtocol::pktPlayerMoveLook:       return 0x35;\n\t\tcase cProtocol::pktPluginMessage:        return 0x18;\n\t\tcase cProtocol::pktRemoveEntityEffect:   return 0x38;\n\t\tcase cProtocol::pktResourcePack:         return 0x39;\n\t\tcase cProtocol::pktRespawn:              return 0x3A;\n\t\tcase cProtocol::pktScoreboardObjective:  return 0x49;\n\t\tcase cProtocol::pktSoundEffect:          return 0x19;\n\t\tcase cProtocol::pktSoundParticleEffect:  return 0x22;\n\t\tcase cProtocol::pktSpawnPosition:        return 0x4D;\n\t\tcase cProtocol::pktTeleportEntity:       return 0x56;\n\t\tcase cProtocol::pktTimeUpdate:           return 0x4E;\n\t\tcase cProtocol::pktTitle:                return 0x4F;\n\t\tcase cProtocol::pktUnloadChunk:          return 0x1D;\n\t\tcase cProtocol::pktUnlockRecipe:         return 0x36;\n\t\tcase cProtocol::pktUpdateHealth:         return 0x48;\n\t\tcase cProtocol::pktUpdateScore:          return 0x4C;\n\t\tcase cProtocol::pktUpdateSign:           return 0x2F;\n\t\tcase cProtocol::pktWeather:              return 0x1E;\n\t\tcase cProtocol::pktWindowItems:          return 0x14;\n\t\tcase cProtocol::pktWindowOpen:           return 0x2E;\n\t\tcase cProtocol::pktWindowProperty:       return 0x15;\n\t\tdefault: return Super::GetPacketID(a_PacketType);\n\t}\n}\n\n\n\n\n\nUInt8 cProtocol_1_14::GetEntityMetadataID(EntityMetadata a_Metadata) const\n{\n\tconst UInt8 Entity = 7;\n\tconst UInt8 Living = Entity + 6;\n\tconst UInt8 Insentient = Living + 1;\n\tconst UInt8 Ageable = Insentient + 1;\n\tconst UInt8 AbstractHorse = Ageable + 2;\n\tconst UInt8 ChestedHorse = AbstractHorse + 1;\n\tconst UInt8 TameableAnimal = Ageable + 2;\n\tconst UInt8 Minecart = Entity + 6;\n\tconst UInt8 RaidParticipent = Insentient + 1;\n\n\tswitch (a_Metadata)\n\t{\n\t\tcase EntityMetadata::EntityFlags:                           return 0;\n\t\tcase EntityMetadata::EntityAir:                             return 1;\n\t\tcase EntityMetadata::EntityCustomName:                      return 2;\n\t\tcase EntityMetadata::EntityCustomNameVisible:               return 3;\n\t\tcase EntityMetadata::EntitySilent:                          return 4;\n\t\tcase EntityMetadata::EntityNoGravity:                       return 5;\n\t\tcase EntityMetadata::EntityPose:                            return 6;\n\t\tcase EntityMetadata::ThrowableItem:                         return Entity;\n\t\tcase EntityMetadata::PotionThrown:                          return Entity;\n\t\tcase EntityMetadata::FallingBlockPosition:                  return Entity;\n\t\tcase EntityMetadata::AreaEffectCloudRadius:                 return Entity;\n\t\tcase EntityMetadata::AreaEffectCloudColor:                  return Entity + 1;\n\t\tcase EntityMetadata::AreaEffectCloudSinglePointEffect:      return Entity + 2;\n\t\tcase EntityMetadata::AreaEffectCloudParticleId:             return Entity + 3;\n\t\tcase EntityMetadata::ArrowFlags:                            return Entity;\n\t\tcase EntityMetadata::PiercingLevel:                         return Entity + 2;\n\t\tcase EntityMetadata::TippedArrowColor:                      return Entity + 3;\n\t\tcase EntityMetadata::BoatLastHitTime:                       return Entity;\n\t\tcase EntityMetadata::BoatForwardDirection:                  return Entity + 1;\n\t\tcase EntityMetadata::BoatDamageTaken:                       return Entity + 2;\n\t\tcase EntityMetadata::BoatType:                              return Entity + 3;\n\t\tcase EntityMetadata::BoatLeftPaddleTurning:                 return Entity + 4;\n\t\tcase EntityMetadata::BoatRightPaddleTurning:                return Entity + 5;\n\t\tcase EntityMetadata::BoatSplashTimer:                       return Entity + 6;\n\t\tcase EntityMetadata::EnderCrystalBeamTarget:                return Entity;\n\t\tcase EntityMetadata::EnderCrystalShowBottom:                return Entity + 1;\n\t\tcase EntityMetadata::WitherSkullInvulnerable:               return Entity;\n\t\tcase EntityMetadata::FireworkInfo:                          return Entity;\n\t\tcase EntityMetadata::FireworkBoostedEntityId:               return Entity + 1;\n\t\tcase EntityMetadata::FireworkFromCrossbow:                  return Entity + 2;\n\t\tcase EntityMetadata::ItemFrameItem:                         return Entity;\n\t\tcase EntityMetadata::ItemFrameRotation:                     return Entity + 1;\n\t\tcase EntityMetadata::ItemItem:                              return Entity;\n\t\tcase EntityMetadata::LivingActiveHand:                      return Entity;\n\t\tcase EntityMetadata::LivingHealth:                          return Entity + 1;\n\t\tcase EntityMetadata::LivingPotionEffectColor:               return Entity + 2;\n\t\tcase EntityMetadata::LivingPotionEffectAmbient:             return Entity + 3;\n\t\tcase EntityMetadata::LivingNumberOfArrows:                  return Entity + 4;\n\t\tcase EntityMetadata::PlayerAdditionalHearts:                return Living;\n\t\tcase EntityMetadata::PlayerScore:                           return Living + 1;\n\t\tcase EntityMetadata::PlayerDisplayedSkinParts:              return Living + 2;\n\t\tcase EntityMetadata::PlayerMainHand:                        return Living + 3;\n\t\tcase EntityMetadata::ArmorStandStatus:                      return Living;\n\t\tcase EntityMetadata::ArmorStandHeadRotation:                return Living + 1;\n\t\tcase EntityMetadata::ArmorStandBodyRotation:                return Living + 2;\n\t\tcase EntityMetadata::ArmorStandLeftArmRotation:             return Living + 3;\n\t\tcase EntityMetadata::ArmorStandRightArmRotation:            return Living + 4;\n\t\tcase EntityMetadata::ArmorStandLeftLegRotation:             return Living + 5;\n\t\tcase EntityMetadata::ArmorStandRightLegRotation:            return Living + 6;\n\t\tcase EntityMetadata::InsentientFlags:                       return Living;\n\t\tcase EntityMetadata::BatHanging:                            return Insentient;\n\t\tcase EntityMetadata::AgeableIsBaby:                         return Insentient;\n\t\tcase EntityMetadata::AbstractHorseFlags:                    return Ageable;\n\t\tcase EntityMetadata::AbstractHorseOwner:                    return Ageable + 1;\n\t\tcase EntityMetadata::HorseVariant:                          return AbstractHorse;\n\t\tcase EntityMetadata::ChestedHorseChested:                   return AbstractHorse;\n\t\tcase EntityMetadata::LlamaStrength:                         return ChestedHorse;\n\t\tcase EntityMetadata::LlamaCarpetColor:                      return ChestedHorse + 1;\n\t\tcase EntityMetadata::LlamaVariant:                          return ChestedHorse + 2;\n\t\tcase EntityMetadata::PigHasSaddle:                          return Ageable;\n\t\tcase EntityMetadata::PigTotalCarrotOnAStickBoost:           return Ageable + 1;\n\t\tcase EntityMetadata::RabbitType:                            return Ageable;\n\t\tcase EntityMetadata::PolarBearStanding:                     return Ageable;\n\t\tcase EntityMetadata::SheepFlags:                            return Ageable;\n\t\tcase EntityMetadata::TameableAnimalFlags:                   return Ageable;\n\t\tcase EntityMetadata::TameableAnimalOwner:                   return Ageable + 1;\n\t\tcase EntityMetadata::OcelotType:                            return TameableAnimal;\n\t\tcase EntityMetadata::WolfDamageTaken:                       return TameableAnimal;\n\t\tcase EntityMetadata::WolfBegging:                           return TameableAnimal + 1;\n\t\tcase EntityMetadata::WolfCollarColour:                      return TameableAnimal + 2;\n\t\tcase EntityMetadata::VillagerProfession:                    return Ageable;\n\t\tcase EntityMetadata::IronGolemPlayerCreated:                return Insentient;\n\t\tcase EntityMetadata::ShulkerFacingDirection:                return Insentient;\n\t\tcase EntityMetadata::ShulkerAttachmentFallingBlockPosition: return Insentient + 1;\n\t\tcase EntityMetadata::ShulkerShieldHeight:                   return Insentient + 2;\n\t\tcase EntityMetadata::BlazeOnFire:                           return Insentient;\n\t\tcase EntityMetadata::CreeperState:                          return Insentient;\n\t\tcase EntityMetadata::CreeperPowered:                        return Insentient + 1;\n\t\tcase EntityMetadata::CreeperIgnited:                        return Insentient + 2;\n\t\tcase EntityMetadata::GuardianStatus:                        return Insentient;\n\t\tcase EntityMetadata::GuardianTarget:                        return Insentient + 1;\n\t\tcase EntityMetadata::IllagerFlags:                          return Insentient;\n\t\tcase EntityMetadata::SpeIlagerSpell:                        return Insentient + 1;\n\t\tcase EntityMetadata::VexFlags:                              return Insentient;\n\t\tcase EntityMetadata::AbstractSkeletonArmsSwinging:          return Insentient;\n\t\tcase EntityMetadata::SpiderClimbing:                        return Insentient;\n\t\tcase EntityMetadata::WitchAggresive:                        return Insentient;\n\t\tcase EntityMetadata::WitherFirstHeadTarget:                 return Insentient;\n\t\tcase EntityMetadata::WitherSecondHeadTarget:                return Insentient + 1;\n\t\tcase EntityMetadata::WitherThirdHeadTarget:                 return Insentient + 2;\n\t\tcase EntityMetadata::WitherInvulnerableTimer:               return Insentient + 3;\n\t\tcase EntityMetadata::ZombieIsBaby:                          return Insentient;\n\t\tcase EntityMetadata::ZombieHandsRisedUp:                    return Insentient + 2;\n\t\tcase EntityMetadata::ZombieVillagerConverting:              return Insentient + 4;\n\t\tcase EntityMetadata::ZombieVillagerProfession:              return Insentient + 5;\n\t\tcase EntityMetadata::EndermanCarriedBlock:                  return Insentient;\n\t\tcase EntityMetadata::EndermanScreaming:                     return Insentient + 1;\n\t\tcase EntityMetadata::EnderDragonDragonPhase:                return Insentient;\n\t\tcase EntityMetadata::GhastAttacking:                        return Insentient;\n\t\tcase EntityMetadata::SlimeSize:                             return Insentient;\n\t\tcase EntityMetadata::MinecartShakingPower:                  return Entity;\n\t\tcase EntityMetadata::MinecartShakingDirection:              return Entity + 1;\n\t\tcase EntityMetadata::MinecartShakingMultiplier:             return Entity + 2;\n\t\tcase EntityMetadata::MinecartBlockIDMeta:                   return Entity + 3;\n\t\tcase EntityMetadata::MinecartBlockY:                        return Entity + 4;\n\t\tcase EntityMetadata::MinecartShowBlock:                     return Entity + 5;\n\t\tcase EntityMetadata::MinecartCommandBlockCommand:           return Minecart;\n\t\tcase EntityMetadata::MinecartCommandBlockLastOutput:        return Minecart + 1;\n\t\tcase EntityMetadata::MinecartFurnacePowered:                return Minecart;\n\t\tcase EntityMetadata::TNTPrimedFuseTime:                     return Entity;\n\t\tcase EntityMetadata::TridentLoyaltyLevel:                   return Entity + 3;\n\t\tcase EntityMetadata::MooshroomType:                         return Ageable;\n\t\tcase EntityMetadata::WitchDrinking:                         return RaidParticipent;\n\n\t\tcase EntityMetadata::AreaEffectCloudParticleParameter1:\n\t\tcase EntityMetadata::AreaEffectCloudParticleParameter2:\n\t\tcase EntityMetadata::ZombieUnusedWasType: break;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\tUNREACHABLE(\"Retrieved invalid metadata for protocol\");\n}\n\n\n\n\n\nstd::pair<short, short> cProtocol_1_14::GetItemFromProtocolID(UInt32 a_ProtocolID) const\n{\n\treturn PaletteUpgrade::ToItem(Palette_1_14::ToItem(a_ProtocolID));\n}\n\n\n\n\n\nUInt32 cProtocol_1_14::GetProtocolBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta) const\n{\n\treturn Palette_1_14::From(PaletteUpgrade::FromBlock(a_BlockType, a_Meta));\n}\n\n\n\n\n\nsigned char cProtocol_1_14::GetProtocolEntityStatus(EntityAnimation a_Animation) const\n{\n\tswitch (a_Animation)\n\t{\n\t\tcase EntityAnimation::FoxChews: return 45;\n\t\tcase EntityAnimation::OcelotTrusts: return 40;\n\t\tcase EntityAnimation::OcelotDistrusts: return 41;\n\t\tcase EntityAnimation::PawnBerryBushPricks: return 44;\n\t\tcase EntityAnimation::PawnChestEquipmentBreaks: return 50;\n\t\tcase EntityAnimation::PawnFeetEquipmentBreaks: return 52;\n\t\tcase EntityAnimation::PawnHeadEquipmentBreaks: return 49;\n\t\tcase EntityAnimation::PawnLegsEquipmentBreaks: return 51;\n\t\tcase EntityAnimation::PawnMainHandEquipmentBreaks: return 47;\n\t\tcase EntityAnimation::PawnOffHandEquipmentBreaks: return 48;\n\t\tcase EntityAnimation::PawnTeleports: return 46;\n\t\tcase EntityAnimation::PlayerBadOmenActivates: return 43;\n\t\tcase EntityAnimation::RavagerAttacks: return 4;\n\t\tcase EntityAnimation::RavagerBecomesStunned: return 39;\n\t\tcase EntityAnimation::VillagerSweats: return 42;\n\t\tdefault: return Super::GetProtocolEntityStatus(a_Animation);\n\t}\n}\n\n\n\n\n\nUInt8 cProtocol_1_14::GetProtocolEntityType(const cEntity & a_Entity) const\n{\n\tusing Type = cEntity::eEntityType;\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase Type::etEnderCrystal: return 17;\n\t\tcase Type::etPickup: return 34;\n\t\tcase Type::etFallingBlock: return 25;\n\t\tcase Type::etMinecart: return 41;\n\t\tcase Type::etBoat: return 5;\n\t\tcase Type::etTNT: return 58;\n\t\tcase Type::etProjectile:\n\t\t{\n\t\t\tusing PType = cProjectileEntity::eKind;\n\t\t\tconst auto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase PType::pkArrow: return 2;\n\t\t\t\tcase PType::pkSnowball: return 70;\n\t\t\t\tcase PType::pkEgg: return 78;\n\t\t\t\tcase PType::pkGhastFireball: return 36;\n\t\t\t\tcase PType::pkFireCharge: return 68;\n\t\t\t\tcase PType::pkEnderPearl: return 79;\n\t\t\t\tcase PType::pkExpBottle: return 80;\n\t\t\t\tcase PType::pkSplashPotion: return 81;\n\t\t\t\tcase PType::pkFirework: return 26;\n\t\t\t\tcase PType::pkWitherSkull: return 92;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase Type::etFloater: return 101;\n\t\tcase Type::etItemFrame: return 35;\n\t\tcase Type::etLeashKnot: return 37;\n\n\t\t// Non-objects must not be sent\n\t\tcase Type::etEntity:\n\t\tcase Type::etPlayer:\n\t\tcase Type::etMonster:\n\t\tcase Type::etExpOrb:\n\t\tcase Type::etPainting: break;\n\t}\n\tUNREACHABLE(\"Unhandled entity kind\");\n}\n\n\n\n\n\nUInt32 cProtocol_1_14::GetProtocolItemType(short a_ItemID, short a_ItemDamage) const\n{\n\treturn Palette_1_14::From(PaletteUpgrade::FromItem(a_ItemID, a_ItemDamage));\n}\n\n\n\n\n\nUInt32 cProtocol_1_14::GetProtocolMobType(eMonsterType a_MobType) const\n{\n\tswitch (a_MobType)\n\t{\n\t\t// Map invalid type to Giant for easy debugging (if this ever spawns, something has gone very wrong)\n\t\tcase mtInvalidType:           return 29;\n\t\tcase mtBat:                   return 3;\n\t\tcase mtBlaze:                 return 4;\n\t\tcase mtCat:                   return 6;\n\t\tcase mtCaveSpider:            return 7;\n\t\tcase mtChicken:               return 8;\n\t\tcase mtCod:                   return 9;\n\t\tcase mtCow:                   return 10;\n\t\tcase mtCreeper:               return 11;\n\t\tcase mtDonkey:                return 12;\n\t\tcase mtDolphin:               return 13;\n\t\tcase mtDrowned:               return 15;\n\t\tcase mtElderGuardian:         return 16;\n\t\tcase mtEnderDragon:           return 18;\n\t\tcase mtEnderman:              return 19;\n\t\tcase mtEndermite:             return 20;\n\t\tcase mtEvoker:                return 22;\n\t\tcase mtFox:                   return 27;\n\t\tcase mtGhast:                 return 28;\n\t\tcase mtGiant:                 return 29;\n\t\tcase mtGuardian:              return 30;\n\t\tcase mtHorse:                 return 31;\n\t\tcase mtHusk:                  return 32;\n\t\tcase mtIllusioner:            return 33;\n\t\tcase mtIronGolem:             return 85;\n\t\tcase mtLlama:                 return 38;\n\t\tcase mtMagmaCube:             return 40;\n\t\tcase mtMule:                  return 48;\n\t\tcase mtMooshroom:             return 49;\n\t\tcase mtOcelot:                return 50;\n\t\tcase mtPanda:                 return 52;\n\t\tcase mtParrot:                return 53;\n\t\tcase mtPig:                   return 54;\n\t\tcase mtPufferfish:            return 55;\n\t\tcase mtPolarBear:             return 57;\n\t\tcase mtRabbit:                return 59;\n\t\tcase mtSalmon:                return 60;\n\t\tcase mtSheep:                 return 61;\n\t\tcase mtShulker:               return 62;\n\t\tcase mtSilverfish:            return 64;\n\t\tcase mtSkeleton:              return 65;\n\t\tcase mtSkeletonHorse:         return 66;\n\t\tcase mtSlime:                 return 67;\n\t\tcase mtSnowGolem:             return 69;\n\t\tcase mtSpider:                return 72;\n\t\tcase mtSquid:                 return 73;\n\t\tcase mtStray:                 return 74;\n\t\tcase mtTraderLlama:           return 75;\n\t\tcase mtTropicalFish:          return 76;\n\t\tcase mtTurtle:                return 77;\n\t\tcase mtVex:                   return 83;\n\t\tcase mtVillager:              return 84;\n\t\tcase mtVindicator:            return 86;\n\t\tcase mtPillager:              return 87;\n\t\tcase mtWanderingTrader:       return 88;\n\t\tcase mtWitch:                 return 89;\n\t\tcase mtWither:                return 90;\n\t\tcase mtWitherSkeleton:        return 91;\n\t\tcase mtWolf:                  return 93;\n\t\tcase mtZombie:                return 94;\n\t\tcase mtZombieHorse:           return 95;\n\t\tcase mtZombiePigman:          return 56;\n\t\tcase mtZombieVillager:        return 96;\n\t\tcase mtPhantom:               return 97;\n\t\tcase mtRavager:               return 98;\n\n\t\tdefault:                      return 0;\n\t}\n}\n\n\n\n\n\nint cProtocol_1_14::GetProtocolParticleID(const AString & a_ParticleName) const\n{\n\tstatic const std::unordered_map<AString, int> ParticleMap\n\t{\n\t\t// Initialize the ParticleMap:\n\t\t{ \"ambiantentity\",           0 },\n\t\t{ \"angryvillager\",           1 },\n\t\t{ \"barrier\",                 2 },\n\t\t{ \"blockdust\",               3 },\n\t\t{ \"bubble\",                  4 },\n\t\t{ \"cloud\",                   5 },\n\t\t{ \"crit\",                    6 },\n\t\t{ \"damageindicator\",         7 },\n\t\t{ \"dragonbreath\",            8 },\n\t\t{ \"driplava\",                9 },\n\t\t{ \"fallinglava\",            10 },\n\t\t{ \"landinglava\",            11 },\n\t\t{ \"dripwater\",              12 },\n\t\t{ \"fallingwater\",           13 },\n\t\t{ \"dust\",                   14 },\n\t\t{ \"effect\",                 15 },\n\t\t{ \"elderguardian\",          16 },\n\t\t{ \"enchantedhit\",           17 },\n\t\t{ \"enchant\",                18 },\n\t\t{ \"endrod\",                 19 },\n\t\t{ \"entityeffect\",           20 },\n\t\t{ \"explosionemitter\",       21 },\n\t\t{ \"explode\",                22 },\n\t\t{ \"fallingdust\",            23 },\n\t\t{ \"firework\",               24 },\n\t\t{ \"fishing\",                25 },\n\t\t{ \"flame\",                  26 },\n\t\t{ \"flash\",                  27 },\n\t\t{ \"happyvillager\",          28 },\n\t\t{ \"composter\",              29 },\n\t\t{ \"heart\",                  30 },\n\t\t{ \"instanteffect\",          31 },\n\t\t{ \"item\",                   32 },\n\t\t{ \"slime\",                  33 },\n\t\t{ \"snowball\",               34 },\n\t\t{ \"largesmoke\",             35 },\n\t\t{ \"lava\",                   36 },\n\t\t{ \"mycelium\",               37 },\n\t\t{ \"note\",                   38 },\n\t\t{ \"poof\",                   39 },\n\t\t{ \"portal\",                 40 },\n\t\t{ \"rain\",                   41 },\n\t\t{ \"smoke\",                  42 },\n\t\t{ \"sneeze\",                 43 },\n\t\t{ \"spit\",                   44 },\n\t\t{ \"squidink\",               45 },\n\t\t{ \"sweepattack\",            46 },\n\t\t{ \"totem\",                  47 },\n\t\t{ \"underwater\",             48 },\n\t\t{ \"splash\",                 49 },\n\t\t{ \"witch\",                  50 },\n\t\t{ \"bubblepop\",              51 },\n\t\t{ \"currentdown\",            52 },\n\t\t{ \"bubblecolumnup\",         53 },\n\t\t{ \"nautilus\",               54 },\n\t\t{ \"dolphin\",                55 },\n\t\t{ \"campfirecosysmoke\",      56 },\n\t\t{ \"campfiresignalsmoke\",    57 },\n\t};\n\n\n\tconst auto ParticleName = StrToLower(a_ParticleName);\n\tconst auto FindResult = ParticleMap.find(ParticleName);\n\tif (FindResult == ParticleMap.end())\n\t{\n\t\tLOGWARNING(\"Unknown particle: %s\", a_ParticleName.c_str());\n\t\tASSERT(!\"Unknown particle\");\n\t\treturn 0;\n\t}\n\n\treturn FindResult->second;\n}\n\n\n\n\n\nUInt32 cProtocol_1_14::GetProtocolStatisticType(const CustomStatistic a_Statistic) const\n{\n\treturn Palette_1_14::From(a_Statistic);\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_14::GetProtocolVersion() const\n{\n\treturn Version::v1_14;\n}\n\n\n\n\n\nbool cProtocol_1_14::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType)\n{\n\tif (m_State != State::Game)\n\t{\n\t\treturn Super::HandlePacket(a_ByteBuffer, a_PacketType);\n\t}\n\n\t// Game\n\tswitch (a_PacketType)\n\t{\n\t\tcase 0x03: HandlePacketChatMessage(a_ByteBuffer); return true;\n\t\tcase 0x04: HandlePacketClientStatus(a_ByteBuffer); return true;\n\t\tcase 0x05: HandlePacketClientSettings(a_ByteBuffer); return true;\n\t\tcase 0x06: HandlePacketTabComplete(a_ByteBuffer); return true;\n\t\tcase 0x07: break;  // Confirm transaction - not used in Cuberite\n\t\tcase 0x08: HandlePacketEnchantItem(a_ByteBuffer); return true;\n\t\tcase 0x09: HandlePacketWindowClick(a_ByteBuffer); return true;\n\t\tcase 0x0A: HandlePacketWindowClose(a_ByteBuffer); return true;\n\t\tcase 0x0B: HandlePacketPluginMessage(a_ByteBuffer); return true;\n\t\tcase 0x0E: HandlePacketUseEntity(a_ByteBuffer); return true;\n\t\tcase 0x0F: HandlePacketKeepAlive(a_ByteBuffer); return true;\n\t\tcase 0x11: HandlePacketPlayerPos(a_ByteBuffer); return true;\n\t\tcase 0x12: HandlePacketPlayerPosLook(a_ByteBuffer); return true;\n\t\tcase 0x13: HandlePacketPlayerLook(a_ByteBuffer); return true;\n\t\tcase 0x14: HandlePacketPlayer(a_ByteBuffer); return true;\n\t\tcase 0x15: HandlePacketVehicleMove(a_ByteBuffer); return true;\n\t\tcase 0x16: HandlePacketBoatSteer(a_ByteBuffer); return true;\n\t\tcase 0x18: HandleCraftRecipe(a_ByteBuffer); return true;\n\t\tcase 0x19: HandlePacketPlayerAbilities(a_ByteBuffer); return true;\n\t\tcase 0x1A: HandlePacketBlockDig(a_ByteBuffer); return true;\n\t\tcase 0x1C: HandlePacketSteerVehicle(a_ByteBuffer); return true;\n\t\tcase 0x1D: HandlePacketCraftingBookData(a_ByteBuffer); return true;\n\t\tcase 0x1E: HandlePacketNameItem(a_ByteBuffer); return true;\n\t\tcase 0x1F: HandlePacketResourcePackStatus(a_ByteBuffer); return true;\n\t\tcase 0x20: HandlePacketAdvancementTab(a_ByteBuffer); return true;\n\t\tcase 0x22: HandlePacketSetBeaconEffect(a_ByteBuffer); return true;\n\t\tcase 0x23: HandlePacketSlotSelect(a_ByteBuffer); return true;\n\t\tcase 0x26: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true;\n\t\tcase 0x2C: HandlePacketBlockPlace(a_ByteBuffer); return true;\n\t\tcase 0x2D: HandlePacketUseItem(a_ByteBuffer); return true;\n\n\t\tdefault: break;\n\t}\n\n\treturn Super::HandlePacket(a_ByteBuffer, a_PacketType);\n}\n\n\n\n\n\nvoid cProtocol_1_14::HandlePacketBlockDig(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Status);\n\n\tint BlockX, BlockY, BlockZ;\n\tif (!a_ByteBuffer.ReadXZYPosition64(BlockX, BlockY, BlockZ))\n\t{\n\t\treturn;\n\t}\n\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Face);\n\tm_Client->HandleLeftClick({BlockX, BlockY, BlockZ}, FaceIntToBlockFace(Face), Status);\n}\n\n\n\n\n\nvoid cProtocol_1_14::HandlePacketBlockPlace(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Hand);\n\n\tint BlockX, BlockY, BlockZ;\n\tif (!a_ByteBuffer.ReadXZYPosition64(BlockX, BlockY, BlockZ))\n\t{\n\t\treturn;\n\t}\n\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Face);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, CursorX);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, CursorY);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, CursorZ);\n\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, InsideBlock);\n\n\tm_Client->HandleRightClick({BlockX, BlockY, BlockZ}, FaceIntToBlockFace(Face), {FloorC(CursorX * 16), FloorC(CursorY * 16), FloorC(CursorZ * 16)}, Hand == 0);\n}\n\n\n\n\n\nvoid cProtocol_1_14::HandlePacketUpdateSign(cByteBuffer & a_ByteBuffer)\n{\n}\n\n\n\n\n\nvoid cProtocol_1_14::WriteEntityMetadata(cPacketizer & a_Pkt, const EntityMetadata a_Metadata, const EntityMetadataType a_FieldType) const\n{\n\ta_Pkt.WriteBEUInt8(GetEntityMetadataID(a_Metadata));  // Index\n\ta_Pkt.WriteBEUInt8(Super::GetEntityMetadataID(a_FieldType));  // Type\n}\n\n\n\n\n\nvoid cProtocol_1_14::WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const\n{\n\t// Common metadata:\n\tInt8 Flags = 0;\n\tif (a_Entity.IsOnFire())\n\t{\n\t\tFlags |= 0x01;\n\t}\n\tif (a_Entity.IsCrouched())\n\t{\n\t\tFlags |= 0x02;\n\t}\n\tif (a_Entity.IsSprinting())\n\t{\n\t\tFlags |= 0x08;\n\t}\n\tif (a_Entity.IsRclking())\n\t{\n\t\tFlags |= 0x10;\n\t}\n\tif (a_Entity.IsInvisible())\n\t{\n\t\tFlags |= 0x20;\n\t}\n\t/*\n\tif (a_Entity.IsGlowing())\n\t{\n\t\tFlags |= 0x40;\n\t}\n\t*/\n\tif (a_Entity.IsElytraFlying())\n\t{\n\t\tFlags |= 0x80;\n\t}\n\n\tWriteEntityMetadata(a_Pkt, EntityMetadata::EntityFlags, EntityMetadataType::Byte);\n\ta_Pkt.WriteBEInt8(Flags);\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase cEntity::etPlayer:\n\t\t{\n\t\t\tauto & Player = static_cast<const cPlayer &>(a_Entity);\n\n\t\t\t// TODO Set player custom name to their name.\n\t\t\t// Then it's possible to move the custom name of mobs to the entities\n\t\t\t// and to remove the \"special\" player custom name.\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EntityCustomName, EntityMetadataType::String);\n\t\t\ta_Pkt.WriteString(Player.GetName());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::LivingHealth, EntityMetadataType::Float);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Player.GetHealth()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::PlayerDisplayedSkinParts, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Player.GetSkinParts()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::PlayerMainHand, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEUInt8(Player.IsLeftHanded() ? 0 : 1);\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etPickup:\n\t\t{\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ItemItem, EntityMetadataType::Item);\n\t\t\tWriteItem(a_Pkt, static_cast<const cPickup &>(a_Entity).GetItem());\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etMinecart:\n\t\t{\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartShakingPower, EntityMetadataType::VarInt);\n\n\t\t\t// The following expression makes Minecarts shake more with less health or higher damage taken\n\t\t\tauto & Minecart = static_cast<const cMinecart &>(a_Entity);\n\t\t\tauto maxHealth = a_Entity.GetMaxHealth();\n\t\t\tauto curHealth = a_Entity.GetHealth();\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>((maxHealth - curHealth) * Minecart.LastDamage() * 4));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartShakingDirection, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(1);  // (doesn't seem to effect anything)\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartShakingMultiplier, EntityMetadataType::Float);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Minecart.LastDamage() + 10));  // or damage taken\n\n\t\t\tif (Minecart.GetPayload() == cMinecart::mpNone)\n\t\t\t{\n\t\t\t\tauto & RideableMinecart = static_cast<const cRideableMinecart &>(Minecart);\n\t\t\t\tconst cItem & MinecartContent = RideableMinecart.GetContent();\n\t\t\t\tif (!MinecartContent.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartBlockIDMeta, EntityMetadataType::VarInt);\n\t\t\t\t\tint Content = MinecartContent.m_ItemType;\n\t\t\t\t\tContent |= MinecartContent.m_ItemDamage << 8;\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Content));\n\n\t\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartBlockY, EntityMetadataType::VarInt);\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(RideableMinecart.GetBlockHeight()));\n\n\t\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartShowBlock, EntityMetadataType::Boolean);\n\t\t\t\t\ta_Pkt.WriteBool(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Minecart.GetPayload() == cMinecart::mpFurnace)\n\t\t\t{\n\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::MinecartFurnacePowered, EntityMetadataType::Boolean);\n\t\t\t\ta_Pkt.WriteBool(static_cast<const cMinecartWithFurnace &>(Minecart).IsFueled());\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etMinecart\n\n\t\tcase cEntity::etProjectile:\n\t\t{\n\t\t\tauto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase cProjectileEntity::pkArrow:\n\t\t\t\t{\n\t\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ArrowFlags, EntityMetadataType::Byte);\n\t\t\t\t\ta_Pkt.WriteBEInt8(static_cast<const cArrowEntity &>(Projectile).IsCritical() ? 1 : 0);\n\n\t\t\t\t\t// TODO: Piercing level\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkFirework:\n\t\t\t\t{\n\t\t\t\t\t// TODO\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkSplashPotion:\n\t\t\t\t{\n\t\t\t\t\t// TODO\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etProjectile\n\n\t\tcase cEntity::etMonster:\n\t\t{\n\t\t\tWriteMobMetadata(a_Pkt, static_cast<const cMonster &>(a_Entity));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntity::etBoat:\n\t\t{\n\t\t\tauto & Boat = static_cast<const cBoat &>(a_Entity);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatLastHitTime, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetLastDamage()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatForwardDirection, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetForwardDirection()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatDamageTaken, EntityMetadataType::Float);\n\t\t\ta_Pkt.WriteBEFloat(Boat.GetDamageTaken());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatType, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetMaterial()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatRightPaddleTurning, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Boat.IsRightPaddleUsed());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatLeftPaddleTurning, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(static_cast<bool>(Boat.IsLeftPaddleUsed()));\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BoatSplashTimer, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(0);\n\n\t\t\tbreak;\n\t\t}  // case etBoat\n\n\t\tcase cEntity::etItemFrame:\n\t\t{\n\t\t\tconst auto & Frame = static_cast<const cItemFrame &>(a_Entity);\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ItemFrameItem, EntityMetadataType::Item);\n\t\t\tWriteItem(a_Pkt, Frame.GetItem());\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ItemFrameRotation, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(Frame.GetItemRotation());\n\t\t\tbreak;\n\t\t}  // case etItemFrame\n\n\t\tcase cEntity::etEnderCrystal:\n\t\t{\n\t\t\tconst auto & EnderCrystal = static_cast<const cEnderCrystal &>(a_Entity);\n\t\t\tif (EnderCrystal.DisplaysBeam())\n\t\t\t{\n\t\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EnderCrystalBeamTarget, EntityMetadataType::OptPosition);\n\t\t\t\ta_Pkt.WriteBool(true);  // Dont do a second check if it should display the beam\n\t\t\t\ta_Pkt.WriteXYZPosition64(EnderCrystal.GetBeamTarget());\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EnderCrystalShowBottom, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(EnderCrystal.ShowsBottom());\n\t\t\tbreak;\n\t\t}  // case etEnderCrystal\n\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_14::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const\n{\n\t// Living Enitiy Metadata\n\tif (a_Mob.HasCustomName())\n\t{\n\t\t// TODO: As of 1.9 _all_ entities can have custom names; should this be moved up?\n\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EntityCustomName, EntityMetadataType::OptChat);\n\t\ta_Pkt.WriteBool(true);\n\t\ta_Pkt.WriteString(a_Mob.GetCustomName());\n\n\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EntityCustomNameVisible, EntityMetadataType::Boolean);\n\t\ta_Pkt.WriteBool(a_Mob.IsCustomNameAlwaysVisible());\n\t}\n\n\tWriteEntityMetadata(a_Pkt, EntityMetadata::LivingHealth, EntityMetadataType::Float);\n\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\n\t// TODO: pose\n\n\tswitch (a_Mob.GetMobType())\n\t{\n\t\tcase mtBat:\n\t\t{\n\t\t\tauto & Bat = static_cast<const cBat &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::BatHanging, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(Bat.IsHanging() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtBat\n\n\t\tcase mtChicken:\n\t\t{\n\t\t\tauto & Chicken = static_cast<const cChicken &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Chicken.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtChicken\n\n\t\tcase mtCow:\n\t\t{\n\t\t\tauto & Cow = static_cast<const cCow &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Cow.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtCow\n\n\t\tcase mtCreeper:\n\t\t{\n\t\t\tauto & Creeper = static_cast<const cCreeper &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::CreeperState, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(Creeper.IsBlowing() ? 1 : static_cast<UInt32>(-1));  // (idle or \"blowing\")\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::CreeperPowered, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Creeper.IsCharged());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::CreeperIgnited, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Creeper.IsBurnedWithFlintAndSteel());\n\t\t\tbreak;\n\t\t}  // case mtCreeper\n\n\t\tcase mtEnderman:\n\t\t{\n\t\t\tauto & Enderman = static_cast<const cEnderman &>(a_Mob);\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EndermanCarriedBlock, EntityMetadataType::OptBlockID);\n\t\t\tUInt32 Carried = 0;\n\t\t\tCarried |= static_cast<UInt32>(Enderman.GetCarriedBlock() << 4);\n\t\t\tCarried |= Enderman.GetCarriedMeta();\n\t\t\ta_Pkt.WriteVarInt32(Carried);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::EndermanScreaming, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Enderman.IsScreaming());\n\t\t\tbreak;\n\t\t}  // case mtEnderman\n\n\t\tcase mtGhast:\n\t\t{\n\t\t\tauto & Ghast = static_cast<const cGhast &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::GhastAttacking, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Ghast.IsCharging());\n\t\t\tbreak;\n\t\t}  // case mtGhast\n\n\t\tcase mtHorse:\n\t\t{\n\t\t\t// XXX This behaves incorrectly with different varients; horses have different entity IDs now\n\n\t\t\t// Abstract horse\n\t\t\tauto & Horse = static_cast<const cHorse &>(a_Mob);\n\n\t\t\tInt8 Flags = 0;\n\t\t\tif (Horse.IsTame())\n\t\t\t{\n\t\t\t\tFlags |= 0x02;\n\t\t\t}\n\t\t\tif (Horse.IsSaddled())\n\t\t\t{\n\t\t\t\tFlags |= 0x04;\n\t\t\t}\n\t\t\tif (Horse.IsInLoveCooldown())\n\t\t\t{\n\t\t\t\tFlags |= 0x08;\n\t\t\t}\n\t\t\tif (Horse.IsEating())\n\t\t\t{\n\t\t\t\tFlags |= 0x10;\n\t\t\t}\n\t\t\tif (Horse.IsRearing())\n\t\t\t{\n\t\t\t\tFlags |= 0x20;\n\t\t\t}\n\t\t\tif (Horse.IsMthOpen())\n\t\t\t{\n\t\t\t\tFlags |= 0x40;\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AbstractHorseFlags, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(Flags);\n\n\t\t\t// Regular horses\n\t\t\tint Appearance = 0;\n\t\t\tAppearance = Horse.GetHorseColor();\n\t\t\tAppearance |= Horse.GetHorseStyle() << 8;\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::HorseVariant, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Appearance));  // Color / style\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Horse.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtHorse\n\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\tauto & MagmaCube = static_cast<const cMagmaCube &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::SlimeSize, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(MagmaCube.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtMagmaCube\n\n\t\tcase mtOcelot:\n\t\t{\n\t\t\tauto & Ocelot = static_cast<const cOcelot &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Ocelot.IsBaby());\n\n\t\t\t// TODO: Ocelot trusting\n\n\t\t\tbreak;\n\t\t}  // case mtOcelot\n\n\t\tcase mtPig:\n\t\t{\n\t\t\tauto & Pig = static_cast<const cPig &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Pig.IsBaby());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::PigHasSaddle, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Pig.IsSaddled());\n\n\t\t\t// PIG_TOTAL_CARROT_ON_A_STICK_BOOST in 1.11.1 only\n\t\t\tbreak;\n\t\t}  // case mtPig\n\n\t\tcase mtRabbit:\n\t\t{\n\t\t\tauto & Rabbit = static_cast<const cRabbit &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Rabbit.IsBaby());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::RabbitType, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Rabbit.GetRabbitType()));\n\t\t\tbreak;\n\t\t}  // case mtRabbit\n\n\t\tcase mtSheep:\n\t\t{\n\t\t\tauto & Sheep = static_cast<const cSheep &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Sheep.IsBaby());\n\n\t\t\tInt8 SheepMetadata = 0;\n\t\t\tSheepMetadata = static_cast<Int8>(Sheep.GetFurColor());\n\t\t\tif (Sheep.IsSheared())\n\t\t\t{\n\t\t\t\tSheepMetadata |= 0x10;\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::SheepFlags, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(SheepMetadata);\n\t\t\tbreak;\n\t\t}  // case mtSheep\n\n\t\tcase mtSkeleton:\n\t\t{\n\t\t\tauto & Skeleton = static_cast<const cSkeleton &>(a_Mob);\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::LivingActiveHand, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);\n\n\t\t\t// TODO: Skeleton animation\n\t\t\tbreak;\n\t\t}  // case mtSkeleton\n\n\t\tcase mtSlime:\n\t\t{\n\t\t\tauto & Slime = static_cast<const cSlime &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::SlimeSize, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Slime.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtSlime\n\n\t\tcase mtVillager:\n\t\t{\n\t\t\tauto & Villager = static_cast<const cVillager &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Villager.IsBaby());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::VillagerProfession, EntityMetadataType::VillagerData);\n\t\t\ta_Pkt.WriteVarInt32(2);  // Villager from plains\n\t\t\tswitch (Villager.GetVilType())\n\t\t\t{\n\t\t\t\tcase cVillager::vtFarmer:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteVarInt32(5);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cVillager::vtLibrarian:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteVarInt32(9);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cVillager::vtPriest:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteVarInt32(4);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cVillager::vtBlacksmith:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteVarInt32(13);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cVillager::vtButcher:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteVarInt32(2);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cVillager::vtGeneric:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteVarInt32(0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\ta_Pkt.WriteVarInt32(1);  // Level 1 villager\n\t\t\tbreak;\n\t\t}  // case mtVillager\n\n\t\tcase mtWitch:\n\t\t{\n\t\t\t// auto & Witch = static_cast<const cWitch &>(a_Mob);\n\n\t\t\t// TODO: Witch drinking potion\n\t\t\tbreak;\n\t\t}  // case mtWitch\n\n\t\tcase mtWither:\n\t\t{\n\t\t\tauto & Wither = static_cast<const cWither &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WitherInvulnerableTimer, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(Wither.GetWitherInvulnerableTicks());\n\n\t\t\t// TODO: Use boss bar packet for health\n\t\t\tbreak;\n\t\t}  // case mtWither\n\n\t\tcase mtWolf:\n\t\t{\n\t\t\tauto & Wolf = static_cast<const cWolf &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBaby());\n\n\t\t\tInt8 WolfStatus = 0;\n\t\t\tif (Wolf.IsSitting())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Wolf.IsAngry())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x2;\n\t\t\t}\n\t\t\tif (Wolf.IsTame())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x4;\n\t\t\t}\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::TameableAnimalFlags, EntityMetadataType::Byte);\n\t\t\ta_Pkt.WriteBEInt8(WolfStatus);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WolfDamageTaken, EntityMetadataType::Float);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));  // TODO Not use the current health\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WolfBegging, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBegging());\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::WolfCollarColour, EntityMetadataType::VarInt);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Wolf.GetCollarColor()));\n\t\t\tbreak;\n\t\t}  // case mtWolf\n\n\t\tcase mtZombie:\n\t\t{\n\t\t\t// XXX Zombies were also split into new sublcasses; this doesn't handle that.\n\n\t\t\tauto & Zombie = static_cast<const cZombie &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::ZombieIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(Zombie.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombie\n\n\t\tcase mtZombiePigman:\n\t\t{\n\t\t\tauto & ZombiePigman = static_cast<const cZombiePigman &>(a_Mob);\n\n\t\t\tWriteEntityMetadata(a_Pkt, EntityMetadata::AgeableIsBaby, EntityMetadataType::Boolean);\n\t\t\ta_Pkt.WriteBool(ZombiePigman.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombiePigman\n\n\t\tcase mtBlaze:\n\t\tcase mtEnderDragon:\n\t\tcase mtIronGolem:\n\t\tcase mtSnowGolem:\n\t\tcase mtSpider:\n\t\tcase mtZombieVillager:\n\n\t\tcase mtElderGuardian:\n\t\tcase mtGuardian:\n\t\t{\n\t\t\t// TODO: Mobs with extra fields that aren't implemented\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCat:\n\n\t\tcase mtCod:\n\n\t\tcase mtDolphin:\n\n\t\tcase mtDonkey:\n\n\t\tcase mtDrowned:\n\n\t\tcase mtEvoker:\n\n\t\tcase mtIllusioner:\n\n\t\tcase mtLlama:\n\n\t\tcase mtMule:\n\n\t\tcase mtParrot:\n\n\t\tcase mtPhantom:\n\n\t\tcase mtPolarBear:\n\n\t\tcase mtPufferfish:\n\n\t\tcase mtSalmon:\n\n\t\tcase mtShulker:\n\n\t\tcase mtStray:\n\n\t\tcase mtSkeletonHorse:\n\t\tcase mtZombieHorse:\n\n\t\tcase mtTropicalFish:\n\n\t\tcase mtTurtle:\n\n\t\tcase mtVex:\n\n\t\tcase mtVindicator:\n\n\t\tcase mtHusk:\n\t\t{\n\t\t\t// Todo: Mobs not added yet. Grouped ones have the same metadata\n\t\t\tASSERT(!\"cProtocol_1_14::WriteMobMetadata: received unimplemented type\");\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtMooshroom:\n\t\tcase mtCaveSpider:\n\t\t{\n\t\t\t// Not mentioned on http://wiki.vg/Entities\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtEndermite:\n\t\tcase mtGiant:\n\t\tcase mtSilverfish:\n\t\tcase mtSquid:\n\t\tcase mtWitherSkeleton:\n\t\t{\n\t\t\t// Mobs with no extra fields\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: UNREACHABLE(\"cProtocol_1_14::WriteMobMetadata: received mob of invalid type\");\n\t}  // switch (a_Mob.GetType())\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_14_1:\n\ncProtocol::Version cProtocol_1_14_1::GetProtocolVersion() const\n{\n\treturn Version::v1_14_1;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_14_2:\n\ncProtocol::Version cProtocol_1_14_2::GetProtocolVersion() const\n{\n\treturn Version::v1_14_2;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_14_3:\n\ncProtocol::Version cProtocol_1_14_3::GetProtocolVersion() const\n{\n\treturn Version::v1_14_3;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_14_4:\n\ncProtocol::Version cProtocol_1_14_4::GetProtocolVersion() const\n{\n\treturn Version::v1_14_4;\n}\n"
  },
  {
    "path": "src/Protocol/Protocol_1_14.h",
    "content": "\n// Protocol_1_14.h\n\n/*\nDeclares the 1.14 protocol classes:\n\t- cProtocol_1_14\n\t\t- release 1.14 protocol (#477)\n*/\n\n\n\n\n\n#pragma once\n\n#include \"Protocol_1_13.h\"\n\n\n\n\n\nclass cProtocol_1_14:\n\tpublic cProtocol_1_13_2\n{\n\tusing Super = cProtocol_1_13_2;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual void SendBlockAction                (Vector3i a_BlockPos, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType) override;\n\tvirtual void SendBlockBreakAnim             (UInt32 a_EntityID, Vector3i a_BlockPos, char a_Stage) override;\n\tvirtual void SendBlockChange                (Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;\n\tvirtual void SendEditSign                   (Vector3i a_BlockPos) override;  ///< Request the client to open up the sign editor for the sign (1.6+)\n\tvirtual void SendEntityAnimation            (const cEntity & a_Entity, EntityAnimation a_Animation) override;\n\tvirtual void SendEntitySpawn                (const cEntity & a_Entity, const UInt8 a_ObjectType, const Int32 a_ObjectData) override;\n\tvirtual void SendLogin                      (const cPlayer & a_Player, const cWorld & a_World) override;\n\tvirtual void SendMapData                    (const cMap & a_Map, int a_DataStartX, int a_DataStartY) override;\n\tvirtual void SendPaintingSpawn              (const cPainting & a_Painting) override;\n\tvirtual void SendParticleEffect             (const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data) override;\n\tvirtual void SendRespawn                    (eDimension a_Dimension) override;\n\tvirtual void SendSoundParticleEffect        (const EffectID a_EffectID, Vector3i a_Origin, int a_Data) override;\n\tvirtual void SendUpdateBlockEntity          (cBlockEntity & a_BlockEntity) override;\n\tvirtual void SendUpdateSign                 (Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;\n\tvirtual void SendWindowOpen                 (const cWindow & a_Window) override;\n\n\tvirtual UInt8 GetEntityMetadataID(EntityMetadata a_Metadata) const override;\n\tvirtual UInt32 GetPacketID(ePacketType a_PacketType) const override;\n\tvirtual std::pair<short, short> GetItemFromProtocolID(UInt32 a_ProtocolID) const override;\n\tvirtual UInt32 GetProtocolBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta) const override;\n\tvirtual signed char GetProtocolEntityStatus(EntityAnimation a_Animation) const override;\n\tvirtual UInt8 GetProtocolEntityType(const cEntity & a_Entity) const override;\n\tvirtual UInt32 GetProtocolItemType(short a_ItemID, short a_ItemDamage) const override;\n\tvirtual UInt32 GetProtocolMobType(eMonsterType a_MobType) const override;\n\tvirtual int GetProtocolParticleID(const AString & a_ParticleName) const override;\n\tvirtual UInt32 GetProtocolStatisticType(CustomStatistic a_Statistic) const override;\n\tvirtual Version GetProtocolVersion() const override;\n\n\tvirtual bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) override;\n\tvirtual void HandlePacketBlockDig(cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketBlockPlace(cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketUpdateSign(cByteBuffer & a_ByteBuffer) override;\n\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, EntityMetadata a_Metadata, EntityMetadataType a_FieldType) const override;\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const override;\n\tvirtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const override;\n};\n\n\n\n\n\nclass cProtocol_1_14_1:\n\tpublic cProtocol_1_14\n{\n\tusing Super = cProtocol_1_14;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual Version GetProtocolVersion() const override;\n};\n\n\n\n\n\nclass cProtocol_1_14_2:\n\tpublic cProtocol_1_14_1\n{\n\tusing Super = cProtocol_1_14_1;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual Version GetProtocolVersion() const override;\n};\n\n\n\n\n\nclass cProtocol_1_14_3:\n\tpublic cProtocol_1_14_2\n{\n\tusing Super = cProtocol_1_14_2;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual Version GetProtocolVersion() const override;\n};\n\n\n\n\n\nclass cProtocol_1_14_4:\n\tpublic cProtocol_1_14_3\n{\n\tusing Super = cProtocol_1_14_3;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual Version GetProtocolVersion() const override;\n};\n"
  },
  {
    "path": "src/Protocol/Protocol_1_8.cpp",
    "content": "\n// Protocol_1_8.cpp\n\n/*\nImplements the 1.8 protocol classes:\n\t- cProtocol_1_8_0\n\t\t- release 1.8 protocol (#47)\n*/\n\n#include \"Globals.h\"\n#include \"Protocol_1_8.h\"\n#include \"main.h\"\n#include \"../mbedTLS++/Sha1Checksum.h\"\n#include \"Packetizer.h\"\n\n#include \"../ClientHandle.h\"\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../World.h\"\n#include \"../EffectID.h\"\n#include \"../StringCompression.h\"\n#include \"../CompositeChat.h\"\n#include \"../UUID.h\"\n#include \"../World.h\"\n#include \"../JsonUtils.h\"\n\n#include \"../WorldStorage/FastNBT.h\"\n#include \"../WorldStorage/EnchantmentSerializer.h\"\n\n#include \"../Entities/ExpOrb.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Entities/FallingBlock.h\"\n#include \"../Entities/Floater.h\"\n#include \"../Entities/Painting.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/FireworkEntity.h\"\n\n#include \"../Mobs/IncludeAllMonsters.h\"\n#include \"../UI/Window.h\"\n#include \"../UI/HorseWindow.h\"\n\n#include \"../BlockEntities/BannerEntity.h\"\n#include \"../BlockEntities/BeaconEntity.h\"\n#include \"../BlockEntities/CommandBlockEntity.h\"\n#include \"../BlockEntities/EnchantingTableEntity.h\"\n#include \"../BlockEntities/MobHeadEntity.h\"\n#include \"../BlockEntities/MobSpawnerEntity.h\"\n#include \"../BlockEntities/FlowerPotEntity.h\"\n#include \"../Bindings/PluginManager.h\"\n\n\n\n\n\nconst int MAX_ENC_LEN = 512;  // Maximum size of the encrypted message; should be 128, but who knows...\nstatic const UInt32 CompressionThreshold = 256;  // After how large a packet should we compress it.\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_8_0:\n\ncProtocol_1_8_0::cProtocol_1_8_0(cClientHandle * a_Client, const AString & a_ServerAddress, State a_State) :\n\tSuper(a_Client),\n\tm_State(a_State),\n\tm_ServerAddress(a_ServerAddress),\n\tm_IsEncrypted(false)\n{\n\tAStringVector Params;\n\tSplitZeroTerminatedStrings(a_ServerAddress, Params);\n\n\tif (Params.size() >= 2)\n\t{\n\t\tm_ServerAddress = Params[0];\n\n\t\tif (Params[1] == \"FML\")\n\t\t{\n\t\t\tLOGD(\"Forge client connected!\");\n\t\t\tm_Client->SetIsForgeClient();\n\t\t}\n\t\telse if (Params.size() == 4)\n\t\t{\n\t\t\tif (cRoot::Get()->GetServer()->ShouldAllowBungeeCord())\n\t\t\t{\n\t\t\t\t// BungeeCord handling:\n\t\t\t\t// If BC is setup with ip_forward == true, it sends additional data in the login packet's ServerAddress field:\n\t\t\t\t// hostname\\00ip-address\\00uuid\\00profile-properties-as-json\n\n\t\t\t\tLOGD(\"Player at %s connected via BungeeCord\", Params[1].c_str());\n\n\t\t\t\tcUUID UUID;\n\t\t\t\tUUID.FromString(Params[2]);\n\n\t\t\t\tJson::Value root;\n\t\t\t\tif (!JsonUtils::ParseString(Params[3], root))\n\t\t\t\t{\n\t\t\t\t\tLOGERROR(\"Unable to parse player properties: '%s'\", Params[3]);\n\t\t\t\t\tm_Client->ProxyInit(Params[1], UUID);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tm_Client->ProxyInit(Params[1], UUID, root);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLOG(\"BungeeCord is disabled, but client sent additional data, set AllowBungeeCord=1 if you want to allow it\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLOG(\"Unknown additional data sent in server address (BungeeCord/FML?): %zu parameters\", Params.size());\n\t\t\t// TODO: support FML + BungeeCord? (what parameters does it send in that case?) https://github.com/SpigotMC/BungeeCord/issues/899\n\t\t}\n\t}\n\n\t// Create the comm log file, if so requested:\n\tif (g_ShouldLogCommIn || g_ShouldLogCommOut)\n\t{\n\t\tstatic int sCounter = 0;\n\t\tcFile::CreateFolder(\"CommLogs\");\n\t\tAString IP(a_Client->GetIPString());\n\t\tReplaceString(IP, \":\", \"_\");\n\t\tauto FileName = fmt::format(FMT_STRING(\"CommLogs/{:x}_{}__{}.log\"),\n\t\t\tstatic_cast<unsigned>(time(nullptr)),\n\t\t\tsCounter++,\n\t\t\tIP.c_str()\n\t\t);\n\t\tif (!m_CommLogFile.Open(FileName, cFile::fmWrite))\n\t\t{\n\t\t\tLOG(\"Cannot log communication to file, the log file \\\"%s\\\" cannot be opened for writing.\", FileName.c_str());\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::DataReceived(cByteBuffer & a_Buffer, ContiguousByteBuffer & a_Data)\n{\n\tif (m_IsEncrypted)\n\t{\n\t\tm_Decryptor.ProcessData(a_Data.data(), a_Data.size());\n\t}\n\n\tAddReceivedData(a_Buffer, a_Data);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::DataPrepared(ContiguousByteBuffer & a_Data)\n{\n\tif (m_IsEncrypted)\n\t{\n\t\tm_Encryptor.ProcessData(a_Data.data(), a_Data.size());\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendAttachEntity(const cEntity & a_Entity, const cEntity & a_Vehicle)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktAttachEntity);\n\tPkt.WriteBEUInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEUInt32(a_Vehicle.GetUniqueID());\n\tPkt.WriteBool(false);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBlockAction(Vector3i a_BlockPos, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBlockAction);\n\tPkt.WriteXYZPosition64(a_BlockPos);\n\tPkt.WriteBEInt8(a_Byte1);\n\tPkt.WriteBEInt8(a_Byte2);\n\tPkt.WriteVarInt32(a_BlockType);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBlockBreakAnim(UInt32 a_EntityID, Vector3i a_BlockPos, char a_Stage)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBlockBreakAnim);\n\tPkt.WriteVarInt32(a_EntityID);\n\tPkt.WriteXYZPosition64(a_BlockPos);\n\tPkt.WriteBEInt8(a_Stage);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBlockChange(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBlockChange);\n\tPkt.WriteXYZPosition64(a_BlockPos);\n\tPkt.WriteVarInt32((static_cast<UInt32>(a_BlockType) << 4) | (static_cast<UInt32>(a_BlockMeta) & 15));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBlockChanges);\n\tPkt.WriteBEInt32(a_ChunkX);\n\tPkt.WriteBEInt32(a_ChunkZ);\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Changes.size()));\n\n\tfor (const auto & Change : a_Changes)\n\t{\n\t\tInt16 Coords = static_cast<Int16>(Change.m_RelY | (Change.m_RelZ << 8) | (Change.m_RelX << 12));\n\t\tPkt.WriteBEInt16(Coords);\n\t\tPkt.WriteVarInt32(static_cast<UInt32>(Change.m_BlockType & 0xFFF) << 4 | (Change.m_BlockMeta & 0xF));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBossBarAdd(UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog)\n{\n\t// No such packet here\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBossBarRemove(UInt32 a_UniqueID)\n{\n\t// No such packet here\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBossBarUpdateFlags(UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog)\n{\n\t// No such packet here\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBossBarUpdateHealth(UInt32 a_UniqueID, float a_FractionFilled)\n{\n\t// No such packet here\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBossBarUpdateStyle(UInt32 a_UniqueID, BossBarColor a_Color, BossBarDivisionType a_DivisionType)\n{\n\t// No such packet here\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendBossBarUpdateTitle(UInt32 a_UniqueID, const cCompositeChat & a_Title)\n{\n\t// No such packet here\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendCameraSetTo(const cEntity & a_Entity)\n{\n\tcPacketizer Pkt(*this, pktCameraSetTo);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendChat(const AString & a_Message, eChatType a_Type)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tSendChatRaw(JsonUtils::SerializeSingleValueJsonObject(\"text\", a_Message), a_Type);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendChat(const cCompositeChat & a_Message, eChatType a_Type, bool a_ShouldUseChatPrefixes)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tSendChatRaw(a_Message.CreateJsonString(a_ShouldUseChatPrefixes), a_Type);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendChatRaw(const AString & a_MessageRaw, eChatType a_Type)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\t// Prevent chat messages that might trigger CVE-2021-44228\n\tif (a_MessageRaw.find(\"${\") != std::string::npos)\n\t{\n\t\treturn;\n\t}\n\n\t// Send the json string to the client:\n\tcPacketizer Pkt(*this, pktChatRaw);\n\tPkt.WriteString(a_MessageRaw);\n\tPkt.WriteBEInt8([a_Type]() -> signed char\n\t{\n\t\tswitch (a_Type)\n\t\t{\n\t\t\tcase eChatType::ctChatBox: return 0;\n\t\t\tcase eChatType::ctSystem: return 1;\n\t\t\tcase eChatType::ctAboveActionBar: return 2;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported chat type\");\n\t}());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendChunkData(const ContiguousByteBufferView a_ChunkData)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcCSLock Lock(m_CSPacket);\n\tm_Client->SendData(a_ChunkData);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendCollectEntity(const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count)\n{\n\tUNUSED(a_Count);\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktCollectEntity);\n\tPkt.WriteVarInt32(a_Collected.GetUniqueID());\n\tPkt.WriteVarInt32(a_Collector.GetUniqueID());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendDestroyEntity(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\t{\n\t\tcPacketizer Pkt(*this, pktDestroyEntity);\n\t\tPkt.WriteVarInt32(1);\n\t\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t}\n\n\tif (!a_Entity.IsMob())\n\t{\n\t\treturn;\n\t}\n\n\tconst auto & Mob = static_cast<const cMonster &>(a_Entity);\n\tif ((Mob.GetMobType() == mtEnderDragon) || (Mob.GetMobType() == mtWither))\n\t{\n\t\tSendBossBarRemove(Mob.GetUniqueID());\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendDetachEntity(const cEntity & a_Entity, const cEntity & a_PreviousVehicle)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktAttachEntity);\n\tPkt.WriteBEUInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEUInt32(0);\n\tPkt.WriteBool(false);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendDisconnect(const AString & a_Reason)\n{\n\tswitch (m_State)\n\t{\n\t\tcase State::Login:\n\t\t{\n\t\t\tcPacketizer Pkt(*this, pktDisconnectDuringLogin);\n\t\t\tPkt.WriteString(JsonUtils::SerializeSingleValueJsonObject(\"text\", a_Reason));\n\t\t\tbreak;\n\t\t}\n\t\tcase State::Game:\n\t\t{\n\t\t\tcPacketizer Pkt(*this, pktDisconnectDuringGame);\n\t\t\tPkt.WriteString(JsonUtils::SerializeSingleValueJsonObject(\"text\", a_Reason));\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tFLOGERROR(\n\t\t\t\t\"Tried to send disconnect in invalid game state {0}\",\n\t\t\t\tstatic_cast<int>(m_State)\n\t\t\t);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEditSign(Vector3i a_BlockPos)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEditSign);\n\tPkt.WriteXYZPosition64(a_BlockPos);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityAnimation(const cEntity & a_Entity, const EntityAnimation a_Animation)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tif (a_Animation == EntityAnimation::PlayerEntersBed)\n\t{\n\t\tASSERT(a_Entity.IsPlayer());\n\t\tconst auto BedPosition = static_cast<const cPlayer &>(a_Entity).GetLastBedPos();\n\n\t\tcPacketizer Pkt(*this, pktUseBed);\n\t\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t\tPkt.WriteXYZPosition64(BedPosition.x, BedPosition.y, BedPosition.z);\n\t\treturn;\n\t}\n\n\tif (const auto AnimationID = GetProtocolEntityAnimation(a_Animation); AnimationID != static_cast<unsigned char>(-1))\n\t{\n\t\tcPacketizer Pkt(*this, pktEntityAnimation);\n\t\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t\tPkt.WriteBEUInt8(AnimationID);\n\t\treturn;\n\t}\n\n\tif (const auto StatusID = GetProtocolEntityStatus(a_Animation); StatusID != -1)\n\t{\n\t\tcPacketizer Pkt(*this, pktEntityStatus);\n\t\tPkt.WriteBEUInt32(a_Entity.GetUniqueID());\n\t\tPkt.WriteBEInt8(StatusID);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityEffect(const cEntity & a_Entity, int a_EffectID, int a_Amplifier, int a_Duration)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityEffect);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_EffectID));\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Amplifier));\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Duration));\n\tPkt.WriteBool(false);  // Hide particles\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityEquipment(const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityEquipment);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEInt16(a_SlotNum);\n\tWriteItem(Pkt, a_Item);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityHeadLook(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityHeadLook);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tPkt.WriteByteAngle(a_Entity.GetHeadYaw());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityLook(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityLook);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tPkt.WriteByteAngle(a_Entity.GetYaw());\n\tPkt.WriteByteAngle(a_Entity.GetPitch());\n\tPkt.WriteBool(a_Entity.IsOnGround());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityMetadata(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityMeta);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tWriteEntityMetadata(Pkt, a_Entity);\n\tPkt.WriteBEUInt8(0x7f);  // The termination byte\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityPosition(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tconst auto Delta = (a_Entity.GetPosition() * 32).Floor() - (a_Entity.GetLastSentPosition() * 32).Floor();\n\n\t// Ensure that the delta has enough precision and is within range of a BEInt8:\n\tif (\n\t\tDelta.HasNonZeroLength() &&\n\t\tcByteBuffer::CanBEInt8Represent(Delta.x) &&\n\t\tcByteBuffer::CanBEInt8Represent(Delta.y) &&\n\t\tcByteBuffer::CanBEInt8Represent(Delta.z)\n\t)\n\t{\n\t\tconst auto Move = static_cast<Vector3<Int8>>(Delta);\n\n\t\t// Difference within limitations, use a relative move packet\n\t\tif (a_Entity.IsOrientationDirty())\n\t\t{\n\t\t\tcPacketizer Pkt(*this, pktEntityRelMoveLook);\n\t\t\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t\t\tPkt.WriteBEInt8(Move.x);\n\t\t\tPkt.WriteBEInt8(Move.y);\n\t\t\tPkt.WriteBEInt8(Move.z);\n\t\t\tPkt.WriteByteAngle(a_Entity.GetYaw());\n\t\t\tPkt.WriteByteAngle(a_Entity.GetPitch());\n\t\t\tPkt.WriteBool(a_Entity.IsOnGround());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcPacketizer Pkt(*this, pktEntityRelMove);\n\t\t\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t\t\tPkt.WriteBEInt8(Move.x);\n\t\t\tPkt.WriteBEInt8(Move.y);\n\t\t\tPkt.WriteBEInt8(Move.z);\n\t\t\tPkt.WriteBool(a_Entity.IsOnGround());\n\t\t}\n\n\t\treturn;\n\t}\n\n\t// Too big or small a movement, do a teleport.\n\n\tcPacketizer Pkt(*this, pktTeleportEntity);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tPkt.WriteFPInt(a_Entity.GetPosX());\n\tPkt.WriteFPInt(a_Entity.GetPosY());\n\tPkt.WriteFPInt(a_Entity.GetPosZ());\n\tPkt.WriteByteAngle(a_Entity.GetYaw());\n\tPkt.WriteByteAngle(a_Entity.GetPitch());\n\tPkt.WriteBool(a_Entity.IsOnGround());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityProperties(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityProperties);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tWriteEntityProperties(Pkt, a_Entity);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntityVelocity(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityVelocity);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t// 400 = 8000 / 20 ... Conversion from our speed in m / s to 8000 m / tick\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedX() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedY() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedZ() * 400));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendExperience(void)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktExperience);\n\tcPlayer * Player = m_Client->GetPlayer();\n\tPkt.WriteBEFloat(Player->GetXpPercentage());\n\tPkt.WriteVarInt32(static_cast<UInt32>(Player->GetXpLevel()));\n\tPkt.WriteVarInt32(static_cast<UInt32>(Player->GetCurrentXp()));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendExperienceOrb(const cExpOrb & a_ExpOrb)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSpawnExperienceOrb);\n\tPkt.WriteVarInt32(a_ExpOrb.GetUniqueID());\n\tPkt.WriteFPInt(a_ExpOrb.GetPosX());\n\tPkt.WriteFPInt(a_ExpOrb.GetPosY());\n\tPkt.WriteFPInt(a_ExpOrb.GetPosZ());\n\tPkt.WriteBEInt16(static_cast<Int16>(a_ExpOrb.GetReward()));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendExplosion(const Vector3f a_Position, const float a_Power)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktExplosion);\n\tPkt.WriteBEFloat(a_Position.x);\n\tPkt.WriteBEFloat(a_Position.y);\n\tPkt.WriteBEFloat(a_Position.z);\n\tPkt.WriteBEFloat(a_Power);\n\tPkt.WriteBEUInt32(0);\n\tPkt.WriteBEFloat(0);\n\tPkt.WriteBEFloat(0);\n\tPkt.WriteBEFloat(0);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendGameMode(eGameMode a_GameMode)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktGameMode);\n\tPkt.WriteBEUInt8(3);  // Reason: Change game mode\n\tPkt.WriteBEFloat(static_cast<float>(a_GameMode));  // The protocol really represents the value with a float!\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendHealth(void)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktUpdateHealth);\n\tcPlayer * Player = m_Client->GetPlayer();\n\tPkt.WriteBEFloat(static_cast<float>(Player->GetHealth()));\n\tPkt.WriteVarInt32(static_cast<UInt32>(Player->GetFoodLevel()));\n\tPkt.WriteBEFloat(static_cast<float>(Player->GetFoodSaturationLevel()));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendHeldItemChange(int a_ItemIndex)\n{\n\tASSERT((a_ItemIndex >= 0) && (a_ItemIndex <= 8));  // Valid check\n\n\tcPacketizer Pkt(*this, pktHeldItemChange);\n\tPkt.WriteBEInt8(static_cast<Int8>(a_ItemIndex));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendHideTitle(void)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTitle);\n\tPkt.WriteVarInt32(3);  // Hide title\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendInventorySlot(char a_WindowID, short a_SlotNum, const cItem & a_Item)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktInventorySlot);\n\tPkt.WriteBEInt8(a_WindowID);\n\tPkt.WriteBEInt16(a_SlotNum);\n\tWriteItem(Pkt, a_Item);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendKeepAlive(UInt32 a_PingID)\n{\n\t// Drop the packet if the protocol is not in the Game state yet (caused a client crash):\n\tif (m_State != 3)\n\t{\n\t\tLOGWARNING(\"Trying to send a KeepAlive packet to a player who's not yet fully logged in (%d). The protocol class prevented the packet.\", m_State);\n\t\treturn;\n\t}\n\n\tcPacketizer Pkt(*this, pktKeepAlive);\n\tPkt.WriteVarInt32(a_PingID);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendLeashEntity(const cEntity & a_Entity, const cEntity & a_EntityLeashedTo)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktLeashEntity);\n\tPkt.WriteBEUInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEUInt32(a_EntityLeashedTo.GetUniqueID());\n\tPkt.WriteBool(true);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendUnleashEntity(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktLeashEntity);\n\tPkt.WriteBEUInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEInt32(-1);\n\tPkt.WriteBool(true);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendLogin(const cPlayer & a_Player, const cWorld & a_World)\n{\n\t// Send the Join Game packet:\n\t{\n\t\tcServer * Server = cRoot::Get()->GetServer();\n\t\tcPacketizer Pkt(*this, pktJoinGame);\n\t\tPkt.WriteBEUInt32(a_Player.GetUniqueID());\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Player.GetEffectiveGameMode()) | (Server->IsHardcore() ? 0x08 : 0));  // Hardcore flag bit 4\n\t\tPkt.WriteBEInt8(static_cast<Int8>(a_World.GetDimension()));\n\t\tPkt.WriteBEUInt8(2);  // TODO: Difficulty (set to Normal)\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(Clamp<size_t>(Server->GetMaxPlayers(), 0, 255)));\n\t\tPkt.WriteString(\"default\");  // Level type - wtf?\n\t\tPkt.WriteBool(false);  // Reduced Debug Info - wtf?\n\t}\n\n\t// Send the spawn position:\n\t{\n\t\tcPacketizer Pkt(*this, pktSpawnPosition);\n\t\tPkt.WriteXYZPosition64(a_World.GetSpawnX(), a_World.GetSpawnY(), a_World.GetSpawnZ());\n\t}\n\n\t// Send the server difficulty:\n\t{\n\t\tcPacketizer Pkt(*this, pktDifficulty);\n\t\tPkt.WriteBEInt8(1);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendLoginSuccess(void)\n{\n\tASSERT(m_State == 2);  // State: login?\n\n\t// Enable compression:\n\t{\n\t\tcPacketizer Pkt(*this, pktStartCompression);\n\t\tPkt.WriteVarInt32(CompressionThreshold);\n\t}\n\n\tm_State = State::Game;\n\n\t{\n\t\tcPacketizer Pkt(*this, pktLoginSuccess);\n\t\tPkt.WriteString(m_Client->GetUUID().ToLongString());\n\t\tPkt.WriteString(m_Client->GetUsername());\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPaintingSpawn(const cPainting & a_Painting)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\tdouble PosX = a_Painting.GetPosX();\n\tdouble PosY = a_Painting.GetPosY();\n\tdouble PosZ = a_Painting.GetPosZ();\n\n\tcPacketizer Pkt(*this, pktSpawnPainting);\n\tPkt.WriteVarInt32(a_Painting.GetUniqueID());\n\tPkt.WriteString(a_Painting.GetName());\n\tPkt.WriteXYZPosition64(static_cast<Int32>(PosX), static_cast<Int32>(PosY), static_cast<Int32>(PosZ));\n\tPkt.WriteBEInt8(static_cast<Int8>(a_Painting.GetProtocolFacing()));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendMapData(const cMap & a_Map, int a_DataStartX, int a_DataStartY)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktMapData);\n\tPkt.WriteVarInt32(a_Map.GetID());\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Map.GetScale()));\n\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Map.GetDecorators().size()));\n\tfor (const auto & Decorator : a_Map.GetDecorators())\n\t{\n\t\tPkt.WriteBEUInt8(static_cast<Byte>((static_cast<Int32>(Decorator.GetType()) << 4) | (Decorator.GetRot() & 0xF)));\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(Decorator.GetPixelX()));\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(Decorator.GetPixelZ()));\n\t}\n\n\tPkt.WriteBEUInt8(128);\n\tPkt.WriteBEUInt8(128);\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_DataStartX));\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_DataStartY));\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Map.GetData().size()));\n\tfor (auto itr = a_Map.GetData().cbegin(); itr != a_Map.GetData().cend(); ++itr)\n\t{\n\t\tPkt.WriteBEUInt8(*itr);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerAbilities(void)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tByte Flags = 0;\n\tconst cPlayer * Player = m_Client->GetPlayer();\n\n\tif (Player->IsGameModeCreative() || Player->IsGameModeSpectator())\n\t{\n\t\tFlags |= 0x01;  // Invulnerability.\n\t}\n\tif (Player->IsFlying())\n\t{\n\t\tFlags |= 0x02;\n\t}\n\tif (Player->CanFly())\n\t{\n\t\tFlags |= 0x04;\n\t}\n\tif (Player->IsGameModeCreative())\n\t{\n\t\tFlags |= 0x08;  // Godmode: creative instant break.\n\t}\n\n\tcPacketizer Pkt(*this, pktPlayerAbilities);\n\tPkt.WriteBEUInt8(Flags);\n\tPkt.WriteBEFloat(static_cast<float>(0.05 * Player->GetFlyingMaxSpeed()));\n\tPkt.WriteBEFloat(static_cast<float>(0.1 * Player->GetNormalMaxSpeed()));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendParticleEffect(const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktParticleEffect);\n\tPkt.WriteBEInt32(GetProtocolParticleID(a_ParticleName));\n\tPkt.WriteBool(false);\n\tPkt.WriteBEFloat(a_Src.x);\n\tPkt.WriteBEFloat(a_Src.y);\n\tPkt.WriteBEFloat(a_Src.z);\n\tPkt.WriteBEFloat(a_Offset.x);\n\tPkt.WriteBEFloat(a_Offset.y);\n\tPkt.WriteBEFloat(a_Offset.z);\n\tPkt.WriteBEFloat(a_ParticleData);\n\tPkt.WriteBEInt32(a_ParticleAmount);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendParticleEffect(const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tconst auto ParticleID = GetProtocolParticleID(a_ParticleName);\n\n\tcPacketizer Pkt(*this, pktParticleEffect);\n\tPkt.WriteBEInt32(ParticleID);\n\tPkt.WriteBool(false);\n\tPkt.WriteBEFloat(a_Src.x);\n\tPkt.WriteBEFloat(a_Src.y);\n\tPkt.WriteBEFloat(a_Src.z);\n\tPkt.WriteBEFloat(a_Offset.x);\n\tPkt.WriteBEFloat(a_Offset.y);\n\tPkt.WriteBEFloat(a_Offset.z);\n\tPkt.WriteBEFloat(a_ParticleData);\n\tPkt.WriteBEInt32(a_ParticleAmount);\n\n\tswitch (ParticleID)\n\t{\n\t\t// iconcrack\n\t\tcase 36:\n\t\t{\n\t\t\tPkt.WriteVarInt32(static_cast<UInt32>(a_Data[0]));\n\t\t\tPkt.WriteVarInt32(static_cast<UInt32>(a_Data[1]));\n\t\t\tbreak;\n\t\t}\n\t\t// blockcrack\n\t\t// blockdust\n\t\tcase 37:\n\t\tcase 38:\n\t\t{\n\t\t\tPkt.WriteVarInt32(static_cast<UInt32>(a_Data[0]));\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerListAddPlayer(const cPlayer & a_Player)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPlayerList);\n\tPkt.WriteVarInt32(0);\n\tPkt.WriteVarInt32(1);\n\tPkt.WriteUUID(a_Player.GetUUID());\n\tPkt.WriteString(a_Player.GetPlayerListName());\n\n\tconst Json::Value & Properties = a_Player.GetClientHandle()->GetProperties();\n\tPkt.WriteVarInt32(Properties.size());\n\tfor (auto & Node : Properties)\n\t{\n\t\tPkt.WriteString(Node.get(\"name\", \"\").asString());\n\t\tPkt.WriteString(Node.get(\"value\", \"\").asString());\n\t\tAString Signature = Node.get(\"signature\", \"\").asString();\n\t\tif (Signature.empty())\n\t\t{\n\t\t\tPkt.WriteBool(false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPkt.WriteBool(true);\n\t\t\tPkt.WriteString(Signature);\n\t\t}\n\t}\n\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Player.GetEffectiveGameMode()));\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Player.GetClientHandle()->GetPing()));\n\tPkt.WriteBool(false);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerListHeaderFooter(const cCompositeChat & a_Header, const cCompositeChat & a_Footer)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPlayerListHeaderFooter);\n\tPkt.WriteString(a_Header.CreateJsonString(false));\n\tPkt.WriteString(a_Footer.CreateJsonString(false));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerListRemovePlayer(const cPlayer & a_Player)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPlayerList);\n\tPkt.WriteVarInt32(4);\n\tPkt.WriteVarInt32(1);\n\tPkt.WriteUUID(a_Player.GetUUID());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_CustomName)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPlayerList);\n\tPkt.WriteVarInt32(3);\n\tPkt.WriteVarInt32(1);\n\tPkt.WriteUUID(a_Player.GetUUID());\n\n\tif (a_CustomName.empty())\n\t{\n\t\tPkt.WriteBool(false);\n\t}\n\telse\n\t{\n\t\tPkt.WriteBool(true);\n\t\tPkt.WriteString(JsonUtils::SerializeSingleValueJsonObject(\"text\", a_CustomName));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerListUpdateGameMode(const cPlayer & a_Player)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPlayerList);\n\tPkt.WriteVarInt32(1);\n\tPkt.WriteVarInt32(1);\n\tPkt.WriteUUID(a_Player.GetUUID());\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Player.GetEffectiveGameMode()));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerListUpdatePing()\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPlayerList);\n\tPkt.WriteVarInt32(2);\n\n\tconst auto World = m_Client->GetPlayer()->GetWorld();\n\tPkt.WriteVarInt32(static_cast<UInt32>(World->GetPlayerCount()));\n\tWorld->ForEachPlayer([&Pkt](cPlayer & a_Player)\n\t{\n\t\tPkt.WriteUUID(a_Player.GetUUID());\n\t\tPkt.WriteVarInt32(static_cast<UInt32>(a_Player.GetClientHandle()->GetPing()));\n\t\treturn false;\n\t});\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerMoveLook (const Vector3d a_Pos, const float a_Yaw, const float a_Pitch, const bool a_IsRelative)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPlayerMoveLook);\n\tPkt.WriteBEDouble(a_Pos.x);\n\tPkt.WriteBEDouble(a_Pos.y);\n\tPkt.WriteBEDouble(a_Pos.z);\n\tPkt.WriteBEFloat(a_Yaw);\n\tPkt.WriteBEFloat(a_Pitch);\n\n\tif (a_IsRelative)\n\t{\n\t\t// Set all bits to 1 - makes everything relative\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(-1));\n\t}\n\telse\n\t{\n\t\t// Set all bits to 0 - make everything absolute\n\t\tPkt.WriteBEUInt8(0);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerMoveLook(void)\n{\n\tcPlayer * Player = m_Client->GetPlayer();\n\tSendPlayerMoveLook(Player->GetPosition(), static_cast<float>(Player->GetYaw()), static_cast<float>(Player->GetPitch()), false);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerPermissionLevel()\n{\n\t// 1.8 has no concept of a permission level.\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerPosition(void)\n{\n\t// There is no dedicated packet for this, send the whole thing:\n\tSendPlayerMoveLook();\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPlayerSpawn(const cPlayer & a_Player)\n{\n\t// Called to spawn another player for the client\n\tcPacketizer Pkt(*this, pktSpawnOtherPlayer);\n\tPkt.WriteVarInt32(a_Player.GetUniqueID());\n\tPkt.WriteUUID(a_Player.GetUUID());\n\tVector3d LastSentPos = a_Player.GetLastSentPosition();\n\tPkt.WriteFPInt(LastSentPos.x);\n\tPkt.WriteFPInt(LastSentPos.y + 0.001);  // The \"+ 0.001\" is there because otherwise the player falls through the block they were standing on.\n\tPkt.WriteFPInt(LastSentPos.z);\n\tPkt.WriteByteAngle(a_Player.GetYaw());\n\tPkt.WriteByteAngle(a_Player.GetPitch());\n\tPkt.WriteBEInt16(a_Player.GetEquippedItem().IsEmpty() ? 0 : a_Player.GetEquippedItem().m_ItemType);\n\tWriteEntityMetadata(Pkt, a_Player);\n\tPkt.WriteBEUInt8(0x7f);  // Metadata: end\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPluginMessage(const AString & a_Channel, const ContiguousByteBufferView a_Message)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPluginMessage);\n\tPkt.WriteString(a_Channel);\n\tPkt.WriteBuf(a_Message);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendRemoveEntityEffect(const cEntity & a_Entity, int a_EffectID)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktRemoveEntityEffect);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_EffectID));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendResetTitle(void)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTitle);\n\tPkt.WriteVarInt32(4);  // Reset title\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendResourcePack(const AString & a_ResourcePackUrl)\n{\n\tcPacketizer Pkt(*this, pktResourcePack);\n\n\tcSha1Checksum Checksum;\n\tChecksum.Update(reinterpret_cast<const Byte *>(a_ResourcePackUrl.c_str()), a_ResourcePackUrl.size());\n\tByte Digest[20];\n\tChecksum.Finalize(Digest);\n\tAString Sha1Output;\n\tcSha1Checksum::DigestToHex(Digest, Sha1Output);\n\n\tPkt.WriteString(a_ResourcePackUrl);\n\tPkt.WriteString(Sha1Output);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendRespawn(eDimension a_Dimension)\n{\n\tcPacketizer Pkt(*this, pktRespawn);\n\tcPlayer * Player = m_Client->GetPlayer();\n\tPkt.WriteBEInt32(static_cast<Int32>(a_Dimension));\n\tPkt.WriteBEUInt8(2);  // TODO: Difficulty (set to Normal)\n\tPkt.WriteBEUInt8(static_cast<Byte>(Player->GetEffectiveGameMode()));\n\tPkt.WriteString(\"default\");\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktScoreboardObjective);\n\tPkt.WriteString(a_Name);\n\tPkt.WriteBEUInt8(a_Mode);\n\tif ((a_Mode == 0) || (a_Mode == 2))\n\t{\n\t\tPkt.WriteString(a_DisplayName);\n\t\tPkt.WriteString(\"integer\");\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendScoreUpdate(const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktUpdateScore);\n\tPkt.WriteString(a_Player);\n\tPkt.WriteBEUInt8(a_Mode);\n\tPkt.WriteString(a_Objective);\n\n\tif (a_Mode != 1)\n\t{\n\t\tPkt.WriteVarInt32(static_cast<UInt32>(a_Score));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendDisplayObjective(const AString & a_Objective, cScoreboard::eDisplaySlot a_Display)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktDisplayObjective);\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Display));\n\tPkt.WriteString(a_Objective);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendSetSubTitle(const cCompositeChat & a_SubTitle)\n{\n\tSendSetRawSubTitle(a_SubTitle.CreateJsonString(false));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendSetRawSubTitle(const AString & a_SubTitle)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTitle);\n\tPkt.WriteVarInt32(1);  // Set subtitle\n\tPkt.WriteString(a_SubTitle);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendSetTitle(const cCompositeChat & a_Title)\n{\n\tSendSetRawTitle(a_Title.CreateJsonString(false));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendSetRawTitle(const AString & a_Title)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTitle);\n\tPkt.WriteVarInt32(0);  // Set title\n\tPkt.WriteString(a_Title);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendSoundEffect(const AString & a_SoundName, Vector3d a_Origin, float a_Volume, float a_Pitch)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSoundEffect);\n\tPkt.WriteString(a_SoundName);\n\tPkt.WriteBEInt32(static_cast<Int32>(a_Origin.x * 8.0));\n\tPkt.WriteBEInt32(static_cast<Int32>(a_Origin.y * 8.0));\n\tPkt.WriteBEInt32(static_cast<Int32>(a_Origin.z * 8.0));\n\tPkt.WriteBEFloat(a_Volume);\n\tPkt.WriteBEUInt8(static_cast<Byte>(a_Pitch * 63));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendSoundParticleEffect(const EffectID a_EffectID, Vector3i a_Origin, int a_Data)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSoundParticleEffect);\n\tPkt.WriteBEInt32(static_cast<int>(a_EffectID));\n\tPkt.WriteXYZPosition64(a_Origin);\n\tPkt.WriteBEInt32(a_Data);\n\tPkt.WriteBool(false);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendSpawnEntity(const cEntity & a_Entity)\n{\n\tInt32 EntityData = /* Default: velocity present flag */ 1;\n\tconst auto EntityType = GetProtocolEntityType(a_Entity);\n\n\tif (a_Entity.IsMinecart())\n\t{\n\t\tconst auto & Cart = static_cast<const cMinecart &>(a_Entity);\n\t\tEntityData = static_cast<Int32>(Cart.GetPayload());\n\t}\n\telse if (a_Entity.IsItemFrame())\n\t{\n\t\tconst auto & Frame = static_cast<const cItemFrame &>(a_Entity);\n\t\tEntityData = static_cast<Int32>(Frame.GetProtocolFacing());\n\t}\n\telse if (a_Entity.IsFallingBlock())\n\t{\n\t\tconst auto & Block = static_cast<const cFallingBlock &>(a_Entity);\n\t\tEntityData = Block.GetBlockType() | (static_cast<Int32>(Block.GetBlockMeta()) << 12);\n\t}\n\telse if (a_Entity.IsFloater())\n\t{\n\t\tconst auto & Floater = static_cast<const cFloater &>(a_Entity);\n\t\tEntityData = static_cast<Int32>(Floater.GetOwnerID());\n\t}\n\telse if (a_Entity.IsProjectile())\n\t{\n\t\tusing PType = cProjectileEntity::eKind;\n\t\tconst auto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\n\t\tif (Projectile.GetProjectileKind() == PType::pkArrow)\n\t\t{\n\t\t\tconst auto & Arrow = static_cast<const cArrowEntity &>(Projectile);\n\t\t\tEntityData = static_cast<Int32>(Arrow.GetCreatorUniqueID() + 1);\n\t\t}\n\t}\n\n\tSendEntitySpawn(a_Entity, EntityType, EntityData);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendSpawnMob(const cMonster & a_Mob)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tconst auto MobType = GetProtocolMobType(a_Mob.GetMobType());\n\n\t// If the type is not valid in this protocol bail out:\n\tif (MobType == 0)\n\t{\n\t\treturn;\n\t}\n\n\tcPacketizer Pkt(*this, pktSpawnMob);\n\tPkt.WriteVarInt32(a_Mob.GetUniqueID());\n\tPkt.WriteBEUInt8(static_cast<Byte>(MobType));\n\tVector3d LastSentPos = a_Mob.GetLastSentPosition();\n\tPkt.WriteFPInt(LastSentPos.x);\n\tPkt.WriteFPInt(LastSentPos.y);\n\tPkt.WriteFPInt(LastSentPos.z);\n\tPkt.WriteByteAngle(a_Mob.GetHeadYaw());  // Doesn't seem to be used\n\tPkt.WriteByteAngle(a_Mob.GetPitch());\n\tPkt.WriteByteAngle(a_Mob.GetYaw());\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedX() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedY() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedZ() * 400));\n\tWriteEntityMetadata(Pkt, a_Mob);\n\tPkt.WriteBEUInt8(0x7f);  // Metadata terminator\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendStatistics(const StatisticsManager & a_Manager)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktStatistics);\n\n\t// No need to check Size != 0.\n\t// Assume that the vast majority of the time there's at least one statistic to send:\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Manager.Custom.size()));\n\n\tfor (const auto & [Statistic, Value] : a_Manager.Custom)\n\t{\n\t\tPkt.WriteString(GetProtocolStatisticName(Statistic));\n\t\tPkt.WriteVarInt32(static_cast<UInt32>(Value));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendTabCompletionResults(const AStringVector & a_Results)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTabCompletionResults);\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Results.size()));\n\n\tfor (AStringVector::const_iterator itr = a_Results.begin(), end = a_Results.end(); itr != end; ++itr)\n\t{\n\t\tPkt.WriteString(*itr);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendThunderbolt(Vector3i a_Origin)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSpawnGlobalEntity);\n\tPkt.WriteVarInt32(0);  // EntityID = 0, always\n\tPkt.WriteBEUInt8(1);  // Type = Thunderbolt\n\tPkt.WriteFPInt(a_Origin.x);\n\tPkt.WriteFPInt(a_Origin.y);\n\tPkt.WriteFPInt(a_Origin.z);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendTitleTimes(int a_FadeInTicks, int a_DisplayTicks, int a_FadeOutTicks)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTitle);\n\tPkt.WriteVarInt32(2);  // Set title display times\n\tPkt.WriteBEInt32(a_FadeInTicks);\n\tPkt.WriteBEInt32(a_DisplayTicks);\n\tPkt.WriteBEInt32(a_FadeOutTicks);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendTimeUpdate(const cTickTimeLong a_WorldAge, const cTickTimeLong a_WorldDate, const bool a_DoDaylightCycle)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktTimeUpdate);\n\tPkt.WriteBEInt64(a_WorldAge.count());\n\n\tif (a_DoDaylightCycle)\n\t{\n\t\tPkt.WriteBEInt64(a_WorldDate.count());\n\t}\n\telse\n\t{\n\t\t// Negating the date stops time from advancing on the client\n\t\t// (the std::min construction is to handle the case where the date is exactly zero):\n\t\tPkt.WriteBEInt64(std::min(-a_WorldDate.count(), -1LL));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendUnloadChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktUnloadChunk);\n\tPkt.WriteBEInt32(a_ChunkX);\n\tPkt.WriteBEInt32(a_ChunkZ);\n\tPkt.WriteBool(true);\n\tPkt.WriteBEInt16(0);  // Primary bitmap\n\tPkt.WriteVarInt32(0);  // Data size\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tByte Action;\n\tswitch (a_BlockEntity.GetBlockType())\n\t{\n\t\tcase E_BLOCK_CHEST:\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\t{\n\t\t\t// The ones with a action of 0 is just a workaround to send the block entities to a client.\n\t\t\t// Todo: 18.09.2020 - remove this when block entities are transmitted in the ChunkData packet - 12xx12\n\t\t\tAction = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase E_BLOCK_MOB_SPAWNER:       Action = 1;  break;  // Update mob spawner spinny mob thing\n\t\tcase E_BLOCK_COMMAND_BLOCK:     Action = 2;  break;  // Update command block text\n\t\tcase E_BLOCK_BEACON:            Action = 3;  break;  // Update beacon entity\n\t\tcase E_BLOCK_HEAD:              Action = 4;  break;  // Update mobhead entity\n\t\tcase E_BLOCK_FLOWER_POT:        Action = 5;  break;  // Update flower pot\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_STANDING_BANNER:   Action = 6;  break;  // Update banner\n\n\t\tdefault: return;  // Block entities change between versions\n\t}\n\n\tcPacketizer Pkt(*this, pktUpdateBlockEntity);\n\tPkt.WriteXYZPosition64(a_BlockEntity.GetPosX(), a_BlockEntity.GetPosY(), a_BlockEntity.GetPosZ());\n\tPkt.WriteBEUInt8(Action);\n\n\tcFastNBTWriter Writer;\n\tWriteBlockEntity(Writer, a_BlockEntity);\n\tWriter.Finish();\n\tPkt.WriteBuf(Writer.GetResult());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendUpdateSign(Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktUpdateSign);\n\tPkt.WriteXYZPosition64(a_BlockPos);\n\n\tAString Lines[] = { a_Line1, a_Line2, a_Line3, a_Line4 };\n\tfor (size_t i = 0; i < ARRAYCOUNT(Lines); i++)\n\t{\n\t\tPkt.WriteString(JsonUtils::SerializeSingleValueJsonObject(\"text\", Lines[i]));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendUnlockRecipe(UInt32 a_RecipeID)\n{\n\t// Client doesn't support this feature\n\treturn;\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendInitRecipes(UInt32 a_RecipeID)\n{\n\t// Client doesn't support this feature\n\treturn;\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendWeather(eWeather a_Weather)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\t{\n\t\tcPacketizer Pkt(*this, pktWeather);\n\t\tPkt.WriteBEUInt8((a_Weather == wSunny) ? 1 : 2);  // End rain / begin rain\n\t\tPkt.WriteBEFloat(0);  // Unused for weather\n\t}\n\n\t// TODO: Fade effect, somehow\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendWholeInventory(const cWindow & a_Window)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktWindowItems);\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Window.GetWindowID()));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Window.GetNumSlots()));\n\tcItems Slots;\n\ta_Window.GetSlots(*(m_Client->GetPlayer()), Slots);\n\tfor (cItems::const_iterator itr = Slots.begin(), end = Slots.end(); itr != end; ++itr)\n\t{\n\t\tWriteItem(Pkt, *itr);\n\t}  // for itr - Slots[]\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendWindowClose(const cWindow & a_Window)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktWindowClose);\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Window.GetWindowID()));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendWindowOpen(const cWindow & a_Window)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tif (a_Window.GetWindowType() < 0)\n\t{\n\t\t// Do not send this packet for player inventory windows\n\t\treturn;\n\t}\n\n\tcPacketizer Pkt(*this, pktWindowOpen);\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Window.GetWindowID()));\n\tPkt.WriteString(a_Window.GetWindowTypeName());\n\tPkt.WriteString(JsonUtils::SerializeSingleValueJsonObject(\"text\", a_Window.GetWindowTitle()));\n\n\tswitch (a_Window.GetWindowType())\n\t{\n\t\tcase cWindow::wtWorkbench:\n\t\tcase cWindow::wtEnchantment:\n\t\tcase cWindow::wtAnvil:\n\t\t{\n\t\t\tPkt.WriteBEUInt8(0);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Window.GetNumNonInventorySlots()));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (a_Window.GetWindowType() == cWindow::wtAnimalChest)\n\t{\n\t\tUInt32 HorseID = static_cast<const cHorseWindow &>(a_Window).GetHorseID();\n\t\tPkt.WriteBEInt32(static_cast<Int32>(HorseID));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendWindowProperty(const cWindow & a_Window, size_t a_Property, short a_Value)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktWindowProperty);\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Window.GetWindowID()));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Property));\n\tPkt.WriteBEInt16(a_Value);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::CompressPacket(CircularBufferCompressor & a_Packet, ContiguousByteBuffer & a_CompressedData)\n{\n\tconst auto Uncompressed = a_Packet.GetView();\n\n\tif (Uncompressed.size() < CompressionThreshold)\n\t{\n\t\t/* Size doesn't reach threshold, not worth compressing.\n\n\t\t--------------- Packet format ----------------\n\t\t|--- Header ---------------------------------|\n\t\t| PacketSize: Size of all fields below       |\n\t\t| DataSize: Zero, means below not compressed |\n\t\t|--- Body -----------------------------------|\n\t\t| a_Packet: copy of uncompressed data        |\n\t\t----------------------------------------------\n\t\t*/\n\t\tconst UInt32 DataSize = 0;\n\t\tconst auto PacketSize = static_cast<UInt32>(cByteBuffer::GetVarIntSize(DataSize) + Uncompressed.size());\n\n\t\tcByteBuffer LengthHeaderBuffer(\n\t\t\tcByteBuffer::GetVarIntSize(PacketSize) +\n\t\t\tcByteBuffer::GetVarIntSize(DataSize)\n\t\t);\n\n\t\tLengthHeaderBuffer.WriteVarInt32(PacketSize);\n\t\tLengthHeaderBuffer.WriteVarInt32(DataSize);\n\n\t\tContiguousByteBuffer LengthData;\n\t\tLengthHeaderBuffer.ReadAll(LengthData);\n\n\t\ta_CompressedData.reserve(LengthData.size() + Uncompressed.size());\n\t\ta_CompressedData = LengthData;\n\t\ta_CompressedData += Uncompressed;\n\n\t\treturn;\n\t}\n\n\t/* Definitely worth compressing.\n\n\t--------------- Packet format ----------------\n\t|--- Header ---------------------------------|\n\t| PacketSize: Size of all fields below       |\n\t| DataSize: Size of uncompressed a_Packet    |\n\t|--- Body -----------------------------------|\n\t| CompressedData: compressed a_Packet        |\n\t----------------------------------------------\n\t*/\n\n\tconst auto CompressedData = a_Packet.Compress();\n\tconst auto Compressed = CompressedData.GetView();\n\n\tconst UInt32 DataSize = static_cast<UInt32>(Uncompressed.size());\n\tconst auto PacketSize = static_cast<UInt32>(cByteBuffer::GetVarIntSize(DataSize) + Compressed.size());\n\n\tcByteBuffer LengthHeaderBuffer(\n\t\tcByteBuffer::GetVarIntSize(PacketSize) +\n\t\tcByteBuffer::GetVarIntSize(DataSize)\n\t);\n\n\tLengthHeaderBuffer.WriteVarInt32(PacketSize);\n\tLengthHeaderBuffer.WriteVarInt32(DataSize);\n\n\tContiguousByteBuffer LengthData;\n\tLengthHeaderBuffer.ReadAll(LengthData);\n\n\ta_CompressedData.reserve(LengthData.size() + Compressed.size());\n\ta_CompressedData = LengthData;\n\ta_CompressedData += Compressed;\n}\n\n\n\n\n\neBlockFace cProtocol_1_8_0::FaceIntToBlockFace(const Int32 a_BlockFace)\n{\n\t// Normalize the blockface values returned from the protocol\n\t// Anything known gets mapped 1:1, everything else returns BLOCK_FACE_NONE\n\tswitch (a_BlockFace)\n\t{\n\t\tcase BLOCK_FACE_XM: return BLOCK_FACE_XM;\n\t\tcase BLOCK_FACE_XP: return BLOCK_FACE_XP;\n\t\tcase BLOCK_FACE_YM: return BLOCK_FACE_YM;\n\t\tcase BLOCK_FACE_YP: return BLOCK_FACE_YP;\n\t\tcase BLOCK_FACE_ZM: return BLOCK_FACE_ZM;\n\t\tcase BLOCK_FACE_ZP: return BLOCK_FACE_ZP;\n\t\tdefault: return BLOCK_FACE_NONE;\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_8_0::GetPacketID(ePacketType a_PacketType) const\n{\n\tswitch (a_PacketType)\n\t{\n\t\tcase pktAttachEntity:           return 0x1b;\n\t\tcase pktBlockAction:            return 0x24;\n\t\tcase pktBlockBreakAnim:         return 0x25;\n\t\tcase pktBlockChange:            return 0x23;\n\t\tcase pktBlockChanges:           return 0x22;\n\t\tcase pktCameraSetTo:            return 0x43;\n\t\tcase pktChatRaw:                return 0x02;\n\t\tcase pktCollectEntity:          return 0x0d;\n\t\tcase pktDestroyEntity:          return 0x13;\n\t\tcase pktDifficulty:             return 0x41;\n\t\tcase pktDisconnectDuringGame:   return 0x40;\n\t\tcase pktDisconnectDuringLogin:  return 0x00;\n\t\tcase pktDisplayObjective:       return 0x3d;\n\t\tcase pktEditSign:               return 0x36;\n\t\tcase pktEncryptionRequest:      return 0x01;\n\t\tcase pktEntityAnimation:        return 0x0b;\n\t\tcase pktEntityEffect:           return 0x1d;\n\t\tcase pktEntityEquipment:        return 0x04;\n\t\tcase pktEntityHeadLook:         return 0x19;\n\t\tcase pktEntityLook:             return 0x16;\n\t\tcase pktEntityMeta:             return 0x1c;\n\t\tcase pktEntityProperties:       return 0x20;\n\t\tcase pktEntityRelMove:          return 0x15;\n\t\tcase pktEntityRelMoveLook:      return 0x17;\n\t\tcase pktEntityStatus:           return 0x1a;\n\t\tcase pktEntityVelocity:         return 0x12;\n\t\tcase pktExperience:             return 0x1f;\n\t\tcase pktExplosion:              return 0x27;\n\t\tcase pktGameMode:               return 0x2b;\n\t\tcase pktHeldItemChange:         return 0x09;\n\t\tcase pktInventorySlot:          return 0x2f;\n\t\tcase pktJoinGame:               return 0x01;\n\t\tcase pktKeepAlive:              return 0x00;\n\t\tcase pktLeashEntity:            return 0x1b;\n\t\tcase pktLoginSuccess:           return 0x02;\n\t\tcase pktMapData:                return 0x34;\n\t\tcase pktParticleEffect:         return 0x2a;\n\t\tcase pktPingResponse:           return 0x01;\n\t\tcase pktPlayerAbilities:        return 0x39;\n\t\tcase pktPlayerList:             return 0x38;\n\t\tcase pktPlayerListHeaderFooter: return 0x47;\n\t\tcase pktPlayerMoveLook:         return 0x08;\n\t\tcase pktPluginMessage:          return 0x3f;\n\t\tcase pktRemoveEntityEffect:     return 0x1e;\n\t\tcase pktResourcePack:           return 0x48;\n\t\tcase pktRespawn:                return 0x07;\n\t\tcase pktScoreboardObjective:    return 0x3b;\n\t\tcase pktSoundEffect:            return 0x29;\n\t\tcase pktSoundParticleEffect:    return 0x28;\n\t\tcase pktSpawnExperienceOrb:     return 0x11;\n\t\tcase pktSpawnGlobalEntity:      return 0x2c;\n\t\tcase pktSpawnMob:               return 0x0f;\n\t\tcase pktSpawnObject:            return 0x0e;\n\t\tcase pktSpawnOtherPlayer:       return 0x0c;\n\t\tcase pktSpawnPainting:          return 0x10;\n\t\tcase pktSpawnPosition:          return 0x05;\n\t\tcase pktStartCompression:       return 0x03;\n\t\tcase pktStatistics:             return 0x37;\n\t\tcase pktStatusResponse:         return 0x00;\n\t\tcase pktTabCompletionResults:   return 0x3a;\n\t\tcase pktTeleportEntity:         return 0x18;\n\t\tcase pktTimeUpdate:             return 0x03;\n\t\tcase pktTitle:                  return 0x45;\n\t\tcase pktUnloadChunk:            return 0x21;\n\t\tcase pktUpdateBlockEntity:      return 0x35;\n\t\tcase pktUpdateHealth:           return 0x06;\n\t\tcase pktUpdateScore:            return 0x3c;\n\t\tcase pktUpdateSign:             return 0x33;\n\t\tcase pktUseBed:                 return 0x0a;\n\t\tcase pktWeather:                return 0x2b;\n\t\tcase pktWindowClose:            return 0x2e;\n\t\tcase pktWindowItems:            return 0x30;\n\t\tcase pktWindowOpen:             return 0x2d;\n\t\tcase pktWindowProperty:         return 0x31;\n\t\tdefault:\n\t\t{\n\t\t\tLOG(\"Unhandled outgoing packet type: %s (0x%02x)\", cPacketizer::PacketTypeToStr(a_PacketType), a_PacketType);\n\t\t\tASSERT(!\"Unhandled outgoing packet type\");\n\t\t\treturn 0;\n\t\t}\n\t}\n}\n\n\n\n\n\nunsigned char cProtocol_1_8_0::GetProtocolEntityAnimation(const EntityAnimation a_Animation) const\n{\n\tswitch (a_Animation)\n\t{\n\t\tcase EntityAnimation::EntityGetsCriticalHit: return 4;\n\t\tcase EntityAnimation::EntityGetsMagicalCriticalHit: return 5;\n\t\tcase EntityAnimation::PlayerLeavesBed: return 2;\n\t\tcase EntityAnimation::PlayerMainHandSwings: return 0;\n\t\tcase EntityAnimation::PlayerOffHandSwings: return 0;\n\t\tdefault: return static_cast<unsigned char>(-1);\n\t}\n}\n\n\n\n\n\nsigned char cProtocol_1_8_0::GetProtocolEntityStatus(const EntityAnimation a_Animation) const\n{\n\tswitch (a_Animation)\n\t{\n\t\tcase EntityAnimation::AnimalFallsInLove: return 18;\n\t\tcase EntityAnimation::FireworkRocketExplodes: return 17;\n\t\tcase EntityAnimation::GuardianAttacks: return 21;\n\t\tcase EntityAnimation::HorseTamingFails: return 6;\n\t\tcase EntityAnimation::HorseTamingSucceeds: return 7;\n\t\tcase EntityAnimation::IronGolemAttacks: return 4;\n\t\tcase EntityAnimation::IronGolemOffersGift: return 11;\n\t\tcase EntityAnimation::MinecartSpawnerDelayResets: return 1;\n\t\tcase EntityAnimation::MinecartTNTIgnites: return 10;\n\t\tcase EntityAnimation::MobSpawns: return 20;\n\t\tcase EntityAnimation::OcelotTrusts: return 6;\n\t\tcase EntityAnimation::OcelotDistrusts: return 7;\n\t\tcase EntityAnimation::PawnBerryBushPricks: return 2;\n\t\tcase EntityAnimation::PawnBurns: return 2;\n\t\tcase EntityAnimation::PawnDies: return 3;\n\t\tcase EntityAnimation::PawnDrowns: return 2;\n\t\tcase EntityAnimation::PawnHurts: return 2;\n\t\tcase EntityAnimation::PawnThornsPricks: return 2;\n\t\tcase EntityAnimation::PlayerFinishesEating: return 9;\n\t\tcase EntityAnimation::RabbitJumps: return 1;\n\t\tcase EntityAnimation::SheepEatsGrass: return 10;\n\t\tcase EntityAnimation::VillagerKisses: return 12;\n\t\tcase EntityAnimation::VillagerShowsAnger: return 13;\n\t\tcase EntityAnimation::VillagerShowsHappiness: return 14;\n\t\tcase EntityAnimation::WitchMagicks: return 15;\n\t\tcase EntityAnimation::WolfShakesWater: return 8;\n\t\tcase EntityAnimation::WolfTamingFails: return 6;\n\t\tcase EntityAnimation::WolfTamingSucceeds: return 7;\n\t\tcase EntityAnimation::ZombieVillagerCureFinishes: return 16;\n\t\tdefault: return -1;\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_8_0::GetProtocolMobType(const eMonsterType a_MobType) const\n{\n\tswitch (a_MobType)\n\t{\n\t\t// Map invalid type to Giant for easy debugging (if this ever spawns, something has gone very wrong)\n\t\tcase mtInvalidType:           return 53;\n\t\tcase mtBat:                   return 65;\n\t\tcase mtBlaze:                 return 61;\n\t\tcase mtCaveSpider:            return 59;\n\t\tcase mtChicken:               return 93;\n\t\tcase mtCow:                   return 92;\n\t\tcase mtCreeper:               return 50;\n\t\tcase mtEnderDragon:           return 63;\n\t\tcase mtEnderman:              return 58;\n\t\tcase mtEndermite:             return 67;\n\t\tcase mtGhast:                 return 56;\n\t\tcase mtGiant:                 return 53;\n\t\tcase mtGuardian:              return 68;\n\t\tcase mtHorse:                 return 100;\n\t\tcase mtIronGolem:             return 99;\n\t\tcase mtMagmaCube:             return 62;\n\t\tcase mtMooshroom:             return 96;\n\t\tcase mtOcelot:                return 98;\n\t\tcase mtPig:                   return 90;\n\t\tcase mtRabbit:                return 101;\n\t\tcase mtSheep:                 return 91;\n\t\tcase mtSilverfish:            return 60;\n\t\tcase mtSkeleton:              return 51;\n\t\tcase mtSlime:                 return 55;\n\t\tcase mtSnowGolem:             return 97;\n\t\tcase mtSpider:                return 52;\n\t\tcase mtSquid:                 return 94;\n\t\tcase mtVillager:              return 120;\n\t\tcase mtWitch:                 return 66;\n\t\tcase mtWither:                return 64;\n\t\tcase mtWitherSkeleton:        return 51;\n\t\tcase mtWolf:                  return 95;\n\t\tcase mtZombie:                return 54;\n\t\tcase mtZombiePigman:          return 57;\n\t\tcase mtZombieVillager:        return 27;\n\n\t\t// Mobs that get replaced with another because they were added later\n\t\tcase mtCat:                   return GetProtocolMobType(mtOcelot);\n\t\tcase mtDonkey:                return GetProtocolMobType(mtHorse);\n\t\tcase mtMule:                  return GetProtocolMobType(mtHorse);\n\t\tcase mtSkeletonHorse:         return GetProtocolMobType(mtHorse);\n\t\tcase mtZombieHorse:           return GetProtocolMobType(mtHorse);\n\t\tcase mtStray:                 return GetProtocolMobType(mtSkeleton);\n\t\tcase mtHusk:                  return GetProtocolMobType(mtZombie);\n\n\t\tdefault:                      return 0;\n\t}\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_8_0::GetProtocolVersion() const\n{\n\treturn Version::v1_8_0;\n}\n\n\n\n\n\nbool cProtocol_1_8_0::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType)\n{\n\tswitch (m_State)\n\t{\n\t\tcase State::Status:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketStatusRequest(a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketStatusPing   (a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase State::Login:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketLoginStart             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketLoginEncryptionResponse(a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase State::Game:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketKeepAlive              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketChatMessage            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x02: HandlePacketUseEntity              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x03: HandlePacketPlayer                 (a_ByteBuffer); return true;\n\t\t\t\tcase 0x04: HandlePacketPlayerPos              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x05: HandlePacketPlayerLook             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x06: HandlePacketPlayerPosLook          (a_ByteBuffer); return true;\n\t\t\t\tcase 0x07: HandlePacketBlockDig               (a_ByteBuffer); return true;\n\t\t\t\tcase 0x08: HandlePacketBlockPlace             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x09: HandlePacketSlotSelect             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0a: HandlePacketAnimation              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0b: HandlePacketEntityAction           (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0c: HandlePacketSteerVehicle           (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0d: HandlePacketWindowClose            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0e: HandlePacketWindowClick            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0f:  // Confirm transaction - not used in MCS\n\t\t\t\tcase 0x10: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true;\n\t\t\t\tcase 0x11: HandlePacketEnchantItem            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x12: HandlePacketUpdateSign             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x13: HandlePacketPlayerAbilities        (a_ByteBuffer); return true;\n\t\t\t\tcase 0x14: HandlePacketTabComplete            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x15: HandlePacketClientSettings         (a_ByteBuffer); return true;\n\t\t\t\tcase 0x16: HandlePacketClientStatus           (a_ByteBuffer); return true;\n\t\t\t\tcase 0x17: HandlePacketPluginMessage          (a_ByteBuffer); return true;\n\t\t\t\tcase 0x18: HandlePacketSpectate               (a_ByteBuffer); return true;\n\t\t\t\tcase 0x19: HandlePacketResourcePackStatus     (a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}  // switch (m_State)\n\n\t// Unknown packet type, report to the ClientHandle:\n\tm_Client->PacketUnknown(a_PacketType);\n\treturn false;\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketStatusPing(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEInt64, Int64, Timestamp);\n\n\tcPacketizer Pkt(*this, pktPingResponse);\n\tPkt.WriteBEInt64(Timestamp);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer)\n{\n\tcServer * Server = cRoot::Get()->GetServer();\n\tAString ServerDescription = Server->GetDescription();\n\tauto NumPlayers = static_cast<signed>(Server->GetNumPlayers());\n\tauto MaxPlayers = static_cast<signed>(Server->GetMaxPlayers());\n\tAString Favicon = Server->GetFaviconData();\n\n\tcRoot::Get()->GetPluginManager()->CallHookServerPing(*m_Client, ServerDescription, NumPlayers, MaxPlayers, Favicon);\n\n\t// Version:\n\tJson::Value Version;\n\tconst auto ProtocolVersion = GetProtocolVersion();\n\tVersion[\"name\"] = \"Cuberite \" + cMultiVersionProtocol::GetVersionTextFromInt(ProtocolVersion);\n\tVersion[\"protocol\"] = static_cast<std::underlying_type_t<cProtocol::Version>>(ProtocolVersion);\n\n\t// Players:\n\tJson::Value Players;\n\tPlayers[\"online\"] = NumPlayers;\n\tPlayers[\"max\"] = MaxPlayers;\n\t// TODO: Add \"sample\"\n\n\t// Description:\n\tJson::Value Description;\n\tDescription[\"text\"] = std::move(ServerDescription);\n\n\t// Create the response:\n\tJson::Value ResponseValue;\n\tResponseValue[\"version\"] = Version;\n\tResponseValue[\"players\"] = Players;\n\tResponseValue[\"description\"] = Description;\n\tm_Client->ForgeAugmentServerListPing(ResponseValue);\n\tif (!Favicon.empty())\n\t{\n\t\tResponseValue[\"favicon\"] = \"data:image/png;base64,\" + Favicon;\n\t}\n\n\t// Serialize the response into a packet:\n\tcPacketizer Pkt(*this, pktStatusResponse);\n\tPkt.WriteString(JsonUtils::WriteFastString(ResponseValue));\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffer)\n{\n\tUInt32 EncKeyLength, EncNonceLength;\n\tif (!a_ByteBuffer.ReadVarInt(EncKeyLength))\n\t{\n\t\treturn;\n\t}\n\tContiguousByteBuffer EncKey;\n\tif (!a_ByteBuffer.ReadSome(EncKey, EncKeyLength))\n\t{\n\t\treturn;\n\t}\n\tif (!a_ByteBuffer.ReadVarInt(EncNonceLength))\n\t{\n\t\treturn;\n\t}\n\tContiguousByteBuffer EncNonce;\n\tif (!a_ByteBuffer.ReadSome(EncNonce, EncNonceLength))\n\t{\n\t\treturn;\n\t}\n\tif ((EncKeyLength > MAX_ENC_LEN) || (EncNonceLength > MAX_ENC_LEN))\n\t{\n\t\tLOGD(\"Too long encryption\");\n\t\tm_Client->Kick(\"Hacked client\");\n\t\treturn;\n\t}\n\n\t// Decrypt EncNonce using privkey\n\tcRsaPrivateKey & rsaDecryptor = cRoot::Get()->GetServer()->GetPrivateKey();\n\tUInt32 DecryptedNonce[MAX_ENC_LEN / sizeof(Int32)];\n\tint res = rsaDecryptor.Decrypt(EncNonce, reinterpret_cast<Byte *>(DecryptedNonce), sizeof(DecryptedNonce));\n\tif (res != 4)\n\t{\n\t\tLOGD(\"Bad nonce length: got %d, exp %d\", res, 4);\n\t\tm_Client->Kick(\"Hacked client\");\n\t\treturn;\n\t}\n\tif (ntohl(DecryptedNonce[0]) != static_cast<unsigned>(reinterpret_cast<uintptr_t>(this)))\n\t{\n\t\tLOGD(\"Bad nonce value\");\n\t\tm_Client->Kick(\"Hacked client\");\n\t\treturn;\n\t}\n\n\t// Decrypt the symmetric encryption key using privkey:\n\tByte DecryptedKey[MAX_ENC_LEN];\n\tres = rsaDecryptor.Decrypt(EncKey, DecryptedKey, sizeof(DecryptedKey));\n\tif (res != 16)\n\t{\n\t\tLOGD(\"Bad key length\");\n\t\tm_Client->Kick(\"Hacked client\");\n\t\treturn;\n\t}\n\n\tStartEncryption(DecryptedKey);\n\tm_Client->HandleLogin();\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketLoginStart(cByteBuffer & a_ByteBuffer)\n{\n\tAString Username;\n\tif (!a_ByteBuffer.ReadVarUTF8String(Username))\n\t{\n\t\tm_Client->Kick(\"Bad username\");\n\t\treturn;\n\t}\n\n\tif (!m_Client->HandleHandshake(Username))\n\t{\n\t\t// The client is not welcome here, they have been sent a Kick packet already\n\t\treturn;\n\t}\n\n\tm_Client->SetUsername(std::move(Username));\n\n\t// If auth is required, then send the encryption request:\n\tif (const auto Server = cRoot::Get()->GetServer(); Server->ShouldAuthenticate())\n\t{\n\t\tcPacketizer Pkt(*this, pktEncryptionRequest);\n\t\tPkt.WriteString(Server->GetServerID());\n\t\tconst auto PubKeyDer = Server->GetPublicKeyDER();\n\t\tPkt.WriteVarInt32(static_cast<UInt32>(PubKeyDer.size()));\n\t\tPkt.WriteBuf(PubKeyDer);\n\t\tPkt.WriteVarInt32(4);\n\t\tPkt.WriteBEInt32(static_cast<int>(reinterpret_cast<intptr_t>(this)));  // Using 'this' as the cryptographic nonce, so that we don't have to generate one each time :)\n\t\treturn;\n\t}\n\n\tm_Client->HandleLogin();\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketAnimation(cByteBuffer & a_ByteBuffer)\n{\n\tm_Client->HandleAnimation(true);  // Packet exists solely for arm-swing notification (main hand).\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketBlockDig(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Status);\n\n\tVector3i Position;\n\tif (!a_ByteBuffer.ReadXYZPosition64(Position))\n\t{\n\t\treturn;\n\t}\n\n\tHANDLE_READ(a_ByteBuffer, ReadBEInt8, Int8, Face);\n\n\tm_Client->HandleLeftClick(Position, FaceIntToBlockFace(Face), Status);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketBlockPlace(cByteBuffer & a_ByteBuffer)\n{\n\tVector3i BlockPos;\n\tif (!a_ByteBuffer.ReadXYZPosition64(BlockPos))\n\t{\n\t\treturn;\n\t}\n\n\tHANDLE_READ(a_ByteBuffer, ReadBEInt8, Int8, Face);\n\n\tcItem Item;  // Ignored\n\tReadItem(a_ByteBuffer, Item, 3);\n\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, CursorX);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, CursorY);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, CursorZ);\n\n\teBlockFace blockFace = FaceIntToBlockFace(Face);\n\tif (blockFace == eBlockFace::BLOCK_FACE_NONE)\n\t{\n\t\tm_Client->HandleUseItem(true);\n\t}\n\telse\n\t{\n\t\tm_Client->HandleRightClick(BlockPos, blockFace, {CursorX, CursorY, CursorZ}, true);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketChatMessage(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Message);\n\n\tm_Client->HandleChat(Message);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketClientSettings(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Locale);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,       UInt8,   ViewDistance);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,       UInt8,   ChatFlags);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,          bool,    ChatColors);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,       UInt8,   SkinParts);\n\n\tm_Client->SetLocale(Locale);\n\tm_Client->SetViewDistance(ViewDistance);\n\tm_Client->GetPlayer()->SetSkinParts(SkinParts);\n\t// TODO: Handle chat flags and chat colors\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketClientStatus(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, ActionID);\n\n\tswitch (ActionID)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\t// Respawn\n\t\t\tm_Client->HandleRespawn();\n\t\t\tbreak;\n\t\t}\n\t\tcase 1:\n\t\t{\n\t\t\t// Request stats\n\t\t\tSendStatistics(m_Client->GetPlayer()->GetStatistics());\n\t\t\tbreak;\n\t\t}\n\t\tcase 2:\n\t\t{\n\t\t\t// Open Inventory achievement\n\t\t\tm_Client->GetPlayer()->AwardAchievement(CustomStatistic::AchOpenInventory);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketCreativeInventoryAction(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEInt16, Int16, SlotNum);\n\n\tcItem Item;\n\tif (!ReadItem(a_ByteBuffer, Item))\n\t{\n\t\treturn;\n\t}\n\tm_Client->HandleCreativeInventory(SlotNum, Item, (SlotNum == -1) ? caLeftClickOutside : caLeftClick);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketEntityAction(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt,  UInt32, PlayerID);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8,  Action);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt,  UInt32, JumpBoost);\n\n\tif (PlayerID != m_Client->GetPlayer()->GetUniqueID())\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" attempted to action another entity - hacked client?\", m_Client->GetUsername().c_str());\n\t\treturn;\n\t}\n\n\tswitch (Action)\n\t{\n\t\tcase 0: return m_Client->HandleCrouch(true);\n\t\tcase 1: return m_Client->HandleCrouch(false);\n\t\tcase 2: return m_Client->HandleLeaveBed();\n\t\tcase 3: return m_Client->HandleSprint(true);\n\t\tcase 4: return m_Client->HandleSprint(false);\n\t\tcase 6: return m_Client->HandleOpenHorseInventory();\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketKeepAlive(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, UInt32, KeepAliveID);\n\n\tm_Client->HandleKeepAlive(KeepAliveID);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketPlayer(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, IsOnGround);\n\t// TODO: m_Client->HandlePlayerOnGround(IsOnGround);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketPlayerAbilities(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Flags);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, FlyingSpeed);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, WalkingSpeed);\n\n\t// COnvert the bitfield into individual boolean flags:\n\tbool IsFlying = false;\n\tif ((Flags & 2) != 0)\n\t{\n\t\tIsFlying = true;\n\t}\n\n\tm_Client->HandlePlayerAbilities(IsFlying, FlyingSpeed, WalkingSpeed);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketPlayerLook(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Yaw);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Pitch);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,    bool,  IsOnGround);\n\n\tm_Client->HandlePlayerLook(Yaw, Pitch, IsOnGround);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketPlayerPos(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosX);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosY);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosZ);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,     bool,   IsOnGround);\n\n\tm_Client->HandlePlayerMove({PosX, PosY, PosZ}, IsOnGround);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketPlayerPosLook(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosX);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosY);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosZ);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat,  float,  Yaw);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat,  float,  Pitch);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,     bool,   IsOnGround);\n\n\tm_Client->HandlePlayerMoveLook({PosX, PosY, PosZ}, Yaw, Pitch, IsOnGround);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketPluginMessage(cByteBuffer & a_ByteBuffer)\n{\n\t// https://wiki.vg/index.php?title=Plugin_channels&oldid=14089#MC.7CAdvCmd\n\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Channel);\n\n\tconst std::string_view ChannelView = Channel;\n\n\t// If the plugin channel is recognized vanilla, handle it directly:\n\tif (ChannelView.substr(0, 3) == \"MC|\")\n\t{\n\t\tHandleVanillaPluginMessage(a_ByteBuffer, ChannelView.substr(3));\n\t\treturn;\n\t}\n\n\tContiguousByteBuffer Data;\n\n\t// Read the plugin message and relay to clienthandle:\n\ta_ByteBuffer.ReadSome(Data, a_ByteBuffer.GetReadableSpace());\n\tm_Client->HandlePluginMessage(Channel, Data);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketResourcePackStatus(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Hash);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Status);\n\n\tm_Client->HandleResourcePack(Status);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketSlotSelect(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEInt16, Int16, SlotNum);\n\n\tm_Client->HandleSlotSelected(SlotNum);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketSpectate(cByteBuffer &a_ByteBuffer)\n{\n\tcUUID playerUUID;\n\tif (!a_ByteBuffer.ReadUUID(playerUUID))\n\t{\n\t\treturn;\n\t}\n\n\tm_Client->HandleSpectate(playerUUID);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketSteerVehicle(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Sideways);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Forward);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Flags);\n\n\tif ((Flags & 0x2) != 0)\n\t{\n\t\tm_Client->HandleUnmount();\n\t}\n\telse if ((Flags & 0x1) != 0)\n\t{\n\t\t// jump\n\t}\n\telse\n\t{\n\t\tm_Client->HandleSteerVehicle(Forward, Sideways);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketTabComplete(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Text);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,          bool,    HasPosition);\n\n\tif (HasPosition)\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt64, Int64, Position);\n\t}\n\n\tm_Client->HandleTabCompletion(Text);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketUpdateSign(cByteBuffer & a_ByteBuffer)\n{\n\tVector3i Position;\n\tif (!a_ByteBuffer.ReadXYZPosition64(Position))\n\t{\n\t\treturn;\n\t}\n\n\tAString Lines[4];\n\tJson::Value root;\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Line);\n\n\t\tif (JsonUtils::ParseString(Line, root) && root.isString())\n\t\t{\n\t\t\tLines[i] = root.asString();\n\t\t}\n\t}\n\n\tm_Client->HandleUpdateSign(Position, Lines[0], Lines[1], Lines[2], Lines[3]);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketUseEntity(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, UInt32, EntityID);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, UInt32, Type);\n\n\tswitch (Type)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\tm_Client->HandleUseEntity(EntityID, false);\n\t\t\tbreak;\n\t\t}\n\t\tcase 1:\n\t\t{\n\t\t\tm_Client->HandleUseEntity(EntityID, true);\n\t\t\tbreak;\n\t\t}\n\t\tcase 2:\n\t\t{\n\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, TargetX);\n\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, TargetY);\n\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, TargetZ);\n\n\t\t\t// TODO: Do anything\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unhandled use entity type!\");\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketEnchantItem(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, WindowID);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Enchantment);\n\n\tm_Client->HandleEnchantItem(WindowID, Enchantment);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketWindowClick(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,  UInt8,  WindowID);\n\tHANDLE_READ(a_ByteBuffer, ReadBEInt16,  Int16,  SlotNum);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,  UInt8,  Button);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt16, UInt16, TransactionID);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,  UInt8,  Mode);\n\n\tcItem Item;\n\tReadItem(a_ByteBuffer, Item);\n\n\t/** The slot number that the client uses to indicate \"outside the window\". */\n\tstatic const Int16 SLOT_NUM_OUTSIDE = -999;\n\n\t// Convert Button, Mode, SlotNum and HeldItem into eClickAction:\n\teClickAction Action;\n\tswitch ((Mode << 8) | Button)\n\t{\n\t\tcase 0x0000: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caLeftClick  : caLeftClickOutside;  break;\n\t\tcase 0x0001: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caRightClick : caRightClickOutside; break;\n\t\tcase 0x0100: Action = caShiftLeftClick;  break;\n\t\tcase 0x0101: Action = caShiftRightClick; break;\n\t\tcase 0x0200: Action = caNumber1;         break;\n\t\tcase 0x0201: Action = caNumber2;         break;\n\t\tcase 0x0202: Action = caNumber3;         break;\n\t\tcase 0x0203: Action = caNumber4;         break;\n\t\tcase 0x0204: Action = caNumber5;         break;\n\t\tcase 0x0205: Action = caNumber6;         break;\n\t\tcase 0x0206: Action = caNumber7;         break;\n\t\tcase 0x0207: Action = caNumber8;         break;\n\t\tcase 0x0208: Action = caNumber9;         break;\n\t\tcase 0x0302: Action = caMiddleClick;     break;\n\t\tcase 0x0400: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caLeftClickOutsideHoldNothing  : caDropKey;     break;\n\t\tcase 0x0401: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caRightClickOutsideHoldNothing : caCtrlDropKey; break;\n\t\tcase 0x0500: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caLeftPaintBegin               : caUnknown;     break;\n\t\tcase 0x0501: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caLeftPaintProgress            : caUnknown;     break;\n\t\tcase 0x0502: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caLeftPaintEnd                 : caUnknown;     break;\n\t\tcase 0x0504: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caRightPaintBegin              : caUnknown;     break;\n\t\tcase 0x0505: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caRightPaintProgress           : caUnknown;     break;\n\t\tcase 0x0506: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caRightPaintEnd                : caUnknown;     break;\n\t\tcase 0x0508: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caMiddlePaintBegin             : caUnknown;     break;\n\t\tcase 0x0509: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caMiddlePaintProgress          : caUnknown;     break;\n\t\tcase 0x050a: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caMiddlePaintEnd               : caUnknown;     break;\n\t\tcase 0x0600: Action = caDblClick; break;\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"Unhandled window click mode / button combination: %d (0x%x)\", (Mode << 8) | Button, (Mode << 8) | Button);\n\t\t\tAction = caUnknown;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tm_Client->HandleWindowClick(WindowID, SlotNum, Action, Item);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacketWindowClose(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, WindowID);\n\n\tm_Client->HandleWindowClose(WindowID);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandleVanillaPluginMessage(cByteBuffer & a_ByteBuffer, const std::string_view a_Channel)\n{\n\tif ((a_Channel == \"AdvCdm\") || (a_Channel == \"AdvCmd\"))  // Spelling was fixed in 15w34.\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Type);\n\n\t\tswitch (Type)\n\t\t{\n\t\t\tcase 0x00:\n\t\t\t{\n\t\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockX);\n\t\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockY);\n\t\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockZ);\n\t\t\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Command);\n\t\t\t\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, TrackOutput);\n\n\t\t\t\t// Editing a command-block:\n\t\t\t\tm_Client->HandleCommandBlockBlockChange({BlockX, BlockY, BlockZ}, Command);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 0x01:\n\t\t\t{\n\t\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEUInt32, UInt32, EntityID);\n\t\t\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Command);\n\t\t\t\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, TrackOutput);\n\n\t\t\t\t// Editing a command-block-minecart:\n\t\t\t\tm_Client->HandleCommandBlockEntityChange(EntityID, Command);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tLOGD(\"Player \\\"%s\\\" sent an invalid command block edit type - hacked client?\", m_Client->GetUsername().c_str());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\telse if (a_Channel == \"Beacon\")\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEUInt32, UInt32, Effect1);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEUInt32, UInt32, Effect2);\n\n\t\tm_Client->HandleBeaconSelection(Effect1, Effect2);\n\t}\n\telse if (a_Channel == \"BEdit\")\n\t{\n\t\tif (cItem UnsignedBook; ReadItem(a_ByteBuffer, UnsignedBook))\n\t\t{\n\t\t\t// TODO: m_Client->HandleBookEdit\n\t\t}\n\t}\n\telse if (a_Channel == \"BSign\")\n\t{\n\t\tif (cItem WrittenBook; ReadItem(a_ByteBuffer, WrittenBook))\n\t\t{\n\t\t\t// TODO: m_Client->HandleBookSign\n\t\t}\n\t}\n\telse if (a_Channel == \"Brand\")\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Brand);\n\n\t\tm_Client->SetClientBrand(Brand);\n\t\tm_Client->SendPluginMessage(\"MC|Brand\", \"\\x08\"\"Cuberite\");  // Send back our brand, including the length.\n\t}\n\telse if (a_Channel == \"ItemName\")\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, ItemName);\n\n\t\tm_Client->HandleAnvilItemName(ItemName);\n\t}\n\telse if (a_Channel == \"TrSel\")\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, SlotNum);\n\n\t\tm_Client->HandleNPCTrade(SlotNum);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::ParseItemMetadata(cItem & a_Item, const ContiguousByteBufferView a_Metadata) const\n{\n\t// Parse into NBT:\n\tcParsedNBT NBT(a_Metadata);\n\tif (!NBT.IsValid())\n\t{\n\t\tAString HexDump;\n\t\tCreateHexDump(HexDump, a_Metadata.data(), std::max<size_t>(a_Metadata.size(), 1024), 16);\n\t\tLOGWARNING(\"Cannot parse NBT item metadata: %s at (%zu / %zu bytes)\\n%s\",\n\t\t\tNBT.GetErrorCode().message().c_str(), NBT.GetErrorPos(), a_Metadata.size(), HexDump.c_str()\n\t\t);\n\t\treturn;\n\t}\n\n\t// Load enchantments and custom display names from the NBT data:\n\tfor (int tag = NBT.GetFirstChild(NBT.GetRoot()); tag >= 0; tag = NBT.GetNextSibling(tag))\n\t{\n\t\tAString TagName = NBT.GetName(tag);\n\t\tswitch (NBT.GetType(tag))\n\t\t{\n\t\t\tcase TAG_List:\n\t\t\t{\n\t\t\t\tif ((TagName == \"ench\") || (TagName == \"StoredEnchantments\"))  // Enchantments tags\n\t\t\t\t{\n\t\t\t\t\tEnchantmentSerializer::ParseFromNBT(a_Item.m_Enchantments, NBT, tag);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAG_Compound:\n\t\t\t{\n\t\t\t\tif (TagName == \"display\")  // Custom name and lore tag\n\t\t\t\t{\n\t\t\t\t\tfor (int displaytag = NBT.GetFirstChild(tag); displaytag >= 0; displaytag = NBT.GetNextSibling(displaytag))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((NBT.GetType(displaytag) == TAG_String) && (NBT.GetName(displaytag) == \"Name\"))  // Custon name tag\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_Item.m_CustomName = NBT.GetString(displaytag);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((NBT.GetType(displaytag) == TAG_List) && (NBT.GetName(displaytag) == \"Lore\"))  // Lore tag\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor (int loretag = NBT.GetFirstChild(displaytag); loretag >= 0; loretag = NBT.GetNextSibling(loretag))  // Loop through array of strings\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ta_Item.m_LoreTable.push_back(NBT.GetString(loretag));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((NBT.GetType(displaytag) == TAG_Int) && (NBT.GetName(displaytag) == \"color\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_Item.m_ItemColor.m_Color = static_cast<unsigned int>(NBT.GetInt(displaytag));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ((TagName == \"Fireworks\") || (TagName == \"Explosion\"))\n\t\t\t\t{\n\t\t\t\t\tcFireworkItem::ParseFromNBT(a_Item.m_FireworkItem, NBT, tag, static_cast<ENUM_ITEM_TYPE>(a_Item.m_ItemType));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAG_Int:\n\t\t\t{\n\t\t\t\tif (TagName == \"RepairCost\")\n\t\t\t\t{\n\t\t\t\t\ta_Item.m_RepairCost = NBT.GetInt(tag);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: LOGD(\"Unimplemented NBT data when parsing!\"); break;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cProtocol_1_8_0::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) const\n{\n\tHANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt16, Int16, ItemType);\n\n\tif (ItemType == -1)\n\t{\n\t\t// The item is empty, no more data follows\n\t\ta_Item.Empty();\n\t\treturn true;\n\t}\n\ta_Item.m_ItemType = ItemType;\n\n\tHANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt8,  Int8,  ItemCount);\n\tHANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt16, Int16, ItemDamage);\n\n\ta_Item.m_ItemCount  = ItemCount;\n\ta_Item.m_ItemDamage = ItemDamage;\n\tif (ItemCount <= 0)\n\t{\n\t\ta_Item.Empty();\n\t}\n\n\tContiguousByteBuffer Metadata;\n\tif (!a_ByteBuffer.ReadSome(Metadata, a_ByteBuffer.GetReadableSpace() - a_KeepRemainingBytes) || Metadata.empty() || (Metadata[0] == std::byte(0)))\n\t{\n\t\t// No metadata\n\t\treturn true;\n\t}\n\n\tParseItemMetadata(a_Item, Metadata);\n\treturn true;\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendEntitySpawn(const cEntity & a_Entity, const UInt8 a_ObjectType, const Int32 a_ObjectData)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSpawnObject);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEUInt8(a_ObjectType);\n\tPkt.WriteFPInt(a_Entity.GetPosX());\n\tPkt.WriteFPInt(a_Entity.GetPosY());\n\tPkt.WriteFPInt(a_Entity.GetPosZ());\n\tPkt.WriteByteAngle(a_Entity.GetPitch());\n\tPkt.WriteByteAngle(a_Entity.GetYaw());\n\tPkt.WriteBEInt32(a_ObjectData);\n\n\tif (a_ObjectData != 0)\n\t{\n\t\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedX() * 400));\n\t\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedY() * 400));\n\t\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedZ() * 400));\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::SendPacket(cPacketizer & a_Pkt)\n{\n\tASSERT(m_OutPacketBuffer.GetReadableSpace() == m_OutPacketBuffer.GetUsedSpace());\n\n\tm_Compressor.ReadFrom(m_OutPacketBuffer);\n\tm_OutPacketBuffer.CommitRead();\n\n\tconst auto PacketData = m_Compressor.GetView();\n\n\tif (m_State == 3)\n\t{\n\t\tContiguousByteBuffer CompressedPacket;\n\n\t\t// Compress the packet payload:\n\t\tcProtocol_1_8_0::CompressPacket(m_Compressor, CompressedPacket);\n\n\t\t// Send the packet's payload compressed:\n\t\tm_Client->SendData(CompressedPacket);\n\t}\n\telse\n\t{\n\t\t// Compression doesn't apply to this state, send raw data:\n\t\tm_OutPacketLenBuffer.WriteVarInt32(static_cast<UInt32>(PacketData.size()));\n\t\tContiguousByteBuffer LengthData;\n\t\tm_OutPacketLenBuffer.ReadAll(LengthData);\n\t\tm_OutPacketLenBuffer.CommitRead();\n\t\tm_Client->SendData(LengthData);\n\n\t\t// Send the packet's payload directly:\n\t\tm_Client->SendData(PacketData);\n\t}\n\n\t// Log the comm into logfile:\n\tif (g_ShouldLogCommOut && m_CommLogFile.IsOpen())\n\t{\n\t\tAString Hex;\n\t\tASSERT(PacketData.size() > 0);\n\t\tCreateHexDump(Hex, PacketData.data(), PacketData.size(), 16);\n\t\tm_CommLogFile.Write(fmt::format(\n\t\t\tFMT_STRING(\"Outgoing packet: type {} (translated to 0x{:02x}), length {} (0x{:04x}), state {}. Payload (incl. type):\\n{}\\n\"),\n\t\t\tcPacketizer::PacketTypeToStr(a_Pkt.GetPacketType()), GetPacketID(a_Pkt.GetPacketType()),\n\t\t\tPacketData.size(), PacketData.size(), m_State, Hex\n\t\t));\n\t\t/*\n\t\t// Useful for debugging a new protocol:\n\t\tLOGD(\"Outgoing packet: type %s (translated to 0x%02x), length %u (0x%04x), state %d. Payload (incl. type):\\n%s\\n\",\n\t\t\tcPacketizer::PacketTypeToStr(a_Pkt.GetPacketType()), GetPacketID(a_Pkt.GetPacketType()),\n\t\t\tPacketLen, PacketLen, m_State, Hex\n\t\t);\n\t\t//*/\n\t}\n\t/*\n\t// Useful for debugging a new protocol:\n\tstd::this_thread::sleep_for(std::chrono::milliseconds(100));\n\t*/\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::WriteBlockEntity(cFastNBTWriter & a_Writer, const cBlockEntity & a_BlockEntity) const\n{\n\tswitch (a_BlockEntity.GetBlockType())\n\t{\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\t{\n\t\t\tauto & BannerEntity = static_cast<const cBannerEntity &>(a_BlockEntity);\n\t\t\ta_Writer.AddInt(\"Base\", static_cast<Int32>(BannerEntity.GetBaseColor()));\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_BEACON:\n\t\tcase E_BLOCK_CHEST:\n\t\t{\n\t\t\t// Nothing!\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_COMMAND_BLOCK:\n\t\t{\n\t\t\tauto & CommandBlockEntity = static_cast<const cCommandBlockEntity &>(a_BlockEntity);\n\t\t\ta_Writer.AddByte(\"TrackOutput\", 1);  // Neither I nor the MC wiki has any idea about this\n\t\t\ta_Writer.AddInt(\"SuccessCount\", CommandBlockEntity.GetResult());\n\t\t\ta_Writer.AddString(\"Command\", CommandBlockEntity.GetCommand());\n\t\t\t// You can set custom names for windows in Vanilla\n\t\t\t// For a command block, this would be the 'name' prepended to anything it outputs into global chat\n\t\t\t// MCS doesn't have this, so just leave it @ '@'. (geddit?)\n\t\t\ta_Writer.AddString(\"CustomName\", \"@\");\n\t\t\tif (!CommandBlockEntity.GetLastOutput().empty())\n\t\t\t{\n\t\t\t\ta_Writer.AddString(\"LastOutput\", JsonUtils::SerializeSingleValueJsonObject(\"text\", CommandBlockEntity.GetLastOutput()));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:\n\t\tcase E_BLOCK_END_PORTAL:\n\t\t{\n\t\t\t// Nothing!\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_HEAD:\n\t\t{\n\t\t\tauto & MobHeadEntity = static_cast<const cMobHeadEntity &>(a_BlockEntity);\n\t\t\ta_Writer.AddByte(\"SkullType\", MobHeadEntity.GetType() & 0xFF);\n\t\t\ta_Writer.AddByte(\"Rot\", MobHeadEntity.GetRotation() & 0xFF);\n\n\t\t\t// The new Block Entity format for a Mob Head. See: https://minecraft.wiki/w/Head#Block_entity\n\t\t\ta_Writer.BeginCompound(\"Owner\");\n\t\t\t\ta_Writer.AddString(\"Id\", MobHeadEntity.GetOwnerUUID().ToShortString());\n\t\t\t\ta_Writer.AddString(\"Name\", MobHeadEntity.GetOwnerName());\n\t\t\t\ta_Writer.BeginCompound(\"Properties\");\n\t\t\t\t\ta_Writer.BeginList(\"textures\", TAG_Compound);\n\t\t\t\t\t\ta_Writer.BeginCompound(\"\");\n\t\t\t\t\t\t\ta_Writer.AddString(\"Signature\", MobHeadEntity.GetOwnerTextureSignature());\n\t\t\t\t\t\t\ta_Writer.AddString(\"Value\", MobHeadEntity.GetOwnerTexture());\n\t\t\t\t\t\ta_Writer.EndCompound();\n\t\t\t\t\ta_Writer.EndList();\n\t\t\t\ta_Writer.EndCompound();\n\t\t\ta_Writer.EndCompound();\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_FLOWER_POT:\n\t\t{\n\t\t\tauto & FlowerPotEntity = static_cast<const cFlowerPotEntity &>(a_BlockEntity);\n\t\t\ta_Writer.AddInt(\"Item\", static_cast<Int32>(FlowerPotEntity.GetItem().m_ItemType));\n\t\t\ta_Writer.AddInt(\"Data\", static_cast<Int32>(FlowerPotEntity.GetItem().m_ItemDamage));\n\t\t\tbreak;\n\t\t}\n\t\tcase E_BLOCK_MOB_SPAWNER:\n\t\t{\n\t\t\tauto & MobSpawnerEntity = static_cast<const cMobSpawnerEntity &>(a_BlockEntity);\n\t\t\ta_Writer.AddString(\"EntityId\", cMonster::MobTypeToVanillaName(MobSpawnerEntity.GetEntity()));\n\t\t\ta_Writer.AddShort(\"Delay\", MobSpawnerEntity.GetSpawnDelay());\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\ta_Writer.AddInt(\"x\", a_BlockEntity.GetPosX());\n\ta_Writer.AddInt(\"y\", a_BlockEntity.GetPosY());\n\ta_Writer.AddInt(\"z\", a_BlockEntity.GetPosZ());\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const\n{\n\t// Common metadata:\n\tByte Flags = 0;\n\tif (a_Entity.IsOnFire())\n\t{\n\t\tFlags |= 0x01;\n\t}\n\tif (a_Entity.IsCrouched())\n\t{\n\t\tFlags |= 0x02;\n\t}\n\tif (a_Entity.IsSprinting())\n\t{\n\t\tFlags |= 0x08;\n\t}\n\tif (a_Entity.IsRclking())\n\t{\n\t\tFlags |= 0x10;\n\t}\n\tif (a_Entity.IsInvisible())\n\t{\n\t\tFlags |= 0x20;\n\t}\n\tif (a_Entity.IsElytraFlying())\n\t{\n\t\tFlags |= 0x80;\n\t}\n\ta_Pkt.WriteBEUInt8(0);  // Byte(0) + index 0\n\ta_Pkt.WriteBEUInt8(Flags);\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase cEntity::etPlayer:\n\t\t{\n\t\t\tauto & Player = static_cast<const cPlayer &>(a_Entity);\n\n\t\t\t// Player name:\n\t\t\ta_Pkt.WriteBEUInt8(0x82);\n\t\t\ta_Pkt.WriteString(Player.GetName());\n\n\t\t\t// Player health:\n\t\t\ta_Pkt.WriteBEUInt8(0x66);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Player.GetHealth()));\n\n\t\t\t// Skin flags:\n\t\t\ta_Pkt.WriteBEUInt8(0x0A);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Player.GetSkinParts()));\n\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etPickup:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8((5 << 5) | 10);  // Slot(5) + index 10\n\t\t\tWriteItem(a_Pkt, static_cast<const cPickup &>(a_Entity).GetItem());\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etMinecart:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(0x51);\n\n\t\t\t// The following expression makes Minecarts shake more with less health or higher damage taken\n\t\t\t// It gets half the maximum health, and takes it away from the current health minus the half health:\n\t\t\t/*\n\t\t\tHealth: 5 | 3 - (5 - 3) = 1 (shake power)\n\t\t\tHealth: 3 | 3 - (3 - 3) = 3\n\t\t\tHealth: 1 | 3 - (1 - 3) = 5\n\t\t\t*/\n\t\t\tauto & Minecart = static_cast<const cMinecart &>(a_Entity);\n\t\t\ta_Pkt.WriteBEInt32(static_cast<Int32>((((a_Entity.GetMaxHealth() / 2) - (a_Entity.GetHealth() - (a_Entity.GetMaxHealth() / 2))) * Minecart.LastDamage()) * 4));\n\t\t\ta_Pkt.WriteBEUInt8(0x52);\n\t\t\ta_Pkt.WriteBEInt32(1);  // Shaking direction, doesn't seem to affect anything\n\t\t\ta_Pkt.WriteBEUInt8(0x73);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Minecart.LastDamage() + 10));  // Damage taken / shake effect multiplyer\n\n\t\t\tif (Minecart.GetPayload() == cMinecart::mpNone)\n\t\t\t{\n\t\t\t\tauto & RideableMinecart = static_cast<const cRideableMinecart &>(Minecart);\n\t\t\t\tconst cItem & MinecartContent = RideableMinecart.GetContent();\n\t\t\t\tif (!MinecartContent.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(0x54);\n\t\t\t\t\tint Content = MinecartContent.m_ItemType;\n\t\t\t\t\tContent |= MinecartContent.m_ItemDamage << 8;\n\t\t\t\t\ta_Pkt.WriteBEInt32(Content);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(0x55);\n\t\t\t\t\ta_Pkt.WriteBEInt32(RideableMinecart.GetBlockHeight());\n\t\t\t\t\ta_Pkt.WriteBEUInt8(0x56);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Minecart.GetPayload() == cMinecart::mpFurnace)\n\t\t\t{\n\t\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\t\ta_Pkt.WriteBEUInt8(static_cast<const cMinecartWithFurnace &>(Minecart).IsFueled() ? 1 : 0);\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etMinecart\n\n\t\tcase cEntity::etProjectile:\n\t\t{\n\t\t\tauto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase cProjectileEntity::pkArrow:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\t\t\ta_Pkt.WriteBEUInt8(static_cast<const cArrowEntity &>(Projectile).IsCritical() ? 1 : 0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkFirework:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(0xa8);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cFireworkEntity &>(Projectile).GetItem());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etProjectile\n\n\t\tcase cEntity::etMonster:\n\t\t{\n\t\t\tWriteMobMetadata(a_Pkt, static_cast<const cMonster &>(a_Entity));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntity::etItemFrame:\n\t\t{\n\t\t\tauto & Frame = static_cast<const cItemFrame &>(a_Entity);\n\t\t\ta_Pkt.WriteBEUInt8(0xa8);\n\t\t\tWriteItem(a_Pkt, Frame.GetItem());\n\t\t\ta_Pkt.WriteBEUInt8(0x09);\n\t\t\ta_Pkt.WriteBEUInt8(Frame.GetItemRotation());\n\t\t\tbreak;\n\t\t}  // case etItemFrame\n\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::WriteEntityProperties(cPacketizer & a_Pkt, const cEntity & a_Entity) const\n{\n\tif (a_Entity.IsPlayer())\n\t{\n\t\tconst auto & Player = static_cast<const cPlayer &>(a_Entity);\n\n\t\ta_Pkt.WriteBEInt32(1);  // Count.\n\t\ta_Pkt.WriteString(\"generic.movementSpeed\");\n\t\ta_Pkt.WriteBEDouble(0.1 * Player.GetNormalMaxSpeed());  // The default game speed is 0.1, multiply that value by the relative speed.\n\n\t\t// It seems the modifiers aren't conditionally activated; their effects are applied immediately!\n\t\t// We have to keep on re-sending this packet when the client notifies us of sprint start and end, and so on. Strange.\n\n\t\tif (Player.IsSprinting())\n\t\t{\n\t\t\ta_Pkt.WriteVarInt32(1);  // Modifier count.\n\t\t\ta_Pkt.WriteBEUInt64(0x662a6b8dda3e4c1c);\n\t\t\ta_Pkt.WriteBEUInt64(0x881396ea6097278d);  // UUID of the modifier (sprinting speed boost).\n\t\t\ta_Pkt.WriteBEDouble(Player.GetSprintingMaxSpeed() - Player.GetNormalMaxSpeed());\n\t\t\ta_Pkt.WriteBEUInt8(2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Pkt.WriteVarInt32(0);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// const cMonster & Mob = (const cMonster &)a_Entity;\n\n\t\t// TODO: Send properties and modifiers based on the mob type\n\n\t\ta_Pkt.WriteBEInt32(0);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) const\n{\n\tshort ItemType = a_Item.m_ItemType;\n\tASSERT(ItemType >= -1);  // Check validity of packets in debug runtime\n\tif (ItemType <= 0)\n\t{\n\t\t// Fix, to make sure no invalid values are sent.\n\t\tItemType = -1;\n\t}\n\n\tif (a_Item.IsEmpty())\n\t{\n\t\ta_Pkt.WriteBEInt16(-1);\n\t\treturn;\n\t}\n\n\ta_Pkt.WriteBEInt16(ItemType);\n\ta_Pkt.WriteBEInt8(a_Item.m_ItemCount);\n\ta_Pkt.WriteBEInt16(a_Item.m_ItemDamage);\n\n\tif (a_Item.m_Enchantments.IsEmpty() && a_Item.IsBothNameAndLoreEmpty() && (a_Item.m_ItemType != E_ITEM_FIREWORK_ROCKET) && (a_Item.m_ItemType != E_ITEM_FIREWORK_STAR) && !a_Item.m_ItemColor.IsValid())\n\t{\n\t\ta_Pkt.WriteBEInt8(0);\n\t\treturn;\n\t}\n\n\n\t// Send the enchantments and custom names:\n\tcFastNBTWriter Writer;\n\tif (a_Item.m_RepairCost != 0)\n\t{\n\t\tWriter.AddInt(\"RepairCost\", a_Item.m_RepairCost);\n\t}\n\tif (!a_Item.m_Enchantments.IsEmpty())\n\t{\n\t\tconst char * TagName = (a_Item.m_ItemType == E_ITEM_BOOK) ? \"StoredEnchantments\" : \"ench\";\n\t\tEnchantmentSerializer::WriteToNBTCompound(a_Item.m_Enchantments, Writer, TagName);\n\t}\n\tif (!a_Item.IsBothNameAndLoreEmpty() || a_Item.m_ItemColor.IsValid())\n\t{\n\t\tWriter.BeginCompound(\"display\");\n\t\tif (a_Item.m_ItemColor.IsValid())\n\t\t{\n\t\t\tWriter.AddInt(\"color\", static_cast<Int32>(a_Item.m_ItemColor.m_Color));\n\t\t}\n\n\t\tif (!a_Item.IsCustomNameEmpty())\n\t\t{\n\t\t\tWriter.AddString(\"Name\", a_Item.m_CustomName);\n\t\t}\n\t\tif (!a_Item.IsLoreEmpty())\n\t\t{\n\t\t\tWriter.BeginList(\"Lore\", TAG_String);\n\n\t\t\tfor (const auto & Line : a_Item.m_LoreTable)\n\t\t\t{\n\t\t\t\tWriter.AddString(\"\", Line);\n\t\t\t}\n\n\t\t\tWriter.EndList();\n\t\t}\n\t\tWriter.EndCompound();\n\t}\n\tif ((a_Item.m_ItemType == E_ITEM_FIREWORK_ROCKET) || (a_Item.m_ItemType == E_ITEM_FIREWORK_STAR))\n\t{\n\t\tcFireworkItem::WriteToNBTCompound(a_Item.m_FireworkItem, Writer, static_cast<ENUM_ITEM_TYPE>(a_Item.m_ItemType));\n\t}\n\tWriter.Finish();\n\n\tconst auto Result = Writer.GetResult();\n\tif (Result.empty())\n\t{\n\t\ta_Pkt.WriteBEInt8(0);\n\t\treturn;\n\t}\n\ta_Pkt.WriteBuf(Result);\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const\n{\n\t// Living Enitiy Metadata\n\tif (a_Mob.HasCustomName())\n\t{\n\t\ta_Pkt.WriteBEUInt8(0x82);\n\t\ta_Pkt.WriteString(a_Mob.GetCustomName());\n\n\t\ta_Pkt.WriteBEUInt8(0x03);\n\t\ta_Pkt.WriteBool(a_Mob.IsCustomNameAlwaysVisible());\n\t}\n\n\ta_Pkt.WriteBEUInt8(0x66);\n\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\n\tswitch (a_Mob.GetMobType())\n\t{\n\t\tcase mtBat:\n\t\t{\n\t\t\tauto & Bat = static_cast<const cBat &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\ta_Pkt.WriteBEUInt8(Bat.IsHanging() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtBat\n\n\t\tcase mtChicken:\n\t\t{\n\t\t\tauto & Chicken = static_cast<const cChicken &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Chicken.IsBaby() ? -1 : (Chicken.IsInLoveCooldown() ? 1 : 0));\n\t\t\tbreak;\n\t\t}  // case mtChicken\n\n\t\tcase mtCow:\n\t\t{\n\t\t\tauto & Cow = static_cast<const cCow &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Cow.IsBaby() ? -1 : (Cow.IsInLoveCooldown() ? 1 : 0));\n\t\t\tbreak;\n\t\t}  // case mtCow\n\n\t\tcase mtCreeper:\n\t\t{\n\t\t\tauto & Creeper = static_cast<const cCreeper &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\ta_Pkt.WriteBEUInt8(Creeper.IsBlowing() ? 1 : 255);\n\t\t\ta_Pkt.WriteBEUInt8(0x11);\n\t\t\ta_Pkt.WriteBEUInt8(Creeper.IsCharged() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtCreeper\n\n\t\tcase mtEnderman:\n\t\t{\n\t\t\tauto & Enderman = static_cast<const cEnderman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x30);\n\t\t\ta_Pkt.WriteBEInt16(static_cast<Byte>(Enderman.GetCarriedBlock()));\n\t\t\ta_Pkt.WriteBEUInt8(0x11);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<Byte>(Enderman.GetCarriedMeta()));\n\t\t\ta_Pkt.WriteBEUInt8(0x12);\n\t\t\ta_Pkt.WriteBEUInt8(Enderman.IsScreaming() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtEnderman\n\n\t\tcase mtGhast:\n\t\t{\n\t\t\tauto & Ghast = static_cast<const cGhast &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\ta_Pkt.WriteBEUInt8(Ghast.IsCharging());\n\t\t\tbreak;\n\t\t}  // case mtGhast\n\n\t\tcase mtHorse:\n\t\t{\n\t\t\tauto & Horse = static_cast<const cHorse &>(a_Mob);\n\t\t\tint Flags = 0;\n\t\t\tif (Horse.IsTame())\n\t\t\t{\n\t\t\t\tFlags |= 0x02;\n\t\t\t}\n\t\t\tif (Horse.IsSaddled())\n\t\t\t{\n\t\t\t\tFlags |= 0x04;\n\t\t\t}\n\t\t\tif (Horse.IsChested())\n\t\t\t{\n\t\t\t\tFlags |= 0x08;\n\t\t\t}\n\t\t\tif (Horse.IsEating())\n\t\t\t{\n\t\t\t\tFlags |= 0x20;\n\t\t\t}\n\t\t\tif (Horse.IsRearing())\n\t\t\t{\n\t\t\t\tFlags |= 0x40;\n\t\t\t}\n\t\t\tif (Horse.IsMthOpen())\n\t\t\t{\n\t\t\t\tFlags |= 0x80;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(0x50);  // Int at index 16\n\t\t\ta_Pkt.WriteBEInt32(Flags);\n\t\t\ta_Pkt.WriteBEUInt8(0x13);  // Byte at index 19\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Horse.GetHorseType()));\n\t\t\ta_Pkt.WriteBEUInt8(0x54);  // Int at index 20\n\t\t\tint Appearance = 0;\n\t\t\tAppearance = Horse.GetHorseColor();\n\t\t\tAppearance |= Horse.GetHorseStyle() << 8;\n\t\t\ta_Pkt.WriteBEInt32(Appearance);\n\t\t\ta_Pkt.WriteBEUInt8(0x56);  // Int at index 22\n\t\t\ta_Pkt.WriteBEInt32(Horse.GetHorseArmour());\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Horse.IsBaby() ? -1 : (Horse.IsInLoveCooldown() ? 1 : 0));\n\t\t\tbreak;\n\t\t}  // case mtHorse\n\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\tauto & MagmaCube = static_cast<const cMagmaCube &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(MagmaCube.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtMagmaCube\n\n\t\tcase mtOcelot:\n\t\t{\n\t\t\tauto & Ocelot = static_cast<const cOcelot &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Ocelot.IsBaby() ? -1 : (Ocelot.IsInLoveCooldown() ? 1 : 0));\n\t\t\tbreak;\n\t\t}  // case mtOcelot\n\n\t\tcase mtPig:\n\t\t{\n\t\t\tauto & Pig = static_cast<const cPig &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Pig.IsBaby() ? -1 : (Pig.IsInLoveCooldown() ? 1 : 0));\n\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\ta_Pkt.WriteBEUInt8(Pig.IsSaddled() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtPig\n\n\t\tcase mtSheep:\n\t\t{\n\t\t\tauto & Sheep = static_cast<const cSheep &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Sheep.IsBaby() ? -1 : (Sheep.IsInLoveCooldown() ? 1 : 0));\n\n\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\tByte SheepMetadata = 0;\n\t\t\tSheepMetadata = static_cast<Byte>(Sheep.GetFurColor());\n\t\t\tif (Sheep.IsSheared())\n\t\t\t{\n\t\t\t\tSheepMetadata |= 0x10;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(SheepMetadata);\n\t\t\tbreak;\n\t\t}  // case mtSheep\n\n\t\tcase mtRabbit:\n\t\t{\n\t\t\tauto & Rabbit = static_cast<const cRabbit &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x12);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Rabbit.GetRabbitType()));\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Rabbit.IsBaby() ? -1 : (Rabbit.IsInLoveCooldown() ? 1 : 0));\n\t\t\tbreak;\n\t\t}  // case mtRabbit\n\n\t\tcase mtSlime:\n\t\t{\n\t\t\tauto & Slime = static_cast<const cSlime &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Slime.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtSlime\n\n\t\tcase mtSkeleton:\n\t\tcase mtStray:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(0x0d);\n\t\t\ta_Pkt.WriteBEUInt8(0);  // Is normal skeleton\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtVillager:\n\t\t{\n\t\t\tauto & Villager = static_cast<const cVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x50);\n\t\t\ta_Pkt.WriteBEInt32(Villager.GetVilType());\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Villager.IsBaby() ? -1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtVillager\n\n\t\tcase mtWitch:\n\t\t{\n\t\t\tauto & Witch = static_cast<const cWitch &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x15);\n\t\t\ta_Pkt.WriteBEUInt8(Witch.IsAngry() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtWitch\n\n\t\tcase mtWither:\n\t\t{\n\t\t\tauto & Wither = static_cast<const cWither &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x54);  // Int at index 20\n\t\t\ta_Pkt.WriteBEInt32(static_cast<Int32>(Wither.GetWitherInvulnerableTicks()));\n\t\t\ta_Pkt.WriteBEUInt8(0x66);  // Float at index 6\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\t\t\tbreak;\n\t\t}  // case mtWither\n\n\t\tcase mtWitherSkeleton:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(0x0d);\n\t\t\ta_Pkt.WriteBEUInt8(1);  // Is wither skeleton\n\t\t\tbreak;\n\t\t}  // case mtWitherSkeleton\n\n\t\tcase mtWolf:\n\t\t{\n\t\t\tauto & Wolf = static_cast<const cWolf &>(a_Mob);\n\t\t\tByte WolfStatus = 0;\n\t\t\tif (Wolf.IsSitting())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Wolf.IsAngry())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x2;\n\t\t\t}\n\t\t\tif (Wolf.IsTame())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x4;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(0x10);\n\t\t\ta_Pkt.WriteBEUInt8(WolfStatus);\n\n\t\t\ta_Pkt.WriteBEUInt8(0x72);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\t\t\ta_Pkt.WriteBEUInt8(0x13);\n\t\t\ta_Pkt.WriteBEUInt8(Wolf.IsBegging() ? 1 : 0);\n\t\t\ta_Pkt.WriteBEUInt8(0x14);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Wolf.GetCollarColor()));\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Wolf.IsBaby() ? -1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtWolf\n\n\t\tcase mtHusk:\n\t\tcase mtZombie:\n\t\t{\n\t\t\tauto & Zombie = static_cast<const cZombie &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(Zombie.IsBaby() ? 1 : -1);\n\t\t\ta_Pkt.WriteBEUInt8(0x0d);\n\t\t\ta_Pkt.WriteBEUInt8(0);\n\t\t\ta_Pkt.WriteBEUInt8(0x0e);\n\t\t\ta_Pkt.WriteBEUInt8(0);\n\t\t\tbreak;\n\t\t}  // case mtZombie\n\n\t\tcase mtZombiePigman:\n\t\t{\n\t\t\tauto & ZombiePigman = static_cast<const cZombiePigman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(ZombiePigman.IsBaby() ? 1 : -1);\n\t\t\tbreak;\n\t\t}  // case mtZombiePigman\n\n\t\tcase mtZombieVillager:\n\t\t{\n\t\t\tauto & ZombieVillager = reinterpret_cast<const cZombieVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(0x0c);\n\t\t\ta_Pkt.WriteBEInt8(ZombieVillager.IsBaby() ? 1 : -1);\n\t\t\ta_Pkt.WriteBEUInt8(0x0d);\n\t\t\ta_Pkt.WriteBEUInt8(1);\n\t\t\ta_Pkt.WriteBEUInt8(0x0e);\n\t\t\ta_Pkt.WriteBEUInt8((ZombieVillager.ConversionTime() == -1) ? 0 : 1);\n\t\t\tbreak;\n\t\t}  // case mtZombieVillager\n\n\t\tcase mtBlaze:\n\t\tcase mtElderGuardian:\n\t\tcase mtGuardian:\n\t\t{\n\t\t\t// TODO: Mobs with extra fields that aren't implemented\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCat:\n\n\n\t\tcase mtDonkey:\n\t\tcase mtMule:\n\t\tcase mtSkeletonHorse:\n\t\tcase mtZombieHorse:\n\t\t{\n\t\t\t// Todo: Mobs not added yet. Grouped ones have the same metadata\n\t\t\tASSERT(!\"cProtocol_1_8::WriteMobMetadata: received unimplemented type\");\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCaveSpider:\n\t\tcase mtEnderDragon:\n\t\tcase mtGiant:\n\t\tcase mtIronGolem:\n\t\tcase mtMooshroom:\n\t\tcase mtSilverfish:\n\t\tcase mtEndermite:\n\t\tcase mtSnowGolem:\n\t\tcase mtSpider:\n\t\tcase mtSquid:\n\t\t{\n\t\t\t// Allowed mobs without additional metadata\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: UNREACHABLE(\"cProtocol_1_8::WriteMobMetadata: received mob of invalid type\");\n\t}  // switch (a_Mob.GetType())\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::AddReceivedData(cByteBuffer & a_Buffer, const ContiguousByteBufferView a_Data)\n{\n\t// Write the incoming data into the comm log file:\n\tif (g_ShouldLogCommIn && m_CommLogFile.IsOpen())\n\t{\n\t\tif (a_Buffer.GetReadableSpace() > 0)\n\t\t{\n\t\t\tContiguousByteBuffer AllData;\n\t\t\tsize_t OldReadableSpace = a_Buffer.GetReadableSpace();\n\t\t\ta_Buffer.ReadAll(AllData);\n\t\t\ta_Buffer.ResetRead();\n\t\t\ta_Buffer.SkipRead(a_Buffer.GetReadableSpace() - OldReadableSpace);\n\t\t\tASSERT(a_Buffer.GetReadableSpace() == OldReadableSpace);\n\t\t\tAString Hex;\n\t\t\tCreateHexDump(Hex, AllData.data(), AllData.size(), 16);\n\t\t\tm_CommLogFile.Write(fmt::format(\n\t\t\t\tFMT_STRING(\"Incoming data, {0} (0x{0:x}) unparsed bytes already present in buffer:\\n{1}\\n\"),\n\t\t\t\tAllData.size(), Hex\n\t\t\t));\n\t\t}\n\t\tAString Hex;\n\t\tCreateHexDump(Hex, a_Data.data(), a_Data.size(), 16);\n\t\tm_CommLogFile.Write(fmt::format(\n\t\t\tFMT_STRING(\"Incoming data: {0} (0x{0:x}) bytes: \\n{1}\\n\"),\n\t\t\ta_Data.size(), Hex\n\t\t));\n\t\tm_CommLogFile.Flush();\n\t}\n\n\tif (!a_Buffer.Write(a_Data.data(), a_Data.size()))\n\t{\n\t\t// Too much data in the incoming queue, report to caller:\n\t\tm_Client->PacketBufferFull();\n\t\treturn;\n\t}\n\n\t// Handle all complete packets:\n\tfor (;;)\n\t{\n\t\tUInt32 PacketLen;\n\t\tif (!a_Buffer.ReadVarInt(PacketLen))\n\t\t{\n\t\t\t// Not enough data\n\t\t\ta_Buffer.ResetRead();\n\t\t\tbreak;\n\t\t}\n\t\tif (!a_Buffer.CanReadBytes(PacketLen))\n\t\t{\n\t\t\t// The full packet hasn't been received yet\n\t\t\ta_Buffer.ResetRead();\n\t\t\tbreak;\n\t\t}\n\n\t\t// Check packet for compression:\n\t\tif (m_State == 3)\n\t\t{\n\t\t\tUInt32 NumBytesRead = static_cast<UInt32>(a_Buffer.GetReadableSpace());\n\n\t\t\tUInt32 UncompressedSize;\n\t\t\tif (!a_Buffer.ReadVarInt(UncompressedSize))\n\t\t\t{\n\t\t\t\tm_Client->Kick(\"Compression packet incomplete\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tNumBytesRead -= static_cast<UInt32>(a_Buffer.GetReadableSpace());  // How many bytes has the UncompressedSize taken up?\n\t\t\tASSERT(PacketLen > NumBytesRead);\n\t\t\tPacketLen -= NumBytesRead;\n\n\t\t\tif (UncompressedSize > 0)\n\t\t\t{\n\t\t\t\t// Decompress the data:\n\t\t\t\tm_Extractor.ReadFrom(a_Buffer, PacketLen);\n\t\t\t\ta_Buffer.CommitRead();\n\n\t\t\t\tconst auto UncompressedData = m_Extractor.Extract(UncompressedSize);\n\t\t\t\tconst auto Uncompressed = UncompressedData.GetView();\n\t\t\t\tcByteBuffer bb(Uncompressed.size());\n\n\t\t\t\t// Compression was used, move the uncompressed data:\n\t\t\t\tVERIFY(bb.Write(Uncompressed.data(), Uncompressed.size()));\n\n\t\t\t\tHandlePacket(bb);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Move the packet payload to a separate cByteBuffer, bb:\n\t\tcByteBuffer bb(PacketLen);\n\n\t\t// No compression was used, move directly:\n\t\tVERIFY(a_Buffer.ReadToByteBuffer(bb, static_cast<size_t>(PacketLen)));\n\t\ta_Buffer.CommitRead();\n\n\t\tHandlePacket(bb);\n\t}  // for (ever)\n\n\t// Log any leftover bytes into the logfile:\n\tif (g_ShouldLogCommIn && (a_Buffer.GetReadableSpace() > 0) && m_CommLogFile.IsOpen())\n\t{\n\t\tContiguousByteBuffer AllData;\n\t\tsize_t OldReadableSpace = a_Buffer.GetReadableSpace();\n\t\ta_Buffer.ReadAll(AllData);\n\t\ta_Buffer.ResetRead();\n\t\ta_Buffer.SkipRead(a_Buffer.GetReadableSpace() - OldReadableSpace);\n\t\tASSERT(a_Buffer.GetReadableSpace() == OldReadableSpace);\n\t\tAString Hex;\n\t\tCreateHexDump(Hex, AllData.data(), AllData.size(), 16);\n\t\tm_CommLogFile.Write(fmt::format(\n\t\t\tFMT_STRING(\"There are {0} (0x{0:x}) bytes of non-parse-able data left in the buffer:\\n{1}\"),\n\t\t\ta_Buffer.GetReadableSpace(), Hex\n\t\t));\n\t\tm_CommLogFile.Flush();\n\t}\n}\n\n\n\n\n\nUInt8 cProtocol_1_8_0::GetProtocolEntityType(const cEntity & a_Entity) const\n{\n\tusing Type = cEntity::eEntityType;\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase Type::etEnderCrystal: return 51;\n\t\tcase Type::etPickup: return 2;\n\t\tcase Type::etFallingBlock: return 70;\n\t\tcase Type::etMinecart: return 10;\n\t\tcase Type::etBoat: return 1;\n\t\tcase Type::etTNT: return 50;\n\t\tcase Type::etProjectile:\n\t\t{\n\t\t\tusing PType = cProjectileEntity::eKind;\n\t\t\tconst auto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase PType::pkArrow: return 60;\n\t\t\t\tcase PType::pkSnowball: return 61;\n\t\t\t\tcase PType::pkEgg: return 62;\n\t\t\t\tcase PType::pkGhastFireball: return 63;\n\t\t\t\tcase PType::pkFireCharge: return 64;\n\t\t\t\tcase PType::pkEnderPearl: return 65;\n\t\t\t\tcase PType::pkExpBottle: return 75;\n\t\t\t\tcase PType::pkSplashPotion: return 73;\n\t\t\t\tcase PType::pkFirework: return 76;\n\t\t\t\tcase PType::pkWitherSkull: return 66;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase Type::etFloater: return 90;\n\t\tcase Type::etItemFrame: return 71;\n\t\tcase Type::etLeashKnot: return 77;\n\n\t\t// Non-objects must not be sent\n\t\tcase Type::etEntity:\n\t\tcase Type::etPlayer:\n\t\tcase Type::etMonster:\n\t\tcase Type::etExpOrb:\n\t\tcase Type::etPainting: break;\n\t}\n\tUNREACHABLE(\"Unhandled entity kind\");\n}\n\n\n\n\n\nint cProtocol_1_8_0::GetProtocolParticleID(const AString & a_ParticleName) const\n{\n\tstatic const std::unordered_map<AString, int> ParticleMap\n\t{\n\t\t// Initialize the ParticleMap:\n\t\t{ \"explode\",          0 },\n\t\t{ \"largeexplode\",     1 },\n\t\t{ \"hugeexplosion\",    2 },\n\t\t{ \"fireworksspark\",   3 },\n\t\t{ \"bubble\",           4 },\n\t\t{ \"splash\",           5 },\n\t\t{ \"wake\",             6 },\n\t\t{ \"suspended\",        7 },\n\t\t{ \"depthsuspend\",     8 },\n\t\t{ \"crit\",             9 },\n\t\t{ \"magiccrit\",        10 },\n\t\t{ \"smoke\",            11 },\n\t\t{ \"largesmoke\",       12 },\n\t\t{ \"spell\",            13 },\n\t\t{ \"instantspell\",     14 },\n\t\t{ \"mobspell\",         15 },\n\t\t{ \"mobspellambient\",  16 },\n\t\t{ \"witchmagic\",       17 },\n\t\t{ \"dripwater\",        18 },\n\t\t{ \"driplava\",         19 },\n\t\t{ \"angryvillager\",    20 },\n\t\t{ \"happyvillager\",    21 },\n\t\t{ \"townaura\",         22 },\n\t\t{ \"note\",             23 },\n\t\t{ \"portal\",           24 },\n\t\t{ \"enchantmenttable\", 25 },\n\t\t{ \"flame\",            26 },\n\t\t{ \"lava\",             27 },\n\t\t{ \"footstep\",         28 },\n\t\t{ \"cloud\",            29 },\n\t\t{ \"reddust\",          30 },\n\t\t{ \"snowballpoof\",     31 },\n\t\t{ \"snowshovel\",       32 },\n\t\t{ \"slime\",            33 },\n\t\t{ \"heart\",            34 },\n\t\t{ \"barrier\",          35 },\n\t\t{ \"iconcrack\",        36 },\n\t\t{ \"blockcrack\",       37 },\n\t\t{ \"blockdust\",        38 },\n\t\t{ \"droplet\",          39 },\n\t\t{ \"take\",             40 },\n\t\t{ \"mobappearance\",    41 },\n\t\t{ \"dragonbreath\",     42 },\n\t\t{ \"endrod\",           43 },\n\t\t{ \"damageindicator\",  44 },\n\t\t{ \"sweepattack\",      45 },\n\t\t{ \"fallingdust\",      46 },\n\t\t{ \"totem\",            47 },\n\t\t{ \"spit\",             48 }\n\t};\n\n\tconst auto ParticleName = StrToLower(a_ParticleName);\n\tconst auto FindResult = ParticleMap.find(ParticleName);\n\tif (FindResult == ParticleMap.end())\n\t{\n\t\tLOGWARNING(\"Unknown particle: %s\", a_ParticleName.c_str());\n\t\tASSERT(!\"Unknown particle\");\n\t\treturn 0;\n\t}\n\n\treturn FindResult->second;\n}\n\n\n\n\n\nconst char * cProtocol_1_8_0::GetProtocolStatisticName(const CustomStatistic a_Statistic)\n{\n\tswitch (a_Statistic)\n\t{\n\t\t// V1.8 Achievements\n\t\tcase CustomStatistic::AchOpenInventory:        return \"achievement.openInventory\";\n\t\tcase CustomStatistic::AchMineWood:             return \"achievement.mineWood\";\n\t\tcase CustomStatistic::AchBuildWorkBench:       return \"achievement.buildWorkBench\";\n\t\tcase CustomStatistic::AchBuildPickaxe:         return \"achievement.buildPickaxe\";\n\t\tcase CustomStatistic::AchBuildFurnace:         return \"achievement.buildFurnace\";\n\t\tcase CustomStatistic::AchAcquireIron:          return \"achievement.acquireIron\";\n\t\tcase CustomStatistic::AchBuildHoe:             return \"achievement.buildHoe\";\n\t\tcase CustomStatistic::AchMakeBread:            return \"achievement.makeBread\";\n\t\tcase CustomStatistic::AchBakeCake:             return \"achievement.bakeCake\";\n\t\tcase CustomStatistic::AchBuildBetterPickaxe:   return \"achievement.buildBetterPickaxe\";\n\t\tcase CustomStatistic::AchCookFish:             return \"achievement.cookFish\";\n\t\tcase CustomStatistic::AchOnARail:              return \"achievement.onARail\";\n\t\tcase CustomStatistic::AchBuildSword:           return \"achievement.buildSword\";\n\t\tcase CustomStatistic::AchKillEnemy:            return \"achievement.killEnemy\";\n\t\tcase CustomStatistic::AchKillCow:              return \"achievement.killCow\";\n\t\tcase CustomStatistic::AchFlyPig:               return \"achievement.flyPig\";\n\t\tcase CustomStatistic::AchSnipeSkeleton:        return \"achievement.snipeSkeleton\";\n\t\tcase CustomStatistic::AchDiamonds:             return \"achievement.diamonds\";\n\t\tcase CustomStatistic::AchPortal:               return \"achievement.portal\";\n\t\tcase CustomStatistic::AchGhast:                return \"achievement.ghast\";\n\t\tcase CustomStatistic::AchBlazeRod:             return \"achievement.blazeRod\";\n\t\tcase CustomStatistic::AchPotion:               return \"achievement.potion\";\n\t\tcase CustomStatistic::AchTheEnd:               return \"achievement.theEnd\";\n\t\tcase CustomStatistic::AchTheEnd2:              return \"achievement.theEnd2\";\n\t\tcase CustomStatistic::AchEnchantments:         return \"achievement.enchantments\";\n\t\tcase CustomStatistic::AchOverkill:             return \"achievement.overkill\";\n\t\tcase CustomStatistic::AchBookcase:             return \"achievement.bookcase\";\n\t\tcase CustomStatistic::AchExploreAllBiomes:     return \"achievement.exploreAllBiomes\";\n\t\tcase CustomStatistic::AchSpawnWither:          return \"achievement.spawnWither\";\n\t\tcase CustomStatistic::AchKillWither:           return \"achievement.killWither\";\n\t\tcase CustomStatistic::AchFullBeacon:           return \"achievement.fullBeacon\";\n\t\tcase CustomStatistic::AchBreedCow:             return \"achievement.breedCow\";\n\t\tcase CustomStatistic::AchDiamondsToYou:        return \"achievement.diamondsToYou\";\n\n\t\t// V1.8 stats\n\t\tcase CustomStatistic::AnimalsBred:               return \"stat.animalsBred\";\n\t\tcase CustomStatistic::BoatOneCm:                 return \"stat.boatOneCm\";\n\t\tcase CustomStatistic::ClimbOneCm:                return \"stat.climbOneCm\";\n\t\tcase CustomStatistic::CrouchOneCm:               return \"stat.crouchOneCm\";\n\t\tcase CustomStatistic::DamageDealt:               return \"stat.damageDealt\";\n\t\tcase CustomStatistic::DamageTaken:               return \"stat.damageTaken\";\n\t\tcase CustomStatistic::Deaths:                    return \"stat.deaths\";\n\t\tcase CustomStatistic::Drop:                      return \"stat.drop\";\n\t\tcase CustomStatistic::FallOneCm:                 return \"stat.fallOneCm\";\n\t\tcase CustomStatistic::FishCaught:                return \"stat.fishCaught\";\n\t\tcase CustomStatistic::FlyOneCm:                  return \"stat.flyOneCm\";\n\t\tcase CustomStatistic::HorseOneCm:                return \"stat.horseOneCm\";\n\t\tcase CustomStatistic::Jump:                      return \"stat.jump\";\n\t\tcase CustomStatistic::LeaveGame:                 return \"stat.leaveGame\";\n\t\tcase CustomStatistic::MinecartOneCm:             return \"stat.minecartOneCm\";\n\t\tcase CustomStatistic::MobKills:                  return \"stat.mobKills\";\n\t\tcase CustomStatistic::PigOneCm:                  return \"stat.pigOneCm\";\n\t\tcase CustomStatistic::PlayerKills:               return \"stat.playerKills\";\n\t\tcase CustomStatistic::PlayOneMinute:             return \"stat.playOneMinute\";\n\t\tcase CustomStatistic::SprintOneCm:               return \"stat.sprintOneCm\";\n\t\tcase CustomStatistic::SwimOneCm:                 return \"stat.swimOneCm\";\n\t\tcase CustomStatistic::TalkedToVillager:          return \"stat.talkedToVillager\";\n\t\tcase CustomStatistic::TimeSinceDeath:            return \"stat.timeSinceDeath\";\n\t\tcase CustomStatistic::TradedWithVillager:        return \"stat.tradedWithVillager\";\n\t\tcase CustomStatistic::WalkOneCm:                 return \"stat.walkOneCm\";\n\t\tcase CustomStatistic::WalkUnderWaterOneCm:       return \"stat.diveOneCm\";\n\n\t\t// V1.8.2 stats\n\t\tcase CustomStatistic::CleanArmor:                return \"stat.armorCleaned\";\n\t\tcase CustomStatistic::CleanBanner:               return \"stat.bannerCleaned\";\n\t\tcase CustomStatistic::EatCakeSlice:              return \"stat.cakeSlicesEaten\";\n\t\tcase CustomStatistic::EnchantItem:               return \"stat.itemEnchanted\";\n\t\tcase CustomStatistic::FillCauldron:              return \"stat.cauldronFilled\";\n\t\tcase CustomStatistic::InspectDispenser:          return \"stat.dispenserInspected\";\n\t\tcase CustomStatistic::InspectDropper:            return \"stat.dropperInspected\";\n\t\tcase CustomStatistic::InspectHopper:             return \"stat.hopperInspected\";\n\t\tcase CustomStatistic::InteractWithBeacon:        return \"stat.beaconInteraction\";\n\t\tcase CustomStatistic::InteractWithBrewingstand:  return \"stat.brewingstandInteraction\";\n\t\tcase CustomStatistic::InteractWithCraftingTable: return \"stat.craftingTableInteraction\";\n\t\tcase CustomStatistic::InteractWithFurnace:       return \"stat.furnaceInteraction\";\n\t\tcase CustomStatistic::OpenChest:                 return \"stat.chestOpened\";\n\t\tcase CustomStatistic::OpenEnderchest:            return \"stat.enderchestOpened\";\n\t\tcase CustomStatistic::PlayNoteblock:             return \"stat.noteblockPlayed\";\n\t\tcase CustomStatistic::PlayRecord:                return \"stat.recordPlayed\";\n\t\tcase CustomStatistic::PotFlower:                 return \"stat.flowerPotted\";\n\t\tcase CustomStatistic::TriggerTrappedChest:       return \"stat.trappedChestTriggered\";\n\t\tcase CustomStatistic::TuneNoteblock:             return \"stat.noteblockTuned\";\n\t\tcase CustomStatistic::UseCauldron:               return \"stat.cauldronUsed\";\n\n\t\t// V1.9 stats\n\t\tcase CustomStatistic::AviateOneCm:               return \"stat.aviateOneCm\";\n\t\tcase CustomStatistic::SleepInBed:                return \"stat.sleepInBed\";\n\t\tcase CustomStatistic::SneakTime:                 return \"stat.sneakTime\";\n\t\tdefault:                                   return \"\";\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::HandlePacket(cByteBuffer & a_Buffer)\n{\n\tUInt32 PacketType;\n\tif (!a_Buffer.ReadVarInt(PacketType))\n\t{\n\t\t// Not enough data\n\t\treturn;\n\t}\n\n\t// Log the packet info into the comm log file:\n\tif (g_ShouldLogCommIn && m_CommLogFile.IsOpen())\n\t{\n\t\tContiguousByteBuffer PacketData;\n\t\ta_Buffer.ReadAll(PacketData);\n\t\ta_Buffer.ResetRead();\n\t\ta_Buffer.ReadVarInt(PacketType);  // We have already read the packet type once, it will be there again\n\t\tASSERT(PacketData.size() > 0);  // We have written an extra NUL, so there had to be at least one byte read\n\t\tPacketData.resize(PacketData.size() - 1);\n\t\tAString PacketDataHex;\n\t\tCreateHexDump(PacketDataHex, PacketData.data(), PacketData.size(), 16);\n\t\tm_CommLogFile.Write(fmt::format(\n\t\t\tFMT_STRING(\"Next incoming packet is type {0} (0x{0:x}), length {1} (0x{1:x}) at state {2}. Payload:\\n{3}\\n\"),\n\t\t\tPacketType, a_Buffer.GetUsedSpace(), m_State, PacketDataHex\n\t\t));\n\t}\n\n\tif (!HandlePacket(a_Buffer, PacketType))\n\t{\n\t\t// Unknown packet, already been reported, but without the length. Log the length here:\n\t\tLOGWARNING(\"Unhandled packet: type 0x%x, state %d, length %u\", PacketType, m_State, a_Buffer.GetUsedSpace());\n\n#ifndef NDEBUG\n\t\t// Dump the packet contents into the log:\n\t\ta_Buffer.ResetRead();\n\t\tContiguousByteBuffer Packet;\n\t\ta_Buffer.ReadAll(Packet);\n\t\tPacket.resize(Packet.size() - 1);  // Drop the final NUL pushed there for over-read detection\n\t\tAString Out;\n\t\tCreateHexDump(Out, Packet.data(), Packet.size(), 24);\n\t\tLOGD(\"Packet contents:\\n%s\", Out.c_str());\n#endif  // !NDEBUG\n\n\t\t// Put a message in the comm log:\n\t\tif (g_ShouldLogCommIn && m_CommLogFile.IsOpen())\n\t\t{\n\t\t\tm_CommLogFile.Write(\"^^^^^^ Unhandled packet ^^^^^^\\n\\n\\n\");\n\t\t}\n\n\t\treturn;\n\t}\n\n\t// The packet should have nothing left in the buffer:\n\tif (a_Buffer.GetReadableSpace() != 0)\n\t{\n\t\t// Read more or less than packet length, report as error\n\t\tLOGWARNING(\"Protocol 1.8: Wrong number of bytes read for packet 0x%x, state %d. Read %zu bytes, packet contained %u bytes\",\n\t\t\tPacketType, m_State, a_Buffer.GetUsedSpace() - a_Buffer.GetReadableSpace(), a_Buffer.GetUsedSpace()\n\t\t);\n\n\t\t// Put a message in the comm log:\n\t\tif (g_ShouldLogCommIn && m_CommLogFile.IsOpen())\n\t\t{\n\t\t\tm_CommLogFile.Write(fmt::format(\n\t\t\t\tFMT_STRING(\"^^^^^^ Wrong number of bytes read for this packet (exp 1 left, got {} left) ^^^^^^\\n\\n\\n\"),\n\t\t\t\ta_Buffer.GetReadableSpace()\n\t\t\t));\n\t\t\tm_CommLogFile.Flush();\n\t\t}\n\n\t\tASSERT(!\"Read wrong number of bytes!\");\n\t\tm_Client->PacketError(PacketType);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_8_0::StartEncryption(const Byte * a_Key)\n{\n\tm_Encryptor.Init(a_Key, a_Key);\n\tm_Decryptor.Init(a_Key, a_Key);\n\tm_IsEncrypted = true;\n\n\t// Prepare the m_AuthServerID:\n\tcSha1Checksum Checksum;\n\tcServer * Server = cRoot::Get()->GetServer();\n\tconst AString & ServerID = Server->GetServerID();\n\tChecksum.Update(reinterpret_cast<const Byte *>(ServerID.c_str()), ServerID.length());\n\tChecksum.Update(a_Key, 16);\n\tChecksum.Update(reinterpret_cast<const Byte *>(Server->GetPublicKeyDER().data()), Server->GetPublicKeyDER().size());\n\tByte Digest[20];\n\tChecksum.Finalize(Digest);\n\tcSha1Checksum::DigestToJava(Digest, m_AuthServerID);\n}\n"
  },
  {
    "path": "src/Protocol/Protocol_1_8.h",
    "content": "\n// Protocol_1_8.h\n\n/*\nDeclares the 1.8 protocol classes:\n\t- cProtocol_1_8_0\n\t\t- release 1.8 protocol (#47), also used by 1.8.1 to 1.8.9\n*/\n\n\n\n\n\n#pragma once\n\n#include \"Protocol.h\"\n#include \"../ByteBuffer.h\"\n#include \"../Registries/CustomStatistics.h\"\n\n#include \"../mbedTLS++/AesCfb128Decryptor.h\"\n#include \"../mbedTLS++/AesCfb128Encryptor.h\"\n\n#include \"CircularBufferCompressor.h\"\n#include \"StringCompression.h\"\n\n\n\n\n\nclass cProtocol_1_8_0:\n\tpublic cProtocol\n{\n\tusing Super = cProtocol;\n\npublic:\n\n\tcProtocol_1_8_0(cClientHandle * a_Client, const AString & a_ServerAddress, State a_State);\n\n\tvirtual void DataReceived(cByteBuffer & a_Buffer, ContiguousByteBuffer & a_Data) override;\n\tvirtual void DataPrepared(ContiguousByteBuffer & a_Data) override;\n\n\t// Sending stuff to clients (alphabetically sorted):\n\tvirtual void SendAttachEntity               (const cEntity & a_Entity, const cEntity & a_Vehicle) override;\n\tvirtual void SendBlockAction                (Vector3i a_BlockPos, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType) override;\n\tvirtual void SendBlockBreakAnim\t            (UInt32 a_EntityID, Vector3i a_BlockPos, char a_Stage) override;\n\tvirtual void SendBlockChange                (Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;\n\tvirtual void SendBlockChanges               (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;\n\tvirtual void SendBossBarAdd                 (UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog) override;\n\tvirtual void SendBossBarRemove              (UInt32 a_UniqueID) override;\n\tvirtual void SendBossBarUpdateFlags         (UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog) override;\n\tvirtual void SendBossBarUpdateHealth        (UInt32 a_UniqueID, float a_FractionFilled) override;\n\tvirtual void SendBossBarUpdateStyle         (UInt32 a_UniqueID, BossBarColor a_Color, BossBarDivisionType a_DivisionType) override;\n\tvirtual void SendBossBarUpdateTitle         (UInt32 a_UniqueID, const cCompositeChat & a_Title) override;\n\tvirtual void SendCameraSetTo                (const cEntity & a_Entity) override;\n\tvirtual void SendChat                       (const AString & a_Message, eChatType a_Type) override;\n\tvirtual void SendChat                       (const cCompositeChat & a_Message, eChatType a_Type, bool a_ShouldUseChatPrefixes) override;\n\tvirtual void SendChatRaw                    (const AString & a_MessageRaw, eChatType a_Type) override;\n\tvirtual void SendChunkData                  (ContiguousByteBufferView a_ChunkData) override;\n\tvirtual void SendCollectEntity              (const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count) override;\n\tvirtual void SendDestroyEntity              (const cEntity & a_Entity) override;\n\tvirtual void SendDetachEntity               (const cEntity & a_Entity, const cEntity & a_PreviousVehicle) override;\n\tvirtual void SendDisconnect                 (const AString & a_Reason) override;\n\tvirtual void SendEditSign                   (Vector3i a_BlockPos) override;  ///< Request the client to open up the sign editor for the sign (1.6+)\n\tvirtual void SendEntityAnimation            (const cEntity & a_Entity, EntityAnimation a_Animation) override;\n\tvirtual void SendEntityEffect               (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, int a_Duration) override;\n\tvirtual void SendEntityEquipment            (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;\n\tvirtual void SendEntityHeadLook             (const cEntity & a_Entity) override;\n\tvirtual void SendEntityLook                 (const cEntity & a_Entity) override;\n\tvirtual void SendEntityMetadata             (const cEntity & a_Entity) override;\n\tvirtual void SendEntityPosition             (const cEntity & a_Entity) override;\n\tvirtual void SendEntityProperties           (const cEntity & a_Entity) override;\n\tvirtual void SendEntityVelocity             (const cEntity & a_Entity) override;\n\tvirtual void SendExperience                 (void) override;\n\tvirtual void SendExperienceOrb              (const cExpOrb & a_ExpOrb) override;\n\tvirtual void SendExplosion                  (Vector3f a_Position, float a_Power) override;\n\tvirtual void SendGameMode                   (eGameMode a_GameMode) override;\n\tvirtual void SendHealth                     (void) override;\n\tvirtual void SendHeldItemChange             (int a_ItemIndex) override;\n\tvirtual void SendHideTitle                  (void) override;\n\tvirtual void SendInventorySlot              (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;\n\tvirtual void SendKeepAlive                  (UInt32 a_PingID) override;\n\tvirtual void SendLeashEntity                (const cEntity & a_Entity, const cEntity & a_EntityLeashedTo) override;\n\tvirtual void SendLogin                      (const cPlayer & a_Player, const cWorld & a_World) override;\n\tvirtual void SendLoginSuccess               (void) override;\n\tvirtual void SendMapData                    (const cMap & a_Map, int a_DataStartX, int a_DataStartY) override;\n\tvirtual void SendPaintingSpawn              (const cPainting & a_Painting) override;\n\tvirtual void SendPlayerAbilities            (void) override;\n\tvirtual void SendParticleEffect             (const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount) override;\n\tvirtual void SendParticleEffect             (const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data) override;\n\tvirtual void SendPlayerListAddPlayer        (const cPlayer & a_Player) override;\n\tvirtual void SendPlayerListHeaderFooter     (const cCompositeChat & a_Header, const cCompositeChat & a_Footer) override;\n\tvirtual void SendPlayerListRemovePlayer     (const cPlayer & a_Player) override;\n\tvirtual void SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_CustomName) override;\n\tvirtual void SendPlayerListUpdateGameMode   (const cPlayer & a_Player) override;\n\tvirtual void SendPlayerListUpdatePing       () override;\n\tvirtual void SendPlayerMoveLook             (Vector3d a_Pos, float a_Yaw, float a_Pitch, bool a_IsRelative) override;\n\tvirtual void SendPlayerMoveLook             (void) override;\n\tvirtual void SendPlayerPermissionLevel      (void) override;\n\tvirtual void SendPlayerPosition             (void) override;\n\tvirtual void SendPlayerSpawn                (const cPlayer & a_Player) override;\n\tvirtual void SendPluginMessage              (const AString & a_Channel, ContiguousByteBufferView a_Message) override;\n\tvirtual void SendRemoveEntityEffect         (const cEntity & a_Entity, int a_EffectID) override;\n\tvirtual void SendResetTitle                 (void) override;\n\tvirtual void SendResourcePack               (const AString & a_ResourcePackUrl) override;\n\tvirtual void SendRespawn                    (eDimension a_Dimension) override;\n\tvirtual void SendSoundEffect                (const AString & a_SoundName, Vector3d a_Origin, float a_Volume, float a_Pitch) override;\n\tvirtual void SendScoreboardObjective        (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;\n\tvirtual void SendScoreUpdate                (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;\n\tvirtual void SendDisplayObjective           (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;\n\tvirtual void SendSetSubTitle                (const cCompositeChat & a_SubTitle) override;\n\tvirtual void SendSetRawSubTitle             (const AString & a_SubTitle) override;\n\tvirtual void SendSetTitle                   (const cCompositeChat & a_Title) override;\n\tvirtual void SendSetRawTitle                (const AString & a_Title) override;\n\tvirtual void SendSoundParticleEffect        (const EffectID a_EffectID, Vector3i a_Origin, int a_Data) override;\n\tvirtual void SendSpawnEntity                (const cEntity & a_Entity) override;\n\tvirtual void SendSpawnMob                   (const cMonster & a_Mob) override;\n\tvirtual void SendStatistics                 (const StatisticsManager & a_Manager) override;\n\tvirtual void SendTabCompletionResults       (const AStringVector & a_Results) override;\n\tvirtual void SendThunderbolt                (Vector3i a_BlockPos) override;\n\tvirtual void SendTitleTimes                 (int a_FadeInTicks, int a_DisplayTicks, int a_FadeOutTicks) override;\n\tvirtual void SendTimeUpdate                 (cTickTimeLong a_WorldAge, cTickTimeLong a_WorldDate, bool a_DoDaylightCycle) override;\n\tvirtual void SendUnleashEntity              (const cEntity & a_Entity) override;\n\tvirtual void SendUnloadChunk                (int a_ChunkX, int a_ChunkZ) override;\n\tvirtual void SendUpdateBlockEntity          (cBlockEntity & a_BlockEntity) override;\n\tvirtual void SendUpdateSign                 (Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;\n\tvirtual void SendUnlockRecipe               (UInt32 a_RecipeID) override;\n\tvirtual void SendInitRecipes                (UInt32 a_RecipeID) override;\n\tvirtual void SendWeather                    (eWeather a_Weather) override;\n\tvirtual void SendWholeInventory             (const cWindow & a_Window) override;\n\tvirtual void SendWindowClose                (const cWindow & a_Window) override;\n\tvirtual void SendWindowOpen                 (const cWindow & a_Window) override;\n\tvirtual void SendWindowProperty             (const cWindow & a_Window, size_t a_Property, short a_Value) override;\n\n\tvirtual AString GetAuthServerID(void) override { return m_AuthServerID; }\n\n\t/** Compress the packet. a_Packet must be without packet length.\n\ta_Compressed will be set to the compressed packet includes packet length and data length. */\n\tstatic void CompressPacket(CircularBufferCompressor & a_Packet, ContiguousByteBuffer & a_Compressed);\n\nprotected:\n\n\t/** State of the protocol. */\n\tState m_State;\n\n\t/** Converts the BlockFace received by the protocol into eBlockFace constants.\n\tIf the received value doesn't match any of our eBlockFace constants, BLOCK_FACE_NONE is returned. */\n\tstatic eBlockFace FaceIntToBlockFace(Int32 a_FaceInt);\n\n\t/** Get the packet ID for a given packet. */\n\tvirtual UInt32 GetPacketID(ePacketType a_Packet) const override;\n\n\t/** Converts an animation into an ID suitable for use with the Entity Animation packet.\n\tReturns (uchar)-1 if the protocol version doesn't support this animation. */\n\tvirtual unsigned char GetProtocolEntityAnimation(EntityAnimation a_Animation) const;\n\n\t/** Converts an animation into an ID suitable for use with the Entity Status packet.\n\tReturns -1 if the protocol version doesn't support this animation. */\n\tvirtual signed char GetProtocolEntityStatus(EntityAnimation a_Animation) const;\n\n\t/** Converts an entity to a protocol-specific entity type.\n\tOnly entities that the Send Spawn Entity packet supports are valid inputs to this method */\n\tvirtual UInt8 GetProtocolEntityType(const cEntity & a_Entity) const;\n\n\t/** Converts eMonsterType to protocol-specific mob types */\n\tvirtual UInt32 GetProtocolMobType(eMonsterType a_MobType) const;\n\n\t/** The 1.8 protocol use a particle id instead of a string. This function converts the name to the id. If the name is incorrect, it returns 0. */\n\tvirtual int GetProtocolParticleID(const AString & a_ParticleName) const;\n\n\t/** Returns the protocol version. */\n\tvirtual Version GetProtocolVersion() const override;\n\n\t/** Reads and handles the packet. The packet length and type have already been read.\n\tReturns true if the packet was understood, false if it was an unknown packet. */\n\tvirtual bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType);\n\n\t// Packet handlers while in the Status state (m_State == 1):\n\tvirtual void HandlePacketStatusPing(cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer);\n\n\t// Packet handlers while in the Login state (m_State == 2):\n\tvirtual void HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketLoginStart(cByteBuffer & a_ByteBuffer);\n\n\t// Packet handlers while in the Game state (m_State == 3):\n\tvirtual void HandlePacketAnimation              (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketBlockDig               (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketBlockPlace             (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketChatMessage            (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketClientSettings         (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketClientStatus           (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketCreativeInventoryAction(cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketEntityAction           (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketKeepAlive              (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketPlayer                 (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketPlayerAbilities        (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketPlayerLook             (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketPlayerPos              (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketPlayerPosLook          (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketPluginMessage          (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketResourcePackStatus     (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketSlotSelect             (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketSpectate               (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketSteerVehicle           (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketTabComplete            (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketUpdateSign             (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketUseEntity              (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketEnchantItem            (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketWindowClick            (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketWindowClose            (cByteBuffer & a_ByteBuffer);\n\n\t/** Parses Vanilla plugin messages into specific ClientHandle calls.\n\tThe message payload is still in the bytebuffer, the handler reads it specifically for each handled channel. */\n\tvirtual void HandleVanillaPluginMessage(cByteBuffer & a_ByteBuffer, std::string_view a_Channel);\n\n\t/** Parses item metadata as read by ReadItem(), into the item enchantments. */\n\tvirtual void ParseItemMetadata(cItem & a_Item, ContiguousByteBufferView a_Metadata) const;\n\n\t/** Reads an item out of the received data, sets a_Item to the values read.\n\tReturns false if not enough received data.\n\ta_KeepRemainingBytes tells the function to keep that many bytes at the end of the buffer. */\n\tvirtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes = 0) const;\n\n\t/** Sends the entity type and entity-dependent data required for the entity to initially spawn. */\n\tvirtual void SendEntitySpawn(const cEntity & a_Entity, const UInt8 a_ObjectType, const Int32 a_ObjectData);\n\n\t/** Sends the packet to the client. Called by the cPacketizer's destructor. */\n\tvirtual void SendPacket(cPacketizer & a_Packet) override;\n\n\t/** Writes the block entity data for the specified block entity into the packet. */\n\tvirtual void WriteBlockEntity(cFastNBTWriter & a_Writer, const cBlockEntity & a_BlockEntity) const;\n\n\t/** Writes the metadata for the specified entity, not including the terminating 0x7f. */\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const;\n\n\t/** Writes the entity properties for the specified entity, including the Count field. */\n\tvirtual void WriteEntityProperties(cPacketizer & a_Pkt, const cEntity & a_Entity) const;\n\n\t/** Writes the item data into a packet. */\n\tvirtual void WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) const;\n\n\t/** Writes the mob-specific metadata for the specified mob */\n\tvirtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const;\n\nprivate:\n\n\tAString m_ServerAddress;\n\n\tAString m_AuthServerID;\n\n\tbool m_IsEncrypted;\n\n\tcAesCfb128Decryptor m_Decryptor;\n\tcAesCfb128Encryptor m_Encryptor;\n\n\tCircularBufferCompressor m_Compressor;\n\tCircularBufferExtractor m_Extractor;\n\n\t/** The logfile where the comm is logged, when g_ShouldLogComm is true */\n\tcFile m_CommLogFile;\n\n\t/** Adds the received (unencrypted) data to m_ReceivedData, parses complete packets */\n\tvoid AddReceivedData(cByteBuffer & a_Buffer, ContiguousByteBufferView a_Data);\n\n\t/** Converts a statistic to a protocol-specific string.\n\tProtocols <= 1.12 use strings, hence this is a static as the string-mapping was append-only for the versions that used it.\n\tReturns an empty string, handled correctly by the client, for newer, unsupported statistics. */\n\tstatic const char * GetProtocolStatisticName(CustomStatistic a_Statistic);\n\n\t/** Handle a complete packet stored in the given buffer. */\n\tvoid HandlePacket(cByteBuffer & a_Buffer);\n\n\tvoid StartEncryption(const Byte * a_Key);\n} ;\n"
  },
  {
    "path": "src/Protocol/Protocol_1_9.cpp",
    "content": "\n// Protocol_1_9.cpp\n\n/*\nImplements the 1.9 protocol classes:\n\t- cProtocol_1_9_0\n\t\t- release 1.9 protocol (#107)\n\t- cProtocol_1_9_1\n\t\t- release 1.9.1 protocol (#108)\n\t- cProtocol_1_9_2\n\t\t- release 1.9.2 protocol (#109)\n\t- cProtocol_1_9_4\n\t\t- release 1.9.4 protocol (#110)\n*/\n\n#include \"Globals.h\"\n#include \"Protocol_1_9.h\"\n#include \"../mbedTLS++/Sha1Checksum.h\"\n#include \"Packetizer.h\"\n\n#include \"../ClientHandle.h\"\n#include \"../Root.h\"\n#include \"../Server.h\"\n#include \"../World.h\"\n#include \"../StringCompression.h\"\n#include \"../CompositeChat.h\"\n#include \"../JsonUtils.h\"\n\n#include \"../WorldStorage/FastNBT.h\"\n\n#include \"../Entities/EnderCrystal.h\"\n#include \"../Entities/ExpOrb.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Entities/FallingBlock.h\"\n#include \"../Entities/Painting.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/FireworkEntity.h\"\n#include \"../Entities/SplashPotionEntity.h\"\n\n#include \"../Items/ItemSpawnEgg.h\"\n\n#include \"../Mobs/IncludeAllMonsters.h\"\n#include \"../UI/HorseWindow.h\"\n\n#include \"../BlockEntities/MobSpawnerEntity.h\"\n\n\n\n\n\n// Value for main hand in Hand parameter for Protocol 1.9.\n#define MAIN_HAND 0\n\n// Value for left hand in MainHand parameter for Protocol 1.9.\n#define LEFT_HAND 0\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_9_0:\n\ncProtocol_1_9_0::cProtocol_1_9_0(cClientHandle * a_Client, const AString & a_ServerAddress, State a_State) :\n\tSuper(a_Client, a_ServerAddress, a_State),\n\tm_IsTeleportIdConfirmed(true),\n\tm_OutstandingTeleportId(0)\n{\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendAttachEntity(const cEntity & a_Entity, const cEntity & a_Vehicle)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\tcPacketizer Pkt(*this, pktAttachEntity);\n\tPkt.WriteVarInt32(a_Vehicle.GetUniqueID());\n\tPkt.WriteVarInt32(1);  // 1 passenger\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendBossBarAdd(UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBossBar);\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_UniqueID);\n\tPkt.WriteVarInt32(0);  // Add\n\tPkt.WriteString(a_Title.CreateJsonString());\n\tPkt.WriteBEFloat(a_FractionFilled);\n\tPkt.WriteVarInt32([a_Color]\n\t{\n\t\tswitch (a_Color)\n\t\t{\n\t\t\tcase BossBarColor::Pink: return 0U;\n\t\t\tcase BossBarColor::Blue: return 1U;\n\t\t\tcase BossBarColor::Red: return 2U;\n\t\t\tcase BossBarColor::Green: return 3U;\n\t\t\tcase BossBarColor::Yellow: return 4U;\n\t\t\tcase BossBarColor::Purple: return 5U;\n\t\t\tcase BossBarColor::White: return 6U;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported boss bar property\");\n\t}());\n\tPkt.WriteVarInt32([a_DivisionType]\n\t{\n\t\tswitch (a_DivisionType)\n\t\t{\n\t\t\tcase BossBarDivisionType::None: return 0U;\n\t\t\tcase BossBarDivisionType::SixNotches: return 1U;\n\t\t\tcase BossBarDivisionType::TenNotches: return 2U;\n\t\t\tcase BossBarDivisionType::TwelveNotches: return 3U;\n\t\t\tcase BossBarDivisionType::TwentyNotches: return 4U;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported boss bar property\");\n\t}());\n\t{\n\t\tUInt8 Flags = 0x00;\n\t\tif (a_DarkenSky)\n\t\t{\n\t\t\tFlags |= 0x01;\n\t\t}\n\t\tif (a_PlayEndMusic || a_CreateFog)\n\t\t{\n\t\t\tFlags |= 0x02;\n\t\t}\n\t\tPkt.WriteBEUInt8(Flags);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendBossBarRemove(UInt32 a_UniqueID)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBossBar);\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_UniqueID);\n\tPkt.WriteVarInt32(1);  // Remove\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendBossBarUpdateFlags(UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBossBar);\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_UniqueID);\n\tPkt.WriteVarInt32(5);  // Update Flags\n\t{\n\t\tUInt8 Flags = 0x00;\n\t\tif (a_DarkenSky)\n\t\t{\n\t\t\tFlags |= 0x01;\n\t\t}\n\t\tif (a_PlayEndMusic || a_CreateFog)\n\t\t{\n\t\t\tFlags |= 0x02;\n\t\t}\n\t\tPkt.WriteBEUInt8(Flags);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendBossBarUpdateHealth(UInt32 a_UniqueID, float a_FractionFilled)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBossBar);\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_UniqueID);\n\tPkt.WriteVarInt32(2);  // Update health\n\tPkt.WriteBEFloat(a_FractionFilled);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendBossBarUpdateStyle(UInt32 a_UniqueID, BossBarColor a_Color, BossBarDivisionType a_DivisionType)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBossBar);\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_UniqueID);\n\tPkt.WriteVarInt32(4);  // Update health\n\tPkt.WriteVarInt32([a_Color]\n\t{\n\t\tswitch (a_Color)\n\t\t{\n\t\t\tcase BossBarColor::Pink: return 0U;\n\t\t\tcase BossBarColor::Blue: return 1U;\n\t\t\tcase BossBarColor::Red: return 2U;\n\t\t\tcase BossBarColor::Green: return 3U;\n\t\t\tcase BossBarColor::Yellow: return 4U;\n\t\t\tcase BossBarColor::Purple: return 5U;\n\t\t\tcase BossBarColor::White: return 6U;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported boss bar property\");\n\t}());\n\tPkt.WriteVarInt32([a_DivisionType]\n\t{\n\t\tswitch (a_DivisionType)\n\t\t{\n\t\t\tcase BossBarDivisionType::None: return 0U;\n\t\t\tcase BossBarDivisionType::SixNotches: return 1U;\n\t\t\tcase BossBarDivisionType::TenNotches: return 2U;\n\t\t\tcase BossBarDivisionType::TwelveNotches: return 3U;\n\t\t\tcase BossBarDivisionType::TwentyNotches: return 4U;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported boss bar property\");\n\t}());\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendBossBarUpdateTitle(UInt32 a_UniqueID, const cCompositeChat & a_Title)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktBossBar);\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_UniqueID);\n\tPkt.WriteVarInt32(3);  // Update title\n\tPkt.WriteString(a_Title.CreateJsonString());\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendDetachEntity(const cEntity & a_Entity, const cEntity & a_PreviousVehicle)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\tcPacketizer Pkt(*this, pktAttachEntity);\n\tPkt.WriteVarInt32(a_PreviousVehicle.GetUniqueID());\n\tPkt.WriteVarInt32(0);  // No passangers\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendEntityEquipment(const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityEquipment);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t// Needs to be adjusted due to the insertion of offhand at slot 1\n\tif (a_SlotNum > 0)\n\t{\n\t\ta_SlotNum++;\n\t}\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_SlotNum));\n\tWriteItem(Pkt, a_Item);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendEntityMetadata(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktEntityMeta);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tWriteEntityMetadata(Pkt, a_Entity);\n\tPkt.WriteBEUInt8(0xff);  // The termination byte\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendEntityPosition(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tconst auto Delta = (a_Entity.GetPosition() * 32 * 128).Floor() - (a_Entity.GetLastSentPosition() * 32 * 128).Floor();\n\n\t// Ensure that the delta has enough precision and is within range of a BEInt16:\n\tif (\n\t\tDelta.HasNonZeroLength() &&\n\t\tcByteBuffer::CanBEInt16Represent(Delta.x) &&\n\t\tcByteBuffer::CanBEInt16Represent(Delta.y) &&\n\t\tcByteBuffer::CanBEInt16Represent(Delta.z)\n\t)\n\t{\n\t\tconst auto Move = static_cast<Vector3<Int16>>(Delta);\n\n\t\t// Difference within limitations, use a relative move packet\n\t\tif (a_Entity.IsOrientationDirty())\n\t\t{\n\t\t\tcPacketizer Pkt(*this, pktEntityRelMoveLook);\n\t\t\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t\t\tPkt.WriteBEInt16(Move.x);\n\t\t\tPkt.WriteBEInt16(Move.y);\n\t\t\tPkt.WriteBEInt16(Move.z);\n\t\t\tPkt.WriteByteAngle(a_Entity.GetYaw());\n\t\t\tPkt.WriteByteAngle(a_Entity.GetPitch());\n\t\t\tPkt.WriteBool(a_Entity.IsOnGround());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcPacketizer Pkt(*this, pktEntityRelMove);\n\t\t\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\t\t\tPkt.WriteBEInt16(Move.x);\n\t\t\tPkt.WriteBEInt16(Move.y);\n\t\t\tPkt.WriteBEInt16(Move.z);\n\t\t\tPkt.WriteBool(a_Entity.IsOnGround());\n\t\t}\n\n\t\treturn;\n\t}\n\n\t// Too big or small a movement, do a teleport.\n\n\tcPacketizer Pkt(*this, pktTeleportEntity);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEDouble(a_Entity.GetPosX());\n\tPkt.WriteBEDouble(a_Entity.GetPosY());\n\tPkt.WriteBEDouble(a_Entity.GetPosZ());\n\tPkt.WriteByteAngle(a_Entity.GetYaw());\n\tPkt.WriteByteAngle(a_Entity.GetPitch());\n\tPkt.WriteBool(a_Entity.IsOnGround());\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendExperienceOrb(const cExpOrb & a_ExpOrb)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSpawnExperienceOrb);\n\tPkt.WriteVarInt32(a_ExpOrb.GetUniqueID());\n\tPkt.WriteBEDouble(a_ExpOrb.GetPosX());\n\tPkt.WriteBEDouble(a_ExpOrb.GetPosY());\n\tPkt.WriteBEDouble(a_ExpOrb.GetPosZ());\n\tPkt.WriteBEInt16(static_cast<Int16>(a_ExpOrb.GetReward()));\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendKeepAlive(UInt32 a_PingID)\n{\n\t// Drop the packet if the protocol is not in the Game state yet (caused a client crash):\n\tif (m_State != 3)\n\t{\n\t\tLOG(\"Trying to send a KeepAlive packet to a player who's not yet fully logged in (%d). The protocol class prevented the packet.\", m_State);\n\t\treturn;\n\t}\n\n\tcPacketizer Pkt(*this, pktKeepAlive);\n\tPkt.WriteVarInt32(a_PingID);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendLeashEntity(const cEntity & a_Entity, const cEntity & a_EntityLeashedTo)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\tcPacketizer Pkt(*this, pktLeashEntity);\n\tPkt.WriteBEUInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEUInt32(a_EntityLeashedTo.GetUniqueID());\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendUnleashEntity(const cEntity & a_Entity)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\tcPacketizer Pkt(*this, pktLeashEntity);\n\tPkt.WriteBEUInt32(a_Entity.GetUniqueID());\n\tPkt.WriteBEInt32(-1);  // Unleash a_Entity\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendPaintingSpawn(const cPainting & a_Painting)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\tdouble PosX = a_Painting.GetPosX();\n\tdouble PosY = a_Painting.GetPosY();\n\tdouble PosZ = a_Painting.GetPosZ();\n\n\tcPacketizer Pkt(*this, pktSpawnPainting);\n\tPkt.WriteVarInt32(a_Painting.GetUniqueID());\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_Painting.GetUniqueID());\n\tPkt.WriteString(a_Painting.GetName());\n\tPkt.WriteXYZPosition64(static_cast<Int32>(PosX), static_cast<Int32>(PosY), static_cast<Int32>(PosZ));\n\tPkt.WriteBEInt8(static_cast<Int8>(a_Painting.GetProtocolFacing()));\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendMapData(const cMap & a_Map, int a_DataStartX, int a_DataStartY)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktMapData);\n\tPkt.WriteVarInt32(a_Map.GetID());\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Map.GetScale()));\n\n\tPkt.WriteBool(true);\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Map.GetDecorators().size()));\n\tfor (const auto & Decorator : a_Map.GetDecorators())\n\t{\n\t\tPkt.WriteBEUInt8(static_cast<Byte>((static_cast<Int32>(Decorator.GetType()) << 4) | (Decorator.GetRot() & 0xF)));\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(Decorator.GetPixelX()));\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(Decorator.GetPixelZ()));\n\t}\n\n\tPkt.WriteBEUInt8(128);\n\tPkt.WriteBEUInt8(128);\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_DataStartX));\n\tPkt.WriteBEUInt8(static_cast<UInt8>(a_DataStartY));\n\tPkt.WriteVarInt32(static_cast<UInt32>(a_Map.GetData().size()));\n\tfor (auto itr = a_Map.GetData().cbegin(); itr != a_Map.GetData().cend(); ++itr)\n\t{\n\t\tPkt.WriteBEUInt8(*itr);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendPlayerMoveLook (const Vector3d a_Pos, const float a_Yaw, const float a_Pitch, const bool a_IsRelative)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktPlayerMoveLook);\n\tPkt.WriteBEDouble(a_Pos.x);\n\tPkt.WriteBEDouble(a_Pos.y);\n\tPkt.WriteBEDouble(a_Pos.z);\n\tPkt.WriteBEFloat(a_Yaw);\n\tPkt.WriteBEFloat(a_Pitch);\n\n\tif (a_IsRelative)\n\t{\n\t\t// Set all bits to 1 - makes everything relative\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(-1));\n\t}\n\telse\n\t{\n\t\t// Set all bits to 0 - make everything absolute\n\t\tPkt.WriteBEUInt8(0);\n\t}\n\n\tPkt.WriteVarInt32(++m_OutstandingTeleportId);\n\n\t// This teleport ID hasn't been confirmed yet\n\tm_IsTeleportIdConfirmed = false;\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendPlayerMoveLook(void)\n{\n\tcPlayer * Player = m_Client->GetPlayer();\n\tSendPlayerMoveLook(Player->GetPosition(), static_cast<float>(Player->GetYaw()), static_cast<float>(Player->GetPitch()), false);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendPlayerPermissionLevel()\n{\n\tconst cPlayer & Player = *m_Client->GetPlayer();\n\n\tcPacketizer Pkt(*this, pktEntityStatus);\n\tPkt.WriteBEUInt32(Player.GetUniqueID());\n\tPkt.WriteBEInt8([&Player]() -> signed char\n\t{\n\t\tif (Player.HasPermission(\"core.stop\") || Player.HasPermission(\"core.reload\") || Player.HasPermission(\"core.save-all\"))\n\t\t{\n\t\t\treturn 28;\n\t\t}\n\n\t\tif (Player.HasPermission(\"core.ban\") || Player.HasPermission(\"core.deop\") || Player.HasPermission(\"core.kick\") || Player.HasPermission(\"core.op\"))\n\t\t{\n\t\t\treturn 27;\n\t\t}\n\n\t\tif (Player.HasPermission(\"cuberite.comandblock.set\") || Player.HasPermission(\"core.clear\") || Player.HasPermission(\"core.difficulty\") || Player.HasPermission(\"core.effect\") || Player.HasPermission(\"core.gamemode\") || Player.HasPermission(\"core.tp\") || Player.HasPermission(\"core.give\"))\n\t\t{\n\t\t\treturn 26;\n\t\t}\n\n\t\tif (Player.HasPermission(\"core.spawnprotect.bypass\"))\n\t\t{\n\t\t\treturn 25;\n\t\t}\n\n\t\treturn 24;\n\t}());\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendPlayerSpawn(const cPlayer & a_Player)\n{\n\t// Called to spawn another player for the client\n\tcPacketizer Pkt(*this, pktSpawnOtherPlayer);\n\tPkt.WriteVarInt32(a_Player.GetUniqueID());\n\tPkt.WriteUUID(a_Player.GetUUID());\n\tVector3d LastSentPos = a_Player.GetLastSentPosition();\n\tPkt.WriteBEDouble(LastSentPos.x);\n\tPkt.WriteBEDouble(LastSentPos.y + 0.001);  // The \"+ 0.001\" is there because otherwise the player falls through the block they were standing on.\n\tPkt.WriteBEDouble(LastSentPos.z);\n\tPkt.WriteByteAngle(a_Player.GetYaw());\n\tPkt.WriteByteAngle(a_Player.GetPitch());\n\tWriteEntityMetadata(Pkt, a_Player);\n\tPkt.WriteBEUInt8(0xff);  // Metadata: end\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendSoundEffect(const AString & a_SoundName, Vector3d a_Origin, float a_Volume, float a_Pitch)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSoundEffect);\n\tPkt.WriteString(a_SoundName);\n\tPkt.WriteVarInt32(0);  // Master sound category (may want to be changed to a parameter later)\n\tPkt.WriteBEInt32(static_cast<Int32>(a_Origin.x * 8.0));\n\tPkt.WriteBEInt32(static_cast<Int32>(a_Origin.y * 8.0));\n\tPkt.WriteBEInt32(static_cast<Int32>(a_Origin.z * 8.0));\n\tPkt.WriteBEFloat(a_Volume);\n\tPkt.WriteBEUInt8(static_cast<Byte>(a_Pitch * 63));\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendSpawnMob(const cMonster & a_Mob)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tconst auto MobType = GetProtocolMobType(a_Mob.GetMobType());\n\n\t// If the type is not valid in this protocol bail out:\n\tif (MobType == 0)\n\t{\n\t\treturn;\n\t}\n\n\tcPacketizer Pkt(*this, pktSpawnMob);\n\tPkt.WriteVarInt32(a_Mob.GetUniqueID());\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_Mob.GetUniqueID());\n\tPkt.WriteBEUInt8(static_cast<Byte>(MobType));\n\tVector3d LastSentPos = a_Mob.GetLastSentPosition();\n\tPkt.WriteBEDouble(LastSentPos.x);\n\tPkt.WriteBEDouble(LastSentPos.y);\n\tPkt.WriteBEDouble(LastSentPos.z);\n\tPkt.WriteByteAngle(a_Mob.GetHeadYaw());  // Doesn't seem to be used\n\tPkt.WriteByteAngle(a_Mob.GetPitch());\n\tPkt.WriteByteAngle(a_Mob.GetYaw());\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedX() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedY() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Mob.GetSpeedZ() * 400));\n\tWriteEntityMetadata(Pkt, a_Mob);\n\tPkt.WriteBEUInt8(0xff);  // Metadata terminator\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendThunderbolt(Vector3i a_Origin)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSpawnGlobalEntity);\n\tPkt.WriteVarInt32(0);  // EntityID = 0, always\n\tPkt.WriteBEUInt8(1);  // Type = Thunderbolt\n\tPkt.WriteBEDouble(a_Origin.x);\n\tPkt.WriteBEDouble(a_Origin.y);\n\tPkt.WriteBEDouble(a_Origin.z);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendUnloadChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktUnloadChunk);\n\tPkt.WriteBEInt32(a_ChunkX);\n\tPkt.WriteBEInt32(a_ChunkZ);\n}\n\n\n\n\n\nUInt32 cProtocol_1_9_0::GetPacketID(cProtocol::ePacketType a_Packet) const\n{\n\tswitch (a_Packet)\n\t{\n\t\tcase pktAttachEntity:           return 0x40;\n\t\tcase pktBlockAction:            return 0x0a;\n\t\tcase pktBlockBreakAnim:         return 0x08;\n\t\tcase pktBlockChange:            return 0x0b;\n\t\tcase pktBlockChanges:           return 0x10;\n\t\tcase pktBossBar:                return 0x0c;\n\t\tcase pktCameraSetTo:            return 0x36;\n\t\tcase pktChatRaw:                return 0x0f;\n\t\tcase pktCollectEntity:          return 0x49;\n\t\tcase pktDestroyEntity:          return 0x30;\n\t\tcase pktDifficulty:             return 0x0d;\n\t\tcase pktDisconnectDuringGame:   return 0x1a;\n\t\tcase pktDisconnectDuringLogin:  return 0x0;\n\t\tcase pktDisplayObjective:       return 0x38;\n\t\tcase pktEditSign:               return 0x2a;\n\t\tcase pktEncryptionRequest:      return 0x01;\n\t\tcase pktEntityAnimation:        return 0x06;\n\t\tcase pktEntityEffect:           return 0x4c;\n\t\tcase pktEntityEquipment:        return 0x3c;\n\t\tcase pktEntityHeadLook:         return 0x34;\n\t\tcase pktEntityLook:             return 0x27;\n\t\tcase pktEntityMeta:             return 0x39;\n\t\tcase pktEntityProperties:       return 0x4b;\n\t\tcase pktEntityRelMove:          return 0x25;\n\t\tcase pktEntityRelMoveLook:      return 0x26;\n\t\tcase pktEntityStatus:           return 0x1b;\n\t\tcase pktEntityVelocity:         return 0x3b;\n\t\tcase pktExperience:             return 0x3d;\n\t\tcase pktExplosion:              return 0x1c;\n\t\tcase pktGameMode:               return 0x1e;\n\t\tcase pktHeldItemChange:         return 0x37;\n\t\tcase pktInventorySlot:          return 0x16;\n\t\tcase pktJoinGame:               return 0x23;\n\t\tcase pktKeepAlive:              return 0x1f;\n\t\tcase pktLeashEntity:            return 0x3a;\n\t\tcase pktLoginSuccess:           return 0x02;\n\t\tcase pktMapData:                return 0x24;\n\t\tcase pktParticleEffect:         return 0x22;\n\t\tcase pktPingResponse:           return 0x01;\n\t\tcase pktPlayerAbilities:        return 0x2b;\n\t\tcase pktPlayerList:             return 0x2d;\n\t\tcase pktPlayerListHeaderFooter: return 0x48;\n\t\tcase pktPlayerMoveLook:         return 0x2e;\n\t\tcase pktPluginMessage:          return 0x18;\n\t\tcase pktRemoveEntityEffect:     return 0x31;\n\t\tcase pktResourcePack:           return 0x32;\n\t\tcase pktRespawn:                return 0x33;\n\t\tcase pktScoreboardObjective:    return 0x3f;\n\t\tcase pktSpawnExperienceOrb:     return 0x01;\n\t\tcase pktSpawnGlobalEntity:      return 0x02;\n\t\tcase pktSpawnObject:            return 0x00;\n\t\tcase pktSpawnOtherPlayer:       return 0x05;\n\t\tcase pktSpawnPainting:          return 0x04;\n\t\tcase pktSpawnPosition:          return 0x43;\n\t\tcase pktSoundEffect:            return 0x19;\n\t\tcase pktSoundParticleEffect:    return 0x21;\n\t\tcase pktSpawnMob:               return 0x03;\n\t\tcase pktStartCompression:       return 0x03;\n\t\tcase pktStatistics:             return 0x07;\n\t\tcase pktStatusResponse:         return 0x00;\n\t\tcase pktTabCompletionResults:   return 0x0e;\n\t\tcase pktTeleportEntity:         return 0x4a;\n\t\tcase pktTimeUpdate:             return 0x44;\n\t\tcase pktTitle:                  return 0x45;\n\t\tcase pktUnloadChunk:            return 0x1d;\n\t\tcase pktUpdateBlockEntity:      return 0x09;\n\t\tcase pktUpdateHealth:           return 0x3e;\n\t\tcase pktUpdateScore:            return 0x42;\n\t\tcase pktUpdateSign:             return 0x46;\n\t\tcase pktUseBed:                 return 0x2f;\n\t\tcase pktWeather:                return 0x1e;\n\t\tcase pktWindowClose:            return 0x12;\n\t\tcase pktWindowItems:            return 0x14;\n\t\tcase pktWindowOpen:             return 0x13;\n\t\tcase pktWindowProperty:         return 0x15;\n\n\t\t// Unsupported packets\n\t\tcase pktUnlockRecipe:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\tUNREACHABLE(\"Unsupported outgoing packet type\");\n}\n\n\n\n\n\nunsigned char cProtocol_1_9_0::GetProtocolEntityAnimation(const EntityAnimation a_Animation) const\n{\n\tif (a_Animation == EntityAnimation::PlayerOffHandSwings)\n\t{\n\t\treturn 3;\n\t}\n\n\treturn Super::GetProtocolEntityAnimation(a_Animation);\n}\n\n\n\n\n\nsigned char cProtocol_1_9_0::GetProtocolEntityStatus(const EntityAnimation a_Animation) const\n{\n\tswitch (a_Animation)\n\t{\n\t\tcase EntityAnimation::ArmorStandGetsHit: return 32;\n\t\tcase EntityAnimation::ArrowTipSparkles: return 0;\n\t\tcase EntityAnimation::PawnShieldBlocks: return 29;\n\t\tcase EntityAnimation::PawnShieldBreaks: return 30;\n\t\tcase EntityAnimation::PawnThornsPricks: return 33;\n\t\tdefault: return Super::GetProtocolEntityStatus(a_Animation);\n\t}\n}\n\n\n\n\n\nUInt32 cProtocol_1_9_0::GetProtocolMobType(const eMonsterType a_MobType) const\n{\n\tswitch (a_MobType)\n\t{\n\t\tcase mtShulker: return 69;\n\t\tdefault:        return Super::GetProtocolMobType(a_MobType);\n\t}\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_9_0::GetProtocolVersion() const\n{\n\treturn Version::v1_9_0;\n}\n\n\n\n\n\nbool cProtocol_1_9_0::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType)\n{\n\tswitch (m_State)\n\t{\n\t\tcase State::Status:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketStatusRequest(a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketStatusPing   (a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase State::Login:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandlePacketLoginStart             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketLoginEncryptionResponse(a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase State::Game:\n\t\t{\n\t\t\tswitch (a_PacketType)\n\t\t\t{\n\t\t\t\tcase 0x00: HandleConfirmTeleport              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x01: HandlePacketTabComplete            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x02: HandlePacketChatMessage            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x03: HandlePacketClientStatus           (a_ByteBuffer); return true;\n\t\t\t\tcase 0x04: HandlePacketClientSettings         (a_ByteBuffer); return true;\n\t\t\t\tcase 0x05: break;  // Confirm transaction - not used in MCS\n\t\t\t\tcase 0x06: HandlePacketEnchantItem            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x07: HandlePacketWindowClick            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x08: HandlePacketWindowClose            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x09: HandlePacketPluginMessage          (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0a: HandlePacketUseEntity              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0b: HandlePacketKeepAlive              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0c: HandlePacketPlayerPos              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0d: HandlePacketPlayerPosLook          (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0e: HandlePacketPlayerLook             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x0f: HandlePacketPlayer                 (a_ByteBuffer); return true;\n\t\t\t\tcase 0x10: HandlePacketVehicleMove            (a_ByteBuffer); return true;\n\t\t\t\tcase 0x11: HandlePacketBoatSteer              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x12: HandlePacketPlayerAbilities        (a_ByteBuffer); return true;\n\t\t\t\tcase 0x13: HandlePacketBlockDig               (a_ByteBuffer); return true;\n\t\t\t\tcase 0x14: HandlePacketEntityAction           (a_ByteBuffer); return true;\n\t\t\t\tcase 0x15: HandlePacketSteerVehicle           (a_ByteBuffer); return true;\n\t\t\t\tcase 0x16: HandlePacketResourcePackStatus     (a_ByteBuffer); return true;\n\t\t\t\tcase 0x17: HandlePacketSlotSelect             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x18: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true;\n\t\t\t\tcase 0x19: HandlePacketUpdateSign             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x1a: HandlePacketAnimation              (a_ByteBuffer); return true;\n\t\t\t\tcase 0x1b: HandlePacketSpectate               (a_ByteBuffer); return true;\n\t\t\t\tcase 0x1c: HandlePacketBlockPlace             (a_ByteBuffer); return true;\n\t\t\t\tcase 0x1d: HandlePacketUseItem                (a_ByteBuffer); return true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}  // switch (m_State)\n\n\t// Unknown packet type, report to the ClientHandle:\n\tm_Client->PacketUnknown(a_PacketType);\n\treturn false;\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketAnimation(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Hand);\n\n\tm_Client->HandleAnimation(Hand == MAIN_HAND);  // Packet exists solely for arm-swing notification (main and off-hand).\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketBlockDig(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Status);\n\n\tVector3i Position;\n\tif (!a_ByteBuffer.ReadXYZPosition64(Position))\n\t{\n\t\treturn;\n\t}\n\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Face);\n\tm_Client->HandleLeftClick(Position, FaceIntToBlockFace(Face), Status);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketBlockPlace(cByteBuffer & a_ByteBuffer)\n{\n\tVector3i Position;\n\tif (!a_ByteBuffer.ReadXYZPosition64(Position))\n\t{\n\t\treturn;\n\t}\n\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Face);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Hand);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, CursorX);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, CursorY);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, CursorZ);\n\n\tm_Client->HandleRightClick(Position, FaceIntToBlockFace(Face), {CursorX, CursorY, CursorZ}, Hand == MAIN_HAND);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketBoatSteer(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, RightPaddle);\n\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, LeftPaddle);\n\n\t// Get the players vehicle\n\tcPlayer * Player = m_Client->GetPlayer();\n\tcEntity * Vehicle = Player->GetAttached();\n\n\tif (Vehicle)\n\t{\n\t\tif (Vehicle->GetEntityType() == cEntity::etBoat)\n\t\t{\n\t\t\tauto * Boat = static_cast<cBoat *>(Vehicle);\n\t\t\tBoat->UpdatePaddles(RightPaddle, LeftPaddle);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketClientSettings(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Locale);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,       UInt8,   ViewDistance);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,       UInt8,   ChatFlags);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,          bool,    ChatColors);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,       UInt8,   SkinParts);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt,        UInt32,  MainHand);\n\n\tm_Client->SetLocale(Locale);\n\tm_Client->SetViewDistance(ViewDistance);\n\tm_Client->GetPlayer()->SetSkinParts(SkinParts);\n\tm_Client->GetPlayer()->SetLeftHanded(MainHand == LEFT_HAND);\n\t// TODO: Handle chat flags and chat colors\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandleConfirmTeleport(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt32, UInt32, TeleportID);\n\n\t// Can we stop throwing away incoming player position packets?\n\tif (TeleportID == m_OutstandingTeleportId)\n\t{\n\t\tm_IsTeleportIdConfirmed = true;\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketEntityAction(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt,  UInt32, PlayerID);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8,  Action);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt,  UInt32, JumpBoost);\n\n\tif (PlayerID != m_Client->GetPlayer()->GetUniqueID())\n\t{\n\t\tLOGD(\"Player \\\"%s\\\" attempted to action another entity - hacked client?\", m_Client->GetUsername().c_str());\n\t\treturn;\n\t}\n\n\tswitch (Action)\n\t{\n\t\tcase 0: return m_Client->HandleCrouch(true);\n\t\tcase 1: return m_Client->HandleCrouch(false);\n\t\tcase 2: return m_Client->HandleLeaveBed();\n\t\tcase 3: return m_Client->HandleSprint(true);\n\t\tcase 4: return m_Client->HandleSprint(false);\n\t\tcase 7: return m_Client->HandleOpenHorseInventory();\n\t\tcase 8: return m_Client->HandleStartElytraFlight();\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketPlayerPos(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosX);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosY);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosZ);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,     bool,   IsOnGround);\n\n\tif (m_IsTeleportIdConfirmed)\n\t{\n\t\tm_Client->HandlePlayerMove({PosX, PosY, PosZ}, IsOnGround);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketPlayerPosLook(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosX);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosY);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosZ);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat,  float,  Yaw);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat,  float,  Pitch);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,     bool,   IsOnGround);\n\n\tif (m_IsTeleportIdConfirmed)\n\t{\n\t\tm_Client->HandlePlayerMoveLook({PosX, PosY, PosZ}, Yaw, Pitch, IsOnGround);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketSteerVehicle(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Sideways);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Forward);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Flags);\n\n\tif ((Flags & 0x2) != 0)\n\t{\n\t\tm_Client->HandleUnmount();\n\t}\n\telse if ((Flags & 0x1) != 0)\n\t{\n\t\t// TODO: Handle vehicle jump (for animals)\n\t}\n\telse\n\t{\n\t\tm_Client->HandleSteerVehicle(Forward, Sideways);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketTabComplete(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Text);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,          bool,    AssumeCommand);\n\tHANDLE_READ(a_ByteBuffer, ReadBool,          bool,    HasPosition);\n\n\tif (HasPosition)\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt64, Int64, Position);\n\t}\n\n\tm_Client->HandleTabCompletion(Text);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketUpdateSign(cByteBuffer & a_ByteBuffer)\n{\n\tVector3i Position;\n\tif (!a_ByteBuffer.ReadXYZPosition64(Position))\n\t{\n\t\treturn;\n\t}\n\n\tAString Lines[4];\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Line);\n\t\tLines[i] = Line;\n\t}\n\n\tm_Client->HandleUpdateSign(Position, Lines[0], Lines[1], Lines[2], Lines[3]);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketUseEntity(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, UInt32, EntityID);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, UInt32, Type);\n\n\tswitch (Type)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\tHANDLE_READ(a_ByteBuffer, ReadVarInt, UInt32, Hand);\n\n\t\t\tif (Hand == MAIN_HAND)  // TODO: implement handling of off-hand actions; ignore them for now to avoid processing actions twice\n\t\t\t{\n\t\t\t\tm_Client->HandleUseEntity(EntityID, false);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1:\n\t\t{\n\t\t\tm_Client->HandleUseEntity(EntityID, true);\n\t\t\tbreak;\n\t\t}\n\t\tcase 2:\n\t\t{\n\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, TargetX);\n\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, TargetY);\n\t\t\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, TargetZ);\n\t\t\tHANDLE_READ(a_ByteBuffer, ReadVarInt, UInt32, Hand);\n\n\t\t\t// TODO: Do anything\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unhandled use entity type!\");\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketUseItem(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt, Int32, Hand);\n\n\tm_Client->HandleUseItem(Hand == MAIN_HAND);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketVehicleMove(cByteBuffer & a_ByteBuffer)\n{\n\t// This handles updating the vehicles location server side\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, xPos);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, yPos);\n\tHANDLE_READ(a_ByteBuffer, ReadBEDouble, double, zPos);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat,  float,  yaw);\n\tHANDLE_READ(a_ByteBuffer, ReadBEFloat,  float,  pitch);\n\n\t// Get the players vehicle\n\tcEntity * Vehicle = m_Client->GetPlayer()->GetAttached();\n\n\tif (Vehicle)\n\t{\n\t\tVehicle->SetPosX(xPos);\n\t\tVehicle->SetPosY(yPos);\n\t\tVehicle->SetPosZ(zPos);\n\t\tVehicle->SetYaw(yaw);\n\t\tVehicle->SetPitch(pitch);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandlePacketWindowClick(cByteBuffer & a_ByteBuffer)\n{\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,  UInt8,  WindowID);\n\tHANDLE_READ(a_ByteBuffer, ReadBEInt16,  Int16,  SlotNum);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8,  UInt8,  Button);\n\tHANDLE_READ(a_ByteBuffer, ReadBEUInt16, UInt16, TransactionID);\n\tHANDLE_READ(a_ByteBuffer, ReadVarInt32,  UInt32,  Mode);\n\tcItem Item;\n\tReadItem(a_ByteBuffer, Item);\n\n\t/** The slot number that the client uses to indicate \"outside the window\". */\n\tstatic const Int16 SLOT_NUM_OUTSIDE = -999;\n\n\t// Convert Button, Mode, SlotNum and HeldItem into eClickAction:\n\teClickAction Action;\n\tswitch ((Mode << 8) | Button)\n\t{\n\t\tcase 0x0000: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caLeftClick  : caLeftClickOutside;  break;\n\t\tcase 0x0001: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caRightClick : caRightClickOutside; break;\n\t\tcase 0x0100: Action = caShiftLeftClick;  break;\n\t\tcase 0x0101: Action = caShiftRightClick; break;\n\t\tcase 0x0200: Action = caNumber1;         break;\n\t\tcase 0x0201: Action = caNumber2;         break;\n\t\tcase 0x0202: Action = caNumber3;         break;\n\t\tcase 0x0203: Action = caNumber4;         break;\n\t\tcase 0x0204: Action = caNumber5;         break;\n\t\tcase 0x0205: Action = caNumber6;         break;\n\t\tcase 0x0206: Action = caNumber7;         break;\n\t\tcase 0x0207: Action = caNumber8;         break;\n\t\tcase 0x0208: Action = caNumber9;         break;\n\t\tcase 0x0302: Action = caMiddleClick;     break;\n\t\tcase 0x0400: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caLeftClickOutsideHoldNothing  : caDropKey;     break;\n\t\tcase 0x0401: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caRightClickOutsideHoldNothing : caCtrlDropKey; break;\n\t\tcase 0x0500: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caLeftPaintBegin               : caUnknown;     break;\n\t\tcase 0x0501: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caLeftPaintProgress            : caUnknown;     break;\n\t\tcase 0x0502: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caLeftPaintEnd                 : caUnknown;     break;\n\t\tcase 0x0504: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caRightPaintBegin              : caUnknown;     break;\n\t\tcase 0x0505: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caRightPaintProgress           : caUnknown;     break;\n\t\tcase 0x0506: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caRightPaintEnd                : caUnknown;     break;\n\t\tcase 0x0508: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caMiddlePaintBegin             : caUnknown;     break;\n\t\tcase 0x0509: Action = (SlotNum != SLOT_NUM_OUTSIDE) ? caMiddlePaintProgress          : caUnknown;     break;\n\t\tcase 0x050a: Action = (SlotNum == SLOT_NUM_OUTSIDE) ? caMiddlePaintEnd               : caUnknown;     break;\n\t\tcase 0x0600: Action = caDblClick; break;\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"Unhandled window click mode / button combination: %d (0x%x)\", (Mode << 8) | Button, (Mode << 8) | Button);\n\t\t\tAction = caUnknown;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tm_Client->HandleWindowClick(WindowID, SlotNum, Action, Item);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::HandleVanillaPluginMessage(cByteBuffer & a_ByteBuffer, std::string_view a_Channel)\n{\n\tif (a_Channel == \"AutoCmd\")\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockX);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockY);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockZ);\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Command);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, TrackOutput);\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Mode);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, Conditional);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, Automatic);\n\n\t\tm_Client->HandleCommandBlockBlockChange({BlockX, BlockY, BlockZ}, Command);\n\t}\n\telse if (a_Channel == \"PickItem\")\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarInt32, UInt32, InventorySlotIndex);\n\t}\n\telse if (a_Channel == \"Struct\")\n\t{\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockX);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockY);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockZ);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Action);\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Mode);\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Name);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, OffsetX);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, OffsetY);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, OffsetZ);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEUInt32, UInt32, SizeX);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEUInt32, UInt32, SizeY);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEUInt32, UInt32, SizeZ);\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Mirror);\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Rotation);\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Metadata);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, IgnoreEntities);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, ShowAir);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBool, bool, ShowBoundingBox);\n\t\tHANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Integrity);\n\t\tHANDLE_READ(a_ByteBuffer, ReadVarInt64, UInt64, Seed);\n\t}\n\telse\n\t{\n\t\tSuper::HandleVanillaPluginMessage(a_ByteBuffer, a_Channel);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::ParseItemMetadata(cItem & a_Item, const ContiguousByteBufferView a_Metadata) const\n{\n\t// Parse into NBT:\n\tcParsedNBT NBT(a_Metadata);\n\tif (!NBT.IsValid())\n\t{\n\t\tAString HexDump;\n\t\tCreateHexDump(HexDump, a_Metadata.data(), std::max<size_t>(a_Metadata.size(), 1024), 16);\n\t\tLOGWARNING(\"Cannot parse NBT item metadata: %s at (%zu / %zu bytes)\\n%s\",\n\t\t\tNBT.GetErrorCode().message().c_str(), NBT.GetErrorPos(), a_Metadata.size(), HexDump.c_str()\n\t\t);\n\t\treturn;\n\t}\n\n\t// Load enchantments and custom display names from the NBT data:\n\tfor (int tag = NBT.GetFirstChild(NBT.GetRoot()); tag >= 0; tag = NBT.GetNextSibling(tag))\n\t{\n\t\tAString TagName = NBT.GetName(tag);\n\t\tswitch (NBT.GetType(tag))\n\t\t{\n\t\t\tcase TAG_List:\n\t\t\t{\n\t\t\t\tif ((TagName == \"ench\") || (TagName == \"StoredEnchantments\"))  // Enchantments tags\n\t\t\t\t{\n\t\t\t\t\tEnchantmentSerializer::ParseFromNBT(a_Item.m_Enchantments, NBT, tag);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAG_Compound:\n\t\t\t{\n\t\t\t\tif (TagName == \"display\")  // Custom name and lore tag\n\t\t\t\t{\n\t\t\t\t\tfor (int displaytag = NBT.GetFirstChild(tag); displaytag >= 0; displaytag = NBT.GetNextSibling(displaytag))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((NBT.GetType(displaytag) == TAG_String) && (NBT.GetName(displaytag) == \"Name\"))  // Custon name tag\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_Item.m_CustomName = NBT.GetString(displaytag);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((NBT.GetType(displaytag) == TAG_List) && (NBT.GetName(displaytag) == \"Lore\"))  // Lore tag\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_Item.m_LoreTable.clear();\n\t\t\t\t\t\t\tfor (int loretag = NBT.GetFirstChild(displaytag); loretag >= 0; loretag = NBT.GetNextSibling(loretag))  // Loop through array of strings\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ta_Item.m_LoreTable.push_back(NBT.GetString(loretag));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((NBT.GetType(displaytag) == TAG_Int) && (NBT.GetName(displaytag) == \"color\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_Item.m_ItemColor.m_Color = static_cast<unsigned int>(NBT.GetInt(displaytag));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ((TagName == \"Fireworks\") || (TagName == \"Explosion\"))\n\t\t\t\t{\n\t\t\t\t\tcFireworkItem::ParseFromNBT(a_Item.m_FireworkItem, NBT, tag, static_cast<ENUM_ITEM_TYPE>(a_Item.m_ItemType));\n\t\t\t\t}\n\t\t\t\telse if (TagName == \"EntityTag\")\n\t\t\t\t{\n\t\t\t\t\tfor (int entitytag = NBT.GetFirstChild(tag); entitytag >= 0; entitytag = NBT.GetNextSibling(entitytag))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((NBT.GetType(entitytag) == TAG_String) && (NBT.GetName(entitytag) == \"id\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tAString NBTName = NBT.GetString(entitytag);\n\t\t\t\t\t\t\tReplaceString(NBTName, \"minecraft:\", \"\");\n\t\t\t\t\t\t\teMonsterType MonsterType = cMonster::StringToMobType(NBTName);\n\t\t\t\t\t\t\ta_Item.m_ItemDamage = static_cast<short>(GetProtocolMobType(MonsterType));\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAG_Int:\n\t\t\t{\n\t\t\t\tif (TagName == \"RepairCost\")\n\t\t\t\t{\n\t\t\t\t\ta_Item.m_RepairCost = NBT.GetInt(tag);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAG_String:\n\t\t\t{\n\t\t\t\tif (TagName == \"Potion\")\n\t\t\t\t{\n\t\t\t\t\tAString PotionEffect = NBT.GetString(tag);\n\t\t\t\t\tif (PotionEffect.find(\"minecraft:\") == AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\tLOGD(\"Unknown or missing domain on potion effect name %s!\", PotionEffect.c_str());\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (PotionEffect.find(\"empty\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"mundane\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 64;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"thick\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 32;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"awkward\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 16;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"regeneration\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"swiftness\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"fire_resistance\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"poison\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"healing\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 5;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"night_vision\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"weakness\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"strength\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 9;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"slowness\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"leaping\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"harming\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 12;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"water_breathing\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 13;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"invisibility\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if (PotionEffect.find(\"water\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage = 0;\n\t\t\t\t\t\t// Water bottles shouldn't have other bits set on them; exit early.\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Note: luck potions are not handled and will reach this location\n\t\t\t\t\t\tLOGD(\"Unknown potion type for effect name %s!\", PotionEffect.c_str());\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (PotionEffect.find(\"strong\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage |= 0x20;\n\t\t\t\t\t}\n\t\t\t\t\tif (PotionEffect.find(\"long\") != AString::npos)\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage |= 0x40;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ugly special case with the changed splash potion ID in 1.9\n\t\t\t\t\tif ((a_Item.m_ItemType == 438) || (a_Item.m_ItemType == 441))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Splash or lingering potions - change the ID to the normal one and mark as splash potions\n\t\t\t\t\t\ta_Item.m_ItemType = E_ITEM_POTION;\n\t\t\t\t\t\ta_Item.m_ItemDamage |= 0x4000;  // Is splash potion\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ta_Item.m_ItemDamage |= 0x2000;  // Is drinkable\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: LOGD(\"Unimplemented NBT data when parsing!\"); break;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::SendEntitySpawn(const cEntity & a_Entity, const UInt8 a_ObjectType, const Int32 a_ObjectData)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\tcPacketizer Pkt(*this, pktSpawnObject);\n\tPkt.WriteVarInt32(a_Entity.GetUniqueID());\n\n\t// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.\n\tPkt.WriteBEUInt64(0);\n\tPkt.WriteBEUInt64(a_Entity.GetUniqueID());\n\n\tPkt.WriteBEUInt8(a_ObjectType);\n\tPkt.WriteBEDouble(a_Entity.GetPosX());\n\tPkt.WriteBEDouble(a_Entity.GetPosY());\n\tPkt.WriteBEDouble(a_Entity.GetPosZ());\n\tPkt.WriteByteAngle(a_Entity.GetPitch());\n\tPkt.WriteByteAngle(a_Entity.GetYaw());\n\tPkt.WriteBEInt32(a_ObjectData);\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedX() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedY() * 400));\n\tPkt.WriteBEInt16(static_cast<Int16>(a_Entity.GetSpeedZ() * 400));\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::WriteBlockEntity(cFastNBTWriter & a_Writer, const cBlockEntity & a_BlockEntity) const\n{\n\tif (a_BlockEntity.GetBlockType() == E_BLOCK_MOB_SPAWNER)\n\t{\n\t\tauto & MobSpawnerEntity = static_cast<const cMobSpawnerEntity &>(a_BlockEntity);\n\t\ta_Writer.AddInt(\"x\", a_BlockEntity.GetPosX());\n\t\ta_Writer.AddInt(\"y\", a_BlockEntity.GetPosY());\n\t\ta_Writer.AddInt(\"z\", a_BlockEntity.GetPosZ());\n\t\ta_Writer.BeginCompound(\"SpawnData\");  // New: SpawnData compound\n\t\t\ta_Writer.AddString(\"id\", cMonster::MobTypeToVanillaName(MobSpawnerEntity.GetEntity()));\n\t\ta_Writer.EndCompound();\n\t\ta_Writer.AddShort(\"Delay\", MobSpawnerEntity.GetSpawnDelay());\n\t}\n\telse\n\t{\n\t\tSuper::WriteBlockEntity(a_Writer, a_BlockEntity);\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const\n{\n\t// Common metadata:\n\tInt8 Flags = 0;\n\tif (a_Entity.IsOnFire())\n\t{\n\t\tFlags |= 0x01;\n\t}\n\tif (a_Entity.IsCrouched())\n\t{\n\t\tFlags |= 0x02;\n\t}\n\tif (a_Entity.IsSprinting())\n\t{\n\t\tFlags |= 0x08;\n\t}\n\tif (a_Entity.IsRclking())\n\t{\n\t\tFlags |= 0x10;\n\t}\n\tif (a_Entity.IsInvisible())\n\t{\n\t\tFlags |= 0x20;\n\t}\n\tif (a_Entity.IsElytraFlying())\n\t{\n\t\tFlags |= 0x80;\n\t}\n\ta_Pkt.WriteBEUInt8(0);  // Index 0\n\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);  // Type\n\ta_Pkt.WriteBEInt8(Flags);\n\n\tswitch (a_Entity.GetEntityType())\n\t{\n\t\tcase cEntity::etPlayer:\n\t\t{\n\t\t\tauto & Player = static_cast<const cPlayer &>(a_Entity);\n\n\t\t\t// TODO Set player custom name to their name.\n\t\t\t// Then it's possible to move the custom name of mobs to the entities\n\t\t\t// and to remove the \"special\" player custom name.\n\t\t\ta_Pkt.WriteBEUInt8(2);  // Index 2: Custom name\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_STRING);\n\t\t\ta_Pkt.WriteString(Player.GetName());\n\n\t\t\ta_Pkt.WriteBEUInt8(6);  // Index 6: Health\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Player.GetHealth()));\n\n\t\t\ta_Pkt.WriteBEUInt8(12);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(static_cast<UInt8>(Player.GetSkinParts()));\n\n\t\t\ta_Pkt.WriteBEUInt8(13);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEUInt8(Player.IsLeftHanded() ? 0 : 1);\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etPickup:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(5);  // Index 5: Item\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\tWriteItem(a_Pkt, static_cast<const cPickup &>(a_Entity).GetItem());\n\t\t\tbreak;\n\t\t}\n\t\tcase cEntity::etMinecart:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(5);  // Index 5: Shaking power\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\n\t\t\t// The following expression makes Minecarts shake more with less health or higher damage taken\n\t\t\tauto & Minecart = static_cast<const cMinecart &>(a_Entity);\n\t\t\tauto maxHealth = a_Entity.GetMaxHealth();\n\t\t\tauto curHealth = a_Entity.GetHealth();\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>((maxHealth - curHealth) * Minecart.LastDamage() * 4));\n\n\t\t\ta_Pkt.WriteBEUInt8(6);  // Index 6: Shaking direction (doesn't seem to effect anything)\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(1);\n\n\t\t\ta_Pkt.WriteBEUInt8(7);  // Index 7: Shake multiplier / damage taken\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(Minecart.LastDamage() + 10));\n\n\t\t\tif (Minecart.GetPayload() == cMinecart::mpNone)\n\t\t\t{\n\t\t\t\tauto & RideableMinecart = static_cast<const cRideableMinecart &>(Minecart);\n\t\t\t\tconst cItem & MinecartContent = RideableMinecart.GetContent();\n\t\t\t\tif (!MinecartContent.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(8);  // Index 8: Block ID and damage\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t\t\tint Content = MinecartContent.m_ItemType;\n\t\t\t\t\tContent |= MinecartContent.m_ItemDamage << 8;\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Content));\n\n\t\t\t\t\ta_Pkt.WriteBEUInt8(9);  // Index 9: Block ID and damage\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(RideableMinecart.GetBlockHeight()));\n\n\t\t\t\t\ta_Pkt.WriteBEUInt8(10);  // Index 10: Show block\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\t\t\ta_Pkt.WriteBool(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Minecart.GetPayload() == cMinecart::mpFurnace)\n\t\t\t{\n\t\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is powered\n\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\t\ta_Pkt.WriteBool(static_cast<const cMinecartWithFurnace &>(Minecart).IsFueled());\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etMinecart\n\n\t\tcase cEntity::etProjectile:\n\t\t{\n\t\t\tauto & Projectile = static_cast<const cProjectileEntity &>(a_Entity);\n\t\t\tswitch (Projectile.GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase cProjectileEntity::pkArrow:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(5);  // Index 5: Is critical\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\t\t\ta_Pkt.WriteBEInt8(static_cast<const cArrowEntity &>(Projectile).IsCritical() ? 1 : 0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkFirework:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(5);  // Index 5: Firework item used for this firework\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cFireworkEntity &>(Projectile).GetItem());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkSplashPotion:\n\t\t\t\t{\n\t\t\t\t\ta_Pkt.WriteBEUInt8(5);  // Index 5: Potion item which was thrown\n\t\t\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\t\t\tWriteItem(a_Pkt, static_cast<const cSplashPotionEntity &>(Projectile).GetItem());\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}  // case etProjectile\n\n\t\tcase cEntity::etMonster:\n\t\t{\n\t\t\tWriteMobMetadata(a_Pkt, static_cast<const cMonster &>(a_Entity));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase cEntity::etBoat:\n\t\t{\n\t\t\tauto & Boat = static_cast<const cBoat &>(a_Entity);\n\n\t\t\ta_Pkt.WriteBEInt8(5);  // Index 6: Time since last hit\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetLastDamage()));\n\n\t\t\ta_Pkt.WriteBEInt8(6);  // Index 7: Forward direction\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetForwardDirection()));\n\n\t\t\ta_Pkt.WriteBEInt8(7);  // Index 8: Damage taken\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(Boat.GetDamageTaken());\n\n\t\t\ta_Pkt.WriteBEInt8(8);  // Index 9: Type\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Boat.GetMaterial()));\n\n\t\t\ta_Pkt.WriteBEInt8(9);  // Index 10: Right paddle turning\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Boat.IsRightPaddleUsed());\n\n\t\t\ta_Pkt.WriteBEInt8(10);  // Index 11: Left paddle turning\n\t\t\ta_Pkt.WriteBEInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Boat.IsLeftPaddleUsed());\n\n\t\t\tbreak;\n\t\t}  // case etBoat\n\n\t\tcase cEntity::etItemFrame:\n\t\t{\n\t\t\tauto & Frame = static_cast<const cItemFrame &>(a_Entity);\n\t\t\ta_Pkt.WriteBEUInt8(5);  // Index 5: Item\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_ITEM);\n\t\t\tWriteItem(a_Pkt, Frame.GetItem());\n\t\t\ta_Pkt.WriteBEUInt8(6);  // Index 6: Rotation\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Frame.GetItemRotation());\n\t\t\tbreak;\n\t\t}  // case etItemFrame\n\n\t\tcase cEntity::etEnderCrystal:\n\t\t{\n\t\t\tconst auto & EnderCrystal = static_cast<const cEnderCrystal &>(a_Entity);\n\t\t\ta_Pkt.WriteBEUInt8(5);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_OPTIONAL_POSITION);\n\t\t\ta_Pkt.WriteBool(EnderCrystal.DisplaysBeam());\n\t\t\tif (EnderCrystal.DisplaysBeam())\n\t\t\t{\n\t\t\t\ta_Pkt.WriteXYZPosition64(EnderCrystal.GetBeamTarget());\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(6);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(EnderCrystal.ShowsBottom());\n\t\t\tbreak;\n\t\t}  // case etEnderCrystal\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) const\n{\n\tshort ItemType = a_Item.m_ItemType;\n\tASSERT(ItemType >= -1);  // Check validity of packets in debug runtime\n\tif (ItemType <= 0)\n\t{\n\t\t// Fix, to make sure no invalid values are sent.\n\t\tItemType = -1;\n\t}\n\n\tif (a_Item.IsEmpty())\n\t{\n\t\ta_Pkt.WriteBEInt16(-1);\n\t\treturn;\n\t}\n\n\tif ((ItemType == E_ITEM_POTION) && ((a_Item.m_ItemDamage & 0x4000) != 0))\n\t{\n\t\t// Ugly special case for splash potion ids which changed in 1.9; this can be removed when the new 1.9 ids are implemented\n\t\ta_Pkt.WriteBEInt16(438);  // minecraft:splash_potion\n\t}\n\telse\n\t{\n\t\t// Normal item\n\t\ta_Pkt.WriteBEInt16(ItemType);\n\t}\n\ta_Pkt.WriteBEInt8(a_Item.m_ItemCount);\n\tif ((ItemType == E_ITEM_POTION) || (ItemType == E_ITEM_SPAWN_EGG))\n\t{\n\t\t// These items lost their metadata; if it is sent they don't render correctly.\n\t\ta_Pkt.WriteBEInt16(0);\n\t}\n\telse\n\t{\n\t\ta_Pkt.WriteBEInt16(a_Item.m_ItemDamage);\n\t}\n\n\tif (a_Item.m_Enchantments.IsEmpty() && a_Item.IsBothNameAndLoreEmpty() && (ItemType != E_ITEM_FIREWORK_ROCKET) && (ItemType != E_ITEM_FIREWORK_STAR) && !a_Item.m_ItemColor.IsValid() && (ItemType != E_ITEM_POTION) && (ItemType != E_ITEM_SPAWN_EGG))\n\t{\n\t\ta_Pkt.WriteBEInt8(0);\n\t\treturn;\n\t}\n\n\n\t// Send the enchantments and custom names:\n\tcFastNBTWriter Writer;\n\tif (a_Item.m_RepairCost != 0)\n\t{\n\t\tWriter.AddInt(\"RepairCost\", a_Item.m_RepairCost);\n\t}\n\tif (!a_Item.m_Enchantments.IsEmpty())\n\t{\n\t\tconst char * TagName = (a_Item.m_ItemType == E_ITEM_BOOK) ? \"StoredEnchantments\" : \"ench\";\n\t\tEnchantmentSerializer::WriteToNBTCompound(a_Item.m_Enchantments, Writer, TagName);\n\t}\n\tif (!a_Item.IsBothNameAndLoreEmpty() || a_Item.m_ItemColor.IsValid())\n\t{\n\t\tWriter.BeginCompound(\"display\");\n\t\tif (a_Item.m_ItemColor.IsValid())\n\t\t{\n\t\t\tWriter.AddInt(\"color\", static_cast<Int32>(a_Item.m_ItemColor.m_Color));\n\t\t}\n\n\t\tif (!a_Item.IsCustomNameEmpty())\n\t\t{\n\t\t\tWriter.AddString(\"Name\", a_Item.m_CustomName);\n\t\t}\n\t\tif (!a_Item.IsLoreEmpty())\n\t\t{\n\t\t\tWriter.BeginList(\"Lore\", TAG_String);\n\n\t\t\tfor (const auto & Line : a_Item.m_LoreTable)\n\t\t\t{\n\t\t\t\tWriter.AddString(\"\", Line);\n\t\t\t}\n\n\t\t\tWriter.EndList();\n\t\t}\n\t\tWriter.EndCompound();\n\t}\n\tif ((a_Item.m_ItemType == E_ITEM_FIREWORK_ROCKET) || (a_Item.m_ItemType == E_ITEM_FIREWORK_STAR))\n\t{\n\t\tcFireworkItem::WriteToNBTCompound(a_Item.m_FireworkItem, Writer, static_cast<ENUM_ITEM_TYPE>(a_Item.m_ItemType));\n\t}\n\tif (a_Item.m_ItemType == E_ITEM_POTION)\n\t{\n\t\t// 1.9 potions use a different format.  In the future (when only 1.9+ is supported) this should be its own class\n\t\tAString PotionID = \"empty\";  // Fallback of \"Uncraftable potion\" for unhandled cases\n\n\t\tcEntityEffect::eType Type = cEntityEffect::GetPotionEffectType(a_Item.m_ItemDamage);\n\t\tif (Type != cEntityEffect::effNoEffect)\n\t\t{\n\t\t\tswitch (Type)\n\t\t\t{\n\t\t\t\tcase cEntityEffect::effRegeneration: PotionID = \"regeneration\"; break;\n\t\t\t\tcase cEntityEffect::effSpeed: PotionID = \"swiftness\"; break;\n\t\t\t\tcase cEntityEffect::effFireResistance: PotionID = \"fire_resistance\"; break;\n\t\t\t\tcase cEntityEffect::effPoison: PotionID = \"poison\"; break;\n\t\t\t\tcase cEntityEffect::effInstantHealth: PotionID = \"healing\"; break;\n\t\t\t\tcase cEntityEffect::effNightVision: PotionID = \"night_vision\"; break;\n\t\t\t\tcase cEntityEffect::effWeakness: PotionID = \"weakness\"; break;\n\t\t\t\tcase cEntityEffect::effStrength: PotionID = \"strength\"; break;\n\t\t\t\tcase cEntityEffect::effSlowness: PotionID = \"slowness\"; break;\n\t\t\t\tcase cEntityEffect::effJumpBoost: PotionID = \"leaping\"; break;\n\t\t\t\tcase cEntityEffect::effInstantDamage: PotionID = \"harming\"; break;\n\t\t\t\tcase cEntityEffect::effWaterBreathing: PotionID = \"water_breathing\"; break;\n\t\t\t\tcase cEntityEffect::effInvisibility: PotionID = \"invisibility\"; break;\n\t\t\t\tdefault: ASSERT(!\"Unknown potion effect\"); break;\n\t\t\t}\n\t\t\tif (cEntityEffect::GetPotionEffectIntensity(a_Item.m_ItemDamage) == 1)\n\t\t\t{\n\t\t\t\tPotionID = \"strong_\" + PotionID;\n\t\t\t}\n\t\t\telse if (a_Item.m_ItemDamage & 0x40)\n\t\t\t{\n\t\t\t\t// Extended potion bit\n\t\t\t\tPotionID = \"long_\" + PotionID;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Empty potions: Water bottles and other base ones\n\t\t\tif (a_Item.m_ItemDamage == 0)\n\t\t\t{\n\t\t\t\t// No other bits set; thus it's a water bottle\n\t\t\t\tPotionID = \"water\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tswitch (a_Item.m_ItemDamage & 0x3f)\n\t\t\t\t{\n\t\t\t\t\tcase 0x00: PotionID = \"mundane\"; break;\n\t\t\t\t\tcase 0x10: PotionID = \"awkward\"; break;\n\t\t\t\t\tcase 0x20: PotionID = \"thick\"; break;\n\t\t\t\t}\n\t\t\t\t// Default cases will use \"empty\" from before.\n\t\t\t}\n\t\t}\n\n\t\tPotionID = \"minecraft:\" + PotionID;\n\n\t\tWriter.AddString(\"Potion\", PotionID);\n\t}\n\tif (a_Item.m_ItemType == E_ITEM_SPAWN_EGG)\n\t{\n\t\t// Convert entity ID to the name.\n\t\teMonsterType MonsterType = cItemSpawnEggHandler::ItemDamageToMonsterType(a_Item.m_ItemDamage);\n\t\tif (MonsterType != eMonsterType::mtInvalidType)\n\t\t{\n\t\t\tWriter.BeginCompound(\"EntityTag\");\n\t\t\tWriter.AddString(\"id\", \"minecraft:\" + cMonster::MobTypeToVanillaNBT(MonsterType));\n\t\t\tWriter.EndCompound();\n\t\t}\n\t}\n\n\tWriter.Finish();\n\n\tconst auto Result = Writer.GetResult();\n\tif (Result.empty())\n\t{\n\t\ta_Pkt.WriteBEInt8(0);\n\t\treturn;\n\t}\n\ta_Pkt.WriteBuf(Result);\n}\n\n\n\n\n\nvoid cProtocol_1_9_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const\n{\n\t// Living entity metadata\n\tif (a_Mob.HasCustomName())\n\t{\n\t\t// TODO: As of 1.9 _all_ entities can have custom names; should this be moved up?\n\t\ta_Pkt.WriteBEUInt8(2);  // Index 2: Custom name\n\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_STRING);\n\t\ta_Pkt.WriteString(a_Mob.GetCustomName());\n\n\t\ta_Pkt.WriteBEUInt8(3);  // Index 3: Custom name always visible\n\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\ta_Pkt.WriteBool(a_Mob.IsCustomNameAlwaysVisible());\n\t}\n\n\ta_Pkt.WriteBEUInt8(6);  // Index 6: Health\n\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\n\tswitch (a_Mob.GetMobType())\n\t{\n\t\tcase mtBat:\n\t\t{\n\t\t\tauto & Bat = static_cast<const cBat &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Bat flags - currently only hanging\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(Bat.IsHanging() ? 1 : 0);\n\t\t\tbreak;\n\t\t}  // case mtBat\n\n\t\tcase mtChicken:\n\t\t{\n\t\t\tauto & Chicken = static_cast<const cChicken &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Chicken.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtChicken\n\n\t\tcase mtCow:\n\t\t{\n\t\t\tauto & Cow = static_cast<const cCow &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Cow.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtCow\n\n\t\tcase mtCreeper:\n\t\t{\n\t\t\tauto & Creeper = static_cast<const cCreeper &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: State (idle or \"blowing\")\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Creeper.IsBlowing() ? 1 : 0xffffffff);\n\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: Is charged\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Creeper.IsCharged());\n\n\t\t\ta_Pkt.WriteBEUInt8(13);  // Index 13: Is ignited\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Creeper.IsBurnedWithFlintAndSteel());\n\t\t\tbreak;\n\t\t}  // case mtCreeper\n\n\t\tcase mtEnderman:\n\t\t{\n\t\t\tauto & Enderman = static_cast<const cEnderman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Carried block\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BLOCKID);\n\t\t\tUInt32 Carried = 0;\n\t\t\tCarried |= static_cast<UInt32>(Enderman.GetCarriedBlock() << 4);\n\t\t\tCarried |= Enderman.GetCarriedMeta();\n\t\t\ta_Pkt.WriteVarInt32(Carried);\n\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: Is screaming\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Enderman.IsScreaming());\n\t\t\tbreak;\n\t\t}  // case mtEnderman\n\n\t\tcase mtGhast:\n\t\t{\n\t\t\tauto & Ghast = static_cast<const cGhast &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Is attacking\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Ghast.IsCharging());\n\t\t\tbreak;\n\t\t}  // case mtGhast\n\n\t\tcase mtHorse:\n\t\t{\n\t\t\tauto & Horse = static_cast<const cHorse &>(a_Mob);\n\t\t\tInt8 Flags = 0;\n\t\t\tif (Horse.IsTame())\n\t\t\t{\n\t\t\t\tFlags |= 0x02;\n\t\t\t}\n\t\t\tif (Horse.IsSaddled())\n\t\t\t{\n\t\t\t\tFlags |= 0x04;\n\t\t\t}\n\t\t\tif (Horse.IsChested())\n\t\t\t{\n\t\t\t\tFlags |= 0x08;\n\t\t\t}\n\t\t\tif (Horse.IsEating())\n\t\t\t{\n\t\t\t\tFlags |= 0x20;\n\t\t\t}\n\t\t\tif (Horse.IsRearing())\n\t\t\t{\n\t\t\t\tFlags |= 0x40;\n\t\t\t}\n\t\t\tif (Horse.IsMthOpen())\n\t\t\t{\n\t\t\t\tFlags |= 0x80;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: flags\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(Flags);\n\n\t\t\ta_Pkt.WriteBEUInt8(13);  // Index 13: Variant / type\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseType()));\n\n\t\t\ta_Pkt.WriteBEUInt8(14);  // Index 14: Color / style\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\tint Appearance = 0;\n\t\t\tAppearance = Horse.GetHorseColor();\n\t\t\tAppearance |= Horse.GetHorseStyle() << 8;\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Appearance));\n\n\t\t\ta_Pkt.WriteBEUInt8(16);  // Index 16: Armor\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Horse.GetHorseArmour()));\n\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Horse.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtHorse\n\n\t\tcase mtMagmaCube:\n\t\t{\n\t\t\tauto & MagmaCube = static_cast<const cMagmaCube &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Size\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(MagmaCube.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtMagmaCube\n\n\t\tcase mtOcelot:\n\t\t{\n\t\t\tauto & Ocelot = static_cast<const cOcelot &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Ocelot.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtOcelot\n\n\t\tcase mtPig:\n\t\t{\n\t\t\tauto & Pig = static_cast<const cPig &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Pig.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: Is saddled\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Pig.IsSaddled());\n\n\t\t\tbreak;\n\t\t}  // case mtPig\n\n\t\tcase mtRabbit:\n\t\t{\n\t\t\tauto & Rabbit = static_cast<const cRabbit &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Rabbit.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: Type\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Rabbit.GetRabbitType()));\n\t\t\tbreak;\n\t\t}  // case mtRabbit\n\n\t\tcase mtSheep:\n\t\t{\n\t\t\tauto & Sheep = static_cast<const cSheep &>(a_Mob);\n\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Sheep.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: sheared, color\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\tInt8 SheepMetadata = 0;\n\t\t\tSheepMetadata = static_cast<Int8>(Sheep.GetFurColor());\n\t\t\tif (Sheep.IsSheared())\n\t\t\t{\n\t\t\t\tSheepMetadata |= 0x10;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEInt8(SheepMetadata);\n\t\t\tbreak;\n\t\t}  // case mtSheep\n\n\t\tcase mtSkeleton:\n\t\t{\n\t\t\tauto & Skeleton = static_cast<const cSkeleton &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(0);\n\n\t\t\t// Index 5 and 12 used for charging bow client animation.\n\t\t\ta_Pkt.WriteBEUInt8(5);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(0x02 | (Skeleton.IsChargingBow() ? 0x01 : 0x00));\n\n\t\t\ta_Pkt.WriteBEUInt8(12);\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBool(Skeleton.IsChargingBow());\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtSlime:\n\t\t{\n\t\t\tauto & Slime = static_cast<const cSlime &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Size\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Slime.GetSize()));\n\t\t\tbreak;\n\t\t}  // case mtSlime\n\n\t\tcase mtVillager:\n\t\t{\n\t\t\tauto & Villager = static_cast<const cVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Villager.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: Type\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Villager.GetVilType()));\n\t\t\tbreak;\n\t\t}  // case mtVillager\n\n\t\tcase mtWitch:\n\t\t{\n\t\t\tauto & Witch = static_cast<const cWitch &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is angry\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Witch.IsAngry());\n\t\t\tbreak;\n\t\t}  // case mtWitch\n\n\t\tcase mtWither:\n\t\t{\n\t\t\tauto & Wither = static_cast<const cWither &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(14);  // Index 14: Invulnerable ticks\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(Wither.GetWitherInvulnerableTicks());\n\n\t\t\t// TODO: Use boss bar packet for health\n\t\t\tbreak;\n\t\t}  // case mtWither\n\n\t\tcase mtWitherSkeleton:\n\t\t{\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Type\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(1);  // Is wither skeleton\n\t\t\tbreak;\n\t\t}  // case mtWitherSkeleton\n\n\t\tcase mtWolf:\n\t\t{\n\t\t\tauto & Wolf = static_cast<const cWolf &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBaby());\n\n\t\t\tInt8 WolfStatus = 0;\n\t\t\tif (Wolf.IsSitting())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x1;\n\t\t\t}\n\t\t\tif (Wolf.IsAngry())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x2;\n\t\t\t}\n\t\t\tif (Wolf.IsTame())\n\t\t\t{\n\t\t\t\tWolfStatus |= 0x4;\n\t\t\t}\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: status\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);\n\t\t\ta_Pkt.WriteBEInt8(WolfStatus);\n\n\t\t\ta_Pkt.WriteBEUInt8(14);  // Index 14: Health\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_FLOAT);\n\t\t\ta_Pkt.WriteBEFloat(static_cast<float>(a_Mob.GetHealth()));\n\n\t\t\ta_Pkt.WriteBEUInt8(15);  // Index 15: Is begging\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Wolf.IsBegging());\n\n\t\t\ta_Pkt.WriteBEUInt8(16);  // Index 16: Collar color\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(static_cast<UInt32>(Wolf.GetCollarColor()));\n\t\t\tbreak;\n\t\t}  // case mtWolf\n\n\t\tcase mtZombie:\n\t\t{\n\t\t\tauto & Zombie = static_cast<const cZombie &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(Zombie.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: Is a villager\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(0);\n\n\t\t\ta_Pkt.WriteBEUInt8(13);  // Index 13: Is converting\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(false);\n\t\t\tbreak;\n\t\t}  // case mtZombie\n\n\t\tcase mtZombiePigman:\n\t\t{\n\t\t\tauto & ZombiePigman = static_cast<const cZombiePigman &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombiePigman.IsBaby());\n\t\t\tbreak;\n\t\t}  // case mtZombiePigman\n\n\t\tcase mtZombieVillager:\n\t\t{\n\t\t\tauto & ZombieVillager = reinterpret_cast<const cZombieVillager &>(a_Mob);\n\t\t\ta_Pkt.WriteBEUInt8(11);  // Index 11: Is baby\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombieVillager.IsBaby());\n\n\t\t\ta_Pkt.WriteBEUInt8(12);  // Index 12: Is a villager\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);\n\t\t\ta_Pkt.WriteVarInt32(ZombieVillager.GetProfession());\n\n\t\t\ta_Pkt.WriteBEUInt8(13);  // Index 13: Is converting\n\t\t\ta_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);\n\t\t\ta_Pkt.WriteBool(ZombieVillager.ConversionTime() != -1);\n\t\t\tbreak;\n\t\t}  // case mtZombieVillager\n\n\t\tcase mtBlaze:\n\t\tcase mtElderGuardian:\n\t\tcase mtGuardian:\n\t\t{\n\t\t\t// TODO: Mobs with extra fields that aren't implemented\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCat:\n\n\t\tcase mtDonkey:\n\n\t\tcase mtMule:\n\n\t\tcase mtStray:\n\n\t\tcase mtSkeletonHorse:\n\t\tcase mtZombieHorse:\n\n\t\tcase mtShulker:\n\t\t{\n\t\t\t// Todo: Mobs not added yet. Grouped ones have the same metadata\n\t\t\tASSERT(!\"cProtocol_1_9::WriteMobMetadata: received unimplemented type\");\n\t\t\tbreak;\n\t\t}\n\n\t\tcase mtCaveSpider:\n\t\tcase mtEnderDragon:\n\t\tcase mtEndermite:\n\t\tcase mtGiant:\n\t\tcase mtIronGolem:\n\t\tcase mtMooshroom:\n\t\tcase mtSilverfish:\n\t\tcase mtSnowGolem:\n\t\tcase mtSpider:\n\t\tcase mtSquid:\n\t\t{\n\t\t\t// Entities without additional metadata\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: UNREACHABLE(\"cProtocol_1_9::WriteMobMetadata: received mob of invalid type\");\n\t}  // switch (a_Mob.GetType())\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_9_1:\n\nvoid cProtocol_1_9_1::SendLogin(const cPlayer & a_Player, const cWorld & a_World)\n{\n\t// Send the Join Game packet:\n\t{\n\t\tcServer * Server = cRoot::Get()->GetServer();\n\t\tcPacketizer Pkt(*this, pktJoinGame);\n\t\tPkt.WriteBEUInt32(a_Player.GetUniqueID());\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(a_Player.GetEffectiveGameMode()) | (Server->IsHardcore() ? 0x08 : 0));  // Hardcore flag bit 4\n\t\tPkt.WriteBEInt32(static_cast<Int32>(a_World.GetDimension()));  // This is the change from 1.9.0 (Int8 to Int32)\n\t\tPkt.WriteBEUInt8(2);  // TODO: Difficulty (set to Normal)\n\t\tPkt.WriteBEUInt8(static_cast<UInt8>(Clamp<size_t>(Server->GetMaxPlayers(), 0, 255)));\n\t\tPkt.WriteString(\"default\");  // Level type - wtf?\n\t\tPkt.WriteBool(false);  // Reduced Debug Info - wtf?\n\t}\n\n\t// Send the spawn position:\n\t{\n\t\tcPacketizer Pkt(*this, pktSpawnPosition);\n\t\tPkt.WriteXYZPosition64(a_World.GetSpawnX(), a_World.GetSpawnY(), a_World.GetSpawnZ());\n\t}\n\n\t// Send the server difficulty:\n\t{\n\t\tcPacketizer Pkt(*this, pktDifficulty);\n\t\tPkt.WriteBEInt8(1);\n\t}\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_9_1::GetProtocolVersion() const\n{\n\treturn Version::v1_9_1;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_9_2:\n\ncProtocol::Version cProtocol_1_9_2::GetProtocolVersion() const\n{\n\treturn Version::v1_9_2;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cProtocol_1_9_4:\n\nvoid cProtocol_1_9_4::SendUpdateSign(Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4)\n{\n\tASSERT(m_State == 3);  // In game mode?\n\n\t// 1.9.4 removed the update sign packet and now uses Update Block Entity\n\tcPacketizer Pkt(*this, pktUpdateBlockEntity);\n\tPkt.WriteXYZPosition64(a_BlockPos);\n\tPkt.WriteBEUInt8(9);  // Action 9 - update sign\n\n\tcFastNBTWriter Writer;\n\tWriter.AddInt(\"x\",        a_BlockPos.x);\n\tWriter.AddInt(\"y\",        a_BlockPos.y);\n\tWriter.AddInt(\"z\",        a_BlockPos.z);\n\tWriter.AddString(\"id\", \"Sign\");\n\n\tJson::Value Line1;\n\tLine1[\"text\"] = a_Line1;\n\tWriter.AddString(\"Text1\", JsonUtils::WriteFastString(Line1));\n\tJson::Value Line2;\n\tLine2[\"text\"] = a_Line2;\n\tWriter.AddString(\"Text2\", JsonUtils::WriteFastString(Line2));\n\tJson::Value Line3;\n\tLine3[\"text\"] = a_Line3;\n\tWriter.AddString(\"Text3\", JsonUtils::WriteFastString(Line3));\n\tJson::Value Line4;\n\tLine4[\"text\"] = a_Line4;\n\tWriter.AddString(\"Text4\", JsonUtils::WriteFastString(Line4));\n\n\tWriter.Finish();\n\tPkt.WriteBuf(Writer.GetResult());\n}\n\n\n\n\n\nUInt32 cProtocol_1_9_4::GetPacketID(cProtocol::ePacketType a_Packet) const\n{\n\tswitch (a_Packet)\n\t{\n\t\tcase pktCollectEntity:          return 0x48;\n\t\tcase pktEntityEffect:           return 0x4b;\n\t\tcase pktEntityProperties:       return 0x4a;\n\t\tcase pktPlayerListHeaderFooter: return 0x47;\n\t\tcase pktTeleportEntity:         return 0x49;\n\n\t\tdefault: return Super::GetPacketID(a_Packet);\n\t}\n}\n\n\n\n\n\ncProtocol::Version cProtocol_1_9_4::GetProtocolVersion() const\n{\n\treturn Version::v1_9_4;\n}\n"
  },
  {
    "path": "src/Protocol/Protocol_1_9.h",
    "content": "\n// Protocol_1_9.h\n\n/*\nDeclares the 1.9 protocol classes:\n\t- cProtocol_1_9_0\n\t\t- release 1.9 protocol (#107)\n\t- cProtocol_1_9_1\n\t\t- release 1.9.1 protocol (#108)\n\t- cProtocol_1_9_2\n\t\t- release 1.9.2 protocol (#109)\n\t- cProtocol_1_9_4\n\t\t- release 1.9.4 protocol (#110)\n*/\n\n\n\n\n\n#pragma once\n\n#include \"Protocol.h\"\n#include \"Protocol_1_8.h\"\n\n\n\n\n\nclass cProtocol_1_9_0:\n\tpublic cProtocol_1_8_0\n{\n\tusing Super = cProtocol_1_8_0;\n\npublic:\n\n\tcProtocol_1_9_0(cClientHandle * a_Client, const AString & a_ServerAddress, State a_State);\n\n\tvirtual void SendAttachEntity         (const cEntity & a_Entity, const cEntity & a_Vehicle) override;\n\tvirtual void SendBossBarAdd           (UInt32 a_UniqueID, const cCompositeChat & a_Title, float a_FractionFilled, BossBarColor a_Color, BossBarDivisionType a_DivisionType, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog) override;\n\tvirtual void SendBossBarRemove        (UInt32 a_UniqueID) override;\n\tvirtual void SendBossBarUpdateFlags   (UInt32 a_UniqueID, bool a_DarkenSky, bool a_PlayEndMusic, bool a_CreateFog) override;\n\tvirtual void SendBossBarUpdateHealth  (UInt32 a_UniqueID, float a_FractionFilled) override;\n\tvirtual void SendBossBarUpdateStyle   (UInt32 a_UniqueID, BossBarColor a_Color, BossBarDivisionType a_DivisionType) override;\n\tvirtual void SendBossBarUpdateTitle   (UInt32 a_UniqueID, const cCompositeChat & a_Title) override;\n\tvirtual void SendDetachEntity         (const cEntity & a_Entity, const cEntity & a_PreviousVehicle) override;\n\tvirtual void SendEntityEquipment      (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;\n\tvirtual void SendEntityMetadata       (const cEntity & a_Entity) override;\n\tvirtual void SendEntityPosition       (const cEntity & a_Entity) override;\n\tvirtual void SendExperienceOrb        (const cExpOrb & a_ExpOrb) override;\n\tvirtual void SendKeepAlive            (UInt32 a_PingID) override;\n\tvirtual void SendLeashEntity          (const cEntity & a_Entity, const cEntity & a_EntityLeashedTo) override;\n\tvirtual void SendMapData              (const cMap & a_Map, int a_DataStartX, int a_DataStartY) override;\n\tvirtual void SendPaintingSpawn        (const cPainting & a_Painting) override;\n\tvirtual void SendPlayerMoveLook       (Vector3d a_Pos, float a_Yaw, float a_Pitch, bool a_IsRelative) override;\n\tvirtual void SendPlayerMoveLook       (void) override;\n\tvirtual void SendPlayerPermissionLevel() override;\n\tvirtual void SendPlayerSpawn          (const cPlayer & a_Player) override;\n\tvirtual void SendSoundEffect          (const AString & a_SoundName, Vector3d a_Origin, float a_Volume, float a_Pitch) override;\n\tvirtual void SendSpawnMob             (const cMonster & a_Mob) override;\n\tvirtual void SendThunderbolt          (Vector3i a_Origin) override;\n\tvirtual void SendUnleashEntity        (const cEntity & a_Entity) override;\n\tvirtual void SendUnloadChunk          (int a_ChunkX, int a_ChunkZ) override;\n\nprotected:\n\n\t/** The current teleport ID. */\n\tbool m_IsTeleportIdConfirmed;\n\n\t/** Whether the current teleport ID has been confirmed by the client. */\n\tUInt32 m_OutstandingTeleportId;\n\n\tvirtual UInt32 GetPacketID(ePacketType a_Packet) const override;\n\tvirtual unsigned char GetProtocolEntityAnimation(EntityAnimation a_Animation) const override;\n\tvirtual signed char GetProtocolEntityStatus(EntityAnimation a_Animation) const override;\n\tvirtual UInt32 GetProtocolMobType(eMonsterType a_MobType) const override;\n\tvirtual Version GetProtocolVersion() const override;\n\n\tvirtual bool HandlePacket                       (cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) override;\n\tvirtual void HandlePacketAnimation              (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketBlockDig               (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketBlockPlace             (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketBoatSteer              (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketClientSettings         (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandleConfirmTeleport              (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketEntityAction           (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketPlayerPos              (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketPlayerPosLook          (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketSteerVehicle           (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketTabComplete            (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketUpdateSign             (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketUseEntity              (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandlePacketUseItem                (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketVehicleMove            (cByteBuffer & a_ByteBuffer);\n\tvirtual void HandlePacketWindowClick            (cByteBuffer & a_ByteBuffer) override;\n\tvirtual void HandleVanillaPluginMessage         (cByteBuffer & a_ByteBuffer, std::string_view a_Channel) override;\n\n\tvirtual void ParseItemMetadata(cItem & a_Item, ContiguousByteBufferView a_Metadata) const override;\n\tvirtual void SendEntitySpawn(const cEntity & a_Entity, const UInt8 a_ObjectType, const Int32 a_ObjectData) override;\n\tvirtual void WriteBlockEntity(cFastNBTWriter & a_Writer, const cBlockEntity & a_BlockEntity) const override;\n\tvirtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) const override;\n\tvirtual void WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) const override;\n\tvirtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) const override;\n\n\t/** Types used within metadata */\n\tenum eMetadataType\n\t{\n\t\tMETADATA_TYPE_BYTE              = 0,\n\t\tMETADATA_TYPE_VARINT            = 1,\n\t\tMETADATA_TYPE_FLOAT             = 2,\n\t\tMETADATA_TYPE_STRING            = 3,\n\t\tMETADATA_TYPE_CHAT              = 4,\n\t\tMETADATA_TYPE_ITEM              = 5,\n\t\tMETADATA_TYPE_BOOL              = 6,\n\t\tMETADATA_TYPE_ROTATION          = 7,\n\t\tMETADATA_TYPE_POSITION          = 8,\n\t\tMETADATA_TYPE_OPTIONAL_POSITION = 9,\n\t\tMETADATA_TYPE_DIRECTION         = 10,\n\t\tMETADATA_TYPE_OPTIONAL_UUID     = 11,\n\t\tMETADATA_TYPE_BLOCKID           = 12\n\t} ;\n} ;\n\n\n\n\n\n/** The version 108 protocol, used by 1.9.1.  Uses an int rather than a byte for dimension in join game. */\nclass cProtocol_1_9_1:\n\tpublic cProtocol_1_9_0\n{\n\tusing Super = cProtocol_1_9_0;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual void SendLogin(const cPlayer & a_Player, const cWorld & a_World) override;\n\n\tvirtual Version GetProtocolVersion() const override;\n} ;\n\n\n\n\n\n/** The version 109 protocol, used by 1.9.2.  Same as 1.9.1, except the server list ping version number changed with the protocol number. */\nclass cProtocol_1_9_2:\n\tpublic cProtocol_1_9_1\n{\n\tusing Super = cProtocol_1_9_1;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual Version GetProtocolVersion() const override;\n} ;\n\n\n\n\n\n/** The version 110 protocol, used by 1.9.3 and 1.9.4. */\nclass cProtocol_1_9_4:\n\tpublic cProtocol_1_9_2\n{\n\tusing Super = cProtocol_1_9_2;\n\npublic:\n\n\tusing Super::Super;\n\nprotected:\n\n\tvirtual void SendUpdateSign(Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;\n\n\tvirtual UInt32 GetPacketID(ePacketType a_Packet) const override;\n\tvirtual Version GetProtocolVersion() const override;\n} ;\n"
  },
  {
    "path": "src/Protocol/RecipeMapper.cpp",
    "content": "#include \"Globals.h\"\n#include \"RecipeMapper.h\"\n#include \"../Root.h\"\n\ncRecipeMapper::cRecipeMapper(void)\n{\n\tAString path = \"Protocol\";\n\tauto contents = cFile::GetFolderContents(path);\n\tfor (const auto & content: contents)\n\t{\n\t\tauto fullName = path + cFile::PathSeparator() + content;\n\t\tif (cFile::IsFolder(fullName))\n\t\t{\n\t\t\tloadRecipes(content);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cRecipeMapper::loadRecipes(const AString & a_ProtocolVersion)\n{\n\tcFile f;\n\tif (!f.Open(\"Protocol/\" + a_ProtocolVersion + \"/base.recipes.txt\", cFile::fmRead))\n\t{\n\t\tLOGWARNING(\"Cannot open file \\\"Protocol/%s/base.recipes.txt\\\", no recipe book recipes will be available!\", a_ProtocolVersion);\n\t\treturn;\n\t}\n\tAString Everything;\n\tif (!f.ReadRestOfFile(Everything))\n\t{\n\t\tLOGWARNING(\"Cannot read file \\\"Protocol/%s/base.recipes.txt\\\", no recipe book recipes will be available!\", a_ProtocolVersion);\n\t\treturn;\n\t}\n\tf.Close();\n\n\t// Split it into lines, then process each line as a single recipe:\n\tAStringVector Split = StringSplit(Everything, \"\\n\");\n\tm_ProtocolVersionMap[a_ProtocolVersion] = {};\n\tconst auto & RecipeNameMap = cRoot::Get()->GetCraftingRecipes()->GetRecipeNameMap();\n\n\tint LineNum = 1;\n\tfor (AStringVector::const_iterator itr = Split.begin(); itr != Split.end(); ++itr, ++LineNum)\n\t{\n\t\t// Remove anything after a '#' sign and trim away the whitespace:\n\t\tAString Recipe = TrimString(itr->substr(0, itr->find('#')));\n\t\tif (Recipe.empty())\n\t\t{\n\t\t\t// Empty recipe\n\t\t\tcontinue;\n\t\t}\n\t\tAddRecipeLine(a_ProtocolVersion, LineNum, Recipe, RecipeNameMap);\n\t}\n\tLOG(\"Loaded %s %zu recipe book\", a_ProtocolVersion, m_ProtocolVersionMap[a_ProtocolVersion].size());\n}\n\n\n\n\n\ncRecipeMapper::~cRecipeMapper()\n{\n}\n\n\n\n\n\nvoid cRecipeMapper::AddRecipeLine(const AString & a_ProtocolVersion, int a_LineNum, const AString & a_RecipeLine, const std::map<AString, UInt32> & a_RecipeNameMap)\n{\n\tAStringVector Sides = StringSplit(a_RecipeLine, \" \");\n\tUInt32 Id;\n\tif (Sides.size() != 2)\n\t{\n\t\tLOGINFO(\"Recipe incompletely configured %s\", a_RecipeLine);\n\t\treturn;\n\t}\n\tStringToInteger<UInt32>(Sides[0], Id);\n\n\tauto RecipeIndex = a_RecipeNameMap.find(Sides[1]);\n\tif (RecipeIndex == a_RecipeNameMap.end())\n\t{\n\t\treturn;\n\t}\n\tm_ProtocolVersionMap[a_ProtocolVersion].emplace(Id, RecipeIndex->second);\n}\n\n\n\n\n\nstd::optional<UInt32> cRecipeMapper::GetProtocolRecipeId(UInt32 a_RecipeId, UInt32 a_ProtocolVersion)\n{\n\tauto ProtocolMap = m_ProtocolVersionMap.find(cRoot::Get()->GetProtocolVersionTextFromInt(static_cast<int>(a_ProtocolVersion)));\n\tif (ProtocolMap == m_ProtocolVersionMap.end())\n\t{\n\t\treturn {};\n\t}\n\tfor (const auto & item: ProtocolMap->second)\n\t{\n\t\tif (item.second == a_RecipeId)\n\t\t{\n\t\t\treturn item.first;\n\t\t}\n\t}\n\treturn {};\n}\n\n\n\n\n\nstd::optional<UInt32> cRecipeMapper::GetCuberiteRecipeId(UInt32 a_ProtocolRecipeId, UInt32 a_ProtocolVersion)\n{\n\tauto ProtocolMap = m_ProtocolVersionMap.find(cRoot::Get()->GetProtocolVersionTextFromInt(static_cast<int>(a_ProtocolVersion)));\n\tif (ProtocolMap == m_ProtocolVersionMap.end())\n\t{\n\t\treturn {};\n\t}\n\tauto Element = ProtocolMap->second.find(a_ProtocolRecipeId);\n\tif (Element != ProtocolMap->second.end())\n\t{\n\t\treturn Element->second;\n\t}\n\treturn {};\n}\n"
  },
  {
    "path": "src/Protocol/RecipeMapper.h",
    "content": "#pragma once\n\n#include \"../CraftingRecipes.h\"\n#include <optional>\n\n/**\nThe RecipeMapper handles the translation of crafting recipes into protocol\nspecific recipe Ids.\nThe crafting recipes are identified by the RecipeId.\nThe actual configuration is stored in the protocol specific configuration\ndirectory, e.g. `Server/Protocol/1.12.2/base.recipes.txt`\n*/\nclass cRecipeMapper\n{\npublic:\n\tcRecipeMapper(void);\n\t~cRecipeMapper();\n\n\t/** Translates the cuberite RecipeId to the protocol specific RecipeId */\n\tstd::optional<UInt32> GetProtocolRecipeId(UInt32 a_RecipeId, UInt32 a_ProtocolVersion);\n\n\t/** Translates the protocol specific RecipeId to the cuberite RecipeId */\n\tstd::optional<UInt32> GetCuberiteRecipeId(UInt32 a_ProtocolRecipeId, UInt32 a_ProtocolVersion);\n\nprivate:\n\t/** A mapping for each protocol from the protocol specific RecipeId and the cuberite RecipeId */\n\tstd::map<AString, std::map<UInt32, UInt32>> m_ProtocolVersionMap;\n\n\t/** Load Recipes from the protocol specific mapping file */\n\tvoid loadRecipes(const AString & a_ProtocolVersion);\n\n\t/** Handles a single line of the protocol specific mapping file */\n\tvoid AddRecipeLine(const AString & a_ProtocolVersion, int a_LineNum, const AString & a_RecipeLine, const std::map<AString, UInt32> & a_RecipeNameMap);\n\n};\n"
  },
  {
    "path": "src/RCONServer.cpp",
    "content": "\n// RCONServer.cpp\n\n// Implements the cRCONServer class representing the RCON server\n\n#include \"Globals.h\"\n#include \"IniFile.h\"\n#include \"RCONServer.h\"\n#include \"Server.h\"\n#include \"Root.h\"\n#include \"CommandOutput.h\"\n\n\n\n\n\n// Disable MSVC warnings:\n#if defined(_MSC_VER)\n\t#pragma warning(push)\n\t#pragma warning(disable:4355)  // 'this' : used in base member initializer list\n#endif\n\n\n\n\n\nenum\n{\n\t// Client -> Server:\n\tRCON_PACKET_COMMAND = 2,\n\tRCON_PACKET_LOGIN   = 3,\n\n\t// Server -> Client:\n\tRCON_PACKET_RESPONSE = 2,\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRCONListenCallbacks:\n\nclass cRCONListenCallbacks:\n\tpublic cNetwork::cListenCallbacks\n{\npublic:\n\tcRCONListenCallbacks(cRCONServer & a_RCONServer, UInt16 a_Port):\n\t\tm_RCONServer(a_RCONServer),\n\t\tm_Port(a_Port)\n\t{\n\t}\n\nprotected:\n\t/** The RCON server instance that we're attached to. */\n\tcRCONServer & m_RCONServer;\n\n\t/** The port for which this instance is responsible. */\n\tUInt16 m_Port;\n\n\t// cNetwork::cListenCallbacks overrides:\n\tvirtual cTCPLink::cCallbacksPtr OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort) override\n\t{\n\t\tLOG(\"RCON Client \\\"%s\\\" connected!\", a_RemoteIPAddress.c_str());\n\t\treturn std::make_shared<cRCONServer::cConnection>(m_RCONServer, a_RemoteIPAddress);\n\t}\n\tvirtual void OnAccepted(cTCPLink & a_Link) override {}\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tLOGWARNING(\"RCON server error on port %d: %d (%s)\", m_Port, a_ErrorCode, a_ErrorMsg.c_str());\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRCONCommandOutput:\n\nclass cRCONCommandOutput :\n\tpublic cCommandOutputCallback\n{\npublic:\n\tcRCONCommandOutput(cRCONServer::cConnection & a_Connection, UInt32 a_RequestID) :\n\t\tm_Connection(a_Connection),\n\t\tm_RequestID(a_RequestID)\n\t{\n\t}\n\n\t// cCommandOutputCallback overrides:\n\tvirtual void Out(const AString & a_Text) override\n\t{\n\t\tm_Buffer.append(a_Text);\n\t}\n\n\tvirtual void Finished(void) override\n\t{\n\t\tm_Connection.SendResponse(m_RequestID, RCON_PACKET_RESPONSE, static_cast<UInt32>(m_Buffer.size()), m_Buffer.c_str());\n\t\tdelete this;\n\t}\n\nprotected:\n\tcRCONServer::cConnection & m_Connection;\n\tUInt32 m_RequestID;\n\tAString m_Buffer;\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRCONServer:\n\ncRCONServer::cRCONServer(cServer & a_Server) :\n\tm_Server(a_Server)\n{\n}\n\n\n\n\n\ncRCONServer::~cRCONServer()\n{\n\tfor (const auto & srv: m_ListenServers)\n\t{\n\t\tsrv->Close();\n\t}\n}\n\n\n\n\n\nvoid cRCONServer::Initialize(cSettingsRepositoryInterface & a_Settings)\n{\n\tif (!a_Settings.GetValueSetB(\"RCON\", \"Enabled\", false))\n\t{\n\t\treturn;\n\t}\n\n\t// Read the password, don't allow an empty one:\n\tm_Password = a_Settings.GetValueSet(\"RCON\", \"Password\", \"\");\n\tif (m_Password.empty())\n\t{\n\t\tLOGWARNING(\"RCON is requested, but the password is not set. RCON is now disabled.\");\n\t\treturn;\n\t}\n\n\t// Read the listening ports for RCON from config:\n\tAStringVector Ports = ReadUpgradeIniPorts(a_Settings, \"RCON\", \"Ports\", \"PortsIPv4\", \"PortsIPv6\", \"25575\");\n\n\t// Start listening on each specified port:\n\tfor (const auto & port: Ports)\n\t{\n\t\tUInt16 PortNum;\n\t\tif (!StringToInteger(port, PortNum))\n\t\t{\n\t\t\tLOGINFO(\"Invalid RCON port value: \\\"%s\\\". Ignoring.\", port.c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tauto Handle = cNetwork::Listen(PortNum, std::make_shared<cRCONListenCallbacks>(*this, PortNum));\n\t\tif (Handle->IsListening())\n\t\t{\n\t\t\tm_ListenServers.push_back(Handle);\n\t\t}\n\t}\n\n\tif (m_ListenServers.empty())\n\t{\n\t\tLOGWARNING(\"RCON is enabled but no valid ports were found. RCON is not accessible.\");\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRCONServer::cConnection:\n\ncRCONServer::cConnection::cConnection(cRCONServer & a_RCONServer, const AString & a_IPAddress) :\n\tm_IsAuthenticated(false),\n\tm_RCONServer(a_RCONServer),\n\tm_IPAddress(a_IPAddress)\n{\n}\n\n\n\n\n\nvoid cRCONServer::cConnection::OnLinkCreated(cTCPLinkPtr a_Link)\n{\n\tm_Link = a_Link;\n}\n\n\n\n\n\nvoid cRCONServer::cConnection::OnReceivedData(const char * a_Data, size_t a_Size)\n{\n\tASSERT(m_Link != nullptr);\n\n\t// Append data to the buffer:\n\tm_Buffer.append(a_Data, a_Size);\n\n\t// Process the packets in the buffer:\n\twhile (m_Buffer.size() >= 14)\n\t{\n\t\tUInt32 Length = UIntFromBuffer(m_Buffer.data());\n\t\tif ((Length > 1500) || (Length < 10))\n\t\t{\n\t\t\t// Too long or too short, drop the connection\n\t\t\tLOGWARNING(\"Received an invalid RCON packet length (%d), dropping RCON connection to %s.\",\n\t\t\t\tLength, m_IPAddress.c_str()\n\t\t\t);\n\t\t\tm_Link->Close();\n\t\t\tm_Link.reset();\n\t\t\treturn;\n\t\t}\n\t\tif (Length > static_cast<UInt32>(m_Buffer.size() + 4))\n\t\t{\n\t\t\t// Incomplete packet yet, wait for more data to come\n\t\t\treturn;\n\t\t}\n\n\t\tUInt32 RequestID  = UIntFromBuffer(m_Buffer.data() + 4);\n\t\tUInt32 PacketType = UIntFromBuffer(m_Buffer.data() + 8);\n\t\tif (!ProcessPacket(RequestID, PacketType, Length - 10, m_Buffer.data() + 12))\n\t\t{\n\t\t\tm_Link->Close();\n\t\t\tm_Link.reset();\n\t\t\treturn;\n\t\t}\n\t\tm_Buffer.erase(0, Length + 4);\n\t}  // while (m_Buffer.size() >= 14)\n}\n\n\n\n\n\nvoid cRCONServer::cConnection::OnRemoteClosed(void)\n{\n\tm_Link.reset();\n}\n\n\n\n\n\nvoid cRCONServer::cConnection::OnError(int a_ErrorCode, const AString & a_ErrorMsg)\n{\n\tLOGD(\"Error in RCON connection %s: %d (%s)\", m_IPAddress.c_str(), a_ErrorCode, a_ErrorMsg.c_str());\n\tm_Link.reset();\n}\n\n\n\n\n\nbool cRCONServer::cConnection::ProcessPacket(UInt32 a_RequestID, UInt32 a_PacketType, UInt32 a_PayloadLength, const char * a_Payload)\n{\n\tswitch (a_PacketType)\n\t{\n\t\tcase RCON_PACKET_LOGIN:\n\t\t{\n\t\t\tif ((a_PayloadLength == 0) || (strncmp(a_Payload, m_RCONServer.m_Password.c_str(), a_PayloadLength) != 0))\n\t\t\t{\n\t\t\t\tLOGINFO(\"RCON: Invalid password from client %s, dropping connection.\", m_IPAddress.c_str());\n\t\t\t\tSendResponse(0xffffffffU, RCON_PACKET_RESPONSE, 0, nullptr);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tm_IsAuthenticated = true;\n\n\t\t\tLOGD(\"RCON: Client at %s has successfully authenticated\", m_IPAddress.c_str());\n\n\t\t\t// Send OK response:\n\t\t\tSendResponse(a_RequestID, RCON_PACKET_RESPONSE, 0, nullptr);\n\t\t\treturn true;\n\t\t}\n\n\t\tcase RCON_PACKET_COMMAND:\n\t\t{\n\t\t\tif (!m_IsAuthenticated)\n\t\t\t{\n\t\t\t\tchar AuthNeeded[] = \"You need to authenticate first!\";\n\t\t\t\tSendResponse(a_RequestID, RCON_PACKET_RESPONSE, sizeof(AuthNeeded), AuthNeeded);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tAString cmd(a_Payload, a_PayloadLength);\n\t\t\tLOGD(\"RCON command from %s: \\\"%s\\\"\", m_IPAddress.c_str(), cmd.c_str());\n\t\t\tcRoot::Get()->QueueExecuteConsoleCommand(cmd, *(new cRCONCommandOutput(*this, a_RequestID)));\n\n\t\t\t// Send an empty response:\n\t\t\tSendResponse(a_RequestID, RCON_PACKET_RESPONSE, 0, nullptr);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Unknown packet type, drop the connection:\n\tLOGWARNING(\"RCON: Client at %s has sent an unknown packet type %d, dropping connection.\",\n\t\tm_IPAddress.c_str(), a_PacketType\n\t);\n\treturn false;\n}\n\n\n\n\n\nUInt32 cRCONServer::cConnection::UIntFromBuffer(const char * a_Buffer)\n{\n\tconst Byte * Buffer = reinterpret_cast<const Byte *>(a_Buffer);\n\treturn static_cast<UInt32>((Buffer[3] << 24) | (Buffer[2] << 16) | (Buffer[1] << 8) | Buffer[0]);\n}\n\n\n\n\n\nvoid cRCONServer::cConnection::UIntToBuffer(UInt32 a_Value, char * a_Buffer)\n{\n\ta_Buffer[0] = static_cast<char>(a_Value & 0xff);\n\ta_Buffer[1] = static_cast<char>((a_Value >> 8)  & 0xff);\n\ta_Buffer[2] = static_cast<char>((a_Value >> 16) & 0xff);\n\ta_Buffer[3] = static_cast<char>((a_Value >> 24) & 0xff);\n}\n\n\n\n\n\nvoid cRCONServer::cConnection::SendResponse(UInt32 a_RequestID, UInt32 a_PacketType, UInt32 a_PayloadLength, const char * a_Payload)\n{\n\tASSERT((a_PayloadLength == 0) || (a_Payload != nullptr));  // Either zero data to send, or a valid payload ptr\n\tASSERT(m_Link != nullptr);\n\n\tchar Buffer[12];\n\tUInt32 Length = a_PayloadLength + 10;\n\tUIntToBuffer(Length, Buffer);\n\tUIntToBuffer(a_RequestID, Buffer + 4);\n\tUIntToBuffer(a_PacketType, Buffer + 8);\n\tm_Link->Send(Buffer, 12);\n\tif (a_PayloadLength > 0)\n\t{\n\t\tm_Link->Send(a_Payload, a_PayloadLength);\n\t}\n\tm_Link->Send(\"\\0\", 2);  // Send two zero chars as the padding\n}\n\n\n\n\n"
  },
  {
    "path": "src/RCONServer.h",
    "content": "\n// RCONServer.h\n\n// Declares the cRCONServer class representing the RCON server\n\n\n\n\n\n#pragma once\n\n#include \"OSSupport/Network.h\"\n\n\n\n\n\n// fwd:\nclass cServer;\nclass cSettingsRepositoryInterface;\n\n\n\n\n\nclass cRCONServer\n{\npublic:\n\tcRCONServer(cServer & a_Server);\n\tvirtual ~cRCONServer();\n\n\tvoid Initialize(cSettingsRepositoryInterface & a_Settings);\n\nprotected:\n\tfriend class cRCONCommandOutput;\n\tfriend class cRCONListenCallbacks;\n\n\tclass cConnection :\n\t\tpublic cTCPLink::cCallbacks\n\t{\n\tpublic:\n\t\tcConnection(cRCONServer & a_RCONServer, const AString & a_IPAddress);\n\n\tprotected:\n\t\tfriend class cRCONCommandOutput;\n\n\t\t/** Set to true if the client has successfully authenticated */\n\t\tbool m_IsAuthenticated;\n\n\t\t/** Buffer for the incoming data */\n\t\tAString m_Buffer;\n\n\t\t/** Server that owns this connection and processes requests */\n\t\tcRCONServer & m_RCONServer;\n\n\t\t/** The TCP link to the client */\n\t\tcTCPLinkPtr m_Link;\n\n\t\t/** Address of the client */\n\t\tAString m_IPAddress;\n\n\n\t\t// cTCPLink::cCallbacks overrides:\n\t\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) override;\n\t\tvirtual void OnReceivedData(const char * a_Data, size_t a_Length) override;\n\t\tvirtual void OnRemoteClosed(void) override;\n\t\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;\n\n\t\t/** Processes the given packet and sends the response; returns true if successful, false if the connection is to be dropped */\n\t\tbool ProcessPacket(UInt32 a_RequestID, UInt32 a_PacketType, UInt32 a_PayloadLength, const char * a_Payload);\n\n\t\t/** Reads 4 bytes from a_Buffer and returns the LE UInt32 they represent */\n\t\tUInt32 UIntFromBuffer(const char * a_Buffer);\n\n\t\t/** Puts 4 bytes representing the int into the buffer */\n\t\tvoid UIntToBuffer(UInt32 a_Value, char * a_Buffer);\n\n\t\t/** Sends a RCON packet back to the client */\n\t\tvoid SendResponse(UInt32 a_RequestID, UInt32 a_PacketType, UInt32 a_PayloadLength, const char * a_Payload);\n\t} ;\n\n\n\t/** The server object that will process the commands received */\n\tcServer & m_Server;\n\n\t/** The sockets for accepting RCON connections (one socket per port). */\n\tcServerHandlePtrs m_ListenServers;\n\n\t/** Password for authentication */\n\tAString m_Password;\n} ;\n\n\n\n\n\n"
  },
  {
    "path": "src/RankManager.cpp",
    "content": "\n// RankManager.cpp\n\n// Implements the cRankManager class that represents the rank manager responsible for assigning permissions and message visuals to players\n\n#include \"Globals.h\"\n#include \"RankManager.h\"\n#include \"Protocol/MojangAPI.h\"\n#include \"ClientHandle.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cRankManager:\n\ncRankManager::cRankManager(void) :\n\tm_DB(\"Ranks.sqlite\", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE),\n\tm_IsInitialized(false)\n{\n}\n\n\n\n\n\ncRankManager::~cRankManager()\n{\n}\n\n\n\n\n\nvoid cRankManager::Initialize(cMojangAPI & a_MojangAPI)\n{\n\tASSERT(!m_IsInitialized);  // Calling Initialize for the second time?\n\n\t// Create the DB tables, if they don't exist:\n\tm_DB.exec(\"CREATE TABLE IF NOT EXISTS Rank (RankID INTEGER PRIMARY KEY, Name, MsgPrefix, MsgSuffix, MsgNameColorCode)\");\n\tm_DB.exec(\"CREATE TABLE IF NOT EXISTS PlayerRank (PlayerUUID, PlayerName, RankID INTEGER)\");\n\tm_DB.exec(\"CREATE TABLE IF NOT EXISTS PermGroup (PermGroupID INTEGER PRIMARY KEY, Name)\");\n\tm_DB.exec(\"CREATE TABLE IF NOT EXISTS RankPermGroup (RankID INTEGER, PermGroupID INTEGER)\");\n\tm_DB.exec(\"CREATE TABLE IF NOT EXISTS PermissionItem (PermGroupID INTEGER, Permission)\");\n\tm_DB.exec(\"CREATE TABLE IF NOT EXISTS RestrictionItem (PermGroupID INTEGER, Permission)\");\n\tm_DB.exec(\"CREATE TABLE IF NOT EXISTS DefaultRank (RankID INTEGER)\");\n\n\tm_IsInitialized = true;\n\n\ta_MojangAPI.SetRankManager(this);\n\n\t// If tables are empty, create default ranks\n\tif (AreDBTablesEmpty())\n\t{\n\t\tLOGINFO(\"Creating default ranks...\");\n\t\tCreateDefaults();\n\t\tLOGINFO(\"Default ranks created.\");\n\t}\n\n\t// Load the default rank:\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT Rank.Name FROM Rank \"\n\t\t\t\"LEFT JOIN DefaultRank ON Rank.RankID = DefaultRank.RankID\"\n\t\t);\n\t\tif (stmt.executeStep())\n\t\t{\n\t\t\tm_DefaultRank = stmt.getColumn(0).getText();\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Cannot load default rank: %s\", __FUNCTION__, ex.what());\n\t\treturn;\n\t}\n\n\t// If the default rank cannot be loaded, use the first rank:\n\tif (m_DefaultRank.empty())\n\t{\n\t\tSetDefaultRank(GetAllRanks()[0]);\n\t}\n}\n\n\n\n\n\nAString cRankManager::GetPlayerRankName(const cUUID & a_PlayerUUID)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT Rank.Name FROM Rank LEFT JOIN PlayerRank ON Rank.RankID = PlayerRank.RankID WHERE PlayerRank.PlayerUUID = ?\");\n\t\tstmt.bind(1, a_PlayerUUID.ToShortString());\n\t\t// executeStep returns false on no data\n\t\tif (!stmt.executeStep())\n\t\t{\n\t\t\t// No data returned from the DB\n\t\t\treturn AString();\n\t\t}\n\t\treturn stmt.getColumn(0).getText();\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Cannot get player rank name: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn AString();\n}\n\n\n\n\n\nAString cRankManager::GetPlayerName(const cUUID & a_PlayerUUID)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Prepare the DB statement:\n\t\tSQLite::Statement stmt(m_DB, \"SELECT PlayerName FROM PlayerRank WHERE PlayerUUID = ?\");\n\t\tstmt.bind(1, a_PlayerUUID.ToShortString());\n\n\t\tif (stmt.executeStep())\n\t\t{\n\t\t\treturn stmt.getColumn(0).getText();\n\t\t}\n\t}\n\tcatch (SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Cannot get player name: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn AString();\n}\n\n\n\n\n\nAStringVector cRankManager::GetPlayerGroups(const cUUID & a_PlayerUUID)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\t// Prepare the DB statement:\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT PermGroup.Name FROM PermGroup \"\n\t\t\t\t\"LEFT JOIN RankPermGroup ON PermGroup.PermGroupID = RankPermGroup.PermGroupID \"\n\t\t\t\t\"LEFT JOIN PlayerRank ON PlayerRank.RankID = RankPermGroup.RankID \"\n\t\t\t\"WHERE PlayerRank.PlayerUUID = ?\"\n\t\t);\n\t\tstmt.bind(1, a_PlayerUUID.ToShortString());\n\n\t\t// Execute and get results:\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Cannot get player groups: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetPlayerPermissions(const cUUID & a_PlayerUUID)\n{\n\tAString Rank = GetPlayerRankName(a_PlayerUUID);\n\tif (Rank.empty())\n\t{\n\t\tRank = m_DefaultRank;\n\t}\n\treturn GetRankPermissions(Rank);\n}\n\n\n\n\n\nAStringVector cRankManager::GetPlayerRestrictions(const cUUID & a_PlayerUUID)\n{\n\tAString Rank = GetPlayerRankName(a_PlayerUUID);\n\tif (Rank.empty())\n\t{\n\t\tRank = m_DefaultRank;\n\t}\n\treturn GetRankRestrictions(Rank);\n}\n\n\n\n\n\nAStringVector cRankManager::GetRankGroups(const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT PermGroup.Name FROM PermGroup \"\n\t\t\t\t\"LEFT JOIN RankPermGroup ON RankPermGroup.PermGroupID = PermGroup.PermGroupID \"\n\t\t\t\t\"LEFT JOIN Rank ON Rank.RankID = RankPermGroup.RankID \"\n\t\t\t\"WHERE Rank.Name = ?\"\n\t\t);\n\t\tstmt.bind(1, a_RankName);\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get rank groups from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetGroupPermissions(const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT PermissionItem.Permission FROM PermissionItem \"\n\t\t\t\t\"LEFT JOIN PermGroup ON PermGroup.PermGroupID = PermissionItem.PermGroupID \"\n\t\t\t\"WHERE PermGroup.Name = ?\"\n\t\t);\n\t\tstmt.bind(1, a_GroupName);\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get group permissions from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetGroupRestrictions(const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT RestrictionItem.Permission FROM RestrictionItem \"\n\t\t\t\t\"LEFT JOIN PermGroup ON PermGroup.PermGroupID = RestrictionItem.PermGroupID \"\n\t\t\t\"WHERE PermGroup.Name = ?\"\n\t\t);\n\t\tstmt.bind(1, a_GroupName);\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get group restrictions from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetRankPermissions(const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT PermissionItem.Permission FROM PermissionItem \"\n\t\t\t\t\"LEFT JOIN RankPermGroup ON RankPermGroup.PermGroupID = PermissionItem.PermGroupID \"\n\t\t\t\t\"LEFT JOIN Rank ON Rank.RankID = RankPermGroup.RankID \"\n\t\t\t\"WHERE Rank.Name = ?\"\n\t\t);\n\t\tstmt.bind(1, a_RankName);\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get rank permissions from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetRankRestrictions(const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT RestrictionItem.Permission FROM RestrictionItem \"\n\t\t\t\t\"LEFT JOIN RankPermGroup ON RankPermGroup.PermGroupID = RestrictionItem.PermGroupID \"\n\t\t\t\t\"LEFT JOIN Rank ON Rank.RankID = RankPermGroup.RankID \"\n\t\t\t\"WHERE Rank.Name = ?\"\n\t\t);\n\t\tstmt.bind(1, a_RankName);\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get rank restrictions from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nstd::vector<cUUID> cRankManager::GetAllPlayerUUIDs(void)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tcUUID tempUUID;\n\tstd::vector<cUUID> res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT PlayerUUID FROM PlayerRank ORDER BY PlayerName COLLATE NOCASE\");\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tif (!tempUUID.FromString(stmt.getColumn(0).getText()))\n\t\t\t{\n\t\t\t\t// Invalid UUID, ignore\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tres.push_back(tempUUID);\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get players from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetAllRanks(void)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT Name FROM Rank\");\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get ranks from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetAllGroups(void)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT Name FROM PermGroup\");\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get groups from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetAllPermissions(void)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT DISTINCT(Permission) FROM PermissionItem\");\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get permissions from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetAllRestrictions(void)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAStringVector res;\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT DISTINCT(Permission) FROM RestrictionItem\");\n\t\twhile (stmt.executeStep())\n\t\t{\n\t\t\tres.push_back(stmt.getColumn(0).getText());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get restrictions from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn res;\n}\n\n\n\n\n\nAStringVector cRankManager::GetAllPermissionsRestrictions(void)\n{\n\tAStringVector Permissions = GetAllPermissions();\n\tAStringVector Restrictions = GetAllRestrictions();\n\tfor (auto & restriction: Restrictions)\n\t{\n\t\tPermissions.push_back(restriction);\n\t}\n\treturn Permissions;\n}\n\n\n\n\n\nbool cRankManager::GetPlayerMsgVisuals(\n\tconst cUUID & a_PlayerUUID,\n\tAString & a_MsgPrefix,\n\tAString & a_MsgSuffix,\n\tAString & a_MsgNameColorCode\n)\n{\n\tAString Rank = GetPlayerRankName(a_PlayerUUID);\n\tif (Rank.empty())\n\t{\n\t\t// Rank not found, return failure:\n\t\ta_MsgPrefix.clear();\n\t\ta_MsgSuffix.clear();\n\t\ta_MsgNameColorCode.clear();\n\t\treturn false;\n\t}\n\treturn GetRankVisuals(Rank, a_MsgPrefix, a_MsgSuffix, a_MsgNameColorCode);\n}\n\n\n\n\n\nvoid cRankManager::AddRank(\n\tconst AString & a_RankName,\n\tconst AString & a_MsgPrefix,\n\tconst AString & a_MsgSuffix,\n\tconst AString & a_MsgNameColorCode\n)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Check if such a rank name is already used:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM Rank WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_RankName);\n\t\t\tif (stmt.executeStep())\n\t\t\t{\n\t\t\t\tif (stmt.getColumn(0).getInt() > 0)\n\t\t\t\t{\n\t\t\t\t\t// Rank already exists, do nothing:\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Insert a new rank:\n\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO Rank (Name, MsgPrefix, MsgSuffix, MsgNameColorCode) VALUES (?, ?, ?, ?)\");\n\t\tstmt.bind(1, a_RankName);\n\t\tstmt.bind(2, a_MsgPrefix);\n\t\tstmt.bind(3, a_MsgSuffix);\n\t\tstmt.bind(4, a_MsgNameColorCode);\n\t\tif (stmt.exec() <= 0)\n\t\t{\n\t\t\tLOGWARNING(\"%s: Failed to add a new rank \\\"%s\\\".\", __FUNCTION__, a_RankName.c_str());\n\t\t\treturn;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to add a new rank \\\"%s\\\": %s\", __FUNCTION__, a_RankName.c_str(), ex.what());\n\t}\n}\n\n\n\n\n\nvoid cRankManager::AddGroup(const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Check if such a group name is already used:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (stmt.executeStep())\n\t\t\t{\n\t\t\t\tif (stmt.getColumn(0).getInt() > 0)\n\t\t\t\t{\n\t\t\t\t\t// Group already exists, do nothing:\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Insert a new group:\n\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO PermGroup (Name) VALUES (?)\");\n\t\tstmt.bind(1, a_GroupName);\n\t\tif (stmt.exec() <= 0)\n\t\t{\n\t\t\tLOGWARNING(\"%s: Failed to add a new group \\\"%s\\\".\", __FUNCTION__, a_GroupName.c_str());\n\t\t\treturn;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to add a new group \\\"%s\\\": %s\", __FUNCTION__, a_GroupName.c_str(), ex.what());\n\t}\n}\n\n\n\n\n\nvoid cRankManager::AddGroups(const AStringVector & a_GroupNames)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tfor (AStringVector::const_iterator itr = a_GroupNames.begin(), end = a_GroupNames.end(); itr != end; ++itr)\n\t\t{\n\t\t\t// Check if such the group name is already used:\n\t\t\t{\n\t\t\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM PermGroup WHERE Name = ?\");\n\t\t\t\tstmt.bind(1, *itr);\n\t\t\t\tif (stmt.executeStep())\n\t\t\t\t{\n\t\t\t\t\tif (stmt.getColumn(0).getInt() > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Group already exists, do nothing:\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Insert a new group:\n\t\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO PermGroup (Name) VALUES (?)\");\n\t\t\tstmt.bind(1, *itr);\n\t\t\tif (stmt.exec() <= 0)\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Failed to add a new group \\\"%s\\\".\", __FUNCTION__, itr->c_str());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}  // for itr - a_GroupNames[]\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to add new groups: %s\", __FUNCTION__, ex.what());\n\t}\n}\n\n\n\n\n\nbool cRankManager::AddGroupToRank(const AString & a_GroupName, const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the group's ID:\n\t\tint GroupID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: No such group (%s), aborting.\", __FUNCTION__, a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0);\n\t\t}\n\n\t\t// Get the rank's ID:\n\t\tint RankID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT RankID FROM Rank WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_RankName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: No such rank (%s), aborting.\", __FUNCTION__, a_RankName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tRankID = stmt.getColumn(0);\n\t\t}\n\n\t\t// Check if the group is already there:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM RankPermGroup WHERE RankID = ? AND PermGroupID = ?\");\n\t\t\tstmt.bind(1, RankID);\n\t\t\tstmt.bind(2, GroupID);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Failed to check binding between rank %s and group %s, aborting.\", __FUNCTION__, a_RankName.c_str(), a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (stmt.getColumn(0).getInt() > 0)\n\t\t\t{\n\t\t\t\tLOGD(\"%s: Group %s already present in rank %s, skipping and returning success.\",\n\t\t\t\t\t__FUNCTION__, a_GroupName.c_str(), a_RankName.c_str()\n\t\t\t\t);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Add the group:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO RankPermGroup (RankID, PermGroupID) VALUES (?, ?)\");\n\t\t\tstmt.bind(1, RankID);\n\t\t\tstmt.bind(2, GroupID);\n\t\t\tif (stmt.exec() <= 0)\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Failed to add group %s to rank %s, aborting.\", __FUNCTION__, a_GroupName.c_str(), a_RankName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Adding succeeded:\n\t\treturn true;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to add group %s to rank %s: %s\", __FUNCTION__, a_GroupName.c_str(), a_RankName.c_str(), ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::AddPermissionToGroup(const AString & a_Permission, const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the group's ID:\n\t\tint GroupID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: No such group (%s), aborting.\", __FUNCTION__, a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\t// Check if the permission is already present:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM PermissionItem WHERE PermGroupID = ? AND Permission = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.bind(2, a_Permission);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Failed to check binding between permission %s and group %s, aborting.\", __FUNCTION__, a_Permission.c_str(), a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (stmt.getColumn(0).getInt() > 0)\n\t\t\t{\n\t\t\t\tLOGD(\"%s: Permission %s is already present in group %s, skipping and returning success.\",\n\t\t\t\t\t__FUNCTION__, a_Permission.c_str(), a_GroupName.c_str()\n\t\t\t\t);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Add the permission:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO PermissionItem (Permission, PermGroupID) VALUES (?, ?)\");\n\t\t\tstmt.bind(1, a_Permission);\n\t\t\tstmt.bind(2, GroupID);\n\t\t\tif (stmt.exec() <= 0)\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Failed to add permission %s to group %s, aborting.\", __FUNCTION__, a_Permission.c_str(), a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Adding succeeded:\n\t\treturn true;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to add permission %s to group %s: %s\",\n\t\t\t__FUNCTION__, a_Permission.c_str(), a_GroupName.c_str(), ex.what()\n\t\t);\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::AddRestrictionToGroup(const AString & a_Restriction, const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the group's ID:\n\t\tint GroupID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: No such group (%s), aborting.\", __FUNCTION__, a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\t// Check if the restriction is already present:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM RestrictionItem WHERE PermGroupID = ? AND Permission = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.bind(2, a_Restriction);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Failed to check binding between restriction %s and group %s, aborting.\", __FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (stmt.getColumn(0).getInt() > 0)\n\t\t\t{\n\t\t\t\tLOGD(\"%s: Restriction %s is already present in group %s, skipping and returning success.\",\n\t\t\t\t\t__FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str()\n\t\t\t\t);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Add the restriction:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO RestrictionItem (Permission, PermGroupID) VALUES (?, ?)\");\n\t\t\tstmt.bind(1, a_Restriction);\n\t\t\tstmt.bind(2, GroupID);\n\t\t\tif (stmt.exec() <= 0)\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: Failed to add restriction %s to group %s, aborting.\", __FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Adding succeeded:\n\t\treturn true;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to add restriction %s to group %s: %s\",\n\t\t\t__FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str(), ex.what()\n\t\t);\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::AddPermissionsToGroup(const AStringVector & a_Permissions, const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the group's ID:\n\t\tint GroupID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: No such group (%s), aborting.\", __FUNCTION__, a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\tfor (AStringVector::const_iterator itr = a_Permissions.begin(), end = a_Permissions.end(); itr != end; ++itr)\n\t\t{\n\t\t\t// Check if the permission is already present:\n\t\t\t{\n\t\t\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM PermissionItem WHERE PermGroupID = ? AND Permission = ?\");\n\t\t\t\tstmt.bind(1, GroupID);\n\t\t\t\tstmt.bind(2, *itr);\n\t\t\t\tif (!stmt.executeStep())\n\t\t\t\t{\n\t\t\t\t\tLOGWARNING(\"%s: Failed to check binding between permission %s and group %s, aborting.\", __FUNCTION__, itr->c_str(), a_GroupName.c_str());\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (stmt.getColumn(0).getInt() > 0)\n\t\t\t\t{\n\t\t\t\t\tLOGD(\"%s: Permission %s is already present in group %s, skipping and returning success.\",\n\t\t\t\t\t\t__FUNCTION__, itr->c_str(), a_GroupName.c_str()\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the permission:\n\t\t\t{\n\t\t\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO PermissionItem (Permission, PermGroupID) VALUES (?, ?)\");\n\t\t\t\tstmt.bind(1, *itr);\n\t\t\t\tstmt.bind(2, GroupID);\n\t\t\t\tif (stmt.exec() <= 0)\n\t\t\t\t{\n\t\t\t\t\tLOGWARNING(\"%s: Failed to add permission %s to group %s, skipping.\", __FUNCTION__, itr->c_str(), a_GroupName.c_str());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for itr - a_Permissions[]\n\n\t\t// Adding succeeded:\n\t\treturn true;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to add permissions to group %s: %s\",\n\t\t\t__FUNCTION__, a_GroupName.c_str(), ex.what()\n\t\t);\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::AddRestrictionsToGroup(const AStringVector & a_Restrictions, const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the group's ID:\n\t\tint GroupID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: No such group (%s), aborting.\", __FUNCTION__, a_GroupName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\tfor (auto itr = a_Restrictions.cbegin(), end = a_Restrictions.cend(); itr != end; ++itr)\n\t\t{\n\t\t\t// Check if the restriction is already present:\n\t\t\t{\n\t\t\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM RestrictionItem WHERE PermGroupID = ? AND Permission = ?\");\n\t\t\t\tstmt.bind(1, GroupID);\n\t\t\t\tstmt.bind(2, *itr);\n\t\t\t\tif (!stmt.executeStep())\n\t\t\t\t{\n\t\t\t\t\tLOGWARNING(\"%s: Failed to check binding between restriction %s and group %s, aborting.\", __FUNCTION__, itr->c_str(), a_GroupName.c_str());\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (stmt.getColumn(0).getInt() > 0)\n\t\t\t\t{\n\t\t\t\t\tLOGD(\"%s: Restriction %s is already present in group %s, skipping and returning success.\",\n\t\t\t\t\t\t__FUNCTION__, itr->c_str(), a_GroupName.c_str()\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the permission:\n\t\t\t{\n\t\t\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO RestrictionItem (Permission, PermGroupID) VALUES (?, ?)\");\n\t\t\t\tstmt.bind(1, *itr);\n\t\t\t\tstmt.bind(2, GroupID);\n\t\t\t\tif (stmt.exec() <= 0)\n\t\t\t\t{\n\t\t\t\t\tLOGWARNING(\"%s: Failed to add restriction %s to group %s, skipping.\", __FUNCTION__, itr->c_str(), a_GroupName.c_str());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for itr - a_Restrictions[]\n\n\t\t// Adding succeeded:\n\t\treturn true;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to add restrictions to group %s: %s\",\n\t\t\t__FUNCTION__, a_GroupName.c_str(), ex.what()\n\t\t);\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cRankManager::RemoveRank(const AString & a_RankName, const AString & a_ReplacementRankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\t// Check if the default rank is being removed with a proper replacement:\n\tif ((a_RankName == m_DefaultRank) && !RankExists(a_ReplacementRankName))\n\t{\n\t\tLOGWARNING(\"%s: Cannot remove rank %s, it is the default rank and the replacement rank doesn't exist.\", __FUNCTION__, a_RankName.c_str());\n\t\treturn;\n\t}\n\n\tAStringVector res;\n\ttry\n\t{\n\t\t// Get the RankID for the rank being removed:\n\t\tint RemoveRankID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT RankID FROM Rank WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_RankName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGINFO(\"%s: Rank %s was not found. Skipping.\", __FUNCTION__, a_RankName.c_str());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tRemoveRankID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\t// Get the RankID for the replacement rank:\n\t\tint ReplacementRankID = -1;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT RankID FROM Rank WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_ReplacementRankName);\n\t\t\tif (stmt.executeStep())\n\t\t\t{\n\t\t\t\tReplacementRankID = stmt.getColumn(0).getInt();\n\t\t\t}\n\t\t}\n\n\t\t// Remove the rank's bindings to groups:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM RankPermGroup WHERE RankID = ?\");\n\t\t\tstmt.bind(1, RemoveRankID);\n\t\t\tstmt.exec();\n\t\t}\n\n\t\t// Adjust players:\n\t\tif (ReplacementRankID == -1)\n\t\t{\n\t\t\t// No replacement, just delete all the players that have the rank:\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM PlayerRank WHERE RankID = ?\");\n\t\t\tstmt.bind(1, RemoveRankID);\n\t\t\tstmt.exec();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Replacement available, change all the player records:\n\t\t\tSQLite::Statement stmt(m_DB, \"UPDATE PlayerRank SET RankID = ? WHERE RankID = ?\");\n\t\t\tstmt.bind(1, ReplacementRankID);\n\t\t\tstmt.bind(2, RemoveRankID);\n\t\t\tstmt.exec();\n\t\t}\n\n\t\t// Remove the rank from the DB:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM Rank WHERE RankID = ?\");\n\t\t\tstmt.bind(1, RemoveRankID);\n\t\t\tstmt.exec();\n\t\t}\n\n\t\t// Update the default rank, if it was the one being removed:\n\t\tif (a_RankName == m_DefaultRank)\n\t\t{\n\t\t\tm_DefaultRank = a_RankName;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to remove rank from DB: %s\", __FUNCTION__, ex.what());\n\t}\n}\n\n\n\n\n\nvoid cRankManager::RemoveGroup(const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the ID of the group:\n\t\tint GroupID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGINFO(\"%s: Group %s was not found, skipping.\", __FUNCTION__, a_GroupName.c_str());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\t// Remove all permissions from the group:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM PermissionItem WHERE PermGroupID = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.exec();\n\t\t}\n\n\t\t// Remove the group from all ranks that contain it:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM RankPermGroup WHERE PermGroupID = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.exec();\n\t\t}\n\n\t\t// Remove the group itself:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM PermGroup WHERE PermGroupID = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.exec();\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to remove group %s from DB: %s\", __FUNCTION__, a_GroupName.c_str(), ex.what());\n\t}\n}\n\n\n\n\n\nvoid cRankManager::RemoveGroupFromRank(const AString & a_GroupName, const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the IDs of the group and the rank:\n\t\tint GroupID, RankID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\t\"SELECT PermGroup.PermGroupID, Rank.RankID FROM PermGroup \"\n\t\t\t\t\t\"LEFT JOIN RankPermGroup ON RankPermGroup.PermGroupID = PermGroup.PermGroupID \"\n\t\t\t\t\t\"LEFT JOIN Rank ON Rank.RankID = RankPermGroup.RankID \"\n\t\t\t\t\"WHERE PermGroup.Name = ? AND Rank.Name = ?\"\n\t\t\t);\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tstmt.bind(2, a_RankName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGINFO(\"%s: Group %s was not found in rank %s, skipping.\", __FUNCTION__, a_GroupName.c_str(), a_RankName.c_str());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0).getInt();\n\t\t\tRankID = stmt.getColumn(1).getInt();\n\t\t}\n\n\t\t// Remove the group from all ranks that contain it:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM RankPermGroup WHERE PermGroupID = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.exec();\n\t\t}\n\n\t\t// Remove the group-to-rank binding:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM RankPermGroup WHERE PermGroupID = ? AND RankID = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.bind(1, RankID);\n\t\t\tstmt.exec();\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to remove group %s from rank %s in the DB: %s\", __FUNCTION__, a_GroupName.c_str(), a_RankName.c_str(), ex.what());\n\t}\n}\n\n\n\n\n\nvoid cRankManager::RemovePermissionFromGroup(const AString & a_Permission, const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the ID of the group:\n\t\tint GroupID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGINFO(\"%s: Group %s was not found, skipping.\", __FUNCTION__, a_GroupName.c_str());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\t// Remove the permission from the group:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM PermissionItem WHERE PermGroupID = ? AND Permission = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.bind(2, a_Permission);\n\t\t\tstmt.exec();\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to remove permission %s from group %s in DB: %s\",\n\t\t\t__FUNCTION__, a_Permission.c_str(), a_GroupName.c_str(), ex.what()\n\t\t);\n\t}\n}\n\n\n\n\n\nvoid cRankManager::RemoveRestrictionFromGroup(const AString & a_Restriction, const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Get the ID of the group:\n\t\tint GroupID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_GroupName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGINFO(\"%s: Group %s was not found, skipping.\", __FUNCTION__, a_GroupName.c_str());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tGroupID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\t// Remove the permission from the group:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM RestrictionItem WHERE PermGroupID = ? AND Permission = ?\");\n\t\t\tstmt.bind(1, GroupID);\n\t\t\tstmt.bind(2, a_Restriction);\n\t\t\tstmt.exec();\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to remove restriction %s from group %s in DB: %s\",\n\t\t\t__FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str(), ex.what()\n\t\t);\n\t}\n}\n\n\n\n\n\nbool cRankManager::RenameRank(const AString & a_OldName, const AString & a_NewName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Check that NewName doesn't exist:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT RankID FROM Rank WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_NewName);\n\t\t\tif (stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGINFO(\"%s: Rank %s is already present, cannot rename %s\", __FUNCTION__, a_NewName.c_str(), a_OldName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Rename:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"UPDATE Rank SET Name = ? WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_NewName);\n\t\t\tstmt.bind(2, a_OldName);\n\t\t\tif (stmt.exec() <= 0)\n\t\t\t{\n\t\t\t\tLOGINFO(\"%s: There is no rank %s, cannot rename to %s.\", __FUNCTION__, a_OldName.c_str(), a_NewName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Update the default rank, if it was the one being renamed:\n\t\tif (a_OldName == m_DefaultRank)\n\t\t{\n\t\t\tm_DefaultRank = a_NewName;\n\t\t}\n\n\t\treturn true;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to rename rank %s to %s in DB: %s\",\n\t\t\t__FUNCTION__, a_OldName.c_str(), a_NewName.c_str(), ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::RenameGroup(const AString & a_OldName, const AString & a_NewName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Check that NewName doesn't exist:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT PermGroupID FROM PermGroup WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_NewName);\n\t\t\tif (stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGD(\"%s: Group %s is already present, cannot rename %s\", __FUNCTION__, a_NewName.c_str(), a_OldName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Rename:\n\t\tbool res;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"UPDATE PermGroup SET Name = ? WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_NewName);\n\t\t\tstmt.bind(2, a_OldName);\n\t\t\tres = (stmt.exec() > 0);\n\t\t}\n\n\t\treturn res;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to rename group %s to %s in DB: %s\",\n\t\t\t__FUNCTION__, a_OldName.c_str(), a_NewName.c_str(), ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cRankManager::SetPlayerRank(const cUUID & a_PlayerUUID, const AString & a_PlayerName, const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAString StrUUID = a_PlayerUUID.ToShortString();\n\n\ttry\n\t{\n\t\t// Get the rank ID:\n\t\tint RankID;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT RankID FROM Rank WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_RankName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGWARNING(\"%s: There is no rank %s, aborting.\", __FUNCTION__, a_RankName.c_str());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tRankID = stmt.getColumn(0).getInt();\n\t\t}\n\n\t\t// Update the player's rank, if already in DB:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"UPDATE PlayerRank SET RankID = ?, PlayerName = ? WHERE PlayerUUID = ?\");\n\t\t\tstmt.bind(1, RankID);\n\t\t\tstmt.bind(2, a_PlayerName);\n\t\t\tstmt.bind(3, StrUUID);\n\t\t\tif (stmt.exec() > 0)\n\t\t\t{\n\t\t\t\t// Successfully updated the player's rank\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// The player is not yet in the DB, add them:\n\t\tSQLite::Statement stmt(m_DB, \"INSERT INTO PlayerRank (RankID, PlayerUUID, PlayerName) VALUES (?, ?, ?)\");\n\t\tstmt.bind(1, RankID);\n\t\tstmt.bind(2, StrUUID);\n\t\tstmt.bind(3, a_PlayerName);\n\t\tif (stmt.exec() > 0)\n\t\t{\n\t\t\t// Successfully added the player\n\t\t\treturn;\n\t\t}\n\n\t\tLOGWARNING(\"%s: Failed to set player UUID %s to rank %s.\",\n\t\t\t__FUNCTION__, StrUUID.c_str(), a_RankName.c_str()\n\t\t);\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to set player UUID %s to rank %s: %s\",\n\t\t\t__FUNCTION__, StrUUID.c_str(), a_RankName.c_str(), ex.what()\n\t\t);\n\t}\n}\n\n\n\n\n\nvoid cRankManager::RemovePlayerRank(const cUUID & a_PlayerUUID)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAString StrUUID = a_PlayerUUID.ToShortString();\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM PlayerRank WHERE PlayerUUID = ?\");\n\t\tstmt.bind(1, StrUUID);\n\t\tstmt.exec();\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to remove rank from player UUID %s: %s\",\n\t\t\t__FUNCTION__, StrUUID.c_str(), ex.what()\n\t\t);\n\t}\n}\n\n\n\n\n\nvoid cRankManager::SetRankVisuals(\n\tconst AString & a_RankName,\n\tconst AString & a_MsgPrefix,\n\tconst AString & a_MsgSuffix,\n\tconst AString & a_MsgNameColorCode\n)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"UPDATE Rank SET MsgPrefix = ?, MsgSuffix = ?, MsgNameColorCode = ? WHERE Name = ?\");\n\t\tstmt.bind(1, a_MsgPrefix);\n\t\tstmt.bind(2, a_MsgSuffix);\n\t\tstmt.bind(3, a_MsgNameColorCode);\n\t\tstmt.bind(4, a_RankName);\n\t\tif (stmt.exec() < 1)\n\t\t{\n\t\t\tLOGINFO(\"%s: Rank %s not found, visuals not set.\", __FUNCTION__, a_RankName.c_str());\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get ranks from DB: %s\", __FUNCTION__, ex.what());\n\t}\n}\n\n\n\n\n\nbool cRankManager::GetRankVisuals(\n\tconst AString & a_RankName,\n\tAString & a_MsgPrefix,\n\tAString & a_MsgSuffix,\n\tAString & a_MsgNameColorCode\n)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT MsgPrefix, MsgSuffix, MsgNameColorCode FROM Rank WHERE Name = ?\");\n\t\tstmt.bind(1, a_RankName);\n\t\tif (!stmt.executeStep())\n\t\t{\n\t\t\t// Rank not found\n\t\t\treturn false;\n\t\t}\n\t\ta_MsgPrefix = stmt.getColumn(0).getText();\n\t\ta_MsgSuffix = stmt.getColumn(1).getText();\n\t\ta_MsgNameColorCode = stmt.getColumn(2).getText();\n\t\treturn true;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to get ranks from DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::RankExists(const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT * FROM Rank WHERE Name = ?\");\n\t\tstmt.bind(1, a_RankName);\n\t\tif (stmt.executeStep())\n\t\t{\n\t\t\t// The rank was found\n\t\t\treturn true;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB for rank %s: %s\", __FUNCTION__, a_RankName.c_str(), ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::GroupExists(const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT * FROM PermGroup WHERE Name = ?\");\n\t\tstmt.bind(1, a_GroupName);\n\t\tif (stmt.executeStep())\n\t\t{\n\t\t\t// The group was found\n\t\t\treturn true;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB for group %s: %s\", __FUNCTION__, a_GroupName.c_str(), ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::IsPlayerRankSet(const cUUID & a_PlayerUUID)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAString StrUUID = a_PlayerUUID.ToShortString();\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT * FROM PlayerRank WHERE PlayerUUID = ?\");\n\t\tstmt.bind(1, StrUUID);\n\t\tif (stmt.executeStep())\n\t\t{\n\t\t\t// The player UUID was found, they have a rank\n\t\t\treturn true;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB for player UUID %s: %s\", __FUNCTION__, StrUUID.c_str(), ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::IsGroupInRank(const AString & a_GroupName, const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT * FROM Rank \"\n\t\t\t\t\"LEFT JOIN RankPermGroup ON Rank.RankID = RankPermGroup.RankID \"\n\t\t\t\t\"LEFT JOIN PermGroup ON PermGroup.PermGroupID = RankPermGroup.PermGroupID \"\n\t\t\t\"WHERE Rank.Name = ? AND PermGroup.Name = ?\"\n\t\t);\n\t\tstmt.bind(1, a_RankName);\n\t\tstmt.bind(2, a_GroupName);\n\t\tif (stmt.executeStep())\n\t\t{\n\t\t\t// The group is in the rank\n\t\t\treturn true;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::IsPermissionInGroup(const AString & a_Permission, const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT * FROM PermissionItem \"\n\t\t\t\t\"LEFT JOIN PermGroup ON PermGroup.PermGroupID = PermissionItem.PermGroupID \"\n\t\t\t\"WHERE PermissionItem.Permission = ? AND PermGroup.Name = ?\"\n\t\t);\n\t\tstmt.bind(1, a_Permission);\n\t\tstmt.bind(2, a_GroupName);\n\t\tif (stmt.executeStep())\n\t\t{\n\t\t\t// The permission is in the group\n\t\t\treturn true;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::IsRestrictionInGroup(const AString & a_Restriction, const AString & a_GroupName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB,\n\t\t\t\"SELECT * FROM RestrictionItem \"\n\t\t\t\t\"LEFT JOIN PermGroup ON PermGroup.PermGroupID = RestrictionItem.PermGroupID \"\n\t\t\t\"WHERE RestrictionItem.Permission = ? AND PermGroup.Name = ?\"\n\t\t);\n\t\tstmt.bind(1, a_Restriction);\n\t\tstmt.bind(2, a_GroupName);\n\t\tif (stmt.executeStep())\n\t\t{\n\t\t\t// The restriction is in the group\n\t\t\treturn true;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cRankManager::NotifyNameUUID(const AString & a_PlayerName, const cUUID & a_UUID)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"UPDATE PlayerRank SET PlayerName = ? WHERE PlayerUUID = ?\");\n\t\tstmt.bind(1, a_PlayerName);\n\t\tstmt.bind(2, a_UUID.ToShortString());\n\t\tstmt.exec();\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to update DB: %s\", __FUNCTION__, ex.what());\n\t}\n}\n\n\n\n\n\nbool cRankManager::SetDefaultRank(const AString & a_RankName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\t// Find the rank's ID:\n\t\tint RankID = 0;\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"SELECT RankID FROM Rank WHERE Name = ?\");\n\t\t\tstmt.bind(1, a_RankName);\n\t\t\tif (!stmt.executeStep())\n\t\t\t{\n\t\t\t\tLOGINFO(\"%s: Cannot set rank %s as the default, it does not exist.\", __FUNCTION__, a_RankName.c_str());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Set the rank as the default:\n\t\t{\n\t\t\tSQLite::Statement stmt(m_DB, \"UPDATE DefaultRank SET RankID = ?\");\n\t\t\tstmt.bind(1, RankID);\n\t\t\tif (stmt.exec() < 1)\n\t\t\t{\n\t\t\t\t// Failed to update, there might be none in the DB, try inserting:\n\t\t\t\tSQLite::Statement stmt2(m_DB, \"INSERT INTO DefaultRank (RankID) VALUES (?)\");\n\t\t\t\tstmt2.bind(1, RankID);\n\t\t\t\tif (stmt2.exec() < 1)\n\t\t\t\t{\n\t\t\t\t\tLOGINFO(\"%s: Cannot update the default rank in the DB to %s.\", __FUNCTION__, a_RankName.c_str());\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Set the internal cache:\n\t\tm_DefaultRank = a_RankName;\n\t\treturn true;\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to update DB: %s\", __FUNCTION__, ex.what());\n\t\treturn false;\n\t}\n}\n\n\n\n\n\nvoid cRankManager::ClearPlayerRanks(void)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"DELETE FROM PlayerRank\");\n\t\tstmt.exec();\n\t}\n\tcatch (SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to remove / clear all players: %s\", __FUNCTION__, ex.what());\n\t}\n}\n\n\n\n\n\nbool cRankManager::UpdatePlayerName(const cUUID & a_PlayerUUID, const AString & a_NewPlayerName)\n{\n\tASSERT(m_IsInitialized);\n\tcCSLock Lock(m_CS);\n\n\tAString StrUUID = a_PlayerUUID.ToShortString();\n\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"UPDATE PlayerRank SET PlayerName = ? WHERE PlayerUUID = ?\");\n\t\tstmt.bind(1, a_NewPlayerName);\n\t\tstmt.bind(2, StrUUID);\n\t\tif (stmt.exec() > 0)\n\t\t{\n\t\t\t// The player name was changed, returns true\n\t\t\treturn true;\n\t\t}\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to update player name from UUID %s: %s\", __FUNCTION__, StrUUID.c_str(), ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRankManager::AreDBTablesEmpty(void)\n{\n\treturn (\n\t\tIsDBTableEmpty(\"Rank\") &&\n\t\tIsDBTableEmpty(\"PlayerRank\") &&\n\t\tIsDBTableEmpty(\"PermGroup\") &&\n\t\tIsDBTableEmpty(\"RankPermGroup\") &&\n\t\tIsDBTableEmpty(\"PermissionItem\") &&\n\t\tIsDBTableEmpty(\"DefaultRank\")\n\t);\n}\n\n\n\n\n\nbool cRankManager::IsDBTableEmpty(const AString & a_TableName)\n{\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, \"SELECT COUNT(*) FROM \" + a_TableName);\n\t\treturn (stmt.executeStep() && (stmt.getColumn(0).getInt() == 0));\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cRankManager::CreateDefaults(void)\n{\n\t// Wrap everything in a big transaction to speed things up:\n\tcMassChangeLock Lock(*this);\n\n\t// Create ranks:\n\tAddRank(\"Default\",  \"\", \"\", \"\");\n\tAddRank(\"VIP\",      \"\", \"\", \"\");\n\tAddRank(\"Operator\", \"\", \"\", \"\");\n\tAddRank(\"Admin\",    \"\", \"\", \"\");\n\n\t// Create groups:\n\tAddGroup(\"Default\");\n\tAddGroup(\"Kick\");\n\tAddGroup(\"Teleport\");\n\tAddGroup(\"Everything\");\n\n\t// Add groups to ranks:\n\tAddGroupToRank(\"Default\",    \"Default\");\n\tAddGroupToRank(\"Teleport\",   \"VIP\");\n\tAddGroupToRank(\"Teleport\",   \"Operator\");\n\tAddGroupToRank(\"Kick\",       \"Operator\");\n\tAddGroupToRank(\"Everything\", \"Admin\");\n\n\t// Add permissions to groups:\n\tAddPermissionToGroup(\"core.help\",     \"Default\");\n\tAddPermissionToGroup(\"core.build\",    \"Default\");\n\tAddPermissionToGroup(\"core.teleport\", \"Teleport\");\n\tAddPermissionToGroup(\"core.kick\",     \"Kick\");\n\tAddPermissionToGroup(\"*\",             \"Everything\");\n\n\t// Set the default rank:\n\tSetDefaultRank(\"Default\");\n}\n\n\n\n\n\nbool cRankManager::DoesColumnExist(const char * a_TableName, const char * a_ColumnName)\n{\n\ttry\n\t{\n\t\tSQLite::Statement stmt(m_DB, fmt::format(FMT_STRING(\"PRAGMA table_info({})\"), a_TableName));\n\t\twhile (stmt.executeStep())  // Iterate over all table's columns\n\t\t{\n\t\t\tint NumColumns = stmt.getColumnCount();\n\t\t\tfor (int i = 0; i < NumColumns; i++)  // Iterate over all reply's columns (table column's metadata)\n\t\t\t{\n\t\t\t\tauto column = stmt.getColumn(i);\n\t\t\t\tif (strcmp(column.getName(), \"name\") == 0)\n\t\t\t\t{\n\t\t\t\t\tif (NoCaseCompare(column.getText(), a_ColumnName) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Colun found\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}  // for i - stmt.getColumns()\n\t\t}  // while (stmt.executeStep())\n\t}\n\tcatch (const SQLite::Exception & ex)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB: %s\", __FUNCTION__, ex.what());\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cRankManager::CreateColumnIfNotExists(const char * a_TableName, const char * a_ColumnName, const char * a_ColumnType)\n{\n\t// If the column already exists, bail out:\n\tif (DoesColumnExist(a_TableName, a_ColumnName))\n\t{\n\t\treturn;\n\t}\n\n\t// Add the column:\n\ttry\n\t{\n\t\tm_DB.exec(fmt::format(FMT_STRING(\"ALTER TABLE {} ADD COLUMN {} {}\"), a_TableName, a_ColumnName, a_ColumnType));\n\t}\n\tcatch (const SQLite::Exception & exc)\n\t{\n\t\tLOGWARNING(\"%s: Failed to query DB: %s\", __FUNCTION__, exc.what());\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/RankManager.h",
    "content": "\n// RankManager.h\n\n// Declares the cRankManager class that represents the rank manager responsible for assigning permissions and message visuals to players\n\n\n\n\n#pragma once\n\n#include \"SQLiteCpp/Database.h\"\n#include \"SQLiteCpp/Transaction.h\"\n\n\n\n\nclass cUUID;\nclass cMojangAPI;\n\n\n\n\n\nclass cRankManager\n{\npublic:\n\t/** Acquire this lock to perform mass changes.\n\tImproves performance by wrapping everything into a transaction.\n\tMakes sure that no other thread is accessing the DB. */\n\tclass cMassChangeLock\n\t{\n\tpublic:\n\t\tcMassChangeLock(cRankManager & a_RankManager) :\n\t\t\tm_Lock(a_RankManager.m_CS),\n\t\t\tm_Transaction(a_RankManager.m_DB)\n\t\t{\n\t\t}\n\n\t\t~cMassChangeLock()\n\t\t{\n\t\t\tm_Transaction.commit();\n\t\t}\n\n\tprotected:\n\t\tcCSLock m_Lock;\n\t\tSQLite::Transaction m_Transaction;\n\t};\n\n\n\t/** Creates the rank manager. Needs to be initialized before other use. */\n\tcRankManager(void);\n\n\t~cRankManager();\n\n\t/** Initializes the rank manager. Performs migration and default-setting if no data is found in the DB.\n\tThe a_MojangAPI param is used to keep player names in sync with UUIDs, since Mojang allows username changes. */\n\tvoid Initialize(cMojangAPI & a_MojangAPI);\n\n\t/** Returns the name of the rank that the specified player has assigned to them.\n\tIf the player has no rank assigned, returns an empty string (NOT the default rank). */\n\tAString GetPlayerRankName(const cUUID & a_PlayerUUID);\n\n\t/** Returns the last name that the specified player has.\n\tAn empty string is returned if the player isn't in the database. */\n\tAString GetPlayerName(const cUUID & a_PlayerUUID);\n\n\t/** Returns the names of Groups that the specified player has assigned to them. */\n\tAStringVector GetPlayerGroups(const cUUID & a_PlayerUUID);\n\n\t/** Returns the permissions that the specified player has assigned to them.\n\tIf the player has no rank assigned to them, returns the default rank's permissions. */\n\tAStringVector GetPlayerPermissions(const cUUID & a_PlayerUUID);\n\n\t/** Returns the restrictions that the specified player has assigned to them.\n\tIf the player has no rank assigned to them, returns the default rank's restrictions. */\n\tAStringVector GetPlayerRestrictions(const cUUID & a_PlayerUUID);\n\n\t/** Returns the names of groups that the specified rank has assigned to it.\n\tReturns an empty vector if the rank doesn't exist. */\n\tAStringVector GetRankGroups(const AString & a_RankName);\n\n\t/** Returns the permissions that the specified group has assigned to it.\n\tReturns an empty vector if the group doesn't exist. */\n\tAStringVector GetGroupPermissions(const AString & a_GroupName);\n\n\t/** Returns the restrictions that the specified group has assigned to it.\n\tReturns an empty vector if the group doesn't exist. */\n\tAStringVector GetGroupRestrictions(const AString & a_GroupName);\n\n\t/** Returns all permissions that the specified rank has assigned to it, through all its groups.\n\tReturns an empty vector if the rank doesn't exist. Any non-existent groups are ignored. */\n\tAStringVector GetRankPermissions(const AString & a_RankName);\n\n\t/** Returns all restrictions that the specified rank has assigned to it, through all its groups.\n\tReturns an empty vector if the rank doesn't exist. Any non-existent groups are ignored. */\n\tAStringVector GetRankRestrictions(const AString & a_RankName);\n\n\t/** Returns the uuids of all defined players. The returned players are ordered by their name (NOT their UUIDs). */\n\tstd::vector<cUUID> GetAllPlayerUUIDs(void);\n\n\t/** Returns the names of all defined ranks. */\n\tAStringVector GetAllRanks(void);\n\n\t/** Returns the names of all permission groups. */\n\tAStringVector GetAllGroups(void);\n\n\t/** Returns all the distinct permissions that are stored in the DB. */\n\tAStringVector GetAllPermissions(void);\n\n\t/** Returns all the distinct restrictions that are stored in the DB. */\n\tAStringVector GetAllRestrictions(void);\n\n\t/** Returns all the distinct permissions and restrictions that are stored in the DB. */\n\tAStringVector GetAllPermissionsRestrictions(void);\n\n\t/** Returns the message visuals (prefix, postfix, color) for the specified player.\n\tReturns true if the visuals were read from the DB, false if not (player not found etc). */\n\tbool GetPlayerMsgVisuals(\n\t\tconst cUUID & a_PlayerUUID,\n\t\tAString & a_MsgPrefix,\n\t\tAString & a_MsgSuffix,\n\t\tAString & a_MsgNameColorCode\n\t);\n\n\t/** Adds a new rank. No action if the rank already exists. */\n\tvoid AddRank(\n\t\tconst AString & a_RankName,\n\t\tconst AString & a_MsgPrefix,\n\t\tconst AString & a_MsgSuffix,\n\t\tconst AString & a_MsgNameColorCode\n\t);\n\n\t/** Adds a new permission group. No action if such a group already exists. */\n\tvoid AddGroup(const AString & a_GroupName);\n\n\t/** Bulk-adds groups. Group names that already exist are silently skipped. */\n\tvoid AddGroups(const AStringVector & a_GroupNames);\n\n\t/** Adds the specified permission group to the specified rank.\n\tFails if the rank or group names are not found.\n\tReturns true if successful, false on error. */\n\tbool AddGroupToRank(const AString & a_GroupName, const AString & a_RankName);\n\n\t/** Adds the specified permission to the specified permission group.\n\tFails if the permission group name is not found.\n\tReturns true if successful, false on error. */\n\tbool AddPermissionToGroup(const AString & a_Permission, const AString & a_GroupName);\n\n\t/** Adds the specified restriction to the specified group.\n\tFails if the group name is not found.\n\tReturns true if successful, false on error. */\n\tbool AddRestrictionToGroup(const AString & a_Restriction, const AString & a_GroupName);\n\n\t/** Adds the specified permissions to the specified permission group.\n\tFails if the permission group name is not found.\n\tReturns true if successful, false on error. */\n\tbool AddPermissionsToGroup(const AStringVector & a_Permissions, const AString & a_GroupName);\n\n\t/** Adds the specified restrictions to the specified group.\n\tFails if the group name is not found.\n\tReturns true if successful, false on error. */\n\tbool AddRestrictionsToGroup(const AStringVector & a_Restrictions, const AString & a_GroupName);\n\n\t/** Removes the specified rank.\n\tAll players assigned to that rank will be re-assigned to a_ReplacementRankName.\n\tIf a_ReplacementRankName is empty or not a valid rank, the player will be removed from the DB,\n\twhich means they will receive the default rank the next time they are queried.\n\tIf the rank being removed is the default rank, the default will be changed to the replacement\n\trank; the operation fails silently if there's no replacement. */\n\tvoid RemoveRank(const AString & a_RankName, const AString & a_ReplacementRankName);\n\n\t/** Removes the specified group completely.\n\tThe group will first be removed from all ranks using it, and then removed itself. */\n\tvoid RemoveGroup(const AString & a_GroupName);\n\n\t/** Removes the specified group from the specified rank.\n\tThe group will stay defined, even if no rank is using it. */\n\tvoid RemoveGroupFromRank(const AString & a_GroupName, const AString & a_RankName);\n\n\t/** Removes the specified permission from the specified group. */\n\tvoid RemovePermissionFromGroup(const AString & a_Permission, const AString & a_GroupName);\n\n\t/** Removes the specified restriction from the specified group. */\n\tvoid RemoveRestrictionFromGroup(const AString & a_Restriction, const AString & a_GroupName);\n\n\t/** Renames the specified rank. No action if the rank name is not found.\n\tFails if the new name is already used.\n\tUpdates the cached m_DefaultRank if the default rank is being renamed.\n\tReturns true on success, false on failure. */\n\tbool RenameRank(const AString & a_OldName, const AString & a_NewName);\n\n\t/** Renames the specified group. No action if the rank name is not found.\n\tFails if the new name is already used.\n\tReturns true on success, false on failure. */\n\tbool RenameGroup(const AString & a_OldName, const AString & a_NewName);\n\n\t/** Sets the specified player's rank.\n\tIf the player already had rank assigned to them, it is overwritten with the new rank and name.\n\tNote that this doesn't change the cPlayer if the player is already connected, you need to update all the\n\tcPlayer instances manually.\n\tThe PlayerName is provided for reference, so that GetRankPlayerNames() can work. */\n\tvoid SetPlayerRank(const cUUID & a_PlayerUUID, const AString & a_PlayerName, const AString & a_RankName);\n\n\t/** Removes the player's rank assignment. The player is left without a rank.\n\tNote that this doesn't change the cPlayer instances for the already connected players, you need to update\n\tall the instances manually.\n\tNo action if the player has no rank assigned to them already. */\n\tvoid RemovePlayerRank(const cUUID & a_PlayerUUID);\n\n\t/** Sets the message visuals of an existing rank. No action if the rank name is not found. */\n\tvoid SetRankVisuals(\n\t\tconst AString & a_RankName,\n\t\tconst AString & a_MsgPrefix,\n\t\tconst AString & a_MsgSuffix,\n\t\tconst AString & a_MsgNameColorCode\n\t);\n\n\t/** Returns the message visuals of an existing rank.\n\tReturns true if successful, false on error (rank doesn't exist). */\n\tbool GetRankVisuals(\n\t\tconst AString & a_RankName,\n\t\tAString & a_MsgPrefix,\n\t\tAString & a_MsgSuffix,\n\t\tAString & a_MsgNameColorCode\n\t);\n\n\t/** Returns true iff the specified rank exists in the DB. */\n\tbool RankExists(const AString & a_RankName);\n\n\t/** Returns true iff the specified group exists in the DB. */\n\tbool GroupExists(const AString & a_GroupName);\n\n\t/** Returns true iff the specified player has a rank assigned to them in the DB. */\n\tbool IsPlayerRankSet(const cUUID & a_PlayerUUID);\n\n\t/** Returns true iff the specified rank contains the specified group. */\n\tbool IsGroupInRank(const AString & a_GroupName, const AString & a_RankName);\n\n\t/** Returns true iff the specified group contains the specified permission. */\n\tbool IsPermissionInGroup(const AString & a_Permission, const AString & a_GroupName);\n\n\t/** Returns true iff the specified group contains the specified restriction. */\n\tbool IsRestrictionInGroup(const AString & a_Restriction, const AString & a_GroupName);\n\n\t/** Called by cMojangAPI whenever the playername-uuid pairing is discovered. Updates the DB. */\n\tvoid NotifyNameUUID(const AString & a_PlayerName, const cUUID & a_UUID);\n\n\t/** Sets the specified rank as the default rank.\n\tReturns true on success, false on failure (rank not found). */\n\tbool SetDefaultRank(const AString & a_RankName);\n\n\t/** Returns the name of the default rank. */\n\tconst AString & GetDefaultRank(void) const { return m_DefaultRank; }\n\n\t/** Removes all player ranks from the database. Note that this doesn't change the cPlayer instances\n\tfor the already connected players, you need to update all the instances manually. */\n\tvoid ClearPlayerRanks(void);\n\n\t/** Updates the playername that is saved with this uuid. Returns false if a error occurred */\n\tbool UpdatePlayerName(const cUUID & a_PlayerUUID, const AString & a_NewPlayerName);\n\nprotected:\n\n\t/** The database storage for all the data. Protected by m_CS. */\n\tSQLite::Database m_DB;\n\n\t/** The name of the default rank. Kept as a cache so that queries for it don't need to go through the DB. */\n\tAString m_DefaultRank;\n\n\t/** The mutex protecting m_DB and m_DefaultRank against multi-threaded access. */\n\tcCriticalSection m_CS;\n\n\t/** Set to true once the manager is initialized. */\n\tbool m_IsInitialized;\n\n\t/** Returns true if all the DB tables are empty, indicating a fresh new install. */\n\tbool AreDBTablesEmpty(void);\n\n\t/** Returns true iff the specified DB table is empty.\n\tIf there's an error while querying, returns false. */\n\tbool IsDBTableEmpty(const AString & a_TableName);\n\n\t/** Creates a default set of ranks / groups / permissions. */\n\tvoid CreateDefaults(void);\n\n\t/** Returns true if the specified column exists in the specified table. */\n\tbool DoesColumnExist(const char * a_TableName, const char * a_ColumnName);\n\n\t/** If the specified table doesn't contain the specified column, it is added to the table.\n\tThe column type is used only when creating the column, it is not used when checking for existence. */\n\tvoid CreateColumnIfNotExists(const char * a_TableName, const char * a_ColumnName, const char * a_ColumnType = \"\");\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Registries/BlockStates.cpp",
    "content": "#include \"BlockStates.h\"\n\nnamespace Block\n{\n\tnamespace AcaciaButton\n\t{\n\t\tBlockState AcaciaButton()\n\t\t{\n\t\t\treturn 6451;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6458: case 6459: case 6460: case 6461: case 6462: case 6463: case 6464: case 6465: return Face::Ceiling;\n\t\t\t\tcase 6442: case 6443: case 6444: case 6445: case 6446: case 6447: case 6448: case 6449: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6446: case 6447: case 6454: case 6455: case 6462: case 6463: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6448: case 6449: case 6456: case 6457: case 6464: case 6465: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6442: case 6443: case 6450: case 6451: case 6458: case 6459: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6443: case 6445: case 6447: case 6449: case 6451: case 6453: case 6455: case 6457: case 6459: case 6461: case 6463: case 6465: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaDoor\n\t{\n\t\tBlockState AcaciaDoor()\n\t\t{\n\t\t\treturn 8941;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8962: case 8963: case 8964: case 8965: case 8966: case 8967: case 8968: case 8969: case 8970: case 8971: case 8972: case 8973: case 8974: case 8975: case 8976: case 8977: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8978: case 8979: case 8980: case 8981: case 8982: case 8983: case 8984: case 8985: case 8986: case 8987: case 8988: case 8989: case 8990: case 8991: case 8992: case 8993: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8930: case 8931: case 8932: case 8933: case 8934: case 8935: case 8936: case 8937: case 8938: case 8939: case 8940: case 8941: case 8942: case 8943: case 8944: case 8945: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8938: case 8939: case 8940: case 8941: case 8942: case 8943: case 8944: case 8945: case 8954: case 8955: case 8956: case 8957: case 8958: case 8959: case 8960: case 8961: case 8970: case 8971: case 8972: case 8973: case 8974: case 8975: case 8976: case 8977: case 8986: case 8987: case 8988: case 8989: case 8990: case 8991: case 8992: case 8993: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8930: case 8931: case 8932: case 8933: case 8938: case 8939: case 8940: case 8941: case 8946: case 8947: case 8948: case 8949: case 8954: case 8955: case 8956: case 8957: case 8962: case 8963: case 8964: case 8965: case 8970: case 8971: case 8972: case 8973: case 8978: case 8979: case 8980: case 8981: case 8986: case 8987: case 8988: case 8989: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8932: case 8933: case 8936: case 8937: case 8940: case 8941: case 8944: case 8945: case 8948: case 8949: case 8952: case 8953: case 8956: case 8957: case 8960: case 8961: case 8964: case 8965: case 8968: case 8969: case 8972: case 8973: case 8976: case 8977: case 8980: case 8981: case 8984: case 8985: case 8988: case 8989: case 8992: case 8993: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8931: case 8933: case 8935: case 8937: case 8939: case 8941: case 8943: case 8945: case 8947: case 8949: case 8951: case 8953: case 8955: case 8957: case 8959: case 8961: case 8963: case 8965: case 8967: case 8969: case 8971: case 8973: case 8975: case 8977: case 8979: case 8981: case 8983: case 8985: case 8987: case 8989: case 8991: case 8993: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaFence\n\t{\n\t\tBlockState AcaciaFence()\n\t\t{\n\t\t\treturn 8705;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8692: case 8693: case 8696: case 8697: case 8700: case 8701: case 8704: case 8705: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8684: case 8685: case 8688: case 8689: case 8700: case 8701: case 8704: case 8705: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8680: case 8681: case 8688: case 8689: case 8696: case 8697: case 8704: case 8705: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8677: case 8681: case 8685: case 8689: case 8693: case 8697: case 8701: case 8705: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaFenceGate\n\t{\n\t\tBlockState AcaciaFenceGate()\n\t\t{\n\t\t\treturn 8521;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8530: case 8531: case 8532: case 8533: case 8534: case 8535: case 8536: case 8537: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8538: case 8539: case 8540: case 8541: case 8542: case 8543: case 8544: case 8545: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8514: case 8515: case 8516: case 8517: case 8518: case 8519: case 8520: case 8521: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool InWall(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8518: case 8519: case 8520: case 8521: case 8526: case 8527: case 8528: case 8529: case 8534: case 8535: case 8536: case 8537: case 8542: case 8543: case 8544: case 8545: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8516: case 8517: case 8520: case 8521: case 8524: case 8525: case 8528: case 8529: case 8532: case 8533: case 8536: case 8537: case 8540: case 8541: case 8544: case 8545: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8515: case 8517: case 8519: case 8521: case 8523: case 8525: case 8527: case 8529: case 8531: case 8533: case 8535: case 8537: case 8539: case 8541: case 8543: case 8545: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaLeaves\n\t{\n\t\tBlockState AcaciaLeaves()\n\t\t{\n\t\t\treturn 214;\n\t\t}\n\t\tunsigned char Distance(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 201: case 202: return 1;\n\t\t\t\tcase 203: case 204: return 2;\n\t\t\t\tcase 205: case 206: return 3;\n\t\t\t\tcase 207: case 208: return 4;\n\t\t\t\tcase 209: case 210: return 5;\n\t\t\t\tcase 211: case 212: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t\tbool Persistent(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 202: case 204: case 206: case 208: case 210: case 212: case 214: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaLog\n\t{\n\t\tBlockState AcaciaLog()\n\t\t{\n\t\t\treturn 86;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 85: return Axis::X;\n\t\t\t\tcase 86: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaPlanks\n\t{\n\t}\n\tnamespace AcaciaPressurePlate\n\t{\n\t\tBlockState AcaciaPressurePlate()\n\t\t{\n\t\t\treturn 3882;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3882: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaSapling\n\t{\n\t\tBlockState AcaciaSapling()\n\t\t{\n\t\t\treturn 29;\n\t\t}\n\t\tunsigned char Stage(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 29: return 0;\n\t\t\t\tdefault: return 1;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaSign\n\t{\n\t\tBlockState AcaciaSign()\n\t\t{\n\t\t\treturn 3478;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3478: return 0;\n\t\t\t\tcase 3480: return 1;\n\t\t\t\tcase 3498: return 10;\n\t\t\t\tcase 3500: return 11;\n\t\t\t\tcase 3502: return 12;\n\t\t\t\tcase 3504: return 13;\n\t\t\t\tcase 3506: return 14;\n\t\t\t\tcase 3508: return 15;\n\t\t\t\tcase 3482: return 2;\n\t\t\t\tcase 3484: return 3;\n\t\t\t\tcase 3486: return 4;\n\t\t\t\tcase 3488: return 5;\n\t\t\t\tcase 3490: return 6;\n\t\t\t\tcase 3492: return 7;\n\t\t\t\tcase 3494: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaSlab\n\t{\n\t\tBlockState AcaciaSlab()\n\t\t{\n\t\t\treturn 8327;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8327: return Type::Bottom;\n\t\t\t\tcase 8329: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaStairs\n\t{\n\t\tBlockState AcaciaStairs()\n\t\t{\n\t\t\treturn 7386;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7416: case 7418: case 7420: case 7422: case 7424: case 7426: case 7428: case 7430: case 7432: case 7434: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 7436: case 7438: case 7440: case 7442: case 7444: case 7446: case 7448: case 7450: case 7452: case 7454: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 7376: case 7378: case 7380: case 7382: case 7384: case 7386: case 7388: case 7390: case 7392: case 7394: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7386: case 7388: case 7390: case 7392: case 7394: case 7406: case 7408: case 7410: case 7412: case 7414: case 7426: case 7428: case 7430: case 7432: case 7434: case 7446: case 7448: case 7450: case 7452: case 7454: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7378: case 7388: case 7398: case 7408: case 7418: case 7428: case 7438: case 7448: return Shape::InnerLeft;\n\t\t\t\tcase 7380: case 7390: case 7400: case 7410: case 7420: case 7430: case 7440: case 7450: return Shape::InnerRight;\n\t\t\t\tcase 7382: case 7392: case 7402: case 7412: case 7422: case 7432: case 7442: case 7452: return Shape::OuterLeft;\n\t\t\t\tcase 7384: case 7394: case 7404: case 7414: case 7424: case 7434: case 7444: case 7454: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaTrapdoor\n\t{\n\t\tBlockState AcaciaTrapdoor()\n\t\t{\n\t\t\treturn 4382;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4400: case 4402: case 4404: case 4406: case 4408: case 4410: case 4412: case 4414: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4416: case 4418: case 4420: case 4422: case 4424: case 4426: case 4428: case 4430: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4368: case 4370: case 4372: case 4374: case 4376: case 4378: case 4380: case 4382: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4376: case 4378: case 4380: case 4382: case 4392: case 4394: case 4396: case 4398: case 4408: case 4410: case 4412: case 4414: case 4424: case 4426: case 4428: case 4430: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4372: case 4374: case 4380: case 4382: case 4388: case 4390: case 4396: case 4398: case 4404: case 4406: case 4412: case 4414: case 4420: case 4422: case 4428: case 4430: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4370: case 4374: case 4378: case 4382: case 4386: case 4390: case 4394: case 4398: case 4402: case 4406: case 4410: case 4414: case 4418: case 4422: case 4426: case 4430: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaWallSign\n\t{\n\t\tBlockState AcaciaWallSign()\n\t\t{\n\t\t\treturn 3760;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3764: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3766: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3760: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AcaciaWood\n\t{\n\t\tBlockState AcaciaWood()\n\t\t{\n\t\t\treturn 122;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 121: return Axis::X;\n\t\t\t\tcase 122: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace ActivatorRail\n\t{\n\t\tBlockState ActivatorRail()\n\t\t{\n\t\t\treturn 6829;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6829: case 6830: case 6831: case 6832: case 6833: case 6834: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6825: case 6831: return Shape::AscendingEast;\n\t\t\t\tcase 6827: case 6833: return Shape::AscendingNorth;\n\t\t\t\tcase 6828: case 6834: return Shape::AscendingSouth;\n\t\t\t\tcase 6826: case 6832: return Shape::AscendingWest;\n\t\t\t\tcase 6824: case 6830: return Shape::EastWest;\n\t\t\t\tdefault: return Shape::NorthSouth;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Air\n\t{\n\t}\n\tnamespace Allium\n\t{\n\t}\n\tnamespace AncientDebris\n\t{\n\t}\n\tnamespace Andesite\n\t{\n\t}\n\tnamespace AndesiteSlab\n\t{\n\t\tBlockState AndesiteSlab()\n\t\t{\n\t\t\treturn 10846;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10846: return Type::Bottom;\n\t\t\t\tcase 10848: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AndesiteStairs\n\t{\n\t\tBlockState AndesiteStairs()\n\t\t{\n\t\t\treturn 10480;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10510: case 10512: case 10514: case 10516: case 10518: case 10520: case 10522: case 10524: case 10526: case 10528: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10530: case 10532: case 10534: case 10536: case 10538: case 10540: case 10542: case 10544: case 10546: case 10548: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10470: case 10472: case 10474: case 10476: case 10478: case 10480: case 10482: case 10484: case 10486: case 10488: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10480: case 10482: case 10484: case 10486: case 10488: case 10500: case 10502: case 10504: case 10506: case 10508: case 10520: case 10522: case 10524: case 10526: case 10528: case 10540: case 10542: case 10544: case 10546: case 10548: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10472: case 10482: case 10492: case 10502: case 10512: case 10522: case 10532: case 10542: return Shape::InnerLeft;\n\t\t\t\tcase 10474: case 10484: case 10494: case 10504: case 10514: case 10524: case 10534: case 10544: return Shape::InnerRight;\n\t\t\t\tcase 10476: case 10486: case 10496: case 10506: case 10516: case 10526: case 10536: case 10546: return Shape::OuterLeft;\n\t\t\t\tcase 10478: case 10488: case 10498: case 10508: case 10518: case 10528: case 10538: case 10548: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AndesiteWall\n\t{\n\t\tBlockState AndesiteWall()\n\t\t{\n\t\t\treturn 13138;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13246: case 13247: case 13248: case 13252: case 13253: case 13254: case 13258: case 13259: case 13260: case 13264: case 13265: case 13266: case 13270: case 13271: case 13272: case 13276: case 13277: case 13278: case 13282: case 13283: case 13284: case 13288: case 13289: case 13290: case 13294: case 13295: case 13296: case 13300: case 13301: case 13302: case 13306: case 13307: case 13308: case 13312: case 13313: case 13314: case 13318: case 13319: case 13320: case 13324: case 13325: case 13326: case 13330: case 13331: case 13332: case 13336: case 13337: case 13338: case 13342: case 13343: case 13344: case 13348: case 13349: case 13350: return East::Low;\n\t\t\t\tcase 13138: case 13139: case 13140: case 13144: case 13145: case 13146: case 13150: case 13151: case 13152: case 13156: case 13157: case 13158: case 13162: case 13163: case 13164: case 13168: case 13169: case 13170: case 13174: case 13175: case 13176: case 13180: case 13181: case 13182: case 13186: case 13187: case 13188: case 13192: case 13193: case 13194: case 13198: case 13199: case 13200: case 13204: case 13205: case 13206: case 13210: case 13211: case 13212: case 13216: case 13217: case 13218: case 13222: case 13223: case 13224: case 13228: case 13229: case 13230: case 13234: case 13235: case 13236: case 13240: case 13241: case 13242: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13174: case 13175: case 13176: case 13180: case 13181: case 13182: case 13186: case 13187: case 13188: case 13192: case 13193: case 13194: case 13198: case 13199: case 13200: case 13204: case 13205: case 13206: case 13282: case 13283: case 13284: case 13288: case 13289: case 13290: case 13294: case 13295: case 13296: case 13300: case 13301: case 13302: case 13306: case 13307: case 13308: case 13312: case 13313: case 13314: case 13390: case 13391: case 13392: case 13396: case 13397: case 13398: case 13402: case 13403: case 13404: case 13408: case 13409: case 13410: case 13414: case 13415: case 13416: case 13420: case 13421: case 13422: return North::Low;\n\t\t\t\tcase 13138: case 13139: case 13140: case 13144: case 13145: case 13146: case 13150: case 13151: case 13152: case 13156: case 13157: case 13158: case 13162: case 13163: case 13164: case 13168: case 13169: case 13170: case 13246: case 13247: case 13248: case 13252: case 13253: case 13254: case 13258: case 13259: case 13260: case 13264: case 13265: case 13266: case 13270: case 13271: case 13272: case 13276: case 13277: case 13278: case 13354: case 13355: case 13356: case 13360: case 13361: case 13362: case 13366: case 13367: case 13368: case 13372: case 13373: case 13374: case 13378: case 13379: case 13380: case 13384: case 13385: case 13386: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13150: case 13151: case 13152: case 13156: case 13157: case 13158: case 13186: case 13187: case 13188: case 13192: case 13193: case 13194: case 13222: case 13223: case 13224: case 13228: case 13229: case 13230: case 13258: case 13259: case 13260: case 13264: case 13265: case 13266: case 13294: case 13295: case 13296: case 13300: case 13301: case 13302: case 13330: case 13331: case 13332: case 13336: case 13337: case 13338: case 13366: case 13367: case 13368: case 13372: case 13373: case 13374: case 13402: case 13403: case 13404: case 13408: case 13409: case 13410: case 13438: case 13439: case 13440: case 13444: case 13445: case 13446: return South::Low;\n\t\t\t\tcase 13138: case 13139: case 13140: case 13144: case 13145: case 13146: case 13174: case 13175: case 13176: case 13180: case 13181: case 13182: case 13210: case 13211: case 13212: case 13216: case 13217: case 13218: case 13246: case 13247: case 13248: case 13252: case 13253: case 13254: case 13282: case 13283: case 13284: case 13288: case 13289: case 13290: case 13318: case 13319: case 13320: case 13324: case 13325: case 13326: case 13354: case 13355: case 13356: case 13360: case 13361: case 13362: case 13390: case 13391: case 13392: case 13396: case 13397: case 13398: case 13426: case 13427: case 13428: case 13432: case 13433: case 13434: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13144: case 13145: case 13146: case 13156: case 13157: case 13158: case 13168: case 13169: case 13170: case 13180: case 13181: case 13182: case 13192: case 13193: case 13194: case 13204: case 13205: case 13206: case 13216: case 13217: case 13218: case 13228: case 13229: case 13230: case 13240: case 13241: case 13242: case 13252: case 13253: case 13254: case 13264: case 13265: case 13266: case 13276: case 13277: case 13278: case 13288: case 13289: case 13290: case 13300: case 13301: case 13302: case 13312: case 13313: case 13314: case 13324: case 13325: case 13326: case 13336: case 13337: case 13338: case 13348: case 13349: case 13350: case 13360: case 13361: case 13362: case 13372: case 13373: case 13374: case 13384: case 13385: case 13386: case 13396: case 13397: case 13398: case 13408: case 13409: case 13410: case 13420: case 13421: case 13422: case 13432: case 13433: case 13434: case 13444: case 13445: case 13446: case 13456: case 13457: case 13458: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13139: case 13145: case 13151: case 13157: case 13163: case 13169: case 13175: case 13181: case 13187: case 13193: case 13199: case 13205: case 13211: case 13217: case 13223: case 13229: case 13235: case 13241: case 13247: case 13253: case 13259: case 13265: case 13271: case 13277: case 13283: case 13289: case 13295: case 13301: case 13307: case 13313: case 13319: case 13325: case 13331: case 13337: case 13343: case 13349: case 13355: case 13361: case 13367: case 13373: case 13379: case 13385: case 13391: case 13397: case 13403: case 13409: case 13415: case 13421: case 13427: case 13433: case 13439: case 13445: case 13451: case 13457: return West::Low;\n\t\t\t\tcase 13138: case 13144: case 13150: case 13156: case 13162: case 13168: case 13174: case 13180: case 13186: case 13192: case 13198: case 13204: case 13210: case 13216: case 13222: case 13228: case 13234: case 13240: case 13246: case 13252: case 13258: case 13264: case 13270: case 13276: case 13282: case 13288: case 13294: case 13300: case 13306: case 13312: case 13318: case 13324: case 13330: case 13336: case 13342: case 13348: case 13354: case 13360: case 13366: case 13372: case 13378: case 13384: case 13390: case 13396: case 13402: case 13408: case 13414: case 13420: case 13426: case 13432: case 13438: case 13444: case 13450: case 13456: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Anvil\n\t{\n\t\tBlockState Anvil()\n\t\t{\n\t\t\treturn 6610;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6612: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6613: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6610: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AttachedMelonStem\n\t{\n\t\tBlockState AttachedMelonStem()\n\t\t{\n\t\t\treturn 4768;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4770: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4771: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4768: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AttachedPumpkinStem\n\t{\n\t\tBlockState AttachedPumpkinStem()\n\t\t{\n\t\t\treturn 4764;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4766: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4767: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4764: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace AzureBluet\n\t{\n\t}\n\tnamespace Bamboo\n\t{\n\t\tBlockState Bamboo()\n\t\t{\n\t\t\treturn 9652;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9652: case 9653: case 9654: case 9655: case 9656: case 9657: return 0;\n\t\t\t\tdefault: return 1;\n\t\t\t}\n\t\t}\n\t\tenum Leaves Leaves(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9656: case 9657: case 9662: case 9663: return Leaves::Large;\n\t\t\t\tcase 9652: case 9653: case 9658: case 9659: return Leaves::None;\n\t\t\t\tdefault: return Leaves::Small;\n\t\t\t}\n\t\t}\n\t\tunsigned char Stage(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9652: case 9654: case 9656: case 9658: case 9660: case 9662: return 0;\n\t\t\t\tdefault: return 1;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BambooSapling\n\t{\n\t}\n\tnamespace Barrel\n\t{\n\t\tBlockState Barrel()\n\t\t{\n\t\t\treturn 14792;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14797: case 14798: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14793: case 14794: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14801: case 14802: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 14799: case 14800: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 14791: case 14792: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14792: case 14794: case 14796: case 14798: case 14800: case 14802: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Barrier\n\t{\n\t}\n\tnamespace Basalt\n\t{\n\t\tBlockState Basalt()\n\t\t{\n\t\t\treturn 4003;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4002: return Axis::X;\n\t\t\t\tcase 4003: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Beacon\n\t{\n\t}\n\tnamespace Bedrock\n\t{\n\t}\n\tnamespace BeeNest\n\t{\n\t\tBlockState BeeNest()\n\t\t{\n\t\t\treturn 15776;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15788: case 15789: case 15790: case 15791: case 15792: case 15793: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15794: case 15795: case 15796: case 15797: case 15798: case 15799: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15776: case 15777: case 15778: case 15779: case 15780: case 15781: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tunsigned char HoneyLevel(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15776: case 15782: case 15788: case 15794: return 0;\n\t\t\t\tcase 15777: case 15783: case 15789: case 15795: return 1;\n\t\t\t\tcase 15778: case 15784: case 15790: case 15796: return 2;\n\t\t\t\tcase 15779: case 15785: case 15791: case 15797: return 3;\n\t\t\t\tcase 15780: case 15786: case 15792: case 15798: return 4;\n\t\t\t\tdefault: return 5;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Beehive\n\t{\n\t\tBlockState Beehive()\n\t\t{\n\t\t\treturn 15800;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15812: case 15813: case 15814: case 15815: case 15816: case 15817: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15818: case 15819: case 15820: case 15821: case 15822: case 15823: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15800: case 15801: case 15802: case 15803: case 15804: case 15805: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tunsigned char HoneyLevel(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15800: case 15806: case 15812: case 15818: return 0;\n\t\t\t\tcase 15801: case 15807: case 15813: case 15819: return 1;\n\t\t\t\tcase 15802: case 15808: case 15814: case 15820: return 2;\n\t\t\t\tcase 15803: case 15809: case 15815: case 15821: return 3;\n\t\t\t\tcase 15804: case 15810: case 15816: case 15822: return 4;\n\t\t\t\tdefault: return 5;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Beetroots\n\t{\n\t\tBlockState Beetroots()\n\t\t{\n\t\t\treturn 9219;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9219: return 0;\n\t\t\t\tcase 9220: return 1;\n\t\t\t\tcase 9221: return 2;\n\t\t\t\tdefault: return 3;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Bell\n\t{\n\t\tBlockState Bell()\n\t\t{\n\t\t\treturn 14855;\n\t\t}\n\t\tenum Attachment Attachment(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14862: case 14863: case 14864: case 14865: case 14866: case 14867: case 14868: case 14869: return Attachment::Ceiling;\n\t\t\t\tcase 14878: case 14879: case 14880: case 14881: case 14882: case 14883: case 14884: case 14885: return Attachment::DoubleWall;\n\t\t\t\tcase 14854: case 14855: case 14856: case 14857: case 14858: case 14859: case 14860: case 14861: return Attachment::Floor;\n\t\t\t\tdefault: return Attachment::SingleWall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14858: case 14859: case 14866: case 14867: case 14874: case 14875: case 14882: case 14883: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14860: case 14861: case 14868: case 14869: case 14876: case 14877: case 14884: case 14885: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14854: case 14855: case 14862: case 14863: case 14870: case 14871: case 14878: case 14879: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14855: case 14857: case 14859: case 14861: case 14863: case 14865: case 14867: case 14869: case 14871: case 14873: case 14875: case 14877: case 14879: case 14881: case 14883: case 14885: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchButton\n\t{\n\t\tBlockState BirchButton()\n\t\t{\n\t\t\treturn 6403;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6410: case 6411: case 6412: case 6413: case 6414: case 6415: case 6416: case 6417: return Face::Ceiling;\n\t\t\t\tcase 6394: case 6395: case 6396: case 6397: case 6398: case 6399: case 6400: case 6401: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6398: case 6399: case 6406: case 6407: case 6414: case 6415: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6400: case 6401: case 6408: case 6409: case 6416: case 6417: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6394: case 6395: case 6402: case 6403: case 6410: case 6411: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6395: case 6397: case 6399: case 6401: case 6403: case 6405: case 6407: case 6409: case 6411: case 6413: case 6415: case 6417: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchDoor\n\t{\n\t\tBlockState BirchDoor()\n\t\t{\n\t\t\treturn 8813;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8834: case 8835: case 8836: case 8837: case 8838: case 8839: case 8840: case 8841: case 8842: case 8843: case 8844: case 8845: case 8846: case 8847: case 8848: case 8849: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8850: case 8851: case 8852: case 8853: case 8854: case 8855: case 8856: case 8857: case 8858: case 8859: case 8860: case 8861: case 8862: case 8863: case 8864: case 8865: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8802: case 8803: case 8804: case 8805: case 8806: case 8807: case 8808: case 8809: case 8810: case 8811: case 8812: case 8813: case 8814: case 8815: case 8816: case 8817: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8810: case 8811: case 8812: case 8813: case 8814: case 8815: case 8816: case 8817: case 8826: case 8827: case 8828: case 8829: case 8830: case 8831: case 8832: case 8833: case 8842: case 8843: case 8844: case 8845: case 8846: case 8847: case 8848: case 8849: case 8858: case 8859: case 8860: case 8861: case 8862: case 8863: case 8864: case 8865: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8802: case 8803: case 8804: case 8805: case 8810: case 8811: case 8812: case 8813: case 8818: case 8819: case 8820: case 8821: case 8826: case 8827: case 8828: case 8829: case 8834: case 8835: case 8836: case 8837: case 8842: case 8843: case 8844: case 8845: case 8850: case 8851: case 8852: case 8853: case 8858: case 8859: case 8860: case 8861: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8804: case 8805: case 8808: case 8809: case 8812: case 8813: case 8816: case 8817: case 8820: case 8821: case 8824: case 8825: case 8828: case 8829: case 8832: case 8833: case 8836: case 8837: case 8840: case 8841: case 8844: case 8845: case 8848: case 8849: case 8852: case 8853: case 8856: case 8857: case 8860: case 8861: case 8864: case 8865: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8803: case 8805: case 8807: case 8809: case 8811: case 8813: case 8815: case 8817: case 8819: case 8821: case 8823: case 8825: case 8827: case 8829: case 8831: case 8833: case 8835: case 8837: case 8839: case 8841: case 8843: case 8845: case 8847: case 8849: case 8851: case 8853: case 8855: case 8857: case 8859: case 8861: case 8863: case 8865: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchFence\n\t{\n\t\tBlockState BirchFence()\n\t\t{\n\t\t\treturn 8641;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8628: case 8629: case 8632: case 8633: case 8636: case 8637: case 8640: case 8641: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8620: case 8621: case 8624: case 8625: case 8636: case 8637: case 8640: case 8641: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8616: case 8617: case 8624: case 8625: case 8632: case 8633: case 8640: case 8641: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8613: case 8617: case 8621: case 8625: case 8629: case 8633: case 8637: case 8641: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchFenceGate\n\t{\n\t\tBlockState BirchFenceGate()\n\t\t{\n\t\t\treturn 8457;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8466: case 8467: case 8468: case 8469: case 8470: case 8471: case 8472: case 8473: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8474: case 8475: case 8476: case 8477: case 8478: case 8479: case 8480: case 8481: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8450: case 8451: case 8452: case 8453: case 8454: case 8455: case 8456: case 8457: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool InWall(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8454: case 8455: case 8456: case 8457: case 8462: case 8463: case 8464: case 8465: case 8470: case 8471: case 8472: case 8473: case 8478: case 8479: case 8480: case 8481: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8452: case 8453: case 8456: case 8457: case 8460: case 8461: case 8464: case 8465: case 8468: case 8469: case 8472: case 8473: case 8476: case 8477: case 8480: case 8481: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8451: case 8453: case 8455: case 8457: case 8459: case 8461: case 8463: case 8465: case 8467: case 8469: case 8471: case 8473: case 8475: case 8477: case 8479: case 8481: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchLeaves\n\t{\n\t\tBlockState BirchLeaves()\n\t\t{\n\t\t\treturn 186;\n\t\t}\n\t\tunsigned char Distance(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 173: case 174: return 1;\n\t\t\t\tcase 175: case 176: return 2;\n\t\t\t\tcase 177: case 178: return 3;\n\t\t\t\tcase 179: case 180: return 4;\n\t\t\t\tcase 181: case 182: return 5;\n\t\t\t\tcase 183: case 184: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t\tbool Persistent(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 174: case 176: case 178: case 180: case 182: case 184: case 186: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchLog\n\t{\n\t\tBlockState BirchLog()\n\t\t{\n\t\t\treturn 80;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 79: return Axis::X;\n\t\t\t\tcase 80: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchPlanks\n\t{\n\t}\n\tnamespace BirchPressurePlate\n\t{\n\t\tBlockState BirchPressurePlate()\n\t\t{\n\t\t\treturn 3878;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3878: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchSapling\n\t{\n\t\tBlockState BirchSapling()\n\t\t{\n\t\t\treturn 25;\n\t\t}\n\t\tunsigned char Stage(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 25: return 0;\n\t\t\t\tdefault: return 1;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchSign\n\t{\n\t\tBlockState BirchSign()\n\t\t{\n\t\t\treturn 3446;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3446: return 0;\n\t\t\t\tcase 3448: return 1;\n\t\t\t\tcase 3466: return 10;\n\t\t\t\tcase 3468: return 11;\n\t\t\t\tcase 3470: return 12;\n\t\t\t\tcase 3472: return 13;\n\t\t\t\tcase 3474: return 14;\n\t\t\t\tcase 3476: return 15;\n\t\t\t\tcase 3450: return 2;\n\t\t\t\tcase 3452: return 3;\n\t\t\t\tcase 3454: return 4;\n\t\t\t\tcase 3456: return 5;\n\t\t\t\tcase 3458: return 6;\n\t\t\t\tcase 3460: return 7;\n\t\t\t\tcase 3462: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchSlab\n\t{\n\t\tBlockState BirchSlab()\n\t\t{\n\t\t\treturn 8315;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8315: return Type::Bottom;\n\t\t\t\tcase 8317: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchStairs\n\t{\n\t\tBlockState BirchStairs()\n\t\t{\n\t\t\treturn 5495;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5525: case 5527: case 5529: case 5531: case 5533: case 5535: case 5537: case 5539: case 5541: case 5543: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5545: case 5547: case 5549: case 5551: case 5553: case 5555: case 5557: case 5559: case 5561: case 5563: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5485: case 5487: case 5489: case 5491: case 5493: case 5495: case 5497: case 5499: case 5501: case 5503: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5495: case 5497: case 5499: case 5501: case 5503: case 5515: case 5517: case 5519: case 5521: case 5523: case 5535: case 5537: case 5539: case 5541: case 5543: case 5555: case 5557: case 5559: case 5561: case 5563: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5487: case 5497: case 5507: case 5517: case 5527: case 5537: case 5547: case 5557: return Shape::InnerLeft;\n\t\t\t\tcase 5489: case 5499: case 5509: case 5519: case 5529: case 5539: case 5549: case 5559: return Shape::InnerRight;\n\t\t\t\tcase 5491: case 5501: case 5511: case 5521: case 5531: case 5541: case 5551: case 5561: return Shape::OuterLeft;\n\t\t\t\tcase 5493: case 5503: case 5513: case 5523: case 5533: case 5543: case 5553: case 5563: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchTrapdoor\n\t{\n\t\tBlockState BirchTrapdoor()\n\t\t{\n\t\t\treturn 4254;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4272: case 4274: case 4276: case 4278: case 4280: case 4282: case 4284: case 4286: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4288: case 4290: case 4292: case 4294: case 4296: case 4298: case 4300: case 4302: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4240: case 4242: case 4244: case 4246: case 4248: case 4250: case 4252: case 4254: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4248: case 4250: case 4252: case 4254: case 4264: case 4266: case 4268: case 4270: case 4280: case 4282: case 4284: case 4286: case 4296: case 4298: case 4300: case 4302: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4244: case 4246: case 4252: case 4254: case 4260: case 4262: case 4268: case 4270: case 4276: case 4278: case 4284: case 4286: case 4292: case 4294: case 4300: case 4302: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4242: case 4246: case 4250: case 4254: case 4258: case 4262: case 4266: case 4270: case 4274: case 4278: case 4282: case 4286: case 4290: case 4294: case 4298: case 4302: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchWallSign\n\t{\n\t\tBlockState BirchWallSign()\n\t\t{\n\t\t\treturn 3752;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3756: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3758: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3752: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BirchWood\n\t{\n\t\tBlockState BirchWood()\n\t\t{\n\t\t\treturn 116;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 115: return Axis::X;\n\t\t\t\tcase 116: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackBanner\n\t{\n\t\tBlockState BlackBanner()\n\t\t{\n\t\t\treturn 8137;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8137: return 0;\n\t\t\t\tcase 8138: return 1;\n\t\t\t\tcase 8147: return 10;\n\t\t\t\tcase 8148: return 11;\n\t\t\t\tcase 8149: return 12;\n\t\t\t\tcase 8150: return 13;\n\t\t\t\tcase 8151: return 14;\n\t\t\t\tcase 8152: return 15;\n\t\t\t\tcase 8139: return 2;\n\t\t\t\tcase 8140: return 3;\n\t\t\t\tcase 8141: return 4;\n\t\t\t\tcase 8142: return 5;\n\t\t\t\tcase 8143: return 6;\n\t\t\t\tcase 8144: return 7;\n\t\t\t\tcase 8145: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackBed\n\t{\n\t\tBlockState BlackBed()\n\t\t{\n\t\t\treturn 1292;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1297: case 1298: case 1299: case 1300: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1301: case 1302: case 1303: case 1304: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1289: case 1290: case 1291: case 1292: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1291: case 1292: case 1295: case 1296: case 1299: case 1300: case 1303: case 1304: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1290: case 1292: case 1294: case 1296: case 1298: case 1300: case 1302: case 1304: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackCarpet\n\t{\n\t}\n\tnamespace BlackConcrete\n\t{\n\t}\n\tnamespace BlackConcretePowder\n\t{\n\t}\n\tnamespace BlackGlazedTerracotta\n\t{\n\t\tBlockState BlackGlazedTerracotta()\n\t\t{\n\t\t\treturn 9434;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9436: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9437: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9434: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackShulkerBox\n\t{\n\t\tBlockState BlackShulkerBox()\n\t\t{\n\t\t\treturn 9372;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9371: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9369: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9373: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9372: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9368: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackStainedGlass\n\t{\n\t}\n\tnamespace BlackStainedGlassPane\n\t{\n\t\tBlockState BlackStainedGlassPane()\n\t\t{\n\t\t\treturn 7374;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7361: case 7362: case 7365: case 7366: case 7369: case 7370: case 7373: case 7374: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7353: case 7354: case 7357: case 7358: case 7369: case 7370: case 7373: case 7374: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7349: case 7350: case 7357: case 7358: case 7365: case 7366: case 7373: case 7374: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7346: case 7350: case 7354: case 7358: case 7362: case 7366: case 7370: case 7374: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackTerracotta\n\t{\n\t}\n\tnamespace BlackWallBanner\n\t{\n\t\tBlockState BlackWallBanner()\n\t\t{\n\t\t\treturn 8213;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8215: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8216: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8213: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackWool\n\t{\n\t}\n\tnamespace Blackstone\n\t{\n\t}\n\tnamespace BlackstoneSlab\n\t{\n\t\tBlockState BlackstoneSlab()\n\t\t{\n\t\t\treturn 16247;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16247: return Type::Bottom;\n\t\t\t\tcase 16249: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackstoneStairs\n\t{\n\t\tBlockState BlackstoneStairs()\n\t\t{\n\t\t\treturn 15851;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15881: case 15883: case 15885: case 15887: case 15889: case 15891: case 15893: case 15895: case 15897: case 15899: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15901: case 15903: case 15905: case 15907: case 15909: case 15911: case 15913: case 15915: case 15917: case 15919: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15841: case 15843: case 15845: case 15847: case 15849: case 15851: case 15853: case 15855: case 15857: case 15859: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15851: case 15853: case 15855: case 15857: case 15859: case 15871: case 15873: case 15875: case 15877: case 15879: case 15891: case 15893: case 15895: case 15897: case 15899: case 15911: case 15913: case 15915: case 15917: case 15919: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15843: case 15853: case 15863: case 15873: case 15883: case 15893: case 15903: case 15913: return Shape::InnerLeft;\n\t\t\t\tcase 15845: case 15855: case 15865: case 15875: case 15885: case 15895: case 15905: case 15915: return Shape::InnerRight;\n\t\t\t\tcase 15847: case 15857: case 15867: case 15877: case 15887: case 15897: case 15907: case 15917: return Shape::OuterLeft;\n\t\t\t\tcase 15849: case 15859: case 15869: case 15879: case 15889: case 15899: case 15909: case 15919: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlackstoneWall\n\t{\n\t\tBlockState BlackstoneWall()\n\t\t{\n\t\t\treturn 15923;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16031: case 16032: case 16033: case 16037: case 16038: case 16039: case 16043: case 16044: case 16045: case 16049: case 16050: case 16051: case 16055: case 16056: case 16057: case 16061: case 16062: case 16063: case 16067: case 16068: case 16069: case 16073: case 16074: case 16075: case 16079: case 16080: case 16081: case 16085: case 16086: case 16087: case 16091: case 16092: case 16093: case 16097: case 16098: case 16099: case 16103: case 16104: case 16105: case 16109: case 16110: case 16111: case 16115: case 16116: case 16117: case 16121: case 16122: case 16123: case 16127: case 16128: case 16129: case 16133: case 16134: case 16135: return East::Low;\n\t\t\t\tcase 15923: case 15924: case 15925: case 15929: case 15930: case 15931: case 15935: case 15936: case 15937: case 15941: case 15942: case 15943: case 15947: case 15948: case 15949: case 15953: case 15954: case 15955: case 15959: case 15960: case 15961: case 15965: case 15966: case 15967: case 15971: case 15972: case 15973: case 15977: case 15978: case 15979: case 15983: case 15984: case 15985: case 15989: case 15990: case 15991: case 15995: case 15996: case 15997: case 16001: case 16002: case 16003: case 16007: case 16008: case 16009: case 16013: case 16014: case 16015: case 16019: case 16020: case 16021: case 16025: case 16026: case 16027: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15959: case 15960: case 15961: case 15965: case 15966: case 15967: case 15971: case 15972: case 15973: case 15977: case 15978: case 15979: case 15983: case 15984: case 15985: case 15989: case 15990: case 15991: case 16067: case 16068: case 16069: case 16073: case 16074: case 16075: case 16079: case 16080: case 16081: case 16085: case 16086: case 16087: case 16091: case 16092: case 16093: case 16097: case 16098: case 16099: case 16175: case 16176: case 16177: case 16181: case 16182: case 16183: case 16187: case 16188: case 16189: case 16193: case 16194: case 16195: case 16199: case 16200: case 16201: case 16205: case 16206: case 16207: return North::Low;\n\t\t\t\tcase 15923: case 15924: case 15925: case 15929: case 15930: case 15931: case 15935: case 15936: case 15937: case 15941: case 15942: case 15943: case 15947: case 15948: case 15949: case 15953: case 15954: case 15955: case 16031: case 16032: case 16033: case 16037: case 16038: case 16039: case 16043: case 16044: case 16045: case 16049: case 16050: case 16051: case 16055: case 16056: case 16057: case 16061: case 16062: case 16063: case 16139: case 16140: case 16141: case 16145: case 16146: case 16147: case 16151: case 16152: case 16153: case 16157: case 16158: case 16159: case 16163: case 16164: case 16165: case 16169: case 16170: case 16171: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15935: case 15936: case 15937: case 15941: case 15942: case 15943: case 15971: case 15972: case 15973: case 15977: case 15978: case 15979: case 16007: case 16008: case 16009: case 16013: case 16014: case 16015: case 16043: case 16044: case 16045: case 16049: case 16050: case 16051: case 16079: case 16080: case 16081: case 16085: case 16086: case 16087: case 16115: case 16116: case 16117: case 16121: case 16122: case 16123: case 16151: case 16152: case 16153: case 16157: case 16158: case 16159: case 16187: case 16188: case 16189: case 16193: case 16194: case 16195: case 16223: case 16224: case 16225: case 16229: case 16230: case 16231: return South::Low;\n\t\t\t\tcase 15923: case 15924: case 15925: case 15929: case 15930: case 15931: case 15959: case 15960: case 15961: case 15965: case 15966: case 15967: case 15995: case 15996: case 15997: case 16001: case 16002: case 16003: case 16031: case 16032: case 16033: case 16037: case 16038: case 16039: case 16067: case 16068: case 16069: case 16073: case 16074: case 16075: case 16103: case 16104: case 16105: case 16109: case 16110: case 16111: case 16139: case 16140: case 16141: case 16145: case 16146: case 16147: case 16175: case 16176: case 16177: case 16181: case 16182: case 16183: case 16211: case 16212: case 16213: case 16217: case 16218: case 16219: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15929: case 15930: case 15931: case 15941: case 15942: case 15943: case 15953: case 15954: case 15955: case 15965: case 15966: case 15967: case 15977: case 15978: case 15979: case 15989: case 15990: case 15991: case 16001: case 16002: case 16003: case 16013: case 16014: case 16015: case 16025: case 16026: case 16027: case 16037: case 16038: case 16039: case 16049: case 16050: case 16051: case 16061: case 16062: case 16063: case 16073: case 16074: case 16075: case 16085: case 16086: case 16087: case 16097: case 16098: case 16099: case 16109: case 16110: case 16111: case 16121: case 16122: case 16123: case 16133: case 16134: case 16135: case 16145: case 16146: case 16147: case 16157: case 16158: case 16159: case 16169: case 16170: case 16171: case 16181: case 16182: case 16183: case 16193: case 16194: case 16195: case 16205: case 16206: case 16207: case 16217: case 16218: case 16219: case 16229: case 16230: case 16231: case 16241: case 16242: case 16243: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15924: case 15930: case 15936: case 15942: case 15948: case 15954: case 15960: case 15966: case 15972: case 15978: case 15984: case 15990: case 15996: case 16002: case 16008: case 16014: case 16020: case 16026: case 16032: case 16038: case 16044: case 16050: case 16056: case 16062: case 16068: case 16074: case 16080: case 16086: case 16092: case 16098: case 16104: case 16110: case 16116: case 16122: case 16128: case 16134: case 16140: case 16146: case 16152: case 16158: case 16164: case 16170: case 16176: case 16182: case 16188: case 16194: case 16200: case 16206: case 16212: case 16218: case 16224: case 16230: case 16236: case 16242: return West::Low;\n\t\t\t\tcase 15923: case 15929: case 15935: case 15941: case 15947: case 15953: case 15959: case 15965: case 15971: case 15977: case 15983: case 15989: case 15995: case 16001: case 16007: case 16013: case 16019: case 16025: case 16031: case 16037: case 16043: case 16049: case 16055: case 16061: case 16067: case 16073: case 16079: case 16085: case 16091: case 16097: case 16103: case 16109: case 16115: case 16121: case 16127: case 16133: case 16139: case 16145: case 16151: case 16157: case 16163: case 16169: case 16175: case 16181: case 16187: case 16193: case 16199: case 16205: case 16211: case 16217: case 16223: case 16229: case 16235: case 16241: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlastFurnace\n\t{\n\t\tBlockState BlastFurnace()\n\t\t{\n\t\t\treturn 14812;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14815: case 14816: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14817: case 14818: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14811: case 14812: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14812: case 14814: case 14816: case 14818: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlueBanner\n\t{\n\t\tBlockState BlueBanner()\n\t\t{\n\t\t\treturn 8073;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8073: return 0;\n\t\t\t\tcase 8074: return 1;\n\t\t\t\tcase 8083: return 10;\n\t\t\t\tcase 8084: return 11;\n\t\t\t\tcase 8085: return 12;\n\t\t\t\tcase 8086: return 13;\n\t\t\t\tcase 8087: return 14;\n\t\t\t\tcase 8088: return 15;\n\t\t\t\tcase 8075: return 2;\n\t\t\t\tcase 8076: return 3;\n\t\t\t\tcase 8077: return 4;\n\t\t\t\tcase 8078: return 5;\n\t\t\t\tcase 8079: return 6;\n\t\t\t\tcase 8080: return 7;\n\t\t\t\tcase 8081: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlueBed\n\t{\n\t\tBlockState BlueBed()\n\t\t{\n\t\t\treturn 1228;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1233: case 1234: case 1235: case 1236: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1237: case 1238: case 1239: case 1240: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1225: case 1226: case 1227: case 1228: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1227: case 1228: case 1231: case 1232: case 1235: case 1236: case 1239: case 1240: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1226: case 1228: case 1230: case 1232: case 1234: case 1236: case 1238: case 1240: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlueCarpet\n\t{\n\t}\n\tnamespace BlueConcrete\n\t{\n\t}\n\tnamespace BlueConcretePowder\n\t{\n\t}\n\tnamespace BlueGlazedTerracotta\n\t{\n\t\tBlockState BlueGlazedTerracotta()\n\t\t{\n\t\t\treturn 9418;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9420: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9421: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9418: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlueIce\n\t{\n\t}\n\tnamespace BlueOrchid\n\t{\n\t}\n\tnamespace BlueShulkerBox\n\t{\n\t\tBlockState BlueShulkerBox()\n\t\t{\n\t\t\treturn 9348;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9347: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9345: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9349: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9348: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9344: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlueStainedGlass\n\t{\n\t}\n\tnamespace BlueStainedGlassPane\n\t{\n\t\tBlockState BlueStainedGlassPane()\n\t\t{\n\t\t\treturn 7246;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7233: case 7234: case 7237: case 7238: case 7241: case 7242: case 7245: case 7246: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7225: case 7226: case 7229: case 7230: case 7241: case 7242: case 7245: case 7246: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7221: case 7222: case 7229: case 7230: case 7237: case 7238: case 7245: case 7246: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7218: case 7222: case 7226: case 7230: case 7234: case 7238: case 7242: case 7246: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlueTerracotta\n\t{\n\t}\n\tnamespace BlueWallBanner\n\t{\n\t\tBlockState BlueWallBanner()\n\t\t{\n\t\t\treturn 8197;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8199: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8200: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8197: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BlueWool\n\t{\n\t}\n\tnamespace BoneBlock\n\t{\n\t\tBlockState BoneBlock()\n\t\t{\n\t\t\treturn 9257;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9256: return Axis::X;\n\t\t\t\tcase 9257: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Bookshelf\n\t{\n\t}\n\tnamespace BrainCoral\n\t{\n\t}\n\tnamespace BrainCoralBlock\n\t{\n\t}\n\tnamespace BrainCoralFan\n\t{\n\t}\n\tnamespace BrainCoralWallFan\n\t{\n\t\tBlockState BrainCoralWallFan()\n\t\t{\n\t\t\treturn 9608;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9613: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9615: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9609: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrewingStand\n\t{\n\t\tBlockState BrewingStand()\n\t\t{\n\t\t\treturn 5140;\n\t\t}\n\t\tbool HasBottle_0(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5137: case 5138: case 5139: case 5140: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool HasBottle_1(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5135: case 5136: case 5139: case 5140: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool HasBottle_2(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5134: case 5136: case 5138: case 5140: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrickSlab\n\t{\n\t\tBlockState BrickSlab()\n\t\t{\n\t\t\treturn 8375;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8375: return Type::Bottom;\n\t\t\t\tcase 8377: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrickStairs\n\t{\n\t\tBlockState BrickStairs()\n\t\t{\n\t\t\treturn 4863;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4893: case 4895: case 4897: case 4899: case 4901: case 4903: case 4905: case 4907: case 4909: case 4911: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4913: case 4915: case 4917: case 4919: case 4921: case 4923: case 4925: case 4927: case 4929: case 4931: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4853: case 4855: case 4857: case 4859: case 4861: case 4863: case 4865: case 4867: case 4869: case 4871: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4863: case 4865: case 4867: case 4869: case 4871: case 4883: case 4885: case 4887: case 4889: case 4891: case 4903: case 4905: case 4907: case 4909: case 4911: case 4923: case 4925: case 4927: case 4929: case 4931: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4855: case 4865: case 4875: case 4885: case 4895: case 4905: case 4915: case 4925: return Shape::InnerLeft;\n\t\t\t\tcase 4857: case 4867: case 4877: case 4887: case 4897: case 4907: case 4917: case 4927: return Shape::InnerRight;\n\t\t\t\tcase 4859: case 4869: case 4879: case 4889: case 4899: case 4909: case 4919: case 4929: return Shape::OuterLeft;\n\t\t\t\tcase 4861: case 4871: case 4881: case 4891: case 4901: case 4911: case 4921: case 4931: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrickWall\n\t{\n\t\tBlockState BrickWall()\n\t\t{\n\t\t\treturn 10870;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10978: case 10979: case 10980: case 10984: case 10985: case 10986: case 10990: case 10991: case 10992: case 10996: case 10997: case 10998: case 11002: case 11003: case 11004: case 11008: case 11009: case 11010: case 11014: case 11015: case 11016: case 11020: case 11021: case 11022: case 11026: case 11027: case 11028: case 11032: case 11033: case 11034: case 11038: case 11039: case 11040: case 11044: case 11045: case 11046: case 11050: case 11051: case 11052: case 11056: case 11057: case 11058: case 11062: case 11063: case 11064: case 11068: case 11069: case 11070: case 11074: case 11075: case 11076: case 11080: case 11081: case 11082: return East::Low;\n\t\t\t\tcase 10870: case 10871: case 10872: case 10876: case 10877: case 10878: case 10882: case 10883: case 10884: case 10888: case 10889: case 10890: case 10894: case 10895: case 10896: case 10900: case 10901: case 10902: case 10906: case 10907: case 10908: case 10912: case 10913: case 10914: case 10918: case 10919: case 10920: case 10924: case 10925: case 10926: case 10930: case 10931: case 10932: case 10936: case 10937: case 10938: case 10942: case 10943: case 10944: case 10948: case 10949: case 10950: case 10954: case 10955: case 10956: case 10960: case 10961: case 10962: case 10966: case 10967: case 10968: case 10972: case 10973: case 10974: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10906: case 10907: case 10908: case 10912: case 10913: case 10914: case 10918: case 10919: case 10920: case 10924: case 10925: case 10926: case 10930: case 10931: case 10932: case 10936: case 10937: case 10938: case 11014: case 11015: case 11016: case 11020: case 11021: case 11022: case 11026: case 11027: case 11028: case 11032: case 11033: case 11034: case 11038: case 11039: case 11040: case 11044: case 11045: case 11046: case 11122: case 11123: case 11124: case 11128: case 11129: case 11130: case 11134: case 11135: case 11136: case 11140: case 11141: case 11142: case 11146: case 11147: case 11148: case 11152: case 11153: case 11154: return North::Low;\n\t\t\t\tcase 10870: case 10871: case 10872: case 10876: case 10877: case 10878: case 10882: case 10883: case 10884: case 10888: case 10889: case 10890: case 10894: case 10895: case 10896: case 10900: case 10901: case 10902: case 10978: case 10979: case 10980: case 10984: case 10985: case 10986: case 10990: case 10991: case 10992: case 10996: case 10997: case 10998: case 11002: case 11003: case 11004: case 11008: case 11009: case 11010: case 11086: case 11087: case 11088: case 11092: case 11093: case 11094: case 11098: case 11099: case 11100: case 11104: case 11105: case 11106: case 11110: case 11111: case 11112: case 11116: case 11117: case 11118: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10882: case 10883: case 10884: case 10888: case 10889: case 10890: case 10918: case 10919: case 10920: case 10924: case 10925: case 10926: case 10954: case 10955: case 10956: case 10960: case 10961: case 10962: case 10990: case 10991: case 10992: case 10996: case 10997: case 10998: case 11026: case 11027: case 11028: case 11032: case 11033: case 11034: case 11062: case 11063: case 11064: case 11068: case 11069: case 11070: case 11098: case 11099: case 11100: case 11104: case 11105: case 11106: case 11134: case 11135: case 11136: case 11140: case 11141: case 11142: case 11170: case 11171: case 11172: case 11176: case 11177: case 11178: return South::Low;\n\t\t\t\tcase 10870: case 10871: case 10872: case 10876: case 10877: case 10878: case 10906: case 10907: case 10908: case 10912: case 10913: case 10914: case 10942: case 10943: case 10944: case 10948: case 10949: case 10950: case 10978: case 10979: case 10980: case 10984: case 10985: case 10986: case 11014: case 11015: case 11016: case 11020: case 11021: case 11022: case 11050: case 11051: case 11052: case 11056: case 11057: case 11058: case 11086: case 11087: case 11088: case 11092: case 11093: case 11094: case 11122: case 11123: case 11124: case 11128: case 11129: case 11130: case 11158: case 11159: case 11160: case 11164: case 11165: case 11166: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10876: case 10877: case 10878: case 10888: case 10889: case 10890: case 10900: case 10901: case 10902: case 10912: case 10913: case 10914: case 10924: case 10925: case 10926: case 10936: case 10937: case 10938: case 10948: case 10949: case 10950: case 10960: case 10961: case 10962: case 10972: case 10973: case 10974: case 10984: case 10985: case 10986: case 10996: case 10997: case 10998: case 11008: case 11009: case 11010: case 11020: case 11021: case 11022: case 11032: case 11033: case 11034: case 11044: case 11045: case 11046: case 11056: case 11057: case 11058: case 11068: case 11069: case 11070: case 11080: case 11081: case 11082: case 11092: case 11093: case 11094: case 11104: case 11105: case 11106: case 11116: case 11117: case 11118: case 11128: case 11129: case 11130: case 11140: case 11141: case 11142: case 11152: case 11153: case 11154: case 11164: case 11165: case 11166: case 11176: case 11177: case 11178: case 11188: case 11189: case 11190: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10871: case 10877: case 10883: case 10889: case 10895: case 10901: case 10907: case 10913: case 10919: case 10925: case 10931: case 10937: case 10943: case 10949: case 10955: case 10961: case 10967: case 10973: case 10979: case 10985: case 10991: case 10997: case 11003: case 11009: case 11015: case 11021: case 11027: case 11033: case 11039: case 11045: case 11051: case 11057: case 11063: case 11069: case 11075: case 11081: case 11087: case 11093: case 11099: case 11105: case 11111: case 11117: case 11123: case 11129: case 11135: case 11141: case 11147: case 11153: case 11159: case 11165: case 11171: case 11177: case 11183: case 11189: return West::Low;\n\t\t\t\tcase 10870: case 10876: case 10882: case 10888: case 10894: case 10900: case 10906: case 10912: case 10918: case 10924: case 10930: case 10936: case 10942: case 10948: case 10954: case 10960: case 10966: case 10972: case 10978: case 10984: case 10990: case 10996: case 11002: case 11008: case 11014: case 11020: case 11026: case 11032: case 11038: case 11044: case 11050: case 11056: case 11062: case 11068: case 11074: case 11080: case 11086: case 11092: case 11098: case 11104: case 11110: case 11116: case 11122: case 11128: case 11134: case 11140: case 11146: case 11152: case 11158: case 11164: case 11170: case 11176: case 11182: case 11188: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Bricks\n\t{\n\t}\n\tnamespace BrownBanner\n\t{\n\t\tBlockState BrownBanner()\n\t\t{\n\t\t\treturn 8089;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8089: return 0;\n\t\t\t\tcase 8090: return 1;\n\t\t\t\tcase 8099: return 10;\n\t\t\t\tcase 8100: return 11;\n\t\t\t\tcase 8101: return 12;\n\t\t\t\tcase 8102: return 13;\n\t\t\t\tcase 8103: return 14;\n\t\t\t\tcase 8104: return 15;\n\t\t\t\tcase 8091: return 2;\n\t\t\t\tcase 8092: return 3;\n\t\t\t\tcase 8093: return 4;\n\t\t\t\tcase 8094: return 5;\n\t\t\t\tcase 8095: return 6;\n\t\t\t\tcase 8096: return 7;\n\t\t\t\tcase 8097: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrownBed\n\t{\n\t\tBlockState BrownBed()\n\t\t{\n\t\t\treturn 1244;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1249: case 1250: case 1251: case 1252: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1253: case 1254: case 1255: case 1256: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1241: case 1242: case 1243: case 1244: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1243: case 1244: case 1247: case 1248: case 1251: case 1252: case 1255: case 1256: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1242: case 1244: case 1246: case 1248: case 1250: case 1252: case 1254: case 1256: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrownCarpet\n\t{\n\t}\n\tnamespace BrownConcrete\n\t{\n\t}\n\tnamespace BrownConcretePowder\n\t{\n\t}\n\tnamespace BrownGlazedTerracotta\n\t{\n\t\tBlockState BrownGlazedTerracotta()\n\t\t{\n\t\t\treturn 9422;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9424: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9425: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9422: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrownMushroom\n\t{\n\t}\n\tnamespace BrownMushroomBlock\n\t{\n\t\tBlockState BrownMushroomBlock()\n\t\t{\n\t\t\treturn 4505;\n\t\t}\n\t\tbool Down(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4537: case 4538: case 4539: case 4540: case 4541: case 4542: case 4543: case 4544: case 4545: case 4546: case 4547: case 4548: case 4549: case 4550: case 4551: case 4552: case 4553: case 4554: case 4555: case 4556: case 4557: case 4558: case 4559: case 4560: case 4561: case 4562: case 4563: case 4564: case 4565: case 4566: case 4567: case 4568: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4521: case 4522: case 4523: case 4524: case 4525: case 4526: case 4527: case 4528: case 4529: case 4530: case 4531: case 4532: case 4533: case 4534: case 4535: case 4536: case 4553: case 4554: case 4555: case 4556: case 4557: case 4558: case 4559: case 4560: case 4561: case 4562: case 4563: case 4564: case 4565: case 4566: case 4567: case 4568: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4513: case 4514: case 4515: case 4516: case 4517: case 4518: case 4519: case 4520: case 4529: case 4530: case 4531: case 4532: case 4533: case 4534: case 4535: case 4536: case 4545: case 4546: case 4547: case 4548: case 4549: case 4550: case 4551: case 4552: case 4561: case 4562: case 4563: case 4564: case 4565: case 4566: case 4567: case 4568: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4509: case 4510: case 4511: case 4512: case 4517: case 4518: case 4519: case 4520: case 4525: case 4526: case 4527: case 4528: case 4533: case 4534: case 4535: case 4536: case 4541: case 4542: case 4543: case 4544: case 4549: case 4550: case 4551: case 4552: case 4557: case 4558: case 4559: case 4560: case 4565: case 4566: case 4567: case 4568: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4507: case 4508: case 4511: case 4512: case 4515: case 4516: case 4519: case 4520: case 4523: case 4524: case 4527: case 4528: case 4531: case 4532: case 4535: case 4536: case 4539: case 4540: case 4543: case 4544: case 4547: case 4548: case 4551: case 4552: case 4555: case 4556: case 4559: case 4560: case 4563: case 4564: case 4567: case 4568: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4506: case 4508: case 4510: case 4512: case 4514: case 4516: case 4518: case 4520: case 4522: case 4524: case 4526: case 4528: case 4530: case 4532: case 4534: case 4536: case 4538: case 4540: case 4542: case 4544: case 4546: case 4548: case 4550: case 4552: case 4554: case 4556: case 4558: case 4560: case 4562: case 4564: case 4566: case 4568: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrownShulkerBox\n\t{\n\t\tBlockState BrownShulkerBox()\n\t\t{\n\t\t\treturn 9354;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9353: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9351: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9355: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9354: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9350: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrownStainedGlass\n\t{\n\t}\n\tnamespace BrownStainedGlassPane\n\t{\n\t\tBlockState BrownStainedGlassPane()\n\t\t{\n\t\t\treturn 7278;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7265: case 7266: case 7269: case 7270: case 7273: case 7274: case 7277: case 7278: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7257: case 7258: case 7261: case 7262: case 7273: case 7274: case 7277: case 7278: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7253: case 7254: case 7261: case 7262: case 7269: case 7270: case 7277: case 7278: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7250: case 7254: case 7258: case 7262: case 7266: case 7270: case 7274: case 7278: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrownTerracotta\n\t{\n\t}\n\tnamespace BrownWallBanner\n\t{\n\t\tBlockState BrownWallBanner()\n\t\t{\n\t\t\treturn 8201;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8203: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8204: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8201: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BrownWool\n\t{\n\t}\n\tnamespace BubbleColumn\n\t{\n\t\tBlockState BubbleColumn()\n\t\t{\n\t\t\treturn 9667;\n\t\t}\n\t\tbool Drag(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9668: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace BubbleCoral\n\t{\n\t}\n\tnamespace BubbleCoralBlock\n\t{\n\t}\n\tnamespace BubbleCoralFan\n\t{\n\t}\n\tnamespace BubbleCoralWallFan\n\t{\n\t\tBlockState BubbleCoralWallFan()\n\t\t{\n\t\t\treturn 9616;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9621: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9623: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9617: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Cactus\n\t{\n\t\tBlockState Cactus()\n\t\t{\n\t\t\treturn 3931;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3931: return 0;\n\t\t\t\tcase 3932: return 1;\n\t\t\t\tcase 3941: return 10;\n\t\t\t\tcase 3942: return 11;\n\t\t\t\tcase 3943: return 12;\n\t\t\t\tcase 3944: return 13;\n\t\t\t\tcase 3945: return 14;\n\t\t\t\tcase 3946: return 15;\n\t\t\t\tcase 3933: return 2;\n\t\t\t\tcase 3934: return 3;\n\t\t\t\tcase 3935: return 4;\n\t\t\t\tcase 3936: return 5;\n\t\t\t\tcase 3937: return 6;\n\t\t\t\tcase 3938: return 7;\n\t\t\t\tcase 3939: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Cake\n\t{\n\t\tBlockState Cake()\n\t\t{\n\t\t\treturn 4024;\n\t\t}\n\t\tunsigned char Bites(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4024: return 0;\n\t\t\t\tcase 4025: return 1;\n\t\t\t\tcase 4026: return 2;\n\t\t\t\tcase 4027: return 3;\n\t\t\t\tcase 4028: return 4;\n\t\t\t\tcase 4029: return 5;\n\t\t\t\tdefault: return 6;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Campfire\n\t{\n\t\tBlockState Campfire()\n\t\t{\n\t\t\treturn 14893;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14907: case 14909: case 14911: case 14913: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14915: case 14917: case 14919: case 14921: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14891: case 14893: case 14895: case 14897: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14895: case 14897: case 14903: case 14905: case 14911: case 14913: case 14919: case 14921: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool SignalFire(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14893: case 14897: case 14901: case 14905: case 14909: case 14913: case 14917: case 14921: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Carrots\n\t{\n\t\tBlockState Carrots()\n\t\t{\n\t\t\treturn 6330;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6330: return 0;\n\t\t\t\tcase 6331: return 1;\n\t\t\t\tcase 6332: return 2;\n\t\t\t\tcase 6333: return 3;\n\t\t\t\tcase 6334: return 4;\n\t\t\t\tcase 6335: return 5;\n\t\t\t\tcase 6336: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CartographyTable\n\t{\n\t}\n\tnamespace CarvedPumpkin\n\t{\n\t\tBlockState CarvedPumpkin()\n\t\t{\n\t\t\treturn 4016;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4018: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4019: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4016: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Cauldron\n\t{\n\t\tBlockState Cauldron()\n\t\t{\n\t\t\treturn 5141;\n\t\t}\n\t\tunsigned char Level(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5141: return 0;\n\t\t\t\tcase 5142: return 1;\n\t\t\t\tcase 5143: return 2;\n\t\t\t\tdefault: return 3;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CaveAir\n\t{\n\t}\n\tnamespace Chain\n\t{\n\t}\n\tnamespace ChainCommandBlock\n\t{\n\t\tBlockState ChainCommandBlock()\n\t\t{\n\t\t\treturn 9243;\n\t\t}\n\t\tbool Conditional(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9243: case 9244: case 9245: case 9246: case 9247: case 9248: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9240: case 9246: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9238: case 9244: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9242: case 9248: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9241: case 9247: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9237: case 9243: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Chest\n\t{\n\t\tBlockState Chest()\n\t\t{\n\t\t\treturn 2035;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 2047: case 2049: case 2051: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 2053: case 2055: case 2057: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 2035: case 2037: case 2039: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 2037: case 2043: case 2049: case 2055: return Type::Left;\n\t\t\t\tcase 2039: case 2045: case 2051: case 2057: return Type::Right;\n\t\t\t\tdefault: return Type::Single;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace ChippedAnvil\n\t{\n\t\tBlockState ChippedAnvil()\n\t\t{\n\t\t\treturn 6614;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6616: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6617: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6614: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace ChiseledNetherBricks\n\t{\n\t}\n\tnamespace ChiseledPolishedBlackstone\n\t{\n\t}\n\tnamespace ChiseledQuartzBlock\n\t{\n\t}\n\tnamespace ChiseledRedSandstone\n\t{\n\t}\n\tnamespace ChiseledSandstone\n\t{\n\t}\n\tnamespace ChiseledStoneBricks\n\t{\n\t}\n\tnamespace ChorusFlower\n\t{\n\t\tBlockState ChorusFlower()\n\t\t{\n\t\t\treturn 9128;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9128: return 0;\n\t\t\t\tcase 9129: return 1;\n\t\t\t\tcase 9130: return 2;\n\t\t\t\tcase 9131: return 3;\n\t\t\t\tcase 9132: return 4;\n\t\t\t\tdefault: return 5;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace ChorusPlant\n\t{\n\t\tBlockState ChorusPlant()\n\t\t{\n\t\t\treturn 9127;\n\t\t}\n\t\tbool Down(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9096: case 9097: case 9098: case 9099: case 9100: case 9101: case 9102: case 9103: case 9104: case 9105: case 9106: case 9107: case 9108: case 9109: case 9110: case 9111: case 9112: case 9113: case 9114: case 9115: case 9116: case 9117: case 9118: case 9119: case 9120: case 9121: case 9122: case 9123: case 9124: case 9125: case 9126: case 9127: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9080: case 9081: case 9082: case 9083: case 9084: case 9085: case 9086: case 9087: case 9088: case 9089: case 9090: case 9091: case 9092: case 9093: case 9094: case 9095: case 9112: case 9113: case 9114: case 9115: case 9116: case 9117: case 9118: case 9119: case 9120: case 9121: case 9122: case 9123: case 9124: case 9125: case 9126: case 9127: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9072: case 9073: case 9074: case 9075: case 9076: case 9077: case 9078: case 9079: case 9088: case 9089: case 9090: case 9091: case 9092: case 9093: case 9094: case 9095: case 9104: case 9105: case 9106: case 9107: case 9108: case 9109: case 9110: case 9111: case 9120: case 9121: case 9122: case 9123: case 9124: case 9125: case 9126: case 9127: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9068: case 9069: case 9070: case 9071: case 9076: case 9077: case 9078: case 9079: case 9084: case 9085: case 9086: case 9087: case 9092: case 9093: case 9094: case 9095: case 9100: case 9101: case 9102: case 9103: case 9108: case 9109: case 9110: case 9111: case 9116: case 9117: case 9118: case 9119: case 9124: case 9125: case 9126: case 9127: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9066: case 9067: case 9070: case 9071: case 9074: case 9075: case 9078: case 9079: case 9082: case 9083: case 9086: case 9087: case 9090: case 9091: case 9094: case 9095: case 9098: case 9099: case 9102: case 9103: case 9106: case 9107: case 9110: case 9111: case 9114: case 9115: case 9118: case 9119: case 9122: case 9123: case 9126: case 9127: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9065: case 9067: case 9069: case 9071: case 9073: case 9075: case 9077: case 9079: case 9081: case 9083: case 9085: case 9087: case 9089: case 9091: case 9093: case 9095: case 9097: case 9099: case 9101: case 9103: case 9105: case 9107: case 9109: case 9111: case 9113: case 9115: case 9117: case 9119: case 9121: case 9123: case 9125: case 9127: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Clay\n\t{\n\t}\n\tnamespace CoalBlock\n\t{\n\t}\n\tnamespace CoalOre\n\t{\n\t}\n\tnamespace CoarseDirt\n\t{\n\t}\n\tnamespace Cobblestone\n\t{\n\t}\n\tnamespace CobblestoneSlab\n\t{\n\t\tBlockState CobblestoneSlab()\n\t\t{\n\t\t\treturn 8369;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8369: return Type::Bottom;\n\t\t\t\tcase 8371: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CobblestoneStairs\n\t{\n\t\tBlockState CobblestoneStairs()\n\t\t{\n\t\t\treturn 3666;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3696: case 3698: case 3700: case 3702: case 3704: case 3706: case 3708: case 3710: case 3712: case 3714: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3716: case 3718: case 3720: case 3722: case 3724: case 3726: case 3728: case 3730: case 3732: case 3734: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3656: case 3658: case 3660: case 3662: case 3664: case 3666: case 3668: case 3670: case 3672: case 3674: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3666: case 3668: case 3670: case 3672: case 3674: case 3686: case 3688: case 3690: case 3692: case 3694: case 3706: case 3708: case 3710: case 3712: case 3714: case 3726: case 3728: case 3730: case 3732: case 3734: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3658: case 3668: case 3678: case 3688: case 3698: case 3708: case 3718: case 3728: return Shape::InnerLeft;\n\t\t\t\tcase 3660: case 3670: case 3680: case 3690: case 3700: case 3710: case 3720: case 3730: return Shape::InnerRight;\n\t\t\t\tcase 3662: case 3672: case 3682: case 3692: case 3702: case 3712: case 3722: case 3732: return Shape::OuterLeft;\n\t\t\t\tcase 3664: case 3674: case 3684: case 3694: case 3704: case 3714: case 3724: case 3734: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CobblestoneWall\n\t{\n\t\tBlockState CobblestoneWall()\n\t\t{\n\t\t\treturn 5660;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5768: case 5769: case 5770: case 5774: case 5775: case 5776: case 5780: case 5781: case 5782: case 5786: case 5787: case 5788: case 5792: case 5793: case 5794: case 5798: case 5799: case 5800: case 5804: case 5805: case 5806: case 5810: case 5811: case 5812: case 5816: case 5817: case 5818: case 5822: case 5823: case 5824: case 5828: case 5829: case 5830: case 5834: case 5835: case 5836: case 5840: case 5841: case 5842: case 5846: case 5847: case 5848: case 5852: case 5853: case 5854: case 5858: case 5859: case 5860: case 5864: case 5865: case 5866: case 5870: case 5871: case 5872: return East::Low;\n\t\t\t\tcase 5660: case 5661: case 5662: case 5666: case 5667: case 5668: case 5672: case 5673: case 5674: case 5678: case 5679: case 5680: case 5684: case 5685: case 5686: case 5690: case 5691: case 5692: case 5696: case 5697: case 5698: case 5702: case 5703: case 5704: case 5708: case 5709: case 5710: case 5714: case 5715: case 5716: case 5720: case 5721: case 5722: case 5726: case 5727: case 5728: case 5732: case 5733: case 5734: case 5738: case 5739: case 5740: case 5744: case 5745: case 5746: case 5750: case 5751: case 5752: case 5756: case 5757: case 5758: case 5762: case 5763: case 5764: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5696: case 5697: case 5698: case 5702: case 5703: case 5704: case 5708: case 5709: case 5710: case 5714: case 5715: case 5716: case 5720: case 5721: case 5722: case 5726: case 5727: case 5728: case 5804: case 5805: case 5806: case 5810: case 5811: case 5812: case 5816: case 5817: case 5818: case 5822: case 5823: case 5824: case 5828: case 5829: case 5830: case 5834: case 5835: case 5836: case 5912: case 5913: case 5914: case 5918: case 5919: case 5920: case 5924: case 5925: case 5926: case 5930: case 5931: case 5932: case 5936: case 5937: case 5938: case 5942: case 5943: case 5944: return North::Low;\n\t\t\t\tcase 5660: case 5661: case 5662: case 5666: case 5667: case 5668: case 5672: case 5673: case 5674: case 5678: case 5679: case 5680: case 5684: case 5685: case 5686: case 5690: case 5691: case 5692: case 5768: case 5769: case 5770: case 5774: case 5775: case 5776: case 5780: case 5781: case 5782: case 5786: case 5787: case 5788: case 5792: case 5793: case 5794: case 5798: case 5799: case 5800: case 5876: case 5877: case 5878: case 5882: case 5883: case 5884: case 5888: case 5889: case 5890: case 5894: case 5895: case 5896: case 5900: case 5901: case 5902: case 5906: case 5907: case 5908: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5672: case 5673: case 5674: case 5678: case 5679: case 5680: case 5708: case 5709: case 5710: case 5714: case 5715: case 5716: case 5744: case 5745: case 5746: case 5750: case 5751: case 5752: case 5780: case 5781: case 5782: case 5786: case 5787: case 5788: case 5816: case 5817: case 5818: case 5822: case 5823: case 5824: case 5852: case 5853: case 5854: case 5858: case 5859: case 5860: case 5888: case 5889: case 5890: case 5894: case 5895: case 5896: case 5924: case 5925: case 5926: case 5930: case 5931: case 5932: case 5960: case 5961: case 5962: case 5966: case 5967: case 5968: return South::Low;\n\t\t\t\tcase 5660: case 5661: case 5662: case 5666: case 5667: case 5668: case 5696: case 5697: case 5698: case 5702: case 5703: case 5704: case 5732: case 5733: case 5734: case 5738: case 5739: case 5740: case 5768: case 5769: case 5770: case 5774: case 5775: case 5776: case 5804: case 5805: case 5806: case 5810: case 5811: case 5812: case 5840: case 5841: case 5842: case 5846: case 5847: case 5848: case 5876: case 5877: case 5878: case 5882: case 5883: case 5884: case 5912: case 5913: case 5914: case 5918: case 5919: case 5920: case 5948: case 5949: case 5950: case 5954: case 5955: case 5956: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5666: case 5667: case 5668: case 5678: case 5679: case 5680: case 5690: case 5691: case 5692: case 5702: case 5703: case 5704: case 5714: case 5715: case 5716: case 5726: case 5727: case 5728: case 5738: case 5739: case 5740: case 5750: case 5751: case 5752: case 5762: case 5763: case 5764: case 5774: case 5775: case 5776: case 5786: case 5787: case 5788: case 5798: case 5799: case 5800: case 5810: case 5811: case 5812: case 5822: case 5823: case 5824: case 5834: case 5835: case 5836: case 5846: case 5847: case 5848: case 5858: case 5859: case 5860: case 5870: case 5871: case 5872: case 5882: case 5883: case 5884: case 5894: case 5895: case 5896: case 5906: case 5907: case 5908: case 5918: case 5919: case 5920: case 5930: case 5931: case 5932: case 5942: case 5943: case 5944: case 5954: case 5955: case 5956: case 5966: case 5967: case 5968: case 5978: case 5979: case 5980: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5661: case 5667: case 5673: case 5679: case 5685: case 5691: case 5697: case 5703: case 5709: case 5715: case 5721: case 5727: case 5733: case 5739: case 5745: case 5751: case 5757: case 5763: case 5769: case 5775: case 5781: case 5787: case 5793: case 5799: case 5805: case 5811: case 5817: case 5823: case 5829: case 5835: case 5841: case 5847: case 5853: case 5859: case 5865: case 5871: case 5877: case 5883: case 5889: case 5895: case 5901: case 5907: case 5913: case 5919: case 5925: case 5931: case 5937: case 5943: case 5949: case 5955: case 5961: case 5967: case 5973: case 5979: return West::Low;\n\t\t\t\tcase 5660: case 5666: case 5672: case 5678: case 5684: case 5690: case 5696: case 5702: case 5708: case 5714: case 5720: case 5726: case 5732: case 5738: case 5744: case 5750: case 5756: case 5762: case 5768: case 5774: case 5780: case 5786: case 5792: case 5798: case 5804: case 5810: case 5816: case 5822: case 5828: case 5834: case 5840: case 5846: case 5852: case 5858: case 5864: case 5870: case 5876: case 5882: case 5888: case 5894: case 5900: case 5906: case 5912: case 5918: case 5924: case 5930: case 5936: case 5942: case 5948: case 5954: case 5960: case 5966: case 5972: case 5978: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Cobweb\n\t{\n\t}\n\tnamespace Cocoa\n\t{\n\t\tBlockState Cocoa()\n\t\t{\n\t\t\treturn 5158;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5158: case 5159: case 5160: case 5161: return 0;\n\t\t\t\tcase 5162: case 5163: case 5164: case 5165: return 1;\n\t\t\t\tdefault: return 2;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5160: case 5164: case 5168: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5161: case 5165: case 5169: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5158: case 5162: case 5166: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CommandBlock\n\t{\n\t\tBlockState CommandBlock()\n\t\t{\n\t\t\treturn 5650;\n\t\t}\n\t\tbool Conditional(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5650: case 5651: case 5652: case 5653: case 5654: case 5655: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5647: case 5653: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5645: case 5651: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5649: case 5655: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 5648: case 5654: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 5644: case 5650: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Comparator\n\t{\n\t\tBlockState Comparator()\n\t\t{\n\t\t\treturn 6679;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6686: case 6687: case 6688: case 6689: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6690: case 6691: case 6692: case 6693: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6678: case 6679: case 6680: case 6681: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Mode Mode(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6678: case 6679: case 6682: case 6683: case 6686: case 6687: case 6690: case 6691: return Mode::Compare;\n\t\t\t\tdefault: return Mode::Subtract;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6679: case 6681: case 6683: case 6685: case 6687: case 6689: case 6691: case 6693: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Composter\n\t{\n\t\tBlockState Composter()\n\t\t{\n\t\t\treturn 15751;\n\t\t}\n\t\tunsigned char Level(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15751: return 0;\n\t\t\t\tcase 15752: return 1;\n\t\t\t\tcase 15753: return 2;\n\t\t\t\tcase 15754: return 3;\n\t\t\t\tcase 15755: return 4;\n\t\t\t\tcase 15756: return 5;\n\t\t\t\tcase 15757: return 6;\n\t\t\t\tcase 15758: return 7;\n\t\t\t\tdefault: return 8;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Conduit\n\t{\n\t}\n\tnamespace Cornflower\n\t{\n\t}\n\tnamespace CrackedNetherBricks\n\t{\n\t}\n\tnamespace CrackedPolishedBlackstoneBricks\n\t{\n\t}\n\tnamespace CrackedStoneBricks\n\t{\n\t}\n\tnamespace CraftingTable\n\t{\n\t}\n\tnamespace CreeperHead\n\t{\n\t\tBlockState CreeperHead()\n\t\t{\n\t\t\treturn 6570;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6570: return 0;\n\t\t\t\tcase 6571: return 1;\n\t\t\t\tcase 6580: return 10;\n\t\t\t\tcase 6581: return 11;\n\t\t\t\tcase 6582: return 12;\n\t\t\t\tcase 6583: return 13;\n\t\t\t\tcase 6584: return 14;\n\t\t\t\tcase 6585: return 15;\n\t\t\t\tcase 6572: return 2;\n\t\t\t\tcase 6573: return 3;\n\t\t\t\tcase 6574: return 4;\n\t\t\t\tcase 6575: return 5;\n\t\t\t\tcase 6576: return 6;\n\t\t\t\tcase 6577: return 7;\n\t\t\t\tcase 6578: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CreeperWallHead\n\t{\n\t\tBlockState CreeperWallHead()\n\t\t{\n\t\t\treturn 6586;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6588: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6589: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6586: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonButton\n\t{\n\t\tBlockState CrimsonButton()\n\t\t{\n\t\t\treturn 15488;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15495: case 15496: case 15497: case 15498: case 15499: case 15500: case 15501: case 15502: return Face::Ceiling;\n\t\t\t\tcase 15479: case 15480: case 15481: case 15482: case 15483: case 15484: case 15485: case 15486: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15483: case 15484: case 15491: case 15492: case 15499: case 15500: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15485: case 15486: case 15493: case 15494: case 15501: case 15502: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15479: case 15480: case 15487: case 15488: case 15495: case 15496: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15480: case 15482: case 15484: case 15486: case 15488: case 15490: case 15492: case 15494: case 15496: case 15498: case 15500: case 15502: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonDoor\n\t{\n\t\tBlockState CrimsonDoor()\n\t\t{\n\t\t\treturn 15538;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15559: case 15560: case 15561: case 15562: case 15563: case 15564: case 15565: case 15566: case 15567: case 15568: case 15569: case 15570: case 15571: case 15572: case 15573: case 15574: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15575: case 15576: case 15577: case 15578: case 15579: case 15580: case 15581: case 15582: case 15583: case 15584: case 15585: case 15586: case 15587: case 15588: case 15589: case 15590: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15527: case 15528: case 15529: case 15530: case 15531: case 15532: case 15533: case 15534: case 15535: case 15536: case 15537: case 15538: case 15539: case 15540: case 15541: case 15542: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15535: case 15536: case 15537: case 15538: case 15539: case 15540: case 15541: case 15542: case 15551: case 15552: case 15553: case 15554: case 15555: case 15556: case 15557: case 15558: case 15567: case 15568: case 15569: case 15570: case 15571: case 15572: case 15573: case 15574: case 15583: case 15584: case 15585: case 15586: case 15587: case 15588: case 15589: case 15590: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15527: case 15528: case 15529: case 15530: case 15535: case 15536: case 15537: case 15538: case 15543: case 15544: case 15545: case 15546: case 15551: case 15552: case 15553: case 15554: case 15559: case 15560: case 15561: case 15562: case 15567: case 15568: case 15569: case 15570: case 15575: case 15576: case 15577: case 15578: case 15583: case 15584: case 15585: case 15586: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15529: case 15530: case 15533: case 15534: case 15537: case 15538: case 15541: case 15542: case 15545: case 15546: case 15549: case 15550: case 15553: case 15554: case 15557: case 15558: case 15561: case 15562: case 15565: case 15566: case 15569: case 15570: case 15573: case 15574: case 15577: case 15578: case 15581: case 15582: case 15585: case 15586: case 15589: case 15590: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15528: case 15530: case 15532: case 15534: case 15536: case 15538: case 15540: case 15542: case 15544: case 15546: case 15548: case 15550: case 15552: case 15554: case 15556: case 15558: case 15560: case 15562: case 15564: case 15566: case 15568: case 15570: case 15572: case 15574: case 15576: case 15578: case 15580: case 15582: case 15584: case 15586: case 15588: case 15590: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonFence\n\t{\n\t\tBlockState CrimsonFence()\n\t\t{\n\t\t\treturn 15094;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15081: case 15082: case 15085: case 15086: case 15089: case 15090: case 15093: case 15094: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15073: case 15074: case 15077: case 15078: case 15089: case 15090: case 15093: case 15094: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15069: case 15070: case 15077: case 15078: case 15085: case 15086: case 15093: case 15094: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15066: case 15070: case 15074: case 15078: case 15082: case 15086: case 15090: case 15094: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonFenceGate\n\t{\n\t\tBlockState CrimsonFenceGate()\n\t\t{\n\t\t\treturn 15262;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15271: case 15272: case 15273: case 15274: case 15275: case 15276: case 15277: case 15278: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15279: case 15280: case 15281: case 15282: case 15283: case 15284: case 15285: case 15286: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15255: case 15256: case 15257: case 15258: case 15259: case 15260: case 15261: case 15262: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool InWall(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15259: case 15260: case 15261: case 15262: case 15267: case 15268: case 15269: case 15270: case 15275: case 15276: case 15277: case 15278: case 15283: case 15284: case 15285: case 15286: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15257: case 15258: case 15261: case 15262: case 15265: case 15266: case 15269: case 15270: case 15273: case 15274: case 15277: case 15278: case 15281: case 15282: case 15285: case 15286: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15256: case 15258: case 15260: case 15262: case 15264: case 15266: case 15268: case 15270: case 15272: case 15274: case 15276: case 15278: case 15280: case 15282: case 15284: case 15286: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonFungus\n\t{\n\t}\n\tnamespace CrimsonHyphae\n\t{\n\t\tBlockState CrimsonHyphae()\n\t\t{\n\t\t\treturn 14982;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14981: return Axis::X;\n\t\t\t\tcase 14982: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonNylium\n\t{\n\t}\n\tnamespace CrimsonPlanks\n\t{\n\t}\n\tnamespace CrimsonPressurePlate\n\t{\n\t\tBlockState CrimsonPressurePlate()\n\t\t{\n\t\t\treturn 15060;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15060: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonRoots\n\t{\n\t}\n\tnamespace CrimsonSign\n\t{\n\t\tBlockState CrimsonSign()\n\t\t{\n\t\t\treturn 15656;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15656: return 0;\n\t\t\t\tcase 15658: return 1;\n\t\t\t\tcase 15676: return 10;\n\t\t\t\tcase 15678: return 11;\n\t\t\t\tcase 15680: return 12;\n\t\t\t\tcase 15682: return 13;\n\t\t\t\tcase 15684: return 14;\n\t\t\t\tcase 15686: return 15;\n\t\t\t\tcase 15660: return 2;\n\t\t\t\tcase 15662: return 3;\n\t\t\t\tcase 15664: return 4;\n\t\t\t\tcase 15666: return 5;\n\t\t\t\tcase 15668: return 6;\n\t\t\t\tcase 15670: return 7;\n\t\t\t\tcase 15672: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonSlab\n\t{\n\t\tBlockState CrimsonSlab()\n\t\t{\n\t\t\treturn 15050;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15050: return Type::Bottom;\n\t\t\t\tcase 15052: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonStairs\n\t{\n\t\tBlockState CrimsonStairs()\n\t\t{\n\t\t\treturn 15330;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15360: case 15362: case 15364: case 15366: case 15368: case 15370: case 15372: case 15374: case 15376: case 15378: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15380: case 15382: case 15384: case 15386: case 15388: case 15390: case 15392: case 15394: case 15396: case 15398: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15320: case 15322: case 15324: case 15326: case 15328: case 15330: case 15332: case 15334: case 15336: case 15338: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15330: case 15332: case 15334: case 15336: case 15338: case 15350: case 15352: case 15354: case 15356: case 15358: case 15370: case 15372: case 15374: case 15376: case 15378: case 15390: case 15392: case 15394: case 15396: case 15398: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15322: case 15332: case 15342: case 15352: case 15362: case 15372: case 15382: case 15392: return Shape::InnerLeft;\n\t\t\t\tcase 15324: case 15334: case 15344: case 15354: case 15364: case 15374: case 15384: case 15394: return Shape::InnerRight;\n\t\t\t\tcase 15326: case 15336: case 15346: case 15356: case 15366: case 15376: case 15386: case 15396: return Shape::OuterLeft;\n\t\t\t\tcase 15328: case 15338: case 15348: case 15358: case 15368: case 15378: case 15388: case 15398: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonStem\n\t{\n\t\tBlockState CrimsonStem()\n\t\t{\n\t\t\treturn 14976;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14975: return Axis::X;\n\t\t\t\tcase 14976: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonTrapdoor\n\t{\n\t\tBlockState CrimsonTrapdoor()\n\t\t{\n\t\t\treturn 15142;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15160: case 15162: case 15164: case 15166: case 15168: case 15170: case 15172: case 15174: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15176: case 15178: case 15180: case 15182: case 15184: case 15186: case 15188: case 15190: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15128: case 15130: case 15132: case 15134: case 15136: case 15138: case 15140: case 15142: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15136: case 15138: case 15140: case 15142: case 15152: case 15154: case 15156: case 15158: case 15168: case 15170: case 15172: case 15174: case 15184: case 15186: case 15188: case 15190: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15132: case 15134: case 15140: case 15142: case 15148: case 15150: case 15156: case 15158: case 15164: case 15166: case 15172: case 15174: case 15180: case 15182: case 15188: case 15190: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15130: case 15134: case 15138: case 15142: case 15146: case 15150: case 15154: case 15158: case 15162: case 15166: case 15170: case 15174: case 15178: case 15182: case 15186: case 15190: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CrimsonWallSign\n\t{\n\t\tBlockState CrimsonWallSign()\n\t\t{\n\t\t\treturn 15720;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15724: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15726: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15720: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CryingObsidian\n\t{\n\t}\n\tnamespace CutRedSandstone\n\t{\n\t}\n\tnamespace CutRedSandstoneSlab\n\t{\n\t\tBlockState CutRedSandstoneSlab()\n\t\t{\n\t\t\treturn 8405;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8405: return Type::Bottom;\n\t\t\t\tcase 8407: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CutSandstone\n\t{\n\t}\n\tnamespace CutSandstoneSlab\n\t{\n\t\tBlockState CutSandstoneSlab()\n\t\t{\n\t\t\treturn 8357;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8357: return Type::Bottom;\n\t\t\t\tcase 8359: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CyanBanner\n\t{\n\t\tBlockState CyanBanner()\n\t\t{\n\t\t\treturn 8041;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8041: return 0;\n\t\t\t\tcase 8042: return 1;\n\t\t\t\tcase 8051: return 10;\n\t\t\t\tcase 8052: return 11;\n\t\t\t\tcase 8053: return 12;\n\t\t\t\tcase 8054: return 13;\n\t\t\t\tcase 8055: return 14;\n\t\t\t\tcase 8056: return 15;\n\t\t\t\tcase 8043: return 2;\n\t\t\t\tcase 8044: return 3;\n\t\t\t\tcase 8045: return 4;\n\t\t\t\tcase 8046: return 5;\n\t\t\t\tcase 8047: return 6;\n\t\t\t\tcase 8048: return 7;\n\t\t\t\tcase 8049: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CyanBed\n\t{\n\t\tBlockState CyanBed()\n\t\t{\n\t\t\treturn 1196;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1201: case 1202: case 1203: case 1204: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1205: case 1206: case 1207: case 1208: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1193: case 1194: case 1195: case 1196: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1195: case 1196: case 1199: case 1200: case 1203: case 1204: case 1207: case 1208: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1194: case 1196: case 1198: case 1200: case 1202: case 1204: case 1206: case 1208: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CyanCarpet\n\t{\n\t}\n\tnamespace CyanConcrete\n\t{\n\t}\n\tnamespace CyanConcretePowder\n\t{\n\t}\n\tnamespace CyanGlazedTerracotta\n\t{\n\t\tBlockState CyanGlazedTerracotta()\n\t\t{\n\t\t\treturn 9410;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9412: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9413: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9410: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CyanShulkerBox\n\t{\n\t\tBlockState CyanShulkerBox()\n\t\t{\n\t\t\treturn 9336;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9335: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9333: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9337: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9336: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9332: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CyanStainedGlass\n\t{\n\t}\n\tnamespace CyanStainedGlassPane\n\t{\n\t\tBlockState CyanStainedGlassPane()\n\t\t{\n\t\t\treturn 7182;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7169: case 7170: case 7173: case 7174: case 7177: case 7178: case 7181: case 7182: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7161: case 7162: case 7165: case 7166: case 7177: case 7178: case 7181: case 7182: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7157: case 7158: case 7165: case 7166: case 7173: case 7174: case 7181: case 7182: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7154: case 7158: case 7162: case 7166: case 7170: case 7174: case 7178: case 7182: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CyanTerracotta\n\t{\n\t}\n\tnamespace CyanWallBanner\n\t{\n\t\tBlockState CyanWallBanner()\n\t\t{\n\t\t\treturn 8189;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8191: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8192: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8189: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace CyanWool\n\t{\n\t}\n\tnamespace DamagedAnvil\n\t{\n\t\tBlockState DamagedAnvil()\n\t\t{\n\t\t\treturn 6618;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6620: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6621: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6618: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Dandelion\n\t{\n\t}\n\tnamespace DarkOakButton\n\t{\n\t\tBlockState DarkOakButton()\n\t\t{\n\t\t\treturn 6475;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6482: case 6483: case 6484: case 6485: case 6486: case 6487: case 6488: case 6489: return Face::Ceiling;\n\t\t\t\tcase 6466: case 6467: case 6468: case 6469: case 6470: case 6471: case 6472: case 6473: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6470: case 6471: case 6478: case 6479: case 6486: case 6487: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6472: case 6473: case 6480: case 6481: case 6488: case 6489: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6466: case 6467: case 6474: case 6475: case 6482: case 6483: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6467: case 6469: case 6471: case 6473: case 6475: case 6477: case 6479: case 6481: case 6483: case 6485: case 6487: case 6489: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakDoor\n\t{\n\t\tBlockState DarkOakDoor()\n\t\t{\n\t\t\treturn 9005;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9026: case 9027: case 9028: case 9029: case 9030: case 9031: case 9032: case 9033: case 9034: case 9035: case 9036: case 9037: case 9038: case 9039: case 9040: case 9041: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9042: case 9043: case 9044: case 9045: case 9046: case 9047: case 9048: case 9049: case 9050: case 9051: case 9052: case 9053: case 9054: case 9055: case 9056: case 9057: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8994: case 8995: case 8996: case 8997: case 8998: case 8999: case 9000: case 9001: case 9002: case 9003: case 9004: case 9005: case 9006: case 9007: case 9008: case 9009: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9002: case 9003: case 9004: case 9005: case 9006: case 9007: case 9008: case 9009: case 9018: case 9019: case 9020: case 9021: case 9022: case 9023: case 9024: case 9025: case 9034: case 9035: case 9036: case 9037: case 9038: case 9039: case 9040: case 9041: case 9050: case 9051: case 9052: case 9053: case 9054: case 9055: case 9056: case 9057: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8994: case 8995: case 8996: case 8997: case 9002: case 9003: case 9004: case 9005: case 9010: case 9011: case 9012: case 9013: case 9018: case 9019: case 9020: case 9021: case 9026: case 9027: case 9028: case 9029: case 9034: case 9035: case 9036: case 9037: case 9042: case 9043: case 9044: case 9045: case 9050: case 9051: case 9052: case 9053: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8996: case 8997: case 9000: case 9001: case 9004: case 9005: case 9008: case 9009: case 9012: case 9013: case 9016: case 9017: case 9020: case 9021: case 9024: case 9025: case 9028: case 9029: case 9032: case 9033: case 9036: case 9037: case 9040: case 9041: case 9044: case 9045: case 9048: case 9049: case 9052: case 9053: case 9056: case 9057: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8995: case 8997: case 8999: case 9001: case 9003: case 9005: case 9007: case 9009: case 9011: case 9013: case 9015: case 9017: case 9019: case 9021: case 9023: case 9025: case 9027: case 9029: case 9031: case 9033: case 9035: case 9037: case 9039: case 9041: case 9043: case 9045: case 9047: case 9049: case 9051: case 9053: case 9055: case 9057: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakFence\n\t{\n\t\tBlockState DarkOakFence()\n\t\t{\n\t\t\treturn 8737;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8724: case 8725: case 8728: case 8729: case 8732: case 8733: case 8736: case 8737: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8716: case 8717: case 8720: case 8721: case 8732: case 8733: case 8736: case 8737: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8712: case 8713: case 8720: case 8721: case 8728: case 8729: case 8736: case 8737: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8709: case 8713: case 8717: case 8721: case 8725: case 8729: case 8733: case 8737: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakFenceGate\n\t{\n\t\tBlockState DarkOakFenceGate()\n\t\t{\n\t\t\treturn 8553;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8562: case 8563: case 8564: case 8565: case 8566: case 8567: case 8568: case 8569: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8570: case 8571: case 8572: case 8573: case 8574: case 8575: case 8576: case 8577: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8546: case 8547: case 8548: case 8549: case 8550: case 8551: case 8552: case 8553: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool InWall(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8550: case 8551: case 8552: case 8553: case 8558: case 8559: case 8560: case 8561: case 8566: case 8567: case 8568: case 8569: case 8574: case 8575: case 8576: case 8577: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8548: case 8549: case 8552: case 8553: case 8556: case 8557: case 8560: case 8561: case 8564: case 8565: case 8568: case 8569: case 8572: case 8573: case 8576: case 8577: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8547: case 8549: case 8551: case 8553: case 8555: case 8557: case 8559: case 8561: case 8563: case 8565: case 8567: case 8569: case 8571: case 8573: case 8575: case 8577: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakLeaves\n\t{\n\t\tBlockState DarkOakLeaves()\n\t\t{\n\t\t\treturn 228;\n\t\t}\n\t\tunsigned char Distance(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 215: case 216: return 1;\n\t\t\t\tcase 217: case 218: return 2;\n\t\t\t\tcase 219: case 220: return 3;\n\t\t\t\tcase 221: case 222: return 4;\n\t\t\t\tcase 223: case 224: return 5;\n\t\t\t\tcase 225: case 226: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t\tbool Persistent(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 216: case 218: case 220: case 222: case 224: case 226: case 228: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakLog\n\t{\n\t\tBlockState DarkOakLog()\n\t\t{\n\t\t\treturn 89;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 88: return Axis::X;\n\t\t\t\tcase 89: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakPlanks\n\t{\n\t}\n\tnamespace DarkOakPressurePlate\n\t{\n\t\tBlockState DarkOakPressurePlate()\n\t\t{\n\t\t\treturn 3884;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3884: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakSapling\n\t{\n\t\tBlockState DarkOakSapling()\n\t\t{\n\t\t\treturn 31;\n\t\t}\n\t\tunsigned char Stage(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 31: return 0;\n\t\t\t\tdefault: return 1;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakSign\n\t{\n\t\tBlockState DarkOakSign()\n\t\t{\n\t\t\treturn 3542;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3542: return 0;\n\t\t\t\tcase 3544: return 1;\n\t\t\t\tcase 3562: return 10;\n\t\t\t\tcase 3564: return 11;\n\t\t\t\tcase 3566: return 12;\n\t\t\t\tcase 3568: return 13;\n\t\t\t\tcase 3570: return 14;\n\t\t\t\tcase 3572: return 15;\n\t\t\t\tcase 3546: return 2;\n\t\t\t\tcase 3548: return 3;\n\t\t\t\tcase 3550: return 4;\n\t\t\t\tcase 3552: return 5;\n\t\t\t\tcase 3554: return 6;\n\t\t\t\tcase 3556: return 7;\n\t\t\t\tcase 3558: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakSlab\n\t{\n\t\tBlockState DarkOakSlab()\n\t\t{\n\t\t\treturn 8333;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8333: return Type::Bottom;\n\t\t\t\tcase 8335: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakStairs\n\t{\n\t\tBlockState DarkOakStairs()\n\t\t{\n\t\t\treturn 7466;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7496: case 7498: case 7500: case 7502: case 7504: case 7506: case 7508: case 7510: case 7512: case 7514: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 7516: case 7518: case 7520: case 7522: case 7524: case 7526: case 7528: case 7530: case 7532: case 7534: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 7456: case 7458: case 7460: case 7462: case 7464: case 7466: case 7468: case 7470: case 7472: case 7474: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7466: case 7468: case 7470: case 7472: case 7474: case 7486: case 7488: case 7490: case 7492: case 7494: case 7506: case 7508: case 7510: case 7512: case 7514: case 7526: case 7528: case 7530: case 7532: case 7534: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7458: case 7468: case 7478: case 7488: case 7498: case 7508: case 7518: case 7528: return Shape::InnerLeft;\n\t\t\t\tcase 7460: case 7470: case 7480: case 7490: case 7500: case 7510: case 7520: case 7530: return Shape::InnerRight;\n\t\t\t\tcase 7462: case 7472: case 7482: case 7492: case 7502: case 7512: case 7522: case 7532: return Shape::OuterLeft;\n\t\t\t\tcase 7464: case 7474: case 7484: case 7494: case 7504: case 7514: case 7524: case 7534: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakTrapdoor\n\t{\n\t\tBlockState DarkOakTrapdoor()\n\t\t{\n\t\t\treturn 4446;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4464: case 4466: case 4468: case 4470: case 4472: case 4474: case 4476: case 4478: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4480: case 4482: case 4484: case 4486: case 4488: case 4490: case 4492: case 4494: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4432: case 4434: case 4436: case 4438: case 4440: case 4442: case 4444: case 4446: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4440: case 4442: case 4444: case 4446: case 4456: case 4458: case 4460: case 4462: case 4472: case 4474: case 4476: case 4478: case 4488: case 4490: case 4492: case 4494: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4436: case 4438: case 4444: case 4446: case 4452: case 4454: case 4460: case 4462: case 4468: case 4470: case 4476: case 4478: case 4484: case 4486: case 4492: case 4494: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4434: case 4438: case 4442: case 4446: case 4450: case 4454: case 4458: case 4462: case 4466: case 4470: case 4474: case 4478: case 4482: case 4486: case 4490: case 4494: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakWallSign\n\t{\n\t\tBlockState DarkOakWallSign()\n\t\t{\n\t\t\treturn 3776;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3780: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3782: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3776: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkOakWood\n\t{\n\t\tBlockState DarkOakWood()\n\t\t{\n\t\t\treturn 125;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 124: return Axis::X;\n\t\t\t\tcase 125: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkPrismarine\n\t{\n\t}\n\tnamespace DarkPrismarineSlab\n\t{\n\t\tBlockState DarkPrismarineSlab()\n\t\t{\n\t\t\treturn 7859;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7859: return Type::Bottom;\n\t\t\t\tcase 7861: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DarkPrismarineStairs\n\t{\n\t\tBlockState DarkPrismarineStairs()\n\t\t{\n\t\t\treturn 7775;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7805: case 7807: case 7809: case 7811: case 7813: case 7815: case 7817: case 7819: case 7821: case 7823: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 7825: case 7827: case 7829: case 7831: case 7833: case 7835: case 7837: case 7839: case 7841: case 7843: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 7765: case 7767: case 7769: case 7771: case 7773: case 7775: case 7777: case 7779: case 7781: case 7783: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7775: case 7777: case 7779: case 7781: case 7783: case 7795: case 7797: case 7799: case 7801: case 7803: case 7815: case 7817: case 7819: case 7821: case 7823: case 7835: case 7837: case 7839: case 7841: case 7843: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7767: case 7777: case 7787: case 7797: case 7807: case 7817: case 7827: case 7837: return Shape::InnerLeft;\n\t\t\t\tcase 7769: case 7779: case 7789: case 7799: case 7809: case 7819: case 7829: case 7839: return Shape::InnerRight;\n\t\t\t\tcase 7771: case 7781: case 7791: case 7801: case 7811: case 7821: case 7831: case 7841: return Shape::OuterLeft;\n\t\t\t\tcase 7773: case 7783: case 7793: case 7803: case 7813: case 7823: case 7833: case 7843: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DaylightDetector\n\t{\n\t\tBlockState DaylightDetector()\n\t\t{\n\t\t\treturn 6710;\n\t\t}\n\t\tbool Inverted(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6710: case 6711: case 6712: case 6713: case 6714: case 6715: case 6716: case 6717: case 6718: case 6719: case 6720: case 6721: case 6722: case 6723: case 6724: case 6725: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tunsigned char Power(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6694: case 6710: return 0;\n\t\t\t\tcase 6695: case 6711: return 1;\n\t\t\t\tcase 6704: case 6720: return 10;\n\t\t\t\tcase 6705: case 6721: return 11;\n\t\t\t\tcase 6706: case 6722: return 12;\n\t\t\t\tcase 6707: case 6723: return 13;\n\t\t\t\tcase 6708: case 6724: return 14;\n\t\t\t\tcase 6709: case 6725: return 15;\n\t\t\t\tcase 6696: case 6712: return 2;\n\t\t\t\tcase 6697: case 6713: return 3;\n\t\t\t\tcase 6698: case 6714: return 4;\n\t\t\t\tcase 6699: case 6715: return 5;\n\t\t\t\tcase 6700: case 6716: return 6;\n\t\t\t\tcase 6701: case 6717: return 7;\n\t\t\t\tcase 6702: case 6718: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DeadBrainCoral\n\t{\n\t}\n\tnamespace DeadBrainCoralBlock\n\t{\n\t}\n\tnamespace DeadBrainCoralFan\n\t{\n\t}\n\tnamespace DeadBrainCoralWallFan\n\t{\n\t\tBlockState DeadBrainCoralWallFan()\n\t\t{\n\t\t\treturn 9568;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9573: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9575: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9569: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DeadBubbleCoral\n\t{\n\t}\n\tnamespace DeadBubbleCoralBlock\n\t{\n\t}\n\tnamespace DeadBubbleCoralFan\n\t{\n\t}\n\tnamespace DeadBubbleCoralWallFan\n\t{\n\t\tBlockState DeadBubbleCoralWallFan()\n\t\t{\n\t\t\treturn 9576;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9581: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9583: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9577: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DeadBush\n\t{\n\t}\n\tnamespace DeadFireCoral\n\t{\n\t}\n\tnamespace DeadFireCoralBlock\n\t{\n\t}\n\tnamespace DeadFireCoralFan\n\t{\n\t}\n\tnamespace DeadFireCoralWallFan\n\t{\n\t\tBlockState DeadFireCoralWallFan()\n\t\t{\n\t\t\treturn 9584;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9589: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9591: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9585: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DeadHornCoral\n\t{\n\t}\n\tnamespace DeadHornCoralBlock\n\t{\n\t}\n\tnamespace DeadHornCoralFan\n\t{\n\t}\n\tnamespace DeadHornCoralWallFan\n\t{\n\t\tBlockState DeadHornCoralWallFan()\n\t\t{\n\t\t\treturn 9592;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9597: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9599: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9593: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DeadTubeCoral\n\t{\n\t}\n\tnamespace DeadTubeCoralBlock\n\t{\n\t}\n\tnamespace DeadTubeCoralFan\n\t{\n\t}\n\tnamespace DeadTubeCoralWallFan\n\t{\n\t\tBlockState DeadTubeCoralWallFan()\n\t\t{\n\t\t\treturn 9560;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9565: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9567: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9561: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DetectorRail\n\t{\n\t\tBlockState DetectorRail()\n\t\t{\n\t\t\treturn 1323;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1323: case 1324: case 1325: case 1326: case 1327: case 1328: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1319: case 1325: return Shape::AscendingEast;\n\t\t\t\tcase 1321: case 1327: return Shape::AscendingNorth;\n\t\t\t\tcase 1322: case 1328: return Shape::AscendingSouth;\n\t\t\t\tcase 1320: case 1326: return Shape::AscendingWest;\n\t\t\t\tcase 1318: case 1324: return Shape::EastWest;\n\t\t\t\tdefault: return Shape::NorthSouth;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DiamondBlock\n\t{\n\t}\n\tnamespace DiamondOre\n\t{\n\t}\n\tnamespace Diorite\n\t{\n\t}\n\tnamespace DioriteSlab\n\t{\n\t\tBlockState DioriteSlab()\n\t\t{\n\t\t\treturn 10864;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10864: return Type::Bottom;\n\t\t\t\tcase 10866: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DioriteStairs\n\t{\n\t\tBlockState DioriteStairs()\n\t\t{\n\t\t\treturn 10720;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10750: case 10752: case 10754: case 10756: case 10758: case 10760: case 10762: case 10764: case 10766: case 10768: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10770: case 10772: case 10774: case 10776: case 10778: case 10780: case 10782: case 10784: case 10786: case 10788: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10710: case 10712: case 10714: case 10716: case 10718: case 10720: case 10722: case 10724: case 10726: case 10728: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10720: case 10722: case 10724: case 10726: case 10728: case 10740: case 10742: case 10744: case 10746: case 10748: case 10760: case 10762: case 10764: case 10766: case 10768: case 10780: case 10782: case 10784: case 10786: case 10788: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10712: case 10722: case 10732: case 10742: case 10752: case 10762: case 10772: case 10782: return Shape::InnerLeft;\n\t\t\t\tcase 10714: case 10724: case 10734: case 10744: case 10754: case 10764: case 10774: case 10784: return Shape::InnerRight;\n\t\t\t\tcase 10716: case 10726: case 10736: case 10746: case 10756: case 10766: case 10776: case 10786: return Shape::OuterLeft;\n\t\t\t\tcase 10718: case 10728: case 10738: case 10748: case 10758: case 10768: case 10778: case 10788: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DioriteWall\n\t{\n\t\tBlockState DioriteWall()\n\t\t{\n\t\t\treturn 14434;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14542: case 14543: case 14544: case 14548: case 14549: case 14550: case 14554: case 14555: case 14556: case 14560: case 14561: case 14562: case 14566: case 14567: case 14568: case 14572: case 14573: case 14574: case 14578: case 14579: case 14580: case 14584: case 14585: case 14586: case 14590: case 14591: case 14592: case 14596: case 14597: case 14598: case 14602: case 14603: case 14604: case 14608: case 14609: case 14610: case 14614: case 14615: case 14616: case 14620: case 14621: case 14622: case 14626: case 14627: case 14628: case 14632: case 14633: case 14634: case 14638: case 14639: case 14640: case 14644: case 14645: case 14646: return East::Low;\n\t\t\t\tcase 14434: case 14435: case 14436: case 14440: case 14441: case 14442: case 14446: case 14447: case 14448: case 14452: case 14453: case 14454: case 14458: case 14459: case 14460: case 14464: case 14465: case 14466: case 14470: case 14471: case 14472: case 14476: case 14477: case 14478: case 14482: case 14483: case 14484: case 14488: case 14489: case 14490: case 14494: case 14495: case 14496: case 14500: case 14501: case 14502: case 14506: case 14507: case 14508: case 14512: case 14513: case 14514: case 14518: case 14519: case 14520: case 14524: case 14525: case 14526: case 14530: case 14531: case 14532: case 14536: case 14537: case 14538: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14470: case 14471: case 14472: case 14476: case 14477: case 14478: case 14482: case 14483: case 14484: case 14488: case 14489: case 14490: case 14494: case 14495: case 14496: case 14500: case 14501: case 14502: case 14578: case 14579: case 14580: case 14584: case 14585: case 14586: case 14590: case 14591: case 14592: case 14596: case 14597: case 14598: case 14602: case 14603: case 14604: case 14608: case 14609: case 14610: case 14686: case 14687: case 14688: case 14692: case 14693: case 14694: case 14698: case 14699: case 14700: case 14704: case 14705: case 14706: case 14710: case 14711: case 14712: case 14716: case 14717: case 14718: return North::Low;\n\t\t\t\tcase 14434: case 14435: case 14436: case 14440: case 14441: case 14442: case 14446: case 14447: case 14448: case 14452: case 14453: case 14454: case 14458: case 14459: case 14460: case 14464: case 14465: case 14466: case 14542: case 14543: case 14544: case 14548: case 14549: case 14550: case 14554: case 14555: case 14556: case 14560: case 14561: case 14562: case 14566: case 14567: case 14568: case 14572: case 14573: case 14574: case 14650: case 14651: case 14652: case 14656: case 14657: case 14658: case 14662: case 14663: case 14664: case 14668: case 14669: case 14670: case 14674: case 14675: case 14676: case 14680: case 14681: case 14682: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14446: case 14447: case 14448: case 14452: case 14453: case 14454: case 14482: case 14483: case 14484: case 14488: case 14489: case 14490: case 14518: case 14519: case 14520: case 14524: case 14525: case 14526: case 14554: case 14555: case 14556: case 14560: case 14561: case 14562: case 14590: case 14591: case 14592: case 14596: case 14597: case 14598: case 14626: case 14627: case 14628: case 14632: case 14633: case 14634: case 14662: case 14663: case 14664: case 14668: case 14669: case 14670: case 14698: case 14699: case 14700: case 14704: case 14705: case 14706: case 14734: case 14735: case 14736: case 14740: case 14741: case 14742: return South::Low;\n\t\t\t\tcase 14434: case 14435: case 14436: case 14440: case 14441: case 14442: case 14470: case 14471: case 14472: case 14476: case 14477: case 14478: case 14506: case 14507: case 14508: case 14512: case 14513: case 14514: case 14542: case 14543: case 14544: case 14548: case 14549: case 14550: case 14578: case 14579: case 14580: case 14584: case 14585: case 14586: case 14614: case 14615: case 14616: case 14620: case 14621: case 14622: case 14650: case 14651: case 14652: case 14656: case 14657: case 14658: case 14686: case 14687: case 14688: case 14692: case 14693: case 14694: case 14722: case 14723: case 14724: case 14728: case 14729: case 14730: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14440: case 14441: case 14442: case 14452: case 14453: case 14454: case 14464: case 14465: case 14466: case 14476: case 14477: case 14478: case 14488: case 14489: case 14490: case 14500: case 14501: case 14502: case 14512: case 14513: case 14514: case 14524: case 14525: case 14526: case 14536: case 14537: case 14538: case 14548: case 14549: case 14550: case 14560: case 14561: case 14562: case 14572: case 14573: case 14574: case 14584: case 14585: case 14586: case 14596: case 14597: case 14598: case 14608: case 14609: case 14610: case 14620: case 14621: case 14622: case 14632: case 14633: case 14634: case 14644: case 14645: case 14646: case 14656: case 14657: case 14658: case 14668: case 14669: case 14670: case 14680: case 14681: case 14682: case 14692: case 14693: case 14694: case 14704: case 14705: case 14706: case 14716: case 14717: case 14718: case 14728: case 14729: case 14730: case 14740: case 14741: case 14742: case 14752: case 14753: case 14754: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14435: case 14441: case 14447: case 14453: case 14459: case 14465: case 14471: case 14477: case 14483: case 14489: case 14495: case 14501: case 14507: case 14513: case 14519: case 14525: case 14531: case 14537: case 14543: case 14549: case 14555: case 14561: case 14567: case 14573: case 14579: case 14585: case 14591: case 14597: case 14603: case 14609: case 14615: case 14621: case 14627: case 14633: case 14639: case 14645: case 14651: case 14657: case 14663: case 14669: case 14675: case 14681: case 14687: case 14693: case 14699: case 14705: case 14711: case 14717: case 14723: case 14729: case 14735: case 14741: case 14747: case 14753: return West::Low;\n\t\t\t\tcase 14434: case 14440: case 14446: case 14452: case 14458: case 14464: case 14470: case 14476: case 14482: case 14488: case 14494: case 14500: case 14506: case 14512: case 14518: case 14524: case 14530: case 14536: case 14542: case 14548: case 14554: case 14560: case 14566: case 14572: case 14578: case 14584: case 14590: case 14596: case 14602: case 14608: case 14614: case 14620: case 14626: case 14632: case 14638: case 14644: case 14650: case 14656: case 14662: case 14668: case 14674: case 14680: case 14686: case 14692: case 14698: case 14704: case 14710: case 14716: case 14722: case 14728: case 14734: case 14740: case 14746: case 14752: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Dirt\n\t{\n\t}\n\tnamespace Dispenser\n\t{\n\t\tBlockState Dispenser()\n\t\t{\n\t\t\treturn 235;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 240: case 241: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 236: case 237: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 244: case 245: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 242: case 243: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 234: case 235: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Triggered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 235: case 237: case 239: case 241: case 243: case 245: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DragonEgg\n\t{\n\t}\n\tnamespace DragonHead\n\t{\n\t\tBlockState DragonHead()\n\t\t{\n\t\t\treturn 6590;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6590: return 0;\n\t\t\t\tcase 6591: return 1;\n\t\t\t\tcase 6600: return 10;\n\t\t\t\tcase 6601: return 11;\n\t\t\t\tcase 6602: return 12;\n\t\t\t\tcase 6603: return 13;\n\t\t\t\tcase 6604: return 14;\n\t\t\t\tcase 6605: return 15;\n\t\t\t\tcase 6592: return 2;\n\t\t\t\tcase 6593: return 3;\n\t\t\t\tcase 6594: return 4;\n\t\t\t\tcase 6595: return 5;\n\t\t\t\tcase 6596: return 6;\n\t\t\t\tcase 6597: return 7;\n\t\t\t\tcase 6598: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DragonWallHead\n\t{\n\t\tBlockState DragonWallHead()\n\t\t{\n\t\t\treturn 6606;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6608: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6609: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6606: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace DriedKelpBlock\n\t{\n\t}\n\tnamespace Dropper\n\t{\n\t\tBlockState Dropper()\n\t\t{\n\t\t\treturn 6836;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6841: case 6842: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6837: case 6838: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6845: case 6846: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 6843: case 6844: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 6835: case 6836: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Triggered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6836: case 6838: case 6840: case 6842: case 6844: case 6846: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace EmeraldBlock\n\t{\n\t}\n\tnamespace EmeraldOre\n\t{\n\t}\n\tnamespace EnchantingTable\n\t{\n\t}\n\tnamespace EndGateway\n\t{\n\t}\n\tnamespace EndPortal\n\t{\n\t}\n\tnamespace EndPortalFrame\n\t{\n\t\tBlockState EndPortalFrame()\n\t\t{\n\t\t\treturn 5150;\n\t\t}\n\t\tbool Eye(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5150: case 5151: case 5152: case 5153: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5148: case 5152: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5149: case 5153: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5146: case 5150: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace EndRod\n\t{\n\t\tBlockState EndRod()\n\t\t{\n\t\t\treturn 9062;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9061: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9059: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9063: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9062: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9058: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace EndStone\n\t{\n\t}\n\tnamespace EndStoneBrickSlab\n\t{\n\t\tBlockState EndStoneBrickSlab()\n\t\t{\n\t\t\treturn 10822;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10822: return Type::Bottom;\n\t\t\t\tcase 10824: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace EndStoneBrickStairs\n\t{\n\t\tBlockState EndStoneBrickStairs()\n\t\t{\n\t\t\treturn 10080;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10110: case 10112: case 10114: case 10116: case 10118: case 10120: case 10122: case 10124: case 10126: case 10128: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10130: case 10132: case 10134: case 10136: case 10138: case 10140: case 10142: case 10144: case 10146: case 10148: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10070: case 10072: case 10074: case 10076: case 10078: case 10080: case 10082: case 10084: case 10086: case 10088: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10080: case 10082: case 10084: case 10086: case 10088: case 10100: case 10102: case 10104: case 10106: case 10108: case 10120: case 10122: case 10124: case 10126: case 10128: case 10140: case 10142: case 10144: case 10146: case 10148: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10072: case 10082: case 10092: case 10102: case 10112: case 10122: case 10132: case 10142: return Shape::InnerLeft;\n\t\t\t\tcase 10074: case 10084: case 10094: case 10104: case 10114: case 10124: case 10134: case 10144: return Shape::InnerRight;\n\t\t\t\tcase 10076: case 10086: case 10096: case 10106: case 10116: case 10126: case 10136: case 10146: return Shape::OuterLeft;\n\t\t\t\tcase 10078: case 10088: case 10098: case 10108: case 10118: case 10128: case 10138: case 10148: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace EndStoneBrickWall\n\t{\n\t\tBlockState EndStoneBrickWall()\n\t\t{\n\t\t\treturn 14110;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14218: case 14219: case 14220: case 14224: case 14225: case 14226: case 14230: case 14231: case 14232: case 14236: case 14237: case 14238: case 14242: case 14243: case 14244: case 14248: case 14249: case 14250: case 14254: case 14255: case 14256: case 14260: case 14261: case 14262: case 14266: case 14267: case 14268: case 14272: case 14273: case 14274: case 14278: case 14279: case 14280: case 14284: case 14285: case 14286: case 14290: case 14291: case 14292: case 14296: case 14297: case 14298: case 14302: case 14303: case 14304: case 14308: case 14309: case 14310: case 14314: case 14315: case 14316: case 14320: case 14321: case 14322: return East::Low;\n\t\t\t\tcase 14110: case 14111: case 14112: case 14116: case 14117: case 14118: case 14122: case 14123: case 14124: case 14128: case 14129: case 14130: case 14134: case 14135: case 14136: case 14140: case 14141: case 14142: case 14146: case 14147: case 14148: case 14152: case 14153: case 14154: case 14158: case 14159: case 14160: case 14164: case 14165: case 14166: case 14170: case 14171: case 14172: case 14176: case 14177: case 14178: case 14182: case 14183: case 14184: case 14188: case 14189: case 14190: case 14194: case 14195: case 14196: case 14200: case 14201: case 14202: case 14206: case 14207: case 14208: case 14212: case 14213: case 14214: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14146: case 14147: case 14148: case 14152: case 14153: case 14154: case 14158: case 14159: case 14160: case 14164: case 14165: case 14166: case 14170: case 14171: case 14172: case 14176: case 14177: case 14178: case 14254: case 14255: case 14256: case 14260: case 14261: case 14262: case 14266: case 14267: case 14268: case 14272: case 14273: case 14274: case 14278: case 14279: case 14280: case 14284: case 14285: case 14286: case 14362: case 14363: case 14364: case 14368: case 14369: case 14370: case 14374: case 14375: case 14376: case 14380: case 14381: case 14382: case 14386: case 14387: case 14388: case 14392: case 14393: case 14394: return North::Low;\n\t\t\t\tcase 14110: case 14111: case 14112: case 14116: case 14117: case 14118: case 14122: case 14123: case 14124: case 14128: case 14129: case 14130: case 14134: case 14135: case 14136: case 14140: case 14141: case 14142: case 14218: case 14219: case 14220: case 14224: case 14225: case 14226: case 14230: case 14231: case 14232: case 14236: case 14237: case 14238: case 14242: case 14243: case 14244: case 14248: case 14249: case 14250: case 14326: case 14327: case 14328: case 14332: case 14333: case 14334: case 14338: case 14339: case 14340: case 14344: case 14345: case 14346: case 14350: case 14351: case 14352: case 14356: case 14357: case 14358: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14122: case 14123: case 14124: case 14128: case 14129: case 14130: case 14158: case 14159: case 14160: case 14164: case 14165: case 14166: case 14194: case 14195: case 14196: case 14200: case 14201: case 14202: case 14230: case 14231: case 14232: case 14236: case 14237: case 14238: case 14266: case 14267: case 14268: case 14272: case 14273: case 14274: case 14302: case 14303: case 14304: case 14308: case 14309: case 14310: case 14338: case 14339: case 14340: case 14344: case 14345: case 14346: case 14374: case 14375: case 14376: case 14380: case 14381: case 14382: case 14410: case 14411: case 14412: case 14416: case 14417: case 14418: return South::Low;\n\t\t\t\tcase 14110: case 14111: case 14112: case 14116: case 14117: case 14118: case 14146: case 14147: case 14148: case 14152: case 14153: case 14154: case 14182: case 14183: case 14184: case 14188: case 14189: case 14190: case 14218: case 14219: case 14220: case 14224: case 14225: case 14226: case 14254: case 14255: case 14256: case 14260: case 14261: case 14262: case 14290: case 14291: case 14292: case 14296: case 14297: case 14298: case 14326: case 14327: case 14328: case 14332: case 14333: case 14334: case 14362: case 14363: case 14364: case 14368: case 14369: case 14370: case 14398: case 14399: case 14400: case 14404: case 14405: case 14406: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14116: case 14117: case 14118: case 14128: case 14129: case 14130: case 14140: case 14141: case 14142: case 14152: case 14153: case 14154: case 14164: case 14165: case 14166: case 14176: case 14177: case 14178: case 14188: case 14189: case 14190: case 14200: case 14201: case 14202: case 14212: case 14213: case 14214: case 14224: case 14225: case 14226: case 14236: case 14237: case 14238: case 14248: case 14249: case 14250: case 14260: case 14261: case 14262: case 14272: case 14273: case 14274: case 14284: case 14285: case 14286: case 14296: case 14297: case 14298: case 14308: case 14309: case 14310: case 14320: case 14321: case 14322: case 14332: case 14333: case 14334: case 14344: case 14345: case 14346: case 14356: case 14357: case 14358: case 14368: case 14369: case 14370: case 14380: case 14381: case 14382: case 14392: case 14393: case 14394: case 14404: case 14405: case 14406: case 14416: case 14417: case 14418: case 14428: case 14429: case 14430: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14111: case 14117: case 14123: case 14129: case 14135: case 14141: case 14147: case 14153: case 14159: case 14165: case 14171: case 14177: case 14183: case 14189: case 14195: case 14201: case 14207: case 14213: case 14219: case 14225: case 14231: case 14237: case 14243: case 14249: case 14255: case 14261: case 14267: case 14273: case 14279: case 14285: case 14291: case 14297: case 14303: case 14309: case 14315: case 14321: case 14327: case 14333: case 14339: case 14345: case 14351: case 14357: case 14363: case 14369: case 14375: case 14381: case 14387: case 14393: case 14399: case 14405: case 14411: case 14417: case 14423: case 14429: return West::Low;\n\t\t\t\tcase 14110: case 14116: case 14122: case 14128: case 14134: case 14140: case 14146: case 14152: case 14158: case 14164: case 14170: case 14176: case 14182: case 14188: case 14194: case 14200: case 14206: case 14212: case 14218: case 14224: case 14230: case 14236: case 14242: case 14248: case 14254: case 14260: case 14266: case 14272: case 14278: case 14284: case 14290: case 14296: case 14302: case 14308: case 14314: case 14320: case 14326: case 14332: case 14338: case 14344: case 14350: case 14356: case 14362: case 14368: case 14374: case 14380: case 14386: case 14392: case 14398: case 14404: case 14410: case 14416: case 14422: case 14428: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace EndStoneBricks\n\t{\n\t}\n\tnamespace EnderChest\n\t{\n\t\tBlockState EnderChest()\n\t\t{\n\t\t\treturn 5252;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5256: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5258: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5252: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Farmland\n\t{\n\t\tBlockState Farmland()\n\t\t{\n\t\t\treturn 3365;\n\t\t}\n\t\tunsigned char Moisture(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3365: return 0;\n\t\t\t\tcase 3366: return 1;\n\t\t\t\tcase 3367: return 2;\n\t\t\t\tcase 3368: return 3;\n\t\t\t\tcase 3369: return 4;\n\t\t\t\tcase 3370: return 5;\n\t\t\t\tcase 3371: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Fern\n\t{\n\t}\n\tnamespace Fire\n\t{\n\t\tBlockState Fire()\n\t\t{\n\t\t\treturn 1471;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1440: case 1441: case 1442: case 1443: case 1444: case 1445: case 1446: case 1447: case 1448: case 1449: case 1450: case 1451: case 1452: case 1453: case 1454: case 1455: case 1456: case 1457: case 1458: case 1459: case 1460: case 1461: case 1462: case 1463: case 1464: case 1465: case 1466: case 1467: case 1468: case 1469: case 1470: case 1471: return 0;\n\t\t\t\tcase 1472: case 1473: case 1474: case 1475: case 1476: case 1477: case 1478: case 1479: case 1480: case 1481: case 1482: case 1483: case 1484: case 1485: case 1486: case 1487: case 1488: case 1489: case 1490: case 1491: case 1492: case 1493: case 1494: case 1495: case 1496: case 1497: case 1498: case 1499: case 1500: case 1501: case 1502: case 1503: return 1;\n\t\t\t\tcase 1760: case 1761: case 1762: case 1763: case 1764: case 1765: case 1766: case 1767: case 1768: case 1769: case 1770: case 1771: case 1772: case 1773: case 1774: case 1775: case 1776: case 1777: case 1778: case 1779: case 1780: case 1781: case 1782: case 1783: case 1784: case 1785: case 1786: case 1787: case 1788: case 1789: case 1790: case 1791: return 10;\n\t\t\t\tcase 1792: case 1793: case 1794: case 1795: case 1796: case 1797: case 1798: case 1799: case 1800: case 1801: case 1802: case 1803: case 1804: case 1805: case 1806: case 1807: case 1808: case 1809: case 1810: case 1811: case 1812: case 1813: case 1814: case 1815: case 1816: case 1817: case 1818: case 1819: case 1820: case 1821: case 1822: case 1823: return 11;\n\t\t\t\tcase 1824: case 1825: case 1826: case 1827: case 1828: case 1829: case 1830: case 1831: case 1832: case 1833: case 1834: case 1835: case 1836: case 1837: case 1838: case 1839: case 1840: case 1841: case 1842: case 1843: case 1844: case 1845: case 1846: case 1847: case 1848: case 1849: case 1850: case 1851: case 1852: case 1853: case 1854: case 1855: return 12;\n\t\t\t\tcase 1856: case 1857: case 1858: case 1859: case 1860: case 1861: case 1862: case 1863: case 1864: case 1865: case 1866: case 1867: case 1868: case 1869: case 1870: case 1871: case 1872: case 1873: case 1874: case 1875: case 1876: case 1877: case 1878: case 1879: case 1880: case 1881: case 1882: case 1883: case 1884: case 1885: case 1886: case 1887: return 13;\n\t\t\t\tcase 1888: case 1889: case 1890: case 1891: case 1892: case 1893: case 1894: case 1895: case 1896: case 1897: case 1898: case 1899: case 1900: case 1901: case 1902: case 1903: case 1904: case 1905: case 1906: case 1907: case 1908: case 1909: case 1910: case 1911: case 1912: case 1913: case 1914: case 1915: case 1916: case 1917: case 1918: case 1919: return 14;\n\t\t\t\tcase 1920: case 1921: case 1922: case 1923: case 1924: case 1925: case 1926: case 1927: case 1928: case 1929: case 1930: case 1931: case 1932: case 1933: case 1934: case 1935: case 1936: case 1937: case 1938: case 1939: case 1940: case 1941: case 1942: case 1943: case 1944: case 1945: case 1946: case 1947: case 1948: case 1949: case 1950: case 1951: return 15;\n\t\t\t\tcase 1504: case 1505: case 1506: case 1507: case 1508: case 1509: case 1510: case 1511: case 1512: case 1513: case 1514: case 1515: case 1516: case 1517: case 1518: case 1519: case 1520: case 1521: case 1522: case 1523: case 1524: case 1525: case 1526: case 1527: case 1528: case 1529: case 1530: case 1531: case 1532: case 1533: case 1534: case 1535: return 2;\n\t\t\t\tcase 1536: case 1537: case 1538: case 1539: case 1540: case 1541: case 1542: case 1543: case 1544: case 1545: case 1546: case 1547: case 1548: case 1549: case 1550: case 1551: case 1552: case 1553: case 1554: case 1555: case 1556: case 1557: case 1558: case 1559: case 1560: case 1561: case 1562: case 1563: case 1564: case 1565: case 1566: case 1567: return 3;\n\t\t\t\tcase 1568: case 1569: case 1570: case 1571: case 1572: case 1573: case 1574: case 1575: case 1576: case 1577: case 1578: case 1579: case 1580: case 1581: case 1582: case 1583: case 1584: case 1585: case 1586: case 1587: case 1588: case 1589: case 1590: case 1591: case 1592: case 1593: case 1594: case 1595: case 1596: case 1597: case 1598: case 1599: return 4;\n\t\t\t\tcase 1600: case 1601: case 1602: case 1603: case 1604: case 1605: case 1606: case 1607: case 1608: case 1609: case 1610: case 1611: case 1612: case 1613: case 1614: case 1615: case 1616: case 1617: case 1618: case 1619: case 1620: case 1621: case 1622: case 1623: case 1624: case 1625: case 1626: case 1627: case 1628: case 1629: case 1630: case 1631: return 5;\n\t\t\t\tcase 1632: case 1633: case 1634: case 1635: case 1636: case 1637: case 1638: case 1639: case 1640: case 1641: case 1642: case 1643: case 1644: case 1645: case 1646: case 1647: case 1648: case 1649: case 1650: case 1651: case 1652: case 1653: case 1654: case 1655: case 1656: case 1657: case 1658: case 1659: case 1660: case 1661: case 1662: case 1663: return 6;\n\t\t\t\tcase 1664: case 1665: case 1666: case 1667: case 1668: case 1669: case 1670: case 1671: case 1672: case 1673: case 1674: case 1675: case 1676: case 1677: case 1678: case 1679: case 1680: case 1681: case 1682: case 1683: case 1684: case 1685: case 1686: case 1687: case 1688: case 1689: case 1690: case 1691: case 1692: case 1693: case 1694: case 1695: return 7;\n\t\t\t\tcase 1696: case 1697: case 1698: case 1699: case 1700: case 1701: case 1702: case 1703: case 1704: case 1705: case 1706: case 1707: case 1708: case 1709: case 1710: case 1711: case 1712: case 1713: case 1714: case 1715: case 1716: case 1717: case 1718: case 1719: case 1720: case 1721: case 1722: case 1723: case 1724: case 1725: case 1726: case 1727: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1456: case 1457: case 1458: case 1459: case 1460: case 1461: case 1462: case 1463: case 1464: case 1465: case 1466: case 1467: case 1468: case 1469: case 1470: case 1471: case 1488: case 1489: case 1490: case 1491: case 1492: case 1493: case 1494: case 1495: case 1496: case 1497: case 1498: case 1499: case 1500: case 1501: case 1502: case 1503: case 1520: case 1521: case 1522: case 1523: case 1524: case 1525: case 1526: case 1527: case 1528: case 1529: case 1530: case 1531: case 1532: case 1533: case 1534: case 1535: case 1552: case 1553: case 1554: case 1555: case 1556: case 1557: case 1558: case 1559: case 1560: case 1561: case 1562: case 1563: case 1564: case 1565: case 1566: case 1567: case 1584: case 1585: case 1586: case 1587: case 1588: case 1589: case 1590: case 1591: case 1592: case 1593: case 1594: case 1595: case 1596: case 1597: case 1598: case 1599: case 1616: case 1617: case 1618: case 1619: case 1620: case 1621: case 1622: case 1623: case 1624: case 1625: case 1626: case 1627: case 1628: case 1629: case 1630: case 1631: case 1648: case 1649: case 1650: case 1651: case 1652: case 1653: case 1654: case 1655: case 1656: case 1657: case 1658: case 1659: case 1660: case 1661: case 1662: case 1663: case 1680: case 1681: case 1682: case 1683: case 1684: case 1685: case 1686: case 1687: case 1688: case 1689: case 1690: case 1691: case 1692: case 1693: case 1694: case 1695: case 1712: case 1713: case 1714: case 1715: case 1716: case 1717: case 1718: case 1719: case 1720: case 1721: case 1722: case 1723: case 1724: case 1725: case 1726: case 1727: case 1744: case 1745: case 1746: case 1747: case 1748: case 1749: case 1750: case 1751: case 1752: case 1753: case 1754: case 1755: case 1756: case 1757: case 1758: case 1759: case 1776: case 1777: case 1778: case 1779: case 1780: case 1781: case 1782: case 1783: case 1784: case 1785: case 1786: case 1787: case 1788: case 1789: case 1790: case 1791: case 1808: case 1809: case 1810: case 1811: case 1812: case 1813: case 1814: case 1815: case 1816: case 1817: case 1818: case 1819: case 1820: case 1821: case 1822: case 1823: case 1840: case 1841: case 1842: case 1843: case 1844: case 1845: case 1846: case 1847: case 1848: case 1849: case 1850: case 1851: case 1852: case 1853: case 1854: case 1855: case 1872: case 1873: case 1874: case 1875: case 1876: case 1877: case 1878: case 1879: case 1880: case 1881: case 1882: case 1883: case 1884: case 1885: case 1886: case 1887: case 1904: case 1905: case 1906: case 1907: case 1908: case 1909: case 1910: case 1911: case 1912: case 1913: case 1914: case 1915: case 1916: case 1917: case 1918: case 1919: case 1936: case 1937: case 1938: case 1939: case 1940: case 1941: case 1942: case 1943: case 1944: case 1945: case 1946: case 1947: case 1948: case 1949: case 1950: case 1951: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1448: case 1449: case 1450: case 1451: case 1452: case 1453: case 1454: case 1455: case 1464: case 1465: case 1466: case 1467: case 1468: case 1469: case 1470: case 1471: case 1480: case 1481: case 1482: case 1483: case 1484: case 1485: case 1486: case 1487: case 1496: case 1497: case 1498: case 1499: case 1500: case 1501: case 1502: case 1503: case 1512: case 1513: case 1514: case 1515: case 1516: case 1517: case 1518: case 1519: case 1528: case 1529: case 1530: case 1531: case 1532: case 1533: case 1534: case 1535: case 1544: case 1545: case 1546: case 1547: case 1548: case 1549: case 1550: case 1551: case 1560: case 1561: case 1562: case 1563: case 1564: case 1565: case 1566: case 1567: case 1576: case 1577: case 1578: case 1579: case 1580: case 1581: case 1582: case 1583: case 1592: case 1593: case 1594: case 1595: case 1596: case 1597: case 1598: case 1599: case 1608: case 1609: case 1610: case 1611: case 1612: case 1613: case 1614: case 1615: case 1624: case 1625: case 1626: case 1627: case 1628: case 1629: case 1630: case 1631: case 1640: case 1641: case 1642: case 1643: case 1644: case 1645: case 1646: case 1647: case 1656: case 1657: case 1658: case 1659: case 1660: case 1661: case 1662: case 1663: case 1672: case 1673: case 1674: case 1675: case 1676: case 1677: case 1678: case 1679: case 1688: case 1689: case 1690: case 1691: case 1692: case 1693: case 1694: case 1695: case 1704: case 1705: case 1706: case 1707: case 1708: case 1709: case 1710: case 1711: case 1720: case 1721: case 1722: case 1723: case 1724: case 1725: case 1726: case 1727: case 1736: case 1737: case 1738: case 1739: case 1740: case 1741: case 1742: case 1743: case 1752: case 1753: case 1754: case 1755: case 1756: case 1757: case 1758: case 1759: case 1768: case 1769: case 1770: case 1771: case 1772: case 1773: case 1774: case 1775: case 1784: case 1785: case 1786: case 1787: case 1788: case 1789: case 1790: case 1791: case 1800: case 1801: case 1802: case 1803: case 1804: case 1805: case 1806: case 1807: case 1816: case 1817: case 1818: case 1819: case 1820: case 1821: case 1822: case 1823: case 1832: case 1833: case 1834: case 1835: case 1836: case 1837: case 1838: case 1839: case 1848: case 1849: case 1850: case 1851: case 1852: case 1853: case 1854: case 1855: case 1864: case 1865: case 1866: case 1867: case 1868: case 1869: case 1870: case 1871: case 1880: case 1881: case 1882: case 1883: case 1884: case 1885: case 1886: case 1887: case 1896: case 1897: case 1898: case 1899: case 1900: case 1901: case 1902: case 1903: case 1912: case 1913: case 1914: case 1915: case 1916: case 1917: case 1918: case 1919: case 1928: case 1929: case 1930: case 1931: case 1932: case 1933: case 1934: case 1935: case 1944: case 1945: case 1946: case 1947: case 1948: case 1949: case 1950: case 1951: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1444: case 1445: case 1446: case 1447: case 1452: case 1453: case 1454: case 1455: case 1460: case 1461: case 1462: case 1463: case 1468: case 1469: case 1470: case 1471: case 1476: case 1477: case 1478: case 1479: case 1484: case 1485: case 1486: case 1487: case 1492: case 1493: case 1494: case 1495: case 1500: case 1501: case 1502: case 1503: case 1508: case 1509: case 1510: case 1511: case 1516: case 1517: case 1518: case 1519: case 1524: case 1525: case 1526: case 1527: case 1532: case 1533: case 1534: case 1535: case 1540: case 1541: case 1542: case 1543: case 1548: case 1549: case 1550: case 1551: case 1556: case 1557: case 1558: case 1559: case 1564: case 1565: case 1566: case 1567: case 1572: case 1573: case 1574: case 1575: case 1580: case 1581: case 1582: case 1583: case 1588: case 1589: case 1590: case 1591: case 1596: case 1597: case 1598: case 1599: case 1604: case 1605: case 1606: case 1607: case 1612: case 1613: case 1614: case 1615: case 1620: case 1621: case 1622: case 1623: case 1628: case 1629: case 1630: case 1631: case 1636: case 1637: case 1638: case 1639: case 1644: case 1645: case 1646: case 1647: case 1652: case 1653: case 1654: case 1655: case 1660: case 1661: case 1662: case 1663: case 1668: case 1669: case 1670: case 1671: case 1676: case 1677: case 1678: case 1679: case 1684: case 1685: case 1686: case 1687: case 1692: case 1693: case 1694: case 1695: case 1700: case 1701: case 1702: case 1703: case 1708: case 1709: case 1710: case 1711: case 1716: case 1717: case 1718: case 1719: case 1724: case 1725: case 1726: case 1727: case 1732: case 1733: case 1734: case 1735: case 1740: case 1741: case 1742: case 1743: case 1748: case 1749: case 1750: case 1751: case 1756: case 1757: case 1758: case 1759: case 1764: case 1765: case 1766: case 1767: case 1772: case 1773: case 1774: case 1775: case 1780: case 1781: case 1782: case 1783: case 1788: case 1789: case 1790: case 1791: case 1796: case 1797: case 1798: case 1799: case 1804: case 1805: case 1806: case 1807: case 1812: case 1813: case 1814: case 1815: case 1820: case 1821: case 1822: case 1823: case 1828: case 1829: case 1830: case 1831: case 1836: case 1837: case 1838: case 1839: case 1844: case 1845: case 1846: case 1847: case 1852: case 1853: case 1854: case 1855: case 1860: case 1861: case 1862: case 1863: case 1868: case 1869: case 1870: case 1871: case 1876: case 1877: case 1878: case 1879: case 1884: case 1885: case 1886: case 1887: case 1892: case 1893: case 1894: case 1895: case 1900: case 1901: case 1902: case 1903: case 1908: case 1909: case 1910: case 1911: case 1916: case 1917: case 1918: case 1919: case 1924: case 1925: case 1926: case 1927: case 1932: case 1933: case 1934: case 1935: case 1940: case 1941: case 1942: case 1943: case 1948: case 1949: case 1950: case 1951: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1442: case 1443: case 1446: case 1447: case 1450: case 1451: case 1454: case 1455: case 1458: case 1459: case 1462: case 1463: case 1466: case 1467: case 1470: case 1471: case 1474: case 1475: case 1478: case 1479: case 1482: case 1483: case 1486: case 1487: case 1490: case 1491: case 1494: case 1495: case 1498: case 1499: case 1502: case 1503: case 1506: case 1507: case 1510: case 1511: case 1514: case 1515: case 1518: case 1519: case 1522: case 1523: case 1526: case 1527: case 1530: case 1531: case 1534: case 1535: case 1538: case 1539: case 1542: case 1543: case 1546: case 1547: case 1550: case 1551: case 1554: case 1555: case 1558: case 1559: case 1562: case 1563: case 1566: case 1567: case 1570: case 1571: case 1574: case 1575: case 1578: case 1579: case 1582: case 1583: case 1586: case 1587: case 1590: case 1591: case 1594: case 1595: case 1598: case 1599: case 1602: case 1603: case 1606: case 1607: case 1610: case 1611: case 1614: case 1615: case 1618: case 1619: case 1622: case 1623: case 1626: case 1627: case 1630: case 1631: case 1634: case 1635: case 1638: case 1639: case 1642: case 1643: case 1646: case 1647: case 1650: case 1651: case 1654: case 1655: case 1658: case 1659: case 1662: case 1663: case 1666: case 1667: case 1670: case 1671: case 1674: case 1675: case 1678: case 1679: case 1682: case 1683: case 1686: case 1687: case 1690: case 1691: case 1694: case 1695: case 1698: case 1699: case 1702: case 1703: case 1706: case 1707: case 1710: case 1711: case 1714: case 1715: case 1718: case 1719: case 1722: case 1723: case 1726: case 1727: case 1730: case 1731: case 1734: case 1735: case 1738: case 1739: case 1742: case 1743: case 1746: case 1747: case 1750: case 1751: case 1754: case 1755: case 1758: case 1759: case 1762: case 1763: case 1766: case 1767: case 1770: case 1771: case 1774: case 1775: case 1778: case 1779: case 1782: case 1783: case 1786: case 1787: case 1790: case 1791: case 1794: case 1795: case 1798: case 1799: case 1802: case 1803: case 1806: case 1807: case 1810: case 1811: case 1814: case 1815: case 1818: case 1819: case 1822: case 1823: case 1826: case 1827: case 1830: case 1831: case 1834: case 1835: case 1838: case 1839: case 1842: case 1843: case 1846: case 1847: case 1850: case 1851: case 1854: case 1855: case 1858: case 1859: case 1862: case 1863: case 1866: case 1867: case 1870: case 1871: case 1874: case 1875: case 1878: case 1879: case 1882: case 1883: case 1886: case 1887: case 1890: case 1891: case 1894: case 1895: case 1898: case 1899: case 1902: case 1903: case 1906: case 1907: case 1910: case 1911: case 1914: case 1915: case 1918: case 1919: case 1922: case 1923: case 1926: case 1927: case 1930: case 1931: case 1934: case 1935: case 1938: case 1939: case 1942: case 1943: case 1946: case 1947: case 1950: case 1951: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1441: case 1443: case 1445: case 1447: case 1449: case 1451: case 1453: case 1455: case 1457: case 1459: case 1461: case 1463: case 1465: case 1467: case 1469: case 1471: case 1473: case 1475: case 1477: case 1479: case 1481: case 1483: case 1485: case 1487: case 1489: case 1491: case 1493: case 1495: case 1497: case 1499: case 1501: case 1503: case 1505: case 1507: case 1509: case 1511: case 1513: case 1515: case 1517: case 1519: case 1521: case 1523: case 1525: case 1527: case 1529: case 1531: case 1533: case 1535: case 1537: case 1539: case 1541: case 1543: case 1545: case 1547: case 1549: case 1551: case 1553: case 1555: case 1557: case 1559: case 1561: case 1563: case 1565: case 1567: case 1569: case 1571: case 1573: case 1575: case 1577: case 1579: case 1581: case 1583: case 1585: case 1587: case 1589: case 1591: case 1593: case 1595: case 1597: case 1599: case 1601: case 1603: case 1605: case 1607: case 1609: case 1611: case 1613: case 1615: case 1617: case 1619: case 1621: case 1623: case 1625: case 1627: case 1629: case 1631: case 1633: case 1635: case 1637: case 1639: case 1641: case 1643: case 1645: case 1647: case 1649: case 1651: case 1653: case 1655: case 1657: case 1659: case 1661: case 1663: case 1665: case 1667: case 1669: case 1671: case 1673: case 1675: case 1677: case 1679: case 1681: case 1683: case 1685: case 1687: case 1689: case 1691: case 1693: case 1695: case 1697: case 1699: case 1701: case 1703: case 1705: case 1707: case 1709: case 1711: case 1713: case 1715: case 1717: case 1719: case 1721: case 1723: case 1725: case 1727: case 1729: case 1731: case 1733: case 1735: case 1737: case 1739: case 1741: case 1743: case 1745: case 1747: case 1749: case 1751: case 1753: case 1755: case 1757: case 1759: case 1761: case 1763: case 1765: case 1767: case 1769: case 1771: case 1773: case 1775: case 1777: case 1779: case 1781: case 1783: case 1785: case 1787: case 1789: case 1791: case 1793: case 1795: case 1797: case 1799: case 1801: case 1803: case 1805: case 1807: case 1809: case 1811: case 1813: case 1815: case 1817: case 1819: case 1821: case 1823: case 1825: case 1827: case 1829: case 1831: case 1833: case 1835: case 1837: case 1839: case 1841: case 1843: case 1845: case 1847: case 1849: case 1851: case 1853: case 1855: case 1857: case 1859: case 1861: case 1863: case 1865: case 1867: case 1869: case 1871: case 1873: case 1875: case 1877: case 1879: case 1881: case 1883: case 1885: case 1887: case 1889: case 1891: case 1893: case 1895: case 1897: case 1899: case 1901: case 1903: case 1905: case 1907: case 1909: case 1911: case 1913: case 1915: case 1917: case 1919: case 1921: case 1923: case 1925: case 1927: case 1929: case 1931: case 1933: case 1935: case 1937: case 1939: case 1941: case 1943: case 1945: case 1947: case 1949: case 1951: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace FireCoral\n\t{\n\t}\n\tnamespace FireCoralBlock\n\t{\n\t}\n\tnamespace FireCoralFan\n\t{\n\t}\n\tnamespace FireCoralWallFan\n\t{\n\t\tBlockState FireCoralWallFan()\n\t\t{\n\t\t\treturn 9624;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9629: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9631: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9625: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace FletchingTable\n\t{\n\t}\n\tnamespace FlowerPot\n\t{\n\t}\n\tnamespace FrostedIce\n\t{\n\t\tBlockState FrostedIce()\n\t\t{\n\t\t\treturn 9249;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9249: return 0;\n\t\t\t\tcase 9250: return 1;\n\t\t\t\tcase 9251: return 2;\n\t\t\t\tdefault: return 3;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Furnace\n\t{\n\t\tBlockState Furnace()\n\t\t{\n\t\t\treturn 3374;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3377: case 3378: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3379: case 3380: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3373: case 3374: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3374: case 3376: case 3378: case 3380: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GildedBlackstone\n\t{\n\t}\n\tnamespace Glass\n\t{\n\t}\n\tnamespace GlassPane\n\t{\n\t\tBlockState GlassPane()\n\t\t{\n\t\t\treturn 4762;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4749: case 4750: case 4753: case 4754: case 4757: case 4758: case 4761: case 4762: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4741: case 4742: case 4745: case 4746: case 4757: case 4758: case 4761: case 4762: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4737: case 4738: case 4745: case 4746: case 4753: case 4754: case 4761: case 4762: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4734: case 4738: case 4742: case 4746: case 4750: case 4754: case 4758: case 4762: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Glowstone\n\t{\n\t}\n\tnamespace GoldBlock\n\t{\n\t}\n\tnamespace GoldOre\n\t{\n\t}\n\tnamespace Granite\n\t{\n\t}\n\tnamespace GraniteSlab\n\t{\n\t\tBlockState GraniteSlab()\n\t\t{\n\t\t\treturn 10840;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10840: return Type::Bottom;\n\t\t\t\tcase 10842: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GraniteStairs\n\t{\n\t\tBlockState GraniteStairs()\n\t\t{\n\t\t\treturn 10400;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10430: case 10432: case 10434: case 10436: case 10438: case 10440: case 10442: case 10444: case 10446: case 10448: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10450: case 10452: case 10454: case 10456: case 10458: case 10460: case 10462: case 10464: case 10466: case 10468: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10390: case 10392: case 10394: case 10396: case 10398: case 10400: case 10402: case 10404: case 10406: case 10408: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10400: case 10402: case 10404: case 10406: case 10408: case 10420: case 10422: case 10424: case 10426: case 10428: case 10440: case 10442: case 10444: case 10446: case 10448: case 10460: case 10462: case 10464: case 10466: case 10468: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10392: case 10402: case 10412: case 10422: case 10432: case 10442: case 10452: case 10462: return Shape::InnerLeft;\n\t\t\t\tcase 10394: case 10404: case 10414: case 10424: case 10434: case 10444: case 10454: case 10464: return Shape::InnerRight;\n\t\t\t\tcase 10396: case 10406: case 10416: case 10426: case 10436: case 10446: case 10456: case 10466: return Shape::OuterLeft;\n\t\t\t\tcase 10398: case 10408: case 10418: case 10428: case 10438: case 10448: case 10458: case 10468: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GraniteWall\n\t{\n\t\tBlockState GraniteWall()\n\t\t{\n\t\t\treturn 12166;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12274: case 12275: case 12276: case 12280: case 12281: case 12282: case 12286: case 12287: case 12288: case 12292: case 12293: case 12294: case 12298: case 12299: case 12300: case 12304: case 12305: case 12306: case 12310: case 12311: case 12312: case 12316: case 12317: case 12318: case 12322: case 12323: case 12324: case 12328: case 12329: case 12330: case 12334: case 12335: case 12336: case 12340: case 12341: case 12342: case 12346: case 12347: case 12348: case 12352: case 12353: case 12354: case 12358: case 12359: case 12360: case 12364: case 12365: case 12366: case 12370: case 12371: case 12372: case 12376: case 12377: case 12378: return East::Low;\n\t\t\t\tcase 12166: case 12167: case 12168: case 12172: case 12173: case 12174: case 12178: case 12179: case 12180: case 12184: case 12185: case 12186: case 12190: case 12191: case 12192: case 12196: case 12197: case 12198: case 12202: case 12203: case 12204: case 12208: case 12209: case 12210: case 12214: case 12215: case 12216: case 12220: case 12221: case 12222: case 12226: case 12227: case 12228: case 12232: case 12233: case 12234: case 12238: case 12239: case 12240: case 12244: case 12245: case 12246: case 12250: case 12251: case 12252: case 12256: case 12257: case 12258: case 12262: case 12263: case 12264: case 12268: case 12269: case 12270: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12202: case 12203: case 12204: case 12208: case 12209: case 12210: case 12214: case 12215: case 12216: case 12220: case 12221: case 12222: case 12226: case 12227: case 12228: case 12232: case 12233: case 12234: case 12310: case 12311: case 12312: case 12316: case 12317: case 12318: case 12322: case 12323: case 12324: case 12328: case 12329: case 12330: case 12334: case 12335: case 12336: case 12340: case 12341: case 12342: case 12418: case 12419: case 12420: case 12424: case 12425: case 12426: case 12430: case 12431: case 12432: case 12436: case 12437: case 12438: case 12442: case 12443: case 12444: case 12448: case 12449: case 12450: return North::Low;\n\t\t\t\tcase 12166: case 12167: case 12168: case 12172: case 12173: case 12174: case 12178: case 12179: case 12180: case 12184: case 12185: case 12186: case 12190: case 12191: case 12192: case 12196: case 12197: case 12198: case 12274: case 12275: case 12276: case 12280: case 12281: case 12282: case 12286: case 12287: case 12288: case 12292: case 12293: case 12294: case 12298: case 12299: case 12300: case 12304: case 12305: case 12306: case 12382: case 12383: case 12384: case 12388: case 12389: case 12390: case 12394: case 12395: case 12396: case 12400: case 12401: case 12402: case 12406: case 12407: case 12408: case 12412: case 12413: case 12414: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12178: case 12179: case 12180: case 12184: case 12185: case 12186: case 12214: case 12215: case 12216: case 12220: case 12221: case 12222: case 12250: case 12251: case 12252: case 12256: case 12257: case 12258: case 12286: case 12287: case 12288: case 12292: case 12293: case 12294: case 12322: case 12323: case 12324: case 12328: case 12329: case 12330: case 12358: case 12359: case 12360: case 12364: case 12365: case 12366: case 12394: case 12395: case 12396: case 12400: case 12401: case 12402: case 12430: case 12431: case 12432: case 12436: case 12437: case 12438: case 12466: case 12467: case 12468: case 12472: case 12473: case 12474: return South::Low;\n\t\t\t\tcase 12166: case 12167: case 12168: case 12172: case 12173: case 12174: case 12202: case 12203: case 12204: case 12208: case 12209: case 12210: case 12238: case 12239: case 12240: case 12244: case 12245: case 12246: case 12274: case 12275: case 12276: case 12280: case 12281: case 12282: case 12310: case 12311: case 12312: case 12316: case 12317: case 12318: case 12346: case 12347: case 12348: case 12352: case 12353: case 12354: case 12382: case 12383: case 12384: case 12388: case 12389: case 12390: case 12418: case 12419: case 12420: case 12424: case 12425: case 12426: case 12454: case 12455: case 12456: case 12460: case 12461: case 12462: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12172: case 12173: case 12174: case 12184: case 12185: case 12186: case 12196: case 12197: case 12198: case 12208: case 12209: case 12210: case 12220: case 12221: case 12222: case 12232: case 12233: case 12234: case 12244: case 12245: case 12246: case 12256: case 12257: case 12258: case 12268: case 12269: case 12270: case 12280: case 12281: case 12282: case 12292: case 12293: case 12294: case 12304: case 12305: case 12306: case 12316: case 12317: case 12318: case 12328: case 12329: case 12330: case 12340: case 12341: case 12342: case 12352: case 12353: case 12354: case 12364: case 12365: case 12366: case 12376: case 12377: case 12378: case 12388: case 12389: case 12390: case 12400: case 12401: case 12402: case 12412: case 12413: case 12414: case 12424: case 12425: case 12426: case 12436: case 12437: case 12438: case 12448: case 12449: case 12450: case 12460: case 12461: case 12462: case 12472: case 12473: case 12474: case 12484: case 12485: case 12486: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12167: case 12173: case 12179: case 12185: case 12191: case 12197: case 12203: case 12209: case 12215: case 12221: case 12227: case 12233: case 12239: case 12245: case 12251: case 12257: case 12263: case 12269: case 12275: case 12281: case 12287: case 12293: case 12299: case 12305: case 12311: case 12317: case 12323: case 12329: case 12335: case 12341: case 12347: case 12353: case 12359: case 12365: case 12371: case 12377: case 12383: case 12389: case 12395: case 12401: case 12407: case 12413: case 12419: case 12425: case 12431: case 12437: case 12443: case 12449: case 12455: case 12461: case 12467: case 12473: case 12479: case 12485: return West::Low;\n\t\t\t\tcase 12166: case 12172: case 12178: case 12184: case 12190: case 12196: case 12202: case 12208: case 12214: case 12220: case 12226: case 12232: case 12238: case 12244: case 12250: case 12256: case 12262: case 12268: case 12274: case 12280: case 12286: case 12292: case 12298: case 12304: case 12310: case 12316: case 12322: case 12328: case 12334: case 12340: case 12346: case 12352: case 12358: case 12364: case 12370: case 12376: case 12382: case 12388: case 12394: case 12400: case 12406: case 12412: case 12418: case 12424: case 12430: case 12436: case 12442: case 12448: case 12454: case 12460: case 12466: case 12472: case 12478: case 12484: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Grass\n\t{\n\t}\n\tnamespace GrassBlock\n\t{\n\t\tBlockState GrassBlock()\n\t\t{\n\t\t\treturn 9;\n\t\t}\n\t\tbool Snowy(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GrassPath\n\t{\n\t}\n\tnamespace Gravel\n\t{\n\t}\n\tnamespace GrayBanner\n\t{\n\t\tBlockState GrayBanner()\n\t\t{\n\t\t\treturn 8009;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8009: return 0;\n\t\t\t\tcase 8010: return 1;\n\t\t\t\tcase 8019: return 10;\n\t\t\t\tcase 8020: return 11;\n\t\t\t\tcase 8021: return 12;\n\t\t\t\tcase 8022: return 13;\n\t\t\t\tcase 8023: return 14;\n\t\t\t\tcase 8024: return 15;\n\t\t\t\tcase 8011: return 2;\n\t\t\t\tcase 8012: return 3;\n\t\t\t\tcase 8013: return 4;\n\t\t\t\tcase 8014: return 5;\n\t\t\t\tcase 8015: return 6;\n\t\t\t\tcase 8016: return 7;\n\t\t\t\tcase 8017: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GrayBed\n\t{\n\t\tBlockState GrayBed()\n\t\t{\n\t\t\treturn 1164;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1169: case 1170: case 1171: case 1172: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1173: case 1174: case 1175: case 1176: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1161: case 1162: case 1163: case 1164: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1163: case 1164: case 1167: case 1168: case 1171: case 1172: case 1175: case 1176: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1162: case 1164: case 1166: case 1168: case 1170: case 1172: case 1174: case 1176: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GrayCarpet\n\t{\n\t}\n\tnamespace GrayConcrete\n\t{\n\t}\n\tnamespace GrayConcretePowder\n\t{\n\t}\n\tnamespace GrayGlazedTerracotta\n\t{\n\t\tBlockState GrayGlazedTerracotta()\n\t\t{\n\t\t\treturn 9402;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9404: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9405: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9402: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GrayShulkerBox\n\t{\n\t\tBlockState GrayShulkerBox()\n\t\t{\n\t\t\treturn 9324;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9323: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9321: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9325: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9324: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9320: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GrayStainedGlass\n\t{\n\t}\n\tnamespace GrayStainedGlassPane\n\t{\n\t\tBlockState GrayStainedGlassPane()\n\t\t{\n\t\t\treturn 7118;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7105: case 7106: case 7109: case 7110: case 7113: case 7114: case 7117: case 7118: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7097: case 7098: case 7101: case 7102: case 7113: case 7114: case 7117: case 7118: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7093: case 7094: case 7101: case 7102: case 7109: case 7110: case 7117: case 7118: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7090: case 7094: case 7098: case 7102: case 7106: case 7110: case 7114: case 7118: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GrayTerracotta\n\t{\n\t}\n\tnamespace GrayWallBanner\n\t{\n\t\tBlockState GrayWallBanner()\n\t\t{\n\t\t\treturn 8181;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8183: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8184: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8181: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GrayWool\n\t{\n\t}\n\tnamespace GreenBanner\n\t{\n\t\tBlockState GreenBanner()\n\t\t{\n\t\t\treturn 8105;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8105: return 0;\n\t\t\t\tcase 8106: return 1;\n\t\t\t\tcase 8115: return 10;\n\t\t\t\tcase 8116: return 11;\n\t\t\t\tcase 8117: return 12;\n\t\t\t\tcase 8118: return 13;\n\t\t\t\tcase 8119: return 14;\n\t\t\t\tcase 8120: return 15;\n\t\t\t\tcase 8107: return 2;\n\t\t\t\tcase 8108: return 3;\n\t\t\t\tcase 8109: return 4;\n\t\t\t\tcase 8110: return 5;\n\t\t\t\tcase 8111: return 6;\n\t\t\t\tcase 8112: return 7;\n\t\t\t\tcase 8113: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GreenBed\n\t{\n\t\tBlockState GreenBed()\n\t\t{\n\t\t\treturn 1260;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1265: case 1266: case 1267: case 1268: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1269: case 1270: case 1271: case 1272: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1257: case 1258: case 1259: case 1260: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1259: case 1260: case 1263: case 1264: case 1267: case 1268: case 1271: case 1272: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1258: case 1260: case 1262: case 1264: case 1266: case 1268: case 1270: case 1272: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GreenCarpet\n\t{\n\t}\n\tnamespace GreenConcrete\n\t{\n\t}\n\tnamespace GreenConcretePowder\n\t{\n\t}\n\tnamespace GreenGlazedTerracotta\n\t{\n\t\tBlockState GreenGlazedTerracotta()\n\t\t{\n\t\t\treturn 9426;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9428: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9429: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9426: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GreenShulkerBox\n\t{\n\t\tBlockState GreenShulkerBox()\n\t\t{\n\t\t\treturn 9360;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9359: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9357: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9361: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9360: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9356: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GreenStainedGlass\n\t{\n\t}\n\tnamespace GreenStainedGlassPane\n\t{\n\t\tBlockState GreenStainedGlassPane()\n\t\t{\n\t\t\treturn 7310;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7297: case 7298: case 7301: case 7302: case 7305: case 7306: case 7309: case 7310: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7289: case 7290: case 7293: case 7294: case 7305: case 7306: case 7309: case 7310: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7285: case 7286: case 7293: case 7294: case 7301: case 7302: case 7309: case 7310: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7282: case 7286: case 7290: case 7294: case 7298: case 7302: case 7306: case 7310: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GreenTerracotta\n\t{\n\t}\n\tnamespace GreenWallBanner\n\t{\n\t\tBlockState GreenWallBanner()\n\t\t{\n\t\t\treturn 8205;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8207: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8208: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8205: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace GreenWool\n\t{\n\t}\n\tnamespace Grindstone\n\t{\n\t\tBlockState Grindstone()\n\t\t{\n\t\t\treturn 14825;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14829: case 14830: case 14831: case 14832: return Face::Ceiling;\n\t\t\t\tcase 14821: case 14822: case 14823: case 14824: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14823: case 14827: case 14831: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14824: case 14828: case 14832: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14821: case 14825: case 14829: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace HayBale\n\t{\n\t\tBlockState HayBale()\n\t\t{\n\t\t\treturn 7864;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7863: return Axis::X;\n\t\t\t\tcase 7864: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace HeavyWeightedPressurePlate\n\t{\n\t\tBlockState HeavyWeightedPressurePlate()\n\t\t{\n\t\t\treturn 6662;\n\t\t}\n\t\tunsigned char Power(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6662: return 0;\n\t\t\t\tcase 6663: return 1;\n\t\t\t\tcase 6672: return 10;\n\t\t\t\tcase 6673: return 11;\n\t\t\t\tcase 6674: return 12;\n\t\t\t\tcase 6675: return 13;\n\t\t\t\tcase 6676: return 14;\n\t\t\t\tcase 6677: return 15;\n\t\t\t\tcase 6664: return 2;\n\t\t\t\tcase 6665: return 3;\n\t\t\t\tcase 6666: return 4;\n\t\t\t\tcase 6667: return 5;\n\t\t\t\tcase 6668: return 6;\n\t\t\t\tcase 6669: return 7;\n\t\t\t\tcase 6670: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace HoneyBlock\n\t{\n\t}\n\tnamespace HoneycombBlock\n\t{\n\t}\n\tnamespace Hopper\n\t{\n\t\tBlockState Hopper()\n\t\t{\n\t\t\treturn 6728;\n\t\t}\n\t\tbool Enabled(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6733: case 6734: case 6735: case 6736: case 6737: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6731: case 6736: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6732: case 6737: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6728: case 6733: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 6729: case 6734: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace HornCoral\n\t{\n\t}\n\tnamespace HornCoralBlock\n\t{\n\t}\n\tnamespace HornCoralFan\n\t{\n\t}\n\tnamespace HornCoralWallFan\n\t{\n\t\tBlockState HornCoralWallFan()\n\t\t{\n\t\t\treturn 9632;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9637: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9639: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9633: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Ice\n\t{\n\t}\n\tnamespace InfestedChiseledStoneBricks\n\t{\n\t}\n\tnamespace InfestedCobblestone\n\t{\n\t}\n\tnamespace InfestedCrackedStoneBricks\n\t{\n\t}\n\tnamespace InfestedMossyStoneBricks\n\t{\n\t}\n\tnamespace InfestedStone\n\t{\n\t}\n\tnamespace InfestedStoneBricks\n\t{\n\t}\n\tnamespace IronBars\n\t{\n\t\tBlockState IronBars()\n\t\t{\n\t\t\treturn 4728;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4715: case 4716: case 4719: case 4720: case 4723: case 4724: case 4727: case 4728: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4707: case 4708: case 4711: case 4712: case 4723: case 4724: case 4727: case 4728: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4703: case 4704: case 4711: case 4712: case 4719: case 4720: case 4727: case 4728: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4700: case 4704: case 4708: case 4712: case 4716: case 4720: case 4724: case 4728: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace IronBlock\n\t{\n\t}\n\tnamespace IronDoor\n\t{\n\t\tBlockState IronDoor()\n\t\t{\n\t\t\treturn 3820;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3841: case 3842: case 3843: case 3844: case 3845: case 3846: case 3847: case 3848: case 3849: case 3850: case 3851: case 3852: case 3853: case 3854: case 3855: case 3856: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3857: case 3858: case 3859: case 3860: case 3861: case 3862: case 3863: case 3864: case 3865: case 3866: case 3867: case 3868: case 3869: case 3870: case 3871: case 3872: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3809: case 3810: case 3811: case 3812: case 3813: case 3814: case 3815: case 3816: case 3817: case 3818: case 3819: case 3820: case 3821: case 3822: case 3823: case 3824: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3817: case 3818: case 3819: case 3820: case 3821: case 3822: case 3823: case 3824: case 3833: case 3834: case 3835: case 3836: case 3837: case 3838: case 3839: case 3840: case 3849: case 3850: case 3851: case 3852: case 3853: case 3854: case 3855: case 3856: case 3865: case 3866: case 3867: case 3868: case 3869: case 3870: case 3871: case 3872: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3809: case 3810: case 3811: case 3812: case 3817: case 3818: case 3819: case 3820: case 3825: case 3826: case 3827: case 3828: case 3833: case 3834: case 3835: case 3836: case 3841: case 3842: case 3843: case 3844: case 3849: case 3850: case 3851: case 3852: case 3857: case 3858: case 3859: case 3860: case 3865: case 3866: case 3867: case 3868: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3811: case 3812: case 3815: case 3816: case 3819: case 3820: case 3823: case 3824: case 3827: case 3828: case 3831: case 3832: case 3835: case 3836: case 3839: case 3840: case 3843: case 3844: case 3847: case 3848: case 3851: case 3852: case 3855: case 3856: case 3859: case 3860: case 3863: case 3864: case 3867: case 3868: case 3871: case 3872: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3810: case 3812: case 3814: case 3816: case 3818: case 3820: case 3822: case 3824: case 3826: case 3828: case 3830: case 3832: case 3834: case 3836: case 3838: case 3840: case 3842: case 3844: case 3846: case 3848: case 3850: case 3852: case 3854: case 3856: case 3858: case 3860: case 3862: case 3864: case 3866: case 3868: case 3870: case 3872: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace IronOre\n\t{\n\t}\n\tnamespace IronTrapdoor\n\t{\n\t\tBlockState IronTrapdoor()\n\t\t{\n\t\t\treturn 7552;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7570: case 7572: case 7574: case 7576: case 7578: case 7580: case 7582: case 7584: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 7586: case 7588: case 7590: case 7592: case 7594: case 7596: case 7598: case 7600: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 7538: case 7540: case 7542: case 7544: case 7546: case 7548: case 7550: case 7552: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7546: case 7548: case 7550: case 7552: case 7562: case 7564: case 7566: case 7568: case 7578: case 7580: case 7582: case 7584: case 7594: case 7596: case 7598: case 7600: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7542: case 7544: case 7550: case 7552: case 7558: case 7560: case 7566: case 7568: case 7574: case 7576: case 7582: case 7584: case 7590: case 7592: case 7598: case 7600: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7540: case 7544: case 7548: case 7552: case 7556: case 7560: case 7564: case 7568: case 7572: case 7576: case 7580: case 7584: case 7588: case 7592: case 7596: case 7600: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JackOLantern\n\t{\n\t\tBlockState JackOLantern()\n\t\t{\n\t\t\treturn 4020;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4022: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4023: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4020: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Jigsaw\n\t{\n\t\tBlockState Jigsaw()\n\t\t{\n\t\t\treturn 15749;\n\t\t}\n\t\tenum Orientation Orientation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15739: return Orientation::DownEast;\n\t\t\t\tcase 15740: return Orientation::DownNorth;\n\t\t\t\tcase 15741: return Orientation::DownSouth;\n\t\t\t\tcase 15742: return Orientation::DownWest;\n\t\t\t\tcase 15748: return Orientation::EastUp;\n\t\t\t\tcase 15749: return Orientation::NorthUp;\n\t\t\t\tcase 15750: return Orientation::SouthUp;\n\t\t\t\tcase 15743: return Orientation::UpEast;\n\t\t\t\tcase 15744: return Orientation::UpNorth;\n\t\t\t\tcase 15745: return Orientation::UpSouth;\n\t\t\t\tcase 15746: return Orientation::UpWest;\n\t\t\t\tdefault: return Orientation::WestUp;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Jukebox\n\t{\n\t\tBlockState Jukebox()\n\t\t{\n\t\t\treturn 3965;\n\t\t}\n\t\tbool HasRecord(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3965: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleButton\n\t{\n\t\tBlockState JungleButton()\n\t\t{\n\t\t\treturn 6427;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6434: case 6435: case 6436: case 6437: case 6438: case 6439: case 6440: case 6441: return Face::Ceiling;\n\t\t\t\tcase 6418: case 6419: case 6420: case 6421: case 6422: case 6423: case 6424: case 6425: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6422: case 6423: case 6430: case 6431: case 6438: case 6439: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6424: case 6425: case 6432: case 6433: case 6440: case 6441: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6418: case 6419: case 6426: case 6427: case 6434: case 6435: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6419: case 6421: case 6423: case 6425: case 6427: case 6429: case 6431: case 6433: case 6435: case 6437: case 6439: case 6441: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleDoor\n\t{\n\t\tBlockState JungleDoor()\n\t\t{\n\t\t\treturn 8877;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8898: case 8899: case 8900: case 8901: case 8902: case 8903: case 8904: case 8905: case 8906: case 8907: case 8908: case 8909: case 8910: case 8911: case 8912: case 8913: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8914: case 8915: case 8916: case 8917: case 8918: case 8919: case 8920: case 8921: case 8922: case 8923: case 8924: case 8925: case 8926: case 8927: case 8928: case 8929: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8866: case 8867: case 8868: case 8869: case 8870: case 8871: case 8872: case 8873: case 8874: case 8875: case 8876: case 8877: case 8878: case 8879: case 8880: case 8881: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8874: case 8875: case 8876: case 8877: case 8878: case 8879: case 8880: case 8881: case 8890: case 8891: case 8892: case 8893: case 8894: case 8895: case 8896: case 8897: case 8906: case 8907: case 8908: case 8909: case 8910: case 8911: case 8912: case 8913: case 8922: case 8923: case 8924: case 8925: case 8926: case 8927: case 8928: case 8929: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8866: case 8867: case 8868: case 8869: case 8874: case 8875: case 8876: case 8877: case 8882: case 8883: case 8884: case 8885: case 8890: case 8891: case 8892: case 8893: case 8898: case 8899: case 8900: case 8901: case 8906: case 8907: case 8908: case 8909: case 8914: case 8915: case 8916: case 8917: case 8922: case 8923: case 8924: case 8925: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8868: case 8869: case 8872: case 8873: case 8876: case 8877: case 8880: case 8881: case 8884: case 8885: case 8888: case 8889: case 8892: case 8893: case 8896: case 8897: case 8900: case 8901: case 8904: case 8905: case 8908: case 8909: case 8912: case 8913: case 8916: case 8917: case 8920: case 8921: case 8924: case 8925: case 8928: case 8929: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8867: case 8869: case 8871: case 8873: case 8875: case 8877: case 8879: case 8881: case 8883: case 8885: case 8887: case 8889: case 8891: case 8893: case 8895: case 8897: case 8899: case 8901: case 8903: case 8905: case 8907: case 8909: case 8911: case 8913: case 8915: case 8917: case 8919: case 8921: case 8923: case 8925: case 8927: case 8929: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleFence\n\t{\n\t\tBlockState JungleFence()\n\t\t{\n\t\t\treturn 8673;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8660: case 8661: case 8664: case 8665: case 8668: case 8669: case 8672: case 8673: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8652: case 8653: case 8656: case 8657: case 8668: case 8669: case 8672: case 8673: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8648: case 8649: case 8656: case 8657: case 8664: case 8665: case 8672: case 8673: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8645: case 8649: case 8653: case 8657: case 8661: case 8665: case 8669: case 8673: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleFenceGate\n\t{\n\t\tBlockState JungleFenceGate()\n\t\t{\n\t\t\treturn 8489;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8498: case 8499: case 8500: case 8501: case 8502: case 8503: case 8504: case 8505: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8506: case 8507: case 8508: case 8509: case 8510: case 8511: case 8512: case 8513: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8482: case 8483: case 8484: case 8485: case 8486: case 8487: case 8488: case 8489: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool InWall(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8486: case 8487: case 8488: case 8489: case 8494: case 8495: case 8496: case 8497: case 8502: case 8503: case 8504: case 8505: case 8510: case 8511: case 8512: case 8513: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8484: case 8485: case 8488: case 8489: case 8492: case 8493: case 8496: case 8497: case 8500: case 8501: case 8504: case 8505: case 8508: case 8509: case 8512: case 8513: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8483: case 8485: case 8487: case 8489: case 8491: case 8493: case 8495: case 8497: case 8499: case 8501: case 8503: case 8505: case 8507: case 8509: case 8511: case 8513: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleLeaves\n\t{\n\t\tBlockState JungleLeaves()\n\t\t{\n\t\t\treturn 200;\n\t\t}\n\t\tunsigned char Distance(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 187: case 188: return 1;\n\t\t\t\tcase 189: case 190: return 2;\n\t\t\t\tcase 191: case 192: return 3;\n\t\t\t\tcase 193: case 194: return 4;\n\t\t\t\tcase 195: case 196: return 5;\n\t\t\t\tcase 197: case 198: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t\tbool Persistent(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 188: case 190: case 192: case 194: case 196: case 198: case 200: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleLog\n\t{\n\t\tBlockState JungleLog()\n\t\t{\n\t\t\treturn 83;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 82: return Axis::X;\n\t\t\t\tcase 83: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JunglePlanks\n\t{\n\t}\n\tnamespace JunglePressurePlate\n\t{\n\t\tBlockState JunglePressurePlate()\n\t\t{\n\t\t\treturn 3880;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3880: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleSapling\n\t{\n\t\tBlockState JungleSapling()\n\t\t{\n\t\t\treturn 27;\n\t\t}\n\t\tunsigned char Stage(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 27: return 0;\n\t\t\t\tdefault: return 1;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleSign\n\t{\n\t\tBlockState JungleSign()\n\t\t{\n\t\t\treturn 3510;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3510: return 0;\n\t\t\t\tcase 3512: return 1;\n\t\t\t\tcase 3530: return 10;\n\t\t\t\tcase 3532: return 11;\n\t\t\t\tcase 3534: return 12;\n\t\t\t\tcase 3536: return 13;\n\t\t\t\tcase 3538: return 14;\n\t\t\t\tcase 3540: return 15;\n\t\t\t\tcase 3514: return 2;\n\t\t\t\tcase 3516: return 3;\n\t\t\t\tcase 3518: return 4;\n\t\t\t\tcase 3520: return 5;\n\t\t\t\tcase 3522: return 6;\n\t\t\t\tcase 3524: return 7;\n\t\t\t\tcase 3526: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleSlab\n\t{\n\t\tBlockState JungleSlab()\n\t\t{\n\t\t\treturn 8321;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8321: return Type::Bottom;\n\t\t\t\tcase 8323: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleStairs\n\t{\n\t\tBlockState JungleStairs()\n\t\t{\n\t\t\treturn 5575;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5605: case 5607: case 5609: case 5611: case 5613: case 5615: case 5617: case 5619: case 5621: case 5623: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5625: case 5627: case 5629: case 5631: case 5633: case 5635: case 5637: case 5639: case 5641: case 5643: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5565: case 5567: case 5569: case 5571: case 5573: case 5575: case 5577: case 5579: case 5581: case 5583: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5575: case 5577: case 5579: case 5581: case 5583: case 5595: case 5597: case 5599: case 5601: case 5603: case 5615: case 5617: case 5619: case 5621: case 5623: case 5635: case 5637: case 5639: case 5641: case 5643: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5567: case 5577: case 5587: case 5597: case 5607: case 5617: case 5627: case 5637: return Shape::InnerLeft;\n\t\t\t\tcase 5569: case 5579: case 5589: case 5599: case 5609: case 5619: case 5629: case 5639: return Shape::InnerRight;\n\t\t\t\tcase 5571: case 5581: case 5591: case 5601: case 5611: case 5621: case 5631: case 5641: return Shape::OuterLeft;\n\t\t\t\tcase 5573: case 5583: case 5593: case 5603: case 5613: case 5623: case 5633: case 5643: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleTrapdoor\n\t{\n\t\tBlockState JungleTrapdoor()\n\t\t{\n\t\t\treturn 4318;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4336: case 4338: case 4340: case 4342: case 4344: case 4346: case 4348: case 4350: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4352: case 4354: case 4356: case 4358: case 4360: case 4362: case 4364: case 4366: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4304: case 4306: case 4308: case 4310: case 4312: case 4314: case 4316: case 4318: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4312: case 4314: case 4316: case 4318: case 4328: case 4330: case 4332: case 4334: case 4344: case 4346: case 4348: case 4350: case 4360: case 4362: case 4364: case 4366: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4308: case 4310: case 4316: case 4318: case 4324: case 4326: case 4332: case 4334: case 4340: case 4342: case 4348: case 4350: case 4356: case 4358: case 4364: case 4366: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4306: case 4310: case 4314: case 4318: case 4322: case 4326: case 4330: case 4334: case 4338: case 4342: case 4346: case 4350: case 4354: case 4358: case 4362: case 4366: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleWallSign\n\t{\n\t\tBlockState JungleWallSign()\n\t\t{\n\t\t\treturn 3768;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3772: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3774: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3768: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace JungleWood\n\t{\n\t\tBlockState JungleWood()\n\t\t{\n\t\t\treturn 119;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 118: return Axis::X;\n\t\t\t\tcase 119: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Kelp\n\t{\n\t\tBlockState Kelp()\n\t\t{\n\t\t\treturn 9470;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9470: return 0;\n\t\t\t\tcase 9471: return 1;\n\t\t\t\tcase 9480: return 10;\n\t\t\t\tcase 9481: return 11;\n\t\t\t\tcase 9482: return 12;\n\t\t\t\tcase 9483: return 13;\n\t\t\t\tcase 9484: return 14;\n\t\t\t\tcase 9485: return 15;\n\t\t\t\tcase 9486: return 16;\n\t\t\t\tcase 9487: return 17;\n\t\t\t\tcase 9488: return 18;\n\t\t\t\tcase 9489: return 19;\n\t\t\t\tcase 9472: return 2;\n\t\t\t\tcase 9490: return 20;\n\t\t\t\tcase 9491: return 21;\n\t\t\t\tcase 9492: return 22;\n\t\t\t\tcase 9493: return 23;\n\t\t\t\tcase 9494: return 24;\n\t\t\t\tcase 9495: return 25;\n\t\t\t\tcase 9473: return 3;\n\t\t\t\tcase 9474: return 4;\n\t\t\t\tcase 9475: return 5;\n\t\t\t\tcase 9476: return 6;\n\t\t\t\tcase 9477: return 7;\n\t\t\t\tcase 9478: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace KelpPlant\n\t{\n\t}\n\tnamespace Ladder\n\t{\n\t\tBlockState Ladder()\n\t\t{\n\t\t\treturn 3638;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3642: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3644: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3638: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Lantern\n\t{\n\t\tBlockState Lantern()\n\t\t{\n\t\t\treturn 14887;\n\t\t}\n\t\tbool Hanging(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14887: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LapisBlock\n\t{\n\t}\n\tnamespace LapisOre\n\t{\n\t}\n\tnamespace LargeFern\n\t{\n\t\tBlockState LargeFern()\n\t\t{\n\t\t\treturn 7896;\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7896: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Lava\n\t{\n\t\tBlockState Lava()\n\t\t{\n\t\t\treturn 50;\n\t\t}\n\t\tunsigned char Level(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 50: return 0;\n\t\t\t\tcase 51: return 1;\n\t\t\t\tcase 60: return 10;\n\t\t\t\tcase 61: return 11;\n\t\t\t\tcase 62: return 12;\n\t\t\t\tcase 63: return 13;\n\t\t\t\tcase 64: return 14;\n\t\t\t\tcase 65: return 15;\n\t\t\t\tcase 52: return 2;\n\t\t\t\tcase 53: return 3;\n\t\t\t\tcase 54: return 4;\n\t\t\t\tcase 55: return 5;\n\t\t\t\tcase 56: return 6;\n\t\t\t\tcase 57: return 7;\n\t\t\t\tcase 58: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Lectern\n\t{\n\t\tBlockState Lectern()\n\t\t{\n\t\t\treturn 14836;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14841: case 14842: case 14843: case 14844: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14845: case 14846: case 14847: case 14848: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14833: case 14834: case 14835: case 14836: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool HasBook(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14835: case 14836: case 14839: case 14840: case 14843: case 14844: case 14847: case 14848: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14834: case 14836: case 14838: case 14840: case 14842: case 14844: case 14846: case 14848: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Lever\n\t{\n\t\tBlockState Lever()\n\t\t{\n\t\t\treturn 3792;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3799: case 3800: case 3801: case 3802: case 3803: case 3804: case 3805: case 3806: return Face::Ceiling;\n\t\t\t\tcase 3783: case 3784: case 3785: case 3786: case 3787: case 3788: case 3789: case 3790: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3787: case 3788: case 3795: case 3796: case 3803: case 3804: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3789: case 3790: case 3797: case 3798: case 3805: case 3806: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3783: case 3784: case 3791: case 3792: case 3799: case 3800: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3784: case 3786: case 3788: case 3790: case 3792: case 3794: case 3796: case 3798: case 3800: case 3802: case 3804: case 3806: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightBlueBanner\n\t{\n\t\tBlockState LightBlueBanner()\n\t\t{\n\t\t\treturn 7945;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7945: return 0;\n\t\t\t\tcase 7946: return 1;\n\t\t\t\tcase 7955: return 10;\n\t\t\t\tcase 7956: return 11;\n\t\t\t\tcase 7957: return 12;\n\t\t\t\tcase 7958: return 13;\n\t\t\t\tcase 7959: return 14;\n\t\t\t\tcase 7960: return 15;\n\t\t\t\tcase 7947: return 2;\n\t\t\t\tcase 7948: return 3;\n\t\t\t\tcase 7949: return 4;\n\t\t\t\tcase 7950: return 5;\n\t\t\t\tcase 7951: return 6;\n\t\t\t\tcase 7952: return 7;\n\t\t\t\tcase 7953: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightBlueBed\n\t{\n\t\tBlockState LightBlueBed()\n\t\t{\n\t\t\treturn 1100;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1105: case 1106: case 1107: case 1108: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1109: case 1110: case 1111: case 1112: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1097: case 1098: case 1099: case 1100: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1099: case 1100: case 1103: case 1104: case 1107: case 1108: case 1111: case 1112: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1098: case 1100: case 1102: case 1104: case 1106: case 1108: case 1110: case 1112: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightBlueCarpet\n\t{\n\t}\n\tnamespace LightBlueConcrete\n\t{\n\t}\n\tnamespace LightBlueConcretePowder\n\t{\n\t}\n\tnamespace LightBlueGlazedTerracotta\n\t{\n\t\tBlockState LightBlueGlazedTerracotta()\n\t\t{\n\t\t\treturn 9386;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9388: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9389: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9386: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightBlueShulkerBox\n\t{\n\t\tBlockState LightBlueShulkerBox()\n\t\t{\n\t\t\treturn 9300;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9299: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9297: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9301: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9300: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9296: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightBlueStainedGlass\n\t{\n\t}\n\tnamespace LightBlueStainedGlassPane\n\t{\n\t\tBlockState LightBlueStainedGlassPane()\n\t\t{\n\t\t\treturn 6990;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6977: case 6978: case 6981: case 6982: case 6985: case 6986: case 6989: case 6990: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6969: case 6970: case 6973: case 6974: case 6985: case 6986: case 6989: case 6990: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6965: case 6966: case 6973: case 6974: case 6981: case 6982: case 6989: case 6990: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6962: case 6966: case 6970: case 6974: case 6978: case 6982: case 6986: case 6990: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightBlueTerracotta\n\t{\n\t}\n\tnamespace LightBlueWallBanner\n\t{\n\t\tBlockState LightBlueWallBanner()\n\t\t{\n\t\t\treturn 8165;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8167: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8168: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8165: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightBlueWool\n\t{\n\t}\n\tnamespace LightGrayBanner\n\t{\n\t\tBlockState LightGrayBanner()\n\t\t{\n\t\t\treturn 8025;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8025: return 0;\n\t\t\t\tcase 8026: return 1;\n\t\t\t\tcase 8035: return 10;\n\t\t\t\tcase 8036: return 11;\n\t\t\t\tcase 8037: return 12;\n\t\t\t\tcase 8038: return 13;\n\t\t\t\tcase 8039: return 14;\n\t\t\t\tcase 8040: return 15;\n\t\t\t\tcase 8027: return 2;\n\t\t\t\tcase 8028: return 3;\n\t\t\t\tcase 8029: return 4;\n\t\t\t\tcase 8030: return 5;\n\t\t\t\tcase 8031: return 6;\n\t\t\t\tcase 8032: return 7;\n\t\t\t\tcase 8033: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightGrayBed\n\t{\n\t\tBlockState LightGrayBed()\n\t\t{\n\t\t\treturn 1180;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1185: case 1186: case 1187: case 1188: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1189: case 1190: case 1191: case 1192: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1177: case 1178: case 1179: case 1180: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1179: case 1180: case 1183: case 1184: case 1187: case 1188: case 1191: case 1192: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1178: case 1180: case 1182: case 1184: case 1186: case 1188: case 1190: case 1192: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightGrayCarpet\n\t{\n\t}\n\tnamespace LightGrayConcrete\n\t{\n\t}\n\tnamespace LightGrayConcretePowder\n\t{\n\t}\n\tnamespace LightGrayGlazedTerracotta\n\t{\n\t\tBlockState LightGrayGlazedTerracotta()\n\t\t{\n\t\t\treturn 9406;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9408: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9409: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9406: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightGrayShulkerBox\n\t{\n\t\tBlockState LightGrayShulkerBox()\n\t\t{\n\t\t\treturn 9330;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9329: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9327: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9331: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9330: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9326: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightGrayStainedGlass\n\t{\n\t}\n\tnamespace LightGrayStainedGlassPane\n\t{\n\t\tBlockState LightGrayStainedGlassPane()\n\t\t{\n\t\t\treturn 7150;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7137: case 7138: case 7141: case 7142: case 7145: case 7146: case 7149: case 7150: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7129: case 7130: case 7133: case 7134: case 7145: case 7146: case 7149: case 7150: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7125: case 7126: case 7133: case 7134: case 7141: case 7142: case 7149: case 7150: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7122: case 7126: case 7130: case 7134: case 7138: case 7142: case 7146: case 7150: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightGrayTerracotta\n\t{\n\t}\n\tnamespace LightGrayWallBanner\n\t{\n\t\tBlockState LightGrayWallBanner()\n\t\t{\n\t\t\treturn 8185;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8187: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8188: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8185: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LightGrayWool\n\t{\n\t}\n\tnamespace LightWeightedPressurePlate\n\t{\n\t\tBlockState LightWeightedPressurePlate()\n\t\t{\n\t\t\treturn 6646;\n\t\t}\n\t\tunsigned char Power(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6646: return 0;\n\t\t\t\tcase 6647: return 1;\n\t\t\t\tcase 6656: return 10;\n\t\t\t\tcase 6657: return 11;\n\t\t\t\tcase 6658: return 12;\n\t\t\t\tcase 6659: return 13;\n\t\t\t\tcase 6660: return 14;\n\t\t\t\tcase 6661: return 15;\n\t\t\t\tcase 6648: return 2;\n\t\t\t\tcase 6649: return 3;\n\t\t\t\tcase 6650: return 4;\n\t\t\t\tcase 6651: return 5;\n\t\t\t\tcase 6652: return 6;\n\t\t\t\tcase 6653: return 7;\n\t\t\t\tcase 6654: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Lilac\n\t{\n\t\tBlockState Lilac()\n\t\t{\n\t\t\treturn 7888;\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7888: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LilyOfTheValley\n\t{\n\t}\n\tnamespace LilyPad\n\t{\n\t}\n\tnamespace LimeBanner\n\t{\n\t\tBlockState LimeBanner()\n\t\t{\n\t\t\treturn 7977;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7977: return 0;\n\t\t\t\tcase 7978: return 1;\n\t\t\t\tcase 7987: return 10;\n\t\t\t\tcase 7988: return 11;\n\t\t\t\tcase 7989: return 12;\n\t\t\t\tcase 7990: return 13;\n\t\t\t\tcase 7991: return 14;\n\t\t\t\tcase 7992: return 15;\n\t\t\t\tcase 7979: return 2;\n\t\t\t\tcase 7980: return 3;\n\t\t\t\tcase 7981: return 4;\n\t\t\t\tcase 7982: return 5;\n\t\t\t\tcase 7983: return 6;\n\t\t\t\tcase 7984: return 7;\n\t\t\t\tcase 7985: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LimeBed\n\t{\n\t\tBlockState LimeBed()\n\t\t{\n\t\t\treturn 1132;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1137: case 1138: case 1139: case 1140: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1141: case 1142: case 1143: case 1144: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1129: case 1130: case 1131: case 1132: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1131: case 1132: case 1135: case 1136: case 1139: case 1140: case 1143: case 1144: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1130: case 1132: case 1134: case 1136: case 1138: case 1140: case 1142: case 1144: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LimeCarpet\n\t{\n\t}\n\tnamespace LimeConcrete\n\t{\n\t}\n\tnamespace LimeConcretePowder\n\t{\n\t}\n\tnamespace LimeGlazedTerracotta\n\t{\n\t\tBlockState LimeGlazedTerracotta()\n\t\t{\n\t\t\treturn 9394;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9396: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9397: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9394: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LimeShulkerBox\n\t{\n\t\tBlockState LimeShulkerBox()\n\t\t{\n\t\t\treturn 9312;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9311: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9309: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9313: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9312: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9308: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LimeStainedGlass\n\t{\n\t}\n\tnamespace LimeStainedGlassPane\n\t{\n\t\tBlockState LimeStainedGlassPane()\n\t\t{\n\t\t\treturn 7054;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7041: case 7042: case 7045: case 7046: case 7049: case 7050: case 7053: case 7054: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7033: case 7034: case 7037: case 7038: case 7049: case 7050: case 7053: case 7054: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7029: case 7030: case 7037: case 7038: case 7045: case 7046: case 7053: case 7054: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7026: case 7030: case 7034: case 7038: case 7042: case 7046: case 7050: case 7054: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LimeTerracotta\n\t{\n\t}\n\tnamespace LimeWallBanner\n\t{\n\t\tBlockState LimeWallBanner()\n\t\t{\n\t\t\treturn 8173;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8175: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8176: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8173: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace LimeWool\n\t{\n\t}\n\tnamespace Lodestone\n\t{\n\t}\n\tnamespace Loom\n\t{\n\t\tBlockState Loom()\n\t\t{\n\t\t\treturn 14787;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14789: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14790: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14787: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MagentaBanner\n\t{\n\t\tBlockState MagentaBanner()\n\t\t{\n\t\t\treturn 7929;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7929: return 0;\n\t\t\t\tcase 7930: return 1;\n\t\t\t\tcase 7939: return 10;\n\t\t\t\tcase 7940: return 11;\n\t\t\t\tcase 7941: return 12;\n\t\t\t\tcase 7942: return 13;\n\t\t\t\tcase 7943: return 14;\n\t\t\t\tcase 7944: return 15;\n\t\t\t\tcase 7931: return 2;\n\t\t\t\tcase 7932: return 3;\n\t\t\t\tcase 7933: return 4;\n\t\t\t\tcase 7934: return 5;\n\t\t\t\tcase 7935: return 6;\n\t\t\t\tcase 7936: return 7;\n\t\t\t\tcase 7937: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MagentaBed\n\t{\n\t\tBlockState MagentaBed()\n\t\t{\n\t\t\treturn 1084;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1089: case 1090: case 1091: case 1092: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1093: case 1094: case 1095: case 1096: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1081: case 1082: case 1083: case 1084: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1083: case 1084: case 1087: case 1088: case 1091: case 1092: case 1095: case 1096: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1082: case 1084: case 1086: case 1088: case 1090: case 1092: case 1094: case 1096: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MagentaCarpet\n\t{\n\t}\n\tnamespace MagentaConcrete\n\t{\n\t}\n\tnamespace MagentaConcretePowder\n\t{\n\t}\n\tnamespace MagentaGlazedTerracotta\n\t{\n\t\tBlockState MagentaGlazedTerracotta()\n\t\t{\n\t\t\treturn 9382;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9384: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9385: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9382: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MagentaShulkerBox\n\t{\n\t\tBlockState MagentaShulkerBox()\n\t\t{\n\t\t\treturn 9294;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9293: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9291: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9295: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9294: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9290: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MagentaStainedGlass\n\t{\n\t}\n\tnamespace MagentaStainedGlassPane\n\t{\n\t\tBlockState MagentaStainedGlassPane()\n\t\t{\n\t\t\treturn 6958;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6945: case 6946: case 6949: case 6950: case 6953: case 6954: case 6957: case 6958: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6937: case 6938: case 6941: case 6942: case 6953: case 6954: case 6957: case 6958: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6933: case 6934: case 6941: case 6942: case 6949: case 6950: case 6957: case 6958: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6930: case 6934: case 6938: case 6942: case 6946: case 6950: case 6954: case 6958: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MagentaTerracotta\n\t{\n\t}\n\tnamespace MagentaWallBanner\n\t{\n\t\tBlockState MagentaWallBanner()\n\t\t{\n\t\t\treturn 8161;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8163: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8164: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8161: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MagentaWool\n\t{\n\t}\n\tnamespace MagmaBlock\n\t{\n\t}\n\tnamespace Melon\n\t{\n\t}\n\tnamespace MelonStem\n\t{\n\t\tBlockState MelonStem()\n\t\t{\n\t\t\treturn 4780;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4780: return 0;\n\t\t\t\tcase 4781: return 1;\n\t\t\t\tcase 4782: return 2;\n\t\t\t\tcase 4783: return 3;\n\t\t\t\tcase 4784: return 4;\n\t\t\t\tcase 4785: return 5;\n\t\t\t\tcase 4786: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MossyCobblestone\n\t{\n\t}\n\tnamespace MossyCobblestoneSlab\n\t{\n\t\tBlockState MossyCobblestoneSlab()\n\t\t{\n\t\t\treturn 10816;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10816: return Type::Bottom;\n\t\t\t\tcase 10818: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MossyCobblestoneStairs\n\t{\n\t\tBlockState MossyCobblestoneStairs()\n\t\t{\n\t\t\treturn 10000;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10030: case 10032: case 10034: case 10036: case 10038: case 10040: case 10042: case 10044: case 10046: case 10048: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10050: case 10052: case 10054: case 10056: case 10058: case 10060: case 10062: case 10064: case 10066: case 10068: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9990: case 9992: case 9994: case 9996: case 9998: case 10000: case 10002: case 10004: case 10006: case 10008: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10000: case 10002: case 10004: case 10006: case 10008: case 10020: case 10022: case 10024: case 10026: case 10028: case 10040: case 10042: case 10044: case 10046: case 10048: case 10060: case 10062: case 10064: case 10066: case 10068: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9992: case 10002: case 10012: case 10022: case 10032: case 10042: case 10052: case 10062: return Shape::InnerLeft;\n\t\t\t\tcase 9994: case 10004: case 10014: case 10024: case 10034: case 10044: case 10054: case 10064: return Shape::InnerRight;\n\t\t\t\tcase 9996: case 10006: case 10016: case 10026: case 10036: case 10046: case 10056: case 10066: return Shape::OuterLeft;\n\t\t\t\tcase 9998: case 10008: case 10018: case 10028: case 10038: case 10048: case 10058: case 10068: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MossyCobblestoneWall\n\t{\n\t\tBlockState MossyCobblestoneWall()\n\t\t{\n\t\t\treturn 5984;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6092: case 6093: case 6094: case 6098: case 6099: case 6100: case 6104: case 6105: case 6106: case 6110: case 6111: case 6112: case 6116: case 6117: case 6118: case 6122: case 6123: case 6124: case 6128: case 6129: case 6130: case 6134: case 6135: case 6136: case 6140: case 6141: case 6142: case 6146: case 6147: case 6148: case 6152: case 6153: case 6154: case 6158: case 6159: case 6160: case 6164: case 6165: case 6166: case 6170: case 6171: case 6172: case 6176: case 6177: case 6178: case 6182: case 6183: case 6184: case 6188: case 6189: case 6190: case 6194: case 6195: case 6196: return East::Low;\n\t\t\t\tcase 5984: case 5985: case 5986: case 5990: case 5991: case 5992: case 5996: case 5997: case 5998: case 6002: case 6003: case 6004: case 6008: case 6009: case 6010: case 6014: case 6015: case 6016: case 6020: case 6021: case 6022: case 6026: case 6027: case 6028: case 6032: case 6033: case 6034: case 6038: case 6039: case 6040: case 6044: case 6045: case 6046: case 6050: case 6051: case 6052: case 6056: case 6057: case 6058: case 6062: case 6063: case 6064: case 6068: case 6069: case 6070: case 6074: case 6075: case 6076: case 6080: case 6081: case 6082: case 6086: case 6087: case 6088: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6020: case 6021: case 6022: case 6026: case 6027: case 6028: case 6032: case 6033: case 6034: case 6038: case 6039: case 6040: case 6044: case 6045: case 6046: case 6050: case 6051: case 6052: case 6128: case 6129: case 6130: case 6134: case 6135: case 6136: case 6140: case 6141: case 6142: case 6146: case 6147: case 6148: case 6152: case 6153: case 6154: case 6158: case 6159: case 6160: case 6236: case 6237: case 6238: case 6242: case 6243: case 6244: case 6248: case 6249: case 6250: case 6254: case 6255: case 6256: case 6260: case 6261: case 6262: case 6266: case 6267: case 6268: return North::Low;\n\t\t\t\tcase 5984: case 5985: case 5986: case 5990: case 5991: case 5992: case 5996: case 5997: case 5998: case 6002: case 6003: case 6004: case 6008: case 6009: case 6010: case 6014: case 6015: case 6016: case 6092: case 6093: case 6094: case 6098: case 6099: case 6100: case 6104: case 6105: case 6106: case 6110: case 6111: case 6112: case 6116: case 6117: case 6118: case 6122: case 6123: case 6124: case 6200: case 6201: case 6202: case 6206: case 6207: case 6208: case 6212: case 6213: case 6214: case 6218: case 6219: case 6220: case 6224: case 6225: case 6226: case 6230: case 6231: case 6232: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5996: case 5997: case 5998: case 6002: case 6003: case 6004: case 6032: case 6033: case 6034: case 6038: case 6039: case 6040: case 6068: case 6069: case 6070: case 6074: case 6075: case 6076: case 6104: case 6105: case 6106: case 6110: case 6111: case 6112: case 6140: case 6141: case 6142: case 6146: case 6147: case 6148: case 6176: case 6177: case 6178: case 6182: case 6183: case 6184: case 6212: case 6213: case 6214: case 6218: case 6219: case 6220: case 6248: case 6249: case 6250: case 6254: case 6255: case 6256: case 6284: case 6285: case 6286: case 6290: case 6291: case 6292: return South::Low;\n\t\t\t\tcase 5984: case 5985: case 5986: case 5990: case 5991: case 5992: case 6020: case 6021: case 6022: case 6026: case 6027: case 6028: case 6056: case 6057: case 6058: case 6062: case 6063: case 6064: case 6092: case 6093: case 6094: case 6098: case 6099: case 6100: case 6128: case 6129: case 6130: case 6134: case 6135: case 6136: case 6164: case 6165: case 6166: case 6170: case 6171: case 6172: case 6200: case 6201: case 6202: case 6206: case 6207: case 6208: case 6236: case 6237: case 6238: case 6242: case 6243: case 6244: case 6272: case 6273: case 6274: case 6278: case 6279: case 6280: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5990: case 5991: case 5992: case 6002: case 6003: case 6004: case 6014: case 6015: case 6016: case 6026: case 6027: case 6028: case 6038: case 6039: case 6040: case 6050: case 6051: case 6052: case 6062: case 6063: case 6064: case 6074: case 6075: case 6076: case 6086: case 6087: case 6088: case 6098: case 6099: case 6100: case 6110: case 6111: case 6112: case 6122: case 6123: case 6124: case 6134: case 6135: case 6136: case 6146: case 6147: case 6148: case 6158: case 6159: case 6160: case 6170: case 6171: case 6172: case 6182: case 6183: case 6184: case 6194: case 6195: case 6196: case 6206: case 6207: case 6208: case 6218: case 6219: case 6220: case 6230: case 6231: case 6232: case 6242: case 6243: case 6244: case 6254: case 6255: case 6256: case 6266: case 6267: case 6268: case 6278: case 6279: case 6280: case 6290: case 6291: case 6292: case 6302: case 6303: case 6304: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5985: case 5991: case 5997: case 6003: case 6009: case 6015: case 6021: case 6027: case 6033: case 6039: case 6045: case 6051: case 6057: case 6063: case 6069: case 6075: case 6081: case 6087: case 6093: case 6099: case 6105: case 6111: case 6117: case 6123: case 6129: case 6135: case 6141: case 6147: case 6153: case 6159: case 6165: case 6171: case 6177: case 6183: case 6189: case 6195: case 6201: case 6207: case 6213: case 6219: case 6225: case 6231: case 6237: case 6243: case 6249: case 6255: case 6261: case 6267: case 6273: case 6279: case 6285: case 6291: case 6297: case 6303: return West::Low;\n\t\t\t\tcase 5984: case 5990: case 5996: case 6002: case 6008: case 6014: case 6020: case 6026: case 6032: case 6038: case 6044: case 6050: case 6056: case 6062: case 6068: case 6074: case 6080: case 6086: case 6092: case 6098: case 6104: case 6110: case 6116: case 6122: case 6128: case 6134: case 6140: case 6146: case 6152: case 6158: case 6164: case 6170: case 6176: case 6182: case 6188: case 6194: case 6200: case 6206: case 6212: case 6218: case 6224: case 6230: case 6236: case 6242: case 6248: case 6254: case 6260: case 6266: case 6272: case 6278: case 6284: case 6290: case 6296: case 6302: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MossyStoneBrickSlab\n\t{\n\t\tBlockState MossyStoneBrickSlab()\n\t\t{\n\t\t\treturn 10804;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10804: return Type::Bottom;\n\t\t\t\tcase 10806: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MossyStoneBrickStairs\n\t{\n\t\tBlockState MossyStoneBrickStairs()\n\t\t{\n\t\t\treturn 9840;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9870: case 9872: case 9874: case 9876: case 9878: case 9880: case 9882: case 9884: case 9886: case 9888: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9890: case 9892: case 9894: case 9896: case 9898: case 9900: case 9902: case 9904: case 9906: case 9908: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9830: case 9832: case 9834: case 9836: case 9838: case 9840: case 9842: case 9844: case 9846: case 9848: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9840: case 9842: case 9844: case 9846: case 9848: case 9860: case 9862: case 9864: case 9866: case 9868: case 9880: case 9882: case 9884: case 9886: case 9888: case 9900: case 9902: case 9904: case 9906: case 9908: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9832: case 9842: case 9852: case 9862: case 9872: case 9882: case 9892: case 9902: return Shape::InnerLeft;\n\t\t\t\tcase 9834: case 9844: case 9854: case 9864: case 9874: case 9884: case 9894: case 9904: return Shape::InnerRight;\n\t\t\t\tcase 9836: case 9846: case 9856: case 9866: case 9876: case 9886: case 9896: case 9906: return Shape::OuterLeft;\n\t\t\t\tcase 9838: case 9848: case 9858: case 9868: case 9878: case 9888: case 9898: case 9908: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MossyStoneBrickWall\n\t{\n\t\tBlockState MossyStoneBrickWall()\n\t\t{\n\t\t\treturn 11842;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11950: case 11951: case 11952: case 11956: case 11957: case 11958: case 11962: case 11963: case 11964: case 11968: case 11969: case 11970: case 11974: case 11975: case 11976: case 11980: case 11981: case 11982: case 11986: case 11987: case 11988: case 11992: case 11993: case 11994: case 11998: case 11999: case 12000: case 12004: case 12005: case 12006: case 12010: case 12011: case 12012: case 12016: case 12017: case 12018: case 12022: case 12023: case 12024: case 12028: case 12029: case 12030: case 12034: case 12035: case 12036: case 12040: case 12041: case 12042: case 12046: case 12047: case 12048: case 12052: case 12053: case 12054: return East::Low;\n\t\t\t\tcase 11842: case 11843: case 11844: case 11848: case 11849: case 11850: case 11854: case 11855: case 11856: case 11860: case 11861: case 11862: case 11866: case 11867: case 11868: case 11872: case 11873: case 11874: case 11878: case 11879: case 11880: case 11884: case 11885: case 11886: case 11890: case 11891: case 11892: case 11896: case 11897: case 11898: case 11902: case 11903: case 11904: case 11908: case 11909: case 11910: case 11914: case 11915: case 11916: case 11920: case 11921: case 11922: case 11926: case 11927: case 11928: case 11932: case 11933: case 11934: case 11938: case 11939: case 11940: case 11944: case 11945: case 11946: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11878: case 11879: case 11880: case 11884: case 11885: case 11886: case 11890: case 11891: case 11892: case 11896: case 11897: case 11898: case 11902: case 11903: case 11904: case 11908: case 11909: case 11910: case 11986: case 11987: case 11988: case 11992: case 11993: case 11994: case 11998: case 11999: case 12000: case 12004: case 12005: case 12006: case 12010: case 12011: case 12012: case 12016: case 12017: case 12018: case 12094: case 12095: case 12096: case 12100: case 12101: case 12102: case 12106: case 12107: case 12108: case 12112: case 12113: case 12114: case 12118: case 12119: case 12120: case 12124: case 12125: case 12126: return North::Low;\n\t\t\t\tcase 11842: case 11843: case 11844: case 11848: case 11849: case 11850: case 11854: case 11855: case 11856: case 11860: case 11861: case 11862: case 11866: case 11867: case 11868: case 11872: case 11873: case 11874: case 11950: case 11951: case 11952: case 11956: case 11957: case 11958: case 11962: case 11963: case 11964: case 11968: case 11969: case 11970: case 11974: case 11975: case 11976: case 11980: case 11981: case 11982: case 12058: case 12059: case 12060: case 12064: case 12065: case 12066: case 12070: case 12071: case 12072: case 12076: case 12077: case 12078: case 12082: case 12083: case 12084: case 12088: case 12089: case 12090: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11854: case 11855: case 11856: case 11860: case 11861: case 11862: case 11890: case 11891: case 11892: case 11896: case 11897: case 11898: case 11926: case 11927: case 11928: case 11932: case 11933: case 11934: case 11962: case 11963: case 11964: case 11968: case 11969: case 11970: case 11998: case 11999: case 12000: case 12004: case 12005: case 12006: case 12034: case 12035: case 12036: case 12040: case 12041: case 12042: case 12070: case 12071: case 12072: case 12076: case 12077: case 12078: case 12106: case 12107: case 12108: case 12112: case 12113: case 12114: case 12142: case 12143: case 12144: case 12148: case 12149: case 12150: return South::Low;\n\t\t\t\tcase 11842: case 11843: case 11844: case 11848: case 11849: case 11850: case 11878: case 11879: case 11880: case 11884: case 11885: case 11886: case 11914: case 11915: case 11916: case 11920: case 11921: case 11922: case 11950: case 11951: case 11952: case 11956: case 11957: case 11958: case 11986: case 11987: case 11988: case 11992: case 11993: case 11994: case 12022: case 12023: case 12024: case 12028: case 12029: case 12030: case 12058: case 12059: case 12060: case 12064: case 12065: case 12066: case 12094: case 12095: case 12096: case 12100: case 12101: case 12102: case 12130: case 12131: case 12132: case 12136: case 12137: case 12138: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11848: case 11849: case 11850: case 11860: case 11861: case 11862: case 11872: case 11873: case 11874: case 11884: case 11885: case 11886: case 11896: case 11897: case 11898: case 11908: case 11909: case 11910: case 11920: case 11921: case 11922: case 11932: case 11933: case 11934: case 11944: case 11945: case 11946: case 11956: case 11957: case 11958: case 11968: case 11969: case 11970: case 11980: case 11981: case 11982: case 11992: case 11993: case 11994: case 12004: case 12005: case 12006: case 12016: case 12017: case 12018: case 12028: case 12029: case 12030: case 12040: case 12041: case 12042: case 12052: case 12053: case 12054: case 12064: case 12065: case 12066: case 12076: case 12077: case 12078: case 12088: case 12089: case 12090: case 12100: case 12101: case 12102: case 12112: case 12113: case 12114: case 12124: case 12125: case 12126: case 12136: case 12137: case 12138: case 12148: case 12149: case 12150: case 12160: case 12161: case 12162: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11843: case 11849: case 11855: case 11861: case 11867: case 11873: case 11879: case 11885: case 11891: case 11897: case 11903: case 11909: case 11915: case 11921: case 11927: case 11933: case 11939: case 11945: case 11951: case 11957: case 11963: case 11969: case 11975: case 11981: case 11987: case 11993: case 11999: case 12005: case 12011: case 12017: case 12023: case 12029: case 12035: case 12041: case 12047: case 12053: case 12059: case 12065: case 12071: case 12077: case 12083: case 12089: case 12095: case 12101: case 12107: case 12113: case 12119: case 12125: case 12131: case 12137: case 12143: case 12149: case 12155: case 12161: return West::Low;\n\t\t\t\tcase 11842: case 11848: case 11854: case 11860: case 11866: case 11872: case 11878: case 11884: case 11890: case 11896: case 11902: case 11908: case 11914: case 11920: case 11926: case 11932: case 11938: case 11944: case 11950: case 11956: case 11962: case 11968: case 11974: case 11980: case 11986: case 11992: case 11998: case 12004: case 12010: case 12016: case 12022: case 12028: case 12034: case 12040: case 12046: case 12052: case 12058: case 12064: case 12070: case 12076: case 12082: case 12088: case 12094: case 12100: case 12106: case 12112: case 12118: case 12124: case 12130: case 12136: case 12142: case 12148: case 12154: case 12160: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MossyStoneBricks\n\t{\n\t}\n\tnamespace MovingPiston\n\t{\n\t\tBlockState MovingPiston()\n\t\t{\n\t\t\treturn 1400;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1406: case 1407: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1402: case 1403: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1410: case 1411: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 1408: case 1409: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 1400: case 1401: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1400: case 1402: case 1404: case 1406: case 1408: case 1410: return Type::Normal;\n\t\t\t\tdefault: return Type::Sticky;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace MushroomStem\n\t{\n\t\tBlockState MushroomStem()\n\t\t{\n\t\t\treturn 4633;\n\t\t}\n\t\tbool Down(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4665: case 4666: case 4667: case 4668: case 4669: case 4670: case 4671: case 4672: case 4673: case 4674: case 4675: case 4676: case 4677: case 4678: case 4679: case 4680: case 4681: case 4682: case 4683: case 4684: case 4685: case 4686: case 4687: case 4688: case 4689: case 4690: case 4691: case 4692: case 4693: case 4694: case 4695: case 4696: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4649: case 4650: case 4651: case 4652: case 4653: case 4654: case 4655: case 4656: case 4657: case 4658: case 4659: case 4660: case 4661: case 4662: case 4663: case 4664: case 4681: case 4682: case 4683: case 4684: case 4685: case 4686: case 4687: case 4688: case 4689: case 4690: case 4691: case 4692: case 4693: case 4694: case 4695: case 4696: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4641: case 4642: case 4643: case 4644: case 4645: case 4646: case 4647: case 4648: case 4657: case 4658: case 4659: case 4660: case 4661: case 4662: case 4663: case 4664: case 4673: case 4674: case 4675: case 4676: case 4677: case 4678: case 4679: case 4680: case 4689: case 4690: case 4691: case 4692: case 4693: case 4694: case 4695: case 4696: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4637: case 4638: case 4639: case 4640: case 4645: case 4646: case 4647: case 4648: case 4653: case 4654: case 4655: case 4656: case 4661: case 4662: case 4663: case 4664: case 4669: case 4670: case 4671: case 4672: case 4677: case 4678: case 4679: case 4680: case 4685: case 4686: case 4687: case 4688: case 4693: case 4694: case 4695: case 4696: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4635: case 4636: case 4639: case 4640: case 4643: case 4644: case 4647: case 4648: case 4651: case 4652: case 4655: case 4656: case 4659: case 4660: case 4663: case 4664: case 4667: case 4668: case 4671: case 4672: case 4675: case 4676: case 4679: case 4680: case 4683: case 4684: case 4687: case 4688: case 4691: case 4692: case 4695: case 4696: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4634: case 4636: case 4638: case 4640: case 4642: case 4644: case 4646: case 4648: case 4650: case 4652: case 4654: case 4656: case 4658: case 4660: case 4662: case 4664: case 4666: case 4668: case 4670: case 4672: case 4674: case 4676: case 4678: case 4680: case 4682: case 4684: case 4686: case 4688: case 4690: case 4692: case 4694: case 4696: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Mycelium\n\t{\n\t\tBlockState Mycelium()\n\t\t{\n\t\t\treturn 5013;\n\t\t}\n\t\tbool Snowy(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5013: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace NetherBrickFence\n\t{\n\t\tBlockState NetherBrickFence()\n\t\t{\n\t\t\treturn 5047;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5034: case 5035: case 5038: case 5039: case 5042: case 5043: case 5046: case 5047: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5026: case 5027: case 5030: case 5031: case 5042: case 5043: case 5046: case 5047: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5022: case 5023: case 5030: case 5031: case 5038: case 5039: case 5046: case 5047: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5019: case 5023: case 5027: case 5031: case 5035: case 5039: case 5043: case 5047: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace NetherBrickSlab\n\t{\n\t\tBlockState NetherBrickSlab()\n\t\t{\n\t\t\treturn 8387;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8387: return Type::Bottom;\n\t\t\t\tcase 8389: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace NetherBrickStairs\n\t{\n\t\tBlockState NetherBrickStairs()\n\t\t{\n\t\t\treturn 5059;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5089: case 5091: case 5093: case 5095: case 5097: case 5099: case 5101: case 5103: case 5105: case 5107: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5109: case 5111: case 5113: case 5115: case 5117: case 5119: case 5121: case 5123: case 5125: case 5127: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5049: case 5051: case 5053: case 5055: case 5057: case 5059: case 5061: case 5063: case 5065: case 5067: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5059: case 5061: case 5063: case 5065: case 5067: case 5079: case 5081: case 5083: case 5085: case 5087: case 5099: case 5101: case 5103: case 5105: case 5107: case 5119: case 5121: case 5123: case 5125: case 5127: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5051: case 5061: case 5071: case 5081: case 5091: case 5101: case 5111: case 5121: return Shape::InnerLeft;\n\t\t\t\tcase 5053: case 5063: case 5073: case 5083: case 5093: case 5103: case 5113: case 5123: return Shape::InnerRight;\n\t\t\t\tcase 5055: case 5065: case 5075: case 5085: case 5095: case 5105: case 5115: case 5125: return Shape::OuterLeft;\n\t\t\t\tcase 5057: case 5067: case 5077: case 5087: case 5097: case 5107: case 5117: case 5127: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace NetherBrickWall\n\t{\n\t\tBlockState NetherBrickWall()\n\t\t{\n\t\t\treturn 12814;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12922: case 12923: case 12924: case 12928: case 12929: case 12930: case 12934: case 12935: case 12936: case 12940: case 12941: case 12942: case 12946: case 12947: case 12948: case 12952: case 12953: case 12954: case 12958: case 12959: case 12960: case 12964: case 12965: case 12966: case 12970: case 12971: case 12972: case 12976: case 12977: case 12978: case 12982: case 12983: case 12984: case 12988: case 12989: case 12990: case 12994: case 12995: case 12996: case 13000: case 13001: case 13002: case 13006: case 13007: case 13008: case 13012: case 13013: case 13014: case 13018: case 13019: case 13020: case 13024: case 13025: case 13026: return East::Low;\n\t\t\t\tcase 12814: case 12815: case 12816: case 12820: case 12821: case 12822: case 12826: case 12827: case 12828: case 12832: case 12833: case 12834: case 12838: case 12839: case 12840: case 12844: case 12845: case 12846: case 12850: case 12851: case 12852: case 12856: case 12857: case 12858: case 12862: case 12863: case 12864: case 12868: case 12869: case 12870: case 12874: case 12875: case 12876: case 12880: case 12881: case 12882: case 12886: case 12887: case 12888: case 12892: case 12893: case 12894: case 12898: case 12899: case 12900: case 12904: case 12905: case 12906: case 12910: case 12911: case 12912: case 12916: case 12917: case 12918: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12850: case 12851: case 12852: case 12856: case 12857: case 12858: case 12862: case 12863: case 12864: case 12868: case 12869: case 12870: case 12874: case 12875: case 12876: case 12880: case 12881: case 12882: case 12958: case 12959: case 12960: case 12964: case 12965: case 12966: case 12970: case 12971: case 12972: case 12976: case 12977: case 12978: case 12982: case 12983: case 12984: case 12988: case 12989: case 12990: case 13066: case 13067: case 13068: case 13072: case 13073: case 13074: case 13078: case 13079: case 13080: case 13084: case 13085: case 13086: case 13090: case 13091: case 13092: case 13096: case 13097: case 13098: return North::Low;\n\t\t\t\tcase 12814: case 12815: case 12816: case 12820: case 12821: case 12822: case 12826: case 12827: case 12828: case 12832: case 12833: case 12834: case 12838: case 12839: case 12840: case 12844: case 12845: case 12846: case 12922: case 12923: case 12924: case 12928: case 12929: case 12930: case 12934: case 12935: case 12936: case 12940: case 12941: case 12942: case 12946: case 12947: case 12948: case 12952: case 12953: case 12954: case 13030: case 13031: case 13032: case 13036: case 13037: case 13038: case 13042: case 13043: case 13044: case 13048: case 13049: case 13050: case 13054: case 13055: case 13056: case 13060: case 13061: case 13062: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12826: case 12827: case 12828: case 12832: case 12833: case 12834: case 12862: case 12863: case 12864: case 12868: case 12869: case 12870: case 12898: case 12899: case 12900: case 12904: case 12905: case 12906: case 12934: case 12935: case 12936: case 12940: case 12941: case 12942: case 12970: case 12971: case 12972: case 12976: case 12977: case 12978: case 13006: case 13007: case 13008: case 13012: case 13013: case 13014: case 13042: case 13043: case 13044: case 13048: case 13049: case 13050: case 13078: case 13079: case 13080: case 13084: case 13085: case 13086: case 13114: case 13115: case 13116: case 13120: case 13121: case 13122: return South::Low;\n\t\t\t\tcase 12814: case 12815: case 12816: case 12820: case 12821: case 12822: case 12850: case 12851: case 12852: case 12856: case 12857: case 12858: case 12886: case 12887: case 12888: case 12892: case 12893: case 12894: case 12922: case 12923: case 12924: case 12928: case 12929: case 12930: case 12958: case 12959: case 12960: case 12964: case 12965: case 12966: case 12994: case 12995: case 12996: case 13000: case 13001: case 13002: case 13030: case 13031: case 13032: case 13036: case 13037: case 13038: case 13066: case 13067: case 13068: case 13072: case 13073: case 13074: case 13102: case 13103: case 13104: case 13108: case 13109: case 13110: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12820: case 12821: case 12822: case 12832: case 12833: case 12834: case 12844: case 12845: case 12846: case 12856: case 12857: case 12858: case 12868: case 12869: case 12870: case 12880: case 12881: case 12882: case 12892: case 12893: case 12894: case 12904: case 12905: case 12906: case 12916: case 12917: case 12918: case 12928: case 12929: case 12930: case 12940: case 12941: case 12942: case 12952: case 12953: case 12954: case 12964: case 12965: case 12966: case 12976: case 12977: case 12978: case 12988: case 12989: case 12990: case 13000: case 13001: case 13002: case 13012: case 13013: case 13014: case 13024: case 13025: case 13026: case 13036: case 13037: case 13038: case 13048: case 13049: case 13050: case 13060: case 13061: case 13062: case 13072: case 13073: case 13074: case 13084: case 13085: case 13086: case 13096: case 13097: case 13098: case 13108: case 13109: case 13110: case 13120: case 13121: case 13122: case 13132: case 13133: case 13134: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12815: case 12821: case 12827: case 12833: case 12839: case 12845: case 12851: case 12857: case 12863: case 12869: case 12875: case 12881: case 12887: case 12893: case 12899: case 12905: case 12911: case 12917: case 12923: case 12929: case 12935: case 12941: case 12947: case 12953: case 12959: case 12965: case 12971: case 12977: case 12983: case 12989: case 12995: case 13001: case 13007: case 13013: case 13019: case 13025: case 13031: case 13037: case 13043: case 13049: case 13055: case 13061: case 13067: case 13073: case 13079: case 13085: case 13091: case 13097: case 13103: case 13109: case 13115: case 13121: case 13127: case 13133: return West::Low;\n\t\t\t\tcase 12814: case 12820: case 12826: case 12832: case 12838: case 12844: case 12850: case 12856: case 12862: case 12868: case 12874: case 12880: case 12886: case 12892: case 12898: case 12904: case 12910: case 12916: case 12922: case 12928: case 12934: case 12940: case 12946: case 12952: case 12958: case 12964: case 12970: case 12976: case 12982: case 12988: case 12994: case 13000: case 13006: case 13012: case 13018: case 13024: case 13030: case 13036: case 13042: case 13048: case 13054: case 13060: case 13066: case 13072: case 13078: case 13084: case 13090: case 13096: case 13102: case 13108: case 13114: case 13120: case 13126: case 13132: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace NetherBricks\n\t{\n\t}\n\tnamespace NetherGoldOre\n\t{\n\t}\n\tnamespace NetherPortal\n\t{\n\t\tBlockState NetherPortal()\n\t\t{\n\t\t\treturn 4014;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4014: return Axis::X;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace NetherQuartzOre\n\t{\n\t}\n\tnamespace NetherSprouts\n\t{\n\t}\n\tnamespace NetherWart\n\t{\n\t\tBlockState NetherWart()\n\t\t{\n\t\t\treturn 5128;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5128: return 0;\n\t\t\t\tcase 5129: return 1;\n\t\t\t\tcase 5130: return 2;\n\t\t\t\tdefault: return 3;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace NetherWartBlock\n\t{\n\t}\n\tnamespace NetheriteBlock\n\t{\n\t}\n\tnamespace Netherrack\n\t{\n\t}\n\tnamespace NoteBlock\n\t{\n\t\tBlockState NoteBlock()\n\t\t{\n\t\t\treturn 250;\n\t\t}\n\t\tenum Instrument Instrument(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 949: case 950: case 951: case 952: case 953: case 954: case 955: case 956: case 957: case 958: case 959: case 960: case 961: case 962: case 963: case 964: case 965: case 966: case 967: case 968: case 969: case 970: case 971: case 972: case 973: case 974: case 975: case 976: case 977: case 978: case 979: case 980: case 981: case 982: case 983: case 984: case 985: case 986: case 987: case 988: case 989: case 990: case 991: case 992: case 993: case 994: case 995: case 996: case 997: case 998: return Instrument::Banjo;\n\t\t\t\tcase 299: case 300: case 301: case 302: case 303: case 304: case 305: case 306: case 307: case 308: case 309: case 310: case 311: case 312: case 313: case 314: case 315: case 316: case 317: case 318: case 319: case 320: case 321: case 322: case 323: case 324: case 325: case 326: case 327: case 328: case 329: case 330: case 331: case 332: case 333: case 334: case 335: case 336: case 337: case 338: case 339: case 340: case 341: case 342: case 343: case 344: case 345: case 346: case 347: case 348: return Instrument::Basedrum;\n\t\t\t\tcase 449: case 450: case 451: case 452: case 453: case 454: case 455: case 456: case 457: case 458: case 459: case 460: case 461: case 462: case 463: case 464: case 465: case 466: case 467: case 468: case 469: case 470: case 471: case 472: case 473: case 474: case 475: case 476: case 477: case 478: case 479: case 480: case 481: case 482: case 483: case 484: case 485: case 486: case 487: case 488: case 489: case 490: case 491: case 492: case 493: case 494: case 495: case 496: case 497: case 498: return Instrument::Bass;\n\t\t\t\tcase 549: case 550: case 551: case 552: case 553: case 554: case 555: case 556: case 557: case 558: case 559: case 560: case 561: case 562: case 563: case 564: case 565: case 566: case 567: case 568: case 569: case 570: case 571: case 572: case 573: case 574: case 575: case 576: case 577: case 578: case 579: case 580: case 581: case 582: case 583: case 584: case 585: case 586: case 587: case 588: case 589: case 590: case 591: case 592: case 593: case 594: case 595: case 596: case 597: case 598: return Instrument::Bell;\n\t\t\t\tcase 899: case 900: case 901: case 902: case 903: case 904: case 905: case 906: case 907: case 908: case 909: case 910: case 911: case 912: case 913: case 914: case 915: case 916: case 917: case 918: case 919: case 920: case 921: case 922: case 923: case 924: case 925: case 926: case 927: case 928: case 929: case 930: case 931: case 932: case 933: case 934: case 935: case 936: case 937: case 938: case 939: case 940: case 941: case 942: case 943: case 944: case 945: case 946: case 947: case 948: return Instrument::Bit;\n\t\t\t\tcase 649: case 650: case 651: case 652: case 653: case 654: case 655: case 656: case 657: case 658: case 659: case 660: case 661: case 662: case 663: case 664: case 665: case 666: case 667: case 668: case 669: case 670: case 671: case 672: case 673: case 674: case 675: case 676: case 677: case 678: case 679: case 680: case 681: case 682: case 683: case 684: case 685: case 686: case 687: case 688: case 689: case 690: case 691: case 692: case 693: case 694: case 695: case 696: case 697: case 698: return Instrument::Chime;\n\t\t\t\tcase 799: case 800: case 801: case 802: case 803: case 804: case 805: case 806: case 807: case 808: case 809: case 810: case 811: case 812: case 813: case 814: case 815: case 816: case 817: case 818: case 819: case 820: case 821: case 822: case 823: case 824: case 825: case 826: case 827: case 828: case 829: case 830: case 831: case 832: case 833: case 834: case 835: case 836: case 837: case 838: case 839: case 840: case 841: case 842: case 843: case 844: case 845: case 846: case 847: case 848: return Instrument::CowBell;\n\t\t\t\tcase 849: case 850: case 851: case 852: case 853: case 854: case 855: case 856: case 857: case 858: case 859: case 860: case 861: case 862: case 863: case 864: case 865: case 866: case 867: case 868: case 869: case 870: case 871: case 872: case 873: case 874: case 875: case 876: case 877: case 878: case 879: case 880: case 881: case 882: case 883: case 884: case 885: case 886: case 887: case 888: case 889: case 890: case 891: case 892: case 893: case 894: case 895: case 896: case 897: case 898: return Instrument::Didgeridoo;\n\t\t\t\tcase 499: case 500: case 501: case 502: case 503: case 504: case 505: case 506: case 507: case 508: case 509: case 510: case 511: case 512: case 513: case 514: case 515: case 516: case 517: case 518: case 519: case 520: case 521: case 522: case 523: case 524: case 525: case 526: case 527: case 528: case 529: case 530: case 531: case 532: case 533: case 534: case 535: case 536: case 537: case 538: case 539: case 540: case 541: case 542: case 543: case 544: case 545: case 546: case 547: case 548: return Instrument::Flute;\n\t\t\t\tcase 599: case 600: case 601: case 602: case 603: case 604: case 605: case 606: case 607: case 608: case 609: case 610: case 611: case 612: case 613: case 614: case 615: case 616: case 617: case 618: case 619: case 620: case 621: case 622: case 623: case 624: case 625: case 626: case 627: case 628: case 629: case 630: case 631: case 632: case 633: case 634: case 635: case 636: case 637: case 638: case 639: case 640: case 641: case 642: case 643: case 644: case 645: case 646: case 647: case 648: return Instrument::Guitar;\n\t\t\t\tcase 249: case 250: case 251: case 252: case 253: case 254: case 255: case 256: case 257: case 258: case 259: case 260: case 261: case 262: case 263: case 264: case 265: case 266: case 267: case 268: case 269: case 270: case 271: case 272: case 273: case 274: case 275: case 276: case 277: case 278: case 279: case 280: case 281: case 282: case 283: case 284: case 285: case 286: case 287: case 288: case 289: case 290: case 291: case 292: case 293: case 294: case 295: case 296: case 297: case 298: return Instrument::Harp;\n\t\t\t\tcase 399: case 400: case 401: case 402: case 403: case 404: case 405: case 406: case 407: case 408: case 409: case 410: case 411: case 412: case 413: case 414: case 415: case 416: case 417: case 418: case 419: case 420: case 421: case 422: case 423: case 424: case 425: case 426: case 427: case 428: case 429: case 430: case 431: case 432: case 433: case 434: case 435: case 436: case 437: case 438: case 439: case 440: case 441: case 442: case 443: case 444: case 445: case 446: case 447: case 448: return Instrument::Hat;\n\t\t\t\tcase 749: case 750: case 751: case 752: case 753: case 754: case 755: case 756: case 757: case 758: case 759: case 760: case 761: case 762: case 763: case 764: case 765: case 766: case 767: case 768: case 769: case 770: case 771: case 772: case 773: case 774: case 775: case 776: case 777: case 778: case 779: case 780: case 781: case 782: case 783: case 784: case 785: case 786: case 787: case 788: case 789: case 790: case 791: case 792: case 793: case 794: case 795: case 796: case 797: case 798: return Instrument::IronXylophone;\n\t\t\t\tcase 999: case 1000: case 1001: case 1002: case 1003: case 1004: case 1005: case 1006: case 1007: case 1008: case 1009: case 1010: case 1011: case 1012: case 1013: case 1014: case 1015: case 1016: case 1017: case 1018: case 1019: case 1020: case 1021: case 1022: case 1023: case 1024: case 1025: case 1026: case 1027: case 1028: case 1029: case 1030: case 1031: case 1032: case 1033: case 1034: case 1035: case 1036: case 1037: case 1038: case 1039: case 1040: case 1041: case 1042: case 1043: case 1044: case 1045: case 1046: case 1047: case 1048: return Instrument::Pling;\n\t\t\t\tcase 349: case 350: case 351: case 352: case 353: case 354: case 355: case 356: case 357: case 358: case 359: case 360: case 361: case 362: case 363: case 364: case 365: case 366: case 367: case 368: case 369: case 370: case 371: case 372: case 373: case 374: case 375: case 376: case 377: case 378: case 379: case 380: case 381: case 382: case 383: case 384: case 385: case 386: case 387: case 388: case 389: case 390: case 391: case 392: case 393: case 394: case 395: case 396: case 397: case 398: return Instrument::Snare;\n\t\t\t\tdefault: return Instrument::Xylophone;\n\t\t\t}\n\t\t}\n\t\tunsigned char Note(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 249: case 250: case 299: case 300: case 349: case 350: case 399: case 400: case 449: case 450: case 499: case 500: case 549: case 550: case 599: case 600: case 649: case 650: case 699: case 700: case 749: case 750: case 799: case 800: case 849: case 850: case 899: case 900: case 949: case 950: case 999: case 1000: return 0;\n\t\t\t\tcase 251: case 252: case 301: case 302: case 351: case 352: case 401: case 402: case 451: case 452: case 501: case 502: case 551: case 552: case 601: case 602: case 651: case 652: case 701: case 702: case 751: case 752: case 801: case 802: case 851: case 852: case 901: case 902: case 951: case 952: case 1001: case 1002: return 1;\n\t\t\t\tcase 269: case 270: case 319: case 320: case 369: case 370: case 419: case 420: case 469: case 470: case 519: case 520: case 569: case 570: case 619: case 620: case 669: case 670: case 719: case 720: case 769: case 770: case 819: case 820: case 869: case 870: case 919: case 920: case 969: case 970: case 1019: case 1020: return 10;\n\t\t\t\tcase 271: case 272: case 321: case 322: case 371: case 372: case 421: case 422: case 471: case 472: case 521: case 522: case 571: case 572: case 621: case 622: case 671: case 672: case 721: case 722: case 771: case 772: case 821: case 822: case 871: case 872: case 921: case 922: case 971: case 972: case 1021: case 1022: return 11;\n\t\t\t\tcase 273: case 274: case 323: case 324: case 373: case 374: case 423: case 424: case 473: case 474: case 523: case 524: case 573: case 574: case 623: case 624: case 673: case 674: case 723: case 724: case 773: case 774: case 823: case 824: case 873: case 874: case 923: case 924: case 973: case 974: case 1023: case 1024: return 12;\n\t\t\t\tcase 275: case 276: case 325: case 326: case 375: case 376: case 425: case 426: case 475: case 476: case 525: case 526: case 575: case 576: case 625: case 626: case 675: case 676: case 725: case 726: case 775: case 776: case 825: case 826: case 875: case 876: case 925: case 926: case 975: case 976: case 1025: case 1026: return 13;\n\t\t\t\tcase 277: case 278: case 327: case 328: case 377: case 378: case 427: case 428: case 477: case 478: case 527: case 528: case 577: case 578: case 627: case 628: case 677: case 678: case 727: case 728: case 777: case 778: case 827: case 828: case 877: case 878: case 927: case 928: case 977: case 978: case 1027: case 1028: return 14;\n\t\t\t\tcase 279: case 280: case 329: case 330: case 379: case 380: case 429: case 430: case 479: case 480: case 529: case 530: case 579: case 580: case 629: case 630: case 679: case 680: case 729: case 730: case 779: case 780: case 829: case 830: case 879: case 880: case 929: case 930: case 979: case 980: case 1029: case 1030: return 15;\n\t\t\t\tcase 281: case 282: case 331: case 332: case 381: case 382: case 431: case 432: case 481: case 482: case 531: case 532: case 581: case 582: case 631: case 632: case 681: case 682: case 731: case 732: case 781: case 782: case 831: case 832: case 881: case 882: case 931: case 932: case 981: case 982: case 1031: case 1032: return 16;\n\t\t\t\tcase 283: case 284: case 333: case 334: case 383: case 384: case 433: case 434: case 483: case 484: case 533: case 534: case 583: case 584: case 633: case 634: case 683: case 684: case 733: case 734: case 783: case 784: case 833: case 834: case 883: case 884: case 933: case 934: case 983: case 984: case 1033: case 1034: return 17;\n\t\t\t\tcase 285: case 286: case 335: case 336: case 385: case 386: case 435: case 436: case 485: case 486: case 535: case 536: case 585: case 586: case 635: case 636: case 685: case 686: case 735: case 736: case 785: case 786: case 835: case 836: case 885: case 886: case 935: case 936: case 985: case 986: case 1035: case 1036: return 18;\n\t\t\t\tcase 287: case 288: case 337: case 338: case 387: case 388: case 437: case 438: case 487: case 488: case 537: case 538: case 587: case 588: case 637: case 638: case 687: case 688: case 737: case 738: case 787: case 788: case 837: case 838: case 887: case 888: case 937: case 938: case 987: case 988: case 1037: case 1038: return 19;\n\t\t\t\tcase 253: case 254: case 303: case 304: case 353: case 354: case 403: case 404: case 453: case 454: case 503: case 504: case 553: case 554: case 603: case 604: case 653: case 654: case 703: case 704: case 753: case 754: case 803: case 804: case 853: case 854: case 903: case 904: case 953: case 954: case 1003: case 1004: return 2;\n\t\t\t\tcase 289: case 290: case 339: case 340: case 389: case 390: case 439: case 440: case 489: case 490: case 539: case 540: case 589: case 590: case 639: case 640: case 689: case 690: case 739: case 740: case 789: case 790: case 839: case 840: case 889: case 890: case 939: case 940: case 989: case 990: case 1039: case 1040: return 20;\n\t\t\t\tcase 291: case 292: case 341: case 342: case 391: case 392: case 441: case 442: case 491: case 492: case 541: case 542: case 591: case 592: case 641: case 642: case 691: case 692: case 741: case 742: case 791: case 792: case 841: case 842: case 891: case 892: case 941: case 942: case 991: case 992: case 1041: case 1042: return 21;\n\t\t\t\tcase 293: case 294: case 343: case 344: case 393: case 394: case 443: case 444: case 493: case 494: case 543: case 544: case 593: case 594: case 643: case 644: case 693: case 694: case 743: case 744: case 793: case 794: case 843: case 844: case 893: case 894: case 943: case 944: case 993: case 994: case 1043: case 1044: return 22;\n\t\t\t\tcase 295: case 296: case 345: case 346: case 395: case 396: case 445: case 446: case 495: case 496: case 545: case 546: case 595: case 596: case 645: case 646: case 695: case 696: case 745: case 746: case 795: case 796: case 845: case 846: case 895: case 896: case 945: case 946: case 995: case 996: case 1045: case 1046: return 23;\n\t\t\t\tcase 297: case 298: case 347: case 348: case 397: case 398: case 447: case 448: case 497: case 498: case 547: case 548: case 597: case 598: case 647: case 648: case 697: case 698: case 747: case 748: case 797: case 798: case 847: case 848: case 897: case 898: case 947: case 948: case 997: case 998: case 1047: case 1048: return 24;\n\t\t\t\tcase 255: case 256: case 305: case 306: case 355: case 356: case 405: case 406: case 455: case 456: case 505: case 506: case 555: case 556: case 605: case 606: case 655: case 656: case 705: case 706: case 755: case 756: case 805: case 806: case 855: case 856: case 905: case 906: case 955: case 956: case 1005: case 1006: return 3;\n\t\t\t\tcase 257: case 258: case 307: case 308: case 357: case 358: case 407: case 408: case 457: case 458: case 507: case 508: case 557: case 558: case 607: case 608: case 657: case 658: case 707: case 708: case 757: case 758: case 807: case 808: case 857: case 858: case 907: case 908: case 957: case 958: case 1007: case 1008: return 4;\n\t\t\t\tcase 259: case 260: case 309: case 310: case 359: case 360: case 409: case 410: case 459: case 460: case 509: case 510: case 559: case 560: case 609: case 610: case 659: case 660: case 709: case 710: case 759: case 760: case 809: case 810: case 859: case 860: case 909: case 910: case 959: case 960: case 1009: case 1010: return 5;\n\t\t\t\tcase 261: case 262: case 311: case 312: case 361: case 362: case 411: case 412: case 461: case 462: case 511: case 512: case 561: case 562: case 611: case 612: case 661: case 662: case 711: case 712: case 761: case 762: case 811: case 812: case 861: case 862: case 911: case 912: case 961: case 962: case 1011: case 1012: return 6;\n\t\t\t\tcase 263: case 264: case 313: case 314: case 363: case 364: case 413: case 414: case 463: case 464: case 513: case 514: case 563: case 564: case 613: case 614: case 663: case 664: case 713: case 714: case 763: case 764: case 813: case 814: case 863: case 864: case 913: case 914: case 963: case 964: case 1013: case 1014: return 7;\n\t\t\t\tcase 265: case 266: case 315: case 316: case 365: case 366: case 415: case 416: case 465: case 466: case 515: case 516: case 565: case 566: case 615: case 616: case 665: case 666: case 715: case 716: case 765: case 766: case 815: case 816: case 865: case 866: case 915: case 916: case 965: case 966: case 1015: case 1016: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 250: case 252: case 254: case 256: case 258: case 260: case 262: case 264: case 266: case 268: case 270: case 272: case 274: case 276: case 278: case 280: case 282: case 284: case 286: case 288: case 290: case 292: case 294: case 296: case 298: case 300: case 302: case 304: case 306: case 308: case 310: case 312: case 314: case 316: case 318: case 320: case 322: case 324: case 326: case 328: case 330: case 332: case 334: case 336: case 338: case 340: case 342: case 344: case 346: case 348: case 350: case 352: case 354: case 356: case 358: case 360: case 362: case 364: case 366: case 368: case 370: case 372: case 374: case 376: case 378: case 380: case 382: case 384: case 386: case 388: case 390: case 392: case 394: case 396: case 398: case 400: case 402: case 404: case 406: case 408: case 410: case 412: case 414: case 416: case 418: case 420: case 422: case 424: case 426: case 428: case 430: case 432: case 434: case 436: case 438: case 440: case 442: case 444: case 446: case 448: case 450: case 452: case 454: case 456: case 458: case 460: case 462: case 464: case 466: case 468: case 470: case 472: case 474: case 476: case 478: case 480: case 482: case 484: case 486: case 488: case 490: case 492: case 494: case 496: case 498: case 500: case 502: case 504: case 506: case 508: case 510: case 512: case 514: case 516: case 518: case 520: case 522: case 524: case 526: case 528: case 530: case 532: case 534: case 536: case 538: case 540: case 542: case 544: case 546: case 548: case 550: case 552: case 554: case 556: case 558: case 560: case 562: case 564: case 566: case 568: case 570: case 572: case 574: case 576: case 578: case 580: case 582: case 584: case 586: case 588: case 590: case 592: case 594: case 596: case 598: case 600: case 602: case 604: case 606: case 608: case 610: case 612: case 614: case 616: case 618: case 620: case 622: case 624: case 626: case 628: case 630: case 632: case 634: case 636: case 638: case 640: case 642: case 644: case 646: case 648: case 650: case 652: case 654: case 656: case 658: case 660: case 662: case 664: case 666: case 668: case 670: case 672: case 674: case 676: case 678: case 680: case 682: case 684: case 686: case 688: case 690: case 692: case 694: case 696: case 698: case 700: case 702: case 704: case 706: case 708: case 710: case 712: case 714: case 716: case 718: case 720: case 722: case 724: case 726: case 728: case 730: case 732: case 734: case 736: case 738: case 740: case 742: case 744: case 746: case 748: case 750: case 752: case 754: case 756: case 758: case 760: case 762: case 764: case 766: case 768: case 770: case 772: case 774: case 776: case 778: case 780: case 782: case 784: case 786: case 788: case 790: case 792: case 794: case 796: case 798: case 800: case 802: case 804: case 806: case 808: case 810: case 812: case 814: case 816: case 818: case 820: case 822: case 824: case 826: case 828: case 830: case 832: case 834: case 836: case 838: case 840: case 842: case 844: case 846: case 848: case 850: case 852: case 854: case 856: case 858: case 860: case 862: case 864: case 866: case 868: case 870: case 872: case 874: case 876: case 878: case 880: case 882: case 884: case 886: case 888: case 890: case 892: case 894: case 896: case 898: case 900: case 902: case 904: case 906: case 908: case 910: case 912: case 914: case 916: case 918: case 920: case 922: case 924: case 926: case 928: case 930: case 932: case 934: case 936: case 938: case 940: case 942: case 944: case 946: case 948: case 950: case 952: case 954: case 956: case 958: case 960: case 962: case 964: case 966: case 968: case 970: case 972: case 974: case 976: case 978: case 980: case 982: case 984: case 986: case 988: case 990: case 992: case 994: case 996: case 998: case 1000: case 1002: case 1004: case 1006: case 1008: case 1010: case 1012: case 1014: case 1016: case 1018: case 1020: case 1022: case 1024: case 1026: case 1028: case 1030: case 1032: case 1034: case 1036: case 1038: case 1040: case 1042: case 1044: case 1046: case 1048: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakButton\n\t{\n\t\tBlockState OakButton()\n\t\t{\n\t\t\treturn 6355;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6362: case 6363: case 6364: case 6365: case 6366: case 6367: case 6368: case 6369: return Face::Ceiling;\n\t\t\t\tcase 6346: case 6347: case 6348: case 6349: case 6350: case 6351: case 6352: case 6353: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6350: case 6351: case 6358: case 6359: case 6366: case 6367: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6352: case 6353: case 6360: case 6361: case 6368: case 6369: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6346: case 6347: case 6354: case 6355: case 6362: case 6363: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6347: case 6349: case 6351: case 6353: case 6355: case 6357: case 6359: case 6361: case 6363: case 6365: case 6367: case 6369: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakDoor\n\t{\n\t\tBlockState OakDoor()\n\t\t{\n\t\t\treturn 3584;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3605: case 3606: case 3607: case 3608: case 3609: case 3610: case 3611: case 3612: case 3613: case 3614: case 3615: case 3616: case 3617: case 3618: case 3619: case 3620: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3621: case 3622: case 3623: case 3624: case 3625: case 3626: case 3627: case 3628: case 3629: case 3630: case 3631: case 3632: case 3633: case 3634: case 3635: case 3636: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3573: case 3574: case 3575: case 3576: case 3577: case 3578: case 3579: case 3580: case 3581: case 3582: case 3583: case 3584: case 3585: case 3586: case 3587: case 3588: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3581: case 3582: case 3583: case 3584: case 3585: case 3586: case 3587: case 3588: case 3597: case 3598: case 3599: case 3600: case 3601: case 3602: case 3603: case 3604: case 3613: case 3614: case 3615: case 3616: case 3617: case 3618: case 3619: case 3620: case 3629: case 3630: case 3631: case 3632: case 3633: case 3634: case 3635: case 3636: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3573: case 3574: case 3575: case 3576: case 3581: case 3582: case 3583: case 3584: case 3589: case 3590: case 3591: case 3592: case 3597: case 3598: case 3599: case 3600: case 3605: case 3606: case 3607: case 3608: case 3613: case 3614: case 3615: case 3616: case 3621: case 3622: case 3623: case 3624: case 3629: case 3630: case 3631: case 3632: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3575: case 3576: case 3579: case 3580: case 3583: case 3584: case 3587: case 3588: case 3591: case 3592: case 3595: case 3596: case 3599: case 3600: case 3603: case 3604: case 3607: case 3608: case 3611: case 3612: case 3615: case 3616: case 3619: case 3620: case 3623: case 3624: case 3627: case 3628: case 3631: case 3632: case 3635: case 3636: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3574: case 3576: case 3578: case 3580: case 3582: case 3584: case 3586: case 3588: case 3590: case 3592: case 3594: case 3596: case 3598: case 3600: case 3602: case 3604: case 3606: case 3608: case 3610: case 3612: case 3614: case 3616: case 3618: case 3620: case 3622: case 3624: case 3626: case 3628: case 3630: case 3632: case 3634: case 3636: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakFence\n\t{\n\t\tBlockState OakFence()\n\t\t{\n\t\t\treturn 3997;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3984: case 3985: case 3988: case 3989: case 3992: case 3993: case 3996: case 3997: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3976: case 3977: case 3980: case 3981: case 3992: case 3993: case 3996: case 3997: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3972: case 3973: case 3980: case 3981: case 3988: case 3989: case 3996: case 3997: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3969: case 3973: case 3977: case 3981: case 3985: case 3989: case 3993: case 3997: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakFenceGate\n\t{\n\t\tBlockState OakFenceGate()\n\t\t{\n\t\t\treturn 4827;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4836: case 4837: case 4838: case 4839: case 4840: case 4841: case 4842: case 4843: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4844: case 4845: case 4846: case 4847: case 4848: case 4849: case 4850: case 4851: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4820: case 4821: case 4822: case 4823: case 4824: case 4825: case 4826: case 4827: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool InWall(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4824: case 4825: case 4826: case 4827: case 4832: case 4833: case 4834: case 4835: case 4840: case 4841: case 4842: case 4843: case 4848: case 4849: case 4850: case 4851: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4822: case 4823: case 4826: case 4827: case 4830: case 4831: case 4834: case 4835: case 4838: case 4839: case 4842: case 4843: case 4846: case 4847: case 4850: case 4851: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4821: case 4823: case 4825: case 4827: case 4829: case 4831: case 4833: case 4835: case 4837: case 4839: case 4841: case 4843: case 4845: case 4847: case 4849: case 4851: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakLeaves\n\t{\n\t\tBlockState OakLeaves()\n\t\t{\n\t\t\treturn 158;\n\t\t}\n\t\tunsigned char Distance(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 145: case 146: return 1;\n\t\t\t\tcase 147: case 148: return 2;\n\t\t\t\tcase 149: case 150: return 3;\n\t\t\t\tcase 151: case 152: return 4;\n\t\t\t\tcase 153: case 154: return 5;\n\t\t\t\tcase 155: case 156: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t\tbool Persistent(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 146: case 148: case 150: case 152: case 154: case 156: case 158: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakLog\n\t{\n\t\tBlockState OakLog()\n\t\t{\n\t\t\treturn 74;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 73: return Axis::X;\n\t\t\t\tcase 74: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakPlanks\n\t{\n\t}\n\tnamespace OakPressurePlate\n\t{\n\t\tBlockState OakPressurePlate()\n\t\t{\n\t\t\treturn 3874;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3874: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakSapling\n\t{\n\t\tBlockState OakSapling()\n\t\t{\n\t\t\treturn 21;\n\t\t}\n\t\tunsigned char Stage(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 21: return 0;\n\t\t\t\tdefault: return 1;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakSign\n\t{\n\t\tBlockState OakSign()\n\t\t{\n\t\t\treturn 3382;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3382: return 0;\n\t\t\t\tcase 3384: return 1;\n\t\t\t\tcase 3402: return 10;\n\t\t\t\tcase 3404: return 11;\n\t\t\t\tcase 3406: return 12;\n\t\t\t\tcase 3408: return 13;\n\t\t\t\tcase 3410: return 14;\n\t\t\t\tcase 3412: return 15;\n\t\t\t\tcase 3386: return 2;\n\t\t\t\tcase 3388: return 3;\n\t\t\t\tcase 3390: return 4;\n\t\t\t\tcase 3392: return 5;\n\t\t\t\tcase 3394: return 6;\n\t\t\t\tcase 3396: return 7;\n\t\t\t\tcase 3398: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakSlab\n\t{\n\t\tBlockState OakSlab()\n\t\t{\n\t\t\treturn 8303;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8303: return Type::Bottom;\n\t\t\t\tcase 8305: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakStairs\n\t{\n\t\tBlockState OakStairs()\n\t\t{\n\t\t\treturn 1965;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1995: case 1997: case 1999: case 2001: case 2003: case 2005: case 2007: case 2009: case 2011: case 2013: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 2015: case 2017: case 2019: case 2021: case 2023: case 2025: case 2027: case 2029: case 2031: case 2033: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1955: case 1957: case 1959: case 1961: case 1963: case 1965: case 1967: case 1969: case 1971: case 1973: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1965: case 1967: case 1969: case 1971: case 1973: case 1985: case 1987: case 1989: case 1991: case 1993: case 2005: case 2007: case 2009: case 2011: case 2013: case 2025: case 2027: case 2029: case 2031: case 2033: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1957: case 1967: case 1977: case 1987: case 1997: case 2007: case 2017: case 2027: return Shape::InnerLeft;\n\t\t\t\tcase 1959: case 1969: case 1979: case 1989: case 1999: case 2009: case 2019: case 2029: return Shape::InnerRight;\n\t\t\t\tcase 1961: case 1971: case 1981: case 1991: case 2001: case 2011: case 2021: case 2031: return Shape::OuterLeft;\n\t\t\t\tcase 1963: case 1973: case 1983: case 1993: case 2003: case 2013: case 2023: case 2033: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakTrapdoor\n\t{\n\t\tBlockState OakTrapdoor()\n\t\t{\n\t\t\treturn 4126;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4144: case 4146: case 4148: case 4150: case 4152: case 4154: case 4156: case 4158: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4160: case 4162: case 4164: case 4166: case 4168: case 4170: case 4172: case 4174: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4112: case 4114: case 4116: case 4118: case 4120: case 4122: case 4124: case 4126: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4120: case 4122: case 4124: case 4126: case 4136: case 4138: case 4140: case 4142: case 4152: case 4154: case 4156: case 4158: case 4168: case 4170: case 4172: case 4174: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4116: case 4118: case 4124: case 4126: case 4132: case 4134: case 4140: case 4142: case 4148: case 4150: case 4156: case 4158: case 4164: case 4166: case 4172: case 4174: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4114: case 4118: case 4122: case 4126: case 4130: case 4134: case 4138: case 4142: case 4146: case 4150: case 4154: case 4158: case 4162: case 4166: case 4170: case 4174: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakWallSign\n\t{\n\t\tBlockState OakWallSign()\n\t\t{\n\t\t\treturn 3736;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3740: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3742: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3736: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OakWood\n\t{\n\t\tBlockState OakWood()\n\t\t{\n\t\t\treturn 110;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 109: return Axis::X;\n\t\t\t\tcase 110: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Observer\n\t{\n\t\tBlockState Observer()\n\t\t{\n\t\t\treturn 9265;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9266: case 9267: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9262: case 9263: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9270: case 9271: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9268: case 9269: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9260: case 9261: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9261: case 9263: case 9265: case 9267: case 9269: case 9271: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Obsidian\n\t{\n\t}\n\tnamespace OrangeBanner\n\t{\n\t\tBlockState OrangeBanner()\n\t\t{\n\t\t\treturn 7913;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7913: return 0;\n\t\t\t\tcase 7914: return 1;\n\t\t\t\tcase 7923: return 10;\n\t\t\t\tcase 7924: return 11;\n\t\t\t\tcase 7925: return 12;\n\t\t\t\tcase 7926: return 13;\n\t\t\t\tcase 7927: return 14;\n\t\t\t\tcase 7928: return 15;\n\t\t\t\tcase 7915: return 2;\n\t\t\t\tcase 7916: return 3;\n\t\t\t\tcase 7917: return 4;\n\t\t\t\tcase 7918: return 5;\n\t\t\t\tcase 7919: return 6;\n\t\t\t\tcase 7920: return 7;\n\t\t\t\tcase 7921: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OrangeBed\n\t{\n\t\tBlockState OrangeBed()\n\t\t{\n\t\t\treturn 1068;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1073: case 1074: case 1075: case 1076: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1077: case 1078: case 1079: case 1080: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1065: case 1066: case 1067: case 1068: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1067: case 1068: case 1071: case 1072: case 1075: case 1076: case 1079: case 1080: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1066: case 1068: case 1070: case 1072: case 1074: case 1076: case 1078: case 1080: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OrangeCarpet\n\t{\n\t}\n\tnamespace OrangeConcrete\n\t{\n\t}\n\tnamespace OrangeConcretePowder\n\t{\n\t}\n\tnamespace OrangeGlazedTerracotta\n\t{\n\t\tBlockState OrangeGlazedTerracotta()\n\t\t{\n\t\t\treturn 9378;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9380: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9381: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9378: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OrangeShulkerBox\n\t{\n\t\tBlockState OrangeShulkerBox()\n\t\t{\n\t\t\treturn 9288;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9287: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9285: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9289: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9288: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9284: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OrangeStainedGlass\n\t{\n\t}\n\tnamespace OrangeStainedGlassPane\n\t{\n\t\tBlockState OrangeStainedGlassPane()\n\t\t{\n\t\t\treturn 6926;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6913: case 6914: case 6917: case 6918: case 6921: case 6922: case 6925: case 6926: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6905: case 6906: case 6909: case 6910: case 6921: case 6922: case 6925: case 6926: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6901: case 6902: case 6909: case 6910: case 6917: case 6918: case 6925: case 6926: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6898: case 6902: case 6906: case 6910: case 6914: case 6918: case 6922: case 6926: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OrangeTerracotta\n\t{\n\t}\n\tnamespace OrangeTulip\n\t{\n\t}\n\tnamespace OrangeWallBanner\n\t{\n\t\tBlockState OrangeWallBanner()\n\t\t{\n\t\t\treturn 8157;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8159: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8160: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8157: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace OrangeWool\n\t{\n\t}\n\tnamespace OxeyeDaisy\n\t{\n\t}\n\tnamespace PackedIce\n\t{\n\t}\n\tnamespace Peony\n\t{\n\t\tBlockState Peony()\n\t\t{\n\t\t\treturn 7892;\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7892: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PetrifiedOakSlab\n\t{\n\t\tBlockState PetrifiedOakSlab()\n\t\t{\n\t\t\treturn 8363;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8363: return Type::Bottom;\n\t\t\t\tcase 8365: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PinkBanner\n\t{\n\t\tBlockState PinkBanner()\n\t\t{\n\t\t\treturn 7993;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7993: return 0;\n\t\t\t\tcase 7994: return 1;\n\t\t\t\tcase 8003: return 10;\n\t\t\t\tcase 8004: return 11;\n\t\t\t\tcase 8005: return 12;\n\t\t\t\tcase 8006: return 13;\n\t\t\t\tcase 8007: return 14;\n\t\t\t\tcase 8008: return 15;\n\t\t\t\tcase 7995: return 2;\n\t\t\t\tcase 7996: return 3;\n\t\t\t\tcase 7997: return 4;\n\t\t\t\tcase 7998: return 5;\n\t\t\t\tcase 7999: return 6;\n\t\t\t\tcase 8000: return 7;\n\t\t\t\tcase 8001: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PinkBed\n\t{\n\t\tBlockState PinkBed()\n\t\t{\n\t\t\treturn 1148;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1153: case 1154: case 1155: case 1156: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1157: case 1158: case 1159: case 1160: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1145: case 1146: case 1147: case 1148: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1147: case 1148: case 1151: case 1152: case 1155: case 1156: case 1159: case 1160: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1146: case 1148: case 1150: case 1152: case 1154: case 1156: case 1158: case 1160: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PinkCarpet\n\t{\n\t}\n\tnamespace PinkConcrete\n\t{\n\t}\n\tnamespace PinkConcretePowder\n\t{\n\t}\n\tnamespace PinkGlazedTerracotta\n\t{\n\t\tBlockState PinkGlazedTerracotta()\n\t\t{\n\t\t\treturn 9398;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9400: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9401: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9398: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PinkShulkerBox\n\t{\n\t\tBlockState PinkShulkerBox()\n\t\t{\n\t\t\treturn 9318;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9317: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9315: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9319: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9318: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9314: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PinkStainedGlass\n\t{\n\t}\n\tnamespace PinkStainedGlassPane\n\t{\n\t\tBlockState PinkStainedGlassPane()\n\t\t{\n\t\t\treturn 7086;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7073: case 7074: case 7077: case 7078: case 7081: case 7082: case 7085: case 7086: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7065: case 7066: case 7069: case 7070: case 7081: case 7082: case 7085: case 7086: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7061: case 7062: case 7069: case 7070: case 7077: case 7078: case 7085: case 7086: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7058: case 7062: case 7066: case 7070: case 7074: case 7078: case 7082: case 7086: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PinkTerracotta\n\t{\n\t}\n\tnamespace PinkTulip\n\t{\n\t}\n\tnamespace PinkWallBanner\n\t{\n\t\tBlockState PinkWallBanner()\n\t\t{\n\t\t\treturn 8177;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8179: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8180: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8177: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PinkWool\n\t{\n\t}\n\tnamespace Piston\n\t{\n\t\tBlockState Piston()\n\t\t{\n\t\t\treturn 1354;\n\t\t}\n\t\tbool Extended(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1354: case 1355: case 1356: case 1357: case 1358: case 1359: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1351: case 1357: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1349: case 1355: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1353: case 1359: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 1352: case 1358: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 1348: case 1354: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PistonHead\n\t{\n\t\tBlockState PistonHead()\n\t\t{\n\t\t\treturn 1362;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1372: case 1373: case 1374: case 1375: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1364: case 1365: case 1366: case 1367: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1380: case 1381: case 1382: case 1383: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 1376: case 1377: case 1378: case 1379: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 1360: case 1361: case 1362: case 1363: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Short(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1362: case 1363: case 1366: case 1367: case 1370: case 1371: case 1374: case 1375: case 1378: case 1379: case 1382: case 1383: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1360: case 1362: case 1364: case 1366: case 1368: case 1370: case 1372: case 1374: case 1376: case 1378: case 1380: case 1382: return Type::Normal;\n\t\t\t\tdefault: return Type::Sticky;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PlayerHead\n\t{\n\t\tBlockState PlayerHead()\n\t\t{\n\t\t\treturn 6550;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6550: return 0;\n\t\t\t\tcase 6551: return 1;\n\t\t\t\tcase 6560: return 10;\n\t\t\t\tcase 6561: return 11;\n\t\t\t\tcase 6562: return 12;\n\t\t\t\tcase 6563: return 13;\n\t\t\t\tcase 6564: return 14;\n\t\t\t\tcase 6565: return 15;\n\t\t\t\tcase 6552: return 2;\n\t\t\t\tcase 6553: return 3;\n\t\t\t\tcase 6554: return 4;\n\t\t\t\tcase 6555: return 5;\n\t\t\t\tcase 6556: return 6;\n\t\t\t\tcase 6557: return 7;\n\t\t\t\tcase 6558: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PlayerWallHead\n\t{\n\t\tBlockState PlayerWallHead()\n\t\t{\n\t\t\treturn 6566;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6568: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6569: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6566: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Podzol\n\t{\n\t\tBlockState Podzol()\n\t\t{\n\t\t\treturn 13;\n\t\t}\n\t\tbool Snowy(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedAndesite\n\t{\n\t}\n\tnamespace PolishedAndesiteSlab\n\t{\n\t\tBlockState PolishedAndesiteSlab()\n\t\t{\n\t\t\treturn 10858;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10858: return Type::Bottom;\n\t\t\t\tcase 10860: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedAndesiteStairs\n\t{\n\t\tBlockState PolishedAndesiteStairs()\n\t\t{\n\t\t\treturn 10640;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10670: case 10672: case 10674: case 10676: case 10678: case 10680: case 10682: case 10684: case 10686: case 10688: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10690: case 10692: case 10694: case 10696: case 10698: case 10700: case 10702: case 10704: case 10706: case 10708: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10630: case 10632: case 10634: case 10636: case 10638: case 10640: case 10642: case 10644: case 10646: case 10648: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10640: case 10642: case 10644: case 10646: case 10648: case 10660: case 10662: case 10664: case 10666: case 10668: case 10680: case 10682: case 10684: case 10686: case 10688: case 10700: case 10702: case 10704: case 10706: case 10708: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10632: case 10642: case 10652: case 10662: case 10672: case 10682: case 10692: case 10702: return Shape::InnerLeft;\n\t\t\t\tcase 10634: case 10644: case 10654: case 10664: case 10674: case 10684: case 10694: case 10704: return Shape::InnerRight;\n\t\t\t\tcase 10636: case 10646: case 10656: case 10666: case 10676: case 10686: case 10696: case 10706: return Shape::OuterLeft;\n\t\t\t\tcase 10638: case 10648: case 10658: case 10668: case 10678: case 10688: case 10698: case 10708: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBasalt\n\t{\n\t\tBlockState PolishedBasalt()\n\t\t{\n\t\t\treturn 4006;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4005: return Axis::X;\n\t\t\t\tcase 4006: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBlackstone\n\t{\n\t}\n\tnamespace PolishedBlackstoneBrickSlab\n\t{\n\t\tBlockState PolishedBlackstoneBrickSlab()\n\t\t{\n\t\t\treturn 16257;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16257: return Type::Bottom;\n\t\t\t\tcase 16259: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBlackstoneBrickStairs\n\t{\n\t\tBlockState PolishedBlackstoneBrickStairs()\n\t\t{\n\t\t\treturn 16271;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16301: case 16303: case 16305: case 16307: case 16309: case 16311: case 16313: case 16315: case 16317: case 16319: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 16321: case 16323: case 16325: case 16327: case 16329: case 16331: case 16333: case 16335: case 16337: case 16339: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 16261: case 16263: case 16265: case 16267: case 16269: case 16271: case 16273: case 16275: case 16277: case 16279: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16271: case 16273: case 16275: case 16277: case 16279: case 16291: case 16293: case 16295: case 16297: case 16299: case 16311: case 16313: case 16315: case 16317: case 16319: case 16331: case 16333: case 16335: case 16337: case 16339: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16263: case 16273: case 16283: case 16293: case 16303: case 16313: case 16323: case 16333: return Shape::InnerLeft;\n\t\t\t\tcase 16265: case 16275: case 16285: case 16295: case 16305: case 16315: case 16325: case 16335: return Shape::InnerRight;\n\t\t\t\tcase 16267: case 16277: case 16287: case 16297: case 16307: case 16317: case 16327: case 16337: return Shape::OuterLeft;\n\t\t\t\tcase 16269: case 16279: case 16289: case 16299: case 16309: case 16319: case 16329: case 16339: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBlackstoneBrickWall\n\t{\n\t\tBlockState PolishedBlackstoneBrickWall()\n\t\t{\n\t\t\treturn 16343;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16451: case 16452: case 16453: case 16457: case 16458: case 16459: case 16463: case 16464: case 16465: case 16469: case 16470: case 16471: case 16475: case 16476: case 16477: case 16481: case 16482: case 16483: case 16487: case 16488: case 16489: case 16493: case 16494: case 16495: case 16499: case 16500: case 16501: case 16505: case 16506: case 16507: case 16511: case 16512: case 16513: case 16517: case 16518: case 16519: case 16523: case 16524: case 16525: case 16529: case 16530: case 16531: case 16535: case 16536: case 16537: case 16541: case 16542: case 16543: case 16547: case 16548: case 16549: case 16553: case 16554: case 16555: return East::Low;\n\t\t\t\tcase 16343: case 16344: case 16345: case 16349: case 16350: case 16351: case 16355: case 16356: case 16357: case 16361: case 16362: case 16363: case 16367: case 16368: case 16369: case 16373: case 16374: case 16375: case 16379: case 16380: case 16381: case 16385: case 16386: case 16387: case 16391: case 16392: case 16393: case 16397: case 16398: case 16399: case 16403: case 16404: case 16405: case 16409: case 16410: case 16411: case 16415: case 16416: case 16417: case 16421: case 16422: case 16423: case 16427: case 16428: case 16429: case 16433: case 16434: case 16435: case 16439: case 16440: case 16441: case 16445: case 16446: case 16447: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16379: case 16380: case 16381: case 16385: case 16386: case 16387: case 16391: case 16392: case 16393: case 16397: case 16398: case 16399: case 16403: case 16404: case 16405: case 16409: case 16410: case 16411: case 16487: case 16488: case 16489: case 16493: case 16494: case 16495: case 16499: case 16500: case 16501: case 16505: case 16506: case 16507: case 16511: case 16512: case 16513: case 16517: case 16518: case 16519: case 16595: case 16596: case 16597: case 16601: case 16602: case 16603: case 16607: case 16608: case 16609: case 16613: case 16614: case 16615: case 16619: case 16620: case 16621: case 16625: case 16626: case 16627: return North::Low;\n\t\t\t\tcase 16343: case 16344: case 16345: case 16349: case 16350: case 16351: case 16355: case 16356: case 16357: case 16361: case 16362: case 16363: case 16367: case 16368: case 16369: case 16373: case 16374: case 16375: case 16451: case 16452: case 16453: case 16457: case 16458: case 16459: case 16463: case 16464: case 16465: case 16469: case 16470: case 16471: case 16475: case 16476: case 16477: case 16481: case 16482: case 16483: case 16559: case 16560: case 16561: case 16565: case 16566: case 16567: case 16571: case 16572: case 16573: case 16577: case 16578: case 16579: case 16583: case 16584: case 16585: case 16589: case 16590: case 16591: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16355: case 16356: case 16357: case 16361: case 16362: case 16363: case 16391: case 16392: case 16393: case 16397: case 16398: case 16399: case 16427: case 16428: case 16429: case 16433: case 16434: case 16435: case 16463: case 16464: case 16465: case 16469: case 16470: case 16471: case 16499: case 16500: case 16501: case 16505: case 16506: case 16507: case 16535: case 16536: case 16537: case 16541: case 16542: case 16543: case 16571: case 16572: case 16573: case 16577: case 16578: case 16579: case 16607: case 16608: case 16609: case 16613: case 16614: case 16615: case 16643: case 16644: case 16645: case 16649: case 16650: case 16651: return South::Low;\n\t\t\t\tcase 16343: case 16344: case 16345: case 16349: case 16350: case 16351: case 16379: case 16380: case 16381: case 16385: case 16386: case 16387: case 16415: case 16416: case 16417: case 16421: case 16422: case 16423: case 16451: case 16452: case 16453: case 16457: case 16458: case 16459: case 16487: case 16488: case 16489: case 16493: case 16494: case 16495: case 16523: case 16524: case 16525: case 16529: case 16530: case 16531: case 16559: case 16560: case 16561: case 16565: case 16566: case 16567: case 16595: case 16596: case 16597: case 16601: case 16602: case 16603: case 16631: case 16632: case 16633: case 16637: case 16638: case 16639: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16349: case 16350: case 16351: case 16361: case 16362: case 16363: case 16373: case 16374: case 16375: case 16385: case 16386: case 16387: case 16397: case 16398: case 16399: case 16409: case 16410: case 16411: case 16421: case 16422: case 16423: case 16433: case 16434: case 16435: case 16445: case 16446: case 16447: case 16457: case 16458: case 16459: case 16469: case 16470: case 16471: case 16481: case 16482: case 16483: case 16493: case 16494: case 16495: case 16505: case 16506: case 16507: case 16517: case 16518: case 16519: case 16529: case 16530: case 16531: case 16541: case 16542: case 16543: case 16553: case 16554: case 16555: case 16565: case 16566: case 16567: case 16577: case 16578: case 16579: case 16589: case 16590: case 16591: case 16601: case 16602: case 16603: case 16613: case 16614: case 16615: case 16625: case 16626: case 16627: case 16637: case 16638: case 16639: case 16649: case 16650: case 16651: case 16661: case 16662: case 16663: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16344: case 16350: case 16356: case 16362: case 16368: case 16374: case 16380: case 16386: case 16392: case 16398: case 16404: case 16410: case 16416: case 16422: case 16428: case 16434: case 16440: case 16446: case 16452: case 16458: case 16464: case 16470: case 16476: case 16482: case 16488: case 16494: case 16500: case 16506: case 16512: case 16518: case 16524: case 16530: case 16536: case 16542: case 16548: case 16554: case 16560: case 16566: case 16572: case 16578: case 16584: case 16590: case 16596: case 16602: case 16608: case 16614: case 16620: case 16626: case 16632: case 16638: case 16644: case 16650: case 16656: case 16662: return West::Low;\n\t\t\t\tcase 16343: case 16349: case 16355: case 16361: case 16367: case 16373: case 16379: case 16385: case 16391: case 16397: case 16403: case 16409: case 16415: case 16421: case 16427: case 16433: case 16439: case 16445: case 16451: case 16457: case 16463: case 16469: case 16475: case 16481: case 16487: case 16493: case 16499: case 16505: case 16511: case 16517: case 16523: case 16529: case 16535: case 16541: case 16547: case 16553: case 16559: case 16565: case 16571: case 16577: case 16583: case 16589: case 16595: case 16601: case 16607: case 16613: case 16619: case 16625: case 16631: case 16637: case 16643: case 16649: case 16655: case 16661: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBlackstoneBricks\n\t{\n\t}\n\tnamespace PolishedBlackstoneButton\n\t{\n\t\tBlockState PolishedBlackstoneButton()\n\t\t{\n\t\t\treturn 16762;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16769: case 16770: case 16771: case 16772: case 16773: case 16774: case 16775: case 16776: return Face::Ceiling;\n\t\t\t\tcase 16753: case 16754: case 16755: case 16756: case 16757: case 16758: case 16759: case 16760: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16757: case 16758: case 16765: case 16766: case 16773: case 16774: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 16759: case 16760: case 16767: case 16768: case 16775: case 16776: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 16753: case 16754: case 16761: case 16762: case 16769: case 16770: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16754: case 16756: case 16758: case 16760: case 16762: case 16764: case 16766: case 16768: case 16770: case 16772: case 16774: case 16776: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBlackstonePressurePlate\n\t{\n\t\tBlockState PolishedBlackstonePressurePlate()\n\t\t{\n\t\t\treturn 16752;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16752: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBlackstoneSlab\n\t{\n\t\tBlockState PolishedBlackstoneSlab()\n\t\t{\n\t\t\treturn 16748;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16748: return Type::Bottom;\n\t\t\t\tcase 16750: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBlackstoneStairs\n\t{\n\t\tBlockState PolishedBlackstoneStairs()\n\t\t{\n\t\t\treturn 16676;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16706: case 16708: case 16710: case 16712: case 16714: case 16716: case 16718: case 16720: case 16722: case 16724: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 16726: case 16728: case 16730: case 16732: case 16734: case 16736: case 16738: case 16740: case 16742: case 16744: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 16666: case 16668: case 16670: case 16672: case 16674: case 16676: case 16678: case 16680: case 16682: case 16684: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16676: case 16678: case 16680: case 16682: case 16684: case 16696: case 16698: case 16700: case 16702: case 16704: case 16716: case 16718: case 16720: case 16722: case 16724: case 16736: case 16738: case 16740: case 16742: case 16744: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16668: case 16678: case 16688: case 16698: case 16708: case 16718: case 16728: case 16738: return Shape::InnerLeft;\n\t\t\t\tcase 16670: case 16680: case 16690: case 16700: case 16710: case 16720: case 16730: case 16740: return Shape::InnerRight;\n\t\t\t\tcase 16672: case 16682: case 16692: case 16702: case 16712: case 16722: case 16732: case 16742: return Shape::OuterLeft;\n\t\t\t\tcase 16674: case 16684: case 16694: case 16704: case 16714: case 16724: case 16734: case 16744: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedBlackstoneWall\n\t{\n\t\tBlockState PolishedBlackstoneWall()\n\t\t{\n\t\t\treturn 16780;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16888: case 16889: case 16890: case 16894: case 16895: case 16896: case 16900: case 16901: case 16902: case 16906: case 16907: case 16908: case 16912: case 16913: case 16914: case 16918: case 16919: case 16920: case 16924: case 16925: case 16926: case 16930: case 16931: case 16932: case 16936: case 16937: case 16938: case 16942: case 16943: case 16944: case 16948: case 16949: case 16950: case 16954: case 16955: case 16956: case 16960: case 16961: case 16962: case 16966: case 16967: case 16968: case 16972: case 16973: case 16974: case 16978: case 16979: case 16980: case 16984: case 16985: case 16986: case 16990: case 16991: case 16992: return East::Low;\n\t\t\t\tcase 16780: case 16781: case 16782: case 16786: case 16787: case 16788: case 16792: case 16793: case 16794: case 16798: case 16799: case 16800: case 16804: case 16805: case 16806: case 16810: case 16811: case 16812: case 16816: case 16817: case 16818: case 16822: case 16823: case 16824: case 16828: case 16829: case 16830: case 16834: case 16835: case 16836: case 16840: case 16841: case 16842: case 16846: case 16847: case 16848: case 16852: case 16853: case 16854: case 16858: case 16859: case 16860: case 16864: case 16865: case 16866: case 16870: case 16871: case 16872: case 16876: case 16877: case 16878: case 16882: case 16883: case 16884: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16816: case 16817: case 16818: case 16822: case 16823: case 16824: case 16828: case 16829: case 16830: case 16834: case 16835: case 16836: case 16840: case 16841: case 16842: case 16846: case 16847: case 16848: case 16924: case 16925: case 16926: case 16930: case 16931: case 16932: case 16936: case 16937: case 16938: case 16942: case 16943: case 16944: case 16948: case 16949: case 16950: case 16954: case 16955: case 16956: case 17032: case 17033: case 17034: case 17038: case 17039: case 17040: case 17044: case 17045: case 17046: case 17050: case 17051: case 17052: case 17056: case 17057: case 17058: case 17062: case 17063: case 17064: return North::Low;\n\t\t\t\tcase 16780: case 16781: case 16782: case 16786: case 16787: case 16788: case 16792: case 16793: case 16794: case 16798: case 16799: case 16800: case 16804: case 16805: case 16806: case 16810: case 16811: case 16812: case 16888: case 16889: case 16890: case 16894: case 16895: case 16896: case 16900: case 16901: case 16902: case 16906: case 16907: case 16908: case 16912: case 16913: case 16914: case 16918: case 16919: case 16920: case 16996: case 16997: case 16998: case 17002: case 17003: case 17004: case 17008: case 17009: case 17010: case 17014: case 17015: case 17016: case 17020: case 17021: case 17022: case 17026: case 17027: case 17028: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16792: case 16793: case 16794: case 16798: case 16799: case 16800: case 16828: case 16829: case 16830: case 16834: case 16835: case 16836: case 16864: case 16865: case 16866: case 16870: case 16871: case 16872: case 16900: case 16901: case 16902: case 16906: case 16907: case 16908: case 16936: case 16937: case 16938: case 16942: case 16943: case 16944: case 16972: case 16973: case 16974: case 16978: case 16979: case 16980: case 17008: case 17009: case 17010: case 17014: case 17015: case 17016: case 17044: case 17045: case 17046: case 17050: case 17051: case 17052: case 17080: case 17081: case 17082: case 17086: case 17087: case 17088: return South::Low;\n\t\t\t\tcase 16780: case 16781: case 16782: case 16786: case 16787: case 16788: case 16816: case 16817: case 16818: case 16822: case 16823: case 16824: case 16852: case 16853: case 16854: case 16858: case 16859: case 16860: case 16888: case 16889: case 16890: case 16894: case 16895: case 16896: case 16924: case 16925: case 16926: case 16930: case 16931: case 16932: case 16960: case 16961: case 16962: case 16966: case 16967: case 16968: case 16996: case 16997: case 16998: case 17002: case 17003: case 17004: case 17032: case 17033: case 17034: case 17038: case 17039: case 17040: case 17068: case 17069: case 17070: case 17074: case 17075: case 17076: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16786: case 16787: case 16788: case 16798: case 16799: case 16800: case 16810: case 16811: case 16812: case 16822: case 16823: case 16824: case 16834: case 16835: case 16836: case 16846: case 16847: case 16848: case 16858: case 16859: case 16860: case 16870: case 16871: case 16872: case 16882: case 16883: case 16884: case 16894: case 16895: case 16896: case 16906: case 16907: case 16908: case 16918: case 16919: case 16920: case 16930: case 16931: case 16932: case 16942: case 16943: case 16944: case 16954: case 16955: case 16956: case 16966: case 16967: case 16968: case 16978: case 16979: case 16980: case 16990: case 16991: case 16992: case 17002: case 17003: case 17004: case 17014: case 17015: case 17016: case 17026: case 17027: case 17028: case 17038: case 17039: case 17040: case 17050: case 17051: case 17052: case 17062: case 17063: case 17064: case 17074: case 17075: case 17076: case 17086: case 17087: case 17088: case 17098: case 17099: case 17100: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 16781: case 16787: case 16793: case 16799: case 16805: case 16811: case 16817: case 16823: case 16829: case 16835: case 16841: case 16847: case 16853: case 16859: case 16865: case 16871: case 16877: case 16883: case 16889: case 16895: case 16901: case 16907: case 16913: case 16919: case 16925: case 16931: case 16937: case 16943: case 16949: case 16955: case 16961: case 16967: case 16973: case 16979: case 16985: case 16991: case 16997: case 17003: case 17009: case 17015: case 17021: case 17027: case 17033: case 17039: case 17045: case 17051: case 17057: case 17063: case 17069: case 17075: case 17081: case 17087: case 17093: case 17099: return West::Low;\n\t\t\t\tcase 16780: case 16786: case 16792: case 16798: case 16804: case 16810: case 16816: case 16822: case 16828: case 16834: case 16840: case 16846: case 16852: case 16858: case 16864: case 16870: case 16876: case 16882: case 16888: case 16894: case 16900: case 16906: case 16912: case 16918: case 16924: case 16930: case 16936: case 16942: case 16948: case 16954: case 16960: case 16966: case 16972: case 16978: case 16984: case 16990: case 16996: case 17002: case 17008: case 17014: case 17020: case 17026: case 17032: case 17038: case 17044: case 17050: case 17056: case 17062: case 17068: case 17074: case 17080: case 17086: case 17092: case 17098: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedDiorite\n\t{\n\t}\n\tnamespace PolishedDioriteSlab\n\t{\n\t\tBlockState PolishedDioriteSlab()\n\t\t{\n\t\t\treturn 10810;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10810: return Type::Bottom;\n\t\t\t\tcase 10812: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedDioriteStairs\n\t{\n\t\tBlockState PolishedDioriteStairs()\n\t\t{\n\t\t\treturn 9920;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9950: case 9952: case 9954: case 9956: case 9958: case 9960: case 9962: case 9964: case 9966: case 9968: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9970: case 9972: case 9974: case 9976: case 9978: case 9980: case 9982: case 9984: case 9986: case 9988: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9910: case 9912: case 9914: case 9916: case 9918: case 9920: case 9922: case 9924: case 9926: case 9928: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9920: case 9922: case 9924: case 9926: case 9928: case 9940: case 9942: case 9944: case 9946: case 9948: case 9960: case 9962: case 9964: case 9966: case 9968: case 9980: case 9982: case 9984: case 9986: case 9988: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9912: case 9922: case 9932: case 9942: case 9952: case 9962: case 9972: case 9982: return Shape::InnerLeft;\n\t\t\t\tcase 9914: case 9924: case 9934: case 9944: case 9954: case 9964: case 9974: case 9984: return Shape::InnerRight;\n\t\t\t\tcase 9916: case 9926: case 9936: case 9946: case 9956: case 9966: case 9976: case 9986: return Shape::OuterLeft;\n\t\t\t\tcase 9918: case 9928: case 9938: case 9948: case 9958: case 9968: case 9978: case 9988: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedGranite\n\t{\n\t}\n\tnamespace PolishedGraniteSlab\n\t{\n\t\tBlockState PolishedGraniteSlab()\n\t\t{\n\t\t\treturn 10792;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10792: return Type::Bottom;\n\t\t\t\tcase 10794: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PolishedGraniteStairs\n\t{\n\t\tBlockState PolishedGraniteStairs()\n\t\t{\n\t\t\treturn 9680;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9710: case 9712: case 9714: case 9716: case 9718: case 9720: case 9722: case 9724: case 9726: case 9728: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9730: case 9732: case 9734: case 9736: case 9738: case 9740: case 9742: case 9744: case 9746: case 9748: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9670: case 9672: case 9674: case 9676: case 9678: case 9680: case 9682: case 9684: case 9686: case 9688: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9680: case 9682: case 9684: case 9686: case 9688: case 9700: case 9702: case 9704: case 9706: case 9708: case 9720: case 9722: case 9724: case 9726: case 9728: case 9740: case 9742: case 9744: case 9746: case 9748: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9672: case 9682: case 9692: case 9702: case 9712: case 9722: case 9732: case 9742: return Shape::InnerLeft;\n\t\t\t\tcase 9674: case 9684: case 9694: case 9704: case 9714: case 9724: case 9734: case 9744: return Shape::InnerRight;\n\t\t\t\tcase 9676: case 9686: case 9696: case 9706: case 9716: case 9726: case 9736: case 9746: return Shape::OuterLeft;\n\t\t\t\tcase 9678: case 9688: case 9698: case 9708: case 9718: case 9728: case 9738: case 9748: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Poppy\n\t{\n\t}\n\tnamespace Potatoes\n\t{\n\t\tBlockState Potatoes()\n\t\t{\n\t\t\treturn 6338;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6338: return 0;\n\t\t\t\tcase 6339: return 1;\n\t\t\t\tcase 6340: return 2;\n\t\t\t\tcase 6341: return 3;\n\t\t\t\tcase 6342: return 4;\n\t\t\t\tcase 6343: return 5;\n\t\t\t\tcase 6344: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PottedAcaciaSapling\n\t{\n\t}\n\tnamespace PottedAllium\n\t{\n\t}\n\tnamespace PottedAzureBluet\n\t{\n\t}\n\tnamespace PottedBamboo\n\t{\n\t}\n\tnamespace PottedBirchSapling\n\t{\n\t}\n\tnamespace PottedBlueOrchid\n\t{\n\t}\n\tnamespace PottedBrownMushroom\n\t{\n\t}\n\tnamespace PottedCactus\n\t{\n\t}\n\tnamespace PottedCornflower\n\t{\n\t}\n\tnamespace PottedCrimsonFungus\n\t{\n\t}\n\tnamespace PottedCrimsonRoots\n\t{\n\t}\n\tnamespace PottedDandelion\n\t{\n\t}\n\tnamespace PottedDarkOakSapling\n\t{\n\t}\n\tnamespace PottedDeadBush\n\t{\n\t}\n\tnamespace PottedFern\n\t{\n\t}\n\tnamespace PottedJungleSapling\n\t{\n\t}\n\tnamespace PottedLilyOfTheValley\n\t{\n\t}\n\tnamespace PottedOakSapling\n\t{\n\t}\n\tnamespace PottedOrangeTulip\n\t{\n\t}\n\tnamespace PottedOxeyeDaisy\n\t{\n\t}\n\tnamespace PottedPinkTulip\n\t{\n\t}\n\tnamespace PottedPoppy\n\t{\n\t}\n\tnamespace PottedRedMushroom\n\t{\n\t}\n\tnamespace PottedRedTulip\n\t{\n\t}\n\tnamespace PottedSpruceSapling\n\t{\n\t}\n\tnamespace PottedWarpedFungus\n\t{\n\t}\n\tnamespace PottedWarpedRoots\n\t{\n\t}\n\tnamespace PottedWhiteTulip\n\t{\n\t}\n\tnamespace PottedWitherRose\n\t{\n\t}\n\tnamespace PoweredRail\n\t{\n\t\tBlockState PoweredRail()\n\t\t{\n\t\t\treturn 1311;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1311: case 1312: case 1313: case 1314: case 1315: case 1316: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1307: case 1313: return Shape::AscendingEast;\n\t\t\t\tcase 1309: case 1315: return Shape::AscendingNorth;\n\t\t\t\tcase 1310: case 1316: return Shape::AscendingSouth;\n\t\t\t\tcase 1308: case 1314: return Shape::AscendingWest;\n\t\t\t\tcase 1306: case 1312: return Shape::EastWest;\n\t\t\t\tdefault: return Shape::NorthSouth;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Prismarine\n\t{\n\t}\n\tnamespace PrismarineBrickSlab\n\t{\n\t\tBlockState PrismarineBrickSlab()\n\t\t{\n\t\t\treturn 7853;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7853: return Type::Bottom;\n\t\t\t\tcase 7855: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PrismarineBrickStairs\n\t{\n\t\tBlockState PrismarineBrickStairs()\n\t\t{\n\t\t\treturn 7695;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7725: case 7727: case 7729: case 7731: case 7733: case 7735: case 7737: case 7739: case 7741: case 7743: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 7745: case 7747: case 7749: case 7751: case 7753: case 7755: case 7757: case 7759: case 7761: case 7763: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 7685: case 7687: case 7689: case 7691: case 7693: case 7695: case 7697: case 7699: case 7701: case 7703: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7695: case 7697: case 7699: case 7701: case 7703: case 7715: case 7717: case 7719: case 7721: case 7723: case 7735: case 7737: case 7739: case 7741: case 7743: case 7755: case 7757: case 7759: case 7761: case 7763: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7687: case 7697: case 7707: case 7717: case 7727: case 7737: case 7747: case 7757: return Shape::InnerLeft;\n\t\t\t\tcase 7689: case 7699: case 7709: case 7719: case 7729: case 7739: case 7749: case 7759: return Shape::InnerRight;\n\t\t\t\tcase 7691: case 7701: case 7711: case 7721: case 7731: case 7741: case 7751: case 7761: return Shape::OuterLeft;\n\t\t\t\tcase 7693: case 7703: case 7713: case 7723: case 7733: case 7743: case 7753: case 7763: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PrismarineBricks\n\t{\n\t}\n\tnamespace PrismarineSlab\n\t{\n\t\tBlockState PrismarineSlab()\n\t\t{\n\t\t\treturn 7847;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7847: return Type::Bottom;\n\t\t\t\tcase 7849: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PrismarineStairs\n\t{\n\t\tBlockState PrismarineStairs()\n\t\t{\n\t\t\treturn 7615;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7645: case 7647: case 7649: case 7651: case 7653: case 7655: case 7657: case 7659: case 7661: case 7663: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 7665: case 7667: case 7669: case 7671: case 7673: case 7675: case 7677: case 7679: case 7681: case 7683: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 7605: case 7607: case 7609: case 7611: case 7613: case 7615: case 7617: case 7619: case 7621: case 7623: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7615: case 7617: case 7619: case 7621: case 7623: case 7635: case 7637: case 7639: case 7641: case 7643: case 7655: case 7657: case 7659: case 7661: case 7663: case 7675: case 7677: case 7679: case 7681: case 7683: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7607: case 7617: case 7627: case 7637: case 7647: case 7657: case 7667: case 7677: return Shape::InnerLeft;\n\t\t\t\tcase 7609: case 7619: case 7629: case 7639: case 7649: case 7659: case 7669: case 7679: return Shape::InnerRight;\n\t\t\t\tcase 7611: case 7621: case 7631: case 7641: case 7651: case 7661: case 7671: case 7681: return Shape::OuterLeft;\n\t\t\t\tcase 7613: case 7623: case 7633: case 7643: case 7653: case 7663: case 7673: case 7683: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PrismarineWall\n\t{\n\t\tBlockState PrismarineWall()\n\t\t{\n\t\t\treturn 11194;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11302: case 11303: case 11304: case 11308: case 11309: case 11310: case 11314: case 11315: case 11316: case 11320: case 11321: case 11322: case 11326: case 11327: case 11328: case 11332: case 11333: case 11334: case 11338: case 11339: case 11340: case 11344: case 11345: case 11346: case 11350: case 11351: case 11352: case 11356: case 11357: case 11358: case 11362: case 11363: case 11364: case 11368: case 11369: case 11370: case 11374: case 11375: case 11376: case 11380: case 11381: case 11382: case 11386: case 11387: case 11388: case 11392: case 11393: case 11394: case 11398: case 11399: case 11400: case 11404: case 11405: case 11406: return East::Low;\n\t\t\t\tcase 11194: case 11195: case 11196: case 11200: case 11201: case 11202: case 11206: case 11207: case 11208: case 11212: case 11213: case 11214: case 11218: case 11219: case 11220: case 11224: case 11225: case 11226: case 11230: case 11231: case 11232: case 11236: case 11237: case 11238: case 11242: case 11243: case 11244: case 11248: case 11249: case 11250: case 11254: case 11255: case 11256: case 11260: case 11261: case 11262: case 11266: case 11267: case 11268: case 11272: case 11273: case 11274: case 11278: case 11279: case 11280: case 11284: case 11285: case 11286: case 11290: case 11291: case 11292: case 11296: case 11297: case 11298: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11230: case 11231: case 11232: case 11236: case 11237: case 11238: case 11242: case 11243: case 11244: case 11248: case 11249: case 11250: case 11254: case 11255: case 11256: case 11260: case 11261: case 11262: case 11338: case 11339: case 11340: case 11344: case 11345: case 11346: case 11350: case 11351: case 11352: case 11356: case 11357: case 11358: case 11362: case 11363: case 11364: case 11368: case 11369: case 11370: case 11446: case 11447: case 11448: case 11452: case 11453: case 11454: case 11458: case 11459: case 11460: case 11464: case 11465: case 11466: case 11470: case 11471: case 11472: case 11476: case 11477: case 11478: return North::Low;\n\t\t\t\tcase 11194: case 11195: case 11196: case 11200: case 11201: case 11202: case 11206: case 11207: case 11208: case 11212: case 11213: case 11214: case 11218: case 11219: case 11220: case 11224: case 11225: case 11226: case 11302: case 11303: case 11304: case 11308: case 11309: case 11310: case 11314: case 11315: case 11316: case 11320: case 11321: case 11322: case 11326: case 11327: case 11328: case 11332: case 11333: case 11334: case 11410: case 11411: case 11412: case 11416: case 11417: case 11418: case 11422: case 11423: case 11424: case 11428: case 11429: case 11430: case 11434: case 11435: case 11436: case 11440: case 11441: case 11442: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11206: case 11207: case 11208: case 11212: case 11213: case 11214: case 11242: case 11243: case 11244: case 11248: case 11249: case 11250: case 11278: case 11279: case 11280: case 11284: case 11285: case 11286: case 11314: case 11315: case 11316: case 11320: case 11321: case 11322: case 11350: case 11351: case 11352: case 11356: case 11357: case 11358: case 11386: case 11387: case 11388: case 11392: case 11393: case 11394: case 11422: case 11423: case 11424: case 11428: case 11429: case 11430: case 11458: case 11459: case 11460: case 11464: case 11465: case 11466: case 11494: case 11495: case 11496: case 11500: case 11501: case 11502: return South::Low;\n\t\t\t\tcase 11194: case 11195: case 11196: case 11200: case 11201: case 11202: case 11230: case 11231: case 11232: case 11236: case 11237: case 11238: case 11266: case 11267: case 11268: case 11272: case 11273: case 11274: case 11302: case 11303: case 11304: case 11308: case 11309: case 11310: case 11338: case 11339: case 11340: case 11344: case 11345: case 11346: case 11374: case 11375: case 11376: case 11380: case 11381: case 11382: case 11410: case 11411: case 11412: case 11416: case 11417: case 11418: case 11446: case 11447: case 11448: case 11452: case 11453: case 11454: case 11482: case 11483: case 11484: case 11488: case 11489: case 11490: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11200: case 11201: case 11202: case 11212: case 11213: case 11214: case 11224: case 11225: case 11226: case 11236: case 11237: case 11238: case 11248: case 11249: case 11250: case 11260: case 11261: case 11262: case 11272: case 11273: case 11274: case 11284: case 11285: case 11286: case 11296: case 11297: case 11298: case 11308: case 11309: case 11310: case 11320: case 11321: case 11322: case 11332: case 11333: case 11334: case 11344: case 11345: case 11346: case 11356: case 11357: case 11358: case 11368: case 11369: case 11370: case 11380: case 11381: case 11382: case 11392: case 11393: case 11394: case 11404: case 11405: case 11406: case 11416: case 11417: case 11418: case 11428: case 11429: case 11430: case 11440: case 11441: case 11442: case 11452: case 11453: case 11454: case 11464: case 11465: case 11466: case 11476: case 11477: case 11478: case 11488: case 11489: case 11490: case 11500: case 11501: case 11502: case 11512: case 11513: case 11514: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11195: case 11201: case 11207: case 11213: case 11219: case 11225: case 11231: case 11237: case 11243: case 11249: case 11255: case 11261: case 11267: case 11273: case 11279: case 11285: case 11291: case 11297: case 11303: case 11309: case 11315: case 11321: case 11327: case 11333: case 11339: case 11345: case 11351: case 11357: case 11363: case 11369: case 11375: case 11381: case 11387: case 11393: case 11399: case 11405: case 11411: case 11417: case 11423: case 11429: case 11435: case 11441: case 11447: case 11453: case 11459: case 11465: case 11471: case 11477: case 11483: case 11489: case 11495: case 11501: case 11507: case 11513: return West::Low;\n\t\t\t\tcase 11194: case 11200: case 11206: case 11212: case 11218: case 11224: case 11230: case 11236: case 11242: case 11248: case 11254: case 11260: case 11266: case 11272: case 11278: case 11284: case 11290: case 11296: case 11302: case 11308: case 11314: case 11320: case 11326: case 11332: case 11338: case 11344: case 11350: case 11356: case 11362: case 11368: case 11374: case 11380: case 11386: case 11392: case 11398: case 11404: case 11410: case 11416: case 11422: case 11428: case 11434: case 11440: case 11446: case 11452: case 11458: case 11464: case 11470: case 11476: case 11482: case 11488: case 11494: case 11500: case 11506: case 11512: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Pumpkin\n\t{\n\t}\n\tnamespace PumpkinStem\n\t{\n\t\tBlockState PumpkinStem()\n\t\t{\n\t\t\treturn 4772;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4772: return 0;\n\t\t\t\tcase 4773: return 1;\n\t\t\t\tcase 4774: return 2;\n\t\t\t\tcase 4775: return 3;\n\t\t\t\tcase 4776: return 4;\n\t\t\t\tcase 4777: return 5;\n\t\t\t\tcase 4778: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpleBanner\n\t{\n\t\tBlockState PurpleBanner()\n\t\t{\n\t\t\treturn 8057;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8057: return 0;\n\t\t\t\tcase 8058: return 1;\n\t\t\t\tcase 8067: return 10;\n\t\t\t\tcase 8068: return 11;\n\t\t\t\tcase 8069: return 12;\n\t\t\t\tcase 8070: return 13;\n\t\t\t\tcase 8071: return 14;\n\t\t\t\tcase 8072: return 15;\n\t\t\t\tcase 8059: return 2;\n\t\t\t\tcase 8060: return 3;\n\t\t\t\tcase 8061: return 4;\n\t\t\t\tcase 8062: return 5;\n\t\t\t\tcase 8063: return 6;\n\t\t\t\tcase 8064: return 7;\n\t\t\t\tcase 8065: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpleBed\n\t{\n\t\tBlockState PurpleBed()\n\t\t{\n\t\t\treturn 1212;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1217: case 1218: case 1219: case 1220: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1221: case 1222: case 1223: case 1224: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1209: case 1210: case 1211: case 1212: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1211: case 1212: case 1215: case 1216: case 1219: case 1220: case 1223: case 1224: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1210: case 1212: case 1214: case 1216: case 1218: case 1220: case 1222: case 1224: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpleCarpet\n\t{\n\t}\n\tnamespace PurpleConcrete\n\t{\n\t}\n\tnamespace PurpleConcretePowder\n\t{\n\t}\n\tnamespace PurpleGlazedTerracotta\n\t{\n\t\tBlockState PurpleGlazedTerracotta()\n\t\t{\n\t\t\treturn 9414;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9416: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9417: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9414: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpleShulkerBox\n\t{\n\t\tBlockState PurpleShulkerBox()\n\t\t{\n\t\t\treturn 9342;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9341: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9339: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9343: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9342: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9338: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpleStainedGlass\n\t{\n\t}\n\tnamespace PurpleStainedGlassPane\n\t{\n\t\tBlockState PurpleStainedGlassPane()\n\t\t{\n\t\t\treturn 7214;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7201: case 7202: case 7205: case 7206: case 7209: case 7210: case 7213: case 7214: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7193: case 7194: case 7197: case 7198: case 7209: case 7210: case 7213: case 7214: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7189: case 7190: case 7197: case 7198: case 7205: case 7206: case 7213: case 7214: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7186: case 7190: case 7194: case 7198: case 7202: case 7206: case 7210: case 7214: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpleTerracotta\n\t{\n\t}\n\tnamespace PurpleWallBanner\n\t{\n\t\tBlockState PurpleWallBanner()\n\t\t{\n\t\t\treturn 8193;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8195: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8196: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8193: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpleWool\n\t{\n\t}\n\tnamespace PurpurBlock\n\t{\n\t}\n\tnamespace PurpurPillar\n\t{\n\t\tBlockState PurpurPillar()\n\t\t{\n\t\t\treturn 9136;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9135: return Axis::X;\n\t\t\t\tcase 9136: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpurSlab\n\t{\n\t\tBlockState PurpurSlab()\n\t\t{\n\t\t\treturn 8411;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8411: return Type::Bottom;\n\t\t\t\tcase 8413: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace PurpurStairs\n\t{\n\t\tBlockState PurpurStairs()\n\t\t{\n\t\t\treturn 9149;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9179: case 9181: case 9183: case 9185: case 9187: case 9189: case 9191: case 9193: case 9195: case 9197: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9199: case 9201: case 9203: case 9205: case 9207: case 9209: case 9211: case 9213: case 9215: case 9217: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9139: case 9141: case 9143: case 9145: case 9147: case 9149: case 9151: case 9153: case 9155: case 9157: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9149: case 9151: case 9153: case 9155: case 9157: case 9169: case 9171: case 9173: case 9175: case 9177: case 9189: case 9191: case 9193: case 9195: case 9197: case 9209: case 9211: case 9213: case 9215: case 9217: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9141: case 9151: case 9161: case 9171: case 9181: case 9191: case 9201: case 9211: return Shape::InnerLeft;\n\t\t\t\tcase 9143: case 9153: case 9163: case 9173: case 9183: case 9193: case 9203: case 9213: return Shape::InnerRight;\n\t\t\t\tcase 9145: case 9155: case 9165: case 9175: case 9185: case 9195: case 9205: case 9215: return Shape::OuterLeft;\n\t\t\t\tcase 9147: case 9157: case 9167: case 9177: case 9187: case 9197: case 9207: case 9217: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace QuartzBlock\n\t{\n\t}\n\tnamespace QuartzBricks\n\t{\n\t}\n\tnamespace QuartzPillar\n\t{\n\t\tBlockState QuartzPillar()\n\t\t{\n\t\t\treturn 6741;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6740: return Axis::X;\n\t\t\t\tcase 6741: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace QuartzSlab\n\t{\n\t\tBlockState QuartzSlab()\n\t\t{\n\t\t\treturn 8393;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8393: return Type::Bottom;\n\t\t\t\tcase 8395: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace QuartzStairs\n\t{\n\t\tBlockState QuartzStairs()\n\t\t{\n\t\t\treturn 6754;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6784: case 6786: case 6788: case 6790: case 6792: case 6794: case 6796: case 6798: case 6800: case 6802: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6804: case 6806: case 6808: case 6810: case 6812: case 6814: case 6816: case 6818: case 6820: case 6822: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6744: case 6746: case 6748: case 6750: case 6752: case 6754: case 6756: case 6758: case 6760: case 6762: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6754: case 6756: case 6758: case 6760: case 6762: case 6774: case 6776: case 6778: case 6780: case 6782: case 6794: case 6796: case 6798: case 6800: case 6802: case 6814: case 6816: case 6818: case 6820: case 6822: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6746: case 6756: case 6766: case 6776: case 6786: case 6796: case 6806: case 6816: return Shape::InnerLeft;\n\t\t\t\tcase 6748: case 6758: case 6768: case 6778: case 6788: case 6798: case 6808: case 6818: return Shape::InnerRight;\n\t\t\t\tcase 6750: case 6760: case 6770: case 6780: case 6790: case 6800: case 6810: case 6820: return Shape::OuterLeft;\n\t\t\t\tcase 6752: case 6762: case 6772: case 6782: case 6792: case 6802: case 6812: case 6822: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Rail\n\t{\n\t\tBlockState Rail()\n\t\t{\n\t\t\treturn 3645;\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3647: return Shape::AscendingEast;\n\t\t\t\tcase 3649: return Shape::AscendingNorth;\n\t\t\t\tcase 3650: return Shape::AscendingSouth;\n\t\t\t\tcase 3648: return Shape::AscendingWest;\n\t\t\t\tcase 3646: return Shape::EastWest;\n\t\t\t\tcase 3654: return Shape::NorthEast;\n\t\t\t\tcase 3645: return Shape::NorthSouth;\n\t\t\t\tcase 3653: return Shape::NorthWest;\n\t\t\t\tcase 3651: return Shape::SouthEast;\n\t\t\t\tdefault: return Shape::SouthWest;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedBanner\n\t{\n\t\tBlockState RedBanner()\n\t\t{\n\t\t\treturn 8121;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8121: return 0;\n\t\t\t\tcase 8122: return 1;\n\t\t\t\tcase 8131: return 10;\n\t\t\t\tcase 8132: return 11;\n\t\t\t\tcase 8133: return 12;\n\t\t\t\tcase 8134: return 13;\n\t\t\t\tcase 8135: return 14;\n\t\t\t\tcase 8136: return 15;\n\t\t\t\tcase 8123: return 2;\n\t\t\t\tcase 8124: return 3;\n\t\t\t\tcase 8125: return 4;\n\t\t\t\tcase 8126: return 5;\n\t\t\t\tcase 8127: return 6;\n\t\t\t\tcase 8128: return 7;\n\t\t\t\tcase 8129: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedBed\n\t{\n\t\tBlockState RedBed()\n\t\t{\n\t\t\treturn 1276;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1281: case 1282: case 1283: case 1284: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1285: case 1286: case 1287: case 1288: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1273: case 1274: case 1275: case 1276: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1275: case 1276: case 1279: case 1280: case 1283: case 1284: case 1287: case 1288: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1274: case 1276: case 1278: case 1280: case 1282: case 1284: case 1286: case 1288: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedCarpet\n\t{\n\t}\n\tnamespace RedConcrete\n\t{\n\t}\n\tnamespace RedConcretePowder\n\t{\n\t}\n\tnamespace RedGlazedTerracotta\n\t{\n\t\tBlockState RedGlazedTerracotta()\n\t\t{\n\t\t\treturn 9430;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9432: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9433: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9430: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedMushroom\n\t{\n\t}\n\tnamespace RedMushroomBlock\n\t{\n\t\tBlockState RedMushroomBlock()\n\t\t{\n\t\t\treturn 4569;\n\t\t}\n\t\tbool Down(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4601: case 4602: case 4603: case 4604: case 4605: case 4606: case 4607: case 4608: case 4609: case 4610: case 4611: case 4612: case 4613: case 4614: case 4615: case 4616: case 4617: case 4618: case 4619: case 4620: case 4621: case 4622: case 4623: case 4624: case 4625: case 4626: case 4627: case 4628: case 4629: case 4630: case 4631: case 4632: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4585: case 4586: case 4587: case 4588: case 4589: case 4590: case 4591: case 4592: case 4593: case 4594: case 4595: case 4596: case 4597: case 4598: case 4599: case 4600: case 4617: case 4618: case 4619: case 4620: case 4621: case 4622: case 4623: case 4624: case 4625: case 4626: case 4627: case 4628: case 4629: case 4630: case 4631: case 4632: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4577: case 4578: case 4579: case 4580: case 4581: case 4582: case 4583: case 4584: case 4593: case 4594: case 4595: case 4596: case 4597: case 4598: case 4599: case 4600: case 4609: case 4610: case 4611: case 4612: case 4613: case 4614: case 4615: case 4616: case 4625: case 4626: case 4627: case 4628: case 4629: case 4630: case 4631: case 4632: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4573: case 4574: case 4575: case 4576: case 4581: case 4582: case 4583: case 4584: case 4589: case 4590: case 4591: case 4592: case 4597: case 4598: case 4599: case 4600: case 4605: case 4606: case 4607: case 4608: case 4613: case 4614: case 4615: case 4616: case 4621: case 4622: case 4623: case 4624: case 4629: case 4630: case 4631: case 4632: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4571: case 4572: case 4575: case 4576: case 4579: case 4580: case 4583: case 4584: case 4587: case 4588: case 4591: case 4592: case 4595: case 4596: case 4599: case 4600: case 4603: case 4604: case 4607: case 4608: case 4611: case 4612: case 4615: case 4616: case 4619: case 4620: case 4623: case 4624: case 4627: case 4628: case 4631: case 4632: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4570: case 4572: case 4574: case 4576: case 4578: case 4580: case 4582: case 4584: case 4586: case 4588: case 4590: case 4592: case 4594: case 4596: case 4598: case 4600: case 4602: case 4604: case 4606: case 4608: case 4610: case 4612: case 4614: case 4616: case 4618: case 4620: case 4622: case 4624: case 4626: case 4628: case 4630: case 4632: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedNetherBrickSlab\n\t{\n\t\tBlockState RedNetherBrickSlab()\n\t\t{\n\t\t\treturn 10852;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10852: return Type::Bottom;\n\t\t\t\tcase 10854: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedNetherBrickStairs\n\t{\n\t\tBlockState RedNetherBrickStairs()\n\t\t{\n\t\t\treturn 10560;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10590: case 10592: case 10594: case 10596: case 10598: case 10600: case 10602: case 10604: case 10606: case 10608: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10610: case 10612: case 10614: case 10616: case 10618: case 10620: case 10622: case 10624: case 10626: case 10628: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10550: case 10552: case 10554: case 10556: case 10558: case 10560: case 10562: case 10564: case 10566: case 10568: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10560: case 10562: case 10564: case 10566: case 10568: case 10580: case 10582: case 10584: case 10586: case 10588: case 10600: case 10602: case 10604: case 10606: case 10608: case 10620: case 10622: case 10624: case 10626: case 10628: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10552: case 10562: case 10572: case 10582: case 10592: case 10602: case 10612: case 10622: return Shape::InnerLeft;\n\t\t\t\tcase 10554: case 10564: case 10574: case 10584: case 10594: case 10604: case 10614: case 10624: return Shape::InnerRight;\n\t\t\t\tcase 10556: case 10566: case 10576: case 10586: case 10596: case 10606: case 10616: case 10626: return Shape::OuterLeft;\n\t\t\t\tcase 10558: case 10568: case 10578: case 10588: case 10598: case 10608: case 10618: case 10628: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedNetherBrickWall\n\t{\n\t\tBlockState RedNetherBrickWall()\n\t\t{\n\t\t\treturn 13462;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13570: case 13571: case 13572: case 13576: case 13577: case 13578: case 13582: case 13583: case 13584: case 13588: case 13589: case 13590: case 13594: case 13595: case 13596: case 13600: case 13601: case 13602: case 13606: case 13607: case 13608: case 13612: case 13613: case 13614: case 13618: case 13619: case 13620: case 13624: case 13625: case 13626: case 13630: case 13631: case 13632: case 13636: case 13637: case 13638: case 13642: case 13643: case 13644: case 13648: case 13649: case 13650: case 13654: case 13655: case 13656: case 13660: case 13661: case 13662: case 13666: case 13667: case 13668: case 13672: case 13673: case 13674: return East::Low;\n\t\t\t\tcase 13462: case 13463: case 13464: case 13468: case 13469: case 13470: case 13474: case 13475: case 13476: case 13480: case 13481: case 13482: case 13486: case 13487: case 13488: case 13492: case 13493: case 13494: case 13498: case 13499: case 13500: case 13504: case 13505: case 13506: case 13510: case 13511: case 13512: case 13516: case 13517: case 13518: case 13522: case 13523: case 13524: case 13528: case 13529: case 13530: case 13534: case 13535: case 13536: case 13540: case 13541: case 13542: case 13546: case 13547: case 13548: case 13552: case 13553: case 13554: case 13558: case 13559: case 13560: case 13564: case 13565: case 13566: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13498: case 13499: case 13500: case 13504: case 13505: case 13506: case 13510: case 13511: case 13512: case 13516: case 13517: case 13518: case 13522: case 13523: case 13524: case 13528: case 13529: case 13530: case 13606: case 13607: case 13608: case 13612: case 13613: case 13614: case 13618: case 13619: case 13620: case 13624: case 13625: case 13626: case 13630: case 13631: case 13632: case 13636: case 13637: case 13638: case 13714: case 13715: case 13716: case 13720: case 13721: case 13722: case 13726: case 13727: case 13728: case 13732: case 13733: case 13734: case 13738: case 13739: case 13740: case 13744: case 13745: case 13746: return North::Low;\n\t\t\t\tcase 13462: case 13463: case 13464: case 13468: case 13469: case 13470: case 13474: case 13475: case 13476: case 13480: case 13481: case 13482: case 13486: case 13487: case 13488: case 13492: case 13493: case 13494: case 13570: case 13571: case 13572: case 13576: case 13577: case 13578: case 13582: case 13583: case 13584: case 13588: case 13589: case 13590: case 13594: case 13595: case 13596: case 13600: case 13601: case 13602: case 13678: case 13679: case 13680: case 13684: case 13685: case 13686: case 13690: case 13691: case 13692: case 13696: case 13697: case 13698: case 13702: case 13703: case 13704: case 13708: case 13709: case 13710: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13474: case 13475: case 13476: case 13480: case 13481: case 13482: case 13510: case 13511: case 13512: case 13516: case 13517: case 13518: case 13546: case 13547: case 13548: case 13552: case 13553: case 13554: case 13582: case 13583: case 13584: case 13588: case 13589: case 13590: case 13618: case 13619: case 13620: case 13624: case 13625: case 13626: case 13654: case 13655: case 13656: case 13660: case 13661: case 13662: case 13690: case 13691: case 13692: case 13696: case 13697: case 13698: case 13726: case 13727: case 13728: case 13732: case 13733: case 13734: case 13762: case 13763: case 13764: case 13768: case 13769: case 13770: return South::Low;\n\t\t\t\tcase 13462: case 13463: case 13464: case 13468: case 13469: case 13470: case 13498: case 13499: case 13500: case 13504: case 13505: case 13506: case 13534: case 13535: case 13536: case 13540: case 13541: case 13542: case 13570: case 13571: case 13572: case 13576: case 13577: case 13578: case 13606: case 13607: case 13608: case 13612: case 13613: case 13614: case 13642: case 13643: case 13644: case 13648: case 13649: case 13650: case 13678: case 13679: case 13680: case 13684: case 13685: case 13686: case 13714: case 13715: case 13716: case 13720: case 13721: case 13722: case 13750: case 13751: case 13752: case 13756: case 13757: case 13758: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13468: case 13469: case 13470: case 13480: case 13481: case 13482: case 13492: case 13493: case 13494: case 13504: case 13505: case 13506: case 13516: case 13517: case 13518: case 13528: case 13529: case 13530: case 13540: case 13541: case 13542: case 13552: case 13553: case 13554: case 13564: case 13565: case 13566: case 13576: case 13577: case 13578: case 13588: case 13589: case 13590: case 13600: case 13601: case 13602: case 13612: case 13613: case 13614: case 13624: case 13625: case 13626: case 13636: case 13637: case 13638: case 13648: case 13649: case 13650: case 13660: case 13661: case 13662: case 13672: case 13673: case 13674: case 13684: case 13685: case 13686: case 13696: case 13697: case 13698: case 13708: case 13709: case 13710: case 13720: case 13721: case 13722: case 13732: case 13733: case 13734: case 13744: case 13745: case 13746: case 13756: case 13757: case 13758: case 13768: case 13769: case 13770: case 13780: case 13781: case 13782: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13463: case 13469: case 13475: case 13481: case 13487: case 13493: case 13499: case 13505: case 13511: case 13517: case 13523: case 13529: case 13535: case 13541: case 13547: case 13553: case 13559: case 13565: case 13571: case 13577: case 13583: case 13589: case 13595: case 13601: case 13607: case 13613: case 13619: case 13625: case 13631: case 13637: case 13643: case 13649: case 13655: case 13661: case 13667: case 13673: case 13679: case 13685: case 13691: case 13697: case 13703: case 13709: case 13715: case 13721: case 13727: case 13733: case 13739: case 13745: case 13751: case 13757: case 13763: case 13769: case 13775: case 13781: return West::Low;\n\t\t\t\tcase 13462: case 13468: case 13474: case 13480: case 13486: case 13492: case 13498: case 13504: case 13510: case 13516: case 13522: case 13528: case 13534: case 13540: case 13546: case 13552: case 13558: case 13564: case 13570: case 13576: case 13582: case 13588: case 13594: case 13600: case 13606: case 13612: case 13618: case 13624: case 13630: case 13636: case 13642: case 13648: case 13654: case 13660: case 13666: case 13672: case 13678: case 13684: case 13690: case 13696: case 13702: case 13708: case 13714: case 13720: case 13726: case 13732: case 13738: case 13744: case 13750: case 13756: case 13762: case 13768: case 13774: case 13780: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedNetherBricks\n\t{\n\t}\n\tnamespace RedSand\n\t{\n\t}\n\tnamespace RedSandstone\n\t{\n\t}\n\tnamespace RedSandstoneSlab\n\t{\n\t\tBlockState RedSandstoneSlab()\n\t\t{\n\t\t\treturn 8399;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8399: return Type::Bottom;\n\t\t\t\tcase 8401: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedSandstoneStairs\n\t{\n\t\tBlockState RedSandstoneStairs()\n\t\t{\n\t\t\treturn 8231;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8261: case 8263: case 8265: case 8267: case 8269: case 8271: case 8273: case 8275: case 8277: case 8279: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8281: case 8283: case 8285: case 8287: case 8289: case 8291: case 8293: case 8295: case 8297: case 8299: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8221: case 8223: case 8225: case 8227: case 8229: case 8231: case 8233: case 8235: case 8237: case 8239: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8231: case 8233: case 8235: case 8237: case 8239: case 8251: case 8253: case 8255: case 8257: case 8259: case 8271: case 8273: case 8275: case 8277: case 8279: case 8291: case 8293: case 8295: case 8297: case 8299: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8223: case 8233: case 8243: case 8253: case 8263: case 8273: case 8283: case 8293: return Shape::InnerLeft;\n\t\t\t\tcase 8225: case 8235: case 8245: case 8255: case 8265: case 8275: case 8285: case 8295: return Shape::InnerRight;\n\t\t\t\tcase 8227: case 8237: case 8247: case 8257: case 8267: case 8277: case 8287: case 8297: return Shape::OuterLeft;\n\t\t\t\tcase 8229: case 8239: case 8249: case 8259: case 8269: case 8279: case 8289: case 8299: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedSandstoneWall\n\t{\n\t\tBlockState RedSandstoneWall()\n\t\t{\n\t\t\treturn 11518;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11626: case 11627: case 11628: case 11632: case 11633: case 11634: case 11638: case 11639: case 11640: case 11644: case 11645: case 11646: case 11650: case 11651: case 11652: case 11656: case 11657: case 11658: case 11662: case 11663: case 11664: case 11668: case 11669: case 11670: case 11674: case 11675: case 11676: case 11680: case 11681: case 11682: case 11686: case 11687: case 11688: case 11692: case 11693: case 11694: case 11698: case 11699: case 11700: case 11704: case 11705: case 11706: case 11710: case 11711: case 11712: case 11716: case 11717: case 11718: case 11722: case 11723: case 11724: case 11728: case 11729: case 11730: return East::Low;\n\t\t\t\tcase 11518: case 11519: case 11520: case 11524: case 11525: case 11526: case 11530: case 11531: case 11532: case 11536: case 11537: case 11538: case 11542: case 11543: case 11544: case 11548: case 11549: case 11550: case 11554: case 11555: case 11556: case 11560: case 11561: case 11562: case 11566: case 11567: case 11568: case 11572: case 11573: case 11574: case 11578: case 11579: case 11580: case 11584: case 11585: case 11586: case 11590: case 11591: case 11592: case 11596: case 11597: case 11598: case 11602: case 11603: case 11604: case 11608: case 11609: case 11610: case 11614: case 11615: case 11616: case 11620: case 11621: case 11622: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11554: case 11555: case 11556: case 11560: case 11561: case 11562: case 11566: case 11567: case 11568: case 11572: case 11573: case 11574: case 11578: case 11579: case 11580: case 11584: case 11585: case 11586: case 11662: case 11663: case 11664: case 11668: case 11669: case 11670: case 11674: case 11675: case 11676: case 11680: case 11681: case 11682: case 11686: case 11687: case 11688: case 11692: case 11693: case 11694: case 11770: case 11771: case 11772: case 11776: case 11777: case 11778: case 11782: case 11783: case 11784: case 11788: case 11789: case 11790: case 11794: case 11795: case 11796: case 11800: case 11801: case 11802: return North::Low;\n\t\t\t\tcase 11518: case 11519: case 11520: case 11524: case 11525: case 11526: case 11530: case 11531: case 11532: case 11536: case 11537: case 11538: case 11542: case 11543: case 11544: case 11548: case 11549: case 11550: case 11626: case 11627: case 11628: case 11632: case 11633: case 11634: case 11638: case 11639: case 11640: case 11644: case 11645: case 11646: case 11650: case 11651: case 11652: case 11656: case 11657: case 11658: case 11734: case 11735: case 11736: case 11740: case 11741: case 11742: case 11746: case 11747: case 11748: case 11752: case 11753: case 11754: case 11758: case 11759: case 11760: case 11764: case 11765: case 11766: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11530: case 11531: case 11532: case 11536: case 11537: case 11538: case 11566: case 11567: case 11568: case 11572: case 11573: case 11574: case 11602: case 11603: case 11604: case 11608: case 11609: case 11610: case 11638: case 11639: case 11640: case 11644: case 11645: case 11646: case 11674: case 11675: case 11676: case 11680: case 11681: case 11682: case 11710: case 11711: case 11712: case 11716: case 11717: case 11718: case 11746: case 11747: case 11748: case 11752: case 11753: case 11754: case 11782: case 11783: case 11784: case 11788: case 11789: case 11790: case 11818: case 11819: case 11820: case 11824: case 11825: case 11826: return South::Low;\n\t\t\t\tcase 11518: case 11519: case 11520: case 11524: case 11525: case 11526: case 11554: case 11555: case 11556: case 11560: case 11561: case 11562: case 11590: case 11591: case 11592: case 11596: case 11597: case 11598: case 11626: case 11627: case 11628: case 11632: case 11633: case 11634: case 11662: case 11663: case 11664: case 11668: case 11669: case 11670: case 11698: case 11699: case 11700: case 11704: case 11705: case 11706: case 11734: case 11735: case 11736: case 11740: case 11741: case 11742: case 11770: case 11771: case 11772: case 11776: case 11777: case 11778: case 11806: case 11807: case 11808: case 11812: case 11813: case 11814: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11524: case 11525: case 11526: case 11536: case 11537: case 11538: case 11548: case 11549: case 11550: case 11560: case 11561: case 11562: case 11572: case 11573: case 11574: case 11584: case 11585: case 11586: case 11596: case 11597: case 11598: case 11608: case 11609: case 11610: case 11620: case 11621: case 11622: case 11632: case 11633: case 11634: case 11644: case 11645: case 11646: case 11656: case 11657: case 11658: case 11668: case 11669: case 11670: case 11680: case 11681: case 11682: case 11692: case 11693: case 11694: case 11704: case 11705: case 11706: case 11716: case 11717: case 11718: case 11728: case 11729: case 11730: case 11740: case 11741: case 11742: case 11752: case 11753: case 11754: case 11764: case 11765: case 11766: case 11776: case 11777: case 11778: case 11788: case 11789: case 11790: case 11800: case 11801: case 11802: case 11812: case 11813: case 11814: case 11824: case 11825: case 11826: case 11836: case 11837: case 11838: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 11519: case 11525: case 11531: case 11537: case 11543: case 11549: case 11555: case 11561: case 11567: case 11573: case 11579: case 11585: case 11591: case 11597: case 11603: case 11609: case 11615: case 11621: case 11627: case 11633: case 11639: case 11645: case 11651: case 11657: case 11663: case 11669: case 11675: case 11681: case 11687: case 11693: case 11699: case 11705: case 11711: case 11717: case 11723: case 11729: case 11735: case 11741: case 11747: case 11753: case 11759: case 11765: case 11771: case 11777: case 11783: case 11789: case 11795: case 11801: case 11807: case 11813: case 11819: case 11825: case 11831: case 11837: return West::Low;\n\t\t\t\tcase 11518: case 11524: case 11530: case 11536: case 11542: case 11548: case 11554: case 11560: case 11566: case 11572: case 11578: case 11584: case 11590: case 11596: case 11602: case 11608: case 11614: case 11620: case 11626: case 11632: case 11638: case 11644: case 11650: case 11656: case 11662: case 11668: case 11674: case 11680: case 11686: case 11692: case 11698: case 11704: case 11710: case 11716: case 11722: case 11728: case 11734: case 11740: case 11746: case 11752: case 11758: case 11764: case 11770: case 11776: case 11782: case 11788: case 11794: case 11800: case 11806: case 11812: case 11818: case 11824: case 11830: case 11836: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedShulkerBox\n\t{\n\t\tBlockState RedShulkerBox()\n\t\t{\n\t\t\treturn 9366;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9365: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9363: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9367: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9366: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9362: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedStainedGlass\n\t{\n\t}\n\tnamespace RedStainedGlassPane\n\t{\n\t\tBlockState RedStainedGlassPane()\n\t\t{\n\t\t\treturn 7342;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7329: case 7330: case 7333: case 7334: case 7337: case 7338: case 7341: case 7342: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7321: case 7322: case 7325: case 7326: case 7337: case 7338: case 7341: case 7342: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7317: case 7318: case 7325: case 7326: case 7333: case 7334: case 7341: case 7342: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7314: case 7318: case 7322: case 7326: case 7330: case 7334: case 7338: case 7342: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedTerracotta\n\t{\n\t}\n\tnamespace RedTulip\n\t{\n\t}\n\tnamespace RedWallBanner\n\t{\n\t\tBlockState RedWallBanner()\n\t\t{\n\t\t\treturn 8209;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8211: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8212: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8209: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedWool\n\t{\n\t}\n\tnamespace RedstoneBlock\n\t{\n\t}\n\tnamespace RedstoneLamp\n\t{\n\t\tBlockState RedstoneLamp()\n\t\t{\n\t\t\treturn 5157;\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5157: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedstoneOre\n\t{\n\t\tBlockState RedstoneOre()\n\t\t{\n\t\t\treturn 3886;\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3886: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedstoneTorch\n\t{\n\t\tBlockState RedstoneTorch()\n\t\t{\n\t\t\treturn 3887;\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3888: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedstoneWallTorch\n\t{\n\t\tBlockState RedstoneWallTorch()\n\t\t{\n\t\t\treturn 3889;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3893: case 3894: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3895: case 3896: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3889: case 3890: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3890: case 3892: case 3894: case 3896: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RedstoneWire\n\t{\n\t\tBlockState RedstoneWire()\n\t\t{\n\t\t\treturn 3218;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 2922: case 2923: case 2924: case 2925: case 2926: case 2927: case 2928: case 2929: case 2930: case 2931: case 2932: case 2933: case 2934: case 2935: case 2936: case 2937: case 2938: case 2939: case 2940: case 2941: case 2942: case 2943: case 2944: case 2945: case 2946: case 2947: case 2948: case 2949: case 2950: case 2951: case 2952: case 2953: case 2954: case 2955: case 2956: case 2957: case 2958: case 2959: case 2960: case 2961: case 2962: case 2963: case 2964: case 2965: case 2966: case 2967: case 2968: case 2969: case 2970: case 2971: case 2972: case 2973: case 2974: case 2975: case 2976: case 2977: case 2978: case 2979: case 2980: case 2981: case 2982: case 2983: case 2984: case 2985: case 2986: case 2987: case 2988: case 2989: case 2990: case 2991: case 2992: case 2993: case 2994: case 2995: case 2996: case 2997: case 2998: case 2999: case 3000: case 3001: case 3002: case 3003: case 3004: case 3005: case 3006: case 3007: case 3008: case 3009: case 3010: case 3011: case 3012: case 3013: case 3014: case 3015: case 3016: case 3017: case 3018: case 3019: case 3020: case 3021: case 3022: case 3023: case 3024: case 3025: case 3026: case 3027: case 3028: case 3029: case 3030: case 3031: case 3032: case 3033: case 3034: case 3035: case 3036: case 3037: case 3038: case 3039: case 3040: case 3041: case 3042: case 3043: case 3044: case 3045: case 3046: case 3047: case 3048: case 3049: case 3050: case 3051: case 3052: case 3053: case 3054: case 3055: case 3056: case 3057: case 3058: case 3059: case 3060: case 3061: case 3062: case 3063: case 3064: case 3065: case 3066: case 3067: case 3068: case 3069: case 3070: case 3071: case 3072: case 3073: case 3074: case 3075: case 3076: case 3077: case 3078: case 3079: case 3080: case 3081: case 3082: case 3083: case 3084: case 3085: case 3086: case 3087: case 3088: case 3089: case 3090: case 3091: case 3092: case 3093: case 3094: case 3095: case 3096: case 3097: case 3098: case 3099: case 3100: case 3101: case 3102: case 3103: case 3104: case 3105: case 3106: case 3107: case 3108: case 3109: case 3110: case 3111: case 3112: case 3113: case 3114: case 3115: case 3116: case 3117: case 3118: case 3119: case 3120: case 3121: case 3122: case 3123: case 3124: case 3125: case 3126: case 3127: case 3128: case 3129: case 3130: case 3131: case 3132: case 3133: case 3134: case 3135: case 3136: case 3137: case 3138: case 3139: case 3140: case 3141: case 3142: case 3143: case 3144: case 3145: case 3146: case 3147: case 3148: case 3149: case 3150: case 3151: case 3152: case 3153: case 3154: case 3155: case 3156: case 3157: case 3158: case 3159: case 3160: case 3161: case 3162: case 3163: case 3164: case 3165: case 3166: case 3167: case 3168: case 3169: case 3170: case 3171: case 3172: case 3173: case 3174: case 3175: case 3176: case 3177: case 3178: case 3179: case 3180: case 3181: case 3182: case 3183: case 3184: case 3185: case 3186: case 3187: case 3188: case 3189: case 3190: case 3191: case 3192: case 3193: case 3194: case 3195: case 3196: case 3197: case 3198: case 3199: case 3200: case 3201: case 3202: case 3203: case 3204: case 3205: case 3206: case 3207: case 3208: case 3209: case 3210: case 3211: case 3212: case 3213: case 3214: case 3215: case 3216: case 3217: case 3218: case 3219: case 3220: case 3221: case 3222: case 3223: case 3224: case 3225: case 3226: case 3227: case 3228: case 3229: case 3230: case 3231: case 3232: case 3233: case 3234: case 3235: case 3236: case 3237: case 3238: case 3239: case 3240: case 3241: case 3242: case 3243: case 3244: case 3245: case 3246: case 3247: case 3248: case 3249: case 3250: case 3251: case 3252: case 3253: case 3254: case 3255: case 3256: case 3257: case 3258: case 3259: case 3260: case 3261: case 3262: case 3263: case 3264: case 3265: case 3266: case 3267: case 3268: case 3269: case 3270: case 3271: case 3272: case 3273: case 3274: case 3275: case 3276: case 3277: case 3278: case 3279: case 3280: case 3281: case 3282: case 3283: case 3284: case 3285: case 3286: case 3287: case 3288: case 3289: case 3290: case 3291: case 3292: case 3293: case 3294: case 3295: case 3296: case 3297: case 3298: case 3299: case 3300: case 3301: case 3302: case 3303: case 3304: case 3305: case 3306: case 3307: case 3308: case 3309: case 3310: case 3311: case 3312: case 3313: case 3314: case 3315: case 3316: case 3317: case 3318: case 3319: case 3320: case 3321: case 3322: case 3323: case 3324: case 3325: case 3326: case 3327: case 3328: case 3329: case 3330: case 3331: case 3332: case 3333: case 3334: case 3335: case 3336: case 3337: case 3338: case 3339: case 3340: case 3341: case 3342: case 3343: case 3344: case 3345: case 3346: case 3347: case 3348: case 3349: case 3350: case 3351: case 3352: case 3353: return East::None;\n\t\t\t\tcase 2490: case 2491: case 2492: case 2493: case 2494: case 2495: case 2496: case 2497: case 2498: case 2499: case 2500: case 2501: case 2502: case 2503: case 2504: case 2505: case 2506: case 2507: case 2508: case 2509: case 2510: case 2511: case 2512: case 2513: case 2514: case 2515: case 2516: case 2517: case 2518: case 2519: case 2520: case 2521: case 2522: case 2523: case 2524: case 2525: case 2526: case 2527: case 2528: case 2529: case 2530: case 2531: case 2532: case 2533: case 2534: case 2535: case 2536: case 2537: case 2538: case 2539: case 2540: case 2541: case 2542: case 2543: case 2544: case 2545: case 2546: case 2547: case 2548: case 2549: case 2550: case 2551: case 2552: case 2553: case 2554: case 2555: case 2556: case 2557: case 2558: case 2559: case 2560: case 2561: case 2562: case 2563: case 2564: case 2565: case 2566: case 2567: case 2568: case 2569: case 2570: case 2571: case 2572: case 2573: case 2574: case 2575: case 2576: case 2577: case 2578: case 2579: case 2580: case 2581: case 2582: case 2583: case 2584: case 2585: case 2586: case 2587: case 2588: case 2589: case 2590: case 2591: case 2592: case 2593: case 2594: case 2595: case 2596: case 2597: case 2598: case 2599: case 2600: case 2601: case 2602: case 2603: case 2604: case 2605: case 2606: case 2607: case 2608: case 2609: case 2610: case 2611: case 2612: case 2613: case 2614: case 2615: case 2616: case 2617: case 2618: case 2619: case 2620: case 2621: case 2622: case 2623: case 2624: case 2625: case 2626: case 2627: case 2628: case 2629: case 2630: case 2631: case 2632: case 2633: case 2634: case 2635: case 2636: case 2637: case 2638: case 2639: case 2640: case 2641: case 2642: case 2643: case 2644: case 2645: case 2646: case 2647: case 2648: case 2649: case 2650: case 2651: case 2652: case 2653: case 2654: case 2655: case 2656: case 2657: case 2658: case 2659: case 2660: case 2661: case 2662: case 2663: case 2664: case 2665: case 2666: case 2667: case 2668: case 2669: case 2670: case 2671: case 2672: case 2673: case 2674: case 2675: case 2676: case 2677: case 2678: case 2679: case 2680: case 2681: case 2682: case 2683: case 2684: case 2685: case 2686: case 2687: case 2688: case 2689: case 2690: case 2691: case 2692: case 2693: case 2694: case 2695: case 2696: case 2697: case 2698: case 2699: case 2700: case 2701: case 2702: case 2703: case 2704: case 2705: case 2706: case 2707: case 2708: case 2709: case 2710: case 2711: case 2712: case 2713: case 2714: case 2715: case 2716: case 2717: case 2718: case 2719: case 2720: case 2721: case 2722: case 2723: case 2724: case 2725: case 2726: case 2727: case 2728: case 2729: case 2730: case 2731: case 2732: case 2733: case 2734: case 2735: case 2736: case 2737: case 2738: case 2739: case 2740: case 2741: case 2742: case 2743: case 2744: case 2745: case 2746: case 2747: case 2748: case 2749: case 2750: case 2751: case 2752: case 2753: case 2754: case 2755: case 2756: case 2757: case 2758: case 2759: case 2760: case 2761: case 2762: case 2763: case 2764: case 2765: case 2766: case 2767: case 2768: case 2769: case 2770: case 2771: case 2772: case 2773: case 2774: case 2775: case 2776: case 2777: case 2778: case 2779: case 2780: case 2781: case 2782: case 2783: case 2784: case 2785: case 2786: case 2787: case 2788: case 2789: case 2790: case 2791: case 2792: case 2793: case 2794: case 2795: case 2796: case 2797: case 2798: case 2799: case 2800: case 2801: case 2802: case 2803: case 2804: case 2805: case 2806: case 2807: case 2808: case 2809: case 2810: case 2811: case 2812: case 2813: case 2814: case 2815: case 2816: case 2817: case 2818: case 2819: case 2820: case 2821: case 2822: case 2823: case 2824: case 2825: case 2826: case 2827: case 2828: case 2829: case 2830: case 2831: case 2832: case 2833: case 2834: case 2835: case 2836: case 2837: case 2838: case 2839: case 2840: case 2841: case 2842: case 2843: case 2844: case 2845: case 2846: case 2847: case 2848: case 2849: case 2850: case 2851: case 2852: case 2853: case 2854: case 2855: case 2856: case 2857: case 2858: case 2859: case 2860: case 2861: case 2862: case 2863: case 2864: case 2865: case 2866: case 2867: case 2868: case 2869: case 2870: case 2871: case 2872: case 2873: case 2874: case 2875: case 2876: case 2877: case 2878: case 2879: case 2880: case 2881: case 2882: case 2883: case 2884: case 2885: case 2886: case 2887: case 2888: case 2889: case 2890: case 2891: case 2892: case 2893: case 2894: case 2895: case 2896: case 2897: case 2898: case 2899: case 2900: case 2901: case 2902: case 2903: case 2904: case 2905: case 2906: case 2907: case 2908: case 2909: case 2910: case 2911: case 2912: case 2913: case 2914: case 2915: case 2916: case 2917: case 2918: case 2919: case 2920: case 2921: return East::Side;\n\t\t\t\tdefault: return East::Up;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 2346: case 2347: case 2348: case 2349: case 2350: case 2351: case 2352: case 2353: case 2354: case 2355: case 2356: case 2357: case 2358: case 2359: case 2360: case 2361: case 2362: case 2363: case 2364: case 2365: case 2366: case 2367: case 2368: case 2369: case 2370: case 2371: case 2372: case 2373: case 2374: case 2375: case 2376: case 2377: case 2378: case 2379: case 2380: case 2381: case 2382: case 2383: case 2384: case 2385: case 2386: case 2387: case 2388: case 2389: case 2390: case 2391: case 2392: case 2393: case 2394: case 2395: case 2396: case 2397: case 2398: case 2399: case 2400: case 2401: case 2402: case 2403: case 2404: case 2405: case 2406: case 2407: case 2408: case 2409: case 2410: case 2411: case 2412: case 2413: case 2414: case 2415: case 2416: case 2417: case 2418: case 2419: case 2420: case 2421: case 2422: case 2423: case 2424: case 2425: case 2426: case 2427: case 2428: case 2429: case 2430: case 2431: case 2432: case 2433: case 2434: case 2435: case 2436: case 2437: case 2438: case 2439: case 2440: case 2441: case 2442: case 2443: case 2444: case 2445: case 2446: case 2447: case 2448: case 2449: case 2450: case 2451: case 2452: case 2453: case 2454: case 2455: case 2456: case 2457: case 2458: case 2459: case 2460: case 2461: case 2462: case 2463: case 2464: case 2465: case 2466: case 2467: case 2468: case 2469: case 2470: case 2471: case 2472: case 2473: case 2474: case 2475: case 2476: case 2477: case 2478: case 2479: case 2480: case 2481: case 2482: case 2483: case 2484: case 2485: case 2486: case 2487: case 2488: case 2489: case 2778: case 2779: case 2780: case 2781: case 2782: case 2783: case 2784: case 2785: case 2786: case 2787: case 2788: case 2789: case 2790: case 2791: case 2792: case 2793: case 2794: case 2795: case 2796: case 2797: case 2798: case 2799: case 2800: case 2801: case 2802: case 2803: case 2804: case 2805: case 2806: case 2807: case 2808: case 2809: case 2810: case 2811: case 2812: case 2813: case 2814: case 2815: case 2816: case 2817: case 2818: case 2819: case 2820: case 2821: case 2822: case 2823: case 2824: case 2825: case 2826: case 2827: case 2828: case 2829: case 2830: case 2831: case 2832: case 2833: case 2834: case 2835: case 2836: case 2837: case 2838: case 2839: case 2840: case 2841: case 2842: case 2843: case 2844: case 2845: case 2846: case 2847: case 2848: case 2849: case 2850: case 2851: case 2852: case 2853: case 2854: case 2855: case 2856: case 2857: case 2858: case 2859: case 2860: case 2861: case 2862: case 2863: case 2864: case 2865: case 2866: case 2867: case 2868: case 2869: case 2870: case 2871: case 2872: case 2873: case 2874: case 2875: case 2876: case 2877: case 2878: case 2879: case 2880: case 2881: case 2882: case 2883: case 2884: case 2885: case 2886: case 2887: case 2888: case 2889: case 2890: case 2891: case 2892: case 2893: case 2894: case 2895: case 2896: case 2897: case 2898: case 2899: case 2900: case 2901: case 2902: case 2903: case 2904: case 2905: case 2906: case 2907: case 2908: case 2909: case 2910: case 2911: case 2912: case 2913: case 2914: case 2915: case 2916: case 2917: case 2918: case 2919: case 2920: case 2921: case 3210: case 3211: case 3212: case 3213: case 3214: case 3215: case 3216: case 3217: case 3218: case 3219: case 3220: case 3221: case 3222: case 3223: case 3224: case 3225: case 3226: case 3227: case 3228: case 3229: case 3230: case 3231: case 3232: case 3233: case 3234: case 3235: case 3236: case 3237: case 3238: case 3239: case 3240: case 3241: case 3242: case 3243: case 3244: case 3245: case 3246: case 3247: case 3248: case 3249: case 3250: case 3251: case 3252: case 3253: case 3254: case 3255: case 3256: case 3257: case 3258: case 3259: case 3260: case 3261: case 3262: case 3263: case 3264: case 3265: case 3266: case 3267: case 3268: case 3269: case 3270: case 3271: case 3272: case 3273: case 3274: case 3275: case 3276: case 3277: case 3278: case 3279: case 3280: case 3281: case 3282: case 3283: case 3284: case 3285: case 3286: case 3287: case 3288: case 3289: case 3290: case 3291: case 3292: case 3293: case 3294: case 3295: case 3296: case 3297: case 3298: case 3299: case 3300: case 3301: case 3302: case 3303: case 3304: case 3305: case 3306: case 3307: case 3308: case 3309: case 3310: case 3311: case 3312: case 3313: case 3314: case 3315: case 3316: case 3317: case 3318: case 3319: case 3320: case 3321: case 3322: case 3323: case 3324: case 3325: case 3326: case 3327: case 3328: case 3329: case 3330: case 3331: case 3332: case 3333: case 3334: case 3335: case 3336: case 3337: case 3338: case 3339: case 3340: case 3341: case 3342: case 3343: case 3344: case 3345: case 3346: case 3347: case 3348: case 3349: case 3350: case 3351: case 3352: case 3353: return North::None;\n\t\t\t\tcase 2202: case 2203: case 2204: case 2205: case 2206: case 2207: case 2208: case 2209: case 2210: case 2211: case 2212: case 2213: case 2214: case 2215: case 2216: case 2217: case 2218: case 2219: case 2220: case 2221: case 2222: case 2223: case 2224: case 2225: case 2226: case 2227: case 2228: case 2229: case 2230: case 2231: case 2232: case 2233: case 2234: case 2235: case 2236: case 2237: case 2238: case 2239: case 2240: case 2241: case 2242: case 2243: case 2244: case 2245: case 2246: case 2247: case 2248: case 2249: case 2250: case 2251: case 2252: case 2253: case 2254: case 2255: case 2256: case 2257: case 2258: case 2259: case 2260: case 2261: case 2262: case 2263: case 2264: case 2265: case 2266: case 2267: case 2268: case 2269: case 2270: case 2271: case 2272: case 2273: case 2274: case 2275: case 2276: case 2277: case 2278: case 2279: case 2280: case 2281: case 2282: case 2283: case 2284: case 2285: case 2286: case 2287: case 2288: case 2289: case 2290: case 2291: case 2292: case 2293: case 2294: case 2295: case 2296: case 2297: case 2298: case 2299: case 2300: case 2301: case 2302: case 2303: case 2304: case 2305: case 2306: case 2307: case 2308: case 2309: case 2310: case 2311: case 2312: case 2313: case 2314: case 2315: case 2316: case 2317: case 2318: case 2319: case 2320: case 2321: case 2322: case 2323: case 2324: case 2325: case 2326: case 2327: case 2328: case 2329: case 2330: case 2331: case 2332: case 2333: case 2334: case 2335: case 2336: case 2337: case 2338: case 2339: case 2340: case 2341: case 2342: case 2343: case 2344: case 2345: case 2634: case 2635: case 2636: case 2637: case 2638: case 2639: case 2640: case 2641: case 2642: case 2643: case 2644: case 2645: case 2646: case 2647: case 2648: case 2649: case 2650: case 2651: case 2652: case 2653: case 2654: case 2655: case 2656: case 2657: case 2658: case 2659: case 2660: case 2661: case 2662: case 2663: case 2664: case 2665: case 2666: case 2667: case 2668: case 2669: case 2670: case 2671: case 2672: case 2673: case 2674: case 2675: case 2676: case 2677: case 2678: case 2679: case 2680: case 2681: case 2682: case 2683: case 2684: case 2685: case 2686: case 2687: case 2688: case 2689: case 2690: case 2691: case 2692: case 2693: case 2694: case 2695: case 2696: case 2697: case 2698: case 2699: case 2700: case 2701: case 2702: case 2703: case 2704: case 2705: case 2706: case 2707: case 2708: case 2709: case 2710: case 2711: case 2712: case 2713: case 2714: case 2715: case 2716: case 2717: case 2718: case 2719: case 2720: case 2721: case 2722: case 2723: case 2724: case 2725: case 2726: case 2727: case 2728: case 2729: case 2730: case 2731: case 2732: case 2733: case 2734: case 2735: case 2736: case 2737: case 2738: case 2739: case 2740: case 2741: case 2742: case 2743: case 2744: case 2745: case 2746: case 2747: case 2748: case 2749: case 2750: case 2751: case 2752: case 2753: case 2754: case 2755: case 2756: case 2757: case 2758: case 2759: case 2760: case 2761: case 2762: case 2763: case 2764: case 2765: case 2766: case 2767: case 2768: case 2769: case 2770: case 2771: case 2772: case 2773: case 2774: case 2775: case 2776: case 2777: case 3066: case 3067: case 3068: case 3069: case 3070: case 3071: case 3072: case 3073: case 3074: case 3075: case 3076: case 3077: case 3078: case 3079: case 3080: case 3081: case 3082: case 3083: case 3084: case 3085: case 3086: case 3087: case 3088: case 3089: case 3090: case 3091: case 3092: case 3093: case 3094: case 3095: case 3096: case 3097: case 3098: case 3099: case 3100: case 3101: case 3102: case 3103: case 3104: case 3105: case 3106: case 3107: case 3108: case 3109: case 3110: case 3111: case 3112: case 3113: case 3114: case 3115: case 3116: case 3117: case 3118: case 3119: case 3120: case 3121: case 3122: case 3123: case 3124: case 3125: case 3126: case 3127: case 3128: case 3129: case 3130: case 3131: case 3132: case 3133: case 3134: case 3135: case 3136: case 3137: case 3138: case 3139: case 3140: case 3141: case 3142: case 3143: case 3144: case 3145: case 3146: case 3147: case 3148: case 3149: case 3150: case 3151: case 3152: case 3153: case 3154: case 3155: case 3156: case 3157: case 3158: case 3159: case 3160: case 3161: case 3162: case 3163: case 3164: case 3165: case 3166: case 3167: case 3168: case 3169: case 3170: case 3171: case 3172: case 3173: case 3174: case 3175: case 3176: case 3177: case 3178: case 3179: case 3180: case 3181: case 3182: case 3183: case 3184: case 3185: case 3186: case 3187: case 3188: case 3189: case 3190: case 3191: case 3192: case 3193: case 3194: case 3195: case 3196: case 3197: case 3198: case 3199: case 3200: case 3201: case 3202: case 3203: case 3204: case 3205: case 3206: case 3207: case 3208: case 3209: return North::Side;\n\t\t\t\tdefault: return North::Up;\n\t\t\t}\n\t\t}\n\t\tunsigned char Power(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 2058: case 2059: case 2060: case 2061: case 2062: case 2063: case 2064: case 2065: case 2066: case 2202: case 2203: case 2204: case 2205: case 2206: case 2207: case 2208: case 2209: case 2210: case 2346: case 2347: case 2348: case 2349: case 2350: case 2351: case 2352: case 2353: case 2354: case 2490: case 2491: case 2492: case 2493: case 2494: case 2495: case 2496: case 2497: case 2498: case 2634: case 2635: case 2636: case 2637: case 2638: case 2639: case 2640: case 2641: case 2642: case 2778: case 2779: case 2780: case 2781: case 2782: case 2783: case 2784: case 2785: case 2786: case 2922: case 2923: case 2924: case 2925: case 2926: case 2927: case 2928: case 2929: case 2930: case 3066: case 3067: case 3068: case 3069: case 3070: case 3071: case 3072: case 3073: case 3074: case 3210: case 3211: case 3212: case 3213: case 3214: case 3215: case 3216: case 3217: case 3218: return 0;\n\t\t\t\tcase 2067: case 2068: case 2069: case 2070: case 2071: case 2072: case 2073: case 2074: case 2075: case 2211: case 2212: case 2213: case 2214: case 2215: case 2216: case 2217: case 2218: case 2219: case 2355: case 2356: case 2357: case 2358: case 2359: case 2360: case 2361: case 2362: case 2363: case 2499: case 2500: case 2501: case 2502: case 2503: case 2504: case 2505: case 2506: case 2507: case 2643: case 2644: case 2645: case 2646: case 2647: case 2648: case 2649: case 2650: case 2651: case 2787: case 2788: case 2789: case 2790: case 2791: case 2792: case 2793: case 2794: case 2795: case 2931: case 2932: case 2933: case 2934: case 2935: case 2936: case 2937: case 2938: case 2939: case 3075: case 3076: case 3077: case 3078: case 3079: case 3080: case 3081: case 3082: case 3083: case 3219: case 3220: case 3221: case 3222: case 3223: case 3224: case 3225: case 3226: case 3227: return 1;\n\t\t\t\tcase 2148: case 2149: case 2150: case 2151: case 2152: case 2153: case 2154: case 2155: case 2156: case 2292: case 2293: case 2294: case 2295: case 2296: case 2297: case 2298: case 2299: case 2300: case 2436: case 2437: case 2438: case 2439: case 2440: case 2441: case 2442: case 2443: case 2444: case 2580: case 2581: case 2582: case 2583: case 2584: case 2585: case 2586: case 2587: case 2588: case 2724: case 2725: case 2726: case 2727: case 2728: case 2729: case 2730: case 2731: case 2732: case 2868: case 2869: case 2870: case 2871: case 2872: case 2873: case 2874: case 2875: case 2876: case 3012: case 3013: case 3014: case 3015: case 3016: case 3017: case 3018: case 3019: case 3020: case 3156: case 3157: case 3158: case 3159: case 3160: case 3161: case 3162: case 3163: case 3164: case 3300: case 3301: case 3302: case 3303: case 3304: case 3305: case 3306: case 3307: case 3308: return 10;\n\t\t\t\tcase 2157: case 2158: case 2159: case 2160: case 2161: case 2162: case 2163: case 2164: case 2165: case 2301: case 2302: case 2303: case 2304: case 2305: case 2306: case 2307: case 2308: case 2309: case 2445: case 2446: case 2447: case 2448: case 2449: case 2450: case 2451: case 2452: case 2453: case 2589: case 2590: case 2591: case 2592: case 2593: case 2594: case 2595: case 2596: case 2597: case 2733: case 2734: case 2735: case 2736: case 2737: case 2738: case 2739: case 2740: case 2741: case 2877: case 2878: case 2879: case 2880: case 2881: case 2882: case 2883: case 2884: case 2885: case 3021: case 3022: case 3023: case 3024: case 3025: case 3026: case 3027: case 3028: case 3029: case 3165: case 3166: case 3167: case 3168: case 3169: case 3170: case 3171: case 3172: case 3173: case 3309: case 3310: case 3311: case 3312: case 3313: case 3314: case 3315: case 3316: case 3317: return 11;\n\t\t\t\tcase 2166: case 2167: case 2168: case 2169: case 2170: case 2171: case 2172: case 2173: case 2174: case 2310: case 2311: case 2312: case 2313: case 2314: case 2315: case 2316: case 2317: case 2318: case 2454: case 2455: case 2456: case 2457: case 2458: case 2459: case 2460: case 2461: case 2462: case 2598: case 2599: case 2600: case 2601: case 2602: case 2603: case 2604: case 2605: case 2606: case 2742: case 2743: case 2744: case 2745: case 2746: case 2747: case 2748: case 2749: case 2750: case 2886: case 2887: case 2888: case 2889: case 2890: case 2891: case 2892: case 2893: case 2894: case 3030: case 3031: case 3032: case 3033: case 3034: case 3035: case 3036: case 3037: case 3038: case 3174: case 3175: case 3176: case 3177: case 3178: case 3179: case 3180: case 3181: case 3182: case 3318: case 3319: case 3320: case 3321: case 3322: case 3323: case 3324: case 3325: case 3326: return 12;\n\t\t\t\tcase 2175: case 2176: case 2177: case 2178: case 2179: case 2180: case 2181: case 2182: case 2183: case 2319: case 2320: case 2321: case 2322: case 2323: case 2324: case 2325: case 2326: case 2327: case 2463: case 2464: case 2465: case 2466: case 2467: case 2468: case 2469: case 2470: case 2471: case 2607: case 2608: case 2609: case 2610: case 2611: case 2612: case 2613: case 2614: case 2615: case 2751: case 2752: case 2753: case 2754: case 2755: case 2756: case 2757: case 2758: case 2759: case 2895: case 2896: case 2897: case 2898: case 2899: case 2900: case 2901: case 2902: case 2903: case 3039: case 3040: case 3041: case 3042: case 3043: case 3044: case 3045: case 3046: case 3047: case 3183: case 3184: case 3185: case 3186: case 3187: case 3188: case 3189: case 3190: case 3191: case 3327: case 3328: case 3329: case 3330: case 3331: case 3332: case 3333: case 3334: case 3335: return 13;\n\t\t\t\tcase 2184: case 2185: case 2186: case 2187: case 2188: case 2189: case 2190: case 2191: case 2192: case 2328: case 2329: case 2330: case 2331: case 2332: case 2333: case 2334: case 2335: case 2336: case 2472: case 2473: case 2474: case 2475: case 2476: case 2477: case 2478: case 2479: case 2480: case 2616: case 2617: case 2618: case 2619: case 2620: case 2621: case 2622: case 2623: case 2624: case 2760: case 2761: case 2762: case 2763: case 2764: case 2765: case 2766: case 2767: case 2768: case 2904: case 2905: case 2906: case 2907: case 2908: case 2909: case 2910: case 2911: case 2912: case 3048: case 3049: case 3050: case 3051: case 3052: case 3053: case 3054: case 3055: case 3056: case 3192: case 3193: case 3194: case 3195: case 3196: case 3197: case 3198: case 3199: case 3200: case 3336: case 3337: case 3338: case 3339: case 3340: case 3341: case 3342: case 3343: case 3344: return 14;\n\t\t\t\tcase 2193: case 2194: case 2195: case 2196: case 2197: case 2198: case 2199: case 2200: case 2201: case 2337: case 2338: case 2339: case 2340: case 2341: case 2342: case 2343: case 2344: case 2345: case 2481: case 2482: case 2483: case 2484: case 2485: case 2486: case 2487: case 2488: case 2489: case 2625: case 2626: case 2627: case 2628: case 2629: case 2630: case 2631: case 2632: case 2633: case 2769: case 2770: case 2771: case 2772: case 2773: case 2774: case 2775: case 2776: case 2777: case 2913: case 2914: case 2915: case 2916: case 2917: case 2918: case 2919: case 2920: case 2921: case 3057: case 3058: case 3059: case 3060: case 3061: case 3062: case 3063: case 3064: case 3065: case 3201: case 3202: case 3203: case 3204: case 3205: case 3206: case 3207: case 3208: case 3209: case 3345: case 3346: case 3347: case 3348: case 3349: case 3350: case 3351: case 3352: case 3353: return 15;\n\t\t\t\tcase 2076: case 2077: case 2078: case 2079: case 2080: case 2081: case 2082: case 2083: case 2084: case 2220: case 2221: case 2222: case 2223: case 2224: case 2225: case 2226: case 2227: case 2228: case 2364: case 2365: case 2366: case 2367: case 2368: case 2369: case 2370: case 2371: case 2372: case 2508: case 2509: case 2510: case 2511: case 2512: case 2513: case 2514: case 2515: case 2516: case 2652: case 2653: case 2654: case 2655: case 2656: case 2657: case 2658: case 2659: case 2660: case 2796: case 2797: case 2798: case 2799: case 2800: case 2801: case 2802: case 2803: case 2804: case 2940: case 2941: case 2942: case 2943: case 2944: case 2945: case 2946: case 2947: case 2948: case 3084: case 3085: case 3086: case 3087: case 3088: case 3089: case 3090: case 3091: case 3092: case 3228: case 3229: case 3230: case 3231: case 3232: case 3233: case 3234: case 3235: case 3236: return 2;\n\t\t\t\tcase 2085: case 2086: case 2087: case 2088: case 2089: case 2090: case 2091: case 2092: case 2093: case 2229: case 2230: case 2231: case 2232: case 2233: case 2234: case 2235: case 2236: case 2237: case 2373: case 2374: case 2375: case 2376: case 2377: case 2378: case 2379: case 2380: case 2381: case 2517: case 2518: case 2519: case 2520: case 2521: case 2522: case 2523: case 2524: case 2525: case 2661: case 2662: case 2663: case 2664: case 2665: case 2666: case 2667: case 2668: case 2669: case 2805: case 2806: case 2807: case 2808: case 2809: case 2810: case 2811: case 2812: case 2813: case 2949: case 2950: case 2951: case 2952: case 2953: case 2954: case 2955: case 2956: case 2957: case 3093: case 3094: case 3095: case 3096: case 3097: case 3098: case 3099: case 3100: case 3101: case 3237: case 3238: case 3239: case 3240: case 3241: case 3242: case 3243: case 3244: case 3245: return 3;\n\t\t\t\tcase 2094: case 2095: case 2096: case 2097: case 2098: case 2099: case 2100: case 2101: case 2102: case 2238: case 2239: case 2240: case 2241: case 2242: case 2243: case 2244: case 2245: case 2246: case 2382: case 2383: case 2384: case 2385: case 2386: case 2387: case 2388: case 2389: case 2390: case 2526: case 2527: case 2528: case 2529: case 2530: case 2531: case 2532: case 2533: case 2534: case 2670: case 2671: case 2672: case 2673: case 2674: case 2675: case 2676: case 2677: case 2678: case 2814: case 2815: case 2816: case 2817: case 2818: case 2819: case 2820: case 2821: case 2822: case 2958: case 2959: case 2960: case 2961: case 2962: case 2963: case 2964: case 2965: case 2966: case 3102: case 3103: case 3104: case 3105: case 3106: case 3107: case 3108: case 3109: case 3110: case 3246: case 3247: case 3248: case 3249: case 3250: case 3251: case 3252: case 3253: case 3254: return 4;\n\t\t\t\tcase 2103: case 2104: case 2105: case 2106: case 2107: case 2108: case 2109: case 2110: case 2111: case 2247: case 2248: case 2249: case 2250: case 2251: case 2252: case 2253: case 2254: case 2255: case 2391: case 2392: case 2393: case 2394: case 2395: case 2396: case 2397: case 2398: case 2399: case 2535: case 2536: case 2537: case 2538: case 2539: case 2540: case 2541: case 2542: case 2543: case 2679: case 2680: case 2681: case 2682: case 2683: case 2684: case 2685: case 2686: case 2687: case 2823: case 2824: case 2825: case 2826: case 2827: case 2828: case 2829: case 2830: case 2831: case 2967: case 2968: case 2969: case 2970: case 2971: case 2972: case 2973: case 2974: case 2975: case 3111: case 3112: case 3113: case 3114: case 3115: case 3116: case 3117: case 3118: case 3119: case 3255: case 3256: case 3257: case 3258: case 3259: case 3260: case 3261: case 3262: case 3263: return 5;\n\t\t\t\tcase 2112: case 2113: case 2114: case 2115: case 2116: case 2117: case 2118: case 2119: case 2120: case 2256: case 2257: case 2258: case 2259: case 2260: case 2261: case 2262: case 2263: case 2264: case 2400: case 2401: case 2402: case 2403: case 2404: case 2405: case 2406: case 2407: case 2408: case 2544: case 2545: case 2546: case 2547: case 2548: case 2549: case 2550: case 2551: case 2552: case 2688: case 2689: case 2690: case 2691: case 2692: case 2693: case 2694: case 2695: case 2696: case 2832: case 2833: case 2834: case 2835: case 2836: case 2837: case 2838: case 2839: case 2840: case 2976: case 2977: case 2978: case 2979: case 2980: case 2981: case 2982: case 2983: case 2984: case 3120: case 3121: case 3122: case 3123: case 3124: case 3125: case 3126: case 3127: case 3128: case 3264: case 3265: case 3266: case 3267: case 3268: case 3269: case 3270: case 3271: case 3272: return 6;\n\t\t\t\tcase 2121: case 2122: case 2123: case 2124: case 2125: case 2126: case 2127: case 2128: case 2129: case 2265: case 2266: case 2267: case 2268: case 2269: case 2270: case 2271: case 2272: case 2273: case 2409: case 2410: case 2411: case 2412: case 2413: case 2414: case 2415: case 2416: case 2417: case 2553: case 2554: case 2555: case 2556: case 2557: case 2558: case 2559: case 2560: case 2561: case 2697: case 2698: case 2699: case 2700: case 2701: case 2702: case 2703: case 2704: case 2705: case 2841: case 2842: case 2843: case 2844: case 2845: case 2846: case 2847: case 2848: case 2849: case 2985: case 2986: case 2987: case 2988: case 2989: case 2990: case 2991: case 2992: case 2993: case 3129: case 3130: case 3131: case 3132: case 3133: case 3134: case 3135: case 3136: case 3137: case 3273: case 3274: case 3275: case 3276: case 3277: case 3278: case 3279: case 3280: case 3281: return 7;\n\t\t\t\tcase 2130: case 2131: case 2132: case 2133: case 2134: case 2135: case 2136: case 2137: case 2138: case 2274: case 2275: case 2276: case 2277: case 2278: case 2279: case 2280: case 2281: case 2282: case 2418: case 2419: case 2420: case 2421: case 2422: case 2423: case 2424: case 2425: case 2426: case 2562: case 2563: case 2564: case 2565: case 2566: case 2567: case 2568: case 2569: case 2570: case 2706: case 2707: case 2708: case 2709: case 2710: case 2711: case 2712: case 2713: case 2714: case 2850: case 2851: case 2852: case 2853: case 2854: case 2855: case 2856: case 2857: case 2858: case 2994: case 2995: case 2996: case 2997: case 2998: case 2999: case 3000: case 3001: case 3002: case 3138: case 3139: case 3140: case 3141: case 3142: case 3143: case 3144: case 3145: case 3146: case 3282: case 3283: case 3284: case 3285: case 3286: case 3287: case 3288: case 3289: case 3290: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 2064: case 2065: case 2066: case 2073: case 2074: case 2075: case 2082: case 2083: case 2084: case 2091: case 2092: case 2093: case 2100: case 2101: case 2102: case 2109: case 2110: case 2111: case 2118: case 2119: case 2120: case 2127: case 2128: case 2129: case 2136: case 2137: case 2138: case 2145: case 2146: case 2147: case 2154: case 2155: case 2156: case 2163: case 2164: case 2165: case 2172: case 2173: case 2174: case 2181: case 2182: case 2183: case 2190: case 2191: case 2192: case 2199: case 2200: case 2201: case 2208: case 2209: case 2210: case 2217: case 2218: case 2219: case 2226: case 2227: case 2228: case 2235: case 2236: case 2237: case 2244: case 2245: case 2246: case 2253: case 2254: case 2255: case 2262: case 2263: case 2264: case 2271: case 2272: case 2273: case 2280: case 2281: case 2282: case 2289: case 2290: case 2291: case 2298: case 2299: case 2300: case 2307: case 2308: case 2309: case 2316: case 2317: case 2318: case 2325: case 2326: case 2327: case 2334: case 2335: case 2336: case 2343: case 2344: case 2345: case 2352: case 2353: case 2354: case 2361: case 2362: case 2363: case 2370: case 2371: case 2372: case 2379: case 2380: case 2381: case 2388: case 2389: case 2390: case 2397: case 2398: case 2399: case 2406: case 2407: case 2408: case 2415: case 2416: case 2417: case 2424: case 2425: case 2426: case 2433: case 2434: case 2435: case 2442: case 2443: case 2444: case 2451: case 2452: case 2453: case 2460: case 2461: case 2462: case 2469: case 2470: case 2471: case 2478: case 2479: case 2480: case 2487: case 2488: case 2489: case 2496: case 2497: case 2498: case 2505: case 2506: case 2507: case 2514: case 2515: case 2516: case 2523: case 2524: case 2525: case 2532: case 2533: case 2534: case 2541: case 2542: case 2543: case 2550: case 2551: case 2552: case 2559: case 2560: case 2561: case 2568: case 2569: case 2570: case 2577: case 2578: case 2579: case 2586: case 2587: case 2588: case 2595: case 2596: case 2597: case 2604: case 2605: case 2606: case 2613: case 2614: case 2615: case 2622: case 2623: case 2624: case 2631: case 2632: case 2633: case 2640: case 2641: case 2642: case 2649: case 2650: case 2651: case 2658: case 2659: case 2660: case 2667: case 2668: case 2669: case 2676: case 2677: case 2678: case 2685: case 2686: case 2687: case 2694: case 2695: case 2696: case 2703: case 2704: case 2705: case 2712: case 2713: case 2714: case 2721: case 2722: case 2723: case 2730: case 2731: case 2732: case 2739: case 2740: case 2741: case 2748: case 2749: case 2750: case 2757: case 2758: case 2759: case 2766: case 2767: case 2768: case 2775: case 2776: case 2777: case 2784: case 2785: case 2786: case 2793: case 2794: case 2795: case 2802: case 2803: case 2804: case 2811: case 2812: case 2813: case 2820: case 2821: case 2822: case 2829: case 2830: case 2831: case 2838: case 2839: case 2840: case 2847: case 2848: case 2849: case 2856: case 2857: case 2858: case 2865: case 2866: case 2867: case 2874: case 2875: case 2876: case 2883: case 2884: case 2885: case 2892: case 2893: case 2894: case 2901: case 2902: case 2903: case 2910: case 2911: case 2912: case 2919: case 2920: case 2921: case 2928: case 2929: case 2930: case 2937: case 2938: case 2939: case 2946: case 2947: case 2948: case 2955: case 2956: case 2957: case 2964: case 2965: case 2966: case 2973: case 2974: case 2975: case 2982: case 2983: case 2984: case 2991: case 2992: case 2993: case 3000: case 3001: case 3002: case 3009: case 3010: case 3011: case 3018: case 3019: case 3020: case 3027: case 3028: case 3029: case 3036: case 3037: case 3038: case 3045: case 3046: case 3047: case 3054: case 3055: case 3056: case 3063: case 3064: case 3065: case 3072: case 3073: case 3074: case 3081: case 3082: case 3083: case 3090: case 3091: case 3092: case 3099: case 3100: case 3101: case 3108: case 3109: case 3110: case 3117: case 3118: case 3119: case 3126: case 3127: case 3128: case 3135: case 3136: case 3137: case 3144: case 3145: case 3146: case 3153: case 3154: case 3155: case 3162: case 3163: case 3164: case 3171: case 3172: case 3173: case 3180: case 3181: case 3182: case 3189: case 3190: case 3191: case 3198: case 3199: case 3200: case 3207: case 3208: case 3209: case 3216: case 3217: case 3218: case 3225: case 3226: case 3227: case 3234: case 3235: case 3236: case 3243: case 3244: case 3245: case 3252: case 3253: case 3254: case 3261: case 3262: case 3263: case 3270: case 3271: case 3272: case 3279: case 3280: case 3281: case 3288: case 3289: case 3290: case 3297: case 3298: case 3299: case 3306: case 3307: case 3308: case 3315: case 3316: case 3317: case 3324: case 3325: case 3326: case 3333: case 3334: case 3335: case 3342: case 3343: case 3344: case 3351: case 3352: case 3353: return South::None;\n\t\t\t\tcase 2061: case 2062: case 2063: case 2070: case 2071: case 2072: case 2079: case 2080: case 2081: case 2088: case 2089: case 2090: case 2097: case 2098: case 2099: case 2106: case 2107: case 2108: case 2115: case 2116: case 2117: case 2124: case 2125: case 2126: case 2133: case 2134: case 2135: case 2142: case 2143: case 2144: case 2151: case 2152: case 2153: case 2160: case 2161: case 2162: case 2169: case 2170: case 2171: case 2178: case 2179: case 2180: case 2187: case 2188: case 2189: case 2196: case 2197: case 2198: case 2205: case 2206: case 2207: case 2214: case 2215: case 2216: case 2223: case 2224: case 2225: case 2232: case 2233: case 2234: case 2241: case 2242: case 2243: case 2250: case 2251: case 2252: case 2259: case 2260: case 2261: case 2268: case 2269: case 2270: case 2277: case 2278: case 2279: case 2286: case 2287: case 2288: case 2295: case 2296: case 2297: case 2304: case 2305: case 2306: case 2313: case 2314: case 2315: case 2322: case 2323: case 2324: case 2331: case 2332: case 2333: case 2340: case 2341: case 2342: case 2349: case 2350: case 2351: case 2358: case 2359: case 2360: case 2367: case 2368: case 2369: case 2376: case 2377: case 2378: case 2385: case 2386: case 2387: case 2394: case 2395: case 2396: case 2403: case 2404: case 2405: case 2412: case 2413: case 2414: case 2421: case 2422: case 2423: case 2430: case 2431: case 2432: case 2439: case 2440: case 2441: case 2448: case 2449: case 2450: case 2457: case 2458: case 2459: case 2466: case 2467: case 2468: case 2475: case 2476: case 2477: case 2484: case 2485: case 2486: case 2493: case 2494: case 2495: case 2502: case 2503: case 2504: case 2511: case 2512: case 2513: case 2520: case 2521: case 2522: case 2529: case 2530: case 2531: case 2538: case 2539: case 2540: case 2547: case 2548: case 2549: case 2556: case 2557: case 2558: case 2565: case 2566: case 2567: case 2574: case 2575: case 2576: case 2583: case 2584: case 2585: case 2592: case 2593: case 2594: case 2601: case 2602: case 2603: case 2610: case 2611: case 2612: case 2619: case 2620: case 2621: case 2628: case 2629: case 2630: case 2637: case 2638: case 2639: case 2646: case 2647: case 2648: case 2655: case 2656: case 2657: case 2664: case 2665: case 2666: case 2673: case 2674: case 2675: case 2682: case 2683: case 2684: case 2691: case 2692: case 2693: case 2700: case 2701: case 2702: case 2709: case 2710: case 2711: case 2718: case 2719: case 2720: case 2727: case 2728: case 2729: case 2736: case 2737: case 2738: case 2745: case 2746: case 2747: case 2754: case 2755: case 2756: case 2763: case 2764: case 2765: case 2772: case 2773: case 2774: case 2781: case 2782: case 2783: case 2790: case 2791: case 2792: case 2799: case 2800: case 2801: case 2808: case 2809: case 2810: case 2817: case 2818: case 2819: case 2826: case 2827: case 2828: case 2835: case 2836: case 2837: case 2844: case 2845: case 2846: case 2853: case 2854: case 2855: case 2862: case 2863: case 2864: case 2871: case 2872: case 2873: case 2880: case 2881: case 2882: case 2889: case 2890: case 2891: case 2898: case 2899: case 2900: case 2907: case 2908: case 2909: case 2916: case 2917: case 2918: case 2925: case 2926: case 2927: case 2934: case 2935: case 2936: case 2943: case 2944: case 2945: case 2952: case 2953: case 2954: case 2961: case 2962: case 2963: case 2970: case 2971: case 2972: case 2979: case 2980: case 2981: case 2988: case 2989: case 2990: case 2997: case 2998: case 2999: case 3006: case 3007: case 3008: case 3015: case 3016: case 3017: case 3024: case 3025: case 3026: case 3033: case 3034: case 3035: case 3042: case 3043: case 3044: case 3051: case 3052: case 3053: case 3060: case 3061: case 3062: case 3069: case 3070: case 3071: case 3078: case 3079: case 3080: case 3087: case 3088: case 3089: case 3096: case 3097: case 3098: case 3105: case 3106: case 3107: case 3114: case 3115: case 3116: case 3123: case 3124: case 3125: case 3132: case 3133: case 3134: case 3141: case 3142: case 3143: case 3150: case 3151: case 3152: case 3159: case 3160: case 3161: case 3168: case 3169: case 3170: case 3177: case 3178: case 3179: case 3186: case 3187: case 3188: case 3195: case 3196: case 3197: case 3204: case 3205: case 3206: case 3213: case 3214: case 3215: case 3222: case 3223: case 3224: case 3231: case 3232: case 3233: case 3240: case 3241: case 3242: case 3249: case 3250: case 3251: case 3258: case 3259: case 3260: case 3267: case 3268: case 3269: case 3276: case 3277: case 3278: case 3285: case 3286: case 3287: case 3294: case 3295: case 3296: case 3303: case 3304: case 3305: case 3312: case 3313: case 3314: case 3321: case 3322: case 3323: case 3330: case 3331: case 3332: case 3339: case 3340: case 3341: case 3348: case 3349: case 3350: return South::Side;\n\t\t\t\tdefault: return South::Up;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 2060: case 2063: case 2066: case 2069: case 2072: case 2075: case 2078: case 2081: case 2084: case 2087: case 2090: case 2093: case 2096: case 2099: case 2102: case 2105: case 2108: case 2111: case 2114: case 2117: case 2120: case 2123: case 2126: case 2129: case 2132: case 2135: case 2138: case 2141: case 2144: case 2147: case 2150: case 2153: case 2156: case 2159: case 2162: case 2165: case 2168: case 2171: case 2174: case 2177: case 2180: case 2183: case 2186: case 2189: case 2192: case 2195: case 2198: case 2201: case 2204: case 2207: case 2210: case 2213: case 2216: case 2219: case 2222: case 2225: case 2228: case 2231: case 2234: case 2237: case 2240: case 2243: case 2246: case 2249: case 2252: case 2255: case 2258: case 2261: case 2264: case 2267: case 2270: case 2273: case 2276: case 2279: case 2282: case 2285: case 2288: case 2291: case 2294: case 2297: case 2300: case 2303: case 2306: case 2309: case 2312: case 2315: case 2318: case 2321: case 2324: case 2327: case 2330: case 2333: case 2336: case 2339: case 2342: case 2345: case 2348: case 2351: case 2354: case 2357: case 2360: case 2363: case 2366: case 2369: case 2372: case 2375: case 2378: case 2381: case 2384: case 2387: case 2390: case 2393: case 2396: case 2399: case 2402: case 2405: case 2408: case 2411: case 2414: case 2417: case 2420: case 2423: case 2426: case 2429: case 2432: case 2435: case 2438: case 2441: case 2444: case 2447: case 2450: case 2453: case 2456: case 2459: case 2462: case 2465: case 2468: case 2471: case 2474: case 2477: case 2480: case 2483: case 2486: case 2489: case 2492: case 2495: case 2498: case 2501: case 2504: case 2507: case 2510: case 2513: case 2516: case 2519: case 2522: case 2525: case 2528: case 2531: case 2534: case 2537: case 2540: case 2543: case 2546: case 2549: case 2552: case 2555: case 2558: case 2561: case 2564: case 2567: case 2570: case 2573: case 2576: case 2579: case 2582: case 2585: case 2588: case 2591: case 2594: case 2597: case 2600: case 2603: case 2606: case 2609: case 2612: case 2615: case 2618: case 2621: case 2624: case 2627: case 2630: case 2633: case 2636: case 2639: case 2642: case 2645: case 2648: case 2651: case 2654: case 2657: case 2660: case 2663: case 2666: case 2669: case 2672: case 2675: case 2678: case 2681: case 2684: case 2687: case 2690: case 2693: case 2696: case 2699: case 2702: case 2705: case 2708: case 2711: case 2714: case 2717: case 2720: case 2723: case 2726: case 2729: case 2732: case 2735: case 2738: case 2741: case 2744: case 2747: case 2750: case 2753: case 2756: case 2759: case 2762: case 2765: case 2768: case 2771: case 2774: case 2777: case 2780: case 2783: case 2786: case 2789: case 2792: case 2795: case 2798: case 2801: case 2804: case 2807: case 2810: case 2813: case 2816: case 2819: case 2822: case 2825: case 2828: case 2831: case 2834: case 2837: case 2840: case 2843: case 2846: case 2849: case 2852: case 2855: case 2858: case 2861: case 2864: case 2867: case 2870: case 2873: case 2876: case 2879: case 2882: case 2885: case 2888: case 2891: case 2894: case 2897: case 2900: case 2903: case 2906: case 2909: case 2912: case 2915: case 2918: case 2921: case 2924: case 2927: case 2930: case 2933: case 2936: case 2939: case 2942: case 2945: case 2948: case 2951: case 2954: case 2957: case 2960: case 2963: case 2966: case 2969: case 2972: case 2975: case 2978: case 2981: case 2984: case 2987: case 2990: case 2993: case 2996: case 2999: case 3002: case 3005: case 3008: case 3011: case 3014: case 3017: case 3020: case 3023: case 3026: case 3029: case 3032: case 3035: case 3038: case 3041: case 3044: case 3047: case 3050: case 3053: case 3056: case 3059: case 3062: case 3065: case 3068: case 3071: case 3074: case 3077: case 3080: case 3083: case 3086: case 3089: case 3092: case 3095: case 3098: case 3101: case 3104: case 3107: case 3110: case 3113: case 3116: case 3119: case 3122: case 3125: case 3128: case 3131: case 3134: case 3137: case 3140: case 3143: case 3146: case 3149: case 3152: case 3155: case 3158: case 3161: case 3164: case 3167: case 3170: case 3173: case 3176: case 3179: case 3182: case 3185: case 3188: case 3191: case 3194: case 3197: case 3200: case 3203: case 3206: case 3209: case 3212: case 3215: case 3218: case 3221: case 3224: case 3227: case 3230: case 3233: case 3236: case 3239: case 3242: case 3245: case 3248: case 3251: case 3254: case 3257: case 3260: case 3263: case 3266: case 3269: case 3272: case 3275: case 3278: case 3281: case 3284: case 3287: case 3290: case 3293: case 3296: case 3299: case 3302: case 3305: case 3308: case 3311: case 3314: case 3317: case 3320: case 3323: case 3326: case 3329: case 3332: case 3335: case 3338: case 3341: case 3344: case 3347: case 3350: case 3353: return West::None;\n\t\t\t\tcase 2059: case 2062: case 2065: case 2068: case 2071: case 2074: case 2077: case 2080: case 2083: case 2086: case 2089: case 2092: case 2095: case 2098: case 2101: case 2104: case 2107: case 2110: case 2113: case 2116: case 2119: case 2122: case 2125: case 2128: case 2131: case 2134: case 2137: case 2140: case 2143: case 2146: case 2149: case 2152: case 2155: case 2158: case 2161: case 2164: case 2167: case 2170: case 2173: case 2176: case 2179: case 2182: case 2185: case 2188: case 2191: case 2194: case 2197: case 2200: case 2203: case 2206: case 2209: case 2212: case 2215: case 2218: case 2221: case 2224: case 2227: case 2230: case 2233: case 2236: case 2239: case 2242: case 2245: case 2248: case 2251: case 2254: case 2257: case 2260: case 2263: case 2266: case 2269: case 2272: case 2275: case 2278: case 2281: case 2284: case 2287: case 2290: case 2293: case 2296: case 2299: case 2302: case 2305: case 2308: case 2311: case 2314: case 2317: case 2320: case 2323: case 2326: case 2329: case 2332: case 2335: case 2338: case 2341: case 2344: case 2347: case 2350: case 2353: case 2356: case 2359: case 2362: case 2365: case 2368: case 2371: case 2374: case 2377: case 2380: case 2383: case 2386: case 2389: case 2392: case 2395: case 2398: case 2401: case 2404: case 2407: case 2410: case 2413: case 2416: case 2419: case 2422: case 2425: case 2428: case 2431: case 2434: case 2437: case 2440: case 2443: case 2446: case 2449: case 2452: case 2455: case 2458: case 2461: case 2464: case 2467: case 2470: case 2473: case 2476: case 2479: case 2482: case 2485: case 2488: case 2491: case 2494: case 2497: case 2500: case 2503: case 2506: case 2509: case 2512: case 2515: case 2518: case 2521: case 2524: case 2527: case 2530: case 2533: case 2536: case 2539: case 2542: case 2545: case 2548: case 2551: case 2554: case 2557: case 2560: case 2563: case 2566: case 2569: case 2572: case 2575: case 2578: case 2581: case 2584: case 2587: case 2590: case 2593: case 2596: case 2599: case 2602: case 2605: case 2608: case 2611: case 2614: case 2617: case 2620: case 2623: case 2626: case 2629: case 2632: case 2635: case 2638: case 2641: case 2644: case 2647: case 2650: case 2653: case 2656: case 2659: case 2662: case 2665: case 2668: case 2671: case 2674: case 2677: case 2680: case 2683: case 2686: case 2689: case 2692: case 2695: case 2698: case 2701: case 2704: case 2707: case 2710: case 2713: case 2716: case 2719: case 2722: case 2725: case 2728: case 2731: case 2734: case 2737: case 2740: case 2743: case 2746: case 2749: case 2752: case 2755: case 2758: case 2761: case 2764: case 2767: case 2770: case 2773: case 2776: case 2779: case 2782: case 2785: case 2788: case 2791: case 2794: case 2797: case 2800: case 2803: case 2806: case 2809: case 2812: case 2815: case 2818: case 2821: case 2824: case 2827: case 2830: case 2833: case 2836: case 2839: case 2842: case 2845: case 2848: case 2851: case 2854: case 2857: case 2860: case 2863: case 2866: case 2869: case 2872: case 2875: case 2878: case 2881: case 2884: case 2887: case 2890: case 2893: case 2896: case 2899: case 2902: case 2905: case 2908: case 2911: case 2914: case 2917: case 2920: case 2923: case 2926: case 2929: case 2932: case 2935: case 2938: case 2941: case 2944: case 2947: case 2950: case 2953: case 2956: case 2959: case 2962: case 2965: case 2968: case 2971: case 2974: case 2977: case 2980: case 2983: case 2986: case 2989: case 2992: case 2995: case 2998: case 3001: case 3004: case 3007: case 3010: case 3013: case 3016: case 3019: case 3022: case 3025: case 3028: case 3031: case 3034: case 3037: case 3040: case 3043: case 3046: case 3049: case 3052: case 3055: case 3058: case 3061: case 3064: case 3067: case 3070: case 3073: case 3076: case 3079: case 3082: case 3085: case 3088: case 3091: case 3094: case 3097: case 3100: case 3103: case 3106: case 3109: case 3112: case 3115: case 3118: case 3121: case 3124: case 3127: case 3130: case 3133: case 3136: case 3139: case 3142: case 3145: case 3148: case 3151: case 3154: case 3157: case 3160: case 3163: case 3166: case 3169: case 3172: case 3175: case 3178: case 3181: case 3184: case 3187: case 3190: case 3193: case 3196: case 3199: case 3202: case 3205: case 3208: case 3211: case 3214: case 3217: case 3220: case 3223: case 3226: case 3229: case 3232: case 3235: case 3238: case 3241: case 3244: case 3247: case 3250: case 3253: case 3256: case 3259: case 3262: case 3265: case 3268: case 3271: case 3274: case 3277: case 3280: case 3283: case 3286: case 3289: case 3292: case 3295: case 3298: case 3301: case 3304: case 3307: case 3310: case 3313: case 3316: case 3319: case 3322: case 3325: case 3328: case 3331: case 3334: case 3337: case 3340: case 3343: case 3346: case 3349: case 3352: return West::Side;\n\t\t\t\tdefault: return West::Up;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Repeater\n\t{\n\t\tBlockState Repeater()\n\t\t{\n\t\t\treturn 4034;\n\t\t}\n\t\tunsigned char Delay(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4031: case 4032: case 4033: case 4034: case 4035: case 4036: case 4037: case 4038: case 4039: case 4040: case 4041: case 4042: case 4043: case 4044: case 4045: case 4046: return 1;\n\t\t\t\tcase 4047: case 4048: case 4049: case 4050: case 4051: case 4052: case 4053: case 4054: case 4055: case 4056: case 4057: case 4058: case 4059: case 4060: case 4061: case 4062: return 2;\n\t\t\t\tcase 4063: case 4064: case 4065: case 4066: case 4067: case 4068: case 4069: case 4070: case 4071: case 4072: case 4073: case 4074: case 4075: case 4076: case 4077: case 4078: return 3;\n\t\t\t\tdefault: return 4;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4039: case 4040: case 4041: case 4042: case 4055: case 4056: case 4057: case 4058: case 4071: case 4072: case 4073: case 4074: case 4087: case 4088: case 4089: case 4090: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4043: case 4044: case 4045: case 4046: case 4059: case 4060: case 4061: case 4062: case 4075: case 4076: case 4077: case 4078: case 4091: case 4092: case 4093: case 4094: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4031: case 4032: case 4033: case 4034: case 4047: case 4048: case 4049: case 4050: case 4063: case 4064: case 4065: case 4066: case 4079: case 4080: case 4081: case 4082: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Locked(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4033: case 4034: case 4037: case 4038: case 4041: case 4042: case 4045: case 4046: case 4049: case 4050: case 4053: case 4054: case 4057: case 4058: case 4061: case 4062: case 4065: case 4066: case 4069: case 4070: case 4073: case 4074: case 4077: case 4078: case 4081: case 4082: case 4085: case 4086: case 4089: case 4090: case 4093: case 4094: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4032: case 4034: case 4036: case 4038: case 4040: case 4042: case 4044: case 4046: case 4048: case 4050: case 4052: case 4054: case 4056: case 4058: case 4060: case 4062: case 4064: case 4066: case 4068: case 4070: case 4072: case 4074: case 4076: case 4078: case 4080: case 4082: case 4084: case 4086: case 4088: case 4090: case 4092: case 4094: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RepeatingCommandBlock\n\t{\n\t\tBlockState RepeatingCommandBlock()\n\t\t{\n\t\t\treturn 9231;\n\t\t}\n\t\tbool Conditional(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9231: case 9232: case 9233: case 9234: case 9235: case 9236: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9228: case 9234: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9226: case 9232: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9230: case 9236: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9229: case 9235: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9225: case 9231: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RespawnAnchor\n\t{\n\t\tBlockState RespawnAnchor()\n\t\t{\n\t\t\treturn 15829;\n\t\t}\n\t\tunsigned char Charges(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15829: return 0;\n\t\t\t\tcase 15830: return 1;\n\t\t\t\tcase 15831: return 2;\n\t\t\t\tcase 15832: return 3;\n\t\t\t\tdefault: return 4;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace RoseBush\n\t{\n\t\tBlockState RoseBush()\n\t\t{\n\t\t\treturn 7890;\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7890: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Sand\n\t{\n\t}\n\tnamespace Sandstone\n\t{\n\t}\n\tnamespace SandstoneSlab\n\t{\n\t\tBlockState SandstoneSlab()\n\t\t{\n\t\t\treturn 8351;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8351: return Type::Bottom;\n\t\t\t\tcase 8353: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SandstoneStairs\n\t{\n\t\tBlockState SandstoneStairs()\n\t\t{\n\t\t\treturn 5181;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5211: case 5213: case 5215: case 5217: case 5219: case 5221: case 5223: case 5225: case 5227: case 5229: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5231: case 5233: case 5235: case 5237: case 5239: case 5241: case 5243: case 5245: case 5247: case 5249: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5171: case 5173: case 5175: case 5177: case 5179: case 5181: case 5183: case 5185: case 5187: case 5189: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5181: case 5183: case 5185: case 5187: case 5189: case 5201: case 5203: case 5205: case 5207: case 5209: case 5221: case 5223: case 5225: case 5227: case 5229: case 5241: case 5243: case 5245: case 5247: case 5249: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5173: case 5183: case 5193: case 5203: case 5213: case 5223: case 5233: case 5243: return Shape::InnerLeft;\n\t\t\t\tcase 5175: case 5185: case 5195: case 5205: case 5215: case 5225: case 5235: case 5245: return Shape::InnerRight;\n\t\t\t\tcase 5177: case 5187: case 5197: case 5207: case 5217: case 5227: case 5237: case 5247: return Shape::OuterLeft;\n\t\t\t\tcase 5179: case 5189: case 5199: case 5209: case 5219: case 5229: case 5239: case 5249: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SandstoneWall\n\t{\n\t\tBlockState SandstoneWall()\n\t\t{\n\t\t\treturn 13786;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13894: case 13895: case 13896: case 13900: case 13901: case 13902: case 13906: case 13907: case 13908: case 13912: case 13913: case 13914: case 13918: case 13919: case 13920: case 13924: case 13925: case 13926: case 13930: case 13931: case 13932: case 13936: case 13937: case 13938: case 13942: case 13943: case 13944: case 13948: case 13949: case 13950: case 13954: case 13955: case 13956: case 13960: case 13961: case 13962: case 13966: case 13967: case 13968: case 13972: case 13973: case 13974: case 13978: case 13979: case 13980: case 13984: case 13985: case 13986: case 13990: case 13991: case 13992: case 13996: case 13997: case 13998: return East::Low;\n\t\t\t\tcase 13786: case 13787: case 13788: case 13792: case 13793: case 13794: case 13798: case 13799: case 13800: case 13804: case 13805: case 13806: case 13810: case 13811: case 13812: case 13816: case 13817: case 13818: case 13822: case 13823: case 13824: case 13828: case 13829: case 13830: case 13834: case 13835: case 13836: case 13840: case 13841: case 13842: case 13846: case 13847: case 13848: case 13852: case 13853: case 13854: case 13858: case 13859: case 13860: case 13864: case 13865: case 13866: case 13870: case 13871: case 13872: case 13876: case 13877: case 13878: case 13882: case 13883: case 13884: case 13888: case 13889: case 13890: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13822: case 13823: case 13824: case 13828: case 13829: case 13830: case 13834: case 13835: case 13836: case 13840: case 13841: case 13842: case 13846: case 13847: case 13848: case 13852: case 13853: case 13854: case 13930: case 13931: case 13932: case 13936: case 13937: case 13938: case 13942: case 13943: case 13944: case 13948: case 13949: case 13950: case 13954: case 13955: case 13956: case 13960: case 13961: case 13962: case 14038: case 14039: case 14040: case 14044: case 14045: case 14046: case 14050: case 14051: case 14052: case 14056: case 14057: case 14058: case 14062: case 14063: case 14064: case 14068: case 14069: case 14070: return North::Low;\n\t\t\t\tcase 13786: case 13787: case 13788: case 13792: case 13793: case 13794: case 13798: case 13799: case 13800: case 13804: case 13805: case 13806: case 13810: case 13811: case 13812: case 13816: case 13817: case 13818: case 13894: case 13895: case 13896: case 13900: case 13901: case 13902: case 13906: case 13907: case 13908: case 13912: case 13913: case 13914: case 13918: case 13919: case 13920: case 13924: case 13925: case 13926: case 14002: case 14003: case 14004: case 14008: case 14009: case 14010: case 14014: case 14015: case 14016: case 14020: case 14021: case 14022: case 14026: case 14027: case 14028: case 14032: case 14033: case 14034: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13798: case 13799: case 13800: case 13804: case 13805: case 13806: case 13834: case 13835: case 13836: case 13840: case 13841: case 13842: case 13870: case 13871: case 13872: case 13876: case 13877: case 13878: case 13906: case 13907: case 13908: case 13912: case 13913: case 13914: case 13942: case 13943: case 13944: case 13948: case 13949: case 13950: case 13978: case 13979: case 13980: case 13984: case 13985: case 13986: case 14014: case 14015: case 14016: case 14020: case 14021: case 14022: case 14050: case 14051: case 14052: case 14056: case 14057: case 14058: case 14086: case 14087: case 14088: case 14092: case 14093: case 14094: return South::Low;\n\t\t\t\tcase 13786: case 13787: case 13788: case 13792: case 13793: case 13794: case 13822: case 13823: case 13824: case 13828: case 13829: case 13830: case 13858: case 13859: case 13860: case 13864: case 13865: case 13866: case 13894: case 13895: case 13896: case 13900: case 13901: case 13902: case 13930: case 13931: case 13932: case 13936: case 13937: case 13938: case 13966: case 13967: case 13968: case 13972: case 13973: case 13974: case 14002: case 14003: case 14004: case 14008: case 14009: case 14010: case 14038: case 14039: case 14040: case 14044: case 14045: case 14046: case 14074: case 14075: case 14076: case 14080: case 14081: case 14082: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13792: case 13793: case 13794: case 13804: case 13805: case 13806: case 13816: case 13817: case 13818: case 13828: case 13829: case 13830: case 13840: case 13841: case 13842: case 13852: case 13853: case 13854: case 13864: case 13865: case 13866: case 13876: case 13877: case 13878: case 13888: case 13889: case 13890: case 13900: case 13901: case 13902: case 13912: case 13913: case 13914: case 13924: case 13925: case 13926: case 13936: case 13937: case 13938: case 13948: case 13949: case 13950: case 13960: case 13961: case 13962: case 13972: case 13973: case 13974: case 13984: case 13985: case 13986: case 13996: case 13997: case 13998: case 14008: case 14009: case 14010: case 14020: case 14021: case 14022: case 14032: case 14033: case 14034: case 14044: case 14045: case 14046: case 14056: case 14057: case 14058: case 14068: case 14069: case 14070: case 14080: case 14081: case 14082: case 14092: case 14093: case 14094: case 14104: case 14105: case 14106: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 13787: case 13793: case 13799: case 13805: case 13811: case 13817: case 13823: case 13829: case 13835: case 13841: case 13847: case 13853: case 13859: case 13865: case 13871: case 13877: case 13883: case 13889: case 13895: case 13901: case 13907: case 13913: case 13919: case 13925: case 13931: case 13937: case 13943: case 13949: case 13955: case 13961: case 13967: case 13973: case 13979: case 13985: case 13991: case 13997: case 14003: case 14009: case 14015: case 14021: case 14027: case 14033: case 14039: case 14045: case 14051: case 14057: case 14063: case 14069: case 14075: case 14081: case 14087: case 14093: case 14099: case 14105: return West::Low;\n\t\t\t\tcase 13786: case 13792: case 13798: case 13804: case 13810: case 13816: case 13822: case 13828: case 13834: case 13840: case 13846: case 13852: case 13858: case 13864: case 13870: case 13876: case 13882: case 13888: case 13894: case 13900: case 13906: case 13912: case 13918: case 13924: case 13930: case 13936: case 13942: case 13948: case 13954: case 13960: case 13966: case 13972: case 13978: case 13984: case 13990: case 13996: case 14002: case 14008: case 14014: case 14020: case 14026: case 14032: case 14038: case 14044: case 14050: case 14056: case 14062: case 14068: case 14074: case 14080: case 14086: case 14092: case 14098: case 14104: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Scaffolding\n\t{\n\t\tBlockState Scaffolding()\n\t\t{\n\t\t\treturn 14786;\n\t\t}\n\t\tbool Bottom(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14772: case 14774: case 14776: case 14778: case 14780: case 14782: case 14784: case 14786: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tunsigned char Distance(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14756: case 14772: return 0;\n\t\t\t\tcase 14758: case 14774: return 1;\n\t\t\t\tcase 14760: case 14776: return 2;\n\t\t\t\tcase 14762: case 14778: return 3;\n\t\t\t\tcase 14764: case 14780: return 4;\n\t\t\t\tcase 14766: case 14782: return 5;\n\t\t\t\tcase 14768: case 14784: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SeaLantern\n\t{\n\t}\n\tnamespace SeaPickle\n\t{\n\t\tBlockState SeaPickle()\n\t\t{\n\t\t\treturn 9640;\n\t\t}\n\t\tunsigned char Pickles(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9641: return 1;\n\t\t\t\tcase 9643: return 2;\n\t\t\t\tcase 9645: return 3;\n\t\t\t\tdefault: return 4;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Seagrass\n\t{\n\t}\n\tnamespace Shroomlight\n\t{\n\t}\n\tnamespace ShulkerBox\n\t{\n\t\tBlockState ShulkerBox()\n\t\t{\n\t\t\treturn 9276;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9275: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9273: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9277: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9276: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9272: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SkeletonSkull\n\t{\n\t\tBlockState SkeletonSkull()\n\t\t{\n\t\t\treturn 6490;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6490: return 0;\n\t\t\t\tcase 6491: return 1;\n\t\t\t\tcase 6500: return 10;\n\t\t\t\tcase 6501: return 11;\n\t\t\t\tcase 6502: return 12;\n\t\t\t\tcase 6503: return 13;\n\t\t\t\tcase 6504: return 14;\n\t\t\t\tcase 6505: return 15;\n\t\t\t\tcase 6492: return 2;\n\t\t\t\tcase 6493: return 3;\n\t\t\t\tcase 6494: return 4;\n\t\t\t\tcase 6495: return 5;\n\t\t\t\tcase 6496: return 6;\n\t\t\t\tcase 6497: return 7;\n\t\t\t\tcase 6498: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SkeletonWallSkull\n\t{\n\t\tBlockState SkeletonWallSkull()\n\t\t{\n\t\t\treturn 6506;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6508: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6509: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6506: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SlimeBlock\n\t{\n\t}\n\tnamespace SmithingTable\n\t{\n\t}\n\tnamespace Smoker\n\t{\n\t\tBlockState Smoker()\n\t\t{\n\t\t\treturn 14804;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14807: case 14808: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14809: case 14810: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14803: case 14804: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14804: case 14806: case 14808: case 14810: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SmoothQuartz\n\t{\n\t}\n\tnamespace SmoothQuartzSlab\n\t{\n\t\tBlockState SmoothQuartzSlab()\n\t\t{\n\t\t\treturn 10834;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10834: return Type::Bottom;\n\t\t\t\tcase 10836: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SmoothQuartzStairs\n\t{\n\t\tBlockState SmoothQuartzStairs()\n\t\t{\n\t\t\treturn 10320;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10350: case 10352: case 10354: case 10356: case 10358: case 10360: case 10362: case 10364: case 10366: case 10368: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10370: case 10372: case 10374: case 10376: case 10378: case 10380: case 10382: case 10384: case 10386: case 10388: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10310: case 10312: case 10314: case 10316: case 10318: case 10320: case 10322: case 10324: case 10326: case 10328: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10320: case 10322: case 10324: case 10326: case 10328: case 10340: case 10342: case 10344: case 10346: case 10348: case 10360: case 10362: case 10364: case 10366: case 10368: case 10380: case 10382: case 10384: case 10386: case 10388: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10312: case 10322: case 10332: case 10342: case 10352: case 10362: case 10372: case 10382: return Shape::InnerLeft;\n\t\t\t\tcase 10314: case 10324: case 10334: case 10344: case 10354: case 10364: case 10374: case 10384: return Shape::InnerRight;\n\t\t\t\tcase 10316: case 10326: case 10336: case 10346: case 10356: case 10366: case 10376: case 10386: return Shape::OuterLeft;\n\t\t\t\tcase 10318: case 10328: case 10338: case 10348: case 10358: case 10368: case 10378: case 10388: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SmoothRedSandstone\n\t{\n\t}\n\tnamespace SmoothRedSandstoneSlab\n\t{\n\t\tBlockState SmoothRedSandstoneSlab()\n\t\t{\n\t\t\treturn 10798;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10798: return Type::Bottom;\n\t\t\t\tcase 10800: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SmoothRedSandstoneStairs\n\t{\n\t\tBlockState SmoothRedSandstoneStairs()\n\t\t{\n\t\t\treturn 9760;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9790: case 9792: case 9794: case 9796: case 9798: case 9800: case 9802: case 9804: case 9806: case 9808: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9810: case 9812: case 9814: case 9816: case 9818: case 9820: case 9822: case 9824: case 9826: case 9828: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9750: case 9752: case 9754: case 9756: case 9758: case 9760: case 9762: case 9764: case 9766: case 9768: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9760: case 9762: case 9764: case 9766: case 9768: case 9780: case 9782: case 9784: case 9786: case 9788: case 9800: case 9802: case 9804: case 9806: case 9808: case 9820: case 9822: case 9824: case 9826: case 9828: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9752: case 9762: case 9772: case 9782: case 9792: case 9802: case 9812: case 9822: return Shape::InnerLeft;\n\t\t\t\tcase 9754: case 9764: case 9774: case 9784: case 9794: case 9804: case 9814: case 9824: return Shape::InnerRight;\n\t\t\t\tcase 9756: case 9766: case 9776: case 9786: case 9796: case 9806: case 9816: case 9826: return Shape::OuterLeft;\n\t\t\t\tcase 9758: case 9768: case 9778: case 9788: case 9798: case 9808: case 9818: case 9828: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SmoothSandstone\n\t{\n\t}\n\tnamespace SmoothSandstoneSlab\n\t{\n\t\tBlockState SmoothSandstoneSlab()\n\t\t{\n\t\t\treturn 10828;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10828: return Type::Bottom;\n\t\t\t\tcase 10830: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SmoothSandstoneStairs\n\t{\n\t\tBlockState SmoothSandstoneStairs()\n\t\t{\n\t\t\treturn 10240;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10270: case 10272: case 10274: case 10276: case 10278: case 10280: case 10282: case 10284: case 10286: case 10288: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10290: case 10292: case 10294: case 10296: case 10298: case 10300: case 10302: case 10304: case 10306: case 10308: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10230: case 10232: case 10234: case 10236: case 10238: case 10240: case 10242: case 10244: case 10246: case 10248: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10240: case 10242: case 10244: case 10246: case 10248: case 10260: case 10262: case 10264: case 10266: case 10268: case 10280: case 10282: case 10284: case 10286: case 10288: case 10300: case 10302: case 10304: case 10306: case 10308: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10232: case 10242: case 10252: case 10262: case 10272: case 10282: case 10292: case 10302: return Shape::InnerLeft;\n\t\t\t\tcase 10234: case 10244: case 10254: case 10264: case 10274: case 10284: case 10294: case 10304: return Shape::InnerRight;\n\t\t\t\tcase 10236: case 10246: case 10256: case 10266: case 10276: case 10286: case 10296: case 10306: return Shape::OuterLeft;\n\t\t\t\tcase 10238: case 10248: case 10258: case 10268: case 10278: case 10288: case 10298: case 10308: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SmoothStone\n\t{\n\t}\n\tnamespace SmoothStoneSlab\n\t{\n\t\tBlockState SmoothStoneSlab()\n\t\t{\n\t\t\treturn 8345;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8345: return Type::Bottom;\n\t\t\t\tcase 8347: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Snow\n\t{\n\t\tBlockState Snow()\n\t\t{\n\t\t\treturn 3921;\n\t\t}\n\t\tunsigned char Layers(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3921: return 1;\n\t\t\t\tcase 3922: return 2;\n\t\t\t\tcase 3923: return 3;\n\t\t\t\tcase 3924: return 4;\n\t\t\t\tcase 3925: return 5;\n\t\t\t\tcase 3926: return 6;\n\t\t\t\tcase 3927: return 7;\n\t\t\t\tdefault: return 8;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SnowBlock\n\t{\n\t}\n\tnamespace SoulCampfire\n\t{\n\t\tBlockState SoulCampfire()\n\t\t{\n\t\t\treturn 14925;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14939: case 14941: case 14943: case 14945: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14947: case 14949: case 14951: case 14953: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14923: case 14925: case 14927: case 14929: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Lit(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14927: case 14929: case 14935: case 14937: case 14943: case 14945: case 14951: case 14953: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool SignalFire(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14925: case 14929: case 14933: case 14937: case 14941: case 14945: case 14949: case 14953: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SoulFire\n\t{\n\t}\n\tnamespace SoulLantern\n\t{\n\t\tBlockState SoulLantern()\n\t\t{\n\t\t\treturn 14889;\n\t\t}\n\t\tbool Hanging(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14889: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SoulSand\n\t{\n\t}\n\tnamespace SoulSoil\n\t{\n\t}\n\tnamespace SoulTorch\n\t{\n\t}\n\tnamespace SoulWallTorch\n\t{\n\t\tBlockState SoulWallTorch()\n\t\t{\n\t\t\treturn 4009;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4011: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4012: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4009: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Spawner\n\t{\n\t}\n\tnamespace Sponge\n\t{\n\t}\n\tnamespace SpruceButton\n\t{\n\t\tBlockState SpruceButton()\n\t\t{\n\t\t\treturn 6379;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6386: case 6387: case 6388: case 6389: case 6390: case 6391: case 6392: case 6393: return Face::Ceiling;\n\t\t\t\tcase 6370: case 6371: case 6372: case 6373: case 6374: case 6375: case 6376: case 6377: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6374: case 6375: case 6382: case 6383: case 6390: case 6391: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6376: case 6377: case 6384: case 6385: case 6392: case 6393: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6370: case 6371: case 6378: case 6379: case 6386: case 6387: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6371: case 6373: case 6375: case 6377: case 6379: case 6381: case 6383: case 6385: case 6387: case 6389: case 6391: case 6393: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceDoor\n\t{\n\t\tBlockState SpruceDoor()\n\t\t{\n\t\t\treturn 8749;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8770: case 8771: case 8772: case 8773: case 8774: case 8775: case 8776: case 8777: case 8778: case 8779: case 8780: case 8781: case 8782: case 8783: case 8784: case 8785: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8786: case 8787: case 8788: case 8789: case 8790: case 8791: case 8792: case 8793: case 8794: case 8795: case 8796: case 8797: case 8798: case 8799: case 8800: case 8801: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8738: case 8739: case 8740: case 8741: case 8742: case 8743: case 8744: case 8745: case 8746: case 8747: case 8748: case 8749: case 8750: case 8751: case 8752: case 8753: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8746: case 8747: case 8748: case 8749: case 8750: case 8751: case 8752: case 8753: case 8762: case 8763: case 8764: case 8765: case 8766: case 8767: case 8768: case 8769: case 8778: case 8779: case 8780: case 8781: case 8782: case 8783: case 8784: case 8785: case 8794: case 8795: case 8796: case 8797: case 8798: case 8799: case 8800: case 8801: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8738: case 8739: case 8740: case 8741: case 8746: case 8747: case 8748: case 8749: case 8754: case 8755: case 8756: case 8757: case 8762: case 8763: case 8764: case 8765: case 8770: case 8771: case 8772: case 8773: case 8778: case 8779: case 8780: case 8781: case 8786: case 8787: case 8788: case 8789: case 8794: case 8795: case 8796: case 8797: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8740: case 8741: case 8744: case 8745: case 8748: case 8749: case 8752: case 8753: case 8756: case 8757: case 8760: case 8761: case 8764: case 8765: case 8768: case 8769: case 8772: case 8773: case 8776: case 8777: case 8780: case 8781: case 8784: case 8785: case 8788: case 8789: case 8792: case 8793: case 8796: case 8797: case 8800: case 8801: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8739: case 8741: case 8743: case 8745: case 8747: case 8749: case 8751: case 8753: case 8755: case 8757: case 8759: case 8761: case 8763: case 8765: case 8767: case 8769: case 8771: case 8773: case 8775: case 8777: case 8779: case 8781: case 8783: case 8785: case 8787: case 8789: case 8791: case 8793: case 8795: case 8797: case 8799: case 8801: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceFence\n\t{\n\t\tBlockState SpruceFence()\n\t\t{\n\t\t\treturn 8609;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8596: case 8597: case 8600: case 8601: case 8604: case 8605: case 8608: case 8609: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8588: case 8589: case 8592: case 8593: case 8604: case 8605: case 8608: case 8609: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8584: case 8585: case 8592: case 8593: case 8600: case 8601: case 8608: case 8609: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8581: case 8585: case 8589: case 8593: case 8597: case 8601: case 8605: case 8609: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceFenceGate\n\t{\n\t\tBlockState SpruceFenceGate()\n\t\t{\n\t\t\treturn 8425;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8434: case 8435: case 8436: case 8437: case 8438: case 8439: case 8440: case 8441: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8442: case 8443: case 8444: case 8445: case 8446: case 8447: case 8448: case 8449: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8418: case 8419: case 8420: case 8421: case 8422: case 8423: case 8424: case 8425: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool InWall(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8422: case 8423: case 8424: case 8425: case 8430: case 8431: case 8432: case 8433: case 8438: case 8439: case 8440: case 8441: case 8446: case 8447: case 8448: case 8449: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8420: case 8421: case 8424: case 8425: case 8428: case 8429: case 8432: case 8433: case 8436: case 8437: case 8440: case 8441: case 8444: case 8445: case 8448: case 8449: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8419: case 8421: case 8423: case 8425: case 8427: case 8429: case 8431: case 8433: case 8435: case 8437: case 8439: case 8441: case 8443: case 8445: case 8447: case 8449: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceLeaves\n\t{\n\t\tBlockState SpruceLeaves()\n\t\t{\n\t\t\treturn 172;\n\t\t}\n\t\tunsigned char Distance(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 159: case 160: return 1;\n\t\t\t\tcase 161: case 162: return 2;\n\t\t\t\tcase 163: case 164: return 3;\n\t\t\t\tcase 165: case 166: return 4;\n\t\t\t\tcase 167: case 168: return 5;\n\t\t\t\tcase 169: case 170: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t\tbool Persistent(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 160: case 162: case 164: case 166: case 168: case 170: case 172: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceLog\n\t{\n\t\tBlockState SpruceLog()\n\t\t{\n\t\t\treturn 77;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 76: return Axis::X;\n\t\t\t\tcase 77: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SprucePlanks\n\t{\n\t}\n\tnamespace SprucePressurePlate\n\t{\n\t\tBlockState SprucePressurePlate()\n\t\t{\n\t\t\treturn 3876;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3876: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceSapling\n\t{\n\t\tBlockState SpruceSapling()\n\t\t{\n\t\t\treturn 23;\n\t\t}\n\t\tunsigned char Stage(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 23: return 0;\n\t\t\t\tdefault: return 1;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceSign\n\t{\n\t\tBlockState SpruceSign()\n\t\t{\n\t\t\treturn 3414;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3414: return 0;\n\t\t\t\tcase 3416: return 1;\n\t\t\t\tcase 3434: return 10;\n\t\t\t\tcase 3436: return 11;\n\t\t\t\tcase 3438: return 12;\n\t\t\t\tcase 3440: return 13;\n\t\t\t\tcase 3442: return 14;\n\t\t\t\tcase 3444: return 15;\n\t\t\t\tcase 3418: return 2;\n\t\t\t\tcase 3420: return 3;\n\t\t\t\tcase 3422: return 4;\n\t\t\t\tcase 3424: return 5;\n\t\t\t\tcase 3426: return 6;\n\t\t\t\tcase 3428: return 7;\n\t\t\t\tcase 3430: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceSlab\n\t{\n\t\tBlockState SpruceSlab()\n\t\t{\n\t\t\treturn 8309;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8309: return Type::Bottom;\n\t\t\t\tcase 8311: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceStairs\n\t{\n\t\tBlockState SpruceStairs()\n\t\t{\n\t\t\treturn 5415;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5445: case 5447: case 5449: case 5451: case 5453: case 5455: case 5457: case 5459: case 5461: case 5463: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5465: case 5467: case 5469: case 5471: case 5473: case 5475: case 5477: case 5479: case 5481: case 5483: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5405: case 5407: case 5409: case 5411: case 5413: case 5415: case 5417: case 5419: case 5421: case 5423: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5415: case 5417: case 5419: case 5421: case 5423: case 5435: case 5437: case 5439: case 5441: case 5443: case 5455: case 5457: case 5459: case 5461: case 5463: case 5475: case 5477: case 5479: case 5481: case 5483: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5407: case 5417: case 5427: case 5437: case 5447: case 5457: case 5467: case 5477: return Shape::InnerLeft;\n\t\t\t\tcase 5409: case 5419: case 5429: case 5439: case 5449: case 5459: case 5469: case 5479: return Shape::InnerRight;\n\t\t\t\tcase 5411: case 5421: case 5431: case 5441: case 5451: case 5461: case 5471: case 5481: return Shape::OuterLeft;\n\t\t\t\tcase 5413: case 5423: case 5433: case 5443: case 5453: case 5463: case 5473: case 5483: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceTrapdoor\n\t{\n\t\tBlockState SpruceTrapdoor()\n\t\t{\n\t\t\treturn 4190;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4208: case 4210: case 4212: case 4214: case 4216: case 4218: case 4220: case 4222: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4224: case 4226: case 4228: case 4230: case 4232: case 4234: case 4236: case 4238: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4176: case 4178: case 4180: case 4182: case 4184: case 4186: case 4188: case 4190: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4184: case 4186: case 4188: case 4190: case 4200: case 4202: case 4204: case 4206: case 4216: case 4218: case 4220: case 4222: case 4232: case 4234: case 4236: case 4238: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4180: case 4182: case 4188: case 4190: case 4196: case 4198: case 4204: case 4206: case 4212: case 4214: case 4220: case 4222: case 4228: case 4230: case 4236: case 4238: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4178: case 4182: case 4186: case 4190: case 4194: case 4198: case 4202: case 4206: case 4210: case 4214: case 4218: case 4222: case 4226: case 4230: case 4234: case 4238: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceWallSign\n\t{\n\t\tBlockState SpruceWallSign()\n\t\t{\n\t\t\treturn 3744;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3748: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3750: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3744: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SpruceWood\n\t{\n\t\tBlockState SpruceWood()\n\t\t{\n\t\t\treturn 113;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 112: return Axis::X;\n\t\t\t\tcase 113: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StickyPiston\n\t{\n\t\tBlockState StickyPiston()\n\t\t{\n\t\t\treturn 1335;\n\t\t}\n\t\tbool Extended(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1335: case 1336: case 1337: case 1338: case 1339: case 1340: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1332: case 1338: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1330: case 1336: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1334: case 1340: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 1333: case 1339: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 1329: case 1335: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Stone\n\t{\n\t}\n\tnamespace StoneBrickSlab\n\t{\n\t\tBlockState StoneBrickSlab()\n\t\t{\n\t\t\treturn 8381;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8381: return Type::Bottom;\n\t\t\t\tcase 8383: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StoneBrickStairs\n\t{\n\t\tBlockState StoneBrickStairs()\n\t\t{\n\t\t\treturn 4943;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4973: case 4975: case 4977: case 4979: case 4981: case 4983: case 4985: case 4987: case 4989: case 4991: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 4993: case 4995: case 4997: case 4999: case 5001: case 5003: case 5005: case 5007: case 5009: case 5011: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 4933: case 4935: case 4937: case 4939: case 4941: case 4943: case 4945: case 4947: case 4949: case 4951: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4943: case 4945: case 4947: case 4949: case 4951: case 4963: case 4965: case 4967: case 4969: case 4971: case 4983: case 4985: case 4987: case 4989: case 4991: case 5003: case 5005: case 5007: case 5009: case 5011: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4935: case 4945: case 4955: case 4965: case 4975: case 4985: case 4995: case 5005: return Shape::InnerLeft;\n\t\t\t\tcase 4937: case 4947: case 4957: case 4967: case 4977: case 4987: case 4997: case 5007: return Shape::InnerRight;\n\t\t\t\tcase 4939: case 4949: case 4959: case 4969: case 4979: case 4989: case 4999: case 5009: return Shape::OuterLeft;\n\t\t\t\tcase 4941: case 4951: case 4961: case 4971: case 4981: case 4991: case 5001: case 5011: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StoneBrickWall\n\t{\n\t\tBlockState StoneBrickWall()\n\t\t{\n\t\t\treturn 12490;\n\t\t}\n\t\tenum East East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12598: case 12599: case 12600: case 12604: case 12605: case 12606: case 12610: case 12611: case 12612: case 12616: case 12617: case 12618: case 12622: case 12623: case 12624: case 12628: case 12629: case 12630: case 12634: case 12635: case 12636: case 12640: case 12641: case 12642: case 12646: case 12647: case 12648: case 12652: case 12653: case 12654: case 12658: case 12659: case 12660: case 12664: case 12665: case 12666: case 12670: case 12671: case 12672: case 12676: case 12677: case 12678: case 12682: case 12683: case 12684: case 12688: case 12689: case 12690: case 12694: case 12695: case 12696: case 12700: case 12701: case 12702: return East::Low;\n\t\t\t\tcase 12490: case 12491: case 12492: case 12496: case 12497: case 12498: case 12502: case 12503: case 12504: case 12508: case 12509: case 12510: case 12514: case 12515: case 12516: case 12520: case 12521: case 12522: case 12526: case 12527: case 12528: case 12532: case 12533: case 12534: case 12538: case 12539: case 12540: case 12544: case 12545: case 12546: case 12550: case 12551: case 12552: case 12556: case 12557: case 12558: case 12562: case 12563: case 12564: case 12568: case 12569: case 12570: case 12574: case 12575: case 12576: case 12580: case 12581: case 12582: case 12586: case 12587: case 12588: case 12592: case 12593: case 12594: return East::None;\n\t\t\t\tdefault: return East::Tall;\n\t\t\t}\n\t\t}\n\t\tenum North North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12526: case 12527: case 12528: case 12532: case 12533: case 12534: case 12538: case 12539: case 12540: case 12544: case 12545: case 12546: case 12550: case 12551: case 12552: case 12556: case 12557: case 12558: case 12634: case 12635: case 12636: case 12640: case 12641: case 12642: case 12646: case 12647: case 12648: case 12652: case 12653: case 12654: case 12658: case 12659: case 12660: case 12664: case 12665: case 12666: case 12742: case 12743: case 12744: case 12748: case 12749: case 12750: case 12754: case 12755: case 12756: case 12760: case 12761: case 12762: case 12766: case 12767: case 12768: case 12772: case 12773: case 12774: return North::Low;\n\t\t\t\tcase 12490: case 12491: case 12492: case 12496: case 12497: case 12498: case 12502: case 12503: case 12504: case 12508: case 12509: case 12510: case 12514: case 12515: case 12516: case 12520: case 12521: case 12522: case 12598: case 12599: case 12600: case 12604: case 12605: case 12606: case 12610: case 12611: case 12612: case 12616: case 12617: case 12618: case 12622: case 12623: case 12624: case 12628: case 12629: case 12630: case 12706: case 12707: case 12708: case 12712: case 12713: case 12714: case 12718: case 12719: case 12720: case 12724: case 12725: case 12726: case 12730: case 12731: case 12732: case 12736: case 12737: case 12738: return North::None;\n\t\t\t\tdefault: return North::Tall;\n\t\t\t}\n\t\t}\n\t\tenum South South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12502: case 12503: case 12504: case 12508: case 12509: case 12510: case 12538: case 12539: case 12540: case 12544: case 12545: case 12546: case 12574: case 12575: case 12576: case 12580: case 12581: case 12582: case 12610: case 12611: case 12612: case 12616: case 12617: case 12618: case 12646: case 12647: case 12648: case 12652: case 12653: case 12654: case 12682: case 12683: case 12684: case 12688: case 12689: case 12690: case 12718: case 12719: case 12720: case 12724: case 12725: case 12726: case 12754: case 12755: case 12756: case 12760: case 12761: case 12762: case 12790: case 12791: case 12792: case 12796: case 12797: case 12798: return South::Low;\n\t\t\t\tcase 12490: case 12491: case 12492: case 12496: case 12497: case 12498: case 12526: case 12527: case 12528: case 12532: case 12533: case 12534: case 12562: case 12563: case 12564: case 12568: case 12569: case 12570: case 12598: case 12599: case 12600: case 12604: case 12605: case 12606: case 12634: case 12635: case 12636: case 12640: case 12641: case 12642: case 12670: case 12671: case 12672: case 12676: case 12677: case 12678: case 12706: case 12707: case 12708: case 12712: case 12713: case 12714: case 12742: case 12743: case 12744: case 12748: case 12749: case 12750: case 12778: case 12779: case 12780: case 12784: case 12785: case 12786: return South::None;\n\t\t\t\tdefault: return South::Tall;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12496: case 12497: case 12498: case 12508: case 12509: case 12510: case 12520: case 12521: case 12522: case 12532: case 12533: case 12534: case 12544: case 12545: case 12546: case 12556: case 12557: case 12558: case 12568: case 12569: case 12570: case 12580: case 12581: case 12582: case 12592: case 12593: case 12594: case 12604: case 12605: case 12606: case 12616: case 12617: case 12618: case 12628: case 12629: case 12630: case 12640: case 12641: case 12642: case 12652: case 12653: case 12654: case 12664: case 12665: case 12666: case 12676: case 12677: case 12678: case 12688: case 12689: case 12690: case 12700: case 12701: case 12702: case 12712: case 12713: case 12714: case 12724: case 12725: case 12726: case 12736: case 12737: case 12738: case 12748: case 12749: case 12750: case 12760: case 12761: case 12762: case 12772: case 12773: case 12774: case 12784: case 12785: case 12786: case 12796: case 12797: case 12798: case 12808: case 12809: case 12810: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum West West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 12491: case 12497: case 12503: case 12509: case 12515: case 12521: case 12527: case 12533: case 12539: case 12545: case 12551: case 12557: case 12563: case 12569: case 12575: case 12581: case 12587: case 12593: case 12599: case 12605: case 12611: case 12617: case 12623: case 12629: case 12635: case 12641: case 12647: case 12653: case 12659: case 12665: case 12671: case 12677: case 12683: case 12689: case 12695: case 12701: case 12707: case 12713: case 12719: case 12725: case 12731: case 12737: case 12743: case 12749: case 12755: case 12761: case 12767: case 12773: case 12779: case 12785: case 12791: case 12797: case 12803: case 12809: return West::Low;\n\t\t\t\tcase 12490: case 12496: case 12502: case 12508: case 12514: case 12520: case 12526: case 12532: case 12538: case 12544: case 12550: case 12556: case 12562: case 12568: case 12574: case 12580: case 12586: case 12592: case 12598: case 12604: case 12610: case 12616: case 12622: case 12628: case 12634: case 12640: case 12646: case 12652: case 12658: case 12664: case 12670: case 12676: case 12682: case 12688: case 12694: case 12700: case 12706: case 12712: case 12718: case 12724: case 12730: case 12736: case 12742: case 12748: case 12754: case 12760: case 12766: case 12772: case 12778: case 12784: case 12790: case 12796: case 12802: case 12808: return West::None;\n\t\t\t\tdefault: return West::Tall;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StoneBricks\n\t{\n\t}\n\tnamespace StoneButton\n\t{\n\t\tBlockState StoneButton()\n\t\t{\n\t\t\treturn 3906;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3913: case 3914: case 3915: case 3916: case 3917: case 3918: case 3919: case 3920: return Face::Ceiling;\n\t\t\t\tcase 3897: case 3898: case 3899: case 3900: case 3901: case 3902: case 3903: case 3904: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3901: case 3902: case 3909: case 3910: case 3917: case 3918: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 3903: case 3904: case 3911: case 3912: case 3919: case 3920: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 3897: case 3898: case 3905: case 3906: case 3913: case 3914: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3898: case 3900: case 3902: case 3904: case 3906: case 3908: case 3910: case 3912: case 3914: case 3916: case 3918: case 3920: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StonePressurePlate\n\t{\n\t\tBlockState StonePressurePlate()\n\t\t{\n\t\t\treturn 3808;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3808: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StoneSlab\n\t{\n\t\tBlockState StoneSlab()\n\t\t{\n\t\t\treturn 8339;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8339: return Type::Bottom;\n\t\t\t\tcase 8341: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StoneStairs\n\t{\n\t\tBlockState StoneStairs()\n\t\t{\n\t\t\treturn 10160;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10190: case 10192: case 10194: case 10196: case 10198: case 10200: case 10202: case 10204: case 10206: case 10208: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 10210: case 10212: case 10214: case 10216: case 10218: case 10220: case 10222: case 10224: case 10226: case 10228: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 10150: case 10152: case 10154: case 10156: case 10158: case 10160: case 10162: case 10164: case 10166: case 10168: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10160: case 10162: case 10164: case 10166: case 10168: case 10180: case 10182: case 10184: case 10186: case 10188: case 10200: case 10202: case 10204: case 10206: case 10208: case 10220: case 10222: case 10224: case 10226: case 10228: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 10152: case 10162: case 10172: case 10182: case 10192: case 10202: case 10212: case 10222: return Shape::InnerLeft;\n\t\t\t\tcase 10154: case 10164: case 10174: case 10184: case 10194: case 10204: case 10214: case 10224: return Shape::InnerRight;\n\t\t\t\tcase 10156: case 10166: case 10176: case 10186: case 10196: case 10206: case 10216: case 10226: return Shape::OuterLeft;\n\t\t\t\tcase 10158: case 10168: case 10178: case 10188: case 10198: case 10208: case 10218: case 10228: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Stonecutter\n\t{\n\t\tBlockState Stonecutter()\n\t\t{\n\t\t\treturn 14850;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14852: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 14853: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 14850: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedAcaciaLog\n\t{\n\t\tBlockState StrippedAcaciaLog()\n\t\t{\n\t\t\treturn 101;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 100: return Axis::X;\n\t\t\t\tcase 101: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedAcaciaWood\n\t{\n\t\tBlockState StrippedAcaciaWood()\n\t\t{\n\t\t\treturn 140;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 139: return Axis::X;\n\t\t\t\tcase 140: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedBirchLog\n\t{\n\t\tBlockState StrippedBirchLog()\n\t\t{\n\t\t\treturn 95;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 94: return Axis::X;\n\t\t\t\tcase 95: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedBirchWood\n\t{\n\t\tBlockState StrippedBirchWood()\n\t\t{\n\t\t\treturn 134;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 133: return Axis::X;\n\t\t\t\tcase 134: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedCrimsonHyphae\n\t{\n\t\tBlockState StrippedCrimsonHyphae()\n\t\t{\n\t\t\treturn 14985;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14984: return Axis::X;\n\t\t\t\tcase 14985: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedCrimsonStem\n\t{\n\t\tBlockState StrippedCrimsonStem()\n\t\t{\n\t\t\treturn 14979;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14978: return Axis::X;\n\t\t\t\tcase 14979: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedDarkOakLog\n\t{\n\t\tBlockState StrippedDarkOakLog()\n\t\t{\n\t\t\treturn 104;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 103: return Axis::X;\n\t\t\t\tcase 104: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedDarkOakWood\n\t{\n\t\tBlockState StrippedDarkOakWood()\n\t\t{\n\t\t\treturn 143;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 142: return Axis::X;\n\t\t\t\tcase 143: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedJungleLog\n\t{\n\t\tBlockState StrippedJungleLog()\n\t\t{\n\t\t\treturn 98;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 97: return Axis::X;\n\t\t\t\tcase 98: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedJungleWood\n\t{\n\t\tBlockState StrippedJungleWood()\n\t\t{\n\t\t\treturn 137;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 136: return Axis::X;\n\t\t\t\tcase 137: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedOakLog\n\t{\n\t\tBlockState StrippedOakLog()\n\t\t{\n\t\t\treturn 107;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 106: return Axis::X;\n\t\t\t\tcase 107: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedOakWood\n\t{\n\t\tBlockState StrippedOakWood()\n\t\t{\n\t\t\treturn 128;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 127: return Axis::X;\n\t\t\t\tcase 128: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedSpruceLog\n\t{\n\t\tBlockState StrippedSpruceLog()\n\t\t{\n\t\t\treturn 92;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 91: return Axis::X;\n\t\t\t\tcase 92: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedSpruceWood\n\t{\n\t\tBlockState StrippedSpruceWood()\n\t\t{\n\t\t\treturn 131;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 130: return Axis::X;\n\t\t\t\tcase 131: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedWarpedHyphae\n\t{\n\t\tBlockState StrippedWarpedHyphae()\n\t\t{\n\t\t\treturn 14968;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14967: return Axis::X;\n\t\t\t\tcase 14968: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StrippedWarpedStem\n\t{\n\t\tBlockState StrippedWarpedStem()\n\t\t{\n\t\t\treturn 14962;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14961: return Axis::X;\n\t\t\t\tcase 14962: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StructureBlock\n\t{\n\t\tBlockState StructureBlock()\n\t\t{\n\t\t\treturn 15735;\n\t\t}\n\t\tenum Mode Mode(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15737: return Mode::Corner;\n\t\t\t\tcase 15738: return Mode::Data;\n\t\t\t\tcase 15736: return Mode::Load;\n\t\t\t\tdefault: return Mode::Save;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace StructureVoid\n\t{\n\t}\n\tnamespace SugarCane\n\t{\n\t\tBlockState SugarCane()\n\t\t{\n\t\t\treturn 3948;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3948: return 0;\n\t\t\t\tcase 3949: return 1;\n\t\t\t\tcase 3958: return 10;\n\t\t\t\tcase 3959: return 11;\n\t\t\t\tcase 3960: return 12;\n\t\t\t\tcase 3961: return 13;\n\t\t\t\tcase 3962: return 14;\n\t\t\t\tcase 3963: return 15;\n\t\t\t\tcase 3950: return 2;\n\t\t\t\tcase 3951: return 3;\n\t\t\t\tcase 3952: return 4;\n\t\t\t\tcase 3953: return 5;\n\t\t\t\tcase 3954: return 6;\n\t\t\t\tcase 3955: return 7;\n\t\t\t\tcase 3956: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Sunflower\n\t{\n\t\tBlockState Sunflower()\n\t\t{\n\t\t\treturn 7886;\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7886: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace SweetBerryBush\n\t{\n\t\tBlockState SweetBerryBush()\n\t\t{\n\t\t\treturn 14954;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14954: return 0;\n\t\t\t\tcase 14955: return 1;\n\t\t\t\tcase 14956: return 2;\n\t\t\t\tdefault: return 3;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace TNT\n\t{\n\t\tBlockState TNT()\n\t\t{\n\t\t\treturn 1431;\n\t\t}\n\t\tbool Unstable(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1431: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace TallGrass\n\t{\n\t\tBlockState TallGrass()\n\t\t{\n\t\t\treturn 7894;\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7894: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace TallSeagrass\n\t{\n\t\tBlockState TallSeagrass()\n\t\t{\n\t\t\treturn 1347;\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1347: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Target\n\t{\n\t\tBlockState Target()\n\t\t{\n\t\t\treturn 15760;\n\t\t}\n\t\tunsigned char Power(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15760: return 0;\n\t\t\t\tcase 15761: return 1;\n\t\t\t\tcase 15770: return 10;\n\t\t\t\tcase 15771: return 11;\n\t\t\t\tcase 15772: return 12;\n\t\t\t\tcase 15773: return 13;\n\t\t\t\tcase 15774: return 14;\n\t\t\t\tcase 15775: return 15;\n\t\t\t\tcase 15762: return 2;\n\t\t\t\tcase 15763: return 3;\n\t\t\t\tcase 15764: return 4;\n\t\t\t\tcase 15765: return 5;\n\t\t\t\tcase 15766: return 6;\n\t\t\t\tcase 15767: return 7;\n\t\t\t\tcase 15768: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Terracotta\n\t{\n\t}\n\tnamespace Torch\n\t{\n\t}\n\tnamespace TrappedChest\n\t{\n\t\tBlockState TrappedChest()\n\t\t{\n\t\t\treturn 6623;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6635: case 6637: case 6639: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6641: case 6643: case 6645: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6623: case 6625: case 6627: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6625: case 6631: case 6637: case 6643: return Type::Left;\n\t\t\t\tcase 6627: case 6633: case 6639: case 6645: return Type::Right;\n\t\t\t\tdefault: return Type::Single;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace Tripwire\n\t{\n\t\tBlockState Tripwire()\n\t\t{\n\t\t\treturn 5402;\n\t\t}\n\t\tbool Attached(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5339: case 5340: case 5341: case 5342: case 5343: case 5344: case 5345: case 5346: case 5347: case 5348: case 5349: case 5350: case 5351: case 5352: case 5353: case 5354: case 5355: case 5356: case 5357: case 5358: case 5359: case 5360: case 5361: case 5362: case 5363: case 5364: case 5365: case 5366: case 5367: case 5368: case 5369: case 5370: case 5371: case 5372: case 5373: case 5374: case 5375: case 5376: case 5377: case 5378: case 5379: case 5380: case 5381: case 5382: case 5383: case 5384: case 5385: case 5386: case 5387: case 5388: case 5389: case 5390: case 5391: case 5392: case 5393: case 5394: case 5395: case 5396: case 5397: case 5398: case 5399: case 5400: case 5401: case 5402: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Disarmed(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5307: case 5308: case 5309: case 5310: case 5311: case 5312: case 5313: case 5314: case 5315: case 5316: case 5317: case 5318: case 5319: case 5320: case 5321: case 5322: case 5323: case 5324: case 5325: case 5326: case 5327: case 5328: case 5329: case 5330: case 5331: case 5332: case 5333: case 5334: case 5335: case 5336: case 5337: case 5338: case 5371: case 5372: case 5373: case 5374: case 5375: case 5376: case 5377: case 5378: case 5379: case 5380: case 5381: case 5382: case 5383: case 5384: case 5385: case 5386: case 5387: case 5388: case 5389: case 5390: case 5391: case 5392: case 5393: case 5394: case 5395: case 5396: case 5397: case 5398: case 5399: case 5400: case 5401: case 5402: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5291: case 5292: case 5293: case 5294: case 5295: case 5296: case 5297: case 5298: case 5299: case 5300: case 5301: case 5302: case 5303: case 5304: case 5305: case 5306: case 5323: case 5324: case 5325: case 5326: case 5327: case 5328: case 5329: case 5330: case 5331: case 5332: case 5333: case 5334: case 5335: case 5336: case 5337: case 5338: case 5355: case 5356: case 5357: case 5358: case 5359: case 5360: case 5361: case 5362: case 5363: case 5364: case 5365: case 5366: case 5367: case 5368: case 5369: case 5370: case 5387: case 5388: case 5389: case 5390: case 5391: case 5392: case 5393: case 5394: case 5395: case 5396: case 5397: case 5398: case 5399: case 5400: case 5401: case 5402: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5283: case 5284: case 5285: case 5286: case 5287: case 5288: case 5289: case 5290: case 5299: case 5300: case 5301: case 5302: case 5303: case 5304: case 5305: case 5306: case 5315: case 5316: case 5317: case 5318: case 5319: case 5320: case 5321: case 5322: case 5331: case 5332: case 5333: case 5334: case 5335: case 5336: case 5337: case 5338: case 5347: case 5348: case 5349: case 5350: case 5351: case 5352: case 5353: case 5354: case 5363: case 5364: case 5365: case 5366: case 5367: case 5368: case 5369: case 5370: case 5379: case 5380: case 5381: case 5382: case 5383: case 5384: case 5385: case 5386: case 5395: case 5396: case 5397: case 5398: case 5399: case 5400: case 5401: case 5402: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5279: case 5280: case 5281: case 5282: case 5287: case 5288: case 5289: case 5290: case 5295: case 5296: case 5297: case 5298: case 5303: case 5304: case 5305: case 5306: case 5311: case 5312: case 5313: case 5314: case 5319: case 5320: case 5321: case 5322: case 5327: case 5328: case 5329: case 5330: case 5335: case 5336: case 5337: case 5338: case 5343: case 5344: case 5345: case 5346: case 5351: case 5352: case 5353: case 5354: case 5359: case 5360: case 5361: case 5362: case 5367: case 5368: case 5369: case 5370: case 5375: case 5376: case 5377: case 5378: case 5383: case 5384: case 5385: case 5386: case 5391: case 5392: case 5393: case 5394: case 5399: case 5400: case 5401: case 5402: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5277: case 5278: case 5281: case 5282: case 5285: case 5286: case 5289: case 5290: case 5293: case 5294: case 5297: case 5298: case 5301: case 5302: case 5305: case 5306: case 5309: case 5310: case 5313: case 5314: case 5317: case 5318: case 5321: case 5322: case 5325: case 5326: case 5329: case 5330: case 5333: case 5334: case 5337: case 5338: case 5341: case 5342: case 5345: case 5346: case 5349: case 5350: case 5353: case 5354: case 5357: case 5358: case 5361: case 5362: case 5365: case 5366: case 5369: case 5370: case 5373: case 5374: case 5377: case 5378: case 5381: case 5382: case 5385: case 5386: case 5389: case 5390: case 5393: case 5394: case 5397: case 5398: case 5401: case 5402: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5276: case 5278: case 5280: case 5282: case 5284: case 5286: case 5288: case 5290: case 5292: case 5294: case 5296: case 5298: case 5300: case 5302: case 5304: case 5306: case 5308: case 5310: case 5312: case 5314: case 5316: case 5318: case 5320: case 5322: case 5324: case 5326: case 5328: case 5330: case 5332: case 5334: case 5336: case 5338: case 5340: case 5342: case 5344: case 5346: case 5348: case 5350: case 5352: case 5354: case 5356: case 5358: case 5360: case 5362: case 5364: case 5366: case 5368: case 5370: case 5372: case 5374: case 5376: case 5378: case 5380: case 5382: case 5384: case 5386: case 5388: case 5390: case 5392: case 5394: case 5396: case 5398: case 5400: case 5402: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace TripwireHook\n\t{\n\t\tBlockState TripwireHook()\n\t\t{\n\t\t\treturn 5268;\n\t\t}\n\t\tbool Attached(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5267: case 5268: case 5269: case 5270: case 5271: case 5272: case 5273: case 5274: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5263: case 5264: case 5271: case 5272: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 5265: case 5266: case 5273: case 5274: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 5259: case 5260: case 5267: case 5268: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 5260: case 5262: case 5264: case 5266: case 5268: case 5270: case 5272: case 5274: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace TubeCoral\n\t{\n\t}\n\tnamespace TubeCoralBlock\n\t{\n\t}\n\tnamespace TubeCoralFan\n\t{\n\t}\n\tnamespace TubeCoralWallFan\n\t{\n\t\tBlockState TubeCoralWallFan()\n\t\t{\n\t\t\treturn 9600;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9605: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9607: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9601: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace TurtleEgg\n\t{\n\t\tBlockState TurtleEgg()\n\t\t{\n\t\t\treturn 9498;\n\t\t}\n\t\tunsigned char Eggs(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9498: case 9499: case 9500: return 1;\n\t\t\t\tcase 9501: case 9502: case 9503: return 2;\n\t\t\t\tcase 9504: case 9505: case 9506: return 3;\n\t\t\t\tdefault: return 4;\n\t\t\t}\n\t\t}\n\t\tunsigned char Hatch(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9498: case 9501: case 9504: case 9507: return 0;\n\t\t\t\tcase 9499: case 9502: case 9505: case 9508: return 1;\n\t\t\t\tdefault: return 2;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace TwistingVines\n\t{\n\t\tBlockState TwistingVines()\n\t\t{\n\t\t\treturn 15017;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15017: return 0;\n\t\t\t\tcase 15018: return 1;\n\t\t\t\tcase 15027: return 10;\n\t\t\t\tcase 15028: return 11;\n\t\t\t\tcase 15029: return 12;\n\t\t\t\tcase 15030: return 13;\n\t\t\t\tcase 15031: return 14;\n\t\t\t\tcase 15032: return 15;\n\t\t\t\tcase 15033: return 16;\n\t\t\t\tcase 15034: return 17;\n\t\t\t\tcase 15035: return 18;\n\t\t\t\tcase 15036: return 19;\n\t\t\t\tcase 15019: return 2;\n\t\t\t\tcase 15037: return 20;\n\t\t\t\tcase 15038: return 21;\n\t\t\t\tcase 15039: return 22;\n\t\t\t\tcase 15040: return 23;\n\t\t\t\tcase 15041: return 24;\n\t\t\t\tcase 15042: return 25;\n\t\t\t\tcase 15020: return 3;\n\t\t\t\tcase 15021: return 4;\n\t\t\t\tcase 15022: return 5;\n\t\t\t\tcase 15023: return 6;\n\t\t\t\tcase 15024: return 7;\n\t\t\t\tcase 15025: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace TwistingVinesPlant\n\t{\n\t}\n\tnamespace Vine\n\t{\n\t\tBlockState Vine()\n\t\t{\n\t\t\treturn 4819;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4804: case 4805: case 4806: case 4807: case 4808: case 4809: case 4810: case 4811: case 4812: case 4813: case 4814: case 4815: case 4816: case 4817: case 4818: case 4819: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4796: case 4797: case 4798: case 4799: case 4800: case 4801: case 4802: case 4803: case 4812: case 4813: case 4814: case 4815: case 4816: case 4817: case 4818: case 4819: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4792: case 4793: case 4794: case 4795: case 4800: case 4801: case 4802: case 4803: case 4808: case 4809: case 4810: case 4811: case 4816: case 4817: case 4818: case 4819: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Up(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4790: case 4791: case 4794: case 4795: case 4798: case 4799: case 4802: case 4803: case 4806: case 4807: case 4810: case 4811: case 4814: case 4815: case 4818: case 4819: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 4789: case 4791: case 4793: case 4795: case 4797: case 4799: case 4801: case 4803: case 4805: case 4807: case 4809: case 4811: case 4813: case 4815: case 4817: case 4819: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace VoidAir\n\t{\n\t}\n\tnamespace WallTorch\n\t{\n\t\tBlockState WallTorch()\n\t\t{\n\t\t\treturn 1436;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1438: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1439: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1436: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedButton\n\t{\n\t\tBlockState WarpedButton()\n\t\t{\n\t\t\treturn 15512;\n\t\t}\n\t\tenum Face Face(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15519: case 15520: case 15521: case 15522: case 15523: case 15524: case 15525: case 15526: return Face::Ceiling;\n\t\t\t\tcase 15503: case 15504: case 15505: case 15506: case 15507: case 15508: case 15509: case 15510: return Face::Floor;\n\t\t\t\tdefault: return Face::Wall;\n\t\t\t}\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15507: case 15508: case 15515: case 15516: case 15523: case 15524: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15509: case 15510: case 15517: case 15518: case 15525: case 15526: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15503: case 15504: case 15511: case 15512: case 15519: case 15520: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15504: case 15506: case 15508: case 15510: case 15512: case 15514: case 15516: case 15518: case 15520: case 15522: case 15524: case 15526: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedDoor\n\t{\n\t\tBlockState WarpedDoor()\n\t\t{\n\t\t\treturn 15602;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15623: case 15624: case 15625: case 15626: case 15627: case 15628: case 15629: case 15630: case 15631: case 15632: case 15633: case 15634: case 15635: case 15636: case 15637: case 15638: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15639: case 15640: case 15641: case 15642: case 15643: case 15644: case 15645: case 15646: case 15647: case 15648: case 15649: case 15650: case 15651: case 15652: case 15653: case 15654: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15591: case 15592: case 15593: case 15594: case 15595: case 15596: case 15597: case 15598: case 15599: case 15600: case 15601: case 15602: case 15603: case 15604: case 15605: case 15606: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15599: case 15600: case 15601: case 15602: case 15603: case 15604: case 15605: case 15606: case 15615: case 15616: case 15617: case 15618: case 15619: case 15620: case 15621: case 15622: case 15631: case 15632: case 15633: case 15634: case 15635: case 15636: case 15637: case 15638: case 15647: case 15648: case 15649: case 15650: case 15651: case 15652: case 15653: case 15654: return Half::Lower;\n\t\t\t\tdefault: return Half::Upper;\n\t\t\t}\n\t\t}\n\t\tenum Hinge Hinge(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15591: case 15592: case 15593: case 15594: case 15599: case 15600: case 15601: case 15602: case 15607: case 15608: case 15609: case 15610: case 15615: case 15616: case 15617: case 15618: case 15623: case 15624: case 15625: case 15626: case 15631: case 15632: case 15633: case 15634: case 15639: case 15640: case 15641: case 15642: case 15647: case 15648: case 15649: case 15650: return Hinge::Left;\n\t\t\t\tdefault: return Hinge::Right;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15593: case 15594: case 15597: case 15598: case 15601: case 15602: case 15605: case 15606: case 15609: case 15610: case 15613: case 15614: case 15617: case 15618: case 15621: case 15622: case 15625: case 15626: case 15629: case 15630: case 15633: case 15634: case 15637: case 15638: case 15641: case 15642: case 15645: case 15646: case 15649: case 15650: case 15653: case 15654: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15592: case 15594: case 15596: case 15598: case 15600: case 15602: case 15604: case 15606: case 15608: case 15610: case 15612: case 15614: case 15616: case 15618: case 15620: case 15622: case 15624: case 15626: case 15628: case 15630: case 15632: case 15634: case 15636: case 15638: case 15640: case 15642: case 15644: case 15646: case 15648: case 15650: case 15652: case 15654: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedFence\n\t{\n\t\tBlockState WarpedFence()\n\t\t{\n\t\t\treturn 15126;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15113: case 15114: case 15117: case 15118: case 15121: case 15122: case 15125: case 15126: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15105: case 15106: case 15109: case 15110: case 15121: case 15122: case 15125: case 15126: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15101: case 15102: case 15109: case 15110: case 15117: case 15118: case 15125: case 15126: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15098: case 15102: case 15106: case 15110: case 15114: case 15118: case 15122: case 15126: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedFenceGate\n\t{\n\t\tBlockState WarpedFenceGate()\n\t\t{\n\t\t\treturn 15294;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15303: case 15304: case 15305: case 15306: case 15307: case 15308: case 15309: case 15310: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15311: case 15312: case 15313: case 15314: case 15315: case 15316: case 15317: case 15318: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15287: case 15288: case 15289: case 15290: case 15291: case 15292: case 15293: case 15294: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool InWall(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15291: case 15292: case 15293: case 15294: case 15299: case 15300: case 15301: case 15302: case 15307: case 15308: case 15309: case 15310: case 15315: case 15316: case 15317: case 15318: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15289: case 15290: case 15293: case 15294: case 15297: case 15298: case 15301: case 15302: case 15305: case 15306: case 15309: case 15310: case 15313: case 15314: case 15317: case 15318: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15288: case 15290: case 15292: case 15294: case 15296: case 15298: case 15300: case 15302: case 15304: case 15306: case 15308: case 15310: case 15312: case 15314: case 15316: case 15318: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedFungus\n\t{\n\t}\n\tnamespace WarpedHyphae\n\t{\n\t\tBlockState WarpedHyphae()\n\t\t{\n\t\t\treturn 14965;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14964: return Axis::X;\n\t\t\t\tcase 14965: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedNylium\n\t{\n\t}\n\tnamespace WarpedPlanks\n\t{\n\t}\n\tnamespace WarpedPressurePlate\n\t{\n\t\tBlockState WarpedPressurePlate()\n\t\t{\n\t\t\treturn 15062;\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15062: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedRoots\n\t{\n\t}\n\tnamespace WarpedSign\n\t{\n\t\tBlockState WarpedSign()\n\t\t{\n\t\t\treturn 15688;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15688: return 0;\n\t\t\t\tcase 15690: return 1;\n\t\t\t\tcase 15708: return 10;\n\t\t\t\tcase 15710: return 11;\n\t\t\t\tcase 15712: return 12;\n\t\t\t\tcase 15714: return 13;\n\t\t\t\tcase 15716: return 14;\n\t\t\t\tcase 15718: return 15;\n\t\t\t\tcase 15692: return 2;\n\t\t\t\tcase 15694: return 3;\n\t\t\t\tcase 15696: return 4;\n\t\t\t\tcase 15698: return 5;\n\t\t\t\tcase 15700: return 6;\n\t\t\t\tcase 15702: return 7;\n\t\t\t\tcase 15704: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedSlab\n\t{\n\t\tBlockState WarpedSlab()\n\t\t{\n\t\t\treturn 15056;\n\t\t}\n\t\tenum Type Type(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15056: return Type::Bottom;\n\t\t\t\tcase 15058: return Type::Double;\n\t\t\t\tdefault: return Type::Top;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedStairs\n\t{\n\t\tBlockState WarpedStairs()\n\t\t{\n\t\t\treturn 15410;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15440: case 15442: case 15444: case 15446: case 15448: case 15450: case 15452: case 15454: case 15456: case 15458: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15460: case 15462: case 15464: case 15466: case 15468: case 15470: case 15472: case 15474: case 15476: case 15478: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15400: case 15402: case 15404: case 15406: case 15408: case 15410: case 15412: case 15414: case 15416: case 15418: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15410: case 15412: case 15414: case 15416: case 15418: case 15430: case 15432: case 15434: case 15436: case 15438: case 15450: case 15452: case 15454: case 15456: case 15458: case 15470: case 15472: case 15474: case 15476: case 15478: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tenum Shape Shape(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15402: case 15412: case 15422: case 15432: case 15442: case 15452: case 15462: case 15472: return Shape::InnerLeft;\n\t\t\t\tcase 15404: case 15414: case 15424: case 15434: case 15444: case 15454: case 15464: case 15474: return Shape::InnerRight;\n\t\t\t\tcase 15406: case 15416: case 15426: case 15436: case 15446: case 15456: case 15466: case 15476: return Shape::OuterLeft;\n\t\t\t\tcase 15408: case 15418: case 15428: case 15438: case 15448: case 15458: case 15468: case 15478: return Shape::OuterRight;\n\t\t\t\tdefault: return Shape::Straight;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedStem\n\t{\n\t\tBlockState WarpedStem()\n\t\t{\n\t\t\treturn 14959;\n\t\t}\n\t\tenum Axis Axis(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14958: return Axis::X;\n\t\t\t\tcase 14959: return Axis::Y;\n\t\t\t\tdefault: return Axis::Z;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedTrapdoor\n\t{\n\t\tBlockState WarpedTrapdoor()\n\t\t{\n\t\t\treturn 15206;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15224: case 15226: case 15228: case 15230: case 15232: case 15234: case 15236: case 15238: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15240: case 15242: case 15244: case 15246: case 15248: case 15250: case 15252: case 15254: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15192: case 15194: case 15196: case 15198: case 15200: case 15202: case 15204: case 15206: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tenum Half Half(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15200: case 15202: case 15204: case 15206: case 15216: case 15218: case 15220: case 15222: case 15232: case 15234: case 15236: case 15238: case 15248: case 15250: case 15252: case 15254: return Half::Bottom;\n\t\t\t\tdefault: return Half::Top;\n\t\t\t}\n\t\t}\n\t\tbool Open(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15196: case 15198: case 15204: case 15206: case 15212: case 15214: case 15220: case 15222: case 15228: case 15230: case 15236: case 15238: case 15244: case 15246: case 15252: case 15254: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool Powered(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15194: case 15198: case 15202: case 15206: case 15210: case 15214: case 15218: case 15222: case 15226: case 15230: case 15234: case 15238: case 15242: case 15246: case 15250: case 15254: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedWallSign\n\t{\n\t\tBlockState WarpedWallSign()\n\t\t{\n\t\t\treturn 15728;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 15732: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 15734: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 15728: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WarpedWartBlock\n\t{\n\t}\n\tnamespace Water\n\t{\n\t\tBlockState Water()\n\t\t{\n\t\t\treturn 34;\n\t\t}\n\t\tunsigned char Level(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 34: return 0;\n\t\t\t\tcase 35: return 1;\n\t\t\t\tcase 44: return 10;\n\t\t\t\tcase 45: return 11;\n\t\t\t\tcase 46: return 12;\n\t\t\t\tcase 47: return 13;\n\t\t\t\tcase 48: return 14;\n\t\t\t\tcase 49: return 15;\n\t\t\t\tcase 36: return 2;\n\t\t\t\tcase 37: return 3;\n\t\t\t\tcase 38: return 4;\n\t\t\t\tcase 39: return 5;\n\t\t\t\tcase 40: return 6;\n\t\t\t\tcase 41: return 7;\n\t\t\t\tcase 42: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WeepingVines\n\t{\n\t\tBlockState WeepingVines()\n\t\t{\n\t\t\treturn 14990;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 14990: return 0;\n\t\t\t\tcase 14991: return 1;\n\t\t\t\tcase 15000: return 10;\n\t\t\t\tcase 15001: return 11;\n\t\t\t\tcase 15002: return 12;\n\t\t\t\tcase 15003: return 13;\n\t\t\t\tcase 15004: return 14;\n\t\t\t\tcase 15005: return 15;\n\t\t\t\tcase 15006: return 16;\n\t\t\t\tcase 15007: return 17;\n\t\t\t\tcase 15008: return 18;\n\t\t\t\tcase 15009: return 19;\n\t\t\t\tcase 14992: return 2;\n\t\t\t\tcase 15010: return 20;\n\t\t\t\tcase 15011: return 21;\n\t\t\t\tcase 15012: return 22;\n\t\t\t\tcase 15013: return 23;\n\t\t\t\tcase 15014: return 24;\n\t\t\t\tcase 15015: return 25;\n\t\t\t\tcase 14993: return 3;\n\t\t\t\tcase 14994: return 4;\n\t\t\t\tcase 14995: return 5;\n\t\t\t\tcase 14996: return 6;\n\t\t\t\tcase 14997: return 7;\n\t\t\t\tcase 14998: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WeepingVinesPlant\n\t{\n\t}\n\tnamespace WetSponge\n\t{\n\t}\n\tnamespace Wheat\n\t{\n\t\tBlockState Wheat()\n\t\t{\n\t\t\treturn 3357;\n\t\t}\n\t\tunsigned char Age(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 3357: return 0;\n\t\t\t\tcase 3358: return 1;\n\t\t\t\tcase 3359: return 2;\n\t\t\t\tcase 3360: return 3;\n\t\t\t\tcase 3361: return 4;\n\t\t\t\tcase 3362: return 5;\n\t\t\t\tcase 3363: return 6;\n\t\t\t\tdefault: return 7;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WhiteBanner\n\t{\n\t\tBlockState WhiteBanner()\n\t\t{\n\t\t\treturn 7897;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7897: return 0;\n\t\t\t\tcase 7898: return 1;\n\t\t\t\tcase 7907: return 10;\n\t\t\t\tcase 7908: return 11;\n\t\t\t\tcase 7909: return 12;\n\t\t\t\tcase 7910: return 13;\n\t\t\t\tcase 7911: return 14;\n\t\t\t\tcase 7912: return 15;\n\t\t\t\tcase 7899: return 2;\n\t\t\t\tcase 7900: return 3;\n\t\t\t\tcase 7901: return 4;\n\t\t\t\tcase 7902: return 5;\n\t\t\t\tcase 7903: return 6;\n\t\t\t\tcase 7904: return 7;\n\t\t\t\tcase 7905: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WhiteBed\n\t{\n\t\tBlockState WhiteBed()\n\t\t{\n\t\t\treturn 1052;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1057: case 1058: case 1059: case 1060: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1061: case 1062: case 1063: case 1064: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1049: case 1050: case 1051: case 1052: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1051: case 1052: case 1055: case 1056: case 1059: case 1060: case 1063: case 1064: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1050: case 1052: case 1054: case 1056: case 1058: case 1060: case 1062: case 1064: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WhiteCarpet\n\t{\n\t}\n\tnamespace WhiteConcrete\n\t{\n\t}\n\tnamespace WhiteConcretePowder\n\t{\n\t}\n\tnamespace WhiteGlazedTerracotta\n\t{\n\t\tBlockState WhiteGlazedTerracotta()\n\t\t{\n\t\t\treturn 9374;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9376: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9377: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9374: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WhiteShulkerBox\n\t{\n\t\tBlockState WhiteShulkerBox()\n\t\t{\n\t\t\treturn 9282;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9281: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9279: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9283: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9282: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9278: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WhiteStainedGlass\n\t{\n\t}\n\tnamespace WhiteStainedGlassPane\n\t{\n\t\tBlockState WhiteStainedGlassPane()\n\t\t{\n\t\t\treturn 6894;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6881: case 6882: case 6885: case 6886: case 6889: case 6890: case 6893: case 6894: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6873: case 6874: case 6877: case 6878: case 6889: case 6890: case 6893: case 6894: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6869: case 6870: case 6877: case 6878: case 6885: case 6886: case 6893: case 6894: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6866: case 6870: case 6874: case 6878: case 6882: case 6886: case 6890: case 6894: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WhiteTerracotta\n\t{\n\t}\n\tnamespace WhiteTulip\n\t{\n\t}\n\tnamespace WhiteWallBanner\n\t{\n\t\tBlockState WhiteWallBanner()\n\t\t{\n\t\t\treturn 8153;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8155: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8156: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8153: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WhiteWool\n\t{\n\t}\n\tnamespace WitherRose\n\t{\n\t}\n\tnamespace WitherSkeletonSkull\n\t{\n\t\tBlockState WitherSkeletonSkull()\n\t\t{\n\t\t\treturn 6510;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6510: return 0;\n\t\t\t\tcase 6511: return 1;\n\t\t\t\tcase 6520: return 10;\n\t\t\t\tcase 6521: return 11;\n\t\t\t\tcase 6522: return 12;\n\t\t\t\tcase 6523: return 13;\n\t\t\t\tcase 6524: return 14;\n\t\t\t\tcase 6525: return 15;\n\t\t\t\tcase 6512: return 2;\n\t\t\t\tcase 6513: return 3;\n\t\t\t\tcase 6514: return 4;\n\t\t\t\tcase 6515: return 5;\n\t\t\t\tcase 6516: return 6;\n\t\t\t\tcase 6517: return 7;\n\t\t\t\tcase 6518: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace WitherSkeletonWallSkull\n\t{\n\t\tBlockState WitherSkeletonWallSkull()\n\t\t{\n\t\t\treturn 6526;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6528: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6529: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6526: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace YellowBanner\n\t{\n\t\tBlockState YellowBanner()\n\t\t{\n\t\t\treturn 7961;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7961: return 0;\n\t\t\t\tcase 7962: return 1;\n\t\t\t\tcase 7971: return 10;\n\t\t\t\tcase 7972: return 11;\n\t\t\t\tcase 7973: return 12;\n\t\t\t\tcase 7974: return 13;\n\t\t\t\tcase 7975: return 14;\n\t\t\t\tcase 7976: return 15;\n\t\t\t\tcase 7963: return 2;\n\t\t\t\tcase 7964: return 3;\n\t\t\t\tcase 7965: return 4;\n\t\t\t\tcase 7966: return 5;\n\t\t\t\tcase 7967: return 6;\n\t\t\t\tcase 7968: return 7;\n\t\t\t\tcase 7969: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace YellowBed\n\t{\n\t\tBlockState YellowBed()\n\t\t{\n\t\t\treturn 1116;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1121: case 1122: case 1123: case 1124: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 1125: case 1126: case 1127: case 1128: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 1113: case 1114: case 1115: case 1116: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t\tbool Occupied(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1115: case 1116: case 1119: case 1120: case 1123: case 1124: case 1127: case 1128: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tenum Part Part(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 1114: case 1116: case 1118: case 1120: case 1122: case 1124: case 1126: case 1128: return Part::Foot;\n\t\t\t\tdefault: return Part::Head;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace YellowCarpet\n\t{\n\t}\n\tnamespace YellowConcrete\n\t{\n\t}\n\tnamespace YellowConcretePowder\n\t{\n\t}\n\tnamespace YellowGlazedTerracotta\n\t{\n\t\tBlockState YellowGlazedTerracotta()\n\t\t{\n\t\t\treturn 9390;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9392: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9393: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9390: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace YellowShulkerBox\n\t{\n\t\tBlockState YellowShulkerBox()\n\t\t{\n\t\t\treturn 9306;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 9305: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 9303: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 9307: return eBlockFace::BLOCK_FACE_YM;\n\t\t\t\tcase 9306: return eBlockFace::BLOCK_FACE_YP;\n\t\t\t\tcase 9302: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace YellowStainedGlass\n\t{\n\t}\n\tnamespace YellowStainedGlassPane\n\t{\n\t\tBlockState YellowStainedGlassPane()\n\t\t{\n\t\t\treturn 7022;\n\t\t}\n\t\tbool East(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7009: case 7010: case 7013: case 7014: case 7017: case 7018: case 7021: case 7022: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool North(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 7001: case 7002: case 7005: case 7006: case 7017: case 7018: case 7021: case 7022: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool South(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6997: case 6998: case 7005: case 7006: case 7013: case 7014: case 7021: case 7022: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t\tbool West(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6994: case 6998: case 7002: case 7006: case 7010: case 7014: case 7018: case 7022: return false;\n\t\t\t\tdefault: return true;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace YellowTerracotta\n\t{\n\t}\n\tnamespace YellowWallBanner\n\t{\n\t\tBlockState YellowWallBanner()\n\t\t{\n\t\t\treturn 8169;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 8171: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 8172: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 8169: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace YellowWool\n\t{\n\t}\n\tnamespace ZombieHead\n\t{\n\t\tBlockState ZombieHead()\n\t\t{\n\t\t\treturn 6530;\n\t\t}\n\t\tunsigned char Rotation(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6530: return 0;\n\t\t\t\tcase 6531: return 1;\n\t\t\t\tcase 6540: return 10;\n\t\t\t\tcase 6541: return 11;\n\t\t\t\tcase 6542: return 12;\n\t\t\t\tcase 6543: return 13;\n\t\t\t\tcase 6544: return 14;\n\t\t\t\tcase 6545: return 15;\n\t\t\t\tcase 6532: return 2;\n\t\t\t\tcase 6533: return 3;\n\t\t\t\tcase 6534: return 4;\n\t\t\t\tcase 6535: return 5;\n\t\t\t\tcase 6536: return 6;\n\t\t\t\tcase 6537: return 7;\n\t\t\t\tcase 6538: return 8;\n\t\t\t\tdefault: return 9;\n\t\t\t}\n\t\t}\n\t}\n\tnamespace ZombieWallHead\n\t{\n\t\tBlockState ZombieWallHead()\n\t\t{\n\t\t\treturn 6546;\n\t\t}\n\t\teBlockFace Facing(const BlockState Block)\n\t\t{\n\t\t\tswitch (Block.ID)\n\t\t\t{\n\t\t\t\tcase 6548: return eBlockFace::BLOCK_FACE_XM;\n\t\t\t\tcase 6549: return eBlockFace::BLOCK_FACE_XP;\n\t\t\t\tcase 6546: return eBlockFace::BLOCK_FACE_ZM;\n\t\t\t\tdefault: return eBlockFace::BLOCK_FACE_ZP;\n\t\t\t}\n\t\t}\n\t}\n}\n\nBlockType BlockState::Type() const\n{\n\tswitch (ID)\n\t{\n\t\tcase 6442: case 6443: case 6444: case 6445: case 6446: case 6447: case 6448: case 6449: case 6450: case 6451: case 6452: case 6453: case 6454: case 6455: case 6456: case 6457: case 6458: case 6459: case 6460: case 6461: case 6462: case 6463: case 6464: case 6465: return BlockType::AcaciaButton;\n\t\tcase 8930: case 8931: case 8932: case 8933: case 8934: case 8935: case 8936: case 8937: case 8938: case 8939: case 8940: case 8941: case 8942: case 8943: case 8944: case 8945: case 8946: case 8947: case 8948: case 8949: case 8950: case 8951: case 8952: case 8953: case 8954: case 8955: case 8956: case 8957: case 8958: case 8959: case 8960: case 8961: case 8962: case 8963: case 8964: case 8965: case 8966: case 8967: case 8968: case 8969: case 8970: case 8971: case 8972: case 8973: case 8974: case 8975: case 8976: case 8977: case 8978: case 8979: case 8980: case 8981: case 8982: case 8983: case 8984: case 8985: case 8986: case 8987: case 8988: case 8989: case 8990: case 8991: case 8992: case 8993: return BlockType::AcaciaDoor;\n\t\tcase 8676: case 8677: case 8680: case 8681: case 8684: case 8685: case 8688: case 8689: case 8692: case 8693: case 8696: case 8697: case 8700: case 8701: case 8704: case 8705: return BlockType::AcaciaFence;\n\t\tcase 8514: case 8515: case 8516: case 8517: case 8518: case 8519: case 8520: case 8521: case 8522: case 8523: case 8524: case 8525: case 8526: case 8527: case 8528: case 8529: case 8530: case 8531: case 8532: case 8533: case 8534: case 8535: case 8536: case 8537: case 8538: case 8539: case 8540: case 8541: case 8542: case 8543: case 8544: case 8545: return BlockType::AcaciaFenceGate;\n\t\tcase 201: case 202: case 203: case 204: case 205: case 206: case 207: case 208: case 209: case 210: case 211: case 212: case 213: case 214: return BlockType::AcaciaLeaves;\n\t\tcase 85: case 86: case 87: return BlockType::AcaciaLog;\n\t\tcase 19: return BlockType::AcaciaPlanks;\n\t\tcase 3881: case 3882: return BlockType::AcaciaPressurePlate;\n\t\tcase 29: case 30: return BlockType::AcaciaSapling;\n\t\tcase 3478: case 3480: case 3482: case 3484: case 3486: case 3488: case 3490: case 3492: case 3494: case 3496: case 3498: case 3500: case 3502: case 3504: case 3506: case 3508: return BlockType::AcaciaSign;\n\t\tcase 8325: case 8327: case 8329: return BlockType::AcaciaSlab;\n\t\tcase 7376: case 7378: case 7380: case 7382: case 7384: case 7386: case 7388: case 7390: case 7392: case 7394: case 7396: case 7398: case 7400: case 7402: case 7404: case 7406: case 7408: case 7410: case 7412: case 7414: case 7416: case 7418: case 7420: case 7422: case 7424: case 7426: case 7428: case 7430: case 7432: case 7434: case 7436: case 7438: case 7440: case 7442: case 7444: case 7446: case 7448: case 7450: case 7452: case 7454: return BlockType::AcaciaStairs;\n\t\tcase 4368: case 4370: case 4372: case 4374: case 4376: case 4378: case 4380: case 4382: case 4384: case 4386: case 4388: case 4390: case 4392: case 4394: case 4396: case 4398: case 4400: case 4402: case 4404: case 4406: case 4408: case 4410: case 4412: case 4414: case 4416: case 4418: case 4420: case 4422: case 4424: case 4426: case 4428: case 4430: return BlockType::AcaciaTrapdoor;\n\t\tcase 3760: case 3762: case 3764: case 3766: return BlockType::AcaciaWallSign;\n\t\tcase 121: case 122: case 123: return BlockType::AcaciaWood;\n\t\tcase 6823: case 6824: case 6825: case 6826: case 6827: case 6828: case 6829: case 6830: case 6831: case 6832: case 6833: case 6834: return BlockType::ActivatorRail;\n\t\tcase -0: return BlockType::Air;\n\t\tcase 1415: return BlockType::Allium;\n\t\tcase 15827: return BlockType::AncientDebris;\n\t\tcase 6: return BlockType::Andesite;\n\t\tcase 10844: case 10846: case 10848: return BlockType::AndesiteSlab;\n\t\tcase 10470: case 10472: case 10474: case 10476: case 10478: case 10480: case 10482: case 10484: case 10486: case 10488: case 10490: case 10492: case 10494: case 10496: case 10498: case 10500: case 10502: case 10504: case 10506: case 10508: case 10510: case 10512: case 10514: case 10516: case 10518: case 10520: case 10522: case 10524: case 10526: case 10528: case 10530: case 10532: case 10534: case 10536: case 10538: case 10540: case 10542: case 10544: case 10546: case 10548: return BlockType::AndesiteStairs;\n\t\tcase 13138: case 13139: case 13140: case 13144: case 13145: case 13146: case 13150: case 13151: case 13152: case 13156: case 13157: case 13158: case 13162: case 13163: case 13164: case 13168: case 13169: case 13170: case 13174: case 13175: case 13176: case 13180: case 13181: case 13182: case 13186: case 13187: case 13188: case 13192: case 13193: case 13194: case 13198: case 13199: case 13200: case 13204: case 13205: case 13206: case 13210: case 13211: case 13212: case 13216: case 13217: case 13218: case 13222: case 13223: case 13224: case 13228: case 13229: case 13230: case 13234: case 13235: case 13236: case 13240: case 13241: case 13242: case 13246: case 13247: case 13248: case 13252: case 13253: case 13254: case 13258: case 13259: case 13260: case 13264: case 13265: case 13266: case 13270: case 13271: case 13272: case 13276: case 13277: case 13278: case 13282: case 13283: case 13284: case 13288: case 13289: case 13290: case 13294: case 13295: case 13296: case 13300: case 13301: case 13302: case 13306: case 13307: case 13308: case 13312: case 13313: case 13314: case 13318: case 13319: case 13320: case 13324: case 13325: case 13326: case 13330: case 13331: case 13332: case 13336: case 13337: case 13338: case 13342: case 13343: case 13344: case 13348: case 13349: case 13350: case 13354: case 13355: case 13356: case 13360: case 13361: case 13362: case 13366: case 13367: case 13368: case 13372: case 13373: case 13374: case 13378: case 13379: case 13380: case 13384: case 13385: case 13386: case 13390: case 13391: case 13392: case 13396: case 13397: case 13398: case 13402: case 13403: case 13404: case 13408: case 13409: case 13410: case 13414: case 13415: case 13416: case 13420: case 13421: case 13422: case 13426: case 13427: case 13428: case 13432: case 13433: case 13434: case 13438: case 13439: case 13440: case 13444: case 13445: case 13446: case 13450: case 13451: case 13452: case 13456: case 13457: case 13458: return BlockType::AndesiteWall;\n\t\tcase 6610: case 6611: case 6612: case 6613: return BlockType::Anvil;\n\t\tcase 4768: case 4769: case 4770: case 4771: return BlockType::AttachedMelonStem;\n\t\tcase 4764: case 4765: case 4766: case 4767: return BlockType::AttachedPumpkinStem;\n\t\tcase 1416: return BlockType::AzureBluet;\n\t\tcase 9652: case 9653: case 9654: case 9655: case 9656: case 9657: case 9658: case 9659: case 9660: case 9661: case 9662: case 9663: return BlockType::Bamboo;\n\t\tcase 9651: return BlockType::BambooSapling;\n\t\tcase 14791: case 14792: case 14793: case 14794: case 14795: case 14796: case 14797: case 14798: case 14799: case 14800: case 14801: case 14802: return BlockType::Barrel;\n\t\tcase 7536: return BlockType::Barrier;\n\t\tcase 4002: case 4003: case 4004: return BlockType::Basalt;\n\t\tcase 5656: return BlockType::Beacon;\n\t\tcase 33: return BlockType::Bedrock;\n\t\tcase 15776: case 15777: case 15778: case 15779: case 15780: case 15781: case 15782: case 15783: case 15784: case 15785: case 15786: case 15787: case 15788: case 15789: case 15790: case 15791: case 15792: case 15793: case 15794: case 15795: case 15796: case 15797: case 15798: case 15799: return BlockType::BeeNest;\n\t\tcase 15800: case 15801: case 15802: case 15803: case 15804: case 15805: case 15806: case 15807: case 15808: case 15809: case 15810: case 15811: case 15812: case 15813: case 15814: case 15815: case 15816: case 15817: case 15818: case 15819: case 15820: case 15821: case 15822: case 15823: return BlockType::Beehive;\n\t\tcase 9219: case 9220: case 9221: case 9222: return BlockType::Beetroots;\n\t\tcase 14854: case 14855: case 14856: case 14857: case 14858: case 14859: case 14860: case 14861: case 14862: case 14863: case 14864: case 14865: case 14866: case 14867: case 14868: case 14869: case 14870: case 14871: case 14872: case 14873: case 14874: case 14875: case 14876: case 14877: case 14878: case 14879: case 14880: case 14881: case 14882: case 14883: case 14884: case 14885: return BlockType::Bell;\n\t\tcase 6394: case 6395: case 6396: case 6397: case 6398: case 6399: case 6400: case 6401: case 6402: case 6403: case 6404: case 6405: case 6406: case 6407: case 6408: case 6409: case 6410: case 6411: case 6412: case 6413: case 6414: case 6415: case 6416: case 6417: return BlockType::BirchButton;\n\t\tcase 8802: case 8803: case 8804: case 8805: case 8806: case 8807: case 8808: case 8809: case 8810: case 8811: case 8812: case 8813: case 8814: case 8815: case 8816: case 8817: case 8818: case 8819: case 8820: case 8821: case 8822: case 8823: case 8824: case 8825: case 8826: case 8827: case 8828: case 8829: case 8830: case 8831: case 8832: case 8833: case 8834: case 8835: case 8836: case 8837: case 8838: case 8839: case 8840: case 8841: case 8842: case 8843: case 8844: case 8845: case 8846: case 8847: case 8848: case 8849: case 8850: case 8851: case 8852: case 8853: case 8854: case 8855: case 8856: case 8857: case 8858: case 8859: case 8860: case 8861: case 8862: case 8863: case 8864: case 8865: return BlockType::BirchDoor;\n\t\tcase 8612: case 8613: case 8616: case 8617: case 8620: case 8621: case 8624: case 8625: case 8628: case 8629: case 8632: case 8633: case 8636: case 8637: case 8640: case 8641: return BlockType::BirchFence;\n\t\tcase 8450: case 8451: case 8452: case 8453: case 8454: case 8455: case 8456: case 8457: case 8458: case 8459: case 8460: case 8461: case 8462: case 8463: case 8464: case 8465: case 8466: case 8467: case 8468: case 8469: case 8470: case 8471: case 8472: case 8473: case 8474: case 8475: case 8476: case 8477: case 8478: case 8479: case 8480: case 8481: return BlockType::BirchFenceGate;\n\t\tcase 173: case 174: case 175: case 176: case 177: case 178: case 179: case 180: case 181: case 182: case 183: case 184: case 185: case 186: return BlockType::BirchLeaves;\n\t\tcase 79: case 80: case 81: return BlockType::BirchLog;\n\t\tcase 17: return BlockType::BirchPlanks;\n\t\tcase 3877: case 3878: return BlockType::BirchPressurePlate;\n\t\tcase 25: case 26: return BlockType::BirchSapling;\n\t\tcase 3446: case 3448: case 3450: case 3452: case 3454: case 3456: case 3458: case 3460: case 3462: case 3464: case 3466: case 3468: case 3470: case 3472: case 3474: case 3476: return BlockType::BirchSign;\n\t\tcase 8313: case 8315: case 8317: return BlockType::BirchSlab;\n\t\tcase 5485: case 5487: case 5489: case 5491: case 5493: case 5495: case 5497: case 5499: case 5501: case 5503: case 5505: case 5507: case 5509: case 5511: case 5513: case 5515: case 5517: case 5519: case 5521: case 5523: case 5525: case 5527: case 5529: case 5531: case 5533: case 5535: case 5537: case 5539: case 5541: case 5543: case 5545: case 5547: case 5549: case 5551: case 5553: case 5555: case 5557: case 5559: case 5561: case 5563: return BlockType::BirchStairs;\n\t\tcase 4240: case 4242: case 4244: case 4246: case 4248: case 4250: case 4252: case 4254: case 4256: case 4258: case 4260: case 4262: case 4264: case 4266: case 4268: case 4270: case 4272: case 4274: case 4276: case 4278: case 4280: case 4282: case 4284: case 4286: case 4288: case 4290: case 4292: case 4294: case 4296: case 4298: case 4300: case 4302: return BlockType::BirchTrapdoor;\n\t\tcase 3752: case 3754: case 3756: case 3758: return BlockType::BirchWallSign;\n\t\tcase 115: case 116: case 117: return BlockType::BirchWood;\n\t\tcase 8137: case 8138: case 8139: case 8140: case 8141: case 8142: case 8143: case 8144: case 8145: case 8146: case 8147: case 8148: case 8149: case 8150: case 8151: case 8152: return BlockType::BlackBanner;\n\t\tcase 1289: case 1290: case 1291: case 1292: case 1293: case 1294: case 1295: case 1296: case 1297: case 1298: case 1299: case 1300: case 1301: case 1302: case 1303: case 1304: return BlockType::BlackBed;\n\t\tcase 7881: return BlockType::BlackCarpet;\n\t\tcase 9453: return BlockType::BlackConcrete;\n\t\tcase 9469: return BlockType::BlackConcretePowder;\n\t\tcase 9434: case 9435: case 9436: case 9437: return BlockType::BlackGlazedTerracotta;\n\t\tcase 9368: case 9369: case 9370: case 9371: case 9372: case 9373: return BlockType::BlackShulkerBox;\n\t\tcase 4110: return BlockType::BlackStainedGlass;\n\t\tcase 7345: case 7346: case 7349: case 7350: case 7353: case 7354: case 7357: case 7358: case 7361: case 7362: case 7365: case 7366: case 7369: case 7370: case 7373: case 7374: return BlockType::BlackStainedGlassPane;\n\t\tcase 6862: return BlockType::BlackTerracotta;\n\t\tcase 8213: case 8214: case 8215: case 8216: return BlockType::BlackWallBanner;\n\t\tcase 1399: return BlockType::BlackWool;\n\t\tcase 15839: return BlockType::Blackstone;\n\t\tcase 16245: case 16247: case 16249: return BlockType::BlackstoneSlab;\n\t\tcase 15841: case 15843: case 15845: case 15847: case 15849: case 15851: case 15853: case 15855: case 15857: case 15859: case 15861: case 15863: case 15865: case 15867: case 15869: case 15871: case 15873: case 15875: case 15877: case 15879: case 15881: case 15883: case 15885: case 15887: case 15889: case 15891: case 15893: case 15895: case 15897: case 15899: case 15901: case 15903: case 15905: case 15907: case 15909: case 15911: case 15913: case 15915: case 15917: case 15919: return BlockType::BlackstoneStairs;\n\t\tcase 15923: case 15924: case 15925: case 15929: case 15930: case 15931: case 15935: case 15936: case 15937: case 15941: case 15942: case 15943: case 15947: case 15948: case 15949: case 15953: case 15954: case 15955: case 15959: case 15960: case 15961: case 15965: case 15966: case 15967: case 15971: case 15972: case 15973: case 15977: case 15978: case 15979: case 15983: case 15984: case 15985: case 15989: case 15990: case 15991: case 15995: case 15996: case 15997: case 16001: case 16002: case 16003: case 16007: case 16008: case 16009: case 16013: case 16014: case 16015: case 16019: case 16020: case 16021: case 16025: case 16026: case 16027: case 16031: case 16032: case 16033: case 16037: case 16038: case 16039: case 16043: case 16044: case 16045: case 16049: case 16050: case 16051: case 16055: case 16056: case 16057: case 16061: case 16062: case 16063: case 16067: case 16068: case 16069: case 16073: case 16074: case 16075: case 16079: case 16080: case 16081: case 16085: case 16086: case 16087: case 16091: case 16092: case 16093: case 16097: case 16098: case 16099: case 16103: case 16104: case 16105: case 16109: case 16110: case 16111: case 16115: case 16116: case 16117: case 16121: case 16122: case 16123: case 16127: case 16128: case 16129: case 16133: case 16134: case 16135: case 16139: case 16140: case 16141: case 16145: case 16146: case 16147: case 16151: case 16152: case 16153: case 16157: case 16158: case 16159: case 16163: case 16164: case 16165: case 16169: case 16170: case 16171: case 16175: case 16176: case 16177: case 16181: case 16182: case 16183: case 16187: case 16188: case 16189: case 16193: case 16194: case 16195: case 16199: case 16200: case 16201: case 16205: case 16206: case 16207: case 16211: case 16212: case 16213: case 16217: case 16218: case 16219: case 16223: case 16224: case 16225: case 16229: case 16230: case 16231: case 16235: case 16236: case 16237: case 16241: case 16242: case 16243: return BlockType::BlackstoneWall;\n\t\tcase 14811: case 14812: case 14813: case 14814: case 14815: case 14816: case 14817: case 14818: return BlockType::BlastFurnace;\n\t\tcase 8073: case 8074: case 8075: case 8076: case 8077: case 8078: case 8079: case 8080: case 8081: case 8082: case 8083: case 8084: case 8085: case 8086: case 8087: case 8088: return BlockType::BlueBanner;\n\t\tcase 1225: case 1226: case 1227: case 1228: case 1229: case 1230: case 1231: case 1232: case 1233: case 1234: case 1235: case 1236: case 1237: case 1238: case 1239: case 1240: return BlockType::BlueBed;\n\t\tcase 7877: return BlockType::BlueCarpet;\n\t\tcase 9449: return BlockType::BlueConcrete;\n\t\tcase 9465: return BlockType::BlueConcretePowder;\n\t\tcase 9418: case 9419: case 9420: case 9421: return BlockType::BlueGlazedTerracotta;\n\t\tcase 9648: return BlockType::BlueIce;\n\t\tcase 1414: return BlockType::BlueOrchid;\n\t\tcase 9344: case 9345: case 9346: case 9347: case 9348: case 9349: return BlockType::BlueShulkerBox;\n\t\tcase 4106: return BlockType::BlueStainedGlass;\n\t\tcase 7217: case 7218: case 7221: case 7222: case 7225: case 7226: case 7229: case 7230: case 7233: case 7234: case 7237: case 7238: case 7241: case 7242: case 7245: case 7246: return BlockType::BlueStainedGlassPane;\n\t\tcase 6858: return BlockType::BlueTerracotta;\n\t\tcase 8197: case 8198: case 8199: case 8200: return BlockType::BlueWallBanner;\n\t\tcase 1395: return BlockType::BlueWool;\n\t\tcase 9256: case 9257: case 9258: return BlockType::BoneBlock;\n\t\tcase 1432: return BlockType::Bookshelf;\n\t\tcase 9533: return BlockType::BrainCoral;\n\t\tcase 9516: return BlockType::BrainCoralBlock;\n\t\tcase 9553: return BlockType::BrainCoralFan;\n\t\tcase 9609: case 9611: case 9613: case 9615: return BlockType::BrainCoralWallFan;\n\t\tcase 5133: case 5134: case 5135: case 5136: case 5137: case 5138: case 5139: case 5140: return BlockType::BrewingStand;\n\t\tcase 8373: case 8375: case 8377: return BlockType::BrickSlab;\n\t\tcase 4853: case 4855: case 4857: case 4859: case 4861: case 4863: case 4865: case 4867: case 4869: case 4871: case 4873: case 4875: case 4877: case 4879: case 4881: case 4883: case 4885: case 4887: case 4889: case 4891: case 4893: case 4895: case 4897: case 4899: case 4901: case 4903: case 4905: case 4907: case 4909: case 4911: case 4913: case 4915: case 4917: case 4919: case 4921: case 4923: case 4925: case 4927: case 4929: case 4931: return BlockType::BrickStairs;\n\t\tcase 10870: case 10871: case 10872: case 10876: case 10877: case 10878: case 10882: case 10883: case 10884: case 10888: case 10889: case 10890: case 10894: case 10895: case 10896: case 10900: case 10901: case 10902: case 10906: case 10907: case 10908: case 10912: case 10913: case 10914: case 10918: case 10919: case 10920: case 10924: case 10925: case 10926: case 10930: case 10931: case 10932: case 10936: case 10937: case 10938: case 10942: case 10943: case 10944: case 10948: case 10949: case 10950: case 10954: case 10955: case 10956: case 10960: case 10961: case 10962: case 10966: case 10967: case 10968: case 10972: case 10973: case 10974: case 10978: case 10979: case 10980: case 10984: case 10985: case 10986: case 10990: case 10991: case 10992: case 10996: case 10997: case 10998: case 11002: case 11003: case 11004: case 11008: case 11009: case 11010: case 11014: case 11015: case 11016: case 11020: case 11021: case 11022: case 11026: case 11027: case 11028: case 11032: case 11033: case 11034: case 11038: case 11039: case 11040: case 11044: case 11045: case 11046: case 11050: case 11051: case 11052: case 11056: case 11057: case 11058: case 11062: case 11063: case 11064: case 11068: case 11069: case 11070: case 11074: case 11075: case 11076: case 11080: case 11081: case 11082: case 11086: case 11087: case 11088: case 11092: case 11093: case 11094: case 11098: case 11099: case 11100: case 11104: case 11105: case 11106: case 11110: case 11111: case 11112: case 11116: case 11117: case 11118: case 11122: case 11123: case 11124: case 11128: case 11129: case 11130: case 11134: case 11135: case 11136: case 11140: case 11141: case 11142: case 11146: case 11147: case 11148: case 11152: case 11153: case 11154: case 11158: case 11159: case 11160: case 11164: case 11165: case 11166: case 11170: case 11171: case 11172: case 11176: case 11177: case 11178: case 11182: case 11183: case 11184: case 11188: case 11189: case 11190: return BlockType::BrickWall;\n\t\tcase 1429: return BlockType::Bricks;\n\t\tcase 8089: case 8090: case 8091: case 8092: case 8093: case 8094: case 8095: case 8096: case 8097: case 8098: case 8099: case 8100: case 8101: case 8102: case 8103: case 8104: return BlockType::BrownBanner;\n\t\tcase 1241: case 1242: case 1243: case 1244: case 1245: case 1246: case 1247: case 1248: case 1249: case 1250: case 1251: case 1252: case 1253: case 1254: case 1255: case 1256: return BlockType::BrownBed;\n\t\tcase 7878: return BlockType::BrownCarpet;\n\t\tcase 9450: return BlockType::BrownConcrete;\n\t\tcase 9466: return BlockType::BrownConcretePowder;\n\t\tcase 9422: case 9423: case 9424: case 9425: return BlockType::BrownGlazedTerracotta;\n\t\tcase 1425: return BlockType::BrownMushroom;\n\t\tcase 4505: case 4506: case 4507: case 4508: case 4509: case 4510: case 4511: case 4512: case 4513: case 4514: case 4515: case 4516: case 4517: case 4518: case 4519: case 4520: case 4521: case 4522: case 4523: case 4524: case 4525: case 4526: case 4527: case 4528: case 4529: case 4530: case 4531: case 4532: case 4533: case 4534: case 4535: case 4536: case 4537: case 4538: case 4539: case 4540: case 4541: case 4542: case 4543: case 4544: case 4545: case 4546: case 4547: case 4548: case 4549: case 4550: case 4551: case 4552: case 4553: case 4554: case 4555: case 4556: case 4557: case 4558: case 4559: case 4560: case 4561: case 4562: case 4563: case 4564: case 4565: case 4566: case 4567: case 4568: return BlockType::BrownMushroomBlock;\n\t\tcase 9350: case 9351: case 9352: case 9353: case 9354: case 9355: return BlockType::BrownShulkerBox;\n\t\tcase 4107: return BlockType::BrownStainedGlass;\n\t\tcase 7249: case 7250: case 7253: case 7254: case 7257: case 7258: case 7261: case 7262: case 7265: case 7266: case 7269: case 7270: case 7273: case 7274: case 7277: case 7278: return BlockType::BrownStainedGlassPane;\n\t\tcase 6859: return BlockType::BrownTerracotta;\n\t\tcase 8201: case 8202: case 8203: case 8204: return BlockType::BrownWallBanner;\n\t\tcase 1396: return BlockType::BrownWool;\n\t\tcase 9667: case 9668: return BlockType::BubbleColumn;\n\t\tcase 9535: return BlockType::BubbleCoral;\n\t\tcase 9517: return BlockType::BubbleCoralBlock;\n\t\tcase 9555: return BlockType::BubbleCoralFan;\n\t\tcase 9617: case 9619: case 9621: case 9623: return BlockType::BubbleCoralWallFan;\n\t\tcase 3931: case 3932: case 3933: case 3934: case 3935: case 3936: case 3937: case 3938: case 3939: case 3940: case 3941: case 3942: case 3943: case 3944: case 3945: case 3946: return BlockType::Cactus;\n\t\tcase 4024: case 4025: case 4026: case 4027: case 4028: case 4029: case 4030: return BlockType::Cake;\n\t\tcase 14891: case 14893: case 14895: case 14897: case 14899: case 14901: case 14903: case 14905: case 14907: case 14909: case 14911: case 14913: case 14915: case 14917: case 14919: case 14921: return BlockType::Campfire;\n\t\tcase 6330: case 6331: case 6332: case 6333: case 6334: case 6335: case 6336: case 6337: return BlockType::Carrots;\n\t\tcase 14819: return BlockType::CartographyTable;\n\t\tcase 4016: case 4017: case 4018: case 4019: return BlockType::CarvedPumpkin;\n\t\tcase 5141: case 5142: case 5143: case 5144: return BlockType::Cauldron;\n\t\tcase 9666: return BlockType::CaveAir;\n\t\tcase 4730: return BlockType::Chain;\n\t\tcase 9237: case 9238: case 9239: case 9240: case 9241: case 9242: case 9243: case 9244: case 9245: case 9246: case 9247: case 9248: return BlockType::ChainCommandBlock;\n\t\tcase 2035: case 2037: case 2039: case 2041: case 2043: case 2045: case 2047: case 2049: case 2051: case 2053: case 2055: case 2057: return BlockType::Chest;\n\t\tcase 6614: case 6615: case 6616: case 6617: return BlockType::ChippedAnvil;\n\t\tcase 17101: return BlockType::ChiseledNetherBricks;\n\t\tcase 16253: return BlockType::ChiseledPolishedBlackstone;\n\t\tcase 6739: return BlockType::ChiseledQuartzBlock;\n\t\tcase 8218: return BlockType::ChiseledRedSandstone;\n\t\tcase 247: return BlockType::ChiseledSandstone;\n\t\tcase 4498: return BlockType::ChiseledStoneBricks;\n\t\tcase 9128: case 9129: case 9130: case 9131: case 9132: case 9133: return BlockType::ChorusFlower;\n\t\tcase 9064: case 9065: case 9066: case 9067: case 9068: case 9069: case 9070: case 9071: case 9072: case 9073: case 9074: case 9075: case 9076: case 9077: case 9078: case 9079: case 9080: case 9081: case 9082: case 9083: case 9084: case 9085: case 9086: case 9087: case 9088: case 9089: case 9090: case 9091: case 9092: case 9093: case 9094: case 9095: case 9096: case 9097: case 9098: case 9099: case 9100: case 9101: case 9102: case 9103: case 9104: case 9105: case 9106: case 9107: case 9108: case 9109: case 9110: case 9111: case 9112: case 9113: case 9114: case 9115: case 9116: case 9117: case 9118: case 9119: case 9120: case 9121: case 9122: case 9123: case 9124: case 9125: case 9126: case 9127: return BlockType::ChorusPlant;\n\t\tcase 3947: return BlockType::Clay;\n\t\tcase 7883: return BlockType::CoalBlock;\n\t\tcase 71: return BlockType::CoalOre;\n\t\tcase 11: return BlockType::CoarseDirt;\n\t\tcase 14: return BlockType::Cobblestone;\n\t\tcase 8367: case 8369: case 8371: return BlockType::CobblestoneSlab;\n\t\tcase 3656: case 3658: case 3660: case 3662: case 3664: case 3666: case 3668: case 3670: case 3672: case 3674: case 3676: case 3678: case 3680: case 3682: case 3684: case 3686: case 3688: case 3690: case 3692: case 3694: case 3696: case 3698: case 3700: case 3702: case 3704: case 3706: case 3708: case 3710: case 3712: case 3714: case 3716: case 3718: case 3720: case 3722: case 3724: case 3726: case 3728: case 3730: case 3732: case 3734: return BlockType::CobblestoneStairs;\n\t\tcase 5660: case 5661: case 5662: case 5666: case 5667: case 5668: case 5672: case 5673: case 5674: case 5678: case 5679: case 5680: case 5684: case 5685: case 5686: case 5690: case 5691: case 5692: case 5696: case 5697: case 5698: case 5702: case 5703: case 5704: case 5708: case 5709: case 5710: case 5714: case 5715: case 5716: case 5720: case 5721: case 5722: case 5726: case 5727: case 5728: case 5732: case 5733: case 5734: case 5738: case 5739: case 5740: case 5744: case 5745: case 5746: case 5750: case 5751: case 5752: case 5756: case 5757: case 5758: case 5762: case 5763: case 5764: case 5768: case 5769: case 5770: case 5774: case 5775: case 5776: case 5780: case 5781: case 5782: case 5786: case 5787: case 5788: case 5792: case 5793: case 5794: case 5798: case 5799: case 5800: case 5804: case 5805: case 5806: case 5810: case 5811: case 5812: case 5816: case 5817: case 5818: case 5822: case 5823: case 5824: case 5828: case 5829: case 5830: case 5834: case 5835: case 5836: case 5840: case 5841: case 5842: case 5846: case 5847: case 5848: case 5852: case 5853: case 5854: case 5858: case 5859: case 5860: case 5864: case 5865: case 5866: case 5870: case 5871: case 5872: case 5876: case 5877: case 5878: case 5882: case 5883: case 5884: case 5888: case 5889: case 5890: case 5894: case 5895: case 5896: case 5900: case 5901: case 5902: case 5906: case 5907: case 5908: case 5912: case 5913: case 5914: case 5918: case 5919: case 5920: case 5924: case 5925: case 5926: case 5930: case 5931: case 5932: case 5936: case 5937: case 5938: case 5942: case 5943: case 5944: case 5948: case 5949: case 5950: case 5954: case 5955: case 5956: case 5960: case 5961: case 5962: case 5966: case 5967: case 5968: case 5972: case 5973: case 5974: case 5978: case 5979: case 5980: return BlockType::CobblestoneWall;\n\t\tcase 1341: return BlockType::Cobweb;\n\t\tcase 5158: case 5159: case 5160: case 5161: case 5162: case 5163: case 5164: case 5165: case 5166: case 5167: case 5168: case 5169: return BlockType::Cocoa;\n\t\tcase 5644: case 5645: case 5646: case 5647: case 5648: case 5649: case 5650: case 5651: case 5652: case 5653: case 5654: case 5655: return BlockType::CommandBlock;\n\t\tcase 6678: case 6679: case 6680: case 6681: case 6682: case 6683: case 6684: case 6685: case 6686: case 6687: case 6688: case 6689: case 6690: case 6691: case 6692: case 6693: return BlockType::Comparator;\n\t\tcase 15751: case 15752: case 15753: case 15754: case 15755: case 15756: case 15757: case 15758: case 15759: return BlockType::Composter;\n\t\tcase 9650: return BlockType::Conduit;\n\t\tcase 1422: return BlockType::Cornflower;\n\t\tcase 17102: return BlockType::CrackedNetherBricks;\n\t\tcase 16252: return BlockType::CrackedPolishedBlackstoneBricks;\n\t\tcase 4497: return BlockType::CrackedStoneBricks;\n\t\tcase 3356: return BlockType::CraftingTable;\n\t\tcase 6570: case 6571: case 6572: case 6573: case 6574: case 6575: case 6576: case 6577: case 6578: case 6579: case 6580: case 6581: case 6582: case 6583: case 6584: case 6585: return BlockType::CreeperHead;\n\t\tcase 6586: case 6587: case 6588: case 6589: return BlockType::CreeperWallHead;\n\t\tcase 15479: case 15480: case 15481: case 15482: case 15483: case 15484: case 15485: case 15486: case 15487: case 15488: case 15489: case 15490: case 15491: case 15492: case 15493: case 15494: case 15495: case 15496: case 15497: case 15498: case 15499: case 15500: case 15501: case 15502: return BlockType::CrimsonButton;\n\t\tcase 15527: case 15528: case 15529: case 15530: case 15531: case 15532: case 15533: case 15534: case 15535: case 15536: case 15537: case 15538: case 15539: case 15540: case 15541: case 15542: case 15543: case 15544: case 15545: case 15546: case 15547: case 15548: case 15549: case 15550: case 15551: case 15552: case 15553: case 15554: case 15555: case 15556: case 15557: case 15558: case 15559: case 15560: case 15561: case 15562: case 15563: case 15564: case 15565: case 15566: case 15567: case 15568: case 15569: case 15570: case 15571: case 15572: case 15573: case 15574: case 15575: case 15576: case 15577: case 15578: case 15579: case 15580: case 15581: case 15582: case 15583: case 15584: case 15585: case 15586: case 15587: case 15588: case 15589: case 15590: return BlockType::CrimsonDoor;\n\t\tcase 15065: case 15066: case 15069: case 15070: case 15073: case 15074: case 15077: case 15078: case 15081: case 15082: case 15085: case 15086: case 15089: case 15090: case 15093: case 15094: return BlockType::CrimsonFence;\n\t\tcase 15255: case 15256: case 15257: case 15258: case 15259: case 15260: case 15261: case 15262: case 15263: case 15264: case 15265: case 15266: case 15267: case 15268: case 15269: case 15270: case 15271: case 15272: case 15273: case 15274: case 15275: case 15276: case 15277: case 15278: case 15279: case 15280: case 15281: case 15282: case 15283: case 15284: case 15285: case 15286: return BlockType::CrimsonFenceGate;\n\t\tcase 14988: return BlockType::CrimsonFungus;\n\t\tcase 14981: case 14982: case 14983: return BlockType::CrimsonHyphae;\n\t\tcase 14987: return BlockType::CrimsonNylium;\n\t\tcase 15045: return BlockType::CrimsonPlanks;\n\t\tcase 15059: case 15060: return BlockType::CrimsonPressurePlate;\n\t\tcase 15044: return BlockType::CrimsonRoots;\n\t\tcase 15656: case 15658: case 15660: case 15662: case 15664: case 15666: case 15668: case 15670: case 15672: case 15674: case 15676: case 15678: case 15680: case 15682: case 15684: case 15686: return BlockType::CrimsonSign;\n\t\tcase 15048: case 15050: case 15052: return BlockType::CrimsonSlab;\n\t\tcase 15320: case 15322: case 15324: case 15326: case 15328: case 15330: case 15332: case 15334: case 15336: case 15338: case 15340: case 15342: case 15344: case 15346: case 15348: case 15350: case 15352: case 15354: case 15356: case 15358: case 15360: case 15362: case 15364: case 15366: case 15368: case 15370: case 15372: case 15374: case 15376: case 15378: case 15380: case 15382: case 15384: case 15386: case 15388: case 15390: case 15392: case 15394: case 15396: case 15398: return BlockType::CrimsonStairs;\n\t\tcase 14975: case 14976: case 14977: return BlockType::CrimsonStem;\n\t\tcase 15128: case 15130: case 15132: case 15134: case 15136: case 15138: case 15140: case 15142: case 15144: case 15146: case 15148: case 15150: case 15152: case 15154: case 15156: case 15158: case 15160: case 15162: case 15164: case 15166: case 15168: case 15170: case 15172: case 15174: case 15176: case 15178: case 15180: case 15182: case 15184: case 15186: case 15188: case 15190: return BlockType::CrimsonTrapdoor;\n\t\tcase 15720: case 15722: case 15724: case 15726: return BlockType::CrimsonWallSign;\n\t\tcase 15828: return BlockType::CryingObsidian;\n\t\tcase 8219: return BlockType::CutRedSandstone;\n\t\tcase 8403: case 8405: case 8407: return BlockType::CutRedSandstoneSlab;\n\t\tcase 248: return BlockType::CutSandstone;\n\t\tcase 8355: case 8357: case 8359: return BlockType::CutSandstoneSlab;\n\t\tcase 8041: case 8042: case 8043: case 8044: case 8045: case 8046: case 8047: case 8048: case 8049: case 8050: case 8051: case 8052: case 8053: case 8054: case 8055: case 8056: return BlockType::CyanBanner;\n\t\tcase 1193: case 1194: case 1195: case 1196: case 1197: case 1198: case 1199: case 1200: case 1201: case 1202: case 1203: case 1204: case 1205: case 1206: case 1207: case 1208: return BlockType::CyanBed;\n\t\tcase 7875: return BlockType::CyanCarpet;\n\t\tcase 9447: return BlockType::CyanConcrete;\n\t\tcase 9463: return BlockType::CyanConcretePowder;\n\t\tcase 9410: case 9411: case 9412: case 9413: return BlockType::CyanGlazedTerracotta;\n\t\tcase 9332: case 9333: case 9334: case 9335: case 9336: case 9337: return BlockType::CyanShulkerBox;\n\t\tcase 4104: return BlockType::CyanStainedGlass;\n\t\tcase 7153: case 7154: case 7157: case 7158: case 7161: case 7162: case 7165: case 7166: case 7169: case 7170: case 7173: case 7174: case 7177: case 7178: case 7181: case 7182: return BlockType::CyanStainedGlassPane;\n\t\tcase 6856: return BlockType::CyanTerracotta;\n\t\tcase 8189: case 8190: case 8191: case 8192: return BlockType::CyanWallBanner;\n\t\tcase 1393: return BlockType::CyanWool;\n\t\tcase 6618: case 6619: case 6620: case 6621: return BlockType::DamagedAnvil;\n\t\tcase 1412: return BlockType::Dandelion;\n\t\tcase 6466: case 6467: case 6468: case 6469: case 6470: case 6471: case 6472: case 6473: case 6474: case 6475: case 6476: case 6477: case 6478: case 6479: case 6480: case 6481: case 6482: case 6483: case 6484: case 6485: case 6486: case 6487: case 6488: case 6489: return BlockType::DarkOakButton;\n\t\tcase 8994: case 8995: case 8996: case 8997: case 8998: case 8999: case 9000: case 9001: case 9002: case 9003: case 9004: case 9005: case 9006: case 9007: case 9008: case 9009: case 9010: case 9011: case 9012: case 9013: case 9014: case 9015: case 9016: case 9017: case 9018: case 9019: case 9020: case 9021: case 9022: case 9023: case 9024: case 9025: case 9026: case 9027: case 9028: case 9029: case 9030: case 9031: case 9032: case 9033: case 9034: case 9035: case 9036: case 9037: case 9038: case 9039: case 9040: case 9041: case 9042: case 9043: case 9044: case 9045: case 9046: case 9047: case 9048: case 9049: case 9050: case 9051: case 9052: case 9053: case 9054: case 9055: case 9056: case 9057: return BlockType::DarkOakDoor;\n\t\tcase 8708: case 8709: case 8712: case 8713: case 8716: case 8717: case 8720: case 8721: case 8724: case 8725: case 8728: case 8729: case 8732: case 8733: case 8736: case 8737: return BlockType::DarkOakFence;\n\t\tcase 8546: case 8547: case 8548: case 8549: case 8550: case 8551: case 8552: case 8553: case 8554: case 8555: case 8556: case 8557: case 8558: case 8559: case 8560: case 8561: case 8562: case 8563: case 8564: case 8565: case 8566: case 8567: case 8568: case 8569: case 8570: case 8571: case 8572: case 8573: case 8574: case 8575: case 8576: case 8577: return BlockType::DarkOakFenceGate;\n\t\tcase 215: case 216: case 217: case 218: case 219: case 220: case 221: case 222: case 223: case 224: case 225: case 226: case 227: case 228: return BlockType::DarkOakLeaves;\n\t\tcase 88: case 89: case 90: return BlockType::DarkOakLog;\n\t\tcase 20: return BlockType::DarkOakPlanks;\n\t\tcase 3883: case 3884: return BlockType::DarkOakPressurePlate;\n\t\tcase 31: case 32: return BlockType::DarkOakSapling;\n\t\tcase 3542: case 3544: case 3546: case 3548: case 3550: case 3552: case 3554: case 3556: case 3558: case 3560: case 3562: case 3564: case 3566: case 3568: case 3570: case 3572: return BlockType::DarkOakSign;\n\t\tcase 8331: case 8333: case 8335: return BlockType::DarkOakSlab;\n\t\tcase 7456: case 7458: case 7460: case 7462: case 7464: case 7466: case 7468: case 7470: case 7472: case 7474: case 7476: case 7478: case 7480: case 7482: case 7484: case 7486: case 7488: case 7490: case 7492: case 7494: case 7496: case 7498: case 7500: case 7502: case 7504: case 7506: case 7508: case 7510: case 7512: case 7514: case 7516: case 7518: case 7520: case 7522: case 7524: case 7526: case 7528: case 7530: case 7532: case 7534: return BlockType::DarkOakStairs;\n\t\tcase 4432: case 4434: case 4436: case 4438: case 4440: case 4442: case 4444: case 4446: case 4448: case 4450: case 4452: case 4454: case 4456: case 4458: case 4460: case 4462: case 4464: case 4466: case 4468: case 4470: case 4472: case 4474: case 4476: case 4478: case 4480: case 4482: case 4484: case 4486: case 4488: case 4490: case 4492: case 4494: return BlockType::DarkOakTrapdoor;\n\t\tcase 3776: case 3778: case 3780: case 3782: return BlockType::DarkOakWallSign;\n\t\tcase 124: case 125: case 126: return BlockType::DarkOakWood;\n\t\tcase 7603: return BlockType::DarkPrismarine;\n\t\tcase 7857: case 7859: case 7861: return BlockType::DarkPrismarineSlab;\n\t\tcase 7765: case 7767: case 7769: case 7771: case 7773: case 7775: case 7777: case 7779: case 7781: case 7783: case 7785: case 7787: case 7789: case 7791: case 7793: case 7795: case 7797: case 7799: case 7801: case 7803: case 7805: case 7807: case 7809: case 7811: case 7813: case 7815: case 7817: case 7819: case 7821: case 7823: case 7825: case 7827: case 7829: case 7831: case 7833: case 7835: case 7837: case 7839: case 7841: case 7843: return BlockType::DarkPrismarineStairs;\n\t\tcase 6694: case 6695: case 6696: case 6697: case 6698: case 6699: case 6700: case 6701: case 6702: case 6703: case 6704: case 6705: case 6706: case 6707: case 6708: case 6709: case 6710: case 6711: case 6712: case 6713: case 6714: case 6715: case 6716: case 6717: case 6718: case 6719: case 6720: case 6721: case 6722: case 6723: case 6724: case 6725: return BlockType::DaylightDetector;\n\t\tcase 9523: return BlockType::DeadBrainCoral;\n\t\tcase 9511: return BlockType::DeadBrainCoralBlock;\n\t\tcase 9543: return BlockType::DeadBrainCoralFan;\n\t\tcase 9569: case 9571: case 9573: case 9575: return BlockType::DeadBrainCoralWallFan;\n\t\tcase 9525: return BlockType::DeadBubbleCoral;\n\t\tcase 9512: return BlockType::DeadBubbleCoralBlock;\n\t\tcase 9545: return BlockType::DeadBubbleCoralFan;\n\t\tcase 9577: case 9579: case 9581: case 9583: return BlockType::DeadBubbleCoralWallFan;\n\t\tcase 1344: return BlockType::DeadBush;\n\t\tcase 9527: return BlockType::DeadFireCoral;\n\t\tcase 9513: return BlockType::DeadFireCoralBlock;\n\t\tcase 9547: return BlockType::DeadFireCoralFan;\n\t\tcase 9585: case 9587: case 9589: case 9591: return BlockType::DeadFireCoralWallFan;\n\t\tcase 9529: return BlockType::DeadHornCoral;\n\t\tcase 9514: return BlockType::DeadHornCoralBlock;\n\t\tcase 9549: return BlockType::DeadHornCoralFan;\n\t\tcase 9593: case 9595: case 9597: case 9599: return BlockType::DeadHornCoralWallFan;\n\t\tcase 9521: return BlockType::DeadTubeCoral;\n\t\tcase 9510: return BlockType::DeadTubeCoralBlock;\n\t\tcase 9541: return BlockType::DeadTubeCoralFan;\n\t\tcase 9561: case 9563: case 9565: case 9567: return BlockType::DeadTubeCoralWallFan;\n\t\tcase 1317: case 1318: case 1319: case 1320: case 1321: case 1322: case 1323: case 1324: case 1325: case 1326: case 1327: case 1328: return BlockType::DetectorRail;\n\t\tcase 3355: return BlockType::DiamondBlock;\n\t\tcase 3354: return BlockType::DiamondOre;\n\t\tcase 4: return BlockType::Diorite;\n\t\tcase 10862: case 10864: case 10866: return BlockType::DioriteSlab;\n\t\tcase 10710: case 10712: case 10714: case 10716: case 10718: case 10720: case 10722: case 10724: case 10726: case 10728: case 10730: case 10732: case 10734: case 10736: case 10738: case 10740: case 10742: case 10744: case 10746: case 10748: case 10750: case 10752: case 10754: case 10756: case 10758: case 10760: case 10762: case 10764: case 10766: case 10768: case 10770: case 10772: case 10774: case 10776: case 10778: case 10780: case 10782: case 10784: case 10786: case 10788: return BlockType::DioriteStairs;\n\t\tcase 14434: case 14435: case 14436: case 14440: case 14441: case 14442: case 14446: case 14447: case 14448: case 14452: case 14453: case 14454: case 14458: case 14459: case 14460: case 14464: case 14465: case 14466: case 14470: case 14471: case 14472: case 14476: case 14477: case 14478: case 14482: case 14483: case 14484: case 14488: case 14489: case 14490: case 14494: case 14495: case 14496: case 14500: case 14501: case 14502: case 14506: case 14507: case 14508: case 14512: case 14513: case 14514: case 14518: case 14519: case 14520: case 14524: case 14525: case 14526: case 14530: case 14531: case 14532: case 14536: case 14537: case 14538: case 14542: case 14543: case 14544: case 14548: case 14549: case 14550: case 14554: case 14555: case 14556: case 14560: case 14561: case 14562: case 14566: case 14567: case 14568: case 14572: case 14573: case 14574: case 14578: case 14579: case 14580: case 14584: case 14585: case 14586: case 14590: case 14591: case 14592: case 14596: case 14597: case 14598: case 14602: case 14603: case 14604: case 14608: case 14609: case 14610: case 14614: case 14615: case 14616: case 14620: case 14621: case 14622: case 14626: case 14627: case 14628: case 14632: case 14633: case 14634: case 14638: case 14639: case 14640: case 14644: case 14645: case 14646: case 14650: case 14651: case 14652: case 14656: case 14657: case 14658: case 14662: case 14663: case 14664: case 14668: case 14669: case 14670: case 14674: case 14675: case 14676: case 14680: case 14681: case 14682: case 14686: case 14687: case 14688: case 14692: case 14693: case 14694: case 14698: case 14699: case 14700: case 14704: case 14705: case 14706: case 14710: case 14711: case 14712: case 14716: case 14717: case 14718: case 14722: case 14723: case 14724: case 14728: case 14729: case 14730: case 14734: case 14735: case 14736: case 14740: case 14741: case 14742: case 14746: case 14747: case 14748: case 14752: case 14753: case 14754: return BlockType::DioriteWall;\n\t\tcase 10: return BlockType::Dirt;\n\t\tcase 234: case 235: case 236: case 237: case 238: case 239: case 240: case 241: case 242: case 243: case 244: case 245: return BlockType::Dispenser;\n\t\tcase 5155: return BlockType::DragonEgg;\n\t\tcase 6590: case 6591: case 6592: case 6593: case 6594: case 6595: case 6596: case 6597: case 6598: case 6599: case 6600: case 6601: case 6602: case 6603: case 6604: case 6605: return BlockType::DragonHead;\n\t\tcase 6606: case 6607: case 6608: case 6609: return BlockType::DragonWallHead;\n\t\tcase 9497: return BlockType::DriedKelpBlock;\n\t\tcase 6835: case 6836: case 6837: case 6838: case 6839: case 6840: case 6841: case 6842: case 6843: case 6844: case 6845: case 6846: return BlockType::Dropper;\n\t\tcase 5403: return BlockType::EmeraldBlock;\n\t\tcase 5250: return BlockType::EmeraldOre;\n\t\tcase 5132: return BlockType::EnchantingTable;\n\t\tcase 9224: return BlockType::EndGateway;\n\t\tcase 5145: return BlockType::EndPortal;\n\t\tcase 5146: case 5147: case 5148: case 5149: case 5150: case 5151: case 5152: case 5153: return BlockType::EndPortalFrame;\n\t\tcase 9058: case 9059: case 9060: case 9061: case 9062: case 9063: return BlockType::EndRod;\n\t\tcase 5154: return BlockType::EndStone;\n\t\tcase 10820: case 10822: case 10824: return BlockType::EndStoneBrickSlab;\n\t\tcase 10070: case 10072: case 10074: case 10076: case 10078: case 10080: case 10082: case 10084: case 10086: case 10088: case 10090: case 10092: case 10094: case 10096: case 10098: case 10100: case 10102: case 10104: case 10106: case 10108: case 10110: case 10112: case 10114: case 10116: case 10118: case 10120: case 10122: case 10124: case 10126: case 10128: case 10130: case 10132: case 10134: case 10136: case 10138: case 10140: case 10142: case 10144: case 10146: case 10148: return BlockType::EndStoneBrickStairs;\n\t\tcase 14110: case 14111: case 14112: case 14116: case 14117: case 14118: case 14122: case 14123: case 14124: case 14128: case 14129: case 14130: case 14134: case 14135: case 14136: case 14140: case 14141: case 14142: case 14146: case 14147: case 14148: case 14152: case 14153: case 14154: case 14158: case 14159: case 14160: case 14164: case 14165: case 14166: case 14170: case 14171: case 14172: case 14176: case 14177: case 14178: case 14182: case 14183: case 14184: case 14188: case 14189: case 14190: case 14194: case 14195: case 14196: case 14200: case 14201: case 14202: case 14206: case 14207: case 14208: case 14212: case 14213: case 14214: case 14218: case 14219: case 14220: case 14224: case 14225: case 14226: case 14230: case 14231: case 14232: case 14236: case 14237: case 14238: case 14242: case 14243: case 14244: case 14248: case 14249: case 14250: case 14254: case 14255: case 14256: case 14260: case 14261: case 14262: case 14266: case 14267: case 14268: case 14272: case 14273: case 14274: case 14278: case 14279: case 14280: case 14284: case 14285: case 14286: case 14290: case 14291: case 14292: case 14296: case 14297: case 14298: case 14302: case 14303: case 14304: case 14308: case 14309: case 14310: case 14314: case 14315: case 14316: case 14320: case 14321: case 14322: case 14326: case 14327: case 14328: case 14332: case 14333: case 14334: case 14338: case 14339: case 14340: case 14344: case 14345: case 14346: case 14350: case 14351: case 14352: case 14356: case 14357: case 14358: case 14362: case 14363: case 14364: case 14368: case 14369: case 14370: case 14374: case 14375: case 14376: case 14380: case 14381: case 14382: case 14386: case 14387: case 14388: case 14392: case 14393: case 14394: case 14398: case 14399: case 14400: case 14404: case 14405: case 14406: case 14410: case 14411: case 14412: case 14416: case 14417: case 14418: case 14422: case 14423: case 14424: case 14428: case 14429: case 14430: return BlockType::EndStoneBrickWall;\n\t\tcase 9218: return BlockType::EndStoneBricks;\n\t\tcase 5252: case 5254: case 5256: case 5258: return BlockType::EnderChest;\n\t\tcase 3365: case 3366: case 3367: case 3368: case 3369: case 3370: case 3371: case 3372: return BlockType::Farmland;\n\t\tcase 1343: return BlockType::Fern;\n\t\tcase 1440: case 1441: case 1442: case 1443: case 1444: case 1445: case 1446: case 1447: case 1448: case 1449: case 1450: case 1451: case 1452: case 1453: case 1454: case 1455: case 1456: case 1457: case 1458: case 1459: case 1460: case 1461: case 1462: case 1463: case 1464: case 1465: case 1466: case 1467: case 1468: case 1469: case 1470: case 1471: case 1472: case 1473: case 1474: case 1475: case 1476: case 1477: case 1478: case 1479: case 1480: case 1481: case 1482: case 1483: case 1484: case 1485: case 1486: case 1487: case 1488: case 1489: case 1490: case 1491: case 1492: case 1493: case 1494: case 1495: case 1496: case 1497: case 1498: case 1499: case 1500: case 1501: case 1502: case 1503: case 1504: case 1505: case 1506: case 1507: case 1508: case 1509: case 1510: case 1511: case 1512: case 1513: case 1514: case 1515: case 1516: case 1517: case 1518: case 1519: case 1520: case 1521: case 1522: case 1523: case 1524: case 1525: case 1526: case 1527: case 1528: case 1529: case 1530: case 1531: case 1532: case 1533: case 1534: case 1535: case 1536: case 1537: case 1538: case 1539: case 1540: case 1541: case 1542: case 1543: case 1544: case 1545: case 1546: case 1547: case 1548: case 1549: case 1550: case 1551: case 1552: case 1553: case 1554: case 1555: case 1556: case 1557: case 1558: case 1559: case 1560: case 1561: case 1562: case 1563: case 1564: case 1565: case 1566: case 1567: case 1568: case 1569: case 1570: case 1571: case 1572: case 1573: case 1574: case 1575: case 1576: case 1577: case 1578: case 1579: case 1580: case 1581: case 1582: case 1583: case 1584: case 1585: case 1586: case 1587: case 1588: case 1589: case 1590: case 1591: case 1592: case 1593: case 1594: case 1595: case 1596: case 1597: case 1598: case 1599: case 1600: case 1601: case 1602: case 1603: case 1604: case 1605: case 1606: case 1607: case 1608: case 1609: case 1610: case 1611: case 1612: case 1613: case 1614: case 1615: case 1616: case 1617: case 1618: case 1619: case 1620: case 1621: case 1622: case 1623: case 1624: case 1625: case 1626: case 1627: case 1628: case 1629: case 1630: case 1631: case 1632: case 1633: case 1634: case 1635: case 1636: case 1637: case 1638: case 1639: case 1640: case 1641: case 1642: case 1643: case 1644: case 1645: case 1646: case 1647: case 1648: case 1649: case 1650: case 1651: case 1652: case 1653: case 1654: case 1655: case 1656: case 1657: case 1658: case 1659: case 1660: case 1661: case 1662: case 1663: case 1664: case 1665: case 1666: case 1667: case 1668: case 1669: case 1670: case 1671: case 1672: case 1673: case 1674: case 1675: case 1676: case 1677: case 1678: case 1679: case 1680: case 1681: case 1682: case 1683: case 1684: case 1685: case 1686: case 1687: case 1688: case 1689: case 1690: case 1691: case 1692: case 1693: case 1694: case 1695: case 1696: case 1697: case 1698: case 1699: case 1700: case 1701: case 1702: case 1703: case 1704: case 1705: case 1706: case 1707: case 1708: case 1709: case 1710: case 1711: case 1712: case 1713: case 1714: case 1715: case 1716: case 1717: case 1718: case 1719: case 1720: case 1721: case 1722: case 1723: case 1724: case 1725: case 1726: case 1727: case 1728: case 1729: case 1730: case 1731: case 1732: case 1733: case 1734: case 1735: case 1736: case 1737: case 1738: case 1739: case 1740: case 1741: case 1742: case 1743: case 1744: case 1745: case 1746: case 1747: case 1748: case 1749: case 1750: case 1751: case 1752: case 1753: case 1754: case 1755: case 1756: case 1757: case 1758: case 1759: case 1760: case 1761: case 1762: case 1763: case 1764: case 1765: case 1766: case 1767: case 1768: case 1769: case 1770: case 1771: case 1772: case 1773: case 1774: case 1775: case 1776: case 1777: case 1778: case 1779: case 1780: case 1781: case 1782: case 1783: case 1784: case 1785: case 1786: case 1787: case 1788: case 1789: case 1790: case 1791: case 1792: case 1793: case 1794: case 1795: case 1796: case 1797: case 1798: case 1799: case 1800: case 1801: case 1802: case 1803: case 1804: case 1805: case 1806: case 1807: case 1808: case 1809: case 1810: case 1811: case 1812: case 1813: case 1814: case 1815: case 1816: case 1817: case 1818: case 1819: case 1820: case 1821: case 1822: case 1823: case 1824: case 1825: case 1826: case 1827: case 1828: case 1829: case 1830: case 1831: case 1832: case 1833: case 1834: case 1835: case 1836: case 1837: case 1838: case 1839: case 1840: case 1841: case 1842: case 1843: case 1844: case 1845: case 1846: case 1847: case 1848: case 1849: case 1850: case 1851: case 1852: case 1853: case 1854: case 1855: case 1856: case 1857: case 1858: case 1859: case 1860: case 1861: case 1862: case 1863: case 1864: case 1865: case 1866: case 1867: case 1868: case 1869: case 1870: case 1871: case 1872: case 1873: case 1874: case 1875: case 1876: case 1877: case 1878: case 1879: case 1880: case 1881: case 1882: case 1883: case 1884: case 1885: case 1886: case 1887: case 1888: case 1889: case 1890: case 1891: case 1892: case 1893: case 1894: case 1895: case 1896: case 1897: case 1898: case 1899: case 1900: case 1901: case 1902: case 1903: case 1904: case 1905: case 1906: case 1907: case 1908: case 1909: case 1910: case 1911: case 1912: case 1913: case 1914: case 1915: case 1916: case 1917: case 1918: case 1919: case 1920: case 1921: case 1922: case 1923: case 1924: case 1925: case 1926: case 1927: case 1928: case 1929: case 1930: case 1931: case 1932: case 1933: case 1934: case 1935: case 1936: case 1937: case 1938: case 1939: case 1940: case 1941: case 1942: case 1943: case 1944: case 1945: case 1946: case 1947: case 1948: case 1949: case 1950: case 1951: return BlockType::Fire;\n\t\tcase 9537: return BlockType::FireCoral;\n\t\tcase 9518: return BlockType::FireCoralBlock;\n\t\tcase 9557: return BlockType::FireCoralFan;\n\t\tcase 9625: case 9627: case 9629: case 9631: return BlockType::FireCoralWallFan;\n\t\tcase 14820: return BlockType::FletchingTable;\n\t\tcase 6305: return BlockType::FlowerPot;\n\t\tcase 9249: case 9250: case 9251: case 9252: return BlockType::FrostedIce;\n\t\tcase 3373: case 3374: case 3375: case 3376: case 3377: case 3378: case 3379: case 3380: return BlockType::Furnace;\n\t\tcase 16664: return BlockType::GildedBlackstone;\n\t\tcase 231: return BlockType::Glass;\n\t\tcase 4733: case 4734: case 4737: case 4738: case 4741: case 4742: case 4745: case 4746: case 4749: case 4750: case 4753: case 4754: case 4757: case 4758: case 4761: case 4762: return BlockType::GlassPane;\n\t\tcase 4013: return BlockType::Glowstone;\n\t\tcase 1427: return BlockType::GoldBlock;\n\t\tcase 69: return BlockType::GoldOre;\n\t\tcase 2: return BlockType::Granite;\n\t\tcase 10838: case 10840: case 10842: return BlockType::GraniteSlab;\n\t\tcase 10390: case 10392: case 10394: case 10396: case 10398: case 10400: case 10402: case 10404: case 10406: case 10408: case 10410: case 10412: case 10414: case 10416: case 10418: case 10420: case 10422: case 10424: case 10426: case 10428: case 10430: case 10432: case 10434: case 10436: case 10438: case 10440: case 10442: case 10444: case 10446: case 10448: case 10450: case 10452: case 10454: case 10456: case 10458: case 10460: case 10462: case 10464: case 10466: case 10468: return BlockType::GraniteStairs;\n\t\tcase 12166: case 12167: case 12168: case 12172: case 12173: case 12174: case 12178: case 12179: case 12180: case 12184: case 12185: case 12186: case 12190: case 12191: case 12192: case 12196: case 12197: case 12198: case 12202: case 12203: case 12204: case 12208: case 12209: case 12210: case 12214: case 12215: case 12216: case 12220: case 12221: case 12222: case 12226: case 12227: case 12228: case 12232: case 12233: case 12234: case 12238: case 12239: case 12240: case 12244: case 12245: case 12246: case 12250: case 12251: case 12252: case 12256: case 12257: case 12258: case 12262: case 12263: case 12264: case 12268: case 12269: case 12270: case 12274: case 12275: case 12276: case 12280: case 12281: case 12282: case 12286: case 12287: case 12288: case 12292: case 12293: case 12294: case 12298: case 12299: case 12300: case 12304: case 12305: case 12306: case 12310: case 12311: case 12312: case 12316: case 12317: case 12318: case 12322: case 12323: case 12324: case 12328: case 12329: case 12330: case 12334: case 12335: case 12336: case 12340: case 12341: case 12342: case 12346: case 12347: case 12348: case 12352: case 12353: case 12354: case 12358: case 12359: case 12360: case 12364: case 12365: case 12366: case 12370: case 12371: case 12372: case 12376: case 12377: case 12378: case 12382: case 12383: case 12384: case 12388: case 12389: case 12390: case 12394: case 12395: case 12396: case 12400: case 12401: case 12402: case 12406: case 12407: case 12408: case 12412: case 12413: case 12414: case 12418: case 12419: case 12420: case 12424: case 12425: case 12426: case 12430: case 12431: case 12432: case 12436: case 12437: case 12438: case 12442: case 12443: case 12444: case 12448: case 12449: case 12450: case 12454: case 12455: case 12456: case 12460: case 12461: case 12462: case 12466: case 12467: case 12468: case 12472: case 12473: case 12474: case 12478: case 12479: case 12480: case 12484: case 12485: case 12486: return BlockType::GraniteWall;\n\t\tcase 1342: return BlockType::Grass;\n\t\tcase 8: case 9: return BlockType::GrassBlock;\n\t\tcase 9223: return BlockType::GrassPath;\n\t\tcase 68: return BlockType::Gravel;\n\t\tcase 8009: case 8010: case 8011: case 8012: case 8013: case 8014: case 8015: case 8016: case 8017: case 8018: case 8019: case 8020: case 8021: case 8022: case 8023: case 8024: return BlockType::GrayBanner;\n\t\tcase 1161: case 1162: case 1163: case 1164: case 1165: case 1166: case 1167: case 1168: case 1169: case 1170: case 1171: case 1172: case 1173: case 1174: case 1175: case 1176: return BlockType::GrayBed;\n\t\tcase 7873: return BlockType::GrayCarpet;\n\t\tcase 9445: return BlockType::GrayConcrete;\n\t\tcase 9461: return BlockType::GrayConcretePowder;\n\t\tcase 9402: case 9403: case 9404: case 9405: return BlockType::GrayGlazedTerracotta;\n\t\tcase 9320: case 9321: case 9322: case 9323: case 9324: case 9325: return BlockType::GrayShulkerBox;\n\t\tcase 4102: return BlockType::GrayStainedGlass;\n\t\tcase 7089: case 7090: case 7093: case 7094: case 7097: case 7098: case 7101: case 7102: case 7105: case 7106: case 7109: case 7110: case 7113: case 7114: case 7117: case 7118: return BlockType::GrayStainedGlassPane;\n\t\tcase 6854: return BlockType::GrayTerracotta;\n\t\tcase 8181: case 8182: case 8183: case 8184: return BlockType::GrayWallBanner;\n\t\tcase 1391: return BlockType::GrayWool;\n\t\tcase 8105: case 8106: case 8107: case 8108: case 8109: case 8110: case 8111: case 8112: case 8113: case 8114: case 8115: case 8116: case 8117: case 8118: case 8119: case 8120: return BlockType::GreenBanner;\n\t\tcase 1257: case 1258: case 1259: case 1260: case 1261: case 1262: case 1263: case 1264: case 1265: case 1266: case 1267: case 1268: case 1269: case 1270: case 1271: case 1272: return BlockType::GreenBed;\n\t\tcase 7879: return BlockType::GreenCarpet;\n\t\tcase 9451: return BlockType::GreenConcrete;\n\t\tcase 9467: return BlockType::GreenConcretePowder;\n\t\tcase 9426: case 9427: case 9428: case 9429: return BlockType::GreenGlazedTerracotta;\n\t\tcase 9356: case 9357: case 9358: case 9359: case 9360: case 9361: return BlockType::GreenShulkerBox;\n\t\tcase 4108: return BlockType::GreenStainedGlass;\n\t\tcase 7281: case 7282: case 7285: case 7286: case 7289: case 7290: case 7293: case 7294: case 7297: case 7298: case 7301: case 7302: case 7305: case 7306: case 7309: case 7310: return BlockType::GreenStainedGlassPane;\n\t\tcase 6860: return BlockType::GreenTerracotta;\n\t\tcase 8205: case 8206: case 8207: case 8208: return BlockType::GreenWallBanner;\n\t\tcase 1397: return BlockType::GreenWool;\n\t\tcase 14821: case 14822: case 14823: case 14824: case 14825: case 14826: case 14827: case 14828: case 14829: case 14830: case 14831: case 14832: return BlockType::Grindstone;\n\t\tcase 7863: case 7864: case 7865: return BlockType::HayBale;\n\t\tcase 6662: case 6663: case 6664: case 6665: case 6666: case 6667: case 6668: case 6669: case 6670: case 6671: case 6672: case 6673: case 6674: case 6675: case 6676: case 6677: return BlockType::HeavyWeightedPressurePlate;\n\t\tcase 15824: return BlockType::HoneyBlock;\n\t\tcase 15825: return BlockType::HoneycombBlock;\n\t\tcase 6728: case 6729: case 6730: case 6731: case 6732: case 6733: case 6734: case 6735: case 6736: case 6737: return BlockType::Hopper;\n\t\tcase 9539: return BlockType::HornCoral;\n\t\tcase 9519: return BlockType::HornCoralBlock;\n\t\tcase 9559: return BlockType::HornCoralFan;\n\t\tcase 9633: case 9635: case 9637: case 9639: return BlockType::HornCoralWallFan;\n\t\tcase 3929: return BlockType::Ice;\n\t\tcase 4504: return BlockType::InfestedChiseledStoneBricks;\n\t\tcase 4500: return BlockType::InfestedCobblestone;\n\t\tcase 4503: return BlockType::InfestedCrackedStoneBricks;\n\t\tcase 4502: return BlockType::InfestedMossyStoneBricks;\n\t\tcase 4499: return BlockType::InfestedStone;\n\t\tcase 4501: return BlockType::InfestedStoneBricks;\n\t\tcase 4699: case 4700: case 4703: case 4704: case 4707: case 4708: case 4711: case 4712: case 4715: case 4716: case 4719: case 4720: case 4723: case 4724: case 4727: case 4728: return BlockType::IronBars;\n\t\tcase 1428: return BlockType::IronBlock;\n\t\tcase 3809: case 3810: case 3811: case 3812: case 3813: case 3814: case 3815: case 3816: case 3817: case 3818: case 3819: case 3820: case 3821: case 3822: case 3823: case 3824: case 3825: case 3826: case 3827: case 3828: case 3829: case 3830: case 3831: case 3832: case 3833: case 3834: case 3835: case 3836: case 3837: case 3838: case 3839: case 3840: case 3841: case 3842: case 3843: case 3844: case 3845: case 3846: case 3847: case 3848: case 3849: case 3850: case 3851: case 3852: case 3853: case 3854: case 3855: case 3856: case 3857: case 3858: case 3859: case 3860: case 3861: case 3862: case 3863: case 3864: case 3865: case 3866: case 3867: case 3868: case 3869: case 3870: case 3871: case 3872: return BlockType::IronDoor;\n\t\tcase 70: return BlockType::IronOre;\n\t\tcase 7538: case 7540: case 7542: case 7544: case 7546: case 7548: case 7550: case 7552: case 7554: case 7556: case 7558: case 7560: case 7562: case 7564: case 7566: case 7568: case 7570: case 7572: case 7574: case 7576: case 7578: case 7580: case 7582: case 7584: case 7586: case 7588: case 7590: case 7592: case 7594: case 7596: case 7598: case 7600: return BlockType::IronTrapdoor;\n\t\tcase 4020: case 4021: case 4022: case 4023: return BlockType::JackOLantern;\n\t\tcase 15739: case 15740: case 15741: case 15742: case 15743: case 15744: case 15745: case 15746: case 15747: case 15748: case 15749: case 15750: return BlockType::Jigsaw;\n\t\tcase 3964: case 3965: return BlockType::Jukebox;\n\t\tcase 6418: case 6419: case 6420: case 6421: case 6422: case 6423: case 6424: case 6425: case 6426: case 6427: case 6428: case 6429: case 6430: case 6431: case 6432: case 6433: case 6434: case 6435: case 6436: case 6437: case 6438: case 6439: case 6440: case 6441: return BlockType::JungleButton;\n\t\tcase 8866: case 8867: case 8868: case 8869: case 8870: case 8871: case 8872: case 8873: case 8874: case 8875: case 8876: case 8877: case 8878: case 8879: case 8880: case 8881: case 8882: case 8883: case 8884: case 8885: case 8886: case 8887: case 8888: case 8889: case 8890: case 8891: case 8892: case 8893: case 8894: case 8895: case 8896: case 8897: case 8898: case 8899: case 8900: case 8901: case 8902: case 8903: case 8904: case 8905: case 8906: case 8907: case 8908: case 8909: case 8910: case 8911: case 8912: case 8913: case 8914: case 8915: case 8916: case 8917: case 8918: case 8919: case 8920: case 8921: case 8922: case 8923: case 8924: case 8925: case 8926: case 8927: case 8928: case 8929: return BlockType::JungleDoor;\n\t\tcase 8644: case 8645: case 8648: case 8649: case 8652: case 8653: case 8656: case 8657: case 8660: case 8661: case 8664: case 8665: case 8668: case 8669: case 8672: case 8673: return BlockType::JungleFence;\n\t\tcase 8482: case 8483: case 8484: case 8485: case 8486: case 8487: case 8488: case 8489: case 8490: case 8491: case 8492: case 8493: case 8494: case 8495: case 8496: case 8497: case 8498: case 8499: case 8500: case 8501: case 8502: case 8503: case 8504: case 8505: case 8506: case 8507: case 8508: case 8509: case 8510: case 8511: case 8512: case 8513: return BlockType::JungleFenceGate;\n\t\tcase 187: case 188: case 189: case 190: case 191: case 192: case 193: case 194: case 195: case 196: case 197: case 198: case 199: case 200: return BlockType::JungleLeaves;\n\t\tcase 82: case 83: case 84: return BlockType::JungleLog;\n\t\tcase 18: return BlockType::JunglePlanks;\n\t\tcase 3879: case 3880: return BlockType::JunglePressurePlate;\n\t\tcase 27: case 28: return BlockType::JungleSapling;\n\t\tcase 3510: case 3512: case 3514: case 3516: case 3518: case 3520: case 3522: case 3524: case 3526: case 3528: case 3530: case 3532: case 3534: case 3536: case 3538: case 3540: return BlockType::JungleSign;\n\t\tcase 8319: case 8321: case 8323: return BlockType::JungleSlab;\n\t\tcase 5565: case 5567: case 5569: case 5571: case 5573: case 5575: case 5577: case 5579: case 5581: case 5583: case 5585: case 5587: case 5589: case 5591: case 5593: case 5595: case 5597: case 5599: case 5601: case 5603: case 5605: case 5607: case 5609: case 5611: case 5613: case 5615: case 5617: case 5619: case 5621: case 5623: case 5625: case 5627: case 5629: case 5631: case 5633: case 5635: case 5637: case 5639: case 5641: case 5643: return BlockType::JungleStairs;\n\t\tcase 4304: case 4306: case 4308: case 4310: case 4312: case 4314: case 4316: case 4318: case 4320: case 4322: case 4324: case 4326: case 4328: case 4330: case 4332: case 4334: case 4336: case 4338: case 4340: case 4342: case 4344: case 4346: case 4348: case 4350: case 4352: case 4354: case 4356: case 4358: case 4360: case 4362: case 4364: case 4366: return BlockType::JungleTrapdoor;\n\t\tcase 3768: case 3770: case 3772: case 3774: return BlockType::JungleWallSign;\n\t\tcase 118: case 119: case 120: return BlockType::JungleWood;\n\t\tcase 9470: case 9471: case 9472: case 9473: case 9474: case 9475: case 9476: case 9477: case 9478: case 9479: case 9480: case 9481: case 9482: case 9483: case 9484: case 9485: case 9486: case 9487: case 9488: case 9489: case 9490: case 9491: case 9492: case 9493: case 9494: case 9495: return BlockType::Kelp;\n\t\tcase 9496: return BlockType::KelpPlant;\n\t\tcase 3638: case 3640: case 3642: case 3644: return BlockType::Ladder;\n\t\tcase 14886: case 14887: return BlockType::Lantern;\n\t\tcase 233: return BlockType::LapisBlock;\n\t\tcase 232: return BlockType::LapisOre;\n\t\tcase 7895: case 7896: return BlockType::LargeFern;\n\t\tcase 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: case 58: case 59: case 60: case 61: case 62: case 63: case 64: case 65: return BlockType::Lava;\n\t\tcase 14833: case 14834: case 14835: case 14836: case 14837: case 14838: case 14839: case 14840: case 14841: case 14842: case 14843: case 14844: case 14845: case 14846: case 14847: case 14848: return BlockType::Lectern;\n\t\tcase 3783: case 3784: case 3785: case 3786: case 3787: case 3788: case 3789: case 3790: case 3791: case 3792: case 3793: case 3794: case 3795: case 3796: case 3797: case 3798: case 3799: case 3800: case 3801: case 3802: case 3803: case 3804: case 3805: case 3806: return BlockType::Lever;\n\t\tcase 7945: case 7946: case 7947: case 7948: case 7949: case 7950: case 7951: case 7952: case 7953: case 7954: case 7955: case 7956: case 7957: case 7958: case 7959: case 7960: return BlockType::LightBlueBanner;\n\t\tcase 1097: case 1098: case 1099: case 1100: case 1101: case 1102: case 1103: case 1104: case 1105: case 1106: case 1107: case 1108: case 1109: case 1110: case 1111: case 1112: return BlockType::LightBlueBed;\n\t\tcase 7869: return BlockType::LightBlueCarpet;\n\t\tcase 9441: return BlockType::LightBlueConcrete;\n\t\tcase 9457: return BlockType::LightBlueConcretePowder;\n\t\tcase 9386: case 9387: case 9388: case 9389: return BlockType::LightBlueGlazedTerracotta;\n\t\tcase 9296: case 9297: case 9298: case 9299: case 9300: case 9301: return BlockType::LightBlueShulkerBox;\n\t\tcase 4098: return BlockType::LightBlueStainedGlass;\n\t\tcase 6961: case 6962: case 6965: case 6966: case 6969: case 6970: case 6973: case 6974: case 6977: case 6978: case 6981: case 6982: case 6985: case 6986: case 6989: case 6990: return BlockType::LightBlueStainedGlassPane;\n\t\tcase 6850: return BlockType::LightBlueTerracotta;\n\t\tcase 8165: case 8166: case 8167: case 8168: return BlockType::LightBlueWallBanner;\n\t\tcase 1387: return BlockType::LightBlueWool;\n\t\tcase 8025: case 8026: case 8027: case 8028: case 8029: case 8030: case 8031: case 8032: case 8033: case 8034: case 8035: case 8036: case 8037: case 8038: case 8039: case 8040: return BlockType::LightGrayBanner;\n\t\tcase 1177: case 1178: case 1179: case 1180: case 1181: case 1182: case 1183: case 1184: case 1185: case 1186: case 1187: case 1188: case 1189: case 1190: case 1191: case 1192: return BlockType::LightGrayBed;\n\t\tcase 7874: return BlockType::LightGrayCarpet;\n\t\tcase 9446: return BlockType::LightGrayConcrete;\n\t\tcase 9462: return BlockType::LightGrayConcretePowder;\n\t\tcase 9406: case 9407: case 9408: case 9409: return BlockType::LightGrayGlazedTerracotta;\n\t\tcase 9326: case 9327: case 9328: case 9329: case 9330: case 9331: return BlockType::LightGrayShulkerBox;\n\t\tcase 4103: return BlockType::LightGrayStainedGlass;\n\t\tcase 7121: case 7122: case 7125: case 7126: case 7129: case 7130: case 7133: case 7134: case 7137: case 7138: case 7141: case 7142: case 7145: case 7146: case 7149: case 7150: return BlockType::LightGrayStainedGlassPane;\n\t\tcase 6855: return BlockType::LightGrayTerracotta;\n\t\tcase 8185: case 8186: case 8187: case 8188: return BlockType::LightGrayWallBanner;\n\t\tcase 1392: return BlockType::LightGrayWool;\n\t\tcase 6646: case 6647: case 6648: case 6649: case 6650: case 6651: case 6652: case 6653: case 6654: case 6655: case 6656: case 6657: case 6658: case 6659: case 6660: case 6661: return BlockType::LightWeightedPressurePlate;\n\t\tcase 7887: case 7888: return BlockType::Lilac;\n\t\tcase 1424: return BlockType::LilyOfTheValley;\n\t\tcase 5014: return BlockType::LilyPad;\n\t\tcase 7977: case 7978: case 7979: case 7980: case 7981: case 7982: case 7983: case 7984: case 7985: case 7986: case 7987: case 7988: case 7989: case 7990: case 7991: case 7992: return BlockType::LimeBanner;\n\t\tcase 1129: case 1130: case 1131: case 1132: case 1133: case 1134: case 1135: case 1136: case 1137: case 1138: case 1139: case 1140: case 1141: case 1142: case 1143: case 1144: return BlockType::LimeBed;\n\t\tcase 7871: return BlockType::LimeCarpet;\n\t\tcase 9443: return BlockType::LimeConcrete;\n\t\tcase 9459: return BlockType::LimeConcretePowder;\n\t\tcase 9394: case 9395: case 9396: case 9397: return BlockType::LimeGlazedTerracotta;\n\t\tcase 9308: case 9309: case 9310: case 9311: case 9312: case 9313: return BlockType::LimeShulkerBox;\n\t\tcase 4100: return BlockType::LimeStainedGlass;\n\t\tcase 7025: case 7026: case 7029: case 7030: case 7033: case 7034: case 7037: case 7038: case 7041: case 7042: case 7045: case 7046: case 7049: case 7050: case 7053: case 7054: return BlockType::LimeStainedGlassPane;\n\t\tcase 6852: return BlockType::LimeTerracotta;\n\t\tcase 8173: case 8174: case 8175: case 8176: return BlockType::LimeWallBanner;\n\t\tcase 1389: return BlockType::LimeWool;\n\t\tcase 15838: return BlockType::Lodestone;\n\t\tcase 14787: case 14788: case 14789: case 14790: return BlockType::Loom;\n\t\tcase 7929: case 7930: case 7931: case 7932: case 7933: case 7934: case 7935: case 7936: case 7937: case 7938: case 7939: case 7940: case 7941: case 7942: case 7943: case 7944: return BlockType::MagentaBanner;\n\t\tcase 1081: case 1082: case 1083: case 1084: case 1085: case 1086: case 1087: case 1088: case 1089: case 1090: case 1091: case 1092: case 1093: case 1094: case 1095: case 1096: return BlockType::MagentaBed;\n\t\tcase 7868: return BlockType::MagentaCarpet;\n\t\tcase 9440: return BlockType::MagentaConcrete;\n\t\tcase 9456: return BlockType::MagentaConcretePowder;\n\t\tcase 9382: case 9383: case 9384: case 9385: return BlockType::MagentaGlazedTerracotta;\n\t\tcase 9290: case 9291: case 9292: case 9293: case 9294: case 9295: return BlockType::MagentaShulkerBox;\n\t\tcase 4097: return BlockType::MagentaStainedGlass;\n\t\tcase 6929: case 6930: case 6933: case 6934: case 6937: case 6938: case 6941: case 6942: case 6945: case 6946: case 6949: case 6950: case 6953: case 6954: case 6957: case 6958: return BlockType::MagentaStainedGlassPane;\n\t\tcase 6849: return BlockType::MagentaTerracotta;\n\t\tcase 8161: case 8162: case 8163: case 8164: return BlockType::MagentaWallBanner;\n\t\tcase 1386: return BlockType::MagentaWool;\n\t\tcase 9253: return BlockType::MagmaBlock;\n\t\tcase 4763: return BlockType::Melon;\n\t\tcase 4780: case 4781: case 4782: case 4783: case 4784: case 4785: case 4786: case 4787: return BlockType::MelonStem;\n\t\tcase 1433: return BlockType::MossyCobblestone;\n\t\tcase 10814: case 10816: case 10818: return BlockType::MossyCobblestoneSlab;\n\t\tcase 9990: case 9992: case 9994: case 9996: case 9998: case 10000: case 10002: case 10004: case 10006: case 10008: case 10010: case 10012: case 10014: case 10016: case 10018: case 10020: case 10022: case 10024: case 10026: case 10028: case 10030: case 10032: case 10034: case 10036: case 10038: case 10040: case 10042: case 10044: case 10046: case 10048: case 10050: case 10052: case 10054: case 10056: case 10058: case 10060: case 10062: case 10064: case 10066: case 10068: return BlockType::MossyCobblestoneStairs;\n\t\tcase 5984: case 5985: case 5986: case 5990: case 5991: case 5992: case 5996: case 5997: case 5998: case 6002: case 6003: case 6004: case 6008: case 6009: case 6010: case 6014: case 6015: case 6016: case 6020: case 6021: case 6022: case 6026: case 6027: case 6028: case 6032: case 6033: case 6034: case 6038: case 6039: case 6040: case 6044: case 6045: case 6046: case 6050: case 6051: case 6052: case 6056: case 6057: case 6058: case 6062: case 6063: case 6064: case 6068: case 6069: case 6070: case 6074: case 6075: case 6076: case 6080: case 6081: case 6082: case 6086: case 6087: case 6088: case 6092: case 6093: case 6094: case 6098: case 6099: case 6100: case 6104: case 6105: case 6106: case 6110: case 6111: case 6112: case 6116: case 6117: case 6118: case 6122: case 6123: case 6124: case 6128: case 6129: case 6130: case 6134: case 6135: case 6136: case 6140: case 6141: case 6142: case 6146: case 6147: case 6148: case 6152: case 6153: case 6154: case 6158: case 6159: case 6160: case 6164: case 6165: case 6166: case 6170: case 6171: case 6172: case 6176: case 6177: case 6178: case 6182: case 6183: case 6184: case 6188: case 6189: case 6190: case 6194: case 6195: case 6196: case 6200: case 6201: case 6202: case 6206: case 6207: case 6208: case 6212: case 6213: case 6214: case 6218: case 6219: case 6220: case 6224: case 6225: case 6226: case 6230: case 6231: case 6232: case 6236: case 6237: case 6238: case 6242: case 6243: case 6244: case 6248: case 6249: case 6250: case 6254: case 6255: case 6256: case 6260: case 6261: case 6262: case 6266: case 6267: case 6268: case 6272: case 6273: case 6274: case 6278: case 6279: case 6280: case 6284: case 6285: case 6286: case 6290: case 6291: case 6292: case 6296: case 6297: case 6298: case 6302: case 6303: case 6304: return BlockType::MossyCobblestoneWall;\n\t\tcase 10802: case 10804: case 10806: return BlockType::MossyStoneBrickSlab;\n\t\tcase 9830: case 9832: case 9834: case 9836: case 9838: case 9840: case 9842: case 9844: case 9846: case 9848: case 9850: case 9852: case 9854: case 9856: case 9858: case 9860: case 9862: case 9864: case 9866: case 9868: case 9870: case 9872: case 9874: case 9876: case 9878: case 9880: case 9882: case 9884: case 9886: case 9888: case 9890: case 9892: case 9894: case 9896: case 9898: case 9900: case 9902: case 9904: case 9906: case 9908: return BlockType::MossyStoneBrickStairs;\n\t\tcase 11842: case 11843: case 11844: case 11848: case 11849: case 11850: case 11854: case 11855: case 11856: case 11860: case 11861: case 11862: case 11866: case 11867: case 11868: case 11872: case 11873: case 11874: case 11878: case 11879: case 11880: case 11884: case 11885: case 11886: case 11890: case 11891: case 11892: case 11896: case 11897: case 11898: case 11902: case 11903: case 11904: case 11908: case 11909: case 11910: case 11914: case 11915: case 11916: case 11920: case 11921: case 11922: case 11926: case 11927: case 11928: case 11932: case 11933: case 11934: case 11938: case 11939: case 11940: case 11944: case 11945: case 11946: case 11950: case 11951: case 11952: case 11956: case 11957: case 11958: case 11962: case 11963: case 11964: case 11968: case 11969: case 11970: case 11974: case 11975: case 11976: case 11980: case 11981: case 11982: case 11986: case 11987: case 11988: case 11992: case 11993: case 11994: case 11998: case 11999: case 12000: case 12004: case 12005: case 12006: case 12010: case 12011: case 12012: case 12016: case 12017: case 12018: case 12022: case 12023: case 12024: case 12028: case 12029: case 12030: case 12034: case 12035: case 12036: case 12040: case 12041: case 12042: case 12046: case 12047: case 12048: case 12052: case 12053: case 12054: case 12058: case 12059: case 12060: case 12064: case 12065: case 12066: case 12070: case 12071: case 12072: case 12076: case 12077: case 12078: case 12082: case 12083: case 12084: case 12088: case 12089: case 12090: case 12094: case 12095: case 12096: case 12100: case 12101: case 12102: case 12106: case 12107: case 12108: case 12112: case 12113: case 12114: case 12118: case 12119: case 12120: case 12124: case 12125: case 12126: case 12130: case 12131: case 12132: case 12136: case 12137: case 12138: case 12142: case 12143: case 12144: case 12148: case 12149: case 12150: case 12154: case 12155: case 12156: case 12160: case 12161: case 12162: return BlockType::MossyStoneBrickWall;\n\t\tcase 4496: return BlockType::MossyStoneBricks;\n\t\tcase 1400: case 1401: case 1402: case 1403: case 1404: case 1405: case 1406: case 1407: case 1408: case 1409: case 1410: case 1411: return BlockType::MovingPiston;\n\t\tcase 4633: case 4634: case 4635: case 4636: case 4637: case 4638: case 4639: case 4640: case 4641: case 4642: case 4643: case 4644: case 4645: case 4646: case 4647: case 4648: case 4649: case 4650: case 4651: case 4652: case 4653: case 4654: case 4655: case 4656: case 4657: case 4658: case 4659: case 4660: case 4661: case 4662: case 4663: case 4664: case 4665: case 4666: case 4667: case 4668: case 4669: case 4670: case 4671: case 4672: case 4673: case 4674: case 4675: case 4676: case 4677: case 4678: case 4679: case 4680: case 4681: case 4682: case 4683: case 4684: case 4685: case 4686: case 4687: case 4688: case 4689: case 4690: case 4691: case 4692: case 4693: case 4694: case 4695: case 4696: return BlockType::MushroomStem;\n\t\tcase 5012: case 5013: return BlockType::Mycelium;\n\t\tcase 5018: case 5019: case 5022: case 5023: case 5026: case 5027: case 5030: case 5031: case 5034: case 5035: case 5038: case 5039: case 5042: case 5043: case 5046: case 5047: return BlockType::NetherBrickFence;\n\t\tcase 8385: case 8387: case 8389: return BlockType::NetherBrickSlab;\n\t\tcase 5049: case 5051: case 5053: case 5055: case 5057: case 5059: case 5061: case 5063: case 5065: case 5067: case 5069: case 5071: case 5073: case 5075: case 5077: case 5079: case 5081: case 5083: case 5085: case 5087: case 5089: case 5091: case 5093: case 5095: case 5097: case 5099: case 5101: case 5103: case 5105: case 5107: case 5109: case 5111: case 5113: case 5115: case 5117: case 5119: case 5121: case 5123: case 5125: case 5127: return BlockType::NetherBrickStairs;\n\t\tcase 12814: case 12815: case 12816: case 12820: case 12821: case 12822: case 12826: case 12827: case 12828: case 12832: case 12833: case 12834: case 12838: case 12839: case 12840: case 12844: case 12845: case 12846: case 12850: case 12851: case 12852: case 12856: case 12857: case 12858: case 12862: case 12863: case 12864: case 12868: case 12869: case 12870: case 12874: case 12875: case 12876: case 12880: case 12881: case 12882: case 12886: case 12887: case 12888: case 12892: case 12893: case 12894: case 12898: case 12899: case 12900: case 12904: case 12905: case 12906: case 12910: case 12911: case 12912: case 12916: case 12917: case 12918: case 12922: case 12923: case 12924: case 12928: case 12929: case 12930: case 12934: case 12935: case 12936: case 12940: case 12941: case 12942: case 12946: case 12947: case 12948: case 12952: case 12953: case 12954: case 12958: case 12959: case 12960: case 12964: case 12965: case 12966: case 12970: case 12971: case 12972: case 12976: case 12977: case 12978: case 12982: case 12983: case 12984: case 12988: case 12989: case 12990: case 12994: case 12995: case 12996: case 13000: case 13001: case 13002: case 13006: case 13007: case 13008: case 13012: case 13013: case 13014: case 13018: case 13019: case 13020: case 13024: case 13025: case 13026: case 13030: case 13031: case 13032: case 13036: case 13037: case 13038: case 13042: case 13043: case 13044: case 13048: case 13049: case 13050: case 13054: case 13055: case 13056: case 13060: case 13061: case 13062: case 13066: case 13067: case 13068: case 13072: case 13073: case 13074: case 13078: case 13079: case 13080: case 13084: case 13085: case 13086: case 13090: case 13091: case 13092: case 13096: case 13097: case 13098: case 13102: case 13103: case 13104: case 13108: case 13109: case 13110: case 13114: case 13115: case 13116: case 13120: case 13121: case 13122: case 13126: case 13127: case 13128: case 13132: case 13133: case 13134: return BlockType::NetherBrickWall;\n\t\tcase 5015: return BlockType::NetherBricks;\n\t\tcase 72: return BlockType::NetherGoldOre;\n\t\tcase 4014: case 4015: return BlockType::NetherPortal;\n\t\tcase 6727: return BlockType::NetherQuartzOre;\n\t\tcase 14974: return BlockType::NetherSprouts;\n\t\tcase 5128: case 5129: case 5130: case 5131: return BlockType::NetherWart;\n\t\tcase 9254: return BlockType::NetherWartBlock;\n\t\tcase 15826: return BlockType::NetheriteBlock;\n\t\tcase 3999: return BlockType::Netherrack;\n\t\tcase 249: case 250: case 251: case 252: case 253: case 254: case 255: case 256: case 257: case 258: case 259: case 260: case 261: case 262: case 263: case 264: case 265: case 266: case 267: case 268: case 269: case 270: case 271: case 272: case 273: case 274: case 275: case 276: case 277: case 278: case 279: case 280: case 281: case 282: case 283: case 284: case 285: case 286: case 287: case 288: case 289: case 290: case 291: case 292: case 293: case 294: case 295: case 296: case 297: case 298: case 299: case 300: case 301: case 302: case 303: case 304: case 305: case 306: case 307: case 308: case 309: case 310: case 311: case 312: case 313: case 314: case 315: case 316: case 317: case 318: case 319: case 320: case 321: case 322: case 323: case 324: case 325: case 326: case 327: case 328: case 329: case 330: case 331: case 332: case 333: case 334: case 335: case 336: case 337: case 338: case 339: case 340: case 341: case 342: case 343: case 344: case 345: case 346: case 347: case 348: case 349: case 350: case 351: case 352: case 353: case 354: case 355: case 356: case 357: case 358: case 359: case 360: case 361: case 362: case 363: case 364: case 365: case 366: case 367: case 368: case 369: case 370: case 371: case 372: case 373: case 374: case 375: case 376: case 377: case 378: case 379: case 380: case 381: case 382: case 383: case 384: case 385: case 386: case 387: case 388: case 389: case 390: case 391: case 392: case 393: case 394: case 395: case 396: case 397: case 398: case 399: case 400: case 401: case 402: case 403: case 404: case 405: case 406: case 407: case 408: case 409: case 410: case 411: case 412: case 413: case 414: case 415: case 416: case 417: case 418: case 419: case 420: case 421: case 422: case 423: case 424: case 425: case 426: case 427: case 428: case 429: case 430: case 431: case 432: case 433: case 434: case 435: case 436: case 437: case 438: case 439: case 440: case 441: case 442: case 443: case 444: case 445: case 446: case 447: case 448: case 449: case 450: case 451: case 452: case 453: case 454: case 455: case 456: case 457: case 458: case 459: case 460: case 461: case 462: case 463: case 464: case 465: case 466: case 467: case 468: case 469: case 470: case 471: case 472: case 473: case 474: case 475: case 476: case 477: case 478: case 479: case 480: case 481: case 482: case 483: case 484: case 485: case 486: case 487: case 488: case 489: case 490: case 491: case 492: case 493: case 494: case 495: case 496: case 497: case 498: case 499: case 500: case 501: case 502: case 503: case 504: case 505: case 506: case 507: case 508: case 509: case 510: case 511: case 512: case 513: case 514: case 515: case 516: case 517: case 518: case 519: case 520: case 521: case 522: case 523: case 524: case 525: case 526: case 527: case 528: case 529: case 530: case 531: case 532: case 533: case 534: case 535: case 536: case 537: case 538: case 539: case 540: case 541: case 542: case 543: case 544: case 545: case 546: case 547: case 548: case 549: case 550: case 551: case 552: case 553: case 554: case 555: case 556: case 557: case 558: case 559: case 560: case 561: case 562: case 563: case 564: case 565: case 566: case 567: case 568: case 569: case 570: case 571: case 572: case 573: case 574: case 575: case 576: case 577: case 578: case 579: case 580: case 581: case 582: case 583: case 584: case 585: case 586: case 587: case 588: case 589: case 590: case 591: case 592: case 593: case 594: case 595: case 596: case 597: case 598: case 599: case 600: case 601: case 602: case 603: case 604: case 605: case 606: case 607: case 608: case 609: case 610: case 611: case 612: case 613: case 614: case 615: case 616: case 617: case 618: case 619: case 620: case 621: case 622: case 623: case 624: case 625: case 626: case 627: case 628: case 629: case 630: case 631: case 632: case 633: case 634: case 635: case 636: case 637: case 638: case 639: case 640: case 641: case 642: case 643: case 644: case 645: case 646: case 647: case 648: case 649: case 650: case 651: case 652: case 653: case 654: case 655: case 656: case 657: case 658: case 659: case 660: case 661: case 662: case 663: case 664: case 665: case 666: case 667: case 668: case 669: case 670: case 671: case 672: case 673: case 674: case 675: case 676: case 677: case 678: case 679: case 680: case 681: case 682: case 683: case 684: case 685: case 686: case 687: case 688: case 689: case 690: case 691: case 692: case 693: case 694: case 695: case 696: case 697: case 698: case 699: case 700: case 701: case 702: case 703: case 704: case 705: case 706: case 707: case 708: case 709: case 710: case 711: case 712: case 713: case 714: case 715: case 716: case 717: case 718: case 719: case 720: case 721: case 722: case 723: case 724: case 725: case 726: case 727: case 728: case 729: case 730: case 731: case 732: case 733: case 734: case 735: case 736: case 737: case 738: case 739: case 740: case 741: case 742: case 743: case 744: case 745: case 746: case 747: case 748: case 749: case 750: case 751: case 752: case 753: case 754: case 755: case 756: case 757: case 758: case 759: case 760: case 761: case 762: case 763: case 764: case 765: case 766: case 767: case 768: case 769: case 770: case 771: case 772: case 773: case 774: case 775: case 776: case 777: case 778: case 779: case 780: case 781: case 782: case 783: case 784: case 785: case 786: case 787: case 788: case 789: case 790: case 791: case 792: case 793: case 794: case 795: case 796: case 797: case 798: case 799: case 800: case 801: case 802: case 803: case 804: case 805: case 806: case 807: case 808: case 809: case 810: case 811: case 812: case 813: case 814: case 815: case 816: case 817: case 818: case 819: case 820: case 821: case 822: case 823: case 824: case 825: case 826: case 827: case 828: case 829: case 830: case 831: case 832: case 833: case 834: case 835: case 836: case 837: case 838: case 839: case 840: case 841: case 842: case 843: case 844: case 845: case 846: case 847: case 848: case 849: case 850: case 851: case 852: case 853: case 854: case 855: case 856: case 857: case 858: case 859: case 860: case 861: case 862: case 863: case 864: case 865: case 866: case 867: case 868: case 869: case 870: case 871: case 872: case 873: case 874: case 875: case 876: case 877: case 878: case 879: case 880: case 881: case 882: case 883: case 884: case 885: case 886: case 887: case 888: case 889: case 890: case 891: case 892: case 893: case 894: case 895: case 896: case 897: case 898: case 899: case 900: case 901: case 902: case 903: case 904: case 905: case 906: case 907: case 908: case 909: case 910: case 911: case 912: case 913: case 914: case 915: case 916: case 917: case 918: case 919: case 920: case 921: case 922: case 923: case 924: case 925: case 926: case 927: case 928: case 929: case 930: case 931: case 932: case 933: case 934: case 935: case 936: case 937: case 938: case 939: case 940: case 941: case 942: case 943: case 944: case 945: case 946: case 947: case 948: case 949: case 950: case 951: case 952: case 953: case 954: case 955: case 956: case 957: case 958: case 959: case 960: case 961: case 962: case 963: case 964: case 965: case 966: case 967: case 968: case 969: case 970: case 971: case 972: case 973: case 974: case 975: case 976: case 977: case 978: case 979: case 980: case 981: case 982: case 983: case 984: case 985: case 986: case 987: case 988: case 989: case 990: case 991: case 992: case 993: case 994: case 995: case 996: case 997: case 998: case 999: case 1000: case 1001: case 1002: case 1003: case 1004: case 1005: case 1006: case 1007: case 1008: case 1009: case 1010: case 1011: case 1012: case 1013: case 1014: case 1015: case 1016: case 1017: case 1018: case 1019: case 1020: case 1021: case 1022: case 1023: case 1024: case 1025: case 1026: case 1027: case 1028: case 1029: case 1030: case 1031: case 1032: case 1033: case 1034: case 1035: case 1036: case 1037: case 1038: case 1039: case 1040: case 1041: case 1042: case 1043: case 1044: case 1045: case 1046: case 1047: case 1048: return BlockType::NoteBlock;\n\t\tcase 6346: case 6347: case 6348: case 6349: case 6350: case 6351: case 6352: case 6353: case 6354: case 6355: case 6356: case 6357: case 6358: case 6359: case 6360: case 6361: case 6362: case 6363: case 6364: case 6365: case 6366: case 6367: case 6368: case 6369: return BlockType::OakButton;\n\t\tcase 3573: case 3574: case 3575: case 3576: case 3577: case 3578: case 3579: case 3580: case 3581: case 3582: case 3583: case 3584: case 3585: case 3586: case 3587: case 3588: case 3589: case 3590: case 3591: case 3592: case 3593: case 3594: case 3595: case 3596: case 3597: case 3598: case 3599: case 3600: case 3601: case 3602: case 3603: case 3604: case 3605: case 3606: case 3607: case 3608: case 3609: case 3610: case 3611: case 3612: case 3613: case 3614: case 3615: case 3616: case 3617: case 3618: case 3619: case 3620: case 3621: case 3622: case 3623: case 3624: case 3625: case 3626: case 3627: case 3628: case 3629: case 3630: case 3631: case 3632: case 3633: case 3634: case 3635: case 3636: return BlockType::OakDoor;\n\t\tcase 3968: case 3969: case 3972: case 3973: case 3976: case 3977: case 3980: case 3981: case 3984: case 3985: case 3988: case 3989: case 3992: case 3993: case 3996: case 3997: return BlockType::OakFence;\n\t\tcase 4820: case 4821: case 4822: case 4823: case 4824: case 4825: case 4826: case 4827: case 4828: case 4829: case 4830: case 4831: case 4832: case 4833: case 4834: case 4835: case 4836: case 4837: case 4838: case 4839: case 4840: case 4841: case 4842: case 4843: case 4844: case 4845: case 4846: case 4847: case 4848: case 4849: case 4850: case 4851: return BlockType::OakFenceGate;\n\t\tcase 145: case 146: case 147: case 148: case 149: case 150: case 151: case 152: case 153: case 154: case 155: case 156: case 157: case 158: return BlockType::OakLeaves;\n\t\tcase 73: case 74: case 75: return BlockType::OakLog;\n\t\tcase 15: return BlockType::OakPlanks;\n\t\tcase 3873: case 3874: return BlockType::OakPressurePlate;\n\t\tcase 21: case 22: return BlockType::OakSapling;\n\t\tcase 3382: case 3384: case 3386: case 3388: case 3390: case 3392: case 3394: case 3396: case 3398: case 3400: case 3402: case 3404: case 3406: case 3408: case 3410: case 3412: return BlockType::OakSign;\n\t\tcase 8301: case 8303: case 8305: return BlockType::OakSlab;\n\t\tcase 1955: case 1957: case 1959: case 1961: case 1963: case 1965: case 1967: case 1969: case 1971: case 1973: case 1975: case 1977: case 1979: case 1981: case 1983: case 1985: case 1987: case 1989: case 1991: case 1993: case 1995: case 1997: case 1999: case 2001: case 2003: case 2005: case 2007: case 2009: case 2011: case 2013: case 2015: case 2017: case 2019: case 2021: case 2023: case 2025: case 2027: case 2029: case 2031: case 2033: return BlockType::OakStairs;\n\t\tcase 4112: case 4114: case 4116: case 4118: case 4120: case 4122: case 4124: case 4126: case 4128: case 4130: case 4132: case 4134: case 4136: case 4138: case 4140: case 4142: case 4144: case 4146: case 4148: case 4150: case 4152: case 4154: case 4156: case 4158: case 4160: case 4162: case 4164: case 4166: case 4168: case 4170: case 4172: case 4174: return BlockType::OakTrapdoor;\n\t\tcase 3736: case 3738: case 3740: case 3742: return BlockType::OakWallSign;\n\t\tcase 109: case 110: case 111: return BlockType::OakWood;\n\t\tcase 9260: case 9261: case 9262: case 9263: case 9264: case 9265: case 9266: case 9267: case 9268: case 9269: case 9270: case 9271: return BlockType::Observer;\n\t\tcase 1434: return BlockType::Obsidian;\n\t\tcase 7913: case 7914: case 7915: case 7916: case 7917: case 7918: case 7919: case 7920: case 7921: case 7922: case 7923: case 7924: case 7925: case 7926: case 7927: case 7928: return BlockType::OrangeBanner;\n\t\tcase 1065: case 1066: case 1067: case 1068: case 1069: case 1070: case 1071: case 1072: case 1073: case 1074: case 1075: case 1076: case 1077: case 1078: case 1079: case 1080: return BlockType::OrangeBed;\n\t\tcase 7867: return BlockType::OrangeCarpet;\n\t\tcase 9439: return BlockType::OrangeConcrete;\n\t\tcase 9455: return BlockType::OrangeConcretePowder;\n\t\tcase 9378: case 9379: case 9380: case 9381: return BlockType::OrangeGlazedTerracotta;\n\t\tcase 9284: case 9285: case 9286: case 9287: case 9288: case 9289: return BlockType::OrangeShulkerBox;\n\t\tcase 4096: return BlockType::OrangeStainedGlass;\n\t\tcase 6897: case 6898: case 6901: case 6902: case 6905: case 6906: case 6909: case 6910: case 6913: case 6914: case 6917: case 6918: case 6921: case 6922: case 6925: case 6926: return BlockType::OrangeStainedGlassPane;\n\t\tcase 6848: return BlockType::OrangeTerracotta;\n\t\tcase 1418: return BlockType::OrangeTulip;\n\t\tcase 8157: case 8158: case 8159: case 8160: return BlockType::OrangeWallBanner;\n\t\tcase 1385: return BlockType::OrangeWool;\n\t\tcase 1421: return BlockType::OxeyeDaisy;\n\t\tcase 7884: return BlockType::PackedIce;\n\t\tcase 7891: case 7892: return BlockType::Peony;\n\t\tcase 8361: case 8363: case 8365: return BlockType::PetrifiedOakSlab;\n\t\tcase 7993: case 7994: case 7995: case 7996: case 7997: case 7998: case 7999: case 8000: case 8001: case 8002: case 8003: case 8004: case 8005: case 8006: case 8007: case 8008: return BlockType::PinkBanner;\n\t\tcase 1145: case 1146: case 1147: case 1148: case 1149: case 1150: case 1151: case 1152: case 1153: case 1154: case 1155: case 1156: case 1157: case 1158: case 1159: case 1160: return BlockType::PinkBed;\n\t\tcase 7872: return BlockType::PinkCarpet;\n\t\tcase 9444: return BlockType::PinkConcrete;\n\t\tcase 9460: return BlockType::PinkConcretePowder;\n\t\tcase 9398: case 9399: case 9400: case 9401: return BlockType::PinkGlazedTerracotta;\n\t\tcase 9314: case 9315: case 9316: case 9317: case 9318: case 9319: return BlockType::PinkShulkerBox;\n\t\tcase 4101: return BlockType::PinkStainedGlass;\n\t\tcase 7057: case 7058: case 7061: case 7062: case 7065: case 7066: case 7069: case 7070: case 7073: case 7074: case 7077: case 7078: case 7081: case 7082: case 7085: case 7086: return BlockType::PinkStainedGlassPane;\n\t\tcase 6853: return BlockType::PinkTerracotta;\n\t\tcase 1420: return BlockType::PinkTulip;\n\t\tcase 8177: case 8178: case 8179: case 8180: return BlockType::PinkWallBanner;\n\t\tcase 1390: return BlockType::PinkWool;\n\t\tcase 1348: case 1349: case 1350: case 1351: case 1352: case 1353: case 1354: case 1355: case 1356: case 1357: case 1358: case 1359: return BlockType::Piston;\n\t\tcase 1360: case 1361: case 1362: case 1363: case 1364: case 1365: case 1366: case 1367: case 1368: case 1369: case 1370: case 1371: case 1372: case 1373: case 1374: case 1375: case 1376: case 1377: case 1378: case 1379: case 1380: case 1381: case 1382: case 1383: return BlockType::PistonHead;\n\t\tcase 6550: case 6551: case 6552: case 6553: case 6554: case 6555: case 6556: case 6557: case 6558: case 6559: case 6560: case 6561: case 6562: case 6563: case 6564: case 6565: return BlockType::PlayerHead;\n\t\tcase 6566: case 6567: case 6568: case 6569: return BlockType::PlayerWallHead;\n\t\tcase 12: case 13: return BlockType::Podzol;\n\t\tcase 7: return BlockType::PolishedAndesite;\n\t\tcase 10856: case 10858: case 10860: return BlockType::PolishedAndesiteSlab;\n\t\tcase 10630: case 10632: case 10634: case 10636: case 10638: case 10640: case 10642: case 10644: case 10646: case 10648: case 10650: case 10652: case 10654: case 10656: case 10658: case 10660: case 10662: case 10664: case 10666: case 10668: case 10670: case 10672: case 10674: case 10676: case 10678: case 10680: case 10682: case 10684: case 10686: case 10688: case 10690: case 10692: case 10694: case 10696: case 10698: case 10700: case 10702: case 10704: case 10706: case 10708: return BlockType::PolishedAndesiteStairs;\n\t\tcase 4005: case 4006: case 4007: return BlockType::PolishedBasalt;\n\t\tcase 16250: return BlockType::PolishedBlackstone;\n\t\tcase 16255: case 16257: case 16259: return BlockType::PolishedBlackstoneBrickSlab;\n\t\tcase 16261: case 16263: case 16265: case 16267: case 16269: case 16271: case 16273: case 16275: case 16277: case 16279: case 16281: case 16283: case 16285: case 16287: case 16289: case 16291: case 16293: case 16295: case 16297: case 16299: case 16301: case 16303: case 16305: case 16307: case 16309: case 16311: case 16313: case 16315: case 16317: case 16319: case 16321: case 16323: case 16325: case 16327: case 16329: case 16331: case 16333: case 16335: case 16337: case 16339: return BlockType::PolishedBlackstoneBrickStairs;\n\t\tcase 16343: case 16344: case 16345: case 16349: case 16350: case 16351: case 16355: case 16356: case 16357: case 16361: case 16362: case 16363: case 16367: case 16368: case 16369: case 16373: case 16374: case 16375: case 16379: case 16380: case 16381: case 16385: case 16386: case 16387: case 16391: case 16392: case 16393: case 16397: case 16398: case 16399: case 16403: case 16404: case 16405: case 16409: case 16410: case 16411: case 16415: case 16416: case 16417: case 16421: case 16422: case 16423: case 16427: case 16428: case 16429: case 16433: case 16434: case 16435: case 16439: case 16440: case 16441: case 16445: case 16446: case 16447: case 16451: case 16452: case 16453: case 16457: case 16458: case 16459: case 16463: case 16464: case 16465: case 16469: case 16470: case 16471: case 16475: case 16476: case 16477: case 16481: case 16482: case 16483: case 16487: case 16488: case 16489: case 16493: case 16494: case 16495: case 16499: case 16500: case 16501: case 16505: case 16506: case 16507: case 16511: case 16512: case 16513: case 16517: case 16518: case 16519: case 16523: case 16524: case 16525: case 16529: case 16530: case 16531: case 16535: case 16536: case 16537: case 16541: case 16542: case 16543: case 16547: case 16548: case 16549: case 16553: case 16554: case 16555: case 16559: case 16560: case 16561: case 16565: case 16566: case 16567: case 16571: case 16572: case 16573: case 16577: case 16578: case 16579: case 16583: case 16584: case 16585: case 16589: case 16590: case 16591: case 16595: case 16596: case 16597: case 16601: case 16602: case 16603: case 16607: case 16608: case 16609: case 16613: case 16614: case 16615: case 16619: case 16620: case 16621: case 16625: case 16626: case 16627: case 16631: case 16632: case 16633: case 16637: case 16638: case 16639: case 16643: case 16644: case 16645: case 16649: case 16650: case 16651: case 16655: case 16656: case 16657: case 16661: case 16662: case 16663: return BlockType::PolishedBlackstoneBrickWall;\n\t\tcase 16251: return BlockType::PolishedBlackstoneBricks;\n\t\tcase 16753: case 16754: case 16755: case 16756: case 16757: case 16758: case 16759: case 16760: case 16761: case 16762: case 16763: case 16764: case 16765: case 16766: case 16767: case 16768: case 16769: case 16770: case 16771: case 16772: case 16773: case 16774: case 16775: case 16776: return BlockType::PolishedBlackstoneButton;\n\t\tcase 16751: case 16752: return BlockType::PolishedBlackstonePressurePlate;\n\t\tcase 16746: case 16748: case 16750: return BlockType::PolishedBlackstoneSlab;\n\t\tcase 16666: case 16668: case 16670: case 16672: case 16674: case 16676: case 16678: case 16680: case 16682: case 16684: case 16686: case 16688: case 16690: case 16692: case 16694: case 16696: case 16698: case 16700: case 16702: case 16704: case 16706: case 16708: case 16710: case 16712: case 16714: case 16716: case 16718: case 16720: case 16722: case 16724: case 16726: case 16728: case 16730: case 16732: case 16734: case 16736: case 16738: case 16740: case 16742: case 16744: return BlockType::PolishedBlackstoneStairs;\n\t\tcase 16780: case 16781: case 16782: case 16786: case 16787: case 16788: case 16792: case 16793: case 16794: case 16798: case 16799: case 16800: case 16804: case 16805: case 16806: case 16810: case 16811: case 16812: case 16816: case 16817: case 16818: case 16822: case 16823: case 16824: case 16828: case 16829: case 16830: case 16834: case 16835: case 16836: case 16840: case 16841: case 16842: case 16846: case 16847: case 16848: case 16852: case 16853: case 16854: case 16858: case 16859: case 16860: case 16864: case 16865: case 16866: case 16870: case 16871: case 16872: case 16876: case 16877: case 16878: case 16882: case 16883: case 16884: case 16888: case 16889: case 16890: case 16894: case 16895: case 16896: case 16900: case 16901: case 16902: case 16906: case 16907: case 16908: case 16912: case 16913: case 16914: case 16918: case 16919: case 16920: case 16924: case 16925: case 16926: case 16930: case 16931: case 16932: case 16936: case 16937: case 16938: case 16942: case 16943: case 16944: case 16948: case 16949: case 16950: case 16954: case 16955: case 16956: case 16960: case 16961: case 16962: case 16966: case 16967: case 16968: case 16972: case 16973: case 16974: case 16978: case 16979: case 16980: case 16984: case 16985: case 16986: case 16990: case 16991: case 16992: case 16996: case 16997: case 16998: case 17002: case 17003: case 17004: case 17008: case 17009: case 17010: case 17014: case 17015: case 17016: case 17020: case 17021: case 17022: case 17026: case 17027: case 17028: case 17032: case 17033: case 17034: case 17038: case 17039: case 17040: case 17044: case 17045: case 17046: case 17050: case 17051: case 17052: case 17056: case 17057: case 17058: case 17062: case 17063: case 17064: case 17068: case 17069: case 17070: case 17074: case 17075: case 17076: case 17080: case 17081: case 17082: case 17086: case 17087: case 17088: case 17092: case 17093: case 17094: case 17098: case 17099: case 17100: return BlockType::PolishedBlackstoneWall;\n\t\tcase 5: return BlockType::PolishedDiorite;\n\t\tcase 10808: case 10810: case 10812: return BlockType::PolishedDioriteSlab;\n\t\tcase 9910: case 9912: case 9914: case 9916: case 9918: case 9920: case 9922: case 9924: case 9926: case 9928: case 9930: case 9932: case 9934: case 9936: case 9938: case 9940: case 9942: case 9944: case 9946: case 9948: case 9950: case 9952: case 9954: case 9956: case 9958: case 9960: case 9962: case 9964: case 9966: case 9968: case 9970: case 9972: case 9974: case 9976: case 9978: case 9980: case 9982: case 9984: case 9986: case 9988: return BlockType::PolishedDioriteStairs;\n\t\tcase 3: return BlockType::PolishedGranite;\n\t\tcase 10790: case 10792: case 10794: return BlockType::PolishedGraniteSlab;\n\t\tcase 9670: case 9672: case 9674: case 9676: case 9678: case 9680: case 9682: case 9684: case 9686: case 9688: case 9690: case 9692: case 9694: case 9696: case 9698: case 9700: case 9702: case 9704: case 9706: case 9708: case 9710: case 9712: case 9714: case 9716: case 9718: case 9720: case 9722: case 9724: case 9726: case 9728: case 9730: case 9732: case 9734: case 9736: case 9738: case 9740: case 9742: case 9744: case 9746: case 9748: return BlockType::PolishedGraniteStairs;\n\t\tcase 1413: return BlockType::Poppy;\n\t\tcase 6338: case 6339: case 6340: case 6341: case 6342: case 6343: case 6344: case 6345: return BlockType::Potatoes;\n\t\tcase 6310: return BlockType::PottedAcaciaSapling;\n\t\tcase 6316: return BlockType::PottedAllium;\n\t\tcase 6317: return BlockType::PottedAzureBluet;\n\t\tcase 9664: return BlockType::PottedBamboo;\n\t\tcase 6308: return BlockType::PottedBirchSapling;\n\t\tcase 6315: return BlockType::PottedBlueOrchid;\n\t\tcase 6327: return BlockType::PottedBrownMushroom;\n\t\tcase 6329: return BlockType::PottedCactus;\n\t\tcase 6323: return BlockType::PottedCornflower;\n\t\tcase 15834: return BlockType::PottedCrimsonFungus;\n\t\tcase 15836: return BlockType::PottedCrimsonRoots;\n\t\tcase 6313: return BlockType::PottedDandelion;\n\t\tcase 6311: return BlockType::PottedDarkOakSapling;\n\t\tcase 6328: return BlockType::PottedDeadBush;\n\t\tcase 6312: return BlockType::PottedFern;\n\t\tcase 6309: return BlockType::PottedJungleSapling;\n\t\tcase 6324: return BlockType::PottedLilyOfTheValley;\n\t\tcase 6306: return BlockType::PottedOakSapling;\n\t\tcase 6319: return BlockType::PottedOrangeTulip;\n\t\tcase 6322: return BlockType::PottedOxeyeDaisy;\n\t\tcase 6321: return BlockType::PottedPinkTulip;\n\t\tcase 6314: return BlockType::PottedPoppy;\n\t\tcase 6326: return BlockType::PottedRedMushroom;\n\t\tcase 6318: return BlockType::PottedRedTulip;\n\t\tcase 6307: return BlockType::PottedSpruceSapling;\n\t\tcase 15835: return BlockType::PottedWarpedFungus;\n\t\tcase 15837: return BlockType::PottedWarpedRoots;\n\t\tcase 6320: return BlockType::PottedWhiteTulip;\n\t\tcase 6325: return BlockType::PottedWitherRose;\n\t\tcase 1305: case 1306: case 1307: case 1308: case 1309: case 1310: case 1311: case 1312: case 1313: case 1314: case 1315: case 1316: return BlockType::PoweredRail;\n\t\tcase 7601: return BlockType::Prismarine;\n\t\tcase 7851: case 7853: case 7855: return BlockType::PrismarineBrickSlab;\n\t\tcase 7685: case 7687: case 7689: case 7691: case 7693: case 7695: case 7697: case 7699: case 7701: case 7703: case 7705: case 7707: case 7709: case 7711: case 7713: case 7715: case 7717: case 7719: case 7721: case 7723: case 7725: case 7727: case 7729: case 7731: case 7733: case 7735: case 7737: case 7739: case 7741: case 7743: case 7745: case 7747: case 7749: case 7751: case 7753: case 7755: case 7757: case 7759: case 7761: case 7763: return BlockType::PrismarineBrickStairs;\n\t\tcase 7602: return BlockType::PrismarineBricks;\n\t\tcase 7845: case 7847: case 7849: return BlockType::PrismarineSlab;\n\t\tcase 7605: case 7607: case 7609: case 7611: case 7613: case 7615: case 7617: case 7619: case 7621: case 7623: case 7625: case 7627: case 7629: case 7631: case 7633: case 7635: case 7637: case 7639: case 7641: case 7643: case 7645: case 7647: case 7649: case 7651: case 7653: case 7655: case 7657: case 7659: case 7661: case 7663: case 7665: case 7667: case 7669: case 7671: case 7673: case 7675: case 7677: case 7679: case 7681: case 7683: return BlockType::PrismarineStairs;\n\t\tcase 11194: case 11195: case 11196: case 11200: case 11201: case 11202: case 11206: case 11207: case 11208: case 11212: case 11213: case 11214: case 11218: case 11219: case 11220: case 11224: case 11225: case 11226: case 11230: case 11231: case 11232: case 11236: case 11237: case 11238: case 11242: case 11243: case 11244: case 11248: case 11249: case 11250: case 11254: case 11255: case 11256: case 11260: case 11261: case 11262: case 11266: case 11267: case 11268: case 11272: case 11273: case 11274: case 11278: case 11279: case 11280: case 11284: case 11285: case 11286: case 11290: case 11291: case 11292: case 11296: case 11297: case 11298: case 11302: case 11303: case 11304: case 11308: case 11309: case 11310: case 11314: case 11315: case 11316: case 11320: case 11321: case 11322: case 11326: case 11327: case 11328: case 11332: case 11333: case 11334: case 11338: case 11339: case 11340: case 11344: case 11345: case 11346: case 11350: case 11351: case 11352: case 11356: case 11357: case 11358: case 11362: case 11363: case 11364: case 11368: case 11369: case 11370: case 11374: case 11375: case 11376: case 11380: case 11381: case 11382: case 11386: case 11387: case 11388: case 11392: case 11393: case 11394: case 11398: case 11399: case 11400: case 11404: case 11405: case 11406: case 11410: case 11411: case 11412: case 11416: case 11417: case 11418: case 11422: case 11423: case 11424: case 11428: case 11429: case 11430: case 11434: case 11435: case 11436: case 11440: case 11441: case 11442: case 11446: case 11447: case 11448: case 11452: case 11453: case 11454: case 11458: case 11459: case 11460: case 11464: case 11465: case 11466: case 11470: case 11471: case 11472: case 11476: case 11477: case 11478: case 11482: case 11483: case 11484: case 11488: case 11489: case 11490: case 11494: case 11495: case 11496: case 11500: case 11501: case 11502: case 11506: case 11507: case 11508: case 11512: case 11513: case 11514: return BlockType::PrismarineWall;\n\t\tcase 3998: return BlockType::Pumpkin;\n\t\tcase 4772: case 4773: case 4774: case 4775: case 4776: case 4777: case 4778: case 4779: return BlockType::PumpkinStem;\n\t\tcase 8057: case 8058: case 8059: case 8060: case 8061: case 8062: case 8063: case 8064: case 8065: case 8066: case 8067: case 8068: case 8069: case 8070: case 8071: case 8072: return BlockType::PurpleBanner;\n\t\tcase 1209: case 1210: case 1211: case 1212: case 1213: case 1214: case 1215: case 1216: case 1217: case 1218: case 1219: case 1220: case 1221: case 1222: case 1223: case 1224: return BlockType::PurpleBed;\n\t\tcase 7876: return BlockType::PurpleCarpet;\n\t\tcase 9448: return BlockType::PurpleConcrete;\n\t\tcase 9464: return BlockType::PurpleConcretePowder;\n\t\tcase 9414: case 9415: case 9416: case 9417: return BlockType::PurpleGlazedTerracotta;\n\t\tcase 9338: case 9339: case 9340: case 9341: case 9342: case 9343: return BlockType::PurpleShulkerBox;\n\t\tcase 4105: return BlockType::PurpleStainedGlass;\n\t\tcase 7185: case 7186: case 7189: case 7190: case 7193: case 7194: case 7197: case 7198: case 7201: case 7202: case 7205: case 7206: case 7209: case 7210: case 7213: case 7214: return BlockType::PurpleStainedGlassPane;\n\t\tcase 6857: return BlockType::PurpleTerracotta;\n\t\tcase 8193: case 8194: case 8195: case 8196: return BlockType::PurpleWallBanner;\n\t\tcase 1394: return BlockType::PurpleWool;\n\t\tcase 9134: return BlockType::PurpurBlock;\n\t\tcase 9135: case 9136: case 9137: return BlockType::PurpurPillar;\n\t\tcase 8409: case 8411: case 8413: return BlockType::PurpurSlab;\n\t\tcase 9139: case 9141: case 9143: case 9145: case 9147: case 9149: case 9151: case 9153: case 9155: case 9157: case 9159: case 9161: case 9163: case 9165: case 9167: case 9169: case 9171: case 9173: case 9175: case 9177: case 9179: case 9181: case 9183: case 9185: case 9187: case 9189: case 9191: case 9193: case 9195: case 9197: case 9199: case 9201: case 9203: case 9205: case 9207: case 9209: case 9211: case 9213: case 9215: case 9217: return BlockType::PurpurStairs;\n\t\tcase 6738: return BlockType::QuartzBlock;\n\t\tcase 17103: return BlockType::QuartzBricks;\n\t\tcase 6740: case 6741: case 6742: return BlockType::QuartzPillar;\n\t\tcase 8391: case 8393: case 8395: return BlockType::QuartzSlab;\n\t\tcase 6744: case 6746: case 6748: case 6750: case 6752: case 6754: case 6756: case 6758: case 6760: case 6762: case 6764: case 6766: case 6768: case 6770: case 6772: case 6774: case 6776: case 6778: case 6780: case 6782: case 6784: case 6786: case 6788: case 6790: case 6792: case 6794: case 6796: case 6798: case 6800: case 6802: case 6804: case 6806: case 6808: case 6810: case 6812: case 6814: case 6816: case 6818: case 6820: case 6822: return BlockType::QuartzStairs;\n\t\tcase 3645: case 3646: case 3647: case 3648: case 3649: case 3650: case 3651: case 3652: case 3653: case 3654: return BlockType::Rail;\n\t\tcase 8121: case 8122: case 8123: case 8124: case 8125: case 8126: case 8127: case 8128: case 8129: case 8130: case 8131: case 8132: case 8133: case 8134: case 8135: case 8136: return BlockType::RedBanner;\n\t\tcase 1273: case 1274: case 1275: case 1276: case 1277: case 1278: case 1279: case 1280: case 1281: case 1282: case 1283: case 1284: case 1285: case 1286: case 1287: case 1288: return BlockType::RedBed;\n\t\tcase 7880: return BlockType::RedCarpet;\n\t\tcase 9452: return BlockType::RedConcrete;\n\t\tcase 9468: return BlockType::RedConcretePowder;\n\t\tcase 9430: case 9431: case 9432: case 9433: return BlockType::RedGlazedTerracotta;\n\t\tcase 1426: return BlockType::RedMushroom;\n\t\tcase 4569: case 4570: case 4571: case 4572: case 4573: case 4574: case 4575: case 4576: case 4577: case 4578: case 4579: case 4580: case 4581: case 4582: case 4583: case 4584: case 4585: case 4586: case 4587: case 4588: case 4589: case 4590: case 4591: case 4592: case 4593: case 4594: case 4595: case 4596: case 4597: case 4598: case 4599: case 4600: case 4601: case 4602: case 4603: case 4604: case 4605: case 4606: case 4607: case 4608: case 4609: case 4610: case 4611: case 4612: case 4613: case 4614: case 4615: case 4616: case 4617: case 4618: case 4619: case 4620: case 4621: case 4622: case 4623: case 4624: case 4625: case 4626: case 4627: case 4628: case 4629: case 4630: case 4631: case 4632: return BlockType::RedMushroomBlock;\n\t\tcase 10850: case 10852: case 10854: return BlockType::RedNetherBrickSlab;\n\t\tcase 10550: case 10552: case 10554: case 10556: case 10558: case 10560: case 10562: case 10564: case 10566: case 10568: case 10570: case 10572: case 10574: case 10576: case 10578: case 10580: case 10582: case 10584: case 10586: case 10588: case 10590: case 10592: case 10594: case 10596: case 10598: case 10600: case 10602: case 10604: case 10606: case 10608: case 10610: case 10612: case 10614: case 10616: case 10618: case 10620: case 10622: case 10624: case 10626: case 10628: return BlockType::RedNetherBrickStairs;\n\t\tcase 13462: case 13463: case 13464: case 13468: case 13469: case 13470: case 13474: case 13475: case 13476: case 13480: case 13481: case 13482: case 13486: case 13487: case 13488: case 13492: case 13493: case 13494: case 13498: case 13499: case 13500: case 13504: case 13505: case 13506: case 13510: case 13511: case 13512: case 13516: case 13517: case 13518: case 13522: case 13523: case 13524: case 13528: case 13529: case 13530: case 13534: case 13535: case 13536: case 13540: case 13541: case 13542: case 13546: case 13547: case 13548: case 13552: case 13553: case 13554: case 13558: case 13559: case 13560: case 13564: case 13565: case 13566: case 13570: case 13571: case 13572: case 13576: case 13577: case 13578: case 13582: case 13583: case 13584: case 13588: case 13589: case 13590: case 13594: case 13595: case 13596: case 13600: case 13601: case 13602: case 13606: case 13607: case 13608: case 13612: case 13613: case 13614: case 13618: case 13619: case 13620: case 13624: case 13625: case 13626: case 13630: case 13631: case 13632: case 13636: case 13637: case 13638: case 13642: case 13643: case 13644: case 13648: case 13649: case 13650: case 13654: case 13655: case 13656: case 13660: case 13661: case 13662: case 13666: case 13667: case 13668: case 13672: case 13673: case 13674: case 13678: case 13679: case 13680: case 13684: case 13685: case 13686: case 13690: case 13691: case 13692: case 13696: case 13697: case 13698: case 13702: case 13703: case 13704: case 13708: case 13709: case 13710: case 13714: case 13715: case 13716: case 13720: case 13721: case 13722: case 13726: case 13727: case 13728: case 13732: case 13733: case 13734: case 13738: case 13739: case 13740: case 13744: case 13745: case 13746: case 13750: case 13751: case 13752: case 13756: case 13757: case 13758: case 13762: case 13763: case 13764: case 13768: case 13769: case 13770: case 13774: case 13775: case 13776: case 13780: case 13781: case 13782: return BlockType::RedNetherBrickWall;\n\t\tcase 9255: return BlockType::RedNetherBricks;\n\t\tcase 67: return BlockType::RedSand;\n\t\tcase 8217: return BlockType::RedSandstone;\n\t\tcase 8397: case 8399: case 8401: return BlockType::RedSandstoneSlab;\n\t\tcase 8221: case 8223: case 8225: case 8227: case 8229: case 8231: case 8233: case 8235: case 8237: case 8239: case 8241: case 8243: case 8245: case 8247: case 8249: case 8251: case 8253: case 8255: case 8257: case 8259: case 8261: case 8263: case 8265: case 8267: case 8269: case 8271: case 8273: case 8275: case 8277: case 8279: case 8281: case 8283: case 8285: case 8287: case 8289: case 8291: case 8293: case 8295: case 8297: case 8299: return BlockType::RedSandstoneStairs;\n\t\tcase 11518: case 11519: case 11520: case 11524: case 11525: case 11526: case 11530: case 11531: case 11532: case 11536: case 11537: case 11538: case 11542: case 11543: case 11544: case 11548: case 11549: case 11550: case 11554: case 11555: case 11556: case 11560: case 11561: case 11562: case 11566: case 11567: case 11568: case 11572: case 11573: case 11574: case 11578: case 11579: case 11580: case 11584: case 11585: case 11586: case 11590: case 11591: case 11592: case 11596: case 11597: case 11598: case 11602: case 11603: case 11604: case 11608: case 11609: case 11610: case 11614: case 11615: case 11616: case 11620: case 11621: case 11622: case 11626: case 11627: case 11628: case 11632: case 11633: case 11634: case 11638: case 11639: case 11640: case 11644: case 11645: case 11646: case 11650: case 11651: case 11652: case 11656: case 11657: case 11658: case 11662: case 11663: case 11664: case 11668: case 11669: case 11670: case 11674: case 11675: case 11676: case 11680: case 11681: case 11682: case 11686: case 11687: case 11688: case 11692: case 11693: case 11694: case 11698: case 11699: case 11700: case 11704: case 11705: case 11706: case 11710: case 11711: case 11712: case 11716: case 11717: case 11718: case 11722: case 11723: case 11724: case 11728: case 11729: case 11730: case 11734: case 11735: case 11736: case 11740: case 11741: case 11742: case 11746: case 11747: case 11748: case 11752: case 11753: case 11754: case 11758: case 11759: case 11760: case 11764: case 11765: case 11766: case 11770: case 11771: case 11772: case 11776: case 11777: case 11778: case 11782: case 11783: case 11784: case 11788: case 11789: case 11790: case 11794: case 11795: case 11796: case 11800: case 11801: case 11802: case 11806: case 11807: case 11808: case 11812: case 11813: case 11814: case 11818: case 11819: case 11820: case 11824: case 11825: case 11826: case 11830: case 11831: case 11832: case 11836: case 11837: case 11838: return BlockType::RedSandstoneWall;\n\t\tcase 9362: case 9363: case 9364: case 9365: case 9366: case 9367: return BlockType::RedShulkerBox;\n\t\tcase 4109: return BlockType::RedStainedGlass;\n\t\tcase 7313: case 7314: case 7317: case 7318: case 7321: case 7322: case 7325: case 7326: case 7329: case 7330: case 7333: case 7334: case 7337: case 7338: case 7341: case 7342: return BlockType::RedStainedGlassPane;\n\t\tcase 6861: return BlockType::RedTerracotta;\n\t\tcase 1417: return BlockType::RedTulip;\n\t\tcase 8209: case 8210: case 8211: case 8212: return BlockType::RedWallBanner;\n\t\tcase 1398: return BlockType::RedWool;\n\t\tcase 6726: return BlockType::RedstoneBlock;\n\t\tcase 5156: case 5157: return BlockType::RedstoneLamp;\n\t\tcase 3885: case 3886: return BlockType::RedstoneOre;\n\t\tcase 3887: case 3888: return BlockType::RedstoneTorch;\n\t\tcase 3889: case 3890: case 3891: case 3892: case 3893: case 3894: case 3895: case 3896: return BlockType::RedstoneWallTorch;\n\t\tcase 2058: case 2059: case 2060: case 2061: case 2062: case 2063: case 2064: case 2065: case 2066: case 2067: case 2068: case 2069: case 2070: case 2071: case 2072: case 2073: case 2074: case 2075: case 2076: case 2077: case 2078: case 2079: case 2080: case 2081: case 2082: case 2083: case 2084: case 2085: case 2086: case 2087: case 2088: case 2089: case 2090: case 2091: case 2092: case 2093: case 2094: case 2095: case 2096: case 2097: case 2098: case 2099: case 2100: case 2101: case 2102: case 2103: case 2104: case 2105: case 2106: case 2107: case 2108: case 2109: case 2110: case 2111: case 2112: case 2113: case 2114: case 2115: case 2116: case 2117: case 2118: case 2119: case 2120: case 2121: case 2122: case 2123: case 2124: case 2125: case 2126: case 2127: case 2128: case 2129: case 2130: case 2131: case 2132: case 2133: case 2134: case 2135: case 2136: case 2137: case 2138: case 2139: case 2140: case 2141: case 2142: case 2143: case 2144: case 2145: case 2146: case 2147: case 2148: case 2149: case 2150: case 2151: case 2152: case 2153: case 2154: case 2155: case 2156: case 2157: case 2158: case 2159: case 2160: case 2161: case 2162: case 2163: case 2164: case 2165: case 2166: case 2167: case 2168: case 2169: case 2170: case 2171: case 2172: case 2173: case 2174: case 2175: case 2176: case 2177: case 2178: case 2179: case 2180: case 2181: case 2182: case 2183: case 2184: case 2185: case 2186: case 2187: case 2188: case 2189: case 2190: case 2191: case 2192: case 2193: case 2194: case 2195: case 2196: case 2197: case 2198: case 2199: case 2200: case 2201: case 2202: case 2203: case 2204: case 2205: case 2206: case 2207: case 2208: case 2209: case 2210: case 2211: case 2212: case 2213: case 2214: case 2215: case 2216: case 2217: case 2218: case 2219: case 2220: case 2221: case 2222: case 2223: case 2224: case 2225: case 2226: case 2227: case 2228: case 2229: case 2230: case 2231: case 2232: case 2233: case 2234: case 2235: case 2236: case 2237: case 2238: case 2239: case 2240: case 2241: case 2242: case 2243: case 2244: case 2245: case 2246: case 2247: case 2248: case 2249: case 2250: case 2251: case 2252: case 2253: case 2254: case 2255: case 2256: case 2257: case 2258: case 2259: case 2260: case 2261: case 2262: case 2263: case 2264: case 2265: case 2266: case 2267: case 2268: case 2269: case 2270: case 2271: case 2272: case 2273: case 2274: case 2275: case 2276: case 2277: case 2278: case 2279: case 2280: case 2281: case 2282: case 2283: case 2284: case 2285: case 2286: case 2287: case 2288: case 2289: case 2290: case 2291: case 2292: case 2293: case 2294: case 2295: case 2296: case 2297: case 2298: case 2299: case 2300: case 2301: case 2302: case 2303: case 2304: case 2305: case 2306: case 2307: case 2308: case 2309: case 2310: case 2311: case 2312: case 2313: case 2314: case 2315: case 2316: case 2317: case 2318: case 2319: case 2320: case 2321: case 2322: case 2323: case 2324: case 2325: case 2326: case 2327: case 2328: case 2329: case 2330: case 2331: case 2332: case 2333: case 2334: case 2335: case 2336: case 2337: case 2338: case 2339: case 2340: case 2341: case 2342: case 2343: case 2344: case 2345: case 2346: case 2347: case 2348: case 2349: case 2350: case 2351: case 2352: case 2353: case 2354: case 2355: case 2356: case 2357: case 2358: case 2359: case 2360: case 2361: case 2362: case 2363: case 2364: case 2365: case 2366: case 2367: case 2368: case 2369: case 2370: case 2371: case 2372: case 2373: case 2374: case 2375: case 2376: case 2377: case 2378: case 2379: case 2380: case 2381: case 2382: case 2383: case 2384: case 2385: case 2386: case 2387: case 2388: case 2389: case 2390: case 2391: case 2392: case 2393: case 2394: case 2395: case 2396: case 2397: case 2398: case 2399: case 2400: case 2401: case 2402: case 2403: case 2404: case 2405: case 2406: case 2407: case 2408: case 2409: case 2410: case 2411: case 2412: case 2413: case 2414: case 2415: case 2416: case 2417: case 2418: case 2419: case 2420: case 2421: case 2422: case 2423: case 2424: case 2425: case 2426: case 2427: case 2428: case 2429: case 2430: case 2431: case 2432: case 2433: case 2434: case 2435: case 2436: case 2437: case 2438: case 2439: case 2440: case 2441: case 2442: case 2443: case 2444: case 2445: case 2446: case 2447: case 2448: case 2449: case 2450: case 2451: case 2452: case 2453: case 2454: case 2455: case 2456: case 2457: case 2458: case 2459: case 2460: case 2461: case 2462: case 2463: case 2464: case 2465: case 2466: case 2467: case 2468: case 2469: case 2470: case 2471: case 2472: case 2473: case 2474: case 2475: case 2476: case 2477: case 2478: case 2479: case 2480: case 2481: case 2482: case 2483: case 2484: case 2485: case 2486: case 2487: case 2488: case 2489: case 2490: case 2491: case 2492: case 2493: case 2494: case 2495: case 2496: case 2497: case 2498: case 2499: case 2500: case 2501: case 2502: case 2503: case 2504: case 2505: case 2506: case 2507: case 2508: case 2509: case 2510: case 2511: case 2512: case 2513: case 2514: case 2515: case 2516: case 2517: case 2518: case 2519: case 2520: case 2521: case 2522: case 2523: case 2524: case 2525: case 2526: case 2527: case 2528: case 2529: case 2530: case 2531: case 2532: case 2533: case 2534: case 2535: case 2536: case 2537: case 2538: case 2539: case 2540: case 2541: case 2542: case 2543: case 2544: case 2545: case 2546: case 2547: case 2548: case 2549: case 2550: case 2551: case 2552: case 2553: case 2554: case 2555: case 2556: case 2557: case 2558: case 2559: case 2560: case 2561: case 2562: case 2563: case 2564: case 2565: case 2566: case 2567: case 2568: case 2569: case 2570: case 2571: case 2572: case 2573: case 2574: case 2575: case 2576: case 2577: case 2578: case 2579: case 2580: case 2581: case 2582: case 2583: case 2584: case 2585: case 2586: case 2587: case 2588: case 2589: case 2590: case 2591: case 2592: case 2593: case 2594: case 2595: case 2596: case 2597: case 2598: case 2599: case 2600: case 2601: case 2602: case 2603: case 2604: case 2605: case 2606: case 2607: case 2608: case 2609: case 2610: case 2611: case 2612: case 2613: case 2614: case 2615: case 2616: case 2617: case 2618: case 2619: case 2620: case 2621: case 2622: case 2623: case 2624: case 2625: case 2626: case 2627: case 2628: case 2629: case 2630: case 2631: case 2632: case 2633: case 2634: case 2635: case 2636: case 2637: case 2638: case 2639: case 2640: case 2641: case 2642: case 2643: case 2644: case 2645: case 2646: case 2647: case 2648: case 2649: case 2650: case 2651: case 2652: case 2653: case 2654: case 2655: case 2656: case 2657: case 2658: case 2659: case 2660: case 2661: case 2662: case 2663: case 2664: case 2665: case 2666: case 2667: case 2668: case 2669: case 2670: case 2671: case 2672: case 2673: case 2674: case 2675: case 2676: case 2677: case 2678: case 2679: case 2680: case 2681: case 2682: case 2683: case 2684: case 2685: case 2686: case 2687: case 2688: case 2689: case 2690: case 2691: case 2692: case 2693: case 2694: case 2695: case 2696: case 2697: case 2698: case 2699: case 2700: case 2701: case 2702: case 2703: case 2704: case 2705: case 2706: case 2707: case 2708: case 2709: case 2710: case 2711: case 2712: case 2713: case 2714: case 2715: case 2716: case 2717: case 2718: case 2719: case 2720: case 2721: case 2722: case 2723: case 2724: case 2725: case 2726: case 2727: case 2728: case 2729: case 2730: case 2731: case 2732: case 2733: case 2734: case 2735: case 2736: case 2737: case 2738: case 2739: case 2740: case 2741: case 2742: case 2743: case 2744: case 2745: case 2746: case 2747: case 2748: case 2749: case 2750: case 2751: case 2752: case 2753: case 2754: case 2755: case 2756: case 2757: case 2758: case 2759: case 2760: case 2761: case 2762: case 2763: case 2764: case 2765: case 2766: case 2767: case 2768: case 2769: case 2770: case 2771: case 2772: case 2773: case 2774: case 2775: case 2776: case 2777: case 2778: case 2779: case 2780: case 2781: case 2782: case 2783: case 2784: case 2785: case 2786: case 2787: case 2788: case 2789: case 2790: case 2791: case 2792: case 2793: case 2794: case 2795: case 2796: case 2797: case 2798: case 2799: case 2800: case 2801: case 2802: case 2803: case 2804: case 2805: case 2806: case 2807: case 2808: case 2809: case 2810: case 2811: case 2812: case 2813: case 2814: case 2815: case 2816: case 2817: case 2818: case 2819: case 2820: case 2821: case 2822: case 2823: case 2824: case 2825: case 2826: case 2827: case 2828: case 2829: case 2830: case 2831: case 2832: case 2833: case 2834: case 2835: case 2836: case 2837: case 2838: case 2839: case 2840: case 2841: case 2842: case 2843: case 2844: case 2845: case 2846: case 2847: case 2848: case 2849: case 2850: case 2851: case 2852: case 2853: case 2854: case 2855: case 2856: case 2857: case 2858: case 2859: case 2860: case 2861: case 2862: case 2863: case 2864: case 2865: case 2866: case 2867: case 2868: case 2869: case 2870: case 2871: case 2872: case 2873: case 2874: case 2875: case 2876: case 2877: case 2878: case 2879: case 2880: case 2881: case 2882: case 2883: case 2884: case 2885: case 2886: case 2887: case 2888: case 2889: case 2890: case 2891: case 2892: case 2893: case 2894: case 2895: case 2896: case 2897: case 2898: case 2899: case 2900: case 2901: case 2902: case 2903: case 2904: case 2905: case 2906: case 2907: case 2908: case 2909: case 2910: case 2911: case 2912: case 2913: case 2914: case 2915: case 2916: case 2917: case 2918: case 2919: case 2920: case 2921: case 2922: case 2923: case 2924: case 2925: case 2926: case 2927: case 2928: case 2929: case 2930: case 2931: case 2932: case 2933: case 2934: case 2935: case 2936: case 2937: case 2938: case 2939: case 2940: case 2941: case 2942: case 2943: case 2944: case 2945: case 2946: case 2947: case 2948: case 2949: case 2950: case 2951: case 2952: case 2953: case 2954: case 2955: case 2956: case 2957: case 2958: case 2959: case 2960: case 2961: case 2962: case 2963: case 2964: case 2965: case 2966: case 2967: case 2968: case 2969: case 2970: case 2971: case 2972: case 2973: case 2974: case 2975: case 2976: case 2977: case 2978: case 2979: case 2980: case 2981: case 2982: case 2983: case 2984: case 2985: case 2986: case 2987: case 2988: case 2989: case 2990: case 2991: case 2992: case 2993: case 2994: case 2995: case 2996: case 2997: case 2998: case 2999: case 3000: case 3001: case 3002: case 3003: case 3004: case 3005: case 3006: case 3007: case 3008: case 3009: case 3010: case 3011: case 3012: case 3013: case 3014: case 3015: case 3016: case 3017: case 3018: case 3019: case 3020: case 3021: case 3022: case 3023: case 3024: case 3025: case 3026: case 3027: case 3028: case 3029: case 3030: case 3031: case 3032: case 3033: case 3034: case 3035: case 3036: case 3037: case 3038: case 3039: case 3040: case 3041: case 3042: case 3043: case 3044: case 3045: case 3046: case 3047: case 3048: case 3049: case 3050: case 3051: case 3052: case 3053: case 3054: case 3055: case 3056: case 3057: case 3058: case 3059: case 3060: case 3061: case 3062: case 3063: case 3064: case 3065: case 3066: case 3067: case 3068: case 3069: case 3070: case 3071: case 3072: case 3073: case 3074: case 3075: case 3076: case 3077: case 3078: case 3079: case 3080: case 3081: case 3082: case 3083: case 3084: case 3085: case 3086: case 3087: case 3088: case 3089: case 3090: case 3091: case 3092: case 3093: case 3094: case 3095: case 3096: case 3097: case 3098: case 3099: case 3100: case 3101: case 3102: case 3103: case 3104: case 3105: case 3106: case 3107: case 3108: case 3109: case 3110: case 3111: case 3112: case 3113: case 3114: case 3115: case 3116: case 3117: case 3118: case 3119: case 3120: case 3121: case 3122: case 3123: case 3124: case 3125: case 3126: case 3127: case 3128: case 3129: case 3130: case 3131: case 3132: case 3133: case 3134: case 3135: case 3136: case 3137: case 3138: case 3139: case 3140: case 3141: case 3142: case 3143: case 3144: case 3145: case 3146: case 3147: case 3148: case 3149: case 3150: case 3151: case 3152: case 3153: case 3154: case 3155: case 3156: case 3157: case 3158: case 3159: case 3160: case 3161: case 3162: case 3163: case 3164: case 3165: case 3166: case 3167: case 3168: case 3169: case 3170: case 3171: case 3172: case 3173: case 3174: case 3175: case 3176: case 3177: case 3178: case 3179: case 3180: case 3181: case 3182: case 3183: case 3184: case 3185: case 3186: case 3187: case 3188: case 3189: case 3190: case 3191: case 3192: case 3193: case 3194: case 3195: case 3196: case 3197: case 3198: case 3199: case 3200: case 3201: case 3202: case 3203: case 3204: case 3205: case 3206: case 3207: case 3208: case 3209: case 3210: case 3211: case 3212: case 3213: case 3214: case 3215: case 3216: case 3217: case 3218: case 3219: case 3220: case 3221: case 3222: case 3223: case 3224: case 3225: case 3226: case 3227: case 3228: case 3229: case 3230: case 3231: case 3232: case 3233: case 3234: case 3235: case 3236: case 3237: case 3238: case 3239: case 3240: case 3241: case 3242: case 3243: case 3244: case 3245: case 3246: case 3247: case 3248: case 3249: case 3250: case 3251: case 3252: case 3253: case 3254: case 3255: case 3256: case 3257: case 3258: case 3259: case 3260: case 3261: case 3262: case 3263: case 3264: case 3265: case 3266: case 3267: case 3268: case 3269: case 3270: case 3271: case 3272: case 3273: case 3274: case 3275: case 3276: case 3277: case 3278: case 3279: case 3280: case 3281: case 3282: case 3283: case 3284: case 3285: case 3286: case 3287: case 3288: case 3289: case 3290: case 3291: case 3292: case 3293: case 3294: case 3295: case 3296: case 3297: case 3298: case 3299: case 3300: case 3301: case 3302: case 3303: case 3304: case 3305: case 3306: case 3307: case 3308: case 3309: case 3310: case 3311: case 3312: case 3313: case 3314: case 3315: case 3316: case 3317: case 3318: case 3319: case 3320: case 3321: case 3322: case 3323: case 3324: case 3325: case 3326: case 3327: case 3328: case 3329: case 3330: case 3331: case 3332: case 3333: case 3334: case 3335: case 3336: case 3337: case 3338: case 3339: case 3340: case 3341: case 3342: case 3343: case 3344: case 3345: case 3346: case 3347: case 3348: case 3349: case 3350: case 3351: case 3352: case 3353: return BlockType::RedstoneWire;\n\t\tcase 4031: case 4032: case 4033: case 4034: case 4035: case 4036: case 4037: case 4038: case 4039: case 4040: case 4041: case 4042: case 4043: case 4044: case 4045: case 4046: case 4047: case 4048: case 4049: case 4050: case 4051: case 4052: case 4053: case 4054: case 4055: case 4056: case 4057: case 4058: case 4059: case 4060: case 4061: case 4062: case 4063: case 4064: case 4065: case 4066: case 4067: case 4068: case 4069: case 4070: case 4071: case 4072: case 4073: case 4074: case 4075: case 4076: case 4077: case 4078: case 4079: case 4080: case 4081: case 4082: case 4083: case 4084: case 4085: case 4086: case 4087: case 4088: case 4089: case 4090: case 4091: case 4092: case 4093: case 4094: return BlockType::Repeater;\n\t\tcase 9225: case 9226: case 9227: case 9228: case 9229: case 9230: case 9231: case 9232: case 9233: case 9234: case 9235: case 9236: return BlockType::RepeatingCommandBlock;\n\t\tcase 15829: case 15830: case 15831: case 15832: case 15833: return BlockType::RespawnAnchor;\n\t\tcase 7889: case 7890: return BlockType::RoseBush;\n\t\tcase 66: return BlockType::Sand;\n\t\tcase 246: return BlockType::Sandstone;\n\t\tcase 8349: case 8351: case 8353: return BlockType::SandstoneSlab;\n\t\tcase 5171: case 5173: case 5175: case 5177: case 5179: case 5181: case 5183: case 5185: case 5187: case 5189: case 5191: case 5193: case 5195: case 5197: case 5199: case 5201: case 5203: case 5205: case 5207: case 5209: case 5211: case 5213: case 5215: case 5217: case 5219: case 5221: case 5223: case 5225: case 5227: case 5229: case 5231: case 5233: case 5235: case 5237: case 5239: case 5241: case 5243: case 5245: case 5247: case 5249: return BlockType::SandstoneStairs;\n\t\tcase 13786: case 13787: case 13788: case 13792: case 13793: case 13794: case 13798: case 13799: case 13800: case 13804: case 13805: case 13806: case 13810: case 13811: case 13812: case 13816: case 13817: case 13818: case 13822: case 13823: case 13824: case 13828: case 13829: case 13830: case 13834: case 13835: case 13836: case 13840: case 13841: case 13842: case 13846: case 13847: case 13848: case 13852: case 13853: case 13854: case 13858: case 13859: case 13860: case 13864: case 13865: case 13866: case 13870: case 13871: case 13872: case 13876: case 13877: case 13878: case 13882: case 13883: case 13884: case 13888: case 13889: case 13890: case 13894: case 13895: case 13896: case 13900: case 13901: case 13902: case 13906: case 13907: case 13908: case 13912: case 13913: case 13914: case 13918: case 13919: case 13920: case 13924: case 13925: case 13926: case 13930: case 13931: case 13932: case 13936: case 13937: case 13938: case 13942: case 13943: case 13944: case 13948: case 13949: case 13950: case 13954: case 13955: case 13956: case 13960: case 13961: case 13962: case 13966: case 13967: case 13968: case 13972: case 13973: case 13974: case 13978: case 13979: case 13980: case 13984: case 13985: case 13986: case 13990: case 13991: case 13992: case 13996: case 13997: case 13998: case 14002: case 14003: case 14004: case 14008: case 14009: case 14010: case 14014: case 14015: case 14016: case 14020: case 14021: case 14022: case 14026: case 14027: case 14028: case 14032: case 14033: case 14034: case 14038: case 14039: case 14040: case 14044: case 14045: case 14046: case 14050: case 14051: case 14052: case 14056: case 14057: case 14058: case 14062: case 14063: case 14064: case 14068: case 14069: case 14070: case 14074: case 14075: case 14076: case 14080: case 14081: case 14082: case 14086: case 14087: case 14088: case 14092: case 14093: case 14094: case 14098: case 14099: case 14100: case 14104: case 14105: case 14106: return BlockType::SandstoneWall;\n\t\tcase 14756: case 14758: case 14760: case 14762: case 14764: case 14766: case 14768: case 14770: case 14772: case 14774: case 14776: case 14778: case 14780: case 14782: case 14784: case 14786: return BlockType::Scaffolding;\n\t\tcase 7862: return BlockType::SeaLantern;\n\t\tcase 9641: case 9643: case 9645: case 9647: return BlockType::SeaPickle;\n\t\tcase 1345: return BlockType::Seagrass;\n\t\tcase 14989: return BlockType::Shroomlight;\n\t\tcase 9272: case 9273: case 9274: case 9275: case 9276: case 9277: return BlockType::ShulkerBox;\n\t\tcase 6490: case 6491: case 6492: case 6493: case 6494: case 6495: case 6496: case 6497: case 6498: case 6499: case 6500: case 6501: case 6502: case 6503: case 6504: case 6505: return BlockType::SkeletonSkull;\n\t\tcase 6506: case 6507: case 6508: case 6509: return BlockType::SkeletonWallSkull;\n\t\tcase 7535: return BlockType::SlimeBlock;\n\t\tcase 14849: return BlockType::SmithingTable;\n\t\tcase 14803: case 14804: case 14805: case 14806: case 14807: case 14808: case 14809: case 14810: return BlockType::Smoker;\n\t\tcase 8416: return BlockType::SmoothQuartz;\n\t\tcase 10832: case 10834: case 10836: return BlockType::SmoothQuartzSlab;\n\t\tcase 10310: case 10312: case 10314: case 10316: case 10318: case 10320: case 10322: case 10324: case 10326: case 10328: case 10330: case 10332: case 10334: case 10336: case 10338: case 10340: case 10342: case 10344: case 10346: case 10348: case 10350: case 10352: case 10354: case 10356: case 10358: case 10360: case 10362: case 10364: case 10366: case 10368: case 10370: case 10372: case 10374: case 10376: case 10378: case 10380: case 10382: case 10384: case 10386: case 10388: return BlockType::SmoothQuartzStairs;\n\t\tcase 8417: return BlockType::SmoothRedSandstone;\n\t\tcase 10796: case 10798: case 10800: return BlockType::SmoothRedSandstoneSlab;\n\t\tcase 9750: case 9752: case 9754: case 9756: case 9758: case 9760: case 9762: case 9764: case 9766: case 9768: case 9770: case 9772: case 9774: case 9776: case 9778: case 9780: case 9782: case 9784: case 9786: case 9788: case 9790: case 9792: case 9794: case 9796: case 9798: case 9800: case 9802: case 9804: case 9806: case 9808: case 9810: case 9812: case 9814: case 9816: case 9818: case 9820: case 9822: case 9824: case 9826: case 9828: return BlockType::SmoothRedSandstoneStairs;\n\t\tcase 8415: return BlockType::SmoothSandstone;\n\t\tcase 10826: case 10828: case 10830: return BlockType::SmoothSandstoneSlab;\n\t\tcase 10230: case 10232: case 10234: case 10236: case 10238: case 10240: case 10242: case 10244: case 10246: case 10248: case 10250: case 10252: case 10254: case 10256: case 10258: case 10260: case 10262: case 10264: case 10266: case 10268: case 10270: case 10272: case 10274: case 10276: case 10278: case 10280: case 10282: case 10284: case 10286: case 10288: case 10290: case 10292: case 10294: case 10296: case 10298: case 10300: case 10302: case 10304: case 10306: case 10308: return BlockType::SmoothSandstoneStairs;\n\t\tcase 8414: return BlockType::SmoothStone;\n\t\tcase 8343: case 8345: case 8347: return BlockType::SmoothStoneSlab;\n\t\tcase 3921: case 3922: case 3923: case 3924: case 3925: case 3926: case 3927: case 3928: return BlockType::Snow;\n\t\tcase 3930: return BlockType::SnowBlock;\n\t\tcase 14923: case 14925: case 14927: case 14929: case 14931: case 14933: case 14935: case 14937: case 14939: case 14941: case 14943: case 14945: case 14947: case 14949: case 14951: case 14953: return BlockType::SoulCampfire;\n\t\tcase 1952: return BlockType::SoulFire;\n\t\tcase 14888: case 14889: return BlockType::SoulLantern;\n\t\tcase 4000: return BlockType::SoulSand;\n\t\tcase 4001: return BlockType::SoulSoil;\n\t\tcase 4008: return BlockType::SoulTorch;\n\t\tcase 4009: case 4010: case 4011: case 4012: return BlockType::SoulWallTorch;\n\t\tcase 1953: return BlockType::Spawner;\n\t\tcase 229: return BlockType::Sponge;\n\t\tcase 6370: case 6371: case 6372: case 6373: case 6374: case 6375: case 6376: case 6377: case 6378: case 6379: case 6380: case 6381: case 6382: case 6383: case 6384: case 6385: case 6386: case 6387: case 6388: case 6389: case 6390: case 6391: case 6392: case 6393: return BlockType::SpruceButton;\n\t\tcase 8738: case 8739: case 8740: case 8741: case 8742: case 8743: case 8744: case 8745: case 8746: case 8747: case 8748: case 8749: case 8750: case 8751: case 8752: case 8753: case 8754: case 8755: case 8756: case 8757: case 8758: case 8759: case 8760: case 8761: case 8762: case 8763: case 8764: case 8765: case 8766: case 8767: case 8768: case 8769: case 8770: case 8771: case 8772: case 8773: case 8774: case 8775: case 8776: case 8777: case 8778: case 8779: case 8780: case 8781: case 8782: case 8783: case 8784: case 8785: case 8786: case 8787: case 8788: case 8789: case 8790: case 8791: case 8792: case 8793: case 8794: case 8795: case 8796: case 8797: case 8798: case 8799: case 8800: case 8801: return BlockType::SpruceDoor;\n\t\tcase 8580: case 8581: case 8584: case 8585: case 8588: case 8589: case 8592: case 8593: case 8596: case 8597: case 8600: case 8601: case 8604: case 8605: case 8608: case 8609: return BlockType::SpruceFence;\n\t\tcase 8418: case 8419: case 8420: case 8421: case 8422: case 8423: case 8424: case 8425: case 8426: case 8427: case 8428: case 8429: case 8430: case 8431: case 8432: case 8433: case 8434: case 8435: case 8436: case 8437: case 8438: case 8439: case 8440: case 8441: case 8442: case 8443: case 8444: case 8445: case 8446: case 8447: case 8448: case 8449: return BlockType::SpruceFenceGate;\n\t\tcase 159: case 160: case 161: case 162: case 163: case 164: case 165: case 166: case 167: case 168: case 169: case 170: case 171: case 172: return BlockType::SpruceLeaves;\n\t\tcase 76: case 77: case 78: return BlockType::SpruceLog;\n\t\tcase 16: return BlockType::SprucePlanks;\n\t\tcase 3875: case 3876: return BlockType::SprucePressurePlate;\n\t\tcase 23: case 24: return BlockType::SpruceSapling;\n\t\tcase 3414: case 3416: case 3418: case 3420: case 3422: case 3424: case 3426: case 3428: case 3430: case 3432: case 3434: case 3436: case 3438: case 3440: case 3442: case 3444: return BlockType::SpruceSign;\n\t\tcase 8307: case 8309: case 8311: return BlockType::SpruceSlab;\n\t\tcase 5405: case 5407: case 5409: case 5411: case 5413: case 5415: case 5417: case 5419: case 5421: case 5423: case 5425: case 5427: case 5429: case 5431: case 5433: case 5435: case 5437: case 5439: case 5441: case 5443: case 5445: case 5447: case 5449: case 5451: case 5453: case 5455: case 5457: case 5459: case 5461: case 5463: case 5465: case 5467: case 5469: case 5471: case 5473: case 5475: case 5477: case 5479: case 5481: case 5483: return BlockType::SpruceStairs;\n\t\tcase 4176: case 4178: case 4180: case 4182: case 4184: case 4186: case 4188: case 4190: case 4192: case 4194: case 4196: case 4198: case 4200: case 4202: case 4204: case 4206: case 4208: case 4210: case 4212: case 4214: case 4216: case 4218: case 4220: case 4222: case 4224: case 4226: case 4228: case 4230: case 4232: case 4234: case 4236: case 4238: return BlockType::SpruceTrapdoor;\n\t\tcase 3744: case 3746: case 3748: case 3750: return BlockType::SpruceWallSign;\n\t\tcase 112: case 113: case 114: return BlockType::SpruceWood;\n\t\tcase 1329: case 1330: case 1331: case 1332: case 1333: case 1334: case 1335: case 1336: case 1337: case 1338: case 1339: case 1340: return BlockType::StickyPiston;\n\t\tcase 1: return BlockType::Stone;\n\t\tcase 8379: case 8381: case 8383: return BlockType::StoneBrickSlab;\n\t\tcase 4933: case 4935: case 4937: case 4939: case 4941: case 4943: case 4945: case 4947: case 4949: case 4951: case 4953: case 4955: case 4957: case 4959: case 4961: case 4963: case 4965: case 4967: case 4969: case 4971: case 4973: case 4975: case 4977: case 4979: case 4981: case 4983: case 4985: case 4987: case 4989: case 4991: case 4993: case 4995: case 4997: case 4999: case 5001: case 5003: case 5005: case 5007: case 5009: case 5011: return BlockType::StoneBrickStairs;\n\t\tcase 12490: case 12491: case 12492: case 12496: case 12497: case 12498: case 12502: case 12503: case 12504: case 12508: case 12509: case 12510: case 12514: case 12515: case 12516: case 12520: case 12521: case 12522: case 12526: case 12527: case 12528: case 12532: case 12533: case 12534: case 12538: case 12539: case 12540: case 12544: case 12545: case 12546: case 12550: case 12551: case 12552: case 12556: case 12557: case 12558: case 12562: case 12563: case 12564: case 12568: case 12569: case 12570: case 12574: case 12575: case 12576: case 12580: case 12581: case 12582: case 12586: case 12587: case 12588: case 12592: case 12593: case 12594: case 12598: case 12599: case 12600: case 12604: case 12605: case 12606: case 12610: case 12611: case 12612: case 12616: case 12617: case 12618: case 12622: case 12623: case 12624: case 12628: case 12629: case 12630: case 12634: case 12635: case 12636: case 12640: case 12641: case 12642: case 12646: case 12647: case 12648: case 12652: case 12653: case 12654: case 12658: case 12659: case 12660: case 12664: case 12665: case 12666: case 12670: case 12671: case 12672: case 12676: case 12677: case 12678: case 12682: case 12683: case 12684: case 12688: case 12689: case 12690: case 12694: case 12695: case 12696: case 12700: case 12701: case 12702: case 12706: case 12707: case 12708: case 12712: case 12713: case 12714: case 12718: case 12719: case 12720: case 12724: case 12725: case 12726: case 12730: case 12731: case 12732: case 12736: case 12737: case 12738: case 12742: case 12743: case 12744: case 12748: case 12749: case 12750: case 12754: case 12755: case 12756: case 12760: case 12761: case 12762: case 12766: case 12767: case 12768: case 12772: case 12773: case 12774: case 12778: case 12779: case 12780: case 12784: case 12785: case 12786: case 12790: case 12791: case 12792: case 12796: case 12797: case 12798: case 12802: case 12803: case 12804: case 12808: case 12809: case 12810: return BlockType::StoneBrickWall;\n\t\tcase 4495: return BlockType::StoneBricks;\n\t\tcase 3897: case 3898: case 3899: case 3900: case 3901: case 3902: case 3903: case 3904: case 3905: case 3906: case 3907: case 3908: case 3909: case 3910: case 3911: case 3912: case 3913: case 3914: case 3915: case 3916: case 3917: case 3918: case 3919: case 3920: return BlockType::StoneButton;\n\t\tcase 3807: case 3808: return BlockType::StonePressurePlate;\n\t\tcase 8337: case 8339: case 8341: return BlockType::StoneSlab;\n\t\tcase 10150: case 10152: case 10154: case 10156: case 10158: case 10160: case 10162: case 10164: case 10166: case 10168: case 10170: case 10172: case 10174: case 10176: case 10178: case 10180: case 10182: case 10184: case 10186: case 10188: case 10190: case 10192: case 10194: case 10196: case 10198: case 10200: case 10202: case 10204: case 10206: case 10208: case 10210: case 10212: case 10214: case 10216: case 10218: case 10220: case 10222: case 10224: case 10226: case 10228: return BlockType::StoneStairs;\n\t\tcase 14850: case 14851: case 14852: case 14853: return BlockType::Stonecutter;\n\t\tcase 100: case 101: case 102: return BlockType::StrippedAcaciaLog;\n\t\tcase 139: case 140: case 141: return BlockType::StrippedAcaciaWood;\n\t\tcase 94: case 95: case 96: return BlockType::StrippedBirchLog;\n\t\tcase 133: case 134: case 135: return BlockType::StrippedBirchWood;\n\t\tcase 14984: case 14985: case 14986: return BlockType::StrippedCrimsonHyphae;\n\t\tcase 14978: case 14979: case 14980: return BlockType::StrippedCrimsonStem;\n\t\tcase 103: case 104: case 105: return BlockType::StrippedDarkOakLog;\n\t\tcase 142: case 143: case 144: return BlockType::StrippedDarkOakWood;\n\t\tcase 97: case 98: case 99: return BlockType::StrippedJungleLog;\n\t\tcase 136: case 137: case 138: return BlockType::StrippedJungleWood;\n\t\tcase 106: case 107: case 108: return BlockType::StrippedOakLog;\n\t\tcase 127: case 128: case 129: return BlockType::StrippedOakWood;\n\t\tcase 91: case 92: case 93: return BlockType::StrippedSpruceLog;\n\t\tcase 130: case 131: case 132: return BlockType::StrippedSpruceWood;\n\t\tcase 14967: case 14968: case 14969: return BlockType::StrippedWarpedHyphae;\n\t\tcase 14961: case 14962: case 14963: return BlockType::StrippedWarpedStem;\n\t\tcase 15735: case 15736: case 15737: case 15738: return BlockType::StructureBlock;\n\t\tcase 9259: return BlockType::StructureVoid;\n\t\tcase 3948: case 3949: case 3950: case 3951: case 3952: case 3953: case 3954: case 3955: case 3956: case 3957: case 3958: case 3959: case 3960: case 3961: case 3962: case 3963: return BlockType::SugarCane;\n\t\tcase 7885: case 7886: return BlockType::Sunflower;\n\t\tcase 14954: case 14955: case 14956: case 14957: return BlockType::SweetBerryBush;\n\t\tcase 1430: case 1431: return BlockType::TNT;\n\t\tcase 7893: case 7894: return BlockType::TallGrass;\n\t\tcase 1346: case 1347: return BlockType::TallSeagrass;\n\t\tcase 15760: case 15761: case 15762: case 15763: case 15764: case 15765: case 15766: case 15767: case 15768: case 15769: case 15770: case 15771: case 15772: case 15773: case 15774: case 15775: return BlockType::Target;\n\t\tcase 7882: return BlockType::Terracotta;\n\t\tcase 1435: return BlockType::Torch;\n\t\tcase 6623: case 6625: case 6627: case 6629: case 6631: case 6633: case 6635: case 6637: case 6639: case 6641: case 6643: case 6645: return BlockType::TrappedChest;\n\t\tcase 5275: case 5276: case 5277: case 5278: case 5279: case 5280: case 5281: case 5282: case 5283: case 5284: case 5285: case 5286: case 5287: case 5288: case 5289: case 5290: case 5291: case 5292: case 5293: case 5294: case 5295: case 5296: case 5297: case 5298: case 5299: case 5300: case 5301: case 5302: case 5303: case 5304: case 5305: case 5306: case 5307: case 5308: case 5309: case 5310: case 5311: case 5312: case 5313: case 5314: case 5315: case 5316: case 5317: case 5318: case 5319: case 5320: case 5321: case 5322: case 5323: case 5324: case 5325: case 5326: case 5327: case 5328: case 5329: case 5330: case 5331: case 5332: case 5333: case 5334: case 5335: case 5336: case 5337: case 5338: case 5339: case 5340: case 5341: case 5342: case 5343: case 5344: case 5345: case 5346: case 5347: case 5348: case 5349: case 5350: case 5351: case 5352: case 5353: case 5354: case 5355: case 5356: case 5357: case 5358: case 5359: case 5360: case 5361: case 5362: case 5363: case 5364: case 5365: case 5366: case 5367: case 5368: case 5369: case 5370: case 5371: case 5372: case 5373: case 5374: case 5375: case 5376: case 5377: case 5378: case 5379: case 5380: case 5381: case 5382: case 5383: case 5384: case 5385: case 5386: case 5387: case 5388: case 5389: case 5390: case 5391: case 5392: case 5393: case 5394: case 5395: case 5396: case 5397: case 5398: case 5399: case 5400: case 5401: case 5402: return BlockType::Tripwire;\n\t\tcase 5259: case 5260: case 5261: case 5262: case 5263: case 5264: case 5265: case 5266: case 5267: case 5268: case 5269: case 5270: case 5271: case 5272: case 5273: case 5274: return BlockType::TripwireHook;\n\t\tcase 9531: return BlockType::TubeCoral;\n\t\tcase 9515: return BlockType::TubeCoralBlock;\n\t\tcase 9551: return BlockType::TubeCoralFan;\n\t\tcase 9601: case 9603: case 9605: case 9607: return BlockType::TubeCoralWallFan;\n\t\tcase 9498: case 9499: case 9500: case 9501: case 9502: case 9503: case 9504: case 9505: case 9506: case 9507: case 9508: case 9509: return BlockType::TurtleEgg;\n\t\tcase 15017: case 15018: case 15019: case 15020: case 15021: case 15022: case 15023: case 15024: case 15025: case 15026: case 15027: case 15028: case 15029: case 15030: case 15031: case 15032: case 15033: case 15034: case 15035: case 15036: case 15037: case 15038: case 15039: case 15040: case 15041: case 15042: return BlockType::TwistingVines;\n\t\tcase 15043: return BlockType::TwistingVinesPlant;\n\t\tcase 4788: case 4789: case 4790: case 4791: case 4792: case 4793: case 4794: case 4795: case 4796: case 4797: case 4798: case 4799: case 4800: case 4801: case 4802: case 4803: case 4804: case 4805: case 4806: case 4807: case 4808: case 4809: case 4810: case 4811: case 4812: case 4813: case 4814: case 4815: case 4816: case 4817: case 4818: case 4819: return BlockType::Vine;\n\t\tcase 9665: return BlockType::VoidAir;\n\t\tcase 1436: case 1437: case 1438: case 1439: return BlockType::WallTorch;\n\t\tcase 15503: case 15504: case 15505: case 15506: case 15507: case 15508: case 15509: case 15510: case 15511: case 15512: case 15513: case 15514: case 15515: case 15516: case 15517: case 15518: case 15519: case 15520: case 15521: case 15522: case 15523: case 15524: case 15525: case 15526: return BlockType::WarpedButton;\n\t\tcase 15591: case 15592: case 15593: case 15594: case 15595: case 15596: case 15597: case 15598: case 15599: case 15600: case 15601: case 15602: case 15603: case 15604: case 15605: case 15606: case 15607: case 15608: case 15609: case 15610: case 15611: case 15612: case 15613: case 15614: case 15615: case 15616: case 15617: case 15618: case 15619: case 15620: case 15621: case 15622: case 15623: case 15624: case 15625: case 15626: case 15627: case 15628: case 15629: case 15630: case 15631: case 15632: case 15633: case 15634: case 15635: case 15636: case 15637: case 15638: case 15639: case 15640: case 15641: case 15642: case 15643: case 15644: case 15645: case 15646: case 15647: case 15648: case 15649: case 15650: case 15651: case 15652: case 15653: case 15654: return BlockType::WarpedDoor;\n\t\tcase 15097: case 15098: case 15101: case 15102: case 15105: case 15106: case 15109: case 15110: case 15113: case 15114: case 15117: case 15118: case 15121: case 15122: case 15125: case 15126: return BlockType::WarpedFence;\n\t\tcase 15287: case 15288: case 15289: case 15290: case 15291: case 15292: case 15293: case 15294: case 15295: case 15296: case 15297: case 15298: case 15299: case 15300: case 15301: case 15302: case 15303: case 15304: case 15305: case 15306: case 15307: case 15308: case 15309: case 15310: case 15311: case 15312: case 15313: case 15314: case 15315: case 15316: case 15317: case 15318: return BlockType::WarpedFenceGate;\n\t\tcase 14971: return BlockType::WarpedFungus;\n\t\tcase 14964: case 14965: case 14966: return BlockType::WarpedHyphae;\n\t\tcase 14970: return BlockType::WarpedNylium;\n\t\tcase 15046: return BlockType::WarpedPlanks;\n\t\tcase 15061: case 15062: return BlockType::WarpedPressurePlate;\n\t\tcase 14973: return BlockType::WarpedRoots;\n\t\tcase 15688: case 15690: case 15692: case 15694: case 15696: case 15698: case 15700: case 15702: case 15704: case 15706: case 15708: case 15710: case 15712: case 15714: case 15716: case 15718: return BlockType::WarpedSign;\n\t\tcase 15054: case 15056: case 15058: return BlockType::WarpedSlab;\n\t\tcase 15400: case 15402: case 15404: case 15406: case 15408: case 15410: case 15412: case 15414: case 15416: case 15418: case 15420: case 15422: case 15424: case 15426: case 15428: case 15430: case 15432: case 15434: case 15436: case 15438: case 15440: case 15442: case 15444: case 15446: case 15448: case 15450: case 15452: case 15454: case 15456: case 15458: case 15460: case 15462: case 15464: case 15466: case 15468: case 15470: case 15472: case 15474: case 15476: case 15478: return BlockType::WarpedStairs;\n\t\tcase 14958: case 14959: case 14960: return BlockType::WarpedStem;\n\t\tcase 15192: case 15194: case 15196: case 15198: case 15200: case 15202: case 15204: case 15206: case 15208: case 15210: case 15212: case 15214: case 15216: case 15218: case 15220: case 15222: case 15224: case 15226: case 15228: case 15230: case 15232: case 15234: case 15236: case 15238: case 15240: case 15242: case 15244: case 15246: case 15248: case 15250: case 15252: case 15254: return BlockType::WarpedTrapdoor;\n\t\tcase 15728: case 15730: case 15732: case 15734: return BlockType::WarpedWallSign;\n\t\tcase 14972: return BlockType::WarpedWartBlock;\n\t\tcase 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: case 48: case 49: return BlockType::Water;\n\t\tcase 14990: case 14991: case 14992: case 14993: case 14994: case 14995: case 14996: case 14997: case 14998: case 14999: case 15000: case 15001: case 15002: case 15003: case 15004: case 15005: case 15006: case 15007: case 15008: case 15009: case 15010: case 15011: case 15012: case 15013: case 15014: case 15015: return BlockType::WeepingVines;\n\t\tcase 15016: return BlockType::WeepingVinesPlant;\n\t\tcase 230: return BlockType::WetSponge;\n\t\tcase 3357: case 3358: case 3359: case 3360: case 3361: case 3362: case 3363: case 3364: return BlockType::Wheat;\n\t\tcase 7897: case 7898: case 7899: case 7900: case 7901: case 7902: case 7903: case 7904: case 7905: case 7906: case 7907: case 7908: case 7909: case 7910: case 7911: case 7912: return BlockType::WhiteBanner;\n\t\tcase 1049: case 1050: case 1051: case 1052: case 1053: case 1054: case 1055: case 1056: case 1057: case 1058: case 1059: case 1060: case 1061: case 1062: case 1063: case 1064: return BlockType::WhiteBed;\n\t\tcase 7866: return BlockType::WhiteCarpet;\n\t\tcase 9438: return BlockType::WhiteConcrete;\n\t\tcase 9454: return BlockType::WhiteConcretePowder;\n\t\tcase 9374: case 9375: case 9376: case 9377: return BlockType::WhiteGlazedTerracotta;\n\t\tcase 9278: case 9279: case 9280: case 9281: case 9282: case 9283: return BlockType::WhiteShulkerBox;\n\t\tcase 4095: return BlockType::WhiteStainedGlass;\n\t\tcase 6865: case 6866: case 6869: case 6870: case 6873: case 6874: case 6877: case 6878: case 6881: case 6882: case 6885: case 6886: case 6889: case 6890: case 6893: case 6894: return BlockType::WhiteStainedGlassPane;\n\t\tcase 6847: return BlockType::WhiteTerracotta;\n\t\tcase 1419: return BlockType::WhiteTulip;\n\t\tcase 8153: case 8154: case 8155: case 8156: return BlockType::WhiteWallBanner;\n\t\tcase 1384: return BlockType::WhiteWool;\n\t\tcase 1423: return BlockType::WitherRose;\n\t\tcase 6510: case 6511: case 6512: case 6513: case 6514: case 6515: case 6516: case 6517: case 6518: case 6519: case 6520: case 6521: case 6522: case 6523: case 6524: case 6525: return BlockType::WitherSkeletonSkull;\n\t\tcase 6526: case 6527: case 6528: case 6529: return BlockType::WitherSkeletonWallSkull;\n\t\tcase 7961: case 7962: case 7963: case 7964: case 7965: case 7966: case 7967: case 7968: case 7969: case 7970: case 7971: case 7972: case 7973: case 7974: case 7975: case 7976: return BlockType::YellowBanner;\n\t\tcase 1113: case 1114: case 1115: case 1116: case 1117: case 1118: case 1119: case 1120: case 1121: case 1122: case 1123: case 1124: case 1125: case 1126: case 1127: case 1128: return BlockType::YellowBed;\n\t\tcase 7870: return BlockType::YellowCarpet;\n\t\tcase 9442: return BlockType::YellowConcrete;\n\t\tcase 9458: return BlockType::YellowConcretePowder;\n\t\tcase 9390: case 9391: case 9392: case 9393: return BlockType::YellowGlazedTerracotta;\n\t\tcase 9302: case 9303: case 9304: case 9305: case 9306: case 9307: return BlockType::YellowShulkerBox;\n\t\tcase 4099: return BlockType::YellowStainedGlass;\n\t\tcase 6993: case 6994: case 6997: case 6998: case 7001: case 7002: case 7005: case 7006: case 7009: case 7010: case 7013: case 7014: case 7017: case 7018: case 7021: case 7022: return BlockType::YellowStainedGlassPane;\n\t\tcase 6851: return BlockType::YellowTerracotta;\n\t\tcase 8169: case 8170: case 8171: case 8172: return BlockType::YellowWallBanner;\n\t\tcase 1388: return BlockType::YellowWool;\n\t\tcase 6530: case 6531: case 6532: case 6533: case 6534: case 6535: case 6536: case 6537: case 6538: case 6539: case 6540: case 6541: case 6542: case 6543: case 6544: case 6545: return BlockType::ZombieHead;\n\t\tdefault: return BlockType::ZombieWallHead;\n\t}\n}\n"
  },
  {
    "path": "src/Registries/BlockStates.h",
    "content": "#pragma once\n\n#include \"Globals.h\"\n#include \"BlockState.h\"\n#include \"Defines.h\"\n\nnamespace Block\n{\n\tnamespace AcaciaButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState AcaciaButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6442;\n\t\t\t\t\telse return 6443;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6444;\n\t\t\t\t\telse return 6445;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6446;\n\t\t\t\t\telse return 6447;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6448;\n\t\t\t\t\telse return 6449;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6450;\n\t\t\t\t\telse return 6451;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6452;\n\t\t\t\t\telse return 6453;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6454;\n\t\t\t\t\telse return 6455;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6456;\n\t\t\t\t\telse return 6457;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6458;\n\t\t\t\t\telse return 6459;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6460;\n\t\t\t\t\telse return 6461;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6462;\n\t\t\t\t\telse return 6463;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6464;\n\t\t\t\t\telse return 6465;\n\t\t}\n\t\tBlockState AcaciaButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace AcaciaDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState AcaciaDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8930;\n\t\t\t\t\t\t\telse return 8931;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8932;\n\t\t\t\t\t\t\telse return 8933;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8934;\n\t\t\t\t\t\t\telse return 8935;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8936;\n\t\t\t\t\t\t\telse return 8937;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8938;\n\t\t\t\t\t\t\telse return 8939;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8940;\n\t\t\t\t\t\t\telse return 8941;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8942;\n\t\t\t\t\t\t\telse return 8943;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8944;\n\t\t\t\t\t\t\telse return 8945;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8946;\n\t\t\t\t\t\t\telse return 8947;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8948;\n\t\t\t\t\t\t\telse return 8949;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8950;\n\t\t\t\t\t\t\telse return 8951;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8952;\n\t\t\t\t\t\t\telse return 8953;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8954;\n\t\t\t\t\t\t\telse return 8955;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8956;\n\t\t\t\t\t\t\telse return 8957;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8958;\n\t\t\t\t\t\t\telse return 8959;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8960;\n\t\t\t\t\t\t\telse return 8961;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8962;\n\t\t\t\t\t\t\telse return 8963;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8964;\n\t\t\t\t\t\t\telse return 8965;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8966;\n\t\t\t\t\t\t\telse return 8967;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8968;\n\t\t\t\t\t\t\telse return 8969;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8970;\n\t\t\t\t\t\t\telse return 8971;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8972;\n\t\t\t\t\t\t\telse return 8973;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8974;\n\t\t\t\t\t\t\telse return 8975;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8976;\n\t\t\t\t\t\t\telse return 8977;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8978;\n\t\t\t\t\t\t\telse return 8979;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8980;\n\t\t\t\t\t\t\telse return 8981;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8982;\n\t\t\t\t\t\t\telse return 8983;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8984;\n\t\t\t\t\t\t\telse return 8985;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8986;\n\t\t\t\t\t\t\telse return 8987;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8988;\n\t\t\t\t\t\t\telse return 8989;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8990;\n\t\t\t\t\t\t\telse return 8991;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8992;\n\t\t\t\t\t\t\telse return 8993;\n\t\t}\n\t\tBlockState AcaciaDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace AcaciaFence\n\t{\n\t\tconstexpr BlockState AcaciaFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8676;\n\t\t\t\t\t\telse return 8677;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8680;\n\t\t\t\t\t\telse return 8681;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8684;\n\t\t\t\t\t\telse return 8685;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8688;\n\t\t\t\t\t\telse return 8689;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8692;\n\t\t\t\t\t\telse return 8693;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8696;\n\t\t\t\t\t\telse return 8697;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8700;\n\t\t\t\t\t\telse return 8701;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8704;\n\t\t\t\t\t\telse return 8705;\n\t\t}\n\t\tBlockState AcaciaFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace AcaciaFenceGate\n\t{\n\t\tconstexpr BlockState AcaciaFenceGate(const eBlockFace Facing, const bool InWall, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8514;\n\t\t\t\t\t\telse return 8515;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8516;\n\t\t\t\t\t\telse return 8517;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8518;\n\t\t\t\t\t\telse return 8519;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8520;\n\t\t\t\t\t\telse return 8521;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8522;\n\t\t\t\t\t\telse return 8523;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8524;\n\t\t\t\t\t\telse return 8525;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8526;\n\t\t\t\t\t\telse return 8527;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8528;\n\t\t\t\t\t\telse return 8529;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8530;\n\t\t\t\t\t\telse return 8531;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8532;\n\t\t\t\t\t\telse return 8533;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8534;\n\t\t\t\t\t\telse return 8535;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8536;\n\t\t\t\t\t\telse return 8537;\n\t\t\telse\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8538;\n\t\t\t\t\t\telse return 8539;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8540;\n\t\t\t\t\t\telse return 8541;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8542;\n\t\t\t\t\t\telse return 8543;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8544;\n\t\t\t\t\t\telse return 8545;\n\t\t}\n\t\tBlockState AcaciaFenceGate();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool InWall(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace AcaciaLeaves\n\t{\n\t\tconstexpr BlockState AcaciaLeaves(const unsigned char Distance, const bool Persistent)\n\t\t{\n\t\t\tif (Distance == 1)\n\t\t\t\tif (Persistent) return 201;\n\t\t\t\telse return 202;\n\t\t\telse if (Distance == 2)\n\t\t\t\tif (Persistent) return 203;\n\t\t\t\telse return 204;\n\t\t\telse if (Distance == 3)\n\t\t\t\tif (Persistent) return 205;\n\t\t\t\telse return 206;\n\t\t\telse if (Distance == 4)\n\t\t\t\tif (Persistent) return 207;\n\t\t\t\telse return 208;\n\t\t\telse if (Distance == 5)\n\t\t\t\tif (Persistent) return 209;\n\t\t\t\telse return 210;\n\t\t\telse if (Distance == 6)\n\t\t\t\tif (Persistent) return 211;\n\t\t\t\telse return 212;\n\t\t\telse\n\t\t\t\tif (Persistent) return 213;\n\t\t\t\telse return 214;\n\t\t}\n\t\tBlockState AcaciaLeaves();\n\t\tunsigned char Distance(BlockState Block);\n\t\tbool Persistent(BlockState Block);\n\t}\n\tnamespace AcaciaLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState AcaciaLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 85;\n\t\t\telse if (Axis == Axis::Y) return 86;\n\t\t\telse return 87;\n\t\t}\n\t\tBlockState AcaciaLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace AcaciaPlanks\n\t{\n\t\tconstexpr BlockState AcaciaPlanks()\n\t\t{\n\t\t\treturn 19;\n\t\t}\n\t}\n\tnamespace AcaciaPressurePlate\n\t{\n\t\tconstexpr BlockState AcaciaPressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 3881;\n\t\t\telse return 3882;\n\t\t}\n\t\tBlockState AcaciaPressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace AcaciaSapling\n\t{\n\t\tconstexpr BlockState AcaciaSapling(const unsigned char Stage)\n\t\t{\n\t\t\tif (Stage == 0) return 29;\n\t\t\telse return 30;\n\t\t}\n\t\tBlockState AcaciaSapling();\n\t\tunsigned char Stage(BlockState Block);\n\t}\n\tnamespace AcaciaSign\n\t{\n\t\tconstexpr BlockState AcaciaSign(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 3478;\n\t\t\telse if (Rotation == 1) return 3480;\n\t\t\telse if (Rotation == 2) return 3482;\n\t\t\telse if (Rotation == 3) return 3484;\n\t\t\telse if (Rotation == 4) return 3486;\n\t\t\telse if (Rotation == 5) return 3488;\n\t\t\telse if (Rotation == 6) return 3490;\n\t\t\telse if (Rotation == 7) return 3492;\n\t\t\telse if (Rotation == 8) return 3494;\n\t\t\telse if (Rotation == 9) return 3496;\n\t\t\telse if (Rotation == 10) return 3498;\n\t\t\telse if (Rotation == 11) return 3500;\n\t\t\telse if (Rotation == 12) return 3502;\n\t\t\telse if (Rotation == 13) return 3504;\n\t\t\telse if (Rotation == 14) return 3506;\n\t\t\telse return 3508;\n\t\t}\n\t\tBlockState AcaciaSign();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace AcaciaSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState AcaciaSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8325;\n\t\t\telse if (Type == Type::Bottom) return 8327;\n\t\t\telse return 8329;\n\t\t}\n\t\tBlockState AcaciaSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace AcaciaStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState AcaciaStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7376;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7378;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7380;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7382;\n\t\t\t\t\telse return 7384;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7386;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7388;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7390;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7392;\n\t\t\t\t\telse return 7394;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7396;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7398;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7400;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7402;\n\t\t\t\t\telse return 7404;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7406;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7408;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7410;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7412;\n\t\t\t\t\telse return 7414;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7416;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7418;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7420;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7422;\n\t\t\t\t\telse return 7424;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7426;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7428;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7430;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7432;\n\t\t\t\t\telse return 7434;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7436;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7438;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7440;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7442;\n\t\t\t\t\telse return 7444;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7446;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7448;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7450;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7452;\n\t\t\t\t\telse return 7454;\n\t\t}\n\t\tBlockState AcaciaStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace AcaciaTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState AcaciaTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4368;\n\t\t\t\t\t\telse return 4370;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4372;\n\t\t\t\t\t\telse return 4374;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4376;\n\t\t\t\t\t\telse return 4378;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4380;\n\t\t\t\t\t\telse return 4382;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4384;\n\t\t\t\t\t\telse return 4386;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4388;\n\t\t\t\t\t\telse return 4390;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4392;\n\t\t\t\t\t\telse return 4394;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4396;\n\t\t\t\t\t\telse return 4398;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4400;\n\t\t\t\t\t\telse return 4402;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4404;\n\t\t\t\t\t\telse return 4406;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4408;\n\t\t\t\t\t\telse return 4410;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4412;\n\t\t\t\t\t\telse return 4414;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4416;\n\t\t\t\t\t\telse return 4418;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4420;\n\t\t\t\t\t\telse return 4422;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4424;\n\t\t\t\t\t\telse return 4426;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4428;\n\t\t\t\t\t\telse return 4430;\n\t\t}\n\t\tBlockState AcaciaTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace AcaciaWallSign\n\t{\n\t\tconstexpr BlockState AcaciaWallSign(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 3760;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 3762;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 3764;\n\t\t\telse return 3766;\n\t\t}\n\t\tBlockState AcaciaWallSign();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace AcaciaWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState AcaciaWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 121;\n\t\t\telse if (Axis == Axis::Y) return 122;\n\t\t\telse return 123;\n\t\t}\n\t\tBlockState AcaciaWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace ActivatorRail\n\t{\n\t\tenum class Shape\n\t\t{\n\t\t\tNorthSouth,\n\t\t\tEastWest,\n\t\t\tAscendingEast,\n\t\t\tAscendingWest,\n\t\t\tAscendingNorth,\n\t\t\tAscendingSouth\n\t\t};\n\t\tconstexpr BlockState ActivatorRail(const bool Powered, const enum Shape Shape)\n\t\t{\n\t\t\tif (Powered)\n\t\t\t\tif (Shape == Shape::NorthSouth) return 6823;\n\t\t\t\telse if (Shape == Shape::EastWest) return 6824;\n\t\t\t\telse if (Shape == Shape::AscendingEast) return 6825;\n\t\t\t\telse if (Shape == Shape::AscendingWest) return 6826;\n\t\t\t\telse if (Shape == Shape::AscendingNorth) return 6827;\n\t\t\t\telse return 6828;\n\t\t\telse\n\t\t\t\tif (Shape == Shape::NorthSouth) return 6829;\n\t\t\t\telse if (Shape == Shape::EastWest) return 6830;\n\t\t\t\telse if (Shape == Shape::AscendingEast) return 6831;\n\t\t\t\telse if (Shape == Shape::AscendingWest) return 6832;\n\t\t\t\telse if (Shape == Shape::AscendingNorth) return 6833;\n\t\t\t\telse return 6834;\n\t\t}\n\t\tBlockState ActivatorRail();\n\t\tbool Powered(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace Air\n\t{\n\t\tconstexpr BlockState Air()\n\t\t{\n\t\t\treturn -0;\n\t\t}\n\t}\n\tnamespace Allium\n\t{\n\t\tconstexpr BlockState Allium()\n\t\t{\n\t\t\treturn 1415;\n\t\t}\n\t}\n\tnamespace AncientDebris\n\t{\n\t\tconstexpr BlockState AncientDebris()\n\t\t{\n\t\t\treturn 15827;\n\t\t}\n\t}\n\tnamespace Andesite\n\t{\n\t\tconstexpr BlockState Andesite()\n\t\t{\n\t\t\treturn 6;\n\t\t}\n\t}\n\tnamespace AndesiteSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState AndesiteSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10844;\n\t\t\telse if (Type == Type::Bottom) return 10846;\n\t\t\telse return 10848;\n\t\t}\n\t\tBlockState AndesiteSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace AndesiteStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState AndesiteStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10470;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10472;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10474;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10476;\n\t\t\t\t\telse return 10478;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10480;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10482;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10484;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10486;\n\t\t\t\t\telse return 10488;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10490;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10492;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10494;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10496;\n\t\t\t\t\telse return 10498;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10500;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10502;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10504;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10506;\n\t\t\t\t\telse return 10508;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10510;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10512;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10514;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10516;\n\t\t\t\t\telse return 10518;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10520;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10522;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10524;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10526;\n\t\t\t\t\telse return 10528;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10530;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10532;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10534;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10536;\n\t\t\t\t\telse return 10538;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10540;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10542;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10544;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10546;\n\t\t\t\t\telse return 10548;\n\t\t}\n\t\tBlockState AndesiteStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace AndesiteWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState AndesiteWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13138;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13139;\n\t\t\t\t\t\t\telse return 13140;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13144;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13145;\n\t\t\t\t\t\t\telse return 13146;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13150;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13151;\n\t\t\t\t\t\t\telse return 13152;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13156;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13157;\n\t\t\t\t\t\t\telse return 13158;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13162;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13163;\n\t\t\t\t\t\t\telse return 13164;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13168;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13169;\n\t\t\t\t\t\t\telse return 13170;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13174;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13175;\n\t\t\t\t\t\t\telse return 13176;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13180;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13181;\n\t\t\t\t\t\t\telse return 13182;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13186;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13187;\n\t\t\t\t\t\t\telse return 13188;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13192;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13193;\n\t\t\t\t\t\t\telse return 13194;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13198;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13199;\n\t\t\t\t\t\t\telse return 13200;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13204;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13205;\n\t\t\t\t\t\t\telse return 13206;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13210;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13211;\n\t\t\t\t\t\t\telse return 13212;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13216;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13217;\n\t\t\t\t\t\t\telse return 13218;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13222;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13223;\n\t\t\t\t\t\t\telse return 13224;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13228;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13229;\n\t\t\t\t\t\t\telse return 13230;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13234;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13235;\n\t\t\t\t\t\t\telse return 13236;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13240;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13241;\n\t\t\t\t\t\t\telse return 13242;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13246;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13247;\n\t\t\t\t\t\t\telse return 13248;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13252;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13253;\n\t\t\t\t\t\t\telse return 13254;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13258;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13259;\n\t\t\t\t\t\t\telse return 13260;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13264;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13265;\n\t\t\t\t\t\t\telse return 13266;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13270;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13271;\n\t\t\t\t\t\t\telse return 13272;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13276;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13277;\n\t\t\t\t\t\t\telse return 13278;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13282;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13283;\n\t\t\t\t\t\t\telse return 13284;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13288;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13289;\n\t\t\t\t\t\t\telse return 13290;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13294;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13295;\n\t\t\t\t\t\t\telse return 13296;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13300;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13301;\n\t\t\t\t\t\t\telse return 13302;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13306;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13307;\n\t\t\t\t\t\t\telse return 13308;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13312;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13313;\n\t\t\t\t\t\t\telse return 13314;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13318;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13319;\n\t\t\t\t\t\t\telse return 13320;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13324;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13325;\n\t\t\t\t\t\t\telse return 13326;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13330;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13331;\n\t\t\t\t\t\t\telse return 13332;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13336;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13337;\n\t\t\t\t\t\t\telse return 13338;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13342;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13343;\n\t\t\t\t\t\t\telse return 13344;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13348;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13349;\n\t\t\t\t\t\t\telse return 13350;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13354;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13355;\n\t\t\t\t\t\t\telse return 13356;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13360;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13361;\n\t\t\t\t\t\t\telse return 13362;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13366;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13367;\n\t\t\t\t\t\t\telse return 13368;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13372;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13373;\n\t\t\t\t\t\t\telse return 13374;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13378;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13379;\n\t\t\t\t\t\t\telse return 13380;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13384;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13385;\n\t\t\t\t\t\t\telse return 13386;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13390;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13391;\n\t\t\t\t\t\t\telse return 13392;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13396;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13397;\n\t\t\t\t\t\t\telse return 13398;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13402;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13403;\n\t\t\t\t\t\t\telse return 13404;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13408;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13409;\n\t\t\t\t\t\t\telse return 13410;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13414;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13415;\n\t\t\t\t\t\t\telse return 13416;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13420;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13421;\n\t\t\t\t\t\t\telse return 13422;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13426;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13427;\n\t\t\t\t\t\t\telse return 13428;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13432;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13433;\n\t\t\t\t\t\t\telse return 13434;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13438;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13439;\n\t\t\t\t\t\t\telse return 13440;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13444;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13445;\n\t\t\t\t\t\t\telse return 13446;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13450;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13451;\n\t\t\t\t\t\t\telse return 13452;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13456;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13457;\n\t\t\t\t\t\t\telse return 13458;\n\t\t}\n\t\tBlockState AndesiteWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace Anvil\n\t{\n\t\tconstexpr BlockState Anvil(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6610;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6611;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6612;\n\t\t\telse return 6613;\n\t\t}\n\t\tBlockState Anvil();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace AttachedMelonStem\n\t{\n\t\tconstexpr BlockState AttachedMelonStem(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 4768;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 4769;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 4770;\n\t\t\telse return 4771;\n\t\t}\n\t\tBlockState AttachedMelonStem();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace AttachedPumpkinStem\n\t{\n\t\tconstexpr BlockState AttachedPumpkinStem(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 4764;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 4765;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 4766;\n\t\t\telse return 4767;\n\t\t}\n\t\tBlockState AttachedPumpkinStem();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace AzureBluet\n\t{\n\t\tconstexpr BlockState AzureBluet()\n\t\t{\n\t\t\treturn 1416;\n\t\t}\n\t}\n\tnamespace Bamboo\n\t{\n\t\tenum class Leaves\n\t\t{\n\t\t\tNone,\n\t\t\tSmall,\n\t\t\tLarge\n\t\t};\n\t\tconstexpr BlockState Bamboo(const unsigned char Age, const enum Leaves Leaves, const unsigned char Stage)\n\t\t{\n\t\t\tif (Age == 0)\n\t\t\t\tif (Leaves == Leaves::None)\n\t\t\t\t\tif (Stage == 0) return 9652;\n\t\t\t\t\telse return 9653;\n\t\t\t\telse if (Leaves == Leaves::Small)\n\t\t\t\t\tif (Stage == 0) return 9654;\n\t\t\t\t\telse return 9655;\n\t\t\t\telse\n\t\t\t\t\tif (Stage == 0) return 9656;\n\t\t\t\t\telse return 9657;\n\t\t\telse\n\t\t\t\tif (Leaves == Leaves::None)\n\t\t\t\t\tif (Stage == 0) return 9658;\n\t\t\t\t\telse return 9659;\n\t\t\t\telse if (Leaves == Leaves::Small)\n\t\t\t\t\tif (Stage == 0) return 9660;\n\t\t\t\t\telse return 9661;\n\t\t\t\telse\n\t\t\t\t\tif (Stage == 0) return 9662;\n\t\t\t\t\telse return 9663;\n\t\t}\n\t\tBlockState Bamboo();\n\t\tunsigned char Age(BlockState Block);\n\t\tenum Leaves Leaves(BlockState Block);\n\t\tunsigned char Stage(BlockState Block);\n\t}\n\tnamespace BambooSapling\n\t{\n\t\tconstexpr BlockState BambooSapling()\n\t\t{\n\t\t\treturn 9651;\n\t\t}\n\t}\n\tnamespace Barrel\n\t{\n\t\tconstexpr BlockState Barrel(const eBlockFace Facing, const bool Open)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Open) return 14791;\n\t\t\t\telse return 14792;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP)\n\t\t\t\tif (Open) return 14793;\n\t\t\t\telse return 14794;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Open) return 14795;\n\t\t\t\telse return 14796;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Open) return 14797;\n\t\t\t\telse return 14798;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP)\n\t\t\t\tif (Open) return 14799;\n\t\t\t\telse return 14800;\n\t\t\telse\n\t\t\t\tif (Open) return 14801;\n\t\t\t\telse return 14802;\n\t\t}\n\t\tBlockState Barrel();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t}\n\tnamespace Barrier\n\t{\n\t\tconstexpr BlockState Barrier()\n\t\t{\n\t\t\treturn 7536;\n\t\t}\n\t}\n\tnamespace Basalt\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState Basalt(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 4002;\n\t\t\telse if (Axis == Axis::Y) return 4003;\n\t\t\telse return 4004;\n\t\t}\n\t\tBlockState Basalt();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace Beacon\n\t{\n\t\tconstexpr BlockState Beacon()\n\t\t{\n\t\t\treturn 5656;\n\t\t}\n\t}\n\tnamespace Bedrock\n\t{\n\t\tconstexpr BlockState Bedrock()\n\t\t{\n\t\t\treturn 33;\n\t\t}\n\t}\n\tnamespace BeeNest\n\t{\n\t\tconstexpr BlockState BeeNest(const eBlockFace Facing, const unsigned char HoneyLevel)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (HoneyLevel == 0) return 15776;\n\t\t\t\telse if (HoneyLevel == 1) return 15777;\n\t\t\t\telse if (HoneyLevel == 2) return 15778;\n\t\t\t\telse if (HoneyLevel == 3) return 15779;\n\t\t\t\telse if (HoneyLevel == 4) return 15780;\n\t\t\t\telse return 15781;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (HoneyLevel == 0) return 15782;\n\t\t\t\telse if (HoneyLevel == 1) return 15783;\n\t\t\t\telse if (HoneyLevel == 2) return 15784;\n\t\t\t\telse if (HoneyLevel == 3) return 15785;\n\t\t\t\telse if (HoneyLevel == 4) return 15786;\n\t\t\t\telse return 15787;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (HoneyLevel == 0) return 15788;\n\t\t\t\telse if (HoneyLevel == 1) return 15789;\n\t\t\t\telse if (HoneyLevel == 2) return 15790;\n\t\t\t\telse if (HoneyLevel == 3) return 15791;\n\t\t\t\telse if (HoneyLevel == 4) return 15792;\n\t\t\t\telse return 15793;\n\t\t\telse\n\t\t\t\tif (HoneyLevel == 0) return 15794;\n\t\t\t\telse if (HoneyLevel == 1) return 15795;\n\t\t\t\telse if (HoneyLevel == 2) return 15796;\n\t\t\t\telse if (HoneyLevel == 3) return 15797;\n\t\t\t\telse if (HoneyLevel == 4) return 15798;\n\t\t\t\telse return 15799;\n\t\t}\n\t\tBlockState BeeNest();\n\t\teBlockFace Facing(BlockState Block);\n\t\tunsigned char HoneyLevel(BlockState Block);\n\t}\n\tnamespace Beehive\n\t{\n\t\tconstexpr BlockState Beehive(const eBlockFace Facing, const unsigned char HoneyLevel)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (HoneyLevel == 0) return 15800;\n\t\t\t\telse if (HoneyLevel == 1) return 15801;\n\t\t\t\telse if (HoneyLevel == 2) return 15802;\n\t\t\t\telse if (HoneyLevel == 3) return 15803;\n\t\t\t\telse if (HoneyLevel == 4) return 15804;\n\t\t\t\telse return 15805;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (HoneyLevel == 0) return 15806;\n\t\t\t\telse if (HoneyLevel == 1) return 15807;\n\t\t\t\telse if (HoneyLevel == 2) return 15808;\n\t\t\t\telse if (HoneyLevel == 3) return 15809;\n\t\t\t\telse if (HoneyLevel == 4) return 15810;\n\t\t\t\telse return 15811;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (HoneyLevel == 0) return 15812;\n\t\t\t\telse if (HoneyLevel == 1) return 15813;\n\t\t\t\telse if (HoneyLevel == 2) return 15814;\n\t\t\t\telse if (HoneyLevel == 3) return 15815;\n\t\t\t\telse if (HoneyLevel == 4) return 15816;\n\t\t\t\telse return 15817;\n\t\t\telse\n\t\t\t\tif (HoneyLevel == 0) return 15818;\n\t\t\t\telse if (HoneyLevel == 1) return 15819;\n\t\t\t\telse if (HoneyLevel == 2) return 15820;\n\t\t\t\telse if (HoneyLevel == 3) return 15821;\n\t\t\t\telse if (HoneyLevel == 4) return 15822;\n\t\t\t\telse return 15823;\n\t\t}\n\t\tBlockState Beehive();\n\t\teBlockFace Facing(BlockState Block);\n\t\tunsigned char HoneyLevel(BlockState Block);\n\t}\n\tnamespace Beetroots\n\t{\n\t\tconstexpr BlockState Beetroots(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 9219;\n\t\t\telse if (Age == 1) return 9220;\n\t\t\telse if (Age == 2) return 9221;\n\t\t\telse return 9222;\n\t\t}\n\t\tBlockState Beetroots();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace Bell\n\t{\n\t\tenum class Attachment\n\t\t{\n\t\t\tFloor,\n\t\t\tCeiling,\n\t\t\tSingleWall,\n\t\t\tDoubleWall\n\t\t};\n\t\tconstexpr BlockState Bell(const enum Attachment Attachment, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Attachment == Attachment::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 14854;\n\t\t\t\t\telse return 14855;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 14856;\n\t\t\t\t\telse return 14857;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 14858;\n\t\t\t\t\telse return 14859;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 14860;\n\t\t\t\t\telse return 14861;\n\t\t\telse if (Attachment == Attachment::Ceiling)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 14862;\n\t\t\t\t\telse return 14863;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 14864;\n\t\t\t\t\telse return 14865;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 14866;\n\t\t\t\t\telse return 14867;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 14868;\n\t\t\t\t\telse return 14869;\n\t\t\telse if (Attachment == Attachment::SingleWall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 14870;\n\t\t\t\t\telse return 14871;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 14872;\n\t\t\t\t\telse return 14873;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 14874;\n\t\t\t\t\telse return 14875;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 14876;\n\t\t\t\t\telse return 14877;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 14878;\n\t\t\t\t\telse return 14879;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 14880;\n\t\t\t\t\telse return 14881;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 14882;\n\t\t\t\t\telse return 14883;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 14884;\n\t\t\t\t\telse return 14885;\n\t\t}\n\t\tBlockState Bell();\n\t\tenum Attachment Attachment(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace BirchButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState BirchButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6394;\n\t\t\t\t\telse return 6395;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6396;\n\t\t\t\t\telse return 6397;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6398;\n\t\t\t\t\telse return 6399;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6400;\n\t\t\t\t\telse return 6401;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6402;\n\t\t\t\t\telse return 6403;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6404;\n\t\t\t\t\telse return 6405;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6406;\n\t\t\t\t\telse return 6407;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6408;\n\t\t\t\t\telse return 6409;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6410;\n\t\t\t\t\telse return 6411;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6412;\n\t\t\t\t\telse return 6413;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6414;\n\t\t\t\t\telse return 6415;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6416;\n\t\t\t\t\telse return 6417;\n\t\t}\n\t\tBlockState BirchButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace BirchDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState BirchDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8802;\n\t\t\t\t\t\t\telse return 8803;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8804;\n\t\t\t\t\t\t\telse return 8805;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8806;\n\t\t\t\t\t\t\telse return 8807;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8808;\n\t\t\t\t\t\t\telse return 8809;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8810;\n\t\t\t\t\t\t\telse return 8811;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8812;\n\t\t\t\t\t\t\telse return 8813;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8814;\n\t\t\t\t\t\t\telse return 8815;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8816;\n\t\t\t\t\t\t\telse return 8817;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8818;\n\t\t\t\t\t\t\telse return 8819;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8820;\n\t\t\t\t\t\t\telse return 8821;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8822;\n\t\t\t\t\t\t\telse return 8823;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8824;\n\t\t\t\t\t\t\telse return 8825;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8826;\n\t\t\t\t\t\t\telse return 8827;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8828;\n\t\t\t\t\t\t\telse return 8829;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8830;\n\t\t\t\t\t\t\telse return 8831;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8832;\n\t\t\t\t\t\t\telse return 8833;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8834;\n\t\t\t\t\t\t\telse return 8835;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8836;\n\t\t\t\t\t\t\telse return 8837;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8838;\n\t\t\t\t\t\t\telse return 8839;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8840;\n\t\t\t\t\t\t\telse return 8841;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8842;\n\t\t\t\t\t\t\telse return 8843;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8844;\n\t\t\t\t\t\t\telse return 8845;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8846;\n\t\t\t\t\t\t\telse return 8847;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8848;\n\t\t\t\t\t\t\telse return 8849;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8850;\n\t\t\t\t\t\t\telse return 8851;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8852;\n\t\t\t\t\t\t\telse return 8853;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8854;\n\t\t\t\t\t\t\telse return 8855;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8856;\n\t\t\t\t\t\t\telse return 8857;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8858;\n\t\t\t\t\t\t\telse return 8859;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8860;\n\t\t\t\t\t\t\telse return 8861;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8862;\n\t\t\t\t\t\t\telse return 8863;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8864;\n\t\t\t\t\t\t\telse return 8865;\n\t\t}\n\t\tBlockState BirchDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace BirchFence\n\t{\n\t\tconstexpr BlockState BirchFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8612;\n\t\t\t\t\t\telse return 8613;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8616;\n\t\t\t\t\t\telse return 8617;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8620;\n\t\t\t\t\t\telse return 8621;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8624;\n\t\t\t\t\t\telse return 8625;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8628;\n\t\t\t\t\t\telse return 8629;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8632;\n\t\t\t\t\t\telse return 8633;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8636;\n\t\t\t\t\t\telse return 8637;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8640;\n\t\t\t\t\t\telse return 8641;\n\t\t}\n\t\tBlockState BirchFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace BirchFenceGate\n\t{\n\t\tconstexpr BlockState BirchFenceGate(const eBlockFace Facing, const bool InWall, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8450;\n\t\t\t\t\t\telse return 8451;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8452;\n\t\t\t\t\t\telse return 8453;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8454;\n\t\t\t\t\t\telse return 8455;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8456;\n\t\t\t\t\t\telse return 8457;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8458;\n\t\t\t\t\t\telse return 8459;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8460;\n\t\t\t\t\t\telse return 8461;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8462;\n\t\t\t\t\t\telse return 8463;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8464;\n\t\t\t\t\t\telse return 8465;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8466;\n\t\t\t\t\t\telse return 8467;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8468;\n\t\t\t\t\t\telse return 8469;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8470;\n\t\t\t\t\t\telse return 8471;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8472;\n\t\t\t\t\t\telse return 8473;\n\t\t\telse\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8474;\n\t\t\t\t\t\telse return 8475;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8476;\n\t\t\t\t\t\telse return 8477;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8478;\n\t\t\t\t\t\telse return 8479;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8480;\n\t\t\t\t\t\telse return 8481;\n\t\t}\n\t\tBlockState BirchFenceGate();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool InWall(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace BirchLeaves\n\t{\n\t\tconstexpr BlockState BirchLeaves(const unsigned char Distance, const bool Persistent)\n\t\t{\n\t\t\tif (Distance == 1)\n\t\t\t\tif (Persistent) return 173;\n\t\t\t\telse return 174;\n\t\t\telse if (Distance == 2)\n\t\t\t\tif (Persistent) return 175;\n\t\t\t\telse return 176;\n\t\t\telse if (Distance == 3)\n\t\t\t\tif (Persistent) return 177;\n\t\t\t\telse return 178;\n\t\t\telse if (Distance == 4)\n\t\t\t\tif (Persistent) return 179;\n\t\t\t\telse return 180;\n\t\t\telse if (Distance == 5)\n\t\t\t\tif (Persistent) return 181;\n\t\t\t\telse return 182;\n\t\t\telse if (Distance == 6)\n\t\t\t\tif (Persistent) return 183;\n\t\t\t\telse return 184;\n\t\t\telse\n\t\t\t\tif (Persistent) return 185;\n\t\t\t\telse return 186;\n\t\t}\n\t\tBlockState BirchLeaves();\n\t\tunsigned char Distance(BlockState Block);\n\t\tbool Persistent(BlockState Block);\n\t}\n\tnamespace BirchLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState BirchLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 79;\n\t\t\telse if (Axis == Axis::Y) return 80;\n\t\t\telse return 81;\n\t\t}\n\t\tBlockState BirchLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace BirchPlanks\n\t{\n\t\tconstexpr BlockState BirchPlanks()\n\t\t{\n\t\t\treturn 17;\n\t\t}\n\t}\n\tnamespace BirchPressurePlate\n\t{\n\t\tconstexpr BlockState BirchPressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 3877;\n\t\t\telse return 3878;\n\t\t}\n\t\tBlockState BirchPressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace BirchSapling\n\t{\n\t\tconstexpr BlockState BirchSapling(const unsigned char Stage)\n\t\t{\n\t\t\tif (Stage == 0) return 25;\n\t\t\telse return 26;\n\t\t}\n\t\tBlockState BirchSapling();\n\t\tunsigned char Stage(BlockState Block);\n\t}\n\tnamespace BirchSign\n\t{\n\t\tconstexpr BlockState BirchSign(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 3446;\n\t\t\telse if (Rotation == 1) return 3448;\n\t\t\telse if (Rotation == 2) return 3450;\n\t\t\telse if (Rotation == 3) return 3452;\n\t\t\telse if (Rotation == 4) return 3454;\n\t\t\telse if (Rotation == 5) return 3456;\n\t\t\telse if (Rotation == 6) return 3458;\n\t\t\telse if (Rotation == 7) return 3460;\n\t\t\telse if (Rotation == 8) return 3462;\n\t\t\telse if (Rotation == 9) return 3464;\n\t\t\telse if (Rotation == 10) return 3466;\n\t\t\telse if (Rotation == 11) return 3468;\n\t\t\telse if (Rotation == 12) return 3470;\n\t\t\telse if (Rotation == 13) return 3472;\n\t\t\telse if (Rotation == 14) return 3474;\n\t\t\telse return 3476;\n\t\t}\n\t\tBlockState BirchSign();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace BirchSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState BirchSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8313;\n\t\t\telse if (Type == Type::Bottom) return 8315;\n\t\t\telse return 8317;\n\t\t}\n\t\tBlockState BirchSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace BirchStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState BirchStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5485;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5487;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5489;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5491;\n\t\t\t\t\telse return 5493;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5495;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5497;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5499;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5501;\n\t\t\t\t\telse return 5503;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5505;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5507;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5509;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5511;\n\t\t\t\t\telse return 5513;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5515;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5517;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5519;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5521;\n\t\t\t\t\telse return 5523;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5525;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5527;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5529;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5531;\n\t\t\t\t\telse return 5533;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5535;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5537;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5539;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5541;\n\t\t\t\t\telse return 5543;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5545;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5547;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5549;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5551;\n\t\t\t\t\telse return 5553;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5555;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5557;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5559;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5561;\n\t\t\t\t\telse return 5563;\n\t\t}\n\t\tBlockState BirchStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace BirchTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState BirchTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4240;\n\t\t\t\t\t\telse return 4242;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4244;\n\t\t\t\t\t\telse return 4246;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4248;\n\t\t\t\t\t\telse return 4250;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4252;\n\t\t\t\t\t\telse return 4254;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4256;\n\t\t\t\t\t\telse return 4258;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4260;\n\t\t\t\t\t\telse return 4262;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4264;\n\t\t\t\t\t\telse return 4266;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4268;\n\t\t\t\t\t\telse return 4270;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4272;\n\t\t\t\t\t\telse return 4274;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4276;\n\t\t\t\t\t\telse return 4278;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4280;\n\t\t\t\t\t\telse return 4282;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4284;\n\t\t\t\t\t\telse return 4286;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4288;\n\t\t\t\t\t\telse return 4290;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4292;\n\t\t\t\t\t\telse return 4294;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4296;\n\t\t\t\t\t\telse return 4298;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4300;\n\t\t\t\t\t\telse return 4302;\n\t\t}\n\t\tBlockState BirchTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace BirchWallSign\n\t{\n\t\tconstexpr BlockState BirchWallSign(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 3752;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 3754;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 3756;\n\t\t\telse return 3758;\n\t\t}\n\t\tBlockState BirchWallSign();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BirchWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState BirchWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 115;\n\t\t\telse if (Axis == Axis::Y) return 116;\n\t\t\telse return 117;\n\t\t}\n\t\tBlockState BirchWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace BlackBanner\n\t{\n\t\tconstexpr BlockState BlackBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8137;\n\t\t\telse if (Rotation == 1) return 8138;\n\t\t\telse if (Rotation == 2) return 8139;\n\t\t\telse if (Rotation == 3) return 8140;\n\t\t\telse if (Rotation == 4) return 8141;\n\t\t\telse if (Rotation == 5) return 8142;\n\t\t\telse if (Rotation == 6) return 8143;\n\t\t\telse if (Rotation == 7) return 8144;\n\t\t\telse if (Rotation == 8) return 8145;\n\t\t\telse if (Rotation == 9) return 8146;\n\t\t\telse if (Rotation == 10) return 8147;\n\t\t\telse if (Rotation == 11) return 8148;\n\t\t\telse if (Rotation == 12) return 8149;\n\t\t\telse if (Rotation == 13) return 8150;\n\t\t\telse if (Rotation == 14) return 8151;\n\t\t\telse return 8152;\n\t\t}\n\t\tBlockState BlackBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace BlackBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState BlackBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1289;\n\t\t\t\t\telse return 1290;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1291;\n\t\t\t\t\telse return 1292;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1293;\n\t\t\t\t\telse return 1294;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1295;\n\t\t\t\t\telse return 1296;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1297;\n\t\t\t\t\telse return 1298;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1299;\n\t\t\t\t\telse return 1300;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1301;\n\t\t\t\t\telse return 1302;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1303;\n\t\t\t\t\telse return 1304;\n\t\t}\n\t\tBlockState BlackBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace BlackCarpet\n\t{\n\t\tconstexpr BlockState BlackCarpet()\n\t\t{\n\t\t\treturn 7881;\n\t\t}\n\t}\n\tnamespace BlackConcrete\n\t{\n\t\tconstexpr BlockState BlackConcrete()\n\t\t{\n\t\t\treturn 9453;\n\t\t}\n\t}\n\tnamespace BlackConcretePowder\n\t{\n\t\tconstexpr BlockState BlackConcretePowder()\n\t\t{\n\t\t\treturn 9469;\n\t\t}\n\t}\n\tnamespace BlackGlazedTerracotta\n\t{\n\t\tconstexpr BlockState BlackGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9434;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9435;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9436;\n\t\t\telse return 9437;\n\t\t}\n\t\tBlockState BlackGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BlackShulkerBox\n\t{\n\t\tconstexpr BlockState BlackShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9368;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9369;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9370;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9371;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9372;\n\t\t\telse return 9373;\n\t\t}\n\t\tBlockState BlackShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BlackStainedGlass\n\t{\n\t\tconstexpr BlockState BlackStainedGlass()\n\t\t{\n\t\t\treturn 4110;\n\t\t}\n\t}\n\tnamespace BlackStainedGlassPane\n\t{\n\t\tconstexpr BlockState BlackStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7345;\n\t\t\t\t\t\telse return 7346;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7349;\n\t\t\t\t\t\telse return 7350;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7353;\n\t\t\t\t\t\telse return 7354;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7357;\n\t\t\t\t\t\telse return 7358;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7361;\n\t\t\t\t\t\telse return 7362;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7365;\n\t\t\t\t\t\telse return 7366;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7369;\n\t\t\t\t\t\telse return 7370;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7373;\n\t\t\t\t\t\telse return 7374;\n\t\t}\n\t\tBlockState BlackStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace BlackTerracotta\n\t{\n\t\tconstexpr BlockState BlackTerracotta()\n\t\t{\n\t\t\treturn 6862;\n\t\t}\n\t}\n\tnamespace BlackWallBanner\n\t{\n\t\tconstexpr BlockState BlackWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8213;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8214;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8215;\n\t\t\telse return 8216;\n\t\t}\n\t\tBlockState BlackWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BlackWool\n\t{\n\t\tconstexpr BlockState BlackWool()\n\t\t{\n\t\t\treturn 1399;\n\t\t}\n\t}\n\tnamespace Blackstone\n\t{\n\t\tconstexpr BlockState Blackstone()\n\t\t{\n\t\t\treturn 15839;\n\t\t}\n\t}\n\tnamespace BlackstoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState BlackstoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 16245;\n\t\t\telse if (Type == Type::Bottom) return 16247;\n\t\t\telse return 16249;\n\t\t}\n\t\tBlockState BlackstoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace BlackstoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState BlackstoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15841;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15843;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15845;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15847;\n\t\t\t\t\telse return 15849;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15851;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15853;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15855;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15857;\n\t\t\t\t\telse return 15859;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15861;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15863;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15865;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15867;\n\t\t\t\t\telse return 15869;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15871;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15873;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15875;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15877;\n\t\t\t\t\telse return 15879;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15881;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15883;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15885;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15887;\n\t\t\t\t\telse return 15889;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15891;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15893;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15895;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15897;\n\t\t\t\t\telse return 15899;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15901;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15903;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15905;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15907;\n\t\t\t\t\telse return 15909;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15911;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15913;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15915;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15917;\n\t\t\t\t\telse return 15919;\n\t\t}\n\t\tBlockState BlackstoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace BlackstoneWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState BlackstoneWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 15923;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15924;\n\t\t\t\t\t\t\telse return 15925;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 15929;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15930;\n\t\t\t\t\t\t\telse return 15931;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 15935;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15936;\n\t\t\t\t\t\t\telse return 15937;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 15941;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15942;\n\t\t\t\t\t\t\telse return 15943;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 15947;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15948;\n\t\t\t\t\t\t\telse return 15949;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 15953;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15954;\n\t\t\t\t\t\t\telse return 15955;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 15959;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15960;\n\t\t\t\t\t\t\telse return 15961;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 15965;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15966;\n\t\t\t\t\t\t\telse return 15967;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 15971;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15972;\n\t\t\t\t\t\t\telse return 15973;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 15977;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15978;\n\t\t\t\t\t\t\telse return 15979;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 15983;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15984;\n\t\t\t\t\t\t\telse return 15985;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 15989;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15990;\n\t\t\t\t\t\t\telse return 15991;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 15995;\n\t\t\t\t\t\t\telse if (West == West::Low) return 15996;\n\t\t\t\t\t\t\telse return 15997;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16001;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16002;\n\t\t\t\t\t\t\telse return 16003;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16007;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16008;\n\t\t\t\t\t\t\telse return 16009;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16013;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16014;\n\t\t\t\t\t\t\telse return 16015;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16019;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16020;\n\t\t\t\t\t\t\telse return 16021;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16025;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16026;\n\t\t\t\t\t\t\telse return 16027;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16031;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16032;\n\t\t\t\t\t\t\telse return 16033;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16037;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16038;\n\t\t\t\t\t\t\telse return 16039;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16043;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16044;\n\t\t\t\t\t\t\telse return 16045;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16049;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16050;\n\t\t\t\t\t\t\telse return 16051;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16055;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16056;\n\t\t\t\t\t\t\telse return 16057;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16061;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16062;\n\t\t\t\t\t\t\telse return 16063;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16067;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16068;\n\t\t\t\t\t\t\telse return 16069;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16073;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16074;\n\t\t\t\t\t\t\telse return 16075;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16079;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16080;\n\t\t\t\t\t\t\telse return 16081;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16085;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16086;\n\t\t\t\t\t\t\telse return 16087;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16091;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16092;\n\t\t\t\t\t\t\telse return 16093;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16097;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16098;\n\t\t\t\t\t\t\telse return 16099;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16103;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16104;\n\t\t\t\t\t\t\telse return 16105;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16109;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16110;\n\t\t\t\t\t\t\telse return 16111;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16115;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16116;\n\t\t\t\t\t\t\telse return 16117;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16121;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16122;\n\t\t\t\t\t\t\telse return 16123;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16127;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16128;\n\t\t\t\t\t\t\telse return 16129;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16133;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16134;\n\t\t\t\t\t\t\telse return 16135;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16139;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16140;\n\t\t\t\t\t\t\telse return 16141;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16145;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16146;\n\t\t\t\t\t\t\telse return 16147;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16151;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16152;\n\t\t\t\t\t\t\telse return 16153;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16157;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16158;\n\t\t\t\t\t\t\telse return 16159;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16163;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16164;\n\t\t\t\t\t\t\telse return 16165;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16169;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16170;\n\t\t\t\t\t\t\telse return 16171;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16175;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16176;\n\t\t\t\t\t\t\telse return 16177;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16181;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16182;\n\t\t\t\t\t\t\telse return 16183;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16187;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16188;\n\t\t\t\t\t\t\telse return 16189;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16193;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16194;\n\t\t\t\t\t\t\telse return 16195;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16199;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16200;\n\t\t\t\t\t\t\telse return 16201;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16205;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16206;\n\t\t\t\t\t\t\telse return 16207;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16211;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16212;\n\t\t\t\t\t\t\telse return 16213;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16217;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16218;\n\t\t\t\t\t\t\telse return 16219;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16223;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16224;\n\t\t\t\t\t\t\telse return 16225;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16229;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16230;\n\t\t\t\t\t\t\telse return 16231;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16235;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16236;\n\t\t\t\t\t\t\telse return 16237;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16241;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16242;\n\t\t\t\t\t\t\telse return 16243;\n\t\t}\n\t\tBlockState BlackstoneWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace BlastFurnace\n\t{\n\t\tconstexpr BlockState BlastFurnace(const eBlockFace Facing, const bool Lit)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Lit) return 14811;\n\t\t\t\telse return 14812;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Lit) return 14813;\n\t\t\t\telse return 14814;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Lit) return 14815;\n\t\t\t\telse return 14816;\n\t\t\telse\n\t\t\t\tif (Lit) return 14817;\n\t\t\t\telse return 14818;\n\t\t}\n\t\tBlockState BlastFurnace();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Lit(BlockState Block);\n\t}\n\tnamespace BlueBanner\n\t{\n\t\tconstexpr BlockState BlueBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8073;\n\t\t\telse if (Rotation == 1) return 8074;\n\t\t\telse if (Rotation == 2) return 8075;\n\t\t\telse if (Rotation == 3) return 8076;\n\t\t\telse if (Rotation == 4) return 8077;\n\t\t\telse if (Rotation == 5) return 8078;\n\t\t\telse if (Rotation == 6) return 8079;\n\t\t\telse if (Rotation == 7) return 8080;\n\t\t\telse if (Rotation == 8) return 8081;\n\t\t\telse if (Rotation == 9) return 8082;\n\t\t\telse if (Rotation == 10) return 8083;\n\t\t\telse if (Rotation == 11) return 8084;\n\t\t\telse if (Rotation == 12) return 8085;\n\t\t\telse if (Rotation == 13) return 8086;\n\t\t\telse if (Rotation == 14) return 8087;\n\t\t\telse return 8088;\n\t\t}\n\t\tBlockState BlueBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace BlueBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState BlueBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1225;\n\t\t\t\t\telse return 1226;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1227;\n\t\t\t\t\telse return 1228;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1229;\n\t\t\t\t\telse return 1230;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1231;\n\t\t\t\t\telse return 1232;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1233;\n\t\t\t\t\telse return 1234;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1235;\n\t\t\t\t\telse return 1236;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1237;\n\t\t\t\t\telse return 1238;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1239;\n\t\t\t\t\telse return 1240;\n\t\t}\n\t\tBlockState BlueBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace BlueCarpet\n\t{\n\t\tconstexpr BlockState BlueCarpet()\n\t\t{\n\t\t\treturn 7877;\n\t\t}\n\t}\n\tnamespace BlueConcrete\n\t{\n\t\tconstexpr BlockState BlueConcrete()\n\t\t{\n\t\t\treturn 9449;\n\t\t}\n\t}\n\tnamespace BlueConcretePowder\n\t{\n\t\tconstexpr BlockState BlueConcretePowder()\n\t\t{\n\t\t\treturn 9465;\n\t\t}\n\t}\n\tnamespace BlueGlazedTerracotta\n\t{\n\t\tconstexpr BlockState BlueGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9418;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9419;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9420;\n\t\t\telse return 9421;\n\t\t}\n\t\tBlockState BlueGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BlueIce\n\t{\n\t\tconstexpr BlockState BlueIce()\n\t\t{\n\t\t\treturn 9648;\n\t\t}\n\t}\n\tnamespace BlueOrchid\n\t{\n\t\tconstexpr BlockState BlueOrchid()\n\t\t{\n\t\t\treturn 1414;\n\t\t}\n\t}\n\tnamespace BlueShulkerBox\n\t{\n\t\tconstexpr BlockState BlueShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9344;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9345;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9346;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9347;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9348;\n\t\t\telse return 9349;\n\t\t}\n\t\tBlockState BlueShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BlueStainedGlass\n\t{\n\t\tconstexpr BlockState BlueStainedGlass()\n\t\t{\n\t\t\treturn 4106;\n\t\t}\n\t}\n\tnamespace BlueStainedGlassPane\n\t{\n\t\tconstexpr BlockState BlueStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7217;\n\t\t\t\t\t\telse return 7218;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7221;\n\t\t\t\t\t\telse return 7222;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7225;\n\t\t\t\t\t\telse return 7226;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7229;\n\t\t\t\t\t\telse return 7230;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7233;\n\t\t\t\t\t\telse return 7234;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7237;\n\t\t\t\t\t\telse return 7238;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7241;\n\t\t\t\t\t\telse return 7242;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7245;\n\t\t\t\t\t\telse return 7246;\n\t\t}\n\t\tBlockState BlueStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace BlueTerracotta\n\t{\n\t\tconstexpr BlockState BlueTerracotta()\n\t\t{\n\t\t\treturn 6858;\n\t\t}\n\t}\n\tnamespace BlueWallBanner\n\t{\n\t\tconstexpr BlockState BlueWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8197;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8198;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8199;\n\t\t\telse return 8200;\n\t\t}\n\t\tBlockState BlueWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BlueWool\n\t{\n\t\tconstexpr BlockState BlueWool()\n\t\t{\n\t\t\treturn 1395;\n\t\t}\n\t}\n\tnamespace BoneBlock\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState BoneBlock(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 9256;\n\t\t\telse if (Axis == Axis::Y) return 9257;\n\t\t\telse return 9258;\n\t\t}\n\t\tBlockState BoneBlock();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace Bookshelf\n\t{\n\t\tconstexpr BlockState Bookshelf()\n\t\t{\n\t\t\treturn 1432;\n\t\t}\n\t}\n\tnamespace BrainCoral\n\t{\n\t\tconstexpr BlockState BrainCoral()\n\t\t{\n\t\t\treturn 9533;\n\t\t}\n\t}\n\tnamespace BrainCoralBlock\n\t{\n\t\tconstexpr BlockState BrainCoralBlock()\n\t\t{\n\t\t\treturn 9516;\n\t\t}\n\t}\n\tnamespace BrainCoralFan\n\t{\n\t\tconstexpr BlockState BrainCoralFan()\n\t\t{\n\t\t\treturn 9553;\n\t\t}\n\t}\n\tnamespace BrainCoralWallFan\n\t{\n\t\tconstexpr BlockState BrainCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9609;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9611;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9613;\n\t\t\telse return 9615;\n\t\t}\n\t\tBlockState BrainCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BrewingStand\n\t{\n\t\tconstexpr BlockState BrewingStand(const bool HasBottle_0, const bool HasBottle_1, const bool HasBottle_2)\n\t\t{\n\t\t\tif (HasBottle_0)\n\t\t\t\tif (HasBottle_1)\n\t\t\t\t\tif (HasBottle_2) return 5133;\n\t\t\t\t\telse return 5134;\n\t\t\t\telse\n\t\t\t\t\tif (HasBottle_2) return 5135;\n\t\t\t\t\telse return 5136;\n\t\t\telse\n\t\t\t\tif (HasBottle_1)\n\t\t\t\t\tif (HasBottle_2) return 5137;\n\t\t\t\t\telse return 5138;\n\t\t\t\telse\n\t\t\t\t\tif (HasBottle_2) return 5139;\n\t\t\t\t\telse return 5140;\n\t\t}\n\t\tBlockState BrewingStand();\n\t\tbool HasBottle_0(BlockState Block);\n\t\tbool HasBottle_1(BlockState Block);\n\t\tbool HasBottle_2(BlockState Block);\n\t}\n\tnamespace BrickSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState BrickSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8373;\n\t\t\telse if (Type == Type::Bottom) return 8375;\n\t\t\telse return 8377;\n\t\t}\n\t\tBlockState BrickSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace BrickStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState BrickStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 4853;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4855;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4857;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4859;\n\t\t\t\t\telse return 4861;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 4863;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4865;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4867;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4869;\n\t\t\t\t\telse return 4871;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 4873;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4875;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4877;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4879;\n\t\t\t\t\telse return 4881;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 4883;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4885;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4887;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4889;\n\t\t\t\t\telse return 4891;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 4893;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4895;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4897;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4899;\n\t\t\t\t\telse return 4901;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 4903;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4905;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4907;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4909;\n\t\t\t\t\telse return 4911;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 4913;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4915;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4917;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4919;\n\t\t\t\t\telse return 4921;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 4923;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4925;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4927;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4929;\n\t\t\t\t\telse return 4931;\n\t\t}\n\t\tBlockState BrickStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace BrickWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState BrickWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10870;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10871;\n\t\t\t\t\t\t\telse return 10872;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10876;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10877;\n\t\t\t\t\t\t\telse return 10878;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10882;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10883;\n\t\t\t\t\t\t\telse return 10884;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10888;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10889;\n\t\t\t\t\t\t\telse return 10890;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10894;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10895;\n\t\t\t\t\t\t\telse return 10896;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10900;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10901;\n\t\t\t\t\t\t\telse return 10902;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10906;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10907;\n\t\t\t\t\t\t\telse return 10908;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10912;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10913;\n\t\t\t\t\t\t\telse return 10914;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10918;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10919;\n\t\t\t\t\t\t\telse return 10920;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10924;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10925;\n\t\t\t\t\t\t\telse return 10926;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10930;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10931;\n\t\t\t\t\t\t\telse return 10932;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10936;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10937;\n\t\t\t\t\t\t\telse return 10938;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10942;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10943;\n\t\t\t\t\t\t\telse return 10944;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10948;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10949;\n\t\t\t\t\t\t\telse return 10950;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10954;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10955;\n\t\t\t\t\t\t\telse return 10956;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10960;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10961;\n\t\t\t\t\t\t\telse return 10962;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10966;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10967;\n\t\t\t\t\t\t\telse return 10968;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10972;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10973;\n\t\t\t\t\t\t\telse return 10974;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10978;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10979;\n\t\t\t\t\t\t\telse return 10980;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10984;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10985;\n\t\t\t\t\t\t\telse return 10986;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 10990;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10991;\n\t\t\t\t\t\t\telse return 10992;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 10996;\n\t\t\t\t\t\t\telse if (West == West::Low) return 10997;\n\t\t\t\t\t\t\telse return 10998;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11002;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11003;\n\t\t\t\t\t\t\telse return 11004;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11008;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11009;\n\t\t\t\t\t\t\telse return 11010;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11014;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11015;\n\t\t\t\t\t\t\telse return 11016;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11020;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11021;\n\t\t\t\t\t\t\telse return 11022;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11026;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11027;\n\t\t\t\t\t\t\telse return 11028;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11032;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11033;\n\t\t\t\t\t\t\telse return 11034;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11038;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11039;\n\t\t\t\t\t\t\telse return 11040;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11044;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11045;\n\t\t\t\t\t\t\telse return 11046;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11050;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11051;\n\t\t\t\t\t\t\telse return 11052;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11056;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11057;\n\t\t\t\t\t\t\telse return 11058;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11062;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11063;\n\t\t\t\t\t\t\telse return 11064;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11068;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11069;\n\t\t\t\t\t\t\telse return 11070;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11074;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11075;\n\t\t\t\t\t\t\telse return 11076;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11080;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11081;\n\t\t\t\t\t\t\telse return 11082;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11086;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11087;\n\t\t\t\t\t\t\telse return 11088;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11092;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11093;\n\t\t\t\t\t\t\telse return 11094;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11098;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11099;\n\t\t\t\t\t\t\telse return 11100;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11104;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11105;\n\t\t\t\t\t\t\telse return 11106;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11110;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11111;\n\t\t\t\t\t\t\telse return 11112;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11116;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11117;\n\t\t\t\t\t\t\telse return 11118;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11122;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11123;\n\t\t\t\t\t\t\telse return 11124;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11128;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11129;\n\t\t\t\t\t\t\telse return 11130;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11134;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11135;\n\t\t\t\t\t\t\telse return 11136;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11140;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11141;\n\t\t\t\t\t\t\telse return 11142;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11146;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11147;\n\t\t\t\t\t\t\telse return 11148;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11152;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11153;\n\t\t\t\t\t\t\telse return 11154;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11158;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11159;\n\t\t\t\t\t\t\telse return 11160;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11164;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11165;\n\t\t\t\t\t\t\telse return 11166;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11170;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11171;\n\t\t\t\t\t\t\telse return 11172;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11176;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11177;\n\t\t\t\t\t\t\telse return 11178;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11182;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11183;\n\t\t\t\t\t\t\telse return 11184;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11188;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11189;\n\t\t\t\t\t\t\telse return 11190;\n\t\t}\n\t\tBlockState BrickWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace Bricks\n\t{\n\t\tconstexpr BlockState Bricks()\n\t\t{\n\t\t\treturn 1429;\n\t\t}\n\t}\n\tnamespace BrownBanner\n\t{\n\t\tconstexpr BlockState BrownBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8089;\n\t\t\telse if (Rotation == 1) return 8090;\n\t\t\telse if (Rotation == 2) return 8091;\n\t\t\telse if (Rotation == 3) return 8092;\n\t\t\telse if (Rotation == 4) return 8093;\n\t\t\telse if (Rotation == 5) return 8094;\n\t\t\telse if (Rotation == 6) return 8095;\n\t\t\telse if (Rotation == 7) return 8096;\n\t\t\telse if (Rotation == 8) return 8097;\n\t\t\telse if (Rotation == 9) return 8098;\n\t\t\telse if (Rotation == 10) return 8099;\n\t\t\telse if (Rotation == 11) return 8100;\n\t\t\telse if (Rotation == 12) return 8101;\n\t\t\telse if (Rotation == 13) return 8102;\n\t\t\telse if (Rotation == 14) return 8103;\n\t\t\telse return 8104;\n\t\t}\n\t\tBlockState BrownBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace BrownBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState BrownBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1241;\n\t\t\t\t\telse return 1242;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1243;\n\t\t\t\t\telse return 1244;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1245;\n\t\t\t\t\telse return 1246;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1247;\n\t\t\t\t\telse return 1248;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1249;\n\t\t\t\t\telse return 1250;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1251;\n\t\t\t\t\telse return 1252;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1253;\n\t\t\t\t\telse return 1254;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1255;\n\t\t\t\t\telse return 1256;\n\t\t}\n\t\tBlockState BrownBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace BrownCarpet\n\t{\n\t\tconstexpr BlockState BrownCarpet()\n\t\t{\n\t\t\treturn 7878;\n\t\t}\n\t}\n\tnamespace BrownConcrete\n\t{\n\t\tconstexpr BlockState BrownConcrete()\n\t\t{\n\t\t\treturn 9450;\n\t\t}\n\t}\n\tnamespace BrownConcretePowder\n\t{\n\t\tconstexpr BlockState BrownConcretePowder()\n\t\t{\n\t\t\treturn 9466;\n\t\t}\n\t}\n\tnamespace BrownGlazedTerracotta\n\t{\n\t\tconstexpr BlockState BrownGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9422;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9423;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9424;\n\t\t\telse return 9425;\n\t\t}\n\t\tBlockState BrownGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BrownMushroom\n\t{\n\t\tconstexpr BlockState BrownMushroom()\n\t\t{\n\t\t\treturn 1425;\n\t\t}\n\t}\n\tnamespace BrownMushroomBlock\n\t{\n\t\tconstexpr BlockState BrownMushroomBlock(const bool Down, const bool East, const bool North, const bool South, const bool Up, const bool West)\n\t\t{\n\t\t\tif (Down)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4505;\n\t\t\t\t\t\t\t\telse return 4506;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4507;\n\t\t\t\t\t\t\t\telse return 4508;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4509;\n\t\t\t\t\t\t\t\telse return 4510;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4511;\n\t\t\t\t\t\t\t\telse return 4512;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4513;\n\t\t\t\t\t\t\t\telse return 4514;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4515;\n\t\t\t\t\t\t\t\telse return 4516;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4517;\n\t\t\t\t\t\t\t\telse return 4518;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4519;\n\t\t\t\t\t\t\t\telse return 4520;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4521;\n\t\t\t\t\t\t\t\telse return 4522;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4523;\n\t\t\t\t\t\t\t\telse return 4524;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4525;\n\t\t\t\t\t\t\t\telse return 4526;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4527;\n\t\t\t\t\t\t\t\telse return 4528;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4529;\n\t\t\t\t\t\t\t\telse return 4530;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4531;\n\t\t\t\t\t\t\t\telse return 4532;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4533;\n\t\t\t\t\t\t\t\telse return 4534;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4535;\n\t\t\t\t\t\t\t\telse return 4536;\n\t\t\telse\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4537;\n\t\t\t\t\t\t\t\telse return 4538;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4539;\n\t\t\t\t\t\t\t\telse return 4540;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4541;\n\t\t\t\t\t\t\t\telse return 4542;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4543;\n\t\t\t\t\t\t\t\telse return 4544;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4545;\n\t\t\t\t\t\t\t\telse return 4546;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4547;\n\t\t\t\t\t\t\t\telse return 4548;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4549;\n\t\t\t\t\t\t\t\telse return 4550;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4551;\n\t\t\t\t\t\t\t\telse return 4552;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4553;\n\t\t\t\t\t\t\t\telse return 4554;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4555;\n\t\t\t\t\t\t\t\telse return 4556;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4557;\n\t\t\t\t\t\t\t\telse return 4558;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4559;\n\t\t\t\t\t\t\t\telse return 4560;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4561;\n\t\t\t\t\t\t\t\telse return 4562;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4563;\n\t\t\t\t\t\t\t\telse return 4564;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4565;\n\t\t\t\t\t\t\t\telse return 4566;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4567;\n\t\t\t\t\t\t\t\telse return 4568;\n\t\t}\n\t\tBlockState BrownMushroomBlock();\n\t\tbool Down(BlockState Block);\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace BrownShulkerBox\n\t{\n\t\tconstexpr BlockState BrownShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9350;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9351;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9352;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9353;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9354;\n\t\t\telse return 9355;\n\t\t}\n\t\tBlockState BrownShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BrownStainedGlass\n\t{\n\t\tconstexpr BlockState BrownStainedGlass()\n\t\t{\n\t\t\treturn 4107;\n\t\t}\n\t}\n\tnamespace BrownStainedGlassPane\n\t{\n\t\tconstexpr BlockState BrownStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7249;\n\t\t\t\t\t\telse return 7250;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7253;\n\t\t\t\t\t\telse return 7254;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7257;\n\t\t\t\t\t\telse return 7258;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7261;\n\t\t\t\t\t\telse return 7262;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7265;\n\t\t\t\t\t\telse return 7266;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7269;\n\t\t\t\t\t\telse return 7270;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7273;\n\t\t\t\t\t\telse return 7274;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7277;\n\t\t\t\t\t\telse return 7278;\n\t\t}\n\t\tBlockState BrownStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace BrownTerracotta\n\t{\n\t\tconstexpr BlockState BrownTerracotta()\n\t\t{\n\t\t\treturn 6859;\n\t\t}\n\t}\n\tnamespace BrownWallBanner\n\t{\n\t\tconstexpr BlockState BrownWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8201;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8202;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8203;\n\t\t\telse return 8204;\n\t\t}\n\t\tBlockState BrownWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace BrownWool\n\t{\n\t\tconstexpr BlockState BrownWool()\n\t\t{\n\t\t\treturn 1396;\n\t\t}\n\t}\n\tnamespace BubbleColumn\n\t{\n\t\tconstexpr BlockState BubbleColumn(const bool Drag)\n\t\t{\n\t\t\tif (Drag) return 9667;\n\t\t\telse return 9668;\n\t\t}\n\t\tBlockState BubbleColumn();\n\t\tbool Drag(BlockState Block);\n\t}\n\tnamespace BubbleCoral\n\t{\n\t\tconstexpr BlockState BubbleCoral()\n\t\t{\n\t\t\treturn 9535;\n\t\t}\n\t}\n\tnamespace BubbleCoralBlock\n\t{\n\t\tconstexpr BlockState BubbleCoralBlock()\n\t\t{\n\t\t\treturn 9517;\n\t\t}\n\t}\n\tnamespace BubbleCoralFan\n\t{\n\t\tconstexpr BlockState BubbleCoralFan()\n\t\t{\n\t\t\treturn 9555;\n\t\t}\n\t}\n\tnamespace BubbleCoralWallFan\n\t{\n\t\tconstexpr BlockState BubbleCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9617;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9619;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9621;\n\t\t\telse return 9623;\n\t\t}\n\t\tBlockState BubbleCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Cactus\n\t{\n\t\tconstexpr BlockState Cactus(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 3931;\n\t\t\telse if (Age == 1) return 3932;\n\t\t\telse if (Age == 2) return 3933;\n\t\t\telse if (Age == 3) return 3934;\n\t\t\telse if (Age == 4) return 3935;\n\t\t\telse if (Age == 5) return 3936;\n\t\t\telse if (Age == 6) return 3937;\n\t\t\telse if (Age == 7) return 3938;\n\t\t\telse if (Age == 8) return 3939;\n\t\t\telse if (Age == 9) return 3940;\n\t\t\telse if (Age == 10) return 3941;\n\t\t\telse if (Age == 11) return 3942;\n\t\t\telse if (Age == 12) return 3943;\n\t\t\telse if (Age == 13) return 3944;\n\t\t\telse if (Age == 14) return 3945;\n\t\t\telse return 3946;\n\t\t}\n\t\tBlockState Cactus();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace Cake\n\t{\n\t\tconstexpr BlockState Cake(const unsigned char Bites)\n\t\t{\n\t\t\tif (Bites == 0) return 4024;\n\t\t\telse if (Bites == 1) return 4025;\n\t\t\telse if (Bites == 2) return 4026;\n\t\t\telse if (Bites == 3) return 4027;\n\t\t\telse if (Bites == 4) return 4028;\n\t\t\telse if (Bites == 5) return 4029;\n\t\t\telse return 4030;\n\t\t}\n\t\tBlockState Cake();\n\t\tunsigned char Bites(BlockState Block);\n\t}\n\tnamespace Campfire\n\t{\n\t\tconstexpr BlockState Campfire(const eBlockFace Facing, const bool Lit, const bool SignalFire)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Lit)\n\t\t\t\t\tif (SignalFire) return 14891;\n\t\t\t\t\telse return 14893;\n\t\t\t\telse\n\t\t\t\t\tif (SignalFire) return 14895;\n\t\t\t\t\telse return 14897;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Lit)\n\t\t\t\t\tif (SignalFire) return 14899;\n\t\t\t\t\telse return 14901;\n\t\t\t\telse\n\t\t\t\t\tif (SignalFire) return 14903;\n\t\t\t\t\telse return 14905;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Lit)\n\t\t\t\t\tif (SignalFire) return 14907;\n\t\t\t\t\telse return 14909;\n\t\t\t\telse\n\t\t\t\t\tif (SignalFire) return 14911;\n\t\t\t\t\telse return 14913;\n\t\t\telse\n\t\t\t\tif (Lit)\n\t\t\t\t\tif (SignalFire) return 14915;\n\t\t\t\t\telse return 14917;\n\t\t\t\telse\n\t\t\t\t\tif (SignalFire) return 14919;\n\t\t\t\t\telse return 14921;\n\t\t}\n\t\tBlockState Campfire();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Lit(BlockState Block);\n\t\tbool SignalFire(BlockState Block);\n\t}\n\tnamespace Carrots\n\t{\n\t\tconstexpr BlockState Carrots(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 6330;\n\t\t\telse if (Age == 1) return 6331;\n\t\t\telse if (Age == 2) return 6332;\n\t\t\telse if (Age == 3) return 6333;\n\t\t\telse if (Age == 4) return 6334;\n\t\t\telse if (Age == 5) return 6335;\n\t\t\telse if (Age == 6) return 6336;\n\t\t\telse return 6337;\n\t\t}\n\t\tBlockState Carrots();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace CartographyTable\n\t{\n\t\tconstexpr BlockState CartographyTable()\n\t\t{\n\t\t\treturn 14819;\n\t\t}\n\t}\n\tnamespace CarvedPumpkin\n\t{\n\t\tconstexpr BlockState CarvedPumpkin(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 4016;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 4017;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 4018;\n\t\t\telse return 4019;\n\t\t}\n\t\tBlockState CarvedPumpkin();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Cauldron\n\t{\n\t\tconstexpr BlockState Cauldron(const unsigned char Level)\n\t\t{\n\t\t\tif (Level == 0) return 5141;\n\t\t\telse if (Level == 1) return 5142;\n\t\t\telse if (Level == 2) return 5143;\n\t\t\telse return 5144;\n\t\t}\n\t\tBlockState Cauldron();\n\t\tunsigned char Level(BlockState Block);\n\t}\n\tnamespace CaveAir\n\t{\n\t\tconstexpr BlockState CaveAir()\n\t\t{\n\t\t\treturn 9666;\n\t\t}\n\t}\n\tnamespace Chain\n\t{\n\t\tconstexpr BlockState Chain()\n\t\t{\n\t\t\treturn 4730;\n\t\t}\n\t}\n\tnamespace ChainCommandBlock\n\t{\n\t\tconstexpr BlockState ChainCommandBlock(const bool Conditional, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Conditional)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9237;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9238;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9239;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9240;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9241;\n\t\t\t\telse return 9242;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9243;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9244;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9245;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9246;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9247;\n\t\t\t\telse return 9248;\n\t\t}\n\t\tBlockState ChainCommandBlock();\n\t\tbool Conditional(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Chest\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tSingle,\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState Chest(const eBlockFace Facing, const enum Type Type)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Type == Type::Single) return 2035;\n\t\t\t\telse if (Type == Type::Left) return 2037;\n\t\t\t\telse return 2039;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Type == Type::Single) return 2041;\n\t\t\t\telse if (Type == Type::Left) return 2043;\n\t\t\t\telse return 2045;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Type == Type::Single) return 2047;\n\t\t\t\telse if (Type == Type::Left) return 2049;\n\t\t\t\telse return 2051;\n\t\t\telse\n\t\t\t\tif (Type == Type::Single) return 2053;\n\t\t\t\telse if (Type == Type::Left) return 2055;\n\t\t\t\telse return 2057;\n\t\t}\n\t\tBlockState Chest();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace ChippedAnvil\n\t{\n\t\tconstexpr BlockState ChippedAnvil(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6614;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6615;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6616;\n\t\t\telse return 6617;\n\t\t}\n\t\tBlockState ChippedAnvil();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace ChiseledNetherBricks\n\t{\n\t\tconstexpr BlockState ChiseledNetherBricks()\n\t\t{\n\t\t\treturn 17101;\n\t\t}\n\t}\n\tnamespace ChiseledPolishedBlackstone\n\t{\n\t\tconstexpr BlockState ChiseledPolishedBlackstone()\n\t\t{\n\t\t\treturn 16253;\n\t\t}\n\t}\n\tnamespace ChiseledQuartzBlock\n\t{\n\t\tconstexpr BlockState ChiseledQuartzBlock()\n\t\t{\n\t\t\treturn 6739;\n\t\t}\n\t}\n\tnamespace ChiseledRedSandstone\n\t{\n\t\tconstexpr BlockState ChiseledRedSandstone()\n\t\t{\n\t\t\treturn 8218;\n\t\t}\n\t}\n\tnamespace ChiseledSandstone\n\t{\n\t\tconstexpr BlockState ChiseledSandstone()\n\t\t{\n\t\t\treturn 247;\n\t\t}\n\t}\n\tnamespace ChiseledStoneBricks\n\t{\n\t\tconstexpr BlockState ChiseledStoneBricks()\n\t\t{\n\t\t\treturn 4498;\n\t\t}\n\t}\n\tnamespace ChorusFlower\n\t{\n\t\tconstexpr BlockState ChorusFlower(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 9128;\n\t\t\telse if (Age == 1) return 9129;\n\t\t\telse if (Age == 2) return 9130;\n\t\t\telse if (Age == 3) return 9131;\n\t\t\telse if (Age == 4) return 9132;\n\t\t\telse return 9133;\n\t\t}\n\t\tBlockState ChorusFlower();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace ChorusPlant\n\t{\n\t\tconstexpr BlockState ChorusPlant(const bool Down, const bool East, const bool North, const bool South, const bool Up, const bool West)\n\t\t{\n\t\t\tif (Down)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9064;\n\t\t\t\t\t\t\t\telse return 9065;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9066;\n\t\t\t\t\t\t\t\telse return 9067;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9068;\n\t\t\t\t\t\t\t\telse return 9069;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9070;\n\t\t\t\t\t\t\t\telse return 9071;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9072;\n\t\t\t\t\t\t\t\telse return 9073;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9074;\n\t\t\t\t\t\t\t\telse return 9075;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9076;\n\t\t\t\t\t\t\t\telse return 9077;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9078;\n\t\t\t\t\t\t\t\telse return 9079;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9080;\n\t\t\t\t\t\t\t\telse return 9081;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9082;\n\t\t\t\t\t\t\t\telse return 9083;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9084;\n\t\t\t\t\t\t\t\telse return 9085;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9086;\n\t\t\t\t\t\t\t\telse return 9087;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9088;\n\t\t\t\t\t\t\t\telse return 9089;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9090;\n\t\t\t\t\t\t\t\telse return 9091;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9092;\n\t\t\t\t\t\t\t\telse return 9093;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9094;\n\t\t\t\t\t\t\t\telse return 9095;\n\t\t\telse\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9096;\n\t\t\t\t\t\t\t\telse return 9097;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9098;\n\t\t\t\t\t\t\t\telse return 9099;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9100;\n\t\t\t\t\t\t\t\telse return 9101;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9102;\n\t\t\t\t\t\t\t\telse return 9103;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9104;\n\t\t\t\t\t\t\t\telse return 9105;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9106;\n\t\t\t\t\t\t\t\telse return 9107;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9108;\n\t\t\t\t\t\t\t\telse return 9109;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9110;\n\t\t\t\t\t\t\t\telse return 9111;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9112;\n\t\t\t\t\t\t\t\telse return 9113;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9114;\n\t\t\t\t\t\t\t\telse return 9115;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9116;\n\t\t\t\t\t\t\t\telse return 9117;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9118;\n\t\t\t\t\t\t\t\telse return 9119;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9120;\n\t\t\t\t\t\t\t\telse return 9121;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9122;\n\t\t\t\t\t\t\t\telse return 9123;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 9124;\n\t\t\t\t\t\t\t\telse return 9125;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 9126;\n\t\t\t\t\t\t\t\telse return 9127;\n\t\t}\n\t\tBlockState ChorusPlant();\n\t\tbool Down(BlockState Block);\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace Clay\n\t{\n\t\tconstexpr BlockState Clay()\n\t\t{\n\t\t\treturn 3947;\n\t\t}\n\t}\n\tnamespace CoalBlock\n\t{\n\t\tconstexpr BlockState CoalBlock()\n\t\t{\n\t\t\treturn 7883;\n\t\t}\n\t}\n\tnamespace CoalOre\n\t{\n\t\tconstexpr BlockState CoalOre()\n\t\t{\n\t\t\treturn 71;\n\t\t}\n\t}\n\tnamespace CoarseDirt\n\t{\n\t\tconstexpr BlockState CoarseDirt()\n\t\t{\n\t\t\treturn 11;\n\t\t}\n\t}\n\tnamespace Cobblestone\n\t{\n\t\tconstexpr BlockState Cobblestone()\n\t\t{\n\t\t\treturn 14;\n\t\t}\n\t}\n\tnamespace CobblestoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState CobblestoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8367;\n\t\t\telse if (Type == Type::Bottom) return 8369;\n\t\t\telse return 8371;\n\t\t}\n\t\tBlockState CobblestoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace CobblestoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState CobblestoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 3656;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 3658;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 3660;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 3662;\n\t\t\t\t\telse return 3664;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 3666;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 3668;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 3670;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 3672;\n\t\t\t\t\telse return 3674;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 3676;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 3678;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 3680;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 3682;\n\t\t\t\t\telse return 3684;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 3686;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 3688;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 3690;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 3692;\n\t\t\t\t\telse return 3694;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 3696;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 3698;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 3700;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 3702;\n\t\t\t\t\telse return 3704;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 3706;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 3708;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 3710;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 3712;\n\t\t\t\t\telse return 3714;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 3716;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 3718;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 3720;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 3722;\n\t\t\t\t\telse return 3724;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 3726;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 3728;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 3730;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 3732;\n\t\t\t\t\telse return 3734;\n\t\t}\n\t\tBlockState CobblestoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace CobblestoneWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState CobblestoneWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5660;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5661;\n\t\t\t\t\t\t\telse return 5662;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5666;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5667;\n\t\t\t\t\t\t\telse return 5668;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5672;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5673;\n\t\t\t\t\t\t\telse return 5674;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5678;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5679;\n\t\t\t\t\t\t\telse return 5680;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5684;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5685;\n\t\t\t\t\t\t\telse return 5686;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5690;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5691;\n\t\t\t\t\t\t\telse return 5692;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5696;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5697;\n\t\t\t\t\t\t\telse return 5698;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5702;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5703;\n\t\t\t\t\t\t\telse return 5704;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5708;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5709;\n\t\t\t\t\t\t\telse return 5710;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5714;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5715;\n\t\t\t\t\t\t\telse return 5716;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5720;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5721;\n\t\t\t\t\t\t\telse return 5722;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5726;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5727;\n\t\t\t\t\t\t\telse return 5728;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5732;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5733;\n\t\t\t\t\t\t\telse return 5734;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5738;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5739;\n\t\t\t\t\t\t\telse return 5740;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5744;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5745;\n\t\t\t\t\t\t\telse return 5746;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5750;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5751;\n\t\t\t\t\t\t\telse return 5752;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5756;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5757;\n\t\t\t\t\t\t\telse return 5758;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5762;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5763;\n\t\t\t\t\t\t\telse return 5764;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5768;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5769;\n\t\t\t\t\t\t\telse return 5770;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5774;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5775;\n\t\t\t\t\t\t\telse return 5776;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5780;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5781;\n\t\t\t\t\t\t\telse return 5782;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5786;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5787;\n\t\t\t\t\t\t\telse return 5788;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5792;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5793;\n\t\t\t\t\t\t\telse return 5794;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5798;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5799;\n\t\t\t\t\t\t\telse return 5800;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5804;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5805;\n\t\t\t\t\t\t\telse return 5806;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5810;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5811;\n\t\t\t\t\t\t\telse return 5812;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5816;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5817;\n\t\t\t\t\t\t\telse return 5818;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5822;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5823;\n\t\t\t\t\t\t\telse return 5824;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5828;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5829;\n\t\t\t\t\t\t\telse return 5830;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5834;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5835;\n\t\t\t\t\t\t\telse return 5836;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5840;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5841;\n\t\t\t\t\t\t\telse return 5842;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5846;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5847;\n\t\t\t\t\t\t\telse return 5848;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5852;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5853;\n\t\t\t\t\t\t\telse return 5854;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5858;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5859;\n\t\t\t\t\t\t\telse return 5860;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5864;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5865;\n\t\t\t\t\t\t\telse return 5866;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5870;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5871;\n\t\t\t\t\t\t\telse return 5872;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5876;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5877;\n\t\t\t\t\t\t\telse return 5878;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5882;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5883;\n\t\t\t\t\t\t\telse return 5884;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5888;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5889;\n\t\t\t\t\t\t\telse return 5890;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5894;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5895;\n\t\t\t\t\t\t\telse return 5896;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5900;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5901;\n\t\t\t\t\t\t\telse return 5902;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5906;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5907;\n\t\t\t\t\t\t\telse return 5908;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5912;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5913;\n\t\t\t\t\t\t\telse return 5914;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5918;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5919;\n\t\t\t\t\t\t\telse return 5920;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5924;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5925;\n\t\t\t\t\t\t\telse return 5926;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5930;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5931;\n\t\t\t\t\t\t\telse return 5932;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5936;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5937;\n\t\t\t\t\t\t\telse return 5938;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5942;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5943;\n\t\t\t\t\t\t\telse return 5944;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5948;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5949;\n\t\t\t\t\t\t\telse return 5950;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5954;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5955;\n\t\t\t\t\t\t\telse return 5956;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5960;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5961;\n\t\t\t\t\t\t\telse return 5962;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5966;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5967;\n\t\t\t\t\t\t\telse return 5968;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5972;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5973;\n\t\t\t\t\t\t\telse return 5974;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5978;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5979;\n\t\t\t\t\t\t\telse return 5980;\n\t\t}\n\t\tBlockState CobblestoneWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace Cobweb\n\t{\n\t\tconstexpr BlockState Cobweb()\n\t\t{\n\t\t\treturn 1341;\n\t\t}\n\t}\n\tnamespace Cocoa\n\t{\n\t\tconstexpr BlockState Cocoa(const unsigned char Age, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Age == 0)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 5158;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 5159;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 5160;\n\t\t\t\telse return 5161;\n\t\t\telse if (Age == 1)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 5162;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 5163;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 5164;\n\t\t\t\telse return 5165;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 5166;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 5167;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 5168;\n\t\t\t\telse return 5169;\n\t\t}\n\t\tBlockState Cocoa();\n\t\tunsigned char Age(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace CommandBlock\n\t{\n\t\tconstexpr BlockState CommandBlock(const bool Conditional, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Conditional)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 5644;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 5645;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 5646;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 5647;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 5648;\n\t\t\t\telse return 5649;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 5650;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 5651;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 5652;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 5653;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 5654;\n\t\t\t\telse return 5655;\n\t\t}\n\t\tBlockState CommandBlock();\n\t\tbool Conditional(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Comparator\n\t{\n\t\tenum class Mode\n\t\t{\n\t\t\tCompare,\n\t\t\tSubtract\n\t\t};\n\t\tconstexpr BlockState Comparator(const eBlockFace Facing, const enum Mode Mode, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Mode == Mode::Compare)\n\t\t\t\t\tif (Powered) return 6678;\n\t\t\t\t\telse return 6679;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6680;\n\t\t\t\t\telse return 6681;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Mode == Mode::Compare)\n\t\t\t\t\tif (Powered) return 6682;\n\t\t\t\t\telse return 6683;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6684;\n\t\t\t\t\telse return 6685;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Mode == Mode::Compare)\n\t\t\t\t\tif (Powered) return 6686;\n\t\t\t\t\telse return 6687;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6688;\n\t\t\t\t\telse return 6689;\n\t\t\telse\n\t\t\t\tif (Mode == Mode::Compare)\n\t\t\t\t\tif (Powered) return 6690;\n\t\t\t\t\telse return 6691;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6692;\n\t\t\t\t\telse return 6693;\n\t\t}\n\t\tBlockState Comparator();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Mode Mode(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace Composter\n\t{\n\t\tconstexpr BlockState Composter(const unsigned char Level)\n\t\t{\n\t\t\tif (Level == 0) return 15751;\n\t\t\telse if (Level == 1) return 15752;\n\t\t\telse if (Level == 2) return 15753;\n\t\t\telse if (Level == 3) return 15754;\n\t\t\telse if (Level == 4) return 15755;\n\t\t\telse if (Level == 5) return 15756;\n\t\t\telse if (Level == 6) return 15757;\n\t\t\telse if (Level == 7) return 15758;\n\t\t\telse return 15759;\n\t\t}\n\t\tBlockState Composter();\n\t\tunsigned char Level(BlockState Block);\n\t}\n\tnamespace Conduit\n\t{\n\t\tconstexpr BlockState Conduit()\n\t\t{\n\t\t\treturn 9650;\n\t\t}\n\t}\n\tnamespace Cornflower\n\t{\n\t\tconstexpr BlockState Cornflower()\n\t\t{\n\t\t\treturn 1422;\n\t\t}\n\t}\n\tnamespace CrackedNetherBricks\n\t{\n\t\tconstexpr BlockState CrackedNetherBricks()\n\t\t{\n\t\t\treturn 17102;\n\t\t}\n\t}\n\tnamespace CrackedPolishedBlackstoneBricks\n\t{\n\t\tconstexpr BlockState CrackedPolishedBlackstoneBricks()\n\t\t{\n\t\t\treturn 16252;\n\t\t}\n\t}\n\tnamespace CrackedStoneBricks\n\t{\n\t\tconstexpr BlockState CrackedStoneBricks()\n\t\t{\n\t\t\treturn 4497;\n\t\t}\n\t}\n\tnamespace CraftingTable\n\t{\n\t\tconstexpr BlockState CraftingTable()\n\t\t{\n\t\t\treturn 3356;\n\t\t}\n\t}\n\tnamespace CreeperHead\n\t{\n\t\tconstexpr BlockState CreeperHead(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 6570;\n\t\t\telse if (Rotation == 1) return 6571;\n\t\t\telse if (Rotation == 2) return 6572;\n\t\t\telse if (Rotation == 3) return 6573;\n\t\t\telse if (Rotation == 4) return 6574;\n\t\t\telse if (Rotation == 5) return 6575;\n\t\t\telse if (Rotation == 6) return 6576;\n\t\t\telse if (Rotation == 7) return 6577;\n\t\t\telse if (Rotation == 8) return 6578;\n\t\t\telse if (Rotation == 9) return 6579;\n\t\t\telse if (Rotation == 10) return 6580;\n\t\t\telse if (Rotation == 11) return 6581;\n\t\t\telse if (Rotation == 12) return 6582;\n\t\t\telse if (Rotation == 13) return 6583;\n\t\t\telse if (Rotation == 14) return 6584;\n\t\t\telse return 6585;\n\t\t}\n\t\tBlockState CreeperHead();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace CreeperWallHead\n\t{\n\t\tconstexpr BlockState CreeperWallHead(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6586;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6587;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6588;\n\t\t\telse return 6589;\n\t\t}\n\t\tBlockState CreeperWallHead();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace CrimsonButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState CrimsonButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 15479;\n\t\t\t\t\telse return 15480;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 15481;\n\t\t\t\t\telse return 15482;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 15483;\n\t\t\t\t\telse return 15484;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 15485;\n\t\t\t\t\telse return 15486;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 15487;\n\t\t\t\t\telse return 15488;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 15489;\n\t\t\t\t\telse return 15490;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 15491;\n\t\t\t\t\telse return 15492;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 15493;\n\t\t\t\t\telse return 15494;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 15495;\n\t\t\t\t\telse return 15496;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 15497;\n\t\t\t\t\telse return 15498;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 15499;\n\t\t\t\t\telse return 15500;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 15501;\n\t\t\t\t\telse return 15502;\n\t\t}\n\t\tBlockState CrimsonButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace CrimsonDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState CrimsonDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15527;\n\t\t\t\t\t\t\telse return 15528;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15529;\n\t\t\t\t\t\t\telse return 15530;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15531;\n\t\t\t\t\t\t\telse return 15532;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15533;\n\t\t\t\t\t\t\telse return 15534;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15535;\n\t\t\t\t\t\t\telse return 15536;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15537;\n\t\t\t\t\t\t\telse return 15538;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15539;\n\t\t\t\t\t\t\telse return 15540;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15541;\n\t\t\t\t\t\t\telse return 15542;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15543;\n\t\t\t\t\t\t\telse return 15544;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15545;\n\t\t\t\t\t\t\telse return 15546;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15547;\n\t\t\t\t\t\t\telse return 15548;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15549;\n\t\t\t\t\t\t\telse return 15550;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15551;\n\t\t\t\t\t\t\telse return 15552;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15553;\n\t\t\t\t\t\t\telse return 15554;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15555;\n\t\t\t\t\t\t\telse return 15556;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15557;\n\t\t\t\t\t\t\telse return 15558;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15559;\n\t\t\t\t\t\t\telse return 15560;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15561;\n\t\t\t\t\t\t\telse return 15562;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15563;\n\t\t\t\t\t\t\telse return 15564;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15565;\n\t\t\t\t\t\t\telse return 15566;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15567;\n\t\t\t\t\t\t\telse return 15568;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15569;\n\t\t\t\t\t\t\telse return 15570;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15571;\n\t\t\t\t\t\t\telse return 15572;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15573;\n\t\t\t\t\t\t\telse return 15574;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15575;\n\t\t\t\t\t\t\telse return 15576;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15577;\n\t\t\t\t\t\t\telse return 15578;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15579;\n\t\t\t\t\t\t\telse return 15580;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15581;\n\t\t\t\t\t\t\telse return 15582;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15583;\n\t\t\t\t\t\t\telse return 15584;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15585;\n\t\t\t\t\t\t\telse return 15586;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15587;\n\t\t\t\t\t\t\telse return 15588;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15589;\n\t\t\t\t\t\t\telse return 15590;\n\t\t}\n\t\tBlockState CrimsonDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace CrimsonFence\n\t{\n\t\tconstexpr BlockState CrimsonFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 15065;\n\t\t\t\t\t\telse return 15066;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 15069;\n\t\t\t\t\t\telse return 15070;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 15073;\n\t\t\t\t\t\telse return 15074;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 15077;\n\t\t\t\t\t\telse return 15078;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 15081;\n\t\t\t\t\t\telse return 15082;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 15085;\n\t\t\t\t\t\telse return 15086;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 15089;\n\t\t\t\t\t\telse return 15090;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 15093;\n\t\t\t\t\t\telse return 15094;\n\t\t}\n\t\tBlockState CrimsonFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace CrimsonFenceGate\n\t{\n\t\tconstexpr BlockState CrimsonFenceGate(const eBlockFace Facing, const bool InWall, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15255;\n\t\t\t\t\t\telse return 15256;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15257;\n\t\t\t\t\t\telse return 15258;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15259;\n\t\t\t\t\t\telse return 15260;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15261;\n\t\t\t\t\t\telse return 15262;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15263;\n\t\t\t\t\t\telse return 15264;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15265;\n\t\t\t\t\t\telse return 15266;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15267;\n\t\t\t\t\t\telse return 15268;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15269;\n\t\t\t\t\t\telse return 15270;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15271;\n\t\t\t\t\t\telse return 15272;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15273;\n\t\t\t\t\t\telse return 15274;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15275;\n\t\t\t\t\t\telse return 15276;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15277;\n\t\t\t\t\t\telse return 15278;\n\t\t\telse\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15279;\n\t\t\t\t\t\telse return 15280;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15281;\n\t\t\t\t\t\telse return 15282;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15283;\n\t\t\t\t\t\telse return 15284;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15285;\n\t\t\t\t\t\telse return 15286;\n\t\t}\n\t\tBlockState CrimsonFenceGate();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool InWall(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace CrimsonFungus\n\t{\n\t\tconstexpr BlockState CrimsonFungus()\n\t\t{\n\t\t\treturn 14988;\n\t\t}\n\t}\n\tnamespace CrimsonHyphae\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState CrimsonHyphae(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 14981;\n\t\t\telse if (Axis == Axis::Y) return 14982;\n\t\t\telse return 14983;\n\t\t}\n\t\tBlockState CrimsonHyphae();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace CrimsonNylium\n\t{\n\t\tconstexpr BlockState CrimsonNylium()\n\t\t{\n\t\t\treturn 14987;\n\t\t}\n\t}\n\tnamespace CrimsonPlanks\n\t{\n\t\tconstexpr BlockState CrimsonPlanks()\n\t\t{\n\t\t\treturn 15045;\n\t\t}\n\t}\n\tnamespace CrimsonPressurePlate\n\t{\n\t\tconstexpr BlockState CrimsonPressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 15059;\n\t\t\telse return 15060;\n\t\t}\n\t\tBlockState CrimsonPressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace CrimsonRoots\n\t{\n\t\tconstexpr BlockState CrimsonRoots()\n\t\t{\n\t\t\treturn 15044;\n\t\t}\n\t}\n\tnamespace CrimsonSign\n\t{\n\t\tconstexpr BlockState CrimsonSign(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 15656;\n\t\t\telse if (Rotation == 1) return 15658;\n\t\t\telse if (Rotation == 2) return 15660;\n\t\t\telse if (Rotation == 3) return 15662;\n\t\t\telse if (Rotation == 4) return 15664;\n\t\t\telse if (Rotation == 5) return 15666;\n\t\t\telse if (Rotation == 6) return 15668;\n\t\t\telse if (Rotation == 7) return 15670;\n\t\t\telse if (Rotation == 8) return 15672;\n\t\t\telse if (Rotation == 9) return 15674;\n\t\t\telse if (Rotation == 10) return 15676;\n\t\t\telse if (Rotation == 11) return 15678;\n\t\t\telse if (Rotation == 12) return 15680;\n\t\t\telse if (Rotation == 13) return 15682;\n\t\t\telse if (Rotation == 14) return 15684;\n\t\t\telse return 15686;\n\t\t}\n\t\tBlockState CrimsonSign();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace CrimsonSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState CrimsonSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 15048;\n\t\t\telse if (Type == Type::Bottom) return 15050;\n\t\t\telse return 15052;\n\t\t}\n\t\tBlockState CrimsonSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace CrimsonStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState CrimsonStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15320;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15322;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15324;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15326;\n\t\t\t\t\telse return 15328;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15330;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15332;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15334;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15336;\n\t\t\t\t\telse return 15338;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15340;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15342;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15344;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15346;\n\t\t\t\t\telse return 15348;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15350;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15352;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15354;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15356;\n\t\t\t\t\telse return 15358;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15360;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15362;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15364;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15366;\n\t\t\t\t\telse return 15368;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15370;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15372;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15374;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15376;\n\t\t\t\t\telse return 15378;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15380;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15382;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15384;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15386;\n\t\t\t\t\telse return 15388;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15390;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15392;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15394;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15396;\n\t\t\t\t\telse return 15398;\n\t\t}\n\t\tBlockState CrimsonStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace CrimsonStem\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState CrimsonStem(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 14975;\n\t\t\telse if (Axis == Axis::Y) return 14976;\n\t\t\telse return 14977;\n\t\t}\n\t\tBlockState CrimsonStem();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace CrimsonTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState CrimsonTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15128;\n\t\t\t\t\t\telse return 15130;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15132;\n\t\t\t\t\t\telse return 15134;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15136;\n\t\t\t\t\t\telse return 15138;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15140;\n\t\t\t\t\t\telse return 15142;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15144;\n\t\t\t\t\t\telse return 15146;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15148;\n\t\t\t\t\t\telse return 15150;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15152;\n\t\t\t\t\t\telse return 15154;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15156;\n\t\t\t\t\t\telse return 15158;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15160;\n\t\t\t\t\t\telse return 15162;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15164;\n\t\t\t\t\t\telse return 15166;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15168;\n\t\t\t\t\t\telse return 15170;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15172;\n\t\t\t\t\t\telse return 15174;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15176;\n\t\t\t\t\t\telse return 15178;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15180;\n\t\t\t\t\t\telse return 15182;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15184;\n\t\t\t\t\t\telse return 15186;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15188;\n\t\t\t\t\t\telse return 15190;\n\t\t}\n\t\tBlockState CrimsonTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace CrimsonWallSign\n\t{\n\t\tconstexpr BlockState CrimsonWallSign(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 15720;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 15722;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 15724;\n\t\t\telse return 15726;\n\t\t}\n\t\tBlockState CrimsonWallSign();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace CryingObsidian\n\t{\n\t\tconstexpr BlockState CryingObsidian()\n\t\t{\n\t\t\treturn 15828;\n\t\t}\n\t}\n\tnamespace CutRedSandstone\n\t{\n\t\tconstexpr BlockState CutRedSandstone()\n\t\t{\n\t\t\treturn 8219;\n\t\t}\n\t}\n\tnamespace CutRedSandstoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState CutRedSandstoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8403;\n\t\t\telse if (Type == Type::Bottom) return 8405;\n\t\t\telse return 8407;\n\t\t}\n\t\tBlockState CutRedSandstoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace CutSandstone\n\t{\n\t\tconstexpr BlockState CutSandstone()\n\t\t{\n\t\t\treturn 248;\n\t\t}\n\t}\n\tnamespace CutSandstoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState CutSandstoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8355;\n\t\t\telse if (Type == Type::Bottom) return 8357;\n\t\t\telse return 8359;\n\t\t}\n\t\tBlockState CutSandstoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace CyanBanner\n\t{\n\t\tconstexpr BlockState CyanBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8041;\n\t\t\telse if (Rotation == 1) return 8042;\n\t\t\telse if (Rotation == 2) return 8043;\n\t\t\telse if (Rotation == 3) return 8044;\n\t\t\telse if (Rotation == 4) return 8045;\n\t\t\telse if (Rotation == 5) return 8046;\n\t\t\telse if (Rotation == 6) return 8047;\n\t\t\telse if (Rotation == 7) return 8048;\n\t\t\telse if (Rotation == 8) return 8049;\n\t\t\telse if (Rotation == 9) return 8050;\n\t\t\telse if (Rotation == 10) return 8051;\n\t\t\telse if (Rotation == 11) return 8052;\n\t\t\telse if (Rotation == 12) return 8053;\n\t\t\telse if (Rotation == 13) return 8054;\n\t\t\telse if (Rotation == 14) return 8055;\n\t\t\telse return 8056;\n\t\t}\n\t\tBlockState CyanBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace CyanBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState CyanBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1193;\n\t\t\t\t\telse return 1194;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1195;\n\t\t\t\t\telse return 1196;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1197;\n\t\t\t\t\telse return 1198;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1199;\n\t\t\t\t\telse return 1200;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1201;\n\t\t\t\t\telse return 1202;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1203;\n\t\t\t\t\telse return 1204;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1205;\n\t\t\t\t\telse return 1206;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1207;\n\t\t\t\t\telse return 1208;\n\t\t}\n\t\tBlockState CyanBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace CyanCarpet\n\t{\n\t\tconstexpr BlockState CyanCarpet()\n\t\t{\n\t\t\treturn 7875;\n\t\t}\n\t}\n\tnamespace CyanConcrete\n\t{\n\t\tconstexpr BlockState CyanConcrete()\n\t\t{\n\t\t\treturn 9447;\n\t\t}\n\t}\n\tnamespace CyanConcretePowder\n\t{\n\t\tconstexpr BlockState CyanConcretePowder()\n\t\t{\n\t\t\treturn 9463;\n\t\t}\n\t}\n\tnamespace CyanGlazedTerracotta\n\t{\n\t\tconstexpr BlockState CyanGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9410;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9411;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9412;\n\t\t\telse return 9413;\n\t\t}\n\t\tBlockState CyanGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace CyanShulkerBox\n\t{\n\t\tconstexpr BlockState CyanShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9332;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9333;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9334;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9335;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9336;\n\t\t\telse return 9337;\n\t\t}\n\t\tBlockState CyanShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace CyanStainedGlass\n\t{\n\t\tconstexpr BlockState CyanStainedGlass()\n\t\t{\n\t\t\treturn 4104;\n\t\t}\n\t}\n\tnamespace CyanStainedGlassPane\n\t{\n\t\tconstexpr BlockState CyanStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7153;\n\t\t\t\t\t\telse return 7154;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7157;\n\t\t\t\t\t\telse return 7158;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7161;\n\t\t\t\t\t\telse return 7162;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7165;\n\t\t\t\t\t\telse return 7166;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7169;\n\t\t\t\t\t\telse return 7170;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7173;\n\t\t\t\t\t\telse return 7174;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7177;\n\t\t\t\t\t\telse return 7178;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7181;\n\t\t\t\t\t\telse return 7182;\n\t\t}\n\t\tBlockState CyanStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace CyanTerracotta\n\t{\n\t\tconstexpr BlockState CyanTerracotta()\n\t\t{\n\t\t\treturn 6856;\n\t\t}\n\t}\n\tnamespace CyanWallBanner\n\t{\n\t\tconstexpr BlockState CyanWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8189;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8190;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8191;\n\t\t\telse return 8192;\n\t\t}\n\t\tBlockState CyanWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace CyanWool\n\t{\n\t\tconstexpr BlockState CyanWool()\n\t\t{\n\t\t\treturn 1393;\n\t\t}\n\t}\n\tnamespace DamagedAnvil\n\t{\n\t\tconstexpr BlockState DamagedAnvil(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6618;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6619;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6620;\n\t\t\telse return 6621;\n\t\t}\n\t\tBlockState DamagedAnvil();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Dandelion\n\t{\n\t\tconstexpr BlockState Dandelion()\n\t\t{\n\t\t\treturn 1412;\n\t\t}\n\t}\n\tnamespace DarkOakButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState DarkOakButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6466;\n\t\t\t\t\telse return 6467;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6468;\n\t\t\t\t\telse return 6469;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6470;\n\t\t\t\t\telse return 6471;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6472;\n\t\t\t\t\telse return 6473;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6474;\n\t\t\t\t\telse return 6475;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6476;\n\t\t\t\t\telse return 6477;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6478;\n\t\t\t\t\telse return 6479;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6480;\n\t\t\t\t\telse return 6481;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6482;\n\t\t\t\t\telse return 6483;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6484;\n\t\t\t\t\telse return 6485;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6486;\n\t\t\t\t\telse return 6487;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6488;\n\t\t\t\t\telse return 6489;\n\t\t}\n\t\tBlockState DarkOakButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace DarkOakDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState DarkOakDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8994;\n\t\t\t\t\t\t\telse return 8995;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8996;\n\t\t\t\t\t\t\telse return 8997;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8998;\n\t\t\t\t\t\t\telse return 8999;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9000;\n\t\t\t\t\t\t\telse return 9001;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9002;\n\t\t\t\t\t\t\telse return 9003;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9004;\n\t\t\t\t\t\t\telse return 9005;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9006;\n\t\t\t\t\t\t\telse return 9007;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9008;\n\t\t\t\t\t\t\telse return 9009;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9010;\n\t\t\t\t\t\t\telse return 9011;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9012;\n\t\t\t\t\t\t\telse return 9013;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9014;\n\t\t\t\t\t\t\telse return 9015;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9016;\n\t\t\t\t\t\t\telse return 9017;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9018;\n\t\t\t\t\t\t\telse return 9019;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9020;\n\t\t\t\t\t\t\telse return 9021;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9022;\n\t\t\t\t\t\t\telse return 9023;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9024;\n\t\t\t\t\t\t\telse return 9025;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9026;\n\t\t\t\t\t\t\telse return 9027;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9028;\n\t\t\t\t\t\t\telse return 9029;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9030;\n\t\t\t\t\t\t\telse return 9031;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9032;\n\t\t\t\t\t\t\telse return 9033;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9034;\n\t\t\t\t\t\t\telse return 9035;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9036;\n\t\t\t\t\t\t\telse return 9037;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9038;\n\t\t\t\t\t\t\telse return 9039;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9040;\n\t\t\t\t\t\t\telse return 9041;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9042;\n\t\t\t\t\t\t\telse return 9043;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9044;\n\t\t\t\t\t\t\telse return 9045;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9046;\n\t\t\t\t\t\t\telse return 9047;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9048;\n\t\t\t\t\t\t\telse return 9049;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9050;\n\t\t\t\t\t\t\telse return 9051;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9052;\n\t\t\t\t\t\t\telse return 9053;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 9054;\n\t\t\t\t\t\t\telse return 9055;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 9056;\n\t\t\t\t\t\t\telse return 9057;\n\t\t}\n\t\tBlockState DarkOakDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace DarkOakFence\n\t{\n\t\tconstexpr BlockState DarkOakFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8708;\n\t\t\t\t\t\telse return 8709;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8712;\n\t\t\t\t\t\telse return 8713;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8716;\n\t\t\t\t\t\telse return 8717;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8720;\n\t\t\t\t\t\telse return 8721;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8724;\n\t\t\t\t\t\telse return 8725;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8728;\n\t\t\t\t\t\telse return 8729;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8732;\n\t\t\t\t\t\telse return 8733;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8736;\n\t\t\t\t\t\telse return 8737;\n\t\t}\n\t\tBlockState DarkOakFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace DarkOakFenceGate\n\t{\n\t\tconstexpr BlockState DarkOakFenceGate(const eBlockFace Facing, const bool InWall, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8546;\n\t\t\t\t\t\telse return 8547;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8548;\n\t\t\t\t\t\telse return 8549;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8550;\n\t\t\t\t\t\telse return 8551;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8552;\n\t\t\t\t\t\telse return 8553;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8554;\n\t\t\t\t\t\telse return 8555;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8556;\n\t\t\t\t\t\telse return 8557;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8558;\n\t\t\t\t\t\telse return 8559;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8560;\n\t\t\t\t\t\telse return 8561;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8562;\n\t\t\t\t\t\telse return 8563;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8564;\n\t\t\t\t\t\telse return 8565;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8566;\n\t\t\t\t\t\telse return 8567;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8568;\n\t\t\t\t\t\telse return 8569;\n\t\t\telse\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8570;\n\t\t\t\t\t\telse return 8571;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8572;\n\t\t\t\t\t\telse return 8573;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8574;\n\t\t\t\t\t\telse return 8575;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8576;\n\t\t\t\t\t\telse return 8577;\n\t\t}\n\t\tBlockState DarkOakFenceGate();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool InWall(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace DarkOakLeaves\n\t{\n\t\tconstexpr BlockState DarkOakLeaves(const unsigned char Distance, const bool Persistent)\n\t\t{\n\t\t\tif (Distance == 1)\n\t\t\t\tif (Persistent) return 215;\n\t\t\t\telse return 216;\n\t\t\telse if (Distance == 2)\n\t\t\t\tif (Persistent) return 217;\n\t\t\t\telse return 218;\n\t\t\telse if (Distance == 3)\n\t\t\t\tif (Persistent) return 219;\n\t\t\t\telse return 220;\n\t\t\telse if (Distance == 4)\n\t\t\t\tif (Persistent) return 221;\n\t\t\t\telse return 222;\n\t\t\telse if (Distance == 5)\n\t\t\t\tif (Persistent) return 223;\n\t\t\t\telse return 224;\n\t\t\telse if (Distance == 6)\n\t\t\t\tif (Persistent) return 225;\n\t\t\t\telse return 226;\n\t\t\telse\n\t\t\t\tif (Persistent) return 227;\n\t\t\t\telse return 228;\n\t\t}\n\t\tBlockState DarkOakLeaves();\n\t\tunsigned char Distance(BlockState Block);\n\t\tbool Persistent(BlockState Block);\n\t}\n\tnamespace DarkOakLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState DarkOakLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 88;\n\t\t\telse if (Axis == Axis::Y) return 89;\n\t\t\telse return 90;\n\t\t}\n\t\tBlockState DarkOakLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace DarkOakPlanks\n\t{\n\t\tconstexpr BlockState DarkOakPlanks()\n\t\t{\n\t\t\treturn 20;\n\t\t}\n\t}\n\tnamespace DarkOakPressurePlate\n\t{\n\t\tconstexpr BlockState DarkOakPressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 3883;\n\t\t\telse return 3884;\n\t\t}\n\t\tBlockState DarkOakPressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace DarkOakSapling\n\t{\n\t\tconstexpr BlockState DarkOakSapling(const unsigned char Stage)\n\t\t{\n\t\t\tif (Stage == 0) return 31;\n\t\t\telse return 32;\n\t\t}\n\t\tBlockState DarkOakSapling();\n\t\tunsigned char Stage(BlockState Block);\n\t}\n\tnamespace DarkOakSign\n\t{\n\t\tconstexpr BlockState DarkOakSign(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 3542;\n\t\t\telse if (Rotation == 1) return 3544;\n\t\t\telse if (Rotation == 2) return 3546;\n\t\t\telse if (Rotation == 3) return 3548;\n\t\t\telse if (Rotation == 4) return 3550;\n\t\t\telse if (Rotation == 5) return 3552;\n\t\t\telse if (Rotation == 6) return 3554;\n\t\t\telse if (Rotation == 7) return 3556;\n\t\t\telse if (Rotation == 8) return 3558;\n\t\t\telse if (Rotation == 9) return 3560;\n\t\t\telse if (Rotation == 10) return 3562;\n\t\t\telse if (Rotation == 11) return 3564;\n\t\t\telse if (Rotation == 12) return 3566;\n\t\t\telse if (Rotation == 13) return 3568;\n\t\t\telse if (Rotation == 14) return 3570;\n\t\t\telse return 3572;\n\t\t}\n\t\tBlockState DarkOakSign();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace DarkOakSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState DarkOakSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8331;\n\t\t\telse if (Type == Type::Bottom) return 8333;\n\t\t\telse return 8335;\n\t\t}\n\t\tBlockState DarkOakSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace DarkOakStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState DarkOakStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7456;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7458;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7460;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7462;\n\t\t\t\t\telse return 7464;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7466;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7468;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7470;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7472;\n\t\t\t\t\telse return 7474;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7476;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7478;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7480;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7482;\n\t\t\t\t\telse return 7484;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7486;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7488;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7490;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7492;\n\t\t\t\t\telse return 7494;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7496;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7498;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7500;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7502;\n\t\t\t\t\telse return 7504;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7506;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7508;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7510;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7512;\n\t\t\t\t\telse return 7514;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7516;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7518;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7520;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7522;\n\t\t\t\t\telse return 7524;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7526;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7528;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7530;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7532;\n\t\t\t\t\telse return 7534;\n\t\t}\n\t\tBlockState DarkOakStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace DarkOakTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState DarkOakTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4432;\n\t\t\t\t\t\telse return 4434;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4436;\n\t\t\t\t\t\telse return 4438;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4440;\n\t\t\t\t\t\telse return 4442;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4444;\n\t\t\t\t\t\telse return 4446;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4448;\n\t\t\t\t\t\telse return 4450;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4452;\n\t\t\t\t\t\telse return 4454;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4456;\n\t\t\t\t\t\telse return 4458;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4460;\n\t\t\t\t\t\telse return 4462;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4464;\n\t\t\t\t\t\telse return 4466;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4468;\n\t\t\t\t\t\telse return 4470;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4472;\n\t\t\t\t\t\telse return 4474;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4476;\n\t\t\t\t\t\telse return 4478;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4480;\n\t\t\t\t\t\telse return 4482;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4484;\n\t\t\t\t\t\telse return 4486;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4488;\n\t\t\t\t\t\telse return 4490;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4492;\n\t\t\t\t\t\telse return 4494;\n\t\t}\n\t\tBlockState DarkOakTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace DarkOakWallSign\n\t{\n\t\tconstexpr BlockState DarkOakWallSign(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 3776;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 3778;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 3780;\n\t\t\telse return 3782;\n\t\t}\n\t\tBlockState DarkOakWallSign();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace DarkOakWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState DarkOakWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 124;\n\t\t\telse if (Axis == Axis::Y) return 125;\n\t\t\telse return 126;\n\t\t}\n\t\tBlockState DarkOakWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace DarkPrismarine\n\t{\n\t\tconstexpr BlockState DarkPrismarine()\n\t\t{\n\t\t\treturn 7603;\n\t\t}\n\t}\n\tnamespace DarkPrismarineSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState DarkPrismarineSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 7857;\n\t\t\telse if (Type == Type::Bottom) return 7859;\n\t\t\telse return 7861;\n\t\t}\n\t\tBlockState DarkPrismarineSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace DarkPrismarineStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState DarkPrismarineStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7765;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7767;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7769;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7771;\n\t\t\t\t\telse return 7773;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7775;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7777;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7779;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7781;\n\t\t\t\t\telse return 7783;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7785;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7787;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7789;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7791;\n\t\t\t\t\telse return 7793;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7795;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7797;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7799;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7801;\n\t\t\t\t\telse return 7803;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7805;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7807;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7809;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7811;\n\t\t\t\t\telse return 7813;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7815;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7817;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7819;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7821;\n\t\t\t\t\telse return 7823;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7825;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7827;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7829;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7831;\n\t\t\t\t\telse return 7833;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7835;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7837;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7839;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7841;\n\t\t\t\t\telse return 7843;\n\t\t}\n\t\tBlockState DarkPrismarineStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace DaylightDetector\n\t{\n\t\tconstexpr BlockState DaylightDetector(const bool Inverted, const unsigned char Power)\n\t\t{\n\t\t\tif (Inverted)\n\t\t\t\tif (Power == 0) return 6694;\n\t\t\t\telse if (Power == 1) return 6695;\n\t\t\t\telse if (Power == 2) return 6696;\n\t\t\t\telse if (Power == 3) return 6697;\n\t\t\t\telse if (Power == 4) return 6698;\n\t\t\t\telse if (Power == 5) return 6699;\n\t\t\t\telse if (Power == 6) return 6700;\n\t\t\t\telse if (Power == 7) return 6701;\n\t\t\t\telse if (Power == 8) return 6702;\n\t\t\t\telse if (Power == 9) return 6703;\n\t\t\t\telse if (Power == 10) return 6704;\n\t\t\t\telse if (Power == 11) return 6705;\n\t\t\t\telse if (Power == 12) return 6706;\n\t\t\t\telse if (Power == 13) return 6707;\n\t\t\t\telse if (Power == 14) return 6708;\n\t\t\t\telse return 6709;\n\t\t\telse\n\t\t\t\tif (Power == 0) return 6710;\n\t\t\t\telse if (Power == 1) return 6711;\n\t\t\t\telse if (Power == 2) return 6712;\n\t\t\t\telse if (Power == 3) return 6713;\n\t\t\t\telse if (Power == 4) return 6714;\n\t\t\t\telse if (Power == 5) return 6715;\n\t\t\t\telse if (Power == 6) return 6716;\n\t\t\t\telse if (Power == 7) return 6717;\n\t\t\t\telse if (Power == 8) return 6718;\n\t\t\t\telse if (Power == 9) return 6719;\n\t\t\t\telse if (Power == 10) return 6720;\n\t\t\t\telse if (Power == 11) return 6721;\n\t\t\t\telse if (Power == 12) return 6722;\n\t\t\t\telse if (Power == 13) return 6723;\n\t\t\t\telse if (Power == 14) return 6724;\n\t\t\t\telse return 6725;\n\t\t}\n\t\tBlockState DaylightDetector();\n\t\tbool Inverted(BlockState Block);\n\t\tunsigned char Power(BlockState Block);\n\t}\n\tnamespace DeadBrainCoral\n\t{\n\t\tconstexpr BlockState DeadBrainCoral()\n\t\t{\n\t\t\treturn 9523;\n\t\t}\n\t}\n\tnamespace DeadBrainCoralBlock\n\t{\n\t\tconstexpr BlockState DeadBrainCoralBlock()\n\t\t{\n\t\t\treturn 9511;\n\t\t}\n\t}\n\tnamespace DeadBrainCoralFan\n\t{\n\t\tconstexpr BlockState DeadBrainCoralFan()\n\t\t{\n\t\t\treturn 9543;\n\t\t}\n\t}\n\tnamespace DeadBrainCoralWallFan\n\t{\n\t\tconstexpr BlockState DeadBrainCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9569;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9571;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9573;\n\t\t\telse return 9575;\n\t\t}\n\t\tBlockState DeadBrainCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace DeadBubbleCoral\n\t{\n\t\tconstexpr BlockState DeadBubbleCoral()\n\t\t{\n\t\t\treturn 9525;\n\t\t}\n\t}\n\tnamespace DeadBubbleCoralBlock\n\t{\n\t\tconstexpr BlockState DeadBubbleCoralBlock()\n\t\t{\n\t\t\treturn 9512;\n\t\t}\n\t}\n\tnamespace DeadBubbleCoralFan\n\t{\n\t\tconstexpr BlockState DeadBubbleCoralFan()\n\t\t{\n\t\t\treturn 9545;\n\t\t}\n\t}\n\tnamespace DeadBubbleCoralWallFan\n\t{\n\t\tconstexpr BlockState DeadBubbleCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9577;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9579;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9581;\n\t\t\telse return 9583;\n\t\t}\n\t\tBlockState DeadBubbleCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace DeadBush\n\t{\n\t\tconstexpr BlockState DeadBush()\n\t\t{\n\t\t\treturn 1344;\n\t\t}\n\t}\n\tnamespace DeadFireCoral\n\t{\n\t\tconstexpr BlockState DeadFireCoral()\n\t\t{\n\t\t\treturn 9527;\n\t\t}\n\t}\n\tnamespace DeadFireCoralBlock\n\t{\n\t\tconstexpr BlockState DeadFireCoralBlock()\n\t\t{\n\t\t\treturn 9513;\n\t\t}\n\t}\n\tnamespace DeadFireCoralFan\n\t{\n\t\tconstexpr BlockState DeadFireCoralFan()\n\t\t{\n\t\t\treturn 9547;\n\t\t}\n\t}\n\tnamespace DeadFireCoralWallFan\n\t{\n\t\tconstexpr BlockState DeadFireCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9585;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9587;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9589;\n\t\t\telse return 9591;\n\t\t}\n\t\tBlockState DeadFireCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace DeadHornCoral\n\t{\n\t\tconstexpr BlockState DeadHornCoral()\n\t\t{\n\t\t\treturn 9529;\n\t\t}\n\t}\n\tnamespace DeadHornCoralBlock\n\t{\n\t\tconstexpr BlockState DeadHornCoralBlock()\n\t\t{\n\t\t\treturn 9514;\n\t\t}\n\t}\n\tnamespace DeadHornCoralFan\n\t{\n\t\tconstexpr BlockState DeadHornCoralFan()\n\t\t{\n\t\t\treturn 9549;\n\t\t}\n\t}\n\tnamespace DeadHornCoralWallFan\n\t{\n\t\tconstexpr BlockState DeadHornCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9593;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9595;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9597;\n\t\t\telse return 9599;\n\t\t}\n\t\tBlockState DeadHornCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace DeadTubeCoral\n\t{\n\t\tconstexpr BlockState DeadTubeCoral()\n\t\t{\n\t\t\treturn 9521;\n\t\t}\n\t}\n\tnamespace DeadTubeCoralBlock\n\t{\n\t\tconstexpr BlockState DeadTubeCoralBlock()\n\t\t{\n\t\t\treturn 9510;\n\t\t}\n\t}\n\tnamespace DeadTubeCoralFan\n\t{\n\t\tconstexpr BlockState DeadTubeCoralFan()\n\t\t{\n\t\t\treturn 9541;\n\t\t}\n\t}\n\tnamespace DeadTubeCoralWallFan\n\t{\n\t\tconstexpr BlockState DeadTubeCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9561;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9563;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9565;\n\t\t\telse return 9567;\n\t\t}\n\t\tBlockState DeadTubeCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace DetectorRail\n\t{\n\t\tenum class Shape\n\t\t{\n\t\t\tNorthSouth,\n\t\t\tEastWest,\n\t\t\tAscendingEast,\n\t\t\tAscendingWest,\n\t\t\tAscendingNorth,\n\t\t\tAscendingSouth\n\t\t};\n\t\tconstexpr BlockState DetectorRail(const bool Powered, const enum Shape Shape)\n\t\t{\n\t\t\tif (Powered)\n\t\t\t\tif (Shape == Shape::NorthSouth) return 1317;\n\t\t\t\telse if (Shape == Shape::EastWest) return 1318;\n\t\t\t\telse if (Shape == Shape::AscendingEast) return 1319;\n\t\t\t\telse if (Shape == Shape::AscendingWest) return 1320;\n\t\t\t\telse if (Shape == Shape::AscendingNorth) return 1321;\n\t\t\t\telse return 1322;\n\t\t\telse\n\t\t\t\tif (Shape == Shape::NorthSouth) return 1323;\n\t\t\t\telse if (Shape == Shape::EastWest) return 1324;\n\t\t\t\telse if (Shape == Shape::AscendingEast) return 1325;\n\t\t\t\telse if (Shape == Shape::AscendingWest) return 1326;\n\t\t\t\telse if (Shape == Shape::AscendingNorth) return 1327;\n\t\t\t\telse return 1328;\n\t\t}\n\t\tBlockState DetectorRail();\n\t\tbool Powered(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace DiamondBlock\n\t{\n\t\tconstexpr BlockState DiamondBlock()\n\t\t{\n\t\t\treturn 3355;\n\t\t}\n\t}\n\tnamespace DiamondOre\n\t{\n\t\tconstexpr BlockState DiamondOre()\n\t\t{\n\t\t\treturn 3354;\n\t\t}\n\t}\n\tnamespace Diorite\n\t{\n\t\tconstexpr BlockState Diorite()\n\t\t{\n\t\t\treturn 4;\n\t\t}\n\t}\n\tnamespace DioriteSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState DioriteSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10862;\n\t\t\telse if (Type == Type::Bottom) return 10864;\n\t\t\telse return 10866;\n\t\t}\n\t\tBlockState DioriteSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace DioriteStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState DioriteStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10710;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10712;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10714;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10716;\n\t\t\t\t\telse return 10718;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10720;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10722;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10724;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10726;\n\t\t\t\t\telse return 10728;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10730;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10732;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10734;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10736;\n\t\t\t\t\telse return 10738;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10740;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10742;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10744;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10746;\n\t\t\t\t\telse return 10748;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10750;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10752;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10754;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10756;\n\t\t\t\t\telse return 10758;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10760;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10762;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10764;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10766;\n\t\t\t\t\telse return 10768;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10770;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10772;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10774;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10776;\n\t\t\t\t\telse return 10778;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10780;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10782;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10784;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10786;\n\t\t\t\t\telse return 10788;\n\t\t}\n\t\tBlockState DioriteStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace DioriteWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState DioriteWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14434;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14435;\n\t\t\t\t\t\t\telse return 14436;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14440;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14441;\n\t\t\t\t\t\t\telse return 14442;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14446;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14447;\n\t\t\t\t\t\t\telse return 14448;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14452;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14453;\n\t\t\t\t\t\t\telse return 14454;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14458;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14459;\n\t\t\t\t\t\t\telse return 14460;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14464;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14465;\n\t\t\t\t\t\t\telse return 14466;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14470;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14471;\n\t\t\t\t\t\t\telse return 14472;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14476;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14477;\n\t\t\t\t\t\t\telse return 14478;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14482;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14483;\n\t\t\t\t\t\t\telse return 14484;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14488;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14489;\n\t\t\t\t\t\t\telse return 14490;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14494;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14495;\n\t\t\t\t\t\t\telse return 14496;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14500;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14501;\n\t\t\t\t\t\t\telse return 14502;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14506;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14507;\n\t\t\t\t\t\t\telse return 14508;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14512;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14513;\n\t\t\t\t\t\t\telse return 14514;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14518;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14519;\n\t\t\t\t\t\t\telse return 14520;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14524;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14525;\n\t\t\t\t\t\t\telse return 14526;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14530;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14531;\n\t\t\t\t\t\t\telse return 14532;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14536;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14537;\n\t\t\t\t\t\t\telse return 14538;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14542;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14543;\n\t\t\t\t\t\t\telse return 14544;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14548;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14549;\n\t\t\t\t\t\t\telse return 14550;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14554;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14555;\n\t\t\t\t\t\t\telse return 14556;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14560;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14561;\n\t\t\t\t\t\t\telse return 14562;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14566;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14567;\n\t\t\t\t\t\t\telse return 14568;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14572;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14573;\n\t\t\t\t\t\t\telse return 14574;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14578;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14579;\n\t\t\t\t\t\t\telse return 14580;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14584;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14585;\n\t\t\t\t\t\t\telse return 14586;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14590;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14591;\n\t\t\t\t\t\t\telse return 14592;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14596;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14597;\n\t\t\t\t\t\t\telse return 14598;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14602;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14603;\n\t\t\t\t\t\t\telse return 14604;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14608;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14609;\n\t\t\t\t\t\t\telse return 14610;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14614;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14615;\n\t\t\t\t\t\t\telse return 14616;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14620;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14621;\n\t\t\t\t\t\t\telse return 14622;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14626;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14627;\n\t\t\t\t\t\t\telse return 14628;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14632;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14633;\n\t\t\t\t\t\t\telse return 14634;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14638;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14639;\n\t\t\t\t\t\t\telse return 14640;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14644;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14645;\n\t\t\t\t\t\t\telse return 14646;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14650;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14651;\n\t\t\t\t\t\t\telse return 14652;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14656;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14657;\n\t\t\t\t\t\t\telse return 14658;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14662;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14663;\n\t\t\t\t\t\t\telse return 14664;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14668;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14669;\n\t\t\t\t\t\t\telse return 14670;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14674;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14675;\n\t\t\t\t\t\t\telse return 14676;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14680;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14681;\n\t\t\t\t\t\t\telse return 14682;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14686;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14687;\n\t\t\t\t\t\t\telse return 14688;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14692;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14693;\n\t\t\t\t\t\t\telse return 14694;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14698;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14699;\n\t\t\t\t\t\t\telse return 14700;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14704;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14705;\n\t\t\t\t\t\t\telse return 14706;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14710;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14711;\n\t\t\t\t\t\t\telse return 14712;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14716;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14717;\n\t\t\t\t\t\t\telse return 14718;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14722;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14723;\n\t\t\t\t\t\t\telse return 14724;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14728;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14729;\n\t\t\t\t\t\t\telse return 14730;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14734;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14735;\n\t\t\t\t\t\t\telse return 14736;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14740;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14741;\n\t\t\t\t\t\t\telse return 14742;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14746;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14747;\n\t\t\t\t\t\t\telse return 14748;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14752;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14753;\n\t\t\t\t\t\t\telse return 14754;\n\t\t}\n\t\tBlockState DioriteWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace Dirt\n\t{\n\t\tconstexpr BlockState Dirt()\n\t\t{\n\t\t\treturn 10;\n\t\t}\n\t}\n\tnamespace Dispenser\n\t{\n\t\tconstexpr BlockState Dispenser(const eBlockFace Facing, const bool Triggered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Triggered) return 234;\n\t\t\t\telse return 235;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP)\n\t\t\t\tif (Triggered) return 236;\n\t\t\t\telse return 237;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Triggered) return 238;\n\t\t\t\telse return 239;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Triggered) return 240;\n\t\t\t\telse return 241;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP)\n\t\t\t\tif (Triggered) return 242;\n\t\t\t\telse return 243;\n\t\t\telse\n\t\t\t\tif (Triggered) return 244;\n\t\t\t\telse return 245;\n\t\t}\n\t\tBlockState Dispenser();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Triggered(BlockState Block);\n\t}\n\tnamespace DragonEgg\n\t{\n\t\tconstexpr BlockState DragonEgg()\n\t\t{\n\t\t\treturn 5155;\n\t\t}\n\t}\n\tnamespace DragonHead\n\t{\n\t\tconstexpr BlockState DragonHead(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 6590;\n\t\t\telse if (Rotation == 1) return 6591;\n\t\t\telse if (Rotation == 2) return 6592;\n\t\t\telse if (Rotation == 3) return 6593;\n\t\t\telse if (Rotation == 4) return 6594;\n\t\t\telse if (Rotation == 5) return 6595;\n\t\t\telse if (Rotation == 6) return 6596;\n\t\t\telse if (Rotation == 7) return 6597;\n\t\t\telse if (Rotation == 8) return 6598;\n\t\t\telse if (Rotation == 9) return 6599;\n\t\t\telse if (Rotation == 10) return 6600;\n\t\t\telse if (Rotation == 11) return 6601;\n\t\t\telse if (Rotation == 12) return 6602;\n\t\t\telse if (Rotation == 13) return 6603;\n\t\t\telse if (Rotation == 14) return 6604;\n\t\t\telse return 6605;\n\t\t}\n\t\tBlockState DragonHead();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace DragonWallHead\n\t{\n\t\tconstexpr BlockState DragonWallHead(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6606;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6607;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6608;\n\t\t\telse return 6609;\n\t\t}\n\t\tBlockState DragonWallHead();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace DriedKelpBlock\n\t{\n\t\tconstexpr BlockState DriedKelpBlock()\n\t\t{\n\t\t\treturn 9497;\n\t\t}\n\t}\n\tnamespace Dropper\n\t{\n\t\tconstexpr BlockState Dropper(const eBlockFace Facing, const bool Triggered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Triggered) return 6835;\n\t\t\t\telse return 6836;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP)\n\t\t\t\tif (Triggered) return 6837;\n\t\t\t\telse return 6838;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Triggered) return 6839;\n\t\t\t\telse return 6840;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Triggered) return 6841;\n\t\t\t\telse return 6842;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP)\n\t\t\t\tif (Triggered) return 6843;\n\t\t\t\telse return 6844;\n\t\t\telse\n\t\t\t\tif (Triggered) return 6845;\n\t\t\t\telse return 6846;\n\t\t}\n\t\tBlockState Dropper();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Triggered(BlockState Block);\n\t}\n\tnamespace EmeraldBlock\n\t{\n\t\tconstexpr BlockState EmeraldBlock()\n\t\t{\n\t\t\treturn 5403;\n\t\t}\n\t}\n\tnamespace EmeraldOre\n\t{\n\t\tconstexpr BlockState EmeraldOre()\n\t\t{\n\t\t\treturn 5250;\n\t\t}\n\t}\n\tnamespace EnchantingTable\n\t{\n\t\tconstexpr BlockState EnchantingTable()\n\t\t{\n\t\t\treturn 5132;\n\t\t}\n\t}\n\tnamespace EndGateway\n\t{\n\t\tconstexpr BlockState EndGateway()\n\t\t{\n\t\t\treturn 9224;\n\t\t}\n\t}\n\tnamespace EndPortal\n\t{\n\t\tconstexpr BlockState EndPortal()\n\t\t{\n\t\t\treturn 5145;\n\t\t}\n\t}\n\tnamespace EndPortalFrame\n\t{\n\t\tconstexpr BlockState EndPortalFrame(const bool Eye, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Eye)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 5146;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 5147;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 5148;\n\t\t\t\telse return 5149;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 5150;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 5151;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 5152;\n\t\t\t\telse return 5153;\n\t\t}\n\t\tBlockState EndPortalFrame();\n\t\tbool Eye(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace EndRod\n\t{\n\t\tconstexpr BlockState EndRod(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9058;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9059;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9060;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9061;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9062;\n\t\t\telse return 9063;\n\t\t}\n\t\tBlockState EndRod();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace EndStone\n\t{\n\t\tconstexpr BlockState EndStone()\n\t\t{\n\t\t\treturn 5154;\n\t\t}\n\t}\n\tnamespace EndStoneBrickSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState EndStoneBrickSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10820;\n\t\t\telse if (Type == Type::Bottom) return 10822;\n\t\t\telse return 10824;\n\t\t}\n\t\tBlockState EndStoneBrickSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace EndStoneBrickStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState EndStoneBrickStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10070;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10072;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10074;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10076;\n\t\t\t\t\telse return 10078;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10080;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10082;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10084;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10086;\n\t\t\t\t\telse return 10088;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10090;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10092;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10094;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10096;\n\t\t\t\t\telse return 10098;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10100;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10102;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10104;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10106;\n\t\t\t\t\telse return 10108;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10110;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10112;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10114;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10116;\n\t\t\t\t\telse return 10118;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10120;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10122;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10124;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10126;\n\t\t\t\t\telse return 10128;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10130;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10132;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10134;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10136;\n\t\t\t\t\telse return 10138;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10140;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10142;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10144;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10146;\n\t\t\t\t\telse return 10148;\n\t\t}\n\t\tBlockState EndStoneBrickStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace EndStoneBrickWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState EndStoneBrickWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14110;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14111;\n\t\t\t\t\t\t\telse return 14112;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14116;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14117;\n\t\t\t\t\t\t\telse return 14118;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14122;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14123;\n\t\t\t\t\t\t\telse return 14124;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14128;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14129;\n\t\t\t\t\t\t\telse return 14130;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14134;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14135;\n\t\t\t\t\t\t\telse return 14136;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14140;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14141;\n\t\t\t\t\t\t\telse return 14142;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14146;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14147;\n\t\t\t\t\t\t\telse return 14148;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14152;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14153;\n\t\t\t\t\t\t\telse return 14154;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14158;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14159;\n\t\t\t\t\t\t\telse return 14160;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14164;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14165;\n\t\t\t\t\t\t\telse return 14166;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14170;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14171;\n\t\t\t\t\t\t\telse return 14172;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14176;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14177;\n\t\t\t\t\t\t\telse return 14178;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14182;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14183;\n\t\t\t\t\t\t\telse return 14184;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14188;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14189;\n\t\t\t\t\t\t\telse return 14190;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14194;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14195;\n\t\t\t\t\t\t\telse return 14196;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14200;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14201;\n\t\t\t\t\t\t\telse return 14202;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14206;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14207;\n\t\t\t\t\t\t\telse return 14208;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14212;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14213;\n\t\t\t\t\t\t\telse return 14214;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14218;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14219;\n\t\t\t\t\t\t\telse return 14220;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14224;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14225;\n\t\t\t\t\t\t\telse return 14226;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14230;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14231;\n\t\t\t\t\t\t\telse return 14232;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14236;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14237;\n\t\t\t\t\t\t\telse return 14238;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14242;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14243;\n\t\t\t\t\t\t\telse return 14244;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14248;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14249;\n\t\t\t\t\t\t\telse return 14250;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14254;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14255;\n\t\t\t\t\t\t\telse return 14256;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14260;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14261;\n\t\t\t\t\t\t\telse return 14262;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14266;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14267;\n\t\t\t\t\t\t\telse return 14268;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14272;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14273;\n\t\t\t\t\t\t\telse return 14274;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14278;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14279;\n\t\t\t\t\t\t\telse return 14280;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14284;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14285;\n\t\t\t\t\t\t\telse return 14286;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14290;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14291;\n\t\t\t\t\t\t\telse return 14292;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14296;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14297;\n\t\t\t\t\t\t\telse return 14298;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14302;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14303;\n\t\t\t\t\t\t\telse return 14304;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14308;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14309;\n\t\t\t\t\t\t\telse return 14310;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14314;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14315;\n\t\t\t\t\t\t\telse return 14316;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14320;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14321;\n\t\t\t\t\t\t\telse return 14322;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14326;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14327;\n\t\t\t\t\t\t\telse return 14328;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14332;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14333;\n\t\t\t\t\t\t\telse return 14334;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14338;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14339;\n\t\t\t\t\t\t\telse return 14340;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14344;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14345;\n\t\t\t\t\t\t\telse return 14346;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14350;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14351;\n\t\t\t\t\t\t\telse return 14352;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14356;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14357;\n\t\t\t\t\t\t\telse return 14358;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14362;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14363;\n\t\t\t\t\t\t\telse return 14364;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14368;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14369;\n\t\t\t\t\t\t\telse return 14370;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14374;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14375;\n\t\t\t\t\t\t\telse return 14376;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14380;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14381;\n\t\t\t\t\t\t\telse return 14382;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14386;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14387;\n\t\t\t\t\t\t\telse return 14388;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14392;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14393;\n\t\t\t\t\t\t\telse return 14394;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14398;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14399;\n\t\t\t\t\t\t\telse return 14400;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14404;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14405;\n\t\t\t\t\t\t\telse return 14406;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14410;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14411;\n\t\t\t\t\t\t\telse return 14412;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14416;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14417;\n\t\t\t\t\t\t\telse return 14418;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14422;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14423;\n\t\t\t\t\t\t\telse return 14424;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14428;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14429;\n\t\t\t\t\t\t\telse return 14430;\n\t\t}\n\t\tBlockState EndStoneBrickWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace EndStoneBricks\n\t{\n\t\tconstexpr BlockState EndStoneBricks()\n\t\t{\n\t\t\treturn 9218;\n\t\t}\n\t}\n\tnamespace EnderChest\n\t{\n\t\tconstexpr BlockState EnderChest(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 5252;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 5254;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 5256;\n\t\t\telse return 5258;\n\t\t}\n\t\tBlockState EnderChest();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Farmland\n\t{\n\t\tconstexpr BlockState Farmland(const unsigned char Moisture)\n\t\t{\n\t\t\tif (Moisture == 0) return 3365;\n\t\t\telse if (Moisture == 1) return 3366;\n\t\t\telse if (Moisture == 2) return 3367;\n\t\t\telse if (Moisture == 3) return 3368;\n\t\t\telse if (Moisture == 4) return 3369;\n\t\t\telse if (Moisture == 5) return 3370;\n\t\t\telse if (Moisture == 6) return 3371;\n\t\t\telse return 3372;\n\t\t}\n\t\tBlockState Farmland();\n\t\tunsigned char Moisture(BlockState Block);\n\t}\n\tnamespace Fern\n\t{\n\t\tconstexpr BlockState Fern()\n\t\t{\n\t\t\treturn 1343;\n\t\t}\n\t}\n\tnamespace Fire\n\t{\n\t\tconstexpr BlockState Fire(const unsigned char Age, const bool East, const bool North, const bool South, const bool Up, const bool West)\n\t\t{\n\t\t\tif (Age == 0)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1440;\n\t\t\t\t\t\t\t\telse return 1441;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1442;\n\t\t\t\t\t\t\t\telse return 1443;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1444;\n\t\t\t\t\t\t\t\telse return 1445;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1446;\n\t\t\t\t\t\t\t\telse return 1447;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1448;\n\t\t\t\t\t\t\t\telse return 1449;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1450;\n\t\t\t\t\t\t\t\telse return 1451;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1452;\n\t\t\t\t\t\t\t\telse return 1453;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1454;\n\t\t\t\t\t\t\t\telse return 1455;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1456;\n\t\t\t\t\t\t\t\telse return 1457;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1458;\n\t\t\t\t\t\t\t\telse return 1459;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1460;\n\t\t\t\t\t\t\t\telse return 1461;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1462;\n\t\t\t\t\t\t\t\telse return 1463;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1464;\n\t\t\t\t\t\t\t\telse return 1465;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1466;\n\t\t\t\t\t\t\t\telse return 1467;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1468;\n\t\t\t\t\t\t\t\telse return 1469;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1470;\n\t\t\t\t\t\t\t\telse return 1471;\n\t\t\telse if (Age == 1)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1472;\n\t\t\t\t\t\t\t\telse return 1473;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1474;\n\t\t\t\t\t\t\t\telse return 1475;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1476;\n\t\t\t\t\t\t\t\telse return 1477;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1478;\n\t\t\t\t\t\t\t\telse return 1479;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1480;\n\t\t\t\t\t\t\t\telse return 1481;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1482;\n\t\t\t\t\t\t\t\telse return 1483;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1484;\n\t\t\t\t\t\t\t\telse return 1485;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1486;\n\t\t\t\t\t\t\t\telse return 1487;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1488;\n\t\t\t\t\t\t\t\telse return 1489;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1490;\n\t\t\t\t\t\t\t\telse return 1491;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1492;\n\t\t\t\t\t\t\t\telse return 1493;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1494;\n\t\t\t\t\t\t\t\telse return 1495;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1496;\n\t\t\t\t\t\t\t\telse return 1497;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1498;\n\t\t\t\t\t\t\t\telse return 1499;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1500;\n\t\t\t\t\t\t\t\telse return 1501;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1502;\n\t\t\t\t\t\t\t\telse return 1503;\n\t\t\telse if (Age == 2)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1504;\n\t\t\t\t\t\t\t\telse return 1505;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1506;\n\t\t\t\t\t\t\t\telse return 1507;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1508;\n\t\t\t\t\t\t\t\telse return 1509;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1510;\n\t\t\t\t\t\t\t\telse return 1511;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1512;\n\t\t\t\t\t\t\t\telse return 1513;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1514;\n\t\t\t\t\t\t\t\telse return 1515;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1516;\n\t\t\t\t\t\t\t\telse return 1517;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1518;\n\t\t\t\t\t\t\t\telse return 1519;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1520;\n\t\t\t\t\t\t\t\telse return 1521;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1522;\n\t\t\t\t\t\t\t\telse return 1523;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1524;\n\t\t\t\t\t\t\t\telse return 1525;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1526;\n\t\t\t\t\t\t\t\telse return 1527;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1528;\n\t\t\t\t\t\t\t\telse return 1529;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1530;\n\t\t\t\t\t\t\t\telse return 1531;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1532;\n\t\t\t\t\t\t\t\telse return 1533;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1534;\n\t\t\t\t\t\t\t\telse return 1535;\n\t\t\telse if (Age == 3)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1536;\n\t\t\t\t\t\t\t\telse return 1537;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1538;\n\t\t\t\t\t\t\t\telse return 1539;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1540;\n\t\t\t\t\t\t\t\telse return 1541;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1542;\n\t\t\t\t\t\t\t\telse return 1543;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1544;\n\t\t\t\t\t\t\t\telse return 1545;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1546;\n\t\t\t\t\t\t\t\telse return 1547;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1548;\n\t\t\t\t\t\t\t\telse return 1549;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1550;\n\t\t\t\t\t\t\t\telse return 1551;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1552;\n\t\t\t\t\t\t\t\telse return 1553;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1554;\n\t\t\t\t\t\t\t\telse return 1555;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1556;\n\t\t\t\t\t\t\t\telse return 1557;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1558;\n\t\t\t\t\t\t\t\telse return 1559;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1560;\n\t\t\t\t\t\t\t\telse return 1561;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1562;\n\t\t\t\t\t\t\t\telse return 1563;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1564;\n\t\t\t\t\t\t\t\telse return 1565;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1566;\n\t\t\t\t\t\t\t\telse return 1567;\n\t\t\telse if (Age == 4)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1568;\n\t\t\t\t\t\t\t\telse return 1569;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1570;\n\t\t\t\t\t\t\t\telse return 1571;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1572;\n\t\t\t\t\t\t\t\telse return 1573;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1574;\n\t\t\t\t\t\t\t\telse return 1575;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1576;\n\t\t\t\t\t\t\t\telse return 1577;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1578;\n\t\t\t\t\t\t\t\telse return 1579;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1580;\n\t\t\t\t\t\t\t\telse return 1581;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1582;\n\t\t\t\t\t\t\t\telse return 1583;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1584;\n\t\t\t\t\t\t\t\telse return 1585;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1586;\n\t\t\t\t\t\t\t\telse return 1587;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1588;\n\t\t\t\t\t\t\t\telse return 1589;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1590;\n\t\t\t\t\t\t\t\telse return 1591;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1592;\n\t\t\t\t\t\t\t\telse return 1593;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1594;\n\t\t\t\t\t\t\t\telse return 1595;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1596;\n\t\t\t\t\t\t\t\telse return 1597;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1598;\n\t\t\t\t\t\t\t\telse return 1599;\n\t\t\telse if (Age == 5)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1600;\n\t\t\t\t\t\t\t\telse return 1601;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1602;\n\t\t\t\t\t\t\t\telse return 1603;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1604;\n\t\t\t\t\t\t\t\telse return 1605;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1606;\n\t\t\t\t\t\t\t\telse return 1607;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1608;\n\t\t\t\t\t\t\t\telse return 1609;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1610;\n\t\t\t\t\t\t\t\telse return 1611;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1612;\n\t\t\t\t\t\t\t\telse return 1613;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1614;\n\t\t\t\t\t\t\t\telse return 1615;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1616;\n\t\t\t\t\t\t\t\telse return 1617;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1618;\n\t\t\t\t\t\t\t\telse return 1619;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1620;\n\t\t\t\t\t\t\t\telse return 1621;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1622;\n\t\t\t\t\t\t\t\telse return 1623;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1624;\n\t\t\t\t\t\t\t\telse return 1625;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1626;\n\t\t\t\t\t\t\t\telse return 1627;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1628;\n\t\t\t\t\t\t\t\telse return 1629;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1630;\n\t\t\t\t\t\t\t\telse return 1631;\n\t\t\telse if (Age == 6)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1632;\n\t\t\t\t\t\t\t\telse return 1633;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1634;\n\t\t\t\t\t\t\t\telse return 1635;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1636;\n\t\t\t\t\t\t\t\telse return 1637;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1638;\n\t\t\t\t\t\t\t\telse return 1639;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1640;\n\t\t\t\t\t\t\t\telse return 1641;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1642;\n\t\t\t\t\t\t\t\telse return 1643;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1644;\n\t\t\t\t\t\t\t\telse return 1645;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1646;\n\t\t\t\t\t\t\t\telse return 1647;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1648;\n\t\t\t\t\t\t\t\telse return 1649;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1650;\n\t\t\t\t\t\t\t\telse return 1651;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1652;\n\t\t\t\t\t\t\t\telse return 1653;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1654;\n\t\t\t\t\t\t\t\telse return 1655;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1656;\n\t\t\t\t\t\t\t\telse return 1657;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1658;\n\t\t\t\t\t\t\t\telse return 1659;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1660;\n\t\t\t\t\t\t\t\telse return 1661;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1662;\n\t\t\t\t\t\t\t\telse return 1663;\n\t\t\telse if (Age == 7)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1664;\n\t\t\t\t\t\t\t\telse return 1665;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1666;\n\t\t\t\t\t\t\t\telse return 1667;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1668;\n\t\t\t\t\t\t\t\telse return 1669;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1670;\n\t\t\t\t\t\t\t\telse return 1671;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1672;\n\t\t\t\t\t\t\t\telse return 1673;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1674;\n\t\t\t\t\t\t\t\telse return 1675;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1676;\n\t\t\t\t\t\t\t\telse return 1677;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1678;\n\t\t\t\t\t\t\t\telse return 1679;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1680;\n\t\t\t\t\t\t\t\telse return 1681;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1682;\n\t\t\t\t\t\t\t\telse return 1683;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1684;\n\t\t\t\t\t\t\t\telse return 1685;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1686;\n\t\t\t\t\t\t\t\telse return 1687;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1688;\n\t\t\t\t\t\t\t\telse return 1689;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1690;\n\t\t\t\t\t\t\t\telse return 1691;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1692;\n\t\t\t\t\t\t\t\telse return 1693;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1694;\n\t\t\t\t\t\t\t\telse return 1695;\n\t\t\telse if (Age == 8)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1696;\n\t\t\t\t\t\t\t\telse return 1697;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1698;\n\t\t\t\t\t\t\t\telse return 1699;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1700;\n\t\t\t\t\t\t\t\telse return 1701;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1702;\n\t\t\t\t\t\t\t\telse return 1703;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1704;\n\t\t\t\t\t\t\t\telse return 1705;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1706;\n\t\t\t\t\t\t\t\telse return 1707;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1708;\n\t\t\t\t\t\t\t\telse return 1709;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1710;\n\t\t\t\t\t\t\t\telse return 1711;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1712;\n\t\t\t\t\t\t\t\telse return 1713;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1714;\n\t\t\t\t\t\t\t\telse return 1715;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1716;\n\t\t\t\t\t\t\t\telse return 1717;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1718;\n\t\t\t\t\t\t\t\telse return 1719;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1720;\n\t\t\t\t\t\t\t\telse return 1721;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1722;\n\t\t\t\t\t\t\t\telse return 1723;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1724;\n\t\t\t\t\t\t\t\telse return 1725;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1726;\n\t\t\t\t\t\t\t\telse return 1727;\n\t\t\telse if (Age == 9)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1728;\n\t\t\t\t\t\t\t\telse return 1729;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1730;\n\t\t\t\t\t\t\t\telse return 1731;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1732;\n\t\t\t\t\t\t\t\telse return 1733;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1734;\n\t\t\t\t\t\t\t\telse return 1735;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1736;\n\t\t\t\t\t\t\t\telse return 1737;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1738;\n\t\t\t\t\t\t\t\telse return 1739;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1740;\n\t\t\t\t\t\t\t\telse return 1741;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1742;\n\t\t\t\t\t\t\t\telse return 1743;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1744;\n\t\t\t\t\t\t\t\telse return 1745;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1746;\n\t\t\t\t\t\t\t\telse return 1747;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1748;\n\t\t\t\t\t\t\t\telse return 1749;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1750;\n\t\t\t\t\t\t\t\telse return 1751;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1752;\n\t\t\t\t\t\t\t\telse return 1753;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1754;\n\t\t\t\t\t\t\t\telse return 1755;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1756;\n\t\t\t\t\t\t\t\telse return 1757;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1758;\n\t\t\t\t\t\t\t\telse return 1759;\n\t\t\telse if (Age == 10)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1760;\n\t\t\t\t\t\t\t\telse return 1761;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1762;\n\t\t\t\t\t\t\t\telse return 1763;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1764;\n\t\t\t\t\t\t\t\telse return 1765;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1766;\n\t\t\t\t\t\t\t\telse return 1767;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1768;\n\t\t\t\t\t\t\t\telse return 1769;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1770;\n\t\t\t\t\t\t\t\telse return 1771;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1772;\n\t\t\t\t\t\t\t\telse return 1773;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1774;\n\t\t\t\t\t\t\t\telse return 1775;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1776;\n\t\t\t\t\t\t\t\telse return 1777;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1778;\n\t\t\t\t\t\t\t\telse return 1779;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1780;\n\t\t\t\t\t\t\t\telse return 1781;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1782;\n\t\t\t\t\t\t\t\telse return 1783;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1784;\n\t\t\t\t\t\t\t\telse return 1785;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1786;\n\t\t\t\t\t\t\t\telse return 1787;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1788;\n\t\t\t\t\t\t\t\telse return 1789;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1790;\n\t\t\t\t\t\t\t\telse return 1791;\n\t\t\telse if (Age == 11)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1792;\n\t\t\t\t\t\t\t\telse return 1793;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1794;\n\t\t\t\t\t\t\t\telse return 1795;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1796;\n\t\t\t\t\t\t\t\telse return 1797;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1798;\n\t\t\t\t\t\t\t\telse return 1799;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1800;\n\t\t\t\t\t\t\t\telse return 1801;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1802;\n\t\t\t\t\t\t\t\telse return 1803;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1804;\n\t\t\t\t\t\t\t\telse return 1805;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1806;\n\t\t\t\t\t\t\t\telse return 1807;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1808;\n\t\t\t\t\t\t\t\telse return 1809;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1810;\n\t\t\t\t\t\t\t\telse return 1811;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1812;\n\t\t\t\t\t\t\t\telse return 1813;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1814;\n\t\t\t\t\t\t\t\telse return 1815;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1816;\n\t\t\t\t\t\t\t\telse return 1817;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1818;\n\t\t\t\t\t\t\t\telse return 1819;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1820;\n\t\t\t\t\t\t\t\telse return 1821;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1822;\n\t\t\t\t\t\t\t\telse return 1823;\n\t\t\telse if (Age == 12)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1824;\n\t\t\t\t\t\t\t\telse return 1825;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1826;\n\t\t\t\t\t\t\t\telse return 1827;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1828;\n\t\t\t\t\t\t\t\telse return 1829;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1830;\n\t\t\t\t\t\t\t\telse return 1831;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1832;\n\t\t\t\t\t\t\t\telse return 1833;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1834;\n\t\t\t\t\t\t\t\telse return 1835;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1836;\n\t\t\t\t\t\t\t\telse return 1837;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1838;\n\t\t\t\t\t\t\t\telse return 1839;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1840;\n\t\t\t\t\t\t\t\telse return 1841;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1842;\n\t\t\t\t\t\t\t\telse return 1843;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1844;\n\t\t\t\t\t\t\t\telse return 1845;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1846;\n\t\t\t\t\t\t\t\telse return 1847;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1848;\n\t\t\t\t\t\t\t\telse return 1849;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1850;\n\t\t\t\t\t\t\t\telse return 1851;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1852;\n\t\t\t\t\t\t\t\telse return 1853;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1854;\n\t\t\t\t\t\t\t\telse return 1855;\n\t\t\telse if (Age == 13)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1856;\n\t\t\t\t\t\t\t\telse return 1857;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1858;\n\t\t\t\t\t\t\t\telse return 1859;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1860;\n\t\t\t\t\t\t\t\telse return 1861;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1862;\n\t\t\t\t\t\t\t\telse return 1863;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1864;\n\t\t\t\t\t\t\t\telse return 1865;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1866;\n\t\t\t\t\t\t\t\telse return 1867;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1868;\n\t\t\t\t\t\t\t\telse return 1869;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1870;\n\t\t\t\t\t\t\t\telse return 1871;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1872;\n\t\t\t\t\t\t\t\telse return 1873;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1874;\n\t\t\t\t\t\t\t\telse return 1875;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1876;\n\t\t\t\t\t\t\t\telse return 1877;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1878;\n\t\t\t\t\t\t\t\telse return 1879;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1880;\n\t\t\t\t\t\t\t\telse return 1881;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1882;\n\t\t\t\t\t\t\t\telse return 1883;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1884;\n\t\t\t\t\t\t\t\telse return 1885;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1886;\n\t\t\t\t\t\t\t\telse return 1887;\n\t\t\telse if (Age == 14)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1888;\n\t\t\t\t\t\t\t\telse return 1889;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1890;\n\t\t\t\t\t\t\t\telse return 1891;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1892;\n\t\t\t\t\t\t\t\telse return 1893;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1894;\n\t\t\t\t\t\t\t\telse return 1895;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1896;\n\t\t\t\t\t\t\t\telse return 1897;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1898;\n\t\t\t\t\t\t\t\telse return 1899;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1900;\n\t\t\t\t\t\t\t\telse return 1901;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1902;\n\t\t\t\t\t\t\t\telse return 1903;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1904;\n\t\t\t\t\t\t\t\telse return 1905;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1906;\n\t\t\t\t\t\t\t\telse return 1907;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1908;\n\t\t\t\t\t\t\t\telse return 1909;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1910;\n\t\t\t\t\t\t\t\telse return 1911;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1912;\n\t\t\t\t\t\t\t\telse return 1913;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1914;\n\t\t\t\t\t\t\t\telse return 1915;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1916;\n\t\t\t\t\t\t\t\telse return 1917;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1918;\n\t\t\t\t\t\t\t\telse return 1919;\n\t\t\telse\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1920;\n\t\t\t\t\t\t\t\telse return 1921;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1922;\n\t\t\t\t\t\t\t\telse return 1923;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1924;\n\t\t\t\t\t\t\t\telse return 1925;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1926;\n\t\t\t\t\t\t\t\telse return 1927;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1928;\n\t\t\t\t\t\t\t\telse return 1929;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1930;\n\t\t\t\t\t\t\t\telse return 1931;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1932;\n\t\t\t\t\t\t\t\telse return 1933;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1934;\n\t\t\t\t\t\t\t\telse return 1935;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1936;\n\t\t\t\t\t\t\t\telse return 1937;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1938;\n\t\t\t\t\t\t\t\telse return 1939;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1940;\n\t\t\t\t\t\t\t\telse return 1941;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1942;\n\t\t\t\t\t\t\t\telse return 1943;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1944;\n\t\t\t\t\t\t\t\telse return 1945;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1946;\n\t\t\t\t\t\t\t\telse return 1947;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 1948;\n\t\t\t\t\t\t\t\telse return 1949;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 1950;\n\t\t\t\t\t\t\t\telse return 1951;\n\t\t}\n\t\tBlockState Fire();\n\t\tunsigned char Age(BlockState Block);\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace FireCoral\n\t{\n\t\tconstexpr BlockState FireCoral()\n\t\t{\n\t\t\treturn 9537;\n\t\t}\n\t}\n\tnamespace FireCoralBlock\n\t{\n\t\tconstexpr BlockState FireCoralBlock()\n\t\t{\n\t\t\treturn 9518;\n\t\t}\n\t}\n\tnamespace FireCoralFan\n\t{\n\t\tconstexpr BlockState FireCoralFan()\n\t\t{\n\t\t\treturn 9557;\n\t\t}\n\t}\n\tnamespace FireCoralWallFan\n\t{\n\t\tconstexpr BlockState FireCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9625;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9627;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9629;\n\t\t\telse return 9631;\n\t\t}\n\t\tBlockState FireCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace FletchingTable\n\t{\n\t\tconstexpr BlockState FletchingTable()\n\t\t{\n\t\t\treturn 14820;\n\t\t}\n\t}\n\tnamespace FlowerPot\n\t{\n\t\tconstexpr BlockState FlowerPot()\n\t\t{\n\t\t\treturn 6305;\n\t\t}\n\t}\n\tnamespace FrostedIce\n\t{\n\t\tconstexpr BlockState FrostedIce(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 9249;\n\t\t\telse if (Age == 1) return 9250;\n\t\t\telse if (Age == 2) return 9251;\n\t\t\telse return 9252;\n\t\t}\n\t\tBlockState FrostedIce();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace Furnace\n\t{\n\t\tconstexpr BlockState Furnace(const eBlockFace Facing, const bool Lit)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Lit) return 3373;\n\t\t\t\telse return 3374;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Lit) return 3375;\n\t\t\t\telse return 3376;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Lit) return 3377;\n\t\t\t\telse return 3378;\n\t\t\telse\n\t\t\t\tif (Lit) return 3379;\n\t\t\t\telse return 3380;\n\t\t}\n\t\tBlockState Furnace();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Lit(BlockState Block);\n\t}\n\tnamespace GildedBlackstone\n\t{\n\t\tconstexpr BlockState GildedBlackstone()\n\t\t{\n\t\t\treturn 16664;\n\t\t}\n\t}\n\tnamespace Glass\n\t{\n\t\tconstexpr BlockState Glass()\n\t\t{\n\t\t\treturn 231;\n\t\t}\n\t}\n\tnamespace GlassPane\n\t{\n\t\tconstexpr BlockState GlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 4733;\n\t\t\t\t\t\telse return 4734;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 4737;\n\t\t\t\t\t\telse return 4738;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 4741;\n\t\t\t\t\t\telse return 4742;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 4745;\n\t\t\t\t\t\telse return 4746;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 4749;\n\t\t\t\t\t\telse return 4750;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 4753;\n\t\t\t\t\t\telse return 4754;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 4757;\n\t\t\t\t\t\telse return 4758;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 4761;\n\t\t\t\t\t\telse return 4762;\n\t\t}\n\t\tBlockState GlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace Glowstone\n\t{\n\t\tconstexpr BlockState Glowstone()\n\t\t{\n\t\t\treturn 4013;\n\t\t}\n\t}\n\tnamespace GoldBlock\n\t{\n\t\tconstexpr BlockState GoldBlock()\n\t\t{\n\t\t\treturn 1427;\n\t\t}\n\t}\n\tnamespace GoldOre\n\t{\n\t\tconstexpr BlockState GoldOre()\n\t\t{\n\t\t\treturn 69;\n\t\t}\n\t}\n\tnamespace Granite\n\t{\n\t\tconstexpr BlockState Granite()\n\t\t{\n\t\t\treturn 2;\n\t\t}\n\t}\n\tnamespace GraniteSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState GraniteSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10838;\n\t\t\telse if (Type == Type::Bottom) return 10840;\n\t\t\telse return 10842;\n\t\t}\n\t\tBlockState GraniteSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace GraniteStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState GraniteStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10390;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10392;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10394;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10396;\n\t\t\t\t\telse return 10398;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10400;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10402;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10404;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10406;\n\t\t\t\t\telse return 10408;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10410;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10412;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10414;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10416;\n\t\t\t\t\telse return 10418;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10420;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10422;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10424;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10426;\n\t\t\t\t\telse return 10428;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10430;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10432;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10434;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10436;\n\t\t\t\t\telse return 10438;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10440;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10442;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10444;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10446;\n\t\t\t\t\telse return 10448;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10450;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10452;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10454;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10456;\n\t\t\t\t\telse return 10458;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10460;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10462;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10464;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10466;\n\t\t\t\t\telse return 10468;\n\t\t}\n\t\tBlockState GraniteStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace GraniteWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState GraniteWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12166;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12167;\n\t\t\t\t\t\t\telse return 12168;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12172;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12173;\n\t\t\t\t\t\t\telse return 12174;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12178;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12179;\n\t\t\t\t\t\t\telse return 12180;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12184;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12185;\n\t\t\t\t\t\t\telse return 12186;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12190;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12191;\n\t\t\t\t\t\t\telse return 12192;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12196;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12197;\n\t\t\t\t\t\t\telse return 12198;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12202;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12203;\n\t\t\t\t\t\t\telse return 12204;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12208;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12209;\n\t\t\t\t\t\t\telse return 12210;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12214;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12215;\n\t\t\t\t\t\t\telse return 12216;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12220;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12221;\n\t\t\t\t\t\t\telse return 12222;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12226;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12227;\n\t\t\t\t\t\t\telse return 12228;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12232;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12233;\n\t\t\t\t\t\t\telse return 12234;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12238;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12239;\n\t\t\t\t\t\t\telse return 12240;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12244;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12245;\n\t\t\t\t\t\t\telse return 12246;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12250;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12251;\n\t\t\t\t\t\t\telse return 12252;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12256;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12257;\n\t\t\t\t\t\t\telse return 12258;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12262;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12263;\n\t\t\t\t\t\t\telse return 12264;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12268;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12269;\n\t\t\t\t\t\t\telse return 12270;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12274;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12275;\n\t\t\t\t\t\t\telse return 12276;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12280;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12281;\n\t\t\t\t\t\t\telse return 12282;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12286;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12287;\n\t\t\t\t\t\t\telse return 12288;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12292;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12293;\n\t\t\t\t\t\t\telse return 12294;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12298;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12299;\n\t\t\t\t\t\t\telse return 12300;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12304;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12305;\n\t\t\t\t\t\t\telse return 12306;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12310;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12311;\n\t\t\t\t\t\t\telse return 12312;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12316;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12317;\n\t\t\t\t\t\t\telse return 12318;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12322;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12323;\n\t\t\t\t\t\t\telse return 12324;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12328;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12329;\n\t\t\t\t\t\t\telse return 12330;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12334;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12335;\n\t\t\t\t\t\t\telse return 12336;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12340;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12341;\n\t\t\t\t\t\t\telse return 12342;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12346;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12347;\n\t\t\t\t\t\t\telse return 12348;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12352;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12353;\n\t\t\t\t\t\t\telse return 12354;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12358;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12359;\n\t\t\t\t\t\t\telse return 12360;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12364;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12365;\n\t\t\t\t\t\t\telse return 12366;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12370;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12371;\n\t\t\t\t\t\t\telse return 12372;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12376;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12377;\n\t\t\t\t\t\t\telse return 12378;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12382;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12383;\n\t\t\t\t\t\t\telse return 12384;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12388;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12389;\n\t\t\t\t\t\t\telse return 12390;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12394;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12395;\n\t\t\t\t\t\t\telse return 12396;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12400;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12401;\n\t\t\t\t\t\t\telse return 12402;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12406;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12407;\n\t\t\t\t\t\t\telse return 12408;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12412;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12413;\n\t\t\t\t\t\t\telse return 12414;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12418;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12419;\n\t\t\t\t\t\t\telse return 12420;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12424;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12425;\n\t\t\t\t\t\t\telse return 12426;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12430;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12431;\n\t\t\t\t\t\t\telse return 12432;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12436;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12437;\n\t\t\t\t\t\t\telse return 12438;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12442;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12443;\n\t\t\t\t\t\t\telse return 12444;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12448;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12449;\n\t\t\t\t\t\t\telse return 12450;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12454;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12455;\n\t\t\t\t\t\t\telse return 12456;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12460;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12461;\n\t\t\t\t\t\t\telse return 12462;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12466;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12467;\n\t\t\t\t\t\t\telse return 12468;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12472;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12473;\n\t\t\t\t\t\t\telse return 12474;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12478;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12479;\n\t\t\t\t\t\t\telse return 12480;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12484;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12485;\n\t\t\t\t\t\t\telse return 12486;\n\t\t}\n\t\tBlockState GraniteWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace Grass\n\t{\n\t\tconstexpr BlockState Grass()\n\t\t{\n\t\t\treturn 1342;\n\t\t}\n\t}\n\tnamespace GrassBlock\n\t{\n\t\tconstexpr BlockState GrassBlock(const bool Snowy)\n\t\t{\n\t\t\tif (Snowy) return 8;\n\t\t\telse return 9;\n\t\t}\n\t\tBlockState GrassBlock();\n\t\tbool Snowy(BlockState Block);\n\t}\n\tnamespace GrassPath\n\t{\n\t\tconstexpr BlockState GrassPath()\n\t\t{\n\t\t\treturn 9223;\n\t\t}\n\t}\n\tnamespace Gravel\n\t{\n\t\tconstexpr BlockState Gravel()\n\t\t{\n\t\t\treturn 68;\n\t\t}\n\t}\n\tnamespace GrayBanner\n\t{\n\t\tconstexpr BlockState GrayBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8009;\n\t\t\telse if (Rotation == 1) return 8010;\n\t\t\telse if (Rotation == 2) return 8011;\n\t\t\telse if (Rotation == 3) return 8012;\n\t\t\telse if (Rotation == 4) return 8013;\n\t\t\telse if (Rotation == 5) return 8014;\n\t\t\telse if (Rotation == 6) return 8015;\n\t\t\telse if (Rotation == 7) return 8016;\n\t\t\telse if (Rotation == 8) return 8017;\n\t\t\telse if (Rotation == 9) return 8018;\n\t\t\telse if (Rotation == 10) return 8019;\n\t\t\telse if (Rotation == 11) return 8020;\n\t\t\telse if (Rotation == 12) return 8021;\n\t\t\telse if (Rotation == 13) return 8022;\n\t\t\telse if (Rotation == 14) return 8023;\n\t\t\telse return 8024;\n\t\t}\n\t\tBlockState GrayBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace GrayBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState GrayBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1161;\n\t\t\t\t\telse return 1162;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1163;\n\t\t\t\t\telse return 1164;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1165;\n\t\t\t\t\telse return 1166;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1167;\n\t\t\t\t\telse return 1168;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1169;\n\t\t\t\t\telse return 1170;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1171;\n\t\t\t\t\telse return 1172;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1173;\n\t\t\t\t\telse return 1174;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1175;\n\t\t\t\t\telse return 1176;\n\t\t}\n\t\tBlockState GrayBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace GrayCarpet\n\t{\n\t\tconstexpr BlockState GrayCarpet()\n\t\t{\n\t\t\treturn 7873;\n\t\t}\n\t}\n\tnamespace GrayConcrete\n\t{\n\t\tconstexpr BlockState GrayConcrete()\n\t\t{\n\t\t\treturn 9445;\n\t\t}\n\t}\n\tnamespace GrayConcretePowder\n\t{\n\t\tconstexpr BlockState GrayConcretePowder()\n\t\t{\n\t\t\treturn 9461;\n\t\t}\n\t}\n\tnamespace GrayGlazedTerracotta\n\t{\n\t\tconstexpr BlockState GrayGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9402;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9403;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9404;\n\t\t\telse return 9405;\n\t\t}\n\t\tBlockState GrayGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace GrayShulkerBox\n\t{\n\t\tconstexpr BlockState GrayShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9320;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9321;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9322;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9323;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9324;\n\t\t\telse return 9325;\n\t\t}\n\t\tBlockState GrayShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace GrayStainedGlass\n\t{\n\t\tconstexpr BlockState GrayStainedGlass()\n\t\t{\n\t\t\treturn 4102;\n\t\t}\n\t}\n\tnamespace GrayStainedGlassPane\n\t{\n\t\tconstexpr BlockState GrayStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7089;\n\t\t\t\t\t\telse return 7090;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7093;\n\t\t\t\t\t\telse return 7094;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7097;\n\t\t\t\t\t\telse return 7098;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7101;\n\t\t\t\t\t\telse return 7102;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7105;\n\t\t\t\t\t\telse return 7106;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7109;\n\t\t\t\t\t\telse return 7110;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7113;\n\t\t\t\t\t\telse return 7114;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7117;\n\t\t\t\t\t\telse return 7118;\n\t\t}\n\t\tBlockState GrayStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace GrayTerracotta\n\t{\n\t\tconstexpr BlockState GrayTerracotta()\n\t\t{\n\t\t\treturn 6854;\n\t\t}\n\t}\n\tnamespace GrayWallBanner\n\t{\n\t\tconstexpr BlockState GrayWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8181;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8182;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8183;\n\t\t\telse return 8184;\n\t\t}\n\t\tBlockState GrayWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace GrayWool\n\t{\n\t\tconstexpr BlockState GrayWool()\n\t\t{\n\t\t\treturn 1391;\n\t\t}\n\t}\n\tnamespace GreenBanner\n\t{\n\t\tconstexpr BlockState GreenBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8105;\n\t\t\telse if (Rotation == 1) return 8106;\n\t\t\telse if (Rotation == 2) return 8107;\n\t\t\telse if (Rotation == 3) return 8108;\n\t\t\telse if (Rotation == 4) return 8109;\n\t\t\telse if (Rotation == 5) return 8110;\n\t\t\telse if (Rotation == 6) return 8111;\n\t\t\telse if (Rotation == 7) return 8112;\n\t\t\telse if (Rotation == 8) return 8113;\n\t\t\telse if (Rotation == 9) return 8114;\n\t\t\telse if (Rotation == 10) return 8115;\n\t\t\telse if (Rotation == 11) return 8116;\n\t\t\telse if (Rotation == 12) return 8117;\n\t\t\telse if (Rotation == 13) return 8118;\n\t\t\telse if (Rotation == 14) return 8119;\n\t\t\telse return 8120;\n\t\t}\n\t\tBlockState GreenBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace GreenBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState GreenBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1257;\n\t\t\t\t\telse return 1258;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1259;\n\t\t\t\t\telse return 1260;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1261;\n\t\t\t\t\telse return 1262;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1263;\n\t\t\t\t\telse return 1264;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1265;\n\t\t\t\t\telse return 1266;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1267;\n\t\t\t\t\telse return 1268;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1269;\n\t\t\t\t\telse return 1270;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1271;\n\t\t\t\t\telse return 1272;\n\t\t}\n\t\tBlockState GreenBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace GreenCarpet\n\t{\n\t\tconstexpr BlockState GreenCarpet()\n\t\t{\n\t\t\treturn 7879;\n\t\t}\n\t}\n\tnamespace GreenConcrete\n\t{\n\t\tconstexpr BlockState GreenConcrete()\n\t\t{\n\t\t\treturn 9451;\n\t\t}\n\t}\n\tnamespace GreenConcretePowder\n\t{\n\t\tconstexpr BlockState GreenConcretePowder()\n\t\t{\n\t\t\treturn 9467;\n\t\t}\n\t}\n\tnamespace GreenGlazedTerracotta\n\t{\n\t\tconstexpr BlockState GreenGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9426;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9427;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9428;\n\t\t\telse return 9429;\n\t\t}\n\t\tBlockState GreenGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace GreenShulkerBox\n\t{\n\t\tconstexpr BlockState GreenShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9356;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9357;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9358;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9359;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9360;\n\t\t\telse return 9361;\n\t\t}\n\t\tBlockState GreenShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace GreenStainedGlass\n\t{\n\t\tconstexpr BlockState GreenStainedGlass()\n\t\t{\n\t\t\treturn 4108;\n\t\t}\n\t}\n\tnamespace GreenStainedGlassPane\n\t{\n\t\tconstexpr BlockState GreenStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7281;\n\t\t\t\t\t\telse return 7282;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7285;\n\t\t\t\t\t\telse return 7286;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7289;\n\t\t\t\t\t\telse return 7290;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7293;\n\t\t\t\t\t\telse return 7294;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7297;\n\t\t\t\t\t\telse return 7298;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7301;\n\t\t\t\t\t\telse return 7302;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7305;\n\t\t\t\t\t\telse return 7306;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7309;\n\t\t\t\t\t\telse return 7310;\n\t\t}\n\t\tBlockState GreenStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace GreenTerracotta\n\t{\n\t\tconstexpr BlockState GreenTerracotta()\n\t\t{\n\t\t\treturn 6860;\n\t\t}\n\t}\n\tnamespace GreenWallBanner\n\t{\n\t\tconstexpr BlockState GreenWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8205;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8206;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8207;\n\t\t\telse return 8208;\n\t\t}\n\t\tBlockState GreenWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace GreenWool\n\t{\n\t\tconstexpr BlockState GreenWool()\n\t\t{\n\t\t\treturn 1397;\n\t\t}\n\t}\n\tnamespace Grindstone\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState Grindstone(const enum Face Face, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 14821;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 14822;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 14823;\n\t\t\t\telse return 14824;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 14825;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 14826;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 14827;\n\t\t\t\telse return 14828;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 14829;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 14830;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 14831;\n\t\t\t\telse return 14832;\n\t\t}\n\t\tBlockState Grindstone();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace HayBale\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState HayBale(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 7863;\n\t\t\telse if (Axis == Axis::Y) return 7864;\n\t\t\telse return 7865;\n\t\t}\n\t\tBlockState HayBale();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace HeavyWeightedPressurePlate\n\t{\n\t\tconstexpr BlockState HeavyWeightedPressurePlate(const unsigned char Power)\n\t\t{\n\t\t\tif (Power == 0) return 6662;\n\t\t\telse if (Power == 1) return 6663;\n\t\t\telse if (Power == 2) return 6664;\n\t\t\telse if (Power == 3) return 6665;\n\t\t\telse if (Power == 4) return 6666;\n\t\t\telse if (Power == 5) return 6667;\n\t\t\telse if (Power == 6) return 6668;\n\t\t\telse if (Power == 7) return 6669;\n\t\t\telse if (Power == 8) return 6670;\n\t\t\telse if (Power == 9) return 6671;\n\t\t\telse if (Power == 10) return 6672;\n\t\t\telse if (Power == 11) return 6673;\n\t\t\telse if (Power == 12) return 6674;\n\t\t\telse if (Power == 13) return 6675;\n\t\t\telse if (Power == 14) return 6676;\n\t\t\telse return 6677;\n\t\t}\n\t\tBlockState HeavyWeightedPressurePlate();\n\t\tunsigned char Power(BlockState Block);\n\t}\n\tnamespace HoneyBlock\n\t{\n\t\tconstexpr BlockState HoneyBlock()\n\t\t{\n\t\t\treturn 15824;\n\t\t}\n\t}\n\tnamespace HoneycombBlock\n\t{\n\t\tconstexpr BlockState HoneycombBlock()\n\t\t{\n\t\t\treturn 15825;\n\t\t}\n\t}\n\tnamespace Hopper\n\t{\n\t\tconstexpr BlockState Hopper(const bool Enabled, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Enabled)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_YM) return 6728;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZM) return 6729;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6730;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6731;\n\t\t\t\telse return 6732;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_YM) return 6733;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZM) return 6734;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6735;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6736;\n\t\t\t\telse return 6737;\n\t\t}\n\t\tBlockState Hopper();\n\t\tbool Enabled(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace HornCoral\n\t{\n\t\tconstexpr BlockState HornCoral()\n\t\t{\n\t\t\treturn 9539;\n\t\t}\n\t}\n\tnamespace HornCoralBlock\n\t{\n\t\tconstexpr BlockState HornCoralBlock()\n\t\t{\n\t\t\treturn 9519;\n\t\t}\n\t}\n\tnamespace HornCoralFan\n\t{\n\t\tconstexpr BlockState HornCoralFan()\n\t\t{\n\t\t\treturn 9559;\n\t\t}\n\t}\n\tnamespace HornCoralWallFan\n\t{\n\t\tconstexpr BlockState HornCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9633;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9635;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9637;\n\t\t\telse return 9639;\n\t\t}\n\t\tBlockState HornCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Ice\n\t{\n\t\tconstexpr BlockState Ice()\n\t\t{\n\t\t\treturn 3929;\n\t\t}\n\t}\n\tnamespace InfestedChiseledStoneBricks\n\t{\n\t\tconstexpr BlockState InfestedChiseledStoneBricks()\n\t\t{\n\t\t\treturn 4504;\n\t\t}\n\t}\n\tnamespace InfestedCobblestone\n\t{\n\t\tconstexpr BlockState InfestedCobblestone()\n\t\t{\n\t\t\treturn 4500;\n\t\t}\n\t}\n\tnamespace InfestedCrackedStoneBricks\n\t{\n\t\tconstexpr BlockState InfestedCrackedStoneBricks()\n\t\t{\n\t\t\treturn 4503;\n\t\t}\n\t}\n\tnamespace InfestedMossyStoneBricks\n\t{\n\t\tconstexpr BlockState InfestedMossyStoneBricks()\n\t\t{\n\t\t\treturn 4502;\n\t\t}\n\t}\n\tnamespace InfestedStone\n\t{\n\t\tconstexpr BlockState InfestedStone()\n\t\t{\n\t\t\treturn 4499;\n\t\t}\n\t}\n\tnamespace InfestedStoneBricks\n\t{\n\t\tconstexpr BlockState InfestedStoneBricks()\n\t\t{\n\t\t\treturn 4501;\n\t\t}\n\t}\n\tnamespace IronBars\n\t{\n\t\tconstexpr BlockState IronBars(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 4699;\n\t\t\t\t\t\telse return 4700;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 4703;\n\t\t\t\t\t\telse return 4704;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 4707;\n\t\t\t\t\t\telse return 4708;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 4711;\n\t\t\t\t\t\telse return 4712;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 4715;\n\t\t\t\t\t\telse return 4716;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 4719;\n\t\t\t\t\t\telse return 4720;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 4723;\n\t\t\t\t\t\telse return 4724;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 4727;\n\t\t\t\t\t\telse return 4728;\n\t\t}\n\t\tBlockState IronBars();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace IronBlock\n\t{\n\t\tconstexpr BlockState IronBlock()\n\t\t{\n\t\t\treturn 1428;\n\t\t}\n\t}\n\tnamespace IronDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState IronDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3809;\n\t\t\t\t\t\t\telse return 3810;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3811;\n\t\t\t\t\t\t\telse return 3812;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3813;\n\t\t\t\t\t\t\telse return 3814;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3815;\n\t\t\t\t\t\t\telse return 3816;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3817;\n\t\t\t\t\t\t\telse return 3818;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3819;\n\t\t\t\t\t\t\telse return 3820;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3821;\n\t\t\t\t\t\t\telse return 3822;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3823;\n\t\t\t\t\t\t\telse return 3824;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3825;\n\t\t\t\t\t\t\telse return 3826;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3827;\n\t\t\t\t\t\t\telse return 3828;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3829;\n\t\t\t\t\t\t\telse return 3830;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3831;\n\t\t\t\t\t\t\telse return 3832;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3833;\n\t\t\t\t\t\t\telse return 3834;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3835;\n\t\t\t\t\t\t\telse return 3836;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3837;\n\t\t\t\t\t\t\telse return 3838;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3839;\n\t\t\t\t\t\t\telse return 3840;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3841;\n\t\t\t\t\t\t\telse return 3842;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3843;\n\t\t\t\t\t\t\telse return 3844;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3845;\n\t\t\t\t\t\t\telse return 3846;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3847;\n\t\t\t\t\t\t\telse return 3848;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3849;\n\t\t\t\t\t\t\telse return 3850;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3851;\n\t\t\t\t\t\t\telse return 3852;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3853;\n\t\t\t\t\t\t\telse return 3854;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3855;\n\t\t\t\t\t\t\telse return 3856;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3857;\n\t\t\t\t\t\t\telse return 3858;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3859;\n\t\t\t\t\t\t\telse return 3860;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3861;\n\t\t\t\t\t\t\telse return 3862;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3863;\n\t\t\t\t\t\t\telse return 3864;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3865;\n\t\t\t\t\t\t\telse return 3866;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3867;\n\t\t\t\t\t\t\telse return 3868;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3869;\n\t\t\t\t\t\t\telse return 3870;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3871;\n\t\t\t\t\t\t\telse return 3872;\n\t\t}\n\t\tBlockState IronDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace IronOre\n\t{\n\t\tconstexpr BlockState IronOre()\n\t\t{\n\t\t\treturn 70;\n\t\t}\n\t}\n\tnamespace IronTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState IronTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 7538;\n\t\t\t\t\t\telse return 7540;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 7542;\n\t\t\t\t\t\telse return 7544;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 7546;\n\t\t\t\t\t\telse return 7548;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 7550;\n\t\t\t\t\t\telse return 7552;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 7554;\n\t\t\t\t\t\telse return 7556;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 7558;\n\t\t\t\t\t\telse return 7560;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 7562;\n\t\t\t\t\t\telse return 7564;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 7566;\n\t\t\t\t\t\telse return 7568;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 7570;\n\t\t\t\t\t\telse return 7572;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 7574;\n\t\t\t\t\t\telse return 7576;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 7578;\n\t\t\t\t\t\telse return 7580;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 7582;\n\t\t\t\t\t\telse return 7584;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 7586;\n\t\t\t\t\t\telse return 7588;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 7590;\n\t\t\t\t\t\telse return 7592;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 7594;\n\t\t\t\t\t\telse return 7596;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 7598;\n\t\t\t\t\t\telse return 7600;\n\t\t}\n\t\tBlockState IronTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace JackOLantern\n\t{\n\t\tconstexpr BlockState JackOLantern(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 4020;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 4021;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 4022;\n\t\t\telse return 4023;\n\t\t}\n\t\tBlockState JackOLantern();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Jigsaw\n\t{\n\t\tenum class Orientation\n\t\t{\n\t\t\tDownEast,\n\t\t\tDownNorth,\n\t\t\tDownSouth,\n\t\t\tDownWest,\n\t\t\tUpEast,\n\t\t\tUpNorth,\n\t\t\tUpSouth,\n\t\t\tUpWest,\n\t\t\tWestUp,\n\t\t\tEastUp,\n\t\t\tNorthUp,\n\t\t\tSouthUp\n\t\t};\n\t\tconstexpr BlockState Jigsaw(const enum Orientation Orientation)\n\t\t{\n\t\t\tif (Orientation == Orientation::DownEast) return 15739;\n\t\t\telse if (Orientation == Orientation::DownNorth) return 15740;\n\t\t\telse if (Orientation == Orientation::DownSouth) return 15741;\n\t\t\telse if (Orientation == Orientation::DownWest) return 15742;\n\t\t\telse if (Orientation == Orientation::UpEast) return 15743;\n\t\t\telse if (Orientation == Orientation::UpNorth) return 15744;\n\t\t\telse if (Orientation == Orientation::UpSouth) return 15745;\n\t\t\telse if (Orientation == Orientation::UpWest) return 15746;\n\t\t\telse if (Orientation == Orientation::WestUp) return 15747;\n\t\t\telse if (Orientation == Orientation::EastUp) return 15748;\n\t\t\telse if (Orientation == Orientation::NorthUp) return 15749;\n\t\t\telse return 15750;\n\t\t}\n\t\tBlockState Jigsaw();\n\t\tenum Orientation Orientation(BlockState Block);\n\t}\n\tnamespace Jukebox\n\t{\n\t\tconstexpr BlockState Jukebox(const bool HasRecord)\n\t\t{\n\t\t\tif (HasRecord) return 3964;\n\t\t\telse return 3965;\n\t\t}\n\t\tBlockState Jukebox();\n\t\tbool HasRecord(BlockState Block);\n\t}\n\tnamespace JungleButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState JungleButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6418;\n\t\t\t\t\telse return 6419;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6420;\n\t\t\t\t\telse return 6421;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6422;\n\t\t\t\t\telse return 6423;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6424;\n\t\t\t\t\telse return 6425;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6426;\n\t\t\t\t\telse return 6427;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6428;\n\t\t\t\t\telse return 6429;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6430;\n\t\t\t\t\telse return 6431;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6432;\n\t\t\t\t\telse return 6433;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6434;\n\t\t\t\t\telse return 6435;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6436;\n\t\t\t\t\telse return 6437;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6438;\n\t\t\t\t\telse return 6439;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6440;\n\t\t\t\t\telse return 6441;\n\t\t}\n\t\tBlockState JungleButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace JungleDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState JungleDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8866;\n\t\t\t\t\t\t\telse return 8867;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8868;\n\t\t\t\t\t\t\telse return 8869;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8870;\n\t\t\t\t\t\t\telse return 8871;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8872;\n\t\t\t\t\t\t\telse return 8873;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8874;\n\t\t\t\t\t\t\telse return 8875;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8876;\n\t\t\t\t\t\t\telse return 8877;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8878;\n\t\t\t\t\t\t\telse return 8879;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8880;\n\t\t\t\t\t\t\telse return 8881;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8882;\n\t\t\t\t\t\t\telse return 8883;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8884;\n\t\t\t\t\t\t\telse return 8885;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8886;\n\t\t\t\t\t\t\telse return 8887;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8888;\n\t\t\t\t\t\t\telse return 8889;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8890;\n\t\t\t\t\t\t\telse return 8891;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8892;\n\t\t\t\t\t\t\telse return 8893;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8894;\n\t\t\t\t\t\t\telse return 8895;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8896;\n\t\t\t\t\t\t\telse return 8897;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8898;\n\t\t\t\t\t\t\telse return 8899;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8900;\n\t\t\t\t\t\t\telse return 8901;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8902;\n\t\t\t\t\t\t\telse return 8903;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8904;\n\t\t\t\t\t\t\telse return 8905;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8906;\n\t\t\t\t\t\t\telse return 8907;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8908;\n\t\t\t\t\t\t\telse return 8909;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8910;\n\t\t\t\t\t\t\telse return 8911;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8912;\n\t\t\t\t\t\t\telse return 8913;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8914;\n\t\t\t\t\t\t\telse return 8915;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8916;\n\t\t\t\t\t\t\telse return 8917;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8918;\n\t\t\t\t\t\t\telse return 8919;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8920;\n\t\t\t\t\t\t\telse return 8921;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8922;\n\t\t\t\t\t\t\telse return 8923;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8924;\n\t\t\t\t\t\t\telse return 8925;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8926;\n\t\t\t\t\t\t\telse return 8927;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8928;\n\t\t\t\t\t\t\telse return 8929;\n\t\t}\n\t\tBlockState JungleDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace JungleFence\n\t{\n\t\tconstexpr BlockState JungleFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8644;\n\t\t\t\t\t\telse return 8645;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8648;\n\t\t\t\t\t\telse return 8649;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8652;\n\t\t\t\t\t\telse return 8653;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8656;\n\t\t\t\t\t\telse return 8657;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8660;\n\t\t\t\t\t\telse return 8661;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8664;\n\t\t\t\t\t\telse return 8665;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8668;\n\t\t\t\t\t\telse return 8669;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8672;\n\t\t\t\t\t\telse return 8673;\n\t\t}\n\t\tBlockState JungleFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace JungleFenceGate\n\t{\n\t\tconstexpr BlockState JungleFenceGate(const eBlockFace Facing, const bool InWall, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8482;\n\t\t\t\t\t\telse return 8483;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8484;\n\t\t\t\t\t\telse return 8485;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8486;\n\t\t\t\t\t\telse return 8487;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8488;\n\t\t\t\t\t\telse return 8489;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8490;\n\t\t\t\t\t\telse return 8491;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8492;\n\t\t\t\t\t\telse return 8493;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8494;\n\t\t\t\t\t\telse return 8495;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8496;\n\t\t\t\t\t\telse return 8497;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8498;\n\t\t\t\t\t\telse return 8499;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8500;\n\t\t\t\t\t\telse return 8501;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8502;\n\t\t\t\t\t\telse return 8503;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8504;\n\t\t\t\t\t\telse return 8505;\n\t\t\telse\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8506;\n\t\t\t\t\t\telse return 8507;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8508;\n\t\t\t\t\t\telse return 8509;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8510;\n\t\t\t\t\t\telse return 8511;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8512;\n\t\t\t\t\t\telse return 8513;\n\t\t}\n\t\tBlockState JungleFenceGate();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool InWall(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace JungleLeaves\n\t{\n\t\tconstexpr BlockState JungleLeaves(const unsigned char Distance, const bool Persistent)\n\t\t{\n\t\t\tif (Distance == 1)\n\t\t\t\tif (Persistent) return 187;\n\t\t\t\telse return 188;\n\t\t\telse if (Distance == 2)\n\t\t\t\tif (Persistent) return 189;\n\t\t\t\telse return 190;\n\t\t\telse if (Distance == 3)\n\t\t\t\tif (Persistent) return 191;\n\t\t\t\telse return 192;\n\t\t\telse if (Distance == 4)\n\t\t\t\tif (Persistent) return 193;\n\t\t\t\telse return 194;\n\t\t\telse if (Distance == 5)\n\t\t\t\tif (Persistent) return 195;\n\t\t\t\telse return 196;\n\t\t\telse if (Distance == 6)\n\t\t\t\tif (Persistent) return 197;\n\t\t\t\telse return 198;\n\t\t\telse\n\t\t\t\tif (Persistent) return 199;\n\t\t\t\telse return 200;\n\t\t}\n\t\tBlockState JungleLeaves();\n\t\tunsigned char Distance(BlockState Block);\n\t\tbool Persistent(BlockState Block);\n\t}\n\tnamespace JungleLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState JungleLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 82;\n\t\t\telse if (Axis == Axis::Y) return 83;\n\t\t\telse return 84;\n\t\t}\n\t\tBlockState JungleLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace JunglePlanks\n\t{\n\t\tconstexpr BlockState JunglePlanks()\n\t\t{\n\t\t\treturn 18;\n\t\t}\n\t}\n\tnamespace JunglePressurePlate\n\t{\n\t\tconstexpr BlockState JunglePressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 3879;\n\t\t\telse return 3880;\n\t\t}\n\t\tBlockState JunglePressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace JungleSapling\n\t{\n\t\tconstexpr BlockState JungleSapling(const unsigned char Stage)\n\t\t{\n\t\t\tif (Stage == 0) return 27;\n\t\t\telse return 28;\n\t\t}\n\t\tBlockState JungleSapling();\n\t\tunsigned char Stage(BlockState Block);\n\t}\n\tnamespace JungleSign\n\t{\n\t\tconstexpr BlockState JungleSign(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 3510;\n\t\t\telse if (Rotation == 1) return 3512;\n\t\t\telse if (Rotation == 2) return 3514;\n\t\t\telse if (Rotation == 3) return 3516;\n\t\t\telse if (Rotation == 4) return 3518;\n\t\t\telse if (Rotation == 5) return 3520;\n\t\t\telse if (Rotation == 6) return 3522;\n\t\t\telse if (Rotation == 7) return 3524;\n\t\t\telse if (Rotation == 8) return 3526;\n\t\t\telse if (Rotation == 9) return 3528;\n\t\t\telse if (Rotation == 10) return 3530;\n\t\t\telse if (Rotation == 11) return 3532;\n\t\t\telse if (Rotation == 12) return 3534;\n\t\t\telse if (Rotation == 13) return 3536;\n\t\t\telse if (Rotation == 14) return 3538;\n\t\t\telse return 3540;\n\t\t}\n\t\tBlockState JungleSign();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace JungleSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState JungleSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8319;\n\t\t\telse if (Type == Type::Bottom) return 8321;\n\t\t\telse return 8323;\n\t\t}\n\t\tBlockState JungleSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace JungleStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState JungleStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5565;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5567;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5569;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5571;\n\t\t\t\t\telse return 5573;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5575;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5577;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5579;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5581;\n\t\t\t\t\telse return 5583;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5585;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5587;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5589;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5591;\n\t\t\t\t\telse return 5593;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5595;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5597;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5599;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5601;\n\t\t\t\t\telse return 5603;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5605;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5607;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5609;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5611;\n\t\t\t\t\telse return 5613;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5615;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5617;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5619;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5621;\n\t\t\t\t\telse return 5623;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5625;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5627;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5629;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5631;\n\t\t\t\t\telse return 5633;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5635;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5637;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5639;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5641;\n\t\t\t\t\telse return 5643;\n\t\t}\n\t\tBlockState JungleStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace JungleTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState JungleTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4304;\n\t\t\t\t\t\telse return 4306;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4308;\n\t\t\t\t\t\telse return 4310;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4312;\n\t\t\t\t\t\telse return 4314;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4316;\n\t\t\t\t\t\telse return 4318;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4320;\n\t\t\t\t\t\telse return 4322;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4324;\n\t\t\t\t\t\telse return 4326;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4328;\n\t\t\t\t\t\telse return 4330;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4332;\n\t\t\t\t\t\telse return 4334;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4336;\n\t\t\t\t\t\telse return 4338;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4340;\n\t\t\t\t\t\telse return 4342;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4344;\n\t\t\t\t\t\telse return 4346;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4348;\n\t\t\t\t\t\telse return 4350;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4352;\n\t\t\t\t\t\telse return 4354;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4356;\n\t\t\t\t\t\telse return 4358;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4360;\n\t\t\t\t\t\telse return 4362;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4364;\n\t\t\t\t\t\telse return 4366;\n\t\t}\n\t\tBlockState JungleTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace JungleWallSign\n\t{\n\t\tconstexpr BlockState JungleWallSign(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 3768;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 3770;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 3772;\n\t\t\telse return 3774;\n\t\t}\n\t\tBlockState JungleWallSign();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace JungleWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState JungleWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 118;\n\t\t\telse if (Axis == Axis::Y) return 119;\n\t\t\telse return 120;\n\t\t}\n\t\tBlockState JungleWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace Kelp\n\t{\n\t\tconstexpr BlockState Kelp(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 9470;\n\t\t\telse if (Age == 1) return 9471;\n\t\t\telse if (Age == 2) return 9472;\n\t\t\telse if (Age == 3) return 9473;\n\t\t\telse if (Age == 4) return 9474;\n\t\t\telse if (Age == 5) return 9475;\n\t\t\telse if (Age == 6) return 9476;\n\t\t\telse if (Age == 7) return 9477;\n\t\t\telse if (Age == 8) return 9478;\n\t\t\telse if (Age == 9) return 9479;\n\t\t\telse if (Age == 10) return 9480;\n\t\t\telse if (Age == 11) return 9481;\n\t\t\telse if (Age == 12) return 9482;\n\t\t\telse if (Age == 13) return 9483;\n\t\t\telse if (Age == 14) return 9484;\n\t\t\telse if (Age == 15) return 9485;\n\t\t\telse if (Age == 16) return 9486;\n\t\t\telse if (Age == 17) return 9487;\n\t\t\telse if (Age == 18) return 9488;\n\t\t\telse if (Age == 19) return 9489;\n\t\t\telse if (Age == 20) return 9490;\n\t\t\telse if (Age == 21) return 9491;\n\t\t\telse if (Age == 22) return 9492;\n\t\t\telse if (Age == 23) return 9493;\n\t\t\telse if (Age == 24) return 9494;\n\t\t\telse return 9495;\n\t\t}\n\t\tBlockState Kelp();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace KelpPlant\n\t{\n\t\tconstexpr BlockState KelpPlant()\n\t\t{\n\t\t\treturn 9496;\n\t\t}\n\t}\n\tnamespace Ladder\n\t{\n\t\tconstexpr BlockState Ladder(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 3638;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 3640;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 3642;\n\t\t\telse return 3644;\n\t\t}\n\t\tBlockState Ladder();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Lantern\n\t{\n\t\tconstexpr BlockState Lantern(const bool Hanging)\n\t\t{\n\t\t\tif (Hanging) return 14886;\n\t\t\telse return 14887;\n\t\t}\n\t\tBlockState Lantern();\n\t\tbool Hanging(BlockState Block);\n\t}\n\tnamespace LapisBlock\n\t{\n\t\tconstexpr BlockState LapisBlock()\n\t\t{\n\t\t\treturn 233;\n\t\t}\n\t}\n\tnamespace LapisOre\n\t{\n\t\tconstexpr BlockState LapisOre()\n\t\t{\n\t\t\treturn 232;\n\t\t}\n\t}\n\tnamespace LargeFern\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tconstexpr BlockState LargeFern(const enum Half Half)\n\t\t{\n\t\t\tif (Half == Half::Upper) return 7895;\n\t\t\telse return 7896;\n\t\t}\n\t\tBlockState LargeFern();\n\t\tenum Half Half(BlockState Block);\n\t}\n\tnamespace Lava\n\t{\n\t\tconstexpr BlockState Lava(const unsigned char Level)\n\t\t{\n\t\t\tif (Level == 0) return 50;\n\t\t\telse if (Level == 1) return 51;\n\t\t\telse if (Level == 2) return 52;\n\t\t\telse if (Level == 3) return 53;\n\t\t\telse if (Level == 4) return 54;\n\t\t\telse if (Level == 5) return 55;\n\t\t\telse if (Level == 6) return 56;\n\t\t\telse if (Level == 7) return 57;\n\t\t\telse if (Level == 8) return 58;\n\t\t\telse if (Level == 9) return 59;\n\t\t\telse if (Level == 10) return 60;\n\t\t\telse if (Level == 11) return 61;\n\t\t\telse if (Level == 12) return 62;\n\t\t\telse if (Level == 13) return 63;\n\t\t\telse if (Level == 14) return 64;\n\t\t\telse return 65;\n\t\t}\n\t\tBlockState Lava();\n\t\tunsigned char Level(BlockState Block);\n\t}\n\tnamespace Lectern\n\t{\n\t\tconstexpr BlockState Lectern(const eBlockFace Facing, const bool HasBook, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (HasBook)\n\t\t\t\t\tif (Powered) return 14833;\n\t\t\t\t\telse return 14834;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 14835;\n\t\t\t\t\telse return 14836;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (HasBook)\n\t\t\t\t\tif (Powered) return 14837;\n\t\t\t\t\telse return 14838;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 14839;\n\t\t\t\t\telse return 14840;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (HasBook)\n\t\t\t\t\tif (Powered) return 14841;\n\t\t\t\t\telse return 14842;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 14843;\n\t\t\t\t\telse return 14844;\n\t\t\telse\n\t\t\t\tif (HasBook)\n\t\t\t\t\tif (Powered) return 14845;\n\t\t\t\t\telse return 14846;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 14847;\n\t\t\t\t\telse return 14848;\n\t\t}\n\t\tBlockState Lectern();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool HasBook(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace Lever\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState Lever(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 3783;\n\t\t\t\t\telse return 3784;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 3785;\n\t\t\t\t\telse return 3786;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 3787;\n\t\t\t\t\telse return 3788;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 3789;\n\t\t\t\t\telse return 3790;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 3791;\n\t\t\t\t\telse return 3792;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 3793;\n\t\t\t\t\telse return 3794;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 3795;\n\t\t\t\t\telse return 3796;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 3797;\n\t\t\t\t\telse return 3798;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 3799;\n\t\t\t\t\telse return 3800;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 3801;\n\t\t\t\t\telse return 3802;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 3803;\n\t\t\t\t\telse return 3804;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 3805;\n\t\t\t\t\telse return 3806;\n\t\t}\n\t\tBlockState Lever();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace LightBlueBanner\n\t{\n\t\tconstexpr BlockState LightBlueBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 7945;\n\t\t\telse if (Rotation == 1) return 7946;\n\t\t\telse if (Rotation == 2) return 7947;\n\t\t\telse if (Rotation == 3) return 7948;\n\t\t\telse if (Rotation == 4) return 7949;\n\t\t\telse if (Rotation == 5) return 7950;\n\t\t\telse if (Rotation == 6) return 7951;\n\t\t\telse if (Rotation == 7) return 7952;\n\t\t\telse if (Rotation == 8) return 7953;\n\t\t\telse if (Rotation == 9) return 7954;\n\t\t\telse if (Rotation == 10) return 7955;\n\t\t\telse if (Rotation == 11) return 7956;\n\t\t\telse if (Rotation == 12) return 7957;\n\t\t\telse if (Rotation == 13) return 7958;\n\t\t\telse if (Rotation == 14) return 7959;\n\t\t\telse return 7960;\n\t\t}\n\t\tBlockState LightBlueBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace LightBlueBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState LightBlueBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1097;\n\t\t\t\t\telse return 1098;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1099;\n\t\t\t\t\telse return 1100;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1101;\n\t\t\t\t\telse return 1102;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1103;\n\t\t\t\t\telse return 1104;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1105;\n\t\t\t\t\telse return 1106;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1107;\n\t\t\t\t\telse return 1108;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1109;\n\t\t\t\t\telse return 1110;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1111;\n\t\t\t\t\telse return 1112;\n\t\t}\n\t\tBlockState LightBlueBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace LightBlueCarpet\n\t{\n\t\tconstexpr BlockState LightBlueCarpet()\n\t\t{\n\t\t\treturn 7869;\n\t\t}\n\t}\n\tnamespace LightBlueConcrete\n\t{\n\t\tconstexpr BlockState LightBlueConcrete()\n\t\t{\n\t\t\treturn 9441;\n\t\t}\n\t}\n\tnamespace LightBlueConcretePowder\n\t{\n\t\tconstexpr BlockState LightBlueConcretePowder()\n\t\t{\n\t\t\treturn 9457;\n\t\t}\n\t}\n\tnamespace LightBlueGlazedTerracotta\n\t{\n\t\tconstexpr BlockState LightBlueGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9386;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9387;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9388;\n\t\t\telse return 9389;\n\t\t}\n\t\tBlockState LightBlueGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LightBlueShulkerBox\n\t{\n\t\tconstexpr BlockState LightBlueShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9296;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9297;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9298;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9299;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9300;\n\t\t\telse return 9301;\n\t\t}\n\t\tBlockState LightBlueShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LightBlueStainedGlass\n\t{\n\t\tconstexpr BlockState LightBlueStainedGlass()\n\t\t{\n\t\t\treturn 4098;\n\t\t}\n\t}\n\tnamespace LightBlueStainedGlassPane\n\t{\n\t\tconstexpr BlockState LightBlueStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6961;\n\t\t\t\t\t\telse return 6962;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6965;\n\t\t\t\t\t\telse return 6966;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6969;\n\t\t\t\t\t\telse return 6970;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6973;\n\t\t\t\t\t\telse return 6974;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6977;\n\t\t\t\t\t\telse return 6978;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6981;\n\t\t\t\t\t\telse return 6982;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6985;\n\t\t\t\t\t\telse return 6986;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6989;\n\t\t\t\t\t\telse return 6990;\n\t\t}\n\t\tBlockState LightBlueStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace LightBlueTerracotta\n\t{\n\t\tconstexpr BlockState LightBlueTerracotta()\n\t\t{\n\t\t\treturn 6850;\n\t\t}\n\t}\n\tnamespace LightBlueWallBanner\n\t{\n\t\tconstexpr BlockState LightBlueWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8165;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8166;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8167;\n\t\t\telse return 8168;\n\t\t}\n\t\tBlockState LightBlueWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LightBlueWool\n\t{\n\t\tconstexpr BlockState LightBlueWool()\n\t\t{\n\t\t\treturn 1387;\n\t\t}\n\t}\n\tnamespace LightGrayBanner\n\t{\n\t\tconstexpr BlockState LightGrayBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8025;\n\t\t\telse if (Rotation == 1) return 8026;\n\t\t\telse if (Rotation == 2) return 8027;\n\t\t\telse if (Rotation == 3) return 8028;\n\t\t\telse if (Rotation == 4) return 8029;\n\t\t\telse if (Rotation == 5) return 8030;\n\t\t\telse if (Rotation == 6) return 8031;\n\t\t\telse if (Rotation == 7) return 8032;\n\t\t\telse if (Rotation == 8) return 8033;\n\t\t\telse if (Rotation == 9) return 8034;\n\t\t\telse if (Rotation == 10) return 8035;\n\t\t\telse if (Rotation == 11) return 8036;\n\t\t\telse if (Rotation == 12) return 8037;\n\t\t\telse if (Rotation == 13) return 8038;\n\t\t\telse if (Rotation == 14) return 8039;\n\t\t\telse return 8040;\n\t\t}\n\t\tBlockState LightGrayBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace LightGrayBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState LightGrayBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1177;\n\t\t\t\t\telse return 1178;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1179;\n\t\t\t\t\telse return 1180;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1181;\n\t\t\t\t\telse return 1182;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1183;\n\t\t\t\t\telse return 1184;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1185;\n\t\t\t\t\telse return 1186;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1187;\n\t\t\t\t\telse return 1188;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1189;\n\t\t\t\t\telse return 1190;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1191;\n\t\t\t\t\telse return 1192;\n\t\t}\n\t\tBlockState LightGrayBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace LightGrayCarpet\n\t{\n\t\tconstexpr BlockState LightGrayCarpet()\n\t\t{\n\t\t\treturn 7874;\n\t\t}\n\t}\n\tnamespace LightGrayConcrete\n\t{\n\t\tconstexpr BlockState LightGrayConcrete()\n\t\t{\n\t\t\treturn 9446;\n\t\t}\n\t}\n\tnamespace LightGrayConcretePowder\n\t{\n\t\tconstexpr BlockState LightGrayConcretePowder()\n\t\t{\n\t\t\treturn 9462;\n\t\t}\n\t}\n\tnamespace LightGrayGlazedTerracotta\n\t{\n\t\tconstexpr BlockState LightGrayGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9406;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9407;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9408;\n\t\t\telse return 9409;\n\t\t}\n\t\tBlockState LightGrayGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LightGrayShulkerBox\n\t{\n\t\tconstexpr BlockState LightGrayShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9326;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9327;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9328;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9329;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9330;\n\t\t\telse return 9331;\n\t\t}\n\t\tBlockState LightGrayShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LightGrayStainedGlass\n\t{\n\t\tconstexpr BlockState LightGrayStainedGlass()\n\t\t{\n\t\t\treturn 4103;\n\t\t}\n\t}\n\tnamespace LightGrayStainedGlassPane\n\t{\n\t\tconstexpr BlockState LightGrayStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7121;\n\t\t\t\t\t\telse return 7122;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7125;\n\t\t\t\t\t\telse return 7126;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7129;\n\t\t\t\t\t\telse return 7130;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7133;\n\t\t\t\t\t\telse return 7134;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7137;\n\t\t\t\t\t\telse return 7138;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7141;\n\t\t\t\t\t\telse return 7142;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7145;\n\t\t\t\t\t\telse return 7146;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7149;\n\t\t\t\t\t\telse return 7150;\n\t\t}\n\t\tBlockState LightGrayStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace LightGrayTerracotta\n\t{\n\t\tconstexpr BlockState LightGrayTerracotta()\n\t\t{\n\t\t\treturn 6855;\n\t\t}\n\t}\n\tnamespace LightGrayWallBanner\n\t{\n\t\tconstexpr BlockState LightGrayWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8185;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8186;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8187;\n\t\t\telse return 8188;\n\t\t}\n\t\tBlockState LightGrayWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LightGrayWool\n\t{\n\t\tconstexpr BlockState LightGrayWool()\n\t\t{\n\t\t\treturn 1392;\n\t\t}\n\t}\n\tnamespace LightWeightedPressurePlate\n\t{\n\t\tconstexpr BlockState LightWeightedPressurePlate(const unsigned char Power)\n\t\t{\n\t\t\tif (Power == 0) return 6646;\n\t\t\telse if (Power == 1) return 6647;\n\t\t\telse if (Power == 2) return 6648;\n\t\t\telse if (Power == 3) return 6649;\n\t\t\telse if (Power == 4) return 6650;\n\t\t\telse if (Power == 5) return 6651;\n\t\t\telse if (Power == 6) return 6652;\n\t\t\telse if (Power == 7) return 6653;\n\t\t\telse if (Power == 8) return 6654;\n\t\t\telse if (Power == 9) return 6655;\n\t\t\telse if (Power == 10) return 6656;\n\t\t\telse if (Power == 11) return 6657;\n\t\t\telse if (Power == 12) return 6658;\n\t\t\telse if (Power == 13) return 6659;\n\t\t\telse if (Power == 14) return 6660;\n\t\t\telse return 6661;\n\t\t}\n\t\tBlockState LightWeightedPressurePlate();\n\t\tunsigned char Power(BlockState Block);\n\t}\n\tnamespace Lilac\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tconstexpr BlockState Lilac(const enum Half Half)\n\t\t{\n\t\t\tif (Half == Half::Upper) return 7887;\n\t\t\telse return 7888;\n\t\t}\n\t\tBlockState Lilac();\n\t\tenum Half Half(BlockState Block);\n\t}\n\tnamespace LilyOfTheValley\n\t{\n\t\tconstexpr BlockState LilyOfTheValley()\n\t\t{\n\t\t\treturn 1424;\n\t\t}\n\t}\n\tnamespace LilyPad\n\t{\n\t\tconstexpr BlockState LilyPad()\n\t\t{\n\t\t\treturn 5014;\n\t\t}\n\t}\n\tnamespace LimeBanner\n\t{\n\t\tconstexpr BlockState LimeBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 7977;\n\t\t\telse if (Rotation == 1) return 7978;\n\t\t\telse if (Rotation == 2) return 7979;\n\t\t\telse if (Rotation == 3) return 7980;\n\t\t\telse if (Rotation == 4) return 7981;\n\t\t\telse if (Rotation == 5) return 7982;\n\t\t\telse if (Rotation == 6) return 7983;\n\t\t\telse if (Rotation == 7) return 7984;\n\t\t\telse if (Rotation == 8) return 7985;\n\t\t\telse if (Rotation == 9) return 7986;\n\t\t\telse if (Rotation == 10) return 7987;\n\t\t\telse if (Rotation == 11) return 7988;\n\t\t\telse if (Rotation == 12) return 7989;\n\t\t\telse if (Rotation == 13) return 7990;\n\t\t\telse if (Rotation == 14) return 7991;\n\t\t\telse return 7992;\n\t\t}\n\t\tBlockState LimeBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace LimeBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState LimeBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1129;\n\t\t\t\t\telse return 1130;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1131;\n\t\t\t\t\telse return 1132;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1133;\n\t\t\t\t\telse return 1134;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1135;\n\t\t\t\t\telse return 1136;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1137;\n\t\t\t\t\telse return 1138;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1139;\n\t\t\t\t\telse return 1140;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1141;\n\t\t\t\t\telse return 1142;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1143;\n\t\t\t\t\telse return 1144;\n\t\t}\n\t\tBlockState LimeBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace LimeCarpet\n\t{\n\t\tconstexpr BlockState LimeCarpet()\n\t\t{\n\t\t\treturn 7871;\n\t\t}\n\t}\n\tnamespace LimeConcrete\n\t{\n\t\tconstexpr BlockState LimeConcrete()\n\t\t{\n\t\t\treturn 9443;\n\t\t}\n\t}\n\tnamespace LimeConcretePowder\n\t{\n\t\tconstexpr BlockState LimeConcretePowder()\n\t\t{\n\t\t\treturn 9459;\n\t\t}\n\t}\n\tnamespace LimeGlazedTerracotta\n\t{\n\t\tconstexpr BlockState LimeGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9394;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9395;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9396;\n\t\t\telse return 9397;\n\t\t}\n\t\tBlockState LimeGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LimeShulkerBox\n\t{\n\t\tconstexpr BlockState LimeShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9308;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9309;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9310;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9311;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9312;\n\t\t\telse return 9313;\n\t\t}\n\t\tBlockState LimeShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LimeStainedGlass\n\t{\n\t\tconstexpr BlockState LimeStainedGlass()\n\t\t{\n\t\t\treturn 4100;\n\t\t}\n\t}\n\tnamespace LimeStainedGlassPane\n\t{\n\t\tconstexpr BlockState LimeStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7025;\n\t\t\t\t\t\telse return 7026;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7029;\n\t\t\t\t\t\telse return 7030;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7033;\n\t\t\t\t\t\telse return 7034;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7037;\n\t\t\t\t\t\telse return 7038;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7041;\n\t\t\t\t\t\telse return 7042;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7045;\n\t\t\t\t\t\telse return 7046;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7049;\n\t\t\t\t\t\telse return 7050;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7053;\n\t\t\t\t\t\telse return 7054;\n\t\t}\n\t\tBlockState LimeStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace LimeTerracotta\n\t{\n\t\tconstexpr BlockState LimeTerracotta()\n\t\t{\n\t\t\treturn 6852;\n\t\t}\n\t}\n\tnamespace LimeWallBanner\n\t{\n\t\tconstexpr BlockState LimeWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8173;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8174;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8175;\n\t\t\telse return 8176;\n\t\t}\n\t\tBlockState LimeWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace LimeWool\n\t{\n\t\tconstexpr BlockState LimeWool()\n\t\t{\n\t\t\treturn 1389;\n\t\t}\n\t}\n\tnamespace Lodestone\n\t{\n\t\tconstexpr BlockState Lodestone()\n\t\t{\n\t\t\treturn 15838;\n\t\t}\n\t}\n\tnamespace Loom\n\t{\n\t\tconstexpr BlockState Loom(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 14787;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 14788;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 14789;\n\t\t\telse return 14790;\n\t\t}\n\t\tBlockState Loom();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace MagentaBanner\n\t{\n\t\tconstexpr BlockState MagentaBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 7929;\n\t\t\telse if (Rotation == 1) return 7930;\n\t\t\telse if (Rotation == 2) return 7931;\n\t\t\telse if (Rotation == 3) return 7932;\n\t\t\telse if (Rotation == 4) return 7933;\n\t\t\telse if (Rotation == 5) return 7934;\n\t\t\telse if (Rotation == 6) return 7935;\n\t\t\telse if (Rotation == 7) return 7936;\n\t\t\telse if (Rotation == 8) return 7937;\n\t\t\telse if (Rotation == 9) return 7938;\n\t\t\telse if (Rotation == 10) return 7939;\n\t\t\telse if (Rotation == 11) return 7940;\n\t\t\telse if (Rotation == 12) return 7941;\n\t\t\telse if (Rotation == 13) return 7942;\n\t\t\telse if (Rotation == 14) return 7943;\n\t\t\telse return 7944;\n\t\t}\n\t\tBlockState MagentaBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace MagentaBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState MagentaBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1081;\n\t\t\t\t\telse return 1082;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1083;\n\t\t\t\t\telse return 1084;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1085;\n\t\t\t\t\telse return 1086;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1087;\n\t\t\t\t\telse return 1088;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1089;\n\t\t\t\t\telse return 1090;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1091;\n\t\t\t\t\telse return 1092;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1093;\n\t\t\t\t\telse return 1094;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1095;\n\t\t\t\t\telse return 1096;\n\t\t}\n\t\tBlockState MagentaBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace MagentaCarpet\n\t{\n\t\tconstexpr BlockState MagentaCarpet()\n\t\t{\n\t\t\treturn 7868;\n\t\t}\n\t}\n\tnamespace MagentaConcrete\n\t{\n\t\tconstexpr BlockState MagentaConcrete()\n\t\t{\n\t\t\treturn 9440;\n\t\t}\n\t}\n\tnamespace MagentaConcretePowder\n\t{\n\t\tconstexpr BlockState MagentaConcretePowder()\n\t\t{\n\t\t\treturn 9456;\n\t\t}\n\t}\n\tnamespace MagentaGlazedTerracotta\n\t{\n\t\tconstexpr BlockState MagentaGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9382;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9383;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9384;\n\t\t\telse return 9385;\n\t\t}\n\t\tBlockState MagentaGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace MagentaShulkerBox\n\t{\n\t\tconstexpr BlockState MagentaShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9290;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9291;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9292;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9293;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9294;\n\t\t\telse return 9295;\n\t\t}\n\t\tBlockState MagentaShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace MagentaStainedGlass\n\t{\n\t\tconstexpr BlockState MagentaStainedGlass()\n\t\t{\n\t\t\treturn 4097;\n\t\t}\n\t}\n\tnamespace MagentaStainedGlassPane\n\t{\n\t\tconstexpr BlockState MagentaStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6929;\n\t\t\t\t\t\telse return 6930;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6933;\n\t\t\t\t\t\telse return 6934;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6937;\n\t\t\t\t\t\telse return 6938;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6941;\n\t\t\t\t\t\telse return 6942;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6945;\n\t\t\t\t\t\telse return 6946;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6949;\n\t\t\t\t\t\telse return 6950;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6953;\n\t\t\t\t\t\telse return 6954;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6957;\n\t\t\t\t\t\telse return 6958;\n\t\t}\n\t\tBlockState MagentaStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace MagentaTerracotta\n\t{\n\t\tconstexpr BlockState MagentaTerracotta()\n\t\t{\n\t\t\treturn 6849;\n\t\t}\n\t}\n\tnamespace MagentaWallBanner\n\t{\n\t\tconstexpr BlockState MagentaWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8161;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8162;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8163;\n\t\t\telse return 8164;\n\t\t}\n\t\tBlockState MagentaWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace MagentaWool\n\t{\n\t\tconstexpr BlockState MagentaWool()\n\t\t{\n\t\t\treturn 1386;\n\t\t}\n\t}\n\tnamespace MagmaBlock\n\t{\n\t\tconstexpr BlockState MagmaBlock()\n\t\t{\n\t\t\treturn 9253;\n\t\t}\n\t}\n\tnamespace Melon\n\t{\n\t\tconstexpr BlockState Melon()\n\t\t{\n\t\t\treturn 4763;\n\t\t}\n\t}\n\tnamespace MelonStem\n\t{\n\t\tconstexpr BlockState MelonStem(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 4780;\n\t\t\telse if (Age == 1) return 4781;\n\t\t\telse if (Age == 2) return 4782;\n\t\t\telse if (Age == 3) return 4783;\n\t\t\telse if (Age == 4) return 4784;\n\t\t\telse if (Age == 5) return 4785;\n\t\t\telse if (Age == 6) return 4786;\n\t\t\telse return 4787;\n\t\t}\n\t\tBlockState MelonStem();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace MossyCobblestone\n\t{\n\t\tconstexpr BlockState MossyCobblestone()\n\t\t{\n\t\t\treturn 1433;\n\t\t}\n\t}\n\tnamespace MossyCobblestoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState MossyCobblestoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10814;\n\t\t\telse if (Type == Type::Bottom) return 10816;\n\t\t\telse return 10818;\n\t\t}\n\t\tBlockState MossyCobblestoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace MossyCobblestoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState MossyCobblestoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9990;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9992;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9994;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9996;\n\t\t\t\t\telse return 9998;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10000;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10002;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10004;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10006;\n\t\t\t\t\telse return 10008;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10010;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10012;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10014;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10016;\n\t\t\t\t\telse return 10018;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10020;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10022;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10024;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10026;\n\t\t\t\t\telse return 10028;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10030;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10032;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10034;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10036;\n\t\t\t\t\telse return 10038;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10040;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10042;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10044;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10046;\n\t\t\t\t\telse return 10048;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10050;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10052;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10054;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10056;\n\t\t\t\t\telse return 10058;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10060;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10062;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10064;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10066;\n\t\t\t\t\telse return 10068;\n\t\t}\n\t\tBlockState MossyCobblestoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace MossyCobblestoneWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState MossyCobblestoneWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5984;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5985;\n\t\t\t\t\t\t\telse return 5986;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 5990;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5991;\n\t\t\t\t\t\t\telse return 5992;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 5996;\n\t\t\t\t\t\t\telse if (West == West::Low) return 5997;\n\t\t\t\t\t\t\telse return 5998;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6002;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6003;\n\t\t\t\t\t\t\telse return 6004;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6008;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6009;\n\t\t\t\t\t\t\telse return 6010;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6014;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6015;\n\t\t\t\t\t\t\telse return 6016;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6020;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6021;\n\t\t\t\t\t\t\telse return 6022;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6026;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6027;\n\t\t\t\t\t\t\telse return 6028;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6032;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6033;\n\t\t\t\t\t\t\telse return 6034;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6038;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6039;\n\t\t\t\t\t\t\telse return 6040;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6044;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6045;\n\t\t\t\t\t\t\telse return 6046;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6050;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6051;\n\t\t\t\t\t\t\telse return 6052;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6056;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6057;\n\t\t\t\t\t\t\telse return 6058;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6062;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6063;\n\t\t\t\t\t\t\telse return 6064;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6068;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6069;\n\t\t\t\t\t\t\telse return 6070;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6074;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6075;\n\t\t\t\t\t\t\telse return 6076;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6080;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6081;\n\t\t\t\t\t\t\telse return 6082;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6086;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6087;\n\t\t\t\t\t\t\telse return 6088;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6092;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6093;\n\t\t\t\t\t\t\telse return 6094;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6098;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6099;\n\t\t\t\t\t\t\telse return 6100;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6104;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6105;\n\t\t\t\t\t\t\telse return 6106;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6110;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6111;\n\t\t\t\t\t\t\telse return 6112;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6116;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6117;\n\t\t\t\t\t\t\telse return 6118;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6122;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6123;\n\t\t\t\t\t\t\telse return 6124;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6128;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6129;\n\t\t\t\t\t\t\telse return 6130;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6134;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6135;\n\t\t\t\t\t\t\telse return 6136;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6140;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6141;\n\t\t\t\t\t\t\telse return 6142;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6146;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6147;\n\t\t\t\t\t\t\telse return 6148;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6152;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6153;\n\t\t\t\t\t\t\telse return 6154;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6158;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6159;\n\t\t\t\t\t\t\telse return 6160;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6164;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6165;\n\t\t\t\t\t\t\telse return 6166;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6170;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6171;\n\t\t\t\t\t\t\telse return 6172;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6176;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6177;\n\t\t\t\t\t\t\telse return 6178;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6182;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6183;\n\t\t\t\t\t\t\telse return 6184;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6188;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6189;\n\t\t\t\t\t\t\telse return 6190;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6194;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6195;\n\t\t\t\t\t\t\telse return 6196;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6200;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6201;\n\t\t\t\t\t\t\telse return 6202;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6206;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6207;\n\t\t\t\t\t\t\telse return 6208;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6212;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6213;\n\t\t\t\t\t\t\telse return 6214;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6218;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6219;\n\t\t\t\t\t\t\telse return 6220;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6224;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6225;\n\t\t\t\t\t\t\telse return 6226;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6230;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6231;\n\t\t\t\t\t\t\telse return 6232;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6236;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6237;\n\t\t\t\t\t\t\telse return 6238;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6242;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6243;\n\t\t\t\t\t\t\telse return 6244;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6248;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6249;\n\t\t\t\t\t\t\telse return 6250;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6254;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6255;\n\t\t\t\t\t\t\telse return 6256;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6260;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6261;\n\t\t\t\t\t\t\telse return 6262;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6266;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6267;\n\t\t\t\t\t\t\telse return 6268;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6272;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6273;\n\t\t\t\t\t\t\telse return 6274;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6278;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6279;\n\t\t\t\t\t\t\telse return 6280;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6284;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6285;\n\t\t\t\t\t\t\telse return 6286;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6290;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6291;\n\t\t\t\t\t\t\telse return 6292;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 6296;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6297;\n\t\t\t\t\t\t\telse return 6298;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 6302;\n\t\t\t\t\t\t\telse if (West == West::Low) return 6303;\n\t\t\t\t\t\t\telse return 6304;\n\t\t}\n\t\tBlockState MossyCobblestoneWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace MossyStoneBrickSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState MossyStoneBrickSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10802;\n\t\t\telse if (Type == Type::Bottom) return 10804;\n\t\t\telse return 10806;\n\t\t}\n\t\tBlockState MossyStoneBrickSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace MossyStoneBrickStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState MossyStoneBrickStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9830;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9832;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9834;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9836;\n\t\t\t\t\telse return 9838;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9840;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9842;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9844;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9846;\n\t\t\t\t\telse return 9848;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9850;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9852;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9854;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9856;\n\t\t\t\t\telse return 9858;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9860;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9862;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9864;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9866;\n\t\t\t\t\telse return 9868;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9870;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9872;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9874;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9876;\n\t\t\t\t\telse return 9878;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9880;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9882;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9884;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9886;\n\t\t\t\t\telse return 9888;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9890;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9892;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9894;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9896;\n\t\t\t\t\telse return 9898;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9900;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9902;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9904;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9906;\n\t\t\t\t\telse return 9908;\n\t\t}\n\t\tBlockState MossyStoneBrickStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace MossyStoneBrickWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState MossyStoneBrickWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11842;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11843;\n\t\t\t\t\t\t\telse return 11844;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11848;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11849;\n\t\t\t\t\t\t\telse return 11850;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11854;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11855;\n\t\t\t\t\t\t\telse return 11856;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11860;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11861;\n\t\t\t\t\t\t\telse return 11862;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11866;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11867;\n\t\t\t\t\t\t\telse return 11868;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11872;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11873;\n\t\t\t\t\t\t\telse return 11874;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11878;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11879;\n\t\t\t\t\t\t\telse return 11880;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11884;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11885;\n\t\t\t\t\t\t\telse return 11886;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11890;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11891;\n\t\t\t\t\t\t\telse return 11892;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11896;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11897;\n\t\t\t\t\t\t\telse return 11898;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11902;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11903;\n\t\t\t\t\t\t\telse return 11904;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11908;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11909;\n\t\t\t\t\t\t\telse return 11910;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11914;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11915;\n\t\t\t\t\t\t\telse return 11916;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11920;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11921;\n\t\t\t\t\t\t\telse return 11922;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11926;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11927;\n\t\t\t\t\t\t\telse return 11928;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11932;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11933;\n\t\t\t\t\t\t\telse return 11934;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11938;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11939;\n\t\t\t\t\t\t\telse return 11940;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11944;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11945;\n\t\t\t\t\t\t\telse return 11946;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11950;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11951;\n\t\t\t\t\t\t\telse return 11952;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11956;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11957;\n\t\t\t\t\t\t\telse return 11958;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11962;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11963;\n\t\t\t\t\t\t\telse return 11964;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11968;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11969;\n\t\t\t\t\t\t\telse return 11970;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11974;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11975;\n\t\t\t\t\t\t\telse return 11976;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11980;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11981;\n\t\t\t\t\t\t\telse return 11982;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11986;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11987;\n\t\t\t\t\t\t\telse return 11988;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11992;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11993;\n\t\t\t\t\t\t\telse return 11994;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11998;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11999;\n\t\t\t\t\t\t\telse return 12000;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12004;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12005;\n\t\t\t\t\t\t\telse return 12006;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12010;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12011;\n\t\t\t\t\t\t\telse return 12012;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12016;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12017;\n\t\t\t\t\t\t\telse return 12018;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12022;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12023;\n\t\t\t\t\t\t\telse return 12024;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12028;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12029;\n\t\t\t\t\t\t\telse return 12030;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12034;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12035;\n\t\t\t\t\t\t\telse return 12036;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12040;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12041;\n\t\t\t\t\t\t\telse return 12042;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12046;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12047;\n\t\t\t\t\t\t\telse return 12048;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12052;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12053;\n\t\t\t\t\t\t\telse return 12054;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12058;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12059;\n\t\t\t\t\t\t\telse return 12060;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12064;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12065;\n\t\t\t\t\t\t\telse return 12066;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12070;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12071;\n\t\t\t\t\t\t\telse return 12072;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12076;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12077;\n\t\t\t\t\t\t\telse return 12078;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12082;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12083;\n\t\t\t\t\t\t\telse return 12084;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12088;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12089;\n\t\t\t\t\t\t\telse return 12090;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12094;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12095;\n\t\t\t\t\t\t\telse return 12096;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12100;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12101;\n\t\t\t\t\t\t\telse return 12102;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12106;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12107;\n\t\t\t\t\t\t\telse return 12108;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12112;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12113;\n\t\t\t\t\t\t\telse return 12114;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12118;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12119;\n\t\t\t\t\t\t\telse return 12120;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12124;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12125;\n\t\t\t\t\t\t\telse return 12126;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12130;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12131;\n\t\t\t\t\t\t\telse return 12132;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12136;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12137;\n\t\t\t\t\t\t\telse return 12138;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12142;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12143;\n\t\t\t\t\t\t\telse return 12144;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12148;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12149;\n\t\t\t\t\t\t\telse return 12150;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12154;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12155;\n\t\t\t\t\t\t\telse return 12156;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12160;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12161;\n\t\t\t\t\t\t\telse return 12162;\n\t\t}\n\t\tBlockState MossyStoneBrickWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace MossyStoneBricks\n\t{\n\t\tconstexpr BlockState MossyStoneBricks()\n\t\t{\n\t\t\treturn 4496;\n\t\t}\n\t}\n\tnamespace MovingPiston\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tNormal,\n\t\t\tSticky\n\t\t};\n\t\tconstexpr BlockState MovingPiston(const eBlockFace Facing, const enum Type Type)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Type == Type::Normal) return 1400;\n\t\t\t\telse return 1401;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP)\n\t\t\t\tif (Type == Type::Normal) return 1402;\n\t\t\t\telse return 1403;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Type == Type::Normal) return 1404;\n\t\t\t\telse return 1405;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Type == Type::Normal) return 1406;\n\t\t\t\telse return 1407;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP)\n\t\t\t\tif (Type == Type::Normal) return 1408;\n\t\t\t\telse return 1409;\n\t\t\telse\n\t\t\t\tif (Type == Type::Normal) return 1410;\n\t\t\t\telse return 1411;\n\t\t}\n\t\tBlockState MovingPiston();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace MushroomStem\n\t{\n\t\tconstexpr BlockState MushroomStem(const bool Down, const bool East, const bool North, const bool South, const bool Up, const bool West)\n\t\t{\n\t\t\tif (Down)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4633;\n\t\t\t\t\t\t\t\telse return 4634;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4635;\n\t\t\t\t\t\t\t\telse return 4636;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4637;\n\t\t\t\t\t\t\t\telse return 4638;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4639;\n\t\t\t\t\t\t\t\telse return 4640;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4641;\n\t\t\t\t\t\t\t\telse return 4642;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4643;\n\t\t\t\t\t\t\t\telse return 4644;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4645;\n\t\t\t\t\t\t\t\telse return 4646;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4647;\n\t\t\t\t\t\t\t\telse return 4648;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4649;\n\t\t\t\t\t\t\t\telse return 4650;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4651;\n\t\t\t\t\t\t\t\telse return 4652;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4653;\n\t\t\t\t\t\t\t\telse return 4654;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4655;\n\t\t\t\t\t\t\t\telse return 4656;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4657;\n\t\t\t\t\t\t\t\telse return 4658;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4659;\n\t\t\t\t\t\t\t\telse return 4660;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4661;\n\t\t\t\t\t\t\t\telse return 4662;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4663;\n\t\t\t\t\t\t\t\telse return 4664;\n\t\t\telse\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4665;\n\t\t\t\t\t\t\t\telse return 4666;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4667;\n\t\t\t\t\t\t\t\telse return 4668;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4669;\n\t\t\t\t\t\t\t\telse return 4670;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4671;\n\t\t\t\t\t\t\t\telse return 4672;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4673;\n\t\t\t\t\t\t\t\telse return 4674;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4675;\n\t\t\t\t\t\t\t\telse return 4676;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4677;\n\t\t\t\t\t\t\t\telse return 4678;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4679;\n\t\t\t\t\t\t\t\telse return 4680;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4681;\n\t\t\t\t\t\t\t\telse return 4682;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4683;\n\t\t\t\t\t\t\t\telse return 4684;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4685;\n\t\t\t\t\t\t\t\telse return 4686;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4687;\n\t\t\t\t\t\t\t\telse return 4688;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4689;\n\t\t\t\t\t\t\t\telse return 4690;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4691;\n\t\t\t\t\t\t\t\telse return 4692;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4693;\n\t\t\t\t\t\t\t\telse return 4694;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4695;\n\t\t\t\t\t\t\t\telse return 4696;\n\t\t}\n\t\tBlockState MushroomStem();\n\t\tbool Down(BlockState Block);\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace Mycelium\n\t{\n\t\tconstexpr BlockState Mycelium(const bool Snowy)\n\t\t{\n\t\t\tif (Snowy) return 5012;\n\t\t\telse return 5013;\n\t\t}\n\t\tBlockState Mycelium();\n\t\tbool Snowy(BlockState Block);\n\t}\n\tnamespace NetherBrickFence\n\t{\n\t\tconstexpr BlockState NetherBrickFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 5018;\n\t\t\t\t\t\telse return 5019;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 5022;\n\t\t\t\t\t\telse return 5023;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 5026;\n\t\t\t\t\t\telse return 5027;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 5030;\n\t\t\t\t\t\telse return 5031;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 5034;\n\t\t\t\t\t\telse return 5035;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 5038;\n\t\t\t\t\t\telse return 5039;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 5042;\n\t\t\t\t\t\telse return 5043;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 5046;\n\t\t\t\t\t\telse return 5047;\n\t\t}\n\t\tBlockState NetherBrickFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace NetherBrickSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState NetherBrickSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8385;\n\t\t\telse if (Type == Type::Bottom) return 8387;\n\t\t\telse return 8389;\n\t\t}\n\t\tBlockState NetherBrickSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace NetherBrickStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState NetherBrickStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5049;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5051;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5053;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5055;\n\t\t\t\t\telse return 5057;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5059;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5061;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5063;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5065;\n\t\t\t\t\telse return 5067;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5069;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5071;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5073;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5075;\n\t\t\t\t\telse return 5077;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5079;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5081;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5083;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5085;\n\t\t\t\t\telse return 5087;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5089;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5091;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5093;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5095;\n\t\t\t\t\telse return 5097;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5099;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5101;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5103;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5105;\n\t\t\t\t\telse return 5107;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5109;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5111;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5113;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5115;\n\t\t\t\t\telse return 5117;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5119;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5121;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5123;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5125;\n\t\t\t\t\telse return 5127;\n\t\t}\n\t\tBlockState NetherBrickStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace NetherBrickWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState NetherBrickWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12814;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12815;\n\t\t\t\t\t\t\telse return 12816;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12820;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12821;\n\t\t\t\t\t\t\telse return 12822;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12826;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12827;\n\t\t\t\t\t\t\telse return 12828;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12832;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12833;\n\t\t\t\t\t\t\telse return 12834;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12838;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12839;\n\t\t\t\t\t\t\telse return 12840;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12844;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12845;\n\t\t\t\t\t\t\telse return 12846;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12850;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12851;\n\t\t\t\t\t\t\telse return 12852;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12856;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12857;\n\t\t\t\t\t\t\telse return 12858;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12862;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12863;\n\t\t\t\t\t\t\telse return 12864;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12868;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12869;\n\t\t\t\t\t\t\telse return 12870;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12874;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12875;\n\t\t\t\t\t\t\telse return 12876;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12880;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12881;\n\t\t\t\t\t\t\telse return 12882;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12886;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12887;\n\t\t\t\t\t\t\telse return 12888;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12892;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12893;\n\t\t\t\t\t\t\telse return 12894;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12898;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12899;\n\t\t\t\t\t\t\telse return 12900;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12904;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12905;\n\t\t\t\t\t\t\telse return 12906;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12910;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12911;\n\t\t\t\t\t\t\telse return 12912;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12916;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12917;\n\t\t\t\t\t\t\telse return 12918;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12922;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12923;\n\t\t\t\t\t\t\telse return 12924;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12928;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12929;\n\t\t\t\t\t\t\telse return 12930;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12934;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12935;\n\t\t\t\t\t\t\telse return 12936;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12940;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12941;\n\t\t\t\t\t\t\telse return 12942;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12946;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12947;\n\t\t\t\t\t\t\telse return 12948;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12952;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12953;\n\t\t\t\t\t\t\telse return 12954;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12958;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12959;\n\t\t\t\t\t\t\telse return 12960;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12964;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12965;\n\t\t\t\t\t\t\telse return 12966;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12970;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12971;\n\t\t\t\t\t\t\telse return 12972;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12976;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12977;\n\t\t\t\t\t\t\telse return 12978;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12982;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12983;\n\t\t\t\t\t\t\telse return 12984;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12988;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12989;\n\t\t\t\t\t\t\telse return 12990;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12994;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12995;\n\t\t\t\t\t\t\telse return 12996;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13000;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13001;\n\t\t\t\t\t\t\telse return 13002;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13006;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13007;\n\t\t\t\t\t\t\telse return 13008;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13012;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13013;\n\t\t\t\t\t\t\telse return 13014;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13018;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13019;\n\t\t\t\t\t\t\telse return 13020;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13024;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13025;\n\t\t\t\t\t\t\telse return 13026;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13030;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13031;\n\t\t\t\t\t\t\telse return 13032;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13036;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13037;\n\t\t\t\t\t\t\telse return 13038;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13042;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13043;\n\t\t\t\t\t\t\telse return 13044;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13048;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13049;\n\t\t\t\t\t\t\telse return 13050;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13054;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13055;\n\t\t\t\t\t\t\telse return 13056;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13060;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13061;\n\t\t\t\t\t\t\telse return 13062;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13066;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13067;\n\t\t\t\t\t\t\telse return 13068;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13072;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13073;\n\t\t\t\t\t\t\telse return 13074;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13078;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13079;\n\t\t\t\t\t\t\telse return 13080;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13084;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13085;\n\t\t\t\t\t\t\telse return 13086;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13090;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13091;\n\t\t\t\t\t\t\telse return 13092;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13096;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13097;\n\t\t\t\t\t\t\telse return 13098;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13102;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13103;\n\t\t\t\t\t\t\telse return 13104;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13108;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13109;\n\t\t\t\t\t\t\telse return 13110;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13114;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13115;\n\t\t\t\t\t\t\telse return 13116;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13120;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13121;\n\t\t\t\t\t\t\telse return 13122;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13126;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13127;\n\t\t\t\t\t\t\telse return 13128;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13132;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13133;\n\t\t\t\t\t\t\telse return 13134;\n\t\t}\n\t\tBlockState NetherBrickWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace NetherBricks\n\t{\n\t\tconstexpr BlockState NetherBricks()\n\t\t{\n\t\t\treturn 5015;\n\t\t}\n\t}\n\tnamespace NetherGoldOre\n\t{\n\t\tconstexpr BlockState NetherGoldOre()\n\t\t{\n\t\t\treturn 72;\n\t\t}\n\t}\n\tnamespace NetherPortal\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState NetherPortal(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 4014;\n\t\t\telse return 4015;\n\t\t}\n\t\tBlockState NetherPortal();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace NetherQuartzOre\n\t{\n\t\tconstexpr BlockState NetherQuartzOre()\n\t\t{\n\t\t\treturn 6727;\n\t\t}\n\t}\n\tnamespace NetherSprouts\n\t{\n\t\tconstexpr BlockState NetherSprouts()\n\t\t{\n\t\t\treturn 14974;\n\t\t}\n\t}\n\tnamespace NetherWart\n\t{\n\t\tconstexpr BlockState NetherWart(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 5128;\n\t\t\telse if (Age == 1) return 5129;\n\t\t\telse if (Age == 2) return 5130;\n\t\t\telse return 5131;\n\t\t}\n\t\tBlockState NetherWart();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace NetherWartBlock\n\t{\n\t\tconstexpr BlockState NetherWartBlock()\n\t\t{\n\t\t\treturn 9254;\n\t\t}\n\t}\n\tnamespace NetheriteBlock\n\t{\n\t\tconstexpr BlockState NetheriteBlock()\n\t\t{\n\t\t\treturn 15826;\n\t\t}\n\t}\n\tnamespace Netherrack\n\t{\n\t\tconstexpr BlockState Netherrack()\n\t\t{\n\t\t\treturn 3999;\n\t\t}\n\t}\n\tnamespace NoteBlock\n\t{\n\t\tenum class Instrument\n\t\t{\n\t\t\tHarp,\n\t\t\tBasedrum,\n\t\t\tSnare,\n\t\t\tHat,\n\t\t\tBass,\n\t\t\tFlute,\n\t\t\tBell,\n\t\t\tGuitar,\n\t\t\tChime,\n\t\t\tXylophone,\n\t\t\tIronXylophone,\n\t\t\tCowBell,\n\t\t\tDidgeridoo,\n\t\t\tBit,\n\t\t\tBanjo,\n\t\t\tPling\n\t\t};\n\t\tconstexpr BlockState NoteBlock(const enum Instrument Instrument, const unsigned char Note, const bool Powered)\n\t\t{\n\t\t\tif (Instrument == Instrument::Harp)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 249;\n\t\t\t\t\telse return 250;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 251;\n\t\t\t\t\telse return 252;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 253;\n\t\t\t\t\telse return 254;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 255;\n\t\t\t\t\telse return 256;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 257;\n\t\t\t\t\telse return 258;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 259;\n\t\t\t\t\telse return 260;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 261;\n\t\t\t\t\telse return 262;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 263;\n\t\t\t\t\telse return 264;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 265;\n\t\t\t\t\telse return 266;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 267;\n\t\t\t\t\telse return 268;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 269;\n\t\t\t\t\telse return 270;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 271;\n\t\t\t\t\telse return 272;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 273;\n\t\t\t\t\telse return 274;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 275;\n\t\t\t\t\telse return 276;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 277;\n\t\t\t\t\telse return 278;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 279;\n\t\t\t\t\telse return 280;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 281;\n\t\t\t\t\telse return 282;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 283;\n\t\t\t\t\telse return 284;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 285;\n\t\t\t\t\telse return 286;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 287;\n\t\t\t\t\telse return 288;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 289;\n\t\t\t\t\telse return 290;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 291;\n\t\t\t\t\telse return 292;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 293;\n\t\t\t\t\telse return 294;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 295;\n\t\t\t\t\telse return 296;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 297;\n\t\t\t\t\telse return 298;\n\t\t\telse if (Instrument == Instrument::Basedrum)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 299;\n\t\t\t\t\telse return 300;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 301;\n\t\t\t\t\telse return 302;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 303;\n\t\t\t\t\telse return 304;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 305;\n\t\t\t\t\telse return 306;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 307;\n\t\t\t\t\telse return 308;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 309;\n\t\t\t\t\telse return 310;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 311;\n\t\t\t\t\telse return 312;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 313;\n\t\t\t\t\telse return 314;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 315;\n\t\t\t\t\telse return 316;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 317;\n\t\t\t\t\telse return 318;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 319;\n\t\t\t\t\telse return 320;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 321;\n\t\t\t\t\telse return 322;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 323;\n\t\t\t\t\telse return 324;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 325;\n\t\t\t\t\telse return 326;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 327;\n\t\t\t\t\telse return 328;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 329;\n\t\t\t\t\telse return 330;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 331;\n\t\t\t\t\telse return 332;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 333;\n\t\t\t\t\telse return 334;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 335;\n\t\t\t\t\telse return 336;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 337;\n\t\t\t\t\telse return 338;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 339;\n\t\t\t\t\telse return 340;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 341;\n\t\t\t\t\telse return 342;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 343;\n\t\t\t\t\telse return 344;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 345;\n\t\t\t\t\telse return 346;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 347;\n\t\t\t\t\telse return 348;\n\t\t\telse if (Instrument == Instrument::Snare)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 349;\n\t\t\t\t\telse return 350;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 351;\n\t\t\t\t\telse return 352;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 353;\n\t\t\t\t\telse return 354;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 355;\n\t\t\t\t\telse return 356;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 357;\n\t\t\t\t\telse return 358;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 359;\n\t\t\t\t\telse return 360;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 361;\n\t\t\t\t\telse return 362;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 363;\n\t\t\t\t\telse return 364;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 365;\n\t\t\t\t\telse return 366;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 367;\n\t\t\t\t\telse return 368;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 369;\n\t\t\t\t\telse return 370;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 371;\n\t\t\t\t\telse return 372;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 373;\n\t\t\t\t\telse return 374;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 375;\n\t\t\t\t\telse return 376;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 377;\n\t\t\t\t\telse return 378;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 379;\n\t\t\t\t\telse return 380;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 381;\n\t\t\t\t\telse return 382;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 383;\n\t\t\t\t\telse return 384;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 385;\n\t\t\t\t\telse return 386;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 387;\n\t\t\t\t\telse return 388;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 389;\n\t\t\t\t\telse return 390;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 391;\n\t\t\t\t\telse return 392;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 393;\n\t\t\t\t\telse return 394;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 395;\n\t\t\t\t\telse return 396;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 397;\n\t\t\t\t\telse return 398;\n\t\t\telse if (Instrument == Instrument::Hat)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 399;\n\t\t\t\t\telse return 400;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 401;\n\t\t\t\t\telse return 402;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 403;\n\t\t\t\t\telse return 404;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 405;\n\t\t\t\t\telse return 406;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 407;\n\t\t\t\t\telse return 408;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 409;\n\t\t\t\t\telse return 410;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 411;\n\t\t\t\t\telse return 412;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 413;\n\t\t\t\t\telse return 414;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 415;\n\t\t\t\t\telse return 416;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 417;\n\t\t\t\t\telse return 418;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 419;\n\t\t\t\t\telse return 420;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 421;\n\t\t\t\t\telse return 422;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 423;\n\t\t\t\t\telse return 424;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 425;\n\t\t\t\t\telse return 426;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 427;\n\t\t\t\t\telse return 428;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 429;\n\t\t\t\t\telse return 430;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 431;\n\t\t\t\t\telse return 432;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 433;\n\t\t\t\t\telse return 434;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 435;\n\t\t\t\t\telse return 436;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 437;\n\t\t\t\t\telse return 438;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 439;\n\t\t\t\t\telse return 440;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 441;\n\t\t\t\t\telse return 442;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 443;\n\t\t\t\t\telse return 444;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 445;\n\t\t\t\t\telse return 446;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 447;\n\t\t\t\t\telse return 448;\n\t\t\telse if (Instrument == Instrument::Bass)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 449;\n\t\t\t\t\telse return 450;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 451;\n\t\t\t\t\telse return 452;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 453;\n\t\t\t\t\telse return 454;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 455;\n\t\t\t\t\telse return 456;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 457;\n\t\t\t\t\telse return 458;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 459;\n\t\t\t\t\telse return 460;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 461;\n\t\t\t\t\telse return 462;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 463;\n\t\t\t\t\telse return 464;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 465;\n\t\t\t\t\telse return 466;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 467;\n\t\t\t\t\telse return 468;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 469;\n\t\t\t\t\telse return 470;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 471;\n\t\t\t\t\telse return 472;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 473;\n\t\t\t\t\telse return 474;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 475;\n\t\t\t\t\telse return 476;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 477;\n\t\t\t\t\telse return 478;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 479;\n\t\t\t\t\telse return 480;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 481;\n\t\t\t\t\telse return 482;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 483;\n\t\t\t\t\telse return 484;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 485;\n\t\t\t\t\telse return 486;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 487;\n\t\t\t\t\telse return 488;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 489;\n\t\t\t\t\telse return 490;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 491;\n\t\t\t\t\telse return 492;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 493;\n\t\t\t\t\telse return 494;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 495;\n\t\t\t\t\telse return 496;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 497;\n\t\t\t\t\telse return 498;\n\t\t\telse if (Instrument == Instrument::Flute)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 499;\n\t\t\t\t\telse return 500;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 501;\n\t\t\t\t\telse return 502;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 503;\n\t\t\t\t\telse return 504;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 505;\n\t\t\t\t\telse return 506;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 507;\n\t\t\t\t\telse return 508;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 509;\n\t\t\t\t\telse return 510;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 511;\n\t\t\t\t\telse return 512;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 513;\n\t\t\t\t\telse return 514;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 515;\n\t\t\t\t\telse return 516;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 517;\n\t\t\t\t\telse return 518;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 519;\n\t\t\t\t\telse return 520;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 521;\n\t\t\t\t\telse return 522;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 523;\n\t\t\t\t\telse return 524;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 525;\n\t\t\t\t\telse return 526;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 527;\n\t\t\t\t\telse return 528;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 529;\n\t\t\t\t\telse return 530;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 531;\n\t\t\t\t\telse return 532;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 533;\n\t\t\t\t\telse return 534;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 535;\n\t\t\t\t\telse return 536;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 537;\n\t\t\t\t\telse return 538;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 539;\n\t\t\t\t\telse return 540;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 541;\n\t\t\t\t\telse return 542;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 543;\n\t\t\t\t\telse return 544;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 545;\n\t\t\t\t\telse return 546;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 547;\n\t\t\t\t\telse return 548;\n\t\t\telse if (Instrument == Instrument::Bell)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 549;\n\t\t\t\t\telse return 550;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 551;\n\t\t\t\t\telse return 552;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 553;\n\t\t\t\t\telse return 554;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 555;\n\t\t\t\t\telse return 556;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 557;\n\t\t\t\t\telse return 558;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 559;\n\t\t\t\t\telse return 560;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 561;\n\t\t\t\t\telse return 562;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 563;\n\t\t\t\t\telse return 564;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 565;\n\t\t\t\t\telse return 566;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 567;\n\t\t\t\t\telse return 568;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 569;\n\t\t\t\t\telse return 570;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 571;\n\t\t\t\t\telse return 572;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 573;\n\t\t\t\t\telse return 574;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 575;\n\t\t\t\t\telse return 576;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 577;\n\t\t\t\t\telse return 578;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 579;\n\t\t\t\t\telse return 580;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 581;\n\t\t\t\t\telse return 582;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 583;\n\t\t\t\t\telse return 584;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 585;\n\t\t\t\t\telse return 586;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 587;\n\t\t\t\t\telse return 588;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 589;\n\t\t\t\t\telse return 590;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 591;\n\t\t\t\t\telse return 592;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 593;\n\t\t\t\t\telse return 594;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 595;\n\t\t\t\t\telse return 596;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 597;\n\t\t\t\t\telse return 598;\n\t\t\telse if (Instrument == Instrument::Guitar)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 599;\n\t\t\t\t\telse return 600;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 601;\n\t\t\t\t\telse return 602;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 603;\n\t\t\t\t\telse return 604;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 605;\n\t\t\t\t\telse return 606;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 607;\n\t\t\t\t\telse return 608;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 609;\n\t\t\t\t\telse return 610;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 611;\n\t\t\t\t\telse return 612;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 613;\n\t\t\t\t\telse return 614;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 615;\n\t\t\t\t\telse return 616;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 617;\n\t\t\t\t\telse return 618;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 619;\n\t\t\t\t\telse return 620;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 621;\n\t\t\t\t\telse return 622;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 623;\n\t\t\t\t\telse return 624;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 625;\n\t\t\t\t\telse return 626;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 627;\n\t\t\t\t\telse return 628;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 629;\n\t\t\t\t\telse return 630;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 631;\n\t\t\t\t\telse return 632;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 633;\n\t\t\t\t\telse return 634;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 635;\n\t\t\t\t\telse return 636;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 637;\n\t\t\t\t\telse return 638;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 639;\n\t\t\t\t\telse return 640;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 641;\n\t\t\t\t\telse return 642;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 643;\n\t\t\t\t\telse return 644;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 645;\n\t\t\t\t\telse return 646;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 647;\n\t\t\t\t\telse return 648;\n\t\t\telse if (Instrument == Instrument::Chime)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 649;\n\t\t\t\t\telse return 650;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 651;\n\t\t\t\t\telse return 652;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 653;\n\t\t\t\t\telse return 654;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 655;\n\t\t\t\t\telse return 656;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 657;\n\t\t\t\t\telse return 658;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 659;\n\t\t\t\t\telse return 660;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 661;\n\t\t\t\t\telse return 662;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 663;\n\t\t\t\t\telse return 664;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 665;\n\t\t\t\t\telse return 666;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 667;\n\t\t\t\t\telse return 668;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 669;\n\t\t\t\t\telse return 670;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 671;\n\t\t\t\t\telse return 672;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 673;\n\t\t\t\t\telse return 674;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 675;\n\t\t\t\t\telse return 676;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 677;\n\t\t\t\t\telse return 678;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 679;\n\t\t\t\t\telse return 680;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 681;\n\t\t\t\t\telse return 682;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 683;\n\t\t\t\t\telse return 684;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 685;\n\t\t\t\t\telse return 686;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 687;\n\t\t\t\t\telse return 688;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 689;\n\t\t\t\t\telse return 690;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 691;\n\t\t\t\t\telse return 692;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 693;\n\t\t\t\t\telse return 694;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 695;\n\t\t\t\t\telse return 696;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 697;\n\t\t\t\t\telse return 698;\n\t\t\telse if (Instrument == Instrument::Xylophone)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 699;\n\t\t\t\t\telse return 700;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 701;\n\t\t\t\t\telse return 702;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 703;\n\t\t\t\t\telse return 704;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 705;\n\t\t\t\t\telse return 706;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 707;\n\t\t\t\t\telse return 708;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 709;\n\t\t\t\t\telse return 710;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 711;\n\t\t\t\t\telse return 712;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 713;\n\t\t\t\t\telse return 714;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 715;\n\t\t\t\t\telse return 716;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 717;\n\t\t\t\t\telse return 718;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 719;\n\t\t\t\t\telse return 720;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 721;\n\t\t\t\t\telse return 722;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 723;\n\t\t\t\t\telse return 724;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 725;\n\t\t\t\t\telse return 726;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 727;\n\t\t\t\t\telse return 728;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 729;\n\t\t\t\t\telse return 730;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 731;\n\t\t\t\t\telse return 732;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 733;\n\t\t\t\t\telse return 734;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 735;\n\t\t\t\t\telse return 736;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 737;\n\t\t\t\t\telse return 738;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 739;\n\t\t\t\t\telse return 740;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 741;\n\t\t\t\t\telse return 742;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 743;\n\t\t\t\t\telse return 744;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 745;\n\t\t\t\t\telse return 746;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 747;\n\t\t\t\t\telse return 748;\n\t\t\telse if (Instrument == Instrument::IronXylophone)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 749;\n\t\t\t\t\telse return 750;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 751;\n\t\t\t\t\telse return 752;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 753;\n\t\t\t\t\telse return 754;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 755;\n\t\t\t\t\telse return 756;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 757;\n\t\t\t\t\telse return 758;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 759;\n\t\t\t\t\telse return 760;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 761;\n\t\t\t\t\telse return 762;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 763;\n\t\t\t\t\telse return 764;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 765;\n\t\t\t\t\telse return 766;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 767;\n\t\t\t\t\telse return 768;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 769;\n\t\t\t\t\telse return 770;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 771;\n\t\t\t\t\telse return 772;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 773;\n\t\t\t\t\telse return 774;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 775;\n\t\t\t\t\telse return 776;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 777;\n\t\t\t\t\telse return 778;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 779;\n\t\t\t\t\telse return 780;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 781;\n\t\t\t\t\telse return 782;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 783;\n\t\t\t\t\telse return 784;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 785;\n\t\t\t\t\telse return 786;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 787;\n\t\t\t\t\telse return 788;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 789;\n\t\t\t\t\telse return 790;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 791;\n\t\t\t\t\telse return 792;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 793;\n\t\t\t\t\telse return 794;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 795;\n\t\t\t\t\telse return 796;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 797;\n\t\t\t\t\telse return 798;\n\t\t\telse if (Instrument == Instrument::CowBell)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 799;\n\t\t\t\t\telse return 800;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 801;\n\t\t\t\t\telse return 802;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 803;\n\t\t\t\t\telse return 804;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 805;\n\t\t\t\t\telse return 806;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 807;\n\t\t\t\t\telse return 808;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 809;\n\t\t\t\t\telse return 810;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 811;\n\t\t\t\t\telse return 812;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 813;\n\t\t\t\t\telse return 814;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 815;\n\t\t\t\t\telse return 816;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 817;\n\t\t\t\t\telse return 818;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 819;\n\t\t\t\t\telse return 820;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 821;\n\t\t\t\t\telse return 822;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 823;\n\t\t\t\t\telse return 824;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 825;\n\t\t\t\t\telse return 826;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 827;\n\t\t\t\t\telse return 828;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 829;\n\t\t\t\t\telse return 830;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 831;\n\t\t\t\t\telse return 832;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 833;\n\t\t\t\t\telse return 834;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 835;\n\t\t\t\t\telse return 836;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 837;\n\t\t\t\t\telse return 838;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 839;\n\t\t\t\t\telse return 840;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 841;\n\t\t\t\t\telse return 842;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 843;\n\t\t\t\t\telse return 844;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 845;\n\t\t\t\t\telse return 846;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 847;\n\t\t\t\t\telse return 848;\n\t\t\telse if (Instrument == Instrument::Didgeridoo)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 849;\n\t\t\t\t\telse return 850;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 851;\n\t\t\t\t\telse return 852;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 853;\n\t\t\t\t\telse return 854;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 855;\n\t\t\t\t\telse return 856;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 857;\n\t\t\t\t\telse return 858;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 859;\n\t\t\t\t\telse return 860;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 861;\n\t\t\t\t\telse return 862;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 863;\n\t\t\t\t\telse return 864;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 865;\n\t\t\t\t\telse return 866;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 867;\n\t\t\t\t\telse return 868;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 869;\n\t\t\t\t\telse return 870;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 871;\n\t\t\t\t\telse return 872;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 873;\n\t\t\t\t\telse return 874;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 875;\n\t\t\t\t\telse return 876;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 877;\n\t\t\t\t\telse return 878;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 879;\n\t\t\t\t\telse return 880;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 881;\n\t\t\t\t\telse return 882;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 883;\n\t\t\t\t\telse return 884;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 885;\n\t\t\t\t\telse return 886;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 887;\n\t\t\t\t\telse return 888;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 889;\n\t\t\t\t\telse return 890;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 891;\n\t\t\t\t\telse return 892;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 893;\n\t\t\t\t\telse return 894;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 895;\n\t\t\t\t\telse return 896;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 897;\n\t\t\t\t\telse return 898;\n\t\t\telse if (Instrument == Instrument::Bit)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 899;\n\t\t\t\t\telse return 900;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 901;\n\t\t\t\t\telse return 902;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 903;\n\t\t\t\t\telse return 904;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 905;\n\t\t\t\t\telse return 906;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 907;\n\t\t\t\t\telse return 908;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 909;\n\t\t\t\t\telse return 910;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 911;\n\t\t\t\t\telse return 912;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 913;\n\t\t\t\t\telse return 914;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 915;\n\t\t\t\t\telse return 916;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 917;\n\t\t\t\t\telse return 918;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 919;\n\t\t\t\t\telse return 920;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 921;\n\t\t\t\t\telse return 922;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 923;\n\t\t\t\t\telse return 924;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 925;\n\t\t\t\t\telse return 926;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 927;\n\t\t\t\t\telse return 928;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 929;\n\t\t\t\t\telse return 930;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 931;\n\t\t\t\t\telse return 932;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 933;\n\t\t\t\t\telse return 934;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 935;\n\t\t\t\t\telse return 936;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 937;\n\t\t\t\t\telse return 938;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 939;\n\t\t\t\t\telse return 940;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 941;\n\t\t\t\t\telse return 942;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 943;\n\t\t\t\t\telse return 944;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 945;\n\t\t\t\t\telse return 946;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 947;\n\t\t\t\t\telse return 948;\n\t\t\telse if (Instrument == Instrument::Banjo)\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 949;\n\t\t\t\t\telse return 950;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 951;\n\t\t\t\t\telse return 952;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 953;\n\t\t\t\t\telse return 954;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 955;\n\t\t\t\t\telse return 956;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 957;\n\t\t\t\t\telse return 958;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 959;\n\t\t\t\t\telse return 960;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 961;\n\t\t\t\t\telse return 962;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 963;\n\t\t\t\t\telse return 964;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 965;\n\t\t\t\t\telse return 966;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 967;\n\t\t\t\t\telse return 968;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 969;\n\t\t\t\t\telse return 970;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 971;\n\t\t\t\t\telse return 972;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 973;\n\t\t\t\t\telse return 974;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 975;\n\t\t\t\t\telse return 976;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 977;\n\t\t\t\t\telse return 978;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 979;\n\t\t\t\t\telse return 980;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 981;\n\t\t\t\t\telse return 982;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 983;\n\t\t\t\t\telse return 984;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 985;\n\t\t\t\t\telse return 986;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 987;\n\t\t\t\t\telse return 988;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 989;\n\t\t\t\t\telse return 990;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 991;\n\t\t\t\t\telse return 992;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 993;\n\t\t\t\t\telse return 994;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 995;\n\t\t\t\t\telse return 996;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 997;\n\t\t\t\t\telse return 998;\n\t\t\telse\n\t\t\t\tif (Note == 0)\n\t\t\t\t\tif (Powered) return 999;\n\t\t\t\t\telse return 1000;\n\t\t\t\telse if (Note == 1)\n\t\t\t\t\tif (Powered) return 1001;\n\t\t\t\t\telse return 1002;\n\t\t\t\telse if (Note == 2)\n\t\t\t\t\tif (Powered) return 1003;\n\t\t\t\t\telse return 1004;\n\t\t\t\telse if (Note == 3)\n\t\t\t\t\tif (Powered) return 1005;\n\t\t\t\t\telse return 1006;\n\t\t\t\telse if (Note == 4)\n\t\t\t\t\tif (Powered) return 1007;\n\t\t\t\t\telse return 1008;\n\t\t\t\telse if (Note == 5)\n\t\t\t\t\tif (Powered) return 1009;\n\t\t\t\t\telse return 1010;\n\t\t\t\telse if (Note == 6)\n\t\t\t\t\tif (Powered) return 1011;\n\t\t\t\t\telse return 1012;\n\t\t\t\telse if (Note == 7)\n\t\t\t\t\tif (Powered) return 1013;\n\t\t\t\t\telse return 1014;\n\t\t\t\telse if (Note == 8)\n\t\t\t\t\tif (Powered) return 1015;\n\t\t\t\t\telse return 1016;\n\t\t\t\telse if (Note == 9)\n\t\t\t\t\tif (Powered) return 1017;\n\t\t\t\t\telse return 1018;\n\t\t\t\telse if (Note == 10)\n\t\t\t\t\tif (Powered) return 1019;\n\t\t\t\t\telse return 1020;\n\t\t\t\telse if (Note == 11)\n\t\t\t\t\tif (Powered) return 1021;\n\t\t\t\t\telse return 1022;\n\t\t\t\telse if (Note == 12)\n\t\t\t\t\tif (Powered) return 1023;\n\t\t\t\t\telse return 1024;\n\t\t\t\telse if (Note == 13)\n\t\t\t\t\tif (Powered) return 1025;\n\t\t\t\t\telse return 1026;\n\t\t\t\telse if (Note == 14)\n\t\t\t\t\tif (Powered) return 1027;\n\t\t\t\t\telse return 1028;\n\t\t\t\telse if (Note == 15)\n\t\t\t\t\tif (Powered) return 1029;\n\t\t\t\t\telse return 1030;\n\t\t\t\telse if (Note == 16)\n\t\t\t\t\tif (Powered) return 1031;\n\t\t\t\t\telse return 1032;\n\t\t\t\telse if (Note == 17)\n\t\t\t\t\tif (Powered) return 1033;\n\t\t\t\t\telse return 1034;\n\t\t\t\telse if (Note == 18)\n\t\t\t\t\tif (Powered) return 1035;\n\t\t\t\t\telse return 1036;\n\t\t\t\telse if (Note == 19)\n\t\t\t\t\tif (Powered) return 1037;\n\t\t\t\t\telse return 1038;\n\t\t\t\telse if (Note == 20)\n\t\t\t\t\tif (Powered) return 1039;\n\t\t\t\t\telse return 1040;\n\t\t\t\telse if (Note == 21)\n\t\t\t\t\tif (Powered) return 1041;\n\t\t\t\t\telse return 1042;\n\t\t\t\telse if (Note == 22)\n\t\t\t\t\tif (Powered) return 1043;\n\t\t\t\t\telse return 1044;\n\t\t\t\telse if (Note == 23)\n\t\t\t\t\tif (Powered) return 1045;\n\t\t\t\t\telse return 1046;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 1047;\n\t\t\t\t\telse return 1048;\n\t\t}\n\t\tBlockState NoteBlock();\n\t\tenum Instrument Instrument(BlockState Block);\n\t\tunsigned char Note(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace OakButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState OakButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6346;\n\t\t\t\t\telse return 6347;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6348;\n\t\t\t\t\telse return 6349;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6350;\n\t\t\t\t\telse return 6351;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6352;\n\t\t\t\t\telse return 6353;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6354;\n\t\t\t\t\telse return 6355;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6356;\n\t\t\t\t\telse return 6357;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6358;\n\t\t\t\t\telse return 6359;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6360;\n\t\t\t\t\telse return 6361;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6362;\n\t\t\t\t\telse return 6363;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6364;\n\t\t\t\t\telse return 6365;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6366;\n\t\t\t\t\telse return 6367;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6368;\n\t\t\t\t\telse return 6369;\n\t\t}\n\t\tBlockState OakButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace OakDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState OakDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3573;\n\t\t\t\t\t\t\telse return 3574;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3575;\n\t\t\t\t\t\t\telse return 3576;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3577;\n\t\t\t\t\t\t\telse return 3578;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3579;\n\t\t\t\t\t\t\telse return 3580;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3581;\n\t\t\t\t\t\t\telse return 3582;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3583;\n\t\t\t\t\t\t\telse return 3584;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3585;\n\t\t\t\t\t\t\telse return 3586;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3587;\n\t\t\t\t\t\t\telse return 3588;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3589;\n\t\t\t\t\t\t\telse return 3590;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3591;\n\t\t\t\t\t\t\telse return 3592;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3593;\n\t\t\t\t\t\t\telse return 3594;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3595;\n\t\t\t\t\t\t\telse return 3596;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3597;\n\t\t\t\t\t\t\telse return 3598;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3599;\n\t\t\t\t\t\t\telse return 3600;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3601;\n\t\t\t\t\t\t\telse return 3602;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3603;\n\t\t\t\t\t\t\telse return 3604;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3605;\n\t\t\t\t\t\t\telse return 3606;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3607;\n\t\t\t\t\t\t\telse return 3608;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3609;\n\t\t\t\t\t\t\telse return 3610;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3611;\n\t\t\t\t\t\t\telse return 3612;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3613;\n\t\t\t\t\t\t\telse return 3614;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3615;\n\t\t\t\t\t\t\telse return 3616;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3617;\n\t\t\t\t\t\t\telse return 3618;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3619;\n\t\t\t\t\t\t\telse return 3620;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3621;\n\t\t\t\t\t\t\telse return 3622;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3623;\n\t\t\t\t\t\t\telse return 3624;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3625;\n\t\t\t\t\t\t\telse return 3626;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3627;\n\t\t\t\t\t\t\telse return 3628;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3629;\n\t\t\t\t\t\t\telse return 3630;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3631;\n\t\t\t\t\t\t\telse return 3632;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 3633;\n\t\t\t\t\t\t\telse return 3634;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 3635;\n\t\t\t\t\t\t\telse return 3636;\n\t\t}\n\t\tBlockState OakDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace OakFence\n\t{\n\t\tconstexpr BlockState OakFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 3968;\n\t\t\t\t\t\telse return 3969;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 3972;\n\t\t\t\t\t\telse return 3973;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 3976;\n\t\t\t\t\t\telse return 3977;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 3980;\n\t\t\t\t\t\telse return 3981;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 3984;\n\t\t\t\t\t\telse return 3985;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 3988;\n\t\t\t\t\t\telse return 3989;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 3992;\n\t\t\t\t\t\telse return 3993;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 3996;\n\t\t\t\t\t\telse return 3997;\n\t\t}\n\t\tBlockState OakFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace OakFenceGate\n\t{\n\t\tconstexpr BlockState OakFenceGate(const eBlockFace Facing, const bool InWall, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4820;\n\t\t\t\t\t\telse return 4821;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4822;\n\t\t\t\t\t\telse return 4823;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4824;\n\t\t\t\t\t\telse return 4825;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4826;\n\t\t\t\t\t\telse return 4827;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4828;\n\t\t\t\t\t\telse return 4829;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4830;\n\t\t\t\t\t\telse return 4831;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4832;\n\t\t\t\t\t\telse return 4833;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4834;\n\t\t\t\t\t\telse return 4835;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4836;\n\t\t\t\t\t\telse return 4837;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4838;\n\t\t\t\t\t\telse return 4839;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4840;\n\t\t\t\t\t\telse return 4841;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4842;\n\t\t\t\t\t\telse return 4843;\n\t\t\telse\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4844;\n\t\t\t\t\t\telse return 4845;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4846;\n\t\t\t\t\t\telse return 4847;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4848;\n\t\t\t\t\t\telse return 4849;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4850;\n\t\t\t\t\t\telse return 4851;\n\t\t}\n\t\tBlockState OakFenceGate();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool InWall(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace OakLeaves\n\t{\n\t\tconstexpr BlockState OakLeaves(const unsigned char Distance, const bool Persistent)\n\t\t{\n\t\t\tif (Distance == 1)\n\t\t\t\tif (Persistent) return 145;\n\t\t\t\telse return 146;\n\t\t\telse if (Distance == 2)\n\t\t\t\tif (Persistent) return 147;\n\t\t\t\telse return 148;\n\t\t\telse if (Distance == 3)\n\t\t\t\tif (Persistent) return 149;\n\t\t\t\telse return 150;\n\t\t\telse if (Distance == 4)\n\t\t\t\tif (Persistent) return 151;\n\t\t\t\telse return 152;\n\t\t\telse if (Distance == 5)\n\t\t\t\tif (Persistent) return 153;\n\t\t\t\telse return 154;\n\t\t\telse if (Distance == 6)\n\t\t\t\tif (Persistent) return 155;\n\t\t\t\telse return 156;\n\t\t\telse\n\t\t\t\tif (Persistent) return 157;\n\t\t\t\telse return 158;\n\t\t}\n\t\tBlockState OakLeaves();\n\t\tunsigned char Distance(BlockState Block);\n\t\tbool Persistent(BlockState Block);\n\t}\n\tnamespace OakLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState OakLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 73;\n\t\t\telse if (Axis == Axis::Y) return 74;\n\t\t\telse return 75;\n\t\t}\n\t\tBlockState OakLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace OakPlanks\n\t{\n\t\tconstexpr BlockState OakPlanks()\n\t\t{\n\t\t\treturn 15;\n\t\t}\n\t}\n\tnamespace OakPressurePlate\n\t{\n\t\tconstexpr BlockState OakPressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 3873;\n\t\t\telse return 3874;\n\t\t}\n\t\tBlockState OakPressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace OakSapling\n\t{\n\t\tconstexpr BlockState OakSapling(const unsigned char Stage)\n\t\t{\n\t\t\tif (Stage == 0) return 21;\n\t\t\telse return 22;\n\t\t}\n\t\tBlockState OakSapling();\n\t\tunsigned char Stage(BlockState Block);\n\t}\n\tnamespace OakSign\n\t{\n\t\tconstexpr BlockState OakSign(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 3382;\n\t\t\telse if (Rotation == 1) return 3384;\n\t\t\telse if (Rotation == 2) return 3386;\n\t\t\telse if (Rotation == 3) return 3388;\n\t\t\telse if (Rotation == 4) return 3390;\n\t\t\telse if (Rotation == 5) return 3392;\n\t\t\telse if (Rotation == 6) return 3394;\n\t\t\telse if (Rotation == 7) return 3396;\n\t\t\telse if (Rotation == 8) return 3398;\n\t\t\telse if (Rotation == 9) return 3400;\n\t\t\telse if (Rotation == 10) return 3402;\n\t\t\telse if (Rotation == 11) return 3404;\n\t\t\telse if (Rotation == 12) return 3406;\n\t\t\telse if (Rotation == 13) return 3408;\n\t\t\telse if (Rotation == 14) return 3410;\n\t\t\telse return 3412;\n\t\t}\n\t\tBlockState OakSign();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace OakSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState OakSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8301;\n\t\t\telse if (Type == Type::Bottom) return 8303;\n\t\t\telse return 8305;\n\t\t}\n\t\tBlockState OakSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace OakStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState OakStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 1955;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 1957;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 1959;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 1961;\n\t\t\t\t\telse return 1963;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 1965;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 1967;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 1969;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 1971;\n\t\t\t\t\telse return 1973;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 1975;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 1977;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 1979;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 1981;\n\t\t\t\t\telse return 1983;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 1985;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 1987;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 1989;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 1991;\n\t\t\t\t\telse return 1993;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 1995;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 1997;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 1999;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 2001;\n\t\t\t\t\telse return 2003;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 2005;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 2007;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 2009;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 2011;\n\t\t\t\t\telse return 2013;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 2015;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 2017;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 2019;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 2021;\n\t\t\t\t\telse return 2023;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 2025;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 2027;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 2029;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 2031;\n\t\t\t\t\telse return 2033;\n\t\t}\n\t\tBlockState OakStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace OakTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState OakTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4112;\n\t\t\t\t\t\telse return 4114;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4116;\n\t\t\t\t\t\telse return 4118;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4120;\n\t\t\t\t\t\telse return 4122;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4124;\n\t\t\t\t\t\telse return 4126;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4128;\n\t\t\t\t\t\telse return 4130;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4132;\n\t\t\t\t\t\telse return 4134;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4136;\n\t\t\t\t\t\telse return 4138;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4140;\n\t\t\t\t\t\telse return 4142;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4144;\n\t\t\t\t\t\telse return 4146;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4148;\n\t\t\t\t\t\telse return 4150;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4152;\n\t\t\t\t\t\telse return 4154;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4156;\n\t\t\t\t\t\telse return 4158;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4160;\n\t\t\t\t\t\telse return 4162;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4164;\n\t\t\t\t\t\telse return 4166;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4168;\n\t\t\t\t\t\telse return 4170;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4172;\n\t\t\t\t\t\telse return 4174;\n\t\t}\n\t\tBlockState OakTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace OakWallSign\n\t{\n\t\tconstexpr BlockState OakWallSign(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 3736;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 3738;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 3740;\n\t\t\telse return 3742;\n\t\t}\n\t\tBlockState OakWallSign();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace OakWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState OakWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 109;\n\t\t\telse if (Axis == Axis::Y) return 110;\n\t\t\telse return 111;\n\t\t}\n\t\tBlockState OakWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace Observer\n\t{\n\t\tconstexpr BlockState Observer(const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Powered) return 9260;\n\t\t\t\telse return 9261;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP)\n\t\t\t\tif (Powered) return 9262;\n\t\t\t\telse return 9263;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Powered) return 9264;\n\t\t\t\telse return 9265;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Powered) return 9266;\n\t\t\t\telse return 9267;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP)\n\t\t\t\tif (Powered) return 9268;\n\t\t\t\telse return 9269;\n\t\t\telse\n\t\t\t\tif (Powered) return 9270;\n\t\t\t\telse return 9271;\n\t\t}\n\t\tBlockState Observer();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace Obsidian\n\t{\n\t\tconstexpr BlockState Obsidian()\n\t\t{\n\t\t\treturn 1434;\n\t\t}\n\t}\n\tnamespace OrangeBanner\n\t{\n\t\tconstexpr BlockState OrangeBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 7913;\n\t\t\telse if (Rotation == 1) return 7914;\n\t\t\telse if (Rotation == 2) return 7915;\n\t\t\telse if (Rotation == 3) return 7916;\n\t\t\telse if (Rotation == 4) return 7917;\n\t\t\telse if (Rotation == 5) return 7918;\n\t\t\telse if (Rotation == 6) return 7919;\n\t\t\telse if (Rotation == 7) return 7920;\n\t\t\telse if (Rotation == 8) return 7921;\n\t\t\telse if (Rotation == 9) return 7922;\n\t\t\telse if (Rotation == 10) return 7923;\n\t\t\telse if (Rotation == 11) return 7924;\n\t\t\telse if (Rotation == 12) return 7925;\n\t\t\telse if (Rotation == 13) return 7926;\n\t\t\telse if (Rotation == 14) return 7927;\n\t\t\telse return 7928;\n\t\t}\n\t\tBlockState OrangeBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace OrangeBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState OrangeBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1065;\n\t\t\t\t\telse return 1066;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1067;\n\t\t\t\t\telse return 1068;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1069;\n\t\t\t\t\telse return 1070;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1071;\n\t\t\t\t\telse return 1072;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1073;\n\t\t\t\t\telse return 1074;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1075;\n\t\t\t\t\telse return 1076;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1077;\n\t\t\t\t\telse return 1078;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1079;\n\t\t\t\t\telse return 1080;\n\t\t}\n\t\tBlockState OrangeBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace OrangeCarpet\n\t{\n\t\tconstexpr BlockState OrangeCarpet()\n\t\t{\n\t\t\treturn 7867;\n\t\t}\n\t}\n\tnamespace OrangeConcrete\n\t{\n\t\tconstexpr BlockState OrangeConcrete()\n\t\t{\n\t\t\treturn 9439;\n\t\t}\n\t}\n\tnamespace OrangeConcretePowder\n\t{\n\t\tconstexpr BlockState OrangeConcretePowder()\n\t\t{\n\t\t\treturn 9455;\n\t\t}\n\t}\n\tnamespace OrangeGlazedTerracotta\n\t{\n\t\tconstexpr BlockState OrangeGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9378;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9379;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9380;\n\t\t\telse return 9381;\n\t\t}\n\t\tBlockState OrangeGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace OrangeShulkerBox\n\t{\n\t\tconstexpr BlockState OrangeShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9284;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9285;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9286;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9287;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9288;\n\t\t\telse return 9289;\n\t\t}\n\t\tBlockState OrangeShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace OrangeStainedGlass\n\t{\n\t\tconstexpr BlockState OrangeStainedGlass()\n\t\t{\n\t\t\treturn 4096;\n\t\t}\n\t}\n\tnamespace OrangeStainedGlassPane\n\t{\n\t\tconstexpr BlockState OrangeStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6897;\n\t\t\t\t\t\telse return 6898;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6901;\n\t\t\t\t\t\telse return 6902;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6905;\n\t\t\t\t\t\telse return 6906;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6909;\n\t\t\t\t\t\telse return 6910;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6913;\n\t\t\t\t\t\telse return 6914;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6917;\n\t\t\t\t\t\telse return 6918;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6921;\n\t\t\t\t\t\telse return 6922;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6925;\n\t\t\t\t\t\telse return 6926;\n\t\t}\n\t\tBlockState OrangeStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace OrangeTerracotta\n\t{\n\t\tconstexpr BlockState OrangeTerracotta()\n\t\t{\n\t\t\treturn 6848;\n\t\t}\n\t}\n\tnamespace OrangeTulip\n\t{\n\t\tconstexpr BlockState OrangeTulip()\n\t\t{\n\t\t\treturn 1418;\n\t\t}\n\t}\n\tnamespace OrangeWallBanner\n\t{\n\t\tconstexpr BlockState OrangeWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8157;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8158;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8159;\n\t\t\telse return 8160;\n\t\t}\n\t\tBlockState OrangeWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace OrangeWool\n\t{\n\t\tconstexpr BlockState OrangeWool()\n\t\t{\n\t\t\treturn 1385;\n\t\t}\n\t}\n\tnamespace OxeyeDaisy\n\t{\n\t\tconstexpr BlockState OxeyeDaisy()\n\t\t{\n\t\t\treturn 1421;\n\t\t}\n\t}\n\tnamespace PackedIce\n\t{\n\t\tconstexpr BlockState PackedIce()\n\t\t{\n\t\t\treturn 7884;\n\t\t}\n\t}\n\tnamespace Peony\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tconstexpr BlockState Peony(const enum Half Half)\n\t\t{\n\t\t\tif (Half == Half::Upper) return 7891;\n\t\t\telse return 7892;\n\t\t}\n\t\tBlockState Peony();\n\t\tenum Half Half(BlockState Block);\n\t}\n\tnamespace PetrifiedOakSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PetrifiedOakSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8361;\n\t\t\telse if (Type == Type::Bottom) return 8363;\n\t\t\telse return 8365;\n\t\t}\n\t\tBlockState PetrifiedOakSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PinkBanner\n\t{\n\t\tconstexpr BlockState PinkBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 7993;\n\t\t\telse if (Rotation == 1) return 7994;\n\t\t\telse if (Rotation == 2) return 7995;\n\t\t\telse if (Rotation == 3) return 7996;\n\t\t\telse if (Rotation == 4) return 7997;\n\t\t\telse if (Rotation == 5) return 7998;\n\t\t\telse if (Rotation == 6) return 7999;\n\t\t\telse if (Rotation == 7) return 8000;\n\t\t\telse if (Rotation == 8) return 8001;\n\t\t\telse if (Rotation == 9) return 8002;\n\t\t\telse if (Rotation == 10) return 8003;\n\t\t\telse if (Rotation == 11) return 8004;\n\t\t\telse if (Rotation == 12) return 8005;\n\t\t\telse if (Rotation == 13) return 8006;\n\t\t\telse if (Rotation == 14) return 8007;\n\t\t\telse return 8008;\n\t\t}\n\t\tBlockState PinkBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace PinkBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState PinkBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1145;\n\t\t\t\t\telse return 1146;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1147;\n\t\t\t\t\telse return 1148;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1149;\n\t\t\t\t\telse return 1150;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1151;\n\t\t\t\t\telse return 1152;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1153;\n\t\t\t\t\telse return 1154;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1155;\n\t\t\t\t\telse return 1156;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1157;\n\t\t\t\t\telse return 1158;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1159;\n\t\t\t\t\telse return 1160;\n\t\t}\n\t\tBlockState PinkBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace PinkCarpet\n\t{\n\t\tconstexpr BlockState PinkCarpet()\n\t\t{\n\t\t\treturn 7872;\n\t\t}\n\t}\n\tnamespace PinkConcrete\n\t{\n\t\tconstexpr BlockState PinkConcrete()\n\t\t{\n\t\t\treturn 9444;\n\t\t}\n\t}\n\tnamespace PinkConcretePowder\n\t{\n\t\tconstexpr BlockState PinkConcretePowder()\n\t\t{\n\t\t\treturn 9460;\n\t\t}\n\t}\n\tnamespace PinkGlazedTerracotta\n\t{\n\t\tconstexpr BlockState PinkGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9398;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9399;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9400;\n\t\t\telse return 9401;\n\t\t}\n\t\tBlockState PinkGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace PinkShulkerBox\n\t{\n\t\tconstexpr BlockState PinkShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9314;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9315;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9316;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9317;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9318;\n\t\t\telse return 9319;\n\t\t}\n\t\tBlockState PinkShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace PinkStainedGlass\n\t{\n\t\tconstexpr BlockState PinkStainedGlass()\n\t\t{\n\t\t\treturn 4101;\n\t\t}\n\t}\n\tnamespace PinkStainedGlassPane\n\t{\n\t\tconstexpr BlockState PinkStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7057;\n\t\t\t\t\t\telse return 7058;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7061;\n\t\t\t\t\t\telse return 7062;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7065;\n\t\t\t\t\t\telse return 7066;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7069;\n\t\t\t\t\t\telse return 7070;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7073;\n\t\t\t\t\t\telse return 7074;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7077;\n\t\t\t\t\t\telse return 7078;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7081;\n\t\t\t\t\t\telse return 7082;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7085;\n\t\t\t\t\t\telse return 7086;\n\t\t}\n\t\tBlockState PinkStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace PinkTerracotta\n\t{\n\t\tconstexpr BlockState PinkTerracotta()\n\t\t{\n\t\t\treturn 6853;\n\t\t}\n\t}\n\tnamespace PinkTulip\n\t{\n\t\tconstexpr BlockState PinkTulip()\n\t\t{\n\t\t\treturn 1420;\n\t\t}\n\t}\n\tnamespace PinkWallBanner\n\t{\n\t\tconstexpr BlockState PinkWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8177;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8178;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8179;\n\t\t\telse return 8180;\n\t\t}\n\t\tBlockState PinkWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace PinkWool\n\t{\n\t\tconstexpr BlockState PinkWool()\n\t\t{\n\t\t\treturn 1390;\n\t\t}\n\t}\n\tnamespace Piston\n\t{\n\t\tconstexpr BlockState Piston(const bool Extended, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Extended)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 1348;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 1349;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 1350;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 1351;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 1352;\n\t\t\t\telse return 1353;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 1354;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 1355;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 1356;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 1357;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 1358;\n\t\t\t\telse return 1359;\n\t\t}\n\t\tBlockState Piston();\n\t\tbool Extended(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace PistonHead\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tNormal,\n\t\t\tSticky\n\t\t};\n\t\tconstexpr BlockState PistonHead(const eBlockFace Facing, const bool Short, const enum Type Type)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Short)\n\t\t\t\t\tif (Type == Type::Normal) return 1360;\n\t\t\t\t\telse return 1361;\n\t\t\t\telse\n\t\t\t\t\tif (Type == Type::Normal) return 1362;\n\t\t\t\t\telse return 1363;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP)\n\t\t\t\tif (Short)\n\t\t\t\t\tif (Type == Type::Normal) return 1364;\n\t\t\t\t\telse return 1365;\n\t\t\t\telse\n\t\t\t\t\tif (Type == Type::Normal) return 1366;\n\t\t\t\t\telse return 1367;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Short)\n\t\t\t\t\tif (Type == Type::Normal) return 1368;\n\t\t\t\t\telse return 1369;\n\t\t\t\telse\n\t\t\t\t\tif (Type == Type::Normal) return 1370;\n\t\t\t\t\telse return 1371;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Short)\n\t\t\t\t\tif (Type == Type::Normal) return 1372;\n\t\t\t\t\telse return 1373;\n\t\t\t\telse\n\t\t\t\t\tif (Type == Type::Normal) return 1374;\n\t\t\t\t\telse return 1375;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP)\n\t\t\t\tif (Short)\n\t\t\t\t\tif (Type == Type::Normal) return 1376;\n\t\t\t\t\telse return 1377;\n\t\t\t\telse\n\t\t\t\t\tif (Type == Type::Normal) return 1378;\n\t\t\t\t\telse return 1379;\n\t\t\telse\n\t\t\t\tif (Short)\n\t\t\t\t\tif (Type == Type::Normal) return 1380;\n\t\t\t\t\telse return 1381;\n\t\t\t\telse\n\t\t\t\t\tif (Type == Type::Normal) return 1382;\n\t\t\t\t\telse return 1383;\n\t\t}\n\t\tBlockState PistonHead();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Short(BlockState Block);\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PlayerHead\n\t{\n\t\tconstexpr BlockState PlayerHead(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 6550;\n\t\t\telse if (Rotation == 1) return 6551;\n\t\t\telse if (Rotation == 2) return 6552;\n\t\t\telse if (Rotation == 3) return 6553;\n\t\t\telse if (Rotation == 4) return 6554;\n\t\t\telse if (Rotation == 5) return 6555;\n\t\t\telse if (Rotation == 6) return 6556;\n\t\t\telse if (Rotation == 7) return 6557;\n\t\t\telse if (Rotation == 8) return 6558;\n\t\t\telse if (Rotation == 9) return 6559;\n\t\t\telse if (Rotation == 10) return 6560;\n\t\t\telse if (Rotation == 11) return 6561;\n\t\t\telse if (Rotation == 12) return 6562;\n\t\t\telse if (Rotation == 13) return 6563;\n\t\t\telse if (Rotation == 14) return 6564;\n\t\t\telse return 6565;\n\t\t}\n\t\tBlockState PlayerHead();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace PlayerWallHead\n\t{\n\t\tconstexpr BlockState PlayerWallHead(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6566;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6567;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6568;\n\t\t\telse return 6569;\n\t\t}\n\t\tBlockState PlayerWallHead();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Podzol\n\t{\n\t\tconstexpr BlockState Podzol(const bool Snowy)\n\t\t{\n\t\t\tif (Snowy) return 12;\n\t\t\telse return 13;\n\t\t}\n\t\tBlockState Podzol();\n\t\tbool Snowy(BlockState Block);\n\t}\n\tnamespace PolishedAndesite\n\t{\n\t\tconstexpr BlockState PolishedAndesite()\n\t\t{\n\t\t\treturn 7;\n\t\t}\n\t}\n\tnamespace PolishedAndesiteSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PolishedAndesiteSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10856;\n\t\t\telse if (Type == Type::Bottom) return 10858;\n\t\t\telse return 10860;\n\t\t}\n\t\tBlockState PolishedAndesiteSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PolishedAndesiteStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState PolishedAndesiteStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10630;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10632;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10634;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10636;\n\t\t\t\t\telse return 10638;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10640;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10642;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10644;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10646;\n\t\t\t\t\telse return 10648;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10650;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10652;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10654;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10656;\n\t\t\t\t\telse return 10658;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10660;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10662;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10664;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10666;\n\t\t\t\t\telse return 10668;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10670;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10672;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10674;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10676;\n\t\t\t\t\telse return 10678;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10680;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10682;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10684;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10686;\n\t\t\t\t\telse return 10688;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10690;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10692;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10694;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10696;\n\t\t\t\t\telse return 10698;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10700;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10702;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10704;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10706;\n\t\t\t\t\telse return 10708;\n\t\t}\n\t\tBlockState PolishedAndesiteStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace PolishedBasalt\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState PolishedBasalt(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 4005;\n\t\t\telse if (Axis == Axis::Y) return 4006;\n\t\t\telse return 4007;\n\t\t}\n\t\tBlockState PolishedBasalt();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace PolishedBlackstone\n\t{\n\t\tconstexpr BlockState PolishedBlackstone()\n\t\t{\n\t\t\treturn 16250;\n\t\t}\n\t}\n\tnamespace PolishedBlackstoneBrickSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PolishedBlackstoneBrickSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 16255;\n\t\t\telse if (Type == Type::Bottom) return 16257;\n\t\t\telse return 16259;\n\t\t}\n\t\tBlockState PolishedBlackstoneBrickSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PolishedBlackstoneBrickStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState PolishedBlackstoneBrickStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 16261;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16263;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16265;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16267;\n\t\t\t\t\telse return 16269;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 16271;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16273;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16275;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16277;\n\t\t\t\t\telse return 16279;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 16281;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16283;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16285;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16287;\n\t\t\t\t\telse return 16289;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 16291;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16293;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16295;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16297;\n\t\t\t\t\telse return 16299;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 16301;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16303;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16305;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16307;\n\t\t\t\t\telse return 16309;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 16311;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16313;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16315;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16317;\n\t\t\t\t\telse return 16319;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 16321;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16323;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16325;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16327;\n\t\t\t\t\telse return 16329;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 16331;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16333;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16335;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16337;\n\t\t\t\t\telse return 16339;\n\t\t}\n\t\tBlockState PolishedBlackstoneBrickStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace PolishedBlackstoneBrickWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState PolishedBlackstoneBrickWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16343;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16344;\n\t\t\t\t\t\t\telse return 16345;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16349;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16350;\n\t\t\t\t\t\t\telse return 16351;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16355;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16356;\n\t\t\t\t\t\t\telse return 16357;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16361;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16362;\n\t\t\t\t\t\t\telse return 16363;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16367;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16368;\n\t\t\t\t\t\t\telse return 16369;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16373;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16374;\n\t\t\t\t\t\t\telse return 16375;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16379;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16380;\n\t\t\t\t\t\t\telse return 16381;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16385;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16386;\n\t\t\t\t\t\t\telse return 16387;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16391;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16392;\n\t\t\t\t\t\t\telse return 16393;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16397;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16398;\n\t\t\t\t\t\t\telse return 16399;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16403;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16404;\n\t\t\t\t\t\t\telse return 16405;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16409;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16410;\n\t\t\t\t\t\t\telse return 16411;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16415;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16416;\n\t\t\t\t\t\t\telse return 16417;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16421;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16422;\n\t\t\t\t\t\t\telse return 16423;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16427;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16428;\n\t\t\t\t\t\t\telse return 16429;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16433;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16434;\n\t\t\t\t\t\t\telse return 16435;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16439;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16440;\n\t\t\t\t\t\t\telse return 16441;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16445;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16446;\n\t\t\t\t\t\t\telse return 16447;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16451;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16452;\n\t\t\t\t\t\t\telse return 16453;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16457;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16458;\n\t\t\t\t\t\t\telse return 16459;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16463;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16464;\n\t\t\t\t\t\t\telse return 16465;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16469;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16470;\n\t\t\t\t\t\t\telse return 16471;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16475;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16476;\n\t\t\t\t\t\t\telse return 16477;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16481;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16482;\n\t\t\t\t\t\t\telse return 16483;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16487;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16488;\n\t\t\t\t\t\t\telse return 16489;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16493;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16494;\n\t\t\t\t\t\t\telse return 16495;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16499;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16500;\n\t\t\t\t\t\t\telse return 16501;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16505;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16506;\n\t\t\t\t\t\t\telse return 16507;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16511;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16512;\n\t\t\t\t\t\t\telse return 16513;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16517;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16518;\n\t\t\t\t\t\t\telse return 16519;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16523;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16524;\n\t\t\t\t\t\t\telse return 16525;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16529;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16530;\n\t\t\t\t\t\t\telse return 16531;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16535;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16536;\n\t\t\t\t\t\t\telse return 16537;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16541;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16542;\n\t\t\t\t\t\t\telse return 16543;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16547;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16548;\n\t\t\t\t\t\t\telse return 16549;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16553;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16554;\n\t\t\t\t\t\t\telse return 16555;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16559;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16560;\n\t\t\t\t\t\t\telse return 16561;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16565;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16566;\n\t\t\t\t\t\t\telse return 16567;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16571;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16572;\n\t\t\t\t\t\t\telse return 16573;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16577;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16578;\n\t\t\t\t\t\t\telse return 16579;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16583;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16584;\n\t\t\t\t\t\t\telse return 16585;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16589;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16590;\n\t\t\t\t\t\t\telse return 16591;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16595;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16596;\n\t\t\t\t\t\t\telse return 16597;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16601;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16602;\n\t\t\t\t\t\t\telse return 16603;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16607;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16608;\n\t\t\t\t\t\t\telse return 16609;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16613;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16614;\n\t\t\t\t\t\t\telse return 16615;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16619;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16620;\n\t\t\t\t\t\t\telse return 16621;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16625;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16626;\n\t\t\t\t\t\t\telse return 16627;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16631;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16632;\n\t\t\t\t\t\t\telse return 16633;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16637;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16638;\n\t\t\t\t\t\t\telse return 16639;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16643;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16644;\n\t\t\t\t\t\t\telse return 16645;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16649;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16650;\n\t\t\t\t\t\t\telse return 16651;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16655;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16656;\n\t\t\t\t\t\t\telse return 16657;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16661;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16662;\n\t\t\t\t\t\t\telse return 16663;\n\t\t}\n\t\tBlockState PolishedBlackstoneBrickWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace PolishedBlackstoneBricks\n\t{\n\t\tconstexpr BlockState PolishedBlackstoneBricks()\n\t\t{\n\t\t\treturn 16251;\n\t\t}\n\t}\n\tnamespace PolishedBlackstoneButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState PolishedBlackstoneButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 16753;\n\t\t\t\t\telse return 16754;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 16755;\n\t\t\t\t\telse return 16756;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 16757;\n\t\t\t\t\telse return 16758;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 16759;\n\t\t\t\t\telse return 16760;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 16761;\n\t\t\t\t\telse return 16762;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 16763;\n\t\t\t\t\telse return 16764;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 16765;\n\t\t\t\t\telse return 16766;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 16767;\n\t\t\t\t\telse return 16768;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 16769;\n\t\t\t\t\telse return 16770;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 16771;\n\t\t\t\t\telse return 16772;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 16773;\n\t\t\t\t\telse return 16774;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 16775;\n\t\t\t\t\telse return 16776;\n\t\t}\n\t\tBlockState PolishedBlackstoneButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace PolishedBlackstonePressurePlate\n\t{\n\t\tconstexpr BlockState PolishedBlackstonePressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 16751;\n\t\t\telse return 16752;\n\t\t}\n\t\tBlockState PolishedBlackstonePressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace PolishedBlackstoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PolishedBlackstoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 16746;\n\t\t\telse if (Type == Type::Bottom) return 16748;\n\t\t\telse return 16750;\n\t\t}\n\t\tBlockState PolishedBlackstoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PolishedBlackstoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState PolishedBlackstoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 16666;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16668;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16670;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16672;\n\t\t\t\t\telse return 16674;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 16676;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16678;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16680;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16682;\n\t\t\t\t\telse return 16684;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 16686;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16688;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16690;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16692;\n\t\t\t\t\telse return 16694;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 16696;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16698;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16700;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16702;\n\t\t\t\t\telse return 16704;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 16706;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16708;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16710;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16712;\n\t\t\t\t\telse return 16714;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 16716;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16718;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16720;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16722;\n\t\t\t\t\telse return 16724;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 16726;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16728;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16730;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16732;\n\t\t\t\t\telse return 16734;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 16736;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 16738;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 16740;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 16742;\n\t\t\t\t\telse return 16744;\n\t\t}\n\t\tBlockState PolishedBlackstoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace PolishedBlackstoneWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState PolishedBlackstoneWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16780;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16781;\n\t\t\t\t\t\t\telse return 16782;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16786;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16787;\n\t\t\t\t\t\t\telse return 16788;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16792;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16793;\n\t\t\t\t\t\t\telse return 16794;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16798;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16799;\n\t\t\t\t\t\t\telse return 16800;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16804;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16805;\n\t\t\t\t\t\t\telse return 16806;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16810;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16811;\n\t\t\t\t\t\t\telse return 16812;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16816;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16817;\n\t\t\t\t\t\t\telse return 16818;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16822;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16823;\n\t\t\t\t\t\t\telse return 16824;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16828;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16829;\n\t\t\t\t\t\t\telse return 16830;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16834;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16835;\n\t\t\t\t\t\t\telse return 16836;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16840;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16841;\n\t\t\t\t\t\t\telse return 16842;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16846;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16847;\n\t\t\t\t\t\t\telse return 16848;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16852;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16853;\n\t\t\t\t\t\t\telse return 16854;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16858;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16859;\n\t\t\t\t\t\t\telse return 16860;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16864;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16865;\n\t\t\t\t\t\t\telse return 16866;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16870;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16871;\n\t\t\t\t\t\t\telse return 16872;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16876;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16877;\n\t\t\t\t\t\t\telse return 16878;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16882;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16883;\n\t\t\t\t\t\t\telse return 16884;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16888;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16889;\n\t\t\t\t\t\t\telse return 16890;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16894;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16895;\n\t\t\t\t\t\t\telse return 16896;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16900;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16901;\n\t\t\t\t\t\t\telse return 16902;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16906;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16907;\n\t\t\t\t\t\t\telse return 16908;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16912;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16913;\n\t\t\t\t\t\t\telse return 16914;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16918;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16919;\n\t\t\t\t\t\t\telse return 16920;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16924;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16925;\n\t\t\t\t\t\t\telse return 16926;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16930;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16931;\n\t\t\t\t\t\t\telse return 16932;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16936;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16937;\n\t\t\t\t\t\t\telse return 16938;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16942;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16943;\n\t\t\t\t\t\t\telse return 16944;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16948;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16949;\n\t\t\t\t\t\t\telse return 16950;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16954;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16955;\n\t\t\t\t\t\t\telse return 16956;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16960;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16961;\n\t\t\t\t\t\t\telse return 16962;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16966;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16967;\n\t\t\t\t\t\t\telse return 16968;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16972;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16973;\n\t\t\t\t\t\t\telse return 16974;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16978;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16979;\n\t\t\t\t\t\t\telse return 16980;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16984;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16985;\n\t\t\t\t\t\t\telse return 16986;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 16990;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16991;\n\t\t\t\t\t\t\telse return 16992;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 16996;\n\t\t\t\t\t\t\telse if (West == West::Low) return 16997;\n\t\t\t\t\t\t\telse return 16998;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17002;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17003;\n\t\t\t\t\t\t\telse return 17004;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 17008;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17009;\n\t\t\t\t\t\t\telse return 17010;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17014;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17015;\n\t\t\t\t\t\t\telse return 17016;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 17020;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17021;\n\t\t\t\t\t\t\telse return 17022;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17026;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17027;\n\t\t\t\t\t\t\telse return 17028;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 17032;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17033;\n\t\t\t\t\t\t\telse return 17034;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17038;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17039;\n\t\t\t\t\t\t\telse return 17040;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 17044;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17045;\n\t\t\t\t\t\t\telse return 17046;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17050;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17051;\n\t\t\t\t\t\t\telse return 17052;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 17056;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17057;\n\t\t\t\t\t\t\telse return 17058;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17062;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17063;\n\t\t\t\t\t\t\telse return 17064;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 17068;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17069;\n\t\t\t\t\t\t\telse return 17070;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17074;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17075;\n\t\t\t\t\t\t\telse return 17076;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 17080;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17081;\n\t\t\t\t\t\t\telse return 17082;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17086;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17087;\n\t\t\t\t\t\t\telse return 17088;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 17092;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17093;\n\t\t\t\t\t\t\telse return 17094;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 17098;\n\t\t\t\t\t\t\telse if (West == West::Low) return 17099;\n\t\t\t\t\t\t\telse return 17100;\n\t\t}\n\t\tBlockState PolishedBlackstoneWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace PolishedDiorite\n\t{\n\t\tconstexpr BlockState PolishedDiorite()\n\t\t{\n\t\t\treturn 5;\n\t\t}\n\t}\n\tnamespace PolishedDioriteSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PolishedDioriteSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10808;\n\t\t\telse if (Type == Type::Bottom) return 10810;\n\t\t\telse return 10812;\n\t\t}\n\t\tBlockState PolishedDioriteSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PolishedDioriteStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState PolishedDioriteStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9910;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9912;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9914;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9916;\n\t\t\t\t\telse return 9918;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9920;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9922;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9924;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9926;\n\t\t\t\t\telse return 9928;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9930;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9932;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9934;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9936;\n\t\t\t\t\telse return 9938;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9940;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9942;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9944;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9946;\n\t\t\t\t\telse return 9948;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9950;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9952;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9954;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9956;\n\t\t\t\t\telse return 9958;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9960;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9962;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9964;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9966;\n\t\t\t\t\telse return 9968;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9970;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9972;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9974;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9976;\n\t\t\t\t\telse return 9978;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9980;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9982;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9984;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9986;\n\t\t\t\t\telse return 9988;\n\t\t}\n\t\tBlockState PolishedDioriteStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace PolishedGranite\n\t{\n\t\tconstexpr BlockState PolishedGranite()\n\t\t{\n\t\t\treturn 3;\n\t\t}\n\t}\n\tnamespace PolishedGraniteSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PolishedGraniteSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10790;\n\t\t\telse if (Type == Type::Bottom) return 10792;\n\t\t\telse return 10794;\n\t\t}\n\t\tBlockState PolishedGraniteSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PolishedGraniteStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState PolishedGraniteStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9670;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9672;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9674;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9676;\n\t\t\t\t\telse return 9678;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9680;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9682;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9684;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9686;\n\t\t\t\t\telse return 9688;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9690;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9692;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9694;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9696;\n\t\t\t\t\telse return 9698;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9700;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9702;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9704;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9706;\n\t\t\t\t\telse return 9708;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9710;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9712;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9714;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9716;\n\t\t\t\t\telse return 9718;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9720;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9722;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9724;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9726;\n\t\t\t\t\telse return 9728;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9730;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9732;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9734;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9736;\n\t\t\t\t\telse return 9738;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9740;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9742;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9744;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9746;\n\t\t\t\t\telse return 9748;\n\t\t}\n\t\tBlockState PolishedGraniteStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace Poppy\n\t{\n\t\tconstexpr BlockState Poppy()\n\t\t{\n\t\t\treturn 1413;\n\t\t}\n\t}\n\tnamespace Potatoes\n\t{\n\t\tconstexpr BlockState Potatoes(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 6338;\n\t\t\telse if (Age == 1) return 6339;\n\t\t\telse if (Age == 2) return 6340;\n\t\t\telse if (Age == 3) return 6341;\n\t\t\telse if (Age == 4) return 6342;\n\t\t\telse if (Age == 5) return 6343;\n\t\t\telse if (Age == 6) return 6344;\n\t\t\telse return 6345;\n\t\t}\n\t\tBlockState Potatoes();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace PottedAcaciaSapling\n\t{\n\t\tconstexpr BlockState PottedAcaciaSapling()\n\t\t{\n\t\t\treturn 6310;\n\t\t}\n\t}\n\tnamespace PottedAllium\n\t{\n\t\tconstexpr BlockState PottedAllium()\n\t\t{\n\t\t\treturn 6316;\n\t\t}\n\t}\n\tnamespace PottedAzureBluet\n\t{\n\t\tconstexpr BlockState PottedAzureBluet()\n\t\t{\n\t\t\treturn 6317;\n\t\t}\n\t}\n\tnamespace PottedBamboo\n\t{\n\t\tconstexpr BlockState PottedBamboo()\n\t\t{\n\t\t\treturn 9664;\n\t\t}\n\t}\n\tnamespace PottedBirchSapling\n\t{\n\t\tconstexpr BlockState PottedBirchSapling()\n\t\t{\n\t\t\treturn 6308;\n\t\t}\n\t}\n\tnamespace PottedBlueOrchid\n\t{\n\t\tconstexpr BlockState PottedBlueOrchid()\n\t\t{\n\t\t\treturn 6315;\n\t\t}\n\t}\n\tnamespace PottedBrownMushroom\n\t{\n\t\tconstexpr BlockState PottedBrownMushroom()\n\t\t{\n\t\t\treturn 6327;\n\t\t}\n\t}\n\tnamespace PottedCactus\n\t{\n\t\tconstexpr BlockState PottedCactus()\n\t\t{\n\t\t\treturn 6329;\n\t\t}\n\t}\n\tnamespace PottedCornflower\n\t{\n\t\tconstexpr BlockState PottedCornflower()\n\t\t{\n\t\t\treturn 6323;\n\t\t}\n\t}\n\tnamespace PottedCrimsonFungus\n\t{\n\t\tconstexpr BlockState PottedCrimsonFungus()\n\t\t{\n\t\t\treturn 15834;\n\t\t}\n\t}\n\tnamespace PottedCrimsonRoots\n\t{\n\t\tconstexpr BlockState PottedCrimsonRoots()\n\t\t{\n\t\t\treturn 15836;\n\t\t}\n\t}\n\tnamespace PottedDandelion\n\t{\n\t\tconstexpr BlockState PottedDandelion()\n\t\t{\n\t\t\treturn 6313;\n\t\t}\n\t}\n\tnamespace PottedDarkOakSapling\n\t{\n\t\tconstexpr BlockState PottedDarkOakSapling()\n\t\t{\n\t\t\treturn 6311;\n\t\t}\n\t}\n\tnamespace PottedDeadBush\n\t{\n\t\tconstexpr BlockState PottedDeadBush()\n\t\t{\n\t\t\treturn 6328;\n\t\t}\n\t}\n\tnamespace PottedFern\n\t{\n\t\tconstexpr BlockState PottedFern()\n\t\t{\n\t\t\treturn 6312;\n\t\t}\n\t}\n\tnamespace PottedJungleSapling\n\t{\n\t\tconstexpr BlockState PottedJungleSapling()\n\t\t{\n\t\t\treturn 6309;\n\t\t}\n\t}\n\tnamespace PottedLilyOfTheValley\n\t{\n\t\tconstexpr BlockState PottedLilyOfTheValley()\n\t\t{\n\t\t\treturn 6324;\n\t\t}\n\t}\n\tnamespace PottedOakSapling\n\t{\n\t\tconstexpr BlockState PottedOakSapling()\n\t\t{\n\t\t\treturn 6306;\n\t\t}\n\t}\n\tnamespace PottedOrangeTulip\n\t{\n\t\tconstexpr BlockState PottedOrangeTulip()\n\t\t{\n\t\t\treturn 6319;\n\t\t}\n\t}\n\tnamespace PottedOxeyeDaisy\n\t{\n\t\tconstexpr BlockState PottedOxeyeDaisy()\n\t\t{\n\t\t\treturn 6322;\n\t\t}\n\t}\n\tnamespace PottedPinkTulip\n\t{\n\t\tconstexpr BlockState PottedPinkTulip()\n\t\t{\n\t\t\treturn 6321;\n\t\t}\n\t}\n\tnamespace PottedPoppy\n\t{\n\t\tconstexpr BlockState PottedPoppy()\n\t\t{\n\t\t\treturn 6314;\n\t\t}\n\t}\n\tnamespace PottedRedMushroom\n\t{\n\t\tconstexpr BlockState PottedRedMushroom()\n\t\t{\n\t\t\treturn 6326;\n\t\t}\n\t}\n\tnamespace PottedRedTulip\n\t{\n\t\tconstexpr BlockState PottedRedTulip()\n\t\t{\n\t\t\treturn 6318;\n\t\t}\n\t}\n\tnamespace PottedSpruceSapling\n\t{\n\t\tconstexpr BlockState PottedSpruceSapling()\n\t\t{\n\t\t\treturn 6307;\n\t\t}\n\t}\n\tnamespace PottedWarpedFungus\n\t{\n\t\tconstexpr BlockState PottedWarpedFungus()\n\t\t{\n\t\t\treturn 15835;\n\t\t}\n\t}\n\tnamespace PottedWarpedRoots\n\t{\n\t\tconstexpr BlockState PottedWarpedRoots()\n\t\t{\n\t\t\treturn 15837;\n\t\t}\n\t}\n\tnamespace PottedWhiteTulip\n\t{\n\t\tconstexpr BlockState PottedWhiteTulip()\n\t\t{\n\t\t\treturn 6320;\n\t\t}\n\t}\n\tnamespace PottedWitherRose\n\t{\n\t\tconstexpr BlockState PottedWitherRose()\n\t\t{\n\t\t\treturn 6325;\n\t\t}\n\t}\n\tnamespace PoweredRail\n\t{\n\t\tenum class Shape\n\t\t{\n\t\t\tNorthSouth,\n\t\t\tEastWest,\n\t\t\tAscendingEast,\n\t\t\tAscendingWest,\n\t\t\tAscendingNorth,\n\t\t\tAscendingSouth\n\t\t};\n\t\tconstexpr BlockState PoweredRail(const bool Powered, const enum Shape Shape)\n\t\t{\n\t\t\tif (Powered)\n\t\t\t\tif (Shape == Shape::NorthSouth) return 1305;\n\t\t\t\telse if (Shape == Shape::EastWest) return 1306;\n\t\t\t\telse if (Shape == Shape::AscendingEast) return 1307;\n\t\t\t\telse if (Shape == Shape::AscendingWest) return 1308;\n\t\t\t\telse if (Shape == Shape::AscendingNorth) return 1309;\n\t\t\t\telse return 1310;\n\t\t\telse\n\t\t\t\tif (Shape == Shape::NorthSouth) return 1311;\n\t\t\t\telse if (Shape == Shape::EastWest) return 1312;\n\t\t\t\telse if (Shape == Shape::AscendingEast) return 1313;\n\t\t\t\telse if (Shape == Shape::AscendingWest) return 1314;\n\t\t\t\telse if (Shape == Shape::AscendingNorth) return 1315;\n\t\t\t\telse return 1316;\n\t\t}\n\t\tBlockState PoweredRail();\n\t\tbool Powered(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace Prismarine\n\t{\n\t\tconstexpr BlockState Prismarine()\n\t\t{\n\t\t\treturn 7601;\n\t\t}\n\t}\n\tnamespace PrismarineBrickSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PrismarineBrickSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 7851;\n\t\t\telse if (Type == Type::Bottom) return 7853;\n\t\t\telse return 7855;\n\t\t}\n\t\tBlockState PrismarineBrickSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PrismarineBrickStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState PrismarineBrickStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7685;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7687;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7689;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7691;\n\t\t\t\t\telse return 7693;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7695;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7697;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7699;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7701;\n\t\t\t\t\telse return 7703;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7705;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7707;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7709;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7711;\n\t\t\t\t\telse return 7713;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7715;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7717;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7719;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7721;\n\t\t\t\t\telse return 7723;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7725;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7727;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7729;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7731;\n\t\t\t\t\telse return 7733;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7735;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7737;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7739;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7741;\n\t\t\t\t\telse return 7743;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7745;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7747;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7749;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7751;\n\t\t\t\t\telse return 7753;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7755;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7757;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7759;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7761;\n\t\t\t\t\telse return 7763;\n\t\t}\n\t\tBlockState PrismarineBrickStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace PrismarineBricks\n\t{\n\t\tconstexpr BlockState PrismarineBricks()\n\t\t{\n\t\t\treturn 7602;\n\t\t}\n\t}\n\tnamespace PrismarineSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PrismarineSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 7845;\n\t\t\telse if (Type == Type::Bottom) return 7847;\n\t\t\telse return 7849;\n\t\t}\n\t\tBlockState PrismarineSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PrismarineStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState PrismarineStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7605;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7607;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7609;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7611;\n\t\t\t\t\telse return 7613;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7615;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7617;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7619;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7621;\n\t\t\t\t\telse return 7623;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7625;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7627;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7629;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7631;\n\t\t\t\t\telse return 7633;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7635;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7637;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7639;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7641;\n\t\t\t\t\telse return 7643;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7645;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7647;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7649;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7651;\n\t\t\t\t\telse return 7653;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7655;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7657;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7659;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7661;\n\t\t\t\t\telse return 7663;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 7665;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7667;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7669;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7671;\n\t\t\t\t\telse return 7673;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 7675;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 7677;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 7679;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 7681;\n\t\t\t\t\telse return 7683;\n\t\t}\n\t\tBlockState PrismarineStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace PrismarineWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState PrismarineWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11194;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11195;\n\t\t\t\t\t\t\telse return 11196;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11200;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11201;\n\t\t\t\t\t\t\telse return 11202;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11206;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11207;\n\t\t\t\t\t\t\telse return 11208;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11212;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11213;\n\t\t\t\t\t\t\telse return 11214;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11218;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11219;\n\t\t\t\t\t\t\telse return 11220;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11224;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11225;\n\t\t\t\t\t\t\telse return 11226;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11230;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11231;\n\t\t\t\t\t\t\telse return 11232;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11236;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11237;\n\t\t\t\t\t\t\telse return 11238;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11242;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11243;\n\t\t\t\t\t\t\telse return 11244;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11248;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11249;\n\t\t\t\t\t\t\telse return 11250;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11254;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11255;\n\t\t\t\t\t\t\telse return 11256;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11260;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11261;\n\t\t\t\t\t\t\telse return 11262;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11266;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11267;\n\t\t\t\t\t\t\telse return 11268;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11272;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11273;\n\t\t\t\t\t\t\telse return 11274;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11278;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11279;\n\t\t\t\t\t\t\telse return 11280;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11284;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11285;\n\t\t\t\t\t\t\telse return 11286;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11290;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11291;\n\t\t\t\t\t\t\telse return 11292;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11296;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11297;\n\t\t\t\t\t\t\telse return 11298;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11302;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11303;\n\t\t\t\t\t\t\telse return 11304;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11308;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11309;\n\t\t\t\t\t\t\telse return 11310;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11314;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11315;\n\t\t\t\t\t\t\telse return 11316;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11320;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11321;\n\t\t\t\t\t\t\telse return 11322;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11326;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11327;\n\t\t\t\t\t\t\telse return 11328;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11332;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11333;\n\t\t\t\t\t\t\telse return 11334;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11338;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11339;\n\t\t\t\t\t\t\telse return 11340;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11344;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11345;\n\t\t\t\t\t\t\telse return 11346;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11350;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11351;\n\t\t\t\t\t\t\telse return 11352;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11356;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11357;\n\t\t\t\t\t\t\telse return 11358;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11362;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11363;\n\t\t\t\t\t\t\telse return 11364;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11368;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11369;\n\t\t\t\t\t\t\telse return 11370;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11374;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11375;\n\t\t\t\t\t\t\telse return 11376;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11380;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11381;\n\t\t\t\t\t\t\telse return 11382;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11386;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11387;\n\t\t\t\t\t\t\telse return 11388;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11392;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11393;\n\t\t\t\t\t\t\telse return 11394;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11398;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11399;\n\t\t\t\t\t\t\telse return 11400;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11404;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11405;\n\t\t\t\t\t\t\telse return 11406;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11410;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11411;\n\t\t\t\t\t\t\telse return 11412;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11416;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11417;\n\t\t\t\t\t\t\telse return 11418;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11422;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11423;\n\t\t\t\t\t\t\telse return 11424;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11428;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11429;\n\t\t\t\t\t\t\telse return 11430;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11434;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11435;\n\t\t\t\t\t\t\telse return 11436;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11440;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11441;\n\t\t\t\t\t\t\telse return 11442;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11446;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11447;\n\t\t\t\t\t\t\telse return 11448;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11452;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11453;\n\t\t\t\t\t\t\telse return 11454;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11458;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11459;\n\t\t\t\t\t\t\telse return 11460;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11464;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11465;\n\t\t\t\t\t\t\telse return 11466;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11470;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11471;\n\t\t\t\t\t\t\telse return 11472;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11476;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11477;\n\t\t\t\t\t\t\telse return 11478;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11482;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11483;\n\t\t\t\t\t\t\telse return 11484;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11488;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11489;\n\t\t\t\t\t\t\telse return 11490;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11494;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11495;\n\t\t\t\t\t\t\telse return 11496;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11500;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11501;\n\t\t\t\t\t\t\telse return 11502;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11506;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11507;\n\t\t\t\t\t\t\telse return 11508;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11512;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11513;\n\t\t\t\t\t\t\telse return 11514;\n\t\t}\n\t\tBlockState PrismarineWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace Pumpkin\n\t{\n\t\tconstexpr BlockState Pumpkin()\n\t\t{\n\t\t\treturn 3998;\n\t\t}\n\t}\n\tnamespace PumpkinStem\n\t{\n\t\tconstexpr BlockState PumpkinStem(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 4772;\n\t\t\telse if (Age == 1) return 4773;\n\t\t\telse if (Age == 2) return 4774;\n\t\t\telse if (Age == 3) return 4775;\n\t\t\telse if (Age == 4) return 4776;\n\t\t\telse if (Age == 5) return 4777;\n\t\t\telse if (Age == 6) return 4778;\n\t\t\telse return 4779;\n\t\t}\n\t\tBlockState PumpkinStem();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace PurpleBanner\n\t{\n\t\tconstexpr BlockState PurpleBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8057;\n\t\t\telse if (Rotation == 1) return 8058;\n\t\t\telse if (Rotation == 2) return 8059;\n\t\t\telse if (Rotation == 3) return 8060;\n\t\t\telse if (Rotation == 4) return 8061;\n\t\t\telse if (Rotation == 5) return 8062;\n\t\t\telse if (Rotation == 6) return 8063;\n\t\t\telse if (Rotation == 7) return 8064;\n\t\t\telse if (Rotation == 8) return 8065;\n\t\t\telse if (Rotation == 9) return 8066;\n\t\t\telse if (Rotation == 10) return 8067;\n\t\t\telse if (Rotation == 11) return 8068;\n\t\t\telse if (Rotation == 12) return 8069;\n\t\t\telse if (Rotation == 13) return 8070;\n\t\t\telse if (Rotation == 14) return 8071;\n\t\t\telse return 8072;\n\t\t}\n\t\tBlockState PurpleBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace PurpleBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState PurpleBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1209;\n\t\t\t\t\telse return 1210;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1211;\n\t\t\t\t\telse return 1212;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1213;\n\t\t\t\t\telse return 1214;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1215;\n\t\t\t\t\telse return 1216;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1217;\n\t\t\t\t\telse return 1218;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1219;\n\t\t\t\t\telse return 1220;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1221;\n\t\t\t\t\telse return 1222;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1223;\n\t\t\t\t\telse return 1224;\n\t\t}\n\t\tBlockState PurpleBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace PurpleCarpet\n\t{\n\t\tconstexpr BlockState PurpleCarpet()\n\t\t{\n\t\t\treturn 7876;\n\t\t}\n\t}\n\tnamespace PurpleConcrete\n\t{\n\t\tconstexpr BlockState PurpleConcrete()\n\t\t{\n\t\t\treturn 9448;\n\t\t}\n\t}\n\tnamespace PurpleConcretePowder\n\t{\n\t\tconstexpr BlockState PurpleConcretePowder()\n\t\t{\n\t\t\treturn 9464;\n\t\t}\n\t}\n\tnamespace PurpleGlazedTerracotta\n\t{\n\t\tconstexpr BlockState PurpleGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9414;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9415;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9416;\n\t\t\telse return 9417;\n\t\t}\n\t\tBlockState PurpleGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace PurpleShulkerBox\n\t{\n\t\tconstexpr BlockState PurpleShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9338;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9339;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9340;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9341;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9342;\n\t\t\telse return 9343;\n\t\t}\n\t\tBlockState PurpleShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace PurpleStainedGlass\n\t{\n\t\tconstexpr BlockState PurpleStainedGlass()\n\t\t{\n\t\t\treturn 4105;\n\t\t}\n\t}\n\tnamespace PurpleStainedGlassPane\n\t{\n\t\tconstexpr BlockState PurpleStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7185;\n\t\t\t\t\t\telse return 7186;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7189;\n\t\t\t\t\t\telse return 7190;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7193;\n\t\t\t\t\t\telse return 7194;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7197;\n\t\t\t\t\t\telse return 7198;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7201;\n\t\t\t\t\t\telse return 7202;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7205;\n\t\t\t\t\t\telse return 7206;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7209;\n\t\t\t\t\t\telse return 7210;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7213;\n\t\t\t\t\t\telse return 7214;\n\t\t}\n\t\tBlockState PurpleStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace PurpleTerracotta\n\t{\n\t\tconstexpr BlockState PurpleTerracotta()\n\t\t{\n\t\t\treturn 6857;\n\t\t}\n\t}\n\tnamespace PurpleWallBanner\n\t{\n\t\tconstexpr BlockState PurpleWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8193;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8194;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8195;\n\t\t\telse return 8196;\n\t\t}\n\t\tBlockState PurpleWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace PurpleWool\n\t{\n\t\tconstexpr BlockState PurpleWool()\n\t\t{\n\t\t\treturn 1394;\n\t\t}\n\t}\n\tnamespace PurpurBlock\n\t{\n\t\tconstexpr BlockState PurpurBlock()\n\t\t{\n\t\t\treturn 9134;\n\t\t}\n\t}\n\tnamespace PurpurPillar\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState PurpurPillar(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 9135;\n\t\t\telse if (Axis == Axis::Y) return 9136;\n\t\t\telse return 9137;\n\t\t}\n\t\tBlockState PurpurPillar();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace PurpurSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState PurpurSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8409;\n\t\t\telse if (Type == Type::Bottom) return 8411;\n\t\t\telse return 8413;\n\t\t}\n\t\tBlockState PurpurSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace PurpurStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState PurpurStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9139;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9141;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9143;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9145;\n\t\t\t\t\telse return 9147;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9149;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9151;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9153;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9155;\n\t\t\t\t\telse return 9157;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9159;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9161;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9163;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9165;\n\t\t\t\t\telse return 9167;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9169;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9171;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9173;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9175;\n\t\t\t\t\telse return 9177;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9179;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9181;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9183;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9185;\n\t\t\t\t\telse return 9187;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9189;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9191;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9193;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9195;\n\t\t\t\t\telse return 9197;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9199;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9201;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9203;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9205;\n\t\t\t\t\telse return 9207;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9209;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9211;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9213;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9215;\n\t\t\t\t\telse return 9217;\n\t\t}\n\t\tBlockState PurpurStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace QuartzBlock\n\t{\n\t\tconstexpr BlockState QuartzBlock()\n\t\t{\n\t\t\treturn 6738;\n\t\t}\n\t}\n\tnamespace QuartzBricks\n\t{\n\t\tconstexpr BlockState QuartzBricks()\n\t\t{\n\t\t\treturn 17103;\n\t\t}\n\t}\n\tnamespace QuartzPillar\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState QuartzPillar(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 6740;\n\t\t\telse if (Axis == Axis::Y) return 6741;\n\t\t\telse return 6742;\n\t\t}\n\t\tBlockState QuartzPillar();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace QuartzSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState QuartzSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8391;\n\t\t\telse if (Type == Type::Bottom) return 8393;\n\t\t\telse return 8395;\n\t\t}\n\t\tBlockState QuartzSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace QuartzStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState QuartzStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 6744;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 6746;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 6748;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 6750;\n\t\t\t\t\telse return 6752;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 6754;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 6756;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 6758;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 6760;\n\t\t\t\t\telse return 6762;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 6764;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 6766;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 6768;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 6770;\n\t\t\t\t\telse return 6772;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 6774;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 6776;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 6778;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 6780;\n\t\t\t\t\telse return 6782;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 6784;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 6786;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 6788;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 6790;\n\t\t\t\t\telse return 6792;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 6794;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 6796;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 6798;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 6800;\n\t\t\t\t\telse return 6802;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 6804;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 6806;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 6808;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 6810;\n\t\t\t\t\telse return 6812;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 6814;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 6816;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 6818;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 6820;\n\t\t\t\t\telse return 6822;\n\t\t}\n\t\tBlockState QuartzStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace Rail\n\t{\n\t\tenum class Shape\n\t\t{\n\t\t\tNorthSouth,\n\t\t\tEastWest,\n\t\t\tAscendingEast,\n\t\t\tAscendingWest,\n\t\t\tAscendingNorth,\n\t\t\tAscendingSouth,\n\t\t\tSouthEast,\n\t\t\tSouthWest,\n\t\t\tNorthWest,\n\t\t\tNorthEast\n\t\t};\n\t\tconstexpr BlockState Rail(const enum Shape Shape)\n\t\t{\n\t\t\tif (Shape == Shape::NorthSouth) return 3645;\n\t\t\telse if (Shape == Shape::EastWest) return 3646;\n\t\t\telse if (Shape == Shape::AscendingEast) return 3647;\n\t\t\telse if (Shape == Shape::AscendingWest) return 3648;\n\t\t\telse if (Shape == Shape::AscendingNorth) return 3649;\n\t\t\telse if (Shape == Shape::AscendingSouth) return 3650;\n\t\t\telse if (Shape == Shape::SouthEast) return 3651;\n\t\t\telse if (Shape == Shape::SouthWest) return 3652;\n\t\t\telse if (Shape == Shape::NorthWest) return 3653;\n\t\t\telse return 3654;\n\t\t}\n\t\tBlockState Rail();\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace RedBanner\n\t{\n\t\tconstexpr BlockState RedBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 8121;\n\t\t\telse if (Rotation == 1) return 8122;\n\t\t\telse if (Rotation == 2) return 8123;\n\t\t\telse if (Rotation == 3) return 8124;\n\t\t\telse if (Rotation == 4) return 8125;\n\t\t\telse if (Rotation == 5) return 8126;\n\t\t\telse if (Rotation == 6) return 8127;\n\t\t\telse if (Rotation == 7) return 8128;\n\t\t\telse if (Rotation == 8) return 8129;\n\t\t\telse if (Rotation == 9) return 8130;\n\t\t\telse if (Rotation == 10) return 8131;\n\t\t\telse if (Rotation == 11) return 8132;\n\t\t\telse if (Rotation == 12) return 8133;\n\t\t\telse if (Rotation == 13) return 8134;\n\t\t\telse if (Rotation == 14) return 8135;\n\t\t\telse return 8136;\n\t\t}\n\t\tBlockState RedBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace RedBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState RedBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1273;\n\t\t\t\t\telse return 1274;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1275;\n\t\t\t\t\telse return 1276;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1277;\n\t\t\t\t\telse return 1278;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1279;\n\t\t\t\t\telse return 1280;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1281;\n\t\t\t\t\telse return 1282;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1283;\n\t\t\t\t\telse return 1284;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1285;\n\t\t\t\t\telse return 1286;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1287;\n\t\t\t\t\telse return 1288;\n\t\t}\n\t\tBlockState RedBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace RedCarpet\n\t{\n\t\tconstexpr BlockState RedCarpet()\n\t\t{\n\t\t\treturn 7880;\n\t\t}\n\t}\n\tnamespace RedConcrete\n\t{\n\t\tconstexpr BlockState RedConcrete()\n\t\t{\n\t\t\treturn 9452;\n\t\t}\n\t}\n\tnamespace RedConcretePowder\n\t{\n\t\tconstexpr BlockState RedConcretePowder()\n\t\t{\n\t\t\treturn 9468;\n\t\t}\n\t}\n\tnamespace RedGlazedTerracotta\n\t{\n\t\tconstexpr BlockState RedGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9430;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9431;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9432;\n\t\t\telse return 9433;\n\t\t}\n\t\tBlockState RedGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace RedMushroom\n\t{\n\t\tconstexpr BlockState RedMushroom()\n\t\t{\n\t\t\treturn 1426;\n\t\t}\n\t}\n\tnamespace RedMushroomBlock\n\t{\n\t\tconstexpr BlockState RedMushroomBlock(const bool Down, const bool East, const bool North, const bool South, const bool Up, const bool West)\n\t\t{\n\t\t\tif (Down)\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4569;\n\t\t\t\t\t\t\t\telse return 4570;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4571;\n\t\t\t\t\t\t\t\telse return 4572;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4573;\n\t\t\t\t\t\t\t\telse return 4574;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4575;\n\t\t\t\t\t\t\t\telse return 4576;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4577;\n\t\t\t\t\t\t\t\telse return 4578;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4579;\n\t\t\t\t\t\t\t\telse return 4580;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4581;\n\t\t\t\t\t\t\t\telse return 4582;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4583;\n\t\t\t\t\t\t\t\telse return 4584;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4585;\n\t\t\t\t\t\t\t\telse return 4586;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4587;\n\t\t\t\t\t\t\t\telse return 4588;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4589;\n\t\t\t\t\t\t\t\telse return 4590;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4591;\n\t\t\t\t\t\t\t\telse return 4592;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4593;\n\t\t\t\t\t\t\t\telse return 4594;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4595;\n\t\t\t\t\t\t\t\telse return 4596;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4597;\n\t\t\t\t\t\t\t\telse return 4598;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4599;\n\t\t\t\t\t\t\t\telse return 4600;\n\t\t\telse\n\t\t\t\tif (East)\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4601;\n\t\t\t\t\t\t\t\telse return 4602;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4603;\n\t\t\t\t\t\t\t\telse return 4604;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4605;\n\t\t\t\t\t\t\t\telse return 4606;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4607;\n\t\t\t\t\t\t\t\telse return 4608;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4609;\n\t\t\t\t\t\t\t\telse return 4610;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4611;\n\t\t\t\t\t\t\t\telse return 4612;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4613;\n\t\t\t\t\t\t\t\telse return 4614;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4615;\n\t\t\t\t\t\t\t\telse return 4616;\n\t\t\t\telse\n\t\t\t\t\tif (North)\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4617;\n\t\t\t\t\t\t\t\telse return 4618;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4619;\n\t\t\t\t\t\t\t\telse return 4620;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4621;\n\t\t\t\t\t\t\t\telse return 4622;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4623;\n\t\t\t\t\t\t\t\telse return 4624;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4625;\n\t\t\t\t\t\t\t\telse return 4626;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4627;\n\t\t\t\t\t\t\t\telse return 4628;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\t\tif (West) return 4629;\n\t\t\t\t\t\t\t\telse return 4630;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (West) return 4631;\n\t\t\t\t\t\t\t\telse return 4632;\n\t\t}\n\t\tBlockState RedMushroomBlock();\n\t\tbool Down(BlockState Block);\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace RedNetherBrickSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState RedNetherBrickSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10850;\n\t\t\telse if (Type == Type::Bottom) return 10852;\n\t\t\telse return 10854;\n\t\t}\n\t\tBlockState RedNetherBrickSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace RedNetherBrickStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState RedNetherBrickStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10550;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10552;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10554;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10556;\n\t\t\t\t\telse return 10558;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10560;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10562;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10564;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10566;\n\t\t\t\t\telse return 10568;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10570;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10572;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10574;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10576;\n\t\t\t\t\telse return 10578;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10580;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10582;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10584;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10586;\n\t\t\t\t\telse return 10588;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10590;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10592;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10594;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10596;\n\t\t\t\t\telse return 10598;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10600;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10602;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10604;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10606;\n\t\t\t\t\telse return 10608;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10610;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10612;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10614;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10616;\n\t\t\t\t\telse return 10618;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10620;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10622;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10624;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10626;\n\t\t\t\t\telse return 10628;\n\t\t}\n\t\tBlockState RedNetherBrickStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace RedNetherBrickWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState RedNetherBrickWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13462;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13463;\n\t\t\t\t\t\t\telse return 13464;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13468;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13469;\n\t\t\t\t\t\t\telse return 13470;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13474;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13475;\n\t\t\t\t\t\t\telse return 13476;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13480;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13481;\n\t\t\t\t\t\t\telse return 13482;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13486;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13487;\n\t\t\t\t\t\t\telse return 13488;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13492;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13493;\n\t\t\t\t\t\t\telse return 13494;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13498;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13499;\n\t\t\t\t\t\t\telse return 13500;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13504;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13505;\n\t\t\t\t\t\t\telse return 13506;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13510;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13511;\n\t\t\t\t\t\t\telse return 13512;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13516;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13517;\n\t\t\t\t\t\t\telse return 13518;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13522;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13523;\n\t\t\t\t\t\t\telse return 13524;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13528;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13529;\n\t\t\t\t\t\t\telse return 13530;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13534;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13535;\n\t\t\t\t\t\t\telse return 13536;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13540;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13541;\n\t\t\t\t\t\t\telse return 13542;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13546;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13547;\n\t\t\t\t\t\t\telse return 13548;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13552;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13553;\n\t\t\t\t\t\t\telse return 13554;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13558;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13559;\n\t\t\t\t\t\t\telse return 13560;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13564;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13565;\n\t\t\t\t\t\t\telse return 13566;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13570;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13571;\n\t\t\t\t\t\t\telse return 13572;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13576;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13577;\n\t\t\t\t\t\t\telse return 13578;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13582;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13583;\n\t\t\t\t\t\t\telse return 13584;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13588;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13589;\n\t\t\t\t\t\t\telse return 13590;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13594;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13595;\n\t\t\t\t\t\t\telse return 13596;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13600;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13601;\n\t\t\t\t\t\t\telse return 13602;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13606;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13607;\n\t\t\t\t\t\t\telse return 13608;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13612;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13613;\n\t\t\t\t\t\t\telse return 13614;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13618;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13619;\n\t\t\t\t\t\t\telse return 13620;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13624;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13625;\n\t\t\t\t\t\t\telse return 13626;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13630;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13631;\n\t\t\t\t\t\t\telse return 13632;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13636;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13637;\n\t\t\t\t\t\t\telse return 13638;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13642;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13643;\n\t\t\t\t\t\t\telse return 13644;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13648;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13649;\n\t\t\t\t\t\t\telse return 13650;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13654;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13655;\n\t\t\t\t\t\t\telse return 13656;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13660;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13661;\n\t\t\t\t\t\t\telse return 13662;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13666;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13667;\n\t\t\t\t\t\t\telse return 13668;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13672;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13673;\n\t\t\t\t\t\t\telse return 13674;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13678;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13679;\n\t\t\t\t\t\t\telse return 13680;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13684;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13685;\n\t\t\t\t\t\t\telse return 13686;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13690;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13691;\n\t\t\t\t\t\t\telse return 13692;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13696;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13697;\n\t\t\t\t\t\t\telse return 13698;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13702;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13703;\n\t\t\t\t\t\t\telse return 13704;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13708;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13709;\n\t\t\t\t\t\t\telse return 13710;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13714;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13715;\n\t\t\t\t\t\t\telse return 13716;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13720;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13721;\n\t\t\t\t\t\t\telse return 13722;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13726;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13727;\n\t\t\t\t\t\t\telse return 13728;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13732;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13733;\n\t\t\t\t\t\t\telse return 13734;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13738;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13739;\n\t\t\t\t\t\t\telse return 13740;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13744;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13745;\n\t\t\t\t\t\t\telse return 13746;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13750;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13751;\n\t\t\t\t\t\t\telse return 13752;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13756;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13757;\n\t\t\t\t\t\t\telse return 13758;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13762;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13763;\n\t\t\t\t\t\t\telse return 13764;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13768;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13769;\n\t\t\t\t\t\t\telse return 13770;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13774;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13775;\n\t\t\t\t\t\t\telse return 13776;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13780;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13781;\n\t\t\t\t\t\t\telse return 13782;\n\t\t}\n\t\tBlockState RedNetherBrickWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace RedNetherBricks\n\t{\n\t\tconstexpr BlockState RedNetherBricks()\n\t\t{\n\t\t\treturn 9255;\n\t\t}\n\t}\n\tnamespace RedSand\n\t{\n\t\tconstexpr BlockState RedSand()\n\t\t{\n\t\t\treturn 67;\n\t\t}\n\t}\n\tnamespace RedSandstone\n\t{\n\t\tconstexpr BlockState RedSandstone()\n\t\t{\n\t\t\treturn 8217;\n\t\t}\n\t}\n\tnamespace RedSandstoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState RedSandstoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8397;\n\t\t\telse if (Type == Type::Bottom) return 8399;\n\t\t\telse return 8401;\n\t\t}\n\t\tBlockState RedSandstoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace RedSandstoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState RedSandstoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 8221;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 8223;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 8225;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 8227;\n\t\t\t\t\telse return 8229;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 8231;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 8233;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 8235;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 8237;\n\t\t\t\t\telse return 8239;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 8241;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 8243;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 8245;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 8247;\n\t\t\t\t\telse return 8249;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 8251;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 8253;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 8255;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 8257;\n\t\t\t\t\telse return 8259;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 8261;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 8263;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 8265;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 8267;\n\t\t\t\t\telse return 8269;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 8271;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 8273;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 8275;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 8277;\n\t\t\t\t\telse return 8279;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 8281;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 8283;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 8285;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 8287;\n\t\t\t\t\telse return 8289;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 8291;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 8293;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 8295;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 8297;\n\t\t\t\t\telse return 8299;\n\t\t}\n\t\tBlockState RedSandstoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace RedSandstoneWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState RedSandstoneWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11518;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11519;\n\t\t\t\t\t\t\telse return 11520;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11524;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11525;\n\t\t\t\t\t\t\telse return 11526;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11530;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11531;\n\t\t\t\t\t\t\telse return 11532;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11536;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11537;\n\t\t\t\t\t\t\telse return 11538;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11542;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11543;\n\t\t\t\t\t\t\telse return 11544;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11548;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11549;\n\t\t\t\t\t\t\telse return 11550;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11554;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11555;\n\t\t\t\t\t\t\telse return 11556;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11560;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11561;\n\t\t\t\t\t\t\telse return 11562;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11566;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11567;\n\t\t\t\t\t\t\telse return 11568;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11572;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11573;\n\t\t\t\t\t\t\telse return 11574;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11578;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11579;\n\t\t\t\t\t\t\telse return 11580;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11584;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11585;\n\t\t\t\t\t\t\telse return 11586;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11590;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11591;\n\t\t\t\t\t\t\telse return 11592;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11596;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11597;\n\t\t\t\t\t\t\telse return 11598;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11602;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11603;\n\t\t\t\t\t\t\telse return 11604;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11608;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11609;\n\t\t\t\t\t\t\telse return 11610;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11614;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11615;\n\t\t\t\t\t\t\telse return 11616;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11620;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11621;\n\t\t\t\t\t\t\telse return 11622;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11626;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11627;\n\t\t\t\t\t\t\telse return 11628;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11632;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11633;\n\t\t\t\t\t\t\telse return 11634;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11638;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11639;\n\t\t\t\t\t\t\telse return 11640;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11644;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11645;\n\t\t\t\t\t\t\telse return 11646;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11650;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11651;\n\t\t\t\t\t\t\telse return 11652;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11656;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11657;\n\t\t\t\t\t\t\telse return 11658;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11662;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11663;\n\t\t\t\t\t\t\telse return 11664;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11668;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11669;\n\t\t\t\t\t\t\telse return 11670;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11674;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11675;\n\t\t\t\t\t\t\telse return 11676;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11680;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11681;\n\t\t\t\t\t\t\telse return 11682;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11686;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11687;\n\t\t\t\t\t\t\telse return 11688;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11692;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11693;\n\t\t\t\t\t\t\telse return 11694;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11698;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11699;\n\t\t\t\t\t\t\telse return 11700;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11704;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11705;\n\t\t\t\t\t\t\telse return 11706;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11710;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11711;\n\t\t\t\t\t\t\telse return 11712;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11716;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11717;\n\t\t\t\t\t\t\telse return 11718;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11722;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11723;\n\t\t\t\t\t\t\telse return 11724;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11728;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11729;\n\t\t\t\t\t\t\telse return 11730;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11734;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11735;\n\t\t\t\t\t\t\telse return 11736;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11740;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11741;\n\t\t\t\t\t\t\telse return 11742;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11746;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11747;\n\t\t\t\t\t\t\telse return 11748;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11752;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11753;\n\t\t\t\t\t\t\telse return 11754;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11758;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11759;\n\t\t\t\t\t\t\telse return 11760;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11764;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11765;\n\t\t\t\t\t\t\telse return 11766;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11770;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11771;\n\t\t\t\t\t\t\telse return 11772;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11776;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11777;\n\t\t\t\t\t\t\telse return 11778;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11782;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11783;\n\t\t\t\t\t\t\telse return 11784;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11788;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11789;\n\t\t\t\t\t\t\telse return 11790;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11794;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11795;\n\t\t\t\t\t\t\telse return 11796;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11800;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11801;\n\t\t\t\t\t\t\telse return 11802;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11806;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11807;\n\t\t\t\t\t\t\telse return 11808;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11812;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11813;\n\t\t\t\t\t\t\telse return 11814;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11818;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11819;\n\t\t\t\t\t\t\telse return 11820;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11824;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11825;\n\t\t\t\t\t\t\telse return 11826;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 11830;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11831;\n\t\t\t\t\t\t\telse return 11832;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 11836;\n\t\t\t\t\t\t\telse if (West == West::Low) return 11837;\n\t\t\t\t\t\t\telse return 11838;\n\t\t}\n\t\tBlockState RedSandstoneWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace RedShulkerBox\n\t{\n\t\tconstexpr BlockState RedShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9362;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9363;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9364;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9365;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9366;\n\t\t\telse return 9367;\n\t\t}\n\t\tBlockState RedShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace RedStainedGlass\n\t{\n\t\tconstexpr BlockState RedStainedGlass()\n\t\t{\n\t\t\treturn 4109;\n\t\t}\n\t}\n\tnamespace RedStainedGlassPane\n\t{\n\t\tconstexpr BlockState RedStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7313;\n\t\t\t\t\t\telse return 7314;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7317;\n\t\t\t\t\t\telse return 7318;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7321;\n\t\t\t\t\t\telse return 7322;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7325;\n\t\t\t\t\t\telse return 7326;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7329;\n\t\t\t\t\t\telse return 7330;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7333;\n\t\t\t\t\t\telse return 7334;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7337;\n\t\t\t\t\t\telse return 7338;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7341;\n\t\t\t\t\t\telse return 7342;\n\t\t}\n\t\tBlockState RedStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace RedTerracotta\n\t{\n\t\tconstexpr BlockState RedTerracotta()\n\t\t{\n\t\t\treturn 6861;\n\t\t}\n\t}\n\tnamespace RedTulip\n\t{\n\t\tconstexpr BlockState RedTulip()\n\t\t{\n\t\t\treturn 1417;\n\t\t}\n\t}\n\tnamespace RedWallBanner\n\t{\n\t\tconstexpr BlockState RedWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8209;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8210;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8211;\n\t\t\telse return 8212;\n\t\t}\n\t\tBlockState RedWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace RedWool\n\t{\n\t\tconstexpr BlockState RedWool()\n\t\t{\n\t\t\treturn 1398;\n\t\t}\n\t}\n\tnamespace RedstoneBlock\n\t{\n\t\tconstexpr BlockState RedstoneBlock()\n\t\t{\n\t\t\treturn 6726;\n\t\t}\n\t}\n\tnamespace RedstoneLamp\n\t{\n\t\tconstexpr BlockState RedstoneLamp(const bool Lit)\n\t\t{\n\t\t\tif (Lit) return 5156;\n\t\t\telse return 5157;\n\t\t}\n\t\tBlockState RedstoneLamp();\n\t\tbool Lit(BlockState Block);\n\t}\n\tnamespace RedstoneOre\n\t{\n\t\tconstexpr BlockState RedstoneOre(const bool Lit)\n\t\t{\n\t\t\tif (Lit) return 3885;\n\t\t\telse return 3886;\n\t\t}\n\t\tBlockState RedstoneOre();\n\t\tbool Lit(BlockState Block);\n\t}\n\tnamespace RedstoneTorch\n\t{\n\t\tconstexpr BlockState RedstoneTorch(const bool Lit)\n\t\t{\n\t\t\tif (Lit) return 3887;\n\t\t\telse return 3888;\n\t\t}\n\t\tBlockState RedstoneTorch();\n\t\tbool Lit(BlockState Block);\n\t}\n\tnamespace RedstoneWallTorch\n\t{\n\t\tconstexpr BlockState RedstoneWallTorch(const eBlockFace Facing, const bool Lit)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Lit) return 3889;\n\t\t\t\telse return 3890;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Lit) return 3891;\n\t\t\t\telse return 3892;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Lit) return 3893;\n\t\t\t\telse return 3894;\n\t\t\telse\n\t\t\t\tif (Lit) return 3895;\n\t\t\t\telse return 3896;\n\t\t}\n\t\tBlockState RedstoneWallTorch();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Lit(BlockState Block);\n\t}\n\tnamespace RedstoneWire\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tUp,\n\t\t\tSide,\n\t\t\tNone\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tUp,\n\t\t\tSide,\n\t\t\tNone\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tUp,\n\t\t\tSide,\n\t\t\tNone\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tUp,\n\t\t\tSide,\n\t\t\tNone\n\t\t};\n\t\tconstexpr BlockState RedstoneWire(const enum East East, const enum North North, const unsigned char Power, const enum South South, const enum West West)\n\t\t{\n\t\t\tif (East == East::Up)\n\t\t\t\tif (North == North::Up)\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2058;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2059;\n\t\t\t\t\t\t\telse return 2060;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2061;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2062;\n\t\t\t\t\t\t\telse return 2063;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2064;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2065;\n\t\t\t\t\t\t\telse return 2066;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2067;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2068;\n\t\t\t\t\t\t\telse return 2069;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2070;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2071;\n\t\t\t\t\t\t\telse return 2072;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2073;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2074;\n\t\t\t\t\t\t\telse return 2075;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2076;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2077;\n\t\t\t\t\t\t\telse return 2078;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2079;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2080;\n\t\t\t\t\t\t\telse return 2081;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2082;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2083;\n\t\t\t\t\t\t\telse return 2084;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2085;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2086;\n\t\t\t\t\t\t\telse return 2087;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2088;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2089;\n\t\t\t\t\t\t\telse return 2090;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2091;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2092;\n\t\t\t\t\t\t\telse return 2093;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2094;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2095;\n\t\t\t\t\t\t\telse return 2096;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2097;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2098;\n\t\t\t\t\t\t\telse return 2099;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2100;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2101;\n\t\t\t\t\t\t\telse return 2102;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2103;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2104;\n\t\t\t\t\t\t\telse return 2105;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2106;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2107;\n\t\t\t\t\t\t\telse return 2108;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2109;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2110;\n\t\t\t\t\t\t\telse return 2111;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2112;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2113;\n\t\t\t\t\t\t\telse return 2114;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2115;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2116;\n\t\t\t\t\t\t\telse return 2117;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2118;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2119;\n\t\t\t\t\t\t\telse return 2120;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2121;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2122;\n\t\t\t\t\t\t\telse return 2123;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2124;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2125;\n\t\t\t\t\t\t\telse return 2126;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2127;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2128;\n\t\t\t\t\t\t\telse return 2129;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2130;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2131;\n\t\t\t\t\t\t\telse return 2132;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2133;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2134;\n\t\t\t\t\t\t\telse return 2135;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2136;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2137;\n\t\t\t\t\t\t\telse return 2138;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2139;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2140;\n\t\t\t\t\t\t\telse return 2141;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2142;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2143;\n\t\t\t\t\t\t\telse return 2144;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2145;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2146;\n\t\t\t\t\t\t\telse return 2147;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2148;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2149;\n\t\t\t\t\t\t\telse return 2150;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2151;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2152;\n\t\t\t\t\t\t\telse return 2153;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2154;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2155;\n\t\t\t\t\t\t\telse return 2156;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2157;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2158;\n\t\t\t\t\t\t\telse return 2159;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2160;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2161;\n\t\t\t\t\t\t\telse return 2162;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2163;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2164;\n\t\t\t\t\t\t\telse return 2165;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2166;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2167;\n\t\t\t\t\t\t\telse return 2168;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2169;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2170;\n\t\t\t\t\t\t\telse return 2171;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2172;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2173;\n\t\t\t\t\t\t\telse return 2174;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2175;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2176;\n\t\t\t\t\t\t\telse return 2177;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2178;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2179;\n\t\t\t\t\t\t\telse return 2180;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2181;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2182;\n\t\t\t\t\t\t\telse return 2183;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2184;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2185;\n\t\t\t\t\t\t\telse return 2186;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2187;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2188;\n\t\t\t\t\t\t\telse return 2189;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2190;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2191;\n\t\t\t\t\t\t\telse return 2192;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2193;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2194;\n\t\t\t\t\t\t\telse return 2195;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2196;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2197;\n\t\t\t\t\t\t\telse return 2198;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2199;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2200;\n\t\t\t\t\t\t\telse return 2201;\n\t\t\t\telse if (North == North::Side)\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2202;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2203;\n\t\t\t\t\t\t\telse return 2204;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2205;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2206;\n\t\t\t\t\t\t\telse return 2207;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2208;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2209;\n\t\t\t\t\t\t\telse return 2210;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2211;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2212;\n\t\t\t\t\t\t\telse return 2213;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2214;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2215;\n\t\t\t\t\t\t\telse return 2216;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2217;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2218;\n\t\t\t\t\t\t\telse return 2219;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2220;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2221;\n\t\t\t\t\t\t\telse return 2222;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2223;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2224;\n\t\t\t\t\t\t\telse return 2225;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2226;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2227;\n\t\t\t\t\t\t\telse return 2228;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2229;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2230;\n\t\t\t\t\t\t\telse return 2231;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2232;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2233;\n\t\t\t\t\t\t\telse return 2234;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2235;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2236;\n\t\t\t\t\t\t\telse return 2237;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2238;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2239;\n\t\t\t\t\t\t\telse return 2240;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2241;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2242;\n\t\t\t\t\t\t\telse return 2243;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2244;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2245;\n\t\t\t\t\t\t\telse return 2246;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2247;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2248;\n\t\t\t\t\t\t\telse return 2249;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2250;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2251;\n\t\t\t\t\t\t\telse return 2252;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2253;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2254;\n\t\t\t\t\t\t\telse return 2255;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2256;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2257;\n\t\t\t\t\t\t\telse return 2258;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2259;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2260;\n\t\t\t\t\t\t\telse return 2261;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2262;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2263;\n\t\t\t\t\t\t\telse return 2264;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2265;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2266;\n\t\t\t\t\t\t\telse return 2267;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2268;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2269;\n\t\t\t\t\t\t\telse return 2270;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2271;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2272;\n\t\t\t\t\t\t\telse return 2273;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2274;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2275;\n\t\t\t\t\t\t\telse return 2276;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2277;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2278;\n\t\t\t\t\t\t\telse return 2279;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2280;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2281;\n\t\t\t\t\t\t\telse return 2282;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2283;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2284;\n\t\t\t\t\t\t\telse return 2285;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2286;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2287;\n\t\t\t\t\t\t\telse return 2288;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2289;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2290;\n\t\t\t\t\t\t\telse return 2291;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2292;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2293;\n\t\t\t\t\t\t\telse return 2294;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2295;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2296;\n\t\t\t\t\t\t\telse return 2297;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2298;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2299;\n\t\t\t\t\t\t\telse return 2300;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2301;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2302;\n\t\t\t\t\t\t\telse return 2303;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2304;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2305;\n\t\t\t\t\t\t\telse return 2306;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2307;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2308;\n\t\t\t\t\t\t\telse return 2309;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2310;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2311;\n\t\t\t\t\t\t\telse return 2312;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2313;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2314;\n\t\t\t\t\t\t\telse return 2315;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2316;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2317;\n\t\t\t\t\t\t\telse return 2318;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2319;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2320;\n\t\t\t\t\t\t\telse return 2321;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2322;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2323;\n\t\t\t\t\t\t\telse return 2324;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2325;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2326;\n\t\t\t\t\t\t\telse return 2327;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2328;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2329;\n\t\t\t\t\t\t\telse return 2330;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2331;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2332;\n\t\t\t\t\t\t\telse return 2333;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2334;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2335;\n\t\t\t\t\t\t\telse return 2336;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2337;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2338;\n\t\t\t\t\t\t\telse return 2339;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2340;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2341;\n\t\t\t\t\t\t\telse return 2342;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2343;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2344;\n\t\t\t\t\t\t\telse return 2345;\n\t\t\t\telse\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2346;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2347;\n\t\t\t\t\t\t\telse return 2348;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2349;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2350;\n\t\t\t\t\t\t\telse return 2351;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2352;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2353;\n\t\t\t\t\t\t\telse return 2354;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2355;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2356;\n\t\t\t\t\t\t\telse return 2357;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2358;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2359;\n\t\t\t\t\t\t\telse return 2360;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2361;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2362;\n\t\t\t\t\t\t\telse return 2363;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2364;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2365;\n\t\t\t\t\t\t\telse return 2366;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2367;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2368;\n\t\t\t\t\t\t\telse return 2369;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2370;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2371;\n\t\t\t\t\t\t\telse return 2372;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2373;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2374;\n\t\t\t\t\t\t\telse return 2375;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2376;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2377;\n\t\t\t\t\t\t\telse return 2378;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2379;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2380;\n\t\t\t\t\t\t\telse return 2381;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2382;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2383;\n\t\t\t\t\t\t\telse return 2384;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2385;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2386;\n\t\t\t\t\t\t\telse return 2387;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2388;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2389;\n\t\t\t\t\t\t\telse return 2390;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2391;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2392;\n\t\t\t\t\t\t\telse return 2393;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2394;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2395;\n\t\t\t\t\t\t\telse return 2396;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2397;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2398;\n\t\t\t\t\t\t\telse return 2399;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2400;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2401;\n\t\t\t\t\t\t\telse return 2402;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2403;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2404;\n\t\t\t\t\t\t\telse return 2405;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2406;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2407;\n\t\t\t\t\t\t\telse return 2408;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2409;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2410;\n\t\t\t\t\t\t\telse return 2411;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2412;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2413;\n\t\t\t\t\t\t\telse return 2414;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2415;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2416;\n\t\t\t\t\t\t\telse return 2417;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2418;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2419;\n\t\t\t\t\t\t\telse return 2420;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2421;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2422;\n\t\t\t\t\t\t\telse return 2423;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2424;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2425;\n\t\t\t\t\t\t\telse return 2426;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2427;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2428;\n\t\t\t\t\t\t\telse return 2429;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2430;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2431;\n\t\t\t\t\t\t\telse return 2432;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2433;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2434;\n\t\t\t\t\t\t\telse return 2435;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2436;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2437;\n\t\t\t\t\t\t\telse return 2438;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2439;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2440;\n\t\t\t\t\t\t\telse return 2441;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2442;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2443;\n\t\t\t\t\t\t\telse return 2444;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2445;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2446;\n\t\t\t\t\t\t\telse return 2447;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2448;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2449;\n\t\t\t\t\t\t\telse return 2450;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2451;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2452;\n\t\t\t\t\t\t\telse return 2453;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2454;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2455;\n\t\t\t\t\t\t\telse return 2456;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2457;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2458;\n\t\t\t\t\t\t\telse return 2459;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2460;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2461;\n\t\t\t\t\t\t\telse return 2462;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2463;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2464;\n\t\t\t\t\t\t\telse return 2465;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2466;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2467;\n\t\t\t\t\t\t\telse return 2468;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2469;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2470;\n\t\t\t\t\t\t\telse return 2471;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2472;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2473;\n\t\t\t\t\t\t\telse return 2474;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2475;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2476;\n\t\t\t\t\t\t\telse return 2477;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2478;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2479;\n\t\t\t\t\t\t\telse return 2480;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2481;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2482;\n\t\t\t\t\t\t\telse return 2483;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2484;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2485;\n\t\t\t\t\t\t\telse return 2486;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2487;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2488;\n\t\t\t\t\t\t\telse return 2489;\n\t\t\telse if (East == East::Side)\n\t\t\t\tif (North == North::Up)\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2490;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2491;\n\t\t\t\t\t\t\telse return 2492;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2493;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2494;\n\t\t\t\t\t\t\telse return 2495;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2496;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2497;\n\t\t\t\t\t\t\telse return 2498;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2499;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2500;\n\t\t\t\t\t\t\telse return 2501;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2502;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2503;\n\t\t\t\t\t\t\telse return 2504;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2505;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2506;\n\t\t\t\t\t\t\telse return 2507;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2508;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2509;\n\t\t\t\t\t\t\telse return 2510;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2511;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2512;\n\t\t\t\t\t\t\telse return 2513;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2514;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2515;\n\t\t\t\t\t\t\telse return 2516;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2517;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2518;\n\t\t\t\t\t\t\telse return 2519;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2520;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2521;\n\t\t\t\t\t\t\telse return 2522;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2523;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2524;\n\t\t\t\t\t\t\telse return 2525;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2526;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2527;\n\t\t\t\t\t\t\telse return 2528;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2529;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2530;\n\t\t\t\t\t\t\telse return 2531;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2532;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2533;\n\t\t\t\t\t\t\telse return 2534;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2535;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2536;\n\t\t\t\t\t\t\telse return 2537;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2538;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2539;\n\t\t\t\t\t\t\telse return 2540;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2541;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2542;\n\t\t\t\t\t\t\telse return 2543;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2544;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2545;\n\t\t\t\t\t\t\telse return 2546;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2547;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2548;\n\t\t\t\t\t\t\telse return 2549;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2550;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2551;\n\t\t\t\t\t\t\telse return 2552;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2553;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2554;\n\t\t\t\t\t\t\telse return 2555;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2556;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2557;\n\t\t\t\t\t\t\telse return 2558;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2559;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2560;\n\t\t\t\t\t\t\telse return 2561;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2562;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2563;\n\t\t\t\t\t\t\telse return 2564;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2565;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2566;\n\t\t\t\t\t\t\telse return 2567;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2568;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2569;\n\t\t\t\t\t\t\telse return 2570;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2571;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2572;\n\t\t\t\t\t\t\telse return 2573;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2574;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2575;\n\t\t\t\t\t\t\telse return 2576;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2577;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2578;\n\t\t\t\t\t\t\telse return 2579;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2580;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2581;\n\t\t\t\t\t\t\telse return 2582;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2583;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2584;\n\t\t\t\t\t\t\telse return 2585;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2586;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2587;\n\t\t\t\t\t\t\telse return 2588;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2589;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2590;\n\t\t\t\t\t\t\telse return 2591;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2592;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2593;\n\t\t\t\t\t\t\telse return 2594;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2595;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2596;\n\t\t\t\t\t\t\telse return 2597;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2598;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2599;\n\t\t\t\t\t\t\telse return 2600;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2601;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2602;\n\t\t\t\t\t\t\telse return 2603;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2604;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2605;\n\t\t\t\t\t\t\telse return 2606;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2607;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2608;\n\t\t\t\t\t\t\telse return 2609;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2610;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2611;\n\t\t\t\t\t\t\telse return 2612;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2613;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2614;\n\t\t\t\t\t\t\telse return 2615;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2616;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2617;\n\t\t\t\t\t\t\telse return 2618;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2619;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2620;\n\t\t\t\t\t\t\telse return 2621;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2622;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2623;\n\t\t\t\t\t\t\telse return 2624;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2625;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2626;\n\t\t\t\t\t\t\telse return 2627;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2628;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2629;\n\t\t\t\t\t\t\telse return 2630;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2631;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2632;\n\t\t\t\t\t\t\telse return 2633;\n\t\t\t\telse if (North == North::Side)\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2634;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2635;\n\t\t\t\t\t\t\telse return 2636;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2637;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2638;\n\t\t\t\t\t\t\telse return 2639;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2640;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2641;\n\t\t\t\t\t\t\telse return 2642;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2643;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2644;\n\t\t\t\t\t\t\telse return 2645;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2646;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2647;\n\t\t\t\t\t\t\telse return 2648;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2649;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2650;\n\t\t\t\t\t\t\telse return 2651;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2652;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2653;\n\t\t\t\t\t\t\telse return 2654;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2655;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2656;\n\t\t\t\t\t\t\telse return 2657;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2658;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2659;\n\t\t\t\t\t\t\telse return 2660;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2661;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2662;\n\t\t\t\t\t\t\telse return 2663;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2664;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2665;\n\t\t\t\t\t\t\telse return 2666;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2667;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2668;\n\t\t\t\t\t\t\telse return 2669;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2670;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2671;\n\t\t\t\t\t\t\telse return 2672;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2673;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2674;\n\t\t\t\t\t\t\telse return 2675;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2676;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2677;\n\t\t\t\t\t\t\telse return 2678;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2679;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2680;\n\t\t\t\t\t\t\telse return 2681;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2682;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2683;\n\t\t\t\t\t\t\telse return 2684;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2685;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2686;\n\t\t\t\t\t\t\telse return 2687;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2688;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2689;\n\t\t\t\t\t\t\telse return 2690;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2691;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2692;\n\t\t\t\t\t\t\telse return 2693;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2694;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2695;\n\t\t\t\t\t\t\telse return 2696;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2697;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2698;\n\t\t\t\t\t\t\telse return 2699;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2700;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2701;\n\t\t\t\t\t\t\telse return 2702;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2703;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2704;\n\t\t\t\t\t\t\telse return 2705;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2706;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2707;\n\t\t\t\t\t\t\telse return 2708;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2709;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2710;\n\t\t\t\t\t\t\telse return 2711;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2712;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2713;\n\t\t\t\t\t\t\telse return 2714;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2715;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2716;\n\t\t\t\t\t\t\telse return 2717;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2718;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2719;\n\t\t\t\t\t\t\telse return 2720;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2721;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2722;\n\t\t\t\t\t\t\telse return 2723;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2724;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2725;\n\t\t\t\t\t\t\telse return 2726;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2727;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2728;\n\t\t\t\t\t\t\telse return 2729;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2730;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2731;\n\t\t\t\t\t\t\telse return 2732;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2733;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2734;\n\t\t\t\t\t\t\telse return 2735;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2736;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2737;\n\t\t\t\t\t\t\telse return 2738;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2739;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2740;\n\t\t\t\t\t\t\telse return 2741;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2742;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2743;\n\t\t\t\t\t\t\telse return 2744;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2745;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2746;\n\t\t\t\t\t\t\telse return 2747;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2748;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2749;\n\t\t\t\t\t\t\telse return 2750;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2751;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2752;\n\t\t\t\t\t\t\telse return 2753;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2754;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2755;\n\t\t\t\t\t\t\telse return 2756;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2757;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2758;\n\t\t\t\t\t\t\telse return 2759;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2760;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2761;\n\t\t\t\t\t\t\telse return 2762;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2763;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2764;\n\t\t\t\t\t\t\telse return 2765;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2766;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2767;\n\t\t\t\t\t\t\telse return 2768;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2769;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2770;\n\t\t\t\t\t\t\telse return 2771;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2772;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2773;\n\t\t\t\t\t\t\telse return 2774;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2775;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2776;\n\t\t\t\t\t\t\telse return 2777;\n\t\t\t\telse\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2778;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2779;\n\t\t\t\t\t\t\telse return 2780;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2781;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2782;\n\t\t\t\t\t\t\telse return 2783;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2784;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2785;\n\t\t\t\t\t\t\telse return 2786;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2787;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2788;\n\t\t\t\t\t\t\telse return 2789;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2790;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2791;\n\t\t\t\t\t\t\telse return 2792;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2793;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2794;\n\t\t\t\t\t\t\telse return 2795;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2796;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2797;\n\t\t\t\t\t\t\telse return 2798;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2799;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2800;\n\t\t\t\t\t\t\telse return 2801;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2802;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2803;\n\t\t\t\t\t\t\telse return 2804;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2805;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2806;\n\t\t\t\t\t\t\telse return 2807;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2808;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2809;\n\t\t\t\t\t\t\telse return 2810;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2811;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2812;\n\t\t\t\t\t\t\telse return 2813;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2814;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2815;\n\t\t\t\t\t\t\telse return 2816;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2817;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2818;\n\t\t\t\t\t\t\telse return 2819;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2820;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2821;\n\t\t\t\t\t\t\telse return 2822;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2823;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2824;\n\t\t\t\t\t\t\telse return 2825;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2826;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2827;\n\t\t\t\t\t\t\telse return 2828;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2829;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2830;\n\t\t\t\t\t\t\telse return 2831;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2832;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2833;\n\t\t\t\t\t\t\telse return 2834;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2835;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2836;\n\t\t\t\t\t\t\telse return 2837;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2838;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2839;\n\t\t\t\t\t\t\telse return 2840;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2841;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2842;\n\t\t\t\t\t\t\telse return 2843;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2844;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2845;\n\t\t\t\t\t\t\telse return 2846;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2847;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2848;\n\t\t\t\t\t\t\telse return 2849;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2850;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2851;\n\t\t\t\t\t\t\telse return 2852;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2853;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2854;\n\t\t\t\t\t\t\telse return 2855;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2856;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2857;\n\t\t\t\t\t\t\telse return 2858;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2859;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2860;\n\t\t\t\t\t\t\telse return 2861;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2862;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2863;\n\t\t\t\t\t\t\telse return 2864;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2865;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2866;\n\t\t\t\t\t\t\telse return 2867;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2868;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2869;\n\t\t\t\t\t\t\telse return 2870;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2871;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2872;\n\t\t\t\t\t\t\telse return 2873;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2874;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2875;\n\t\t\t\t\t\t\telse return 2876;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2877;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2878;\n\t\t\t\t\t\t\telse return 2879;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2880;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2881;\n\t\t\t\t\t\t\telse return 2882;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2883;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2884;\n\t\t\t\t\t\t\telse return 2885;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2886;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2887;\n\t\t\t\t\t\t\telse return 2888;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2889;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2890;\n\t\t\t\t\t\t\telse return 2891;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2892;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2893;\n\t\t\t\t\t\t\telse return 2894;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2895;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2896;\n\t\t\t\t\t\t\telse return 2897;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2898;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2899;\n\t\t\t\t\t\t\telse return 2900;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2901;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2902;\n\t\t\t\t\t\t\telse return 2903;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2904;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2905;\n\t\t\t\t\t\t\telse return 2906;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2907;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2908;\n\t\t\t\t\t\t\telse return 2909;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2910;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2911;\n\t\t\t\t\t\t\telse return 2912;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2913;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2914;\n\t\t\t\t\t\t\telse return 2915;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2916;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2917;\n\t\t\t\t\t\t\telse return 2918;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2919;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2920;\n\t\t\t\t\t\t\telse return 2921;\n\t\t\telse\n\t\t\t\tif (North == North::Up)\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2922;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2923;\n\t\t\t\t\t\t\telse return 2924;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2925;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2926;\n\t\t\t\t\t\t\telse return 2927;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2928;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2929;\n\t\t\t\t\t\t\telse return 2930;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2931;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2932;\n\t\t\t\t\t\t\telse return 2933;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2934;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2935;\n\t\t\t\t\t\t\telse return 2936;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2937;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2938;\n\t\t\t\t\t\t\telse return 2939;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2940;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2941;\n\t\t\t\t\t\t\telse return 2942;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2943;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2944;\n\t\t\t\t\t\t\telse return 2945;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2946;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2947;\n\t\t\t\t\t\t\telse return 2948;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2949;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2950;\n\t\t\t\t\t\t\telse return 2951;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2952;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2953;\n\t\t\t\t\t\t\telse return 2954;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2955;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2956;\n\t\t\t\t\t\t\telse return 2957;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2958;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2959;\n\t\t\t\t\t\t\telse return 2960;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2961;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2962;\n\t\t\t\t\t\t\telse return 2963;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2964;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2965;\n\t\t\t\t\t\t\telse return 2966;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2967;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2968;\n\t\t\t\t\t\t\telse return 2969;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2970;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2971;\n\t\t\t\t\t\t\telse return 2972;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2973;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2974;\n\t\t\t\t\t\t\telse return 2975;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2976;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2977;\n\t\t\t\t\t\t\telse return 2978;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2979;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2980;\n\t\t\t\t\t\t\telse return 2981;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2982;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2983;\n\t\t\t\t\t\t\telse return 2984;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2985;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2986;\n\t\t\t\t\t\t\telse return 2987;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2988;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2989;\n\t\t\t\t\t\t\telse return 2990;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 2991;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2992;\n\t\t\t\t\t\t\telse return 2993;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 2994;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2995;\n\t\t\t\t\t\t\telse return 2996;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 2997;\n\t\t\t\t\t\t\telse if (West == West::Side) return 2998;\n\t\t\t\t\t\t\telse return 2999;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3000;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3001;\n\t\t\t\t\t\t\telse return 3002;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3003;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3004;\n\t\t\t\t\t\t\telse return 3005;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3006;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3007;\n\t\t\t\t\t\t\telse return 3008;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3009;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3010;\n\t\t\t\t\t\t\telse return 3011;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3012;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3013;\n\t\t\t\t\t\t\telse return 3014;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3015;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3016;\n\t\t\t\t\t\t\telse return 3017;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3018;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3019;\n\t\t\t\t\t\t\telse return 3020;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3021;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3022;\n\t\t\t\t\t\t\telse return 3023;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3024;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3025;\n\t\t\t\t\t\t\telse return 3026;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3027;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3028;\n\t\t\t\t\t\t\telse return 3029;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3030;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3031;\n\t\t\t\t\t\t\telse return 3032;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3033;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3034;\n\t\t\t\t\t\t\telse return 3035;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3036;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3037;\n\t\t\t\t\t\t\telse return 3038;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3039;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3040;\n\t\t\t\t\t\t\telse return 3041;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3042;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3043;\n\t\t\t\t\t\t\telse return 3044;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3045;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3046;\n\t\t\t\t\t\t\telse return 3047;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3048;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3049;\n\t\t\t\t\t\t\telse return 3050;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3051;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3052;\n\t\t\t\t\t\t\telse return 3053;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3054;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3055;\n\t\t\t\t\t\t\telse return 3056;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3057;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3058;\n\t\t\t\t\t\t\telse return 3059;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3060;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3061;\n\t\t\t\t\t\t\telse return 3062;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3063;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3064;\n\t\t\t\t\t\t\telse return 3065;\n\t\t\t\telse if (North == North::Side)\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3066;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3067;\n\t\t\t\t\t\t\telse return 3068;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3069;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3070;\n\t\t\t\t\t\t\telse return 3071;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3072;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3073;\n\t\t\t\t\t\t\telse return 3074;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3075;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3076;\n\t\t\t\t\t\t\telse return 3077;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3078;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3079;\n\t\t\t\t\t\t\telse return 3080;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3081;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3082;\n\t\t\t\t\t\t\telse return 3083;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3084;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3085;\n\t\t\t\t\t\t\telse return 3086;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3087;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3088;\n\t\t\t\t\t\t\telse return 3089;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3090;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3091;\n\t\t\t\t\t\t\telse return 3092;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3093;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3094;\n\t\t\t\t\t\t\telse return 3095;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3096;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3097;\n\t\t\t\t\t\t\telse return 3098;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3099;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3100;\n\t\t\t\t\t\t\telse return 3101;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3102;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3103;\n\t\t\t\t\t\t\telse return 3104;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3105;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3106;\n\t\t\t\t\t\t\telse return 3107;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3108;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3109;\n\t\t\t\t\t\t\telse return 3110;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3111;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3112;\n\t\t\t\t\t\t\telse return 3113;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3114;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3115;\n\t\t\t\t\t\t\telse return 3116;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3117;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3118;\n\t\t\t\t\t\t\telse return 3119;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3120;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3121;\n\t\t\t\t\t\t\telse return 3122;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3123;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3124;\n\t\t\t\t\t\t\telse return 3125;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3126;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3127;\n\t\t\t\t\t\t\telse return 3128;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3129;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3130;\n\t\t\t\t\t\t\telse return 3131;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3132;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3133;\n\t\t\t\t\t\t\telse return 3134;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3135;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3136;\n\t\t\t\t\t\t\telse return 3137;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3138;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3139;\n\t\t\t\t\t\t\telse return 3140;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3141;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3142;\n\t\t\t\t\t\t\telse return 3143;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3144;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3145;\n\t\t\t\t\t\t\telse return 3146;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3147;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3148;\n\t\t\t\t\t\t\telse return 3149;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3150;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3151;\n\t\t\t\t\t\t\telse return 3152;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3153;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3154;\n\t\t\t\t\t\t\telse return 3155;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3156;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3157;\n\t\t\t\t\t\t\telse return 3158;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3159;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3160;\n\t\t\t\t\t\t\telse return 3161;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3162;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3163;\n\t\t\t\t\t\t\telse return 3164;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3165;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3166;\n\t\t\t\t\t\t\telse return 3167;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3168;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3169;\n\t\t\t\t\t\t\telse return 3170;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3171;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3172;\n\t\t\t\t\t\t\telse return 3173;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3174;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3175;\n\t\t\t\t\t\t\telse return 3176;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3177;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3178;\n\t\t\t\t\t\t\telse return 3179;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3180;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3181;\n\t\t\t\t\t\t\telse return 3182;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3183;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3184;\n\t\t\t\t\t\t\telse return 3185;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3186;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3187;\n\t\t\t\t\t\t\telse return 3188;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3189;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3190;\n\t\t\t\t\t\t\telse return 3191;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3192;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3193;\n\t\t\t\t\t\t\telse return 3194;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3195;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3196;\n\t\t\t\t\t\t\telse return 3197;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3198;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3199;\n\t\t\t\t\t\t\telse return 3200;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3201;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3202;\n\t\t\t\t\t\t\telse return 3203;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3204;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3205;\n\t\t\t\t\t\t\telse return 3206;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3207;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3208;\n\t\t\t\t\t\t\telse return 3209;\n\t\t\t\telse\n\t\t\t\t\tif (Power == 0)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3210;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3211;\n\t\t\t\t\t\t\telse return 3212;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3213;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3214;\n\t\t\t\t\t\t\telse return 3215;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3216;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3217;\n\t\t\t\t\t\t\telse return 3218;\n\t\t\t\t\telse if (Power == 1)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3219;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3220;\n\t\t\t\t\t\t\telse return 3221;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3222;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3223;\n\t\t\t\t\t\t\telse return 3224;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3225;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3226;\n\t\t\t\t\t\t\telse return 3227;\n\t\t\t\t\telse if (Power == 2)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3228;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3229;\n\t\t\t\t\t\t\telse return 3230;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3231;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3232;\n\t\t\t\t\t\t\telse return 3233;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3234;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3235;\n\t\t\t\t\t\t\telse return 3236;\n\t\t\t\t\telse if (Power == 3)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3237;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3238;\n\t\t\t\t\t\t\telse return 3239;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3240;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3241;\n\t\t\t\t\t\t\telse return 3242;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3243;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3244;\n\t\t\t\t\t\t\telse return 3245;\n\t\t\t\t\telse if (Power == 4)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3246;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3247;\n\t\t\t\t\t\t\telse return 3248;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3249;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3250;\n\t\t\t\t\t\t\telse return 3251;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3252;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3253;\n\t\t\t\t\t\t\telse return 3254;\n\t\t\t\t\telse if (Power == 5)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3255;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3256;\n\t\t\t\t\t\t\telse return 3257;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3258;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3259;\n\t\t\t\t\t\t\telse return 3260;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3261;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3262;\n\t\t\t\t\t\t\telse return 3263;\n\t\t\t\t\telse if (Power == 6)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3264;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3265;\n\t\t\t\t\t\t\telse return 3266;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3267;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3268;\n\t\t\t\t\t\t\telse return 3269;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3270;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3271;\n\t\t\t\t\t\t\telse return 3272;\n\t\t\t\t\telse if (Power == 7)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3273;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3274;\n\t\t\t\t\t\t\telse return 3275;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3276;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3277;\n\t\t\t\t\t\t\telse return 3278;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3279;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3280;\n\t\t\t\t\t\t\telse return 3281;\n\t\t\t\t\telse if (Power == 8)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3282;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3283;\n\t\t\t\t\t\t\telse return 3284;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3285;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3286;\n\t\t\t\t\t\t\telse return 3287;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3288;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3289;\n\t\t\t\t\t\t\telse return 3290;\n\t\t\t\t\telse if (Power == 9)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3291;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3292;\n\t\t\t\t\t\t\telse return 3293;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3294;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3295;\n\t\t\t\t\t\t\telse return 3296;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3297;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3298;\n\t\t\t\t\t\t\telse return 3299;\n\t\t\t\t\telse if (Power == 10)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3300;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3301;\n\t\t\t\t\t\t\telse return 3302;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3303;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3304;\n\t\t\t\t\t\t\telse return 3305;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3306;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3307;\n\t\t\t\t\t\t\telse return 3308;\n\t\t\t\t\telse if (Power == 11)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3309;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3310;\n\t\t\t\t\t\t\telse return 3311;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3312;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3313;\n\t\t\t\t\t\t\telse return 3314;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3315;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3316;\n\t\t\t\t\t\t\telse return 3317;\n\t\t\t\t\telse if (Power == 12)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3318;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3319;\n\t\t\t\t\t\t\telse return 3320;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3321;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3322;\n\t\t\t\t\t\t\telse return 3323;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3324;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3325;\n\t\t\t\t\t\t\telse return 3326;\n\t\t\t\t\telse if (Power == 13)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3327;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3328;\n\t\t\t\t\t\t\telse return 3329;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3330;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3331;\n\t\t\t\t\t\t\telse return 3332;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3333;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3334;\n\t\t\t\t\t\t\telse return 3335;\n\t\t\t\t\telse if (Power == 14)\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3336;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3337;\n\t\t\t\t\t\t\telse return 3338;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3339;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3340;\n\t\t\t\t\t\t\telse return 3341;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3342;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3343;\n\t\t\t\t\t\t\telse return 3344;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (South == South::Up)\n\t\t\t\t\t\t\tif (West == West::Up) return 3345;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3346;\n\t\t\t\t\t\t\telse return 3347;\n\t\t\t\t\t\telse if (South == South::Side)\n\t\t\t\t\t\t\tif (West == West::Up) return 3348;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3349;\n\t\t\t\t\t\t\telse return 3350;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::Up) return 3351;\n\t\t\t\t\t\t\telse if (West == West::Side) return 3352;\n\t\t\t\t\t\t\telse return 3353;\n\t\t}\n\t\tBlockState RedstoneWire();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tunsigned char Power(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace Repeater\n\t{\n\t\tconstexpr BlockState Repeater(const unsigned char Delay, const eBlockFace Facing, const bool Locked, const bool Powered)\n\t\t{\n\t\t\tif (Delay == 1)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4031;\n\t\t\t\t\t\telse return 4032;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4033;\n\t\t\t\t\t\telse return 4034;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4035;\n\t\t\t\t\t\telse return 4036;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4037;\n\t\t\t\t\t\telse return 4038;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4039;\n\t\t\t\t\t\telse return 4040;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4041;\n\t\t\t\t\t\telse return 4042;\n\t\t\t\telse\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4043;\n\t\t\t\t\t\telse return 4044;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4045;\n\t\t\t\t\t\telse return 4046;\n\t\t\telse if (Delay == 2)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4047;\n\t\t\t\t\t\telse return 4048;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4049;\n\t\t\t\t\t\telse return 4050;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4051;\n\t\t\t\t\t\telse return 4052;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4053;\n\t\t\t\t\t\telse return 4054;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4055;\n\t\t\t\t\t\telse return 4056;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4057;\n\t\t\t\t\t\telse return 4058;\n\t\t\t\telse\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4059;\n\t\t\t\t\t\telse return 4060;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4061;\n\t\t\t\t\t\telse return 4062;\n\t\t\telse if (Delay == 3)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4063;\n\t\t\t\t\t\telse return 4064;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4065;\n\t\t\t\t\t\telse return 4066;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4067;\n\t\t\t\t\t\telse return 4068;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4069;\n\t\t\t\t\t\telse return 4070;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4071;\n\t\t\t\t\t\telse return 4072;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4073;\n\t\t\t\t\t\telse return 4074;\n\t\t\t\telse\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4075;\n\t\t\t\t\t\telse return 4076;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4077;\n\t\t\t\t\t\telse return 4078;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4079;\n\t\t\t\t\t\telse return 4080;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4081;\n\t\t\t\t\t\telse return 4082;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4083;\n\t\t\t\t\t\telse return 4084;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4085;\n\t\t\t\t\t\telse return 4086;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4087;\n\t\t\t\t\t\telse return 4088;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4089;\n\t\t\t\t\t\telse return 4090;\n\t\t\t\telse\n\t\t\t\t\tif (Locked)\n\t\t\t\t\t\tif (Powered) return 4091;\n\t\t\t\t\t\telse return 4092;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4093;\n\t\t\t\t\t\telse return 4094;\n\t\t}\n\t\tBlockState Repeater();\n\t\tunsigned char Delay(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Locked(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace RepeatingCommandBlock\n\t{\n\t\tconstexpr BlockState RepeatingCommandBlock(const bool Conditional, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Conditional)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9225;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9226;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9227;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9228;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9229;\n\t\t\t\telse return 9230;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9231;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9232;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9233;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9234;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9235;\n\t\t\t\telse return 9236;\n\t\t}\n\t\tBlockState RepeatingCommandBlock();\n\t\tbool Conditional(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace RespawnAnchor\n\t{\n\t\tconstexpr BlockState RespawnAnchor(const unsigned char Charges)\n\t\t{\n\t\t\tif (Charges == 0) return 15829;\n\t\t\telse if (Charges == 1) return 15830;\n\t\t\telse if (Charges == 2) return 15831;\n\t\t\telse if (Charges == 3) return 15832;\n\t\t\telse return 15833;\n\t\t}\n\t\tBlockState RespawnAnchor();\n\t\tunsigned char Charges(BlockState Block);\n\t}\n\tnamespace RoseBush\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tconstexpr BlockState RoseBush(const enum Half Half)\n\t\t{\n\t\t\tif (Half == Half::Upper) return 7889;\n\t\t\telse return 7890;\n\t\t}\n\t\tBlockState RoseBush();\n\t\tenum Half Half(BlockState Block);\n\t}\n\tnamespace Sand\n\t{\n\t\tconstexpr BlockState Sand()\n\t\t{\n\t\t\treturn 66;\n\t\t}\n\t}\n\tnamespace Sandstone\n\t{\n\t\tconstexpr BlockState Sandstone()\n\t\t{\n\t\t\treturn 246;\n\t\t}\n\t}\n\tnamespace SandstoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState SandstoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8349;\n\t\t\telse if (Type == Type::Bottom) return 8351;\n\t\t\telse return 8353;\n\t\t}\n\t\tBlockState SandstoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace SandstoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState SandstoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5171;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5173;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5175;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5177;\n\t\t\t\t\telse return 5179;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5181;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5183;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5185;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5187;\n\t\t\t\t\telse return 5189;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5191;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5193;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5195;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5197;\n\t\t\t\t\telse return 5199;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5201;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5203;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5205;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5207;\n\t\t\t\t\telse return 5209;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5211;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5213;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5215;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5217;\n\t\t\t\t\telse return 5219;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5221;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5223;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5225;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5227;\n\t\t\t\t\telse return 5229;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5231;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5233;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5235;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5237;\n\t\t\t\t\telse return 5239;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5241;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5243;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5245;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5247;\n\t\t\t\t\telse return 5249;\n\t\t}\n\t\tBlockState SandstoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace SandstoneWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState SandstoneWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13786;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13787;\n\t\t\t\t\t\t\telse return 13788;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13792;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13793;\n\t\t\t\t\t\t\telse return 13794;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13798;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13799;\n\t\t\t\t\t\t\telse return 13800;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13804;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13805;\n\t\t\t\t\t\t\telse return 13806;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13810;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13811;\n\t\t\t\t\t\t\telse return 13812;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13816;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13817;\n\t\t\t\t\t\t\telse return 13818;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13822;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13823;\n\t\t\t\t\t\t\telse return 13824;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13828;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13829;\n\t\t\t\t\t\t\telse return 13830;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13834;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13835;\n\t\t\t\t\t\t\telse return 13836;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13840;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13841;\n\t\t\t\t\t\t\telse return 13842;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13846;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13847;\n\t\t\t\t\t\t\telse return 13848;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13852;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13853;\n\t\t\t\t\t\t\telse return 13854;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13858;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13859;\n\t\t\t\t\t\t\telse return 13860;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13864;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13865;\n\t\t\t\t\t\t\telse return 13866;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13870;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13871;\n\t\t\t\t\t\t\telse return 13872;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13876;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13877;\n\t\t\t\t\t\t\telse return 13878;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13882;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13883;\n\t\t\t\t\t\t\telse return 13884;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13888;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13889;\n\t\t\t\t\t\t\telse return 13890;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13894;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13895;\n\t\t\t\t\t\t\telse return 13896;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13900;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13901;\n\t\t\t\t\t\t\telse return 13902;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13906;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13907;\n\t\t\t\t\t\t\telse return 13908;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13912;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13913;\n\t\t\t\t\t\t\telse return 13914;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13918;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13919;\n\t\t\t\t\t\t\telse return 13920;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13924;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13925;\n\t\t\t\t\t\t\telse return 13926;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13930;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13931;\n\t\t\t\t\t\t\telse return 13932;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13936;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13937;\n\t\t\t\t\t\t\telse return 13938;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13942;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13943;\n\t\t\t\t\t\t\telse return 13944;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13948;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13949;\n\t\t\t\t\t\t\telse return 13950;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13954;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13955;\n\t\t\t\t\t\t\telse return 13956;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13960;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13961;\n\t\t\t\t\t\t\telse return 13962;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13966;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13967;\n\t\t\t\t\t\t\telse return 13968;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13972;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13973;\n\t\t\t\t\t\t\telse return 13974;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13978;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13979;\n\t\t\t\t\t\t\telse return 13980;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13984;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13985;\n\t\t\t\t\t\t\telse return 13986;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 13990;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13991;\n\t\t\t\t\t\t\telse return 13992;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 13996;\n\t\t\t\t\t\t\telse if (West == West::Low) return 13997;\n\t\t\t\t\t\t\telse return 13998;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14002;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14003;\n\t\t\t\t\t\t\telse return 14004;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14008;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14009;\n\t\t\t\t\t\t\telse return 14010;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14014;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14015;\n\t\t\t\t\t\t\telse return 14016;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14020;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14021;\n\t\t\t\t\t\t\telse return 14022;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14026;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14027;\n\t\t\t\t\t\t\telse return 14028;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14032;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14033;\n\t\t\t\t\t\t\telse return 14034;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14038;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14039;\n\t\t\t\t\t\t\telse return 14040;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14044;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14045;\n\t\t\t\t\t\t\telse return 14046;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14050;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14051;\n\t\t\t\t\t\t\telse return 14052;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14056;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14057;\n\t\t\t\t\t\t\telse return 14058;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14062;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14063;\n\t\t\t\t\t\t\telse return 14064;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14068;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14069;\n\t\t\t\t\t\t\telse return 14070;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14074;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14075;\n\t\t\t\t\t\t\telse return 14076;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14080;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14081;\n\t\t\t\t\t\t\telse return 14082;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14086;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14087;\n\t\t\t\t\t\t\telse return 14088;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14092;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14093;\n\t\t\t\t\t\t\telse return 14094;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 14098;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14099;\n\t\t\t\t\t\t\telse return 14100;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 14104;\n\t\t\t\t\t\t\telse if (West == West::Low) return 14105;\n\t\t\t\t\t\t\telse return 14106;\n\t\t}\n\t\tBlockState SandstoneWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace Scaffolding\n\t{\n\t\tconstexpr BlockState Scaffolding(const bool Bottom, const unsigned char Distance)\n\t\t{\n\t\t\tif (Bottom)\n\t\t\t\tif (Distance == 0) return 14756;\n\t\t\t\telse if (Distance == 1) return 14758;\n\t\t\t\telse if (Distance == 2) return 14760;\n\t\t\t\telse if (Distance == 3) return 14762;\n\t\t\t\telse if (Distance == 4) return 14764;\n\t\t\t\telse if (Distance == 5) return 14766;\n\t\t\t\telse if (Distance == 6) return 14768;\n\t\t\t\telse return 14770;\n\t\t\telse\n\t\t\t\tif (Distance == 0) return 14772;\n\t\t\t\telse if (Distance == 1) return 14774;\n\t\t\t\telse if (Distance == 2) return 14776;\n\t\t\t\telse if (Distance == 3) return 14778;\n\t\t\t\telse if (Distance == 4) return 14780;\n\t\t\t\telse if (Distance == 5) return 14782;\n\t\t\t\telse if (Distance == 6) return 14784;\n\t\t\t\telse return 14786;\n\t\t}\n\t\tBlockState Scaffolding();\n\t\tbool Bottom(BlockState Block);\n\t\tunsigned char Distance(BlockState Block);\n\t}\n\tnamespace SeaLantern\n\t{\n\t\tconstexpr BlockState SeaLantern()\n\t\t{\n\t\t\treturn 7862;\n\t\t}\n\t}\n\tnamespace SeaPickle\n\t{\n\t\tconstexpr BlockState SeaPickle(const unsigned char Pickles)\n\t\t{\n\t\t\tif (Pickles == 1) return 9641;\n\t\t\telse if (Pickles == 2) return 9643;\n\t\t\telse if (Pickles == 3) return 9645;\n\t\t\telse return 9647;\n\t\t}\n\t\tBlockState SeaPickle();\n\t\tunsigned char Pickles(BlockState Block);\n\t}\n\tnamespace Seagrass\n\t{\n\t\tconstexpr BlockState Seagrass()\n\t\t{\n\t\t\treturn 1345;\n\t\t}\n\t}\n\tnamespace Shroomlight\n\t{\n\t\tconstexpr BlockState Shroomlight()\n\t\t{\n\t\t\treturn 14989;\n\t\t}\n\t}\n\tnamespace ShulkerBox\n\t{\n\t\tconstexpr BlockState ShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9272;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9273;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9274;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9275;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9276;\n\t\t\telse return 9277;\n\t\t}\n\t\tBlockState ShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace SkeletonSkull\n\t{\n\t\tconstexpr BlockState SkeletonSkull(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 6490;\n\t\t\telse if (Rotation == 1) return 6491;\n\t\t\telse if (Rotation == 2) return 6492;\n\t\t\telse if (Rotation == 3) return 6493;\n\t\t\telse if (Rotation == 4) return 6494;\n\t\t\telse if (Rotation == 5) return 6495;\n\t\t\telse if (Rotation == 6) return 6496;\n\t\t\telse if (Rotation == 7) return 6497;\n\t\t\telse if (Rotation == 8) return 6498;\n\t\t\telse if (Rotation == 9) return 6499;\n\t\t\telse if (Rotation == 10) return 6500;\n\t\t\telse if (Rotation == 11) return 6501;\n\t\t\telse if (Rotation == 12) return 6502;\n\t\t\telse if (Rotation == 13) return 6503;\n\t\t\telse if (Rotation == 14) return 6504;\n\t\t\telse return 6505;\n\t\t}\n\t\tBlockState SkeletonSkull();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace SkeletonWallSkull\n\t{\n\t\tconstexpr BlockState SkeletonWallSkull(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6506;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6507;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6508;\n\t\t\telse return 6509;\n\t\t}\n\t\tBlockState SkeletonWallSkull();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace SlimeBlock\n\t{\n\t\tconstexpr BlockState SlimeBlock()\n\t\t{\n\t\t\treturn 7535;\n\t\t}\n\t}\n\tnamespace SmithingTable\n\t{\n\t\tconstexpr BlockState SmithingTable()\n\t\t{\n\t\t\treturn 14849;\n\t\t}\n\t}\n\tnamespace Smoker\n\t{\n\t\tconstexpr BlockState Smoker(const eBlockFace Facing, const bool Lit)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Lit) return 14803;\n\t\t\t\telse return 14804;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Lit) return 14805;\n\t\t\t\telse return 14806;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Lit) return 14807;\n\t\t\t\telse return 14808;\n\t\t\telse\n\t\t\t\tif (Lit) return 14809;\n\t\t\t\telse return 14810;\n\t\t}\n\t\tBlockState Smoker();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Lit(BlockState Block);\n\t}\n\tnamespace SmoothQuartz\n\t{\n\t\tconstexpr BlockState SmoothQuartz()\n\t\t{\n\t\t\treturn 8416;\n\t\t}\n\t}\n\tnamespace SmoothQuartzSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState SmoothQuartzSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10832;\n\t\t\telse if (Type == Type::Bottom) return 10834;\n\t\t\telse return 10836;\n\t\t}\n\t\tBlockState SmoothQuartzSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace SmoothQuartzStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState SmoothQuartzStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10310;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10312;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10314;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10316;\n\t\t\t\t\telse return 10318;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10320;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10322;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10324;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10326;\n\t\t\t\t\telse return 10328;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10330;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10332;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10334;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10336;\n\t\t\t\t\telse return 10338;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10340;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10342;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10344;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10346;\n\t\t\t\t\telse return 10348;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10350;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10352;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10354;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10356;\n\t\t\t\t\telse return 10358;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10360;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10362;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10364;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10366;\n\t\t\t\t\telse return 10368;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10370;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10372;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10374;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10376;\n\t\t\t\t\telse return 10378;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10380;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10382;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10384;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10386;\n\t\t\t\t\telse return 10388;\n\t\t}\n\t\tBlockState SmoothQuartzStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace SmoothRedSandstone\n\t{\n\t\tconstexpr BlockState SmoothRedSandstone()\n\t\t{\n\t\t\treturn 8417;\n\t\t}\n\t}\n\tnamespace SmoothRedSandstoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState SmoothRedSandstoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10796;\n\t\t\telse if (Type == Type::Bottom) return 10798;\n\t\t\telse return 10800;\n\t\t}\n\t\tBlockState SmoothRedSandstoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace SmoothRedSandstoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState SmoothRedSandstoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9750;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9752;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9754;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9756;\n\t\t\t\t\telse return 9758;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9760;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9762;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9764;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9766;\n\t\t\t\t\telse return 9768;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9770;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9772;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9774;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9776;\n\t\t\t\t\telse return 9778;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9780;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9782;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9784;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9786;\n\t\t\t\t\telse return 9788;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9790;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9792;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9794;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9796;\n\t\t\t\t\telse return 9798;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9800;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9802;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9804;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9806;\n\t\t\t\t\telse return 9808;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 9810;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9812;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9814;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9816;\n\t\t\t\t\telse return 9818;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 9820;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 9822;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 9824;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 9826;\n\t\t\t\t\telse return 9828;\n\t\t}\n\t\tBlockState SmoothRedSandstoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace SmoothSandstone\n\t{\n\t\tconstexpr BlockState SmoothSandstone()\n\t\t{\n\t\t\treturn 8415;\n\t\t}\n\t}\n\tnamespace SmoothSandstoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState SmoothSandstoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 10826;\n\t\t\telse if (Type == Type::Bottom) return 10828;\n\t\t\telse return 10830;\n\t\t}\n\t\tBlockState SmoothSandstoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace SmoothSandstoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState SmoothSandstoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10230;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10232;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10234;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10236;\n\t\t\t\t\telse return 10238;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10240;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10242;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10244;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10246;\n\t\t\t\t\telse return 10248;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10250;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10252;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10254;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10256;\n\t\t\t\t\telse return 10258;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10260;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10262;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10264;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10266;\n\t\t\t\t\telse return 10268;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10270;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10272;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10274;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10276;\n\t\t\t\t\telse return 10278;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10280;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10282;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10284;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10286;\n\t\t\t\t\telse return 10288;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10290;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10292;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10294;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10296;\n\t\t\t\t\telse return 10298;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10300;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10302;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10304;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10306;\n\t\t\t\t\telse return 10308;\n\t\t}\n\t\tBlockState SmoothSandstoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace SmoothStone\n\t{\n\t\tconstexpr BlockState SmoothStone()\n\t\t{\n\t\t\treturn 8414;\n\t\t}\n\t}\n\tnamespace SmoothStoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState SmoothStoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8343;\n\t\t\telse if (Type == Type::Bottom) return 8345;\n\t\t\telse return 8347;\n\t\t}\n\t\tBlockState SmoothStoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace Snow\n\t{\n\t\tconstexpr BlockState Snow(const unsigned char Layers)\n\t\t{\n\t\t\tif (Layers == 1) return 3921;\n\t\t\telse if (Layers == 2) return 3922;\n\t\t\telse if (Layers == 3) return 3923;\n\t\t\telse if (Layers == 4) return 3924;\n\t\t\telse if (Layers == 5) return 3925;\n\t\t\telse if (Layers == 6) return 3926;\n\t\t\telse if (Layers == 7) return 3927;\n\t\t\telse return 3928;\n\t\t}\n\t\tBlockState Snow();\n\t\tunsigned char Layers(BlockState Block);\n\t}\n\tnamespace SnowBlock\n\t{\n\t\tconstexpr BlockState SnowBlock()\n\t\t{\n\t\t\treturn 3930;\n\t\t}\n\t}\n\tnamespace SoulCampfire\n\t{\n\t\tconstexpr BlockState SoulCampfire(const eBlockFace Facing, const bool Lit, const bool SignalFire)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Lit)\n\t\t\t\t\tif (SignalFire) return 14923;\n\t\t\t\t\telse return 14925;\n\t\t\t\telse\n\t\t\t\t\tif (SignalFire) return 14927;\n\t\t\t\t\telse return 14929;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Lit)\n\t\t\t\t\tif (SignalFire) return 14931;\n\t\t\t\t\telse return 14933;\n\t\t\t\telse\n\t\t\t\t\tif (SignalFire) return 14935;\n\t\t\t\t\telse return 14937;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Lit)\n\t\t\t\t\tif (SignalFire) return 14939;\n\t\t\t\t\telse return 14941;\n\t\t\t\telse\n\t\t\t\t\tif (SignalFire) return 14943;\n\t\t\t\t\telse return 14945;\n\t\t\telse\n\t\t\t\tif (Lit)\n\t\t\t\t\tif (SignalFire) return 14947;\n\t\t\t\t\telse return 14949;\n\t\t\t\telse\n\t\t\t\t\tif (SignalFire) return 14951;\n\t\t\t\t\telse return 14953;\n\t\t}\n\t\tBlockState SoulCampfire();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Lit(BlockState Block);\n\t\tbool SignalFire(BlockState Block);\n\t}\n\tnamespace SoulFire\n\t{\n\t\tconstexpr BlockState SoulFire()\n\t\t{\n\t\t\treturn 1952;\n\t\t}\n\t}\n\tnamespace SoulLantern\n\t{\n\t\tconstexpr BlockState SoulLantern(const bool Hanging)\n\t\t{\n\t\t\tif (Hanging) return 14888;\n\t\t\telse return 14889;\n\t\t}\n\t\tBlockState SoulLantern();\n\t\tbool Hanging(BlockState Block);\n\t}\n\tnamespace SoulSand\n\t{\n\t\tconstexpr BlockState SoulSand()\n\t\t{\n\t\t\treturn 4000;\n\t\t}\n\t}\n\tnamespace SoulSoil\n\t{\n\t\tconstexpr BlockState SoulSoil()\n\t\t{\n\t\t\treturn 4001;\n\t\t}\n\t}\n\tnamespace SoulTorch\n\t{\n\t\tconstexpr BlockState SoulTorch()\n\t\t{\n\t\t\treturn 4008;\n\t\t}\n\t}\n\tnamespace SoulWallTorch\n\t{\n\t\tconstexpr BlockState SoulWallTorch(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 4009;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 4010;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 4011;\n\t\t\telse return 4012;\n\t\t}\n\t\tBlockState SoulWallTorch();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Spawner\n\t{\n\t\tconstexpr BlockState Spawner()\n\t\t{\n\t\t\treturn 1953;\n\t\t}\n\t}\n\tnamespace Sponge\n\t{\n\t\tconstexpr BlockState Sponge()\n\t\t{\n\t\t\treturn 229;\n\t\t}\n\t}\n\tnamespace SpruceButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState SpruceButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6370;\n\t\t\t\t\telse return 6371;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6372;\n\t\t\t\t\telse return 6373;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6374;\n\t\t\t\t\telse return 6375;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6376;\n\t\t\t\t\telse return 6377;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6378;\n\t\t\t\t\telse return 6379;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6380;\n\t\t\t\t\telse return 6381;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6382;\n\t\t\t\t\telse return 6383;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6384;\n\t\t\t\t\telse return 6385;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 6386;\n\t\t\t\t\telse return 6387;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 6388;\n\t\t\t\t\telse return 6389;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 6390;\n\t\t\t\t\telse return 6391;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 6392;\n\t\t\t\t\telse return 6393;\n\t\t}\n\t\tBlockState SpruceButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace SpruceDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState SpruceDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8738;\n\t\t\t\t\t\t\telse return 8739;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8740;\n\t\t\t\t\t\t\telse return 8741;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8742;\n\t\t\t\t\t\t\telse return 8743;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8744;\n\t\t\t\t\t\t\telse return 8745;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8746;\n\t\t\t\t\t\t\telse return 8747;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8748;\n\t\t\t\t\t\t\telse return 8749;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8750;\n\t\t\t\t\t\t\telse return 8751;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8752;\n\t\t\t\t\t\t\telse return 8753;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8754;\n\t\t\t\t\t\t\telse return 8755;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8756;\n\t\t\t\t\t\t\telse return 8757;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8758;\n\t\t\t\t\t\t\telse return 8759;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8760;\n\t\t\t\t\t\t\telse return 8761;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8762;\n\t\t\t\t\t\t\telse return 8763;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8764;\n\t\t\t\t\t\t\telse return 8765;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8766;\n\t\t\t\t\t\t\telse return 8767;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8768;\n\t\t\t\t\t\t\telse return 8769;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8770;\n\t\t\t\t\t\t\telse return 8771;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8772;\n\t\t\t\t\t\t\telse return 8773;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8774;\n\t\t\t\t\t\t\telse return 8775;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8776;\n\t\t\t\t\t\t\telse return 8777;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8778;\n\t\t\t\t\t\t\telse return 8779;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8780;\n\t\t\t\t\t\t\telse return 8781;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8782;\n\t\t\t\t\t\t\telse return 8783;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8784;\n\t\t\t\t\t\t\telse return 8785;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8786;\n\t\t\t\t\t\t\telse return 8787;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8788;\n\t\t\t\t\t\t\telse return 8789;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8790;\n\t\t\t\t\t\t\telse return 8791;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8792;\n\t\t\t\t\t\t\telse return 8793;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8794;\n\t\t\t\t\t\t\telse return 8795;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8796;\n\t\t\t\t\t\t\telse return 8797;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 8798;\n\t\t\t\t\t\t\telse return 8799;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 8800;\n\t\t\t\t\t\t\telse return 8801;\n\t\t}\n\t\tBlockState SpruceDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace SpruceFence\n\t{\n\t\tconstexpr BlockState SpruceFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8580;\n\t\t\t\t\t\telse return 8581;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8584;\n\t\t\t\t\t\telse return 8585;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8588;\n\t\t\t\t\t\telse return 8589;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8592;\n\t\t\t\t\t\telse return 8593;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8596;\n\t\t\t\t\t\telse return 8597;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8600;\n\t\t\t\t\t\telse return 8601;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 8604;\n\t\t\t\t\t\telse return 8605;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 8608;\n\t\t\t\t\t\telse return 8609;\n\t\t}\n\t\tBlockState SpruceFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace SpruceFenceGate\n\t{\n\t\tconstexpr BlockState SpruceFenceGate(const eBlockFace Facing, const bool InWall, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8418;\n\t\t\t\t\t\telse return 8419;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8420;\n\t\t\t\t\t\telse return 8421;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8422;\n\t\t\t\t\t\telse return 8423;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8424;\n\t\t\t\t\t\telse return 8425;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8426;\n\t\t\t\t\t\telse return 8427;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8428;\n\t\t\t\t\t\telse return 8429;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8430;\n\t\t\t\t\t\telse return 8431;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8432;\n\t\t\t\t\t\telse return 8433;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8434;\n\t\t\t\t\t\telse return 8435;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8436;\n\t\t\t\t\t\telse return 8437;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8438;\n\t\t\t\t\t\telse return 8439;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8440;\n\t\t\t\t\t\telse return 8441;\n\t\t\telse\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8442;\n\t\t\t\t\t\telse return 8443;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8444;\n\t\t\t\t\t\telse return 8445;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 8446;\n\t\t\t\t\t\telse return 8447;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 8448;\n\t\t\t\t\t\telse return 8449;\n\t\t}\n\t\tBlockState SpruceFenceGate();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool InWall(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace SpruceLeaves\n\t{\n\t\tconstexpr BlockState SpruceLeaves(const unsigned char Distance, const bool Persistent)\n\t\t{\n\t\t\tif (Distance == 1)\n\t\t\t\tif (Persistent) return 159;\n\t\t\t\telse return 160;\n\t\t\telse if (Distance == 2)\n\t\t\t\tif (Persistent) return 161;\n\t\t\t\telse return 162;\n\t\t\telse if (Distance == 3)\n\t\t\t\tif (Persistent) return 163;\n\t\t\t\telse return 164;\n\t\t\telse if (Distance == 4)\n\t\t\t\tif (Persistent) return 165;\n\t\t\t\telse return 166;\n\t\t\telse if (Distance == 5)\n\t\t\t\tif (Persistent) return 167;\n\t\t\t\telse return 168;\n\t\t\telse if (Distance == 6)\n\t\t\t\tif (Persistent) return 169;\n\t\t\t\telse return 170;\n\t\t\telse\n\t\t\t\tif (Persistent) return 171;\n\t\t\t\telse return 172;\n\t\t}\n\t\tBlockState SpruceLeaves();\n\t\tunsigned char Distance(BlockState Block);\n\t\tbool Persistent(BlockState Block);\n\t}\n\tnamespace SpruceLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState SpruceLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 76;\n\t\t\telse if (Axis == Axis::Y) return 77;\n\t\t\telse return 78;\n\t\t}\n\t\tBlockState SpruceLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace SprucePlanks\n\t{\n\t\tconstexpr BlockState SprucePlanks()\n\t\t{\n\t\t\treturn 16;\n\t\t}\n\t}\n\tnamespace SprucePressurePlate\n\t{\n\t\tconstexpr BlockState SprucePressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 3875;\n\t\t\telse return 3876;\n\t\t}\n\t\tBlockState SprucePressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace SpruceSapling\n\t{\n\t\tconstexpr BlockState SpruceSapling(const unsigned char Stage)\n\t\t{\n\t\t\tif (Stage == 0) return 23;\n\t\t\telse return 24;\n\t\t}\n\t\tBlockState SpruceSapling();\n\t\tunsigned char Stage(BlockState Block);\n\t}\n\tnamespace SpruceSign\n\t{\n\t\tconstexpr BlockState SpruceSign(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 3414;\n\t\t\telse if (Rotation == 1) return 3416;\n\t\t\telse if (Rotation == 2) return 3418;\n\t\t\telse if (Rotation == 3) return 3420;\n\t\t\telse if (Rotation == 4) return 3422;\n\t\t\telse if (Rotation == 5) return 3424;\n\t\t\telse if (Rotation == 6) return 3426;\n\t\t\telse if (Rotation == 7) return 3428;\n\t\t\telse if (Rotation == 8) return 3430;\n\t\t\telse if (Rotation == 9) return 3432;\n\t\t\telse if (Rotation == 10) return 3434;\n\t\t\telse if (Rotation == 11) return 3436;\n\t\t\telse if (Rotation == 12) return 3438;\n\t\t\telse if (Rotation == 13) return 3440;\n\t\t\telse if (Rotation == 14) return 3442;\n\t\t\telse return 3444;\n\t\t}\n\t\tBlockState SpruceSign();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace SpruceSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState SpruceSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8307;\n\t\t\telse if (Type == Type::Bottom) return 8309;\n\t\t\telse return 8311;\n\t\t}\n\t\tBlockState SpruceSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace SpruceStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState SpruceStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5405;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5407;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5409;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5411;\n\t\t\t\t\telse return 5413;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5415;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5417;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5419;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5421;\n\t\t\t\t\telse return 5423;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5425;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5427;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5429;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5431;\n\t\t\t\t\telse return 5433;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5435;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5437;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5439;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5441;\n\t\t\t\t\telse return 5443;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5445;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5447;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5449;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5451;\n\t\t\t\t\telse return 5453;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5455;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5457;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5459;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5461;\n\t\t\t\t\telse return 5463;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 5465;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5467;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5469;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5471;\n\t\t\t\t\telse return 5473;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5475;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5477;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5479;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5481;\n\t\t\t\t\telse return 5483;\n\t\t}\n\t\tBlockState SpruceStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace SpruceTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState SpruceTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4176;\n\t\t\t\t\t\telse return 4178;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4180;\n\t\t\t\t\t\telse return 4182;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4184;\n\t\t\t\t\t\telse return 4186;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4188;\n\t\t\t\t\t\telse return 4190;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4192;\n\t\t\t\t\t\telse return 4194;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4196;\n\t\t\t\t\t\telse return 4198;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4200;\n\t\t\t\t\t\telse return 4202;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4204;\n\t\t\t\t\t\telse return 4206;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4208;\n\t\t\t\t\t\telse return 4210;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4212;\n\t\t\t\t\t\telse return 4214;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4216;\n\t\t\t\t\t\telse return 4218;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4220;\n\t\t\t\t\t\telse return 4222;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4224;\n\t\t\t\t\t\telse return 4226;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4228;\n\t\t\t\t\t\telse return 4230;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 4232;\n\t\t\t\t\t\telse return 4234;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 4236;\n\t\t\t\t\t\telse return 4238;\n\t\t}\n\t\tBlockState SpruceTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace SpruceWallSign\n\t{\n\t\tconstexpr BlockState SpruceWallSign(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 3744;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 3746;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 3748;\n\t\t\telse return 3750;\n\t\t}\n\t\tBlockState SpruceWallSign();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace SpruceWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState SpruceWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 112;\n\t\t\telse if (Axis == Axis::Y) return 113;\n\t\t\telse return 114;\n\t\t}\n\t\tBlockState SpruceWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StickyPiston\n\t{\n\t\tconstexpr BlockState StickyPiston(const bool Extended, const eBlockFace Facing)\n\t\t{\n\t\t\tif (Extended)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 1329;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 1330;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 1331;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 1332;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 1333;\n\t\t\t\telse return 1334;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 1335;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 1336;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 1337;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 1338;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 1339;\n\t\t\t\telse return 1340;\n\t\t}\n\t\tBlockState StickyPiston();\n\t\tbool Extended(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace Stone\n\t{\n\t\tconstexpr BlockState Stone()\n\t\t{\n\t\t\treturn 1;\n\t\t}\n\t}\n\tnamespace StoneBrickSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState StoneBrickSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8379;\n\t\t\telse if (Type == Type::Bottom) return 8381;\n\t\t\telse return 8383;\n\t\t}\n\t\tBlockState StoneBrickSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace StoneBrickStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState StoneBrickStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 4933;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4935;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4937;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4939;\n\t\t\t\t\telse return 4941;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 4943;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4945;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4947;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4949;\n\t\t\t\t\telse return 4951;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 4953;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4955;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4957;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4959;\n\t\t\t\t\telse return 4961;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 4963;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4965;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4967;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4969;\n\t\t\t\t\telse return 4971;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 4973;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4975;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4977;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4979;\n\t\t\t\t\telse return 4981;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 4983;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4985;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4987;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4989;\n\t\t\t\t\telse return 4991;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 4993;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 4995;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 4997;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 4999;\n\t\t\t\t\telse return 5001;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 5003;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 5005;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 5007;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 5009;\n\t\t\t\t\telse return 5011;\n\t\t}\n\t\tBlockState StoneBrickStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace StoneBrickWall\n\t{\n\t\tenum class East\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class North\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class South\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tenum class West\n\t\t{\n\t\t\tNone,\n\t\t\tLow,\n\t\t\tTall\n\t\t};\n\t\tconstexpr BlockState StoneBrickWall(const enum East East, const enum North North, const enum South South, const bool Up, const enum West West)\n\t\t{\n\t\t\tif (East == East::None)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12490;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12491;\n\t\t\t\t\t\t\telse return 12492;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12496;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12497;\n\t\t\t\t\t\t\telse return 12498;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12502;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12503;\n\t\t\t\t\t\t\telse return 12504;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12508;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12509;\n\t\t\t\t\t\t\telse return 12510;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12514;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12515;\n\t\t\t\t\t\t\telse return 12516;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12520;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12521;\n\t\t\t\t\t\t\telse return 12522;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12526;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12527;\n\t\t\t\t\t\t\telse return 12528;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12532;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12533;\n\t\t\t\t\t\t\telse return 12534;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12538;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12539;\n\t\t\t\t\t\t\telse return 12540;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12544;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12545;\n\t\t\t\t\t\t\telse return 12546;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12550;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12551;\n\t\t\t\t\t\t\telse return 12552;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12556;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12557;\n\t\t\t\t\t\t\telse return 12558;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12562;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12563;\n\t\t\t\t\t\t\telse return 12564;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12568;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12569;\n\t\t\t\t\t\t\telse return 12570;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12574;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12575;\n\t\t\t\t\t\t\telse return 12576;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12580;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12581;\n\t\t\t\t\t\t\telse return 12582;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12586;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12587;\n\t\t\t\t\t\t\telse return 12588;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12592;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12593;\n\t\t\t\t\t\t\telse return 12594;\n\t\t\telse if (East == East::Low)\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12598;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12599;\n\t\t\t\t\t\t\telse return 12600;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12604;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12605;\n\t\t\t\t\t\t\telse return 12606;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12610;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12611;\n\t\t\t\t\t\t\telse return 12612;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12616;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12617;\n\t\t\t\t\t\t\telse return 12618;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12622;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12623;\n\t\t\t\t\t\t\telse return 12624;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12628;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12629;\n\t\t\t\t\t\t\telse return 12630;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12634;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12635;\n\t\t\t\t\t\t\telse return 12636;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12640;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12641;\n\t\t\t\t\t\t\telse return 12642;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12646;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12647;\n\t\t\t\t\t\t\telse return 12648;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12652;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12653;\n\t\t\t\t\t\t\telse return 12654;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12658;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12659;\n\t\t\t\t\t\t\telse return 12660;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12664;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12665;\n\t\t\t\t\t\t\telse return 12666;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12670;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12671;\n\t\t\t\t\t\t\telse return 12672;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12676;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12677;\n\t\t\t\t\t\t\telse return 12678;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12682;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12683;\n\t\t\t\t\t\t\telse return 12684;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12688;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12689;\n\t\t\t\t\t\t\telse return 12690;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12694;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12695;\n\t\t\t\t\t\t\telse return 12696;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12700;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12701;\n\t\t\t\t\t\t\telse return 12702;\n\t\t\telse\n\t\t\t\tif (North == North::None)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12706;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12707;\n\t\t\t\t\t\t\telse return 12708;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12712;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12713;\n\t\t\t\t\t\t\telse return 12714;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12718;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12719;\n\t\t\t\t\t\t\telse return 12720;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12724;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12725;\n\t\t\t\t\t\t\telse return 12726;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12730;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12731;\n\t\t\t\t\t\t\telse return 12732;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12736;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12737;\n\t\t\t\t\t\t\telse return 12738;\n\t\t\t\telse if (North == North::Low)\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12742;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12743;\n\t\t\t\t\t\t\telse return 12744;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12748;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12749;\n\t\t\t\t\t\t\telse return 12750;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12754;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12755;\n\t\t\t\t\t\t\telse return 12756;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12760;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12761;\n\t\t\t\t\t\t\telse return 12762;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12766;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12767;\n\t\t\t\t\t\t\telse return 12768;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12772;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12773;\n\t\t\t\t\t\t\telse return 12774;\n\t\t\t\telse\n\t\t\t\t\tif (South == South::None)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12778;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12779;\n\t\t\t\t\t\t\telse return 12780;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12784;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12785;\n\t\t\t\t\t\t\telse return 12786;\n\t\t\t\t\telse if (South == South::Low)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12790;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12791;\n\t\t\t\t\t\t\telse return 12792;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12796;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12797;\n\t\t\t\t\t\t\telse return 12798;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West == West::None) return 12802;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12803;\n\t\t\t\t\t\t\telse return 12804;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West == West::None) return 12808;\n\t\t\t\t\t\t\telse if (West == West::Low) return 12809;\n\t\t\t\t\t\t\telse return 12810;\n\t\t}\n\t\tBlockState StoneBrickWall();\n\t\tenum East East(BlockState Block);\n\t\tenum North North(BlockState Block);\n\t\tenum South South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tenum West West(BlockState Block);\n\t}\n\tnamespace StoneBricks\n\t{\n\t\tconstexpr BlockState StoneBricks()\n\t\t{\n\t\t\treturn 4495;\n\t\t}\n\t}\n\tnamespace StoneButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState StoneButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 3897;\n\t\t\t\t\telse return 3898;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 3899;\n\t\t\t\t\telse return 3900;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 3901;\n\t\t\t\t\telse return 3902;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 3903;\n\t\t\t\t\telse return 3904;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 3905;\n\t\t\t\t\telse return 3906;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 3907;\n\t\t\t\t\telse return 3908;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 3909;\n\t\t\t\t\telse return 3910;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 3911;\n\t\t\t\t\telse return 3912;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 3913;\n\t\t\t\t\telse return 3914;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 3915;\n\t\t\t\t\telse return 3916;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 3917;\n\t\t\t\t\telse return 3918;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 3919;\n\t\t\t\t\telse return 3920;\n\t\t}\n\t\tBlockState StoneButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace StonePressurePlate\n\t{\n\t\tconstexpr BlockState StonePressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 3807;\n\t\t\telse return 3808;\n\t\t}\n\t\tBlockState StonePressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace StoneSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState StoneSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 8337;\n\t\t\telse if (Type == Type::Bottom) return 8339;\n\t\t\telse return 8341;\n\t\t}\n\t\tBlockState StoneSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace StoneStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState StoneStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10150;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10152;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10154;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10156;\n\t\t\t\t\telse return 10158;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10160;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10162;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10164;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10166;\n\t\t\t\t\telse return 10168;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10170;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10172;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10174;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10176;\n\t\t\t\t\telse return 10178;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10180;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10182;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10184;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10186;\n\t\t\t\t\telse return 10188;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10190;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10192;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10194;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10196;\n\t\t\t\t\telse return 10198;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10200;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10202;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10204;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10206;\n\t\t\t\t\telse return 10208;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 10210;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10212;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10214;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10216;\n\t\t\t\t\telse return 10218;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 10220;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 10222;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 10224;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 10226;\n\t\t\t\t\telse return 10228;\n\t\t}\n\t\tBlockState StoneStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace Stonecutter\n\t{\n\t\tconstexpr BlockState Stonecutter(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 14850;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 14851;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 14852;\n\t\t\telse return 14853;\n\t\t}\n\t\tBlockState Stonecutter();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace StrippedAcaciaLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedAcaciaLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 100;\n\t\t\telse if (Axis == Axis::Y) return 101;\n\t\t\telse return 102;\n\t\t}\n\t\tBlockState StrippedAcaciaLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedAcaciaWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedAcaciaWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 139;\n\t\t\telse if (Axis == Axis::Y) return 140;\n\t\t\telse return 141;\n\t\t}\n\t\tBlockState StrippedAcaciaWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedBirchLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedBirchLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 94;\n\t\t\telse if (Axis == Axis::Y) return 95;\n\t\t\telse return 96;\n\t\t}\n\t\tBlockState StrippedBirchLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedBirchWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedBirchWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 133;\n\t\t\telse if (Axis == Axis::Y) return 134;\n\t\t\telse return 135;\n\t\t}\n\t\tBlockState StrippedBirchWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedCrimsonHyphae\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedCrimsonHyphae(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 14984;\n\t\t\telse if (Axis == Axis::Y) return 14985;\n\t\t\telse return 14986;\n\t\t}\n\t\tBlockState StrippedCrimsonHyphae();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedCrimsonStem\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedCrimsonStem(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 14978;\n\t\t\telse if (Axis == Axis::Y) return 14979;\n\t\t\telse return 14980;\n\t\t}\n\t\tBlockState StrippedCrimsonStem();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedDarkOakLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedDarkOakLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 103;\n\t\t\telse if (Axis == Axis::Y) return 104;\n\t\t\telse return 105;\n\t\t}\n\t\tBlockState StrippedDarkOakLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedDarkOakWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedDarkOakWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 142;\n\t\t\telse if (Axis == Axis::Y) return 143;\n\t\t\telse return 144;\n\t\t}\n\t\tBlockState StrippedDarkOakWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedJungleLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedJungleLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 97;\n\t\t\telse if (Axis == Axis::Y) return 98;\n\t\t\telse return 99;\n\t\t}\n\t\tBlockState StrippedJungleLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedJungleWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedJungleWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 136;\n\t\t\telse if (Axis == Axis::Y) return 137;\n\t\t\telse return 138;\n\t\t}\n\t\tBlockState StrippedJungleWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedOakLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedOakLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 106;\n\t\t\telse if (Axis == Axis::Y) return 107;\n\t\t\telse return 108;\n\t\t}\n\t\tBlockState StrippedOakLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedOakWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedOakWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 127;\n\t\t\telse if (Axis == Axis::Y) return 128;\n\t\t\telse return 129;\n\t\t}\n\t\tBlockState StrippedOakWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedSpruceLog\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedSpruceLog(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 91;\n\t\t\telse if (Axis == Axis::Y) return 92;\n\t\t\telse return 93;\n\t\t}\n\t\tBlockState StrippedSpruceLog();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedSpruceWood\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedSpruceWood(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 130;\n\t\t\telse if (Axis == Axis::Y) return 131;\n\t\t\telse return 132;\n\t\t}\n\t\tBlockState StrippedSpruceWood();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedWarpedHyphae\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedWarpedHyphae(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 14967;\n\t\t\telse if (Axis == Axis::Y) return 14968;\n\t\t\telse return 14969;\n\t\t}\n\t\tBlockState StrippedWarpedHyphae();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StrippedWarpedStem\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState StrippedWarpedStem(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 14961;\n\t\t\telse if (Axis == Axis::Y) return 14962;\n\t\t\telse return 14963;\n\t\t}\n\t\tBlockState StrippedWarpedStem();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace StructureBlock\n\t{\n\t\tenum class Mode\n\t\t{\n\t\t\tSave,\n\t\t\tLoad,\n\t\t\tCorner,\n\t\t\tData\n\t\t};\n\t\tconstexpr BlockState StructureBlock(const enum Mode Mode)\n\t\t{\n\t\t\tif (Mode == Mode::Save) return 15735;\n\t\t\telse if (Mode == Mode::Load) return 15736;\n\t\t\telse if (Mode == Mode::Corner) return 15737;\n\t\t\telse return 15738;\n\t\t}\n\t\tBlockState StructureBlock();\n\t\tenum Mode Mode(BlockState Block);\n\t}\n\tnamespace StructureVoid\n\t{\n\t\tconstexpr BlockState StructureVoid()\n\t\t{\n\t\t\treturn 9259;\n\t\t}\n\t}\n\tnamespace SugarCane\n\t{\n\t\tconstexpr BlockState SugarCane(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 3948;\n\t\t\telse if (Age == 1) return 3949;\n\t\t\telse if (Age == 2) return 3950;\n\t\t\telse if (Age == 3) return 3951;\n\t\t\telse if (Age == 4) return 3952;\n\t\t\telse if (Age == 5) return 3953;\n\t\t\telse if (Age == 6) return 3954;\n\t\t\telse if (Age == 7) return 3955;\n\t\t\telse if (Age == 8) return 3956;\n\t\t\telse if (Age == 9) return 3957;\n\t\t\telse if (Age == 10) return 3958;\n\t\t\telse if (Age == 11) return 3959;\n\t\t\telse if (Age == 12) return 3960;\n\t\t\telse if (Age == 13) return 3961;\n\t\t\telse if (Age == 14) return 3962;\n\t\t\telse return 3963;\n\t\t}\n\t\tBlockState SugarCane();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace Sunflower\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tconstexpr BlockState Sunflower(const enum Half Half)\n\t\t{\n\t\t\tif (Half == Half::Upper) return 7885;\n\t\t\telse return 7886;\n\t\t}\n\t\tBlockState Sunflower();\n\t\tenum Half Half(BlockState Block);\n\t}\n\tnamespace SweetBerryBush\n\t{\n\t\tconstexpr BlockState SweetBerryBush(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 14954;\n\t\t\telse if (Age == 1) return 14955;\n\t\t\telse if (Age == 2) return 14956;\n\t\t\telse return 14957;\n\t\t}\n\t\tBlockState SweetBerryBush();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace TNT\n\t{\n\t\tconstexpr BlockState TNT(const bool Unstable)\n\t\t{\n\t\t\tif (Unstable) return 1430;\n\t\t\telse return 1431;\n\t\t}\n\t\tBlockState TNT();\n\t\tbool Unstable(BlockState Block);\n\t}\n\tnamespace TallGrass\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tconstexpr BlockState TallGrass(const enum Half Half)\n\t\t{\n\t\t\tif (Half == Half::Upper) return 7893;\n\t\t\telse return 7894;\n\t\t}\n\t\tBlockState TallGrass();\n\t\tenum Half Half(BlockState Block);\n\t}\n\tnamespace TallSeagrass\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tconstexpr BlockState TallSeagrass(const enum Half Half)\n\t\t{\n\t\t\tif (Half == Half::Upper) return 1346;\n\t\t\telse return 1347;\n\t\t}\n\t\tBlockState TallSeagrass();\n\t\tenum Half Half(BlockState Block);\n\t}\n\tnamespace Target\n\t{\n\t\tconstexpr BlockState Target(const unsigned char Power)\n\t\t{\n\t\t\tif (Power == 0) return 15760;\n\t\t\telse if (Power == 1) return 15761;\n\t\t\telse if (Power == 2) return 15762;\n\t\t\telse if (Power == 3) return 15763;\n\t\t\telse if (Power == 4) return 15764;\n\t\t\telse if (Power == 5) return 15765;\n\t\t\telse if (Power == 6) return 15766;\n\t\t\telse if (Power == 7) return 15767;\n\t\t\telse if (Power == 8) return 15768;\n\t\t\telse if (Power == 9) return 15769;\n\t\t\telse if (Power == 10) return 15770;\n\t\t\telse if (Power == 11) return 15771;\n\t\t\telse if (Power == 12) return 15772;\n\t\t\telse if (Power == 13) return 15773;\n\t\t\telse if (Power == 14) return 15774;\n\t\t\telse return 15775;\n\t\t}\n\t\tBlockState Target();\n\t\tunsigned char Power(BlockState Block);\n\t}\n\tnamespace Terracotta\n\t{\n\t\tconstexpr BlockState Terracotta()\n\t\t{\n\t\t\treturn 7882;\n\t\t}\n\t}\n\tnamespace Torch\n\t{\n\t\tconstexpr BlockState Torch()\n\t\t{\n\t\t\treturn 1435;\n\t\t}\n\t}\n\tnamespace TrappedChest\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tSingle,\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState TrappedChest(const eBlockFace Facing, const enum Type Type)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Type == Type::Single) return 6623;\n\t\t\t\telse if (Type == Type::Left) return 6625;\n\t\t\t\telse return 6627;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Type == Type::Single) return 6629;\n\t\t\t\telse if (Type == Type::Left) return 6631;\n\t\t\t\telse return 6633;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Type == Type::Single) return 6635;\n\t\t\t\telse if (Type == Type::Left) return 6637;\n\t\t\t\telse return 6639;\n\t\t\telse\n\t\t\t\tif (Type == Type::Single) return 6641;\n\t\t\t\telse if (Type == Type::Left) return 6643;\n\t\t\t\telse return 6645;\n\t\t}\n\t\tBlockState TrappedChest();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace Tripwire\n\t{\n\t\tconstexpr BlockState Tripwire(const bool Attached, const bool Disarmed, const bool East, const bool North, const bool Powered, const bool South, const bool West)\n\t\t{\n\t\t\tif (Attached)\n\t\t\t\tif (Disarmed)\n\t\t\t\t\tif (East)\n\t\t\t\t\t\tif (North)\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5275;\n\t\t\t\t\t\t\t\t\telse return 5276;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5277;\n\t\t\t\t\t\t\t\t\telse return 5278;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5279;\n\t\t\t\t\t\t\t\t\telse return 5280;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5281;\n\t\t\t\t\t\t\t\t\telse return 5282;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5283;\n\t\t\t\t\t\t\t\t\telse return 5284;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5285;\n\t\t\t\t\t\t\t\t\telse return 5286;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5287;\n\t\t\t\t\t\t\t\t\telse return 5288;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5289;\n\t\t\t\t\t\t\t\t\telse return 5290;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (North)\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5291;\n\t\t\t\t\t\t\t\t\telse return 5292;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5293;\n\t\t\t\t\t\t\t\t\telse return 5294;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5295;\n\t\t\t\t\t\t\t\t\telse return 5296;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5297;\n\t\t\t\t\t\t\t\t\telse return 5298;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5299;\n\t\t\t\t\t\t\t\t\telse return 5300;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5301;\n\t\t\t\t\t\t\t\t\telse return 5302;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5303;\n\t\t\t\t\t\t\t\t\telse return 5304;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5305;\n\t\t\t\t\t\t\t\t\telse return 5306;\n\t\t\t\telse\n\t\t\t\t\tif (East)\n\t\t\t\t\t\tif (North)\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5307;\n\t\t\t\t\t\t\t\t\telse return 5308;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5309;\n\t\t\t\t\t\t\t\t\telse return 5310;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5311;\n\t\t\t\t\t\t\t\t\telse return 5312;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5313;\n\t\t\t\t\t\t\t\t\telse return 5314;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5315;\n\t\t\t\t\t\t\t\t\telse return 5316;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5317;\n\t\t\t\t\t\t\t\t\telse return 5318;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5319;\n\t\t\t\t\t\t\t\t\telse return 5320;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5321;\n\t\t\t\t\t\t\t\t\telse return 5322;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (North)\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5323;\n\t\t\t\t\t\t\t\t\telse return 5324;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5325;\n\t\t\t\t\t\t\t\t\telse return 5326;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5327;\n\t\t\t\t\t\t\t\t\telse return 5328;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5329;\n\t\t\t\t\t\t\t\t\telse return 5330;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5331;\n\t\t\t\t\t\t\t\t\telse return 5332;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5333;\n\t\t\t\t\t\t\t\t\telse return 5334;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5335;\n\t\t\t\t\t\t\t\t\telse return 5336;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5337;\n\t\t\t\t\t\t\t\t\telse return 5338;\n\t\t\telse\n\t\t\t\tif (Disarmed)\n\t\t\t\t\tif (East)\n\t\t\t\t\t\tif (North)\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5339;\n\t\t\t\t\t\t\t\t\telse return 5340;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5341;\n\t\t\t\t\t\t\t\t\telse return 5342;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5343;\n\t\t\t\t\t\t\t\t\telse return 5344;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5345;\n\t\t\t\t\t\t\t\t\telse return 5346;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5347;\n\t\t\t\t\t\t\t\t\telse return 5348;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5349;\n\t\t\t\t\t\t\t\t\telse return 5350;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5351;\n\t\t\t\t\t\t\t\t\telse return 5352;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5353;\n\t\t\t\t\t\t\t\t\telse return 5354;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (North)\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5355;\n\t\t\t\t\t\t\t\t\telse return 5356;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5357;\n\t\t\t\t\t\t\t\t\telse return 5358;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5359;\n\t\t\t\t\t\t\t\t\telse return 5360;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5361;\n\t\t\t\t\t\t\t\t\telse return 5362;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5363;\n\t\t\t\t\t\t\t\t\telse return 5364;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5365;\n\t\t\t\t\t\t\t\t\telse return 5366;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5367;\n\t\t\t\t\t\t\t\t\telse return 5368;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5369;\n\t\t\t\t\t\t\t\t\telse return 5370;\n\t\t\t\telse\n\t\t\t\t\tif (East)\n\t\t\t\t\t\tif (North)\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5371;\n\t\t\t\t\t\t\t\t\telse return 5372;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5373;\n\t\t\t\t\t\t\t\t\telse return 5374;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5375;\n\t\t\t\t\t\t\t\t\telse return 5376;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5377;\n\t\t\t\t\t\t\t\t\telse return 5378;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5379;\n\t\t\t\t\t\t\t\t\telse return 5380;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5381;\n\t\t\t\t\t\t\t\t\telse return 5382;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5383;\n\t\t\t\t\t\t\t\t\telse return 5384;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5385;\n\t\t\t\t\t\t\t\t\telse return 5386;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (North)\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5387;\n\t\t\t\t\t\t\t\t\telse return 5388;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5389;\n\t\t\t\t\t\t\t\t\telse return 5390;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5391;\n\t\t\t\t\t\t\t\t\telse return 5392;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5393;\n\t\t\t\t\t\t\t\t\telse return 5394;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered)\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5395;\n\t\t\t\t\t\t\t\t\telse return 5396;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5397;\n\t\t\t\t\t\t\t\t\telse return 5398;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (South)\n\t\t\t\t\t\t\t\t\tif (West) return 5399;\n\t\t\t\t\t\t\t\t\telse return 5400;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (West) return 5401;\n\t\t\t\t\t\t\t\t\telse return 5402;\n\t\t}\n\t\tBlockState Tripwire();\n\t\tbool Attached(BlockState Block);\n\t\tbool Disarmed(BlockState Block);\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace TripwireHook\n\t{\n\t\tconstexpr BlockState TripwireHook(const bool Attached, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Attached)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 5259;\n\t\t\t\t\telse return 5260;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 5261;\n\t\t\t\t\telse return 5262;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 5263;\n\t\t\t\t\telse return 5264;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 5265;\n\t\t\t\t\telse return 5266;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 5267;\n\t\t\t\t\telse return 5268;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 5269;\n\t\t\t\t\telse return 5270;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 5271;\n\t\t\t\t\telse return 5272;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 5273;\n\t\t\t\t\telse return 5274;\n\t\t}\n\t\tBlockState TripwireHook();\n\t\tbool Attached(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace TubeCoral\n\t{\n\t\tconstexpr BlockState TubeCoral()\n\t\t{\n\t\t\treturn 9531;\n\t\t}\n\t}\n\tnamespace TubeCoralBlock\n\t{\n\t\tconstexpr BlockState TubeCoralBlock()\n\t\t{\n\t\t\treturn 9515;\n\t\t}\n\t}\n\tnamespace TubeCoralFan\n\t{\n\t\tconstexpr BlockState TubeCoralFan()\n\t\t{\n\t\t\treturn 9551;\n\t\t}\n\t}\n\tnamespace TubeCoralWallFan\n\t{\n\t\tconstexpr BlockState TubeCoralWallFan(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9601;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9603;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9605;\n\t\t\telse return 9607;\n\t\t}\n\t\tBlockState TubeCoralWallFan();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace TurtleEgg\n\t{\n\t\tconstexpr BlockState TurtleEgg(const unsigned char Eggs, const unsigned char Hatch)\n\t\t{\n\t\t\tif (Eggs == 1)\n\t\t\t\tif (Hatch == 0) return 9498;\n\t\t\t\telse if (Hatch == 1) return 9499;\n\t\t\t\telse return 9500;\n\t\t\telse if (Eggs == 2)\n\t\t\t\tif (Hatch == 0) return 9501;\n\t\t\t\telse if (Hatch == 1) return 9502;\n\t\t\t\telse return 9503;\n\t\t\telse if (Eggs == 3)\n\t\t\t\tif (Hatch == 0) return 9504;\n\t\t\t\telse if (Hatch == 1) return 9505;\n\t\t\t\telse return 9506;\n\t\t\telse\n\t\t\t\tif (Hatch == 0) return 9507;\n\t\t\t\telse if (Hatch == 1) return 9508;\n\t\t\t\telse return 9509;\n\t\t}\n\t\tBlockState TurtleEgg();\n\t\tunsigned char Eggs(BlockState Block);\n\t\tunsigned char Hatch(BlockState Block);\n\t}\n\tnamespace TwistingVines\n\t{\n\t\tconstexpr BlockState TwistingVines(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 15017;\n\t\t\telse if (Age == 1) return 15018;\n\t\t\telse if (Age == 2) return 15019;\n\t\t\telse if (Age == 3) return 15020;\n\t\t\telse if (Age == 4) return 15021;\n\t\t\telse if (Age == 5) return 15022;\n\t\t\telse if (Age == 6) return 15023;\n\t\t\telse if (Age == 7) return 15024;\n\t\t\telse if (Age == 8) return 15025;\n\t\t\telse if (Age == 9) return 15026;\n\t\t\telse if (Age == 10) return 15027;\n\t\t\telse if (Age == 11) return 15028;\n\t\t\telse if (Age == 12) return 15029;\n\t\t\telse if (Age == 13) return 15030;\n\t\t\telse if (Age == 14) return 15031;\n\t\t\telse if (Age == 15) return 15032;\n\t\t\telse if (Age == 16) return 15033;\n\t\t\telse if (Age == 17) return 15034;\n\t\t\telse if (Age == 18) return 15035;\n\t\t\telse if (Age == 19) return 15036;\n\t\t\telse if (Age == 20) return 15037;\n\t\t\telse if (Age == 21) return 15038;\n\t\t\telse if (Age == 22) return 15039;\n\t\t\telse if (Age == 23) return 15040;\n\t\t\telse if (Age == 24) return 15041;\n\t\t\telse return 15042;\n\t\t}\n\t\tBlockState TwistingVines();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace TwistingVinesPlant\n\t{\n\t\tconstexpr BlockState TwistingVinesPlant()\n\t\t{\n\t\t\treturn 15043;\n\t\t}\n\t}\n\tnamespace Vine\n\t{\n\t\tconstexpr BlockState Vine(const bool East, const bool North, const bool South, const bool Up, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West) return 4788;\n\t\t\t\t\t\t\telse return 4789;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West) return 4790;\n\t\t\t\t\t\t\telse return 4791;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West) return 4792;\n\t\t\t\t\t\t\telse return 4793;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West) return 4794;\n\t\t\t\t\t\t\telse return 4795;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West) return 4796;\n\t\t\t\t\t\t\telse return 4797;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West) return 4798;\n\t\t\t\t\t\t\telse return 4799;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West) return 4800;\n\t\t\t\t\t\t\telse return 4801;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West) return 4802;\n\t\t\t\t\t\t\telse return 4803;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West) return 4804;\n\t\t\t\t\t\t\telse return 4805;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West) return 4806;\n\t\t\t\t\t\t\telse return 4807;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West) return 4808;\n\t\t\t\t\t\t\telse return 4809;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West) return 4810;\n\t\t\t\t\t\t\telse return 4811;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West) return 4812;\n\t\t\t\t\t\t\telse return 4813;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West) return 4814;\n\t\t\t\t\t\t\telse return 4815;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Up)\n\t\t\t\t\t\t\tif (West) return 4816;\n\t\t\t\t\t\t\telse return 4817;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (West) return 4818;\n\t\t\t\t\t\t\telse return 4819;\n\t\t}\n\t\tBlockState Vine();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool Up(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace VoidAir\n\t{\n\t\tconstexpr BlockState VoidAir()\n\t\t{\n\t\t\treturn 9665;\n\t\t}\n\t}\n\tnamespace WallTorch\n\t{\n\t\tconstexpr BlockState WallTorch(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 1436;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 1437;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 1438;\n\t\t\telse return 1439;\n\t\t}\n\t\tBlockState WallTorch();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace WarpedButton\n\t{\n\t\tenum class Face\n\t\t{\n\t\t\tFloor,\n\t\t\tWall,\n\t\t\tCeiling\n\t\t};\n\t\tconstexpr BlockState WarpedButton(const enum Face Face, const eBlockFace Facing, const bool Powered)\n\t\t{\n\t\t\tif (Face == Face::Floor)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 15503;\n\t\t\t\t\telse return 15504;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 15505;\n\t\t\t\t\telse return 15506;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 15507;\n\t\t\t\t\telse return 15508;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 15509;\n\t\t\t\t\telse return 15510;\n\t\t\telse if (Face == Face::Wall)\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 15511;\n\t\t\t\t\telse return 15512;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 15513;\n\t\t\t\t\telse return 15514;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 15515;\n\t\t\t\t\telse return 15516;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 15517;\n\t\t\t\t\telse return 15518;\n\t\t\telse\n\t\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\t\tif (Powered) return 15519;\n\t\t\t\t\telse return 15520;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\t\tif (Powered) return 15521;\n\t\t\t\t\telse return 15522;\n\t\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\t\tif (Powered) return 15523;\n\t\t\t\t\telse return 15524;\n\t\t\t\telse\n\t\t\t\t\tif (Powered) return 15525;\n\t\t\t\t\telse return 15526;\n\t\t}\n\t\tBlockState WarpedButton();\n\t\tenum Face Face(BlockState Block);\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace WarpedDoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tUpper,\n\t\t\tLower\n\t\t};\n\t\tenum class Hinge\n\t\t{\n\t\t\tLeft,\n\t\t\tRight\n\t\t};\n\t\tconstexpr BlockState WarpedDoor(const eBlockFace Facing, const enum Half Half, const enum Hinge Hinge, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15591;\n\t\t\t\t\t\t\telse return 15592;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15593;\n\t\t\t\t\t\t\telse return 15594;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15595;\n\t\t\t\t\t\t\telse return 15596;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15597;\n\t\t\t\t\t\t\telse return 15598;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15599;\n\t\t\t\t\t\t\telse return 15600;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15601;\n\t\t\t\t\t\t\telse return 15602;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15603;\n\t\t\t\t\t\t\telse return 15604;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15605;\n\t\t\t\t\t\t\telse return 15606;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15607;\n\t\t\t\t\t\t\telse return 15608;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15609;\n\t\t\t\t\t\t\telse return 15610;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15611;\n\t\t\t\t\t\t\telse return 15612;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15613;\n\t\t\t\t\t\t\telse return 15614;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15615;\n\t\t\t\t\t\t\telse return 15616;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15617;\n\t\t\t\t\t\t\telse return 15618;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15619;\n\t\t\t\t\t\t\telse return 15620;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15621;\n\t\t\t\t\t\t\telse return 15622;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15623;\n\t\t\t\t\t\t\telse return 15624;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15625;\n\t\t\t\t\t\t\telse return 15626;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15627;\n\t\t\t\t\t\t\telse return 15628;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15629;\n\t\t\t\t\t\t\telse return 15630;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15631;\n\t\t\t\t\t\t\telse return 15632;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15633;\n\t\t\t\t\t\t\telse return 15634;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15635;\n\t\t\t\t\t\t\telse return 15636;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15637;\n\t\t\t\t\t\t\telse return 15638;\n\t\t\telse\n\t\t\t\tif (Half == Half::Upper)\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15639;\n\t\t\t\t\t\t\telse return 15640;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15641;\n\t\t\t\t\t\t\telse return 15642;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15643;\n\t\t\t\t\t\t\telse return 15644;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15645;\n\t\t\t\t\t\t\telse return 15646;\n\t\t\t\telse\n\t\t\t\t\tif (Hinge == Hinge::Left)\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15647;\n\t\t\t\t\t\t\telse return 15648;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15649;\n\t\t\t\t\t\t\telse return 15650;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Open)\n\t\t\t\t\t\t\tif (Powered) return 15651;\n\t\t\t\t\t\t\telse return 15652;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif (Powered) return 15653;\n\t\t\t\t\t\t\telse return 15654;\n\t\t}\n\t\tBlockState WarpedDoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Hinge Hinge(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace WarpedFence\n\t{\n\t\tconstexpr BlockState WarpedFence(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 15097;\n\t\t\t\t\t\telse return 15098;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 15101;\n\t\t\t\t\t\telse return 15102;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 15105;\n\t\t\t\t\t\telse return 15106;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 15109;\n\t\t\t\t\t\telse return 15110;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 15113;\n\t\t\t\t\t\telse return 15114;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 15117;\n\t\t\t\t\t\telse return 15118;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 15121;\n\t\t\t\t\t\telse return 15122;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 15125;\n\t\t\t\t\t\telse return 15126;\n\t\t}\n\t\tBlockState WarpedFence();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace WarpedFenceGate\n\t{\n\t\tconstexpr BlockState WarpedFenceGate(const eBlockFace Facing, const bool InWall, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15287;\n\t\t\t\t\t\telse return 15288;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15289;\n\t\t\t\t\t\telse return 15290;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15291;\n\t\t\t\t\t\telse return 15292;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15293;\n\t\t\t\t\t\telse return 15294;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15295;\n\t\t\t\t\t\telse return 15296;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15297;\n\t\t\t\t\t\telse return 15298;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15299;\n\t\t\t\t\t\telse return 15300;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15301;\n\t\t\t\t\t\telse return 15302;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15303;\n\t\t\t\t\t\telse return 15304;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15305;\n\t\t\t\t\t\telse return 15306;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15307;\n\t\t\t\t\t\telse return 15308;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15309;\n\t\t\t\t\t\telse return 15310;\n\t\t\telse\n\t\t\t\tif (InWall)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15311;\n\t\t\t\t\t\telse return 15312;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15313;\n\t\t\t\t\t\telse return 15314;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15315;\n\t\t\t\t\t\telse return 15316;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15317;\n\t\t\t\t\t\telse return 15318;\n\t\t}\n\t\tBlockState WarpedFenceGate();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool InWall(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace WarpedFungus\n\t{\n\t\tconstexpr BlockState WarpedFungus()\n\t\t{\n\t\t\treturn 14971;\n\t\t}\n\t}\n\tnamespace WarpedHyphae\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState WarpedHyphae(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 14964;\n\t\t\telse if (Axis == Axis::Y) return 14965;\n\t\t\telse return 14966;\n\t\t}\n\t\tBlockState WarpedHyphae();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace WarpedNylium\n\t{\n\t\tconstexpr BlockState WarpedNylium()\n\t\t{\n\t\t\treturn 14970;\n\t\t}\n\t}\n\tnamespace WarpedPlanks\n\t{\n\t\tconstexpr BlockState WarpedPlanks()\n\t\t{\n\t\t\treturn 15046;\n\t\t}\n\t}\n\tnamespace WarpedPressurePlate\n\t{\n\t\tconstexpr BlockState WarpedPressurePlate(const bool Powered)\n\t\t{\n\t\t\tif (Powered) return 15061;\n\t\t\telse return 15062;\n\t\t}\n\t\tBlockState WarpedPressurePlate();\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace WarpedRoots\n\t{\n\t\tconstexpr BlockState WarpedRoots()\n\t\t{\n\t\t\treturn 14973;\n\t\t}\n\t}\n\tnamespace WarpedSign\n\t{\n\t\tconstexpr BlockState WarpedSign(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 15688;\n\t\t\telse if (Rotation == 1) return 15690;\n\t\t\telse if (Rotation == 2) return 15692;\n\t\t\telse if (Rotation == 3) return 15694;\n\t\t\telse if (Rotation == 4) return 15696;\n\t\t\telse if (Rotation == 5) return 15698;\n\t\t\telse if (Rotation == 6) return 15700;\n\t\t\telse if (Rotation == 7) return 15702;\n\t\t\telse if (Rotation == 8) return 15704;\n\t\t\telse if (Rotation == 9) return 15706;\n\t\t\telse if (Rotation == 10) return 15708;\n\t\t\telse if (Rotation == 11) return 15710;\n\t\t\telse if (Rotation == 12) return 15712;\n\t\t\telse if (Rotation == 13) return 15714;\n\t\t\telse if (Rotation == 14) return 15716;\n\t\t\telse return 15718;\n\t\t}\n\t\tBlockState WarpedSign();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace WarpedSlab\n\t{\n\t\tenum class Type\n\t\t{\n\t\t\tTop,\n\t\t\tBottom,\n\t\t\tDouble\n\t\t};\n\t\tconstexpr BlockState WarpedSlab(const enum Type Type)\n\t\t{\n\t\t\tif (Type == Type::Top) return 15054;\n\t\t\telse if (Type == Type::Bottom) return 15056;\n\t\t\telse return 15058;\n\t\t}\n\t\tBlockState WarpedSlab();\n\t\tenum Type Type(BlockState Block);\n\t}\n\tnamespace WarpedStairs\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tenum class Shape\n\t\t{\n\t\t\tStraight,\n\t\t\tInnerLeft,\n\t\t\tInnerRight,\n\t\t\tOuterLeft,\n\t\t\tOuterRight\n\t\t};\n\t\tconstexpr BlockState WarpedStairs(const eBlockFace Facing, const enum Half Half, const enum Shape Shape)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15400;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15402;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15404;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15406;\n\t\t\t\t\telse return 15408;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15410;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15412;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15414;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15416;\n\t\t\t\t\telse return 15418;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15420;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15422;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15424;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15426;\n\t\t\t\t\telse return 15428;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15430;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15432;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15434;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15436;\n\t\t\t\t\telse return 15438;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15440;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15442;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15444;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15446;\n\t\t\t\t\telse return 15448;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15450;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15452;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15454;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15456;\n\t\t\t\t\telse return 15458;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Shape == Shape::Straight) return 15460;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15462;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15464;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15466;\n\t\t\t\t\telse return 15468;\n\t\t\t\telse\n\t\t\t\t\tif (Shape == Shape::Straight) return 15470;\n\t\t\t\t\telse if (Shape == Shape::InnerLeft) return 15472;\n\t\t\t\t\telse if (Shape == Shape::InnerRight) return 15474;\n\t\t\t\t\telse if (Shape == Shape::OuterLeft) return 15476;\n\t\t\t\t\telse return 15478;\n\t\t}\n\t\tBlockState WarpedStairs();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tenum Shape Shape(BlockState Block);\n\t}\n\tnamespace WarpedStem\n\t{\n\t\tenum class Axis\n\t\t{\n\t\t\tX,\n\t\t\tY,\n\t\t\tZ\n\t\t};\n\t\tconstexpr BlockState WarpedStem(const enum Axis Axis)\n\t\t{\n\t\t\tif (Axis == Axis::X) return 14958;\n\t\t\telse if (Axis == Axis::Y) return 14959;\n\t\t\telse return 14960;\n\t\t}\n\t\tBlockState WarpedStem();\n\t\tenum Axis Axis(BlockState Block);\n\t}\n\tnamespace WarpedTrapdoor\n\t{\n\t\tenum class Half\n\t\t{\n\t\t\tTop,\n\t\t\tBottom\n\t\t};\n\t\tconstexpr BlockState WarpedTrapdoor(const eBlockFace Facing, const enum Half Half, const bool Open, const bool Powered)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15192;\n\t\t\t\t\t\telse return 15194;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15196;\n\t\t\t\t\t\telse return 15198;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15200;\n\t\t\t\t\t\telse return 15202;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15204;\n\t\t\t\t\t\telse return 15206;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15208;\n\t\t\t\t\t\telse return 15210;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15212;\n\t\t\t\t\t\telse return 15214;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15216;\n\t\t\t\t\t\telse return 15218;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15220;\n\t\t\t\t\t\telse return 15222;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15224;\n\t\t\t\t\t\telse return 15226;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15228;\n\t\t\t\t\t\telse return 15230;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15232;\n\t\t\t\t\t\telse return 15234;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15236;\n\t\t\t\t\t\telse return 15238;\n\t\t\telse\n\t\t\t\tif (Half == Half::Top)\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15240;\n\t\t\t\t\t\telse return 15242;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15244;\n\t\t\t\t\t\telse return 15246;\n\t\t\t\telse\n\t\t\t\t\tif (Open)\n\t\t\t\t\t\tif (Powered) return 15248;\n\t\t\t\t\t\telse return 15250;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (Powered) return 15252;\n\t\t\t\t\t\telse return 15254;\n\t\t}\n\t\tBlockState WarpedTrapdoor();\n\t\teBlockFace Facing(BlockState Block);\n\t\tenum Half Half(BlockState Block);\n\t\tbool Open(BlockState Block);\n\t\tbool Powered(BlockState Block);\n\t}\n\tnamespace WarpedWallSign\n\t{\n\t\tconstexpr BlockState WarpedWallSign(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 15728;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 15730;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 15732;\n\t\t\telse return 15734;\n\t\t}\n\t\tBlockState WarpedWallSign();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace WarpedWartBlock\n\t{\n\t\tconstexpr BlockState WarpedWartBlock()\n\t\t{\n\t\t\treturn 14972;\n\t\t}\n\t}\n\tnamespace Water\n\t{\n\t\tconstexpr BlockState Water(const unsigned char Level)\n\t\t{\n\t\t\tif (Level == 0) return 34;\n\t\t\telse if (Level == 1) return 35;\n\t\t\telse if (Level == 2) return 36;\n\t\t\telse if (Level == 3) return 37;\n\t\t\telse if (Level == 4) return 38;\n\t\t\telse if (Level == 5) return 39;\n\t\t\telse if (Level == 6) return 40;\n\t\t\telse if (Level == 7) return 41;\n\t\t\telse if (Level == 8) return 42;\n\t\t\telse if (Level == 9) return 43;\n\t\t\telse if (Level == 10) return 44;\n\t\t\telse if (Level == 11) return 45;\n\t\t\telse if (Level == 12) return 46;\n\t\t\telse if (Level == 13) return 47;\n\t\t\telse if (Level == 14) return 48;\n\t\t\telse return 49;\n\t\t}\n\t\tBlockState Water();\n\t\tunsigned char Level(BlockState Block);\n\t}\n\tnamespace WeepingVines\n\t{\n\t\tconstexpr BlockState WeepingVines(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 14990;\n\t\t\telse if (Age == 1) return 14991;\n\t\t\telse if (Age == 2) return 14992;\n\t\t\telse if (Age == 3) return 14993;\n\t\t\telse if (Age == 4) return 14994;\n\t\t\telse if (Age == 5) return 14995;\n\t\t\telse if (Age == 6) return 14996;\n\t\t\telse if (Age == 7) return 14997;\n\t\t\telse if (Age == 8) return 14998;\n\t\t\telse if (Age == 9) return 14999;\n\t\t\telse if (Age == 10) return 15000;\n\t\t\telse if (Age == 11) return 15001;\n\t\t\telse if (Age == 12) return 15002;\n\t\t\telse if (Age == 13) return 15003;\n\t\t\telse if (Age == 14) return 15004;\n\t\t\telse if (Age == 15) return 15005;\n\t\t\telse if (Age == 16) return 15006;\n\t\t\telse if (Age == 17) return 15007;\n\t\t\telse if (Age == 18) return 15008;\n\t\t\telse if (Age == 19) return 15009;\n\t\t\telse if (Age == 20) return 15010;\n\t\t\telse if (Age == 21) return 15011;\n\t\t\telse if (Age == 22) return 15012;\n\t\t\telse if (Age == 23) return 15013;\n\t\t\telse if (Age == 24) return 15014;\n\t\t\telse return 15015;\n\t\t}\n\t\tBlockState WeepingVines();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace WeepingVinesPlant\n\t{\n\t\tconstexpr BlockState WeepingVinesPlant()\n\t\t{\n\t\t\treturn 15016;\n\t\t}\n\t}\n\tnamespace WetSponge\n\t{\n\t\tconstexpr BlockState WetSponge()\n\t\t{\n\t\t\treturn 230;\n\t\t}\n\t}\n\tnamespace Wheat\n\t{\n\t\tconstexpr BlockState Wheat(const unsigned char Age)\n\t\t{\n\t\t\tif (Age == 0) return 3357;\n\t\t\telse if (Age == 1) return 3358;\n\t\t\telse if (Age == 2) return 3359;\n\t\t\telse if (Age == 3) return 3360;\n\t\t\telse if (Age == 4) return 3361;\n\t\t\telse if (Age == 5) return 3362;\n\t\t\telse if (Age == 6) return 3363;\n\t\t\telse return 3364;\n\t\t}\n\t\tBlockState Wheat();\n\t\tunsigned char Age(BlockState Block);\n\t}\n\tnamespace WhiteBanner\n\t{\n\t\tconstexpr BlockState WhiteBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 7897;\n\t\t\telse if (Rotation == 1) return 7898;\n\t\t\telse if (Rotation == 2) return 7899;\n\t\t\telse if (Rotation == 3) return 7900;\n\t\t\telse if (Rotation == 4) return 7901;\n\t\t\telse if (Rotation == 5) return 7902;\n\t\t\telse if (Rotation == 6) return 7903;\n\t\t\telse if (Rotation == 7) return 7904;\n\t\t\telse if (Rotation == 8) return 7905;\n\t\t\telse if (Rotation == 9) return 7906;\n\t\t\telse if (Rotation == 10) return 7907;\n\t\t\telse if (Rotation == 11) return 7908;\n\t\t\telse if (Rotation == 12) return 7909;\n\t\t\telse if (Rotation == 13) return 7910;\n\t\t\telse if (Rotation == 14) return 7911;\n\t\t\telse return 7912;\n\t\t}\n\t\tBlockState WhiteBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace WhiteBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState WhiteBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1049;\n\t\t\t\t\telse return 1050;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1051;\n\t\t\t\t\telse return 1052;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1053;\n\t\t\t\t\telse return 1054;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1055;\n\t\t\t\t\telse return 1056;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1057;\n\t\t\t\t\telse return 1058;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1059;\n\t\t\t\t\telse return 1060;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1061;\n\t\t\t\t\telse return 1062;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1063;\n\t\t\t\t\telse return 1064;\n\t\t}\n\t\tBlockState WhiteBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace WhiteCarpet\n\t{\n\t\tconstexpr BlockState WhiteCarpet()\n\t\t{\n\t\t\treturn 7866;\n\t\t}\n\t}\n\tnamespace WhiteConcrete\n\t{\n\t\tconstexpr BlockState WhiteConcrete()\n\t\t{\n\t\t\treturn 9438;\n\t\t}\n\t}\n\tnamespace WhiteConcretePowder\n\t{\n\t\tconstexpr BlockState WhiteConcretePowder()\n\t\t{\n\t\t\treturn 9454;\n\t\t}\n\t}\n\tnamespace WhiteGlazedTerracotta\n\t{\n\t\tconstexpr BlockState WhiteGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9374;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9375;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9376;\n\t\t\telse return 9377;\n\t\t}\n\t\tBlockState WhiteGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace WhiteShulkerBox\n\t{\n\t\tconstexpr BlockState WhiteShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9278;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9279;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9280;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9281;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9282;\n\t\t\telse return 9283;\n\t\t}\n\t\tBlockState WhiteShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace WhiteStainedGlass\n\t{\n\t\tconstexpr BlockState WhiteStainedGlass()\n\t\t{\n\t\t\treturn 4095;\n\t\t}\n\t}\n\tnamespace WhiteStainedGlassPane\n\t{\n\t\tconstexpr BlockState WhiteStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6865;\n\t\t\t\t\t\telse return 6866;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6869;\n\t\t\t\t\t\telse return 6870;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6873;\n\t\t\t\t\t\telse return 6874;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6877;\n\t\t\t\t\t\telse return 6878;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6881;\n\t\t\t\t\t\telse return 6882;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6885;\n\t\t\t\t\t\telse return 6886;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6889;\n\t\t\t\t\t\telse return 6890;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6893;\n\t\t\t\t\t\telse return 6894;\n\t\t}\n\t\tBlockState WhiteStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace WhiteTerracotta\n\t{\n\t\tconstexpr BlockState WhiteTerracotta()\n\t\t{\n\t\t\treturn 6847;\n\t\t}\n\t}\n\tnamespace WhiteTulip\n\t{\n\t\tconstexpr BlockState WhiteTulip()\n\t\t{\n\t\t\treturn 1419;\n\t\t}\n\t}\n\tnamespace WhiteWallBanner\n\t{\n\t\tconstexpr BlockState WhiteWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8153;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8154;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8155;\n\t\t\telse return 8156;\n\t\t}\n\t\tBlockState WhiteWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace WhiteWool\n\t{\n\t\tconstexpr BlockState WhiteWool()\n\t\t{\n\t\t\treturn 1384;\n\t\t}\n\t}\n\tnamespace WitherRose\n\t{\n\t\tconstexpr BlockState WitherRose()\n\t\t{\n\t\t\treturn 1423;\n\t\t}\n\t}\n\tnamespace WitherSkeletonSkull\n\t{\n\t\tconstexpr BlockState WitherSkeletonSkull(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 6510;\n\t\t\telse if (Rotation == 1) return 6511;\n\t\t\telse if (Rotation == 2) return 6512;\n\t\t\telse if (Rotation == 3) return 6513;\n\t\t\telse if (Rotation == 4) return 6514;\n\t\t\telse if (Rotation == 5) return 6515;\n\t\t\telse if (Rotation == 6) return 6516;\n\t\t\telse if (Rotation == 7) return 6517;\n\t\t\telse if (Rotation == 8) return 6518;\n\t\t\telse if (Rotation == 9) return 6519;\n\t\t\telse if (Rotation == 10) return 6520;\n\t\t\telse if (Rotation == 11) return 6521;\n\t\t\telse if (Rotation == 12) return 6522;\n\t\t\telse if (Rotation == 13) return 6523;\n\t\t\telse if (Rotation == 14) return 6524;\n\t\t\telse return 6525;\n\t\t}\n\t\tBlockState WitherSkeletonSkull();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace WitherSkeletonWallSkull\n\t{\n\t\tconstexpr BlockState WitherSkeletonWallSkull(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6526;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6527;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6528;\n\t\t\telse return 6529;\n\t\t}\n\t\tBlockState WitherSkeletonWallSkull();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace YellowBanner\n\t{\n\t\tconstexpr BlockState YellowBanner(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 7961;\n\t\t\telse if (Rotation == 1) return 7962;\n\t\t\telse if (Rotation == 2) return 7963;\n\t\t\telse if (Rotation == 3) return 7964;\n\t\t\telse if (Rotation == 4) return 7965;\n\t\t\telse if (Rotation == 5) return 7966;\n\t\t\telse if (Rotation == 6) return 7967;\n\t\t\telse if (Rotation == 7) return 7968;\n\t\t\telse if (Rotation == 8) return 7969;\n\t\t\telse if (Rotation == 9) return 7970;\n\t\t\telse if (Rotation == 10) return 7971;\n\t\t\telse if (Rotation == 11) return 7972;\n\t\t\telse if (Rotation == 12) return 7973;\n\t\t\telse if (Rotation == 13) return 7974;\n\t\t\telse if (Rotation == 14) return 7975;\n\t\t\telse return 7976;\n\t\t}\n\t\tBlockState YellowBanner();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace YellowBed\n\t{\n\t\tenum class Part\n\t\t{\n\t\t\tHead,\n\t\t\tFoot\n\t\t};\n\t\tconstexpr BlockState YellowBed(const eBlockFace Facing, const bool Occupied, const enum Part Part)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1113;\n\t\t\t\t\telse return 1114;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1115;\n\t\t\t\t\telse return 1116;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1117;\n\t\t\t\t\telse return 1118;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1119;\n\t\t\t\t\telse return 1120;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM)\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1121;\n\t\t\t\t\telse return 1122;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1123;\n\t\t\t\t\telse return 1124;\n\t\t\telse\n\t\t\t\tif (Occupied)\n\t\t\t\t\tif (Part == Part::Head) return 1125;\n\t\t\t\t\telse return 1126;\n\t\t\t\telse\n\t\t\t\t\tif (Part == Part::Head) return 1127;\n\t\t\t\t\telse return 1128;\n\t\t}\n\t\tBlockState YellowBed();\n\t\teBlockFace Facing(BlockState Block);\n\t\tbool Occupied(BlockState Block);\n\t\tenum Part Part(BlockState Block);\n\t}\n\tnamespace YellowCarpet\n\t{\n\t\tconstexpr BlockState YellowCarpet()\n\t\t{\n\t\t\treturn 7870;\n\t\t}\n\t}\n\tnamespace YellowConcrete\n\t{\n\t\tconstexpr BlockState YellowConcrete()\n\t\t{\n\t\t\treturn 9442;\n\t\t}\n\t}\n\tnamespace YellowConcretePowder\n\t{\n\t\tconstexpr BlockState YellowConcretePowder()\n\t\t{\n\t\t\treturn 9458;\n\t\t}\n\t}\n\tnamespace YellowGlazedTerracotta\n\t{\n\t\tconstexpr BlockState YellowGlazedTerracotta(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9390;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9391;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9392;\n\t\t\telse return 9393;\n\t\t}\n\t\tBlockState YellowGlazedTerracotta();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace YellowShulkerBox\n\t{\n\t\tconstexpr BlockState YellowShulkerBox(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 9302;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XP) return 9303;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 9304;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 9305;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_YP) return 9306;\n\t\t\telse return 9307;\n\t\t}\n\t\tBlockState YellowShulkerBox();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace YellowStainedGlass\n\t{\n\t\tconstexpr BlockState YellowStainedGlass()\n\t\t{\n\t\t\treturn 4099;\n\t\t}\n\t}\n\tnamespace YellowStainedGlassPane\n\t{\n\t\tconstexpr BlockState YellowStainedGlassPane(const bool East, const bool North, const bool South, const bool West)\n\t\t{\n\t\t\tif (East)\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 6993;\n\t\t\t\t\t\telse return 6994;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 6997;\n\t\t\t\t\t\telse return 6998;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7001;\n\t\t\t\t\t\telse return 7002;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7005;\n\t\t\t\t\t\telse return 7006;\n\t\t\telse\n\t\t\t\tif (North)\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7009;\n\t\t\t\t\t\telse return 7010;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7013;\n\t\t\t\t\t\telse return 7014;\n\t\t\t\telse\n\t\t\t\t\tif (South)\n\t\t\t\t\t\tif (West) return 7017;\n\t\t\t\t\t\telse return 7018;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (West) return 7021;\n\t\t\t\t\t\telse return 7022;\n\t\t}\n\t\tBlockState YellowStainedGlassPane();\n\t\tbool East(BlockState Block);\n\t\tbool North(BlockState Block);\n\t\tbool South(BlockState Block);\n\t\tbool West(BlockState Block);\n\t}\n\tnamespace YellowTerracotta\n\t{\n\t\tconstexpr BlockState YellowTerracotta()\n\t\t{\n\t\t\treturn 6851;\n\t\t}\n\t}\n\tnamespace YellowWallBanner\n\t{\n\t\tconstexpr BlockState YellowWallBanner(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 8169;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 8170;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 8171;\n\t\t\telse return 8172;\n\t\t}\n\t\tBlockState YellowWallBanner();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n\tnamespace YellowWool\n\t{\n\t\tconstexpr BlockState YellowWool()\n\t\t{\n\t\t\treturn 1388;\n\t\t}\n\t}\n\tnamespace ZombieHead\n\t{\n\t\tconstexpr BlockState ZombieHead(const unsigned char Rotation)\n\t\t{\n\t\t\tif (Rotation == 0) return 6530;\n\t\t\telse if (Rotation == 1) return 6531;\n\t\t\telse if (Rotation == 2) return 6532;\n\t\t\telse if (Rotation == 3) return 6533;\n\t\t\telse if (Rotation == 4) return 6534;\n\t\t\telse if (Rotation == 5) return 6535;\n\t\t\telse if (Rotation == 6) return 6536;\n\t\t\telse if (Rotation == 7) return 6537;\n\t\t\telse if (Rotation == 8) return 6538;\n\t\t\telse if (Rotation == 9) return 6539;\n\t\t\telse if (Rotation == 10) return 6540;\n\t\t\telse if (Rotation == 11) return 6541;\n\t\t\telse if (Rotation == 12) return 6542;\n\t\t\telse if (Rotation == 13) return 6543;\n\t\t\telse if (Rotation == 14) return 6544;\n\t\t\telse return 6545;\n\t\t}\n\t\tBlockState ZombieHead();\n\t\tunsigned char Rotation(BlockState Block);\n\t}\n\tnamespace ZombieWallHead\n\t{\n\t\tconstexpr BlockState ZombieWallHead(const eBlockFace Facing)\n\t\t{\n\t\t\tif (Facing == eBlockFace::BLOCK_FACE_ZM) return 6546;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_ZP) return 6547;\n\t\t\telse if (Facing == eBlockFace::BLOCK_FACE_XM) return 6548;\n\t\t\telse return 6549;\n\t\t}\n\t\tBlockState ZombieWallHead();\n\t\teBlockFace Facing(BlockState Block);\n\t}\n}\n"
  },
  {
    "path": "src/Registries/BlockTypes.h",
    "content": "#pragma once\n\nenum class BlockType\n{\n\tAcaciaButton,\n\tAcaciaDoor,\n\tAcaciaFence,\n\tAcaciaFenceGate,\n\tAcaciaLeaves,\n\tAcaciaLog,\n\tAcaciaPlanks,\n\tAcaciaPressurePlate,\n\tAcaciaSapling,\n\tAcaciaSign,\n\tAcaciaSlab,\n\tAcaciaStairs,\n\tAcaciaTrapdoor,\n\tAcaciaWallSign,\n\tAcaciaWood,\n\tActivatorRail,\n\tAir,\n\tAllium,\n\tAncientDebris,\n\tAndesite,\n\tAndesiteSlab,\n\tAndesiteStairs,\n\tAndesiteWall,\n\tAnvil,\n\tAttachedMelonStem,\n\tAttachedPumpkinStem,\n\tAzureBluet,\n\tBamboo,\n\tBambooSapling,\n\tBarrel,\n\tBarrier,\n\tBasalt,\n\tBeacon,\n\tBedrock,\n\tBeeNest,\n\tBeehive,\n\tBeetroots,\n\tBell,\n\tBirchButton,\n\tBirchDoor,\n\tBirchFence,\n\tBirchFenceGate,\n\tBirchLeaves,\n\tBirchLog,\n\tBirchPlanks,\n\tBirchPressurePlate,\n\tBirchSapling,\n\tBirchSign,\n\tBirchSlab,\n\tBirchStairs,\n\tBirchTrapdoor,\n\tBirchWallSign,\n\tBirchWood,\n\tBlackBanner,\n\tBlackBed,\n\tBlackCarpet,\n\tBlackConcrete,\n\tBlackConcretePowder,\n\tBlackGlazedTerracotta,\n\tBlackShulkerBox,\n\tBlackStainedGlass,\n\tBlackStainedGlassPane,\n\tBlackTerracotta,\n\tBlackWallBanner,\n\tBlackWool,\n\tBlackstone,\n\tBlackstoneSlab,\n\tBlackstoneStairs,\n\tBlackstoneWall,\n\tBlastFurnace,\n\tBlueBanner,\n\tBlueBed,\n\tBlueCarpet,\n\tBlueConcrete,\n\tBlueConcretePowder,\n\tBlueGlazedTerracotta,\n\tBlueIce,\n\tBlueOrchid,\n\tBlueShulkerBox,\n\tBlueStainedGlass,\n\tBlueStainedGlassPane,\n\tBlueTerracotta,\n\tBlueWallBanner,\n\tBlueWool,\n\tBoneBlock,\n\tBookshelf,\n\tBrainCoral,\n\tBrainCoralBlock,\n\tBrainCoralFan,\n\tBrainCoralWallFan,\n\tBrewingStand,\n\tBrickSlab,\n\tBrickStairs,\n\tBrickWall,\n\tBricks,\n\tBrownBanner,\n\tBrownBed,\n\tBrownCarpet,\n\tBrownConcrete,\n\tBrownConcretePowder,\n\tBrownGlazedTerracotta,\n\tBrownMushroom,\n\tBrownMushroomBlock,\n\tBrownShulkerBox,\n\tBrownStainedGlass,\n\tBrownStainedGlassPane,\n\tBrownTerracotta,\n\tBrownWallBanner,\n\tBrownWool,\n\tBubbleColumn,\n\tBubbleCoral,\n\tBubbleCoralBlock,\n\tBubbleCoralFan,\n\tBubbleCoralWallFan,\n\tCactus,\n\tCake,\n\tCampfire,\n\tCarrots,\n\tCartographyTable,\n\tCarvedPumpkin,\n\tCauldron,\n\tCaveAir,\n\tChain,\n\tChainCommandBlock,\n\tChest,\n\tChippedAnvil,\n\tChiseledNetherBricks,\n\tChiseledPolishedBlackstone,\n\tChiseledQuartzBlock,\n\tChiseledRedSandstone,\n\tChiseledSandstone,\n\tChiseledStoneBricks,\n\tChorusFlower,\n\tChorusPlant,\n\tClay,\n\tCoalBlock,\n\tCoalOre,\n\tCoarseDirt,\n\tCobblestone,\n\tCobblestoneSlab,\n\tCobblestoneStairs,\n\tCobblestoneWall,\n\tCobweb,\n\tCocoa,\n\tCommandBlock,\n\tComparator,\n\tComposter,\n\tConduit,\n\tCornflower,\n\tCrackedNetherBricks,\n\tCrackedPolishedBlackstoneBricks,\n\tCrackedStoneBricks,\n\tCraftingTable,\n\tCreeperHead,\n\tCreeperWallHead,\n\tCrimsonButton,\n\tCrimsonDoor,\n\tCrimsonFence,\n\tCrimsonFenceGate,\n\tCrimsonFungus,\n\tCrimsonHyphae,\n\tCrimsonNylium,\n\tCrimsonPlanks,\n\tCrimsonPressurePlate,\n\tCrimsonRoots,\n\tCrimsonSign,\n\tCrimsonSlab,\n\tCrimsonStairs,\n\tCrimsonStem,\n\tCrimsonTrapdoor,\n\tCrimsonWallSign,\n\tCryingObsidian,\n\tCutRedSandstone,\n\tCutRedSandstoneSlab,\n\tCutSandstone,\n\tCutSandstoneSlab,\n\tCyanBanner,\n\tCyanBed,\n\tCyanCarpet,\n\tCyanConcrete,\n\tCyanConcretePowder,\n\tCyanGlazedTerracotta,\n\tCyanShulkerBox,\n\tCyanStainedGlass,\n\tCyanStainedGlassPane,\n\tCyanTerracotta,\n\tCyanWallBanner,\n\tCyanWool,\n\tDamagedAnvil,\n\tDandelion,\n\tDarkOakButton,\n\tDarkOakDoor,\n\tDarkOakFence,\n\tDarkOakFenceGate,\n\tDarkOakLeaves,\n\tDarkOakLog,\n\tDarkOakPlanks,\n\tDarkOakPressurePlate,\n\tDarkOakSapling,\n\tDarkOakSign,\n\tDarkOakSlab,\n\tDarkOakStairs,\n\tDarkOakTrapdoor,\n\tDarkOakWallSign,\n\tDarkOakWood,\n\tDarkPrismarine,\n\tDarkPrismarineSlab,\n\tDarkPrismarineStairs,\n\tDaylightDetector,\n\tDeadBrainCoral,\n\tDeadBrainCoralBlock,\n\tDeadBrainCoralFan,\n\tDeadBrainCoralWallFan,\n\tDeadBubbleCoral,\n\tDeadBubbleCoralBlock,\n\tDeadBubbleCoralFan,\n\tDeadBubbleCoralWallFan,\n\tDeadBush,\n\tDeadFireCoral,\n\tDeadFireCoralBlock,\n\tDeadFireCoralFan,\n\tDeadFireCoralWallFan,\n\tDeadHornCoral,\n\tDeadHornCoralBlock,\n\tDeadHornCoralFan,\n\tDeadHornCoralWallFan,\n\tDeadTubeCoral,\n\tDeadTubeCoralBlock,\n\tDeadTubeCoralFan,\n\tDeadTubeCoralWallFan,\n\tDetectorRail,\n\tDiamondBlock,\n\tDiamondOre,\n\tDiorite,\n\tDioriteSlab,\n\tDioriteStairs,\n\tDioriteWall,\n\tDirt,\n\tDispenser,\n\tDragonEgg,\n\tDragonHead,\n\tDragonWallHead,\n\tDriedKelpBlock,\n\tDropper,\n\tEmeraldBlock,\n\tEmeraldOre,\n\tEnchantingTable,\n\tEndGateway,\n\tEndPortal,\n\tEndPortalFrame,\n\tEndRod,\n\tEndStone,\n\tEndStoneBrickSlab,\n\tEndStoneBrickStairs,\n\tEndStoneBrickWall,\n\tEndStoneBricks,\n\tEnderChest,\n\tFarmland,\n\tFern,\n\tFire,\n\tFireCoral,\n\tFireCoralBlock,\n\tFireCoralFan,\n\tFireCoralWallFan,\n\tFletchingTable,\n\tFlowerPot,\n\tFrostedIce,\n\tFurnace,\n\tGildedBlackstone,\n\tGlass,\n\tGlassPane,\n\tGlowstone,\n\tGoldBlock,\n\tGoldOre,\n\tGranite,\n\tGraniteSlab,\n\tGraniteStairs,\n\tGraniteWall,\n\tGrass,\n\tGrassBlock,\n\tGrassPath,\n\tGravel,\n\tGrayBanner,\n\tGrayBed,\n\tGrayCarpet,\n\tGrayConcrete,\n\tGrayConcretePowder,\n\tGrayGlazedTerracotta,\n\tGrayShulkerBox,\n\tGrayStainedGlass,\n\tGrayStainedGlassPane,\n\tGrayTerracotta,\n\tGrayWallBanner,\n\tGrayWool,\n\tGreenBanner,\n\tGreenBed,\n\tGreenCarpet,\n\tGreenConcrete,\n\tGreenConcretePowder,\n\tGreenGlazedTerracotta,\n\tGreenShulkerBox,\n\tGreenStainedGlass,\n\tGreenStainedGlassPane,\n\tGreenTerracotta,\n\tGreenWallBanner,\n\tGreenWool,\n\tGrindstone,\n\tHayBale,\n\tHeavyWeightedPressurePlate,\n\tHoneyBlock,\n\tHoneycombBlock,\n\tHopper,\n\tHornCoral,\n\tHornCoralBlock,\n\tHornCoralFan,\n\tHornCoralWallFan,\n\tIce,\n\tInfestedChiseledStoneBricks,\n\tInfestedCobblestone,\n\tInfestedCrackedStoneBricks,\n\tInfestedMossyStoneBricks,\n\tInfestedStone,\n\tInfestedStoneBricks,\n\tIronBars,\n\tIronBlock,\n\tIronDoor,\n\tIronOre,\n\tIronTrapdoor,\n\tJackOLantern,\n\tJigsaw,\n\tJukebox,\n\tJungleButton,\n\tJungleDoor,\n\tJungleFence,\n\tJungleFenceGate,\n\tJungleLeaves,\n\tJungleLog,\n\tJunglePlanks,\n\tJunglePressurePlate,\n\tJungleSapling,\n\tJungleSign,\n\tJungleSlab,\n\tJungleStairs,\n\tJungleTrapdoor,\n\tJungleWallSign,\n\tJungleWood,\n\tKelp,\n\tKelpPlant,\n\tLadder,\n\tLantern,\n\tLapisBlock,\n\tLapisOre,\n\tLargeFern,\n\tLava,\n\tLectern,\n\tLever,\n\tLightBlueBanner,\n\tLightBlueBed,\n\tLightBlueCarpet,\n\tLightBlueConcrete,\n\tLightBlueConcretePowder,\n\tLightBlueGlazedTerracotta,\n\tLightBlueShulkerBox,\n\tLightBlueStainedGlass,\n\tLightBlueStainedGlassPane,\n\tLightBlueTerracotta,\n\tLightBlueWallBanner,\n\tLightBlueWool,\n\tLightGrayBanner,\n\tLightGrayBed,\n\tLightGrayCarpet,\n\tLightGrayConcrete,\n\tLightGrayConcretePowder,\n\tLightGrayGlazedTerracotta,\n\tLightGrayShulkerBox,\n\tLightGrayStainedGlass,\n\tLightGrayStainedGlassPane,\n\tLightGrayTerracotta,\n\tLightGrayWallBanner,\n\tLightGrayWool,\n\tLightWeightedPressurePlate,\n\tLilac,\n\tLilyOfTheValley,\n\tLilyPad,\n\tLimeBanner,\n\tLimeBed,\n\tLimeCarpet,\n\tLimeConcrete,\n\tLimeConcretePowder,\n\tLimeGlazedTerracotta,\n\tLimeShulkerBox,\n\tLimeStainedGlass,\n\tLimeStainedGlassPane,\n\tLimeTerracotta,\n\tLimeWallBanner,\n\tLimeWool,\n\tLodestone,\n\tLoom,\n\tMagentaBanner,\n\tMagentaBed,\n\tMagentaCarpet,\n\tMagentaConcrete,\n\tMagentaConcretePowder,\n\tMagentaGlazedTerracotta,\n\tMagentaShulkerBox,\n\tMagentaStainedGlass,\n\tMagentaStainedGlassPane,\n\tMagentaTerracotta,\n\tMagentaWallBanner,\n\tMagentaWool,\n\tMagmaBlock,\n\tMelon,\n\tMelonStem,\n\tMossyCobblestone,\n\tMossyCobblestoneSlab,\n\tMossyCobblestoneStairs,\n\tMossyCobblestoneWall,\n\tMossyStoneBrickSlab,\n\tMossyStoneBrickStairs,\n\tMossyStoneBrickWall,\n\tMossyStoneBricks,\n\tMovingPiston,\n\tMushroomStem,\n\tMycelium,\n\tNetherBrickFence,\n\tNetherBrickSlab,\n\tNetherBrickStairs,\n\tNetherBrickWall,\n\tNetherBricks,\n\tNetherGoldOre,\n\tNetherPortal,\n\tNetherQuartzOre,\n\tNetherSprouts,\n\tNetherWart,\n\tNetherWartBlock,\n\tNetheriteBlock,\n\tNetherrack,\n\tNoteBlock,\n\tOakButton,\n\tOakDoor,\n\tOakFence,\n\tOakFenceGate,\n\tOakLeaves,\n\tOakLog,\n\tOakPlanks,\n\tOakPressurePlate,\n\tOakSapling,\n\tOakSign,\n\tOakSlab,\n\tOakStairs,\n\tOakTrapdoor,\n\tOakWallSign,\n\tOakWood,\n\tObserver,\n\tObsidian,\n\tOrangeBanner,\n\tOrangeBed,\n\tOrangeCarpet,\n\tOrangeConcrete,\n\tOrangeConcretePowder,\n\tOrangeGlazedTerracotta,\n\tOrangeShulkerBox,\n\tOrangeStainedGlass,\n\tOrangeStainedGlassPane,\n\tOrangeTerracotta,\n\tOrangeTulip,\n\tOrangeWallBanner,\n\tOrangeWool,\n\tOxeyeDaisy,\n\tPackedIce,\n\tPeony,\n\tPetrifiedOakSlab,\n\tPinkBanner,\n\tPinkBed,\n\tPinkCarpet,\n\tPinkConcrete,\n\tPinkConcretePowder,\n\tPinkGlazedTerracotta,\n\tPinkShulkerBox,\n\tPinkStainedGlass,\n\tPinkStainedGlassPane,\n\tPinkTerracotta,\n\tPinkTulip,\n\tPinkWallBanner,\n\tPinkWool,\n\tPiston,\n\tPistonHead,\n\tPlayerHead,\n\tPlayerWallHead,\n\tPodzol,\n\tPolishedAndesite,\n\tPolishedAndesiteSlab,\n\tPolishedAndesiteStairs,\n\tPolishedBasalt,\n\tPolishedBlackstone,\n\tPolishedBlackstoneBrickSlab,\n\tPolishedBlackstoneBrickStairs,\n\tPolishedBlackstoneBrickWall,\n\tPolishedBlackstoneBricks,\n\tPolishedBlackstoneButton,\n\tPolishedBlackstonePressurePlate,\n\tPolishedBlackstoneSlab,\n\tPolishedBlackstoneStairs,\n\tPolishedBlackstoneWall,\n\tPolishedDiorite,\n\tPolishedDioriteSlab,\n\tPolishedDioriteStairs,\n\tPolishedGranite,\n\tPolishedGraniteSlab,\n\tPolishedGraniteStairs,\n\tPoppy,\n\tPotatoes,\n\tPottedAcaciaSapling,\n\tPottedAllium,\n\tPottedAzureBluet,\n\tPottedBamboo,\n\tPottedBirchSapling,\n\tPottedBlueOrchid,\n\tPottedBrownMushroom,\n\tPottedCactus,\n\tPottedCornflower,\n\tPottedCrimsonFungus,\n\tPottedCrimsonRoots,\n\tPottedDandelion,\n\tPottedDarkOakSapling,\n\tPottedDeadBush,\n\tPottedFern,\n\tPottedJungleSapling,\n\tPottedLilyOfTheValley,\n\tPottedOakSapling,\n\tPottedOrangeTulip,\n\tPottedOxeyeDaisy,\n\tPottedPinkTulip,\n\tPottedPoppy,\n\tPottedRedMushroom,\n\tPottedRedTulip,\n\tPottedSpruceSapling,\n\tPottedWarpedFungus,\n\tPottedWarpedRoots,\n\tPottedWhiteTulip,\n\tPottedWitherRose,\n\tPoweredRail,\n\tPrismarine,\n\tPrismarineBrickSlab,\n\tPrismarineBrickStairs,\n\tPrismarineBricks,\n\tPrismarineSlab,\n\tPrismarineStairs,\n\tPrismarineWall,\n\tPumpkin,\n\tPumpkinStem,\n\tPurpleBanner,\n\tPurpleBed,\n\tPurpleCarpet,\n\tPurpleConcrete,\n\tPurpleConcretePowder,\n\tPurpleGlazedTerracotta,\n\tPurpleShulkerBox,\n\tPurpleStainedGlass,\n\tPurpleStainedGlassPane,\n\tPurpleTerracotta,\n\tPurpleWallBanner,\n\tPurpleWool,\n\tPurpurBlock,\n\tPurpurPillar,\n\tPurpurSlab,\n\tPurpurStairs,\n\tQuartzBlock,\n\tQuartzBricks,\n\tQuartzPillar,\n\tQuartzSlab,\n\tQuartzStairs,\n\tRail,\n\tRedBanner,\n\tRedBed,\n\tRedCarpet,\n\tRedConcrete,\n\tRedConcretePowder,\n\tRedGlazedTerracotta,\n\tRedMushroom,\n\tRedMushroomBlock,\n\tRedNetherBrickSlab,\n\tRedNetherBrickStairs,\n\tRedNetherBrickWall,\n\tRedNetherBricks,\n\tRedSand,\n\tRedSandstone,\n\tRedSandstoneSlab,\n\tRedSandstoneStairs,\n\tRedSandstoneWall,\n\tRedShulkerBox,\n\tRedStainedGlass,\n\tRedStainedGlassPane,\n\tRedTerracotta,\n\tRedTulip,\n\tRedWallBanner,\n\tRedWool,\n\tRedstoneBlock,\n\tRedstoneLamp,\n\tRedstoneOre,\n\tRedstoneTorch,\n\tRedstoneWallTorch,\n\tRedstoneWire,\n\tRepeater,\n\tRepeatingCommandBlock,\n\tRespawnAnchor,\n\tRoseBush,\n\tSand,\n\tSandstone,\n\tSandstoneSlab,\n\tSandstoneStairs,\n\tSandstoneWall,\n\tScaffolding,\n\tSeaLantern,\n\tSeaPickle,\n\tSeagrass,\n\tShroomlight,\n\tShulkerBox,\n\tSkeletonSkull,\n\tSkeletonWallSkull,\n\tSlimeBlock,\n\tSmithingTable,\n\tSmoker,\n\tSmoothQuartz,\n\tSmoothQuartzSlab,\n\tSmoothQuartzStairs,\n\tSmoothRedSandstone,\n\tSmoothRedSandstoneSlab,\n\tSmoothRedSandstoneStairs,\n\tSmoothSandstone,\n\tSmoothSandstoneSlab,\n\tSmoothSandstoneStairs,\n\tSmoothStone,\n\tSmoothStoneSlab,\n\tSnow,\n\tSnowBlock,\n\tSoulCampfire,\n\tSoulFire,\n\tSoulLantern,\n\tSoulSand,\n\tSoulSoil,\n\tSoulTorch,\n\tSoulWallTorch,\n\tSpawner,\n\tSponge,\n\tSpruceButton,\n\tSpruceDoor,\n\tSpruceFence,\n\tSpruceFenceGate,\n\tSpruceLeaves,\n\tSpruceLog,\n\tSprucePlanks,\n\tSprucePressurePlate,\n\tSpruceSapling,\n\tSpruceSign,\n\tSpruceSlab,\n\tSpruceStairs,\n\tSpruceTrapdoor,\n\tSpruceWallSign,\n\tSpruceWood,\n\tStickyPiston,\n\tStone,\n\tStoneBrickSlab,\n\tStoneBrickStairs,\n\tStoneBrickWall,\n\tStoneBricks,\n\tStoneButton,\n\tStonePressurePlate,\n\tStoneSlab,\n\tStoneStairs,\n\tStonecutter,\n\tStrippedAcaciaLog,\n\tStrippedAcaciaWood,\n\tStrippedBirchLog,\n\tStrippedBirchWood,\n\tStrippedCrimsonHyphae,\n\tStrippedCrimsonStem,\n\tStrippedDarkOakLog,\n\tStrippedDarkOakWood,\n\tStrippedJungleLog,\n\tStrippedJungleWood,\n\tStrippedOakLog,\n\tStrippedOakWood,\n\tStrippedSpruceLog,\n\tStrippedSpruceWood,\n\tStrippedWarpedHyphae,\n\tStrippedWarpedStem,\n\tStructureBlock,\n\tStructureVoid,\n\tSugarCane,\n\tSunflower,\n\tSweetBerryBush,\n\tTNT,\n\tTallGrass,\n\tTallSeagrass,\n\tTarget,\n\tTerracotta,\n\tTorch,\n\tTrappedChest,\n\tTripwire,\n\tTripwireHook,\n\tTubeCoral,\n\tTubeCoralBlock,\n\tTubeCoralFan,\n\tTubeCoralWallFan,\n\tTurtleEgg,\n\tTwistingVines,\n\tTwistingVinesPlant,\n\tVine,\n\tVoidAir,\n\tWallTorch,\n\tWarpedButton,\n\tWarpedDoor,\n\tWarpedFence,\n\tWarpedFenceGate,\n\tWarpedFungus,\n\tWarpedHyphae,\n\tWarpedNylium,\n\tWarpedPlanks,\n\tWarpedPressurePlate,\n\tWarpedRoots,\n\tWarpedSign,\n\tWarpedSlab,\n\tWarpedStairs,\n\tWarpedStem,\n\tWarpedTrapdoor,\n\tWarpedWallSign,\n\tWarpedWartBlock,\n\tWater,\n\tWeepingVines,\n\tWeepingVinesPlant,\n\tWetSponge,\n\tWheat,\n\tWhiteBanner,\n\tWhiteBed,\n\tWhiteCarpet,\n\tWhiteConcrete,\n\tWhiteConcretePowder,\n\tWhiteGlazedTerracotta,\n\tWhiteShulkerBox,\n\tWhiteStainedGlass,\n\tWhiteStainedGlassPane,\n\tWhiteTerracotta,\n\tWhiteTulip,\n\tWhiteWallBanner,\n\tWhiteWool,\n\tWitherRose,\n\tWitherSkeletonSkull,\n\tWitherSkeletonWallSkull,\n\tYellowBanner,\n\tYellowBed,\n\tYellowCarpet,\n\tYellowConcrete,\n\tYellowConcretePowder,\n\tYellowGlazedTerracotta,\n\tYellowShulkerBox,\n\tYellowStainedGlass,\n\tYellowStainedGlassPane,\n\tYellowTerracotta,\n\tYellowWallBanner,\n\tYellowWool,\n\tZombieHead,\n\tZombieWallHead\n};\n"
  },
  {
    "path": "src/Registries/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tBlockStates.cpp\n\n\tBlockStates.h\n\tBlockTypes.h\n\tCustomStatistics.h\n\tItems.h\n)"
  },
  {
    "path": "src/Registries/CustomStatistics.h",
    "content": "#pragma once\n\n// tolua_begin\nenum class CustomStatistic\n{\n\t// tolua_end\n\n\t/* Achievements */\n\tAchOpenInventory,     /* Taking Inventory     */\n\tAchMineWood,          /* Getting Wood         */\n\tAchBuildWorkBench,    /* Benchmarking         */\n\tAchBuildPickaxe,      /* Time to Mine!        */\n\tAchBuildFurnace,      /* Hot Topic            */\n\tAchAcquireIron,       /* Acquire Hardware     */\n\tAchBuildHoe,          /* Time to Farm!        */\n\tAchMakeBread,         /* Bake Bread           */\n\tAchBakeCake,          /* The Lie              */\n\tAchBuildBetterPickaxe, /* Getting an Upgrade   */\n\tAchCookFish,          /* Delicious Fish       */\n\tAchOnARail,           /* On A Rail            */\n\tAchBuildSword,        /* Time to Strike!      */\n\tAchKillEnemy,         /* Monster Hunter       */\n\tAchKillCow,           /* Cow Tipper           */\n\tAchFlyPig,            /* When Pigs Fly        */\n\tAchSnipeSkeleton,     /* Sniper Duel          */\n\tAchDiamonds,          /* DIAMONDS!            */\n\tAchPortal,            /* We Need to Go Deeper */\n\tAchGhast,             /* Return to Sender     */\n\tAchBlazeRod,          /* Into Fire            */\n\tAchPotion,            /* Local Brewery        */\n\tAchTheEnd,            /* The End?             */\n\tAchTheEnd2,           /* The End.             */\n\tAchEnchantments,      /* Enchanter            */\n\tAchOverkill,          /* Overkill             */\n\tAchBookcase,          /* Librarian            */\n\tAchExploreAllBiomes,  /* Adventuring Time     */\n\tAchSpawnWither,       /* The Beginning?       */\n\tAchKillWither,        /* The Beginning.       */\n\tAchFullBeacon,        /* Beaconator           */\n\tAchBreedCow,          /* Repopulation         */\n\tAchDiamondsToYou,     /* Diamonds to you!     */\n\n\t// tolua_begin\n\n\t/* Statistics */\n\tAnimalsBred,\n\tAviateOneCm,\n\tBellRing,\n\tBoatOneCm,\n\tCleanArmor,\n\tCleanBanner,\n\tCleanShulkerBox,\n\tClimbOneCm,\n\tCrouchOneCm,\n\tDamageAbsorbed,\n\tDamageBlockedByShield,\n\tDamageDealt,\n\tDamageDealtAbsorbed,\n\tDamageDealtResisted,\n\tDamageResisted,\n\tDamageTaken,\n\tDeaths,\n\tDrop,\n\tEatCakeSlice,\n\tEnchantItem,\n\tFallOneCm,\n\tFillCauldron,\n\tFishCaught,\n\tFlyOneCm,\n\tHorseOneCm,\n\tInspectDispenser,\n\tInspectDropper,\n\tInspectHopper,\n\tInteractWithAnvil,\n\tInteractWithBeacon,\n\tInteractWithBlastFurnace,\n\tInteractWithBrewingstand,\n\tInteractWithCampfire,\n\tInteractWithCartographyTable,\n\tInteractWithCraftingTable,\n\tInteractWithFurnace,\n\tInteractWithGrindstone,\n\tInteractWithLectern,\n\tInteractWithLoom,\n\tInteractWithSmithingTable,\n\tInteractWithSmoker,\n\tInteractWithStonecutter,\n\tJump,\n\tLeaveGame,\n\tMinecartOneCm,\n\tMobKills,\n\tOpenBarrel,\n\tOpenChest,\n\tOpenEnderchest,\n\tOpenShulkerBox,\n\tPigOneCm,\n\tPlayNoteblock,\n\tPlayOneMinute,\n\tPlayRecord,\n\tPlayerKills,\n\tPotFlower,\n\tRaidTrigger,\n\tRaidWin,\n\tSleepInBed,\n\tSneakTime,\n\tSprintOneCm,\n\tStriderOneCm,\n\tSwimOneCm,\n\tTalkedToVillager,\n\tTargetHit,\n\tTimeSinceDeath,\n\tTimeSinceRest,\n\tTradedWithVillager,\n\tTriggerTrappedChest,\n\tTuneNoteblock,\n\tUseCauldron,\n\tWalkOnWaterOneCm,\n\tWalkOneCm,\n\tWalkUnderWaterOneCm,\n\n\t// Old ones just for compatibility\n\tJunkFished,\n\tTreasureFished,\n};\n// tolua_end\n"
  },
  {
    "path": "src/Registries/Items.h",
    "content": "#pragma once\n\nenum class Item\n{\n\tAcaciaBoat,\n\tAcaciaButton,\n\tAcaciaDoor,\n\tAcaciaFence,\n\tAcaciaFenceGate,\n\tAcaciaLeaves,\n\tAcaciaLog,\n\tAcaciaPlanks,\n\tAcaciaPressurePlate,\n\tAcaciaSapling,\n\tAcaciaSign,\n\tAcaciaSlab,\n\tAcaciaStairs,\n\tAcaciaTrapdoor,\n\tAcaciaWood,\n\tActivatorRail,\n\tAir,\n\tAllium,\n\tAncientDebris,\n\tAndesite,\n\tAndesiteSlab,\n\tAndesiteStairs,\n\tAndesiteWall,\n\tAnvil,\n\tApple,\n\tArmorStand,\n\tArrow,\n\tAzureBluet,\n\tBakedPotato,\n\tBamboo,\n\tBarrel,\n\tBarrier,\n\tBasalt,\n\tBatSpawnEgg,\n\tBeacon,\n\tBedrock,\n\tBeeNest,\n\tBeeSpawnEgg,\n\tBeef,\n\tBeehive,\n\tBeetroot,\n\tBeetrootSeeds,\n\tBeetrootSoup,\n\tBell,\n\tBirchBoat,\n\tBirchButton,\n\tBirchDoor,\n\tBirchFence,\n\tBirchFenceGate,\n\tBirchLeaves,\n\tBirchLog,\n\tBirchPlanks,\n\tBirchPressurePlate,\n\tBirchSapling,\n\tBirchSign,\n\tBirchSlab,\n\tBirchStairs,\n\tBirchTrapdoor,\n\tBirchWood,\n\tBlackBanner,\n\tBlackBed,\n\tBlackCarpet,\n\tBlackConcrete,\n\tBlackConcretePowder,\n\tBlackDye,\n\tBlackGlazedTerracotta,\n\tBlackShulkerBox,\n\tBlackStainedGlass,\n\tBlackStainedGlassPane,\n\tBlackTerracotta,\n\tBlackWool,\n\tBlackstone,\n\tBlackstoneSlab,\n\tBlackstoneStairs,\n\tBlackstoneWall,\n\tBlastFurnace,\n\tBlazePowder,\n\tBlazeRod,\n\tBlazeSpawnEgg,\n\tBlueBanner,\n\tBlueBed,\n\tBlueCarpet,\n\tBlueConcrete,\n\tBlueConcretePowder,\n\tBlueDye,\n\tBlueGlazedTerracotta,\n\tBlueIce,\n\tBlueOrchid,\n\tBlueShulkerBox,\n\tBlueStainedGlass,\n\tBlueStainedGlassPane,\n\tBlueTerracotta,\n\tBlueWool,\n\tBone,\n\tBoneBlock,\n\tBoneMeal,\n\tBook,\n\tBookshelf,\n\tBow,\n\tBowl,\n\tBrainCoral,\n\tBrainCoralBlock,\n\tBrainCoralFan,\n\tBread,\n\tBrewingStand,\n\tBrick,\n\tBrickSlab,\n\tBrickStairs,\n\tBrickWall,\n\tBricks,\n\tBrownBanner,\n\tBrownBed,\n\tBrownCarpet,\n\tBrownConcrete,\n\tBrownConcretePowder,\n\tBrownDye,\n\tBrownGlazedTerracotta,\n\tBrownMushroom,\n\tBrownMushroomBlock,\n\tBrownShulkerBox,\n\tBrownStainedGlass,\n\tBrownStainedGlassPane,\n\tBrownTerracotta,\n\tBrownWool,\n\tBubbleCoral,\n\tBubbleCoralBlock,\n\tBubbleCoralFan,\n\tBucket,\n\tCactus,\n\tCake,\n\tCampfire,\n\tCarrot,\n\tCarrotOnAStick,\n\tCartographyTable,\n\tCarvedPumpkin,\n\tCatSpawnEgg,\n\tCauldron,\n\tCaveSpiderSpawnEgg,\n\tChain,\n\tChainCommandBlock,\n\tChainmailBoots,\n\tChainmailChestplate,\n\tChainmailHelmet,\n\tChainmailLeggings,\n\tCharcoal,\n\tChest,\n\tChestMinecart,\n\tChicken,\n\tChickenSpawnEgg,\n\tChippedAnvil,\n\tChiseledNetherBricks,\n\tChiseledPolishedBlackstone,\n\tChiseledQuartzBlock,\n\tChiseledRedSandstone,\n\tChiseledSandstone,\n\tChiseledStoneBricks,\n\tChorusFlower,\n\tChorusFruit,\n\tChorusPlant,\n\tClay,\n\tClayBall,\n\tClock,\n\tCoal,\n\tCoalBlock,\n\tCoalOre,\n\tCoarseDirt,\n\tCobblestone,\n\tCobblestoneSlab,\n\tCobblestoneStairs,\n\tCobblestoneWall,\n\tCobweb,\n\tCocoaBeans,\n\tCod,\n\tCodBucket,\n\tCodSpawnEgg,\n\tCommandBlock,\n\tCommandBlockMinecart,\n\tComparator,\n\tCompass,\n\tComposter,\n\tConduit,\n\tCookedBeef,\n\tCookedChicken,\n\tCookedCod,\n\tCookedMutton,\n\tCookedPorkchop,\n\tCookedRabbit,\n\tCookedSalmon,\n\tCookie,\n\tCornflower,\n\tCowSpawnEgg,\n\tCrackedNetherBricks,\n\tCrackedPolishedBlackstoneBricks,\n\tCrackedStoneBricks,\n\tCraftingTable,\n\tCreeperBannerPattern,\n\tCreeperHead,\n\tCreeperSpawnEgg,\n\tCrimsonButton,\n\tCrimsonDoor,\n\tCrimsonFence,\n\tCrimsonFenceGate,\n\tCrimsonFungus,\n\tCrimsonHyphae,\n\tCrimsonNylium,\n\tCrimsonPlanks,\n\tCrimsonPressurePlate,\n\tCrimsonRoots,\n\tCrimsonSign,\n\tCrimsonSlab,\n\tCrimsonStairs,\n\tCrimsonStem,\n\tCrimsonTrapdoor,\n\tCrossbow,\n\tCryingObsidian,\n\tCutRedSandstone,\n\tCutRedSandstoneSlab,\n\tCutSandstone,\n\tCutSandstoneSlab,\n\tCyanBanner,\n\tCyanBed,\n\tCyanCarpet,\n\tCyanConcrete,\n\tCyanConcretePowder,\n\tCyanDye,\n\tCyanGlazedTerracotta,\n\tCyanShulkerBox,\n\tCyanStainedGlass,\n\tCyanStainedGlassPane,\n\tCyanTerracotta,\n\tCyanWool,\n\tDamagedAnvil,\n\tDandelion,\n\tDarkOakBoat,\n\tDarkOakButton,\n\tDarkOakDoor,\n\tDarkOakFence,\n\tDarkOakFenceGate,\n\tDarkOakLeaves,\n\tDarkOakLog,\n\tDarkOakPlanks,\n\tDarkOakPressurePlate,\n\tDarkOakSapling,\n\tDarkOakSign,\n\tDarkOakSlab,\n\tDarkOakStairs,\n\tDarkOakTrapdoor,\n\tDarkOakWood,\n\tDarkPrismarine,\n\tDarkPrismarineSlab,\n\tDarkPrismarineStairs,\n\tDaylightDetector,\n\tDeadBrainCoral,\n\tDeadBrainCoralBlock,\n\tDeadBrainCoralFan,\n\tDeadBubbleCoral,\n\tDeadBubbleCoralBlock,\n\tDeadBubbleCoralFan,\n\tDeadBush,\n\tDeadFireCoral,\n\tDeadFireCoralBlock,\n\tDeadFireCoralFan,\n\tDeadHornCoral,\n\tDeadHornCoralBlock,\n\tDeadHornCoralFan,\n\tDeadTubeCoral,\n\tDeadTubeCoralBlock,\n\tDeadTubeCoralFan,\n\tDebugStick,\n\tDetectorRail,\n\tDiamond,\n\tDiamondAxe,\n\tDiamondBlock,\n\tDiamondBoots,\n\tDiamondChestplate,\n\tDiamondHelmet,\n\tDiamondHoe,\n\tDiamondHorseArmor,\n\tDiamondLeggings,\n\tDiamondOre,\n\tDiamondPickaxe,\n\tDiamondShovel,\n\tDiamondSword,\n\tDiorite,\n\tDioriteSlab,\n\tDioriteStairs,\n\tDioriteWall,\n\tDirt,\n\tDispenser,\n\tDolphinSpawnEgg,\n\tDonkeySpawnEgg,\n\tDragonBreath,\n\tDragonEgg,\n\tDragonHead,\n\tDriedKelp,\n\tDriedKelpBlock,\n\tDropper,\n\tDrownedSpawnEgg,\n\tEgg,\n\tElderGuardianSpawnEgg,\n\tElytra,\n\tEmerald,\n\tEmeraldBlock,\n\tEmeraldOre,\n\tEnchantedBook,\n\tEnchantedGoldenApple,\n\tEnchantingTable,\n\tEndCrystal,\n\tEndPortalFrame,\n\tEndRod,\n\tEndStone,\n\tEndStoneBrickSlab,\n\tEndStoneBrickStairs,\n\tEndStoneBrickWall,\n\tEndStoneBricks,\n\tEnderChest,\n\tEnderEye,\n\tEnderPearl,\n\tEndermanSpawnEgg,\n\tEndermiteSpawnEgg,\n\tEvokerSpawnEgg,\n\tExperienceBottle,\n\tFarmland,\n\tFeather,\n\tFermentedSpiderEye,\n\tFern,\n\tFilledMap,\n\tFireCharge,\n\tFireCoral,\n\tFireCoralBlock,\n\tFireCoralFan,\n\tFireworkRocket,\n\tFireworkStar,\n\tFishingRod,\n\tFletchingTable,\n\tFlint,\n\tFlintAndSteel,\n\tFlowerBannerPattern,\n\tFlowerPot,\n\tFoxSpawnEgg,\n\tFurnace,\n\tFurnaceMinecart,\n\tGhastSpawnEgg,\n\tGhastTear,\n\tGildedBlackstone,\n\tGlass,\n\tGlassBottle,\n\tGlassPane,\n\tGlisteringMelonSlice,\n\tGlobeBannerPattern,\n\tGlowstone,\n\tGlowstoneDust,\n\tGoldBlock,\n\tGoldIngot,\n\tGoldNugget,\n\tGoldOre,\n\tGoldenApple,\n\tGoldenAxe,\n\tGoldenBoots,\n\tGoldenCarrot,\n\tGoldenChestplate,\n\tGoldenHelmet,\n\tGoldenHoe,\n\tGoldenHorseArmor,\n\tGoldenLeggings,\n\tGoldenPickaxe,\n\tGoldenShovel,\n\tGoldenSword,\n\tGranite,\n\tGraniteSlab,\n\tGraniteStairs,\n\tGraniteWall,\n\tGrass,\n\tGrassBlock,\n\tGrassPath,\n\tGravel,\n\tGrayBanner,\n\tGrayBed,\n\tGrayCarpet,\n\tGrayConcrete,\n\tGrayConcretePowder,\n\tGrayDye,\n\tGrayGlazedTerracotta,\n\tGrayShulkerBox,\n\tGrayStainedGlass,\n\tGrayStainedGlassPane,\n\tGrayTerracotta,\n\tGrayWool,\n\tGreenBanner,\n\tGreenBed,\n\tGreenCarpet,\n\tGreenConcrete,\n\tGreenConcretePowder,\n\tGreenDye,\n\tGreenGlazedTerracotta,\n\tGreenShulkerBox,\n\tGreenStainedGlass,\n\tGreenStainedGlassPane,\n\tGreenTerracotta,\n\tGreenWool,\n\tGrindstone,\n\tGuardianSpawnEgg,\n\tGunpowder,\n\tHayBale,\n\tHeartOfTheSea,\n\tHeavyWeightedPressurePlate,\n\tHoglinSpawnEgg,\n\tHoneyBlock,\n\tHoneyBottle,\n\tHoneycomb,\n\tHoneycombBlock,\n\tHopper,\n\tHopperMinecart,\n\tHornCoral,\n\tHornCoralBlock,\n\tHornCoralFan,\n\tHorseSpawnEgg,\n\tHuskSpawnEgg,\n\tIce,\n\tInfestedChiseledStoneBricks,\n\tInfestedCobblestone,\n\tInfestedCrackedStoneBricks,\n\tInfestedMossyStoneBricks,\n\tInfestedStone,\n\tInfestedStoneBricks,\n\tInkSac,\n\tIronAxe,\n\tIronBars,\n\tIronBlock,\n\tIronBoots,\n\tIronChestplate,\n\tIronDoor,\n\tIronHelmet,\n\tIronHoe,\n\tIronHorseArmor,\n\tIronIngot,\n\tIronLeggings,\n\tIronNugget,\n\tIronOre,\n\tIronPickaxe,\n\tIronShovel,\n\tIronSword,\n\tIronTrapdoor,\n\tItemFrame,\n\tJackOLantern,\n\tJigsaw,\n\tJukebox,\n\tJungleBoat,\n\tJungleButton,\n\tJungleDoor,\n\tJungleFence,\n\tJungleFenceGate,\n\tJungleLeaves,\n\tJungleLog,\n\tJunglePlanks,\n\tJunglePressurePlate,\n\tJungleSapling,\n\tJungleSign,\n\tJungleSlab,\n\tJungleStairs,\n\tJungleTrapdoor,\n\tJungleWood,\n\tKelp,\n\tKnowledgeBook,\n\tLadder,\n\tLantern,\n\tLapisBlock,\n\tLapisLazuli,\n\tLapisOre,\n\tLargeFern,\n\tLavaBucket,\n\tLead,\n\tLeather,\n\tLeatherBoots,\n\tLeatherChestplate,\n\tLeatherHelmet,\n\tLeatherHorseArmor,\n\tLeatherLeggings,\n\tLectern,\n\tLever,\n\tLightBlueBanner,\n\tLightBlueBed,\n\tLightBlueCarpet,\n\tLightBlueConcrete,\n\tLightBlueConcretePowder,\n\tLightBlueDye,\n\tLightBlueGlazedTerracotta,\n\tLightBlueShulkerBox,\n\tLightBlueStainedGlass,\n\tLightBlueStainedGlassPane,\n\tLightBlueTerracotta,\n\tLightBlueWool,\n\tLightGrayBanner,\n\tLightGrayBed,\n\tLightGrayCarpet,\n\tLightGrayConcrete,\n\tLightGrayConcretePowder,\n\tLightGrayDye,\n\tLightGrayGlazedTerracotta,\n\tLightGrayShulkerBox,\n\tLightGrayStainedGlass,\n\tLightGrayStainedGlassPane,\n\tLightGrayTerracotta,\n\tLightGrayWool,\n\tLightWeightedPressurePlate,\n\tLilac,\n\tLilyOfTheValley,\n\tLilyPad,\n\tLimeBanner,\n\tLimeBed,\n\tLimeCarpet,\n\tLimeConcrete,\n\tLimeConcretePowder,\n\tLimeDye,\n\tLimeGlazedTerracotta,\n\tLimeShulkerBox,\n\tLimeStainedGlass,\n\tLimeStainedGlassPane,\n\tLimeTerracotta,\n\tLimeWool,\n\tLingeringPotion,\n\tLlamaSpawnEgg,\n\tLodestone,\n\tLoom,\n\tMagentaBanner,\n\tMagentaBed,\n\tMagentaCarpet,\n\tMagentaConcrete,\n\tMagentaConcretePowder,\n\tMagentaDye,\n\tMagentaGlazedTerracotta,\n\tMagentaShulkerBox,\n\tMagentaStainedGlass,\n\tMagentaStainedGlassPane,\n\tMagentaTerracotta,\n\tMagentaWool,\n\tMagmaBlock,\n\tMagmaCream,\n\tMagmaCubeSpawnEgg,\n\tMap,\n\tMelon,\n\tMelonSeeds,\n\tMelonSlice,\n\tMilkBucket,\n\tMinecart,\n\tMojangBannerPattern,\n\tMooshroomSpawnEgg,\n\tMossyCobblestone,\n\tMossyCobblestoneSlab,\n\tMossyCobblestoneStairs,\n\tMossyCobblestoneWall,\n\tMossyStoneBrickSlab,\n\tMossyStoneBrickStairs,\n\tMossyStoneBrickWall,\n\tMossyStoneBricks,\n\tMuleSpawnEgg,\n\tMushroomStem,\n\tMushroomStew,\n\tMusicDiscBlocks,\n\tMusicDiscCat,\n\tMusicDiscChirp,\n\tMusicDiscFar,\n\tMusicDiscMall,\n\tMusicDiscMellohi,\n\tMusicDiscPigstep,\n\tMusicDiscStal,\n\tMusicDiscStrad,\n\tMusicDiscWait,\n\tMusicDiscWard,\n\tMusicDisc11,\n\tMusicDisc13,\n\tMutton,\n\tMycelium,\n\tNameTag,\n\tNautilusShell,\n\tNetherBrick,\n\tNetherBrickFence,\n\tNetherBrickSlab,\n\tNetherBrickStairs,\n\tNetherBrickWall,\n\tNetherBricks,\n\tNetherGoldOre,\n\tNetherQuartzOre,\n\tNetherSprouts,\n\tNetherStar,\n\tNetherWart,\n\tNetherWartBlock,\n\tNetheriteAxe,\n\tNetheriteBlock,\n\tNetheriteBoots,\n\tNetheriteChestplate,\n\tNetheriteHelmet,\n\tNetheriteHoe,\n\tNetheriteIngot,\n\tNetheriteLeggings,\n\tNetheritePickaxe,\n\tNetheriteScrap,\n\tNetheriteShovel,\n\tNetheriteSword,\n\tNetherrack,\n\tNoteBlock,\n\tOakBoat,\n\tOakButton,\n\tOakDoor,\n\tOakFence,\n\tOakFenceGate,\n\tOakLeaves,\n\tOakLog,\n\tOakPlanks,\n\tOakPressurePlate,\n\tOakSapling,\n\tOakSign,\n\tOakSlab,\n\tOakStairs,\n\tOakTrapdoor,\n\tOakWood,\n\tObserver,\n\tObsidian,\n\tOcelotSpawnEgg,\n\tOrangeBanner,\n\tOrangeBed,\n\tOrangeCarpet,\n\tOrangeConcrete,\n\tOrangeConcretePowder,\n\tOrangeDye,\n\tOrangeGlazedTerracotta,\n\tOrangeShulkerBox,\n\tOrangeStainedGlass,\n\tOrangeStainedGlassPane,\n\tOrangeTerracotta,\n\tOrangeTulip,\n\tOrangeWool,\n\tOxeyeDaisy,\n\tPackedIce,\n\tPainting,\n\tPandaSpawnEgg,\n\tPaper,\n\tParrotSpawnEgg,\n\tPeony,\n\tPetrifiedOakSlab,\n\tPhantomMembrane,\n\tPhantomSpawnEgg,\n\tPigSpawnEgg,\n\tPiglinBannerPattern,\n\tPiglinSpawnEgg,\n\tPillagerSpawnEgg,\n\tPinkBanner,\n\tPinkBed,\n\tPinkCarpet,\n\tPinkConcrete,\n\tPinkConcretePowder,\n\tPinkDye,\n\tPinkGlazedTerracotta,\n\tPinkShulkerBox,\n\tPinkStainedGlass,\n\tPinkStainedGlassPane,\n\tPinkTerracotta,\n\tPinkTulip,\n\tPinkWool,\n\tPiston,\n\tPlayerHead,\n\tPodzol,\n\tPoisonousPotato,\n\tPolarBearSpawnEgg,\n\tPolishedAndesite,\n\tPolishedAndesiteSlab,\n\tPolishedAndesiteStairs,\n\tPolishedBasalt,\n\tPolishedBlackstone,\n\tPolishedBlackstoneBrickSlab,\n\tPolishedBlackstoneBrickStairs,\n\tPolishedBlackstoneBrickWall,\n\tPolishedBlackstoneBricks,\n\tPolishedBlackstoneButton,\n\tPolishedBlackstonePressurePlate,\n\tPolishedBlackstoneSlab,\n\tPolishedBlackstoneStairs,\n\tPolishedBlackstoneWall,\n\tPolishedDiorite,\n\tPolishedDioriteSlab,\n\tPolishedDioriteStairs,\n\tPolishedGranite,\n\tPolishedGraniteSlab,\n\tPolishedGraniteStairs,\n\tPoppedChorusFruit,\n\tPoppy,\n\tPorkchop,\n\tPotato,\n\tPotion,\n\tPoweredRail,\n\tPrismarine,\n\tPrismarineBrickSlab,\n\tPrismarineBrickStairs,\n\tPrismarineBricks,\n\tPrismarineCrystals,\n\tPrismarineShard,\n\tPrismarineSlab,\n\tPrismarineStairs,\n\tPrismarineWall,\n\tPufferfish,\n\tPufferfishBucket,\n\tPufferfishSpawnEgg,\n\tPumpkin,\n\tPumpkinPie,\n\tPumpkinSeeds,\n\tPurpleBanner,\n\tPurpleBed,\n\tPurpleCarpet,\n\tPurpleConcrete,\n\tPurpleConcretePowder,\n\tPurpleDye,\n\tPurpleGlazedTerracotta,\n\tPurpleShulkerBox,\n\tPurpleStainedGlass,\n\tPurpleStainedGlassPane,\n\tPurpleTerracotta,\n\tPurpleWool,\n\tPurpurBlock,\n\tPurpurPillar,\n\tPurpurSlab,\n\tPurpurStairs,\n\tQuartz,\n\tQuartzBlock,\n\tQuartzBricks,\n\tQuartzPillar,\n\tQuartzSlab,\n\tQuartzStairs,\n\tRabbit,\n\tRabbitFoot,\n\tRabbitHide,\n\tRabbitSpawnEgg,\n\tRabbitStew,\n\tRail,\n\tRavagerSpawnEgg,\n\tRedBanner,\n\tRedBed,\n\tRedCarpet,\n\tRedConcrete,\n\tRedConcretePowder,\n\tRedDye,\n\tRedGlazedTerracotta,\n\tRedMushroom,\n\tRedMushroomBlock,\n\tRedNetherBrickSlab,\n\tRedNetherBrickStairs,\n\tRedNetherBrickWall,\n\tRedNetherBricks,\n\tRedSand,\n\tRedSandstone,\n\tRedSandstoneSlab,\n\tRedSandstoneStairs,\n\tRedSandstoneWall,\n\tRedShulkerBox,\n\tRedStainedGlass,\n\tRedStainedGlassPane,\n\tRedTerracotta,\n\tRedTulip,\n\tRedWool,\n\tRedstone,\n\tRedstoneBlock,\n\tRedstoneLamp,\n\tRedstoneOre,\n\tRedstoneTorch,\n\tRepeater,\n\tRepeatingCommandBlock,\n\tRespawnAnchor,\n\tRoseBush,\n\tRottenFlesh,\n\tSaddle,\n\tSalmon,\n\tSalmonBucket,\n\tSalmonSpawnEgg,\n\tSand,\n\tSandstone,\n\tSandstoneSlab,\n\tSandstoneStairs,\n\tSandstoneWall,\n\tScaffolding,\n\tScute,\n\tSeaLantern,\n\tSeaPickle,\n\tSeagrass,\n\tShears,\n\tSheepSpawnEgg,\n\tShield,\n\tShroomlight,\n\tShulkerBox,\n\tShulkerShell,\n\tShulkerSpawnEgg,\n\tSilverfishSpawnEgg,\n\tSkeletonHorseSpawnEgg,\n\tSkeletonSkull,\n\tSkeletonSpawnEgg,\n\tSkullBannerPattern,\n\tSlimeBall,\n\tSlimeBlock,\n\tSlimeSpawnEgg,\n\tSmithingTable,\n\tSmoker,\n\tSmoothQuartz,\n\tSmoothQuartzSlab,\n\tSmoothQuartzStairs,\n\tSmoothRedSandstone,\n\tSmoothRedSandstoneSlab,\n\tSmoothRedSandstoneStairs,\n\tSmoothSandstone,\n\tSmoothSandstoneSlab,\n\tSmoothSandstoneStairs,\n\tSmoothStone,\n\tSmoothStoneSlab,\n\tSnow,\n\tSnowBlock,\n\tSnowball,\n\tSoulCampfire,\n\tSoulLantern,\n\tSoulSand,\n\tSoulSoil,\n\tSoulTorch,\n\tSpawner,\n\tSpectralArrow,\n\tSpiderEye,\n\tSpiderSpawnEgg,\n\tSplashPotion,\n\tSponge,\n\tSpruceBoat,\n\tSpruceButton,\n\tSpruceDoor,\n\tSpruceFence,\n\tSpruceFenceGate,\n\tSpruceLeaves,\n\tSpruceLog,\n\tSprucePlanks,\n\tSprucePressurePlate,\n\tSpruceSapling,\n\tSpruceSign,\n\tSpruceSlab,\n\tSpruceStairs,\n\tSpruceTrapdoor,\n\tSpruceWood,\n\tSquidSpawnEgg,\n\tStick,\n\tStickyPiston,\n\tStone,\n\tStoneAxe,\n\tStoneBrickSlab,\n\tStoneBrickStairs,\n\tStoneBrickWall,\n\tStoneBricks,\n\tStoneButton,\n\tStoneHoe,\n\tStonePickaxe,\n\tStonePressurePlate,\n\tStoneShovel,\n\tStoneSlab,\n\tStoneStairs,\n\tStoneSword,\n\tStonecutter,\n\tStraySpawnEgg,\n\tStriderSpawnEgg,\n\tString,\n\tStrippedAcaciaLog,\n\tStrippedAcaciaWood,\n\tStrippedBirchLog,\n\tStrippedBirchWood,\n\tStrippedCrimsonHyphae,\n\tStrippedCrimsonStem,\n\tStrippedDarkOakLog,\n\tStrippedDarkOakWood,\n\tStrippedJungleLog,\n\tStrippedJungleWood,\n\tStrippedOakLog,\n\tStrippedOakWood,\n\tStrippedSpruceLog,\n\tStrippedSpruceWood,\n\tStrippedWarpedHyphae,\n\tStrippedWarpedStem,\n\tStructureBlock,\n\tStructureVoid,\n\tSugar,\n\tSugarCane,\n\tSunflower,\n\tSuspiciousStew,\n\tSweetBerries,\n\tTallGrass,\n\tTarget,\n\tTerracotta,\n\tTippedArrow,\n\tTNT,\n\tTNTMinecart,\n\tTorch,\n\tTotemOfUndying,\n\tTraderLlamaSpawnEgg,\n\tTrappedChest,\n\tTrident,\n\tTripwireHook,\n\tTropicalFish,\n\tTropicalFishBucket,\n\tTropicalFishSpawnEgg,\n\tTubeCoral,\n\tTubeCoralBlock,\n\tTubeCoralFan,\n\tTurtleEgg,\n\tTurtleHelmet,\n\tTurtleSpawnEgg,\n\tTwistingVines,\n\tVexSpawnEgg,\n\tVillagerSpawnEgg,\n\tVindicatorSpawnEgg,\n\tVine,\n\tWanderingTraderSpawnEgg,\n\tWarpedButton,\n\tWarpedDoor,\n\tWarpedFence,\n\tWarpedFenceGate,\n\tWarpedFungus,\n\tWarpedFungusOnA_stick,\n\tWarpedHyphae,\n\tWarpedNylium,\n\tWarpedPlanks,\n\tWarpedPressurePlate,\n\tWarpedRoots,\n\tWarpedSign,\n\tWarpedSlab,\n\tWarpedStairs,\n\tWarpedStem,\n\tWarpedTrapdoor,\n\tWarpedWartBlock,\n\tWaterBucket,\n\tWeepingVines,\n\tWetSponge,\n\tWheat,\n\tWheatSeeds,\n\tWhiteBanner,\n\tWhiteBed,\n\tWhiteCarpet,\n\tWhiteConcrete,\n\tWhiteConcretePowder,\n\tWhiteDye,\n\tWhiteGlazedTerracotta,\n\tWhiteShulkerBox,\n\tWhiteStainedGlass,\n\tWhiteStainedGlassPane,\n\tWhiteTerracotta,\n\tWhiteTulip,\n\tWhiteWool,\n\tWitchSpawnEgg,\n\tWitherRose,\n\tWitherSkeletonSkull,\n\tWitherSkeletonSpawnEgg,\n\tWolfSpawnEgg,\n\tWoodenAxe,\n\tWoodenHoe,\n\tWoodenPickaxe,\n\tWoodenShovel,\n\tWoodenSword,\n\tWritableBook,\n\tWrittenBook,\n\tYellowBanner,\n\tYellowBed,\n\tYellowCarpet,\n\tYellowConcrete,\n\tYellowConcretePowder,\n\tYellowDye,\n\tYellowGlazedTerracotta,\n\tYellowShulkerBox,\n\tYellowStainedGlass,\n\tYellowStainedGlassPane,\n\tYellowTerracotta,\n\tYellowWool,\n\tZoglinSpawnEgg,\n\tZombieHead,\n\tZombieHorseSpawnEgg,\n\tZombieSpawnEgg,\n\tZombieVillagerSpawnEgg,\n\tZombiePigmanSpawnEgg\n};\n"
  },
  {
    "path": "src/Resources/Cuberite.rc",
    "content": "#pragma code_page(65001) // UTF-8\r\n\r\n#include \"winres.h\"\r\n\r\nFavicon ICON \"icon.ico\"\r\n\r\nSTRINGTABLE\r\n\tLANGUAGE LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED\r\nBEGIN\r\n\t1 \"Cuberite\"\r\n\t2 \"一个轻巧、快速、可扩展的Minecraftf游戏服务器\"\r\nEND\r\n\r\nSTRINGTABLE\r\n\tLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK\r\nBEGIN\r\n\t1 \"Cuberite\"\r\n\t2 \"A lightweight, fast and extensible game server for Minecraft\"\r\nEND\r\n\r\n#define VERSION 1,3,3,7\r\n#define VERSION_STRING \"1.3.3.7\"\r\n#define INTERNAL_NAME \"MCServer\"\r\n#define ORIGINAL_FILENAME \"Cuberite.exe\"\r\n\r\n#ifdef NDEBUG\r\n#define FILE_FLAGS 0\r\n#else\r\n#define FILE_FLAGS VS_FF_DEBUG\r\n#endif\r\n\r\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK\r\nVS_VERSION_INFO VERSIONINFO\r\n\tFILEVERSION VERSION\r\n\tPRODUCTVERSION VERSION\r\n\tFILEFLAGSMASK 0x3fL\r\n\tFILEFLAGS FILE_FLAGS\r\n\tFILEOS 0x40004L\r\n\tFILETYPE VFT_APP\r\n\tFILESUBTYPE 0\r\nBEGIN\r\n\tBLOCK \"StringFileInfo\"\r\n\tBEGIN\r\n\t\tBLOCK \"080904B0\"\r\n\t\tBEGIN\r\n\t\t\tVALUE \"CompanyName\", \"Cuberite Contributors\"\r\n\t\t\tVALUE \"FileDescription\", \"Cuberite\"\r\n\t\t\tVALUE \"FileVersion\", VERSION_STRING\r\n\t\t\tVALUE \"InternalName\", INTERNAL_NAME\r\n\t\t\tVALUE \"OriginalFilename\", ORIGINAL_FILENAME\r\n\t\t\tVALUE \"ProductName\", \"Cuberite\"\r\n\t\t\tVALUE \"ProductVersion\", VERSION_STRING\r\n\t\tEND\r\n\tEND\r\n\tBLOCK \"VarFileInfo\"\r\n\tBEGIN\r\n\t\tVALUE \"Translation\", 0x0809,1200, 0x0804,1200\r\n\tEND\r\nEND\r\n\r\nLANGUAGE LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED\r\nVS_VERSION_INFO VERSIONINFO\r\n\tFILEVERSION VERSION\r\n\tPRODUCTVERSION VERSION\r\n\tFILEFLAGSMASK 0x3fL\r\n\tFILEFLAGS FILE_FLAGS\r\n\tFILEOS 0x40004L\r\n\tFILETYPE VFT_APP\r\n\tFILESUBTYPE 0\r\nBEGIN\r\n\tBLOCK \"StringFileInfo\"\r\n\tBEGIN\r\n\t\tBLOCK \"080404B0\"\r\n\t\tBEGIN\r\n\t\t\tVALUE \"CompanyName\", \"Cuberite 作者\"\r\n\t\t\tVALUE \"FileDescription\", \"Cuberite\"\r\n\t\t\tVALUE \"FileVersion\", VERSION_STRING\r\n\t\t\tVALUE \"InternalName\", INTERNAL_NAME\r\n\t\t\tVALUE \"OriginalFilename\", ORIGINAL_FILENAME\r\n\t\t\tVALUE \"ProductName\", \"Cuberite\"\r\n\t\t\tVALUE \"ProductVersion\", VERSION_STRING\r\n\t\tEND\r\n\tEND\r\n\tBLOCK \"VarFileInfo\"\r\n\tBEGIN\r\n\t\tVALUE \"Translation\", 0x0804,1200, 0x0809,1200\r\n\tEND\r\nEND\r\n"
  },
  {
    "path": "src/Root.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Root.h\"\n#include \"main.h\"\n\n// STD lib hreaders:\n#include <iostream>\n\n// OS-specific headers:\n#if defined(_WIN32)\n\t#include <psapi.h>\n#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))\n\t#include <signal.h>\n\t#if defined(__linux__)\n\t\t#include <fstream>\n\n\t\t#if !defined(__GLIBC__)\n\t\t\t#include <sys/select.h>\n\t\t#endif\n\t#elif defined(__APPLE__)\n\t\t#include <mach/mach.h>\n\t#elif defined(__FreeBSD__)\n\t\t#include <kvm.h>\n\t\t#include <fcntl.h>\n\t\t#include <sys/sysctl.h>\n\t\t#include <sys/user.h>\n\t#endif\n#endif\n\n#include \"Server.h\"\n#include \"World.h\"\n#include \"WebAdmin.h\"\n#include \"BrewingRecipes.h\"\n#include \"FurnaceRecipe.h\"\n#include \"CraftingRecipes.h\"\n#include \"Protocol/RecipeMapper.h\"\n#include \"Bindings/PluginManager.h\"\n#include \"MonsterConfig.h\"\n#include \"Entities/Player.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"Items/ItemHandler.h\"\n#include \"Chunk.h\"\n#include \"Protocol/ProtocolRecognizer.h\"  // for protocol version constants\n#include \"CommandOutput.h\"\n#include \"DeadlockDetect.h\"\n#include \"LoggerListeners.h\"\n#include \"BuildInfo.h\"\n#include \"IniFile.h\"\n#include \"OverridesSettingsRepository.h\"\n#include \"Logger.h\"\n#include \"ClientHandle.h\"\n\n\n\n\n\n#ifdef __clang__\n\t#pragma clang diagnostic push\n\t#pragma clang diagnostic ignored \"-Wglobal-constructors\"\n#endif\n\ndecltype(cRoot::s_Root)      cRoot::s_Root;\ndecltype(cRoot::s_NextState) cRoot::s_NextState;\ndecltype(cRoot::s_StopEvent) cRoot::s_StopEvent;\n\n#ifdef __clang__\n\t#pragma clang diagnostic pop\n#endif\n\n\n\n\n\ncRoot::cRoot(void) :\n\tm_pDefaultWorld(nullptr),\n\tm_Server(nullptr),\n\tm_MonsterConfig(nullptr),\n\tm_CraftingRecipes(nullptr),\n\tm_FurnaceRecipe(nullptr),\n\tm_BrewingRecipes(nullptr),\n\tm_WebAdmin(nullptr),\n\tm_PluginManager(nullptr),\n\tm_MojangAPI(nullptr)\n{\n\ts_Root = this;\n\tTransitionNextState(NextState::Run);\n}\n\n\n\n\n\ncRoot::~cRoot()\n{\n\ts_Root = nullptr;\n}\n\n\n\n\n\nbool cRoot::Run(cSettingsRepositoryInterface & a_OverridesRepo)\n{\n\tauto consoleLogListener = MakeConsoleListener(g_RunAsService);\n\tauto consoleAttachment = cLogger::GetInstance().AttachListener(std::move(consoleLogListener));\n\n\tcLogger::cAttachment fileAttachment;\n\tif (!a_OverridesRepo.HasValue(\"Server\",\"DisableLogFile\"))\n\t{\n\t\tauto fileLogListenerRet = MakeFileListener();\n\t\tif (!fileLogListenerRet.first)\n\t\t{\n\t\t\tthrow std::runtime_error(\"failed to open log file\");\n\t\t}\n\t\tfileAttachment = cLogger::GetInstance().AttachListener(std::move(fileLogListenerRet.second));\n\t}\n\n\tLOG(\"--- Started Log ---\");\n\n#ifdef BUILD_ID\n\tLOG(\"Cuberite \" BUILD_SERIES_NAME \" (id: \" BUILD_ID \")\");\n\tLOG(\"from commit \" BUILD_COMMIT_ID \" built at: \" BUILD_DATETIME);\n#endif\n\n\tcDeadlockDetect dd;\n\tauto BeginTime = std::chrono::steady_clock::now();\n\n\tLoadGlobalSettings();\n\n\tLOG(\"Creating new server instance...\");\n\tm_Server = new cServer();\n\n\tLOG(\"Reading server config...\");\n\n\tm_SettingsFilename = \"settings.ini\";\n\tif (a_OverridesRepo.HasValue(\"Server\",\"ConfigFile\"))\n\t{\n\t\tm_SettingsFilename = a_OverridesRepo.GetValue(\"Server\",\"ConfigFile\");\n\t}\n\n\tauto IniFile = std::make_unique<cIniFile>();\n\tbool IsNewIniFile = !IniFile->ReadFile(m_SettingsFilename);\n\n\tif (IsNewIniFile)\n\t{\n\t\tLOGWARN(\"Regenerating settings.ini, all settings will be reset\");\n\t\tIniFile->AddHeaderComment(\" This is the main server configuration\");\n\t\tIniFile->AddHeaderComment(\" Most of the settings here can be configured using the webadmin interface, if enabled in webadmin.ini\");\n\t}\n\n\tauto settingsRepo = std::make_unique<cOverridesSettingsRepository>(std::move(IniFile), a_OverridesRepo);\n\n\tLOG(\"Starting server...\");\n\n\t// cClientHandle::FASTBREAK_PERCENTAGE = settingsRepo->GetValueSetI(\"AntiCheat\", \"FastBreakPercentage\", 97) / 100.0f;\n\tcClientHandle::FASTBREAK_PERCENTAGE = 0;  // AntiCheat disabled due to bugs. We will enabled it once they are fixed. See #3506.\n\n\tm_MojangAPI = new cMojangAPI;\n\tbool ShouldAuthenticate = settingsRepo->GetValueSetB(\"Authentication\", \"Authenticate\", true);\n\tm_MojangAPI->Start(*settingsRepo, ShouldAuthenticate);  // Mojang API needs to be started before plugins, so that plugins may use it for DB upgrades on server init\n\tif (!m_Server->InitServer(*settingsRepo, ShouldAuthenticate))\n\t{\n\t\tsettingsRepo->Flush();\n\t\tthrow std::runtime_error(\"failure starting server\");\n\t}\n\n\tm_WebAdmin = new cWebAdmin();\n\tm_WebAdmin->Init();\n\n\tLOGD(\"Loading settings...\");\n\tm_RankManager.reset(new cRankManager());\n\tm_RankManager->Initialize(*m_MojangAPI);\n\tm_CraftingRecipes = new cCraftingRecipes();\n\tm_RecipeMapper.reset(new cRecipeMapper());\n\tm_FurnaceRecipe   = new cFurnaceRecipe();\n\tm_BrewingRecipes.reset(new cBrewingRecipes());\n\n\tLOGD(\"Loading worlds...\");\n\tLoadWorlds(dd, *settingsRepo, IsNewIniFile);\n\n\tLOGD(\"Loading plugin manager...\");\n\tm_PluginManager = new cPluginManager(dd);\n\tm_PluginManager->ReloadPluginsNow(*settingsRepo);\n\n\tLOGD(\"Loading MonsterConfig...\");\n\tm_MonsterConfig = new cMonsterConfig;\n\n\t// This sets stuff in motion\n\tLOGD(\"Starting Authenticator...\");\n\tm_Authenticator.Start(*settingsRepo);\n\n\tLOGD(\"Starting worlds...\");\n\tStartWorlds(dd);\n\n\tif (settingsRepo->GetValueSetB(\"DeadlockDetect\", \"Enabled\", true))\n\t{\n\t\tLOGD(\"Starting deadlock detector...\");\n\t\tdd.Start(settingsRepo->GetValueSetI(\"DeadlockDetect\", \"IntervalSec\", 20));\n\t}\n\n\tsettingsRepo->Flush();\n\n\tLOGD(\"Finalising startup...\");\n\tif (m_Server->Start())\n\t{\n\t\tm_WebAdmin->Start();\n\n\t\tLOG(\"Startup complete, took %ldms!\", static_cast<long int>(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - BeginTime).count()));\n\n\t\t// Save the current time\n\t\tm_StartTime = std::chrono::steady_clock::now();\n\n\t\tHandleInput();\n\n\t\ts_StopEvent.Wait();\n\n\t\t// Stop the server:\n\t\tm_WebAdmin->Stop();\n\n\t\tLOG(\"Shutting down server...\");\n\t\tm_Server->Shutdown();\n\t}  // if (m_Server->Start()\n\n\tdelete m_MojangAPI; m_MojangAPI = nullptr;\n\n\tLOGD(\"Shutting down deadlock detector...\");\n\tdd.Stop();\n\n\tLOGD(\"Stopping world threads...\");\n\tStopWorlds(dd);\n\n\tLOGD(\"Stopping authenticator...\");\n\tm_Authenticator.Stop();\n\n\tLOGD(\"Freeing MonsterConfig...\");\n\tdelete m_MonsterConfig; m_MonsterConfig = nullptr;\n\tdelete m_WebAdmin; m_WebAdmin = nullptr;\n\n\tLOGD(\"Unloading recipes...\");\n\tdelete m_FurnaceRecipe;   m_FurnaceRecipe = nullptr;\n\tdelete m_CraftingRecipes; m_CraftingRecipes = nullptr;\n\n\tLOGD(\"Stopping plugin manager...\");\n\tdelete m_PluginManager; m_PluginManager = nullptr;\n\n\tLOG(\"Cleaning up...\");\n\tdelete m_Server; m_Server = nullptr;\n\n\tLOG(\"Shutdown successful!\");\n\tLOG(\"--- Stopped Log ---\");\n\n\treturn s_NextState == NextState::Restart;\n}\n\n\n\n\n\nvoid cRoot::Stop()\n{\n\tTransitionNextState(NextState::Stop);\n}\n\n\n\n\n\nvoid cRoot::Restart()\n{\n\tTransitionNextState(NextState::Restart);\n}\n\n\n\n\n\nvoid cRoot::LoadGlobalSettings()\n{\n\t// Nothing needed yet\n}\n\n\n\n\n\nvoid cRoot::LoadWorlds(cDeadlockDetect & a_dd, cSettingsRepositoryInterface & a_Settings, bool a_IsNewIniFile)\n{\n\tif (a_IsNewIniFile)\n\t{\n\t\ta_Settings.AddValue(\"Worlds\", \"DefaultWorld\", \"world\");\n\t\ta_Settings.AddValue(\"Worlds\", \"World\", \"world_nether\");\n\t\ta_Settings.AddValue(\"Worlds\", \"World\", \"world_the_end\");\n\t\ta_Settings.AddValue(\"WorldPaths\", \"world\", \"world\");\n\t\ta_Settings.AddValue(\"WorldPaths\", \"world_nether\", \"world_nether\");\n\t\ta_Settings.AddValue(\"WorldPaths\", \"world_the_end\", \"world_the_end\");\n\n\t\tconst AStringVector WorldNames{ \"world\", \"world_nether\", \"world_the_end\" };\n\t\tm_pDefaultWorld = &m_WorldsByName.try_emplace(\"world\", \"world\", \"world\", a_dd, WorldNames).first->second;\n\t\tm_WorldsByName.try_emplace(\"world_nether\", \"world_nether\", \"world_nether\", a_dd, WorldNames, dimNether, \"world\");\n\t\tm_WorldsByName.try_emplace(\"world_the_end\", \"world_the_end\", \"world_the_end\", a_dd, WorldNames, dimEnd, \"world\");\n\t\treturn;\n\t}\n\n\t// Build a list of all world names\n\tauto Worlds = a_Settings.GetValues(\"Worlds\");\n\tAStringVector WorldNames(Worlds.size());\n\tfor (const auto & World : Worlds)\n\t{\n\t\tWorldNames.push_back(World.second);\n\t}\n\n\t// Get the default world\n\tAString DefaultWorldName = a_Settings.GetValueSet(\"Worlds\", \"DefaultWorld\", \"world\");\n\tAString DefaultWorldPath = a_Settings.GetValueSet(\"WorldPaths\", DefaultWorldName, DefaultWorldName);\n\tm_pDefaultWorld = &m_WorldsByName.try_emplace(DefaultWorldName, DefaultWorldName, DefaultWorldPath, a_dd, WorldNames).first->second;\n\n\t// Then load the other worlds\n\tif (Worlds.size() <= 0)\n\t{\n\t\treturn;\n\t}\n\n\t/* Here are the world creation rules. Note that these only apply for a world which is in settings.ini but has no world.ini file.\n\tIf an ini file is present, it overrides the world linkages and the dimension type in cWorld::start()\n\tThe creation rules are as follows:\n\n\t- If a world exists in settings.ini but has no world.ini, then:\n\t\t- If the world name is x_nether, create a world.ini with the dimension type \"nether\".\n\t\t\t- If a world called x exists, set it as x_nether's overworld.\n\t\t\t- Otherwise set the default world as x_nether's overworld.\n\n\t\t- If the world name is x_the_end or x_end, create a world.ini with the dimension type \"end\".\n\t\t\t- If a world called x exists, set it as x_the_end's overworld.\n\t\t\t- Otherwise set the default world as x_the_end's overworld.\n\n\t\t- If the world name is x (and doesn't end with _the_end, _end or _nether)\n\t\t\t- Create a world.ini with a dimension type of \"overworld\".\n\t\t\t- If a world called x_nether exists, set it as x's nether world.\n\t\t\t- Otherwise set x's nether world to blank.h\n\t\t\t- If a world called x_the_end or x_end exists, set it as x's end world.\n\t\t\t- Otherwise set x's nether world to blank.\n\n\t*/\n\n\tbool FoundAdditionalWorlds = false;\n\tfor (const auto & WorldNameValue : Worlds)\n\t{\n\t\tAString ValueName = WorldNameValue.first;\n\t\tif (ValueName.compare(\"World\") != 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tAString WorldName = WorldNameValue.second;\n\t\tif (WorldName.empty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tFoundAdditionalWorlds = true;\n\t\tAString LowercaseName = StrToLower(WorldName);\n\t\tAString WorldPath = a_Settings.GetValueSet(\"WorldPaths\", WorldName, WorldName);\n\t\tAString NetherAppend = \"_nether\";\n\t\tAString EndAppend1 = \"_the_end\";\n\t\tAString EndAppend2 = \"_end\";\n\n\t\t// The default world is an overworld with no links\n\t\teDimension Dimension = dimOverworld;\n\t\tAString LinkTo;\n\n\t\t// if the world is called x_nether\n\t\tif ((LowercaseName.size() > NetherAppend.size()) && (LowercaseName.substr(LowercaseName.size() - NetherAppend.size()) == NetherAppend))\n\t\t{\n\t\t\t// The world is called x_nether, see if a world called x exists. If yes, choose it as the linked world,\n\t\t\t// otherwise, choose the default world as the linked world.\n\t\t\t// As before, any ini settings will completely override this if an ini is already present.\n\n\t\t\tLinkTo = WorldName.substr(0, WorldName.size() - NetherAppend.size());\n\t\t\tif (GetWorld(LinkTo) == nullptr)\n\t\t\t{\n\t\t\t\tLinkTo = DefaultWorldName;\n\t\t\t}\n\t\t\tDimension = dimNether;\n\t\t}\n\t\t// if the world is called x_the_end\n\t\telse if ((LowercaseName.size() > EndAppend1.size()) && (LowercaseName.substr(LowercaseName.size() - EndAppend1.size()) == EndAppend1))\n\t\t{\n\t\t\t// The world is called x_the_end, see if a world called x exists. If yes, choose it as the linked world,\n\t\t\t// otherwise, choose the default world as the linked world.\n\t\t\t// As before, any ini settings will completely override this if an ini is already present.\n\n\t\t\tLinkTo = WorldName.substr(0, WorldName.size() - EndAppend1.size());\n\t\t\tif (GetWorld(LinkTo) == nullptr)\n\t\t\t{\n\t\t\t\tLinkTo = DefaultWorldName;\n\t\t\t}\n\t\t\tDimension = dimEnd;\n\t\t}\n\t\t// if the world is called x_end\n\t\telse if ((LowercaseName.size() > EndAppend2.size()) && (LowercaseName.substr(LowercaseName.size() - EndAppend2.size()) == EndAppend2))\n\t\t{\n\t\t\t// The world is called x_end, see if a world called x exists. If yes, choose it as the linked world,\n\t\t\t// otherwise, choose the default world as the linked world.\n\t\t\t// As before, any ini settings will completely override this if an ini is already present.\n\n\t\t\tLinkTo = WorldName.substr(0, WorldName.size() - EndAppend2.size());\n\t\t\tif (GetWorld(LinkTo) == nullptr)\n\t\t\t{\n\t\t\t\tLinkTo = DefaultWorldName;\n\t\t\t}\n\t\t\tDimension = dimEnd;\n\t\t}\n\t\tm_WorldsByName.try_emplace(WorldName, WorldName, WorldPath, a_dd, WorldNames, Dimension, LinkTo);\n\t}  // for i - Worlds\n\n\tif (!FoundAdditionalWorlds)\n\t{\n\t\tif (a_Settings.GetKeyComment(\"Worlds\", 0) != \" World=secondworld\")\n\t\t{\n\t\t\ta_Settings.DeleteKeyComment(\"Worlds\", 0);\n\t\t\ta_Settings.AddKeyComment(\"Worlds\", \" World=secondworld\");\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cRoot::StartWorlds(cDeadlockDetect & a_DeadlockDetect)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tauto & World = Entry.second;\n\t\tWorld.Start();\n\t\tWorld.InitializeSpawn();\n\t\tm_PluginManager->CallHookWorldStarted(World);\n\t}\n}\n\n\n\n\n\nvoid cRoot::StopWorlds(cDeadlockDetect & a_DeadlockDetect)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.Stop(a_DeadlockDetect);\n\t}\n}\n\n\n\n\n\ncWorld * cRoot::GetDefaultWorld()\n{\n\tASSERT(m_pDefaultWorld != nullptr);\n\treturn m_pDefaultWorld;\n}\n\n\n\n\n\ncWorld * cRoot::GetWorld(const AString & a_WorldName)\n{\n\tconst auto FindResult = m_WorldsByName.find(a_WorldName);\n\tif (FindResult != m_WorldsByName.cend())\n\t{\n\t\treturn &FindResult->second;\n\t}\n\n\treturn nullptr;\n}\n\n\n\n\n\nbool cRoot::ForEachWorld(cWorldListCallback a_Callback)\n{\n\tfor (auto & World : m_WorldsByName)\n\t{\n\t\tif (a_Callback(World.second))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cRoot::QueueExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output)\n{\n\tconst auto KickPlayers = [this]\n\t{\n\t\t// Kick all players from the server with custom disconnect message\n\n\t\tbool SentDisconnect = false;\n\t\tcRoot::Get()->ForEachPlayer(\n\t\t\t[&](cPlayer & a_Player)\n\t\t\t{\n\t\t\t\ta_Player.GetClientHandle()->Kick(m_Server->GetShutdownMessage());\n\t\t\t\tSentDisconnect = true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t);\n\n\t\tif (SentDisconnect)\n\t\t{\n\t\t\tstd::this_thread::sleep_for(std::chrono::seconds(1));\n\t\t}\n\t};\n\n\t// Some commands are built-in:\n\tif (a_Cmd == \"stop\")\n\t{\n\t\tKickPlayers();\n\t\tcRoot::Stop();\n\t\treturn;\n\t}\n\telse if (a_Cmd == \"restart\")\n\t{\n\t\tKickPlayers();\n\t\tcRoot::Restart();\n\t\treturn;\n\t}\n\n\tLOG(\"Executing console command: \\\"%s\\\"\", a_Cmd.c_str());\n\tm_Server->ExecuteConsoleCommand(a_Cmd, a_Output);\n}\n\n\n\n\n\nvoid cRoot::QueueExecuteConsoleCommand(const AString & a_Cmd)\n{\n\t// Put the command into a queue (Alleviates FS #363):\n\tQueueExecuteConsoleCommand(a_Cmd, *new cLogCommandDeleteSelfOutputCallback);\n}\n\n\n\n\n\nvoid cRoot::KickUser(int a_ClientID, const AString & a_Reason)\n{\n\tm_Server->KickUser(a_ClientID, a_Reason);\n}\n\n\n\n\n\nsize_t cRoot::GetTotalChunkCount(void)\n{\n\tsize_t Count = 0;\n\tfor (const auto & Entry : m_WorldsByName)\n\t{\n\t\tCount += Entry.second.GetNumChunks();\n\t}\n\treturn Count;\n}\n\n\n\n\n\nvoid cRoot::SaveAllChunks(void)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.QueueSaveAllChunks();\n\t}\n}\n\n\n\n\n\nvoid cRoot::SaveAllChunksNow(void)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.SaveAllChunks();\n\t}\n}\n\n\n\n\n\nvoid cRoot::SetSavingEnabled(bool a_SavingEnabled)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.SetSavingEnabled(a_SavingEnabled);\n\t}\n}\n\n\n\n\n\nvoid cRoot::SendPlayerLists(cPlayer * a_DestPlayer)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.SendPlayerList(a_DestPlayer);\n\t}\n}\n\n\n\n\n\nvoid cRoot::BroadcastPlayerListsAddPlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.BroadcastPlayerListAddPlayer(a_Player);\n\t}\n}\n\n\n\n\n\nvoid cRoot::BroadcastPlayerListsRemovePlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.BroadcastPlayerListRemovePlayer(a_Player);\n\t}\n}\n\n\n\n\n\nvoid cRoot::BroadcastPlayerListsHeaderFooter(const cCompositeChat & a_Header, const cCompositeChat & a_Footer)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.BroadcastPlayerListHeaderFooter(a_Header, a_Footer);\n\t}\n}\n\n\n\n\n\nvoid cRoot::BroadcastChat(const AString & a_Message, eMessageType a_ChatPrefix)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.BroadcastChat(a_Message, nullptr, a_ChatPrefix);\n\t}\n}\n\n\n\n\n\nvoid cRoot::BroadcastChat(const cCompositeChat & a_Message)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tEntry.second.BroadcastChat(a_Message);\n\t}\n}\n\n\n\n\n\nbool cRoot::ForEachPlayer(cPlayerListCallback a_Callback)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tif (!Entry.second.ForEachPlayer(a_Callback))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cRoot::FindAndDoWithPlayer(const AString & a_PlayerName, cPlayerListCallback a_Callback)\n{\n\tclass cCallback\n\t{\n\t\tsize_t        m_BestRating;\n\t\tsize_t        m_NameLength;\n\t\tconst AString m_PlayerName;\n\n\tpublic:\n\n\t\tbool operator () (cPlayer & a_Player)\n\t\t{\n\t\t\tsize_t Rating = RateCompareString (m_PlayerName, a_Player.GetName());\n\t\t\tif ((Rating > 0) && (Rating >= m_BestRating))\n\t\t\t{\n\t\t\t\tm_BestMatch = a_Player.GetName();\n\t\t\t\tif (Rating > m_BestRating)\n\t\t\t\t{\n\t\t\t\t\tm_NumMatches = 0;\n\t\t\t\t}\n\t\t\t\tm_BestRating = Rating;\n\t\t\t\t++m_NumMatches;\n\t\t\t}\n\t\t\treturn (Rating == m_NameLength);  // Perfect match\n\t\t}\n\n\t\tcCallback (const AString & a_CBPlayerName) :\n\t\t\tm_BestRating(0),\n\t\t\tm_NameLength(a_CBPlayerName.length()),\n\t\t\tm_PlayerName(a_CBPlayerName),\n\t\t\tm_BestMatch(),\n\t\t\tm_NumMatches(0)\n\t\t{}\n\n\t\tAString m_BestMatch;\n\t\tunsigned  m_NumMatches;\n\t} Callback (a_PlayerName);\n\tForEachPlayer(Callback);\n\n\tif (Callback.m_NumMatches == 1)\n\t{\n\t\treturn DoWithPlayer(Callback.m_BestMatch, a_Callback);\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRoot::DoWithPlayerByUUID(const cUUID & a_PlayerUUID, cPlayerListCallback a_Callback)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tif (Entry.second.DoWithPlayerByUUID(a_PlayerUUID, a_Callback))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cRoot::DoWithPlayer(const AString & a_PlayerName, cPlayerListCallback a_Callback)\n{\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tif (Entry.second.DoWithPlayer(a_PlayerName, a_Callback))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nAString cRoot::GetProtocolVersionTextFromInt(int a_ProtocolVersion)\n{\n\treturn cMultiVersionProtocol::GetVersionTextFromInt(static_cast<cProtocol::Version>(a_ProtocolVersion));\n}\n\n\n\n\n\nint cRoot::GetVirtualRAMUsage(void)\n{\n\t#ifdef _WIN32\n\t\tPROCESS_MEMORY_COUNTERS_EX pmc;\n\t\tif (GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS *)&pmc, sizeof(pmc)))\n\t\t{\n\t\t\treturn (int)(pmc.PrivateUsage / 1024);\n\t\t}\n\t\treturn -1;\n\t#elif defined(__linux__)\n\t\t// Code adapted from https://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process\n\t\tstd::ifstream StatFile(\"/proc/self/status\");\n\t\tif (!StatFile.good())\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\twhile (StatFile.good())\n\t\t{\n\t\t\tAString Line;\n\t\t\tstd::getline(StatFile, Line);\n\t\t\tif (strncmp(Line.c_str(), \"VmSize:\", 7) == 0)\n\t\t\t{\n\t\t\t\tint res = atoi(Line.c_str() + 8);\n\t\t\t\treturn (res == 0) ? -1 : res;  // If parsing failed, return -1\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t#elif defined (__APPLE__)\n\t\t// Code adapted from https://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process\n\t\tstruct task_basic_info t_info;\n\t\tmach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;\n\n\t\tif (KERN_SUCCESS == task_info(\n\t\t\tmach_task_self(),\n\t\t\tTASK_BASIC_INFO,\n\t\t\treinterpret_cast<task_info_t>(&t_info),\n\t\t\t&t_info_count\n\t\t))\n\t\t{\n\t\t\treturn static_cast<int>(t_info.virtual_size / 1024);\n\t\t}\n\t\treturn -1;\n\t#else\n\t\tLOGINFO(\"%s: Unknown platform, cannot query memory usage\", __FUNCTION__);\n\t\treturn -1;\n\t#endif\n}\n\n\n\n\n\nint cRoot::GetPhysicalRAMUsage(void)\n{\n\t#ifdef _WIN32\n\t\tPROCESS_MEMORY_COUNTERS pmc;\n\t\tif (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))\n\t\t{\n\t\t\treturn (int)(pmc.WorkingSetSize / 1024);\n\t\t}\n\t\treturn -1;\n\t#elif defined(__linux__)\n\t\t// Code adapted from https://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process\n\t\tstd::ifstream StatFile(\"/proc/self/status\");\n\t\tif (!StatFile.good())\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\twhile (StatFile.good())\n\t\t{\n\t\t\tAString Line;\n\t\t\tstd::getline(StatFile, Line);\n\t\t\tif (strncmp(Line.c_str(), \"VmRSS:\", 6) == 0)\n\t\t\t{\n\t\t\t\tint res = atoi(Line.c_str() + 7);\n\t\t\t\treturn (res == 0) ? -1 : res;  // If parsing failed, return -1\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t#elif defined (__APPLE__)\n\t\t// Code adapted from https://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process\n\t\tstruct task_basic_info t_info;\n\t\tmach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;\n\n\t\tif (KERN_SUCCESS == task_info(\n\t\t\tmach_task_self(),\n\t\t\tTASK_BASIC_INFO,\n\t\t\treinterpret_cast<task_info_t>(&t_info),\n\t\t\t&t_info_count\n\t\t))\n\t\t{\n\t\t\treturn static_cast<int>(t_info.resident_size / 1024);\n\t\t}\n\t\treturn -1;\n\t#elif defined (__FreeBSD__)\n\t\t/*\n\t\tstruct rusage self_usage;\n\t\tint status = getrusage(RUSAGE_SELF, &self_usage);\n\t\tif (!status)\n\t\t{\n\t\t\treturn static_cast<int>(self_usage.ru_maxrss);\n\t\t}\n\t\treturn -1;\n\t\t*/\n\t\t// Good to watch: https://www.youtube.com/watch?v=Os5cK0H8EOA - getrusage.\n\t\t// Unfortunately, it only gives peak memory usage a.k.a max resident set size\n\t\t// So it is better to use FreeBSD kvm function to get the size of resident pages.\n\n\t\tstatic kvm_t* kd = NULL;\n\n\t\tif (kd == NULL)\n\t\t{\n\t\t\tkd = kvm_open(NULL, \"/dev/null\", NULL, O_RDONLY, \"kvm_open\");  // returns a descriptor used to access kernel virtual memory\n\t\t}\n\t\tif (kd != NULL)\n\t\t{\n\t\t\tint pc = 0;  // number of processes found\n\t\t\tstruct kinfo_proc* kp;\n\t\t\tkp = kvm_getprocs(kd, KERN_PROC_PID, getpid(), &pc);\n\t\t\tif ((kp != NULL) && (pc >= 1))\n\t\t\t{\n\t\t\t\treturn static_cast<int>(kp->ki_rssize * getpagesize() / 1024);\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t#else\n\t\tLOGINFO(\"%s: Unknown platform, cannot query memory usage\", __FUNCTION__);\n\t\treturn -1;\n\t#endif\n}\n\n\n\n\n\nvoid cRoot::LogChunkStats(cCommandOutputCallback & a_Output)\n{\n\tint SumNumValid = 0;\n\tint SumNumDirty = 0;\n\tint SumNumInLighting = 0;\n\tsize_t SumNumInGenerator = 0;\n\tint SumMem = 0;\n\tfor (auto & Entry : m_WorldsByName)\n\t{\n\t\tauto & World = Entry.second;\n\t\tconst auto NumInGenerator = World.GetGeneratorQueueLength();\n\t\tconst auto NumInSaveQueue = World.GetStorageSaveQueueLength();\n\t\tconst auto NumInLoadQueue = World.GetStorageLoadQueueLength();\n\t\tint NumValid = 0;\n\t\tint NumDirty = 0;\n\t\tint NumInLighting = 0;\n\t\tWorld.GetChunkStats(NumValid, NumDirty, NumInLighting);\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"World {}:\"), World.GetName()));\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num loaded chunks: {}\"), NumValid));\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num dirty chunks: {}\"), NumDirty));\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num chunks in lighting queue: {}\"), NumInLighting));\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num chunks in generator queue: {}\"), NumInGenerator));\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num chunks in storage load queue: {}\"), NumInLoadQueue));\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num chunks in storage save queue: {}\"), NumInSaveQueue));\n\t\tint Mem = NumValid * static_cast<int>(sizeof(cChunk));\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Memory used by chunks: {} KiB ({} MiB)\"), (Mem + 1023) / 1024, (Mem + 1024 * 1024 - 1) / (1024 * 1024)));\n\t\tSumNumValid += NumValid;\n\t\tSumNumDirty += NumDirty;\n\t\tSumNumInLighting += NumInLighting;\n\t\tSumNumInGenerator += NumInGenerator;\n\t\tSumMem += Mem;\n\t}\n\ta_Output.OutLn(\"Totals:\");\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num loaded chunks: {}\"), SumNumValid));\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num dirty chunks: {}\"), SumNumDirty));\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num chunks in lighting queue: {}\"), SumNumInLighting));\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Num chunks in generator queue: {}\"), SumNumInGenerator));\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  Memory used by chunks: {} KiB ({} MiB)\"), (SumMem + 1023) / 1024, (SumMem + 1024 * 1024 - 1) / (1024 * 1024)));\n\ta_Output.OutLn(\"Per-chunk memory size breakdown:\");\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  block types:    {:06} bytes ({:3} KiB)\"), sizeof(cChunkDef::BlockTypes), (sizeof(cChunkDef::BlockTypes) + 1023) / 1024));\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  block metadata: {:06} bytes ({:3} KiB)\"), sizeof(cChunkDef::BlockNibbles), (sizeof(cChunkDef::BlockNibbles) + 1023) / 1024));\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  block lighting: {:06} bytes ({:3} KiB)\"), 2 * sizeof(cChunkDef::BlockNibbles), (2 * sizeof(cChunkDef::BlockNibbles) + 1023) / 1024));\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  heightmap:      {:06} bytes ({:3} KiB)\"), sizeof(cChunkDef::HeightMap), (sizeof(cChunkDef::HeightMap) + 1023) / 1024));\n\ta_Output.OutLn(fmt::format(FMT_STRING(\"  biomemap:       {:06} bytes ({:3} KiB)\"), sizeof(cChunkDef::BiomeMap), (sizeof(cChunkDef::BiomeMap) + 1023) / 1024));\n}\n\n\n\n\n\nint cRoot::GetFurnaceFuelBurnTime(const cItem & a_Fuel)\n{\n\tcFurnaceRecipe * FR = Get()->GetFurnaceRecipe();\n\treturn FR->GetBurnTime(a_Fuel);\n}\n\n\n\n\n\nAStringVector cRoot::GetPlayerTabCompletionMultiWorld(const AString & a_Text)\n{\n\tAStringVector Results;\n\tForEachWorld([&](cWorld & a_World)\n\t\t{\n\t\t\ta_World.TabCompleteUserName(a_Text, Results);\n\t\t\treturn false;\n\t\t}\n\t);\n\treturn Results;\n}\n\n\n\n\n\nvoid cRoot::HandleInput()\n{\n\tif (g_RunAsService || g_DetachedStdin)\n\t{\n\t\t// Ignore input when running as a service, cin was never opened in that case:\n\t\treturn;\n\t}\n\n\tcLogCommandOutputCallback Output;\n\tAString Command;\n\n\twhile (s_NextState == NextState::Run)\n\t{\n#ifndef _WIN32\n\t\ttimeval Timeout{ 0, 0 };\n\t\tTimeout.tv_usec = 100 * 1000;  // 100 msec\n\n\t\tfd_set ReadSet;\n\t\tFD_ZERO(&ReadSet);\n\t\tFD_SET(STDIN_FILENO, &ReadSet);\n\n\t\tif (select(STDIN_FILENO + 1, &ReadSet, nullptr, nullptr, &Timeout) <= 0)\n\t\t{\n\t\t\t// Don't call getline because there's nothing to read\n\t\t\tcontinue;\n\t\t}\n#endif\n\n\t\tif (!std::getline(std::cin, Command))\n\t\t{\n\t\t\tcRoot::Stop();\n\t\t\treturn;\n\t\t}\n\n\t\tif (s_NextState != NextState::Run)\n\t\t{\n\t\t\t// Already shutting down, can't execute commands\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!Command.empty())\n\t\t{\n\t\t\t// Execute and clear command string when submitted\n\t\t\tQueueExecuteConsoleCommand(TrimString(Command), Output);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cRoot::TransitionNextState(NextState a_NextState)\n{\n\t{\n\t\tauto Current = s_NextState.load();\n\t\tdo\n\t\t{\n\t\t\t// Stopping is final, so stops override restarts:\n\t\t\tif (Current == NextState::Stop)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\twhile (!s_NextState.compare_exchange_strong(Current, a_NextState));\n\t}\n\n\tif (s_NextState == NextState::Run)\n\t{\n\t\treturn;\n\t}\n\n\ts_StopEvent.Set();\n\n#ifdef WIN32\n\tDWORD Length;\n\tINPUT_RECORD Record\n\t{\n\t\tKEY_EVENT,\n\t\t{\n\t\t\t{\n\t\t\t\tTRUE,\n\t\t\t\t1,\n\t\t\t\tVK_RETURN,\n\t\t\t\tstatic_cast<WORD>(MapVirtualKey(VK_RETURN, MAPVK_VK_TO_VSC)),\n\t\t\t\t{ { VK_RETURN } },\n\t\t\t\t0\n\t\t\t}\n\t\t}\n\t};\n\n\t// Can't kill the input thread since it breaks cin (getline doesn't block / receive input on restart)\n\t// Apparently no way to unblock getline apart from CancelIoEx, but xoft wants Windows XP support\n\t// Only thing I can think of for now. Also, ignore the retval since sometimes there's no cin.\n\tWriteConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Record, 1, &Length);\n#endif\n}\n"
  },
  {
    "path": "src/Root.h",
    "content": "\n#pragma once\n\n#include \"Defines.h\"\n#include \"FunctionRef.h\"\n#include \"HTTP/HTTPServer.h\"\n#include \"Protocol/Authenticator.h\"\n#include \"Protocol/MojangAPI.h\"\n#include \"RankManager.h\"\n#include \"ChunkDef.h\"\n\n\n\n\n// fwd:\nclass cItem;\nclass cMonsterConfig;\nclass cBrewingRecipes;\nclass cCraftingRecipes;\nclass cRecipeMapper;\nclass cFurnaceRecipe;\nclass cWebAdmin;\nclass cPluginManager;\nclass cServer;\nclass cWorld;\nclass cPlayer;\nclass cCommandOutputCallback;\nclass cCompositeChat;\nclass cSettingsRepositoryInterface;\nclass cDeadlockDetect;\nclass cUUID;\nclass BlockTypePalette;\nclass ProtocolPalettes;\n\nusing cPlayerListCallback =  cFunctionRef<bool(cPlayer &)>;\nusing cWorldListCallback  =  cFunctionRef<bool(cWorld  &)>;\n\nnamespace Json\n{\n\tclass Value;\n}\n\n\n\n\n\n/** The root of the object hierarchy */\n// tolua_begin\nclass cRoot\n{\npublic:\n\tstatic cRoot * Get() { return s_Root; }\n\t// tolua_end\n\n\t/** which ini file to load settings from, default is settings.ini */\n\tAString m_SettingsFilename;\n\n\tcRoot(void);\n\t~cRoot();\n\n\t/** Run the server. Returns true if we should restart, false to quit. */\n\tbool Run(cSettingsRepositoryInterface & a_OverridesRepo);\n\n\t/** Interrupts the server and stops it, as if \"/stop\" typed in the console. */\n\tstatic void Stop();\n\n\t/** Interrupts the server and restarts it, as if \"/restart\" was typed in the console. */\n\tstatic void Restart();\n\n\t// tolua_begin\n\tcServer * GetServer(void) { return m_Server; }\n\tcWorld *  GetDefaultWorld(void);\n\n\t/** Returns a pointer to the world specified. If no world of that name exists, returns a nullptr. */\n\tcWorld * GetWorld(const AString & a_WorldName);\n\n\t/** Returns the up time of the server in seconds */\n\tint GetServerUpTime(void)\n\t{\n\t\treturn static_cast<int>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - m_StartTime).count());\n\t}\n\t// tolua_end\n\n\t/** Calls the callback for each world; returns true if the callback didn't abort (return true) */\n\tbool ForEachWorld(cWorldListCallback a_Callback);  // >> Exported in ManualBindings <<\n\n\t/** Writes chunkstats, for each world and totals, to the output callback */\n\tvoid LogChunkStats(cCommandOutputCallback & a_Output);\n\n\tcMonsterConfig * GetMonsterConfig(void) { return m_MonsterConfig; }\n\n\tcCraftingRecipes * GetCraftingRecipes(void) { return m_CraftingRecipes; }  // tolua_export\n\tcRecipeMapper * GetRecipeMapper(void) { return m_RecipeMapper.get(); }\n\tcFurnaceRecipe *   GetFurnaceRecipe  (void) { return m_FurnaceRecipe; }    // Exported in ManualBindings.cpp with quite a different signature\n\tcBrewingRecipes *  GetBrewingRecipes (void) { return m_BrewingRecipes.get(); }    // Exported in ManualBindings.cpp\n\n\t/** Returns the (read-write) storage for registered block types. */\n\t// BlockTypeRegistry & GetBlockTypeRegistry() { return m_BlockTypeRegistry; }\n\n\t/** Returns the number of ticks for how long the item would fuel a furnace. Returns zero if not a fuel */\n\tstatic int GetFurnaceFuelBurnTime(const cItem & a_Fuel);  // tolua_export\n\n\t/** Returns the completions for a player name across all worlds. Returns an\n\tempty vector if none are found. */\n\tAStringVector GetPlayerTabCompletionMultiWorld(const AString & a_Text);\n\n\t/** The current time where the startup of the server has been completed */\n\tstd::chrono::steady_clock::time_point m_StartTime;\n\n\tcWebAdmin *        GetWebAdmin       (void) { return m_WebAdmin; }         // tolua_export\n\tcPluginManager *   GetPluginManager  (void) { return m_PluginManager; }    // tolua_export\n\tcAuthenticator &   GetAuthenticator  (void) { return m_Authenticator; }\n\tcMojangAPI &       GetMojangAPI      (void) { return *m_MojangAPI; }\n\tcRankManager *     GetRankManager    (void) { return m_RankManager.get(); }\n\n\t/** Queues a console command for execution through the cServer class.\n\tThe command will be executed in the tick thread\n\tThe command's output will be written to the a_Output callback\n\t\"stop\" and \"restart\" commands have special handling.\n\t*/\n\tvoid QueueExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output);\n\n\t/** Queues a console command for execution through the cServer class.\n\tThe command will be executed in the tick thread\n\tThe command's output will be sent to console\n\t\"stop\" and \"restart\" commands have special handling.\n\t*/\n\tvoid QueueExecuteConsoleCommand(const AString & a_Cmd);  // tolua_export\n\n\t/** Kicks the user, no matter in what world they are. Used from cAuthenticator */\n\tvoid KickUser(int a_ClientID, const AString & a_Reason);\n\n\t/** Returns the number of chunks loaded */\n\tsize_t GetTotalChunkCount(void);  // tolua_export\n\n\t/** Saves all chunks in all worlds */\n\tvoid SaveAllChunks(void);  // tolua_export\n\n\t/** Saves all chunks in all worlds synchronously (waits until dirty chunks have been sent to the ChunkStorage queue before returning) */\n\tvoid SaveAllChunksNow(void);\n\n\t/** Sets whether saving chunks is enabled in all worlds (overrides however the worlds were already set) */\n\tvoid SetSavingEnabled(bool a_SavingEnabled);  // tolua_export\n\n\t/** Calls the callback for each player in all worlds */\n\tbool ForEachPlayer(cPlayerListCallback a_Callback);  // >> EXPORTED IN MANUALBINDINGS <<\n\n\t/** Finds a player from a partial or complete player name and calls the callback - case-insensitive */\n\tbool FindAndDoWithPlayer(const AString & a_PlayerName, cPlayerListCallback a_Callback);  // >> EXPORTED IN MANUALBINDINGS <<\n\n\t/** Finds the player over his uuid and calls the callback */\n\tbool DoWithPlayerByUUID(const cUUID & a_PlayerUUID, cPlayerListCallback a_Callback);  // >> EXPORTED IN MANUALBINDINGS <<\n\n\t/** Finds the player using it's complete username and calls the callback */\n\tbool DoWithPlayer(const AString & a_PlayerName, cPlayerListCallback a_Callback);\n\n\t/** Send playerlist of all worlds to player */\n\tvoid SendPlayerLists(cPlayer * a_DestPlayer);\n\n\t/** Broadcast playerlist addition through all worlds */\n\tvoid BroadcastPlayerListsAddPlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr);\n\n\t/** Broadcast playerlist removal through all worlds */\n\tvoid BroadcastPlayerListsRemovePlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr);\n\n\t/** Broadcast playerlist header and footer through all worlds */\n\tvoid BroadcastPlayerListsHeaderFooter(const cCompositeChat & a_Header, const cCompositeChat & a_Footer);  // tolua_export\n\n\t// tolua_begin\n\n\t/** Sends a chat message to all connected clients (in all worlds) */\n\tvoid BroadcastChat       (const AString & a_Message, eMessageType a_ChatPrefix = mtCustom);\n\tvoid BroadcastChat       (const cCompositeChat & a_Message);\n\tvoid BroadcastChatDeath  (const AString & a_Message) { BroadcastChat(a_Message, mtDeath); }\n\tvoid BroadcastChatFailure(const AString & a_Message) { BroadcastChat(a_Message, mtFailure); }\n\tvoid BroadcastChatFatal  (const AString & a_Message) { BroadcastChat(a_Message, mtFailure); }\n\tvoid BroadcastChatInfo   (const AString & a_Message) { BroadcastChat(a_Message, mtInformation); }\n\tvoid BroadcastChatJoin   (const AString & a_Message) { BroadcastChat(a_Message, mtJoin); }\n\tvoid BroadcastChatLeave  (const AString & a_Message) { BroadcastChat(a_Message, mtLeave); }\n\tvoid BroadcastChatSuccess(const AString & a_Message) { BroadcastChat(a_Message, mtSuccess); }\n\tvoid BroadcastChatWarning(const AString & a_Message) { BroadcastChat(a_Message, mtWarning); }\n\n\t/** Returns the textual description of the protocol version: 49 -> \"1.4.4\". Provided specifically for Lua API */\n\tstatic AString GetProtocolVersionTextFromInt(int a_ProtocolVersionNum);\n\n\t/** Returns the amount of virtual RAM used, in KiB. Returns a negative number on error */\n\tstatic int GetVirtualRAMUsage(void);\n\n\t/** Returns the amount of virtual RAM used, in KiB. Returns a negative number on error */\n\tstatic int GetPhysicalRAMUsage(void);\n\n\t// tolua_end\n\nprivate:\n\n\t/** States that the global cRoot can be in.\n\tYou can transition freely between Run and Restart, but the server unconditionally terminates in Stop. */\n\tenum class NextState\n\t{\n\t\tRun,\n\t\tRestart,\n\t\tStop\n\t};\n\n\ttypedef std::map<AString, cWorld> WorldMap;\n\n\t/** Blocking reads and processes console input. */\n\tvoid HandleInput();\n\n\t/** Performs run state transition, enforcing guarantees about state transitions. */\n\tstatic void TransitionNextState(NextState a_NextState);\n\n\tcWorld * m_pDefaultWorld;\n\tWorldMap m_WorldsByName;\n\n\tstatic cEvent s_StopEvent;\n\n\tcServer *        m_Server;\n\tcMonsterConfig * m_MonsterConfig;\n\n\tcCraftingRecipes * m_CraftingRecipes;\n\tstd::unique_ptr<cRecipeMapper> m_RecipeMapper;\n\tcFurnaceRecipe *   m_FurnaceRecipe;\n\tstd::unique_ptr<cBrewingRecipes> m_BrewingRecipes;\n\tcWebAdmin *        m_WebAdmin;\n\tcPluginManager *   m_PluginManager;\n\tcAuthenticator     m_Authenticator;\n\tcMojangAPI *       m_MojangAPI;\n\n\tstd::unique_ptr<cRankManager> m_RankManager;\n\n\tcHTTPServer m_HTTPServer;\n\n\t/** The storage for all registered block types. */\n\t// BlockTypeRegistry m_BlockTypeRegistry;\n\n\n\tvoid LoadGlobalSettings();\n\n\t/** Loads the worlds from settings.ini, creates the worldmap */\n\tvoid LoadWorlds(cDeadlockDetect & a_dd, cSettingsRepositoryInterface & a_Settings, bool a_IsNewIniFile);\n\n\t/** Starts each world's life */\n\tvoid StartWorlds(cDeadlockDetect & a_DeadlockDetect);\n\n\t/** Stops each world's threads, so that it's safe to unload them */\n\tvoid StopWorlds(cDeadlockDetect & a_DeadlockDetect);\n\n\tstatic cRoot * s_Root;\n\n\t/** Indicates the next action of cRoot, whether to run, stop or restart. */\n\tstatic std::atomic<NextState> s_NextState;\n};  // tolua_export\n"
  },
  {
    "path": "src/Scoreboard.cpp",
    "content": "\n// Scoreboard.cpp\n\n// Implementation of a scoreboard that keeps track of specified objectives\n\n#include \"Globals.h\"\n\n#include \"Scoreboard.h\"\n#include \"World.h\"\n#include \"ClientHandle.h\"\n\n\n\n\n\nAString cObjective::TypeToString(eType a_Type)\n{\n\tswitch (a_Type)\n\t{\n\t\tcase otDummy:              return \"dummy\";\n\t\tcase otDeathCount:         return \"deathCount\";\n\t\tcase otPlayerKillCount:    return \"playerKillCount\";\n\t\tcase otTotalKillCount:     return \"totalKillCount\";\n\t\tcase otHealth:             return \"health\";\n\t\tcase otAchievement:        return \"achievement\";\n\t\tcase otStat:               return \"stat\";\n\t\tcase otStatItemCraft:      return \"stat.craftItem\";\n\t\tcase otStatItemUse:        return \"stat.useItem\";\n\t\tcase otStatItemBreak:      return \"stat.breakItem\";\n\t\tcase otStatBlockMine:      return \"stat.mineBlock\";\n\t\tcase otStatEntityKill:     return \"stat.killEntity\";\n\t\tcase otStatEntityKilledBy: return \"stat.entityKilledBy\";\n\t}\n\tUNREACHABLE(\"Unsupported objective type\");\n}\n\n\n\n\n\ncObjective::eType cObjective::StringToType(const AString & a_Name)\n{\n\tstatic struct\n\t{\n\t\teType m_Type;\n\t\tconst char * m_String;\n\t} TypeMap [] =\n\t{\n\t\t{otDummy,              \"dummy\"              },\n\t\t{otDeathCount,         \"deathCount\"         },\n\t\t{otPlayerKillCount,    \"playerKillCount\"    },\n\t\t{otTotalKillCount,     \"totalKillCount\"     },\n\t\t{otHealth,             \"health\"             },\n\t\t{otAchievement,        \"achievement\"        },\n\t\t{otStat,               \"stat\"               },\n\t\t{otStatItemCraft,      \"stat.craftItem\"     },\n\t\t{otStatItemUse,        \"stat.useItem\"       },\n\t\t{otStatItemBreak,      \"stat.breakItem\"     },\n\t\t{otStatBlockMine,      \"stat.mineBlock\"     },\n\t\t{otStatEntityKill,     \"stat.killEntity\"    },\n\t\t{otStatEntityKilledBy, \"stat.entityKilledBy\"}\n\t};\n\tfor (size_t i = 0; i < ARRAYCOUNT(TypeMap); i++)\n\t{\n\t\tif (NoCaseCompare(TypeMap[i].m_String, a_Name) == 0)\n\t\t{\n\t\t\treturn TypeMap[i].m_Type;\n\t\t}\n\t}  // for i - TypeMap[]\n\treturn otDummy;\n}\n\n\n\n\n\ncObjective::cObjective(const AString & a_Name, const AString & a_DisplayName, cObjective::eType a_Type, cWorld * a_World)\n\t: m_DisplayName(a_DisplayName)\n\t, m_Name(a_Name)\n\t, m_Type(a_Type)\n\t, m_World(a_World)\n{\n}\n\n\n\n\n\nvoid cObjective::Reset(void)\n{\n\tfor (cScoreMap::iterator it = m_Scores.begin(); it != m_Scores.end(); ++it)\n\t{\n\t\tm_World->BroadcastScoreUpdate(m_Name, it->first, 0, 1);\n\t}\n\n\tm_Scores.clear();\n}\n\n\n\n\n\ncObjective::Score cObjective::GetScore(const AString & a_Name) const\n{\n\tcScoreMap::const_iterator it = m_Scores.find(a_Name);\n\n\tif (it == m_Scores.end())\n\t{\n\t\treturn 0;\n\t}\n\telse\n\t{\n\t\treturn it->second;\n\t}\n}\n\n\n\n\n\nvoid cObjective::SetScore(const AString & a_Name, cObjective::Score a_Score)\n{\n\tm_Scores[a_Name] = a_Score;\n\n\tm_World->BroadcastScoreUpdate(m_Name, a_Name, a_Score, 0);\n}\n\n\n\n\n\nvoid cObjective::ResetScore(const AString & a_Name)\n{\n\tm_Scores.erase(a_Name);\n\n\tm_World->BroadcastScoreUpdate(m_Name, a_Name, 0, 1);\n}\n\n\n\n\n\ncObjective::Score cObjective::AddScore(const AString & a_Name, cObjective::Score a_Delta)\n{\n\t// TODO 2014-01-19 xdot: Potential optimization - Reuse iterator\n\tScore NewScore = m_Scores[a_Name] + a_Delta;\n\n\tSetScore(a_Name, NewScore);\n\n\treturn NewScore;\n}\n\n\n\n\n\ncObjective::Score cObjective::SubScore(const AString & a_Name, cObjective::Score a_Delta)\n{\n\t// TODO 2014-01-19 xdot: Potential optimization - Reuse iterator\n\tScore NewScore = m_Scores[a_Name] - a_Delta;\n\n\tSetScore(a_Name, NewScore);\n\n\treturn NewScore;\n}\n\n\n\n\n\nvoid cObjective::SetDisplayName(const AString & a_Name)\n{\n\tm_DisplayName = a_Name;\n\n\tm_World->BroadcastScoreboardObjective(m_Name, m_DisplayName, 2);\n}\n\n\n\n\n\nvoid cObjective::SendTo(cClientHandle & a_Client)\n{\n\ta_Client.SendScoreboardObjective(m_Name, m_DisplayName, 0);\n\n\tfor (cScoreMap::const_iterator it = m_Scores.begin(); it != m_Scores.end(); ++it)\n\t{\n\t\ta_Client.SendScoreUpdate(m_Name, it->first, it->second, 0);\n\t}\n}\n\n\n\n\n\ncTeam::cTeam(\n\tconst AString & a_Name, const AString & a_DisplayName,\n\tconst AString & a_Prefix, const AString & a_Suffix\n)\n\t: m_AllowsFriendlyFire(true)\n\t, m_CanSeeFriendlyInvisible(false)\n\t, m_DisplayName(a_DisplayName)\n\t, m_Name(a_Name)\n\t, m_Prefix(a_Prefix)\n\t, m_Suffix(a_Suffix)\n{\n}\n\n\n\n\n\nbool cTeam::AddPlayer(const AString & a_Name)\n{\n\treturn m_Players.insert(a_Name).second;\n}\n\n\n\n\n\nbool cTeam::RemovePlayer(const AString & a_Name)\n{\n\treturn m_Players.erase(a_Name) > 0;\n}\n\n\n\n\n\nbool cTeam::HasPlayer(const AString & a_Name) const\n{\n\tcPlayerNameSet::const_iterator it = m_Players.find(a_Name);\n\n\treturn it != m_Players.end();\n}\n\n\n\n\n\nvoid cTeam::Reset(void)\n{\n\t// TODO 2014-01-22 xdot: Inform online players\n\n\tm_Players.clear();\n}\n\n\n\n\n\nvoid cTeam::SetDisplayName(const AString & a_Name)\n{\n\tm_DisplayName = a_Name;\n\n\t// TODO 2014-03-01 xdot: Update clients\n}\n\n\n\n\n\nsize_t cTeam::GetNumPlayers(void) const\n{\n\treturn m_Players.size();\n}\n\n\n\n\n\ncScoreboard::cScoreboard(cWorld * a_World) : m_World(a_World)\n{\n\tfor (int i = 0; i < static_cast<int>(dsCount); ++i)\n\t{\n\t\tm_Display[i] = nullptr;\n\t}\n}\n\n\n\n\n\ncObjective * cScoreboard::RegisterObjective(const AString & a_Name, const AString & a_DisplayName, cObjective::eType a_Type)\n{\n\tcObjective Objective(a_Name, a_DisplayName, a_Type, m_World);\n\n\tstd::pair<cObjectiveMap::iterator, bool> Status = m_Objectives.insert(cNamedObjective(a_Name, Objective));\n\n\tif (Status.second)\n\t{\n\t\tASSERT(m_World != nullptr);\n\t\tm_World->BroadcastScoreboardObjective(a_Name, a_DisplayName, 0);\n\n\t\treturn &Status.first->second;\n\t}\n\telse\n\t{\n\t\treturn nullptr;\n\t}\n}\n\n\n\n\n\nbool cScoreboard::RemoveObjective(const AString & a_Name)\n{\n\tcCSLock Lock(m_CSObjectives);\n\n\tcObjectiveMap::iterator it = m_Objectives.find(a_Name);\n\n\tif (it == m_Objectives.end())\n\t{\n\t\treturn false;\n\t}\n\n\tASSERT(m_World != nullptr);\n\tm_World->BroadcastScoreboardObjective(it->second.GetName(), it->second.GetDisplayName(), 1);\n\n\tfor (unsigned int i = 0; i < static_cast<unsigned int>(dsCount); ++i)\n\t{\n\t\tif (m_Display[i] == &it->second)\n\t\t{\n\t\t\tSetDisplay(nullptr, static_cast<eDisplaySlot>(i));\n\t\t}\n\t}\n\n\tm_Objectives.erase(it);\n\n\treturn true;\n}\n\n\n\n\n\ncObjective * cScoreboard::GetObjective(const AString & a_Name)\n{\n\tcCSLock Lock(m_CSObjectives);\n\n\tcObjectiveMap::iterator it = m_Objectives.find(a_Name);\n\n\tif (it == m_Objectives.end())\n\t{\n\t\treturn nullptr;\n\t}\n\telse\n\t{\n\t\treturn &it->second;\n\t}\n}\n\n\n\n\n\ncTeam * cScoreboard::RegisterTeam(\n\tconst AString & a_Name, const AString & a_DisplayName,\n\tconst AString & a_Prefix, const AString & a_Suffix\n)\n{\n\tauto [TeamIterator, TeamExists] = m_Teams.try_emplace(a_Name, a_Name, a_DisplayName, a_Prefix, a_Suffix);\n\n\tif (!TeamExists && GetTeam(a_Name))\n\t{\n\t\tLOGWARNING(\"Tried to register a team that already exists: %s\", a_Name.c_str());\n\t\treturn nullptr;\n\t}\n\n\treturn &TeamIterator->second;\n}\n\n\n\n\n\nbool cScoreboard::RemoveTeam(const AString & a_Name)\n{\n\tcCSLock Lock(m_CSTeams);\n\n\tcTeamMap::iterator it = m_Teams.find(a_Name);\n\n\tif (it == m_Teams.end())\n\t{\n\t\treturn false;\n\t}\n\n\tm_Teams.erase(it);\n\n\treturn true;\n}\n\n\n\n\n\ncTeam * cScoreboard::GetTeam(const AString & a_Name)\n{\n\tcCSLock Lock(m_CSTeams);\n\n\tcTeamMap::iterator it = m_Teams.find(a_Name);\n\n\tif (it == m_Teams.end())\n\t{\n\t\treturn nullptr;\n\t}\n\telse\n\t{\n\t\treturn &it->second;\n\t}\n}\n\n\n\n\n\nAStringVector cScoreboard::GetTeamNames()\n{\n\tAStringVector TeamNames;\n\n\tfor (const auto & Team: m_Teams)\n\t{\n\t\tTeamNames.push_back(Team.first);\n\t}\n\n\treturn TeamNames;\n}\n\n\n\n\n\ncTeam * cScoreboard::QueryPlayerTeam(const AString & a_Name)\n{\n\tcCSLock Lock(m_CSTeams);\n\n\tfor (cTeamMap::iterator it = m_Teams.begin(); it != m_Teams.end(); ++it)\n\t{\n\t\tif (it->second.HasPlayer(a_Name))\n\t\t{\n\t\t\treturn &it->second;\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\n\n\n\n\nvoid cScoreboard::SetDisplay(const AString & a_Objective, eDisplaySlot a_Slot)\n{\n\tASSERT(a_Slot < dsCount);\n\n\tcObjective * Objective = GetObjective(a_Objective);\n\n\tSetDisplay(Objective, a_Slot);\n}\n\n\n\n\n\nvoid cScoreboard::SetDisplay(cObjective * a_Objective, eDisplaySlot a_Slot)\n{\n\tm_Display[a_Slot] = a_Objective;\n\n\tASSERT(m_World != nullptr);\n\tm_World->BroadcastDisplayObjective(a_Objective ? a_Objective->GetName() : \"\", a_Slot);\n}\n\n\n\n\n\ncObjective * cScoreboard::GetObjectiveIn(eDisplaySlot a_Slot)\n{\n\tASSERT(a_Slot < dsCount);\n\n\treturn m_Display[a_Slot];\n}\n\n\n\n\n\nbool cScoreboard::ForEachObjectiveWith(cObjective::eType a_Type, cObjectiveCallback a_Callback)\n{\n\tcCSLock Lock(m_CSObjectives);\n\n\tfor (cObjectiveMap::iterator it = m_Objectives.begin(); it != m_Objectives.end(); ++it)\n\t{\n\t\tif (it->second.GetType() == a_Type)\n\t\t{\n\t\t\t// Call callback\n\t\t\tif (a_Callback(it->second))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cScoreboard::ForEachObjective(cObjectiveCallback a_Callback)\n{\n\tcCSLock Lock(m_CSObjectives);\n\n\tfor (cObjectiveMap::iterator it = m_Objectives.begin(); it != m_Objectives.end(); ++it)\n\t{\n\t\t// Call callback\n\t\tif (a_Callback(it->second))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cScoreboard::ForEachTeam(cTeamCallback a_Callback)\n{\n\tcCSLock Lock(m_CSTeams);\n\n\tfor (cTeamMap::iterator it = m_Teams.begin(); it != m_Teams.end(); ++it)\n\t{\n\t\t// Call callback\n\t\tif (a_Callback(it->second))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cScoreboard::AddPlayerScore(const AString & a_Name, cObjective::eType a_Type, cObjective::Score a_Value)\n{\n\tcCSLock Lock(m_CSObjectives);\n\n\tfor (cObjectiveMap::iterator it = m_Objectives.begin(); it != m_Objectives.end(); ++it)\n\t{\n\t\tif (it->second.GetType() == a_Type)\n\t\t{\n\t\t\tit->second.AddScore(a_Name, a_Value);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cScoreboard::SendTo(cClientHandle & a_Client)\n{\n\tcCSLock Lock(m_CSObjectives);\n\n\tfor (cObjectiveMap::iterator it = m_Objectives.begin(); it != m_Objectives.end(); ++it)\n\t{\n\t\tit->second.SendTo(a_Client);\n\t}\n\n\tfor (int i = 0; i < static_cast<int>(dsCount); ++i)\n\t{\n\t\t// Avoid race conditions\n\t\tcObjective * Objective = m_Display[i];\n\n\t\tif (Objective)\n\t\t{\n\t\t\ta_Client.SendDisplayObjective(Objective->GetName(), static_cast<eDisplaySlot>(i));\n\t\t}\n\t}\n}\n\n\n\n\n\nsize_t cScoreboard::GetNumObjectives(void) const\n{\n\treturn m_Objectives.size();\n}\n\n\n\n\n\nsize_t cScoreboard::GetNumTeams(void) const\n{\n\treturn m_Teams.size();\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/Scoreboard.h",
    "content": "\n// Scoreboard.h\n\n// Implementation of a scoreboard that keeps track of specified objectives\n\n\n\n\n\n#pragma once\n\n#include \"FunctionRef.h\"\n\n\n\n\n\nclass cClientHandle;\nclass cObjective;\nclass cTeam;\nclass cWorld;\n\nusing cObjectiveCallback = cFunctionRef<bool(cObjective &)>;\nusing cTeamCallback      = cFunctionRef<bool(cTeam &)>;\n\n\n\n\n\n// tolua_begin\nclass cObjective\n{\npublic:\n\n\ttypedef int Score;\n\n\tenum eType\n\t{\n\t\totDummy,\n\n\t\totDeathCount,\n\t\totPlayerKillCount,\n\t\totTotalKillCount,\n\t\totHealth,\n\n\t\totAchievement,\n\n\t\totStat,\n\t\totStatItemCraft,\n\t\totStatItemUse,\n\t\totStatItemBreak,\n\n\t\totStatBlockMine,\n\t\totStatEntityKill,\n\t\totStatEntityKilledBy\n\t};\n\n\t// tolua_end\n\n\tstatic AString TypeToString(eType a_Type);\n\n\tstatic eType StringToType(const AString & a_Name);\n\npublic:\n\n\tcObjective(const AString & a_Name, const AString & a_DisplayName, eType a_Type, cWorld * a_World);\n\n\t// tolua_begin\n\n\teType GetType(void) const { return m_Type; }\n\n\tconst AString & GetName(void)        const { return m_Name; }\n\tconst AString & GetDisplayName(void) const { return m_DisplayName; }\n\n\t/** Resets the objective */\n\tvoid Reset(void);\n\n\t/** Returns the score of the specified player */\n\tScore GetScore(const AString & a_Name) const;\n\n\t/** Sets the score of the specified player */\n\tvoid SetScore(const AString & a_Name, Score a_Score);\n\n\t/** Resets the score of the specified player */\n\tvoid ResetScore(const AString & a_Name);\n\n\t/** Adds a_Delta and returns the new score */\n\tScore AddScore(const AString & a_Name, Score a_Delta);\n\n\t/** Subtracts a_Delta and returns the new score */\n\tScore SubScore(const AString & a_Name, Score a_Delta);\n\n\tvoid SetDisplayName(const AString & a_Name);\n\n\t// tolua_end\n\n\t/** Send this objective to the specified client */\n\tvoid SendTo(cClientHandle & a_Client);\n\nprivate:\n\n\ttypedef std::pair<AString, Score> cTrackedPlayer;\n\n\ttypedef std::map<AString, Score> cScoreMap;\n\n\tcScoreMap m_Scores;\n\n\tAString m_DisplayName;\n\tAString m_Name;\n\n\teType m_Type;\n\n\tcWorld * m_World;\n\n\tfriend class cScoreboardSerializer;\n\n\n};  // tolua_export\n\n\n\n\n\n// tolua_begin\nclass cTeam\n{\npublic:\n\n\t// tolua_end\n\n\tcTeam(\n\t\tconst AString & a_Name, const AString & a_DisplayName,\n\t\tconst AString & a_Prefix, const AString & a_Suffix\n\t);\n\n\t// tolua_begin\n\n\t/** Adds a new player to the team */\n\tbool AddPlayer(const AString & a_Name);\n\n\t/** Removes a player from the team */\n\tbool RemovePlayer(const AString & a_Name);\n\n\t/** Returns whether the specified player is in this team */\n\tbool HasPlayer(const AString & a_Name) const;\n\n\t/** Removes all registered players */\n\tvoid Reset(void);\n\n\t// tolua_begin\n\n\t/** Returns the number of registered players */\n\tsize_t GetNumPlayers(void) const;\n\n\tbool AllowsFriendlyFire(void)      const { return m_AllowsFriendlyFire; }\n\tbool CanSeeFriendlyInvisible(void) const { return m_CanSeeFriendlyInvisible; }\n\n\tconst AString & GetDisplayName(void) const { return m_DisplayName; }\n\tconst AString & GetName(void)        const { return m_Name; }\n\n\tconst AString & GetPrefix(void) const { return m_Prefix; }\n\tconst AString & GetSuffix(void) const { return m_Suffix; }\n\n\tvoid SetFriendlyFire(bool a_Flag)            { m_AllowsFriendlyFire      = a_Flag; }\n\tvoid SetCanSeeFriendlyInvisible(bool a_Flag) { m_CanSeeFriendlyInvisible = a_Flag; }\n\n\tvoid SetDisplayName(const AString & a_Name);\n\n\tvoid SetPrefix(const AString & a_Prefix) { m_Prefix = a_Prefix; }\n\tvoid SetSuffix(const AString & a_Suffix) { m_Suffix = a_Suffix; }\n\n\t// tolua_end\n\nprivate:\n\n\ttypedef std::set<AString> cPlayerNameSet;\n\n\tbool m_AllowsFriendlyFire;\n\tbool m_CanSeeFriendlyInvisible;\n\n\tAString m_DisplayName;\n\tAString m_Name;\n\n\tAString m_Prefix;\n\tAString m_Suffix;\n\n\tcPlayerNameSet m_Players;\n\n\tfriend class cScoreboardSerializer;\n\n\n};  // tolua_export\n\n\n\n\n\n// tolua_begin\nclass cScoreboard\n{\npublic:\n\n\tenum eDisplaySlot\n\t{\n\t\tdsList = 0,\n\t\tdsSidebar,\n\t\tdsName,\n\n\t\tdsCount\n\t};\n\n\t// tolua_end\n\n\npublic:\n\n\tcScoreboard(cWorld * a_World);\n\n\t// tolua_begin\n\n\t/** Registers a new scoreboard objective, returns the cObjective instance, nullptr on name collision */\n\tcObjective * RegisterObjective(const AString & a_Name, const AString & a_DisplayName, cObjective::eType a_Type);\n\n\t/** Removes a registered objective, returns true if operation was successful */\n\tbool RemoveObjective(const AString & a_Name);\n\n\t/** Retrieves the objective with the specified name, nullptr if not found */\n\tcObjective * GetObjective(const AString & a_Name);\n\n\t/** Registers a new team, returns the cTeam instance, nullptr on name collision */\n\tcTeam * RegisterTeam(const AString & a_Name, const AString & a_DisplayName, const AString & a_Prefix, const AString & a_Suffix);\n\n\t/** Removes a registered team, returns true if operation was successful */\n\tbool RemoveTeam(const AString & a_Name);\n\n\t/** Retrieves the team with the specified name, nullptr if not found */\n\tcTeam * GetTeam(const AString & a_Name);\n\n\tvoid SetDisplay(const AString & a_Objective, eDisplaySlot a_Slot);\n\n\tcObjective * GetObjectiveIn(eDisplaySlot a_Slot);\n\n\tsize_t GetNumObjectives(void) const;\n\n\tsize_t GetNumTeams(void) const;\n\n\tvoid AddPlayerScore(const AString & a_Name, cObjective::eType a_Type, cObjective::Score a_Value = 1);\n\n\t// tolua_end\n\n\t/** Retrieves the list of team names */\n\tAStringVector GetTeamNames();\n\n\t/** Send this scoreboard to the specified client */\n\tvoid SendTo(cClientHandle & a_Client);\n\n\tcTeam * QueryPlayerTeam(const AString & a_Name);  // WARNING: O(n logn)\n\n\t/** Execute callback for each objective with the specified type\n\tReturns true if all objectives processed, false if the callback aborted by returning true. */\n\tbool ForEachObjectiveWith(cObjective::eType a_Type, cObjectiveCallback a_Callback);\n\n\t/** Execute callback for each objective.\n\tReturns true if all objectives have been processed, false if the callback aborted by returning true. */\n\tbool ForEachObjective(cObjectiveCallback a_Callback);  // Exported in ManualBindings.cpp\n\n\t/** Execute callback for each team.\n\tReturns true if all teams have been processed, false if the callback aborted by returning true. */\n\tbool ForEachTeam(cTeamCallback a_Callback);  // Exported in ManualBindings.cpp\n\n\tvoid SetDisplay(cObjective * a_Objective, eDisplaySlot a_Slot);\n\n\nprivate:\n\n\ttypedef std::pair<AString, cObjective> cNamedObjective;\n\ttypedef std::pair<AString, cTeam>      cNamedTeam;\n\n\ttypedef std::map<AString, cObjective> cObjectiveMap;\n\ttypedef std::map<AString, cTeam>      cTeamMap;\n\n\t// TODO 2014-01-19 xdot: Potential optimization - Sort objectives based on type\n\tcCriticalSection m_CSObjectives;\n\tcObjectiveMap m_Objectives;\n\n\tcCriticalSection m_CSTeams;\n\tcTeamMap m_Teams;\n\n\tcWorld * m_World;\n\n\tcObjective * m_Display[dsCount];\n\n\tfriend class cScoreboardSerializer;\n\n\n};  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/Server.cpp",
    "content": "// ReDucTor is an awesome guy who helped me a lot\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Server.h\"\n#include \"ClientHandle.h\"\n#include \"LoggerSimple.h\"\n#include \"Mobs/Monster.h\"\n#include \"Root.h\"\n#include \"World.h\"\n#include \"Bindings/PluginManager.h\"\n#include \"ChatColor.h\"\n#include \"Entities/Player.h\"\n#include \"Inventory.h\"\n#include \"Item.h\"\n#include \"FurnaceRecipe.h\"\n#include \"WebAdmin.h\"\n#include \"Protocol/ProtocolRecognizer.h\"\n#include \"CommandOutput.h\"\n#include \"FastRandom.h\"\n\n#include \"IniFile.h\"\n\n#include <fstream>\n#include <sstream>\n#include <iostream>\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cServerListenCallbacks:\n\nclass cServerListenCallbacks:\n\tpublic cNetwork::cListenCallbacks\n{\n\tcServer & m_Server;\n\tUInt16 m_Port;\n\n\tvirtual cTCPLink::cCallbacksPtr OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort) override\n\t{\n\t\treturn m_Server.OnConnectionAccepted(a_RemoteIPAddress);\n\t}\n\n\tvirtual void OnAccepted(cTCPLink & a_Link) override {}\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tLOGWARNING(\"Cannot listen on port %d: %d (%s).\", m_Port, a_ErrorCode, a_ErrorMsg.c_str());\n\t}\n\npublic:\n\tcServerListenCallbacks(cServer & a_Server, UInt16 a_Port):\n\t\tm_Server(a_Server),\n\t\tm_Port(a_Port)\n\t{\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cServer::cTickThread:\n\ncServer::cTickThread::cTickThread(cServer & a_Server) :\n\tSuper(\"Server Ticker\"),\n\tm_Server(a_Server)\n{\n}\n\n\n\n\n\nvoid cServer::cTickThread::Execute(void)\n{\n\tauto LastTime = std::chrono::steady_clock::now();\n\tstatic const auto msPerTick = std::chrono::milliseconds(50);\n\n\twhile (!m_ShouldTerminate)\n\t{\n\t\tauto NowTime = std::chrono::steady_clock::now();\n\t\tauto msec = std::chrono::duration_cast<std::chrono::milliseconds>(NowTime - LastTime).count();\n\t\tm_Server.Tick(static_cast<float>(msec));\n\t\tauto TickTime = std::chrono::steady_clock::now() - NowTime;\n\n\t\tif (TickTime < msPerTick)\n\t\t{\n\t\t\t// Stretch tick time until it's at least msPerTick\n\t\t\tstd::this_thread::sleep_for(msPerTick - TickTime);\n\t\t}\n\n\t\tLastTime = NowTime;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cServer:\n\ncServer::cServer(void) :\n\tm_PlayerCount(0),\n\tm_ClientViewDistance(0),\n\tm_bIsConnected(false),\n\tm_RCONServer(*this),\n\tm_MaxPlayers(0),\n\tm_bIsHardcore(false),\n\tm_TickThread(*this),\n\tm_ShouldAuthenticate(false),\n\tm_UpTime(0)\n{\n\t// Initialize the LuaStateTracker singleton before the app goes multithreaded:\n\tcLuaStateTracker::GetStats();\n}\n\n\n\n\n\nvoid cServer::ClientMovedToWorld(const cClientHandle * a_Client)\n{\n\tcCSLock Lock(m_CSClients);\n\tm_ClientsToRemove.push_back(const_cast<cClientHandle *>(a_Client));\n}\n\n\n\n\n\nvoid cServer::PlayerCreated()\n{\n\tm_PlayerCount++;\n}\n\n\n\n\n\nvoid cServer::PlayerDestroyed()\n{\n\tm_PlayerCount--;\n}\n\n\n\n\n\nbool cServer::InitServer(cSettingsRepositoryInterface & a_Settings, bool a_ShouldAuth)\n{\n\tm_Description = a_Settings.GetValueSet(\"Server\", \"Description\", \"Cuberite - in C++!\");\n\tm_ShutdownMessage = a_Settings.GetValueSet(\"Server\", \"ShutdownMessage\", \"Server shutdown\");\n\tm_MaxPlayers = static_cast<size_t>(a_Settings.GetValueSetI(\"Server\", \"MaxPlayers\", 100));\n\tm_bIsHardcore = a_Settings.GetValueSetB(\"Server\", \"HardcoreEnabled\", false);\n\tm_bAllowMultiLogin = a_Settings.GetValueSetB(\"Server\", \"AllowMultiLogin\", false);\n\tm_RequireResourcePack = a_Settings.GetValueSetB(\"Server\", \"RequireResourcePack\", false);\n\tm_ResourcePackUrl = a_Settings.GetValueSet(\"Server\", \"ResourcePackUrl\", \"\");\n\tm_CustomRedirectUrl = a_Settings.GetValueSet(\"Server\", \"CustomRedirectUrl\", \"https://youtu.be/dQw4w9WgXcQ\");\n\n\tm_FaviconData = Base64Encode(cFile::ReadWholeFile(AString(\"favicon.png\")));  // Will return empty string if file nonexistant; client doesn't mind\n\n\tif (m_bIsConnected)\n\t{\n\t\tLOGERROR(\"ERROR: Trying to initialize server while server is already running!\");\n\t\treturn false;\n\t}\n\n\tLOGINFO(\"Compatible clients: %s\", MCS_CLIENT_VERSIONS);\n\tLOGD(\"Compatible protocol versions %s\", MCS_PROTOCOL_VERSIONS);\n\n\tm_Ports = ReadUpgradeIniPorts(a_Settings, \"Server\", \"Ports\", \"Port\", \"PortsIPv6\", \"25565\");\n\n\tm_RCONServer.Initialize(a_Settings);\n\n\tm_bIsConnected = true;\n\n\tm_ServerID = \"-\";\n\tm_ShouldAuthenticate = a_ShouldAuth;\n\tif (m_ShouldAuthenticate)\n\t{\n\t\tauto & rand = GetRandomProvider();\n\t\tunsigned int r1 = rand.RandInt<unsigned int>(1000000000U, 0x7fffffffU);\n\t\tunsigned int r2 = rand.RandInt<unsigned int>(1000000000U, 0x7fffffffU);\n\t\tstd::ostringstream sid;\n\t\tsid << std::hex << r1;\n\t\tsid << std::hex << r2;\n\t\tm_ServerID = sid.str();\n\t\tm_ServerID.resize(16, '0');\n\t}\n\n\t// Check if both BungeeCord and online mode are on, if so, warn the admin:\n\tm_ShouldAllowBungeeCord = a_Settings.GetValueSetB(\"Authentication\", \"AllowBungeeCord\", false);\n\tm_OnlyAllowBungeeCord = a_Settings.GetValueSetB(\"Authentication\", \"OnlyAllowBungeeCord\", false);\n\tm_ProxySharedSecret = a_Settings.GetValueSet(\"Authentication\", \"ProxySharedSecret\", \"\");\n\n\tif (m_ShouldAllowBungeeCord && m_ShouldAuthenticate)\n\t{\n\t\tLOGWARNING(\"WARNING: BungeeCord is allowed and server set to online mode. This is unsafe and will not work properly. Disable either authentication or BungeeCord in settings.ini.\");\n\t}\n\n\tif (m_ShouldAllowBungeeCord && m_ProxySharedSecret.empty())\n\t{\n\t\tLOGWARNING(\"WARNING: There is not a Proxy Forward Secret set up, and any proxy server can forward a player to this server unless closed from the internet.\");\n\t}\n\n\tm_ShouldAllowMultiWorldTabCompletion = a_Settings.GetValueSetB(\"Server\", \"AllowMultiWorldTabCompletion\", true);\n\tm_ShouldLimitPlayerBlockChanges = a_Settings.GetValueSetB(\"AntiCheat\", \"LimitPlayerBlockChanges\", true);\n\n\tconst auto ClientViewDistance = a_Settings.GetValueSetI(\"Server\", \"DefaultViewDistance\", cClientHandle::DEFAULT_VIEW_DISTANCE);\n\tif (ClientViewDistance < cClientHandle::MIN_VIEW_DISTANCE)\n\t{\n\t\tm_ClientViewDistance = cClientHandle::MIN_VIEW_DISTANCE;\n\t\tLOGINFO(\"Setting default view distance to the minimum of %d\", m_ClientViewDistance);\n\t}\n\telse if (ClientViewDistance > cClientHandle::MAX_VIEW_DISTANCE)\n\t{\n\t\tm_ClientViewDistance = cClientHandle::MAX_VIEW_DISTANCE;\n\t\tLOGINFO(\"Setting default view distance to the maximum of %d\", m_ClientViewDistance);\n\t}\n\telse\n\t{\n\t\tm_ClientViewDistance = ClientViewDistance;\n\t}\n\n\tPrepareKeys();\n\n\treturn true;\n}\n\n\n\n\n\nbool cServer::RegisterForgeMod(const AString & a_ModName, const AString & a_ModVersion, UInt32 a_ProtocolVersionNumber)\n{\n\tauto & Mods = RegisteredForgeMods(a_ProtocolVersionNumber);\n\n\treturn Mods.insert({a_ModName, a_ModVersion}).second;\n}\n\n\n\n\n\nvoid cServer::UnregisterForgeMod(const AString & a_ModName, UInt32 a_ProtocolVersionNumber)\n{\n\tauto & Mods = RegisteredForgeMods(a_ProtocolVersionNumber);\n\n\tauto it = Mods.find(a_ModName);\n\tif (it != Mods.end())\n\t{\n\t\tMods.erase(it);\n\t}\n}\n\n\n\n\n\nAStringMap & cServer::RegisteredForgeMods(const UInt32 a_Protocol)\n{\n\tauto it = m_ForgeModsByVersion.find(a_Protocol);\n\n\tif (it == m_ForgeModsByVersion.end())\n\t{\n\t\tAStringMap mods;\n\t\tm_ForgeModsByVersion.insert({a_Protocol, mods});\n\t\treturn m_ForgeModsByVersion.find(a_Protocol)->second;\n\t}\n\n\treturn it->second;\n}\n\n\n\n\n\nconst AStringMap & cServer::GetRegisteredForgeMods(const UInt32 a_Protocol)\n{\n\treturn RegisteredForgeMods(a_Protocol);\n}\n\n\n\n\n\nbool cServer::IsPlayerInQueue(const AString & a_Username)\n{\n\tcCSLock Lock(m_CSClients);\n\tfor (const auto & client : m_Clients)\n\t{\n\t\tif ((client->GetUsername()).compare(a_Username) == 0)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cServer::PrepareKeys(void)\n{\n\tLOGD(\"Generating protocol encryption keypair...\");\n\tVERIFY(m_PrivateKey.Generate(1024));\n\tm_PublicKeyDER = m_PrivateKey.GetPubKeyDER();\n}\n\n\n\n\n\ncTCPLink::cCallbacksPtr cServer::OnConnectionAccepted(const AString & a_RemoteIPAddress)\n{\n\tLOGD(\"Client \\\"%s\\\" connected!\", a_RemoteIPAddress.c_str());\n\tcClientHandlePtr NewHandle = std::make_shared<cClientHandle>(a_RemoteIPAddress, m_ClientViewDistance);\n\tcCSLock Lock(m_CSClients);\n\tm_Clients.push_back(NewHandle);\n\treturn NewHandle;\n}\n\n\n\n\n\nvoid cServer::Tick(float a_Dt)\n{\n\t// Update server uptime\n\tm_UpTime++;\n\n\t// Send the tick to the plugins, as well as let the plugin manager reload, if asked to (issue #102):\n\tcPluginManager::Get()->Tick(a_Dt);\n\n\t// Process all the queued commands:\n\tTickCommands();\n\n\t// Tick all clients not yet assigned to a world:\n\tTickClients(a_Dt);\n\n\t// Process all queued tasks\n\tTickQueuedTasks();\n}\n\n\n\n\n\nvoid cServer::TickClients(float a_Dt)\n{\n\tcClientHandlePtrs RemoveClients;\n\t{\n\t\tcCSLock Lock(m_CSClients);\n\n\t\t// Remove clients that have moved to a world (the world will be ticking them from now on)\n\t\tfor (auto itr = m_ClientsToRemove.begin(), end = m_ClientsToRemove.end(); itr != end; ++itr)\n\t\t{\n\t\t\tfor (auto itrC = m_Clients.begin(), endC = m_Clients.end(); itrC != endC; ++itrC)\n\t\t\t{\n\t\t\t\tif (itrC->get() == *itr)\n\t\t\t\t{\n\t\t\t\t\tm_Clients.erase(itrC);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for itr - m_ClientsToRemove[]\n\t\tm_ClientsToRemove.clear();\n\n\t\t// Tick the remaining clients, take out those that have been destroyed into RemoveClients\n\t\tfor (auto itr = m_Clients.begin(); itr != m_Clients.end();)\n\t\t{\n\t\t\tauto & Client = *itr;\n\n\t\t\tClient->ServerTick(a_Dt);\n\t\t\tif (Client->IsDestroyed())\n\t\t\t{\n\t\t\t\t// Delete the client later, when CS is not held, to avoid deadlock: https://forum.cuberite.org/thread-374.html\n\t\t\t\tRemoveClients.push_back(std::move(Client));\n\t\t\t\titr = m_Clients.erase(itr);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t++itr;\n\t\t}  // for itr - m_Clients[]\n\t}\n\n\t// Delete the clients that have been destroyed\n\tRemoveClients.clear();\n}\n\n\n\n\n\nbool cServer::Start(void)\n{\n\tfor (const auto & port: m_Ports)\n\t{\n\t\tUInt16 PortNum;\n\t\tif (!StringToInteger(port, PortNum))\n\t\t{\n\t\t\tLOGWARNING(\"Invalid port specified for server: \\\"%s\\\". Ignoring.\", port.c_str());\n\t\t\tcontinue;\n\t\t}\n\t\tauto Handle = cNetwork::Listen(PortNum, std::make_shared<cServerListenCallbacks>(*this, PortNum));\n\t\tif (Handle->IsListening())\n\t\t{\n\t\t\tLOGINFO(\"Server Running On Port: %s\", port.c_str());\n\t\t\tm_ServerHandles.push_back(Handle);\n\t\t}\n\t}  // for port - Ports[]\n\tif (m_ServerHandles.empty())\n\t{\n\t\tLOGERROR(\"Couldn't open any ports. Aborting the server\");\n\t\treturn false;\n\t}\n\tm_TickThread.Start();\n\treturn true;\n}\n\n\n\n\n\nbool cServer::Command(cClientHandle & a_Client, AString & a_Cmd)\n{\n\tbool Res = cRoot::Get()->DoWithPlayerByUUID(\n\t\ta_Client.GetUUID(),\n\t\t[&](cPlayer & a_Player)\n\t\t{\n\t\t\treturn cRoot::Get()->GetPluginManager()->CallHookChat(a_Player, a_Cmd);\n\t\t}\n\t);\n\treturn Res;\n}\n\n\n\n\n\nvoid cServer::QueueExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output)\n{\n\t// Put the command into a queue (Alleviates FS #363):\n\tcCSLock Lock(m_CSPendingCommands);\n\tm_PendingCommands.emplace_back(a_Cmd, &a_Output);\n}\n\n\n\n\n\nvoid cServer::ScheduleTask(cTickTime a_DelayTicks, std::function<void(cServer &)> a_Task)\n{\n\tconst auto TargetTick = a_DelayTicks + m_UpTime;\n\t// Insert the task into the list of scheduled tasks\n\t{\n\t\tcCSLock Lock(m_CSTasks);\n\t\tm_Tasks.emplace_back(TargetTick, std::move(a_Task));\n\t}\n}\n\n\n\n\n\nvoid cServer::ExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output)\n{\n\tAStringVector split = StringSplit(a_Cmd, \" \");\n\tif (split.empty())\n\t{\n\t\treturn;\n\t}\n\n\t// \"stop\" and \"restart\" are handled in cRoot::ExecuteConsoleCommand, our caller, due to its access to controlling variables\n\n\t// \"help\" and \"reload\" are to be handled by Cuberite, so that they work no matter what\n\tif (split[0] == \"help\")\n\t{\n\t\tPrintHelp(split, a_Output);\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\telse if (split[0] == \"reload\")\n\t{\n\t\tif (split.size() > 1)\n\t\t{\n\t\t\tcPluginManager::Get()->ReloadPlugin(split[1]);\n\t\t\ta_Output.OutLn(\"Plugin reload scheduled\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcPluginManager::Get()->ReloadPlugins();\n\t\t}\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\telse if (split[0] == \"reloadplugins\")\n\t{\n\t\tcPluginManager::Get()->ReloadPlugins();\n\t\ta_Output.OutLn(\"Plugins reloaded\");\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\telse if (split[0] == \"reloadweb\")\n\t{\n\t\tcRoot::Get()->GetWebAdmin()->Reload();\n\t\ta_Output.OutLn(\"WebAdmin configuration reloaded\");\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\telse if (split[0] == \"load\")\n\t{\n\t\tif (split.size() > 1)\n\t\t{\n\t\t\tcPluginManager::Get()->RefreshPluginList();  // Refresh the plugin list, so that if the plugin was added just now, it is loadable\n\t\t\ta_Output.OutLn(cPluginManager::Get()->LoadPlugin(split[1]) ? \"Plugin loaded\" : \"Error occurred loading plugin\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Output.OutLn(\"Usage: load <PluginFolder>\");\n\t\t}\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\telse if (split[0] == \"unload\")\n\t{\n\t\tif (split.size() > 1)\n\t\t{\n\t\t\tcPluginManager::Get()->UnloadPlugin(split[1]);\n\t\t\ta_Output.OutLn(\"Plugin unload scheduled\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Output.OutLn(\"Usage: unload <PluginFolder>\");\n\t\t}\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\tif (split[0] == \"destroyentities\")\n\t{\n\t\tcRoot::Get()->ForEachWorld([](cWorld & a_World)\n\t\t\t{\n\t\t\t\ta_World.ForEachEntity([](cEntity & a_Entity)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!a_Entity.IsPlayer())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_Entity.Destroy();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t);\n\t\ta_Output.OutLn(\"Destroyed all entities\");\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\n\t// There is currently no way a plugin can do these (and probably won't ever be):\n\telse if (split[0].compare(\"chunkstats\") == 0)\n\t{\n\t\tcRoot::Get()->LogChunkStats(a_Output);\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\n\telse if (split[0].compare(\"luastats\") == 0)\n\t{\n\t\ta_Output.OutLn(cLuaStateTracker::GetStats());\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\telse if (cPluginManager::Get()->ExecuteConsoleCommand(split, a_Output, a_Cmd))\n\t{\n\t\ta_Output.Finished();\n\t\treturn;\n\t}\n\n\ta_Output.OutLn(\"Unknown command, type 'help' for all commands.\");\n\ta_Output.Finished();\n}\n\n\n\n\n\nvoid cServer::PrintHelp(const AStringVector & a_Split, cCommandOutputCallback & a_Output)\n{\n\tUNUSED(a_Split);\n\ttypedef std::pair<AString, AString> AStringPair;\n\ttypedef std::vector<AStringPair> AStringPairs;\n\n\tclass cCallback :\n\t\tpublic cPluginManager::cCommandEnumCallback\n\t{\n\tpublic:\n\t\tcCallback(void) : m_MaxLen(0) {}\n\n\t\tvirtual bool Command(const AString & a_Command, const cPlugin * a_Plugin, const AString & a_Permission, const AString & a_HelpString) override\n\t\t{\n\t\tUNUSED(a_Plugin);\n\t\tUNUSED(a_Permission);\n\t\t\tif (!a_HelpString.empty())\n\t\t\t{\n\t\t\t\tm_Commands.push_back(AStringPair(a_Command, a_HelpString));\n\t\t\t\tif (m_MaxLen < a_Command.length())\n\t\t\t\t{\n\t\t\t\t\tm_MaxLen = a_Command.length();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tAStringPairs m_Commands;\n\t\tsize_t m_MaxLen;\n\t} Callback;\n\tcPluginManager::Get()->ForEachConsoleCommand(Callback);\n\tstd::sort(Callback.m_Commands.begin(), Callback.m_Commands.end());\n\tfor (AStringPairs::const_iterator itr = Callback.m_Commands.begin(), end = Callback.m_Commands.end(); itr != end; ++itr)\n\t{\n\t\tconst AStringPair & cmd = *itr;\n\t\t// Output the commands and their help strings, with all the commands aligned to the same width\n\t\ta_Output.OutLn(fmt::format(FMT_STRING(\"{1:{0}s} - {2}\"), Callback.m_MaxLen, cmd.first, cmd.second));\n\t}  // for itr - Callback.m_Commands[]\n}\n\n\n\n\n\nvoid cServer::BindBuiltInConsoleCommands(void)\n{\n\t// Create an empty handler - the actual handling for the commands is performed before they are handed off to cPluginManager\n\tclass cEmptyHandler:\n\t\tpublic cPluginManager::cCommandHandler\n\t{\n\t\tvirtual bool ExecuteCommand(\n\t\t\tconst AStringVector & a_Split,\n\t\t\tcPlayer * a_Player,\n\t\t\tconst AString & a_Command,\n\t\t\tcCommandOutputCallback * a_Output = nullptr\n\t\t) override\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t};\n\tauto handler = std::make_shared<cEmptyHandler>();\n\n\t// Register internal commands:\n\tcPluginManager * PlgMgr = cPluginManager::Get();\n\tPlgMgr->BindConsoleCommand(\"help\",            nullptr, handler, \"Shows the available commands\");\n\tPlgMgr->BindConsoleCommand(\"reload\",          nullptr, handler, \"Reloads all plugins\");\n\tPlgMgr->BindConsoleCommand(\"reloadweb\",       nullptr, handler, \"Reloads the webadmin configuration\");\n\tPlgMgr->BindConsoleCommand(\"restart\",         nullptr, handler, \"Restarts the server cleanly\");\n\tPlgMgr->BindConsoleCommand(\"stop\",            nullptr, handler, \"Stops the server cleanly\");\n\tPlgMgr->BindConsoleCommand(\"chunkstats\",      nullptr, handler, \"Displays detailed chunk memory statistics\");\n\tPlgMgr->BindConsoleCommand(\"load\",            nullptr, handler, \"Adds and enables the specified plugin\");\n\tPlgMgr->BindConsoleCommand(\"unload\",          nullptr, handler, \"Disables the specified plugin\");\n\tPlgMgr->BindConsoleCommand(\"destroyentities\", nullptr, handler, \"Destroys all entities in all worlds\");\n}\n\n\n\n\n\nvoid cServer::Shutdown(void)\n{\n\t// Stop listening on all sockets:\n\tfor (const auto & srv: m_ServerHandles)\n\t{\n\t\tsrv->Close();\n\t}\n\tm_ServerHandles.clear();\n\n\t// Notify the tick thread and wait for it to terminate:\n\tm_TickThread.Stop();\n\n\t// Save all chunks in all worlds, wait for chunks to be sent to the ChunkStorage queue for each world:\n\tcRoot::Get()->SaveAllChunksNow();\n\n\t// Remove all clients:\n\tcCSLock Lock(m_CSClients);\n\tfor (auto itr = m_Clients.begin(); itr != m_Clients.end(); ++itr)\n\t{\n\t\t(*itr)->Destroy();\n\t}\n\tm_Clients.clear();\n}\n\n\n\n\n\nvoid cServer::KickUser(int a_ClientID, const AString & a_Reason)\n{\n\tcCSLock Lock(m_CSClients);\n\tfor (auto itr = m_Clients.begin(); itr != m_Clients.end(); ++itr)\n\t{\n\t\tif ((*itr)->GetUniqueID() == a_ClientID)\n\t\t{\n\t\t\t(*itr)->Kick(a_Reason);\n\t\t}\n\t}  // for itr - m_Clients[]\n}\n\n\n\n\n\nvoid cServer::AuthenticateUser(int a_ClientID, AString && a_Username, const cUUID & a_UUID, Json::Value && a_Properties)\n{\n\tcCSLock Lock(m_CSClients);\n\n\t// Check max players condition within lock (expect server and authenticator thread to both call here)\n\tif (GetNumPlayers() >= GetMaxPlayers())\n\t{\n\t\tKickUser(a_ClientID, \"The server is currently full :(\" \"\\n\" \"Try again later?\");\n\t\treturn;\n\t}\n\n\tfor (const auto & Client : m_Clients)\n\t{\n\t\tif (Client->GetUniqueID() == a_ClientID)\n\t\t{\n\t\t\tClient->Authenticate(std::move(a_Username), a_UUID, std::move(a_Properties));\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cServer::TickCommands(void)\n{\n\tdecltype(m_PendingCommands) PendingCommands;\n\t{\n\t\tcCSLock Lock(m_CSPendingCommands);\n\t\tstd::swap(PendingCommands, m_PendingCommands);\n\t}\n\n\t// Execute any pending commands:\n\tfor (const auto & Command : PendingCommands)\n\t{\n\t\tExecuteConsoleCommand(Command.first, *Command.second);\n\t}\n}\n\n\n\n\n\nvoid cServer::TickQueuedTasks(void)\n{\n\t// Move the tasks to be executed to a seperate vector to avoid deadlocks on\n\t// accessing m_Tasks\n\tdecltype(m_Tasks) Tasks;\n\t{\n\t\tcCSLock Lock(m_CSTasks);\n\t\tif (m_Tasks.empty())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Partition everything to be executed by returning false to move to end\n\t\t// of list if time reached\n\t\tauto MoveBeginIterator = std::partition(\n\t\t\tm_Tasks.begin(), m_Tasks.end(),\n\t\t\t[this](const decltype(m_Tasks)::value_type & a_Task)\n\t\t\t{\n\t\t\t\treturn a_Task.first >= m_UpTime;\n\t\t\t});\n\n\t\t// Cut all the due tasks from m_Tasks into Tasks:\n\t\tTasks.insert(\n\t\t\tTasks.end(), std::make_move_iterator(MoveBeginIterator),\n\t\t\tstd::make_move_iterator(m_Tasks.end()));\n\t\tm_Tasks.erase(MoveBeginIterator, m_Tasks.end());\n\t}\n\n\t// Execute each task:\n\tfor (const auto & Task : Tasks)\n\t{\n\t\tTask.second(*this);\n\t}  // for itr - m_Tasks[]\n}\n"
  },
  {
    "path": "src/Server.h",
    "content": "\n// cServer.h\n\n// Interfaces to the cServer object representing the network server\n\n\n\n\n\n#pragma once\n\n#include \"RCONServer.h\"\n#include \"OSSupport/IsThread.h\"\n#include \"OSSupport/Network.h\"\n\n#ifdef _MSC_VER\n\t#pragma warning(push)\n\t#pragma warning(disable:4127)\n\t#pragma warning(disable:4244)\n\t#pragma warning(disable:4231)\n\t#pragma warning(disable:4189)\n\t#pragma warning(disable:4702)\n#endif\n\n#include \"mbedTLS++/RsaPrivateKey.h\"\n\n#ifdef _MSC_VER\n\t#pragma warning(pop)\n#endif\n\n\n\n\n\n// fwd:\nclass cClientHandle;\ntypedef std::shared_ptr<cClientHandle> cClientHandlePtr;\ntypedef std::list<cClientHandlePtr> cClientHandlePtrs;\ntypedef std::list<cClientHandle *> cClientHandles;\nclass cCommandOutputCallback;\nclass cSettingsRepositoryInterface;\nclass cUUID;\n\n\nnamespace Json\n{\n\tclass Value;\n}\n\n\n\n\n\n// tolua_begin\nclass cServer\n{\npublic:\n\t// tolua_end\n\n\tvirtual ~cServer() {}\n\tbool InitServer(cSettingsRepositoryInterface & a_Settings, bool a_ShouldAuth);\n\n\t// tolua_begin\n\n\tconst AString & GetDescription(void) const {return m_Description; }\n\n\tconst AString & GetShutdownMessage(void) const { return m_ShutdownMessage; }\n\n\t// Player counts:\n\tsize_t GetMaxPlayers(void) const { return m_MaxPlayers; }\n\tsize_t GetNumPlayers(void) const { return m_PlayerCount; }\n\tvoid SetMaxPlayers(size_t a_MaxPlayers) { m_MaxPlayers = a_MaxPlayers; }\n\n\t// tolua_end\n\n\t/** Add a Forge mod to the server ping list. */\n\tbool RegisterForgeMod(const AString & a_ModName, const AString & a_ModVersion, UInt32 a_ProtocolVersionNumber);\n\n\t// tolua_begin\n\n\t/** Remove a Forge mod to the server ping list. */\n\tvoid UnregisterForgeMod(const AString & a_ModName, UInt32 a_ProtocolVersionNumber);\n\n\t/** Check if the player is queued to be transferred to a World.\n\tReturns true is Player is found in queue. */\n\tbool IsPlayerInQueue(const AString & a_Username);\n\n\t/** Can login more than once with same username.\n\tReturns false if it is not allowed, true otherwise. */\n\tbool DoesAllowMultiLogin(void) { return m_bAllowMultiLogin; }\n\n\t// Hardcore mode or not:\n\tbool IsHardcore(void) const { return m_bIsHardcore; }\n\n\t// tolua_end\n\n\t/** Returns true if clients must accept resource pack. This is read from the settings. */\n\tbool ShouldRequireResourcePack(void) { return m_RequireResourcePack; }\n\n\tconst AString & GetResourcePackUrl(void) { return m_ResourcePackUrl; }\n\n\tstd::string_view GetCustomRedirectUrl(void) { return m_CustomRedirectUrl; }\n\n\tbool Start(void);\n\n\tbool Command(cClientHandle & a_Client, AString & a_Cmd);\n\n\t/** Queues a console command for execution through the cServer class.\n\tThe command will be executed in the server tick thread.\n\tThe command's output will be written to the a_Output callback. */\n\tvoid QueueExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output);\n\n\t/** Queues a lambda task onto the server tick thread, with the specified delay in ticks. */\n\tvoid ScheduleTask(cTickTime a_DelayTicks, std::function<void(class cServer &)> a_Task);\n\n\t/** Lists all available console commands and their helpstrings */\n\tvoid PrintHelp(const AStringVector & a_Split, cCommandOutputCallback & a_Output);\n\n\t/** Binds the built-in console commands with the plugin manager */\n\tstatic void BindBuiltInConsoleCommands(void);\n\n\tvoid Shutdown(void);\n\n\tvoid KickUser(int a_ClientID, const AString & a_Reason);\n\n\t/** Authenticates the specified user, called by cAuthenticator supplying player details from Mojang. */\n\tvoid AuthenticateUser(int a_ClientID, AString && a_Username, const cUUID & a_UUID, Json::Value && a_Properties);\n\n\tconst AString & GetServerID(void) const { return m_ServerID; }  // tolua_export\n\n\t/** Don't tick a_Client anymore, it will be ticked from its cPlayer instead */\n\tvoid ClientMovedToWorld(const cClientHandle * a_Client);\n\n\t/** Notifies the server that a player was created; the server uses this to adjust the number of players */\n\tvoid PlayerCreated();\n\n\t/** Notifies the server that a player is being destroyed; the server uses this to adjust the number of players */\n\tvoid PlayerDestroyed();\n\n\t/** Returns base64 encoded favicon data (obtained from favicon.png) */\n\tconst AString & GetFaviconData(void) const { return m_FaviconData; }\n\n\tcRsaPrivateKey & GetPrivateKey(void) { return m_PrivateKey; }\n\tContiguousByteBufferView GetPublicKeyDER(void) const { return m_PublicKeyDER; }\n\n\t/** Returns true if authentication has been turned on in server settings. */\n\tbool ShouldAuthenticate(void) const { return m_ShouldAuthenticate; }  // tolua_export\n\n\t/** Returns true if limit for number of block changes per tick by a player has been turned on in server settings. */\n\tbool ShouldLimitPlayerBlockChanges(void) const { return m_ShouldLimitPlayerBlockChanges; }\n\n\t/** Returns true if BungeeCord logins (that specify the player's UUID) are allowed.\n\tRead from settings, admins should set this to true only when they chain to BungeeCord,\n\tit makes the server vulnerable to identity theft through direct connections. */\n\tbool ShouldAllowBungeeCord(void) const { return m_ShouldAllowBungeeCord; }\n\n\tbool OnlyAllowBungeeCord(void) const { return m_OnlyAllowBungeeCord; }\n\n\tconst AString & GetProxySharedSecret(void) const { return m_ProxySharedSecret; }\n\n\t/** Returns true if usernames should be completed across worlds. This is read\n\tfrom the settings. */\n\tbool ShouldAllowMultiWorldTabCompletion(void) const { return m_ShouldAllowMultiWorldTabCompletion; }\n\n\t/** Get the Forge mods (map of ModName -> ModVersionString) registered for a given protocol. */\n\tconst AStringMap & GetRegisteredForgeMods(const UInt32 a_Protocol);\n\nprivate:\n\n\tfriend class cRoot;  // so cRoot can create and destroy cServer\n\tfriend class cServerListenCallbacks;  // Accessing OnConnectionAccepted()\n\n\n\n\t/** The server tick thread takes care of the players who aren't yet spawned in a world */\n\tclass cTickThread:\n\t\tpublic cIsThread\n\t{\n\t\tusing Super = cIsThread;\n\n\tpublic:\n\n\t\tcTickThread(cServer & a_Server);\n\n\tprotected:\n\t\tcServer & m_Server;\n\n\t\t// cIsThread overrides:\n\t\tvirtual void Execute(void) override;\n\t} ;\n\n\n\n\t/** The network sockets listening for client connections. */\n\tcServerHandlePtrs m_ServerHandles;\n\n\t/** Protects m_Clients and m_ClientsToRemove against multithreaded access. */\n\tcCriticalSection m_CSClients;\n\n\t/** Clients that are connected to the server and not yet assigned to a cWorld. */\n\tcClientHandlePtrs m_Clients;\n\n\t/** Clients that have just been moved into a world and are to be removed from m_Clients in the next Tick(). */\n\tcClientHandles m_ClientsToRemove;\n\n\t/** Number of players currently playing in the server. */\n\tstd::atomic_size_t m_PlayerCount;\n\n\tcCriticalSection m_CSPendingCommands;\n\tstd::vector<std::pair<AString, cCommandOutputCallback *>> m_PendingCommands;\n\n\tint m_ClientViewDistance;  // The default view distance for clients; settable in Settings.ini\n\n\tbool m_bIsConnected;  // true - connected false - not connected\n\n\t/** The private key used for the assymetric encryption start in the protocols */\n\tcRsaPrivateKey m_PrivateKey;\n\n\t/** Public key for m_PrivateKey, ASN1-DER-encoded */\n\tContiguousByteBuffer m_PublicKeyDER;\n\n\tcRCONServer m_RCONServer;\n\n\tAString m_Description;\n\tAString m_ShutdownMessage;\n\tAString m_FaviconData;\n\tsize_t m_MaxPlayers;\n\tbool m_bIsHardcore;\n\tbool m_RequireResourcePack;\n\tAString m_ResourcePackUrl;\n\tAString m_CustomRedirectUrl;\n\n\t/** Map of protocol version to Forge mods (map of ModName -> ModVersionString) */\n\tstd::map<UInt32, AStringMap> m_ForgeModsByVersion;\n\n\t/** True - allow same username to login more than once False - only once */\n\tbool m_bAllowMultiLogin;\n\n\tcTickThread m_TickThread;\n\n\t/** The server ID used for client authentication */\n\tAString m_ServerID;\n\n\t/** If true, players will be online-authenticated agains Mojang servers.\n\tThis setting is the same as the \"online-mode\" setting in Vanilla. */\n\tbool m_ShouldAuthenticate;\n\n\t/** True if limit for number of block changes per tick by a player should be enabled. */\n\tbool m_ShouldLimitPlayerBlockChanges;\n\n\t/** True if BungeeCord handshake packets (with player UUID) should be accepted. */\n\tbool m_ShouldAllowBungeeCord;\n\n\t/** True if BungeeCord handshake packets should be the only ones accepted. */\n\tbool m_OnlyAllowBungeeCord;\n\n\t/** Security string that the proxy server should send, compatible with BungeeGuard */\n\tAString m_ProxySharedSecret;\n\n\t/** True if usernames should be completed across worlds. */\n\tbool m_ShouldAllowMultiWorldTabCompletion;\n\n\t/** The list of ports on which the server should listen for connections.\n\tInitialized in InitServer(), used in Start(). */\n\tAStringVector m_Ports;\n\n\n\t/** Time, in ticks, since the server started\n\t\tNot persistent across server restarts */\n\tcTickTimeLong m_UpTime;\n\n\t/** Guards the m_Tasks */\n\tcCriticalSection m_CSTasks;\n\n\t/** Tasks that have been queued onto the tick thread, possibly to be\n\texecuted at target tick in the future; guarded by m_CSTasks */\n\tstd::vector<std::pair<std::chrono::milliseconds, std::function<void(class cServer &)>>> m_Tasks;\n\n\n\tcServer(void);\n\n\t/** Executes the console command, sends output through the specified callback. */\n\tvoid ExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output);\n\n\t/** Get the Forge mods registered for a given protocol, for modification */\n\tAStringMap & RegisteredForgeMods(const UInt32 a_Protocol);\n\n\t/** Loads, or generates, if missing, RSA keys for protocol encryption */\n\tvoid PrepareKeys(void);\n\n\t/** Creates a new cClientHandle instance and adds it to the list of clients.\n\tReturns the cClientHandle reinterpreted as cTCPLink callbacks. */\n\tcTCPLink::cCallbacksPtr OnConnectionAccepted(const AString & a_RemoteIPAddress);\n\n\tvoid Tick(float a_Dt);\n\n\t/** Ticks the clients in m_Clients, manages the list in respect to removing clients */\n\tvoid TickClients(float a_Dt);\n\n\t/** Executes commands queued in the command queue. */\n\tvoid TickCommands(void);\n\n\n\t/** Executes all tasks queued onto the tick thread */\n\tvoid TickQueuedTasks(void);\n\n\n};  // tolua_export\n\n\n\n\n"
  },
  {
    "path": "src/SetChunkData.cpp",
    "content": "#include \"Globals.h\"\n#include \"SetChunkData.h\"\n#include \"BlockType.h\"\n#include \"Entities/Entity.h\"\n\n\n\n\n\nvoid SetChunkData::UpdateHeightMap()\n{\n\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t{\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tHEIGHTTYPE Height = 0;\n\t\t\tfor (HEIGHTTYPE y = cChunkDef::Height - 1; y > 0; y--)\n\t\t\t{\n\t\t\t\tBLOCKTYPE BlockType = BlockData.GetBlock({x, y, z});\n\t\t\t\tif (BlockType != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\tHeight = y;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t\tauto idx = x + cChunkDef::Width * z;\n\t\t\tHeightMap[idx] = Height;\n\t\t}  // for z\n\t}  // for x\n}\n"
  },
  {
    "path": "src/SetChunkData.h",
    "content": "#pragma once\n\n#include \"ChunkData.h\"\n#include \"BlockEntities/BlockEntity.h\"\n\n\n\n\n\n/** Contains the data for a loaded / generated chunk, ready to be set into a cWorld. */\nstruct SetChunkData\n{\n\t/** Initialise the structure with chunk coordinates.\n\tThe caller is responsible for initialising the remaining members. */\n\tSetChunkData(const cChunkCoords a_Chunk) :\n\t\tChunk(a_Chunk)\n\t{\n\t}\n\n\tcChunkCoords Chunk;\n\n\tChunkBlockData BlockData;\n\tChunkLightData LightData;\n\n\tcChunkDef::BiomeMap BiomeMap;\n\tcChunkDef::HeightMap HeightMap;\n\n\tcEntityList Entities;\n\tcBlockEntities BlockEntities;\n\n\tbool IsLightValid;\n\n\n\t/** Recalculates the HeightMap based on BlockData contents. */\n\tvoid UpdateHeightMap();\n};\n"
  },
  {
    "path": "src/SettingsRepositoryInterface.h",
    "content": "\n#pragma once\n\nclass cSettingsRepositoryInterface\n{\npublic:\n\n\tenum errors\n\t{\n\t\tnoID = -1,\n\t};\n\n\tcSettingsRepositoryInterface() = default;\n\tvirtual ~cSettingsRepositoryInterface() = default;\n\tDISALLOW_COPY_AND_ASSIGN(cSettingsRepositoryInterface);\n\n\t/** Returns true iff the specified key exists */\n\tvirtual bool KeyExists(const AString keyname) const = 0;\n\n\t/** Returns true iff the specified value exists. */\n\tvirtual bool HasValue(const AString & a_KeyName, const AString & a_ValueName) const = 0;\n\n\t/** Add a key name. Return value is not required to mean anything */\n\tvirtual int AddKeyName(const AString & keyname) = 0;\n\n\t/** Add a key comment, will always fail if the repository does not support comments */\n\tvirtual bool AddKeyComment(const AString & keyname, const AString & comment) = 0;\n\n\t/** Return a key comment, returns \"\" for repositories that do not return comments */\n\tvirtual AString GetKeyComment(const AString & keyname, const int commentID) const = 0;\n\n\t/** Delete a key comment, will always fail if the repository does not support comments */\n\tvirtual bool DeleteKeyComment(const AString & keyname, const int commentID) = 0;\n\n\t/** Adds a new value to the specified key.\n\tIf a value of the same name already exists, creates another one */\n\tvirtual void AddValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value) = 0;\n\n\t/** returns a vector containing a name, value pair for each value under the key */\n\tvirtual std::vector<std::pair<AString, AString>> GetValues(AString a_keyName) = 0;\n\n\t/** Get the value at the specified key and value, returns defValue on failure */\n\tvirtual AString GetValue (const AString & keyname, const AString & valuename, const AString & defValue = \"\")    const = 0;\n\n\t/** Gets the value; if not found, write the default to the repository */\n\tvirtual AString GetValueSet (const AString & keyname, const AString & valuename, const AString & defValue = \"\") = 0;\n\tvirtual int     GetValueSetI(const AString & keyname, const AString & valuename, const int       defValue = 0) = 0;\n\tvirtual Int64   GetValueSetI(const AString & keyname, const AString & valuename, const Int64     defValue = 0) = 0;\n\tvirtual bool    GetValueSetB(const AString & keyname, const AString & valuename, const bool      defValue = false) = 0;\n\n\t/** Overwrites the value of the key, value pair\n\tSpecify the optional parameter as false if you do not want the value created if it doesn't exist.\n\tReturns true if value set, false otherwise. */\n\tvirtual bool SetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists = true) = 0;\n\tvirtual bool SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists = true) = 0;\n\n\t/** Deletes the specified key, value pair */\n\tvirtual bool DeleteValue(const AString & keyname, const AString & valuename) = 0;\n\n\n\t/** Writes the changes to the backing store, if the repository has one */\n\tvirtual bool Flush() = 0;\n};\n"
  },
  {
    "path": "src/Simulator/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tDelayedFluidSimulator.cpp\n\tFireSimulator.cpp\n\tFloodyFluidSimulator.cpp\n\tFluidSimulator.cpp\n\tSandSimulator.cpp\n\tSimulator.cpp\n\tSimulatorManager.cpp\n\tVanillaFluidSimulator.cpp\n\tVaporizeFluidSimulator.cpp\n\n\tDelayedFluidSimulator.h\n\tFireSimulator.h\n\tFloodyFluidSimulator.h\n\tFluidSimulator.h\n\tNoopFluidSimulator.h\n\tNoopRedstoneSimulator.h\n\tRedstoneSimulator.h\n\tSandSimulator.h\n\tSimulator.h\n\tSimulatorManager.h\n\tVanillaFluidSimulator.h\n\tVaporizeFluidSimulator.h\n)\n"
  },
  {
    "path": "src/Simulator/DelayedFluidSimulator.cpp",
    "content": "\n// DelayedFluidSimulator.cpp\n\n// Interfaces to the cDelayedFluidSimulator class representing a fluid simulator that has a configurable delay\n// before simulating a block. Each tick it takes a consecutive delay \"slot\" and simulates only blocks in that slot.\n\n#include \"Globals.h\"\n\n#include \"DelayedFluidSimulator.h\"\n#include \"../World.h\"\n#include \"../Chunk.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cDelayedFluidSimulatorChunkData::cSlot\n\nbool cDelayedFluidSimulatorChunkData::cSlot::Add(int a_RelX, int a_RelY, int a_RelZ)\n{\n\tASSERT(a_RelZ >= 0);\n\tASSERT(a_RelZ < static_cast<int>(ARRAYCOUNT(m_Blocks)));\n\n\tauto & Blocks = m_Blocks[a_RelZ];\n\tconst auto Index = cChunkDef::MakeIndex(a_RelX, a_RelY, a_RelZ);\n\tfor (const auto & Block : Blocks)\n\t{\n\t\tif (Block.Data == Index)\n\t\t{\n\t\t\t// Already present\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - Blocks[]\n\tBlocks.emplace_back(a_RelX, a_RelY, a_RelZ, Index);\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cDelayedFluidSimulatorChunkData:\n\ncDelayedFluidSimulatorChunkData::cDelayedFluidSimulatorChunkData(int a_TickDelay) :\n\tm_Slots(new cSlot[ToUnsigned(a_TickDelay)])\n{\n}\n\n\n\n\n\ncDelayedFluidSimulatorChunkData::~cDelayedFluidSimulatorChunkData()\n{\n\tdelete[] m_Slots;\n\tm_Slots = nullptr;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cDelayedFluidSimulator:\n\ncDelayedFluidSimulator::cDelayedFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid, int a_TickDelay) :\n\tSuper(a_World, a_Fluid, a_StationaryFluid),\n\tm_TickDelay(a_TickDelay),\n\tm_AddSlotNum(a_TickDelay - 1),\n\tm_SimSlotNum(0),\n\tm_TotalBlocks(0)\n{\n}\n\n\n\n\n\nvoid cDelayedFluidSimulator::Simulate(float a_Dt)\n{\n\tm_AddSlotNum = m_SimSlotNum;\n\tm_SimSlotNum += 1;\n\tif (m_SimSlotNum >= m_TickDelay)\n\t{\n\t\tm_SimSlotNum = 0;\n\t}\n}\n\n\n\n\n\nvoid cDelayedFluidSimulator::SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk)\n{\n\tauto ChunkDataRaw = (m_FluidBlock == E_BLOCK_WATER) ? a_Chunk->GetWaterSimulatorData() : a_Chunk->GetLavaSimulatorData();\n\tcDelayedFluidSimulatorChunkData * ChunkData = static_cast<cDelayedFluidSimulatorChunkData *>(ChunkDataRaw);\n\tcDelayedFluidSimulatorChunkData::cSlot & Slot = ChunkData->m_Slots[m_SimSlotNum];\n\n\t// Simulate all the blocks in the scheduled slot:\n\tfor (size_t i = 0; i < ARRAYCOUNT(Slot.m_Blocks); i++)\n\t{\n\t\tauto & Blocks = Slot.m_Blocks[i];\n\t\tif (Blocks.empty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const auto & Block : Blocks)\n\t\t{\n\t\t\tSimulateBlock(a_Chunk, Block.x, Block.y, Block.z);\n\t\t}\n\t\tm_TotalBlocks -= static_cast<int>(Blocks.size());\n\t\tBlocks.clear();\n\t}\n}\n\n\n\n\n\nvoid cDelayedFluidSimulator::AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block)\n{\n\tif ((a_Block != m_FluidBlock) && (a_Block != m_StationaryFluidBlock))\n\t{\n\t\treturn;\n\t}\n\n\tauto ChunkDataRaw = (m_FluidBlock == E_BLOCK_WATER) ? a_Chunk.GetWaterSimulatorData() : a_Chunk.GetLavaSimulatorData();\n\tcDelayedFluidSimulatorChunkData * ChunkData = static_cast<cDelayedFluidSimulatorChunkData *>(ChunkDataRaw);\n\tcDelayedFluidSimulatorChunkData::cSlot & Slot = ChunkData->m_Slots[m_AddSlotNum];\n\n\t// Add, if not already present:\n\tif (!Slot.Add(a_Position.x, a_Position.y, a_Position.z))\n\t{\n\t\treturn;\n\t}\n\n\t++m_TotalBlocks;\n}\n"
  },
  {
    "path": "src/Simulator/DelayedFluidSimulator.h",
    "content": "\n// DelayedFluidSimulator.h\n\n// Interfaces to the cDelayedFluidSimulator class representing a fluid simulator that has a configurable delay\n// before simulating a block. Each tick it takes a consecutive delay \"slot\" and simulates only blocks in that slot.\n\n\n\n\n#pragma once\n\n#include \"FluidSimulator.h\"\n\n\n\n\n\nclass cDelayedFluidSimulatorChunkData :\n\tpublic cFluidSimulatorData\n{\npublic:\n\tclass cSlot\n\t{\n\tpublic:\n\t\t/** Returns true if the specified block is stored */\n\t\tbool HasBlock(int a_RelX, int a_RelY, int a_RelZ);\n\n\t\t/** Adds the specified block unless already present; returns true if added, false if the block was already present */\n\t\tbool Add(int a_RelX, int a_RelY, int a_RelZ);\n\n\t\t/** Array of block containers, each item stores blocks for one Z coord\n\t\tsize_t param is the block index (for faster duplicate comparison in Add())\n\t\t*/\n\t\tstd::vector<cCoordWithData<size_t>> m_Blocks[16];\n\t} ;\n\n\tcDelayedFluidSimulatorChunkData(int a_TickDelay);\n\tvirtual ~cDelayedFluidSimulatorChunkData() override;\n\n\t/** Slots, one for each delay tick, each containing the blocks to simulate */\n\tcSlot * m_Slots;\n} ;\n\n\n\n\n\nclass cDelayedFluidSimulator:\n\tpublic cFluidSimulator\n{\n\tusing Super = cFluidSimulator;\n\npublic:\n\n\tcDelayedFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid, int a_TickDelay);\n\nprotected:\n\n\tvirtual void Simulate(float a_Dt) override;\n\tvirtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override;\n\tvirtual void AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) override;\n\tvirtual cFluidSimulatorData * CreateChunkData(void) override { return new cDelayedFluidSimulatorChunkData(m_TickDelay); }\n\n\tint m_TickDelay;   // Count of the m_Slots array in each ChunkData\n\tint m_AddSlotNum;  // Index into m_Slots[] where to add new blocks in each ChunkData\n\tint m_SimSlotNum;  // Index into m_Slots[] where to simulate blocks in each ChunkData\n\n\tint m_TotalBlocks;  // Statistics only: the total number of blocks currently queued\n\n\t/* Slots:\n\t| 0 | 1 | ... | m_AddSlotNum | m_SimSlotNum | ... | m_TickDelay - 1 |\n\t|       adding blocks here ^ | ^ simulating here */\n\n\t/** Called from SimulateChunk() to simulate each block in one slot of blocks. Descendants override this method to provide custom simulation. */\n\tvirtual void SimulateBlock(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ) = 0;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Simulator/FireSimulator.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"FireSimulator.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../Defines.h\"\n#include \"../Chunk.h\"\n#include \"../Root.h\"\n#include \"../Bindings/PluginManager.h\"\n\n\n\n\n\n// Easy switch for turning on debugging logging:\n#if 0\n\t#define FIRE_FLOG FLOGD\n#else\n\t#define FIRE_FLOG(...)\n#endif\n\n\n\n\n\n#define MAX_CHANCE_REPLACE_FUEL 100000\n#define MAX_CHANCE_FLAMMABILITY 100000\n// The base chance that in a tick, rain will extinguish a fire block.\n#define CHANCE_BASE_RAIN_EXTINGUISH 0.2\n// The additional chance, multiplied by the meta of the fire block, that rain\n// will extinguish a fire block in a tick.\n#define CHANCE_AGE_M_RAIN_EXTINGUISH 0.03\n\n\n\n\n\nstatic constexpr Vector3i gCrossCoords[] =\n{\n\t{ 1, 0,  0},\n\t{-1, 0,  0},\n\t{ 0, 0,  1},\n\t{ 0, 0, -1},\n} ;\n\n\n\n\n\nstatic constexpr Vector3i gNeighborCoords[] =\n{\n\t{ 1,  0,  0},\n\t{-1,  0,  0},\n\t{ 0,  1,  0},\n\t{ 0, -1,  0},\n\t{ 0,  0,  1},\n\t{ 0,  0, -1},\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFireSimulator:\n\ncFireSimulator::cFireSimulator(cWorld & a_World, cIniFile & a_IniFile) :\n\tcSimulator(a_World)\n{\n\t// Read params from the ini file:\n\tm_BurnStepTimeFuel    = static_cast<unsigned>(a_IniFile.GetValueSetI(\"FireSimulator\", \"BurnStepTimeFuel\",     500));\n\tm_BurnStepTimeNonfuel = static_cast<unsigned>(a_IniFile.GetValueSetI(\"FireSimulator\", \"BurnStepTimeNonfuel\",  100));\n\tm_Flammability        = a_IniFile.GetValueSetI(\"FireSimulator\", \"Flammability\",          50);\n\tm_ReplaceFuelChance   = a_IniFile.GetValueSetI(\"FireSimulator\", \"ReplaceFuelChance\",  50000);\n}\n\n\n\n\n\nvoid cFireSimulator::SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk)\n{\n\tcCoordWithIntList & Data = a_Chunk->GetFireSimulatorData();\n\n\tint NumMSecs = static_cast<int>(a_Dt.count());\n\tfor (cCoordWithIntList::iterator itr = Data.begin(); itr != Data.end();)\n\t{\n\t\tVector3i relPos(itr->x, itr->y, itr->z);\n\t\tauto blockType = a_Chunk->GetBlock(relPos);\n\n\t\tif (!IsAllowedBlock(blockType))\n\t\t{\n\t\t\t// The block is no longer eligible (not a fire block anymore; a player probably placed a block over the fire)\n\t\t\tFIRE_FLOG(\"FS: Removing block {0}\", absPos);\n\t\t\titr = Data.erase(itr);\n\t\t\tcontinue;\n\t\t}\n\n\t\tauto BurnsForever = ((relPos.y > 0) && DoesBurnForever(a_Chunk->GetBlock(relPos.addedY(-1))));\n\t\tauto BlockMeta = a_Chunk->GetMeta(relPos);\n\n\t\tauto Raining = std::any_of(std::begin(gCrossCoords), std::end(gCrossCoords), [a_Chunk, relPos](Vector3i cc)\n\t\t{\n\t\t\tauto Adjusted = relPos + cc;\n\t\t\tconst auto Chunk = a_Chunk->GetRelNeighborChunkAdjustCoords(Adjusted);\n\t\t\tif ((Chunk != nullptr) && Chunk->IsValid())\n\t\t\t{\n\t\t\t\treturn Chunk->IsWeatherWetAt(Adjusted);\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\t// Randomly burn out the fire if it is raining:\n\t\tif (!BurnsForever && Raining && GetRandomProvider().RandBool(CHANCE_BASE_RAIN_EXTINGUISH + (BlockMeta * CHANCE_AGE_M_RAIN_EXTINGUISH)))\n\t\t{\n\t\t\ta_Chunk->SetBlock(relPos, E_BLOCK_AIR, 0);\n\t\t\titr = Data.erase(itr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Try to spread the fire:\n\t\tTrySpreadFire(a_Chunk, relPos);\n\n\t\titr->Data -= NumMSecs;\n\t\tif (itr->Data >= 0)\n\t\t{\n\t\t\t// Not yet, wait for it longer\n\t\t\t++itr;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// FIRE_FLOG(\"FS: Fire at {0} is stepping\", absPos);\n\n\t\t// TODO: Add some randomness into this\n\t\tconst auto BurnStep = GetBurnStepTime(a_Chunk, relPos);\n\t\tif (BurnStep == 0)\n\t\t{\n\t\t\t// Fire has no fuel or ground block, extinguish flame\n\t\t\ta_Chunk->SetBlock(relPos, E_BLOCK_AIR, 0);\n\t\t\titr = Data.erase(itr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Has the fire burnt out?\n\t\tif (BlockMeta == 0x0f)\n\t\t{\n\t\t\t// The fire burnt out completely\n\t\t\tFIRE_FLOG(\"FS: Fire at {0} burnt out, removing the fire block\", absPos);\n\t\t\ta_Chunk->SetBlock(relPos, E_BLOCK_AIR, 0);\n\t\t\tRemoveFuelNeighbors(a_Chunk, relPos);\n\t\t\titr = Data.erase(itr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Burn out the fire one step by increasing the meta:\n\t\tif (!BurnsForever)\n\t\t{\n\t\t\ta_Chunk->SetMeta(relPos, BlockMeta + 1);\n\t\t}\n\n\t\titr->Data = BurnStep;\n\t\t++itr;\n\t}  // for itr - Data[]\n}\n\n\n\n\n\nbool cFireSimulator::IsAllowedBlock(BLOCKTYPE a_BlockType)\n{\n\treturn (a_BlockType == E_BLOCK_FIRE);\n}\n\n\n\n\n\nbool cFireSimulator::IsFuel(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_PLANKS:\n\t\tcase E_BLOCK_DOUBLE_WOODEN_SLAB:\n\t\tcase E_BLOCK_WOODEN_SLAB:\n\t\tcase E_BLOCK_OAK_WOOD_STAIRS:\n\t\tcase E_BLOCK_SPRUCE_WOOD_STAIRS:\n\t\tcase E_BLOCK_BIRCH_WOOD_STAIRS:\n\t\tcase E_BLOCK_JUNGLE_WOOD_STAIRS:\n\t\tcase E_BLOCK_LEAVES:\n\t\tcase E_BLOCK_NEW_LEAVES:\n\t\tcase E_BLOCK_LOG:\n\t\tcase E_BLOCK_NEW_LOG:\n\t\tcase E_BLOCK_WOOL:\n\t\tcase E_BLOCK_BOOKCASE:\n\t\tcase E_BLOCK_FENCE:\n\t\tcase E_BLOCK_SPRUCE_FENCE:\n\t\tcase E_BLOCK_BIRCH_FENCE:\n\t\tcase E_BLOCK_JUNGLE_FENCE:\n\t\tcase E_BLOCK_DARK_OAK_FENCE:\n\t\tcase E_BLOCK_ACACIA_FENCE:\n\t\tcase E_BLOCK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:\n\t\tcase E_BLOCK_TNT:\n\t\tcase E_BLOCK_VINES:\n\t\tcase E_BLOCK_HAY_BALE:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_BIG_FLOWER:\n\t\tcase E_BLOCK_DANDELION:\n\t\tcase E_BLOCK_FLOWER:\n\t\tcase E_BLOCK_CARPET:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cFireSimulator::DoesBurnForever(BLOCKTYPE a_BlockType)\n{\n\treturn (a_BlockType == E_BLOCK_NETHERRACK);\n}\n\n\n\n\n\nvoid cFireSimulator::AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block)\n{\n\tif (!IsAllowedBlock(a_Block))\n\t{\n\t\treturn;\n\t}\n\n\t// Check for duplicates:\n\tcFireSimulatorChunkData & ChunkData = a_Chunk.GetFireSimulatorData();\n\tfor (cCoordWithIntList::iterator itr = ChunkData.begin(), end = ChunkData.end(); itr != end; ++itr)\n\t{\n\t\tconst Vector3i ItrPos{itr->x, itr->y, itr->z};\n\t\tif (ItrPos == a_Position)\n\t\t{\n\t\t\t// Block already present, check if burn step should decrease\n\t\t\t// This means if fuel is removed, then the fire burns out sooner\n\t\t\tconst auto NewBurnStep = GetBurnStepTime(&a_Chunk, a_Position);\n\t\t\tif (itr->Data > NewBurnStep)\n\t\t\t{\n\t\t\t\tFIRE_FLOG(\"FS: Block lost its fuel at {0}\", a_Block);\n\t\t\t\titr->Data = NewBurnStep;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t}  // for itr - ChunkData[]\n\n\tFIRE_FLOG(\"FS: Adding block {0}\", a_Block);\n\tChunkData.emplace_back(a_Position.x, a_Position.y, a_Position.z, 100);\n}\n\n\n\n\n\nint cFireSimulator::GetBurnStepTime(cChunk * a_Chunk, Vector3i a_RelPos)\n{\n\tbool IsBlockBelowSolid = false;\n\tif (a_RelPos.y > 0)\n\t{\n\t\tBLOCKTYPE BlockBelow = a_Chunk->GetBlock(a_RelPos.addedY(-1));\n\t\tif (DoesBurnForever(BlockBelow))\n\t\t{\n\t\t\t// Is burning atop of netherrack, burn forever (re-check in 10 sec)\n\t\t\treturn 10000;\n\t\t}\n\t\tif (IsFuel(BlockBelow))\n\t\t{\n\t\t\treturn static_cast<int>(m_BurnStepTimeFuel);\n\t\t}\n\t\tIsBlockBelowSolid = cBlockInfo::IsSolid(BlockBelow);\n\t}\n\n\tfor (const auto & cross: gCrossCoords)\n\t{\n\t\tBLOCKTYPE  BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\tif (a_Chunk->UnboundedRelGetBlock(a_RelPos + cross, BlockType, BlockMeta))\n\t\t{\n\t\t\tif (IsFuel(BlockType))\n\t\t\t{\n\t\t\t\treturn static_cast<int>(m_BurnStepTimeFuel);\n\t\t\t}\n\t\t}\n\t}  // for i - gCrossCoords[]\n\n\tif (!IsBlockBelowSolid)\n\t{\n\t\t// Checked through everything, nothing was flammable\n\t\t// If block below isn't solid, we can't have fire, it would be a non-fueled fire\n\t\treturn 0;\n\t}\n\treturn static_cast<int>(m_BurnStepTimeNonfuel);\n}\n\n\n\n\n\nvoid cFireSimulator::TrySpreadFire(cChunk * a_Chunk, Vector3i a_RelPos)\n{\n\t/*\n\tif (GetRandomProvider().RandBool(0.99))\n\t{\n\t\t// Make the chance to spread 100x smaller\n\t\treturn;\n\t}\n\t*/\n\n\tfor (int x = -1; x <= 1; x++)\n\t{\n\t\tfor (int z = -1; z <= 1; z++)\n\t\t{\n\t\t\tfor (int y = 1; y <= 2; y++)  // flames spread up one more block than around\n\t\t\t{\n\t\t\t\t// No need to check the coords for equality with the parent block,\n\t\t\t\t// it cannot catch fire anyway (because it's not an air block)\n\n\t\t\t\tif (!GetRandomProvider().RandBool(m_Flammability * (1.0 / MAX_CHANCE_FLAMMABILITY)))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Start the fire in the neighbor a_RelPos + {x, y, z}\n\t\t\t\tauto dstRelPos = a_RelPos + Vector3i{x, y, z};\n\t\t\t\tif (CanStartFireInBlock(a_Chunk, dstRelPos))\n\t\t\t\t{\n\t\t\t\t\tauto dstAbsPos = a_Chunk->RelativeToAbsolute(dstRelPos);\n\t\t\t\t\tif (cRoot::Get()->GetPluginManager()->CallHookBlockSpread(m_World, dstAbsPos, ssFireSpread))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tFIRE_FLOG(\"FS: Starting new fire at {0}.\", dstAbsPos);\n\t\t\t\t\ta_Chunk->UnboundedRelSetBlock(dstRelPos, E_BLOCK_FIRE, 0);\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n}\n\n\n\n\n\nvoid cFireSimulator::RemoveFuelNeighbors(cChunk * a_Chunk, Vector3i a_RelPos)\n{\n\tfor (auto & coord : gNeighborCoords)\n\t{\n\t\tauto relPos = a_RelPos + coord;\n\n\t\tif (!cChunkDef::IsValidHeight(relPos))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst auto neighbor = a_Chunk->GetRelNeighborChunkAdjustCoords(relPos);\n\n\t\tif ((neighbor == nullptr) || !neighbor->IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tBLOCKTYPE BlockType = neighbor->GetBlock(relPos);\n\n\t\tif (!IsFuel(BlockType))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tauto absPos = neighbor->RelativeToAbsolute(relPos);\n\t\tif (BlockType == E_BLOCK_TNT)\n\t\t{\n\t\t\tneighbor->SetBlock(relPos, E_BLOCK_AIR, 0);\n\t\t\tm_World.SpawnPrimedTNT(Vector3d(absPos) + Vector3d(0.5, 0.5, 0.5));  // 80 ticks to boom\n\t\t\treturn;\n\t\t}\n\n\t\tbool ShouldReplaceFuel = (GetRandomProvider().RandBool(m_ReplaceFuelChance * (1.0 / MAX_CHANCE_REPLACE_FUEL)));\n\t\tif (ShouldReplaceFuel && !cRoot::Get()->GetPluginManager()->CallHookBlockSpread(m_World, absPos, ssFireSpread))\n\t\t{\n\t\t\tneighbor->SetBlock(relPos, E_BLOCK_FIRE, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tneighbor->SetBlock(relPos, E_BLOCK_AIR, 0);\n\t\t}\n\t}  // for i - Coords[]\n}\n\n\n\n\n\nbool cFireSimulator::CanStartFireInBlock(cChunk * a_NearChunk, Vector3i a_RelPos)\n{\n\tBLOCKTYPE  BlockType;\n\tNIBBLETYPE BlockMeta;\n\tif (!a_NearChunk->UnboundedRelGetBlock(a_RelPos, BlockType, BlockMeta))\n\t{\n\t\t// The chunk is not accessible\n\t\treturn false;\n\t}\n\n\tif (BlockType != E_BLOCK_AIR)\n\t{\n\t\t// Only an air block can be replaced by a fire block\n\t\treturn false;\n\t}\n\n\tfor (const auto & neighbor: gNeighborCoords)\n\t{\n\t\tif (!a_NearChunk->UnboundedRelGetBlock(a_RelPos + neighbor, BlockType, BlockMeta))\n\t\t{\n\t\t\t// Neighbor inaccessible, skip it while evaluating\n\t\t\tcontinue;\n\t\t}\n\t\tif (IsFuel(BlockType))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}  // for i - Coords[]\n\treturn false;\n}\n"
  },
  {
    "path": "src/Simulator/FireSimulator.h",
    "content": "\n#pragma once\n\n#include \"Simulator.h\"\n#include \"../IniFile.h\"\n\n\n\n\n\n/** The fire simulator takes care of the fire blocks.\nIt periodically increases their meta (\"steps\") until they \"burn out\"; it also supports the forever burning netherrack.\nEach individual fire block gets stored in per-chunk data; that list is then used for fast retrieval.\nThe data value associated with each coord is used as the number of msec that the fire takes until\nit progresses to the next step (blockmeta++). This value is updated if a neighbor is changed.\nThe simulator reads its parameters from the ini file given to the constructor.\n*/\nclass cFireSimulator :\n\tpublic cSimulator\n{\npublic:\n\n\tcFireSimulator(cWorld & a_World, cIniFile & a_IniFile);\n\n\tstatic bool IsFuel   (BLOCKTYPE a_BlockType);\n\tstatic bool DoesBurnForever(BLOCKTYPE a_BlockType);\n\nprivate:\n\n\tvirtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override;\n\n\tstatic bool IsAllowedBlock(BLOCKTYPE a_BlockType);\n\n\t/** Time (in msec) that a fire block takes to burn with a fuel block into the next step */\n\tunsigned m_BurnStepTimeFuel;\n\n\t/** Time (in msec) that a fire block takes to burn without a fuel block into the next step */\n\tunsigned m_BurnStepTimeNonfuel;\n\n\t/** Chance [0..100000] of an adjacent fuel to catch fire on each tick */\n\tint m_Flammability;\n\n\t/** Chance [0..100000] of a fuel burning out being replaced by a new fire block instead of an air block */\n\tint m_ReplaceFuelChance;\n\n\tvirtual void AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) override;\n\n\t/** Returns the time [msec] after which the specified fire block is stepped again; based on surrounding fuels */\n\tint GetBurnStepTime(cChunk * a_Chunk, Vector3i a_RelPos);\n\n\t/** Tries to spread fire to a neighborhood of the specified block */\n\tvoid TrySpreadFire(cChunk * a_Chunk, Vector3i a_RelPos);\n\n\t/** Removes all burnable blocks neighboring the specified block */\n\tvoid RemoveFuelNeighbors(cChunk * a_Chunk, Vector3i a_RelPos);\n\n\t/** Returns true if a fire can be started in the specified block,\n\tthat is, it is an air block and has fuel next to it.\n\tNote that a_NearChunk may be a chunk neighbor to the block specified!\n\tThe coords are relative to a_NearChunk but not necessarily in it. */\n\tbool CanStartFireInBlock(cChunk * a_NearChunk, Vector3i a_RelPos);\n} ;\n\n\n\n\n\n/** Stores individual fire blocks in the chunk; the int data is used as the time [msec] the fire takes to step to another stage (blockmeta++) */\ntypedef cCoordWithIntList cFireSimulatorChunkData;\n"
  },
  {
    "path": "src/Simulator/FloodyFluidSimulator.cpp",
    "content": "\n// FloodyFluidSimulator.cpp\n\n// Interfaces to the cFloodyFluidSimulator that represents a fluid simulator that tries to flood everything :)\n// https://forum.cuberite.org/thread-565.html\n\n#include \"Globals.h\"\n\n#include \"FloodyFluidSimulator.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../Chunk.h\"\n#include \"../BlockArea.h\"\n#include \"../Blocks/BlockHandler.h\"\n#include \"../BlockInServerPluginInterface.h\"\n#include \"../Blocks/ChunkInterface.h\"\n\n\n\n\n\n// Enable or disable detailed logging\n#if 0\n\t#define FLUID_FLOG FLOGD\n#else\n\t#define FLUID_FLOG(...)\n#endif\n\n\n\n\n\ncFloodyFluidSimulator::cFloodyFluidSimulator(\n\tcWorld & a_World,\n\tBLOCKTYPE a_Fluid,\n\tBLOCKTYPE a_StationaryFluid,\n\tNIBBLETYPE a_Falloff,\n\tint a_TickDelay,\n\tint a_NumNeighborsForSource\n) :\n\tSuper(a_World, a_Fluid, a_StationaryFluid, a_TickDelay),\n\tm_Falloff(a_Falloff),\n\tm_NumNeighborsForSource(a_NumNeighborsForSource)\n{\n}\n\n\n\n\n\nvoid cFloodyFluidSimulator::SimulateBlock(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ)\n{\n\tFLUID_FLOG(\"Simulating block {0}: block {1}, meta {2}\",\n\t\ta_Chunk->PositionToWorldPosition(a_RelX, a_RelY, a_RelZ),\n\t\ta_Chunk->GetBlock(a_RelX, a_RelY, a_RelZ),\n\t\ta_Chunk->GetMeta(a_RelX, a_RelY, a_RelZ)\n\t);\n\n\tBLOCKTYPE MyBlock; NIBBLETYPE MyMeta;\n\ta_Chunk->GetBlockTypeMeta(a_RelX, a_RelY, a_RelZ, MyBlock, MyMeta);\n\n\tif (!IsAnyFluidBlock(MyBlock))\n\t{\n\t\t// Can happen - if a block is scheduled for simulating and gets replaced in the meantime.\n\t\tFLUID_FLOG(\"  BadBlockType exit\");\n\t\treturn;\n\t}\n\n\t// When in contact with water, lava should harden\n\tif (HardenBlock(a_Chunk, {a_RelX, a_RelY, a_RelZ}, MyBlock, MyMeta))\n\t{\n\t\t// Block was changed, bail out\n\t\treturn;\n\t}\n\n\tif (MyMeta != 0)\n\t{\n\t\t// Source blocks aren't checked for tributaries, others are.\n\t\tif (CheckTributaries(a_Chunk, a_RelX, a_RelY, a_RelZ, MyMeta))\n\t\t{\n\t\t\t// Has no tributary, has been decreased (in CheckTributaries()),\n\t\t\t// no more processing needed (neighbors have been scheduled by the decrease)\n\t\t\tFLUID_FLOG(\"  CheckTributaries exit\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// New meta for the spreading to neighbors:\n\t// If this is a source block or was falling, the new meta is just the falloff\n\t// Otherwise it is the current meta plus falloff (may be larger than max height, will be checked later)\n\tNIBBLETYPE NewMeta = ((MyMeta == 0) || ((MyMeta & 0x08) != 0)) ? m_Falloff : (MyMeta + m_Falloff);\n\tif (a_RelY > 0)\n\t{\n\t\tbool SpreadFurther = true;\n\t\tBLOCKTYPE Below = a_Chunk->GetBlock(a_RelX, a_RelY - 1, a_RelZ);\n\t\tif (IsPassableForFluid(Below) || IsBlockLava(Below) || IsBlockWater(Below))\n\t\t{\n\t\t\t// Spread only down, possibly washing away what's there or turning lava to stone / cobble / obsidian:\n\t\t\tSpreadToNeighbor(a_Chunk, a_RelX, a_RelY - 1, a_RelZ, 8);\n\n\t\t\t// Source blocks spread both downwards and sideways\n\t\t\tif (MyMeta != 0)\n\t\t\t{\n\t\t\t\tSpreadFurther = false;\n\t\t\t}\n\t\t}\n\t\t// Spread to the neighbors:\n\t\tif (SpreadFurther && (NewMeta < 8))\n\t\t{\n\t\t\tSpreadXZ(a_Chunk, a_RelX, a_RelY, a_RelZ, NewMeta);\n\t\t}\n\n\t\t// If source creation is on, check for it here:\n\t\tif (\n\t\t\t(m_NumNeighborsForSource > 0) &&    // Source creation is on\n\t\t\t(MyMeta == m_Falloff) &&            // Only exactly one block away from a source (fast bail-out)\n\t\t\t(\n\t\t\t\t!IsPassableForFluid(Below) ||  // Only exactly 1 block deep\n\t\t\t\t(Below == m_StationaryFluidBlock)  // Or a source block underneath\n\t\t\t) &&\n\t\t\tCheckNeighborsForSource(a_Chunk, a_RelX, a_RelY, a_RelZ)  // Did we create a source?\n\t\t)\n\t\t{\n\t\t\t// We created a source, no more spreading is to be done now\n\t\t\t// Also has been re-scheduled for ticking in the next wave, so no marking is needed\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Mark as processed:\n\ta_Chunk->FastSetBlock(a_RelX, a_RelY, a_RelZ, m_StationaryFluidBlock, MyMeta);\n}\n\n\n\n\n\nvoid cFloodyFluidSimulator::SpreadXZ(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta)\n{\n\tSpreadToNeighbor(a_Chunk, a_RelX - 1, a_RelY, a_RelZ,     a_NewMeta);\n\tSpreadToNeighbor(a_Chunk, a_RelX + 1, a_RelY, a_RelZ,     a_NewMeta);\n\tSpreadToNeighbor(a_Chunk, a_RelX,     a_RelY, a_RelZ - 1, a_NewMeta);\n\tSpreadToNeighbor(a_Chunk, a_RelX,     a_RelY, a_RelZ + 1, a_NewMeta);\n}\n\n\n\n\n\nbool cFloodyFluidSimulator::CheckTributaries(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_MyMeta)\n{\n\t// If we have a section above, check if there's fluid above this block that would feed it:\n\tif (a_RelY < cChunkDef::Height - 1)\n\t{\n\t\tif (IsAnyFluidBlock(a_Chunk->GetBlock(a_RelX, a_RelY + 1, a_RelZ)))\n\t\t{\n\t\t\t// This block is fed from above, no more processing needed\n\t\t\tFLUID_FLOG(\"  Fed from above\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Not fed from above, check if there's a feed from the side (but not if it's a downward-flowing block):\n\tif (a_MyMeta != 8)\n\t{\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\tstatic const Vector3i Coords[] =\n\t\t{\n\t\t\tVector3i( 1, 0,  0),\n\t\t\tVector3i(-1, 0,  0),\n\t\t\tVector3i( 0, 0,  1),\n\t\t\tVector3i( 0, 0, -1),\n\t\t} ;\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(Coords); i++)\n\t\t{\n\t\t\tif (!a_Chunk->UnboundedRelGetBlock(a_RelX + Coords[i].x, a_RelY, a_RelZ + Coords[i].z, BlockType, BlockMeta))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (IsAllowedBlock(BlockType) && IsHigherMeta(BlockMeta, a_MyMeta))\n\t\t\t{\n\t\t\t\t// This block is fed, no more processing needed\n\t\t\t\tFLUID_FLOG(\"  Fed from {0}, type {1}, meta {2}\",\n\t\t\t\t\ta_Chunk->PositionToWorldPosition(a_RelX+ Coords[i].x, a_RelY, a_RelZ + Coords[i].z),\n\t\t\t\t\tBlockType, BlockMeta\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}  // for i - Coords[]\n\t}  // if not fed from above\n\n\t// Block is not fed, decrease by m_Falloff levels:\n\tif (a_MyMeta >= 8)\n\t{\n\t\tFLUID_FLOG(\"  Not fed and downwards, turning into non-downwards meta {0}\", m_Falloff);\n\t\ta_Chunk->SetBlock({a_RelX, a_RelY, a_RelZ}, m_StationaryFluidBlock, m_Falloff);\n\t}\n\telse\n\t{\n\t\ta_MyMeta += m_Falloff;\n\t\tif (a_MyMeta < 8)\n\t\t{\n\t\t\tFLUID_FLOG(\"  Not fed, decreasing from {0} to {1}\", a_MyMeta - m_Falloff, a_MyMeta);\n\t\t\ta_Chunk->SetBlock({a_RelX, a_RelY, a_RelZ}, m_StationaryFluidBlock, a_MyMeta);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFLUID_FLOG(\"  Not fed, meta {0}, erasing altogether\", a_MyMeta);\n\t\t\ta_Chunk->SetBlock({a_RelX, a_RelY, a_RelZ}, E_BLOCK_AIR, 0);\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nvoid cFloodyFluidSimulator::SpreadToNeighbor(cChunk * a_NearChunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta)\n{\n\tASSERT(a_NewMeta <= 8);  // Invalid meta values\n\tASSERT(a_NewMeta > 0);  // Source blocks aren't spread\n\n\tVector3i relPos(a_RelX, a_RelY, a_RelZ);\n\ta_NearChunk = a_NearChunk->GetRelNeighborChunkAdjustCoords(relPos);\n\tif ((a_NearChunk == nullptr) || (!a_NearChunk->IsValid()))\n\t{\n\t\t// Chunk not available\n\t\treturn;\n\t}\n\n\tconst auto absPos = a_NearChunk->RelativeToAbsolute(relPos);\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\ta_NearChunk->GetBlockTypeMeta(relPos, BlockType, BlockMeta);\n\n\tif (IsAllowedBlock(BlockType))\n\t{\n\t\tif ((BlockMeta == a_NewMeta) || IsHigherMeta(BlockMeta, a_NewMeta))\n\t\t{\n\t\t\t// Don't spread there, there's already a higher or same level there\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Check water - lava interaction:\n\tif (m_FluidBlock == E_BLOCK_LAVA)\n\t{\n\t\tif (IsBlockWater(BlockType))\n\t\t{\n\t\t\t// Lava flowing into water, change to stone / cobblestone based on direction:\n\t\t\tBLOCKTYPE NewBlock = (a_NewMeta == 8) ? E_BLOCK_STONE : E_BLOCK_COBBLESTONE;\n\t\t\tFLUID_FLOG(\"  Lava flowing into water, turning water at rel {0} into {1}\",\n\t\t\t\trelPos, ItemTypeToString(NewBlock)\n\t\t\t);\n\t\t\ta_NearChunk->SetBlock(relPos, NewBlock, 0);\n\n\t\t\tm_World.BroadcastSoundEffect(\n\t\t\t\t\"block.lava.extinguish\",\n\t\t\t\tabsPos,\n\t\t\t\t0.5f,\n\t\t\t\t1.5f\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t}\n\telse if (m_FluidBlock == E_BLOCK_WATER)\n\t{\n\t\tif (IsBlockLava(BlockType))\n\t\t{\n\t\t\t// Water flowing into lava, change to cobblestone / obsidian based on dest block:\n\t\t\tBLOCKTYPE NewBlock = (BlockMeta == 0) ? E_BLOCK_OBSIDIAN : E_BLOCK_COBBLESTONE;\n\t\t\tFLUID_FLOG(\"  Water flowing into lava, turning lava at rel {0} into {1}\",\n\t\t\t\trelPos, ItemTypeToString(NewBlock)\n\t\t\t);\n\t\t\ta_NearChunk->SetBlock(relPos, NewBlock, 0);\n\n\t\t\tm_World.BroadcastSoundEffect(\n\t\t\t\t\"block.lava.extinguish\",\n\t\t\t\tabsPos,\n\t\t\t\t0.5f,\n\t\t\t\t1.5f\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\t\tASSERT(!\"Unknown fluid!\");\n\t}\n\n\tif (!IsPassableForFluid(BlockType))\n\t{\n\t\t// Can't spread there\n\t\treturn;\n\t}\n\n\t// Wash away the block there, if possible:\n\tif (CanWashAway(BlockType))\n\t{\n\t\tm_World.DropBlockAsPickups(absPos, nullptr, nullptr);\n\t}  // if (CanWashAway)\n\n\t// Spread:\n\tFLUID_FLOG(\"  Spreading to {0} with meta {1}\", absPos, a_NewMeta);\n\ta_NearChunk->SetBlock(relPos, m_FluidBlock, a_NewMeta);\n\tm_World.GetSimulatorManager()->WakeUp(*a_NearChunk, relPos);\n\n\tHardenBlock(a_NearChunk, relPos, m_FluidBlock, a_NewMeta);\n}\n\n\n\n\n\nbool cFloodyFluidSimulator::CheckNeighborsForSource(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ)\n{\n\tFLUID_FLOG(\"  Checking neighbors for source creation\");\n\n\tstatic const Vector3i NeighborCoords[] =\n\t{\n\t\tVector3i(-1, 0,  0),\n\t\tVector3i( 1, 0,  0),\n\t\tVector3i( 0, 0, -1),\n\t\tVector3i( 0, 0,  1),\n\t} ;\n\n\tint NumNeeded = m_NumNeighborsForSource;\n\tfor (size_t i = 0; i < ARRAYCOUNT(NeighborCoords); i++)\n\t{\n\t\tint x = a_RelX + NeighborCoords[i].x;\n\t\tint y = a_RelY + NeighborCoords[i].y;\n\t\tint z = a_RelZ + NeighborCoords[i].z;\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\tif (!a_Chunk->UnboundedRelGetBlock(x, y, z, BlockType, BlockMeta))\n\t\t{\n\t\t\t// Neighbor not available, skip it\n\t\t\tcontinue;\n\t\t}\n\t\t// FLUID_FLOG(\"   Neighbor at {0}: {1}\", Vector3i{x, y, z}, ItemToFullString(cItem(BlockType, 1, BlockMeta)));\n\t\tif ((BlockMeta == 0) && IsAnyFluidBlock(BlockType))\n\t\t{\n\t\t\tNumNeeded--;\n\t\t\t// FLUID_FLOG(\"    Found a neighbor source at {0}, NumNeeded := {1}\", Vector3i{x, y, z}, NumNeeded);\n\t\t\tif (NumNeeded == 0)\n\t\t\t{\n\t\t\t\t// Found enough, turn into a source and bail out\n\t\t\t\t// FLUID_FLOG(\"    Found enough neighbor sources, turning into a source\");\n\t\t\t\ta_Chunk->SetBlock({a_RelX, a_RelY, a_RelZ}, m_FluidBlock, 0);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// FLUID_FLOG(\"    Not enough neighbors for turning into a source, NumNeeded = {0}\", NumNeeded);\n\treturn false;\n}\n\n\n\n\n\nbool cFloodyFluidSimulator::HardenBlock(cChunk * a_Chunk, Vector3i a_RelPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta)\n{\n\tASSERT(cChunkDef::IsValidRelPos(a_RelPos));\n\n\t// Only lava blocks can harden\n\tif (!IsBlockLava(a_BlockType))\n\t{\n\t\treturn false;\n\t}\n\n\tbool ShouldHarden = false;\n\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\tstatic const Vector3i neighborOffsets[] =\n\t{\n\t\tVector3i( 1, 0,  0),\n\t\tVector3i(-1, 0,  0),\n\t\tVector3i( 0, 0,  1),\n\t\tVector3i( 0, 0, -1),\n\t};\n\tfor (const auto & ofs: neighborOffsets)\n\t{\n\t\tif (!a_Chunk->UnboundedRelGetBlock(a_RelPos + ofs, BlockType, BlockMeta))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (IsBlockWater(BlockType))\n\t\t{\n\t\t\tShouldHarden = true;\n\t\t}\n\t}  // for i - Coords[]\n\n\tif (ShouldHarden)\n\t{\n\t\tif (a_Meta == 0)\n\t\t{\n\t\t\t// Source lava block\n\t\t\ta_Chunk->SetBlock(a_RelPos, E_BLOCK_OBSIDIAN, 0);\n\t\t\treturn true;\n\t\t}\n\t\t// Ignore last lava level\n\t\telse if (a_Meta <= 4)\n\t\t{\n\t\t\ta_Chunk->SetBlock(a_RelPos, E_BLOCK_COBBLESTONE, 0);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n\n\n"
  },
  {
    "path": "src/Simulator/FloodyFluidSimulator.h",
    "content": "\n// FloodyFluidSimulator.h\n\n// Interfaces to the cFloodyFluidSimulator that represents a fluid simulator that tries to flood everything :)\n// https://forum.cuberite.org/thread-565.html\n\n\n\n\n\n#pragma once\n\n#include \"DelayedFluidSimulator.h\"\n\n\n\n\n\nclass cFloodyFluidSimulator:\n\tpublic cDelayedFluidSimulator\n{\n\tusing Super = cDelayedFluidSimulator;\n\npublic:\n\n\tcFloodyFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid, NIBBLETYPE a_Falloff, int a_TickDelay, int a_NumNeighborsForSource);\n\nprotected:\n\n\tNIBBLETYPE m_Falloff;\n\tint        m_NumNeighborsForSource;\n\n\t// cDelayedFluidSimulator overrides:\n\tvirtual void SimulateBlock(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ) override;\n\n\t/** Checks tributaries, if not fed, decreases the block's level and returns true. */\n\tbool CheckTributaries(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_MyMeta);\n\n\t/** Spreads into the specified block, if the blocktype there allows. a_Area is for checking. */\n\tvoid SpreadToNeighbor(cChunk * a_NearChunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta);\n\n\t/** Checks if there are enough neighbors to create a source at the coords specified; turns into source and returns true if so. */\n\tbool CheckNeighborsForSource(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);\n\n\t/** Checks if the specified block should harden (Water / Lava interaction) and if so, converts it to a suitable block.\n\tReturns whether the block was changed or not. */\n\tbool HardenBlock(cChunk * a_Chunk, Vector3i a_RelPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta);\n\n\t/** Spread fluid to XZ neighbors.\n\tThe coords are of the block currently being processed; a_NewMeta is the new meta for the new fluid block.\n\tDescendants may overridde to provide more sophisticated algorithms. */\n\tvirtual void SpreadXZ(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta);\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Simulator/FluidSimulator.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"FluidSimulator.h\"\n#include \"../World.h\"\n\n\n\n\n\ncFluidSimulator::cFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid) :\n\tSuper(a_World),\n\tm_FluidBlock(a_Fluid),\n\tm_StationaryFluidBlock(a_StationaryFluid)\n{\n}\n\n\n\n\n\nbool cFluidSimulator::IsAllowedBlock(BLOCKTYPE a_BlockType)\n{\n\treturn ((a_BlockType == m_FluidBlock) || (a_BlockType == m_StationaryFluidBlock));\n}\n\n\n\n\n\nbool cFluidSimulator::CanWashAway(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_BEETROOTS:\n\t\tcase E_BLOCK_BIG_FLOWER:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_CACTUS:\n\t\tcase E_BLOCK_CARROTS:\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_LILY_PAD:\n\t\tcase E_BLOCK_POTATOES:\n\t\tcase E_BLOCK_POWERED_RAIL:\n\t\tcase E_BLOCK_RAIL:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_RED_ROSE:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_SUGARCANE:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_TORCH:\n\t\tcase E_BLOCK_TRIPWIRE:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_YELLOW_FLOWER:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cFluidSimulator::IsSolidBlock(BLOCKTYPE a_BlockType)\n{\n\treturn !IsPassableForFluid(a_BlockType);\n}\n\n\n\n\n\nbool cFluidSimulator::IsPassableForFluid(BLOCKTYPE a_BlockType)\n{\n\treturn (\n\t\t(a_BlockType == E_BLOCK_AIR) ||\n\t\t(a_BlockType == E_BLOCK_FIRE) ||\n\t\tIsAllowedBlock(a_BlockType) ||\n\t\tCanWashAway(a_BlockType)\n\t);\n}\n\n\n\n\n\nbool cFluidSimulator::IsHigherMeta(NIBBLETYPE a_Meta1, NIBBLETYPE a_Meta2)\n{\n\tif (a_Meta1 == 0)\n\t{\n\t\t// Source block is higher than anything, even itself.\n\t\treturn true;\n\t}\n\tif ((a_Meta1 & 0x08) != 0)\n\t{\n\t\t// Falling fluid is higher than anything, including self\n\t\treturn true;\n\t}\n\n\tif (a_Meta2 == 0)\n\t{\n\t\t// Second block is a source and first block isn't\n\t\treturn false;\n\t}\n\tif ((a_Meta2 & 0x08) != 0)\n\t{\n\t\t// Second block is falling and the first one is neither a source nor falling\n\t\treturn false;\n\t}\n\n\t// All special cases have been handled, now it's just a raw comparison:\n\treturn (a_Meta1 < a_Meta2);\n}\n\n\n\n\n\nVector3f cFluidSimulator::GetFlowingDirection(Vector3i a_Pos)\n{\n\tif (!cChunkDef::IsValidHeight(a_Pos))\n\t{\n\t\treturn {};\n\t}\n\n\tif (!IsAllowedBlock(m_World.GetBlock(a_Pos)))  // No Fluid -> No Flowing direction :D\n\t{\n\t\treturn {};\n\t}\n\n\tconst auto HeightFromMeta = [](NIBBLETYPE a_BlockMeta) -> NIBBLETYPE\n\t\t{\n\t\t\t// Falling water blocks are always full height (0)\n\t\t\treturn ((a_BlockMeta & 0x08) != 0) ? 0 : a_BlockMeta;\n\t\t};\n\n\tauto BlockMeta = m_World.GetBlockMeta(a_Pos);\n\tNIBBLETYPE CentralPoint = HeightFromMeta(BlockMeta);\n\tNIBBLETYPE LevelPoint[4];\n\n\t// blocks around the checking pos\n\tstd::array<Vector3i, 4> Offsets\n\t{\n\t\t{\n\t\t\t{ 1, 0, 0 },\n\t\t\t{ 0, 0, 1 },\n\t\t\t{ 1, 0, 0 },\n\t\t\t{ 0, 0, 1 }\n\t\t}\n\t};\n\n\tfor (size_t i = 0; i < Offsets.size(); i++)\n\t{\n\t\tif (IsAllowedBlock(m_World.GetBlock(a_Pos + Offsets[i])))\n\t\t{\n\t\t\tLevelPoint[i] = HeightFromMeta(m_World.GetBlockMeta(Offsets[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLevelPoint[i] = CentralPoint;\n\t\t}\n\t}\n\n\tVector3f Direction;\n\n\t// Calculate the flow direction\n\n\tDirection.x = (LevelPoint[0] - LevelPoint[2]) / 2.0f;\n\tDirection.z = (LevelPoint[1] - LevelPoint[3]) / 2.0f;\n\n\tif ((BlockMeta & 0x08) != 0)  // Test falling bit\n\t{\n\t\tDirection.y = -1.0f;\n\t}\n\n\treturn Direction;\n}\n\n"
  },
  {
    "path": "src/Simulator/FluidSimulator.h",
    "content": "\n#pragma once\n\n#include \"Simulator.h\"\n\n\nclass cWorld;\n\n\nenum Direction\n{\n\tX_PLUS,\n\tX_MINUS,\n\tY_PLUS,\n\tY_MINUS,\n\tZ_PLUS,\n\tZ_MINUS,\n\tNONE\n};\n\n\n\n\n\n/** This is a base class for all fluid simulator data classes.\nNeeded so that cChunk can properly delete instances of fluid simulator data, no matter what simulator it's using. */\nclass cFluidSimulatorData\n{\npublic:\n\tvirtual ~cFluidSimulatorData() {}\n};\n\n\n\n\n\nclass cFluidSimulator:\n\tpublic cSimulator\n{\n\tusing Super = cSimulator;\n\npublic:\n\n\tcFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid);\n\n\t/** Returns a unit vector in the direction the fluid is flowing or a zero-vector if not flowing. */\n\tvirtual Vector3f GetFlowingDirection(Vector3i a_Pos);\n\n\t/** Creates a ChunkData object for the simulator to use. The simulator returns the correct object type. */\n\tvirtual cFluidSimulatorData * CreateChunkData(void) = 0;\n\n\tbool IsFluidBlock          (BLOCKTYPE a_BlockType) const { return (a_BlockType == m_FluidBlock); }\n\tbool IsStationaryFluidBlock(BLOCKTYPE a_BlockType) const { return (a_BlockType == m_StationaryFluidBlock); }\n\tbool IsAnyFluidBlock       (BLOCKTYPE a_BlockType) const { return ((a_BlockType == m_FluidBlock) || (a_BlockType == m_StationaryFluidBlock)); }\n\n\tstatic bool CanWashAway(BLOCKTYPE a_BlockType);\n\n\tbool IsSolidBlock      (BLOCKTYPE a_BlockType);\n\tbool IsPassableForFluid(BLOCKTYPE a_BlockType);\n\n\t/** Returns true if a_Meta1 is a higher fluid than a_Meta2. Takes source blocks into account. */\n\tbool IsHigherMeta(NIBBLETYPE a_Meta1, NIBBLETYPE a_Meta2);\n\nprotected:\n\n\tbool IsAllowedBlock(BLOCKTYPE a_BlockType);\n\n\tBLOCKTYPE m_FluidBlock;            // The fluid block type that needs simulating\n\tBLOCKTYPE m_StationaryFluidBlock;  // The fluid block type that indicates no simulation is needed\n};\n\n\n\n\n\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tForEachSourceCallback.cpp\n\tIncrementalRedstoneSimulator.cpp\n\tRedstoneHandler.cpp\n\n\tCommandBlockHandler.h\n\tDaylightSensorHandler.h\n\tDoorHandler.h\n\tDropSpenserHandler.h\n\tForEachSourceCallback.h\n\tHopperHandler.h\n\tIncrementalRedstoneSimulator.h\n\tRedstoneHandler.h\n\tRedstoneSimulatorChunkData.h\n\tRedstoneComparatorHandler.h\n\tRedstoneDataHelper.h\n\tRedstoneRepeaterHandler.h\n\tRedstoneBlockHandler.h\n\tRedstoneTorchHandler.h\n\tRedstoneWireHandler.h\n\tRedstoneLampHandler.h\n\tRedstoneToggleHandler.h\n\tPistonHandler.h\n\tSmallGateHandler.h\n\tNoteBlockHandler.h\n\tObserverHandler.h\n\tTNTHandler.h\n\tTrappedChestHandler.h\n\tTripwireHookHandler.h\n\tPoweredRailHandler.h\n\tPressurePlateHandler.h\n)\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/CommandBlockHandler.h",
    "content": "\n#pragma once\n\n#include \"../../BlockEntities/CommandBlockEntity.h\"\n\n\n\n\n\nnamespace CommandBlockHandler\n{\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating commander the cmdblck (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tconst auto Previous = DataForChunk(a_Chunk).ExchangeUpdateOncePowerData(a_Position, Power);\n\t\tif ((Previous != 0) || (Power == 0))\n\t\t{\n\t\t\t// If we're already powered or received an update of no power, don't activate\n\t\t\treturn;\n\t\t}\n\n\t\ta_Chunk.DoWithBlockEntityAt(a_Position, [](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_COMMAND_BLOCK);\n\n\t\t\tstatic_cast<cCommandBlockEntity &>(a_BlockEntity).Activate();\n\t\t\treturn false;\n\t\t});\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/DaylightSensorHandler.h",
    "content": "\n#pragma once\n\n#include \"World.h\"\n\n\n\n\n\nnamespace DaylightSensorHandler\n{\n\tstatic PowerLevel GetPowerLevel(const cChunk & a_Chunk, const Vector3i a_Position)\n\t{\n\t\tif (a_Chunk.GetBlock(a_Position) == E_BLOCK_INVERTED_DAYLIGHT_SENSOR)\n\t\t{\n\t\t\t// Inverted sensor directly returns darkened skylight, no fancy tricks:\n\t\t\treturn 15 - a_Chunk.GetSkyLightAltered(a_Position);\n\t\t}\n\n\t\t// The [0, 1) proportion of the current day that has elapsed.\n\t\tconst auto ProportionOfDay = a_Chunk.GetWorld()->GetTimeOfDay().count() * (static_cast<float>(M_PI) / 12000.f);\n\n\t\t// The curved value of darkened skylight, with outputs somewhat similar to Vanilla.\n\t\tconst auto RawOutput = a_Chunk.GetSkyLightAltered(a_Position) * (0.6f * std::sin(ProportionOfDay) + 0.5f);\n\n\t\t// Saturate the amplified sine curve at 0 and 15:\n\t\treturn static_cast<PowerLevel>(std::clamp(RawOutput, 0.f, 15.f));\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\n\t\t// Daylight sensors only output to immediately surrounding blocks:\n\t\treturn IsLinked ? 0 : a_Chunk.GetMeta(a_Position);\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating Darryl the daylight sensor (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\t// What the sensor should output according to the time-power function.\n\t\tconst auto PowerLevel = GetPowerLevel(a_Chunk, a_Position);\n\n\t\t// Only update the output if the power level has changed:\n\t\tif (PowerLevel != a_Meta)\n\t\t{\n\t\t\ta_Chunk.SetMeta(a_Position, PowerLevel);\n\t\t\tUpdateAdjustedRelatives(a_Chunk, CurrentlyTicking, a_Position, RelativeAdjacents);\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tUNUSED(Callback);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/DoorHandler.h",
    "content": "\n#pragma once\n\n#include \"../../Blocks/BlockDoor.h\"\n\n\n\n\n\nnamespace DoorHandler\n{\n\t// \"Doormammu, I've come to bargain\"\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\t\treturn 0;\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating dori the door (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tNIBBLETYPE TopMeta;\n\t\tconst bool IsTop = (a_Meta & 0x8) == 0x8;\n\t\tconst auto TopPosition = IsTop ? a_Position : a_Position.addedY(1);\n\n\t\t// Figure out the metadata of the top half, which stores the previous redstone power state:\n\t\tif (IsTop)\n\t\t{\n\t\t\tTopMeta = a_Meta;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (TopPosition.y == cChunkDef::Height)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tBLOCKTYPE AboveType;\n\t\t\ta_Chunk.GetBlockTypeMeta(TopPosition, AboveType, TopMeta);\n\t\t\tif (!cBlockDoorHandler::IsDoorBlockType(AboveType))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst auto OppositeHalfPosition = a_Position + (IsTop ? OffsetYM : OffsetYP);\n\t\tForEachSourceCallback Callback(a_Chunk, OppositeHalfPosition, a_BlockType);\n\t\tForValidSourcePositions(a_Chunk, OppositeHalfPosition, a_BlockType, a_Meta, Callback);\n\n\t\t// Factor in what the other half is getting:\n\t\tPower = std::max(Power, Callback.Power);\n\n\t\tconst bool ShouldBeOpen = Power != 0;\n\t\tconst bool PreviouslyPowered = (TopMeta & 0x2) == 0x2;\n\n\t\t// Allow players to override redstone control\n\t\t// don't update if redstone power hasn't changed since we last saw it:\n\t\tif (ShouldBeOpen == PreviouslyPowered)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Update the previous redstone power:\n\t\tif (ShouldBeOpen)\n\t\t{\n\t\t\ta_Chunk.SetMeta(TopPosition, TopMeta | 0x2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Chunk.SetMeta(TopPosition, TopMeta & ~0x2);\n\t\t}\n\n\t\tcChunkInterface ChunkInterface(a_Chunk.GetWorld()->GetChunkMap());\n\t\tconst auto AbsolutePosition = cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos());\n\n\t\t// Toggle the door, if it needs to be changed:\n\t\tif (ShouldBeOpen != cBlockDoorHandler::IsOpen(ChunkInterface, AbsolutePosition))\n\t\t{\n\t\t\tcBlockDoorHandler::SetOpen(ChunkInterface, AbsolutePosition, ShouldBeOpen);\n\t\t\ta_Chunk.GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_WOODEN_DOOR_OPEN, AbsolutePosition, 0);\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/DropSpenserHandler.h",
    "content": "\n#pragma once\n\n#include \"../../BlockEntities/DropSpenserEntity.h\"\n\n\n\n\n\nnamespace DropSpenserHandler\n{\n\tstatic bool IsActivated(NIBBLETYPE a_Meta)\n\t{\n\t\treturn (a_Meta & E_META_DROPSPENSER_ACTIVATED) != 0;\n\t}\n\n\tstatic NIBBLETYPE SetActivationState(NIBBLETYPE a_Meta, bool IsOn)\n\t{\n\t\tif (IsOn)\n\t\t{\n\t\t\treturn a_Meta | E_META_DROPSPENSER_ACTIVATED;  // set the bit\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn a_Meta & ~E_META_DROPSPENSER_ACTIVATED;  // clear the bit\n\t\t}\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating spencer the dropspenser (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tconst bool IsPoweredNow = (Power > 0);\n\t\tconst bool WasPoweredPreviously = IsActivated(a_Meta);\n\n\t\tif (IsPoweredNow && !WasPoweredPreviously)\n\t\t{\n\t\t\ta_Chunk.DoWithBlockEntityAt(a_Position, [](cBlockEntity & a_BlockEntity)\n\t\t\t{\n\t\t\t\tASSERT((a_BlockEntity.GetBlockType() == E_BLOCK_DISPENSER) || (a_BlockEntity.GetBlockType() == E_BLOCK_DROPPER));\n\n\t\t\t\tstatic_cast<cDropSpenserEntity &>(a_BlockEntity).Activate();\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\n\t\t// Update the internal dropspenser state if necessary\n\t\tif (IsPoweredNow != WasPoweredPreviously)\n\t\t{\n\t\t\ta_Chunk.SetMeta(a_Position, SetActivationState(a_Meta, IsPoweredNow));\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\n\t\t// Consider indirect power:\n\t\tCallback.CheckIndirectPower();\n\n\t\t// Consider normal adjacents:\n\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/ForEachSourceCallback.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"ForEachSourceCallback.h\"\n#include \"BlockType.h\"\n#include \"../../BlockInfo.h\"\n#include \"../../Chunk.h\"\n#include \"IncrementalRedstoneSimulator.h\"\n#include \"RedstoneHandler.h\"\n\n\n\n\n\nForEachSourceCallback::ForEachSourceCallback(const cChunk & Chunk, const Vector3i Position, const BLOCKTYPE CurrentBlock) :\n\tPower(0),\n\tm_Chunk(Chunk),\n\tm_Position(Position),\n\tm_CurrentBlock(CurrentBlock)\n{\n}\n\n\n\n\n\nvoid ForEachSourceCallback::operator()(Vector3i Location)\n{\n\tif (!cChunkDef::IsValidHeight(Location))\n\t{\n\t\treturn;\n\t}\n\n\tconst auto NeighbourChunk = m_Chunk.GetRelNeighborChunkAdjustCoords(Location);\n\tif ((NeighbourChunk == nullptr) || !NeighbourChunk->IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tconst auto PotentialSourceBlock = NeighbourChunk->GetBlock(Location);\n\tconst auto NeighbourRelativeQueryPosition = cIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(m_Chunk, *NeighbourChunk, m_Position);\n\n\tif (!cBlockInfo::IsTransparent(PotentialSourceBlock))\n\t{\n\t\tPower = std::max(Power, QueryLinkedPower(*NeighbourChunk, NeighbourRelativeQueryPosition, m_CurrentBlock, Location));\n\t}\n\telse\n\t{\n\t\tPower = std::max(\n\t\t\tPower,\n\t\t\tRedstoneHandler::GetPowerDeliveredToPosition(\n\t\t\t\t*NeighbourChunk, Location, PotentialSourceBlock,\n\t\t\t\tNeighbourRelativeQueryPosition, m_CurrentBlock, false\n\t\t\t)\n\t\t);\n\t}\n}\n\n\n\n\n\nvoid ForEachSourceCallback::CheckIndirectPower()\n{\n\tconst Vector3i OffsetYP(0, 1, 0);\n\tconst auto Above = m_Position + OffsetYP;\n\n\tif (Above.y == cChunkDef::Height)\n\t{\n\t\treturn;\n\t}\n\n\t// Object representing restarted power calculation where the\n\t// block above this piston, dropspenser is requesting a power level.\n\tForEachSourceCallback QuasiQueryCallback(m_Chunk, Above, m_Chunk.GetBlock(Above));\n\n\t// Manually feed the callback object all positions that may deliver power to Above:\n\tfor (const auto & QuasiPowerOffset : cSimulator::GetLinkedOffsets(OffsetYP))\n\t{\n\t\tQuasiQueryCallback(m_Position + QuasiPowerOffset);\n\t}\n\n\t// Get the results:\n\tPower = std::max(Power, QuasiQueryCallback.Power);\n}\n\n\n\n\n\nPowerLevel ForEachSourceCallback::QueryLinkedPower(const cChunk & Chunk, const Vector3i QueryPosition, const BLOCKTYPE QueryBlock, const Vector3i SolidBlockPosition)\n{\n\tPowerLevel Power = 0;\n\n\t// Loop through all linked powerable offsets in the direction requested:\n\tfor (const auto & Offset : cSimulator::GetLinkedOffsets(SolidBlockPosition - QueryPosition))\n\t{\n\t\tauto SourcePosition = QueryPosition + Offset;\n\t\tif (!cChunkDef::IsValidHeight(SourcePosition))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst auto NeighbourChunk = Chunk.GetRelNeighborChunkAdjustCoords(SourcePosition);\n\t\tif ((NeighbourChunk == nullptr) || !NeighbourChunk->IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Conduit block's position, relative to NeighbourChunk.\n\t\tconst auto NeighbourRelativeSolidBlockPosition = cIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(Chunk, *NeighbourChunk, SolidBlockPosition);\n\n\t\t// Do a standard power query, but the requester's position is actually the solid block that will conduct power:\n\t\tPower = std::max(\n\t\t\tPower,\n\t\t\tRedstoneHandler::GetPowerDeliveredToPosition(\n\t\t\t\t*NeighbourChunk, SourcePosition, NeighbourChunk->GetBlock(SourcePosition),\n\t\t\t\tNeighbourRelativeSolidBlockPosition, QueryBlock, true\n\t\t\t)\n\t\t);\n\t}\n\n\treturn Power;\n}\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/ForEachSourceCallback.h",
    "content": "\n#pragma once\n\n#include \"RedstoneSimulatorChunkData.h\"\n\n\n\n\n\nclass ForEachSourceCallback\n{\npublic:\n\n\tForEachSourceCallback(const cChunk & Chunk, Vector3i Position, BLOCKTYPE CurrentBlock);\n\n\t/** Callback invoked for each potential source position of the redstone component. */\n\tvoid operator()(Vector3i Location);\n\n\t/** Callback invoked for blocks supporting quasiconnectivity. */\n\tvoid CheckIndirectPower();\n\n\t// The maximum power level of all source locations.\n\tPowerLevel Power;\n\nprivate:\n\n\t/** Asks redstone handlers adjacent to a solid block how much power they will deliver to the querying position, via the solid block.\n\tBoth QueryPosition and SolidBlockPosition are relative to Chunk. */\n\tstatic PowerLevel QueryLinkedPower(const cChunk & Chunk, Vector3i QueryPosition, BLOCKTYPE QueryBlock, Vector3i SolidBlockPosition);\n\n\tconst cChunk & m_Chunk;\n\tconst Vector3i m_Position;\n\tconst BLOCKTYPE m_CurrentBlock;\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/HopperHandler.h",
    "content": "\n#pragma once\n\n#include \"../../BlockEntities/HopperEntity.h\"\n\n\n\n\n\nnamespace HopperHandler\n{\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating holey the hopper (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tconst bool ShouldBeLocked = Power != 0;\n\t\tconst bool PreviouslyLocked = (a_Meta & 0x8) == 0x8;\n\n\t\tif (ShouldBeLocked == PreviouslyLocked)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (ShouldBeLocked)\n\t\t{\n\t\t\ta_Chunk.SetMeta(a_Position, a_Meta | 0x8);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Chunk.SetMeta(a_Position, a_Meta & ~0x8);\n\t\t}\n\n\t\ta_Chunk.DoWithBlockEntityAt(a_Position, [ShouldBeLocked](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_HOPPER);\n\n\t\t\tstatic_cast<cHopperEntity &>(a_BlockEntity).SetLocked(ShouldBeLocked);\n\t\t\treturn false;\n\t\t});\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/IncrementalRedstoneSimulator.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"IncrementalRedstoneSimulator.h\"\n#include \"BlockType.h\"\n#include \"RedstoneHandler.h\"\n#include \"RedstoneSimulatorChunkData.h\"\n#include \"ForEachSourceCallback.h\"\n\n\n\n\n\nbool cIncrementalRedstoneSimulator::IsAlwaysTicked(BLOCKTYPE a_Block)\n{\n\tswitch (a_Block)  // Call the appropriate simulator for the entry's block type\n\t{\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE: return true;\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nbool cIncrementalRedstoneSimulator::IsRedstone(BLOCKTYPE a_Block)\n\n{\n\tswitch (a_Block)\n\t{\n\t\t// All redstone devices, please alpha sort\n\t\tcase E_BLOCK_ACACIA_DOOR:\n\t\tcase E_BLOCK_ACACIA_FENCE_GATE:\n\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\tcase E_BLOCK_ACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_BIRCH_DOOR:\n\t\tcase E_BLOCK_BIRCH_FENCE_GATE:\n\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:\n\t\tcase E_BLOCK_COMMAND_BLOCK:\n\t\tcase E_BLOCK_DARK_OAK_DOOR:\n\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:\n\t\tcase E_BLOCK_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\tcase E_BLOCK_DISPENSER:\n\t\tcase E_BLOCK_DROPPER:\n\t\tcase E_BLOCK_FENCE_GATE:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_HOPPER:\n\t\tcase E_BLOCK_INACTIVE_COMPARATOR:\n\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR:\n\t\tcase E_BLOCK_IRON_DOOR:\n\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\tcase E_BLOCK_JUNGLE_DOOR:\n\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:\n\t\tcase E_BLOCK_LEVER:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_NOTE_BLOCK:\n\t\tcase E_BLOCK_OBSERVER:\n\t\tcase E_BLOCK_POWERED_RAIL:\n\t\tcase E_BLOCK_REDSTONE_LAMP_OFF:\n\t\tcase E_BLOCK_REDSTONE_LAMP_ON:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\tcase E_BLOCK_SPRUCE_DOOR:\n\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:\n\t\tcase E_BLOCK_STICKY_PISTON:\n\t\tcase E_BLOCK_STONE_BUTTON:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_TNT:\n\t\tcase E_BLOCK_TRAPDOOR:\n\t\tcase E_BLOCK_TRAPPED_CHEST:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\tcase E_BLOCK_WOODEN_DOOR:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\tcase E_BLOCK_PISTON:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\nvoid cIncrementalRedstoneSimulator::ProcessWorkItem(cChunk & Chunk, cChunk & TickingSource, const Vector3i Position)\n{\n\tBLOCKTYPE CurrentBlock;\n\tNIBBLETYPE CurrentMeta;\n\tChunk.GetBlockTypeMeta(Position, CurrentBlock, CurrentMeta);\n\n\tForEachSourceCallback Callback(Chunk, Position, CurrentBlock);\n\tRedstoneHandler::ForValidSourcePositions(Chunk, Position, CurrentBlock, CurrentMeta, Callback);\n\n\t// Inform the handler to update\n\tRedstoneHandler::Update(Chunk, TickingSource, Position, CurrentBlock, CurrentMeta, Callback.Power);\n}\n\n\n\n\n\nvoid cIncrementalRedstoneSimulator::SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk)\n{\n\tauto & ChunkData = *static_cast<cIncrementalRedstoneSimulatorChunkData *>(a_Chunk->GetRedstoneSimulatorData());\n\tfor (auto & DelayInfo : ChunkData.m_MechanismDelays)\n\t{\n\t\tif ((--DelayInfo.second.first) == 0)\n\t\t{\n\t\t\tChunkData.WakeUp(DelayInfo.first);\n\t\t}\n\t}\n\n\t// Build our work queue\n\tauto & WorkQueue = ChunkData.GetActiveBlocks();\n\n\t// Process the work queue\n\twhile (!WorkQueue.empty())\n\t{\n\t\t// Grab the first element and remove it from the list\n\t\tVector3i CurrentLocation = WorkQueue.top();\n\t\tWorkQueue.pop();\n\n\t\tconst auto NeighbourChunk = a_Chunk->GetRelNeighborChunkAdjustCoords(CurrentLocation);\n\t\tif ((NeighbourChunk == nullptr) || !NeighbourChunk->IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tProcessWorkItem(*NeighbourChunk, *a_Chunk, CurrentLocation);\n\t}\n\n\tfor (const auto & Position : ChunkData.AlwaysTickedPositions)\n\t{\n\t\tChunkData.WakeUp(Position);\n\t}\n}\n\n\n\n\n\nvoid cIncrementalRedstoneSimulator::AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block)\n{\n\t// Never update blocks without a handler:\n\tif (!IsRedstone(a_Block))\n\t{\n\t\treturn;\n\t}\n\n\tauto & ChunkData = *static_cast<cIncrementalRedstoneSimulatorChunkData *>(a_Chunk.GetRedstoneSimulatorData());\n\n\tif (IsAlwaysTicked(a_Block))\n\t{\n\t\tChunkData.AlwaysTickedPositions.emplace(a_Position);\n\t}\n\n\t// Temporary: in the absence of block state support calculate our own:\n\tif (a_Block == E_BLOCK_REDSTONE_WIRE)\n\t{\n\t\tRedstoneHandler::SetWireState(a_Chunk, a_Position);\n\t}\n\n\t// Always update redstone devices:\n\tChunkData.WakeUp(a_Position);\n}\n\n\n\n\n\ncRedstoneSimulatorChunkData * cIncrementalRedstoneSimulator::CreateChunkData()\n{\n\treturn new cIncrementalRedstoneSimulatorChunkData;\n}\n\n\n\n\n\nvoid cIncrementalRedstoneSimulator::WakeUp(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block)\n{\n\t// Having WakeUp called on us directly means someone called SetBlock (or WakeUp)\n\t// Since the simulator never does this, something external changed. Clear cached data:\n\tstatic_cast<cIncrementalRedstoneSimulatorChunkData *>(a_Chunk.GetRedstoneSimulatorData())->ErasePowerData(a_Position);\n\n\t// Queue the block, in case the set block was redstone:\n\tAddBlock(a_Chunk, a_Position, a_Block);\n}\n\n\n\n\n\nvoid cIncrementalRedstoneSimulator::WakeUp(cChunk & a_Chunk, Vector3i a_Position, Vector3i a_Offset, BLOCKTYPE a_Block)\n{\n\t// This is an automatic cross-coords wakeup by cSimulatorManager\n\t// There is no need to erase power data; if a component was destroyed the 3-arg WakeUp will handle it\n\n\tAddBlock(a_Chunk, a_Position, a_Block);\n\n\t// The only thing to do go one block farther than this cross-coord, in the direction of Offset\n\t// in order to notify linked-powered positions that there was a change\n\n\tfor (const auto & Offset : cSimulator::GetLinkedOffsets(a_Offset))\n\t{\n\t\tauto Relative = a_Position - a_Offset + Offset;\n\n\t\tif (!cChunkDef::IsValidHeight(Relative))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst auto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(Relative);\n\n\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst auto Block = Chunk->GetBlock(Relative);\n\t\tAddBlock(*Chunk, Relative, Block);\n\t}\n}\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/IncrementalRedstoneSimulator.h",
    "content": "\n#pragma once\n\n#include \"../RedstoneSimulator.h\"\n\n\n\n\n\nclass cIncrementalRedstoneSimulator final :\n\tpublic cRedstoneSimulator\n{\n\tusing Super = cRedstoneSimulator;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\t/** Returns if a redstone device is always ticked due to influence by its environment */\n\tstatic bool IsAlwaysTicked(BLOCKTYPE a_Block);\n\n\t/** Returns if a block is any sort of redstone device */\n\tstatic bool IsRedstone(BLOCKTYPE a_Block);\n\n\tvoid ProcessWorkItem(cChunk & Chunk, cChunk & TickingSource, const Vector3i Position);\n\n\tvirtual void SimulateChunk(std::chrono::milliseconds Dt, int ChunkX, int ChunkZ, cChunk * Chunk) override;\n\tvirtual void AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) override;\n\tvirtual cRedstoneSimulatorChunkData * CreateChunkData() override;\n\tvirtual void WakeUp(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) override;\n\tvirtual void WakeUp(cChunk & a_Chunk, Vector3i a_Position, Vector3i a_Offset, BLOCKTYPE a_Block) override;\n} ;\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/NoteBlockHandler.h",
    "content": "\n#pragma once\n\n#include \"../../BlockEntities/NoteEntity.h\"\n\n\n\n\n\nnamespace NoteBlockHandler\n{\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating sparky the magical note block (%d %d %d) %i\", a_Position.x, a_Position.y, a_Position.z, Power);\n\n\t\tconst auto Previous = DataForChunk(a_Chunk).ExchangeUpdateOncePowerData(a_Position, Power);\n\t\tif ((Previous != 0) || (Power == 0))\n\t\t{\n\t\t\t// If we're already powered or received an update of no power, don't make a sound\n\t\t\treturn;\n\t\t}\n\n\t\ta_Chunk.DoWithBlockEntityAt(a_Position, [](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_NOTE_BLOCK);\n\n\t\t\tstatic_cast<cNoteEntity &>(a_BlockEntity).MakeSound();\n\t\t\treturn false;\n\t\t});\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/ObserverHandler.h",
    "content": "\n#pragma once\n\n#include \"../../Blocks/BlockObserver.h\"\n\n\n\n\n\nnamespace ObserverHandler\n{\n\tstatic bool IsOn(NIBBLETYPE a_Meta)\n\t{\n\t\treturn (a_Meta & 0x8) == 0x8;\n\t}\n\n\tstatic bool ShouldPowerOn(cChunk & Chunk, const Vector3i a_Position, NIBBLETYPE a_Meta, cIncrementalRedstoneSimulatorChunkData & a_Data)\n\t{\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\tif (!Chunk.UnboundedRelGetBlock(a_Position + cBlockObserverHandler::GetObservingFaceOffset(a_Meta), BlockType, BlockMeta))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tauto & ObserverCache = a_Data.ObserverCache;\n\t\tconst auto FindResult = ObserverCache.find(a_Position);\n\t\tconst auto Observed = std::make_pair(BlockType, BlockMeta);\n\n\t\tif (FindResult == ObserverCache.end())\n\t\t{\n\t\t\t// Cache the last seen block for this position:\n\t\t\tObserverCache.emplace(a_Position, Observed);\n\n\t\t\t// Definitely should signal update:\n\t\t\treturn true;\n\t\t}\n\n\t\t// The block this observer previously saw.\n\t\tconst auto Previous = FindResult->second;\n\n\t\t// Update the last seen block:\n\t\tFindResult->second = Observed;\n\n\t\t// Determine if to signal an update based on the block previously observed changed\n\t\treturn Previous != Observed;\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tconst auto Meta = a_Chunk.GetMeta(a_Position);\n\t\treturn (IsOn(Meta) && (a_QueryPosition == (a_Position + cBlockObserverHandler::GetSignalOutputOffset(Meta)))) ? 15 : 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating Lenny the observer (%i %i %i)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tauto & Data = DataForChunk(a_Chunk);\n\t\tauto DelayInfo = Data.GetMechanismDelayInfo(a_Position);\n\n\t\tif (DelayInfo == nullptr)\n\t\t{\n\t\t\tif (!ShouldPowerOn(a_Chunk, a_Position, a_Meta, Data))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// From rest, we've determined there was a block update\n\t\t\t// Schedule power-on 1 tick in the future\n\t\t\tData.m_MechanismDelays[a_Position] = std::make_pair(1, true);\n\n\t\t\treturn;\n\t\t}\n\n\t\tint DelayTicks;\n\t\tbool ShouldPowerOn;\n\t\tstd::tie(DelayTicks, ShouldPowerOn) = *DelayInfo;\n\n\t\tif (DelayTicks != 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (ShouldPowerOn)\n\t\t{\n\t\t\t// Remain on for 1 tick before resetting\n\t\t\t*DelayInfo = std::make_pair(1, false);\n\t\t\ta_Chunk.SetMeta(a_Position, a_Meta | 0x8);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// We've reset. Erase delay data in preparation for detecting further updates\n\t\t\tData.m_MechanismDelays.erase(a_Position);\n\t\t\ta_Chunk.SetMeta(a_Position, a_Meta & ~0x8);\n\t\t}\n\n\t\tUpdateAdjustedRelative(a_Chunk, CurrentlyTicking, a_Position, cBlockObserverHandler::GetSignalOutputOffset(a_Meta));\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_BlockType);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/PistonHandler.h",
    "content": "\n#pragma once\n\n#include \"../../Blocks/BlockPiston.h\"\n\n\n\n\n\nnamespace PistonHandler\n{\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating pisty the piston (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tconst bool ShouldBeExtended = Power != 0;\n\t\tif (ShouldBeExtended == cBlockPistonHandler::IsExtended(a_Meta))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\ta_Position = cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos());\n\n\t\tif (ShouldBeExtended)\n\t\t{\n\t\t\tcBlockPistonHandler::ExtendPiston(a_Position, *a_Chunk.GetWorld());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcBlockPistonHandler::RetractPiston(a_Position, *a_Chunk.GetWorld());\n\t\t}\n\n\t\t// It is necessary to delay after a signal to prevent an infinite loop (#3168)\n\t\t// However, this delay is already present: as a side effect of the implementation of piston animation in Blocks\\BlockPiston.cpp\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\n\t\tconst auto Face = cBlockPistonHandler::MetaDataToDirection(a_Meta);\n\t\tconst auto FrontOffset = AddFaceDirection(Vector3i(), Face);\n\n\t\tfor (const auto & Offset : RelativeAdjacents)\n\t\t{\n\t\t\tif (Offset != FrontOffset)\n\t\t\t{\n\t\t\t\tCallback(a_Position + Offset);\n\t\t\t}\n\t\t}\n\n\t\t// Consider indirect power:\n\t\tCallback.CheckIndirectPower();\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/PoweredRailHandler.h",
    "content": "\n#pragma once\n\n\n\n\n\nnamespace PoweredRailHandler\n{\n\t/** Get the offset along which the rail faces.\n\tNot in cBlockRailHandler since specific to powered rails. */\n\tstatic Vector3i GetPoweredRailAdjacentXZCoordinateOffset(NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta & 0x7)\n\t\t{\n\t\t\tcase E_META_RAIL_ZM_ZP: return { 0, 0, 1 };\n\t\t\tcase E_META_RAIL_XM_XP: return { 1, 0, 0 };\n\t\t\tcase E_META_RAIL_ASCEND_XP: return { 1, 1, 0 };\n\t\t\tcase E_META_RAIL_ASCEND_XM: return { 1, 1, 0 };\n\t\t\tcase E_META_RAIL_ASCEND_ZM: return { 0, 1, 1 };\n\t\t\tcase E_META_RAIL_ASCEND_ZP: return { 0, 1, 1 };\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Impossible rail meta! wat wat wat\");\n\t\t\t\treturn { 0, 0, 0 };\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_QueryBlockType);\n\n\t\tconst auto Meta = a_Chunk.GetMeta(a_Position);\n\t\tconst auto Offset = GetPoweredRailAdjacentXZCoordinateOffset(Meta);\n\t\tif (((Offset + a_Position) == a_QueryPosition) || ((-Offset + a_Position) == a_QueryPosition))\n\t\t{\n\t\t\tconst auto Power = DataForChunk(a_Chunk).GetCachedPowerData(a_Position);\n\t\t\treturn (Power <= 7) ? 0 : (Power - 1);\n\t\t}\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTickingChunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating tracky the rail (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\tif ((m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ) & 0x08) == 0x08)\n\t\t\t\t{\n\t\t\t\t\tSetAllDirsAsPowered(a_RelBlockX, a_RelBlockY, a_RelBlockZ, a_MyType);\n\t\t\t\t}\n\t\t\t\t*/\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase E_BLOCK_ACTIVATOR_RAIL:\n\t\t\tcase E_BLOCK_POWERED_RAIL:\n\t\t\t{\n\t\t\t\tconst auto Offset = GetPoweredRailAdjacentXZCoordinateOffset(a_Meta);\n\t\t\t\tif (Power != DataForChunk(a_Chunk).ExchangeUpdateOncePowerData(a_Position, Power))\n\t\t\t\t{\n\t\t\t\t\ta_Chunk.SetMeta(a_Position, (Power == 0) ? (a_Meta & 0x07) : (a_Meta | 0x08));\n\n\t\t\t\t\tUpdateAdjustedRelative(a_Chunk, CurrentlyTickingChunk, a_Position, Offset);\n\t\t\t\t\tUpdateAdjustedRelative(a_Chunk, CurrentlyTickingChunk, a_Position, -Offset);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled type of rail in passed to rail handler!\");\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Meta);\n\n\t\tif ((a_BlockType == E_BLOCK_POWERED_RAIL) || (a_BlockType == E_BLOCK_ACTIVATOR_RAIL))\n\t\t{\n\t\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/PressurePlateHandler.h",
    "content": "\n#pragma once\n\n#include \"../../BoundingBox.h\"\n#include \"../../Entities/Pickup.h\"\n\n\n\n\n\nnamespace PressurePlateHandler\n{\n\tstatic unsigned char GetPowerLevel(const cChunk & Chunk, const Vector3i Position, const BLOCKTYPE BlockType)\n\t{\n\t\tsize_t NumberOfEntities = 0;\n\t\tbool FoundPlayer = false;\n\n\t\tChunk.ForEachEntityInBox(cBoundingBox(Vector3d(0.5, 0, 0.5) + Position, 0.5, 0.5), [&](cEntity & Entity)\n\t\t{\n\t\t\tif (Entity.GetHealth() <= 0)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (Entity.IsPlayer())\n\t\t\t{\n\t\t\t\tconst auto & Player = static_cast<cPlayer &>(Entity);\n\n\t\t\t\tif (Player.IsGameModeSpectator())\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tFoundPlayer = true;\n\t\t\t}\n\t\t\telse if (Entity.IsPickup())\n\t\t\t{\n\t\t\t\tconst auto & Pickup = static_cast<cPickup &>(Entity);\n\t\t\t\tNumberOfEntities += static_cast<size_t>(Pickup.GetItem().m_ItemCount);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tNumberOfEntities++;\n\t\t\treturn false;\n\t\t});\n\n\t\tswitch (BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\t\t{\n\t\t\t\treturn FoundPlayer ? 15 : 0;\n\t\t\t}\n\t\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\t\t{\n\t\t\t\treturn (NumberOfEntities != 0) ? 15 : 0;\n\t\t\t}\n\t\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\t\t{\n\t\t\t\treturn std::min(static_cast<unsigned char>(CeilC(NumberOfEntities / 10.f)), static_cast<unsigned char>(15));\n\t\t\t}\n\t\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\t\t{\n\t\t\t\treturn std::min(static_cast<unsigned char>(NumberOfEntities), static_cast<unsigned char>(15));\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled/unimplemented block in pressure plate handler!\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic const char * GetClickOnSound(BLOCKTYPE a_BlockType)\n\t{\n\t\t// manage on-sound\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_STONE_PRESSURE_PLATE: return \"block.stone_pressureplate.click_on\";\n\t\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE: return \"block.wood_pressureplate.click_on\";\n\t\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE: return \"block.metal_pressureplate.click_on\";\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"No on sound for this one!\");\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic const char * GetClickOffSound(BLOCKTYPE a_BlockType)\n\t{\n\t\t// manage off-sound\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_STONE_PRESSURE_PLATE: return \"block.stone_pressureplate.click_off\";\n\t\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE: return \"block.wood_pressureplate.click_off\";\n\t\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE: return \"block.metal_pressureplate.click_off\";\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"No off sound for this one!\");\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\n\t\t// Plates only link power blocks below\n\t\t// Retrieve and return the cached power calculated by Update for performance:\n\t\treturn (IsLinked && (a_QueryPosition != (a_Position + OffsetYM))) ? 0 : DataForChunk(a_Chunk).GetCachedPowerData(a_Position);\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating clicky the pressure plate (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tauto & ChunkData = DataForChunk(a_Chunk);\n\n\t\tconst auto PreviousPower = ChunkData.GetCachedPowerData(a_Position);\n\t\tconst auto Absolute = cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos());\n\t\tconst auto PowerLevel = GetPowerLevel(a_Chunk, Absolute, a_BlockType);  // Get the current power of the platey\n\t\tconst auto DelayInfo = ChunkData.GetMechanismDelayInfo(a_Position);\n\n\t\t// Resting state?\n\t\tif (DelayInfo == nullptr)\n\t\t{\n\t\t\tif (PowerLevel == 0)\n\t\t\t{\n\t\t\t\t// Nothing happened, back to rest\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// From rest, a player stepped on us\n\t\t\t// Schedule a minimum 0.5 second delay before even thinking about releasing\n\t\t\tChunkData.m_MechanismDelays[a_Position] = std::make_pair(5, true);\n\n\t\t\ta_Chunk.GetWorld()->BroadcastSoundEffect(GetClickOnSound(a_BlockType), Absolute, 0.5f, 0.6f);\n\n\t\t\t// Update power\n\t\t\tChunkData.SetCachedPowerData(a_Position, PowerLevel);\n\n\t\t\t// Immediately depress plate\n\t\t\ta_Chunk.SetMeta(a_Position, E_META_PRESSURE_PLATE_DEPRESSED);\n\n\t\t\tUpdateAdjustedRelatives(a_Chunk, CurrentlyTicking, a_Position, RelativeAdjacents);\n\t\t\treturn;\n\t\t}\n\n\t\t// Not a resting state\n\n\t\tint DelayTicks;\n\t\tbool HasExitedMinimumOnDelayPhase;\n\t\tstd::tie(DelayTicks, HasExitedMinimumOnDelayPhase) = *DelayInfo;\n\n\t\t// Are we waiting for the initial delay or subsequent release delay?\n\t\tif (DelayTicks > 0)\n\t\t{\n\t\t\t// Nothing changes, if there is nothing on it anymore, because the state is locked.\n\t\t\tif (PowerLevel == 0)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Yes. Are we waiting to release, and found that the player stepped on it again?\n\t\t\tif (!HasExitedMinimumOnDelayPhase)\n\t\t\t{\n\t\t\t\t// Reset delay\n\t\t\t\t*DelayInfo = std::make_pair(0, true);\n\t\t\t}\n\n\t\t\t// Did the power level change and is still above zero?\n\t\t\tif (PowerLevel != PreviousPower)\n\t\t\t{\n\t\t\t\t// Yes. Update power\n\t\t\t\tChunkData.SetCachedPowerData(a_Position, PowerLevel);\n\t\t\t\tUpdateAdjustedRelatives(a_Chunk, CurrentlyTicking, a_Position, RelativeAdjacents);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Not waiting for anything. Has the initial delay elapsed?\n\t\tif (HasExitedMinimumOnDelayPhase)\n\t\t{\n\t\t\t// Yep, initial delay elapsed. Has the player gotten off?\n\t\t\tif (PowerLevel == 0)\n\t\t\t{\n\t\t\t\t// Yes. Go into subsequent release delay, for a further 0.5 seconds\n\t\t\t\t*DelayInfo = std::make_pair(5, false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Did the power level change and is still above zero?\n\t\t\tif (PowerLevel != PreviousPower)\n\t\t\t{\n\t\t\t\t// Yes. Update power\n\t\t\t\tChunkData.SetCachedPowerData(a_Position, PowerLevel);\n\t\t\t\tUpdateAdjustedRelatives(a_Chunk, CurrentlyTicking, a_Position, RelativeAdjacents);\n\t\t\t}\n\n\t\t\t// Yes, but player's still on the plate, do nothing\n\t\t\treturn;\n\t\t}\n\n\t\t// Just got out of the subsequent release phase, reset everything and raise the plate\n\t\tChunkData.m_MechanismDelays.erase(a_Position);\n\n\t\ta_Chunk.GetWorld()->BroadcastSoundEffect(GetClickOffSound(a_BlockType), Absolute, 0.5f, 0.5f);\n\t\tChunkData.SetCachedPowerData(a_Position, PowerLevel);\n\n\t\ta_Chunk.SetMeta(a_Position, E_META_PRESSURE_PLATE_RAISED);\n\t\tUpdateAdjustedRelatives(a_Chunk, CurrentlyTicking, a_Position, RelativeAdjacents);\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tUNUSED(Callback);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneBlockHandler.h",
    "content": "\n#pragma once\n\n\n\n\n\nnamespace RedstoneBlockHandler\n{\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(IsLinked);\n\t\treturn IsLinked ? 0 : 15;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating crimson the redstone block (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tUNUSED(Callback);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneComparatorHandler.h",
    "content": "\n#pragma once\n\n#include \"../../Blocks/BlockComparator.h\"\n\n\n\n\n\nnamespace RedstoneComparatorHandler\n{\n\tstatic unsigned char GetFrontPowerLevel(NIBBLETYPE a_Meta, unsigned char a_HighestSidePowerLevel, unsigned char a_HighestRearPowerLevel)\n\t{\n\t\tif (cBlockComparatorHandler::IsInSubtractionMode(a_Meta))\n\t\t{\n\t\t\t// Subtraction mode\n\t\t\treturn static_cast<unsigned char>(std::max(static_cast<char>(a_HighestRearPowerLevel) - a_HighestSidePowerLevel, 0));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Comparison mode\n\t\t\treturn (a_HighestRearPowerLevel < a_HighestSidePowerLevel) ? 0 : a_HighestRearPowerLevel;\n\t\t}\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\n\t\tconst auto Meta = a_Chunk.GetMeta(a_Position);\n\t\treturn (\n\t\t\t(cBlockComparatorHandler::GetFrontCoordinate(a_Position, Meta & 0x3) == a_QueryPosition) ?\n\t\t\tDataForChunk(a_Chunk).GetCachedPowerData(a_Position) : 0\n\t\t);\n\t}\n\n\tstatic unsigned char GetPowerLevel(cChunk & a_Chunk, Vector3i Position, BLOCKTYPE BlockType, NIBBLETYPE Meta)\n\t{\n\t\tUInt8 SignalStrength = 0;\n\t\tauto RearCoordinate = cBlockComparatorHandler::GetRearCoordinate(Position, Meta & 0x3);\n\n\t\tauto RearChunk = a_Chunk.GetRelNeighborChunkAdjustCoords(RearCoordinate);\n\t\tif ((RearChunk == nullptr) || !RearChunk->IsValid())\n\t\t{\n\t\t\treturn SignalStrength;\n\t\t}\n\n\t\tRearChunk->DoWithBlockEntityAt(RearCoordinate, [&](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\t// Skip BlockEntities that don't have slots\n\t\t\tauto BlockEntityWithItems = dynamic_cast<cBlockEntityWithItems *>(&a_BlockEntity);\n\t\t\tif (BlockEntityWithItems == nullptr)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// TODO: handle double chests\n\n\t\t\tauto & Contents = BlockEntityWithItems->GetContents();\n\t\t\tfloat Fullness = 0;  // Is a floating-point type to allow later calculation to produce a non-truncated value\n\n\t\t\tfor (int Slot = 0; Slot != Contents.GetNumSlots(); ++Slot)\n\t\t\t{\n\t\t\t\tFullness += static_cast<float>(Contents.GetSlot(Slot).m_ItemCount) / Contents.GetSlot(Slot).GetMaxStackSize();\n\t\t\t}\n\n\t\t\tSignalStrength = (Fullness < 0.001 /* container empty? */) ? 0 : static_cast<UInt8>(1 + (Fullness / Contents.GetNumSlots()) * 14);\n\t\t\treturn false;\n\t\t});\n\n\t\tconst auto RearType = RearChunk->GetBlock(RearCoordinate);\n\t\treturn std::max(\n\t\t\tSignalStrength,\n\t\t\tRedstoneHandler::GetPowerDeliveredToPosition(\n\t\t\t\t*RearChunk, RearCoordinate, RearType,\n\t\t\t\tcIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(a_Chunk, *RearChunk, Position), BlockType, false\n\t\t\t)\n\t\t);\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// Note that Power here contains the maximum * side * power level, as specified by GetValidSourcePositions\n\t\t// LOGD(\"Evaluating ALU the comparator (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tauto & Data = DataForChunk(a_Chunk);\n\t\tauto DelayInfo = Data.GetMechanismDelayInfo(a_Position);\n\n\t\t// Delay is used here to prevent an infinite loop (#3168)\n\t\tif (DelayInfo == nullptr)\n\t\t{\n\t\t\tconst auto RearPower = GetPowerLevel(a_Chunk, a_Position, a_BlockType, a_Meta);\n\t\t\tconst auto FrontPower = GetFrontPowerLevel(a_Meta, Power, RearPower);\n\t\t\tconst auto PreviousFrontPower = Data.GetCachedPowerData(a_Position);\n\t\t\tconst bool ShouldUpdate = (FrontPower != PreviousFrontPower);  // \"Business logic\" (:P) - determined by side and rear power levels\n\n\t\t\tif (ShouldUpdate)\n\t\t\t{\n\t\t\t\tData.m_MechanismDelays[a_Position] = std::make_pair(1, bool());\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tint DelayTicks;\n\t\tstd::tie(DelayTicks, std::ignore) = *DelayInfo;\n\n\t\tif (DelayTicks != 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto RearPower = GetPowerLevel(a_Chunk, a_Position, a_BlockType, a_Meta);\n\t\tconst auto FrontPower = GetFrontPowerLevel(a_Meta, Power, RearPower);\n\t\tconst NIBBLETYPE NewMeta = (FrontPower > 0) ? (a_Meta | 0x08u) : (a_Meta & 0x07u);\n\n\t\t// Don't care about the previous power level so return value ignored\n\t\tData.ExchangeUpdateOncePowerData(a_Position, FrontPower);\n\n\t\ta_Chunk.SetMeta(a_Position, NewMeta);\n\t\tData.m_MechanismDelays.erase(a_Position);\n\n\t\t// Assume that an update (to front power) is needed:\n\t\tUpdateAdjustedRelative(a_Chunk, CurrentlyTicking, a_Position, cBlockComparatorHandler::GetFrontCoordinate(a_Position, a_Meta & 0x3) - a_Position);\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\n\t\tCallback(cBlockComparatorHandler::GetSideCoordinate(a_Position, a_Meta & 0x3, false));\n\t\tCallback(cBlockComparatorHandler::GetSideCoordinate(a_Position, a_Meta & 0x3, true));\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneDataHelper.h",
    "content": "#pragma once\n\n#include \"../../Chunk.h\"\n\ninline auto & DataForChunk(const cChunk & a_Chunk)\n{\n\treturn *static_cast<cIncrementalRedstoneSimulatorChunkData *>(a_Chunk.GetRedstoneSimulatorData());\n}\n\ninline void UpdateAdjustedRelative(const cChunk & a_Chunk, const cChunk & a_TickingChunk, const Vector3i a_Position, const Vector3i a_Offset)\n{\n\tconst auto PositionToWake = a_Position + a_Offset;\n\n\tif (!cChunkDef::IsValidHeight(PositionToWake))\n\t{\n\t\t// If an offset position is not a valid height, its linked offset positions won't be either.\n\t\treturn;\n\t}\n\n\tauto & ChunkData = DataForChunk(a_TickingChunk);\n\n\t// Schedule the block in the requested direction to update:\n\tChunkData.WakeUp(cIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(a_Chunk, a_TickingChunk, PositionToWake));\n\n\t// To follow Vanilla behaviour, update all linked positions:\n\tfor (const auto & LinkedOffset : cSimulator::GetLinkedOffsets(a_Offset))\n\t{\n\t\tif (const auto LinkedPositionToWake = a_Position + LinkedOffset; cChunkDef::IsValidHeight(LinkedPositionToWake))\n\t\t{\n\t\t\tChunkData.WakeUp(cIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(a_Chunk, a_TickingChunk, LinkedPositionToWake));\n\t\t}\n\t}\n}\n\ntemplate <typename ArrayType>\ninline void UpdateAdjustedRelatives(const cChunk & a_Chunk, const cChunk & a_TickingChunk, const Vector3i a_Position, const ArrayType & a_Relative)\n{\n\tfor (const auto & Offset : a_Relative)\n\t{\n\t\tUpdateAdjustedRelative(a_Chunk, a_TickingChunk, a_Position, Offset);\n\t}\n}\n\ntemplate <typename ArrayType>\ninline void InvokeForAdjustedRelatives(ForEachSourceCallback & Callback, const Vector3i Position, const ArrayType & Relative)\n{\n\tfor (const auto & Offset : Relative)\n\t{\n\t\tCallback(Position + Offset);\n\t}\n}\n\ninline constexpr Vector3i OffsetYP{ 0, 1, 0 };\n\ninline constexpr Vector3i OffsetYM{ 0, -1, 0 };\n\ninline constexpr std::array<Vector3i, 6> RelativeAdjacents\n{\n\t{\n\t\t{ 1, 0, 0 },\n\t\t{ -1, 0, 0 },\n\t\t{ 0, 1, 0 },\n\t\t{ 0, -1, 0 },\n\t\t{ 0, 0, 1 },\n\t\t{ 0, 0, -1 },\n\t}\n};\n\ninline constexpr std::array<Vector3i, 4> RelativeLaterals\n{\n\t{\n\t\t{ 1, 0, 0 },\n\t\t{ -1, 0, 0 },\n\t\t{ 0, 0, 1 },\n\t\t{ 0, 0, -1 },\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneHandler.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"RedstoneHandler.h\"\n#include \"RedstoneDataHelper.h\"\n#include \"ForEachSourceCallback.h\"\n\n#include \"BlockType.h\"\n#include \"CommandBlockHandler.h\"\n#include \"DaylightSensorHandler.h\"\n#include \"DoorHandler.h\"\n#include \"RedstoneTorchHandler.h\"\n#include \"RedstoneWireHandler.h\"\n#include \"RedstoneRepeaterHandler.h\"\n#include \"RedstoneToggleHandler.h\"\n#include \"RedstoneLampHandler.h\"\n#include \"RedstoneBlockHandler.h\"\n#include \"PistonHandler.h\"\n#include \"SmallGateHandler.h\"\n#include \"NoteBlockHandler.h\"\n#include \"ObserverHandler.h\"\n#include \"TNTHandler.h\"\n#include \"PoweredRailHandler.h\"\n#include \"PressurePlateHandler.h\"\n#include \"TripwireHookHandler.h\"\n#include \"DropSpenserHandler.h\"\n#include \"RedstoneComparatorHandler.h\"\n#include \"TrappedChestHandler.h\"\n#include \"HopperHandler.h\"\n\n\n\n\n\n#define INVOKE_FOR_HANDLERS(Callback) \\\n\tdo \\\n\t{ \\\n\t\tswitch (BlockType) \\\n\t\t{ \\\n\t\t\tcase E_BLOCK_ACTIVATOR_RAIL:                                                       \\\n\t\t\tcase E_BLOCK_DETECTOR_RAIL:                                                        \\\n\t\t\tcase E_BLOCK_POWERED_RAIL:             return PoweredRailHandler::Callback;        \\\n\t\t\tcase E_BLOCK_ACTIVE_COMPARATOR:                                                    \\\n\t\t\tcase E_BLOCK_INACTIVE_COMPARATOR:      return RedstoneComparatorHandler::Callback; \\\n\t\t\tcase E_BLOCK_DISPENSER:                                                            \\\n\t\t\tcase E_BLOCK_DROPPER:                  return DropSpenserHandler::Callback;        \\\n\t\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:                                        \\\n\t\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:                                        \\\n\t\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:                                                 \\\n\t\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:    return PressurePlateHandler::Callback;      \\\n\t\t\tcase E_BLOCK_ACACIA_FENCE_GATE:                                                    \\\n\t\t\tcase E_BLOCK_BIRCH_FENCE_GATE:                                                     \\\n\t\t\tcase E_BLOCK_DARK_OAK_FENCE_GATE:                                                  \\\n\t\t\tcase E_BLOCK_FENCE_GATE:                                                           \\\n\t\t\tcase E_BLOCK_IRON_TRAPDOOR:                                                        \\\n\t\t\tcase E_BLOCK_JUNGLE_FENCE_GATE:                                                    \\\n\t\t\tcase E_BLOCK_SPRUCE_FENCE_GATE:                                                    \\\n\t\t\tcase E_BLOCK_TRAPDOOR:                 return SmallGateHandler::Callback;          \\\n\t\t\tcase E_BLOCK_REDSTONE_LAMP_OFF:                                                    \\\n\t\t\tcase E_BLOCK_REDSTONE_LAMP_ON:         return RedstoneLampHandler::Callback;       \\\n\t\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:                                                \\\n\t\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:     return RedstoneRepeaterHandler::Callback;   \\\n\t\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:                                                   \\\n\t\t\tcase E_BLOCK_REDSTONE_TORCH_ON:        return RedstoneTorchHandler::Callback;      \\\n\t\t\tcase E_BLOCK_OBSERVER:                 return ObserverHandler::Callback;           \\\n\t\t\tcase E_BLOCK_PISTON:                                                               \\\n\t\t\tcase E_BLOCK_STICKY_PISTON:            return PistonHandler::Callback;             \\\n\t\t\tcase E_BLOCK_DAYLIGHT_SENSOR:                                                      \\\n\t\t\tcase E_BLOCK_INVERTED_DAYLIGHT_SENSOR: return DaylightSensorHandler::Callback;     \\\n\t\t\tcase E_BLOCK_LEVER:                                                                \\\n\t\t\tcase E_BLOCK_STONE_BUTTON:                                                         \\\n\t\t\tcase E_BLOCK_WOODEN_BUTTON:            return RedstoneToggleHandler::Callback;     \\\n\t\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:        return RedstoneBlockHandler::Callback;      \\\n\t\t\tcase E_BLOCK_COMMAND_BLOCK:            return CommandBlockHandler::Callback;       \\\n\t\t\tcase E_BLOCK_HOPPER:                   return HopperHandler::Callback;             \\\n\t\t\tcase E_BLOCK_NOTE_BLOCK:               return NoteBlockHandler::Callback;          \\\n\t\t\tcase E_BLOCK_REDSTONE_WIRE:            return RedstoneWireHandler::Callback;       \\\n\t\t\tcase E_BLOCK_TNT:                      return TNTHandler::Callback;                \\\n\t\t\tcase E_BLOCK_TRAPPED_CHEST:            return TrappedChestHandler::Callback;       \\\n\t\t\tcase E_BLOCK_TRIPWIRE_HOOK:            return TripwireHookHandler::Callback;       \\\n\t\t\tdefault:                                                                           \\\n\t\t\t{ \\\n\t\t\t\tif (cBlockDoorHandler::IsDoorBlockType(BlockType)) \\\n\t\t\t\t{ \\\n\t\t\t\t\treturn DoorHandler::Callback; \\\n\t\t\t\t} \\\n\t\t\t} \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\nnamespace RedstoneHandler\n{\n\tPowerLevel GetPowerDeliveredToPosition(const cChunk & Chunk, const Vector3i Position, const BLOCKTYPE BlockType, const Vector3i QueryPosition, const BLOCKTYPE QueryBlockType, const bool IsLinked)\n\t{\n\t\tINVOKE_FOR_HANDLERS(GetPowerDeliveredToPosition(Chunk, Position, BlockType, QueryPosition, QueryBlockType, IsLinked));\n\n\t\t// Fell through the switch statement\n\t\t// Block at Position doesn't have a corresponding redstone handler\n\t\t// ErasePowerData will have been called in AddBlock\n\n\t\t// Default:\n\t\treturn 0;\n\t}\n\n\tvoid Update(cChunk & Chunk, cChunk & CurrentlyTicking, const Vector3i Position, const BLOCKTYPE BlockType, const NIBBLETYPE Meta, const PowerLevel PowerLevel)\n\t{\n\t\tINVOKE_FOR_HANDLERS(Update(Chunk, CurrentlyTicking, Position, BlockType, Meta, PowerLevel));\n\t}\n\n\tvoid ForValidSourcePositions(const cChunk & Chunk, const Vector3i Position, const BLOCKTYPE BlockType, const NIBBLETYPE Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tINVOKE_FOR_HANDLERS(ForValidSourcePositions(Chunk, Position, BlockType, Meta, Callback));\n\t}\n\n\tvoid SetWireState(const cChunk & Chunk, const Vector3i Position)\n\t{\n\t\tRedstoneWireHandler::SetWireState(Chunk, Position);\n\t}\n}\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneHandler.h",
    "content": "\n#pragma once\n\n#include \"RedstoneSimulatorChunkData.h\"\n\n\n\n\n\nclass cChunk;\nclass ForEachSourceCallback;\n\n\n\n\n\nnamespace RedstoneHandler\n{\n\t/** Asks a redstone component at the source position how much power it will deliver to the querying position.\n\tIf IsLinked is true, QueryPosition should point to the intermediate conduit block.\n\tThe Position and QueryPosition are both relative to Chunk. */\n\tPowerLevel GetPowerDeliveredToPosition(const cChunk & Chunk, Vector3i Position, BLOCKTYPE BlockType, Vector3i QueryPosition, BLOCKTYPE QueryBlockType, bool IsLinked);\n\n\t/** Tells a redstone component at this position to update itself.\n\tPowerLevel represents the maximum power level all of its source positions gave to it.\n\tPosition is relative to Chunk, but if the component needs to queue neighbour updates, they are queued to CurrentlyTicking. */\n\tvoid Update(cChunk & Chunk, cChunk & CurrentlyTicking, Vector3i Position, BLOCKTYPE BlockType, NIBBLETYPE Meta, PowerLevel PowerLevel);\n\n\t/** Invokes Callback for each position this component can accept power from. */\n\tvoid ForValidSourcePositions(const cChunk & Chunk, Vector3i Position, BLOCKTYPE BlockType, NIBBLETYPE Meta, ForEachSourceCallback & Callback);\n\n\t/** Temporary: compute and set the block state of a redstone wire. */\n\tvoid SetWireState(const cChunk & Chunk, Vector3i Position);\n}\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneLampHandler.h",
    "content": "\n#pragma once\n\n\n\n\n\nnamespace RedstoneLampHandler\n{\n\tstatic bool IsOn(BLOCKTYPE a_BlockType)\n\t{\n\t\treturn (a_BlockType == E_BLOCK_REDSTONE_LAMP_ON);\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating lamp (%i %i %i)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tif (Power > 0)\n\t\t{\n\t\t\tif (!IsOn(a_BlockType))\n\t\t\t{\n\t\t\t\ta_Chunk.FastSetBlock(a_Position, E_BLOCK_REDSTONE_LAMP_ON, 0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (IsOn(a_BlockType))\n\t\t\t{\n\t\t\t\ta_Chunk.FastSetBlock(a_Position, E_BLOCK_REDSTONE_LAMP_OFF, 0);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Meta);\n\t\tUNUSED(a_BlockType);\n\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneRepeaterHandler.h",
    "content": "\n#pragma once\n\n#include \"../../Blocks/BlockRedstoneRepeater.h\"\n\n\n\n\n\nnamespace RedstoneRepeaterHandler\n{\n\tstatic bool IsOn(BLOCKTYPE a_Block)\n\t{\n\t\treturn (a_Block == E_BLOCK_REDSTONE_REPEATER_ON);\n\t}\n\n\t/** Returns a pair with first element indicating if the block at the given position is an activated repeater.\n\tIf it is activated, the second element is the repeater metadata. */\n\tstatic std::pair<bool, NIBBLETYPE> IsOnRepeater(cChunk & Chunk, const Vector3i a_Position)\n\t{\n\t\tBLOCKTYPE Type;\n\t\tNIBBLETYPE Meta;\n\n\t\tif (!Chunk.UnboundedRelGetBlock(a_Position, Type, Meta))\n\t\t{\n\t\t\treturn std::make_pair(false, static_cast<NIBBLETYPE>(0));\n\t\t}\n\n\t\treturn std::make_pair(IsOn(Type), Meta);\n\t}\n\n\t/** Determine, from the metadata of a repeater on our left side, if they lock us.\n\tTo test a repeater on our right, simply invert the order of arguments provided.\n\t\"Left\" is relative to the direction the repeater output faces, naturally. */\n\tstatic bool DoesLhsLockMe(NIBBLETYPE a_MetaLhs, NIBBLETYPE a_MyMeta)\n\t{\n\t\t// Get the direction bits\n\t\ta_MetaLhs &= E_META_REDSTONE_REPEATER_FACING_MASK;\n\t\ta_MyMeta &= E_META_REDSTONE_REPEATER_FACING_MASK;\n\n\t\t/*\n\t\tCheck for a valid locking configuration, where they are perpendicular and one snuggles into the other.\n\n\t\tOrder of comparisons:\n\t\t\tXP >^ ZM\n\t\t\tZP |_ XP\n\t\t\tXM <| ZP\n\t\t\tZP ^< xM\n\n\t\tKey:\n\t\t\t^ Facing up\n\t\t\t_ Facing right\n\t\t\t| Facing down\n\t\t\t< Facing left\n\t\t*/\n\t\treturn\n\t\t\t((a_MetaLhs == E_META_REDSTONE_REPEATER_FACING_XP) && (a_MyMeta == E_META_REDSTONE_REPEATER_FACING_ZM)) ||\n\t\t\t((a_MetaLhs == E_META_REDSTONE_REPEATER_FACING_ZP) && (a_MyMeta == E_META_REDSTONE_REPEATER_FACING_XP)) ||\n\t\t\t((a_MetaLhs == E_META_REDSTONE_REPEATER_FACING_XM) && (a_MyMeta == E_META_REDSTONE_REPEATER_FACING_ZP)) ||\n\t\t\t((a_MetaLhs == E_META_REDSTONE_REPEATER_FACING_ZM) && (a_MyMeta == E_META_REDSTONE_REPEATER_FACING_XM))\n\t\t;\n\t}\n\n\t/** Determine if a repeater is locked.\n\tA locked repeater is one with another powered repeater facing them, to their immediate left or right sides.\n\t\"Left\" is relative to the direction the repeater output faces, naturally. */\n\tstatic bool IsLocked(cChunk & Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta)\n\t{\n\t\t// The left hand side offset. Will be negated to get the rhs offset\n\t\tconst auto LhsOffset = cBlockRedstoneRepeaterHandler::GetLeftCoordinateOffset(a_Meta);\n\n\t\t// Test the block to the left of us\n\t\tconst auto Lhs = IsOnRepeater(Chunk, LhsOffset + a_Position);\n\t\tif (Lhs.first && DoesLhsLockMe(Lhs.second, a_Meta))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// Test the right side, flipping the argument order to DoesLhsLockMe\n\t\tconst auto Rhs = IsOnRepeater(Chunk, -LhsOffset + a_Position);\n\t\treturn Rhs.first && DoesLhsLockMe(a_Meta, Rhs.second);\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tif (!IsOn(a_BlockType))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst auto FrontOffset = cBlockRedstoneRepeaterHandler::GetFrontCoordinateOffset(a_Chunk.GetMeta(a_Position));\n\t\tconst auto FrontPosition = a_Position + FrontOffset;\n\t\tif (a_QueryPosition == FrontPosition)\n\t\t{\n\t\t\treturn 15;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating loopy the repeater (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tauto & Data = DataForChunk(a_Chunk);\n\t\tconst auto DelayInfo = Data.GetMechanismDelayInfo(a_Position);\n\n\t\t// If the repeater is locked by another, ignore and forget all power changes:\n\t\tif (IsLocked(a_Chunk, a_Position, a_Meta))\n\t\t{\n\t\t\tif (DelayInfo != nullptr)\n\t\t\t{\n\t\t\t\tData.m_MechanismDelays.erase(a_Position);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (DelayInfo == nullptr)\n\t\t{\n\t\t\tbool ShouldBeOn = (Power != 0);\n\t\t\tif (ShouldBeOn != IsOn(a_BlockType))\n\t\t\t{\n\t\t\t\tData.m_MechanismDelays[a_Position] = std::make_pair((((a_Meta & 0xC) >> 0x2) + 1), ShouldBeOn);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tint DelayTicks;\n\t\tbool ShouldPowerOn;\n\t\tstd::tie(DelayTicks, ShouldPowerOn) = *DelayInfo;\n\n\t\tif (DelayTicks != 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst auto NewType = ShouldPowerOn ? E_BLOCK_REDSTONE_REPEATER_ON : E_BLOCK_REDSTONE_REPEATER_OFF;\n\t\ta_Chunk.FastSetBlock(a_Position, NewType, a_Meta);\n\t\tData.m_MechanismDelays.erase(a_Position);\n\n\t\t// While sleeping, we ignore any power changes and apply our saved ShouldBeOn when sleep expires\n\t\t// Now, we need to recalculate to be aware of any new changes that may e.g. cause a new output change\n\t\t// FastSetBlock doesn't wake simulators, so manually update ourselves:\n\t\tUpdate(a_Chunk, CurrentlyTicking, a_Position, NewType, a_Meta, Power);\n\n\t\tUpdateAdjustedRelative(a_Chunk, CurrentlyTicking, a_Position, cBlockRedstoneRepeaterHandler::GetFrontCoordinateOffset(a_Meta));\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tCallback(cBlockRedstoneRepeaterHandler::GetRearCoordinateOffset(a_Meta) + a_Position);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneSimulatorChunkData.h",
    "content": "\n#pragma once\n\n#include <stack>\n\n#include \"Chunk.h\"\n#include \"BlockState.h\"\n#include \"Simulator/RedstoneSimulator.h\"\n\n\n\n\n\nusing PowerLevel = unsigned char;\n\n\n\n\n\nclass cIncrementalRedstoneSimulatorChunkData final : public cRedstoneSimulatorChunkData\n{\npublic:\n\n\tvoid WakeUp(const Vector3i & a_Position)\n\t{\n\t\tm_ActiveBlocks.push(a_Position);\n\t}\n\n\tauto & GetActiveBlocks()\n\t{\n\t\treturn m_ActiveBlocks;\n\t}\n\n\tPowerLevel GetCachedPowerData(const Vector3i Position) const\n\t{\n\t\tauto Result = m_CachedPowerLevels.find(Position);\n\t\treturn (Result == m_CachedPowerLevels.end()) ? 0 : Result->second;\n\t}\n\n\tvoid SetCachedPowerData(const Vector3i Position, const PowerLevel PowerLevel)\n\t{\n\t\tm_CachedPowerLevels[Position] = PowerLevel;\n\t}\n\n\tstd::pair<int, bool> * GetMechanismDelayInfo(const Vector3i Position)\n\t{\n\t\tauto Result = m_MechanismDelays.find(Position);\n\t\treturn (Result == m_MechanismDelays.end()) ? nullptr : &Result->second;\n\t}\n\n\t/** Erase all cached redstone data for position. */\n\tvoid ErasePowerData(const Vector3i Position)\n\t{\n\t\tm_CachedPowerLevels.erase(Position);\n\t\tm_MechanismDelays.erase(Position);\n\t\tAlwaysTickedPositions.erase(Position);\n\t\tWireStates.erase(Position);\n\t\tObserverCache.erase(Position);\n\t}\n\n\tPowerLevel ExchangeUpdateOncePowerData(const Vector3i & a_Position, PowerLevel Power)\n\t{\n\t\tauto Result = m_CachedPowerLevels.find(a_Position);\n\n\t\tif (Result == m_CachedPowerLevels.end())\n\t\t{\n\t\t\tm_CachedPowerLevels[a_Position] = Power;\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn std::exchange(Result->second, Power);\n\t}\n\n\t/** Adjust From-relative coordinates into To-relative coordinates. */\n\tinline static Vector3i RebaseRelativePosition(const cChunk & From, const cChunk & To, const Vector3i Position)\n\t{\n\t\treturn\n\t\t{\n\t\t\tPosition.x + (From.GetPosX() - To.GetPosX()) * cChunkDef::Width,\n\t\t\tPosition.y,\n\t\t\tPosition.z + (From.GetPosZ() - To.GetPosZ()) * cChunkDef::Width\n\t\t};\n\t}\n\n\t/** Temporary, should be chunk data: wire block store, to avoid recomputing states every time. */\n\tstd::unordered_map<Vector3i, BlockState, VectorHasher<int>> WireStates;\n\n\tstd::unordered_set<Vector3i, VectorHasher<int>> AlwaysTickedPositions;\n\n\t/** Structure storing an observer's last seen block. */\n\tstd::unordered_map<Vector3i, std::pair<BLOCKTYPE, NIBBLETYPE>, VectorHasher<int>> ObserverCache;\n\n\t/** Structure storing position of mechanism + it's delay ticks (countdown) & if to power on. */\n\tstd::unordered_map<Vector3i, std::pair<int, bool>, VectorHasher<int>> m_MechanismDelays;\n\nprivate:\n\n\tstd::stack<Vector3i, std::vector<Vector3i>> m_ActiveBlocks;\n\n\t// TODO: map<Vector3i, int> -> Position of torch + it's heat level\n\n\tstd::unordered_map<Vector3i, PowerLevel, VectorHasher<int>> m_CachedPowerLevels;\n\n\tfriend class cRedstoneHandlerFactory;\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneToggleHandler.h",
    "content": "\n#pragma once\n\n#include \"../../Blocks/BlockButton.h\"\n#include \"../../Blocks/BlockLever.h\"\n\n\n\n\n\nnamespace RedstoneToggleHandler\n{\n\tstatic Vector3i GetOffsetAttachedTo(Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_LEVER:\n\t\t\t{\n\t\t\t\tswitch (a_Meta & 0x7)\n\t\t\t\t{\n\t\t\t\t\tcase 0x0:\n\t\t\t\t\tcase 0x7: return { 0, 1, 0 };\n\t\t\t\t\tcase 0x1: return { -1, 0, 0 };\n\t\t\t\t\tcase 0x2: return { 1, 0, 0 };\n\t\t\t\t\tcase 0x3: return { 0, 0, -1 };\n\t\t\t\t\tcase 0x4: return { 0, 0, 1 };\n\t\t\t\t\tcase 0x5:\n\t\t\t\t\tcase 0x6: return { 0, -1, 0 };\n\t\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tASSERT(!\"Unhandled lever metadata!\");\n\t\t\t\t\t\treturn { 0, 0, 0 };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase E_BLOCK_STONE_BUTTON:\n\t\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\t\t{\n\t\t\t\tswitch (a_Meta & 0x7)\n\t\t\t\t{\n\t\t\t\t\tcase 0x0: return { 0, 1, 0 };\n\t\t\t\t\tcase 0x1: return { -1, 0, 0 };\n\t\t\t\t\tcase 0x2: return { 1, 0, 0 };\n\t\t\t\t\tcase 0x3: return { 0, 0, -1 };\n\t\t\t\t\tcase 0x4: return { 0, 0, 1 };\n\t\t\t\t\tcase 0x5: return { 0, -1, 0 };\n\t\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tASSERT(!\"Unhandled button metadata!\");\n\t\t\t\t\t\treturn { 0, 0, 0 };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unexpected block passed to button/lever handler\");\n\t\t\t\treturn { 0, 0, 0 };\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic unsigned char GetPowerLevel(BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_BlockType)\n\t\t{\n\t\t\tcase E_BLOCK_LEVER: return cBlockLeverHandler::IsLeverOn(a_Meta) ? 15 : 0;\n\t\t\tcase E_BLOCK_STONE_BUTTON:\n\t\t\tcase E_BLOCK_WOODEN_BUTTON: return cBlockButtonHandler::IsButtonOn(a_Meta) ? 15 : 0;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unexpected block passed to button/lever handler\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_QueryBlockType);\n\n\t\tconst auto Meta = a_Chunk.GetMeta(a_Position);\n\t\tconst auto QueryOffset = a_QueryPosition - a_Position;\n\n\t\tif (IsLinked && (QueryOffset != GetOffsetAttachedTo(a_Position, a_BlockType, Meta)))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn GetPowerLevel(a_BlockType, Meta);\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating templatio<> the lever/button (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tUNUSED(Callback);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneTorchHandler.h",
    "content": "\n#pragma once\n\n\n\n\n\nnamespace RedstoneTorchHandler\n{\n\tstatic bool IsOn(BLOCKTYPE a_Block)\n\t{\n\t\treturn (a_Block == E_BLOCK_REDSTONE_TORCH_ON);\n\t}\n\n\tstatic Vector3i GetOffsetAttachedTo(const NIBBLETYPE a_Meta)\n\t{\n\t\tswitch (a_Meta)\n\t\t{\n\t\t\tcase E_META_TORCH_FLOOR: return { 0, -1, 0 };\n\t\t\tcase E_META_TORCH_EAST: return { -1, 0, 0 };\n\t\t\tcase E_META_TORCH_WEST: return { 1, 0, 0 };\n\t\t\tcase E_META_TORCH_NORTH: return { 0, 0, 1 };\n\t\t\tcase E_META_TORCH_SOUTH: return { 0, 0, -1 };\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled torch metadata\");\n\t\t\t\treturn { 0, 0, 0 };\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tconst auto QueryOffset = a_QueryPosition - a_Position;\n\n\t\tif (\n\t\t\t!IsOn(a_BlockType) ||\n\t\t\t(QueryOffset == GetOffsetAttachedTo(a_Chunk.GetMeta(a_Position))) ||\n\t\t\t(IsLinked && (QueryOffset != OffsetYP))\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn 15;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating torchy the redstone torch (%i %i %i)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tauto & Data = DataForChunk(a_Chunk);\n\t\tauto DelayInfo = Data.GetMechanismDelayInfo(a_Position);\n\n\t\tif (DelayInfo == nullptr)\n\t\t{\n\t\t\tconst bool ShouldBeOn = (Power == 0);\n\t\t\tif (ShouldBeOn != IsOn(a_BlockType))\n\t\t\t{\n\t\t\t\tData.m_MechanismDelays[a_Position] = std::make_pair(1, ShouldBeOn);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tint DelayTicks;\n\t\tbool ShouldPowerOn;\n\t\tstd::tie(DelayTicks, ShouldPowerOn) = *DelayInfo;\n\n\t\tif (DelayTicks != 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\ta_Chunk.FastSetBlock(a_Position, ShouldPowerOn ? E_BLOCK_REDSTONE_TORCH_ON : E_BLOCK_REDSTONE_TORCH_OFF, a_Meta);\n\t\tData.m_MechanismDelays.erase(a_Position);\n\n\t\tfor (const auto & Adjacent : RelativeAdjacents)\n\t\t{\n\t\t\t// Update all adjacents (including linked power positions)\n\t\t\t// apart from our attachment, which can't possibly need an update:\n\t\t\tif (Adjacent != GetOffsetAttachedTo(a_Meta))\n\t\t\t{\n\t\t\t\tUpdateAdjustedRelative(a_Chunk, CurrentlyTicking, a_Position, Adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tCallback(a_Position + GetOffsetAttachedTo(a_Meta));\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/RedstoneWireHandler.h",
    "content": "\n#pragma once\n\n#include \"RedstoneHandler.h\"\n#include \"Registries/BlockStates.h\"\n\n\n\n\n\nnamespace RedstoneWireHandler\n{\n\t/** A unified representation of wire direction. */\n\tenum class TemporaryDirection\n\t{\n\t\tUp,\n\t\tSide\n\t};\n\n\t/** Invokes Callback with the wire's left, front, and right direction state corresponding to Offset.\n\tReturns a new block constructed from the directions that the callback may have modified. */\n\ttemplate <class OffsetCallback>\n\tstatic BlockState DoWithDirectionState(const Vector3i Offset, BlockState Block, OffsetCallback Callback)\n\t{\n\t\tauto North = Block::RedstoneWire::North(Block);\n\t\tauto South = Block::RedstoneWire::South(Block);\n\t\tauto West = Block::RedstoneWire::West(Block);\n\t\tauto East = Block::RedstoneWire::East(Block);\n\n\t\tif (Offset.x == -1)\n\t\t{\n\t\t\tCallback(South, West, North);\n\t\t}\n\t\telse if (Offset.x == 1)\n\t\t{\n\t\t\tCallback(North, East, South);\n\t\t}\n\n\t\tif (Offset.z == -1)\n\t\t{\n\t\t\tCallback(West, North, East);\n\t\t}\n\t\telse if (Offset.z == 1)\n\t\t{\n\t\t\tCallback(East, South, West);\n\t\t}\n\n\t\treturn Block::RedstoneWire::RedstoneWire(East, North, 0, South, West);\n\t}\n\n\t/** Adjusts a given wire block so that the direction represented by Offset has state Direction. */\n\tstatic void SetDirectionState(const Vector3i Offset, BlockState & Block, TemporaryDirection Direction)\n\t{\n\t\tBlock = DoWithDirectionState(Offset, Block, [Direction](auto, auto & Front, auto)\n\t\t{\n\t\t\tusing FrontState = std::remove_reference_t<decltype(Front)>;\n\t\t\tswitch (Direction)\n\t\t\t{\n\t\t\t\tcase TemporaryDirection::Up:\n\t\t\t\t{\n\t\t\t\t\tFront = FrontState::Up;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase TemporaryDirection::Side:\n\t\t\t\t{\n\t\t\t\t\tFront = FrontState::Side;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tstatic bool IsDirectlyConnectingMechanism(BLOCKTYPE a_Block, NIBBLETYPE a_BlockMeta, const Vector3i a_Offset)\n\t{\n\t\tswitch (a_Block)\n\t\t{\n\t\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\t\t{\n\t\t\t\ta_BlockMeta &= E_META_REDSTONE_REPEATER_FACING_MASK;\n\t\t\t\tif ((a_BlockMeta == E_META_REDSTONE_REPEATER_FACING_XP) || (a_BlockMeta == E_META_REDSTONE_REPEATER_FACING_XM))\n\t\t\t\t{\n\t\t\t\t\t// Wire connects to repeater if repeater is aligned along X\n\t\t\t\t\t// and wire is in front or behind it (#4639)\n\t\t\t\t\treturn a_Offset.x != 0;\n\t\t\t\t}\n\n\t\t\t\treturn a_Offset.z != 0;\n\t\t\t}\n\t\t\tcase E_BLOCK_ACTIVE_COMPARATOR:\n\t\t\tcase E_BLOCK_BLOCK_OF_REDSTONE:\n\t\t\tcase E_BLOCK_INACTIVE_COMPARATOR:\n\t\t\tcase E_BLOCK_LEVER:\n\t\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\t\tcase E_BLOCK_STONE_BUTTON:\n\t\t\tcase E_BLOCK_WOODEN_BUTTON: return true;\n\t\t\tdefault: return false;\n\t\t}\n\t}\n\n\tstatic bool IsYPTerracingBlocked(const cChunk & a_Chunk, const Vector3i a_Position)\n\t{\n\t\tconst auto Position = a_Position + OffsetYP;\n\n\t\tif (!cChunkDef::IsValidHeight(Position))\n\t\t{\n\t\t\t// Certainly cannot terrace at the top of the world:\n\t\t\treturn true;\n\t\t}\n\n\t\tconst auto YPTerraceBlock = a_Chunk.GetBlock(Position);\n\t\treturn cBlockInfo::IsSolid(YPTerraceBlock) && !cBlockInfo::IsTransparent(YPTerraceBlock);\n\t}\n\n\t/** Temporary. Discovers a wire's connection state, including terracing, storing the block inside redstone chunk data.\n\tTODO: once the server supports block states this should go in the block handler, with data saved in the world. */\n\tstatic void SetWireState(const cChunk & a_Chunk, const Vector3i a_Position)\n\t{\n\t\tauto Block = Block::RedstoneWire::RedstoneWire();\n\t\tconst bool IsYPTerracingBlocked = RedstoneWireHandler::IsYPTerracingBlocked(a_Chunk, a_Position);\n\n\t\t// Loop through laterals, discovering terracing connections:\n\t\tfor (const auto & Offset : RelativeLaterals)\n\t\t{\n\t\t\tauto Adjacent = a_Position + Offset;\n\t\t\tauto NeighbourChunk = a_Chunk.GetRelNeighborChunkAdjustCoords(Adjacent);\n\n\t\t\tif ((NeighbourChunk == nullptr) || !NeighbourChunk->IsValid())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tBLOCKTYPE LateralBlock;\n\t\t\tNIBBLETYPE LateralMeta;\n\t\t\tNeighbourChunk->GetBlockTypeMeta(Adjacent, LateralBlock, LateralMeta);\n\n\t\t\tif (IsDirectlyConnectingMechanism(LateralBlock, LateralMeta, Offset))\n\t\t\t{\n\t\t\t\t// Any direct connections on a lateral means the wire has side connection in that direction:\n\t\t\t\tSetDirectionState(Offset, Block, TemporaryDirection::Side);\n\n\t\t\t\t// Temporary: this case will eventually be handled when wires are placed, with the state saved as blocks\n\t\t\t\t// When a neighbour wire was loaded into its chunk, its neighbour chunks may not have loaded yet\n\t\t\t\t// This function is called during chunk load (through AddBlock). Attempt to tell it its new state:\n\t\t\t\tif ((NeighbourChunk != &a_Chunk) && (LateralBlock == E_BLOCK_REDSTONE_WIRE))\n\t\t\t\t{\n\t\t\t\t\tauto & NeighbourBlock = DataForChunk(*NeighbourChunk).WireStates.find(Adjacent)->second;\n\t\t\t\t\tSetDirectionState(-Offset, NeighbourBlock, TemporaryDirection::Side);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!IsYPTerracingBlocked &&  // A block above us blocks all YP terracing, so the check is static in the loop\n\t\t\t\t(Adjacent.y < (cChunkDef::Height - 1)) &&\n\t\t\t\t(NeighbourChunk->GetBlock(Adjacent + OffsetYP) == E_BLOCK_REDSTONE_WIRE)  // Only terrace YP with another wire\n\t\t\t)\n\t\t\t{\n\t\t\t\tSetDirectionState(Offset, Block, cBlockInfo::IsTransparent(LateralBlock) ? TemporaryDirection::Side : TemporaryDirection::Up);\n\n\t\t\t\tif (NeighbourChunk != &a_Chunk)\n\t\t\t\t{\n\t\t\t\t\tauto & NeighbourBlock = DataForChunk(*NeighbourChunk).WireStates.find(Adjacent + OffsetYP)->second;\n\t\t\t\t\tSetDirectionState(-Offset, NeighbourBlock, TemporaryDirection::Side);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// IsYMTerracingBlocked (i.e. check block above lower terracing position, a.k.a. just the plain adjacent)\n\t\t\t\t(!cBlockInfo::IsSolid(LateralBlock) || cBlockInfo::IsTransparent(LateralBlock)) &&\n\t\t\t\t(Adjacent.y > 0) &&\n\t\t\t\t(NeighbourChunk->GetBlock(Adjacent + OffsetYM) == E_BLOCK_REDSTONE_WIRE)  // Only terrace YM with another wire\n\t\t\t)\n\t\t\t{\n\t\t\t\tSetDirectionState(Offset, Block, TemporaryDirection::Side);\n\n\t\t\t\tif (NeighbourChunk != &a_Chunk)\n\t\t\t\t{\n\t\t\t\t\tauto & NeighbourBlock = DataForChunk(*NeighbourChunk).WireStates.find(Adjacent + OffsetYM)->second;\n\t\t\t\t\tSetDirectionState(-Offset, NeighbourBlock, TemporaryDirection::Up);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tauto & States = DataForChunk(a_Chunk).WireStates;\n\t\tconst auto FindResult = States.find(a_Position);\n\t\tif (FindResult != States.end())\n\t\t{\n\t\t\tif (Block != FindResult->second)\n\t\t\t{\n\t\t\t\tFindResult->second = Block;\n\n\t\t\t\t// TODO: when state is stored as the block, the block handler updating via SetBlock will do this automatically\n\t\t\t\t// When a wire changes connection state, it needs to update its neighbours:\n\t\t\t\ta_Chunk.GetWorld()->WakeUpSimulators(cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos()));\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tDataForChunk(a_Chunk).WireStates.emplace(a_Position, Block);\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\t// Starts off as the wire's meta value, modified appropriately and returned\n\t\tauto Power = a_Chunk.GetMeta(a_Position);\n\t\tconst auto QueryOffset = a_QueryPosition - a_Position;\n\n\t\tif (\n\t\t\t(QueryOffset == OffsetYP) ||  // Wires do not power things above them\n\t\t\t(IsLinked && (a_QueryBlockType == E_BLOCK_REDSTONE_WIRE))  // Nor do they link power other wires\n\t\t)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (QueryOffset == OffsetYM)\n\t\t{\n\t\t\t// Wires always deliver power to the block underneath\n\t\t\treturn Power;\n\t\t}\n\n\t\tconst auto & Data = DataForChunk(a_Chunk);\n\t\tconst auto Block = Data.WireStates.find(a_Position)->second;\n\n\t\tDoWithDirectionState(QueryOffset, Block, [a_QueryBlockType, &Power](const auto Left, const auto Front, const auto Right)\n\t\t{\n\t\t\tusing LeftState = std::remove_reference_t<decltype(Left)>;\n\t\t\tusing FrontState = std::remove_reference_t<decltype(Front)>;\n\t\t\tusing RightState = std::remove_reference_t<decltype(Right)>;\n\n\t\t\t// Wires always deliver power to any directly connecting mechanisms:\n\t\t\tif (Front != FrontState::None)\n\t\t\t{\n\t\t\t\tif ((a_QueryBlockType == E_BLOCK_REDSTONE_WIRE) && (Power != 0))\n\t\t\t\t{\n\t\t\t\t\t// For mechanisms, wire of power one will still power them\n\t\t\t\t\t// But for wire-to-wire connections, power level decreases by 1:\n\t\t\t\t\tPower--;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/*\n\t\t\tOkay, we do not directly connect to the wire.\n\t\t\t1. If there are no DC mechanisms at all, the wire powers all laterals. Great, left and right are both None.\n\t\t\t2. If there is one DC mechanism, the wire \"goes straight\" along the axis of the wire and mechanism.\n\t\t\t\tThe only possible way for us to be powered is for us to be on the opposite end, with the wire pointing towards us.\n\t\t\t\tCheck that left and right are both None.\n\t\t\t3. If there is more than one DC, no non-DCs are powered. Left, right, cannot both be None.\n\t\t\t*/\n\t\t\tif ((Left == LeftState::None) && (Right == RightState::None))\n\t\t\t{\n\t\t\t\t// Case 1\n\t\t\t\t// Case 2\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Case 3\n\t\t\tPower = 0;\n\t\t});\n\n\t\treturn Power;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating dusty the wire (%d %d %d) %i\", a_Position.x, a_Position.y, a_Position.z, Power);\n\n\t\tif (a_Meta == Power)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\ta_Chunk.SetMeta(a_Position, Power);\n\n\t\t// Notify all positions, sans YP, to update:\n\t\tUpdateAdjustedRelative(a_Chunk, CurrentlyTicking, a_Position, OffsetYM);\n\t\tUpdateAdjustedRelatives(a_Chunk, CurrentlyTicking, a_Position, RelativeLaterals);\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\n\t\tCallback(a_Position + OffsetYP);\n\t\tCallback(a_Position + OffsetYM);\n\n\t\tconst auto & Data = DataForChunk(a_Chunk);\n\t\tconst auto Block = Data.WireStates.find(a_Position)->second;\n\n\t\t// Figure out, based on our pre-computed block, where we connect to:\n\t\tfor (const auto & Offset : RelativeLaterals)\n\t\t{\n\t\t\tconst auto Relative = a_Position + Offset;\n\t\t\tCallback(Relative);\n\n\t\t\tDoWithDirectionState(Offset, Block, [&a_Chunk, &Callback, Relative](auto, const auto Front, auto)\n\t\t\t{\n\t\t\t\tusing FrontState = std::remove_reference_t<decltype(Front)>;\n\n\t\t\t\tif (Front == FrontState::Up)\n\t\t\t\t{\n\t\t\t\t\tCallback(Relative + OffsetYP);\n\t\t\t\t}\n\t\t\t\telse if (Front == FrontState::Side)\n\t\t\t\t{\n\t\t\t\t\t// Alas, no way to distinguish side lateral and side diagonal\n\t\t\t\t\t// Have to do a manual check to only accept power from YM diagonal if there's a wire there\n\n\t\t\t\t\tconst auto YMDiagonalPosition = Relative + OffsetYM;\n\t\t\t\t\tif (\n\t\t\t\t\t\tBLOCKTYPE QueryBlock;\n\t\t\t\t\t\tcChunkDef::IsValidHeight(YMDiagonalPosition) &&\n\t\t\t\t\t\ta_Chunk.UnboundedRelGetBlockType(YMDiagonalPosition, QueryBlock) &&\n\t\t\t\t\t\t(QueryBlock == E_BLOCK_REDSTONE_WIRE)\n\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\tCallback(YMDiagonalPosition);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/SmallGateHandler.h",
    "content": "\n#pragma once\n\n\n\n\n\nnamespace SmallGateHandler\n{\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating gateydory the fence gate/trapdoor (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\t// Use redstone data rather than block state so players can override redstone control\n\t\tconst auto Previous = DataForChunk(a_Chunk).ExchangeUpdateOncePowerData(a_Position, Power);\n\t\tconst bool IsOpen = (Previous != 0);\n\t\tconst bool ShouldBeOpen = Power != 0;\n\n\t\tif (ShouldBeOpen != IsOpen)\n\t\t{\n\t\t\ta_Chunk.SetMeta(a_Position, ShouldBeOpen ? (a_Meta | 0x4) : (a_Meta & ~0x04));\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/TNTHandler.h",
    "content": "\n#pragma once\n\n\n\n\n\nnamespace TNTHandler\n{\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\t\treturn 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating explodinator the trinitrotoluene (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\t\tif (Power != 0)\n\t\t{\n\t\t\ta_Chunk.SetBlock(a_Position, E_BLOCK_AIR, 0);\n\t\t\ta_Chunk.GetWorld()->SpawnPrimedTNT(Vector3d(0.5, 0.5, 0.5) + cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos()));  // 80 ticks to boom\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tInvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/TrappedChestHandler.h",
    "content": "\n#pragma once\n\n#include \"../../BlockEntities/ChestEntity.h\"\n\n\n\n\n\nnamespace TrappedChestHandler\n{\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryPosition);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(IsLinked);\n\n\t\treturn DataForChunk(a_Chunk).GetCachedPowerData(a_Position);\n\t}\n\n\tstatic unsigned char GetPowerLevel(cChunk & a_Chunk, Vector3i a_Position)\n\t{\n\t\tint NumberOfPlayers = 0;\n\t\ta_Chunk.DoWithBlockEntityAt(a_Position, [&NumberOfPlayers](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_TRAPPED_CHEST);\n\n\t\t\tNumberOfPlayers = static_cast<cChestEntity &>(a_BlockEntity).GetNumberOfPlayers();\n\t\t\treturn false;\n\t\t});\n\n\t\treturn static_cast<unsigned char>(std::min(NumberOfPlayers, 15));\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating tricky the trapped chest (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tconst auto PowerLevel = GetPowerLevel(a_Chunk, a_Position);\n\t\tconst auto PreviousPower = DataForChunk(a_Chunk).ExchangeUpdateOncePowerData(a_Position, PowerLevel);\n\n\t\tif (PowerLevel != PreviousPower)\n\t\t{\n\t\t\tUpdateAdjustedRelatives(a_Chunk, CurrentlyTicking, a_Position, RelativeAdjacents);\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tUNUSED(Callback);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/IncrementalRedstoneSimulator/TripwireHookHandler.h",
    "content": "\n#pragma once\n\n#include \"../../Blocks/BlockTripwireHook.h\"\n\n\n\n\n\nnamespace TripwireHookHandler\n{\n\tstatic unsigned char GetPowerLevel(const cChunk & a_Chunk, Vector3i a_Position, NIBBLETYPE a_Meta)\n\t{\n\t\tbool FoundActivated = false;\n\t\tconst auto FaceToGoTowards = cBlockTripwireHookHandler::MetadataToDirection(a_Meta);\n\n\t\tfor (int i = 0; i < 40; ++i)  // Tripwires can be connected up to 40 blocks\n\t\t{\n\t\t\tBLOCKTYPE Type;\n\t\t\tNIBBLETYPE Meta;\n\n\t\t\ta_Position = AddFaceDirection(a_Position, FaceToGoTowards);\n\t\t\tif (!a_Chunk.UnboundedRelGetBlock(a_Position, Type, Meta))\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (Type == E_BLOCK_TRIPWIRE)\n\t\t\t{\n\t\t\t\tif (FoundActivated)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!a_Chunk.ForEachEntityInBox(\n\t\t\t\t\t\tcBoundingBox(Vector3d(0.5, 0, 0.5) + cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos()), 0.5, 0.5),\n\t\t\t\t\t\t[](cEntity &) { return true; }\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tFoundActivated = true;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if (Type == E_BLOCK_TRIPWIRE_HOOK)\n\t\t\t{\n\t\t\t\tif (ReverseBlockFace(cBlockTripwireHookHandler::MetadataToDirection(Meta)) == FaceToGoTowards)\n\t\t\t\t{\n\t\t\t\t\t// Other hook facing in opposite direction - circuit completed!\n\t\t\t\t\treturn FoundActivated ? 15 : 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Tripwire hook not connected at all\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tstatic PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)\n\t{\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_QueryBlockType);\n\t\tUNUSED(a_QueryPosition);\n\n\t\treturn (GetPowerLevel(a_Chunk, a_Position, a_Chunk.GetMeta(a_Position)) == 15) ? 15 : 0;\n\t}\n\n\tstatic void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power)\n\t{\n\t\t// LOGD(\"Evaluating hooky the tripwire hook (%d %d %d)\", a_Position.x, a_Position.y, a_Position.z);\n\n\t\tconst auto PowerLevel = GetPowerLevel(a_Chunk, a_Position, a_Meta);\n\t\tNIBBLETYPE Meta;\n\t\tif (PowerLevel == 0)\n\t\t{\n\t\t\tMeta = (a_Meta & 0x3);\n\t\t}\n\t\telse if (PowerLevel == 1)\n\t\t{\n\t\t\t// Connected but not activated, AND away the highest bit\n\t\t\tMeta = (a_Meta & 0x7) | 0x4;\n\t\t}\n\t\telse if (PowerLevel == 15)\n\t\t{\n\t\t\t// Connected and activated, set the 3rd and 4th highest bits\n\t\t\tMeta = (a_Meta | 0xC);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUNREACHABLE(\"Unexpected tripwire hook power level!\");\n\t\t}\n\n\t\tif (Meta != a_Meta)\n\t\t{\n\t\t\ta_Chunk.SetMeta(a_Position, Meta);\n\t\t\tUpdateAdjustedRelatives(a_Chunk, CurrentlyTicking, a_Position, RelativeAdjacents);\n\t\t}\n\t}\n\n\tstatic void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)\n\t{\n\t\tUNUSED(a_Chunk);\n\t\tUNUSED(a_BlockType);\n\t\tUNUSED(a_Meta);\n\t\tUNUSED(a_Position);\n\t\tUNUSED(Callback);\n\t}\n};\n"
  },
  {
    "path": "src/Simulator/NoopFluidSimulator.h",
    "content": "\n// NoopFluidSimulator.h\n\n// Declares the cNoopFluidSimulator class representing a fluid simulator that performs nothing, it ignores all blocks\n\n\n\n\n\n#pragma once\n\n#include \"FluidSimulator.h\"\n\n\n\n\n\nclass cNoopFluidSimulator final :\n\tpublic cFluidSimulator\n{\n\tusing Super = cFluidSimulator;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override\n\t{\n\t\tUNUSED(a_Dt);\n\t\tUNUSED(a_ChunkX);\n\t\tUNUSED(a_ChunkZ);\n\t\tUNUSED(a_Chunk);\n\t}\n\n\tvirtual void AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) override\n\t{\n\t\tUNUSED(a_Block);\n\t\tUNUSED(a_Chunk);\n\t}\n\n\tvirtual cFluidSimulatorData * CreateChunkData(void) override { return nullptr; }\n} ;\n"
  },
  {
    "path": "src/Simulator/NoopRedstoneSimulator.h",
    "content": "\n#pragma once\n\n#include \"RedstoneSimulator.h\"\n\n\n\n\n\nclass cRedstoneNoopSimulator final :\n\tpublic cRedstoneSimulator\n{\n\tusing Super = cRedstoneSimulator;\n\npublic:\n\n\tcRedstoneNoopSimulator(cWorld & a_World):\n\t\tSuper(a_World)\n\t{\n\t}\n\n\tvirtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override\n\t{\n\t\tUNUSED(a_Dt);\n\t\tUNUSED(a_ChunkX);\n\t\tUNUSED(a_ChunkZ);\n\t\tUNUSED(a_Chunk);\n\t}\n\n\tvirtual void AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) override\n\t{\n\t\tUNUSED(a_Block);\n\t\tUNUSED(a_Chunk);\n\t}\n\n\tvirtual cRedstoneSimulatorChunkData * CreateChunkData() override\n\t{\n\t\treturn nullptr;\n\t}\n} ;\n"
  },
  {
    "path": "src/Simulator/RedstoneSimulator.h",
    "content": "\n#pragma once\n\n#include \"Simulator.h\"\n\n\n\n\n\nclass cRedstoneSimulatorChunkData\n{\npublic:\n\n\tvirtual ~cRedstoneSimulatorChunkData()\n\t{\n\t}\n};\n\n\n\n\n\nclass cRedstoneSimulator:\n\tpublic cSimulator\n{\n\tusing Super = cSimulator;\n\npublic:\n\n\tusing Super::Super;\n\n\tvirtual cRedstoneSimulatorChunkData * CreateChunkData() = 0;\n};\n"
  },
  {
    "path": "src/Simulator/SandSimulator.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"SandSimulator.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../Defines.h\"\n#include \"../Entities/FallingBlock.h\"\n#include \"../Chunk.h\"\n#include \"../IniFile.h\"\n#include \"../EffectID.h\"\n\n\n\n\n\ncSandSimulator::cSandSimulator(cWorld & a_World, cIniFile & a_IniFile) :\n\tcSimulator(a_World),\n\tm_TotalBlocks(0)\n{\n\tm_IsInstantFall = a_IniFile.GetValueSetB(\"Physics\", \"SandInstantFall\", false);\n}\n\n\n\n\n\nvoid cSandSimulator::SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk)\n{\n\tcSandSimulatorChunkData & ChunkData = a_Chunk->GetSandSimulatorData();\n\tif (ChunkData.empty())\n\t{\n\t\treturn;\n\t}\n\n\tint BaseX = a_Chunk->GetPosX() * cChunkDef::Width;\n\tint BaseZ = a_Chunk->GetPosZ() * cChunkDef::Width;\n\tfor (cSandSimulatorChunkData::const_iterator itr = ChunkData.begin(), end = ChunkData.end(); itr != end; ++itr)\n\t{\n\t\tBLOCKTYPE BlockType = a_Chunk->GetBlock(itr->x, itr->y, itr->z);\n\t\tif (!IsAllowedBlock(BlockType) || (itr->y <= 0))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tBLOCKTYPE BlockBelow = (itr->y > 0) ? a_Chunk->GetBlock(itr->x, itr->y - 1, itr->z) : static_cast<BLOCKTYPE>(E_BLOCK_AIR);\n\t\tif (CanStartFallingThrough(BlockBelow))\n\t\t{\n\t\t\tif (m_IsInstantFall)\n\t\t\t{\n\t\t\t\tDoInstantFall(a_Chunk, itr->x, itr->y, itr->z);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tVector3i Pos;\n\t\t\tPos.x = itr->x + BaseX;\n\t\t\tPos.y = itr->y;\n\t\t\tPos.z = itr->z + BaseZ;\n\t\t\t/*\n\t\t\tFLOGD(\n\t\t\t\t\"Creating a falling block at {0} of type {1}, block below: {2}\",\n\t\t\t\tPos, ItemTypeToString(BlockType), ItemTypeToString(BlockBelow)\n\t\t\t);\n\t\t\t*/\n\n\t\t\tm_World.SpawnFallingBlock(Pos, BlockType, a_Chunk->GetMeta(itr->x, itr->y, itr->z));\n\t\t\ta_Chunk->SetBlock({itr->x, itr->y, itr->z}, E_BLOCK_AIR, 0);\n\t\t}\n\t}\n\tm_TotalBlocks -= static_cast<int>(ChunkData.size());\n\tChunkData.clear();\n}\n\n\n\n\n\nvoid cSandSimulator::AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block)\n{\n\tif (!IsAllowedBlock(a_Block))\n\t{\n\t\treturn;\n\t}\n\n\t// Check for duplicates:\n\tcSandSimulatorChunkData & ChunkData = a_Chunk.GetSandSimulatorData();\n\tfor (cSandSimulatorChunkData::iterator itr = ChunkData.begin(); itr != ChunkData.end(); ++itr)\n\t{\n\t\tif ((itr->x == a_Position.x) && (itr->y == a_Position.y) && (itr->z == a_Position.z))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tm_TotalBlocks += 1;\n\tChunkData.emplace_back(a_Position.x, a_Position.y, a_Position.z);\n}\n\n\n\n\n\nbool cSandSimulator::CanStartFallingThrough(BLOCKTYPE a_BlockType)\n{\n\t// Please keep the list alpha-sorted\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_AIR:\n\t\tcase E_BLOCK_FIRE:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_WATER:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cSandSimulator::CanContinueFallThrough(BLOCKTYPE a_BlockType)\n{\n\t// Please keep the list alpha-sorted\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_AIR:\n\t\tcase E_BLOCK_BEETROOTS:\n\t\tcase E_BLOCK_BROWN_MUSHROOM:\n\t\tcase E_BLOCK_CARROTS:\n\t\tcase E_BLOCK_COBWEB:\n\t\tcase E_BLOCK_CROPS:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_DETECTOR_RAIL:\n\t\tcase E_BLOCK_FIRE:\n\t\tcase E_BLOCK_FLOWER_POT:\n\t\tcase E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_IRON_TRAPDOOR:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_LEVER:\n\t\tcase E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:\n\t\tcase E_BLOCK_MINECART_TRACKS:\n\t\tcase E_BLOCK_MELON_STEM:\n\t\tcase E_BLOCK_POWERED_RAIL:\n\t\tcase E_BLOCK_PUMPKIN_STEM:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_OFF:\n\t\tcase E_BLOCK_REDSTONE_REPEATER_ON:\n\t\tcase E_BLOCK_REDSTONE_TORCH_OFF:\n\t\tcase E_BLOCK_REDSTONE_TORCH_ON:\n\t\tcase E_BLOCK_REDSTONE_WIRE:\n\t\tcase E_BLOCK_RED_MUSHROOM:\n\t\tcase E_BLOCK_RED_ROSE:\n\t\tcase E_BLOCK_SIGN_POST:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_STONE_BUTTON:\n\t\tcase E_BLOCK_STONE_PRESSURE_PLATE:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_TORCH:\n\t\tcase E_BLOCK_TRAPDOOR:\n\t\tcase E_BLOCK_TRIPWIRE:\n\t\tcase E_BLOCK_TRIPWIRE_HOOK:\n\t\tcase E_BLOCK_WALL_BANNER:\n\t\tcase E_BLOCK_WALLSIGN:\n\t\tcase E_BLOCK_WATER:\n\t\tcase E_BLOCK_WOODEN_BUTTON:\n\t\tcase E_BLOCK_WOODEN_PRESSURE_PLATE:\n\t\tcase E_BLOCK_YELLOW_FLOWER:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cSandSimulator::IsReplacedOnRematerialization(BLOCKTYPE a_BlockType)\n{\n\t// Please keep the list alpha-sorted\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_AIR:\n\t\tcase E_BLOCK_CHORUS_FLOWER:\n\t\tcase E_BLOCK_CHORUS_PLANT:\n\t\tcase E_BLOCK_DEAD_BUSH:\n\t\tcase E_BLOCK_FIRE:\n\t\tcase E_BLOCK_LAVA:\n\t\tcase E_BLOCK_SNOW:\n\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\tcase E_BLOCK_STATIONARY_WATER:\n\t\tcase E_BLOCK_STRUCTURE_VOID:\n\t\tcase E_BLOCK_TALL_GRASS:\n\t\tcase E_BLOCK_WATER:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cSandSimulator::DoesBreakFallingThrough(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_PURPUR_SLAB:\n\t\tcase E_BLOCK_RED_SANDSTONE_SLAB:\n\t\tcase E_BLOCK_STONE_SLAB:\n\t\tcase E_BLOCK_WOODEN_SLAB:\n\t\t{\n\t\t\treturn ((a_BlockMeta & 0x08) == 0);  // Only a bottom-slab breaks the block\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cSandSimulator::FinishFalling(\n\tcWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ,\n\tBLOCKTYPE a_FallingBlockType, NIBBLETYPE a_FallingBlockMeta\n)\n{\n\tASSERT(a_BlockY < cChunkDef::Height);\n\n\tBLOCKTYPE CurrentBlockType = a_World->GetBlock({ a_BlockX, a_BlockY, a_BlockZ });\n\tif ((a_FallingBlockType == E_BLOCK_ANVIL) || IsReplacedOnRematerialization(CurrentBlockType))\n\t{\n\t\t// Rematerialize the material here:\n\t\ta_World->SetBlock({ a_BlockX, a_BlockY, a_BlockZ }, a_FallingBlockType, a_FallingBlockMeta);\n\t\tif (a_FallingBlockType == E_BLOCK_ANVIL)\n\t\t{\n\t\t\ta_World->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_ANVIL_LAND, {a_BlockX, a_BlockY, a_BlockZ}, 0);\n\t\t}\n\t\treturn;\n\t}\n\n\t// Create a pickup instead:\n\tcItems Pickups;\n\tPickups.Add(static_cast<ENUM_ITEM_TYPE>(a_FallingBlockType), 1, a_FallingBlockMeta);\n\ta_World->SpawnItemPickups(\n\t\tPickups,\n\t\tstatic_cast<double>(a_BlockX) + 0.5,\n\t\tstatic_cast<double>(a_BlockY) + 0.5,\n\t\tstatic_cast<double>(a_BlockZ) + 0.5\n\t);\n}\n\n\n\n\n\nbool cSandSimulator::IsAllowedBlock(BLOCKTYPE a_BlockType)\n{\n\tswitch (a_BlockType)\n\t{\n\t\tcase E_BLOCK_ANVIL:\n\t\tcase E_BLOCK_CONCRETE_POWDER:\n\t\tcase E_BLOCK_DRAGON_EGG:\n\t\tcase E_BLOCK_GRAVEL:\n\t\tcase E_BLOCK_SAND:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSandSimulator::DoInstantFall(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ)\n{\n\t// Remove the original block:\n\tBLOCKTYPE  FallingBlockType;\n\tNIBBLETYPE FallingBlockMeta;\n\ta_Chunk->GetBlockTypeMeta(a_RelX, a_RelY, a_RelZ, FallingBlockType, FallingBlockMeta);\n\ta_Chunk->SetBlock({a_RelX, a_RelY, a_RelZ}, E_BLOCK_AIR, 0);\n\n\t// Search for a place to put it:\n\tfor (int y = a_RelY - 1; y >= 0; y--)\n\t{\n\t\tBLOCKTYPE BlockType;\n\t\tNIBBLETYPE BlockMeta;\n\t\ta_Chunk->GetBlockTypeMeta(a_RelX, y, a_RelZ, BlockType, BlockMeta);\n\t\tint BlockY;\n\t\tif (DoesBreakFallingThrough(BlockType, BlockMeta))\n\t\t{\n\t\t\tBlockY = y;\n\t\t}\n\t\telse if (!CanContinueFallThrough(BlockType))\n\t\t{\n\t\t\tBlockY = y + 1;\n\t\t}\n\t\telse if ((FallingBlockType == E_BLOCK_CONCRETE_POWDER) && IsBlockWater(BlockType))\n\t\t{\n\t\t\tFallingBlockType = E_BLOCK_CONCRETE;\n\t\t\tBlockY = y;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Can fall further down\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Finish the fall at the found bottom:\n\t\tint BlockX = a_RelX + a_Chunk->GetPosX() * cChunkDef::Width;\n\t\tint BlockZ = a_RelZ + a_Chunk->GetPosZ() * cChunkDef::Width;\n\t\tFinishFalling(&m_World, BlockX, BlockY, BlockZ, FallingBlockType, FallingBlockMeta);\n\t\treturn;\n\t}\n\n\t// The block just \"fell off the world\" without leaving a trace\n}\n\n\n\n\n"
  },
  {
    "path": "src/Simulator/SandSimulator.h",
    "content": "\n#pragma once\n\n#include \"Simulator.h\"\n#include \"../IniFile.h\"\n\n\n\n\n\n// fwd:\nclass cChunk;\n\n\n\n\n\n/** Per-chunk data for the simulator, specified individual chunks to simulate; Data is not used */\ntypedef cCoordWithIntList cSandSimulatorChunkData;\n\n\n\n\n\n/** Despite the class name, this simulator takes care of all blocks that fall when suspended in the air. */\nclass cSandSimulator :\n\tpublic cSimulator\n{\npublic:\n\n\tcSandSimulator(cWorld & a_World, cIniFile & a_IniFile);\n\n\t/** Returns true if a falling-able block can start falling through the specified block type */\n\tstatic bool CanStartFallingThrough(BLOCKTYPE a_BlockType);\n\n\t/** Returns true if an already-falling block can pass through the specified block type (e. g. torch) */\n\tstatic bool CanContinueFallThrough(BLOCKTYPE a_BlockType);\n\n\t/** Returns true if the falling block rematerializing will replace the specified block type (e. g. tall grass) */\n\tstatic bool IsReplacedOnRematerialization(BLOCKTYPE a_BlockType);\n\n\t/** Returns true if the specified block breaks falling blocks while they fall through it (e. g. halfslabs) */\n\tstatic bool DoesBreakFallingThrough(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** Called when a block finishes falling at the specified coords, either by insta-fall,\n\tor through cFallingBlock entity.\n\tIt either rematerializes the block (a_FallingBlockType) at the specified coords, or creates a pickup,\n\tbased on the block currently present in the world at the dest specified coords. */\n\tstatic void FinishFalling(\n\t\tcWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ,\n\t\tBLOCKTYPE a_FallingBlockType, NIBBLETYPE a_FallingBlockMeta\n\t);\n\n\tstatic bool IsAllowedBlock(BLOCKTYPE a_BlockType);\n\nprivate:\n\n\tvirtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override;\n\n\tbool m_IsInstantFall;  // If set to true, blocks don't fall using cFallingBlock entity, but instantly instead\n\n\tint  m_TotalBlocks;    // Total number of blocks currently in the queue for simulating\n\n\tvirtual void AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) override;\n\n\t/** Performs the instant fall of the block - removes it from top, Finishes it at the bottom */\n\tvoid DoInstantFall(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);\n};\n"
  },
  {
    "path": "src/Simulator/Simulator.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"Simulator.h\"\n#include \"../Chunk.h\"\n#include \"../World.h\"\n\n\n\n\n\nstd::array<Vector3i, 5> cSimulator::GetLinkedOffsets(const Vector3i Offset)\n{\n\tif (Offset.x == -1)\n\t{\n\t\treturn\n\t\t{\n\t\t\t{\n\t\t\t\t{ -2,  0,  0 },\n\t\t\t\t{ -1, -1,  0 },\n\t\t\t\t{ -1,  1,  0 },\n\t\t\t\t{ -1,  0, -1 },\n\t\t\t\t{ -1,  0,  1 }\n\t\t\t}\n\t\t};\n\t}\n\telse if (Offset.x == 1)\n\t{\n\t\treturn\n\t\t{\n\t\t\t{\n\t\t\t\t{  2,  0,  0 },\n\t\t\t\t{  1, -1,  0 },\n\t\t\t\t{  1,  1,  0 },\n\t\t\t\t{  1,  0, -1 },\n\t\t\t\t{  1,  0,  1 }\n\t\t\t}\n\t\t};\n\t}\n\telse if (Offset.y == -1)\n\t{\n\t\treturn\n\t\t{\n\t\t\t{\n\t\t\t\t{  0, -2,  0 },\n\t\t\t\t{ -1, -1,  0 },\n\t\t\t\t{  1, -1,  0 },\n\t\t\t\t{  0, -1, -1 },\n\t\t\t\t{  0, -1,  1 }\n\t\t\t}\n\t\t};\n\t}\n\telse if (Offset.y == 1)\n\t{\n\t\treturn\n\t\t{\n\t\t\t{\n\t\t\t\t{  0,  2,  0 },\n\t\t\t\t{ -1,  1,  0 },\n\t\t\t\t{  1,  1,  0 },\n\t\t\t\t{  0,  1, -1 },\n\t\t\t\t{  0,  1,  1 }\n\t\t\t}\n\t\t};\n\t}\n\telse if (Offset.z == -1)\n\t{\n\t\treturn\n\t\t{\n\t\t\t{\n\t\t\t\t{  0,  0, -2 },\n\t\t\t\t{ -1,  0, -1 },\n\t\t\t\t{  1,  0, -1 },\n\t\t\t\t{  0, -1, -1 },\n\t\t\t\t{  0,  1, -1 }\n\t\t\t}\n\t\t};\n\t}\n\n\treturn\n\t{\n\t\t{\n\t\t\t{  0,  0,  2 },\n\t\t\t{ -1,  0,  1 },\n\t\t\t{  1,  0,  1 },\n\t\t\t{  0, -1,  1 },\n\t\t\t{  0,  1,  1 }\n\t\t}\n\t};\n}\n\n\n\n\n\nvoid cSimulator::Simulate(float a_Dt)\n{\n\tUNUSED(a_Dt);\n}\n\n\n\n\n\nvoid cSimulator::WakeUp(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block)\n{\n\tASSERT(a_Chunk.IsValid());\n\n\tAddBlock(a_Chunk, a_Position, a_Block);\n}\n\n\n\n\n\nvoid cSimulator::WakeUp(cChunk & a_Chunk, Vector3i a_Position, Vector3i a_Offset, BLOCKTYPE a_Block)\n{\n\tASSERT(a_Chunk.IsValid());\n\n\tWakeUp(a_Chunk, a_Position, a_Block);\n}\n"
  },
  {
    "path": "src/Simulator/Simulator.h",
    "content": "\n#pragma once\n\n#include \"ChunkDef.h\"\n\nclass cWorld;\nclass cChunk;\nclass cCuboid;\n\n\n\n\n\n/** Base class for all block-based physics simulators (such as fluid, fire, falling blocks etc.).\nEach descendant provides an implementation of what needs to be done on each world tick.\nThe descendant may choose to do all processing in a single call for the entire world (Simulate())\nor do per-chunk calculations (SimulateChunk()).\nWhenever a block is changed, the WakeUp() functions are called to notify all simulators by the simulator manager.\nThe functions are invoked to add all affected blocks and their direct neighbors using the AddBlock() function.\nThe simulator may update its internal state based on this call. */\nclass cSimulator\n{\npublic:\n\n\tcSimulator(cWorld & a_World)\n\t\t: m_World(a_World)\n\t{\n\t}\n\n\tvirtual ~cSimulator() {}\n\n\t/** Contains offsets for direct adjacents of any position. */\n\tstatic constexpr std::array<Vector3i, 6> AdjacentOffsets\n\t{\n\t\t{\n\t\t\t{  1,  0,  0 },\n\t\t\t{ -1,  0,  0 },\n\t\t\t{  0,  1,  0 },\n\t\t\t{  0, -1,  0 },\n\t\t\t{  0,  0,  1 },\n\t\t\t{  0,  0, -1 },\n\t\t}\n\t};\n\n\t/** For a given offset from a position, return the offsets that represent the adjacents of the newly offset position, excluding the old position. */\n\tstatic std::array<Vector3i, 5> GetLinkedOffsets(Vector3i Offset);\n\nprotected:\n\n\tfriend class cChunk;  // Calls AddBlock() in its WakeUpSimulators() function, to speed things up\n\tfriend class cSimulatorManager;  // Class reponsible for dispatching calls to the various slave Simulators\n\n\tvirtual void Simulate(float a_Dt);\n\tvirtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) = 0;\n\n\t/** Called to simulate a new block. Unlike WakeUp this function will perform minimal checking.\n\tIt queues the block to be simulated as fast as possible, suitable for area wakeups. */\n\tvirtual void AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) = 0;\n\n\t/** Called to simulate a single new block, typically as a result of a single block break or change.\n\tThe simulator implementation may decide to perform additional checks or maintain consistency of internal state\n\tbefore the block is added to the simulate queue. */\n\tvirtual void WakeUp(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block);\n\n\t/** Called to simulate a single block, synthesised by the simulator manager.\n\tThe position represents the adjacents of the block that was actually changed, with the offset used given.\n\tSimulators may use this information to update additional blocks that were affected by the change, or queue\n\tfarther, extra-adjacents blocks to be updated. The simulator manager calls this overload after the 3-argument WakeUp. */\n\tvirtual void WakeUp(cChunk & a_Chunk, Vector3i a_Position, Vector3i a_Offset, BLOCKTYPE a_Block);\n\n\tcWorld & m_World;\n} ;\n"
  },
  {
    "path": "src/Simulator/SimulatorManager.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"SimulatorManager.h\"\n#include \"../Chunk.h\"\n#include \"../Cuboid.h\"\n#include \"../World.h\"\n\n\n\n\n\ncSimulatorManager::cSimulatorManager(cWorld & a_World) :\n\tm_World(a_World),\n\tm_Ticks(0)\n{\n}\n\n\n\n\n\ncSimulatorManager::~cSimulatorManager()\n{\n}\n\n\n\n\n\nvoid cSimulatorManager::Simulate(float a_Dt)\n{\n\tm_Ticks++;\n\n\tfor (cSimulators::iterator itr = m_Simulators.begin(); itr != m_Simulators.end(); ++itr)\n\t{\n\t\tif ((m_Ticks % itr->second) == 0)\n\t\t{\n\t\t\titr->first->Simulate(a_Dt);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSimulatorManager::SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk)\n{\n\t// m_Ticks has already been increased in Simulate()\n\n\tfor (cSimulators::iterator itr = m_Simulators.begin(); itr != m_Simulators.end(); ++itr)\n\t{\n\t\tif ((m_Ticks % itr->second) == 0)\n\t\t{\n\t\t\titr->first->SimulateChunk(a_Dt, a_ChunkX, a_ChunkZ, a_Chunk);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSimulatorManager::WakeUp(cChunk & a_Chunk, Vector3i a_Position)\n{\n\tASSERT(a_Chunk.IsValid());\n\n\tfor (const auto & Item : m_Simulators)\n\t{\n\t\tItem.first->WakeUp(a_Chunk, a_Position, a_Chunk.GetBlock(a_Position));\n\t}\n\n\tfor (const auto & Offset : cSimulator::AdjacentOffsets)\n\t{\n\t\tauto Relative = a_Position + Offset;\n\n\t\tif (!cChunkDef::IsValidHeight(Relative))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst auto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(Relative);\n\n\t\tif ((Chunk == nullptr) || !Chunk->IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Stored block to give to simulators for performance\n\t\t// Since they all need this we save them querying it themselves\n\t\tconst auto Block = Chunk->GetBlock(Relative);\n\n\t\tfor (const auto & Item : m_Simulators)\n\t\t{\n\t\t\tItem.first->WakeUp(*Chunk, Relative, Offset, Block);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSimulatorManager::WakeUp(const cCuboid & a_Area)\n{\n\tcCuboid area(a_Area);\n\tarea.Sort();\n\tarea.Expand(1, 1, 1, 1, 1, 1);  // Expand the area to contain the neighbors, too.\n\tarea.ClampY(0, cChunkDef::Height - 1);\n\n\tcChunkCoords ChunkStart = cChunkDef::BlockToChunk(area.p1);\n\tcChunkCoords ChunkEnd = cChunkDef::BlockToChunk(area.p2);\n\n\t// Add all blocks, in a per-chunk manner:\n\tfor (int cz = ChunkStart.m_ChunkZ; cz <= ChunkEnd.m_ChunkZ; ++cz)\n\t{\n\t\tfor (int cx = ChunkStart.m_ChunkX; cx <= ChunkEnd.m_ChunkX; ++cx)\n\t\t{\n\t\t\tm_World.DoWithChunk(cx, cz, [this, &area](cChunk & a_CBChunk)\n\t\t\t{\n\t\t\t\tint startX = std::max(area.p1.x, a_CBChunk.GetPosX() * cChunkDef::Width);\n\t\t\t\tint startZ = std::max(area.p1.z, a_CBChunk.GetPosZ() * cChunkDef::Width);\n\t\t\t\tint endX = std::min(area.p2.x, a_CBChunk.GetPosX() * cChunkDef::Width + cChunkDef::Width - 1);\n\t\t\t\tint endZ = std::min(area.p2.z, a_CBChunk.GetPosZ() * cChunkDef::Width + cChunkDef::Width - 1);\n\n\t\t\t\tfor (const auto & Item : m_Simulators)\n\t\t\t\t{\n\t\t\t\t\tconst auto Simulator = Item.first;\n\n\t\t\t\t\tfor (int y = area.p1.y; y <= area.p2.y; ++y)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int z = startZ; z <= endZ; ++z)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor (int x = startX; x <= endX; ++x)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst auto Position = cChunkDef::AbsoluteToRelative({ x, y, z });\n\t\t\t\t\t\t\t\tSimulator->WakeUp(a_CBChunk, Position, a_CBChunk.GetBlock(Position));\n\t\t\t\t\t\t\t}  // for x\n\t\t\t\t\t\t}  // for z\n\t\t\t\t\t}  // for y\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}  // for cx\n\t}  // for cz\n}\n\n\n\n\n\nvoid cSimulatorManager::RegisterSimulator(cSimulator * a_Simulator, int a_Rate)\n{\n\tm_Simulators.push_back(std::make_pair(a_Simulator, a_Rate));\n}\n"
  },
  {
    "path": "src/Simulator/SimulatorManager.h",
    "content": "\n// cSimulatorManager.h\n\n\n\n\n#pragma once\n\n\n\n\n#include \"Simulator.h\"\n\n\n\n\n\n// fwd: Chunk.h\nclass cChunk;\n\n// fwd: World.h\nclass cWorld;\n\n\n\n\n\nclass cSimulatorManager\n{\npublic:\n\n\tcSimulatorManager(cWorld & a_World);\n\t~cSimulatorManager();\n\n\t/** Called in each tick, a_Dt is the time passed since the last tick, in msec. */\n\tvoid Simulate(float a_Dt);\n\n\t/** Called in each tick for each chunk, a_Dt is the time passed since the last tick, in msec; direct access to chunk data available. */\n\tvoid SimulateChunk(std::chrono::milliseconds a_DT, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk);\n\n\t/* Called when a single block changes, wakes all simulators up for the block and its face-neighbors.\n\tThe simulator implementation may also decide to wake blocks farther away. */\n\tvoid WakeUp(cChunk & a_Chunk, Vector3i a_Position);\n\n\t/** Does the same processing as WakeUp, but for all blocks within the specified area.\n\tHas better performance than calling WakeUp for each block individually, due to neighbor-checking.\n\tAll chunks intersected by the area should be valid (outputs a warning if not).\n\tNote that, unlike WakeUp(), this call adds blocks not only face-neighboring, but also edge-neighboring and corner-neighboring the specified area. */\n\tvoid WakeUp(const cCuboid & a_Area);\n\n\tvoid RegisterSimulator(cSimulator * a_Simulator, int a_Rate);  // Takes ownership of the simulator object!\n\nprotected:\n\n\ttypedef std::vector <std::pair<cSimulator *, int> > cSimulators;\n\n\tcWorld & m_World;\n\tcSimulators m_Simulators;\n\tlong long   m_Ticks;\n};\n\n\n\n\n"
  },
  {
    "path": "src/Simulator/VanillaFluidSimulator.cpp",
    "content": "\n// VanillaFluidSimulator.cpp\n\n#include \"Globals.h\"\n\n#include \"VanillaFluidSimulator.h\"\n#include \"../BlockInfo.h\"\n#include \"../World.h\"\n#include \"../Chunk.h\"\n#include \"../BlockArea.h\"\n#include \"../Blocks/BlockHandler.h\"\n#include \"../BlockInServerPluginInterface.h\"\n\n\n\n\n\nstatic const int InfiniteCost = 100;\n\n\n\n\n\ncVanillaFluidSimulator::cVanillaFluidSimulator(\n\tcWorld & a_World,\n\tBLOCKTYPE a_Fluid,\n\tBLOCKTYPE a_StationaryFluid,\n\tNIBBLETYPE a_Falloff,\n\tint a_TickDelay,\n\tint a_NumNeighborsForSource\n):\n\tSuper(a_World, a_Fluid, a_StationaryFluid, a_Falloff, a_TickDelay, a_NumNeighborsForSource)\n{\n}\n\n\n\n\n\nvoid cVanillaFluidSimulator::SpreadXZ(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta)\n{\n\t// Calculate the distance to the nearest \"hole\" in each direction:\n\tint Cost[4];\n\tCost[0] = CalculateFlowCost(a_Chunk, a_RelX + 1, a_RelY, a_RelZ,     X_PLUS);\n\tCost[1] = CalculateFlowCost(a_Chunk, a_RelX - 1, a_RelY, a_RelZ,     X_MINUS);\n\tCost[2] = CalculateFlowCost(a_Chunk, a_RelX,     a_RelY, a_RelZ + 1, Z_PLUS);\n\tCost[3] = CalculateFlowCost(a_Chunk, a_RelX,     a_RelY, a_RelZ - 1, Z_MINUS);\n\n\t// Find the minimum distance:\n\tint MinCost = InfiniteCost;\n\tfor (unsigned int i = 0; i < ARRAYCOUNT(Cost); ++i)\n\t{\n\t\tif (Cost[i] < MinCost)\n\t\t{\n\t\t\tMinCost = Cost[i];\n\t\t}\n\t}\n\n\t// Spread in all directions where the distance matches the minimum:\n\tif (Cost[0] == MinCost)\n\t{\n\t\tSpreadToNeighbor(a_Chunk, a_RelX + 1, a_RelY, a_RelZ, a_NewMeta);\n\t}\n\tif (Cost[1] == MinCost)\n\t{\n\t\tSpreadToNeighbor(a_Chunk, a_RelX - 1, a_RelY, a_RelZ, a_NewMeta);\n\t}\n\tif (Cost[2] == MinCost)\n\t{\n\t\tSpreadToNeighbor(a_Chunk, a_RelX, a_RelY, a_RelZ + 1, a_NewMeta);\n\t}\n\tif (Cost[3] == MinCost)\n\t{\n\t\tSpreadToNeighbor(a_Chunk, a_RelX, a_RelY, a_RelZ - 1, a_NewMeta);\n\t}\n}\n\n\n\n\n\nint cVanillaFluidSimulator::CalculateFlowCost(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, Direction a_Dir, unsigned a_Iteration)\n{\n\tint Cost = InfiniteCost;\n\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\n\t// Check if block is passable\n\tif (!a_Chunk->UnboundedRelGetBlock(a_RelX, a_RelY, a_RelZ, BlockType, BlockMeta))\n\t{\n\t\treturn Cost;\n\t}\n\tif (\n\t\t!IsPassableForFluid(BlockType) ||                 // The block cannot be passed by the liquid ...\n\t\t(IsAllowedBlock(BlockType) && (BlockMeta == 0))  // ... or if it is liquid, it is a source block\n\t)\n\t{\n\t\treturn Cost;\n\t}\n\n\t// Check if block below is passable\n\tif ((a_RelY > 0) && !a_Chunk->UnboundedRelGetBlock(a_RelX, a_RelY - 1, a_RelZ, BlockType, BlockMeta))\n\t{\n\t\treturn Cost;\n\t}\n\tif (IsPassableForFluid(BlockType) || IsBlockLiquid(BlockType))\n\t{\n\t\t// Path found, exit\n\t\treturn static_cast<int>(a_Iteration);\n\t}\n\n\t// 5 blocks away, bail out\n\tif (a_Iteration > 3)\n\t{\n\t\treturn Cost;\n\t}\n\n\t// Recurse\n\tif (a_Dir != X_MINUS)\n\t{\n\t\tint NextCost = CalculateFlowCost(a_Chunk, a_RelX + 1, a_RelY, a_RelZ, X_PLUS, a_Iteration + 1);\n\t\tif (NextCost < Cost)\n\t\t{\n\t\t\tCost = NextCost;\n\t\t}\n\t}\n\tif (a_Dir != X_PLUS)\n\t{\n\t\tint NextCost = CalculateFlowCost(a_Chunk, a_RelX - 1, a_RelY, a_RelZ, X_MINUS, a_Iteration + 1);\n\t\tif (NextCost < Cost)\n\t\t{\n\t\t\tCost = NextCost;\n\t\t}\n\t}\n\tif (a_Dir != Z_MINUS)\n\t{\n\t\tint NextCost = CalculateFlowCost(a_Chunk, a_RelX, a_RelY, a_RelZ + 1, Z_PLUS, a_Iteration + 1);\n\t\tif (NextCost < Cost)\n\t\t{\n\t\t\tCost = NextCost;\n\t\t}\n\t}\n\tif (a_Dir != Z_PLUS)\n\t{\n\t\tint NextCost = CalculateFlowCost(a_Chunk, a_RelX, a_RelY, a_RelZ - 1, Z_MINUS, a_Iteration + 1);\n\t\tif (NextCost < Cost)\n\t\t{\n\t\t\tCost = NextCost;\n\t\t}\n\t}\n\n\treturn Cost;\n}\n\n\n\n\n"
  },
  {
    "path": "src/Simulator/VanillaFluidSimulator.h",
    "content": "\n// VanillaFluidSimulator.h\n\n\n\n\n\n#pragma once\n\n#include \"FloodyFluidSimulator.h\"\n\n\n\n\n\nclass cVanillaFluidSimulator:\n\tpublic cFloodyFluidSimulator\n{\n\tusing Super = cFloodyFluidSimulator;\n\npublic:\n\n\tcVanillaFluidSimulator(\n\t\tcWorld & a_World,\n\t\tBLOCKTYPE a_Fluid,\n\t\tBLOCKTYPE a_StationaryFluid,\n\t\tNIBBLETYPE a_Falloff,\n\t\tint a_TickDelay,\n\t\tint a_NumNeighborsForSource\n\t);\n\nprotected:\n\t// cFloodyFluidSimulator overrides:\n\tvirtual void SpreadXZ(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta) override;\n\n\t/** Recursively calculates the minimum number of blocks needed to descend a level. */\n\tint CalculateFlowCost(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, Direction a_Dir, unsigned a_Iteration = 0);\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/Simulator/VaporizeFluidSimulator.cpp",
    "content": "\n// VaporizeFluidSimulator.cpp\n\n// Implements the cVaporizeFluidSimulator class representing a fluid simulator that replaces all fluid blocks with air\n\n#include \"Globals.h\"\n#include \"VaporizeFluidSimulator.h\"\n#include \"BlockType.h\"\n#include \"../OpaqueWorld.h\"\n#include \"../Chunk.h\"\n#include \"../Blocks/BroadcastInterface.h\"\n\n\n\n\n\nvoid cVaporizeFluidSimulator::SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk)\n{\n\t// Nothing needed\n\n\tUNUSED(a_Dt);\n\tUNUSED(a_ChunkX);\n\tUNUSED(a_ChunkZ);\n\tUNUSED(a_Chunk);\n}\n\n\n\n\n\nvoid cVaporizeFluidSimulator::AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block)\n{\n\tif ((a_Block == m_FluidBlock) || (a_Block == m_StationaryFluidBlock))\n\t{\n\t\ta_Chunk.FastSetBlock(a_Position, E_BLOCK_AIR, 0);\n\t\tWorld::GetBroadcastInterface(m_World).BroadcastSoundEffect(\n\t\t\t\"block.fire.extinguish\",\n\t\t\tVector3d(a_Position),\n\t\t\t1.0f,\n\t\t\t0.6f\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "src/Simulator/VaporizeFluidSimulator.h",
    "content": "\n// VaporizeFluidSimulator.h\n\n// Declares the cVaporizeFluidSimulator class representing a fluid simulator that replaces all fluid blocks with air\n// Useful for water simulation in the Nether\n\n\n\n\n\n#pragma once\n\n#include \"FluidSimulator.h\"\n\n\n\n\n\nclass cVaporizeFluidSimulator:\n\tpublic cFluidSimulator\n{\n\tusing Super = cFluidSimulator;\n\npublic:\n\n\tusing Super::Super;\n\nprivate:\n\n\tvirtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override;\n\tvirtual void AddBlock(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_Block) override;\n\tvirtual cFluidSimulatorData * CreateChunkData(void) override { return nullptr; }\n} ;\n"
  },
  {
    "path": "src/SpawnPrepare.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"SpawnPrepare.h\"\n#include \"World.h\"\n\n\n\n\n\nclass cSpawnPrepareCallback :\n\tpublic cChunkCoordCallback\n{\npublic:\n\tcSpawnPrepareCallback(std::shared_ptr<cSpawnPrepare> a_SpawnPrepare) :\n\t\tm_SpawnPrepare(std::move(a_SpawnPrepare))\n\t{\n\t\tASSERT(m_SpawnPrepare != nullptr);\n\t}\nprotected:\n\n\tstd::shared_ptr<cSpawnPrepare> m_SpawnPrepare;\n\n\tvirtual void Call(cChunkCoords a_Coords, bool a_IsSuccess) override\n\t{\n\t\tm_SpawnPrepare->PreparedChunkCallback(a_Coords.m_ChunkX, a_Coords.m_ChunkZ);\n\t}\n};\n\n\n\n\n\ncSpawnPrepare::cSpawnPrepare(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance, int a_FirstIdx, sMakeSharedTag):\n\tm_World(a_World),\n\tm_SpawnChunkX(a_SpawnChunkX),\n\tm_SpawnChunkZ(a_SpawnChunkZ),\n\tm_PrepareDistance(a_PrepareDistance),\n\tm_NextIdx(a_FirstIdx),\n\tm_MaxIdx(a_PrepareDistance * a_PrepareDistance),\n\tm_NumPrepared(0),\n\tm_LastReportTime(std::chrono::steady_clock::now()),\n\tm_LastReportChunkCount(0)\n{\n}\n\n\n\n\n\nvoid cSpawnPrepare::PrepareChunks(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance)\n{\n\n\t// Queue the initial chunks:\n\tint MaxIdx = a_PrepareDistance * a_PrepareDistance;\n\tint maxQueue = std::min(MaxIdx - 1, 100);  // Number of chunks to queue at once\n\tauto prep = std::make_shared<cSpawnPrepare>(a_World, a_SpawnChunkX, a_SpawnChunkZ, a_PrepareDistance, maxQueue, sMakeSharedTag{});\n\tfor (int i = 0; i < maxQueue; i++)\n\t{\n\t\tint chunkX, chunkZ;\n\t\tprep->DecodeChunkCoords(i, chunkX, chunkZ);\n\t\ta_World.PrepareChunk(chunkX, chunkZ, std::make_unique<cSpawnPrepareCallback>(prep));\n\t}  // for i\n\n\t// Wait for the lighting thread to prepare everything. Event is set in the Call() callback:\n\tif (MaxIdx > 0)\n\t{\n\t\tprep->m_EvtFinished.Wait();\n\t}\n}\n\n\n\n\n\nvoid cSpawnPrepare::DecodeChunkCoords(int a_Idx, int & a_ChunkX, int & a_ChunkZ)\n{\n\t// A zigzag pattern from the top to bottom, each row alternating between forward-x and backward-x:\n\tint z = a_Idx / m_PrepareDistance;\n\tint x = a_Idx % m_PrepareDistance;\n\tif ((z & 1) == 0)\n\t{\n\t\t// Reverse every second row:\n\t\tx = m_PrepareDistance - 1 - x;\n\t}\n\ta_ChunkZ = m_SpawnChunkZ + z - m_PrepareDistance / 2;\n\ta_ChunkX = m_SpawnChunkX + x - m_PrepareDistance / 2;\n}\n\n\n\n\n\nvoid cSpawnPrepare::PreparedChunkCallback(int a_ChunkX, int a_ChunkZ)\n{\n\t// Check if this was the last chunk:\n\tm_NumPrepared += 1;\n\tif (m_NumPrepared >= m_MaxIdx)\n\t{\n\t\tm_EvtFinished.Set();\n\t\t// Must return here, because \"this\" may have gotten deleted by the previous line\n\t\treturn;\n\t}\n\n\t// Queue another chunk, if appropriate:\n\tif (m_NextIdx < m_MaxIdx)\n\t{\n\t\tint chunkX, chunkZ;\n\t\tDecodeChunkCoords(m_NextIdx, chunkX, chunkZ);\n\t\tm_World.GetLightingThread().QueueChunk(chunkX, chunkZ, std::make_unique<cSpawnPrepareCallback>(shared_from_this()));\n\t\tm_NextIdx += 1;\n\t}\n\n\t// Report progress every 1 second:\n\tauto Now = std::chrono::steady_clock::now();\n\tif (Now - m_LastReportTime > std::chrono::seconds(1))\n\t{\n\t\tfloat PercentDone = static_cast<float>(m_NumPrepared * 100) / m_MaxIdx;\n\t\tfloat ChunkSpeed = static_cast<float>((m_NumPrepared - m_LastReportChunkCount) * 1000) / std::chrono::duration_cast<std::chrono::milliseconds>(Now - m_LastReportTime).count();\n\t\tLOG(\"Preparing spawn (%s): %.02f%% (%d/%d; %.02f chunks / sec)\",\n\t\t\tm_World.GetName().c_str(), PercentDone, m_NumPrepared.load(std::memory_order_seq_cst), m_MaxIdx, ChunkSpeed\n\t\t);\n\t\tm_LastReportTime = Now;\n\t\tm_LastReportChunkCount = m_NumPrepared;\n\t}\n}\n\n"
  },
  {
    "path": "src/SpawnPrepare.h",
    "content": "\n#pragma once\n\n#include \"ChunkDef.h\"\n\nclass cWorld;\n\n\n\n/** Generates and lights the spawn area of the world. Runs as a separate thread. */\nclass cSpawnPrepare:\n\tpublic std::enable_shared_from_this<cSpawnPrepare>\n{\n\t/** Private tag allows public constructors that can only be used with private access. */\n\tstruct sMakeSharedTag {};\npublic:\n\n\tcSpawnPrepare(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance, int a_FirstIdx, sMakeSharedTag);\n\n\tstatic void PrepareChunks(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance);\n\n\tstatic void PrepareChunks(cWorld & a_World, cChunkCoords a_SpawnChunk, int a_PrepareDistance)\n\t{\n\t\tPrepareChunks(a_World, a_SpawnChunk.m_ChunkX, a_SpawnChunk.m_ChunkZ, a_PrepareDistance);\n\t}\n\nprotected:\n\tcWorld & m_World;\n\tint m_SpawnChunkX;\n\tint m_SpawnChunkZ;\n\tint m_PrepareDistance;\n\n\t/** The index of the next chunk to be queued in the lighting thread. */\n\tint m_NextIdx;\n\n\t/** The maximum index of the prepared chunks. Queueing stops when m_NextIdx reaches this number. */\n\tint m_MaxIdx;\n\n\t/** Total number of chunks already finished preparing. Preparation finishes when this number reaches m_MaxIdx. */\n\tstd::atomic<int> m_NumPrepared;\n\n\t/** Event used to signal that the preparation is finished. */\n\tcEvent m_EvtFinished;\n\n\t/** The timestamp of the last progress report emitted. */\n\tstd::chrono::steady_clock::time_point m_LastReportTime;\n\n\t/** Number of chunks prepared when the last progress report was emitted. */\n\tint m_LastReportChunkCount;\n\n\tvoid PreparedChunkCallback(int a_ChunkX, int a_ChunkZ);\n\n\t/** Decodes the index into chunk coords. Provides the specific chunk ordering. */\n\tvoid DecodeChunkCoords(int a_Idx, int & a_ChunkX, int & a_ChunkZ);\n\n\tfriend class cSpawnPrepareCallback;\n\n};\n\n"
  },
  {
    "path": "src/StatisticsManager.cpp",
    "content": "\n// Statistics.cpp\n\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"StatisticsManager.h\"\n\n\n\n\n\nbool StatisticsManager::SatisfiesPrerequisite(const CustomStatistic a_Stat) const\n{\n\tswitch (a_Stat)\n\t{\n\t\tcase CustomStatistic::AchOpenInventory:      return true;\n\t\tcase CustomStatistic::AchMineWood:           return IsStatisticPresent(CustomStatistic::AchOpenInventory);\n\t\tcase CustomStatistic::AchBuildWorkBench:     return IsStatisticPresent(CustomStatistic::AchMineWood);\n\t\tcase CustomStatistic::AchBuildHoe:           return IsStatisticPresent(CustomStatistic::AchBuildWorkBench);\n\t\tcase CustomStatistic::AchBakeCake:           return IsStatisticPresent(CustomStatistic::AchBuildHoe);\n\t\tcase CustomStatistic::AchMakeBread:          return IsStatisticPresent(CustomStatistic::AchBuildHoe);\n\t\tcase CustomStatistic::AchBuildSword:         return IsStatisticPresent(CustomStatistic::AchBuildWorkBench);\n\t\tcase CustomStatistic::AchKillCow:            return IsStatisticPresent(CustomStatistic::AchBuildSword);\n\t\tcase CustomStatistic::AchFlyPig:             return IsStatisticPresent(CustomStatistic::AchKillCow);\n\t\tcase CustomStatistic::AchBreedCow:           return IsStatisticPresent(CustomStatistic::AchKillCow);\n\t\tcase CustomStatistic::AchKillEnemy:          return IsStatisticPresent(CustomStatistic::AchBuildSword);\n\t\tcase CustomStatistic::AchSnipeSkeleton:      return IsStatisticPresent(CustomStatistic::AchKillEnemy);\n\t\tcase CustomStatistic::AchBuildPickaxe:       return IsStatisticPresent(CustomStatistic::AchBuildWorkBench);\n\t\tcase CustomStatistic::AchBuildBetterPickaxe: return IsStatisticPresent(CustomStatistic::AchBuildPickaxe);\n\t\tcase CustomStatistic::AchBuildFurnace:       return IsStatisticPresent(CustomStatistic::AchBuildWorkBench);\n\t\tcase CustomStatistic::AchCookFish:           return IsStatisticPresent(CustomStatistic::AchBuildFurnace);\n\t\tcase CustomStatistic::AchAcquireIron:        return IsStatisticPresent(CustomStatistic::AchBuildFurnace);\n\t\tcase CustomStatistic::AchOnARail:            return IsStatisticPresent(CustomStatistic::AchAcquireIron);\n\t\tcase CustomStatistic::AchDiamonds:           return IsStatisticPresent(CustomStatistic::AchAcquireIron);\n\t\tcase CustomStatistic::AchPortal:             return IsStatisticPresent(CustomStatistic::AchDiamonds);\n\t\tcase CustomStatistic::AchGhast:              return IsStatisticPresent(CustomStatistic::AchPortal);\n\t\tcase CustomStatistic::AchBlazeRod:           return IsStatisticPresent(CustomStatistic::AchPortal);\n\t\tcase CustomStatistic::AchPotion:             return IsStatisticPresent(CustomStatistic::AchBlazeRod);\n\t\tcase CustomStatistic::AchTheEnd:             return IsStatisticPresent(CustomStatistic::AchBlazeRod);\n\t\tcase CustomStatistic::AchTheEnd2:            return IsStatisticPresent(CustomStatistic::AchTheEnd);\n\t\tcase CustomStatistic::AchEnchantments:       return IsStatisticPresent(CustomStatistic::AchDiamonds);\n\t\tcase CustomStatistic::AchOverkill:           return IsStatisticPresent(CustomStatistic::AchEnchantments);\n\t\tcase CustomStatistic::AchBookcase:           return IsStatisticPresent(CustomStatistic::AchEnchantments);\n\t\tcase CustomStatistic::AchExploreAllBiomes:   return IsStatisticPresent(CustomStatistic::AchTheEnd);\n\t\tcase CustomStatistic::AchSpawnWither:        return IsStatisticPresent(CustomStatistic::AchTheEnd2);\n\t\tcase CustomStatistic::AchKillWither:         return IsStatisticPresent(CustomStatistic::AchSpawnWither);\n\t\tcase CustomStatistic::AchFullBeacon:         return IsStatisticPresent(CustomStatistic::AchKillWither);\n\t\tcase CustomStatistic::AchDiamondsToYou:      return IsStatisticPresent(CustomStatistic::AchDiamonds);\n\t\tdefault: UNREACHABLE(\"Unsupported achievement type\");\n\t}\n}\n\n\n\n\n\nbool StatisticsManager::IsStatisticPresent(const CustomStatistic a_Stat) const\n{\n\tconst auto Result = Custom.find(a_Stat);\n\tif (Result != Custom.end())\n\t{\n\t\treturn Result->second > 0;\n\t}\n\treturn false;\n}\n"
  },
  {
    "path": "src/StatisticsManager.h",
    "content": "\n// Statistics.h\n\n/* Hello fellow developer !\nIn case you are trying to add new statistics to Cuberite you need to do a few things:\n---------------------------------------------------------------------------\n1. add a new entry to the enum class Statistic in Registries\\Statistics.h file\n2. add this to serialization functions in WorldStorage\\NamespaceSerializer.cpp\n\tThe String in the above is used for saving on disk!\n\tso use the same string!\n\nIn case you want to add a mapping of network IDs to the used stats\nyou will find a lua script in ../Tools/BlockTypePaletteGenerator/ExportStatMapping.lua\nit will provide you with information how to use it. you need a registries.json\nexported from the server https://wiki.vg/Data_Generators\n\n\t\tGreetings 12xx12 */\n\n\n\n\n\n#pragma once\n\n#include \"Registries/CustomStatistics.h\"\n\n\n\n\n\n/** Class that manages the statistics and achievements of a single player. */\nstruct StatisticsManager\n{\n\ttypedef unsigned StatValue;\n\n\t// TODO: Block tallies, entities killed, all the others\n\n\tstd::unordered_map<CustomStatistic, StatValue> Custom;\n\n\t/** Returns whether the prerequisite for awarding an achievement are satisfied. */\n\tbool SatisfiesPrerequisite(CustomStatistic a_Stat) const;\n\nprivate:\n\n\t/** Returns if a statistic is both present and has nonzero value. */\n\tbool IsStatisticPresent(CustomStatistic a_Stat) const;\n};\n"
  },
  {
    "path": "src/StringCompression.cpp",
    "content": "\n// StringCompression.cpp\n\n// Implements the wrapping functions for compression and decompression\n\n#include \"Globals.h\"\n#include \"ByteBuffer.h\"\n#include \"StringCompression.h\"\n\n#include <libdeflate.h>\n\n\n\n\n\nstd::string_view Compression::Result::GetStringView() const\n{\n\tconst auto View = GetView();\n\treturn { reinterpret_cast<const char *>(View.data()), View.size() };\n}\n\n\n\n\n\nContiguousByteBufferView Compression::Result::GetView() const\n{\n\t// Get a generic std::byte * to what the variant is currently storing:\n\treturn\n\t{\n\t\tstd::visit([](const auto & Buffer) -> const std::byte *\n\t\t{\n\t\t\tusing Variant = std::decay_t<decltype(Buffer)>;\n\n\t\t\tif constexpr (std::is_same_v<Variant, Compression::Result::Static>)\n\t\t\t{\n\t\t\t\treturn Buffer.data();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn Buffer.get();\n\t\t\t}\n\t\t}, Storage), Size\n\t};\n}\n\n\n\n\n\nCompression::Compressor::Compressor(int CompressionFactor)\n{\n\tm_Handle = libdeflate_alloc_compressor(CompressionFactor);\n\n\tif (m_Handle == nullptr)\n\t{\n\t\tthrow std::bad_alloc();\n\t}\n}\n\n\n\n\n\nCompression::Compressor::~Compressor()\n{\n\tlibdeflate_free_compressor(m_Handle);\n}\n\n\n\n\n\ntemplate <auto Algorithm>\nCompression::Result Compression::Compressor::Compress(const void * const Input, const size_t Size)\n{\n\t// First see if the stack buffer has enough space:\n\t{\n\t\tResult::Static Buffer;\n\t\tconst auto BytesWrittenOut = Algorithm(m_Handle, Input, Size, Buffer.data(), Buffer.size());\n\n\t\tif (BytesWrittenOut != 0)\n\t\t{\n\t\t\treturn { Buffer, BytesWrittenOut };\n\t\t}\n\t}\n\n\t// No it doesn't. Allocate space on the heap to write the compression result, increasing in powers of 2.\n\t// This will either succeed, or except with bad_alloc.\n\n\tauto DynamicCapacity = Result::StaticCapacity * 2;\n\twhile (true)\n\t{\n\t\tauto Dynamic = cpp20::make_unique_for_overwrite<Result::Dynamic::element_type[]>(DynamicCapacity);\n\t\tconst auto BytesWrittenOut = Algorithm(m_Handle, Input, Size, Dynamic.get(), DynamicCapacity);\n\n\t\tif (BytesWrittenOut != 0)\n\t\t{\n\t\t\treturn { std::move(Dynamic), BytesWrittenOut };\n\t\t}\n\n\t\tDynamicCapacity *= 2;\n\t}\n}\n\n\n\n\n\nCompression::Result Compression::Compressor::CompressGZip(const ContiguousByteBufferView Input)\n{\n\treturn Compress<&libdeflate_gzip_compress>(Input.data(), Input.size());\n}\n\n\n\n\n\nCompression::Result Compression::Compressor::CompressZLib(const ContiguousByteBufferView Input)\n{\n\treturn Compress<&libdeflate_zlib_compress>(Input.data(), Input.size());\n}\n\n\n\n\n\nCompression::Result Compression::Compressor::CompressZLib(const void * const Input, const size_t Size)\n{\n\treturn Compress<&libdeflate_zlib_compress>(Input, Size);\n}\n\n\n\n\n\nCompression::Extractor::Extractor()\n{\n\tm_Handle = libdeflate_alloc_decompressor();\n\n\tif (m_Handle == nullptr)\n\t{\n\t\tthrow std::bad_alloc();\n\t}\n}\n\n\n\n\n\nCompression::Extractor::~Extractor()\n{\n\tlibdeflate_free_decompressor(m_Handle);\n}\n\n\n\n\n\nCompression::Result Compression::Extractor::ExtractGZip(ContiguousByteBufferView Input)\n{\n\treturn Extract<&libdeflate_gzip_decompress>(Input);\n}\n\n\n\n\n\nCompression::Result Compression::Extractor::ExtractZLib(ContiguousByteBufferView Input)\n{\n\treturn Extract<&libdeflate_zlib_decompress>(Input);\n}\n\n\n\n\n\nCompression::Result Compression::Extractor::ExtractZLib(ContiguousByteBufferView Input, size_t UncompressedSize)\n{\n\treturn Extract<&libdeflate_zlib_decompress>(Input, UncompressedSize);\n}\n\n\n\n\n\ntemplate <auto Algorithm>\nCompression::Result Compression::Extractor::Extract(const ContiguousByteBufferView Input)\n{\n\t// First see if the stack buffer has enough space:\n\t{\n\t\tResult::Static Buffer;\n\t\tsize_t BytesWrittenOut;\n\n\t\tswitch (Algorithm(m_Handle, Input.data(), Input.size(), Buffer.data(), Buffer.size(), &BytesWrittenOut))\n\t\t{\n\t\t\tcase LIBDEFLATE_SUCCESS: return { Buffer, BytesWrittenOut };\n\t\t\tcase LIBDEFLATE_INSUFFICIENT_SPACE: break;\n\t\t\tdefault: throw std::runtime_error(\"Data extraction failed.\");\n\t\t}\n\t}\n\n\t// No it doesn't. Allocate space on the heap to write the compression result, increasing in powers of 2.\n\n\tauto DynamicCapacity = Result::StaticCapacity * 2;\n\twhile (true)\n\t{\n\t\tsize_t BytesWrittenOut;\n\t\tauto Dynamic = cpp20::make_unique_for_overwrite<Result::Dynamic::element_type[]>(DynamicCapacity);\n\n\t\tswitch (Algorithm(m_Handle, Input.data(), Input.size(), Dynamic.get(), DynamicCapacity, &BytesWrittenOut))\n\t\t{\n\t\t\tcase libdeflate_result::LIBDEFLATE_SUCCESS: return { std::move(Dynamic), BytesWrittenOut };\n\t\t\tcase libdeflate_result::LIBDEFLATE_INSUFFICIENT_SPACE:\n\t\t\t{\n\t\t\t\tDynamicCapacity *= 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: throw std::runtime_error(\"Data extraction failed.\");\n\t\t}\n\t}\n}\n\n\n\n\n\ntemplate <auto Algorithm>\nCompression::Result Compression::Extractor::Extract(const ContiguousByteBufferView Input, size_t UncompressedSize)\n{\n\t// Here we have the expected size after extraction, so directly use a suitable buffer size:\n\tif (UncompressedSize <= Result::StaticCapacity)\n\t{\n\t\tif (\n\t\t\tResult::Static Buffer;\n\t\t\tAlgorithm(m_Handle, Input.data(), Input.size(), Buffer.data(), UncompressedSize, nullptr) == libdeflate_result::LIBDEFLATE_SUCCESS\n\t\t)\n\t\t{\n\t\t\treturn { Buffer, UncompressedSize };\n\t\t}\n\t}\n\telse if (\n\t\tauto Dynamic = cpp20::make_unique_for_overwrite<Result::Dynamic::element_type[]>(UncompressedSize);\n\t\tAlgorithm(m_Handle, Input.data(), Input.size(), Dynamic.get(), UncompressedSize, nullptr) == libdeflate_result::LIBDEFLATE_SUCCESS\n\t)\n\t{\n\t\treturn { std::move(Dynamic), UncompressedSize };\n\t}\n\n\tthrow std::runtime_error(\"Data extraction failed.\");\n}\n"
  },
  {
    "path": "src/StringCompression.h",
    "content": "\n// StringCompression.h\n\n// Interfaces to the wrapping functions for compression and decompression\n\n#pragma once\n\n\n\n\n\nstruct libdeflate_compressor;\nstruct libdeflate_decompressor;\n\n\n\n\n\nnamespace Compression\n{\n\t/** Contains the result of a compression or extraction operation. */\n\tstruct Result\n\t{\n\t\tusing Static = std::array<std::byte, 128 KiB>;\n\t\tusing Dynamic = std::unique_ptr<std::byte[]>;\n\n\t\tstatic constexpr size_t StaticCapacity = sizeof(Compression::Result::Static) / sizeof(Compression::Result::Static::value_type);\n\n\t\t/** Returns a view (of type char) of the internal store. */\n\t\tstd::string_view GetStringView() const;\n\n\t\t/** Returns a view (of type std::byte) of the internal store. */\n\t\tContiguousByteBufferView GetView() const;\n\n\t\t/** A store allocated on either the stack or heap. */\n\t\tstd::variant<Static, Dynamic> Storage;\n\n\t\t/** The length of valid data in the store. */\n\t\tsize_t Size;\n\t};\n\n\t/** Contains routines for data compression. */\n\tclass Compressor\n\t{\n\tpublic:\n\n\t\t/** Creates a new compressor instance with a compression factor [0-12]. */\n\t\tCompressor(int CompressionFactor = 6);\n\t\t~Compressor();\n\n\t\tResult CompressGZip(ContiguousByteBufferView Input);\n\t\tResult CompressZLib(ContiguousByteBufferView Input);\n\t\tResult CompressZLib(const void * Input, size_t Size);\n\n\tprivate:\n\n\t\ttemplate <auto Algorithm>\n\t\tResult Compress(const void * Input, size_t Size);\n\n\t\tlibdeflate_compressor * m_Handle;\n\t};\n\n\t/** Contains routines for data extraction. */\n\tclass Extractor\n\t{\n\tpublic:\n\n\t\t/** Creates a new extractor instance. */\n\t\tExtractor();\n\t\t~Extractor();\n\n\t\tResult ExtractGZip(ContiguousByteBufferView Input);\n\t\tResult ExtractZLib(ContiguousByteBufferView Input);\n\t\tResult ExtractZLib(ContiguousByteBufferView Input, size_t UncompressedSize);\n\n\tprivate:\n\n\t\ttemplate <auto Algorithm> Result Extract(ContiguousByteBufferView Input);\n\t\ttemplate <auto Algorithm> Result Extract(ContiguousByteBufferView Input, size_t UncompressedSize);\n\n\t\tlibdeflate_decompressor * m_Handle;\n\t};\n}\n"
  },
  {
    "path": "src/StringUtils.cpp",
    "content": "\n// StringUtils.cpp\n\n// Implements the various string helper functions:\n\n#include \"Globals.h\"\n\n#include \"Endianness.h\"\n#include \"fmt/printf.h\"\n\n\n\n\n\n/** Returns the value of the single hex digit.\nReturns 0xff on failure. */\nstatic unsigned char HexToDec(char a_HexChar)\n{\n\tswitch (a_HexChar)\n\t{\n\t\tcase '0': return 0;\n\t\tcase '1': return 1;\n\t\tcase '2': return 2;\n\t\tcase '3': return 3;\n\t\tcase '4': return 4;\n\t\tcase '5': return 5;\n\t\tcase '6': return 6;\n\t\tcase '7': return 7;\n\t\tcase '8': return 8;\n\t\tcase '9': return 9;\n\t\tcase 'a': return 10;\n\t\tcase 'b': return 11;\n\t\tcase 'c': return 12;\n\t\tcase 'd': return 13;\n\t\tcase 'e': return 14;\n\t\tcase 'f': return 15;\n\t\tcase 'A': return 10;\n\t\tcase 'B': return 11;\n\t\tcase 'C': return 12;\n\t\tcase 'D': return 13;\n\t\tcase 'E': return 14;\n\t\tcase 'F': return 15;\n\t}\n\treturn 0xff;\n}\n\n\n\n\n\nAStringVector StringSplit(const AString & str, const AString & delim)\n{\n\tAStringVector results;\n\tsize_t cutAt = 0;\n\tsize_t Prev = 0;\n\twhile ((cutAt = str.find_first_of(delim, Prev)) != str.npos)\n\t{\n\t\tresults.push_back(str.substr(Prev, cutAt - Prev));\n\t\tPrev = cutAt + 1;\n\t}\n\tif (Prev < str.length())\n\t{\n\t\tresults.push_back(str.substr(Prev));\n\t}\n\treturn results;\n}\n\n\n\n\n\nAStringVector StringSplitWithQuotes(const AString & str, const AString & delim)\n{\n\tAStringVector results;\n\n\tsize_t cutAt = 0;\n\tsize_t Prev = 0;\n\tsize_t cutAtQuote = 0;\n\n\twhile ((cutAt = str.find_first_of(delim, Prev)) != str.npos)\n\t{\n\t\tif (cutAt == Prev)\n\t\t{\n\t\t\t// Empty string due to multiple whitespace / whitespace at the beginning of the input\n\t\t\t// Just skip it\n\t\t\tPrev = Prev + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tAString current = str.substr(Prev, cutAt - Prev);\n\t\tif ((current.front() == '\"') || (current.front() == '\\''))\n\t\t{\n\t\t\tPrev += 1;\n\t\t\tcutAtQuote = str.find_first_of(current.front(), Prev);\n\t\t\tif (cutAtQuote != str.npos)\n\t\t\t{\n\t\t\t\tcurrent = str.substr(Prev, cutAtQuote - Prev);\n\t\t\t\tcutAt = cutAtQuote + 1;\n\t\t\t}\n\t\t}\n\n\t\tresults.push_back(std::move(current));\n\t\tPrev = cutAt + 1;\n\t}\n\n\tif (Prev < str.length())\n\t{\n\t\tAString current = str.substr(Prev);\n\n\t\t// If the remant is wrapped in matching quotes, remove them:\n\t\tif (\n\t\t\t(current.length() >= 2) &&\n\t\t\t((current.front() == '\"') || (current.front() == '\\'')) &&\n\t\t\t(current.front() == current.back())\n\t\t)\n\t\t{\n\t\t\tcurrent = current.substr(1, current.length() - 2);\n\t\t}\n\n\t\tresults.push_back(current);\n\t}\n\n\treturn results;\n}\n\n\n\n\n\nAString StringJoin(const AStringVector & a_Strings, const AString & a_Delimeter)\n{\n\tif (a_Strings.empty())\n\t{\n\t\treturn {};\n\t}\n\n\t// Do a dry run to gather the size\n\tconst auto DelimSize = a_Delimeter.size();\n\tsize_t ResultSize = a_Strings[0].size();\n\tstd::for_each(a_Strings.begin() + 1, a_Strings.end(),\n\t\t[&](const AString & a_String)\n\t\t{\n\t\t\tResultSize += DelimSize;\n\t\t\tResultSize += a_String.size();\n\t\t}\n\t);\n\n\t// Now do the actual join\n\tAString Result;\n\tResult.reserve(ResultSize);\n\tResult.append(a_Strings[0]);\n\tstd::for_each(a_Strings.begin() + 1, a_Strings.end(),\n\t\t[&](const AString & a_String)\n\t\t{\n\t\t\tResult += a_Delimeter;\n\t\t\tResult += a_String;\n\t\t}\n\t);\n\treturn Result;\n}\n\n\n\n\n\nAStringVector StringSplitAndTrim(const AString & str, const AString & delim)\n{\n\tAStringVector results;\n\tsize_t cutAt = 0;\n\tsize_t Prev = 0;\n\twhile ((cutAt = str.find_first_of(delim, Prev)) != str.npos)\n\t{\n\t\tresults.push_back(TrimString(str.substr(Prev, cutAt - Prev)));\n\t\tPrev = cutAt + 1;\n\t}\n\tif (Prev < str.length())\n\t{\n\t\tresults.push_back(TrimString(str.substr(Prev)));\n\t}\n\treturn results;\n}\n\n\n\n\n\nAString TrimString(const AString & str)\n{\n\tsize_t len = str.length();\n\tsize_t start = 0;\n\twhile (start < len)\n\t{\n\t\tif (static_cast<unsigned char>(str[start]) > 32)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\t++start;\n\t}\n\tif (start == len)\n\t{\n\t\treturn \"\";\n\t}\n\n\tsize_t end = len;\n\twhile (end >= start)\n\t{\n\t\tif (static_cast<unsigned char>(str[end]) > 32)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\t--end;\n\t}\n\n\treturn str.substr(start, end - start + 1);\n}\n\n\n\n\n\nAString & InPlaceLowercase(AString & s)\n{\n\tstd::transform(s.begin(), s.end(), s.begin(), ::tolower);\n\treturn s;\n}\n\n\n\n\n\nAString & InPlaceUppercase(AString & s)\n{\n\tstd::transform(s.begin(), s.end(), s.begin(), ::toupper);\n\treturn s;\n}\n\n\n\n\n\nAString StrToLower(const AString & s)\n{\n\tAString res;\n\tres.resize(s.size());\n\tstd::transform(s.begin(), s.end(), res.begin(), ::tolower);\n\treturn res;\n}\n\n\n\n\n\nAString StrToUpper(const AString & s)\n{\n\tAString res;\n\tres.resize(s.size());\n\tstd::transform(s.begin(), s.end(), res.begin(), ::toupper);\n\treturn res;\n}\n\n\n\n\n\nint NoCaseCompare(const AString & s1, const AString & s2)\n{\n\t#ifdef _MSC_VER\n\t\treturn _stricmp(s1.c_str(), s2.c_str());\n\t#else\n\t\treturn strcasecmp(s1.c_str(), s2.c_str());\n\t#endif  // else _MSC_VER\n}\n\n\n\n\n\nsize_t RateCompareString(const AString & s1, const AString & s2)\n{\n\tsize_t MatchedLetters = 0;\n\tsize_t s1Length = s1.length();\n\n\tif (s1Length > s2.length())\n\t{\n\t\t// Definitely not a match\n\t\treturn 0;\n\t}\n\n\tfor (size_t i = 0; i < s1Length; i++)\n\t{\n\t\tchar c1 = static_cast<char>(toupper(s1[i]));\n\t\tchar c2 = static_cast<char>(toupper(s2[i]));\n\t\tif (c1 == c2)\n\t\t{\n\t\t\t++MatchedLetters;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn MatchedLetters;\n}\n\n\n\n\n\nvoid ReplaceString(AString & iHayStack, const AString & iNeedle, const AString & iReplaceWith)\n{\n\t// find always returns the current position for an empty needle; prevent endless loop\n\tif (iNeedle.empty())\n\t{\n\t\treturn;\n\t}\n\n\tsize_t pos1 = iHayStack.find(iNeedle);\n\twhile (pos1 != AString::npos)\n\t{\n\t\tiHayStack.replace( pos1, iNeedle.size(), iReplaceWith);\n\t\tpos1 = iHayStack.find(iNeedle, pos1 + iReplaceWith.size());\n\t}\n}\n\n\n\n\n\nvoid ReplaceURL(AString & iHayStack, const AString & iNeedle, const AString & iReplaceWith)\n{\n\tauto ReplaceWith = URLEncode(iReplaceWith);\n\tReplaceString(iHayStack, iNeedle, ReplaceWith);\n}\n\n\n\n\n\nAString & RawBEUTF16ToUTF8(const char * a_RawData, size_t a_NumShorts, AString & a_UTF8)\n{\n\ta_UTF8.clear();\n\ta_UTF8.reserve(3 * a_NumShorts / 2);  // a quick guess of the resulting size\n\tfor (size_t i = 0; i < a_NumShorts; i++)\n\t{\n\t\tauto UTF16 = NetworkBufToHost<UInt16>(reinterpret_cast<const std::byte *>(&a_RawData[i * 2]));\n\t\ta_UTF8.append(UnicodeCharToUtf8(UTF16));\n\t}\n\treturn a_UTF8;\n}\n\n\n\n\n\nAString UnicodeCharToUtf8(unsigned a_UnicodeChar)\n{\n\tif (a_UnicodeChar < 0x80)\n\t{\n\t\treturn AString{static_cast<char>(a_UnicodeChar)};\n\t}\n\telse if (a_UnicodeChar < 0x800)\n\t{\n\t\treturn AString\n\t\t{\n\t\t\tstatic_cast<char>(192 + a_UnicodeChar / 64),\n\t\t\tstatic_cast<char>(128 + a_UnicodeChar % 64),\n\t\t};\n\t}\n\telse if (a_UnicodeChar - 0xd800 < 0x800)\n\t{\n\t\t// Error\n\t\treturn AString();\n\t}\n\telse if (a_UnicodeChar < 0x10000)\n\t{\n\t\treturn AString\n\t\t{\n\t\t\tstatic_cast<char>(224 + a_UnicodeChar / 4096),\n\t\t\tstatic_cast<char>(128 + (a_UnicodeChar / 64) % 64),\n\t\t\tstatic_cast<char>(128 + a_UnicodeChar % 64)\n\t\t};\n\t}\n\telse if (a_UnicodeChar < 0x110000)\n\t{\n\t\treturn AString\n\t\t{\n\t\t\tstatic_cast<char>(240 + a_UnicodeChar / 262144),\n\t\t\tstatic_cast<char>(128 + (a_UnicodeChar / 4096) % 64),\n\t\t\tstatic_cast<char>(128 + (a_UnicodeChar / 64) % 64),\n\t\t\tstatic_cast<char>(128 + a_UnicodeChar % 64),\n\t\t};\n\t}\n\telse\n\t{\n\t\t// Error\n\t\treturn AString();\n\t}\n}\n\n\n\n\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wimplicit-fallthrough\"\n#endif\n// UTF-8 conversion code adapted from:\n//  https://stackoverflow.com/questions/2867123/convert-utf-16-to-utf-8-under-windows-and-linux-in-c\n\n////////////////////////////////////////////////////////////////////////////////\n// Begin of Unicode, Inc.'s code / information\n////////////////////////////////////////////////////////////////////////////////\n\n/*\nNotice from the original file:\n* Copyright 2001-2004 Unicode, Inc.\n*\n* Disclaimer\n*\n* This source code is provided as is by Unicode, Inc. No claims are\n* made as to fitness for any particular purpose. No warranties of any\n* kind are expressed or implied. The recipient agrees to determine\n* applicability of information provided. If this file has been\n* purchased on magnetic or optical media from Unicode, Inc., the\n* sole remedy for any claim will be exchange of defective media\n* within 90 days of receipt.\n*\n* Limitations on Rights to Redistribute This Code\n*\n* Unicode, Inc. hereby grants the right to freely use the information\n* supplied in this file in the creation of products supporting the\n* Unicode Standard, and to make copies of this file in any form\n* for internal or external distribution as long as this notice\n* remains attached.\n*/\n\n#define UNI_MAX_BMP         0x0000FFFF\n#define UNI_MAX_UTF16       0x0010FFFF\n#define UNI_SUR_HIGH_START  0xD800\n#define UNI_SUR_LOW_START   0xDC00\n#define UNI_SUR_LOW_END     0xDFFF\n\n\n\n\n\nstatic const Byte trailingBytesForUTF8[256] =\n{\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n\t2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5\n};\n\n\n\n\n\nstatic const unsigned int offsetsFromUTF8[6] =\n{\n\t0x00000000UL, 0x00003080UL, 0x000E2080UL,\n\t0x03C82080UL, 0xFA082080UL, 0x82082080UL\n};\n\n\n\n\n\nstatic bool isLegalUTF8(const unsigned char * source, int length)\n{\n\tunsigned char a;\n\tconst unsigned char * srcptr = source + length;\n\tswitch (length)\n\t{\n\t\tdefault: return false;\n\t\t// Everything else falls through when \"true\"...\n\t\tcase 4: if (((a = (*--srcptr)) < 0x80) || (a > 0xbf)) return false;\n\t\tcase 3: if (((a = (*--srcptr)) < 0x80) || (a > 0xbf)) return false;\n\t\tcase 2:\n\t\t{\n\t\t\tif ((a = (*--srcptr)) > 0xbf)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tswitch (*source)\n\t\t\t{\n\t\t\t\t// no fall-through in this inner switch\n\t\t\t\tcase 0xe0: if (a < 0xa0) return false; break;\n\t\t\t\tcase 0xed: if (a > 0x9f) return false; break;\n\t\t\t\tcase 0xf0: if (a < 0x90) return false; break;\n\t\t\t\tcase 0xf4: if (a > 0x8f) return false; break;\n\t\t\t\tdefault:   if (a < 0x80) return false;\n\t\t\t}\n\t\t}\n\t\tcase 1: if ((*source >= 0x80) && (*source < 0xc2)) return false;\n\t}\n\treturn (*source <= 0xf4);\n}\n\n\n\n\n\nstd::u16string UTF8ToRawBEUTF16(const AString & a_UTF8)\n{\n\tstd::u16string UTF16;\n\tUTF16.reserve(a_UTF8.size() * 2);\n\n\tconst unsigned char * source    = reinterpret_cast<const unsigned char *>(a_UTF8.data());\n\tconst unsigned char * sourceEnd = source + a_UTF8.size();\n\tconst int halfShift  = 10;  // used for shifting by 10 bits\n\tconst unsigned int halfBase = 0x0010000UL;\n\tconst unsigned int halfMask = 0x3ffUL;\n\n\twhile (source < sourceEnd)\n\t{\n\t\tunsigned int ch = 0;\n\t\tunsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n\t\tif (source + extraBytesToRead >= sourceEnd)\n\t\t{\n\t\t\treturn UTF16;\n\t\t}\n\t\t// Do this check whether lenient or strict\n\t\tif (!isLegalUTF8(source, extraBytesToRead + 1))\n\t\t{\n\t\t\treturn UTF16;\n\t\t}\n\n\t\t// The cases all fall through. See \"Note A\" below.\n\t\tswitch (extraBytesToRead)\n\t\t{\n\t\t\tcase 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */\n\t\t\tcase 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */\n\t\t\tcase 3: ch += *source++; ch <<= 6;\n\t\t\tcase 2: ch += *source++; ch <<= 6;\n\t\t\tcase 1: ch += *source++; ch <<= 6;\n\t\t\tcase 0: ch += *source++;\n\t\t}\n\t\tch -= offsetsFromUTF8[extraBytesToRead];\n\n\t\tif (ch <= UNI_MAX_BMP)\n\t\t{\n\t\t\t// Target is a character <= 0xFFFF\n\t\t\tif ((ch >= UNI_SUR_HIGH_START) && (ch <= UNI_SUR_LOW_END))\n\t\t\t{\n\t\t\t\t// UTF-16 surrogate values are illegal in UTF-32\n\t\t\t\tch = ' ';\n\t\t\t}\n\t\t\tunsigned short v = htons(static_cast<unsigned short>(ch));\n\t\t\tUTF16.push_back(static_cast<char16_t>(v));\n\t\t}\n\t\telse if (ch > UNI_MAX_UTF16)\n\t\t{\n\t\t\t// Invalid value, replace with a space\n\t\t\tunsigned short v = htons(' ');\n\t\t\tUTF16.push_back(static_cast<char16_t>(v));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// target is a character in range 0xFFFF - 0x10FFFF.\n\t\t\tch -= halfBase;\n\t\t\tauto v1 = htons(static_cast<uint16_t>((ch >> halfShift) + UNI_SUR_HIGH_START));\n\t\t\tauto v2 = htons(static_cast<uint16_t>((ch & halfMask) + UNI_SUR_LOW_START));\n\t\t\tUTF16.push_back(static_cast<char16_t>(v1));\n\t\t\tUTF16.push_back(static_cast<char16_t>(v2));\n\t\t}\n\t}\n\treturn UTF16;\n}\n\n/*\n---------------------------------------------------------------------\nNote A.\nThe fall-through switches in UTF-8 reading code save a\ntemp variable, some decrements & conditionals.  The switches\nare equivalent to the following loop:\n{\n\tint tmpBytesToRead = extraBytesToRead + 1;\n\tdo\n\t{\n\t\tch += *source++;\n\t\t--tmpBytesToRead;\n\t\tif (tmpBytesToRead)\n\t\t{\n\t\t\tch <<= 6;\n\t\t}\n\t} while (tmpBytesToRead > 0);\n}\n---------------------------------------------------------------------\n*/\n\n////////////////////////////////////////////////////////////////////////////////\n// End of Unicode, Inc.'s code / information\n////////////////////////////////////////////////////////////////////////////////\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n\n\n\n\n#define HEX(x) static_cast<char>((x) > 9 ? (x) + 'A' - 10 : (x) + '0')\n\n/**\nformat binary data this way:\n00001234: 31 32 33 34 35 36 37 38 39 30 61 62 63 64 65 66    1234567890abcdef\n*/\nAString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, size_t a_BytesPerLine)\n{\n\tfmt::memory_buffer Output;\n\t/* If formatting the data from the comment above:\n\t\tHex holds:   \"31 32 33 34 35 36 37 38 39 30 61 62 63 64 65 66 \"\n\t\tChars holds: \"1234567890abcdef\" */\n\tfmt::memory_buffer Hex, Chars;\n\n\tif (a_Size > 0)\n\t{\n\t\t// Same as std::ceil(static_cast<float>(a_Size) / a_BytesPerLine);\n\t\tconst size_t NumLines = a_Size / a_BytesPerLine + (a_Size % a_BytesPerLine != 0);\n\t\tconst size_t CharsPerLine = 14 + 4 * a_BytesPerLine;\n\t\tOutput.reserve(NumLines * CharsPerLine);\n\t}\n\n\tfor (size_t i = 0; i < a_Size; i += a_BytesPerLine)\n\t{\n\t\tsize_t k = std::min(a_Size - i, a_BytesPerLine);\n\t\tfor (size_t j = 0; j < k; j++)\n\t\t{\n\t\t\tByte c = (static_cast<const Byte *>(a_Data))[i + j];\n\t\t\tHex.push_back(HEX(c >> 4));\n\t\t\tHex.push_back(HEX(c & 0xf));\n\t\t\tHex.push_back(' ');\n\t\t\tChars.push_back((c >= ' ') ? static_cast<char>(c) : '.');\n\t\t}  // for j\n\n\t\t// Write Hex with a dynamic fixed width\n\t\tauto HexStr = fmt::string_view(Hex.data(), Hex.size());\n\t\tauto CharsStr = fmt::string_view(Chars.data(), Chars.size());\n\t\tfmt::format_to(\n\t\t\tOutput, \"{0:08x}: {1:{2}}   {3}\\n\",\n\t\t\ti, HexStr, a_BytesPerLine * 3, CharsStr\n\t\t);\n\n\t\tHex.clear();\n\t\tChars.clear();\n\t}  // for i\n\ta_Out.append(Output.data(), Output.size());\n\treturn a_Out;\n}\n\n\n\n\n\nAString EscapeString(const AString & a_Message)\n{\n\tAString EscapedMsg;\n\tsize_t len = a_Message.size();\n\tsize_t last = 0;\n\tEscapedMsg.reserve(len);\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tchar ch = a_Message[i];\n\t\tswitch (ch)\n\t\t{\n\t\t\tcase '\\'':\n\t\t\tcase '\\\"':\n\t\t\tcase '\\\\':\n\t\t\t{\n\t\t\t\tif (i > last)\n\t\t\t\t{\n\t\t\t\t\tEscapedMsg.append(a_Message, last, i - last);\n\t\t\t\t}\n\t\t\t\tEscapedMsg.push_back('\\\\');\n\t\t\t\tEscapedMsg.push_back(ch);\n\t\t\t\tlast = i + 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (ch)\n\t}  // for i - a_Message[]\n\tif (len > last)\n\t{\n\t\tEscapedMsg.append(a_Message, last, len - last);\n\t}\n\treturn EscapedMsg;\n}\n\n\n\n\n\nAString StripColorCodes(const AString & a_Message)\n{\n\tAString res(a_Message);\n\tsize_t idx = 0;\n\tfor (;;)\n\t{\n\t\tidx = res.find(\"\\xc2\\xa7\", idx);\n\t\tif (idx == AString::npos)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t\tres.erase(idx, 3);\n\t}\n}\n\n\n\n\n\nstd::pair<bool, AString> URLDecode(const AString & a_Text)\n{\n\tAString res;\n\tauto len = a_Text.size();\n\tres.reserve(len);\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tif (a_Text[i] == '+')\n\t\t{\n\t\t\tres.push_back(' ');\n\t\t\tcontinue;\n\t\t}\n\t\tif (a_Text[i] != '%')\n\t\t{\n\t\t\tres.push_back(a_Text[i]);\n\t\t\tcontinue;\n\t\t}\n\t\tif (i + 1 >= len)\n\t\t{\n\t\t\t// String too short for an encoded value\n\t\t\treturn std::make_pair(false, AString());\n\t\t}\n\t\tif ((a_Text[i + 1] == 'u') || (a_Text[i + 1] == 'U'))\n\t\t{\n\t\t\t// Unicode char \"%u0xxxx\"\n\t\t\tif (i + 6 >= len)\n\t\t\t{\n\t\t\t\treturn std::make_pair(false, AString());\n\t\t\t}\n\t\t\tif (a_Text[i + 2] != '0')\n\t\t\t{\n\t\t\t\treturn std::make_pair(false, AString());\n\t\t\t}\n\t\t\tunsigned v1 = HexToDec(a_Text[i + 3]);\n\t\t\tunsigned v2 = HexToDec(a_Text[i + 4]);\n\t\t\tunsigned v3 = HexToDec(a_Text[i + 5]);\n\t\t\tunsigned v4 = HexToDec(a_Text[i + 6]);\n\t\t\tif ((v1 == 0xff) || (v2 == 0xff) || (v4 == 0xff) || (v3 == 0xff))\n\t\t\t{\n\t\t\t\t// Invalid hex numbers\n\t\t\t\treturn std::make_pair(false, AString());\n\t\t\t}\n\t\t\tres.append(UnicodeCharToUtf8((v1 << 12) | (v2 << 8) | (v3 << 4) | v4));\n\t\t\ti = i + 6;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Regular char \"%xx\":\n\t\t\tif (i + 2 >= len)\n\t\t\t{\n\t\t\t\treturn std::make_pair(false, AString());\n\t\t\t}\n\t\t\tauto v1 = HexToDec(a_Text[i + 1]);\n\t\t\tauto v2 = HexToDec(a_Text[i + 2]);\n\t\t\tif ((v1 == 0xff) || (v2 == 0xff))\n\t\t\t{\n\t\t\t\t// Invalid hex numbers\n\t\t\t\treturn std::make_pair(false, AString());\n\t\t\t}\n\t\t\tres.push_back(static_cast<char>((v1 << 4) | v2));\n\t\t\ti = i + 2;\n\t\t}\n\t}  // for i - a_Text[i]\n\treturn std::make_pair(true, res);\n}\n\n\n\n\n\nAString URLEncode(const AString & a_Text)\n{\n\tAString res;\n\tauto len = a_Text.size();\n\tres.reserve(len);\n\tstatic const char HEX[] = \"0123456789ABCDEF\";\n\tfor (size_t i = 0; i < len; ++i)\n\t{\n\t\tif (isalnum(a_Text[i]))\n\t\t{\n\t\t\tres.push_back(a_Text[i]);\n\t\t}\n\t\telse if (a_Text[i] == ' ')\n\t\t{\n\t\t\tres.push_back('+');\n\t\t}\n\t\telse\n\t\t{\n\t\t\tres.push_back('%');\n\t\t\tres.push_back(HEX[static_cast<unsigned char>(a_Text[i]) >> 4]);\n\t\t\tres.push_back(HEX[static_cast<unsigned char>(a_Text[i]) & 0x0f]);\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n\nAString ReplaceAllCharOccurrences(const AString & a_String, char a_From, char a_To)\n{\n\tAString res(a_String);\n\tstd::replace(res.begin(), res.end(), a_From, a_To);\n\treturn res;\n}\n\n\n\n\n\n/** Converts one Hex character in a Base64 encoding into the data value */\nstatic inline int UnBase64(char c)\n{\n\tif ((c >='A') && (c <= 'Z'))\n\t{\n\t\treturn c - 'A';\n\t}\n\tif ((c >='a') && (c <= 'z'))\n\t{\n\t\treturn c - 'a' + 26;\n\t}\n\tif ((c >= '0') && (c <= '9'))\n\t{\n\t\treturn c - '0' + 52;\n\t}\n\tif (c == '+')\n\t{\n\t\treturn 62;\n\t}\n\tif (c == '/')\n\t{\n\t\treturn 63;\n\t}\n\tif (c == '=')\n\t{\n\t\treturn -1;\n\t}\n\treturn -2;\n}\n\n\n\n\n\nAString Base64Decode(const AString & a_Base64String)\n{\n\tAString res;\n\tsize_t i, len = a_Base64String.size();\n\tsize_t o;\n\tint c;\n\tres.resize((len * 4) / 3 + 5, 0);  // Approximate the upper bound on the result length\n\tfor (o = 0, i = 0; i < len; i++)\n\t{\n\t\tc = UnBase64(a_Base64String[i]);\n\t\tif (c >= 0)\n\t\t{\n\t\t\tswitch (o & 7)\n\t\t\t{\n\t\t\t\tcase 0: res[o >> 3] |= (c << 2); break;\n\t\t\t\tcase 6: res[o >> 3] |= (c >> 4); res[(o >> 3) + 1] |= (c << 4); break;\n\t\t\t\tcase 4: res[o >> 3] |= (c >> 2); res[(o >> 3) + 1] |= (c << 6); break;\n\t\t\t\tcase 2: res[o >> 3] |= c; break;\n\t\t\t}\n\t\t\to += 6;\n\t\t}\n\t\tif (c == -1)\n\t\t{\n\t\t\t// Error while decoding, invalid input. Return as much as we've decoded:\n\t\t\tres.resize(o >> 3);\n\t\t\treturn res;\n\t\t}\n\t}\n\tres.resize(o >> 3);\n\treturn res;\n}\n\n\n\n\n\nAString Base64Encode(const AString & a_Input)\n{\n\tstatic const char BASE64[64] =\n\t{\n\t\t'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',\n\t\t'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',\n\t\t'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n\t\t'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'\n\t};\n\n\tAString output;\n\toutput.resize(((a_Input.size() + 2) / 3) * 4);\n\n\tsize_t output_index = 0;\n\tsize_t size_full24 = (a_Input.size() / 3) * 3;\n\n\tfor (size_t i = 0; i < size_full24; i += 3)\n\t{\n\t\toutput[output_index++] = BASE64[static_cast<unsigned char>(a_Input[i]) >> 2];\n\t\toutput[output_index++] = BASE64[(static_cast<unsigned char>(a_Input[i]) << 4 | static_cast<unsigned char>(a_Input[i + 1]) >> 4) & 63];\n\t\toutput[output_index++] = BASE64[(static_cast<unsigned char>(a_Input[i + 1]) << 2 | static_cast<unsigned char>(a_Input[i + 2]) >> 6) & 63];\n\t\toutput[output_index++] = BASE64[static_cast<unsigned char>(a_Input[i + 2]) & 63];\n\t}\n\n\tif (size_full24 < a_Input.size())\n\t{\n\t\toutput[output_index++] = BASE64[static_cast<unsigned char>(a_Input[size_full24]) >> 2];\n\t\tif (size_full24 + 1 == a_Input.size())\n\t\t{\n\t\t\toutput[output_index++] = BASE64[(static_cast<unsigned char>(a_Input[size_full24]) << 4) & 63];\n\t\t\toutput[output_index++] = '=';\n\t\t}\n\t\telse\n\t\t{\n\t\t\toutput[output_index++] = BASE64[(static_cast<unsigned char>(a_Input[size_full24]) << 4 | static_cast<unsigned char>(a_Input[size_full24 + 1]) >> 4) & 63];\n\t\t\toutput[output_index++] = BASE64[(static_cast<unsigned char>(a_Input[size_full24 + 1]) << 2) & 63];\n\t\t}\n\n\t\toutput[output_index++] = '=';\n\t}\n\tASSERT(output_index == output.size());\n\n\treturn output;\n}\n\n\n\n\n\nbool SplitZeroTerminatedStrings(const AString & a_Strings, AStringVector & a_Output)\n{\n\ta_Output.clear();\n\tsize_t size = a_Strings.size();\n\tsize_t start = 0;\n\tbool res = false;\n\tfor (size_t i = 0; i < size; i++)\n\t{\n\t\tif (a_Strings[i] == 0)\n\t\t{\n\t\t\ta_Output.push_back(a_Strings.substr(start, i - start));\n\t\t\tstart = i + 1;\n\t\t\tres = true;\n\t\t}\n\t}\n\tif (start < size)\n\t{\n\t\ta_Output.push_back(a_Strings.substr(start, size - start));\n\t\tres = true;\n\t}\n\n\treturn res;\n}\n\n\n\n\n\nAStringVector MergeStringVectors(const AStringVector & a_Strings1, const AStringVector & a_Strings2)\n{\n\t// Initialize the resulting vector by the first vector:\n\tAStringVector res = a_Strings1;\n\n\t// Add each item from strings2 that is not already present:\n\tfor (const auto & item : a_Strings2)\n\t{\n\t\tif (std::find(res.begin(), res.end(), item) == res.end())\n\t\t{\n\t\t\tres.push_back(item);\n\t\t}\n\t}  // for item - a_Strings2[]\n\n\treturn res;\n}\n\n\n\n\n\nAString StringsConcat(const AStringVector & a_Strings, char a_Separator)\n{\n\t// If the vector is empty, return an empty string:\n\tif (a_Strings.empty())\n\t{\n\t\treturn \"\";\n\t}\n\n\t// Concatenate the strings in the vector:\n\tAString res;\n\tres.append(a_Strings[0]);\n\tfor (auto itr = a_Strings.cbegin() + 1, end = a_Strings.cend(); itr != end; ++itr)\n\t{\n\t\tres.push_back(a_Separator);\n\t\tres.append(*itr);\n\t}\n\treturn res;\n}\n\n\n\n\n\nbool StringToFloat(const AString & a_String, float & a_Num)\n{\n\tchar *err;\n\ta_Num = strtof(a_String.c_str(), &err);\n\treturn (*err == 0);\n}\n\n\n\n\n\nbool IsOnlyWhitespace(const AString & a_String)\n{\n\treturn std::all_of(a_String.cbegin(), a_String.cend(), isspace);\n}\n"
  },
  {
    "path": "src/StringUtils.h",
    "content": "\n// StringUtils.h\n\n// Interfaces to various string helper functions\n\n\n\n\n#pragma once\n\ntypedef std::string AString;\ntypedef std::vector<AString> AStringVector;\ntypedef std::list<AString>   AStringList;\n\n/** A string dictionary, used for key-value pairs. */\ntypedef std::map<AString, AString> AStringMap;\n\n\n\n\n\n/** Split the string at any of the listed delimiters.\nReturn the splitted strings as a stringvector. */\nextern AStringVector StringSplit(const AString & str, const AString & delim);\n\n/** Split the string at any of the listed delimiters. Keeps quoted content together\nResolves issue #490\nReturn the splitted strings as a stringvector. */\nextern AStringVector StringSplitWithQuotes(const AString & str, const AString & delim);\n\n/** Join a list of strings with the given delimiter between entries. */\nAString StringJoin(const AStringVector & a_Strings, const AString & a_Delimiter);\n\n/** Split the string at any of the listed delimiters and trim each value.\nReturns the splitted strings as a stringvector. */\nextern AStringVector StringSplitAndTrim(const AString & str, const AString & delim);\n\n/** Trims whitespace at both ends of the string.\nReturns a trimmed copy of the original string. */\nextern AString TrimString(const AString & str);  // tolua_export\n\n/** In-place string conversion to uppercase.\nReturns the same string object. */\nextern AString & InPlaceUppercase(AString & s);\n\n/** In-place string conversion to lowercase.\nReturns the same string object. */\nextern AString & InPlaceLowercase(AString & s);\n\n/** Returns an upper-cased copy of the string */\nextern AString StrToUpper(const AString & s);\n\n/** Returns a lower-cased copy of the string */\nextern AString StrToLower(const AString & s);\n\n/** Case-insensitive string comparison.\nReturns 0 if the strings are the same, <0 if s1 < s2 and >0 if s1 > s2. */\nextern int NoCaseCompare(const AString & s1, const AString & s2);  // tolua_export\n\n/** Case-insensitive string comparison that returns a rating of equal-ness between [0 - s1.length()]. */\nextern size_t RateCompareString(const AString & s1, const AString & s2);\n\n/** Replaces each occurence of iNeedle in iHayStack with iReplaceWith */\nextern void ReplaceString(AString & iHayStack, const AString & iNeedle, const AString & iReplaceWith);  // tolua_export\n\n/** Replaces each occurence of iNeedle in iHayStack with iReplaceWith, after URL-encoding iReplaceWith */\nextern void ReplaceURL(AString & iHayStack, const AString & iNeedle, const AString & iReplaceWith);\n\n/** Converts a stream of BE shorts into UTF-8 string; returns a_UTF8. */\nextern AString & RawBEUTF16ToUTF8(const char * a_RawData, size_t a_NumShorts, AString & a_UTF8);\n\n/** Converts a unicode character to its UTF8 representation. */\nextern AString UnicodeCharToUtf8(unsigned a_UnicodeChar);\n\n/** Converts a UTF-8 string into a UTF-16 BE string. */\nextern std::u16string UTF8ToRawBEUTF16(const AString & a_String);\n\n/** Creates a nicely formatted HEX dump of the given memory block. */\nextern AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, size_t a_BytesPerLine);\n\n/** Returns a copy of a_Message with all quotes and backslashes escaped by a backslash. */\nextern AString EscapeString(const AString & a_Message);  // tolua_export\n\n/** Removes all control codes used by MC for colors and styles. */\nextern AString StripColorCodes(const AString & a_Message);  // tolua_export\n\n/** URL-Decodes the given string.\nThe first value specifies whether the decoding was successful.\nThe second value is the decoded string, if successful. */\nextern std::pair<bool, AString> URLDecode(const AString & a_String);  // Exported to Lua as cUrlParser::UrlDecode()\n\n/** URL-encodes the given string. */\nextern AString URLEncode(const AString & a_Text);\n\n/** Replaces all occurrences of char a_From inside a_String with char a_To. */\nextern AString ReplaceAllCharOccurrences(const AString & a_String, char a_From, char a_To);  // Needn't export to Lua, since Lua doesn't have chars anyway\n\n/** Decodes a Base64-encoded string into the raw data */\nextern AString Base64Decode(const AString & a_Base64String);  // Exported manually due to embedded NULs and extra parameter\n\n/** Encodes a string into Base64 */\nextern AString Base64Encode(const AString & a_Input);  // Exported manually due to embedded NULs and extra parameter\n\n/** Splits a string that has embedded \\0 characters, on those characters.\na_Output is first cleared and then each separate string is pushed back into a_Output.\nReturns true if there are at least two strings in a_Output (there was at least one \\0 separator). */\nextern bool SplitZeroTerminatedStrings(const AString & a_Strings, AStringVector & a_Output);\n\n/** Merges the two vectors of strings, removing duplicate entries from the second vector.\nThe resulting vector contains items from a_Strings1 first, then from a_Strings2.\nThe order of items doesn't change, only the duplicates are removed.\nIf a_Strings1 contains duplicates, the result will still contain those duplicates. */\nextern AStringVector MergeStringVectors(const AStringVector & a_Strings1, const AStringVector & a_Strings2);\n\n/** Concatenates the specified strings into a single string, separated by the specified separator character.\nUse StringJoin() if you need multiple separator characters. */\nextern AString StringsConcat(const AStringVector & a_Strings, char a_Separator);\n\n/** Converts a string into a float. Returns false if the conversion fails. */\nextern bool StringToFloat(const AString & a_String, float & a_Num);\n\n/** Returns true if only whitespace characters are present in the string */\nbool IsOnlyWhitespace(const AString & a_String);\n\n\n\n\n\n/** Parses any integer type. Checks bounds and returns errors out of band. */\ntemplate <class T>\nbool StringToInteger(const AString & a_str, T & a_Num)\n{\n\tsize_t i = 0;\n\tbool positive = true;\n\tT result = 0;\n\tif (a_str[0] == '+')\n\t{\n\t\ti++;\n\t}\n\telse if (a_str[0] == '-')\n\t{\n\t\ti++;\n\t\tpositive = false;\n\t}\n\tif (positive)\n\t{\n\t\tfor (size_t size = a_str.size(); i < size; i++)\n\t\t{\n\t\t\tif ((a_str[i] < '0') || (a_str[i] > '9'))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (std::numeric_limits<T>::max() / 10 < result)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tresult *= 10;\n\t\t\tT digit = static_cast<T>(a_str[i] - '0');\n\t\t\tif (std::numeric_limits<T>::max() - digit < result)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tresult += digit;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Unsigned result cannot be signed!\n\t\tif (!std::numeric_limits<T>::is_signed)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (size_t size = a_str.size(); i < size; i++)\n\t\t{\n\t\t\tif ((a_str[i] < '0') || (a_str[i] > '9'))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (std::numeric_limits<T>::min() / 10 > result)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tresult *= 10;\n\t\t\tT digit = static_cast<T>(a_str[i] - '0');\n\t\t\tif (std::numeric_limits<T>::min() + digit > result)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tresult -= digit;\n\t\t}\n\t}\n\ta_Num = result;\n\treturn true;\n}\n\n\n\n\n\n/** Returns a number (of any integer type T) from a key-value string map.\nReturns a_Default if the key is not present or the value is not a number representable in type T. */\ntemplate <typename T>\nT GetStringMapInteger(const AStringMap & a_Map, const AString & a_Key, T a_Default)\n{\n\t// Try to locate the key:\n\tauto itr = a_Map.find(a_Key);\n\tif (itr == a_Map.end())\n\t{\n\t\treturn a_Default;\n\t}\n\n\t// Try to convert the value to a number:\n\tT res = a_Default;\n\tif (!StringToInteger<T>(itr->second, res))\n\t{\n\t\treturn a_Default;\n\t}\n\treturn res;\n}\n\n\n\n\n\n// If you have any other string helper functions, declare them here\n\n\n\n\n"
  },
  {
    "path": "src/UI/AnvilWindow.cpp",
    "content": "\n// AnvilWindow.cpp\n\n// Representing the UI window for the anvil block\n\n#include \"Globals.h\"\n#include \"AnvilWindow.h\"\n#include \"SlotArea.h\"\n\n\n\n\ncAnvilWindow::cAnvilWindow(Vector3i a_BlockPos) :\n\tcWindow(wtAnvil, \"Repair\"),\n\tm_RepairedItemName(),\n\tm_BlockPos(a_BlockPos)\n{\n\tm_AnvilSlotArea = new cSlotAreaAnvil(*this);\n\tm_SlotAreas.push_back(m_AnvilSlotArea);\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nAString cAnvilWindow::GetRepairedItemName(void) const\n{\n\treturn m_RepairedItemName;\n}\n\n\n\n\n\nvoid cAnvilWindow::SetRepairedItemName(const AString & a_Name, cPlayer * a_Player)\n{\n\tm_RepairedItemName = a_Name;\n\tif (a_Player != nullptr)\n\t{\n\t\tm_AnvilSlotArea->UpdateResult(*a_Player);\n\t}\n}\n\n\n\n\n\nvoid cAnvilWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Anvil Slot\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t}\n\telse\n\t{\n\t\t// Inventory or Hotbar\n\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Anvil */\n\t}\n\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/AnvilWindow.h",
    "content": "\n// AnvilWindow.h\n\n// Representing the UI window for the anvil block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n\n\n\n\n\nclass cAnvilWindow:\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcAnvilWindow(Vector3i a_BlockPos);\n\n\t/** Gets the repaired item name. */\n\tAString GetRepairedItemName(void) const;\n\n\t/** Set the repaired item name. */\n\tvoid SetRepairedItemName(const AString & a_Name, cPlayer * a_Player);\n\n\t/** Gets the Position from the Anvil */\n\tconst Vector3i & GetBlockPos() { return m_BlockPos; }\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\nprotected:\n\tcSlotAreaAnvil * m_AnvilSlotArea;\n\tAString m_RepairedItemName;\n\tVector3i m_BlockPos;\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/BeaconWindow.cpp",
    "content": "\n// BeaconWindow.cpp\n\n// Representing the UI window for the beacon block\n\n#include \"Globals.h\"\n#include \"BeaconWindow.h\"\n#include \"SlotArea.h\"\n#include \"../BlockEntities/BeaconEntity.h\"\n#include \"../ClientHandle.h\"\n\n\n\n\n\ncBeaconWindow::cBeaconWindow(cBeaconEntity * a_Beacon):\n\tcWindow(wtBeacon, \"Beacon\"),\n\tm_Beacon(a_Beacon)\n{\n\tm_SlotAreas.push_back(new cSlotAreaBeacon(m_Beacon, *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nvoid cBeaconWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Beacon Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t}\n\telse\n\t{\n\t\tif (cSlotAreaBeacon::IsPlaceableItem(a_ItemStack.m_ItemType) && (a_ItemStack.m_ItemCount == 1))\n\t\t{\n\t\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Beacon */\n\t\t}\n\n\t\tif (a_ClickedArea == m_SlotAreas[1])\n\t\t{\n\t\t\t// Inventory Area\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar */\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Hotbar Area\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t}\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n\nvoid cBeaconWindow::OpenedByPlayer(cPlayer & a_Player)\n{\n\tSuper::OpenedByPlayer(a_Player);\n\n\ta_Player.GetClientHandle()->SendWindowProperty(*this, 0, m_Beacon->GetBeaconLevel());\n\ta_Player.GetClientHandle()->SendWindowProperty(*this, 1, static_cast<short>(m_Beacon->GetPrimaryEffect()));\n\ta_Player.GetClientHandle()->SendWindowProperty(*this, 2, static_cast<short>(m_Beacon->GetSecondaryEffect()));\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/BeaconWindow.h",
    "content": "\n// BeaconWindow.h\n\n// Representing the UI window for the beacon block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n#include \"../Entities/Player.h\"\n\n\n\n\n\nclass cBeaconWindow :\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\tcBeaconWindow(cBeaconEntity * a_Beacon);\n\n\tcBeaconEntity * GetBeaconEntity(void) const { return m_Beacon; }\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\n\t// cWindow Overrides:\n\tvirtual void OpenedByPlayer(cPlayer & a_Player) override;\n\nprotected:\n\tcBeaconEntity * m_Beacon;\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/BrewingstandWindow.cpp",
    "content": "\n// BrewingstandWindow.cpp\n\n// Representing the UI window for the brewing stand block\n\n#include \"Globals.h\"\n#include \"BrewingstandWindow.h\"\n#include \"SlotArea.h\"\n#include \"../BrewingRecipes.h\"\n#include \"../Root.h\"\n\n\n\n\n\ncBrewingstandWindow::cBrewingstandWindow(cBrewingstandEntity * a_Brewingstand):\n\tSuper(wtBrewery, \"Brewingstand\")\n{\n\tm_SlotAreas.push_back(new cSlotAreaBrewingstand(a_Brewingstand, *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nvoid cBrewingstandWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\tif ((a_Slot >= 0) && (a_Slot <= 4))\n\t\t{\n\t\t\t// Brewing stand Area\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar */\n\t\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t\t}\n\t}\n\telse\n\t{\n\t\tcBrewingRecipes * BR = cRoot::Get()->GetBrewingRecipes();\n\t\tif ((BR->IsBottle(a_ItemStack)) || (BR->IsIngredient(a_ItemStack)) || BR->IsFuel(a_ItemStack))\n\t\t{\n\t\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* brewing stand Area */\n\t\t}\n\t\telse if (a_ClickedArea == m_SlotAreas[1])\n\t\t{\n\t\t\t// Inventory Area\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar */\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Hotbar Area\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t}\n\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n"
  },
  {
    "path": "src/UI/BrewingstandWindow.h",
    "content": "\n// BrewingstandWindow.h\n\n// Representing the UI window for the brewing stand block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n\n\n\n\n\nclass cBrewingstandWindow :\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcBrewingstandWindow(cBrewingstandEntity * a_Brewingstand);\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tSlotArea.cpp\n\tWindow.cpp\n\tAnvilWindow.cpp\n\tBeaconWindow.cpp\n\tBrewingstandWindow.cpp\n\tChestWindow.cpp\n\tCraftingWindow.cpp\n\tDropSpenserWindow.cpp\n\tEnchantingWindow.cpp\n\tEnderChestWindow.cpp\n\tFurnaceWindow.cpp\n\tHopperWindow.cpp\n\tHorseWindow.cpp\n\tInventoryWindow.cpp\n\n\tSlotArea.h\n\tWindow.h\n\tAnvilWindow.h\n\tBeaconWindow.h\n\tBrewingstandWindow.h\n\tChestWindow.h\n\tCraftingWindow.h\n\tDropSpenserWindow.h\n\tEnchantingWindow.h\n\tEnderChestWindow.h\n\tFurnaceWindow.h\n\tHopperWindow.h\n\tHorseWindow.h\n\tInventoryWindow.h\n\tMinecartWithChestWindow.h\n\tWindowOwner.h\n)\n"
  },
  {
    "path": "src/UI/ChestWindow.cpp",
    "content": "\n// ChestWindow.cpp\n\n// Representing the UI window for the chest block\n\n#include \"Globals.h\"\n#include \"ChestWindow.h\"\n#include \"../BlockEntities/ChestEntity.h\"\n#include \"../Entities/Player.h\"\n#include \"SlotArea.h\"\n\n\n\n\n\ncChestWindow::cChestWindow(cChestEntity * a_Chest):\n\tcWindow(wtChest, (a_Chest->GetBlockType() == E_BLOCK_CHEST) ? \"Chest\" : \"Trapped Chest\"),\n\tm_World(a_Chest->GetWorld()),\n\tm_BlockPos(a_Chest->GetPos()),\n\tm_PrimaryChest(a_Chest),\n\tm_SecondaryChest(nullptr)\n{\n\tm_SlotAreas.push_back(new cSlotAreaChest(a_Chest, *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n\n\t// Play the opening sound:\n\tm_World->BroadcastSoundEffect(\"block.chest.open\", m_BlockPos, 1, 1);\n\n\t// Send out the chest-open packet:\n\tm_World->BroadcastBlockAction(m_BlockPos, 1, 1, a_Chest->GetBlockType());\n}\n\n\n\n\n\ncChestWindow::cChestWindow(cChestEntity * a_PrimaryChest, cChestEntity * a_SecondaryChest) :\n\tcWindow(wtChest, (a_PrimaryChest->GetBlockType() == E_BLOCK_CHEST) ? \"Double Chest\" : \"Double Trapped Chest\"),\n\tm_World(a_PrimaryChest->GetWorld()),\n\tm_BlockPos(a_PrimaryChest->GetPos()),\n\tm_PrimaryChest(a_PrimaryChest),\n\tm_SecondaryChest(a_SecondaryChest)\n{\n\tm_SlotAreas.push_back(new cSlotAreaDoubleChest(a_PrimaryChest, a_SecondaryChest, *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n\n\t// Play the opening sound:\n\tm_World->BroadcastSoundEffect(\"block.chest.open\", m_BlockPos, 1, 1);\n\n\t// Send out the chest-open packet:\n\tm_World->BroadcastBlockAction(m_BlockPos, 1, 1, a_PrimaryChest->GetBlockType());\n}\n\n\n\n\n\ncChestWindow::~cChestWindow()\n{\n\t// Send out the chest-close packet:\n\tm_World->BroadcastBlockAction(m_BlockPos, 1, 0, m_PrimaryChest->GetBlockType());\n\n\tm_World->BroadcastSoundEffect(\"block.chest.close\", m_BlockPos, 1, 1);\n}\n\n\n\n\n\nbool cChestWindow::ClosedByPlayer(cPlayer & a_Player, bool a_CanRefuse)\n{\n\tm_PrimaryChest->SetNumberOfPlayers(m_PrimaryChest->GetNumberOfPlayers() - 1);\n\tm_PrimaryChest->GetWorld()->WakeUpSimulators(m_PrimaryChest->GetPos());\n\n\tif (m_SecondaryChest != nullptr)\n\t{\n\t\tm_SecondaryChest->SetNumberOfPlayers(m_SecondaryChest->GetNumberOfPlayers() - 1);\n\t\tm_SecondaryChest->GetWorld()->WakeUpSimulators(m_SecondaryChest->GetPos());\n\t}\n\n\tcWindow::ClosedByPlayer(a_Player, a_CanRefuse);\n\treturn true;\n}\n\n\n\n\n\nvoid cChestWindow::OpenedByPlayer(cPlayer & a_Player)\n{\n\tm_PrimaryChest->SetNumberOfPlayers(m_PrimaryChest->GetNumberOfPlayers() + 1);\n\tm_PrimaryChest->GetWorld()->WakeUpSimulators(m_PrimaryChest->GetPos());\n\n\tif (m_SecondaryChest != nullptr)\n\t{\n\t\tm_SecondaryChest->SetNumberOfPlayers(m_SecondaryChest->GetNumberOfPlayers() + 1);\n\t\tm_SecondaryChest->GetWorld()->WakeUpSimulators(m_SecondaryChest->GetPos());\n\t}\n\n\tcWindow::OpenedByPlayer(a_Player);\n}\n\n\n\n\n\nvoid cChestWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Chest Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t}\n\telse\n\t{\n\t\t// Hotbar or Inventory\n\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Chest */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/ChestWindow.h",
    "content": "\n// ChestWindow.h\n\n// Representing the UI window for the chest block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n\n\n\n\n\nclass cChestWindow:\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcChestWindow(cChestEntity * a_Chest);\n\n\tcChestWindow(cChestEntity * a_PrimaryChest, cChestEntity * a_SecondaryChest);\n\n\tvirtual ~cChestWindow() override;\n\n\tvirtual bool ClosedByPlayer(cPlayer & a_Player, bool a_CanRefuse) override;\n\n\tvirtual void OpenedByPlayer(cPlayer & a_Player) override;\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\nprotected:\n\tcWorld * m_World;\n\tVector3i m_BlockPos;  // Position of the chest, for the window-close packet\n\tcChestEntity * m_PrimaryChest;\n\tcChestEntity * m_SecondaryChest;\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/CraftingWindow.cpp",
    "content": "\n// CraftingWindow.cpp\n\n// Representing the UI window for the crafting block\n\n#include \"Globals.h\"\n#include \"CraftingWindow.h\"\n#include \"SlotArea.h\"\n\n\n\n\ncCraftingWindow::cCraftingWindow() :\n\tcWindow(wtWorkbench, \"Crafting Table\")\n{\n\tm_SlotAreas.push_back(new cSlotAreaCrafting(3, *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nvoid cCraftingWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Crafting Area\n\t\tif (a_Slot == 0)\n\t\t{\n\t\t\t// Result Slot\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar */\n\t\t}\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, (a_Slot == 0));\n\t}\n\telse if (a_ClickedArea == m_SlotAreas[1])\n\t{\n\t\t// Inventory Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n\telse\n\t{\n\t\t// Hotbar\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n\nvoid cCraftingWindow::LoadRecipe(cPlayer & a_Player, UInt32 a_RecipeId)\n{\n\tauto slotAreaCrafting = static_cast<cSlotAreaCrafting *>(m_SlotAreas[0]);\n\tslotAreaCrafting->LoadRecipe(a_Player, a_RecipeId);\n}\n"
  },
  {
    "path": "src/UI/CraftingWindow.h",
    "content": "\n// CraftingWindow.h\n\n// Representing the UI window for the crafting block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n\n\n\n\n\nclass cCraftingWindow:\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcCraftingWindow();\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\n\t/** Loads the given Recipe into the crafting grid */\n\tvoid LoadRecipe(cPlayer & a_Player, UInt32 a_RecipeId);\n};\n"
  },
  {
    "path": "src/UI/DropSpenserWindow.cpp",
    "content": "\n// DropSpenserWindow.cpp\n\n// Representing the UI window for the dropper / dispenser block\n\n#include \"Globals.h\"\n#include \"DropSpenserWindow.h\"\n#include \"SlotArea.h\"\n\n\n\n\n\ncDropSpenserWindow::cDropSpenserWindow(cDropSpenserEntity * a_DropSpenser):\n\tSuper(wtDropSpenser, (a_DropSpenser->GetBlockType() == E_BLOCK_DISPENSER) ? \"Dispenser\" : \"Dropper\")\n{\n\tm_SlotAreas.push_back(new cSlotAreaItemGrid(a_DropSpenser->GetContents(), *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nvoid cDropSpenserWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// DropSpenser Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t}\n\telse\n\t{\n\t\t// Inventory or Hotbar\n\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* DropSpenser */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/DropSpenserWindow.h",
    "content": "\n// DropSpenserWindow.h\n\n// Representing the UI window for the dropper / dispenser block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n#include \"../BlockEntities/DropSpenserEntity.h\"\n\n\n\n\n\nclass cDropSpenserWindow :\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\tcDropSpenserWindow(cDropSpenserEntity * a_DropSpenser);\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/EnchantingWindow.cpp",
    "content": "\n// EnchantingWindow.cpp\n\n// Representing the UI window for the enchanting block\n\n#include \"Globals.h\"\n#include \"EnchantingWindow.h\"\n#include \"SlotArea.h\"\n\n\n\n\n\ncEnchantingWindow::cEnchantingWindow(Vector3i a_BlockPos, const AString & a_Title) :\n\tcWindow(wtEnchantment, a_Title),\n\tm_SlotArea(),\n\tm_BlockPos(a_BlockPos)\n{\n\tm_SlotArea = new cSlotAreaEnchanting(*this, m_BlockPos);\n\tm_SlotAreas.push_back(m_SlotArea);\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nvoid cEnchantingWindow::SetProperty(size_t a_Property, short a_Value)\n{\n\tif (a_Property < m_PropertyValue.size())\n\t{\n\t\tm_PropertyValue[a_Property] = a_Value;\n\t}\n\n\tSuper::SetProperty(a_Property, a_Value);\n}\n\n\n\n\n\nshort cEnchantingWindow::GetProperty(size_t a_Property)\n{\n\tASSERT(a_Property < m_PropertyValue.size());\n\treturn m_PropertyValue[a_Property];\n}\n\n\n\n\n\nvoid cEnchantingWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Enchanting Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t}\n\telse\n\t{\n\t\t// Inventory or Hotbar\n\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Enchanting */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/EnchantingWindow.h",
    "content": "\n// EnchantingWindow.h\n\n// Representing the UI window for the enchanting block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n\n\n\n\n\nclass cSlotAreaEnchanting;\n\n\n\n\n\nclass cEnchantingWindow final :\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcEnchantingWindow(Vector3i a_BlockPos, const AString & a_Title);\n\n\t/** Sends enchantment properties to the client.\n\tIf the property represents a level requirement, stores it for later GetProperty retrieval. */\n\tvirtual void SetProperty(size_t a_Property, short a_Value) override;\n\n\t/** Return the level requirement of the given enchantment slot. */\n\tshort GetProperty(size_t a_Property);\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\n\tcSlotAreaEnchanting * m_SlotArea;\n\nprotected:\n\n\tstd::array<short, 3> m_PropertyValue;\n\tVector3i m_BlockPos;\n};\n"
  },
  {
    "path": "src/UI/EnderChestWindow.cpp",
    "content": "\n// EnderChestWindow.cpp\n\n// Representing the UI window for the enderchest block\n\n#include \"Globals.h\"\n#include \"../World.h\"\n#include \"EnderChestWindow.h\"\n#include \"SlotArea.h\"\n\n\n\n\n\ncEnderChestWindow::cEnderChestWindow(cEnderChestEntity * a_EnderChest):\n\tcWindow(wtChest, \"Ender Chest\"),\n\tm_World(a_EnderChest->GetWorld()),\n\tm_BlockPos(a_EnderChest->GetPos())\n{\n\tm_SlotAreas.push_back(new cSlotAreaEnderChest(a_EnderChest, *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n\n\t// Play the opening sound:\n\tm_World->BroadcastSoundEffect(\n\t\t\"block.enderchest.open\",\n\t\tm_BlockPos,\n\t\t1,\n\t\t1\n\t);\n\n\t// Send out the chest-open packet:\n\tm_World->BroadcastBlockAction(m_BlockPos, 1, 1, E_BLOCK_ENDER_CHEST);\n}\n\n\n\n\n\ncEnderChestWindow::~cEnderChestWindow()\n{\n\t// Send out the chest-close packet:\n\tm_World->BroadcastBlockAction(m_BlockPos, 1, 0, E_BLOCK_ENDER_CHEST);\n\n\t// Play the closing sound\n\tm_World->BroadcastSoundEffect(\n\t\t\"block.enderchest.close\",\n\t\tm_BlockPos,\n\t\t1, 1\n\t);\n}\n\n\n\n\n\nvoid cEnderChestWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Chest Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t}\n\telse\n\t{\n\t\t// Hotbar or Inventory\n\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Chest */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/EnderChestWindow.h",
    "content": "\n// EnderChestWindow.h\n\n// Representing the UI window for the enderchest block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n#include \"../BlockEntities/EnderChestEntity.h\"\n\n\n\n\n\nclass cEnderChestWindow:\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcEnderChestWindow(cEnderChestEntity * a_EnderChest);\n\n\tvirtual ~cEnderChestWindow() override;\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\nprotected:\n\tcWorld * m_World;\n\tVector3i m_BlockPos;  // Position of the enderchest, for the window-close packet\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/FurnaceWindow.cpp",
    "content": "\n// FurnaceWindow.cpp\n\n// Representing the UI window for the furnace block\n\n#include \"Globals.h\"\n#include \"FurnaceWindow.h\"\n#include \"SlotArea.h\"\n#include \"../FurnaceRecipe.h\"\n#include \"../Root.h\"\n\n\n\n\n\ncFurnaceWindow::cFurnaceWindow(cFurnaceEntity * a_Furnace):\n\tcWindow(wtFurnace, \"Furnace\")\n{\n\tm_SlotAreas.push_back(new cSlotAreaFurnace(a_Furnace, *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nvoid cFurnaceWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Furnace Area\n\t\tif (a_Slot == 2)\n\t\t{\n\t\t\t// Result Slot\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Furnace Input / Fuel Slot\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t\t}\n\t}\n\telse\n\t{\n\t\tcFurnaceRecipe * FurnaceRecipes = cRoot::Get()->GetFurnaceRecipe();\n\t\tif ((FurnaceRecipes->GetRecipeFrom(a_ItemStack) != nullptr) || (FurnaceRecipes->IsFuel(a_ItemStack)))\n\t\t{\n\t\t\t// The item is a valid input item or fuel\n\t\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Furnace Area */\n\t\t}\n\t\telse if (a_ClickedArea == m_SlotAreas[1])\n\t\t{\n\t\t\t// Inventory Area\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar */\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Hotbar Area\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t}\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/FurnaceWindow.h",
    "content": "\n// FurnaceWindow.h\n\n// Representing the UI window for the furnace block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n\n\n\n\n\nclass cFurnaceWindow :\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\tcFurnaceWindow(cFurnaceEntity * a_Furnace);\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/HopperWindow.cpp",
    "content": "\n// HopperWindow.cpp\n\n// Representing the UI window for the hopper block\n\n#include \"Globals.h\"\n#include \"../BlockEntities/HopperEntity.h\"\n#include \"HopperWindow.h\"\n#include \"../BlockEntities/DropperEntity.h\"\n#include \"SlotArea.h\"\n\n\n\n\n\ncHopperWindow::cHopperWindow(cHopperEntity * a_Hopper):\n\tSuper(wtHopper, \"Hopper\")\n{\n\tm_SlotAreas.push_back(new cSlotAreaItemGrid(a_Hopper->GetContents(), *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nvoid cHopperWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Hopper Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t}\n\telse\n\t{\n\t\t// Inventory or Hotbar\n\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Hopper */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/HopperWindow.h",
    "content": "\n// HopperWindow.h\n\n// Representing the UI window for the hopper block\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n\n\n\n\n\nclass cHopperWindow:\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcHopperWindow(cHopperEntity * a_Hopper);\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/HorseWindow.cpp",
    "content": "\n// HorseWindow.cpp\n\n// Representing the UI window for a horse entity\n\n#include \"Globals.h\"\n#include \"../Mobs/Horse.h\"\n#include \"../UI/HorseWindow.h\"\n#include \"../UI/SlotArea.h\"\n\n\n\n\n\ncHorseWindow::cHorseWindow(cHorse & a_Horse):\n\tSuper(wtAnimalChest, \"Horse\"),\n\tm_Horse(a_Horse)\n{\n\tm_SlotAreas.push_back(new cSlotAreaHorse(a_Horse, *this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n}\n\n\n\n\n\nvoid cHorseWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Horse Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t}\n\telse\n\t{\n\t\t// Inventory or Hotbar\n\t\tif (ItemCategory::IsHorseArmor(a_ItemStack.m_ItemType) || (a_ItemStack.m_ItemType == E_ITEM_SADDLE))\n\t\t{\n\t\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Horse */\n\t\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t\t}\n\t}\n}\n\n\n\n\n\nUInt32 cHorseWindow::GetHorseID() const\n{\n\treturn m_Horse.GetUniqueID();\n}\n\n\n\n\n"
  },
  {
    "path": "src/UI/HorseWindow.h",
    "content": "\n// HorseWindow.h\n\n// Representing the UI window for a horse entity\n\n#pragma once\n\n#include \"Window.h\"\n\nclass cHorse;\n\n\n\n\n\nclass cHorseWindow :\n\tpublic cWindow\n{\n\tusing Super = cWindow;\npublic:\n\tcHorseWindow(cHorse & a_Horse);\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\n\t/** Returns the horse's entity ID. */\n\tUInt32 GetHorseID() const;\n\nprivate:\n\tcHorse & m_Horse;\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/InventoryWindow.cpp",
    "content": "\n// InventoryWindow.cpp\n\n// Representing the UI window for the player inventory\n\n#include \"Globals.h\"\n#include \"InventoryWindow.h\"\n#include \"SlotArea.h\"\n\n\n\n\n\ncInventoryWindow::cInventoryWindow(cPlayer & a_Player) :\n\tcWindow(wtInventory, \"Inventory\"),\n\tm_Player(a_Player)\n{\n\tm_SlotAreas.push_back(new cSlotAreaCrafting(2, *this));  // The creative inventory doesn't display it, but it's still counted into slot numbers\n\tm_SlotAreas.push_back(new cSlotAreaArmor(*this));\n\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n\tm_SlotAreas.push_back(new cSlotAreaShield(*this));\n}\n\n\n\n\n\nvoid cInventoryWindow::DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply)\n{\n\tcSlotAreas AreasInOrder;\n\n\tif (a_ClickedArea == m_SlotAreas[0])\n\t{\n\t\t// Crafting Area\n\t\tif (a_Slot == 0)\n\t\t{\n\t\t\t// Result Slot\n\t\t\tAreasInOrder.push_back(m_SlotAreas[3]);  /* Hotbar    */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Inventory */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Inventory */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[3]);  /* Hotbar    */\n\t\t}\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, (a_Slot == 0));\n\t}\n\telse if (a_ClickedArea == m_SlotAreas[1])\n\t{\n\t\t// Armor Area\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Inventory */\n\t\tAreasInOrder.push_back(m_SlotAreas[3]);  /* Hotbar    */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n\telse if (a_ClickedArea == m_SlotAreas[2])\n\t{\n\t\t// Inventory Area\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Armor  */\n\t\tAreasInOrder.push_back(m_SlotAreas[3]);  /* Hotbar */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n\telse\n\t{\n\t\t// Hotbar\n\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Armor     */\n\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Inventory */\n\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t}\n}\n\n\n\n\n\nvoid cInventoryWindow::LoadRecipe(cPlayer & a_Player, UInt32 a_RecipeId)\n{\n\tauto slotAreaCrafting = static_cast<cSlotAreaCrafting *>(m_SlotAreas[0]);\n\tslotAreaCrafting->LoadRecipe(a_Player, a_RecipeId);\n}\n"
  },
  {
    "path": "src/UI/InventoryWindow.h",
    "content": "\n// InventoryWindow.h\n\n// Representing the UI window for the player inventory\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n\n\n\n\n\nclass cInventoryWindow:\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcInventoryWindow(cPlayer & a_Player);\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override;\n\n\t/** Loads the given Recipe into the crafting grid */\n\tvoid LoadRecipe(cPlayer & a_Player, UInt32 a_RecipeId);\nprotected:\n\tcPlayer & m_Player;\n};\n"
  },
  {
    "path": "src/UI/MinecartWithChestWindow.h",
    "content": "\n// MinecartWithChestWindow.h\n\n// Representing the UI window for the minecart chest entity\n\n\n\n\n\n#pragma once\n\n#include \"Window.h\"\n#include \"../Entities/Minecart.h\"\n\n\n\n\n\nclass cMinecartWithChestWindow:\n\tpublic cWindow\n{\n\tusing Super = cWindow;\n\npublic:\n\n\tcMinecartWithChestWindow(cMinecartWithChest * a_ChestCart) :\n\t\tcWindow(wtChest, \"Minecart with Chest\"),\n\t\tm_ChestCart(a_ChestCart)\n\t{\n\t\tm_SlotAreas.push_back(new cSlotAreaMinecartWithChest(a_ChestCart, *this));\n\t\tm_SlotAreas.push_back(new cSlotAreaInventory(*this));\n\t\tm_SlotAreas.push_back(new cSlotAreaHotBar(*this));\n\n\t\ta_ChestCart->GetWorld()->BroadcastSoundEffect(\"block.chest.open\", a_ChestCart->GetPosition(), 1, 1);\n\t}\n\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override\n\t{\n\t\tcSlotAreas AreasInOrder;\n\n\t\tif (a_ClickedArea == m_SlotAreas[0])\n\t\t{\n\t\t\t// Chest Area\n\t\t\tAreasInOrder.push_back(m_SlotAreas[2]);  /* Hotbar    */\n\t\t\tAreasInOrder.push_back(m_SlotAreas[1]);  /* Inventory */\n\t\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Hotbar or Inventory\n\t\t\tAreasInOrder.push_back(m_SlotAreas[0]);  /* Chest */\n\t\t\tSuper::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, false);\n\t\t}\n\t}\n\n\n\tvirtual ~cMinecartWithChestWindow() override\n\t{\n\t\tm_ChestCart->GetWorld()->BroadcastSoundEffect(\"block.chest.close\", m_ChestCart->GetPosition(), 1, 1);\n\t}\n\nprivate:\n\tcMinecartWithChest * m_ChestCart;\n};\n\n\n\n\n"
  },
  {
    "path": "src/UI/SlotArea.cpp",
    "content": "\n// SlotArea.cpp\n\n// Implements the cSlotArea class and its descendants\n\n#include \"Globals.h\"\n#include \"SlotArea.h\"\n#include \"../Entities/Player.h\"\n#include \"../BlockEntities/BeaconEntity.h\"\n#include \"../BlockEntities/BrewingstandEntity.h\"\n#include \"../BlockEntities/ChestEntity.h\"\n#include \"../BlockEntities/DropSpenserEntity.h\"\n#include \"../BlockEntities/EnderChestEntity.h\"\n#include \"../BlockEntities/FurnaceEntity.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Items/ItemHandler.h\"\n#include \"AnvilWindow.h\"\n#include \"../CraftingRecipes.h\"\n#include \"../Root.h\"\n#include \"../FastRandom.h\"\n#include \"../BlockArea.h\"\n#include \"../EffectID.h\"\n#include \"../ClientHandle.h\"\n#include \"../Mobs/Horse.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotArea:\n\ncSlotArea::cSlotArea(int a_NumSlots, cWindow & a_ParentWindow) :\n\tm_NumSlots(a_NumSlots),\n\tm_ParentWindow(a_ParentWindow)\n{\n}\n\n\n\n\n\nvoid cSlotArea::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\t/*\n\tLOGD(\"Slot area with %d slots clicked at slot number %d, clicked item %s, slot item %s\",\n\t\tGetNumSlots(), a_SlotNum,\n\t\tItemToFullString(a_ClickedItem).c_str(),\n\t\tItemToFullString(*GetSlot(a_SlotNum, a_Player)).c_str()\n\t);\n\t*/\n\n\tASSERT((a_SlotNum >= 0) && (a_SlotNum < GetNumSlots()));\n\n\tbool bAsync = false;\n\tif (GetSlot(a_SlotNum, a_Player) == nullptr)\n\t{\n\t\tLOGWARNING(\"GetSlot(%d) returned nullptr! Ignoring click\", a_SlotNum);\n\t\treturn;\n\t}\n\n\tif (a_Player.IsGameModeSpectator())\n\t{\n\t\t// Block the action of the player and make sure, the inventory doesn't get out of sync\n\t\ta_Player.GetClientHandle()->SendInventorySlot(-1, -1, cItem());  // Reset the dragged item\n\t\tSetSlot(a_SlotNum, a_Player, *GetSlot(a_SlotNum, a_Player));  // Update the current slot\n\t\treturn;\n\t}\n\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caShiftLeftClick:\n\t\tcase caShiftRightClick:\n\t\t{\n\t\t\tShiftClicked(a_Player, a_SlotNum, a_ClickedItem);\n\t\t\treturn;\n\t\t}\n\t\tcase caDblClick:\n\t\t{\n\t\t\tDblClicked(a_Player, a_SlotNum);\n\t\t\treturn;\n\t\t}\n\t\tcase caMiddleClick:\n\t\t{\n\t\t\tMiddleClicked(a_Player, a_SlotNum);\n\t\t\treturn;\n\t\t}\n\t\tcase caDropKey:\n\t\tcase caCtrlDropKey:\n\t\t{\n\t\t\tDropClicked(a_Player, a_SlotNum, (a_ClickAction == caCtrlDropKey));\n\t\t\treturn;\n\t\t}\n\t\tcase caNumber1:\n\t\tcase caNumber2:\n\t\tcase caNumber3:\n\t\tcase caNumber4:\n\t\tcase caNumber5:\n\t\tcase caNumber6:\n\t\tcase caNumber7:\n\t\tcase caNumber8:\n\t\tcase caNumber9:\n\t\t{\n\t\t\tNumberClicked(a_Player, a_SlotNum, a_ClickAction);\n\t\t\treturn;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tif (!Slot.IsSameType(a_ClickedItem))\n\t{\n\t\tLOGWARNING(\"*** Window lost sync at item %d in SlotArea with %d items ***\", a_SlotNum, m_NumSlots);\n\t\tLOGWARNING(\"My item:    %s\", ItemToFullString(Slot).c_str());\n\t\tLOGWARNING(\"Their item: %s\", ItemToFullString(a_ClickedItem).c_str());\n\t\tbAsync = true;\n\t}\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caRightClick:\n\t\t{\n\t\t\tif (DraggingItem.m_ItemType <= 0)  // Empty-handed?\n\t\t\t{\n\t\t\t\tDraggingItem = Slot.CopyOne();  // Obtain copy of slot to preserve lore, enchantments, etc.\n\n\t\t\t\tDraggingItem.m_ItemCount = static_cast<char>(static_cast<float>(Slot.m_ItemCount) / 2.f + 0.5f);\n\t\t\t\tSlot.m_ItemCount -= DraggingItem.m_ItemCount;\n\n\t\t\t\tif (Slot.m_ItemCount <= 0)\n\t\t\t\t{\n\t\t\t\t\tSlot.Empty();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ((Slot.m_ItemType <= 0) || DraggingItem.IsEqual(Slot))\n\t\t\t{\n\t\t\t\t// Drop one item in slot\n\t\t\t\tif ((DraggingItem.m_ItemCount > 0) && (Slot.m_ItemCount < Slot.GetMaxStackSize()))\n\t\t\t\t{\n\t\t\t\t\tchar OldSlotCount = Slot.m_ItemCount;\n\n\t\t\t\t\tSlot = DraggingItem.CopyOne();  // See above\n\t\t\t\t\tOldSlotCount++;\n\t\t\t\t\tSlot.m_ItemCount = OldSlotCount;\n\n\t\t\t\t\tDraggingItem.m_ItemCount--;\n\t\t\t\t}\n\t\t\t\tif (DraggingItem.m_ItemCount <= 0)\n\t\t\t\t{\n\t\t\t\t\tDraggingItem.Empty();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (!DraggingItem.IsEqual(Slot))\n\t\t\t{\n\t\t\t\t// Swap contents\n\t\t\t\tcItem tmp(DraggingItem);\n\t\t\t\tDraggingItem = Slot;\n\t\t\t\tSlot = tmp;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase caLeftClick:\n\t\t{\n\t\t\t// Left-clicked\n\t\t\tif (!DraggingItem.IsEqual(Slot))\n\t\t\t{\n\t\t\t\t// Switch contents\n\t\t\t\tcItem tmp(DraggingItem);\n\t\t\t\tDraggingItem = Slot;\n\t\t\t\tSlot = tmp;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Same type, add items:\n\t\t\t\tint FreeSlots = DraggingItem.GetMaxStackSize() - Slot.m_ItemCount;\n\t\t\t\tif (FreeSlots < 0)\n\t\t\t\t{\n\t\t\t\t\tASSERT(!\"Bad item stack size - where did we get more items in a slot than allowed?\");\n\t\t\t\t\tFreeSlots = 0;\n\t\t\t\t}\n\t\t\t\tchar Filling = static_cast<char>((FreeSlots > DraggingItem.m_ItemCount) ? DraggingItem.m_ItemCount : FreeSlots);\n\n\t\t\t\tSlot.m_ItemCount += Filling;\n\t\t\t\tDraggingItem.m_ItemCount -= Filling;\n\t\t\t\tif (DraggingItem.m_ItemCount <= 0)\n\t\t\t\t{\n\t\t\t\t\tDraggingItem.Empty();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARNING(\"SlotArea: Unhandled click action: %d (%s)\", a_ClickAction, ClickActionToString(a_ClickAction));\n\t\t\tm_ParentWindow.BroadcastWholeWindow();\n\t\t\treturn;\n\t\t}\n\t}  // switch (a_ClickAction\n\n\tSetSlot(a_SlotNum, a_Player, Slot);\n\tif (bAsync)\n\t{\n\t\tm_ParentWindow.BroadcastWholeWindow();\n\t}\n}\n\n\n\n\n\nvoid cSlotArea::ShiftClicked(cPlayer & a_Player, int a_SlotNum, const cItem & a_ClickedItem)\n{\n\t// Make a copy of the slot, distribute it among the other areas, then update the slot to contain the leftover:\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tm_ParentWindow.DistributeStack(Slot, a_SlotNum, a_Player, this, true);\n\tif (Slot.IsEmpty())\n\t{\n\t\t// Empty the slot completely, the client doesn't like left-over ItemType with zero count\n\t\tSlot.Empty();\n\t}\n\tSetSlot(a_SlotNum, a_Player, Slot);\n\n\t// Some clients try to guess our actions and not always right (armor slots in 1.2.5), so we fix them:\n\tm_ParentWindow.BroadcastWholeWindow();\n}\n\n\n\n\n\nvoid cSlotArea::DblClicked(cPlayer & a_Player, int a_SlotNum)\n{\n\tcItem & Dragging = a_Player.GetDraggingItem();\n\tif (Dragging.IsEmpty())\n\t{\n\t\t// Move the item in the dblclicked slot into hand:\n\t\tDragging = *GetSlot(a_SlotNum, a_Player);\n\t\tcItem EmptyItem;\n\t\tSetSlot(a_SlotNum, a_Player, EmptyItem);\n\t}\n\tif (Dragging.IsEmpty())\n\t{\n\t\tLOGD(\"%s DblClicked with an empty hand over empty slot, ignoring\", a_Player.GetName().c_str());\n\t\treturn;\n\t}\n\n\t// Add as many items from the surrounding area into hand as possible:\n\t// First skip full stacks, then if there's still space, process full stacks as well:\n\tif (!m_ParentWindow.CollectItemsToHand(Dragging, *this, a_Player, false))\n\t{\n\t\tm_ParentWindow.CollectItemsToHand(Dragging, *this, a_Player, true);\n\t}\n\n\tm_ParentWindow.BroadcastWholeWindow();  // We need to broadcast, in case the window was a chest opened by multiple players\n}\n\n\n\n\n\nvoid cSlotArea::MiddleClicked(cPlayer & a_Player, int a_SlotNum)\n{\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\n\tif (!a_Player.IsGameModeCreative() || Slot.IsEmpty() || !DraggingItem.IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\tDraggingItem = Slot;\n\tDraggingItem.m_ItemCount = DraggingItem.GetMaxStackSize();\n}\n\n\n\n\n\nvoid cSlotArea::DropClicked(cPlayer & a_Player, int a_SlotNum, bool a_DropStack)\n{\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tif (Slot.IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\tcItem ItemToDrop = Slot.CopyOne();\n\tif (a_DropStack)\n\t{\n\t\tItemToDrop.m_ItemCount = Slot.m_ItemCount;\n\t}\n\n\tSlot.m_ItemCount -= ItemToDrop.m_ItemCount;\n\tif (Slot.m_ItemCount <= 0)\n\t{\n\t\tSlot.Empty();\n\t}\n\tSetSlot(a_SlotNum, a_Player, Slot);\n\n\ta_Player.TossPickup(ItemToDrop);\n}\n\n\n\n\n\nvoid cSlotArea::NumberClicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction)\n{\n\tif ((a_ClickAction < caNumber1) || (a_ClickAction > caNumber9))\n\t{\n\t\treturn;\n\t}\n\n\tint HotbarSlot = static_cast<int>(a_ClickAction - caNumber1);\n\tcItem ItemInHotbar(a_Player.GetInventory().GetHotbarSlot(HotbarSlot));\n\tcItem ItemInSlot(*GetSlot(a_SlotNum, a_Player));\n\n\t// The items are equal. Do nothing.\n\tif (ItemInHotbar.IsEqual(ItemInSlot))\n\t{\n\t\treturn;\n\t}\n\n\ta_Player.GetInventory().SetHotbarSlot(HotbarSlot, ItemInSlot);\n\tSetSlot(a_SlotNum, a_Player, ItemInHotbar);\n}\n\n\n\n\n\nvoid cSlotArea::OnPlayerAdded(cPlayer & a_Player)\n{\n\tUNUSED(a_Player);\n}\n\n\n\n\n\nvoid cSlotArea::OnPlayerRemoved(cPlayer & a_Player)\n{\n\tUNUSED(a_Player);\n}\n\n\n\n\n\nvoid cSlotArea::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tfor (int i = 0; i < m_NumSlots; i++)\n\t{\n\t\tint SlotNum = (a_BackFill) ? (m_NumSlots - 1 - i) : i;\n\n\t\tconst cItem * Slot = GetSlot(SlotNum, a_Player);\n\t\tif (!Slot->IsEqual(a_ItemStack) && (!Slot->IsEmpty() || a_KeepEmptySlots))\n\t\t{\n\t\t\t// Different items\n\t\t\tcontinue;\n\t\t}\n\t\tchar NumFit = Slot->GetMaxStackSize() - Slot->m_ItemCount;\n\t\tif (NumFit <= 0)\n\t\t{\n\t\t\t// Full stack already\n\t\t\tcontinue;\n\t\t}\n\t\tNumFit = std::min(NumFit, a_ItemStack.m_ItemCount);\n\n\t\tif (a_ShouldApply)\n\t\t{\n\t\t\tcItem NewSlot(a_ItemStack);\n\t\t\tNewSlot.m_ItemCount = Slot->m_ItemCount + NumFit;\n\t\t\tSetSlot(SlotNum, a_Player, NewSlot);\n\t\t}\n\t\ta_ItemStack.m_ItemCount -= NumFit;\n\t\tif (a_ItemStack.IsEmpty())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}  // for i - Slots\n}\n\n\n\n\n\nbool cSlotArea::CollectItemsToHand(cItem & a_Dragging, cPlayer & a_Player, bool a_CollectFullStacks)\n{\n\tint NumSlots = GetNumSlots();\n\tfor (int i = 0; i < NumSlots; i++)\n\t{\n\t\tconst cItem & SlotItem = *GetSlot(i, a_Player);\n\t\tif (!SlotItem.IsEqual(a_Dragging))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tchar ToMove = a_Dragging.GetMaxStackSize() - a_Dragging.m_ItemCount;\n\t\tif (ToMove > SlotItem.m_ItemCount)\n\t\t{\n\t\t\tToMove = SlotItem.m_ItemCount;\n\t\t}\n\t\ta_Dragging.m_ItemCount += ToMove;\n\t\tcItem NewSlot(SlotItem);\n\t\tNewSlot.m_ItemCount -= ToMove;\n\t\tSetSlot(i, a_Player, NewSlot);\n\t\tif (!NewSlot.IsEmpty())\n\t\t{\n\t\t\t// There are leftovers in the slot, so a_Dragging must be full\n\t\t\treturn true;\n\t\t}\n\t}  // for i - Slots[]\n\t// a_Dragging may be full if there were exactly the number of items needed to fill it\n\treturn a_Dragging.IsFullStack();\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaChest:\n\ncSlotAreaChest::cSlotAreaChest(cChestEntity * a_Chest, cWindow & a_ParentWindow) :\n\tcSlotArea(27, a_ParentWindow),\n\tm_Chest(a_Chest)\n{\n}\n\n\n\n\n\nconst cItem * cSlotAreaChest::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\t// a_SlotNum ranges from 0 to 26, use that to index the chest entity's inventory directly:\n\treturn &(m_Chest->GetSlot(a_SlotNum));\n}\n\n\n\n\n\nvoid cSlotAreaChest::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tm_Chest->SetSlot(a_SlotNum, a_Item);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaDoubleChest:\n\ncSlotAreaDoubleChest::cSlotAreaDoubleChest(cChestEntity * a_TopChest, cChestEntity * a_BottomChest, cWindow & a_ParentWindow) :\n\tcSlotArea(54, a_ParentWindow),\n\tm_TopChest(a_TopChest),\n\tm_BottomChest(a_BottomChest)\n{\n}\n\n\n\n\n\nconst cItem * cSlotAreaDoubleChest::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\t// a_SlotNum ranges from 0 to 53, use that to index the correct chest's inventory:\n\tif (a_SlotNum < 27)\n\t{\n\t\treturn &(m_TopChest->GetSlot(a_SlotNum));\n\t}\n\telse\n\t{\n\t\treturn &(m_BottomChest->GetSlot(a_SlotNum - 27));\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaDoubleChest::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tif (a_SlotNum < 27)\n\t{\n\t\tm_TopChest->SetSlot(a_SlotNum, a_Item);\n\t}\n\telse\n\t{\n\t\tm_BottomChest->SetSlot(a_SlotNum - 27, a_Item);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaCrafting:\n\ncSlotAreaCrafting::cSlotAreaCrafting(int a_GridSize, cWindow & a_ParentWindow) :\n\tcSlotAreaTemporary(1 + a_GridSize * a_GridSize, a_ParentWindow),\n\tm_GridSize(a_GridSize)\n{\n\tASSERT((a_GridSize == 2) || (a_GridSize == 3));\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tif (a_ClickAction == caMiddleClick)\n\t{\n\t\tMiddleClicked(a_Player, a_SlotNum);\n\t\treturn;\n\t}\n\n\t// Override for craft result slot\n\tif (a_SlotNum == 0)\n\t{\n\t\tif ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick))\n\t\t{\n\t\t\tShiftClickedResult(a_Player);\n\t\t}\n\t\telse if ((a_ClickAction == caDropKey) || (a_ClickAction == caCtrlDropKey))\n\t\t{\n\t\t\tDropClickedResult(a_Player);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tClickedResult(a_Player);\n\t\t}\n\t\treturn;\n\t}\n\n\tSuper::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem);\n\tUpdateRecipe(a_Player);\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::DblClicked(cPlayer & a_Player, int a_SlotNum)\n{\n\tif (a_SlotNum == 0)\n\t{\n\t\t// Dbl-clicking the crafting result slot shouldn't collect items to hand\n\t\treturn;\n\t}\n\tSuper::DblClicked(a_Player, a_SlotNum);\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::OnPlayerRemoved(cPlayer & a_Player)\n{\n\t// Toss all items on the crafting grid:\n\tTossItems(a_Player, 1, m_NumSlots);\n\n\t// Remove the current recipe from the player -> recipe map:\n\tfor (cRecipeMap::iterator itr = m_Recipes.begin(), end = m_Recipes.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->first == a_Player.GetUniqueID())\n\t\t{\n\t\t\t// Remove the player from the recipe map:\n\t\t\tm_Recipes.erase(itr);\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_Recipes[]\n\t// Player not found - that is acceptable\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\t// Update the recipe after setting the slot, if the slot is not the result slot:\n\tSuper::SetSlot(a_SlotNum, a_Player, a_Item);\n\tif (a_SlotNum != 0)\n\t{\n\t\tUpdateRecipe(a_Player);\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tUNUSED(a_ItemStack);\n\tUNUSED(a_Player);\n\tUNUSED(a_ShouldApply);\n\tUNUSED(a_KeepEmptySlots);\n\tUNUSED(a_BackFill);\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::ClickedResult(cPlayer & a_Player)\n{\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\n\t// Get the current recipe:\n\tcCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player);\n\tconst cItem & Result = Recipe.GetResult();\n\n\tcItem * PlayerSlots = GetPlayerSlots(a_Player) + 1;\n\tcCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize);\n\n\t// If possible, craft:\n\tif (DraggingItem.IsEmpty())\n\t{\n\t\tDraggingItem = Result;\n\t\tRecipe.ConsumeIngredients(Grid);\n\t\tGrid.CopyToItems(PlayerSlots);\n\n\t\tHandleCraftItem(Result, a_Player);\n\t}\n\telse if (DraggingItem.IsEqual(Result))\n\t{\n\t\tif (DraggingItem.m_ItemCount + Result.m_ItemCount <= Result.GetMaxStackSize())\n\t\t{\n\t\t\tDraggingItem.m_ItemCount += Result.m_ItemCount;\n\t\t\tRecipe.ConsumeIngredients(Grid);\n\t\t\tGrid.CopyToItems(PlayerSlots);\n\n\t\t\tHandleCraftItem(Result, a_Player);\n\t\t}\n\t}\n\n\t// Get the new recipe and update the result slot:\n\tUpdateRecipe(a_Player);\n\n\t// We're done. Send all changes to the client and bail out:\n\tm_ParentWindow.BroadcastWholeWindow();\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::ShiftClickedResult(cPlayer & a_Player)\n{\n\tcItem Result(*GetSlot(0, a_Player));\n\tif (Result.IsEmpty())\n\t{\n\t\treturn;\n\t}\n\ta_Player.AddKnownItem(Result);\n\tcItem * PlayerSlots = GetPlayerSlots(a_Player) + 1;\n\tfor (;;)\n\t{\n\t\t// Try distributing the result. If it fails, bail out:\n\t\tcItem ResultCopy(Result);\n\t\tm_ParentWindow.DistributeStack(ResultCopy, 0, a_Player, this, false);\n\t\tif (!ResultCopy.IsEmpty())\n\t\t{\n\t\t\t// Couldn't distribute all of it. Bail out\n\t\t\treturn;\n\t\t}\n\n\t\t// Distribute the result, this time for real:\n\t\tResultCopy = Result;\n\t\tm_ParentWindow.DistributeStack(ResultCopy, 0, a_Player, this, true);\n\n\t\t// Remove the ingredients from the crafting grid and update the recipe:\n\t\tcCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player);\n\t\tcCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize);\n\t\tRecipe.ConsumeIngredients(Grid);\n\t\tGrid.CopyToItems(PlayerSlots);\n\t\tUpdateRecipe(a_Player);\n\n\t\t// Broadcast the window, we sometimes move items to different locations than Vanilla, causing needless desyncs:\n\t\tm_ParentWindow.BroadcastWholeWindow();\n\n\t\t// Added achievements processing\n\t\tHandleCraftItem(Result, a_Player);\n\n\t\t// If the recipe has changed, bail out:\n\t\tif (!Recipe.GetResult().IsEqual(Result))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::DropClickedResult(cPlayer & a_Player)\n{\n\t// Get the current recipe:\n\tcCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player);\n\tconst cItem & Result = Recipe.GetResult();\n\n\tcItem * PlayerSlots = GetPlayerSlots(a_Player) + 1;\n\tcCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize);\n\n\ta_Player.TossPickup(Result);\n\tRecipe.ConsumeIngredients(Grid);\n\tGrid.CopyToItems(PlayerSlots);\n\n\tHandleCraftItem(Result, a_Player);\n\tUpdateRecipe(a_Player);\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::UpdateRecipe(cPlayer & a_Player)\n{\n\tcCraftingGrid   Grid(GetPlayerSlots(a_Player) + 1, m_GridSize, m_GridSize);\n\tcCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player);\n\tcRoot::Get()->GetCraftingRecipes()->GetRecipe(a_Player, Grid, Recipe);\n\tSetSlot(0, a_Player, Recipe.GetResult());\n}\n\n\n\n\n\ncCraftingRecipe & cSlotAreaCrafting::GetRecipeForPlayer(cPlayer & a_Player)\n{\n\tfor (cRecipeMap::iterator itr = m_Recipes.begin(), end = m_Recipes.end(); itr != end; ++itr)\n\t{\n\t\tif (itr->first == a_Player.GetUniqueID())\n\t\t{\n\t\t\treturn itr->second;\n\t\t}\n\t}  // for itr - m_Recipes[]\n\n\t// Not found. Add a new one:\n\tcCraftingGrid   Grid(GetPlayerSlots(a_Player) + 1, m_GridSize, m_GridSize);\n\tcCraftingRecipe Recipe(Grid);\n\tcRoot::Get()->GetCraftingRecipes()->GetRecipe(a_Player, Grid, Recipe);\n\tm_Recipes.emplace_back(a_Player.GetUniqueID(), Recipe);\n\treturn m_Recipes.back().second;\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::HandleCraftItem(const cItem & a_Result, cPlayer & a_Player)\n{\n\tswitch (a_Result.m_ItemType)\n\t{\n\t\tcase E_BLOCK_WORKBENCH:         a_Player.AwardAchievement(CustomStatistic::AchBuildWorkBench);      break;\n\t\tcase E_BLOCK_FURNACE:           a_Player.AwardAchievement(CustomStatistic::AchBuildFurnace);        break;\n\t\tcase E_BLOCK_CAKE:              a_Player.AwardAchievement(CustomStatistic::AchBakeCake);            break;\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE: a_Player.AwardAchievement(CustomStatistic::AchEnchantments);        break;\n\t\tcase E_BLOCK_BOOKCASE:          a_Player.AwardAchievement(CustomStatistic::AchBookcase);            break;\n\t\tcase E_ITEM_WOODEN_PICKAXE:     a_Player.AwardAchievement(CustomStatistic::AchBuildPickaxe);        break;\n\t\tcase E_ITEM_WOODEN_SWORD:       a_Player.AwardAchievement(CustomStatistic::AchBuildSword);          break;\n\t\tcase E_ITEM_STONE_PICKAXE:      a_Player.AwardAchievement(CustomStatistic::AchBuildBetterPickaxe);  break;\n\t\tcase E_ITEM_WOODEN_HOE:         a_Player.AwardAchievement(CustomStatistic::AchBuildHoe);            break;\n\t\tcase E_ITEM_BREAD:              a_Player.AwardAchievement(CustomStatistic::AchMakeBread);           break;\n\t\tdefault: break;\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::LoadRecipe(cPlayer & a_Player, UInt32 a_RecipeId)\n{\n\tif (a_RecipeId == 0)\n\t{\n\t\treturn;\n\t}\n\tauto Recipe = cRoot::Get()->GetCraftingRecipes()->GetRecipeById(a_RecipeId);\n\n\tint NumItems = 0;\n\tClearCraftingGrid(a_Player);\n\n\tfor (auto itrS = Recipe->m_Ingredients.begin(); itrS != Recipe->m_Ingredients.end(); ++itrS)\n\t{\n\t\tcItem * FoundItem = a_Player.GetInventory().FindItem(itrS->m_Item);\n\t\tif (FoundItem == nullptr)\n\t\t{\n\t\t\tClearCraftingGrid(a_Player);\n\t\t\tbreak;\n\t\t}\n\t\tcItem Item = FoundItem->CopyOne();\n\t\t++NumItems;\n\t\tint pos = 1 + itrS->x + m_GridSize * itrS->y;\n\t\t// Assuming there are ether shaped or unshaped recipes, no mixed ones\n\t\tif ((itrS->x == -1) && (itrS->y == -1))\n\t\t{\n\t\t\tpos = NumItems;\n\t\t}\n\t\t// Handle x wildcard\n\t\telse if (itrS->x == -1)\n\t\t{\n\t\t\tfor (int i = 0; i < m_GridSize; i++)\n\t\t\t{\n\t\t\t\tpos = 1 + i + m_GridSize * itrS->y;\n\t\t\t\tauto itemCheck = GetSlot(pos, a_Player);\n\t\t\t\tif (itemCheck->IsEmpty())\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tSetSlot(pos, a_Player, Item);\n\t\ta_Player.GetInventory().RemoveItem(Item);\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaCrafting::ClearCraftingGrid(cPlayer & a_Player)\n{\n\tfor (int pos = 1; pos <= m_GridSize * m_GridSize; pos++)\n\t{\n\t\tauto Item = GetSlot(pos, a_Player);\n\t\tif (Item->m_ItemCount > 0)\n\t\t{\n\t\t\ta_Player.GetInventory().AddItem(*Item);\n\t\t\tSetSlot(pos, a_Player, cItem());\n\t\t}\n\t}\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaAnvil:\n\ncSlotAreaAnvil::cSlotAreaAnvil(cWindow & a_ParentWindow) :\n\tcSlotAreaTemporary(3, a_ParentWindow),\n\tm_MaximumCost(0),\n\tm_StackSizeToBeUsedInRepair(0)\n{\n}\n\n\n\n\n\nvoid cSlotAreaAnvil::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tASSERT((a_SlotNum >= 0) && (a_SlotNum < GetNumSlots()));\n\tif (a_SlotNum != 2)\n\t{\n\t\tSuper::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem);\n\t\tUpdateResult(a_Player);\n\t\treturn;\n\t}\n\n\tbool bAsync = false;\n\tif (GetSlot(a_SlotNum, a_Player) == nullptr)\n\t{\n\t\tLOGWARNING(\"GetSlot(%d) returned nullptr! Ignoring click\", a_SlotNum);\n\t\treturn;\n\t}\n\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caDblClick:\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tcase caShiftLeftClick:\n\t\tcase caShiftRightClick:\n\t\t{\n\t\t\tShiftClicked(a_Player, a_SlotNum, a_ClickedItem);\n\t\t\treturn;\n\t\t}\n\t\tcase caMiddleClick:\n\t\t{\n\t\t\tMiddleClicked(a_Player, a_SlotNum);\n\t\t\treturn;\n\t\t}\n\t\tcase caDropKey:\n\t\tcase caCtrlDropKey:\n\t\t{\n\t\t\tif (CanTakeResultItem(a_Player))\n\t\t\t{\n\t\t\t\tDropClicked(a_Player, a_SlotNum, true);\n\t\t\t\tOnTakeResult(a_Player);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tif (!Slot.IsSameType(a_ClickedItem))\n\t{\n\t\tLOGWARNING(\"*** Window lost sync at item %d in SlotArea with %d items ***\", a_SlotNum, m_NumSlots);\n\t\tLOGWARNING(\"My item:    %s\", ItemToFullString(Slot).c_str());\n\t\tLOGWARNING(\"Their item: %s\", ItemToFullString(a_ClickedItem).c_str());\n\t\tbAsync = true;\n\t}\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\n\tif (Slot.IsEmpty())\n\t{\n\t\treturn;\n\t}\n\tif (!DraggingItem.IsEmpty())\n\t{\n\t\tif (!(DraggingItem.IsEqual(Slot) && ((DraggingItem.m_ItemCount + Slot.m_ItemCount) <= Slot.GetMaxStackSize())))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (!CanTakeResultItem(a_Player))\n\t{\n\t\treturn;\n\t}\n\n\tcItem NewItem = cItem(Slot);\n\tNewItem.m_ItemCount += DraggingItem.m_ItemCount;\n\n\tSlot.Empty();\n\tDraggingItem.Empty();\n\tSetSlot(a_SlotNum, a_Player, Slot);\n\n\tDraggingItem = NewItem;\n\tOnTakeResult(a_Player);\n\n\tif (bAsync)\n\t{\n\t\tm_ParentWindow.BroadcastWholeWindow();\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaAnvil::ShiftClicked(cPlayer & a_Player, int a_SlotNum, const cItem & a_ClickedItem)\n{\n\tif (a_SlotNum != 2)\n\t{\n\t\tSuper::ShiftClicked(a_Player, a_SlotNum, a_ClickedItem);\n\t\tUpdateResult(a_Player);\n\t\treturn;\n\t}\n\n\t// Make a copy of the slot, distribute it among the other areas, then update the slot to contain the leftover:\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\n\tif (Slot.IsEmpty() || !CanTakeResultItem(a_Player))\n\t{\n\t\treturn;\n\t}\n\n\tm_ParentWindow.DistributeStack(Slot, a_SlotNum, a_Player, this, true);\n\tif (Slot.IsEmpty())\n\t{\n\t\tSlot.Empty();\n\t\tOnTakeResult(a_Player);\n\t}\n\tSetSlot(a_SlotNum, a_Player, Slot);\n\n\t// Some clients try to guess our actions and not always right (armor slots in 1.2.5), so we fix them:\n\tm_ParentWindow.BroadcastWholeWindow();\n}\n\n\n\n\n\nvoid cSlotAreaAnvil::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tint SlotNum = (a_BackFill) ? (2 - 1 - i) : i;\n\n\t\tconst cItem * Slot = GetSlot(SlotNum, a_Player);\n\t\tif (!Slot->IsEqual(a_ItemStack) && (!Slot->IsEmpty() || a_KeepEmptySlots))\n\t\t{\n\t\t\t// Different items\n\t\t\tcontinue;\n\t\t}\n\t\tchar NumFit = Slot->GetMaxStackSize() - Slot->m_ItemCount;\n\t\tif (NumFit <= 0)\n\t\t{\n\t\t\t// Full stack already\n\t\t\tcontinue;\n\t\t}\n\t\tNumFit = std::min(NumFit, a_ItemStack.m_ItemCount);\n\n\t\tif (a_ShouldApply)\n\t\t{\n\t\t\tcItem NewSlot(a_ItemStack);\n\t\t\tNewSlot.m_ItemCount = Slot->m_ItemCount + NumFit;\n\t\t\tSetSlot(SlotNum, a_Player, NewSlot);\n\t\t}\n\t\ta_ItemStack.m_ItemCount -= NumFit;\n\t\tif (a_ItemStack.IsEmpty())\n\t\t{\n\t\t\tUpdateResult(a_Player);\n\t\t\treturn;\n\t\t}\n\t}  // for i - Slots\n\tUpdateResult(a_Player);\n}\n\n\n\n\n\nvoid cSlotAreaAnvil::OnTakeResult(cPlayer & a_Player)\n{\n\tif (!a_Player.IsGameModeCreative())\n\t{\n\t\ta_Player.DeltaExperience(-cPlayer::XpForLevel(m_MaximumCost));\n\t}\n\tSetSlot(0, a_Player, cItem());\n\n\tif (m_StackSizeToBeUsedInRepair > 0)\n\t{\n\t\tconst cItem * Item = GetSlot(1, a_Player);\n\t\tif (!Item->IsEmpty() && (Item->m_ItemCount > m_StackSizeToBeUsedInRepair))\n\t\t{\n\t\t\tcItem NewSecondItem(*Item);\n\t\t\tNewSecondItem.m_ItemCount -= m_StackSizeToBeUsedInRepair;\n\t\t\tm_StackSizeToBeUsedInRepair = 0;\n\t\t\tSetSlot(1, a_Player, NewSecondItem);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSetSlot(1, a_Player, cItem());\n\t\t}\n\t}\n\telse\n\t{\n\t\tSetSlot(1, a_Player, cItem());\n\t}\n\tm_ParentWindow.SetProperty(0, static_cast<short>(m_MaximumCost));\n\n\tm_MaximumCost = 0;\n\tstatic_cast<cAnvilWindow &>(m_ParentWindow).SetRepairedItemName(\"\", nullptr);\n\n\tconst Vector3i BlockPos = static_cast<cAnvilWindow &>(m_ParentWindow).GetBlockPos();\n\n\tBLOCKTYPE Block;\n\tNIBBLETYPE BlockMeta;\n\n\tif (\n\t\ta_Player.GetWorld()->GetBlockTypeMeta(BlockPos, Block, BlockMeta) &&\n\t\t!a_Player.IsGameModeCreative() && (Block == E_BLOCK_ANVIL) &&\n\t\tGetRandomProvider().RandBool(0.12)\n\t)\n\t{\n\t\tNIBBLETYPE Orientation = BlockMeta & 0x3;\n\t\tNIBBLETYPE AnvilDamage = BlockMeta >> 2;\n\t\t++AnvilDamage;\n\n\t\tif (AnvilDamage > 2)\n\t\t{\n\t\t\t// Anvil will break\n\t\t\ta_Player.GetWorld()->SetBlock(BlockPos, E_BLOCK_AIR, 0);\n\t\t\ta_Player.GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_ANVIL_BREAK, BlockPos, 0);\n\t\t\ta_Player.CloseWindow(false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta_Player.GetWorld()->SetBlockMeta(BlockPos, static_cast<NIBBLETYPE>(Orientation | (AnvilDamage << 2)));\n\t\t\ta_Player.GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_ANVIL_USE, BlockPos, 0);\n\t\t}\n\t}\n\telse\n\t{\n\t\ta_Player.GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_ANVIL_USE, BlockPos, 0);\n\t}\n}\n\n\n\n\n\nbool cSlotAreaAnvil::CanTakeResultItem(cPlayer & a_Player)\n{\n\treturn (\n\t\t\t(\n\t\t\t\ta_Player.IsGameModeCreative() ||              // Is the player in gamemode?\n\t\t\t\t(a_Player.GetXpLevel() >= m_MaximumCost)      // or the player have enough exp?\n\t\t\t) &&\n\t\t\t(!GetSlot(2, a_Player)->IsEmpty()) &&             // Is a item in the result slot?\n\t\t\t(m_MaximumCost > 0)                               // When no maximum cost is set, the item isn't set from the UpdateResult() method and can't be a valid enchanting result.\n\t);\n}\n\n\n\n\n\nvoid cSlotAreaAnvil::OnPlayerRemoved(cPlayer & a_Player)\n{\n\tTossItems(a_Player, 0, 2);\n\tSuper::OnPlayerRemoved(a_Player);\n}\n\n\n\n\n\nvoid cSlotAreaAnvil::UpdateResult(cPlayer & a_Player)\n{\n\tconst cItem Target(*GetSlot(0, a_Player));\n\tconst cItem Sacrifice(*GetSlot(1, a_Player));\n\n\t// Output initialised as copy of target.\n\tcItem Output(Target);\n\n\tif (Target.IsEmpty())\n\t{\n\t\tOutput.Empty();\n\t\tSetSlot(2, a_Player, Output);\n\t\tm_ParentWindow.SetProperty(0, 0);\n\t\tm_MaximumCost = 0;\n\t\treturn;\n\t}\n\n\tm_MaximumCost = 0;\n\tm_StackSizeToBeUsedInRepair = 0;\n\tint RepairCost = Target.m_RepairCost;\n\tint NeedExp = 0;\n\tif (!Sacrifice.IsEmpty())\n\t{\n\t\tRepairCost += Sacrifice.m_RepairCost;\n\n\t\t// Can we repair with sacrifce material?\n\t\tif (Target.IsDamageable() && Target.GetHandler().CanRepairWithRawMaterial(Sacrifice.m_ItemType))\n\t\t{\n\t\t\t// Tool and armor repair with special item (iron / gold / diamond / ...)\n\t\t\tint DamageDiff = std::min(static_cast<int>(Target.m_ItemDamage), static_cast<int>(Target.GetMaxDamage()) / 4);\n\t\t\tif (DamageDiff <= 0)\n\t\t\t{\n\t\t\t\t// No enchantment\n\t\t\t\tOutput.Empty();\n\t\t\t\tSetSlot(2, a_Player, Output);\n\t\t\t\tm_ParentWindow.SetProperty(0, 0);\n\t\t\t\tm_MaximumCost = 0;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tchar NumItemsConsumed = 0;\n\n\t\t\t// Repair until out of materials, or fully repaired:\n\t\t\twhile ((DamageDiff > 0) && (NumItemsConsumed < Sacrifice.m_ItemCount))\n\t\t\t{\n\t\t\t\tOutput.m_ItemDamage -= static_cast<char>(DamageDiff);\n\t\t\t\tNeedExp += std::max(1, DamageDiff / 100) + static_cast<int>(Target.m_Enchantments.Count());\n\t\t\t\tDamageDiff = std::min(static_cast<int>(Output.m_ItemDamage), static_cast<int>(Target.GetMaxDamage()) / 4);\n\n\t\t\t\t++NumItemsConsumed;\n\t\t\t}\n\t\t\tm_StackSizeToBeUsedInRepair = NumItemsConsumed;\n\t\t}\n\t\telse  // Combining tools / armour\n\t\t{\n\t\t\tconst bool IsEnchantBook = (Sacrifice.m_ItemType == E_ITEM_ENCHANTED_BOOK);\n\n\t\t\t// No result if we can't combine the items\n\t\t\tif (!IsEnchantBook && (!Target.IsSameType(Sacrifice) || !Target.IsDamageable()))\n\t\t\t{\n\t\t\t\t// No enchantment\n\t\t\t\tOutput.Empty();\n\t\t\t\tSetSlot(2, a_Player, Output);\n\t\t\t\tm_ParentWindow.SetProperty(0, 0);\n\t\t\t\tm_MaximumCost = 0;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Can we repair with sacrifice tool / armour?\n\t\t\tif (Target.IsDamageable() && !IsEnchantBook && (Target.m_ItemDamage!=0))\n\t\t\t{\n\t\t\t\t// Durability = MaxDamage - m_ItemDamage = how far from broken\n\t\t\t\tconst short TargetDurability = Target.GetMaxDamage() - Target.m_ItemDamage;\n\t\t\t\tconst short SacrificeDurability = Sacrifice.GetMaxDamage() - Sacrifice.m_ItemDamage;\n\n\t\t\t\t// How much durability to repair by.\n\t\t\t\tconst short RepairDurability = SacrificeDurability + Target.GetMaxDamage() * 12 / 100;\n\n\t\t\t\t// Don't give item a negative damage:\n\t\t\t\tshort NewItemDamage = std::max<short>(Target.GetMaxDamage() - (TargetDurability + RepairDurability), 0);\n\n\t\t\t\tif (NewItemDamage < Target.m_ItemDamage)\n\t\t\t\t{\n\t\t\t\t\tOutput.m_ItemDamage = NewItemDamage;\n\t\t\t\t\tNeedExp += std::max(1, RepairDurability / 100);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the enchantments from the sacrifice to the target\n\t\t\tint EnchantmentCost = Output.AddEnchantmentsFromItem(Sacrifice);\n\t\t\tNeedExp += EnchantmentCost;\n\t\t}\n\t}\n\n\tint NameChangeExp = 0;\n\tconst AString & RepairedItemName = static_cast<cAnvilWindow*>(&m_ParentWindow)->GetRepairedItemName();\n\tif (RepairedItemName.empty())\n\t{\n\t\t// Remove custom name\n\t\tif (!Target.m_CustomName.empty())\n\t\t{\n\t\t\tNameChangeExp = (Target.IsDamageable()) ? 7 : (Target.m_ItemCount * 5);\n\t\t\tNeedExp += NameChangeExp;\n\t\t\tOutput.m_CustomName = \"\";\n\t\t}\n\t}\n\telse if (RepairedItemName != Target.m_CustomName)\n\t{\n\t\t// Change custom name\n\t\tNameChangeExp = (Target.IsDamageable()) ? 7 : (Target.m_ItemCount * 5);\n\t\tNeedExp += NameChangeExp;\n\n\t\tif (!Target.m_CustomName.empty())\n\t\t{\n\t\t\tRepairCost += NameChangeExp / 2;\n\t\t}\n\n\t\tOutput.m_CustomName = RepairedItemName;\n\t}\n\n\tm_MaximumCost = RepairCost + NeedExp;\n\n\tif (NeedExp < 0)\n\t{\n\t\tOutput.Empty();\n\t}\n\n\tif ((NameChangeExp == NeedExp) && (NameChangeExp > 0) && (m_MaximumCost >= 40))\n\t{\n\t\tm_MaximumCost = 39;\n\t}\n\tif ((m_MaximumCost >= 40) && !a_Player.IsGameModeCreative())\n\t{\n\t\tOutput.Empty();\n\t}\n\n\tif (!Output.IsEmpty())\n\t{\n\t\tRepairCost = std::max(Target.m_RepairCost, Sacrifice.m_RepairCost);\n\t\tif (!Output.m_CustomName.empty())\n\t\t{\n\t\t\tRepairCost -= 9;\n\t\t}\n\t\tRepairCost = std::max(RepairCost, 0);\n\t\tRepairCost += 2;\n\t\tOutput.m_RepairCost = RepairCost;\n\t}\n\n\t// If after everything, output will be the same then no point enchanting:\n\tif (Target.IsEqual(Output))\n\t{\n\t\tOutput.Empty();\n\t\tm_MaximumCost = 0;\n\t}\n\n\tSetSlot(2, a_Player, Output);\n\tm_ParentWindow.SetProperty(0, static_cast<Int16>(m_MaximumCost));\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaBeacon:\n\ncSlotAreaBeacon::cSlotAreaBeacon(cBeaconEntity * a_Beacon, cWindow & a_ParentWindow) :\n\tcSlotArea(1, a_ParentWindow),\n\tm_Beacon(a_Beacon)\n{\n\tm_Beacon->GetContents().AddListener(*this);\n}\n\n\n\n\n\ncSlotAreaBeacon::~cSlotAreaBeacon()\n{\n\tm_Beacon->GetContents().RemoveListener(*this);\n}\n\n\n\n\n\nbool cSlotAreaBeacon::IsPlaceableItem(short a_ItemType)\n{\n\tswitch (a_ItemType)\n\t{\n\t\tcase E_ITEM_EMERALD:\n\t\tcase E_ITEM_DIAMOND:\n\t\tcase E_ITEM_GOLD:\n\t\tcase E_ITEM_IRON:\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaBeacon::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tASSERT((a_SlotNum >= 0) && (a_SlotNum < GetNumSlots()));\n\n\tbool bAsync = false;\n\tif (GetSlot(a_SlotNum, a_Player) == nullptr)\n\t{\n\t\tLOGWARNING(\"GetSlot(%d) returned nullptr! Ignoring click\", a_SlotNum);\n\t\treturn;\n\t}\n\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caShiftLeftClick:\n\t\tcase caShiftRightClick:\n\t\t{\n\t\t\tShiftClicked(a_Player, a_SlotNum, a_ClickedItem);\n\t\t\treturn;\n\t\t}\n\t\tcase caMiddleClick:\n\t\t{\n\t\t\tMiddleClicked(a_Player, a_SlotNum);\n\t\t\treturn;\n\t\t}\n\t\tcase caDropKey:\n\t\tcase caCtrlDropKey:\n\t\t{\n\t\t\tDropClicked(a_Player, a_SlotNum, false);\n\t\t\treturn;\n\t\t}\n\t\tcase caNumber1:\n\t\tcase caNumber2:\n\t\tcase caNumber3:\n\t\tcase caNumber4:\n\t\tcase caNumber5:\n\t\tcase caNumber6:\n\t\tcase caNumber7:\n\t\tcase caNumber8:\n\t\tcase caNumber9:\n\t\t{\n\t\t\tNumberClicked(a_Player, a_SlotNum, a_ClickAction);\n\t\t\treturn;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tif (!Slot.IsSameType(a_ClickedItem))\n\t{\n\t\tLOGWARNING(\"*** Window lost sync at item %d in SlotArea with %d items ***\", a_SlotNum, m_NumSlots);\n\t\tLOGWARNING(\"My item:    %s\", ItemToFullString(Slot).c_str());\n\t\tLOGWARNING(\"Their item: %s\", ItemToFullString(a_ClickedItem).c_str());\n\t\tbAsync = true;\n\t}\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\n\tif (DraggingItem.IsEmpty())\n\t{\n\t\tDraggingItem = Slot;\n\t\tSlot.Empty();\n\t}\n\telse if (Slot.IsEmpty())\n\t{\n\t\tif (!IsPlaceableItem(DraggingItem.m_ItemType))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tSlot = DraggingItem.CopyOne();\n\t\tDraggingItem.m_ItemCount -= 1;\n\t\tif (DraggingItem.m_ItemCount <= 0)\n\t\t{\n\t\t\tDraggingItem.Empty();\n\t\t}\n\t}\n\telse if (DraggingItem.m_ItemCount == 1)\n\t{\n\t\tif (!IsPlaceableItem(DraggingItem.m_ItemCount))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Switch contents\n\t\tcItem tmp(DraggingItem);\n\t\tDraggingItem = Slot;\n\t\tSlot = tmp;\n\t}\n\n\tSetSlot(a_SlotNum, a_Player, Slot);\n\tif (bAsync)\n\t{\n\t\tm_ParentWindow.BroadcastWholeWindow();\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaBeacon::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tconst cItem * Slot = GetSlot(0, a_Player);\n\tif (!Slot->IsEmpty() || !IsPlaceableItem(a_ItemStack.m_ItemType) || (a_ItemStack.m_ItemCount != 1))\n\t{\n\t\treturn;\n\t}\n\n\tif (a_ShouldApply)\n\t{\n\t\tSetSlot(0, a_Player, a_ItemStack.CopyOne());\n\t}\n\ta_ItemStack.Empty();\n}\n\n\n\n\n\nconst cItem * cSlotAreaBeacon::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\tUNUSED(a_Player);\n\treturn &(m_Beacon->GetSlot(a_SlotNum));\n}\n\n\n\n\n\nvoid cSlotAreaBeacon::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tUNUSED(a_Player);\n\tm_Beacon->SetSlot(a_SlotNum, a_Item);\n}\n\n\n\n\n\nvoid cSlotAreaBeacon::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)\n{\n\tUNUSED(a_SlotNum);\n\t// Something has changed in the window, broadcast the entire window to all clients\n\tASSERT(a_ItemGrid == &(m_Beacon->GetContents()));\n\n\tm_ParentWindow.BroadcastWholeWindow();\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaEnchanting:\n\ncSlotAreaEnchanting::cSlotAreaEnchanting(cWindow & a_ParentWindow, Vector3i a_BlockPos) :\n\tcSlotAreaTemporary(2, a_ParentWindow),\n\tm_BlockPos(a_BlockPos)\n{\n}\n\n\n\n\n\nvoid cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tASSERT((a_SlotNum >= 0) && (a_SlotNum < GetNumSlots()));\n\n\tbool bAsync = false;\n\tif (GetSlot(a_SlotNum, a_Player) == nullptr)\n\t{\n\t\tLOGWARNING(\"GetSlot(%d) returned nullptr! Ignoring click\", a_SlotNum);\n\t\treturn;\n\t}\n\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caShiftLeftClick:\n\t\tcase caShiftRightClick:\n\t\t{\n\t\t\tShiftClicked(a_Player, a_SlotNum, a_ClickedItem);\n\t\t\treturn;\n\t\t}\n\t\tcase caDblClick:\n\t\t{\n\t\t\tDblClicked(a_Player, a_SlotNum);\n\t\t\treturn;\n\t\t}\n\t\tcase caMiddleClick:\n\t\t{\n\t\t\tMiddleClicked(a_Player, a_SlotNum);\n\t\t\treturn;\n\t\t}\n\t\tcase caDropKey:\n\t\tcase caCtrlDropKey:\n\t\t{\n\t\t\tDropClicked(a_Player, a_SlotNum, false);\n\t\t\treturn;\n\t\t}\n\t\tcase caNumber1:\n\t\tcase caNumber2:\n\t\tcase caNumber3:\n\t\tcase caNumber4:\n\t\tcase caNumber5:\n\t\tcase caNumber6:\n\t\tcase caNumber7:\n\t\tcase caNumber8:\n\t\tcase caNumber9:\n\t\t{\n\t\t\tNumberClicked(a_Player, a_SlotNum, a_ClickAction);\n\t\t\treturn;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tif (!Slot.IsSameType(a_ClickedItem))\n\t{\n\t\tLOGWARNING(\"*** Window lost sync at item %d in SlotArea with %d items ***\", a_SlotNum, m_NumSlots);\n\t\tLOGWARNING(\"My item:    %s\", ItemToFullString(Slot).c_str());\n\t\tLOGWARNING(\"Their item: %s\", ItemToFullString(a_ClickedItem).c_str());\n\t\tbAsync = true;\n\t}\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\tif (a_SlotNum == 1)\n\t{\n\t\t// Lapis slot can have a full stack handle it normally, also check for empty hand\n\t\tif ((DraggingItem.IsEmpty()) || ((DraggingItem.m_ItemType == E_ITEM_DYE) && (DraggingItem.m_ItemDamage == E_META_DYE_BLUE)))\n\t\t{\n\t\t\treturn cSlotArea::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem);\n\t\t}\n\n\t\tif (bAsync)\n\t\t{\n\t\t\tm_ParentWindow.BroadcastWholeWindow();\n\t\t}\n\t\treturn;\n\t}\n\t// Slot 0 is where the item to enhance goes.\n\tif (DraggingItem.IsEmpty())\n\t{\n\t\t// DraggingItem is empty -> Switch draggingitem and slot\n\t\tif (!Slot.IsEmpty())\n\t\t{\n\t\t\tstd::swap(DraggingItem, Slot);\n\t\t}\n\t}\n\telse if (Slot.IsEmpty())\n\t{\n\t\t// DraggingItem isn't empty and slot is empty -> Set one dragging item in the slot\n\t\tSlot = DraggingItem.CopyOne();\n\t\tDraggingItem.m_ItemCount -= 1;\n\n\t\tif (DraggingItem.m_ItemCount <= 0)\n\t\t{\n\t\t\tDraggingItem.Empty();\n\t\t}\n\t}\n\telse if ((DraggingItem.m_ItemCount == 1) && !DraggingItem.IsEqual(Slot))\n\t{\n\t\t// DraggingItem and slot aren't empty -> Switch items\n\t\tstd::swap(DraggingItem, Slot);\n\t}\n\n\tSetSlot(a_SlotNum, a_Player, Slot);\n\tif (bAsync)\n\t{\n\t\tm_ParentWindow.BroadcastWholeWindow();\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaEnchanting::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_Apply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tif ((a_ItemStack.m_ItemType == E_ITEM_DYE) && (a_ItemStack.m_ItemDamage == E_META_DYE_BLUE))\n\t{\n\t\t// It's lapis, put it in the lapis spot.\n\t\tconst cItem * Slot = GetSlot(1, a_Player);\n\t\tchar NumFit = Slot->GetMaxStackSize() - Slot->m_ItemCount;\n\t\tif (NumFit <= 0)\n\t\t{\n\t\t\t// Full stack already\n\t\t\treturn;\n\t\t}\n\t\tNumFit = std::min(NumFit, a_ItemStack.m_ItemCount);\n\n\t\tif (a_Apply)\n\t\t{\n\t\t\tcItem NewSlot(a_ItemStack);\n\t\t\tNewSlot.m_ItemCount = Slot->m_ItemCount + NumFit;\n\t\t\tSetSlot(1, a_Player, NewSlot);\n\t\t}\n\t\ta_ItemStack.m_ItemCount -= NumFit;\n\t\t// Return so we don't put overflow into the enchantment slot\n\t\treturn;\n\t}\n\tconst cItem * Slot = GetSlot(0, a_Player);\n\tif (!Slot->IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\tif (a_Apply)\n\t{\n\t\tSetSlot(0, a_Player, a_ItemStack.CopyOne());\n\t}\n\ta_ItemStack.m_ItemCount -= 1;\n\tif (a_ItemStack.m_ItemCount <= 0)\n\t{\n\t\ta_ItemStack.Empty();\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaEnchanting::OnPlayerAdded(cPlayer & a_Player)\n{\n\tSuper::OnPlayerAdded(a_Player);\n\tUpdateResult(a_Player);\n}\n\n\n\n\n\nvoid cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player)\n{\n\t// Toss the item in the enchanting slot, as well as lapis\n\tTossItems(a_Player, 0, m_NumSlots);\n\n\tSuper::OnPlayerRemoved(a_Player);\n}\n\n\n\n\n\nvoid cSlotAreaEnchanting::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tSuper::SetSlot(a_SlotNum, a_Player, a_Item);\n\tUpdateResult(a_Player);\n}\n\n\n\n\n\nvoid cSlotAreaEnchanting::UpdateResult(cPlayer & a_Player)\n{\n\tcItem Item = *GetSlot(0, a_Player);\n\n\tif (!cItem::IsEnchantable(Item.m_ItemType) || !Item.m_Enchantments.IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\t// Pseudocode found at: https://minecraft.wiki/w/Enchanting_mechanics\n\tconst auto Bookshelves = std::min(GetBookshelvesCount(*a_Player.GetWorld()), 15U);\n\n\t// A PRNG initialised using the player's enchantment seed.\n\tauto Random = a_Player.GetEnchantmentRandomProvider();\n\n\t// Calculate the levels for the offered enchantment options:\n\tconst auto Base = (Random.RandInt(1U, 8U) + (Bookshelves / 2) + Random.RandInt(0U, Bookshelves));\n\tconst std::array<unsigned, 3> OptionLevels\n\t{\n\t\tstd::max(Base / 3, 1U),\n\t\t(Base * 2) / 3 + 1,\n\t\tstd::max(Base, Bookshelves * 2)\n\t};\n\n\t// Properties set according to: https://wiki.vg/Protocol#Window_Property\n\t// Fake a \"seed\" for the client to draw Standard Galactic Alphabet glyphs:\n\tm_ParentWindow.SetProperty(3, Random.RandInt<short>());\n\n\t// Calculate an enchanting possibility for each option (top, middle and bottom) and send details to window:\n\tfor (size_t i = 0; i != OptionLevels.size(); i++)\n\t{\n\t\t// A copy of the item.\n\t\tcItem EnchantedItem = Item.CopyOne();\n\n\t\t// Enchant based on the number of levels:\n\t\tEnchantedItem.EnchantByXPLevels(OptionLevels[i], Random);\n\n\t\tLOGD(\"Generated enchanted item %d with enchantments: %s\", i, EnchantedItem.m_Enchantments.ToString());\n\n\t\t// Send the level requirement for the enchantment option:\n\t\tm_ParentWindow.SetProperty(i, static_cast<short>(OptionLevels[i]));\n\n\t\t// Get the first enchantment ID, which must exist:\n\t\tASSERT(EnchantedItem.m_Enchantments.begin() != EnchantedItem.m_Enchantments.end());\n\t\tconst auto EnchantmentID = static_cast<short>(EnchantedItem.m_Enchantments.begin()->first);\n\n\t\t// Send the enchantment ID of the first enchantment on our item:\n\t\tm_ParentWindow.SetProperty(4 + i, EnchantmentID);\n\n\t\tconst auto EnchantmentLevel = static_cast<short>(EnchantedItem.m_Enchantments.GetLevel(EnchantmentID));\n\t\tASSERT(EnchantmentLevel > 0);\n\n\t\t// Send the level for the first enchantment on our item:\n\t\tm_ParentWindow.SetProperty(7 + i, EnchantmentLevel);\n\n\t\t// Store the item we've enchanted as an option to be retrieved later:\n\t\tm_EnchantedItemOptions[i] = std::move(EnchantedItem);\n\t}\n}\n\n\n\n\n\nunsigned cSlotAreaEnchanting::GetBookshelvesCount(cWorld & a_World)\n{\n\tcBlockArea Area;\n\tArea.Read(a_World, m_BlockPos - Vector3i(2, 0, 2), m_BlockPos + Vector3i(2, 1, 2));\n\n\tstatic const struct\n\t{\n\t\tint m_BookX, m_BookY, m_BookZ;  // Coords to check for bookcases\n\t\tint m_AirX, m_AirY, m_AirZ;  // Coords to check for air; if not air, the bookcase won't be counted\n\t} CheckCoords[] =\n\t{\n\t\t{ 0, 0, 0, 1, 0, 1 },  // Bookcase at {0, 0, 0}, air at {1, 0, 1}\n\t\t{ 0, 0, 1, 1, 0, 1 },  // Bookcase at {0, 0, 1}, air at {1, 0, 1}\n\t\t{ 0, 0, 2, 1, 0, 2 },  // Bookcase at {0, 0, 2}, air at {1, 0, 2}\n\t\t{ 0, 0, 3, 1, 0, 3 },  // Bookcase at {0, 0, 3}, air at {1, 0, 3}\n\t\t{ 0, 0, 4, 1, 0, 3 },  // Bookcase at {0, 0, 4}, air at {1, 0, 3}\n\t\t{ 1, 0, 4, 1, 0, 3 },  // Bookcase at {1, 0, 4}, air at {1, 0, 3}\n\t\t{ 2, 0, 4, 2, 0, 3 },  // Bookcase at {2, 0, 4}, air at {2, 0, 3}\n\t\t{ 3, 0, 4, 3, 0, 3 },  // Bookcase at {3, 0, 4}, air at {3, 0, 3}\n\t\t{ 4, 0, 4, 3, 0, 3 },  // Bookcase at {4, 0, 4}, air at {3, 0, 3}\n\t\t{ 4, 0, 3, 3, 0, 3 },  // Bookcase at {4, 0, 3}, air at {3, 0, 3}\n\t\t{ 4, 0, 2, 3, 0, 2 },  // Bookcase at {4, 0, 2}, air at {3, 0, 2}\n\t\t{ 4, 0, 1, 3, 0, 1 },  // Bookcase at {4, 0, 1}, air at {3, 0, 1}\n\t\t{ 4, 0, 0, 3, 0, 1 },  // Bookcase at {4, 0, 0}, air at {3, 0, 1}\n\t\t{ 3, 0, 0, 3, 0, 1 },  // Bookcase at {3, 0, 0}, air at {3, 0, 1}\n\t\t{ 2, 0, 0, 2, 0, 1 },  // Bookcase at {2, 0, 0}, air at {2, 0, 1}\n\t\t{ 1, 0, 0, 1, 0, 1 },  // Bookcase at {1, 0, 0}, air at {1, 0, 1}\n\n\t\t{ 0, 1, 0, 1, 1, 1 },  // Bookcase at {0, 1, 0}, air at {1, 1, 1}\n\t\t{ 0, 1, 1, 1, 1, 1 },  // Bookcase at {0, 1, 1}, air at {1, 1, 1}\n\t\t{ 0, 1, 2, 1, 1, 2 },  // Bookcase at {0, 1, 2}, air at {1, 1, 2}\n\t\t{ 0, 1, 3, 1, 1, 3 },  // Bookcase at {0, 1, 3}, air at {1, 1, 3}\n\t\t{ 0, 1, 4, 1, 1, 3 },  // Bookcase at {0, 1, 4}, air at {1, 1, 3}\n\t\t{ 1, 1, 4, 1, 1, 3 },  // Bookcase at {1, 1, 4}, air at {1, 1, 3}\n\t\t{ 2, 1, 4, 2, 1, 3 },  // Bookcase at {2, 1, 4}, air at {2, 1, 3}\n\t\t{ 3, 1, 4, 3, 1, 3 },  // Bookcase at {3, 1, 4}, air at {3, 1, 3}\n\t\t{ 4, 1, 4, 3, 1, 3 },  // Bookcase at {4, 1, 4}, air at {3, 1, 3}\n\t\t{ 4, 1, 3, 3, 1, 3 },  // Bookcase at {4, 1, 3}, air at {3, 1, 3}\n\t\t{ 4, 1, 2, 3, 1, 2 },  // Bookcase at {4, 1, 2}, air at {3, 1, 2}\n\t\t{ 4, 1, 1, 3, 1, 1 },  // Bookcase at {4, 1, 1}, air at {3, 1, 1}\n\t\t{ 4, 1, 0, 3, 1, 1 },  // Bookcase at {4, 1, 0}, air at {3, 1, 1}\n\t\t{ 3, 1, 0, 3, 1, 1 },  // Bookcase at {3, 1, 0}, air at {3, 1, 1}\n\t\t{ 2, 1, 0, 2, 1, 1 },  // Bookcase at {2, 1, 0}, air at {2, 1, 1}\n\t\t{ 1, 1, 0, 1, 1, 1 },  // Bookcase at {1, 1, 0}, air at {1, 1, 1}\n\t};\n\n\tunsigned Bookshelves = 0;\n\n\tfor (size_t i = 0; i < ARRAYCOUNT(CheckCoords); i++)\n\t{\n\t\tif (\n\t\t\t(Area.GetRelBlockType(CheckCoords[i].m_AirX, CheckCoords[i].m_AirY, CheckCoords[i].m_AirZ) == E_BLOCK_AIR) &&  // There's air in the checkspot\n\t\t\t(Area.GetRelBlockType(CheckCoords[i].m_BookX, CheckCoords[i].m_BookY, CheckCoords[i].m_BookZ) == E_BLOCK_BOOKCASE)  // There's bookcase in the wanted place\n\t\t)\n\t\t{\n\t\t\tBookshelves++;\n\t\t}\n\t}  // for i - CheckCoords\n\n\treturn Bookshelves;\n}\n\n\n\n\n\ncItem cSlotAreaEnchanting::SelectEnchantedOption(size_t a_EnchantOption)\n{\n\tASSERT(a_EnchantOption < m_EnchantedItemOptions.size());\n\treturn std::move(m_EnchantedItemOptions[a_EnchantOption]);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaEnderChest:\n\ncSlotAreaEnderChest::cSlotAreaEnderChest(cEnderChestEntity * a_EnderChest, cWindow & a_ParentWindow) :\n\tcSlotArea(27, a_ParentWindow),\n\tm_EnderChest(a_EnderChest)\n{\n}\n\n\n\n\n\nconst cItem * cSlotAreaEnderChest::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\treturn &(a_Player.GetEnderChestContents().GetSlot(a_SlotNum));\n}\n\n\n\n\n\nvoid cSlotAreaEnderChest::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\ta_Player.GetEnderChestContents().SetSlot(a_SlotNum, a_Item);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaFurnace:\n\ncSlotAreaFurnace::cSlotAreaFurnace(cFurnaceEntity * a_Furnace, cWindow & a_ParentWindow) :\n\tcSlotArea(3, a_ParentWindow),\n\tm_Furnace(a_Furnace)\n{\n\tm_Furnace->GetContents().AddListener(*this);\n}\n\n\n\n\n\ncSlotAreaFurnace::~cSlotAreaFurnace()\n{\n\tm_Furnace->GetContents().RemoveListener(*this);\n}\n\n\n\n\n\nvoid cSlotAreaFurnace::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tif (m_Furnace == nullptr)\n\t{\n\t\tLOGERROR(\"cSlotAreaFurnace::Clicked(): m_Furnace == nullptr\");\n\t\tASSERT(!\"cSlotAreaFurnace::Clicked(): m_Furnace == nullptr\");\n\t\treturn;\n\t}\n\n\tif (a_SlotNum == 1)\n\t{\n\t\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\t\tcFurnaceRecipe * FurnaceRecipes = cRoot::Get()->GetFurnaceRecipe();\n\n\t\t// Do not allow non-fuels to be placed in the fuel slot:\n\t\tif (!DraggingItem.IsEmpty() && !FurnaceRecipes->IsFuel(DraggingItem) && (a_ClickAction != caShiftLeftClick) && (a_ClickAction != caShiftRightClick))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\telse if (a_SlotNum == 2)\n\t{\n\t\tbool bAsync = false;\n\t\tif (GetSlot(a_SlotNum, a_Player) == nullptr)\n\t\t{\n\t\t\tLOGWARNING(\"GetSlot(%d) returned nullptr! Ignoring click\", a_SlotNum);\n\t\t\treturn;\n\t\t}\n\n\t\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\t\tif (!Slot.IsSameType(a_ClickedItem))\n\t\t{\n\t\t\tLOGWARNING(\"*** Window lost sync at item %d in SlotArea with %d items ***\", a_SlotNum, m_NumSlots);\n\t\t\tLOGWARNING(\"My item:    %s\", ItemToFullString(Slot).c_str());\n\t\t\tLOGWARNING(\"Their item: %s\", ItemToFullString(a_ClickedItem).c_str());\n\t\t\tbAsync = true;\n\t\t}\n\n\t\tswitch (a_ClickAction)\n\t\t{\n\t\t\tcase caShiftLeftClick:\n\t\t\tcase caShiftRightClick:\n\t\t\t{\n\t\t\t\tHandleSmeltItem(Slot, a_Player);\n\t\t\t\tShiftClicked(a_Player, a_SlotNum, Slot);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase caMiddleClick:\n\t\t\t{\n\t\t\t\tMiddleClicked(a_Player, a_SlotNum);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase caDropKey:\n\t\t\tcase caCtrlDropKey:\n\t\t\t{\n\t\t\t\tDropClicked(a_Player, a_SlotNum, (a_SlotNum == caCtrlDropKey));\n\t\t\t\tSlot.m_ItemCount = Slot.m_ItemCount - GetSlot(a_SlotNum, a_Player)->m_ItemCount;\n\t\t\t\tHandleSmeltItem(Slot, a_Player);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\t\tif (!DraggingItem.IsEmpty())\n\t\t{\n\t\t\tif (a_ClickAction == caDblClick)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!DraggingItem.IsEqual(Slot))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ((DraggingItem.m_ItemCount + Slot.m_ItemCount) > Slot.GetMaxStackSize())\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tDraggingItem.m_ItemCount += Slot.m_ItemCount;\n\t\t\tHandleSmeltItem(Slot, a_Player);\n\t\t\tSlot.Empty();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (a_ClickAction)\n\t\t\t{\n\t\t\t\tcase caDblClick:\n\t\t\t\t{\n\t\t\t\t\tDblClicked(a_Player, a_SlotNum);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase caLeftClick:\n\t\t\t\t{\n\t\t\t\t\tDraggingItem = Slot;\n\t\t\t\t\tHandleSmeltItem(Slot, a_Player);\n\t\t\t\t\tSlot.Empty();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase caRightClick:\n\t\t\t\t{\n\t\t\t\t\tDraggingItem = Slot.CopyOne();\n\t\t\t\t\tDraggingItem.m_ItemCount = static_cast<char>(static_cast<float>(Slot.m_ItemCount) / 2.f + 0.5f);\n\t\t\t\t\tSlot.m_ItemCount -= DraggingItem.m_ItemCount;\n\n\t\t\t\t\tif (Slot.m_ItemCount <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tSlot.Empty();\n\t\t\t\t\t}\n\t\t\t\t\tHandleSmeltItem(DraggingItem, a_Player);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tASSERT(!\"Unhandled click type!\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSetSlot(a_SlotNum, a_Player, Slot);\n\t\tif (bAsync)\n\t\t{\n\t\t\tm_ParentWindow.BroadcastWholeWindow();\n\t\t}\n\t\treturn;\n\t}\n\n\tSuper::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem);\n}\n\n\n\n\n\nvoid cSlotAreaFurnace::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tint SlotNum;\n\tcFurnaceRecipe * FurnaceRecipes = cRoot::Get()->GetFurnaceRecipe();\n\n\tif (FurnaceRecipes->GetRecipeFrom(a_ItemStack) != nullptr)\n\t{\n\t\tSlotNum = 0;\n\t}\n\telse if (FurnaceRecipes->IsFuel(a_ItemStack))\n\t{\n\t\tSlotNum = 1;\n\t}\n\telse\n\t{\n\t\treturn;\n\t}\n\n\tconst cItem * Slot = GetSlot(SlotNum, a_Player);\n\tif (!Slot->IsEqual(a_ItemStack) && (!Slot->IsEmpty() || a_KeepEmptySlots))\n\t{\n\t\t// Different items\n\t\treturn;\n\t}\n\n\tchar NumFit = Slot->GetMaxStackSize() - Slot->m_ItemCount;\n\tif (NumFit <= 0)\n\t{\n\t\t// Full stack already\n\t\treturn;\n\t}\n\tNumFit = std::min(NumFit, a_ItemStack.m_ItemCount);\n\n\tif (a_ShouldApply)\n\t{\n\t\tcItem NewSlot(a_ItemStack);\n\t\tNewSlot.m_ItemCount = Slot->m_ItemCount + NumFit;\n\t\tSetSlot(SlotNum, a_Player, NewSlot);\n\t}\n\ta_ItemStack.m_ItemCount -= NumFit;\n\tif (a_ItemStack.IsEmpty())\n\t{\n\t\treturn;\n\t}\n}\n\n\n\n\n\nconst cItem * cSlotAreaFurnace::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\tUNUSED(a_Player);\n\t// a_SlotNum ranges from 0 to 2, query the items from the underlying furnace:\n\treturn &(m_Furnace->GetSlot(a_SlotNum));\n}\n\n\n\n\n\nvoid cSlotAreaFurnace::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tm_Furnace->SetSlot(a_SlotNum, a_Item);\n}\n\n\n\n\n\nvoid cSlotAreaFurnace::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)\n{\n\tUNUSED(a_SlotNum);\n\t// Something has changed in the window, broadcast the entire window to all clients\n\tASSERT(a_ItemGrid == &(m_Furnace->GetContents()));\n\n\tm_ParentWindow.BroadcastWholeWindow();\n}\n\n\n\n\n\nvoid cSlotAreaFurnace::HandleSmeltItem(const cItem & a_Result, cPlayer & a_Player)\n{\n\tint Reward = m_Furnace->GetAndResetReward();\n\tif (Reward > 0)\n\t{\n\t\ta_Player.GetWorld()->SpawnSplitExperienceOrbs(a_Player.GetPosX(), a_Player.GetPosY(), a_Player.GetPosZ(), Reward);\n\t}\n\n\t/** TODO 2014-05-12 xdot: Figure out when to call this method. */\n\tswitch (a_Result.m_ItemType)\n\t{\n\t\tcase E_ITEM_IRON:        a_Player.AwardAchievement(CustomStatistic::AchAcquireIron); break;\n\t\tcase E_ITEM_COOKED_FISH: a_Player.AwardAchievement(CustomStatistic::AchCookFish);    break;\n\t\tdefault: break;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaBrewingstand:\ncSlotAreaBrewingstand::cSlotAreaBrewingstand(cBrewingstandEntity * a_Brewingstand, cWindow & a_ParentWindow) :\n\tcSlotArea(5, a_ParentWindow),\n\tm_Brewingstand(a_Brewingstand)\n{\n\tm_Brewingstand->GetContents().AddListener(*this);\n}\n\n\n\n\n\ncSlotAreaBrewingstand::~cSlotAreaBrewingstand()\n{\n\tm_Brewingstand->GetContents().RemoveListener(*this);\n}\n\n\n\n\n\nvoid cSlotAreaBrewingstand::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tif (m_Brewingstand == nullptr)\n\t{\n\t\tLOGERROR(\"cSlotAreaBrewingstand::Clicked(): m_Brewingstand == nullptr\");\n\t\tASSERT(!\"cSlotAreaBrewingstand::Clicked(): m_Brewingstand == nullptr\");\n\t\treturn;\n\t}\n\n\tif (GetSlot(a_SlotNum, a_Player) == nullptr)\n\t{\n\t\tLOGWARNING(\"GetSlot(%d) returned nullptr! Ignoring click\", a_SlotNum);\n\t\treturn;\n\t}\n\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\tcBrewingRecipes * BR = cRoot::Get()->GetBrewingRecipes();\n\n\tif ((a_SlotNum >= 0) && (a_SlotNum <= 2))\n\t{\n\t\t// Bottle slots\n\t\tswitch (a_ClickAction)\n\t\t{\n\t\t\tcase caLeftClick:\n\t\t\tcase caRightClick:\n\t\t\t{\n\t\t\t\tif (BR->IsBottle(Slot))\n\t\t\t\t{\n\t\t\t\t\tHandleBrewedItem(a_Player, Slot);\n\t\t\t\t}\n\t\t\t\tif (!DraggingItem.IsEmpty() && !BR->IsBottle(DraggingItem))\n\t\t\t\t{\n\t\t\t\t\t// Deny placing a invalid item into the bottle slot\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase caShiftLeftClick:\n\t\t\tcase caShiftRightClick:\n\t\t\t{\n\t\t\t\tif (BR->IsBottle(Slot))\n\t\t\t\t{\n\t\t\t\t\tHandleBrewedItem(a_Player, Slot);\n\t\t\t\t}\n\t\t\t\tSuper::ShiftClicked(a_Player, a_SlotNum, Slot);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tif (!DraggingItem.IsEmpty() && !BR->IsBottle(DraggingItem))\n\t\t\t\t{\n\t\t\t\t\t// Deny placing a invalid item into the bottle slot\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ((a_SlotNum == 3) && !DraggingItem.IsEmpty())\n\t{\n\t\t// Ingredient slot\n\t\tswitch (a_ClickAction)\n\t\t{\n\t\t\tcase caShiftLeftClick:\n\t\t\tcase caShiftRightClick:\n\t\t\t{\n\t\t\t\tSuper::ShiftClicked(a_Player, a_SlotNum, Slot);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tif (!BR->IsIngredient(DraggingItem))\n\t\t\t\t{\n\t\t\t\t\t// Deny placing a invalid item into the ingredient slot\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ((a_SlotNum == 4) && !DraggingItem.IsEmpty())\n\t{\n\t\t// Fuel slot\n\t\tswitch (a_ClickAction)\n\t\t{\n\t\t\tcase caShiftLeftClick:\n\t\t\tcase caShiftRightClick:\n\t\t\t{\n\t\t\t\tSuper::ShiftClicked(a_Player, a_SlotNum, Slot);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tif (!BR->IsFuel(DraggingItem))\n\t\t\t\t{\n\t\t\t\t\t// Deny placing a invalid item into the fuel slot\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tSuper::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem);\n}\n\n\n\n\n\nvoid cSlotAreaBrewingstand::HandleBrewedItem(cPlayer & a_Player, const cItem & a_ClickedItem)\n{\n\t// Award an achievement if the item is not a water bottle (is a real brewed potion)\n\tif (a_ClickedItem.m_ItemDamage > 0)\n\t{\n\t\ta_Player.AwardAchievement(CustomStatistic::AchPotion);\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaBrewingstand::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tint SlotNum = -1;\n\tcBrewingRecipes * BR = cRoot::Get()->GetBrewingRecipes();\n\tif (BR->IsBottle(a_ItemStack))\n\t{\n\t\tfor (int i = 0;i < 3;i++)\n\t\t{\n\t\t\tif (GetSlot(i, a_Player)->IsEmpty())\n\t\t\t{\n\t\t\t\tSlotNum = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (SlotNum == -1)\n\t\t{\n\t\t\t// All slots are full\n\t\t\treturn;\n\t\t}\n\t}\n\telse if (BR->IsIngredient(a_ItemStack))\n\t{\n\t\tSlotNum = 3;\n\t}\n\telse\n\t{\n\t\treturn;\n\t}\n\n\tconst cItem * Slot = GetSlot(SlotNum, a_Player);\n\tif (!Slot->IsEqual(a_ItemStack) && (!Slot->IsEmpty() || a_KeepEmptySlots))\n\t{\n\t\t// Different items\n\t\treturn;\n\t}\n\n\tchar NumFit = Slot->GetMaxStackSize() - Slot->m_ItemCount;\n\tif (NumFit <= 0)\n\t{\n\t\t// Full stack already\n\t\treturn;\n\t}\n\tNumFit = std::min(NumFit, a_ItemStack.m_ItemCount);\n\n\tif (a_ShouldApply)\n\t{\n\t\tcItem NewSlot(a_ItemStack);\n\t\tNewSlot.m_ItemCount = Slot->m_ItemCount + NumFit;\n\t\tSetSlot(SlotNum, a_Player, NewSlot);\n\t}\n\ta_ItemStack.m_ItemCount -= NumFit;\n\tif (a_ItemStack.IsEmpty())\n\t{\n\t\treturn;\n\t}\n}\n\n\n\n\n\nconst cItem * cSlotAreaBrewingstand::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\tUNUSED(a_Player);\n\t// a_SlotNum ranges from 0 to 3, query the items from the underlying brewing stand:\n\treturn &(m_Brewingstand->GetSlot(a_SlotNum));\n}\n\n\n\n\n\nvoid cSlotAreaBrewingstand::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tUNUSED(a_Player);\n\tm_Brewingstand->SetSlot(a_SlotNum, a_Item);\n}\n\n\n\n\n\nvoid cSlotAreaBrewingstand::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)\n{\n\tUNUSED(a_SlotNum);\n\t// Something has changed in the window, broadcast the entire window to all clients\n\tASSERT(a_ItemGrid == &(m_Brewingstand->GetContents()));\n\n\tm_ParentWindow.BroadcastWholeWindow();\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaMinecartWithChest:\n\ncSlotAreaMinecartWithChest::cSlotAreaMinecartWithChest(cMinecartWithChest * a_Chest, cWindow & a_ParentWindow) :\n\tcSlotArea(27, a_ParentWindow),\n\tm_Chest(a_Chest)\n{\n}\n\n\n\n\n\nconst cItem * cSlotAreaMinecartWithChest::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\t// a_SlotNum ranges from 0 to 26, use that to index the minecart chest entity's inventory directly:\n\tUNUSED(a_Player);\n\treturn &(m_Chest->GetSlot(a_SlotNum));\n}\n\n\n\n\n\nvoid cSlotAreaMinecartWithChest::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tUNUSED(a_Player);\n\tm_Chest->SetSlot(a_SlotNum, a_Item);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaInventoryBase:\n\ncSlotAreaInventoryBase::cSlotAreaInventoryBase(int a_NumSlots, int a_SlotOffset, cWindow & a_ParentWindow) :\n\tcSlotArea(a_NumSlots, a_ParentWindow),\n\tm_SlotOffset(a_SlotOffset)\n{\n}\n\n\n\n\n\nvoid cSlotAreaInventoryBase::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tif (a_Player.IsGameModeCreative() && (m_ParentWindow.GetWindowType() == cWindow::wtInventory))\n\t{\n\t\tif ((a_ClickAction == caDropKey) || (a_ClickAction == caCtrlDropKey))\n\t\t{\n\t\t\tDropClicked(a_Player, a_SlotNum, (a_ClickAction == caCtrlDropKey));\n\t\t\treturn;\n\t\t}\n\n\t\t// Creative inventory must treat a_ClickedItem as a DraggedItem instead, replacing the inventory slot with it\n\t\tSetSlot(a_SlotNum, a_Player, a_ClickedItem);\n\t\treturn;\n\t}\n\n\t// Survival inventory and all other windows' inventory has the same handling as normal slot areas\n\tSuper::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem);\n}\n\n\n\n\n\nconst cItem * cSlotAreaInventoryBase::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\t// a_SlotNum ranges from 0 to 35, map that to the player's inventory slots according to the internal offset\n\treturn &a_Player.GetInventory().GetSlot(a_SlotNum + m_SlotOffset);\n}\n\n\n\n\n\nvoid cSlotAreaInventoryBase::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\ta_Player.GetInventory().SetSlot(a_SlotNum + m_SlotOffset, a_Item);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaArmor:\n\nvoid cSlotAreaArmor::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tif (ItemCategory::IsHelmet(a_ItemStack.m_ItemType) && GetSlot(0, a_Player)->IsEmpty())\n\t{\n\t\tif (a_ShouldApply)\n\t\t{\n\t\t\tSetSlot(0, a_Player, a_ItemStack.CopyOne());\n\t\t}\n\t\ta_ItemStack.m_ItemCount -= 1;\n\t}\n\telse if (ItemCategory::IsChestPlate(a_ItemStack.m_ItemType) && GetSlot(1, a_Player)->IsEmpty())\n\t{\n\t\tif (a_ShouldApply)\n\t\t{\n\t\t\tSetSlot(1, a_Player, a_ItemStack.CopyOne());\n\t\t}\n\t\ta_ItemStack.m_ItemCount -= 1;\n\t}\n\telse if (ItemCategory::IsLeggings(a_ItemStack.m_ItemType) && GetSlot(2, a_Player)->IsEmpty())\n\t{\n\t\tif (a_ShouldApply)\n\t\t{\n\t\t\tSetSlot(2, a_Player, a_ItemStack.CopyOne());\n\t\t}\n\t\ta_ItemStack.m_ItemCount -= 1;\n\t}\n\telse if (ItemCategory::IsBoots(a_ItemStack.m_ItemType) && GetSlot(3, a_Player)->IsEmpty())\n\t{\n\t\tif (a_ShouldApply)\n\t\t{\n\t\t\tSetSlot(3, a_Player, a_ItemStack.CopyOne());\n\t\t}\n\t\ta_ItemStack.m_ItemCount -= 1;\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaArmor::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tASSERT((a_SlotNum >= 0) && (a_SlotNum < GetNumSlots()));\n\n\t// When the player is in creative mode, the client sends the new item as a_ClickedItem, not the current item in the slot.\n\tif (a_Player.IsGameModeCreative() && (m_ParentWindow.GetWindowType() == cWindow::wtInventory))\n\t{\n\t\tif ((a_ClickAction == caDropKey) || (a_ClickAction == caCtrlDropKey))\n\t\t{\n\t\t\tDropClicked(a_Player, a_SlotNum, (a_ClickAction == caCtrlDropKey));\n\t\t\treturn;\n\t\t}\n\n\t\tSetSlot(a_SlotNum, a_Player, a_ClickedItem);\n\t\treturn;\n\t}\n\n\tbool bAsync = false;\n\tif (GetSlot(a_SlotNum, a_Player) == nullptr)\n\t{\n\t\tLOGWARNING(\"GetSlot(%d) returned nullptr! Ignoring click\", a_SlotNum);\n\t\treturn;\n\t}\n\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caDblClick:\n\t\t{\n\t\t\t// Armors haven't a dbl click\n\t\t\treturn;\n\t\t}\n\t\tcase caShiftLeftClick:\n\t\tcase caShiftRightClick:\n\t\t{\n\t\t\tShiftClicked(a_Player, a_SlotNum, a_ClickedItem);\n\t\t\treturn;\n\t\t}\n\t\tcase caMiddleClick:\n\t\t{\n\t\t\tMiddleClicked(a_Player, a_SlotNum);\n\t\t\treturn;\n\t\t}\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tcItem Slot(*GetSlot(a_SlotNum, a_Player));\n\tif (!Slot.IsSameType(a_ClickedItem))\n\t{\n\t\tLOGWARNING(\"*** Window lost sync at item %d in SlotArea with %d items ***\", a_SlotNum, m_NumSlots);\n\t\tLOGWARNING(\"My item:    %s\", ItemToFullString(Slot).c_str());\n\t\tLOGWARNING(\"Their item: %s\", ItemToFullString(a_ClickedItem).c_str());\n\t\tbAsync = true;\n\t}\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\tif ((a_ClickAction != caRightClick) && (a_ClickAction != caLeftClick))\n\t{\n\t\tLOGWARNING(\"SlotArea: Unhandled click action: %d (%s)\", a_ClickAction, ClickActionToString(a_ClickAction));\n\t\tm_ParentWindow.BroadcastWholeWindow();\n\t\treturn;\n\t}\n\n\tif (DraggingItem.IsEmpty() || CanPlaceArmorInSlot(a_SlotNum, DraggingItem))\n\t{\n\t\t// Swap contents\n\t\tcItem tmp(DraggingItem);\n\t\tDraggingItem = Slot;\n\t\tSlot = tmp;\n\t}\n\n\tSetSlot(a_SlotNum, a_Player, Slot);\n\tif (bAsync)\n\t{\n\t\tm_ParentWindow.BroadcastWholeWindow();\n\t}\n}\n\n\n\n\n\nbool cSlotAreaArmor::CanPlaceArmorInSlot(int a_SlotNum, const cItem & a_Item)\n{\n\tswitch (a_SlotNum)\n\t{\n\t\tcase 0:  return (ItemCategory::IsHelmet(a_Item.m_ItemType) || (a_Item.m_ItemType == E_BLOCK_PUMPKIN));\n\t\tcase 1:  return ItemCategory::IsChestPlate(a_Item.m_ItemType);\n\t\tcase 2:  return ItemCategory::IsLeggings(a_Item.m_ItemType);\n\t\tcase 3:  return ItemCategory::IsBoots(a_Item.m_ItemType);\n\t\tdefault: return false;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaItemGrid:\n\ncSlotAreaItemGrid::cSlotAreaItemGrid(cItemGrid & a_ItemGrid, cWindow & a_ParentWindow) :\n\tSuper(a_ItemGrid.GetNumSlots(), a_ParentWindow),\n\tm_ItemGrid(a_ItemGrid)\n{\n\tm_ItemGrid.AddListener(*this);\n}\n\n\n\n\n\ncSlotAreaItemGrid::~cSlotAreaItemGrid()\n{\n\tm_ItemGrid.RemoveListener(*this);\n}\n\n\n\n\n\nconst cItem * cSlotAreaItemGrid::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\treturn &m_ItemGrid.GetSlot(a_SlotNum);\n}\n\n\n\n\n\nvoid cSlotAreaItemGrid::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tm_ItemGrid.SetSlot(a_SlotNum, a_Item);\n}\n\n\n\n\n\nvoid cSlotAreaItemGrid::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)\n{\n\tASSERT(a_ItemGrid == &m_ItemGrid);\n\tm_ParentWindow.BroadcastSlot(this, a_SlotNum);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaTemporary:\n\ncSlotAreaTemporary::cSlotAreaTemporary(int a_NumSlots, cWindow & a_ParentWindow) :\n\tcSlotArea(a_NumSlots, a_ParentWindow)\n{\n}\n\n\n\n\n\nconst cItem * cSlotAreaTemporary::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\tcItemMap::const_iterator itr = m_Items.find(a_Player.GetUniqueID());\n\tif (itr == m_Items.end())\n\t{\n\t\tLOGERROR(\"cSlotAreaTemporary: player \\\"%s\\\" not found for slot %d!\", a_Player.GetName().c_str(), a_SlotNum);\n\t\tASSERT(!\"cSlotAreaTemporary: player not found!\");\n\n\t\t// Player not found, this should not happen, ever! Return nullptr, but things may break by this.\n\t\treturn nullptr;\n\t}\n\n\tif (a_SlotNum >= static_cast<int>(itr->second.size()))\n\t{\n\t\tLOGERROR(\"cSlotAreaTemporary: asking for more slots than actually stored!\");\n\t\tASSERT(!\"cSlotAreaTemporary: asking for more slots than actually stored!\");\n\t\treturn nullptr;\n\t}\n\n\treturn &(itr->second[static_cast<size_t>(a_SlotNum)]);\n}\n\n\n\n\n\nvoid cSlotAreaTemporary::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tcItemMap::iterator itr = m_Items.find(a_Player.GetUniqueID());\n\tif (itr == m_Items.end())\n\t{\n\t\t// Player not found\n\t\tLOGWARNING(\"cSlotAreaTemporary: player not found!\");\n\t\treturn;\n\t}\n\n\tif (a_SlotNum >= static_cast<int>(itr->second.size()))\n\t{\n\t\tLOGERROR(\"cSlotAreaTemporary: asking for more slots than actually stored!\");\n\t\treturn;\n\t}\n\n\titr->second[static_cast<size_t>(a_SlotNum)] = a_Item;\n\n\tm_ParentWindow.SendSlot(a_Player, this, a_SlotNum);\n}\n\n\n\n\n\nvoid cSlotAreaTemporary::OnPlayerAdded(cPlayer & a_Player)\n{\n\tASSERT(m_Items.find(a_Player.GetUniqueID()) == m_Items.end());  // The player shouldn't be in the itemmap, otherwise we probably have a leak\n\tm_Items[a_Player.GetUniqueID()].resize(static_cast<size_t>(m_NumSlots));  // Make the vector the specified size of empty items\n}\n\n\n\n\n\nvoid cSlotAreaTemporary::OnPlayerRemoved(cPlayer & a_Player)\n{\n\tcItemMap::iterator itr = m_Items.find(a_Player.GetUniqueID());\n\tASSERT(itr != m_Items.end());  // The player should be in the list, otherwise a call to OnPlayerAdded() was mismatched\n\tm_Items.erase(itr);\n}\n\n\n\n\n\nvoid cSlotAreaTemporary::TossItems(cPlayer & a_Player, int a_Begin, int a_End)\n{\n\tcItemMap::iterator itr = m_Items.find(a_Player.GetUniqueID());\n\tif (itr == m_Items.end())\n\t{\n\t\tLOGWARNING(\"Player tossing items (%s) not found in the item map\", a_Player.GetName().c_str());\n\t\treturn;\n\t}\n\n\tcItems Drops;\n\tfor (int i = a_Begin; i < a_End; i++)\n\t{\n\t\tcItem & Item = itr->second[static_cast<size_t>(i)];\n\t\tif (!Item.IsEmpty())\n\t\t{\n\t\t\tDrops.push_back(Item);\n\t\t}\n\t\tItem.Empty();\n\t}  // for i - itr->second[]\n\n\ta_Player.TossItems(Drops);\n}\n\n\n\n\n\ncItem * cSlotAreaTemporary::GetPlayerSlots(cPlayer & a_Player)\n{\n\tcItemMap::iterator itr = m_Items.find(a_Player.GetUniqueID());\n\tif (itr == m_Items.end())\n\t{\n\t\treturn nullptr;\n\t}\n\treturn itr->second.data();\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSlotAreaHorse:\n\ncSlotAreaHorse::cSlotAreaHorse(cHorse & a_Horse, cWindow & a_ParentWindow) :\n\tcSlotArea(2, a_ParentWindow),\n\tm_Horse(a_Horse)\n{\n}\n\n\n\n\n\nvoid cSlotAreaHorse::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)\n{\n\tcItem & DraggingItem = a_Player.GetDraggingItem();\n\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caLeftClick:\n\t\tcase caRightClick:\n\t\tcase caDblClick:\n\t\t{\n\t\t\t// Check for invalid item types\n\t\t\tif (DraggingItem.IsEmpty())\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tswitch (a_SlotNum)\n\t\t\t{\n\t\t\t\tcase SaddleSlot:\n\t\t\t\t{\n\t\t\t\t\tif (DraggingItem.m_ItemType != E_ITEM_SADDLE)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArmorSlot:\n\t\t\t\t{\n\t\t\t\t\tif (!ItemCategory::IsHorseArmor(DraggingItem.m_ItemType))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: break;\n\t\t\t}\n\t\t}\n\t\tdefault: break;\n\t}\n\n\tcSlotArea::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem);\n}\n\n\n\n\n\nconst cItem * cSlotAreaHorse::GetSlot(int a_SlotNum, cPlayer & a_Player) const\n{\n\tstatic const cItem InvalidItem;\n\tswitch (a_SlotNum)\n\t{\n\t\tcase SaddleSlot: return &m_Horse.GetHorseSaddle();\n\t\tcase ArmorSlot:  return &m_Horse.GetHorseArmorItem();\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARN(\"cSlotAreaHorse::GetSlot: Invalid slot number %d\", a_SlotNum);\n\t\t\treturn &InvalidItem;\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaHorse::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item)\n{\n\tswitch (a_SlotNum)\n\t{\n\t\tcase SaddleSlot: m_Horse.SetHorseSaddle(a_Item); break;\n\t\tcase ArmorSlot:  m_Horse.SetHorseArmor(a_Item);  break;\n\t\tdefault:\n\t\t{\n\t\t\tLOGWARN(\"cSlotAreaHorse::SetSlot: Invalid slot number %d\", a_SlotNum);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cSlotAreaHorse::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill)\n{\n\tif (ItemCategory::IsHorseArmor(a_ItemStack.m_ItemType) && m_Horse.GetHorseArmorItem().IsEmpty())\n\t{\n\t\tif (a_ShouldApply)\n\t\t{\n\t\t\tm_Horse.SetHorseArmor(a_ItemStack.CopyOne());\n\t\t}\n\t\t--a_ItemStack.m_ItemCount;\n\t}\n\telse if ((a_ItemStack.m_ItemType == E_ITEM_SADDLE) && !m_Horse.IsSaddled())\n\t{\n\t\tif (a_ShouldApply)\n\t\t{\n\t\t\tm_Horse.SetHorseSaddle(a_ItemStack.CopyOne());\n\t\t}\n\t\t--a_ItemStack.m_ItemCount;\n\t}\n}\n"
  },
  {
    "path": "src/UI/SlotArea.h",
    "content": "\n// SlotArea.h\n\n// Interfaces to the cSlotArea class representing a contiguous area of slots in a UI window\n\n\n\n\n#pragma once\n\n#include \"../Inventory.h\"\n\n\n\n\n\nclass cHorse;\nclass cWindow;\nclass cPlayer;\nclass cBeaconEntity;\nclass cBrewingstandEntity;\nclass cChestEntity;\nclass cEnderChestEntity;\nclass cFurnaceEntity;\nclass cMinecartWithChest;\nclass cCraftingRecipe;\nclass cWorld;\n\n\n\n\n\nclass cSlotArea\n{\npublic:\n\tcSlotArea(int a_NumSlots, cWindow & a_ParentWindow);\n\tvirtual ~cSlotArea() {}  // force a virtual destructor in all subclasses\n\n\tint GetNumSlots(void) const { return m_NumSlots; }\n\n\t/** Called to retrieve an item in the specified slot for the specified player. Must return a valid cItem. */\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const = 0;\n\n\t/** Called to set an item in the specified slot for the specified player */\n\tvirtual void SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) = 0;\n\n\t/** Called when a player clicks in the window. Parameters taken from the click packet. */\n\tvirtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem);\n\n\t/** Called from Clicked when the action is a shiftclick (left or right) */\n\tvirtual void ShiftClicked(cPlayer & a_Player, int a_SlotNum, const cItem & a_ClickedItem);\n\n\t/** Called from Clicked when the action is a caDblClick */\n\tvirtual void DblClicked(cPlayer & a_Player, int a_SlotNum);\n\n\t/** Called from Clicked when the action is a middleclick */\n\tvirtual void MiddleClicked(cPlayer & a_Player, int a_SlotNum);\n\n\t/** Called from Clicked when the action is a drop click. */\n\tvirtual void DropClicked(cPlayer & a_Player, int a_SlotNum, bool a_DropStack);\n\n\t/** Called from Clicked when the action is a number click. */\n\tvirtual void NumberClicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction);\n\n\t/** Called when a new player opens the same parent window. The window already tracks the player. CS-locked. */\n\tvirtual void OnPlayerAdded(cPlayer & a_Player);\n\n\t/** Called when one of the players closes the parent window. The window already doesn't track the player. CS-locked. */\n\tvirtual void OnPlayerRemoved(cPlayer & a_Player);\n\n\t/** Called to store as much of a_ItemStack in the area as possible. a_ItemStack is modified to reflect the change.\n\tThe default implementation searches each slot for available space and distributes the stack there.\n\tif a_ShouldApply is true, the changes are written into the slots;\n\tif a_ShouldApply is false, only a_ItemStack is modified to reflect the number of fits (for fit-testing purposes)\n\tIf a_KeepEmptySlots is true, empty slots will be skipped and won't be filled */\n\tvirtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill);\n\n\t/** Called on DblClicking to collect all stackable items into hand.\n\tThe items are accumulated in a_Dragging and removed from the slots immediately.\n\tIf a_CollectFullStacks is false, slots with full stacks are skipped while collecting.\n\tReturns true if full stack has been collected in a_Dragging, false if there's space remaining to fill. */\n\tvirtual bool CollectItemsToHand(cItem & a_Dragging, cPlayer & a_Player, bool a_CollectFullStacks);\n\nprotected:\n\tint       m_NumSlots;\n\tcWindow & m_ParentWindow;\n} ;\n\n\n\n\n\n/** Handles any part of the inventory, using parameters in constructor to distinguish between the parts */\nclass cSlotAreaInventoryBase:\n\tpublic cSlotArea\n{\n\tusing Super = cSlotArea;\n\npublic:\n\n\tcSlotAreaInventoryBase(int a_NumSlots, int a_SlotOffset, cWindow & a_ParentWindow);\n\n\t// Creative inventory's click handling is somewhat different from survival inventory's, handle that here:\n\tvirtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\nprotected:\n\tint m_SlotOffset;  // Index that this area's slot 0 has in the underlying cInventory\n} ;\n\n\n\n\n\n/** Handles the main inventory of each player, excluding the armor and hotbar */\nclass cSlotAreaInventory:\n\tpublic cSlotAreaInventoryBase\n{\n\tusing Super = cSlotAreaInventoryBase;\n\npublic:\n\n\tcSlotAreaInventory(cWindow & a_ParentWindow):\n\t\tSuper(cInventory::invInventoryCount, cInventory::invInventoryOffset, a_ParentWindow)\n\t{\n\t}\n} ;\n\n\n\n\n\n/** Handles the hotbar of each player */\nclass cSlotAreaHotBar:\n\tpublic cSlotAreaInventoryBase\n{\n\tusing Super = cSlotAreaInventoryBase;\n\npublic:\n\tcSlotAreaHotBar(cWindow & a_ParentWindow):\n\t\tSuper(cInventory::invHotbarCount, cInventory::invHotbarOffset, a_ParentWindow)\n\t{\n\t}\n} ;\n\n\n\n\n\n/** Handles the shield of each player */\nclass cSlotAreaShield:\n\tpublic cSlotAreaInventoryBase\n{\n\tusing Super = cSlotAreaInventoryBase;\n\npublic:\n\n\tcSlotAreaShield(cWindow & a_ParentWindow):\n\t\tSuper(cInventory::invShieldCount, cInventory::invShieldOffset, a_ParentWindow)\n\t{\n\t}\n};\n\n\n\n\n\n/** Handles the armor area of the player's inventory */\nclass cSlotAreaArmor:\n\tpublic cSlotAreaInventoryBase\n{\n\tusing Super = cSlotAreaInventoryBase;\n\npublic:\n\n\tcSlotAreaArmor(cWindow & a_ParentWindow):\n\t\tSuper(cInventory::invArmorCount, cInventory::invArmorOffset, a_ParentWindow)\n\t{\n\t}\n\n\t/** Distributing the stack is allowed only for compatible items (helmets into helmet slot etc.) */\n\tvirtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill) override;\n\n\t/** Called when a player clicks in the window. Parameters taken from the click packet. */\n\tvirtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\n\tstatic bool CanPlaceArmorInSlot(int a_SlotNum, const cItem & a_Item);\n} ;\n\n\n\n\n\n/** Handles any slot area that is representing a cItemGrid; same items for all the players */\nclass cSlotAreaItemGrid:\n\tpublic cSlotArea,\n\tpublic cItemGrid::cListener\n{\n\tusing Super = cSlotArea;\n\npublic:\n\n\tcSlotAreaItemGrid(cItemGrid & a_ItemGrid, cWindow & a_ParentWindow);\n\n\tvirtual ~cSlotAreaItemGrid() override;\n\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\nprotected:\n\tcItemGrid & m_ItemGrid;\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;\n} ;\n\n\n\n\n\n/** A cSlotArea with items layout that is private to each player and is temporary, such as\na crafting grid or an enchantment table.\nThis common ancestor stores the items in a per-player map. It also implements tossing items from the map. */\nclass cSlotAreaTemporary:\n\tpublic cSlotArea\n{\n\tusing Super = cSlotArea;\n\npublic:\n\n\tcSlotAreaTemporary(int a_NumSlots, cWindow & a_ParentWindow);\n\n\t// cSlotArea overrides:\n\tvirtual const cItem * GetSlot        (int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot        (int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\tvirtual void          OnPlayerAdded  (cPlayer & a_Player) override;\n\tvirtual void          OnPlayerRemoved(cPlayer & a_Player) override;\n\n\t/** Tosses the player's items in slots [a_Begin, a_End) (ie. incl. a_Begin, but excl. a_End) */\n\tvoid TossItems(cPlayer & a_Player, int a_Begin, int a_End);\n\nprotected:\n\tusing cItemMap = std::map<UInt32, std::vector<cItem> >;  // Maps EntityID -> items\n\n\tcItemMap m_Items;\n\n\t/** Returns the pointer to the slot array for the player specified. */\n\tcItem * GetPlayerSlots(cPlayer & a_Player);\n} ;\n\n\n\n\n\nclass cSlotAreaCrafting:\n\tpublic cSlotAreaTemporary\n{\n\tusing Super = cSlotAreaTemporary;\n\npublic:\n\n\t/** a_GridSize is allowed to be only 2 or 3 */\n\tcSlotAreaCrafting(int a_GridSize, cWindow & a_ParentWindow);\n\n\t// cSlotAreaTemporary overrides:\n\tvirtual void Clicked        (cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\tvirtual void DblClicked     (cPlayer & a_Player, int a_SlotNum) override;\n\tvirtual void OnPlayerRemoved(cPlayer & a_Player) override;\n\tvirtual void SetSlot        (int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\n\t// Distributing items into this area is completely disabled\n\tvirtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill) override;\n\n\t/** Clear the crafting grid */\n\tvoid ClearCraftingGrid(cPlayer & a_Player);\n\n\t/** Loads the given Recipe into the crafting grid */\n\tvoid LoadRecipe(cPlayer & a_Player, UInt32 a_RecipeId);\n\nprotected:\n\t/** Maps player's EntityID -> current recipe.\n\tNot a std::map because cCraftingGrid needs proper constructor params. */\n\ttypedef std::list<std::pair<UInt32, cCraftingRecipe> > cRecipeMap;\n\n\tint        m_GridSize;\n\tcRecipeMap m_Recipes;\n\n\t/** Handles a click in the result slot.\n\tCrafts using the current recipe, if possible. */\n\tvoid ClickedResult(cPlayer & a_Player);\n\n\t/** Handles a shift-click in the result slot.\n\tCrafts using the current recipe until it changes or no more space for result. */\n\tvoid ShiftClickedResult(cPlayer & a_Player);\n\n\t/** Handles a drop-click in the result slot. */\n\tvoid DropClickedResult(cPlayer & a_Player);\n\n\t/** Updates the current recipe and result slot based on the ingredients currently in the crafting grid of the specified player. */\n\tvoid UpdateRecipe(cPlayer & a_Player);\n\n\t/** Retrieves the recipe for the specified player from the map, or creates one if not found. */\n\tcCraftingRecipe & GetRecipeForPlayer(cPlayer & a_Player);\n\n\t/** Called after an item has been crafted to handle statistics e.t.c. */\n\tvoid HandleCraftItem(const cItem & a_Result, cPlayer & a_Player);\n} ;\n\n\n\n\n\nclass cSlotAreaAnvil:\n\tpublic cSlotAreaTemporary\n{\n\tusing Super = cSlotAreaTemporary;\n\npublic:\n\n\tcSlotAreaAnvil(cWindow & a_ParentWindow);\n\n\t// cSlotArea overrides:\n\tvirtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\tvirtual void ShiftClicked(cPlayer & a_Player, int a_SlotNum, const cItem & a_ClickedItem) override;\n\tvirtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill) override;\n\n\t// cSlotAreaTemporary overrides:\n\tvirtual void OnPlayerRemoved(cPlayer & a_Player) override;\n\n\t/** Can the player take the item from the slot? */\n\tbool CanTakeResultItem(cPlayer & a_Player);\n\n\t/** This function will call, when the player take the item from the slot. */\n\tvoid OnTakeResult(cPlayer & a_Player);\n\n\t/** Handles a click in the item slot. */\n\tvoid UpdateResult(cPlayer & a_Player);\n\nprotected:\n\t/** The maximum cost of repairing / renaming in the anvil. */\n\tint m_MaximumCost;\n\n\t/** The stack size of the second item where was used for repair */\n\tchar m_StackSizeToBeUsedInRepair;\n} ;\n\n\n\n\n\nclass cSlotAreaBeacon:\n\tpublic cSlotArea,\n\tpublic cItemGrid::cListener\n{\n\tusing Super = cSlotArea;\n\npublic:\n\n\tcSlotAreaBeacon(cBeaconEntity * a_Beacon, cWindow & a_ParentWindow);\n\tvirtual ~cSlotAreaBeacon() override;\n\n\tstatic bool IsPlaceableItem(short a_ItemType);\n\n\tvirtual void          Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\tvirtual void          DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill) override;\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\nprotected:\n\tcBeaconEntity * m_Beacon;\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;\n} ;\n\n\n\n\n\nclass cSlotAreaEnchanting final :\n\tpublic cSlotAreaTemporary\n{\n\tusing Super = cSlotAreaTemporary;\n\npublic:\n\n\tcSlotAreaEnchanting(cWindow & a_ParentWindow, Vector3i a_BlockPos);\n\n\t// cSlotArea overrides:\n\tvirtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\tvirtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill) override;\n\tvirtual void SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\n\t// cSlotAreaTemporary overrides:\n\tvirtual void OnPlayerAdded  (cPlayer & a_Player) override;\n\tvirtual void OnPlayerRemoved(cPlayer & a_Player) override;\n\n\t/* Get the number of bookshelves which are near the enchanting table */\n\tunsigned GetBookshelvesCount(cWorld & a_World);\n\n\t/* Return the enchanted item matching the chosen option (0, 1, 2)\n\tOwnership of the cItem is transferred to the caller. */\n\tcItem SelectEnchantedOption(size_t a_EnchantOption);\n\nprotected:\n\n\t/** Handles a click in the item slot. */\n\tvoid UpdateResult(cPlayer & a_Player);\n\n\tVector3i m_BlockPos;\n\tstd::array<cItem, 3> m_EnchantedItemOptions;\n};\n\n\n\n\n\nclass cSlotAreaChest :\n\tpublic cSlotArea\n{\npublic:\n\tcSlotAreaChest(cChestEntity * a_Chest, cWindow & a_ParentWindow);\n\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\nprotected:\n\tcChestEntity * m_Chest;\n} ;\n\n\n\n\n\nclass cSlotAreaDoubleChest :\n\tpublic cSlotArea\n{\npublic:\n\tcSlotAreaDoubleChest(cChestEntity * a_TopChest, cChestEntity * a_BottomChest, cWindow & a_ParentWindow);\n\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\nprotected:\n\tcChestEntity * m_TopChest;\n\tcChestEntity * m_BottomChest;\n} ;\n\n\n\n\n\nclass cSlotAreaEnderChest :\n\tpublic cSlotArea\n{\npublic:\n\tcSlotAreaEnderChest(cEnderChestEntity * a_EnderChest, cWindow & a_ParentWindow);\n\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\nprotected:\n\tcEnderChestEntity * m_EnderChest;\n};\n\n\n\n\n\nclass cSlotAreaFurnace:\n\tpublic cSlotArea,\n\tpublic cItemGrid::cListener\n{\n\tusing Super = cSlotArea;\n\npublic:\n\n\tcSlotAreaFurnace(cFurnaceEntity * a_Furnace, cWindow & a_ParentWindow);\n\n\tvirtual ~cSlotAreaFurnace() override;\n\n\tvirtual void          Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\tvirtual void          DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill) override;\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\nprotected:\n\tcFurnaceEntity * m_Furnace;\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;\n\n\t/** Called after an item has been smelted to handle statistics etc. */\n\tvoid HandleSmeltItem(const cItem & a_Result, cPlayer & a_Player);\n} ;\n\n\n\n\n\nclass cSlotAreaBrewingstand:\n\tpublic cSlotArea,\n\tpublic cItemGrid::cListener\n{\n\tusing Super = cSlotArea;\n\npublic:\n\n\tcSlotAreaBrewingstand(cBrewingstandEntity * a_Brewingstand, cWindow & a_ParentWindow);\n\n\tvirtual ~cSlotAreaBrewingstand() override;\n\n\tvirtual void          Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\tvirtual void          DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill) override;\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\nprotected:\n\tcBrewingstandEntity * m_Brewingstand;\n\n\t// cItemGrid::cListener overrides:\n\tvirtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;\n\n\t/** Called after an item has been brewed to handle statistics etc. */\n\tvoid HandleBrewedItem(cPlayer & a_Player, const cItem & a_ClickedItem);\n} ;\n\n\n\n\n\nclass cSlotAreaMinecartWithChest :\n\tpublic cSlotArea\n{\npublic:\n\tcSlotAreaMinecartWithChest(cMinecartWithChest * a_ChestCart, cWindow & a_ParentWindow);\n\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void          SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\nprotected:\n\tcMinecartWithChest * m_Chest;\n};\n\n\n\n\n\n/** Slot area holding horse saddle and armor. */\nclass cSlotAreaHorse:\n\tpublic cSlotArea\n{\npublic:\n\tenum\n\t{\n\t\tSaddleSlot,\n\t\tArmorSlot\n\t};\n\n\tcSlotAreaHorse(cHorse & a_Horse, cWindow & a_ParentWindow);\n\tvirtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override;\n\tvirtual const cItem * GetSlot(int a_SlotNum, cPlayer & a_Player) const override;\n\tvirtual void SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override;\n\tvirtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots, bool a_BackFill) override;\nprivate:\n\tcHorse & m_Horse;\n};\n"
  },
  {
    "path": "src/UI/Window.cpp",
    "content": "#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"Window.h\"\n#include \"WindowOwner.h\"\n#include \"SlotArea.h\"\n#include \"../Item.h\"\n#include \"../ClientHandle.h\"\n#include \"../Entities/Player.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Inventory.h\"\n#include \"../Items/ItemHandler.h\"\n#include \"../BlockEntities/BeaconEntity.h\"\n#include \"../BlockEntities/ChestEntity.h\"\n#include \"../BlockEntities/DropSpenserEntity.h\"\n#include \"../BlockEntities/EnderChestEntity.h\"\n#include \"../BlockEntities/HopperEntity.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Root.h\"\n#include \"../Bindings/PluginManager.h\"\n\n\n\n\nByte cWindow::m_WindowIDCounter = 0;\n\n\n\n\n\ncWindow::cWindow(WindowType a_WindowType, const AString & a_WindowTitle) :\n\tm_WindowID(((++m_WindowIDCounter) % 127) + 1),\n\tm_WindowType(a_WindowType),\n\tm_WindowTitle(a_WindowTitle),\n\tm_IsDestroyed(false),\n\tm_Owner(nullptr)\n{\n\tASSERT((m_WindowID > 0) && (m_WindowID <= 127));\n\n\tif (a_WindowType == wtInventory)\n\t{\n\t\tm_WindowID = 0;\n\t}\n}\n\n\n\n\n\ncWindow::~cWindow()\n{\n\tfor (cSlotAreas::iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t{\n\t\tdelete *itr;\n\t}\n\tm_SlotAreas.clear();\n}\n\n\n\n\n\nconst AString cWindow::GetWindowTypeName(void) const\n{\n\tswitch (m_WindowType)\n\t{\n\t\tcase wtChest:       return \"minecraft:chest\";\n\t\tcase wtWorkbench:   return \"minecraft:crafting_table\";\n\t\tcase wtFurnace:     return \"minecraft:furnace\";\n\t\tcase wtDropSpenser: return \"minecraft:dispenser\";\n\t\tcase wtEnchantment: return \"minecraft:enchanting_table\";\n\t\tcase wtBrewery:     return \"minecraft:brewing_stand\";\n\t\tcase wtNPCTrade:    return \"minecraft:villager\";\n\t\tcase wtBeacon:      return \"minecraft:beacon\";\n\t\tcase wtAnvil:       return \"minecraft:anvil\";\n\t\tcase wtHopper:      return \"minecraft:hopper\";\n\t\tcase wtDropper:     return \"minecraft:dropper\";\n\t\tcase wtAnimalChest: return \"EntityHorse\";\n\t\tdefault:\n\t\t{\n\t\t\tASSERT(!\"Unknown inventory type!\");\n\t\t\treturn \"\";\n\t\t}\n\t}\n}\n\n\n\n\n\nint cWindow::GetNumSlots(void) const\n{\n\tint res = 0;\n\tfor (const auto & itr : m_SlotAreas)\n\t{\n\t\tres += itr->GetNumSlots();\n\t}  // for itr - m_SlotAreas[]\n\treturn res;\n}\n\n\n\n\n\nconst cItem * cWindow::GetSlot(cPlayer & a_Player, int a_SlotNum) const\n{\n\t// Return the item at the specified slot for the specified player\n\tint LocalSlotNum = 0;\n\tconst cSlotArea * Area = GetSlotArea(a_SlotNum, LocalSlotNum);\n\tif (Area == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: requesting item from an invalid SlotArea (SlotNum %d), returning nullptr.\", __FUNCTION__, a_SlotNum);\n\t\treturn nullptr;\n\t}\n\treturn Area->GetSlot(LocalSlotNum, a_Player);\n}\n\n\n\n\n\nvoid cWindow::SetSlot(cPlayer & a_Player, int a_SlotNum, const cItem & a_Item)\n{\n\t// Set the item to the specified slot for the specified player\n\tint LocalSlotNum = 0;\n\tcSlotArea * Area = GetSlotArea(a_SlotNum, LocalSlotNum);\n\tif (Area == nullptr)\n\t{\n\t\tLOGWARNING(\"%s: requesting write to an invalid SlotArea (SlotNum %d), ignoring.\", __FUNCTION__, a_SlotNum);\n\t\treturn;\n\t}\n\tArea->SetSlot(LocalSlotNum, a_Player, a_Item);\n}\n\n\n\n\n\nbool cWindow::IsSlotInPlayerMainInventory(int a_SlotNum) const\n{\n\t// Returns true if the specified slot is in the Player Main Inventory slotarea\n\t// The player main inventory is always 27 slots, 9 slots from the end of the inventory\n\treturn ((a_SlotNum >= GetNumSlots() - 36) && (a_SlotNum < GetNumSlots() - 9));\n}\n\n\n\n\n\nbool cWindow::IsSlotInPlayerHotbar(int a_SlotNum) const\n{\n\t// Returns true if the specified slot is in the Player Hotbar slotarea\n\t// The hotbar is always the last 9 slots\n\treturn ((a_SlotNum >= GetNumSlots() - 9) && (a_SlotNum < GetNumSlots()));\n}\n\n\n\n\n\nbool cWindow::IsSlotInPlayerInventory(int a_SlotNum) const\n{\n\t// Returns true if the specified slot is in the Player Main Inventory or Hotbar slotareas. Note that returns false for Armor.\n\t// The player combined inventory is always the last 36 slots\n\treturn ((a_SlotNum >= GetNumSlots() - 36) && (a_SlotNum < GetNumSlots()));\n}\n\n\n\n\n\nvoid cWindow::GetSlots(cPlayer & a_Player, cItems & a_Slots) const\n{\n\ta_Slots.clear();\n\ta_Slots.reserve(static_cast<size_t>(GetNumSlots()));\n\tfor (cSlotAreas::const_iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t{\n\t\tint NumSlots = (*itr)->GetNumSlots();\n\t\tfor (int i = 0; i < NumSlots; i++)\n\t\t{\n\t\t\tconst cItem * Item = (*itr)->GetSlot(i, a_Player);\n\t\t\tif (Item == nullptr)\n\t\t\t{\n\t\t\t\ta_Slots.push_back(cItem());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ta_Slots.push_back(*Item);\n\t\t\t}\n\t\t}\n\t}  // for itr - m_SlotAreas[]\n}\n\n\n\n\n\nvoid cWindow::Clicked(\n\tcPlayer & a_Player,\n\tint a_WindowID, short a_SlotNum, eClickAction a_ClickAction,\n\tconst cItem & a_ClickedItem\n)\n{\n\tcPluginManager * PlgMgr = cRoot::Get()->GetPluginManager();\n\tif (a_WindowID != m_WindowID)\n\t{\n\t\tLOGWARNING(\"%s: Wrong window ID (exp %d, got %d) received from \\\"%s\\\"; ignoring click.\", __FUNCTION__, m_WindowID, a_WindowID, a_Player.GetName().c_str());\n\t\treturn;\n\t}\n\n\tswitch (a_ClickAction)\n\t{\n\t\tcase caLeftClickOutside:\n\t\tcase caRightClickOutside:\n\t\t{\n\t\t\tif (PlgMgr->CallHookPlayerTossingItem(a_Player))\n\t\t\t{\n\t\t\t\t// A plugin doesn't agree with the tossing. The plugin itself is responsible for handling the consequences (possible inventory mismatch)\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (a_Player.IsGameModeCreative())\n\t\t\t{\n\t\t\t\ta_Player.TossPickup(a_ClickedItem);\n\t\t\t}\n\n\t\t\tif (a_ClickAction == caLeftClickOutside)\n\t\t\t{\n\t\t\t\t// Toss all dragged items:\n\t\t\t\ta_Player.TossHeldItem(a_Player.GetDraggingItem().m_ItemCount);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Toss one of the dragged items:\n\t\t\t\ta_Player.TossHeldItem();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase caLeftClickOutsideHoldNothing:\n\t\tcase caRightClickOutsideHoldNothing:\n\t\t{\n\t\t\t// Nothing needed\n\t\t\treturn;\n\t\t}\n\t\tcase caLeftPaintBegin:      OnPaintBegin    (a_Player);            return;\n\t\tcase caRightPaintBegin:     OnPaintBegin    (a_Player);            return;\n\t\tcase caMiddlePaintBegin:    OnPaintBegin    (a_Player);            return;\n\t\tcase caLeftPaintProgress:   OnPaintProgress (a_Player, a_SlotNum); return;\n\t\tcase caRightPaintProgress:  OnPaintProgress (a_Player, a_SlotNum); return;\n\t\tcase caMiddlePaintProgress: OnPaintProgress (a_Player, a_SlotNum); return;\n\t\tcase caLeftPaintEnd:        OnLeftPaintEnd  (a_Player);            return;\n\t\tcase caRightPaintEnd:       OnRightPaintEnd (a_Player);            return;\n\t\tcase caMiddlePaintEnd:      OnMiddlePaintEnd(a_Player);            return;\n\t\tdefault:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (a_SlotNum < 0)\n\t{\n\t\t// TODO: Other click actions with irrelevant slot number (FS #371)\n\t\treturn;\n\t}\n\n\tint LocalSlotNum = a_SlotNum;\n\tfor (const auto & itr : m_SlotAreas)\n\t{\n\t\tif (LocalSlotNum < itr->GetNumSlots())\n\t\t{\n\t\t\titr->Clicked(a_Player, LocalSlotNum, a_ClickAction, a_ClickedItem);\n\t\t\treturn;\n\t\t}\n\t\tLocalSlotNum -= itr->GetNumSlots();\n\t}\n\n\tLOGWARNING(\"Slot number higher than available window slots: %d, max %d received from \\\"%s\\\"; ignoring.\",\n\t\ta_SlotNum, GetNumSlots(), a_Player.GetName().c_str()\n\t);\n}\n\n\n\n\n\nvoid cWindow::OpenedByPlayer(cPlayer & a_Player)\n{\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\t// If player is already in OpenedBy remove player first\n\t\tm_OpenedBy.remove(&a_Player);\n\t\t// Then add player\n\t\tm_OpenedBy.push_back(&a_Player);\n\n\t\tfor (cSlotAreas::iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t\t{\n\t\t\t(*itr)->OnPlayerAdded(a_Player);\n\t\t}  // for itr - m_SlotAreas[]\n\t}\n\n\ta_Player.GetClientHandle()->SendWindowOpen(*this);\n}\n\n\n\n\n\nbool cWindow::ClosedByPlayer(cPlayer & a_Player, bool a_CanRefuse)\n{\n\t// Checks whether the player is still holding an item\n\tif (!a_Player.GetDraggingItem().IsEmpty())\n\t{\n\t\tLOGD(\"Player is holding an item while closing their window, dropping it as a pickup...\");\n\t\ta_Player.TossHeldItem(a_Player.GetDraggingItem().m_ItemCount);\n\t}\n\n\tcClientHandle * ClientHandle = a_Player.GetClientHandle();\n\tif (ClientHandle != nullptr)\n\t{\n\t\tClientHandle->SendWindowClose(*this);\n\t}\n\n\t{\n\t\tcCSLock Lock(m_CS);\n\n\t\tfor (cSlotAreas::iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t\t{\n\t\t\t(*itr)->OnPlayerRemoved(a_Player);\n\t\t}  // for itr - m_SlotAreas[]\n\n\t\tif (m_WindowType != wtInventory)\n\t\t{\n\t\t\tm_OpenedBy.remove(&a_Player);\n\t\t\tif (m_OpenedBy.empty())\n\t\t\t{\n\t\t\t\tDestroy();\n\t\t\t}\n\t\t}\n\t}\n\tif (m_IsDestroyed)\n\t{\n\t\tdelete this;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cWindow::BroadcastSlot(cSlotArea * a_Area, int a_LocalSlotNum)\n{\n\t// Translate local slot num into global slot num:\n\tint SlotNum = 0;\n\tbool HasFound = false;\n\tfor (cSlotAreas::const_iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t{\n\t\tif (a_Area == *itr)\n\t\t{\n\t\t\tSlotNum += a_LocalSlotNum;\n\t\t\tHasFound = true;\n\t\t\tbreak;\n\t\t}\n\t\tSlotNum += (*itr)->GetNumSlots();\n\t}  // for itr - m_SlotAreas[]\n\tif (!HasFound)\n\t{\n\t\tLOGWARNING(\"%s: Invalid slot area parameter\", __FUNCTION__);\n\t\tASSERT(!\"Invalid slot area\");\n\t\treturn;\n\t}\n\n\t// Broadcast the update packet:\n\tcCSLock Lock(m_CS);\n\tfor (cPlayerList::iterator itr = m_OpenedBy.begin(); itr != m_OpenedBy.end(); ++itr)\n\t{\n\t\t(*itr)->GetClientHandle()->SendInventorySlot(m_WindowID, static_cast<short>(SlotNum), *a_Area->GetSlot(a_LocalSlotNum, **itr));\n\t}  // for itr - m_OpenedBy[]\n}\n\n\n\n\n\nvoid cWindow::SendWholeWindow(cClientHandle & a_Client)\n{\n\ta_Client.SendWholeInventory(*this);\n}\n\n\n\n\n\nvoid cWindow::BroadcastWholeWindow(void)\n{\n\tcCSLock Lock(m_CS);\n\tfor (auto Player : m_OpenedBy)\n\t{\n\t\tSendWholeWindow(*Player->GetClientHandle());\n\t}\n}\n\n\n\n\n\nvoid cWindow::SetProperty(size_t a_Property, short a_Value)\n{\n\tcCSLock Lock(m_CS);\n\tfor (auto Player : m_OpenedBy)\n\t{\n\t\tPlayer->GetClientHandle()->SendWindowProperty(*this, a_Property, a_Value);\n\t}\n}\n\n\n\n\n\nvoid cWindow::OwnerDestroyed()\n{\n\t// Close window for each player. Note that the last one needs special handling\n\twhile (m_OpenedBy.size() > 1)\n\t{\n\t\t(*m_OpenedBy.begin())->CloseWindow();\n\t}\n\t(*m_OpenedBy.begin())->CloseWindow();\n}\n\n\n\n\n\nbool cWindow::ForEachPlayer(cPlayerListCallback a_Callback)\n{\n\tcCSLock Lock(m_CS);\n\tfor (auto & Player : m_OpenedBy)\n\t{\n\t\tif (a_Callback(*Player))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - m_OpenedBy[]\n\treturn true;\n}\n\n\n\n\n\nbool cWindow::ForEachClient(cClientHandleCallback a_Callback)\n{\n\tcCSLock Lock(m_CS);\n\tfor (auto & Player : m_OpenedBy)\n\t{\n\t\tif (a_Callback(*Player->GetClientHandle()))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - m_OpenedBy[]\n\treturn true;\n}\n\n\n\n\n\nvoid cWindow::DistributeStackToAreas(cItem & a_ItemStack, cPlayer & a_Player, cSlotAreas & a_AreasInOrder, bool a_ShouldApply, bool a_BackFill)\n{\n\t/* Ask each slot area to take as much of the stack as it can.\n\tFirst ask only slots that already have the same kind of item\n\tThen ask any remaining slots */\n\tfor (size_t Pass = 0; Pass < 2; Pass++)\n\t{\n\t\tfor (auto SlotArea : a_AreasInOrder)\n\t\t{\n\t\t\tSlotArea->DistributeStack(a_ItemStack, a_Player, a_ShouldApply, (Pass == 0), a_BackFill);\n\t\t\tif (a_ItemStack.IsEmpty())\n\t\t\t{\n\t\t\t\t// Distributed it all\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cWindow::CollectItemsToHand(cItem & a_Dragging, cSlotArea & a_Area, cPlayer & a_Player, bool a_CollectFullStacks)\n{\n\t// Ask to collect items from each slot area in order:\n\tfor (auto Area : m_SlotAreas)\n\t{\n\t\tif (Area->CollectItemsToHand(a_Dragging, a_Player, a_CollectFullStacks))\n\t\t{\n\t\t\treturn true;  // a_Dragging is full\n\t\t}\n\t}\n\treturn false;  // All areas processed\n}\n\n\n\n\n\nvoid cWindow::SendSlot(cPlayer & a_Player, cSlotArea * a_SlotArea, int a_RelativeSlotNum)\n{\n\tint SlotBase = 0;\n\tbool Found = false;\n\tfor (cSlotAreas::iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t{\n\t\tif (*itr == a_SlotArea)\n\t\t{\n\t\t\tFound = true;\n\t\t\tbreak;\n\t\t}\n\t\tSlotBase += (*itr)->GetNumSlots();\n\t}  // for itr - m_SlotAreas[]\n\tif (!Found)\n\t{\n\t\tLOGERROR(\"cWindow::SendSlot(): unknown a_SlotArea\");\n\t\tASSERT(!\"cWindow::SendSlot(): unknown a_SlotArea\");\n\t\treturn;\n\t}\n\n\ta_Player.GetClientHandle()->SendInventorySlot(\n\t\tm_WindowID, static_cast<short>(a_RelativeSlotNum + SlotBase), *(a_SlotArea->GetSlot(a_RelativeSlotNum, a_Player))\n\t);\n}\n\n\n\n\n\nvoid cWindow::Destroy(void)\n{\n\tif (m_Owner != nullptr)\n\t{\n\t\tm_Owner->CloseWindow();\n\t\tm_Owner = nullptr;\n\t}\n\tm_IsDestroyed = true;\n}\n\n\n\n\n\ncSlotArea * cWindow::GetSlotArea(int a_GlobalSlotNum, int & a_LocalSlotNum)\n{\n\tif ((a_GlobalSlotNum < 0) || (a_GlobalSlotNum >= GetNumSlots()))\n\t{\n\t\tLOGWARNING(\"%s: requesting an invalid SlotNum: %d out of %d slots\", __FUNCTION__, a_GlobalSlotNum, GetNumSlots() - 1);\n\t\tASSERT(!\"Invalid SlotNum\");\n\t\treturn nullptr;\n\t}\n\n\t// Iterate through all the SlotAreas, find the correct one\n\tint LocalSlotNum = a_GlobalSlotNum;\n\tfor (cSlotAreas::iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t{\n\t\tif (LocalSlotNum < (*itr)->GetNumSlots())\n\t\t{\n\t\t\ta_LocalSlotNum = LocalSlotNum;\n\t\t\treturn *itr;\n\t\t}\n\t\tLocalSlotNum -= (*itr)->GetNumSlots();\n\t}  // for itr - m_SlotAreas[]\n\n\t// We shouldn't be here - the check at the beginnning should prevent this. Log and assert\n\tLOGWARNING(\"%s: GetNumSlots() is out of sync: %d; LocalSlotNum = %d\", __FUNCTION__, GetNumSlots(), LocalSlotNum);\n\tASSERT(!\"Invalid GetNumSlots\");\n\treturn nullptr;\n}\n\n\n\n\n\nconst cSlotArea * cWindow::GetSlotArea(int a_GlobalSlotNum, int & a_LocalSlotNum) const\n{\n\tif ((a_GlobalSlotNum < 0) || (a_GlobalSlotNum >= GetNumSlots()))\n\t{\n\t\tLOGWARNING(\"%s: requesting an invalid SlotNum: %d out of %d slots\", __FUNCTION__, a_GlobalSlotNum, GetNumSlots() - 1);\n\t\tASSERT(!\"Invalid SlotNum\");\n\t\treturn nullptr;\n\t}\n\n\t// Iterate through all the SlotAreas, find the correct one\n\tint LocalSlotNum = a_GlobalSlotNum;\n\tfor (cSlotAreas::const_iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)\n\t{\n\t\tif (LocalSlotNum < (*itr)->GetNumSlots())\n\t\t{\n\t\t\ta_LocalSlotNum = LocalSlotNum;\n\t\t\treturn *itr;\n\t\t}\n\t\tLocalSlotNum -= (*itr)->GetNumSlots();\n\t}  // for itr - m_SlotAreas[]\n\n\t// We shouldn't be here - the check at the beginnning should prevent this. Log and assert\n\tLOGWARNING(\"%s: GetNumSlots() is out of sync: %d; LocalSlotNum = %d\", __FUNCTION__, GetNumSlots(), LocalSlotNum);\n\tASSERT(!\"Invalid GetNumSlots\");\n\treturn nullptr;\n}\n\n\n\n\n\nvoid cWindow::OnPaintBegin(cPlayer & a_Player)\n{\n\t// Prepares the internal structures for inventory painting from the specified player\n\ta_Player.ClearInventoryPaintSlots();\n}\n\n\n\n\n\nvoid cWindow::OnPaintProgress(cPlayer & a_Player, int a_SlotNum)\n{\n\t// Add the slot to the internal structures for inventory painting by the specified player\n\ta_Player.AddInventoryPaintSlot(a_SlotNum);\n}\n\n\n\n\n\nvoid cWindow::OnLeftPaintEnd(cPlayer & a_Player)\n{\n\t// Process the entire action stored in the internal structures for inventory painting\n\t// distribute as many items as possible\n\n\tconst cSlotNums & SlotNums = a_Player.GetInventoryPaintSlots();\n\tcItem ToDistribute(a_Player.GetDraggingItem());\n\tchar ToEachSlot = ToDistribute.m_ItemCount / static_cast<char>(SlotNums.size());\n\n\tchar NumDistributed = DistributeItemToSlots(a_Player, ToDistribute, ToEachSlot, SlotNums);\n\n\t// Remove the items distributed from the dragging item:\n\ta_Player.GetDraggingItem().m_ItemCount -= NumDistributed;\n\tif (a_Player.GetDraggingItem().m_ItemCount == 0)\n\t{\n\t\ta_Player.GetDraggingItem().Empty();\n\t}\n\n\tSendWholeWindow(*a_Player.GetClientHandle());\n\n\t// To fix #2345 (custom recipes don't work when inventory-painting), we send the result slot explicitly once again\n\t// This is a fix for what seems like a client-side bug\n\ta_Player.GetClientHandle()->SendInventorySlot(m_WindowID, 0, *GetSlot(a_Player, 0));\n}\n\n\n\n\n\nvoid cWindow::OnRightPaintEnd(cPlayer & a_Player)\n{\n\t// Process the entire action stored in the internal structures for inventory painting\n\t// distribute one item into each slot\n\n\tconst cSlotNums & SlotNums = a_Player.GetInventoryPaintSlots();\n\tcItem ToDistribute(a_Player.GetDraggingItem());\n\n\tchar NumDistributed = DistributeItemToSlots(a_Player, ToDistribute, 1, SlotNums);\n\n\t// Remove the items distributed from the dragging item:\n\ta_Player.GetDraggingItem().m_ItemCount -= NumDistributed;\n\tif (a_Player.GetDraggingItem().m_ItemCount == 0)\n\t{\n\t\ta_Player.GetDraggingItem().Empty();\n\t}\n\n\tSendWholeWindow(*a_Player.GetClientHandle());\n\n\t// To fix #2345 (custom recipes don't work when inventory-painting), we send the result slot explicitly once again\n\t// This is a fix for what seems like a client-side bug\n\ta_Player.GetClientHandle()->SendInventorySlot(m_WindowID, 0, *GetSlot(a_Player, 0));\n}\n\n\n\n\n\nvoid cWindow::OnMiddlePaintEnd(cPlayer & a_Player)\n{\n\tif (!a_Player.IsGameModeCreative())\n\t{\n\t\t// Midle click paint is only valid for creative mode\n\t\treturn;\n\t}\n\n\t// Fill available slots with full stacks of the dragging item\n\tconst auto & DraggingItem = a_Player.GetDraggingItem();\n\tauto StackSize = DraggingItem.GetMaxStackSize();\n\tif (0 < DistributeItemToSlots(a_Player, DraggingItem, StackSize, a_Player.GetInventoryPaintSlots(), false))\n\t{\n\t\t// If any items were distibuted, set dragging item empty\n\t\ta_Player.GetDraggingItem().Empty();\n\t}\n\n\tSendWholeWindow(*a_Player.GetClientHandle());\n}\n\n\n\n\n\nchar cWindow::DistributeItemToSlots(cPlayer & a_Player, const cItem & a_Item, char a_NumToEachSlot, const cSlotNums & a_SlotNums, bool a_LimitItems)\n{\n\tif (a_LimitItems && (static_cast<size_t>(a_Item.m_ItemCount) < a_SlotNums.size()))\n\t{\n\t\tLOGWARNING(\"%s: Distributing less items (%d) than slots (%zu)\", __FUNCTION__, static_cast<int>(a_Item.m_ItemCount), a_SlotNums.size());\n\t\t// This doesn't seem to happen with the 1.5.1 client, so we don't worry about it for now\n\t\treturn 0;\n\t}\n\n\t// Distribute to individual slots, keep track of how many items were actually distributed (full stacks etc.)\n\tchar NumDistributed = 0;\n\tfor (cSlotNums::const_iterator itr = a_SlotNums.begin(), end = a_SlotNums.end(); itr != end; ++itr)\n\t{\n\t\tint LocalSlotNum = 0;\n\t\tcSlotArea * Area = GetSlotArea(*itr, LocalSlotNum);\n\t\tif (Area == nullptr)\n\t\t{\n\t\t\tLOGWARNING(\"%s: Bad SlotArea for slot %d\", __FUNCTION__, *itr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Modify the item at the slot\n\t\tcItem AtSlot(*Area->GetSlot(LocalSlotNum, a_Player));\n\t\tchar MaxStack = AtSlot.GetMaxStackSize();\n\t\tif (AtSlot.IsEmpty())\n\t\t{\n\t\t\t// Empty, just move all of it there:\n\t\t\tcItem ToStore(a_Item);\n\t\t\tToStore.m_ItemCount = std::min<char>(a_NumToEachSlot, MaxStack);\n\t\t\tArea->SetSlot(LocalSlotNum, a_Player, ToStore);\n\t\t\tNumDistributed += ToStore.m_ItemCount;\n\t\t}\n\t\telse if (AtSlot.IsEqual(a_Item))\n\t\t{\n\t\t\t// Occupied, add and cap at MaxStack:\n\t\t\tchar CanStore = std::min<char>(a_NumToEachSlot, MaxStack - AtSlot.m_ItemCount);\n\t\t\tAtSlot.m_ItemCount += CanStore;\n\t\t\tArea->SetSlot(LocalSlotNum, a_Player, AtSlot);\n\t\t\tNumDistributed += CanStore;\n\t\t}\n\t}  // for itr - SlotNums[]\n\treturn NumDistributed;\n}\n"
  },
  {
    "path": "src/UI/Window.h",
    "content": "\n// Window.h\n\n// Interfaces to the cWindow class representing a UI window for a specific block\n\n\n\n\n\n#pragma once\n\n#include \"../FunctionRef.h\"\n#include \"../ItemGrid.h\"\n\n\n\n\n\nclass cPlayer;\nclass cWindowOwner;\nclass cClientHandle;\nclass cBrewingstandEntity;\nclass cChestEntity;\nclass cEnderChestEntity;\nclass cFurnaceEntity;\nclass cHopperEntity;\nclass cMinecartWithChest;\nclass cBeaconEntity;\nclass cSlotArea;\nclass cSlotAreaAnvil;\nclass cWorld;\n\ntypedef std::list<cPlayer *> cPlayerList;\ntypedef std::vector<cSlotArea *> cSlotAreas;\nusing cPlayerListCallback   = cFunctionRef<bool(cPlayer       &)>;\nusing cClientHandleCallback = cFunctionRef<bool(cClientHandle &)>;\n\n\n\n\n// tolua_begin\n\n/**\nRepresents a UI window.\n\nEach window has a list of players that are currently using it\nWhen there's no player using a window, it is destroyed.\nA window consists of several areas of slots with similar functionality - for example the crafting grid area, or\nthe inventory area. Each area knows what its slots are (GetSlot() function) and can handle mouse clicks.\nThe window acts only as a top-level container for those areas, redirecting the click events to the correct areas.\nInventory painting, introduced in 1.5, is handled by the window, too\n*/\nclass cWindow\n{\npublic:\n\tenum WindowType\n\t{\n\t\twtInventory   = -1,  // This value is never actually sent to a client\n\t\twtChest       = 0,\n\t\twtWorkbench   = 1,\n\t\twtFurnace     = 2,\n\t\twtDropSpenser = 3,  // Dropper or Dispenser\n\t\twtEnchantment = 4,\n\t\twtBrewery     = 5,\n\t\twtNPCTrade    = 6,\n\t\twtBeacon      = 7,\n\t\twtAnvil       = 8,\n\t\twtHopper      = 9,\n\t\twtDropper     = 10,\n\t\twtAnimalChest = 11,\n\t};\n\n\t// tolua_end\n\n\tstatic const int c_NumInventorySlots = 36;\n\n\tcWindow(WindowType a_WindowType, const AString & a_WindowTitle);\n\tvirtual ~cWindow();\n\n\tchar GetWindowID(void) const { return m_WindowID; }  // tolua_export\n\tint GetWindowType(void) const { return m_WindowType; }  // tolua_export\n\n\t/** Returns the textual representation of the window's type, such as \"minecraft:chest\". */\n\tconst AString GetWindowTypeName(void) const;  // tolua_export\n\n\tcWindowOwner * GetOwner(void) { return m_Owner; }\n\tvoid SetOwner( cWindowOwner * a_Owner) { m_Owner = a_Owner; }\n\n\t/** Returns the total number of slots */\n\tint GetNumSlots(void) const;\n\n\t/** Returns the number of slots, excluding the player's inventory (used for network protocols) */\n\tint GetNumNonInventorySlots(void) const { return GetNumSlots() - c_NumInventorySlots; }\n\n\t// tolua_begin\n\n\t/** Returns the item at the specified slot for the specified player. Returns nullptr if invalid SlotNum requested */\n\tconst cItem * GetSlot(cPlayer & a_Player, int a_SlotNum) const;\n\n\t/** Sets the item to the specified slot for the specified player */\n\tvoid SetSlot(cPlayer & a_Player, int a_SlotNum, const cItem & a_Item);\n\n\t/** Returns true if the specified slot is in the Player Main Inventory slotarea */\n\tbool IsSlotInPlayerMainInventory(int a_SlotNum) const;\n\n\t/** Returns true if the specified slot is in the Player Hotbar slotarea */\n\tbool IsSlotInPlayerHotbar(int a_SlotNum) const;\n\n\t/** Returns true if the specified slot is in the Player Main Inventory or Hotbar slotareas. Note that returns false for Armor. */\n\tbool IsSlotInPlayerInventory(int a_SlotNum) const;\n\n\t// tolua_end\n\n\t/** Fills a_Slots with the slots read from m_SlotAreas[], for the specified player */\n\tvoid GetSlots(cPlayer & a_Player, cItems & a_Slots) const;\n\n\t/** Handles a click event from a player */\n\tvirtual void Clicked(\n\t\tcPlayer & a_Player, int a_WindowID,\n\t\tshort a_SlotNum, eClickAction a_ClickAction,\n\t\tconst cItem & a_ClickedItem\n\t);\n\n\tvirtual void OpenedByPlayer(cPlayer & a_Player);\n\n\t/** Called when a player closes this window; notifies all slot areas. Returns true if close accepted */\n\tvirtual bool ClosedByPlayer(cPlayer & a_Player, bool a_CanRefuse);\n\n\t/** Sends the specified slot's contents to all clients of this window; the slot is specified as local in an area */\n\tvoid BroadcastSlot(cSlotArea * a_Area, int a_LocalSlotNum);\n\n\t/** Sends the contents of the whole window to the specified client */\n\tvoid SendWholeWindow(cClientHandle & a_Client);\n\n\t/** Sends the contents of the whole window to all clients of this window. */\n\tvoid BroadcastWholeWindow(void);\n\n\t// tolua_begin\n\n\tconst AString & GetWindowTitle() const { return m_WindowTitle; }\n\tvoid SetWindowTitle(const AString & a_WindowTitle) { m_WindowTitle = a_WindowTitle; }\n\n\t/** Updates a numerical property associated with the window. Typically used for furnace progressbars.\n\tSends the UpdateWindowProperty packet to all clients of the window */\n\tvirtual void SetProperty(size_t a_Property, short a_Value);\n\n\t// tolua_end\n\n\tvoid OwnerDestroyed(void);\n\n\t/** Calls the callback safely for each player that has this window open; returns true if all players have been enumerated */\n\tbool ForEachPlayer(cPlayerListCallback a_Callback);\n\n\t/** Calls the callback safely for each client that has this window open; returns true if all clients have been enumerated */\n\tbool ForEachClient(cClientHandleCallback a_Callback);\n\n\t/** Called on shift-clicking to distribute the stack into other areas; Modifies a_ItemStack as it is distributed!\n\tif a_ShouldApply is true, the changes are written into the slots;\n\tif a_ShouldApply is false, only a_ItemStack is modified to reflect the number of fits (for fit-testing purposes) */\n\tvirtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) = 0;\n\n\t/** Called from DistributeStack() to distribute the stack into a_AreasInOrder; Modifies a_ItemStack as it is distributed!\n\tIf a_ShouldApply is true, the changes are written into the slots;\n\tif a_ShouldApply is false, only a_ItemStack is modified to reflect the number of fits (for fit-testing purposes)\n\tIf a_BackFill is true, the areas will be filled from the back (right side). (Example: Empty Hotbar -> Item get in slot 8, not slot 0) */\n\tvoid DistributeStackToAreas(cItem & a_ItemStack, cPlayer & a_Player, cSlotAreas & a_AreasInOrder, bool a_ShouldApply, bool a_BackFill);\n\n\t/** Called on DblClicking to collect all stackable items from all areas into hand.\n\tThe items are accumulated in a_Dragging and removed from the SlotAreas immediately.\n\tIf a_CollectFullStacks is false, slots with full stacks in the area are skipped while collecting.\n\tReturns true if full stack has been collected, false if there's space remaining to fill. */\n\tbool CollectItemsToHand(cItem & a_Dragging, cSlotArea & a_Area, cPlayer & a_Player, bool a_CollectFullStacks);\n\n\t/** Used by cSlotAreas to send individual slots to clients, a_RelativeSlotNum is the slot number relative to a_SlotArea */\n\tvoid SendSlot(cPlayer & a_Player, cSlotArea * a_SlotArea, int a_RelativeSlotNum);\n\nprotected:\n\n\tcSlotAreas m_SlotAreas;\n\n\tchar    m_WindowID;\n\tint     m_WindowType;\n\tAString m_WindowTitle;\n\n\tcCriticalSection m_CS;\n\tcPlayerList      m_OpenedBy;\n\n\tbool m_IsDestroyed;\n\n\tcWindowOwner * m_Owner;\n\n\tstatic Byte m_WindowIDCounter;\n\n\t/** Sets the internal flag as \"destroyed\"; notifies the owner that the window is destroying */\n\tvirtual void Destroy(void);\n\n\t/** Returns the correct slot area for the specified window-global SlotNum\n\tAlso returns the area-local SlotNum corresponding to the GlobalSlotNum\n\tIf the global SlotNum is out of range, returns nullptr */\n\tcSlotArea * GetSlotArea(int a_GlobalSlotNum, int & a_LocalSlotNum);\n\n\t/** Returns the correct slot area for the specified window-global SlotNum\n\tAlso returns the area-local SlotNum corresponding to the GlobalSlotNum\n\tIf the global SlotNum is out of range, returns nullptr.\n\tConst version. */\n\tconst cSlotArea * GetSlotArea(int a_GlobalSlotNum, int & a_LocalSlotNum) const;\n\n\t/** Prepares the internal structures for inventory painting from the specified player */\n\tvoid OnPaintBegin(cPlayer & a_Player);\n\n\t/** Adds the slot to the internal structures for inventory painting by the specified player */\n\tvoid OnPaintProgress(cPlayer & a_Player, int a_SlotNum);\n\n\t/** Processes the entire action stored in the internal structures for inventory painting; distributes as many items as possible */\n\tvoid OnLeftPaintEnd(cPlayer & a_Player);\n\n\t/** Processes the entire action stored in the internal structures for inventory painting; distributes one item into each slot */\n\tvoid OnRightPaintEnd(cPlayer & a_Player);\n\n\t/** Processes the entire action stored in the internal structures for inventory painting; distributes a full stack into each slot */\n\tvoid OnMiddlePaintEnd(cPlayer & a_Player);\n\n\t/** Distributes a_NumToEachSlot items into the slots specified in a_SlotNums; returns the total number of items distributed.\n\t@param a_LimitItems if false, no checks are performed on a_Item.m_ItemCount. */\n\tchar DistributeItemToSlots(cPlayer & a_Player, const cItem & a_Item, char a_NumToEachSlot, const cSlotNums & a_SlotNums, bool a_LimitItems = true);\n} ;  // tolua_export\n"
  },
  {
    "path": "src/UI/WindowOwner.h",
    "content": "#pragma once\n\n#include \"../BlockEntities/BlockEntity.h\"\n#include \"../Entities/Entity.h\"\n#include \"Window.h\"\n\n/* Being a descendant of cWindowOwner means that the class can own one window. That window can be\nqueried, opened by other players, closed by players and finally destroyed.\nAlso, a cWindowOwner can be queried for the block coords where the window is displayed. That will be used\nfor entities / players in motion to close their windows when they get too far away from the window \"source\". */\n\n\n\n\n\n/** Base class for the window owning */\nclass cWindowOwner\n{\npublic:\n\tcWindowOwner() :\n\t\tm_Window(nullptr)\n\t{\n\t}\n\n\tvirtual ~cWindowOwner()\n\t{\n\t}\n\n\tvoid CloseWindow(void)\n\t{\n\t\tm_Window = nullptr;\n\t}\n\n\tvoid OpenWindow(cWindow * a_Window)\n\t{\n\t\tm_Window = a_Window;\n\t\tm_Window->SetOwner(this);\n\t}\n\n\tcWindow * GetWindow(void) const\n\t{\n\t\treturn m_Window;\n\t}\n\n\t/** Returns the block position at which the element owning the window is */\n\tvirtual Vector3i GetBlockPos(void) = 0;\n\nprivate:\n\tcWindow * m_Window;\n};\n\n\n\n\n\n/** Window owner that is associated with a block entity (chest, furnace, ...) */\nclass cBlockEntityWindowOwner :\n\tpublic cWindowOwner\n{\npublic:\n\tcBlockEntityWindowOwner(cBlockEntity * a_BlockEntity) :\n\t\tm_BlockEntity(a_BlockEntity)\n\t{\n\t}\n\n\tvirtual Vector3i GetBlockPos(void) override\n\t{\n\t\treturn Vector3i(m_BlockEntity->GetPosX(), m_BlockEntity->GetPosY(), m_BlockEntity->GetPosZ());\n\t}\n\nprivate:\n\tcBlockEntity * m_BlockEntity;\n};\n\n\n\n\n\n/** Window owner that is associated with an entity (chest minecart etc.) */\nclass cEntityWindowOwner :\n\tpublic cWindowOwner\n{\npublic:\n\tcEntityWindowOwner(cEntity * a_Entity) :\n\t\tm_Entity(a_Entity)\n\t{\n\t}\n\n\tvirtual Vector3i GetBlockPos(void) override\n\t{\n\t\treturn m_Entity->GetPosition().Floor();\n\t}\n\nprivate:\n\tcEntity * m_Entity;\n};\n\n\n\n\n"
  },
  {
    "path": "src/UUID.cpp",
    "content": "// UUID.h\n\n// Defines the cUUID class representing a Universally Unique Identifier\n\n#include \"Globals.h\"\n#include \"UUID.h\"\n\n#include \"mbedtls/md5.h\"\n\n\n/** UUID normalised in textual form. */\nstruct sShortUUID\n{\n\tchar Data[32]{};\n\tbool IsValid = false;\n};\n\n/** Returns the given UUID in shortened form with IsValid indicating success.\nDoesn't check digits are hexadecimal but does check dashes if long form. */\nstatic sShortUUID ShortenUUID(const AString & a_StringUUID)\n{\n\tsShortUUID UUID;\n\tswitch (a_StringUUID.size())\n\t{\n\t\tcase 32:\n\t\t{\n\t\t\t// Already a short UUID\n\t\t\tstd::memcpy(UUID.Data, a_StringUUID.data(), 32);\n\t\t\tUUID.IsValid = true;\n\t\t\tbreak;\n\t\t}\n\t\tcase 36:\n\t\t{\n\t\t\t// Long UUID, confirm dashed\n\t\t\tif (\n\t\t\t\t(a_StringUUID[ 8] != '-') ||\n\t\t\t\t(a_StringUUID[13] != '-') ||\n\t\t\t\t(a_StringUUID[18] != '-') ||\n\t\t\t\t(a_StringUUID[23] != '-')\n\t\t\t)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Copy everying but the dashes from the string\n\t\t\tstd::memcpy(UUID.Data,      a_StringUUID.data(),       8);\n\t\t\tstd::memcpy(UUID.Data +  8, a_StringUUID.data() +  9,  4);\n\t\t\tstd::memcpy(UUID.Data + 12, a_StringUUID.data() + 14,  4);\n\t\t\tstd::memcpy(UUID.Data + 16, a_StringUUID.data() + 19,  4);\n\t\t\tstd::memcpy(UUID.Data + 20, a_StringUUID.data() + 24, 12);\n\t\t\tUUID.IsValid = true;\n\t\t}\n\t\tdefault: break;\n\t}\n\treturn UUID;\n}\n\n\n\n\n\n/** Returns the integer value of the hex digit or 0xff if invalid. */\nstatic Byte FromHexDigit(char a_Hex)\n{\n\tif (('0' <= a_Hex) && (a_Hex <= '9'))\n\t{\n\t\treturn static_cast<Byte>(a_Hex - '0');\n\t}\n\tif (('a' <= a_Hex) && (a_Hex <= 'f'))\n\t{\n\t\treturn static_cast<Byte>(10 + (a_Hex - 'a'));\n\t}\n\tif (('A' <= a_Hex) && (a_Hex <= 'F'))\n\t{\n\t\treturn static_cast<Byte>(10 + (a_Hex - 'A'));\n\t}\n\treturn 0xff;\n}\n\n\n\n\n\n/** From a number in the range [0, 16), returns the corresponding hex digit in lowercase. */\nstatic char ToHexDigit(UInt8 a_Nibble)\n{\n\tASSERT((a_Nibble & 0xf0) == 0);\n\treturn static_cast<char>(\n\t\t(a_Nibble < 10) ?\n\t\t('0' + a_Nibble) :\n\t\t('a' + (a_Nibble - 10))\n\t);\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cUUID:\n\nbool cUUID::FromString(const AString & a_StringUUID)\n{\n\tsShortUUID Norm = ShortenUUID(a_StringUUID);\n\tif (!Norm.IsValid)\n\t{\n\t\treturn false;\n\t}\n\n\tstd::array<Byte, 16> ParsedUUID{{0}};\n\tfor (size_t i = 0; i != m_UUID.size(); ++i)\n\t{\n\t\tByte HighNibble = FromHexDigit(Norm.Data[2 * i    ]);\n\t\tByte LowNibble  = FromHexDigit(Norm.Data[2 * i + 1]);\n\t\tif ((HighNibble > 0x0f) || (LowNibble > 0x0f))\n\t\t{\n\t\t\t// Invalid hex digit\n\t\t\treturn false;\n\t\t}\n\n\t\tParsedUUID[i] = static_cast<Byte>((HighNibble << 4) | LowNibble);\n\t}\n\n\t// Parsed successfully\n\tm_UUID = ParsedUUID;\n\treturn true;\n}\n\n\n\n\n\nAString cUUID::ToShortString() const\n{\n\tAString ShortString(32, '\\0');\n\tfor (size_t i = 0; i != m_UUID.size(); ++i)\n\t{\n\t\tByte HighNibble = (m_UUID[i] >> 4) & 0x0f;\n\t\tByte LowNibble  = m_UUID[i] & 0x0f;\n\n\t\tShortString[2 * i    ] = ToHexDigit(HighNibble);\n\t\tShortString[2 * i + 1] = ToHexDigit(LowNibble);\n\t}\n\treturn ShortString;\n}\n\n\n\n\n\nAString cUUID::ToLongString() const\n{\n\tAString LongString = ToShortString();\n\tLongString.reserve(36);\n\n\t// Convert to long form by inserting the dashes\n\tauto First = LongString.begin();\n\tLongString.insert(First +  8, '-');\n\tLongString.insert(First + 13, '-');\n\tLongString.insert(First + 18, '-');\n\tLongString.insert(First + 23, '-');\n\n\treturn LongString;\n}\n\n\n\n\n\nUInt8 cUUID::Version() const\n{\n\treturn static_cast<UInt8>((m_UUID[6] >> 4) & 0x0f);\n}\n\n\n\n\n\nUInt8 cUUID::Variant() const\n{\n\tconst Byte VariantBits = static_cast<Byte>((m_UUID[8] >> 5) & 0x07);\n\n\t/* Variant bits format:\n\t\tbits | variant |      Description\n\t\t-----|---------|----------------------\n\t\t0xx  |    0    |        Obsolete\n\t\t10x  |    1    |     Standard UUID\n\t\t110  |    2    | Microsoft Legacy GUID\n\t\t111  |    3    |        Reserved\n\t*/\n\n\tif ((VariantBits & 0x04) == 0)\n\t{\n\t\treturn 0;\n\t}\n\telse if ((VariantBits & 0x02) == 0)\n\t{\n\t\treturn 1;\n\t}\n\telse if ((VariantBits & 0x01) == 0)\n\t{\n\t\treturn 2;\n\t}\n\telse\n\t{\n\t\treturn 3;\n\t}\n}\n\n\n\n\n\nstd::array<Byte, 16> cUUID::ToRaw() const\n{\n\tstd::array<Byte, 16> Raw(m_UUID);\n\tif (Variant() == 2)\n\t{\n\t\t// Convert to microsoft mixed-endian format\n\t\t// First 3 components are host-endian, last 2 are network\n\t\tauto First = reinterpret_cast<UInt32 *>(Raw.data());\n\t\t*First = ntohl(*First);\n\n\t\tauto Second = reinterpret_cast<UInt16 *>(&Raw[4]);\n\t\t*Second = ntohs(*Second);\n\n\t\tauto Third = Second + 1;\n\t\t*Third = ntohs(*Third);\n\t}\n\n\treturn Raw;\n}\n\n\n\n\n\nvoid cUUID::FromRaw(const std::array<Byte, 16> & a_Raw)\n{\n\tm_UUID = a_Raw;\n\tif (Variant() != 2)\n\t{\n\t\t// Standard big-endian formats\n\t\treturn;\n\t}\n\n\t// Convert from microsoft mixed-endian format\n\t// First 3 components are host-endian, last 2 are network\n\tauto First = reinterpret_cast<UInt32 *>(m_UUID.data());\n\t*First = htonl(*First);\n\n\tauto Second = reinterpret_cast<UInt16 *>(&m_UUID[4]);\n\t*Second = htons(*Second);\n\n\tauto Third = Second + 1;\n\t*Third = htons(*Third);\n}\n\n\n\n\n\ncUUID cUUID::GenerateVersion3(const AString & a_Name)\n{\n\tcUUID UUID;\n\t// Generate an md5 checksum, and use it as base for the ID:\n\tconst Byte * ByteString = reinterpret_cast<const Byte *>(a_Name.data());\n\tmbedtls_md5(ByteString, a_Name.length(), UUID.m_UUID.data());\n\n\t// Insert version number\n\tUUID.m_UUID[6] = (UUID.m_UUID[6] & 0x0f) | 0x30;\n\n\t// Insert variant number\n\tUUID.m_UUID[8] = (UUID.m_UUID[8] & 0x3f) | 0x80;\n\n\treturn UUID;\n}\n\n\n\n\n"
  },
  {
    "path": "src/UUID.h",
    "content": "// UUID.h\n\n// Declares the cUUID class representing a Universally Unique Identifier\n\n#pragma once\n\n\n// tolua_begin\n\nclass cUUID\n{\npublic:\n\t/** Default constructed \"nil\" UUID */\n\tcUUID():\n\t\tm_UUID()\n\t{\n\t}\n\n\t/** Lexicographically compare bytes with another UUID.\n\tReturns:\n\t\t0 when equal to a_Other,\n\t\t< 0 when less than a_Other,\n\t\t> 0 when greater than a_Other */\n\tint Compare(const cUUID & a_Other) const\n\t{\n\t\treturn std::memcmp(m_UUID.data(), a_Other.m_UUID.data(), m_UUID.size());\n\t}\n\n\t/** Returns true if this contains the \"nil\" UUID with all bits set to 0 */\n\tbool IsNil() const\n\t{\n\t\treturn (m_UUID == std::array<Byte, 16>{{0}});\n\t}\n\n\t/** Tries to interpret the string as a short or long form UUID and assign from it.\n\tOn error, returns false and does not set the value. */\n\tbool FromString(const AString & a_StringUUID);\n\n\t/** Converts the UUID to a short form string (i.e without dashes). */\n\tAString ToShortString() const;\n\n\t/** Converts the UUID to a long form string (i.e. with dashes). */\n\tAString ToLongString() const;\n\n\t/** Returns the version number of the UUID. */\n\tUInt8 Version() const;\n\n\t/** Returns the variant number of the UUID. */\n\tUInt8 Variant() const;\n\n\t/** Generates a version 3, variant 1 UUID based on the md5 hash of a_Name. */\n\tstatic cUUID GenerateVersion3(const AString & a_Name);\n\n\t// tolua_end\n\n\t/** Converts UUID to raw memory representation, respecting UUID variant. */\n\tstd::array<Byte, 16> ToRaw() const;\n\n\t/** Assigns from raw memory representation, respecting UUID variant. */\n\tvoid FromRaw(const std::array<Byte, 16> & a_Raw);\n\nprivate:\n\t/** Binary UUID stored big-endian. */\n\tstd::array<Byte, 16> m_UUID;\n};  // tolua_export\n\n\n// Comparison operators:\n\ninline bool operator == (const cUUID & a_Lhs, const cUUID & a_Rhs)\n{\n\treturn (a_Lhs.Compare(a_Rhs) == 0);\n}\n\ninline bool operator != (const cUUID & a_Lhs, const cUUID & a_Rhs)\n{\n\treturn (a_Lhs.Compare(a_Rhs) != 0);\n}\n\ninline bool operator < (const cUUID & a_Lhs, const cUUID & a_Rhs)\n{\n\treturn (a_Lhs.Compare(a_Rhs) < 0);\n}\n\ninline bool operator <= (const cUUID & a_Lhs, const cUUID & a_Rhs)\n{\n\treturn (a_Lhs.Compare(a_Rhs) <= 0);\n}\n\ninline bool operator > (const cUUID & a_Lhs, const cUUID & a_Rhs)\n{\n\treturn (a_Lhs.Compare(a_Rhs) > 0);\n}\n\ninline bool operator >= (const cUUID & a_Lhs, const cUUID & a_Rhs)\n{\n\treturn (a_Lhs.Compare(a_Rhs) >= 0);\n}\n\n\n"
  },
  {
    "path": "src/Vector3.h",
    "content": "\n#pragma once\n\n\n\n\n\ntemplate <typename T>\n// tolua_begin\nclass Vector3\n{\n\n\tTOLUA_TEMPLATE_BIND((T, int, float, double))\n\npublic:\n\n\tT x, y, z;\n\n\n\tconstexpr Vector3(void) : x(0), y(0), z(0) {}\n\tconstexpr Vector3(T a_x, T a_y, T a_z) : x(a_x), y(a_y), z(a_z) {}\n\n\n\t#ifdef TOLUA_EXPOSITION  // Hardcoded copy constructors (tolua++ does not support function templates .. yet)\n\t\tVector3(const Vector3<float>  & a_Rhs);\n\t\tVector3(const Vector3<double> & a_Rhs);\n\t\tVector3(const Vector3<int>    & a_Rhs);\n\t#endif\n\n\n\t// tolua_end\n\t// Conversion constructors where U is not the same as T leaving the copy-constructor implicitly generated\n\ttemplate <typename U, std::enable_if_t<(!std::is_same<U, T>::value) && ((!std::is_integral<T>::value) || (std::is_integral<U>::value)), bool> = true>\n\tconstexpr Vector3(const Vector3<U> & a_Rhs):\n\t\t\tx(static_cast<T>(a_Rhs.x)),\n\t\t\ty(static_cast<T>(a_Rhs.y)),\n\t\t\tz(static_cast<T>(a_Rhs.z))\n\t{\n\t}\n\ttemplate <typename U, std::enable_if_t<(!std::is_same<U, T>::value) && ((std::is_integral<T>::value) && (!std::is_integral<U>::value)), bool> = true>\n\tconstexpr Vector3(const Vector3<U> & a_Rhs):\n\t\t\tx(static_cast<T>(std::floor(a_Rhs.x))),\n\t\t\ty(static_cast<T>(std::floor(a_Rhs.y))),\n\t\t\tz(static_cast<T>(std::floor(a_Rhs.z)))\n\t{\n\t}\n\t// tolua_begin\n\n\tinline void Set(T a_x, T a_y, T a_z)\n\t{\n\t\tx = a_x;\n\t\ty = a_y;\n\t\tz = a_z;\n\t}\n\n\tinline void Normalize(void)\n\t{\n\t\tdouble Len = 1.0 / Length();\n\n\t\tx = static_cast<T>(x * Len);\n\t\ty = static_cast<T>(y * Len);\n\t\tz = static_cast<T>(z * Len);\n\t}\n\n\tinline Vector3<T> NormalizeCopy(void) const\n\t{\n\t\tdouble Len = 1.0 / Length();\n\n\t\treturn Vector3<T>(\n\t\t\tstatic_cast<T>(x * Len),\n\t\t\tstatic_cast<T>(y * Len),\n\t\t\tstatic_cast<T>(z * Len)\n\t\t);\n\t}\n\n\t// tolua_end\n\n\t/** Sets the given vector to the normalized version of this vector.\n\tRemoved from LuaAPI, because Lua doesn't need distinguishing from the other overload. */\n\tinline void NormalizeCopy(Vector3<T> & a_Rhs) const\n\t{\n\t\tdouble Len = 1.0 / Length();\n\n\t\ta_Rhs.Set(\n\t\t\tstatic_cast<T>(x * Len),\n\t\t\tstatic_cast<T>(y * Len),\n\t\t\tstatic_cast<T>(z * Len)\n\t\t);\n\t}\n\n\t// tolua_begin\n\n\tinline bool HasNonZeroLength(void) const\n\t{\n\t\t#ifdef __clang__\n\t\t\t#pragma clang diagnostic push\n\t\t\t#pragma clang diagnostic ignored \"-Wfloat-equal\"\n\t\t#endif\n\n\t\treturn ((x != 0) || (y != 0) || (z != 0));\n\n\t\t#ifdef __clang__\n\t\t\t#pragma clang diagnostic pop\n\t\t#endif\n\t}\n\n\tinline double Length(void) const\n\t{\n\t\treturn sqrt(static_cast<double>(x * x + y * y + z * z));\n\t}\n\n\tinline double SqrLength(void) const\n\t{\n\t\treturn x * x + y * y + z * z;\n\t}\n\n\tinline T Dot(const Vector3<T> & a_Rhs) const\n\t{\n\t\treturn x * a_Rhs.x + y * a_Rhs.y + z * a_Rhs.z;\n\t}\n\n\t/** Updates each coord to its absolute value */\n\tinline void Abs()\n\t{\n\t\tx = std::abs(x);\n\t\ty = std::abs(y);\n\t\tz = std::abs(z);\n\t}\n\n\t/** Clamps each coord into the specified range. */\n\tinline void Clamp(T a_Min, T a_Max)\n\t{\n\t\tx = ::Clamp(x, a_Min, a_Max);\n\t\ty = ::Clamp(y, a_Min, a_Max);\n\t\tz = ::Clamp(z, a_Min, a_Max);\n\t}\n\n\tinline Vector3<T> Cross(const Vector3<T> & a_Rhs) const\n\t{\n\t\treturn Vector3<T>(\n\t\t\ty * a_Rhs.z - z * a_Rhs.y,\n\t\t\tz * a_Rhs.x - x * a_Rhs.z,\n\t\t\tx * a_Rhs.y - y * a_Rhs.x\n\t\t);\n\t}\n\n\tinline bool Equals(const Vector3<T> & a_Rhs) const\n\t{\n\t\t// Perform a strict comparison of the contents - we want to know whether this object is exactly equal\n\t\t// To perform EPS-based comparison, use the EqualsEps() function\n\n\t\t#ifdef __clang__\n\t\t\t#pragma clang diagnostic push\n\t\t\t#pragma clang diagnostic ignored \"-Wfloat-equal\"\n\t\t#endif\n\n\t\treturn !((x != a_Rhs.x) || (y != a_Rhs.y) || (z != a_Rhs.z));\n\n\t\t#ifdef __clang__\n\t\t\t#pragma clang diagnostic pop\n\t\t#endif\n\t}\n\n\tinline bool EqualsEps(const Vector3<T> & a_Rhs, T a_Eps) const\n\t{\n\t\treturn (std::abs(x - a_Rhs.x) < a_Eps) && (std::abs(y - a_Rhs.y) < a_Eps) && (std::abs(z - a_Rhs.z) < a_Eps);\n\t}\n\n\tinline void Move(T a_X, T a_Y, T a_Z)\n\t{\n\t\tx += a_X;\n\t\ty += a_Y;\n\t\tz += a_Z;\n\t}\n\n\tinline void Move(const Vector3<T> & a_Diff)\n\t{\n\t\tx += a_Diff.x;\n\t\ty += a_Diff.y;\n\t\tz += a_Diff.z;\n\t}\n\n\t/** Returns a new Vector3i with coords set to std::floor() of this vector's coords. */\n\tinline Vector3<int> Floor(void) const\n\t{\n\t\treturn Vector3<int>(\n\t\t\tFloorC(x),\n\t\t\tFloorC(y),\n\t\t\tFloorC(z)\n\t\t);\n\t}\n\n\t/** Returns a new Vector3i with coords set to std::ceil() of this vector's coords. */\n\tinline Vector3<int> Ceil() const\n\t{\n\t\treturn Vector3<int>(\n\t\t\tCeilC(x),\n\t\t\tCeilC(y),\n\t\t\tCeilC(z)\n\t\t);\n\t}\n\n\t// tolua_end\n\n\tinline bool operator != (const Vector3<T> & a_Rhs) const\n\t{\n\t\treturn !Equals(a_Rhs);\n\t}\n\n\tinline bool operator == (const Vector3<T> & a_Rhs) const\n\t{\n\t\treturn Equals(a_Rhs);\n\t}\n\n\tinline bool operator > (const Vector3<T> & a_Rhs) const\n\t{\n\t\treturn (SqrLength() > a_Rhs.SqrLength());\n\t}\n\n\tinline bool operator < (const Vector3<T> & a_Rhs) const\n\t{\n\t\treturn (SqrLength() < a_Rhs.SqrLength());\n\t}\n\n\tinline void operator += (const Vector3<T> & a_Rhs)\n\t{\n\t\tx += a_Rhs.x;\n\t\ty += a_Rhs.y;\n\t\tz += a_Rhs.z;\n\t}\n\n\tinline void operator -= (const Vector3<T> & a_Rhs)\n\t{\n\t\tx -= a_Rhs.x;\n\t\ty -= a_Rhs.y;\n\t\tz -= a_Rhs.z;\n\t}\n\n\tinline void operator *= (const Vector3<T> & a_Rhs)\n\t{\n\t\tx *= a_Rhs.x;\n\t\ty *= a_Rhs.y;\n\t\tz *= a_Rhs.z;\n\t}\n\n\tinline void operator *= (T a_v)\n\t{\n\t\tx *= a_v;\n\t\ty *= a_v;\n\t\tz *= a_v;\n\t}\n\n\t// tolua_begin\n\n\tinline Vector3<T> operator + (const Vector3<T>& a_Rhs) const\n\t{\n\t\treturn Vector3<T>(\n\t\t\tx + a_Rhs.x,\n\t\t\ty + a_Rhs.y,\n\t\t\tz + a_Rhs.z\n\t\t);\n\t}\n\n\tinline Vector3<T> operator - (const Vector3<T>& a_Rhs) const\n\t{\n\t\treturn Vector3<T>(\n\t\t\tx - a_Rhs.x,\n\t\t\ty - a_Rhs.y,\n\t\t\tz - a_Rhs.z\n\t\t);\n\t}\n\n\tinline Vector3<T> operator - (void) const\n\t{\n\t\treturn Vector3<T>(-x, -y, -z);\n\t}\n\n\tinline Vector3<T> operator * (const Vector3<T>& a_Rhs) const\n\t{\n\t\treturn Vector3<T>(\n\t\t\tx * a_Rhs.x,\n\t\t\ty * a_Rhs.y,\n\t\t\tz * a_Rhs.z\n\t\t);\n\t}\n\n\tinline Vector3<T> operator / (const Vector3<T> & a_Rhs)\n\t{\n\t\treturn Vector3<T>(\n\t\t\tx / a_Rhs.x,\n\t\t\ty / a_Rhs.y,\n\t\t\tz / a_Rhs.z\n\t\t);\n\t}\n\n\tinline Vector3<T> operator * (T a_v) const\n\t{\n\t\treturn Vector3<T>(\n\t\t\tx * a_v,\n\t\t\ty * a_v,\n\t\t\tz * a_v\n\t\t);\n\t}\n\n\tinline Vector3<T> operator / (T a_v) const\n\t{\n\t\treturn Vector3<T>(\n\t\t\tx / a_v,\n\t\t\ty / a_v,\n\t\t\tz / a_v\n\t\t);\n\t}\n\n\t/** Returns a copy of this vector moved by the specified amount on the X axis. */\n\tinline Vector3<T> addedX(T a_AddX) const\n\t{\n\t\treturn Vector3<T>(x + a_AddX, y, z);\n\t}\n\n\t/** Returns a copy of this vector moved by the specified amount on the y axis. */\n\tinline Vector3<T> addedY(T a_AddY) const\n\t{\n\t\treturn Vector3<T>(x, y + a_AddY, z);\n\t}\n\n\t/** Returns a copy of this vector moved by the specified amount on the Z axis. */\n\tinline Vector3<T> addedZ(T a_AddZ) const\n\t{\n\t\treturn Vector3<T>(x, y, z + a_AddZ);\n\t}\n\n\t/** Returns a copy of this vector moved by the specified amount on the X and Z axes. */\n\tinline Vector3<T> addedXZ(T a_AddX, T a_AddZ) const\n\t{\n\t\treturn Vector3<T>(x + a_AddX, y, z + a_AddZ);\n\t}\n\n\t/** Returns the coefficient for the (a_OtherEnd - this) line to reach the specified Z coord.\n\tThe result satisfies the following equation:\n\t(*this + Result * (a_OtherEnd - *this)).z = a_Z\n\tIf the line is too close to being parallel, this function returns NO_INTERSECTION\n\t*/\n\tinline double LineCoeffToXYPlane(const Vector3<T> & a_OtherEnd, T a_Z) const\n\t{\n\t\tif (std::abs(z - a_OtherEnd.z) < EPS)\n\t\t{\n\t\t\treturn NO_INTERSECTION;\n\t\t}\n\n\t\treturn (a_Z - z) / (a_OtherEnd.z - z);\n\t}\n\n\t/** Returns the coefficient for the (a_OtherEnd - this) line to reach the specified Y coord.\n\tThe result satisfies the following equation:\n\t(*this + Result * (a_OtherEnd - *this)).y = a_Y\n\tIf the line is too close to being parallel, this function returns NO_INTERSECTION\n\t*/\n\tinline double LineCoeffToXZPlane(const Vector3<T> & a_OtherEnd, T a_Y) const\n\t{\n\t\tif (std::abs(y - a_OtherEnd.y) < EPS)\n\t\t{\n\t\t\treturn NO_INTERSECTION;\n\t\t}\n\n\t\treturn (a_Y - y) / (a_OtherEnd.y - y);\n\t}\n\n\t/** Returns the coefficient for the (a_OtherEnd - this) line to reach the specified X coord.\n\tThe result satisfies the following equation:\n\t(*this + Result * (a_OtherEnd - *this)).x = a_X\n\tIf the line is too close to being parallel, this function returns NO_INTERSECTION\n\t*/\n\tinline double LineCoeffToYZPlane(const Vector3<T> & a_OtherEnd, T a_X) const\n\t{\n\t\tif (std::abs(x - a_OtherEnd.x) < EPS)\n\t\t{\n\t\t\treturn NO_INTERSECTION;\n\t\t}\n\n\t\treturn (a_X - x) / (a_OtherEnd.x - x);\n\t}\n\n\t/** Rotates the vector 90 degrees clockwise around the vertical axis.\n\tNote that this is specific to minecraft's axis ordering, which is X+ left, Z+ down. */\n\tinline void TurnCW(void)\n\t{\n\t\tstd::swap(x, z);\n\t\tx = -x;\n\t}\n\n\t/** Rotates the vector 90 degrees counterclockwise around the vertical axis.\n\tNote that this is specific to minecraft's axis ordering, which is X+ left, Z+ down. */\n\tinline void TurnCCW(void)\n\t{\n\t\tstd::swap(x, z);\n\t\tz = -z;\n\t}\n\n\t/** The max difference between two coords for which the coords are assumed equal. */\n\tstatic const double EPS;\n\n\t/** Return value of LineCoeffToPlane() if the line is parallel to the plane. */\n\tstatic const double NO_INTERSECTION;\n};\n// tolua_end\n\n\n\n\n\n/** Allows formatting a Vector<T> using the same format specifiers as for T\ne.g. `fmt::format(\"{0:0.2f}\", Vector3f{0.0231f, 1.2146f, 1.0f}) == \"{0.02, 1.21, 1.00}\"` */\ntemplate <typename What>\nclass fmt::formatter<Vector3<What>> : public fmt::formatter<What>\n{\n\tusing Super = fmt::formatter<What>;\n\n\ttemplate <typename FormatContext, size_t Len>\n\tvoid Write(FormatContext & a_Ctx, const char (& a_Str)[Len])\n\t{\n\t\tconst auto Itr = std::copy_n(&a_Str[0], Len - 1, a_Ctx.out());\n\t\ta_Ctx.advance_to(Itr);\n\t}\n\n\ttemplate <typename FormatContext>\n\tvoid Write(FormatContext & a_Ctx, const What & a_Arg)\n\t{\n\t\tconst auto Itr = Super::format(a_Arg, a_Ctx);\n\t\ta_Ctx.advance_to(Itr);\n\t}\n\npublic:\n\n\ttemplate <typename FormatContext>\n\tauto format(const Vector3<What> & a_Vec, FormatContext & a_Ctx)\n\t{\n\t\tWrite(a_Ctx, \"{\");\n\t\tWrite(a_Ctx, a_Vec.x);\n\t\tWrite(a_Ctx, \", \");\n\t\tWrite(a_Ctx, a_Vec.y);\n\t\tWrite(a_Ctx, \", \");\n\t\tWrite(a_Ctx, a_Vec.z);\n\t\tWrite(a_Ctx, \"}\");\n\t\treturn a_Ctx.out();\n\t}\n};\n\n\n\n\n\ntemplate <> inline Vector3<int> Vector3<int>::Floor(void) const\n{\n\treturn *this;\n}\n\n\n\n\n\ntemplate <typename What>\nclass VectorHasher\n{\npublic:\n\t/** Provides a hash of a vector's contents */\n\tsize_t operator()(const Vector3<What> & a_Vector) const\n\t{\n\t\t// Guaranteed to have non repeating hashes for any 128x128x128 area\n\t\tsize_t Hash = static_cast<size_t>(a_Vector.y);\n\t\tHash <<= 16;\n\t\tHash ^= static_cast<size_t>(a_Vector.x);\n\t\tHash ^= static_cast<size_t>(a_Vector.z) << 8;\n\t\treturn Hash;\n\t}\n};\n\n\n\n\n\ntemplate <typename T>\nconst double Vector3<T>::EPS = 0.000001;\n\ntemplate <typename T>\nconst double Vector3<T>::NO_INTERSECTION = 1e70;\n\n\n\n\n\n// tolua_begin\ntypedef Vector3<double> Vector3d;\ntypedef Vector3<float>  Vector3f;\ntypedef Vector3<int>    Vector3i;\n// tolua_end\n\n\n\n\n\ntypedef std::vector<Vector3i> cVector3iArray;\n"
  },
  {
    "path": "src/VoronoiMap.cpp",
    "content": "\n// VoronoiMap.cpp\n\n// Implements the cVoronoiMap class that implements a Voronoi algorithm over a noise to produce a map\n\n#include \"Globals.h\"\n#include \"VoronoiMap.h\"\n\n\n\n\n\ncVoronoiMap::cVoronoiMap(int a_Seed, int a_CellSize, int a_JitterSize) :\n\tm_Noise1(a_Seed + 1),\n\tm_Noise2(a_Seed + 2),\n\tm_Noise3(a_Seed + 3),\n\tm_CellSize(std::max(a_CellSize, 2)),\n\tm_JitterSize(Clamp(a_JitterSize, 1, a_CellSize)),\n\tm_OddRowOffset(0),\n\tm_CurrentCellX(9999999),  // Cell coords that are definitely out of the range for normal generator, so that the first query will overwrite them\n\tm_CurrentCellZ(9999999)\n{\n}\n\n\n\n\n\nvoid cVoronoiMap::SetCellSize(int a_CellSize)\n{\n\ta_CellSize = std::max(a_CellSize, 2);  // Cell size must be at least 2\n\tm_CellSize = a_CellSize;\n\n\t// For compatibility with previous version, which didn't have the jitter, we set jitter here as well.\n\tm_JitterSize = a_CellSize;\n}\n\n\n\n\n\nvoid cVoronoiMap::SetJitterSize(int a_JitterSize)\n{\n\tm_JitterSize = Clamp(a_JitterSize, 1, m_CellSize);\n}\n\n\n\n\n\nvoid cVoronoiMap::SetOddRowOffset(int a_OddRowOffset)\n{\n\tm_OddRowOffset = Clamp(a_OddRowOffset, -m_CellSize, m_CellSize);\n}\n\n\n\n\n\nint cVoronoiMap::GetValueAt(int a_X, int a_Y)\n{\n\tint SeedX, SeedY, MinDist2;\n\treturn GetValueAt(a_X, a_Y, SeedX, SeedY, MinDist2);\n}\n\n\n\n\n\nint cVoronoiMap::GetValueAt(int a_X, int a_Y, int & a_MinDist)\n{\n\tint SeedX, SeedY, MinDist2;\n\tint res = GetValueAt(a_X, a_Y, SeedX, SeedY, MinDist2);\n\ta_MinDist = (a_X - SeedX) * (a_X - SeedX) + (a_Y - SeedY) * (a_Y - SeedY);\n\treturn res;\n}\n\n\n\n\n\nint cVoronoiMap::GetValueAt(\n\tint a_X, int a_Y,  // Coords to query\n\tint & a_NearestSeedX, int & a_NearestSeedY,  // Coords of the closest cell\n\tint & a_MinDist2  // Distance to the second closest cell\n)\n{\n\tint CellX = a_X / m_CellSize;\n\tint CellY = a_Y / m_CellSize;\n\n\tUpdateCell(CellX, CellY);\n\n\t// Get 5x5 neighboring cell seeds, compare distance to each. Return the value in the minumim-distance cell\n\tint NearestSeedX = 0, NearestSeedY = 0;\n\tint MinDist = m_CellSize * m_CellSize * 16;  // There has to be a cell closer than this\n\tint MinDist2 = MinDist;\n\tint res = 0;  // Will be overriden\n\tfor (int x = 0; x < 5; x++)\n\t{\n\t\tfor (int y = 0; y < 5; y++)\n\t\t{\n\t\t\tint SeedX = m_SeedX[x][y];\n\t\t\tint SeedY = m_SeedZ[x][y];\n\n\t\t\tint Dist = (SeedX - a_X) * (SeedX - a_X) + (SeedY - a_Y) * (SeedY - a_Y);\n\t\t\tif (Dist < MinDist)\n\t\t\t{\n\t\t\t\tNearestSeedX = SeedX;\n\t\t\t\tNearestSeedY = SeedY;\n\t\t\t\tMinDist2 = MinDist;\n\t\t\t\tMinDist = Dist;\n\t\t\t\tres = m_Noise3.IntNoise2DInt(x + CellX - 2, y + CellY - 2);\n\t\t\t}\n\t\t\telse if (Dist < MinDist2)\n\t\t\t{\n\t\t\t\tMinDist2 = Dist;\n\t\t\t}\n\t\t}  // for z\n\t}  // for x\n\n\ta_NearestSeedX = NearestSeedX;\n\ta_NearestSeedY = NearestSeedY;\n\ta_MinDist2 = MinDist2;\n\treturn res;\n}\n\n\n\n\n\nvoid cVoronoiMap::FindNearestSeeds(\n\tint a_X, int a_Y,\n\tint & a_NearestSeedX, int & a_NearestSeedY,\n\tint & a_SecondNearestSeedX, int & a_SecondNearestSeedY\n)\n{\n\tint CellX = a_X / m_CellSize;\n\tint CellY = a_Y / m_CellSize;\n\n\tUpdateCell(CellX, CellY);\n\n\t// Get 5x5 neighboring cell seeds, compare distance to each. Return the value in the minumim-distance cell\n\tint NearestSeedX = 0, NearestSeedY = 0;\n\tint SecondNearestSeedX = 0, SecondNearestSeedY = 0;\n\tint MinDist = m_CellSize * m_CellSize * 16;  // There has to be a cell closer than this\n\tint MinDist2 = MinDist;\n\tfor (int x = 0; x < 5; x++)\n\t{\n\t\tfor (int y = 0; y < 5; y++)\n\t\t{\n\t\t\tint SeedX = m_SeedX[x][y];\n\t\t\tint SeedY = m_SeedZ[x][y];\n\n\t\t\tint Dist = (SeedX - a_X) * (SeedX - a_X) + (SeedY - a_Y) * (SeedY - a_Y);\n\t\t\tif (Dist < MinDist)\n\t\t\t{\n\t\t\t\tSecondNearestSeedX = NearestSeedX;\n\t\t\t\tSecondNearestSeedY = NearestSeedY;\n\t\t\t\tMinDist2 = MinDist;\n\t\t\t\tNearestSeedX = SeedX;\n\t\t\t\tNearestSeedY = SeedY;\n\t\t\t\tMinDist = Dist;\n\t\t\t}\n\t\t\telse if (Dist < MinDist2)\n\t\t\t{\n\t\t\t\tSecondNearestSeedX = SeedX;\n\t\t\t\tSecondNearestSeedY = SeedY;\n\t\t\t\tMinDist2 = Dist;\n\t\t\t}\n\t\t}  // for z\n\t}  // for x\n\n\ta_NearestSeedX = NearestSeedX;\n\ta_NearestSeedY = NearestSeedY;\n\ta_SecondNearestSeedX = SecondNearestSeedX;\n\ta_SecondNearestSeedY = SecondNearestSeedY;\n}\n\n\n\n\n\nvoid cVoronoiMap::UpdateCell(int a_CellX, int a_CellZ)\n{\n\t// If the specified cell is currently cached, bail out:\n\tif ((a_CellX == m_CurrentCellX) && (a_CellZ == m_CurrentCellZ))\n\t{\n\t\treturn;\n\t}\n\n\t// Update the cell cache for the new cell position:\n\tint NoiseBaseX = a_CellX - 2;\n\tint NoiseBaseZ = a_CellZ - 2;\n\tfor (int x = 0; x < 5; x++)\n\t{\n\t\tint BaseX = (NoiseBaseX + x) * m_CellSize;\n\t\tint OddRowOffset = ((NoiseBaseX + x) & 0x01) * m_OddRowOffset;\n\t\tfor (int z = 0; z < 5; z++)\n\t\t{\n\t\t\tint OffsetX = (m_Noise1.IntNoise2DInt(NoiseBaseX + x, NoiseBaseZ + z) / 8) % m_JitterSize;\n\t\t\tint OffsetZ = (m_Noise2.IntNoise2DInt(NoiseBaseX + x, NoiseBaseZ + z) / 8) % m_JitterSize;\n\t\t\tm_SeedX[x][z] = BaseX + OffsetX;\n\t\t\tm_SeedZ[x][z] = (NoiseBaseZ + z) * m_CellSize + OddRowOffset + OffsetZ;\n\t\t}  // for z\n\t}  // for x\n\tm_CurrentCellX = a_CellX;\n\tm_CurrentCellZ = a_CellZ;\n}\n\n\n\n\n"
  },
  {
    "path": "src/VoronoiMap.h",
    "content": "\n// VoronoiMap.h\n\n// Declares the cVoronoiMap class that implements a Voronoi algorithm over a noise to produce a map\n\n\n\n\n\n#pragma once\n\n#include \"Noise/Noise.h\"\n\n\n\n\n\nclass cVoronoiMap\n{\npublic:\n\tcVoronoiMap(int a_Seed, int a_CellSize = 128, int a_JitterSize = 128);\n\n\t/** Sets both the cell size and jitter size used for generating the Voronoi seeds. */\n\tvoid SetCellSize(int a_CellSize);\n\n\t/** Sets the jitter size. Clamps it to current cell size. */\n\tvoid SetJitterSize(int a_JitterSize);\n\n\t/** Sets the offset that is added to each odd row of cells.\n\tThis offset makes the voronoi cells align to a non-grid.\n\tClamps the value to [-m_CellSize, +m_CellSize]. */\n\tvoid SetOddRowOffset(int a_OddRowOffset);\n\n\t/** Returns the value in the cell into which the specified point lies. */\n\tint GetValueAt(int a_X, int a_Y);\n\n\t/** Returns the value in the cell into which the specified point lies,\n\tand the distance to the nearest Voronoi seed. */\n\tint GetValueAt(int a_X, int a_Y, int & a_MinDistance);\n\n\t/** Returns the value in the cell into which the specified point lies,\n\tand the distances to the 2 nearest Voronoi seeds. Uses a cache. */\n\tint GetValueAt(\n\t\tint a_X, int a_Y,                            // Coords to query\n\t\tint & a_NearestSeedX, int & a_NearestSeedY,  // Coords of the closest cell's seed\n\t\tint & a_MinDist2                             // Distance to the second closest cell's seed\n\t);\n\n\t/** Finds the nearest and second nearest seeds, returns their coords. */\n\tvoid FindNearestSeeds(\n\t\tint a_X, int a_Y,\n\t\tint & a_NearestSeedX, int & a_NearestSeedY,\n\t\tint & a_SecondNearestSeedX, int & a_SecondNearestSeedY\n\t);\n\nprotected:\n\t/** The noise used for generating Voronoi seeds */\n\tcNoise m_Noise1;\n\tcNoise m_Noise2;\n\tcNoise m_Noise3;\n\n\t/** Size of the Voronoi cells (avg X / Y distance between the seeds). Expected to be at least 2. */\n\tint m_CellSize;\n\n\t/** The amount that the cell seeds may be offset from the grid.\n\tExpected to be at least 1 and less than m_CellSize. */\n\tint m_JitterSize;\n\n\t/** The constant amount that the cell seeds of every odd row will be offset from the grid.\n\tThis allows us to have non-rectangular grids.\n\tExpected to be between -m_CellSize and +m_CellSize. */\n\tint m_OddRowOffset;\n\n\t/** The X coordinate of the currently cached cell neighborhood */\n\tint m_CurrentCellX;\n\n\t/** The Z coordinate of the currently cached cell neighborhood */\n\tint m_CurrentCellZ;\n\n\t/** The seeds of cells around m_CurrentCellX, m_CurrentCellZ, X-coords */\n\tint m_SeedX[5][5];\n\n\t/** The seeds of cells around m_CurrentCellX, m_CurrentCellZ, X-coords */\n\tint m_SeedZ[5][5];\n\n\n\t/** Updates the cached cell seeds to match the specified cell. Noop if cell pos already matches.\n\tUpdates m_SeedX and m_SeedZ. */\n\tvoid UpdateCell(int a_CellX, int a_CellZ);\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/WebAdmin.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"WebAdmin.h\"\n\n#include \"World.h\"\n#include \"Entities/Player.h\"\n#include \"Server.h\"\n#include \"Root.h\"\n\n#include \"HTTP/HTTPServerConnection.h\"\n#include \"HTTP/HTTPFormParser.h\"\n\n\n\n\n\nstatic const char DEFAULT_WEBADMIN_PORTS[] = \"8080\";\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWebadminRequestData\n\n/** The form parser callbacks for requests in the \"/webadmin\" and \"/~webadmin\" paths */\nclass cWebadminRequestData :\n\tpublic cHTTPFormParser::cCallbacks,\n\tpublic cHTTPIncomingRequest::cUserData\n{\npublic:\n\tcHTTPFormParser m_Form;\n\n\n\tcWebadminRequestData(const cHTTPIncomingRequest & a_Request):\n\t\tm_Form(a_Request, *this)\n\t{\n\t}\n\n\t// cHTTPFormParser::cCallbacks overrides. Files are ignored:\n\tvirtual void OnFileStart(cHTTPFormParser &, const AString & a_FileName) override\n\t{\n\t\tUNUSED(a_FileName);\n\t}\n\tvirtual void OnFileData(cHTTPFormParser &, const char * a_Data, size_t a_Size) override\n\t{\n\t\tUNUSED(a_Data);\n\t\tUNUSED(a_Size);\n\t}\n\tvirtual void OnFileEnd(cHTTPFormParser &) override {}\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWebAdmin:\n\ncWebAdmin::cWebAdmin(void) :\n\tm_TemplateScript(\"<webadmin_template>\"),\n\tm_IsInitialized(false),\n\tm_IsRunning(false)\n{\n}\n\n\n\n\n\ncWebAdmin::~cWebAdmin()\n{\n\tASSERT(!m_IsRunning);  // Was the HTTP server stopped properly?\n}\n\n\n\n\n\nbool cWebAdmin::Init(void)\n{\n\tif (!LoadIniFile())\n\t{\n\t\t// WebAdmin is disabled, bail out faking a success\n\t\treturn true;\n\t}\n\n\tLOGD(\"Initialising WebAdmin...\");\n\n\tReload();\n\n\t// Read the ports to be used:\n\t// Note that historically the ports were stored in the \"Port\" and \"PortsIPv6\" values\n\tm_Ports = ReadUpgradeIniPorts(m_IniFile, \"WebAdmin\", \"Ports\", \"Port\", \"PortsIPv6\", DEFAULT_WEBADMIN_PORTS);\n\n\tif (!m_HTTPServer.Initialize())\n\t{\n\t\treturn false;\n\t}\n\tm_IsInitialized = true;\n\tm_IniFile.WriteFile(\"webadmin.ini\");\n\treturn true;\n}\n\n\n\n\n\nbool cWebAdmin::Start(void)\n{\n\tif (!m_IsInitialized)\n\t{\n\t\t// Not initialized\n\t\treturn false;\n\t}\n\n\tLOGD(\"Starting WebAdmin...\");\n\n\tm_IsRunning = m_HTTPServer.Start(*this, m_Ports);\n\treturn m_IsRunning;\n}\n\n\n\n\n\nvoid cWebAdmin::Stop(void)\n{\n\tif (!m_IsRunning)\n\t{\n\t\treturn;\n\t}\n\n\tLOGD(\"Stopping WebAdmin...\");\n\tm_HTTPServer.Stop();\n\tm_IsRunning = false;\n}\n\n\n\n\n\nbool cWebAdmin::LoadLoginPage(void)\n{\n\tcFile File(\"webadmin/login_template.html\", cFile::fmRead);\n\tif (!File.IsOpen())\n\t{\n\t\treturn false;\n\t}\n\n\tAString TemplateContent;\n\tif (File.ReadRestOfFile(TemplateContent) == -1)\n\t{\n\t\treturn false;\n\t}\n\n\tcCSLock Lock(m_CS);\n\tm_LoginPage = TemplateContent;\n\treturn true;\n}\n\n\n\n\n\nvoid cWebAdmin::RemoveAllPluginWebTabs(const AString & a_PluginName)\n{\n\tcCSLock lock(m_CS);\n\tm_WebTabs.erase(std::remove_if(m_WebTabs.begin(), m_WebTabs.end(), [=](const cWebTabPtr & a_CBWebTab)\n\t\t{\n\t\t\treturn (a_CBWebTab->m_PluginName == a_PluginName);\n\t\t}),\n\t\tm_WebTabs.end()\n\t);\n}\n\n\n\n\n\nvoid cWebAdmin::Reload(void)\n{\n\tcCSLock lock(m_CS);\n\tif (!LoadIniFile())\n\t{\n\t\t// We are asked to disable the webadmin, cannot do that, so warn the admin:\n\t\tLOGWARNING(\n\t\t\t\"WebAdmin was previously enabled and now the settings say to disable it.\"\n\t\t\t\" This will not take effect until you restart the server.\"\n\t\t);\n\t}\n\telse if (!HasUsers())\n\t{\n\t\tLOGWARNING(\n\t\t\t\"The webadmin is enabled but has no users configured.\"\n\t\t\t\" To add new users, edit webadmin.ini\"\n\t\t);\n\t}\n\n\t// Initialize the WebAdmin template script and reload the file:\n\tif (m_TemplateScript.IsValid())\n\t{\n\t\tm_TemplateScript.Close();\n\t}\n\tm_TemplateScript.Create();\n\tm_TemplateScript.RegisterAPILibs();\n\tif (!m_TemplateScript.LoadFile(\"webadmin/template.lua\"))\n\t{\n\t\tLOGWARN(\"Could not load WebAdmin template \\\"%s\\\". WebAdmin will not work properly!\", \"webadmin/template.lua\");\n\t\tm_TemplateScript.Close();\n\t}\n\n\t// Load the login template, provide a fallback default if not found:\n\tif (!LoadLoginPage())\n\t{\n\t\tLOGWARN(\"Could not load WebAdmin login page \\\"%s\\\", using fallback template.\", \"webadmin/login_template.html\");\n\n\t\t// Set the fallback:\n\t\tm_LoginPage = \\\n\t\t\"<h1>Cuberite WebAdmin</h1>\" \\\n\t\t\"<center>\" \\\n\t\t\"<form method='get' action='webadmin/'>\" \\\n\t\t\"<input type='submit' value='Log in'>\" \\\n\t\t\"</form>\" \\\n\t\t\"</center>\";\n\t}\n}\n\n\n\n\n\nbool cWebAdmin::LoadIniFile(void)\n{\n\tm_IniFile.Clear();\n\tif (!m_IniFile.ReadFile(\"webadmin.ini\"))\n\t{\n\t\tLOGWARN(\"Regenerating webadmin.ini, all settings will be reset\");\n\t\tm_IniFile.AddHeaderComment(\" This file controls the webadmin feature of Cuberite\");\n\t\tm_IniFile.AddHeaderComment(\" It specifies whether webadmin is enabled, and what logins are allowed. \");\n\t\tm_IniFile.AddHeaderComment(\" Username format: [User:*username*]\");\n\t\tm_IniFile.AddHeaderComment(\" Password format: Password=*password*; for example:\");\n\t\tm_IniFile.AddHeaderComment(\" [User:admin]\");\n\t\tm_IniFile.AddHeaderComment(\" Password=admin\");\n\t\tm_IniFile.AddHeaderComment(\" Please restart Cuberite to apply changes made in this file!\");\n\t\tm_IniFile.SetValue(\"WebAdmin\", \"Ports\", DEFAULT_WEBADMIN_PORTS);\n\t\tm_IniFile.WriteFile(\"webadmin.ini\");\n\t}\n\n\treturn m_IniFile.GetValueSetB(\"WebAdmin\", \"Enabled\", true);\n}\n\n\n\n\n\nbool cWebAdmin::HasUsers()\n{\n\tfor (int i = 0; i < m_IniFile.GetNumKeys(); i++)\n\t{\n\t\tAString key = m_IniFile.GetKeyName(i);\n\t\tif (key.rfind(\"User:\", 0) == 0)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cWebAdmin::HandleWebadminRequest(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request)\n{\n\tif (!a_Request.HasAuth())\n\t{\n\t\ta_Connection.SendNeedAuth(\"Cuberite WebAdmin\");\n\t\treturn;\n\t}\n\n\t// Check auth:\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tAString UserPassword = m_IniFile.GetValue(\"User:\" + a_Request.GetAuthUsername(), \"Password\", \"\");\n\t\tif ((UserPassword == \"\") || (a_Request.GetAuthPassword() != UserPassword))\n\t\t{\n\t\t\ta_Connection.SendNeedAuth(\"Cuberite WebAdmin - bad username or password\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Check if the contents should be wrapped in the template:\n\tauto BareURL = a_Request.GetURLPath();\n\tASSERT(BareURL.length() > 0);\n\tbool ShouldWrapInTemplate = (!BareURL.empty() && (BareURL[1] != '~'));\n\n\t// Retrieve the request data:\n\tauto Data = std::static_pointer_cast<cWebadminRequestData>(a_Request.GetUserData());\n\tif (Data == nullptr)\n\t{\n\t\ta_Connection.SendStatusAndReason(500, \"Bad UserData\");\n\t\treturn;\n\t}\n\n\t// Wrap it all up for the Lua call:\n\tAString Template;\n\tHTTPTemplateRequest TemplateRequest;\n\tTemplateRequest.Request.URL = a_Request.GetURL();\n\tTemplateRequest.Request.Username = a_Request.GetAuthUsername();\n\tTemplateRequest.Request.Method = a_Request.GetMethod();\n\tTemplateRequest.Request.Path = BareURL.substr(1);\n\n\tif (Data->m_Form.Finish())\n\t{\n\t\tfor (cHTTPFormParser::const_iterator itr = Data->m_Form.begin(), end = Data->m_Form.end(); itr != end; ++itr)\n\t\t{\n\t\t\tHTTPFormData HTTPfd;\n\t\t\tHTTPfd.Value = itr->second;\n\t\t\tHTTPfd.Type = \"\";\n\t\t\tHTTPfd.Name = itr->first;\n\t\t\tTemplateRequest.Request.FormData[itr->first] = HTTPfd;\n\t\t\tTemplateRequest.Request.PostParams[itr->first] = itr->second;\n\t\t}  // for itr - Data->m_Form[]\n\n\t\t// Parse the URL into individual params:\n\t\tconst AString & URL = a_Request.GetURL();\n\t\tsize_t idxQM = URL.find('?');\n\t\tif (idxQM != AString::npos)\n\t\t{\n\t\t\tcHTTPFormParser URLParams(cHTTPFormParser::fpkURL, URL.c_str() + idxQM + 1, URL.length() - idxQM - 1, *Data);\n\t\t\tURLParams.Finish();\n\t\t\tfor (cHTTPFormParser::const_iterator itr = URLParams.begin(), end = URLParams.end(); itr != end; ++itr)\n\t\t\t{\n\t\t\t\tTemplateRequest.Request.Params[itr->first] = itr->second;\n\t\t\t}  // for itr - URLParams[]\n\t\t}\n\t}\n\n\t// Try to get the template from the Lua template script\n\tif (ShouldWrapInTemplate)\n\t{\n\t\tcCSLock LockSelf(m_CS);\n\t\tcLuaState::cLock LockTemplate(m_TemplateScript);\n\t\tif (m_TemplateScript.Call(\"ShowPage\", this, &TemplateRequest, cLuaState::Return, Template))\n\t\t{\n\t\t\tcHTTPOutgoingResponse Resp;\n\t\t\tResp.SetContentType(\"text/html\");\n\t\t\ta_Connection.Send(Resp);\n\t\t\ta_Connection.Send(Template.c_str(), Template.length());\n\t\t\ta_Connection.FinishResponse();\n\t\t\treturn;\n\t\t}\n\t\ta_Connection.SendStatusAndReason(500, \"m_TemplateScript failed\");\n\t\treturn;\n\t}\n\n\t// Send the un-decorated page content:\n\tauto page = GetPage(TemplateRequest.Request);\n\tcHTTPOutgoingResponse resp;\n\tresp.SetContentType(page.ContentType);\n\ta_Connection.Send(resp);\n\ta_Connection.Send(page.Content.c_str(), page.Content.length());\n\ta_Connection.FinishResponse();\n}\n\n\n\n\n\nvoid cWebAdmin::HandleRootRequest(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request)\n{\n\tUNUSED(a_Request);\n\n\tcHTTPOutgoingResponse Resp;\n\tResp.SetContentType(\"text/html\");\n\ta_Connection.Send(Resp);\n\ta_Connection.Send(m_LoginPage);\n\ta_Connection.FinishResponse();\n}\n\n\n\n\n\nvoid cWebAdmin::HandleFileRequest(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request)\n{\n\tAString FileURL = a_Request.GetURL();\n\tstd::replace(FileURL.begin(), FileURL.end(), '\\\\', '/');\n\n\t// Remove all leading backslashes:\n\tif (!FileURL.empty() && (FileURL[0] == '/'))\n\t{\n\t\tsize_t FirstCharToRead = FileURL.find_first_not_of('/');\n\t\tif (FirstCharToRead != AString::npos)\n\t\t{\n\t\t\tFileURL = FileURL.substr(FirstCharToRead);\n\t\t}\n\t}\n\n\t// Read the file contents and guess its mime-type, based on the extension:\n\tAString Content = \"<h2>404 Not Found</h2>\";\n\tAString ContentType = \"text/html\";\n\tAString Path = \"webadmin/files/\" + FileURL;\n\n\t// Return 404 if the file is not found, or the URL contains '../' (for security reasons)\n\tif ((FileURL.find(\"../\") == AString::npos) && cFile::IsFile(Path))\n\t{\n\t\tcFile File(Path, cFile::fmRead);\n\t\tAString FileContent;\n\t\tif (File.IsOpen() && (File.ReadRestOfFile(FileContent) != -1))\n\t\t{\n\t\t\tstd::swap(Content, FileContent);\n\t\t\tsize_t LastPointPosition = Path.find_last_of('.');\n\t\t\tif (LastPointPosition != AString::npos)\n\t\t\t{\n\t\t\t\tContentType = GetContentTypeFromFileExt(Path.substr(LastPointPosition + 1));\n\t\t\t}\n\t\t}\n\t\tif (ContentType.empty())\n\t\t{\n\t\t\tContentType = \"application/unknown\";\n\t\t}\n\t}\n\n\t// Send the response:\n\tcHTTPOutgoingResponse Resp;\n\tResp.SetContentType(ContentType);\n\ta_Connection.Send(Resp);\n\ta_Connection.Send(Content);\n\ta_Connection.FinishResponse();\n}\n\n\n\n\n\nAString cWebAdmin::GetContentTypeFromFileExt(const AString & a_FileExtension)\n{\n\tstatic bool IsInitialized = false;\n\tstatic AStringMap ContentTypeMap;\n\tif (!IsInitialized)\n\t{\n\t\t// Initialize the ContentTypeMap:\n\t\tContentTypeMap[\"png\"]   = \"image/png\";\n\t\tContentTypeMap[\"fif\"]   = \"image/fif\";\n\t\tContentTypeMap[\"gif\"]   = \"image/gif\";\n\t\tContentTypeMap[\"jpeg\"]  = \"image/jpeg\";\n\t\tContentTypeMap[\"jpg\"]   = \"image/jpeg\";\n\t\tContentTypeMap[\"jpe\"]   = \"image/jpeg\";\n\t\tContentTypeMap[\"tiff\"]  = \"image/tiff\";\n\t\tContentTypeMap[\"ico\"]   = \"image/ico\";\n\t\tContentTypeMap[\"csv\"]   = \"text/csv\";\n\t\tContentTypeMap[\"css\"]   = \"text/css\";\n\t\tContentTypeMap[\"js\"]    = \"text/javascript\";\n\t\tContentTypeMap[\"txt\"]   = \"text/plain\";\n\t\tContentTypeMap[\"rtx\"]   = \"text/richtext\";\n\t\tContentTypeMap[\"rtf\"]   = \"text/richtext\";\n\t\tContentTypeMap[\"xml\"]   = \"text/xml\";\n\t\tContentTypeMap[\"html\"]  = \"text/html\";\n\t\tContentTypeMap[\"htm\"]   = \"text/html\";\n\t\tContentTypeMap[\"xhtml\"] = \"application/xhtml+xml\";  // Not recomended for IE6, but no-one uses that anymore\n\t}\n\n\tauto itr = ContentTypeMap.find(StrToLower(a_FileExtension));\n\tif (itr == ContentTypeMap.end())\n\t{\n\t\treturn AString();\n\t}\n\treturn itr->second;\n}\n\n\n\n\n\nsWebAdminPage cWebAdmin::GetPage(const HTTPRequest & a_Request)\n{\n\tsWebAdminPage page;\n\tauto split = StringSplit(a_Request.Path, \"/\");\n\n\t// If no specific page was requested, return an empty object:\n\tif (split.size() <= 2)\n\t{\n\t\treturn page;\n\t}\n\n\t// Find the WebTab handler responsible for the request:\n\tcWebTabPtr tab;\n\t{\n\t\tcCSLock Lock(m_CS);\n\t\tfor (auto & wt: m_WebTabs)\n\t\t{\n\t\t\tif (\n\t\t\t\t(wt->m_PluginName == split[1]) &&\n\t\t\t\t(wt->m_UrlPath == split[2])\n\t\t\t)\n\t\t\t{\n\t\t\t\ttab = wt;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // for wt - m_WebTabs[]\n\t}\n\n\t// If a WebTab handler was found, call it:\n\tif (tab != nullptr)\n\t{\n\t\tpage.ContentType = \"text/html\";  // Default to HTML content type, unless overridden by a plugin\n\t\tif (!tab->m_Callback->Call(a_Request, split[1], page.Content, page.ContentType))\n\t\t{\n\t\t\tpage.Content = GetHTMLEscapedString(fmt::format(\n\t\t\t\tFMT_STRING(\"WebTab callback for plugin {}, page {} has failed.\"),\n\t\t\t\ttab->m_PluginName, tab->m_Title\n\t\t\t));\n\t\t}\n\t\tpage.PluginName = tab->m_PluginName;\n\t\tpage.TabTitle = tab->m_Title;\n\t\tpage.TabUrlPath = split[1];\n\t}\n\n\treturn page;\n}\n\n\n\n\n\nAString cWebAdmin::GetBaseURL(const AString & a_URL)\n{\n\treturn GetBaseURL(StringSplit(a_URL, \"/\"));\n}\n\n\n\n\n\nvoid cWebAdmin::AddWebTab(\n\tconst AString & a_Title,\n\tconst AString & a_UrlPath,\n\tconst AString & a_PluginName,\n\tstd::shared_ptr<cWebAdmin::cWebTabCallback> a_Callback\n)\n{\n\tcCSLock lock(m_CS);\n\tm_WebTabs.emplace_back(std::make_shared<cWebTab>(a_Title, a_UrlPath, a_PluginName, std::move(a_Callback)));\n}\n\n\n\n\n\nbool cWebAdmin::DelWebTab(const AString & a_UrlPath)\n{\n\tcCSLock lock(m_CS);\n\tfor (auto itr = m_WebTabs.begin(), end = m_WebTabs.end(); itr != end; ++itr)\n\t{\n\t\tif ((*itr)->m_UrlPath == a_UrlPath)\n\t\t{\n\t\t\tm_WebTabs.erase(itr);\n\t\t\treturn true;\n\t\t}\n\t}  // for itr - m_WebTabs[]\n\n\t// Not found:\n\treturn false;\n}\n\n\n\n\n\nAString cWebAdmin::GetHTMLEscapedString(const AString & a_Input)\n{\n\tAString dst;\n\tdst.reserve(a_Input.length());\n\n\t// Loop over input and substitute HTML characters for their alternatives:\n\tsize_t len = a_Input.length();\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tswitch (a_Input[i])\n\t\t{\n\t\t\tcase '&':  dst.append(\"&amp;\");  break;\n\t\t\tcase '\\'': dst.append(\"&apos;\"); break;\n\t\t\tcase '\"':  dst.append(\"&quot;\"); break;\n\t\t\tcase '<':  dst.append(\"&lt;\");   break;\n\t\t\tcase '>':  dst.append(\"&gt;\");   break;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tdst.push_back(a_Input[i]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (a_Input[i])\n\t}  // for i - a_Input[]\n\n\treturn dst;\n}\n\n\n\n\n\nAString cWebAdmin::GetURLEncodedString(const AString & a_Input)\n{\n\treturn URLEncode(a_Input);\n}\n\n\n\n\n\nAString cWebAdmin::GetBaseURL(const AStringVector & a_URLSplit)\n{\n\tAString BaseURL = \"./\";\n\tif (a_URLSplit.size() > 1)\n\t{\n\t\tfor (unsigned int i = 0; i < a_URLSplit.size(); i++)\n\t\t{\n\t\t\tBaseURL += \"../\";\n\t\t}\n\t\tBaseURL += \"webadmin/\";\n\t}\n\treturn BaseURL;\n}\n\n\n\n\n\nvoid cWebAdmin::OnRequestBegun(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request)\n{\n\tUNUSED(a_Connection);\n\tconst AString & URL = a_Request.GetURL();\n\tif (\n\t\t(strncmp(URL.c_str(), \"/webadmin\", 9) == 0) ||\n\t\t(strncmp(URL.c_str(), \"/~webadmin\", 10) == 0)\n\t)\n\t{\n\t\ta_Request.SetUserData(std::make_shared<cWebadminRequestData>(a_Request));\n\t\treturn;\n\t}\n\tif (URL == \"/\")\n\t{\n\t\t// The root needs no body handler and is fully handled in the OnRequestFinished() call\n\t\treturn;\n\t}\n\t// TODO: Handle other requests\n}\n\n\n\n\n\nvoid cWebAdmin::OnRequestBody(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request, const char * a_Data, size_t a_Size)\n{\n\tUNUSED(a_Connection);\n\tauto Data = std::static_pointer_cast<cWebadminRequestData>(a_Request.GetUserData());\n\tif (Data == nullptr)\n\t{\n\t\treturn;\n\t}\n\tData->m_Form.Parse(a_Data, a_Size);\n}\n\n\n\n\n\nvoid cWebAdmin::OnRequestFinished(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request)\n{\n\tconst AString & URL = a_Request.GetURL();\n\tif (\n\t\t(strncmp(URL.c_str(), \"/webadmin\", 9) == 0) ||\n\t\t(strncmp(URL.c_str(), \"/~webadmin\", 10) == 0)\n\t)\n\t{\n\t\tHandleWebadminRequest(a_Connection, a_Request);\n\t}\n\telse if (URL == \"/\")\n\t{\n\t\t// The root needs no body handler and is fully handled in the OnRequestFinished() call\n\t\tHandleRootRequest(a_Connection, a_Request);\n\t}\n\telse\n\t{\n\t\tHandleFileRequest(a_Connection, a_Request);\n\t}\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/WebAdmin.h",
    "content": "\n// WebAdmin.h\n\n// Declares the cWebAdmin class representing the admin interface over http protocol, and related services (API)\n\n#pragma once\n\n#include \"Bindings/LuaState.h\"\n#include \"IniFile.h\"\n#include \"HTTP/HTTPServer.h\"\n#include \"HTTP/HTTPMessage.h\"\n\n\n\n\n\n// Disable MSVC warnings:\n#if defined(_MSC_VER)\n\t#pragma warning(push)\n\t#pragma warning(disable:4355)  // 'this' : used in base member initializer list\n#endif\n\n\n\n\n\n// tolua_begin\nstruct HTTPFormData\n{\n\tstd::string Name;\n\tstd::string Value;\n\tstd::string Type;\n} ;\n// tolua_end\n\n\n\n\n// tolua_begin\nstruct HTTPRequest\n{\n\ttypedef std::map< std::string, std::string > StringStringMap;\n\ttypedef std::map< std::string, HTTPFormData > FormDataMap;\n\n\t/** The entire URL presented to the HTTP server. */\n\tAString URL;\n\n\t/** HTTP method used for the request (\"GET\", \"POST\" etc.) */\n\tAString Method;\n\n\t/** The Path part of the request's URL (excluding GET params). */\n\tAString Path;\n\n\t/** Name of the logged-in user. Empty if not logged in. */\n\tAString Username;\n\n\t// tolua_end\n\n\t/** Parameters given in the URL, after the questionmark */\n\tStringStringMap Params;     // >> EXPORTED IN MANUALBINDINGS <<\n\n\t/** Parameters posted as a part of a form - either in the URL (GET method) or in the body (POST method) */\n\tStringStringMap PostParams;  // >> EXPORTED IN MANUALBINDINGS <<\n\n\t/** Same as PostParams */\n\tFormDataMap FormData;       // >> EXPORTED IN MANUALBINDINGS <<\n} ;  // tolua_export\n\n\n\n\n\n// tolua_begin\nstruct HTTPTemplateRequest\n{\n\tHTTPRequest Request;\n} ;\n// tolua_end\n\n\n\n\n\nstruct sWebAdminPage\n{\n\tAString Content;\n\tAString PluginName;\n\tAString TabTitle;\n\tAString TabUrlPath;\n\tAString ContentType;\n};\n\n\n\n\n\n// tolua_begin\nclass cWebAdmin :\n\t// tolua_end\n\tpublic cHTTPServer::cCallbacks\n\t// tolua_begin\n{\npublic:\n\t// tolua_end\n\n\t/** Interface for getting the content of a single WebTab. */\n\tclass cWebTabCallback abstract\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants\n\t\tvirtual ~cWebTabCallback() {}\n\n\t\t/** Returns the contents for the specified request.\n\t\tReturns true if the call was successful, false on an error.\n\t\ta_Request is the full HTTP request object, as received from the client.\n\t\ta_UrlPath is the UrlPath of the WebTab registered for this request, as parsed from a_Request.\n\t\tDescendants should fill a_Content with the page contents\n\t\tand optionally set a_ContentType [defaults to \"text/html\"] */\n\t\tvirtual bool Call(\n\t\t\tconst HTTPRequest & a_Request,\n\t\t\tconst AString & a_UrlPath,\n\t\t\tAString & a_Content,\n\t\t\tAString & a_ContentType\n\t\t) = 0;\n\t};\n\n\n\t/** Container for a single web tab.\n\tEach web tab has a title, URL path and an associated plugin's name.\n\tEach web tab is registered with a callback to provide the content. */\n\tclass cWebTab\n\t{\n\tpublic:\n\t\tAString m_Title;\n\t\tAString m_UrlPath;\n\t\tAString m_PluginName;\n\t\tstd::shared_ptr<cWebTabCallback> m_Callback;\n\n\t\tcWebTab(const AString & a_Title, const AString & a_UrlPath, const AString & a_PluginName, std::shared_ptr<cWebTabCallback> a_Callback):\n\t\t\tm_Title(a_Title),\n\t\t\tm_UrlPath(a_UrlPath),\n\t\t\tm_PluginName(a_PluginName),\n\t\t\tm_Callback(std::move(a_Callback))\n\t\t{\n\t\t}\n\t};\n\ttypedef std::shared_ptr<cWebTab> cWebTabPtr;\n\ttypedef std::vector<cWebTabPtr> cWebTabPtrs;\n\n\n\tcWebAdmin(void);\n\tvirtual ~cWebAdmin() override;\n\n\t/** Initializes the object. Returns true if successfully initialized and ready to start */\n\tbool Init(void);\n\n\t/** Starts the HTTP server taking care of the webadmin. Returns true if successful */\n\tbool Start(void);\n\n\t/** Stops the HTTP server, if it was started. */\n\tvoid Stop(void);\n\n\t/** Loads the login template into m_LoginPage.\n\tReturns true if the loading succeeds, false if not. */\n\tbool LoadLoginPage(void);\n\n\t/** Returns a copy of all the registered web tabs.\n\tExported to Lua in ManualBindings.cpp. */\n\tcWebTabPtrs GetAllWebTabs(void) { return m_WebTabs; }\n\n\t/** Removes all WebTabs registered by the specified plugin. */\n\tvoid RemoveAllPluginWebTabs(const AString & a_PluginName);\n\n\t/** Returns the (inner) page contents for the specified request.\n\tCalls the appropriate WebTab handler to get the contents.\n\tExported to Lua in ManualBindings.cpp. */\n\tsWebAdminPage GetPage(const HTTPRequest & a_Request);\n\n\t// tolua_begin\n\n\t/** Reloads m_IniFile, m_LoginPage and m_TemplateScript.\n\tNote that reloading will not change the \"enabled\" state of the server, and it will not update listening ports. */\n\tvoid Reload(void);\n\n\t/** Returns the list of ports on which the webadmin is configured to listen. */\n\tAString GetPorts(void) const { return StringsConcat(m_Ports, ','); }\n\n\t/** Returns the prefix needed for making a link point to the webadmin root from the given URL (\"../../../webadmin\"-style). */\n\tstatic AString GetBaseURL(const AString & a_URL);\n\n\t/** Returns the content type from the file extension.\n\tIf the extension isn't in the list, the function returns an empty string. */\n\tstatic AString GetContentTypeFromFileExt(const AString & a_FileExtension);\n\n\t/** Escapes text passed into it, so it can be embedded into html. */\n\tstatic AString GetHTMLEscapedString(const AString & a_Input);\n\t// tolua_end\n\n\t/** Adds a new WebTab handler.\n\ta_Title is the display title of the tab\n\ta_UrlPath is the part of the URL that uniquely identifies this tab.\n\ta_PluginName is the display name of the plugin creating this tab.\n\ta_Callback is used to provide the actual WebTab contents, when requested.\n\tExported in ManualBindings.cpp. */\n\tvoid AddWebTab(\n\t\tconst AString & a_Title,\n\t\tconst AString & a_UrlPath,\n\t\tconst AString & a_PluginName,\n\t\tstd::shared_ptr<cWebTabCallback> a_Callback\n\t);\n\n\t/** Removes the WebTab with the specified URL path.\n\tReturns true if WebTab was found and removed, false if not found.\n\tExported in ManualBindings.cpp */\n\tbool DelWebTab(const AString & a_UrlPath);\n\n\t/** Escapes the string for use in an URL\n\tExported to Lua in ManualBindings.cpp. */\n\tstatic AString GetURLEncodedString(const AString & a_Input);\n\n\t/** Returns the prefix needed for making a link point to the webadmin root from the given URL (\"../../../webadmin\"-style) */\n\tstatic AString GetBaseURL(const AStringVector & a_URLSplit);\n\nprotected:\n\n\t/** Protects m_WebTabs, m_TemplateScript, m_LoginTemplate and m_IniFile against multithreaded access. */\n\tcCriticalSection m_CS;\n\n\t/** All registered WebTab handlers.\n\tProtected against multithreaded access by m_CS. */\n\tcWebTabPtrs m_WebTabs;\n\n\t/** The Lua template script to provide templates.\n\tProtected against multithreaded access by m_CS. */\n\tcLuaState m_TemplateScript;\n\n\t/** The HTML page that provides the login.\n\tProtected against multithreaded access by m_CS. */\n\tAString m_LoginPage;\n\n\t/** The webadmin.ini file, used for the settings and allowed logins.\n\tProtected against multithreaded access by m_CS. */\n\tcIniFile m_IniFile;\n\n\t/** Set to true if Init() succeeds and the webadmin isn't to be disabled */\n\tbool m_IsInitialized;\n\n\t/** Set to true if Start() succeeds in starting the server, reset back to false in Stop(). */\n\tbool m_IsRunning;\n\n\t/** The ports on which the webadmin is running. */\n\tAStringVector m_Ports;\n\n\t/** The HTTP server which provides the underlying HTTP parsing, serialization and events */\n\tcHTTPServer m_HTTPServer;\n\n\n\t/** Loads webadmin.ini into m_IniFile.\n\tCreates a default file if it doesn't exist.\n\tReturns true if webadmin is enabled, false if disabled. */\n\tbool LoadIniFile(void);\n\n\t/** Checks inside the webadmin.ini file if there are users configured. */\n\tbool HasUsers();\n\n\t/** Handles requests coming to the \"/webadmin\" or \"/~webadmin\" URLs */\n\tvoid HandleWebadminRequest(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request);\n\n\t/** Handles requests for the root page */\n\tvoid HandleRootRequest(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request);\n\n\t/** Handles requests for a file */\n\tvoid HandleFileRequest(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request);\n\n\t// cHTTPServer::cCallbacks overrides:\n\tvirtual void OnRequestBegun   (cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request) override;\n\tvirtual void OnRequestBody    (cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request, const char * a_Data, size_t a_Size) override;\n\tvirtual void OnRequestFinished(cHTTPServerConnection & a_Connection, cHTTPIncomingRequest & a_Request) override;\n} ;  // tolua_export\n\n\n\n\n\n// Revert MSVC warnings back to orignal state:\n#if defined(_MSC_VER)\n\t#pragma warning(pop)\n#endif\n\n\n\n\n"
  },
  {
    "path": "src/World.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"World.h\"\n#include \"BlockInfo.h\"\n#include \"ClientHandle.h\"\n#include \"Physics/Explodinator.h\"\n#include \"Server.h\"\n#include \"Root.h\"\n#include \"IniFile.h\"\n#include \"Generating/ChunkDesc.h\"\n#include \"Generating/ComposableGenerator.h\"\n#include \"SetChunkData.h\"\n#include \"DeadlockDetect.h\"\n#include \"LineBlockTracer.h\"\n#include \"UUID.h\"\n#include \"BlockInServerPluginInterface.h\"\n\n// Serializers\n#include \"WorldStorage/ScoreboardSerializer.h\"\n\n// Entities (except mobs):\n#include \"Entities/EnderCrystal.h\"\n#include \"Entities/ExpOrb.h\"\n#include \"Entities/FallingBlock.h\"\n#include \"Entities/Minecart.h\"\n#include \"Entities/Pickup.h\"\n#include \"Entities/Player.h\"\n#include \"Entities/TNTEntity.h\"\n\n#include \"BlockEntities/CommandBlockEntity.h\"\n#include \"BlockEntities/SignEntity.h\"\n\n// Simulators:\n#include \"Simulator/FloodyFluidSimulator.h\"\n#include \"Simulator/FluidSimulator.h\"\n#include \"Simulator/FireSimulator.h\"\n#include \"Simulator/NoopFluidSimulator.h\"\n#include \"Simulator/NoopRedstoneSimulator.h\"\n#include \"Simulator/IncrementalRedstoneSimulator/IncrementalRedstoneSimulator.h\"\n#include \"Simulator/SandSimulator.h\"\n#include \"Simulator/VanillaFluidSimulator.h\"\n#include \"Simulator/VaporizeFluidSimulator.h\"\n\n// Mobs:\n#include \"Mobs/IncludeAllMonsters.h\"\n#include \"MobCensus.h\"\n#include \"MobSpawner.h\"\n\n#include \"Generating/Trees.h\"\n#include \"Bindings/PluginManager.h\"\n#include \"Blocks/BlockHandler.h\"\n\n#ifndef _WIN32\n\t#include <stdlib.h>\n#endif\n\n#include \"SpawnPrepare.h\"\n#include \"FastRandom.h\"\n#include \"OpaqueWorld.h\"\n\n\n\n\n\nnamespace World\n{\n\t// Implement conversion functions from OpaqueWorld.h\n\tcBroadcastInterface * GetBroadcastInterface(cWorld * a_World) { return a_World; }\n\tcForEachChunkProvider * GetFECProvider     (cWorld * a_World) { return a_World; }\n\tcWorldInterface * GetWorldInterface        (cWorld * a_World) { return a_World; }\n\n\tcChunkInterface GetChunkInterface(cWorld & a_World)\n\t{\n\t\treturn { a_World.GetChunkMap() };\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWorld::cLock:\n\ncWorld::cLock::cLock(const cWorld & a_World) :\n\tSuper(&(a_World.m_ChunkMap.GetCS()))\n{\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWorld::cTickThread:\n\ncWorld::cTickThread::cTickThread(cWorld & a_World):\n\tSuper(fmt::format(FMT_STRING(\"World Ticker ({})\"), a_World.GetName())),\n\tm_World(a_World)\n{\n}\n\n\n\n\n\nvoid cWorld::cTickThread::Execute()\n{\n\tauto LastTime = std::chrono::steady_clock::now();\n\tauto TickTime = std::chrono::duration_cast<std::chrono::milliseconds>(1_tick);\n\n\twhile (!m_ShouldTerminate)\n\t{\n\t\tauto NowTime = std::chrono::steady_clock::now();\n\t\tauto WaitTime = std::chrono::duration_cast<std::chrono::milliseconds>(NowTime - LastTime);\n\t\tm_World.Tick(WaitTime, TickTime);\n\t\tTickTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - NowTime);\n\n\t\tif (TickTime < 1_tick)\n\t\t{\n\t\t\t// Stretch tick time until it's at least 1 tick:\n\t\t\tstd::this_thread::sleep_for(1_tick - TickTime);\n\t\t}\n\n\t\tLastTime = NowTime;\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWorld:\n\ncWorld::cWorld(\n\tconst AString & a_WorldName, const AString & a_DataPath,\n\tcDeadlockDetect & a_DeadlockDetect, const AStringVector & a_WorldNames,\n\teDimension a_Dimension, const AString & a_LinkedOverworldName\n):\n\tm_WorldName(a_WorldName),\n\tm_DataPath(a_DataPath),\n\tm_LinkedOverworldName(a_LinkedOverworldName),\n\tm_IniFileName(m_DataPath + \"/world.ini\"),\n\tm_StorageSchema(\"Default\"),\n#ifdef __arm__\n\tm_StorageCompressionFactor(0),\n#else\n\tm_StorageCompressionFactor(6),\n#endif\n\tm_IsSavingEnabled(true),\n\tm_Dimension(a_Dimension),\n\tm_IsSpawnExplicitlySet(false),\n\tm_SpawnX(0),\n\tm_SpawnY(cChunkDef::Height),\n\tm_SpawnZ(0),\n\tm_BroadcastDeathMessages(true),\n\tm_BroadcastAchievementMessages(true),\n\tm_IsDaylightCycleEnabled(true),\n\tm_WorldAge(0),\n\tm_WorldDate(0),\n\tm_WorldTickAge(0),\n\tm_LastChunkCheck(0),\n\tm_LastSave(0),\n\tm_SkyDarkness(0),\n\tm_GameMode(gmSurvival),\n\tm_bEnabledPVP(false),\n\tm_bFarmlandTramplingEnabled(false),\n\tm_IsDeepSnowEnabled(false),\n\tm_ShouldLavaSpawnFire(true),\n\tm_VillagersShouldHarvestCrops(true),\n\tm_SimulatorManager(),\n\tm_SandSimulator(),\n\tm_WaterSimulator(nullptr),\n\tm_LavaSimulator(nullptr),\n\tm_FireSimulator(),\n\tm_RedstoneSimulator(nullptr),\n\tm_MaxPlayers(10),\n\tm_ChunkMap(this),\n\tm_bAnimals(true),\n\tm_Weather(eWeather_Sunny),\n\tm_WeatherInterval(24000),  // Guaranteed 1 game-day of sunshine at server start :)\n\tm_MaxSunnyTicks(180000),        // 150 real-world minutes -+\n\tm_MinSunnyTicks(12000),         // 10 real-world minutes   |\n\tm_MaxRainTicks(24000),          // 20 real-world minutes   +- all values adapted from Vanilla 1.7.2\n\tm_MinRainTicks(12000),          // 10 real-world minutes   |\n\tm_MaxThunderStormTicks(15600),  // 13 real-world minutes   |\n\tm_MinThunderStormTicks(3600),   // 3 real-world minutes   -+\n\tm_MaxCactusHeight(3),\n\tm_MaxSugarcaneHeight(4),\n\t/* TODO: Enable when functionality exists again\n\tm_IsBeetrootsBonemealable(true),\n\tm_IsCactusBonemealable(false),\n\tm_IsCarrotsBonemealable(true),\n\tm_IsCropsBonemealable(true),\n\tm_IsGrassBonemealable(true),\n\tm_IsMelonStemBonemealable(true),\n\tm_IsMelonBonemealable(true),\n\tm_IsPotatoesBonemealable(true),\n\tm_IsPumpkinStemBonemealable(true),\n\tm_IsPumpkinBonemealable(true),\n\tm_IsSaplingBonemealable(true),\n\tm_IsSugarcaneBonemealable(false),\n\tm_IsBigFlowerBonemealable(true),\n\tm_IsTallGrassBonemealable(true),\n\t*/\n\tm_bCommandBlocksEnabled(true),\n\tm_bUseChatPrefixes(false),\n\tm_TNTShrapnelLevel(slNone),\n\tm_MaxViewDistance(12),\n\tm_Scoreboard(this),\n\tm_MapManager(this),\n\tm_GeneratorCallbacks(*this),\n\tm_ChunkSender(*this),\n\tm_Lighting(*this),\n\tm_TickThread(*this)\n{\n\tLOGD(\"cWorld::cWorld(\\\"%s\\\")\", a_WorldName);\n\n\tcFile::CreateFolderRecursive(m_DataPath);\n\n\tm_ChunkMap.TrackInDeadlockDetect(a_DeadlockDetect, m_WorldName);\n\n\t// Load the scoreboard\n\tcScoreboardSerializer Serializer(m_DataPath, &m_Scoreboard);\n\tSerializer.Load();\n\n\t// Track the CSs used by this world in the deadlock detector:\n\ta_DeadlockDetect.TrackCriticalSection(m_CSTasks, fmt::format(FMT_STRING(\"World {} tasks\"), m_WorldName));\n\n\t// Load world settings from the ini file\n\tcIniFile IniFile;\n\tif (!IniFile.ReadFile(m_IniFileName))\n\t{\n\t\tLOGWARNING(\"Cannot read world settings from \\\"%s\\\", defaults will be used.\", m_IniFileName);\n\n\t\t// TODO: More descriptions for each key\n\t\tIniFile.AddHeaderComment(\" This is the per-world configuration file, managing settings such as generators, simulators, and spawn points\");\n\t\tIniFile.AddKeyComment(\" LinkedWorlds\", \"This section governs portal world linkage; leave a value blank to disabled that associated method of teleportation\");\n\t}\n\n\t// The presence of a configuration value overrides everything\n\t// If no configuration value is found, GetDimension() is written to file and the variable is written to again to ensure that cosmic rays haven't sneakily changed its value\n\tm_Dimension = StringToDimension(IniFile.GetValueSet(\"General\", \"Dimension\", DimensionToString(GetDimension())));\n\tint UnusedDirtyChunksCap = IniFile.GetValueSetI(\"General\", \"UnusedChunkCap\", 1000);\n\tif (UnusedDirtyChunksCap < 0)\n\t{\n\t\tUnusedDirtyChunksCap *= -1;\n\t\tIniFile.SetValueI(\"General\", \"UnusedChunkCap\", UnusedDirtyChunksCap);\n\t}\n\tm_UnusedDirtyChunksCap = static_cast<size_t>(UnusedDirtyChunksCap);\n\n\tm_BroadcastDeathMessages = IniFile.GetValueSetB(\"Broadcasting\", \"BroadcastDeathMessages\", true);\n\tm_BroadcastAchievementMessages = IniFile.GetValueSetB(\"Broadcasting\", \"BroadcastAchievementMessages\", true);\n\n\tSetMaxViewDistance(IniFile.GetValueSetI(\"SpawnPosition\", \"MaxViewDistance\", cClientHandle::DEFAULT_VIEW_DISTANCE));\n\n\t// Try to find the \"SpawnPosition\" key and coord values in the world configuration, set the flag if found\n\tint KeyNum = IniFile.FindKey(\"SpawnPosition\");\n\tm_IsSpawnExplicitlySet =\n\t(\n\t\t(KeyNum >= 0) &&\n\t\t(\n\t\t\t(IniFile.FindValue(KeyNum, \"X\") >= 0) &&\n\t\t\t(IniFile.FindValue(KeyNum, \"Y\") >= 0) &&\n\t\t\t(IniFile.FindValue(KeyNum, \"Z\") >= 0)\n\t\t)\n\t);\n\n\tif (m_IsSpawnExplicitlySet)\n\t{\n\t\tLOGD(\"Spawnpoint explicitly set!\");\n\t\tm_SpawnX = IniFile.GetValueI(\"SpawnPosition\", \"X\", m_SpawnX);\n\t\tm_SpawnY = IniFile.GetValueI(\"SpawnPosition\", \"Y\", m_SpawnY);\n\t\tm_SpawnZ = IniFile.GetValueI(\"SpawnPosition\", \"Z\", m_SpawnZ);\n\t}\n\n\tm_StorageSchema               = IniFile.GetValueSet (\"Storage\",       \"Schema\",                      m_StorageSchema);\n\tm_StorageCompressionFactor    = IniFile.GetValueSetI(\"Storage\",       \"CompressionFactor\",           m_StorageCompressionFactor);\n\tm_MaxCactusHeight             = IniFile.GetValueSetI(\"Plants\",        \"MaxCactusHeight\",             3);\n\tm_MaxSugarcaneHeight          = IniFile.GetValueSetI(\"Plants\",        \"MaxSugarcaneHeight\",          3);\n\t/* TODO: Enable when functionality exists again\n\tm_IsBeetrootsBonemealable     = IniFile.GetValueSetB(\"Plants\",        \"IsBeetrootsBonemealable\",     true);\n\tm_IsCactusBonemealable        = IniFile.GetValueSetB(\"Plants\",        \"IsCactusBonemealable\",        false);\n\tm_IsCarrotsBonemealable       = IniFile.GetValueSetB(\"Plants\",        \"IsCarrotsBonemealable\",       true);\n\tm_IsCropsBonemealable         = IniFile.GetValueSetB(\"Plants\",        \"IsCropsBonemealable\",         true);\n\tm_IsGrassBonemealable         = IniFile.GetValueSetB(\"Plants\",        \"IsGrassBonemealable\",         true);\n\tm_IsMelonStemBonemealable     = IniFile.GetValueSetB(\"Plants\",        \"IsMelonStemBonemealable\",     true);\n\tm_IsMelonBonemealable         = IniFile.GetValueSetB(\"Plants\",        \"IsMelonBonemealable\",         false);\n\tm_IsPotatoesBonemealable      = IniFile.GetValueSetB(\"Plants\",        \"IsPotatoesBonemealable\",      true);\n\tm_IsPumpkinStemBonemealable   = IniFile.GetValueSetB(\"Plants\",        \"IsPumpkinStemBonemealable\",   true);\n\tm_IsPumpkinBonemealable       = IniFile.GetValueSetB(\"Plants\",        \"IsPumpkinBonemealable\",       false);\n\tm_IsSaplingBonemealable       = IniFile.GetValueSetB(\"Plants\",        \"IsSaplingBonemealable\",       true);\n\tm_IsSugarcaneBonemealable     = IniFile.GetValueSetB(\"Plants\",        \"IsSugarcaneBonemealable\",     false);\n\tm_IsBigFlowerBonemealable     = IniFile.GetValueSetB(\"Plants\",        \"IsBigFlowerBonemealable\",     true);\n\tm_IsTallGrassBonemealable     = IniFile.GetValueSetB(\"Plants\",        \"IsTallGrassBonemealable\",     true);\n\t*/\n\tm_IsDeepSnowEnabled           = IniFile.GetValueSetB(\"Physics\",       \"DeepSnow\",                    true);\n\tm_ShouldLavaSpawnFire         = IniFile.GetValueSetB(\"Physics\",       \"ShouldLavaSpawnFire\",         true);\n\tint TNTShrapnelLevel          = IniFile.GetValueSetI(\"Physics\",       \"TNTShrapnelLevel\",            static_cast<int>(slAll));\n\tm_bCommandBlocksEnabled       = IniFile.GetValueSetB(\"Mechanics\",     \"CommandBlocksEnabled\",        false);\n\tm_bEnabledPVP                 = IniFile.GetValueSetB(\"Mechanics\",     \"PVPEnabled\",                  true);\n\tm_bFarmlandTramplingEnabled   = IniFile.GetValueSetB(\"Mechanics\",     \"FarmlandTramplingEnabled\",    true);\n\tm_bUseChatPrefixes            = IniFile.GetValueSetB(\"Mechanics\",     \"UseChatPrefixes\",             true);\n\tm_MinNetherPortalWidth        = IniFile.GetValueSetI(\"Mechanics\",     \"MinNetherPortalWidth\",        2);\n\tm_MaxNetherPortalWidth        = IniFile.GetValueSetI(\"Mechanics\",     \"MaxNetherPortalWidth\",        21);\n\tm_MinNetherPortalHeight       = IniFile.GetValueSetI(\"Mechanics\",     \"MinNetherPortalHeight\",       3);\n\tm_MaxNetherPortalHeight       = IniFile.GetValueSetI(\"Mechanics\",     \"MaxNetherPortalHeight\",       21);\n\tm_VillagersShouldHarvestCrops = IniFile.GetValueSetB(\"Monsters\",      \"VillagersShouldHarvestCrops\", true);\n\tm_IsDaylightCycleEnabled      = IniFile.GetValueSetB(\"General\",       \"IsDaylightCycleEnabled\",      true);\n\tint GameMode                  = IniFile.GetValueSetI(\"General\",       \"Gamemode\",                    static_cast<int>(m_GameMode));\n\tint Weather                   = IniFile.GetValueSetI(\"General\",       \"Weather\",                     static_cast<int>(m_Weather));\n\n\tm_WorldAge = std::chrono::milliseconds(IniFile.GetValueSetI(\"General\", \"WorldAgeMS\", 0LL));\n\n\t// Load the weather frequency data:\n\tif (m_Dimension == dimOverworld)\n\t{\n\t\tm_MaxSunnyTicks        = IniFile.GetValueSetI(\"Weather\", \"MaxSunnyTicks\",        m_MaxSunnyTicks);\n\t\tm_MinSunnyTicks        = IniFile.GetValueSetI(\"Weather\", \"MinSunnyTicks\",        m_MinSunnyTicks);\n\t\tm_MaxRainTicks         = IniFile.GetValueSetI(\"Weather\", \"MaxRainTicks\",         m_MaxRainTicks);\n\t\tm_MinRainTicks         = IniFile.GetValueSetI(\"Weather\", \"MinRainTicks\",         m_MinRainTicks);\n\t\tm_MaxThunderStormTicks = IniFile.GetValueSetI(\"Weather\", \"MaxThunderStormTicks\", m_MaxThunderStormTicks);\n\t\tm_MinThunderStormTicks = IniFile.GetValueSetI(\"Weather\", \"MinThunderStormTicks\", m_MinThunderStormTicks);\n\t\tif (m_MaxSunnyTicks < m_MinSunnyTicks)\n\t\t{\n\t\t\tstd::swap(m_MaxSunnyTicks, m_MinSunnyTicks);\n\t\t}\n\t\tif (m_MaxRainTicks < m_MinRainTicks)\n\t\t{\n\t\t\tstd::swap(m_MaxRainTicks, m_MinRainTicks);\n\t\t}\n\t\tif (m_MaxThunderStormTicks < m_MinThunderStormTicks)\n\t\t{\n\t\t\tstd::swap(m_MaxThunderStormTicks, m_MinThunderStormTicks);\n\t\t}\n\t}\n\n\tauto WorldExists = [&](const AString & a_CheckWorldName)\n\t{\n\t\treturn (std::find(a_WorldNames.begin(), a_WorldNames.end(), a_CheckWorldName) != a_WorldNames.end());\n\t};\n\n\tif (a_Dimension == dimOverworld)\n\t{\n\t\tAString MyNetherName = GetName() + \"_nether\";\n\t\tAString MyEndName = GetName() + \"_the_end\";\n\t\tif (!WorldExists(MyNetherName))\n\t\t{\n\t\t\tMyNetherName.clear();\n\t\t}\n\t\tif (!WorldExists(MyEndName))\n\t\t{\n\t\t\tMyEndName = GetName() + \"_end\";\n\t\t\tif (!WorldExists(MyEndName))\n\t\t\t{\n\t\t\t\tMyEndName.clear();\n\t\t\t}\n\t\t}\n\n\t\tm_LinkedNetherWorldName = IniFile.GetValueSet(\"LinkedWorlds\", \"NetherWorldName\", MyNetherName);\n\t\tm_LinkedEndWorldName    = IniFile.GetValueSet(\"LinkedWorlds\", \"EndWorldName\",    MyEndName);\n\t}\n\telse\n\t{\n\t\tm_LinkedOverworldName = IniFile.GetValueSet(\"LinkedWorlds\", \"OverworldName\", GetLinkedOverworldName());\n\t}\n\n\t// If we are linked to one or more worlds that do not exist, unlink them\n\tif (a_Dimension == dimOverworld)\n\t{\n\t\tif (!m_LinkedNetherWorldName.empty() && !WorldExists(m_LinkedNetherWorldName))\n\t\t{\n\t\t\tIniFile.SetValue(\"LinkedWorlds\", \"NetherWorldName\", \"\");\n\t\t\tLOG(\"%s Is linked to a nonexisting nether world called \\\"%s\\\". The server has modified \\\"%s/world.ini\\\" and removed this invalid link.\",\n\t\t\t\tGetName().c_str(), m_LinkedNetherWorldName.c_str(), GetName().c_str());\n\t\t\tm_LinkedNetherWorldName.clear();\n\t\t}\n\t\tif (!m_LinkedEndWorldName.empty() && !WorldExists(m_LinkedEndWorldName))\n\t\t{\n\t\t\tIniFile.SetValue(\"LinkedWorlds\", \"EndWorldName\", \"\");\n\t\t\tLOG(\"%s Is linked to a nonexisting end world called \\\"%s\\\". The server has modified \\\"%s/world.ini\\\" and removed this invalid link.\",\n\t\t\t\tGetName().c_str(), m_LinkedEndWorldName.c_str(), GetName().c_str());\n\t\t\tm_LinkedEndWorldName.clear();\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!m_LinkedOverworldName.empty() && !WorldExists(m_LinkedOverworldName))\n\t\t{\n\t\t\tIniFile.SetValue(\"LinkedWorlds\", \"OverworldName\", \"\");\n\t\t\tLOG(\"%s Is linked to a nonexisting overworld called \\\"%s\\\". The server has modified \\\"%s/world.ini\\\" and removed this invalid link.\",\n\t\t\t\tGetName().c_str(), m_LinkedOverworldName.c_str(), GetName().c_str());\n\t\t\tm_LinkedOverworldName.clear();\n\t\t}\n\t}\n\n\n\n\t// Adjust the enum-backed variables into their respective bounds:\n\tm_GameMode         = static_cast<eGameMode>     (Clamp<int>(GameMode,         gmSurvival, gmSpectator));\n\tm_TNTShrapnelLevel = static_cast<eShrapnelLevel>(Clamp<int>(TNTShrapnelLevel, slNone,     slAll));\n\tm_Weather          = static_cast<eWeather>      (Clamp<int>(Weather,          wSunny,     wStorm));\n\n\tcComposableGenerator::InitializeGeneratorDefaults(IniFile, m_Dimension);\n\n\tInitializeAndLoadMobSpawningValues(IniFile);\n\tm_WorldDate = cTickTime(IniFile.GetValueSetI(\"General\", \"TimeInTicks\", GetWorldDate().count()));\n\n\t// preallocate some memory for ticking blocks so we don't need to allocate that often\n\tm_BlockTickQueue.reserve(1000);\n\tm_BlockTickQueueCopy.reserve(1000);\n\n\t// Simulators:\n\tm_SimulatorManager  = std::make_unique<cSimulatorManager>(*this);\n\tm_WaterSimulator    = InitializeFluidSimulator(IniFile, \"Water\", E_BLOCK_WATER, E_BLOCK_STATIONARY_WATER);\n\tm_LavaSimulator     = InitializeFluidSimulator(IniFile, \"Lava\",  E_BLOCK_LAVA,  E_BLOCK_STATIONARY_LAVA);\n\tm_SandSimulator     = std::make_unique<cSandSimulator>(*this, IniFile);\n\tm_FireSimulator     = std::make_unique<cFireSimulator>(*this, IniFile);\n\tm_RedstoneSimulator = InitializeRedstoneSimulator(IniFile);\n\n\t// Water, Lava and Redstone simulators get registered in their initialize function.\n\tm_SimulatorManager->RegisterSimulator(m_SandSimulator.get(), 1);\n\tm_SimulatorManager->RegisterSimulator(m_FireSimulator.get(), 1);\n\n\tm_Storage.Initialize(*this, m_StorageSchema, m_StorageCompressionFactor);\n\tm_Generator.Initialize(m_GeneratorCallbacks, m_GeneratorCallbacks, IniFile);\n\n\tm_MapManager.LoadMapData();\n\n\t// Save any changes that the defaults may have done to the ini file:\n\tif (!IniFile.WriteFile(m_IniFileName))\n\t{\n\t\tLOGWARNING(\"Could not write world config to %s\", m_IniFileName.c_str());\n\t}\n\n\t// Init of the spawn monster time (as they are supposed to have different spawn rate)\n\tm_LastSpawnMonster.emplace(cMonster::mfHostile, 0_tick);\n\tm_LastSpawnMonster.emplace(cMonster::mfPassive, 0_tick);\n\tm_LastSpawnMonster.emplace(cMonster::mfAmbient, 0_tick);\n\tm_LastSpawnMonster.emplace(cMonster::mfWater,   0_tick);\n}\n\n\n\n\n\ncWorld::~cWorld()\n{\n\tdelete m_WaterSimulator;     m_WaterSimulator    = nullptr;\n\tdelete m_LavaSimulator;      m_LavaSimulator     = nullptr;\n\tdelete m_RedstoneSimulator;  m_RedstoneSimulator = nullptr;\n}\n\n\n\n\n\nvoid cWorld::CastThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ)\n{\n\tLOG(\"CastThunderbolt(int, int, int) is deprecated, use CastThunderbolt(Vector3i) instead\");\n\tCastThunderbolt({a_BlockX, a_BlockY, a_BlockZ});\n}\n\n\n\n\n\nvoid cWorld::CastThunderbolt(Vector3i a_Block)\n{\n\tBroadcastThunderbolt(a_Block);\n\tBroadcastSoundEffect(\"entity.lightning.thunder\", a_Block, 50, 1);\n}\n\n\n\n\n\ncTickTime cWorld::GetTimeOfDay(void) const\n{\n\tusing namespace std::chrono_literals;\n\n\treturn std::chrono::duration_cast<cTickTime>(m_WorldDate % 20min);\n}\n\n\n\n\n\ncTickTimeLong cWorld::GetWorldAge(void) const\n{\n\treturn std::chrono::duration_cast<cTickTimeLong>(m_WorldAge);\n}\n\n\n\n\n\ncTickTimeLong cWorld::GetWorldDate() const\n{\n\treturn std::chrono::duration_cast<cTickTimeLong>(m_WorldDate);\n}\n\n\n\n\n\ncTickTimeLong cWorld::GetWorldTickAge() const\n{\n\treturn m_WorldTickAge;\n}\n\n\n\n\n\nvoid cWorld::SetTimeOfDay(const cTickTime a_TimeOfDay)\n{\n\tusing namespace std::chrono_literals;\n\n\tm_WorldDate = (m_WorldDate / 20min) * 20min + a_TimeOfDay;\n\tUpdateSkyDarkness();\n\tBroadcastTimeUpdate();\n}\n\n\n\n\n\nint cWorld::GetDefaultWeatherInterval(eWeather a_Weather) const\n{\n\tauto & Random = GetRandomProvider();\n\tswitch (a_Weather)\n\t{\n\t\tcase eWeather_Sunny:\n\t\t{\n\t\t\treturn Random.RandInt(m_MinSunnyTicks, m_MaxSunnyTicks);\n\t\t}\n\t\tcase eWeather_Rain:\n\t\t{\n\t\t\treturn Random.RandInt(m_MinRainTicks, m_MaxRainTicks);\n\t\t}\n\t\tcase eWeather_ThunderStorm:\n\t\t{\n\t\t\treturn Random.RandInt(m_MinThunderStormTicks, m_MaxThunderStormTicks);\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported weather\");\n}\n\n\n\n\n\nvoid cWorld::SetWeather(eWeather a_NewWeather)\n{\n\t// Do the plugins agree? Do they want a different weather?\n\tif (cRoot::Get()->GetPluginManager()->CallHookWeatherChanging(*this, a_NewWeather))\n\t{\n\t\tm_WeatherInterval = GetDefaultWeatherInterval(m_Weather);\n\t\treturn;\n\t}\n\n\t// Set new period for the selected weather:\n\tm_WeatherInterval = GetDefaultWeatherInterval(a_NewWeather);\n\n\t// The weather can't be found:\n\tif (m_WeatherInterval < 0)\n\t{\n\t\treturn;\n\t}\n\n\tm_Weather = a_NewWeather;\n\tBroadcastWeather(m_Weather);\n\n\t// Let the plugins know about the change:\n\tcPluginManager::Get()->CallHookWeatherChanged(*this);\n}\n\n\n\n\n\nvoid cWorld::ChangeWeather(void)\n{\n\t// In the next tick the weather will be changed\n\tm_WeatherInterval = 0;\n}\n\n\n\n\n\nbool cWorld::IsWeatherSunnyAt(int a_BlockX, int a_BlockZ) const\n{\n\treturn m_ChunkMap.IsWeatherSunnyAt(a_BlockX, a_BlockZ);\n}\n\n\n\n\n\nbool cWorld::IsWeatherWetAt(int a_BlockX, int a_BlockZ)\n{\n\treturn m_ChunkMap.IsWeatherWetAt(a_BlockX, a_BlockZ);\n}\n\n\n\n\n\nbool cWorld::IsWeatherWetAtXYZ(const Vector3i a_Position)\n{\n\treturn m_ChunkMap.IsWeatherWetAt(a_Position);\n}\n\n\n\n\n\nvoid cWorld::SetNextBlockToTick(const Vector3i a_BlockPos)\n{\n\treturn m_ChunkMap.SetNextBlockToTick(a_BlockPos);\n}\n\n\n\n\n\nbool cWorld::SetSpawn(int a_X, int a_Y, int a_Z)\n{\n\tcIniFile IniFile;\n\n\tIniFile.ReadFile(m_IniFileName);\n\tIniFile.SetValueI(\"SpawnPosition\", \"X\", a_X);\n\tIniFile.SetValueI(\"SpawnPosition\", \"Y\", a_Y);\n\tIniFile.SetValueI(\"SpawnPosition\", \"Z\", a_Z);\n\tif (IniFile.WriteFile(m_IniFileName))\n\t{\n\t\tm_SpawnX = a_X;\n\t\tm_SpawnY = a_Y;\n\t\tm_SpawnZ = a_Z;\n\t\tFLOGD(\"Spawn set at {}\", Vector3i{m_SpawnX, m_SpawnY, m_SpawnZ});\n\t\treturn true;\n\t}\n\telse\n\t{\n\t\tLOGWARNING(\"Couldn't write new spawn settings to \\\"%s\\\".\", m_IniFileName.c_str());\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cWorld::InitializeSpawn(void)\n{\n\t// For the debugging builds, don't make the server build too much world upon start:\n\t#if !defined(NDEBUG) || defined(ANDROID)\n\t\tconst int DefaultViewDist = 9;\n\t#else\n\t\tconst int DefaultViewDist = 20;  // Always prepare an area 20 chunks across, no matter what the actual cClientHandle::VIEWDISTANCE is\n\t#endif  // !NDEBUG\n\n\tif (!m_IsSpawnExplicitlySet)\n\t{\n\t\t// Spawn position wasn't already explicitly set, enumerate random solid-land coordinate and then write it to the world configuration:\n\t\tGenerateRandomSpawn(DefaultViewDist);\n\t}\n\n\tcIniFile IniFile;\n\tIniFile.ReadFile(m_IniFileName);\n\tint ViewDist = IniFile.GetValueSetI(\"SpawnPosition\", \"PregenerateDistance\", DefaultViewDist);\n\tIniFile.WriteFile(m_IniFileName);\n\n\tint ChunkX = 0, ChunkZ = 0;\n\tcChunkDef::BlockToChunk(m_SpawnX, m_SpawnZ, ChunkX, ChunkZ);\n\tcSpawnPrepare::PrepareChunks(*this, ChunkX, ChunkZ, ViewDist);\n}\n\n\n\n\n\nvoid cWorld::Start()\n{\n\tm_Lighting.Start();\n\tm_Storage.Start();\n\tm_Generator.Start();\n\tm_ChunkSender.Start();\n\tm_TickThread.Start();\n}\n\n\n\n\n\nvoid cWorld::GenerateRandomSpawn(int a_MaxSpawnRadius)\n{\n\tLOGD(\"Generating random spawnpoint...\");\n\n\t// Number of checks to make sure we have a valid biome\n\t// 100 checks will check across 400 chunks, we should have\n\t// a valid biome by then.\n\tstatic const int BiomeCheckCount = 100;\n\n\t// Make sure we are in a valid biome\n\tVector3i BiomeOffset = Vector3i(0, 0, 0);\n\tfor (int BiomeCheckIndex = 0; BiomeCheckIndex < BiomeCheckCount; ++BiomeCheckIndex)\n\t{\n\t\tEMCSBiome Biome = GetBiomeAt(BiomeOffset.x, BiomeOffset.z);\n\t\tif ((Biome != EMCSBiome::biOcean) && (Biome != EMCSBiome::biFrozenOcean))\n\t\t{\n\t\t\t// Found a usable biome\n\t\t\tbreak;\n\t\t}\n\n\t\tBiomeOffset.x += cChunkDef::Width * 4;\n\t}\n\n\t// Check 0, 0 first.\n\tVector3i BiomeSpawn = BiomeOffset;\n\tif (CanSpawnAt(BiomeSpawn.x, BiomeSpawn.y, BiomeSpawn.z))\n\t{\n\t\tSetSpawn(BiomeSpawn.x, BiomeSpawn.y, BiomeSpawn.z);\n\t\tauto ChunkPos = cChunkDef::BlockToChunk(BiomeSpawn);\n\t\tcSpawnPrepare::PrepareChunks(*this, ChunkPos, a_MaxSpawnRadius);\n\t\tFLOGINFO(\"World \\\"{}\\\": Generated spawnpoint position at {}\", m_WorldName, BiomeSpawn);\n\t\treturn;\n\t}\n\n\t// A search grid (searches clockwise around the origin)\n\tstatic const int HalfChunk = cChunkDef::Width / 2;\n\tstatic const Vector3i ChunkOffset[] =\n\t{\n\t\tVector3i(0, 0, HalfChunk),\n\t\tVector3i(HalfChunk, 0, HalfChunk),\n\t\tVector3i(HalfChunk, 0, 0),\n\t\tVector3i(HalfChunk, 0, -HalfChunk),\n\t\tVector3i(0, 0, -HalfChunk),\n\t\tVector3i(-HalfChunk, 0, -HalfChunk),\n\t\tVector3i(-HalfChunk, 0, 0),\n\t\tVector3i(-HalfChunk, 0, HalfChunk),\n\t};\n\n\tstatic const int PerRadiSearchCount = ARRAYCOUNT(ChunkOffset);\n\n\tfor (int RadiusOffset = 1; RadiusOffset < (a_MaxSpawnRadius * 2); ++RadiusOffset)\n\t{\n\t\tfor (int SearchGridIndex = 0; SearchGridIndex < PerRadiSearchCount; ++SearchGridIndex)\n\t\t{\n\t\t\tauto PotentialSpawn = BiomeOffset + (ChunkOffset[SearchGridIndex] * RadiusOffset);\n\n\t\t\tif (CanSpawnAt(PotentialSpawn.x, PotentialSpawn.y, PotentialSpawn.z))\n\t\t\t{\n\t\t\t\tSetSpawn(PotentialSpawn.x, PotentialSpawn.y, PotentialSpawn.z);\n\n\t\t\t\tauto ChunkPos = cChunkDef::BlockToChunk(PotentialSpawn);\n\t\t\t\tcSpawnPrepare::PrepareChunks(*this, ChunkPos, a_MaxSpawnRadius);\n\n\t\t\t\tFLOGINFO(\"World \\\"{}\\\":Generated spawnpoint position at {}\", m_WorldName, PotentialSpawn);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tSetSpawn(BiomeSpawn.x, BiomeSpawn.y, BiomeSpawn.z);\n\tauto ChunkPos = cChunkDef::BlockToChunk(BiomeSpawn);\n\tcSpawnPrepare::PrepareChunks(*this, ChunkPos, a_MaxSpawnRadius);\n\tFLOGWARNING(\"World \\\"{}\\\": Did not find an acceptable spawnpoint. Generated a random spawnpoint position at {}\", m_WorldName, BiomeSpawn);\n}\n\n\n\n\n\nbool cWorld::CanSpawnAt(int a_X, int & a_Y, int a_Z)\n{\n\t// All this blocks can only be found above ground.\n\t// Apart from netherrack (as the Nether is technically a massive cave)\n\tstatic const BLOCKTYPE ValidSpawnBlocks[] =\n\t{\n\t\tE_BLOCK_GRASS,\n\t\tE_BLOCK_SAND,\n\t\tE_BLOCK_SNOW,\n\t\tE_BLOCK_SNOW_BLOCK,\n\t\tE_BLOCK_NETHERRACK\n\t};\n\n\n\tclass cCanSpawnChunkStay:\n\t\tpublic cChunkStay\n\t{\n\t\tcEvent m_ChunksReady;\n\tpublic:\n\n\t\tcCanSpawnChunkStay(double a_WorldX, double a_WorldZ)\n\t\t{\n\t\t\tauto Chunk = cChunkDef::BlockToChunk(Vector3d{a_WorldX, 0.0, a_WorldZ}.Floor());\n\t\t\tfor (int XOffset = -1; XOffset != 2; ++XOffset)\n\t\t\t{\n\t\t\t\tfor (int ZOffset = -1; ZOffset != 2; ++ZOffset)\n\t\t\t\t{\n\t\t\t\t\tAdd(Chunk.m_ChunkX + XOffset, Chunk.m_ChunkZ + ZOffset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvirtual ~cCanSpawnChunkStay() override\n\t\t{\n\t\t\tDisable();\n\t\t}\n\n\t\tvirtual bool OnAllChunksAvailable() override\n\t\t{\n\t\t\tm_ChunksReady.Set();\n\t\t\treturn false;  // Keep chunk stay active\n\t\t}\n\n\t\tvirtual void OnChunkAvailable(int, int) override {}\n\t\tvirtual void OnDisabled() override {}\n\n\t\tvoid Wait()\n\t\t{\n\t\t\tm_ChunksReady.Wait();\n\t\t}\n\t};\n\n\t// Use chunk stay to load 3x3 chunk area around a_X, a_Z\n\tcCanSpawnChunkStay ChunkStay(a_X, a_Z);\n\tChunkStay.Enable(m_ChunkMap);\n\tChunkStay.Wait();\n\n\tstatic const int ValidSpawnBlocksCount = ARRAYCOUNT(ValidSpawnBlocks);\n\n\t// Increase this by two, because we need two more blocks for body and head\n\tauto Height = GetHeight(static_cast<int>(a_X), static_cast<int>(a_Z));\n\tASSERT(Height.has_value());\n\tstatic const int HighestSpawnPoint = *Height + 2;\n\tstatic const int LowestSpawnPoint = static_cast<int>(HighestSpawnPoint / 2.0f);\n\n\tfor (int PotentialY = HighestSpawnPoint; PotentialY > LowestSpawnPoint; --PotentialY)\n\t{\n\t\tBLOCKTYPE HeadBlock = GetBlock({ a_X, PotentialY, a_Z });\n\n\t\t// Is this block safe for spawning\n\t\tif (HeadBlock != E_BLOCK_AIR)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tBLOCKTYPE BodyBlock = GetBlock({ a_X, PotentialY - 1, a_Z });\n\n\t\t// Is this block safe for spawning\n\t\tif (BodyBlock != E_BLOCK_AIR)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tBLOCKTYPE FloorBlock = GetBlock({ a_X, PotentialY - 2, a_Z });\n\n\t\t// Early out - Is the floor block air\n\t\tif (FloorBlock == E_BLOCK_AIR)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Is the floor block ok\n\t\tbool ValidSpawnBlock = false;\n\t\tfor (int BlockIndex = 0; BlockIndex < ValidSpawnBlocksCount; ++BlockIndex)\n\t\t{\n\t\t\tValidSpawnBlock |= (ValidSpawnBlocks[BlockIndex] == FloorBlock);\n\t\t}\n\n\t\tif (!ValidSpawnBlock)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!CheckPlayerSpawnPoint(a_X, PotentialY - 1, a_Z))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\ta_Y = PotentialY - 1;\n\t\treturn true;\n\t}\n\n\t// Always set a_Y so it can be used when we fail to find any spawn point\n\ta_Y = HighestSpawnPoint - 2;\n\treturn false;\n}\n\n\n\n\n\nbool cWorld::CheckPlayerSpawnPoint(Vector3i a_Pos)\n{\n\t// Check height bounds\n\tif (!cChunkDef::IsValidHeight(a_Pos))\n\t{\n\t\treturn false;\n\t}\n\n\t// Check that surrounding blocks are neither solid or liquid\n\tconstexpr std::array<Vector3i, 8> SurroundingCoords =\n\t{\n\t\t{\n\t\t\t{0,  0,  1},\n\t\t\t{1,  0,  1},\n\t\t\t{1,  0,  0},\n\t\t\t{1,  0, -1},\n\t\t\t{0,  0, -1},\n\t\t\t{-1, 0, -1},\n\t\t\t{-1, 0,  0},\n\t\t\t{-1, 0,  1},\n\t\t}\n\t};\n\n\tfor (const auto & Offset : SurroundingCoords)\n\t{\n\t\tconst BLOCKTYPE BlockType = GetBlock(a_Pos + Offset);\n\t\tif (cBlockInfo::IsSolid(BlockType) || IsBlockLiquid(BlockType))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n\n\n\n\neWeather cWorld::ChooseNewWeather()\n{\n\t// Pick a new weather. Only reasonable transitions allowed:\n\tswitch (m_Weather)\n\t{\n\t\tcase eWeather_Sunny:\n\t\tcase eWeather_ThunderStorm:\n\t\t{\n\t\t\treturn eWeather_Rain;\n\t\t}\n\t\tcase eWeather_Rain:\n\t\t{\n\t\t\t// 1 / 8 chance of turning into a thunderstorm\n\t\t\treturn GetRandomProvider().RandBool(0.125) ? eWeather_ThunderStorm : eWeather_Sunny;\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported weather\");\n}\n\n\n\n\n\nvoid cWorld::InitializeAndLoadMobSpawningValues(cIniFile & a_IniFile)\n{\n\tAString DefaultMonsters;\n\tswitch (m_Dimension)\n\t{\n\t\tcase dimOverworld: DefaultMonsters = \"bat, cavespider, chicken, cow, creeper, guardian, horse, mooshroom, ocelot, pig, rabbit, sheep, silverfish, skeleton, slime, spider, squid, wolf, zombie\"; break;  // TODO Re-add Enderman when bugs are fixed\n\t\tcase dimNether:    DefaultMonsters = \"blaze, ghast, magmacube, witherskeleton, zombiepigman\"; break;\n\t\tcase dimEnd:       DefaultMonsters = \"\"; break;  // TODO Re-add Enderman when bugs are fixed\n\t\tcase dimNotSet:    ASSERT(!\"Dimension not set\"); break;\n\t}\n\n\tm_bAnimals = a_IniFile.GetValueSetB(\"Monsters\", \"AnimalsOn\", true);\n\tAString AllMonsters = a_IniFile.GetValueSet(\"Monsters\", \"Types\", DefaultMonsters);\n\n\tif (!m_bAnimals)\n\t{\n\t\treturn;\n\t}\n\n\tAStringVector SplitList = StringSplitAndTrim(AllMonsters, \",\");\n\tfor (AStringVector::const_iterator itr = SplitList.begin(), end = SplitList.end(); itr != end; ++itr)\n\t{\n\t\teMonsterType ToAdd = cMonster::StringToMobType(*itr);\n\t\tif (ToAdd != mtInvalidType)\n\t\t{\n\t\t\tm_AllowedMobs.insert(ToAdd);\n\t\t\tLOGD(\"Allowed mob: %s\", itr->c_str());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLOG(\"World \\\"%s\\\": Unknown mob type: %s\", m_WorldName.c_str(), itr->c_str());\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cWorld::Stop(cDeadlockDetect & a_DeadlockDetect)\n{\n\t// Write settings to file; these are all plugin changeable values - keep updated!\n\tcIniFile IniFile;\n\tIniFile.ReadFile(m_IniFileName);\n\t\tif (GetDimension() == dimOverworld)\n\t\t{\n\t\t\tIniFile.SetValue(\"LinkedWorlds\", \"NetherWorldName\", m_LinkedNetherWorldName);\n\t\t\tIniFile.SetValue(\"LinkedWorlds\", \"EndWorldName\",    m_LinkedEndWorldName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIniFile.SetValue(\"LinkedWorlds\", \"OverworldName\", m_LinkedOverworldName);\n\t\t}\n\t\tIniFile.SetValueI(\"Physics\", \"TNTShrapnelLevel\", static_cast<int>(m_TNTShrapnelLevel));\n\t\tIniFile.SetValueB(\"Mechanics\", \"CommandBlocksEnabled\", m_bCommandBlocksEnabled);\n\t\tIniFile.SetValueB(\"Mechanics\", \"UseChatPrefixes\", m_bUseChatPrefixes);\n\t\tIniFile.SetValueB(\"General\", \"IsDaylightCycleEnabled\", m_IsDaylightCycleEnabled);\n\t\tIniFile.SetValueI(\"General\", \"Weather\", static_cast<int>(m_Weather));\n\t\tIniFile.SetValueI(\"General\", \"TimeInTicks\", GetWorldDate().count());\n\t\tIniFile.SetValueI(\"General\", \"WorldAgeMS\", static_cast<Int64>(m_WorldAge.count()));\n\tIniFile.WriteFile(m_IniFileName);\n\n\tm_TickThread.Stop();\n\tm_Lighting.Stop();\n\tm_Generator.Stop();\n\tm_ChunkSender.Stop();\n\tm_Storage.Stop();  // Waits for thread to finish\n\n\ta_DeadlockDetect.UntrackCriticalSection(m_CSTasks);\n\tm_ChunkMap.UntrackInDeadlockDetect(a_DeadlockDetect);\n\n\tif (IsSavingEnabled())\n\t{\n\t\t// Unload the scoreboard\n\t\tcScoreboardSerializer Serializer(m_DataPath, &m_Scoreboard);\n\t\tSerializer.Save();\n\n\t\tm_MapManager.SaveMapData();\n\t}\n}\n\n\n\n\n\nvoid cWorld::Tick(std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_LastTickDurationMSec)\n{\n\t// Notify the plugins:\n\tcPluginManager::Get()->CallHookWorldTick(*this, a_Dt, a_LastTickDurationMSec);\n\n\tm_WorldAge += a_Dt;\n\tm_WorldTickAge++;\n\n\tif (m_IsDaylightCycleEnabled)\n\t{\n\t\tm_WorldDate += a_Dt;\n\n\t\t// Updates the sky darkness based on current time of day:\n\t\tUpdateSkyDarkness();\n\n\t\t// Broadcast time update every 64 ticks (3.2 seconds):\n\t\tif ((m_WorldTickAge % 64_tick) == 0_tick)\n\t\t{\n\t\t\tBroadcastTimeUpdate();\n\t\t}\n\t}\n\n\t// Broadcast player list pings every 256 ticks (12.8 seconds):\n\tif ((m_WorldTickAge % 256_tick) == 0_tick)\n\t{\n\t\tBroadcastPlayerListUpdatePing();\n\t}\n\n\t// Process all clients' buffered actions:\n\tfor (const auto Player : m_Players)\n\t{\n\t\tPlayer->GetClientHandle()->ProcessProtocolIn();\n\t}\n\n\tTickClients(a_Dt);\n\tTickQueuedChunkDataSets();\n\tTickQueuedBlocks();\n\tm_ChunkMap.Tick(a_Dt);\n\tTickMobs(a_Dt);\n\tTickQueuedEntityAdditions();\n\tm_MapManager.TickMaps();\n\tTickQueuedTasks();\n\tTickWeather(static_cast<float>(a_Dt.count()));\n\n\tGetSimulatorManager()->Simulate(static_cast<float>(a_Dt.count()));\n\n\t// Flush out all clients' buffered data:\n\tfor (const auto Player : m_Players)\n\t{\n\t\tPlayer->GetClientHandle()->ProcessProtocolOut();\n\t}\n\n\tif (m_WorldAge - m_LastChunkCheck > std::chrono::seconds(10))\n\t{\n\t\t// Unload every 10 seconds\n\t\tUnloadUnusedChunks();\n\n\t\tif (m_WorldAge - m_LastSave > std::chrono::minutes(5))\n\t\t{\n\t\t\t// Save every 5 minutes\n\t\t\tSaveAllChunks();\n\t\t}\n\t\telse if (GetNumUnusedDirtyChunks() > m_UnusedDirtyChunksCap)\n\t\t{\n\t\t\t// Save if we have too many dirty unused chunks\n\t\t\tSaveAllChunks();\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cWorld::TickClients(const std::chrono::milliseconds a_Dt)\n{\n\tfor (const auto Player : m_Players)\n\t{\n\t\tPlayer->GetClientHandle()->Tick(a_Dt);\n\t}\n}\n\n\n\n\n\nvoid cWorld::TickWeather(float a_Dt)\n{\n\tUNUSED(a_Dt);\n\t// There are no weather changes anywhere but in the Overworld:\n\tif (GetDimension() != dimOverworld)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_WeatherInterval > 0)\n\t{\n\t\t// Not yet, wait for the weather period to end\n\t\tm_WeatherInterval--;\n\t}\n\telse\n\t{\n\t\t// Change weather:\n\t\tSetWeather(ChooseNewWeather());\n\t}\n\n\tif (m_Weather == eWeather_ThunderStorm)\n\t{\n\t\t// 0.5% chance per tick of thunderbolt\n\t\tif (GetRandomProvider().RandBool(0.005))\n\t\t{\n\t\t\tCastThunderbolt({0, 0, 0});  // TODO: find random positions near players to cast thunderbolts.\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cWorld::TickMobs(std::chrono::milliseconds a_Dt)\n{\n\t// _X 2013_10_22: This is a quick fix for #283 - the world needs to be locked while ticking mobs\n\tcWorld::cLock Lock(*this);\n\n\t// before every Mob action, we have to count them depending on the distance to players, on their family ...\n\tcMobCensus MobCensus;\n\tm_ChunkMap.CollectMobCensus(MobCensus);\n\tif (m_bAnimals)\n\t{\n\t\t// Spawning is enabled, spawn now:\n\t\tstatic const cMonster::eFamily AllFamilies[] =\n\t\t{\n\t\t\tcMonster::mfHostile,\n\t\t\tcMonster::mfPassive,\n\t\t\tcMonster::mfAmbient,\n\t\t\tcMonster::mfWater,\n\t\t} ;\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(AllFamilies); i++)\n\t\t{\n\t\t\tcMonster::eFamily Family = AllFamilies[i];\n\t\t\tif (\n\t\t\t\t(m_LastSpawnMonster[Family] > (m_WorldTickAge - cMonster::GetSpawnDelay(Family))) ||  // Not reached the needed ticks before the next round\n\t\t\t\tMobCensus.IsCapped(Family)\n\t\t\t)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tm_LastSpawnMonster[Family] = m_WorldTickAge;\n\t\t\tcMobSpawner Spawner(Family, m_AllowedMobs);\n\t\t\tif (Spawner.CanSpawnAnything())\n\t\t\t{\n\t\t\t\tm_ChunkMap.SpawnMobs(Spawner);\n\t\t\t\t// do the spawn\n\t\t\t\tfor (auto & Mob : Spawner.getSpawned())\n\t\t\t\t{\n\t\t\t\t\tSpawnMobFinalize(std::move(Mob));\n\t\t\t\t}\n\t\t\t}\n\t\t}  // for i - AllFamilies[]\n\t}  // if (Spawning enabled)\n\n\tForEachEntity([=](cEntity & a_Entity)\n\t\t{\n\t\t\tif (!a_Entity.IsMob())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!a_Entity.IsTicking())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tauto & Monster = static_cast<cMonster &>(a_Entity);\n\t\t\tASSERT(Monster.GetParentChunk() != nullptr);  // A ticking entity must have a valid parent chunk\n\n\t\t\t// Tick close mobs\n\t\t\tif (Monster.GetParentChunk()->HasAnyClients())\n\t\t\t{\n\t\t\t\tMonster.Tick(a_Dt, *(a_Entity.GetParentChunk()));\n\t\t\t}\n\t\t\t// Destroy far hostile mobs except if last target was a player\n\t\t\telse if ((Monster.GetMobFamily() == cMonster::eFamily::mfHostile) && !Monster.WasLastTargetAPlayer())\n\t\t\t{\n\t\t\t\tif (Monster.GetMobType() != eMonsterType::mtWolf)\n\t\t\t\t{\n\t\t\t\t\tMonster.Destroy();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tauto & Wolf = static_cast<cWolf &>(Monster);\n\t\t\t\t\tif (!Wolf.IsAngry() && !Wolf.IsTame())\n\t\t\t\t\t{\n\t\t\t\t\t\tMonster.Destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t);\n}\n\n\n\n\n\nvoid cWorld::TickQueuedChunkDataSets()\n{\n\tdecltype(m_SetChunkDataQueue) SetChunkDataQueue;\n\t{\n\t\tcCSLock Lock(m_CSSetChunkDataQueue);\n\t\tSetChunkDataQueue = std::move(m_SetChunkDataQueue);\n\t}\n\n\t// Set any chunk data that has been queued for setting:\n\tfor (auto & Item : SetChunkDataQueue)\n\t{\n\t\t// A copy of the chunk coordinates since we're moving Item.\n\t\tconst auto Chunk = Item.Chunk;\n\n\t\t// Set the data:\n\t\tm_ChunkMap.SetChunkData(std::move(Item));\n\n\t\t// If a client is requesting this chunk, send it to them:\n\t\tcChunkSender & ChunkSender = m_ChunkSender;\n\t\tDoWithChunk(\n\t\t\tChunk.m_ChunkX, Chunk.m_ChunkZ,\n\t\t\t[&ChunkSender](cChunk & a_Chunk)\n\t\t\t{\n\t\t\t\tif (a_Chunk.HasAnyClients())\n\t\t\t\t{\n\t\t\t\t\tChunkSender.QueueSendChunkTo(\n\t\t\t\t\t\ta_Chunk.GetPosX(),\n\t\t\t\t\t\ta_Chunk.GetPosZ(),\n\t\t\t\t\t\tcChunkSender::Priority::Medium,\n\t\t\t\t\t\ta_Chunk.GetAllClients()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t);\n\t}  // for itr - SetChunkDataQueue[]\n}\n\n\n\n\n\nvoid cWorld::TickQueuedEntityAdditions(void)\n{\n\tdecltype(m_EntitiesToAdd) EntitiesToAdd;\n\t{\n\t\tcCSLock Lock(m_CSEntitiesToAdd);\n\t\tstd::swap(EntitiesToAdd, m_EntitiesToAdd);\n\t}\n\n\t// Ensures m_Players manipulation happens under the chunkmap lock.\n\tcLock Lock(*this);\n\n\t// Add entities waiting in the queue to be added:\n\tfor (auto & Item: EntitiesToAdd)\n\t{\n\t\tconst auto Entity = Item.first.get();\n\n\t\tif (Entity->IsPlayer())\n\t\t{\n\t\t\tconst auto Player = static_cast<cPlayer *>(Entity);\n\n\t\t\tLOGD(\"Adding player %s to world \\\"%s\\\".\", Player->GetName().c_str(), m_WorldName.c_str());\n\t\t\tASSERT(std::find(m_Players.begin(), m_Players.end(), Player) == m_Players.end());  // Is it already in the list? HOW?\n\n\t\t\tm_Players.push_back(Player);\n\t\t}\n\n\t\tm_ChunkMap.AddEntity(std::move(Item.first));\n\n\t\tif (const auto OldWorld = Item.second; OldWorld != nullptr)\n\t\t{\n\t\t\tcRoot::Get()->GetPluginManager()->CallHookEntityChangedWorld(*Entity, *OldWorld);\n\t\t}\n\t}\n}\n\n\n\n\n\nvoid cWorld::TickQueuedTasks(void)\n{\n\t// Move the tasks to be executed to a seperate vector to avoid deadlocks on accessing m_Tasks\n\tdecltype(m_Tasks) Tasks;\n\t{\n\t\tcCSLock Lock(m_CSTasks);\n\t\tif (m_Tasks.empty())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Partition everything to be executed by returning false to move to end of list if time reached\n\t\tauto MoveBeginIterator = std::partition(m_Tasks.begin(), m_Tasks.end(), [this](const decltype(m_Tasks)::value_type & a_Task)\n\t\t{\n\t\t\treturn a_Task.first >= m_WorldAge;\n\t\t});\n\n\t\t// Cut all the due tasks from m_Tasks into Tasks:\n\t\tTasks.insert(\n\t\t\tTasks.end(),\n\t\t\tstd::make_move_iterator(MoveBeginIterator),\n\t\t\tstd::make_move_iterator(m_Tasks.end())\n\t\t);\n\t\tm_Tasks.erase(MoveBeginIterator, m_Tasks.end());\n\t}\n\n\t// Execute each task:\n\tfor (const auto & Task : Tasks)\n\t{\n\t\tTask.second(*this);\n\t}  // for itr - m_Tasks[]\n}\n\n\n\n\n\nvoid cWorld::UpdateSkyDarkness(void)\n{\n\tconst auto TIME_SUNSET = 12000_tick;\n\tconst auto TIME_NIGHT_START = 13187_tick;\n\tconst auto TIME_NIGHT_END = 22812_tick;\n\tconst auto TIME_SUNRISE = 23999_tick;\n\tconst auto TIME_SPAWN_DIVISOR = 148_tick;\n\n\tconst auto TempTime = GetTimeOfDay();\n\tif (TempTime <= TIME_SUNSET)\n\t{\n\t\tm_SkyDarkness = 0;\n\t}\n\telse if (TempTime <= TIME_NIGHT_START)\n\t{\n\t\tm_SkyDarkness = static_cast<NIBBLETYPE>((TIME_NIGHT_START - TempTime) / TIME_SPAWN_DIVISOR);\n\t}\n\telse if (TempTime <= TIME_NIGHT_END)\n\t{\n\t\tm_SkyDarkness = 8;\n\t}\n\telse\n\t{\n\t\tm_SkyDarkness = static_cast<NIBBLETYPE>((TIME_SUNRISE - TempTime) / TIME_SPAWN_DIVISOR);\n\t}\n}\n\n\n\n\n\nvoid cWorld::WakeUpSimulators(Vector3i a_Block)\n{\n\treturn m_ChunkMap.WakeUpSimulators(a_Block);\n}\n\n\n\n\n\nvoid cWorld::WakeUpSimulatorsInArea(const cCuboid & a_Area)\n{\n\tm_SimulatorManager->WakeUp(a_Area);\n}\n\n\n\n\n\nbool cWorld::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback a_Callback)\n{\n\treturn m_ChunkMap.ForEachBlockEntityInChunk(a_ChunkX, a_ChunkZ, a_Callback);\n}\n\n\n\n\n\nvoid cWorld::DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_BlockY, double a_BlockZ, bool a_CanCauseFire, eExplosionSource a_Source, void * a_SourceData)\n{\n\tcLock Lock(*this);\n\tif (!cPluginManager::Get()->CallHookExploding(*this, a_ExplosionSize, a_CanCauseFire, a_BlockX, a_BlockY, a_BlockZ, a_Source, a_SourceData) && (a_ExplosionSize > 0))\n\t{\n\t\t// TODO: CanCauseFire gets reset to false for some reason, (plugin has ability to change it, might be related)\n\n\t\tconst cEntity * Entity;\n\t\tswitch (a_Source)\n\t\t{\n\t\t\tcase eExplosionSource::esEnderCrystal:\n\t\t\tcase eExplosionSource::esGhastFireball:\n\t\t\tcase eExplosionSource::esMonster:\n\t\t\tcase eExplosionSource::esPrimedTNT:\n\t\t\tcase eExplosionSource::esTNTMinecart:\n\t\t\tcase eExplosionSource::esWitherBirth:\n\t\t\tcase eExplosionSource::esWitherSkull:\n\t\t\t{\n\t\t\t\tEntity = static_cast<const cEntity *>(a_SourceData);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tEntity = nullptr;\n\t\t\t}\n\t\t}\n\n\t\tExplodinator::Kaboom(*this, Vector3d(a_BlockX, a_BlockY, a_BlockZ), FloorC(a_ExplosionSize), a_CanCauseFire, Entity);\n\t\tcPluginManager::Get()->CallHookExploded(*this, a_ExplosionSize, a_CanCauseFire, a_BlockX, a_BlockY, a_BlockZ, a_Source, a_SourceData);\n\t}\n}\n\n\n\n\n\nbool cWorld::DoWithBlockEntityAt(const Vector3i a_Position, cBlockEntityCallback a_Callback)\n{\n\treturn m_ChunkMap.DoWithBlockEntityAt(a_Position, a_Callback);\n}\n\n\n\n\n\nbool cWorld::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4)\n{\n\treturn DoWithBlockEntityAt({ a_BlockX, a_BlockY, a_BlockZ }, [&a_Line1, &a_Line2, &a_Line3, &a_Line4](cBlockEntity & a_BlockEntity)\n\t{\n\t\tif ((a_BlockEntity.GetBlockType() != E_BLOCK_WALLSIGN) && (a_BlockEntity.GetBlockType() != E_BLOCK_SIGN_POST))\n\t\t{\n\t\t\treturn false;  // Not a sign\n\t\t}\n\n\t\tconst auto & Sign = static_cast<cSignEntity &>(a_BlockEntity);\n\t\ta_Line1 = Sign.GetLine(0);\n\t\ta_Line2 = Sign.GetLine(1);\n\t\ta_Line3 = Sign.GetLine(2);\n\t\ta_Line4 = Sign.GetLine(3);\n\t\treturn true;\n\t});\n}\n\n\n\n\n\nbool cWorld::DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback a_Callback)\n{\n\treturn m_ChunkMap.DoWithChunk(a_ChunkX, a_ChunkZ, a_Callback);\n}\n\n\n\n\n\nbool cWorld::DoWithChunkAt(Vector3i a_BlockPos, cChunkCallback a_Callback)\n{\n\treturn m_ChunkMap.DoWithChunkAt(a_BlockPos, a_Callback);\n}\n\n\n\n\n\nbool cWorld::GrowTree(const Vector3i a_BlockPos)\n{\n\tif (GetBlock(a_BlockPos) == E_BLOCK_SAPLING)\n\t{\n\t\t// There is a sapling here, grow a tree according to its type:\n\t\treturn GrowTreeFromSapling(a_BlockPos);\n\t}\n\telse\n\t{\n\t\t// There is nothing here, grow a tree based on the current biome here:\n\t\treturn GrowTreeByBiome(a_BlockPos);\n\t}\n}\n\n\n\n\n\nbool cWorld::GrowTreeFromSapling(Vector3i a_BlockPos)\n{\n\tcNoise Noise(m_Generator.GetSeed());\n\tsSetBlockVector Logs, Other;\n\tauto WorldAge = static_cast<int>(m_WorldTickAge.count() & 0xffffffff);\n\tauto SaplingMeta = GetBlockMeta(a_BlockPos);\n\tswitch (SaplingMeta & 0x07)\n\t{\n\t\tcase E_META_SAPLING_APPLE:    GetAppleTreeImage  (a_BlockPos, Noise, WorldAge, Logs, Other); break;\n\t\tcase E_META_SAPLING_BIRCH:    GetBirchTreeImage  (a_BlockPos, Noise, WorldAge, Logs, Other); break;\n\t\tcase E_META_SAPLING_CONIFER:\n\t\t{\n\t\t\tbool IsLarge = GetLargeTreeAdjustment(a_BlockPos, SaplingMeta);\n\t\t\tGetConiferTreeImage(a_BlockPos, Noise, WorldAge, Logs, Other, IsLarge);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_SAPLING_ACACIA:   GetAcaciaTreeImage (a_BlockPos, Noise, WorldAge, Logs, Other); break;\n\t\tcase E_META_SAPLING_JUNGLE:\n\t\t{\n\t\t\tbool IsLarge = GetLargeTreeAdjustment(a_BlockPos, SaplingMeta);\n\t\t\tGetJungleTreeImage(a_BlockPos, Noise, WorldAge, Logs, Other, IsLarge);\n\t\t\tbreak;\n\t\t}\n\t\tcase E_META_SAPLING_DARK_OAK:\n\t\t{\n\t\t\tif (!GetLargeTreeAdjustment(a_BlockPos, SaplingMeta))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tGetDarkoakTreeImage(a_BlockPos, Noise, WorldAge, Logs, Other);\n\t\t\tbreak;\n\t\t}\n\t}\n\tOther.insert(Other.begin(), Logs.begin(), Logs.end());\n\tLogs.clear();\n\treturn GrowTreeImage(Other);\n}\n\n\n\n\n\nbool cWorld::GetLargeTreeAdjustment(Vector3i & a_BlockPos, NIBBLETYPE a_Meta)\n{\n\tbool IsLarge = true;\n\ta_Meta = a_Meta & 0x07;\n\n\t// Check to see if we are the northwest corner\n\tfor (int x = 0; x  < 2; ++x)\n\t{\n\t\tfor (int z = 0; z < 2; ++z)\n\t\t{\n\t\t\tNIBBLETYPE meta;\n\t\t\tBLOCKTYPE type;\n\t\t\tIsLarge = IsLarge && GetBlockTypeMeta(a_BlockPos.addedXZ(x, z), type, meta) && (type == E_BLOCK_SAPLING) && ((meta & 0x07) == a_Meta);\n\t\t}\n\t}\n\n\tif (IsLarge)\n\t{\n\t\treturn true;\n\t}\n\n\tIsLarge = true;\n\t// Check to see if we are the southwest corner\n\tfor (int x = 0; x  < 2; ++x)\n\t{\n\t\tfor (int z = 0; z > -2; --z)\n\t\t{\n\t\t\tNIBBLETYPE meta;\n\t\t\tBLOCKTYPE type;\n\t\t\tIsLarge = IsLarge && GetBlockTypeMeta(a_BlockPos.addedXZ(x, z), type, meta) && (type == E_BLOCK_SAPLING) && ((meta & 0x07) == a_Meta);\n\t\t}\n\t}\n\n\tif (IsLarge)\n\t{\n\t\t--a_BlockPos.z;\n\t\treturn true;\n\t}\n\n\tIsLarge = true;\n\t// Check to see if we are the southeast corner\n\tfor (int x = 0; x > -2; --x)\n\t{\n\t\tfor (int z = 0; z > -2; --z)\n\t\t{\n\t\t\tNIBBLETYPE meta;\n\t\t\tBLOCKTYPE type;\n\t\t\tIsLarge = IsLarge && GetBlockTypeMeta(a_BlockPos.addedXZ(x, z), type, meta) && (type == E_BLOCK_SAPLING) && ((meta & 0x07) == a_Meta);\n\t\t}\n\t}\n\n\tif (IsLarge)\n\t{\n\t\t--a_BlockPos.x;\n\t\t--a_BlockPos.z;\n\t\treturn true;\n\t}\n\n\tIsLarge = true;\n\t// Check to see if we are the northeast corner\n\tfor (int x = 0; x > -2; --x)\n\t{\n\t\tfor (int z = 0; z < 2; ++z)\n\t\t{\n\t\t\tNIBBLETYPE meta;\n\t\t\tBLOCKTYPE type;\n\t\t\tIsLarge = IsLarge && GetBlockTypeMeta(a_BlockPos.addedXZ(x, z), type, meta) && (type == E_BLOCK_SAPLING) && ((meta & 0x07) == a_Meta);\n\t\t}\n\t}\n\n\tif (IsLarge)\n\t{\n\t\t--a_BlockPos.x;\n\t}\n\n\treturn IsLarge;\n}\n\n\n\n\n\nbool cWorld::GrowTreeByBiome(const Vector3i a_BlockPos)\n{\n\tcNoise Noise(m_Generator.GetSeed());\n\tsSetBlockVector Logs, Other;\n\tauto seq = static_cast<int>(m_WorldTickAge.count() & 0xffffffff);\n\tGetTreeImageByBiome(a_BlockPos, Noise, seq, GetBiomeAt(a_BlockPos.x, a_BlockPos.z), Logs, Other);\n\tOther.insert(Other.begin(), Logs.begin(), Logs.end());\n\tLogs.clear();\n\treturn GrowTreeImage(Other);\n}\n\n\n\n\n\nbool cWorld::GrowTreeImage(const sSetBlockVector & a_Blocks)\n{\n\t// Check that the tree has place to grow\n\n\t// Make a copy of the log blocks:\n\tsSetBlockVector b2;\n\tfor (sSetBlockVector::const_iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr)\n\t{\n\t\tif (itr->m_BlockType == E_BLOCK_LOG)\n\t\t{\n\t\t\tb2.push_back(*itr);\n\t\t}\n\t}  // for itr - a_Blocks[]\n\n\t// Query blocktypes and metas at those log blocks:\n\tif (!GetBlocks(b2, false))\n\t{\n\t\treturn false;\n\t}\n\n\t// Check that at each log's coord there's an block allowed to be overwritten:\n\tfor (sSetBlockVector::const_iterator itr = b2.begin(); itr != b2.end(); ++itr)\n\t{\n\t\tswitch (itr->m_BlockType)\n\t\t{\n\t\t\tCASE_TREE_ALLOWED_BLOCKS:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}  // for itr - b2[]\n\n\t// All ok, replace blocks with the tree image:\n\tm_ChunkMap.ReplaceTreeBlocks(a_Blocks);\n\treturn true;\n}\n\n\n\n\n\nint cWorld::GrowPlantAt(Vector3i a_BlockPos, int a_NumStages)\n{\n\treturn m_ChunkMap.GrowPlantAt(a_BlockPos, a_NumStages);\n}\n\n\n\n\n\nbool cWorld::GrowRipePlant(Vector3i a_BlockPos)\n{\n\treturn (GrowPlantAt(a_BlockPos, 16) > 0);\n}\n\n\n\n\n\nEMCSBiome cWorld::GetBiomeAt (int a_BlockX, int a_BlockZ)\n{\n\treturn m_ChunkMap.GetBiomeAt(a_BlockX, a_BlockZ);\n}\n\n\n\n\n\nbool cWorld::SetBiomeAt(int a_BlockX, int a_BlockZ, EMCSBiome a_Biome)\n{\n\treturn m_ChunkMap.SetBiomeAt(a_BlockX, a_BlockZ, a_Biome);\n}\n\n\n\n\n\nbool cWorld::SetAreaBiome(int a_MinX, int a_MaxX, int a_MinZ, int a_MaxZ, EMCSBiome a_Biome)\n{\n\treturn m_ChunkMap.SetAreaBiome(a_MinX, a_MaxX, a_MinZ, a_MaxZ, a_Biome);\n}\n\n\n\n\n\nbool cWorld::SetAreaBiome(const cCuboid & a_Area, EMCSBiome a_Biome)\n{\n\treturn SetAreaBiome(\n\t\tstd::min(a_Area.p1.x, a_Area.p2.x), std::max(a_Area.p1.x, a_Area.p2.x),\n\t\tstd::min(a_Area.p1.z, a_Area.p2.z), std::max(a_Area.p1.z, a_Area.p2.z),\n\t\ta_Biome\n\t);\n}\n\n\n\n\n\nvoid cWorld::SetMaxViewDistance(int a_MaxViewDistance)\n{\n\tm_MaxViewDistance = Clamp(a_MaxViewDistance, cClientHandle::MIN_VIEW_DISTANCE, cClientHandle::MAX_VIEW_DISTANCE);\n}\n\n\n\n\n\nvoid cWorld::SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tm_ChunkMap.SetBlock(a_BlockPos, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nvoid cWorld::SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_MetaData)\n{\n\tm_ChunkMap.SetBlockMeta(a_BlockPos, a_MetaData);\n}\n\n\n\n\n\nNIBBLETYPE cWorld::GetBlockSkyLight(Vector3i a_BlockPos) const\n{\n\treturn m_ChunkMap.GetBlockSkyLight(a_BlockPos);\n}\n\n\n\n\n\nNIBBLETYPE cWorld::GetBlockBlockLight(Vector3i a_BlockPos) const\n{\n\treturn m_ChunkMap.GetBlockBlockLight(a_BlockPos);\n}\n\n\n\n\n\nbool cWorld::GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const\n{\n\treturn m_ChunkMap.GetBlockTypeMeta(a_BlockPos, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nbool cWorld::GetBlockInfo(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const\n{\n\treturn m_ChunkMap.GetBlockInfo(a_BlockPos, a_BlockType, a_Meta, a_SkyLight, a_BlockLight);\n}\n\n\n\n\n\nbool cWorld::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)\n{\n\treturn m_ChunkMap.WriteBlockArea(a_Area, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes);\n}\n\n\n\n\n\nvoid cWorld::SpawnItemPickups(const cItems & a_Pickups, Vector3i a_BlockPos, double a_FlyAwaySpeed, bool a_IsPlayerCreated)\n{\n\tauto & random = GetRandomProvider();\n\tauto microX = random.RandReal<double>(0, 1);\n\tauto microZ = random.RandReal<double>(0, 1);\n\treturn SpawnItemPickups(a_Pickups, Vector3d(microX, 0, microZ) + a_BlockPos, a_FlyAwaySpeed, a_IsPlayerCreated);\n}\n\n\n\n\n\nvoid cWorld::SpawnItemPickups(const cItems & a_Pickups, Vector3d a_Pos, double a_FlyAwaySpeed, bool a_IsPlayerCreated)\n{\n\tauto & Random = GetRandomProvider();\n\ta_FlyAwaySpeed /= 100;  // Pre-divide, so that we don't have to divide each time inside the loop\n\tfor (cItems::const_iterator itr = a_Pickups.begin(); itr != a_Pickups.end(); ++itr)\n\t{\n\t\tif (!IsValidItem(itr->m_ItemType) || (itr->m_ItemType == E_BLOCK_AIR))\n\t\t{\n\t\t\t// Don't spawn pickup if item isn't even valid; should prevent client crashing too\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat SpeedX = static_cast<float>(a_FlyAwaySpeed * Random.RandInt(-10, 10));\n\t\tfloat SpeedY = static_cast<float>(a_FlyAwaySpeed * Random.RandInt(40, 50));\n\t\tfloat SpeedZ = static_cast<float>(a_FlyAwaySpeed * Random.RandInt(-10, 10));\n\n\t\tauto Pickup = std::make_unique<cPickup>(a_Pos, *itr, a_IsPlayerCreated, Vector3f{SpeedX, SpeedY, SpeedZ});\n\t\tauto PickupPtr = Pickup.get();\n\t\tPickupPtr->Initialize(std::move(Pickup), *this);\n\t}\n}\n\n\n\n\n\nvoid cWorld::SpawnItemPickups(const cItems & a_Pickups, Vector3d a_Pos, Vector3d a_Speed, bool a_IsPlayerCreated)\n{\n\tfor (cItems::const_iterator itr = a_Pickups.begin(); itr != a_Pickups.end(); ++itr)\n\t{\n\t\tif (!IsValidItem(itr->m_ItemType) || (itr->m_ItemType == E_BLOCK_AIR))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tauto pickup = std::make_unique<cPickup>(a_Pos, *itr, a_IsPlayerCreated, a_Speed);\n\t\tauto pickupPtr = pickup.get();\n\t\tpickupPtr->Initialize(std::move(pickup), *this);\n\t}\n}\n\n\n\n\n\nUInt32 cWorld::SpawnItemPickup(Vector3d a_Pos, const cItem & a_Item, Vector3f a_Speed, int a_LifetimeTicks, bool a_CanCombine)\n{\n\tauto pickup = std::make_unique<cPickup>(a_Pos, a_Item, false, a_Speed, a_LifetimeTicks, a_CanCombine);\n\tauto pickupPtr = pickup.get();\n\tif (!pickupPtr->Initialize(std::move(pickup), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\treturn pickupPtr->GetUniqueID();\n}\n\n\n\n\n\nUInt32 cWorld::SpawnFallingBlock(Vector3d a_Pos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tauto fallingBlock = std::make_unique<cFallingBlock>(a_Pos, a_BlockType, a_BlockMeta);\n\tauto fallingBlockPtr = fallingBlock.get();\n\tauto ID = fallingBlock->GetUniqueID();\n\tif (!fallingBlockPtr->Initialize(std::move(fallingBlock), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\treturn ID;\n}\n\n\n\n\n\nUInt32 cWorld::SpawnExperienceOrb(Vector3d a_Pos, int a_Reward)\n{\n\tif (a_Reward < 1)\n\t{\n\t\tLOGWARNING(\"%s: Attempting to create an experience orb with non-positive reward!\", __FUNCTION__);\n\t\treturn cEntity::INVALID_ID;\n\t}\n\n\tauto expOrb = std::make_unique<cExpOrb>(a_Pos, a_Reward);\n\tauto expOrbPtr = expOrb.get();\n\tif (!expOrbPtr->Initialize(std::move(expOrb), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\treturn expOrbPtr->GetUniqueID();\n}\n\n\n\n\n\nstd::vector<UInt32> cWorld::SpawnSplitExperienceOrbs(Vector3d a_Pos, int a_Reward)\n{\n\tstd::vector<UInt32> OrbsID;\n\n\tif (a_Reward < 1)\n\t{\n\t\tLOGWARNING(\"%s: Attempting to create an experience orb with non-positive reward!\", __FUNCTION__);\n\t\treturn OrbsID;\n\t}\n\n\tstd::vector<int> Rewards = cExpOrb::Split(a_Reward);\n\n\t// Check generate number to decide speed limit (distribute range)\n\tfloat SpeedLimit = static_cast<float>((Rewards.size() / 2) + 5);\n\tif (SpeedLimit > 10)\n\t{\n\t\tSpeedLimit = 10;\n\t}\n\n\tauto & Random = GetRandomProvider();\n\tfor (auto Reward : Rewards)\n\t{\n\t\tauto ExpOrb = std::make_unique<cExpOrb>(a_Pos, Reward);\n\t\tauto ExpOrbPtr = ExpOrb.get();\n\t\tdouble SpeedX = Random.RandReal(-SpeedLimit, SpeedLimit);\n\t\tdouble SpeedY = Random.RandReal(0.5);\n\t\tdouble SpeedZ = Random.RandReal(-SpeedLimit, SpeedLimit);\n\t\tExpOrbPtr->SetSpeed(SpeedX, SpeedY, SpeedZ);\n\n\t\tUInt32 Id = ExpOrbPtr->GetUniqueID();\n\t\tif (ExpOrbPtr->Initialize(std::move(ExpOrb), *this))\n\t\t{\n\t\t\tOrbsID.push_back(Id);\n\t\t}\n\t}\n\n\treturn OrbsID;\n}\n\n\n\n\n\nUInt32 cWorld::SpawnMinecart(Vector3d a_Pos, int a_MinecartType, const cItem & a_Content, int a_BlockHeight)\n{\n\tstd::unique_ptr<cMinecart> Minecart;\n\tswitch (a_MinecartType)\n\t{\n\t\tcase E_ITEM_MINECART:             Minecart = std::make_unique<cRideableMinecart>   (a_Pos, a_Content, a_BlockHeight); break;\n\t\tcase E_ITEM_CHEST_MINECART:       Minecart = std::make_unique<cMinecartWithChest>  (a_Pos); break;\n\t\tcase E_ITEM_FURNACE_MINECART:     Minecart = std::make_unique<cMinecartWithFurnace>(a_Pos); break;\n\t\tcase E_ITEM_MINECART_WITH_TNT:    Minecart = std::make_unique<cMinecartWithTNT>    (a_Pos); break;\n\t\tcase E_ITEM_MINECART_WITH_HOPPER: Minecart = std::make_unique<cMinecartWithHopper> (a_Pos); break;\n\t\tdefault:\n\t\t{\n\t\t\treturn cEntity::INVALID_ID;\n\t\t}\n\t}  // switch (a_MinecartType)\n\n\tauto MinecartPtr = Minecart.get();\n\tif (!MinecartPtr->Initialize(std::move(Minecart), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\treturn MinecartPtr->GetUniqueID();\n}\n\n\n\n\n\nUInt32 cWorld::SpawnBoat(Vector3d a_Pos, cBoat::eMaterial a_Material)\n{\n\tauto Boat = std::make_unique<cBoat>(a_Pos, a_Material);\n\tauto BoatPtr = Boat.get();\n\tif (!BoatPtr->Initialize(std::move(Boat), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\treturn BoatPtr->GetUniqueID();\n}\n\n\n\n\n\nUInt32 cWorld::SpawnPrimedTNT(Vector3d a_Pos, int a_FuseTicks, double a_InitialVelocityCoeff, bool a_ShouldPlayFuseSound)\n{\n\tauto TNT = std::make_unique<cTNTEntity>(a_Pos, a_FuseTicks);\n\tauto TNTPtr = TNT.get();\n\tif (!TNTPtr->Initialize(std::move(TNT), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\n\tif (a_ShouldPlayFuseSound)\n\t{\n\t\tBroadcastSoundEffect(\"entity.tnt.primed\", a_Pos, 1.0f, 1.0f);\n\t}\n\n\tauto & Random = GetRandomProvider();\n\tTNTPtr->SetSpeed(\n\t\ta_InitialVelocityCoeff * Random.RandReal(-0.5f, 0.5f),\n\t\ta_InitialVelocityCoeff * 2,\n\t\ta_InitialVelocityCoeff * Random.RandReal(-0.5f, 0.5f)\n\t);\n\treturn TNTPtr->GetUniqueID();\n}\n\n\n\n\n\nUInt32 cWorld::SpawnEnderCrystal(Vector3d a_Pos, bool a_ShowBottom)\n{\n\tauto EnderCrystal = std::make_unique<cEnderCrystal>(a_Pos, a_ShowBottom);\n\tauto EnderCrystalPtr = EnderCrystal.get();\n\tif (!EnderCrystalPtr->Initialize(std::move(EnderCrystal), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\treturn EnderCrystalPtr->GetUniqueID();\n}\n\n\n\n\n\nvoid cWorld::PlaceBlock(const Vector3i a_Position, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta)\n{\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\tif (!GetBlockTypeMeta(a_Position, BlockType, BlockMeta))\n\t{\n\t\treturn;\n\t}\n\n\tSetBlock(a_Position, a_BlockType, a_BlockMeta);\n\n\tcChunkInterface ChunkInterface(GetChunkMap());\n\tcBlockHandler::For(BlockType).OnBroken(ChunkInterface, *this, a_Position, BlockType, BlockMeta, nullptr);\n\tcBlockHandler::For(a_BlockType).OnPlaced(ChunkInterface, *this, a_Position, a_BlockType, a_BlockMeta);\n}\n\n\n\n\n\nbool cWorld::GetBlocks(sSetBlockVector & a_Blocks, bool a_ContinueOnFailure)\n{\n\treturn m_ChunkMap.GetBlocks(a_Blocks, a_ContinueOnFailure);\n}\n\n\n\n\n\nbool cWorld::DigBlock(Vector3i a_BlockPos, const cEntity * a_Digger)\n{\n\tBLOCKTYPE BlockType;\n\tNIBBLETYPE BlockMeta;\n\tif (!GetBlockTypeMeta(a_BlockPos, BlockType, BlockMeta))\n\t{\n\t\treturn false;\n\t}\n\n\tif (!m_ChunkMap.DigBlock(a_BlockPos))\n\t{\n\t\treturn false;\n\t}\n\n\tcChunkInterface ChunkInterface(GetChunkMap());\n\tcBlockHandler::For(BlockType).OnBroken(ChunkInterface, *this, a_BlockPos, BlockType, BlockMeta, a_Digger);\n\n\treturn true;\n}\n\n\n\n\n\nbool cWorld::DropBlockAsPickups(Vector3i a_BlockPos, const cEntity * a_Digger, const cItem * a_Tool)\n{\n\tauto pickups = PickupsFromBlock(a_BlockPos, a_Digger, a_Tool);\n\tif (!DigBlock(a_BlockPos, a_Digger))\n\t{\n\t\treturn false;\n\t}\n\tSpawnItemPickups(pickups, Vector3d(0.5, 0.5, 0.5) + a_BlockPos, 10);\n\treturn true;\n}\n\n\n\n\n\ncItems cWorld::PickupsFromBlock(Vector3i a_BlockPos, const cEntity * a_Digger, const cItem * a_Tool)\n{\n\treturn m_ChunkMap.PickupsFromBlock(a_BlockPos, a_Digger, a_Tool);\n}\n\n\n\n\n\nvoid cWorld::SendBlockTo(int a_X, int a_Y, int a_Z, const cPlayer & a_Player)\n{\n\tm_ChunkMap.SendBlockTo(a_X, a_Y, a_Z, a_Player);\n}\n\n\n\n\n\nstd::optional<int> cWorld::GetHeight(int a_X, int a_Z)\n{\n\treturn m_ChunkMap.GetHeight(a_X, a_Z);\n}\n\n\n\n\n\nvoid cWorld::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client)\n{\n\tm_ChunkMap.SendBlockEntity(a_BlockX, a_BlockY, a_BlockZ, a_Client);\n}\n\n\n\n\n\nvoid cWorld::MarkChunkDirty(int a_ChunkX, int a_ChunkZ)\n{\n\tm_ChunkMap.MarkChunkDirty(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nvoid cWorld::MarkChunkSaving(int a_ChunkX, int a_ChunkZ)\n{\n\tm_ChunkMap.MarkChunkSaving(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nvoid cWorld::MarkChunkSaved (int a_ChunkX, int a_ChunkZ)\n{\n\tm_ChunkMap.MarkChunkSaved (a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nvoid cWorld::QueueSetChunkData(struct SetChunkData && a_SetChunkData)\n{\n\t// Store a copy of the data in the queue:\n\t// TODO: If the queue is too large, wait for it to get processed. Not likely, though.\n\tcCSLock Lock(m_CSSetChunkDataQueue);\n\tm_SetChunkDataQueue.emplace_back(std::move(a_SetChunkData));\n}\n\n\n\n\n\nvoid cWorld::ChunkLighted(\n\tint a_ChunkX, int a_ChunkZ,\n\tconst cChunkDef::BlockNibbles & a_BlockLight,\n\tconst cChunkDef::BlockNibbles & a_SkyLight\n)\n{\n\tm_ChunkMap.ChunkLighted(a_ChunkX, a_ChunkZ, a_BlockLight, a_SkyLight);\n}\n\n\n\n\n\nbool cWorld::GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) const\n{\n\treturn m_ChunkMap.GetChunkData(a_Coords, a_Callback);\n}\n\n\n\n\n\nbool cWorld::IsChunkQueued(int a_ChunkX, int a_ChunkZ) const\n{\n\treturn m_ChunkMap.IsChunkQueued(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nbool cWorld::IsChunkValid(int a_ChunkX, int a_ChunkZ) const\n{\n\treturn m_ChunkMap.IsChunkValid(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nbool cWorld::HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) const\n{\n\treturn m_ChunkMap.HasChunkAnyClients(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nvoid cWorld::UnloadUnusedChunks(void)\n{\n\tm_LastChunkCheck = m_WorldAge;\n\tm_ChunkMap.UnloadUnusedChunks();\n}\n\n\n\n\n\nvoid cWorld::QueueUnloadUnusedChunks(void)\n{\n\tQueueTask([](cWorld & a_World) { a_World.UnloadUnusedChunks(); });\n}\n\n\n\n\n\nvoid cWorld::CollectPickupsByEntity(cEntity & a_Entity)\n{\n\tm_ChunkMap.CollectPickupsByEntity(a_Entity);\n}\n\n\n\n\n\nbool cWorld::ForEachPlayer(cPlayerListCallback a_Callback)\n{\n\t// Calls the callback for each player in the list\n\tcLock Lock(*this);\n\tfor (auto & Player : m_Players)\n\t{\n\t\tif (Player->IsTicking() && a_Callback(*Player))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - m_Players[]\n\treturn true;\n}\n\n\n\n\n\nbool cWorld::DoWithPlayer(const AString & a_PlayerName, cPlayerListCallback a_Callback)\n{\n\t// Calls the callback for the specified player in the list\n\tcLock Lock(*this);\n\tfor (auto & Player : m_Players)\n\t{\n\t\tif (Player->IsTicking() && (NoCaseCompare(Player->GetName(), a_PlayerName) == 0))\n\t\t{\n\t\t\ta_Callback(*Player);\n\t\t\treturn true;\n\t\t}\n\t}  // for itr - m_Players[]\n\treturn false;\n}\n\n\n\n\n\nbool cWorld::FindAndDoWithPlayer(const AString & a_PlayerNameHint, cPlayerListCallback a_Callback)\n{\n\tcPlayer * BestMatch = nullptr;\n\tsize_t BestRating = 0;\n\tsize_t NameLength = a_PlayerNameHint.length();\n\n\tcLock Lock(*this);\n\tfor (const auto Player : m_Players)\n\t{\n\t\tif (!Player->IsTicking())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tsize_t Rating = RateCompareString (a_PlayerNameHint, Player->GetName());\n\t\tif (Rating >= BestRating)\n\t\t{\n\t\t\tBestMatch = Player;\n\t\t\tBestRating = Rating;\n\t\t}\n\t\tif (Rating == NameLength)  // Perfect match\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}  // for itr - m_Players[]\n\n\tif (BestMatch != nullptr)\n\t{\n\t\treturn a_Callback(*BestMatch);\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cWorld::DoWithPlayerByUUID(const cUUID & a_PlayerUUID, cPlayerListCallback a_Callback)\n{\n\tcLock Lock(*this);\n\tfor (auto & Player : m_Players)\n\t{\n\t\tif (Player->IsTicking() && (Player->GetUUID() == a_PlayerUUID))\n\t\t{\n\t\t\treturn a_Callback(*Player);\n\t\t}\n\t}\n\treturn false;\n}\n\n\n\n\n\nbool cWorld::DoWithNearestPlayer(Vector3d a_Pos, double a_RangeLimit, cPlayerListCallback a_Callback, bool a_CheckLineOfSight, bool a_IgnoreSpectator)\n{\n\tdouble ClosestDistance = a_RangeLimit;\n\tcPlayer * ClosestPlayer = nullptr;\n\n\tcLock Lock(*this);\n\tfor (const auto Player : m_Players)\n\t{\n\t\tif (!Player->IsTicking())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (a_IgnoreSpectator && Player->IsGameModeSpectator())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tVector3f Pos = Player->GetPosition();\n\t\tdouble Distance = (Pos - a_Pos).Length();\n\n\t\t// If the player is too far, skip them:\n\t\tif (Distance > ClosestDistance)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check LineOfSight, if requested:\n\t\tif (\n\t\t\ta_CheckLineOfSight &&\n\t\t\t!cLineBlockTracer::LineOfSightTrace(*this, a_Pos, Pos, cLineBlockTracer::losAirWater)\n\t\t)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tClosestDistance = Distance;\n\t\tClosestPlayer = Player;\n\t}\n\n\tif (ClosestPlayer)\n\t{\n\t\treturn a_Callback(*ClosestPlayer);\n\t}\n\telse\n\t{\n\t\treturn false;\n\t}\n}\n\n\n\n\n\nvoid cWorld::SendPlayerList(cPlayer * a_DestPlayer)\n{\n\t// Sends the playerlist to a_DestPlayer\n\tcLock Lock(*this);\n\tfor (const auto & Player : m_Players)\n\t{\n\t\tif (!Player->GetClientHandle()->IsDestroyed())\n\t\t{\n\t\t\ta_DestPlayer->GetClientHandle()->SendPlayerListAddPlayer(*Player);\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cWorld::ForEachEntity(cEntityCallback a_Callback)\n{\n\treturn m_ChunkMap.ForEachEntity(a_Callback);\n}\n\n\n\n\n\nbool cWorld::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback a_Callback)\n{\n\treturn m_ChunkMap.ForEachEntityInChunk(a_ChunkX, a_ChunkZ, a_Callback);\n}\n\n\n\n\n\nbool cWorld::ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback)\n{\n\treturn m_ChunkMap.ForEachEntityInBox(a_Box, a_Callback);\n}\n\n\n\n\n\nsize_t cWorld::GetPlayerCount() const\n{\n\tcLock Lock(*this);\n\treturn m_Players.size();\n}\n\n\n\n\n\nbool cWorld::DoWithEntityByID(UInt32 a_UniqueID, cEntityCallback a_Callback)\n{\n\t// First check the entities-to-add:\n\t{\n\t\tcCSLock Lock(m_CSEntitiesToAdd);\n\t\tfor (const auto & Item : m_EntitiesToAdd)\n\t\t{\n\t\t\tif (Item.first->GetUniqueID() == a_UniqueID)\n\t\t\t{\n\t\t\t\ta_Callback(*Item.first);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}  // for ent - m_EntitiesToAdd[]\n\t}\n\n\t// Then check the chunkmap:\n\treturn m_ChunkMap.DoWithEntityByID(a_UniqueID, a_Callback);\n}\n\n\n\n\n\nvoid cWorld::CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback)\n{\n\tm_ChunkMap.CompareChunkClients(a_ChunkX1, a_ChunkZ1, a_ChunkX2, a_ChunkZ2, a_Callback);\n}\n\n\n\n\n\nbool cWorld::AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client)\n{\n\treturn m_ChunkMap.AddChunkClient(a_ChunkX, a_ChunkZ, a_Client);\n}\n\n\n\n\n\nvoid cWorld::RemoveChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client)\n{\n\tm_ChunkMap.RemoveChunkClient(a_ChunkX, a_ChunkZ, a_Client);\n}\n\n\n\n\n\nvoid cWorld::RemoveClientFromChunks(cClientHandle * a_Client)\n{\n\tm_ChunkMap.RemoveClientFromChunks(a_Client);\n}\n\n\n\n\n\nvoid cWorld::SendChunkTo(int a_ChunkX, int a_ChunkZ, cChunkSender::Priority a_Priority, cClientHandle * a_Client)\n{\n\tm_ChunkSender.QueueSendChunkTo(a_ChunkX, a_ChunkZ, a_Priority, a_Client);\n}\n\n\n\n\n\nvoid cWorld::ForceSendChunkTo(int a_ChunkX, int a_ChunkZ, cChunkSender::Priority a_Priority, cClientHandle * a_Client)\n{\n\ta_Client->AddWantedChunk(a_ChunkX, a_ChunkZ);\n\tm_ChunkSender.QueueSendChunkTo(a_ChunkX, a_ChunkZ, a_Priority, a_Client);\n}\n\n\n\n\n\nvoid cWorld::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter)\n{\n\tm_ChunkMap.PrepareChunk(a_ChunkX, a_ChunkZ, std::move(a_CallAfter));\n}\n\n\n\n\n\nvoid cWorld::ChunkLoadFailed(int a_ChunkX, int a_ChunkZ)\n{\n\tm_ChunkMap.ChunkLoadFailed(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nbool cWorld::SetSignLines(Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player)\n{\n\t// TODO: rvalue these strings\n\n\tAString Line1(a_Line1);\n\tAString Line2(a_Line2);\n\tAString Line3(a_Line3);\n\tAString Line4(a_Line4);\n\n\tif (cRoot::Get()->GetPluginManager()->CallHookUpdatingSign(*this, a_BlockPos, Line1, Line2, Line3, Line4, a_Player))\n\t{\n\t\treturn false;\n\t}\n\n\tif (\n\t\tDoWithBlockEntityAt(a_BlockPos, [&Line1, &Line2, &Line3, &Line4](cBlockEntity & a_BlockEntity)\n\t\t{\n\t\t\tif ((a_BlockEntity.GetBlockType() != E_BLOCK_WALLSIGN) && (a_BlockEntity.GetBlockType() != E_BLOCK_SIGN_POST))\n\t\t\t{\n\t\t\t\treturn false;  // Not a sign\n\t\t\t}\n\n\t\t\tstatic_cast<cSignEntity &>(a_BlockEntity).SetLines(Line1, Line2, Line3, Line4);\n\t\t\treturn true;\n\t\t})\n\t)\n\t{\n\t\tcRoot::Get()->GetPluginManager()->CallHookUpdatedSign(*this, a_BlockPos, Line1, Line2, Line3, Line4, a_Player);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n\n\n\n\nbool cWorld::SetCommandBlockCommand(int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Command)\n{\n\treturn DoWithBlockEntityAt({ a_BlockX, a_BlockY, a_BlockZ }, [&](cBlockEntity & a_BlockEntity)\n\t{\n\t\tif (a_BlockEntity.GetBlockType() != E_BLOCK_COMMAND_BLOCK)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tstatic_cast<cCommandBlockEntity &>(a_BlockEntity).SetCommand(a_Command);\n\t\treturn true;\n\t});\n}\n\n\n\n\n\nbool cWorld::IsTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ)\n{\n\tBLOCKTYPE Block;\n\tNIBBLETYPE Meta;\n\tif (!GetBlockTypeMeta({ a_BlockX, a_BlockY, a_BlockZ }, Block, Meta))\n\t{\n\t\treturn false;\n\t}\n\n\tif ((Block != E_BLOCK_TRAPDOOR) && (Block != E_BLOCK_IRON_TRAPDOOR))\n\t{\n\t\treturn false;\n\t}\n\n\treturn (Meta & 0x4) > 0;\n}\n\n\n\n\n\nbool cWorld::SetTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_Open)\n{\n\tBLOCKTYPE Block;\n\tNIBBLETYPE Meta;\n\tif (!GetBlockTypeMeta({ a_BlockX, a_BlockY, a_BlockZ }, Block, Meta))\n\t{\n\t\treturn false;\n\t}\n\n\tif ((Block != E_BLOCK_TRAPDOOR) && (Block != E_BLOCK_IRON_TRAPDOOR))\n\t{\n\t\treturn false;\n\t}\n\n\tbool IsOpen = (Meta & 0x4) != 0;\n\tif (a_Open != IsOpen)\n\t{\n\t\tSetBlockMeta({ a_BlockX, a_BlockY, a_BlockZ }, Meta ^ 0x4);\n\t\tBroadcastSoundParticleEffect(EffectID::SFX_RANDOM_WOODEN_TRAPDOOR_OPEN, { a_BlockX, a_BlockY, a_BlockZ }, 0);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n\n\n\nvoid cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tm_ChunkMap.MarkChunkRegenerating(a_ChunkX, a_ChunkZ);\n\tm_Generator.QueueGenerateChunk({a_ChunkX, a_ChunkZ}, true);\n}\n\n\n\n\n\nvoid cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tm_ChunkMap.GenerateChunk(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nvoid cWorld::QueueLightChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_Callback)\n{\n\tm_Lighting.QueueChunk(a_ChunkX, a_ChunkZ, std::move(a_Callback));\n}\n\n\n\n\n\nbool cWorld::IsChunkLighted(int a_ChunkX, int a_ChunkZ)\n{\n\treturn m_ChunkMap.IsChunkLighted(a_ChunkX, a_ChunkZ);\n}\n\n\n\n\n\nbool cWorld::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback)\n{\n\treturn m_ChunkMap.ForEachChunkInRect(a_MinChunkX, a_MaxChunkX, a_MinChunkZ, a_MaxChunkZ, a_Callback);\n}\n\n\n\n\n\nbool cWorld::ForEachLoadedChunk(cFunctionRef<bool(int, int)> a_Callback)\n{\n\treturn m_ChunkMap.ForEachLoadedChunk(a_Callback);\n}\n\n\n\n\n\nvoid cWorld::SaveAllChunks(void)\n{\n\tif (IsSavingEnabled())\n\t{\n\t\tm_LastSave = m_WorldAge;\n\t\tm_ChunkMap.SaveAllChunks();\n\t}\n}\n\n\n\n\n\nvoid cWorld::QueueSaveAllChunks(void)\n{\n\tQueueTask([](cWorld & a_World) { a_World.SaveAllChunks(); });\n}\n\n\n\n\n\nvoid cWorld::QueueTask(std::function<void(cWorld &)> a_Task)\n{\n\tcCSLock Lock(m_CSTasks);\n\tm_Tasks.emplace_back(0, std::move(a_Task));\n}\n\n\n\n\n\nvoid cWorld::ScheduleTask(const cTickTime a_DelayTicks, std::function<void (cWorld &)> a_Task)\n{\n\tconst auto TargetTick = a_DelayTicks + m_WorldAge;\n\n\t// Insert the task into the list of scheduled tasks\n\t{\n\t\tcCSLock Lock(m_CSTasks);\n\t\tm_Tasks.emplace_back(TargetTick, std::move(a_Task));\n\t}\n}\n\n\n\n\n\nvoid cWorld::AddEntity(OwnedEntity a_Entity, cWorld * a_OldWorld)\n{\n\tcCSLock Lock(m_CSEntitiesToAdd);\n\tm_EntitiesToAdd.emplace_back(std::move(a_Entity), a_OldWorld);\n}\n\n\n\n\n\nOwnedEntity cWorld::RemoveEntity(cEntity & a_Entity)\n{\n\t// Remove players from the player list:\n\tif (a_Entity.IsPlayer())\n\t{\n\t\tcLock Lock(*this);\n\t\tconst auto Player = static_cast<cPlayer *>(&a_Entity);\n\t\tLOGD(\"Removing player %s from world \\\"%s\\\"\", Player->GetName().c_str(), m_WorldName.c_str());\n\t\tm_Players.erase(std::remove(m_Players.begin(), m_Players.end(), Player), m_Players.end());\n\t}\n\n\t// Check if the entity is in the chunkmap:\n\tauto Entity = m_ChunkMap.RemoveEntity(a_Entity);\n\tif (Entity != nullptr)\n\t{\n\t\tEntity->OnRemoveFromWorld(*this);\n\t\treturn Entity;\n\t}\n\n\t// Check if the entity is in the queue to be added to the world:\n\tcCSLock Lock(m_CSEntitiesToAdd);\n\tauto itr = std::find_if(m_EntitiesToAdd.begin(), m_EntitiesToAdd.end(),\n\t\t[&a_Entity](const auto & Item)\n\t\t{\n\t\t\treturn (Item.first.get() == &a_Entity);\n\t\t}\n\t);\n\n\tif (itr != m_EntitiesToAdd.end())\n\t{\n\t\tEntity = std::move(itr->first);\n\t\tm_EntitiesToAdd.erase(itr);\n\t}\n\n\treturn Entity;\n}\n\n\n\n\n\nsize_t cWorld::GetNumChunks(void) const\n{\n\treturn m_ChunkMap.GetNumChunks();\n}\n\n\n\n\n\nsize_t cWorld::GetNumUnusedDirtyChunks(void) const\n{\n\treturn m_ChunkMap.GetNumUnusedDirtyChunks();\n}\n\n\n\n\n\nvoid cWorld::GetChunkStats(int & a_NumValid, int & a_NumDirty, int & a_NumInLightingQueue)\n{\n\tm_ChunkMap.GetChunkStats(a_NumValid, a_NumDirty);\n\ta_NumInLightingQueue = static_cast<int>(m_Lighting.GetQueueLength());\n}\n\n\n\n\n\nvoid cWorld::TickQueuedBlocks(void)\n{\n\tif (m_BlockTickQueue.empty())\n\t{\n\t\treturn;\n\t}\n\tm_BlockTickQueueCopy.clear();\n\tm_BlockTickQueue.swap(m_BlockTickQueueCopy);\n\n\tfor (std::vector<BlockTickQueueItem *>::iterator itr = m_BlockTickQueueCopy.begin(); itr != m_BlockTickQueueCopy.end(); ++itr)\n\t{\n\t\tBlockTickQueueItem * Block = (*itr);\n\t\tBlock->TicksToWait -= 1;\n\t\tif (Block->TicksToWait <= 0)\n\t\t{\n\t\t\t// TODO: Handle the case when the chunk is already unloaded\n\t\t\tm_ChunkMap.TickBlock({Block->X, Block->Y, Block->Z});\n\t\t\tdelete Block;  // We don't have to remove it from the vector, this will happen automatically on the next tick\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_BlockTickQueue.push_back(Block);  // Keep the block in the queue\n\t\t}\n\t}  // for itr - m_BlockTickQueueCopy[]\n}\n\n\n\n\n\nvoid cWorld::QueueBlockForTick(int a_BlockX, int a_BlockY, int a_BlockZ, int a_TicksToWait)\n{\n\tBlockTickQueueItem * Block = new BlockTickQueueItem;\n\tBlock->X = a_BlockX;\n\tBlock->Y = a_BlockY;\n\tBlock->Z = a_BlockZ;\n\tBlock->TicksToWait = a_TicksToWait;\n\n\tm_BlockTickQueue.push_back(Block);\n}\n\n\n\n\n\nbool cWorld::IsBlockDirectlyWatered(int a_BlockX, int a_BlockY, int a_BlockZ)\n{\n\treturn (\n\t\tIsBlockWater(GetBlock({ a_BlockX - 1, a_BlockY, a_BlockZ })) ||\n\t\tIsBlockWater(GetBlock({ a_BlockX + 1, a_BlockY, a_BlockZ })) ||\n\t\tIsBlockWater(GetBlock({ a_BlockX,     a_BlockY, a_BlockZ - 1 })) ||\n\t\tIsBlockWater(GetBlock({ a_BlockX,     a_BlockY, a_BlockZ + 1 }))\n\t);\n}\n\n\n\n\n\nUInt32 cWorld::SpawnMob(double a_PosX, double a_PosY, double a_PosZ, eMonsterType a_MonsterType, bool a_Baby)\n{\n\tauto Monster = cMonster::NewMonsterFromType(a_MonsterType);\n\tif (Monster == nullptr)\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\tMonster->SetPosition(a_PosX, a_PosY, a_PosZ);\n\n\tif (a_Baby)\n\t{\n\t\tMonster->SetAge(-1);\n\t}\n\n\treturn SpawnMobFinalize(std::move(Monster));\n}\n\n\n\n\n\nUInt32 cWorld::SpawnMobFinalize(std::unique_ptr<cMonster> a_Monster)\n{\n\tASSERT(a_Monster != nullptr);\n\n\t// Give the mob  full health.\n\ta_Monster->SetHealth(a_Monster->GetMaxHealth());\n\n\t// A plugin doesn't agree with the spawn. bail out.\n\tif (cPluginManager::Get()->CallHookSpawningMonster(*this, *a_Monster))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\n\tauto & Monster = *a_Monster;\n\n\t// Initialize the monster into the current world.\n\tif (!Monster.Initialize(std::move(a_Monster), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\n\tcPluginManager::Get()->CallHookSpawnedMonster(*this, Monster);\n\n\treturn Monster.GetUniqueID();\n}\n\n\n\n\n\nUInt32 cWorld::CreateProjectile(Vector3d a_Pos, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem * a_Item, const Vector3d * a_Speed)\n{\n\tauto Projectile = cProjectileEntity::Create(a_Kind, a_Creator, a_Pos, a_Item, a_Speed);\n\tif (Projectile == nullptr)\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\n\tauto ProjectilePtr = Projectile.get();\n\tif (!ProjectilePtr->Initialize(std::move(Projectile), *this))\n\t{\n\t\treturn cEntity::INVALID_ID;\n\t}\n\n\treturn ProjectilePtr->GetUniqueID();\n}\n\n\n\n\n\nUInt32 cWorld::CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem * a_Item, const Vector3d * a_Speed)\n{\n\treturn CreateProjectile({a_PosX, a_PosY, a_PosZ}, a_Kind, a_Creator, a_Item, a_Speed);\n}\n\n\n\n\n\nint cWorld::GetTickRandomNumber(int a_Range)\n{\n\treturn GetRandomProvider().RandInt(a_Range);\n}\n\n\n\n\n\nvoid cWorld::TabCompleteUserName(const AString & a_Text, AStringVector & a_Results)\n{\n\ttypedef std::pair<AString::size_type, AString> pair_t;\n\tsize_t LastSpace = a_Text.find_last_of(\" \");  // Find the position of the last space\n\tAString LastWord = a_Text.substr(LastSpace + 1, a_Text.length());  // Find the last word\n\n\tif (LastWord.empty())\n\t{\n\t\treturn;\n\t}\n\n\tstd::vector<pair_t> UsernamesByWeight;\n\n\tcLock Lock(*this);\n\tfor (const auto Player : m_Players)\n\t{\n\t\tAString PlayerName = Player->HasCustomName() ? Player->GetCustomName() : Player->GetName();\n\n\t\tAString::size_type Found = StrToLower(PlayerName).find(StrToLower(LastWord));  // Try to find last word in playername\n\t\tif (Found == AString::npos)\n\t\t{\n\t\t\tcontinue;  // No match\n\t\t}\n\n\t\tUsernamesByWeight.push_back(std::make_pair(Found, PlayerName));  // Match! Store it with the position of the match as a weight\n\t}\n\tLock.Unlock();\n\n\tstd::sort(UsernamesByWeight.begin(), UsernamesByWeight.end());  // Sort lexicographically (by the first value, then second), so higher weights (usernames with match closer to start) come first (#1274)\n\n\t/* TODO: Uncomment once migrated to C++11\n\tstd::transform(\n\t\tUsernamesByWeight.begin(),\n\t\tUsernamesByWeight.end(),\n\t\tstd::back_inserter(a_Results),\n\t\t[](const pair_t & p) { return p.first; }\n\t);\n\t*/\n\n\ta_Results.reserve(UsernamesByWeight.size());\n\tfor (std::vector<pair_t>::const_iterator itr = UsernamesByWeight.begin(); itr != UsernamesByWeight.end(); ++itr)\n\t{\n\t\ta_Results.push_back(itr->second);\n\t}\n}\n\n\n\n\n\nvoid cWorld::SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked)\n{\n\tm_ChunkMap.SetChunkAlwaysTicked(a_ChunkX, a_ChunkZ, a_AlwaysTicked);\n}\n\n\n\n\n\ncRedstoneSimulator * cWorld::InitializeRedstoneSimulator(cIniFile & a_IniFile)\n{\n\tAString SimulatorName = a_IniFile.GetValueSet(\"Physics\", \"RedstoneSimulator\", \"Incremental\");\n\n\tif (SimulatorName.empty())\n\t{\n\t\tLOGWARNING(\"[Physics] RedstoneSimulator not present or empty in %s, using the default of \\\"Incremental\\\".\", GetIniFileName().c_str());\n\t\tSimulatorName = \"Incremental\";\n\t}\n\n\tcRedstoneSimulator * res = nullptr;\n\n\tif (NoCaseCompare(SimulatorName, \"Incremental\") == 0)\n\t{\n\t\tres = new cIncrementalRedstoneSimulator(*this);\n\t}\n\telse if (NoCaseCompare(SimulatorName, \"noop\") == 0)\n\t{\n\t\tres = new cRedstoneNoopSimulator(*this);\n\t}\n\telse\n\t{\n\t\tLOGWARNING(\"[Physics] Unknown RedstoneSimulator \\\"%s\\\" in %s, using the default of \\\"Incremental\\\".\", SimulatorName.c_str(), GetIniFileName().c_str());\n\t\tres = new cIncrementalRedstoneSimulator(*this);\n\t}\n\n\tm_SimulatorManager->RegisterSimulator(res, 2 /* Two game ticks is a redstone tick */);\n\n\treturn res;\n}\n\n\n\n\n\ncFluidSimulator * cWorld::InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock)\n{\n\tauto SimulatorNameKey = fmt::format(FMT_STRING(\"{}Simulator\"), a_FluidName);\n\tauto SimulatorSectionName = fmt::format(FMT_STRING(\"{}Simulator\"), a_FluidName);\n\n\tbool IsWater = (strcmp(a_FluidName, \"Water\") == 0);  // Used for defaults\n\tAString DefaultSimulatorName = ((GetDimension() == dimNether) && IsWater) ? \"Vaporise\" : \"Vanilla\";\n\tAString SimulatorName = a_IniFile.GetValueSet(\"Physics\", SimulatorNameKey, DefaultSimulatorName);\n\tif (SimulatorName.empty())\n\t{\n\t\tLOGWARNING(\"[Physics] %s not present or empty in %s, using the default of \\\"%s\\\".\", SimulatorNameKey, GetIniFileName(), DefaultSimulatorName);\n\t\tSimulatorName = DefaultSimulatorName;\n\t}\n\tcFluidSimulator * res = nullptr;\n\tint Rate = 1;\n\tif (\n\t\t(NoCaseCompare(SimulatorName, \"vaporize\") == 0) ||\n\t\t(NoCaseCompare(SimulatorName, \"vaporise\") == 0)\n\t)\n\t{\n\t\tres = new cVaporizeFluidSimulator(*this, a_SimulateBlock, a_StationaryBlock);\n\t}\n\telse if (\n\t\t(NoCaseCompare(SimulatorName, \"noop\") == 0) ||\n\t\t(NoCaseCompare(SimulatorName, \"nop\") == 0) ||\n\t\t(NoCaseCompare(SimulatorName, \"null\") == 0) ||\n\t\t(NoCaseCompare(SimulatorName, \"nil\") == 0)\n\t)\n\t{\n\t\tres = new cNoopFluidSimulator(*this, a_SimulateBlock, a_StationaryBlock);\n\t}\n\telse\n\t{\n\t\tint Falloff               = a_IniFile.GetValueSetI(SimulatorSectionName, \"Falloff\",               IsWater ? 1 : 2);\n\t\tint TickDelay             = a_IniFile.GetValueSetI(SimulatorSectionName, \"TickDelay\",             IsWater ? 5 : 30);\n\t\tint NumNeighborsForSource = a_IniFile.GetValueSetI(SimulatorSectionName, \"NumNeighborsForSource\", IsWater ? 2 : -1);\n\n\t\tif ((Falloff > 15) || (Falloff < 0))\n\t\t{\n\t\t\tLOGWARNING(\"Falloff for %s simulator is out of range, assuming default of %d\", a_FluidName, IsWater ? 1 : 2);\n\t\t\tFalloff = IsWater ? 1 : 2;\n\t\t}\n\n\t\tif (NoCaseCompare(SimulatorName, \"floody\") == 0)\n\t\t{\n\t\t\tres = new cFloodyFluidSimulator(*this, a_SimulateBlock, a_StationaryBlock, static_cast<NIBBLETYPE>(Falloff), TickDelay, NumNeighborsForSource);\n\t\t}\n\t\telse if (NoCaseCompare(SimulatorName, \"vanilla\") == 0)\n\t\t{\n\t\t\tres = new cVanillaFluidSimulator(*this, a_SimulateBlock, a_StationaryBlock, static_cast<NIBBLETYPE>(Falloff), TickDelay, NumNeighborsForSource);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// The simulator name doesn't match anything we have, issue a warning:\n\t\t\tLOGWARNING(\"%s [Physics]:%s specifies an unknown simulator, using the default \\\"Vanilla\\\".\", GetIniFileName().c_str(), SimulatorNameKey.c_str());\n\t\t\tres = new cVanillaFluidSimulator(*this, a_SimulateBlock, a_StationaryBlock, static_cast<NIBBLETYPE>(Falloff), TickDelay, NumNeighborsForSource);\n\t\t}\n\t}\n\n\tm_SimulatorManager->RegisterSimulator(res, Rate);\n\n\treturn res;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWorld::cChunkGeneratorCallbacks:\n\ncWorld::cChunkGeneratorCallbacks::cChunkGeneratorCallbacks(cWorld & a_World) :\n\tm_World(&a_World)\n{\n}\n\n\n\n\n\nvoid cWorld::cChunkGeneratorCallbacks::OnChunkGenerated(cChunkDesc & a_ChunkDesc)\n{\n\tcChunkDef::BlockNibbles BlockMetas;\n\ta_ChunkDesc.CompressBlockMetas(BlockMetas);\n\n\tstruct SetChunkData Data({ a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ() });\n\t{\n\t\tData.BlockData.SetAll(a_ChunkDesc.GetBlockTypes(), BlockMetas);\n\n\t\tstd::copy(a_ChunkDesc.GetBiomeMap(), a_ChunkDesc.GetBiomeMap() + std::size(a_ChunkDesc.GetBiomeMap()), Data.BiomeMap);\n\t\tstd::copy(a_ChunkDesc.GetHeightMap(), a_ChunkDesc.GetHeightMap() + std::size(a_ChunkDesc.GetHeightMap()), Data.HeightMap);\n\n\t\tData.Entities = std::move(a_ChunkDesc.GetEntities());\n\t\tData.BlockEntities = std::move(a_ChunkDesc.GetBlockEntities());\n\n\t\tData.IsLightValid = false;\n\t}\n\n\tm_World->QueueSetChunkData(std::move(Data));\n}\n\n\n\n\n\nbool cWorld::cChunkGeneratorCallbacks::IsChunkValid(cChunkCoords a_Coords)\n{\n\treturn m_World->IsChunkValid(a_Coords.m_ChunkX, a_Coords.m_ChunkZ);\n}\n\n\n\n\n\nbool cWorld::cChunkGeneratorCallbacks::IsChunkQueued(cChunkCoords a_Coords)\n{\n\treturn m_World->IsChunkQueued(a_Coords.m_ChunkX, a_Coords.m_ChunkZ);\n}\n\n\n\n\n\nbool cWorld::cChunkGeneratorCallbacks::HasChunkAnyClients(cChunkCoords a_Coords)\n{\n\treturn m_World->HasChunkAnyClients(a_Coords.m_ChunkX, a_Coords.m_ChunkZ);\n}\n\n\n\n\n\nvoid cWorld::cChunkGeneratorCallbacks::CallHookChunkGenerating(cChunkDesc & a_ChunkDesc)\n{\n\tcPluginManager::Get()->CallHookChunkGenerating(\n\t\t*m_World, a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ(), &a_ChunkDesc\n\t);\n}\n\n\n\n\n\nvoid cWorld::cChunkGeneratorCallbacks::CallHookChunkGenerated (cChunkDesc & a_ChunkDesc)\n{\n\tcPluginManager::Get()->CallHookChunkGenerated(\n\t\t*m_World, a_ChunkDesc.GetChunkX(), a_ChunkDesc.GetChunkZ(), &a_ChunkDesc\n\t);\n}\n\n\n\n\n\nbool cWorld::IsSlimeChunk(int a_ChunkX, int a_ChunkZ) const\n{\n\tcNoise Noise(GetSeed());\n\treturn (Noise.IntNoise2DInt(a_ChunkX, a_ChunkZ) / 8) % 10 == 0;  // 10% chance\n}\n"
  },
  {
    "path": "src/World.h",
    "content": "\n#pragma once\n\n#include <optional>\n\n#include \"Simulator/SimulatorManager.h\"\n#include \"ChunkMap.h\"\n#include \"WorldStorage/WorldStorage.h\"\n#include \"ChunkGeneratorThread.h\"\n#include \"ChunkSender.h\"\n#include \"Defines.h\"\n#include \"LightingThread.h\"\n#include \"IniFile.h\"\n#include \"Item.h\"\n#include \"Mobs/Monster.h\"\n#include \"Entities/ProjectileEntity.h\"\n#include \"Entities/Boat.h\"\n#include \"ForEachChunkProvider.h\"\n#include \"Scoreboard.h\"\n#include \"MapManager.h\"\n#include \"Blocks/WorldInterface.h\"\n#include \"Blocks/BroadcastInterface.h\"\n#include \"EffectID.h\"\n\n\n\n\n\nclass cFireSimulator;\nclass cFluidSimulator;\nclass cSandSimulator;\nclass cRedstoneSimulator;\nclass cItem;\nclass cPlayer;\nclass cClientHandle;\nclass cEntity;\nclass cChunkGenerator;  // The thread responsible for generating chunks\nclass cCuboid;\nclass cCompositeChat;\nclass cDeadlockDetect;\nclass cUUID;\n\nstruct SetChunkData;\n\n\n\n\n\nclass cWorld  // tolua_export\n\tfinal:\n\tpublic cForEachChunkProvider,\n\tpublic cWorldInterface,\n\tpublic cBroadcastInterface\n// tolua_begin\n{\npublic:\n\t// tolua_end\n\n\t/** A simple RAII locker for the chunkmap - locks the chunkmap in its constructor, unlocks it in the destructor */\n\tclass cLock:\n\t\tpublic cCSLock\n\t{\n\t\tusing Super = cCSLock;\n\tpublic:\n\t\tcLock(const cWorld & a_World);\n\t};\n\n\t/** Construct the world and read settings from its ini file.\n\t@param a_DeadlockDetect is used for tracking this world's age, detecting a possible deadlock.\n\t@param a_WorldNames is a list of all world names, used to validate linked worlds\n\t*/\n\tcWorld(\n\t\tconst AString & a_WorldName, const AString & a_DataPath,\n\t\tcDeadlockDetect & a_DeadlockDetect, const AStringVector & a_WorldNames,\n\t\teDimension a_Dimension = dimOverworld, const AString & a_LinkedOverworldName = {}\n\t);\n\n\tvirtual ~cWorld() override;\n\n\t// tolua_begin\n\n\t/** Get whether saving chunks is enabled */\n\tbool IsSavingEnabled(void) const { return m_IsSavingEnabled; }\n\n\t/** Set whether saving chunks is enabled */\n\tvoid SetSavingEnabled(bool a_IsSavingEnabled) { m_IsSavingEnabled = a_IsSavingEnabled; }\n\n\tint GetTicksUntilWeatherChange(void) const { return m_WeatherInterval; }\n\n\t/** Is the daylight cycle enabled? */\n\tvirtual bool IsDaylightCycleEnabled(void) const { return m_IsDaylightCycleEnabled; }\n\n\t/** Sets the daylight cycle to true / false. */\n\tvirtual void SetDaylightCycleEnabled(bool a_IsDaylightCycleEnabled)\n\t{\n\t\tm_IsDaylightCycleEnabled = a_IsDaylightCycleEnabled;\n\t\tBroadcastTimeUpdate();\n\t}\n\n\tvoid SetTicksUntilWeatherChange(int a_WeatherInterval)\n\t{\n\t\tm_WeatherInterval = a_WeatherInterval;\n\t}\n\n\t/** Returns the default weather interval for the specific weather type.\n\tReturns -1 for any unknown weather. */\n\tint GetDefaultWeatherInterval(eWeather a_Weather) const;\n\n\t/** Returns the current game mode. Partly OBSOLETE, you should use IsGameModeXXX() functions wherever applicable */\n\teGameMode GetGameMode(void) const { return m_GameMode; }\n\n\t/** Returns true if the world is in Creative mode */\n\tbool IsGameModeCreative(void) const { return (m_GameMode == gmCreative); }\n\n\t/** Returns true if the world is in Survival mode */\n\tbool IsGameModeSurvival(void) const { return (m_GameMode == gmSurvival); }\n\n\t/** Returns true if the world is in Adventure mode */\n\tbool IsGameModeAdventure(void) const { return (m_GameMode == gmAdventure); }\n\n\t/** Returns true if the world is in Spectator mode */\n\tbool IsGameModeSpectator(void) const { return (m_GameMode == gmSpectator); }\n\n\tbool IsPVPEnabled(void) const { return m_bEnabledPVP; }\n\n\t/** Returns true if farmland trampling is enabled */\n\tbool IsFarmlandTramplingEnabled(void) const { return m_bFarmlandTramplingEnabled; }\n\n\tbool IsDeepSnowEnabled(void) const { return m_IsDeepSnowEnabled; }\n\n\tbool ShouldLavaSpawnFire(void) const { return m_ShouldLavaSpawnFire; }\n\n\tbool VillagersShouldHarvestCrops(void) const { return m_VillagersShouldHarvestCrops; }\n\n\tvirtual eDimension GetDimension(void) const override { return m_Dimension; }\n\n\t// tolua_end\n\n\tvirtual cTickTime GetTimeOfDay(void) const override;\n\tvirtual cTickTimeLong GetWorldAge(void) const override;\n\tcTickTimeLong GetWorldDate() const;\n\tcTickTimeLong GetWorldTickAge() const;\n\n\tvirtual void SetTimeOfDay(cTickTime a_TimeOfDay) override;\n\n\t/** Retrieves the world height at the specified coords; returns nullopt if chunk not loaded / generated */\n\tvirtual std::optional<int> GetHeight(int a_BlockX, int a_BlockZ) override;  // Exported in ManualBindings.cpp\n\n\t// Broadcast respective packets to all clients of the chunk where the event is taking place\n\t// Implemented in Broadcaster.cpp\n\t// (Please keep these alpha-sorted)\n\tvirtual void BroadcastAttachEntity       (const cEntity & a_Entity, const cEntity & a_Vehicle) override;\n\tvirtual void BroadcastBlockAction        (Vector3i a_BlockPos, Byte a_Byte1, Byte a_Byte2, BLOCKTYPE a_BlockType, const cClientHandle * a_Exclude = nullptr) override;  // Exported in ManualBindings_World.cpp\n\tvirtual void BroadcastBlockBreakAnimation(UInt32 a_EntityID, Vector3i a_BlockPos, Int8 a_Stage, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastBlockEntity        (Vector3i a_BlockPos, const cClientHandle * a_Exclude = nullptr) override;  ///< If there is a block entity at the specified coods, sends it to all clients except a_Exclude\n\tvirtual void BroadcastBossBarUpdateHealth(const cEntity & a_Entity, UInt32 a_UniqueID, float a_FractionFilled) override;\n\n\t// tolua_begin\n\tvirtual void BroadcastChat       (const AString & a_Message, const cClientHandle * a_Exclude = nullptr, eMessageType a_ChatPrefix = mtCustom) override;\n\tvirtual void BroadcastChatInfo   (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) override { BroadcastChat(a_Message, a_Exclude, mtInformation); }\n\tvirtual void BroadcastChatFailure(const AString & a_Message, const cClientHandle * a_Exclude = nullptr) override { BroadcastChat(a_Message, a_Exclude, mtFailure); }\n\tvirtual void BroadcastChatSuccess(const AString & a_Message, const cClientHandle * a_Exclude = nullptr) override { BroadcastChat(a_Message, a_Exclude, mtSuccess); }\n\tvirtual void BroadcastChatWarning(const AString & a_Message, const cClientHandle * a_Exclude = nullptr) override { BroadcastChat(a_Message, a_Exclude, mtWarning); }\n\tvirtual void BroadcastChatFatal  (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) override { BroadcastChat(a_Message, a_Exclude, mtFailure); }\n\tvirtual void BroadcastChatDeath  (const AString & a_Message, const cClientHandle * a_Exclude = nullptr) override { BroadcastChat(a_Message, a_Exclude, mtDeath); }\n\tvirtual void BroadcastChat       (const cCompositeChat & a_Message, const cClientHandle * a_Exclude = nullptr) override;\n\t// tolua_end\n\n\tvirtual void BroadcastCollectEntity              (const cEntity & a_Collected, const cEntity & a_Collector, unsigned a_Count, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastDestroyEntity              (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastDetachEntity               (const cEntity & a_Entity, const cEntity & a_PreviousVehicle) override;\n\tvirtual void BroadcastEntityEffect               (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, int a_Duration, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastEntityEquipment            (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastEntityHeadLook             (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastEntityLook                 (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastEntityMetadata             (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastEntityPosition             (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) override;\n\tvoid         BroadcastEntityProperties           (const cEntity & a_Entity);\n\tvirtual void BroadcastEntityVelocity             (const cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastEntityAnimation            (const cEntity & a_Entity, EntityAnimation a_Animation, const cClientHandle * a_Exclude = nullptr) override;  // tolua_export\n\tvirtual void BroadcastLeashEntity                (const cEntity & a_Entity, const cEntity & a_EntityLeashedTo) override;\n\tvirtual void BroadcastParticleEffect             (const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, const cClientHandle * a_Exclude = nullptr) override;  // Exported in ManualBindings_World.cpp\n\tvirtual void BroadcastParticleEffect             (const AString & a_ParticleName, Vector3f a_Src, Vector3f a_Offset, float a_ParticleData, int a_ParticleAmount, std::array<int, 2> a_Data, const cClientHandle * a_Exclude = nullptr) override;  // Exported in ManualBindings_World.cpp\n\tvirtual void BroadcastPlayerListAddPlayer        (const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastPlayerListHeaderFooter     (const cCompositeChat & a_Header, const cCompositeChat & a_Footer) override;  // tolua_export\n\tvirtual void BroadcastPlayerListRemovePlayer     (const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_CustomName, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastPlayerListUpdateGameMode   (const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastPlayerListUpdatePing       () override;\n\tvirtual void BroadcastRemoveEntityEffect         (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastScoreboardObjective        (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;\n\tvirtual void BroadcastScoreUpdate                (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;\n\tvirtual void BroadcastDisplayObjective           (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;\n\tvirtual void BroadcastSoundEffect                (const AString & a_SoundName, Vector3d a_Position, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = nullptr) override;  // Exported in ManualBindings_World.cpp\n\tvirtual void BroadcastSoundParticleEffect        (const EffectID a_EffectID, Vector3i a_SrcPos, int a_Data, const cClientHandle * a_Exclude = nullptr) override;  // Exported in ManualBindings_World.cpp\n\tvirtual void BroadcastSpawnEntity                (cEntity & a_Entity, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastThunderbolt                (Vector3i a_BlockPos, const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastTimeUpdate                 (const cClientHandle * a_Exclude = nullptr) override;\n\tvirtual void BroadcastUnleashEntity              (const cEntity & a_Entity) override;\n\tvirtual void BroadcastWeather                    (eWeather a_Weather, const cClientHandle * a_Exclude = nullptr) override;\n\n\tvirtual cBroadcastInterface & GetBroadcastManager(void) override\n\t{\n\t\treturn *this;\n\t}\n\n\t/** If there is a block entity at the specified coords, sends it to the client specified */\n\tvoid SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client);\n\n\tvoid MarkChunkDirty (int a_ChunkX, int a_ChunkZ);\n\tvoid MarkChunkSaving(int a_ChunkX, int a_ChunkZ);\n\tvoid MarkChunkSaved (int a_ChunkX, int a_ChunkZ);\n\n\t/** Puts the chunk data into a queue to be set into the chunkmap in the tick thread.\n\tModifies the a_SetChunkData - moves the entities contained in it into the queue. */\n\tvoid QueueSetChunkData(SetChunkData && a_SetChunkData);\n\n\tvoid ChunkLighted(\n\t\tint a_ChunkX, int a_ChunkZ,\n\t\tconst cChunkDef::BlockNibbles & a_BlockLight,\n\t\tconst cChunkDef::BlockNibbles & a_SkyLight\n\t);\n\n\t/** Calls the callback with the chunk's data, if available (with ChunkCS locked).\n\tReturns true if the chunk was reported successfully, false if not (chunk not present or callback failed). */\n\tbool GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) const;\n\n\t/** Returns true iff the chunk is in the loader / generator queue. */\n\tbool IsChunkQueued(int a_ChunkX, int a_ChunkZ) const;\n\n\t/** Returns true iff the chunk is present and valid. */\n\tbool IsChunkValid(int a_ChunkX, int a_ChunkZ) const;\n\n\tbool HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) const;\n\n\t/** Queues a task to unload unused chunks onto the tick thread. The prefferred way of unloading. */\n\tvoid QueueUnloadUnusedChunks(void);  // tolua_export\n\n\tvoid CollectPickupsByEntity(cEntity & a_Entity);\n\n\t/** Calls the callback for each player in the list; returns true if all players processed, false if the callback aborted by returning true */\n\tvirtual bool ForEachPlayer(cPlayerListCallback a_Callback) override;  // >> EXPORTED IN MANUALBINDINGS <<\n\n\t/** Calls the callback for the player of the given name; returns true if the player was found and the callback called, false if player not found.\n\tCallback return value is ignored. If there are multiple players of the same name, only (random) one is processed by the callback. */\n\tbool DoWithPlayer(const AString & a_PlayerName, cPlayerListCallback a_Callback);  // >> EXPORTED IN MANUALBINDINGS <<\n\n\t/** Finds a player from a partial or complete player name and calls the callback - case-insensitive */\n\tbool FindAndDoWithPlayer(const AString & a_PlayerNameHint, cPlayerListCallback a_Callback);  // >> EXPORTED IN MANUALBINDINGS <<\n\n\t/** Calls the callback for nearest player for given position, Returns false if player not found, otherwise returns the same value as the callback */\n\tbool DoWithNearestPlayer(Vector3d a_Pos, double a_RangeLimit, cPlayerListCallback a_Callback, bool a_CheckLineOfSight = true, bool a_IgnoreSpectator = true);\n\n\t/** Finds the player over his uuid and calls the callback */\n\tbool DoWithPlayerByUUID(const cUUID & a_PlayerUUID, cPlayerListCallback a_Callback);  // >> EXPORTED IN MANUALBINDINGS <<\n\n\tvoid SendPlayerList(cPlayer * a_DestPlayer);  // Sends playerlist to the player\n\n\t/** Adds the entity into its appropriate chunk; takes ownership of the entity ptr.\n\tThe entity is added lazily - this function only puts it in a queue that is then processed by the Tick thread.\n\tIf a_OldWorld is provided, a corresponding ENTITY_CHANGED_WORLD event is triggerred after the addition. */\n\tvoid AddEntity(OwnedEntity a_Entity, cWorld * a_OldWorld = nullptr);\n\n\t/** Removes the entity from the world.\n\tReturns an owning reference to the found entity. */\n\tOwnedEntity RemoveEntity(cEntity & a_Entity);\n\n\t/** Calls the callback for each entity in the entire world; returns true if all entities processed, false if the callback aborted by returning true */\n\tbool ForEachEntity(cEntityCallback a_Callback);  // Exported in ManualBindings.cpp\n\n\t/** Calls the callback for each entity in the specified chunk; returns true if all entities processed, false if the callback aborted by returning true */\n\tbool ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback a_Callback);  // Exported in ManualBindings.cpp\n\n\t/** Calls the callback for each entity that has a nonempty intersection with the specified boundingbox.\n\tReturns true if all entities processed, false if the callback aborted by returning true.\n\tIf any chunk in the box is missing, ignores the entities in that chunk silently. */\n\tvirtual bool ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback) override;  // Exported in ManualBindings.cpp\n\n\t/** Returns the number of players currently in this world. */\n\tsize_t GetPlayerCount() const;\n\n\t/** Calls the callback if the entity with the specified ID is found, with the entity object as the callback param.\n\tReturns true if entity found and callback returned false. */\n\tbool DoWithEntityByID(UInt32 a_UniqueID, cEntityCallback a_Callback);  // Exported in ManualBindings.cpp\n\n\t/** Compares clients of two chunks, calls the callback accordingly */\n\tvoid CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback);\n\n\t/** Adds client to a chunk, if not already present; returns true if added, false if present */\n\tbool AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client);\n\n\t/** Removes client from the chunk specified */\n\tvoid RemoveChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client);\n\n\t/** Removes the client from all chunks it is present in */\n\tvoid RemoveClientFromChunks(cClientHandle * a_Client);\n\n\t/** Sends the chunk to the client specified, if the client doesn't have the chunk yet.\n\tIf chunk not valid, the request is postponed (ChunkSender will send that chunk when it becomes valid + lighted). */\n\tvoid SendChunkTo(int a_ChunkX, int a_ChunkZ, cChunkSender::Priority a_Priority, cClientHandle * a_Client);\n\n\t/** Sends the chunk to the client specified, even if the client already has the chunk.\n\tIf the chunk's not valid, the request is postponed (ChunkSender will send that chunk when it becomes valid + lighted). */\n\tvoid ForceSendChunkTo(int a_ChunkX, int a_ChunkZ, cChunkSender::Priority a_Priority, cClientHandle * a_Client);\n\n\t/** Queues the chunk for preparing - making sure that it's generated and lit.\n\tThe specified chunk is queued to be loaded or generated, and lit if needed.\n\tThe specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.\n\tIt is legal to call with no callback. */\n\tvoid PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter = {});\n\n\t/** Marks the chunk as failed-to-load: */\n\tvoid ChunkLoadFailed(int a_ChunkX, int a_ChunkZ);\n\n\t/** Sets the sign text, asking plugins for permission first. a_Player is the player who this change belongs to, may be nullptr. Returns true if sign text changed. */\n\tbool SetSignLines(Vector3i a_BlockPos, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player = nullptr);  // Exported in ManualBindings.cpp\n\n\t/** Sets the command block command. Returns true if command changed. */\n\tbool SetCommandBlockCommand(int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Command);  // tolua_export\n\tbool SetCommandBlockCommand(Vector3i a_BlockPos, const AString & a_Command)\n\t{\n\t\treturn SetCommandBlockCommand(a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_Command);\n\t}\n\n\t/** Is the trapdoor open? Returns false if there is no trapdoor at the specified coords. */\n\tbool IsTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ);                                      // tolua_export\n\n\t/** Set the state of a trapdoor. Returns true if the trapdoor was updated, false if there was no trapdoor at those coords. */\n\tbool SetTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_Open);                        // tolua_export\n\n\t/** Regenerate the given chunk. */\n\tvoid RegenerateChunk(int a_ChunkX, int a_ChunkZ);  // tolua_export\n\n\t/** Generates the given chunk. */\n\tvoid GenerateChunk(int a_ChunkX, int a_ChunkZ);  // tolua_export\n\n\t/** Queues a chunk for lighting; a_Callback is called after the chunk is lighted */\n\tvoid QueueLightChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_Callback = {});\n\n\tbool IsChunkLighted(int a_ChunkX, int a_ChunkZ);\n\n\t/** Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully */\n\tvirtual bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback) override;\n\n\t/** Calls the callback for each loaded chunk. Returns true if all chunks have been processed successfully */\n\tbool ForEachLoadedChunk(cFunctionRef<bool(int, int)> a_Callback);\n\n\t/** Sets the block at the specified coords to the specified value.\n\tFull processing, incl. updating neighbors, is performed. */\n\tvoid SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** Sets the block at the specified coords to the specified value.\n\tThe replacement doesn't trigger block updates, nor wake up simulators.\n\tThe replaced blocks aren't checked for block entities (block entity is leaked if it exists at this block) */\n\tvoid FastSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\tm_ChunkMap.FastSetBlock(a_BlockPos, a_BlockType, a_BlockMeta);\n\t}\n\n\t/** Returns the block type at the specified position.\n\tReturns 0 if the chunk is not valid. */\n\tBLOCKTYPE GetBlock(Vector3i a_BlockPos) const\n\t{\n\t\treturn m_ChunkMap.GetBlock(a_BlockPos);\n\t}\n\n\t/** Returns the block meta at the specified position.\n\tReturns 0 if the chunk is not valid. */\n\tNIBBLETYPE GetBlockMeta(Vector3i a_BlockPos) const\n\t{\n\t\treturn m_ChunkMap.GetBlockMeta(a_BlockPos);\n\t}\n\n\t/** Sets the meta for the specified block, while keeping the blocktype.\n\tIgnored if the chunk is invalid. */\n\tvoid SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_MetaData);\n\n\t/** Returns the sky light value at the specified block position.\n\tThe sky light is \"raw\" - not affected by time-of-day.\n\tReturns 0 if chunk not valid. */\n\tNIBBLETYPE GetBlockSkyLight(Vector3i a_BlockPos) const;\n\n\t/** Returns the block-light value at the specified block position.\n\tReturns 0 if chunk not valid. */\n\tNIBBLETYPE GetBlockBlockLight(Vector3i a_BlockPos) const;\n\n\t/** Retrieves the block type and meta at the specified coords.\n\tStores the result into a_BlockType and a_BlockMeta.\n\tReturns true if successful, false if chunk not present.\n\tTODO: Export in ManualBindings_World.cpp. */\n\tbool GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const;\n\n\t/** Queries the whole block specification from the world.\n\tReturns true if all block info was retrieved successfully, false if not (invalid chunk / bad position).\n\tExported in ManualBindings_World.cpp. */\n\tbool GetBlockInfo(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const;\n\n\t// TODO: NIBBLETYPE GetBlockActualLight(int a_BlockX, int a_BlockY, int a_BlockZ);\n\n\t/** Writes the block area into the specified coords.\n\tReturns true if all chunks have been processed.\n\tPrefer cBlockArea::Write() instead, this is the internal implementation; cBlockArea does error checking, too.\n\ta_DataTypes is a bitmask of cBlockArea::baXXX constants ORed together.\n\tDoesn't wake up simulators, use WakeUpSimulatorsInArea() for that. */\n\tvirtual bool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes) override;\n\n\t// tolua_begin\n\n\t/** Spawns item pickups for each item in the list.\n\tThe initial position of the pickups is at the center of the specified block, with a small random offset.\n\tMay compress pickups if too many entities. */\n\tvoid SpawnItemPickups(const cItems & a_Pickups, Vector3i a_BlockPos, double a_FlyAwaySpeed = 1.0, bool a_IsPlayerCreated = false);\n\n\t/** Spawns item pickups for each item in the list.\n\tMay compress pickups if too many entities. */\n\tvoid SpawnItemPickups(const cItems & a_Pickups, Vector3d a_Pos, double a_FlyAwaySpeed = 1.0, bool a_IsPlayerCreated = false);\n\n\t/** OBSOLETE, use the Vector3d-based overload instead.\n\tSpawns item pickups for each item in the list.\n\tMay compress pickups if too many entities. */\n\tvirtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_FlyAwaySpeed = 1.0, bool a_IsPlayerCreated = false) override\n\t{\n\t\treturn SpawnItemPickups(a_Pickups, Vector3d{a_BlockX, a_BlockY, a_BlockZ}, a_FlyAwaySpeed, a_IsPlayerCreated);\n\t}\n\n\t/** Spawns item pickups for each item in the list. May compress pickups if too many entities. All pickups get the speed specified. */\n\tvoid SpawnItemPickups(const cItems & a_Pickups, Vector3d a_Pos, Vector3d a_Speed, bool a_IsPlayerCreated = false);\n\n\t/** OBSOLETE, use the Vector3d-based overload instead.\n\tSpawns item pickups for each item in the list. May compress pickups if too many entities. All pickups get the speed specified. */\n\tvirtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_SpeedX, double a_SpeedY, double a_SpeedZ, bool a_IsPlayerCreated = false) override\n\t{\n\t\treturn SpawnItemPickups(a_Pickups, {a_BlockX, a_BlockY, a_BlockZ}, {a_SpeedX, a_SpeedY, a_SpeedZ}, a_IsPlayerCreated);\n\t}\n\n\t/** Spawns a single pickup containing the specified item. */\n\tUInt32 SpawnItemPickup(Vector3d a_Pos, const cItem & a_Item, Vector3f a_Speed, int a_LifetimeTicks = 6000, bool a_CanCombine = true);\n\n\t/** OBSOLETE, use the Vector3d-based overload instead.\n\tSpawns a single pickup containing the specified item. */\n\tvirtual UInt32 SpawnItemPickup(double a_PosX, double a_PosY, double a_PosZ, const cItem & a_Item, float a_SpeedX = 0.f, float a_SpeedY = 0.f, float a_SpeedZ = 0.f, int a_LifetimeTicks = 6000, bool a_CanCombine = true) override\n\t{\n\t\treturn SpawnItemPickup({a_PosX, a_PosY, a_PosZ}, a_Item, {a_SpeedX, a_SpeedY, a_SpeedZ}, a_LifetimeTicks, a_CanCombine);\n\t}\n\n\t/** Spawns an falling block entity at the given position.\n\tReturns the UniqueID of the spawned falling block, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnFallingBlock(Vector3d a_Pos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** Spawns an falling block entity at the given position.\n\tReturns the UniqueID of the spawned falling block, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnFallingBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\t// When creating from a block position (Vector3i), move the spawn point to the middle of the block by adding (0.5, 0, 0.5)\n\t\treturn SpawnFallingBlock(Vector3d(0.5, 0, 0.5) + a_BlockPos, a_BlockType, a_BlockMeta);\n\t}\n\n\t/** OBSOLETE, use the Vector3-based overload instead.\n\tSpawns an falling block entity at the given position.\n\tReturns the UniqueID of the spawned falling block, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnFallingBlock(int a_X, int a_Y, int a_Z, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n\t{\n\t\treturn SpawnFallingBlock(Vector3i{a_X, a_Y, a_Z}, a_BlockType, a_BlockMeta);\n\t}\n\n\t/** Spawns an minecart at the given coordinates.\n\tReturns the UniqueID of the spawned minecart, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnMinecart(Vector3d a_Pos, int a_MinecartType, const cItem & a_Content = cItem(), int a_BlockHeight = 1);\n\n\t/** OBSOLETE, use the Vector3d-based overload instead.\n\tSpawns an minecart at the given coordinates.\n\tReturns the UniqueID of the spawned minecart, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnMinecart(double a_X, double a_Y, double a_Z, int a_MinecartType, const cItem & a_Content = cItem(), int a_BlockHeight = 1)\n\t{\n\t\treturn SpawnMinecart({a_X, a_Y, a_Z}, a_MinecartType, a_Content, a_BlockHeight);\n\t}\n\n\t// DEPRECATED, use the vector-parametered version instead.\n\tUInt32 SpawnBoat(double a_X, double a_Y, double a_Z, cBoat::eMaterial a_Material)\n\t{\n\t\tLOGWARNING(\"cWorld::SpawnBoat(double, double, double) is deprecated, use cWorld::SpawnBoat(Vector3d) instead.\");\n\t\treturn SpawnBoat({a_X, a_Y, a_Z}, a_Material);\n\t}\n\n\t/** Spawns a boat at the given coordinates.\n\tReturns the UniqueID of the spawned boat, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnBoat(Vector3d a_Pos, cBoat::eMaterial a_Material);\n\n\t/** Spawns an experience orb at the given location with the given reward.\n\tReturns the UniqueID of the spawned experience orb, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnExperienceOrb(Vector3d a_Pos, int a_Reward);\n\n\t/** OBSOLETE, use the Vector3d-based overload instead.\n\tSpawns an experience orb at the given location with the given reward.\n\tReturns the UniqueID of the spawned experience orb, or cEntity::INVALID_ID on failure. */\n\tvirtual UInt32 SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward) override\n\t{\n\t\treturn SpawnExperienceOrb({a_X, a_Y, a_Z}, a_Reward);\n\t}\n\n\t// tolua_end\n\n\t/** Spawns experience orbs of the specified total value at the given location. The orbs' values are split according to regular Minecraft rules.\n\tReturns an vector of UniqueID of all the orbs. */\n\tvirtual std::vector<UInt32> SpawnSplitExperienceOrbs(Vector3d a_Pos, int a_Reward) override;  // Exported in ManualBindings_World.cpp\n\n\t/** OBSOLETE, use the Vector3d-based overload instead.\n\tSpawns experience orbs of the specified total value at the given location. The orbs' values are split according to regular Minecraft rules.\n\tReturns an vector of UniqueID of all the orbs. */\n\tstd::vector<UInt32> SpawnSplitExperienceOrbs(double a_X, double a_Y, double a_Z, int a_Reward)\n\t{\n\t\treturn SpawnSplitExperienceOrbs({a_X, a_Y, a_Z}, a_Reward);\n\t}\n\n\t// tolua_begin\n\n\t// DEPRECATED, use the vector-parametered version instead.\n\tUInt32 SpawnPrimedTNT(double a_X, double a_Y, double a_Z, int a_FuseTimeInSec = 80, double a_InitialVelocityCoeff = 1, bool a_ShouldPlayFuseSound = true)\n\t{\n\t\tLOGWARNING(\"cWorld::SpawnPrimedTNT(double, double, double) is deprecated, use cWorld::SpawnPrimedTNT(Vector3d) instead.\");\n\t\treturn SpawnPrimedTNT({a_X, a_Y, a_Z}, a_FuseTimeInSec, a_InitialVelocityCoeff, a_ShouldPlayFuseSound);\n\t}\n\n\t/** Spawns a new primed TNT entity at the specified block coords and specified fuse duration.\n\tInitial velocity is given based on the relative coefficient provided.\n\tReturns the UniqueID of the created entity, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnPrimedTNT(Vector3d a_Pos, int a_FuseTimeInSec = 80, double a_InitialVelocityCoeff = 1, bool a_ShouldPlayFuseSound = true);\n\n\t/** Spawns a new ender crystal at the specified block coords.\n\tReturns the UniqueID of the created entity, or cEntity::INVALID_ID on failure. */\n\tUInt32 SpawnEnderCrystal(Vector3d a_Pos, bool a_ShowBottom);\n\n\t// tolua_end\n\n\t/** Replaces the specified block with another, and calls the OnPlaced block handler.\n\tThe OnBroken block handler is called for the replaced block. Wakes up the simulators.\n\tIf the chunk for any of the blocks is not loaded, the set operation is ignored silently. */\n\tvoid PlaceBlock(const Vector3i a_Position, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta);\n\n\t/** Retrieves block types of the specified blocks. If a chunk is not loaded, doesn't modify the block. Returns true if all blocks were read. */\n\tbool GetBlocks(sSetBlockVector & a_Blocks, bool a_ContinueOnFailure);\n\n\tusing cWorldInterface::SendBlockTo;\n\n\t// tolua_begin\n\n\t/** Replaces the specified block with air, and calls the OnBroken block handler.\n\tWakes up the simulators. Doesn't produce pickups, use DropBlockAsPickups() for that instead.\n\tReturns true on success, false if the chunk is not loaded. */\n\tbool DigBlock(Vector3i a_BlockPos, const cEntity * a_Digger = nullptr);\n\n\t/** OBSOLETE, use the Vector3-based overload instead.\n\tReplaces the specified block with air, and calls the apropriate block handlers (OnBreaking(), OnBroken()).\n\tWakes up the simulators.\n\tDoesn't produce pickups, use DropBlockAsPickups() for that instead.\n\tReturns true on success, false if the chunk is not loaded. */\n\tbool DigBlock(int a_X, int a_Y, int a_Z, cEntity * a_Digger = nullptr)\n\t{\n\t\treturn DigBlock({a_X, a_Y, a_Z}, a_Digger);\n\t}\n\n\t/** Digs the specified block, and spawns the appropriate pickups for it.\n\ta_Digger is an optional entity causing the digging, usually the player.\n\ta_Tool is an optional item used to dig up the block, used by the handlers (empty hand vs shears produce different pickups from leaves).\n\tAn empty hand is assumed if a_Tool is nullptr.\n\tReturns true on success, false if the chunk is not loaded. */\n\tbool DropBlockAsPickups(Vector3i a_BlockPos, const cEntity * a_Digger = nullptr, const cItem * a_Tool = nullptr);\n\n\t/** Returns all the pickups that would result if the a_Digger dug up the block at a_BlockPos using a_Tool\n\ta_Digger is usually a player, but can be nullptr for natural causes.\n\ta_Tool is an optional item used to dig up the block, used by the handlers (empty hand vs shears produce different pickups from leaves).\n\tAn empty hand is assumed if a_Tool is nullptr.\n\tReturns an empty cItems object if the chunk is not present. */\n\tcItems PickupsFromBlock(Vector3i a_BlockPos, const cEntity * a_Digger = nullptr, const cItem * a_Tool = nullptr);\n\n\t/** Sends the block at the specified coords to the player.\n\tUsed mainly when plugins disable block-placing or block-breaking, to restore the previous block. */\n\tvirtual void SendBlockTo(int a_X, int a_Y, int a_Z, const cPlayer & a_Player) override;\n\n\t/** Set default spawn at the given coordinates.\n\tReturns false if the new spawn couldn't be stored in the INI file. */\n\tbool SetSpawn(int a_X, int a_Y, int a_Z);\n\n\tint GetSpawnX(void) const { return m_SpawnX; }\n\tint GetSpawnY(void) const { return m_SpawnY; }\n\tint GetSpawnZ(void) const { return m_SpawnZ; }\n\tVector3i GetSpawnPos() const\n\t{\n\t\treturn {m_SpawnX, m_SpawnY, m_SpawnZ};\n\t}\n\n\t/** Wakes up the simulators for the specified block */\n\tvirtual void WakeUpSimulators(Vector3i a_Block) override;\n\n\t/** Wakes up the simulators for the specified area of blocks */\n\tvoid WakeUpSimulatorsInArea(const cCuboid & a_Area);\n\n\t// tolua_end\n\n\tinline cSimulatorManager * GetSimulatorManager(void) { return m_SimulatorManager.get(); }\n\n\tinline cFluidSimulator * GetWaterSimulator(void) { return m_WaterSimulator; }\n\tinline cFluidSimulator * GetLavaSimulator (void) { return m_LavaSimulator; }\n\tinline cRedstoneSimulator * GetRedstoneSimulator(void) { return m_RedstoneSimulator; }\n\n\t/** Calls the callback for each block entity in the specified chunk; returns true if all block entities processed, false if the callback aborted by returning true */\n\tbool ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback a_Callback);  // Exported in ManualBindings.cpp\n\n\t/** Does an explosion with the specified strength at the specified coordinates.\n\tExecutes the HOOK_EXPLODING and HOOK_EXPLODED hooks as part of the processing.\n\ta_SourceData exact type depends on the a_Source, see the declaration of the esXXX constants in Defines.h for details.\n\tExported to Lua manually in ManualBindings_World.cpp in order to support the variable a_SourceData param. */\n\tvirtual void DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_BlockY, double a_BlockZ, bool a_CanCauseFire, eExplosionSource a_Source, void * a_SourceData) override;\n\n\t/** Calls the callback for the block entity at the specified coords; returns false if there's no block entity at those coords, and whatever the callback returns if found. */\n\tvirtual bool DoWithBlockEntityAt(Vector3i a_Position, cBlockEntityCallback a_Callback) override;  // Exported in ManualBindings.cpp\n\n\t/** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */\n\tbool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4);  // Exported in ManualBindings.cpp\n\n\t/** a_Player is using block entity at [x, y, z], handle that: */\n\tvoid UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) { m_ChunkMap.UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); }  // tolua_export\n\n\t/** Calls the callback for the chunk specified, with ChunkMapCS locked.\n\tReturns false if the chunk doesn't exist, otherwise returns the same value as the callback */\n\tbool DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback a_Callback);\n\n\t/** Calls the callback for the chunk at the block position specified, with ChunkMapCS locked.\n\tReturns false if the chunk isn't loaded, otherwise returns the same value as the callback */\n\tbool DoWithChunkAt(Vector3i a_BlockPos, cChunkCallback a_Callback);\n\n\t/** Imprints the specified blocks into the world, as long as each log block replaces only allowed blocks.\n\ta_Blocks specifies the logs, leaves, vines and possibly other blocks that comprise a single tree.\n\tReturns true if the tree is imprinted successfully, false otherwise. */\n\tbool GrowTreeImage(const sSetBlockVector & a_Blocks);\n\n\t/** Grows a tree at the specified coords.\n\tIf the specified block is a sapling, the tree is grown from that sapling.\n\tOtherwise a tree is grown based on the biome.\n\tReturns true if the tree was grown, false if not (invalid chunk, insufficient space).\n\tExported in DeprecatedBindings due to the obsolete int-based overload. */\n\tbool GrowTree(Vector3i a_BlockPos);\n\n\t/** Grows a tree from the sapling at the specified coords.\n\tIf the sapling is a part of a large-tree sapling (2x2), a large tree growth is attempted.\n\tReturns true if the tree was grown, false if not (invalid chunk, insufficient space).\n\tExported in DeprecatedBindings due to the obsolete int-based overload and obsolete additional SaplingMeta param. */\n\tbool GrowTreeFromSapling(Vector3i a_BlockPos);\n\n\t/** Grows a tree at the specified coords, based on the biome in the place.\n\tReturns true if the tree was grown, false if not (invalid chunk, insufficient space).\n\tExported in DeprecatedBindings due to the obsolete int-based overload. */\n\tbool GrowTreeByBiome(Vector3i a_BlockPos);\n\n\t// tolua_begin\n\n\t/** Grows the plant at the specified position by at most a_NumStages.\n\tThe block's Grow handler is invoked.\n\tReturns the number of stages the plant has grown, 0 if not a plant. */\n\tint GrowPlantAt(Vector3i a_BlockPos, int a_NumStages = 1);\n\n\t/** Grows the plant at the specified block to its ripe stage.\n\tReturns true if grown, false if not (invalid chunk, non-growable block, already ripe). */\n\tbool GrowRipePlant(Vector3i a_BlockPos);\n\n\t/** OBSOLETE, use the Vector3-based overload instead.\n\tGrows the plant at the specified block to its ripe stage.\n\ta_IsByBonemeal is obsolete, do not use.\n\tReturns true if grown, false if not (invalid chunk, non-growable block, already ripe). */\n\tbool GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsByBonemeal = false)\n\t{\n\t\tUNUSED(a_IsByBonemeal);\n\t\tLOGWARNING(\"Warning: cWorld:GrowRipePlant function expects Vector3i-based coords rather than int-based coords. Emulating old-style call.\");\n\t\treturn GrowRipePlant({ a_BlockX, a_BlockY, a_BlockZ });\n\t}\n\n\t/** Returns the biome at the specified coords. Reads the biome from the chunk, if loaded, otherwise uses the world generator to provide the biome value */\n\tEMCSBiome GetBiomeAt(int a_BlockX, int a_BlockZ);\n\n\t/** Sets the biome at the specified coords. Returns true if successful, false if not (chunk not loaded).\n\tDoesn't resend the chunk to clients, use ForceSendChunkTo() for that. */\n\tbool SetBiomeAt(int a_BlockX, int a_BlockZ, EMCSBiome a_Biome);\n\n\t/** Sets the biome at the area. Returns true if successful, false if any subarea failed (chunk not loaded).\n\t(Re)sends the chunks to their relevant clients if successful. */\n\tbool SetAreaBiome(int a_MinX, int a_MaxX, int a_MinZ, int a_MaxZ, EMCSBiome a_Biome);\n\n\t/** Sets the biome at the area. Returns true if successful, false if any subarea failed (chunk not loaded).\n\t(Re)sends the chunks to their relevant clients if successful.\n\tThe cuboid needn't be sorted. */\n\tbool SetAreaBiome(const cCuboid & a_Area, EMCSBiome a_Biome);\n\n\t/** Returns the name of the world */\n\tconst AString & GetName(void) const { return m_WorldName; }\n\n\t/** Returns the data path to the world data */\n\tconst AString & GetDataPath(void) const { return m_DataPath; }\n\n\t/** Returns the name of the world.ini file used by this world */\n\tconst AString & GetIniFileName(void) const {return m_IniFileName; }\n\n\t/** Returns the associated scoreboard instance. */\n\tcScoreboard & GetScoreBoard(void) { return m_Scoreboard; }\n\n\t/** Returns the associated map manager instance. */\n\tcMapManager & GetMapManager(void) { return m_MapManager; }\n\n\tbool AreCommandBlocksEnabled(void) const { return m_bCommandBlocksEnabled; }\n\tvoid SetCommandBlocksEnabled(bool a_Flag) { m_bCommandBlocksEnabled = a_Flag; }\n\n\teShrapnelLevel GetTNTShrapnelLevel(void) const { return m_TNTShrapnelLevel; }\n\tvoid SetTNTShrapnelLevel(eShrapnelLevel a_Flag) { m_TNTShrapnelLevel = a_Flag; }\n\n\tint GetMaxViewDistance(void) const { return m_MaxViewDistance; }\n\tvoid SetMaxViewDistance(int a_MaxViewDistance);\n\n\tbool ShouldUseChatPrefixes(void) const { return m_bUseChatPrefixes; }\n\tvoid SetShouldUseChatPrefixes(bool a_Flag) { m_bUseChatPrefixes = a_Flag; }\n\n\tbool ShouldBroadcastDeathMessages(void) const { return m_BroadcastDeathMessages; }\n\tbool ShouldBroadcastAchievementMessages(void) const { return m_BroadcastAchievementMessages; }\n\n\n\tAString GetLinkedNetherWorldName(void) const { return m_LinkedNetherWorldName; }\n\tvoid SetLinkedNetherWorldName(const AString & a_Name) { m_LinkedNetherWorldName = a_Name; }\n\n\tAString GetLinkedEndWorldName(void) const { return m_LinkedEndWorldName; }\n\tvoid SetLinkedEndWorldName(const AString & a_Name) { m_LinkedEndWorldName = a_Name; }\n\n\tAString GetLinkedOverworldName(void) const { return m_LinkedOverworldName; }\n\tvoid SetLinkedOverworldName(const AString & a_Name) { m_LinkedOverworldName = a_Name; }\n\n\t/** Returns or sets the minumim or maximum netherportal width */\n\tvirtual int GetMinNetherPortalWidth(void) const override { return m_MinNetherPortalWidth; }\n\tvirtual int GetMaxNetherPortalWidth(void) const override { return m_MaxNetherPortalWidth; }\n\tvirtual void SetMinNetherPortalWidth(int a_NewMinWidth) override { m_MinNetherPortalWidth = a_NewMinWidth; }\n\tvirtual void SetMaxNetherPortalWidth(int a_NewMaxWidth) override { m_MaxNetherPortalWidth = a_NewMaxWidth; }\n\n\t/** Returns or sets the minumim or maximum netherportal height */\n\tvirtual int GetMinNetherPortalHeight(void) const override { return m_MinNetherPortalHeight; }\n\tvirtual int GetMaxNetherPortalHeight(void) const override { return m_MaxNetherPortalHeight; }\n\tvirtual void SetMinNetherPortalHeight(int a_NewMinHeight) override { m_MinNetherPortalHeight = a_NewMinHeight; }\n\tvirtual void SetMaxNetherPortalHeight(int a_NewMaxHeight) override { m_MaxNetherPortalHeight = a_NewMaxHeight; }\n\n\t// tolua_end\n\n\t/** Saves all chunks immediately. Dangerous interface, may deadlock, use QueueSaveAllChunks() instead */\n\tvoid SaveAllChunks(void);\n\n\t/** Queues a task to save all chunks onto the tick thread. The prefferred way of saving chunks from external sources */\n\tvoid QueueSaveAllChunks(void);  // tolua_export\n\n\t/** Queues a task onto the tick thread. The task object will be deleted once the task is finished */\n\tvoid QueueTask(std::function<void(cWorld &)> a_Task);  // Exported in ManualBindings.cpp\n\n\t/** Queues a lambda task onto the tick thread, with the specified delay. */\n\tvoid ScheduleTask(cTickTime a_DelayTicks, std::function<void(cWorld &)> a_Task);\n\n\t/** Returns the number of chunks loaded\t */\n\tsize_t GetNumChunks() const;  // tolua_export\n\n\t/** Returns the number of unused dirty chunks. That's the number of chunks that we can save and then unload. */\n\tsize_t GetNumUnusedDirtyChunks(void) const;  // tolua_export\n\n\t/** Returns the number of chunks loaded and dirty, and in the lighting queue */\n\tvoid GetChunkStats(int & a_NumValid, int & a_NumDirty, int & a_NumInLightingQueue);\n\n\t// Various queues length queries (cannot be const, they lock their CS):\n\tinline size_t GetGeneratorQueueLength  (void) { return m_Generator.GetQueueLength();   }    // tolua_export\n\tinline size_t GetLightingQueueLength   (void) { return m_Lighting.GetQueueLength();    }    // tolua_export\n\tinline size_t GetStorageLoadQueueLength(void) { return m_Storage.GetLoadQueueLength(); }    // tolua_export\n\tinline size_t GetStorageSaveQueueLength(void) { return m_Storage.GetSaveQueueLength(); }    // tolua_export\n\n\tcLightingThread & GetLightingThread(void) { return m_Lighting; }\n\n\tvoid InitializeSpawn(void);\n\n\t/** Starts threads that belong to this world. */\n\tvoid Start();\n\n\t/** Stops threads that belong to this world (part of deinit).\n\ta_DeadlockDetect is used for tracking this world's age, detecting a possible deadlock. */\n\tvoid Stop(cDeadlockDetect & a_DeadlockDetect);\n\n\t/** Processes the blocks queued for ticking with a delay (m_BlockTickQueue[]) */\n\tvoid TickQueuedBlocks(void);\n\n\tstruct BlockTickQueueItem\n\t{\n\t\tint X;\n\t\tint Y;\n\t\tint Z;\n\t\tint TicksToWait;\n\t};\n\n\t/** Queues the block to be ticked after the specified number of game ticks */\n\tvoid QueueBlockForTick(int a_BlockX, int a_BlockY, int a_BlockZ, int a_TicksToWait);  // tolua_export\n\n\t// tolua_begin\n\t/** Casts a thunderbolt at the specified coords */\n\tvoid CastThunderbolt(Vector3i a_Block);\n\tvoid CastThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ);  // DEPRECATED, use vector-parametered version instead\n\n\t/** Sets the specified weather; resets weather interval; asks and notifies plugins of the change */\n\tvoid SetWeather(eWeather a_NewWeather);\n\n\t/** Forces a weather change in the next game tick */\n\tvoid ChangeWeather(void);\n\n\t/** Returns the current weather. Instead of comparing values directly to the weather constants, use IsWeatherXXX() functions, if possible */\n\teWeather GetWeather(void) const { return m_Weather; }\n\n\t/** Returns true if the current weather is sunny. */\n\tbool IsWeatherSunny(void) const { return (m_Weather == wSunny); }\n\n\t/** Returns true if it is sunny at the specified location. This takes into account biomes. */\n\tbool IsWeatherSunnyAt(int a_BlockX, int a_BlockZ) const;\n\n\t/** Returns true if the current weather is rainy. */\n\tbool IsWeatherRain(void) const { return (m_Weather == wRain); }\n\n\t/** Returns true if it is raining at the specified location. This takes into account biomes. */\n\tbool IsWeatherRainAt(int a_BlockX, int a_BlockZ)\n\t{\n\t\treturn (IsWeatherRain() && !IsBiomeNoDownfall(GetBiomeAt(a_BlockX, a_BlockZ)));\n\t}\n\n\t/** Returns true if the current weather is stormy. */\n\tbool IsWeatherStorm(void) const { return (m_Weather == wStorm); }\n\n\t/** Returns true if the weather is stormy at the specified location. This takes into account biomes. */\n\tbool IsWeatherStormAt(int a_BlockX, int a_BlockZ)\n\t{\n\t\treturn (IsWeatherStorm() && !IsBiomeNoDownfall(GetBiomeAt(a_BlockX, a_BlockZ)));\n\t}\n\n\t/** Returns true if the world currently has any precipitation - rain, storm or snow. */\n\tbool IsWeatherWet(void) const { return !IsWeatherSunny(); }\n\n\t/** Returns true if it is raining or storming at the specified location.\n\tThis takes into account biomes. */\n\tvirtual bool IsWeatherWetAt(int a_BlockX, int a_BlockZ) override;\n\n\t/** Returns true if it is raining or storming at the specified location,\n\tand the rain reaches (the bottom of) the specified block position. */\n\tvirtual bool IsWeatherWetAtXYZ(Vector3i a_Position) override;\n\n\t/** Returns the seed of the world. */\n\tint GetSeed(void) const { return m_Generator.GetSeed(); }\n\n\t// tolua_end\n\n\tcChunkGeneratorThread & GetGenerator(void) { return m_Generator; }\n\tcWorldStorage &   GetStorage  (void) { return m_Storage; }\n\tcChunkMap *       GetChunkMap (void) { return &m_ChunkMap; }\n\n\t/** Causes the specified block to be ticked on the next Tick() call.\n\tOnly one block coord per chunk may be set, a second call overwrites the first call */\n\tvoid SetNextBlockToTick(const Vector3i a_BlockPos);  // tolua_export\n\n\tint GetMaxSugarcaneHeight(void) const { return m_MaxSugarcaneHeight; }  // tolua_export\n\tint GetMaxCactusHeight   (void) const { return m_MaxCactusHeight; }     // tolua_export\n\n\tbool IsBlockDirectlyWatered(int a_BlockX, int a_BlockY, int a_BlockZ);  // tolua_export\n\n\t/** Spawns a mob of the specified type. Returns the mob's UniqueID if recognized and spawned, cEntity::INVALID_ID otherwise */\n\tvirtual UInt32 SpawnMob(double a_PosX, double a_PosY, double a_PosZ, eMonsterType a_MonsterType, bool a_Baby = false) override;  // tolua_export\n\n\t/** Wraps cEntity::Initialize, doing Monster-specific things before spawning the monster.\n\tTakes ownership of the given Monster reference. */\n\tUInt32 SpawnMobFinalize(std::unique_ptr<cMonster> a_Monster);\n\n\t/** Creates a projectile of the specified type. Returns the projectile's UniqueID if successful, cEntity::INVALID_ID otherwise\n\tItem parameter is currently used for Fireworks to correctly set entity metadata based on item metadata. */\n\tUInt32 CreateProjectile(Vector3d a_Pos, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem * a_Item, const Vector3d * a_Speed = nullptr);  // tolua_export\n\n\t/** OBSOLETE, use the Vector3d-based overload instead.\n\tCreates a projectile of the specified type. Returns the projectile's UniqueID if successful, cEntity::INVALID_ID otherwise\n\tItem parameter is currently used for Fireworks to correctly set entity metadata based on item metadata. */\n\tUInt32 CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem * a_Item, const Vector3d * a_Speed = nullptr);  // tolua_export\n\n\t/** Returns a random number in range [0 .. a_Range]. */\n\tint GetTickRandomNumber(int a_Range);\n\n\t/** Appends all usernames starting with a_Text (case-insensitive) into Results */\n\tvoid TabCompleteUserName(const AString & a_Text, AStringVector & a_Results);\n\n\t/** Get the current darkness level based on the time */\n\tNIBBLETYPE GetSkyDarkness() { return m_SkyDarkness; }\n\n\t/** Increments (a_AlwaysTicked == true) or decrements (false) the m_AlwaysTicked counter for the specified chunk.\n\tIf the m_AlwaysTicked counter is greater than zero, the chunk is ticked in the tick-thread regardless of\n\twhether it has any clients or not.\n\tThis function allows nesting and task-concurrency (multiple separate tasks can request ticking and as long\n\tas at least one requests is active the chunk will be ticked). */\n\tvoid SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked = true);  // tolua_export\n\n\t/** Returns true if slimes should spawn in the chunk. */\n\tbool IsSlimeChunk(int a_ChunkX, int a_ChunkZ) const;  // tolua_export\nprivate:\n\n\tclass cTickThread:\n\t\tpublic cIsThread\n\t{\n\t\tusing Super = cIsThread;\n\n\tpublic:\n\n\t\tcTickThread(cWorld & a_World);\n\n\tprotected:\n\t\tcWorld & m_World;\n\n\t\t// cIsThread overrides:\n\t\tvirtual void Execute(void) override;\n\t} ;\n\n\n\n\t/** Implementation of the callbacks that the ChunkGenerator uses to store new chunks and interface to plugins */\n\tclass cChunkGeneratorCallbacks :\n\t\tpublic cChunkGeneratorThread::cChunkSink,\n\t\tpublic cChunkGeneratorThread::cPluginInterface\n\t{\n\t\tcWorld * m_World;\n\n\t\t// cChunkSink overrides:\n\t\tvirtual void OnChunkGenerated  (cChunkDesc & a_ChunkDesc) override;\n\t\tvirtual bool IsChunkValid      (cChunkCoords a_Coords) override;\n\t\tvirtual bool HasChunkAnyClients(cChunkCoords a_Coords) override;\n\t\tvirtual bool IsChunkQueued     (cChunkCoords a_Coords) override;\n\n\t\t// cPluginInterface overrides:\n\t\tvirtual void CallHookChunkGenerating(cChunkDesc & a_ChunkDesc) override;\n\t\tvirtual void CallHookChunkGenerated (cChunkDesc & a_ChunkDesc) override;\n\n\tpublic:\n\t\tcChunkGeneratorCallbacks(cWorld & a_World);\n\t} ;\n\n\n\t/** The maximum number of allowed unused dirty chunks for this world.\n\tLoaded from config, enforced every 10 seconds by freeing some unused dirty chunks\n\tif this was exceeded. */\n\tsize_t m_UnusedDirtyChunksCap;\n\n\tAString m_WorldName;\n\n\t/** The path to the root directory for the world files. Does not including trailing path specifier. */\n\tAString m_DataPath;\n\n\t/** The name of the overworld that portals in this world should link to.\n\tOnly has effect if this world is a Nether or End world. */\n\tAString m_LinkedOverworldName;\n\n\tAString m_IniFileName;\n\n\t/** Name of the storage schema used to load and save chunks */\n\tAString m_StorageSchema;\n\n\tint m_StorageCompressionFactor;\n\n\t/** Whether or not writing chunks to disk is currently enabled */\n\tstd::atomic<bool> m_IsSavingEnabled;\n\n\t/** The dimension of the world, used by the client to provide correct lighting scheme */\n\teDimension m_Dimension;\n\n\tbool m_IsSpawnExplicitlySet;\n\tint m_SpawnX;\n\tint m_SpawnY;\n\tint m_SpawnZ;\n\n\t// Variables defining the minimum and maximum size for a nether portal\n\tint m_MinNetherPortalWidth;\n\tint m_MaxNetherPortalWidth;\n\tint m_MinNetherPortalHeight;\n\tint m_MaxNetherPortalHeight;\n\n\tbool m_BroadcastDeathMessages;\n\tbool m_BroadcastAchievementMessages;\n\n\tbool   m_IsDaylightCycleEnabled;\n\n\t/** The age of the world.\n\tMonotonic, always increasing each game tick, persistent across server restart.\n\tWe need sub-tick precision here, that's why we store the time in milliseconds and calculate ticks off of it. */\n\tstd::chrono::milliseconds m_WorldAge;\n\n\t/** The fully controllable age of the world.\n\tA value used to calculate the current day, and time of day. Settable by plugins and players, and persistent.\n\tWe need sub-tick precision here, that's why we store the time in milliseconds and calculate ticks off of it. */\n\tstd::chrono::milliseconds m_WorldDate;\n\n\t/** The time since this world began, in ticks.\n\tMonotonic, but does not persist across restarts.\n\tUsed for less important but heavy tasks that run periodically. These tasks don't need to follow wallclock time, and slowing their rate down if TPS drops is desirable. */\n\tcTickTimeLong m_WorldTickAge;\n\n\tstd::chrono::milliseconds m_LastChunkCheck;  // The last WorldAge in which unloading and possibly saving was triggered.\n\tstd::chrono::milliseconds m_LastSave;  // The last WorldAge in which save-all was triggerred.\n\tstd::map<cMonster::eFamily, cTickTimeLong> m_LastSpawnMonster;  // The last WorldAge (in ticks) in which a monster was spawned (for each megatype of monster)  // MG TODO : find a way to optimize without creating unmaintenability (if mob IDs are becoming unrowed)\n\n\tNIBBLETYPE m_SkyDarkness;\n\n\teGameMode m_GameMode;\n\tbool m_bEnabledPVP;\n\tbool m_bFarmlandTramplingEnabled;\n\tbool m_IsDeepSnowEnabled;\n\tbool m_ShouldLavaSpawnFire;\n\tbool m_VillagersShouldHarvestCrops;\n\n\tstd::vector<BlockTickQueueItem *> m_BlockTickQueue;\n\tstd::vector<BlockTickQueueItem *> m_BlockTickQueueCopy;  // Second is for safely removing the objects from the queue\n\n\tstd::unique_ptr<cSimulatorManager>   m_SimulatorManager;\n\tstd::unique_ptr<cSandSimulator>      m_SandSimulator;\n\tcFluidSimulator *                    m_WaterSimulator;\n\tcFluidSimulator *                    m_LavaSimulator;\n\tstd::unique_ptr<cFireSimulator>      m_FireSimulator;\n\tcRedstoneSimulator * m_RedstoneSimulator;\n\n\t// Protect with chunk map CS\n\tstd::vector<cPlayer *> m_Players;\n\n\tcWorldStorage m_Storage;\n\n\tunsigned int m_MaxPlayers;\n\n\tcChunkMap m_ChunkMap;\n\n\tbool m_bAnimals;\n\tstd::set<eMonsterType> m_AllowedMobs;\n\n\teWeather m_Weather;\n\tint m_WeatherInterval;\n\tint m_MaxSunnyTicks, m_MinSunnyTicks;\n\tint m_MaxRainTicks,  m_MinRainTicks;\n\tint m_MaxThunderStormTicks, m_MinThunderStormTicks;\n\n\tint  m_MaxCactusHeight;\n\tint  m_MaxSugarcaneHeight;\n\t/* TODO: Enable when functionality exists again\n\tbool m_IsBeetrootsBonemealable;\n\tbool m_IsCactusBonemealable;\n\tbool m_IsCarrotsBonemealable;\n\tbool m_IsCropsBonemealable;\n\tbool m_IsGrassBonemealable;\n\tbool m_IsMelonStemBonemealable;\n\tbool m_IsMelonBonemealable;\n\tbool m_IsPotatoesBonemealable;\n\tbool m_IsPumpkinStemBonemealable;\n\tbool m_IsPumpkinBonemealable;\n\tbool m_IsSaplingBonemealable;\n\tbool m_IsSugarcaneBonemealable;\n\tbool m_IsBigFlowerBonemealable;\n\tbool m_IsTallGrassBonemealable;\n\t*/\n\n\t/** Whether command blocks are enabled or not */\n\tbool m_bCommandBlocksEnabled;\n\n\t/** Whether prefixes such as [INFO] are prepended to SendMessageXXX() / BroadcastChatXXX() functions */\n\tbool m_bUseChatPrefixes;\n\n\t/** The level of DoExplosionAt() projecting random affected blocks as FallingBlock entities\n\tSee the eShrapnelLevel enumeration for details\n\t*/\n\teShrapnelLevel m_TNTShrapnelLevel;\n\n\t/** The maximum view distance that a player can have in this world. */\n\tint m_MaxViewDistance;\n\n\t/** Name of the nether world - where Nether portals should teleport.\n\tOnly used when this world is an Overworld. */\n\tAString m_LinkedNetherWorldName;\n\n\t/** Name of the End world - where End portals should teleport.\n\tOnly used when this world is an Overworld. */\n\tAString m_LinkedEndWorldName;\n\n\t/** The thread responsible for generating chunks. */\n\tcChunkGeneratorThread m_Generator;\n\n\tcScoreboard      m_Scoreboard;\n\tcMapManager      m_MapManager;\n\n\t/** The callbacks that the ChunkGenerator uses to store new chunks and interface to plugins */\n\tcChunkGeneratorCallbacks m_GeneratorCallbacks;\n\n\tcChunkSender     m_ChunkSender;\n\tcLightingThread  m_Lighting;\n\tcTickThread      m_TickThread;\n\n\t/** Guards the m_Tasks */\n\tcCriticalSection m_CSTasks;\n\n\t/** Tasks that have been queued onto the tick thread, possibly to be executed at target tick in the future; guarded by m_CSTasks */\n\tstd::vector<std::pair<std::chrono::milliseconds, std::function<void(cWorld &)>>> m_Tasks;\n\n\t/** Guards m_EntitiesToAdd */\n\tcCriticalSection m_CSEntitiesToAdd;\n\n\t/** List of entities that are scheduled for adding, waiting for the Tick thread to add them. */\n\tstd::vector<std::pair<OwnedEntity, cWorld *>> m_EntitiesToAdd;\n\n\t/** CS protecting m_SetChunkDataQueue. */\n\tcCriticalSection m_CSSetChunkDataQueue;\n\n\t/** Queue for the chunk data to be set into m_ChunkMap by the tick thread. Protected by m_CSSetChunkDataQueue */\n\tstd::vector<SetChunkData> m_SetChunkDataQueue;\n\n\tvoid Tick(std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_LastTickDurationMSec);\n\n\t/** Ticks all clients that are in this world. */\n\tvoid TickClients(std::chrono::milliseconds a_Dt);\n\n\t/** Handles the weather in each tick */\n\tvoid TickWeather(float a_Dt);\n\n\t/** Handles the mob spawning / moving / destroying each tick */\n\tvoid TickMobs(std::chrono::milliseconds a_Dt);\n\n\t/** Sets the chunk data queued in the m_SetChunkDataQueue queue into their chunk. */\n\tvoid TickQueuedChunkDataSets();\n\n\t/** Adds the entities queued in the m_EntitiesToAdd queue into their chunk.\n\tIf the entity was a player, he is also added to the m_Players list. */\n\tvoid TickQueuedEntityAdditions(void);\n\n\t/** Executes all tasks queued onto the tick thread */\n\tvoid TickQueuedTasks(void);\n\n\t/** Unloads all chunks immediately. */\n\tvoid UnloadUnusedChunks(void);\n\n\tvoid UpdateSkyDarkness(void);\n\n\t/** Generates a random spawnpoint on solid land by walking chunks and finding their biomes */\n\tvoid GenerateRandomSpawn(int a_MaxSpawnRadius);\n\n\t/** Can the specified coordinates be used as a spawn point?\n\tReturns true if spawn position is valid and sets a_Y to the valid spawn height */\n\tbool CanSpawnAt(int a_X, int & a_Y, int a_Z);\n\n\t/** Check if player starting point is acceptable */\n\tbool CheckPlayerSpawnPoint(int a_PosX, int a_PosY, int a_PosZ)\n\t{\n\t\treturn CheckPlayerSpawnPoint({a_PosX, a_PosY, a_PosZ});\n\t}\n\tbool CheckPlayerSpawnPoint(Vector3i a_Pos);\n\n\t/** Chooses a reasonable transition from the current weather to a new weather */\n\teWeather ChooseNewWeather(void);\n\n\t/** Creates a new fluid simulator, loads its settings from the inifile (a_FluidName section) */\n\tcFluidSimulator * InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock);\n\n\t/** Creates a new redstone simulator. */\n\tcRedstoneSimulator * InitializeRedstoneSimulator(cIniFile & a_IniFile);\n\n\t/** Sets mob spawning values if nonexistant to their dimension specific defaults */\n\tvoid InitializeAndLoadMobSpawningValues(cIniFile & a_IniFile);\n\n\t/** Checks if the sapling at the specified block coord is a part of a large-tree sapling (2x2).\n\tIf so, adjusts the coords so that they point to the northwest (XM ZM) corner of the sapling area and returns true.\n\tReturns false if not a part of large-tree sapling. */\n\tbool GetLargeTreeAdjustment(Vector3i & a_BlockPos, NIBBLETYPE a_SaplingMeta);\n};  // tolua_export\n"
  },
  {
    "path": "src/WorldStorage/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tEnchantmentSerializer.cpp\n\tFastNBT.cpp\n\tFireworksSerializer.cpp\n\tMapSerializer.cpp\n\tNamespaceSerializer.cpp\n\tNBTChunkSerializer.cpp\n\tSchematicFileSerializer.cpp\n\tScoreboardSerializer.cpp\n\tStatisticsSerializer.cpp\n\tWSSAnvil.cpp\n\tWorldStorage.cpp\n\n\tEnchantmentSerializer.h\n\tFastNBT.h\n\tFireworksSerializer.h\n\tMapSerializer.h\n\tNamespaceSerializer.h\n\tNBTChunkSerializer.h\n\tSchematicFileSerializer.h\n\tScoreboardSerializer.h\n\tStatisticsSerializer.h\n\tWSSAnvil.h\n\tWorldStorage.h\n)\n"
  },
  {
    "path": "src/WorldStorage/EnchantmentSerializer.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"EnchantmentSerializer.h\"\n#include \"FastNBT.h\"\n#include \"../Enchantments.h\"\n\nvoid EnchantmentSerializer::WriteToNBTCompound(const cEnchantments & a_Enchantments, cFastNBTWriter & a_Writer, const AString & a_ListTagName)\n{\n\t// Write the enchantments into the specified NBT writer\n\t// begin with the LIST tag of the specified name (\"ench\" or \"StoredEnchantments\")\n\n\ta_Writer.BeginList(a_ListTagName, TAG_Compound);\n\tfor (cEnchantments::cMap::const_iterator itr = a_Enchantments.m_Enchantments.begin(), end = a_Enchantments.m_Enchantments.end(); itr != end; ++itr)\n\t{\n\t\ta_Writer.BeginCompound(\"\");\n\t\t\ta_Writer.AddShort(\"id\",  static_cast<Int16>(itr->first));\n\t\t\ta_Writer.AddShort(\"lvl\", static_cast<Int16>(itr->second));\n\t\ta_Writer.EndCompound();\n\t}  // for itr - m_Enchantments[]\n\ta_Writer.EndList();\n}\n\n\n\n\n\nvoid EnchantmentSerializer::ParseFromNBT(cEnchantments & a_Enchantments, const cParsedNBT & a_NBT, int a_EnchListTagIdx)\n{\n\t// Read the enchantments from the specified NBT list tag (ench or StoredEnchantments)\n\n\t// Verify that the tag is a list:\n\tif (a_NBT.GetType(a_EnchListTagIdx) != TAG_List)\n\t{\n\t\tLOGWARNING(\"%s: Invalid EnchListTag type: exp %d, got %d. Enchantments not parsed\",\n\t\t\t__FUNCTION__, TAG_List, a_NBT.GetType(a_EnchListTagIdx)\n\t\t);\n\t\tASSERT(!\"Bad EnchListTag type\");\n\t\treturn;\n\t}\n\n\t// Verify that the list is of Compounds:\n\tif (a_NBT.GetChildrenType(a_EnchListTagIdx) != TAG_Compound)\n\t{\n\t\tLOGWARNING(\"%s: Invalid NBT list children type: exp %d, got %d. Enchantments not parsed\",\n\t\t\t__FUNCTION__, TAG_Compound, a_NBT.GetChildrenType(a_EnchListTagIdx)\n\t\t);\n\t\tASSERT(!\"Bad EnchListTag children type\");\n\t\treturn;\n\t}\n\n\ta_Enchantments.Clear();\n\n\t// Iterate over all the compound children, parse an enchantment from each:\n\tfor (int tag = a_NBT.GetFirstChild(a_EnchListTagIdx); tag >= 0; tag = a_NBT.GetNextSibling(tag))\n\t{\n\t\t// tag is the compound inside the \"ench\" list tag\n\t\tASSERT(a_NBT.GetType(tag) == TAG_Compound);\n\n\t\t// Search for the id and lvl tags' values:\n\t\tint id = -1, lvl = -1;\n\t\tfor (int ch = a_NBT.GetFirstChild(tag); ch >= 0; ch = a_NBT.GetNextSibling(ch))\n\t\t{\n\t\t\tif (a_NBT.GetType(ch) != TAG_Short)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (a_NBT.GetName(ch) == \"id\")\n\t\t\t{\n\t\t\t\tid = a_NBT.GetShort(ch);\n\t\t\t}\n\t\t\telse if (a_NBT.GetName(ch) == \"lvl\")\n\t\t\t{\n\t\t\t\tlvl = a_NBT.GetShort(ch);\n\t\t\t}\n\t\t}  // for ch - children of the compound tag\n\n\t\tif ((id == -1) || (lvl <= 0))\n\t\t{\n\t\t\t// Failed to parse either the id or the lvl, skip this compound\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Store the enchantment:\n\t\ta_Enchantments.m_Enchantments[id] = static_cast<unsigned int>(lvl);\n\t}  // for tag - children of the ench list tag\n}\n\n"
  },
  {
    "path": "src/WorldStorage/EnchantmentSerializer.h",
    "content": "\n#pragma once\n\nclass cEnchantments;\nclass cFastNBTWriter;\nclass cParsedNBT;\n\n\n\n\n\nnamespace EnchantmentSerializer\n{\n\n\t/** Writes the enchantments into the specified NBT writer; begins with the LIST tag of the specified name (\"ench\" or \"StoredEnchantments\") */\n\tvoid WriteToNBTCompound(const cEnchantments & a_Enchantments, cFastNBTWriter & a_Writer, const AString & a_ListTagName);\n\n\t/** Reads the enchantments from the specified NBT list tag (ench or StoredEnchantments) */\n\tvoid ParseFromNBT(cEnchantments & a_Enchantments, const cParsedNBT & a_NBT, int a_EnchListTagIdx);\n\n};\n\n\n\n\n"
  },
  {
    "path": "src/WorldStorage/FastNBT.cpp",
    "content": "\n// FastNBT.cpp\n\n// Implements the fast NBT parser and writer\n\n#include \"Globals.h\"\n#include \"FastNBT.h\"\n\n\n\n\n\n// The number of NBT tags that are reserved when an NBT parsing is started.\n// You can override this by using a cmdline define\n#ifndef NBT_RESERVE_SIZE\n\t#define NBT_RESERVE_SIZE 200\n#endif  // NBT_RESERVE_SIZE\n\n#ifdef _MSC_VER\n\t// Dodge a C4127 (conditional expression is constant) for this specific macro usage\n\t#define PROPAGATE_ERROR(X) do { auto Err = (X); if (Err != eNBTParseError::npSuccess) return Err; } while ((false, false))\n#else\n\t#define PROPAGATE_ERROR(X) do { auto Err = (X); if (Err != eNBTParseError::npSuccess) return Err; } while (false)\n#endif\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cNBTParseErrorCategory:\n\nnamespace\n{\n\nclass cNBTParseErrorCategory final :\n\tpublic std::error_category\n{\n\tcNBTParseErrorCategory() = default;\npublic:\n\t/** Category name */\n\tvirtual const char * name() const noexcept override\n\t{\n\t\treturn \"NBT parse error\";\n\t}\n\n\t/** Maps a parse error code to an error message */\n\tvirtual AString message(int a_Condition) const override;\n\n\t/** Returns the canonical error category instance. */\n\tstatic const cNBTParseErrorCategory & Get() noexcept\n\t{\n\t\tstatic cNBTParseErrorCategory Category;\n\t\treturn Category;\n\t}\n};\n\n\n\n\n\nAString cNBTParseErrorCategory::message(int a_Condition) const\n{\n\tswitch (static_cast<eNBTParseError>(a_Condition))\n\t{\n\t\tcase eNBTParseError::npSuccess:\n\t\t{\n\t\t\treturn \"Parsing succeded\";\n\t\t}\n\t\tcase eNBTParseError::npNeedBytes:\n\t\t{\n\t\t\treturn \"Expected more data\";\n\t\t}\n\t\tcase eNBTParseError::npNoTopLevelCompound:\n\t\t{\n\t\t\treturn \"No top level compound tag\";\n\t\t}\n\t\tcase eNBTParseError::npStringMissingLength:\n\t\t{\n\t\t\treturn \"Expected a string length but had insufficient data\";\n\t\t}\n\t\tcase eNBTParseError::npStringInvalidLength:\n\t\t{\n\t\t\treturn \"String length invalid\";\n\t\t}\n\t\tcase eNBTParseError::npCompoundImbalancedTag:\n\t\t{\n\t\t\treturn \"Compound tag was unmatched at end of file\";\n\t\t}\n\t\tcase eNBTParseError::npListMissingType:\n\t\t{\n\t\t\treturn \"Expected a list type but had insuffiecient data\";\n\t\t}\n\t\tcase eNBTParseError::npListMissingLength:\n\t\t{\n\t\t\treturn \"Expected a list length but had insufficient data\";\n\t\t}\n\t\tcase eNBTParseError::npListInvalidLength:\n\t\t{\n\t\t\treturn \"List length invalid\";\n\t\t}\n\t\tcase eNBTParseError::npSimpleMissing:\n\t\t{\n\t\t\treturn \"Expected a numeric type but had insufficient data\";\n\t\t}\n\t\tcase eNBTParseError::npArrayMissingLength:\n\t\t{\n\t\t\treturn \"Expected an array length but had insufficient data\";\n\t\t}\n\t\tcase eNBTParseError::npArrayInvalidLength:\n\t\t{\n\t\t\treturn \"Array length invalid\";\n\t\t}\n\t\tcase eNBTParseError::npUnknownTag:\n\t\t{\n\t\t\treturn \"Unknown tag\";\n\t\t}\n\t}\n\tUNREACHABLE(\"Unsupported nbt parse error\");\n}\n\n}  // namespace (anonymous)\n\n\n\n\n\nstd::error_code make_error_code(eNBTParseError a_Err) noexcept\n{\n\treturn { static_cast<int>(a_Err), cNBTParseErrorCategory::Get() };\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cParsedNBT:\n\n#define NEEDBYTES(N, ERR) \\\n\tdo { \\\n\t\tif (m_Data.size() - m_Pos < static_cast<size_t>(N)) \\\n\t\t{ \\\n\t\t\treturn ERR; \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\ncParsedNBT::cParsedNBT(const ContiguousByteBufferView a_Data) :\n\tm_Data(a_Data),\n\tm_Pos(0)\n{\n\tm_Error = Parse();\n}\n\n\n\n\n\neNBTParseError cParsedNBT::Parse(void)\n{\n\tif (m_Data.size() < 3)\n\t{\n\t\t// Data too short\n\t\treturn eNBTParseError::npNeedBytes;\n\t}\n\tif (m_Data[0] != std::byte(TAG_Compound))\n\t{\n\t\t// The top-level tag must be a Compound\n\t\treturn eNBTParseError::npNoTopLevelCompound;\n\t}\n\n\tm_Tags.reserve(NBT_RESERVE_SIZE);\n\n\tm_Tags.emplace_back(TAG_Compound, -1);\n\n\tm_Pos = 1;\n\n\tPROPAGATE_ERROR(ReadString(m_Tags.back().m_NameStart, m_Tags.back().m_NameLength));\n\treturn ReadCompound();\n}\n\n\n\n\n\neNBTParseError cParsedNBT::ReadString(size_t & a_StringStart, size_t & a_StringLen)\n{\n\tNEEDBYTES(2, eNBTParseError::npStringMissingLength);\n\ta_StringStart = m_Pos + 2;\n\ta_StringLen = static_cast<size_t>(NetworkBufToHost<UInt16>(m_Data.data() + m_Pos));\n\tNEEDBYTES(2 + a_StringLen, eNBTParseError::npStringInvalidLength);\n\tm_Pos += 2 + a_StringLen;\n\treturn eNBTParseError::npSuccess;\n}\n\n\n\n\n\neNBTParseError cParsedNBT::ReadCompound(void)\n{\n\tASSERT(m_Tags.size() > 0);\n\n\t// Reads the latest tag as a compound\n\tsize_t ParentIdx = m_Tags.size() - 1;\n\tint PrevSibling = -1;\n\tfor (;;)\n\t{\n\t\tNEEDBYTES(1, eNBTParseError::npCompoundImbalancedTag);\n\t\tconst auto TagTypeNum = m_Data[m_Pos];\n\t\tif ((TagTypeNum < std::byte(TAG_Min)) || (TagTypeNum > std::byte(TAG_Max)))\n\t\t{\n\t\t\treturn eNBTParseError::npUnknownTag;\n\t\t}\n\t\teTagType TagType = static_cast<eTagType>(TagTypeNum);\n\t\tm_Pos++;\n\t\tif (TagType == TAG_End)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tm_Tags.emplace_back(TagType, static_cast<int>(ParentIdx), PrevSibling);\n\t\tif (PrevSibling >= 0)\n\t\t{\n\t\t\tm_Tags[static_cast<size_t>(PrevSibling)].m_NextSibling = static_cast<int>(m_Tags.size()) - 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_Tags[ParentIdx].m_FirstChild = static_cast<int>(m_Tags.size()) - 1;\n\t\t}\n\t\tPrevSibling = static_cast<int>(m_Tags.size()) - 1;\n\t\tPROPAGATE_ERROR(ReadString(m_Tags.back().m_NameStart, m_Tags.back().m_NameLength));\n\t\tPROPAGATE_ERROR(ReadTag());\n\t}  // while (true)\n\tm_Tags[ParentIdx].m_LastChild = PrevSibling;\n\treturn eNBTParseError::npSuccess;\n}\n\n\n\n\n\neNBTParseError cParsedNBT::ReadList(eTagType a_ChildrenType)\n{\n\t// Reads the latest tag as a list of items of type a_ChildrenType\n\n\t// Read the count:\n\tNEEDBYTES(4, eNBTParseError::npListMissingLength);\n\tint Count = NetworkBufToHost<int>(m_Data.data() + m_Pos);\n\tm_Pos += 4;\n\tauto MinChildSize = GetMinTagSize(a_ChildrenType);\n\tif ((Count < 0) || (Count > static_cast<int>((m_Data.size() - m_Pos) / MinChildSize)))\n\t{\n\t\treturn eNBTParseError::npListInvalidLength;\n\t}\n\n\t// Read items:\n\tASSERT(m_Tags.size() > 0);\n\tsize_t ParentIdx = m_Tags.size() - 1;\n\tint PrevSibling = -1;\n\tfor (int i = 0; i < Count; i++)\n\t{\n\t\tm_Tags.emplace_back(a_ChildrenType, static_cast<int>(ParentIdx), PrevSibling);\n\t\tif (PrevSibling >= 0)\n\t\t{\n\t\t\tm_Tags[static_cast<size_t>(PrevSibling)].m_NextSibling = static_cast<int>(m_Tags.size()) - 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_Tags[ParentIdx].m_FirstChild = static_cast<int>(m_Tags.size()) - 1;\n\t\t}\n\t\tPrevSibling = static_cast<int>(m_Tags.size()) - 1;\n\t\tPROPAGATE_ERROR(ReadTag());\n\t}  // for (i)\n\tm_Tags[ParentIdx].m_LastChild = PrevSibling;\n\treturn eNBTParseError::npSuccess;\n}\n\n\n\n\n\n#define CASE_SIMPLE_TAG(TAGTYPE, LEN) \\\n\tcase TAG_##TAGTYPE: \\\n\t{ \\\n\t\tNEEDBYTES(LEN, eNBTParseError::npSimpleMissing); \\\n\t\tTag.m_DataStart = m_Pos; \\\n\t\tTag.m_DataLength = LEN; \\\n\t\tm_Pos += LEN; \\\n\t\treturn eNBTParseError::npSuccess; \\\n\t}\n\neNBTParseError cParsedNBT::ReadTag(void)\n{\n\tcFastNBTTag & Tag = m_Tags.back();\n\tswitch (Tag.m_Type)\n\t{\n\t\tCASE_SIMPLE_TAG(Byte,   1)\n\t\tCASE_SIMPLE_TAG(Short,  2)\n\t\tCASE_SIMPLE_TAG(Int,    4)\n\t\tCASE_SIMPLE_TAG(Long,   8)\n\t\tCASE_SIMPLE_TAG(Float,  4)\n\t\tCASE_SIMPLE_TAG(Double, 8)\n\n\t\tcase TAG_String:\n\t\t{\n\t\t\treturn ReadString(Tag.m_DataStart, Tag.m_DataLength);\n\t\t}\n\n\t\tcase TAG_ByteArray:\n\t\t{\n\t\t\tNEEDBYTES(4, eNBTParseError::npArrayMissingLength);\n\t\t\tint len = NetworkBufToHost<int>(m_Data.data() + m_Pos);\n\t\t\tm_Pos += 4;\n\t\t\tif (len < 0)\n\t\t\t{\n\t\t\t\t// Invalid length\n\t\t\t\treturn eNBTParseError::npArrayInvalidLength;\n\t\t\t}\n\t\t\tNEEDBYTES(len, eNBTParseError::npArrayInvalidLength);\n\t\t\tTag.m_DataLength = static_cast<size_t>(len);\n\t\t\tTag.m_DataStart = m_Pos;\n\t\t\tm_Pos += static_cast<size_t>(len);\n\t\t\treturn eNBTParseError::npSuccess;\n\t\t}\n\n\t\tcase TAG_List:\n\t\t{\n\t\t\tNEEDBYTES(1, eNBTParseError::npListMissingType);\n\t\t\teTagType ItemType = static_cast<eTagType>(m_Data[m_Pos]);\n\t\t\tm_Pos++;\n\t\t\tPROPAGATE_ERROR(ReadList(ItemType));\n\t\t\treturn eNBTParseError::npSuccess;\n\t\t}\n\n\t\tcase TAG_Compound:\n\t\t{\n\t\t\tPROPAGATE_ERROR(ReadCompound());\n\t\t\treturn eNBTParseError::npSuccess;\n\t\t}\n\n\t\tcase TAG_IntArray:\n\t\t{\n\t\t\tNEEDBYTES(4, eNBTParseError::npArrayMissingLength);\n\t\t\tint len = NetworkBufToHost<int>(m_Data.data() + m_Pos);\n\t\t\tm_Pos += 4;\n\t\t\tif (len < 0)\n\t\t\t{\n\t\t\t\t// Invalid length\n\t\t\t\treturn eNBTParseError::npArrayInvalidLength;\n\t\t\t}\n\t\t\tlen *= 4;\n\t\t\tNEEDBYTES(len, eNBTParseError::npArrayInvalidLength);\n\t\t\tTag.m_DataLength = static_cast<size_t>(len);\n\t\t\tTag.m_DataStart = m_Pos;\n\t\t\tm_Pos += static_cast<size_t>(len);\n\t\t\treturn eNBTParseError::npSuccess;\n\t\t}\n\n\t\tcase TAG_Min:\n\t\t{\n\t\t\treturn eNBTParseError::npUnknownTag;\n\t\t}\n\t}  // switch (iType)\n\tUNREACHABLE(\"Unsupported nbt tag type\");\n}\n\n#undef CASE_SIMPLE_TAG\n\n\n\n\n\nint cParsedNBT::FindChildByName(int a_Tag, const char * a_Name, size_t a_NameLength) const\n{\n\tif (a_Tag < 0)\n\t{\n\t\treturn -1;\n\t}\n\tif (m_Tags[static_cast<size_t>(a_Tag)].m_Type != TAG_Compound)\n\t{\n\t\treturn -1;\n\t}\n\n\tif (a_NameLength == 0)\n\t{\n\t\ta_NameLength = strlen(a_Name);\n\t}\n\tfor (int Child = m_Tags[static_cast<size_t>(a_Tag)].m_FirstChild; Child != -1; Child = m_Tags[static_cast<size_t>(Child)].m_NextSibling)\n\t{\n\t\tif (\n\t\t\t(m_Tags[static_cast<size_t>(Child)].m_NameLength == a_NameLength) &&\n\t\t\t(memcmp(m_Data.data() + m_Tags[static_cast<size_t>(Child)].m_NameStart, a_Name, a_NameLength) == 0)\n\t\t)\n\t\t{\n\t\t\treturn Child;\n\t\t}\n\t}  // for Child - children of a_Tag\n\treturn -1;\n}\n\n\n\n\n\nint cParsedNBT::FindTagByPath(int a_Tag, const AString & a_Path) const\n{\n\tif (a_Tag < 0)\n\t{\n\t\treturn -1;\n\t}\n\tsize_t Begin = 0;\n\tsize_t Length = a_Path.length();\n\tint Tag = a_Tag;\n\tfor (size_t i = 0; i < Length; i++)\n\t{\n\t\tif (a_Path[i] != '\\\\')\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tTag = FindChildByName(Tag, a_Path.c_str() + Begin, i - Begin);\n\t\tif (Tag < 0)\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\tBegin = i + 1;\n\t}  // for i - a_Path[]\n\n\tif (Begin < Length)\n\t{\n\t\tTag = FindChildByName(Tag, a_Path.c_str() + Begin, Length - Begin);\n\t}\n\treturn Tag;\n}\n\n\n\n\n\nsize_t cParsedNBT::GetMinTagSize(eTagType a_TagType)\n{\n\tswitch (a_TagType)\n\t{\n\t\tcase TAG_End:       return 1;\n\t\tcase TAG_Byte:      return 1;\n\t\tcase TAG_Short:     return 2;\n\t\tcase TAG_Int:       return 4;\n\t\tcase TAG_Long:      return 8;\n\t\tcase TAG_Float:     return 4;\n\t\tcase TAG_Double:    return 8;\n\t\tcase TAG_String:    return 2;  // 2 bytes for the string length\n\t\tcase TAG_ByteArray: return 4;  // 4 bytes for the count\n\t\tcase TAG_List:      return 5;  // 1 byte list type + 4 bytes count\n\t\tcase TAG_Compound:  return 1;  // Single TAG_End byte\n\t\tcase TAG_IntArray:  return 4;  // 4 bytes for the count\n\t}\n\tUNREACHABLE(\"Unsupported nbt tag type\");\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cFastNBTWriter:\n\ncFastNBTWriter::cFastNBTWriter(const AString & a_RootTagName) :\n\tm_CurrentStack(0)\n{\n\tm_Stack[0].m_Type = TAG_Compound;\n\tm_Result.reserve(100 KiB);\n\tm_Result.push_back(std::byte(TAG_Compound));\n\tWriteString(a_RootTagName);\n}\n\n\n\n\n\nvoid cFastNBTWriter::BeginCompound(const AString & a_Name)\n{\n\tif (m_CurrentStack >= MAX_STACK - 1)\n\t{\n\t\tASSERT(!\"Stack overflow\");\n\t\treturn;\n\t}\n\n\tTagCommon(a_Name, TAG_Compound);\n\n\t++m_CurrentStack;\n\tm_Stack[m_CurrentStack].m_Type = TAG_Compound;\n}\n\n\n\n\n\nvoid cFastNBTWriter::EndCompound(void)\n{\n\tASSERT(m_CurrentStack > 0);\n\tASSERT(IsStackTopCompound());\n\n\tm_Result.push_back(std::byte(TAG_End));\n\t--m_CurrentStack;\n}\n\n\n\n\n\nvoid cFastNBTWriter::BeginList(const AString & a_Name, eTagType a_ChildrenType)\n{\n\tif (m_CurrentStack >= MAX_STACK - 1)\n\t{\n\t\tASSERT(!\"Stack overflow\");\n\t\treturn;\n\t}\n\n\tTagCommon(a_Name, TAG_List);\n\n\tm_Result.push_back(std::byte(a_ChildrenType));\n\tm_Result.append(4, std::byte(0));\n\n\t++m_CurrentStack;\n\tm_Stack[m_CurrentStack].m_Type     = TAG_List;\n\tm_Stack[m_CurrentStack].m_Pos      = static_cast<int>(m_Result.size()) - 4;\n\tm_Stack[m_CurrentStack].m_Count    = 0;\n\tm_Stack[m_CurrentStack].m_ItemType = a_ChildrenType;\n}\n\n\n\n\n\nvoid cFastNBTWriter::EndList(void)\n{\n\tASSERT(m_CurrentStack > 0);\n\tASSERT(m_Stack[m_CurrentStack].m_Type == TAG_List);\n\n\t// Update the list count:\n\tauto Value = HostToNetwork(m_Stack[m_CurrentStack].m_Count);\n\tstd::copy(Value.begin(), Value.end(), m_Result.data() + m_Stack[m_CurrentStack].m_Pos);\n\n\t--m_CurrentStack;\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddByte(const AString & a_Name, unsigned char a_Value)\n{\n\tTagCommon(a_Name, TAG_Byte);\n\tm_Result.push_back(std::byte(a_Value));\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddShort(const AString & a_Name, Int16 a_Value)\n{\n\tTagCommon(a_Name, TAG_Short);\n\tauto Value = HostToNetwork(a_Value);\n\tm_Result.append(Value.begin(), Value.end());\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddInt(const AString & a_Name, Int32 a_Value)\n{\n\tTagCommon(a_Name, TAG_Int);\n\tauto Value = HostToNetwork(a_Value);\n\tm_Result.append(Value.begin(), Value.end());\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddLong(const AString & a_Name, Int64 a_Value)\n{\n\tTagCommon(a_Name, TAG_Long);\n\tauto Value = HostToNetwork(a_Value);\n\tm_Result.append(Value.begin(), Value.end());\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddFloat(const AString & a_Name, float a_Value)\n{\n\tTagCommon(a_Name, TAG_Float);\n\tauto Value = HostToNetwork(a_Value);\n\tm_Result.append(Value.begin(), Value.end());\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddDouble(const AString & a_Name, double a_Value)\n{\n\tTagCommon(a_Name, TAG_Double);\n\tauto Value = HostToNetwork(a_Value);\n\tm_Result.append(Value.begin(), Value.end());\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddString(const AString & a_Name, const std::string_view a_Value)\n{\n\tTagCommon(a_Name, TAG_String);\n\tauto Length = HostToNetwork(static_cast<UInt16>(a_Value.size()));\n\tm_Result.append(Length.begin(), Length.end());\n\tm_Result.append({ reinterpret_cast<const std::byte *>(a_Value.data()), a_Value.size() });\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddByteArray(const AString & a_Name, const char * a_Value, size_t a_NumElements)\n{\n\tTagCommon(a_Name, TAG_ByteArray);\n\tauto Length = HostToNetwork(static_cast<UInt32>(a_NumElements));\n\tm_Result.append(Length.begin(), Length.end());\n\tm_Result.append(reinterpret_cast<const std::byte *>(a_Value), a_NumElements);\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddByteArray(const AString & a_Name, size_t a_NumElements, unsigned char a_Value)\n{\n\tTagCommon(a_Name, TAG_ByteArray);\n\tauto Length = HostToNetwork(static_cast<UInt32>(a_NumElements));\n\tm_Result.append(Length.begin(), Length.end());\n\tm_Result.append(a_NumElements, std::byte(a_Value));\n}\n\n\n\n\n\nvoid cFastNBTWriter::AddIntArray(const AString & a_Name, const Int32 * a_Value, size_t a_NumElements)\n{\n\tTagCommon(a_Name, TAG_IntArray);\n\tauto Length = HostToNetwork(static_cast<UInt32>(a_NumElements));\n\tsize_t cap = m_Result.capacity();\n\tsize_t size = m_Result.length();\n\tif ((cap - size) < (4 + a_NumElements * 4))\n\t{\n\t\tm_Result.reserve(size + 4 + (a_NumElements * 4));\n\t}\n\tm_Result.append(Length.begin(), Length.end());\n\tfor (size_t i = 0; i < a_NumElements; i++)\n\t{\n\t\tauto Element = HostToNetwork(a_Value[i]);\n\t\tm_Result.append(Element.begin(), Element.end());\n\t}\n}\n\n\n\n\n\nvoid cFastNBTWriter::Finish(void)\n{\n\tASSERT(m_CurrentStack == 0);\n\tm_Result.push_back(std::byte(TAG_End));\n}\n\n\n\n\n\nvoid cFastNBTWriter::WriteString(const std::string_view a_Data)\n{\n\t// TODO check size <= short max\n\tauto Length = HostToNetwork(static_cast<UInt16>(a_Data.size()));\n\tm_Result.append(Length.begin(), Length.end());\n\tm_Result.append(reinterpret_cast<const std::byte *>(a_Data.data()), a_Data.size());\n}\n"
  },
  {
    "path": "src/WorldStorage/FastNBT.h",
    "content": "\n// FastNBT.h\n\n// Interfaces to the fast NBT parser and writer\n\n/*\nThe fast parser parses the data into a vector of cFastNBTTag structures. These structures describe the NBT tree,\nbut themselves are allocated in a vector, thus minimizing reallocation.\nThe structures have a minimal constructor, setting all member \"pointers\" to \"invalid\".\n\nThe fast writer doesn't need a NBT tree structure built beforehand, it is commanded to open, append and close tags\n(just like XML); it keeps the internal tag stack and reports errors in usage.\nIt directly outputs a string containing the serialized NBT data.\n*/\n\n\n\n\n\n#pragma once\n\n#include <system_error>\n#include \"../Endianness.h\"\n\n\n\n\n\nenum eTagType\n{\n\tTAG_Min       = 0,  // The minimum value for a tag type\n\tTAG_End       = 0,\n\tTAG_Byte      = 1,\n\tTAG_Short     = 2,\n\tTAG_Int       = 3,\n\tTAG_Long      = 4,\n\tTAG_Float     = 5,\n\tTAG_Double    = 6,\n\tTAG_ByteArray = 7,\n\tTAG_String    = 8,\n\tTAG_List      = 9,\n\tTAG_Compound  = 10,\n\tTAG_IntArray  = 11,\n\tTAG_Max       = 11,  // The maximum value for a tag type\n} ;\n\n\n\n\n\n/** This structure is used for all NBT tags.\nIt contains indices to the parent array of tags, building the NBT tree this way.\nAlso contains indices into the data stream being parsed, used for values;\nNO dynamically allocated memory is used!\nStructure (all with the tree structure it describes) supports moving in memory (std::vector reallocation)\n*/\nstruct cFastNBTTag\n{\npublic:\n\n\teTagType m_Type;\n\n\t// The following members are indices into the data stream. m_DataLength == 0 if no data available\n\t// They must not be pointers, because the datastream may be copied into another AString object in the meantime.\n\tsize_t m_NameStart;\n\tsize_t m_NameLength;\n\tsize_t m_DataStart;\n\tsize_t m_DataLength;\n\n\t// The following members are indices into the array returned; -1 if not valid\n\t// They must not be pointers, because pointers would not survive std::vector reallocation\n\tint m_Parent;\n\tint m_PrevSibling;\n\tint m_NextSibling;\n\tint m_FirstChild;\n\tint m_LastChild;\n\n\tcFastNBTTag(eTagType a_Type, int a_Parent) :\n\t\tm_Type(a_Type),\n\t\tm_NameStart(0),\n\t\tm_NameLength(0),\n\t\tm_DataStart(0),\n\t\tm_DataLength(0),\n\t\tm_Parent(a_Parent),\n\t\tm_PrevSibling(-1),\n\t\tm_NextSibling(-1),\n\t\tm_FirstChild(-1),\n\t\tm_LastChild(-1)\n\t{\n\t}\n\n\tcFastNBTTag(eTagType a_Type, int a_Parent, int a_PrevSibling) :\n\t\tm_Type(a_Type),\n\t\tm_NameStart(0),\n\t\tm_NameLength(0),\n\t\tm_DataStart(0),\n\t\tm_DataLength(0),\n\t\tm_Parent(a_Parent),\n\t\tm_PrevSibling(a_PrevSibling),\n\t\tm_NextSibling(-1),\n\t\tm_FirstChild(-1),\n\t\tm_LastChild(-1)\n\t{\n\t}\n} ;\n\n\n\n\n\nenum class eNBTParseError\n{\n\tnpSuccess = 0,\n\tnpNeedBytes,\n\tnpNoTopLevelCompound,\n\tnpCompoundImbalancedTag,\n\tnpStringMissingLength,\n\tnpStringInvalidLength,\n\tnpListMissingType,\n\tnpListMissingLength,\n\tnpListInvalidLength,\n\tnpSimpleMissing,\n\tnpArrayMissingLength,\n\tnpArrayInvalidLength,\n\tnpUnknownTag,\n};\n\n// The following is required to make an error_code constructible from an eNBTParseError\nstd::error_code make_error_code(eNBTParseError a_Err) noexcept;\n\nnamespace std\n{\n\ttemplate <>\n\tstruct is_error_code_enum<eNBTParseError>:\n\t\tpublic std::true_type\n\t{\n\t};\n}\n\n\n\n\n\n/** Parses and contains the parsed data\nAlso implements data accessor functions for tree traversal and value getters\nThe data pointer passed in the constructor is assumed to be valid throughout the object's life. Care must be taken not to initialize from a temporary.\nThe parser decomposes the input data into a tree of tags that is stored as an array of cFastNBTTag items,\nand accessing the tree is done by using the array indices for tags. Each tag stores the indices for its parent,\nfirst child, last child, prev sibling and next sibling, a value of -1 indicates that the indice is not valid.\nEach primitive tag also stores the length of the contained data, in bytes.\n*/\nclass cParsedNBT\n{\npublic:\n\tcParsedNBT(ContiguousByteBufferView a_Data);\n\n\tbool IsValid(void) const { return (m_Error == eNBTParseError::npSuccess); }\n\n\t/** Returns the error code for the parsing of the NBT data. */\n\tstd::error_code GetErrorCode() const { return m_Error; }\n\n\t/** Returns the position where an error occurred while parsing. */\n\tsize_t GetErrorPos() const { return m_Pos; }\n\n\t/** Returns the root tag of the hierarchy. */\n\tint GetRoot(void) const { return 0; }\n\n\t/** Returns the first child of the specified tag, or -1 if none / not applicable. */\n\tint GetFirstChild (int a_Tag) const { return m_Tags[static_cast<size_t>(a_Tag)].m_FirstChild; }\n\n\t/** Returns the last child of the specified tag, or -1 if none / not applicable. */\n\tint GetLastChild  (int a_Tag) const { return m_Tags[static_cast<size_t>(a_Tag)].m_LastChild; }\n\n\t/** Returns the next sibling of the specified tag, or -1 if none. */\n\tint GetNextSibling(int a_Tag) const { return m_Tags[static_cast<size_t>(a_Tag)].m_NextSibling; }\n\n\t/** Returns the previous sibling of the specified tag, or -1 if none. */\n\tint GetPrevSibling(int a_Tag) const { return m_Tags[static_cast<size_t>(a_Tag)].m_PrevSibling; }\n\n\t/** Returns the length of the tag's data, in bytes.\n\tNot valid for Compound or List tags! */\n\tsize_t GetDataLength(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type != TAG_List);\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type != TAG_Compound);\n\t\treturn m_Tags[static_cast<size_t>(a_Tag)].m_DataLength;\n\t}\n\n\t/** Returns the data stored in this tag.\n\tNot valid for Compound or List tags! */\n\tconst std::byte * GetData(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type != TAG_List);\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type != TAG_Compound);\n\t\treturn m_Data.data() + m_Tags[static_cast<size_t>(a_Tag)].m_DataStart;\n\t}\n\n\t/** Returns the direct child tag of the specified name, or -1 if no such tag. */\n\tint FindChildByName(int a_Tag, const AString & a_Name) const\n\t{\n\t\treturn FindChildByName(a_Tag, a_Name.c_str(), a_Name.length());\n\t}\n\n\t/** Returns the direct child tag of the specified name, or -1 if no such tag. */\n\tint FindChildByName(int a_Tag, const char * a_Name, size_t a_NameLength = 0) const;\n\n\t/** Returns the child tag of the specified path (Name1 / Name2 / Name3...), or -1 if no such tag. */\n\tint FindTagByPath(int a_Tag, const AString & a_Path) const;\n\n\teTagType GetType(int a_Tag) const { return m_Tags[static_cast<size_t>(a_Tag)].m_Type; }\n\n\t/** Returns the children type for a List tag; undefined on other tags. If list empty, returns TAG_End. */\n\teTagType GetChildrenType(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type == TAG_List);\n\t\treturn (m_Tags[static_cast<size_t>(a_Tag)].m_FirstChild < 0) ? TAG_End : m_Tags[static_cast<size_t>(m_Tags[static_cast<size_t>(a_Tag)].m_FirstChild)].m_Type;\n\t}\n\n\t/** Returns the value stored in a Byte tag. Not valid for any other tag type. */\n\tinline unsigned char GetByte(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type == TAG_Byte);\n\t\treturn static_cast<unsigned char>(m_Data[static_cast<size_t>(m_Tags[static_cast<size_t>(a_Tag)].m_DataStart)]);\n\t}\n\n\t/** Returns the value stored in a Short tag. Not valid for any other tag type. */\n\tinline Int16 GetShort(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type == TAG_Short);\n\t\treturn NetworkBufToHost<Int16>(GetData(a_Tag));\n\t}\n\n\t/** Returns the value stored in an Int tag. Not valid for any other tag type. */\n\tinline Int32 GetInt(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type == TAG_Int);\n\t\treturn NetworkBufToHost<Int32>(GetData(a_Tag));\n\t}\n\n\t/** Returns the value stored in a Long tag. Not valid for any other tag type. */\n\tinline Int64 GetLong(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type == TAG_Long);\n\t\treturn NetworkBufToHost<Int64>(GetData(a_Tag));\n\t}\n\n\t/** Returns the value stored in a Float tag. Not valid for any other tag type. */\n\tinline float GetFloat(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type == TAG_Float);\n\n\t\t// Cause a compile-time error if sizeof(float) != 4\n\t\t// If your platform produces a compiler error here, you'll need to add code that manually decodes 32-bit floats\n\t\tchar Check1[5 - sizeof(float)];  // Fails if sizeof(float) > 4\n\t\tchar Check2[sizeof(float) - 3];  // Fails if sizeof(float) < 4\n\t\tUNUSED_VAR(Check1);\n\t\tUNUSED_VAR(Check2);\n\n\t\treturn NetworkBufToHost<float>(GetData(a_Tag));\n\t}\n\n\t/** Returns the value stored in a Double tag. Not valid for any other tag type. */\n\tinline double GetDouble(int a_Tag) const\n\t{\n\t\t// Cause a compile-time error if sizeof(double) != 8\n\t\t// If your platform produces a compiler error here, you'll need to add code that manually decodes 64-bit doubles\n\t\tchar Check1[9 - sizeof(double)];  // Fails if sizeof(double) > 8\n\t\tchar Check2[sizeof(double) - 7];  // Fails if sizeof(double) < 8\n\t\tUNUSED_VAR(Check1);\n\t\tUNUSED_VAR(Check2);\n\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type == TAG_Double);\n\t\treturn NetworkBufToHost<double>(GetData(a_Tag));\n\t}\n\n\t/** Returns the value stored in a String tag. Not valid for any other tag type. */\n\tinline AString GetString(int a_Tag) const\n\t{\n\t\treturn AString(GetStringView(a_Tag));\n\t}\n\n\t/** Returns the value stored in a String tag. Not valid for any other tag type. */\n\tinline std::string_view GetStringView(int a_Tag) const\n\t{\n\t\tASSERT(m_Tags[static_cast<size_t>(a_Tag)].m_Type == TAG_String);\n\t\treturn { reinterpret_cast<const char *>(GetData(a_Tag)), GetDataLength(a_Tag) };\n\t}\n\n\t/** Returns the tag's name. For tags that are not named, returns an empty string. */\n\tinline AString GetName(int a_Tag) const\n\t{\n\t\tAString res;\n\t\tres.assign(reinterpret_cast<const char *>(m_Data.data()) + m_Tags[static_cast<size_t>(a_Tag)].m_NameStart, static_cast<size_t>(m_Tags[static_cast<size_t>(a_Tag)].m_NameLength));\n\t\treturn res;\n\t}\n\nprotected:\n\n\tContiguousByteBufferView m_Data;\n\tstd::vector<cFastNBTTag> m_Tags;\n\teNBTParseError           m_Error;  // npSuccess if parsing succeeded\n\n\t// Used while parsing:\n\tsize_t m_Pos;\n\n\teNBTParseError Parse(void);\n\teNBTParseError ReadString(size_t & a_StringStart, size_t & a_StringLen);  // Reads a simple string (2 bytes length + data), sets the string descriptors\n\teNBTParseError ReadCompound(void);  // Reads the latest tag as a compound\n\teNBTParseError ReadList(eTagType a_ChildrenType);  // Reads the latest tag as a list of items of type a_ChildrenType\n\teNBTParseError ReadTag(void);       // Reads the latest tag, depending on its m_Type setting\n\n\t/** Returns the minimum size, in bytes, of the specified tag type.\n\tUsed for sanity-checking. */\n\tstatic size_t GetMinTagSize(eTagType a_TagType);\n} ;\n\n\n\n\n\nclass cFastNBTWriter\n{\npublic:\n\tcFastNBTWriter(const AString & a_RootTagName = \"\");\n\n\tvoid BeginCompound(const AString & a_Name);\n\tvoid EndCompound(void);\n\n\tvoid BeginList(const AString & a_Name, eTagType a_ChildrenType);\n\tvoid EndList(void);\n\n\tvoid AddByte     (const AString & a_Name, unsigned char a_Value);\n\tvoid AddShort    (const AString & a_Name, Int16 a_Value);\n\tvoid AddInt      (const AString & a_Name, Int32 a_Value);\n\tvoid AddLong     (const AString & a_Name, Int64 a_Value);\n\tvoid AddFloat    (const AString & a_Name, float a_Value);\n\tvoid AddDouble   (const AString & a_Name, double a_Value);\n\tvoid AddString   (const AString & a_Name, std::string_view a_Value);\n\tvoid AddByteArray(const AString & a_Name, const char * a_Value, size_t a_NumElements);\n\tvoid AddByteArray(const AString & a_Name, size_t a_NumElements, unsigned char a_Value);\n\tvoid AddIntArray (const AString & a_Name, const Int32 * a_Value, size_t a_NumElements);\n\n\tvoid AddByteArray(const AString & a_Name, const AString & a_Value)\n\t{\n\t\tAddByteArray(a_Name, a_Value.data(), a_Value.size());\n\t}\n\n\tContiguousByteBufferView GetResult(void) const { return m_Result; }\n\n\tvoid Finish(void);\n\nprotected:\n\n\tstruct sParent\n\t{\n\t\tint m_Type;   // TAG_Compound or TAG_List\n\t\tint m_Pos;    // for TAG_List, the position of the list count\n\t\tint m_Count;  // for TAG_List, the element count\n\t\teTagType m_ItemType;  // for TAG_List, the element type\n\t} ;\n\n\tstatic const int MAX_STACK = 50;  // Highly doubtful that an NBT would be constructed this many levels deep\n\n\t// These two fields emulate a stack. A raw array is used due to speed issues - no reallocations are allowed.\n\tsParent m_Stack[MAX_STACK];\n\tint     m_CurrentStack;\n\n\tContiguousByteBuffer m_Result;\n\n\tbool IsStackTopCompound(void) const { return (m_Stack[m_CurrentStack].m_Type == TAG_Compound); }\n\n\tvoid WriteString(std::string_view a_Data);\n\n\tinline void TagCommon(const AString & a_Name, eTagType a_Type)\n\t{\n\t\t// If we're directly inside a list, check that the list is of the correct type:\n\t\tASSERT((m_Stack[m_CurrentStack].m_Type != TAG_List) || (m_Stack[m_CurrentStack].m_ItemType == a_Type));\n\n\t\tif (IsStackTopCompound())\n\t\t{\n\t\t\t// Compound: add the type and name:\n\t\t\tm_Result.push_back(std::byte(a_Type));\n\t\t\tWriteString(a_Name);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// List: add to the counter\n\t\t\tm_Stack[m_CurrentStack].m_Count++;\n\t\t}\n\t}\n} ;\n"
  },
  {
    "path": "src/WorldStorage/FireworksSerializer.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"FireworksSerializer.h\"\n#include \"../WorldStorage/FastNBT.h\"\n#include \"../BlockType.h\"\n\n\n\n\n\nvoid cFireworkItem::WriteToNBTCompound(const cFireworkItem & a_FireworkItem, cFastNBTWriter & a_Writer, const ENUM_ITEM_TYPE a_Type)\n{\n\tswitch (a_Type)\n\t{\n\t\tcase E_ITEM_FIREWORK_ROCKET:\n\t\t{\n\t\t\ta_Writer.BeginCompound(\"Fireworks\");\n\t\t\ta_Writer.AddByte(\"Flight\", static_cast<Byte>(a_FireworkItem.m_FlightTimeInTicks / 20));\n\t\t\ta_Writer.BeginList(\"Explosions\", TAG_Compound);\n\t\t\ta_Writer.BeginCompound(\"\");\n\t\t\ta_Writer.AddByte(\"Flicker\", a_FireworkItem.m_HasFlicker);\n\t\t\ta_Writer.AddByte(\"Trail\", a_FireworkItem.m_HasTrail);\n\t\t\ta_Writer.AddByte(\"Type\", a_FireworkItem.m_Type);\n\t\t\tif (!a_FireworkItem.m_Colours.empty())\n\t\t\t{\n\t\t\t\ta_Writer.AddIntArray(\"Colors\", a_FireworkItem.m_Colours.data(), a_FireworkItem.m_Colours.size());\n\t\t\t}\n\t\t\tif (!a_FireworkItem.m_FadeColours.empty())\n\t\t\t{\n\t\t\t\ta_Writer.AddIntArray(\"FadeColors\", a_FireworkItem.m_FadeColours.data(), a_FireworkItem.m_FadeColours.size());\n\t\t\t}\n\t\t\ta_Writer.EndCompound();\n\t\t\ta_Writer.EndList();\n\t\t\ta_Writer.EndCompound();\n\t\t\tbreak;\n\t\t}\n\t\tcase E_ITEM_FIREWORK_STAR:\n\t\t{\n\t\t\ta_Writer.BeginCompound(\"Explosion\");\n\t\t\ta_Writer.AddByte(\"Flicker\", a_FireworkItem.m_HasFlicker);\n\t\t\ta_Writer.AddByte(\"Trail\", a_FireworkItem.m_HasTrail);\n\t\t\ta_Writer.AddByte(\"Type\", a_FireworkItem.m_Type);\n\t\t\tif (!a_FireworkItem.m_Colours.empty())\n\t\t\t{\n\t\t\t\ta_Writer.AddIntArray(\"Colors\", a_FireworkItem.m_Colours.data(), a_FireworkItem.m_Colours.size());\n\t\t\t}\n\t\t\tif (!a_FireworkItem.m_FadeColours.empty())\n\t\t\t{\n\t\t\t\ta_Writer.AddIntArray(\"FadeColors\", a_FireworkItem.m_FadeColours.data(), a_FireworkItem.m_FadeColours.size());\n\t\t\t}\n\t\t\ta_Writer.EndCompound();\n\t\t\tbreak;\n\t\t}\n\t\tdefault: ASSERT(!\"Unhandled firework item!\"); break;\n\t}\n}\n\n\n\n\n\nvoid cFireworkItem::ParseFromNBT(cFireworkItem & a_FireworkItem, const cParsedNBT & a_NBT, int a_TagIdx, const ENUM_ITEM_TYPE a_Type)\n{\n\tif (a_TagIdx < 0)\n\t{\n\t\treturn;\n\t}\n\n\tswitch (a_Type)\n\t{\n\t\tcase E_ITEM_FIREWORK_STAR:\n\t\t{\n\t\t\tfor (int explosiontag = a_NBT.GetFirstChild(a_TagIdx); explosiontag >= 0; explosiontag = a_NBT.GetNextSibling(explosiontag))\n\t\t\t{\n\t\t\t\teTagType TagType = a_NBT.GetType(explosiontag);\n\t\t\t\tif (TagType == TAG_Byte)  // Custon name tag\n\t\t\t\t{\n\t\t\t\t\tAString ExplosionName = a_NBT.GetName(explosiontag);\n\n\t\t\t\t\tif (ExplosionName == \"Flicker\")\n\t\t\t\t\t{\n\t\t\t\t\t\ta_FireworkItem.m_HasFlicker = (a_NBT.GetByte(explosiontag) == 1);\n\t\t\t\t\t}\n\t\t\t\t\telse if (ExplosionName == \"Trail\")\n\t\t\t\t\t{\n\t\t\t\t\t\ta_FireworkItem.m_HasTrail = (a_NBT.GetByte(explosiontag) == 1);\n\t\t\t\t\t}\n\t\t\t\t\telse if (ExplosionName == \"Type\")\n\t\t\t\t\t{\n\t\t\t\t\t\ta_FireworkItem.m_Type = a_NBT.GetByte(explosiontag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (TagType == TAG_IntArray)\n\t\t\t\t{\n\t\t\t\t\tAString ExplosionName = a_NBT.GetName(explosiontag);\n\n\t\t\t\t\tif (ExplosionName == \"Colors\")\n\t\t\t\t\t{\n\t\t\t\t\t\t// Divide by four as data length returned in bytes\n\t\t\t\t\t\tsize_t DataLength = a_NBT.GetDataLength(explosiontag);\n\t\t\t\t\t\t// round to the next highest multiple of four\n\t\t\t\t\t\tDataLength -= DataLength % 4;\n\t\t\t\t\t\tif (DataLength == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst auto * ColourData = (a_NBT.GetData(explosiontag));\n\t\t\t\t\t\tfor (size_t i = 0; i < DataLength; i += 4)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_FireworkItem.m_Colours.push_back(NetworkBufToHost<Int32>(ColourData + i));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (ExplosionName == \"FadeColors\")\n\t\t\t\t\t{\n\t\t\t\t\t\tsize_t DataLength = a_NBT.GetDataLength(explosiontag) / 4;\n\t\t\t\t\t\t// round to the next highest multiple of four\n\t\t\t\t\t\tDataLength -= DataLength % 4;\n\t\t\t\t\t\tif (DataLength == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst auto * FadeColourData = (a_NBT.GetData(explosiontag));\n\t\t\t\t\t\tfor (size_t i = 0; i < DataLength; i += 4)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta_FireworkItem.m_FadeColours.push_back(NetworkBufToHost<Int32>(FadeColourData + i));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase E_ITEM_FIREWORK_ROCKET:\n\t\t{\n\t\t\tfor (int fireworkstag = a_NBT.GetFirstChild(a_TagIdx); fireworkstag >= 0; fireworkstag = a_NBT.GetNextSibling(fireworkstag))\n\t\t\t{\n\t\t\t\teTagType TagType = a_NBT.GetType(fireworkstag);\n\t\t\t\tif (TagType == TAG_Byte)  // Custon name tag\n\t\t\t\t{\n\t\t\t\t\tif (a_NBT.GetName(fireworkstag) == \"Flight\")\n\t\t\t\t\t{\n\t\t\t\t\t\ta_FireworkItem.m_FlightTimeInTicks = a_NBT.GetByte(fireworkstag) * 20;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ((TagType == TAG_List) && (a_NBT.GetName(fireworkstag) == \"Explosions\"))\n\t\t\t\t{\n\t\t\t\t\tint ExplosionsChild = a_NBT.GetFirstChild(fireworkstag);\n\t\t\t\t\tif ((a_NBT.GetType(ExplosionsChild) == TAG_Compound) && (a_NBT.GetName(ExplosionsChild).empty()))\n\t\t\t\t\t{\n\t\t\t\t\t\tParseFromNBT(a_FireworkItem, a_NBT, ExplosionsChild, E_ITEM_FIREWORK_STAR);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: ASSERT(!\"Unhandled firework item!\"); break;\n\t}\n}\n\n\n\n\n\nAString cFireworkItem::ColoursToString(const cFireworkItem & a_FireworkItem)\n{\n\tAString Result;\n\tfor (const auto col: a_FireworkItem.m_Colours)\n\t{\n\t\tResult.append(fmt::format(FMT_STRING(\"{};\"), col));\n\t}\n\treturn Result;\n}\n\n\n\n\n\nvoid cFireworkItem::ColoursFromString(const AString & a_String, cFireworkItem & a_FireworkItem)\n{\n\tAStringVector Split = StringSplit(a_String, \";\");\n\n\tfor (size_t itr = 0; itr < Split.size(); ++itr)\n\t{\n\t\tif (Split[itr].empty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\ta_FireworkItem.m_Colours.push_back(atoi(Split[itr].c_str()));\n\t}\n}\n\n\n\n\n\nAString cFireworkItem::FadeColoursToString(const cFireworkItem & a_FireworkItem)\n{\n\tAString Result;\n\tfor (const auto col: a_FireworkItem.m_FadeColours)\n\t{\n\t\tResult.append(fmt::format(FMT_STRING(\"{};\"), col));\n\t}\n\treturn Result;\n}\n\n\n\n\n\nvoid cFireworkItem::FadeColoursFromString(const AString & a_String, cFireworkItem & a_FireworkItem)\n{\n\tAStringVector Split = StringSplit(a_String, \";\");\n\n\tfor (size_t itr = 0; itr < Split.size(); ++itr)\n\t{\n\t\tif (Split[itr].empty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\ta_FireworkItem.m_FadeColours.push_back(atoi(Split[itr].c_str()));\n\t}\n}\n\n\n\n\n\nint cFireworkItem::GetVanillaColourCodeFromDye(NIBBLETYPE a_DyeMeta)\n{\n\t/*\n\tColours are supposed to be calculated via: R << 16 + G << 8 + B\n\tHowever, the RGB values fireworks use aren't the same as the ones for dyes (the ones listed in the MC Wiki)\n\tTherefore, here is a list of numbers gotten via the Protocol Proxy\n\t*/\n\n\tswitch (a_DyeMeta)\n\t{\n\t\tcase E_META_DYE_BLACK: return 0x1E1B1B;\n\t\tcase E_META_DYE_RED: return 0xB3312C;\n\t\tcase E_META_DYE_GREEN: return 0x3B511A;\n\t\tcase E_META_DYE_BROWN:  return 0x51301A;\n\t\tcase E_META_DYE_BLUE: return 0x253192;\n\t\tcase E_META_DYE_PURPLE: return 0x7B2FBE;\n\t\tcase E_META_DYE_CYAN: return 0x287697;\n\t\tcase E_META_DYE_LIGHTGRAY: return 0xABABAB;\n\t\tcase E_META_DYE_GRAY: return 0x434343;\n\t\tcase E_META_DYE_PINK: return 0xD88198;\n\t\tcase E_META_DYE_LIGHTGREEN: return 0x41CD34;\n\t\tcase E_META_DYE_YELLOW: return 0xDECF2A;\n\t\tcase E_META_DYE_LIGHTBLUE: return 0x6689D3;\n\t\tcase E_META_DYE_MAGENTA: return 0xC354CD;\n\t\tcase E_META_DYE_ORANGE: return 0xEB8844;\n\t\tcase E_META_DYE_WHITE: return 0xF0F0F0;\n\t\tdefault: ASSERT(!\"Unhandled dye meta whilst trying to get colour code for fireworks!\"); return 0;\n\t}\n}\n"
  },
  {
    "path": "src/WorldStorage/FireworksSerializer.h",
    "content": "\n// FireworksSerializer.h\n\n// Declares the cFireworkItem class representing a firework or firework star\n\n\n\n\n\n#pragma once\n\n\n#include \"../BlockType.h\"\n\n\n\n\n\nclass cFastNBTWriter;\nclass cParsedNBT;\n\n\n\n\n\nclass cFireworkItem\n{\npublic:\n\tcFireworkItem(void) :\n\t\tm_HasFlicker(false),\n\t\tm_HasTrail(false),\n\t\tm_Type(0),\n\t\tm_FlightTimeInTicks(0)\n\t{\n\t}\n\n\tinline void CopyFrom(const cFireworkItem & a_Item)\n\t{\n\t\tm_FlightTimeInTicks = a_Item.m_FlightTimeInTicks;\n\t\tm_HasFlicker = a_Item.m_HasFlicker;\n\t\tm_HasTrail = a_Item.m_HasTrail;\n\t\tm_Type = a_Item.m_Type;\n\t\tm_Colours = a_Item.m_Colours;\n\t\tm_FadeColours = a_Item.m_FadeColours;\n\t}\n\n\tinline void EmptyData(void)\n\t{\n\t\tm_FlightTimeInTicks = 0;\n\t\tm_HasFlicker = false;\n\t\tm_Type = 0;\n\t\tm_HasTrail = false;\n\t\tm_Colours.clear();\n\t\tm_FadeColours.clear();\n\t}\n\n\tinline bool IsEqualTo(const cFireworkItem & a_Item) const\n\t{\n\t\treturn\n\t\t\t(\n\t\t\t(m_FlightTimeInTicks == a_Item.m_FlightTimeInTicks) &&\n\t\t\t(m_HasFlicker == a_Item.m_HasFlicker) &&\n\t\t\t(m_HasTrail == a_Item.m_HasTrail) &&\n\t\t\t(m_Type == a_Item.m_Type) &&\n\t\t\t(m_Colours == a_Item.m_Colours) &&\n\t\t\t(m_FadeColours == a_Item.m_FadeColours)\n\t\t\t);\n\t}\n\n\t/** Writes firework NBT data to a Writer object */\n\tstatic void WriteToNBTCompound(const cFireworkItem & a_FireworkItem, cFastNBTWriter & a_Writer, const ENUM_ITEM_TYPE a_Type);\n\n\t/** Reads NBT data from a NBT object and populates a FireworkItem with it */\n\tstatic void ParseFromNBT(cFireworkItem & a_FireworkItem, const cParsedNBT & a_NBT, int a_TagIdx, const ENUM_ITEM_TYPE a_Type);\n\n\t/** Converts the firework's vector of colours into a string of values separated by a semicolon */\n\tstatic AString ColoursToString(const cFireworkItem & a_FireworkItem);\n\n\t/** Parses a string containing encoded firework colours and populates a FireworkItem with it */\n\tstatic void ColoursFromString(const AString & a_String, cFireworkItem & a_FireworkItem);\n\n\t/** Converts the firework's vector of fade colours into a string of values separated by a semicolon */\n\tstatic AString FadeColoursToString(const cFireworkItem & a_FireworkItem);\n\n\t/** Parses a string containing encoded firework fade colours and populates a FireworkItem with it */\n\tstatic void FadeColoursFromString(const AString & a_String, cFireworkItem & a_FireworkItem);\n\n\t/** Returns a colour code for fireworks used by the network code */\n\tstatic int GetVanillaColourCodeFromDye(NIBBLETYPE a_DyeMeta);\n\n\tbool m_HasFlicker;\n\tbool m_HasTrail;\n\tNIBBLETYPE m_Type;\n\tshort m_FlightTimeInTicks;\n\tstd::vector<int> m_Colours;\n\tstd::vector<int> m_FadeColours;\n};\n"
  },
  {
    "path": "src/WorldStorage/MapSerializer.cpp",
    "content": "\n// MapSerializer.cpp\n\n\n#include \"Globals.h\"\n#include \"MapSerializer.h\"\n#include \"OSSupport/GZipFile.h\"\n#include \"FastNBT.h\"\n\n#include \"../Map.h\"\n#include \"../World.h\"\n\n\n\n\n\ncMapSerializer::cMapSerializer(const AString & a_WorldName, cMap * a_Map):\n\tm_Map(a_Map)\n{\n\tauto DataPath = fmt::format(FMT_STRING(\"{}{}data\"), a_WorldName, cFile::PathSeparator());\n\tm_Path = fmt::format(FMT_STRING(\"{}{}map_{}.dat\"), DataPath, cFile::PathSeparator(), a_Map->GetID());\n\tcFile::CreateFolder(DataPath);\n}\n\n\n\n\n\nbool cMapSerializer::Load()\n{\n\tconst auto Data = GZipFile::ReadRestOfFile(m_Path);\n\tconst cParsedNBT NBT(Data.GetView());\n\n\tif (!NBT.IsValid())\n\t{\n\t\t// NBT Parsing failed\n\t\treturn false;\n\t}\n\n\treturn LoadMapFromNBT(NBT);\n}\n\n\n\n\n\nbool cMapSerializer::Save(void)\n{\n\tcFastNBTWriter Writer;\n\tSaveMapToNBT(Writer);\n\tWriter.Finish();\n\n\t#ifndef NDEBUG\n\tcParsedNBT TestParse(Writer.GetResult());\n\tASSERT(TestParse.IsValid());\n\t#endif  // !NDEBUG\n\n\tGZipFile::Write(m_Path, Writer.GetResult());\n\n\treturn true;\n}\n\n\n\n\n\nvoid cMapSerializer::SaveMapToNBT(cFastNBTWriter & a_Writer)\n{\n\ta_Writer.BeginCompound(\"data\");\n\n\ta_Writer.AddByte(\"scale\", static_cast<Byte>(m_Map->GetScale()));\n\ta_Writer.AddByte(\"dimension\", static_cast<Byte>(m_Map->GetDimension()));\n\n\ta_Writer.AddShort(\"width\",  static_cast<Int16>(m_Map->GetWidth()));\n\ta_Writer.AddShort(\"height\", static_cast<Int16>(m_Map->GetHeight()));\n\n\ta_Writer.AddInt(\"xCenter\", m_Map->GetCenterX());\n\ta_Writer.AddInt(\"zCenter\", m_Map->GetCenterZ());\n\n\tconst cMap::cColorList & Data = m_Map->GetData();\n\ta_Writer.AddByteArray(\"colors\", reinterpret_cast<const char *>(Data.data()), Data.size());\n\n\ta_Writer.EndCompound();\n}\n\n\n\n\n\nbool cMapSerializer::LoadMapFromNBT(const cParsedNBT & a_NBT)\n{\n\tint Data = a_NBT.FindChildByName(0, \"data\");\n\tif (Data < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tint CurrLine = a_NBT.FindChildByName(Data, \"scale\");\n\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Byte))\n\t{\n\t\tunsigned int Scale = static_cast<unsigned int>(a_NBT.GetByte(CurrLine));\n\t\tm_Map->SetScale(Scale);\n\t}\n\n\tCurrLine = a_NBT.FindChildByName(Data, \"dimension\");\n\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Byte))\n\t{\n\t\teDimension Dimension = static_cast<eDimension>(a_NBT.GetByte(CurrLine));\n\n\t\tif (Dimension != m_Map->m_World->GetDimension())\n\t\t{\n\t\t\t// TODO 2014-03-20 xdot: We should store nether maps in nether worlds, e.t.c.\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tCurrLine = a_NBT.FindChildByName(Data, \"width\");\n\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Short))\n\t{\n\t\tunsigned int Width = static_cast<unsigned int>(a_NBT.GetShort(CurrLine));\n\t\tif (Width != 128)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tm_Map->m_Width = Width;\n\t}\n\n\tCurrLine = a_NBT.FindChildByName(Data, \"height\");\n\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Short))\n\t{\n\t\tunsigned int Height = static_cast<unsigned int>(a_NBT.GetShort(CurrLine));\n\t\tif (Height >= cChunkDef::Height)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tm_Map->m_Height = Height;\n\t}\n\n\tCurrLine = a_NBT.FindChildByName(Data, \"xCenter\");\n\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Int))\n\t{\n\t\tint CenterX = a_NBT.GetInt(CurrLine);\n\t\tm_Map->m_CenterX = CenterX;\n\t}\n\n\tCurrLine = a_NBT.FindChildByName(Data, \"zCenter\");\n\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Int))\n\t{\n\t\tint CenterZ = a_NBT.GetInt(CurrLine);\n\t\tm_Map->m_CenterZ = CenterZ;\n\t}\n\n\tunsigned int NumPixels = m_Map->GetNumPixels();\n\tm_Map->m_Data.resize(NumPixels);\n\n\tCurrLine = a_NBT.FindChildByName(Data, \"colors\");\n\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_ByteArray))\n\t{\n\t\tmemcpy(m_Map->m_Data.data(), a_NBT.GetData(CurrLine), NumPixels);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\ncIDCountSerializer::cIDCountSerializer(const AString & a_WorldName) : m_MapCount(0)\n{\n\tauto DataPath = fmt::format(FMT_STRING(\"{}{}data\"), a_WorldName, cFile::PathSeparator());\n\tm_Path = fmt::format(FMT_STRING(\"{}{}idcounts.dat\"), DataPath, cFile::PathSeparator());\n\tcFile::CreateFolder(DataPath);\n}\n\n\n\n\n\nbool cIDCountSerializer::Load()\n{\n\tAString Data = cFile::ReadWholeFile(m_Path);\n\tif (Data.empty())\n\t{\n\t\treturn false;\n\t}\n\n\t// NOTE: idcounts.dat is not compressed (raw format)\n\n\t// Parse the NBT data:\n\tcParsedNBT NBT({ reinterpret_cast<const std::byte *>(Data.data()), Data.size() });\n\tif (!NBT.IsValid())\n\t{\n\t\t// NBT Parsing failed\n\t\treturn false;\n\t}\n\n\tint CurrLine = NBT.FindChildByName(0, \"map\");\n\tif (CurrLine >= 0)\n\t{\n\t\tm_MapCount = static_cast<unsigned int>(NBT.GetShort(CurrLine) + 1);\n\t}\n\telse\n\t{\n\t\tm_MapCount = 0;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cIDCountSerializer::Save(void)\n{\n\tcFastNBTWriter Writer;\n\n\tif (m_MapCount > 0)\n\t{\n\t\tWriter.AddShort(\"map\", static_cast<Int16>(m_MapCount - 1));\n\t}\n\n\tWriter.Finish();\n\n\t#ifndef NDEBUG\n\tcParsedNBT TestParse(Writer.GetResult());\n\tASSERT(TestParse.IsValid());\n\t#endif  // !NDEBUG\n\n\tcFile File;\n\tif (!File.Open(m_Path, cFile::fmWrite))\n\t{\n\t\treturn false;\n\t}\n\n\t// NOTE: idcounts.dat is not compressed (raw format)\n\n\tFile.Write(Writer.GetResult().data(), Writer.GetResult().size());\n\tFile.Close();\n\n\treturn true;\n}\n"
  },
  {
    "path": "src/WorldStorage/MapSerializer.h",
    "content": "\n// MapSerializer.h\n\n// Declares the cMapSerializer class that is used for saving maps into NBT format used by Anvil\n\n\n\n\n\n#pragma once\n\n\n\n\n\n// fwd:\nclass cFastNBTWriter;\nclass cParsedNBT;\nclass cMap;\n\n\n\n\n/** Utility class used to serialize maps. */\nclass cMapSerializer\n{\npublic:\n\n\tcMapSerializer(const AString & a_WorldName, cMap * a_Map);\n\n\t/** Try to load the map */\n\tbool Load(void);\n\n\t/** Try to save the map */\n\tbool Save(void);\n\n\nprivate:\n\n\tvoid SaveMapToNBT(cFastNBTWriter & a_Writer);\n\n\tbool LoadMapFromNBT(const cParsedNBT & a_NBT);\n\n\tcMap * m_Map;\n\n\tAString m_Path;\n\n\n} ;\n\n\n\n\n/** Utility class used to serialize item ID counts.\nIn order to perform bounds checking (while loading),\nthe last registered ID of each item is serialized to an NBT file.\n*/\nclass cIDCountSerializer\n{\npublic:\n\n\tcIDCountSerializer(const AString & a_WorldName);\n\n\t/** Try to load the ID counts */\n\tbool Load(void);\n\n\t/** Try to save the ID counts */\n\tbool Save(void);\n\n\tinline unsigned int GetMapCount(void) const { return m_MapCount; }\n\n\tinline void SetMapCount(unsigned int a_MapCount) { m_MapCount = a_MapCount; }\n\n\nprivate:\n\n\tAString m_Path;\n\n\tunsigned int m_MapCount;\n\n};\n\n\n\n\n"
  },
  {
    "path": "src/WorldStorage/NBTChunkSerializer.cpp",
    "content": "\n// NBTChunkSerializer.cpp\n\n\n#include \"Globals.h\"\n#include \"NBTChunkSerializer.h\"\n#include \"EnchantmentSerializer.h\"\n#include \"NamespaceSerializer.h\"\n#include \"../ChunkDataCallback.h\"\n#include \"../ItemGrid.h\"\n#include \"../StringCompression.h\"\n#include \"../UUID.h\"\n#include \"FastNBT.h\"\n\n#include \"../BlockEntities/BannerEntity.h\"\n#include \"../BlockEntities/BeaconEntity.h\"\n#include \"../BlockEntities/BedEntity.h\"\n#include \"../BlockEntities/BrewingstandEntity.h\"\n#include \"../BlockEntities/ChestEntity.h\"\n#include \"../BlockEntities/CommandBlockEntity.h\"\n#include \"../BlockEntities/DispenserEntity.h\"\n#include \"../BlockEntities/DropperEntity.h\"\n#include \"../BlockEntities/EnchantingTableEntity.h\"\n#include \"../BlockEntities/EnderChestEntity.h\"\n#include \"../BlockEntities/EndPortalEntity.h\"\n#include \"../BlockEntities/FurnaceEntity.h\"\n#include \"../BlockEntities/HopperEntity.h\"\n#include \"../BlockEntities/JukeboxEntity.h\"\n#include \"../BlockEntities/MobSpawnerEntity.h\"\n#include \"../BlockEntities/NoteEntity.h\"\n#include \"../BlockEntities/SignEntity.h\"\n#include \"../BlockEntities/MobHeadEntity.h\"\n#include \"../BlockEntities/FlowerPotEntity.h\"\n\n#include \"../Entities/Entity.h\"\n#include \"../Entities/EnderCrystal.h\"\n#include \"../Entities/FallingBlock.h\"\n#include \"../Entities/Boat.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/SplashPotionEntity.h\"\n#include \"../Entities/TNTEntity.h\"\n#include \"../Entities/ExpOrb.h\"\n#include \"../Entities/HangingEntity.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/LeashKnot.h\"\n#include \"../Entities/Painting.h\"\n\n#include \"../Mobs/IncludeAllMonsters.h\"\n\n\n\n\n\n/** Collects and stores the chunk data via the cChunkDataCallback interface */\nclass SerializerCollector final :\n\tpublic cChunkDataCopyCollector\n{\npublic:\n\n\t// The data collected from the chunk:\n\tUInt8 Biomes[cChunkDef::Width * cChunkDef::Width];\n\tint Heights[cChunkDef::Width * cChunkDef::Width];\n\n\t/** True if a tag has been opened in the callbacks and not yet closed. */\n\tbool mIsTagOpen;\n\n\t/** True if any Entity has already been received and processed. */\n\tbool mHasHadEntity;\n\n\t/** True if any BlockEntity has already been received and processed. */\n\tbool mHasHadBlockEntity;\n\n\t/** True if the chunk lighting is valid. */\n\tbool mIsLightValid;\n\n\t/** The NBT writer used to store the data. */\n\tcFastNBTWriter & mWriter;\n\n\n\n\n\n\tSerializerCollector(cFastNBTWriter & aWriter):\n\t\tmIsTagOpen(false),\n\t\tmHasHadEntity(false),\n\t\tmHasHadBlockEntity(false),\n\t\tmIsLightValid(false),\n\t\tmWriter(aWriter)\n\t{\n\t}\n\n\n\n\n\n\tvirtual void LightIsValid(bool a_IsLightValid) override\n\t{\n\t\tmIsLightValid = a_IsLightValid;\n\t}\n\n\n\n\n\n\tvirtual void HeightMap(const cChunkDef::HeightMap & a_HeightMap) override\n\t{\n\t\tfor (int RelZ = 0; RelZ < cChunkDef::Width; RelZ++)\n\t\t{\n\t\t\tfor (int RelX = 0; RelX < cChunkDef::Width; RelX++)\n\t\t\t{\n\t\t\t\tHeights[RelX + RelZ * cChunkDef::Width] = cChunkDef::GetHeight(a_HeightMap, RelX, RelZ);\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual void BiomeMap(const cChunkDef::BiomeMap & a_BiomeMap) override\n\t{\n\t\tfor (size_t i = 0; i < ARRAYCOUNT(Biomes); i++)\n\t\t{\n\t\t\tif (a_BiomeMap[i] < 255)\n\t\t\t{\n\t\t\t\t// Normal MC biome, copy as-is:\n\t\t\t\tBiomes[i] = static_cast<Byte>(a_BiomeMap[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// TODO: MCS-specific biome, need to map to some basic MC biome:\n\t\t\t\tASSERT(!\"Unimplemented MCS-specific biome\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}  // for i - mBiomeMap[]\n\t}\n\n\n\n\n\n\tvirtual void Entity(cEntity * a_Entity) override\n\t{\n\t\t// Add entity into NBT:\n\t\tif (mIsTagOpen)\n\t\t{\n\t\t\tif (!mHasHadEntity)\n\t\t\t{\n\t\t\t\tmWriter.EndList();\n\t\t\t\tmWriter.BeginList(\"Entities\", TAG_Compound);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmWriter.BeginList(\"Entities\", TAG_Compound);\n\t\t}\n\t\tmIsTagOpen = true;\n\t\tmHasHadEntity = true;\n\n\t\tswitch (a_Entity->GetEntityType())\n\t\t{\n\t\t\tcase cEntity::etBoat:         AddBoatEntity        (static_cast<cBoat *>            (a_Entity)); break;\n\t\t\tcase cEntity::etEnderCrystal: AddEnderCrystalEntity(static_cast<cEnderCrystal *>    (a_Entity)); break;\n\t\t\tcase cEntity::etFallingBlock: AddFallingBlockEntity(static_cast<cFallingBlock *>    (a_Entity)); break;\n\t\t\tcase cEntity::etMinecart:     AddMinecartEntity    (static_cast<cMinecart *>        (a_Entity)); break;\n\t\t\tcase cEntity::etMonster:      AddMonsterEntity     (static_cast<cMonster *>         (a_Entity)); break;\n\t\t\tcase cEntity::etPickup:       AddPickupEntity      (static_cast<cPickup *>          (a_Entity)); break;\n\t\t\tcase cEntity::etProjectile:   AddProjectileEntity  (static_cast<cProjectileEntity *>(a_Entity)); break;\n\t\t\tcase cEntity::etTNT:          AddTNTEntity         (static_cast<cTNTEntity *>       (a_Entity)); break;\n\t\t\tcase cEntity::etExpOrb:       AddExpOrbEntity      (static_cast<cExpOrb *>          (a_Entity)); break;\n\t\t\tcase cEntity::etItemFrame:    AddItemFrameEntity   (static_cast<cItemFrame *>       (a_Entity)); break;\n\t\t\tcase cEntity::etLeashKnot:    AddLeashKnotEntity   (static_cast<cLeashKnot *>       (a_Entity)); break;\n\t\t\tcase cEntity::etPainting:     AddPaintingEntity    (static_cast<cPainting *>        (a_Entity)); break;\n\t\t\tcase cEntity::etPlayer: return;  // Players aren't saved into the world\n\t\t\tcase cEntity::etFloater: return;  // Floaters aren't saved either\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled entity type is being saved\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\tvirtual void BlockEntity(cBlockEntity * a_Entity) override\n\t{\n\t\tif (mIsTagOpen)\n\t\t{\n\t\t\tif (!mHasHadBlockEntity)\n\t\t\t{\n\t\t\t\tmWriter.EndList();\n\t\t\t\tmWriter.BeginList(\"TileEntities\", TAG_Compound);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmWriter.BeginList(\"TileEntities\", TAG_Compound);\n\t\t}\n\t\tmIsTagOpen = true;\n\n\t\t// Add tile-entity into NBT:\n\t\tswitch (a_Entity->GetBlockType())\n\t\t{\n\t\t\t// Banners:\n\t\t\tcase E_BLOCK_STANDING_BANNER:\n\t\t\tcase E_BLOCK_WALL_BANNER:       AddBannerEntity         (static_cast<cBannerEntity *>         (a_Entity)); break;\n\n\t\t\t// Others:\n\t\t\tcase E_BLOCK_BEACON:            AddBeaconEntity         (static_cast<cBeaconEntity *>         (a_Entity)); break;\n\t\t\tcase E_BLOCK_BED:               AddBedEntity            (static_cast<cBedEntity *>            (a_Entity)); break;\n\t\t\tcase E_BLOCK_BREWING_STAND:     AddBrewingstandEntity   (static_cast<cBrewingstandEntity *>   (a_Entity)); break;\n\t\t\tcase E_BLOCK_CHEST:             AddChestEntity          (static_cast<cChestEntity *>          (a_Entity), a_Entity->GetBlockType()); break;\n\t\t\tcase E_BLOCK_COMMAND_BLOCK:     AddCommandBlockEntity   (static_cast<cCommandBlockEntity *>   (a_Entity)); break;\n\t\t\tcase E_BLOCK_DISPENSER:         AddDispenserEntity      (static_cast<cDispenserEntity *>      (a_Entity)); break;\n\t\t\tcase E_BLOCK_DROPPER:           AddDropperEntity        (static_cast<cDropperEntity *>        (a_Entity)); break;\n\t\t\tcase E_BLOCK_ENCHANTMENT_TABLE: AddEnchantingTableEntity(static_cast<cEnchantingTableEntity *>(a_Entity)); break;\n\t\t\tcase E_BLOCK_ENDER_CHEST:       AddEnderchestEntity     (static_cast<cEnderChestEntity *>     (a_Entity)); break;\n\t\t\tcase E_BLOCK_END_PORTAL:        AddEndPortalEntity      (static_cast<cEndPortalEntity *>      (a_Entity)); break;\n\t\t\tcase E_BLOCK_FLOWER_POT:        AddFlowerPotEntity      (static_cast<cFlowerPotEntity *>      (a_Entity)); break;\n\t\t\tcase E_BLOCK_FURNACE:           AddFurnaceEntity        (static_cast<cFurnaceEntity *>        (a_Entity)); break;\n\t\t\tcase E_BLOCK_HEAD:              AddMobHeadEntity        (static_cast<cMobHeadEntity *>        (a_Entity)); break;\n\t\t\tcase E_BLOCK_HOPPER:            AddHopperEntity         (static_cast<cHopperEntity *>         (a_Entity)); break;\n\t\t\tcase E_BLOCK_JUKEBOX:           AddJukeboxEntity        (static_cast<cJukeboxEntity *>        (a_Entity)); break;\n\t\t\tcase E_BLOCK_LIT_FURNACE:       AddFurnaceEntity        (static_cast<cFurnaceEntity *>        (a_Entity)); break;\n\t\t\tcase E_BLOCK_MOB_SPAWNER:       AddMobSpawnerEntity     (static_cast<cMobSpawnerEntity *>     (a_Entity)); break;\n\t\t\tcase E_BLOCK_NOTE_BLOCK:        AddNoteEntity           (static_cast<cNoteEntity *>           (a_Entity)); break;\n\t\t\tcase E_BLOCK_SIGN_POST:         AddSignEntity           (static_cast<cSignEntity *>           (a_Entity)); break;\n\t\t\tcase E_BLOCK_TRAPPED_CHEST:     AddChestEntity          (static_cast<cChestEntity *>          (a_Entity), a_Entity->GetBlockType()); break;\n\t\t\tcase E_BLOCK_WALLSIGN:          AddSignEntity           (static_cast<cSignEntity *>           (a_Entity)); break;\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tASSERT(!\"Unhandled block entity saved into Anvil\");\n\t\t\t}\n\t\t}\n\t\tmHasHadBlockEntity = true;\n\t}\n\n\n\n\n\n\tvoid Finish(void)\n\t{\n\t\tif (mIsTagOpen)\n\t\t{\n\t\t\tmWriter.EndList();\n\t\t}\n\n\t\t// Check if \"Entity\" and \"TileEntities\" lists exists. MCEdit requires this.\n\t\tif (!mHasHadEntity)\n\t\t{\n\t\t\tmWriter.BeginList(\"Entities\", TAG_Compound);\n\t\t\tmWriter.EndList();\n\t\t}\n\t\tif (!mHasHadBlockEntity)\n\t\t{\n\t\t\tmWriter.BeginList(\"TileEntities\", TAG_Compound);\n\t\t\tmWriter.EndList();\n\t\t}\n\t}\n\n\n\n\n\n\t/** Writes an item into the writer.\n\tIf aSlot >= 0, adds the Slot tag.\n\tThe compound is named as requested (empty name by default). */\n\tvoid AddItem(const cItem & a_Item, int a_Slot, const AString & a_CompoundName = AString())\n\t{\n\t\tmWriter.BeginCompound(a_CompoundName);\n\t\tmWriter.AddShort(\"id\",         static_cast<Int16>(a_Item.m_ItemType));\n\t\tmWriter.AddShort(\"Damage\",     static_cast<Int16>((a_Item.m_ItemDamage)));\n\t\tmWriter.AddByte (\"Count\",      static_cast<Byte>(a_Item.m_ItemCount));\n\t\tif (a_Slot >= 0)\n\t\t{\n\t\t\tmWriter.AddByte (\"Slot\", static_cast<unsigned char>(a_Slot));\n\t\t}\n\n\t\t// Write the tag compound (for enchantment, firework, custom name and repair cost):\n\t\tif (\n\t\t\t(!a_Item.m_Enchantments.IsEmpty()) ||\n\t\t\t((a_Item.m_ItemType == E_ITEM_FIREWORK_ROCKET) || (a_Item.m_ItemType == E_ITEM_FIREWORK_STAR)) ||\n\t\t\t(a_Item.m_RepairCost > 0) ||\n\t\t\t(a_Item.m_CustomName != \"\") ||\n\t\t\t(!a_Item.m_LoreTable.empty())\n\t\t)\n\t\t{\n\t\t\tmWriter.BeginCompound(\"tag\");\n\t\t\t\tif (a_Item.m_RepairCost > 0)\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddInt(\"RepairCost\", a_Item.m_RepairCost);\n\t\t\t\t}\n\n\t\t\t\tif ((a_Item.m_CustomName != \"\") || (!a_Item.m_LoreTable.empty()))\n\t\t\t\t{\n\t\t\t\t\tmWriter.BeginCompound(\"display\");\n\t\t\t\t\tif (a_Item.m_CustomName != \"\")\n\t\t\t\t\t{\n\t\t\t\t\t\tmWriter.AddString(\"Name\", a_Item.m_CustomName);\n\t\t\t\t\t}\n\t\t\t\t\tif (!a_Item.m_LoreTable.empty())\n\t\t\t\t\t{\n\t\t\t\t\t\tmWriter.BeginList(\"Lore\", TAG_String);\n\n\t\t\t\t\t\tfor (const auto & Line : a_Item.m_LoreTable)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmWriter.AddString(\"\", Line);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmWriter.EndList();\n\t\t\t\t\t}\n\t\t\t\t\tmWriter.EndCompound();\n\t\t\t\t}\n\n\t\t\t\tif ((a_Item.m_ItemType == E_ITEM_FIREWORK_ROCKET) || (a_Item.m_ItemType == E_ITEM_FIREWORK_STAR))\n\t\t\t\t{\n\t\t\t\t\tcFireworkItem::WriteToNBTCompound(a_Item.m_FireworkItem, mWriter, static_cast<ENUM_ITEM_TYPE>(a_Item.m_ItemType));\n\t\t\t\t}\n\n\t\t\t\tif (!a_Item.m_Enchantments.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\tconst char * TagName = (a_Item.m_ItemType == E_ITEM_BOOK) ? \"StoredEnchantments\" : \"ench\";\n\t\t\t\t\tEnchantmentSerializer::WriteToNBTCompound(a_Item.m_Enchantments, mWriter, TagName);\n\t\t\t\t}\n\t\t\tmWriter.EndCompound();\n\t\t}\n\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\t/** Writes an item grid into the writer.\n\tBegins the stored slot numbers with a_BeginSlotNum.\n\tNote that it doesn't begin nor end the list tag, so that multiple grids may be concatenated together using this function. */\n\tvoid AddItemGrid(const cItemGrid & a_Grid, int a_BeginSlotNum = 0)\n\t{\n\t\tint NumSlots = a_Grid.GetNumSlots();\n\t\tfor (int i = 0; i < NumSlots; i++)\n\t\t{\n\t\t\tconst cItem & Item = a_Grid.GetSlot(i);\n\t\t\tif (Item.IsEmpty())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tAddItem(Item, i + a_BeginSlotNum);\n\t\t}  // for i - slots[]\n\t}\n\n\n\n\n\n\tvoid AddBasicTileEntity(cBlockEntity * a_Entity, const char * a_EntityTypeID)\n\t{\n\t\tmWriter.AddInt   (\"x\",  a_Entity->GetPosX());\n\t\tmWriter.AddInt   (\"y\",  a_Entity->GetPosY());\n\t\tmWriter.AddInt   (\"z\",  a_Entity->GetPosZ());\n\t\tmWriter.AddString(\"id\", a_EntityTypeID);\n\t}\n\n\n\n\n\n\tvoid AddBannerEntity(cBannerEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity,\"Banner\");\n\t\t\tmWriter.AddInt(\"Base\", static_cast<int>(a_Entity->GetBaseColor()));\n\t\t\tif (!a_Entity->GetCustomName().empty())\n\t\t\t{\n\t\t\t\tmWriter.AddString(\"CustomName\", a_Entity->GetCustomName());\n\t\t\t}\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddBeaconEntity(cBeaconEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity, \"Beacon\");\n\t\t\tmWriter.AddInt(\"Levels\", a_Entity->GetBeaconLevel());\n\t\t\tmWriter.AddInt(\"Primary\", static_cast<int>(a_Entity->GetPrimaryEffect()));\n\t\t\tmWriter.AddInt(\"Secondary\", static_cast<int>(a_Entity->GetSecondaryEffect()));\n\t\t\tmWriter.BeginList(\"Items\", TAG_Compound);\n\t\t\t\tAddItemGrid(a_Entity->GetContents());\n\t\t\tmWriter.EndList();\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddBedEntity(cBedEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\tAddBasicTileEntity(a_Entity, \"Bed\");\n\t\tmWriter.AddInt(\"color\", a_Entity->GetColor());\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddBrewingstandEntity(cBrewingstandEntity * a_Brewingstand)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Brewingstand, \"Brewingstand\");\n\t\t\tmWriter.BeginList(\"Items\", TAG_Compound);\n\t\t\t\tAddItemGrid(a_Brewingstand->GetContents());\n\t\t\tmWriter.EndList();\n\t\t\tmWriter.AddShort(\"BrewTime\", a_Brewingstand->GetTimeBrewed());\n\t\t\tmWriter.AddShort(\"Fuel\", a_Brewingstand->GetRemainingFuel());\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddChestEntity(cChestEntity * a_Entity, BLOCKTYPE a_ChestType)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity, \"Chest\");\n\t\t\tmWriter.BeginList(\"Items\", TAG_Compound);\n\t\t\t\tAddItemGrid(a_Entity->GetContents());\n\t\t\tmWriter.EndList();\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddDispenserEntity(cDispenserEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity, \"Trap\");\n\t\t\tmWriter.BeginList(\"Items\", TAG_Compound);\n\t\t\t\tAddItemGrid(a_Entity->GetContents());\n\t\t\tmWriter.EndList();\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddDropperEntity(cDropperEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity, \"Dropper\");\n\t\t\tmWriter.BeginList(\"Items\", TAG_Compound);\n\t\t\t\tAddItemGrid(a_Entity->GetContents());\n\t\t\tmWriter.EndList();\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddEnchantingTableEntity(cEnchantingTableEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity, \"EnchantingTable\");\n\t\t\tif (!a_Entity->GetCustomName().empty())\n\t\t\t{\n\t\t\t\tmWriter.AddString(\"CustomName\", a_Entity->GetCustomName());\n\t\t\t}\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\tvoid AddEnderchestEntity(cEnderChestEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity, \"EnderChest\");\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\tvoid AddEndPortalEntity(cEndPortalEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity, \"EndPortal\");\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddFurnaceEntity(cFurnaceEntity * a_Furnace)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Furnace, \"Furnace\");\n\t\t\tmWriter.BeginList(\"Items\", TAG_Compound);\n\t\t\t\tAddItemGrid(a_Furnace->GetContents());\n\t\t\tmWriter.EndList();\n\t\t\tmWriter.AddShort(\"BurnTime\", static_cast<Int16>(a_Furnace->GetFuelBurnTimeLeft()));\n\t\t\tmWriter.AddShort(\"CookTime\", static_cast<Int16>(a_Furnace->GetTimeCooked()));\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddHopperEntity(cHopperEntity * a_Entity)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Entity, \"Hopper\");\n\t\t\tmWriter.BeginList(\"Items\", TAG_Compound);\n\t\t\t\tAddItemGrid(a_Entity->GetContents());\n\t\t\tmWriter.EndList();\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddJukeboxEntity(cJukeboxEntity * a_Jukebox)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Jukebox, \"RecordPlayer\");\n\t\t\tmWriter.AddInt(\"Record\", a_Jukebox->GetRecord());\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddMobSpawnerEntity(cMobSpawnerEntity * a_MobSpawner)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_MobSpawner, \"MobSpawner\");\n\t\t\tmWriter.AddString(\"EntityId\", NamespaceSerializer::From(a_MobSpawner->GetEntity()));\n\t\t\tmWriter.AddShort(\"SpawnCount\", a_MobSpawner->GetSpawnCount());\n\t\t\tmWriter.AddShort(\"SpawnRange\", a_MobSpawner->GetSpawnRange());\n\t\t\tmWriter.AddShort(\"Delay\", a_MobSpawner->GetSpawnDelay());\n\t\t\tmWriter.AddShort(\"MinSpawnDelay\", a_MobSpawner->GetMinSpawnDelay());\n\t\t\tmWriter.AddShort(\"MaxSpawnDelay\", a_MobSpawner->GetMaxSpawnDelay());\n\t\t\tmWriter.AddShort(\"MaxNearbyEntities\", a_MobSpawner->GetMaxNearbyEntities());\n\t\t\tmWriter.AddShort(\"RequiredPlayerRange\", a_MobSpawner->GetRequiredPlayerRange());\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddNoteEntity(cNoteEntity * a_Note)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Note, \"Music\");\n\t\t\tmWriter.AddByte(\"note\", static_cast<Byte>(a_Note->GetNote()));\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddCommandBlockEntity(cCommandBlockEntity * a_CmdBlock)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_CmdBlock, \"Control\");\n\t\t\tmWriter.AddString(\"Command\",      a_CmdBlock->GetCommand());\n\t\t\tmWriter.AddInt   (\"SuccessCount\", a_CmdBlock->GetResult());\n\t\t\tmWriter.AddString(\"LastOutput\",   a_CmdBlock->GetLastOutput());\n\t\t\tmWriter.AddByte  (\"TrackOutput\",  1);  // TODO 2014-01-18 xdot: Figure out what TrackOutput is and save it.\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddSignEntity(cSignEntity * a_Sign)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_Sign, \"Sign\");\n\t\t\tmWriter.AddString(\"Text1\",   a_Sign->GetLine(0));\n\t\t\tmWriter.AddString(\"Text2\",   a_Sign->GetLine(1));\n\t\t\tmWriter.AddString(\"Text3\",   a_Sign->GetLine(2));\n\t\t\tmWriter.AddString(\"Text4\",   a_Sign->GetLine(3));\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddMobHeadEntity(cMobHeadEntity * a_MobHead)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_MobHead, \"Skull\");\n\t\t\tmWriter.AddByte  (\"SkullType\", a_MobHead->GetType() & 0xFF);\n\t\t\tmWriter.AddByte  (\"Rot\",       a_MobHead->GetRotation() & 0xFF);\n\n\t\t\t// The new Block Entity format for a Mob Head. See: https://minecraft.wiki/w/Head#Block_entity\n\t\t\tmWriter.BeginCompound(\"Owner\");\n\t\t\t\tmWriter.AddString(\"Id\", a_MobHead->GetOwnerUUID().ToShortString());\n\t\t\t\tmWriter.AddString(\"Name\", a_MobHead->GetOwnerName());\n\t\t\t\tmWriter.BeginCompound(\"Properties\");\n\t\t\t\t\tmWriter.BeginList(\"textures\", TAG_Compound);\n\t\t\t\t\t\tmWriter.BeginCompound(\"\");\n\t\t\t\t\t\t\tmWriter.AddString(\"Signature\", a_MobHead->GetOwnerTextureSignature());\n\t\t\t\t\t\t\tmWriter.AddString(\"Value\", a_MobHead->GetOwnerTexture());\n\t\t\t\t\t\tmWriter.EndCompound();\n\t\t\t\t\tmWriter.EndList();\n\t\t\t\tmWriter.EndCompound();\n\t\t\tmWriter.EndCompound();\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddFlowerPotEntity(cFlowerPotEntity * a_FlowerPot)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicTileEntity(a_FlowerPot, \"FlowerPot\");\n\t\t\tmWriter.AddInt   (\"Item\", static_cast<Int32>(a_FlowerPot->GetItem().m_ItemType));\n\t\t\tmWriter.AddInt   (\"Data\", static_cast<Int32>(a_FlowerPot->GetItem().m_ItemDamage));\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddBasicEntity(cEntity * a_Entity, const std::string_view a_ClassName)\n\t{\n\t\tmWriter.AddString(\"id\", a_ClassName);\n\t\tmWriter.BeginList(\"Pos\", TAG_Double);\n\t\t\tmWriter.AddDouble(\"\", a_Entity->GetPosX());\n\t\t\tmWriter.AddDouble(\"\", a_Entity->GetPosY());\n\t\t\tmWriter.AddDouble(\"\", a_Entity->GetPosZ());\n\t\tmWriter.EndList();\n\t\tmWriter.BeginList(\"Motion\", TAG_Double);\n\t\t\tmWriter.AddDouble(\"\", a_Entity->GetSpeedX());\n\t\t\tmWriter.AddDouble(\"\", a_Entity->GetSpeedY());\n\t\t\tmWriter.AddDouble(\"\", a_Entity->GetSpeedZ());\n\t\tmWriter.EndList();\n\t\tmWriter.BeginList(\"Rotation\", TAG_Double);\n\t\t\tmWriter.AddDouble(\"\", a_Entity->GetYaw());\n\t\t\tmWriter.AddDouble(\"\", a_Entity->GetPitch());\n\t\tmWriter.EndList();\n\t\tmWriter.AddFloat(\"Health\", a_Entity->GetHealth());\n\t}\n\n\n\n\n\n\tvoid AddBoatEntity(cBoat * a_Boat)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_Boat, \"Boat\");\n\t\t\tmWriter.AddString(\"Type\", cBoat::MaterialToString(a_Boat->GetMaterial()));\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddEnderCrystalEntity(cEnderCrystal * a_EnderCrystal)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_EnderCrystal, \"EnderCrystal\");\n\t\t\tmWriter.AddByte(\"ShowBottom\", a_EnderCrystal->ShowsBottom() ? 1 : 0);\n\t\t\tif (a_EnderCrystal->DisplaysBeam())\n\t\t\t{\n\t\t\t\tmWriter.BeginCompound(\"BeamTarget\");\n\t\t\t\tconst auto & BeamTarget = a_EnderCrystal->GetBeamTarget();\n\t\t\t\tmWriter.AddInt(\"X\", BeamTarget.x);\n\t\t\t\tmWriter.AddInt(\"Y\", BeamTarget.y);\n\t\t\t\tmWriter.AddInt(\"Z\", BeamTarget.z);\n\t\t\t\tmWriter.EndCompound();\n\t\t\t}\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddFallingBlockEntity(cFallingBlock * a_FallingBlock)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_FallingBlock, \"FallingSand\");\n\t\t\tmWriter.AddInt(\"TileID\", a_FallingBlock->GetBlockType());\n\t\t\tmWriter.AddByte(\"Data\", a_FallingBlock->GetBlockMeta());\n\t\t\tmWriter.AddByte(\"Time\", 1);  // Unused in Cuberite, Vanilla said to need nonzero\n\t\t\tmWriter.AddByte(\"DropItem\", 1);\n\t\t\tmWriter.AddByte(\"HurtEntities\", a_FallingBlock->GetBlockType() == E_BLOCK_ANVIL);\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddMinecartEntity(cMinecart * a_Minecart)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\n\t\t\tswitch (a_Minecart->GetPayload())\n\t\t\t{\n\t\t\t\tcase cMinecart::mpChest:\n\t\t\t\t{\n\t\t\t\t\tAddBasicEntity(a_Minecart, \"MinecartChest\");\n\t\t\t\t\t// Add chest contents into the Items tag:\n\t\t\t\t\tAddMinecartChestContents(static_cast<cMinecartWithChest *>(a_Minecart));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cMinecart::mpFurnace:\n\t\t\t\t{\n\t\t\t\t\tAddBasicEntity(a_Minecart, \"MinecartFurnace\");\n\t\t\t\t\t// TODO: Add \"Push\" and \"Fuel\" tags\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cMinecart::mpHopper:\n\t\t\t\t{\n\t\t\t\t\tAddBasicEntity(a_Minecart, \"MinecartHopper\");\n\t\t\t\t\t// TODO: Add hopper contents?\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cMinecart::mpTNT:\n\t\t\t\t{\n\t\t\t\t\tAddBasicEntity(a_Minecart, \"MinecartTNT\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cMinecart::mpNone:\n\t\t\t\t{\n\t\t\t\t\tAddBasicEntity(a_Minecart, \"MinecartRideable\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // switch (Payload)\n\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddMonsterEntity(cMonster * a_Monster)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_Monster, NamespaceSerializer::From(a_Monster->GetMobType()));\n\t\t\tmWriter.BeginList(\"DropChances\", TAG_Float);\n\t\t\t\tmWriter.AddFloat(\"\", a_Monster->GetDropChanceWeapon());\n\t\t\t\tmWriter.AddFloat(\"\", a_Monster->GetDropChanceHelmet());\n\t\t\t\tmWriter.AddFloat(\"\", a_Monster->GetDropChanceChestplate());\n\t\t\t\tmWriter.AddFloat(\"\", a_Monster->GetDropChanceLeggings());\n\t\t\t\tmWriter.AddFloat(\"\", a_Monster->GetDropChanceBoots());\n\t\t\tmWriter.EndList();\n\t\t\tmWriter.AddByte(\"CanPickUpLoot\", (a_Monster->CanPickUpLoot())? 1 : 0);\n\t\t\tmWriter.AddString(\"CustomName\", a_Monster->GetCustomName());\n\t\t\tmWriter.AddByte(\"CustomNameVisible\", static_cast<Byte>(a_Monster->IsCustomNameAlwaysVisible()));\n\n\t\t\t// Mob was leashed\n\t\t\tif (a_Monster->IsLeashed() || (a_Monster->GetLeashToPos() != nullptr))\n\t\t\t{\n\t\t\t\tmWriter.AddByte(\"Leashed\", 1);\n\n\t\t\t\tconst Vector3d * LeashedToPos = nullptr;\n\n\t\t\t\tif (a_Monster->GetLeashToPos() != nullptr)\n\t\t\t\t{\n\t\t\t\t\tLeashedToPos = a_Monster->GetLeashToPos();\n\t\t\t\t}\n\t\t\t\telse if (a_Monster->GetLeashedTo()->IsLeashKnot())\n\t\t\t\t{\n\t\t\t\t\tLeashedToPos = & a_Monster->GetLeashedTo()->GetPosition();\n\t\t\t\t}\n\n\t\t\t\tif (LeashedToPos != nullptr)\n\t\t\t\t{\n\t\t\t\t\tmWriter.BeginCompound(\"Leash\");\n\t\t\t\t\tmWriter.AddDouble(\"X\", LeashedToPos->x);\n\t\t\t\t\tmWriter.AddDouble(\"Y\", LeashedToPos->y);\n\t\t\t\t\tmWriter.AddDouble(\"Z\", LeashedToPos->z);\n\t\t\t\t\tmWriter.EndCompound();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch (a_Monster->GetMobType())\n\t\t\t{\n\t\t\t\tcase mtBat:\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddByte(\"BatFlags\", static_cast<const cBat *>(a_Monster)->IsHanging());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtCreeper:\n\t\t\t\t{\n\t\t\t\t\tconst cCreeper *Creeper = static_cast<const cCreeper *>(a_Monster);\n\t\t\t\t\tmWriter.AddByte(\"powered\", Creeper->IsCharged());\n\t\t\t\t\tmWriter.AddByte(\"ignited\", Creeper->IsBlowing());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtEnderman:\n\t\t\t\t{\n\t\t\t\t\tconst cEnderman *Enderman = static_cast<const cEnderman *>(a_Monster);\n\t\t\t\t\tmWriter.AddShort(\"carried\",     static_cast<Int16>(Enderman->GetCarriedBlock()));\n\t\t\t\t\tmWriter.AddShort(\"carriedData\", static_cast<Int16>(Enderman->GetCarriedMeta()));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtHorse:\n\t\t\t\t{\n\t\t\t\t\tconst cHorse *Horse = static_cast<const cHorse *>(a_Monster);\n\t\t\t\t\tmWriter.AddByte(\"ChestedHorse\",   Horse->IsChested()? 1 : 0);\n\t\t\t\t\tmWriter.AddByte(\"EatingHaystack\", Horse->IsEating()? 1 : 0);\n\t\t\t\t\tmWriter.AddByte(\"Tame\",           Horse->IsTame()? 1: 0);\n\t\t\t\t\tmWriter.AddInt (\"Type\",           Horse->GetHorseType());\n\t\t\t\t\tmWriter.AddInt (\"Color\",          Horse->GetHorseColor());\n\t\t\t\t\tmWriter.AddInt (\"Style\",          Horse->GetHorseStyle());\n\t\t\t\t\tmWriter.AddInt (\"ArmorType\",      Horse->GetHorseArmour());\n\t\t\t\t\tmWriter.AddByte(\"Saddle\",         Horse->IsSaddled()? 1 : 0);\n\t\t\t\t\tmWriter.AddInt (\"Age\",            Horse->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtMagmaCube:\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddInt(\"Size\", static_cast<const cMagmaCube *>(a_Monster)->GetSize());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtOcelot:\n\t\t\t\t{\n\t\t\t\t\tconst auto *Ocelot = static_cast<const cOcelot *>(a_Monster);\n\t\t\t\t\tif (!Ocelot->GetOwnerName().empty())\n\t\t\t\t\t{\n\t\t\t\t\t\tmWriter.AddString(\"Owner\", Ocelot->GetOwnerName());\n\t\t\t\t\t}\n\t\t\t\t\tif (!Ocelot->GetOwnerUUID().IsNil())\n\t\t\t\t\t{\n\t\t\t\t\t\tmWriter.AddString(\"OwnerUUID\", Ocelot->GetOwnerUUID().ToShortString());\n\t\t\t\t\t}\n\t\t\t\t\tmWriter.AddByte(\"Sitting\", Ocelot->IsSitting() ? 1 : 0);\n\t\t\t\t\tmWriter.AddInt(\"CatType\", Ocelot->GetOcelotType());\n\t\t\t\t\tmWriter.AddInt(\"Age\", Ocelot->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtPig:\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddInt(\"Age\", static_cast<const cPig *>(a_Monster)->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtRabbit:\n\t\t\t\t{\n\t\t\t\t\tconst cRabbit * Rabbit = static_cast<const cRabbit *>(a_Monster);\n\t\t\t\t\tmWriter.AddInt(\"RabbitType\", static_cast<Int32>(Rabbit->GetRabbitType()));\n\t\t\t\t\tmWriter.AddInt(\"MoreCarrotTicks\", Rabbit->GetMoreCarrotTicks());\n\t\t\t\t\tmWriter.AddInt(\"Age\", Rabbit->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtSheep:\n\t\t\t\t{\n\t\t\t\t\tconst cSheep *Sheep = static_cast<const cSheep *>(a_Monster);\n\t\t\t\t\tmWriter.AddByte(\"Sheared\", Sheep->IsSheared()? 1 : 0);\n\t\t\t\t\tmWriter.AddByte(\"Color\",   static_cast<Byte>(Sheep->GetFurColor()));\n\t\t\t\t\tmWriter.AddInt (\"Age\",     Sheep->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtSlime:\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddInt(\"Size\", static_cast<const cSlime *>(a_Monster)->GetSize());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtVillager:\n\t\t\t\t{\n\t\t\t\t\tconst cVillager *Villager = static_cast<const cVillager *>(a_Monster);\n\t\t\t\t\tmWriter.AddInt(\"Profession\", Villager->GetVilType());\n\t\t\t\t\tmWriter.AddInt(\"Age\",        Villager->GetAge());\n\t\t\t\t\tmWriter.BeginList(\"Inventory\", TAG_Compound);\n\t\t\t\t\t\tAddItemGrid(Villager->GetInventory());\n\t\t\t\t\tmWriter.EndList();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtWither:\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddInt(\"Invul\", static_cast<Int32>(static_cast<const cWither *>(a_Monster)->GetWitherInvulnerableTicks()));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtWolf:\n\t\t\t\t{\n\t\t\t\t\tconst cWolf *Wolf = static_cast<const cWolf *>(a_Monster);\n\t\t\t\t\tif (!Wolf->GetOwnerName().empty())\n\t\t\t\t\t{\n\t\t\t\t\t\tmWriter.AddString(\"Owner\", Wolf->GetOwnerName());\n\t\t\t\t\t}\n\t\t\t\t\tif (!Wolf->GetOwnerUUID().IsNil())\n\t\t\t\t\t{\n\t\t\t\t\t\tmWriter.AddString(\"OwnerUUID\", Wolf->GetOwnerUUID().ToShortString());\n\t\t\t\t\t}\n\t\t\t\t\tmWriter.AddByte(\"Sitting\",     Wolf->IsSitting() ? 1 : 0);\n\t\t\t\t\tmWriter.AddByte(\"Angry\",       Wolf->IsAngry() ? 1 : 0);\n\t\t\t\t\tmWriter.AddByte(\"CollarColor\", static_cast<Byte>(Wolf->GetCollarColor()));\n\t\t\t\t\tmWriter.AddInt (\"Age\",         Wolf->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtZombie:\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddInt(\"Age\", static_cast<const cZombie *>(a_Monster)->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtZombiePigman:\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddInt(\"Age\", static_cast<const cZombiePigman *>(a_Monster)->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtZombieVillager:\n\t\t\t\t{\n\t\t\t\t\tconst cZombieVillager *ZombieVillager = reinterpret_cast<const cZombieVillager *>(a_Monster);\n\t\t\t\t\tmWriter.AddInt(\"Profession\",     ZombieVillager->GetProfession());\n\t\t\t\t\tmWriter.AddInt(\"ConversionTime\", ZombieVillager->ConversionTime());\n\t\t\t\t\tmWriter.AddInt(\"Age\",            ZombieVillager->GetAge());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtBlaze:\n\t\t\t\tcase mtCaveSpider:\n\t\t\t\tcase mtChicken:\n\t\t\t\tcase mtCow:\n\t\t\t\tcase mtEnderDragon:\n\t\t\t\tcase mtGhast:\n\t\t\t\tcase mtGiant:\n\t\t\t\tcase mtGuardian:\n\t\t\t\tcase mtIronGolem:\n\t\t\t\tcase mtMooshroom:\n\t\t\t\tcase mtSilverfish:\n\t\t\t\tcase mtSkeleton:\n\t\t\t\tcase mtSnowGolem:\n\t\t\t\tcase mtSpider:\n\t\t\t\tcase mtSquid:\n\t\t\t\tcase mtWitch:\n\t\t\t\tcase mtWitherSkeleton:\n\t\t\t\t{\n\t\t\t\t\t// Other mobs have no special tags.\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtCat:\n\t\t\t\tcase mtCod:\n\t\t\t\tcase mtDolphin:\n\t\t\t\tcase mtDonkey:\n\t\t\t\tcase mtDrowned:\n\t\t\t\tcase mtElderGuardian:\n\t\t\t\tcase mtEndermite:\n\t\t\t\tcase mtEvoker:\n\t\t\t\tcase mtFox:\n\t\t\t\tcase mtHoglin:\n\t\t\t\tcase mtHusk:\n\t\t\t\tcase mtIllusioner:\n\t\t\t\tcase mtLlama:\n\t\t\t\tcase mtMule:\n\t\t\t\tcase mtPanda:\n\t\t\t\tcase mtParrot:\n\t\t\t\tcase mtPhantom:\n\t\t\t\tcase mtPiglin:\n\t\t\t\tcase mtPiglinBrute:\n\t\t\t\tcase mtPillager:\n\t\t\t\tcase mtPolarBear:\n\t\t\t\tcase mtPufferfish:\n\t\t\t\tcase mtRavager:\n\t\t\t\tcase mtSalmon:\n\t\t\t\tcase mtShulker:\n\t\t\t\tcase mtSkeletonHorse:\n\t\t\t\tcase mtStray:\n\t\t\t\tcase mtStrider:\n\t\t\t\tcase mtTraderLlama:\n\t\t\t\tcase mtTropicalFish:\n\t\t\t\tcase mtTurtle:\n\t\t\t\tcase mtVex:\n\t\t\t\tcase mtVindicator:\n\t\t\t\tcase mtWanderingTrader:\n\t\t\t\tcase mtZoglin:\n\t\t\t\tcase mtZombieHorse:\n\t\t\t\t{\n\t\t\t\t\t// All the entities not added\n\t\t\t\t\tLOGD(\"Saving unimplemented entity type: %d\", NamespaceSerializer::From(a_Monster->GetMobType()));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase mtInvalidType:\n\t\t\t\t{\n\t\t\t\t\tASSERT(!\"NBTChunkSerializer::SerializerCollector::AddMonsterEntity: Recieved mob of invalid type\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddPickupEntity(cPickup * a_Pickup)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_Pickup, \"Item\");\n\t\t\tAddItem(a_Pickup->GetItem(), -1, \"Item\");\n\t\t\tmWriter.AddShort(\"Age\",    static_cast<Int16>(a_Pickup->GetAge()));\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddProjectileEntity(cProjectileEntity * a_Projectile)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_Projectile, a_Projectile->GetMCAClassName());\n\t\t\tmWriter.AddByte(\"inGround\", a_Projectile->IsInGround() ? 1 : 0);\n\n\t\t\tswitch (a_Projectile->GetProjectileKind())\n\t\t\t{\n\t\t\t\tcase cProjectileEntity::pkArrow:\n\t\t\t\t{\n\t\t\t\t\tcArrowEntity * Arrow = static_cast<cArrowEntity *>(a_Projectile);\n\n\t\t\t\t\tmWriter.AddShort(\"xTile\", static_cast<Int16>(Arrow->GetBlockHit().x));\n\t\t\t\t\tmWriter.AddShort(\"yTile\", static_cast<Int16>(Arrow->GetBlockHit().y));\n\t\t\t\t\tmWriter.AddShort(\"zTile\", static_cast<Int16>(Arrow->GetBlockHit().z));\n\t\t\t\t\tmWriter.AddByte(\"pickup\", static_cast<unsigned char>(Arrow->GetPickupState()));\n\t\t\t\t\tmWriter.AddDouble(\"damage\", Arrow->GetDamageCoeff());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkSplashPotion:\n\t\t\t\t{\n\t\t\t\t\tcSplashPotionEntity * Potion = static_cast<cSplashPotionEntity *>(a_Projectile);\n\n\t\t\t\t\tmWriter.AddInt(\"EffectType\",                static_cast<Int16>(Potion->GetEntityEffectType()));\n\t\t\t\t\tmWriter.AddInt(\"EffectDuration\",            static_cast<Int16>(Potion->GetEntityEffect().GetDuration()));\n\t\t\t\t\tmWriter.AddShort(\"EffectIntensity\",         Potion->GetEntityEffect().GetIntensity());\n\t\t\t\t\tmWriter.AddDouble(\"EffectDistanceModifier\", Potion->GetEntityEffect().GetDistanceModifier());\n\t\t\t\t\tmWriter.AddInt(\"PotionName\",                Potion->GetPotionColor());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkGhastFireball:\n\t\t\t\t{\n\t\t\t\t\tmWriter.AddInt(\"ExplosionPower\", 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase cProjectileEntity::pkFireCharge:\n\t\t\t\tcase cProjectileEntity::pkWitherSkull:\n\t\t\t\tcase cProjectileEntity::pkEnderPearl:\n\t\t\t\tcase cProjectileEntity::pkSnowball:\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tASSERT(!\"Unsaved projectile entity!\");\n\t\t\t\t}\n\t\t\t}  // switch (ProjectileKind)\n\n\t\t\tif (!a_Projectile->GetCreatorName().empty())\n\t\t\t{\n\t\t\t\tmWriter.AddString(\"ownerName\", a_Projectile->GetCreatorName());\n\t\t\t}\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddHangingEntity(cHangingEntity * a_Hanging)\n\t{\n\t\tmWriter.AddInt(\"TileX\", FloorC(a_Hanging->GetPosX()));\n\t\tmWriter.AddInt(\"TileY\", FloorC(a_Hanging->GetPosY()));\n\t\tmWriter.AddInt(\"TileZ\", FloorC(a_Hanging->GetPosZ()));\n\t\tmWriter.AddByte(\"Facing\", a_Hanging->GetProtocolFacing());\n\t}\n\n\n\n\n\n\tvoid AddTNTEntity(cTNTEntity * a_TNT)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_TNT, \"PrimedTnt\");\n\t\t\tmWriter.AddByte(\"Fuse\", static_cast<unsigned char>(a_TNT->GetFuseTicks()));\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddExpOrbEntity(cExpOrb * a_ExpOrb)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_ExpOrb, \"XPOrb\");\n\t\t\tmWriter.AddShort(\"Age\", static_cast<Int16>(a_ExpOrb->GetAge()));\n\t\t\tmWriter.AddShort(\"Value\", static_cast<Int16>(a_ExpOrb->GetReward()));\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddItemFrameEntity(cItemFrame * a_ItemFrame)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_ItemFrame, \"ItemFrame\");\n\t\t\tAddHangingEntity(a_ItemFrame);\n\t\t\tAddItem(a_ItemFrame->GetItem(), -1, \"Item\");\n\t\t\tmWriter.AddByte(\"ItemRotation\", static_cast<Byte>(a_ItemFrame->GetItemRotation()));\n\t\t\tmWriter.AddFloat(\"ItemDropChance\", 1.0F);\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddLeashKnotEntity(cLeashKnot * a_LeashKnot)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_LeashKnot, \"LeashKnot\");\n\t\t\tAddHangingEntity(a_LeashKnot);\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddPaintingEntity(cPainting * a_Painting)\n\t{\n\t\tmWriter.BeginCompound(\"\");\n\t\t\tAddBasicEntity(a_Painting, \"Painting\");\n\t\t\tAddHangingEntity(a_Painting);\n\t\t\tmWriter.AddString(\"Motive\", a_Painting->GetName());\n\t\tmWriter.EndCompound();\n\t}\n\n\n\n\n\n\tvoid AddMinecartChestContents(cMinecartWithChest * a_Minecart)\n\t{\n\t\tmWriter.BeginList(\"Items\", TAG_Compound);\n\t\t\tfor (int i = 0; i < cMinecartWithChest::ContentsHeight * cMinecartWithChest::ContentsWidth; i++)\n\t\t\t{\n\t\t\t\tconst cItem & Item = a_Minecart->GetSlot(i);\n\t\t\t\tif (Item.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tAddItem(Item, i);\n\t\t\t}\n\t\tmWriter.EndList();\n\t}\n};  // SerializerCollector\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// NBTChunkSerializer:\n\nvoid NBTChunkSerializer::Serialize(const cWorld & aWorld, cChunkCoords aCoords, cFastNBTWriter & aWriter)\n{\n\tSerializerCollector serializer(aWriter);\n\taWriter.BeginCompound(\"Level\");\n\taWriter.AddInt(\"xPos\", aCoords.m_ChunkX);\n\taWriter.AddInt(\"zPos\", aCoords.m_ChunkZ);\n\t[[maybe_unused]] const bool Result = aWorld.GetChunkData(aCoords, serializer);  // Chunk must be present in order to save\n\tASSERT(Result);\n\tserializer.Finish();  // Close NBT tags\n\n\t// Save biomes:\n\taWriter.AddByteArray(\"Biomes\", reinterpret_cast<const char *>(serializer.Biomes), ARRAYCOUNT(serializer.Biomes));\n\n\t// Save heightmap (Vanilla require this):\n\taWriter.AddIntArray(\"HeightMap\", reinterpret_cast<const int *>(serializer.Heights), ARRAYCOUNT(serializer.Heights));\n\n\t// Save blockdata:\n\taWriter.BeginList(\"Sections\", TAG_Compound);\n\tChunkDef_ForEachSection(serializer.m_BlockData, serializer.m_LightData,\n\t{\n\t\taWriter.BeginCompound(\"\");\n\n\t\tif (Blocks != nullptr)\n\t\t{\n\t\t\taWriter.AddByteArray(\"Blocks\", reinterpret_cast<const char *>(Blocks->data()), Blocks->size());\n\t\t}\n\t\telse\n\t\t{\n\t\t\taWriter.AddByteArray(\"Blocks\", ChunkBlockData::SectionBlockCount, ChunkBlockData::DefaultValue);\n\t\t}\n\n\t\tif (Metas != nullptr)\n\t\t{\n\t\t\taWriter.AddByteArray(\"Data\", reinterpret_cast<const char *>(Metas->data()), Metas->size());\n\t\t}\n\t\telse\n\t\t{\n\t\t\taWriter.AddByteArray(\"Data\", ChunkBlockData::SectionMetaCount, ChunkBlockData::DefaultMetaValue);\n\t\t}\n\n\t\tif (BlockLights != nullptr)\n\t\t{\n\t\t\taWriter.AddByteArray(\"BlockLight\", reinterpret_cast<const char *>(BlockLights->data()), BlockLights->size());\n\t\t}\n\t\telse\n\t\t{\n\t\t\taWriter.AddByteArray(\"BlockLight\", ChunkLightData::SectionLightCount, ChunkLightData::DefaultBlockLightValue);\n\t\t}\n\n\t\tif (SkyLights != nullptr)\n\t\t{\n\t\t\taWriter.AddByteArray(\"SkyLight\", reinterpret_cast<const char *>(SkyLights->data()), SkyLights->size());\n\t\t}\n\t\telse\n\t\t{\n\t\t\taWriter.AddByteArray(\"SkyLight\", ChunkLightData::SectionLightCount, ChunkLightData::DefaultSkyLightValue);\n\t\t}\n\n\t\taWriter.AddByte(\"Y\", static_cast<unsigned char>(Y));\n\t\taWriter.EndCompound();\n\t});\n\taWriter.EndList();  // \"Sections\"\n\n\t// Store the information that the lighting is valid.\n\t// For compatibility reason, the default is \"invalid\" (missing) - this means older data is re-lighted upon loading.\n\tif (serializer.mIsLightValid)\n\t{\n\t\taWriter.AddByte(\"MCSIsLightValid\", 1);\n\t}\n\n\t// Save the world age to the chunk data. Required by vanilla and mcedit.\n\taWriter.AddLong(\"LastUpdate\", aWorld.GetWorldAge().count());\n\n\t// Store the flag that the chunk has all the ores, trees, dungeons etc. Cuberite chunks are always complete.\n\taWriter.AddByte(\"TerrainPopulated\", 1);\n\n\taWriter.EndCompound();  // \"Level\"\n}\n"
  },
  {
    "path": "src/WorldStorage/NBTChunkSerializer.h",
    "content": "// NBTChunkSerializer.h\n\n#pragma once\n\n#include \"ChunkDef.h\"\n\n\n\n// fwd:\nclass cFastNBTWriter;\nclass cWorld;\n\n\n\n\n\n/** Saves the chunk data into a NBT format, used by the Anvil storage.\nThe Writer is expected to be set up so that the serializer can write the chunk's top level \"Level\" NBT tag immediately.\nProvides a single static entry point that does all the work, through a hidden worker class in the CPP file. */\nclass NBTChunkSerializer\n{\npublic:\n\n\t/** Serializes the chunk into the specified writer. The chunk must be present. */\n\tstatic void Serialize(const cWorld & aWorld, cChunkCoords aCoords, cFastNBTWriter & aWriter);\n};\n"
  },
  {
    "path": "src/WorldStorage/NamespaceSerializer.cpp",
    "content": "#include \"Globals.h\"\n\n#include \"NamespaceSerializer.h\"\n\n#include <cctype>\n\n\n\nunsigned NamespaceSerializer::DataVersion()\n{\n\treturn 2566;\n}\n\n\n\n\n\nstd::string_view NamespaceSerializer::From(const CustomStatistic a_ID)\n{\n\tswitch (a_ID)\n\t{\n\t\tcase CustomStatistic::AnimalsBred:                  return \"animals_bred\";\n\t\tcase CustomStatistic::AviateOneCm:                  return \"aviate_one_cm\";\n\t\tcase CustomStatistic::BellRing:                     return \"bell_ring\";\n\t\tcase CustomStatistic::BoatOneCm:                    return \"boat_one_cm\";\n\t\tcase CustomStatistic::CleanArmor:                   return \"clean_armor\";\n\t\tcase CustomStatistic::CleanBanner:                  return \"clean_banner\";\n\t\tcase CustomStatistic::CleanShulkerBox:              return \"clean_shulker_box\";\n\t\tcase CustomStatistic::ClimbOneCm:                   return \"climb_one_cm\";\n\t\tcase CustomStatistic::CrouchOneCm:                  return \"crouch_one_cm\";\n\t\tcase CustomStatistic::DamageAbsorbed:               return \"damage_absorbed\";\n\t\tcase CustomStatistic::DamageBlockedByShield:        return \"damage_blocked_by_shield\";\n\t\tcase CustomStatistic::DamageDealt:                  return \"damage_dealt\";\n\t\tcase CustomStatistic::DamageDealtAbsorbed:          return \"damage_dealt_absorbed\";\n\t\tcase CustomStatistic::DamageDealtResisted:          return \"damage_dealt_resisted\";\n\t\tcase CustomStatistic::DamageResisted:               return \"damage_resisted\";\n\t\tcase CustomStatistic::DamageTaken:                  return \"damage_taken\";\n\t\tcase CustomStatistic::Deaths:                       return \"deaths\";\n\t\tcase CustomStatistic::Drop:                         return \"drop\";\n\t\tcase CustomStatistic::EatCakeSlice:                 return \"eat_cake_slice\";\n\t\tcase CustomStatistic::EnchantItem:                  return \"enchant_item\";\n\t\tcase CustomStatistic::FallOneCm:                    return \"fall_one_cm\";\n\t\tcase CustomStatistic::FillCauldron:                 return \"fill_cauldron\";\n\t\tcase CustomStatistic::FishCaught:                   return \"fish_caught\";\n\t\tcase CustomStatistic::FlyOneCm:                     return \"fly_one_cm\";\n\t\tcase CustomStatistic::HorseOneCm:                   return \"horse_one_cm\";\n\t\tcase CustomStatistic::InspectDispenser:             return \"inspect_dispenser\";\n\t\tcase CustomStatistic::InspectDropper:               return \"inspect_dropper\";\n\t\tcase CustomStatistic::InspectHopper:                return \"inspect_hopper\";\n\t\tcase CustomStatistic::InteractWithAnvil:            return \"interact_with_anvil\";\n\t\tcase CustomStatistic::InteractWithBeacon:           return \"interact_with_beacon\";\n\t\tcase CustomStatistic::InteractWithBlastFurnace:     return \"interact_with_blast_furnace\";\n\t\tcase CustomStatistic::InteractWithBrewingstand:     return \"interact_with_brewingstand\";\n\t\tcase CustomStatistic::InteractWithCampfire:         return \"interact_with_campfire\";\n\t\tcase CustomStatistic::InteractWithCartographyTable: return \"interact_with_cartography_table\";\n\t\tcase CustomStatistic::InteractWithCraftingTable:    return \"interact_with_crafting_table\";\n\t\tcase CustomStatistic::InteractWithFurnace:          return \"interact_with_furnace\";\n\t\tcase CustomStatistic::InteractWithGrindstone:       return \"interact_with_grindstone\";\n\t\tcase CustomStatistic::InteractWithLectern:          return \"interact_with_lectern\";\n\t\tcase CustomStatistic::InteractWithLoom:             return \"interact_with_loom\";\n\t\tcase CustomStatistic::InteractWithSmithingTable:    return \"interact_with_smithing_table\";\n\t\tcase CustomStatistic::InteractWithSmoker:           return \"interact_with_smoker\";\n\t\tcase CustomStatistic::InteractWithStonecutter:      return \"interact_with_stonecutter\";\n\t\tcase CustomStatistic::Jump:                         return \"jump\";\n\t\tcase CustomStatistic::LeaveGame:                    return \"leave_game\";\n\t\tcase CustomStatistic::MinecartOneCm:                return \"minecart_one_cm\";\n\t\tcase CustomStatistic::MobKills:                     return \"mob_kills\";\n\t\tcase CustomStatistic::OpenBarrel:                   return \"open_barrel\";\n\t\tcase CustomStatistic::OpenChest:                    return \"open_chest\";\n\t\tcase CustomStatistic::OpenEnderchest:               return \"open_enderchest\";\n\t\tcase CustomStatistic::OpenShulkerBox:               return \"open_shulker_box\";\n\t\tcase CustomStatistic::PigOneCm:                     return \"pig_one_cm\";\n\t\tcase CustomStatistic::PlayNoteblock:                return \"play_noteblock\";\n\t\tcase CustomStatistic::PlayOneMinute:                return \"play_one_minute\";\n\t\tcase CustomStatistic::PlayRecord:                   return \"play_record\";\n\t\tcase CustomStatistic::PlayerKills:                  return \"player_kills\";\n\t\tcase CustomStatistic::PotFlower:                    return \"pot_flower\";\n\t\tcase CustomStatistic::RaidTrigger:                  return \"raid_trigger\";\n\t\tcase CustomStatistic::RaidWin:                      return \"raid_win\";\n\t\tcase CustomStatistic::SleepInBed:                   return \"sleep_in_bed\";\n\t\tcase CustomStatistic::SneakTime:                    return \"sneak_time\";\n\t\tcase CustomStatistic::SprintOneCm:                  return \"sprint_one_cm\";\n\t\tcase CustomStatistic::StriderOneCm:                 return \"strider_one_cm\";\n\t\tcase CustomStatistic::SwimOneCm:                    return \"swim_one_cm\";\n\t\tcase CustomStatistic::TalkedToVillager:             return \"talked_to_villager\";\n\t\tcase CustomStatistic::TargetHit:                    return \"target_hit\";\n\t\tcase CustomStatistic::TimeSinceDeath:               return \"time_since_death\";\n\t\tcase CustomStatistic::TimeSinceRest:                return \"time_since_rest\";\n\t\tcase CustomStatistic::TradedWithVillager:           return \"traded_with_villager\";\n\t\tcase CustomStatistic::TriggerTrappedChest:          return \"trigger_trapped_chest\";\n\t\tcase CustomStatistic::TuneNoteblock:                return \"tune_noteblock\";\n\t\tcase CustomStatistic::UseCauldron:                  return \"use_cauldron\";\n\t\tcase CustomStatistic::WalkOnWaterOneCm:             return \"walk_on_water_one_cm\";\n\t\tcase CustomStatistic::WalkOneCm:                    return \"walk_one_cm\";\n\t\tcase CustomStatistic::WalkUnderWaterOneCm:          return \"walk_under_water_one_cm\";\n\n\t\t// Old ones just for compatibility\n\t\tcase CustomStatistic::JunkFished:                   return \"junk_fished\";\n\t\tcase CustomStatistic::TreasureFished:               return \"treasure_fished\";\n\n\t\t// The old advancements\n\t\tcase CustomStatistic::AchOpenInventory:             return \"cuberite:achievement.openInventory\";\n\t\tcase CustomStatistic::AchMineWood:                  return \"cuberite:achievement.mineWood\";\n\t\tcase CustomStatistic::AchBuildWorkBench:            return \"cuberite:achievement.buildWorkBench\";\n\t\tcase CustomStatistic::AchBuildPickaxe:              return \"cuberite:achievement.buildPickaxe\";\n\t\tcase CustomStatistic::AchBuildFurnace:              return \"cuberite:achievement.buildFurnace\";\n\t\tcase CustomStatistic::AchAcquireIron:               return \"cuberite:achievement.acquireIron\";\n\t\tcase CustomStatistic::AchBuildHoe:                  return \"cuberite:achievement.buildHoe\";\n\t\tcase CustomStatistic::AchMakeBread:                 return \"cuberite:achievement.makeBread\";\n\t\tcase CustomStatistic::AchBakeCake:                  return \"cuberite:achievement.bakeCake\";\n\t\tcase CustomStatistic::AchBuildBetterPickaxe:        return \"cuberite:achievement.buildBetterPickaxe\";\n\t\tcase CustomStatistic::AchCookFish:                  return \"cuberite:achievement.cookFish\";\n\t\tcase CustomStatistic::AchOnARail:                   return \"cuberite:achievement.onARail\";\n\t\tcase CustomStatistic::AchBuildSword:                return \"cuberite:achievement.buildSword\";\n\t\tcase CustomStatistic::AchKillEnemy:                 return \"cuberite:achievement.killEnemy\";\n\t\tcase CustomStatistic::AchKillCow:                   return \"cuberite:achievement.killCow\";\n\t\tcase CustomStatistic::AchFlyPig:                    return \"cuberite:achievement.flyPig\";\n\t\tcase CustomStatistic::AchSnipeSkeleton:             return \"cuberite:achievement.snipeSkeleton\";\n\t\tcase CustomStatistic::AchDiamonds:                  return \"cuberite:achievement.diamonds\";\n\t\tcase CustomStatistic::AchPortal:                    return \"cuberite:achievement.portal\";\n\t\tcase CustomStatistic::AchGhast:                     return \"cuberite:achievement.ghast\";\n\t\tcase CustomStatistic::AchBlazeRod:                  return \"cuberite:achievement.blazeRod\";\n\t\tcase CustomStatistic::AchPotion:                    return \"cuberite:achievement.potion\";\n\t\tcase CustomStatistic::AchTheEnd:                    return \"cuberite:achievement.theEnd\";\n\t\tcase CustomStatistic::AchTheEnd2:                   return \"cuberite:achievement.theEnd2\";\n\t\tcase CustomStatistic::AchEnchantments:              return \"cuberite:achievement.enchantments\";\n\t\tcase CustomStatistic::AchOverkill:                  return \"cuberite:achievement.overkill\";\n\t\tcase CustomStatistic::AchBookcase:                  return \"cuberite:achievement.bookcase\";\n\t\tcase CustomStatistic::AchExploreAllBiomes:          return \"cuberite:achievement.exploreAllBiomes\";\n\t\tcase CustomStatistic::AchSpawnWither:               return \"cuberite:achievement.spawnWither\";\n\t\tcase CustomStatistic::AchKillWither:                return \"cuberite:achievement.killWither\";\n\t\tcase CustomStatistic::AchFullBeacon:                return \"cuberite:achievement.fullBeacon\";\n\t\tcase CustomStatistic::AchBreedCow:                  return \"cuberite:achievement.breedCow\";\n\t\tcase CustomStatistic::AchDiamondsToYou:             return \"cuberite:achievement.diamondsToYou\";\n\t}\n\tUNREACHABLE(\"Tried to save unhandled statistic\");\n}\n\n\n\n\n\nstd::string_view NamespaceSerializer::From(const eMonsterType a_ID)\n{\n\tswitch (a_ID)\n\t{\n\t\tcase mtBat:            return \"bat\";\n\t\tcase mtBlaze:          return \"blaze\";\n\t\tcase mtCat:            return \"cat\";\n\t\tcase mtCaveSpider:     return \"cave_spider\";\n\t\tcase mtChicken:        return \"chicken\";\n\t\tcase mtCod:            return \"cod\";\n\t\tcase mtCow:            return \"cow\";\n\t\tcase mtCreeper:        return \"creeper\";\n\t\tcase mtDolphin:        return \"dolphin\";\n\t\tcase mtDonkey:         return \"donkey\";\n\t\tcase mtDrowned:        return \"drowned\";\n\t\tcase mtElderGuardian:  return \"elder_guardian\";\n\t\tcase mtEnderDragon:    return \"ender_dragon\";\n\t\tcase mtEnderman:       return \"enderman\";\n\t\tcase mtEndermite:      return \"endermite\";\n\t\tcase mtEvoker:         return \"evoker\";\n\t\tcase mtFox:            return \"fox\";\n\t\tcase mtGhast:          return \"ghast\";\n\t\tcase mtGiant:          return \"giant\";\n\t\tcase mtGuardian:       return \"guardian\";\n\t\tcase mtHorse:          return \"horse\";\n\t\tcase mtHoglin:         return \"hoglin\";\n\t\tcase mtHusk:           return \"husk\";\n\t\tcase mtIllusioner:     return \"illusioner\";\n\t\tcase mtIronGolem:      return \"iron_golem\";\n\t\tcase mtLlama:          return \"llama\";\n\t\tcase mtMagmaCube:      return \"magma_cube\";\n\t\tcase mtMooshroom:      return \"mooshroom\";\n\t\tcase mtMule:           return \"mule\";\n\t\tcase mtOcelot:         return \"ocelot\";\n\t\tcase mtPanda:          return \"panda\";\n\t\tcase mtParrot:         return \"parrot\";\n\t\tcase mtPhantom:        return \"phantom\";\n\t\tcase mtPig:            return \"pig\";\n\t\tcase mtPiglin:         return \"piglin\";\n\t\tcase mtPiglinBrute:    return \"piglin_brute\";\n\t\tcase mtPillager:       return \"pillager\";\n\t\tcase mtPolarBear:      return \"polar_bear\";\n\t\tcase mtPufferfish:     return \"pufferfish\";\n\t\tcase mtRabbit:         return \"rabbit\";\n\t\tcase mtRavager:        return \"ravager\";\n\t\tcase mtSalmon:         return \"salmon\";\n\t\tcase mtSheep:          return \"sheep\";\n\t\tcase mtShulker:        return \"shulker\";\n\t\tcase mtSilverfish:     return \"silverfish\";\n\t\tcase mtSkeleton:       return \"skeleton\";\n\t\tcase mtSkeletonHorse:  return \"skeleton_horse\";\n\t\tcase mtSlime:          return \"slime\";\n\t\tcase mtSnowGolem:      return \"snow_golem\";\n\t\tcase mtSpider:         return \"spider\";\n\t\tcase mtSquid:          return \"squid\";\n\t\tcase mtStray:          return \"stray\";\n\t\tcase mtStrider:        return \"strider\";\n\t\tcase mtTraderLlama:    return \"trader_llama\";\n\t\tcase mtTropicalFish:   return \"tropical_fish\";\n\t\tcase mtTurtle:         return \"turtle\";\n\t\tcase mtVex:            return \"vex\";\n\t\tcase mtVillager:       return \"villager\";\n\t\tcase mtVindicator:     return \"vindicator\";\n\t\tcase mtWanderingTrader:return \"wandering_trader\";\n\t\tcase mtWitch:          return \"witch\";\n\t\tcase mtWither:         return \"wither\";\n\t\tcase mtWitherSkeleton: return \"wither_skeleton\";\n\t\tcase mtWolf:           return \"wolf\";\n\t\tcase mtZoglin:         return \"zoglin\";\n\t\tcase mtZombie:         return \"zombie\";\n\t\tcase mtZombieHorse:    return \"zombie_horse\";\n\t\tcase mtZombiePigman:   return \"zombified_piglin\";\n\t\tcase mtZombieVillager: return \"zombie_villager\";\n\t\tcase mtInvalidType:    break;\n\t}\n\tUNREACHABLE(\"Tried to save unknown monster type\");\n}\n\n\n\n\n\nstd::string_view NamespaceSerializer::From(const BannerPattern a_Pattern)\n{\n\tswitch (a_Pattern)\n\t{\n\t\tcase BannerPattern::BottomStripe: return \"bs\";\n\t\tcase BannerPattern::TopStripe: return \"ts\";\n\t\tcase BannerPattern::LeftStripe: return \"ls\";\n\t\tcase BannerPattern::RightStripe: return \"rs\";\n\t\tcase BannerPattern::CenterStripeVertical: return \"cs\";\n\t\tcase BannerPattern::MiddleStripeHorizontal: return \"ms\";\n\t\tcase BannerPattern::DownRightStripe: return \"drs\";\n\t\tcase BannerPattern::DownLeftStripe: return \"dls\";\n\t\tcase BannerPattern::SmallVerticalStripes: return \"ss\";\n\t\tcase BannerPattern::DiagonalCross: return \"cr\";\n\t\tcase BannerPattern::SquareCross: return \"sc\";\n\t\tcase BannerPattern::LeftOfDiagonal: return \"ld\";\n\t\tcase BannerPattern::RightOfUpsideDownDiagonal: return \"rud\";\n\t\tcase BannerPattern::LeftOfUpsideDownDiagonal: return \"lud\";\n\t\tcase BannerPattern::RightOfDiagonal: return \"rd\";\n\t\tcase BannerPattern::VerticalHalfLeft: return \"vh\";\n\t\tcase BannerPattern::VerticalHalfRight: return \"vhr\";\n\t\tcase BannerPattern::HorizontalHalfTop: return \"hh\";\n\t\tcase BannerPattern::HorizontalHalfBottom: return \"hhb\";\n\t\tcase BannerPattern::BottomLeftCorner: return \"bl\";\n\t\tcase BannerPattern::BottomRightCorner: return \"br\";\n\t\tcase BannerPattern::TopLeftCorner: return \"tl\";\n\t\tcase BannerPattern::TopRightCorner: return \"tr\";\n\t\tcase BannerPattern::BottomTriangle: return \"bt\";\n\t\tcase BannerPattern::TopTriangle: return \"tt\";\n\t\tcase BannerPattern::BottomTriangleSawtooth: return \"bts\";\n\t\tcase BannerPattern::TopTriangleSawtooth: return \"tts\";\n\t\tcase BannerPattern::MiddleCircle: return \"mc\";\n\t\tcase BannerPattern::MiddleRhombus: return \"mr\";\n\t\tcase BannerPattern::Border: return \"bo\";\n\t\tcase BannerPattern::CurlyBorder: return \"cbo\";\n\t\tcase BannerPattern::Brick: return \"bri\";\n\t\tcase BannerPattern::Gradient: return \"gra\";\n\t\tcase BannerPattern::GradientUpsideDown: return \"gru\";\n\t\tcase BannerPattern::Creeper: return \"cre\";\n\t\tcase BannerPattern::Skull: return \"sku\";\n\t\tcase BannerPattern::Flower: return \"flo\";\n\t\tcase BannerPattern::Mojang: return \"moj\";\n\t\tcase BannerPattern::Globe: return \"glb\";\n\t\tcase BannerPattern::Piglin: return \"pig\";\n\t}\n\tUNREACHABLE(\"Unsupported banner pattern\");\n}\n\n\n\n\n\nCustomStatistic NamespaceSerializer::ToCustomStatistic(const std::string_view ID)\n{\n\tstatic const std::unordered_map<std::string_view, CustomStatistic> CustomStatistics\n\t{\n\t\t{ \"animals_bred\",                            CustomStatistic::AnimalsBred },\n\t\t{ \"aviate_one_cm\",                           CustomStatistic::AviateOneCm },\n\t\t{ \"bell_ring\",                               CustomStatistic::BellRing },\n\t\t{ \"boat_one_cm\",                             CustomStatistic::BoatOneCm },\n\t\t{ \"clean_armor\",                             CustomStatistic::CleanArmor },\n\t\t{ \"clean_banner\",                            CustomStatistic::CleanBanner },\n\t\t{ \"clean_shulker_box\",                       CustomStatistic::CleanShulkerBox },\n\t\t{ \"climb_one_cm\",                            CustomStatistic::ClimbOneCm },\n\t\t{ \"crouch_one_cm\",                           CustomStatistic::CrouchOneCm },\n\t\t{ \"damage_absorbed\",                         CustomStatistic::DamageAbsorbed },\n\t\t{ \"damage_blocked_by_shield\",                CustomStatistic::DamageBlockedByShield },\n\t\t{ \"damage_dealt\",                            CustomStatistic::DamageDealt },\n\t\t{ \"damage_dealt_absorbed\",                   CustomStatistic::DamageDealtAbsorbed },\n\t\t{ \"damage_dealt_resisted\",                   CustomStatistic::DamageDealtResisted },\n\t\t{ \"damage_resisted\",                         CustomStatistic::DamageResisted },\n\t\t{ \"damage_taken\",                            CustomStatistic::DamageTaken },\n\t\t{ \"deaths\",                                  CustomStatistic::Deaths },\n\t\t{ \"drop\",                                    CustomStatistic::Drop },\n\t\t{ \"eat_cake_slice\",                          CustomStatistic::EatCakeSlice },\n\t\t{ \"enchant_item\",                            CustomStatistic::EnchantItem },\n\t\t{ \"fall_one_cm\",                             CustomStatistic::FallOneCm },\n\t\t{ \"fill_cauldron\",                           CustomStatistic::FillCauldron },\n\t\t{ \"fish_caught\",                             CustomStatistic::FishCaught },\n\t\t{ \"fly_one_cm\",                              CustomStatistic::FlyOneCm },\n\t\t{ \"horse_one_cm\",                            CustomStatistic::HorseOneCm },\n\t\t{ \"inspect_dispenser\",                       CustomStatistic::InspectDispenser },\n\t\t{ \"inspect_dropper\",                         CustomStatistic::InspectDropper },\n\t\t{ \"inspect_hopper\",                          CustomStatistic::InspectHopper },\n\t\t{ \"interact_with_anvil\",                     CustomStatistic::InteractWithAnvil },\n\t\t{ \"interact_with_beacon\",                    CustomStatistic::InteractWithBeacon },\n\t\t{ \"interact_with_blast_furnace\",             CustomStatistic::InteractWithBlastFurnace },\n\t\t{ \"interact_with_brewingstand\",              CustomStatistic::InteractWithBrewingstand },\n\t\t{ \"interact_with_campfire\",                  CustomStatistic::InteractWithCampfire },\n\t\t{ \"interact_with_cartography_table\",         CustomStatistic::InteractWithCartographyTable },\n\t\t{ \"interact_with_crafting_table\",            CustomStatistic::InteractWithCraftingTable },\n\t\t{ \"interact_with_furnace\",                   CustomStatistic::InteractWithFurnace },\n\t\t{ \"interact_with_grindstone\",                CustomStatistic::InteractWithGrindstone },\n\t\t{ \"interact_with_lectern\",                   CustomStatistic::InteractWithLectern },\n\t\t{ \"interact_with_loom\",                      CustomStatistic::InteractWithLoom },\n\t\t{ \"interact_with_smithing_table\",            CustomStatistic::InteractWithSmithingTable },\n\t\t{ \"interact_with_smoker\",                    CustomStatistic::InteractWithSmoker },\n\t\t{ \"interact_with_stonecutter\",               CustomStatistic::InteractWithStonecutter },\n\t\t{ \"jump\",                                    CustomStatistic::Jump },\n\t\t{ \"leave_game\",                              CustomStatistic::LeaveGame },\n\t\t{ \"minecart_one_cm\",                         CustomStatistic::MinecartOneCm },\n\t\t{ \"mob_kills\",                               CustomStatistic::MobKills },\n\t\t{ \"open_barrel\",                             CustomStatistic::OpenBarrel },\n\t\t{ \"open_chest\",                              CustomStatistic::OpenChest },\n\t\t{ \"open_enderchest\",                         CustomStatistic::OpenEnderchest },\n\t\t{ \"open_shulker_box\",                        CustomStatistic::OpenShulkerBox },\n\t\t{ \"pig_one_cm\",                              CustomStatistic::PigOneCm },\n\t\t{ \"play_noteblock\",                          CustomStatistic::PlayNoteblock },\n\t\t{ \"play_one_minute\",                         CustomStatistic::PlayOneMinute },\n\t\t{ \"play_record\",                             CustomStatistic::PlayRecord },\n\t\t{ \"player_kills\",                            CustomStatistic::PlayerKills },\n\t\t{ \"pot_flower\",                              CustomStatistic::PotFlower },\n\t\t{ \"raid_trigger\",                            CustomStatistic::RaidTrigger },\n\t\t{ \"raid_win\",                                CustomStatistic::RaidWin },\n\t\t{ \"sleep_in_bed\",                            CustomStatistic::SleepInBed },\n\t\t{ \"sneak_time\",                              CustomStatistic::SneakTime },\n\t\t{ \"sprint_one_cm\",                           CustomStatistic::SprintOneCm },\n\t\t{ \"strider_one_cm\",                          CustomStatistic::StriderOneCm },\n\t\t{ \"swim_one_cm\",                             CustomStatistic::SwimOneCm },\n\t\t{ \"talked_to_villager\",                      CustomStatistic::TalkedToVillager },\n\t\t{ \"target_hit\",                              CustomStatistic::TargetHit },\n\t\t{ \"time_since_death\",                        CustomStatistic::TimeSinceDeath },\n\t\t{ \"time_since_rest\",                         CustomStatistic::TimeSinceRest },\n\t\t{ \"traded_with_villager\",                    CustomStatistic::TradedWithVillager },\n\t\t{ \"trigger_trapped_chest\",                   CustomStatistic::TriggerTrappedChest },\n\t\t{ \"tune_noteblock\",                          CustomStatistic::TuneNoteblock },\n\t\t{ \"use_cauldron\",                            CustomStatistic::UseCauldron },\n\t\t{ \"walk_on_water_one_cm\",                    CustomStatistic::WalkOnWaterOneCm },\n\t\t{ \"walk_one_cm\",                             CustomStatistic::WalkOneCm },\n\t\t{ \"walk_under_water_one_cm\",                 CustomStatistic::WalkUnderWaterOneCm },\n\n\t\t// Old ones just for compatibility\n\t\t{ \"junk_fished\",                             CustomStatistic::JunkFished },\n\t\t{ \"treasure_fished\",                         CustomStatistic::TreasureFished },\n\n\t\t// The old advancements\n\t\t{ \"cuberite:achievement.openInventory\",      CustomStatistic::AchOpenInventory },\n\t\t{ \"cuberite:achievement.mineWood\",           CustomStatistic::AchMineWood },\n\t\t{ \"cuberite:achievement.buildWorkBench\",     CustomStatistic::AchBuildWorkBench },\n\t\t{ \"cuberite:achievement.buildPickaxe\",       CustomStatistic::AchBuildPickaxe },\n\t\t{ \"cuberite:achievement.buildFurnace\",       CustomStatistic::AchBuildFurnace },\n\t\t{ \"cuberite:achievement.acquireIron\",        CustomStatistic::AchAcquireIron },\n\t\t{ \"cuberite:achievement.buildHoe\",           CustomStatistic::AchBuildHoe },\n\t\t{ \"cuberite:achievement.makeBread\",          CustomStatistic::AchMakeBread },\n\t\t{ \"cuberite:achievement.bakeCake\",           CustomStatistic::AchBakeCake },\n\t\t{ \"cuberite:achievement.buildBetterPickaxe\", CustomStatistic::AchBuildBetterPickaxe },\n\t\t{ \"cuberite:achievement.cookFish\",           CustomStatistic::AchCookFish },\n\t\t{ \"cuberite:achievement.onARail\",            CustomStatistic::AchOnARail },\n\t\t{ \"cuberite:achievement.buildSword\",         CustomStatistic::AchBuildSword },\n\t\t{ \"cuberite:achievement.killEnemy\",          CustomStatistic::AchKillEnemy },\n\t\t{ \"cuberite:achievement.killCow\",            CustomStatistic::AchKillCow },\n\t\t{ \"cuberite:achievement.flyPig\",             CustomStatistic::AchFlyPig },\n\t\t{ \"cuberite:achievement.snipeSkeleton\",      CustomStatistic::AchSnipeSkeleton },\n\t\t{ \"cuberite:achievement.diamonds\",           CustomStatistic::AchDiamonds },\n\t\t{ \"cuberite:achievement.portal\",             CustomStatistic::AchPortal },\n\t\t{ \"cuberite:achievement.ghast\",              CustomStatistic::AchGhast },\n\t\t{ \"cuberite:achievement.blazeRod\",           CustomStatistic::AchBlazeRod },\n\t\t{ \"cuberite:achievement.potion\",             CustomStatistic::AchPotion },\n\t\t{ \"cuberite:achievement.theEnd\",             CustomStatistic::AchTheEnd },\n\t\t{ \"cuberite:achievement.theEnd2\",            CustomStatistic::AchTheEnd2 },\n\t\t{ \"cuberite:achievement.enchantments\",       CustomStatistic::AchEnchantments },\n\t\t{ \"cuberite:achievement.overkill\",           CustomStatistic::AchOverkill },\n\t\t{ \"cuberite:achievement.bookcase\",           CustomStatistic::AchBookcase },\n\t\t{ \"cuberite:achievement.exploreAllBiomes\",   CustomStatistic::AchExploreAllBiomes },\n\t\t{ \"cuberite:achievement.spawnWither\",        CustomStatistic::AchSpawnWither },\n\t\t{ \"cuberite:achievement.killWither\",         CustomStatistic::AchKillWither },\n\t\t{ \"cuberite:achievement.fullBeacon\",         CustomStatistic::AchFullBeacon },\n\t\t{ \"cuberite:achievement.breedCow\",           CustomStatistic::AchBreedCow },\n\t\t{ \"cuberite:achievement.diamondsToYou\",      CustomStatistic::AchDiamondsToYou}\n\t};\n\n\treturn CustomStatistics.at(ID);\n}\n\n\n\n\n\nstd::pair<NamespaceSerializer::Namespace, std::string_view> NamespaceSerializer::SplitNamespacedID(const std::string_view ID)\n{\n\tconst auto NamespaceIndex = ID.find(':');\n\tif (NamespaceIndex == std::string_view::npos)\n\t{\n\t\t// No explicit namespace defaults to the Minecraft namespace:\n\t\treturn { Namespace::Minecraft, ID };\n\t}\n\n\tconst auto Namespace = ID.substr(0, NamespaceIndex);\n\tif (Namespace == \"minecraft\")\n\t{\n\t\t// An unprefixed ID in the vanilla Minecraft namespace.\n\t\tconst auto Value = ID.substr(NamespaceIndex + 1);\n\n\t\treturn { Namespace::Minecraft, Value };\n\t}\n\n\tif (Namespace == \"cuberite\")\n\t{\n\t\treturn { Namespace::Cuberite, ID };\n\t}\n\n\treturn { Namespace::Unknown, ID };\n}\n\n\n\n\n\neMonsterType NamespaceSerializer::ToMonsterType(const std::string_view a_ID)\n{\n\tstatic const std::unordered_map<std::string_view, eMonsterType> MonsterTypes\n\t{\n\t\t{ \"bat\",              mtBat },\n\t\t{ \"blaze\",            mtBlaze },\n\t\t{ \"cat\",              mtCat },\n\t\t{ \"cave_spider\",      mtCaveSpider },\n\t\t{ \"chicken\",          mtChicken },\n\t\t{ \"cod\",              mtCod },\n\t\t{ \"cow\",              mtCow },\n\t\t{ \"creeper\",          mtCreeper },\n\t\t{ \"dolphin\",          mtDolphin },\n\t\t{ \"donkey\",           mtDonkey },\n\t\t{ \"drowned\",          mtDrowned },\n\t\t{ \"elder_guardian\",   mtElderGuardian },\n\t\t{ \"ender_dragon\",     mtEnderDragon },\n\t\t{ \"enderman\",         mtEnderman },\n\t\t{ \"endermite\",        mtEndermite },\n\t\t{ \"evoker\",           mtEvoker },\n\t\t{ \"fox\",              mtFox },\n\t\t{ \"ghast\",            mtGhast },\n\t\t{ \"giant\",            mtGiant },\n\t\t{ \"guardian\",         mtGuardian },\n\t\t{ \"horse\",            mtHorse },\n\t\t{ \"hoglin\",           mtHoglin },\n\t\t{ \"husk\",             mtHusk },\n\t\t{ \"illusioner\",       mtIllusioner },\n\t\t{ \"iron_golem\",       mtIronGolem },\n\t\t{ \"llama\",            mtLlama },\n\t\t{ \"magma_cube\",       mtMagmaCube },\n\t\t{ \"mooshroom\",        mtMooshroom },\n\t\t{ \"mule\",             mtMule },\n\t\t{ \"ocelot\",           mtOcelot },\n\t\t{ \"panda\",            mtPanda },\n\t\t{ \"parrot\",           mtParrot },\n\t\t{ \"phantom\",          mtPhantom },\n\t\t{ \"pig\",              mtPig },\n\t\t{ \"piglin\",           mtPiglin },\n\t\t{ \"piglin_brute\",     mtPiglinBrute },\n\t\t{ \"pillager\",         mtPillager },\n\t\t{ \"polar_bear\",       mtPolarBear },\n\t\t{ \"pufferfish\",       mtPufferfish },\n\t\t{ \"rabbit\",           mtRabbit },\n\t\t{ \"ravager\",          mtRavager },\n\t\t{ \"salmon\",           mtSalmon },\n\t\t{ \"sheep\",            mtSheep },\n\t\t{ \"shulker\",          mtShulker },\n\t\t{ \"silverfish\",       mtSilverfish },\n\t\t{ \"skeleton\",         mtSkeleton },\n\t\t{ \"skeleton_horse\",   mtSkeletonHorse },\n\t\t{ \"slime\",            mtSlime },\n\t\t{ \"snow_golem\",       mtSnowGolem },\n\t\t{ \"spider\",           mtSpider },\n\t\t{ \"squid\",            mtSquid },\n\t\t{ \"stray\",            mtStray },\n\t\t{ \"strider\",          mtStrider },\n\t\t{ \"trader_llama\",     mtTraderLlama },\n\t\t{ \"tropical_fish\",    mtTropicalFish },\n\t\t{ \"turtle\",           mtTurtle },\n\t\t{ \"vex\",              mtVex },\n\t\t{ \"villager\",         mtVillager },\n\t\t{ \"vindicator\",       mtVindicator },\n\t\t{ \"wandering_trader\", mtWanderingTrader },\n\t\t{ \"witch\",            mtWitch },\n\t\t{ \"wither\",           mtWither },\n\t\t{ \"wither_skeleton\",  mtWitherSkeleton },\n\t\t{ \"wolf\",             mtWolf },\n\t\t{ \"zoglin\",           mtZoglin },\n\t\t{ \"zombie\",           mtZombie },\n\t\t{ \"zombie_horse\",     mtZombieHorse },\n\t\t{ \"zombified_piglin\", mtZombiePigman },\n\t\t{ \"zombie_villager\",  mtZombieVillager },\n\n\t\t{ \"snowman\",          mtSnowGolem },\n\t\t{ \"villager_golem\",   mtIronGolem },\n\t\t{ \"zombie_pigman\",    mtZombiePigman },\n\n\t\t// Old names:\n\t\t{ \"Bat\",            mtBat },\n\t\t{ \"Blaze\",          mtBlaze },\n\t\t{ \"CaveSpider\",     mtCaveSpider },\n\t\t{ \"Chicken\",        mtChicken },\n\t\t{ \"Cow\",            mtCow },\n\t\t{ \"Creeper\",        mtCreeper },\n\t\t{ \"EnderDragon\",    mtEnderDragon },\n\t\t{ \"Enderman\",       mtEnderman },\n\t\t{ \"Ghast\",          mtGhast },\n\t\t{ \"Giant\",          mtGiant },\n\t\t{ \"Guardian\",       mtGuardian },\n\t\t{ \"Horse\",          mtHorse },\n\t\t{ \"VillagerGolem\",  mtIronGolem },\n\t\t{ \"LavaSlime\",      mtMagmaCube },\n\t\t{ \"MushroomCow\",    mtMooshroom },\n\t\t{ \"Ozelot\",         mtOcelot },\n\t\t{ \"Pig\",            mtPig },\n\t\t{ \"Rabbit\",         mtRabbit },\n\t\t{ \"Sheep\",          mtSheep },\n\t\t{ \"Silverfish\",     mtSilverfish },\n\t\t{ \"Skeleton\",       mtSkeleton },\n\t\t{ \"Slime\",          mtSlime },\n\t\t{ \"SnowMan\",        mtSnowGolem },\n\t\t{ \"Spider\",         mtSpider },\n\t\t{ \"Squid\",          mtSquid },\n\t\t{ \"Villager\",       mtVillager },\n\t\t{ \"Witch\",          mtWitch },\n\t\t{ \"WitherBoss\",     mtWither },\n\t\t{ \"WitherSkeleton\", mtWitherSkeleton },\n\t\t{ \"Wolf\",           mtWolf },\n\t\t{ \"Zombie\",         mtZombie },\n\t\t{ \"PigZombie\",      mtZombiePigman },\n\t\t{ \"ZombieVillager\", mtZombieVillager }\n\t};\n\n\treturn MonsterTypes.at(a_ID);\n}\n\n\n\n\n\nAString NamespaceSerializer::Prettify(AString a_ID)\n{\n\n\tbool NextLetterCapitalized = true;\n\tstd::for_each(a_ID.begin(), a_ID.end(), [&](char & a_Letter)\n\t{\n\t\tif (NextLetterCapitalized)\n\t\t{\n\t\t\ta_Letter = static_cast<char>(std::toupper(a_Letter));\n\t\t\tNextLetterCapitalized = false;\n\t\t}\n\t\telse if (a_Letter == '_')\n\t\t{\n\t\t\ta_Letter = ' ';\n\t\t\tNextLetterCapitalized = true;\n\t\t}\n\t});\n\treturn a_ID;\n}\n\n\n\n\n\nAString NamespaceSerializer::PrettifyEntityName(const AString & a_ID, const bool a_IsTamed)\n{\n\t// In older vanilla Minecraft version (before 1.14) ocelots and cats were the same mob.\n\t// So after killing a tamed ocelot without a custom name the message will say \"Cat was slain by [PlayerName]\".\n\tif ((a_ID == \"ocelot\") && a_IsTamed)\n\t{\n\t\treturn \"Cat\";\n\t}\n\treturn Prettify(a_ID);\n}\n"
  },
  {
    "path": "src/WorldStorage/NamespaceSerializer.h",
    "content": "#pragma once\n\n#include \"Defines.h\"\n#include \"Mobs/MonsterTypes.h\"\n#include \"Registries/CustomStatistics.h\"\n\nnamespace NamespaceSerializer\n{\n\tenum class Namespace\n\t{\n\t\tMinecraft,\n\t\tCuberite,\n\t\tUnknown\n\t};\n\n\tunsigned DataVersion();\n\n\tstd::string_view From(CustomStatistic a_ID);\n\tstd::string_view From(eMonsterType a_ID);\n\tstd::string_view From(BannerPattern a_ID);\n\n\tCustomStatistic ToCustomStatistic(std::string_view a_ID);\n\teMonsterType ToMonsterType(std::string_view a_ID);\n\n\tstd::pair<Namespace, std::string_view> SplitNamespacedID(std::string_view ID);\n\n\t// Examples: Input: \"wolf\" -> Output: \"Wolf\", Input: \"iron_golem\" -> Output: \"Iron Golem\"\n\tAString Prettify(AString a_ID);\n\tAString PrettifyEntityName(const AString & a_ID, const bool a_IsTamed = false);\n}\n"
  },
  {
    "path": "src/WorldStorage/SchematicFileSerializer.cpp",
    "content": "\n// SchematicFileSerializer.cpp\n\n// Implements the cSchematicFileSerializer class representing the interface to load and save cBlockArea to a .schematic file\n\n#include \"Globals.h\"\n\n#include \"FastNBT.h\"\n#include \"SchematicFileSerializer.h\"\n#include \"../OSSupport/GZipFile.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSchematicFileSerializer:\n\nvoid cSchematicFileSerializer::LoadFromSchematicFile(cBlockArea & a_BlockArea, const std::string & a_FileName)\n{\n\tconst auto Data = GZipFile::ReadRestOfFile(a_FileName);\n\tconst cParsedNBT NBT(Data.GetView());\n\n\tif (!NBT.IsValid())\n\t{\n\t\tthrow std::runtime_error(fmt::format(\"Cannot parse the NBT in the schematic file \\\"{}\\\".\", a_FileName));\n\t}\n\n\tLoadFromSchematicNBT(a_BlockArea, NBT);\n}\n\n\n\n\n\nvoid cSchematicFileSerializer::LoadFromSchematicString(cBlockArea & a_BlockArea, const ContiguousByteBufferView a_SchematicData)\n{\n\tconst auto Extracted = Compression::Extractor().ExtractGZip(a_SchematicData);\n\tconst cParsedNBT NBT(Extracted.GetView());\n\n\tif (!NBT.IsValid())\n\t{\n\t\tthrow std::runtime_error(\"Cannot parse the NBT in the schematic data.\");\n\t}\n\n\tLoadFromSchematicNBT(a_BlockArea, NBT);\n}\n\n\n\n\n\nvoid cSchematicFileSerializer::SaveToSchematicFile(const cBlockArea & a_BlockArea, const std::string & a_FileName)\n{\n\tGZipFile::Write(a_FileName, SaveToSchematicNBT(a_BlockArea));\n}\n\n\n\n\n\nCompression::Result cSchematicFileSerializer::SaveToSchematicString(const cBlockArea & a_BlockArea)\n{\n\treturn Compression::Compressor().CompressGZip(SaveToSchematicNBT(a_BlockArea));\n}\n\n\n\n\n\nvoid cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, const cParsedNBT & a_NBT)\n{\n\tint TMaterials = a_NBT.FindChildByName(a_NBT.GetRoot(), \"Materials\");\n\tif ((TMaterials > 0) && (a_NBT.GetType(TMaterials) == TAG_String))\n\t{\n\t\tAString Materials = a_NBT.GetString(TMaterials);\n\t\tif (Materials.compare(\"Alpha\") != 0)\n\t\t{\n\t\t\tthrow std::runtime_error(fmt::format(\"Materials tag is present and \\\"{}\\\" instead of \\\"Alpha\\\". Possibly a wrong-format schematic file.\", Materials));\n\t\t}\n\t}\n\tint TSizeX = a_NBT.FindChildByName(a_NBT.GetRoot(), \"Width\");\n\tint TSizeY = a_NBT.FindChildByName(a_NBT.GetRoot(), \"Height\");\n\tint TSizeZ = a_NBT.FindChildByName(a_NBT.GetRoot(), \"Length\");\n\tif (\n\t\t(TSizeX < 0) || (TSizeY < 0) || (TSizeZ < 0) ||\n\t\t(a_NBT.GetType(TSizeX) != TAG_Short) ||\n\t\t(a_NBT.GetType(TSizeY) != TAG_Short) ||\n\t\t(a_NBT.GetType(TSizeZ) != TAG_Short)\n\t)\n\t{\n\t\tthrow std::runtime_error(fmt::format(\n\t\t\t\"Dimensions are missing from the schematic file ({}, {}, {}), ({}, {}, {})\",\n\t\t\tTSizeX, TSizeY, TSizeZ,\n\t\t\t(TSizeX >= 0) ? a_NBT.GetType(TSizeX) : -1,\n\t\t\t(TSizeY >= 0) ? a_NBT.GetType(TSizeY) : -1,\n\t\t\t(TSizeZ >= 0) ? a_NBT.GetType(TSizeZ) : -1\n\t\t));\n\t}\n\n\tint SizeX = a_NBT.GetShort(TSizeX);\n\tint SizeY = a_NBT.GetShort(TSizeY);\n\tint SizeZ = a_NBT.GetShort(TSizeZ);\n\tif ((SizeX < 1) || (SizeX > 65535) || (SizeY < 1) || (SizeY > 65535) || (SizeZ < 1) || (SizeZ > 65535))\n\t{\n\t\tthrow std::runtime_error(fmt::format(\"Dimensions are invalid in the schematic file: {}, {}, {}\", SizeX, SizeY, SizeZ));\n\t}\n\n\tint TBlockTypes = a_NBT.FindChildByName(a_NBT.GetRoot(), \"Blocks\");\n\tint TBlockMetas = a_NBT.FindChildByName(a_NBT.GetRoot(), \"Data\");\n\tif ((TBlockTypes < 0) || (a_NBT.GetType(TBlockTypes) != TAG_ByteArray))\n\t{\n\t\tthrow std::runtime_error(fmt::format(\"BlockTypes are invalid in the schematic file: {}\", TBlockTypes));\n\t}\n\tbool AreMetasPresent = (TBlockMetas > 0) && (a_NBT.GetType(TBlockMetas) == TAG_ByteArray);\n\n\ta_BlockArea.Clear();\n\ta_BlockArea.SetSize(SizeX, SizeY, SizeZ, AreMetasPresent ? (cBlockArea::baTypes | cBlockArea::baMetas) : cBlockArea::baTypes);\n\n\tint TOffsetX = a_NBT.FindChildByName(a_NBT.GetRoot(), \"WEOffsetX\");\n\tint TOffsetY = a_NBT.FindChildByName(a_NBT.GetRoot(), \"WEOffsetY\");\n\tint TOffsetZ = a_NBT.FindChildByName(a_NBT.GetRoot(), \"WEOffsetZ\");\n\n\tif (\n\t\t(TOffsetX < 0) || (TOffsetY < 0) || (TOffsetZ < 0) ||\n\t\t(a_NBT.GetType(TOffsetX) != TAG_Int) ||\n\t\t(a_NBT.GetType(TOffsetY) != TAG_Int) ||\n\t\t(a_NBT.GetType(TOffsetZ) != TAG_Int)\n\t)\n\t{\n\t\t// Not every schematic file has an offset, so we shoudn't give a warn message.\n\t\ta_BlockArea.SetWEOffset(0, 0, 0);\n\t}\n\telse\n\t{\n\t\ta_BlockArea.SetWEOffset(a_NBT.GetInt(TOffsetX), a_NBT.GetInt(TOffsetY), a_NBT.GetInt(TOffsetZ));\n\t}\n\n\t// Copy the block types and metas:\n\tsize_t NumTypeBytes = a_BlockArea.GetBlockCount();\n\tif (a_NBT.GetDataLength(TBlockTypes) < NumTypeBytes)\n\t{\n\t\tLOG(\"BlockTypes truncated in the schematic file (exp %u, got %u bytes). Loading partial.\",\n\t\t\tstatic_cast<unsigned>(NumTypeBytes), static_cast<unsigned>(a_NBT.GetDataLength(TBlockTypes))\n\t\t);\n\t\tNumTypeBytes = a_NBT.GetDataLength(TBlockTypes);\n\t}\n\tmemcpy(a_BlockArea.GetBlockTypes(), a_NBT.GetData(TBlockTypes), NumTypeBytes);\n\n\tif (AreMetasPresent)\n\t{\n\t\tsize_t NumMetaBytes = a_BlockArea.GetBlockCount();\n\t\tif (a_NBT.GetDataLength(TBlockMetas) < NumMetaBytes)\n\t\t{\n\t\t\tLOG(\"BlockMetas truncated in the schematic file (exp %u, got %u bytes). Loading partial.\",\n\t\t\t\tstatic_cast<unsigned>(NumMetaBytes), static_cast<unsigned>(a_NBT.GetDataLength(TBlockMetas))\n\t\t\t);\n\t\t\tNumMetaBytes = a_NBT.GetDataLength(TBlockMetas);\n\t\t}\n\t\tmemcpy(a_BlockArea.GetBlockMetas(), a_NBT.GetData(TBlockMetas), NumMetaBytes);\n\t}\n}\n\n\n\n\n\nContiguousByteBuffer cSchematicFileSerializer::SaveToSchematicNBT(const cBlockArea & a_BlockArea)\n{\n\tcFastNBTWriter Writer(\"Schematic\");\n\tWriter.AddShort(\"Width\",  static_cast<Int16>(a_BlockArea.m_Size.x));\n\tWriter.AddShort(\"Height\", static_cast<Int16>(a_BlockArea.m_Size.y));\n\tWriter.AddShort(\"Length\", static_cast<Int16>(a_BlockArea.m_Size.z));\n\tWriter.AddString(\"Materials\", \"Alpha\");\n\tif (a_BlockArea.HasBlockTypes())\n\t{\n\t\tWriter.AddByteArray(\"Blocks\", reinterpret_cast<const char *>(a_BlockArea.GetBlockTypes()), a_BlockArea.GetBlockCount());\n\t}\n\telse\n\t{\n\t\tAString Dummy(a_BlockArea.GetBlockCount(), 0);\n\t\tWriter.AddByteArray(\"Blocks\", Dummy.data(), Dummy.size());\n\t}\n\tif (a_BlockArea.HasBlockMetas())\n\t{\n\t\tWriter.AddByteArray(\"Data\", reinterpret_cast<const char *>(a_BlockArea.GetBlockMetas()), a_BlockArea.GetBlockCount());\n\t}\n\telse\n\t{\n\t\tAString Dummy(a_BlockArea.GetBlockCount(), 0);\n\t\tWriter.AddByteArray(\"Data\", Dummy.data(), Dummy.size());\n\t}\n\n\tWriter.AddInt(\"WEOffsetX\", a_BlockArea.m_WEOffset.x);\n\tWriter.AddInt(\"WEOffsetY\", a_BlockArea.m_WEOffset.y);\n\tWriter.AddInt(\"WEOffsetZ\", a_BlockArea.m_WEOffset.z);\n\n\t// TODO: Save entities and block entities\n\tWriter.BeginList(\"Entities\", TAG_Compound);\n\tWriter.EndList();\n\tWriter.BeginList(\"TileEntities\", TAG_Compound);\n\tWriter.EndList();\n\tWriter.Finish();\n\n\treturn ContiguousByteBuffer(Writer.GetResult());\n}\n"
  },
  {
    "path": "src/WorldStorage/SchematicFileSerializer.h",
    "content": "\n// SchematicFileSerializer.h\n\n// Declares the cSchematicFileSerializer class representing the interface to load and save cBlockArea to a .schematic file\n\n\n\n\n\n#pragma once\n\n#include \"../BlockArea.h\"\n#include \"../StringCompression.h\"\n\n\n\n\n\n// fwd: FastNBT.h\nclass cParsedNBT;\n\n\n\n\n\nclass cSchematicFileSerializer\n{\npublic:\n\n\t/** Loads an area from a .schematic file. */\n\tstatic void LoadFromSchematicFile(cBlockArea & a_BlockArea, const std::string & a_FileName);\n\n\t/** Loads an area from a string containing the .schematic file data. */\n\tstatic void LoadFromSchematicString(cBlockArea & a_BlockArea, ContiguousByteBufferView a_SchematicData);\n\n\t/** Saves the area into a .schematic file. */\n\tstatic void SaveToSchematicFile(const cBlockArea & a_BlockArea, const std::string & a_FileName);\n\n\t/** Saves the area into a string containing the .schematic file data. */\n\tstatic Compression::Result SaveToSchematicString(const cBlockArea & a_BlockArea);\n\nprivate:\n\n\t/** Loads the area from a schematic file uncompressed and parsed into a NBT tree. */\n\tstatic void LoadFromSchematicNBT(cBlockArea & a_BlockArea, const cParsedNBT & a_NBT);\n\n\t/** Saves the area into a NBT representation and returns the NBT data as a string. */\n\tstatic ContiguousByteBuffer SaveToSchematicNBT(const cBlockArea & a_BlockArea);\n};\n"
  },
  {
    "path": "src/WorldStorage/ScoreboardSerializer.cpp",
    "content": "\n// ScoreboardSerializer.cpp\n\n\n#include \"Globals.h\"\n#include \"ScoreboardSerializer.h\"\n#include \"OSSupport/GZipFile.h\"\n#include \"FastNBT.h\"\n\n#include \"../Scoreboard.h\"\n\n\n\n\n\ncScoreboardSerializer::cScoreboardSerializer(const AString & a_WorldName, cScoreboard * a_ScoreBoard):\n\tm_ScoreBoard(a_ScoreBoard)\n{\n\tauto DataPath = fmt::format(FMT_STRING(\"{}{}data\"), a_WorldName, cFile::PathSeparator());\n\tm_Path = DataPath + cFile::PathSeparator() + \"scoreboard.dat\";\n\tcFile::CreateFolder(DataPath);\n}\n\n\n\n\n\nbool cScoreboardSerializer::Load()\n{\n\ttry\n\t{\n\t\tconst auto Data = GZipFile::ReadRestOfFile(m_Path);\n\t\tconst cParsedNBT NBT(Data.GetView());\n\n\t\tif (!NBT.IsValid())\n\t\t{\n\t\t\t// NBT Parsing failed\n\t\t\treturn false;\n\t\t}\n\n\t\treturn LoadScoreboardFromNBT(NBT);\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(\"Failed to load scoreboard from \\\"%s\\\": %s\", m_Path.c_str(), Oops.what());\n\t\treturn false;\n\t}\n}\n\n\n\n\n\nbool cScoreboardSerializer::Save(void)\n{\n\tcFastNBTWriter Writer;\n\tSaveScoreboardToNBT(Writer);\n\tWriter.Finish();\n\n#ifndef NDEBUG\n\tcParsedNBT TestParse(Writer.GetResult());\n\tASSERT(TestParse.IsValid());\n#endif  // !NDEBUG\n\n\tGZipFile::Write(m_Path, Writer.GetResult());\n\n\treturn true;\n}\n\n\n\n\n\nvoid cScoreboardSerializer::SaveScoreboardToNBT(cFastNBTWriter & a_Writer)\n{\n\ta_Writer.BeginCompound(\"data\");\n\n\ta_Writer.BeginList(\"Objectives\", TAG_Compound);\n\n\tfor (cScoreboard::cObjectiveMap::const_iterator it = m_ScoreBoard->m_Objectives.begin(); it != m_ScoreBoard->m_Objectives.end(); ++it)\n\t{\n\t\tconst cObjective & Objective = it->second;\n\n\t\ta_Writer.BeginCompound(\"\");\n\n\t\ta_Writer.AddString(\"CriteriaName\", cObjective::TypeToString(Objective.GetType()));\n\n\t\ta_Writer.AddString(\"DisplayName\", Objective.GetDisplayName());\n\t\ta_Writer.AddString(\"Name\", it->first);\n\n\t\ta_Writer.EndCompound();\n\t}\n\n\ta_Writer.EndList();  // Objectives\n\n\ta_Writer.BeginList(\"PlayerScores\", TAG_Compound);\n\n\tfor (cScoreboard::cObjectiveMap::const_iterator it = m_ScoreBoard->m_Objectives.begin(); it != m_ScoreBoard->m_Objectives.end(); ++it)\n\t{\n\t\tconst cObjective & Objective = it->second;\n\n\t\tfor (cObjective::cScoreMap::const_iterator it2 = Objective.m_Scores.begin(); it2 != Objective.m_Scores.end(); ++it2)\n\t\t{\n\t\t\ta_Writer.BeginCompound(\"\");\n\n\t\t\ta_Writer.AddInt(\"Score\", it2->second);\n\n\t\t\ta_Writer.AddString(\"Name\", it2->first);\n\t\t\ta_Writer.AddString(\"Objective\", it->first);\n\n\t\t\ta_Writer.EndCompound();\n\t\t}\n\t}\n\n\ta_Writer.EndList();  // PlayerScores\n\n\ta_Writer.BeginList(\"Teams\", TAG_Compound);\n\n\tfor (cScoreboard::cTeamMap::const_iterator it = m_ScoreBoard->m_Teams.begin(); it != m_ScoreBoard->m_Teams.end(); ++it)\n\t{\n\t\tconst cTeam & Team = it->second;\n\n\t\ta_Writer.BeginCompound(\"\");\n\n\t\ta_Writer.AddByte(\"AllowFriendlyFire\",     Team.AllowsFriendlyFire()      ? 1 : 0);\n\t\ta_Writer.AddByte(\"SeeFriendlyInvisibles\", Team.CanSeeFriendlyInvisible() ? 1 : 0);\n\n\t\ta_Writer.AddString(\"DisplayName\", Team.GetDisplayName());\n\t\ta_Writer.AddString(\"Name\", it->first);\n\n\t\ta_Writer.AddString(\"Prefix\", Team.GetPrefix());\n\t\ta_Writer.AddString(\"Suffix\", Team.GetSuffix());\n\n\t\ta_Writer.BeginList(\"Players\", TAG_String);\n\n\t\tfor (cTeam::cPlayerNameSet::const_iterator it2 = Team.m_Players.begin(); it2 != Team.m_Players.end(); ++it2)\n\t\t{\n\t\t\ta_Writer.AddString(\"\", *it2);\n\t\t}\n\n\t\ta_Writer.EndList();\n\n\t\ta_Writer.EndCompound();\n\t}\n\n\ta_Writer.EndList();  // Teams\n\n\ta_Writer.BeginCompound(\"DisplaySlots\");\n\n\tcObjective * Objective = m_ScoreBoard->GetObjectiveIn(cScoreboard::dsList);\n\ta_Writer.AddString(\"slot_0\", (Objective == nullptr) ? \"\" : Objective->GetName());\n\n\tObjective = m_ScoreBoard->GetObjectiveIn(cScoreboard::dsSidebar);\n\ta_Writer.AddString(\"slot_1\", (Objective == nullptr) ? \"\" : Objective->GetName());\n\n\tObjective = m_ScoreBoard->GetObjectiveIn(cScoreboard::dsName);\n\ta_Writer.AddString(\"slot_2\", (Objective == nullptr) ? \"\" : Objective->GetName());\n\n\ta_Writer.EndCompound();  // DisplaySlots\n\n\ta_Writer.EndCompound();  // Data\n}\n\n\n\n\n\nbool cScoreboardSerializer::LoadScoreboardFromNBT(const cParsedNBT & a_NBT)\n{\n\tint Data = a_NBT.FindChildByName(0, \"data\");\n\tif (Data < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tint Objectives = a_NBT.FindChildByName(Data, \"Objectives\");\n\tif (Objectives < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (int Child = a_NBT.GetFirstChild(Objectives); Child >= 0; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tAString CriteriaName, DisplayName, Name;\n\n\t\tint CurrLine = a_NBT.FindChildByName(Child, \"CriteriaName\");\n\t\tif (CurrLine >= 0)\n\t\t{\n\t\t\tCriteriaName = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"DisplayName\");\n\t\tif (CurrLine >= 0)\n\t\t{\n\t\t\tDisplayName = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"Name\");\n\t\tif (CurrLine >= 0)\n\t\t{\n\t\t\tName = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tcObjective::eType Type = cObjective::StringToType(CriteriaName);\n\n\t\tm_ScoreBoard->RegisterObjective(Name, DisplayName, Type);\n\t}\n\n\tint PlayerScores = a_NBT.FindChildByName(Data, \"PlayerScores\");\n\tif (PlayerScores < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (int Child = a_NBT.GetFirstChild(PlayerScores); Child >= 0; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tAString Name, ObjectiveName;\n\n\t\tcObjective::Score Score = 0;\n\n\t\tint CurrLine = a_NBT.FindChildByName(Child, \"Score\");\n\t\tif (CurrLine >= 0)\n\t\t{\n\t\t\tScore = a_NBT.GetInt(CurrLine);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"Name\");\n\t\tif (CurrLine >= 0)\n\t\t{\n\t\t\tName = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"Objective\");\n\t\tif (CurrLine >= 0)\n\t\t{\n\t\t\tObjectiveName = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tcObjective * Objective = m_ScoreBoard->GetObjective(ObjectiveName);\n\n\t\tif (Objective)\n\t\t{\n\t\t\tObjective->SetScore(Name, Score);\n\t\t}\n\t}\n\n\tint Teams = a_NBT.FindChildByName(Data, \"Teams\");\n\tif (Teams < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (int Child = a_NBT.GetFirstChild(Teams); Child >= 0; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tAString Name, DisplayName, Prefix, Suffix;\n\n\t\tbool AllowsFriendlyFire = true, CanSeeFriendlyInvisible = false;\n\n\t\tint CurrLine = a_NBT.FindChildByName(Child, \"Name\");\n\t\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_String))\n\t\t{\n\t\t\tName = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"DisplayName\");\n\t\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_String))\n\t\t{\n\t\t\tDisplayName = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"Prefix\");\n\t\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_String))\n\t\t{\n\t\t\tPrefix = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"Suffix\");\n\t\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_String))\n\t\t{\n\t\t\tSuffix = a_NBT.GetString(CurrLine);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"AllowFriendlyFire\");\n\t\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Int))\n\t\t{\n\t\t\tAllowsFriendlyFire = (a_NBT.GetInt(CurrLine) != 0);\n\t\t}\n\n\t\tCurrLine = a_NBT.FindChildByName(Child, \"SeeFriendlyInvisibles\");\n\t\tif ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Int))\n\t\t{\n\t\t\tCanSeeFriendlyInvisible = (a_NBT.GetInt(CurrLine) != 0);\n\t\t}\n\n\t\tcTeam * Team = m_ScoreBoard->RegisterTeam(Name, DisplayName, Prefix, Suffix);\n\n\t\tTeam->SetFriendlyFire(AllowsFriendlyFire);\n\t\tTeam->SetCanSeeFriendlyInvisible(CanSeeFriendlyInvisible);\n\n\t\tint Players = a_NBT.FindChildByName(Child, \"Players\");\n\t\tif (Players < 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (int ChildB = a_NBT.GetFirstChild(Players); ChildB >= 0; ChildB = a_NBT.GetNextSibling(ChildB))\n\t\t{\n\t\t\tTeam->AddPlayer(a_NBT.GetString(ChildB));\n\t\t}\n\t}\n\n\tint DisplaySlots = a_NBT.FindChildByName(Data, \"DisplaySlots\");\n\tif (DisplaySlots < 0)\n\t{\n\t\treturn false;\n\t}\n\n\tint CurrLine = a_NBT.FindChildByName(DisplaySlots, \"slot_0\");\n\tif (CurrLine >= 0)\n\t{\n\t\tAString Name = a_NBT.GetString(CurrLine);\n\n\t\tm_ScoreBoard->SetDisplay(Name, cScoreboard::dsList);\n\t}\n\n\tCurrLine = a_NBT.FindChildByName(DisplaySlots, \"slot_1\");\n\tif (CurrLine >= 0)\n\t{\n\t\tAString Name = a_NBT.GetString(CurrLine);\n\n\t\tm_ScoreBoard->SetDisplay(Name, cScoreboard::dsSidebar);\n\t}\n\n\tCurrLine = a_NBT.FindChildByName(DisplaySlots, \"slot_2\");\n\tif (CurrLine >= 0)\n\t{\n\t\tAString Name = a_NBT.GetString(CurrLine);\n\n\t\tm_ScoreBoard->SetDisplay(Name, cScoreboard::dsName);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "src/WorldStorage/ScoreboardSerializer.h",
    "content": "\n// ScoreboardSerializer.h\n\n// Declares the cScoreboardSerializer class that is used for saving scoreboards into NBT format used by Anvil\n\n\n\n\n\n#pragma once\n\n\n\n\n\n// fwd:\nclass cFastNBTWriter;\nclass cParsedNBT;\nclass cScoreboard;\n\n\n\n\nclass cScoreboardSerializer\n{\npublic:\n\n\tcScoreboardSerializer(const AString & a_WorldName, cScoreboard * a_ScoreBoard);\n\n\t/** Try to load the scoreboard */\n\tbool Load(void);\n\n\t/** Try to save the scoreboard */\n\tbool Save(void);\n\n\nprivate:\n\n\tvoid SaveScoreboardToNBT(cFastNBTWriter & a_Writer);\n\n\tbool LoadScoreboardFromNBT(const cParsedNBT & a_NBT);\n\n\tcScoreboard * m_ScoreBoard;\n\n\tAString m_Path;\n\n\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/WorldStorage/StatisticsSerializer.cpp",
    "content": "\n// StatisticsSerializer.cpp\n\n\n#include \"Globals.h\"\n#include \"StatisticsManager.h\"\n#include \"StatisticsSerializer.h\"\n#include \"NamespaceSerializer.h\"\n\n#include <json/json.h>\n\n\n\n\n\nstatic auto MakeStatisticsDirectory(const std::string & WorldPath, std::string && FileName)\n{\n\t// Even though stats are shared between worlds, they are (usually) saved\n\t// inside the folder of the default world.\n\n\t// Path to the world's statistics folder.\n\tconst auto Path = WorldPath + cFile::GetPathSeparator() + \"stats\";\n\n\t// Ensure that the directory exists.\n\tcFile::CreateFolder(Path);\n\n\treturn Path + cFile::GetPathSeparator() + std::move(FileName) + \".json\";\n}\n\n\n\n\n\nstatic void SaveStatToJSON(const StatisticsManager & Manager, Json::Value & a_Out)\n{\n\tif (Manager.Custom.empty())\n\t{\n\t\t// Avoid saving \"custom\": null to disk:\n\t\treturn;\n\t}\n\n\tauto & Custom = a_Out[\"custom\"];\n\tfor (const auto & [Statistic, Value] : Manager.Custom)\n\t{\n\t\tCustom[NamespaceSerializer::From(Statistic).data()] = Value;\n\t}\n}\n\n\n\n\n\nstatic void LoadCustomStatFromJSON(StatisticsManager & Manager, const Json::Value & a_In)\n{\n\tfor (auto it = a_In.begin(); it != a_In.end(); ++it)\n\t{\n\t\tconst auto & Key = it.key().asString();\n\t\tconst auto & [Namespace, Name] = NamespaceSerializer::SplitNamespacedID(Key);\n\n\t\tif (Namespace == NamespaceSerializer::Namespace::Unknown)\n\t\t{\n\t\t\t// Ignore non-Vanilla, non-Cuberite namespaces for now:\n\t\t\tcontinue;\n\t\t}\n\n\t\tManager.Custom[NamespaceSerializer::ToCustomStatistic(Name)] = it->asUInt();\n\t}\n}\n\n\n\n\n\nvoid StatisticsSerializer::Load(StatisticsManager & Manager, const std::string & WorldPath, std::string && FileName)\n{\n\tJson::Value Root;\n\tInputFileStream(MakeStatisticsDirectory(WorldPath, std::move(FileName))) >> Root;\n\n\tLoadCustomStatFromJSON(Manager, Root[\"stats\"][\"custom\"]);\n}\n\n\n\n\n\nvoid StatisticsSerializer::Save(const StatisticsManager & Manager, const std::string & WorldPath, std::string && FileName)\n{\n\tJson::Value Root;\n\n\tSaveStatToJSON(Manager, Root[\"stats\"]);\n\tRoot[\"DataVersion\"] = NamespaceSerializer::DataVersion();\n\n\tOutputFileStream(MakeStatisticsDirectory(WorldPath, std::move(FileName))) << Root;\n}\n"
  },
  {
    "path": "src/WorldStorage/StatisticsSerializer.h",
    "content": "\n// StatisticsSerializer.h\n\n// Declares the cStatSerializer class that is used for saving stats into JSON\n\n\n\n\n\n#pragma once\n\n\n\n\n\nstruct StatisticsManager;\nnamespace Json { class Value; }\n\n\n\n\n\nnamespace StatisticsSerializer\n{\n\t/* Try to load the player statistics. */\n\tvoid Load(StatisticsManager & Manager, const std::string & WorldPath, std::string && FileName);\n\n\t/* Try to save the player statistics. */\n\tvoid Save(const StatisticsManager & Manager, const std::string & WorldPath, std::string && FileName);\n}\n"
  },
  {
    "path": "src/WorldStorage/WSSAnvil.cpp",
    "content": "#include \"Globals.h\"\n#include \"WSSAnvil.h\"\n#include \"NBTChunkSerializer.h\"\n#include \"EnchantmentSerializer.h\"\n#include \"NamespaceSerializer.h\"\n#include \"json/json.h\"\n#include \"OSSupport/GZipFile.h\"\n#include \"../World.h\"\n#include \"../Item.h\"\n#include \"../ItemGrid.h\"\n#include \"../StringCompression.h\"\n#include \"../SetChunkData.h\"\n#include \"../Root.h\"\n#include \"../BlockType.h\"\n#include \"../JsonUtils.h\"\n\n#include \"../BlockEntities/BannerEntity.h\"\n#include \"../BlockEntities/BeaconEntity.h\"\n#include \"../BlockEntities/BedEntity.h\"\n#include \"../BlockEntities/BrewingstandEntity.h\"\n#include \"../BlockEntities/ChestEntity.h\"\n#include \"../BlockEntities/CommandBlockEntity.h\"\n#include \"../BlockEntities/DispenserEntity.h\"\n#include \"../BlockEntities/DropperEntity.h\"\n#include \"../BlockEntities/EnchantingTableEntity.h\"\n#include \"../BlockEntities/EnderChestEntity.h\"\n#include \"../BlockEntities/EndPortalEntity.h\"\n#include \"../BlockEntities/FurnaceEntity.h\"\n#include \"../BlockEntities/HopperEntity.h\"\n#include \"../BlockEntities/JukeboxEntity.h\"\n#include \"../BlockEntities/NoteEntity.h\"\n#include \"../BlockEntities/SignEntity.h\"\n#include \"../BlockEntities/MobHeadEntity.h\"\n#include \"../BlockEntities/MobSpawnerEntity.h\"\n#include \"../BlockEntities/FlowerPotEntity.h\"\n\n#include \"../Mobs/IncludeAllMonsters.h\"\n\n#include \"../Entities/Boat.h\"\n#include \"../Entities/EnderCrystal.h\"\n#include \"../Entities/FallingBlock.h\"\n#include \"../Entities/Minecart.h\"\n#include \"../Entities/Pickup.h\"\n#include \"../Entities/ArrowEntity.h\"\n#include \"../Entities/SplashPotionEntity.h\"\n#include \"../Entities/ThrownEggEntity.h\"\n#include \"../Entities/ThrownEnderPearlEntity.h\"\n#include \"../Entities/ThrownSnowballEntity.h\"\n#include \"../Entities/FireChargeEntity.h\"\n#include \"../Entities/GhastFireballEntity.h\"\n#include \"../Entities/TNTEntity.h\"\n#include \"../Entities/ExpOrb.h\"\n#include \"../Entities/HangingEntity.h\"\n#include \"../Entities/ItemFrame.h\"\n#include \"../Entities/LeashKnot.h\"\n#include \"../Entities/Painting.h\"\n\n#include \"../Protocol/MojangAPI.h\"\n#include \"../Server.h\"\n#include \"../BoundingBox.h\"\n\n\n\n\n\n/** If defined, the BlockSkyLight values will be copied over to BlockLight upon chunk saving,\nthus making skylight visible in Minutor's Lighting mode\n*/\n// #define DEBUG_SKYLIGHT\n\n/** Maximum number of MCA files that are cached in memory.\nSince only the header is actually in the memory, this number can be high, but still, each file means an OS FS handle.\n*/\n#define MAX_MCA_FILES 32\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWSSAnvil:\n\ncWSSAnvil::cWSSAnvil(cWorld * a_World, int a_CompressionFactor):\n\tSuper(a_World),\n\tm_Compressor(a_CompressionFactor)\n{\n\t// Create a level.dat file for mapping tools, if it doesn't already exist:\n\tauto fnam = fmt::format(FMT_STRING(\"{}{}level.dat\"), a_World->GetDataPath(), cFile::PathSeparator());\n\tif (!cFile::Exists(fnam))\n\t{\n\t\tcFastNBTWriter Writer;\n\t\tWriter.BeginCompound(\"Data\");\n\t\tWriter.AddByte(\"allowCommands\", 1);\n\t\tWriter.AddByte(\"Difficulty\", 2);\n\t\tWriter.AddByte(\"hardcore\", cRoot::Get()->GetServer()->IsHardcore() ? 1 : 0);\n\t\tWriter.AddByte(\"initialized\", 1);\n\t\tWriter.AddByte(\"MapFeatures\", 1);\n\t\tWriter.AddByte(\"raining\", a_World->IsWeatherRain() ? 1 : 0);\n\t\tWriter.AddByte(\"thundering\", a_World->IsWeatherStorm() ? 1 : 0);\n\t\tWriter.AddInt(\"GameType\", static_cast<int>(a_World->GetGameMode()));\n\t\tWriter.AddInt(\"generatorVersion\", 1);\n\t\tWriter.AddInt(\"SpawnX\", a_World->GetSpawnX());\n\t\tWriter.AddInt(\"SpawnY\", a_World->GetSpawnY());\n\t\tWriter.AddInt(\"SpawnZ\", a_World->GetSpawnZ());\n\t\tWriter.AddInt(\"version\", 19133);\n\t\tWriter.AddLong(\"DayTime\", a_World->GetWorldDate().count());\n\t\tWriter.AddLong(\"Time\", a_World->GetWorldAge().count());\n\t\tWriter.AddLong(\"SizeOnDisk\", 0);\n\t\tWriter.AddString(\"generatorName\", \"default\");\n\t\tWriter.AddString(\"generatorOptions\", \"\");\n\t\tWriter.AddString(\"LevelName\", a_World->GetName());\n\t\tWriter.EndCompound();\n\t\tWriter.Finish();\n\n\t\tGZipFile::Write(fnam, Writer.GetResult());\n\t}\n}\n\n\n\n\n\ncWSSAnvil::~cWSSAnvil()\n{\n\tcCSLock Lock(m_CS);\n\tm_Files.clear();\n}\n\n\n\n\n\nbool cWSSAnvil::LoadChunk(const cChunkCoords & a_Chunk)\n{\n\tContiguousByteBuffer ChunkData;\n\tif (!GetChunkData(a_Chunk, ChunkData))\n\t{\n\t\t// The reason for failure is already printed in GetChunkData()\n\t\treturn false;\n\t}\n\n\treturn LoadChunkFromData(a_Chunk, ChunkData);\n}\n\n\n\n\n\nbool cWSSAnvil::SaveChunk(const cChunkCoords & a_Chunk)\n{\n\ttry\n\t{\n\t\tif (!SetChunkData(a_Chunk, SaveChunkToData(a_Chunk).GetView()))\n\t\t{\n\t\t\tLOGWARNING(\"Cannot store chunk [%d, %d] data\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ);\n\t\t\treturn false;\n\t\t}\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tLOGWARNING(\"Cannot serialize chunk [%d, %d] into data: %s\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, Oops.what());\n\t\treturn false;\n\t}\n\n\t// Everything successful\n\treturn true;\n}\n\n\n\n\n\nvoid cWSSAnvil::ChunkLoadFailed(const cChunkCoords a_ChunkCoords, const AString & a_Reason, const ContiguousByteBufferView a_ChunkDataToSave)\n{\n\t// Construct the filename for offloading:\n\tauto OffloadFileName = fmt::format(FMT_STRING(\"{0}{1}region{1}badchunks\"), m_World->GetDataPath(), cFile::PathSeparator());\n\tcFile::CreateFolder(OffloadFileName);\n\tauto t = time(nullptr);\n\tstruct tm stm;\n\t#ifdef _MSC_VER\n\t\tlocaltime_s(&stm, &t);\n\t#else\n\t\tlocaltime_r(&t, &stm);\n\t#endif\n\tOffloadFileName.append(fmt::format(\n\t\tFMT_STRING(\"{}ch.{}.{}.{}-{:02d}-{:02d}-{:02d}-{:02d}-{:02d}.dat\"),\n\t\tcFile::PathSeparator(), a_ChunkCoords.m_ChunkX, a_ChunkCoords.m_ChunkZ,\n\t\tstm.tm_year + 1900, stm.tm_mon + 1, stm.tm_mday, stm.tm_hour, stm.tm_min, stm.tm_sec\n\t));\n\n\t// Log the warning to console:\n\tconst int RegionX = FAST_FLOOR_DIV(a_ChunkCoords.m_ChunkX, 32);\n\tconst int RegionZ = FAST_FLOOR_DIV(a_ChunkCoords.m_ChunkZ, 32);\n\tauto Info = fmt::format(\n\t\tFMT_STRING(\"Loading chunk {} for world {} from file r.{}.{}.mca failed: {} Offloading old chunk data to file {} and regenerating chunk.\"),\n\t\ta_ChunkCoords, m_World->GetName(), RegionX, RegionZ, a_Reason, OffloadFileName\n\t);\n\tLOGWARNING(\"%s\", Info);\n\n\t// Write the data:\n\tcFile f;\n\tif (!f.Open(OffloadFileName, cFile::fmWrite))\n\t{\n\t\tLOGWARNING(\"Cannot open file %s for writing! Old chunk data is lost.\", OffloadFileName);\n\t\treturn;\n\t}\n\tf.Write(a_ChunkDataToSave.data(), a_ChunkDataToSave.size());\n\tf.Close();\n\n\t// Write a description file:\n\tif (!f.Open(OffloadFileName + \".info\", cFile::fmWrite))\n\t{\n\t\tLOGWARNING(\"Cannot open file %s.info for writing! The information about the failed chunk will not be written.\", OffloadFileName);\n\t\treturn;\n\t}\n\tf.Write(Info.c_str(), Info.size());\n\tf.Close();\n}\n\n\n\n\n\nbool cWSSAnvil::GetChunkData(const cChunkCoords & a_Chunk, ContiguousByteBuffer & a_Data)\n{\n\tcCSLock Lock(m_CS);\n\tauto File = LoadMCAFile(a_Chunk);\n\tif (File == nullptr)\n\t{\n\t\treturn false;\n\t}\n\treturn File->GetChunkData(a_Chunk, a_Data);\n}\n\n\n\n\n\nbool cWSSAnvil::SetChunkData(const cChunkCoords & a_Chunk, const ContiguousByteBufferView a_Data)\n{\n\tcCSLock Lock(m_CS);\n\tauto File = LoadMCAFile(a_Chunk);\n\tif (File == nullptr)\n\t{\n\t\treturn false;\n\t}\n\treturn File->SetChunkData(a_Chunk, a_Data);\n}\n\n\n\n\n\nstd::shared_ptr<cWSSAnvil::cMCAFile> cWSSAnvil::LoadMCAFile(const cChunkCoords & a_Chunk)\n{\n\t// ASSUME m_CS is locked\n\tASSERT(m_CS.IsLocked());\n\n\tconst int RegionX = FAST_FLOOR_DIV(a_Chunk.m_ChunkX, 32);\n\tconst int RegionZ = FAST_FLOOR_DIV(a_Chunk.m_ChunkZ, 32);\n\tASSERT(a_Chunk.m_ChunkX - RegionX * 32 >= 0);\n\tASSERT(a_Chunk.m_ChunkZ - RegionZ * 32 >= 0);\n\tASSERT(a_Chunk.m_ChunkX - RegionX * 32 < 32);\n\tASSERT(a_Chunk.m_ChunkZ - RegionZ * 32 < 32);\n\n\t// Is it already cached?\n\tfor (auto itr = m_Files.begin(); itr != m_Files.end(); ++itr)\n\t{\n\t\tif (((*itr) != nullptr) && ((*itr)->GetRegionX() == RegionX) && ((*itr)->GetRegionZ() == RegionZ))\n\t\t{\n\t\t\t// Move the file to front and return it:\n\t\t\tauto f = *itr;\n\t\t\tif (itr != m_Files.begin())\n\t\t\t{\n\t\t\t\tm_Files.erase(itr);\n\t\t\t\tm_Files.push_front(f);\n\t\t\t}\n\t\t\treturn f;\n\t\t}\n\t}\n\n\t// Load it anew:\n\tauto FileName = fmt::format(FMT_STRING(\"{}{}region\"), m_World->GetDataPath(), cFile::PathSeparator());\n\tcFile::CreateFolder(FileName);\n\tFileName.append(fmt::format(FMT_STRING(\"/r.{}.{}.mca\"), RegionX, RegionZ));\n\tauto f = std::make_shared<cMCAFile>(*this, FileName, RegionX, RegionZ);\n\tif (f == nullptr)\n\t{\n\t\treturn nullptr;\n\t}\n\tm_Files.push_front(f);\n\n\t// If there are too many MCA files cached, delete the last one used:\n\tif (m_Files.size() > MAX_MCA_FILES)\n\t{\n\t\tm_Files.pop_back();\n\t}\n\treturn f;\n}\n\n\n\n\n\nbool cWSSAnvil::LoadChunkFromData(const cChunkCoords & a_Chunk, const ContiguousByteBufferView a_Data)\n{\n\ttry\n\t{\n\t\tconst auto Extracted = m_Extractor.ExtractZLib(a_Data);\n\t\tcParsedNBT NBT(Extracted.GetView());\n\n\t\tif (!NBT.IsValid())\n\t\t{\n\t\t\t// NBT Parsing failed:\n\t\t\tthrow std::runtime_error(fmt::format(\"NBT parsing failed. {} at position {}.\", NBT.GetErrorCode().message(), NBT.GetErrorPos()));\n\t\t}\n\n\t\t// Load the data from NBT:\n\t\treturn LoadChunkFromNBT(a_Chunk, NBT, a_Data);\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tChunkLoadFailed(a_Chunk, Oops.what(), a_Data);\n\t\treturn false;\n\t}\n}\n\n\n\n\n\nCompression::Result cWSSAnvil::SaveChunkToData(const cChunkCoords & a_Chunk)\n{\n\tcFastNBTWriter Writer;\n\tNBTChunkSerializer::Serialize(*m_World, a_Chunk, Writer);\n\tWriter.Finish();\n\n\treturn m_Compressor.CompressZLib(Writer.GetResult());\n}\n\n\n\n\n\nbool cWSSAnvil::LoadChunkFromNBT(const cChunkCoords & a_Chunk, const cParsedNBT & a_NBT, const ContiguousByteBufferView a_RawChunkData)\n{\n\tstruct SetChunkData Data(a_Chunk);\n\n\t// Load the blockdata, blocklight and skylight:\n\tint Level = a_NBT.FindChildByName(0, \"Level\");\n\tif (Level < 0)\n\t{\n\t\tChunkLoadFailed(a_Chunk, \"Missing NBT tag: Level\", a_RawChunkData);\n\t\treturn false;\n\t}\n\n\tint Sections = a_NBT.FindChildByName(Level, \"Sections\");\n\tif ((Sections < 0) || (a_NBT.GetType(Sections) != TAG_List))\n\t{\n\t\tChunkLoadFailed(a_Chunk, \"Missing NBT tag: Sections\", a_RawChunkData);\n\t\treturn false;\n\t}\n\n\teTagType SectionsType = a_NBT.GetChildrenType(Sections);\n\tif ((SectionsType != TAG_Compound) && (SectionsType != TAG_End))\n\t{\n\t\tChunkLoadFailed(a_Chunk, \"NBT tag has wrong type: Sections\", a_RawChunkData);\n\t\treturn false;\n\t}\n\tfor (int Child = a_NBT.GetFirstChild(Sections); Child >= 0; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tconst int SectionYTag = a_NBT.FindChildByName(Child, \"Y\");\n\t\tif ((SectionYTag < 0) || (a_NBT.GetType(SectionYTag) != TAG_Byte))\n\t\t{\n\t\t\tChunkLoadFailed(a_Chunk, \"NBT tag missing or has wrong: Y\", a_RawChunkData);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst int Y = a_NBT.GetByte(SectionYTag);\n\t\tif ((Y < 0) || (Y > static_cast<int>(cChunkDef::NumSections - 1)))\n\t\t{\n\t\t\tChunkLoadFailed(a_Chunk, \"NBT tag exceeds chunk bounds: Y\", a_RawChunkData);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst auto\n\t\t\tBlockData = GetSectionData(a_NBT, Child, \"Blocks\", ChunkBlockData::SectionBlockCount),\n\t\t\tMetaData = GetSectionData(a_NBT, Child, \"Data\", ChunkBlockData::SectionMetaCount),\n\t\t\tBlockLightData = GetSectionData(a_NBT, Child, \"BlockLight\", ChunkLightData::SectionLightCount),\n\t\t\tSkyLightData = GetSectionData(a_NBT, Child, \"SkyLight\", ChunkLightData::SectionLightCount);\n\t\tif ((BlockData != nullptr) && (MetaData != nullptr) && (SkyLightData != nullptr) && (BlockLightData != nullptr))\n\t\t{\n\t\t\tData.BlockData.SetSection(*reinterpret_cast<const ChunkBlockData::SectionType *>(BlockData), *reinterpret_cast<const ChunkBlockData::SectionMetaType *>(MetaData), static_cast<size_t>(Y));\n\t\t\tData.LightData.SetSection(*reinterpret_cast<const ChunkLightData::SectionType *>(BlockLightData), *reinterpret_cast<const ChunkLightData::SectionType *>(SkyLightData), static_cast<size_t>(Y));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tChunkLoadFailed(a_Chunk, \"Missing chunk block/light data\", a_RawChunkData);\n\t\t\treturn false;\n\t\t}\n\t}  // for itr - LevelSections[]\n\n\t// Load the biomes from NBT, if present and valid:\n\tif (!LoadBiomeMapFromNBT(Data.BiomeMap, a_NBT, a_NBT.FindChildByName(Level, \"Biomes\")))\n\t{\n\t\tChunkLoadFailed(a_Chunk, \"Missing chunk biome data\", a_RawChunkData);\n\t\treturn false;\n\t}\n\n\t// Load the Height map, if it fails, recalculate it:\n\tif (!LoadHeightMapFromNBT(Data.HeightMap, a_NBT, a_NBT.FindChildByName(Level, \"HeightMap\")))\n\t{\n\t\tData.UpdateHeightMap();\n\t}\n\n\t// Load the entities from NBT:\n\tLoadEntitiesFromNBT     (Data.Entities,      a_NBT, a_NBT.FindChildByName(Level, \"Entities\"));\n\tLoadBlockEntitiesFromNBT(Data.BlockEntities, a_NBT, a_NBT.FindChildByName(Level, \"TileEntities\"), Data.BlockData);\n\n\tData.IsLightValid = (a_NBT.FindChildByName(Level, \"MCSIsLightValid\") > 0);\n\n\t/*\n\t// Uncomment this block for really cool stuff :)\n\t// DEBUG magic: Invert the underground, so that we can see the MC generator in action :)\n\tbool ShouldInvert[cChunkDef::Width * cChunkDef::Width];\n\tmemset(ShouldInvert, 0, sizeof(ShouldInvert));\n\tfor (int y = cChunkDef::Height - 1; y >= 0; y--)\n\t{\n\t\tfor (int x = 0; x < cChunkDef::Width; x++) for (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tconst auto Index = cChunkDef::MakeIndex(x, y, z);\n\t\t\tif (ShouldInvert[x + cChunkDef::Width * z])\n\t\t\t{\n\t\t\t\tBlockTypes[Index] = (BlockTypes[Index] == E_BLOCK_AIR) ? E_BLOCK_STONE : E_BLOCK_AIR;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tswitch (BlockTypes[Index])\n\t\t\t\t{\n\t\t\t\t\tcase E_BLOCK_AIR:\n\t\t\t\t\tcase E_BLOCK_LEAVES:\n\t\t\t\t\tcase E_BLOCK_NEW_LEAVES:\n\t\t\t\t\t{\n\t\t\t\t\t\t// nothing needed\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tShouldInvert[x + cChunkDef::Width * z] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tBlockTypes[Index] = E_BLOCK_AIR;\n\t\t\t}\n\t\t}\n\t}  // for y\n\t//*/\n\n\tm_World->QueueSetChunkData(std::move(Data));\n\treturn true;\n}\n\n\n\n\n\nbool cWSSAnvil::LoadBiomeMapFromNBT(cChunkDef::BiomeMap & a_BiomeMap, const cParsedNBT & a_NBT, const int a_TagIdx)\n{\n\tif (\n\t\t(a_TagIdx < 0) ||\n\t\t(a_NBT.GetType(a_TagIdx) != TAG_ByteArray) ||\n\t\t(a_NBT.GetDataLength(a_TagIdx) != std::size(a_BiomeMap))\n\t)\n\t{\n\t\treturn false;\n\t}\n\n\tconst auto * const BiomeData = a_NBT.GetData(a_TagIdx);\n\tfor (size_t i = 0; i < ARRAYCOUNT(a_BiomeMap); i++)\n\t{\n\t\tif (BiomeData[i] > std::byte(EMCSBiome::biMaxVariantBiome))\n\t\t{\n\t\t\t// Unassigned biomes:\n\t\t\treturn false;\n\t\t}\n\n\t\ta_BiomeMap[i] = static_cast<EMCSBiome>(BiomeData[i]);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cWSSAnvil::LoadHeightMapFromNBT(cChunkDef::HeightMap & a_HeightMap, const cParsedNBT & a_NBT, const int a_TagIdx)\n{\n\tif (\n\t\t(a_TagIdx < 0) ||\n\t\t(a_NBT.GetType(a_TagIdx) != TAG_IntArray) ||\n\t\t(a_NBT.GetDataLength(a_TagIdx) != (4 * std::size(a_HeightMap)))\n\t)\n\t{\n\t\treturn false;\n\t}\n\n\tconst auto * const HeightData = a_NBT.GetData(a_TagIdx);\n\tfor (int RelZ = 0; RelZ < cChunkDef::Width; RelZ++)\n\t{\n\t\tfor (int RelX = 0; RelX < cChunkDef::Width; RelX++)\n\t\t{\n\t\t\tconst int Index = 4 * (RelX + RelZ * cChunkDef::Width);\n\t\t\tconst int Height = NetworkBufToHost<Int32>(HeightData + Index);\n\n\t\t\tif (Height > std::numeric_limits<HEIGHTTYPE>::max())\n\t\t\t{\n\t\t\t\t// Invalid data:\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tcChunkDef::SetHeight(a_HeightMap, RelX, RelZ, static_cast<HEIGHTTYPE>(Height));\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadEntitiesFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tif ((a_TagIdx < 0) || (a_NBT.GetType(a_TagIdx) != TAG_List))\n\t{\n\t\treturn;\n\t}\n\n\tfor (int Child = a_NBT.GetFirstChild(a_TagIdx); Child != -1; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tif (a_NBT.GetType(Child) != TAG_Compound)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tint sID = a_NBT.FindChildByName(Child, \"id\");\n\t\tif (sID < 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tLoadEntityFromNBT(a_Entities, a_NBT, Child, a_NBT.GetStringView(sID));\n\t\t}\n\t\tcatch (...)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t}  // for Child - a_NBT[]\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadBlockEntitiesFromNBT(cBlockEntities & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx, const ChunkBlockData & a_BlockData)\n{\n\tif ((a_TagIdx < 0) || (a_NBT.GetType(a_TagIdx) != TAG_List))\n\t{\n\t\treturn;\n\t}\n\n\tfor (int Child = a_NBT.GetFirstChild(a_TagIdx); Child != -1; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tif (a_NBT.GetType(Child) != TAG_Compound)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Get the BlockEntity's position\n\t\tVector3i absPos;\n\t\tif (!GetBlockEntityNBTPos(a_NBT, Child, absPos) || (absPos.y < 0) || (absPos.y >= cChunkDef::Height))\n\t\t{\n\t\t\tLOGWARNING(\"Bad block entity, missing the coords. Will be ignored.\");\n\t\t\tcontinue;\n\t\t}\n\t\tconst auto relPos = cChunkDef::AbsoluteToRelative(absPos);\n\n\t\t// Load the proper BlockEntity type based on the block type:\n\t\tconst auto BlockType = a_BlockData.GetBlock(relPos);\n\t\tconst auto BlockMeta = a_BlockData.GetMeta(relPos);\n\t\tOwnedBlockEntity Entity;\n\n\t\ttry\n\t\t{\n\t\t\tEntity = LoadBlockEntityFromNBT(a_NBT, Child, absPos, BlockType, BlockMeta);\n\t\t}\n\t\tcatch (...)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: exception-ify the failure case\n\t\tif (Entity == nullptr)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Index computed before Entity moved.\n\t\tconst auto Index = cChunkDef::MakeIndex(Entity->GetRelPos());\n\n\t\t// Add the BlockEntity to the loaded data:\n\t\ta_BlockEntities.emplace(Index, std::move(Entity));\n\t}  // for Child - tag children\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadBlockEntityFromNBT(const cParsedNBT & a_NBT, int a_Tag, Vector3i a_Pos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)\n{\n\tASSERT((a_Pos.y >= 0) && (a_Pos.y < cChunkDef::Height));\n\n\t// Load the specific BlockEntity type:\n\tswitch (a_BlockType)\n\t{\n\t\t// Banners:\n\t\tcase E_BLOCK_STANDING_BANNER:\n\t\tcase E_BLOCK_WALL_BANNER:        return LoadBannerFromNBT          (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\n\t\t// Others:\n\t\tcase E_BLOCK_BEACON:             return LoadBeaconFromNBT          (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_BED:                return LoadBedFromNBT             (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_BREWING_STAND:      return LoadBrewingstandFromNBT    (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_CHEST:              return LoadChestFromNBT           (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_COMMAND_BLOCK:      return LoadCommandBlockFromNBT    (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_DISPENSER:          return LoadDispenserFromNBT       (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_DROPPER:            return LoadDropperFromNBT         (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_ENCHANTMENT_TABLE:  return LoadEnchantingTableFromNBT (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_ENDER_CHEST:        return LoadEnderChestFromNBT      (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_END_PORTAL:         return LoadEndPortalFromNBT       (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_FLOWER_POT:         return LoadFlowerPotFromNBT       (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_FURNACE:            return LoadFurnaceFromNBT         (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_HEAD:               return LoadMobHeadFromNBT         (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_HOPPER:             return LoadHopperFromNBT          (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_JUKEBOX:            return LoadJukeboxFromNBT         (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_LIT_FURNACE:        return LoadFurnaceFromNBT         (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_MOB_SPAWNER:        return LoadMobSpawnerFromNBT      (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_NOTE_BLOCK:         return LoadNoteBlockFromNBT       (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_SIGN_POST:          return LoadSignFromNBT            (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_TRAPPED_CHEST:      return LoadChestFromNBT           (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tcase E_BLOCK_WALLSIGN:           return LoadSignFromNBT            (a_NBT, a_Tag, a_BlockType, a_BlockMeta, a_Pos);\n\t\tdefault:\n\t\t{\n\t\t\t// All the other blocktypes should have no entities assigned to them. Report an error:\n\t\t\t// Get the \"id\" tag:\n\t\t\tint TagID = a_NBT.FindChildByName(a_Tag, \"id\");\n\t\t\tFLOGINFO(\"WorldLoader({0}): Block entity mismatch: block type {1} ({2}), type \\\"{3}\\\", at {4}; the entity will be lost.\",\n\t\t\t\tm_World->GetName(),\n\t\t\t\tItemTypeToString(a_BlockType), a_BlockType, (TagID >= 0) ? a_NBT.GetStringView(TagID) : \"unknown\",\n\t\t\t\ta_Pos\n\t\t\t);\n\t\t\treturn nullptr;\n\t\t}\n\t}\n}\n\n\n\n\n\nbool cWSSAnvil::LoadItemFromNBT(cItem & a_Item, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint Type = a_NBT.FindChildByName(a_TagIdx, \"id\");\n\tif (Type <= 0)\n\t{\n\t\treturn false;\n\t}\n\n\tif (a_NBT.GetType(Type) == TAG_String)\n\t{\n\t\tif (!StringToItem(a_NBT.GetString(Type), a_Item))\n\t\t{\n\t\t\t// Can't resolve item type\n\t\t\treturn false;\n\t\t}\n\t}\n\telse if (a_NBT.GetType(Type) == TAG_Short)\n\t{\n\t\ta_Item.m_ItemType = a_NBT.GetShort(Type);\n\t}\n\telse\n\t{\n\t\treturn false;\n\t}\n\n\tif (a_Item.m_ItemType < 0)\n\t{\n\t\ta_Item.Empty();\n\t\treturn true;\n\t}\n\n\tint Damage = a_NBT.FindChildByName(a_TagIdx, \"Damage\");\n\tif ((Damage > 0) && (a_NBT.GetType(Damage) == TAG_Short))\n\t{\n\t\ta_Item.m_ItemDamage = a_NBT.GetShort(Damage);\n\t}\n\n\tint Count = a_NBT.FindChildByName(a_TagIdx, \"Count\");\n\tif ((Count > 0) && (a_NBT.GetType(Count) == TAG_Byte))\n\t{\n\t\ta_Item.m_ItemCount = static_cast<char>(a_NBT.GetByte(Count));\n\t}\n\n\t// Find the \"tag\" tag, used for enchantments and other extra data\n\tint TagTag = a_NBT.FindChildByName(a_TagIdx, \"tag\");\n\tif (TagTag <= 0)\n\t{\n\t\t// No extra data\n\t\treturn true;\n\t}\n\n\t// Load repair cost:\n\tint RepairCost = a_NBT.FindChildByName(TagTag, \"RepairCost\");\n\tif ((RepairCost > 0) && (a_NBT.GetType(RepairCost) == TAG_Int))\n\t{\n\t\ta_Item.m_RepairCost = a_NBT.GetInt(RepairCost);\n\t}\n\n\t// Load display name:\n\tint DisplayTag = a_NBT.FindChildByName(TagTag, \"display\");\n\tif (DisplayTag > 0)\n\t{\n\t\tint DisplayName = a_NBT.FindChildByName(DisplayTag, \"Name\");\n\t\tif ((DisplayName > 0) && (a_NBT.GetType(DisplayName) == TAG_String))\n\t\t{\n\t\t\ta_Item.m_CustomName = a_NBT.GetString(DisplayName);\n\t\t}\n\t\tint Lore = a_NBT.FindChildByName(DisplayTag, \"Lore\");\n\t\tif ((Lore > 0) && (a_NBT.GetType(Lore) == TAG_String))\n\t\t{\n\t\t\t// Legacy string lore\n\t\t\ta_Item.m_LoreTable = StringSplit(a_NBT.GetString(Lore), \"`\");\n\t\t}\n\t\telse if ((Lore > 0) && (a_NBT.GetType(Lore) == TAG_List))\n\t\t{\n\t\t\t// Lore table\n\t\t\ta_Item.m_LoreTable.clear();\n\t\t\tfor (int loretag = a_NBT.GetFirstChild(Lore); loretag >= 0; loretag = a_NBT.GetNextSibling(loretag))  // Loop through array of strings\n\t\t\t{\n\t\t\t\ta_Item.m_LoreTable.push_back(a_NBT.GetString(loretag));\n\t\t\t}\n\t\t}\n\t}\n\n\t// Load enchantments:\n\tconst char * EnchName = (a_Item.m_ItemType == E_ITEM_BOOK) ? \"StoredEnchantments\" : \"ench\";\n\tint EnchTag = a_NBT.FindChildByName(TagTag, EnchName);\n\tif (EnchTag > 0)\n\t{\n\t\tEnchantmentSerializer::ParseFromNBT(a_Item.m_Enchantments, a_NBT, EnchTag);\n\t}\n\n\t// Load firework data:\n\tint FireworksTag = a_NBT.FindChildByName(TagTag, ((a_Item.m_ItemType == E_ITEM_FIREWORK_STAR) ? \"Explosion\" : \"Fireworks\"));\n\tif (FireworksTag > 0)\n\t{\n\t\tcFireworkItem::ParseFromNBT(a_Item.m_FireworkItem, a_NBT, FireworksTag, static_cast<ENUM_ITEM_TYPE>(a_Item.m_ItemType));\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadItemGridFromNBT(cItemGrid & a_ItemGrid, const cParsedNBT & a_NBT, int a_ItemsTagIdx, int a_SlotOffset)\n{\n\tint NumSlots = a_ItemGrid.GetNumSlots();\n\tfor (int Child = a_NBT.GetFirstChild(a_ItemsTagIdx); Child != -1; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tint SlotTag = a_NBT.FindChildByName(Child, \"Slot\");\n\t\tif ((SlotTag < 0) || (a_NBT.GetType(SlotTag) != TAG_Byte))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tint SlotNum = static_cast<int>(a_NBT.GetByte(SlotTag)) - a_SlotOffset;\n\t\tif ((SlotNum < 0) || (SlotNum >= NumSlots))\n\t\t{\n\t\t\t// SlotNum outside of the range\n\t\t\tcontinue;\n\t\t}\n\t\tcItem Item;\n\t\tif (LoadItemFromNBT(Item, a_NBT, Child))\n\t\t{\n\t\t\ta_ItemGrid.SetSlot(SlotNum, Item);\n\t\t}\n\t}  // for itr - ItemDefs[]\n}\n\n\n\n\n\nAString cWSSAnvil::DecodeSignLine(const AString & a_Line)\n{\n\tif (a_Line.empty())\n\t{\n\t\treturn AString();\n\t}\n\tif (a_Line[0] != '{')\n\t{\n\t\treturn a_Line;\n\t}\n\n\t// Try to parse the JSON:\n\tJson::Value root;\n\tif (!JsonUtils::ParseString(a_Line, root) || !root.isObject())\n\t{\n\t\treturn a_Line;\n\t}\n\tconst auto & txt = root[\"text\"];\n\tif (txt.isString())\n\t{\n\t\treturn txt.asString();\n\t}\n\treturn a_Line;\n}\n\n\n\n\n\nbool cWSSAnvil::CheckBlockEntityType(const cParsedNBT & a_NBT, int a_TagIdx, const AStringVector & a_ExpectedTypes, Vector3i a_Pos)\n{\n\t// Check if the given tag is a compound:\n\tif (a_NBT.GetType(a_TagIdx) != TAG_Compound)\n\t{\n\t\treturn false;\n\t}\n\n\t// Get the \"id\" tag:\n\tint TagID = a_NBT.FindChildByName(a_TagIdx, \"id\");\n\tif (TagID < 0)\n\t{\n\t\treturn false;\n\t}\n\n\t// Check if the \"id\" tag is a string:\n\tif (a_NBT.GetType(TagID) != eTagType::TAG_String)\n\t{\n\t\treturn false;\n\t}\n\n\t// Compare the value:\n\tfor (const auto & et: a_ExpectedTypes)\n\t{\n\t\tif (a_NBT.GetStringView(TagID) == et)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Expectation not met, output an error into the log:\n\tAString expectedTypes;\n\tfor (const auto & et : a_ExpectedTypes)\n\t{\n\t\texpectedTypes.append(\", \\\"\");\n\t\texpectedTypes.append(et);\n\t\texpectedTypes.push_back('\\\"');\n\t}\n\tFLOGWARNING(\"Block entity type mismatch: exp {0}, got \\\"{1}\\\". The block entity at {2} will lose all its properties.\",\n\t\texpectedTypes.c_str() + 2,  // Skip the first \", \" that is extra in the string\n\t\ta_NBT.GetStringView(TagID), a_Pos\n\t);\n\treturn false;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadBannerFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\tstatic const AStringVector expectedTypes({\"Banner\", \"minecraft:standingbanner\",\"minecraft:wallbanner\"});\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tunsigned char Color = 15;\n\tAString CustomName;\n\n\t// Reads base color from NBT\n\tint CurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Base\");\n\tif (CurrentLine >= 0)\n\t{\n\t\tColor = static_cast<unsigned char>(a_NBT.GetInt(CurrentLine));\n\t}\n\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"CustomName\");\n\tif ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_String))\n\t{\n\t\tCustomName = a_NBT.GetString(CurrentLine);\n\t}\n\n\treturn std::make_unique<cBannerEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World, Color, CustomName);\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadBeaconFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({\"Beacon\", \"minecraft:beacon\"});\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto Beacon = std::make_unique<cBeaconEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\n\tint CurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Levels\");\n\tif (CurrentLine >= 0)\n\t{\n\t\tBeacon->SetBeaconLevel(static_cast<char>(a_NBT.GetInt(CurrentLine)));\n\t}\n\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Primary\");\n\tif (CurrentLine >= 0)\n\t{\n\t\tBeacon->SetPrimaryEffect(static_cast<cEntityEffect::eType>(a_NBT.GetInt(CurrentLine)));\n\t}\n\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Secondary\");\n\tif (CurrentLine >= 0)\n\t{\n\t\tBeacon->SetSecondaryEffect(static_cast<cEntityEffect::eType>(a_NBT.GetInt(CurrentLine)));\n\t}\n\n\t// We are better than mojang, we load / save the beacon inventory!\n\tint Items = a_NBT.FindChildByName(a_TagIdx, \"Items\");\n\tif ((Items >= 0) && (a_NBT.GetType(Items) == TAG_List))\n\t{\n\t\tLoadItemGridFromNBT(Beacon->GetContents(), a_NBT, Items);\n\t}\n\n\treturn Beacon;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadBedFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Bed\", \"minecraft:bed\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Use color red as default\n\tshort Color = E_META_WOOL_RED;\n\n\tint ColorIDx = a_NBT.FindChildByName(a_TagIdx, \"color\");\n\tif (ColorIDx >= 0)\n\t{\n\t\tColor = static_cast<short>(a_NBT.GetInt(ColorIDx));\n\t}\n\n\treturn std::make_unique<cBedEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World, Color);\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadBrewingstandFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Brewingstand\", \"minecraft:brewing_stand\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tint Items = a_NBT.FindChildByName(a_TagIdx, \"Items\");\n\tif ((Items < 0) || (a_NBT.GetType(Items) != TAG_List))\n\t{\n\t\treturn nullptr;  // Make it an empty brewingstand - the chunk loader will provide an empty cBrewingstandEntity for this\n\t}\n\n\tauto Brewingstand = std::make_unique<cBrewingstandEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\n\t// Fuel has to be loaded at first, because of slot events:\n\tint Fuel = a_NBT.FindChildByName(a_TagIdx, \"Fuel\");\n\tif (Fuel >= 0)\n\t{\n\t\tInt16 tb = a_NBT.GetShort(Fuel);\n\t\tBrewingstand->SetRemainingFuel(tb);\n\t}\n\n\t// Load slots:\n\tfor (int Child = a_NBT.GetFirstChild(Items); Child != -1; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tint Slot = a_NBT.FindChildByName(Child, \"Slot\");\n\t\tif ((Slot < 0) || (a_NBT.GetType(Slot) != TAG_Byte))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tcItem Item;\n\t\tif (LoadItemFromNBT(Item, a_NBT, Child))\n\t\t{\n\t\t\tBrewingstand->SetSlot(a_NBT.GetByte(Slot), Item);\n\t\t}\n\t}  // for itr - ItemDefs[]\n\n\t// Load brewing time:\n\tint BrewTime = a_NBT.FindChildByName(a_TagIdx, \"BrewTime\");\n\tif (BrewTime >= 0)\n\t{\n\t\tInt16 tb = a_NBT.GetShort(BrewTime);\n\t\tBrewingstand->SetTimeBrewed(tb);\n\t}\n\n\t// Restart brewing:\n\tBrewingstand->LoadRecipes();\n\tBrewingstand->ContinueBrewing();\n\treturn Brewingstand;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadChestFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\t// Note that older Cuberite code used \"TrappedChest\" for trapped chests; new code mimics vanilla and uses \"Chest\" throughout, but we allow migration here:\n\tstatic const AStringVector expectedTypes({ \"Chest\", \"TrappedChest\", \"minecraft:chest\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tint Items = a_NBT.FindChildByName(a_TagIdx, \"Items\");\n\tif ((Items < 0) || (a_NBT.GetType(Items) != TAG_List))\n\t{\n\t\treturn nullptr;  // Make it an empty chest - the chunk loader will provide an empty cChestEntity for this\n\t}\n\tauto Chest = std::make_unique<cChestEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\tLoadItemGridFromNBT(Chest->GetContents(), a_NBT, Items);\n\treturn Chest;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadCommandBlockFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Control\", \"minecraft:command_block\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto CmdBlock = std::make_unique<cCommandBlockEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\n\tint currentLine = a_NBT.FindChildByName(a_TagIdx, \"Command\");\n\tif (currentLine >= 0)\n\t{\n\t\tCmdBlock->SetCommand(a_NBT.GetString(currentLine));\n\t}\n\n\tcurrentLine = a_NBT.FindChildByName(a_TagIdx, \"SuccessCount\");\n\tif (currentLine >= 0)\n\t{\n\t\tCmdBlock->SetResult(static_cast<NIBBLETYPE>(a_NBT.GetInt(currentLine)));\n\t}\n\n\tcurrentLine = a_NBT.FindChildByName(a_TagIdx, \"LastOutput\");\n\tif (currentLine >= 0)\n\t{\n\t\tCmdBlock->SetLastOutput(a_NBT.GetString(currentLine));\n\t}\n\n\t// TODO 2014-01-18 xdot: Figure out what TrackOutput is and parse it.\n\n\treturn CmdBlock;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadDispenserFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Trap\", \"minecraft:dispenser\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tint Items = a_NBT.FindChildByName(a_TagIdx, \"Items\");\n\tif ((Items < 0) || (a_NBT.GetType(Items) != TAG_List))\n\t{\n\t\treturn nullptr;  // Make it an empty dispenser - the chunk loader will provide an empty cDispenserEntity for this\n\t}\n\tauto Dispenser = std::make_unique<cDispenserEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\tLoadItemGridFromNBT(Dispenser->GetContents(), a_NBT, Items);\n\treturn Dispenser;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadDropperFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Dropper\", \"minecraft:dropper\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tint Items = a_NBT.FindChildByName(a_TagIdx, \"Items\");\n\tif ((Items < 0) || (a_NBT.GetType(Items) != TAG_List))\n\t{\n\t\treturn nullptr;  // Make it an empty dropper - the chunk loader will provide an empty cDropperEntity for this\n\t}\n\tauto Dropper = std::make_unique<cDropperEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\tLoadItemGridFromNBT(Dropper->GetContents(), a_NBT, Items);\n\treturn Dropper;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadEnchantingTableFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"EnchantingTable\", \"minecraft:enchanting_table\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tAString CustomName;\n\tint currentLine = a_NBT.FindChildByName(a_TagIdx, \"CustomName\");\n\tif (currentLine >= 0)\n\t{\n\t\tif (a_NBT.GetType(currentLine) == TAG_String)\n\t\t{\n\t\t\tCustomName = a_NBT.GetString(currentLine);\n\t\t}\n\t}\n\treturn std::make_unique<cEnchantingTableEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World, CustomName);\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadEnderChestFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"EnderChest\", \"minecraft:ender_chest\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\treturn std::make_unique<cEnderChestEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadEndPortalFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"EndPortal\", \"minecraft:end_portal\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\treturn std::make_unique<cEndPortalEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadFlowerPotFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"FlowerPot\", \"minecraft:flower_pot\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto FlowerPot = std::make_unique<cFlowerPotEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\tcItem Item;\n\n\tint currentLine = a_NBT.FindChildByName(a_TagIdx, \"Item\");\n\tif (currentLine >= 0)\n\t{\n\t\tif (a_NBT.GetType(currentLine) == TAG_String)\n\t\t{\n\t\t\tStringToItem(a_NBT.GetString(currentLine), Item);\n\t\t}\n\t\telse if (a_NBT.GetType(currentLine) == TAG_Int)\n\t\t{\n\t\t\tItem.m_ItemType = static_cast<short>(a_NBT.GetInt(currentLine));\n\t\t}\n\t}\n\n\tcurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Data\");\n\tif ((currentLine >= 0) && (a_NBT.GetType(currentLine) == TAG_Int))\n\t{\n\t\tItem.m_ItemDamage = static_cast<short>(a_NBT.GetInt(currentLine));\n\t}\n\n\tFlowerPot->SetItem(Item);\n\treturn FlowerPot;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadFurnaceFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Furnace\", \"minecraft:furnace\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tint Items = a_NBT.FindChildByName(a_TagIdx, \"Items\");\n\tif ((Items < 0) || (a_NBT.GetType(Items) != TAG_List))\n\t{\n\t\treturn nullptr;  // Make it an empty furnace - the chunk loader will provide an empty cFurnaceEntity for this\n\t}\n\n\tauto Furnace = std::make_unique<cFurnaceEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\tFurnace->SetLoading(true);\n\n\t// Load slots:\n\tfor (int Child = a_NBT.GetFirstChild(Items); Child != -1; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tint Slot = a_NBT.FindChildByName(Child, \"Slot\");\n\t\tif ((Slot < 0) || (a_NBT.GetType(Slot) != TAG_Byte))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tcItem Item;\n\t\tif (LoadItemFromNBT(Item, a_NBT, Child))\n\t\t{\n\t\t\tFurnace->SetSlot(a_NBT.GetByte(Slot), Item);\n\t\t}\n\t}  // for itr - ItemDefs[]\n\n\t// Load burn time:\n\tint BurnTime = a_NBT.FindChildByName(a_TagIdx, \"BurnTime\");\n\tif (BurnTime >= 0)\n\t{\n\t\tInt16 bt = a_NBT.GetShort(BurnTime);\n\t\t// Anvil doesn't store the time that the fuel can burn. We simply \"reset\" the current value to be the 100%\n\t\tFurnace->SetBurnTimes(bt, 0);\n\t}\n\n\t// Load cook time:\n\tint CookTime = a_NBT.FindChildByName(a_TagIdx, \"CookTime\");\n\tif (CookTime >= 0)\n\t{\n\t\tInt16 ct = a_NBT.GetShort(CookTime);\n\t\t// Anvil doesn't store the time that an item takes to cook. We simply use the default - 10 seconds (200 ticks)\n\t\tFurnace->SetCookTimes(200, ct);\n\t}\n\t// Restart cooking:\n\tFurnace->ContinueCooking();\n\tFurnace->SetLoading(false);\n\treturn Furnace;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadHopperFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Hopper\", \"minecraft:hopper\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tint Items = a_NBT.FindChildByName(a_TagIdx, \"Items\");\n\tif ((Items < 0) || (a_NBT.GetType(Items) != TAG_List))\n\t{\n\t\treturn nullptr;  // Make it an empty hopper - the chunk loader will provide an empty cHopperEntity for this\n\t}\n\tauto Hopper = std::make_unique<cHopperEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\tLoadItemGridFromNBT(Hopper->GetContents(), a_NBT, Items);\n\treturn Hopper;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadJukeboxFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"RecordPlayer\", \"minecraft:jukebox\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto Jukebox = std::make_unique<cJukeboxEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\tint Record = a_NBT.FindChildByName(a_TagIdx, \"Record\");\n\tif (Record >= 0)\n\t{\n\t\tJukebox->SetRecord(a_NBT.GetInt(Record));\n\t}\n\treturn Jukebox;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadMobSpawnerFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"MobSpawner\", \"minecraft:mob_spawner\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto MobSpawner = std::make_unique<cMobSpawnerEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\n\t// Load entity type\n\tint Type = a_NBT.FindChildByName(a_TagIdx, \"EntityId\");\n\tif ((Type >= 0) && (a_NBT.GetType(Type) == TAG_String))\n\t{\n\t\tconst auto StatInfo = NamespaceSerializer::SplitNamespacedID(a_NBT.GetStringView(Type));\n\t\tif (StatInfo.first == NamespaceSerializer::Namespace::Unknown)\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\n\t\teMonsterType MonsterType = NamespaceSerializer::ToMonsterType(StatInfo.second);\n\t\tif (MonsterType != eMonsterType::mtInvalidType)\n\t\t{\n\t\t\tMobSpawner->SetEntity(MonsterType);\n\t\t}\n\t}\n\n\t// Load spawn count:\n\tint CurrentLine = a_NBT.FindChildByName(a_TagIdx, \"SpawnCount\");\n\tif ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_Short))\n\t{\n\t\tMobSpawner->SetSpawnCount(a_NBT.GetShort(CurrentLine));\n\t}\n\n\t// Load spawn range:\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"SpawnRange\");\n\tif ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_Short))\n\t{\n\t\tMobSpawner->SetSpawnRange(a_NBT.GetShort(CurrentLine));\n\t}\n\n\t// Load delay:\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Delay\");\n\tif ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_Short))\n\t{\n\t\tMobSpawner->SetSpawnDelay(a_NBT.GetShort(CurrentLine));\n\t}\n\n\t// Load delay range:\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"MinSpawnDelay\");\n\tif ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_Short))\n\t{\n\t\tMobSpawner->SetMinSpawnDelay(a_NBT.GetShort(CurrentLine));\n\t}\n\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"MaxSpawnDelay\");\n\tif ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_Short))\n\t{\n\t\tMobSpawner->SetMaxSpawnDelay(a_NBT.GetShort(CurrentLine));\n\t}\n\n\t// Load MaxNearbyEntities:\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"MaxNearbyEntities\");\n\tif ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_Short))\n\t{\n\t\tMobSpawner->SetMaxNearbyEntities(a_NBT.GetShort(CurrentLine));\n\t}\n\n\t// Load RequiredPlayerRange:\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"RequiredPlayerRange\");\n\tif ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_Short))\n\t{\n\t\tMobSpawner->SetRequiredPlayerRange(a_NBT.GetShort(CurrentLine));\n\t}\n\n\n\treturn MobSpawner;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadMobHeadFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Skull\", \"minecraft:skull\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto MobHead = std::make_unique<cMobHeadEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\n\tint currentLine = a_NBT.FindChildByName(a_TagIdx, \"SkullType\");\n\tif (currentLine >= 0)\n\t{\n\t\tMobHead->SetType(static_cast<eMobHeadType>(a_NBT.GetByte(currentLine)));\n\t}\n\n\tcurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Rot\");\n\tif (currentLine >= 0)\n\t{\n\t\tMobHead->SetRotation(static_cast<eMobHeadRotation>(a_NBT.GetByte(currentLine)));\n\t}\n\n\tint ownerLine = a_NBT.FindChildByName(a_TagIdx, \"Owner\");\n\tif (ownerLine >= 0)\n\t{\n\t\tAString OwnerName, OwnerTexture, OwnerTextureSignature;\n\t\tcUUID OwnerUUID;\n\n\t\tcurrentLine = a_NBT.FindChildByName(ownerLine, \"Id\");\n\t\tif (currentLine >= 0)\n\t\t{\n\t\t\tOwnerUUID.FromString(a_NBT.GetString(currentLine));\n\t\t}\n\n\t\tcurrentLine = a_NBT.FindChildByName(ownerLine, \"Name\");\n\t\tif (currentLine >= 0)\n\t\t{\n\t\t\tOwnerName = a_NBT.GetString(currentLine);\n\t\t}\n\n\t\tint textureLine = a_NBT.GetFirstChild(  // The first texture of\n\t\t\ta_NBT.FindChildByName(              // The texture list of\n\t\t\t\ta_NBT.FindChildByName(          // The Properties compound of\n\t\t\t\t\townerLine,                  // The Owner compound\n\t\t\t\t\t\"Properties\"\n\t\t\t\t),\n\t\t\t\t\"textures\"\n\t\t\t)\n\t\t);\n\t\tif (textureLine >= 0)\n\t\t{\n\t\t\tcurrentLine = a_NBT.FindChildByName(textureLine, \"Signature\");\n\t\t\tif (currentLine >= 0)\n\t\t\t{\n\t\t\t\tOwnerTextureSignature = a_NBT.GetString(currentLine);\n\t\t\t}\n\n\t\t\tcurrentLine = a_NBT.FindChildByName(textureLine, \"Value\");\n\t\t\tif (currentLine >= 0)\n\t\t\t{\n\t\t\t\tOwnerTexture = a_NBT.GetString(currentLine);\n\t\t\t}\n\t\t}\n\t\tMobHead->SetOwner(OwnerUUID, OwnerName, OwnerTexture, OwnerTextureSignature);\n\t}\n\n\treturn MobHead;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadNoteBlockFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Music\", \"minecraft:noteblock\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto NoteBlock = std::make_unique<cNoteEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\tint note = a_NBT.FindChildByName(a_TagIdx, \"note\");\n\tif (note >= 0)\n\t{\n\t\tNoteBlock->SetNote(a_NBT.GetByte(note));\n\t}\n\treturn NoteBlock;\n}\n\n\n\n\n\nOwnedBlockEntity cWSSAnvil::LoadSignFromNBT(const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos)\n{\n\t// Check if the data has a proper type:\n\tstatic const AStringVector expectedTypes({ \"Sign\", \"minecraft:sign\" });\n\tif (!CheckBlockEntityType(a_NBT, a_TagIdx, expectedTypes, a_Pos))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto Sign = std::make_unique<cSignEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World);\n\n\tint currentLine = a_NBT.FindChildByName(a_TagIdx, \"Text1\");\n\tif (currentLine >= 0)\n\t{\n\t\tSign->SetLine(0, DecodeSignLine(a_NBT.GetString(currentLine)));\n\t}\n\n\tcurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Text2\");\n\tif (currentLine >= 0)\n\t{\n\t\tSign->SetLine(1, DecodeSignLine(a_NBT.GetString(currentLine)));\n\t}\n\n\tcurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Text3\");\n\tif (currentLine >= 0)\n\t{\n\t\tSign->SetLine(2, DecodeSignLine(a_NBT.GetString(currentLine)));\n\t}\n\n\tcurrentLine = a_NBT.FindChildByName(a_TagIdx, \"Text4\");\n\tif (currentLine >= 0)\n\t{\n\t\tSign->SetLine(3, DecodeSignLine(a_NBT.GetString(currentLine)));\n\t}\n\n\treturn Sign;\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_EntityTagIdx, const std::string_view a_EntityName)\n{\n\ttypedef void (cWSSAnvil::*EntityLoaderFunc)(cEntityList &, const cParsedNBT &, int a_EntityTagIdx);\n\ttypedef std::map<std::string_view, EntityLoaderFunc> EntityLoaderMap;\n\tstatic const EntityLoaderMap EntityTypeToFunction\n\t{\n\t\t{ \"Boat\",                          &cWSSAnvil::LoadBoatFromNBT },\n\t\t{ \"minecraft:boat\",                &cWSSAnvil::LoadBoatFromNBT },\n\t\t{ \"EnderCrystal\",                  &cWSSAnvil::LoadEnderCrystalFromNBT },\n\t\t{ \"minecraft:ender_crystal\",       &cWSSAnvil::LoadEnderCrystalFromNBT },\n\t\t{ \"FallingBlock\",                  &cWSSAnvil::LoadFallingBlockFromNBT },\n\t\t{ \"minecraft:falling_block\",       &cWSSAnvil::LoadFallingBlockFromNBT },\n\t\t{ \"Minecart\",                      &cWSSAnvil::LoadOldMinecartFromNBT },\n\t\t{ \"MinecartChest\",                 &cWSSAnvil::LoadMinecartCFromNBT },\n\t\t{ \"minecraft:chest_minecart\",      &cWSSAnvil::LoadMinecartCFromNBT },\n\t\t{ \"MinecartFurnace\",               &cWSSAnvil::LoadMinecartFFromNBT },\n\t\t{ \"minecraft:furnace_minecart\",    &cWSSAnvil::LoadMinecartFFromNBT },\n\t\t{ \"MinecartTNT\",                   &cWSSAnvil::LoadMinecartTFromNBT },\n\t\t{ \"minecraft:tnt_minecart\",        &cWSSAnvil::LoadMinecartTFromNBT },\n\t\t{ \"MinecartHopper\",                &cWSSAnvil::LoadMinecartHFromNBT },\n\t\t{ \"minecraft:hopper_minecart\",     &cWSSAnvil::LoadMinecartHFromNBT },\n\t\t{ \"MinecartRideable\",              &cWSSAnvil::LoadMinecartRFromNBT },\n\t\t{ \"minecraft:minecart\",            &cWSSAnvil::LoadMinecartRFromNBT },\n\t\t{ \"Item\",                          &cWSSAnvil::LoadPickupFromNBT },\n\t\t{ \"minecraft:item\",                &cWSSAnvil::LoadPickupFromNBT },\n\t\t{ \"Painting\",                      &cWSSAnvil::LoadPaintingFromNBT },\n\t\t{ \"minecraft:painting\",            &cWSSAnvil::LoadPaintingFromNBT },\n\t\t{ \"PrimedTnt\",                     &cWSSAnvil::LoadTNTFromNBT },\n\t\t{ \"minecraft:tnt\",                 &cWSSAnvil::LoadTNTFromNBT },\n\t\t{ \"XPOrb\",                         &cWSSAnvil::LoadExpOrbFromNBT },\n\t\t{ \"minecraft:xp_orb\",              &cWSSAnvil::LoadExpOrbFromNBT },\n\t\t{ \"ItemFrame\",                     &cWSSAnvil::LoadItemFrameFromNBT },\n\t\t{ \"minecraft:item_frame\",          &cWSSAnvil::LoadItemFrameFromNBT },\n\t\t{ \"LeashKnot\",                     &cWSSAnvil::LoadLeashKnotFromNBT },\n\t\t{ \"minecraft:leash_knot\",          &cWSSAnvil::LoadLeashKnotFromNBT },\n\t\t{ \"Arrow\",                         &cWSSAnvil::LoadArrowFromNBT },\n\t\t{ \"minecraft:arrow\",               &cWSSAnvil::LoadArrowFromNBT },\n\t\t{ \"SplashPotion\",                  &cWSSAnvil::LoadSplashPotionFromNBT },\n\t\t{ \"minecraft:potion\",              &cWSSAnvil::LoadSplashPotionFromNBT },\n\t\t{ \"Snowball\",                      &cWSSAnvil::LoadSnowballFromNBT },\n\t\t{ \"minecraft:snowball\",            &cWSSAnvil::LoadSnowballFromNBT },\n\t\t{ \"Egg\",                           &cWSSAnvil::LoadEggFromNBT },\n\t\t{ \"minecraft:egg\",                 &cWSSAnvil::LoadEggFromNBT },\n\t\t{ \"Fireball\",                      &cWSSAnvil::LoadFireballFromNBT },\n\t\t{ \"minecraft:fireball\",            &cWSSAnvil::LoadFireballFromNBT },\n\t\t{ \"SmallFireball\",                 &cWSSAnvil::LoadFireChargeFromNBT },\n\t\t{ \"minecraft:small_fireball\",      &cWSSAnvil::LoadFireChargeFromNBT },\n\t\t{ \"ThrownEnderpearl\",              &cWSSAnvil::LoadThrownEnderpearlFromNBT },\n\t\t{ \"minecraft:ender_pearl\",         &cWSSAnvil::LoadThrownEnderpearlFromNBT }\n\t};\n\n\t// TODO: flatten monster\\projectile into one entity type enum\n\n\tconst auto it = EntityTypeToFunction.find(a_EntityName);\n\tif (it != EntityTypeToFunction.end())\n\t{\n\t\t(this->*it->second)(a_Entities, a_NBT, a_EntityTagIdx);\n\t\treturn;\n\t}\n\n\tconst auto StatInfo = NamespaceSerializer::SplitNamespacedID(a_EntityName);\n\tif (StatInfo.first == NamespaceSerializer::Namespace::Unknown)\n\t{\n\t\treturn;\n\t}\n\n\tswitch (NamespaceSerializer::ToMonsterType(StatInfo.second))\n\t{\n\t\tcase mtBat:             return LoadBatFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtBlaze:           return LoadBlazeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtCat:             return LoadCatFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtCaveSpider:      return LoadCaveSpiderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtChicken:         return LoadChickenFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtCod:             return LoadCodFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtCow:             return LoadCowFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtCreeper:         return LoadCreeperFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtDolphin:         return LoadDolphinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtDonkey:          return LoadDonkeyFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtDrowned:         return LoadDrownedFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtElderGuardian:   return LoadElderGuardianFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtEnderDragon:     return LoadEnderDragonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtEnderman:        return LoadEndermanFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtEndermite:       return LoadEndermiteFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtEvoker:          return LoadEvokerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtFox:             return LoadFoxFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtGhast:           return LoadGhastFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtGiant:           return LoadGiantFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtGuardian:        return LoadGuardianFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtHorse:           return LoadHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtHoglin:          return LoadHoglinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtHusk:            return LoadHuskFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtIllusioner:      return LoadIllusionerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtIronGolem:       return LoadIronGolemFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtLlama:           return LoadLlamaFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtMagmaCube:       return LoadMagmaCubeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtMooshroom:       return LoadMooshroomFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtMule:            return LoadMuleFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtOcelot:          return LoadOcelotFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtPanda:           return LoadPandaFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtParrot:          return LoadParrotFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtPhantom:         return LoadPhantomFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtPig:             return LoadPigFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtPiglin:          return LoadPiglinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtPiglinBrute:     return LoadPiglinBruteFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtPillager:        return LoadPillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtPolarBear:       return LoadPolarBearFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtPufferfish:      return LoadPufferfishFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtRabbit:          return LoadRabbitFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtRavager:         return LoadRavagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSalmon:          return LoadSalmonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSheep:           return LoadSheepFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtShulker:         return LoadShulkerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSilverfish:      return LoadSilverfishFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSkeleton:        return LoadSkeletonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSkeletonHorse:   return LoadSkeletonHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSlime:           return LoadSlimeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSnowGolem:       return LoadSnowGolemFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSpider:          return LoadSpiderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtSquid:           return LoadSquidFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtStray:           return LoadStrayFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtStrider:         return LoadStriderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtTraderLlama:     return LoadTraderLlamaFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtTropicalFish:    return LoadTropicalFishFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtTurtle:          return LoadTurtleFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtVex:             return LoadVexFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtVillager:        return LoadVillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtVindicator:      return LoadVindicatorFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtWanderingTrader: return LoadWanderingTraderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtWitch:           return LoadWitchFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtWither:          return LoadWitherFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtWitherSkeleton:  return LoadWitherSkeletonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtWolf:            return LoadWolfFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtZoglin:          return LoadZoglinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtZombie:          return LoadZombieFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtZombieHorse:     return LoadZombieHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtZombifiedPiglin: return LoadZombifiedPiglinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtZombieVillager:  return LoadZombieVillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);\n\t\tcase mtInvalidType:     break;\n\t}\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadOldMinecartFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\t// It is a minecart, old style, find out the type:\n\tint TypeTag = a_NBT.FindChildByName(a_TagIdx, \"Type\");\n\tif ((TypeTag < 0) || (a_NBT.GetType(TypeTag) != TAG_Int))\n\t{\n\t\treturn;\n\t}\n\tint MinecartType = a_NBT.GetInt(TypeTag);\n\tswitch (MinecartType)\n\t{\n\t\tcase 0: LoadMinecartRFromNBT(a_Entities, a_NBT, a_TagIdx); break;  // Rideable minecart\n\t\tcase 1: LoadMinecartCFromNBT(a_Entities, a_NBT, a_TagIdx); break;  // Minecart with chest\n\t\tcase 2: LoadMinecartFFromNBT(a_Entities, a_NBT, a_TagIdx); break;  // Minecart with furnace\n\t\tcase 3: LoadMinecartTFromNBT(a_Entities, a_NBT, a_TagIdx); break;  // Minecart with TNT\n\t\tcase 4: LoadMinecartHFromNBT(a_Entities, a_NBT, a_TagIdx); break;  // Minecart with Hopper\n\t\tdefault: LOGWARNING(\"cWSSAnvil::LoadOldMinecartFromNBT: Unhandled minecart type (%d)\", MinecartType); break;\n\t}\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadBoatFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Boat = std::make_unique<cBoat>(Vector3d(), cBoat::bmOak);\n\tif (!LoadEntityBaseFromNBT(*Boat.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint TypeIdx = a_NBT.FindChildByName(a_TagIdx, \"Type\");\n\tif (TypeIdx > 0)\n\t{\n\t\tBoat->SetMaterial(cBoat::StringToMaterial(a_NBT.GetString(TypeIdx)));\n\t}\n\ta_Entities.emplace_back(std::move(Boat));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadEnderCrystalFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tbool DisplayBeam = false, ShowBottom = false;\n\tVector3i BeamTarget;\n\tint CurrentLine = a_NBT.FindChildByName(a_TagIdx, \"BeamTarget\");\n\tif (CurrentLine > 0)\n\t{\n\t\tDisplayBeam = true;\n\t\tif (a_NBT.GetType(CurrentLine) == TAG_Compound)\n\t\t{\n\t\t\tint CoordinateLine = a_NBT.FindChildByName(CurrentLine, \"X\");\n\t\t\tif (CoordinateLine > 0)\n\t\t\t{\n\t\t\t\tBeamTarget.x = a_NBT.GetInt(CoordinateLine);\n\t\t\t}\n\t\t\tCoordinateLine = a_NBT.FindChildByName(CurrentLine, \"Y\");\n\t\t\tif (CoordinateLine > 0)\n\t\t\t{\n\t\t\t\tBeamTarget.y = a_NBT.GetInt(CoordinateLine);\n\t\t\t}\n\t\t\tCoordinateLine = a_NBT.FindChildByName(CurrentLine, \"Z\");\n\t\t\tif (CoordinateLine > 0)\n\t\t\t{\n\t\t\t\tBeamTarget.z = a_NBT.GetInt(CoordinateLine);\n\t\t\t}\n\t\t}\n\t}\n\tCurrentLine = a_NBT.FindChildByName(a_TagIdx, \"ShowBottom\");\n\tif (CurrentLine > 0)\n\t{\n\t\tShowBottom = a_NBT.GetByte(CurrentLine) == 1;\n\t}\n\n\tauto EnderCrystal = std::make_unique<cEnderCrystal>(Vector3d(), BeamTarget, DisplayBeam, ShowBottom);\n\tif (!LoadEntityBaseFromNBT(*EnderCrystal.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(EnderCrystal));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadFallingBlockFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint TypeIdx = a_NBT.FindChildByName(a_TagIdx, \"TileID\");\n\tint MetaIdx = a_NBT.FindChildByName(a_TagIdx, \"Data\");\n\n\tif ((TypeIdx < 0) || (MetaIdx < 0))\n\t{\n\t\treturn;\n\t}\n\n\tBLOCKTYPE Type = static_cast<BLOCKTYPE>(a_NBT.GetInt(TypeIdx));\n\tNIBBLETYPE Meta = static_cast<NIBBLETYPE>(a_NBT.GetByte(MetaIdx));\n\n\tauto FallingBlock = std::make_unique<cFallingBlock>(Vector3i(0, 0, 0), Type, Meta);\n\tif (!LoadEntityBaseFromNBT(*FallingBlock.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\ta_Entities.emplace_back(std::move(FallingBlock));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadMinecartRFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Minecart = std::make_unique<cRideableMinecart>(Vector3d(), cItem(), 1);  // TODO: Load the block and the height\n\tif (!LoadEntityBaseFromNBT(*Minecart.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\ta_Entities.emplace_back(std::move(Minecart));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadMinecartCFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint Items = a_NBT.FindChildByName(a_TagIdx, \"Items\");\n\tif ((Items < 0) || (a_NBT.GetType(Items) != TAG_List))\n\t{\n\t\treturn;  // Make it an empty chest - the chunk loader will provide an empty cChestEntity for this\n\t}\n\tauto Minecart = std::make_unique<cMinecartWithChest>(Vector3d());\n\tif (!LoadEntityBaseFromNBT(*Minecart.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\tfor (int Child = a_NBT.GetFirstChild(Items); Child != -1; Child = a_NBT.GetNextSibling(Child))\n\t{\n\t\tint Slot = a_NBT.FindChildByName(Child, \"Slot\");\n\t\tif ((Slot < 0) || (a_NBT.GetType(Slot) != TAG_Byte))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tcItem Item;\n\t\tif (LoadItemFromNBT(Item, a_NBT, Child))\n\t\t{\n\t\t\tMinecart->SetSlot(a_NBT.GetByte(Slot), Item);\n\t\t}\n\t}  // for itr - ItemDefs[]\n\ta_Entities.emplace_back(std::move(Minecart));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadMinecartFFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Minecart = std::make_unique<cMinecartWithFurnace>(Vector3d());\n\tif (!LoadEntityBaseFromNBT(*Minecart.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// TODO: Load the Push and Fuel tags\n\n\ta_Entities.emplace_back(std::move(Minecart));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadMinecartTFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Minecart = std::make_unique<cMinecartWithTNT>(Vector3d());\n\tif (!LoadEntityBaseFromNBT(*Minecart.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// TODO: Everything to do with TNT carts\n\n\ta_Entities.emplace_back(std::move(Minecart));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadMinecartHFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Minecart = std::make_unique<cMinecartWithHopper>(Vector3d());\n\tif (!LoadEntityBaseFromNBT(*Minecart.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// TODO: Everything to do with hopper carts\n\n\ta_Entities.emplace_back(std::move(Minecart));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPickupFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\t// Load item:\n\tint ItemTag = a_NBT.FindChildByName(a_TagIdx, \"Item\");\n\tif ((ItemTag < 0) || (a_NBT.GetType(ItemTag) != TAG_Compound))\n\t{\n\t\treturn;\n\t}\n\tcItem Item;\n\tif (!LoadItemFromNBT(Item, a_NBT, ItemTag))\n\t{\n\t\treturn;\n\t}\n\n\tauto Pickup = std::make_unique<cPickup>(Vector3d(), Item, false);  // Pickup delay doesn't matter, just say false\n\tif (!LoadEntityBaseFromNBT(*Pickup.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Load age:\n\tint Age = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (Age > 0)\n\t{\n\t\tPickup->SetAge(a_NBT.GetShort(Age));\n\t}\n\n\ta_Entities.emplace_back(std::move(Pickup));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadTNTFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto TNT = std::make_unique<cTNTEntity>(Vector3d(), 0);\n\tif (!LoadEntityBaseFromNBT(*TNT.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Load Fuse Ticks:\n\tint FuseTicks = a_NBT.FindChildByName(a_TagIdx, \"Fuse\");\n\tif (FuseTicks > 0)\n\t{\n\t\tTNT->SetFuseTicks(a_NBT.GetByte(FuseTicks));\n\t}\n\n\ta_Entities.emplace_back(std::move(TNT));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadExpOrbFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto ExpOrb = std::make_unique<cExpOrb>(Vector3d(), 0);\n\tif (!LoadEntityBaseFromNBT(*ExpOrb.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Load Age:\n\tint Age = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (Age > 0)\n\t{\n\t\tExpOrb->SetAge(a_NBT.GetShort(Age));\n\t}\n\n\t// Load Reward (Value):\n\tint Reward = a_NBT.FindChildByName(a_TagIdx, \"Value\");\n\tif (Reward > 0)\n\t{\n\t\tExpOrb->SetReward(a_NBT.GetShort(Reward));\n\t}\n\n\ta_Entities.emplace_back(std::move(ExpOrb));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadHangingFromNBT(cHangingEntity & a_Hanging, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\t// \"Facing\" tag is the prime source of the Facing; if not available, translate from older \"Direction\" or \"Dir\"\n\tint Facing = a_NBT.FindChildByName(a_TagIdx, \"Facing\");\n\tif (Facing < 0)\n\t{\n\t\treturn;\n\t}\n\n\ta_Hanging.SetProtocolFacing(a_NBT.GetByte(Facing));\n\n\tint TileX = a_NBT.FindChildByName(a_TagIdx, \"TileX\");\n\tint TileY = a_NBT.FindChildByName(a_TagIdx, \"TileY\");\n\tint TileZ = a_NBT.FindChildByName(a_TagIdx, \"TileZ\");\n\tif ((TileX > 0) && (TileY > 0) && (TileZ > 0))\n\t{\n\t\ta_Hanging.SetPosition(\n\t\t\tstatic_cast<double>(a_NBT.GetInt(TileX)),\n\t\t\tstatic_cast<double>(a_NBT.GetInt(TileY)),\n\t\t\tstatic_cast<double>(a_NBT.GetInt(TileZ))\n\t\t);\n\t}\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadItemFrameFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\t// Load item:\n\tint ItemTag = a_NBT.FindChildByName(a_TagIdx, \"Item\");\n\tif ((ItemTag < 0) || (a_NBT.GetType(ItemTag) != TAG_Compound))\n\t{\n\t\treturn;\n\t}\n\tcItem Item;\n\tif (!LoadItemFromNBT(Item, a_NBT, ItemTag))\n\t{\n\t\treturn;\n\t}\n\n\tauto ItemFrame = std::make_unique<cItemFrame>(BLOCK_FACE_NONE, Vector3d());\n\tif (!LoadEntityBaseFromNBT(*ItemFrame.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\tItemFrame->SetItem(Item);\n\n\tLoadHangingFromNBT(*ItemFrame.get(), a_NBT, a_TagIdx);\n\n\t// Load Rotation:\n\tint Rotation = a_NBT.FindChildByName(a_TagIdx, \"ItemRotation\");\n\tif (Rotation > 0)\n\t{\n\t\tItemFrame->SetItemRotation(static_cast<Byte>(a_NBT.GetByte(Rotation)));\n\t}\n\n\ta_Entities.emplace_back(std::move(ItemFrame));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadLeashKnotFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto LeashKnot = std::make_unique<cLeashKnot>(BLOCK_FACE_NONE, Vector3d());\n\n\tif (!LoadEntityBaseFromNBT(*LeashKnot.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tLoadHangingFromNBT(*LeashKnot.get(), a_NBT, a_TagIdx);\n\n\ta_Entities.emplace_back(std::move(LeashKnot));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPaintingFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\t// Load painting name:\n\tint MotiveTag = a_NBT.FindChildByName(a_TagIdx, \"Motive\");\n\tif ((MotiveTag < 0) || (a_NBT.GetType(MotiveTag) != TAG_String))\n\t{\n\t\treturn;\n\t}\n\n\tauto Painting = std::make_unique<cPainting>(a_NBT.GetString(MotiveTag), BLOCK_FACE_NONE, Vector3d());\n\tif (!LoadEntityBaseFromNBT(*Painting.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tLoadHangingFromNBT(*Painting.get(), a_NBT, a_TagIdx);\n\ta_Entities.emplace_back(std::move(Painting));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadArrowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Arrow = std::make_unique<cArrowEntity>(nullptr, Vector3d(), Vector3d());\n\tif (!LoadProjectileBaseFromNBT(*Arrow.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Load pickup state:\n\tint PickupIdx = a_NBT.FindChildByName(a_TagIdx, \"pickup\");\n\tif ((PickupIdx > 0) && (a_NBT.GetType(PickupIdx) == TAG_Byte))\n\t{\n\t\tArrow->SetPickupState(static_cast<cArrowEntity::ePickupState>(a_NBT.GetByte(PickupIdx)));\n\t}\n\telse\n\t{\n\t\t// Try the older \"player\" tag:\n\t\tint PlayerIdx = a_NBT.FindChildByName(a_TagIdx, \"player\");\n\t\tif ((PlayerIdx > 0) && (a_NBT.GetType(PlayerIdx) == TAG_Byte))\n\t\t{\n\t\t\tArrow->SetPickupState((a_NBT.GetByte(PlayerIdx) == 0) ? cArrowEntity::psNoPickup : cArrowEntity::psInSurvivalOrCreative);\n\t\t}\n\t}\n\n\t// Load damage:\n\tint DamageIdx = a_NBT.FindChildByName(a_TagIdx, \"damage\");\n\tif ((DamageIdx > 0) && (a_NBT.GetType(DamageIdx) == TAG_Double))\n\t{\n\t\tArrow->SetDamageCoeff(a_NBT.GetDouble(DamageIdx));\n\t}\n\n\t// Load block hit:\n\tint InBlockXIdx = a_NBT.FindChildByName(a_TagIdx, \"xTile\");\n\tint InBlockYIdx = a_NBT.FindChildByName(a_TagIdx, \"yTile\");\n\tint InBlockZIdx = a_NBT.FindChildByName(a_TagIdx, \"zTile\");\n\tif ((InBlockXIdx > 0) && (InBlockYIdx > 0) && (InBlockZIdx > 0))\n\t{\n\t\teTagType typeX = a_NBT.GetType(InBlockXIdx);\n\t\tif ((typeX == a_NBT.GetType(InBlockYIdx)) &&  (typeX == a_NBT.GetType(InBlockZIdx)))\n\t\t{\n\t\t\tswitch (typeX)\n\t\t\t{\n\t\t\t\tcase TAG_Int:\n\t\t\t\t{\n\t\t\t\t\t// Old MCS code used this, keep reading it for compatibility reasons:\n\t\t\t\t\tArrow->SetBlockHit(Vector3i(a_NBT.GetInt(InBlockXIdx), a_NBT.GetInt(InBlockYIdx), a_NBT.GetInt(InBlockZIdx)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase TAG_Short:\n\t\t\t\t{\n\t\t\t\t\t// Vanilla uses this\n\t\t\t\t\tArrow->SetBlockHit(Vector3i(a_NBT.GetShort(InBlockXIdx), a_NBT.GetShort(InBlockYIdx), a_NBT.GetShort(InBlockZIdx)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\t// No hit block, the arrow is still flying?\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Store the new arrow in the entities list:\n\ta_Entities.emplace_back(std::move(Arrow));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSplashPotionFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto SplashPotion = std::make_unique<cSplashPotionEntity>(nullptr, Vector3d(), Vector3d(), cItem());\n\tif (!LoadProjectileBaseFromNBT(*SplashPotion.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint EffectDuration         = a_NBT.FindChildByName(a_TagIdx, \"EffectDuration\");\n\tint EffectIntensity        = a_NBT.FindChildByName(a_TagIdx, \"EffectIntensity\");\n\tint EffectDistanceModifier = a_NBT.FindChildByName(a_TagIdx, \"EffectDistanceModifier\");\n\n\tSplashPotion->SetEntityEffectType(static_cast<cEntityEffect::eType>(a_NBT.FindChildByName(a_TagIdx, \"EffectType\")));\n\tSplashPotion->SetEntityEffect(cEntityEffect(EffectDuration, static_cast<Int16>(EffectIntensity), EffectDistanceModifier));\n\tSplashPotion->SetPotionColor(a_NBT.FindChildByName(a_TagIdx, \"PotionName\"));\n\n\t// Store the new splash potion in the entities list:\n\ta_Entities.emplace_back(std::move(SplashPotion));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSnowballFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Snowball = std::make_unique<cThrownSnowballEntity>(nullptr, Vector3d(), Vector3d());\n\tif (!LoadProjectileBaseFromNBT(*Snowball.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Store the new snowball in the entities list:\n\ta_Entities.emplace_back(std::move(Snowball));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadEggFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Egg = std::make_unique<cThrownEggEntity>(nullptr, Vector3d(), Vector3d());\n\tif (!LoadProjectileBaseFromNBT(*Egg.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Store the new egg in the entities list:\n\ta_Entities.emplace_back(std::move(Egg));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadFireballFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Fireball = std::make_unique<cGhastFireballEntity>(nullptr, Vector3d(), Vector3d());\n\tif (!LoadProjectileBaseFromNBT(*Fireball.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Store the new fireball in the entities list:\n\ta_Entities.emplace_back(std::move(Fireball));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadFireChargeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto FireCharge = std::make_unique<cFireChargeEntity>(nullptr, Vector3d(), Vector3d());\n\tif (!LoadProjectileBaseFromNBT(*FireCharge.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Store the new FireCharge in the entities list:\n\ta_Entities.emplace_back(std::move(FireCharge));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadThrownEnderpearlFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Enderpearl = std::make_unique<cThrownEnderPearlEntity>(nullptr, Vector3d(), Vector3d());\n\tif (!LoadProjectileBaseFromNBT(*Enderpearl.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// Store the new enderpearl in the entities list:\n\ta_Entities.emplace_back(std::move(Enderpearl));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadBatFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Monster = std::make_unique<cBat>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadBlazeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cBlaze> Monster = std::make_unique<cBlaze>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadCatFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadCaveSpiderFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cCaveSpider> Monster = std::make_unique<cCaveSpider>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadChickenFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cChicken> Monster = std::make_unique<cChicken>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadCodFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadCowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cCow> Monster = std::make_unique<cCow>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadCreeperFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cCreeper> Monster = std::make_unique<cCreeper>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadDolphinFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadDonkeyFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadDrownedFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadElderGuardianFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadEnderDragonFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cEnderDragon> Monster = std::make_unique<cEnderDragon>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadEndermanFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cEnderman> Monster = std::make_unique<cEnderman>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadEndermiteFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadEvokerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadFoxFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadGhastFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cGhast> Monster = std::make_unique<cGhast>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadGiantFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cGiant> Monster = std::make_unique<cGiant>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadGuardianFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cGuardian> Monster = std::make_unique<cGuardian>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadHorseFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint TypeIdx  = a_NBT.FindChildByName(a_TagIdx, \"Type\");\n\tint ColorIdx = a_NBT.FindChildByName(a_TagIdx, \"Color\");\n\tint StyleIdx = a_NBT.FindChildByName(a_TagIdx, \"Style\");\n\tif ((TypeIdx < 0) || (ColorIdx < 0) || (StyleIdx < 0))\n\t{\n\t\treturn;\n\t}\n\n\tint Type = a_NBT.GetInt(TypeIdx);\n\tint Color = a_NBT.GetInt(ColorIdx);\n\tint Style = a_NBT.GetInt(StyleIdx);\n\n\tstd::unique_ptr<cHorse> Monster = std::make_unique<cHorse>(Type, Color, Style, 1);\n\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadHoglinFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadHuskFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadIllusionerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadIronGolemFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cIronGolem> Monster = std::make_unique<cIronGolem>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadLlamaFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadMagmaCubeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint SizeIdx = a_NBT.FindChildByName(a_TagIdx, \"Size\");\n\n\tif (SizeIdx < 0)\n\t{\n\t\treturn;\n\t}\n\n\tint Size = a_NBT.GetInt(SizeIdx);\n\n\tstd::unique_ptr<cMagmaCube> Monster = std::make_unique<cMagmaCube>(Size);\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadMooshroomFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cMooshroom> Monster = std::make_unique<cMooshroom>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadMuleFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadOcelotFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cOcelot> Monster = std::make_unique<cOcelot>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tauto OwnerInfo = LoadEntityOwner(a_NBT, a_TagIdx);\n\tif (!OwnerInfo.first.empty() && !OwnerInfo.second.IsNil())\n\t{\n\t\tMonster->SetOwner(OwnerInfo.first, OwnerInfo.second);\n\t\tMonster->SetIsTame(true);\n\t}\n\n\tint TypeIdx  = a_NBT.FindChildByName(a_TagIdx, \"CatType\");\n\tif (TypeIdx > 0)\n\t{\n\t\tint Type = a_NBT.GetInt(TypeIdx);\n\t\tMonster->SetCatType(static_cast<cOcelot::eCatType>(Type));\n\t}\n\n\tint SittingIdx = a_NBT.FindChildByName(a_TagIdx, \"Sitting\");\n\tif ((SittingIdx > 0) && (a_NBT.GetType(SittingIdx) == TAG_Byte))\n\t{\n\t\tbool Sitting = (a_NBT.GetByte(SittingIdx) == 1);\n\t\tMonster->SetIsSitting(Sitting);\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPandaFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadParrotFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPhantomFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPigFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cPig> Monster = std::make_unique<cPig>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPiglinFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPiglinBruteFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPillagerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPolarBearFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadPufferfishFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadRabbitFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint TypeIdx  = a_NBT.FindChildByName(a_TagIdx, \"RabbitType\");\n\tint MoreCarrotTicksIdx = a_NBT.FindChildByName(a_TagIdx, \"MoreCarrotTicks\");\n\n\tif ((TypeIdx < 0) || (MoreCarrotTicksIdx < 0))\n\t{\n\t\treturn;\n\t}\n\n\tint Type = a_NBT.GetInt(TypeIdx);\n\tint MoreCarrotTicks = a_NBT.GetInt(MoreCarrotTicksIdx);\n\n\tstd::unique_ptr<cRabbit> Monster = std::make_unique<cRabbit>(static_cast<eRabbitType>(Type), MoreCarrotTicks);\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadRavagerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSalmonFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSheepFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint ColorIdx = a_NBT.FindChildByName(a_TagIdx, \"Color\");\n\tint Color = -1;\n\tif (ColorIdx > 0)\n\t{\n\t\tColor = static_cast<int>(a_NBT.GetByte(ColorIdx));\n\t}\n\n\tstd::unique_ptr<cSheep> Monster = std::make_unique<cSheep>(Color);\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint ShearedIdx = a_NBT.FindChildByName(a_TagIdx, \"Sheared\");\n\tif (ShearedIdx > 0)\n\t{\n\t\tMonster->SetSheared(a_NBT.GetByte(ShearedIdx) != 0);\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadShulkerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSilverfishFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cSilverfish> Monster = std::make_unique<cSilverfish>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSkeletonFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\t// Wither skeleton is a separate mob in Minecraft 1.11+, but we need this to\n\t// load them from older worlds where wither skeletons were only a skeleton with a flag\n\tint TypeIdx = a_NBT.FindChildByName(a_TagIdx, \"SkeletonType\");\n\n\tstd::unique_ptr<cMonster> Monster;\n\tif ((TypeIdx > 0) && (a_NBT.GetByte(TypeIdx) == 1))\n\t{\n\t\tMonster = std::make_unique<cWitherSkeleton>();\n\t}\n\telse\n\t{\n\t\tMonster = std::make_unique<cSkeleton>();\n\t}\n\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSkeletonHorseFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSlimeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint SizeIdx = a_NBT.FindChildByName(a_TagIdx, \"Size\");\n\n\tif (SizeIdx < 0)\n\t{\n\t\treturn;\n\t}\n\n\tint Size = a_NBT.GetInt(SizeIdx);\n\n\tstd::unique_ptr<cSlime> Monster = std::make_unique<cSlime>(Size);\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSnowGolemFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cSnowGolem> Monster = std::make_unique<cSnowGolem>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSpiderFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cSpider> Monster = std::make_unique<cSpider>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadSquidFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cSquid> Monster = std::make_unique<cSquid>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadStrayFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadStriderFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadTraderLlamaFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadTropicalFishFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadTurtleFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadVexFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadVillagerFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint TypeIdx = a_NBT.FindChildByName(a_TagIdx, \"Profession\");\n\tif (TypeIdx < 0)\n\t{\n\t\treturn;\n\t}\n\n\tint Type = a_NBT.GetInt(TypeIdx);\n\n\tstd::unique_ptr<cVillager> Monster = std::make_unique<cVillager>(cVillager::eVillagerType(Type));\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\tint InventoryIdx = a_NBT.FindChildByName(a_TagIdx, \"Inventory\");\n\tif (InventoryIdx > 0)\n\t{\n\t\tLoadItemGridFromNBT(Monster->GetInventory(), a_NBT, InventoryIdx);\n\t}\n\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadVindicatorFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadWanderingTraderFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadWitchFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cWitch> Monster = std::make_unique<cWitch>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadWitherFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cWither> Monster = std::make_unique<cWither>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint CurrLine = a_NBT.FindChildByName(a_TagIdx, \"Invul\");\n\tif (CurrLine > 0)\n\t{\n\t\tMonster->SetWitherInvulnerableTicks(static_cast<unsigned int>(a_NBT.GetInt(CurrLine)));\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadWitherSkeletonFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tauto Monster = std::make_unique<cWitherSkeleton>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadWolfFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cWolf> Monster = std::make_unique<cWolf>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tauto OwnerInfo = LoadEntityOwner(a_NBT, a_TagIdx);\n\tif (!OwnerInfo.first.empty() && !OwnerInfo.second.IsNil())\n\t{\n\t\tMonster->SetOwner(OwnerInfo.first, OwnerInfo.second);\n\t\tMonster->SetIsTame(true);\n\t}\n\n\tint SittingIdx = a_NBT.FindChildByName(a_TagIdx, \"Sitting\");\n\tif ((SittingIdx > 0) && (a_NBT.GetType(SittingIdx) == TAG_Byte))\n\t{\n\t\tbool Sitting = (a_NBT.GetByte(SittingIdx) == 1);\n\t\tMonster->SetIsSitting(Sitting);\n\t}\n\tint AngryIdx = a_NBT.FindChildByName(a_TagIdx, \"Angry\");\n\tif ((AngryIdx > 0) && (a_NBT.GetType(AngryIdx) == TAG_Byte))\n\t{\n\t\tbool Angry = (a_NBT.GetByte(AngryIdx) == 1);\n\t\tMonster->SetIsAngry(Angry);\n\t}\n\tint CollarColorIdx = a_NBT.FindChildByName(a_TagIdx, \"CollarColor\");\n\tif (CollarColorIdx > 0)\n\t{\n\t\tswitch (a_NBT.GetType(CollarColorIdx))\n\t\t{\n\t\t\tcase TAG_Byte:\n\t\t\t{\n\t\t\t\t// Vanilla uses this\n\t\t\t\tMonster->SetCollarColor(a_NBT.GetByte(CollarColorIdx));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAG_Int:\n\t\t\t{\n\t\t\t\t// Old MCS code used this, keep reading it for compatibility reasons:\n\t\t\t\tMonster->SetCollarColor(a_NBT.GetInt(CollarColorIdx));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\t// No other values are interpreted\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadZoglinFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadZombieFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cZombie> Monster = std::make_unique<cZombie>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt(AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadZombieHorseFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)\n{\n\t// TODO\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadZombifiedPiglinFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tstd::unique_ptr<cZombiePigman> Monster = std::make_unique<cZombiePigman>();\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault: Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadZombieVillagerFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint ProfessionIdx = a_NBT.FindChildByName(a_TagIdx, \"Profession\");\n\tif (ProfessionIdx < 0)\n\t{\n\t\treturn;\n\t}\n\n\tcVillager::eVillagerType Profession = static_cast<cVillager::eVillagerType>(a_NBT.GetInt(ProfessionIdx));\n\n\tstd::unique_ptr<cZombieVillager> Monster = std::make_unique<cZombieVillager>(Profession);\n\tif (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\tif (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))\n\t{\n\t\treturn;\n\t}\n\n\t// TODO: Conversion time\n\n\tint AgeableIdx  = a_NBT.FindChildByName(a_TagIdx, \"Age\");\n\tif (AgeableIdx > 0)\n\t{\n\t\tint Age;\n\t\tswitch (a_NBT.GetType(AgeableIdx))\n\t\t{\n\t\t\tcase TAG_Byte: Age = static_cast<int>(a_NBT.GetByte(AgeableIdx)); break;\n\t\t\tcase TAG_Int:  Age = a_NBT.GetInt (AgeableIdx); break;\n\t\t\tdefault:       Age = 0; break;\n\t\t}\n\t\tMonster->SetAge(Age);\n\t}\n\n\ta_Entities.emplace_back(std::move(Monster));\n}\n\n\n\n\n\nstd::pair<AString, cUUID> cWSSAnvil::LoadEntityOwner(const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\t// Load the owner information. OwnerUUID or Owner may be specified, possibly both:\n\tAString OwnerName;\n\tcUUID OwnerUUID;\n\tint OwnerUUIDIdx = a_NBT.FindChildByName(a_TagIdx, \"OwnerUUID\");\n\tif (OwnerUUIDIdx > 0)\n\t{\n\t\tOwnerUUID.FromString(a_NBT.GetString(OwnerUUIDIdx));\n\t}\n\tint OwnerIdx = a_NBT.FindChildByName(a_TagIdx, \"Owner\");\n\tif (OwnerIdx > 0)\n\t{\n\t\tOwnerName = a_NBT.GetString(OwnerIdx);\n\t}\n\tif (OwnerName.empty() && OwnerUUID.IsNil())\n\t{\n\t\t// There is no owner, bail out:\n\t\treturn {};\n\t}\n\n\t// Convert name to UUID, if needed:\n\tif (OwnerUUID.IsNil())\n\t{\n\t\t// This entity has only playername stored (pre-1.7.6), look up the UUID\n\t\t// The lookup is blocking, but we're running in a separate thread, so it's ok\n\t\tOwnerUUID = cRoot::Get()->GetMojangAPI().GetUUIDFromPlayerName(OwnerName);\n\t\tif (OwnerUUID.IsNil())\n\t\t{\n\t\t\t// Not a known player, un-tame the entity by bailing out\n\t\t\treturn {};\n\t\t}\n\t}\n\n\t// Convert UUID to name, if needed:\n\tif (OwnerName.empty())\n\t{\n\t\t// The lookup is blocking, but we're running in a separate thread, so it's ok\n\t\tOwnerName = cRoot::Get()->GetMojangAPI().GetPlayerNameFromUUID(OwnerUUID);\n\t\tif (OwnerName.empty())\n\t\t{\n\t\t\t// Not a known player, un-tame the entity by bailing out\n\t\t\treturn {};\n\t\t}\n\t}\n\n\treturn { OwnerName, OwnerUUID };\n}\n\n\n\n\n\nbool cWSSAnvil::LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tdouble Pos[3];\n\tif (!LoadDoublesListFromNBT(Pos, 3, a_NBT, a_NBT.FindChildByName(a_TagIdx, \"Pos\")))\n\t{\n\t\treturn false;\n\t}\n\ta_Entity.SetPosition(Pos[0], Pos[1], Pos[2]);\n\n\tdouble Speed[3];\n\tif (!LoadDoublesListFromNBT(Speed, 3, a_NBT, a_NBT.FindChildByName(a_TagIdx, \"Motion\")))\n\t{\n\t\t// Provide default speed:\n\t\tSpeed[0] = 0;\n\t\tSpeed[1] = 0;\n\t\tSpeed[2] = 0;\n\t}\n\ta_Entity.SetSpeed(Speed[0], Speed[1], Speed[2]);\n\n\tdouble Rotation[3];\n\tif (!LoadDoublesListFromNBT(Rotation, 2, a_NBT, a_NBT.FindChildByName(a_TagIdx, \"Rotation\")))\n\t{\n\t\t// Provide default rotation:\n\t\tRotation[0] = 0;\n\t\tRotation[1] = 0;\n\t}\n\ta_Entity.SetYaw(Rotation[0]);\n\ta_Entity.SetPitch(Rotation[1]);\n\n\t// Depending on the Minecraft version, the entity's health is\n\t// stored either as a float Health tag (HealF prior to 1.9) or\n\t// as a short Health tag. The float tags should be preferred.\n\tint Health = a_NBT.FindChildByName(a_TagIdx, \"Health\");\n\tint HealF  = a_NBT.FindChildByName(a_TagIdx, \"HealF\");\n\n\tif (Health > 0 && a_NBT.GetType(Health) == TAG_Float)\n\t{\n\t\ta_Entity.SetHealth(a_NBT.GetFloat(Health));\n\t}\n\telse if (HealF > 0)\n\t{\n\t\ta_Entity.SetHealth(a_NBT.GetFloat(HealF));\n\t}\n\telse if (Health > 0)\n\t{\n\t\ta_Entity.SetHealth(static_cast<float>(a_NBT.GetShort(Health)));\n\t}\n\telse\n\t{\n\t\ta_Entity.SetHealth(a_Entity.GetMaxHealth());\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cWSSAnvil::LoadMonsterBaseFromNBT(cMonster & a_Monster, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tfloat DropChance[5];\n\tif (LoadFloatsListFromNBT(DropChance, 5, a_NBT, a_NBT.FindChildByName(a_TagIdx, \"DropChances\")))\n\t{\n\t\ta_Monster.SetDropChanceWeapon(DropChance[0]);\n\t\ta_Monster.SetDropChanceHelmet(DropChance[1]);\n\t\ta_Monster.SetDropChanceChestplate(DropChance[2]);\n\t\ta_Monster.SetDropChanceLeggings(DropChance[3]);\n\t\ta_Monster.SetDropChanceBoots(DropChance[4]);\n\t}\n\tif (LoadFloatsListFromNBT(DropChance, 2, a_NBT, a_NBT.FindChildByName(a_TagIdx, \"HandDropChances\")))\n\t{\n\t\ta_Monster.SetDropChanceWeapon(DropChance[0]);\n\t}\n\tif (LoadFloatsListFromNBT(DropChance, 4, a_NBT, a_NBT.FindChildByName(a_TagIdx, \"ArmorDropChances\")))\n\t{\n\t\ta_Monster.SetDropChanceHelmet(DropChance[0]);\n\t\ta_Monster.SetDropChanceChestplate(DropChance[1]);\n\t\ta_Monster.SetDropChanceLeggings(DropChance[2]);\n\t\ta_Monster.SetDropChanceBoots(DropChance[3]);\n\t}\n\n\tint LootTag = a_NBT.FindChildByName(a_TagIdx, \"CanPickUpLoot\");\n\tif (LootTag > 0)\n\t{\n\t\tbool CanPickUpLoot = (a_NBT.GetByte(LootTag) == 1);\n\t\ta_Monster.SetCanPickUpLoot(CanPickUpLoot);\n\t}\n\n\tint CustomNameTag = a_NBT.FindChildByName(a_TagIdx, \"CustomName\");\n\tif ((CustomNameTag > 0) && (a_NBT.GetType(CustomNameTag) == TAG_String))\n\t{\n\t\ta_Monster.SetCustomName(a_NBT.GetString(CustomNameTag));\n\t}\n\n\tint CustomNameVisibleTag = a_NBT.FindChildByName(a_TagIdx, \"CustomNameVisible\");\n\tif ((CustomNameVisibleTag > 0) && (a_NBT.GetType(CustomNameVisibleTag) == TAG_Byte))\n\t{\n\t\tbool CustomNameVisible = (a_NBT.GetByte(CustomNameVisibleTag) == 1);\n\t\ta_Monster.SetCustomNameAlwaysVisible(CustomNameVisible);\n\t}\n\n\t// Leashed to a knot\n\tint LeashedIdx = a_NBT.FindChildByName(a_TagIdx, \"Leashed\");\n\tif ((LeashedIdx >= 0) && a_NBT.GetByte(LeashedIdx))\n\t{\n\t\tLoadLeashToPosition(a_Monster, a_NBT, a_TagIdx);\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cWSSAnvil::LoadLeashToPosition(cMonster & a_Monster, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tint LeashIdx = a_NBT.FindChildByName(a_TagIdx, \"Leash\");\n\tif (LeashIdx < 0)\n\t{\n\t\treturn;\n\t}\n\n\tdouble PosX = 0.0, PosY = 0.0, PosZ = 0.0;\n\tbool KnotPosPresent = true;\n\tint LeashDataLine = a_NBT.FindChildByName(LeashIdx, \"X\");\n\tif (LeashDataLine >= 0)\n\t{\n\t\tPosX = a_NBT.GetDouble(LeashDataLine);\n\t}\n\telse\n\t{\n\t\tKnotPosPresent = false;\n\t}\n\tLeashDataLine = a_NBT.FindChildByName(LeashIdx, \"Y\");\n\tif (LeashDataLine >= 0)\n\t{\n\t\tPosY = a_NBT.GetDouble(LeashDataLine);\n\t}\n\telse\n\t{\n\t\tKnotPosPresent = false;\n\t}\n\tLeashDataLine = a_NBT.FindChildByName(LeashIdx, \"Z\");\n\tif (LeashDataLine >= 0)\n\t{\n\t\tPosZ = a_NBT.GetDouble(LeashDataLine);\n\t}\n\telse\n\t{\n\t\tKnotPosPresent = false;\n\t}\n\tif (KnotPosPresent)\n\t{\n\t\t// Set leash pos for the mob\n\t\ta_Monster.SetLeashToPos(new Vector3d(PosX, PosY, PosZ));\n\t}\n}\n\n\n\n\n\nbool cWSSAnvil::LoadProjectileBaseFromNBT(cProjectileEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tif (!LoadEntityBaseFromNBT(a_Entity, a_NBT, a_TagIdx))\n\t{\n\t\treturn false;\n\t}\n\n\tbool IsInGround = false;\n\tint InGroundIdx = a_NBT.FindChildByName(a_TagIdx, \"inGround\");\n\tif (InGroundIdx > 0)\n\t{\n\t\tIsInGround = (a_NBT.GetByte(InGroundIdx) != 0);\n\t}\n\ta_Entity.SetIsInGround(IsInGround);\n\n\treturn true;\n}\n\n\n\n\n\nbool cWSSAnvil::LoadDoublesListFromNBT(double * a_Doubles, int a_NumDoubles, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tif ((a_TagIdx < 0) || (a_NBT.GetType(a_TagIdx) != TAG_List) || (a_NBT.GetChildrenType(a_TagIdx) != TAG_Double))\n\t{\n\t\treturn false;\n\t}\n\tint idx = 0;\n\tfor (int Tag = a_NBT.GetFirstChild(a_TagIdx); (Tag > 0) && (idx < a_NumDoubles); Tag = a_NBT.GetNextSibling(Tag), ++idx)\n\t{\n\t\ta_Doubles[idx] = a_NBT.GetDouble(Tag);\n\t}  // for Tag - PosTag[]\n\treturn (idx == a_NumDoubles);  // Did we read enough doubles?\n}\n\n\n\n\n\nbool cWSSAnvil::LoadFloatsListFromNBT(float * a_Floats, int a_NumFloats, const cParsedNBT & a_NBT, int a_TagIdx)\n{\n\tif ((a_TagIdx < 0) || (a_NBT.GetType(a_TagIdx) != TAG_List) || (a_NBT.GetChildrenType(a_TagIdx) != TAG_Float))\n\t{\n\t\treturn false;\n\t}\n\tint idx = 0;\n\tfor (int Tag = a_NBT.GetFirstChild(a_TagIdx); (Tag > 0) && (idx < a_NumFloats); Tag = a_NBT.GetNextSibling(Tag), ++idx)\n\t{\n\t\ta_Floats[idx] = a_NBT.GetFloat(Tag);\n\t}  // for Tag - PosTag[]\n\treturn (idx == a_NumFloats);  // Did we read enough doubles?\n}\n\n\n\n\n\nbool cWSSAnvil::GetBlockEntityNBTPos(const cParsedNBT & a_NBT, int a_TagIdx, Vector3i & a_AbsPos)\n{\n\tint x = a_NBT.FindChildByName(a_TagIdx, \"x\");\n\tif ((x < 0) || (a_NBT.GetType(x) != TAG_Int))\n\t{\n\t\treturn false;\n\t}\n\tint y = a_NBT.FindChildByName(a_TagIdx, \"y\");\n\tif ((y < 0) || (a_NBT.GetType(y) != TAG_Int))\n\t{\n\t\treturn false;\n\t}\n\tint z = a_NBT.FindChildByName(a_TagIdx, \"z\");\n\tif ((z < 0) || (a_NBT.GetType(z) != TAG_Int))\n\t{\n\t\treturn false;\n\t}\n\ta_AbsPos.Set(\n\t\tClamp(a_NBT.GetInt(x), -40000000, 40000000),  // World is limited to 30M blocks in XZ, we clamp to 40M\n\t\tClamp(a_NBT.GetInt(y), -10000,    10000),     // Y is limited to 0 .. 255, we clamp to 10K\n\t\tClamp(a_NBT.GetInt(z), -40000000, 40000000)\n\t);\n\treturn true;\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWSSAnvil::cMCAFile:\n\ncWSSAnvil::cMCAFile::cMCAFile(cWSSAnvil & a_ParentSchema, const AString & a_FileName, int a_RegionX, int a_RegionZ) :\n\tm_ParentSchema(a_ParentSchema),\n\tm_RegionX(a_RegionX),\n\tm_RegionZ(a_RegionZ),\n\tm_FileName(a_FileName)\n{\n}\n\n\n\n\n\nbool cWSSAnvil::cMCAFile::OpenFile(bool a_IsForReading)\n{\n\tbool writeOutNeeded = false;\n\n\tif (m_File.IsOpen())\n\t{\n\t\t// Already open\n\t\treturn true;\n\t}\n\n\tif (a_IsForReading)\n\t{\n\t\tif (!cFile::Exists(m_FileName))\n\t\t{\n\t\t\t// We want to read and the file doesn't exist. Fail.\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (!m_File.Open(m_FileName, cFile::fmReadWrite))\n\t{\n\t\t// The file failed to open\n\t\treturn false;\n\t}\n\n\t// Load the header:\n\tif (m_File.Read(m_Header, sizeof(m_Header)) != sizeof(m_Header))\n\t{\n\t\t// Cannot read the header - perhaps the file has just been created?\n\t\t// Try writing a nullptr header for chunk offsets:\n\t\tmemset(m_Header, 0, sizeof(m_Header));\n\t\twriteOutNeeded = true;\n\t}\n\n\t// Load the TimeStamps:\n\tif (m_File.Read(m_TimeStamps, sizeof(m_TimeStamps)) != sizeof(m_TimeStamps))\n\t{\n\t\t// Cannot read the time stamps - perhaps the file has just been created?\n\t\t// Try writing a nullptr header for timestamps:\n\t\tmemset(m_TimeStamps, 0, sizeof(m_TimeStamps));\n\t\twriteOutNeeded = true;\n\t}\n\n\tif (writeOutNeeded)\n\t{\n\t\tm_File.Seek(0);\n\t\tif (\n\t\t\t(m_File.Write(m_Header, sizeof(m_Header)) != sizeof(m_Header)) ||           // Write chunk offsets\n\t\t\t(m_File.Write(m_TimeStamps, sizeof(m_TimeStamps)) != sizeof(m_TimeStamps))  // Write chunk timestamps\n\t\t)\n\t\t{\n\t\t\tLOGWARNING(\"Cannot process MCA header in file \\\"%s\\\", chunks in that file will be lost\", m_FileName.c_str());\n\t\t\tm_File.Close();\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n\n\n\nbool cWSSAnvil::cMCAFile::GetChunkData(const cChunkCoords & a_Chunk, ContiguousByteBuffer & a_Data)\n{\n\tif (!OpenFile(true))\n\t{\n\t\treturn false;\n\t}\n\n\tint LocalX = a_Chunk.m_ChunkX % 32;\n\tif (LocalX < 0)\n\t{\n\t\tLocalX = 32 + LocalX;\n\t}\n\tint LocalZ = a_Chunk.m_ChunkZ % 32;\n\tif (LocalZ < 0)\n\t{\n\t\tLocalZ = 32 + LocalZ;\n\t}\n\tunsigned ChunkLocation = ntohl(m_Header[LocalX + 32 * LocalZ]);\n\tunsigned ChunkOffset = ChunkLocation >> 8;\n\tif (ChunkOffset < 2)\n\t{\n\t\treturn false;\n\t}\n\n\tm_File.Seek(static_cast<int>(ChunkOffset * 4096));\n\n\tUInt32 ChunkSize = 0;\n\tif (m_File.Read(&ChunkSize, 4) != 4)\n\t{\n\t\tm_ParentSchema.ChunkLoadFailed(a_Chunk, \"Cannot read chunk size\", {});\n\t\treturn false;\n\t}\n\tChunkSize = ntohl(ChunkSize);\n\tif (ChunkSize < 1)\n\t{\n\t\t// Chunk size too small\n\t\tm_ParentSchema.ChunkLoadFailed(a_Chunk, \"Chunk size too small\", {});\n\t\treturn false;\n\t}\n\n\tchar CompressionType = 0;\n\tif (m_File.Read(&CompressionType, 1) != 1)\n\t{\n\t\tm_ParentSchema.ChunkLoadFailed(a_Chunk, \"Cannot read chunk compression\", {});\n\t\treturn false;\n\t}\n\tChunkSize--;\n\n\ta_Data = m_File.Read(ChunkSize);\n\tif (a_Data.size() != ChunkSize)\n\t{\n\t\tm_ParentSchema.ChunkLoadFailed(a_Chunk, \"Cannot read entire chunk data\", a_Data);\n\t\treturn false;\n\t}\n\n\tif (CompressionType != 2)\n\t{\n\t\t// Chunk is in an unknown compression\n\t\tm_ParentSchema.ChunkLoadFailed(a_Chunk, fmt::format(FMT_STRING(\"Unknown chunk compression: {}\"), CompressionType), a_Data);\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n\n\n\nconst std::byte * cWSSAnvil::GetSectionData(const cParsedNBT & a_NBT, int a_Tag, const AString & a_ChildName, size_t a_Length)\n{\n\tint Child = a_NBT.FindChildByName(a_Tag, a_ChildName);\n\tif ((Child >= 0) && (a_NBT.GetType(Child) == TAG_ByteArray) && (a_NBT.GetDataLength(Child) == a_Length))\n\t{\n\t\treturn a_NBT.GetData(Child);\n\t}\n\treturn nullptr;\n}\n\n\n\n\n\nbool cWSSAnvil::cMCAFile::SetChunkData(const cChunkCoords & a_Chunk, const ContiguousByteBufferView a_Data)\n{\n\tif (!OpenFile(false))\n\t{\n\t\tLOGWARNING(\"Cannot save chunk [%d, %d], opening file \\\"%s\\\" failed\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());\n\t\treturn false;\n\t}\n\n\tint LocalX = a_Chunk.m_ChunkX % 32;\n\tif (LocalX < 0)\n\t{\n\t\tLocalX = 32 + LocalX;\n\t}\n\tint LocalZ = a_Chunk.m_ChunkZ % 32;\n\tif (LocalZ < 0)\n\t{\n\t\tLocalZ = 32 + LocalZ;\n\t}\n\n\tunsigned ChunkSector = FindFreeLocation(LocalX, LocalZ, a_Data.size());\n\n\t// Store the chunk data:\n\tm_File.Seek(static_cast<int>(ChunkSector * 4096));\n\tUInt32 ChunkSize = htonl(static_cast<UInt32>(a_Data.size() + 1));\n\tif (m_File.Write(&ChunkSize, 4) != 4)\n\t{\n\t\tLOGWARNING(\"Cannot save chunk [%d, %d], writing(1) data to file \\\"%s\\\" failed\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());\n\t\treturn false;\n\t}\n\tchar CompressionType = 2;\n\tif (m_File.Write(&CompressionType, 1) != 1)\n\t{\n\t\tLOGWARNING(\"Cannot save chunk [%d, %d], writing(2) data to file \\\"%s\\\" failed\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());\n\t\treturn false;\n\t}\n\tif (m_File.Write(a_Data.data(), a_Data.size()) != static_cast<int>(a_Data.size()))\n\t{\n\t\tLOGWARNING(\"Cannot save chunk [%d, %d], writing(3) data to file \\\"%s\\\" failed\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());\n\t\treturn false;\n\t}\n\n\t// Add padding to 4K boundary:\n\tsize_t BytesWritten = a_Data.size() + MCA_CHUNK_HEADER_LENGTH;\n\tif (BytesWritten % 4096 != 0)\n\t{\n\t\tstatic const char Padding[4095] = {0};\n\t\tm_File.Write(Padding, 4096 - (BytesWritten % 4096));\n\t}\n\n\t// Store the header:\n\tChunkSize = (static_cast<UInt32>(a_Data.size()) + MCA_CHUNK_HEADER_LENGTH + 4095) / 4096;  // Round data size up to nearest 4KB sector, make it a sector number\n\tif (ChunkSize > 255)\n\t{\n\t\tLOGWARNING(\"Cannot save chunk [%d, %d], the data is too large (%u KiB, maximum is 1024 KiB). Remove some entities and retry.\",\n\t\t\ta_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, static_cast<unsigned>(ChunkSize * 4)\n\t\t);\n\t\treturn false;\n\t}\n\n\t// Store the header info in the table\n\tm_Header[LocalX + 32 * LocalZ] = htonl(static_cast<UInt32>((ChunkSector << 8) | ChunkSize));\n\n\t// Set the modification time\n\tm_TimeStamps[LocalX + 32 * LocalZ] =  htonl(static_cast<UInt32>(time(nullptr)));\n\n\tif (m_File.Seek(0) < 0)\n\t{\n\t\tLOGWARNING(\"Cannot save chunk [%d, %d], seeking in file \\\"%s\\\" failed\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());\n\t\treturn false;\n\t}\n\tif (m_File.Write(m_Header, sizeof(m_Header)) != sizeof(m_Header))\n\t{\n\t\tLOGWARNING(\"Cannot save chunk [%d, %d], writing header to file \\\"%s\\\" failed\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());\n\t\treturn false;\n\t}\n\tif (m_File.Write(m_TimeStamps, sizeof(m_TimeStamps)) != sizeof(m_TimeStamps))\n\t{\n\t\tLOGWARNING(\"Cannot save chunk [%d, %d], writing timestamps to file \\\"%s\\\" failed\", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nunsigned cWSSAnvil::cMCAFile::FindFreeLocation(int a_LocalX, int a_LocalZ, const size_t a_DataSize)\n{\n\t// See if it fits the current location:\n\tunsigned ChunkLocation = ntohl(m_Header[a_LocalX + 32 * a_LocalZ]);\n\tunsigned ChunkLen = ChunkLocation & 0xff;\n\tif (a_DataSize + MCA_CHUNK_HEADER_LENGTH <= (ChunkLen * 4096))\n\t{\n\t\treturn ChunkLocation >> 8;\n\t}\n\n\t// Doesn't fit, append to the end of file (we're wasting a lot of space, TODO: fix this later)\n\tunsigned MaxLocation = 2 << 8;  // Minimum sector is #2 - after the headers\n\tfor (size_t i = 0; i < ARRAYCOUNT(m_Header); i++)\n\t{\n\t\tChunkLocation = ntohl(m_Header[i]);\n\t\tChunkLocation = ChunkLocation + ((ChunkLocation & 0xff) << 8);  // Add the number of sectors used; don't care about the 4th byte\n\t\tif (MaxLocation < ChunkLocation)\n\t\t{\n\t\t\tMaxLocation = ChunkLocation;\n\t\t}\n\t}  // for i - m_Header[]\n\treturn MaxLocation >> 8;\n}\n"
  },
  {
    "path": "src/WorldStorage/WSSAnvil.h",
    "content": "#pragma once\n\n#include \"../BlockEntities/BlockEntity.h\"\n#include \"WorldStorage.h\"\n#include \"FastNBT.h\"\n#include \"StringCompression.h\"\n\n\n\n\n\n// fwd:\nclass cItem;\nclass cItemGrid;\nclass cMonster;\nclass cProjectileEntity;\nclass cHangingEntity;\nclass cUUID;\nclass ChunkBlockData;\n\n\n\n\n\n/** Implements the Anvil world storage schema. */\nclass cWSSAnvil:\n\tpublic cWSSchema\n{\n\tusing Super = cWSSchema;\n\npublic:\n\n\tcWSSAnvil(cWorld * a_World, int a_CompressionFactor);\n\tvirtual ~cWSSAnvil() override;\n\nprotected:\n\n\tenum\n\t{\n\t\t/** Maximum number of chunks in an MCA file - also the count of the header items */\n\t\tMCA_MAX_CHUNKS = 32 * 32,\n\n\t\t/** The MCA header is 8 KiB */\n\t\tMCA_HEADER_SIZE = MCA_MAX_CHUNKS * 8,\n\n\t\t/** There are 5 bytes of header in front of each chunk */\n\t\tMCA_CHUNK_HEADER_LENGTH = 5,\n\t} ;\n\n\n\tclass cMCAFile\n\t{\n\tpublic:\n\n\t\tcMCAFile(cWSSAnvil & a_ParentSchema, const AString & a_FileName, int a_RegionX, int a_RegionZ);\n\n\t\tbool GetChunkData  (const cChunkCoords & a_Chunk, ContiguousByteBuffer & a_Data);\n\t\tbool SetChunkData  (const cChunkCoords & a_Chunk, ContiguousByteBufferView a_Data);\n\n\t\tint             GetRegionX () const {return m_RegionX; }\n\t\tint             GetRegionZ () const {return m_RegionZ; }\n\t\tconst AString & GetFileName() const {return m_FileName; }\n\n\tprotected:\n\n\t\tcWSSAnvil & m_ParentSchema;\n\n\t\tint     m_RegionX;\n\t\tint     m_RegionZ;\n\t\tcFile   m_File;\n\t\tAString m_FileName;\n\n\t\t// The header, copied from the file so we don't have to seek to it all the time\n\t\t// First 1024 entries are chunk locations - the 3 + 1 byte sector-offset and sector-count\n\t\tunsigned m_Header[MCA_MAX_CHUNKS];\n\n\t\t// Chunk timestamps, following the chunk headers\n\t\tunsigned m_TimeStamps[MCA_MAX_CHUNKS];\n\n\t\t/** Finds a free location large enough to hold a_Data. Returns the sector number. */\n\t\tunsigned FindFreeLocation(int a_LocalX, int a_LocalZ, size_t a_DataSize);\n\n\t\t/** Opens a MCA file either for a Read operation (fails if doesn't exist) or for a Write operation (creates new if not found) */\n\t\tbool OpenFile(bool a_IsForReading);\n\t} ;\n\n\t/** Protects m_Files against multithreaded access. */\n\tcCriticalSection m_CS;\n\n\t/** A MRU cache of MCA files.\n\tProtected against multithreaded access by m_CS. */\n\tstd::list<std::shared_ptr<cMCAFile>> m_Files;\n\n\tCompression::Extractor m_Extractor;\n\tCompression::Compressor m_Compressor;\n\n\t/** Reports that the specified chunk failed to load and saves the chunk data to an external file. */\n\tvoid ChunkLoadFailed(const cChunkCoords a_ChunkCoords, const AString & a_Reason, ContiguousByteBufferView a_ChunkDataToSave);\n\n\t/** Gets chunk data from the correct file; locks file CS as needed */\n\tbool GetChunkData(const cChunkCoords & a_Chunk, ContiguousByteBuffer & a_Data);\n\n\t/** Copies a_Length bytes of data from the specified NBT Tag's Child into the a_Destination buffer */\n\tconst std::byte * GetSectionData(const cParsedNBT & a_NBT, int a_Tag, const AString & a_ChildName, size_t a_Length);\n\n\t/** Sets chunk data into the correct file; locks file CS as needed */\n\tbool SetChunkData(const cChunkCoords & a_Chunk, ContiguousByteBufferView a_Data);\n\n\t/** Loads the chunk from the data (no locking needed) */\n\tbool LoadChunkFromData(const cChunkCoords & a_Chunk, ContiguousByteBufferView a_Data);\n\n\t/** Saves the chunk into datastream (no locking needed) */\n\tCompression::Result SaveChunkToData(const cChunkCoords & a_Chunk);\n\n\t/** Loads the chunk from NBT data (no locking needed).\n\ta_RawChunkData is the raw (compressed) chunk data, used for offloading when chunk loading fails. */\n\tbool LoadChunkFromNBT(const cChunkCoords & a_Chunk, const cParsedNBT & a_NBT, ContiguousByteBufferView a_RawChunkData);\n\n\t/** Loads the chunk's biome map into a_BiomeMap if biomes present and valid; returns false otherwise. */\n\tbool LoadBiomeMapFromNBT(cChunkDef::BiomeMap & a_BiomeMap, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads the chunk's height map into a_HeightMap if heights present and valid; returns false otherwise. */\n\tbool LoadHeightMapFromNBT(cChunkDef::HeightMap & a_HeightMap, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads the chunk's entities from NBT data (a_Tag is the Level\\\\Entities list tag; may be -1) */\n\tvoid LoadEntitiesFromNBT(cEntityList & a_Entitites, const cParsedNBT & a_NBT, int a_Tag);\n\n\t/** Loads the chunk's BlockEntities from NBT data (a_Tag is the Level\\\\TileEntities list tag; may be -1) */\n\tvoid LoadBlockEntitiesFromNBT(cBlockEntities & a_BlockEntitites, const cParsedNBT & a_NBT, int a_Tag, const ChunkBlockData & a_BlockData);\n\n\t/** Loads the data for a block entity from the specified NBT tag.\n\tReturns the loaded block entity, or nullptr upon failure. */\n\tOwnedBlockEntity LoadBlockEntityFromNBT(const cParsedNBT & a_NBT, int a_Tag, Vector3i a_Pos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);\n\n\t/** Loads a cItem contents from the specified NBT tag; returns true if successful. Doesn't load the Slot tag */\n\tbool LoadItemFromNBT(cItem & a_Item, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads contentents of an Items[] list tag into a cItemGrid\n\tItemGrid begins at the specified slot offset\n\tSlots outside the ItemGrid range are ignored */\n\tvoid LoadItemGridFromNBT(cItemGrid & a_ItemGrid, const cParsedNBT & a_NBT, int a_ItemsTagIdx, int s_SlotOffset = 0);\n\n\t/** Decodes the text contained within a sign.\n\tOlder versions used direct string representation, newer versions use JSON-formatted string.\n\tThis function extracts the text from either version. */\n\tAString DecodeSignLine(const AString & a_Line);\n\n\t/** Returns true iff the \"id\" child tag inside the specified tag equals (case-sensitive) any of the specified expected types.\n\tLogs a warning to the console on mismatch.\n\tThe coordinates are used only for the log message. */\n\tbool CheckBlockEntityType(const cParsedNBT & a_NBT, int a_TagIdx, const AStringVector & a_ExpectedTypes, Vector3i a_Pos);\n\n\tOwnedBlockEntity LoadBannerFromNBT           (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadBeaconFromNBT           (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadBedFromNBT              (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadBrewingstandFromNBT     (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadChestFromNBT            (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadCommandBlockFromNBT     (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadDispenserFromNBT        (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadDropperFromNBT          (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadEnchantingTableFromNBT  (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadEnderChestFromNBT       (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadEndPortalFromNBT        (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadFlowerPotFromNBT        (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadFurnaceFromNBT          (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadHopperFromNBT           (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadJukeboxFromNBT          (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadMobHeadFromNBT          (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadMobSpawnerFromNBT       (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadNoteBlockFromNBT        (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\tOwnedBlockEntity LoadSignFromNBT             (const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos);\n\n\tvoid LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_EntityTagIdx, std::string_view a_EntityName);\n\n\tvoid LoadBoatFromNBT            (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadEnderCrystalFromNBT    (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadFallingBlockFromNBT    (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPickupFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadTNTFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadExpOrbFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadHangingFromNBT         (cHangingEntity & a_Hanging, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadItemFrameFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadLeashKnotFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPaintingFromNBT        (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\tvoid LoadOldMinecartFromNBT     (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadMinecartRFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadMinecartCFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadMinecartFFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadMinecartTFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadMinecartHFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\tvoid LoadArrowFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSplashPotionFromNBT    (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSnowballFromNBT        (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadEggFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadFireballFromNBT        (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadFireChargeFromNBT      (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadThrownEnderpearlFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\tvoid LoadBatFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadBlazeFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadCatFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadCaveSpiderFromNBT      (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadChickenFromNBT         (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadCodFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadCowFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadCreeperFromNBT         (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadDolphinFromNBT         (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadDonkeyFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadDrownedFromNBT         (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadElderGuardianFromNBT   (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadEnderDragonFromNBT     (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadEndermanFromNBT        (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadEndermiteFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadEvokerFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadFoxFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadGhastFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadGiantFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadGuardianFromNBT        (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadHorseFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadHoglinFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadHuskFromNBT            (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadIllusionerFromNBT      (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadIronGolemFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadLlamaFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadMagmaCubeFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadMooshroomFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadMuleFromNBT            (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadOcelotFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPandaFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadParrotFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPhantomFromNBT         (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPigFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPiglinFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPiglinBruteFromNBT     (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPillagerFromNBT        (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPolarBearFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadPufferfishFromNBT      (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadRabbitFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadRavagerFromNBT         (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSalmonFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSheepFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadShulkerFromNBT         (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSilverfishFromNBT      (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSkeletonFromNBT        (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSkeletonHorseFromNBT   (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSlimeFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSnowGolemFromNBT       (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSpiderFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadSquidFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadStrayFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadStriderFromNBT         (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadTraderLlamaFromNBT     (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadTropicalFishFromNBT    (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadTurtleFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadVexFromNBT             (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadVillagerFromNBT        (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadVindicatorFromNBT      (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadWanderingTraderFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadWitchFromNBT           (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadWitherFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadWitherSkeletonFromNBT  (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadWolfFromNBT            (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadZoglinFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadZombieFromNBT          (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadZombieHorseFromNBT     (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadZombifiedPiglinFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\tvoid LoadZombieVillagerFromNBT  (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads the owner name and UUID from the entity at the specified NBT tag.\n\tReturns a pair of {name, uuid}. If the entity is not owned, name is an empty string and uuid is nil. */\n\tstd::pair<AString, cUUID> LoadEntityOwner(const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads entity common data from the NBT compound; returns true if successful */\n\tbool LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads monster common data from the NBT compound; returns true if successful */\n\tbool LoadMonsterBaseFromNBT(cMonster & a_Monster, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads the position to where is leashed the monster */\n\tvoid LoadLeashToPosition(cMonster & a_Monster, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads projectile common data from the NBT compound; returns true if successful */\n\tbool LoadProjectileBaseFromNBT(cProjectileEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIx);\n\n\t/** Loads an array of doubles of the specified length from the specified NBT list tag a_TagIdx; returns true if successful */\n\tbool LoadDoublesListFromNBT(double * a_Doubles, int a_NumDoubles, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Loads an array of floats of the specified length from the specified NBT list tag a_TagIdx; returns true if successful */\n\tbool LoadFloatsListFromNBT(float * a_Floats, int a_NumFloats, const cParsedNBT & a_NBT, int a_TagIdx);\n\n\t/** Helper function for extracting the X, Y, and Z int subtags of a NBT compound; returns true if successful */\n\tbool GetBlockEntityNBTPos(const cParsedNBT & a_NBT, int a_TagIdx, Vector3i & a_AbsPos);\n\n\t/** Gets the correct MCA file either from cache or from disk, manages the m_MCAFiles cache; assumes m_CS is locked */\n\tstd::shared_ptr<cMCAFile> LoadMCAFile(const cChunkCoords & a_Chunk);\n\n\t// cWSSchema overrides:\n\tvirtual bool LoadChunk(const cChunkCoords & a_Chunk) override;\n\tvirtual bool SaveChunk(const cChunkCoords & a_Chunk) override;\n\tvirtual const AString GetName() const override {return \"anvil\"; }\n} ;\n"
  },
  {
    "path": "src/WorldStorage/WorldStorage.cpp",
    "content": "\n// WorldStorage.cpp\n\n// Implements the cWorldStorage class representing the chunk loading / saving thread\n\n// To add a new storage schema, implement a cWSSchema descendant and add it to cWorldStorage::InitSchemas()\n\n#include \"Globals.h\"\n#include \"WorldStorage.h\"\n#include \"WSSAnvil.h\"\n#include \"../World.h\"\n#include \"../Generating/ChunkGenerator.h\"\n#include \"../Entities/Entity.h\"\n#include \"../BlockEntities/BlockEntity.h\"\n\n\n\n\n/** Example storage schema - forgets all chunks */\nclass cWSSForgetful :\n\tpublic cWSSchema\n{\npublic:\n\tcWSSForgetful(cWorld * a_World) : cWSSchema(a_World) {}\n\nprotected:\n\t// cWSSchema overrides:\n\tvirtual bool LoadChunk(const cChunkCoords & a_Chunk) override {return false; }\n\tvirtual bool SaveChunk(const cChunkCoords & a_Chunk) override {return true; }\n\tvirtual const AString GetName(void) const override {return \"forgetful\"; }\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cWorldStorage:\n\ncWorldStorage::cWorldStorage(void) :\n\tSuper(\"World Storage Executor\"),\n\tm_World(nullptr),\n\tm_SaveSchema(nullptr)\n{\n}\n\n\n\n\n\ncWorldStorage::~cWorldStorage()\n{\n\tfor (cWSSchemaList::iterator itr = m_Schemas.begin(); itr != m_Schemas.end(); ++itr)\n\t{\n\t\tdelete *itr;\n\t}  // for itr - m_Schemas[]\n}\n\n\n\n\n\nvoid cWorldStorage::Initialize(cWorld & a_World, const AString & a_StorageSchemaName, int a_StorageCompressionFactor)\n{\n\tm_World = &a_World;\n\tm_StorageSchemaName = a_StorageSchemaName;\n\tInitSchemas(a_StorageCompressionFactor);\n}\n\n\n\n\n\nvoid cWorldStorage::Stop(void)\n{\n\tWaitForFinish();\n}\n\n\n\n\n\nvoid cWorldStorage::WaitForFinish(void)\n{\n\tLOGD(\"Waiting for the world storage to finish saving\");\n\n\t{\n\t\tm_LoadQueue.Clear();\n\t}\n\n\t// Wait for the saving to finish:\n\tWaitForSaveQueueEmpty();\n\n\t// Wait for the thread to finish:\n\tm_ShouldTerminate = true;\n\tm_Event.Set();  // Wake up the thread if waiting\n\tSuper::Stop();\n\tLOGD(\"World storage thread finished\");\n}\n\n\n\n\n\nvoid cWorldStorage::WaitForLoadQueueEmpty(void)\n{\n\tm_LoadQueue.BlockTillEmpty();\n}\n\n\n\n\n\nvoid cWorldStorage::WaitForSaveQueueEmpty(void)\n{\n\tm_SaveQueue.BlockTillEmpty();\n}\n\n\n\n\n\nsize_t cWorldStorage::GetLoadQueueLength(void)\n{\n\treturn m_LoadQueue.Size();\n}\n\n\n\n\n\nsize_t cWorldStorage::GetSaveQueueLength(void)\n{\n\treturn m_SaveQueue.Size();\n}\n\n\n\n\n\nvoid cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT((a_ChunkX > -0x08000000) && (a_ChunkX < 0x08000000));\n\tASSERT((a_ChunkZ > -0x08000000) && (a_ChunkZ < 0x08000000));\n\tASSERT(m_World->IsChunkQueued(a_ChunkX, a_ChunkZ));\n\n\tm_LoadQueue.EnqueueItem({ a_ChunkX, a_ChunkZ });\n\tm_Event.Set();\n}\n\n\n\n\n\nvoid cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT(m_World->IsChunkValid(a_ChunkX, a_ChunkZ));\n\n\tm_SaveQueue.EnqueueItem({ a_ChunkX, a_ChunkZ });\n\tm_Event.Set();\n}\n\n\n\n\n\nvoid cWorldStorage::InitSchemas(int a_StorageCompressionFactor)\n{\n\t// The first schema added is considered the default\n\tm_Schemas.push_back(new cWSSAnvil    (m_World, a_StorageCompressionFactor));\n\tm_Schemas.push_back(new cWSSForgetful(m_World));\n\t// Add new schemas here\n\n\tif (NoCaseCompare(m_StorageSchemaName, \"default\") == 0)\n\t{\n\t\tm_SaveSchema = m_Schemas.front();\n\t\treturn;\n\t}\n\tfor (cWSSchemaList::iterator itr = m_Schemas.begin(); itr != m_Schemas.end(); ++itr)\n\t{\n\t\tif (NoCaseCompare((*itr)->GetName(), m_StorageSchemaName) == 0)\n\t\t{\n\t\t\tm_SaveSchema = *itr;\n\t\t\treturn;\n\t\t}\n\t}  // for itr - m_Schemas[]\n\n\t// Unknown schema selected, let the admin know:\n\tLOGWARNING(\"Unknown storage schema name \\\"%s\\\". Using default (\\\"%s\\\"). Available schemas:\",\n\t\tm_StorageSchemaName.c_str(), m_SaveSchema->GetName().c_str()\n\t);\n\tfor (cWSSchemaList::iterator itr = m_Schemas.begin(); itr != m_Schemas.end(); ++itr)\n\t{\n\t\tLOGWARNING(\"\\t\\\"%s\\\"\", (*itr)->GetName().c_str());\n\t}\n\tm_SaveSchema = m_Schemas.front();\n}\n\n\n\n\n\nvoid cWorldStorage::Execute(void)\n{\n\twhile (!m_ShouldTerminate)\n\t{\n\t\tm_Event.Wait();\n\t\t// Process both queues until they are empty again:\n\t\tbool Success;\n\t\tdo\n\t\t{\n\t\t\tif (m_ShouldTerminate)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tSuccess = LoadOneChunk();\n\t\t\tSuccess |= SaveOneChunk();\n\t\t} while (Success);\n\t}\n}\n\n\n\n\n\nbool cWorldStorage::LoadOneChunk(void)\n{\n\t// Dequeue an item, bail out if there's none left:\n\tcChunkCoords ToLoad(0, 0);\n\tbool ShouldLoad = m_LoadQueue.TryDequeueItem(ToLoad);\n\tif (!ShouldLoad)\n\t{\n\t\treturn false;\n\t}\n\n\t// Load the chunk:\n\tLoadChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ);\n\n\treturn true;\n}\n\n\n\n\n\nbool cWorldStorage::SaveOneChunk(void)\n{\n\t// Dequeue one chunk to save:\n\tcChunkCoords ToSave(0, 0);\n\tbool ShouldSave = m_SaveQueue.TryDequeueItem(ToSave);\n\tif (!ShouldSave)\n\t{\n\t\treturn false;\n\t}\n\n\t// Save the chunk, if it's valid:\n\tif (m_World->IsChunkValid(ToSave.m_ChunkX, ToSave.m_ChunkZ))\n\t{\n\t\tm_World->MarkChunkSaving(ToSave.m_ChunkX, ToSave.m_ChunkZ);\n\t\tif (m_SaveSchema->SaveChunk(cChunkCoords(ToSave.m_ChunkX, ToSave.m_ChunkZ)))\n\t\t{\n\t\t\tm_World->MarkChunkSaved(ToSave.m_ChunkX, ToSave.m_ChunkZ);\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nbool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkZ)\n{\n\tASSERT(m_World->IsChunkQueued(a_ChunkX, a_ChunkZ));\n\n\tcChunkCoords Coords(a_ChunkX, a_ChunkZ);\n\n\t// First try the schema that is used for saving\n\tif (m_SaveSchema->LoadChunk(Coords))\n\t{\n\t\treturn true;\n\t}\n\n\t// If it didn't have the chunk, try all the other schemas:\n\tfor (cWSSchemaList::iterator itr = m_Schemas.begin(); itr != m_Schemas.end(); ++itr)\n\t{\n\t\tif (((*itr) != m_SaveSchema) && (*itr)->LoadChunk(Coords))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Notify the chunk owner that the chunk failed to load (sets cChunk::m_HasLoadFailed to true):\n\tm_World->ChunkLoadFailed(a_ChunkX, a_ChunkZ);\n\n\treturn false;\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/WorldStorage/WorldStorage.h",
    "content": "\n// WorldStorage.h\n\n// Interfaces to the cWorldStorage class representing the chunk loading / saving thread\n// This class decides which storage schema to use for saving; it queries all available schemas for loading\n// Also declares the base class for all storage schemas, cWSSchema\n// Helper serialization class cJsonChunkSerializer is declared as well\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/IsThread.h\"\n#include \"../OSSupport/Queue.h\"\n#include \"ChunkDef.h\"\n\n\n\n\n// fwd:\nclass cWorld;\n\n\n\n\n\n/** Interface that all the world storage schemas need to implement */\nclass cWSSchema abstract\n{\npublic:\n\tcWSSchema(cWorld * a_World) : m_World(a_World) {}\n\tvirtual ~cWSSchema() {}  // Force the descendants' destructors to be virtual\n\n\tvirtual bool LoadChunk(const cChunkCoords & a_Chunk) = 0;\n\tvirtual bool SaveChunk(const cChunkCoords & a_Chunk) = 0;\n\tvirtual const AString GetName(void) const = 0;\n\nprotected:\n\n\tcWorld * m_World;\n} ;\n\ntypedef std::list<cWSSchema *> cWSSchemaList;\n\n\n\n\n\n/** The actual world storage class */\nclass cWorldStorage:\n\tpublic cIsThread\n{\n\tusing Super = cIsThread;\n\npublic:\n\n\tcWorldStorage();\n\tvirtual ~cWorldStorage() override;\n\n\t/** Queues a chunk to be loaded, asynchronously. */\n\tvoid QueueLoadChunk(int a_ChunkX, int a_ChunkZ);\n\n\t/** Queues a chunk to be saved, asynchronously. */\n\tvoid QueueSaveChunk(int a_ChunkX, int a_ChunkZ);\n\n\t/** Initializes the storage schemas, ready to be started. */\n\tvoid Initialize(cWorld & a_World, const AString & a_StorageSchemaName, int a_StorageCompressionFactor);\n\tvoid Stop(void);  // Hide the cIsThread's Stop() method, we need to signal the event\n\tvoid WaitForFinish(void);\n\tvoid WaitForLoadQueueEmpty(void);\n\tvoid WaitForSaveQueueEmpty(void);\n\n\tsize_t GetLoadQueueLength(void);\n\tsize_t GetSaveQueueLength(void);\n\nprotected:\n\n\tcWorld * m_World;\n\tAString  m_StorageSchemaName;\n\n\tcQueue<cChunkCoords> m_LoadQueue;\n\tcQueue<cChunkCoords> m_SaveQueue;\n\n\t/** All the storage schemas (all used for loading) */\n\tcWSSchemaList m_Schemas;\n\n\t/** The one storage schema used for saving */\n\tcWSSchema * m_SaveSchema;\n\n\t/** Set when there's any addition to the queues */\n\tcEvent m_Event;\n\n\n\t/** Loads the chunk specified; returns true on success, false on failure */\n\tbool LoadChunk(int a_ChunkX, int a_ChunkZ);\n\n\tvoid InitSchemas(int a_StorageCompressionFactor);\n\n\tvirtual void Execute(void) override;\n\n\t/** Loads one chunk from the queue (if any queued); returns true if there was a chunk in the queue to load */\n\tbool LoadOneChunk(void);\n\n\t/** Saves one chunk from the queue (if any queued); returns true if there was a chunk in the queue to save */\n\tbool SaveOneChunk(void);\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/XMLParser.h",
    "content": "\n// XMLParser.h\n\n// Interfaces to the CXMLParser class representing the base class for XML parsing\n\n// To use, derive a class from this base and override its OnStartElement(), OnEndElement() and OnCharacters() functions\n\n\n\n\n\n#pragma once\n\n#include \"expat/expat.h\"\n\n\n\n\n\nclass CXMLParser\n{\npublic:\n\tCXMLParser(void);\n\tvirtual ~CXMLParser();\n\n\t// The actual parsing, may be called several times; the last time needs iIsFinal == true (-> flush)\n\tint Parse(const char * iData, size_t iLength, bool iIsFinal = false);\n\nprivate:\n\t// LibExpat stuff:\n\tXML_Parser mParser;\n\n\tstatic void StartElementHandler(void * iContext, const XML_Char * iElement, const XML_Char ** iAttributes)\n\t{\n\t\t((CXMLParser *)iContext)->OnStartElement(iElement, iAttributes);\n\t}\n\n\tstatic void EndElementHandler  (void * iContext, const XML_Char * iElement)\n\t{\n\t\t((CXMLParser *)iContext)->OnEndElement(iElement);\n\t}\n\n\tstatic void CharacterDataHandler (void * iContext, const XML_Char * iData, int iLength)\n\t{\n\t\t((CXMLParser *)iContext)->OnCharacters(iData, iLength);\n\t}\n\nprotected:\n\tvirtual void OnStartElement(const XML_Char * iElement, const XML_Char ** iAttributes) = 0;\n\tvirtual void OnEndElement  (const XML_Char * iElement) = 0;\n\tvirtual void OnCharacters  (const XML_Char * iCharacters, int iLength) = 0;\n} ;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// The following template has been modified from code available at\n// https://www.codeproject.com/Articles/1847/C-Wrappers-for-the-Expat-XML-Parser\n// It uses templates to remove the virtual function call penalty (both size and speed) for each callback\n\n/* Usage:\n1, Declare a subclass:\n\tclass CMyParser : public CExpatImpl<CMyParser>\n2, Declare handlers that you want in that subclass:\n\tvoid CMyParser::OnEndElement(const XML_Char * iTagName);\n3, Create an instance of your class:\n\tCMyParser Parser;\n4, Call Create():\n\tParser.Create(nullptr, nullptr);\n4, Call Parse(), repeatedly:\n\tParser.Parse(Buffer, Length);\n*/\n\ntemplate <class _T>\nclass CExpatImpl\n{\n\n// @access Constructors and destructors\npublic:\n\n\t// @cmember General constructor\n\n\tCExpatImpl ()\n\t{\n\t\tm_p = nullptr;\n\t}\n\n\t// @cmember Destructor\n\n\t~CExpatImpl ()\n\t{\n\t\tDestroy ();\n\t}\n\n// @access Parser creation and deletion methods\npublic:\n\n\t// @cmember Create a parser\n\n\tbool Create (const XML_Char * pszEncoding = nullptr, const XML_Char * pszSep = nullptr)\n\t{\n\t\t// Destroy the old parser\n\t\tDestroy ();\n\n\t\t// If the encoding or seperator are empty, then nullptr\n\t\tif ((pszEncoding != nullptr) && (pszEncoding[0] == 0))\n\t\t{\n\t\t\tpszEncoding = nullptr;\n\t\t}\n\t\tif ((pszSep != nullptr) && (pszSep[0] == 0))\n\t\t{\n\t\t\tpszSep = nullptr;\n\t\t}\n\n\t\t// Create the new parser\n\t\tm_p = XML_ParserCreate_MM (pszEncoding, nullptr, pszSep);\n\t\tif (m_p == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Invoke the post create routine\n\t\t_T * pThis = static_cast <_T *> (this);\n\t\tpThis ->OnPostCreate ();\n\n\t\t// Set the user data used in callbacks\n\t\tXML_SetUserData (m_p, (void *) this);\n\t\treturn true;\n\t}\n\n\t// @cmember Destroy the parser\n\n\tvoid Destroy (void)\n\t{\n\t\tif (m_p != nullptr)\n\t\t{\n\t\t\tXML_ParserFree (m_p);\n\t\t}\n\t\tm_p = nullptr;\n\t}\n\n\n\t// @cmember Parse a block of data\n\n\tbool Parse (const char *pszBuffer, int nLength, bool fIsFinal = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn (XML_Parse (m_p, pszBuffer, nLength, fIsFinal) != 0);\n\t}\n\n\t// @cmember Parse internal buffer\n\n\tbool ParseBuffer (int nLength, bool fIsFinal = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn XML_ParseBuffer (m_p, nLength, fIsFinal) != 0;\n\t}\n\n\t// @cmember Get the internal buffer\n\n\tvoid *GetBuffer (int nLength)\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn XML_GetBuffer (m_p, nLength);\n\t}\n\n\nprotected:\n\t// Parser callback enable / disable methods:\n\n\t// @cmember Enable / Disable the start element handler\n\n\tvoid EnableStartElementHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetStartElementHandler (m_p, fEnable ? StartElementHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the end element handler\n\n\tvoid EnableEndElementHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetEndElementHandler (m_p, fEnable ? EndElementHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the element handlers\n\n\tvoid EnableElementHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tEnableStartElementHandler (fEnable);\n\t\tEnableEndElementHandler (fEnable);\n\t}\n\n\t// @cmember Enable / Disable the character data handler\n\n\tvoid EnableCharacterDataHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetCharacterDataHandler (m_p, fEnable ? CharacterDataHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the processing instruction handler\n\n\tvoid EnableProcessingInstructionHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetProcessingInstructionHandler (m_p, fEnable ? ProcessingInstructionHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the comment handler\n\n\tvoid EnableCommentHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetCommentHandler (m_p, fEnable ? CommentHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the start CDATA section handler\n\n\tvoid EnableStartCdataSectionHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetStartCdataSectionHandler (m_p, fEnable ? StartCdataSectionHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the end CDATA section handler\n\n\tvoid EnableEndCdataSectionHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetEndCdataSectionHandler (m_p, fEnable ? EndCdataSectionHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the CDATA section handlers\n\n\tvoid EnableCdataSectionHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tEnableStartCdataSectionHandler (fEnable);\n\t\tEnableEndCdataSectionHandler (fEnable);\n\t}\n\n\t// @cmember Enable / Disable default handler\n\n\tvoid EnableDefaultHandler (bool fEnable = true, bool fExpand = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tif (fExpand)\n\t\t{\n\t\t\tXML_SetDefaultHandlerExpand (m_p, fEnable ? DefaultHandler : nullptr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tXML_SetDefaultHandler (m_p, fEnable ? DefaultHandler : nullptr);\n\t\t}\n\t}\n\n\t// @cmember Enable / Disable external entity ref handler\n\n\tvoid EnableExternalEntityRefHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetExternalEntityRefHandler (m_p, fEnable ? ExternalEntityRefHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable unknown encoding handler\n\n\tvoid EnableUnknownEncodingHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetUnknownEncodingHandler (m_p, fEnable ? UnknownEncodingHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable start namespace handler\n\n\tvoid EnableStartNamespaceDeclHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetStartNamespaceDeclHandler (m_p, fEnable ? StartNamespaceDeclHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable end namespace handler\n\n\tvoid EnableEndNamespaceDeclHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetEndNamespaceDeclHandler (m_p, fEnable ? EndNamespaceDeclHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable namespace handlers\n\n\tvoid EnableNamespaceDeclHandler (bool fEnable = true)\n\t{\n\t\tEnableStartNamespaceDeclHandler (fEnable);\n\t\tEnableEndNamespaceDeclHandler (fEnable);\n\t}\n\n\t// @cmember Enable / Disable the XML declaration handler\n\n\tvoid EnableXmlDeclHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetXmlDeclHandler (m_p, fEnable ? XmlDeclHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the start DOCTYPE declaration handler\n\n\tvoid EnableStartDoctypeDeclHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetStartDoctypeDeclHandler (m_p, fEnable ? StartDoctypeDeclHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the end DOCTYPE declaration handler\n\n\tvoid EnableEndDoctypeDeclHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tXML_SetEndDoctypeDeclHandler (m_p,\n\t\t\tfEnable ? EndDoctypeDeclHandler : nullptr);\n\t}\n\n\t// @cmember Enable / Disable the DOCTYPE declaration handler\n\n\tvoid EnableDoctypeDeclHandler (bool fEnable = true)\n\t{\n\t\tassert (m_p != nullptr);\n\t\tEnableStartDoctypeDeclHandler (fEnable);\n\t\tEnableEndDoctypeDeclHandler (fEnable);\n\t}\n\npublic:\n\t// Parser error reporting methods\n\n\t// @cmember Get last error\n\n\tenum XML_Error GetErrorCode ()\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn XML_GetErrorCode (m_p);\n\t}\n\n\t// @cmember Get the current byte index\n\n\tlong GetCurrentByteIndex ()\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn XML_GetCurrentByteIndex (m_p);\n\t}\n\n\t// @cmember Get the current line number\n\n\tint GetCurrentLineNumber ()\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn XML_GetCurrentLineNumber (m_p);\n\t}\n\n\t// @cmember Get the current column number\n\n\tint GetCurrentColumnNumber ()\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn XML_GetCurrentColumnNumber (m_p);\n\t}\n\n\t// @cmember Get the current byte count\n\n\tint GetCurrentByteCount ()\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn XML_GetCurrentByteCount (m_p);\n\t}\n\n\t// @cmember Get the input context\n\n\tconst char *GetInputContext (int *pnOffset, int *pnSize)\n\t{\n\t\tassert (m_p != nullptr);\n\t\treturn XML_GetInputContext (m_p, pnOffset, pnSize);\n\t}\n\n\t// @cmember Get last error string\n\n\tconst XML_LChar *GetErrorString ()\n\t{\n\t\treturn XML_ErrorString (GetErrorCode ());\n\t}\n\n\t// @cmember Return the version string\n\n\tstatic const XML_LChar *GetExpatVersion ()\n\t{\n\t\treturn XML_ExpatVersion ();\n\t}\n\n\t// @cmember Get the version information\n\n\tstatic void GetExpatVersion (int *pnMajor, int *pnMinor, int *pnMicro)\n\t{\n\t\tXML_expat_version v = XML_ExpatVersionInfo ();\n\t\tif (pnMajor)\n\t\t{\n\t\t\t*pnMajor = v .major;\n\t\t}\n\t\tif (pnMinor)\n\t\t{\n\t\t\t*pnMinor = v .minor;\n\t\t}\n\t\tif (pnMicro)\n\t\t{\n\t\t\t*pnMicro = v .micro;\n\t\t}\n\t}\n\n\t// @cmember Get last error string\n\n\tstatic const XML_LChar *GetErrorString (enum XML_Error nError)\n\t{\n\t\treturn XML_ErrorString (nError);\n\t}\n\n\n\t// Public handler methods:\n\t// The template parameter should provide their own implementation for those handlers that they want\n\n\t// @cmember Start element handler\n\n\tvoid OnStartElement (const XML_Char *pszName, const XML_Char **papszAttrs)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember End element handler\n\n\tvoid OnEndElement (const XML_Char *pszName)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember Character data handler\n\n\tvoid OnCharacterData (const XML_Char *pszData, int nLength)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember Processing instruction handler\n\n\tvoid OnProcessingInstruction (const XML_Char *pszTarget,\n\t\tconst XML_Char *pszData)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember Comment handler\n\n\tvoid OnComment (const XML_Char *pszData)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember Start CDATA section handler\n\n\tvoid OnStartCdataSection ()\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember End CDATA section handler\n\n\tvoid OnEndCdataSection ()\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember Default handler\n\n\tvoid OnDefault (const XML_Char *pszData, int nLength)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember External entity ref handler\n\n\tbool OnExternalEntityRef (const XML_Char *pszContext,\n\t\tconst XML_Char *pszBase, const XML_Char *pszSystemID,\n\t\tconst XML_Char *pszPublicID)\n\t{\n\t\treturn false;\n\t}\n\n\t// @cmember Unknown encoding handler\n\n\tbool OnUnknownEncoding (const XML_Char *pszName, XML_Encoding *pInfo)\n\t{\n\t\treturn false;\n\t}\n\n\t// @cmember Start namespace declaration handler\n\n\tvoid OnStartNamespaceDecl (const XML_Char *pszPrefix,\n\t\tconst XML_Char *pszURI)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember End namespace declaration handler\n\n\tvoid OnEndNamespaceDecl (const XML_Char *pszPrefix)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember XML declaration handler\n\n\tvoid OnXmlDecl (const XML_Char *pszVersion, const XML_Char *pszEncoding,\n\t\tbool fStandalone)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember Start DOCTYPE declaration handler\n\n\tvoid OnStartDoctypeDecl (const XML_Char *pszDoctypeName,\n\t\tconst XML_Char *pszSysID, const XML_Char *pszPubID,\n\t\tbool fHasInternalSubset)\n\t{\n\t\treturn;\n\t}\n\n\t// @cmember End DOCTYPE declaration handler\n\n\tvoid OnEndDoctypeDecl ()\n\t{\n\t\treturn;\n\t}\n\n// @access Protected methods\nprotected:\n\n\t// @cmember Handle any post creation\n\n\tvoid OnPostCreate ()\n\t{\n\t}\n\n// @access Protected static methods\nprotected:\n\n\t// @cmember Start element handler wrapper\n\n\tstatic void __cdecl StartElementHandler (void *pUserData,\n\t\tconst XML_Char *pszName, const XML_Char **papszAttrs)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnStartElement (pszName, papszAttrs);\n\t}\n\n\t// @cmember End element handler wrapper\n\n\tstatic void __cdecl EndElementHandler (void *pUserData,\n\t\tconst XML_Char *pszName)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnEndElement (pszName);\n\t}\n\n\t// @cmember Character data handler wrapper\n\n\tstatic void __cdecl CharacterDataHandler (void *pUserData,\n\t\tconst XML_Char *pszData, int nLength)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnCharacterData (pszData, nLength);\n\t}\n\n\t// @cmember Processing instruction handler wrapper\n\n\tstatic void __cdecl ProcessingInstructionHandler (void *pUserData,\n\t\tconst XML_Char *pszTarget, const XML_Char *pszData)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnProcessingInstruction (pszTarget, pszData);\n\t}\n\n\t// @cmember Comment handler wrapper\n\n\tstatic void __cdecl CommentHandler (void *pUserData,\n\t\tconst XML_Char *pszData)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnComment (pszData);\n\t}\n\n\t// @cmember Start CDATA section wrapper\n\n\tstatic void __cdecl StartCdataSectionHandler (void *pUserData)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnStartCdataSection ();\n\t}\n\n\t// @cmember End CDATA section wrapper\n\n\tstatic void __cdecl EndCdataSectionHandler (void *pUserData)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnEndCdataSection ();\n\t}\n\n\t// @cmember Default wrapper\n\n\tstatic void __cdecl DefaultHandler (void *pUserData,\n\t\tconst XML_Char *pszData, int nLength)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnDefault (pszData, nLength);\n\t}\n\n\t// @cmember External entity ref wrapper\n\n\tstatic int __cdecl ExternalEntityRefHandler (void *pUserData,\n\t\tconst XML_Char *pszContext, const XML_Char *pszBase,\n\t\tconst XML_Char *pszSystemID, const XML_Char *pszPublicID)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\treturn pThis ->OnExternalEntityRef (pszContext,\n\t\t\tpszBase, pszSystemID, pszPublicID) ? 1 : 0;\n\t}\n\n\t// @cmember Unknown encoding wrapper\n\n\tstatic int __cdecl UnknownEncodingHandler (void * pUserData, const XML_Char * pszName, XML_Encoding * pInfo)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\treturn pThis ->OnUnknownEncoding (pszName, pInfo) ? 1 : 0;\n\t}\n\n\t// @cmember Start namespace decl wrapper\n\n\tstatic void __cdecl StartNamespaceDeclHandler (void * pUserData, const XML_Char * pszPrefix, const XML_Char * pszURI)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnStartNamespaceDecl (pszPrefix, pszURI);\n\t}\n\n\t// @cmember End namespace decl wrapper\n\n\tstatic void __cdecl EndNamespaceDeclHandler (void * pUserData, const XML_Char * pszPrefix)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnEndNamespaceDecl (pszPrefix);\n\t}\n\n\t// @cmember XML declaration wrapper\n\n\tstatic void __cdecl XmlDeclHandler (void *pUserData, const XML_Char *pszVersion, const XML_Char *pszEncoding, int nStandalone)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnXmlDecl (pszVersion, pszEncoding, nStandalone != 0);\n\t}\n\n\t// @cmember Start Doctype declaration wrapper\n\n\tstatic void __cdecl StartDoctypeDeclHandler (\n\t\tvoid *pUserData, const XML_Char *pszDoctypeName, const XML_Char *pszSysID,\n\t\tconst XML_Char *pszPubID, int nHasInternalSubset\n\t)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnStartDoctypeDecl (pszDoctypeName, pszSysID,\n\t\t\tpszPubID, nHasInternalSubset != 0);\n\t}\n\n\t// @cmember End Doctype declaration wrapper\n\n\tstatic void __cdecl EndDoctypeDeclHandler (void *pUserData)\n\t{\n\t\t_T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);\n\t\tpThis ->OnEndDoctypeDecl ();\n\t}\n\n\nprotected:\n\n\tXML_Parser m_p;\n\n\t/** Returns the value of the specified attribute, if found; nullptr otherwise */\n\tstatic const XML_Char * FindAttr(const XML_Char ** iAttrs, const XML_Char * iAttrToFind)\n\t{\n\t\tfor (const XML_Char ** Attr = iAttrs; *Attr != nullptr; Attr += 2)\n\t\t{\n\t\t\tif (strcmp(*Attr, iAttrToFind) == 0)\n\t\t\t{\n\t\t\t\treturn *(Attr + 1);\n\t\t\t}\n\t\t}  // for Attr - iAttrs[]\n\t\treturn nullptr;\n\t}\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/fmt.h",
    "content": "#pragma once\n\n#ifdef __clang__\n\t#pragma clang diagnostic push\n\t#pragma clang diagnostic ignored \"-Wsign-conversion\"\n\t#pragma clang diagnostic ignored \"-Wsigned-enum-bitfield\"\n#endif\n\n#include <fmt/format.h>\n#include <fmt/printf.h>\n\n#ifdef __clang__\n\t#pragma clang diagnostic pop\n#endif\n\n"
  },
  {
    "path": "src/main.cpp",
    "content": "\n#include \"Globals.h\"  // NOTE: MSVC stupidness requires this to be the same across all modules\n\n#include \"main.h\"\n#include \"BuildInfo.h\"\n#include \"Logger.h\"\n#include \"MemorySettingsRepository.h\"\n#include \"Root.h\"\n#include \"tclap/CmdLine.h\"\n\n#include \"OSSupport/ConsoleSignalHandler.h\"\n#include \"OSSupport/NetworkSingleton.h\"\n#include \"OSSupport/MiniDumpWriter.h\"\n#include \"OSSupport/SleepResolutionBooster.h\"\n#include \"OSSupport/StartAsService.h\"\n#include <tclap/SwitchArg.h>\n\n\n\n\n\nbool g_ShouldLogCommIn;\nbool g_ShouldLogCommOut;\nbool g_RunAsService;\n\nbool g_DetachedStdin;\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// ParseArguments - Read the startup arguments and store into a settings object\n\nstatic void ParseArguments(int argc, char ** argv, cMemorySettingsRepository & a_Settings)\n{\n\t// Parse the comand line args:\n\tTCLAP::CmdLine cmd(\"Cuberite\");\n\tTCLAP::ValueArg<int> slotsArg    (\"s\", \"max-players\",         \"Maximum number of slots for the server to use, overrides setting in setting.ini\", false, -1, \"number\", cmd);\n\tTCLAP::ValueArg<AString> confArg (\"c\", \"config-file\",         \"Config file to use\", false, \"settings.ini\", \"string\", cmd);\n\tTCLAP::MultiArg<int> portsArg    (\"p\", \"port\",                \"The port number the server should listen to\", false, \"port\", cmd);\n\tTCLAP::SwitchArg commLogArg      (\"\",  \"log-comm\",            \"Log server client communications to file\", cmd);\n\tTCLAP::SwitchArg commLogInArg    (\"\",  \"log-comm-in\",         \"Log inbound server client communications to file\", cmd);\n\tTCLAP::SwitchArg commLogOutArg   (\"\",  \"log-comm-out\",        \"Log outbound server client communications to file\", cmd);\n\tTCLAP::SwitchArg crashDumpFull   (\"\",  \"crash-dump-full\",     \"Crashdumps created by the server will contain full server memory\", cmd);\n\tTCLAP::SwitchArg crashDumpGlobals(\"\",  \"crash-dump-globals\",  \"Crashdumps created by the server will contain the global variables' values\", cmd);\n\tTCLAP::SwitchArg noBufArg        (\"\",  \"no-output-buffering\", \"Disable output buffering\", cmd);\n\tTCLAP::SwitchArg noFileLogArg    (\"\",  \"no-log-file\",         \"Disable logging to file\", cmd);\n\tTCLAP::SwitchArg runAsServiceArg (\"d\", \"service\",             \"Run as a service on Windows, or daemon on UNIX like systems\", cmd);\n\tTCLAP::SwitchArg runDetached (\"\", \"detached\", \"Run with detached stdin (useful for container/docker)\", cmd);\n\tcmd.parse(argc, argv);\n\n\t// Copy the parsed args' values into a settings repository:\n\tif (runDetached.getValue())\n\t{\n\t\tg_DetachedStdin = true;\n\t}\n\tif (confArg.isSet())\n\t{\n\t\tAString conf_file = confArg.getValue();\n\t\ta_Settings.AddValue(\"Server\", \"ConfigFile\", conf_file);\n\t}\n\tif (slotsArg.isSet())\n\t{\n\t\tint slots = slotsArg.getValue();\n\t\ta_Settings.AddValue(\"Server\", \"MaxPlayers\", static_cast<Int64>(slots));\n\t}\n\tif (portsArg.isSet())\n\t{\n\t\tfor (auto port: portsArg.getValue())\n\t\t{\n\t\t\ta_Settings.AddValue(\"Server\", \"Ports\", std::to_string(port));\n\t\t}\n\t}\n\tif (noFileLogArg.getValue())\n\t{\n\t\ta_Settings.AddValue(\"Server\", \"DisableLogFile\", true);\n\t}\n\tif (commLogArg.getValue())\n\t{\n\t\tg_ShouldLogCommIn = true;\n\t\tg_ShouldLogCommOut = true;\n\t}\n\telse\n\t{\n\t\tg_ShouldLogCommIn = commLogInArg.getValue();\n\t\tg_ShouldLogCommOut = commLogOutArg.getValue();\n\t}\n\tif (noBufArg.getValue())\n\t{\n\t\tsetvbuf(stdout, nullptr, _IONBF, 0);\n\t}\n\ta_Settings.SetReadOnly();\n\n\tif (runAsServiceArg.getValue())\n\t{\n\t\tg_RunAsService = true;\n\t}\n\n\t// Apply the CrashDump flags for platforms that support them:\n\tif (crashDumpGlobals.getValue())\n\t{\n\t\tMiniDumpWriter::AddDumpFlags(MiniDumpFlags::WithDataSegments);\n\t}\n\tif (crashDumpFull.getValue())\n\t{\n\t\tMiniDumpWriter::AddDumpFlags(MiniDumpFlags::WithFullMemory);\n\t}\n}\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// UniversalMain - Main startup logic for both standard running and as a service\n\nstatic int UniversalMain(int argc, char * argv[], const bool a_RunningAsService)\n{\n\tconst struct MiniDumpWriterRAII\n\t{\n\t\tMiniDumpWriterRAII()\n\t\t{\n\t\t\t// Registers a last chance exception handler to write a minidump on crash:\n\t\t\tMiniDumpWriter::Register();\n\t\t}\n\n\t\t~MiniDumpWriterRAII()\n\t\t{\n\t\t\tMiniDumpWriter::Unregister();\n\t\t}\n\t} MiniDumpWriter;\n\n\tconst struct SleepResolutionBoosterRAII\n\t{\n\t\tSleepResolutionBoosterRAII()\n\t\t{\n\t\t\t// Boost timer resolution to keep TPS high:\n\t\t\tSleepResolutionBooster::Register();\n\t\t}\n\n\t\t~SleepResolutionBoosterRAII()\n\t\t{\n\t\t\tSleepResolutionBooster::Unregister();\n\t\t}\n\t} SleepResolutionBooster;\n\n\t// Register signal handlers, enabling graceful shutdown from the terminal:\n\tConsoleSignalHandler::Register();\n\n\t// Initialize logging subsystem:\n\tcLogger::InitiateMultithreading();\n\n\ttry\n\t{\n\t\tcMemorySettingsRepository Settings;\n\t\tParseArguments(argc, argv, Settings);  // Make sure g_RunAsService is set correctly before checking its value.\n\n\t\t// Attempt to run as a service:\n\t\tif (g_RunAsService && !a_RunningAsService)\n\t\t{\n\t\t\t// This will either fork or call UniversalMain again:\n\t\t\tif (StartAsService::MakeIntoService<&UniversalMain>())\n\t\t\t{\n\t\t\t\treturn EXIT_SUCCESS;\n\t\t\t}\n\t\t}\n\n\t\twhile (true)\n\t\t{\n\t\t\tconst struct NetworkRAII\n\t\t\t{\n\t\t\t\tNetworkRAII()\n\t\t\t\t{\n\t\t\t\t\t// Initialize LibEvent:\n\t\t\t\t\tcNetworkSingleton::Get().Initialise();\n\t\t\t\t}\n\n\t\t\t\t~NetworkRAII()\n\t\t\t\t{\n\t\t\t\t\t// Shutdown all of LibEvent:\n\t\t\t\t\tcNetworkSingleton::Get().Terminate();\n\t\t\t\t}\n\t\t\t} LibEvent;\n\n\t\t\tcRoot Root;\n\t\t\tif (!Root.Run(Settings))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn EXIT_SUCCESS;\n\t}\n\tcatch (const fmt::format_error & Oops)\n\t{\n\t\tstd::cerr << \"Formatting exception: \" << Oops.what() << '\\n';\n\t}\n\tcatch (const TCLAP::ArgException & Oops)\n\t{\n\t\tstd::cerr << fmt::sprintf(\"Error reading command line {} for argument {}\\n\", Oops.error(), Oops.argId());\n\t}\n\tcatch (const std::exception & Oops)\n\t{\n\t\tstd::cerr << \"Standard exception: \" << Oops.what() << '\\n';\n\t}\n\tcatch (...)\n\t{\n\t\tstd::cerr << \"Unknown exception!\\n\";\n\t}\n\n\treturn EXIT_FAILURE;\n}\n\n\n\n\n\nint main(int argc, char ** argv)\n{\n#if !defined(NDEBUG) && defined(_MSC_VER)\n\t_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);\n\n\t// _X: The simple built-in CRT leak finder - simply break when allocating the Nth block ({N} is listed in the leak output)\n\t// Only useful when the leak is in the same sequence all the time\n\t// _CrtSetBreakAlloc(85950);\n\n#endif  // !NDEBUG && _MSC_VER\n\n\treturn UniversalMain(argc, argv, false);\n}\n"
  },
  {
    "path": "src/main.h",
    "content": "#pragma once\n\n/** If set to true, the protocols will log each player's incoming (C->S) communication to a per-connection logfile. */\nextern bool g_ShouldLogCommIn;\n\n/** If set to true, the protocols will log each player's outgoing (S->C) communication to a per-connection logfile. */\nextern bool g_ShouldLogCommOut;\n\n/** If set to true, binary will attempt to run as a service. */\nextern bool g_RunAsService;\n\n/** If set to true, binary runs in foreground without cstding handles */\nextern bool g_DetachedStdin;\n"
  },
  {
    "path": "src/mbedTLS++/AesCfb128Decryptor.cpp",
    "content": "\n// AesCfb128Decryptor.cpp\n\n// Implements the cAesCfb128Decryptor class decrypting data using AES CFB-128\n\n#include \"Globals.h\"\n#include \"AesCfb128Decryptor.h\"\n\n\n\n\n\ncAesCfb128Decryptor::cAesCfb128Decryptor(void) :\n\tm_IsValid(false)\n{\n#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)\n\tif (!CryptAcquireContext(&m_Aes, nullptr, nullptr, PROV_RSA_AES, CRYPT_VERIFYCONTEXT))\n\t{\n\t\tthrow std::system_error(GetLastError(), std::system_category());\n\t}\n#else\n\tmbedtls_aes_init(&m_Aes);\n#endif\n}\n\n\n\n\n\ncAesCfb128Decryptor::~cAesCfb128Decryptor()\n{\n\t// Clear the leftover in-memory data, so that they can't be accessed by a backdoor:\n#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)\n\tCryptReleaseContext(m_Aes, 0);\n#else\n\tmbedtls_aes_free(&m_Aes);\n#endif\n}\n\n\n\n\n\nvoid cAesCfb128Decryptor::Init(const Byte a_Key[16], const Byte a_IV[16])\n{\n\tASSERT(!IsValid());  // Cannot Init twice\n\n#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)\n\tstruct Key\n\t{\n\t\tPUBLICKEYSTRUC Header;\n\t\tDWORD Length;\n\t\tByte Key[16];\n\t} Key;\n\n\tconst DWORD Mode = CRYPT_MODE_CFB;\n\tKey.Header = { PLAINTEXTKEYBLOB, CUR_BLOB_VERSION, 0, CALG_AES_128 };\n\tKey.Length = 16;\n\tstd::copy_n(a_Key, 16, Key.Key);\n\n\tCryptImportKey(m_Aes, reinterpret_cast<const BYTE *>(&Key), sizeof(Key), 0, 0, &m_Key);\n\tCryptSetKeyParam(m_Key, KP_MODE, reinterpret_cast<const BYTE *>(&Mode), 0);\n\tCryptSetKeyParam(m_Key, KP_IV, a_IV, 0);\n#else\n\tstd::copy_n(a_IV, 16, m_IV);\n\tmbedtls_aes_setkey_enc(&m_Aes, a_Key, 128);\n#endif\n\n\tm_IsValid = true;\n}\n\n\n\n\n\nvoid cAesCfb128Decryptor::ProcessData(std::byte * const a_EncryptedIn, const size_t a_Length)\n{\n\tASSERT(IsValid());  // Must Init() first\n\n#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)\n\tASSERT(a_Length <= std::numeric_limits<DWORD>::max());\n\n\tDWORD Length = static_cast<DWORD>(a_Length);\n\tCryptDecrypt(m_Key, 0, FALSE, 0, reinterpret_cast<BYTE *>(a_EncryptedIn), &Length);\n#else\n\tmbedtls_aes_crypt_cfb8(&m_Aes, MBEDTLS_AES_DECRYPT, a_Length, m_IV, reinterpret_cast<unsigned char *>(a_EncryptedIn), reinterpret_cast<unsigned char *>(a_EncryptedIn));\n#endif\n}\n"
  },
  {
    "path": "src/mbedTLS++/AesCfb128Decryptor.h",
    "content": "\n// AesCfb128Decryptor.h\n\n// Declares the cAesCfb128Decryptor class decrypting data using AES CFB-128\n\n\n\n\n\n#pragma once\n\n#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)\n#include <wincrypt.h>\n#else\n#include \"mbedtls/aes.h\"\n#endif\n\n\n\n\n\n/** Decrypts data using the AES / CFB 128 algorithm */\nclass cAesCfb128Decryptor\n{\npublic:\n\n\tcAesCfb128Decryptor(void);\n\t~cAesCfb128Decryptor();\n\n\t/** Initializes the decryptor with the specified Key / IV */\n\tvoid Init(const Byte a_Key[16], const Byte a_IV[16]);\n\n\t/** Decrypts a_Length bytes of the encrypted data in-place; produces a_Length output bytes */\n\tvoid ProcessData(std::byte * a_EncryptedIn, size_t a_Length);\n\n\t/** Returns true if the object has been initialized with the Key / IV */\n\tbool IsValid(void) const { return m_IsValid; }\n\nprotected:\n\n#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)\n\tHCRYPTPROV m_Aes;\n\tHCRYPTKEY m_Key;\n#else\n\tmbedtls_aes_context m_Aes;\n#endif\n\n\t/** The InitialVector, used by the CFB mode decryption */\n\tByte m_IV[16];\n\n\t/** Indicates whether the object has been initialized with the Key / IV */\n\tbool m_IsValid;\n} ;\n"
  },
  {
    "path": "src/mbedTLS++/AesCfb128Encryptor.cpp",
    "content": "\n// AesCfb128Encryptor.cpp\n\n// Implements the cAesCfb128Encryptor class encrypting data using AES CFB-128\n\n#include \"Globals.h\"\n#include \"AesCfb128Encryptor.h\"\n\n\n\n\n\ncAesCfb128Encryptor::cAesCfb128Encryptor(void):\n\tm_IsValid(false)\n{\n\tmbedtls_aes_init(&m_Aes);\n}\n\n\n\n\n\ncAesCfb128Encryptor::~cAesCfb128Encryptor()\n{\n\t// Clear the leftover in-memory data, so that they can't be accessed by a backdoor\n\tmbedtls_aes_free(&m_Aes);\n}\n\n\n\n\n\nvoid cAesCfb128Encryptor::Init(const Byte a_Key[16], const Byte a_IV[16])\n{\n\tASSERT(!IsValid());  // Cannot Init twice\n\n\tmemcpy(m_IV, a_IV, 16);\n\tmbedtls_aes_setkey_enc(&m_Aes, a_Key, 128);\n\tm_IsValid = true;\n}\n\n\n\n\n\nvoid cAesCfb128Encryptor::ProcessData(std::byte * const a_PlainIn, const size_t a_Length)\n{\n\tASSERT(IsValid());  // Must Init() first\n\tmbedtls_aes_crypt_cfb8(&m_Aes, MBEDTLS_AES_ENCRYPT, a_Length, m_IV, reinterpret_cast<const unsigned char *>(a_PlainIn), reinterpret_cast<unsigned char *>(a_PlainIn));\n}\n"
  },
  {
    "path": "src/mbedTLS++/AesCfb128Encryptor.h",
    "content": "\n// AesCfb128Encryptor.h\n\n// Declares the cAesCfb128Encryptor class encrypting data using AES CFB-128\n\n\n\n\n\n#pragma once\n\n#include \"mbedtls/aes.h\"\n\n\n\n\n\n/** Encrypts data using the AES / CFB (128) algorithm */\nclass cAesCfb128Encryptor\n{\npublic:\n\n\tcAesCfb128Encryptor(void);\n\t~cAesCfb128Encryptor();\n\n\t/** Initializes the decryptor with the specified Key / IV */\n\tvoid Init(const Byte a_Key[16], const Byte a_IV[16]);\n\n\t/** Encrypts a_Length bytes of the plain data in-place; produces a_Length output bytes */\n\tvoid ProcessData(std::byte * a_PlainIn, size_t a_Length);\n\n\t/** Returns true if the object has been initialized with the Key / IV */\n\tbool IsValid(void) const { return m_IsValid; }\n\nprotected:\n\n\tmbedtls_aes_context m_Aes;\n\n\t/** The InitialVector, used by the CFB mode encryption */\n\tByte m_IV[16];\n\n\t/** Indicates whether the object has been initialized with the Key / IV */\n\tbool m_IsValid;\n} ;\n"
  },
  {
    "path": "src/mbedTLS++/BlockingSslClientSocket.cpp",
    "content": "\n// BlockingSslClientSocket.cpp\n\n// Implements the cBlockingSslClientSocket class representing a blocking TCP socket with client SSL encryption over it\n\n#include \"Globals.h\"\n#include \"BlockingSslClientSocket.h\"\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBlockingSslClientSocketConnectCallbacks:\n\nclass cBlockingSslClientSocketConnectCallbacks:\n\tpublic cNetwork::cConnectCallbacks\n{\n\t/** The socket object that is using this instance of the callbacks. */\n\tcBlockingSslClientSocket & m_Socket;\n\n\tvirtual void OnConnected(cTCPLink & a_Link) override\n\t{\n\t\tm_Socket.OnConnected();\n\t}\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tm_Socket.OnConnectError(a_ErrorMsg);\n\t}\n\npublic:\n\tcBlockingSslClientSocketConnectCallbacks(cBlockingSslClientSocket & a_Socket):\n\t\tm_Socket(a_Socket)\n\t{\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBlockingSslClientSocketLinkCallbacks:\n\nclass cBlockingSslClientSocketLinkCallbacks:\n\tpublic cTCPLink::cCallbacks\n{\n\tcBlockingSslClientSocket & m_Socket;\n\n\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) override\n\t{\n\t\tm_Socket.SetLink(a_Link);\n\t}\n\n\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Length) override\n\t{\n\t\tm_Socket.OnReceivedData(a_Data, a_Length);\n\t}\n\n\n\tvirtual void OnRemoteClosed(void) override\n\t{\n\t\tm_Socket.OnDisconnected();\n\t}\n\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tm_Socket.OnDisconnected();\n\t}\n\npublic:\n\n\tcBlockingSslClientSocketLinkCallbacks(cBlockingSslClientSocket & a_Socket):\n\t\tm_Socket(a_Socket)\n\t{\n\t}\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cBlockingSslClientSocket:\n\ncBlockingSslClientSocket::cBlockingSslClientSocket(void) :\n\tm_Ssl(*this),\n\tm_IsConnected(false)\n{\n\t// Nothing needed yet\n}\n\n\n\n\n\nbool cBlockingSslClientSocket::Connect(const AString & a_ServerName, UInt16 a_Port)\n{\n\t// If already connected, report an error:\n\tif (m_IsConnected)\n\t{\n\t\t// TODO: Handle this better - if connected to the same server and port, and the socket is alive, return success\n\t\tm_LastErrorText = \"Already connected\";\n\t\treturn false;\n\t}\n\n\t// Connect the underlying socket:\n\tm_ServerName = a_ServerName;\n\tif (!cNetwork::Connect(a_ServerName, a_Port,\n\t\tstd::make_shared<cBlockingSslClientSocketConnectCallbacks>(*this),\n\t\tstd::make_shared<cBlockingSslClientSocketLinkCallbacks>(*this))\n\t)\n\t{\n\t\treturn false;\n\t}\n\n\t// Wait for the connection to succeed or fail:\n\tm_Event.Wait();\n\tif (!m_IsConnected)\n\t{\n\t\treturn false;\n\t}\n\n\t// Initialize the SSL:\n\tint ret = 0;\n\tif (m_Config != nullptr)\n\t{\n\t\tret = m_Ssl.Initialize(m_Config);\n\t}\n\telse\n\t{\n\t\tret = m_Ssl.Initialize(true);\n\t}\n\n\tif (ret != 0)\n\t{\n\t\tm_LastErrorText = fmt::format(FMT_STRING(\"SSL initialization failed: -0x{:x}\"), -ret);\n\t\treturn false;\n\t}\n\n\t// If we have been assigned a trusted CA root cert store, push it into the SSL context:\n\tif (!m_ExpectedPeerName.empty())\n\t{\n\t\tm_Ssl.SetExpectedPeerName(m_ExpectedPeerName);\n\t}\n\n\tret = m_Ssl.Handshake();\n\tif (ret != 0)\n\t{\n\t\tm_LastErrorText = fmt::format(FMT_STRING(\"SSL handshake failed: -0x{:x}\"), -ret);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nvoid cBlockingSslClientSocket::SetExpectedPeerName(AString a_ExpectedPeerName)\n{\n\tASSERT(!m_IsConnected);  // Must be called before connect\n\n\t// Warn if used multiple times, but don't signal an error:\n\tif (!m_ExpectedPeerName.empty())\n\t{\n\t\tLOGWARNING(\n\t\t\t\"SSL: Trying to set multiple expected peer names, only the last one will be used. %s overwriting the previous %s\",\n\t\t\ta_ExpectedPeerName, m_ExpectedPeerName\n\t\t);\n\t}\n\n\tm_ExpectedPeerName = std::move(a_ExpectedPeerName);\n}\n\n\n\n\n\nvoid cBlockingSslClientSocket::SetSslConfig(std::shared_ptr<const cSslConfig> a_Config)\n{\n\tASSERT(!m_IsConnected);  // Must be called before connect\n\n\t// Warn if used multiple times, but don't signal an error:\n\tif (m_Config != nullptr)\n\t{\n\t\tLOGWARNING(\"SSL: Trying to set multiple configurations, only the last one will be used.\");\n\t}\n\n\tm_Config = std::move(a_Config);\n}\n\n\n\n\n\nbool cBlockingSslClientSocket::Send(const void * a_Data, size_t a_NumBytes)\n{\n\tif (!m_IsConnected)\n\t{\n\t\tm_LastErrorText = \"Socket is closed\";\n\t\treturn false;\n\t}\n\n\t// Keep sending the data until all of it is sent:\n\tconst char * Data = static_cast<const char *>(a_Data);\n\tsize_t NumBytes = a_NumBytes;\n\tfor (;;)\n\t{\n\t\tint res = m_Ssl.WritePlain(Data, a_NumBytes);\n\t\tif (res < 0)\n\t\t{\n\t\t\tASSERT(res != MBEDTLS_ERR_SSL_WANT_READ);   // This should never happen with callback-based SSL\n\t\t\tASSERT(res != MBEDTLS_ERR_SSL_WANT_WRITE);  // This should never happen with callback-based SSL\n\t\t\tm_LastErrorText = fmt::format(FMT_STRING(\"Data cannot be written to SSL context: -0x{:x}\"), -res);\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tData += res;\n\t\t\tNumBytes -= static_cast<size_t>(res);\n\t\t\tif (NumBytes == 0)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nint cBlockingSslClientSocket::Receive(void * a_Data, size_t a_MaxBytes)\n{\n\t// Even if m_IsConnected is false (socket disconnected), the SSL context may have more data in the queue\n\tint res = m_Ssl.ReadPlain(a_Data, a_MaxBytes);\n\tif (res < 0)\n\t{\n\t\tm_LastErrorText = fmt::format(FMT_STRING(\"Data cannot be read from SSL context: -0x{:x}\"), -res);\n\t}\n\treturn res;\n}\n\n\n\n\n\nvoid cBlockingSslClientSocket::Disconnect()\n{\n\t// Ignore if not connected\n\tif (!m_IsConnected)\n\t{\n\t\treturn;\n\t}\n\n\tm_Ssl.NotifyClose();\n\tm_IsConnected = false;\n\n\t// Grab a copy of the socket so that we know it doesn't change under our hands:\n\tauto socket = m_Socket;\n\tif (socket != nullptr)\n\t{\n\t\tsocket->Close();\n\t}\n\n\tm_Socket.reset();\n}\n\n\n\n\n\nint cBlockingSslClientSocket::ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes)\n{\n\t// Wait for any incoming data, if there is none:\n\tcCSLock Lock(m_CSIncomingData);\n\twhile (m_IsConnected && m_IncomingData.empty())\n\t{\n\t\tcCSUnlock Unlock(Lock);\n\t\tm_Event.Wait();\n\t}\n\n\t// If we got disconnected, report an error after processing all data:\n\tif (!m_IsConnected && m_IncomingData.empty())\n\t{\n\t\treturn MBEDTLS_ERR_NET_RECV_FAILED;\n\t}\n\n\t// Copy the data from the incoming buffer into the specified space:\n\tsize_t NumToCopy = std::min(a_NumBytes, m_IncomingData.size());\n\tmemcpy(a_Buffer, m_IncomingData.data(), NumToCopy);\n\tm_IncomingData.erase(0, NumToCopy);\n\treturn static_cast<int>(NumToCopy);\n}\n\n\n\n\n\nint cBlockingSslClientSocket::SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes)\n{\n\tcTCPLinkPtr Socket(m_Socket);  // Make a copy so that multiple threads don't race on deleting the socket.\n\tif (Socket == nullptr)\n\t{\n\t\treturn MBEDTLS_ERR_NET_SEND_FAILED;\n\t}\n\tif (!Socket->Send(a_Buffer, a_NumBytes))\n\t{\n\t\t// mbedTLS's net routines distinguish between connection reset and general failure, we don't need to\n\t\treturn MBEDTLS_ERR_NET_SEND_FAILED;\n\t}\n\treturn static_cast<int>(a_NumBytes);\n}\n\n\n\n\n\nvoid cBlockingSslClientSocket::OnConnected(void)\n{\n\tm_IsConnected = true;\n\tm_Event.Set();\n}\n\n\n\n\n\nvoid cBlockingSslClientSocket::OnConnectError(const AString & a_ErrorMsg)\n{\n\tLOG(\"Cannot connect to %s: \\\"%s\\\"\", m_ServerName.c_str(), a_ErrorMsg.c_str());\n\tm_Event.Set();\n}\n\n\n\n\n\nvoid cBlockingSslClientSocket::OnReceivedData(const char * a_Data, size_t a_Size)\n{\n\t{\n\t\tcCSLock Lock(m_CSIncomingData);\n\t\tm_IncomingData.append(a_Data, a_Size);\n\t}\n\tm_Event.Set();\n}\n\n\n\n\n\nvoid cBlockingSslClientSocket::SetLink(cTCPLinkPtr a_Link)\n{\n\tm_Socket = std::move(a_Link);\n}\n\n\n\n\n\nvoid cBlockingSslClientSocket::OnDisconnected(void)\n{\n\tm_IsConnected = false;\n\tm_Socket.reset();\n\tm_Event.Set();\n}\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/BlockingSslClientSocket.h",
    "content": "\n// BlockingSslClientSocket.h\n\n// Declares the cBlockingSslClientSocket class representing a blocking TCP socket with client SSL encryption over it\n\n\n\n\n\n#pragma once\n\n#include \"../OSSupport/Network.h\"\n#include \"CallbackSslContext.h\"\n\n\n\n\n\nclass cBlockingSslClientSocket :\n\tprotected cCallbackSslContext::cDataCallbacks\n{\npublic:\n\tcBlockingSslClientSocket(void);\n\n\tvirtual ~cBlockingSslClientSocket(void) override\n\t{\n\t\tDisconnect();\n\t}\n\n\t/** Connects to the specified server and performs SSL handshake.\n\tReturns true if successful, false on failure. Sets internal error text on failure. */\n\tbool Connect(const AString & a_ServerName, UInt16 a_Port);\n\n\t/** Sends the specified data over the connection.\n\tReturns true if successful, false on failure. Sets the internal error text on failure. */\n\tbool Send(const void * a_Data, size_t a_NumBytes);\n\n\t/** Receives data from the connection.\n\tBlocks until there is any data available, then returns as much as possible.\n\tReturns the number of bytes actually received, negative number on failure.\n\tSets the internal error text on failure. */\n\tint Receive(void * a_Data, size_t a_MaxBytes);\n\n\t/** Disconnects the connection gracefully, if possible.\n\tNote that this also frees the internal SSL context, so all the certificates etc. are lost. */\n\tvoid Disconnect(void);\n\n\t/** Sets the Expected peer name.\n\tNeeds to be used before calling Connect().\n\t\\param a_ExpectedPeerName Name that we expect to receive in the SSL peer's cert; verification will fail if\n\tthe presented name is different (possible MITM). */\n\tvoid SetExpectedPeerName(AString a_ExpectedPeerName);\n\n\t/** Set the config to be used by the SSL context.\n\tConfig must not be modified after calling connect. */\n\tvoid SetSslConfig(std::shared_ptr<const cSslConfig> a_Config);\n\n\t/** Returns the text of the last error that has occurred in this instance. */\n\tconst AString & GetLastErrorText(void) const { return m_LastErrorText; }\n\nprotected:\n\tfriend class cBlockingSslClientSocketConnectCallbacks;\n\tfriend class cBlockingSslClientSocketLinkCallbacks;\n\n\t/** The SSL context used for the socket */\n\tcCallbackSslContext m_Ssl;\n\n\t/** The underlying socket to the SSL server */\n\tcTCPLinkPtr m_Socket;\n\n\t/** The object used to signal state changes in the socket (the cause of the blocking). */\n\tcEvent m_Event;\n\n\t/** The configuration to be used by the SSL context. Set by SetSslConfig(). */\n\tstd::shared_ptr<const cSslConfig> m_Config;\n\n\t/** The expected SSL peer's name, if we are to verify the cert strictly. Set by SetExpectedPeerName(). */\n\tAString m_ExpectedPeerName;\n\n\t/** The hostname to which the socket is connecting (stored for error reporting). */\n\tAString m_ServerName;\n\n\t/** Text of the last error that has occurred. */\n\tAString m_LastErrorText;\n\n\t/** Set to true if the connection established successfully. */\n\tstd::atomic<bool> m_IsConnected;\n\n\t/** Protects m_IncomingData against multithreaded access. */\n\tcCriticalSection m_CSIncomingData;\n\n\t/** Buffer for the data incoming on the network socket.\n\tProtected by m_CSIncomingData. */\n\tAString m_IncomingData;\n\n\n\t/** Called when the connection is established successfully. */\n\tvoid OnConnected(void);\n\n\t/** Called when an error occurs while connecting the socket. */\n\tvoid OnConnectError(const AString & a_ErrorMsg);\n\n\t/** Called when there's incoming data from the socket. */\n\tvoid OnReceivedData(const char * a_Data, size_t a_Size);\n\n\t/** Called when the link for the connection is created. */\n\tvoid SetLink(cTCPLinkPtr a_Link);\n\n\t/** Called when the link is disconnected, either gracefully or by an error. */\n\tvoid OnDisconnected(void);\n\n\t// cCallbackSslContext::cDataCallbacks overrides:\n\tvirtual int ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes) override;\n\tvirtual int SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/BufferedSslContext.cpp",
    "content": "\n// BufferedSslContext.cpp\n\n// Implements the cBufferedSslContext class representing a SSL context with the SSL peer data backed by a cByteBuffer\n\n#include \"Globals.h\"\n#include \"BufferedSslContext.h\"\n\n\n\n\n\ncBufferedSslContext::cBufferedSslContext(size_t a_BufferSize):\n\tm_OutgoingData(a_BufferSize),\n\tm_IncomingData(a_BufferSize)\n{\n}\n\n\n\n\n\nsize_t cBufferedSslContext::WriteIncoming(const void * a_Data, size_t a_NumBytes)\n{\n\tsize_t NumBytes = std::min(m_IncomingData.GetFreeSpace(), a_NumBytes);\n\tif (NumBytes > 0)\n\t{\n\t\tm_IncomingData.Write(a_Data, NumBytes);\n\t\treturn NumBytes;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nsize_t cBufferedSslContext::ReadOutgoing(void * a_Data, size_t a_DataMaxSize)\n{\n\tsize_t NumBytes = std::min(m_OutgoingData.GetReadableSpace(), a_DataMaxSize);\n\tif (NumBytes > 0)\n\t{\n\t\tm_OutgoingData.ReadBuf(a_Data, NumBytes);\n\t\tm_OutgoingData.CommitRead();\n\t\treturn NumBytes;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint cBufferedSslContext::ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes)\n{\n\t// Called when mbedTLS wants to read encrypted data from the SSL peer\n\t// Read the data from the buffer inside this object, where the owner has stored them using WriteIncoming():\n\tsize_t NumBytes = std::min(a_NumBytes, m_IncomingData.GetReadableSpace());\n\tif (NumBytes == 0)\n\t{\n\t\treturn MBEDTLS_ERR_SSL_WANT_READ;\n\t}\n\tif (!m_IncomingData.ReadBuf(a_Buffer, NumBytes))\n\t{\n\t\tm_IncomingData.ResetRead();\n\t\treturn MBEDTLS_ERR_NET_RECV_FAILED;\n\t}\n\tm_IncomingData.CommitRead();\n\treturn static_cast<int>(NumBytes);\n}\n\n\n\n\n\nint cBufferedSslContext::SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes)\n{\n\t// Called when mbedTLS wants to write encrypted data to the SSL peer\n\t// Write the data into the buffer inside this object, where the owner can later read them using ReadOutgoing():\n\tif (!m_OutgoingData.CanWriteBytes(a_NumBytes))\n\t{\n\t\treturn MBEDTLS_ERR_SSL_WANT_WRITE;\n\t}\n\tif (!m_OutgoingData.Write(reinterpret_cast<const char *>(a_Buffer), a_NumBytes))\n\t{\n\t\treturn MBEDTLS_ERR_NET_SEND_FAILED;\n\t}\n\treturn static_cast<int>(a_NumBytes);\n}\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/BufferedSslContext.h",
    "content": "\n// BufferedSslContext.h\n\n// Declares the cBufferedSslContext class representing a SSL context with the SSL peer data backed by a cByteBuffer\n\n\n\n\n\n#pragma once\n\n#include \"SslContext.h\"\n#include \"ErrorCodes.h\"\n\n\n\n\n\nclass cBufferedSslContext:\n\tpublic cSslContext\n{\n\tusing Super = cSslContext;\n\npublic:\n\n\t/** Creates a new context with the buffers of specified size for the encrypted / decrypted data. */\n\tcBufferedSslContext(size_t a_BufferSize = 64000);\n\n\t/** Stores the specified data in the \"incoming\" buffer, to be process by the SSL decryptor.\n\tThis is the data received from the SSL peer.\n\tReturns the number of bytes actually stored. If 0 is returned, owner should check the error state. */\n\tsize_t WriteIncoming(const void * a_Data, size_t a_NumBytes);\n\n\t/** Retrieves data from the \"outgoing\" buffer, after being processed by the SSL encryptor.\n\tThis is the data to be sent to the SSL peer.\n\tReturns the number of bytes actually retrieved. */\n\tsize_t ReadOutgoing(void * a_Data, size_t a_DataMaxSize);\n\nprotected:\n\t/** Buffer for the data that has been encrypted into the SSL stream and should be sent out. */\n\tcByteBuffer m_OutgoingData;\n\n\t/** Buffer for the data that has come in and needs to be decrypted from the SSL stream. */\n\tcByteBuffer m_IncomingData;\n\n\n\t// cSslContext overrides:\n\tvirtual int ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes) override;\n\tvirtual int SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes) override;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/CMakeLists.txt",
    "content": "target_sources(\n\t${CMAKE_PROJECT_NAME} PRIVATE\n\n\tAesCfb128Decryptor.cpp\n\tAesCfb128Encryptor.cpp\n\tBlockingSslClientSocket.cpp\n\tBufferedSslContext.cpp\n\tCallbackSslContext.cpp\n\tCtrDrbgContext.cpp\n\tCryptoKey.cpp\n\tEntropyContext.cpp\n\tRsaPrivateKey.cpp\n\tSha1Checksum.cpp\n\tSslConfig.cpp\n\tSslContext.cpp\n\tX509Cert.cpp\n\n\tAesCfb128Decryptor.h\n\tAesCfb128Encryptor.h\n\tBlockingSslClientSocket.h\n\tBufferedSslContext.h\n\tCallbackSslContext.h\n\tCtrDrbgContext.h\n\tCryptoKey.h\n\tEntropyContext.h\n\tErrorCodes.h\n\tRsaPrivateKey.h\n\tSslConfig.h\n\tSslContext.h\n\tSha1Checksum.h\n\tX509Cert.h\n)\n"
  },
  {
    "path": "src/mbedTLS++/CallbackSslContext.cpp",
    "content": "\n// CallbackSslContext.cpp\n\n// Declares the cCallbackSslContext class representing a SSL context wrapper that uses callbacks to read and write SSL peer data\n\n#include \"Globals.h\"\n#include \"CallbackSslContext.h\"\n\n\n\n\n\ncCallbackSslContext::cCallbackSslContext(void) :\n\tm_Callbacks(nullptr)\n{\n\t// Nothing needed, but the constructor needs to exist so\n}\n\n\n\n\n\ncCallbackSslContext::cCallbackSslContext(cCallbackSslContext::cDataCallbacks & a_Callbacks) :\n\tm_Callbacks(&a_Callbacks)\n{\n}\n\n\n\n\n\nint cCallbackSslContext::ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes)\n{\n\tif (m_Callbacks == nullptr)\n\t{\n\t\tLOGWARNING(\"SSL: Trying to receive data with no callbacks, aborting.\");\n\t\treturn MBEDTLS_ERR_NET_RECV_FAILED;\n\t}\n\treturn m_Callbacks->ReceiveEncrypted(a_Buffer, a_NumBytes);\n}\n\n\n\n\n\nint cCallbackSslContext::SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes)\n{\n\tif (m_Callbacks == nullptr)\n\t{\n\t\tLOGWARNING(\"SSL: Trying to send data with no callbacks, aborting.\");\n\t\treturn MBEDTLS_ERR_NET_SEND_FAILED;\n\t}\n\treturn m_Callbacks->SendEncrypted(a_Buffer, a_NumBytes);\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/CallbackSslContext.h",
    "content": "\n// CallbackSslContext.h\n\n// Declares the cCallbackSslContext class representing a SSL context wrapper that uses callbacks to read and write SSL peer data\n\n\n\n\n\n#pragma once\n\n#include \"SslContext.h\"\n#include \"ErrorCodes.h\"\n\n\n\n\n\nclass cCallbackSslContext :\n\tpublic cSslContext\n{\npublic:\n\t/** Interface used as a data sink for the SSL peer data. */\n\tclass cDataCallbacks\n\t{\n\tpublic:\n\t\t// Force a virtual destructor in descendants:\n\t\tvirtual ~cDataCallbacks() {}\n\n\t\t/** Called when mbedTLS wants to read encrypted data from the SSL peer.\n\t\tThe returned value is the number of bytes received, or a mbedTLS error on failure.\n\t\tThe implementation can return MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE to indicate\n\t\tthat there's currently no more data and that there might be more data in the future. In such cases the\n\t\tSSL operation that invoked this call will terminate with the same return value, so that the owner is\n\t\tnotified of this condition and can potentially restart the operation later on. */\n\t\tvirtual int ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes) = 0;\n\n\t\t/** Called when mbedTLS wants to write encrypted data to the SSL peer.\n\t\tThe returned value is the number of bytes sent, or a mbedTLS error on failure.\n\t\tThe implementation can return MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE to indicate\n\t\tthat there's currently no more data and that there might be more data in the future. In such cases the\n\t\tSSL operation that invoked this call will terminate with the same return value, so that the owner is\n\t\tnotified of this condition and can potentially restart the operation later on. */\n\t\tvirtual int SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes) = 0;\n\t} ;\n\n\n\t/** Creates a new SSL context with no callbacks assigned */\n\tcCallbackSslContext(void);\n\n\t/** Creates a new SSL context with the specified callbacks */\n\tcCallbackSslContext(cDataCallbacks & a_Callbacks);\n\nprotected:\n\t/** The callbacks to use to send and receive SSL peer data */\n\tcDataCallbacks * m_Callbacks;\n\n\t// cSslContext overrides:\n\tvirtual int ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes) override;\n\tvirtual int SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes) override;\n};\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/CryptoKey.cpp",
    "content": "\n// CryptoKey.cpp\n\n// Implements the cCryptoKey class representing a RSA public key in mbedTLS\n\n#include \"Globals.h\"\n#include \"CryptoKey.h\"\n\n\n\n\n\ncCryptoKey::cCryptoKey(void)\n{\n\tmbedtls_pk_init(&m_Pk);\n\tm_CtrDrbg.Initialize(\"rsa_pubkey\", 10);\n}\n\n\n\n\n\ncCryptoKey::cCryptoKey(const AString & a_PublicKeyData)\n{\n\tmbedtls_pk_init(&m_Pk);\n\tm_CtrDrbg.Initialize(\"rsa_pubkey\", 10);\n\tint res = ParsePublic(a_PublicKeyData.data(), a_PublicKeyData.size());\n\tif (res != 0)\n\t{\n\t\tLOGWARNING(\"Failed to parse public key: -0x%x\", res);\n\t\tASSERT(!\"Cannot parse PubKey\");\n\t\treturn;\n\t}\n}\n\n\n\n\n\ncCryptoKey::cCryptoKey(const AString & a_PrivateKeyData, const AString & a_Password)\n{\n\tmbedtls_pk_init(&m_Pk);\n\tm_CtrDrbg.Initialize(\"rsa_privkey\", 11);\n\tint res = ParsePrivate(a_PrivateKeyData.data(), a_PrivateKeyData.size(), a_Password);\n\tif (res != 0)\n\t{\n\t\tLOGWARNING(\"Failed to parse private key: -0x%x\", res);\n\t\tASSERT(!\"Cannot parse PrivKey\");\n\t\treturn;\n\t}\n}\n\n\n\n\n\ncCryptoKey::~cCryptoKey()\n{\n\tmbedtls_pk_free(&m_Pk);\n}\n\n\n\n\n\nint cCryptoKey::Decrypt(const Byte * a_EncryptedData, size_t a_EncryptedLength, Byte * a_DecryptedData, size_t a_DecryptedMaxLength)\n{\n\tASSERT(IsValid());\n\n\tsize_t DecryptedLen = a_DecryptedMaxLength;\n\tint res = mbedtls_pk_decrypt(&m_Pk,\n\t\ta_EncryptedData, a_EncryptedLength,\n\t\ta_DecryptedData, &DecryptedLen, a_DecryptedMaxLength,\n\t\tmbedtls_ctr_drbg_random, m_CtrDrbg.GetInternal()\n\t);\n\tif (res != 0)\n\t{\n\t\treturn res;\n\t}\n\treturn static_cast<int>(DecryptedLen);\n}\n\n\n\n\n\nint cCryptoKey::Encrypt(const Byte * a_PlainData, size_t a_PlainLength, Byte * a_EncryptedData, size_t a_EncryptedMaxLength)\n{\n\tASSERT(IsValid());\n\n\tsize_t EncryptedLength = a_EncryptedMaxLength;\n\tint res = mbedtls_pk_encrypt(&m_Pk,\n\t\ta_PlainData, a_PlainLength, a_EncryptedData, &EncryptedLength, a_EncryptedMaxLength,\n\t\tmbedtls_ctr_drbg_random, m_CtrDrbg.GetInternal()\n\t);\n\tif (res != 0)\n\t{\n\t\treturn res;\n\t}\n\treturn static_cast<int>(EncryptedLength);\n}\n\n\n\n\n\nint cCryptoKey::ParsePublic(const void * a_Data, size_t a_NumBytes)\n{\n\tASSERT(!IsValid());  // Cannot parse a second key\n\n\treturn mbedtls_pk_parse_public_key(&m_Pk, static_cast<const unsigned char *>(a_Data), a_NumBytes);\n}\n\n\n\n\n\nint cCryptoKey::ParsePrivate(const void * a_Data, size_t a_NumBytes, const AString & a_Password)\n{\n\tASSERT(!IsValid());  // Cannot parse a second key\n\t// mbedTLS requires that PEM-encoded data is passed including the terminating NUL byte,\n\t// and DER-encoded data is decoded properly even with an extra trailing NUL byte, so we simply add one to everything:\n\tAString keyData(static_cast<const char *>(a_Data), a_NumBytes);\n\n\tif (a_Password.empty())\n\t{\n\t\treturn mbedtls_pk_parse_key(\n\t\t\t&m_Pk,\n\t\t\treinterpret_cast<const unsigned char *>(keyData.data()),\n\t\t\ta_NumBytes + 1,\n\t\t\tnullptr,\n\t\t\t0,\n\t\t\tmbedtls_ctr_drbg_random,\n\t\t\tm_CtrDrbg.GetInternal());\n\t}\n\telse\n\t{\n\t\treturn mbedtls_pk_parse_key(\n\t\t\t&m_Pk,\n\t\t\treinterpret_cast<const unsigned char *>(keyData.data()), a_NumBytes + 1,\n\t\t\treinterpret_cast<const unsigned char *>(a_Password.c_str()), a_Password.size(),\n\t\t\tmbedtls_ctr_drbg_random, m_CtrDrbg.GetInternal()\n\t\t);\n\t}\n}\n\n\n\n\n\nbool cCryptoKey::IsValid(void) const\n{\n\treturn (mbedtls_pk_get_type(&m_Pk) != MBEDTLS_PK_NONE);\n}\n"
  },
  {
    "path": "src/mbedTLS++/CryptoKey.h",
    "content": "\n// CryptoKey.h\n\n// Declares the cCryptoKey class representing a RSA public key in mbedTLS\n\n\n\n\n\n#pragma once\n\n#include \"CtrDrbgContext.h\"\n#include \"mbedtls/pk.h\"\n\n\n\n\n\nclass cCryptoKey\n{\n\tfriend class cSslConfig;\n\npublic:\n\t/** Constructs an empty key instance. Before use, it needs to be filled by ParsePublic() or ParsePrivate() */\n\tcCryptoKey(void);\n\n\t/** Constructs the public key out of the DER- or PEM-encoded pubkey data */\n\tcCryptoKey(const AString & a_PublicKeyData);\n\n\t/** Constructs the private key out of the DER- or PEM-encoded privkey data, with the specified password.\n\tIf a_Password is empty, no password is assumed. */\n\tcCryptoKey(const AString & a_PrivateKeyData, const AString & a_Password);\n\n\t~cCryptoKey();\n\n\t/** Decrypts the data using the stored public key\n\tBoth a_EncryptedData and a_DecryptedData must be at least <KeySizeBytes> bytes large.\n\tReturns the number of bytes decrypted, or negative number for error. */\n\tint Decrypt(const Byte * a_EncryptedData, size_t a_EncryptedLength, Byte * a_DecryptedData, size_t a_DecryptedMaxLength);\n\n\t/** Encrypts the data using the stored public key\n\tBoth a_EncryptedData and a_DecryptedData must be at least <KeySizeBytes> bytes large.\n\tReturns the number of bytes decrypted, or negative number for error. */\n\tint Encrypt(const Byte * a_PlainData, size_t a_PlainLength, Byte * a_EncryptedData, size_t a_EncryptedMaxLength);\n\n\t/** Parses the specified data into a public key representation.\n\tThe key can be DER- or PEM-encoded.\n\tReturns 0 on success, mbedTLS error code on failure. */\n\tint ParsePublic(const void * a_Data, size_t a_NumBytes);\n\n\t/** Parses the specified data into a private key representation.\n\tIf a_Password is empty, no password is assumed.\n\tThe key can be DER- or PEM-encoded.\n\tReturns 0 on success, mbedTLS error code on failure. */\n\tint ParsePrivate(const void * a_Data, size_t a_NumBytes, const AString & a_Password);\n\n\t/** Returns true if the contained key is valid. */\n\tbool IsValid(void) const;\n\nprotected:\n\t/** The mbedTLS representation of the key data */\n\tmbedtls_pk_context m_Pk;\n\n\t/** The random generator used in encryption and decryption */\n\tcCtrDrbgContext m_CtrDrbg;\n\n\n\t/** Returns the internal context ptr. Only use in mbedTLS API calls. */\n\tmbedtls_pk_context * GetInternal(void) { return &m_Pk; }\n} ;\n\ntypedef std::shared_ptr<cCryptoKey> cCryptoKeyPtr;\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/CtrDrbgContext.cpp",
    "content": "\n// CtrDrbgContext.cpp\n\n// Implements the cCtrDrbgContext class representing a wrapper over CTR-DRBG implementation in mbedTLS\n\n#include \"Globals.h\"\n#include \"CtrDrbgContext.h\"\n#include \"EntropyContext.h\"\n\n\n\n\n\ncCtrDrbgContext::cCtrDrbgContext(void) :\n\tm_EntropyContext(std::make_shared<cEntropyContext>()),\n\tm_IsValid(false)\n{\n\tmbedtls_ctr_drbg_init(&m_CtrDrbg);\n}\n\n\n\n\n\ncCtrDrbgContext::cCtrDrbgContext(const std::shared_ptr<cEntropyContext> & a_EntropyContext) :\n\tm_EntropyContext(a_EntropyContext),\n\tm_IsValid(false)\n{\n\tmbedtls_ctr_drbg_init(&m_CtrDrbg);\n}\n\n\n\n\n\nint cCtrDrbgContext::Initialize(const void * a_Custom, size_t a_CustomSize)\n{\n\tif (m_IsValid)\n\t{\n\t\t// Already initialized\n\t\treturn 0;\n\t}\n\n\tint res = mbedtls_ctr_drbg_seed(&m_CtrDrbg, mbedtls_entropy_func, &(m_EntropyContext->m_Entropy), static_cast<const unsigned char *>(a_Custom), a_CustomSize);\n\tm_IsValid = (res == 0);\n\treturn res;\n}\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/CtrDrbgContext.h",
    "content": "\n// CtrDrbgContext.h\n\n// Declares the cCtrDrbgContext class representing a wrapper over CTR-DRBG implementation in mbedTLS\n\n\n\n\n\n#pragma once\n\n#include \"mbedtls/ctr_drbg.h\"\n\n\n\n\n\n// fwd: EntropyContext.h\nclass cEntropyContext;\n\n\n\n\n\nclass cCtrDrbgContext\n{\n\tfriend class cSslConfig;\n\tfriend class cRsaPrivateKey;\n\tfriend class cCryptoKey;\n\npublic:\n\t/** Constructs the context with a new entropy context. */\n\tcCtrDrbgContext(void);\n\n\t/** Constructs the context with the specified entropy context. */\n\tcCtrDrbgContext(const std::shared_ptr<cEntropyContext> & a_EntropyContext);\n\n\t/** Initializes the context.\n\ta_Custom is optional additional data to use for entropy, nullptr is accepted.\n\tReturns 0 if successful, mbedTLS error code on failure. */\n\tint Initialize(const void * a_Custom, size_t a_CustomSize);\n\n\t/** Returns true if the object is valid (has been initialized properly) */\n\tbool IsValid(void) const { return m_IsValid; }\n\nprotected:\n\t/** The entropy source used for generating the random */\n\tstd::shared_ptr<cEntropyContext> m_EntropyContext;\n\n\t/** The random generator context */\n\tmbedtls_ctr_drbg_context m_CtrDrbg;\n\n\t/** Set to true if the object is valid (has been initialized properly) */\n\tbool m_IsValid;\n\n\n\t/** Returns the internal context ptr. Only use in mbedTLS API calls. */\n\tmbedtls_ctr_drbg_context * GetInternal(void) { return &m_CtrDrbg; }\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/EntropyContext.cpp",
    "content": "\n// EntropyContext.cpp\n\n// Implements the cEntropyContext class representing a wrapper over entropy contexts in mbedTLS\n\n#include \"Globals.h\"\n#include \"EntropyContext.h\"\n\n\n\n\n\ncEntropyContext::cEntropyContext(void)\n{\n\tmbedtls_entropy_init(&m_Entropy);\n}\n\n\n\n\n\ncEntropyContext::~cEntropyContext()\n{\n\tmbedtls_entropy_free(&m_Entropy);\n}\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/EntropyContext.h",
    "content": "\n// EntropyContext.h\n\n// Declares the cEntropyContext class representing a wrapper over entropy contexts in mbedTLS\n\n\n\n\n\n#pragma once\n\n#include \"mbedtls/entropy.h\"\n\n\n\n\n\nclass cEntropyContext\n{\n\tfriend class cCtrDrbgContext;\npublic:\n\tcEntropyContext(void);\n\t~cEntropyContext();\n\nprotected:\n\tmbedtls_entropy_context m_Entropy;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/ErrorCodes.h",
    "content": "\n/** Error codes from mbedtls net_sockets.h */\n// TODO: Replace with std::error_code\n\n#define MBEDTLS_ERR_NET_SOCKET_FAILED    -0x0042  /**< Failed to open a socket. */\n#define MBEDTLS_ERR_NET_CONNECT_FAILED   -0x0044  /**< The connection to the given server / port failed. */\n#define MBEDTLS_ERR_NET_BIND_FAILED      -0x0046  /**< Binding of the socket failed. */\n#define MBEDTLS_ERR_NET_LISTEN_FAILED    -0x0048  /**< Could not listen on the socket. */\n#define MBEDTLS_ERR_NET_ACCEPT_FAILED    -0x004A  /**< Could not accept the incoming connection. */\n#define MBEDTLS_ERR_NET_RECV_FAILED      -0x004C  /**< Reading information from the socket failed. */\n#define MBEDTLS_ERR_NET_SEND_FAILED      -0x004E  /**< Sending information through the socket failed. */\n#define MBEDTLS_ERR_NET_CONN_RESET       -0x0050  /**< Connection was reset by peer. */\n#define MBEDTLS_ERR_NET_UNKNOWN_HOST     -0x0052  /**< Failed to get an IP address for the given hostname. */\n#define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL -0x0043  /**< Buffer is too small to hold the data. */\n#define MBEDTLS_ERR_NET_INVALID_CONTEXT  -0x0045  /**< The context is invalid, eg because it was free()ed. */\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/RsaPrivateKey.cpp",
    "content": "\n// RsaPrivateKey.cpp\n\n#include \"Globals.h\"\n#include \"RsaPrivateKey.h\"\n#include \"mbedtls/pk.h\"\n\n\n\n\n\ncRsaPrivateKey::cRsaPrivateKey(void)\n{\n\tmbedtls_rsa_init(&m_Rsa);\n\tm_CtrDrbg.Initialize(\"RSA\", 3);\n}\n\n\n\n\n\ncRsaPrivateKey::cRsaPrivateKey(const cRsaPrivateKey & a_Other)\n{\n\tmbedtls_rsa_init(&m_Rsa);\n\tmbedtls_rsa_copy(&m_Rsa, &a_Other.m_Rsa);\n\tm_CtrDrbg.Initialize(\"RSA\", 3);\n}\n\n\n\n\n\ncRsaPrivateKey::~cRsaPrivateKey()\n{\n\tmbedtls_rsa_free(&m_Rsa);\n}\n\n\n\n\n\nbool cRsaPrivateKey::Generate(unsigned a_KeySizeBits)\n{\n\tint res = mbedtls_rsa_gen_key(&m_Rsa, mbedtls_ctr_drbg_random, m_CtrDrbg.GetInternal(), a_KeySizeBits, 65537);\n\tif (res != 0)\n\t{\n\t\tLOG(\"RSA key generation failed: -0x%x\", -res);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n\n\n\n\nContiguousByteBuffer cRsaPrivateKey::GetPubKeyDER(void)\n{\n\tclass cPubKey\n\t{\n\tpublic:\n\t\tcPubKey(mbedtls_rsa_context * a_Rsa) :\n\t\t\tm_IsValid(false)\n\t\t{\n\t\t\tmbedtls_pk_init(&m_Key);\n\t\t\tif (mbedtls_pk_setup(&m_Key, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) != 0)\n\t\t\t{\n\t\t\t\tASSERT(!\"Cannot init PrivKey context\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mbedtls_rsa_copy(mbedtls_pk_rsa(m_Key), a_Rsa) != 0)\n\t\t\t{\n\t\t\t\tASSERT(!\"Cannot copy PrivKey to PK context\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tm_IsValid = true;\n\t\t}\n\n\t\t~cPubKey()\n\t\t{\n\t\t\tif (m_IsValid)\n\t\t\t{\n\t\t\t\tmbedtls_pk_free(&m_Key);\n\t\t\t}\n\t\t}\n\n\t\toperator mbedtls_pk_context * (void) { return &m_Key; }\n\n\tprotected:\n\t\tbool m_IsValid;\n\t\tmbedtls_pk_context m_Key;\n\t} PkCtx(&m_Rsa);\n\n\tunsigned char buf[3000];\n\tint res = mbedtls_pk_write_pubkey_der(PkCtx, buf, sizeof(buf));\n\tif (res < 0)\n\t{\n\t\treturn {};\n\t}\n\treturn { reinterpret_cast<const std::byte *>(buf + sizeof(buf) - res), static_cast<size_t>(res) };\n}\n\n\n\n\n\nint cRsaPrivateKey::Decrypt(const ContiguousByteBufferView a_EncryptedData, Byte * a_DecryptedData, size_t a_DecryptedMaxLength)\n{\n\tconst auto KeyLength = mbedtls_rsa_get_len(&m_Rsa);\n\tif (a_EncryptedData.size() < KeyLength)\n\t{\n\t\tLOGD(\"%s: Invalid a_EncryptedLength: got %zu, exp at least %zu\", __FUNCTION__, a_EncryptedData.size(), KeyLength);\n\t\tASSERT(!\"Invalid a_DecryptedMaxLength!\");\n\t\treturn -1;\n\t}\n\tif (a_DecryptedMaxLength < KeyLength)\n\t{\n\t\tLOGD(\"%s: Invalid a_DecryptedMaxLength: got %zu, exp at least %zu\", __FUNCTION__, a_DecryptedMaxLength, KeyLength);\n\t\tASSERT(!\"Invalid a_DecryptedMaxLength!\");\n\t\treturn -1;\n\t}\n\tsize_t DecryptedLength;\n\tint res = mbedtls_rsa_pkcs1_decrypt(\n\t\t&m_Rsa, mbedtls_ctr_drbg_random, m_CtrDrbg.GetInternal(), &DecryptedLength,\n\t\treinterpret_cast<const unsigned char *>(a_EncryptedData.data()), a_DecryptedData, a_DecryptedMaxLength\n\t);\n\tif (res != 0)\n\t{\n\t\treturn -1;\n\t}\n\treturn static_cast<int>(DecryptedLength);\n}\n"
  },
  {
    "path": "src/mbedTLS++/RsaPrivateKey.h",
    "content": "\n// RsaPrivateKey.h\n\n// Declares the cRsaPrivateKey class representing a private key for RSA operations.\n\n\n\n\n\n#pragma once\n\n#include \"CtrDrbgContext.h\"\n#include \"mbedtls/rsa.h\"\n\n\n\n\n\n/** Encapsulates an RSA private key used in PKI cryptography */\nclass cRsaPrivateKey\n{\n\tfriend class cSslContext;\n\npublic:\n\t/** Creates a new empty object, the key is not assigned */\n\tcRsaPrivateKey(void);\n\n\t/** Deep-copies the key from a_Other */\n\tcRsaPrivateKey(const cRsaPrivateKey & a_Other);\n\n\t~cRsaPrivateKey();\n\n\t/** Generates a new key within this object, with the specified size in bits.\n\tReturns true on success, false on failure. */\n\tbool Generate(unsigned a_KeySizeBits = 1024);\n\n\t/** Returns the public key part encoded in ASN1 DER encoding */\n\tContiguousByteBuffer GetPubKeyDER(void);\n\n\t/** Decrypts the data using RSAES-PKCS#1 algorithm.\n\tBoth a_EncryptedData and a_DecryptedData must be at least <KeySizeBytes> bytes large.\n\tReturns the number of bytes decrypted, or negative number for error. */\n\tint Decrypt(ContiguousByteBufferView a_EncryptedData, Byte * a_DecryptedData, size_t a_DecryptedMaxLength);\n\nprotected:\n\t/** The mbedTLS key context */\n\tmbedtls_rsa_context m_Rsa;\n\n\t/** The random generator used for generating the key and encryption / decryption */\n\tcCtrDrbgContext m_CtrDrbg;\n\n\n\t/** Returns the internal context ptr. Only use in mbedTLS API calls. */\n\tmbedtls_rsa_context * GetInternal(void) { return &m_Rsa; }\n} ;\n\ntypedef std::shared_ptr<cRsaPrivateKey> cRsaPrivateKeyPtr;\n\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/Sha1Checksum.cpp",
    "content": "\n// Sha1Checksum.cpp\n\n// Declares the cSha1Checksum class representing the SHA-1 checksum calculator\n\n#include \"Globals.h\"\n#include \"Sha1Checksum.h\"\n\n\n\n\n\n/*\n// Self-test the hash formatting for known values:\n// sha1(Notch) : 4ed1f46bbe04bc756bcb17c0c7ce3e4632f06a48\n// sha1(jeb_)  : -7c9d5b0044c130109a5d7b5fb5c317c02b4e28c1\n// sha1(simon) : 88e16a1019277b15d58faf0541e11910eb756f6\n\nstatic class Test\n{\npublic:\n\tTest(void)\n\t{\n\t\tAString DigestNotch, DigestJeb, DigestSimon;\n\t\tByte Digest[20];\n\t\tcSha1Checksum Checksum;\n\t\tChecksum.Update((const Byte *)\"Notch\", 5);\n\t\tChecksum.Finalize(Digest);\n\t\tcSha1Checksum::DigestToJava(Digest, DigestNotch);\n\t\tChecksum.Restart();\n\t\tChecksum.Update((const Byte *)\"jeb_\", 4);\n\t\tChecksum.Finalize(Digest);\n\t\tcSha1Checksum::DigestToJava(Digest, DigestJeb);\n\t\tChecksum.Restart();\n\t\tChecksum.Update((const Byte *)\"simon\", 5);\n\t\tChecksum.Finalize(Digest);\n\t\tcSha1Checksum::DigestToJava(Digest, DigestSimon);\n\t\tprintf(\"Notch: \\\"%s\\\"\\n\", DigestNotch.c_str());\n\t\tprintf(\"jeb_:  \\\"%s\\\"\\n\",  DigestJeb.c_str());\n\t\tprintf(\"simon: \\\"%s\\\"\\n\", DigestSimon.c_str());\n\t\tassert(DigestNotch == \"4ed1f46bbe04bc756bcb17c0c7ce3e4632f06a48\");\n\t\tassert(DigestJeb   == \"-7c9d5b0044c130109a5d7b5fb5c317c02b4e28c1\");\n\t\tassert(DigestSimon == \"88e16a1019277b15d58faf0541e11910eb756f6\");\n\t}\n} test;\n*/\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSha1Checksum:\n\ncSha1Checksum::cSha1Checksum(void) :\n\tm_DoesAcceptInput(true)\n{\n\tmbedtls_sha1_starts(&m_Sha1);\n}\n\n\n\n\n\nvoid cSha1Checksum::Update(const Byte * a_Data, size_t a_Length)\n{\n\tASSERT(m_DoesAcceptInput);  // Not Finalize()-d yet, or Restart()-ed\n\n\tmbedtls_sha1_update(&m_Sha1, a_Data, a_Length);\n}\n\n\n\n\n\nvoid cSha1Checksum::Finalize(cSha1Checksum::Checksum & a_Output)\n{\n\tASSERT(m_DoesAcceptInput);  // Not Finalize()-d yet, or Restart()-ed\n\n\tmbedtls_sha1_finish(&m_Sha1, a_Output);\n\tm_DoesAcceptInput = false;\n}\n\n\n\n\n\nvoid cSha1Checksum::DigestToHex(const Checksum & a_Digest, AString & a_Out)\n{\n\ta_Out.clear();\n\ta_Out.reserve(40);\n\tfor (int i = 0; i < 20; i++)\n\t{\n\t\ta_Out.append(fmt::format(FMT_STRING(\"{:02x}\"), a_Digest[i]));\n\t}\n}\n\n\n\n\n\nvoid cSha1Checksum::DigestToJava(const Checksum & a_Digest, AString & a_Out)\n{\n\tChecksum Digest;\n\tmemcpy(Digest, a_Digest, sizeof(Digest));\n\n\tbool IsNegative = (Digest[0] >= 0x80);\n\tif (IsNegative)\n\t{\n\t\t// Two's complement:\n\t\tbool carry = true;  // Add one to the whole number\n\t\tfor (int i = 19; i >= 0; i--)\n\t\t{\n\t\t\tDigest[i] = ~Digest[i];\n\t\t\tif (carry)\n\t\t\t{\n\t\t\t\tcarry = (Digest[i] == 0xff);\n\t\t\t\tDigest[i]++;\n\t\t\t}\n\t\t}\n\t}\n\ta_Out.clear();\n\ta_Out.reserve(40);\n\tfor (int i = 0; i < 20; i++)\n\t{\n\t\ta_Out.append(fmt::format(FMT_STRING(\"{:02x}\"), Digest[i]));\n\t}\n\twhile ((a_Out.length() > 0) && (a_Out[0] == '0'))\n\t{\n\t\ta_Out.erase(0, 1);\n\t}\n\tif (IsNegative)\n\t{\n\t\ta_Out.insert(0, \"-\");\n\t}\n}\n\n\n\n\n\nvoid cSha1Checksum::Restart(void)\n{\n\tmbedtls_sha1_starts(&m_Sha1);\n\tm_DoesAcceptInput = true;\n}\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/Sha1Checksum.h",
    "content": "\n// Sha1Checksum.h\n\n// Declares the cSha1Checksum class representing the SHA-1 checksum calculator\n\n\n\n\n\n#pragma once\n\n#include \"mbedtls/sha1.h\"\n\n\n\n\n\n/** Calculates a SHA1 checksum for data stream */\nclass cSha1Checksum\n{\npublic:\n\ttypedef Byte Checksum[20];  // The type used for storing the checksum\n\n\tcSha1Checksum(void);\n\n\t/** Adds the specified data to the checksum */\n\tvoid Update(const Byte * a_Data, size_t a_Length);\n\n\t/** Calculates and returns the final checksum */\n\tvoid Finalize(Checksum & a_Output);\n\n\t/** Returns true if the object is accepts more input data, false if Finalize()-d (need to Restart()) */\n\tbool DoesAcceptInput(void) const { return m_DoesAcceptInput; }\n\n\t/** Converts a SHA1 digest into hex */\n\tstatic void DigestToHex(const Checksum & a_Digest, AString & a_Out);\n\n\t/** Converts a raw 160-bit SHA1 digest into a Java Hex representation\n\tAccording to http://wiki.vg/Protocol_Encryption\n\t*/\n\tstatic void DigestToJava(const Checksum & a_Digest, AString & a_Out);\n\n\t/** Clears the current context and start a new checksum calculation */\n\tvoid Restart(void);\n\nprotected:\n\t/** True if the object is accepts more input data, false if Finalize()-d (need to Restart()) */\n\tbool m_DoesAcceptInput;\n\n\tmbedtls_sha1_context m_Sha1;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/SslConfig.cpp",
    "content": "\n#include \"Globals.h\"\n\n#include \"mbedTLS++/SslConfig.h\"\n\n#include \"mbedTLS++/CryptoKey.h\"\n#include \"mbedTLS++/EntropyContext.h\"\n#include \"mbedTLS++/X509Cert.h\"\n\n\n// This allows us to debug SSL and certificate problems, but produce way too much output,\n// so it's disabled until someone needs it\n// #define ENABLE_SSL_DEBUG_MSG\n\n\n#if !defined(NDEBUG) && defined(ENABLE_SSL_DEBUG_MSG)\n\t#include \"mbedtls/debug.h\"\n\n\n\tnamespace\n\t{\n\t\tvoid SSLDebugMessage(void * a_UserParam, int a_Level, const char * a_Filename, int a_LineNo, const char * a_Text)\n\t\t{\n\t\t\tif (a_Level > 3)\n\t\t\t{\n\t\t\t\t// Don't want the trace messages\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Remove the terminating LF:\n\t\t\tsize_t len = strlen(a_Text) - 1;\n\t\t\twhile ((len > 0) && (a_Text[len] <= 32))\n\t\t\t{\n\t\t\t\tlen--;\n\t\t\t}\n\t\t\tAString Text(a_Text, len + 1);\n\n\t\t\tLOGD(\"SSL (%d): %s\", a_Level, Text.c_str());\n\t\t}\n\n\n\n\n\n\t\tint SSLVerifyCert(void * a_This, mbedtls_x509_crt * a_Crt, int a_Depth, uint32_t * a_Flags)\n\t\t{\n\t\t\tchar buf[1024];\n\t\t\tUNUSED(a_This);\n\n\t\t\tLOG(\"Verify requested for (Depth %d):\", a_Depth);\n\t\t\tmbedtls_x509_crt_info(buf, sizeof(buf) - 1, \"\", a_Crt);\n\t\t\tLOG(\"%s\", buf);\n\n\t\t\tuint32_t Flags = *a_Flags;\n\t\t\tif ((Flags & MBEDTLS_X509_BADCERT_EXPIRED) != 0)\n\t\t\t{\n\t\t\t\tLOG(\" ! server certificate has expired\");\n\t\t\t}\n\n\t\t\tif ((Flags & MBEDTLS_X509_BADCERT_REVOKED) != 0)\n\t\t\t{\n\t\t\t\tLOG(\" ! server certificate has been revoked\");\n\t\t\t}\n\n\t\t\tif ((Flags & MBEDTLS_X509_BADCERT_CN_MISMATCH) != 0)\n\t\t\t{\n\t\t\t\tLOG(\" ! CN mismatch\");\n\t\t\t}\n\n\t\t\tif ((Flags & MBEDTLS_X509_BADCERT_NOT_TRUSTED) != 0)\n\t\t\t{\n\t\t\t\tLOG(\" ! self-signed or not signed by a trusted CA\");\n\t\t\t}\n\n\t\t\tif ((Flags & MBEDTLS_X509_BADCRL_NOT_TRUSTED) != 0)\n\t\t\t{\n\t\t\t\tLOG(\" ! CRL not trusted\");\n\t\t\t}\n\n\t\t\tif ((Flags & MBEDTLS_X509_BADCRL_EXPIRED) != 0)\n\t\t\t{\n\t\t\t\tLOG(\" ! CRL expired\");\n\t\t\t}\n\n\t\t\tif ((Flags & MBEDTLS_X509_BADCERT_OTHER) != 0)\n\t\t\t{\n\t\t\t\tLOG(\" ! other (unknown) flag\");\n\t\t\t}\n\n\t\t\tif (Flags == 0)\n\t\t\t{\n\t\t\t\tLOG(\" This certificate has no flags\");\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\t}\n#endif  // !defined(NDEBUG) && defined(ENABLE_SSL_DEBUG_MSG)\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// cSslConfig:\n\ncSslConfig::cSslConfig()\n{\n\tmbedtls_ssl_config_init(&m_Config);\n}\n\n\n\n\n\ncSslConfig::~cSslConfig()\n{\n\tmbedtls_ssl_config_free(&m_Config);\n}\n\n\n\n\n\nint cSslConfig::InitDefaults(const bool a_IsClient)\n{\n\treturn mbedtls_ssl_config_defaults(\n\t\t&m_Config,\n\t\ta_IsClient ? MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,\n\t\tMBEDTLS_SSL_TRANSPORT_STREAM,\n\t\tMBEDTLS_SSL_PRESET_DEFAULT\n\t);\n}\n\n\n\n\n\nvoid cSslConfig::SetAuthMode(const eSslAuthMode a_AuthMode)\n{\n\tconst int Mode = [=]()\n\t{\n\t\tswitch (a_AuthMode)\n\t\t{\n\t\t\tcase eSslAuthMode::None:     return MBEDTLS_SSL_VERIFY_NONE;\n\t\t\tcase eSslAuthMode::Optional: return MBEDTLS_SSL_VERIFY_OPTIONAL;\n\t\t\tcase eSslAuthMode::Required: return MBEDTLS_SSL_VERIFY_REQUIRED;\n\t\t\tcase eSslAuthMode::Unset:    return MBEDTLS_SSL_VERIFY_UNSET;\n\t\t}\n\t\tUNREACHABLE(\"Unsupported SSL auth mode\");\n\t}();\n\n\tmbedtls_ssl_conf_authmode(&m_Config, Mode);\n}\n\n\n\n\n\nvoid cSslConfig::SetRng(cCtrDrbgContextPtr a_CtrDrbg)\n{\n\tASSERT(a_CtrDrbg != nullptr);\n\tm_CtrDrbg = std::move(a_CtrDrbg);\n\tmbedtls_ssl_conf_rng(&m_Config, mbedtls_ctr_drbg_random, &m_CtrDrbg->m_CtrDrbg);\n}\n\n\n\n\n\nvoid cSslConfig::SetDebugCallback(cDebugCallback a_CallbackFun, void * a_CallbackData)\n{\n\tmbedtls_ssl_conf_dbg(&m_Config, a_CallbackFun, a_CallbackData);\n}\n\n\n\n\n\nvoid cSslConfig::SetOwnCert(cX509CertPtr a_OwnCert, cCryptoKeyPtr a_OwnCertPrivKey)\n{\n\tASSERT(a_OwnCert != nullptr);\n\tASSERT(a_OwnCertPrivKey != nullptr);\n\n\t// Make sure we have the cert stored for later, mbedTLS only uses the cert later on\n\tm_OwnCert = std::move(a_OwnCert);\n\tm_OwnCertPrivKey = std::move(a_OwnCertPrivKey);\n\n\t// Set into the config:\n\tmbedtls_ssl_conf_own_cert(&m_Config, m_OwnCert->GetInternal(), m_OwnCertPrivKey->GetInternal());\n}\n\n\n\n\n\nvoid cSslConfig::SetVerifyCallback(cVerifyCallback a_CallbackFun, void * a_CallbackData)\n{\n\tmbedtls_ssl_conf_verify(&m_Config, a_CallbackFun, a_CallbackData);\n}\n\n\n\n\n\nvoid cSslConfig::SetCipherSuites(std::vector<int> a_CipherSuites)\n{\n\tm_CipherSuites = std::move(a_CipherSuites);\n\tm_CipherSuites.push_back(0);  // Must be null terminated\n\tmbedtls_ssl_conf_ciphersuites(&m_Config, m_CipherSuites.data());\n}\n\n\n\n\n\nvoid cSslConfig::SetCACerts(cX509CertPtr a_CACert)\n{\n\tm_CACerts = std::move(a_CACert);\n\tmbedtls_ssl_conf_ca_chain(&m_Config, m_CACerts->GetInternal(), nullptr);\n}\n\n\n\n\n\nstd::shared_ptr<cSslConfig> cSslConfig::MakeDefaultConfig(bool a_IsClient)\n{\n\tauto Ret = std::make_shared<cSslConfig>();\n\n\tRet->InitDefaults(a_IsClient);\n\n\t{\n\t\tauto CtrDrbg = std::make_shared<cCtrDrbgContext>();\n\t\tCtrDrbg->Initialize(\"Cuberite\", 8);\n\t\tRet->SetRng(std::move(CtrDrbg));\n\t}\n\n\t// By default we have no root CAs, so no cert verification can be done:\n\tRet->SetAuthMode(eSslAuthMode::None);\n\n\t#ifndef NDEBUG\n\t\t#ifdef ENABLE_SSL_DEBUG_MSG\n\t\t\tRet->SetDebugCallback(&SSLDebugMessage, nullptr);\n\t\t\tRet->SetVerifyCallback(SSLVerifyCert, nullptr);\n\t\t\tmbedtls_debug_set_threshold(2);\n\t\t#endif\n\n\t\t/*\n\t\t// Set ciphersuite to the easiest one to decode, so that the connection can be wireshark-decoded:\n\t\tRet->SetCipherSuites(\n\t\t\t{\n\t\t\t\tMBEDTLS_TLS_RSA_WITH_RC4_128_MD5,\n\t\t\t\tMBEDTLS_TLS_RSA_WITH_RC4_128_SHA,\n\t\t\t\tMBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA\n\t\t\t}\n\t\t);\n\t\t*/\n\t#endif\n\n\treturn Ret;\n}\n\n\n\n\n\nstd::shared_ptr<const cSslConfig> cSslConfig::GetDefaultClientConfig()\n{\n\tstatic const std::shared_ptr<const cSslConfig> ClientConfig = MakeDefaultConfig(true);\n\treturn ClientConfig;\n}\n\n\n\n\n\nstd::shared_ptr<const cSslConfig> cSslConfig::GetDefaultServerConfig()\n{\n\tstatic const std::shared_ptr<const cSslConfig> ServerConfig = MakeDefaultConfig(false);\n\treturn ServerConfig;\n}\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/SslConfig.h",
    "content": "\n#pragma once\n\n#include \"mbedtls/ssl.h\"\n\n// fwd:\nclass cCryptoKey;\nclass cCtrDrbgContext;\nclass cX509Cert;\n\nusing cCryptoKeyPtr = std::shared_ptr<cCryptoKey>;\nusing cCtrDrbgContextPtr = std::shared_ptr<cCtrDrbgContext>;\nusing cX509CertPtr = std::shared_ptr<cX509Cert>;\n\nenum class eSslAuthMode\n{\n\tNone = 0,      // MBEDTLS_SSL_VERIFY_NONE\n\tOptional = 1,  // MBEDTLS_SSL_VERIFY_OPTIONAL\n\tRequired = 2,  // MBEDTLS_SSL_VERIFY_REQUIRED\n\tUnset = 3,     // MBEDTLS_SSL_VERIFY_UNSET\n};\n\n\n\nclass cSslConfig\n{\n\tfriend class cSslContext;\npublic:\n\t/** Type of the SSL debug callback.\n\tParameters are:\n\t\tvoid *       Opaque context for the callback\n\t\tint          Debug level\n\t\tconst char * File name\n\t\tint          Line number\n\t\tconst char * Message */\n\tusing cDebugCallback = void(*)(void *, int, const char *, int, const char *);\n\n\t/** Type of the SSL certificate verify callback.\n\tParameters are:\n\t\tvoid *             Opaque context for the callback\n\t\tmbedtls_x509_crt * Current cert\n\t\tint                Cert chain depth\n\t\tuint32_t *         Verification flags */\n\tusing cVerifyCallback = int(*)(void *, mbedtls_x509_crt *, int, uint32_t *);\n\n\tcSslConfig();\n\t~cSslConfig();\n\n\t/** Initialize with mbedTLS default settings. */\n\tint InitDefaults(bool a_IsClient);\n\n\t/** Set the authorization mode. */\n\tvoid SetAuthMode(eSslAuthMode a_AuthMode);\n\n\t/** Set the random number generator. */\n\tvoid SetRng(cCtrDrbgContextPtr a_CtrDrbg);\n\n\t/** Set the debug callback. */\n\tvoid SetDebugCallback(cDebugCallback a_CallbackFun, void * a_CallbackData);\n\n\t/** Set the certificate verify callback. */\n\tvoid SetVerifyCallback(cVerifyCallback a_CallbackFun, void * a_CallbackData);\n\n\t/** Set the enabled cipher suites. */\n\tvoid SetCipherSuites(std::vector<int> a_CipherSuites);\n\n\t/** Set the certificate to use for connections. */\n\tvoid SetOwnCert(cX509CertPtr a_OwnCert, cCryptoKeyPtr a_OwnCertPrivKey);\n\n\t/** Set the trusted certificate authority chain. */\n\tvoid SetCACerts(cX509CertPtr a_CACert);\n\n\t/** Creates a new config with some sensible defaults on top of mbedTLS basic settings. */\n\tstatic std::shared_ptr<cSslConfig> MakeDefaultConfig(bool a_IsClient);\n\n\t/** Returns the default config for client connections. */\n\tstatic std::shared_ptr<const cSslConfig> GetDefaultClientConfig();\n\n\t/** Returns the default config for server connections. */\n\tstatic std::shared_ptr<const cSslConfig> GetDefaultServerConfig();\n\nprivate:\n\n\t/** Returns a pointer to the wrapped mbedtls representation. */\n\tconst mbedtls_ssl_config * GetInternal() const { return &m_Config; }\n\n\tmbedtls_ssl_config m_Config;\n\tcCtrDrbgContextPtr m_CtrDrbg;\n\tcX509CertPtr m_OwnCert;\n\tcCryptoKeyPtr m_OwnCertPrivKey;\n\tcX509CertPtr m_CACerts;\n\tstd::vector<int> m_CipherSuites;\n};\n"
  },
  {
    "path": "src/mbedTLS++/SslContext.cpp",
    "content": "\n// SslContext.cpp\n\n// Implements the cSslContext class that holds everything a single SSL context needs to function\n\n#include \"Globals.h\"\n#include \"../mbedTLS++/SslContext.h\"\n#include \"../mbedTLS++/SslConfig.h\"\n\n\n\n\n\ncSslContext::cSslContext(void) :\n\tm_IsValid(false),\n\tm_HasHandshaken(false)\n{\n\tmbedtls_ssl_init(&m_Ssl);\n}\n\n\n\n\n\ncSslContext::~cSslContext()\n{\n\tmbedtls_ssl_free(&m_Ssl);\n}\n\n\n\n\n\nint cSslContext::Initialize(std::shared_ptr<const cSslConfig> a_Config)\n{\n\t// Check double-initialization:\n\tif (m_IsValid)\n\t{\n\t\tLOGWARNING(\"SSL: Double initialization is not supported.\");\n\t\treturn MBEDTLS_ERR_SSL_BAD_INPUT_DATA;  // There is no return value well-suited for this, reuse this one.\n\t}\n\n\t// Check the Config:\n\tm_Config = std::move(a_Config);\n\tif (m_Config == nullptr)\n\t{\n\t\tASSERT(!\"Config must not be nullptr\");\n\t\treturn MBEDTLS_ERR_SSL_BAD_INPUT_DATA;\n\t}\n\n\t// Apply the configuration to the ssl context\n\tint res = mbedtls_ssl_setup(&m_Ssl, m_Config->GetInternal());\n\tif (res != 0)\n\t{\n\t\treturn res;\n\t}\n\n\t// Set the io callbacks\n\tmbedtls_ssl_set_bio(&m_Ssl, this, SendEncrypted, ReceiveEncrypted, nullptr);\n\n\tm_IsValid = true;\n\treturn 0;\n}\n\n\n\n\n\nint cSslContext::Initialize(bool a_IsClient)\n{\n\tif (a_IsClient)\n\t{\n\t\treturn Initialize(cSslConfig::GetDefaultClientConfig());\n\t}\n\telse\n\t{\n\t\treturn Initialize(cSslConfig::GetDefaultServerConfig());\n\t}\n}\n\n\n\n\n\nvoid cSslContext::SetExpectedPeerName(const std::string_view a_ExpectedPeerName)\n{\n\tASSERT(m_IsValid);  // Call Initialize() first\n\tmbedtls_ssl_set_hostname(&m_Ssl, a_ExpectedPeerName.data());\n}\n\n\n\n\n\nint cSslContext::WritePlain(const void * a_Data, size_t a_NumBytes)\n{\n\tASSERT(m_IsValid);  // Need to call Initialize() first\n\tif (!m_HasHandshaken)\n\t{\n\t\tint res = Handshake();\n\t\tif (res != 0)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t}\n\n\treturn mbedtls_ssl_write(&m_Ssl, static_cast<const unsigned char *>(a_Data), a_NumBytes);\n}\n\n\n\n\n\nint cSslContext::ReadPlain(void * a_Data, size_t a_MaxBytes)\n{\n\tASSERT(m_IsValid);  // Need to call Initialize() first\n\tif (!m_HasHandshaken)\n\t{\n\t\tint res = Handshake();\n\t\tif (res != 0)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t}\n\n\treturn mbedtls_ssl_read(&m_Ssl, static_cast<unsigned char *>(a_Data), a_MaxBytes);\n}\n\n\n\n\n\nint cSslContext::Handshake(void)\n{\n\tASSERT(m_IsValid);  // Need to call Initialize() first\n\tASSERT(!m_HasHandshaken);  // Must not call twice\n\n\tint res = mbedtls_ssl_handshake(&m_Ssl);\n\tif (res == 0)\n\t{\n\t\tm_HasHandshaken = true;\n\t}\n\treturn res;\n}\n\n\n\n\n\nint cSslContext::NotifyClose(void)\n{\n\treturn mbedtls_ssl_close_notify(&m_Ssl);\n}\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/SslContext.h",
    "content": "\n// SslContext.h\n\n// Declares the cSslContext class that holds everything a single SSL context needs to function\n\n\n\n\n\n#pragma once\n\n#include \"mbedtls/ssl.h\"\n#include \"../ByteBuffer.h\"\n\n\n\n\n\n// fwd:\nclass cCtrDrbgContext;\nclass cSslConfig;\n\n\n\n\n\n/**\nActs as a generic SSL encryptor / decryptor between the two endpoints. The \"owner\" of this class is expected\nto create it, initialize it and then provide the means of reading and writing data through the SSL link.\nThis is an abstract base class, there are descendants that handle the specific aspects of how the SSL peer\ndata comes into the system:\n\t- cBufferedSslContext uses a cByteBuffer to read and write the data\n\t- cCallbackSslContext uses callbacks to provide the data\n*/\nclass cSslContext abstract\n{\npublic:\n\t/** Creates a new uninitialized context */\n\tcSslContext(void);\n\n\tvirtual ~cSslContext();\n\n\t/** Initializes the context for use as a server or client.\n\ta_Config must not be nullptr and the config must not be changed after this call.\n\tReturns 0 on success, mbedTLS error on failure. */\n\tint Initialize(std::shared_ptr<const cSslConfig> a_Config);\n\n\t/** Initializes the context using the default config. */\n\tint Initialize(bool a_IsClient);\n\n\t/** Returns true if the object has been initialized properly. */\n\tbool IsValid(void) const { return m_IsValid; }\n\n\t/** Sets the SSL peer name expected for this context.\n\tThis is used both for TLS SNI and for certificate validation.\n\tMust be called after Initialize().\n\t\\param a_ExpectedPeerName CommonName that we expect the SSL peer to have in its cert,\n\tif it is different, the verification will fail. An empty string will disable the CN check. */\n\tvoid SetExpectedPeerName(const std::string_view a_ExpectedPeerName);\n\n\t/** Writes data to be encrypted and sent to the SSL peer. Will perform SSL handshake, if needed.\n\tReturns the number of bytes actually written, or mbedTLS error code.\n\tIf the return value is MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, the owner should send any\n\tcached outgoing data to the SSL peer and write any incoming data received from the SSL peer and then call\n\tthis function again with the same parameters. Note that this may repeat a few times before the data is\n\tactually written, mainly due to initial handshake. */\n\tint WritePlain(const void * a_Data, size_t a_NumBytes);\n\n\t/** Reads data decrypted from the SSL stream. Will perform SSL handshake, if needed.\n\tReturns the number of bytes actually read, or mbedTLS error code.\n\tIf the return value is MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, the owner should send any\n\tcached outgoing data to the SSL peer and write any incoming data received from the SSL peer and then call\n\tthis function again with the same parameters. Note that this may repeat a few times before the data is\n\tactually read, mainly due to initial handshake. */\n\tint ReadPlain(void * a_Data, size_t a_MaxBytes);\n\n\t/** Performs the SSL handshake.\n\tReturns zero on success, mbedTLS error code on failure.\n\tIf the return value is MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, the owner should send any\n\tcached outgoing data to the SSL peer and write any incoming data received from the SSL peer and then call\n\tthis function again. Note that this may repeat a few times before the handshake is completed. */\n\tint Handshake(void);\n\n\t/** Returns true if the SSL handshake has been completed. */\n\tbool HasHandshaken(void) const { return m_HasHandshaken; }\n\n\t/** Notifies the SSL peer that the connection is being closed.\n\tReturns 0 on success, mbedTLS error code on failure. */\n\tint NotifyClose(void);\n\nprotected:\n\n\t/** Configuration of the SSL context. */\n\tstd::shared_ptr<const cSslConfig> m_Config;\n\n\t/** The SSL context that mbedTLS uses. */\n\tmbedtls_ssl_context m_Ssl;\n\n\t/** True if the object has been initialized properly. */\n\tbool m_IsValid;\n\n\t/** True if the SSL handshake has been completed. */\n\tbool m_HasHandshaken;\n\n\t/** The callback used by mbedTLS when it wants to read encrypted data. */\n\tstatic int ReceiveEncrypted(void * a_This, unsigned char * a_Buffer, size_t a_NumBytes)\n\t{\n\t\treturn (static_cast<cSslContext *>(a_This))->ReceiveEncrypted(a_Buffer, a_NumBytes);\n\t}\n\n\t/** The callback used by mbedTLS when it wants to write encrypted data. */\n\tstatic int SendEncrypted(void * a_This, const unsigned char * a_Buffer, size_t a_NumBytes)\n\t{\n\t\treturn (static_cast<cSslContext *>(a_This))->SendEncrypted(a_Buffer, a_NumBytes);\n\t}\n\n\t/** Called when mbedTLS wants to read encrypted data. */\n\tvirtual int ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes) = 0;\n\n\t/** Called when mbedTLS wants to write encrypted data. */\n\tvirtual int SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes) = 0;\n} ;\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/X509Cert.cpp",
    "content": "\n// X509Cert.cpp\n\n// Implements the cX509Cert class representing a wrapper over X509 certs in mbedTLS\n\n#include \"Globals.h\"\n#include \"X509Cert.h\"\n\n\n\n\n\ncX509Cert::cX509Cert(void)\n{\n\tmbedtls_x509_crt_init(&m_Cert);\n}\n\n\n\n\n\ncX509Cert::~cX509Cert()\n{\n\tmbedtls_x509_crt_free(&m_Cert);\n}\n\n\n\n\n\nint cX509Cert::Parse(const void * a_CertContents, size_t a_Size)\n{\n\t// mbedTLS requires that PEM-encoded data is passed including the terminating NUL byte,\n\t// and DER-encoded data is decoded properly even with an extra trailing NUL byte, so we simply add one to everything:\n\tAString certContents(static_cast<const char *>(a_CertContents), a_Size);\n\treturn mbedtls_x509_crt_parse(&m_Cert, reinterpret_cast<const unsigned char *>(certContents.data()), a_Size + 1);\n}\n\n\n\n\n"
  },
  {
    "path": "src/mbedTLS++/X509Cert.h",
    "content": "\n// X509Cert.h\n\n// Declares the cX509Cert class representing a wrapper over X509 certs in mbedTLS\n\n\n\n\n\n#pragma once\n\n#include \"mbedtls/x509_crt.h\"\n\n\n\n\n\nclass cX509Cert\n{\n\tfriend class cSslConfig;\n\npublic:\n\tcX509Cert(void);\n\t~cX509Cert(void);\n\n\t/** Parses the certificate chain data into the context.\n\tThe certificate can be DER- or PEM-encoded.\n\tReturns 0 on succes, or mbedTLS error code on failure. */\n\tint Parse(const void * a_CertContents, size_t a_Size);\n\nprotected:\n\tmbedtls_x509_crt m_Cert;\n\n\t/** Returns the internal cert ptr. Only use in mbedTLS API calls. */\n\tmbedtls_x509_crt * GetInternal(void) { return &m_Cert; }\n} ;\n\ntypedef std::shared_ptr<cX509Cert> cX509CertPtr;\n\n\n\n\n"
  },
  {
    "path": "stats.cmd",
    "content": "cloc --by-file-by-lang --exclude-dir=lib --exclude-list-file=cloc-exclude.txt --xml --xsl=1 --report-file=cloc.xml --ignored=cloc-ignored.txt .\n"
  },
  {
    "path": "tests/BlockTypeRegistry/BlockStateTest.cpp",
    "content": "#include \"Globals.h\"\n#include \"Bindings/BlockState.h\"\n#include \"../TestHelpers.h\"\n\n\n\n\n/** Tests the class constructors with static (hard-coded) data. */\nstatic void testStaticCreation()\n{\n\tLOGD(\"Testing BlockState creation from static data...\");\n\n\t// Create a few BlockStates using the static-data constructors:\n\tBlockState bs1v1;\n\tBlockState bs2v1(\"property\", \"value\");\n\tBlockState bs3v1({{\"property1\", \"value1\"}, {\"property2\", \"value2\"}});\n\tBlockState bs1v2(bs1v1);\n\tBlockState bs2v2(bs2v1);\n\tBlockState bs3v2(bs3v1);\n\tBlockState bs1v3(bs1v2, {{\"added property\", \"value1\"}});\n\tBlockState bs2v3(bs2v2, {{\"added property\", \"value2\"}});\n\tBlockState bs3v3(bs3v2, {{\"added property\", \"value3\"}});\n\n\t// Test (in-)equality (v1 = v2 != v3):\n\tTEST_EQUAL(bs1v1, bs1v2);\n\tTEST_EQUAL(bs2v1, bs2v2);\n\tTEST_EQUAL(bs3v1, bs3v2);\n\tTEST_NOTEQUAL(bs1v1, bs1v3);\n\tTEST_NOTEQUAL(bs2v1, bs2v3);\n\tTEST_NOTEQUAL(bs3v1, bs3v3);\n\tTEST_NOTEQUAL(bs1v2, bs1v3);\n\tTEST_NOTEQUAL(bs2v2, bs2v3);\n\tTEST_NOTEQUAL(bs3v2, bs3v3);\n\n\t// Test that the values are actually stored:\n\tTEST_EQUAL(bs1v1.value(\"property\"), \"\");\n\tTEST_EQUAL(bs2v1.value(\"property\"), \"value\");\n\tTEST_EQUAL(bs2v1.value(\"property1\"), \"\");\n\tTEST_EQUAL(bs3v1.value(\"property1\"), \"value1\");\n\tTEST_EQUAL(bs3v1.value(\"property2\"), \"value2\");\n\tTEST_EQUAL(bs1v3.value(\"added property\"), \"value1\");\n\tTEST_EQUAL(bs2v3.value(\"added property\"), \"value2\");\n\tTEST_EQUAL(bs3v3.value(\"added property\"), \"value3\");\n}\n\n\n\n\n\n/** Tests the dynamic-data constructors (map param, deep-copy). */\nstatic void testDynamicCreation()\n{\n\tLOGD(\"Testing BlockState creation from dynamic data...\");\n\n\tusing Map = std::map<AString, AString>;\n\n\t// Construct from scratch:\n\t{\n\t\tBlockState bs1a({{\"property\", \"value\"}});\n\t\tMap map1({{\"property\", \"value\"}});\n\t\tBlockState bs1b(map1);\n\t\tTEST_EQUAL(bs1a, bs1b);  // Creation works\n\t\tmap1.clear();\n\t\tTEST_EQUAL(bs1a, bs1b);  // Created a copy independent of map1\n\t}\n\n\t// Construct by moving:\n\t{\n\t\tBlockState bs2a({{\"property\", \"value\"}});\n\t\tMap map2({{\"property\", \"value\"}});\n\t\tBlockState bs2b(std::move(map2));\n\t\tTEST_EQUAL(bs2a, bs2b);  // Creation works\n\t}\n\n\t// Construct by modifying:\n\t{\n\t\tBlockState bsSrc(\"property1\", \"value1\");\n\t\tBlockState bs3a(bsSrc, {{\"property2\", \"value2\"}});\n\t\tMap map3({{\"property2\", \"value2\"}});\n\t\tBlockState bs3b(bsSrc, map3);\n\t\tTEST_EQUAL(bs3a, bs3b);\n\t\tmap3.clear();\n\t\tTEST_EQUAL(bs3a, bs3b);\n\t}\n}\n\n\n\n\n\n/** Tests replacing the properties in the copy-and-modify constructors. */\nstatic void testReplacing()\n{\n\tLOGD(\"Testing replacing / removing properties in BlockState copies...\");\n\n\t// Test replacing:\n\tBlockState bs1(\"property1\", \"value1v1\");\n\tBlockState bs2(bs1, {{\"property1\", \"value1v2\"}});\n\tTEST_EQUAL(bs2.value(\"property1\"), \"value1v2\");  // Stored the new one\n\tTEST_EQUAL(bs1.value(\"property1\"), \"value1v1\");  // Didn't replace in the original\n\n\t// Test removing:\n\tBlockState bs3(bs1, {{\"property1\", \"\"}});\n\tBlockState bsEmpty;\n\tTEST_EQUAL(bs3, bsEmpty);\n}\n\n\n\n\n\n/** Tests the comparison operator. */\nstatic void testComparison()\n{\n\tLOGD(\"Testing comparison of BlockStates...\");\n\n\t// Simple property value tests\n\tTEST_FALSE((BlockState({{\"a\", \"a\"}}) < BlockState({{\"a\", \"a\"}})));\n\tTEST_FALSE((BlockState() < BlockState()));\n\tTEST_TRUE((BlockState() < BlockState({{\"foo\", \"bar\"}})));\n\tTEST_FALSE((BlockState({{\"foo\", \"bar\"}}) < BlockState()));\n}\n\n\n\n\n\n/** Tests the comparison operator using crafted data to defeat the checksum. */\nstatic void testComparison2()\n{\n\t/* The following test ensures that items inserted in different order result\n\tin the same map. I.e. that the < operator is stable. */\n\tstd::vector<BlockState> v;\n\tstd::map<BlockState, bool> map1;\n\tstd::map<BlockState, bool> map2;\n\n\tfor (int i = 0; i < 128; ++i)\n\t{\n\t\tv.push_back(BlockState({{std::string(1, static_cast<char>(0x1F)), std::string(1, static_cast<char>(i))}}));\n\t\tv.push_back(BlockState({{std::string(1, static_cast<char>(0x10)), std::string(1, static_cast<char>(i | 0x80))},\n\t\t\t{std::string(1, static_cast<char>(0x0F)), std::string(1, static_cast<char>(0x80))}}));\n\t}\n\n\tfor (size_t i = 0; i < v.size(); ++i)\n\t{\n\t\tmap1[v[i]] = true;\n\t}\n\n\tfor (auto i = v.size(); i > 0; --i)\n\t{\n\t\tmap2[v[i - 1]] = true;\n\t}\n\n\t// Check result\n\tTEST_EQUAL(v.size(), 2 * 128);\n\tTEST_EQUAL(map1.size(), v.size());\n\tTEST_EQUAL(map1.size(), map2.size());\n\tfor (const auto & item: map1)\n\t{\n\t\tTEST_EQUAL(map1[item.first], map2[item.first]);\n\t}\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"BlockStateTest\",\n\ttestStaticCreation();\n\ttestDynamicCreation();\n\ttestReplacing();\n\ttestComparison();\n\ttestComparison2();\n)\n"
  },
  {
    "path": "tests/BlockTypeRegistry/BlockTypePaletteTest.cpp",
    "content": "#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"Bindings/BlockTypePalette.h\"\n#include \"OSSupport/Stopwatch.h\"\n\n\n\n\n\n/** Tests the BlockTypePalette's basic APIs - creation, addition, querying. */\nstatic void testBasic()\n{\n\tLOGD(\"Testing the basic BlockTypePalette's APIs...\");\n\n\t// Check inserting different block type names:\n\tBlockTypePalette pal;\n\tTEST_EQUAL(pal.index(\"testblock\", BlockState()), 0);  // Insert the first entry\n\tTEST_EQUAL(pal.index(\"testblock\", BlockState()), 0);  // Check that it's not inserted again\n\tTEST_EQUAL(pal.maybeIndex(\"testblock\", BlockState()), (std::make_pair<UInt32, bool>(0, true)));\n\tTEST_EQUAL(pal.maybeIndex(\"nonexistent\", BlockState()).second, false);\n\n\tTEST_EQUAL(pal.index(\"another\", BlockState()), 1);  // Insert the second entry\n\tTEST_EQUAL(pal.index(\"another\", BlockState()), 1);  // Check that it's not inserted twice\n\tTEST_EQUAL(pal.maybeIndex(\"another\", BlockState()), (std::make_pair<UInt32, bool>(1, true)));\n\tTEST_EQUAL(pal.maybeIndex(\"testblock\", BlockState()), (std::make_pair<UInt32, bool>(0, true)));  // The first one stayed\n\n\t// Check same block type name, different BlockState:\n\tBlockState bs1;\n\tBlockState bs2(\"key1\", \"value1\");\n\tBlockState bs3({{\"key1\", \"value1\"}, {\"key2\", \"value2\"}});\n\tBlockState bs2Copy(bs2);\n\tTEST_EQUAL(pal.index(\"multistate\", bs1), 2);\n\tTEST_EQUAL(pal.index(\"multistate\", bs2), 3);\n\tTEST_EQUAL(pal.index(\"multistate\", bs3), 4);\n\tTEST_EQUAL(pal.index(\"multistate\", bs2Copy), 3);  // Different BlockState instance, but same content\n\tTEST_EQUAL(pal.count(), 5);\n\n\t// Check the entry() API:\n\tTEST_EQUAL(pal.entry(0), (std::make_pair<AString, BlockState>(\"testblock\",  BlockState())));\n\tTEST_EQUAL(pal.entry(1), (std::make_pair<AString, BlockState>(\"another\",    BlockState())));\n\tTEST_EQUAL(pal.entry(2), (std::make_pair<AString, BlockState>(\"multistate\", BlockState(bs1))));  // make_pair requires a copy of the state\n\tTEST_EQUAL(pal.entry(3), (std::make_pair<AString, BlockState>(\"multistate\", BlockState(bs2))));\n\tTEST_EQUAL(pal.entry(4), (std::make_pair<AString, BlockState>(\"multistate\", BlockState(bs3))));\n\tTEST_THROWS(pal.entry(5), BlockTypePalette::NoSuchIndexException);\n}\n\n\n\n\n\n/** Tests creating the transform map between two palettes. */\nstatic void testTransformAddMissing()\n{\n\tLOGD(\"Testing the createTransformMapAddMissing API...\");\n\n\t// Create two palettes with some overlap:\n\tBlockTypePalette pal1, pal2;\n\t/* 0 */ pal1.index(\"block1\", BlockState());\n\t/* 1 */ pal1.index(\"block2\", BlockState());\n\t/* 2 */ pal1.index(\"block3\", BlockState());\n\t/* 3 */ pal1.index(\"block4\", BlockState());\n\t/* 4 */ pal1.index(\"block5\", BlockState(\"key1\", \"value1\"));\n\t/* 0 */ pal2.index(\"block0\", BlockState());\n\t/* 1 */ pal2.index(\"block2\", BlockState());  // overlap\n\t/* 2 */ pal2.index(\"block4\", BlockState());  // overlap\n\t/* 3 */ pal2.index(\"block4\", BlockState(\"key1\", \"value1\"));\n\t/* 4 */ pal2.index(\"block5\", BlockState(\"key1\", \"value1\"));  // overlap\n\t/* 5 */ pal2.index(\"block6\", BlockState(\"key1\", \"value1\"));\n\n\t// Check the transform map:\n\tauto trans = pal1.createTransformMapAddMissing(pal2);\n\tTEST_EQUAL(pal1.maybeIndex(\"block1\", BlockState()),                 (std::make_pair<UInt32, bool>(0, true)));\n\tTEST_EQUAL(pal1.maybeIndex(\"block2\", BlockState()),                 (std::make_pair<UInt32, bool>(1, true)));\n\tTEST_EQUAL(pal1.maybeIndex(\"block3\", BlockState()),                 (std::make_pair<UInt32, bool>(2, true)));\n\tTEST_EQUAL(pal1.maybeIndex(\"block4\", BlockState()),                 (std::make_pair<UInt32, bool>(3, true)));\n\tTEST_EQUAL(pal1.maybeIndex(\"block5\", BlockState(\"key1\", \"value1\")), (std::make_pair<UInt32, bool>(4, true)));\n\tTEST_EQUAL(pal1.maybeIndex(\"block0\", BlockState()),                 (std::make_pair<UInt32, bool>(5, true)));\n\tTEST_EQUAL(pal1.maybeIndex(\"block4\", BlockState(\"key1\", \"value1\")), (std::make_pair<UInt32, bool>(6, true)));\n\tTEST_EQUAL(pal1.maybeIndex(\"block6\", BlockState(\"key1\", \"value1\")), (std::make_pair<UInt32, bool>(7, true)));\n\tTEST_EQUAL(trans.size(), 6);\n\tTEST_EQUAL(trans[0], 5);  // Added\n\tTEST_EQUAL(trans[1], 1);  // Mapped\n\tTEST_EQUAL(trans[2], 3);  // Mapped\n\tTEST_EQUAL(trans[3], 6);  // Added\n\tTEST_EQUAL(trans[4], 4);  // Mapped\n\tTEST_EQUAL(trans[5], 7);  // Added\n}\n\n\n\n\n\n/** Tests creating the transform map between two palettes, with fallback. */\nstatic void testTransformWithFallback()\n{\n\tLOGD(\"Testing the createTransformMapWithFallback API...\");\n\n\t// Create two palettes with some overlap:\n\tBlockTypePalette pal1, pal2;\n\t/* 0 */ pal1.index(\"block1\", BlockState());\n\t/* 1 */ pal1.index(\"block2\", BlockState());\n\t/* 2 */ pal1.index(\"block3\", BlockState());\n\t/* 3 */ pal1.index(\"block4\", BlockState());\n\t/* 4 */ pal1.index(\"block5\", BlockState(\"key1\", \"value1\"));\n\t/* 0 */ pal2.index(\"block0\", BlockState());\n\t/* 1 */ pal2.index(\"block2\", BlockState());  // overlap\n\t/* 2 */ pal2.index(\"block4\", BlockState());  // overlap\n\t/* 3 */ pal2.index(\"block4\", BlockState(\"key1\", \"value1\"));\n\t/* 4 */ pal2.index(\"block5\", BlockState(\"key1\", \"value1\"));  // overlap\n\t/* 5 */ pal2.index(\"block6\", BlockState(\"key1\", \"value1\"));\n\n\t// Check the transform map:\n\tauto trans = pal1.createTransformMapWithFallback(pal2, 0);\n\tTEST_EQUAL(trans.size(), 6);\n\tTEST_EQUAL(trans[0], 0);  // Fallback\n\tTEST_EQUAL(trans[1], 1);  // Mapped\n\tTEST_EQUAL(trans[2], 3);  // Mapped\n\tTEST_EQUAL(trans[3], 0);  // Fallback\n\tTEST_EQUAL(trans[4], 4);  // Mapped\n\tTEST_EQUAL(trans[5], 0);  // Fallback\n}\n\n\n\n\n\n/** Tests that loading fails for nonsense input */\nstatic void testLoadErrors(void)\n{\n\tLOG(\"Testing palette load error reporting.\");\n\n\tBlockTypePalette palette;\n\tTEST_THROWS(palette.loadFromString(\"\"),        BlockTypePalette::LoadFailedException);\n\tTEST_THROWS(palette.loadFromString(\"[]\"),      BlockTypePalette::LoadFailedException);\n\tTEST_THROWS(palette.loadFromString(\"a = {}\"),  BlockTypePalette::LoadFailedException);\n\tTEST_THROWS(palette.loadFromString(\"{x = 1}\"), BlockTypePalette::LoadFailedException);  // Lua style\n\tTEST_THROWS(palette.loadFromString(\"$#^%&\"),   BlockTypePalette::LoadFailedException);\n}\n\n\n\n\n\n/** Tests that loading a simple JSON palette succeeds. */\nstatic void testLoadJsonSimple(void)\n{\n\tLOG(\"Testing loading a simple JSON palette\");\n\n\tBlockTypePalette palette;\n\n\tauto example = \" \\\n\t{ \\\n\t\t\\\"minecraft:air\\\": { \\\n\t\t\t\\\"states\\\": [ \\\n\t\t\t\t{ \\\n\t\t\t\t\t\\\"id\\\": 0, \\\n\t\t\t\t\t\\\"default\\\": true \\\n\t\t\t\t} \\\n\t\t\t] \\\n\t\t} \\\n\t}\";\n\n\tpalette.loadFromString(example);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:air\", BlockState()), (std::make_pair<UInt32, bool>(0, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:air\", BlockState({{\"foo\", \"baz\"}})).second, false);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:a\",   BlockState()).second, false);\n}\n\n\n\n\n\n/** Tests loading a complex block with multiple states and duplicates. */\nstatic void testLoadJsonComplex(void)\n{\n\tLOG(\"Testing loading a complex JSON palette\");\n\tBlockTypePalette palette;\n\tauto str = \" \\\n\t{ \\\n\t\t\\\"minecraft:oak_sapling\\\": { \\\n\t\t\\\"properties\\\": { \\\n\t\t\t\\\"stage\\\": [ \\\n\t\t\t\t\\\"0\\\", \\\n\t\t\t\t\\\"1\\\" \\\n\t\t\t] \\\n\t\t}, \\\n\t\t\t\\\"states\\\": [ \\\n\t\t\t\t{ \\\n\t\t\t\t\t\\\"properties\\\": { \\\n\t\t\t\t\t\t\\\"stage\\\": \\\"0\\\" \\\n\t\t\t\t\t}, \\\n\t\t\t\t\t\\\"id\\\" : 21, \\\n\t\t\t\t\t\\\"default\\\" : true \\\n\t\t\t\t}, \\\n\t\t\t\t{ \\\n\t\t\t\t\t\\\"properties\\\": { \\\n\t\t\t\t\t\t\\\"stage\\\": \\\"1\\\" \\\n\t\t\t\t\t}, \\\n\t\t\t\t\t\\\"id\\\" : 22 \\\n\t\t\t\t}, \\\n\t\t\t\t{ \\\n\t\t\t\t\t\\\"properties\\\": { \\\n\t\t\t\t\t\t\\\"stage\\\": \\\"1\\\" \\\n\t\t\t\t\t}, \\\n\t\t\t\t\t\\\"id\\\" : 23 \\\n\t\t\t\t}\\\n\t\t\t] \\\n\t\t} \\\n\t}\";\n\n\t// Note: The palette has a duplicate entry with differrent IDs, the latter ID wins\n\tpalette.loadFromString(str);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:oak_sapling\", {{\"stage\", \"10\"}}).second, false);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:oak_sapling\", {{\"stage\", \"0\"}}), (std::make_pair<UInt32, bool>(21, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:oak_sapling\", {{\"stage\", \"1\"}}), (std::make_pair<UInt32, bool>(23, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:oak_sapling\", {{\"foo\", \"baz\"}}).second, false);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:oak_sap\",     {{\"stage\", \"0\"}}).second, false);\n}\n\n\n\n\n\n/** Tests loading a palette from simple regular TSV text data. */\nstatic void testLoadTsvRegular(void)\n{\n\tLOG(\"Testing loading a simple regular TSV palette\");\n\tBlockTypePalette palette;\n\tauto str = \"\\\nBlockTypePalette\\r\\n\\\nFileVersion\\t1\\n\\\nCommonPrefix\\tminecraft:\\n\\\n\\r\\n\\\n0\\tair\\r\\n\\\n1\\tstone\\n\\\n2\\tgrass\\tsnow_covered\\t0\\n\\\n3\\tgrass\\tsnow_covered\\t1\\n\\\n\";\n\tpalette.loadFromString(str);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:air\",   BlockState()), (std::make_pair<UInt32, bool>(0, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:stone\", BlockState()), (std::make_pair<UInt32, bool>(1, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:grass\", BlockState({{\"snow_covered\", \"0\"}})), (std::make_pair<UInt32, bool>(2, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:grass\", BlockState({{\"snow_covered\", \"1\"}})), (std::make_pair<UInt32, bool>(3, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:air\",   BlockState({{\"snow_covered\", \"0\"}})).second, false);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:grass\", BlockState({{\"snow_covered\", \"2\"}})).second, false);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:grass\", BlockState()).second, false);\n}\n\n\n\n\n\n/** Tests loading a palette from simple upgrade TSV text data. */\nstatic void testLoadTsvUpgrade(void)\n{\n\tLOG(\"Testing loading a simple upgrade TSV palette\");\n\tBlockTypePalette palette;\n\tauto str = \"\\\nUpgradeBlockTypePalette\\r\\n\\\nFileVersion\\t1\\n\\\nCommonPrefix\\tminecraft:\\r\\n\\\n\\n\\\n0\\t0\\tair\\r\\n\\\n1\\t0\\tstone\\n\\\n2\\t0\\tgrass\\tsnow_covered\\t0\\n\\\n2\\t1\\tgrass\\tsnow_covered\\t1\\n\\\n\";\n\tpalette.loadFromString(str);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:air\",   BlockState()), (std::make_pair<UInt32, bool>(0, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:stone\", BlockState()), (std::make_pair<UInt32, bool>(16, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:grass\", BlockState({{\"snow_covered\", \"0\"}})), (std::make_pair<UInt32, bool>(32, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:grass\", BlockState({{\"snow_covered\", \"1\"}})), (std::make_pair<UInt32, bool>(33, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:air\",   BlockState({{\"snow_covered\", \"0\"}})).second, false);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:grass\", BlockState({{\"snow_covered\", \"2\"}})).second, false);\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:grass\", BlockState()).second, false);\n}\n\n\n\n\n\n/** Tests loading a palette from a real-life protocol base file (1.13). */\nstatic void testLoadFromBaseFile(void)\n{\n\tLOG(\"Testing loading a palette from file \\\"base.btp.txt\\\" (1.13)\");\n\tBlockTypePalette palette;\n\t{\n\t\tauto fileContents = cFile::ReadWholeFile(\"base.btp.txt\");\n\t\tcStopwatch sw(\"Loading palette\");\n\t\tpalette.loadFromString(fileContents);\n\t}\n\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:air\",   BlockState()), (std::make_pair<UInt32, bool>(0, true)));\n\tTEST_EQUAL(palette.maybeIndex(\"minecraft:stone\", BlockState()), (std::make_pair<UInt32, bool>(1, true)));\n\tTEST_EQUAL(\n\t\tpalette.maybeIndex(\n\t\t\t\"minecraft:dark_oak_leaves\",\n\t\t\tBlockState({{\"persistent\", \"false\"}, {\"distance\", \"6\"}})\n\t\t),\n\t\t(std::make_pair<UInt32, bool>(225, true))\n\t);\n\tTEST_EQUAL(\n\t\tpalette.maybeIndex(\n\t\t\t\"minecraft:dark_oak_leaves\",\n\t\t\tBlockState({{\"persistent\", \"false\"}})\n\t\t).second,\n\t\tfalse\n\t);\n}\n\n\n\n\n\n/** Tests loading an upgrade-palette from a real-life upgrade file. */\nstatic void testLoadFromUpgradeFile(void)\n{\n\tLOG(\"Testing loading an upgrade palette from file \\\"UpgradeBlockTypePalette.txt\\\".\");\n\tBlockTypePalette palette;\n\t{\n\t\tauto fileContents = cFile::ReadWholeFile(\"UpgradeBlockTypePalette.txt\");\n\t\tcStopwatch sw(\"Loading upgrade palette\");\n\t\tpalette.loadFromString(fileContents);\n\t}\n\n\tTEST_EQUAL(palette.entry(0), (std::make_pair<AString, BlockState>(\"minecraft:air\", {})));\n\tTEST_EQUAL(palette.entry(44 * 16 + 8), (std::make_pair<AString, BlockState>(\"minecraft:stone_slab\", {{\"type\", \"top\"}})));\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"BlockTypePalette\",\n\ttestBasic();\n\ttestTransformAddMissing();\n\ttestTransformWithFallback();\n\ttestLoadErrors();\n\ttestLoadJsonSimple();\n\ttestLoadJsonComplex();\n\ttestLoadTsvRegular();\n\ttestLoadTsvUpgrade();\n\ttestLoadFromBaseFile();\n\ttestLoadFromUpgradeFile();\n)\n\n\n\n\n"
  },
  {
    "path": "tests/BlockTypeRegistry/BlockTypeRegistryTest.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"Bindings/BlockTypeRegistry.h\"\n#include \"../TestHelpers.h\"\n\n\n\n\n/** Dummy BlockState implementation */\nclass BlockState\n{\npublic:\n\tBlockState() = default;\n};\n\n\n\n\n/** Dummy cBlockHandler implementation that allows simple checking for equality through mIdent. */\nclass cBlockHandler\n{\npublic:\n\tcBlockHandler(UInt32 aIdent):\n\t\tmIdent(aIdent)\n\t{\n\t}\n\n\tUInt32 mIdent;\n};\n\n\n\n\n\n/** Tests simple block type name registration.\nRegisters a block type, checks that the type is then registered. */\nstatic void testSimpleReg()\n{\n\tLOGD(\"Testing simple registration...\");\n\n\t// Register the block type:\n\tBlockTypeRegistry reg;\n\tAString blockTypeName(\"test:block1\");\n\tAString pluginName(\"testPlugin\");\n\tAString hint1(\"testHint1\");\n\tAString hint1Value(\"value1\");\n\tstd::shared_ptr<cBlockHandler> handler(new cBlockHandler(0x12345678));\n\tstd::map<AString, AString> hints = {{hint1, hint1Value}, {\"testHint2\", \"value2\"}};\n\tstd::map<AString, BlockInfo::HintCallback> hintCallbacks;\n\treg.registerBlockType(pluginName, blockTypeName, handler, hints, hintCallbacks);\n\n\t// Query the registration:\n\tauto blockInfo = reg.blockInfo(blockTypeName);\n\tTEST_NOTEQUAL(blockInfo, nullptr);\n\tTEST_EQUAL(blockInfo->blockTypeName(), blockTypeName);\n\tTEST_EQUAL(blockInfo->pluginName(), pluginName);\n\tTEST_EQUAL(blockInfo->handler(), handler);\n\tTEST_EQUAL(blockInfo->hintValue(hint1, BlockState()), hint1Value);\n\tTEST_EQUAL(blockInfo->hintValue(\"nonexistent\", BlockState()), \"\");\n}\n\n\n\n\n\n/** Tests setting and removing a BlockType hint. */\nstatic void testHintSetRemove()\n{\n\tLOGD(\"Testing hint addition and removal...\");\n\n\t// Register the block type:\n\tBlockTypeRegistry reg;\n\tAString blockTypeName(\"test:block1\");\n\tAString pluginName(\"testPlugin\");\n\tAString hint1(\"testHint1\");\n\tAString hint1Value(\"value1\");\n\tAString hint2(\"testHint2\");\n\tAString hint2Value(\"value2\");\n\tstd::shared_ptr<cBlockHandler> handler(new cBlockHandler(0x12345678));\n\tstd::map<AString, AString> hints = {{hint1, hint1Value}};\n\tstd::map<AString, BlockInfo::HintCallback> hintCallbacks;\n\treg.registerBlockType(pluginName, blockTypeName, handler, hints, hintCallbacks);\n\n\t// Modify the hints:\n\tauto blockInfo = reg.blockInfo(blockTypeName);\n\treg.setBlockTypeHint(blockTypeName, hint2, hint2Value);\n\tTEST_EQUAL(blockInfo->hintValue(hint2, BlockState()), hint2Value);  // Was created successfully\n\treg.setBlockTypeHint(blockTypeName, hint1, \"testValue2\");\n\tTEST_EQUAL(blockInfo->hintValue(hint1, BlockState()), \"testValue2\");  // Was updated successfully\n\treg.removeBlockTypeHint(blockTypeName, hint2);\n\tTEST_EQUAL(blockInfo->hintValue(hint2, BlockState()), \"\");  // Was removed successfully\n\n\t// Test the error reporting:\n\tTEST_THROWS(reg.setBlockTypeHint(\"nonexistent\", \"hint\", \"value\"), BlockTypeRegistry::NotRegisteredException);\n\treg.removeBlockTypeHint(blockTypeName, \"nonexistent\");  // Should fail silently\n}\n\n\n\n\n\n/** Tests that the plugin-based information is used correctly for registration.\nRegisters two different block types with two different plugins, then tries to re-register them from a different plugin.\nFinally removes the registration through removeAllByPlugin() and checks its success. */\nstatic void testPlugins()\n{\n\tLOGD(\"Testing plugin-based checks / removal...\");\n\n\t// Register the block types:\n\tBlockTypeRegistry reg;\n\tAString blockTypeName1(\"test:block1\");\n\tAString pluginName1(\"testPlugin1\");\n\tAString hint1(\"testHint1\");\n\tAString hint1Value(\"value1\");\n\tstd::shared_ptr<cBlockHandler> handler1(new cBlockHandler(1));\n\tstd::map<AString, AString> hints = {{hint1, hint1Value}, {\"testHint2\", \"value2\"}};\n\tstd::map<AString, BlockInfo::HintCallback> hintCallbacks;\n\treg.registerBlockType(pluginName1, blockTypeName1, handler1, hints, hintCallbacks);\n\tAString blockTypeName2(\"test:block2\");\n\tAString pluginName2(\"testPlugin2\");\n\tstd::shared_ptr<cBlockHandler> handler2(new cBlockHandler(2));\n\treg.registerBlockType(pluginName2, blockTypeName2, handler2, hints, hintCallbacks);\n\n\t// Test the refusal to register under a different plugin:\n\tTEST_THROWS(reg.registerBlockType(pluginName2, blockTypeName1, handler2, hints, hintCallbacks), BlockTypeRegistry::AlreadyRegisteredException);\n\tTEST_EQUAL(reg.blockInfo(blockTypeName1)->handler()->mIdent, 1);  // Did we overwrite the old registration?\n\treg.registerBlockType(pluginName1, blockTypeName1, handler1, hints, hintCallbacks);  // Re-registering must succeed\n\n\t// Unregister by plugin, then re-register from a different plugin:\n\treg.removeAllByPlugin(pluginName1);\n\tTEST_EQUAL(reg.blockInfo(blockTypeName1), nullptr);  // Unregistered successfully\n\tTEST_NOTEQUAL(reg.blockInfo(blockTypeName2), nullptr);  // Didn't unregister from the other plugin\n\tstd::shared_ptr<cBlockHandler> handler3(new cBlockHandler(3));\n\treg.registerBlockType(pluginName2, blockTypeName1, handler3, hints, hintCallbacks);\n\tTEST_NOTEQUAL(reg.blockInfo(blockTypeName1), nullptr);  // Registered successfully\n\tTEST_EQUAL(reg.blockInfo(blockTypeName1)->pluginName(), pluginName2);\n\tTEST_EQUAL(reg.blockInfo(blockTypeName1)->handler()->mIdent, 3);\n\tTEST_EQUAL(reg.blockInfo(blockTypeName2)->handler()->mIdent, 2);\n\treg.removeAllByPlugin(pluginName2);\n\tTEST_EQUAL(reg.blockInfo(blockTypeName1), nullptr);  // Unregistered successfully\n\tTEST_EQUAL(reg.blockInfo(blockTypeName2), nullptr);  // Unregistered successfully\n}\n\n\n\n\n/** Tests that the callback-based hints work properly. */\nstatic void testHintCallbacks()\n{\n\tLOGD(\"Testing hint callbacks...\");\n\n\t// Register the block type:\n\tBlockTypeRegistry reg;\n\tAString blockTypeName(\"test:block1\");\n\tAString pluginName(\"testPlugin\");\n\tAString hint1(\"testHint1\");\n\tAString hint1Value(\"value1\");\n\tAString hc1(\"hintCallback1\");\n\tint callbackCount = 0;\n\tauto callback1 = [&callbackCount](const AString & aBlockType, const BlockState & aBlockState)\n\t{\n\t\tcallbackCount = callbackCount + 1;\n\t\treturn aBlockType + \"_hint\";\n\t};\n\tstd::shared_ptr<cBlockHandler> handler(new cBlockHandler(0x12345678));\n\tstd::map<AString, AString> hints = {{hint1, hint1Value}, {\"testHint2\", \"value2\"}};\n\tstd::map<AString, BlockInfo::HintCallback> hintCallbacks = {{hc1, callback1}};\n\treg.registerBlockType(pluginName, blockTypeName, handler, hints, hintCallbacks);\n\n\t// Check that querying the hint using a callback works:\n\tTEST_EQUAL(reg.blockInfo(blockTypeName)->hintValue(hc1, BlockState()), blockTypeName + \"_hint\");\n\tTEST_EQUAL(callbackCount, 1);  // Called exactly once\n}\n\n\n\n\n\n/** Tests whether thread-locking works properly by running two threads,\none constantly (re-)registering and the other one constantly querying the same block type. */\nstatic void testThreadLocking()\n{\n\tLOGD(\"Testing thread locking...\");\n\n\t// Register the block type:\n\tBlockTypeRegistry reg;\n\tAString blockTypeName(\"test:block1\");\n\tAString pluginName(\"testPlugin\");\n\tAString hint1(\"testHint1\");\n\tAString hint1Value(\"value1\");\n\tstd::shared_ptr<cBlockHandler> handler(new cBlockHandler(0x12345678));\n\tstd::map<AString, AString> hints = {{hint1, hint1Value}, {\"testHint2\", \"value2\"}};\n\tstd::map<AString, BlockInfo::HintCallback> hintCallbacks;\n\treg.registerBlockType(pluginName, blockTypeName, handler, hints, hintCallbacks);\n\n\t// Run the two threads for at least a second:\n\tauto endTime = time(nullptr) + 2;\n\tauto keepRegistering = [&]()\n\t{\n\t\twhile (time(nullptr) < endTime)\n\t\t{\n\t\t\treg.registerBlockType(pluginName, blockTypeName, handler, hints, hintCallbacks);\n\t\t}\n\t};\n\tauto keepQuerying = [&]()\n\t{\n\t\tunsigned numQueries = 0;\n\t\twhile (time(nullptr) < endTime)\n\t\t{\n\t\t\tTEST_NOTEQUAL(reg.blockInfo(blockTypeName), nullptr);\n\t\t\tnumQueries += 1;\n\t\t}\n\t\tLOGD(\"%u queries have been executed\", numQueries);\n\t};\n\tstd::thread thr1(keepRegistering);\n\tstd::thread thr2(keepQuerying);\n\tthr1.join();\n\tthr2.join();\n}\n\n\n\n\n\nstatic void testBlockTypeRegistry()\n{\n\ttestSimpleReg();\n\ttestHintSetRemove();\n\ttestPlugins();\n\ttestHintCallbacks();\n\ttestThreadLocking();\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"BlockTypeRegistryTest\",\n\ttestBlockTypeRegistry();\n)\n"
  },
  {
    "path": "tests/BlockTypeRegistry/CMakeLists.txt",
    "content": "find_package(Threads REQUIRED)\ninclude_directories(${PROJECT_SOURCE_DIR}/src/)\n\n# Define individual test executables:\n\n# BlockStateTest: Verify that the BlockState class works as intended:\nadd_executable(BlockStateTest\n\tBlockStateTest.cpp\n\t../TestHelpers.h\n\t${PROJECT_SOURCE_DIR}/src/Bindings/BlockState.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n)\ntarget_link_libraries(BlockStateTest fmt::fmt)\nif (WIN32)\n\ttarget_link_libraries(BlockStateTest ws2_32)\nendif()\n\nadd_executable(BlockTypePaletteTest\n\tBlockTypePaletteTest.cpp\n\t../TestHelpers.h\n\t${PROJECT_SOURCE_DIR}/src/Bindings/BlockState.cpp\n\t${PROJECT_SOURCE_DIR}/src/Bindings/BlockTypePalette.cpp\n\t${PROJECT_SOURCE_DIR}/src/JsonUtils.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.cpp\n)\ntarget_link_libraries(BlockTypePaletteTest fmt::fmt jsoncpp_static)\nif (WIN32)\n\ttarget_link_libraries(BlockTypePaletteTest ws2_32)\nendif()\n\n# BlockTypeRegistryTest: Verify that the BlockTypeRegistry class works as intended:\nadd_executable(BlockTypeRegistryTest\n\tBlockTypeRegistryTest.cpp\n\t../TestHelpers.h\n\t${PROJECT_SOURCE_DIR}/src/Bindings/BlockTypeRegistry.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n)\ntarget_link_libraries(BlockTypeRegistryTest fmt::fmt Threads::Threads)\nif (WIN32)\n\ttarget_link_libraries(BlockTypeRegistryTest ws2_32)\nendif()\n\n# PalettedBlockAreaTest: Verify that the PalettedBlockArea class works as intended:\nadd_executable(PalettedBlockAreaTest\n\tPalettedBlockAreaTest.cpp\n\t../TestHelpers.h\n\t${PROJECT_SOURCE_DIR}/src/Bindings/BlockState.cpp\n\t${PROJECT_SOURCE_DIR}/src/Bindings/BlockTypeRegistry.cpp\n\t${PROJECT_SOURCE_DIR}/src/Bindings/BlockTypePalette.cpp\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.cpp\n\t${PROJECT_SOURCE_DIR}/src/JsonUtils.cpp\n\t${PROJECT_SOURCE_DIR}/src/PalettedBlockArea.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n)\ntarget_link_libraries(PalettedBlockAreaTest fmt::fmt jsoncpp_static)\nif (WIN32)\n\ttarget_link_libraries(PalettedBlockAreaTest ws2_32)\nendif()\n\n# Extra files for BlockTypePalette test:\nfile (COPY\n\t../../Server/Protocol/1.13/base.btp.txt\n\t../../Server/Protocol/UpgradeBlockTypePalette.txt\n\tDESTINATION ./\n)\n\n\n\n\n\n\n\n# Define individual tests:\n\nadd_test(NAME BlockStateTest        COMMAND BlockStateTest)\nadd_test(NAME BlockTypeRegistryTest COMMAND BlockTypeRegistryTest)\nadd_test(NAME BlockTypePaletteTest  COMMAND BlockTypePaletteTest)\nadd_test(NAME PalettedBlockAreaTest COMMAND PalettedBlockAreaTest)\n\n\n\n\n\n# Put all the tests into a solution folder (MSVC):\nset_target_properties(\n\tBlockStateTest\n\tBlockTypeRegistryTest\n\tBlockTypePaletteTest\n\tPalettedBlockAreaTest\n\tPROPERTIES FOLDER Tests/BlockTypeRegistry\n)\n"
  },
  {
    "path": "tests/BlockTypeRegistry/PalettedBlockAreaTest.cpp",
    "content": "#include \"Globals.h\"\n#include \"PalettedBlockArea.h\"\n#include \"../TestHelpers.h\"\n\n\n\n\n\n/** Tests creating a PBA. */\nstatic void testCreation()\n{\n\tLOG(\"Testing PBA creation...\");\n\n\t// Check failures:\n\tTEST_ASSERTS(PalettedBlockArea::createFilled({-2, 3, 4}, \"block\", BlockState()));  // Negative coords\n\tTEST_THROWS(PalettedBlockArea::createFilled({4096, 4096, 4096}, \"block\", BlockState()), std::runtime_error);  // Size too large for UInt32\n\n\t// Check that a created area really is filled:\n\tauto pba = PalettedBlockArea::createFilled({2, 3, 4}, \"block\", BlockState());\n\tTEST_EQUAL(pba.size(), Vector3i(2, 3, 4));\n\tTEST_EQUAL(pba.whole(), cCuboid({0, 0, 0}, {2, 3, 4}));\n\tTEST_EQUAL(pba.palette().count(), 1);\n\tTEST_EQUAL(pba.maybePaletteIndex(\"block\", BlockState()), (std::make_pair<UInt32, bool>(0, true)));\n\tTEST_EQUAL(pba.maybePaletteIndex(\"nonexistentBlock\", BlockState()).second, false);\n\tfor (int x = 0; x < 2; ++x)\n\t{\n\t\tfor (int y = 0; y < 3; ++y)\n\t\t{\n\t\t\tfor (int z = 0; z < 4; ++z)\n\t\t\t{\n\t\t\t\tTEST_EQUAL(pba.blockPaletteIndex({x, y, z}), 0);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Tests setting and getting blocks. */\nstatic void testSetting()\n{\n\tLOG(\"Testing PBA's set and get APIs...\");\n\tauto pba = PalettedBlockArea::createFilled({2, 3, 4}, \"block1\", BlockState());\n\tpba.setBlock({0, 0, 0}, \"block2\", BlockState());\n\tpba.setBlock({1, 0, 0}, \"block2\", BlockState(\"key1\", \"value1\"));\n\tTEST_ASSERTS(pba.setBlock({2, 0, 0}, \"block2\", BlockState()));  // Invalid coords\n\tpba.setBlock({0, 1, 0}, 1);\n\tTEST_ASSERTS(pba.setBlock({1, 1, 0}, 100));  // Invalid palette index\n\n\t// Check that the blocks have been set:\n\tTEST_EQUAL(pba.palette().count(), 3);\n\tTEST_EQUAL(pba.block({0, 0, 0}), (std::make_pair<AString, BlockState>(\"block2\", BlockState())));\n\tTEST_EQUAL(pba.block({1, 0, 0}), (std::make_pair<AString, BlockState>(\"block2\", BlockState(\"key1\", \"value1\"))));\n\tTEST_ASSERTS(pba.block({2, 0, 0}));  // Invalid coords\n\tTEST_EQUAL(pba.block({0, 1, 0}), (std::make_pair<AString, BlockState>(\"block2\", BlockState())));\n\tTEST_EQUAL(pba.block({1, 1, 0}), (std::make_pair<AString, BlockState>(\"block1\", BlockState())));  // Didn't overwrite with invalid palette index\n\tTEST_EQUAL(pba.blockPaletteIndex({0, 0, 0}), 1);\n\tTEST_EQUAL(pba.blockPaletteIndex({1, 0, 0}), 2);\n\tTEST_ASSERTS(pba.blockPaletteIndex({2, 0, 0}));  // Invalid coords\n\tTEST_EQUAL(pba.blockPaletteIndex({0, 1, 0}), 1);\n\tTEST_EQUAL(pba.blockPaletteIndex({1, 1, 0}), 0);  // Didn't overwrite with invalid palette index\n\n\t// Test filling:\n\tLOG(\"Testing PBA's fill API...\");\n\tpba.fill(\"block3\", BlockState(\"key1\", \"value1\"));\n\tTEST_EQUAL(pba.palette().count(), 1);\n\tTEST_EQUAL(pba.paletteEntry(0), (std::make_pair<AString, BlockState>(\"block3\", BlockState(\"key1\", \"value1\"))));\n\tfor (int x = 0; x < 2; ++x)\n\t{\n\t\tfor (int y = 0; y < 2; ++y)\n\t\t{\n\t\t\tfor (int z = 0; z < 2; ++z)\n\t\t\t{\n\t\t\t\tTEST_EQUAL(pba.blockPaletteIndex({x, y, z}), 0);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Creates pbaA and pbaB that are pre-filled with known content.\nThe PBAs are then used for paste()-testing.\nUsed to be a function, but clang-3.5 didn't like it (\"error: debug information for auto is not yet supported\"). */\n#define PREPARE_PASTING_PBAS \\\n\tauto pbaA = PalettedBlockArea::createFilled({5, 5, 5}, \"blockA\", BlockState()); \\\n\tfor (int x = 0; x < 5; ++x) \\\n\t{ \\\n\t\tfor (int y = 0; y < 5; ++y) \\\n\t\t{ \\\n\t\t\tfor (int z = 0; z < 5; ++z) \\\n\t\t\t{ \\\n\t\t\t\tpbaA.setBlock({x, y, z}, fmt::format(FMT_STRING(\"A-{}-{}-{}\"), x, y, z), BlockState()); \\\n\t\t\t} \\\n\t\t} \\\n\t} \\\n\tauto pbaB = PalettedBlockArea::createFilled({6, 6, 6}, \"blockB\", BlockState()); \\\n\tfor (int x = 0; x < 6; ++x) \\\n\t{ \\\n\t\tfor (int y = 0; y < 6; ++y) \\\n\t\t{ \\\n\t\t\tfor (int z = 0; z < 6; ++z) \\\n\t\t\t{ \\\n\t\t\t\tpbaB.setBlock({x, y, z}, fmt::format(FMT_STRING(\"B-{}-{}-{}\"), x, y, z), BlockState()); \\\n\t\t\t} \\\n\t\t} \\\n\t} \\\n\tdo { } while (false)\n\n\n\n\n\n// This is the data for the original PBA, before the paste() operations.\n// It is included here so that when adding new paste() tests we can simply copy it\n// into the test function and modify for the test.\n/*\nstatic const AString expected[5][5][5] =\n{\n\t{\n\t\t{\"A-0-0-0\", \"A-1-0-0\", \"A-2-0-0\", \"A-3-0-0\", \"A-4-0-0\"},\n\t\t{\"A-0-1-0\", \"A-1-1-0\", \"A-2-1-0\", \"A-3-1-0\", \"A-4-1-0\"},\n\t\t{\"A-0-2-0\", \"A-1-2-0\", \"A-2-2-0\", \"A-3-2-0\", \"A-4-2-0\"},\n\t\t{\"A-0-3-0\", \"A-1-3-0\", \"A-2-3-0\", \"A-3-3-0\", \"A-4-3-0\"},\n\t\t{\"A-0-4-0\", \"A-1-4-0\", \"A-2-4-0\", \"A-3-4-0\", \"A-4-4-0\"},\n\t},\n\t{\n\t\t{\"A-0-0-1\", \"A-1-0-1\", \"A-2-0-1\", \"A-3-0-1\", \"A-4-0-1\"},\n\t\t{\"A-0-1-1\", \"A-1-1-1\", \"A-2-1-1\", \"A-3-1-1\", \"A-4-1-1\"},\n\t\t{\"A-0-2-1\", \"A-1-2-1\", \"A-2-2-1\", \"A-3-2-1\", \"A-4-2-1\"},\n\t\t{\"A-0-3-1\", \"A-1-3-1\", \"A-2-3-1\", \"A-3-3-1\", \"A-4-3-1\"},\n\t\t{\"A-0-4-1\", \"A-1-4-1\", \"A-2-4-1\", \"A-3-4-1\", \"A-4-4-1\"},\n\t},\n\t{\n\t\t{\"A-0-0-2\", \"A-1-0-2\", \"A-2-0-2\", \"A-3-0-2\", \"A-4-0-2\"},\n\t\t{\"A-0-1-2\", \"A-1-1-2\", \"A-2-1-2\", \"A-3-1-2\", \"A-4-1-2\"},\n\t\t{\"A-0-2-2\", \"A-1-2-2\", \"A-2-2-2\", \"A-3-2-2\", \"A-4-2-2\"},\n\t\t{\"A-0-3-2\", \"A-1-3-2\", \"A-2-3-2\", \"A-3-3-2\", \"A-4-3-2\"},\n\t\t{\"A-0-4-2\", \"A-1-4-2\", \"A-2-4-2\", \"A-3-4-2\", \"A-4-4-2\"},\n\t},\n\t{\n\t\t{\"A-0-0-3\", \"A-1-0-3\", \"A-2-0-3\", \"A-3-0-3\", \"A-4-0-3\"},\n\t\t{\"A-0-1-3\", \"A-1-1-3\", \"A-2-1-3\", \"A-3-1-3\", \"A-4-1-3\"},\n\t\t{\"A-0-2-3\", \"A-1-2-3\", \"A-2-2-3\", \"A-3-2-3\", \"A-4-2-3\"},\n\t\t{\"A-0-3-3\", \"A-1-3-3\", \"A-2-3-3\", \"A-3-3-3\", \"A-4-3-3\"},\n\t\t{\"A-0-4-3\", \"A-1-4-3\", \"A-2-4-3\", \"A-3-4-3\", \"A-4-4-3\"},\n\t},\n\t{\n\t\t{\"A-0-0-4\", \"A-1-0-4\", \"A-2-0-4\", \"A-3-0-4\", \"A-4-0-4\"},\n\t\t{\"A-0-1-4\", \"A-1-1-4\", \"A-2-1-4\", \"A-3-1-4\", \"A-4-1-4\"},\n\t\t{\"A-0-2-4\", \"A-1-2-4\", \"A-2-2-4\", \"A-3-2-4\", \"A-4-2-4\"},\n\t\t{\"A-0-3-4\", \"A-1-3-4\", \"A-2-3-4\", \"A-3-3-4\", \"A-4-3-4\"},\n\t\t{\"A-0-4-4\", \"A-1-4-4\", \"A-2-4-4\", \"A-3-4-4\", \"A-4-4-4\"},\n\t},\n};\n*/\n\n\n\n\n\n/** Tests the \"paste()\" operation with the pasted region being completely inside the destination PBA. */\nstatic void testPastingCompletelyInside()\n{\n\tLOG(\"Testing the paste() API with destination completely inside (with cropping)...\");\n\tPREPARE_PASTING_PBAS;\n\tpbaA.paste(pbaB, cCuboid({1, 1, 1}, {4, 4, 4}), {1, 0, 0});  // Paste the 3x3x3 inside area from pbaB to pbaA, starting at {1, 0, 0}\n\tstatic const AString expected[5][5][5] =\n\t{\n\t\t{\n\t\t\t{\"A-0-0-0\", \"B-1-1-1\", \"B-2-1-1\", \"B-3-1-1\", \"A-4-0-0\"},\n\t\t\t{\"A-0-1-0\", \"B-1-2-1\", \"B-2-2-1\", \"B-3-2-1\", \"A-4-1-0\"},\n\t\t\t{\"A-0-2-0\", \"B-1-3-1\", \"B-2-3-1\", \"B-3-3-1\", \"A-4-2-0\"},\n\t\t\t{\"A-0-3-0\", \"A-1-3-0\", \"A-2-3-0\", \"A-3-3-0\", \"A-4-3-0\"},\n\t\t\t{\"A-0-4-0\", \"A-1-4-0\", \"A-2-4-0\", \"A-3-4-0\", \"A-4-4-0\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-1\", \"B-1-1-2\", \"B-2-1-2\", \"B-3-1-2\", \"A-4-0-1\"},\n\t\t\t{\"A-0-1-1\", \"B-1-2-2\", \"B-2-2-2\", \"B-3-2-2\", \"A-4-1-1\"},\n\t\t\t{\"A-0-2-1\", \"B-1-3-2\", \"B-2-3-2\", \"B-3-3-2\", \"A-4-2-1\"},\n\t\t\t{\"A-0-3-1\", \"A-1-3-1\", \"A-2-3-1\", \"A-3-3-1\", \"A-4-3-1\"},\n\t\t\t{\"A-0-4-1\", \"A-1-4-1\", \"A-2-4-1\", \"A-3-4-1\", \"A-4-4-1\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-2\", \"B-1-1-3\", \"B-2-1-3\", \"B-3-1-3\", \"A-4-0-2\"},\n\t\t\t{\"A-0-1-2\", \"B-1-2-3\", \"B-2-2-3\", \"B-3-2-3\", \"A-4-1-2\"},\n\t\t\t{\"A-0-2-2\", \"B-1-3-3\", \"B-2-3-3\", \"B-3-3-3\", \"A-4-2-2\"},\n\t\t\t{\"A-0-3-2\", \"A-1-3-2\", \"A-2-3-2\", \"A-3-3-2\", \"A-4-3-2\"},\n\t\t\t{\"A-0-4-2\", \"A-1-4-2\", \"A-2-4-2\", \"A-3-4-2\", \"A-4-4-2\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-3\", \"A-1-0-3\", \"A-2-0-3\", \"A-3-0-3\", \"A-4-0-3\"},\n\t\t\t{\"A-0-1-3\", \"A-1-1-3\", \"A-2-1-3\", \"A-3-1-3\", \"A-4-1-3\"},\n\t\t\t{\"A-0-2-3\", \"A-1-2-3\", \"A-2-2-3\", \"A-3-2-3\", \"A-4-2-3\"},\n\t\t\t{\"A-0-3-3\", \"A-1-3-3\", \"A-2-3-3\", \"A-3-3-3\", \"A-4-3-3\"},\n\t\t\t{\"A-0-4-3\", \"A-1-4-3\", \"A-2-4-3\", \"A-3-4-3\", \"A-4-4-3\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-4\", \"A-1-0-4\", \"A-2-0-4\", \"A-3-0-4\", \"A-4-0-4\"},\n\t\t\t{\"A-0-1-4\", \"A-1-1-4\", \"A-2-1-4\", \"A-3-1-4\", \"A-4-1-4\"},\n\t\t\t{\"A-0-2-4\", \"A-1-2-4\", \"A-2-2-4\", \"A-3-2-4\", \"A-4-2-4\"},\n\t\t\t{\"A-0-3-4\", \"A-1-3-4\", \"A-2-3-4\", \"A-3-3-4\", \"A-4-3-4\"},\n\t\t\t{\"A-0-4-4\", \"A-1-4-4\", \"A-2-4-4\", \"A-3-4-4\", \"A-4-4-4\"},\n\t\t},\n\t};\n\tfor (int x = 0; x < 5; ++x)\n\t{\n\t\tfor (int y = 0; y < 5; ++y)\n\t\t{\n\t\t\tfor (int z = 0; z < 5; ++z)\n\t\t\t{\n\t\t\t\tauto got = pbaA.block({x, y, z}).first;\n\t\t\t\tTEST_EQUAL_MSG(\n\t\t\t\t\tpbaA.block({x, y, z}).first,\n\t\t\t\t\texpected[z][y][x],\n\t\t\t\t\tfmt::format(FMT_STRING(\"{{{}, {}, {}}}, exp {}, got {}\"), x, y, z, expected[z][y][x], pbaA.block({x, y, z}).first)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Tests the \"paste()\" operation with the pasted region overflowing the destination PBA into the positive coords. */\nstatic void testPastingPositiveOverflow()\n{\n\tLOG(\"Testing the paste() API with positive overflow...\");\n\tPREPARE_PASTING_PBAS;\n\tpbaA.paste(pbaB, Vector3i{3, 2, 1});  // Paste the entire pbaB to pbaA, starting at {3, 2, 1}\n\tstatic const AString expected[5][5][5] =\n\t{\n\t\t{\n\t\t\t{\"A-0-0-0\", \"A-1-0-0\", \"A-2-0-0\", \"A-3-0-0\", \"A-4-0-0\"},\n\t\t\t{\"A-0-1-0\", \"A-1-1-0\", \"A-2-1-0\", \"A-3-1-0\", \"A-4-1-0\"},\n\t\t\t{\"A-0-2-0\", \"A-1-2-0\", \"A-2-2-0\", \"A-3-2-0\", \"A-4-2-0\"},\n\t\t\t{\"A-0-3-0\", \"A-1-3-0\", \"A-2-3-0\", \"A-3-3-0\", \"A-4-3-0\"},\n\t\t\t{\"A-0-4-0\", \"A-1-4-0\", \"A-2-4-0\", \"A-3-4-0\", \"A-4-4-0\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-1\", \"A-1-0-1\", \"A-2-0-1\", \"A-3-0-1\", \"A-4-0-1\"},\n\t\t\t{\"A-0-1-1\", \"A-1-1-1\", \"A-2-1-1\", \"A-3-1-1\", \"A-4-1-1\"},\n\t\t\t{\"A-0-2-1\", \"A-1-2-1\", \"A-2-2-1\", \"B-0-0-0\", \"B-1-0-0\"},\n\t\t\t{\"A-0-3-1\", \"A-1-3-1\", \"A-2-3-1\", \"B-0-1-0\", \"B-1-1-0\"},\n\t\t\t{\"A-0-4-1\", \"A-1-4-1\", \"A-2-4-1\", \"B-0-2-0\", \"B-1-2-0\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-2\", \"A-1-0-2\", \"A-2-0-2\", \"A-3-0-2\", \"A-4-0-2\"},\n\t\t\t{\"A-0-1-2\", \"A-1-1-2\", \"A-2-1-2\", \"A-3-1-2\", \"A-4-1-2\"},\n\t\t\t{\"A-0-2-2\", \"A-1-2-2\", \"A-2-2-2\", \"B-0-0-1\", \"B-1-0-1\"},\n\t\t\t{\"A-0-3-2\", \"A-1-3-2\", \"A-2-3-2\", \"B-0-1-1\", \"B-1-1-1\"},\n\t\t\t{\"A-0-4-2\", \"A-1-4-2\", \"A-2-4-2\", \"B-0-2-1\", \"B-1-2-1\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-3\", \"A-1-0-3\", \"A-2-0-3\", \"A-3-0-3\", \"A-4-0-3\"},\n\t\t\t{\"A-0-1-3\", \"A-1-1-3\", \"A-2-1-3\", \"A-3-1-3\", \"A-4-1-3\"},\n\t\t\t{\"A-0-2-3\", \"A-1-2-3\", \"A-2-2-3\", \"B-0-0-2\", \"B-1-0-2\"},\n\t\t\t{\"A-0-3-3\", \"A-1-3-3\", \"A-2-3-3\", \"B-0-1-2\", \"B-1-1-2\"},\n\t\t\t{\"A-0-4-3\", \"A-1-4-3\", \"A-2-4-3\", \"B-0-2-2\", \"B-1-2-2\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-4\", \"A-1-0-4\", \"A-2-0-4\", \"A-3-0-4\", \"A-4-0-4\"},\n\t\t\t{\"A-0-1-4\", \"A-1-1-4\", \"A-2-1-4\", \"A-3-1-4\", \"A-4-1-4\"},\n\t\t\t{\"A-0-2-4\", \"A-1-2-4\", \"A-2-2-4\", \"B-0-0-3\", \"B-1-0-3\"},\n\t\t\t{\"A-0-3-4\", \"A-1-3-4\", \"A-2-3-4\", \"B-0-1-3\", \"B-1-1-3\"},\n\t\t\t{\"A-0-4-4\", \"A-1-4-4\", \"A-2-4-4\", \"B-0-2-3\", \"B-1-2-3\"},\n\t\t},\n\t};\n\tfor (int x = 0; x < 5; ++x)\n\t{\n\t\tfor (int y = 0; y < 5; ++y)\n\t\t{\n\t\t\tfor (int z = 0; z < 5; ++z)\n\t\t\t{\n\t\t\t\tauto got = pbaA.block({x, y, z}).first;\n\t\t\t\tTEST_EQUAL_MSG(\n\t\t\t\t\tpbaA.block({x, y, z}).first,\n\t\t\t\t\texpected[z][y][x],\n\t\t\t\t\tfmt::format(FMT_STRING(\"{{{}, {}, {}}}, exp {}, got {}\"), x, y, z, expected[z][y][x], pbaA.block({x, y, z}).first)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Tests the \"paste()\" operation with the pasted region overflowing the destination PBA into the negative coords. */\nstatic void testPastingNegativeOverflow()\n{\n\tLOG(\"Testing the paste() API with negative overflow...\");\n\tPREPARE_PASTING_PBAS;\n\tpbaA.paste(pbaB, Vector3i{-4, -3, -2});  // Paste the entire pbaB to pbaA, starting at {-4, -3, -2}\n\tstatic const AString expected[5][5][5] =\n\t{\n\t\t{\n\t\t\t{\"B-4-3-2\", \"B-5-3-2\", \"A-2-0-0\", \"A-3-0-0\", \"A-4-0-0\"},\n\t\t\t{\"B-4-4-2\", \"B-5-4-2\", \"A-2-1-0\", \"A-3-1-0\", \"A-4-1-0\"},\n\t\t\t{\"B-4-5-2\", \"B-5-5-2\", \"A-2-2-0\", \"A-3-2-0\", \"A-4-2-0\"},\n\t\t\t{\"A-0-3-0\", \"A-1-3-0\", \"A-2-3-0\", \"A-3-3-0\", \"A-4-3-0\"},\n\t\t\t{\"A-0-4-0\", \"A-1-4-0\", \"A-2-4-0\", \"A-3-4-0\", \"A-4-4-0\"},\n\t\t},\n\t\t{\n\t\t\t{\"B-4-3-3\", \"B-5-3-3\", \"A-2-0-1\", \"A-3-0-1\", \"A-4-0-1\"},\n\t\t\t{\"B-4-4-3\", \"B-5-4-3\", \"A-2-1-1\", \"A-3-1-1\", \"A-4-1-1\"},\n\t\t\t{\"B-4-5-3\", \"B-5-5-3\", \"A-2-2-1\", \"A-3-2-1\", \"A-4-2-1\"},\n\t\t\t{\"A-0-3-1\", \"A-1-3-1\", \"A-2-3-1\", \"A-3-3-1\", \"A-4-3-1\"},\n\t\t\t{\"A-0-4-1\", \"A-1-4-1\", \"A-2-4-1\", \"A-3-4-1\", \"A-4-4-1\"},\n\t\t},\n\t\t{\n\t\t\t{\"B-4-3-4\", \"B-5-3-4\", \"A-2-0-2\", \"A-3-0-2\", \"A-4-0-2\"},\n\t\t\t{\"B-4-4-4\", \"B-5-4-4\", \"A-2-1-2\", \"A-3-1-2\", \"A-4-1-2\"},\n\t\t\t{\"B-4-5-4\", \"B-5-5-4\", \"A-2-2-2\", \"A-3-2-2\", \"A-4-2-2\"},\n\t\t\t{\"A-0-3-2\", \"A-1-3-2\", \"A-2-3-2\", \"A-3-3-2\", \"A-4-3-2\"},\n\t\t\t{\"A-0-4-2\", \"A-1-4-2\", \"A-2-4-2\", \"A-3-4-2\", \"A-4-4-2\"},\n\t\t},\n\t\t{\n\t\t\t{\"B-4-3-5\", \"B-5-3-5\", \"A-2-0-3\", \"A-3-0-3\", \"A-4-0-3\"},\n\t\t\t{\"B-4-4-5\", \"B-5-4-5\", \"A-2-1-3\", \"A-3-1-3\", \"A-4-1-3\"},\n\t\t\t{\"B-4-5-5\", \"B-5-5-5\", \"A-2-2-3\", \"A-3-2-3\", \"A-4-2-3\"},\n\t\t\t{\"A-0-3-3\", \"A-1-3-3\", \"A-2-3-3\", \"A-3-3-3\", \"A-4-3-3\"},\n\t\t\t{\"A-0-4-3\", \"A-1-4-3\", \"A-2-4-3\", \"A-3-4-3\", \"A-4-4-3\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-4\", \"A-1-0-4\", \"A-2-0-4\", \"A-3-0-4\", \"A-4-0-4\"},\n\t\t\t{\"A-0-1-4\", \"A-1-1-4\", \"A-2-1-4\", \"A-3-1-4\", \"A-4-1-4\"},\n\t\t\t{\"A-0-2-4\", \"A-1-2-4\", \"A-2-2-4\", \"A-3-2-4\", \"A-4-2-4\"},\n\t\t\t{\"A-0-3-4\", \"A-1-3-4\", \"A-2-3-4\", \"A-3-3-4\", \"A-4-3-4\"},\n\t\t\t{\"A-0-4-4\", \"A-1-4-4\", \"A-2-4-4\", \"A-3-4-4\", \"A-4-4-4\"},\n\t\t},\n\t};\n\tfor (int x = 0; x < 5; ++x)\n\t{\n\t\tfor (int y = 0; y < 5; ++y)\n\t\t{\n\t\t\tfor (int z = 0; z < 5; ++z)\n\t\t\t{\n\t\t\t\tauto got = pbaA.block({x, y, z}).first;\n\t\t\t\tTEST_EQUAL_MSG(\n\t\t\t\t\tpbaA.block({x, y, z}).first,\n\t\t\t\t\texpected[z][y][x],\n\t\t\t\t\tfmt::format(FMT_STRING(\"{{{}, {}, {}}}, exp {}, got {}\"), x, y, z, expected[z][y][x], pbaA.block({x, y, z}).first)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Tests the \"paste()\" operation with the pasted region overflowing the destination PBA into mixed positive and negative coords. */\nstatic void testPastingMixedOverflow()\n{\n\tLOG(\"Testing the paste() API with mixed positive and negative overflow...\");\n\tPREPARE_PASTING_PBAS;\n\tpbaA.paste(pbaB, Vector3i{-4, -3, 2});  // Paste the entire pbaB to pbaA, starting at {-4, -3, 2}\n\tstatic const AString expected[5][5][5] =\n\t{\n\t\t{\n\t\t\t{\"A-0-0-0\", \"A-1-0-0\", \"A-2-0-0\", \"A-3-0-0\", \"A-4-0-0\"},\n\t\t\t{\"A-0-1-0\", \"A-1-1-0\", \"A-2-1-0\", \"A-3-1-0\", \"A-4-1-0\"},\n\t\t\t{\"A-0-2-0\", \"A-1-2-0\", \"A-2-2-0\", \"A-3-2-0\", \"A-4-2-0\"},\n\t\t\t{\"A-0-3-0\", \"A-1-3-0\", \"A-2-3-0\", \"A-3-3-0\", \"A-4-3-0\"},\n\t\t\t{\"A-0-4-0\", \"A-1-4-0\", \"A-2-4-0\", \"A-3-4-0\", \"A-4-4-0\"},\n\t\t},\n\t\t{\n\t\t\t{\"A-0-0-1\", \"A-1-0-1\", \"A-2-0-1\", \"A-3-0-1\", \"A-4-0-1\"},\n\t\t\t{\"A-0-1-1\", \"A-1-1-1\", \"A-2-1-1\", \"A-3-1-1\", \"A-4-1-1\"},\n\t\t\t{\"A-0-2-1\", \"A-1-2-1\", \"A-2-2-1\", \"A-3-2-1\", \"A-4-2-1\"},\n\t\t\t{\"A-0-3-1\", \"A-1-3-1\", \"A-2-3-1\", \"A-3-3-1\", \"A-4-3-1\"},\n\t\t\t{\"A-0-4-1\", \"A-1-4-1\", \"A-2-4-1\", \"A-3-4-1\", \"A-4-4-1\"},\n\t\t},\n\t\t{\n\t\t\t{\"B-4-3-0\", \"B-5-3-0\", \"A-2-0-2\", \"A-3-0-2\", \"A-4-0-2\"},\n\t\t\t{\"B-4-4-0\", \"B-5-4-0\", \"A-2-1-2\", \"A-3-1-2\", \"A-4-1-2\"},\n\t\t\t{\"B-4-5-0\", \"B-5-5-0\", \"A-2-2-2\", \"A-3-2-2\", \"A-4-2-2\"},\n\t\t\t{\"A-0-3-2\", \"A-1-3-2\", \"A-2-3-2\", \"A-3-3-2\", \"A-4-3-2\"},\n\t\t\t{\"A-0-4-2\", \"A-1-4-2\", \"A-2-4-2\", \"A-3-4-2\", \"A-4-4-2\"},\n\t\t},\n\t\t{\n\t\t\t{\"B-4-3-1\", \"B-5-3-1\", \"A-2-0-3\", \"A-3-0-3\", \"A-4-0-3\"},\n\t\t\t{\"B-4-4-1\", \"B-5-4-1\", \"A-2-1-3\", \"A-3-1-3\", \"A-4-1-3\"},\n\t\t\t{\"B-4-5-1\", \"B-5-5-1\", \"A-2-2-3\", \"A-3-2-3\", \"A-4-2-3\"},\n\t\t\t{\"A-0-3-3\", \"A-1-3-3\", \"A-2-3-3\", \"A-3-3-3\", \"A-4-3-3\"},\n\t\t\t{\"A-0-4-3\", \"A-1-4-3\", \"A-2-4-3\", \"A-3-4-3\", \"A-4-4-3\"},\n\t\t},\n\t\t{\n\t\t\t{\"B-4-3-2\", \"B-5-3-2\", \"A-2-0-4\", \"A-3-0-4\", \"A-4-0-4\"},\n\t\t\t{\"B-4-4-2\", \"B-5-4-2\", \"A-2-1-4\", \"A-3-1-4\", \"A-4-1-4\"},\n\t\t\t{\"B-4-5-2\", \"B-5-5-2\", \"A-2-2-4\", \"A-3-2-4\", \"A-4-2-4\"},\n\t\t\t{\"A-0-3-4\", \"A-1-3-4\", \"A-2-3-4\", \"A-3-3-4\", \"A-4-3-4\"},\n\t\t\t{\"A-0-4-4\", \"A-1-4-4\", \"A-2-4-4\", \"A-3-4-4\", \"A-4-4-4\"},\n\t\t},\n\t};\n\tfor (int x = 0; x < 5; ++x)\n\t{\n\t\tfor (int y = 0; y < 5; ++y)\n\t\t{\n\t\t\tfor (int z = 0; z < 5; ++z)\n\t\t\t{\n\t\t\t\tauto got = pbaA.block({x, y, z}).first;\n\t\t\t\tTEST_EQUAL_MSG(\n\t\t\t\t\tpbaA.block({x, y, z}).first,\n\t\t\t\t\texpected[z][y][x],\n\t\t\t\t\tfmt::format(FMT_STRING(\"{{{}, {}, {}}}, exp {}, got {}\"), x, y, z, expected[z][y][x], pbaA.block({x, y, z}).first)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"PalettedBlockArea\",\n\ttestCreation();\n\ttestSetting();\n\ttestPastingCompletelyInside();\n\ttestPastingPositiveOverflow();\n\ttestPastingNegativeOverflow();\n\ttestPastingMixedOverflow();\n)\n"
  },
  {
    "path": "tests/BoundingBox/BoundingBoxTest.cpp",
    "content": "\n// ByteBufferTest.cpp\n\n// Implements the main app entrypoint for the cByteBuffer class test\n\n#include \"Globals.h\"\n#include \"BoundingBox.h\"\n\n\n\n\n\n/** Runs the tests, returns the number of failed tests. */\nstatic int Test(void)\n{\n\tint NumFailed = 0;\n\tVector3d Min(1, 1, 1);\n\tVector3d Max(2, 2, 2);\n\tVector3d LineDefs[] =\n\t{\n\t\tVector3d(1.5,   4, 1.5), Vector3d(1.5,   3, 1.5),  // Should intersect at 2,    face 1 (YP)\n\t\tVector3d(1.5,   0, 1.5), Vector3d(1.5,   4, 1.5),  // Should intersect at 0.25, face 0 (YM)\n\t\tVector3d(0,     0,   0), Vector3d(2,     2,   2),  // Should intersect at 0.5,  face 0, 3 or 5 (anyM)\n\t\tVector3d(0.999, 0, 1.5), Vector3d(0.999, 4, 1.5),  // Should not intersect\n\t\tVector3d(1.999, 0, 1.5), Vector3d(1.999, 4, 1.5),  // Should intersect at 0.25, face 0 (YM)\n\t\tVector3d(2.001, 0, 1.5), Vector3d(2.001, 4, 1.5),  // Should not intersect\n\t} ;\n\tbool Results[] = {true, true, true, false, true, false};\n\tdouble LineCoeffs[] = {2, 0.25, 0.5, 0, 0.25, 0};\n\n\tfor (size_t i = 0; i < ARRAYCOUNT(LineDefs) / 2; i++)\n\t{\n\t\tdouble LineCoeff;\n\t\teBlockFace Face;\n\t\tVector3d Line1 = LineDefs[2 * i];\n\t\tVector3d Line2 = LineDefs[2 * i + 1];\n\t\tbool res = cBoundingBox::CalcLineIntersection(Min, Max, Line1, Line2, LineCoeff, Face);\n\t\tif (res != Results[i])\n\t\t{\n\t\t\tLOGERROR(\"LineIntersection({%.02f, %.02f, %.02f}, {%.02f, %.02f, %.02f}) -> %d, %.05f, %d\",\n\t\t\t\tLine1.x, Line1.y, Line1.z,\n\t\t\t\tLine2.x, Line2.y, Line2.z,\n\t\t\t\tres ? 1 : 0, LineCoeff, Face\n\t\t\t);\n\t\t\tNumFailed += 1;\n\t\t}\n\t\tif (res)\n\t\t{\n\t\t\tif (std::abs(LineCoeff - LineCoeffs[i]) > 0.0000001)\n\t\t\t{\n\t\t\t\tLOGERROR(\"LineIntersection({%.02f, %.02f, %.02f}, {%.02f, %.02f, %.02f}) -> %d, %.05f, %d\",\n\t\t\t\t\tLine1.x, Line1.y, Line1.z,\n\t\t\t\t\tLine2.x, Line2.y, Line2.z,\n\t\t\t\t\tres ? 1 : 0, LineCoeff, Face\n\t\t\t\t);\n\t\t\t\tNumFailed += 1;\n\t\t\t}\n\t\t}\n\t}  // for i - LineDefs[]\n\treturn 0;\n}\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tLOGD(\"Test started\");\n\n\tLOGD(\"Running test\");\n\tauto NumFailed = Test();\n\tLOG(\"BoundingBox test finished, number of failed tests: %d\", NumFailed);\n\treturn NumFailed;\n}\n\n\n\n\n\n"
  },
  {
    "path": "tests/BoundingBox/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/BoundingBox.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.cpp\n)\n\nset (SHARED_HDRS\n\t${PROJECT_SOURCE_DIR}/src/BoundingBox.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.h\n)\n\nset (SRCS\n\tBoundingBoxTest.cpp\n)\n\n\nsource_group(\"Shared\" FILES ${SHARED_SRCS} ${SHARED_HDRS})\nsource_group(\"Sources\" FILES ${SRCS})\nadd_executable(BoundingBox-exe ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS})\ntarget_link_libraries(BoundingBox-exe fmt::fmt)\nadd_test(NAME BoundingBox-test COMMAND BoundingBox-exe)\n\n\n\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tBoundingBox-exe\n\tPROPERTIES FOLDER Tests\n)\n"
  },
  {
    "path": "tests/ByteBuffer/ByteBufferTest.cpp",
    "content": "\n// ByteBufferTest.cpp\n\n// Implements the main app entrypoint for the cByteBuffer class test\n\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"ByteBuffer.h\"\n\n\n\n\n\nstatic void TestRead(void)\n{\n\tcByteBuffer buf(50);\n\tbuf.Write(\"\\x05\\xac\\x02\\x00\", 4);\n\tUInt32 v1;\n\tTEST_TRUE(buf.ReadVarInt(v1));\n\tTEST_EQUAL(v1, 5);\n\tUInt32 v2;\n\tTEST_TRUE(buf.ReadVarInt(v2));\n\tTEST_EQUAL(v2, 300);\n\tUInt32 v3;\n\tTEST_TRUE(buf.ReadVarInt(v3));\n\tTEST_EQUAL(v3, 0);\n}\n\n\n\n\n\nstatic void TestWrite(void)\n{\n\tcByteBuffer buf(50);\n\tbuf.WriteVarInt32(5);\n\tbuf.WriteVarInt32(300);\n\tbuf.WriteVarInt32(0);\n\tContiguousByteBuffer All;\n\tbuf.ReadAll(All);\n\tTEST_EQUAL(All.size(), 4);\n\tTEST_EQUAL(memcmp(All.data(), \"\\x05\\xac\\x02\\x00\", All.size()), 0);\n}\n\n\n\n\n\nstatic void TestWrap(void)\n{\n\tcByteBuffer buf(3);\n\tfor (int i = 0; i < 1000; i++)\n\t{\n\t\tsize_t FreeSpace = buf.GetFreeSpace();\n\t\tTEST_EQUAL(buf.GetReadableSpace(), 0);\n\t\tTEST_GREATER_THAN_OR_EQUAL(FreeSpace, 1);\n\t\tTEST_TRUE(buf.Write(\"a\", 1));\n\t\tTEST_TRUE(buf.CanReadBytes(1));\n\t\tTEST_EQUAL(buf.GetReadableSpace(), 1);\n\t\tUInt8 v = 0;\n\t\tTEST_TRUE(buf.ReadBEUInt8(v));\n\t\tTEST_EQUAL(v, 'a');\n\t\tTEST_EQUAL(buf.GetReadableSpace(), 0);\n\t\tbuf.CommitRead();\n\t\tTEST_EQUAL(buf.GetFreeSpace(), FreeSpace);  // We're back to normal\n\t}\n}\n\n\n\n\n\nstatic void TestXYZPositionRoundtrip(void)\n{\n\tcByteBuffer buf(50);\n\tbuf.WriteXYZPosition64(-33554432, -2048, -33554432); // Testing the minimun values\n\tint x, y, z;\n\tTEST_TRUE(buf.ReadXYZPosition64(x, y, z));\n\tTEST_EQUAL(x, -33554432);\n\tTEST_EQUAL(y, -2048);\n\tTEST_EQUAL(z, -33554432);\n}\n\n\n\n\n\nstatic void TestXZYPositionRoundtrip(void)\n{\n\tcByteBuffer buf(50);\n\tbuf.WriteXZYPosition64(-33554432, -2048, -33554432); // Testing the minimun values\n\tint x, y, z;\n\tTEST_TRUE(buf.ReadXZYPosition64(x, y, z));\n\tTEST_EQUAL(x, -33554432);\n\tTEST_EQUAL(y, -2048);\n\tTEST_EQUAL(z, -33554432);\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"ByteBuffer\",\n\tTestRead();\n\tTestWrite();\n\tTestWrap();\n\tTestXYZPositionRoundtrip();\n\tTestXZYPositionRoundtrip();\n)\n"
  },
  {
    "path": "tests/ByteBuffer/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/ByteBuffer.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n)\n\nset (SHARED_HDRS\n\t../TestHelpers.h\n\t${PROJECT_SOURCE_DIR}/src/ByteBuffer.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n)\n\nset (SRCS\n\tByteBufferTest.cpp\n\tStubs.cpp\n)\n\nsource_group(\"Shared\" FILES ${SHARED_SRCS} ${SHARED_HDRS})\nsource_group(\"Sources\" FILES ${SRCS})\nadd_executable(ByteBuffer-exe ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS})\ntarget_link_libraries(ByteBuffer-exe fmt::fmt)\nif (WIN32)\n\ttarget_link_libraries(ByteBuffer-exe ws2_32)\nendif()\nadd_test(NAME ByteBuffer-test COMMAND ByteBuffer-exe)\n\n\n\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tByteBuffer-exe\n\tPROPERTIES FOLDER Tests\n)\n"
  },
  {
    "path": "tests/ByteBuffer/Stubs.cpp",
    "content": "\n// Stubs.cpp\n\n// Implements stubs of various Cuberite methods that are needed for linking but not for runtime\n// This is required so that we don't bring in the entire Cuberite via dependencies\n\n#include \"Globals.h\"\n#include \"UUID.h\"\n\n\n\n\nvoid cUUID::FromRaw(const std::array<Byte, 16> &){}\n\n\n\n"
  },
  {
    "path": "tests/CMakeLists.txt",
    "content": "if (CMAKE_BUILD_TYPE STREQUAL \"COVERAGE\")\n\tsetup_target_for_coverage(\"${PROJECT_NAME}_coverage\" \"ctest\" coverage)\nendif()\n\nadd_compile_definitions(TEST_GLOBALS)\n\nadd_subdirectory(BlockTypeRegistry)\nadd_subdirectory(BoundingBox)\nadd_subdirectory(ByteBuffer)\nadd_subdirectory(ChunkData)\nadd_subdirectory(CompositeChat)\nadd_subdirectory(FastRandom)\nadd_subdirectory(Generating)\nadd_subdirectory(HTTP)\nadd_subdirectory(LuaThreadStress)\nadd_subdirectory(Network)\nadd_subdirectory(OSSupport)\nadd_subdirectory(SchematicFileSerializer)\nadd_subdirectory(UUID)\n"
  },
  {
    "path": "tests/ChunkData/ArraytoCoord.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"ChunkData.h\"\n\n\n\n/** Performs the entire ArrayToCoords test. */\nstatic void test()\n{\n\t{\n\t\t// Test first segment (blocks)\n\t\tChunkBlockData buffer;\n\n\t\tBLOCKTYPE SrcBlockBuffer[16 * 16 * 256];\n\t\tmemset(SrcBlockBuffer, 0x00, sizeof(SrcBlockBuffer));\n\t\tSrcBlockBuffer[7 + (4 * 16) + (5 * 16 * 16)] = 0xcd;\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer, 0x00, sizeof(SrcNibbleBuffer));\n\t\tSrcNibbleBuffer[(6 + (1 * 16) + (2 * 16 * 16)) / 2] = 0xe;\n\n\t\tbuffer.SetAll(SrcBlockBuffer, SrcNibbleBuffer);\n\n\t\tTEST_EQUAL(buffer.GetBlock({ 7, 5, 4 }), 0xcd);\n\t\tTEST_EQUAL(buffer.GetMeta({ 6, 2, 1 }), 0xe);\n\t}\n\n\t{\n\t\t// Test first segment (lights)\n\t\tChunkLightData buffer;\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer, 0x00, sizeof(SrcNibbleBuffer));\n\t\tSrcNibbleBuffer[(6 + (1 * 16) + (2 * 16 * 16)) / 2] = 0xe;\n\n\t\tbuffer.SetAll(SrcNibbleBuffer, SrcNibbleBuffer);\n\n\t\tTEST_EQUAL(buffer.GetBlockLight({ 6, 2, 1 }), 0xe);\n\t\tTEST_EQUAL(buffer.GetSkyLight({ 6, 2, 1 }), 0xe);\n\t}\n\n\t{\n\t\t// test following segment (blocks)\n\t\tChunkBlockData buffer;\n\n\t\tBLOCKTYPE SrcBlockBuffer[16 * 16 * 256];\n\t\tmemset(SrcBlockBuffer, 0x00, sizeof(SrcBlockBuffer));\n\t\tSrcBlockBuffer[7 + (4 * 16) + (24 * 16 * 16)] = 0xcd;\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer, 0x00, sizeof(SrcNibbleBuffer));\n\t\tSrcNibbleBuffer[(6 + (1 * 16) + (24 * 16 * 16)) / 2] = 0xe;\n\n\t\tbuffer.SetAll(SrcBlockBuffer, SrcNibbleBuffer);\n\n\t\tTEST_EQUAL(buffer.GetBlock({ 7, 24, 4 }), 0xcd);\n\t\tTEST_EQUAL(buffer.GetMeta({ 6, 24, 1 }), 0xe);\n\t}\n\n\t{\n\t\t// test following segment (lights)\n\t\tChunkLightData buffer;\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer, 0x00, sizeof(SrcNibbleBuffer));\n\t\tSrcNibbleBuffer[(6 + (1 * 16) + (24 * 16 * 16)) / 2] = 0xe;\n\n\t\tbuffer.SetAll(SrcNibbleBuffer, SrcNibbleBuffer);\n\n\t\tTEST_EQUAL(buffer.GetBlockLight({ 6, 24, 1 }), 0xe);\n\t\tTEST_EQUAL(buffer.GetSkyLight({ 6, 24, 1 }), 0xe);\n\t}\n\n\t{\n\t\t// test zeros (blocks)\n\t\tChunkBlockData buffer;\n\n\t\tBLOCKTYPE SrcBlockBuffer[16 * 16 * 256];\n\t\tmemset(SrcBlockBuffer, 0x00, sizeof(SrcBlockBuffer));\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer, 0x00, sizeof(SrcNibbleBuffer));\n\n\t\tbuffer.SetAll(SrcBlockBuffer, SrcNibbleBuffer);\n\n\t\tTEST_EQUAL(buffer.GetBlock({ 7, 24, 4 }), 0x00);\n\t\tTEST_EQUAL(buffer.GetMeta({ 6, 24, 1 }), 0x0);\n\t}\n\n\t{\n\t\t// test zeros (lights)\n\t\tChunkLightData buffer;\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer, 0x00, sizeof(SrcNibbleBuffer));\n\n\t\tNIBBLETYPE SrcNibbleBuffer2[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer2, 0xff, sizeof(SrcNibbleBuffer2));\n\n\t\tbuffer.SetAll(SrcNibbleBuffer, SrcNibbleBuffer2);\n\n\t\tTEST_EQUAL(buffer.GetBlockLight({ 6, 24, 1 }), 0x0);\n\t\tTEST_EQUAL(buffer.GetSkyLight({ 6, 24, 1 }), 0xf);\n\t}\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"ChunkData ArrayToCoord\",\n\ttest();\n)\n"
  },
  {
    "path": "tests/ChunkData/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\n\nadd_library(ChunkBuffer ${PROJECT_SOURCE_DIR}/src/ChunkData.cpp ${PROJECT_SOURCE_DIR}/src/StringUtils.cpp)\n\ntarget_link_libraries(ChunkBuffer PUBLIC fmt::fmt)\n\nadd_executable(creatable-exe Creatable.cpp)\ntarget_link_libraries(creatable-exe ChunkBuffer)\nadd_test(NAME creatable-test COMMAND creatable-exe)\n\nadd_executable(coordinates-exe Coordinates.cpp)\ntarget_link_libraries(coordinates-exe ChunkBuffer)\nadd_test(NAME coordinates-test COMMAND coordinates-exe)\n\nadd_executable(copies-exe Copies.cpp)\ntarget_link_libraries(copies-exe ChunkBuffer)\nadd_test(NAME copies-test COMMAND copies-exe)\n\nadd_executable(arraystocoords-exe ArraytoCoord.cpp)\ntarget_link_libraries(arraystocoords-exe ChunkBuffer)\nadd_test(NAME arraystocoords-test COMMAND arraystocoords-exe)\n\n# Put all test projects into a separate folder:\nset_target_properties(\n\tarraystocoords-exe\n\tcoordinates-exe\n\tcopies-exe\n\tcreatable-exe\n\tPROPERTIES FOLDER Tests/ChunkData\n)\nset_target_properties(\n\tChunkBuffer\n\tPROPERTIES FOLDER Tests/Libraries\n)\n"
  },
  {
    "path": "tests/ChunkData/Coordinates.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"ChunkData.h\"\n\n\n\n\n/** Performs the entire cChunkData coordinates test. */\nstatic void test()\n{\n\t{\n\t\tChunkBlockData buffer;\n\n\t\t// Empty chunks\n\t\tbuffer.SetBlock({ 0, 0, 0 }, 0xAB);\n\t\tTEST_EQUAL(buffer.GetBlock({ 0, 0, 0 }), 0xAB);\n\t\tbuffer.SetMeta({ 0, 16, 0 }, 0xC);\n\t\tTEST_EQUAL(buffer.GetMeta({ 0, 16, 0 }), 0xC);\n\n\t\t// loaded but not written segments\n\t\tTEST_EQUAL(buffer.GetBlock({ 1, 0, 0 }), 0x0);\n\t\tTEST_EQUAL(buffer.GetMeta({ 1, 16, 0 }), 0x0);\n\n\t\t// Notloaded segments\n\t\tTEST_EQUAL(buffer.GetBlock({ 0, 32, 0 }), 0x0);\n\t\tTEST_EQUAL(buffer.GetMeta({ 0, 48, 0 }), 0x0);\n\n\t\t// Out of range GetBlock\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetBlock({ -1, 0, 0 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetBlock({ 0, -1, 0 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetBlock({ 0, 0, -1 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetBlock({ 256, 0, 0 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetBlock({ 0, 256, 0 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetBlock({ 0, 0, 256 });\n\t\t);\n\n\t\t// Out of range SetBlock\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetBlock({ -1, 0, 0 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetBlock({ 0, -1, 0 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetBlock({ 0, 0, -1 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetBlock({ 256, 0, 0 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetBlock({ 0, 256, 0 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetBlock({ 0, 0, 256 }, 0)\n\t\t);\n\n\t\t// Out of range GetMeta\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetMeta({ -1, 0, 0 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetMeta({ 0, -1, 0 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetMeta({ 0, 0, -1 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetMeta({ 256, 0, 0 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetMeta({ 0, 256, 0 });\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.GetMeta({ 0, 0, 256 });\n\t\t);\n\n\t\t// Out of range SetMeta\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetMeta({ -1, 0, 0 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetMeta({ 0, -1, 0 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetMeta({ 0, 0, -1 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetMeta({ 256, 0, 0 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetMeta({ 0, 256, 0 }, 0)\n\t\t);\n\t\tTEST_ASSERTS(\n\t\t\tbuffer.SetMeta({ 0, 0, 256 }, 0)\n\t\t);\n\t}\n\n\t{\n\t\tChunkBlockData buffer;\n\n\t\t// Zero's\n\t\tbuffer.SetBlock({ 0, 0, 0 }, 0x0);\n\t\tbuffer.SetBlock({ 0, 0, 1 }, 0xab);\n\t\tTEST_EQUAL(buffer.GetBlock({ 0, 0, 0 }), 0x0);\n\t\tTEST_EQUAL(buffer.GetBlock({ 0, 0, 1 }), 0xab);\n\n\t\tbuffer.SetMeta({ 0, 16, 0 }, 0x0);\n\t\tbuffer.SetMeta({ 0, 16, 1 }, 0xc);\n\t\tTEST_EQUAL(buffer.GetMeta({ 0, 16, 0 }), 0x0);\n\t\tTEST_EQUAL(buffer.GetMeta({ 0, 16, 1 }), 0xc);\n\t}\n\n\n\t{\n\t\t// Operator =\n\t\tChunkBlockData buffer;\n\t\tbuffer.SetBlock({ 0, 0, 0 }, 0x42);\n\t\tChunkBlockData copy;\n\t\tcopy = std::move(buffer);\n\t\tTEST_EQUAL(copy.GetBlock({ 0, 0, 0 }), 0x42);\n\t}\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"ChunkData Coordinates\",\n\ttest();\n)\n"
  },
  {
    "path": "tests/ChunkData/Copies.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"ChunkData.h\"\n\n\n\n\n\n/** Helper that copies a data store into a contiguous flat array, filling in a default value for sections that aren't present. */\ntemplate <class StoreType, typename GetType, typename DefaultType, typename OutType>\nstatic void CopyAll(const StoreType & Data, GetType Getter, DefaultType Default, OutType & Out)\n{\n\tconstexpr auto SectionCount = std::extent_v<OutType> / 16;\n\n\tfor (size_t Y = 0; Y != 16; Y++)\n\t{\n\t\tconst auto Section = (Data.*Getter)(Y);\n\t\tstatic_assert(SectionCount == std::tuple_size<std::remove_pointer_t<decltype(Section)>>::value, \"Output array has wrong size\");\n\n\t\tif (Section == nullptr)\n\t\t{\n\t\t\tstd::fill_n(Out + Y * SectionCount, SectionCount, Default);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstd::copy(Section->begin(), Section->end(), Out + Y * SectionCount);\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Performs the entire Copies test. */\nstatic void Test()\n{\n\tLOGD(\"Test started\");\n\n\t{\n\t\tChunkBlockData buffer;\n\n\t\tbuffer.SetBlock({ 3, 1, 4 }, 0xDE);\n\t\tbuffer.SetMeta({ 3, 1, 4 }, 0xA);\n\n\t\tChunkBlockData copy;\n\t\tcopy.Assign(buffer);\n\t\tTEST_EQUAL(copy.GetBlock({ 3, 1, 4 }), 0xDE);\n\t\tTEST_EQUAL(copy.GetMeta({ 3, 1, 4 }), 0xA);\n\n\t\tBLOCKTYPE SrcBlockBuffer[16 * 16 * 256];\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2]{};\n\t\tfor (int i = 0; i < 16 * 16 * 256; i += 4)\n\t\t{\n\t\t\tSrcBlockBuffer[i + 0] = 0xde;\n\t\t\tSrcBlockBuffer[i + 1] = 0xad;\n\t\t\tSrcBlockBuffer[i + 2] = 0xbe;\n\t\t\tSrcBlockBuffer[i + 3] = 0xef;\n\t\t}\n\n\t\tbuffer.SetAll(SrcBlockBuffer, SrcNibbleBuffer);\n\t\tBLOCKTYPE DstBlockBuffer[16 * 16 * 256];\n\t\tCopyAll(buffer, &ChunkBlockData::GetSection, ChunkBlockData::DefaultValue, DstBlockBuffer);\n\t\tTEST_EQUAL(memcmp(SrcBlockBuffer, DstBlockBuffer, (16 * 16 * 256) - 1), 0);\n\n\t\tmemset(SrcBlockBuffer, 0x00, 16 * 16 * 256);\n\t\tbuffer.SetAll(SrcBlockBuffer, SrcNibbleBuffer);\n\t\tCopyAll(buffer, &ChunkBlockData::GetSection, ChunkBlockData::DefaultValue, DstBlockBuffer);\n\t\tTEST_EQUAL(memcmp(SrcBlockBuffer, DstBlockBuffer, (16 * 16 * 256) - 1), 0);\n\t}\n\n\t{\n\t\tChunkBlockData buffer;\n\n\t\tBLOCKTYPE SrcBlockBuffer[16 * 16 * 256]{};\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tfor (int i = 0; i < 16 * 16 * 256 / 2; i += 4)\n\t\t{\n\t\t\tSrcNibbleBuffer[i + 0] = 0xde;\n\t\t\tSrcNibbleBuffer[i + 1] = 0xad;\n\t\t\tSrcNibbleBuffer[i + 2] = 0xbe;\n\t\t\tSrcNibbleBuffer[i + 3] = 0xef;\n\t\t}\n\n\t\tbuffer.SetAll(SrcBlockBuffer, SrcNibbleBuffer);\n\t\tNIBBLETYPE DstNibbleBuffer[16 * 16 * 256/ 2];\n\t\tCopyAll(buffer, &ChunkBlockData::GetMetaSection, ChunkBlockData::DefaultMetaValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 / 2) - 1), 0);\n\n\t\tmemset(SrcNibbleBuffer, 0x00, 16 * 16 * 256 /2);\n\t\tbuffer.SetAll(SrcBlockBuffer, SrcNibbleBuffer);\n\t\tCopyAll(buffer, &ChunkBlockData::GetMetaSection, ChunkBlockData::DefaultMetaValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 / 2) - 1), 0);\n\t}\n\n\t{\n\t\tChunkLightData buffer;\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tfor (int i = 0; i < 16 * 16 * 256 / 2; i += 4)\n\t\t{\n\t\t\tSrcNibbleBuffer[i + 0] = 0xde;\n\t\t\tSrcNibbleBuffer[i + 1] = 0xad;\n\t\t\tSrcNibbleBuffer[i + 2] = 0xbe;\n\t\t\tSrcNibbleBuffer[i + 3] = 0xef;\n\t\t}\n\n\t\tbuffer.SetAll(SrcNibbleBuffer, SrcNibbleBuffer);\n\t\tNIBBLETYPE DstNibbleBuffer[16 * 16 * 256 / 2];\n\t\tCopyAll(buffer, &ChunkLightData::GetBlockLightSection, ChunkLightData::DefaultBlockLightValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 /2) - 1), 0);\n\n\t\tmemset(SrcNibbleBuffer, 0x00, 16 * 16 * 256 /2);\n\t\tbuffer.SetAll(SrcNibbleBuffer, SrcNibbleBuffer);\n\t\tCopyAll(buffer, &ChunkLightData::GetBlockLightSection, ChunkLightData::DefaultBlockLightValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 /2) - 1), 0);\n\t}\n\n\t{\n\t\tChunkLightData buffer;\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tfor (int i = 0; i < 16 * 16 * 256 / 2; i += 4)\n\t\t{\n\t\t\tSrcNibbleBuffer[i + 0] = 0xde;\n\t\t\tSrcNibbleBuffer[i + 1] = 0xad;\n\t\t\tSrcNibbleBuffer[i + 2] = 0xbe;\n\t\t\tSrcNibbleBuffer[i + 3] = 0xef;\n\t\t}\n\n\t\tbuffer.SetAll(SrcNibbleBuffer, SrcNibbleBuffer);\n\t\tNIBBLETYPE DstNibbleBuffer[16 * 16 * 256/ 2];\n\t\tCopyAll(buffer, &ChunkLightData::GetSkyLightSection, ChunkLightData::DefaultSkyLightValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 / 2) - 1), 0);\n\n\t\tmemset(SrcNibbleBuffer, 0xFF, 16 * 16 * 256 / 2);\n\t\tbuffer.SetAll(SrcNibbleBuffer, SrcNibbleBuffer);\n\t\tCopyAll(buffer, &ChunkLightData::GetSkyLightSection, ChunkLightData::DefaultSkyLightValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 / 2) - 1), 0);\n\t}\n\n\t{\n\t\tChunkBlockData buffer;\n\n\t\tBLOCKTYPE SrcBlockBuffer[16 * 16 * 256];\n\t\tmemset(SrcBlockBuffer, 0x00, 16 * 16 * 256);\n\t\tBLOCKTYPE DstBlockBuffer[16 * 16 * 256];\n\t\tCopyAll(buffer, &ChunkBlockData::GetSection, ChunkBlockData::DefaultValue, DstBlockBuffer);\n\t\tTEST_EQUAL(memcmp(SrcBlockBuffer, DstBlockBuffer, (16 * 16 * 256) - 1), 0);\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer, 0x00, 16 * 16 * 256 / 2);\n\t\tNIBBLETYPE DstNibbleBuffer[16 * 16 * 256 / 2];\n\t\tCopyAll(buffer, &ChunkBlockData::GetMetaSection, ChunkBlockData::DefaultMetaValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 / 2) - 1), 0);\n\t}\n\n\t{\n\t\tChunkLightData buffer;\n\n\t\tNIBBLETYPE SrcNibbleBuffer[16 * 16 * 256 / 2];\n\t\tmemset(SrcNibbleBuffer, 0x00, 16 * 16 * 256 / 2);\n\t\tNIBBLETYPE DstNibbleBuffer[16 * 16 * 256 / 2];\n\t\tCopyAll(buffer, &ChunkLightData::GetBlockLightSection, ChunkLightData::DefaultBlockLightValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 / 2) - 1), 0);\n\n\t\tmemset(SrcNibbleBuffer, 0xFF, 16 * 16 * 256 / 2);\n\t\tCopyAll(buffer, &ChunkLightData::GetSkyLightSection, ChunkLightData::DefaultSkyLightValue, DstNibbleBuffer);\n\t\tTEST_EQUAL(memcmp(SrcNibbleBuffer, DstNibbleBuffer, (16 * 16 * 256 / 2) - 1), 0);\n\t}\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"ChunkData Copies\",\n\tTest()\n)\n"
  },
  {
    "path": "tests/ChunkData/Creatable.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"ChunkData.h\"\n\n\n\n\n\nstatic void Test()\n{\n\tLOGD(\"Test started\");\n\n\tChunkBlockData train;\n\tChunkLightData buffer;\n\n\t/*\n\n\t         /-|===D\n\t        /  |===D\n\t       /---|\n\t      /    |\n\t ====/=====|===============\n\n\t*/\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"ChunkData Creatable\",\n\tTest()\n);\n"
  },
  {
    "path": "tests/CompositeChat/CMakeLists.txt",
    "content": "include_directories(${CMAKE_CURRENT_SOURCE_DIR})\ninclude_directories(${PROJECT_SOURCE_DIR}/src/)\ninclude_directories(${PROJECT_SOURCE_DIR}/lib/jsoncpp/include)\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/CompositeChat.cpp\n\t${PROJECT_SOURCE_DIR}/src/JsonUtils.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n)\n\nset (SHARED_HDRS\n\t../TestHelpers.h\n\t${PROJECT_SOURCE_DIR}/src/CompositeChat.h\n\t${PROJECT_SOURCE_DIR}/src/JsonUtils.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n)\n\nset (SRCS\n\tCompositeChatTest.cpp\n\tClientHandle.cpp\n)\n\n\nsource_group(\"Shared\" FILES ${SHARED_SRCS} ${SHARED_HDRS})\nsource_group(\"Sources\" FILES ${SRCS})\nadd_executable(CompositeChat-exe ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS})\ntarget_link_libraries(CompositeChat-exe jsoncpp_static fmt::fmt)\nif (WIN32)\n\ttarget_link_libraries(CompositeChat-exe ws2_32)\nendif()\nadd_test(NAME CompositeChat-test COMMAND CompositeChat-exe)\n\n\n\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tCompositeChat-exe\n\tPROPERTIES FOLDER Tests\n)\n"
  },
  {
    "path": "tests/CompositeChat/ClientHandle.cpp",
    "content": "\n// ClientHandle.cpp\n\n// Mocks the cClientHandle class used by the tests\n\n#include \"Globals.h\"\n#include \"ClientHandle.h\"\n\n\n\n\n\nAString cClientHandle::FormatMessageType(bool a_ShouldShowPrefixes, eMessageType a_MsgType, const AString & a_AdditionalData)\n{\n\treturn \"<FormatMessageType mocked>\";\n}\n\n\n\n\n"
  },
  {
    "path": "tests/CompositeChat/CompositeChatTest.cpp",
    "content": "\n// CompositeChatTest.cpp\n\n// Implements the main app entrypoint for the cCompositeChat class test\n\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"CompositeChat.h\"\n\n\n\n\n\nstatic void TestParser1(void)\n{\n\tcCompositeChat Msg;\n\tMsg.ParseText(\"Testing &2color codes and http://links parser\");\n\tconst auto & Parts = Msg.GetParts();\n\tTEST_EQUAL(Parts.size(), 4);\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[0]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[0]).Style, \"\");\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[1]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[1]).Style, \"2\");\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::UrlPart>(Parts[2]));\n\tTEST_EQUAL(std::get<cCompositeChat::UrlPart>(Parts[2]).Style, \"2\");\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[3]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[3]).Style, \"2\");\n}\n\n\n\n\n\nstatic void TestParser2(void)\n{\n\tcCompositeChat Msg;\n\tMsg.ParseText(\"&3Advanced stuff: &5overriding color codes and http://links.with/&4color-in-them handling\");\n\tconst auto & Parts = Msg.GetParts();\n\tTEST_EQUAL(Parts.size(), 4);\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[0]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[0]).Style, \"3\");\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[1]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[1]).Style, \"35\");\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::UrlPart>(Parts[2]));\n\tTEST_EQUAL(std::get<cCompositeChat::UrlPart>(Parts[2]).Style, \"35\");\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[3]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[3]).Style, \"35\");\n}\n\n\n\n\n\nstatic void TestParser3(void)\n{\n\tcCompositeChat Msg;\n\tMsg.ParseText(\"http://links.starting the text\");\n\tconst auto & Parts = Msg.GetParts();\n\tTEST_EQUAL(Parts.size(), 2);\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::UrlPart>(Parts[0]));\n\tTEST_EQUAL(std::get<cCompositeChat::UrlPart>(Parts[0]).Style, \"\");\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[1]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[1]).Style, \"\");\n}\n\n\n\n\n\nstatic void TestParser4(void)\n{\n\tcCompositeChat Msg;\n\tMsg.ParseText(\"links finishing the text: http://some.server\");\n\tconst auto & Parts = Msg.GetParts();\n\tTEST_EQUAL(Parts.size(), 2);\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[0]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[0]).Style, \"\");\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::UrlPart>(Parts[1]));\n\tTEST_EQUAL(std::get<cCompositeChat::UrlPart>(Parts[1]).Style, \"\");\n}\n\n\n\n\n\nstatic void TestParser5(void)\n{\n\tcCompositeChat Msg;\n\tMsg.ParseText(\"http://only.links\");\n\tconst auto & Parts = Msg.GetParts();\n\tTEST_EQUAL(Parts.size(), 1);\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::UrlPart>(Parts[0]));\n\tTEST_EQUAL(std::get<cCompositeChat::UrlPart>(Parts[0]).Style, \"\");\n}\n\n\n\n\n\nstatic void TestParser6(void)\n{\n\tcCompositeChat Msg;\n\tMsg.ParseText(\"Hello World\");\n\tconst auto & Parts = Msg.GetParts();\n\tTEST_EQUAL(Parts.size(), 1);\n\n\tTEST_TRUE(std::holds_alternative<cCompositeChat::TextPart>(Parts[0]));\n\tTEST_EQUAL(std::get<cCompositeChat::TextPart>(Parts[0]).Style, \"\");\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"CompositeChat\",\n\tTestParser1();\n\tTestParser2();\n\tTestParser3();\n\tTestParser4();\n\tTestParser5();\n\tTestParser6();\n)\n"
  },
  {
    "path": "tests/ConsoleColors/ConsoleColors.cpp",
    "content": "\n// ConsoleColors.cpp\n\n// Tests the various console color combinations\n\n#include <stdio.h>\n#include <stdlib.h>\n\n\n\n\n\n/// Evaluates to the number of elements in an array (compile-time!)\n#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))\n\n\n\n\n\nint main(void)\n{\n\tstatic const char * Attribs[] =\n\t{\n\t\t\"0\",  // All attribs off\n\t\t\"1\",  // bold\n\t\t\"2\",  // faint\n\t\t\"7\",  // inverse\n\t\t\"1;7\",  // bold inverse\n\t\t\"2;7\",  // faint inverse\n\t} ;\n\tfor (int i = 0; i < ARRAYCOUNT(Attribs); i++)\n\t{\n\t\tconst char * Attrib = Attribs[i];\n\t\tfor (int fg = 30; fg <= 37; fg++)\n\t\t{\n\t\t\tfor (int bg = 40; bg <= 47; bg++)\n\t\t\t{\n\t\t\t\tprintf(\"\\x1b[%s;%d;%dm %s;%d;%d \", Attrib, fg, bg, Attrib, fg, bg);\n\t\t\t}  // for bg\n\t\t\tputs(\"\\x1b[0m\");  // Reset terminal back to normal colors\tfor the newline\n\t\t}  // for fg\n\t}  // for i - Attribs[]\n\n\tfor (int i = 1; i < ARRAYCOUNT(Attribs); i++)\n\t{\n\t\tconst char * Attrib = Attribs[i];\n\t\tfor (int fg = 30; fg <= 37; fg++)\n\t\t{\n\t\t\tfor (int bg = 40; bg <= 47; bg++)\n\t\t\t{\n\t\t\t\tprintf(\"\\x1b[%d;%d;%sm %d;%d;%s \", fg, bg, Attrib, fg, bg, Attrib);\n\t\t\t}  // for bg\n\t\t\tputs(\"\\x1b[0m\");  // Reset terminal back to normal colors\tfor the newline\n\t\t}  // for fg\n\t}  // for i - Attribs[]\n\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/FastRandom/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/FastRandom.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n)\n\nset (SHARED_HDRS\n\t../TestHelpers.h\n\t${PROJECT_SOURCE_DIR}/src/FastRandom.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n)\n\nset (SRCS\n\tFastRandomTest.cpp\n)\n\n\nsource_group(\"Shared\" FILES ${SHARED_SRCS} ${SHARED_HDRS})\nsource_group(\"Sources\" FILES ${SRCS})\nadd_executable(FastRandom-exe ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS})\ntarget_link_libraries(FastRandom-exe fmt::fmt)\nif (WIN32)\n\ttarget_link_libraries(FastRandom-exe ws2_32)\nendif()\nadd_test(NAME FastRandom-test COMMAND FastRandom-exe)\n\n\n\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tFastRandom-exe\n\tPROPERTIES FOLDER Tests\n)\n"
  },
  {
    "path": "tests/FastRandom/FastRandomTest.cpp",
    "content": "\n// FastRandomTest.cpp\n\n// Tests the randomness of cFastRandom\n\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"FastRandom.h\"\n\n\n\n\n\nstatic void TestInts(void)\n{\n\tcFastRandom rnd;\n\tint sum = 0;\n\tconst int BUCKETS = 8;\n\tint Counts[BUCKETS] = {0};\n\tconst int ITER = 10000;\n\tfor (int i = 0; i < ITER; i++)\n\t{\n\t\tint v = rnd.RandInt(1000);\n\t\tTEST_GREATER_THAN_OR_EQUAL(v, 0);\n\t\tTEST_LESS_THAN_OR_EQUAL(v, 1000);\n\t\tCounts[v % BUCKETS]++;\n\t\tsum += v;\n\t}\n\tdouble avg = static_cast<double>(sum) / ITER;\n\tLOG(\"avg: %f\", avg);\n\tfor (int i = 0; i < BUCKETS; i++)\n\t{\n\t\tLOG(\"  bucket %d: %d\", i, Counts[i]);\n\t}\n}\n\n\n\n\n\nstatic void TestFloats(void)\n{\n\tcFastRandom rnd;\n\tfloat sum = 0;\n\tconst int BUCKETS = 8;\n\tint Counts[BUCKETS] = {0};\n\tconst int ITER = 10000;\n\tfor (int i = 0; i < ITER; i++)\n\t{\n\t\tfloat v = rnd.RandReal(1000.0f);\n\t\tTEST_GREATER_THAN_OR_EQUAL(v, 0);\n\t\tTEST_LESS_THAN_OR_EQUAL(v, 1000);\n\t\tCounts[static_cast<int>(v) % BUCKETS]++;\n\t\tsum += v;\n\t}\n\tsum = sum / ITER;\n\tLOG(\"avg: %f\", sum);\n\tfor (int i = 0; i < BUCKETS; i++)\n\t{\n\t\tLOG(\"  bucket %d: %d\", i, Counts[i]);\n\t}\n}\n\n\n\n\n\n/** Checks whether re-creating the cFastRandom class produces the same initial number over and over (#2935) */\nstatic void TestReCreation(void)\n{\n\tconst int ITER = 10000;\n\tint lastVal = 0;\n\tint numSame = 0;\n\tint maxNumSame = 0;\n\tfor (int i = 0; i < ITER; ++i)\n\t{\n\t\tcFastRandom rnd;\n\t\tint val = rnd.RandInt(9);\n\t\tif (val == lastVal)\n\t\t{\n\t\t\tnumSame += 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (numSame > maxNumSame)\n\t\t\t{\n\t\t\t\tmaxNumSame = numSame;\n\t\t\t}\n\t\t\tnumSame = 0;\n\t\t\tlastVal = val;\n\t\t}\n\t}\n\tif (numSame > maxNumSame)\n\t{\n\t\tmaxNumSame = numSame;\n\t}\n\tLOG(\"Out of %d creations, there was a chain of at most %d same numbers generated.\", ITER, maxNumSame);\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"FastRandom\",\n\tTestInts();\n\tTestFloats();\n\tTestReCreation();\n)\n"
  },
  {
    "path": "tests/Generating/BasicGeneratorTest.cpp",
    "content": "#include \"Globals.h\"\n#include \"Generating/ChunkGenerator.h\"\n#include \"Generating/ChunkDesc.h\"\n#include \"../TestHelpers.h\"\n#include \"IniFile.h\"\n#include \"mbedTLS++/Sha1Checksum.h\"\n\n\n\n\n\n/** Checks that the chunk's heightmap corresponds to the chunk contents. */\nstatic void verifyChunkDescHeightmap(const cChunkDesc & a_ChunkDesc)\n{\n\tfor (int x = 0; x < cChunkDef::Width; x++)\n\t{\n\t\tfor (int z = 0; z < cChunkDef::Width; z++)\n\t\t{\n\t\t\tfor (int y = cChunkDef::Height - 1; y > 0; y--)\n\t\t\t{\n\t\t\t\tBLOCKTYPE BlockType = a_ChunkDesc.GetBlockType(x, y, z);\n\t\t\t\tif (BlockType != E_BLOCK_AIR)\n\t\t\t\t{\n\t\t\t\t\tint Height = a_ChunkDesc.GetHeight(x, z);\n\t\t\t\t\tTEST_EQUAL_MSG(Height, y, fmt::format(FMT_STRING(\"Chunk height at <{}, {}>: exp {}, got {}\"), x, z, y, Height));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}  // for y\n\t\t}  // for z\n\t}  // for x\n}\n\n\n\n\n\nstatic AString chunkSHA1(const cChunkDesc & a_ChunkDesc)\n{\n\tcSha1Checksum cs;\n\tcs.Update(a_ChunkDesc.GetBlockTypes(), cChunkDef::Width * cChunkDef::Width * cChunkDef::Height);\n\tcSha1Checksum::Checksum digest;\n\tcs.Finalize(digest);\n\tAString res;\n\tcSha1Checksum::DigestToJava(digest, res);\n\treturn res;\n}\n\n\n\n\n\n/** Prints out the entire column from the chunk, one block type per line. */\nstatic void printChunkColumn(const cChunkDesc & a_ChunkDesc, int a_X, int a_Z)\n{\n\tauto prevBlockType = a_ChunkDesc.GetBlockType(a_X, cChunkDef::Height - 1, a_Z);\n\tint count = 1;\n\tLOG(\"Column {%d, %d}:\", a_X, a_Z);\n\tLOG(\"Yfrom\\tYto\\tcnt\\ttype\\ttypeStr\");\n\tfor (int y = cChunkDef::Height - 2; y >= 0; --y)\n\t{\n\t\tauto blockType = a_ChunkDesc.GetBlockType(a_X, y, a_Z);\n\t\tif (blockType != prevBlockType)\n\t\t{\n\t\t\tLOG(\"%d\\t%d\\t%d\\t%d\\t%s\", y + 1, y + count, count, prevBlockType, ItemTypeToString(prevBlockType));\n\t\t\tprevBlockType = blockType;\n\t\t\tcount = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcount += 1;\n\t\t}\n\t}\n\tLOG(\"%d\\t%d\\t%d\\t%s\", 0, count, prevBlockType, ItemTypeToString(prevBlockType));\n}\n\n\n\n\n\n/** Tests that the default Overworld generator generates a few chunks that have the Overworld look:\n- bedrock at their bottom\n- a valid overworld block at their height's top\n- air at their top, unless the height at that point is equal to full chunk height.\n- valid heightmap\nMultiple chunks are tested. */\nstatic void testGenerateOverworld(cChunkGenerator & aDefaultOverworldGen)\n{\n\tLOG(\"Testing Overworld generator...\");\n\n\tfor (int chunkX = 0; chunkX < 50; ++chunkX)\n\t{\n\t\t// Generate a chunk:\n\t\tcChunkDesc chd({chunkX, 0});\n\t\taDefaultOverworldGen.Generate(chd);\n\t\tverifyChunkDescHeightmap(chd);\n\n\t\t// Check that it has bedrock at the bottom:\n\t\tfor (int x = 0; x < cChunkDef::Width; ++x)\n\t\t{\n\t\t\tfor (int z = 0; z < cChunkDef::Width; ++z)\n\t\t\t{\n\t\t\t\tTEST_EQUAL_MSG(chd.GetBlockType(x, 0, z), E_BLOCK_BEDROCK, fmt::format(FMT_STRING(\"Bedrock floor at {{{}, {}, {}}}\"), x, 0, z));\n\t\t\t}\n\t\t}\n\n\t\t// Check that the blocks on the top are valid Overworld blocks:\n\t\tstatic std::set<BLOCKTYPE> validOverworldBlockTypes =\n\t\t{\n\t\t\tE_BLOCK_STONE,\n\t\t\tE_BLOCK_GRASS,\n\t\t\tE_BLOCK_WATER,\n\t\t\tE_BLOCK_STATIONARY_WATER,\n\t\t\tE_BLOCK_LAVA,\n\t\t\tE_BLOCK_STATIONARY_LAVA,\n\t\t\tE_BLOCK_SAND,\n\t\t\tE_BLOCK_GRAVEL,\n\t\t\tE_BLOCK_LEAVES,\n\t\t\tE_BLOCK_NEW_LEAVES,\n\t\t};\n\t\tfor (int x = 0; x < cChunkDef::Width; ++x)\n\t\t{\n\t\t\tfor (int z = 0; z < cChunkDef::Width; ++z)\n\t\t\t{\n\t\t\t\tauto y = chd.GetHeight(x, z);\n\t\t\t\tauto blockType = chd.GetBlockType(x, y, z);\n\t\t\t\tTEST_EQUAL_MSG(validOverworldBlockTypes.count(blockType), 1,\n\t\t\t\t\tfmt::format(FMT_STRING(\"Block at {{{}, {}, {}}}: {}\"), x, y, z, blockType)\n\t\t\t\t);\n\t\t\t\tif (y < cChunkDef::Height - 1)\n\t\t\t\t{\n\t\t\t\t\tTEST_EQUAL_MSG(chd.GetBlockType(x, cChunkDef::Height - 1, z), E_BLOCK_AIR,\n\t\t\t\t\t\tfmt::format(FMT_STRING(\"Air at {{{}, {}, {}}}\"), x, cChunkDef::Height - 1, z)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Tests that the default Nether generator generates a chunk that has the Nether look:\n- bedrock at the bottom\n- bedrock at the height's top\n- at least one Nether-native block in each column\n- valid heightmap\nMultiple chunks are tested. */\nstatic void testGenerateNether(cChunkGenerator & aDefaultNetherGen)\n{\n\tLOG(\"Testing Nether generator...\");\n\n\tfor (int chunkX = 0; chunkX < 50; ++chunkX)\n\t{\n\t\t// Generate a chunk:\n\t\tcChunkDesc chd({chunkX, 0});\n\t\taDefaultNetherGen.Generate(chd);\n\t\tverifyChunkDescHeightmap(chd);\n\n\t\t// Check that the biome is Nether everywhere:\n\t\tfor (int x = 0; x < cChunkDef::Width; ++x)\n\t\t{\n\t\t\tfor (int z = 0; z < cChunkDef::Width; ++z)\n\t\t\t{\n\t\t\t\tTEST_EQUAL_MSG(chd.GetBiome(x, z), biNether, fmt::format(FMT_STRING(\"Nether biome at <{}, {}>\"), x, z));\n\t\t\t}\n\t\t}\n\n\t\t// Check that it has bedrock at the bottom and height:\n\t\tint prevHeight = chd.GetHeight(0, 0);\n\t\tfor (int x = 0; x < cChunkDef::Width; ++x)\n\t\t{\n\t\t\tfor (int z = 0; z < cChunkDef::Width; ++z)\n\t\t\t{\n\t\t\t\tTEST_EQUAL_MSG(chd.GetBlockType(x, 0, z), E_BLOCK_BEDROCK, fmt::format(FMT_STRING(\"Bedrock floor at {{{}, {}, {}}}\"), x, 0, z));\n\t\t\t\tauto y = chd.GetHeight(x, z);\n\t\t\t\tauto topBlockType = chd.GetBlockType(x, y, z);\n\t\t\t\t// Skip the mushrooms generated on the top bedrock layer:\n\t\t\t\tif (\n\t\t\t\t\t(topBlockType == E_BLOCK_BROWN_MUSHROOM) ||\n\t\t\t\t\t(topBlockType == E_BLOCK_RED_MUSHROOM)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\ty -= 1;\n\t\t\t\t}\n\t\t\t\tTEST_EQUAL_MSG(y, prevHeight, fmt::format(\n\t\t\t\t\tFMT_STRING(\"Failed: Same height across the entire chunk, at <{}, {}>: exp {}, got {}; top block: {}\"),\n\t\t\t\t\tx, z, prevHeight, y, chd.GetBlockType(x, y, z)\n\t\t\t\t));\n\t\t\t\tauto blockType = chd.GetBlockType(x, y, z);\n\t\t\t\tTEST_EQUAL_MSG(blockType, E_BLOCK_BEDROCK,\n\t\t\t\t\tfmt::format(FMT_STRING(\"Bedrock ceiling at {{{}, {}, {}}}: {}\"), x, y, z, blockType)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Check that each column contains at least one Nether-native block:\n\t\tfor (int x = 0; x < cChunkDef::Width; ++x)\n\t\t{\n\t\t\tfor (int z = 0; z < cChunkDef::Width; ++z)\n\t\t\t{\n\t\t\t\tbool hasSuitableBlockType = false;\n\t\t\t\tfor (int y = chd.GetHeight(x, z); y > 0; --y)\n\t\t\t\t{\n\t\t\t\t\tswitch (chd.GetBlockType(x, y, z))\n\t\t\t\t\t{\n\t\t\t\t\t\tcase E_BLOCK_NETHERRACK:\n\t\t\t\t\t\tcase E_BLOCK_NETHER_QUARTZ_ORE:\n\t\t\t\t\t\tcase E_BLOCK_LAVA:\n\t\t\t\t\t\tcase E_BLOCK_STATIONARY_LAVA:\n\t\t\t\t\t\tcase E_BLOCK_SOULSAND:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thasSuitableBlockType = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}  // for y\n\t\t\t\tif (!hasSuitableBlockType)\n\t\t\t\t{\n\t\t\t\t\tprintChunkColumn(chd, x, z);\n\t\t\t\t\tTEST_FAIL(fmt::format(FMT_STRING(\"!hasSuitableBlockType at column <{}, {}> of chunk [{}, 0]\"), x, z, chunkX));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n\n/** Storage for checksums with chunk coords. */\nstruct CoordsWithChecksum\n{\n\tcChunkCoords mCoords;\n\tAString mChecksum;\n\tCoordsWithChecksum(int aChunkX, int aChunkZ, const AString & aChecksum):\n\t\tmCoords(aChunkX, aChunkZ),\n\t\tmChecksum(aChecksum)\n\t{}\n};\n\n\n\n\n\n/** Checks that the specified generator generates chunk that match the specified checksums. */\nstatic void checkChunkChecksums(\n\tcChunkGenerator & aGenerator,\n\tconst std::vector<CoordsWithChecksum> & aCoordsWithChecksum,\n\tconst AString & aDimension\n)\n{\n\tLOG(\"Testing the repeatability of the %s generator\", aDimension);\n\tfor (const auto & coords: aCoordsWithChecksum)\n\t{\n\t\tcChunkDesc chd(coords.mCoords);\n\t\taGenerator.Generate(chd);\n\t\t/*\n\t\tcFile f(Printf(\"Repeatability_%s-%02d-%02d.raw\", aDimension, coords.mCoords.m_ChunkX, coords.mCoords.m_ChunkZ), cFile::fmWrite);\n\t\tf.Write(chd.GetBlockTypes(), sizeof(chd.GetBlockTypes()));\n\t\tf.Close();\n\t\t*/\n\t\tauto checksum = chunkSHA1(chd);\n\t\tTEST_EQUAL_MSG(checksum, coords.mChecksum,\n\t\t\tfmt::format(FMT_STRING(\"{} chunk {} SHA1: expected {}, got {}\"), aDimension, coords.mCoords.ToString(), coords.mChecksum, checksum)\n\t\t);\n\t}\n}\n\n\n\n\n\n/** Checks that the generated chunks look the same across all builds on all platforms.\nThis is done by SHA1-ing the blocks for known chunks and comparing against known values.\nIf the generator defaults change, this test will likely break, just update the SHA1s. */\nstatic void testRepeatability(cChunkGenerator & aDefaultOverworldGenerator, cChunkGenerator & aDefaultNetherGenerator)\n{\n\n\t// Test the default Overworld generator:\n\tstd::vector<CoordsWithChecksum> overworldChecksums =\n\t{\n\t\t{0,    0, \"-380dace6af9e653a2c68a51779cf5b8ff521cde1\"},\n\t\t{1,    0, \"-651dfec5a64b7adccf6bf2845396e27f53c6c4c0\"},\n\t\t{1,    1, \"-621454452edeb0ac369fea520fee3d80a5ecae49\"},\n\t\t{8, 1024, \"5ed38ba7ffee6b29f774ad24820ad3ca1ff058bf\"},\n\t};\n\tcheckChunkChecksums(aDefaultOverworldGenerator, overworldChecksums, \"Overworld\");\n\n\t// Test the default Nether generator:\n\tstd::vector<CoordsWithChecksum> netherChecksums =\n\t{\n\t\t{ 0,    0, \"-487001a1ada9cdd7c8b557d3ff7081881f57c660\"},\n\t\t{ 1,    0, \"a074ac7a1f2fbf4173324e5edd792197d6a29c2\"},\n\t\t{ 1,    1, \"5867c5121f2a259ebc2aa53ecafed93dd3d6de95\"},\n\t\t{17,    0, \"-300191cee5b30592f7b61cd22ea08669eba3f569\"},\n\t\t{ 8, 1024, \"69bbda09be981f5e3adc53d0a49995aff43f1290\"},\n\t};\n\tcheckChunkChecksums(aDefaultNetherGenerator, netherChecksums, \"Nether\");\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"BasicGeneratorTest\",\n\t// Create a default Overworld generator:\n\tcIniFile iniOverworld;\n\tiniOverworld.AddValue(\"General\", \"Dimension\", \"Overworld\");\n\tiniOverworld.AddValueI(\"Seed\", \"Seed\", 1);\n\tiniOverworld.AddValue(\"Generator\", \"Finishers\", \"\");  // Use no finishers, so that we don't have to check too many blocktypes\n\tauto defaultOverworldGen = cChunkGenerator::CreateFromIniFile(iniOverworld);\n\tTEST_NOTEQUAL(defaultOverworldGen, nullptr);\n\n\t// Create a default Nether generator:\n\tcIniFile iniNether;\n\tiniNether.AddValue(\"General\", \"Dimension\", \"Nether\");\n\tiniNether.AddValueI(\"Seed\", \"Seed\", 1);\n\tauto defaultNetherGen = cChunkGenerator::CreateFromIniFile(iniNether);\n\tTEST_NOTEQUAL(defaultNetherGen, nullptr);\n\n\t// Run the tests on the generators:\n\ttestGenerateOverworld(*defaultOverworldGen);\n\ttestGenerateNether(*defaultNetherGen);\n\ttestRepeatability(*defaultOverworldGen, *defaultNetherGen);\n)\n"
  },
  {
    "path": "tests/Generating/Bindings.h",
    "content": "\n// Bindings.h\n\n// Dummy include file needed for LuaState to compile successfully\n\n\n\n\nstruct lua_State;\n\nint tolua_AllToLua_open(lua_State * a_LuaState);\n\n\n\n\n"
  },
  {
    "path": "tests/Generating/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\ninclude_directories(SYSTEM ${PROJECT_SOURCE_DIR}/lib/)\ninclude_directories(SYSTEM ${PROJECT_SOURCE_DIR}/lib/mbedtls/include)\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/BiomeDef.cpp\n\t${PROJECT_SOURCE_DIR}/src/BlockArea.cpp\n\t${PROJECT_SOURCE_DIR}/src/BlockInfo.cpp\n\t${PROJECT_SOURCE_DIR}/src/BlockType.cpp\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.cpp\n\t${PROJECT_SOURCE_DIR}/src/ChunkData.cpp\n\t${PROJECT_SOURCE_DIR}/src/Defines.cpp\n\t${PROJECT_SOURCE_DIR}/src/Enchantments.cpp\n\t${PROJECT_SOURCE_DIR}/src/FastRandom.cpp\n\t${PROJECT_SOURCE_DIR}/src/IniFile.cpp\n\t${PROJECT_SOURCE_DIR}/src/ProbabDistrib.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringCompression.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n\t${PROJECT_SOURCE_DIR}/src/VoronoiMap.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/Bindings/LuaState.cpp  # Needed for PrefabPiecePool loading\n\n\t${PROJECT_SOURCE_DIR}/src/Noise/Noise.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp  # Needed for LuaState\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GZipFile.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/FastNBT.cpp\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.cpp\n)\n\nset (GENERATING_SRCS\n\t${PROJECT_SOURCE_DIR}/src/Generating/BioGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/Caves.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkDesc.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkGenerator.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/CompoGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/CompoGenBiomal.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/ComposableGenerator.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/DistortedHeightmap.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/DungeonRoomsFinisher.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/EndGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/EnderDragonFightStructuresGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/FinishGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/GridStructGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/HeiGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/MineShafts.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/Noise3DGenerator.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PieceGeneratorBFSTree.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PieceModifier.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PiecePool.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PieceStructuresGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/Prefab.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabPiecePool.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabStructure.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/Ravines.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/RoughRavines.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/SinglePieceStructuresGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/StructGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/Trees.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/TwoHeights.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalLimit.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalStrategy.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/VillageGen.cpp\n)\n\nset (SHARED_HDRS\n\t${PROJECT_SOURCE_DIR}/src/BiomeDef.h\n\t${PROJECT_SOURCE_DIR}/src/BlockArea.h\n\t${PROJECT_SOURCE_DIR}/src/BlockInfo.h\n\t${PROJECT_SOURCE_DIR}/src/BlockType.h\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.h\n\t${PROJECT_SOURCE_DIR}/src/ChunkData.h\n\t${PROJECT_SOURCE_DIR}/src/ChunkDef.h\n\t${PROJECT_SOURCE_DIR}/src/Defines.h\n\t${PROJECT_SOURCE_DIR}/src/Enchantments.h\n\t${PROJECT_SOURCE_DIR}/src/FastRandom.h\n\t${PROJECT_SOURCE_DIR}/src/Globals.h\n\t${PROJECT_SOURCE_DIR}/src/IniFile.h\n\t${PROJECT_SOURCE_DIR}/src/ProbabDistrib.h\n\t${PROJECT_SOURCE_DIR}/src/StringCompression.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n\t${PROJECT_SOURCE_DIR}/src/VoronoiMap.h\n\n\t${PROJECT_SOURCE_DIR}/src/Bindings/LuaState.h\n\n\t${PROJECT_SOURCE_DIR}/src/Noise/Noise.h\n\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GZipFile.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.h\n\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/FastNBT.h\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.h\n)\n\nset (GENERATING_HDRS\n\t${PROJECT_SOURCE_DIR}/src/Generating/BioGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/Caves.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkDesc.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkGenerator.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/CompoGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/CompoGenBiomal.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/ComposableGenerator.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/CompositedHeiGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/DistortedHeightmap.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/DungeonRoomsFinisher.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/EndGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/FinishGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/GridStructGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/HeiGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/IntGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/MineShafts.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/Noise3DGenerator.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PieceGeneratorBFSTree.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PieceModifier.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PiecePool.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PieceStructuresGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/Prefab.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabPiecePool.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabStructure.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/ProtIntGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/Ravines.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/RoughRavines.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/ShapeGen.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/SinglePieceStructuresGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/StructGen.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/Trees.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/TwoHeights.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalLimit.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalStrategy.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VillageGen.h\n)\n\nset (STUBS\n\tStubs.cpp\n\tLuaState_Typedefs.inc\n\tLuaState_Declaration.inc\n\tBindings.h\n)\n\n\nif(\"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"Clang\")\n\tadd_compile_options(\"-Wno-error=global-constructors\")\n\tadd_compile_options(\"-Wno-error=switch-enum\")\nendif()\n\n\n\nadd_library(GeneratorTestingSupport STATIC\n\t${SHARED_SRCS}\n\t${SHARED_HDRS}\n\t${GENERATING_SRCS}\n\t${GENERATING_HDRS}\n\t${STUBS}\n)\ntarget_link_libraries(GeneratorTestingSupport fmt::fmt jsoncpp_static libdeflate lsqlite luaexpat tolualib)\nsource_group(\"Stubs\" FILES ${STUBS})\nsource_group(\"Generating\" FILES ${GENERATING_HDRS} ${GENERATING_SRCS})\n\n\n\n\n\n# BasicGeneratingTest:\nadd_executable(BasicGeneratorTest\n\tBasicGeneratorTest.cpp\n\t${PROJECT_SOURCE_DIR}/src/IniFile.cpp\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/Sha1Checksum.cpp\n)\ntarget_link_libraries(BasicGeneratorTest GeneratorTestingSupport mbedtls)\nfile(COPY \"${PROJECT_SOURCE_DIR}/Server/items.ini\" DESTINATION \"${CMAKE_CURRENT_BINARY_DIR}\")\nadd_test(\n\tNAME BasicGeneratorTest\n\tCOMMAND BasicGeneratorTest\n)\n\n\n\n\n\n# LoadablePieces test:\nsource_group(\"Data files\" FILES Test.cubeset Test1.schematic)\nadd_executable(LoadablePieces\n\tLoadablePieces.cpp\n\tTest.cubeset\n\tTest1.schematic\n)\ntarget_link_libraries(LoadablePieces GeneratorTestingSupport)\nif (WIN32)\n\ttarget_link_libraries(LoadablePieces ws2_32)\nendif()\nadd_test(\n\tNAME LoadablePieces-test\n\tWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n\tCOMMAND LoadablePieces\n)\n\n\n\n\n\n# PieceRotation test:\nadd_executable(PieceRotation\n\tPieceRotationTest.cpp\n)\ntarget_link_libraries(PieceRotation GeneratorTestingSupport mbedtls)\nif (WIN32)\n\ttarget_link_libraries(PieceRotation ws2_32)\nendif()\nadd_test(\n\tNAME PieceRotation-test\n\tWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n\tCOMMAND PieceRotation\n)\n\n\n\n\n\n# PieceGeneratorBFSTree test:\nadd_executable(PieceGeneratorBFSTree\n\tPieceGeneratorBFSTreeTest.cpp\n)\ntarget_link_libraries(PieceGeneratorBFSTree GeneratorTestingSupport mbedtls)\nif (WIN32)\n    target_link_libraries(PieceGeneratorBFSTree ws2_32)\nendif()\nadd_test(\n\tNAME PieceGeneratorBFSTree-test\n\tWORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/Server/Prefabs/PieceStructures\n\tCOMMAND PieceGeneratorBFSTree\n)\n\n\n\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tBasicGeneratorTest\n\tGeneratorTestingSupport\n\tLoadablePieces\n\tPieceGeneratorBFSTree\n\tPieceRotation\n\tPROPERTIES FOLDER Tests/Generating\n)\n"
  },
  {
    "path": "tests/Generating/LoadablePieces.cpp",
    "content": "\n// LoadablePieces.cpp\n\n// Implements the LoadablePieces test main entrypoint\n\n#include \"Globals.h\"\n#ifdef _WIN32\n\t#include <direct.h>\n\t#define GetCurrentFolder _getcwd\n#else\n\t#include <unistd.h>\n\t#define GetCurrentFolder getcwd\n#endif\n#include \"../TestHelpers.h\"\n#include \"Generating/PrefabPiecePool.h\"\n\n\n\n\n\nstatic int DoLoaderTest(void)\n{\n\tcPrefabPiecePool test;\n\tauto res = test.LoadFromFile(\"Test.cubeset\", true);\n\tif (!res)\n\t{\n\t\tLOGWARNING(\"Loading from file \\\"Test.cubeset\\\" failed.\");\n\t\treturn 1;\n\t}\n\tLOG(\"Loaded %u regular pieces and %u starting pieces\", static_cast<unsigned>(test.GetAllPiecesCount()), static_cast<unsigned>(test.GetStartingPiecesCount()));\n\n\t// Check that we loaded all the pieces:\n\tTEST_EQUAL(test.GetAllPiecesCount(), 1);\n\tTEST_EQUAL(test.GetStartingPiecesCount(), 1);\n\n\treturn 0;\n}\n\n\n\n\n\nstatic int DoParserTest(void)\n{\n\t// Create one static prefab to test the parser:\n\tstatic const cPrefab::sDef testPrefabDef =\n\t{\n\t\t// Size:\n\t\t7, 6, 7,  // SizeX = 7, SizeY = 6, SizeZ = 7\n\n\t\t// Hitbox (relative to bounding box):\n\t\t0, 0, 0,  // MinX, MinY, MinZ\n\t\t6, 5, 6,  // MaxX, MaxY, MaxZ\n\n\t\t// Block definitions:\n\t\t\".:  0: 0\\n\"  /* 0 */\n\t\t\"a:112: 0\\n\"  /* netherbrick */\n\t\t\"b:113: 0\\n\"  /* netherbrickfence */,\n\n\t\t// Block data:\n\t\t// Level 1\n\t\t\"aaaaaaa\"\n\t\t\"aaaaaaa\"\n\t\t\"aaaaaaa\"\n\t\t\"aaaaaaa\"\n\t\t\"aaaaaaa\"\n\t\t\"aaaaaaa\"\n\t\t\"aaaaaaa\"\n\n\t\t// Level 2\n\t\t\"aa...aa\"\n\t\t\"a.....a\"\n\t\t\".......\"\n\t\t\".......\"\n\t\t\".......\"\n\t\t\"a.....a\"\n\t\t\"aa...aa\"\n\n\t\t// Level 3\n\t\t\"aa...aa\"\n\t\t\"a.....a\"\n\t\t\".......\"\n\t\t\".......\"\n\t\t\".......\"\n\t\t\"a.....a\"\n\t\t\"aa...aa\"\n\n\t\t// Level 4\n\t\t\"aa...aa\"\n\t\t\"a.....a\"\n\t\t\".......\"\n\t\t\".......\"\n\t\t\".......\"\n\t\t\"a.....a\"\n\t\t\"aa...aa\"\n\n\t\t// Level 5\n\t\t\"aabbbaa\"\n\t\t\"a.....a\"\n\t\t\"b.....b\"\n\t\t\"b.....b\"\n\t\t\"b.....b\"\n\t\t\"a.....a\"\n\t\t\"aabbbaa\"\n\n\t\t// Level 6\n\t\t\"aaaaaaa\"\n\t\t\"a.....a\"\n\t\t\"a.....a\"\n\t\t\"a.....a\"\n\t\t\"a.....a\"\n\t\t\"a.....a\"\n\t\t\"aaaaaaa\",\n\n\t\t// Connections:\n\t\t\"0: 0, 3, 2: 4\\n\"\n\t\t\"0: 2, 3, 0: 2\\n\",\n\n\t\t// AllowedRotations:\n\t\t7,  /* 1, 2, 3 CCW rotations */\n\n\t\t// Merge strategy:\n\t\tcBlockArea::msImprint,\n\n\t\t// ExtendFloorStrategy:\n\t\tcPrefab::efsNone,\n\n\t\t// DefaultWeight:\n\t\t10,\n\n\t\t// DepthWeight:\n\t\t\"\",\n\n\t\t// AddWeightIfSame:\n\t\t1000,\n\n\t\t// MoveToGround:\n\t\tfalse,\n\t};\n\n\tcPrefab testPrefab(testPrefabDef);\n\tcPiece & prefabAsPiece(testPrefab);  // GetConnectors() is private in cPrefab, need to cast to parent cPiece where it is public\n\tif (prefabAsPiece.GetConnectors().size() != 2)\n\t{\n\t\tLOGWARNING(\"Piece parsing failed, connectors not parsed properly. Expected 2 connectors, got %u\", static_cast<unsigned>(prefabAsPiece.GetConnectors().size()));\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tLOGD(\"Test started\");\n\n\t// Print the current directory for reference:\n\tchar folder[FILENAME_MAX];\n\tGetCurrentFolder(folder, sizeof(folder));\n\tLOG(\"Running cPrefabPiecePool test from folder \\\"%s\\\".\", folder);\n\n\t// Run the Loader test:\n\tint res = DoLoaderTest();\n\tLOG(\"cPrefabPiecePool loading test done: %s\", (res == 0) ? \"success\" : \"failure\");\n\tif (res != 0)\n\t{\n\t\treturn res;\n\t}\n\n\t// Run the Parser test:\n\tres = DoParserTest();\n\tLOG(\"cPrefab parser test done: %s\", (res == 0) ? \"success\" : \"failure\");\n\n\treturn res;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/Generating/LuaState_Declaration.inc",
    "content": "\n// LuaState_Declaration.inc\n\n// Dummy include file needed for LuaState to compile successfully\n\n\nbool GetStackValue(int, cUUID *&);\n\n\n"
  },
  {
    "path": "tests/Generating/LuaState_Typedefs.inc",
    "content": "\n// LuaState_Typedefs.inc\n\n// Dummy include file needed for LuaState to compile successfully\n\n\n\n\n\n// Forward-declare classes that are used in the API but never called:\nstruct HTTPRequest;\nstruct HTTPTemplateRequest;\nclass cPluginLua;\nclass cBoundingBox;\ntemplate <typename T> class cItemCallback;\nclass cEntity;\nclass cUUID;\n\n\n\n"
  },
  {
    "path": "tests/Generating/PieceGeneratorBFSTreeTest.cpp",
    "content": "// PieceGeneratorBFSTreeTest.cpp\n\n// Implements the test for the cPieceGeneratorBFSTree class\n\n/*\nUnlike most tests, this is actually not meant as much for unit-testing, but more like performance-testing.\nCompile this project in Release mode, then run it in folder that has NetherFort.cubeset prefabs, too, using\na higher number of repetitions (each repetition takes time on the order of a second); investigate the\nruntime performance with a profiler.\n\nThe syntax to execute this test:\nPieceGeneratorBFSTreeTest [<numRepetitions>]\nnumRepetitions is the number of NetherFort structures to be generated (default = 1)\n*/\n\n\n\n\n\n#include \"Globals.h\"\n#include \"Generating/PrefabPiecePool.h\"\n#include \"Generating/PieceGeneratorBFSTree.h\"\n\n\n\n\n\nstatic int test(int a_NumRepetitions)\n{\n\t// Load the piece pool:\n\tcPrefabPiecePool pool;\n\tif (!pool.LoadFromFile(\"NetherFort.cubeset\", true))\n\t{\n\t\tLOGERROR(\"Cannot load the NetherFort cubeset. Please make sure that the NetherFort.cubeset file is present in the current dir and that it is a valid .cubeset file.\");\n\t\treturn -1;\n\t}\n\tauto & generatorParams = pool.GetAllMetadata();\n\tauto maxDepth = GetStringMapInteger<int>(generatorParams, \"MaxDepth\", 5);\n\n\t// Perform repeated test of the generator:\n\tauto start = std::chrono::high_resolution_clock::now();\n\tcPieceGeneratorBFSTree pg(pool, 1);\n\tfor (int i = 0; i < a_NumRepetitions; ++i)\n\t{\n\t\tcPlacedPieces placedPieces;\n\t\tpg.PlacePieces(i * 512, 0, maxDepth, placedPieces);\n\t\tplacedPieces.clear();\n\t}  // for i - numRepetitions\n\tauto end = std::chrono::high_resolution_clock::now();\n\n\tauto dur = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();\n\tLOG(\"Performed %d repetition(s), took %.3f seconds\", a_NumRepetitions, static_cast<double>(dur) / 1000);\n\treturn 0;\n}\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tLOGD(\"Starting the PieceGeneratorBFSTree test.\");\n\n\t// Parse the cmdline parameters:\n\tint numRepetitions = 1;\n\tfor (int i = 1; i < argc; ++i)\n\t{\n\t\tint rep = atoi(argv[i]);\n\t\tif (rep > 0)\n\t\t{\n\t\t\tnumRepetitions = rep;\n\t\t}\n\t}\n\tLOGD(\"Performing %d repetitions\", numRepetitions);\n\n\tauto res = test(numRepetitions);\n\tif (res != 0)\n\t{\n\t\tLOGD(\"Test failed.\");\n\t\treturn res;\n\t}\n\n\tLOGD(\"The PieceGeneratorBFSTree test competed successfully.\");\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/Generating/PieceRotationTest.cpp",
    "content": "// PieceRotation.cpp\n\n// Implements the tests for cPiece::cConnector::eDirection rotations\n\n#include \"Globals.h\"\n#include <exception>\n#include <map>\n#include \"Generating/PiecePool.h\"\n\n\n\n\n\nstatic cPiece::cConnector::eDirection g_AllDirections[] =\n{\n\tcPiece::cConnector::dirXM,\n\tcPiece::cConnector::dirXP,\n\tcPiece::cConnector::dirYM,\n\tcPiece::cConnector::dirYP,\n\tcPiece::cConnector::dirZM,\n\tcPiece::cConnector::dirZP,\n\tcPiece::cConnector::dirYM_XM_ZM,\n\tcPiece::cConnector::dirYM_XM_ZP,\n\tcPiece::cConnector::dirYM_XP_ZM,\n\tcPiece::cConnector::dirYM_XP_ZP,\n\tcPiece::cConnector::dirYP_XM_ZM,\n\tcPiece::cConnector::dirYP_XM_ZP,\n\tcPiece::cConnector::dirYP_XP_ZM,\n\tcPiece::cConnector::dirYP_XP_ZP,\n};\n\n\n\n\n\nclass cTestFailure: public std::exception\n{\npublic:\n\tcTestFailure(const char * a_Expression, const char * a_FileName, const int a_Line):\n\t\tstd::exception(),\n\t\tm_Expression(a_Expression),\n\t\tm_FileName(a_FileName),\n\t\tm_Line(a_Line)\n\t{\n\t}\n\n\tconst std::string m_Expression;\n\tconst std::string m_FileName;\n\tconst int m_Line;\n};\n\n\n\n\n\n#define EXPECT(X) \\\n\tdo { \\\n\t\tif (!(X)) \\\n\t\t{ \\\n\t\t\tASSERT(X); \\\n\t\t\tthrow cTestFailure(#X, __FILE__, __LINE__); \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Tests that rotating a direction in one way and then the opposite way produces the original direction. */\nstatic void testBackAndForth()\n{\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)\n\t{\n\t\tauto rotated = cPiece::cConnector::RotateDirectionCW(g_AllDirections[i]);\n\t\tauto back = cPiece::cConnector::RotateDirectionCCW(rotated);\n\t\tEXPECT(back == g_AllDirections[i]);\n\t}\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)\n\t{\n\t\tauto rotated = cPiece::cConnector::RotateDirectionCCW(g_AllDirections[i]);\n\t\tauto back = cPiece::cConnector::RotateDirectionCW(rotated);\n\t\tEXPECT(back == g_AllDirections[i]);\n\t}\n}\n\n\n\n\n\n/** Tests rotating the direction 360 degrees. */\nstatic void testFullRotation()\n{\n\t// Rotate 90 degrees CCW four times:\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)\n\t{\n\t\tauto d = g_AllDirections[i];\n\t\tfor (int j = 0; j < 4; ++j)\n\t\t{\n\t\t\td = cPiece::cConnector::RotateDirectionCCW(d);\n\t\t}\n\t\tEXPECT(d == g_AllDirections[i]);\n\t}\n\n\t// Rotate 90 degrees CW four times:\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)\n\t{\n\t\tauto d = g_AllDirections[i];\n\t\tfor (int j = 0; j < 4; ++j)\n\t\t{\n\t\t\td = cPiece::cConnector::RotateDirectionCW(d);\n\t\t}\n\t\tEXPECT(d == g_AllDirections[i]);\n\t}\n\n\t// Rotate 180 degrees twice:\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)\n\t{\n\t\tauto d = g_AllDirections[i];\n\t\td = cPiece::cConnector::RotateDirection(d);\n\t\td = cPiece::cConnector::RotateDirection(d);\n\t\tEXPECT(d == g_AllDirections[i]);\n\t}\n}\n\n\n\n\n\n/** Tests that no two values are rotated onto the same destination value. */\ntemplate <class Fn>\nstatic void testPermutation(Fn & a_Fn)\n{\n\tstd::map<cPiece::cConnector::eDirection, int> numDest;\n\tfor (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)\n\t{\n\t\tauto d = a_Fn(g_AllDirections[i]);\n\t\tEXPECT(numDest[d] == 0);\n\t\tnumDest[d] = 1;\n\t}\n}\n\n\n\n\n\nint main(void)\n{\n\tLOG(\"PieceRotation test starting.\");\n\ttry\n\t{\n\t\ttestBackAndForth();\n\t\ttestFullRotation();\n\t\ttestPermutation(cPiece::cConnector::RotateDirection);\n\t\ttestPermutation(cPiece::cConnector::RotateDirectionCW);\n\t\ttestPermutation(cPiece::cConnector::RotateDirectionCCW);\n\t}\n\tcatch (const cTestFailure & f)\n\t{\n\t\tLOGERROR(\"Test failed:\\tExpression: %s\\n\\tFile: %s (%d)\", f.m_Expression.c_str(), f.m_FileName.c_str(), f.m_Line);\n\t\treturn 1;\n\t}\n\tcatch (const std::exception & exc)\n\t{\n\t\tLOGERROR(\"Exception caught: %s\", exc.what());\n\t\treturn 2;\n\t}\n\tLOG(\"PieceRotation test succeeded.\");\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/Generating/Stubs.cpp",
    "content": "\n// Stubs.cpp\n\n// Implements stubs of various Cuberite methods that are needed for linking but not for runtime\n// This is required so that we don't bring in the entire Cuberite via dependencies\n\n#include \"Globals.h\"\n#include \"BlockInfo.h\"\n#include \"UUID.h\"\n#include \"Bindings.h\"\n#include \"Bindings/DeprecatedBindings.h\"\n#include \"Bindings/LuaJson.h\"\n#include \"Bindings/LuaState.h\"\n#include \"Bindings/ManualBindings.h\"\n#include \"BlockEntities/BlockEntity.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"Generating/ChunkDesc.h\"\n#include \"DeadlockDetect.h\"\n#include \"Entities/Entity.h\"\n#include \"Entities/EnderCrystal.h\"\n#include \"Mobs/Monster.h\"\n#include \"Mobs/EnderDragon.h\"\n#include \"Simulator/FluidSimulator.h\"\n#include \"Simulator/FireSimulator.h\"\n#include \"MobSpawner.h\"\n#include \"ItemGrid.h\"\n\n\n\n\n\n// fwd:\nstruct lua_State;\n\n\n\n\n\n// Prototypes, needed by clang:\nextern \"C\" int luaopen_lsqlite3(lua_State * a_LuaState);\nextern \"C\" int luaopen_lxp(lua_State * a_LuaState);\n\n\n\n\n\nvoid cManualBindings::Bind(lua_State * a_LuaState)\n{\n}\n\n\n\n\n\nvoid DeprecatedBindings::Bind(lua_State * a_LuaState)\n{\n}\n\n\n\n\n\nvoid cLuaJson::Bind(cLuaState & a_LuaState)\n{\n}\n\n\n\n\n\nint tolua_AllToLua_open(lua_State * a_LuaState)\n{\n\treturn 0;\n}\n\n\n\n\n\nextern \"C\" int luaopen_lsqlite3(lua_State * a_LuaState)\n{\n\treturn 0;\n}\n\n\n\n\n\nextern \"C\" int luaopen_lxp(lua_State * a_LuaState)\n{\n\treturn 0;\n}\n\n\n\n\n\ncBoundingBox::cBoundingBox(double, double, double, double, double, double)\n{\n}\n\n\n\n\n\ncBoundingBox cBlockHandler::GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const\n{\n\treturn cBoundingBox(0, 0, 0, 0, 0, 0);\n}\n\n\n\n\n\nvoid cBlockHandler::OnUpdate(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_PluginInterface, cChunk & a_Chunk, const Vector3i a_RelPos) const\n{\n}\n\n\n\n\n\nvoid cBlockHandler::OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const\n{\n}\n\n\n\n\n\nvoid cBlockHandler::NeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor)\n{\n}\n\n\n\n\n\ncItems cBlockHandler::ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const\n{\n\treturn cItems();\n}\n\n\n\n\n\nbool cBlockHandler::CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const\n{\n\treturn true;\n}\n\n\n\n\n\nbool cBlockHandler::IsUseable() const\n{\n\treturn false;\n}\n\n\n\n\n\nbool cBlockHandler::DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, Vector3i a_Position, NIBBLETYPE a_Meta, eBlockFace a_ClickedBlockFace, bool a_ClickedDirectly) const\n{\n\treturn m_BlockType == E_BLOCK_AIR;\n}\n\n\n\n\n\nvoid cBlockHandler::Check(cChunkInterface & a_ChunkInterface, cBlockPluginInterface & a_PluginInterface, Vector3i a_RelPos, cChunk & a_Chunk) const\n{\n}\n\n\n\n\n\nColourID cBlockHandler::GetMapBaseColourID(NIBBLETYPE a_Meta) const\n{\n\treturn 0;\n}\n\n\n\n\n\nbool cBlockHandler::IsInsideBlock(Vector3d a_Position, const NIBBLETYPE a_BlockMeta) const\n{\n\treturn true;\n}\n\n\n\n\n\nconst cBlockHandler & cBlockHandler::For(BLOCKTYPE a_BlockType)\n{\n\t// Dummy handler.\n\tstatic cBlockHandler Handler(E_BLOCK_AIR);\n\treturn Handler;\n}\n\n\n\n\n\nOwnedBlockEntity cBlockEntity::CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World)\n{\n\treturn nullptr;\n}\n\n\n\n\n\nvoid cDeadlockDetect::TrackCriticalSection(cCriticalSection & a_CS, const AString & a_Name)\n{\n}\n\n\n\n\n\nvoid cDeadlockDetect::UntrackCriticalSection(cCriticalSection & a_CS)\n{\n}\n\n\n\n\n\nvoid cBlockEntity::SetPos(Vector3i a_NewPos)\n{\n}\n\n\n\n\n\nbool cBlockEntity::IsBlockEntityBlockType(BLOCKTYPE a_BlockType)\n{\n\treturn false;\n}\n\n\n\n\n\nOwnedBlockEntity cBlockEntity::Clone(Vector3i a_Pos)\n{\n\treturn nullptr;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int, cUUID *&)\n{\n\treturn false;\n}\n\n\n\n\n\nbool cUUID::FromString(const AString&)\n{\n\treturn false;\n}\n\n\n\n\n\nvoid cEntity::SetPosition(const Vector3d & a_Position)\n{\n}\n\n\n\n\n\nvoid cEntity::SetHealth(float a_NewHealth)\n{\n}\n\n\n\n\n\ncMonster::eFamily cMonster::FamilyFromType(eMonsterType a_Type)\n{\n\treturn cMonster::mfAmbient;\n}\n\n\n\n\n\nstd::unique_ptr<cMonster> cMonster::NewMonsterFromType(eMonsterType a_Type)\n{\n\treturn nullptr;\n}\n\n\n\n\n\nvoid cMonster::CheckEventLostPlayer(std::chrono::milliseconds a_Dt)\n{\n\n}\n\n\n\n\n\nbool cFluidSimulator::CanWashAway(BLOCKTYPE a_BlockType)\n{\n\treturn false;\n}\n\n\n\n\n\nbool cFireSimulator::DoesBurnForever(BLOCKTYPE a_BlockType)\n{\n\treturn false;\n}\n\n\n\n\n\nvoid cItemGrid::GenerateRandomLootWithBooks(const cLootProbab * a_LootProbabs, size_t a_CountLootProbabs, int a_NumSlots, int a_Seed)\n{\n}\n\n\n\n\n\nstd::set<eMonsterType> cMobSpawner::GetAllowedMobTypes(EMCSBiome a_Biome)\n{\n\treturn {};\n}\n\n\n\n\n\ncItem::cItem()\n{\n}\n\n\n\n\n\ncItem::cItem(\n\tshort a_ItemType,\n\tchar a_ItemCount,\n\tshort a_ItemDamage,\n\tconst AString & a_Enchantments,\n\tconst AString & a_CustomName,\n\tconst AStringVector & a_LoreTable\n)\n{\n}\n\n\n\n\n\nvoid cItem::Empty()\n{\n}\n\n\n\n\n\ncEnderCrystal::cEnderCrystal(Vector3d a_Pos, bool a_ShowBottom):\n\tSuper(etEnderCrystal, a_Pos, 1.0, 1.0)\n{\n}\n\n\n\n\n\nvoid cEnderCrystal::SpawnOn(class cClientHandle & a_ClientHandle)\n{\n}\n\n\n\n\n\n\nvoid cEnderCrystal::Tick(std::chrono::milliseconds a_Dt, class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\n\nvoid cEnderCrystal::KilledBy(struct TakeDamageInfo & a_TakeDamageInfo)\n{\n}\n\n\n\n\n\ncEntity::cEntity(enum cEntity::eEntityType a_EntityType, class Vector3<double> a_Pos, float a_Height, float a_Width)\n{\n}\n\n\n\n\n\nbool cEntity::Initialize(class std::unique_ptr<class cEntity,struct std::default_delete<class cEntity> > a_Entity,class cWorld & a_World)\n{\n\treturn true;\n}\n\n\n\n\n\nvoid cEntity::OnAddToWorld(class cWorld & a_World)\n{\n}\n\n\n\n\n\nvoid cEntity::OnRemoveFromWorld(class cWorld & a_World)\n{\n}\n\n\n\n\n\nbool cEntity::IsA(char const * a_Type)const\n{\n\treturn true;\n}\n\n\n\n\n\nchar const * cEntity::GetParentClass(void) const\n{\n\treturn \"\";\n}\n\n\n\n\n\nvoid cEntity::HandleSpeedFromAttachee(float a_SpeedX,float a_SpeedZ)\n{\n}\n\n\n\n\n\n\nvoid cEntity::Destroy(void)\n{\n}\n\n\n\n\n\n\nbool cEntity::DoTakeDamage(struct TakeDamageInfo & a_TakeDamageInfo)\n{\n\treturn true;\n}\n\n\n\n\n\n\nint cEntity::GetRawDamageAgainst(class cEntity const & a_Entity)\n{\n\treturn 0;\n}\n\n\n\n\n\n\nbool cEntity::ArmorCoversAgainst(enum eDamageType a_DamageType)\n{\n\treturn true;\n}\n\n\n\n\n\n\nfloat cEntity::GetArmorCoverAgainst(class cEntity const * a_Entity,enum eDamageType a_DamageType,int a_Value)\n{\n\treturn 0.0f;\n}\n\n\n\n\n\nchar const * cEntity::GetClass(void) const\n{\n\treturn \"\";\n}\n\n\n\n\n\nfloat cEntity::GetEnchantmentCoverAgainst(class cEntity const * a_Entity,enum eDamageType a_DamageType,int a_Value)\n{\n\treturn 0.0f;\n}\n\n\n\n\n\n\nfloat cEntity::GetEnchantmentBlastKnockbackReduction(void)\n{\n\treturn 0.0f;\n}\n\n\n\n\n\n\ndouble cEntity::GetKnockbackAmountAgainst(class cEntity const & a_Entity)\n{\n\treturn 0.0f;\n}\n\n\n\n\n\n\nvoid cEntity::ApplyArmorDamage(int)\n{\n}\n\n\n\n\n\n\nvoid cEntity::KilledBy(struct TakeDamageInfo & a_TakeDamageInfo)\n{\n}\n\n\n\n\n\n\nvoid cEntity::Heal(int a_Value)\n{\n}\n\n\n\n\n\n\nvoid cEntity::Tick(std::chrono::milliseconds a_Dt, class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\n\nvoid cEntity::HandlePhysics(std::chrono::milliseconds a_Dt, class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\n\nvoid cEntity::TickBurning(class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\n\nvoid cEntity::DetectCacti(void)\n{\n}\n\n\n\n\n\n\nbool cEntity::DetectPortal(void)\n{\n\treturn true;\n}\n\n\n\n\n\n\nvoid cEntity::TickInVoid(class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\n\nvoid cEntity::OnStartedBurning(void)\n{\n}\n\n\n\n\n\n\nvoid cEntity::OnFinishedBurning(void)\n{\n}\n\n\n\n\n\n\nvoid cEntity::TeleportToEntity(class cEntity & a_Entity)\n{\n}\n\n\n\n\n\n\nvoid cEntity::TeleportToCoords(double a_XPos, double a_YPos, double a_ZPos)\n{\n}\n\n\n\n\n\n\nvoid cEntity::BroadcastMovementUpdate(class cClientHandle const * a_ClientHandle)\n{\n}\n\n\n\n\n\n\nvoid cEntity::AttachTo(class cEntity & a_Entity)\n{\n}\n\n\n\n\n\n\nvoid cEntity::Detach(void)\n{\n}\n\n\n\n\n\n\nvoid cEntity::SetSpeed(double a_XSpeed, double a_YSpeed, double a_ZSpeed)\n{\n}\n\n\n\n\n\nvoid cEntity::DetectMagma(void)\n{\n}\n\n\n\n\n\nbool cEntity::MoveToWorld(cWorld & a_World, Vector3d a_NewPosition, bool a_SetPortalCooldown, bool a_ShouldSendRespawn)\n{\n    return false;\n}\n\n\n\n\n\n\nvoid cEntity::HandleAir(void)\n{\n}\n\n\n\n\n\n\nvoid cEntity::SetSwimState(class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\n\nvoid cEntity::ResetPosition(class Vector3<double> a_Pos)\n{\n}\n\n\n\n\n\nvoid cEntity::OnDetach()\n{\n\n}\n\n\n\n\n\ncPawn::cPawn(enum cEntity::eEntityType, float a_Width, float a_Height) :\n\tcEntity(etMonster, Vector3d(), a_Height, a_Width)\n{\n}\n\n\n\n\n\nbool cPawn::IsFireproof(void) const\n{\n\treturn true;\n}\n\n\n\n\n\nbool cPawn::IsInvisible(void) const\n{\n\treturn true;\n}\n\n\n\n\n\nvoid cPawn::HandleAir(void)\n{\n}\n\n\n\n\nvoid cPawn::HandleFalling()\n{\n}\n\n\n\n\n\nvoid cPawn::KilledBy(struct TakeDamageInfo & a_TakeDamageInfo)\n{\n}\n\n\n\nvoid cPawn::OnRemoveFromWorld(cWorld & a_World)\n{\n}\n\n\n\n\n\nvoid cPawn::ResetPosition(class Vector3<double>)\n{\n}\n\n\n\n\n\nvoid cPawn::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)\n{\n}\n\n\n\n\n\ncMonster::cMonster(const AString & a_StringA, enum eMonsterType a_MonsterType, const AString & a_StringB, const AString & a_StringC, const AString & a_StringD, float a_Width, float a_Height) :\n\tcPawn(etMonster, a_Width, a_Height),\n\tm_PathFinder(a_Width, a_Height)\n{\n}\n\n\n\ncPathFinder::cPathFinder(float a_Width, float a_Height)\n{\n\n}\n\n\n\n\n\nvoid cMonster::OnRemoveFromWorld(class cWorld & a_World)\n{\n}\n\n\n\n\n\n\nvoid cMonster::Tick(std::chrono::milliseconds a_Dt, class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\nvoid cMonster::EventSeePlayer(cPlayer * a_Player, cChunk & a_Chunk)\n{\n}\n\n\n\n\n\nvoid cMonster::InStateChasing(std::chrono::milliseconds a_Dt, class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\nvoid cMonster::SpawnOn(class cClientHandle & a_ClientHandle)\n{\n}\n\n\n\n\n\nbool cMonster::DoTakeDamage(struct TakeDamageInfo & a_TakeDamageInfo)\n{\n\treturn true;\n}\n\n\n\n\n\nvoid cMonster::KilledBy(struct TakeDamageInfo & a_TakeDamageInfo)\n{\n}\n\n\n\n\n\nvoid cMonster::OnRightClicked(class cPlayer & a_Player)\n{\n}\n\n\n\n\n\nvoid cMonster::HandleFalling(void)\n{\n}\n\n\n\n\n\nvoid cMonster::MoveToPosition(class Vector3<double> const & a_Pos)\n{\n}\n\n\n\n\n\nvoid cMonster::CheckEventSeePlayer(class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\nbool cMonster::IsNetherNative(void)\n{\n\treturn false;\n}\n\n\n\n\n\nbool cMonster::IsUndead(void)\n{\n\treturn false;\n}\n\n\n\n\n\nvoid cMonster::EventLosePlayer(void)\n{\n}\n\n\n\n\n\nvoid cMonster::InStateIdle(std::chrono::milliseconds a_Dt ,class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\nvoid cMonster::InStateEscaping(std::chrono::milliseconds a_Dt ,class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\ncAggressiveMonster::cAggressiveMonster(const AString & a_StringA, enum eMonsterType a_MonsterType, const AString & a_StringB, const AString & a_StringC, const AString & a_StringD, float a_Width, float a_Height) :\n\tcMonster(a_StringA, a_MonsterType, a_StringB, a_StringC, a_StringD, a_Width, a_Height)\n{\n}\n\n\n\n\n\nvoid cAggressiveMonster::Tick(std::chrono::milliseconds a_Dt, class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\nvoid cAggressiveMonster::InStateChasing(std::chrono::milliseconds a_Dt, class cChunk & a_Chunk)\n{\n}\n\n\n\n\n\n\nvoid cAggressiveMonster::EventSeePlayer(class cPlayer *,class cChunk &)\n{\n}\n\n\n\n\n\nbool cAggressiveMonster::Attack(std::chrono::milliseconds a_Dt)\n{\n\treturn true;\n}\n"
  },
  {
    "path": "tests/Generating/Test.cubeset",
    "content": "\n-- Test.cubeset\n\n-- This simple cubeset file is used for testing the cPrefabPiecePool loader.\n\n\n\n\n\nCubeset =\n{\n\tMetadata =\n\t{\n\t\tCubesetFormatVersion = 1,\n\t},\n\n\tPieces =\n\t{\n\t\t-- One piece with inline definition:\n\t\t{\n\t\t\tSize =\n\t\t\t{\n\t\t\t\tx = 4,\n\t\t\t\ty = 4,\n\t\t\t\tz = 4,\n\t\t\t},\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 3,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 3,\n\t\t\t},\n\t\t\tBlockDefinitions =\n\t\t\t{\n\t\t\t\t\".:  0: 0\",  -- air\n\t\t\t\t\"a:  1: 0\",  -- stone\n\t\t\t\t\"b: 24: 0\",  -- sandstone\n\t\t\t\t\"c:  8: 0\",  -- water\n\t\t\t\t\"d: 85: 0\",  -- fence\n\t\t\t\t\"m: 19: 0\",  -- sponge\n\t\t\t},\n\t\t\tBlockData =\n\t\t\t{\n\t\t\t\t-- Level 0\n\t\t\t\t\"aaaa\",  --  0\n\t\t\t\t\"aaaa\",  --  1\n\t\t\t\t\"aaaa\",  --  2\n\t\t\t\t\"aaaa\",  --  3\n\n\t\t\t\t-- Level 1\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 2\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\n\t\t\t\t-- Level 3\n\t\t\t\t\"bbbb\",  --  0\n\t\t\t\t\"bccb\",  --  1\n\t\t\t\t\"bccb\",  --  2\n\t\t\t\t\"bbbb\",  --  3\n\t\t\t},\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 0,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 1,\n\t\t\t\t\tDirection = 4,  -- X-\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 1,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 3,\n\t\t\t\t\tDirection = 3,  -- Z+\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 3,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 2,\n\t\t\t\t\tDirection = 5,  -- X+\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"IsStarting\"] = \"1\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"MoveToGround\"] = \"1\",\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t\t[\"VerticalStrategy\"] = \"Fixed|150\",\n\t\t\t},\n\t\t},\n\n\t\t-- One piece with external definition:\n\t\t{\n\t\t\tHitbox =\n\t\t\t{\n\t\t\t\tMinX = 0,\n\t\t\t\tMinY = 0,\n\t\t\t\tMinZ = 0,\n\t\t\t\tMaxX = 3,\n\t\t\t\tMaxY = 3,\n\t\t\t\tMaxZ = 3,\n\t\t\t},\n\t\t\tSchematicFileName = \"Test1.schematic\",\n\t\t\tConnectors =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tType = 2,\n\t\t\t\t\tRelX = 2,\n\t\t\t\t\tRelY = 2,\n\t\t\t\t\tRelZ = 0,\n\t\t\t\t\tDirection = 2,  -- Z-\n\t\t\t\t},\n\t\t\t},\n\t\t\tMetadata =\n\t\t\t{\n\t\t\t\t[\"DefaultWeight\"] = \"100\",\n\t\t\t\t[\"AllowedRotations\"] = \"7\",\n\t\t\t\t[\"MergeStrategy\"] = \"msSpongePrint\",\n\t\t\t\t[\"IsStarting\"] = \"0\",\n\t\t\t\t[\"DepthWeight\"] = \"\",\n\t\t\t\t[\"ExpandFloorStrategy\"] = \"None\",\n\t\t\t\t[\"MoveToGround\"] = \"0\",\n\t\t\t\t[\"AddWeightIfSame\"] = \"0\",\n\t\t\t},\n\t\t},\n\t},  -- Pieces\n}\n\n\n\n\n"
  },
  {
    "path": "tests/HTTP/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\ninclude_directories(SYSTEM ${PROJECT_SOURCE_DIR}/lib/mbedtls/include)\n\n# Create a single HTTP library that contains all the HTTP code:\nset (HTTP_SRCS\n\t${PROJECT_SOURCE_DIR}/src/HTTP/EnvelopeParser.cpp\n\t${PROJECT_SOURCE_DIR}/src/HTTP/HTTPMessage.cpp\n\t${PROJECT_SOURCE_DIR}/src/HTTP/HTTPMessageParser.cpp\n\t${PROJECT_SOURCE_DIR}/src/HTTP/TransferEncodingParser.cpp\n\t${PROJECT_SOURCE_DIR}/src/HTTP/UrlClient.cpp\n\t${PROJECT_SOURCE_DIR}/src/HTTP/UrlParser.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n)\n\nset (HTTP_HDRS\n\t${PROJECT_SOURCE_DIR}/src/HTTP/EnvelopeParser.h\n\t${PROJECT_SOURCE_DIR}/src/HTTP/HTTPMessage.h\n\t${PROJECT_SOURCE_DIR}/src/HTTP/HTTPMessageParser.h\n\t${PROJECT_SOURCE_DIR}/src/HTTP/TransferEncodingParser.h\n\t${PROJECT_SOURCE_DIR}/src/HTTP/UrlClient.h\n\t${PROJECT_SOURCE_DIR}/src/HTTP/UrlParser.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n)\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.cpp\n)\n\nadd_library(HTTP\n\t${HTTP_SRCS}\n\t${HTTP_HDRS}\n)\ntarget_link_libraries(HTTP Network OSSupport)\n\n\n\n\n\nset (TEST_DATA_FILES\n\tHTTPRequest1.data\n\tHTTPRequest2.data\n\tHTTPResponse1.data\n\tHTTPResponse2.data\n)\n\nsource_group(\"Data Files\" FILES ${TEST_DATA_FILES})\n\n\n\n\n# Define individual test executables:\n\n# HTTPMessageParser_file: Feed file contents into a cHTTPResponseParser and print the callbacks as they're called:\nadd_executable(HTTPMessageParser_file-exe HTTPMessageParser_file.cpp ${TEST_DATA_FILES})\ntarget_link_libraries(HTTPMessageParser_file-exe HTTP Network OSSupport fmt::fmt)\n\n# UrlClientTest: Tests the UrlClient class by requesting a few things off the internet:\nadd_executable(UrlClientTest-exe UrlClientTest.cpp)\ntarget_link_libraries(UrlClientTest-exe HTTP fmt::fmt)\n\n\n\n\n\n# Define individual tests:\n\n# Test parsing the response file in 2-byte chunks (should go from response line parsing through headers parsing to body parsing, each within a different step):\nadd_test(NAME HTTPMessageParser_file-test1-2 COMMAND HTTPMessageParser_file-exe ${CMAKE_CURRENT_SOURCE_DIR}/HTTPResponse1.data 2)\n\n# Test parsing the response file in 128-byte chunks (should parse response line and part of headers in one step, the rest in another step):\nadd_test(NAME HTTPMessageParser_file-test1-128 COMMAND HTTPMessageParser_file-exe ${CMAKE_CURRENT_SOURCE_DIR}/HTTPResponse1.data 128)\n\n# Test parsing a chunked-encoding response:\nadd_test(NAME HTTPMessageParser_file-test2 COMMAND HTTPMessageParser_file-exe ${CMAKE_CURRENT_SOURCE_DIR}/HTTPResponse2.data)\n\n# Test parsing the request file in 2-byte chunks (should go from request line parsing through headers parsing to body parsing, each within a different step):\nadd_test(NAME HTTPMessageParser_file-test3-2 COMMAND HTTPMessageParser_file-exe ${CMAKE_CURRENT_SOURCE_DIR}/HTTPRequest1.data 2)\n\n# Test parsing the request file in 512-byte chunks (should process everything in a single call):\nadd_test(NAME HTTPMessageParser_file-test4-512 COMMAND HTTPMessageParser_file-exe ${CMAKE_CURRENT_SOURCE_DIR}/HTTPRequest1.data 512)\n\n# Test the URLClient\nadd_test(NAME UrlClient-test COMMAND UrlClientTest-exe)\n\n\n\n\n\n# Put all the tests into a solution folder (MSVC):\nset_target_properties(\n\tHTTPMessageParser_file-exe\n\tUrlClientTest-exe\n\tPROPERTIES FOLDER Tests/HTTP\n)\nset_target_properties(\n\tHTTP\n\tPROPERTIES FOLDER Tests/Libraries\n)\n"
  },
  {
    "path": "tests/HTTP/HTTPMessageParser_file.cpp",
    "content": "\n// HTTPMessageParser_file.cpp\n\n// Implements a test that feeds file contents into a cHTTPMessageParser instance and prints all callbacks\n\n#include \"Globals.h\"\n#include \"HTTP/HTTPMessageParser.h\"\n\n\n\n\n\n/** Maximum size of the input buffer, through which the file is read */\nstatic const size_t MAX_BUF = 4096;\n\n\n\n\n\nclass cCallbacks:\n\tpublic cHTTPMessageParser::cCallbacks\n{\n\ttypedef cHTTPMessageParser::cCallbacks Super;\npublic:\n\tcCallbacks(void)\n\t{\n\t\tprintf(\"cCallbacks created\\n\");\n\t}\n\n\t// cHTTPResponseParser::cCallbacks overrides:\n\tvirtual void OnError(const AString & a_ErrorDescription) override\n\t{\n\t\tprintf(\"Error: \\\"%s\\\"\\n\", a_ErrorDescription.c_str());\n\t}\n\n\t/** Called when the first line (request / status) is fully parsed. */\n\tvirtual void OnFirstLine(const AString & a_FirstLine) override\n\t{\n\t\tprintf(\"First line: \\\"%s\\\"\\n\", a_FirstLine.c_str());\n\t}\n\n\t/** Called when a single header line is parsed. */\n\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\tprintf(\"Header line: \\\"%s\\\": \\\"%s\\\"\\n\", a_Key.c_str(), a_Value.c_str());\n\t}\n\n\t/** Called when all the headers have been parsed. */\n\tvirtual void OnHeadersFinished(void) override\n\t{\n\t\tprintf(\"Headers finished\\n\");\n\t}\n\n\t/** Called for each chunk of the incoming body data. */\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override\n\t{\n\t\tAString hexDump;\n\t\tCreateHexDump(hexDump, a_Data, a_Size, 16);\n\t\tprintf(\"Body data: %u bytes\\n%s\", static_cast<unsigned>(a_Size), hexDump.c_str());\n\t}\n\n\tvirtual void OnBodyFinished(void) override\n\t{\n\t\tprintf(\"Body finished\\n\");\n\t}\n};\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tLOGD(\"Test started\");\n\n\t// Open the input file:\n\tif (argc <= 1)\n\t{\n\t\tprintf(\"Usage: %s <filename> [<buffersize>]\\n\", argv[0]);\n\t\treturn 1;\n\t}\n\tFILE * f;\n\tif (strcmp(argv[1], \"-\") == 0)\n\t{\n\t\tf = stdin;\n\t}\n\telse\n\t{\n\t\tf = fopen(argv[1], \"rb\");\n\t\tif (f == nullptr)\n\t\t{\n\t\t\tprintf(\"Cannot open file \\\"%s\\\". Aborting.\\n\", argv[1]);\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// If a third param is present, use it as the buffer size\n\tsize_t bufSize = MAX_BUF;\n\tif (argc >= 3)\n\t{\n\t\tif (!StringToInteger(argv[2], bufSize) || (bufSize == 0))\n\t\t{\n\t\t\tbufSize = MAX_BUF;\n\t\t\tprintf(\"\\\"%s\\\" is not a valid buffer size, using the default of %u instead.\\n\", argv[2], static_cast<unsigned>(bufSize));\n\t\t}\n\t\tif (bufSize > MAX_BUF)\n\t\t{\n\t\t\tbufSize = MAX_BUF;\n\t\t\tprintf(\"\\\"%s\\\" is too large, maximum buffer size is %u. Using the size %u instead.\\n\", argv[2], static_cast<unsigned>(bufSize), static_cast<unsigned>(bufSize));\n\t\t}\n\t}\n\n\t// Feed the file contents into the parser:\n\tcCallbacks callbacks;\n\tcHTTPMessageParser parser(callbacks);\n\twhile (true)\n\t{\n\t\tchar buf[MAX_BUF];\n\t\tauto numBytes = fread(buf, 1, bufSize, f);\n\t\tif (numBytes == 0)\n\t\t{\n\t\t\tprintf(\"Read 0 bytes from file (EOF?), terminating\\n\");\n\t\t\tbreak;\n\t\t}\n\t\tauto numConsumed = parser.Parse(buf, numBytes);\n\t\tif (numConsumed == AString::npos)\n\t\t{\n\t\t\tprintf(\"Parser indicates there was an error, terminating parsing.\\n\");\n\t\t\tbreak;\n\t\t}\n\t\tASSERT(numConsumed <= numBytes);\n\t\tif (numConsumed < numBytes)\n\t\t{\n\t\t\tprintf(\"Parser indicates stream end, but there's more data (at least %u bytes) in the file.\\n\", static_cast<unsigned>(numBytes - numConsumed));\n\t\t}\n\t}\n\tif (!parser.IsFinished())\n\t{\n\t\tprintf(\"Parser indicates an incomplete stream.\\n\");\n\t}\n\n\t// Close the input file:\n\tif (f != stdin)\n\t{\n\t\tfclose(f);\n\t}\n\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/HTTP/HTTPRequest1.data",
    "content": "GET /some/url HTTP/1.1\r\nNote: This is a test of a regular request\r\nContent-Length: 3\r\nEmpty-Header:\r\nAlmost-Empty-Header: a\r\nTwo-Char-Header: 12\r\n\r\nbla"
  },
  {
    "path": "tests/HTTP/HTTPRequest2.data",
    "content": "GET /some/url HTTP/1.1\r\nNote: This is a test of a regular body-less request\r\n\r\n"
  },
  {
    "path": "tests/HTTP/HTTPRequestParser_file.cpp",
    "content": "\n// HTTPResponseParser_file.cpp\n\n// Implements a test that feeds file contents into a cHTTPResponseParser instance and prints all callbacks\n\n#include \"Globals.h\"\n#include \"HTTP/HTTPRequestParser.h\"\n\n\n\n\n\n/** Maximum size of the input buffer, through which the file is read */\nstatic const size_t MAX_BUF = 4096;\n\n\n\n\n\nclass cCallbacks:\n\tpublic cHTTPRequestParser::cCallbacks\n{\n\ttypedef cHTTPResponseParser::cCallbacks Super;\npublic:\n\tcCallbacks(void)\n\t{\n\t\tprintf(\"cCallbacks created\\n\");\n\t}\n\n\t// cHTTPResponseParser::cCallbacks overrides:\n\tvirtual void OnError(const AString & a_ErrorDescription) override\n\t{\n\t\tprintf(\"Error: \\\"%s\\\"\\n\", a_ErrorDescription.c_str());\n\t}\n\n\t/** Called when the status line is fully parsed. */\n\tvirtual void OnStatusLine(const AString & a_StatusLine) override\n\t{\n\t\tprintf(\"Status line: \\\"%s\\\"\\n\", a_StatusLine.c_str());\n\t}\n\n\t/** Called when a single header line is parsed. */\n\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\tprintf(\"Header line: \\\"%s\\\": \\\"%s\\\"\\n\", a_Key.c_str(), a_Value.c_str());\n\t}\n\n\t/** Called when all the headers have been parsed. */\n\tvirtual void OnHeadersFinished(void) override\n\t{\n\t\tprintf(\"Headers finished\\n\");\n\t}\n\n\t/** Called for each chunk of the incoming body data. */\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override\n\t{\n\t\tAString hexDump;\n\t\tCreateHexDump(hexDump, a_Data, a_Size, 16);\n\t\tprintf(\"Body data: %u bytes\\n%s\", static_cast<unsigned>(a_Size), hexDump.c_str());\n\t}\n\n\tvirtual void OnBodyFinished(void) override\n\t{\n\t\tprintf(\"Body finished\\n\");\n\t}\n};\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tprintf(\"HTTPResponseParser_file beginning\\n\");\n\n\t// Open the input file:\n\tif (argc <= 1)\n\t{\n\t\tprintf(\"Usage: %s <filename> [<buffersize>]\\n\", argv[0]);\n\t\treturn 1;\n\t}\n\tFILE * f;\n\tif (strcmp(argv[1], \"-\") == 0)\n\t{\n\t\tf = stdin;\n\t}\n\telse\n\t{\n\t\tf = fopen(argv[1], \"rb\");\n\t\tif (f == nullptr)\n\t\t{\n\t\t\tprintf(\"Cannot open file \\\"%s\\\". Aborting.\\n\", argv[1]);\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// If a third param is present, use it as the buffer size\n\tsize_t bufSize = MAX_BUF;\n\tif (argc >= 3)\n\t{\n\t\tif (!StringToInteger(argv[2], bufSize) || (bufSize == 0))\n\t\t{\n\t\t\tbufSize = MAX_BUF;\n\t\t\tprintf(\"\\\"%s\\\" is not a valid buffer size, using the default of %u instead.\\n\", argv[2], static_cast<unsigned>(bufSize));\n\t\t}\n\t\tif (bufSize > MAX_BUF)\n\t\t{\n\t\t\tbufSize = MAX_BUF;\n\t\t\tprintf(\"\\\"%s\\\" is too large, maximum buffer size is %u. Using the size %u instead.\\n\", argv[2], static_cast<unsigned>(bufSize), static_cast<unsigned>(bufSize));\n\t\t}\n\t}\n\n\t// Feed the file contents into the parser:\n\tcCallbacks callbacks;\n\tcHTTPResponseParser parser(callbacks);\n\twhile (!feof(f))\n\t{\n\t\tchar buf[MAX_BUF];\n\t\tauto numBytes = fread(buf, 1, bufSize, f);\n\t\tif (numBytes == 0)\n\t\t{\n\t\t\tprintf(\"Read 0 bytes from file (EOF?), terminating\\n\");\n\t\t\tbreak;\n\t\t}\n\t\tauto numConsumed = parser.Parse(buf, numBytes);\n\t\tif (numConsumed == AString::npos)\n\t\t{\n\t\t\tprintf(\"Parser indicates there was an error, terminating parsing.\\n\");\n\t\t\tbreak;\n\t\t}\n\t\tASSERT(numConsumed <= numBytes);\n\t\tif (numConsumed < numBytes)\n\t\t{\n\t\t\tprintf(\"Parser indicates stream end, but there's more data (at least %u bytes) in the file.\\n\", static_cast<unsigned>(numBytes - numConsumed));\n\t\t}\n\t}\n\tif (!parser.IsFinished())\n\t{\n\t\tprintf(\"Parser indicates an incomplete stream.\\n\");\n\t}\n\n\t// Close the input file:\n\tif (f != stdin)\n\t{\n\t\tfclose(f);\n\t}\n\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/HTTP/HTTPResponse1.data",
    "content": "HTTP/1.0 200 OK\r\nNote: This is a test of a regular response with Content-Length set\r\n (identity transfer encoding)\r\nNote2: The above header also tests multi-line header lines\r\nNote3: The data is 2 bytes longer than the actual request, parser should indicate 2 extra bytes at the end\r\nHeader1: Value1\r\nHeader2: Value2\r\nContent-Length: 3\r\nEmpty-Header:\r\n\r\nbla\r\n"
  },
  {
    "path": "tests/HTTP/HTTPResponse2.data",
    "content": "HTTP/1.0 200 OK\r\nNote: This is a Chunked transfer encoding test\r\nHeader2: Value2\r\nTransfer-Encoding: chunked\r\nEmpty-Header:\r\n\r\n4\r\nWiki\r\n5\r\npedia\r\ne\r\n in\r\n\r\nchunks.\r\n0\r\n\r\n"
  },
  {
    "path": "tests/HTTP/HTTPResponseParser_file.cpp",
    "content": "\n// HTTPResponseParser_file.cpp\n\n// Implements a test that feeds file contents into a cHTTPResponseParser instance and prints all callbacks\n\n#include \"Globals.h\"\n#include \"HTTP/HTTPResponseParser.h\"\n\n\n\n\n\n/** Maximum size of the input buffer, through which the file is read */\nstatic const size_t MAX_BUF = 4096;\n\n\n\n\n\nclass cCallbacks:\n\tpublic cHTTPResponseParser::cCallbacks\n{\n\ttypedef cHTTPResponseParser::cCallbacks Super;\npublic:\n\tcCallbacks(void)\n\t{\n\t\tprintf(\"cCallbacks created\\n\");\n\t}\n\n\t// cHTTPResponseParser::cCallbacks overrides:\n\tvirtual void OnError(const AString & a_ErrorDescription) override\n\t{\n\t\tprintf(\"Error: \\\"%s\\\"\\n\", a_ErrorDescription.c_str());\n\t}\n\n\t/** Called when the status line is fully parsed. */\n\tvirtual void OnStatusLine(const AString & a_StatusLine) override\n\t{\n\t\tprintf(\"Status line: \\\"%s\\\"\\n\", a_StatusLine.c_str());\n\t}\n\n\t/** Called when a single header line is parsed. */\n\tvirtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\tprintf(\"Header line: \\\"%s\\\": \\\"%s\\\"\\n\", a_Key.c_str(), a_Value.c_str());\n\t}\n\n\t/** Called when all the headers have been parsed. */\n\tvirtual void OnHeadersFinished(void) override\n\t{\n\t\tprintf(\"Headers finished\\n\");\n\t}\n\n\t/** Called for each chunk of the incoming body data. */\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override\n\t{\n\t\tAString hexDump;\n\t\tCreateHexDump(hexDump, a_Data, a_Size, 16);\n\t\tprintf(\"Body data: %u bytes\\n%s\", static_cast<unsigned>(a_Size), hexDump.c_str());\n\t}\n\n\tvirtual void OnBodyFinished(void) override\n\t{\n\t\tprintf(\"Body finished\\n\");\n\t}\n};\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tprintf(\"HTTPResponseParser_file beginning\\n\");\n\n\t// Open the input file:\n\tif (argc <= 1)\n\t{\n\t\tprintf(\"Usage: %s <filename> [<buffersize>]\\n\", argv[0]);\n\t\treturn 1;\n\t}\n\tFILE * f;\n\tif (strcmp(argv[1], \"-\") == 0)\n\t{\n\t\tf = stdin;\n\t}\n\telse\n\t{\n\t\tf = fopen(argv[1], \"rb\");\n\t\tif (f == nullptr)\n\t\t{\n\t\t\tprintf(\"Cannot open file \\\"%s\\\". Aborting.\\n\", argv[1]);\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// If a third param is present, use it as the buffer size\n\tsize_t bufSize = MAX_BUF;\n\tif (argc >= 3)\n\t{\n\t\tif (!StringToInteger(argv[2], bufSize) || (bufSize == 0))\n\t\t{\n\t\t\tbufSize = MAX_BUF;\n\t\t\tprintf(\"\\\"%s\\\" is not a valid buffer size, using the default of %u instead.\\n\", argv[2], static_cast<unsigned>(bufSize));\n\t\t}\n\t\tif (bufSize > MAX_BUF)\n\t\t{\n\t\t\tbufSize = MAX_BUF;\n\t\t\tprintf(\"\\\"%s\\\" is too large, maximum buffer size is %u. Using the size %u instead.\\n\", argv[2], static_cast<unsigned>(bufSize), static_cast<unsigned>(bufSize));\n\t\t}\n\t}\n\n\t// Feed the file contents into the parser:\n\tcCallbacks callbacks;\n\tcHTTPResponseParser parser(callbacks);\n\twhile (!feof(f))\n\t{\n\t\tchar buf[MAX_BUF];\n\t\tauto numBytes = fread(buf, 1, bufSize, f);\n\t\tif (numBytes == 0)\n\t\t{\n\t\t\tprintf(\"Read 0 bytes from file (EOF?), terminating\\n\");\n\t\t\tbreak;\n\t\t}\n\t\tauto numConsumed = parser.Parse(buf, numBytes);\n\t\tif (numConsumed == AString::npos)\n\t\t{\n\t\t\tprintf(\"Parser indicates there was an error, terminating parsing.\\n\");\n\t\t\tbreak;\n\t\t}\n\t\tASSERT(numConsumed <= numBytes);\n\t\tif (numConsumed < numBytes)\n\t\t{\n\t\t\tprintf(\"Parser indicates stream end, but there's more data (at least %u bytes) in the file.\\n\", static_cast<unsigned>(numBytes - numConsumed));\n\t\t}\n\t}\n\tif (!parser.IsFinished())\n\t{\n\t\tprintf(\"Parser indicates an incomplete stream.\\n\");\n\t}\n\n\t// Close the input file:\n\tif (f != stdin)\n\t{\n\t\tfclose(f);\n\t}\n\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/HTTP/UrlClientTest.cpp",
    "content": "\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"HTTP/UrlClient.h\"\n#include \"OSSupport/NetworkSingleton.h\"\n\n\n\n\nnamespace\n{\n\n\n\n\n\n// When under debugger, set timeouts to practically \"never\" so that there's time to step through the code:\n#ifdef NDEBUG\n\tstatic const UInt32 TIMEOUT = 10000;  // 10 seconds\n#else\n\tstatic const UInt32 TIMEOUT = 0xffffffff;  // ~4.3M seconds / ~49 days\n#endif\n\n\n\n\n\n/** Track number of cCallbacks instances alive. */\nstd::atomic<int> g_ActiveCallbacks{ 0 };\n\n/** Simple callbacks that dump the events to the console and signalize a cEvent when the request is finished. */\nclass cCallbacks:\n\tpublic cUrlClient::cCallbacks\n{\npublic:\n\tcCallbacks(std::shared_ptr<cEvent> a_Event):\n\t\tm_Event(std::move(a_Event))\n\t{\n\t\t++g_ActiveCallbacks;\n\t\tLOGD(\"Created a cCallbacks instance at %p\", reinterpret_cast<void *>(this));\n\t}\n\n\n\tvirtual ~cCallbacks() override\n\t{\n\t\t--g_ActiveCallbacks;\n\t\tLOGD(\"Deleting the cCallbacks instance at %p\", reinterpret_cast<void *>(this));\n\t}\n\n\n\tvirtual void OnConnected(cTCPLink & a_Link) override\n\t{\n\t\tLOG(\"Link connected to %s:%u\", a_Link.GetRemoteIP().c_str(), a_Link.GetRemotePort());\n\t}\n\n\n\tvirtual bool OnCertificateReceived() override\n\t{\n\t\tLOG(\"Server certificate received\");\n\t\treturn true;\n\t}\n\n\n\tvirtual void OnTlsHandshakeCompleted() override\n\t{\n\t\tLOG(\"TLS handshake has completed.\");\n\t}\n\n\n\tvirtual void OnRequestSent() override\n\t{\n\t\tLOG(\"Request has been sent\");\n\t}\n\n\n\tvirtual void OnHeader(const AString & a_Key, const AString & a_Value) override\n\t{\n\t\tLOG(\"HTTP Header: \\\"%s\\\" -> \\\"%s\\\"\", a_Key.c_str(), a_Value.c_str());\n\t}\n\n\n\tvirtual void OnHeadersFinished() override\n\t{\n\t\tLOG(\"HTTP headers finished.\");\n\t}\n\n\n\tvirtual void OnBodyData(const void * a_Data, size_t a_Size) override\n\t{\n\t\t#if 0\n\t\t\t// Output the whole received data blob:\n\t\t\tAString body(reinterpret_cast<const char *>(a_Data), a_Size);\n\t\t\tLOG(\"Body part:\\n%s\", body.c_str());\n\t\t#else\n\t\t\t// Output only the data size, to keep the log short:\n\t\t\tLOG(\"Body part: %u bytes\", static_cast<unsigned>(a_Size));\n\t\t#endif\n\t}\n\n\n\tvirtual void OnBodyFinished() override\n\t{\n\t\tLOG(\"Body finished.\");\n\t\tm_Event->Set();\n\t}\n\n\n\tvirtual void OnRedirecting(const AString & a_RedirectUrl) override\n\t{\n\t\tLOG(\"Redirecting to \\\"%s\\\".\", a_RedirectUrl.c_str());\n\t}\n\n\n\tvirtual void OnError(const AString & a_ErrorMsg) override\n\t{\n\t\tLOG(\"Error: %s\", a_ErrorMsg.c_str());\n\t\tm_Event->Set();\n\t}\n\nprotected:\n\tstd::shared_ptr<cEvent> m_Event;\n};\n\n\n\n\n\n/** The trusted root CAs for individual servers. */\nnamespace TrustedCAs\n{\n\t// DigiCert Global Root CA (sessionserver.mojang.com)\n\t// Downloaded from https://www.digicert.com/kb/digicert-root-certificates.htm\n\t// DigiCert Global Root CA\n\tstatic const char MojangComSessionServer[] =\n\t\t\"-----BEGIN CERTIFICATE-----\\n\"\n\t\t\"MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\\n\"\n\t\t\"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\\n\"\n\t\t\"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\\n\"\n\t\t\"MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\\n\"\n\t\t\"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\\n\"\n\t\t\"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\\n\"\n\t\t\"9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\\n\"\n\t\t\"2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\\n\"\n\t\t\"1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\\n\"\n\t\t\"q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\\n\"\n\t\t\"tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\\n\"\n\t\t\"vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\\n\"\n\t\t\"BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\\n\"\n\t\t\"5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\\n\"\n\t\t\"1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\\n\"\n\t\t\"NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\\n\"\n\t\t\"Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\\n\"\n\t\t\"8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\\n\"\n\t\t\"pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\\n\"\n\t\t\"MrY=\\n\"\n\t\t\"-----END CERTIFICATE-----\\n\";\n\n\t// DigiCert Global Root G2 (api.mojang.com)\n\t// Downloaded from https://www.digicert.com/kb/digicert-root-certificates.htm\n\t// DigiCert Global Root G2\n\tstatic const char MojangComAPIMojang[] =\n\t\t\"-----BEGIN CERTIFICATE-----\\n\"\n\t\t\"MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\\n\"\n\t\t\"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\\n\"\n\t\t\"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\\n\"\n\t\t\"MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\\n\"\n\t\t\"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\\n\"\n\t\t\"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\\n\"\n\t\t\"9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\\n\"\n\t\t\"2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\\n\"\n\t\t\"1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\\n\"\n\t\t\"q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\\n\"\n\t\t\"tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\\n\"\n\t\t\"vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\\n\"\n\t\t\"BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\\n\"\n\t\t\"5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\\n\"\n\t\t\"1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\\n\"\n\t\t\"NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\\n\"\n\t\t\"Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\\n\"\n\t\t\"8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\\n\"\n\t\t\"pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\\n\"\n\t\t\"MrY=\\n\"\n\t\t\"-----END CERTIFICATE-----\\n\";\n\n\t// The root cert used by github.com\n\tstatic const char GithubCom[] =\n\t\t\"-----BEGIN CERTIFICATE-----\\n\"\n\t\t\"MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL\\n\"\n\t\t\"MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl\\n\"\n\t\t\"eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT\\n\"\n\t\t\"JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx\\n\"\n\t\t\"MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT\\n\"\n\t\t\"Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg\\n\"\n\t\t\"VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm\\n\"\n\t\t\"aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo\\n\"\n\t\t\"I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng\\n\"\n\t\t\"o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G\\n\"\n\t\t\"A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD\\n\"\n\t\t\"VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB\\n\"\n\t\t\"zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW\\n\"\n\t\t\"RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\\n\"\n\t\t\"-----END CERTIFICATE-----\\n\";\n\n\t// The root cert used by github.com in the past (no longer used)\n\tstatic const char GithubComOld[] =\n\t\t\"-----BEGIN CERTIFICATE-----\\n\"\n\t\t\"MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBh\\n\"\n\t\t\"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\\n\"\n\t\t\"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\\n\"\n\t\t\"QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVT\\n\"\n\t\t\"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBI\\n\"\n\t\t\"eWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IA\\n\"\n\t\t\"BMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJ\\n\"\n\t\t\"qLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8v\\n\"\n\t\t\"c6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5\\n\"\n\t\t\"bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4G\\n\"\n\t\t\"A1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYI\\n\"\n\t\t\"KwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j\\n\"\n\t\t\"b20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp\\n\"\n\t\t\"Q2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny\\n\"\n\t\t\"bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAE\\n\"\n\t\t\"NjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgG\\n\"\n\t\t\"BmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr\\n\"\n\t\t\"6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsY\\n\"\n\t\t\"kDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/\\n\"\n\t\t\"BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hos\\n\"\n\t\t\"Vq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEh\\n\"\n\t\t\"xRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA==\\n\"\n\t\t\"-----END CERTIFICATE-----\\n\";\n\n\t// The root cert used by cuberite.org\n\tstatic const char CuberiteOrg[] =\n\t\t\"-----BEGIN CERTIFICATE-----\\n\"\n\t\t\"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\\n\"\n\t\t\"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\\n\"\n\t\t\"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\\n\"\n\t\t\"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\\n\"\n\t\t\"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\\n\"\n\t\t\"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\\n\"\n\t\t\"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\\n\"\n\t\t\"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\\n\"\n\t\t\"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\\n\"\n\t\t\"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\\n\"\n\t\t\"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\\n\"\n\t\t\"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\\n\"\n\t\t\"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\\n\"\n\t\t\"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\\n\"\n\t\t\"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\\n\"\n\t\t\"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\\n\"\n\t\t\"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\\n\"\n\t\t\"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\\n\"\n\t\t\"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\\n\"\n\t\t\"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\\n\"\n\t\t\"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\\n\"\n\t\t\"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\\n\"\n\t\t\"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\\n\"\n\t\t\"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\\n\"\n\t\t\"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\\n\"\n\t\t\"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\\n\"\n\t\t\"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\\n\"\n\t\t\"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\\n\"\n\t\t\"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\\n\"\n\t\t\"-----END CERTIFICATE-----\\n\";\n}\n\n\n\n\n\nint TestRequest1()\n{\n\tLOG(\"Running test 1 - fetch http://github.com without redirects\");\n\tauto evtFinished = std::make_shared<cEvent>();\n\tauto callbacks = std::make_unique<cCallbacks>(evtFinished);\n\tAStringMap options;\n\toptions[\"MaxRedirects\"] = \"0\";\n\tauto res = cUrlClient::Get(\"http://github.com\", std::move(callbacks), AStringMap(), AString(), std::move(options));\n\tif (res.first)\n\t{\n\t\tif (!evtFinished->Wait(TIMEOUT))\n\t\t{\n\t\t\tLOG(\"Aborting the wait for response; failing the test.\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tLOG(\"Immediate error: %s\", res.second.c_str());\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint TestRequest2()\n{\n\tLOG(\"Running test 2 - default fetch http://github.com\");\n\tauto evtFinished = std::make_shared<cEvent>();\n\tauto callbacks = std::make_unique<cCallbacks>(evtFinished);\n\tauto res = cUrlClient::Get(\"http://github.com\", std::move(callbacks));\n\tif (res.first)\n\t{\n\t\tif (!evtFinished->Wait(TIMEOUT))\n\t\t{\n\t\t\tLOG(\"Aborting the wait for response; failing the test.\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tLOG(\"Immediate error: %s\", res.second.c_str());\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint TestRequest3()\n{\n\tLOG(\"Running test 3 - fetch https://github.com without redirects\");\n\tauto evtFinished = std::make_shared<cEvent>();\n\tauto callbacks = std::make_unique<cCallbacks>(evtFinished);\n\tAStringMap options;\n\toptions[\"MaxRedirects\"] = \"0\";\n\tauto res = cUrlClient::Get(\"https://github.com\", std::move(callbacks), AStringMap(), AString(), std::move(options));\n\tif (res.first)\n\t{\n\t\tif (!evtFinished->Wait(TIMEOUT))\n\t\t{\n\t\t\tLOG(\"Aborting the wait for response; failing the test.\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tLOG(\"Immediate error: %s\", res.second.c_str());\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint TestRequest4()\n{\n\tLOG(\"Running test 4 - fetch https://github.com with GitHub trusted root CA\");\n\tauto evtFinished = std::make_shared<cEvent>();\n\tauto callbacks = std::make_unique<cCallbacks>(evtFinished);\n\tAStringMap options;\n\toptions[\"TrustedRootCAs\"] = TrustedCAs::GithubCom;\n\tauto res = cUrlClient::Get(\"https://github.com\", std::move(callbacks), {}, {}, options);\n\tif (res.first)\n\t{\n\t\tif (!evtFinished->Wait(TIMEOUT))\n\t\t{\n\t\t\tLOG(\"Aborting the wait for response; failing the test.\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tLOG(\"Immediate error: %s\", res.second.c_str());\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint TestRequest5()\n{\n\tLOG(\"Running test 5 - fetch https://cuberite.org with Cuberite trusted root CA\");\n\tauto evtFinished = std::make_shared<cEvent>();\n\tauto callbacks = std::make_unique<cCallbacks>(evtFinished);\n\tAStringMap options;\n\toptions[\"TrustedRootCAs\"] = TrustedCAs::CuberiteOrg;\n\tauto res = cUrlClient::Get(\"https://cuberite.org\", std::move(callbacks), {}, {}, options);\n\tif (res.first)\n\t{\n\t\tif (!evtFinished->Wait(TIMEOUT))\n\t\t{\n\t\t\tLOG(\"Aborting the wait for response; failing the test.\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tLOG(\"Immediate error: %s\", res.second.c_str());\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint TestRequest6()\n{\n\tLOG(\"Running test 6 - fetch https://sessionserver.mojang.com with Mojang trusted root CA\");\n\tauto evtFinished = std::make_shared<cEvent>();\n\tauto callbacks = std::make_unique<cCallbacks>(evtFinished);\n\tAStringMap options;\n\toptions[\"TrustedRootCAs\"] = TrustedCAs::MojangComSessionServer;\n\tauto res = cUrlClient::Get(\"https://sessionserver.mojang.com\", std::move(callbacks), {}, {}, options);\n\tif (res.first)\n\t{\n\t\tif (!evtFinished->Wait(TIMEOUT))\n\t\t{\n\t\t\tLOG(\"Aborting the wait for response; failing the test.\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tLOG(\"Immediate error: %s\", res.second.c_str());\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint TestRequest7()\n{\n\tLOG(\"Running test 7 - fetch https://api.mojang.com with Mojang trusted root CA\");\n\tauto evtFinished = std::make_shared<cEvent>();\n\tauto callbacks = std::make_unique<cCallbacks>(evtFinished);\n\tAStringMap options;\n\toptions[\"TrustedRootCAs\"] = TrustedCAs::MojangComAPIMojang;\n\tauto res = cUrlClient::Get(\"https://api.mojang.com\", std::move(callbacks), {}, {}, options);\n\tif (res.first)\n\t{\n\t\tif (!evtFinished->Wait(TIMEOUT))\n\t\t{\n\t\t\tLOG(\"Aborting the wait for response; failing the test.\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tLOG(\"Immediate error: %s\", res.second.c_str());\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint TestRequest8()\n{\n\tLOG(\"Running test 8 - fetch https://api.mojang.com with GitHub trusted root CA (testing CA verification rejection)\");\n\tauto evtFinished = std::make_shared<cEvent>();\n\tauto callbacks = std::make_unique<cCallbacks>(evtFinished);\n\tAStringMap options;\n\toptions[\"TrustedRootCAs\"] = TrustedCAs::GithubCom;\n\tauto [isSuccess, response] = cUrlClient::BlockingGet(\"https://api.mojang.com\", {}, {}, options);\n\tif (isSuccess)\n\t{\n\t\tLOG(\"CA verification failure, should have rejected the connection due to bad root CA.\");\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n\n\n\n\nint TestRequests()\n{\n\tusing func_t = int(void);\n\tfunc_t * tests[] =\n\t{\n\t\t&TestRequest1,\n\t\t&TestRequest2,\n\t\t&TestRequest3,\n\t\t&TestRequest4,\n\t\t&TestRequest5,\n\t\t&TestRequest6,\n\t\t&TestRequest7,\n\t\t&TestRequest8,\n\t};\n\tfor (auto test: tests)\n\t{\n\t\tLOG(\"%s\", AString(60, '-').c_str());\n\t\tauto res = test();\n\t\tif (res != 0)\n\t\t{\n\t\t\treturn res;\n\t\t}\n\t}\n\treturn 0;\n}\n\n}  // namespace (anonymous)\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"UrlClient\",\n\tLOG(\"Initializing cNetwork...\");\n\tcNetworkSingleton::Get().Initialise();\n\tLOG(\"Testing...\");\n\tTEST_EQUAL(TestRequests(), 0);\n\tLOG(\"Terminating cNetwork...\");\n\tcNetworkSingleton::Get().Terminate();\n\n\t// No leaked callback instances\n\tLOG(\"cCallback instances still alive: %d\", g_ActiveCallbacks.load());\n\tTEST_EQUAL(g_ActiveCallbacks, 0);\n)\n"
  },
  {
    "path": "tests/LoadablePieces/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\ninclude_directories(SYSTEM ${PROJECT_SOURCE_DIR}/lib/)\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/BiomeDef.cpp\n\t${PROJECT_SOURCE_DIR}/src/BlockArea.cpp\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.cpp\n\t${PROJECT_SOURCE_DIR}/src/ChunkData.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringCompression.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/Bindings/LuaState.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkDesc.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PiecePool.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/Prefab.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabPiecePool.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalLimit.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalStrategy.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/Noise/Noise.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GZipFile.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/FastNBT.cpp\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.cpp\n)\n\nset (SHARED_HDRS\n\t${PROJECT_SOURCE_DIR}/src/BiomeDef.h\n\t${PROJECT_SOURCE_DIR}/src/BlockArea.h\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.h\n\t${PROJECT_SOURCE_DIR}/src/ChunkData.h\n\t${PROJECT_SOURCE_DIR}/src/Globals.h\n\t${PROJECT_SOURCE_DIR}/src/StringCompression.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n\n\t${PROJECT_SOURCE_DIR}/src/Bindings/LuaState.h\n\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkDesc.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PiecePool.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/Prefab.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabPiecePool.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalLimit.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalStrategy.h\n\n\t${PROJECT_SOURCE_DIR}/src/Noise/Noise.h\n\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GZipFile.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.h\n\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/FastNBT.h\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.h\n)\n\nset (SRCS\n\tLoadablePieces.cpp\n\tStubs.cpp\n\tLuaState_Typedefs.inc\n\tLuaState_Declaration.inc\n\tBindings.h\n)\n\n\nif(\"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"Clang\")\n\tadd_compile_options(\"-Wno-error=global-constructors\")\n\tadd_compile_options(\"-Wno-error=switch-enum\")\nendif()\n\n\nif (MSVC)\n\t# Add the MSVC-specific LeakFinder sources:\n\tlist (APPEND SHARED_SRCS ${PROJECT_SOURCE_DIR}/src/LeakFinder.cpp ${PROJECT_SOURCE_DIR}/src/StackWalker.cpp)\n\tlist (APPEND SHARED_HDRS ${PROJECT_SOURCE_DIR}/src/LeakFinder.h   ${PROJECT_SOURCE_DIR}/src/StackWalker.h)\nendif()\n\nsource_group(\"Shared\" FILES ${SHARED_SRCS} ${SHARED_HDRS})\nsource_group(\"Sources\" FILES ${SRCS})\nsource_group(\"Data files\" FILES Test.cubeset Test1.schematic)\nadd_executable(LoadablePieces ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS} Test.cubeset Test1.schematic)\ntarget_link_libraries(LoadablePieces libdeflate tolualib)\nadd_test(NAME LoadablePieces-test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND LoadablePieces)\n\n\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tLoadablePieces\n\tPROPERTIES FOLDER Tests\n)\n"
  },
  {
    "path": "tests/LuaThreadStress/Bindings.h",
    "content": "\n// Bindings.h\n\n// Dummy include file needed for LuaState to compile successfully\n\n\n\n\nstruct lua_State;\n\nint tolua_AllToLua_open(lua_State * a_LuaState);\n\n\n\n\n"
  },
  {
    "path": "tests/LuaThreadStress/CMakeLists.txt",
    "content": "find_package(Threads REQUIRED)\ninclude_directories(${PROJECT_SOURCE_DIR}/src/)\ninclude_directories(SYSTEM ${PROJECT_SOURCE_DIR}/lib/)\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/BiomeDef.cpp\n\t${PROJECT_SOURCE_DIR}/src/BlockArea.cpp\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.cpp\n\t${PROJECT_SOURCE_DIR}/src/ChunkData.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringCompression.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/Bindings/LuaState.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkDesc.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PieceModifier.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PiecePool.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/Prefab.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabPiecePool.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalLimit.cpp\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalStrategy.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/Noise/Noise.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GZipFile.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/FastNBT.cpp\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.cpp\n)\n\nset (SHARED_HDRS\n\t${PROJECT_SOURCE_DIR}/src/BiomeDef.h\n\t${PROJECT_SOURCE_DIR}/src/BlockArea.h\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.h\n\t${PROJECT_SOURCE_DIR}/src/ChunkData.h\n\t${PROJECT_SOURCE_DIR}/src/Globals.h\n\t${PROJECT_SOURCE_DIR}/src/StringCompression.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n\n\t${PROJECT_SOURCE_DIR}/src/Bindings/LuaState.h\n\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkDesc.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PieceModifier.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PiecePool.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/Prefab.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabPiecePool.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalLimit.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalStrategy.h\n\n\t${PROJECT_SOURCE_DIR}/src/Noise/Noise.h\n\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GZipFile.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.h\n\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/FastNBT.h\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.h\n)\n\nset (SRCS\n\tLuaThreadStress.cpp\n\tStubs.cpp\n\tLuaState_Typedefs.inc\n\tLuaState_Declaration.inc\n\tBindings.h\n)\n\n\n\nsource_group(\"Shared\" FILES ${SHARED_SRCS} ${SHARED_HDRS})\nsource_group(\"Sources\" FILES ${SRCS})\nsource_group(\"Lua files\" FILES Test.lua)\nadd_executable(LuaThreadStress ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS} Test.lua)\ntarget_link_libraries(LuaThreadStress fmt::fmt libdeflate lsqlite luaexpat Threads::Threads tolualib)\nif (WIN32)\n\ttarget_link_libraries(LuaThreadStress ws2_32)\nendif()\nadd_test(NAME LuaThreadStress-test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND LuaThreadStress)\n\n# Necessary for the test to run.\n# Otherwise they crash with the error STATUS_DLL_NOT_FOUND (0xC0000135) because they can't find the lua51.dll\n\nif(WIN32)\n\tadd_custom_command(\n\t\t\tTARGET LuaThreadStress  POST_BUILD\n\t\t\tCOMMAND ${CMAKE_COMMAND} -E copy\n\t\t\t${CMAKE_BINARY_DIR}/Server/lua51.dll # Source\n\t\t\t${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/) # Destination\n\tmessage(\"Copying lua51.dll from \" ${CMAKE_BINARY_DIR}/Server/lua51.dll \" to \" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/)\nendif()\n\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tLuaThreadStress\n\tPROPERTIES FOLDER Tests\n)\n"
  },
  {
    "path": "tests/LuaThreadStress/LuaState_Declaration.inc",
    "content": "\n// LuaState_Declaration.inc\n\n// Dummy include file needed for LuaState to compile successfully\n\n\nbool GetStackValue(int, cUUID *&);\n\n\n"
  },
  {
    "path": "tests/LuaThreadStress/LuaState_Typedefs.inc",
    "content": "\n// LuaState_Typedefs.inc\n\n// Dummy include file needed for LuaState to compile successfully\n\n\n\n\n\n// Forward-declare classes that are used in the API but never called:\nstruct HTTPRequest;\nstruct HTTPTemplateRequest;\nclass cPluginLua;\nclass cBoundingBox;\ntemplate <typename T> class cItemCallback;\nclass cEntity;\nclass cUUID;\n\n\n\n"
  },
  {
    "path": "tests/LuaThreadStress/LuaThreadStress.cpp",
    "content": "// LuaThreadStress.cpp\n\n// Implements a stress-test of cLuaState under several threads\n\n#include \"Globals.h\"\n#include \"Bindings/LuaState.h\"\n#include <thread>\n#include <random>\n\n\n\n\n\n/** How long the threading test should run. */\nstatic const int NUM_SECONDS_TO_TEST = 10;\n\n\n\n\n\n/** Retrieves a callback from the Lua state that can be later called.\nCalls the Lua function getCallback with a_Seed param to retrieve the callback. */\nstatic cLuaState::cCallbackPtr getCallback(cLuaState & a_LuaState, unsigned a_Seed)\n{\n\tcLuaState::cLock lock(a_LuaState);\n\tcLuaState::cCallbackPtr res;\n\ta_LuaState.Call(\"getCallback\", a_Seed, cLuaState::Return, res);\n\treturn res;\n}\n\n\n\n\n\n/** Runs a single thread that stress-tests the cLuaState object.\na_LuaState is the Lua state on which to operate.\na_Seed is the seed for the random number generator for this thread.\na_ShouldTerminate is a bool flag that another thread sets to ask this thread to terminate.\na_FailResult is a shared result state that is written by any thread upon failure (so if it contains nonzero, at least one thread has failed). */\nstatic void runStress(cLuaState * a_LuaState, unsigned a_Seed, std::atomic<bool> * a_ShouldTerminate, std::atomic<int> * a_FailResult)\n{\n\tstd::minstd_rand rnd;\n\trnd.seed(a_Seed);\n\tauto callbackSeed = static_cast<unsigned>(rnd());\n\tauto callback = getCallback(*a_LuaState, callbackSeed);\n\twhile (!a_ShouldTerminate->load())\n\t{\n\t\t// Pick a random operation on the Lua state and peform it:\n\t\tswitch (rnd() % 4)\n\t\t{\n\t\t\tcase 0:\n\t\t\t{\n\t\t\t\t// Get a new callback:\n\t\t\t\tcallbackSeed = callbackSeed + 1;\n\t\t\t\tcallback = getCallback(*a_LuaState, callbackSeed);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\t// Call the callback, if still available:\n\t\t\t\tauto param = static_cast<unsigned>(rnd());\n\t\t\t\tunsigned returnValue;\n\t\t\t\tif (callback->Call(param, cLuaState::Return, returnValue))\n\t\t\t\t{\n\t\t\t\t\tif (returnValue != param + callbackSeed)\n\t\t\t\t\t{\n\t\t\t\t\t\tLOGWARNING(\"Bad value returned from the callback\");\n\t\t\t\t\t\t*a_FailResult = 2;\n\t\t\t\t\t\ta_ShouldTerminate->store(true);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}  // switch (random)\n\n\t\t// Once in every ~10k operations, reload the lua state completely:\n\t\tif ((rnd() % 10000) == 0)\n\t\t{\n\t\t\tcLuaState::cLock lock(*a_LuaState);\n\t\t\ta_LuaState->Close();\n\t\t\ta_LuaState->Create();\n\t\t\tif (!a_LuaState->LoadFile(\"Test.lua\"))\n\t\t\t{\n\t\t\t\t*a_FailResult = 3;\n\t\t\t\ta_ShouldTerminate->store(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}  // while (!a_ShouldTerminate)\n}\n\n\n\n\n\nstatic int DoTest(void)\n{\n\tcLuaState L(\"LuaThreadStress test\");\n\tL.Create();\n\tif (!L.LoadFile(\"Test.lua\"))\n\t{\n\t\treturn 1;\n\t}\n\n\t// Start the concurrect threads:\n\tstd::atomic<bool> shouldTerminate(false);\n\tstd::atomic<int> failResult(0);\n\tstd::thread threads[] =\n\t{\n\t\tstd::thread(runStress, &L, 0, &shouldTerminate, &failResult),\n\t\tstd::thread(runStress, &L, 1, &shouldTerminate, &failResult),\n\t\tstd::thread(runStress, &L, 2, &shouldTerminate, &failResult),\n\t\tstd::thread(runStress, &L, 3, &shouldTerminate, &failResult),\n\t};\n\n\t// Let the threads run wild:\n\tfor (int i = 1; i <= NUM_SECONDS_TO_TEST; ++i)\n\t{\n\t\tstd::this_thread::sleep_for(std::chrono::seconds(1));\n\t\tLOG(\"Testing (%d out of %d seconds)...\", i, NUM_SECONDS_TO_TEST);\n\t}\n\n\t// Terminate everything:\n\tLOG(\"Terminating the threads\");\n\tshouldTerminate = true;\n\tfor (auto & t: threads)\n\t{\n\t\tt.join();\n\t}\n\tLOG(\"Threads terminated.\");\n\n\treturn failResult.load();\n}\n\n\n\n\n\nint main()\n{\n\tLOG(\"LuaThreadStress starting.\");\n\n\tint res = DoTest();\n\tLOG(\"LuaThreadStress test done: %s\", (res == 0) ? \"success\" : \"failure\");\n\tif (res != 0)\n\t{\n\t\treturn res;\n\t}\n\n\tLOG(\"LuaThreadStress finished.\");\n\treturn 0;\n}\n"
  },
  {
    "path": "tests/LuaThreadStress/Stubs.cpp",
    "content": "\n// Stubs.cpp\n\n// Implements stubs of various Cuberite methods that are needed for linking but not for runtime\n// This is required so that we don't bring in the entire Cuberite via dependencies\n\n#include \"Globals.h\"\n#include \"BlockInfo.h\"\n#include \"Bindings.h\"\n#include \"DeadlockDetect.h\"\n#include \"UUID.h\"\n#include \"Bindings/DeprecatedBindings.h\"\n#include \"Bindings/LuaJson.h\"\n#include \"Bindings/ManualBindings.h\"\n#include \"BlockEntities/BlockEntity.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"Generating/ChunkDesc.h\"\n\n\n\n\n\n// fwd:\nstruct lua_State;\n\n\n\n\n\n// Prototypes, needed by clang:\nextern \"C\" int luaopen_lsqlite3(lua_State * a_LuaState);\nextern \"C\" int luaopen_lxp(lua_State * a_LuaState);\n\n\n\n\n\nvoid cManualBindings::Bind(lua_State * a_LuaState)\n{\n}\n\n\n\n\n\nvoid DeprecatedBindings::Bind(lua_State * a_LuaState)\n{\n}\n\n\n\n\n\nvoid cLuaJson::Bind(cLuaState & a_LuaState)\n{\n}\n\n\n\n\n\nint tolua_AllToLua_open(lua_State * a_LuaState)\n{\n\treturn 0;\n}\n\n\n\n\n\nextern \"C\" int luaopen_lsqlite3(lua_State * a_LuaState)\n{\n\treturn 0;\n}\n\n\n\n\n\nextern \"C\" int luaopen_lxp(lua_State * a_LuaState)\n{\n\treturn 0;\n}\n\n\n\n\n\nbool cBlockInfo::IsSolid(BLOCKTYPE)\n{\n\treturn false;\n}\n\n\n\n\n\ncBoundingBox::cBoundingBox(double, double, double, double, double, double)\n{\n}\n\n\n\n\n\ncBoundingBox cBlockHandler::GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const\n{\n\treturn cBoundingBox(0, 0, 0, 0, 0, 0);\n}\n\n\n\n\n\nvoid cBlockHandler::OnUpdate(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_PluginInterface, cChunk & a_Chunk, const Vector3i a_RelPos) const\n{\n}\n\n\n\n\n\nvoid cBlockHandler::OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const\n{\n}\n\n\n\n\n\nvoid cBlockHandler::NeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor)\n{\n}\n\n\n\n\n\ncItems cBlockHandler::ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const\n{\n\treturn cItems();\n}\n\n\n\n\n\nbool cBlockHandler::CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const\n{\n\treturn true;\n}\n\n\n\n\n\nbool cBlockHandler::IsUseable() const\n{\n\treturn false;\n}\n\n\n\n\n\nbool cBlockHandler::DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, Vector3i a_Position, NIBBLETYPE a_Meta, eBlockFace a_ClickedBlockFace, bool a_ClickedDirectly) const\n{\n\treturn m_BlockType == E_BLOCK_AIR;\n}\n\n\n\n\n\nvoid cBlockHandler::Check(cChunkInterface & a_ChunkInterface, cBlockPluginInterface & a_PluginInterface, Vector3i a_RelPos, cChunk & a_Chunk) const\n{\n}\n\n\n\n\n\nColourID cBlockHandler::GetMapBaseColourID(NIBBLETYPE a_Meta) const\n{\n\treturn 0;\n}\n\n\n\n\n\nbool cBlockHandler::IsInsideBlock(Vector3d a_Position, const NIBBLETYPE a_BlockMeta) const\n{\n\treturn true;\n}\n\n\n\n\n\nconst cBlockHandler & cBlockHandler::For(BLOCKTYPE a_BlockType)\n{\n\t// Dummy handler.\n\tstatic cBlockHandler Handler(E_BLOCK_AIR);\n\treturn Handler;\n}\n\n\n\n\n\nOwnedBlockEntity cBlockEntity::CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World)\n{\n\treturn nullptr;\n}\n\n\n\n\n\nvoid cDeadlockDetect::TrackCriticalSection(cCriticalSection & a_CS, const AString & a_Name)\n{\n}\n\n\n\n\n\nvoid cDeadlockDetect::UntrackCriticalSection(cCriticalSection & a_CS)\n{\n}\n\n\n\n\n\nvoid cBlockEntity::SetPos(Vector3i a_NewPos)\n{\n}\n\n\n\n\n\nbool cBlockEntity::IsBlockEntityBlockType(BLOCKTYPE a_BlockType)\n{\n\treturn false;\n}\n\n\n\n\n\nOwnedBlockEntity cBlockEntity::Clone(Vector3i a_Pos)\n{\n\treturn nullptr;\n}\n\n\n\n\n\nbool cLuaState::GetStackValue(int, cUUID *&)\n{\n\treturn false;\n}\n\n\n\n\n\nbool cUUID::FromString(const AString &)\n{\n\treturn true;\n}\n\n\n\n\n\nint BlockStringToType(const AString &)\n{\n\treturn 0;\n}\n"
  },
  {
    "path": "tests/LuaThreadStress/Test.lua",
    "content": "-- Test.lua\n\n-- Implements the test support functions\n-- This file is loaded into the cLuaState used for stress-testing\n\n\n\n\n\n--- Returns a function that the C++ code can call\n-- The callback takes a single number as param and returns the sum of the param and the seed, given to this factory function (for verification)\nfunction getCallback(a_Seed)\n\treturn function (a_Param)\n\t\t-- print(\"Callback \" .. a_Seed .. \" called with param \" .. a_Param)\n\t\treturn a_Param + a_Seed\n\tend\nend\n"
  },
  {
    "path": "tests/Network/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\ninclude_directories(SYSTEM ${PROJECT_SOURCE_DIR}/lib/mbedtls/include)\n\nfind_package(Threads REQUIRED)\n\n# Create a single Network library that contains all the networking code:\nset (Network_SRCS\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/HostnameLookup.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/IPLookup.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/IsThread.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/NetworkInterfaceEnum.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/NetworkLookup.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/NetworkSingleton.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/ServerHandleImpl.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/TCPLinkImpl.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.cpp\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/CtrDrbgContext.cpp\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/CryptoKey.cpp\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/EntropyContext.cpp\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/SslConfig.cpp\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/SslContext.cpp\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/X509Cert.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n)\n\nset (Network_HDRS\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GetAddressInfoError.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/HostnameLookup.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/IPLookup.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/IsThread.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Network.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/NetworkLookup.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/NetworkSingleton.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/ServerHandleImpl.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/TCPLinkImpl.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Queue.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.h\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/CtrDrbgContext.h\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/CryptoKey.h\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/EntropyContext.h\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/SslConfig.h\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/SslContext.h\n\t${PROJECT_SOURCE_DIR}/src/mbedTLS++/X509Cert.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n)\n\nadd_library(Network\n\t${Network_SRCS}\n\t${Network_HDRS}\n)\n\ntarget_link_libraries(Network event_core event_extra fmt::fmt mbedtls)\nif(NOT WIN32)\n\ttarget_link_libraries(Network event_pthreads Threads::Threads)\nendif()\n\n\n\n\n\n# Define individual tests:\n\n# Google: download the google.com frontpage using http client socket:\nadd_executable(Google-exe Google.cpp)\ntarget_link_libraries(Google-exe Network)\nadd_test(NAME Google-test COMMAND Google-exe)\n\n# EchoServer: Listen on port 9876, echo everything back:\nadd_executable(EchoServer EchoServer.cpp)\ntarget_link_libraries(EchoServer Network)\n\n# NameLookup: Lookup hostname-to-IP and IP-to-hostname:\nadd_executable(NameLookup NameLookup.cpp)\ntarget_link_libraries(NameLookup Network)\n\n# EnumInterfaces: List all network interfaces:\nadd_executable(EnumInterfaces-exe EnumInterfaces.cpp)\ntarget_link_libraries(EnumInterfaces-exe Network)\nadd_test(NAME EnumInterfaces-test COMMAND EnumInterfaces-exe)\n\n\n\n\n# Put all the tests into a solution folder (MSVC):\nset_target_properties(\n\tEchoServer\n\tGoogle-exe\n\tNameLookup\n\tEnumInterfaces-exe\n\tPROPERTIES FOLDER Tests/Network\n)\nset_target_properties(\n\tNetwork\n\tPROPERTIES FOLDER Tests/Libraries\n)\n\n\n\n\n"
  },
  {
    "path": "tests/Network/EchoServer.cpp",
    "content": "\n// EchoServer.cpp\n\n// Implements an Echo server using the LibEvent-based cNetwork API, as a test of that API\n\n#include \"Globals.h\"\n#include <iostream>\n#include <string>\n#include \"OSSupport/Network.h\"\n#include \"OSSupport/NetworkSingleton.h\"\n\n\n\n\n\n/** cTCPLink callbacks that echo everything they receive back to the remote peer. */\nclass cEchoLinkCallbacks:\n\tpublic cTCPLink::cCallbacks\n{\n\t// cTCPLink::cCallbacks overrides:\n\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) override\n\t{\n\t\tASSERT(m_Link == nullptr);\n\t\tm_Link = a_Link;\n\t}\n\n\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Size) override\n\t{\n\t\tASSERT(m_Link != nullptr);\n\n\t\t// Echo the incoming data back to outgoing data:\n\t\tLOGD(\"%p (%s:%d): Data received (%u bytes), echoing back.\", static_cast<void *>(m_Link.get()), m_Link->GetRemoteIP().c_str(), m_Link->GetRemotePort(), static_cast<unsigned>(a_Size));\n\t\tm_Link->Send(a_Data, a_Size);\n\t\tLOGD(\"Echo queued\");\n\n\t\t// Search for a Ctrl+Z, if found, drop the connection:\n\t\tfor (size_t i = 0; i < a_Size; i++)\n\t\t{\n\t\t\tif (a_Data[i] == '\\x1a')\n\t\t\t{\n\t\t\t\tm_Link->Close();\n\t\t\t\tm_Link.reset();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tvirtual void OnRemoteClosed(void) override\n\t{\n\t\tASSERT(m_Link != nullptr);\n\n\t\tLOGD(\"%p (%s:%d): Remote has closed the connection.\", static_cast<void *>(m_Link.get()), m_Link->GetRemoteIP().c_str(), m_Link->GetRemotePort());\n\t\tm_Link.reset();\n\t}\n\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tASSERT(m_Link != nullptr);\n\n\t\tLOGD(\"%p (%s:%d): Error %d in the cEchoLinkCallbacks: %s\", static_cast<void *>(m_Link.get()), m_Link->GetRemoteIP().c_str(), m_Link->GetRemotePort(), a_ErrorCode, a_ErrorMsg.c_str());\n\t\tm_Link.reset();\n\t}\n\n\t/** The link attached to this callbacks instance. */\n\tcTCPLinkPtr m_Link;\n};\n\n\n\n\n\nclass cEchoServerCallbacks:\n\tpublic cNetwork::cListenCallbacks\n{\n\tvirtual cTCPLink::cCallbacksPtr OnIncomingConnection(const AString & a_RemoteIPAddress, UInt16 a_RemotePort) override\n\t{\n\t\tLOGD(\"New incoming connection(%s:%d).\", a_RemoteIPAddress.c_str(), a_RemotePort);\n\t\treturn std::make_shared<cEchoLinkCallbacks>();\n\t}\n\n\tvirtual void OnAccepted(cTCPLink & a_Link) override\n\t{\n\t\tLOGD(\"New client accepted (%s:%d), sending welcome message.\", a_Link.GetRemoteIP().c_str(), a_Link.GetRemotePort());\n\t\t// Send a welcome message to each connecting client:\n\t\ta_Link.Send(\"Welcome to the simple echo server.\\r\\n\");\n\t\tLOGD(\"Welcome message queued.\");\n\t}\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tLOGWARNING(\"An error occured while listening for connections: %d (%s).\", a_ErrorCode, a_ErrorMsg.c_str());\n\t}\n};\n\n\n\n\n\nstatic void DoTest(void)\n{\n\tLOGD(\"EchoServer: starting up\");\n\tcServerHandlePtr Server = cNetwork::Listen(9876, std::make_shared<cEchoServerCallbacks>());\n\tif (!Server->IsListening())\n\t{\n\t\tLOGWARNING(\"Cannot listen on port 9876\");\n\t\tabort();\n\t}\n\tASSERT(Server->IsListening());\n\n\t// Wait for the user to terminate the server:\n\tprintf(\"Press enter to close the server.\\n\");\n\tAString line;\n\tstd::getline(std::cin, line);\n\n\t// Close the server and all its active connections:\n\tLOG(\"Server terminating.\");\n\tServer->Close();\n\tASSERT(!Server->IsListening());\n\tServer.reset();\n\tLOGD(\"Server has been closed.\");\n}\n\n\n\n\n\nint main()\n{\n\tDoTest();\n\n\tprintf(\"Press enter to exit test.\\n\");\n\tAString line;\n\tstd::getline(std::cin, line);\n\tcNetworkSingleton::Get().Terminate();\n\n\tLOG(\"Network test finished.\");\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/Network/EnumInterfaces.cpp",
    "content": "\n// EnumInterfaces.cpp\n\n// Implements the main app entrypoint for the EnumInterfaces network test\n// Lists all network interfaces to the console\n\n#include \"Globals.h\"\n#include \"OSSupport/Network.h\"\n#include \"OSSupport/NetworkSingleton.h\"\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\t// Initialize the cNetwork subsystem:\n\tLOGD(\"Initializing cNetwork...\");\n\tcNetworkSingleton::Get().Initialise();\n\n\t// Enumerate all the addresses:\n\tprintf(\"Enumerating all IP addresses...\\n\");\n\tauto IPs = cNetwork::EnumLocalIPAddresses();\n\tfor (auto & ip: IPs)\n\t{\n\t\tLOGD(\"  %s\", ip.c_str());\n\t}\n\tLOGD(\"All addresses enumerated.\");\n\n\t// Terminate the cNetwork subsystem:\n\tcNetworkSingleton::Get().Terminate();\n\n\tLOGD(\"Test finished.\");\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/Network/Google.cpp",
    "content": "\n// Google.cpp\n\n// Implements a HTTP download of the google's front page using the LibEvent-based cNetwork API\n\n#include \"Globals.h\"\n#include <thread>\n#include \"OSSupport/Event.h\"\n#include \"OSSupport/Network.h\"\n#include \"OSSupport/NetworkSingleton.h\"\n\n\n\n\n\n/** Connect callbacks that send a HTTP GET request for google.com when connected. */\nclass cHTTPConnectCallbacks:\n\tpublic cNetwork::cConnectCallbacks\n{\n\tcEvent & m_Event;\n\tvirtual void OnConnected(cTCPLink & a_Link) override\n\t{\n\t\tLOGD(\"Connected, sending HTTP GET\");\n\t\tif (!a_Link.Send(\"GET / HTTP/1.0\\r\\nHost:google.com\\r\\n\\r\\n\"))\n\t\t{\n\t\t\tLOGWARNING(\"Sending HTTP GET failed\");\n\t\t}\n\t\tLOGD(\"HTTP GET queued.\");\n\t}\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tLOGD(\"Error while connecting HTTP: %d (%s)\", a_ErrorCode, a_ErrorMsg.c_str());\n\t\tm_Event.Set();\n\t}\n\npublic:\n\tcHTTPConnectCallbacks(cEvent & a_Event):\n\t\tm_Event(a_Event)\n\t{\n\t}\n};\n\n\n\n\n\n/** cTCPLink callbacks that dump everything it received to the log. */\nclass cDumpCallbacks:\n\tpublic cTCPLink::cCallbacks\n{\n\tcEvent & m_Event;\n\tcTCPLinkPtr m_Link;\n\n\tvirtual void OnLinkCreated(cTCPLinkPtr a_Link) override\n\t{\n\t\tASSERT(m_Link == nullptr);\n\t\tm_Link = a_Link;\n\t}\n\n\tvirtual void OnReceivedData(const char * a_Data, size_t a_Size) override\n\t{\n\t\tASSERT(m_Link != nullptr);\n\n\t\t// Log the incoming data size:\n\t\tAString Hex;\n\t\tCreateHexDump(Hex, a_Data, a_Size, 16);\n\t\tLOGD(\"Incoming data: %u bytes:\\n%s\", static_cast<unsigned>(a_Size), Hex.c_str());\n\t}\n\n\tvirtual void OnRemoteClosed(void) override\n\t{\n\t\tASSERT(m_Link != nullptr);\n\n\t\tLOGD(\"Remote has closed the connection.\");\n\t\tm_Link.reset();\n\t\tm_Event.Set();\n\t}\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tASSERT(m_Link != nullptr);\n\n\t\tLOGD(\"Error %d (%s) in the cDumpCallbacks.\", a_ErrorCode, a_ErrorMsg.c_str());\n\t\tm_Link.reset();\n\t\tm_Event.Set();\n\t}\n\npublic:\n\tcDumpCallbacks(cEvent & a_Event):\n\t\tm_Event(a_Event)\n\t{\n\t}\n};\n\n\n\n\n\nstatic void DoTest(void)\n{\n\tcEvent evtFinish;\n\n\tLOGD(\"Network test: Connecting to google.com:80, reading front page via HTTP.\");\n\tif (!cNetwork::Connect(\"google.com\", 80, std::make_shared<cHTTPConnectCallbacks>(evtFinish), std::make_shared<cDumpCallbacks>(evtFinish)))\n\t{\n\t\tLOGWARNING(\"Cannot queue connection to google.com\");\n\t\tabort();\n\t}\n\tLOGD(\"Connect request has been queued.\");\n\t\n\tevtFinish.Wait();\n}\n\n\n\n\n\nint main()\n{\n\tLOGD(\"Initializing cNetwork...\\n\");\n\tcNetworkSingleton::Get().Initialise();\n\n\tLOGD(\"Testing...\");\n\tDoTest();\n\n\tcNetworkSingleton::Get().Terminate();\n\tLOGD(\"Network test finished\");\n\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/Network/NameLookup.cpp",
    "content": "\n// NameLookup.cpp\n\n// Implements a DNS name lookup using the LibEvent-based cNetwork API\n\n#include \"Globals.h\"\n#include <thread>\n#include \"OSSupport/Event.h\"\n#include \"OSSupport/Network.h\"\n#include \"OSSupport/NetworkSingleton.h\"\n\n\n\n\n\nclass cFinishLookupCallbacks:\n\tpublic cNetwork::cResolveNameCallbacks\n{\n\tcEvent & m_Event;\n\n\tvirtual void OnNameResolved(const AString & a_Name, const AString & a_IP) override\n\t{\n\t\tLOGD(\"%s resolves to IP %s\", a_Name.c_str(), a_IP.c_str());\n\t}\n\n\tvirtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override\n\t{\n\t\tLOGD(\"Error %d (%s) while performing lookup!\", a_ErrorCode, a_ErrorMsg.c_str());\n\t\texit(a_ErrorCode);\n\t}\n\n\tvirtual void OnFinished(void) override\n\t{\n\t\tLOGD(\"Resolving finished.\");\n\t\tm_Event.Set();\n\t}\n\npublic:\n\tcFinishLookupCallbacks(cEvent & a_Event):\n\t\tm_Event(a_Event)\n\t{\n\t}\n};\n\n\n\n\n\nstatic void DoTest(void)\n{\n\tcEvent evtFinish;\n\n\t// Look up google.com (has multiple IP addresses):\n\tLOGD(\"Network test: Looking up google.com\");\n\tif (!cNetwork::HostnameToIP(\"google.com\", std::make_shared<cFinishLookupCallbacks>(evtFinish)))\n\t{\n\t\tLOGWARNING(\"Cannot resolve google.com to IP\");\n\t\tabort();\n\t}\n\tLOGD(\"Name lookup has been successfully queued\");\n\tevtFinish.Wait();\n\tLOGD(\"Lookup finished.\");\n\n\t// Look up 8.8.8.8 (Google free DNS):\n\tLOGD(\"Network test: Looking up IP 8.8.8.8\");\n\tif (!cNetwork::IPToHostName(\"8.8.8.8\", std::make_shared<cFinishLookupCallbacks>(evtFinish)))\n\t{\n\t\tLOGWARNING(\"Cannot resolve 8.8.8.8 to name\");\n\t\tabort();\n\t}\n\tLOGD(\"IP lookup has been successfully queued\");\n\tevtFinish.Wait();\n\tLOGD(\"IP lookup finished.\");\n}\n\n\n\n\n\nint main()\n{\n\tLOGD(\"Initializing cNetwork...\");\n\tcNetworkSingleton::Get().Initialise();\n\n\tLOGD(\"Running test...\");\n\tDoTest();\n\n\tcNetworkSingleton::Get().Terminate();\n\tLOGD(\"Network test finished\");\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/NoiseTest/GNUmakefile",
    "content": "###################################################\n#\n# Makefile for NoiseTest\n# Creator: xoft\n#\n###################################################\n#\n# Usage:\n# To make a release build, call \"make\"\n# To make a debug build, call \"make debug=1\"\n#\n###################################################\n\n#\n# Macros\n#\n\nCC = /usr/bin/g++\n\n\nall: NoiseTest\n\n\n\n\n\n###################################################\n# Set the variables used for compiling, based on the build mode requested:\n# CC_OPTIONS  ... options for the C code compiler\n# CXX_OPTIONS ... options for the C++ code compiler\n# LNK_OPTIONS ... options for the linker\n# LNK_LIBS    ... libraries to link in\n#   -- according to https://stackoverflow.com/questions/6183899/undefined-reference-to-dlopen, libs must come after all sources\n# BUILDDIR    ... folder where the intermediate object files are built\n\nLNK_LIBS = -lstdc++ -ldl\n\nifeq ($(debug),1)\n################\n# debug build - fully traceable by gdb in C++ code, slowest\n# Since C code is used only for supporting libraries (zlib, lua), it is still O3-optimized\n################\nCC_OPTIONS = -s -ggdb -g -D_DEBUG -O3\nCXX_OPTIONS = -s -ggdb -g -D_DEBUG\nLNK_OPTIONS = -pthread -g -ggdb\nBUILDDIR = build/debug/\n\nelse\nifeq ($(profile),1)\n################\n# profile build - a release build with symbols and profiling engine built in\n################\nCC_OPTIONS = -s -g -ggdb -O3 -pg -DNDEBUG\nCXX_OPTIONS = -s -g -ggdb -O3 -pg -DNDEBUG\nLNK_OPTIONS = -pthread -ggdb -O3 -pg\nBUILDDIR = build/profile/\n\nelse\nifeq ($(pedantic),1)\n################\n# pedantic build - basically a debug build with lots of warnings\n################\nCC_OPTIONS = -s -g -ggdb -D_DEBUG -Wall -Wextra -pedantic -ansi -Wno-long-long\nCXX_OPTIONS = -s -g -ggdb -D_DEBUG -Wall -Wextra -pedantic -ansi -Wno-long-long\nLNK_OPTIONS = -pthread -ggdb\nBUILDDIR = build/pedantic/\n\nelse\n################\n# release build - fastest run-time, no gdb support\n################\nCC_OPTIONS = -s -g -O3 -DNDEBUG\nCXX_OPTIONS = -s -g -O3 -DNDEBUG\nLNK_OPTIONS = -pthread -O3\nBUILDDIR = build/release/\nendif\nendif\nendif\n\n\n\n\n\n###################################################\n# INCLUDE directories\n#\n\nINCLUDE = -I.\\\n\t\t-I../../source\\\n\n\n\n\n\n###################################################\n# Build NoiseTest\n#\n\nSOURCES = NoiseTest.cpp\n\nSHAREDSOURCES = \\\n\tsource/Log.cpp \\\n\tsource/MCLogger.cpp \\\n\tsource/Noise.cpp \\\n\tsource/StringUtils.cpp \\\n\tsource/OSSupport/CriticalSection.cpp \\\n\tsource/OSSupport/File.cpp \\\n\tsource/OSSupport/IsThread.cpp \\\n\tsource/OSSupport/MakeDir.cpp \\\n\nOBJECTS := $(patsubst %.c,$(BUILDDIR)%.o,$(SOURCES))\nOBJECTS := $(patsubst %.cpp,$(BUILDDIR)%.o,$(OBJECTS))\n\nSHAREDOBJECTS := $(patsubst %.c,$(BUILDDIR)%.o,$(SHAREDSOURCES))\nSHAREDOBJECTS := $(patsubst %.cpp,$(BUILDDIR)%.o,$(SHAREDOBJECTS))\n\n-include $(patsubst %.o,%.d,$(OBJECTS))\n-include $(patsubst %.o,%.d,$(SHAREDOBJECTS))\n\nNoiseTest : $(OBJECTS) $(SHAREDOBJECTS)\n\t$(CC) $(LNK_OPTIONS) $(OBJECTS) $(SHAREDOBJECTS) $(LNK_LIBS) -o NoiseTest\n\nclean :\n\t\trm -rf $(BUILDDIR) NoiseTest\n\n\n\n\n\n###################################################\n# Build the parts of Cuberite\n#\n# options used:\n#  -x c  ... compile as C code\n#  -c    ... compile but do not link\n#  -MM   ... generate a list of includes\n\n$(BUILDDIR)%.o: %.c\n\t@mkdir -p $(dir $@)\n\t$(CC) $(CC_OPTIONS) -x c -c $(INCLUDE) $< -o $@\n\t@$(CC) $(CC_OPTIONS) -x c -MM $(INCLUDE) $< > $(patsubst %.o,%.d,$@)\n\t@mv -f $(patsubst %.o,%.d,$@) $(patsubst %.o,%.d,$@).tmp\n\t@sed -e \"s|.*:|$(BUILDDIR)$*.o:|\" < $(patsubst %.o,%.d,$@).tmp > $(patsubst %.o,%.d,$@)\n\t@sed -e 's/.*://' -e 's/\\\\$$//' < $(patsubst %.o,%.d,$@).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(patsubst %.o,%.d,$@)\n\t@rm -f $(patsubst %.o,%.d,$@).tmp\n\n$(BUILDDIR)%.o: %.cpp\n\t@mkdir -p $(dir $@)\n\t$(CC) $(CXX_OPTIONS) -c $(INCLUDE) $< -o $@\n\t@$(CC) $(CXX_OPTIONS) -MM $(INCLUDE) $< > $(patsubst %.o,%.d,$@)\n\t@mv -f $(patsubst %.o,%.d,$@) $(patsubst %.o,%.d,$@).tmp\n\t@sed -e \"s|.*:|$(BUILDDIR)$*.o:|\" < $(patsubst %.o,%.d,$@).tmp > $(patsubst %.o,%.d,$@)\n\t@sed -e 's/.*://' -e 's/\\\\$$//' < $(patsubst %.o,%.d,$@).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(patsubst %.o,%.d,$@)\n\t@rm -f $(patsubst %.o,%.d,$@).tmp\n\n$(BUILDDIR)source/%.o: ../../source/%.cpp\n\t@mkdir -p $(dir $@)\n\t$(CC) $(CXX_OPTIONS) -c $(INCLUDE) $< -o $@\n\t@$(CC) $(CXX_OPTIONS) -MM $(INCLUDE) $< > $(patsubst %.o,%.d,$@)\n\t@mv -f $(patsubst %.o,%.d,$@) $(patsubst %.o,%.d,$@).tmp\n\t@sed -e \"s|.*:|$(BUILDDIR)$*.o:|\" < $(patsubst %.o,%.d,$@).tmp > $(patsubst %.o,%.d,$@)\n\t@sed -e 's/.*://' -e 's/\\\\$$//' < $(patsubst %.o,%.d,$@).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(patsubst %.o,%.d,$@)\n\t@rm -f $(patsubst %.o,%.d,$@).tmp\n"
  },
  {
    "path": "tests/NoiseTest/NoiseTest.cpp",
    "content": "\n// NoiseTest.cpp\n\n// Implements the main app entrypoint\n\n#include \"Globals.h\"\n#include <time.h>\n#include \"Noise.h\"\n\n\n\n\n\nvoid SaveValues(NOISE_DATATYPE * a_Values, const AString & a_FileName)\n{\n\tcFile f;\n\tif (!f.Open(a_FileName, cFile::fmWrite))\n\t{\n\t\tLOGWARNING(\"Cannot write file %s\", a_FileName.c_str());\n\t\treturn;\n\t}\n\tfor (int y = 0; y < 256; y++)\n\t{\n\t\tunsigned char val[256];\n\t\tfor (int x = 0; x < 256; x++)\n\t\t{\n\t\t\tval[x] = std::min(255, std::max(0, (int)(256 * a_Values[x + 256 * y])));\n\t\t}\n\t\tf.Write(val, 256);\n\t}\n}\n\n\n\n\n\nclock_t TestCubicNoise(void)\n{\n\tcCubicNoise Cubic(0);\n\tNOISE_DATATYPE Values[256 * 256];\n\t\n\t// Do a speed test:\n\tclock_t Begin = clock();\n\tfor (int i = 0; i < 1000; i++)\n\t{\n\t\tCubic.Generate2D(Values, 256, 256, 0, (NOISE_DATATYPE)25.6, 0, (NOISE_DATATYPE)25.6);\n\t}\n\tclock_t Ticks = clock() - Begin;\n\tLOG(\"cCubicNoise generating 1000 * 256x256 values took %d ticks (%.02f sec)\", Ticks, (double)Ticks / CLOCKS_PER_SEC);\n\t\n\t// Save the results into a file for visual comparison:\n\tSaveValues(Values, \"NoiseCubic.raw\");\n\t\n\treturn Ticks;\n}\n\n\n\n\n\nclock_t TestOldNoise(void)\n{\n\tcNoise Noise(0);\n\tNOISE_DATATYPE Values[256 * 256];\n\n\t// Do a speed test:\n\tclock_t Begin = clock();\n\tfor (int i = 0; i < 1000; i++)\n\t{\n\t\tfor (int y = 0; y < 256; y++)\n\t\t{\n\t\t\tfloat fy = (float)y / 10;\n\t\t\tfor (int x = 0; x < 256; x++)\n\t\t\t{\n\t\t\t\tValues[x + 256 * y] = Noise.CubicNoise2D((float)x / 10, fy);\n\t\t\t}  // for x\n\t\t}  // for y\n\t}\n\tclock_t Ticks = clock() - Begin;\n\tLOG(\"cNoise generating 1000 * 256x256 values took %d ticks (%.02f sec)\", Ticks, (double)Ticks / CLOCKS_PER_SEC);\n\t\n\t// Save the results into a file for visual comparison:\n\tSaveValues(Values, \"NoiseOld.raw\");\n\t\n\treturn Ticks;\n}\n\n\n\n\n\nint main(int argc, char * argv[])\n{\n\tnew cMCLogger();  // Create a logger (will set itself as the main instance\n\t\n\tclock_t NewTicks = TestCubicNoise();\n\tclock_t OldTicks = TestOldNoise();\n\tLOG(\"New method is %.02fx faster\", (double)OldTicks / NewTicks);\n\tLOG(\"Press Enter to quit program\");\n\tgetchar();\n}\n"
  },
  {
    "path": "tests/OSSupport/CMakeLists.txt",
    "content": "find_package(Threads REQUIRED)\ninclude_directories(${PROJECT_SOURCE_DIR}/src/)\n\n# Create a single OSSupport library that contains all the OSSupport code used in the tests:\nset (OSSupport_SRCS\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n)\nset (OSSupport_HDRS\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n\t${PROJECT_SOURCE_DIR}/src/Globals.h\n)\nadd_library(OSSupport\n\t${OSSupport_SRCS}\n\t${OSSupport_HDRS}\n)\ntarget_link_libraries(OSSupport PUBLIC fmt::fmt)\n\n# Define individual tests:\n\n# StressEvent: Stress-test the cEvent implementation:\nadd_executable(StressEvent-exe StressEvent.cpp)\ntarget_link_libraries(StressEvent-exe OSSupport fmt::fmt Threads::Threads)\nadd_test(NAME StressEvent-test COMMAND StressEvent-exe)\n\n\n\n# Put all the tests into a solution folder (MSVC):\nset_target_properties(\n\tStressEvent-exe\n\tPROPERTIES FOLDER Tests/OSSupport\n)\nset_target_properties(\n\tOSSupport\n\tPROPERTIES FOLDER Tests/Libraries\n)\n\n\n\n\n"
  },
  {
    "path": "tests/OSSupport/StressEvent.cpp",
    "content": "\n// StressEvent.cpp\n\n// Stress-tests the cEvent implementation\n\n#include \"Globals.h\"\n#include <thread>\n\n\n\n\n\n/** Number of repetitions of the thread loops. */\nconst int NUM_REPETITIONS = 5000;\n\n\n\n\n// Forward declarations are needed for clang\nvoid runThread(cEvent * a_Event1, cEvent * a_Event2, const char * a_ThreadName);\n\n\n\n\n\n/** Function that runs in a separate thread, notifies event1 and waits for event2, in a loop, NUM_REPETITIONS times.\nThis basically simulates a producer / consumer pattern with 2 events, one for \"queue empty\", the other for \"queue full\". */\nvoid runThread(cEvent * a_Event1, cEvent * a_Event2, const char * a_ThreadName)\n{\n\tLOG(\"Thread %s started\", a_ThreadName);\n\tfor (int i = 0; i < NUM_REPETITIONS; ++i)\n\t{\n\t\t// LOGD(\"%s: Waiting for event %p (%d)\", a_ThreadName, a_Event2, i);\n\t\ta_Event2->Wait();\n\t\t// LOGD(\"%s: Setting event %p (%d)\", a_ThreadName, a_Event1, i);\n\t\ta_Event1->SetAll();\n\t}\n\tLOG(\"Thread %s finished\", a_ThreadName);\n}\n\n\n\n\n\nint main()\n{\n\tLOG(\"Test started\");\n\tcEvent event1, event2;\n\tevent1.Set();\n\tstd::thread thread1(&runThread, &event1, &event2, \"A\");\n\tstd::thread thread2(&runThread, &event2, &event1, \"B\");\n\tthread1.join();\n\tthread2.join();\n\tLOG(\"Test finished\");\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "tests/SchematicFileSerializer/CMakeLists.txt",
    "content": "include_directories(${PROJECT_SOURCE_DIR}/src/)\ninclude_directories(SYSTEM ${PROJECT_SOURCE_DIR}/lib/)\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\n\nset (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/BiomeDef.cpp\n\t${PROJECT_SOURCE_DIR}/src/BlockArea.cpp\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.cpp\n\t${PROJECT_SOURCE_DIR}/src/ChunkData.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringCompression.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/Noise/Noise.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GZipFile.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.cpp\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.cpp\n\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/FastNBT.cpp\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.cpp\n)\n\nset (SHARED_HDRS\n\t${PROJECT_SOURCE_DIR}/src/BiomeDef.h\n\t${PROJECT_SOURCE_DIR}/src/BlockArea.h\n\t${PROJECT_SOURCE_DIR}/src/Cuboid.h\n\t${PROJECT_SOURCE_DIR}/src/ChunkData.h\n\t${PROJECT_SOURCE_DIR}/src/Globals.h\n\t${PROJECT_SOURCE_DIR}/src/StringCompression.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n\n\t${PROJECT_SOURCE_DIR}/src/Bindings/LuaState.h\n\n\t${PROJECT_SOURCE_DIR}/src/Generating/ChunkDesc.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PiecePool.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/Prefab.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/PrefabPiecePool.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalLimit.h\n\t${PROJECT_SOURCE_DIR}/src/Generating/VerticalStrategy.h\n\n\t${PROJECT_SOURCE_DIR}/src/Noise/Noise.h\n\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/CriticalSection.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/Event.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/File.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/GZipFile.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/StackTrace.h\n\t${PROJECT_SOURCE_DIR}/src/OSSupport/WinStackWalker.h\n\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/FastNBT.h\n\t${PROJECT_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.h\n)\n\nset (SRCS\n\tSchematicFileSerializerTest.cpp\n\tStubs.cpp\n)\n\n\nif(\"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"Clang\")\n\tadd_compile_options(\"-Wno-error=global-constructors\")\nendif()\n\n\n\nsource_group(\"Shared\" FILES ${SHARED_SRCS} ${SHARED_HDRS})\nsource_group(\"Sources\" FILES ${SRCS})\nadd_executable(SchematicFileSerializer-exe ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS})\ntarget_link_libraries(SchematicFileSerializer-exe fmt::fmt libdeflate)\nif (WIN32)\n\ttarget_link_libraries(SchematicFileSerializer-exe ws2_32)\nendif()\nadd_test(NAME SchematicFileSerializer-test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND SchematicFileSerializer-exe)\n\n\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tSchematicFileSerializer-exe\n\tPROPERTIES FOLDER Tests\n)\n"
  },
  {
    "path": "tests/SchematicFileSerializer/SchematicFileSerializerTest.cpp",
    "content": "\n// SchematicFileSerializerTest.cpp\n\n// Implements the SchematicFileSerializer test main entrypoint\n\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"WorldStorage/SchematicFileSerializer.h\"\n\n\n\n\n\nstatic void DoTest(void)\n{\n\tcBlockArea ba;\n\tba.Create(21, 256, 21);\n\tba.RelLine(0, 0, 0, 9, 8, 7, cBlockArea::baTypes | cBlockArea::baMetas, E_BLOCK_WOODEN_STAIRS, 1);\n\tconst auto Schematic = cSchematicFileSerializer::SaveToSchematicString(ba);\n\tcBlockArea ba2;\n\tcSchematicFileSerializer::LoadFromSchematicString(ba2, Schematic.GetView());\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"SchematicFileSerializer\",\n\tDoTest();\n)\n"
  },
  {
    "path": "tests/SchematicFileSerializer/Stubs.cpp",
    "content": "\n// Stubs.cpp\n\n// Implements stubs of various Cuberite methods that are needed for linking but not for runtime\n// This is required so that we don't bring in the entire Cuberite via dependencies\n\n#include \"Globals.h\"\n#include \"BlockInfo.h\"\n#include \"Blocks/BlockHandler.h\"\n#include \"BlockEntities/BlockEntity.h\"\n\n\n\n\n\ncBoundingBox::cBoundingBox(double, double, double, double, double, double)\n{\n}\n\n\n\n\n\ncBoundingBox cBlockHandler::GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const\n{\n\treturn cBoundingBox(0, 0, 0, 0, 0, 0);\n}\n\n\n\n\n\nvoid cBlockHandler::OnUpdate(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_PluginInterface, cChunk & a_Chunk, const Vector3i a_RelPos) const\n{\n}\n\n\n\n\n\nvoid cBlockHandler::OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const\n{\n}\n\n\n\n\n\nvoid cBlockHandler::NeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor)\n{\n}\n\n\n\n\n\ncItems cBlockHandler::ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const\n{\n\treturn cItems();\n}\n\n\n\n\n\nbool cBlockHandler::CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const\n{\n\treturn true;\n}\n\n\n\n\n\nbool cBlockHandler::IsUseable() const\n{\n\treturn false;\n}\n\n\n\n\n\nbool cBlockHandler::DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, Vector3i a_Position, NIBBLETYPE a_Meta, eBlockFace a_ClickedBlockFace, bool a_ClickedDirectly) const\n{\n\treturn m_BlockType == E_BLOCK_AIR;\n}\n\n\n\n\n\nvoid cBlockHandler::Check(cChunkInterface & a_ChunkInterface, cBlockPluginInterface & a_PluginInterface, Vector3i a_RelPos, cChunk & a_Chunk) const\n{\n}\n\n\n\n\n\nColourID cBlockHandler::GetMapBaseColourID(NIBBLETYPE a_Meta) const\n{\n\treturn 0;\n}\n\n\n\n\n\nbool cBlockHandler::IsInsideBlock(Vector3d a_Position, const NIBBLETYPE a_BlockMeta) const\n{\n\treturn true;\n}\n\n\n\n\n\nconst cBlockHandler & cBlockHandler::For(BLOCKTYPE a_BlockType)\n{\n\t// Dummy handler.\n\tstatic cBlockHandler Handler(E_BLOCK_AIR);\n\treturn Handler;\n}\n\n\n\n\n\nbool cBlockEntity::IsBlockEntityBlockType(BLOCKTYPE a_BlockType)\n{\n\treturn false;\n}\n\n\n\n\n\nvoid cBlockEntity::SetPos(Vector3i a_NewPos)\n{\n}\n\n\n\n\n\nOwnedBlockEntity cBlockEntity::Clone(Vector3i a_Pos)\n{\n\treturn nullptr;\n}\n\n\n\n\n\nOwnedBlockEntity cBlockEntity::CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World)\n{\n\treturn nullptr;\n}\n"
  },
  {
    "path": "tests/TestHelpers.h",
    "content": "// Helper macros for writing exception-based tests\n\n/*\nThe tests are supposed to be contained in small static functions that get called from a main function provided by this framework:\nstatic void test1()\n{\n\t// Perform the test\n}\n\n...\n\nIMPLEMENT_TEST_MAIN(\"TestName\",\n\ttest1();\n\t...\n)\n*/\n\n\n\n\n\n/** The exception that is thrown if a test fails.\nIt doesn't inherit from any type so that it is not possible to catch it by a mistake,\nit needs to be caught explicitly (used in the TEST_THROWS).\nIt bears a single message that is to be displayed to stderr. */\nclass TestException\n{\npublic:\n\tTestException(const AString & aFileName, int aLineNumber, const AString & aFunctionName, const AString & aMessage):\n\t\tmFileName(aFileName),\n\t\tmLineNumber(aLineNumber),\n\t\tmFunctionName(aFunctionName),\n\t\tmMessage(aMessage)\n\t{\n\t}\n\n\tAString mFileName;\n\tint mLineNumber;\n\tAString mFunctionName;\n\tAString mMessage;\n};\n\n\n\n\n\n/** Checks that the two values are equal; if not, throws a TestException. */\n#define TEST_EQUAL(VAL1, VAL2) \\\n\tdo { \\\n\t\tif (VAL1 != VAL2) \\\n\t\t{ \\\n\t\t\tthrow TestException( \\\n\t\t\t\t__FILE__, __LINE__, __FUNCTION__, \\\n\t\t\t\tfmt::format(FMT_STRING(\"Equality test failed: {} != {}\"), #VAL1, #VAL2) \\\n\t\t\t); \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Checks that the two values are equal; if not, throws a TestException, includes the specified message. */\n#define TEST_EQUAL_MSG(VAL1, VAL2, MSG) \\\n\tdo { \\\n\t\tif (VAL1 != VAL2) \\\n\t\t{ \\\n\t\t\tthrow TestException( \\\n\t\t\t\t__FILE__, __LINE__, __FUNCTION__, \\\n\t\t\t\tfmt::format(FMT_STRING(\"Equality test failed: {} != {} ({})\"), #VAL1, #VAL2, MSG) \\\n\t\t\t); \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Checks that the two values are not equal; if they are, throws a TestException. */\n#define TEST_NOTEQUAL(VAL1, VAL2) \\\n\tdo { \\\n\t\tif (VAL1 == VAL2) \\\n\t\t{ \\\n\t\t\tthrow TestException( \\\n\t\t\t\t__FILE__, __LINE__, __FUNCTION__, \\\n\t\t\t\tfmt::format(FMT_STRING(\"Inequality test failed: {} == {}\"), #VAL1, #VAL2) \\\n\t\t\t); \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Checks that the statement evaluates to true. */\n#define TEST_TRUE(X) TEST_EQUAL(X, true)\n\n\n\n\n\n/** Checks that the statement evaluates to false. */\n#define TEST_FALSE(X) TEST_EQUAL(X, false)\n\n\n\n\n\n/** Checks that the statement returns a value greater than or equal to the specified value. */\n#define TEST_GREATER_THAN_OR_EQUAL(Stmt, Val) \\\n\tdo { \\\n\t\tif (Stmt < Val) \\\n\t\t{ \\\n\t\t\tthrow TestException(__FILE__, __LINE__, __FUNCTION__, fmt::format(FMT_STRING(\"Comparison failed: {} < {}\"), #Stmt, #Val)); \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Checks that the statement returns a value less than or equal to the specified value. */\n#define TEST_LESS_THAN_OR_EQUAL(Stmt, Val) \\\n\tdo { \\\n\t\tif (Stmt > Val) \\\n\t\t{ \\\n\t\t\tthrow TestException(__FILE__, __LINE__, __FUNCTION__, fmt::format(FMT_STRING(\"Comparison failed: {} > {}\"), #Stmt, #Val)); \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Checks that the statement throws an exception of the specified class. */\n#define TEST_THROWS(Stmt, ExcClass) \\\n\tdo { \\\n\t\ttry \\\n\t\t{ \\\n\t\t\tStmt; \\\n\t\t\tthrow TestException( \\\n\t\t\t\t__FILE__, __LINE__, __FUNCTION__, \\\n\t\t\t\tfmt::format(FMT_STRING(\"Failed to throw an exception of type {}\"), #ExcClass) \\\n\t\t\t); \\\n\t\t} \\\n\t\tcatch (const ExcClass &) \\\n\t\t{ \\\n\t\t\t/* This is the expected case. */ \\\n\t\t} \\\n\t\tcatch (const std::exception & exc) \\\n\t\t{ \\\n\t\t\tthrow TestException( \\\n\t\t\t\t__FILE__, __LINE__, __FUNCTION__, \\\n\t\t\t\tfmt::format( \\\n\t\t\t\t\tFMT_STRING(\"An unexpected std::exception descendant was thrown, was expecting type {}. Message is: {}\"), \\\n\t\t\t\t\t#ExcClass, exc.what() \\\n\t\t\t\t) \\\n\t\t\t); \\\n\t\t} \\\n\t\tcatch (...)\\\n\t\t{ \\\n\t\t\tthrow TestException( \\\n\t\t\t\t__FILE__, __LINE__, __FUNCTION__, \\\n\t\t\t\tfmt::format(FMT_STRING(\"An unexpected unknown exception object was thrown, was expecting type {}\"), #ExcClass) \\\n\t\t\t); \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Checks that the statement throws an exception of any type. */\n#define TEST_THROWS_ANY(Stmt) \\\n\tdo { \\\n\t\ttry \\\n\t\t{ \\\n\t\t\tStmt; \\\n\t\t\tthrow TestException( \\\n\t\t\t\t__FILE__, __LINE__, __FUNCTION__, \\\n\t\t\t\t\"Failed to throw an exception of any type\" \\\n\t\t\t); \\\n\t\t} \\\n\t\tcatch (const TestException & exc) \\\n\t\t{ \\\n\t\t\tthrow exc; \\\n\t\t} \\\n\t\tcatch (...)\\\n\t\t{ \\\n\t\t\t/* This is the expected case */ \\\n\t\t} \\\n\t} while (false)\n\n\n\n\n\n/** Fails the test unconditionally, with the specified message. */\n#define TEST_FAIL(MSG) \\\n\tthrow TestException(__FILE__, __LINE__, __FUNCTION__, MSG)\n\n\n\n\n\n/** Checks that the statement causes an ASSERT trigger. */\n#ifdef NDEBUG\n\t#define TEST_ASSERTS(Stmt) LOG(\"Skipped, cannot test in Release mode: TEST_ASSERT(%s); (%s:%d)\", #Stmt, __FILE__, __LINE__)\n#else\n\t#define TEST_ASSERTS(Stmt) TEST_THROWS(Stmt, cAssertFailure)\n#endif  // else NDEBUG\n\n\n\n\n\n/** Used to implement the main() function for tests. */\n#define IMPLEMENT_TEST_MAIN(TestName, TestCode) \\\nint main() \\\n{ \\\n\tLOG(\"Test started: %s\", TestName); \\\n\t\\\n\ttry \\\n\t{ \\\n\t\tTestCode; \\\n\t} \\\n\tcatch (const TestException & exc) \\\n\t{ \\\n\t\tLOGERROR(\"Test has failed at file %s, line %d, function %s: %s\", \\\n\t\t\texc.mFileName.c_str(), \\\n\t\t\texc.mLineNumber, \\\n\t\t\texc.mFunctionName.c_str(), \\\n\t\t\texc.mMessage.c_str() \\\n\t\t); \\\n\t\treturn 1; \\\n\t} \\\n\tcatch (const std::exception & exc) \\\n\t{ \\\n\t\tLOGERROR(\"Test has failed, an exception was thrown: %s\", exc.what()); \\\n\t\treturn 1; \\\n\t} \\\n\tcatch (const cAssertFailure & exc) \\\n\t{ \\\n\t\tLOGERROR(\"Test has failed, an unexpected ASSERT was triggered at %s:%d: %s\", \\\n\t\t\texc.fileName().c_str(), exc.lineNumber(), exc.expression().c_str() \\\n\t\t); \\\n\t\treturn 1; \\\n\t} \\\n\tcatch (...) \\\n\t{ \\\n\t\tLOGERROR(\"Test has failed, an unhandled exception was thrown.\"); \\\n\t\treturn 1; \\\n\t} \\\n\t\\\n\tLOG(\"Test finished\"); \\\n\treturn 0; \\\n}\n"
  },
  {
    "path": "tests/UUID/CMakeLists.txt",
    "content": "set (SHARED_SRCS\n\t${PROJECT_SOURCE_DIR}/src/UUID.cpp\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.cpp\n)\n\nset (SHARED_HDRS\n\t${PROJECT_SOURCE_DIR}/src/UUID.h\n\t${PROJECT_SOURCE_DIR}/src/StringUtils.h\n)\n\nset (SRCS\n\tUUIDTest.cpp\n)\n\nsource_group(\"Shared\" FILES ${SHARED_SRCS} ${SHARED_HDRS})\nsource_group(\"Sources\" FILES ${SRCS})\n\nadd_executable(UUIDTest ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS})\ntarget_link_libraries(UUIDTest mbedcrypto fmt::fmt)\ntarget_compile_definitions(UUIDTest PRIVATE TEST_GLOBALS=1)\ntarget_include_directories(UUIDTest PRIVATE\n\t${PROJECT_SOURCE_DIR}/src/\n\t${PROJECT_SOURCE_DIR}/lib/mbedtls/include\n)\n\nadd_test(NAME UUID-test COMMAND UUIDTest)\n\n\n# Put the projects into solution folders (MSVC):\nset_target_properties(\n\tUUIDTest\n\tPROPERTIES FOLDER Tests\n)\n"
  },
  {
    "path": "tests/UUID/UUIDTest.cpp",
    "content": "\n// UUIDTest.cpp\n\n#include \"Globals.h\"\n#include \"../TestHelpers.h\"\n#include \"UUID.h\"\n\n#include <numeric>  // for std::iota\n\n\n\n\n\n/** Test that FromString -> ToShortString preserves the original value for short UUIDs. */\nstatic void UUIDFromStringToShortString()\n{\n\tconst char TestStrings[][33]\n\t{\n\t\t\"0123456789abcdef0123456789ABCDEF\",\n\t\t\"d188b2648cc311e7bb31be2e44b06b34\",\n\t\t\"e760d270d8b34288b895d9f78a31e083\",\n\t\t\"7052f2f2594246abb8e3fed602158870\",\n\t\t\"7f14d4b60cd84ba7885c8301b67ce891\",\n\t\t\"57be7039250548b590af272291fabcfa\"\n\t};\n\n\tfor (auto TestString : TestStrings)\n\t{\n\t\tcUUID UUID;\n\t\tTEST_TRUE(UUID.FromString(TestString));\n\t\tauto ResultString = UUID.ToShortString();\n\t\t// Result should be equivalent to original\n\t\tTEST_EQUAL(NoCaseCompare(ResultString, TestString), 0);\n\t\t// And should be all lower case\n\t\tTEST_EQUAL(ResultString, StrToLower(ResultString));\n\t}\n}\n\n\n\n\n\n/** Test that FromString -> ToLongString preserves the original value for long UUIDs. */\nstatic void UUIDFromStringToLongString()\n{\n\tconst char TestStrings[][37]\n\t{\n\t\t\"01234567-89ab-cdef-0123-456789ABCDEF\",\n\t\t\"d188b264-8cc3-11e7-bb31-be2e44b06b34\",\n\t\t\"e760d270-d8b3-4288-b895-d9f78a31e083\",\n\t\t\"7052f2f2-5942-46ab-b8e3-fed602158870\",\n\t\t\"7f14d4b6-0cd8-4ba7-885c-8301b67ce891\",\n\t\t\"57be7039-2505-48b5-90af-272291fabcfa\"\n\t};\n\n\tfor (auto TestString : TestStrings)\n\t{\n\t\tcUUID UUID;\n\t\tTEST_TRUE(UUID.FromString(TestString));\n\t\tauto ResultString = UUID.ToLongString();\n\t\t// Result should be equivalent to original\n\t\tTEST_EQUAL(NoCaseCompare(ResultString, TestString), 0);\n\t\t// And should be all lower case\n\t\tTEST_EQUAL(ResultString, StrToLower(ResultString));\n\t}\n}\n\n\n\n\n\n/** Test that FromRaw -> ToRaw preserves the original value. */\nstatic void UUIDFromRawToRaw()\n{\n\tstd::array<Byte, 16> TestData[16]{};\n\t// Fill test data with all values 0 - 255\n\tfor (int i = 0; i != 16; ++i)\n\t{\n\t\tstd::iota(begin(TestData[i]), end(TestData[i]), i * 16);\n\t}\n\n\tfor (const auto & TestRaw : TestData)\n\t{\n\t\tcUUID UUID;\n\t\tUUID.FromRaw(TestRaw);\n\t\tauto ResultRaw = UUID.ToRaw();\n\t\tTEST_EQUAL(ResultRaw, TestRaw);\n\t}\n}\n\n\n\n\n\n/** Test that IsNil correctly identifies nil UUIDs. */\nstatic void UUIDNil()\n{\n\tconst auto NilString    = \"00000000-0000-0000-0000-000000000000\";\n\tconst auto NonNilString = \"e760d270-d8b3-4288-b895-d9f78a31e083\";\n\n\t{\n\t\tcUUID UUID;\n\t\tTEST_TRUE(UUID.FromString(NilString));\n\t\tTEST_TRUE(UUID.IsNil());\n\t}\n\t{\n\t\tcUUID UUID;\n\t\tTEST_TRUE(UUID.FromString(NonNilString));\n\t\tTEST_TRUE(!UUID.IsNil());\n\t}\n}\n\n\n\n\n\n/** Test that variant and version numbers are read correctly. */\nstatic void UUIDType()\n{\n\t// From issue #4209\n\tconst char TestStrings[][33]\n\t{\n\t\t\"31cfcbeea8f2324a86dbccb1d5aaa6f8\",\n\t\t\"3f2e1dd234a03b6b824c5a0e74083b1e\"\n\t};\n\n\tfor (const auto & String : TestStrings)\n\t{\n\t\tcUUID UUID;\n\t\tTEST_TRUE(UUID.FromString(String));\n\t\tTEST_EQUAL(UUID.Variant(), 1);\n\t\tTEST_EQUAL(UUID.Version(), 3);\n\t}\n\n}\n\n\n\n\n\nIMPLEMENT_TEST_MAIN(\"UUID\",\n\tUUIDFromStringToShortString();\n\tUUIDFromStringToLongString();\n\tUUIDFromRawToRaw();\n\tUUIDNil();\n\tUUIDType();\n)\n"
  }
]